@liveroom-tech/react-immersive 4.0.2 → 4.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -1,11 +1,11 @@
1
- "use client";import{a as ds,b as vu,c as yu,d as wu,e as Cu,f as Su,g as li,h as ho,i as un,j as ac,k as ic,l as xo,m as sc,n as la,o as lc,p as j0,q as cc}from"./chunk-CPHWRR2L.mjs";import{a as oc}from"./chunk-JR557W27.mjs";import{useRef as mt,useState as _e,useEffect as ft,useCallback as ye,useMemo as vn,Suspense as $C}from"react";import{Box3 as I0,BufferAttribute as F0,Mesh as V0}from"three";import{acceleratedRaycast as U0,computeBoundsTree as H0,disposeBoundsTree as G0,MeshBVH as W0}from"three-mesh-bvh";var Mu=!1,ca=new WeakMap,ci=new WeakMap;function $0(){Mu||(V0.prototype.raycast=U0,Mu=!0)}function X0(e){let t=new Set;return e.traverse(n=>{let a=n.geometry;!a||!a.attributes?.position||t.add(a)}),[...t]}function ku(e){let t=0;for(let n of e){let a=n.index?n.index.count:n.attributes.position.count;t+=a/3}return t}var vo=12e6;function ps(e){return di(e)>vo}function di(e){let t=new Set;return e.traverse(n=>{let a=n.geometry;a?.attributes?.position&&t.add(a)}),ku([...t])}function K0(e,t){return new Promise((n,a)=>{let r=c=>{let d=c.data;if(!d||!d.error&&!d.serialized)return;if(e.removeEventListener("message",r),e.removeEventListener("error",o),d.error){a(new Error(String(d.error)));return}let{serialized:u}=d,b=W0.deserialize(u,t,{setIndex:!1});u.index&&(t.index?t.index.array=u.index:t.setIndex(new F0(u.index,1,!1))),t.boundingBox=b.getBoundingBox(new I0),n(b)},o=c=>{e.removeEventListener("message",r),e.removeEventListener("error",o),a(new Error(c.message||"BVH worker error"))};e.addEventListener("message",r),e.addEventListener("error",o);let s=t.index?t.index.array.slice():null,l=t.attributes.position.array.slice(),i=[l,...s?[s]:[]].map(c=>c.buffer);e.postMessage({index:s,position:l,options:{groups:[...t.groups]}},i)})}async function Y0(){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),a=new Worker(n);return{worker:a,dispose:()=>{a.terminate(),URL.revokeObjectURL(n)}}}catch{return null}}async function J0(e,t){if(t)try{return await K0(t,e)}catch{}let n=H0.call(e);return e.boundsTree=void 0,await new Promise(a=>setTimeout(a,0)),n}async function q0(e,t,n){if(e.boundsTree)return;if(t.buildPromise)return t.buildPromise;let a=(async()=>{let r=await n();t.references>0&&!e.boundsTree&&(e.boundsTree=r,t.ownedTree=r)})();return t.buildPromise=a.finally(()=>{t.buildPromise=void 0,t.references===0&&ca.delete(e)}),t.buildPromise}async function us(e,t){if(t?.aborted)return;let n=ci.get(e);if(!n){if(n=X0(e),ku(n)>vo){ci.set(e,[]);return}ci.set(e,n);for(let r of n){let o=ca.get(r)??{references:0};o.references+=1,ca.set(r,o)}}if(n.length===0)return;$0();let a=await Y0();if(t?.aborted){a?.dispose();return}try{for(let r of n){if(t?.aborted)return;let o=ca.get(r);o&&await q0(r,o,()=>J0(r,a?.worker))}}finally{a?.dispose()}}function ms(e){let t=ci.get(e);if(t){ci.delete(e);for(let n of t){let a=ca.get(n);a&&(a.references=Math.max(0,a.references-1),!(a.references>0)&&(a.ownedTree&&n.boundsTree===a.ownedTree&&(G0.call(n),n.boundsTree=void 0),a.ownedTree=void 0,a.buildPromise||ca.delete(n)))}}}import{GizmoHelper as XC,GizmoViewport as KC}from"@react-three/drei";import{useFrame as YC,useThree as JC}from"@react-three/fiber";import{QRCodeSVG as qC}from"qrcode.react";import{Box3 as Pl,PerspectiveCamera as ZC,Raycaster as QC,Sphere as eS,Vector2 as tS,Vector3 as En}from"three";import{AlertTriangle as Z0}from"lucide-react";import{jsx as bs,jsxs as Pu}from"react/jsx-runtime";function yo({title:e,message:t,tone:n="default"}){return Pu("div",{className:`ri-license-overlay${n==="error"?" ri-license-overlay--error":""}`,children:[Pu("div",{className:"ri-license-overlay__header",children:[n==="error"?bs(Z0,{size:16,className:"ri-license-overlay__icon","aria-hidden":"true"}):bs("span",{className:"ri-license-overlay__statusDot","aria-hidden":"true"}),bs("span",{className:"ri-license-overlay__title",children:e})]}),bs("p",{className:"ri-license-overlay__message",children:t})]})}import{Component as Q0}from"react";var gs=class extends Q0{constructor(){super(...arguments);this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(n,a){this.props.onLoadError?.(n)}render(){return this.state.hasError?null:this.props.children}};import{PerspectiveCamera as dc,Vector2 as ex}from"three";var Tu="riEditorGizmo";function Ru(e){return e.userData[Tu]=!0,e}function Au(e){let t=[];return e.traverse(n=>{n.visible&&n.userData[Tu]&&(n.visible=!1,t.push(n))}),()=>{for(let n of t)n.visible=!0}}function fs(e,t={}){if(!e)return Promise.reject(new Error("Viewer not ready"));let{gl:n,scene:a,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:s=!1}=t,l=n.getSize(new ex),i=n.getPixelRatio(),c=r instanceof dc?r.aspect:null,d=a.background,u=t.width??l.x,b=t.height??l.y,g=u!==l.x||b!==l.y,h=Au(a);return s&&(a.background=null),g&&(n.setPixelRatio(1),n.setSize(u,b,!1),r instanceof dc&&(r.aspect=u/b,r.updateProjectionMatrix())),o(),new Promise((w,B)=>{requestAnimationFrame(()=>{requestAnimationFrame(()=>{let v,p;try{v=n.domElement.toDataURL("image/png")}catch(m){p=m}h(),s&&(a.background=d),g&&(n.setPixelRatio(i),n.setSize(l.x,l.y,!1),r instanceof dc&&c!==null&&(r.aspect=c,r.updateProjectionMatrix())),o(),p?B(p):w(v)})})})}import{useCallback as vs,useEffect as px,useState as bc}from"react";import{GLTFExporter as tx}from"three-stdlib";function Ar(e,t){let n=URL.createObjectURL(e),a=document.createElement("a");a.href=n,a.download=t,a.style.display="none";try{document.body.appendChild(a),a.click()}finally{a.remove(),window.setTimeout(()=>{URL.revokeObjectURL(n)},1e3)}}function Bu({scene:e,objectBindings:t,matRefs:n,downloadFilename:a,onComplete:r}){import("three").then(({Group:o,Mesh:s})=>{let l=new o,i=new Map;for(let[u,b]of Object.entries(t))i.set(b.modelObjectId??u,u);let c=u=>{let b=u;for(;b;){let g=b.name||b.uuid,h=i.get(g)??g,w=t[h];if(w?w.visible===!1:b.visible===!1)return!1;b=b.parent}return!0};e.traverse(u=>{let b=u;if(!b.isMesh||!b.geometry||!c(b))return;let g=b.name||b.uuid,h=i.get(g)??g,w=n[h]??b.material;if(!w)return;let B=new s(b.geometry,w);B.name=g,B.applyMatrix4(b.matrixWorld),l.add(B)}),new tx().parse(l,u=>{let b=u instanceof ArrayBuffer?new Blob([u],{type:"model/gltf-binary"}):new Blob([JSON.stringify(u)],{type:"model/gltf+json"}),g=u instanceof ArrayBuffer?".glb":".gltf";Ar(b,`${a}${g}`),r()},u=>{console.error("GLTFExporter error:",u),r()},{binary:!0})})}import{strToU8 as rx}from"fflate";import{zip as nx}from"fflate";function hs(e,t=6){return new Promise((n,a)=>{nx(e,{level:t},(r,o)=>{r?a(r):n(o)})})}var pi=2048,Ou=["#00e5ff","#ff4fd8","#ffe45e","#7cff6b","#ff784f","#a78bfa","#38bdf8","#fb7185"];function Eu(e){return e.split("&").join("&amp;").split("<").join("&lt;").split(">").join("&gt;").split('"').join("&quot;").split("'").join("&apos;")}function mc(e,t){return e.normalize("NFKD").replace(/[\u0300-\u036f]/g,"").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||t}function Du(e){return mc(e,"model")}function pc(e,t){return e.index?Math.round(e.index.getX(t)):t}function ox(e,t,n){let a=pc(e,n),r=pc(e,n+1),o=pc(e,n+2);if(a>=t.count||r>=t.count||o>=t.count)return null;let s=[{index:a,u:t.getX(a),v:t.getY(a)},{index:r,u:t.getX(r),v:t.getY(r)},{index:o,u:t.getX(o),v:t.getY(o)}];return s.every(l=>Number.isFinite(l.u)&&Number.isFinite(l.v))?s:null}function Lu(e){return`${e.u.toFixed(6)},${e.v.toFixed(6)}`}function uc(e,t,n,a){let r,o;a?(r=t.index,o=n.index):(r=Lu(t),o=Lu(n));let s=r<o?`${r}|${o}`:`${o}|${r}`,l=e.get(s);l?l.count+=1:e.set(s,{count:1,start:t,end:n})}function ax(e,t,n){uc(e,t[0],t[1],n),uc(e,t[1],t[2],n),uc(e,t[2],t[0],n)}function ix(e,t){return Array.isArray(e)?e[t]??null:e}function sx(e){let t=new Map,n=0,a=0,r=0;return e.traverse(o=>{let s=o;if(!s.isMesh||!s.geometry||!s.material)return;let l=s.geometry,i=l.getAttribute("uv");if(!i||i.itemSize<2||i.count<3)return;n+=1;let c=s.name||`Mesh ${n}`,d=l.index?.count??i.count,u=l.groups.length>0?l.groups:[{start:0,count:d,materialIndex:0}];for(let b of u){let g=b.materialIndex??0,h=ix(s.material,g);if(!h)continue;let w=t.get(h.uuid);w||(a+=1,w={name:h.name||`Material ${a}`,layers:new Map},t.set(h.uuid,w));let B=w.layers.get(s.uuid);B||(B={name:c,color:Ou[r%Ou.length],edges:new Map},r+=1,w.layers.set(s.uuid,B));let v=Math.max(0,b.start),p=Math.min(d,v+b.count);for(let m=v;m+2<p;m+=3){let S=ox(l,i,m);S&&ax(B.edges,S,!!l.index)}}}),[...t.values()].filter(o=>[...o.layers.values()].some(s=>s.edges.size>0))}function xs(e){return(e*pi).toFixed(2)}function lx(e){return`M${xs(e.start.u)} ${xs(1-e.start.v)}L${xs(e.end.u)} ${xs(1-e.end.v)}`}function cx(e){let t=Eu(e.name),n=[...e.layers.values()].filter(a=>a.edges.size>0).map((a,r)=>{let o=Eu(a.name),s=`${mc(a.name,"mesh")}-${r+1}`,l=[...a.edges.values()],i=l.filter(u=>u.count===1),d=(i.length>0?i:l).map(lx).join("");return[` <g id="${s}" data-mesh="${o}" fill="none" stroke="${a.color}"`,' stroke-width="1" stroke-linejoin="round" vector-effect="non-scaling-stroke">',` <title>${o}</title>`,` <path d="${d}"/>`," </g>"].join(`
1
+ "use client";import{a as cs,b as vu,c as yu,d as wu,e as Cu,f as Su,g as si,h as xo,i as bn,j as ac,k as ic,l as vo,m as sc,n as aa,o as lc,p as j0,q as cc}from"./chunk-CPHWRR2L.mjs";import{a as oc}from"./chunk-JR557W27.mjs";import{useRef as ut,useState as Ne,useEffect as gt,useCallback as ye,useMemo as Cn,Suspense as $C}from"react";import{Box3 as I0,BufferAttribute as F0,Mesh as V0}from"three";import{acceleratedRaycast as U0,computeBoundsTree as H0,disposeBoundsTree as G0,MeshBVH as W0}from"three-mesh-bvh";var Mu=!1,ia=new WeakMap,li=new WeakMap;function $0(){Mu||(V0.prototype.raycast=U0,Mu=!0)}function X0(e){let t=new Set;return e.traverse(n=>{let a=n.geometry;!a||!a.attributes?.position||t.add(a)}),[...t]}function ku(e){let t=0;for(let n of e){let a=n.index?n.index.count:n.attributes.position.count;t+=a/3}return t}var yo=12e6;function ds(e){return ci(e)>yo}function ci(e){let t=new Set;return e.traverse(n=>{let a=n.geometry;a?.attributes?.position&&t.add(a)}),ku([...t])}function K0(e,t){return new Promise((n,a)=>{let r=c=>{let d=c.data;if(!d||!d.error&&!d.serialized)return;if(e.removeEventListener("message",r),e.removeEventListener("error",o),d.error){a(new Error(String(d.error)));return}let{serialized:u}=d,b=W0.deserialize(u,t,{setIndex:!1});u.index&&(t.index?t.index.array=u.index:t.setIndex(new F0(u.index,1,!1))),t.boundingBox=b.getBoundingBox(new I0),n(b)},o=c=>{e.removeEventListener("message",r),e.removeEventListener("error",o),a(new Error(c.message||"BVH worker error"))};e.addEventListener("message",r),e.addEventListener("error",o);let s=t.index?t.index.array.slice():null,l=t.attributes.position.array.slice(),i=[l,...s?[s]:[]].map(c=>c.buffer);e.postMessage({index:s,position:l,options:{groups:[...t.groups]}},i)})}async function Y0(){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),a=new Worker(n);return{worker:a,dispose:()=>{a.terminate(),URL.revokeObjectURL(n)}}}catch{return null}}async function J0(e,t){if(t)try{return await K0(t,e)}catch{}let n=H0.call(e);return e.boundsTree=void 0,await new Promise(a=>setTimeout(a,0)),n}async function q0(e,t,n){if(e.boundsTree)return;if(t.buildPromise)return t.buildPromise;let a=(async()=>{let r=await n();t.references>0&&!e.boundsTree&&(e.boundsTree=r,t.ownedTree=r)})();return t.buildPromise=a.finally(()=>{t.buildPromise=void 0,t.references===0&&ia.delete(e)}),t.buildPromise}async function ps(e,t){if(t?.aborted)return;let n=li.get(e);if(!n){if(n=X0(e),ku(n)>yo){li.set(e,[]);return}li.set(e,n);for(let r of n){let o=ia.get(r)??{references:0};o.references+=1,ia.set(r,o)}}if(n.length===0)return;$0();let a=await Y0();if(t?.aborted){a?.dispose();return}try{for(let r of n){if(t?.aborted)return;let o=ia.get(r);o&&await q0(r,o,()=>J0(r,a?.worker))}}finally{a?.dispose()}}function us(e){let t=li.get(e);if(t){li.delete(e);for(let n of t){let a=ia.get(n);a&&(a.references=Math.max(0,a.references-1),!(a.references>0)&&(a.ownedTree&&n.boundsTree===a.ownedTree&&(G0.call(n),n.boundsTree=void 0),a.ownedTree=void 0,a.buildPromise||ia.delete(n)))}}}import{GizmoHelper as XC,GizmoViewport as KC}from"@react-three/drei";import{useFrame as YC,useThree as JC}from"@react-three/fiber";import{QRCodeSVG as qC}from"qrcode.react";import{Box3 as kl,PerspectiveCamera as ZC,Raycaster as QC,Sphere as eS,Vector2 as tS,Vector3 as Dn}from"three";import{AlertTriangle as Z0}from"lucide-react";import{jsx as ms,jsxs as Pu}from"react/jsx-runtime";function wo({title:e,message:t,tone:n="default"}){return Pu("div",{className:`ri-license-overlay${n==="error"?" ri-license-overlay--error":""}`,children:[Pu("div",{className:"ri-license-overlay__header",children:[n==="error"?ms(Z0,{size:16,className:"ri-license-overlay__icon","aria-hidden":"true"}):ms("span",{className:"ri-license-overlay__statusDot","aria-hidden":"true"}),ms("span",{className:"ri-license-overlay__title",children:e})]}),ms("p",{className:"ri-license-overlay__message",children:t})]})}import{Component as Q0}from"react";var bs=class extends Q0{constructor(){super(...arguments);this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(n,a){this.props.onLoadError?.(n)}render(){return this.state.hasError?null:this.props.children}};import{PerspectiveCamera as dc,Vector2 as ex}from"three";var Tu="riEditorGizmo";function Ru(e){return e.userData[Tu]=!0,e}function Au(e){let t=[];return e.traverse(n=>{n.visible&&n.userData[Tu]&&(n.visible=!1,t.push(n))}),()=>{for(let n of t)n.visible=!0}}function gs(e,t={}){if(!e)return Promise.reject(new Error("Viewer not ready"));let{gl:n,scene:a,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:s=!1}=t,l=n.getSize(new ex),i=n.getPixelRatio(),c=r instanceof dc?r.aspect:null,d=a.background,u=t.width??l.x,b=t.height??l.y,g=u!==l.x||b!==l.y,h=Au(a);return s&&(a.background=null),g&&(n.setPixelRatio(1),n.setSize(u,b,!1),r instanceof dc&&(r.aspect=u/b,r.updateProjectionMatrix())),o(),new Promise((w,B)=>{requestAnimationFrame(()=>{requestAnimationFrame(()=>{let v,p;try{v=n.domElement.toDataURL("image/png")}catch(m){p=m}h(),s&&(a.background=d),g&&(n.setPixelRatio(i),n.setSize(l.x,l.y,!1),r instanceof dc&&c!==null&&(r.aspect=c,r.updateProjectionMatrix())),o(),p?B(p):w(v)})})})}import{useCallback as xs,useEffect as px,useState as bc}from"react";import{GLTFExporter as tx}from"three-stdlib";function Br(e,t){let n=URL.createObjectURL(e),a=document.createElement("a");a.href=n,a.download=t,a.style.display="none";try{document.body.appendChild(a),a.click()}finally{a.remove(),window.setTimeout(()=>{URL.revokeObjectURL(n)},1e3)}}function Bu({scene:e,objectBindings:t,matRefs:n,downloadFilename:a,onComplete:r}){import("three").then(({Group:o,Mesh:s})=>{let l=new o,i=new Map;for(let[u,b]of Object.entries(t))i.set(b.modelObjectId??u,u);let c=u=>{let b=u;for(;b;){let g=b.name||b.uuid,h=i.get(g)??g,w=t[h];if(w?w.visible===!1:b.visible===!1)return!1;b=b.parent}return!0};e.traverse(u=>{let b=u;if(!b.isMesh||!b.geometry||!c(b))return;let g=b.name||b.uuid,h=i.get(g)??g,w=n[h]??b.material;if(!w)return;let B=new s(b.geometry,w);B.name=g,B.applyMatrix4(b.matrixWorld),l.add(B)}),new tx().parse(l,u=>{let b=u instanceof ArrayBuffer?new Blob([u],{type:"model/gltf-binary"}):new Blob([JSON.stringify(u)],{type:"model/gltf+json"}),g=u instanceof ArrayBuffer?".glb":".gltf";Br(b,`${a}${g}`),r()},u=>{console.error("GLTFExporter error:",u),r()},{binary:!0})})}import{strToU8 as rx}from"fflate";import{zip as nx}from"fflate";function fs(e,t=6){return new Promise((n,a)=>{nx(e,{level:t},(r,o)=>{r?a(r):n(o)})})}var di=2048,Ou=["#00e5ff","#ff4fd8","#ffe45e","#7cff6b","#ff784f","#a78bfa","#38bdf8","#fb7185"];function Eu(e){return e.split("&").join("&amp;").split("<").join("&lt;").split(">").join("&gt;").split('"').join("&quot;").split("'").join("&apos;")}function mc(e,t){return e.normalize("NFKD").replace(/[\u0300-\u036f]/g,"").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||t}function Du(e){return mc(e,"model")}function pc(e,t){return e.index?Math.round(e.index.getX(t)):t}function ox(e,t,n){let a=pc(e,n),r=pc(e,n+1),o=pc(e,n+2);if(a>=t.count||r>=t.count||o>=t.count)return null;let s=[{index:a,u:t.getX(a),v:t.getY(a)},{index:r,u:t.getX(r),v:t.getY(r)},{index:o,u:t.getX(o),v:t.getY(o)}];return s.every(l=>Number.isFinite(l.u)&&Number.isFinite(l.v))?s:null}function Lu(e){return`${e.u.toFixed(6)},${e.v.toFixed(6)}`}function uc(e,t,n,a){let r,o;a?(r=t.index,o=n.index):(r=Lu(t),o=Lu(n));let s=r<o?`${r}|${o}`:`${o}|${r}`,l=e.get(s);l?l.count+=1:e.set(s,{count:1,start:t,end:n})}function ax(e,t,n){uc(e,t[0],t[1],n),uc(e,t[1],t[2],n),uc(e,t[2],t[0],n)}function ix(e,t){return Array.isArray(e)?e[t]??null:e}function sx(e){let t=new Map,n=0,a=0,r=0;return e.traverse(o=>{let s=o;if(!s.isMesh||!s.geometry||!s.material)return;let l=s.geometry,i=l.getAttribute("uv");if(!i||i.itemSize<2||i.count<3)return;n+=1;let c=s.name||`Mesh ${n}`,d=l.index?.count??i.count,u=l.groups.length>0?l.groups:[{start:0,count:d,materialIndex:0}];for(let b of u){let g=b.materialIndex??0,h=ix(s.material,g);if(!h)continue;let w=t.get(h.uuid);w||(a+=1,w={name:h.name||`Material ${a}`,layers:new Map},t.set(h.uuid,w));let B=w.layers.get(s.uuid);B||(B={name:c,color:Ou[r%Ou.length],edges:new Map},r+=1,w.layers.set(s.uuid,B));let v=Math.max(0,b.start),p=Math.min(d,v+b.count);for(let m=v;m+2<p;m+=3){let S=ox(l,i,m);S&&ax(B.edges,S,!!l.index)}}}),[...t.values()].filter(o=>[...o.layers.values()].some(s=>s.edges.size>0))}function hs(e){return(e*di).toFixed(2)}function lx(e){return`M${hs(e.start.u)} ${hs(1-e.start.v)}L${hs(e.end.u)} ${hs(1-e.end.v)}`}function cx(e){let t=Eu(e.name),n=[...e.layers.values()].filter(a=>a.edges.size>0).map((a,r)=>{let o=Eu(a.name),s=`${mc(a.name,"mesh")}-${r+1}`,l=[...a.edges.values()],i=l.filter(u=>u.count===1),d=(i.length>0?i:l).map(lx).join("");return[` <g id="${s}" data-mesh="${o}" fill="none" stroke="${a.color}"`,' stroke-width="1" stroke-linejoin="round" vector-effect="non-scaling-stroke">',` <title>${o}</title>`,` <path d="${d}"/>`," </g>"].join(`
2
2
  `)}).join(`
3
- `);return['<?xml version="1.0" encoding="UTF-8"?>',`<svg xmlns="http://www.w3.org/2000/svg" width="${pi}" height="${pi}" viewBox="0 0 ${pi} ${pi}">`,` <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 dx(e,t="model"){let n=sx(e),a=Du(t);return n.map((r,o)=>{let s=mc(r.name,`material-${o+1}`);return{filename:n.length===1?`${a}-uv-layout.svg`:`${a}-uv-${s}-${o+1}.svg`,materialName:r.name,meshCount:[...r.layers.values()].filter(i=>i.edges.size>0).length,svg:cx(r)}})}async function Nu(e,t="model"){let n=dx(e,t);if(n.length===0)return n;if(n.length===1)return Ar(new Blob([n[0].svg],{type:"image/svg+xml;charset=utf-8"}),n[0].filename),n;let a=Object.fromEntries(n.map(o=>[o.filename,rx(o.svg)])),r=await hs(a);return Ar(new Blob([r],{type:"application/zip"}),`${Du(t)}-uv-layouts.zip`),n}function _u({sceneRef:e,materialRefs:t,rendererCaptureRef:n,objectBindings:a,downloadFilename:r}){let[o,s]=bc(!1),[l,i]=bc(!1),[c,d]=bc(null);px(()=>{if(!l)return;let w=()=>i(!1);return window.addEventListener("pointerdown",w),()=>window.removeEventListener("pointerdown",w)},[l]);let u=vs(()=>{d(null),i(w=>!w)},[]),b=vs(()=>{let w=e.current;w&&(i(!1),s(!0),Bu({scene:w,objectBindings:a,matRefs:t.current,downloadFilename:r,onComplete:()=>s(!1)}))},[r,t,a,e]),g=vs(()=>{i(!1),fs(n.current).then(w=>{let B=document.createElement("a");B.href=w,B.download=`${r}.png`,document.body.appendChild(B),B.click(),document.body.removeChild(B)}).catch(w=>{console.error("Screenshot failed:",w)})},[r,n]),h=vs(async()=>{let w=e.current;if(w)try{if((await Nu(w,r)).length===0){d("This model does not contain UV coordinates.");return}d(null),i(!1)}catch(B){console.error("UV layout export failed:",B),d("Could not create the UV layout archive.")}},[r,e]);return{isDownloading:o,downloadMenuOpen:l,uvExportError:c,toggleDownloadMenu:u,handleDownloadMesh:b,handleDownloadScreenshot:g,handleDownloadUvLayout:h}}import{useCallback as da,useEffect as gc,useRef as fc,useState as ui}from"react";import{Box3 as zu,Raycaster as ux,Vector2 as mx,Vector3 as hc}from"three";function bx(e){let t=new zu().setFromObject(e),n=new hc;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 gx(e){let t=new zu().setFromObject(e);if(t.isEmpty())return null;let n=t.getCenter(new hc),a=t.getSize(new hc).length()/2;return!Number.isFinite(a)||a<=0?null:{center:[n.x,n.y,n.z],radius:a}}function ju({canvasAreaRef:e,controlsRef:t,sceneRef:n,modelUrl:a,modelRotation:r,bindingTransformSignature:o,modelLoaded:s}){let[l,i]=ui(!1),[c,d]=ui([]),[u,b]=ui(!1),[g,h]=ui(null),[w,B]=ui(null),v=fc(!1),p=fc(0),m=fc(null);v.current=l;let S=da(x=>{x.updateMatrixWorld(!0),h(bx(x)),B(gx(x))},[]),M=da(()=>d([]),[]),k=da(()=>i(x=>!x),[]),R=da(()=>b(x=>!x),[]),f=da(x=>{v.current&&(m.current={x:x.clientX,y:x.clientY})},[]),C=da(x=>{if(!v.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 A=e.current,j=t.current?.camera,T=n.current;if(!A||!j||!T)return;let I=A.getBoundingClientRect(),F=(x.clientX-I.left)/I.width*2-1,O=-((x.clientY-I.top)/I.height)*2+1,E=new ux;E.setFromCamera(new mx(F,O),j);let W=E.intersectObject(T,!0)[0];W&&(p.current+=1,d(U=>[...U,{id:p.current,position:[W.point.x,W.point.y,W.point.z]}]))},[e,t,n]);return gc(()=>{d([]),h(null),B(null)},[a]),gc(()=>{d([])},[r,o]),gc(()=>{let x=n.current;!s||!x||S(x)},[o,s,S,n]),{measureMode:l,measureModeRef:v,measurePoints:c,showDimensions:u,measureBox:g,modelBounds:w,refreshBounds:S,clearMeasurements:M,toggleMeasureMode:k,toggleDimensions:R,handleMeasurePointerDown:f,handleMeasureClick:C}}import{createPortal as hx}from"react-dom";import{createXRStore as xx}from"@react-three/xr";import{MapPin as vx}from"lucide-react";import{useCallback as wo,useEffect as pa,useMemo as Vu,useRef as yx,useState as Gr}from"react";function xc(){return typeof navigator>"u"?!1:/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)}function vc(){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 Iu(){return xc()||vc()}function fx(){if(typeof window>"u"||typeof navigator>"u")return!1;let e=s=>typeof window.matchMedia=="function"&&window.matchMedia(s).matches,t=e("(pointer: coarse)")||e("(any-pointer: coarse)"),n=e("(hover: none)")||e("(any-hover: none)"),a=navigator.maxTouchPoints>0,r=typeof window.screen<"u"&&Math.min(window.screen.width,window.screen.height)<=1024,o=xc();return t||o||a&&n||a&&r}function yc(){if(!fx())return!1;if(xc())return!0;let e=navigator.deviceMemory;return!(typeof e=="number"&&e>=8)}function Fu(e="auto"){switch(e){case"high":return!1;case"low":return!0;default:return yc()}}import{Fragment as wx,jsx as ua,jsxs as wc}from"react/jsx-runtime";var Uu={canPlace:!1,isPlacementMode:!0,isModelPlaced:!1};function Hu({enableXR:e,usdzUrl:t,mobileHandoffUrl:n}){let a=yx(null),r=Vu(()=>{if(!e||typeof navigator>"u")return null;let F=navigator.xr;if(!F||typeof F.isSessionSupported!="function"||typeof F.addEventListener!="function")return null;try{return xx({emulate:!1})}catch{return null}},[e]),[o,s]=Gr(!1),[l,i]=Gr(!1),[c,d]=Gr(!0),[u,b]=Gr(null),[g,h]=Gr(!1),[w,B]=Gr(!1),[v,p]=Gr(Uu),[m,S]=Gr(!1),M=Vu(()=>e&&!!t?.trim()&&vc(),[e,t]);pa(()=>{d(Iu())},[]);let k=wo(()=>{if(typeof window>"u")return null;try{let F=new URL(n?.trim()||window.location.href,window.location.href);return F.protocol==="http:"||F.protocol==="https:"?F.toString():null}catch{return null}},[n]);pa(()=>{if(!e||c){b(null),h(!1);return}b(k())},[e,c,k]),pa(()=>{if(r)return r.subscribe(F=>B(F.session!=null&&F.mode==="immersive-ar"))},[r]),pa(()=>{S(!1),p(Uu)},[w]),pa(()=>{if(!e||typeof navigator>"u")return;let F=navigator.xr;if(!F?.isSessionSupported)return;let O=!1;return F.isSessionSupported("immersive-ar").then(E=>!O&&s(E)).catch(()=>{}),F.isSessionSupported("immersive-vr").then(E=>!O&&i(E)).catch(()=>{}),()=>{O=!0}},[e]);let R=wo(()=>{let F=k();F&&(b(F),h(!0))},[k]),f=wo(()=>h(!1),[]),C=wo(()=>{let F=t?.trim();if(!F)return;let O=document.createElement("a");O.setAttribute("rel","ar"),O.href=F,O.style.display="none";let E=document.createElement("img");E.alt="",E.src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==",O.appendChild(E),document.body.appendChild(O),O.click(),O.remove()},[t]),x=wo(F=>{p(F),F.isPlacementMode||S(!1)},[]),P=wo(F=>{S(!1),F?a.current?.finishPlacementMode():a.current?.cancelPlacementMode()},[]),z=wo(F=>{F.preventDefault(),S(!0),a.current?.startPlacementMode()},[]);pa(()=>{if(!m)return;let F=()=>P(!0),O=()=>P(!1);return window.addEventListener("pointerup",F),window.addEventListener("pointercancel",O),()=>{window.removeEventListener("pointerup",F),window.removeEventListener("pointercancel",O)}},[P,m]);let A=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",j=v.isModelPlaced&&!v.isPlacementMode?"Pinch to resize \xB7 Twist to rotate":null,T=r?.getState().domOverlayRoot??null,I=w&&T?hx(wc(wx,{children:[j&&ua("div",{className:"ri-arHintOverlay",children:ua("div",{className:"ri-arHint",children:j})}),ua("div",{className:"ri-arOverlay",children:wc("div",{className:"ri-arControls",children:[A&&ua("div",{className:"ri-arStatus",children:A}),v.isModelPlaced&&wc("button",{type:"button",className:`ri-arActionButton ${m?"ri-arActionButton--active":""}`,onPointerDown:F=>z(F.nativeEvent),"aria-pressed":m,children:[ua(vx,{size:14}),"Relocate"]}),!v.isModelPlaced&&v.canPlace&&ua("button",{type:"button",className:"ri-arActionButton ri-arActionButton--primary",onClick:()=>a.current?.placeCurrent(),children:"Tap to place"})]})})]}),T):null;return{xrStore:r,presenterRef:a,arSupported:o,vrSupported:l,quickLookSupported:M,resolvedMobileHandoffUrl:u,isMobileHandoffOpen:g,arOverlay:I,openMobileHandoff:R,closeMobileHandoff:f,openQuickLook:C,handleARStateChange:x}}import{Canvas as wv,useThree as Cv}from"@react-three/fiber";import{ContactShadows as Sv,Environment as Mv}from"@react-three/drei";import{XR as kv}from"@react-three/xr";import{NoToneMapping as Pv}from"three";import{Suspense as Tv,useEffect as Rv,useMemo as Ts,useState as Av}from"react";import{useFrame as Sc,useThree as Co}from"@react-three/fiber";import{useXR as Gu}from"@react-three/xr";import{Color as Cx,PerspectiveCamera as Sx}from"three";import{useEffect as ma,useLayoutEffect as Mx,useRef as Cc}from"react";function Wu({renderMode:e}){let{scene:t}=Co(),n=Co(s=>s.setFrameloop),a=Gu(s=>s.session!=null),r=Gu(s=>s.mode==="immersive-ar"),o=Cc(void 0);return ma(()=>{n(a?"always":e)},[a,e,n]),ma(()=>{r?(o.current=t.background,t.background=null):o.current!==void 0&&(t.background=o.current,o.current=void 0)},[r,t]),Sc(()=>{r&&t.background!==null&&(t.background=null)}),null}function $u({onPresentingChange:e}){let t=Co(r=>r.gl),n=Cc(null);ma(()=>{let r=t.xr;if(!r)return;let o=i=>{i?(n.current=t.shadowMap.enabled,t.shadowMap.enabled=!1):n.current!==null&&(t.shadowMap.enabled=n.current,n.current=null),e(i)},s=()=>o(!0),l=()=>o(!1);return r.addEventListener("sessionstart",s),r.addEventListener("sessionend",l),o(r.isPresenting),()=>{r.removeEventListener("sessionstart",s),r.removeEventListener("sessionend",l)}},[t,e]);let a=Cc(0);return Sc(()=>{if(!t.xr.isPresenting)return;let r=performance.now();if(r-a.current<1e3)return;a.current=r;let o=t.xr}),null}function Xu({active:e}){let t=Co(n=>n.invalidate);return ma(()=>{e&&t()},[e,t]),Sc(()=>{e&&t()}),null}function Ku({color:e}){let{scene:t}=Co();return ma(()=>{let n=t.background;return t.background=e?new Cx(e):null,()=>{t.background=n}},[t,e]),null}function Yu({rotation:e}){let{scene:t}=Co();return Mx(()=>{let n=e*Math.PI/180;t.environmentRotation.set(0,n,0),t.backgroundRotation.set(0,n,0)}),null}function Ju({cameraConfig:e}){let{camera:t}=Co();return ma(()=>{if(!(t instanceof Sx))return;let n=e?.fov;typeof n=="number"&&t.fov!==n&&(t.fov=n,t.updateProjectionMatrix())},[t,e]),null}import{useThree as fm}from"@react-three/fiber";import{Autofocus as Wx,Bloom as $x,BrightnessContrast as Xx,ChromaticAberration as Kx,ColorAverage as Yx,DepthOfField as Jx,DotScreen as qx,EffectComposer as Zx,Glitch as Qx,GodRays as ev,Grid as tv,HueSaturation as nv,Noise as rv,Outline as ov,Pixelation as av,Ramp as iv,Scanline as sv,SelectiveBloom as lv,Sepia as cv,SMAA as dv,SSAO as pv,ToneMapping as uv,Vignette as mv}from"@react-three/postprocessing";import{BlendFunction as bi,KernelSize as bv}from"postprocessing";import{Color as ks,Vector2 as gi}from"three";import{useEffect as gv,useMemo as fi,useRef as fv,useState as hv}from"react";import{CanvasTexture as Zu,Color as kx,ImageLoader as Px,NoColorSpace as ys,RepeatWrapping as qu,SRGBColorSpace as Tc,Texture as Tx}from"three";var ba=new Map,Wr={color:"#93c5fd",intensity:.07},Rc=new kx(Wr.color).multiplyScalar(Wr.intensity),ga=new Map,Pc=new Map;function Rx(e){return`${e.name}|${e.size}|${e.lastModified}`}function Qu(e){let t=Rx(e),n=e.name.lastIndexOf("."),a=n>0?e.name.slice(0,n):e.name,r=n>0?e.name.slice(n):"",o=`materials/${e.name}`,s=2;for(;;){let l=Pc.get(o);if(l===void 0||l===t)return Pc.set(o,t),o;o=`materials/${a}-${s}${r}`,s+=1}}function em(e){return ga.get(e)}function tm(e,t){let n=++e.loadGeneration;e.loaded=!1;let a=()=>{if(e.loadGeneration!==n)return;e.loaded=!0;let r=e.pending;e.pending=[];for(let o of r)o()};new Px().load(t,r=>{e.loadGeneration===n&&(e.texture.image=r,e.texture.needsUpdate=!0,a())},void 0,()=>{e.loadGeneration===n&&(console.warn(`Failed to load texture: ${t}`),a())})}function nm(e,t){for(let n of[Tc,ys]){let a=ba.get(mi(e,n));a&&tm(a,t)}}function rm(e,t){let n=ga.get(e);n&&n!==t&&n.startsWith("blob:")&&URL.revokeObjectURL(n),ga.set(e,t),nm(e,t)}function Ac(e){let t=ga.get(e);t&&(t.startsWith("blob:")&&URL.revokeObjectURL(t),ga.delete(e),Pc.delete(e),nm(e,e))}function mi(e,t){return`${t}|${e}`}function It(e,t=ys,n){let a=mi(e,t),r=ba.get(a);if(r)return n&&!r.loaded&&r.pending.push(n),r.texture;let o=ga.get(e)??e,s={texture:new Tx,refCount:0,loaded:!1,pending:n?[n]:[],loadGeneration:0};return s.texture.flipY=!1,s.texture.colorSpace=t,ba.set(a,s),tm(s,o),s.texture}function om(e,t=ys,n){let a=It(e,t,n);return ba.get(mi(e,t)).refCount+=1,a}function ws(e,t=ys){let n=ba.get(mi(e,t));n&&(n.refCount-=1,n.refCount<=0&&(n.loadGeneration+=1,n.pending=[],n.texture.dispose(),ba.delete(mi(e,t))))}var Mc=null;function am(){if(Mc)return Mc;let e=256,t=document.createElement("canvas");t.width=e,t.height=e;let n=t.getContext("2d"),a=n.createRadialGradient(e*.35,e*.35,e*.02,e*.5,e*.5,e*.55);a.addColorStop(0,"#ffffff"),a.addColorStop(.4,"#b5b5b5"),a.addColorStop(1,"#3a3a3a"),n.fillStyle=a,n.fillRect(0,0,e,e);let r=new Zu(t);return r.colorSpace=Tc,Mc=r,r}var kc=null;function im(){if(kc)return kc;let e=1024,t=8,n=e/t,a=["#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 l=0;l<t;l+=1)for(let i=0;i<t;i+=1){let c=i*n,d=l*n,u=(Math.floor(i/2)+Math.floor(l/2))%4;o.fillStyle=a[u],o.fillRect(c,d,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(c+m,d),o.lineTo(c+m,d+n),o.moveTo(c,d+m),o.lineTo(c+n,d+m),o.stroke()}o.strokeStyle="#09090b",o.lineWidth=7,o.strokeRect(c,d,n,n);let b=c+n*.23,g=d+n*.72,h=c+n*.72,w=d+n*.23;o.lineCap="round",o.lineJoin="round",o.beginPath(),o.moveTo(b,g),o.lineTo(h,w),o.lineTo(h-n*.2,w),o.moveTo(h,w),o.lineTo(h,w+n*.2),o.stroke();let B=l*t+i+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(B).padStart(2,"0");o.strokeText(v,c+n/2,d+n*.82),o.fillText(v,c+n/2,d+n*.82)}let s=new Zu(r);return s.colorSpace=Tc,s.wrapS=qu,s.wrapT=qu,s.flipY=!1,s.anisotropy=8,s.needsUpdate=!0,kc=s,s}import{forwardRef as Ax,useImperativeHandle as Bx,useMemo as Ox}from"react";import{BlendFunction as Ex,Effect as Lx}from"postprocessing";import{Uniform as Dx}from"three";import{jsx as _x}from"react/jsx-runtime";var Nx=`
3
+ `);return['<?xml version="1.0" encoding="UTF-8"?>',`<svg xmlns="http://www.w3.org/2000/svg" width="${di}" height="${di}" viewBox="0 0 ${di} ${di}">`,` <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 dx(e,t="model"){let n=sx(e),a=Du(t);return n.map((r,o)=>{let s=mc(r.name,`material-${o+1}`);return{filename:n.length===1?`${a}-uv-layout.svg`:`${a}-uv-${s}-${o+1}.svg`,materialName:r.name,meshCount:[...r.layers.values()].filter(i=>i.edges.size>0).length,svg:cx(r)}})}async function Nu(e,t="model"){let n=dx(e,t);if(n.length===0)return n;if(n.length===1)return Br(new Blob([n[0].svg],{type:"image/svg+xml;charset=utf-8"}),n[0].filename),n;let a=Object.fromEntries(n.map(o=>[o.filename,rx(o.svg)])),r=await fs(a);return Br(new Blob([r],{type:"application/zip"}),`${Du(t)}-uv-layouts.zip`),n}function _u({sceneRef:e,materialRefs:t,rendererCaptureRef:n,objectBindings:a,downloadFilename:r}){let[o,s]=bc(!1),[l,i]=bc(!1),[c,d]=bc(null);px(()=>{if(!l)return;let w=()=>i(!1);return window.addEventListener("pointerdown",w),()=>window.removeEventListener("pointerdown",w)},[l]);let u=xs(()=>{d(null),i(w=>!w)},[]),b=xs(()=>{let w=e.current;w&&(i(!1),s(!0),Bu({scene:w,objectBindings:a,matRefs:t.current,downloadFilename:r,onComplete:()=>s(!1)}))},[r,t,a,e]),g=xs(()=>{i(!1),gs(n.current).then(w=>{let B=document.createElement("a");B.href=w,B.download=`${r}.png`,document.body.appendChild(B),B.click(),document.body.removeChild(B)}).catch(w=>{console.error("Screenshot failed:",w)})},[r,n]),h=xs(async()=>{let w=e.current;if(w)try{if((await Nu(w,r)).length===0){d("This model does not contain UV coordinates.");return}d(null),i(!1)}catch(B){console.error("UV layout export failed:",B),d("Could not create the UV layout archive.")}},[r,e]);return{isDownloading:o,downloadMenuOpen:l,uvExportError:c,toggleDownloadMenu:u,handleDownloadMesh:b,handleDownloadScreenshot:g,handleDownloadUvLayout:h}}import{useCallback as sa,useEffect as gc,useRef as fc,useState as pi}from"react";import{Box3 as zu,Raycaster as ux,Vector2 as mx,Vector3 as hc}from"three";function bx(e){let t=new zu().setFromObject(e),n=new hc;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 gx(e){let t=new zu().setFromObject(e);if(t.isEmpty())return null;let n=t.getCenter(new hc),a=t.getSize(new hc).length()/2;return!Number.isFinite(a)||a<=0?null:{center:[n.x,n.y,n.z],radius:a}}function ju({canvasAreaRef:e,controlsRef:t,sceneRef:n,modelUrl:a,modelRotation:r,bindingTransformSignature:o,modelLoaded:s}){let[l,i]=pi(!1),[c,d]=pi([]),[u,b]=pi(!1),[g,h]=pi(null),[w,B]=pi(null),v=fc(!1),p=fc(0),m=fc(null);v.current=l;let S=sa(x=>{x.updateMatrixWorld(!0),h(bx(x)),B(gx(x))},[]),M=sa(()=>d([]),[]),k=sa(()=>i(x=>!x),[]),R=sa(()=>b(x=>!x),[]),f=sa(x=>{v.current&&(m.current={x:x.clientX,y:x.clientY})},[]),C=sa(x=>{if(!v.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 A=e.current,j=t.current?.camera,T=n.current;if(!A||!j||!T)return;let I=A.getBoundingClientRect(),F=(x.clientX-I.left)/I.width*2-1,O=-((x.clientY-I.top)/I.height)*2+1,E=new ux;E.setFromCamera(new mx(F,O),j);let W=E.intersectObject(T,!0)[0];W&&(p.current+=1,d(U=>[...U,{id:p.current,position:[W.point.x,W.point.y,W.point.z]}]))},[e,t,n]);return gc(()=>{d([]),h(null),B(null)},[a]),gc(()=>{d([])},[r,o]),gc(()=>{let x=n.current;!s||!x||S(x)},[o,s,S,n]),{measureMode:l,measureModeRef:v,measurePoints:c,showDimensions:u,measureBox:g,modelBounds:w,refreshBounds:S,clearMeasurements:M,toggleMeasureMode:k,toggleDimensions:R,handleMeasurePointerDown:f,handleMeasureClick:C}}import{createPortal as hx}from"react-dom";import{createXRStore as xx}from"@react-three/xr";import{MapPin as vx}from"lucide-react";import{useCallback as Co,useEffect as la,useMemo as Vu,useRef as yx,useState as Wr}from"react";function xc(){return typeof navigator>"u"?!1:/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)}function vc(){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 Iu(){return xc()||vc()}function fx(){if(typeof window>"u"||typeof navigator>"u")return!1;let e=s=>typeof window.matchMedia=="function"&&window.matchMedia(s).matches,t=e("(pointer: coarse)")||e("(any-pointer: coarse)"),n=e("(hover: none)")||e("(any-hover: none)"),a=navigator.maxTouchPoints>0,r=typeof window.screen<"u"&&Math.min(window.screen.width,window.screen.height)<=1024,o=xc();return t||o||a&&n||a&&r}function yc(){if(!fx())return!1;if(xc())return!0;let e=navigator.deviceMemory;return!(typeof e=="number"&&e>=8)}function Fu(e="auto"){switch(e){case"high":return!1;case"low":return!0;default:return yc()}}import{Fragment as wx,jsx as ca,jsxs as wc}from"react/jsx-runtime";var Uu={canPlace:!1,isPlacementMode:!0,isModelPlaced:!1};function Hu({enableXR:e,usdzUrl:t,mobileHandoffUrl:n}){let a=yx(null),r=Vu(()=>{if(!e||typeof navigator>"u")return null;let F=navigator.xr;if(!F||typeof F.isSessionSupported!="function"||typeof F.addEventListener!="function")return null;try{return xx({emulate:!1})}catch{return null}},[e]),[o,s]=Wr(!1),[l,i]=Wr(!1),[c,d]=Wr(!0),[u,b]=Wr(null),[g,h]=Wr(!1),[w,B]=Wr(!1),[v,p]=Wr(Uu),[m,S]=Wr(!1),M=Vu(()=>e&&!!t?.trim()&&vc(),[e,t]);la(()=>{d(Iu())},[]);let k=Co(()=>{if(typeof window>"u")return null;try{let F=new URL(n?.trim()||window.location.href,window.location.href);return F.protocol==="http:"||F.protocol==="https:"?F.toString():null}catch{return null}},[n]);la(()=>{if(!e||c){b(null),h(!1);return}b(k())},[e,c,k]),la(()=>{if(r)return r.subscribe(F=>B(F.session!=null&&F.mode==="immersive-ar"))},[r]),la(()=>{S(!1),p(Uu)},[w]),la(()=>{if(!e||typeof navigator>"u")return;let F=navigator.xr;if(!F?.isSessionSupported)return;let O=!1;return F.isSessionSupported("immersive-ar").then(E=>!O&&s(E)).catch(()=>{}),F.isSessionSupported("immersive-vr").then(E=>!O&&i(E)).catch(()=>{}),()=>{O=!0}},[e]);let R=Co(()=>{let F=k();F&&(b(F),h(!0))},[k]),f=Co(()=>h(!1),[]),C=Co(()=>{let F=t?.trim();if(!F)return;let O=document.createElement("a");O.setAttribute("rel","ar"),O.href=F,O.style.display="none";let E=document.createElement("img");E.alt="",E.src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==",O.appendChild(E),document.body.appendChild(O),O.click(),O.remove()},[t]),x=Co(F=>{p(F),F.isPlacementMode||S(!1)},[]),P=Co(F=>{S(!1),F?a.current?.finishPlacementMode():a.current?.cancelPlacementMode()},[]),z=Co(F=>{F.preventDefault(),S(!0),a.current?.startPlacementMode()},[]);la(()=>{if(!m)return;let F=()=>P(!0),O=()=>P(!1);return window.addEventListener("pointerup",F),window.addEventListener("pointercancel",O),()=>{window.removeEventListener("pointerup",F),window.removeEventListener("pointercancel",O)}},[P,m]);let A=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",j=v.isModelPlaced&&!v.isPlacementMode?"Pinch to resize \xB7 Twist to rotate":null,T=r?.getState().domOverlayRoot??null,I=w&&T?hx(wc(wx,{children:[j&&ca("div",{className:"ri-arHintOverlay",children:ca("div",{className:"ri-arHint",children:j})}),ca("div",{className:"ri-arOverlay",children:wc("div",{className:"ri-arControls",children:[A&&ca("div",{className:"ri-arStatus",children:A}),v.isModelPlaced&&wc("button",{type:"button",className:`ri-arActionButton ${m?"ri-arActionButton--active":""}`,onPointerDown:F=>z(F.nativeEvent),"aria-pressed":m,children:[ca(vx,{size:14}),"Relocate"]}),!v.isModelPlaced&&v.canPlace&&ca("button",{type:"button",className:"ri-arActionButton ri-arActionButton--primary",onClick:()=>a.current?.placeCurrent(),children:"Tap to place"})]})})]}),T):null;return{xrStore:r,presenterRef:a,arSupported:o,vrSupported:l,quickLookSupported:M,resolvedMobileHandoffUrl:u,isMobileHandoffOpen:g,arOverlay:I,openMobileHandoff:R,closeMobileHandoff:f,openQuickLook:C,handleARStateChange:x}}import{Canvas as wv,useThree as Cv}from"@react-three/fiber";import{ContactShadows as Sv,Environment as Mv}from"@react-three/drei";import{XR as kv}from"@react-three/xr";import{NoToneMapping as Pv}from"three";import{Suspense as Tv,useEffect as Rv,useMemo as Ps,useState as Av}from"react";import{useFrame as Sc,useThree as So}from"@react-three/fiber";import{useXR as Gu}from"@react-three/xr";import{Color as Cx,PerspectiveCamera as Sx}from"three";import{useEffect as da,useLayoutEffect as Mx,useRef as Cc}from"react";function Wu({renderMode:e}){let{scene:t}=So(),n=So(s=>s.setFrameloop),a=Gu(s=>s.session!=null),r=Gu(s=>s.mode==="immersive-ar"),o=Cc(void 0);return da(()=>{n(a?"always":e)},[a,e,n]),da(()=>{r?(o.current=t.background,t.background=null):o.current!==void 0&&(t.background=o.current,o.current=void 0)},[r,t]),Sc(()=>{r&&t.background!==null&&(t.background=null)}),null}function $u({onPresentingChange:e}){let t=So(r=>r.gl),n=Cc(null);da(()=>{let r=t.xr;if(!r)return;let o=i=>{i?(n.current=t.shadowMap.enabled,t.shadowMap.enabled=!1):n.current!==null&&(t.shadowMap.enabled=n.current,n.current=null),e(i)},s=()=>o(!0),l=()=>o(!1);return r.addEventListener("sessionstart",s),r.addEventListener("sessionend",l),o(r.isPresenting),()=>{r.removeEventListener("sessionstart",s),r.removeEventListener("sessionend",l)}},[t,e]);let a=Cc(0);return Sc(()=>{if(!t.xr.isPresenting)return;let r=performance.now();if(r-a.current<1e3)return;a.current=r;let o=t.xr}),null}function Xu({active:e}){let t=So(n=>n.invalidate);return da(()=>{e&&t()},[e,t]),Sc(()=>{e&&t()}),null}function Ku({color:e}){let{scene:t}=So();return da(()=>{let n=t.background;return t.background=e?new Cx(e):null,()=>{t.background=n}},[t,e]),null}function Yu({rotation:e}){let{scene:t}=So();return Mx(()=>{let n=e*Math.PI/180;t.environmentRotation.set(0,n,0),t.backgroundRotation.set(0,n,0)}),null}function Ju({cameraConfig:e}){let{camera:t}=So();return da(()=>{if(!(t instanceof Sx))return;let n=e?.fov;typeof n=="number"&&t.fov!==n&&(t.fov=n,t.updateProjectionMatrix())},[t,e]),null}import{useThree as fm}from"@react-three/fiber";import{Autofocus as Wx,Bloom as $x,BrightnessContrast as Xx,ChromaticAberration as Kx,ColorAverage as Yx,DepthOfField as Jx,DotScreen as qx,EffectComposer as Zx,Glitch as Qx,GodRays as ev,Grid as tv,HueSaturation as nv,Noise as rv,Outline as ov,Pixelation as av,Ramp as iv,Scanline as sv,SelectiveBloom as lv,Sepia as cv,SMAA as dv,SSAO as pv,ToneMapping as uv,Vignette as mv}from"@react-three/postprocessing";import{BlendFunction as mi,KernelSize as bv}from"postprocessing";import{Color as Ms,Vector2 as bi}from"three";import{useEffect as gv,useMemo as gi,useRef as fv,useState as hv}from"react";import{CanvasTexture as Zu,Color as kx,ImageLoader as Px,NoColorSpace as vs,RepeatWrapping as qu,SRGBColorSpace as Tc,Texture as Tx}from"three";var pa=new Map,$r={color:"#93c5fd",intensity:.07},Rc=new kx($r.color).multiplyScalar($r.intensity),ua=new Map,Pc=new Map;function Rx(e){return`${e.name}|${e.size}|${e.lastModified}`}function Qu(e){let t=Rx(e),n=e.name.lastIndexOf("."),a=n>0?e.name.slice(0,n):e.name,r=n>0?e.name.slice(n):"",o=`materials/${e.name}`,s=2;for(;;){let l=Pc.get(o);if(l===void 0||l===t)return Pc.set(o,t),o;o=`materials/${a}-${s}${r}`,s+=1}}function em(e){return ua.get(e)}function tm(e,t){let n=++e.loadGeneration;e.loaded=!1;let a=()=>{if(e.loadGeneration!==n)return;e.loaded=!0;let r=e.pending;e.pending=[];for(let o of r)o()};new Px().load(t,r=>{e.loadGeneration===n&&(e.texture.image=r,e.texture.needsUpdate=!0,a())},void 0,()=>{e.loadGeneration===n&&(console.warn(`Failed to load texture: ${t}`),a())})}function nm(e,t){for(let n of[Tc,vs]){let a=pa.get(ui(e,n));a&&tm(a,t)}}function rm(e,t){let n=ua.get(e);n&&n!==t&&n.startsWith("blob:")&&URL.revokeObjectURL(n),ua.set(e,t),nm(e,t)}function Ac(e){let t=ua.get(e);t&&(t.startsWith("blob:")&&URL.revokeObjectURL(t),ua.delete(e),Pc.delete(e),nm(e,e))}function ui(e,t){return`${t}|${e}`}function zt(e,t=vs,n){let a=ui(e,t),r=pa.get(a);if(r)return n&&!r.loaded&&r.pending.push(n),r.texture;let o=ua.get(e)??e,s={texture:new Tx,refCount:0,loaded:!1,pending:n?[n]:[],loadGeneration:0};return s.texture.flipY=!1,s.texture.colorSpace=t,pa.set(a,s),tm(s,o),s.texture}function om(e,t=vs,n){let a=zt(e,t,n);return pa.get(ui(e,t)).refCount+=1,a}function ys(e,t=vs){let n=pa.get(ui(e,t));n&&(n.refCount-=1,n.refCount<=0&&(n.loadGeneration+=1,n.pending=[],n.texture.dispose(),pa.delete(ui(e,t))))}var Mc=null;function am(){if(Mc)return Mc;let e=256,t=document.createElement("canvas");t.width=e,t.height=e;let n=t.getContext("2d"),a=n.createRadialGradient(e*.35,e*.35,e*.02,e*.5,e*.5,e*.55);a.addColorStop(0,"#ffffff"),a.addColorStop(.4,"#b5b5b5"),a.addColorStop(1,"#3a3a3a"),n.fillStyle=a,n.fillRect(0,0,e,e);let r=new Zu(t);return r.colorSpace=Tc,Mc=r,r}var kc=null;function im(){if(kc)return kc;let e=1024,t=8,n=e/t,a=["#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 l=0;l<t;l+=1)for(let i=0;i<t;i+=1){let c=i*n,d=l*n,u=(Math.floor(i/2)+Math.floor(l/2))%4;o.fillStyle=a[u],o.fillRect(c,d,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(c+m,d),o.lineTo(c+m,d+n),o.moveTo(c,d+m),o.lineTo(c+n,d+m),o.stroke()}o.strokeStyle="#09090b",o.lineWidth=7,o.strokeRect(c,d,n,n);let b=c+n*.23,g=d+n*.72,h=c+n*.72,w=d+n*.23;o.lineCap="round",o.lineJoin="round",o.beginPath(),o.moveTo(b,g),o.lineTo(h,w),o.lineTo(h-n*.2,w),o.moveTo(h,w),o.lineTo(h,w+n*.2),o.stroke();let B=l*t+i+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(B).padStart(2,"0");o.strokeText(v,c+n/2,d+n*.82),o.fillText(v,c+n/2,d+n*.82)}let s=new Zu(r);return s.colorSpace=Tc,s.wrapS=qu,s.wrapT=qu,s.flipY=!1,s.anisotropy=8,s.needsUpdate=!0,kc=s,s}import{forwardRef as Ax,useImperativeHandle as Bx,useMemo as Ox}from"react";import{BlendFunction as Ex,Effect as Lx}from"postprocessing";import{Uniform as Dx}from"three";import{jsx as _x}from"react/jsx-runtime";var Nx=`
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
- `,Bc=class extends Lx{constructor(t=1){super("ExposureEffect",Nx,{blendFunction:Ex.NORMAL,uniforms:new Map([["exposure",new Dx(t)]])})}set exposure(t){this.uniforms.get("exposure").value=t}},sm=Ax(function({exposure:t},n){let a=Ox(()=>new Bc(t),[]);return a.exposure=t,Bx(n,()=>a,[a]),_x("primitive",{object:a,dispose:null})});import{useFrame as zx,useThree as Cs}from"@react-three/fiber";import*as pm from"@react-three/postprocessing";import{BlendFunction as jx}from"postprocessing";import{Color as Ix,MathUtils as Fx,Mesh as Vx,Vector2 as lm,Vector3 as cm}from"three";import{useEffect as dm,useMemo as Ss,useRef as Oc}from"react";import{jsx as Hx}from"react/jsx-runtime";var Ux=pm.LensFlareEffect;function um({config:e}){let t=Cs(b=>b.camera),n=Cs(b=>b.raycaster),a=Cs(b=>b.scene),r=Cs(b=>b.viewport),o=Oc(null),s=Oc(new cm),l=Oc(new lm),i=Ss(()=>new cm(...e.lensPosition),[e.lensPosition]),c=Ss(()=>new Ix(e.colorGain??"#141414"),[e.colorGain]),d=Ss(()=>new lm(0,0),[]),u=Ss(()=>new Ux({blendFunction:jx.NORMAL,enabled:!0,glareSize:e.glareSize,lensPosition:i,screenRes:d,starPoints:6,flareSize:e.flareSize,flareSpeed:e.flareSpeed,flareShape:e.flareShape,animated:e.animated,anamorphic:e.anamorphic,colorGain:c,lensDirtTexture:null,haloScale:e.haloScale,secondaryGhosts:e.secondaryGhosts,aditionalStreaks:e.aditionalStreaks,ghostScale:e.ghostScale,opacity:e.opacity,starBurst:e.starBurst}),[c,e.aditionalStreaks,e.anamorphic,e.animated,e.flareShape,e.flareSize,e.flareSpeed,e.glareSize,e.haloScale,e.ghostScale,e.opacity,e.secondaryGhosts,e.starBurst,i,d]);return dm(()=>(o.current=u,()=>{u.dispose(),o.current=null}),[u]),dm(()=>{let b=u.uniforms.get("screenRes");b&&(b.value.x=r.width,b.value.y=r.height)},[u,r]),zx((b,g)=>{let h=o.current;if(!h)return;let w=h.uniforms.get("lensPosition"),B=h.uniforms.get("opacity");if(!w||!B)return;let v=1;if(s.current.copy(i).project(t),s.current.z>1)return;w.value.x=s.current.x,w.value.y=s.current.y,l.current.x=s.current.x,l.current.y=s.current.y,n.setFromCamera(l.current,t);let p=n.intersectObjects(a.children,!0),{object:m}=p[0]||{};m&&(m.userData?.lensflare==="no-occlusion"?v=0:m instanceof Vx&&(m.material.uniforms?._transmission?.value>.2||m.material._transmission&&m.material._transmission>.2?v=.2:m.material.transparent&&(v=m.material.opacity))),B.value=Fx.damp(B.value,v,12,g)}),Hx("primitive",{object:u,dispose:null})}import{RampType as Ec}from"@react-three/postprocessing";import{GlitchMode as Lc,KernelSize as fa,ToneMappingMode as Dc}from"postprocessing";import{Color as Gx}from"three";function mm(e){return e==="linear"?Dc.LINEAR:e==="reinhard"?Dc.REINHARD:Dc.ACES_FILMIC}function Ms(e){switch(e){case"verySmall":return fa.VERY_SMALL;case"small":return fa.SMALL;case"medium":return fa.MEDIUM;case"large":return fa.LARGE;case"veryLarge":return fa.VERY_LARGE;case"huge":return fa.HUGE}}function bm(e){switch(e){case"constantMild":return Lc.CONSTANT_MILD;case"constantWild":return Lc.CONSTANT_WILD;default:return Lc.SPORADIC}}function Nc(e){let t=new Gx(e);return[t.r,t.g,t.b,1]}function gm(e){return e==="radial"?Ec.Radial:e==="mirroredLinear"?Ec.MirroredLinear:Ec.Linear}import{Fragment as vv,jsx as pt,jsxs as _c}from"react/jsx-runtime";var So={edgeStrength:1,pulseSpeed:0,visibleEdgeColor:new ks(Wr.color).getHex(),hiddenEdgeColor:new ks(Wr.color).multiplyScalar(.35).getHex(),kernelSize:bv.VERY_SMALL,blur:!1,xRay:!1};function xv(e){let t=[];return e.traverse(n=>{n.isMesh&&t.push(n)}),t}function hm({sceneConfig:e,selectedObjectRef:t,hoveredObjectRef:n,highlightOnHover:a=!1,disabled:r=!1}){let o=fm(M=>M.scene),s=fm(M=>M.gl),l=fv(null),i=e?.postProcessing,c=t??null,d=i?.outline.enabled===!0,u=d?xv(o):n?[n]:[],b=d||a,[g,h]=hv(()=>s.xr?.isPresenting??!1);gv(()=>{let M=s.xr;if(!M)return;let k=()=>h(!0),R=()=>h(!1);return M.addEventListener("sessionstart",k),M.addEventListener("sessionend",R),h(M.isPresenting),()=>{M.removeEventListener("sessionstart",k),M.removeEventListener("sessionend",R)}},[s]);let w=o.children.filter(M=>M.isLight),B=fi(()=>new gi(i?.chromaticAberration.offsetX??.002,i?.chromaticAberration.offsetY??.002),[i?.chromaticAberration.offsetX,i?.chromaticAberration.offsetY]),v=fi(()=>new ks(i?.outline.visibleEdgeColor??"#ffffff").getHex(),[i?.outline.visibleEdgeColor]),p=fi(()=>new ks(i?.outline.hiddenEdgeColor??"#22090a").getHex(),[i?.outline.hiddenEdgeColor]),m=fi(()=>Nc(i?.ramp.startColor??"#000000"),[i?.ramp.startColor]),S=fi(()=>Nc(i?.ramp.endColor??"#ffffff"),[i?.ramp.endColor]);return!i||g||r?null:_c(vv,{children:[i.godRays.enabled===!0&&_c("mesh",{ref:l,position:i.godRays.sunPosition,visible:!1,frustumCulled:!1,children:[pt("sphereGeometry",{args:[.1,8,8]}),pt("meshBasicMaterial",{transparent:!0,opacity:0,depthWrite:!1})]}),_c(Zx,{multisampling:0,enableNormalPass:i.ssao.enabled===!0,autoClear:!1,children:[i.smaa.enabled===!0&&pt(dv,{}),i.ssao.enabled===!0&&pt(pv,{samples:i.ssao.samples,rings:i.ssao.rings,intensity:i.ssao.intensity,radius:i.ssao.radius,bias:i.ssao.bias,luminanceInfluence:i.ssao.luminanceInfluence,fade:i.ssao.fade,minRadiusScale:i.ssao.minRadiusScale,worldDistanceThreshold:i.ssao.worldDistanceThreshold,worldDistanceFalloff:i.ssao.worldDistanceFalloff,worldProximityThreshold:i.ssao.worldProximityThreshold,worldProximityFalloff:i.ssao.worldProximityFalloff}),i.autofocus.enabled===!0&&pt(Wx,{focusDistance:i.autofocus.focusDistance,focusRange:i.autofocus.focusRange,focalLength:i.autofocus.focalLength,bokehScale:i.autofocus.bokehScale,target:i.autofocus.target,mouse:i.autofocus.mouse,debug:i.autofocus.debug||void 0,manual:i.autofocus.manual,smoothTime:i.autofocus.smoothTime}),i.autofocus.enabled!==!0&&i.depthOfField.enabled===!0&&pt(Jx,{focusDistance:i.depthOfField.focusDistance,focusRange:i.depthOfField.focusRange,focalLength:i.depthOfField.focalLength,bokehScale:i.depthOfField.bokehScale}),i.bloom.enabled===!0&&pt($x,{intensity:i.bloom.intensity,luminanceThreshold:i.bloom.luminanceThreshold,luminanceSmoothing:i.bloom.luminanceSmoothing,mipmapBlur:i.bloom.mipmapBlur,radius:i.bloom.radius,levels:i.bloom.levels}),i.selectiveBloom.enabled===!0&&pt(lv,{selection:c??void 0,lights:w,selectionLayer:i.selectiveBloom.selectionLayer,intensity:i.selectiveBloom.intensity,luminanceThreshold:i.selectiveBloom.luminanceThreshold,luminanceSmoothing:i.selectiveBloom.luminanceSmoothing,kernelSize:Ms(i.selectiveBloom.kernelSize),mipmapBlur:i.selectiveBloom.mipmapBlur,inverted:i.selectiveBloom.inverted,ignoreBackground:i.selectiveBloom.ignoreBackground}),b&&pt(ov,{selection:u,selectionLayer:i.outline.selectionLayer,blendFunction:bi.SCREEN,edgeStrength:d?i.outline.edgeStrength:So.edgeStrength,pulseSpeed:d?i.outline.pulseSpeed:So.pulseSpeed,visibleEdgeColor:d?v:So.visibleEdgeColor,hiddenEdgeColor:d?p:So.hiddenEdgeColor,kernelSize:d?Ms(i.outline.kernelSize):So.kernelSize,blur:d?i.outline.blur:So.blur,xRay:d?i.outline.xRay:So.xRay}),i.chromaticAberration.enabled===!0&&pt(Kx,{offset:B,radialModulation:i.chromaticAberration.radialModulation,modulationOffset:i.chromaticAberration.modulationOffset}),i.colorAverage.enabled===!0&&pt(Yx,{}),i.dotScreen.enabled===!0&&pt(qx,{angle:i.dotScreen.angle,scale:i.dotScreen.scale}),i.glitch.enabled===!0&&pt(Qx,{mode:bm(i.glitch.mode),delay:new gi(i.glitch.delay[0],i.glitch.delay[1]),duration:new gi(i.glitch.duration[0],i.glitch.duration[1]),strength:new gi(i.glitch.strength[0],i.glitch.strength[1]),chromaticAberrationOffset:new gi(i.glitch.chromaticAberrationOffset[0],i.glitch.chromaticAberrationOffset[1]),columns:i.glitch.columns,ratio:i.glitch.ratio,active:!0}),i.grid.enabled===!0&&pt(tv,{scale:i.grid.scale,lineWidth:i.grid.lineWidth}),i.lensflare.enabled===!0&&pt(um,{config:i.lensflare}),i.godRays.enabled===!0&&pt(ev,{sun:l,samples:i.godRays.samples,density:i.godRays.density,decay:i.godRays.decay,weight:i.godRays.weight,exposure:i.godRays.exposure,clampMax:i.godRays.clampMax,blur:i.godRays.blur,kernelSize:Ms(i.godRays.kernelSize)}),i.noise.enabled===!0&&pt(rv,{premultiply:i.noise.premultiply,opacity:i.noise.opacity,blendFunction:bi.ADD}),i.brightnessContrast.enabled===!0&&pt(Xx,{brightness:i.brightnessContrast.brightness,contrast:i.brightnessContrast.contrast}),i.hueSaturation.enabled===!0&&pt(nv,{hue:i.hueSaturation.hue,saturation:i.hueSaturation.saturation}),i.toneMapping.enabled===!0&&pt(sm,{exposure:i.toneMapping.exposure}),i.vignette.enabled===!0&&pt(mv,{eskil:i.vignette.eskil,offset:i.vignette.offset,darkness:i.vignette.darkness,blendFunction:bi.NORMAL}),i.toneMapping.enabled===!0&&pt(uv,{mode:mm(i.toneMapping.mode),resolution:i.toneMapping.resolution,whitePoint:i.toneMapping.whitePoint,middleGrey:i.toneMapping.middleGrey,minLuminance:i.toneMapping.minLuminance,averageLuminance:i.toneMapping.averageLuminance,adaptationRate:i.toneMapping.adaptationRate}),i.sepia.enabled===!0&&pt(cv,{intensity:i.sepia.intensity,blendFunction:bi.NORMAL}),i.scanline.enabled===!0&&pt(sv,{density:i.scanline.density,blendFunction:bi.OVERLAY}),i.pixelation.enabled===!0&&pt(av,{granularity:i.pixelation.granularity}),i.ramp.enabled===!0&&pt(iv,{rampType:gm(i.ramp.rampType),rampStart:i.ramp.rampStart,rampEnd:i.ramp.rampEnd,startColor:m,endColor:S,opacity:i.ramp.rampMask?1:i.ramp.opacity??.5,rampBias:i.ramp.rampBias,rampGain:i.ramp.rampGain,rampMask:i.ramp.rampMask,rampInvert:i.ramp.rampInvert})]})]})}import{Component as yv}from"react";var Ps=class extends yv{constructor(){super(...arguments);this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(n,a){this.props.onError?.(n)}render(){return this.state.hasError?this.props.fallback??null:this.props.children}};import{Fragment as Ev,jsx as jn,jsxs as xm}from"react/jsx-runtime";var Bv=1.5;function Ov({captureRef:e}){let{gl:t,scene:n,camera:a,invalidate:r}=Cv();return Rv(()=>{if(e)return e.current={gl:t,scene:n,camera:a,invalidate:r},()=>{e.current=null}},[e,t,n,a,r]),null}function zc({children:e,camera:t,backgroundColor:n,shadows:a=!0,sceneConfig:r,selectedObjectRef:o,hoveredObjectRef:s,highlightOnHover:l,renderMode:i="demand",maxDpr:c=2,xrStore:d,rendererCaptureRef:u,preserveDrawingBuffer:b=!1,reduceGpuLoad:g}){let h=g??yc(),w=h?Math.min(c,Bv):c,B=a&&!h,v=Ts(()=>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=Ts(()=>{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=Ts(()=>{let x=r?.postProcessing;return x?!!(x.glitch.enabled||x.noise.enabled||x.lensflare.enabled&&x.lensflare.animated):!1},[r?.postProcessing]),[S,M]=Av(!1),k=r?.environment,R=r?.groundShadows,f=Ts(()=>{if(!k)return null;if(k.source==="custom"){let x=k.customEnvironmentUrl.trim();return ds(x)?{files:x}:null}return{preset:k.preset}},[k]),C=xm(Ev,{children:[jn(Ov,{captureRef:u}),jn(Ju,{cameraConfig:t}),jn(Xu,{active:m}),jn(Ku,{color:p}),f?jn(Ps,{onError:x=>console.warn("Failed to load environment map:",x),children:jn(Tv,{fallback:null,children:jn(Mv,{...f,environmentIntensity:k?.intensity??.25,backgroundIntensity:k?.intensity??.25,background:r?.background.enabled===!0&&r.background.type==="environment"})})}):null,jn(Yu,{rotation:k?.rotation??0}),d&&jn($u,{onPresentingChange:M}),R?.enabled&&R.mode==="shadowCatcher"&&!S&&jn(Sv,{position:[0,R.height,0],scale:R.size,opacity:R.intensity,blur:R.borderFade,far:15,resolution:1024,color:"#000000"}),e,jn(hm,{sceneConfig:r,selectedObjectRef:o,hoveredObjectRef:s,highlightOnHover:l,disabled:h})]});return jn(wv,{frameloop:i,dpr:[1,w],shadows:B?"soft":!1,resize:{debounce:0,scroll:!1},raycaster:{firstHitOnly:!0},style:v,camera:t??{fov:50},gl:{preserveDrawingBuffer:b,toneMapping:Pv,toneMappingExposure:1},children:d?xm(kv,{store:d,children:[jn(Wu,{renderMode:i}),C]}):C})}import{CameraControls as Lv}from"@react-three/drei";import{useEffect as Dv}from"react";import{jsx as Nv}from"react/jsx-runtime";function jc({controlsRef:e,onCameraChange:t}){return Dv(()=>{if(!t||!e||typeof e!="object"||!("current"in e))return;let n=e.current;if(!n)return;let a=()=>{t(n.camera,n)};return n.addEventListener("update",a),()=>{n.removeEventListener("update",a)}},[e,t]),Nv(Lv,{ref:e,makeDefault:!0,smoothTime:.3})}import{useRef as Fc,useMemo as Rs,useEffect as zv}from"react";import{useFrame as jv,useThree as vm}from"@react-three/fiber";import{Vector3 as Iv}from"three";var Ic=Symbol("react-immersive.model-node-id");function _v(e,t){Object.defineProperty(e,Ic,{value:t,configurable:!0})}function ha(e){let t=new Map;e.traverse(i=>{if(!i.name)return;let c=t.get(i.name);c?c.push(i):t.set(i.name,[i])});let n=Object.create(null),a=new WeakMap,r=new Map,o=new Set(Array.from(t,([i,c])=>c.length===1?i:null).filter(i=>i!==null)),s=new Set,l=(i,c)=>{_v(i,c),n[c]=i,a.set(i,c),s.add(c)};for(let[i,c]of t)c.length===1&&l(c[0],i);for(let[i,c]of t){if(c.length<2)continue;let d=[];c.forEach((u,b)=>{let g=`${i} [${b+1}]`,h=g,w=2;for(;o.has(h)||s.has(h);)h=`${g}.${w++}`;l(u,h),d.push(h)}),r.set(i,d)}return{nodesById:n,idByNode:a,duplicateNames:r}}function hi(e){return e[Ic]??e.name??null}function ar(e,t){let n=null,a=[];return e.traverse(r=>{r[Ic]===t&&(n=r),r.name===t&&a.push(r)}),n??(a.length===1?a[0]:null)}import{Fragment as Wv,jsx as Mo,jsxs as $v}from"react/jsx-runtime";function wm(e,t){if(!t)return e;let n=t*Math.PI/180,a=Math.cos(n),r=Math.sin(n);return[e[0]*a+e[2]*r,e[1],-e[0]*r+e[2]*a]}function Fv(e,t){let[n,a,r]=e.center,o=e.radius,s=Math.hypot(t[0],t[1],t[2]),l=s>1e-6?[t[0]/s,t[1]/s,t[2]/s]:[0,1,0],i=o*2;return{position:[n+l[0]*i,a+l[1]*i,r+l[2]*i],target:e.center,extent:o,near:Math.max(o/100,.001),far:i+o*2}}function Vv(e,t){let n=t[0]-e.center[0],a=t[1]-e.center[1],r=t[2]-e.center[2],o=Math.hypot(n,a,r);return{near:Math.max(o-e.radius,o*.01,.001),far:o+e.radius*2}}function Uv(e,t,n){return t&&n&&!e.attachedToCamera?n.center:[0,0,0]}var Hv={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}]},Gv={enabled:!0,mapSize:2048,bias:-5e-4,normalBias:.02,radius:3};function ym({light:e,shadows:t,shadowsEnabled:n,environmentRotation:a,modelBounds:r,objectBindings:o,nodeRefs:s}){let l=Fc(null),i=Fc(null),c=Fc(null),d=vm(v=>v.camera),u=vm(v=>v.scene),b=Rs(()=>new Iv,[]),g=Rs(()=>e.attachedToCamera||e.attachment?e.position:wm(e.position,a),[e.position,e.attachedToCamera,e.attachment,a]);jv(()=>{let v=l.current??i.current??c.current;if(!v)return;if(e.attachedToCamera){v.position.copy(d.position);return}let p=e.attachment;if(!p)return;let m=o?un(o,p.objectId):null,M=(m?o?.[m]:void 0)?.modelObjectId??p.objectId,k=(m?s?.current[m]:void 0)??ar(u,M);k&&(b.fromArray(p.offset),k.localToWorld(b),v.position.copy(b))});let h=n&&t.enabled&&e.castShadow,w=Rs(()=>e.type==="directional"&&h&&r&&!e.attachedToCamera?Fv(r,g):null,[e.type,e.attachedToCamera,h,r,g]),B=Rs(()=>e.type==="spot"&&h&&r&&!e.attachedToCamera?Vv(r,g):null,[e.type,e.attachedToCamera,h,r,g]);return zv(()=>{let v=l.current??c.current;if(!v)return;let[p,m,S]=Uv(e,h,r);v.target.position.set(p,m,S),v.target.updateMatrixWorld()},[e,h,r]),!e.visible||e.type==="none"?null:e.type==="directional"?Mo("directionalLight",{ref:l,color:e.color,intensity:e.intensity,position:w?.position??g,castShadow:h,"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":w?.near??.5,"shadow-camera-far":w?.far??40,"shadow-camera-left":-(w?.extent??8),"shadow-camera-right":w?.extent??8,"shadow-camera-top":w?.extent??8,"shadow-camera-bottom":-(w?.extent??8)}):e.type==="point"?Mo("pointLight",{ref:i,color:e.color,intensity:e.intensity,position:g,distance:e.distance,decay:e.decay,castShadow:h,"shadow-mapSize-width":t.mapSize,"shadow-mapSize-height":t.mapSize,"shadow-bias":e.shadowBias}):e.type==="spot"?Mo("spotLight",{ref:c,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:h,"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":B?.near??.5,"shadow-camera-far":B?.far??40}):e.type==="hemisphere"?Mo("hemisphereLight",{color:e.color,groundColor:"#444444",intensity:e.intensity}):null}function Vc({lightingConfig:e,shadowConfig:t,shadowsEnabled:n=!0,environmentRotation:a=0,environmentConfig:r,modelBounds:o,objectBindings:s,nodeRefs:l}){let i=e??Hv,c=t??Gv,d=r?.shadowLight,u=wm([5,10,5],a);return $v(Wv,{children:[Mo("ambientLight",{intensity:i.ambient.intensity,color:i.ambient.color}),i.lights.map(b=>Mo(ym,{light:b,shadows:c,shadowsEnabled:n,environmentRotation:a,modelBounds:o,objectBindings:s,nodeRefs:l},b.id)),d?.enabled&&Mo(ym,{light:{id:"light-env-shadow",type:"directional",color:"#ffffff",intensity:d.intensity,position:u,attachedToCamera:!1,castShadow:!0,shadowBias:d.bias,visible:!0},shadows:c,shadowsEnabled:n,environmentRotation:0,modelBounds:o,objectBindings:s,nodeRefs:l})]})}import{useState as $y,useEffect as Ft,useRef as rn,useMemo as mn}from"react";import{useFrame as qc,useThree as Xy}from"@react-three/fiber";import{useLoader as Im,useThree as fy}from"@react-three/fiber";import{FileLoader as hy,Loader as xy,LoadingManager as vy}from"three";import{FBXLoader as yy,GLTFLoader as wy,MTLLoader as Cy,OBJLoader as Sy}from"three-stdlib";import{USDLoader as My}from"three/examples/jsm/loaders/USDLoader.js";import{strFromU8 as Xv,strToU8 as Kv,unzip as Yv}from"fflate";var Cm;function Sm(e){Cm=e}function xi(e){Cm?.(e)}var Jv=[".glb",".gltf",".obj",".fbx",".usdz",".zip"],qv=["model/gltf-binary","model/gltf+json","model/vnd.usdz+zip","application/vnd.usdz+zip","application/zip","application/x-zip-compressed"],vi=1024*1024,Mm=128*vi,km=1024,Pm=128*vi,Tm=256*vi,Rm=200,Zv=vi,Br=new Map,As=".glb,.gltf,.obj,.fbx,.usdz,.zip,model/gltf-binary,model/gltf+json,model/vnd.usdz+zip,application/vnd.usdz+zip,application/zip";function Hc(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 Em(e){return Br.get(e)??{format:Hc(e)}}function Qv(e){let t=e.name.toLowerCase();return Jv.some(n=>t.endsWith(n))||qv.includes(e.type)}async function Bs(e){if(!Qv(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 Am(e,"usdz");if(t.endsWith(".zip")||ey(e.type))return ty(e);if(t.endsWith(".gltf")||e.type==="model/gltf+json")return Bm(e);let n=Hc(e.name);return n==="gltf"?Bm(e):Am(e,n)}function Am(e,t){let n=URL.createObjectURL(e);return Br.set(n,{format:t,entryPath:e.name}),{url:n,name:e.name,format:t,cleanup:()=>{xi(n),Br.delete(n),URL.revokeObjectURL(n)}}}function ey(e){return e==="application/zip"||e==="application/x-zip-compressed"}async function Bm(e){let t=await e.text(),n=Lm(t,e.name);for(let r of Dm(n))if(!Gc(r))throw new Error(`${e.name} references external assets. Upload a .zip containing the .gltf file and its dependencies.`);let a=URL.createObjectURL(e);return Br.set(a,{format:"gltf",entryPath:e.name}),{url:a,name:e.name,format:"gltf",cleanup:()=>{xi(a),Br.delete(a),URL.revokeObjectURL(a)}}}async function ty(e){if(e.size>Mm)throw new Error(`Model zip is too large. The compressed archive must be ${Uc(Mm)} or smaller.`);let t=await ny(new Uint8Array(await e.arrayBuffer())),n=new Map;for(let[s,l]of Object.entries(t)){let i=Wc(s);!i||Nm(i)||n.set(i,l)}let a=[...n.keys()].filter(s=>/\.(gltf|obj|fbx)$/i.test(s));if(a.length===0)throw new Error("Invalid model zip: no .gltf, .obj, or .fbx file found.");if(a.length>1)throw new Error("Invalid model zip: multiple model entry files found.");let r=a[0],o=Hc(r);if(o==="gltf")return oy(e,r,n);if(o==="obj"||o==="fbx")return ry(e,r,o,n);throw new Error(`Unsupported model entry ${r}.`)}function ny(e){return new Promise((t,n)=>{let a=0,r=0,o=null,s=i=>(o??(o=new Error(`Invalid model zip: ${i}`)),!1);Yv(e,{filter:i=>{if(o)return!1;if(a+=1,a>km)return s(`archive contains more than ${km.toLocaleString()} entries.`);if(i.originalSize>Pm)return s(`${i.name} expands beyond the ${Uc(Pm)} per-file limit.`);if(r+=i.originalSize,r>Tm)return s(`expanded contents exceed ${Uc(Tm)}.`);if(i.originalSize>=Zv&&(i.size===0||i.originalSize/i.size>Rm))return s(`${i.name} exceeds the ${Rm}:1 compression-ratio limit.`);let c=Wc(i.name);return!!c&&!Nm(c)}},(i,c)=>{o?n(o):i?n(new Error(`Invalid model zip: ${i.message}`)):t(c)})})}function Uc(e){return`${e/vi} MiB`}function ry(e,t,n,a){let r=[],o={};for(let[l,i]of a){let c=URL.createObjectURL(new Blob([i],{type:_m(l)}));r.push(c),o[l]=c}let s=o[t];if(!s)throw r.forEach(l=>URL.revokeObjectURL(l)),new Error(`Invalid model zip: could not read ${t}.`);return Br.set(s,{format:n,entryPath:t,resourceUrls:o}),{url:s,name:e.name,format:n,cleanup:()=>{xi(s),Br.delete(s),r.forEach(l=>URL.revokeObjectURL(l))}}}function oy(e,t,n){let a=n.get(t);if(!a)throw new Error("Invalid GLTF zip: no .gltf found.");let r=Lm(Xv(a),t);ay(r,t);let o=iy(t),s=[];try{Om(r.buffers,o,n,s),Om(r.images,o,n,s);let l=new Blob([Kv(JSON.stringify(r))],{type:"model/gltf+json"}),i=URL.createObjectURL(l);return s.push(i),Br.set(i,{format:"gltf",entryPath:t}),{url:i,name:e.name,format:"gltf",cleanup:()=>{xi(i),Br.delete(i),s.forEach(c=>URL.revokeObjectURL(c))}}}catch(l){throw s.forEach(i=>URL.revokeObjectURL(i)),l}}function Om(e,t,n,a){for(let r of e??[]){if(typeof r.uri!="string"||Gc(r.uri))continue;let o=sy(t,r.uri),s=n.get(o);if(!s)throw new Error(`Invalid GLTF zip: missing referenced asset ${r.uri}.`);let l=URL.createObjectURL(new Blob([s],{type:_m(o)}));a.push(l),r.uri=l}}function Lm(e,t){try{return JSON.parse(e)}catch{throw new Error(`${t} is not a valid .gltf JSON file.`)}}function Dm(e){return[...e.buffers??[],...e.images??[]].map(t=>t.uri).filter(t=>typeof t=="string"&&t.length>0)}function ay(e,t){for(let n of Dm(e)){if(Gc(n))continue;let a=/^[a-z][a-z0-9+.-]*:/i.test(n),r=n.startsWith("/")||n.startsWith("\\");if(a||r)throw new Error(`${t} references external assets. Include every dependency inside the uploaded .zip.`)}}function Gc(e){return e.startsWith("data:")}function Wc(e){let t=[];for(let n of e.replace(/\\/g,"/").replace(/^\/+/,"").split("/").filter(a=>a&&a!==".")){if(n===".."){t.pop();continue}t.push(n)}return t.join("/")}function Nm(e){let t=e.split("/");return e.endsWith("/")||t.includes("__MACOSX")||t.some(n=>n===".DS_Store"||n.startsWith("._"))}function iy(e){let t=e.lastIndexOf("/");return t===-1?"":e.slice(0,t)}function sy(e,t){let n=t.split(/[?#]/)[0],a=ly(n);return Wc(e?`${e}/${a}`:a)}function ly(e){try{return decodeURI(e)}catch{return e}}function _m(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 D5}from"@react-three/drei";import{useThree as _5}from"@react-three/fiber";import{useMemo as j5}from"react";import{SRGBColorSpace as cy}from"three";import{DRACOLoader as dy,KTX2Loader as py,MeshoptDecoder as uy}from"three-stdlib";function my(e){return{name:"RI_unlit_emissive_texture",async afterRoot(t){let n=e.json.materials??[],a=new Map;if(n.forEach(o=>{let s=!!o?.extensions?.KHR_materials_unlit,l=!!o?.pbrMetallicRoughness?.baseColorTexture;s&&!l&&o?.emissiveTexture&&o.name&&a.set(o.name,o.emissiveTexture.index)}),a.size===0||!t.scene)return;let r=new Map;await Promise.all([...a].map(async([o,s])=>{let l=await e.getDependency("texture",s);l&&(l.colorSpace=cy,r.set(o,l))})),t.scene.traverse(o=>{let s=Array.isArray(o.material)?o.material:o.material?[o.material]:[];for(let l of s){let i=l.name?r.get(l.name):void 0;i&&!l.map&&(l.map=i,l.needsUpdate=!0)}})}}}var by="https://assets.react-immersive.liveroom.dev/three-r184/draco/",gy="https://assets.react-immersive.liveroom.dev/three-r184/basis/";function zm(e,t={},n){let{dracoDecoderPath:a=by,ktx2TranscoderPath:r=gy,meshopt:o=!0}=t;if(a){let s=new dy;s.setDecoderPath(a),e.setDRACOLoader(s)}if(o&&e.setMeshoptDecoder(uy),r&&n){let s=new py().setTranscoderPath(r).detectSupport(n);e.setKTX2Loader(s)}e.register((s=>my(s)))}var Os=class extends xy{constructor(){super(...arguments);this.options={source:{format:"glb"}}}configure(n){return this.options=n,this}load(n,a,r,o){this.loadAsset(n,r).then(a).catch(o)}async loadAsset(n,a){let r=Py(this.options.source),{format:o}=this.options.source;if(o==="obj")return ky(n,r,this.options.source,a);if(o==="fbx"){let i=$c(this,new yy(r)),c=Ay(n,this.options.source);c&&i.setResourcePath(c);let d=await i.loadAsync(n,a);return Xc(d,"FBXMesh",!1),{scene:d,animations:d.animations??[]}}if(o==="usdz"){let c=await $c(this,new My(r)).loadAsync(n,a);return Xc(c,"USDZMesh",!1),{scene:c,animations:c.animations??[]}}let s=$c(this,new wy(r));zm(s,this.options.decoderConfig,this.options.renderer);let l=await s.loadAsync(n,a);return{scene:l.scene,animations:l.animations??[]}}};Sm(e=>{Im.clear(Os,e)});function Ds(e,t={},n){let a=fy(s=>s.gl),r=Em(e),o=n?{...r,format:n}:r;return Im(Os,e,s=>{s.configure({source:o,decoderConfig:t,renderer:a})})}async function ky(e,t,n,a){let r=await jm(e,t,a),o=new Sy(t),s=Ty(r);if(s){let i=Ry(s,e,n);if(i)try{let c=await jm(i.url,t),u=new Cy(t).parse(c,i.basePath);u.preload(),o.setMaterials(u)}catch(c){console.warn(`[react-immersive] Could not load OBJ material ${s}; rendering geometry with fallback materials.`,c)}}let l=o.parse(r);return Xc(l,"OBJMesh",!0),{scene:l,animations:[]}}function Xc(e,t,n){let a=new Set,r=0;e.traverse(o=>{if(!("isMesh"in o&&o.isMesh===!0)){o.name&&a.add(o.name);return}let l=o.name||`${t}_${++r}`;if(!n&&o.name){a.add(o.name);return}let i=l,c=2;for(;a.has(i);)i=`${l}_${c++}`;o.name=i,a.add(i)})}function jm(e,t,n){let a=new hy(t);return a.setResponseType("text"),a.loadAsync(e,n)}function $c(e,t){return t.setCrossOrigin(e.crossOrigin),t.setWithCredentials(e.withCredentials),t.setRequestHeader(e.requestHeader),t}function Py(e){let t=new vy,n=e.resourceUrls;return n&&t.setURLModifier(a=>{if(/^(?:blob:|data:)/i.test(a))return a;let r=Ls(Vm(a).split(/[?#]/)[0]),o=n[r];if(o)return o;let s=Es(e.entryPath??""),l=Ls(s?`${s}/${r}`:r);return n[l]??a}),t}function Ty(e){return/^\s*mtllib\s+(.+?)\s*$/im.exec(e)?.[1]?.trim()||null}function Ry(e,t,n){if(n.resourceUrls&&n.entryPath){let a=Ls(`${Es(n.entryPath)}/${Vm(e)}`),r=n.resourceUrls[a];if(!r)return null;let o=Es(a);return{url:r,basePath:o?`${o}/`:""}}try{let a=new URL(e,t).href;return{url:a,basePath:Fm(a)}}catch{return null}}function Ay(e,t){if(t.resourceUrls&&t.entryPath){let n=Es(t.entryPath);return n?`${n}/`:""}return Fm(e)}function Fm(e){let t=e.lastIndexOf("/");return t===-1?"":e.slice(0,t+1)}function Es(e){let t=Ls(e),n=t.lastIndexOf("/");return n===-1?"":t.slice(0,n)}function Ls(e){let t=[];for(let n of e.replace(/\\/g,"/").replace(/^\/+/,"").split("/").filter(a=>a&&a!=="."))n===".."?t.pop():t.push(n);return t.join("/")}function Vm(e){try{return decodeURI(e)}catch{return e}}import{MeshStandardMaterial as Ky,MeshBasicMaterial as Zc,MeshNormalMaterial as Yy,MeshMatcapMaterial as Jy,DoubleSide as qy,NormalBlending as Zy,AnimationMixer as Qy,LoopOnce as ew,LoopRepeat as tw,Box3 as Us,Vector3 as ko,Matrix4 as nw,MathUtils as Hs}from"three";import{SkeletonUtils as rw}from"three-stdlib";function Um(e){let t=new Map;return e.map((n,a)=>{let o=n.name.trim()||`Animation ${a+1}`,s=t.get(o)??0;return t.set(o,s+1),{clip:n,sourceName:s===0?o:`${o} (${s+1})`,duration:n.duration}})}import{AdditiveBlending as By,BackSide as Oy,DoubleSide as Ey,FrontSide as Ly,NoColorSpace as Dy,NormalBlending as Ny,SRGBColorSpace as _y,Vector2 as Hm}from"three";function Gm(e){return!!(e&&typeof e=="object"&&"clone"in e&&"color"in e&&"metalness"in e&&"roughness"in e)}function Wm(e){return!!(e&&typeof e=="object"&&"isMeshPhysicalMaterial"in e&&e.isMeshPhysicalMaterial)}function $r(e){return!!(e&&"isMesh"in e&&e.isMesh)}var $m=["texture","metalnessMap","roughnessMap","emissiveMap","alphaMap","normalMap","bumpMap","aoMap","displacementMap","clearcoatMap","clearcoatRoughnessMap","clearcoatNormalMap","anisotropyMap","transmissionMap","thicknessMap","sheenColorMap","sheenRoughnessMap","specularIntensityMap","specularColorMap"],zy=new Set(["texture","emissiveMap","sheenColorMap","specularColorMap"]);function Ns(e){return zy.has(e)?_y:Dy}function Lt(e,t){return e?.[t]?.path}function Xm(e){return e==="back"?Oy:e==="double"?Ey:Ly}function Km(e){return e==="additive"?By:Ny}function Or(e,t=1,n=t){if(e&&typeof e=="object"){let a=e;if(typeof a.x=="number"&&Number.isFinite(a.x)&&typeof a.y=="number"&&Number.isFinite(a.y))return new Hm(a.x,a.y)}return new Hm(t,n)}function Kc(e){return Number.isFinite(e)&&e>0?e:1}function _s(e,t){return e?.animations.clips.find(n=>n.sourceName===t)}function Ym(e){return e?.loopMode??"repeat"}import{Color as Yc,MeshPhysicalMaterial as jy,MeshStandardMaterial as Iy,Texture as Jc}from"three";function zs(e){if(Gm(e))return e;if(!e||typeof e!="object")return null;let t=e,n=new Iy;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 Jc?(n.emissiveMap=t.map,n.emissive.set(16777215)):t.color instanceof Yc&&n.emissive.copy(t.color)):(t.color instanceof Yc&&n.color.copy(t.color),t.map instanceof Jc&&(n.map=t.map),t.emissive instanceof Yc&&n.emissive.copy(t.emissive),t.emissiveMap instanceof Jc&&(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 Jm(e){if(Wm(e))return e.clone();let t=new jy;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(Or(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 qm(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=Or(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=Or(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 js,FrontSide as Fy,NormalBlending as Zm,SRGBColorSpace as Is}from"three";function Qm(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 js(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??Zm,e.depthWrite=e.userData.baseDepthWrite??!0,e.side=e.userData.baseSide??Fy,e.normalMap=e.userData.baseNormalMap??null,e.normalScale.copy(Or(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(Or(e.userData.baseClearcoatNormalScale)),e.sheen=e.userData.baseSheen??e.sheen,e.sheenColor.copy(e.userData.baseSheenColor??new js(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 js("#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 js("#ffffff")),e.specularColorMap=e.userData.baseSpecularColorMap??null,e.flatShading=e.userData.baseFlatShading??e.flatShading,e.envMapIntensity=e.userData.baseEnvMapIntensity??e.envMapIntensity;let a=Lt(t,"texture"),r=Lt(t,"metalnessMap"),o=Lt(t,"roughnessMap"),s=Lt(t,"emissiveMap"),l=Lt(t,"alphaMap"),i=Lt(t,"normalMap"),c=Lt(t,"bumpMap"),d=Lt(t,"aoMap"),u=Lt(t,"displacementMap"),b=Lt(t,"clearcoatMap"),g=Lt(t,"clearcoatRoughnessMap"),h=Lt(t,"clearcoatNormalMap"),w=Lt(t,"anisotropyMap"),B=Lt(t,"transmissionMap"),v=Lt(t,"thicknessMap"),p=Lt(t,"sheenColorMap"),m=Lt(t,"sheenRoughnessMap"),S=Lt(t,"specularIntensityMap"),M=Lt(t,"specularColorMap");if(a?(e.map=It(a,Is),e.color.set(n??"#ffffff")):n&&(e.map=null,e.color.set(n)),r&&(e.metalnessMap=It(r)),t?.metalness!==void 0&&(e.metalness=t.metalness),o&&(e.roughnessMap=It(o)),t?.roughness!==void 0&&(e.roughness=t.roughness),t?.emissive?e.emissive.set(t.emissive):s&&e.emissive.set("#ffffff"),t?.emissiveIntensity!==void 0&&(e.emissiveIntensity=t.emissiveIntensity),s&&(e.emissiveMap=It(s,Is)),t?.opacity!==void 0&&(e.opacity=t.opacity),l&&(e.alphaMap=It(l)),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=Km(t.blendingMode),e.depthWrite=t.blendingMode!=="additive"),t?.side&&(e.side=Xm(t.side)),i&&(e.normalMap=It(i)),i||t?.normalScale!==void 0){let k=t?.normalScale??Math.abs(Or(e.userData.baseNormalScale).x);e.normalScale.set(k,t?.flipNormalY?-k:k)}if(c&&(e.bumpMap=It(c)),t?.bumpScale!==void 0&&(e.bumpScale=t.bumpScale),d&&(e.aoMap=It(d)),t?.aoMapIntensity!==void 0&&(e.aoMapIntensity=t.aoMapIntensity),u&&(e.displacementMap=It(u)),t?.displacementScale!==void 0&&(e.displacementScale=t.displacementScale),t?.displacementBias!==void 0&&(e.displacementBias=t.displacementBias),b&&(e.clearcoatMap=It(b)),t?.clearcoat!==void 0&&(e.clearcoat=t.clearcoat),g&&(e.clearcoatRoughnessMap=It(g)),t?.clearcoatRoughness!==void 0&&(e.clearcoatRoughness=t.clearcoatRoughness),h&&(e.clearcoatNormalMap=It(h)),h||t?.clearcoatNormalScale!==void 0){let k=t?.clearcoatNormalScale??Math.abs(Or(e.userData.baseClearcoatNormalScale).x);e.clearcoatNormalScale.set(k,t?.flipClearcoatNormalY?-k:k)}t?.sheen!==void 0&&(e.sheen=t.sheen),t?.sheenColor&&e.sheenColor.set(t.sheenColor),p&&(e.sheenColorMap=It(p,Is)),t?.sheenRoughness!==void 0&&(e.sheenRoughness=t.sheenRoughness),m&&(e.sheenRoughnessMap=It(m)),t?.anisotropy!==void 0&&(e.anisotropy=t.anisotropy),t?.anisotropyRotation!==void 0&&(e.anisotropyRotation=t.anisotropyRotation),w&&(e.anisotropyMap=It(w)),t?.transmission!==void 0&&(e.transmission=t.transmission),B&&(e.transmissionMap=It(B)),t?.thickness!==void 0&&(e.thickness=t.thickness),v&&(e.thicknessMap=It(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),S&&(e.specularIntensityMap=It(S)),t?.specularColor&&e.specularColor.set(t.specularColor),M&&(e.specularColorMap=It(M,Is)),e.transparent=e.opacity<1||e.transmission>0||e.blending!==Zm||!!((l||e.alphaMap)&&e.alphaTest<=0),e.transparent||(e.depthWrite=!0)}function yi(e){e.updateMatrixWorld(!0),e.traverse(t=>{let n=t;n.isSkinnedMesh&&(n.skeleton?.update(),n.computeBoundingBox?.(),n.computeBoundingSphere?.())})}import{Matrix4 as Vy}from"three";function Uy(e){return e.isSkinnedMesh===!0}function xa(e){let t=[];return e.traverse(n=>{Uy(n)&&t.push(n)}),t}var wi="reactImmersiveSkinFreeze";function eb(e){return!!e.userData[wi]}function Fs(e,t){let n=e.userData,a=new Vy().copy(t).invert(),r=n[wi];if(r){r.frozenInverse.copy(a),e.bindMatrixInverse.copy(a);return}let o={frozenInverse:a,previousOnBeforeRender:e.onBeforeRender};e.bindMatrixInverse.copy(a),e.onBeforeRender=function(s,l,i,c,d,u){o.previousOnBeforeRender.call(this,s,l,i,c,d,u),e.bindMatrixInverse.copy(o.frozenInverse)},n[wi]=o}function va(e){let t=e.userData,n=t[wi];n&&(e.onBeforeRender=n.previousOnBeforeRender,delete t[wi],e.updateMatrixWorld(!0))}import{useCallback as tb,useEffect as Hy,useRef as Gy}from"react";import{useThree as Wy}from"@react-three/fiber";function Vs(){let e=Wy(r=>r.gl.domElement),t=Gy(void 0),n=tb(r=>{t.current===void 0&&(t.current=e.style.cursor),e.style.cursor=r},[e]),a=tb(()=>{let r=t.current;r!==void 0&&(e.style.cursor=r,t.current=void 0)},[e]);return Hy(()=>()=>{a()},[a]),{setCanvasCursor:n,restoreCanvasCursor:a}}import{jsx as nb}from"react/jsx-runtime";function Gs(e,t,n){let a=n.get(e);a&&(t?.position?e.position.fromArray(t.position):e.position.copy(a.position),t?.rotation?e.rotation.set(t.rotation[0],t.rotation[1],t.rotation[2],a.rotation.order):e.rotation.copy(a.rotation),t?.scale?e.scale.fromArray(t.scale):e.scale.copy(a.scale),e.updateMatrix())}function ow(e){return e.material}function Ws(e,t){return Array.isArray(e)?e.map(t):t(e,0)}function ya(e,t){Array.isArray(e)?e.forEach(t):t(e,0)}function Qc(e,t){return Array.isArray(e)?e[t]:e}function Gt(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 wa(e){let t=e,n=Number(t.clearcoat)>0,a=Number(t.sheen)>0,r=Number(t.anisotropy)>0,o=Number(t.transmission)>0,s=t.transparent===!1&&t.blending===Zy&&t.alphaToCoverage!==!0;return[Gt(t.map),Gt(t.aoMap),Gt(t.lightMap),Gt(t.bumpMap),Gt(t.normalMap,!0),t.normalMap?t.normalMapType:"",Gt(t.displacementMap),Gt(t.emissiveMap),Gt(t.metalnessMap),Gt(t.roughnessMap),r,Gt(r?t.anisotropyMap:null),n,Gt(n?t.clearcoatMap:null),Gt(n?t.clearcoatNormalMap:null,!0),Gt(n?t.clearcoatRoughnessMap:null),a,Gt(a?t.sheenColorMap:null),Gt(a?t.sheenRoughnessMap:null),Gt(t.specularColorMap),Gt(t.specularIntensityMap),o,Gt(o?t.transmissionMap:null),Gt(o?t.thicknessMap:null),Gt(t.alphaMap),Number(t.alphaTest)>0,!!t.alphaHash,!!t.flatShading,!!t.dithering,t.side,s].join("|")}function ed({url:e,objectBindings:t,selectedItem:n,itemMaterials:a,onItemClick:r,onItemHover:o,onModelLoaded:s,onAnimationsReady:l,nodeRefsOut:i,onNodeRefsChange:c,materialRefsOut:d,panelHoveredItem:u,sceneConfig:b,zoomOnSelected:g=!0,highlightOnHover:h=!0,decoderConfig:w,modelFormat:B,explodeFactor:v=0,suspendBindingTransforms:p=!1}){let m=Ds(e,w,B),S=Xy(L=>L.invalidate),[M,k]=$y(null),R=rn(null),{setCanvasCursor:f,restoreCanvasCursor:C}=Vs();Ft(()=>{h||(k(null),o?.(null),C())},[h,o,C]);let x=mn(()=>rw.clone(m.scene),[m.scene]),P=mn(()=>ha(x),[x]),z=P.nodesById;Ft(()=>{P.duplicateNames.size!==0&&console.warn("[react-immersive] Duplicate model node names were assigned unique binding IDs.",Object.fromEntries(P.duplicateNames))},[P]);let A=mn(()=>{let L=new WeakMap;return x.traverse(_=>{L.set(_,{position:_.position.clone(),rotation:_.rotation.clone(),scale:_.scale.clone()})}),L},[x]);Ft(()=>{let L=!1,_=null,H=null,K=window,Y=Object.entries(z).filter(([,qe])=>$r(qe)),ie=new Us,re=[],tt=0;x.traverse(qe=>{$r(qe)&&(qe.castShadow=!1,qe.receiveShadow=!0)});let se=()=>{if(L)return;let qe=new Set,de=ie.getSize(new ko),lt=new ko;for(let{name:Ht,box:st}of re)st.getSize(lt),lt.x>de.x*.7&&lt.z>de.z*.7&&lt.y>de.y*.4&&qe.add(Ht);x.traverse(Ht=>{if(!$r(Ht))return;let st=hi(Ht);Ht.castShadow=!st||!qe.has(st),Ht.receiveShadow=!0}),S()},vt=()=>{L||(K.requestIdleCallback?_=K.requestIdleCallback(De,{timeout:100}):H=window.setTimeout(()=>De(),0))},De=qe=>{if(_=null,H=null,L)return;let de=performance.now(),lt=0;for(;tt<Y.length&&!(lt>0&&!(qe?qe.didTimeout?lt<16:qe.timeRemaining()>1:performance.now()-de<8));){let[Ht,st]=Y[tt];tt+=1,lt+=1;let Ct=new Us().setFromObject(st);Ct.isEmpty()||(re.push({name:Ht,box:Ct}),ie.union(Ct))}tt<Y.length?vt():se()};return vt(),()=>{L=!0,_!==null&&K.cancelIdleCallback?.(_),H!==null&&window.clearTimeout(H)}},[S,z,x]),Ft(()=>{yi(x)},[x]),Ft(()=>{let L=new AbortController;return us(x,L.signal),()=>{L.abort(),ms(x)}},[x]);let j=mn(()=>{let L={};for(let[_,H]of Object.entries(t))L[H.modelObjectId??_]=_;return L},[t]),T=mn(()=>Object.entries(t).map(([L,_])=>`${L}${_.modelObjectId??L}`).sort().join(""),[t]),I=mn(()=>Object.entries(t).map(([L,_])=>JSON.stringify([L,_.modelObjectId??L,_.transform??null])).sort().join(""),[t]),F=rn(new Map);Ft(()=>{let L=new Map,_=new Map;for(let[Y,ie]of Object.entries(t)){if(!ie.transform)continue;let re=z[ie.modelObjectId??Y];re&&(L.set(re,ie.transform),_.set(re,xa(re)))}let H=new Set([...F.current.keys(),...L.keys()]);for(let Y of H){Gs(Y,void 0,A);for(let ie of xa(Y))va(ie)}x.updateMatrixWorld(!0);let K=new Map;for(let Y of _.values())for(let ie of Y)K.has(ie)||K.set(ie,ie.matrixWorld.clone());for(let[Y,ie]of L)Gs(Y,ie,A);F.current=L,x.updateMatrixWorld(!0);for(let[Y,ie]of K)Fs(Y,ie);S()},[x,z,A,I,S]),Ft(()=>()=>{for(let L of xa(x))va(L)},[x]);let O=mn(()=>{let L={};for(let[_,H]of Object.entries(t)){let K=H.modelObjectId??_,Y=z[K];if(!$r(Y))continue;let ie=ow(Y);ie&&(L[_]=Ws(ie,re=>{let tt=zs(re),se=Jm(tt??new Ky);return qm(se),se}))}return L},[z,T]);Ft(()=>{d&&(d.current=O)},[O,d]),Ft(()=>()=>{for(let L of Object.values(O))ya(L,_=>_.dispose())},[O]);let E=b?.model.shading??"lit",W=b?.model.renderer??"pbr",U=b?.wireframe.enabled??!1,ae=b?.wireframe.color??"#93c5fd",xe=b?.wireframe.opacity??1,le=mn(()=>{let L={};if(E!=="unlit")return L;for(let[_,H]of Object.entries(O))L[_]=Ws(H,K=>{let Y=new Zc;return Y.color.copy(K.color),Y.map=K.map,Y.alphaMap=K.alphaMap,Y.alphaTest=K.alphaTest,Y.transparent=K.transparent,Y.opacity=K.opacity,Y.side=K.side,Y});return L},[O,E]),ge=mn(()=>{let L={};if(E!=="normals")return L;for(let[_,H]of Object.entries(O))L[_]=Ws(H,()=>new Yy);return L},[O,E]),he=mn(()=>{let L={};if(E!=="lit"||W!=="matcap")return L;let _=am();for(let[H,K]of Object.entries(O))L[H]=Ws(K,Y=>{let ie=new Jy;return ie.matcap=_,ie.color.copy(Y.color),ie.alphaMap=Y.alphaMap,ie.alphaTest=Y.alphaTest,ie.side=Y.side,ie});return L},[O,E,W]);Ft(()=>()=>{for(let L of Object.values(le))ya(L,_=>_.dispose());for(let L of Object.values(ge))ya(L,_=>_.dispose());for(let L of Object.values(he))ya(L,_=>_.dispose())},[le,ge,he]);let Se=L=>E==="normals"?ge[L]:E==="unlit"?le[L]:W==="matcap"?he[L]:O[L],at=rn(s);at.current=s,Ft(()=>{at.current?.(x)},[x]);let wt=mn(()=>{let L={};for(let[_,H]of Object.entries(t)){let K=H.modelObjectId??_,Y=z[K];Y&&(L[_]=Y)}return L},[z,T]);Ft(()=>(i.current=wt,c?.(),()=>{i.current===wt&&(i.current={})}),[wt,i,c]);let Xe=rn({});Ft(()=>()=>{for(let L of Object.values(Xe.current))for(let[_,H]of Object.entries(L))H&&ws(H,Ns(_));Xe.current={}},[]);let Me=mn(()=>{let L=new Map;for(let[_,H]of Object.entries(t)){let K=u===H||u?.id===H.id||u?.modelObjectId===H.modelObjectId,Y=h&&(M===_||K),ie=Y||n===_;(Y||ie)&&L.set(_,{emissive:Y,matcap:ie})}return L},[t,h,M,n,u]),Te=rn(Me);Te.current=Me,Ft(()=>{let L=new Set;for(let[_,H]of Object.entries(t)){L.add(_);let K=H.modelObjectId??_,Y=z[K];if(!$r(Y))continue;Y.visible=H.visible!==!1;let ie=O[_];if(!ie)continue;if(W!=="uv-checker"){let de=Se(_);de&&(Y.material=de)}if(H.visible===!1)continue;let re=le[_],tt=he[_],se=a[_]??a[H.modelObjectId??_],vt=H.style?.material,De=Xe.current[_]??{};for(let de of $m){let lt=Lt(vt,de),Ht=De[de];if(Ht===lt)continue;let st=Ns(de);Ht&&ws(Ht,st),lt?(om(lt,st,S),De[de]=lt):delete De[de]}Object.keys(De).length>0?Xe.current[_]=De:delete Xe.current[_];let qe=se?.hex??vt?.baseColor;ya(ie,(de,lt)=>{let Ht=wa(de);Qm(de,vt,qe);let st=de.userData.reactImmersiveConfiguredEmissive;st?.isColor?st.copy(de.emissive):de.userData.reactImmersiveConfiguredEmissive=de.emissive.clone();let Ct=Te.current.get(_);Ct?.emissive&&de.emissive.add(Rc),Ht!==wa(de)&&(de.needsUpdate=!0);let ct=Qc(re,lt);if(ct){let Vr=wa(ct);ct.color.copy(de.color),ct.map=de.map,ct.alphaMap=de.alphaMap,ct.alphaTest=de.alphaTest,ct.transparent=de.transparent,ct.opacity=de.opacity,ct.side=de.side,Vr!==wa(ct)&&(ct.needsUpdate=!0)}let Ce=Qc(tt,lt);if(Ce){let Vr=wa(Ce);Ct?.matcap?Ce.color.set(Wr.color):Ce.color.copy(de.color),Ce.map=de.map,Ce.alphaMap=de.alphaMap,Ce.alphaTest=de.alphaTest,Ce.transparent=de.transparent,Ce.opacity=de.opacity,Ce.side=de.side,Vr!==wa(Ce)&&(Ce.needsUpdate=!0)}})}for(let _ of Object.keys(Xe.current))if(!L.has(_)){for(let[H,K]of Object.entries(Xe.current[_]))K&&ws(K,Ns(H));delete Xe.current[_]}S()},[t,z,O,le,ge,he,a,E,W,S]);let At=rn(new Map);Ft(()=>{let L=At.current,_=new Set([...L.keys(),...Me.keys()]),H=!1;for(let K of _){let Y=L.get(K),ie=Me.get(K),re=!!Y?.emissive!=!!ie?.emissive,tt=!!Y?.matcap!=!!ie?.matcap;if(!re&&!tt)continue;H=!0;let se=O[K],vt=he[K];se&&ya(se,(De,qe)=>{let de=De.userData.reactImmersiveConfiguredEmissive;re&&de?.isColor&&(De.emissive.copy(de),ie?.emissive&&De.emissive.add(Rc));let lt=Qc(vt,qe);tt&&lt&&(ie?.matcap?lt.color.set(Wr.color):lt.color.copy(De.color))})}At.current=Me,H&&S()},[Me,O,he,S]),Ft(()=>{if(W!=="uv-checker")return;let L=im(),_=[];return x.traverse(H=>{if(!$r(H))return;let K=H.material,Y=Array.isArray(K)?K:[K],ie=!!H.geometry.getAttribute("uv"),re=Y.map((se,vt)=>{let De=new Zc({color:ie?"#ffffff":"#ff00ff",map:ie?L:null,side:se.side});return De.name=`${H.name||"mesh"}-uv-checker-${vt}`,De.toneMapped=!1,De}),tt=Array.isArray(K)?re:re[0];H.material=tt,_.push({node:H,original:K,diagnostic:tt})}),S(),()=>{for(let{node:H,original:K,diagnostic:Y}of _){H.material=K;let ie=Array.isArray(Y)?Y:[Y];for(let re of ie)re.dispose()}S()}},[x,W,S]),Ft(()=>{if(!U)return;let L=[];for(let[_,H]of Object.entries(t)){let K=H.modelObjectId??_,Y=z[K];if(!$r(Y))continue;let ie=new Zc({color:ae,wireframe:!0,transparent:!0,opacity:xe,depthTest:!1,depthWrite:!1,side:qy,toneMapped:!1}),re=Y.clone(!1);re.name="",re.position.set(0,0,0),re.quaternion.identity(),re.scale.set(1,1,1),re.matrix.identity(),re.matrixAutoUpdate=!0,re.material=ie,re.castShadow=!1,re.receiveShadow=!1,re.frustumCulled=!1,re.renderOrder=1,re.userData={isWireframeOverlay:!0},re.raycast=()=>{},Y.morphTargetInfluences&&(re.morphTargetInfluences=Y.morphTargetInfluences),Y.add(re),L.push({node:Y,overlay:re})}return S(),()=>{for(let{node:_,overlay:H}of L)_.remove(H),H.material.dispose()}},[U,ae,xe,z,t,S]);let Ke=mn(()=>Um(m.animations),[m.animations]),nn=rn(l);nn.current=l;let Ye=rn(b);Ye.current=b;let qt=rn(null),Bt=rn({}),Be=rn(null),nt=rn(null),ee=rn(1),oe=rn(new Set),Ot=rn(0),it=()=>({currentClip:nt.current,isPlaying:Be.current?.paused===!1,speed:ee.current,time:Be.current?.time??0,duration:Be.current?.getClip().duration??0}),Ge=()=>{let L=it();oe.current.forEach(_=>_(L))},Je=(L,_)=>{let H=Ym(_);L.setLoop(H==="once"?ew:tw,H==="once"?1:1/0),L.clampWhenFinished=H==="once";let K=Kc(_?.speed??ee.current);ee.current=K,L.setEffectiveTimeScale(K)},Et=()=>{Be.current?.stop(),Be.current=null,nt.current=null,Ge(),S()},Ut=()=>{Be.current&&(Be.current.paused=!0,Ge(),S())},Dt=L=>{let _=Kc(L);ee.current=_,Be.current?.setEffectiveTimeScale(_),Ge()},Sn=L=>{let _=Be.current;if(!_)return;let H=_.getClip().duration;_.time=Math.min(Math.max(L,0),H),qt.current?.update(0),Ge(),S()},pn=L=>{let _=Bt.current[L];if(!_)return;let H=_s(Ye.current,L);if(!H?.hidden){if(Be.current===_&&_.paused){Je(_,H),_.paused=!1,nt.current=L,Ge(),S();return}Be.current&&Be.current!==_&&Be.current.stop(),Je(_,H),_.paused=!1,_.enabled=!0,_.reset().play(),Be.current=_,nt.current=L,Ge(),S()}};Ft(()=>{let L=new Qy(x);qt.current=L;let _={};for(let{clip:re,sourceName:tt}of Ke)_[tt]=L.clipAction(re);Bt.current=_;let H=re=>{re.action&&re.action===Be.current&&Et()};L.addEventListener("finished",H);let K=()=>{};nn.current?.({clips:Ke.map(({sourceName:re})=>re),clipDetails:Ke.map(({sourceName:re,duration:tt})=>({sourceName:re,duration:tt})),play:Ke.length?pn:K,pause:Ke.length?Ut:K,stop:Ke.length?Et:K,setSpeed:Ke.length?Dt:K,seek:Ke.length?Sn:K,getState:it,subscribe:re=>(oe.current.add(re),re(it()),()=>{oe.current.delete(re)})}),ee.current=1,Ge();let Y=Ye.current?.animations.autoplayClip,ie=Y?_s(Ye.current,Y):void 0;return Y&&!ie?.hidden&&pn(Y),()=>{L.removeEventListener("finished",H),L.stopAllAction(),L.uncacheRoot(x),qt.current=null,Bt.current={},Be.current=null,nt.current=null,ee.current=1,Ge()}},[x,Ke]),Ft(()=>{let L=nt.current,_=Be.current;if(!L||!_||!b?.animations)return;let H=_s(b,L);if(H?.hidden){Et();return}H&&(Je(_,H),Ge())},[b?.animations]),qc((L,_)=>{if(qt.current&&Be.current?.paused===!1){if(qt.current.update(_),!p)for(let[H,K]of F.current)Gs(H,K,A);S(),Ot.current+=_,Ot.current>=.066&&(Ot.current=0,Ge(),yi(x))}});let me=mn(()=>(b?.model.rotation??[0,0,0]).map(L=>L*Math.PI/180),[b?.model.rotation]);qc((L,_)=>{if(!R.current)return;let H=R.current.rotation;H.x=Hs.lerp(H.x,me[0],1-Math.exp(-5*_)),H.y=Hs.lerp(H.y,me[1],1-Math.exp(-5*_)),H.z=Hs.lerp(H.z,me[2],1-Math.exp(-5*_)),Math.abs(H.x-me[0])<1e-4&&Math.abs(H.y-me[1])<1e-4&&Math.abs(H.z-me[2])<1e-4||S()});let et=rn([]),Fe=rn(0),Re=rn(0),ht=mn(()=>new ko,[]);Ft(()=>{let L=new Map;for(let[se,vt]of Object.entries(t)){let De=z[vt.modelObjectId??se];De&&L.set(De,vt)}for(let se of et.current)Gs(se.node,L.get(se.node)?.transform,A);Re.current=0,x.updateWorldMatrix(!0,!0);let _=new Us().setFromObject(x),H=_.getCenter(new ko),K=_.getSize(new ko).length()*.5;Fe.current=Number.isFinite(K)?K:0;let Y=[...L.keys()],ie=new Set(Y),re=[],tt=new ko;for(let se of Y){if(!se.parent)continue;let vt=se.parent,De=!1;for(;vt;){if(ie.has(vt)){De=!0;break}vt=vt.parent}if(De)continue;let qe=new Us().setFromObject(se);if(qe.isEmpty())continue;qe.getCenter(tt);let de=tt.clone().sub(H);de.lengthSq()<1e-8||(de.normalize(),re.push({node:se,restLocalPos:se.position.clone(),restWorldPos:se.getWorldPosition(new ko),worldDir:de,parentInverse:new nw().copy(se.parent.matrixWorld).invert()}))}et.current=re,S()},[x,z,T,I,A,S]),Ft(()=>{S()},[v,S]),qc((L,_)=>{let H=et.current;if(H.length===0)return;let K=Math.min(Math.max(v,0),1),Y=Re.current;if(Math.abs(Y-K)<1e-4){if(Y===K)return;Re.current=K}else Re.current=Hs.lerp(Y,K,1-Math.exp(-6*_)),S();let ie=Re.current*Fe.current;for(let re of H)ht.copy(re.worldDir).multiplyScalar(ie).add(re.restWorldPos).applyMatrix4(re.parentInverse),re.node.position.copy(ht)});let rt=L=>{let _=L;for(;_;){let H=hi(_),K=H?j[H]:void 0;if(K&&t[K])return[K,t[K]];_=_.parent}return null},xt=L=>{let _=rt(L.object);if(!_)return;let[,H]=_;H.selectable!==!1&&(L.stopPropagation(),r(H))},Nt=L=>{if(!h)return;let _=rt(L.object);if(!_)return;let[H,K]=_;K.hoverable!==!1&&(L.stopPropagation(),f("pointer"),k(H),o?.(K))},Mn=L=>{h&&(L.stopPropagation(),C(),k(null),o?.(null))},Z=mn(()=>!ps(x),[x]);return nb("group",{ref:R,children:nb("primitive",{object:x,...Z?{onClick:xt,...h?{onPointerOver:Nt,onPointerOut:Mn}:{}}:{}})})}import{useEffect as qw,useMemo as Zw,useRef as Qw}from"react";import{useFrame as e1,useThree as t1}from"@react-three/fiber";function aw(e){try{let t=typeof location<"u"?location.href:void 0;return new URL(e,t).origin}catch{return null}}function rb(e){if(!e)return null;let t=e.length,n=e.indexOf("?"),a=e.indexOf("#");n!==-1&&(t=Math.min(t,n)),a!==-1&&(t=Math.min(t,a));let r=e.lastIndexOf(".",t),o=e.lastIndexOf("/",t),s=e.indexOf("://");return s!==-1&&s+2===o||r===-1||r<o?null:e.substring(r+1,t)||null}var Xs,Ks=(Xs=class{static setXRSession(e){e!==this.session&&(this.flushPending(),this.session=e)}static requestAnimationFrame(e){let{session:t,pending:n}=this,a,r=()=>{n.delete(a),e()};return a=t?t.requestAnimationFrame(r):requestAnimationFrame(r),n.set(a,e),a}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)})}},oc(Xs,"pending",new Map),oc(Xs,"session",null),Xs),ob=2**30,iw=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 a=e(t),r=e(n);return a<r?-1:+(a>r)}):this._unloadPriorityCallback=e}constructor(){this.minSize=6e3,this.maxSize=8e3,this.minBytesSize=.3*ob,this.maxBytesSize=.4*ob,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:a}=this;a.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 a=this.usedSet,r=this.itemList,o=this.callbacks;return r.push(e),a.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,a=this.itemList,r=this.bytesMap,o=this.callbacks,s=this.loadedSet;if(n.has(e)){this.cachedBytes-=r.get(e)||0,r.delete(e),o.get(e)(e);let l=a.indexOf(e);return a.splice(l,1),t.delete(e),n.delete(e),o.delete(e),s.delete(e),!0}return!1}setLoaded(e,t){let{itemSet:n,loadedSet:a}=this;n.has(e)&&(t===!0?a.add(e):a.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:a,itemSet:r,usedSet:o,loadedSet:s,callbacks:l,bytesMap:i,minBytesSize:c,maxBytesSize:d}=this,u=a.length-o.size,b=a.length-s.size,g=Math.max(Math.min(a.length-t,u),0),h=this.cachedBytes-c,w=this.unloadPriorityCallback||this.defaultPriorityCallback,B=!1,v=g>0&&u>0||b&&a.length>n;if(u&&this.cachedBytes>c||b&&this.cachedBytes>d||v){a.sort((f,C)=>{let x=o.has(f);if(x===o.has(C)){let P=s.has(f);return P===s.has(C)?-w(f,C):P?1:-1}else return x?1:-1});let p=Math.max(t*e,g*e),m=Math.ceil(Math.min(p,u,g)),S=Math.max(e*h,e*c),M=Math.min(S,h),k=0,R=0;for(;this.cachedBytes-R>d||a.length-k>n;){let f=a[k],C=i.get(f)||0;if(o.has(f)&&s.has(f)||this.cachedBytes-R-C<d&&a.length-k<=n)break;R+=C,k++}for(;R<M||k<m;){let f=a[k],C=i.get(f)||0;if(o.has(f)||this.cachedBytes-R-C<c&&k>=m)break;R+=C,k++}a.splice(0,k).forEach(f=>{this.cachedBytes-=i.get(f)||0,l.get(f)(f),i.delete(f),r.delete(f),l.delete(f),s.delete(f),o.delete(f)}),B=k<g||R<h&&k<u,B&&(B=k>0)}B&&(this.unloadingHandle=Ks.requestAnimationFrame(()=>this.scheduleUnload()))}scheduleUnload(){Ks.cancelAnimationFrame(this.unloadingHandle),this.scheduled||(this.scheduled=!0,queueMicrotask(()=>{this.scheduled=!1,this.unloadUnusedContent()}))}},sw=class extends DOMException{constructor(){super("PriorityQueue: Item removed","AbortError")}},Js=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=>{Ks.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((a,r)=>{let o=this.items,s=this.callbacks;n.resolve=a,n.reject=r,o.unshift(e),s.set(e,n),this.autoUpdate&&this.scheduleJobRun()}),n.promise}remove(e){let t=this.items,n=this.callbacks,a=t.indexOf(e);if(a!==-1){let r=n.get(e);r.promise.catch(o=>{if(o.name!=="AbortError")throw o}),r.reject(new sw),t.splice(a,1),n.delete(e)}}removeByFilter(e){let{items:t}=this;for(let n=0;n<t.length;n++){let a=t[n];e(a)&&(this.remove(a),n--)}}tryRunJobs(){this.sort();let e=this.items,t=this.callbacks,n=this.maxJobs,a=0,r=()=>{this.currJobs--,this.autoUpdate&&this.scheduleJobRun()};for(;n>this.currJobs&&e.length>0&&a<n;){this.currJobs++,a++;let o=e.pop(),{callback:s,resolve:l,reject:i}=t.get(o);t.delete(o);let c;try{c=s(o)}catch(d){i(d),r();continue}c instanceof Promise?c.then(l).catch(i).finally(r):(l(c),r())}}flush(e){let{items:t,callbacks:n}=this,a=t.indexOf(e);if(!n.has(e))return;let{callback:r,resolve:o,reject:s}=n.get(e);n.delete(e),t.splice(a,1);let l;try{l=r(e)}catch(i){s(i);return}return l instanceof Promise?l.then(o).catch(s):o(l),l}scheduleJobRun(){this.scheduled||(this.scheduled=(this._schedulingCallback(this._runjobs),!0))}},lw=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,a=null){this.originQueues.forEach((i,c)=>{i.running||this.originQueues.delete(c)});let r=e===null?null:aw(e),o=this.originQueues.get(r);o||(o=new Js,o.maxJobs=this._maxJobsPerOrigin,o.priorityCallback=this._priorityCallback,this.originQueues.set(r,o));let s=this._itemQueues.get(t);if(s&&s!==o&&s.has(t))throw Error("DownloadPriorityQueue: Item is already queued with a different url origin.");this._itemQueues.set(t,o);let l=o.add(t,n);return a!==null&&(a.aborted?this.remove(t):a.addEventListener("abort",()=>this.remove(t),{once:!0})),l}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 ad=6378137,HT=1/298.257223563,sb=6356752314245179e-9,$s={inView:!1,error:1/0,distanceFromCamera:1/0};function qs(e){return e===4||e===-1}function Er(e,t){return Zs(e)&&e.traversal.lastFrameVisited===t&&e.traversal.used}function Zs(e){return!!e.traversal}function Si(e){let{children:t}=e,n=t.length===0||Zs(t[t.length-1]),a=!e.internal.hasUnrenderableContent||qs(e.internal.loadingState);return n&&a}function Po(e){return e.traversal.unconditionallyRefine}function Ci(e,t){if(Zs(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,$s),e.traversal.inFrustum=$s.inView,e.traversal.error=$s.error,e.traversal.distanceFromCamera=$s.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 td(e,t,n=!1){if(Ci(e,t),n?t.markTileUsed(e):Ys(e),Po(e)&&Si(e)){let a=e.children;for(let r=0,o=a.length;r<o;r++)td(a[r],t,n)}}function lb(e,t){if(Ci(e,t),e.traversal.usedLastFrame&&(Ys(e),e.traversal.wasSetActive&&(e.traversal.active=!0),(!e.traversal.active||Po(e))&&Si(e))){let n=e.children;for(let a=0,r=n.length;a<r;a++)lb(n[a],t)}}function Ys(e){e.traversal.used=!0}function cw(e,t){return!(e.traversal.error<=t.errorTarget&&!Po(e)||t.maxDepth>0&&e.internal.depth+1>=t.maxDepth||!Si(e))}function cb(e,t){let{frameCount:n}=t,{children:a}=e;for(let r=0,o=a.length;r<o;r++){let s=a[r];Er(s,n)&&(s.traversal.active&&(s.traversal.kicked=!0,s.traversal.active=!1),cb(s,t))}}function ab(e){return!Po(e)&&(!e.internal.hasContent||qs(e.internal.loadingState))}function db(e,t){if(Ci(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(!cw(e,t)){Ys(e);return}let a=!1,r=!1,o=e.children;for(let s=0,l=o.length;s<l;s++){let i=o[s];db(i,t),a||(a=Er(i,t.frameCount)),r||(r=i.traversal.inFrustum)}if(e.refine==="REPLACE"&&!r&&o.length!==0){e.traversal.inFrustum=!1,t.markTileUsed(e);for(let s=0,l=o.length;s<l;s++)td(o[s],t,!0);return}if(Ys(e),e.refine==="REPLACE"&&a&&(t.loadSiblings||t.loadAncestors))for(let s=0,l=o.length;s<l;s++)td(o[s],t)}function pb(e,t){let n=t.frameCount;if(!Er(e,n))return;let a=e.children,r=!1;for(let s=0,l=a.length;s<l;s++){let i=a[s];r||(r=Er(i,n))}if(!r)e.traversal.isLeaf=!0;else{for(let l=0,i=a.length;l<i;l++)pb(a[l],t);let s=!0;for(let l=0,i=a.length;l<i;l++){let c=a[l];if(Er(c,n)){let d=!Po(c),u=!c.internal.hasContent||qs(c.internal.loadingState);d&&u||c.traversal.allChildrenLoaded||(s=!1)}}e.traversal.allChildrenLoaded=s}let o=!0;for(let s=0,l=a.length;s<l;s++){let i=a[s];Er(i,t.frameCount)&&!i.traversal.allUsedChildrenProcessed&&(o=!1)}e.traversal.allUsedChildrenProcessed=o&&Si(e)}function ub(e,t){if(!Er(e,t.frameCount))return;let n=e.children;if(e.refine==="REPLACE"&&t.loadAncestors&&!e.traversal.allChildrenLoaded&&!Po(e)&&(e.traversal.isLeaf=!0),e.traversal.isLeaf){if(!Po(e)&&(e.traversal.active=!0,Si(e)&&e.internal.hasContent&&!qs(e.internal.loadingState)))for(let r=0,o=n.length;r<o;r++)lb(n[r],t);return}let a=n.length>0;for(let r=0,o=n.length;r<o;r++){let s=n[r];ub(s,t),Er(s,t.frameCount)&&!(s.traversal.active&&ab(s))&&!s.traversal.allChildrenReady&&(a=!1)}e.traversal.allChildrenReady=a,e.refine==="REPLACE"&&!a&&e.traversal.wasSetActive&&ab(e)&&(e.traversal.active=!0,cb(e,t))}function mb(e,t){Ci(e,t);let n=Er(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||Zs(e)&&e.traversal.usedLastFrame){let a=!1,r=!1;n?(a=e.traversal.active,r=t.displayActiveTiles&&e.traversal.active||e.traversal.visible):Ci(e,t),e.internal.hasRenderableContent&&e.internal.loadingState===4?(a&&t.stats.active++,r&&t.stats.visible++,e.traversal.wasSetActive!==a&&t.invokeOnePlugin(s=>s.setTileActive&&s.setTileActive(e,a)),e.traversal.wasSetVisible!==r&&t.invokeOnePlugin(s=>s.setTileVisible&&s.setTileVisible(e,r))):e.internal.hasRenderableContent||(r=e.traversal.isLeaf,e.traversal.wasSetVisible!==r&&t.invokeOnePlugin(s=>s.setEmptyTileVisible&&s.setEmptyTileVisible(e,r))),e.traversal.visible=r,e.traversal.active=a;let o=e.children;for(let s=0,l=o.length;s<l;s++){let i=o[s];mb(i,t)}}}function dw(e,t){db(e,t),pb(e,t),ub(e,t),mb(e,t)}function pw(e){let t=null;return()=>{t===null&&(t=Ks.requestAnimationFrame(()=>{t=null,e()}))}}function uw(e,t=null,n=null){let a=[];for(a.push(e),a.push(null),a.push(0);a.length>0;){let r=a.pop(),o=a.pop(),s=a.pop();if(t&&t(s,o,r)){n&&n(s,o,r);return}let l=s.children;if(l)for(let i=l.length-1;i>=0;i--)a.push(l[i]),a.push(s),a.push(r+1);n&&n(s,o,r)}}var ib=Symbol("PLUGIN_REGISTERED"),Xr={inView:!0,error:0,distance:1/0},mw=(e,t)=>{let n=e.priority||0,a=t.priority||0;return n===a?!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>a?1:-1},bw=(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,gw=(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,id=(e,t)=>{let n=e.priority??1/0,a=t.priority??1/0;if(n!==a)return n>a?1:-1;if(!e.internal||!t.internal)return 0;let r=e.internal.renderer,o=t.internal.renderer,s=!r.loadAncestors,l=!o.loadAncestors;return s&&l?bw(e,t):mw(e,t)},bb=new iw;bb.unloadPriorityCallback=gw;var nd=new lw;nd.maxJobsPerOrigin=25,nd.priorityCallback=id;var rd=new Js;rd.maxJobs=5,rd.priorityCallback=id;var od=new Js;od.maxJobs=25,od.priorityCallback=(e,t)=>{let n=e.parent,a=t.parent;return n===a?0:n?a?id(n,a):-1:1};var gb=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,a=e.inCacheSinceLoad+ +!!t;return a===0?1:1-n/a}get downloadQueue(){return this._downloadQueue}set downloadQueue(e){if(e instanceof Js){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=bb,this.downloadQueue=nd,this.parseQueue=rd,this.processNodeQueue=od,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=pw(()=>{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[ib]===!0)throw Error("TilesRendererBase: A plugin can only be registered to a single tileset");let t=this.plugins,n=e.priority||0,a=t.length;for(let r=0;r<t.length;r++)if((t[r].priority||0)>n){a=r;break}t.splice(a,0,e),e[ib]=!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 a=e(t[n]);if(a)return a}return null}invokeAllPlugins(e){let t=[...this.plugins,this],n=[];for(let a=0;a<t.length;a++){let r=e(t[a]);r&&n.push(r)}return n.length===0?null:Promise.all(n)}traverse(e,t,n=!0){this.root&&uw(this.root,(a,...r)=>(n&&this.ensureChildrenArePreprocessed(a,!0),e?e(a,...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:a,downloadQueue:r,parseQueue:o,processNodeQueue:s}=this;if(this.rootLoadingState===0&&(this.rootLoadingState=2,this.invokeOnePlugin(c=>c.loadRootTileset&&c.loadRootTileset()).then(c=>{let d=this.rootURL;d!==null&&this.invokeAllPlugins(u=>d=u.preprocessURL?u.preprocessURL(d,null):d),this.rootLoadingState=4,this.rootTileset=c,this.dispatchEvent({type:"needs-update"}),this.dispatchEvent({type:"load-tileset",tileset:c,url:d}),this.dispatchEvent({type:"load-root-tileset",tileset:c,url:d})}).catch(c=>{this.rootLoadingState=-1,console.error(c),this.rootTileset=null,this.dispatchEvent({type:"load-error",tile:null,error:c,url:this.rootURL})})),!a)return;let l=null;if(this.invokeAllPlugins(c=>{if(c.doTilesNeedUpdate){let d=c.doTilesNeedUpdate();l=l===null?d:!!(l||d)}}),l===!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(c=>e.markUnused(c)),t.clear(),this.prepareForTraversal(),dw(a,this),this.removeUnusedPendingTiles();let i=this.queuedTiles;i.sort(e.unloadPriorityCallback);for(let c=0,d=i.length;c<d&&!e.isFull();c++)this.requestTileContents(i[c]);i.length=0,e.scheduleUnload(),(r.running||o.running||s.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:a}=this;if(n>0&&Number.isFinite(t.distanceFromCamera)){let l=t.distanceFromCamera*a;t.error-=n*(1-Math.exp(-l*l))}let r=null,o=0,s=1/0;this.invokeAllPlugins(l=>{l!==this&&l.calculateTileViewError&&(Xr.inView=!0,Xr.error=0,Xr.distance=1/0,l.calculateTileViewError(e,Xr)&&(r===null&&(r=!0),r&&(r=Xr.inView),Xr.inView&&(s=Math.min(s,Xr.distance),o=Math.max(o,Xr.error))))}),t.inView&&r!==!1?(t.error=Math.max(t.error,o),t.distanceFromCamera=Math.min(t.distanceFromCamera,s)):r?(t.inView=!0,t.error=o,t.distanceFromCamera=s):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,a=t.length;n<a;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 a=rb(e.content.uri),r=!!(a&&/json$/.test(a));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(a=>{a!==this&&a.preprocessNode&&a.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 a of t)!e.isUsed(a)&&a.internal.loadingState===1&&n.push(a);for(let a=0;a<n.length;a++)e.remove(n[a])}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 a=r=>{for(let o=0,s=r.length;o<s;o++){let l=r[o];l&&!l.traversal&&this.preprocessNode(l,e.internal.basePath,e)}};t?(this.processNodeQueue.remove(e),a(n)):this.processNodeQueue.has(e)||this.processNodeQueue.add(e,r=>{a(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(a=>{n.has(a)&&t.setMemoryUsage(a,this.getBytesUsed(a))}):t.setMemoryUsage(e,this.getBytesUsed(e))}preprocessTileset(e,t,n=null){let[a,r]=e.asset.version.split(".").map(s=>parseInt(s));console.assert(a<=1,"TilesRenderer: asset.version is expected to be a 1.x or a compatible version."),a===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,a=new URL(e.content.uri,e.internal.basePath+"/").toString();this.invokeAllPlugins(b=>a=b.preprocessURL?b.preprocessURL(a,e):a);let r=this.stats,o=this.lruCache,s=this.downloadQueue,l=this.parseQueue,i=this.loadingTiles,c=rb(a),d=new AbortController,u=d.signal;if(o.add(e,b=>{d.abort(),t?b.children.length=0:this.invokeAllPlugins(g=>{g.disposeTile&&g.disposeTile(b)}),r.inCache--,this.cachedSinceLoadComplete.has(e)&&(this.cachedSinceLoadComplete.delete(e),r.inCacheSinceLoad--),b.internal.loadingState===1?r.queued--:b.internal.loadingState===2?r.downloading--:b.internal.loadingState===3?r.parsing--:b.internal.loadingState===4&&r.loaded--,b.internal.loadingState=0,l.remove(b),s.remove(b),i.delete(b)}))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,i.add(e),s.add(a,e,b=>{if(u.aborted)return Promise.resolve();e.internal.loadingState=2,r.downloading++,r.queued--;let g=this.invokeOnePlugin(h=>h.fetchData&&h.fetchData(a,{...this.fetchOptions,signal:u}));return this.dispatchEvent({type:"tile-download-start",tile:e,url:a,get uri(){return console.warn('tile-download-start event: "uri" has been renamed to "url".'),this.url}}),g}).then(b=>{if(!u.aborted){if(!(b instanceof Response))return b;if(b.ok)return c==="json"?b.json():b.arrayBuffer();throw Error(`Failed to load model with error code ${b.status}`)}}).then(b=>{if(!u.aborted)return r.downloading--,r.parsing++,e.internal.loadingState=3,l.add(e,g=>u.aborted?Promise.resolve():c==="json"&&b.root?(this.preprocessTileset(b,a,e),e.children.push(b.root),n=b,t=!0,Promise.resolve()):this.invokeOnePlugin(h=>h.parseTile&&h.parseTile(b,g,c,a,u)))}).then(()=>{if(u.aborted)return;r.parsing--,r.loaded++,e.internal.loadingState=4,i.delete(e),o.setLoaded(e,!0);let b=this.getBytesUsed(e);if(o.getMemoryUsage(e)===0&&b>0&&o.isFull()){o.remove(e);return}o.setMemoryUsage(e,b),this.dispatchEvent({type:"needs-update"}),t&&this.dispatchEvent({type:"load-tileset",tileset:n,url:a}),e.engineData.scene&&this.dispatchEvent({type:"load-model",scene:e.engineData.scene,tile:e,url:a})}).catch(b=>{u.aborted||(b.name==="AbortError"?o.remove(e):(l.remove(e),s.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(b),e.internal.loadingState=-1,i.delete(e),o.setLoaded(e,!0),this.dispatchEvent({type:"load-error",tile:e,error:b,url:a})))})}};function To(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 a=0;a<4;a++)n+=String.fromCharCode(t.getUint8(a));return n}var fw=new TextDecoder;function fb(e){return fw.decode(e)}function Qs(e){return e.replace(/[\\/][^\\/]+$/,"")+"/"}var el=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=Qs(e)),this.parse(t)))}resolveExternalURL(e){return new URL(e,this.workingPath).href}parse(e){throw Error("LoaderBase: Parse not implemented.")}};function hb(e,t,n,a,r,o){let s;switch(a){case"SCALAR":s=1;break;case"VEC2":s=2;break;case"VEC3":s=3;break;case"VEC4":s=4;break;default:throw Error(`FeatureTable : Feature type not provided for "${o}".`)}let l,i=n*s;switch(r){case"BYTE":l=new Int8Array(e,t,i);break;case"UNSIGNED_BYTE":l=new Uint8Array(e,t,i);break;case"SHORT":l=new Int16Array(e,t,i);break;case"UNSIGNED_SHORT":l=new Uint16Array(e,t,i);break;case"INT":l=new Int32Array(e,t,i);break;case"UNSIGNED_INT":l=new Uint32Array(e,t,i);break;case"FLOAT":l=new Float32Array(e,t,i);break;case"DOUBLE":l=new Float64Array(e,t,i);break;default:throw Error(`FeatureTable : Feature component type not provided for "${o}".`)}return l}var tl=class{constructor(e,t,n,a){this.buffer=e,this.binOffset=t+n,this.binLength=a;let r=null;if(n!==0){let o=new Uint8Array(e,t,n);r=JSON.parse(fb(o))}else r={};this.header=r}getKeys(){return Object.keys(this.header).filter(e=>e!=="extensions")}getData(e,t,n=null,a=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:s,binOffset:l,binLength:i}=this,c=o.byteOffset||0,d=o.type||a,u=o.componentType||n;if("type"in o&&a&&o.type!==a)throw Error("FeatureTable: Specified type does not match expected type.");let b=l+c,g=hb(s,b,t,d,u,e);if(b+g.byteLength>l+i)throw Error("FeatureTable: Feature data read outside binary body length.");return g}}getBuffer(e,t){let{buffer:n,binOffset:a}=this;return n.slice(a+e,a+e+t)}},hw=class{constructor(e){this.batchTable=e;let t=e.header.extensions["3DTILES_batch_table_hierarchy"];this.classes=t.classes;for(let a of this.classes){let r=a.instances;for(let o in r)a.instances[o]=this._parseProperty(r[o],a.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 a=this.parentCounts.reduce((r,o)=>r+o,0);this.parentIds=this._parseProperty(t.parentIds,a,"parentIds")}else this.parentIds=null;this.instancesIds=[];let n={};for(let a of this.classIds)n[a]=n[a]??0,this.instancesIds.push(n[a]),n[a]++}_parseProperty(e,t,n){if(Array.isArray(e))return e;{let{buffer:a,binOffset:r}=this.batchTable,o=e.byteOffset,s=e.componentType||"UNSIGNED_SHORT";return hb(a,r+o,t,"SCALAR",s,n)}}getDataFromId(e,t={}){let n=this.parentCounts[e];if(this.parentIds&&n>0){let l=0;for(let i=0;i<e;i++)l+=this.parentCounts[i];for(let i=0;i<n;i++){let c=this.parentIds[l+i];c!==e&&this.getDataFromId(c,t)}}let a=this.classIds[e],r=this.classes[a].instances,o=this.classes[a].name,s=this.instancesIds[e];for(let l in r)t[o]=t[o]||{},t[o][l]=r[l][s];return t}},sd=class extends tl{constructor(e,t,n,a,r){super(e,n,a,r),this.count=t,this.extensions={};let o=this.header.extensions;o&&o["3DTILES_batch_table_hierarchy"]&&(this.extensions["3DTILES_batch_table_hierarchy"]=new hw(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 a=this.extensions[n];a.getDataFromId instanceof Function&&(t[n]=t[n]||{},a.getDataFromId(e,t[n]))}return t}getPropertyArray(e){return super.getData(e,this.count)}},xb=class extends el{parse(e){let t=new DataView(e),n=To(t);console.assert(n==="b3dm");let a=t.getUint32(4,!0);console.assert(a===1);let r=t.getUint32(8,!0);console.assert(r===e.byteLength);let o=t.getUint32(12,!0),s=t.getUint32(16,!0),l=t.getUint32(20,!0),i=t.getUint32(24,!0),c=new tl(e.slice(28,28+o+s),0,o,s),d=28+o+s,u=new sd(e.slice(d,d+l+i),c.getData("BATCH_LENGTH"),0,l,i),b=d+l+i;return{version:a,featureTable:c,batchTable:u,glbBytes:new Uint8Array(e,b,r-b)}}},vb=class extends el{parse(e){let t=new DataView(e),n=To(t);console.assert(n==="i3dm");let a=t.getUint32(4,!0);console.assert(a===1);let r=t.getUint32(8,!0);console.assert(r===e.byteLength);let o=t.getUint32(12,!0),s=t.getUint32(16,!0),l=t.getUint32(20,!0),i=t.getUint32(24,!0),c=t.getUint32(28,!0),d=new tl(e.slice(32,32+o+s),0,o,s),u=32+o+s,b=new sd(e.slice(u,u+l+i),d.getData("INSTANCES_LENGTH"),0,l,i),g=u+l+i,h=new Uint8Array(e,g,r-g),w=null,B=null,v=null;if(c)w=h,B=Promise.resolve();else{let p=this.resolveExternalURL(fb(h));v=Qs(p),B=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=>{w=new Uint8Array(m)})}return B.then(()=>({version:a,featureTable:d,batchTable:b,glbBytes:w,gltfWorkingPath:v}))}},yb=class extends el{parse(e){let t=new DataView(e),n=To(t);console.assert(n==="pnts");let a=t.getUint32(4,!0);console.assert(a===1);let r=t.getUint32(8,!0);console.assert(r===e.byteLength);let o=t.getUint32(12,!0),s=t.getUint32(16,!0),l=t.getUint32(20,!0),i=t.getUint32(24,!0),c=new tl(e.slice(28,28+o+s),0,o,s),d=28+o+s,u=new sd(e.slice(d,d+l+i),c.getData("BATCH_LENGTH")||c.getData("POINTS_LENGTH"),0,l,i);return Promise.resolve({version:a,featureTable:c,batchTable:u})}},wb=class extends el{parse(e){let t=new DataView(e),n=To(t);console.assert(n==="cmpt",'CMPTLoader: The magic bytes equal "cmpt".');let a=t.getUint32(4,!0);console.assert(a===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),s=[],l=16;for(let i=0;i<o;i++){let c=new DataView(e,l,12),d=To(c),u=c.getUint32(4,!0),b=c.getUint32(8,!0),g=new Uint8Array(e,l,b);s.push({type:d,buffer:g,version:u}),l+=b}return{version:a,tiles:s}}};import{Box3 as zb,BufferAttribute as Ro,BufferGeometry as xw,Clock as cR,Color as vw,DefaultLoadingManager as pl,Euler as yw,EventDispatcher as nl,Frustum as ww,Group as hd,InstancedMesh as Cw,LoadingManager as Sw,MathUtils as jb,Matrix3 as Mw,Matrix4 as on,Mesh as dR,OrthographicCamera as pR,PerspectiveCamera as uR,Plane as kw,PlaneGeometry as mR,Points as Pw,PointsMaterial as Tw,Quaternion as Ib,Ray as xd,Raycaster as bR,ShaderMaterial as gR,Sphere as Fb,Spherical as Rw,TextureUtils as Aw,Vector2 as vd,Vector3 as Pe}from"three";import{GLTFLoader as yd}from"three/addons/loaders/GLTFLoader.js";import{estimateBytesUsed as Bw}from"three/addons/utils/BufferGeometryUtils.js";var wd=class extends xb{constructor(e=pl){super(),this.manager=e,this.adjustmentTransform=new on}parse(e){let t=super.parse(e),n=t.glbBytes.slice().buffer;return new Promise((a,r)=>{let o=this.manager,s=this.fetchOptions,l=o.getHandler("path.gltf")||new yd(o);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 i=this.workingPath;!/[\\/]$/.test(i)&&i.length&&(i+="/");let c=this.adjustmentTransform;l.parse(n,i,d=>{let{batchTable:u,featureTable:b}=t,{scene:g}=d,h=b.getData("RTC_CENTER",1,"FLOAT","VEC3");h&&(g.position.x+=h[0],g.position.y+=h[1],g.position.z+=h[2]),d.scene.updateMatrix(),d.scene.matrix.multiply(c),d.scene.matrix.decompose(d.scene.position,d.scene.quaternion,d.scene.scale),d.batchTable=u,d.featureTable=b,g.batchTable=u,g.featureTable=b,a(d)},r)})}};function Ow(e){let t=e>>11,n=e>>5&63,a=e&31;return[Math.round(t/31*255),Math.round(n/63*255),Math.round(a/31*255)]}var Mi=new vd;function Ew(e,t,n=new Pe){Mi.set(e,t).divideScalar(256).multiplyScalar(2).subScalar(1),n.set(Mi.x,Mi.y,1-Math.abs(Mi.x)-Math.abs(Mi.y));let a=jb.clamp(-n.z,0,1);return n.x>=0?n.setX(n.x-a):n.setX(n.x+a),n.y>=0?n.setY(n.y-a):n.setY(n.y+a),n.normalize(),n}var Cb={RGB:"color",POSITION:"position"},Cd=class extends yb{constructor(e=pl){super(),this.manager=e}parse(e){return super.parse(e).then(async t=>{let{featureTable:n,batchTable:a}=t,r=new Tw,o=n.header.extensions,s=new Pe,l;if(o&&o["3DTILES_draco_point_compression"]){let{byteOffset:d,byteLength:u,properties:b}=o["3DTILES_draco_point_compression"],g=this.manager.getHandler("draco.drc");if(g==null)throw Error("PNTSLoader: dracoLoader not available.");let h={};for(let v in b)if(v in Cb&&v in b){let p=Cb[v];h[p]=b[v]}let w={attributeIDs:h,attributeTypes:{position:"Float32Array",color:"Uint8Array"},useUniqueIDs:!0},B=n.getBuffer(d,u);l=await g.decodeGeometry(B,w),l.attributes.color&&(r.vertexColors=!0)}else{let d=n.getData("POINTS_LENGTH"),u=n.getData("POSITION",d,"FLOAT","VEC3"),b=n.getData("NORMAL",d,"FLOAT","VEC3"),g=n.getData("NORMAL",d,"UNSIGNED_BYTE","VEC2"),h=n.getData("RGB",d,"UNSIGNED_BYTE","VEC3"),w=n.getData("RGBA",d,"UNSIGNED_BYTE","VEC4"),B=n.getData("RGB565",d,"UNSIGNED_SHORT","SCALAR"),v=n.getData("CONSTANT_RGBA",d,"UNSIGNED_BYTE","VEC4"),p=n.getData("POSITION_QUANTIZED",d,"UNSIGNED_SHORT","VEC3"),m=n.getData("QUANTIZED_VOLUME_SCALE",d,"FLOAT","VEC3"),S=n.getData("QUANTIZED_VOLUME_OFFSET",d,"FLOAT","VEC3");if(l=new xw,p){let M=new Float32Array(d*3);for(let k=0;k<d;k++)for(let R=0;R<3;R++){let f=3*k+R;M[f]=p[f]/65535*m[R]}s.x=S[0],s.y=S[1],s.z=S[2],l.setAttribute("position",new Ro(M,3,!1))}else l.setAttribute("position",new Ro(u,3,!1));if(b!==null)l.setAttribute("normal",new Ro(b,3,!1));else if(g!==null){let M=new Float32Array(d*3),k=new Pe;for(let R=0;R<d;R++){let f=g[R*2],C=g[R*2+1],x=Ew(f,C,k);M[R*3]=x.x,M[R*3+1]=x.y,M[R*3+2]=x.z}l.setAttribute("normal",new Ro(M,3,!1))}if(w!==null)l.setAttribute("color",new Ro(w,4,!0)),r.vertexColors=!0,r.transparent=!0,r.depthWrite=!1;else if(h!==null)l.setAttribute("color",new Ro(h,3,!0)),r.vertexColors=!0;else if(B!==null){let M=new Uint8Array(d*3);for(let k=0;k<d;k++){let R=Ow(B[k]);for(let f=0;f<3;f++){let C=3*k+f;M[C]=R[f]}}l.setAttribute("color",new Ro(M,3,!0)),r.vertexColors=!0}else if(v!==null){r.color=new vw(v[0],v[1],v[2]);let M=v[3]/255;M<1&&(r.opacity=M,r.transparent=!0,r.depthWrite=!1)}}let i=new Pw(l,r);i.position.copy(s),t.scene=i,t.scene.featureTable=n,t.scene.batchTable=a;let c=n.getData("RTC_CENTER",1,"FLOAT","VEC3");return c&&(t.scene.position.x+=c[0],t.scene.position.y+=c[1],t.scene.position.z+=c[2]),t})}};function Lw(e){let{x:t,y:n,z:a}=e;e.x=a,e.y=t,e.z=n}function Dw(e){return-e+Math.PI/2}var Sb=new Rw,Kr=new Pe,hn=new Pe,ld=new Pe,Kn=new on,hr=new on,cd=new Fb,Bn=new yw,Mb=new Pe,kb=new Pe,Pb=new Pe,ki=new Pe,rl=new xd,Nw=1e-12,_w=.1;var Sd=class{constructor(e=1,t=1,n=1){this.name="",this.radius=new Pe(e,t,n)}intersectRay(e,t){return Kn.makeScale(...this.radius).invert(),cd.center.set(0,0,0),cd.radius=1,rl.copy(e).applyMatrix4(Kn),rl.intersectSphere(cd,t)?(Kn.makeScale(...this.radius),t.applyMatrix4(Kn),t):null}getEastNorthUpFrame(e,t,n,a){return n.isMatrix4&&(a=n,n=0,console.warn('Ellipsoid: The signature for "getEastNorthUpFrame" has changed.')),this.getEastNorthUpAxes(e,t,Mb,kb,Pb),this.getCartographicToPosition(e,t,n,ki),a.makeBasis(Mb,kb,Pb).setPosition(ki)}getOrientedEastNorthUpFrame(e,t,n,a,r,o,s){return this.getObjectFrame(e,t,n,a,r,o,s,0)}getObjectFrame(e,t,n,a,r,o,s,l=2){return this.getEastNorthUpFrame(e,t,n,Kn),Bn.set(r,o,-a,"ZXY"),s.makeRotationFromEuler(Bn).premultiply(Kn),l===1?(Bn.set(Math.PI/2,0,0,"XYZ"),hr.makeRotationFromEuler(Bn),s.multiply(hr)):l===2&&(Bn.set(-Math.PI/2,0,Math.PI,"XYZ"),hr.makeRotationFromEuler(Bn),s.multiply(hr)),s}getCartographicFromObjectFrame(e,t,n=2){return n===1?(Bn.set(-Math.PI/2,0,0,"XYZ"),hr.makeRotationFromEuler(Bn).premultiply(e)):n===2?(Bn.set(-Math.PI/2,0,Math.PI,"XYZ"),hr.makeRotationFromEuler(Bn).premultiply(e)):hr.copy(e),ki.setFromMatrixPosition(hr),this.getPositionToCartographic(ki,t),this.getEastNorthUpFrame(t.lat,t.lon,0,Kn).invert(),hr.premultiply(Kn),Bn.setFromRotationMatrix(hr,"ZXY"),t.azimuth=-Bn.z,t.elevation=Bn.x,t.roll=Bn.y,t}getEastNorthUpAxes(e,t,n,a,r,o=ki){this.getCartographicToPosition(e,t,0,o),this.getCartographicToNormal(e,t,r),n.set(-o.y,o.x,0).normalize(),a.crossVectors(r,n).normalize()}getCartographicToPosition(e,t,n,a){this.getCartographicToNormal(e,t,Kr);let r=this.radius;hn.copy(Kr),hn.x*=r.x**2,hn.y*=r.y**2,hn.z*=r.z**2;let o=Math.sqrt(Kr.dot(hn));return hn.divideScalar(o),a.copy(hn).addScaledVector(Kr,n)}getPositionToCartographic(e,t){this.getPositionToSurfacePoint(e,hn),this.getPositionToNormal(hn,Kr);let n=ld.subVectors(e,hn);return t.lon=Math.atan2(Kr.y,Kr.x),t.lat=Math.asin(Kr.z),t.height=Math.sign(n.dot(e))*n.length(),t}getCartographicToNormal(e,t,n){return Sb.set(1,Dw(e),t),n.setFromSpherical(Sb).normalize(),Lw(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,a=1/n.x**2,r=1/n.y**2,o=1/n.z**2,s=e.x*e.x*a,l=e.y*e.y*r,i=e.z*e.z*o,c=s+l+i,d=Math.sqrt(1/c),u=hn.copy(e).multiplyScalar(d);if(c<_w)return isFinite(d)?t.copy(u):null;let b=ld.set(u.x*a*2,u.y*r*2,u.z*o*2),g=(1-d)*e.length()/(.5*b.length()),h=0,w,B,v,p,m,S,M,k,R,f,C;do{g-=h,v=1/(1+g*a),p=1/(1+g*r),m=1/(1+g*o),S=v*v,M=p*p,k=m*m,R=S*v,f=M*p,C=k*m,w=s*S+l*M+i*k-1,B=s*R*a+l*f*r+i*C*o;let x=-2*B;h=w/x}while(Math.abs(w)>Nw);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,a=e*jb.DEG2RAD,r=Math.sin(a)**2;return t/Math.sqrt(1-n*r)}getPositionElevation(e){this.getPositionToSurfacePoint(e,hn);let t=ld.subVectors(e,hn);return Math.sign(t.dot(e))*t.length()}closestPointToRayEstimate(e,t){return this.intersectRay(e,t)?t:(Kn.makeScale(...this.radius).invert(),rl.copy(e).applyMatrix4(Kn),hn.set(0,0,0),rl.closestPointToPoint(hn,t).normalize(),Kn.makeScale(...this.radius),t.applyMatrix4(Kn))}copy(e){return this.radius.copy(e.radius),this}clone(){return new this.constructor().copy(this)}},Bi=new Sd(ad,ad,sb);Bi.name="WGS84 Earth";var ol=new Pe,Ca=new Pe,Sa=new Pe,dd=new Pe,al=new Ib,il=new Pe,Ma=new on,Tb=new on,Rb=new Pe,Ab=new on,pd=new Ib,ud={};function Bb(e,t,n,a){if(e=e/n*2-1,t=t/n*2-1,a.x=e,a.y=t,a.z=1-Math.abs(e)-Math.abs(t),a.z<0){let r=a.x;a.x=(1-Math.abs(a.y))*(r>=0?1:-1),a.y=(1-Math.abs(r))*(a.y>=0?1:-1)}return a.normalize(),a}var Md=class extends vb{constructor(e=pl){super(),this.manager=e,this.adjustmentTransform=new on,this.ellipsoid=Bi.clone()}resolveExternalURL(e){return this.manager.resolveURL(super.resolveExternalURL(e))}parse(e){return super.parse(e).then(t=>{let{featureTable:n,batchTable:a}=t,r=t.glbBytes.slice().buffer;return new Promise((o,s)=>{let l=this.fetchOptions,i=this.manager,c=i.getHandler("path.gltf")||new yd(i);l.credentials==="include"&&l.mode==="cors"&&c.setCrossOrigin("use-credentials"),"credentials"in l&&c.setWithCredentials(l.credentials==="include"),l.headers&&c.setRequestHeader(l.headers);let d=t.gltfWorkingPath??this.workingPath;/[\\/]$/.test(d)||(d+="/");let u=this.adjustmentTransform;c.parse(r,d,b=>{let g=n.getData("INSTANCES_LENGTH"),h=n.getData("POSITION",g,"FLOAT","VEC3"),w=n.getData("POSITION_QUANTIZED",g,"UNSIGNED_SHORT","VEC3"),B=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"),S=n.getData("NORMAL_UP_OCT32P",g,"UNSIGNED_SHORT","VEC2"),M=n.getData("NORMAL_RIGHT_OCT32P",g,"UNSIGNED_SHORT","VEC2"),k=n.getData("SCALE_NON_UNIFORM",g,"FLOAT","VEC3"),R=n.getData("SCALE",g,"FLOAT","SCALAR"),f=n.getData("RTC_CENTER",1,"FLOAT","VEC3"),C=n.getData("EAST_NORTH_UP");if(!h&&w){h=new Float32Array(g*3);for(let A=0;A<g;A++)h[A*3+0]=B[0]+w[A*3+0]/65535*v[0],h[A*3+1]=B[1]+w[A*3+1]/65535*v[1],h[A*3+2]=B[2]+w[A*3+2]/65535*v[2]}let x=new Pe;for(let A=0;A<g;A++)x.x+=h[A*3+0]/g,x.y+=h[A*3+1]/g,x.z+=h[A*3+2]/g;let P=[],z=[];b.scene.updateMatrixWorld(),b.scene.traverse(A=>{if(A.isMesh){z.push(A);let{geometry:j,material:T}=A,I=new Cw(j,T,g);I.position.copy(x),f&&(I.position.x+=f[0],I.position.y+=f[1],I.position.z+=f[2]),P.push(I)}});for(let A=0;A<g;A++){dd.set(h[A*3+0]-x.x,h[A*3+1]-x.y,h[A*3+2]-x.z),al.identity(),p&&m?(Ca.set(p[A*3+0],p[A*3+1],p[A*3+2]),Sa.set(m[A*3+0],m[A*3+1],m[A*3+2]),ol.crossVectors(Sa,Ca).normalize(),Ma.makeBasis(Sa,Ca,ol),al.setFromRotationMatrix(Ma)):S&&M&&(Bb(S[A*2+0],S[A*2+1],65535,Ca),Bb(M[A*2+0],M[A*2+1],65535,Sa),ol.crossVectors(Sa,Ca).normalize(),Ma.makeBasis(Sa,Ca,ol),al.setFromRotationMatrix(Ma)),il.set(1,1,1),k&&il.set(k[A*3+0],k[A*3+1],k[A*3+2]),R&&il.multiplyScalar(R[A]);for(let j=0,T=P.length;j<T;j++){let I=P[j];pd.copy(al),C&&(I.updateMatrixWorld(),Rb.copy(dd).applyMatrix4(I.matrixWorld),this.ellipsoid.getPositionToCartographic(Rb,ud),this.ellipsoid.getEastNorthUpFrame(ud.lat,ud.lon,Ab),pd.setFromRotationMatrix(Ab)),Ma.compose(dd,pd,il).multiply(u);let F=z[j];Tb.multiplyMatrices(Ma,F.matrixWorld),I.setMatrixAt(A,Tb)}}b.scene.clear(),b.scene.add(...P),b.batchTable=a,b.featureTable=n,b.scene.batchTable=a,b.scene.featureTable=n,o(b)},s)})})}},Vb=class extends wb{constructor(e=pl){super(),this.manager=e,this.adjustmentTransform=new on,this.ellipsoid=Bi.clone()}parse(e){let t=super.parse(e),{manager:n,ellipsoid:a,adjustmentTransform:r}=this,o=[];for(let s in t.tiles){let{type:l,buffer:i}=t.tiles[s];switch(l){case"b3dm":{let c=i.slice(),d=new wd(n);d.workingPath=this.workingPath,d.fetchOptions=this.fetchOptions,d.adjustmentTransform.copy(r);let u=d.parse(c.buffer);o.push(u);break}case"pnts":{let c=i.slice(),d=new Cd(n);d.workingPath=this.workingPath,d.fetchOptions=this.fetchOptions;let u=d.parse(c.buffer);o.push(u);break}case"i3dm":{let c=i.slice(),d=new Md(n);d.workingPath=this.workingPath,d.fetchOptions=this.fetchOptions,d.ellipsoid.copy(a),d.adjustmentTransform.copy(r);let u=d.parse(c.buffer);o.push(u);break}}}return Promise.all(o).then(s=>{let l=new hd;return s.forEach(i=>{l.add(i.scene)}),{tiles:s,scene:l}})}},Pi=new on,zw=class extends hd{constructor(e){super(),this.isTilesGroup=!0,this.name="TilesRenderer.TilesGroup",this.tilesRenderer=e,this.matrixWorldInverse=new on}raycast(e,t){return this.tilesRenderer.raycast(e,t),!1}updateMatrixWorld(e){if(this.matrixAutoUpdate&&this.updateMatrix(),this.matrixWorldNeedsUpdate||e){this.parent===null?Pi.copy(this.matrix):Pi.multiplyMatrices(this.parent.matrixWorld,this.matrix),this.matrixWorldNeedsUpdate=!1;let t=Pi.elements,n=this.matrixWorld.elements,a=!1;for(let r=0;r<16;r++){let o=t[r],s=n[r];if(Math.abs(o-s)>2**-52){a=!0;break}}if(a){this.matrixWorld.copy(Pi),this.matrixWorldInverse.copy(Pi).invert();let r=this.children;for(let i=0,c=r.length;i<c;i++)r[i].updateMatrixWorld();let{tilesRenderer:o}=this,{activeTiles:s,visibleTiles:l}=o;s.forEach(i=>{l.has(i)||i.engineData.scene.updateMatrixWorld(!0)})}}}updateWorldMatrix(e,t){this.parent&&e&&this.parent.updateWorldMatrix(e,!1),this.updateMatrixWorld(!0)}},jw=new xd;function Iw(e,t,n,a){let{scene:r}=e.engineData;n.invokeOnePlugin(o=>o.raycastTile&&o.raycastTile(e,r,t,a))||t.intersectObject(r,!0,a)}function Fw(e){return"traversal"in e}function Ub(e,t,n,a,r=null){if(!Fw(t))return;let{group:o,activeTiles:s}=e,{boundingVolume:l}=t.engineData;if(r===null&&(r=jw,r.copy(n.ray).applyMatrix4(o.matrixWorldInverse)),!t.traversal.used||!l.intersectsRay(r))return;s.has(t)&&Iw(t,n,e,a);let i=t.children;for(let c=0,d=i.length;c<d;c++)Ub(e,i[c],n,a,r)}var sl=new Pe,ll=new Pe,On=new Pe,cl=new xd,gd=class{constructor(e=new zb,t=new on){this.box=e.clone(),this.transform=t.clone(),this.inverseTransform=new on,this.points=Array(8).fill().map(()=>new Pe),this.planes=[,,,,,,].fill().map(()=>new kw)}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 cl.copy(e).applyMatrix4(this.inverseTransform),cl.intersectsBox(this.box)}intersectRay(e,t){return cl.copy(e).applyMatrix4(this.inverseTransform),cl.intersectBox(this.box,t)?(t.applyMatrix4(this.transform),t):null}update(){let{points:e,inverseTransform:t,transform:n,box:a}=this;t.copy(n).invert();let{min:r,max:o}=a,s=0;for(let l=-1;l<=1;l+=2)for(let i=-1;i<=1;i+=2)for(let c=-1;c<=1;c+=2)e[s].set(l<0?r.x:o.x,i<0?r.y:o.y,c<0?r.z:o.z).applyMatrix4(n),s++;this.updatePlanes()}updatePlanes(){sl.copy(this.box.min).applyMatrix4(this.transform),ll.copy(this.box.max).applyMatrix4(this.transform),On.set(0,0,1).transformDirection(this.transform),this.planes[0].setFromNormalAndCoplanarPoint(On,sl),this.planes[1].setFromNormalAndCoplanarPoint(On,ll).negate(),On.set(0,1,0).transformDirection(this.transform),this.planes[2].setFromNormalAndCoplanarPoint(On,sl),this.planes[3].setFromNormalAndCoplanarPoint(On,ll).negate(),On.set(1,0,0).transformDirection(this.transform),this.planes[4].setFromNormalAndCoplanarPoint(On,sl),this.planes[5].setFromNormalAndCoplanarPoint(On,ll).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,a=this.planes;for(let r=0;r<6;r++){let o=e[r],s=-1/0;for(let l=0;l<8;l++){let i=n[l],c=o.distanceToPoint(i);s=s<c?c:s}if(s<0)return!1}for(let r=0;r<6;r++){let o=a[r],s=-1/0;for(let l=0;l<8;l++){let i=t[l],c=o.distanceToPoint(i);s=s<c?c:s}if(s<0)return!1}return!0}},Ai=Math.PI,md=Ai/2,Ti=new Pe,Ao=new Pe,ir=new Pe,fe=new Pe,xn=new on,Vw=new zb,Ob=new on;function Yr(e,t){t.radius=Math.max(t.radius,e.distanceToSquared(t.center))}function Eb(e){return e.x!==e.y}var Hb=class extends Sd{constructor(e=1,t=1,n=1,a=-md,r=md,o=0,s=2*Ai,l=0,i=0){super(e,t,n),this.latStart=a,this.latEnd=r,this.lonStart=o,this.lonEnd=s,this.heightStart=l,this.heightEnd=i}getBoundingBox(e,t){Eb(this.radius)&&console.warn("EllipsoidRegion: Triaxial ellipsoids are not supported.");let{latStart:n,latEnd:a,lonStart:r,lonEnd:o,heightStart:s,heightEnd:l}=this,i=(n+a)*.5,c=(r+o)*.5,d=n>0,u=a<0,b;b=d?n:u?a:0;let{min:g,max:h}=e;g.setScalar(1/0),h.setScalar(-1/0),o-r<=Ai?(this.getCartographicToNormal(i,c,ir),Ao.set(0,0,1),Ti.crossVectors(Ao,ir).normalize(),Ao.crossVectors(ir,Ti).normalize(),t.makeBasis(Ti,Ao,ir),xn.copy(t).invert(),this.getCartographicToPosition(b,r,l,fe).applyMatrix4(xn),h.x=Math.abs(fe.x),g.x=-h.x,this.getCartographicToPosition(a,r,l,fe).applyMatrix4(xn),h.y=fe.y,this.getCartographicToPosition(a,c,l,fe).applyMatrix4(xn),h.y=Math.max(fe.y,h.y),this.getCartographicToPosition(n,r,l,fe).applyMatrix4(xn),g.y=fe.y,this.getCartographicToPosition(n,c,l,fe).applyMatrix4(xn),g.y=Math.min(fe.y,g.y),this.getCartographicToPosition(i,c,l,fe).applyMatrix4(xn),h.z=fe.z,this.getCartographicToPosition(n,r,s,fe).applyMatrix4(xn),g.z=fe.z,this.getCartographicToPosition(a,r,s,fe).applyMatrix4(xn),g.z=Math.min(fe.z,g.z)):(this.getCartographicToPosition(b,c,l,ir),ir.z=0,ir.length()<1e-10?ir.set(1,0,0):ir.normalize(),Ao.set(0,0,1),Ti.crossVectors(ir,Ao).normalize(),t.makeBasis(Ti,Ao,ir),xn.copy(t).invert(),this.getCartographicToPosition(b,c+md,l,fe).applyMatrix4(xn),h.x=Math.abs(fe.x),g.x=-h.x,this.getCartographicToPosition(a,0,u?s:l,fe).applyMatrix4(xn),h.y=fe.y,this.getCartographicToPosition(n,0,d?s:l,fe).applyMatrix4(xn),g.y=fe.y,this.getCartographicToPosition(b,c,l,fe).applyMatrix4(xn),h.z=fe.z,this.getCartographicToPosition(b,o,l,fe).applyMatrix4(xn),g.z=fe.z),e.getCenter(fe),e.min.sub(fe).multiplyScalar(1.0000000000001),e.max.sub(fe).multiplyScalar(1.0000000000001),fe.applyMatrix4(t),t.setPosition(fe)}getBoundingSphere(e){Eb(this.radius)&&console.warn("EllipsoidRegion: Triaxial ellipsoids are not supported."),this.getBoundingBox(Vw,Ob),e.center.setFromMatrixPosition(Ob),e.radius=0;let{latStart:t,latEnd:n,lonStart:a,lonEnd:r,heightStart:o,heightEnd:s}=this,l=(t+n)*.5,i=(a+r)*.5,c=t>0,d=n<0,u;u=c?t:d?n:0,this.getCartographicToPosition(u,a,s,fe),Yr(fe,e),this.getCartographicToPosition(n,a,s,fe),Yr(fe,e),this.getCartographicToPosition(n,i,s,fe),Yr(fe,e),this.getCartographicToPosition(t,a,s,fe),Yr(fe,e),this.getCartographicToPosition(t,i,s,fe),Yr(fe,e),this.getCartographicToPosition(l,i,s,fe),Yr(fe,e),this.getCartographicToPosition(t,a,o,fe),Yr(fe,e),r-a>Ai&&(this.getCartographicToPosition(u,i+Ai,s,fe),Yr(fe,e)),e.radius=Math.sqrt(e.radius)*1.0000000000001}},Lr=new Pe,Dr=new Pe,Nr=new Pe,Lb=new Pe,Db=new Pe,Uw=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,a=this.obb||this.regionObb,r=-1/0,o=-1/0;n&&e.intersectSphere(n,Lb)&&(r=n.containsPoint(e.origin)?0:e.origin.distanceToSquared(Lb)),a&&a.intersectRay(e,Db)&&(o=a.containsPoint(e.origin)?0:e.origin.distanceToSquared(Db));let s=Math.max(r,o);return s===-1/0?null:(e.at(Math.sqrt(s),t),t)}distanceToPoint(e){let t=this.sphere,n=this.obb||this.regionObb,a=-1/0,r=-1/0;return t&&(a=Math.max(t.distanceToPoint(e),0)),n&&(r=n.distanceToPoint(e)),a>r?a: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 gd;Lr.set(e[3],e[4],e[5]),Dr.set(e[6],e[7],e[8]),Nr.set(e[9],e[10],e[11]);let a=Lr.length(),r=Dr.length(),o=Nr.length();Lr.normalize(),Dr.normalize(),Nr.normalize(),a===0&&Lr.crossVectors(Dr,Nr),r===0&&Dr.crossVectors(Lr,Nr),o===0&&Nr.crossVectors(Lr,Dr),n.transform.set(Lr.x,Dr.x,Nr.x,e[0],Lr.y,Dr.y,Nr.y,e[1],Lr.z,Dr.z,Nr.z,e[2],0,0,0,1).premultiply(t),n.box.min.set(-a,-r,-o),n.box.max.set(a,r,o),n.update(),this.obb=n}setSphereData(e,t,n,a,r){let o=new Fb;o.center.set(e,t,n),o.radius=a,o.applyMatrix4(r),this.sphere=o}setRegionData(e,t,n,a,r,o,s){let l=new Hb(...e.radius,n,r,t,a,o,s),i=new gd;l.getBoundingBox(i.box,i.transform),i.update(),this.region=l,this.regionObb=i}},Hw=new Mw;function Gw(e,t,n,a){let r=Hw.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 a.set(-e.constant,-t.constant,-n.constant),a.applyMatrix3(r.invert()),a}var Ww=class extends ww{constructor(){super(),this.points=Array(8).fill().map(()=>new Pe)}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,a)=>{Gw(n[0],n[1],n[2],t[a])})}};var fd=0;function Nb(e,t,n,a){try{return Aw.getByteLength(e,t,n,a)}catch{return fd}}function $w(e){if(!e)return 0;if(e.isExternalTexture)return e.userData?.byteLength??fd;let{format:t,type:n,image:a,mipmaps:r}=e;if(e.isCompressedTexture&&Array.isArray(r)&&r.length>0){let s=0;for(let l of r)l?.data?.byteLength?s+=l.data.byteLength:s+=Nb(l.width,l.height,t,n);return s}if(!a)return fd;let o=Nb(a.width,a.height,t,n);return o*=e.generateMipmaps?4/3:1,o}function Xw(e){let t=new Set,n=0;return e.traverse(a=>{if(a.geometry&&!t.has(a.geometry)&&(n+=Bw(a.geometry),t.add(a.geometry)),a.material){let r=a.material;for(let o in r){let s=r[o];s&&s.isTexture&&!t.has(s)&&(n+=$w(s),t.add(s))}}}),n}var Gb=Symbol("INITIAL_FRUSTUM_CULLED"),dl=new on,Ri=new Pe,bd=new vd,Kw=new Pe(1,0,0),Yw=new Pe(0,1,0),Jw=()=>null;function _b(e,t){e.traverse(n=>{n.frustumCulled=n[Gb]&&t})}var kd=class extends gb{get autoDisableRendererCulling(){return this._autoDisableRendererCulling}set autoDisableRendererCulling(e){this._autoDisableRendererCulling!==e&&(super._autoDisableRendererCulling=e,this.forEachLoadedModel(t=>{_b(t,!e)}))}constructor(...e){super(...e),this.accelerateRaycast=!0,this.group=new zw(this),this.ellipsoid=Bi.clone(),this.cameras=[],this.cameraMap=new Map,this.cameraInfo=[],this._upRotationMatrix=new on,this._bytesUsed=new WeakMap,this._autoDisableRendererCulling=!0,this.manager=new Sw,this._listeners={}}addEventListener(e,t){nl.prototype.addEventListener.call(this,e,t)}hasEventListener(e,t){return nl.prototype.hasEventListener.call(this,e,t)}removeEventListener(e,t){nl.prototype.removeEventListener.call(this,e,t)}dispatchEvent(e){nl.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)Ub(this,this.root,e,t);else{let n=e.firstHitOnly?[]:t;for(let a of this.activeTiles){let{scene:r}=a.engineData;this.invokeOnePlugin(o=>o.raycastTile&&o.raycastTile(a,r,e,n))||e.intersectObject(r,!0,n)}e.firstHitOnly&&n.length>0&&(n.sort((a,r)=>a.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 vd),t.push(e),this.dispatchEvent({type:"add-camera",camera:e}),!0)}setResolution(e,t,n){let a=this.cameraMap;if(!a.has(e))return!1;let r=t.isVector2?t.x:t,o=t.isVector2?t.y:n,s=a.get(e);return(s.width!==r||s.height!==o)&&(s.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(bd),this.setResolution(e,bd.x,bd.y)}deleteCamera(e){let t=this.cameras,n=this.cameraMap;if(n.has(e)){let a=t.indexOf(e);return t.splice(a,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:a={}}=t;switch((n&&n.gltfUpAxis||"y").toLowerCase()){case"x":this._upRotationMatrix.makeRotationAxis(Yw,-Math.PI/2);break;case"y":this._upRotationMatrix.makeRotationAxis(Kw,Math.PI/2);break}if("3DTILES_ellipsoid"in a){let r=a["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,a=this.cameraInfo;for(;a.length>t.length;)a.pop();for(;a.length<t.length;)a.push({frustum:new Ww,isOrthographic:!1,sseDenominator:-1,position:new Pe,invScale:-1,pixelSize:0});Ri.setFromMatrixScale(e.matrixWorldInverse),Math.abs(Math.max(Ri.x-Ri.y,Ri.x-Ri.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=a.length;r<o;r++){let s=t[r],l=a[r],i=l.frustum,c=l.position,d=n.get(s);(d.width===0||d.height===0)&&console.warn("TilesRenderer: resolution for camera error calculation is not set.");let u=s.projectionMatrix.elements;if(l.isOrthographic=u[15]===1,l.isOrthographic){let b=2/u[0],g=2/u[5];l.pixelSize=Math.max(g/d.height,b/d.width)}else l.sseDenominator=2/u[5]/d.height;dl.copy(e.matrixWorld),dl.premultiply(s.matrixWorldInverse),dl.premultiply(s.projectionMatrix),i.setFromProjectionMatrix(dl,s.coordinateSystem,s.reversedDepth),c.set(0,0,0),c.applyMatrix4(s.matrixWorld),c.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 a=new on;if(e.transform){let s=e.transform;for(let l=0;l<16;l++)a.elements[l]=s[l]}n&&a.premultiply(n.engineData.transform);let r=new on().copy(a).invert(),o=new Uw;"sphere"in e.boundingVolume&&o.setSphereData(...e.boundingVolume.sphere,a),"box"in e.boundingVolume&&o.setObbData(e.boundingVolume.box,a),"region"in e.boundingVolume&&o.setRegionData(this.ellipsoid,...e.boundingVolume.region),e.engineData.transform=a,e.engineData.transformInverse=r,e.engineData.boundingVolume=o,e.engineData.geometry=null,e.engineData.materials=null,e.engineData.textures=null,e.toJSON=Jw}async parseTile(e,t,n,a,r){let o=t.engineData,s=Qs(a),l=this.fetchOptions,i=this.manager,c=null,d=o.transform,u=this._upRotationMatrix,b=(To(e)||n).toLowerCase();switch(b){case"b3dm":{let m=new wd(i);m.workingPath=s,m.fetchOptions=l,m.adjustmentTransform.copy(u),c=m.parse(e);break}case"pnts":{let m=new Cd(i);m.workingPath=s,m.fetchOptions=l,c=m.parse(e);break}case"i3dm":{let m=new Md(i);m.workingPath=s,m.fetchOptions=l,m.adjustmentTransform.copy(u),m.ellipsoid.copy(this.ellipsoid),c=m.parse(e);break}case"cmpt":{let m=new Vb(i);m.workingPath=s,m.fetchOptions=l,m.adjustmentTransform.copy(u),m.ellipsoid.copy(this.ellipsoid),c=m.parse(e).then(S=>S.scene);break}case"gltf":case"glb":{let m=i.getHandler("path.gltf")||i.getHandler("path.glb")||new yd(i);m.setWithCredentials(l.credentials==="include"),m.setRequestHeader(l.headers||{}),l.credentials==="include"&&l.mode==="cors"&&m.setCrossOrigin("use-credentials");let S=m.resourcePath||m.path||s;!/[\\/]$/.test(S)&&S.length&&(S+="/"),c=m.parseAsync(e,S).then(M=>{M.scene=M.scene||new hd;let{scene:k}=M;return k.updateMatrix(),k.matrix.multiply(u).decompose(k.position,k.quaternion,k.scale),M});break}default:c=this.invokeOnePlugin(m=>m.parseToMesh&&m.parseToMesh(e,t,n,a,r));break}let g=await c;if(g===null)throw Error(`TilesRenderer: Content type "${b}" not supported.`);let h,w;g.isObject3D?(h=g,w=null):(h=g.scene,w=g),h.updateMatrix(),h.matrix.premultiply(d),h.matrix.decompose(h.position,h.quaternion,h.scale),await this.invokeAllPlugins(m=>m.processTileModel&&m.processTileModel(h,t)),h.traverse(m=>{m[Gb]=m.frustumCulled,m.userData.tile=t}),_b(h,!this.autoDisableRendererCulling);let B=[],v=[],p=[];if(h.traverse(m=>{if(m.geometry&&v.push(m.geometry),m.material){let S=m.material;B.push(m.material);for(let M in S){let k=S[M];k&&k.isTexture&&p.push(k)}}}),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=B,o.geometry=v,o.textures=p,o.scene=h,o.metadata=w}disposeTile(e){super.disposeTile(e);let t=e.engineData;if(t.scene){let n=t.materials,a=t.geometry,r=t.textures,o=t.scene.parent;t.scene.traverse(s=>{s.userData.meshFeatures&&s.userData.meshFeatures.dispose(),s.userData.structuralMetadata&&s.userData.structuralMetadata.dispose()});for(let s=0,l=a.length;s<l;s++)a[s].dispose();for(let s=0,l=n.length;s<l;s++)n[s].dispose();for(let s=0,l=r.length;s<l;s++){let i=r[s];i.image instanceof ImageBitmap&&i.image.close(),i.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:a,group:r}=this;n&&(t?r.add(n):(r.remove(n),a.has(e)&&(n.parent=r))),super.setTileVisible(e,t)}calculateBytesUsed(e,t){let n=this._bytesUsed;return!n.has(e)&&t&&n.set(e,Xw(t)),n.get(e)??null}calculateTileViewError(e,t){let n=e.engineData,a=this.cameras,r=this.cameraInfo,o=n.boundingVolume,s=!1,l=0,i=1/0,c=0,d=1/0;for(let u=0,b=a.length;u<b;u++){let g=r[u],h,w;if(g.isOrthographic){let v=g.pixelSize;h=e.geometricError/v,w=1/0}else{let v=g.sseDenominator;w=o.distanceToPoint(g.position),h=w===0?1/0:e.geometricError/(w*v)}let B=r[u].frustum;o.intersectsFrustum(B)&&(s=!0,l=Math.max(l,h),i=Math.min(i,w)),c=Math.max(c,h),d=Math.min(d,w)}s?(t.inView=!0,t.error=l,t.distanceFromCamera=i):(t.inView=!1,t.error=c,t.distanceFromCamera=d)}dispose(){super.dispose(),this.group.removeFromParent()}};import{jsx as n1}from"react/jsx-runtime";function Pd({url:e,rotation:t=[0,0,0],errorTarget:n=8,cacheSize:a=800,onModelLoaded:r,onLoadError:o}){let{camera:s,gl:l,invalidate:i}=t1(),c=Qw(!1),d=Zw(()=>{let u=new kd(e);return u.errorTarget=n,u.lruCache.maxSize=a,u},[a,n,e]);return qw(()=>{c.current=!1;let u=()=>i(),b=()=>{c.current||(c.current=!0,r?.(d.group),i())},g=h=>{o?.(h.error)};return d.setCamera(s),d.setResolutionFromRenderer(s,l),d.addEventListener("needs-update",u),d.addEventListener("load-model",b),d.addEventListener("load-error",g),()=>{d.removeEventListener("needs-update",u),d.removeEventListener("load-model",b),d.removeEventListener("load-error",g),d.deleteCamera(s),d.dispose()}},[s,l,i,o,r,d]),e1(()=>{d.setResolutionFromRenderer(s,l),d.update()}),n1("primitive",{object:d.group,rotation:t})}import{useMemo as Bo,useRef as Jr,useState as Ta,useEffect as Pa,useCallback as ka}from"react";import{Html as Wb}from"@react-three/drei";import{useFrame as $b,useThree as Rd}from"@react-three/fiber";import{MathUtils as Td,Vector3 as Oi}from"three";import{jsx as sr,jsxs as Ad}from"react/jsx-runtime";var r1=.02;function Xb(e,t){let n=Jr(null),a=Rd(c=>c.scene),r=Jr(null),o=Bo(()=>new Oi(...e.anchorLocalPosition??e.localPosition??e.worldPosition),[e.anchorLocalPosition,e.localPosition,e.worldPosition]),s=Bo(()=>new Oi,[]),l=Bo(()=>new Oi,[]),i=Bo(()=>new Oi,[]);return Pa(()=>{r.current=null},[e.anchorNodeName]),$b(({camera:c})=>{let d=n.current,u=d?.parent;if(!d||!u)return;let b=r.current;if(e.anchorNodeName&&(!b||!b.parent)&&(b=ar(a,e.anchorNodeName),r.current=b),b?(b.updateWorldMatrix(!0,!1),s.copy(o).applyMatrix4(b.matrixWorld)):(s.copy(o),u.localToWorld(s)),t){let g=t.current.get(e.id);g||(g=new Oi,t.current.set(e.id,g)),g.copy(s)}i.copy(c.position).sub(s),i.lengthSq()>0?(i.normalize(),l.copy(s).addScaledVector(i,r1)):l.copy(s),u.worldToLocal(l),d.position.copy(l)}),n}function o1({annotation:e,occluders:t,worldPositionsRef:n,onClick:a,onHover:r,showAnnotationOnHover:o}){let[s,l]=Ta(!1),i=Xb(e,n),[c,d]=Ta(!1),[u,b]=Ta(1),g=Jr(null),h=Jr(null),w=Jr(null);Pa(()=>()=>{g.current&&(clearTimeout(g.current),g.current=null),w.current&&(clearTimeout(w.current),w.current=null)},[]);let B=M=>{M.stopPropagation(),M.preventDefault(),g.current&&(clearTimeout(g.current),g.current=null),g.current=window.setTimeout(()=>{a?.(e),g.current=null},10)},v=M=>{M.stopPropagation(),d(!0),b(100),w.current&&(clearTimeout(w.current),w.current=null),r?.(e),o&&a?.(e)},p=M=>{M.stopPropagation(),d(!1),b(1),w.current&&clearTimeout(w.current),w.current=window.setTimeout(()=>{r?.(null),o&&r?.(null),w.current=null},50)},m=M=>{M.stopPropagation();let k=M.currentTarget;k.dataset.pointerX=String(M.clientX),k.dataset.pointerY=String(M.clientY)},S=M=>{M.stopPropagation();let k=M.currentTarget,R=parseFloat(k.dataset.pointerX||"0"),f=parseFloat(k.dataset.pointerY||"0"),C=M.clientX-R,x=M.clientY-f;Math.sqrt(C*C+x*x)<10&&B(M)};return sr("group",{ref:i,children:sr(Wb,{center:!0,occlude:t,onOcclude:l,pointerEvents:s?"none":"auto",zIndexRange:[1,200],style:{pointerEvents:s?"none":"auto",zIndex:u},className:"annotation-html-wrapper",transparent:!0,children:sr("div",{ref:h,className:`ri-annotationMarker ${c?"ri-annotationMarker--hovered":""}`,title:e.title,style:{display:s?"none":"flex"},onPointerDown:m,onPointerUp:S,onPointerEnter:v,onPointerLeave:p,onDoubleClick:M=>{M.stopPropagation(),a?.(e)},role:"button",tabIndex:0,"aria-label":`Annotation ${e.id}`,children:sr("span",{className:"ri-annotationMarker-id",children:e.id})})})})}function a1({annotation:e,occluders:t,popupRef:n,onClose:a,hideCloseButton:r=!1}){let[o,s]=Ta(!1),l=Xb(e),i=Ad("div",{ref:n,className:"ri-viewAnnotationPopup",style:{display:o?"none":"block"},onPointerDown:c=>c.stopPropagation(),onClick:c=>c.stopPropagation(),children:[Ad("div",{className:"ri-viewAnnotationHeader",children:[sr("h4",{className:"ri-viewAnnotationTitle",children:e.title}),!r&&sr("button",{onClick:c=>{c.stopPropagation(),a?.()},className:"ri-viewAnnotationClose","aria-label":"Close annotation",children:"\xD7"})]}),e.description&&sr("p",{className:"ri-viewAnnotationDescription",children:e.description})]});return sr("group",{ref:l,children:sr(Wb,{occlude:t,onOcclude:s,pointerEvents:o?"none":"auto",zIndexRange:[1e3,2e3],style:{pointerEvents:o?"none":"auto",zIndex:1e3},transparent:!0,children:i})})}function Bd({annotations:e,sceneConfig:t,activeAnnotation:n,popupRef:a,canvasRootRef:r,worldPositionsRef:o,modelLoaded:s,onAnnotationClick:l,onAnnotationHover:i,onCloseAnnotation:c,hideCloseButton:d=!1,showAnnotationOnHover:u=!1}){let b=Rd(T=>T.invalidate),g=Rd(T=>T.scene),[h,w]=Ta(null),[B,v]=Ta(!1),p=Jr(null),m=Jr(null),S=Jr(null),M=Bo(()=>{let T=[];return g.traverse(I=>{let F=I;F.isMesh&&!F.isSkinnedMesh&&T.push({current:I})}),T},[g,e,s]),k=ka(()=>{b();let T=()=>{b(),m.current=window.requestAnimationFrame(()=>{b(),m.current=null})};m.current=window.requestAnimationFrame(T)},[b]);Pa(()=>{k()},[e,k]),Pa(()=>{k()},[n,k]),Pa(()=>()=>{m.current!==null&&window.cancelAnimationFrame(m.current),S.current&&clearTimeout(S.current)},[]);let R=B?h:n||h,f=Bo(()=>R?e.find(T=>T.id===R.id)??R:null,[R,e]),C=ka(T=>{if(B&&h?.id===T.id){v(!1),w(null),c?.();return}v(!0),w(T),l?.(T)},[B,h,l,c]),x=ka(T=>{i?.(T),u&&!B&&(S.current&&(clearTimeout(S.current),S.current=null),T?w(T):S.current=window.setTimeout(()=>{w(null),c?.(),S.current=null},100))},[B,i,u,c]),P=ka(()=>{v(!1),w(null),c?.()},[c]),z=ka(T=>{let I=T.target;if(I.closest?.(".ri-annotationMarker")||I.closest?.(".ri-viewAnnotationPopup")||I.closest?.(".annotation-html-wrapper"))return;let F=r.current;F&&F.contains(I)&&(v(!1),w(null),c?.())},[r,c]),A=ka(T=>{T.key==="Escape"&&B&&(v(!1),w(null),c?.())},[B,c]);Pa(()=>{let T=r.current;return T&&(T.addEventListener("click",z),T.addEventListener("pointerdown",z)),document.addEventListener("keydown",A),()=>{T&&(T.removeEventListener("click",z),T.removeEventListener("pointerdown",z)),document.removeEventListener("keydown",A)}},[r,z,A]);let j=Bo(()=>(t?.model.rotation??[0,0,0]).map(T=>T*Math.PI/180),[t?.model.rotation]);return $b((T,I)=>{p.current&&(p.current.rotation.x=Td.lerp(p.current.rotation.x,j[0],1-Math.exp(-5*I)),p.current.rotation.y=Td.lerp(p.current.rotation.y,j[1],1-Math.exp(-5*I)),p.current.rotation.z=Td.lerp(p.current.rotation.z,j[2],1-Math.exp(-5*I)))}),Ad("group",{ref:p,children:[e.map(T=>{let I=`${T.worldPosition.join(",")}-${T.title}-${T.id}`;return sr(o1,{annotation:T,occluders:M,worldPositionsRef:o,onClick:C,onHover:x,showAnnotationOnHover:u},I)}),f?sr(a1,{annotation:f,occluders:M,popupRef:a,onClose:P,hideCloseButton:d},`popup-${f.id}`):null]})}import{useEffect as i1,useMemo as Kb}from"react";import{Html as Jb,Line as s1}from"@react-three/drei";import{BoxGeometry as l1,EdgesGeometry as c1,Vector3 as Yb}from"three";import{jsx as _r,jsxs as Ra}from"react/jsx-runtime";var d1="#22d3ee",p1="#facc15";function ul(e,t){let n=e<10?e.toFixed(3):e.toFixed(2);return t?`${n} ${t}`:n}function u1(e,t){return[(e[0]+t[0])/2,(e[1]+t[1])/2,(e[2]+t[2])/2]}function ml({position:e,children:t}){return _r(Jb,{center:!0,position:e,zIndexRange:[20,0],children:_r("div",{className:"ri-measureLabel",children:t})})}function m1({box:e,unit:t}){let n=Kb(()=>[(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]),a=Kb(()=>{let[l,i,c]=e.size;return new c1(new l1(l||1e-4,i||1e-4,c||1e-4))},[e.size]);i1(()=>()=>{a.dispose()},[a]);let[r,o,s]=e.size;return Ra("group",{position:n,children:[_r("lineSegments",{geometry:a,children:_r("lineBasicMaterial",{color:p1})}),Ra(ml,{position:[0,-o/2,s/2],children:["W ",ul(r,t)]}),Ra(ml,{position:[-r/2,0,s/2],children:["H ",ul(o,t)]}),Ra(ml,{position:[r/2,-o/2,0],children:["D ",ul(s,t)]})]})}function Od({points:e,unit:t,box:n,showDimensions:a}){return Ra("group",{children:[e.map(r=>_r(Jb,{center:!0,position:r.position,zIndexRange:[15,0],children:_r("div",{className:"ri-measureDot"})},r.id)),e.slice(1).map((r,o)=>{let s=e[o].position,l=r.position,i=new Yb(...s).distanceTo(new Yb(...l));return Ra("group",{children:[_r(s1,{points:[s,l],color:d1,lineWidth:2}),_r(ml,{position:u1(s,l),children:ul(i,t)})]},`${e[o].id}-${r.id}`)}),a&&n?_r(m1,{box:n,unit:t}):null]})}import{forwardRef as b1,useCallback as Ei,useEffect as qb,useImperativeHandle as g1,useMemo as Zb,useRef as bn}from"react";import{useXR as Qb,useXRHitTest as f1,useXRInputSourceEvent as h1}from"@react-three/xr";import{useFrame as x1}from"@react-three/fiber";import{Matrix4 as v1,Vector3 as eg}from"three";import{Fragment as k1,jsx as Li,jsxs as og}from"react/jsx-runtime";var y1=1,tg=1,w1=.1,C1=10;function S1(e,t){let[n,a,r]=e.size,o=(e.min[0]+e.max[0])/2,s=(e.min[2]+e.max[2])/2,l=Math.max(n,a,r)||1;return{scale:t==="real-world"?1:y1/l,offset:[-o,-e.min[1],-s]}}function ng(e){let t=e[0].clientX-e[1].clientX,n=e[0].clientY-e[1].clientY;return Math.hypot(t,n)}function rg(e){let t=e[0].clientX-e[1].clientX,n=e[0].clientY-e[1].clientY;return Math.atan2(n,t)}var M1=b1(function({box:t,scaleMode:n,children:a,onARStateChange:r},o){let s=bn(null),l=bn(null),i=bn(null),c=Qb(I=>I.session!=null),d=Qb(I=>I.mode==="immersive-ar"),u=Zb(()=>t?S1(t,n):null,[t,n]),b=bn(new eg(0,0,-tg)),g=bn(1),h=bn(0),w=bn(!0),B=bn(!1),v=Zb(()=>new v1,[]),p=bn(new eg),m=bn(!1),S=bn(null),M=bn(!1),k=bn(0),R=bn(0),f=bn(1),C=bn(0),x=Ei(()=>{if(!r||!d)return;let I={canPlace:m.current,isPlacementMode:w.current,isModelPlaced:B.current},F=S.current;F&&F.canPlace===I.canPlace&&F.isPlacementMode===I.isPlacementMode&&F.isModelPlaced===I.isModelPlaced||(S.current=I,r(I))},[d,r]),P=Ei(()=>!d||!m.current?!1:(b.current.copy(p.current),B.current=!0,w.current=!1,x(),!0),[x,d]),z=Ei(()=>{d&&(w.current=!0,x())},[x,d]),A=Ei(()=>{let I=P();return!I&&d&&(w.current=!1,x()),I},[x,d,P]),j=Ei(()=>{d&&(w.current=!1,x())},[x,d]);g1(o,()=>({placeCurrent:P,startPlacementMode:z,finishPlacementMode:A,cancelPlacementMode:j}),[j,A,P,z]),qb(()=>{if(!c){b.current.set(0,0,-tg),g.current=1,h.current=0,m.current=!1,M.current=!1,w.current=!0,B.current=!1,S.current=null;return}d&&(m.current=!1,M.current=!1,w.current=!0,B.current=!1,S.current=null,x())},[x,c,d]),f1((I,F)=>{if(!d||I.length===0){m.current&&(m.current=!1,x());return}F(v,I[0])&&(p.current.setFromMatrixPosition(v),m.current||(m.current=!0,x()))},"viewer"),h1("all","select",()=>{!d||M.current||!w.current||P()},[d,P]),qb(()=>{if(!d)return;let I=E=>{E.touches.length===2&&(M.current=!0,k.current=ng(E.touches),R.current=rg(E.touches),f.current=g.current,C.current=h.current)},F=E=>{if(!M.current||E.touches.length!==2)return;E.preventDefault();let W=ng(E.touches);if(k.current>0){let ae=W/k.current;g.current=Math.min(C1,Math.max(w1,f.current*ae))}let U=rg(E.touches);h.current=C.current-(U-R.current)},O=E=>{E.touches.length===0&&requestAnimationFrame(()=>{M.current=!1})};return window.addEventListener("touchstart",I),window.addEventListener("touchmove",F,{passive:!1}),window.addEventListener("touchend",O),window.addEventListener("touchcancel",O),()=>{window.removeEventListener("touchstart",I),window.removeEventListener("touchmove",F),window.removeEventListener("touchend",O),window.removeEventListener("touchcancel",O)}},[d]),x1(()=>{let I=s.current,F=l.current;if(!I||!F)return;!c||!u?(I.visible=!0,I.position.set(0,0,0),I.rotation.set(0,0,0),F.scale.setScalar(1)):(I.visible=!d||B.current,I.position.copy(b.current),I.rotation.set(0,h.current,0),F.scale.setScalar(u.scale*g.current));let O=i.current;if(O){let E=d&&w.current&&m.current;O.visible=E,E&&O.position.copy(p.current)}});let T=c&&u?u.offset:[0,0,0];return og(k1,{children:[og("mesh",{ref:i,visible:!1,rotation:[-Math.PI/2,0,0],children:[Li("ringGeometry",{args:[.05,.07,32]}),Li("meshBasicMaterial",{color:"#22d3ee",transparent:!0,opacity:.95})]}),Li("group",{ref:s,children:Li("group",{ref:l,children:Li("group",{position:T,children:a})})})]})}),ag=M1;import{useEffect as bl,useMemo as xr,useRef as qr}from"react";import{useFrame as P1,useThree as T1}from"@react-three/fiber";import{Box3 as R1,CatmullRomCurve3 as ig,Sphere as A1,Spherical as B1,Vector3 as Zr}from"three";var O1=1.2;function Ed({controlsRef:e,sceneRef:t,config:n,playing:a,resetOnPlay:r=!1,onFinished:o,onUserInteract:s,onStop:l}){let i=T1(j=>j.invalidate),c=xr(()=>n.waypoints??[],[n.waypoints]),d=c.length>=2,u=n.loop??!0,b=xr(()=>{if(c.length<2)return 24;let j=0;for(let T=0;T<c.length-1;T++)j+=c[T].segmentDuration??3.5;return u&&c.length>1&&(j+=c[c.length-1].segmentDuration??3.5),Math.max(j,4)},[c,u]),g=n.duration??b,h=xr(()=>c.map(j=>[...j.position,...j.target,j.azimuthAngle??"",j.polarAngle??"",j.segmentDuration??""].join(",")).join(";"),[c]),w=xr(()=>{let j=[];if(c.length<2)return j;let T=0;for(let I=0;I<c.length-1;I++)T+=c[I].segmentDuration??3.5,j.push(T);return u&&c.length>1&&(T+=c[c.length-1].segmentDuration??3.5,j.push(T)),j},[c,u]),B=xr(()=>j=>{if(c.length<2||w.length===0)return j/g;let T=w[w.length-1],I=u?j%g:Math.min(j,g),F=g>0?I/g*T:0;for(let O=0;O<w.length;O++)if(F<=w[O]){let E=O===0?0:w[O-1],W=w[O]-E,U=W>0?(F-E)/W:0,ae=u?c.length:c.length-1,xe=O/ae,le=1/ae;return xe+U*le}return 1},[c.length,w,g,u]),v=xr(()=>d?{position:new ig(c.map(j=>new Zr(...j.position)),u,"catmullrom",.5),target:new ig(c.map(j=>new Zr(...j.target)),u,"catmullrom",.5)}:null,[h,d,u]),p=xr(()=>{if(!d||!c.every(T=>Number.isFinite(T.azimuthAngle)&&Number.isFinite(T.polarAngle)))return null;let j=c.map(T=>({azimuth:T.azimuthAngle,polar:T.polarAngle,distance:new Zr(...T.position).distanceTo(new Zr(...T.target))}));for(let T=1;T<j.length;T+=1){let I=j[T-1].azimuth,F=j[T].azimuth;j[T].azimuth=F+Math.round((I-F)/(Math.PI*2))*Math.PI*2}return j},[h,d]),m=qr(0),S=qr(0),M=qr(new Zr),k=qr(new Zr),R=qr(!1),f=qr(0),C=qr(!1),x=qr(null),P=xr(()=>new Zr,[]),z=xr(()=>new Zr,[]),A=xr(()=>new B1,[]);return bl(()=>{m.current=0,f.current=0,S.current=0,C.current=!1},[h,u,g]),bl(()=>{r&&(f.current=0,m.current=0,C.current=!1)},[r]),bl(()=>{if(!a){R.current=!1,m.current>0&&!r?f.current=m.current:r&&(f.current=0),(m.current>0||C.current)&&l?.();return}m.current>=g&&!u&&(m.current=0,f.current=0,C.current=!1);let j=e.current;if(j&&(j.getPosition(M.current),j.getTarget(k.current)),r||C.current||f.current===0?(m.current=0,f.current=0,C.current=!1):f.current>0&&f.current<g?m.current=f.current:(m.current=0,f.current=0),S.current=0,!d){let T=t.current;if(T){let I=new R1().setFromObject(T).getBoundingSphere(new A1);x.current={center:I.center.clone(),radius:I.radius>0?I.radius:1}}}R.current=!0,i()},[a,d,e,t,i,g,u,h,r,l]),bl(()=>{if(!a||!s)return;let j=e.current;if(!j)return;let T=()=>{C.current||s()};return j.addEventListener("controlstart",T),()=>j.removeEventListener("controlstart",T)},[a,e,s]),P1((j,T)=>{if(!a||!R.current)return;let I=e.current;if(!I)return;m.current+=T,S.current+=T;let F=B(m.current),O=!u&&m.current>=g;if(F=u?F%1:Math.min(F,1),v)if(v.target.getPoint(F,z),p){let W=u?p.length:p.length-1,U=Math.min(F,1)*W,ae=Math.min(Math.floor(U),W-1),xe=(ae+1)%p.length,le=F>=1?1:U-ae,ge=le*le*(3-2*le),he=p[ae],Se=p[xe],at=Se.azimuth+Math.round((he.azimuth-Se.azimuth)/(Math.PI*2))*Math.PI*2,wt=he.azimuth+(at-he.azimuth)*ge,Xe=he.polar+(Se.polar-he.polar)*ge,Me=he.distance+(Se.distance-he.distance)*ge;A.set(Math.max(Me,1e-6),Math.min(Math.max(Xe,1e-6),Math.PI-1e-6),wt),P.setFromSpherical(A).add(z)}else v.position.getPoint(F,P);else{let W=x.current;if(!W)return;let U=F*Math.PI*2,ae=W.radius*2.2;P.set(W.center.x+Math.cos(U)*ae,W.center.y+W.radius*.6,W.center.z+Math.sin(U)*ae),z.copy(W.center)}let E=Math.min(S.current/O1,1);if(E<1){let W=E*E*(3-2*E);P.lerpVectors(M.current,P,W),z.lerpVectors(k.current,z,W)}if(I.setLookAt(P.x,P.y,P.z,z.x,z.y,z.z,!1),O){R.current=!1,C.current=!0,m.current=0,f.current=0,o?.();return}i()}),null}import{useEffect as _1,useState as z1}from"react";var E1="ri:license-grant:v1",L1={"260cd89ea13f":"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEwjr3ofKTkkcxOM0GYl/RlJj9JsuyjSF8sYmCd2YqsHJCEO8EvlNDrO2Kl4agFKo6dRhyR2/oWeiU6P9WIqRbvw=="},sg=new Map;function cg(e){let t=atob(e);return Uint8Array.from(t,n=>n.charCodeAt(0)).buffer}function lg(e){let t=e.replace(/-/g,"+").replace(/_/g,"/");return cg(t.padEnd(Math.ceil(t.length/4)*4,"="))}function D1(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 gl(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 Ld(e,t){return`${E1}:${t}:${e}`}function N1(e,t){let n=sg.get(e);if(n)return n;let a=crypto.subtle.importKey("spki",cg(t),{name:"ECDSA",namedCurve:"P-256"},!1,["verify"]);return sg.set(e,a),a}async function Dd(e,t,n){if(!globalThis.crypto?.subtle)return null;try{let[a,r,o,s,...l]=e.split("."),i=L1[r];if(a!=="ri1"||!i||!o||!s||l.length>0)return null;let c=JSON.parse(new TextDecoder().decode(lg(o)));if(!D1(c)||!await crypto.subtle.verify({name:"ECDSA",hash:"SHA-256"},await N1(r,i),lg(s),new TextEncoder().encode(`${a}.${r}.${o}`)))return null;let u=Math.floor(Date.now()/1e3),b=c.expiresAt-c.issuedAt;return c.licenseKeyHash!==t||c.domain!==n||c.expiresAt<=u||c.issuedAt>u+300||b<=0||b>43200?null:{environment:c.environment,tier:c.tier,expiresAt:c.expiresAt}}catch{return null}}async function dg(e,t,n){try{return await Dd(e,await gl(t),n)}catch{return null}}async function pg(e,t,n){try{let a=await gl(t);return await Dd(e,a,n)?(localStorage.setItem(Ld(a,n),e),!0):!1}catch{return!1}}async function ug(e,t){try{let n=await gl(e),a=Ld(n,t),r=localStorage.getItem(a);if(!r)return null;let o=await Dd(r,n,t);return o||localStorage.removeItem(a),o}catch{return null}}async function Nd(e,t){try{let n=await gl(e);localStorage.removeItem(Ld(n,t))}catch{}}var j1=["localhost","127.0.0.1","0.0.0.0"],I1=e=>j1.includes(e)||e.endsWith(".local")||e.endsWith(".localhost"),bg="https://react-immersive.liveroom.dev/api/validate-license",F1=()=>typeof window<"u",V1=300*1e3,U1=5e3,H1=400,zd=new Map,_d=new Map,Qr=class extends Error{},gg=async(e,t,n)=>{let a=await ug(e,t);return a?(console.warn("[react-immersive] License server unreachable \u2014 using a previously verified, time-limited offline grant."),{status:"valid",reason:"Previously verified offline grant",environment:a.environment,tier:a.tier,isLocalDomain:n}):null},mg=async(e,t,n)=>{let a=await gg(e,t,n);return a||(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})},G1=e=>e instanceof Qr||e instanceof TypeError,W1=()=>new Promise(e=>setTimeout(e,H1)),$1=e=>e==="development"||e==="production",X1=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&&!$1(t.environment)||t.tier!==void 0&&typeof t.tier!="string"||t.offlineGrant!==void 0&&typeof t.offlineGrant!="string")},K1=e=>{if(!e||typeof e!="object")return null;let t=e,n=t.reason??t.error;return typeof n=="string"&&n.trim()?n:null},Y1=(e,t,n)=>`${n}::${e}::${t}`,J1=e=>{let t=zd.get(e);return t?Date.now()-t.timestamp>V1?(zd.delete(e),null):t.result:null},q1=(e,t)=>({status:e.valid?"valid":"invalid",reason:e.reason,environment:e.environment,tier:e.tier,isLocalDomain:t}),Z1=(e,t)=>({status:"invalid",reason:e,isLocalDomain:t});async function Q1(e,t,n,a){let r=Y1(e,t,a),o=J1(r);if(o)return o;let s=_d.get(r);if(s)return s;let l=(async()=>{for(let i=0;i<2;i+=1)try{return await eC(e,t,n,r,a)}catch(c){if(!G1(c))throw c;if(i===0){let d=await gg(e,t,n);if(d)return d;await W1();continue}return mg(e,t,n)}return mg(e,t,n)})().finally(()=>{_d.delete(r)});return _d.set(r,l),l}async function eC(e,t,n,a,r){let o=new AbortController,s=setTimeout(()=>o.abort(),U1),l;try{l=await fetch(r,{method:"POST",headers:{"Content-Type":"application/json"},cache:"no-store",signal:o.signal,body:JSON.stringify({licenseKey:e,domain:t})})}catch(d){throw o.signal.aborted?new Qr("License validation timed out"):d}finally{clearTimeout(s)}let i;try{i=await l.json()}catch{throw new Qr(`License server returned a non-JSON response${l.status?` (${l.status})`:""}`)}if(!l.ok){if(l.status===429||l.status>=500)throw new Qr(`License server error (${l.status})`);let d=K1(i)??`License validation failed${l.status?` (${l.status})`:""}`;return await Nd(e,t),Z1(d,n)}if(!X1(i))throw new Qr("License server returned an unexpected payload");let c=q1(i,n);if(c.status==="valid"&&r!==bg){let d=i.offlineGrant?await dg(i.offlineGrant,e,t):null;if(!d)throw new Qr("License validation endpoint did not return a verifiable signed grant");c={...c,environment:d.environment,tier:d.tier}}return c.status==="valid"?(zd.set(a,{result:c,timestamp:Date.now()}),i.offlineGrant&&(await pg(i.offlineGrant,e,t)||console.warn("[react-immersive] The license server returned an invalid offline grant; it was not cached."))):await Nd(e,t),c}var fl=(e,t=bg)=>{let[n,a]=z1({status:"checking",isLocalDomain:!1});return _1(()=>{if(!F1())return;let r=!1,o=d=>{r||a(d)},s=e.trim(),l=window.location.hostname.toLowerCase(),i=I1(l);return o({status:"checking",isLocalDomain:i}),s?((async()=>{try{o(await Q1(s,l,i,t))}catch(d){let u=d instanceof TypeError?"Could not reach license server":d instanceof Error?d.message:"License validation failed";o({status:"invalid",reason:u,isLocalDomain:i})}})(),()=>{r=!0}):(o({status:"invalid",reason:"No license key provided",isLocalDomain:i}),()=>{r=!0})},[e,t]),n};import{useRef as Oo,useState as tC,useCallback as vr,useEffect as nC}from"react";import{jsx as In,jsxs as jd}from"react/jsx-runtime";var rC={up:{width:38,height:22},down:{width:38,height:22},left:{width:22,height:38},right:{width:22,height:38}},oC={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"},hl=({direction:e})=>{let t=rC[e],n=oC[e];return jd("svg",{"aria-hidden":"true",className:"mc__arrow-icon",focusable:"false",viewBox:"0 0 24 24",width:t.width,height:t.height,fill:"none",xmlns:"http://www.w3.org/2000/svg",style:{display:"block",width:`${t.width}px`,height:`${t.height}px`,pointerEvents:"none",padding:0,margin:0,overflow:"visible"},children:[In("polyline",{points:n,stroke:"rgba(0, 0, 0, 0.9)",strokeWidth:"6",strokeLinecap:"round",strokeLinejoin:"round"}),In("polyline",{points:n,stroke:"#2095F2",strokeWidth:"4",strokeLinecap:"round",strokeLinejoin:"round"})]})},zr=16,aC={"bottom-left":{bottom:zr,left:zr,top:"auto",right:"auto",transform:"none"},"bottom-right":{bottom:zr,right:zr,top:"auto",left:"auto",transform:"none"},"top-left":{top:zr,left:zr,bottom:"auto",right:"auto",transform:"none"},"top-right":{top:zr,right:zr,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:zr,left:"50%",bottom:"auto",right:"auto",transform:"translateX(-50%)"}},iC=({controlsRef:e,enabled:t=!0,opacity:n=.9,moveSensitivity:a=.001,rotateSensitivity:r=.01,position:o="center-bottom"})=>{let s=Oo(null),[l,i]=tC({x:0,y:0}),c=Oo(!1),d=Oo({x:0,y:0}),u=Oo(),b=Oo(),g=Oo(null),h=Oo(0),w=()=>e.current,B=(A,j,T)=>{let I=Math.hypot(A,j);if(I>T){let F=T/I;return{x:A*F,y:j*F}}return{x:A,y:j}},v=A=>{let T=Math.abs(A);return T<.12?0:Math.sign(A)*((T-.12)/(1-.12))},p=vr(()=>{let A=()=>{let{x:j,y:T}=d.current,I=v(j),F=v(T);if(t&&(I!==0||F!==0)){let O=w();O&&O.rotate(-I*r,-F*r,!0)}u.current=requestAnimationFrame(A)};u.current=requestAnimationFrame(A)},[t,r]),m=vr(()=>{u.current&&cancelAnimationFrame(u.current)},[]),S=vr((A,j)=>{if(!s.current||!c.current)return;let T=s.current.getBoundingClientRect(),I=T.left+T.width/2,F=T.top+T.height/2,O=T.width/2-18,E=A-I,W=j-F,U=B(E,W,O);i(U),d.current={x:U.x/O,y:U.y/O}},[]),M=vr(A=>{if(!t)return;A.preventDefault(),A.stopPropagation(),c.current=!0,p();let j="touches"in A?A.touches[0]:A;S(j.clientX,j.clientY)},[t,p,S]),k=vr(A=>{if(!c.current)return;A.preventDefault();let j="touches"in A?A.touches[0]:A;S(j.clientX,j.clientY)},[S]),R=vr(()=>{c.current=!1,i({x:0,y:0}),d.current={x:0,y:0},m()},[m]),f=a*10,C=vr(A=>{t&&w()?.forward(A*f,!0)},[t,f]),x=vr(A=>{t&&w()?.truck(A*f,0,!0)},[t,f]),P=vr((A,j,T)=>{if(!t)return;b.current&&cancelAnimationFrame(b.current),g.current={control:A,amount:j,action:T},h.current=0,T(j);let I=F=>{if(!g.current)return;if(h.current===0){h.current=F,b.current=requestAnimationFrame(I);return}if(F-h.current>200){let{amount:E,action:W}=g.current;W(E),h.current=F}b.current=requestAnimationFrame(I)};b.current=requestAnimationFrame(I)},[t]),z=vr(A=>{g.current?.control===A&&(b.current&&(cancelAnimationFrame(b.current),b.current=void 0),g.current=null,h.current=0)},[]);return nC(()=>(window.addEventListener("mousemove",k),window.addEventListener("mouseup",R),window.addEventListener("touchmove",k,{passive:!1}),window.addEventListener("touchend",R),window.addEventListener("touchcancel",R),()=>{window.removeEventListener("mousemove",k),window.removeEventListener("mouseup",R),window.removeEventListener("touchmove",k),window.removeEventListener("touchend",R),window.removeEventListener("touchcancel",R),m(),b.current&&cancelAnimationFrame(b.current)}),[k,R,m]),t?In("div",{className:"mc__wrapper",style:{opacity:n,...aC[o]},children:jd("div",{className:"mc__dpad",children:[In("button",{"aria-label":"Move forward",className:"mc__arrow mc__arrow--up",onMouseDown:()=>P("up",1,C),onMouseUp:()=>z("up"),onMouseLeave:()=>z("up"),onTouchStart:A=>{A.preventDefault(),P("up",1,C)},onTouchEnd:()=>z("up"),onTouchCancel:()=>z("up"),children:In(hl,{direction:"up"})}),jd("div",{className:"mc__middle-row",children:[In("button",{"aria-label":"Move left",className:"mc__arrow mc__arrow--left",onMouseDown:()=>P("left",-1,x),onMouseUp:()=>z("left"),onMouseLeave:()=>z("left"),onTouchStart:A=>{A.preventDefault(),P("left",-1,x)},onTouchEnd:()=>z("left"),onTouchCancel:()=>z("left"),children:In(hl,{direction:"left"})}),In("div",{ref:s,className:"mc__joystick",onMouseDown:M,onTouchStart:M,children:In("div",{className:"mc__knob",style:{transform:`translate(${l.x}px, ${l.y}px)`}})}),In("button",{"aria-label":"Move right",className:"mc__arrow mc__arrow--right",onMouseDown:()=>P("right",1,x),onMouseUp:()=>z("right"),onMouseLeave:()=>z("right"),onTouchStart:A=>{A.preventDefault(),P("right",1,x)},onTouchEnd:()=>z("right"),onTouchCancel:()=>z("right"),children:In(hl,{direction:"right"})})]}),In("button",{"aria-label":"Move backward",className:"mc__arrow mc__arrow--down",onMouseDown:()=>P("down",-1,C),onMouseUp:()=>z("down"),onMouseLeave:()=>z("down"),onTouchStart:A=>{A.preventDefault(),P("down",-1,C)},onTouchEnd:()=>z("down"),onTouchCancel:()=>z("down"),children:In(hl,{direction:"down"})})]})}):null},fg=iC;import{HexColorPicker as sC}from"react-colorful";import{jsx as xl,jsxs as hg}from"react/jsx-runtime";var Id=({colorPicker:e,onClose:t,itemMaterials:n,setItemMaterials:a,inline:r=!1})=>hg("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:[xl("p",{className:"ri-popoverLabel",children:"Color"}),xl(sC,{color:n[e.objectId]?.hex??"#ffffff",onChange:o=>a(s=>({...s,[e.objectId]:{...s[e.objectId],hex:o}}))}),hg("div",{className:"ri-inlineRow",children:[xl("span",{className:"ri-colorCode",children:n[e.objectId]?.hex??"#ffffff"}),xl("button",{className:"ri-secondaryButton",onClick:t,children:"Done"})]})]});import{jsx as yr,jsxs as Fd}from"react/jsx-runtime";var Vd=({materialPopup:e,textureUrl:t,triggerFileUpload:n,clearTexture:a,inline:r=!1})=>Fd("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:[yr("div",{className:"ri-popoverHeader",children:yr("p",{className:"ri-popoverLabel",style:{marginBottom:0},children:"Material"})}),Fd("div",{className:"ri-materialBody",children:[t?yr("div",{className:"ri-previewFrame",children:yr("img",{src:t,alt:"texture preview",className:"ri-previewImage"})}):Fd("div",{className:"ri-emptyState",children:[yr("svg",{width:"24",height:"24",fill:"none",stroke:"currentColor",strokeWidth:1.5,viewBox:"0 0 24 24",children:yr("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"})}),yr("span",{style:{fontSize:12},children:"No texture applied"})]}),yr("button",{onClick:()=>n(e.objectId),className:"ri-uploadButton",children:t?"Replace image":"Upload image"}),t&&yr("button",{onClick:()=>a(e.objectId),className:"ri-removeButton",children:"Remove texture"}),yr("p",{className:"ri-formatHint",children:"JPG \xB7 PNG \xB7 WebP"})]})]});import{Fragment as lC,useEffect as Ud,useRef as cC,useState as Hd}from"react";import{Fragment as Gd,jsx as an,jsxs as Aa}from"react/jsx-runtime";function xg({entries:e}){return an(Gd,{children:e.map(([t,n])=>{let a=n!==null&&typeof n=="object",r=a?Object.entries(n):[];return a&&r.length>0?Aa("div",{className:"left-panel__data-group",children:[an("span",{className:"left-panel__data-key",children:t}),an("div",{className:"left-panel__data-children",children:an(xg,{entries:r})})]},t):Aa("div",{className:"left-panel__data-row",children:[an("span",{className:"left-panel__data-key",children:t}),an("span",{className:`left-panel__data-value left-panel__data-value--${typeof n}`,children:a?Array.isArray(n)?"[]":"{}":String(n)})]},t)})})}function dC({content:e}){let t=e!=null,[n,a]=Hd(t),[r,o]=Hd(t),s=cC(e);return t&&(s.current=e),Ud(()=>{if(t){a(!0);return}if(n){o(!1);let l=setTimeout(()=>a(!1),300);return()=>clearTimeout(l)}},[t,n]),Ud(()=>{if(n&&t){let l=requestAnimationFrame(()=>o(!0));return()=>cancelAnimationFrame(l)}},[n,t]),n?an("div",{className:`left-panel__action-extra${r?" left-panel__action-extra--open":""}`,children:an("div",{className:"left-panel__action-extra-inner",children:e??s.current})}):null}function Wd({isOpen:e,selectedObject:t,currentAction:n,onClose:a,onAction:r,renderActionExtra:o}){let[s,l]=Hd(t);Ud(()=>{t&&l(t)},[t]);let i=t??s,c=i?Object.entries(i).filter(([d])=>d!=="actions"):[];return an("div",{className:`left-panel ${e?"left-panel--open":"left-panel--closed"}`,children:i&&Aa(Gd,{children:[Aa("div",{className:"left-panel__header",children:[an("p",{className:"left-panel__title",children:i.label}),an("button",{onClick:a,className:"left-panel__close-btn","aria-label":"Close panel",children:"\u2715"})]}),c.length>0&&an("div",{className:"left-panel__data",children:an(xg,{entries:c})}),an("hr",{className:"left-panel__divider"}),i.actions&&i.actions.length>0&&Aa(Gd,{children:[an("div",{className:"left-panel__actions-label",children:"Actions"}),an("div",{className:"left-panel__actions-list",children:i.actions.map((d,u)=>{let b=n?.action.id===d.id&&(n.binding===i||n.binding?.id===i.id||n.binding?.modelObjectId===i.modelObjectId||n.objectId===i.id||n.objectId===i.modelObjectId),g=o?.(d.id);return Aa(lC,{children:[an("button",{onClick:h=>r({objectId:i.modelObjectId||i.id||"",action:d,binding:i,screenX:h.clientX,screenY:h.clientY}),className:["left-panel__action-btn",`left-panel__action-btn--${d.id}`,b?"left-panel__action-btn--active":""].filter(Boolean).join(" "),"data-action-id":d.id,"data-label":d.label,children:d.label}),an(dC,{content:g})]},u)})})]})]})})}import{useMemo as uC,useState as yg}from"react";import{Boxes as mC}from"lucide-react";import{useState as pC}from"react";import{jsx as jr,jsxs as Di}from"react/jsx-runtime";function vg({openButtonLabel:e,openButtonAriaLabel:t,eyebrow:n,title:a,searchValue:r,onSearchChange:o,searchPlaceholder:s,children:l,isOpen:i,onToggle:c,openButtonIcon:d,closeButtonIcon:u,closeButtonAriaLabel:b}){let[g,h]=pC(!1),w=i!==void 0?i:g,B=v=>{i===void 0&&h(v),c?.(v)};return Di("div",{className:`ri-sidepanel-wrap ${w?"ri-sidepanel-wrap--open":"ri-sidepanel-wrap--closed"}`,children:[!w&&Di("button",{type:"button",className:"ri-sidepanel__open-btn",onClick:()=>B(!0),"aria-label":t,title:"Open panel",children:[d,e?jr("span",{children:e}):null]}),Di("div",{className:`ri-sidepanel ${w?"ri-sidepanel--open":"ri-sidepanel--closed"}`,"aria-hidden":!w,children:[Di("div",{className:"ri-sidepanel__header",children:[Di("div",{className:"ri-sidepanel__header-top",children:[jr("span",{className:"ri-sidepanel__eyebrow",children:n}),jr("button",{type:"button",className:"ri-sidepanel__close-btn",onClick:()=>B(!1),"aria-label":b,title:"Close",children:u??jr("svg",{width:"12",height:"12",viewBox:"0 0 12 12",fill:"none","aria-hidden":"true",children:jr("path",{d:"M1 1L11 11M11 1L1 11",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round"})})})]}),jr("p",{className:"ri-sidepanel__title",children:a})]}),jr("div",{className:"ri-sidepanel__search-wrap",children:jr("input",{className:"ri-sidepanel__search",type:"text",placeholder:s,value:r,onChange:v=>o(v.target.value)})}),jr("div",{className:"ri-sidepanel__list",children:l})]})]})}import{jsx as Eo,jsxs as bC}from"react/jsx-runtime";function $d({objectBindings:e,onAction:t,onFocus:n,onHover:a,isOpen:r,onToggle:o}){let[s,l]=yg(null),[i,c]=yg(""),d=uC(()=>Object.entries(e).filter(([u,b])=>{let g=i.toLowerCase();return u.toLowerCase().includes(g)||(b.label??"").toLowerCase().includes(g)}),[e,i]);return Eo(vg,{openButtonLabel:"",openButtonAriaLabel:"Open scene objects panel",openButtonIcon:Eo(mC,{width:16,height:16,"aria-hidden":"true"}),eyebrow:"SCENE OBJECTS",title:`${d.length} visible entries`,searchValue:i,onSearchChange:c,searchPlaceholder:"Search nodes, labels",isOpen:r,onToggle:o,closeButtonAriaLabel:"Close scene objects panel",children:d.map(([u,b])=>{let g=b.visible!==!1,h=s===u;return bC("div",{onClick:()=>n(b),onMouseEnter:()=>{l(u),a?.(b)},onMouseLeave:()=>{l(null),a?.(null)},className:`ri-sidepanel__row${h?" ri-sidepanel__row--hovered":""}`,children:[Eo("span",{className:`ri-sidepanel__label${h?" ri-sidepanel__label--hovered":""}`,children:b.label??u}),Eo("button",{type:"button",onClick:w=>{w.stopPropagation(),t?.({objectId:u,action:{id:"toggle-visibility",label:"Toggle Visibility",type:"command"},binding:b})},className:"ri-sidepanel__vis-btn",title:g?"Hide":"Show",children:Eo("span",{className:`ri-sidepanel__checkbox${g?" ri-sidepanel__checkbox--checked":""}`,children:g&&Eo("svg",{width:"9",height:"9",viewBox:"0 0 10 10",fill:"none",children:Eo("path",{d:"M1.5 5L4 7.5L8.5 2.5",stroke:"white",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round"})})})})]},u)})})}import{AlertTriangle as np,Box as Wg,Camera as nS,Download as rS,Eraser as oS,FileImage as aS,RotateCcw as iS,ChevronLeft as sS,Square as $g,ChevronRight as lS,RectangleGoggles as cS,QrCode as dS,X as rp,Expand as pS,Play as uS,Pause as mS,Smartphone as Xg,PencilRuler as bS,RulerDimensionLine as gS,Grid3X3 as fS}from"lucide-react";import{createContext as gC,useContext as fC}from"react";var Xd=gC({isInsideEditor:!1,activeTab:"object",activeSubTab:"General",tier:"free"});var Yn=()=>fC(Xd);import{jsx as wg,jsxs as hC}from"react/jsx-runtime";function Ba({visible:e,message:t,tone:n="default",spinner:a=!0}){return e?hC("div",{className:"bb-loadingOverlay",role:"status","aria-live":"polite",children:[a&&wg("span",{className:"bb-loadingSpinner","aria-hidden":"true"}),wg("span",{className:`bb-loadingMessage bb-status--${n}`,children:t})]}):null}var Kd=new WeakSet;function Oa(e){Kd.add(e)}function Cg(e){let t=Kd.has(e);return t&&Kd.delete(e),t}import{useRef as ut,useEffect as Ni,useMemo as Ir,useSyncExternalStore as wC}from"react";import{useThree as CC,useFrame as SC}from"@react-three/fiber";import{Sphere as MC,Line as kC}from"@react-three/drei";import{Vector3 as Vt,Vector2 as PC,AdditiveBlending as Yd,Plane as Pg,TextureLoader as TC}from"three";var Sg="data:image/png;base64,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";var Mg="data:image/png;base64,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";var kg="data:image/png;base64,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";import{Fragment as jC,jsx as Ne,jsxs as gn}from"react/jsx-runtime";var Ea=-100,La=100,Ng=.03,RC=.03,AC=.03,Tg=.5,BC=Sg,OC=Mg,EC=kg,LC=Math.PI/4,Rg=.4,Na=64,Ag=Ng*3,Jd="#4d7dff",Bg="#ffcc00",Og=.02,_g=new Vt(0,1,0),vl=32,Eg="#ff9d3d",yl=4,wr=1.4,wl=.35,DC=.13,Lg=.12,Dg=.055,NC={x:"#ff4444",y:"#44ff44",z:"#4444ff"};function zg(e){return new Vt(e==="x"?1:0,e==="y"?1:0,e==="z"?1:0)}function _C(e,t){let n=zg(e);t.lengthSq()<1e-8&&(t=n.clone());let a=new Vt().crossVectors(n,new Vt().crossVectors(t,n));if(a.lengthSq()<1e-8){let r=Math.abs(n.y)<.9?_g:new Vt(1,0,0);a=new Vt().crossVectors(n,r)}return a.normalize()}function qd(e){let t=new Float32Array((Na+1)*3);for(let n=0;n<=Na;n++){let a=n/Na*Math.PI*2,r=Math.cos(a)*Rg,o=Math.sin(a)*Rg,s=0,l=0,i=0;e==="x"?(l=r,i=o):e==="y"?(s=r,i=o):(s=r,l=o),t[n*3]=s,t[n*3+1]=l,t[n*3+2]=i}return t}function zC(e){let t=Math.abs(e.y)<.99?new Vt(0,1,0):new Vt(1,0,0),n=new Vt().crossVectors(e,t).normalize(),a=new Vt().crossVectors(e,n).normalize();return[n,a]}function Da(e,t,n){return Math.min(Math.max(e,t),n)}var _a=null,Zd=new Set;function _i(e){_a!==e&&(_a=e,Zd.forEach(t=>t()))}function Qd(e){return Zd.add(e),()=>Zd.delete(e)}function Cl(){return _a}function jg({light:e,position:t,color:n,intensity:a,visible:r,onPositionChange:o,onDraggingChange:s}){let{activeTab:l,activeSubTab:i,setActiveTab:c,setActiveSubTab:d}=Yn(),{camera:u,gl:b,raycaster:g,invalidate:h}=CC(),w=ut(null),B=ut(null),v=ut(null),p=ut(null),m=ut(null),S=ut(null),M=ut(null),k=ut(null),R=ut(null),f=ut(null),C=ut(null),x=ut(null),P=ut(null),z=ut(null),A=ut(null),j=ut(null),T=ut(null),I=ut({dragging:!1,axis:null}),F=ut(new Pg),O=ut(new Vt),E=ut(null),W=ut(null),U=ut(new Vt),ae=ut(!1),xe=ut(new Pg),le=ut(s);Ni(()=>{le.current=s},[s]);let ge=Ir(()=>new Vt(t[0],t[1],t[2]),[t]),he=Ir(()=>new Float32Array(6),[]),Se=Ir(()=>new Float32Array(6),[]),at=Ir(()=>qd("x"),[]),wt=Ir(()=>qd("y"),[]),Xe=Ir(()=>qd("z"),[]),Me=Ir(()=>new Float32Array((vl+1)*3),[]),Te=Ir(()=>new Float32Array(yl*2*3),[]),At=e?.type==="point",Ke=e?.type==="spot",nn=At?OC:Ke?EC:BC,Ye=At?RC:Ke?AC:Ng,qt=Ir(()=>new TC().load(nn),[nn]),Bt=wC(Qd,Cl,Cl),Be=!!e&&Bt===e.id;if(Ni(()=>{ae.current||(U.current.copy(ge),h())},[ge,h]),Ni(()=>{e&&_a===e.id&&!r&&_i(null)},[e?.id,r]),Ni(()=>()=>{e&&_a===e.id&&_i(null)},[e?.id]),SC(()=>{if(w.current&&w.current.position.copy(U.current),v.current){v.current.lookAt(u.position);let ee=u,oe;ee.isOrthographicCamera?oe=Ye/ee.zoom:oe=u.position.distanceTo(U.current)*Ye,v.current.scale.setScalar(oe)}if(M.current){let ee=u,oe;ee.isOrthographicCamera?oe=Ag/ee.zoom:oe=u.position.distanceTo(U.current)*Ag,M.current.scale.setScalar(oe)}if(C.current){let ee=u,oe;ee.isOrthographicCamera?oe=Dg/ee.zoom:oe=u.position.distanceTo(U.current)*Dg,C.current.scale.setScalar(oe)}if(m.current){let ee=m.current.getAttribute("position"),oe=ee.array;oe[0]=0,oe[1]=0,oe[2]=0,oe[3]=U.current.x,oe[4]=U.current.y,oe[5]=U.current.z,ee.needsUpdate=!0,m.current.computeBoundingSphere()}if(S.current){let ee=U.current,oe=ee.length();S.current.visible=oe>Tg,oe>1e-6&&(S.current.position.copy(ee).multiplyScalar(.5),S.current.scale.set(1,oe,1),S.current.quaternion.setFromUnitVectors(_g,ee.clone().normalize()))}if(p.current&&(p.current.visible=U.current.length()>Tg),Ke&&k.current&&R.current&&f.current){let ee=U.current,oe=ee.length();if(oe>1e-6){k.current.visible=!0;let Ot=ee.clone().negate().normalize(),it=oe,Ge=e?.angle??Math.PI/6,Je=it*Math.tan(Ge),Et=ee.clone().add(Ot.clone().multiplyScalar(it)),[Ut,Dt]=zC(Ot),Sn=R.current.getAttribute("position"),pn=Sn.array;for(let Fe=0;Fe<=vl;Fe++){let Re=Fe/vl*Math.PI*2,ht=Et.x+(Ut.x*Math.cos(Re)+Dt.x*Math.sin(Re))*Je,rt=Et.y+(Ut.y*Math.cos(Re)+Dt.y*Math.sin(Re))*Je,xt=Et.z+(Ut.z*Math.cos(Re)+Dt.z*Math.sin(Re))*Je;pn[Fe*3]=ht,pn[Fe*3+1]=rt,pn[Fe*3+2]=xt}Sn.needsUpdate=!0,R.current.computeBoundingSphere();let me=f.current.getAttribute("position"),et=me.array;for(let Fe=0;Fe<yl;Fe++){let Re=Fe/yl*Math.PI*2,ht=Et.x+(Ut.x*Math.cos(Re)+Dt.x*Math.sin(Re))*Je,rt=Et.y+(Ut.y*Math.cos(Re)+Dt.y*Math.sin(Re))*Je,xt=Et.z+(Ut.z*Math.cos(Re)+Dt.z*Math.sin(Re))*Je,Nt=Fe*6;et[Nt]=ee.x,et[Nt+1]=ee.y,et[Nt+2]=ee.z,et[Nt+3]=ht,et[Nt+4]=rt,et[Nt+5]=xt}me.needsUpdate=!0,f.current.computeBoundingSphere()}else k.current.visible=!1}if(E.current&&(E.current.visible=I.current.dragging),W.current&&I.current.dragging){let ee=W.current.getAttribute("position"),oe=ee.array;oe[0]=O.current.x,oe[1]=O.current.y,oe[2]=O.current.z,oe[3]=U.current.x,oe[4]=U.current.y,oe[5]=U.current.z,ee.needsUpdate=!0,W.current.computeBoundingSphere()}}),Ni(()=>{let ee=me=>{let et=b.domElement.getBoundingClientRect();return new PC((me.clientX-et.left)/et.width*2-1,-((me.clientY-et.top)/et.height)*2+1)},oe=me=>!!me.target.closest?.("button, input, textarea, .ri-annotationPopup, .ri-colorPicker, .ri-materialPicker"),Ot=()=>{let me=[];return[x.current,A.current,P.current,j.current,z.current,T.current].forEach(et=>{et&&me.push(et)}),me},it=me=>me===x.current||me===A.current?"x":me===P.current||me===j.current?"y":me===z.current||me===T.current?"z":null,Ge=()=>{I.current.dragging&&(I.current={dragging:!1,axis:null},E.current&&(E.current.visible=!1),b.domElement.style.cursor="default",le.current?.(!1))},Je=()=>{ae.current&&(ae.current=!1,b.domElement.style.cursor="default",le.current?.(!1))},Et=me=>{if(I.current.dragging&&I.current.axis){let rt=I.current.axis,xt=U.current,Nt=zg(rt),Mn=new Vt().subVectors(u.position,xt),Z=_C(rt,Mn);F.current.setFromNormalAndCoplanarPoint(Z,xt);let L=ee(me);g.setFromCamera(L,u);let _=new Vt,H=g.ray.intersectPlane(F.current,_);if(!H)return;let Y=H.clone().sub(xt).dot(Nt),ie=xt.clone().add(Nt.clone().multiplyScalar(Y)),re=[Da(rt==="x"?ie.x:xt.x,Ea,La),Da(rt==="y"?ie.y:xt.y,Ea,La),Da(rt==="z"?ie.z:xt.z,Ea,La)];U.current.set(re[0],re[1],re[2]),o?.(re),h();return}if(!ae.current)return;let et=ee(me);g.setFromCamera(et,u);let Fe=new Vt,Re=g.ray.intersectPlane(xe.current,Fe);if(!Re)return;let ht=[Da(Re.x,Ea,La),Da(Re.y,Ea,La),Da(Re.z,Ea,La)];U.current.set(ht[0],ht[1],ht[2]),o?.(ht),h()},Ut=me=>{if(oe(me))return;let et=ee(me);if(g.setFromCamera(et,u),Be){let ht=Ot(),rt=ht.length?g.intersectObjects(ht,!1):[];if(rt.length>0){let xt=rt[0].object,Nt=it(xt);if(Nt){let Mn=U.current;I.current={dragging:!0,axis:Nt},O.current.copy(Mn),le.current?.(!0),b.domElement.style.cursor="grabbing",b.domElement.setPointerCapture(me.pointerId),me.preventDefault(),me.stopPropagation();return}}}let Fe=[];if(B.current&&Fe.push(B.current),v.current&&Fe.push(v.current),Fe.length===0)return;if(g.intersectObjects(Fe,!1).length>0){let ht=e?.id??null;_a!==ht&&(_i(ht),c?.("scene"),d?.("Lighting"));let rt=new Vt;u.getWorldDirection(rt),xe.current.setFromNormalAndCoplanarPoint(rt,U.current),ae.current=!0,le.current?.(!0),b.domElement.style.cursor="grabbing",b.domElement.setPointerCapture(me.pointerId),me.preventDefault(),me.stopPropagation()}},Dt=me=>{if(I.current.dragging){Ge();try{b.domElement.releasePointerCapture(me.pointerId)}catch{}}if(ae.current){Je();try{b.domElement.releasePointerCapture(me.pointerId)}catch{}}},Sn=()=>{Ge(),Je()},pn=()=>{Ge(),Je()};return b.domElement.addEventListener("pointerdown",Ut),window.addEventListener("pointermove",Et),window.addEventListener("pointerup",Dt),window.addEventListener("pointercancel",Sn),window.addEventListener("blur",pn),()=>{b.domElement.removeEventListener("pointerdown",Ut),window.removeEventListener("pointermove",Et),window.removeEventListener("pointerup",Dt),window.removeEventListener("pointercancel",Sn),window.removeEventListener("blur",pn)}},[u,g,b,h,o,e,c,d,Be]),l!=="scene"||i!=="Lighting"||!e||!r||e.type==="none"||e.type==="hemisphere")return null;let nt=["x","y","z"];return gn("group",{ref:ee=>{ee&&Ru(ee)},children:[gn("group",{ref:w,children:[Ne("sprite",{ref:v,children:Ne("spriteMaterial",{map:qt,transparent:!0,opacity:.9,blending:Yd,depthWrite:!1,rotation:Ke?LC:0},nn)}),Ne(MC,{ref:B,args:[.25,16,16],children:Ne("meshBasicMaterial",{transparent:!0,opacity:.01})}),At&&gn("group",{ref:M,children:[gn("lineLoop",{renderOrder:999,children:[Ne("bufferGeometry",{children:Ne("bufferAttribute",{attach:"attributes-position",args:[at,3],count:Na+1})}),Ne("lineBasicMaterial",{color:Jd,transparent:!0,opacity:.6,depthTest:!1,depthWrite:!1})]}),gn("lineLoop",{renderOrder:999,children:[Ne("bufferGeometry",{children:Ne("bufferAttribute",{attach:"attributes-position",args:[wt,3],count:Na+1})}),Ne("lineBasicMaterial",{color:Jd,transparent:!0,opacity:.6,depthTest:!1,depthWrite:!1})]}),gn("lineLoop",{renderOrder:999,children:[Ne("bufferGeometry",{children:Ne("bufferAttribute",{attach:"attributes-position",args:[Xe,3],count:Na+1})}),Ne("lineBasicMaterial",{color:Jd,transparent:!0,opacity:.6,depthTest:!1,depthWrite:!1})]})]}),Be&&Ne("group",{ref:C,children:nt.map(ee=>{let oe=NC[ee],Ot=new Vt(ee==="x"?wr:0,ee==="y"?wr:0,ee==="z"?wr:0),it=new Vt(ee==="x"?wr-wl/2:0,ee==="y"?wr-wl/2:0,ee==="z"?wr-wl/2:0),Ge=new Vt(ee==="x"?wr/2:0,ee==="y"?wr/2:0,ee==="z"?wr/2:0),Je=ee==="x"?[0,0,-Math.PI/2]:ee==="y"?[0,0,0]:[Math.PI/2,0,0],Et=ee==="x"?x:ee==="y"?P:z,Ut=ee==="x"?A:ee==="y"?j:T;return gn("group",{children:[Ne(kC,{points:[new Vt(0,0,0),Ot],color:oe,transparent:!0,opacity:.9,lineWidth:2,depthTest:!1}),gn("mesh",{ref:Ut,position:Ge,rotation:Je,children:[Ne("cylinderGeometry",{args:[Lg,Lg,wr,8]}),Ne("meshBasicMaterial",{transparent:!0,opacity:0,depthWrite:!1})]}),gn("mesh",{ref:Et,position:it,rotation:Je,children:[Ne("coneGeometry",{args:[DC,wl,8]}),Ne("meshBasicMaterial",{color:oe,depthTest:!1})]})]},ee)})})]}),!At&&!Ke&&gn(jC,{children:[gn("mesh",{ref:S,children:[Ne("cylinderGeometry",{args:[Og,Og,1,8,1,!0]}),Ne("meshBasicMaterial",{color:Bg,transparent:!0,opacity:.05,blending:Yd,depthWrite:!1,depthTest:!1})]}),gn("line",{ref:p,children:[Ne("bufferGeometry",{ref:m,children:Ne("bufferAttribute",{attach:"attributes-position",args:[he,3],count:2})}),Ne("lineBasicMaterial",{color:Bg,transparent:!0,opacity:.7,blending:Yd})]})]}),Ke&&gn("group",{ref:k,children:[gn("lineLoop",{renderOrder:999,children:[Ne("bufferGeometry",{ref:R,children:Ne("bufferAttribute",{attach:"attributes-position",args:[Me,3],count:vl+1})}),Ne("lineBasicMaterial",{color:Eg,transparent:!0,opacity:.85,depthTest:!1,depthWrite:!1})]}),gn("lineSegments",{renderOrder:999,children:[Ne("bufferGeometry",{ref:f,children:Ne("bufferAttribute",{attach:"attributes-position",args:[Te,3],count:yl*2})}),Ne("lineBasicMaterial",{color:Eg,transparent:!0,opacity:.5,depthTest:!1,depthWrite:!1})]})]}),gn("line",{ref:ee=>{E.current=ee,ee&&(ee.visible=!1)},children:[Ne("bufferGeometry",{ref:W,children:Ne("bufferAttribute",{attach:"attributes-position",args:[Se,3],count:2})}),Ne("lineBasicMaterial",{color:"#ffffff",transparent:!0,opacity:.6})]})]})}import{useCallback as ep,useLayoutEffect as UC,useMemo as Cr,useRef as to}from"react";import{PivotControls as HC}from"@react-three/drei";import{useFrame as GC,useThree as WC}from"@react-three/fiber";import{Euler as Hg,Matrix4 as Ml,Quaternion as kl,Vector3 as zi}from"three";import{Box3 as Ig,Euler as IC,Matrix4 as Fg,Quaternion as FC,Vector3 as eo}from"three";function Sl(e){e.updateWorldMatrix(!0,!0);let t=new Fg().copy(e.matrixWorld).invert(),n=new Ig,a=new Ig,r=!1;return e.traverse(o=>{let s=o;if(!s.isMesh||!s.geometry||(s.geometry.boundingBox||s.geometry.computeBoundingBox(),!s.geometry.boundingBox))return;let l=new Fg().multiplyMatrices(t,o.matrixWorld);a.copy(s.geometry.boundingBox).applyMatrix4(l),n.union(a),r=!0}),r?n.getCenter(new eo):new eo}function Vg(e,t="XYZ"){return new FC().setFromEuler(new IC(e[0],e[1],e[2],t))}function VC(e,t,n,a,r="XYZ"){let s=new eo(...a).multiply(new eo(...n)).applyQuaternion(Vg(t,r)).add(new eo(...e));return[s.x,s.y,s.z]}function Ug(e,t,n,a,r,o="XYZ"){let s=new eo(...VC(e,t,a,r,o)),l=new eo(...r).multiply(new eo(...a)).applyQuaternion(Vg(n,o)),i=s.sub(l);return[i.x,i.y,i.z]}import{jsx as Gg}from"react/jsx-runtime";function tp({node:e,space:t,onTransformChange:n,onDraggingChange:a}){let r=WC(x=>x.invalidate),o=Cr(()=>Sl(e),[e]),s=Cr(()=>new Ml,[]),l=to(!1),i=to(new Ml),c=to(new Ml),d=to(null),u=to(0),b=to([]),g=to(null),h=Cr(()=>new zi,[]),w=Cr(()=>new kl,[]),B=Cr(()=>new zi,[]),v=Cr(()=>new kl,[]),p=Cr(()=>new zi(1,1,1),[]),m=Cr(()=>new kl,[]),S=Cr(()=>new zi,[]),M=Cr(()=>new zi,[]),k=to([0,0,0]),R=ep(()=>{l.current||(e.updateWorldMatrix(!0,!1),h.copy(o).applyMatrix4(e.matrixWorld),e.getWorldQuaternion(w),v.copy(w),t==="world"&&v.identity(),s.compose(h,v,p))},[h,s,v,p,e,o,t,w]);UC(()=>(R(),()=>{g.current!==null&&(cancelAnimationFrame(g.current),g.current=null),a(!1);for(let x of b.current)va(x);b.current=[]}),[a,R]),GC(()=>R());let f=ep(()=>{g.current!==null&&(cancelAnimationFrame(g.current),g.current=null),e.updateWorldMatrix(!0,!0),b.current=[];for(let x of xa(e))eb(x)||(Fs(x,x.matrixWorld),b.current.push(x));e.updateWorldMatrix(!0,!1),h.copy(o).applyMatrix4(e.matrixWorld),e.getWorldQuaternion(w),e.getWorldScale(B),i.current.compose(h,w,B),c.current.copy(s),k.current=[e.rotation.x,e.rotation.y,e.rotation.z],d.current=null,l.current=!0,a(!0)},[h,s,e,a,o,w,B]),C=ep((x,P)=>{let z=i.current.clone().premultiply(P),A=c.current.clone().premultiply(P);z.decompose(S,w,M);let j=S.clone();A.decompose(h,v,p),t==="world"&&v.identity(),s.compose(h,v,p),x.decompose(S,m,M);let T=new Hg().setFromQuaternion(m,e.rotation.order),[I,F,O]=k.current,E=[I+T.x,F+T.y,O+T.z],W=new kl().setFromEuler(new Hg(E[0],E[1],E[2],e.rotation.order)),ae=(e.parent?.matrixWorld||new Ml).clone().invert(),xe=j.clone().applyMatrix4(ae),le=o.clone().multiply(e.scale).applyQuaternion(W),ge=xe.clone().sub(le),he=[ge.x,ge.y,ge.z];e.position.set(he[0],he[1],he[2]),e.rotation.set(E[0],E[1],E[2],e.rotation.order),e.updateMatrixWorld(!0),r(),d.current={position:he,rotation:E}},[h,m,s,v,p,r,e,o,S,M,t,w]);return Gg("group",{children:Gg(HC,{matrix:s,autoTransform:!1,fixed:!0,scale:90,lineWidth:3,axisColors:["#ff2d6f","#64dfa6","#2f8fe8"],hoveredColor:"#ffd84d",opacity:.95,depthTest:!1,disableScaling:!0,onDragStart:f,onDrag:(x,P,z,A)=>C(P,A),onDragEnd:()=>{l.current=!1;let x=d.current;if(d.current=null,x)n(x),g.current=requestAnimationFrame(()=>{g.current=null,a(!1)});else if(b.current.length>0){for(let P of b.current)va(P);e.updateMatrixWorld(!0),r(),a(!1)}else a(!1);b.current=[]}})})}import{Fragment as Lo,jsx as $,jsxs as Ae}from"react/jsx-runtime";function hS(e){let t=e.object;if(!t.isSkinnedMesh||!e.face||!t.skeleton)return null;let n=t.geometry,a=n.getAttribute("skinIndex"),r=n.getAttribute("skinWeight"),o=n.getAttribute("position");if(!a||!r||!o)return null;let s=t.worldToLocal(e.point.clone()),l=[e.face.a,e.face.b,e.face.c],i=new En,c=l[0],d=1/0;for(let g of l){i.fromBufferAttribute(o,g);let h=i.distanceToSquared(s);h<d&&(d=h,c=g)}let u=a.getComponent(c,0),b=r.getComponent(c,0);for(let g=1;g<4;g++){let h=r.getComponent(c,g);h>b&&(b=h,u=a.getComponent(c,g))}return t.skeleton.bones[u]??null}function xS(e){let t=hS(e)??e.object,n=hi(t);if(!n)return null;t.updateWorldMatrix(!0,!1);let a=t.worldToLocal(e.point.clone());return{anchorNodeName:n,anchorLocalPosition:[a.x,a.y,a.z]}}function vS(e,t,n){if(!e.anchorNodeName||!e.anchorLocalPosition)return!1;let a=ar(t,e.anchorNodeName);return a?(a.updateWorldMatrix(!0,!1),n.set(...e.anchorLocalPosition).applyMatrix4(a.matrixWorld),!0):!1}function yS({annotation:e,enabled:t,controlsRef:n,offsetRef:a}){let r=JC(b=>b.scene),o=mt(null),s=mt(!1),l=vn(()=>new En,[]),i=vn(()=>new En,[]),c=vn(()=>new En,[]),d=e?.anchorNodeName,u=e?.anchorLocalPosition;return ft(()=>{o.current=null,s.current=!1},[d,e?.id]),YC(()=>{let b=n.current,g=a.current;if(!t||!b||!g||!d||!u){s.current=!1;return}let h=o.current;if((!h||!h.parent)&&(h=ar(r,d),o.current=h),!h){s.current=!1;return}h.updateWorldMatrix(!0,!1),l.set(u[0],u[1],u[2]).applyMatrix4(h.matrixWorld),!(s.current&&l.distanceToSquared(i)<1e-8)&&(i.copy(l),s.current=!0,c.copy(l).add(g),b.setLookAt(c.x,c.y,c.z,l.x,l.y,l.z,!0))}),null}function wS(e){let t={total:0,missing:0};return e.traverse(n=>{let a=n;!a.isMesh||!a.geometry||(t.total+=1,a.geometry.getAttribute("uv")||(t.missing+=1))}),t}function CS(e,t){let n=t?.camera;if(!(n instanceof ZC))return;let r=new Pl().setFromObject(e).getSize(new En).length();!Number.isFinite(r)||r<=0||(n.near=r/100,n.far=r*100,n.updateProjectionMatrix(),t&&(t.maxDistance=r*10))}async function Kg(e,t,n=.6){let a=e.smoothTime;e.smoothTime=n;try{return await t()}finally{e.smoothTime=a}}function Tl({modelUrl:e,tilesetUrl:t,tilesErrorTarget:n=8,tilesCacheSize:a=800,modelFormat:r,licenseKey:o,licenseValidationUrl:s,objectBindings:l,selectedObject:i,panelHoveredObject:c,onObjectBindingsChange:d,onObjectSelect:u,onObjectHover:b,onObjectEditLeaseChange:g,onModelLoaded:h,onLoadError:w,onAction:B,onHiddenObjectsChange:v,onCameraChange:p,onViewerReady:m,onTextureUpload:S,onAnimationsReady:M,onAnnotationsChange:k,activeAnnotation:R,onActiveAnnotationChange:f,lights:C,camera:x,backgroundColor:P,shadows:z=!0,showObjectBindingDataPanel:A=!0,customObjectBindingDataPanel:j,customSceneObjectsPanel:T,showSceneObjectsPanel:I=!0,showDownloadButton:F=!0,downloadFilename:O="model",showResetButton:E=!0,showLoadingOverlay:W=!0,showMouseController:U=!1,mouseControllerPosition:ae="center-bottom",mouseControllerOpacity:xe=1,moveSensitivity:le=.08,zoomSensitivity:ge=1,sceneConfig:he,onSceneConfigChange:Se,disableZoom:at=!1,zoomOnSelected:wt=!0,highlightOnHover:Xe=!0,enableCameraControls:Me=!0,onAutoFit:Te,refitOnResize:At=!0,renderMode:Ke="demand",maxDpr:nn=2,preserveDrawingBuffer:Ye=!1,performanceProfile:qt="auto",dracoDecoderPath:Bt,ktx2TranscoderPath:Be,meshopt:nt=!0,showMeasureTools:ee=!1,showUvCheckerButton:oe=!1,showExplodeControls:Ot=!1,cinematic:it,measurementUnit:Ge="m",enableXR:Je=!1,usdzUrl:Et,arScaleMode:Ut="normalized",mobileHandoffUrl:Dt,showAnnotationNavigation:Sn=!0,showAnnotationOnHover:pn=!1,moveModeEnabled:me=!1,objectTransformSpace:et="world",enableKeyboardNavigation:Fe=!1,showViewGizmo:Re=!1}){let{isInsideEditor:ht,activeTab:rt,activeSubTab:xt}=Yn(),Nt=ht&&rt==="scene"&&xt==="Lighting",Mn=fl(o,s),Z=vn(()=>he??ho,[he]),[L,_]=_e(null),H=Z.model.renderer==="uv-checker",K=oe?L??H:H,Y=vn(()=>{let y=K?"uv-checker":H?"pbr":Z.model.renderer;return y===Z.model.renderer?Z:{...Z,model:{...Z.model,renderer:y}}},[H,Z,K]);ft(()=>{_(null)},[e,Z.model.renderer,oe,t]);let ie=vn(()=>{if(P)return P;let y=Z.background;return y.enabled&&y.type==="color"?y.color:"#1c1c1d"},[P,Z]),re=vn(()=>({dracoDecoderPath:Bt,ktx2TranscoderPath:Be,meshopt:nt}),[Bt,Be,nt]),tt=vn(()=>Fu(qt),[qt]),se=mt(null),[vt,De]=_e(!1);ft(()=>{se.current&&(se.current.dollySpeed=Math.max(ge,0))},[ge]),ft(()=>{se.current&&(se.current.enabled=Me&&!vt)},[Me,vt]);let qe=mt(null),de=mt(new Map),lt=mt(null),Ht=mt(null),st=mt(null),Ct=mt({});ft(()=>()=>{for(let y of Object.values(Ct.current))URL.revokeObjectURL(y)},[]);let ct=mt({}),[,Ce]=_e(0),Vr=ye(()=>{Ce(y=>y+1)},[]),Wa=mt({}),$a=mt(null),kn=mt(null),[Wo,Vl]=_e(null),Ul=ye(y=>{kn.current=y,Vl(y)},[]),Mr=mt(new Set),ot=mt(null);ft(()=>{let y=Wo;if(!y||!Fe||!Me||me)return;let N=new Set(["w","a","s","d"," ","c"]),Q=new Set(["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"]),ne=0,ue=Ve=>Ve.code==="Space"?" ":Ve.key.toLowerCase(),Ee=()=>{Mr.current.clear(),ne=0,ot.current!==null&&(cancelAnimationFrame(ot.current),ot.current=null)},Qt=Ve=>{let St=se.current,Ze=Mr.current;if(!St||Ze.size===0){ot.current=null,ne=0;return}let An=ne?Math.min((Ve-ne)/1e3,.05):1/60;ne=Ve;let en=Math.max(St.distance*.75,.01)*An;Ze.has("w")&&St.forward(en,!1),Ze.has("s")&&St.forward(-en,!1),Ze.has("a")&&St.truck(-en,0,!1),Ze.has("d")&&St.truck(en,0,!1),Ze.has(" ")&&St.truck(0,en,!1),Ze.has("c")&&St.truck(0,-en,!1),ot.current=requestAnimationFrame(Qt)},Rn=Ve=>{if(Ve.target!==y){Ee();return}if(Q.has(Ve.key)){let Ze=se.current;if(!Ze)return;Ve.preventDefault();let An=Math.PI/90,en=Math.max(Ze.distance*.05,.01);Ve.key==="ArrowUp"?Ve.shiftKey?Ze.forward(en,!0):Ze.rotate(0,-An,!0):Ve.key==="ArrowDown"?Ve.shiftKey?Ze.forward(-en,!0):Ze.rotate(0,An,!0):Ve.key==="ArrowLeft"?Ze.rotate(-An,0,!0):Ze.rotate(An,0,!0);return}let St=ue(Ve);N.has(St)&&(Ve.preventDefault(),Mr.current.add(St),ot.current===null&&(ot.current=requestAnimationFrame(Qt)))},jt=Ve=>{Mr.current.delete(ue(Ve))};return y.addEventListener("keydown",Rn),y.addEventListener("keyup",jt),y.addEventListener("blur",Ee),()=>{y.removeEventListener("keydown",Rn),y.removeEventListener("keyup",jt),y.removeEventListener("blur",Ee),Ee()}},[Wo,Me,Fe,me]);let lo=mt(null),[dr,Xi]=_e(l),[co,$o]=_e({}),[_n,Xa]=_e(null),[Wn,Xo]=_e(null),[Hl,Gl]=_e(null),[Ka,Ya]=_e(null),[zn,Ki]=_e(null),[pr,Ko]=_e(null),Zt=mt(null),ur=mt(!1),po=mt(!1),Ja=mt(!!x);Ja.current=!!x;let rr=mt(null),[Yo,uo]=_e(!!e),[Jo,mo]=_e(!e||!!Te||!!x),[kr,Yi]=_e(!1),[Wl,qa]=_e(!1),[Ji,qo]=_e(!1),[Za,qi]=_e(!1),[Zi,$l]=_e(null),[Xl,Qi]=_e(!1),[bo,es]=_e({total:0,missing:0}),[ts,Pr]=_e("Loading model..."),Zo=mt({}),D=ye(()=>{let y=se.current;if(!y||rr.current)return;let N=y.getPosition(new En),Q=y.getTarget(new En);rr.current={position:[N.x,N.y,N.z],target:[Q.x,Q.y,Q.z]}},[]),[V,te]=_e(!1),[be,ke]=_e(0),[_t,dt]=_e(!1);ft(()=>{ke(0),dt(!1)},[e,t]);let Oe=vn(()=>{let y=Z.cinematic,N=y?.enabled?{waypoints:y.waypoints,duration:y.duration,loop:y.loop,autoPlay:y.autoPlay}:null;return it===void 0?N&&(N.waypoints?.length??0)>=2?N:null:it===!1?null:it===!0?N??{}:{...N??{},...it}},[it,Z]),[Pn,mr]=_e(!1),[Xh,Qo]=_e(!1),Kl=mt(!1);ft(()=>{mr(!1),Qo(!1),Kl.current=!1},[e,t]),ft(()=>{!Oe?.autoPlay||Kl.current||kr&&Jo&&!Yo&&(Kl.current=!0,mr(!0),Qo(!1))},[Oe,kr,Jo,Yo]);let{xrStore:go,presenterRef:Kh,arSupported:Yl,vrSupported:$p,quickLookSupported:Xp,resolvedMobileHandoffUrl:ns,isMobileHandoffOpen:Kp,arOverlay:Yh,openMobileHandoff:Jh,closeMobileHandoff:Yp,openQuickLook:qh,handleARStateChange:Zh}=Hu({enableXR:Je,usdzUrl:Et,mobileHandoffUrl:Dt}),[br,Jp]=_e(()=>he?.annotations??[]);ft(()=>{if(br.length>0){let y=br.reduce((N,Q)=>Math.max(N,Q.id),0);as.current=y}else as.current=0},[br]);let[Tn,rs]=_e(null),[Ur,os]=_e({title:"",description:""}),as=mt(0),[Qh,qp]=_e(null),[$n,ea]=_e(-1),[Zp,is]=_e(!1),ta=mt(null),zt=vn(()=>[...br].sort((y,N)=>y.id-N.id),[br]),ss=vn(()=>$n<0||$n>=zt.length?null:zt[$n],[$n,zt]),gr=ye(y=>{if(R!==void 0){f?.(y);return}qp(y?{annotation:y}:null)},[R,f]),na=ye(y=>{let N=se.current,Q=Zt.current;if(!N)return;let ne=new En,ue=de.current.get(y.id);ue?ne.copy(ue):Q&&vS(y,Q,ne)||ne.set(y.worldPosition[0],y.worldPosition[1],y.worldPosition[2]),qe.current=null;let Ee=N.smoothTime;N.smoothTime=.6;let Qt=y.worldNormal;if(Q){let Rn=new Pl().setFromObject(Q),jt=new En;Rn.getCenter(jt);let Ve=new En;Rn.getSize(Ve);let St=Ve.length()*.2,Ze;Qt?Ze=new En(Qt[0],Qt[1],Qt[2]):Ze=ne.clone().sub(jt),Ze.lengthSq()<1e-6&&Ze.set(0,0,1),Ze.normalize();let An=Math.max(St*.6,.3),en=ne.clone().add(Ze.multiplyScalar(An));N.setPosition(en.x,en.y,en.z,!0),y.anchorNodeName&&y.anchorLocalPosition&&(qe.current=en.clone().sub(ne))}N.setTarget(ne.x,ne.y,ne.z,!0),ta.current&&clearTimeout(ta.current),ta.current=setTimeout(()=>{N.smoothTime=Ee,ta.current=null},800),gr(y)},[gr]),e0=ye(()=>{zt.length!==0&&(te(!0),ea(0),na(zt[0]))},[zt,na]),t0=ye(()=>{if(zt.length===0||$n<0)return;is(!0);let y=($n-1+zt.length)%zt.length;ea(y),na(zt[y]),setTimeout(()=>is(!1),500)},[$n,zt,na]),n0=ye(()=>{if(zt.length===0||$n<0)return;if($n===zt.length-1){if(te(!1),ea(-1),gr(null),se.current&&rr.current){let N=rr.current;se.current.setLookAt(N.position[0],N.position[1],N.position[2],N.target[0],N.target[1],N.target[2],!0)}return}is(!0);let y=$n+1;ea(y),na(zt[y]),setTimeout(()=>is(!1),500)},[$n,zt,na,gr]),r0=ye(()=>{if(te(!1),ea(-1),gr(null),se.current&&rr.current){let y=rr.current;se.current.setLookAt(y.position[0],y.position[1],y.position[2],y.target[0],y.target[1],y.target[2],!0)}},[gr]);ft(()=>{ea(-1),te(!1)},[zt.length]),ft(()=>()=>{ta.current&&clearTimeout(ta.current)},[]),ft(()=>{ss&&V&&gr(ss)},[ss,gr,V]),ft(()=>{if(he?.annotations===void 0)return;let y=he.annotations.map(N=>({...N,localPosition:N.localPosition??N.worldPosition}));Jp(y)},[he?.annotations]);let Qa=ye(()=>{if(R!==void 0){f?.(null);return}qp(null)},[R,f]),ei=R!==void 0?R:Qh?.annotation??null,ti=vn(()=>ei?br.find(N=>N.id===ei.id)??null:null,[ei,br]);ft(()=>{ei&&!ti&&Qa()},[ei,ti,Qa]);let ni=d!==void 0,gt=ni?l:dr;Zo.current=gt;let o0=vn(()=>Object.entries(gt).map(([y,N])=>JSON.stringify([y,N.modelObjectId,N.transform??null])).sort().join(""),[gt]),{measureMode:ri,measureModeRef:a0,measurePoints:Qp,showDimensions:Jl,measureBox:eu,modelBounds:i0,refreshBounds:tu,clearMeasurements:s0,toggleMeasureMode:l0,toggleDimensions:c0,handleMeasurePointerDown:d0,handleMeasureClick:p0}=ju({canvasAreaRef:kn,controlsRef:se,sceneRef:Zt,modelUrl:e,modelRotation:Z.model.rotation,bindingTransformSignature:o0,modelLoaded:kr}),{isDownloading:ql,downloadMenuOpen:u0,uvExportError:nu,toggleDownloadMenu:m0,handleDownloadMesh:b0,handleDownloadScreenshot:g0,handleDownloadUvLayout:f0}=_u({sceneRef:Zt,materialRefs:Wa,rendererCaptureRef:st,objectBindings:gt,downloadFilename:O}),ru=vn(()=>Object.fromEntries(Object.entries(gt).filter(([,y])=>y.visible===!1).map(([y])=>[y,!0])),[gt]),Tr=vn(()=>{let y=new WeakMap,N=new Map,Q=new Map;for(let[ne,ue]of Object.entries(gt))y.set(ue,ne),N.has(ue.id)||N.set(ue.id,ne),Q.has(ue.modelObjectId)||Q.set(ue.modelObjectId,ne);return{byReference:y,byId:N,byModelObjectId:Q}},[gt]),Hr=ye(y=>y?Tr.byReference.get(y)??Tr.byModelObjectId.get(y.modelObjectId)??Tr.byId.get(y.id)??null:null,[Tr]),Zl=i!==void 0,oi=Zl?i??null:Ka,fr=Hr(oi),Ql=fr?ct.current[fr]??null:null,ou=Hr(Xe?c??Wn??Hl:null),h0=ou?ct.current[ou]??null:null,x0=ye(y=>{Gl(y),b?.(y)},[b]),au=A&&oi!==null&&fr!==null,iu=(fr?gt[fr]:null)??oi;ft(()=>{ni||Xi(l)},[ni,l]),ft(()=>{v?.(ru)},[ru,v]);let ra=ye(y=>{Zl||Ya(y),u?.(y)},[Zl,u]),oa=ye(y=>{ni||Xi(y),d?.(y)},[ni,d]),v0=ye(y=>{let N=fr;if(!N||!y)return;let Q=Zo.current[N];Q&&oa({...Zo.current,[N]:{...Q,transform:{...Q.transform,...y}}})},[oa,fr]),Rr=ye((y,N)=>gt[y]?y:N?Hr(N):Tr.byId.get(y)??Tr.byModelObjectId.get(y)??null,[gt,Hr,Tr]),ai=ye((y,N)=>{let Q=Rr(y),ne=Q?gt[Q]:void 0;!Q||!ne||oa({...gt,[Q]:{...ne,style:N(ne.style)}})},[Rr,gt,oa]),Xn=ye(()=>{if(zn){let y=co[zn.objectId]?.hex;y!==void 0&&(ai(zn.objectId,N=>({...N,material:{...N?.material,baseColor:y}})),$o(N=>({...N,[zn.objectId]:{}})))}Ki(null)},[zn,co,ai]),su=ye(()=>{ra(null),Xa(null),Xn(),Ko(null)},[ra,Xn]),ec=ye((y,N,Q,ne,ue)=>{let Ee=$a.current,Qt=kn.current,Rn=se.current?.camera;if(!Ee)return{objectId:y,x:24,y:24};let jt=Ee.getBoundingClientRect(),Ve=12,St=jt.width-N-Ve,Ze=jt.height-Q-Ve,An=Math.max(Ve,(jt.width-N)/2),en=Math.max(Ve,(jt.height-Q)/2),ia=Rr(y,ne),xu=ia?ct.current[ia]:null,cs=(sa,fo)=>fo<=Ve?Ve:Math.min(Math.max(sa,Ve),fo);if(Qt&&Rn&&xu){let sa=Qt.getBoundingClientRect(),fo=new En;new Pl().setFromObject(xu).getCenter(fo),fo.project(Rn);let _0=(fo.x+1)/2*sa.width+(sa.left-jt.left),z0=(1-fo.y)/2*sa.height+(sa.top-jt.top);return{objectId:y,x:cs(_0+24,St),y:cs(z0-Q/2,Ze)}}let D0=typeof ue?.screenX=="number"?ue.screenX-jt.left:An,N0=typeof ue?.screenY=="number"?ue.screenY-jt.top:en;return{objectId:y,x:cs(D0,St),y:cs(N0,Ze)}},[Rr]),ls=ye(y=>{let{objectId:N,action:Q,binding:ne}=y;switch(Xa(y),Q.id){case"toggle-visibility":{let ue=N;ne?.modelObjectId&&(ue=Tr.byModelObjectId.get(ne.modelObjectId)??ue);let Ee=gt[ue],Qt=Ee?.visible===!1;Ee&&oa({...gt,[ue]:{...Ee,visible:Qt}});break}case"change-color":Xn(),Ko(null),$o(ue=>{let Ee=Rr(N,ne)??N,Qt=ue[N]?.hex,Rn=gt[Ee]?.style?.material?.baseColor;return{...ue,[N]:{...ue[N],hex:Qt??Rn??"#ffffff"}}}),Ki(ec(N,225,250,ne,y));break;case"change-material":Xn(),Ko(ec(N,300,320,ne,y));break;default:break}B?.(y)},[oa,gt,ec,B,Xn,Rr,Tr]);ft(()=>{if(zn)return window.addEventListener("pointerdown",Xn),()=>window.removeEventListener("pointerdown",Xn)},[zn,Xn]),ft(()=>{if(!pr)return;let y=()=>Ko(null);return window.addEventListener("pointerdown",y),()=>window.removeEventListener("pointerdown",y)},[pr]),ft(()=>{if(!ti)return;let y=N=>{if(lo.current&&!lo.current.contains(N.target)){if(N.target.closest?.(".ri-annotationMarker"))return;Qa()}};return document.addEventListener("mousedown",y),document.addEventListener("touchstart",y),()=>{document.removeEventListener("mousedown",y),document.removeEventListener("touchstart",y)}},[ti,Qa]),ft(()=>{if(!Tn)return;let y=N=>{let Q=N.target;if(Q.closest?.(".ri-annotationPopup")||Q.closest?.("button, input, textarea, .ri-measureTools, .ri-xrTools, .ri-buttonContainer"))return;let ne=kn.current;!ne||!ne.contains(Q)||(rs(null),os({title:"",description:""}))};return document.addEventListener("mousedown",y,!0),document.addEventListener("touchstart",y,!0),()=>{document.removeEventListener("mousedown",y,!0),document.removeEventListener("touchstart",y,!0)}},[Tn]);let lu=ye((y,N)=>{let Q=Ct.current[y];Q&&URL.revokeObjectURL(Q),N.startsWith("blob:")?Ct.current[y]=N:delete Ct.current[y],ai(y,ne=>({...ne,material:{...ne?.material,texture:{path:N}}}))},[ai]),y0=y=>{let N=y.target.files?.[0],Q=Ht.current;if(!N||!Q)return;let ne=Rr(Q);ne&&(S?S(N,ne).then(ue=>lu(ne,ue),ue=>console.error("onTextureUpload failed:",ue)):lu(ne,URL.createObjectURL(N)),y.target.value="")},cu=y=>{Ht.current=y,lt.current?.click()},du=y=>{let N=Rr(y);if(!N)return;ai(N,ne=>ne?.material?.texture?{...ne,material:{...ne.material,texture:void 0}}:ne);let Q=Ct.current[N];Q&&(URL.revokeObjectURL(Q),delete Ct.current[N])},tc=mt(m);tc.current=m;let or=ye(()=>{let y=se.current;!y||!tc.current||tc.current({controls:y,scene:Zt.current,objectBindings:Zo.current,nodeRefs:ct.current,homeCameraState:rr.current,captureImage:N=>fs(st.current,N),invalidate:()=>st.current?.invalidate()})},[]),aa=ye(async(y=!1)=>{let N=se.current,Q=Zt.current;if(!N||!Q)return!1;try{if(y){let ne=N.getTarget(new En),Ee=N.getPosition(new En).clone().sub(ne);Ee.lengthSq()<1e-6&&Ee.set(0,0,1),Ee.normalize();let Qt=new Pl().setFromObject(Q).getBoundingSphere(new eS),Rn=Math.max(Qt.radius*10,20),jt=ne.clone().add(Ee.multiplyScalar(Rn));await N.setLookAt(jt.x,jt.y,jt.z,ne.x,ne.y,ne.z,!1)}return mo(!0),await Kg(N,()=>N.fitToBox(Q,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5})),await new Promise(ne=>{let ue=performance.now(),Ee=()=>{N.active===!1||performance.now()-ue>8e3?(N.dispatchEvent({type:"update"}),st.current?.invalidate(),ne()):(st.current?.invalidate(),setTimeout(Ee,100))};setTimeout(Ee,100)}),ur.current=!0,D(),or(),!0}catch(ne){return console.error("Fit scene error:",ne),!1}},[D,or]);ft(()=>{if(ur.current=!1,po.current=!1,rr.current=null,Zt.current=null,Yi(!1),qa(!1),qo(!1),es({total:0,missing:0}),Pr("Loading model..."),!e){uo(!1),mo(!0);return}uo(!0),mo(!!Te||Ja.current);let y=!1,N=null,Q=ue=>{N=setTimeout(ne,ue)},ne=()=>{if(y||ur.current||po.current)return;if(!se.current||!Zt.current){Q(100);return}if(CS(Zt.current,se.current),Cg(se.current)){ur.current=!0,D(),or(),uo(!1),mo(!0),st.current?.invalidate();return}po.current=!0,(Te?Te():Ja.current?Promise.resolve(!0):aa(!0)).then(Ee=>{ur.current=Ee!==!1,ur.current?(D(),or(),uo(!1)):y||Q(100)}).catch(()=>{ur.current=!1,y||Q(100)}).finally(()=>{po.current=!1})};return Q(50),()=>{y=!0,N&&clearTimeout(N)}},[D,aa,e,or,Te,t]),ft(()=>{if(!At)return;let y=Wo;if(!y)return;let N=null,Q=new ResizeObserver(()=>{!ur.current||po.current||(N&&clearTimeout(N),N=setTimeout(()=>{aa()},150))});return Q.observe(y),()=>{Q.disconnect(),N&&clearTimeout(N)}},[Wo,aa,At]);let w0=ye(y=>{if(a0.current||(mr(!1),Xn(),Ko(null),Xa(null),ra(y),at||!wt))return;let N=se.current,Q=Hr(y),ne=Q?ct.current[Q]:null;N&&y.cameraState?.position&&y.cameraState?.target?(N.setPosition(y.cameraState.position[0],y.cameraState.position[1],y.cameraState.position[2],!0),N.setTarget(y.cameraState.target[0],y.cameraState.target[1],y.cameraState.target[2],!0)):N&&ne&&N.fitToBox(ne,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5}).catch(()=>{})},[ra,Xn,Hr,at,wt]),pu=ye(y=>{if(ra(y),at)return;let N=se.current,Q=Hr(y),ne=Q?ct.current[Q]:null;if(!N||!ne)return;let ue=y.cameraState;ue?.position&&ue?.target?(N.setPosition(ue.position[0],ue.position[1],ue.position[2],!0),N.setTarget(ue.target[0],ue.target[1],ue.target[2],!0)):N.fitToBox(ne,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5}).catch(()=>{})},[ra,Hr,at]);ft(()=>{or()},[or]);let uu=ye((y,N)=>{p?.(y,N),or()},[or,p]),mu=ye(y=>{Zt.current=y,tu(y),es(wS(y));let N=di(y);$l(N>vo?N:null),Qi(!1),N>vo&&Pr(`Preparing large model (${Math.round(N/1e6)}M triangles) \u2014 the first display can take a while on this device...`),Yi(!0),qa(!1),qi(!1),h?.(y),or()},[or,h,tu]),bu=ye(y=>{uo(!1),mo(!0),qa(!0),w?.(y)},[w]),C0=ye((y,N)=>{if(!Se)return;let Q={...Z,lighting:{...Z.lighting,lights:Z.lighting.lights.map(ne=>ne.id===y?{...ne,position:N}:ne)}};Se(Q)},[Z,Se]);ft(()=>{let y=Zt.current;if(!kr||!y){qo(!1);return}let N=Object.entries(gt);if(N.length===0){qo(!1);return}let Q=new Set(Object.keys(ha(y).nodesById)),ne=N.some(([ue,Ee])=>!Q.has(Ee.modelObjectId??ue));qo(ne)},[kr,gt]);let nc=ye(async()=>{if(Te){await Te();return}let y=se.current;if(!y)return;let N=rr.current;try{N?await Kg(y,()=>y.setLookAt(N.position[0],N.position[1],N.position[2],N.target[0],N.target[1],N.target[2],!0)):await aa()}catch(Q){console.error("Reset camera error:",Q)}},[Te,aa]),Mk=ye(()=>{Qo(!1),mr(!0)},[]),kk=ye(()=>{mr(!1)},[]),S0=ye(()=>{mr(!1),Qo(!0),setTimeout(()=>{nc()},100)},[nc]),M0=ye((y,N)=>{uu(y,N)},[uu]),k0=ye(y=>{if(rt!=="scene"||xt!=="Annotations"||y.target.closest("button, input, textarea, .ri-colorPicker, .ri-materialPicker, .ri-annotationPopup, .ri-annotationMarker, .ri-viewAnnotationPopup"))return;let Q=kn.current,ne=se.current?.camera,ue=Zt.current;if(!Q||!ne||!ue)return;let Ee=Q.getBoundingClientRect(),Qt=(y.clientX-Ee.left)/Ee.width*2-1,Rn=-((y.clientY-Ee.top)/Ee.height)*2+1,jt=new QC;jt.setFromCamera(new tS(Qt,Rn),ne);let Ve=jt.intersectObject(ue,!0);if(Ve.length===0)return;let St=Ve[0],Ze=St.point,An=ue.worldToLocal(St.point.clone()),en=[0,0,1];if(St.face){let ia=St.face.normal.clone().transformDirection(St.object.matrixWorld).normalize();en=[ia.x,ia.y,ia.z]}rs({worldPosition:[Ze.x,Ze.y,Ze.z],localPosition:[An.x,An.y,An.z],worldNormal:en,anchor:xS(St),screenX:y.clientX-Ee.left,screenY:y.clientY-Ee.top}),os({title:"",description:""})},[rt,xt]),gu=ye(()=>{if(!Tn||!Ur.title.trim())return;as.current+=1;let N={id:as.current,worldPosition:Tn.worldPosition,localPosition:Tn.localPosition,worldNormal:Tn.worldNormal,anchorNodeName:Tn.anchor?.anchorNodeName,anchorLocalPosition:Tn.anchor?.anchorLocalPosition,title:Ur.title.trim(),description:Ur.description},Q=[...br,N];Jp(Q),k?.(Q),rs(null)},[Tn,Ur,br,k]),rc=ye(()=>rs(null),[]),P0=ye(y=>{gr(y)},[gr]);if(Mn.status==="checking")return $("div",{className:"ri-viewer ri-viewer--license-checking",children:$(yo,{title:"Verifying License",message:"Checking your license key..."})});if(Mn.status==="invalid")return $("div",{className:"ri-viewer ri-viewer--license-invalid",children:$(yo,{tone:"error",title:"Invalid License",message:Mn.isLocalDomain?Mn.reason??"License has been revoked or has expired":"Failed to load. Please contact the site administrator."})});let fu=pr?Rr(pr.objectId):null,hu=fu?gt[fu]?.style?.material?.texture?.path:void 0,T0=kn.current?.offsetWidth??600,R0=kn.current?.offsetHeight??400,A0=350,B0=290,O0=Tn?Math.min(Tn.screenX+12,T0-A0-8):0,E0=Tn?Math.min(Tn.screenY,R0-B0-8):0,L0=W&&!!e&&!Wl&&(!kr||!Jo||Yo),ii=Je&&(go&&(Yl||$p)||Xp||!!ns),si=y=>16+y*42;return Ae("div",{className:"ri-viewer",style:{background:ie},children:[Ae("div",{className:"ri-viewerLeft",ref:$a,children:[j?j({isOpen:au,selectedObject:iu,currentAction:_n,onClose:su,onAction:ls}):$(Wd,{isOpen:au,selectedObject:iu,currentAction:_n,onClose:su,onAction:ls,renderActionExtra:y=>y==="change-color"&&zn?$(Id,{inline:!0,colorPicker:zn,onClose:Xn,itemMaterials:co,setItemMaterials:$o}):y==="change-material"&&pr?$(Vd,{inline:!0,triggerFileUpload:cu,materialPopup:pr,textureUrl:hu,clearTexture:du}):null}),Ae("div",{className:`ri-canvasArea ${ri?"ri-canvasArea--measuring":""} ${Jo?"":"ri-canvasArea--positioning"} ${me?"ri-canvasArea--moveMode":""}`,ref:Ul,tabIndex:Fe?0:void 0,onDoubleClick:k0,onPointerDown:y=>{Fe&&kn.current?.focus({preventScroll:!0}),d0(y)},onClick:p0,children:[Ji&&!Za&&Ae("div",{className:"ri-bindingsMismatchBanner",children:[$(np,{size:14,className:"ri-bindingsMismatchBanner__icon"}),$("span",{children:"Object bindings data don't match this model"}),$("button",{type:"button",className:"ri-bindingsMismatchBanner__dismiss",onClick:y=>{y.stopPropagation(),qi(!0)},"aria-label":"Dismiss",children:$(rp,{size:12})})]}),Zi!==null&&!Xl&&Ae("div",{className:`ri-largeModelBanner ${Ji&&!Za?"ri-largeModelBanner--offset":""}`,children:[$(np,{size:14,className:"ri-largeModelBanner__icon"}),Ae("span",{children:["Very large model (",Math.round(Zi/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:y=>{y.stopPropagation(),Qi(!0)},"aria-label":"Dismiss",children:$(rp,{size:12})})]}),Y.model.renderer==="uv-checker"&&bo.missing>0&&Ae("div",{className:"ri-uvCheckerBanner",role:"status",children:[$(np,{size:14,className:"ri-uvCheckerBanner__icon"}),Ae("span",{children:[bo.missing===bo.total?"UV Checker: this model has no UV0 coordinates.":`UV Checker: ${bo.missing} of ${bo.total} meshes have no UV0 coordinates.`," ","Missing UVs are shown in magenta."]})]}),$("input",{ref:lt,type:"file",accept:"image/png,image/jpeg,image/webp",className:"ri-hiddenInput",onChange:y0}),Ae(zc,{camera:x,backgroundColor:P,shadows:z&&Z.shadows.enabled,sceneConfig:Y,selectedObjectRef:Ql,hoveredObjectRef:h0,highlightOnHover:Xe,renderMode:Ke,maxDpr:nn,reduceGpuLoad:tt,xrStore:go,rendererCaptureRef:st,preserveDrawingBuffer:Ye,children:[C??Ae(Lo,{children:[$(Vc,{lightingConfig:Z.lighting,shadowConfig:Z.shadows,shadowsEnabled:z,environmentRotation:Z.environment.rotation,environmentConfig:Z.environment,modelBounds:i0,objectBindings:gt,nodeRefs:ct}),Nt&&Z.lighting.lights.map(y=>!y.visible||y.type==="none"||y.type==="hemisphere"||y.attachment?null:$(jg,{light:y,position:y.position,color:y.color,intensity:y.intensity,visible:y.visible,onPositionChange:N=>C0(y.id,N)},y.id))]}),$(jc,{controlsRef:se,onCameraChange:M0}),Re&&$(XC,{alignment:"top-right",margin:[80,80],renderPriority:2,onUpdate:()=>{se.current?.update(0),st.current?.invalidate()},children:$(KC,{axisColors:["#ff3653","#8adb00","#2c8fff"],labelColor:"white"})}),me&&Ql&&fr&&$(tp,{node:Ql,space:et,onTransformChange:v0,onDraggingChange:y=>{De(y),oi&&g?.(oi,y)}},fr),$(gs,{onLoadError:bu,children:$($C,{fallback:null,children:(()=>{let y=Ae(Lo,{children:[t?$(Pd,{url:t,rotation:Y.model.rotation,errorTarget:n,cacheSize:a,onModelLoaded:mu,onLoadError:bu}):$(ed,{url:e,modelFormat:r,objectBindings:gt,selectedItem:fr,itemMaterials:co,onItemClick:w0,onItemHover:x0,onModelLoaded:mu,onAnimationsReady:M,nodeRefsOut:ct,onNodeRefsChange:Vr,materialRefsOut:Wa,panelHoveredItem:c??Wn,sceneConfig:Y,zoomOnSelected:wt,highlightOnHover:Xe,decoderConfig:re,explodeFactor:be,suspendBindingTransforms:vt}),$(Bd,{annotations:br,sceneConfig:Z,activeAnnotation:ti,popupRef:lo,canvasRootRef:kn,worldPositionsRef:de,modelLoaded:kr,onAnnotationClick:P0,onCloseAnnotation:Qa,hideCloseButton:V,showAnnotationOnHover:pn}),$(yS,{annotation:ss,enabled:V,controlsRef:se,offsetRef:qe}),Oe&&$(Ed,{controlsRef:se,sceneRef:Zt,config:Oe,playing:Pn,resetOnPlay:Xh,onFinished:()=>{mr(!1),Qo(!1)},onUserInteract:()=>{mr(!1)}}),ee&&$(Od,{points:Qp,unit:Ge,box:eu,showDimensions:Jl})]});return go?$(ag,{ref:Kh,box:eu,scaleMode:Ut,onARStateChange:Zh,children:y}):y})()})},t??e)]}),$(Ba,{visible:L0,message:ts}),ii&&Ae("div",{className:"ri-xrTools",style:{top:`${si(0)}px`},children:[!Yl&&Xp&&Ae("button",{type:"button",className:"ri-xrButton",onClick:qh,title:"View this model in AR with Apple Quick Look",children:[$(Wg,{size:16}),"View in AR"]}),ns&&Ae("button",{type:"button",className:"ri-xrButton",onClick:Jh,title:"Open this experience on a phone for AR","aria-haspopup":"dialog","aria-expanded":Kp,children:[$(dS,{size:16}),$("span",{children:"Open on phone"})]}),go&&Yl&&Ae("button",{type:"button",className:"ri-xrButton",onClick:()=>go.enterAR().catch(y=>{console.error("Failed to enter AR session:",y)}),title:"View this model in your space",children:[$(Xg,{size:16}),$("span",{className:"ri-xrButtonPrefix",children:"Enter"}),$("span",{children:"AR"})]}),go&&$p&&Ae("button",{type:"button",className:"ri-xrButton",onClick:()=>go.enterVR().catch(y=>{console.error("Failed to enter VR session:",y)}),title:"View this model in VR",children:[$(cS,{size:16}),$("span",{className:"ri-xrButtonPrefix",children:"Enter"}),$("span",{children:"VR"})]})]}),Yh,Kp&&ns&&$("div",{className:"ri-mobileHandoffBackdrop",onMouseDown:y=>{y.target===y.currentTarget&&Yp()},children:Ae("section",{className:"ri-mobileHandoffDialog",role:"dialog","aria-modal":"true","aria-labelledby":"ri-mobileHandoffTitle",children:[$("button",{type:"button",className:"ri-mobileHandoffClose",onClick:Yp,"aria-label":"Close phone handoff",children:$(rp,{size:18})}),$(Xg,{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:$(qC,{value:ns,size:208,level:"M",marginSize:4,title:"QR code to open this model on a phone"})})]})}),oe&&$("div",{className:"ri-uvCheckerTools",style:{top:`${si(ii?1:0)}px`},children:$("button",{type:"button",className:`ri-measureButton ${K?"ri-measureButton--active":""}`,onClick:()=>_(y=>!(y??H)),title:K?"Disable UV checker":"Enable UV checker","aria-label":K?"Disable UV checker":"Enable UV checker","aria-pressed":K,children:$(fS,{size:16})})}),ee&&Ae("div",{className:"ri-measureTools",style:{top:`${si((ii?1:0)+(oe?1:0))}px`},children:[$("button",{type:"button",className:`ri-measureButton ${ri?"ri-measureButton--active":""}`,onClick:l0,title:ri?"Stop measuring":"Measure distance","aria-pressed":ri,children:$(bS,{size:16})}),$("button",{type:"button",className:`ri-measureButton ${Jl?"ri-measureButton--active":""}`,onClick:c0,title:"Toggle bounding dimensions","aria-pressed":Jl,children:$(gS,{size:16})}),Qp.length>0&&$("button",{type:"button",className:"ri-measureButton",onClick:s0,title:"Clear measurements",children:$(oS,{size:16})}),ri&&$("span",{className:"ri-measureHint",children:"Click points on the model to measure"})]}),Ot&&Ae("div",{className:"ri-explodeTools",style:{top:`${si((ii?1:0)+(oe?1:0)+(ee?1:0))}px`},children:[$("button",{type:"button",className:`ri-measureButton ${_t||be>0?"ri-measureButton--active":""}`,onClick:()=>dt(y=>!y),title:"Exploded view","aria-pressed":_t,children:$(pS,{size:16})}),_t&&$("div",{className:"ri-explodeSlider",onPointerDown:y=>y.stopPropagation(),children:$("input",{type:"range",min:0,max:100,value:Math.round(be*100),onChange:y=>ke(Number(y.target.value)/100),"aria-label":"Explode amount"})})]}),Oe&&Ae("div",{className:"ri-cinematicTools",style:{top:`${si((ii?1:0)+(oe?1:0)+(ee?1:0)+(Ot?1:0))}px`},children:[$("button",{type:"button",className:`ri-measureButton ${Pn?"ri-measureButton--active":""}`,onClick:()=>{Pn?mr(!1):(Qo(!1),mr(!0))},title:Pn?"Pause cinematic":"Play cinematic","aria-pressed":Pn,children:Pn?$(mS,{size:16}):$(uS,{size:16})}),Pn&&$("button",{type:"button",className:"ri-measureButton ri-measureButton--stop",onClick:S0,title:"Stop cinematic and reset camera",children:$($g,{size:16})})]}),(E||F||Sn&&zt.length>0)&&Ae("div",{className:"ri-buttonContainer",children:[$("div",{className:"ri-tourControls",children:Sn&&zt.length>0&&$(Lo,{children:V?Ae(Lo,{children:[Ae("button",{className:"ri-tourButton",onClick:t0,disabled:Zp||zt.length===0||$n<=0,title:"Previous annotation",children:[$(sS,{size:16}),$("span",{children:"Prev"})]}),$("button",{className:"ri-tourButton ri-tourButton--stop",onClick:r0,title:"Stop guided tour",children:$($g,{size:16})}),Ae("button",{className:"ri-tourButton ri-tourButton--next",onClick:n0,disabled:Zp||zt.length===0,title:"Next annotation",children:[$("span",{children:"Next"}),$(lS,{size:16})]})]}):$("button",{className:"ri-navButtonSingle",onClick:e0,disabled:zt.length===0,title:"Start guided tour",children:"Guided Tour"})})}),Ae("div",{className:"ri-rightControls",children:[E&&$("button",{className:"ri-resetButton",onClick:nc,title:"Reset camera view",children:$(iS,{})}),F&&Ae("div",{className:"ri-downloadWrapper",onPointerDown:y=>y.stopPropagation(),children:[u0&&Ae("div",{className:"ri-downloadMenu",children:[Ae("button",{className:"ri-downloadMenuItem",onClick:b0,disabled:ql||!Zt.current,children:[$(Wg,{size:14}),"Download GLB"]}),$("div",{className:"ri-downloadMenuDivider"}),Ye&&Ae(Lo,{children:[Ae("button",{className:"ri-downloadMenuItem",onClick:g0,disabled:!Zt.current,children:[$(nS,{size:14}),"Download PNG"]}),$("div",{className:"ri-downloadMenuDivider"})]}),Ae("button",{className:"ri-downloadMenuItem",onClick:f0,disabled:!Zt.current,children:[$(aS,{size:14}),"Download UV Layout"]}),nu&&$("div",{className:"ri-downloadMenuNotice",role:"status","aria-live":"polite",children:nu})]}),$("button",{className:"ri-downloadButton",onClick:m0,disabled:ql||!Zt.current,title:"Download options",children:ql?Ae(Lo,{children:[$("span",{className:"ri-downloadButton__spinner"}),"Exporting\u2026"]}):Ae(Lo,{children:[$(rS,{size:15}),"Download"]})})]})]})]}),Tn&&Ae("div",{className:"ri-annotationPopup",style:{left:O0,top:E0},onPointerDown:y=>y.stopPropagation(),onClick:y=>y.stopPropagation(),children:[$("input",{autoFocus:!0,className:"ri-annotationInput",placeholder:"Title *",value:Ur.title,onChange:y=>os(N=>({...N,title:y.target.value})),onKeyDown:y=>{y.key==="Enter"&&gu(),y.key==="Escape"&&rc()}}),$("textarea",{className:"ri-annotationTextarea",placeholder:"Description",value:Ur.description,onChange:y=>os(N=>({...N,description:y.target.value})),onKeyDown:y=>{y.key==="Escape"&&rc()},rows:5}),Ae("div",{className:"ri-annotationActions",children:[$("button",{onClick:gu,className:`ri-annotationOkBtn ${Ur.title.trim()?"":"disabled"}`,disabled:!Ur.title.trim(),children:"OK"}),$("button",{onClick:rc,className:"ri-annotationCancelBtn",children:"Cancel"}),$("div",{className:"ri-annotationIcons"})]})]})]}),j&&zn&&$(Id,{colorPicker:zn,onClose:Xn,itemMaterials:co,setItemMaterials:$o}),j&&pr&&$(Vd,{triggerFileUpload:cu,materialPopup:pr,textureUrl:hu,clearTexture:du})]}),I&&$("div",{className:"ri-viewerRight",children:T?T({objectBindings:gt,onAction:ls,onFocus:pu,onHover:Xo}):$($d,{objectBindings:gt,onAction:ls,onFocus:pu,onHover:Xo})}),U&&$(fg,{controlsRef:se,enabled:!0,opacity:xe,moveSensitivity:le,position:ae})]})}import{useCallback as dn,useEffect as Go,useMemo as Lp,useRef as Gn,useState as $e}from"react";import{Redo2 as wh,Undo2 as Ch,Upload as Sh,ListRestart as Mh,X as gM,AlertTriangle as fM}from"lucide-react";import{useCallback as Ln,useRef as za,useState as Yg}from"react";import{Vector3 as Jg}from"three";function qg(e){return[e.x,e.y,e.z]}function no(e,t){let n=new Jg,a=new Jg;return t.getPosition(n),t.getTarget(a),{position:qg(n),target:qg(a),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 SS(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 ji(e,t,n=.6){let a=e.smoothTime;e.smoothTime=n;try{return await t()}finally{e.smoothTime=a}}function op(e={}){let t=za(e);t.current=e;let n=za(null),[a,r]=Yg(null),[o,s]=Yg(()=>({...e.presets})),l=za(o);l.current=o;let i=Ln(C=>{r(x=>SS(x,C)?x:C)},[]),c=Ln((C,x)=>{i(no(C,x))},[i]),d=za(null),u=za(null),b=za(null),g=Ln(C=>{n.current=C;let x=no(C.controls.camera,C.controls);i(x),C.scene!==u.current&&(u.current=C.scene,d.current=null,b.current=null),C.homeCameraState&&!d.current&&(d.current=C.homeCameraState);let{initialPosition:P,initialTarget:z,initialTransition:A=!1}=t.current;if((P||z)&&C.scene&&(P||C.homeCameraState)&&b.current!==C.controls){b.current=C.controls,C.homeCameraState||Oa(C.controls);let j=P??x.position,T=z??x.target;C.controls.setLookAt(j[0],j[1],j[2],T[0],T[1],T[2],A).then(()=>{if(n.current?.controls!==C.controls)return;let I=no(C.controls.camera,C.controls);d.current={position:I.position,target:I.target},i(I)}).catch(()=>{})}},[i]),h=Ln(async()=>{let C=n.current,x=C?.controls;if(!x)return!1;try{let P=d.current;return P?await ji(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 ji(x,()=>x.fitToBox(C.scene,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5})):await ji(x,()=>x.reset(!0)),!0}catch{return!1}},[]),w=Ln(async()=>{let C=n.current;if(!C?.controls||!C.scene)return!1;try{return await ji(C.controls,()=>C.controls.fitToBox(C.scene,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5})),!0}catch{return!1}},[]),B=Ln(async C=>{let x=n.current;if(!x?.controls)return!1;let P=un(x.objectBindings,C);if(!P)return!1;let z=x.nodeRefs[P];if(!z)return!1;try{return await ji(x.controls,()=>x.controls.fitToBox(z,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5})),!0}catch{return!1}},[]),v=Ln(async(C,x=!0)=>{let P=n.current?.controls;if(!P)return!1;try{return n.current?.homeCameraState||Oa(P),await P.setTarget(C[0],C[1],C[2],x),i(no(P.camera,P)),!0}catch{return!1}},[i]),p=Ln(async(C,x=!0)=>{let P=n.current?.controls;if(!P)return!1;try{n.current?.homeCameraState||Oa(P);let z=[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&&z.push(P.rotateTo(C.azimuthAngle,C.polarAngle,x)),await Promise.all(z);let A=P.camera,j=!1;return C.fov!=null&&"fov"in A&&typeof A.fov=="number"&&(A.fov=C.fov,j=!0),C.zoom!=null&&"zoom"in A&&typeof A.zoom=="number"&&(A.zoom=C.zoom,j=!0),j&&"updateProjectionMatrix"in A&&A.updateProjectionMatrix(),i(no(A,P)),!0}catch{return!1}},[i]),m=Ln((C,x=!0)=>p(C,x),[p]),S=Ln((C,x,P=!0)=>p({position:C,target:x},P),[p]),M=Ln(async(C,x,P=!0)=>{let z=n.current?.controls;if(!z)return!1;try{return n.current?.homeCameraState||Oa(z),await z.rotateTo(C,x,P),i(no(z.camera,z)),!0}catch{return!1}},[i]),k=Ln(async(C,x=!0)=>{let P=n.current?.controls;if(!P)return!1;try{return n.current?.homeCameraState||Oa(P),await P.dollyTo(C,x),i(no(P.camera,P)),!0}catch{return!1}},[i]),R=Ln(C=>{let x=n.current?.controls,P=C.trim();if(!x||!P)return null;let z=no(x.camera,x);return l.current={...l.current,[P]:z},s(A=>({...A,[P]:z})),i(z),z},[i]),f=Ln((C,x=!0)=>{let P=l.current[C];return P?p(P,x):Promise.resolve(!1)},[p]);return{cameraState:a,cameraPresets:o,resetView:h,focusObject:B,fitScene:w,setCameraTarget:v,setCameraState:m,lookAt:S,orbitTo:M,dollyTo:k,savePreset:R,goToPreset:f,handleCameraChange:c,handleViewerReady:g}}import{useCallback as ja,useEffect as MS,useRef as Zg,useState as Do}from"react";function ap(){let e=Zg(null),[t,n]=Do([]),a=Zg(null),[r,o]=Do([]),[s,l]=Do(null),[i,c]=Do(!1),[d,u]=Do(1),[b,g]=Do(0),[h,w]=Do(0);MS(()=>()=>{a.current?.()},[]);let B=ja(k=>{a.current?.(),e.current=k,n(k.clips),o(k.clipDetails??k.clips.map(f=>({sourceName:f,duration:0})));let R=k.getState?.()??{currentClip:null,isPlaying:!1,speed:1,time:0,duration:0};l(R.currentClip),c(R.isPlaying),u(R.speed),g(R.time),w(R.duration),k.subscribe?a.current=k.subscribe(f=>{l(f.currentClip),c(f.isPlaying),u(f.speed),g(f.time),w(f.duration)}):a.current=null},[]),v=ja(k=>{e.current?.play(k),l(k),c(!0)},[]),p=ja(()=>{e.current?.pause(),c(!1)},[]),m=ja(()=>{e.current?.stop(),l(null),c(!1),g(0)},[]),S=ja(k=>{e.current?.setSpeed(k),u(k)},[]),M=ja(k=>{e.current?.seek?.(k),g(k)},[]);return{clips:t,clipDetails:r,currentClip:s,isPlaying:i,speed:d,time:b,duration:h,play:v,pause:p,stop:m,setSpeed:S,seek:M,handleAnimationsReady:B}}import{useState as w2,useEffect as C2}from"react";import{useState as NS}from"react";import{ChevronDown as _S,ChevronLeft as zS,ChevronRight as jS,RotateCcw as IS}from"lucide-react";import{HexColorInput as FS,HexColorPicker as VS}from"react-colorful";import{useLayoutEffect as PS,useRef as ef,useState as tf}from"react";import{createPortal as TS}from"react-dom";import{ChevronDown as RS,Info as AS}from"lucide-react";import{HexColorInput as BS,HexColorPicker as OS}from"react-colorful";function Ia(e){let t=e.replace("#","").match(/.{2}/g).map(a=>parseInt(a,16)/255).map(a=>a<=.03928?a/12.92:Math.pow((a+.055)/1.055,2.4));return .2126*t[0]+.7152*t[1]+.0722*t[2]>.179?"#000":"#fff"}import{useEffect as kS}from"react";function Qg(e,t,n){kS(()=>{if(!n)return;let a=Array.isArray(e)?e:[e],r=o=>{let s=o.target;a.some(i=>i.current?.contains(s))||t()};return document.addEventListener("pointerdown",r,!0),()=>{document.removeEventListener("pointerdown",r,!0)}},[e,t,n])}import{jsx as Ue,jsxs as yn}from"react/jsx-runtime";function ip({anchorRef:e,onClose:t,children:n}){let a=ef(null),[r,o]=tf(null);return Qg([a,e],t,!0),PS(()=>{let s=e.current;if(!s)return;let l=s.getBoundingClientRect(),i=222,c=8,d=Math.min(Math.max(l.right-i,c),window.innerWidth-i-c),u=Math.min(l.bottom+6,window.innerHeight-200);o({top:u,left:d})},[e]),r?TS(Ue("div",{ref:a,className:"se-colorPickerPopover",style:{position:"fixed",top:r.top,left:r.left},children:n}),document.body):null}function ES(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 yn("section",{className:"se-section",children:[Ue("h3",{className:"se-sectionTitle",children:e}),Ue("div",{className:"se-sectionBody",children:t})]})}function ze({title:e,open:t,onToggle:n,trailing:a,children:r,disabled:o,tooltip:s}){let l=s?`${s}`:e;return yn("section",{className:"se-panel",children:[yn("button",{type:"button",className:"se-panelHeader",onClick:n,"aria-expanded":t,title:l,children:[yn("span",{className:"se-panelHeaderMain",children:[Ue(RS,{size:16,className:`se-panelChevron ${t?"se-panelChevron--open":""}`}),Ue("span",{className:"se-panelTitle",children:e}),s?Ue("span",{className:"se-panelHelp",title:l,"aria-label":l,role:"img",onClick:i=>i.stopPropagation(),children:Ue(AS,{size:13})}):null]}),a?Ue("span",{className:"se-panelTrailing",onClick:i=>i.stopPropagation(),children:a}):null]}),t?Ue("div",{className:"se-panelBody",style:o?{opacity:.45,pointerEvents:"none"}:void 0,children:r}):null]})}function We({checked:e,onChange:t,label:n}){return yn("label",{className:"se-switch","aria-label":n,children:[Ue("input",{type:"checkbox",checked:e,onChange:a=>t(a.target.checked)}),Ue("span",{className:"se-switchTrack",children:Ue("span",{className:"se-switchThumb"})})]})}function G({label:e,value:t,min:n,max:a,step:r,formatValue:o,onChange:s,disabled:l=!1}){return yn("label",{className:`se-field ${l?"se-field--disabled":""}`,children:[yn("span",{className:"se-fieldLabel",children:[e,Ue("span",{className:"se-fieldValue",children:o?o(t):t})]}),Ue("input",{className:"se-slider",type:"range",min:n,max:a,step:r,value:t,onChange:i=>s(Number(i.target.value)),disabled:l})]})}function Qe({label:e,checked:t,onChange:n}){return yn("label",{className:"se-field se-fieldInline",children:[Ue("span",{className:"se-fieldLabel",children:e}),Ue("input",{type:"checkbox",className:"se-checkbox",checked:t,onChange:a=>n(a.target.checked)})]})}function Fn({label:e,value:t,options:n,onChange:a}){return yn("label",{className:"se-field se-fieldInline",children:[Ue("span",{className:"se-fieldLabel",children:e}),Ue("select",{className:"se-select",value:t,onChange:r=>a(r.target.value),children:n.map(r=>Ue("option",{value:r,children:ES(r)},r))})]})}function Jn({label:e,value:t,onChange:n}){let[a,r]=tf(!1),o=ef(null);return yn("div",{className:"se-field",children:[yn("div",{className:"se-fieldInline",children:[Ue("span",{className:"se-fieldLabel",children:e}),Ue("span",{ref:o,style:{display:"inline-flex"},children:Ue(BS,{prefixed:!0,className:"se-swatch",onClick:()=>r(s=>!s),style:{background:t,color:Ia(t)},color:t,onChange:n})})]}),a?Ue(ip,{anchorRef:o,onClose:()=>r(!1),children:Ue(OS,{color:t,onChange:n})}):null]})}function ro({label:e,value:t,min:n,max:a,step:r,onChange:o}){return yn("div",{className:"se-field",children:[Ue("span",{className:"se-fieldLabel",children:e}),Ue("div",{className:"se-vectorRow",children:["X","Y","Z"].map((l,i)=>yn("label",{className:"se-vectorAxis",children:[Ue("span",{children:l}),Ue("input",{type:"number",className:"se-numberInput",min:n,max:a,step:r,value:t[i],onChange:c=>{let d=[...t];d[i]=Number(c.target.value),o(d)}})]},l))})]})}function _o({label:e,value:t,min:n,max:a,step:r,onChange:o}){return yn("div",{className:"se-field",children:[Ue("span",{className:"se-fieldLabel",children:e}),Ue("div",{className:"se-vectorRow",children:["X","Y"].map((l,i)=>yn("label",{className:"se-vectorAxis",children:[Ue("span",{children:l}),Ue("input",{type:"number",className:"se-numberInput",min:n,max:a,step:r,value:t[i],onChange:c=>{let d=[...t];d[i]=Number(c.target.value),o(d)}})]},l))})]})}var nf={free:0,starter:1,growth:2};function rf(e){return e==="starter"||e==="growth"||e==="scale"?e==="scale"?"growth":e:"free"}function Fr(e,t){return nf[e]>=nf[t]}var of={free:"Free",starter:"Starter",growth:"Growth"};import{Lock as LS}from"lucide-react";import{jsx as DS,jsxs as af}from"react/jsx-runtime";function Dn({requiredTier:e,feature:t}){return af("div",{className:"bb-tierLock",children:[DS(LS,{size:16}),af("p",{className:"bb-tierLockMessage",children:[t," requires the ",of[e]," plan or higher."]})]})}import{Fragment as sp,jsx as pe,jsxs as Wt}from"react/jsx-runtime";var US=["lit","unlit","normals"],HS=["color","image","environment"];function sf(e){let t=e%360;return t<0?t+360:t}function Rl({title:e,open:t,onToggle:n,children:a,trailing:r}){return Wt("section",{className:"se-panel",children:[Wt("button",{type:"button",className:"se-panelHeader",onClick:n,"aria-expanded":t,children:[Wt("span",{className:"se-panelHeaderMain",children:[pe(_S,{size:16,className:`se-panelChevron ${t?"se-panelChevron--open":""}`}),pe("span",{className:"se-panelTitle",children:e})]}),r?pe("span",{className:"se-panelTrailing",onClick:o=>o.stopPropagation(),children:r}):null]}),t?pe("div",{className:"se-panelBody",children:a}):null]})}function lp({config:e,onChange:t}){let{model:n,camera:a,wireframe:r,background:o,environment:s}=e,{tier:l}=Yn(),i=Fr(l,"starter"),[c,d]=NS({general:!0,camera:!0,wireframe:!1,background:!1}),u=p=>d(m=>({...m,[p]:!m[p]})),b=p=>t({...e,model:p}),g=p=>t({...e,camera:p}),h=p=>t({...e,wireframe:p}),w=p=>t({...e,background:p}),B=p=>t({...e,environment:p}),v=p=>{B({...s,source:"preset",preset:p})};return Wt("div",{className:"se-generalContent",children:[Wt(Rl,{title:"General",open:c.general,onToggle:()=>u("general"),children:[Wt("div",{className:"se-field",children:[Wt("div",{className:"se-fieldLabel",children:[pe("span",{children:"Straighten model"}),pe("button",{type:"button",className:"se-iconButton",onClick:()=>b({...n,rotation:[0,0,0]}),"aria-label":"Reset model rotation",children:pe(IS,{size:16})})]}),pe("div",{className:"se-axisStepperGrid",children:["X","Y","Z"].map((p,m)=>Wt("div",{className:"se-axisStepper",children:[pe("button",{type:"button",className:"se-axisStepperButton",onClick:()=>{let S=[...n.rotation];S[m]=sf(S[m]-90),b({...n,rotation:S})},"aria-label":`Rotate ${p} axis backward`,children:pe(zS,{size:16})}),pe("span",{className:"se-axisStepperLabel",children:p}),pe("button",{type:"button",className:"se-axisStepperButton",onClick:()=>{let S=[...n.rotation];S[m]=sf(S[m]+90),b({...n,rotation:S})},"aria-label":`Rotate ${p} axis forward`,children:pe(jS,{size:16})})]},p))})]}),pe(ro,{label:"Rotation",value:n.rotation,min:0,max:360,step:1,onChange:p=>b({...n,rotation:p})}),Wt("div",{className:"se-field",children:[pe("span",{className:"se-fieldLabel",children:"Renderer"}),pe("div",{className:"se-segmentedControl se-segmentedControl--renderer",children:yu.map(p=>pe("button",{type:"button",className:`se-segmentedOption ${n.renderer===p?"se-segmentedOption--active":""}`,onClick:()=>b({...n,renderer:p}),children:p==="uv-checker"?"UV CHECKER":p.toUpperCase()},p))})]}),pe(Fn,{label:"Shading",value:n.shading,options:US,onChange:p=>b({...n,shading:p})})]}),pe(Rl,{title:"Camera",open:c.camera,onToggle:()=>u("camera"),children:pe(G,{label:"Field Of View",value:a.fieldOfView,min:20,max:100,step:.1,formatValue:p=>`${p.toFixed(3)}\xB0`,onChange:p=>g({...a,fieldOfView:p})})}),pe(Rl,{title:"Wireframe",open:c.wireframe,onToggle:()=>u("wireframe"),trailing:Wt("label",{className:"se-switch","aria-label":"Toggle wireframe preview",children:[pe("input",{type:"checkbox",checked:i&&r.enabled,disabled:!i,onChange:p=>h({...r,enabled:p.target.checked})}),pe("span",{className:"se-switchTrack",children:pe("span",{className:"se-switchThumb"})})]}),children:i?Wt(sp,{children:[pe(G,{label:"Opacity",value:r.opacity,min:0,max:1,step:.01,onChange:p=>h({...r,opacity:p})}),pe(Jn,{label:"Wire color",value:r.color,onChange:p=>h({...r,color:p})})]}):pe(Dn,{requiredTier:"starter",feature:"Wireframe preview"})}),pe(Rl,{title:"Background",open:c.background,onToggle:()=>u("background"),trailing:Wt("label",{className:"se-switch","aria-label":"Toggle scene background",children:[pe("input",{type:"checkbox",checked:o.enabled,onChange:p=>w({...o,enabled:p.target.checked})}),pe("span",{className:"se-switchTrack",children:pe("span",{className:"se-switchThumb"})})]}),children:o.enabled?Wt(sp,{children:[Wt("div",{className:"se-field",children:[pe("span",{className:"se-fieldLabel",children:"Background type"}),pe("div",{className:"se-segmentedControl",children:HS.map(p=>pe("button",{type:"button",className:`se-segmentedOption ${o.type===p?"se-segmentedOption--active":""}`,onClick:()=>w({...o,type:p}),children:p},p))})]}),o.type==="environment"?i?Wt(sp,{children:[Wt("div",{className:"se-field",children:[pe("span",{className:"se-fieldLabel",children:"Environment source"}),Wt("div",{className:"se-segmentedControl",children:[pe("button",{type:"button",className:`se-segmentedOption ${s.source==="preset"?"se-segmentedOption--active":""}`,onClick:()=>B({...s,source:"preset"}),children:"PRESET"}),pe("button",{type:"button",className:`se-segmentedOption ${s.source==="custom"?"se-segmentedOption--active":""}`,onClick:()=>B({...s,source:"custom"}),children:"CUSTOM"})]})]}),s.source==="preset"?pe(Fn,{label:"Environment preset",value:s.preset,options:wu,onChange:v}):Wt("label",{className:"se-field",children:[pe("span",{className:"se-fieldLabel",children:"Custom environment URL"}),pe("input",{type:"text",className:"se-textInput",placeholder:"https://example.com/environment.hdr",value:s.customEnvironmentUrl,onChange:p=>B({...s,customEnvironmentUrl:p.target.value})}),pe("span",{className:"bb-note",children:"Enter a HDR, EXR, JPG, JPEG, PNG, or WEBP URL."}),s.customEnvironmentUrl.trim()&&!ds(s.customEnvironmentUrl)?pe("span",{className:"bb-note",style:{color:"#fca5a5"},children:"Invalid image/HDRI URL."}):null]}),pe(G,{label:"Environment intensity",value:s.intensity,min:0,max:3,step:.05,onChange:p=>B({...s,intensity:p})})]}):pe(Dn,{requiredTier:"starter",feature:"Environment backgrounds"}):null,o.type==="image"?Wt("label",{className:"se-field",children:[pe("span",{className:"se-fieldLabel",children:"Background image URL"}),pe("input",{type:"text",className:"se-textInput",placeholder:"https://example.com/background.jpg",value:o.imageUrl,onChange:p=>w({...o,imageUrl:p.target.value})})]}):null,o.type==="color"?Wt("div",{className:"se-field",children:[pe("span",{className:"se-fieldLabel",children:"Background color"}),pe("div",{className:"se-inlineColorPicker",children:pe(VS,{color:o.color,onChange:p=>w({...o,color:p})})}),pe("div",{className:"se-fieldInline",children:pe(FS,{prefixed:!0,className:"se-swatch",style:{background:o.color,color:Ia(o.color)},color:o.color,onChange:p=>w({...o,color:p})})})]}):null]}):pe("div",{className:"se-placeholder",children:"Background rendering is disabled for this scene preset."})})]})}import{useState as WS}from"react";import{jsx as ce,jsxs as Ii}from"react/jsx-runtime";function lf({pp:e,set:t,open:n,toggle:a}){let{ssao:r}=e;return Ii(ze,{title:"SSAO",tooltip:"Adds soft contact shadows in corners, creases, and tight spaces.",open:n.ssao,onToggle:()=>a("ssao"),disabled:!r.enabled,trailing:ce(We,{checked:r.enabled,onChange:o=>t("ssao",{...r,enabled:o}),label:"Toggle SSAO"}),children:[ce(G,{label:"Samples",value:r.samples,min:1,max:64,step:1,onChange:o=>t("ssao",{...r,samples:o})}),ce(G,{label:"Rings",value:r.rings,min:1,max:12,step:1,onChange:o=>t("ssao",{...r,rings:o})}),ce(G,{label:"Intensity",value:r.intensity,min:0,max:20,step:.5,onChange:o=>t("ssao",{...r,intensity:o})}),ce(G,{label:"Radius",value:r.radius,min:.01,max:1,step:.01,onChange:o=>t("ssao",{...r,radius:o})}),ce(G,{label:"Bias",value:r.bias,min:0,max:.1,step:.001,onChange:o=>t("ssao",{...r,bias:o})}),ce(G,{label:"Luminance Influence",value:r.luminanceInfluence,min:0,max:1,step:.01,onChange:o=>t("ssao",{...r,luminanceInfluence:o})}),ce(G,{label:"Fade",value:r.fade,min:0,max:.1,step:.001,onChange:o=>t("ssao",{...r,fade:o})}),ce(G,{label:"Min Radius Scale",value:r.minRadiusScale,min:0,max:1,step:.01,onChange:o=>t("ssao",{...r,minRadiusScale:o})}),ce(G,{label:"World Distance Threshold",value:r.worldDistanceThreshold,min:0,max:100,step:.1,onChange:o=>t("ssao",{...r,worldDistanceThreshold:o})}),ce(G,{label:"World Distance Falloff",value:r.worldDistanceFalloff,min:0,max:20,step:.1,onChange:o=>t("ssao",{...r,worldDistanceFalloff:o})}),ce(G,{label:"World Proximity Threshold",value:r.worldProximityThreshold,min:0,max:100,step:.1,onChange:o=>t("ssao",{...r,worldProximityThreshold:o})}),ce(G,{label:"World Proximity Falloff",value:r.worldProximityFalloff,min:0,max:20,step:.1,onChange:o=>t("ssao",{...r,worldProximityFalloff:o})})]})}function cf({pp:e,set:t,open:n,toggle:a}){let{autofocus:r}=e;return Ii(ze,{title:"Auto focus",tooltip:"Keeps the focus plane tracking a subject so the image stays sharp where you want it.",open:n.autofocus,onToggle:()=>a("autofocus"),disabled:!r.enabled,trailing:ce(We,{checked:r.enabled,onChange:o=>t("autofocus",{...r,enabled:o}),label:"Toggle Autofocus"}),children:[ce(G,{label:"Focus Distance",value:r.focusDistance,min:0,max:50,step:.1,onChange:o=>t("autofocus",{...r,focusDistance:o})}),ce(G,{label:"Focus Range",value:r.focusRange,min:.1,max:50,step:.1,onChange:o=>t("autofocus",{...r,focusRange:o})}),ce(G,{label:"Focal Length",value:r.focalLength,min:0,max:1,step:.01,onChange:o=>t("autofocus",{...r,focalLength:o})}),ce(G,{label:"Bokeh Scale",value:r.bokehScale,min:0,max:20,step:.1,onChange:o=>t("autofocus",{...r,bokehScale:o})}),ce(ro,{label:"Target",value:r.target,min:-100,max:100,step:.1,onChange:o=>t("autofocus",{...r,target:o})}),ce(Qe,{label:"Mouse Follow",checked:r.mouse,onChange:o=>t("autofocus",{...r,mouse:o})}),ce(Qe,{label:"Manual Update",checked:r.manual,onChange:o=>t("autofocus",{...r,manual:o})}),ce(G,{label:"Debug",value:r.debug,min:0,max:1,step:.01,onChange:o=>t("autofocus",{...r,debug:o})}),ce(G,{label:"Smooth Time",value:r.smoothTime,min:0,max:2,step:.01,onChange:o=>t("autofocus",{...r,smoothTime:o})})]})}function df({pp:e,set:t,open:n,toggle:a}){let{godRays:r}=e;return Ii(ze,{title:"God Rays",tooltip:"Creates light shafts that streak outward from a bright sun or light source.",open:n.godRays,onToggle:()=>a("godRays"),disabled:!r.enabled,trailing:ce(We,{checked:r.enabled,onChange:o=>t("godRays",{...r,enabled:o}),label:"Toggle GodRays"}),children:[ce(ro,{label:"Sun Position",value:r.sunPosition,min:-100,max:100,step:.1,onChange:o=>t("godRays",{...r,sunPosition:o})}),ce(G,{label:"Samples",value:r.samples,min:1,max:128,step:1,onChange:o=>t("godRays",{...r,samples:o})}),ce(G,{label:"Density",value:r.density,min:0,max:2,step:.01,onChange:o=>t("godRays",{...r,density:o})}),ce(G,{label:"Decay",value:r.decay,min:0,max:1,step:.01,onChange:o=>t("godRays",{...r,decay:o})}),ce(G,{label:"Weight",value:r.weight,min:0,max:2,step:.01,onChange:o=>t("godRays",{...r,weight:o})}),ce(G,{label:"Exposure",value:r.exposure,min:0,max:2,step:.01,onChange:o=>t("godRays",{...r,exposure:o})}),ce(G,{label:"Clamp Max",value:r.clampMax,min:0,max:2,step:.01,onChange:o=>t("godRays",{...r,clampMax:o})}),ce(Qe,{label:"Blur",checked:r.blur,onChange:o=>t("godRays",{...r,blur:o})}),ce(Fn,{label:"Kernel Size",value:r.kernelSize,options:li,onChange:o=>t("godRays",{...r,kernelSize:o})})]})}function pf({pp:e,set:t,open:n,toggle:a}){let{lensflare:r}=e;return Ii(ze,{title:"Lens Flare",tooltip:"Adds camera flare artifacts and glow from a bright light source.",open:n.lensflare,onToggle:()=>a("lensflare"),disabled:!r.enabled,trailing:ce(We,{checked:r.enabled,onChange:o=>t("lensflare",{...r,enabled:o}),label:"Toggle Lensflare"}),children:[ce(ro,{label:"Lens Position",value:r.lensPosition,min:-100,max:100,step:.1,onChange:o=>t("lensflare",{...r,lensPosition:o})}),ce(G,{label:"Smooth Time",value:r.smoothTime,min:0,max:1,step:.01,onChange:o=>t("lensflare",{...r,smoothTime:o})}),ce(G,{label:"Glare Size",value:r.glareSize,min:0,max:1,step:.01,onChange:o=>t("lensflare",{...r,glareSize:o})}),ce(G,{label:"Flare Size",value:r.flareSize,min:0,max:.1,step:.001,onChange:o=>t("lensflare",{...r,flareSize:o})}),ce(G,{label:"Flare Speed",value:r.flareSpeed,min:0,max:.2,step:.001,onChange:o=>t("lensflare",{...r,flareSpeed:o})}),ce(G,{label:"Flare Shape",value:r.flareShape,min:0,max:.2,step:.001,onChange:o=>t("lensflare",{...r,flareShape:o})}),ce(Qe,{label:"Animated",checked:r.animated,onChange:o=>t("lensflare",{...r,animated:o})}),ce(Qe,{label:"Anamorphic",checked:r.anamorphic,onChange:o=>t("lensflare",{...r,anamorphic:o})}),ce(Jn,{label:"Color Gain",value:r.colorGain,onChange:o=>t("lensflare",{...r,colorGain:o})}),ce(G,{label:"Halo Scale",value:r.haloScale,min:0,max:2,step:.01,onChange:o=>t("lensflare",{...r,haloScale:o})}),ce(Qe,{label:"Secondary Ghosts",checked:r.secondaryGhosts,onChange:o=>t("lensflare",{...r,secondaryGhosts:o})}),ce(Qe,{label:"Additional Streaks",checked:r.aditionalStreaks,onChange:o=>t("lensflare",{...r,aditionalStreaks:o})}),ce(G,{label:"Ghost Scale",value:r.ghostScale,min:0,max:1,step:.01,onChange:o=>t("lensflare",{...r,ghostScale:o})}),ce(G,{label:"Opacity",value:r.opacity,min:0,max:1,step:.01,onChange:o=>t("lensflare",{...r,opacity:o})}),ce(Qe,{label:"Star Burst",checked:r.starBurst,onChange:o=>t("lensflare",{...r,starBurst:o})})]})}function uf({pp:e,set:t,open:n,toggle:a}){let{depthOfField:r}=e;return Ii(ze,{title:"Depth Of Field",tooltip:"Blurs areas that sit away from the focal plane for a camera-like look.",open:n.depthOfField,onToggle:()=>a("depthOfField"),disabled:!r.enabled,trailing:ce(We,{checked:r.enabled,onChange:o=>t("depthOfField",{...r,enabled:o}),label:"Toggle DepthOfField"}),children:[ce(G,{label:"Focus Distance",value:r.focusDistance,min:0,max:50,step:.1,onChange:o=>t("depthOfField",{...r,focusDistance:o})}),ce(G,{label:"Focus Range",value:r.focusRange,min:.1,max:50,step:.1,onChange:o=>t("depthOfField",{...r,focusRange:o})}),ce(G,{label:"Focal Length",value:r.focalLength,min:0,max:1,step:.01,onChange:o=>t("depthOfField",{...r,focalLength:o})}),ce(G,{label:"Bokeh Scale",value:r.bokehScale,min:0,max:20,step:.1,onChange:o=>t("depthOfField",{...r,bokehScale:o})})]})}import{jsx as Le,jsxs as Fa}from"react/jsx-runtime";var GS=["linear","reinhard","aces"];function mf({pp:e,set:t,open:n,toggle:a}){let{colorAverage:r}=e;return Le(ze,{title:"Color Average",tooltip:"Blends the frame toward a single average color for a washed-out stylized look.",open:n.colorAverage,onToggle:()=>a("colorAverage"),disabled:!r.enabled,trailing:Le(We,{checked:r.enabled,onChange:o=>t("colorAverage",{...r,enabled:o}),label:"Toggle ColorAverage"}),children:Le("div",{className:"se-placeholder",children:"Averages the frame color using the docs default blend mode."})})}function bf({pp:e,set:t,open:n,toggle:a}){let{brightnessContrast:r}=e;return Fa(ze,{title:"Brightness Contrast",tooltip:"Raises or lowers overall brightness and contrast across the scene.",open:n.brightnessContrast,onToggle:()=>a("brightnessContrast"),disabled:!r.enabled,trailing:Le(We,{checked:r.enabled,onChange:o=>t("brightnessContrast",{...r,enabled:o}),label:"Toggle BrightnessContrast"}),children:[Le(G,{label:"Brightness",value:r.brightness,min:-1,max:1,step:.01,onChange:o=>t("brightnessContrast",{...r,brightness:o})}),Le(G,{label:"Contrast",value:r.contrast,min:-1,max:1,step:.01,onChange:o=>t("brightnessContrast",{...r,contrast:o})})]})}function gf({pp:e,set:t,open:n,toggle:a}){let{hueSaturation:r}=e;return Fa(ze,{title:"Hue Saturation",tooltip:"Shifts the hue and saturation to tint the whole image.",open:n.hueSaturation,onToggle:()=>a("hueSaturation"),disabled:!r.enabled,trailing:Le(We,{checked:r.enabled,onChange:o=>t("hueSaturation",{...r,enabled:o}),label:"Toggle HueSaturation"}),children:[Le(G,{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})}),Le(G,{label:"Saturation",value:r.saturation,min:-1,max:1,step:.01,onChange:o=>t("hueSaturation",{...r,saturation:o})})]})}function ff({pp:e,set:t,open:n,toggle:a}){let{vignette:r}=e;return Fa(ze,{title:"Vignette",tooltip:"Darkens the edges of the screen so the center feels more focused.",open:n.vignette,onToggle:()=>a("vignette"),disabled:!r.enabled,trailing:Le(We,{checked:r.enabled,onChange:o=>t("vignette",{...r,enabled:o}),label:"Toggle Vignette"}),children:[Le(G,{label:"Offset",value:r.offset,min:0,max:1,step:.01,onChange:o=>t("vignette",{...r,offset:o})}),Le(G,{label:"Darkness",value:r.darkness,min:0,max:1,step:.01,onChange:o=>t("vignette",{...r,darkness:o})}),Le(Qe,{label:"Eskil",checked:r.eskil,onChange:o=>t("vignette",{...r,eskil:o})})]})}function hf({pp:e,set:t,open:n,toggle:a}){let{bloom:r}=e;return Fa(ze,{title:"Bloom",tooltip:"Makes bright areas glow and bleed softly into nearby pixels.",open:n.bloom,onToggle:()=>a("bloom"),disabled:!r.enabled,trailing:Le(We,{checked:r.enabled,onChange:o=>t("bloom",{...r,enabled:o}),label:"Toggle Bloom"}),children:[Le(G,{label:"Threshold",value:r.luminanceThreshold,min:0,max:1,step:.01,onChange:o=>t("bloom",{...r,luminanceThreshold:o})}),Le(G,{label:"Smoothing",value:r.luminanceSmoothing,min:0,max:1,step:.01,onChange:o=>t("bloom",{...r,luminanceSmoothing:o})}),Le(G,{label:"Intensity",value:r.intensity,min:0,max:3,step:.05,onChange:o=>t("bloom",{...r,intensity:o})}),Le(Qe,{label:"Mipmap Blur",checked:r.mipmapBlur,onChange:o=>t("bloom",{...r,mipmapBlur:o})}),Le(G,{label:"Radius",value:r.radius,min:0,max:1,step:.01,onChange:o=>t("bloom",{...r,radius:o})}),Le(G,{label:"Levels",value:r.levels,min:1,max:16,step:1,onChange:o=>t("bloom",{...r,levels:o})})]})}function xf({pp:e,set:t,open:n,toggle:a}){let{toneMapping:r}=e;return Fa(ze,{title:"Tone Mapping",tooltip:"Remaps HDR lighting to screen output and controls exposure style.",open:n.toneMapping,onToggle:()=>a("toneMapping"),disabled:!r.enabled,trailing:Le(We,{checked:r.enabled,onChange:o=>t("toneMapping",{...r,enabled:o}),label:"Toggle ToneMapping"}),children:[Fa("div",{className:"se-field",children:[Le("span",{className:"se-fieldLabel",children:"Mode"}),Le("div",{className:"se-segmentedControl",children:GS.map(o=>Le("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))})]}),Le(G,{label:"Resolution",value:r.resolution,min:64,max:4096,step:64,onChange:o=>t("toneMapping",{...r,resolution:o})}),Le(G,{label:"White Point",value:r.whitePoint,min:0,max:16,step:.01,onChange:o=>t("toneMapping",{...r,whitePoint:o})}),Le(G,{label:"Middle Grey",value:r.middleGrey,min:0,max:1,step:.01,onChange:o=>t("toneMapping",{...r,middleGrey:o})}),Le(G,{label:"Min Luminance",value:r.minLuminance,min:0,max:1,step:.01,onChange:o=>t("toneMapping",{...r,minLuminance:o})}),Le(G,{label:"Average Luminance",value:r.averageLuminance,min:0,max:4,step:.01,onChange:o=>t("toneMapping",{...r,averageLuminance:o})}),Le(G,{label:"Adaptation Rate",value:r.adaptationRate,min:0,max:10,step:.01,onChange:o=>t("toneMapping",{...r,adaptationRate:o})}),Le(G,{label:"Exposure",value:r.exposure,min:0,max:3,step:.01,onChange:o=>t("toneMapping",{...r,exposure:o})})]})}function vf({pp:e,set:t,open:n,toggle:a}){let{sepia:r}=e;return Le(ze,{title:"Sepia",tooltip:"Adds a warm vintage brown tint to the entire image.",open:n.sepia,onToggle:()=>a("sepia"),disabled:!r.enabled,trailing:Le(We,{checked:r.enabled,onChange:o=>t("sepia",{...r,enabled:o}),label:"Toggle Sepia"}),children:Le(G,{label:"Intensity",value:r.intensity,min:0,max:1,step:.01,onChange:o=>t("sepia",{...r,intensity:o})})})}import{jsx as we,jsxs as Va}from"react/jsx-runtime";function yf({pp:e,set:t,open:n,toggle:a}){let{dotScreen:r}=e;return Va(ze,{title:"Dot Screen",tooltip:"Overlays a halftone dot pattern for a printed or retro look.",open:n.dotScreen,onToggle:()=>a("dotScreen"),disabled:!r.enabled,trailing:we(We,{checked:r.enabled,onChange:o=>t("dotScreen",{...r,enabled:o}),label:"Toggle DotScreen"}),children:[we(G,{label:"Angle",value:r.angle,min:0,max:Math.PI*2,step:.01,formatValue:o=>`${o.toFixed(2)} rad`,onChange:o=>t("dotScreen",{...r,angle:o})}),we(G,{label:"Scale",value:r.scale,min:.1,max:10,step:.05,onChange:o=>t("dotScreen",{...r,scale:o})})]})}function wf({pp:e,set:t,open:n,toggle:a}){let{glitch:r}=e;return Va(ze,{title:"Glitch",tooltip:"Introduces digital distortion, tearing, and scan noise.",open:n.glitch,onToggle:()=>a("glitch"),disabled:!r.enabled,trailing:we(We,{checked:r.enabled,onChange:o=>t("glitch",{...r,enabled:o}),label:"Toggle Glitch"}),children:[we(Fn,{label:"Mode",value:r.mode,options:Cu,onChange:o=>t("glitch",{...r,mode:o})}),we(_o,{label:"Delay",value:r.delay,min:0,max:10,step:.01,onChange:o=>t("glitch",{...r,delay:o})}),we(_o,{label:"Duration",value:r.duration,min:0,max:5,step:.01,onChange:o=>t("glitch",{...r,duration:o})}),we(_o,{label:"Strength",value:r.strength,min:0,max:2,step:.01,onChange:o=>t("glitch",{...r,strength:o})}),we(_o,{label:"Chromatic Aberration Offset",value:r.chromaticAberrationOffset,min:0,max:.02,step:1e-4,onChange:o=>t("glitch",{...r,chromaticAberrationOffset:o})}),we(G,{label:"Columns",value:r.columns,min:0,max:.5,step:.001,onChange:o=>t("glitch",{...r,columns:o})}),we(G,{label:"Ratio",value:r.ratio,min:0,max:1,step:.01,onChange:o=>t("glitch",{...r,ratio:o})})]})}function Cf({pp:e,set:t,open:n,toggle:a}){let{grid:r}=e;return Va(ze,{title:"Grid",tooltip:"Adds a visual grid overlay that feels retro or debug-like.",open:n.grid,onToggle:()=>a("grid"),disabled:!r.enabled,trailing:we(We,{checked:r.enabled,onChange:o=>t("grid",{...r,enabled:o}),label:"Toggle Grid"}),children:[we(G,{label:"Scale",value:r.scale,min:.1,max:10,step:.05,onChange:o=>t("grid",{...r,scale:o})}),we(G,{label:"Line Width",value:r.lineWidth,min:0,max:1,step:.01,onChange:o=>t("grid",{...r,lineWidth:o})})]})}function Sf({pp:e,set:t,open:n,toggle:a}){let{chromaticAberration:r}=e;return Va(ze,{title:"Chromatic Aberration",tooltip:"Separates color channels slightly to mimic lens fringing.",open:n.chromaticAberration,onToggle:()=>a("chromaticAberration"),disabled:!r.enabled,trailing:we(We,{checked:r.enabled,onChange:o=>t("chromaticAberration",{...r,enabled:o}),label:"Toggle ChromaticAberration"}),children:[we(G,{label:"Offset X",value:r.offsetX,min:0,max:.02,step:1e-4,onChange:o=>t("chromaticAberration",{...r,offsetX:o})}),we(G,{label:"Offset Y",value:r.offsetY,min:0,max:.02,step:1e-4,onChange:o=>t("chromaticAberration",{...r,offsetY:o})}),we(Qe,{label:"Radial Modulation",checked:r.radialModulation,onChange:o=>t("chromaticAberration",{...r,radialModulation:o})}),we(G,{label:"Modulation Offset",value:r.modulationOffset,min:0,max:1,step:.01,onChange:o=>t("chromaticAberration",{...r,modulationOffset:o})})]})}function Mf({pp:e,set:t,open:n,toggle:a}){let{noise:r}=e;return Va(ze,{title:"Noise",tooltip:"Adds film grain or static noise to the rendered image.",open:n.noise,onToggle:()=>a("noise"),disabled:!r.enabled,trailing:we(We,{checked:r.enabled,onChange:o=>t("noise",{...r,enabled:o}),label:"Toggle Noise"}),children:[we(G,{label:"Amount",value:r.opacity,min:0,max:1,step:.01,onChange:o=>t("noise",{...r,opacity:o})}),we(Qe,{label:"Premultiply",checked:r.premultiply,onChange:o=>t("noise",{...r,premultiply:o})})]})}function kf({pp:e,set:t,open:n,toggle:a}){let{scanline:r}=e;return we(ze,{title:"Scan Line",tooltip:"Draws horizontal CRT-style scan lines over the frame.",open:n.scanline,onToggle:()=>a("scanline"),disabled:!r.enabled,trailing:we(We,{checked:r.enabled,onChange:o=>t("scanline",{...r,enabled:o}),label:"Toggle Scanline"}),children:we(G,{label:"Density",value:r.density,min:0,max:10,step:.25,onChange:o=>t("scanline",{...r,density:o})})})}function Pf({pp:e,set:t,open:n,toggle:a}){let{pixelation:r}=e;return we(ze,{title:"Pixelation",tooltip:"Reduces detail into larger pixels for a blocky stylized effect.",open:n.pixelation,onToggle:()=>a("pixelation"),disabled:!r.enabled,trailing:we(We,{checked:r.enabled,onChange:o=>t("pixelation",{...r,enabled:o}),label:"Toggle Pixelation"}),children:we(G,{label:"Granularity",value:r.granularity,min:0,max:20,step:1,onChange:o=>t("pixelation",{...r,granularity:o})})})}function Tf({pp:e,set:t,open:n,toggle:a}){let{ramp:r}=e;return Va(ze,{title:"Ramp",tooltip:"Adds a screen-space color gradient, or masks effects earlier in the stack.",open:n.ramp,onToggle:()=>a("ramp"),disabled:!r.enabled,trailing:we(We,{checked:r.enabled,onChange:o=>t("ramp",{...r,enabled:o}),label:"Toggle Ramp"}),children:[we(Fn,{label:"Ramp Type",value:r.rampType,options:Su,onChange:o=>t("ramp",{...r,rampType:o})}),we(_o,{label:"Ramp Start",value:r.rampStart,min:0,max:1,step:.01,onChange:o=>t("ramp",{...r,rampStart:o})}),we(_o,{label:"Ramp End",value:r.rampEnd,min:0,max:1,step:.01,onChange:o=>t("ramp",{...r,rampEnd:o})}),we(Jn,{label:"Start Color",value:r.startColor,onChange:o=>t("ramp",{...r,startColor:o})}),we(Jn,{label:"End Color",value:r.endColor,onChange:o=>t("ramp",{...r,endColor:o})}),!r.rampMask&&we(G,{label:"Gradient Opacity",value:r.opacity??.5,min:0,max:1,step:.01,onChange:o=>t("ramp",{...r,opacity:o})}),we(G,{label:"Bias",value:r.rampBias,min:0,max:1,step:.01,onChange:o=>t("ramp",{...r,rampBias:o})}),we(G,{label:"Gain",value:r.rampGain,min:0,max:1,step:.01,onChange:o=>t("ramp",{...r,rampGain:o})}),we(Qe,{label:"Mask Earlier Effects",checked:r.rampMask,onChange:o=>t("ramp",{...r,rampMask:o})}),we(Qe,{label:"Invert",checked:r.rampInvert,onChange:o=>t("ramp",{...r,rampInvert:o})})]})}import{jsx as Mt,jsxs as Of}from"react/jsx-runtime";function Rf({pp:e,set:t,open:n,toggle:a}){let{outline:r}=e;return Of(ze,{title:"Outline",tooltip:"Draws a visible edge around the selected object binding.",open:n.outline,onToggle:()=>a("outline"),disabled:!r.enabled,trailing:Mt(We,{checked:r.enabled,onChange:o=>t("outline",{...r,enabled:o}),label:"Toggle Outline"}),children:[Mt("div",{className:"se-placeholder",children:"Outlines the currently selected object binding in the model editor."}),Mt(G,{label:"Selection Layer",value:r.selectionLayer,min:0,max:20,step:1,onChange:o=>t("outline",{...r,selectionLayer:o})}),Mt(G,{label:"Edge Strength",value:r.edgeStrength,min:0,max:10,step:.1,onChange:o=>t("outline",{...r,edgeStrength:o})}),Mt(G,{label:"Pulse Speed",value:r.pulseSpeed,min:0,max:10,step:.1,onChange:o=>t("outline",{...r,pulseSpeed:o})}),Mt(Jn,{label:"Visible Edge Color",value:r.visibleEdgeColor,onChange:o=>t("outline",{...r,visibleEdgeColor:o})}),Mt(Jn,{label:"Hidden Edge Color",value:r.hiddenEdgeColor,onChange:o=>t("outline",{...r,hiddenEdgeColor:o})}),Mt(Fn,{label:"Kernel Size",value:r.kernelSize,options:li,onChange:o=>t("outline",{...r,kernelSize:o})}),Mt(Qe,{label:"Blur",checked:r.blur,onChange:o=>t("outline",{...r,blur:o})}),Mt(Qe,{label:"X-Ray",checked:r.xRay,onChange:o=>t("outline",{...r,xRay:o})})]})}function Af({pp:e,set:t,open:n,toggle:a}){let{selectiveBloom:r}=e;return Of(ze,{title:"Selective Bloom",tooltip:"Applies bloom only to objects assigned to the selected layer.",open:n.selectiveBloom,onToggle:()=>a("selectiveBloom"),disabled:!r.enabled,trailing:Mt(We,{checked:r.enabled,onChange:o=>t("selectiveBloom",{...r,enabled:o}),label:"Toggle SelectiveBloom"}),children:[Mt("div",{className:"se-placeholder",children:"Applies bloom to the currently selected object binding."}),Mt(G,{label:"Selection Layer",value:r.selectionLayer,min:0,max:20,step:1,onChange:o=>t("selectiveBloom",{...r,selectionLayer:o})}),Mt(G,{label:"Intensity",value:r.intensity,min:0,max:5,step:.05,onChange:o=>t("selectiveBloom",{...r,intensity:o})}),Mt(G,{label:"Threshold",value:r.luminanceThreshold,min:0,max:1,step:.01,onChange:o=>t("selectiveBloom",{...r,luminanceThreshold:o})}),Mt(G,{label:"Smoothing",value:r.luminanceSmoothing,min:0,max:1,step:.01,onChange:o=>t("selectiveBloom",{...r,luminanceSmoothing:o})}),Mt(Fn,{label:"Kernel Size",value:r.kernelSize,options:li,onChange:o=>t("selectiveBloom",{...r,kernelSize:o})}),Mt(Qe,{label:"Mipmap Blur",checked:r.mipmapBlur,onChange:o=>t("selectiveBloom",{...r,mipmapBlur:o})}),Mt(Qe,{label:"Inverted",checked:r.inverted,onChange:o=>t("selectiveBloom",{...r,inverted:o})}),Mt(Qe,{label:"Ignore Background",checked:r.ignoreBackground,onChange:o=>t("selectiveBloom",{...r,ignoreBackground:o})})]})}function Bf({pp:e,set:t,open:n,toggle:a}){let{smaa:r}=e;return Mt(ze,{title:"SMAA",tooltip:"Reduces jagged edges with subpixel anti-aliasing.",open:n.smaa,onToggle:()=>a("smaa"),trailing:Mt(We,{checked:r.enabled,onChange:o=>t("smaa",{...r,enabled:o}),label:"Toggle SMAA"}),children:Mt("div",{className:"se-placeholder",children:"Subpixel Morphological Anti-Aliasing smooths jagged edges in post-process."})})}import{jsx as kt,jsxs as $S}from"react/jsx-runtime";function cp({config:e,onChange:t}){let[n,a]=WS({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=i=>a(c=>({...c,[i]:!c[i]})),o=e.postProcessing,l={pp:o,set:(i,c)=>t({...e,postProcessing:{...o,[i]:c}}),open:n,toggle:r};return $S("div",{className:"se-generalContent",children:[kt(lf,{...l}),kt(cf,{...l}),kt(mf,{...l}),kt(yf,{...l}),kt(wf,{...l}),kt(df,{...l}),kt(Cf,{...l}),kt(pf,{...l}),kt(Rf,{...l}),kt(Af,{...l}),kt(bf,{...l}),kt(gf,{...l}),kt(uf,{...l}),kt(Sf,{...l}),kt(ff,{...l}),kt(hf,{...l}),kt(xf,{...l}),kt(Mf,{...l}),kt(vf,{...l}),kt(kf,{...l}),kt(Pf,{...l}),kt(Tf,{...l}),kt(Bf,{...l})]})}import{useState as Ef,useSyncExternalStore as XS}from"react";import{Eye as KS,EyeOff as YS,Plus as JS,Trash2 as qS}from"lucide-react";import{Fragment as Lf,jsx as ve,jsxs as Vn}from"react/jsx-runtime";var ZS=["512","1024","2048","4096"],Df={none:"None",directional:"Direction",point:"Point",spot:"Spot",hemisphere:"Hemi"};function QS({index:e,light:t,selected:n,onSelect:a,onToggleVisible:r}){return Vn("div",{className:`se-lightRow ${n?"se-lightRow--active":""}`,onClick:a,children:[Vn("span",{className:"se-lightRowLabel",children:[e+1,": ",Df[t.type]]}),ve("button",{type:"button",className:"se-iconButton","aria-label":t.visible?"Hide light":"Show light",onClick:o=>{o.stopPropagation(),r()},children:t.visible?ve(KS,{size:14}):ve(YS,{size:14})})]})}function e2(){return{id:crypto.randomUUID(),type:"directional",color:"#ffffff",intensity:1,position:[5,10,5],attachedToCamera:!1,castShadow:!1,shadowBias:-5e-4,visible:!0}}function dp({config:e,onChange:t}){let[n,a]=Ef({lights:!0,shadows:!1,groundShadows:!1,environment:!1,envShadow:!1}),r=XS(Qd,Cl),[o,s]=Ef(e.lighting.lights[0]?.id??null),l=r??o,i=f=>{s(f),_i(f)},c=f=>a(C=>({...C,[f]:!C[f]})),{tier:d}=Yn(),u=Fr(d,"starter"),{lighting:b,shadows:g,groundShadows:h,environment:w}=e,B=f=>t({...e,lighting:f}),v=f=>t({...e,shadows:f}),p=f=>t({...e,groundShadows:f}),m=f=>t({...e,environment:f}),S=(f,C)=>{B({...b,lights:b.lights.map(x=>x.id===f?{...x,...C}:x)})},M=b.lights.find(f=>f.id===l)??null,k=()=>{let f=e2();B({...b,lights:[...b.lights,f]}),i(f.id)},R=()=>{if(!M)return;let f=b.lights.filter(C=>C.id!==M.id);B({...b,lights:f}),i(f[0]?.id??null)};return Vn("div",{className:"se-generalContent",children:[Vn(ze,{title:"Lights",open:n.lights,onToggle:()=>c("lights"),children:[ve("div",{className:"se-lightList",children:b.lights.map((f,C)=>ve(QS,{index:C,light:f,selected:f.id===l,onSelect:()=>i(f.id),onToggleVisible:()=>S(f.id,{visible:!f.visible})},f.id))}),Vn("div",{className:"se-lightActions",children:[ve("button",{type:"button",className:"se-iconButton",onClick:k,title:"Add light",children:ve(JS,{size:14})}),M&&b.lights.length>1&&ve("button",{type:"button",className:"se-iconButton",onClick:R,title:"Remove selected light",children:ve(qS,{size:14})})]}),M?Vn("div",{className:"se-lightProps",children:[Vn("div",{className:"se-field",children:[ve("span",{className:"se-fieldLabel",children:"Type"}),ve("div",{className:"se-segmentedControl",style:{gridAutoColumns:"1fr"},children:vu.map(f=>ve("button",{type:"button",className:`se-segmentedOption ${M.type===f?"se-segmentedOption--active":""}`,onClick:()=>S(M.id,{type:f}),children:Df[f]},f))})]}),ve(Jn,{label:"Color",value:M.color,onChange:f=>S(M.id,{color:f})}),ve(G,{label:"Intensity",value:M.intensity,min:0,max:10,step:.1,onChange:f=>S(M.id,{intensity:f})}),M.type!=="hemisphere"&&M.type!=="none"&&ve(ro,{label:"Position",value:M.position,min:-100,max:100,step:.05,onChange:f=>S(M.id,{position:f})}),M.type==="spot"&&Vn(Lf,{children:[ve(G,{label:"Angle",value:M.angle??Math.PI/6,min:0,max:Math.PI/2,step:.01,formatValue:f=>`${Math.round(f*180/Math.PI)}\xB0`,onChange:f=>S(M.id,{angle:f})}),ve(G,{label:"Penumbra",value:M.penumbra??.2,min:0,max:1,step:.01,onChange:f=>S(M.id,{penumbra:f})}),ve(G,{label:"Distance",value:M.distance??0,min:0,max:100,step:.5,onChange:f=>S(M.id,{distance:f})}),ve(G,{label:"Decay",value:M.decay??2,min:0,max:4,step:.1,onChange:f=>S(M.id,{decay:f})})]}),ve(Qe,{label:"Attached to camera",checked:M.attachedToCamera,onChange:f=>S(M.id,{attachedToCamera:f})}),ve(Qe,{label:"Cast shadows",checked:M.castShadow,onChange:f=>S(M.id,{castShadow:f})}),ve(G,{label:"Shadow bias",value:M.shadowBias,min:-.01,max:.01,step:1e-4,onChange:f=>S(M.id,{shadowBias:f})})]}):null]}),Vn(ze,{title:"Shadows",open:n.shadows,onToggle:()=>c("shadows"),disabled:!g.enabled,trailing:ve(We,{checked:g.enabled,onChange:f=>v({...g,enabled:f}),label:"Toggle shadows"}),children:[ve(Fn,{label:"Map size",value:String(g.mapSize),options:ZS,onChange:f=>v({...g,mapSize:Number(f)})}),ve(G,{label:"Bias",value:g.bias,min:-.01,max:.01,step:1e-4,onChange:f=>v({...g,bias:f})}),ve(G,{label:"Normal bias",value:g.normalBias,min:0,max:.2,step:.01,onChange:f=>v({...g,normalBias:f})}),ve(G,{label:"Radius (softness)",value:g.radius,min:0,max:20,step:.5,onChange:f=>v({...g,radius:f})})]}),Vn(ze,{title:"Ground Shadows",open:n.groundShadows,onToggle:()=>c("groundShadows"),disabled:!h.enabled,trailing:ve(We,{checked:h.enabled,onChange:f=>p({...h,enabled:f}),label:"Toggle ground shadows"}),children:[Vn("div",{className:"se-field",children:[ve("span",{className:"se-fieldLabel",children:"Mode"}),ve("div",{className:"se-segmentedControl",style:{gridAutoColumns:"1fr"},children:["shadowCatcher"].map(f=>ve("button",{type:"button",className:`se-segmentedOption ${h.mode===f?"se-segmentedOption--active":""}`,onClick:()=>p({...h,mode:f}),children:f==="shadowCatcher"?"Shadow Catcher":"Baked AO"},f))})]}),h.mode==="bakedAO"&&ve("div",{className:"se-placeholder",children:"Requires pre-baked AO textures \u2014 not yet available."}),ve(G,{label:"Intensity",value:h.intensity,min:0,max:1,step:.01,onChange:f=>p({...h,intensity:f})}),ve(G,{label:"Border fade",value:h.borderFade,min:0,max:10,step:.1,onChange:f=>p({...h,borderFade:f})}),ve(G,{label:"Height",value:h.height,min:-5,max:5,step:.1,onChange:f=>p({...h,height:f})}),ve(G,{label:"Size",value:h.size,min:1,max:50,step:.5,onChange:f=>p({...h,size:f})})]}),ve(ze,{title:"Environment",open:n.environment,onToggle:()=>c("environment"),children:u?Vn(Lf,{children:[ve(G,{label:"Orientation",value:w.rotation,min:0,max:360,step:1,formatValue:f=>`${f}\xB0`,onChange:f=>m({...w,rotation:f})}),ve(G,{label:"Brightness",value:w.intensity,min:0,max:3,step:.05,onChange:f=>m({...w,intensity:f})}),Vn(ze,{title:"Shadow",open:n.envShadow,onToggle:()=>c("envShadow"),trailing:ve(We,{checked:w.shadowLight.enabled,onChange:f=>m({...w,shadowLight:{...w.shadowLight,enabled:f}}),label:"Toggle environment shadow light"}),disabled:!w.shadowLight.enabled,children:[ve(G,{label:"Light intensity",value:w.shadowLight.intensity,min:0,max:20,step:.1,onChange:f=>m({...w,shadowLight:{...w.shadowLight,intensity:f}})}),ve(G,{label:"Shadow bias",value:w.shadowLight.bias,min:-.01,max:.01,step:1e-4,onChange:f=>m({...w,shadowLight:{...w.shadowLight,bias:f}})})]})]}):ve(Dn,{requiredTier:"starter",feature:"Environment lighting"})})]})}import{useMemo as t2,useState as n2}from"react";import{ChevronDown as r2,Pause as o2,Play as a2,Square as i2,Trash2 as s2}from"lucide-react";import{jsx as je,jsxs as Pt}from"react/jsx-runtime";function l2(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),a=(t%60).toFixed(1).padStart(4,"0");return`${n}:${a}`}function Nf(e){let t=Number.isFinite(e)&&e>0?e:0;if(t<60)return`${t.toFixed(1)}s`;let n=Math.floor(t/60),a=(t%60).toFixed(1).padStart(4,"0");return`${n}:${a}`}function c2(e){return Number.isFinite(e)?Math.min(3,Math.max(.1,Number(e.toFixed(2)))):1}function pp({config:e,onChange:t,clipDetails:n,currentClip:a,isPlaying:r,time:o,play:s,pause:l,stop:i,setSpeed:c,seek:d}){let[u,b]=n2(!1),g=t2(()=>new Map(n.map(f=>[f.sourceName,f.duration])),[n]),h=e.animations.clips.filter(f=>!f.hidden),w=e.animations.clips.filter(f=>f.hidden),B=(f,C=e.animations.autoplayClip)=>{t({...e,animations:{clips:f(e.animations.clips),autoplayClip:C}})},v=(f,C)=>{B(x=>x.map(P=>P.sourceName===f?C(P):P))},p=(f,C)=>{v(f,x=>({...x,loopMode:C}))},m=(f,C)=>{let x=c2(C);v(f,P=>({...P,speed:x})),a===f&&c(x)},S=(f,C)=>{v(f,x=>({...x,displayName:C}))},M=f=>{let C=e.animations.autoplayClip===f?null:f;t({...e,animations:{...e.animations,autoplayClip:C}})},k=f=>{B(C=>C.map(x=>x.sourceName===f?{...x,hidden:!0}:x),e.animations.autoplayClip===f?null:e.animations.autoplayClip),a===f&&i()},R=f=>{B(C=>C.map(x=>x.sourceName===f?{...x,hidden:!1}:x))};return e.animations.clips.length===0?je(No,{title:"Animations",children:je("div",{className:"se-helperCard",children:"Upload a model with embedded animations to manage playback, naming, autoplay, and per-clip speed here."})}):Pt(No,{title:"Animations",children:[h.length===0&&je("div",{className:"se-helperCard",children:je("span",{children:"Preview clips directly in the viewer, choose one optional autoplay animation, and use soft delete to hide clips without modifying the GLB."})}),h.length===0?je("div",{className:"se-placeholder",children:"All animations are currently removed. Restore a clip below to make it available again."}):je("div",{className:"se-animationList",children:h.map(f=>{let C=a===f.sourceName,x=g.get(f.sourceName)??0;return Pt("article",{className:`se-animationCard ${C?"se-animationCard--active":""}`,children:[Pt("div",{className:"se-animationHeader",children:[Pt("div",{className:"se-animationHeading",children:[Pt("div",{className:"se-animationTitleRow",children:[je("span",{className:"se-animationStatus",children:C?r?"Playing":"Paused":"Ready"}),e.animations.autoplayClip===f.sourceName?je("span",{className:"se-animationBadge",children:"Autoplay"}):null]}),je("div",{className:"se-animationSource",children:f.sourceName})]}),je("button",{type:"button",className:"se-animationDangerButton",onClick:()=>k(f.sourceName),title:"Remove animation",children:je(s2,{size:16})})]}),Pt("div",{className:"se-field",children:[je("span",{className:"se-fieldLabel",children:"Display name"}),je("input",{className:"se-textInput",value:f.displayName,onChange:z=>S(f.sourceName,z.target.value),placeholder:"Animation name"})]}),Pt("div",{className:"se-animationMeta",children:[je("span",{children:l2(x)}),je("span",{children:f.loopMode==="once"?"Play once":"Looping"}),Pt("span",{children:[f.speed.toFixed(2),"x"]})]}),Pt("div",{className:"se-animationButtonRow",children:[(()=>{let z=C&&r;return je("button",{type:"button",className:"se-animationButton se-animationButton--icon",onClick:()=>z?l():s(f.sourceName),"aria-label":z?"Pause":"Play",title:z?"Pause":"Play",children:z?je(o2,{size:16}):je(a2,{size:16})})})(),je("button",{type:"button",className:"se-animationButton se-animationButton--icon",onClick:i,disabled:!C,"aria-label":"Stop",title:"Stop",children:je(i2,{size:16})})]}),Pt("div",{className:"se-animationSeekRow",children:[je("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:z=>d(Number(z.target.value)),"aria-label":"Seek"}),Pt("span",{className:"se-animationSeekTime",children:[Nf(C?Math.min(o,x):0)," / ",Nf(x)]})]}),Pt("div",{className:"se-animationGrid",children:[Pt("label",{className:"se-field",children:[je("span",{className:"se-fieldLabel",children:"Loop mode"}),Pt("select",{className:"se-select",value:f.loopMode,onChange:z=>p(f.sourceName,z.target.value),children:[je("option",{value:"repeat",children:"Loop"}),je("option",{value:"once",children:"Play Once"})]})]}),Pt("label",{className:"se-field",children:[Pt("span",{className:"se-fieldLabel",children:["Speed",Pt("span",{className:"se-fieldValue",children:[f.speed.toFixed(2),"x"]})]}),Pt("div",{className:"se-animationSpeedRow",children:[je("input",{className:"se-slider",type:"range",min:.1,max:3,step:.1,value:f.speed,onChange:z=>m(f.sourceName,Number(z.target.value))}),je("input",{className:"se-numberInput se-animationSpeedInput",type:"number",min:.1,max:3,step:.1,value:f.speed,onChange:z=>m(f.sourceName,Number(z.target.value))})]})]})]}),je("button",{type:"button",className:`se-animationAutoplayButton ${e.animations.autoplayClip===f.sourceName?"se-animationAutoplayButton--active":""}`,onClick:()=>M(f.sourceName),children:e.animations.autoplayClip===f.sourceName?"Disable autoplay":"Set as autoplay"})]},f.sourceName)})}),w.length>0?Pt("section",{className:"se-removedAnimations",children:[je("button",{type:"button",className:"se-panelHeader",onClick:()=>b(f=>!f),children:Pt("span",{className:"se-panelHeaderMain",children:[je(r2,{size:16,className:`se-panelChevron ${u?"se-panelChevron--open":""}`}),Pt("span",{className:"se-panelTitle",children:["Removed Animations (",w.length,")"]})]})}),u?je("div",{className:"se-removedAnimationList",children:w.map(f=>Pt("div",{className:"se-removedAnimationRow",children:[Pt("div",{children:[je("div",{className:"se-removedAnimationName",children:f.displayName||f.sourceName}),je("div",{className:"se-animationSource",children:f.sourceName})]}),je("button",{type:"button",className:"se-animationButton",onClick:()=>R(f.sourceName),children:"Restore"})]},f.sourceName))}):null]}):null]})}import{useState as _f}from"react";import{Pencil as d2,Trash2 as p2}from"lucide-react";import{jsx as sn,jsxs as qn}from"react/jsx-runtime";function up({config:e,onChange:t}){let[n,a]=_f(null),[r,o]=_f({title:"",description:""}),s=e.annotations,l=u=>{a(u),o({title:u.title,description:u.description||""})},i=()=>{if(!n||!r.title.trim())return;let u=s.map(b=>b.id===n.id?{...b,title:r.title.trim(),description:r.description||""}:b);t({...e,annotations:u}),a(null),o({title:"",description:""})},c=u=>{if(window.confirm("Delete this annotation?")){let g=s.filter(h=>h.id!==u).map((h,w)=>({...h,id:w+1}));t({...e,annotations:g}),a(null),o({title:"",description:""})}},d=()=>{a(null),o({title:"",description:""})};return qn(No,{title:"Annotations",children:[e.annotations.length===0?sn("div",{className:"bb-emptyAnnotations",children:"No annotations yet. Double-click on the model to add one."}):sn("div",{className:"bb-annotationsList",children:e.annotations.map(u=>qn("div",{className:"bb-annotationCard",children:[qn("div",{className:"bb-annotationHeader",children:[qn("div",{className:"bb-annotationBadge",children:["#",u.id]}),qn("div",{className:"bb-annotationActions",children:[sn("button",{className:"bb-annotationAction bb-annotationAction--edit",onClick:()=>l(u),title:"Edit annotation",children:sn(d2,{size:16})}),sn("button",{className:"bb-annotationAction bb-annotationAction--delete",onClick:()=>c(u.id),title:"Delete annotation",children:sn(p2,{size:16})})]})]}),sn("div",{className:"bb-annotationTitle",children:u.title}),u.description&&sn("div",{className:"bb-annotationDescription",children:u.description}),qn("div",{className:"bb-annotationPosition",children:["Position: [",u.worldPosition[0].toFixed(2),","," ",u.worldPosition[1].toFixed(2),","," ",u.worldPosition[2].toFixed(2),"]"]})]},u.id))}),n&&sn("div",{className:"bb-editAnnotationOverlay",onClick:d,children:qn("div",{className:"bb-editAnnotationPopup",onClick:u=>u.stopPropagation(),children:[qn("div",{className:"bb-editAnnotationHeader",children:[sn("h3",{className:"bb-editAnnotationTitle",children:"Edit Annotation"}),sn("button",{className:"bb-editAnnotationClose",onClick:d,children:"\xD7"})]}),qn("div",{className:"bb-editAnnotationBody",children:[qn("div",{className:"bb-field",children:[sn("label",{className:"bb-label",children:"Title"}),sn("input",{className:"bb-input",value:r.title,onChange:u=>o({...r,title:u.target.value}),placeholder:"Enter annotation title"})]}),qn("div",{className:"bb-field",children:[sn("label",{className:"bb-label",children:"Description"}),sn("textarea",{className:"bb-textarea",value:r.description,onChange:u=>o({...r,description:u.target.value}),placeholder:"Enter annotation description",rows:3})]}),qn("div",{className:"bb-editAnnotationActions",children:[sn("button",{className:"bb-button",onClick:d,children:"Cancel"}),sn("button",{className:"bb-button bb-button--primary",onClick:i,disabled:!r.title.trim(),children:"Save"}),sn("button",{className:"bb-button bb-button--danger",onClick:()=>c(n.id),children:"Delete"})]})]})]})})]})}import{useState as u2,useCallback as zo}from"react";import{ArrowDown as m2,ArrowUp as b2,MapPin as g2,Plus as f2,Trash2 as h2,Settings as x2}from"lucide-react";import{Fragment as y2,jsx as bt,jsxs as $t}from"react/jsx-runtime";var v2={enabled:!0,waypoints:[],loop:!0,autoPlay:!1},jo=3.5;function mp({config:e,onChange:t,cameraState:n,onPreviewWaypoint:a}){let r=e.cinematic??v2,{waypoints:o}=r,s=zo((v,p)=>{if(v.length<2)return 0;let m=0;for(let S=0;S<v.length-1;S++){let M=v[S].segmentDuration??jo;m+=M}return p&&v.length>1&&(m+=v[v.length-1].segmentDuration??jo),Math.max(m,0)},[]),l=zo(v=>{t({...e,cinematic:{...r,...v}})},[e,r,t]),i=zo(()=>{if(!n)return;let v={position:[...n.position],target:[...n.target],...n.azimuthAngle!=null?{azimuthAngle:n.azimuthAngle}:{},...n.polarAngle!=null?{polarAngle:n.polarAngle}:{},segmentDuration:jo},p=[...o,v],m=s(p,r.loop);l({waypoints:p,duration:m})},[n,o,r.loop,s,l]),c=zo(v=>{let p=o.filter((S,M)=>M!==v),m=s(p,r.loop);l({waypoints:p,duration:m})},[o,r.loop,s,l]),d=zo((v,p)=>{let m=v+p;if(m<0||m>=o.length)return;let S=[...o];[S[v],S[m]]=[S[m],S[v]];let M=s(S,r.loop);l({waypoints:S,duration:M})},[o,r.loop,s,l]),u=zo((v,p)=>{let m=o.map((M,k)=>k===v?{...M,...p}:M),S=s(m,r.loop);l({waypoints:m,duration:S})},[o,r.loop,s,l]),[b,g]=u2(!1),h=o.some(v=>v.segmentDuration!==void 0),w=zo(v=>v>=o.length-1?jo:o[v]?.segmentDuration??jo,[o]),B=o.length>=2;return $t(No,{title:"Cinematic Camera",children:[bt("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."}),$t("button",{type:"button",className:"bb-button bb-button--primary se-cinematicAdd",onClick:i,disabled:!n,title:"Capture the current camera view as a waypoint",children:[bt(f2,{size:15}),"Add waypoint from current view"]}),$t("div",{className:"se-customizeToggle",children:[$t("label",{className:"se-toggleLabel",children:[bt("input",{type:"checkbox",checked:b,onChange:v=>g(v.target.checked)}),bt(x2,{size:14}),bt("span",{children:"Customize durations between waypoints"})]}),b&&$t("span",{className:"se-toggleHint",children:["Set duration for each segment between waypoints: 1\u21922, 2\u21923, etc. Default: ",jo,"s"]})]}),o.length===0?bt("div",{className:"bb-emptyAnnotations",children:"No waypoints yet. Position the camera and add your first one."}):$t(y2,{children:[bt("div",{className:"se-waypointList",children:o.map((v,p)=>{let m=w(p),S=p===o.length-1,M=v.segmentDuration!==void 0&&v.segmentDuration!==jo;return $t("div",{children:[$t("div",{className:"se-waypointCard",children:[bt("div",{className:"se-waypointBadge",children:p+1}),$t("div",{className:"se-waypointBody",children:[$t("div",{className:"se-waypointCoords",children:["pos [",v.position.map(k=>k.toFixed(1)).join(", "),"]"]}),$t("div",{className:"se-waypointCoords",children:["look [",v.target.map(k=>k.toFixed(1)).join(", "),"]"]}),b&&!S&&$t("div",{className:`se-customBadge ${M?"se-customBadge--custom":"se-customBadge--default"}`,children:[m.toFixed(1),"s",!M&&" (default)"]})]}),$t("div",{className:"se-waypointActions",children:[bt("button",{className:"se-waypointAction",onClick:()=>a?.(v),title:"Fly camera to this waypoint",disabled:!a,children:bt(g2,{size:15})}),bt("button",{className:"se-waypointAction",onClick:()=>d(p,-1),title:"Move up",disabled:p===0,children:bt(b2,{size:15})}),bt("button",{className:"se-waypointAction",onClick:()=>d(p,1),title:"Move down",disabled:S,children:bt(m2,{size:15})}),bt("button",{className:"se-waypointAction se-waypointAction--delete",onClick:()=>c(p),title:"Delete waypoint",children:bt(h2,{size:15})})]})]}),b&&!S&&$t("div",{className:"se-segmentBetween",children:[$t("div",{className:"se-segmentLabel",children:[p+1," \u2192 ",p+2,!v.segmentDuration&&" (default)"]}),$t("div",{className:"se-segmentControls",children:[bt("span",{className:"se-durationLabel",children:"Duration:"}),bt("input",{type:"range",className:"se-segmentSlider",min:1,max:20,step:.5,value:m,onChange:k=>{let R=parseFloat(k.target.value);u(p,{segmentDuration:R})}}),$t("span",{className:"se-segmentValue",children:[m.toFixed(1),"s"]}),$t("div",{className:"se-presetButtons",children:[[2,4,6,8].map(k=>$t("button",{className:"se-presetButton",onClick:()=>u(p,{segmentDuration:k}),children:[k,"s"]},`preset-${p}-${k}`)),bt("button",{className:"se-presetButton se-presetButton--default",onClick:()=>{let k=o.map((f,C)=>{if(C===p){let{segmentDuration:x,...P}=f;return P}return f}),R=s(k,r.loop);l({waypoints:k,duration:R})},children:"Reset"})]})]})]})]},`waypoint-wrapper-${p}`)})}),$t("div",{className:"se-totalDuration",children:[bt("span",{className:"se-totalLabel",children:"Total duration:"}),bt("span",{className:"se-totalValue",children:B?(r.duration??s(o,r.loop)).toFixed(1)+"s":"-"}),!B&&bt("span",{className:"se-totalHint",children:"(need at least 2 waypoints)"})]})]}),bt(Qe,{label:"Enable cinematic camera",checked:r.enabled,onChange:v=>l({enabled:v})}),bt(Qe,{label:"Loop",checked:r.loop,onChange:v=>{let p=v,m=s(o,p);l({loop:p,duration:m})}}),bt(Qe,{label:"Auto-play on load",checked:r.autoPlay,onChange:v=>l({autoPlay:v})}),!b&&B&&bt(G,{label:"Duration",value:r.duration??s(o,r.loop),min:4,max:120,step:1,formatValue:v=>`${v}s`,onChange:v=>l({duration:v})})]})}import{Box as S2,Clapperboard as M2,MessageSquareText as k2,Sparkles as P2,Spotlight as T2,Video as R2}from"lucide-react";import{jsx as ln,jsxs as B2}from"react/jsx-runtime";var A2=[{label:"General",icon:ln(S2,{})},{label:"Lighting",icon:ln(T2,{})},{label:"Animations",icon:ln(M2,{})},{label:"Post Processing",icon:ln(P2,{})},{label:"Annotations",icon:ln(k2,{})},{label:"Cinematic",icon:ln(R2,{})}],zf={currentClip:null,isPlaying:!1,time:0,duration:0,play:()=>{},pause:()=>{},stop:()=>{},setSpeed:()=>{},seek:()=>{}};function bp({config:e,onChange:t,activeSubTab:n,onActiveSubTabChange:a,cameraState:r=null,onPreviewWaypoint:o,animationClipDetails:s=[],animationPlayback:l=zf}){let[i,c]=w2("General"),d=n??i,u=l??zf,{tier:b}=Yn(),g=Fr(b,"starter"),h=Fr(b,"growth");C2(()=>{n!==void 0&&c(n)},[n]);let w=B=>{n===void 0&&c(B),a?.(B)};return B2("div",{className:"se-tabContent",children:[ln("div",{className:"se-subTabRow",children:A2.map(B=>ln("button",{type:"button",title:B.label,className:`se-subTab ${d===B.label?"se-subTab--active":""}`,onClick:()=>w(B.label),children:B.icon},B.label))}),d==="General"&&ln(lp,{config:e,onChange:t}),d==="Lighting"&&ln(dp,{config:e,onChange:t}),d==="Animations"&&(g?ln(pp,{config:e,onChange:t,clipDetails:s,currentClip:u.currentClip,isPlaying:u.isPlaying,time:u.time,duration:u.duration,play:u.play,pause:u.pause,stop:u.stop,setSpeed:u.setSpeed,seek:u.seek}):ln(Dn,{requiredTier:"starter",feature:"Animation configuration"})),d==="Post Processing"&&(h?ln(cp,{config:e,onChange:t}):ln(Dn,{requiredTier:"growth",feature:"Post-processing effects"})),d==="Annotations"&&(g?ln(up,{config:e,onChange:t}):ln(Dn,{requiredTier:"starter",feature:"Annotations"})),d==="Cinematic"&&(g?ln(mp,{config:e,onChange:t,cameraState:r,onPreviewWaypoint:o}):ln(Dn,{requiredTier:"starter",feature:"Cinematic camera"}))]})}import{ChevronDown as jf,Info as If}from"lucide-react";import{jsx as wn,jsxs as Io}from"react/jsx-runtime";function Ff({title:e,trailing:t,children:n,disabled:a,open:r,onToggle:o,tooltip:s}){let l=s?`${s}`:e;return Io("div",{className:"bb-materialPanel",children:[Io("button",{type:"button",className:"bb-materialPanelHeader",onClick:o,"aria-expanded":r,title:l,children:[Io("div",{className:"bb-materialPanelTitleWrap",children:[wn(jf,{size:14,className:`bb-materialPanelChevron ${r?"bb-materialPanelChevron--open":""}`}),wn("span",{className:"bb-materialPanelTitle",children:e}),s?wn("span",{className:"bb-materialPanelHelp",title:l,"aria-label":l,role:"img",onClick:i=>i.stopPropagation(),children:wn(If,{size:12})}):null]}),t?wn("div",{onClick:i=>i.stopPropagation(),children:t}):null]}),r?wn("div",{className:"bb-materialPanelBody",style:a?{opacity:.45,pointerEvents:"none"}:void 0,children:n}):null]})}function Nn({title:e,open:t,onToggle:n,trailing:a,children:r,tooltip:o}){let s=o?`${e}: ${o}`:e;return Io("div",{className:"bb-section",children:[Io("button",{type:"button",className:"bb-sectionHeaderButton",onClick:n,"aria-expanded":t,title:s,children:[Io("span",{className:"bb-sectionHeaderMain",children:[wn(jf,{size:15,className:`bb-sectionChevron ${t?"bb-sectionChevron--open":""}`}),wn("h2",{className:"bb-sectionTitle",children:e}),o?wn("span",{className:"bb-sectionHelp",title:s,"aria-label":s,role:"img",onClick:l=>l.stopPropagation(),children:wn(If,{size:13})}):null]}),a?wn("span",{onClick:l=>l.stopPropagation(),children:a}):null]}),t?wn("div",{className:"bb-sectionBody",children:r}):null]})}function Vf({checked:e,onChange:t,label:n}){return Io("label",{className:"se-switch","aria-label":n,children:[wn("input",{type:"checkbox",checked:e,onChange:a=>t(a.target.checked)}),wn("span",{className:"se-switchTrack",children:wn("span",{className:"se-switchThumb"})})]})}import{useState as Gf}from"react";import{jsx as gp}from"react/jsx-runtime";function Un({panelKey:e,title:t,tooltip:n,toggleLabel:a,controls:r,children:o,requiredTier:s}){let{openMaterialPanels:l,materialPanelEnabled:i,onToggleMaterialPanel:c,onSetMaterialPanelState:d}=r,u=s?.locked??!1;return gp(Ff,{title:t,tooltip:n,disabled:u||!i[e],open:l[e],onToggle:()=>c(e),trailing:gp(Vf,{checked:!u&&i[e],onChange:u?()=>{}:b=>d(e,b),label:a??`Toggle ${t}`}),children:u&&s?gp(Dn,{requiredTier:s.tier,feature:t}):o})}import{useRef as Uf,useState as O2}from"react";import{HexColorInput as E2,HexColorPicker as L2}from"react-colorful";import{FileUp as D2}from"lucide-react";import{jsx as Xt,jsxs as oo}from"react/jsx-runtime";function Kt({label:e,value:t,placeholder:n,onChange:a}){let r=Uf(null);return oo("div",{className:"bb-field bb-field--full",children:[Xt("label",{className:"bb-label",children:e}),oo("div",{className:"bb-fileField",children:[Xt("input",{className:"bb-input bb-fileField-input",placeholder:n,value:t,onChange:o=>{let s=o.target.value;!s&&t&&Ac(t),a(s)}}),Xt("button",{type:"button",className:"bb-fileFieldButton",onClick:()=>r.current?.click(),"aria-label":`Select file for ${e}`,title:`Select file for ${e}`,children:Xt(D2,{size:20})}),Xt("input",{ref:r,type:"file",accept:"image/png,image/jpeg,image/webp,image/avif",className:"bb-hiddenInput",onChange:o=>{let s=o.target.files?.[0];if(!s)return;let l=Qu(s);t&&t!==l&&Ac(t),rm(l,URL.createObjectURL(s)),a(l),o.target.value=""}})]})]})}function Fo({label:e,value:t,fallback:n="#ffffff",onChange:a}){let[r,o]=O2(!1),s=t||n,l=Uf(null);return oo("div",{className:"bb-field",children:[Xt("span",{className:"bb-label",children:e}),Xt("div",{className:"se-fieldInline",children:Xt("span",{ref:l,style:{display:"inline-flex"},children:Xt(E2,{prefixed:!0,className:"se-swatch",onClick:()=>o(i=>!i),style:{background:s,color:Ia(s)},color:s,onChange:a})})}),r?Xt(ip,{anchorRef:l,onClose:()=>o(!1),children:Xt(L2,{color:s,onChange:a})}):null]})}function Fi({label:e,checked:t,onChange:n}){return oo("label",{className:"bb-checkbox",children:[Xt("input",{type:"checkbox",checked:t,onChange:a=>n(a.target.checked)}),e]})}function Hf({label:e,value:t,min:n,max:a,step:r,placeholder:o,onChange:s}){return oo("div",{className:"bb-field",children:[Xt("label",{className:"bb-label",children:e}),Xt("input",{className:"bb-input",type:"number",min:n,max:a,step:r,placeholder:o,value:t??"",onChange:l=>s(l.target.value===""?void 0:Number(l.target.value))})]})}function Ua({label:e,value:t,options:n,onChange:a}){return oo("div",{className:"bb-field",children:[Xt("label",{className:"bb-label",children:e}),Xt("select",{className:"bb-select",value:t,onChange:r=>a(r.target.value),children:n.map(r=>Xt("option",{value:r,children:r},r))})]})}function yt({label:e,value:t,min:n,max:a,step:r,onChange:o}){return oo("div",{className:"bb-field bb-field--full",children:[Xt("label",{className:"bb-label",children:e}),oo("div",{className:"bb-sliderField",children:[Xt("input",{className:`bb-slider ${t===void 0?"bb-slider--unset":""}`,type:"range",min:n,max:a,step:r,value:t??n,onChange:l=>o(Number(l.target.value))}),Xt("input",{className:"bb-input bb-input--compact",type:"number",min:n,max:a,step:r,value:t??"",onChange:l=>o(l.target.value===""?void 0:Number(l.target.value))})]})]})}import{Fragment as fp,jsx as J,jsxs as tn}from"react/jsx-runtime";function Wf({selectedItem:e,selectedMaterial:t,pbrWorkflow:n,onPbrWorkflowChange:a,openMaterialPanels:r,materialPanelEnabled:o,onToggleMaterialPanel:s,onSetMaterialPanelState:l,updateSelectedMaterial:i,setSelectedTexturePath:c}){let d={openMaterialPanels:r,materialPanelEnabled:o,onToggleMaterialPanel:s,onSetMaterialPanelState:l},{tier:u}=Yn(),b=Fr(u,"starter"),g={tier:"starter",locked:!b},[h,w]=Gf("roughness"),[B,v]=Gf("factor");return tn(fp,{children:[J(Un,{panelKey:"pbr",title:"PBR Maps",tooltip:"Controls the base color and workflow used for physically based shading.",controls:d,children:b?tn("div",{className:"bb-grid",children:[J(Ua,{label:"Workflow",value:n,options:["metalness","specular"],onChange:a}),J("div",{className:"bb-field bb-field--full",children:J("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."})}),J(Kt,{label:n==="specular"?"Albedo texture path":"Base color texture path",placeholder:"materials/oak-wood.jpg",value:t?.texture?.path??"",onChange:p=>c(e,"texture",p)}),J(Fo,{label:n==="specular"?"Albedo color":"Base color",value:t?.baseColor??"#ffffff",onChange:p=>i(e,m=>({...m,baseColor:p}))}),n==="metalness"?tn(fp,{children:[J(yt,{label:"Metalness",value:t?.metalness,min:0,max:1,step:.01,onChange:p=>i(e,m=>({...m,metalness:p}))}),J(Kt,{label:"Metalness map path",placeholder:"materials/body-metalness.jpg",value:t?.metalnessMap?.path??"",onChange:p=>c(e,"metalnessMap",p)})]}):tn(fp,{children:[J(yt,{label:"Specular intensity",value:t?.specularIntensity,min:0,max:1,step:.01,onChange:p=>i(e,m=>({...m,specularIntensity:p}))}),J(Fo,{label:"Specular color",value:t?.specularColor??"#ffffff",onChange:p=>i(e,m=>({...m,specularColor:p}))}),J(Kt,{label:"Specular intensity map path",placeholder:"materials/body-specular-intensity.jpg",value:t?.specularIntensityMap?.path??"",onChange:p=>c(e,"specularIntensityMap",p)}),J(Kt,{label:"Specular color map path",placeholder:"materials/body-specular-color.jpg",value:t?.specularColorMap?.path??"",onChange:p=>c(e,"specularColorMap",p)})]}),J(yt,{label:"Specular F0 / reflectivity",value:t?.reflectivity,min:0,max:1,step:.01,onChange:p=>i(e,m=>({...m,reflectivity:p}))})]}):tn("div",{className:"bb-grid",children:[J(Fo,{label:"Base color",value:t?.baseColor??"#ffffff",onChange:p=>i(e,m=>({...m,baseColor:p}))}),J(yt,{label:"Metalness",value:t?.metalness,min:0,max:1,step:.01,onChange:p=>i(e,m=>({...m,metalness:p}))}),J("div",{className:"bb-field bb-field--full",children:J(Dn,{requiredTier:"starter",feature:"Texture maps, the specular workflow, and reflectivity"})})]})}),J(Un,{panelKey:"roughness",requiredTier:g,title:"Roughness / Glossiness",tooltip:"Adjusts how matte or shiny the surface appears.",toggleLabel:"Toggle Roughness and Glossiness",controls:d,children:tn("div",{className:"bb-grid",children:[J(Ua,{label:"Mode",value:h,options:["roughness","glossiness"],onChange:w}),J("div",{className:"bb-field bb-field--full",children:J("p",{className:"bb-note",style:{margin:0},children:h==="roughness"?"Roughness: 0 is glossy, 1 is matte.":"Glossiness is the inverse of roughness (glossiness = 1 \u2212 roughness)"})}),h==="roughness"?J(yt,{label:"Roughness",value:t?.roughness,min:0,max:1,step:.01,onChange:p=>i(e,m=>({...m,roughness:p}))}):J(yt,{label:"Glossiness",value:t?.roughness===void 0?void 0:1-t.roughness,min:0,max:1,step:.01,onChange:p=>i(e,m=>({...m,roughness:p===void 0?void 0:1-p}))}),J(Kt,{label:h==="glossiness"?"Glossiness map path (applied as roughness)":"Roughness map path",placeholder:"materials/body-roughness.jpg",value:t?.roughnessMap?.path??"",onChange:p=>c(e,"roughnessMap",p)})]})}),J(Un,{panelKey:"emission",requiredTier:g,title:"Emission",tooltip:"Makes the material self-illuminated with emissive color and intensity.",controls:d,children:tn("div",{className:"bb-grid",children:[J(Fo,{label:"Emissive color",value:t?.emissive??"#000000",fallback:"#000000",onChange:p=>i(e,m=>({...m,emissive:p}))}),J(yt,{label:"Emissive intensity",value:t?.emissiveIntensity,min:0,max:10,step:.1,onChange:p=>i(e,m=>({...m,emissiveIntensity:p}))}),J(Kt,{label:"Emissive map path",placeholder:"materials/body-emissive.jpg",value:t?.emissiveMap?.path??"",onChange:p=>c(e,"emissiveMap",p)})]})}),J(Un,{panelKey:"opacity",requiredTier:g,title:"Opacity",tooltip:"Controls transparency, alpha testing, and blending behavior.",controls:d,children:tn("div",{className:"bb-grid",children:[J(yt,{label:"Opacity",value:t?.opacity,min:0,max:1,step:.01,onChange:p=>i(e,m=>({...m,opacity:p}))}),J(yt,{label:"Alpha test",value:t?.alphaTest,min:0,max:1,step:.01,onChange:p=>i(e,m=>({...m,alphaTest:p}))}),J(Kt,{label:"Alpha map path",placeholder:"materials/body-alpha.png",value:t?.alphaMap?.path??"",onChange:p=>c(e,"alphaMap",p)}),J(Ua,{label:"Blending mode",value:t?.blendingMode??"normal",options:ic,onChange:p=>i(e,m=>({...m,blendingMode:p}))}),tn("div",{className:"bb-field",children:[J("label",{className:"bb-label",children:"Alpha hash"}),J("div",{className:"bb-checkboxRow",children:J(Fi,{label:"Use alpha hash",checked:t?.alphaHash??!1,onChange:p=>i(e,m=>({...m,alphaHash:p}))})})]}),tn("div",{className:"bb-field",children:[J("label",{className:"bb-label",children:"Dithering"}),J("div",{className:"bb-checkboxRow",children:J(Fi,{label:"Use dithering",checked:t?.dithering??!1,onChange:p=>i(e,m=>({...m,dithering:p}))})})]})]})}),tn(Un,{panelKey:"normalBump",requiredTier:g,title:"Normal & Bump",tooltip:"Adds surface detail without changing the actual mesh shape.",toggleLabel:"Toggle Normal and Bump",controls:d,children:[tn("div",{className:"bb-grid",children:[J(Kt,{label:"Normal map path",placeholder:"materials/body-normal.jpg",value:t?.normalMap?.path??"",onChange:p=>c(e,"normalMap",p)}),J(yt,{label:"Normal scale",value:t?.normalScale,min:0,max:5,step:.01,onChange:p=>i(e,m=>({...m,normalScale:p}))}),J(Kt,{label:"Bump map path",placeholder:"materials/body-bump.jpg",value:t?.bumpMap?.path??"",onChange:p=>c(e,"bumpMap",p)}),J(yt,{label:"Bump scale",value:t?.bumpScale,min:0,max:5,step:.01,onChange:p=>i(e,m=>({...m,bumpScale:p}))})]}),J("div",{className:"bb-checkboxRow",style:{marginTop:12},children:J(Fi,{label:"Flip normal Y",checked:t?.flipNormalY??!1,onChange:p=>i(e,m=>({...m,flipNormalY:p}))})})]}),J(Un,{panelKey:"displacement",requiredTier:g,title:"Displacement",tooltip:"Offsets geometry using a texture to create real surface height.",controls:d,children:tn("div",{className:"bb-grid",children:[J(Kt,{label:"Displacement map path",placeholder:"materials/body-displacement.jpg",value:t?.displacementMap?.path??"",onChange:p=>c(e,"displacementMap",p)}),J(yt,{label:"Displacement scale",value:t?.displacementScale,min:-5,max:5,step:.01,onChange:p=>i(e,m=>({...m,displacementScale:p}))}),J(yt,{label:"Displacement bias",value:t?.displacementBias,min:-5,max:5,step:.01,onChange:p=>i(e,m=>({...m,displacementBias:p}))})]})}),J(Un,{panelKey:"ao",requiredTier:g,title:"Ambient Occlusion",tooltip:"Darkens creases and contact areas to add depth.",controls:d,children:tn("div",{className:"bb-grid",children:[J(Kt,{label:"AO map path",placeholder:"materials/body-ao.jpg",value:t?.aoMap?.path??"",onChange:p=>c(e,"aoMap",p)}),J(yt,{label:"AO intensity",value:t?.aoMapIntensity,min:0,max:5,step:.01,onChange:p=>i(e,m=>({...m,aoMapIntensity:p}))})]})}),tn(Un,{panelKey:"clearcoat",requiredTier:g,title:"Clearcoat",tooltip:"Adds a glossy protective layer on top of the base material.",controls:d,children:[tn("div",{className:"bb-grid",children:[J(Kt,{label:"Clearcoat map path",placeholder:"materials/body-clearcoat.jpg",value:t?.clearcoatMap?.path??"",onChange:p=>c(e,"clearcoatMap",p)}),J(yt,{label:"Clearcoat",value:t?.clearcoat,min:0,max:1,step:.01,onChange:p=>i(e,m=>({...m,clearcoat:p}))}),J(Kt,{label:"Clearcoat roughness map path",placeholder:"materials/body-clearcoat-roughness.jpg",value:t?.clearcoatRoughnessMap?.path??"",onChange:p=>c(e,"clearcoatRoughnessMap",p)}),J(yt,{label:"Clearcoat roughness",value:t?.clearcoatRoughness,min:0,max:1,step:.01,onChange:p=>i(e,m=>({...m,clearcoatRoughness:p}))}),J(Kt,{label:"Clearcoat normal map path",placeholder:"materials/body-clearcoat-normal.jpg",value:t?.clearcoatNormalMap?.path??"",onChange:p=>c(e,"clearcoatNormalMap",p)}),J(yt,{label:"Clearcoat normal scale",value:t?.clearcoatNormalScale,min:0,max:5,step:.01,onChange:p=>i(e,m=>({...m,clearcoatNormalScale:p}))})]}),J("div",{className:"bb-checkboxRow",style:{marginTop:12},children:J(Fi,{label:"Flip clearcoat normal Y",checked:t?.flipClearcoatNormalY??!1,onChange:p=>i(e,m=>({...m,flipClearcoatNormalY:p}))})})]}),J(Un,{panelKey:"sheen",requiredTier:g,title:"Sheen",tooltip:"Adds a soft fabric-like sheen on grazing angles.",controls:d,children:tn("div",{className:"bb-grid",children:[J(yt,{label:"Sheen",value:t?.sheen,min:0,max:1,step:.01,onChange:p=>i(e,m=>({...m,sheen:p}))}),J(Fo,{label:"Sheen color",value:t?.sheenColor??"#ffffff",onChange:p=>i(e,m=>({...m,sheenColor:p}))}),J(Kt,{label:"Sheen color map path",placeholder:"materials/body-sheen-color.jpg",value:t?.sheenColorMap?.path??"",onChange:p=>c(e,"sheenColorMap",p)}),J(yt,{label:"Sheen roughness",value:t?.sheenRoughness,min:0,max:1,step:.01,onChange:p=>i(e,m=>({...m,sheenRoughness:p}))}),J(Kt,{label:"Sheen roughness map path",placeholder:"materials/body-sheen-roughness.jpg",value:t?.sheenRoughnessMap?.path??"",onChange:p=>c(e,"sheenRoughnessMap",p)})]})}),J(Un,{panelKey:"anisotropy",requiredTier:g,title:"Anisotropy",tooltip:"Stretches reflections in one direction for brushed or fiber-like surfaces.",controls:d,children:tn("div",{className:"bb-grid",children:[J(yt,{label:"Intensity",value:t?.anisotropy,min:0,max:1,step:.01,onChange:p=>i(e,m=>({...m,anisotropy:p}))}),J(Ua,{label:"Tilt direction",value:B,options:["factor","texture"],onChange:v}),B==="factor"?J(yt,{label:"Rotation (rad)",value:t?.anisotropyRotation,min:0,max:6.28,step:.01,onChange:p=>i(e,m=>({...m,anisotropyRotation:p}))}):J(Kt,{label:"Anisotropy map path",placeholder:"materials/body-anisotropy.jpg",value:t?.anisotropyMap?.path??"",onChange:p=>c(e,"anisotropyMap",p)})]})}),J(Un,{panelKey:"transmission",requiredTier:g,title:"Transmission & Volume",tooltip:"Controls glass-like transmission and how light travels through volume.",toggleLabel:"Toggle Transmission and Volume",controls:d,children:tn("div",{className:"bb-grid",children:[J(yt,{label:"Transmission",value:t?.transmission,min:0,max:1,step:.01,onChange:p=>i(e,m=>({...m,transmission:p}))}),J(Kt,{label:"Transmission map path",placeholder:"materials/body-transmission.jpg",value:t?.transmissionMap?.path??"",onChange:p=>c(e,"transmissionMap",p)}),J(yt,{label:"Thickness",value:t?.thickness,min:0,max:5,step:.01,onChange:p=>i(e,m=>({...m,thickness:p}))}),J(Kt,{label:"Thickness map path",placeholder:"materials/body-thickness.jpg",value:t?.thicknessMap?.path??"",onChange:p=>c(e,"thicknessMap",p)}),J(Fo,{label:"Volume tint",value:t?.attenuationColor??"#ffffff",onChange:p=>i(e,m=>({...m,attenuationColor:p}))}),J(Hf,{label:"Attenuation distance",value:t?.attenuationDistance,min:0,step:.01,placeholder:"Infinity when unset",onChange:p=>i(e,m=>({...m,attenuationDistance:p}))})]})}),J(Un,{panelKey:"faces",requiredTier:g,title:"Faces Rendering",tooltip:"Chooses which side of the mesh renders and how backfaces are handled.",controls:d,children:J("div",{className:"bb-grid",children:J(Ua,{label:"Side",value:t?.side??"front",options:ac,onChange:p=>i(e,m=>({...m,side:p}))})})})]})}var $f=[{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 hp,jsxs as N2}from"react/jsx-runtime";function Xf({disabled:e,onApply:t}){return hp("div",{className:"bb-presetGallery",children:$f.map(n=>N2("button",{type:"button",className:"bb-presetSwatch",disabled:e,title:`Apply ${n.label} preset`,onClick:()=>t(n.material),children:[hp("span",{className:"bb-presetSwatchColor",style:{background:n.swatch}}),hp("span",{className:"bb-presetSwatchLabel",children:n.label})]},n.id))})}import{useEffect as _2,useRef as z2,useState as j2}from"react";import{ChevronDown as I2,Download as F2,FileCode2 as V2,FileJson as U2}from"lucide-react";import{jsx as Al,jsxs as Vi}from"react/jsx-runtime";function xp({disabled:e,exporting:t,onExportJson:n,onExportTs:a}){let[r,o]=j2(!1),s=z2(null);return _2(()=>{if(!r)return;let l=i=>{s.current?.contains(i.target)||o(!1)};return window.addEventListener("pointerdown",l),()=>window.removeEventListener("pointerdown",l)},[r]),Vi("div",{className:"bb-exportMenuWrapper",ref:s,children:[Vi("button",{type:"button",className:"bb-button bb-button--ghost",disabled:e||t,onClick:()=>o(l=>!l),title:"Export",children:[Al(F2,{size:14}),t?"Exporting\u2026":"Export",Al(I2,{size:12})]}),r&&Vi("div",{className:"bb-exportMenu",children:[Vi("button",{type:"button",className:"bb-exportMenuItem",onClick:()=>{o(!1),n()},children:[Al(U2,{size:14}),"JSON"]}),Vi("button",{type:"button",className:"bb-exportMenuItem",onClick:()=>{o(!1),a()},children:[Al(V2,{size:14}),"TypeScript"]})]})]})}import{jsx as Vo,jsxs as vp}from"react/jsx-runtime";function Kf({selectedItem:e,selectedBinding:t,open:n,onToggle:a,updateBinding:r,idError:o}){return Vo(Nn,{title:"Identity",open:n,onToggle:a,children:vp("div",{className:"bb-grid",children:[vp("div",{className:"bb-field bb-field--full",children:[Vo("label",{className:"bb-label",children:"Model Node ID"}),Vo("span",{className:"bb-note",children:"This is the exact mesh name from the imported model and stays locked."}),Vo("input",{className:"bb-input bb-readonly",value:t.modelObjectId,readOnly:!0})]}),vp("div",{className:"bb-field bb-field--full",children:[Vo("label",{className:"bb-label",children:"ID"}),Vo("input",{className:`bb-input ${o?"bb-input--error":""}`,value:t.id,onChange:s=>r(e,l=>({...l,id:s.target.value}))}),o?Vo("span",{className:"bb-status bb-status--error",children:o}):null]})]})})}import{useEffect as H2,useState as qf}from"react";var Yf=["other","body","light","wheel","glass","interior","floor","wall","door","furniture","decor","electronics","seat","table","chair","window","sofa","bed","engine","headlight"],Jf=["normal","hidden","selected","disabled"];import{jsx as fn,jsxs as lr}from"react/jsx-runtime";function Zf({selectedItem:e,selectedBinding:t,open:n,onToggle:a,updateBinding:r}){let[o,s]=qf(t.group??""),[l,i]=qf(t.tags?.join(", ")??"");H2(()=>{s(t.group??""),i(t.tags?.join(", ")??"")},[e,t.group,t.tags]);let c=()=>{r(e,u=>({...u,group:o.trim()||void 0}))},d=()=>{let u=[...new Set(l.split(",").map(b=>b.trim()).filter(Boolean))];r(e,b=>({...b,tags:u.length>0?u:void 0}))};return lr(Nn,{title:"Basics",open:n,onToggle:a,children:[lr("div",{className:"bb-grid",children:[lr("div",{className:"bb-field",children:[fn("label",{className:"bb-label",children:"Label"}),fn("input",{className:"bb-input",value:t.label??"",onChange:u=>r(e,b=>({...b,label:u.target.value}))})]}),lr("div",{className:"bb-field",children:[fn("label",{className:"bb-label",children:"Type"}),fn("input",{className:"bb-input",list:"binding-type-suggestions",value:t.type,onChange:u=>r(e,b=>({...b,type:u.target.value}))}),fn("datalist",{id:"binding-type-suggestions",children:Yf.map(u=>fn("option",{value:u},u))})]}),lr("div",{className:"bb-field",children:[fn("label",{className:"bb-label",children:"Status"}),fn("select",{className:"bb-select",value:t.status??"normal",onChange:u=>r(e,b=>({...b,status:u.target.value})),children:Jf.map(u=>fn("option",{value:u,children:u},u))})]}),lr("div",{className:"bb-field",children:[fn("label",{className:"bb-label",children:"Group"}),fn("input",{className:"bb-input",placeholder:"paint",value:o,onChange:u=>s(u.target.value),onBlur:c,onKeyDown:u=>{u.key==="Enter"&&u.currentTarget.blur()}})]}),lr("div",{className:"bb-field",children:[fn("label",{className:"bb-label",children:"Tags"}),fn("input",{className:"bb-input",placeholder:"exterior, configurable",value:l,onChange:u=>i(u.target.value),onBlur:d,onKeyDown:u=>{u.key==="Enter"&&u.currentTarget.blur()}})]})]}),lr("div",{className:"bb-checkboxRow",style:{marginTop:12},children:[lr("label",{className:"bb-checkbox",children:[fn("input",{type:"checkbox",checked:t.selectable??!1,onChange:u=>r(e,b=>({...b,selectable:u.target.checked}))}),"selectable"]}),lr("label",{className:"bb-checkbox",children:[fn("input",{type:"checkbox",checked:t.hoverable??!1,onChange:u=>r(e,b=>({...b,hoverable:u.target.checked}))}),"hoverable"]}),lr("label",{className:"bb-checkbox",children:[fn("input",{type:"checkbox",checked:t.visible??!1,onChange:u=>r(e,b=>({...b,visible:u.target.checked}))}),"visible"]})]})]})}import{useEffect as W2,useState as $2}from"react";var Uo=[{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."}],Bl="__custom__";function Ui(e){return Uo.find(t=>t.id===e)}var cD=Uo.filter(e=>e.handling==="viewer").map(e=>e.id),G2=new Set(["","New Action",...Uo.map(e=>e.label)]);function yp(e){return G2.has(e.trim())}function Qf(e,t){let n=Array.from({length:t.length+1},(a,r)=>r);for(let a=1;a<=e.length;a+=1){let r=[a];for(let o=1;o<=t.length;o+=1){let s=n[o-1]+(e[a-1]===t[o-1]?0:1);r[o]=Math.min(r[o-1]+1,n[o]+1,s)}n=r}return n[t.length]}function eh(e){if(Ui(e))return null;let t=e.trim().toLowerCase();if(!t)return null;let n=t.replace(/[^a-z0-9]/g,""),a=null;for(let r of Uo){let o=Math.min(Qf(t,r.id),Qf(n,r.id.replace(/[^a-z0-9]/g,"")));(!a||o<a.distance)&&(a={id:r.id,distance:o})}return a&&a.distance<=2?a.id:null}import{Fragment as K2,jsx as Yt,jsxs as Zn}from"react/jsx-runtime";var th=Uo.filter(e=>e.handling==="viewer"),X2=Uo.filter(e=>e.handling==="host");function nh({selectedItem:e,selectedBinding:t,open:n,onToggle:a,updateBinding:r}){let[o,s]=$2(new Set);W2(()=>{s(new Set)},[e]);let l=t.actions??[],i=(u,b)=>r(e,g=>({...g,actions:(g.actions??[]).map((h,w)=>w===u?b(h):h)})),c=u=>{r(e,b=>({...b,actions:(b.actions??[]).filter((g,h)=>h!==u)})),s(b=>{let g=new Set;return b.forEach(h=>{h<u?g.add(h):h>u&&g.add(h-1)}),g})},d=(u,b)=>s(g=>{let h=new Set(g);return b?h.add(u):h.delete(u),h});return Zn(Nn,{title:"Actions",open:n,onToggle:a,children:[Yt("div",{className:"bb-actionList",children:l.map((u,b)=>{let g=Ui(u.id),h=o.has(b)||!g,w=u.id.trim(),B=g?null:eh(u.id),v=w.length>0&&l.some((p,m)=>m!==b&&p.id.trim()===w);return Zn("div",{className:"bb-actionCard",children:[Zn("div",{className:"bb-actionCardHeader",children:[Zn("div",{className:"bb-actionCardTitle",children:["Action ",b+1]}),Yt("div",{className:"bb-actionCardMeta",children:u.type})]}),Zn("div",{className:"bb-actionGrid",children:[Zn("div",{className:"bb-field",children:[Yt("label",{className:"bb-label",children:"Action ID"}),Zn("select",{className:"bb-select",value:h?Bl:u.id,onChange:p=>{let m=p.target.value;if(m===Bl){d(b,!0);return}d(b,!1);let S=Ui(m);i(b,M=>({...M,id:m,label:S&&yp(M.label)?S.label:M.label}))},children:[Yt("optgroup",{label:"Handled by the viewer",children:th.map(p=>Yt("option",{value:p.id,children:p.id},p.id))}),Yt("optgroup",{label:"Handled by your app",children:X2.map(p=>Yt("option",{value:p.id,children:p.id},p.id))}),Yt("option",{value:Bl,children:"Custom\u2026"})]})]}),h?Zn("div",{className:"bb-field",children:[Yt("label",{className:"bb-label",children:"Custom action ID"}),Yt("input",{className:"bb-input",value:u.id,placeholder:"open-datasheet",onChange:p=>{d(b,!0),i(b,m=>({...m,id:p.target.value}))}})]}):null,Zn("div",{className:"bb-field",children:[Yt("label",{className:"bb-label",children:"Label"}),Yt("input",{className:"bb-input",value:u.label,onChange:p=>i(b,m=>({...m,label:p.target.value}))})]}),g?Yt("span",{className:"bb-note",children:g.description}):w.length===0?Yt("span",{className:"bb-note",style:{color:"#fca5a5"},children:"An action ID is required, the button renders but can never be identified in onAction."}):Zn("span",{className:"bb-note",style:{color:"#fcd34d"},children:["Unrecognised ID, the viewer has no built-in behavior for it. Add declarative effects and execute them with useViewerActions, or handle it in onAction.",B?Zn(K2,{children:[" Did you mean ",Yt("button",{type:"button",className:"bb-linkButton",onClick:()=>{d(b,!1);let p=Ui(B);i(b,m=>({...m,id:B,label:p&&yp(m.label)?p.label:m.label}))},children:B}),"?"]}):null]}),u.effects?.length?Zn("span",{className:"bb-note",children:[u.effects.length," declarative effect",u.effects.length===1?"":"s",", execute with useViewerActions."]}):null,v?Yt("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]}),Yt("div",{className:"bb-actionFooter",children:Yt("button",{type:"button",className:"bb-button bb-button--ghost bb-actionRemove",onClick:()=>c(b),children:"Remove Action"})})]},b)})}),Yt("div",{style:{marginTop:10},children:Yt("button",{type:"button",className:"bb-button",onClick:()=>{let u=th.find(b=>!l.some(g=>g.id===b.id));r(e,b=>({...b,actions:[...b.actions??[],{id:u?.id??"",label:u?.label??"New Action",type:"command"}]})),u||d(l.length,!0)},children:"Add Action"})})]})}import{MapPin as Y2,Trash2 as J2}from"lucide-react";import{Fragment as q2,jsx as Qn,jsxs as Hn}from"react/jsx-runtime";function rh({selectedBinding:e,open:t,onToggle:n,cameraState:a,formattedCameraState:r,savedCameraPosition:o,onSaveCameraPosition:s,onGoToSavedCamera:l,onClearSavedCamera:i,onResetView:c,onFitScene:d}){return Hn(Nn,{title:"Camera Position",open:t,onToggle:n,children:[Hn("div",{className:"se-waypointCard bb-cameraWaypoint",children:[Qn("span",{className:"bb-cameraLiveBadge",children:"LIVE"}),Hn("div",{className:"se-waypointBody",children:[Qn("div",{className:"bb-cameraWaypointLabel",children:"Current view"}),a?Hn(q2,{children:[Hn("div",{className:"se-waypointCoords",children:["pos ",r?.position]}),Hn("div",{className:"se-waypointCoords",children:["look ",r?.target]})]}):Qn("div",{className:"se-waypointCoords",children:"Move the camera to see live position"})]})]}),Hn("div",{className:"bb-cameraControls bb-cameraControls--centered",children:[Qn("button",{type:"button",className:"bb-button bb-button--primary",onClick:s,disabled:!a,children:"Save"}),Qn("button",{type:"button",className:"bb-button bb-button--ghost",onClick:c,children:"Reset View"}),Qn("button",{type:"button",className:"bb-button bb-button--ghost",onClick:d,children:"Fit Scene"})]}),o?.position&&o?.target&&Hn("div",{className:"se-waypointCard bb-cameraWaypoint",children:[Qn("span",{className:"bb-cameraSavedBadge",children:"SAVED"}),Hn("div",{className:"se-waypointBody",children:[Hn("div",{className:"bb-cameraWaypointLabel",children:["For ",e.label]}),Hn("div",{className:"se-waypointCoords",children:["pos [",o.position.map(u=>u.toFixed(1)).join(", "),"]"]}),Hn("div",{className:"se-waypointCoords",children:["look [",o.target.map(u=>u.toFixed(1)).join(", "),"]"]})]}),Hn("div",{className:"se-waypointActions",children:[Qn("button",{className:"se-waypointAction",onClick:l,title:"Fly camera to the saved position",children:Qn(Y2,{size:15})}),Qn("button",{className:"se-waypointAction se-waypointAction--delete",onClick:i,title:"Delete saved position",children:Qn(J2,{size:15})})]})]}),Qn("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 Z2,RotateCcw as Q2}from"lucide-react";import{jsx as Tt,jsxs as cr}from"react/jsx-runtime";var oh=["X","Y","Z"];var eM=.1;function wp(e){let t=e%360;return t<0?t+360:t}function ah(e){return wp(e*180/Math.PI)}function ih(e){return e*Math.PI/180}function tM(e,t,n){let a=[...e],r=ah(e[t]);return a[t]=ih(wp(r+n)),a}function nM({value:e,min:t=-1/0,max:n=1/0,step:a=.1,disabled:r=!1,onChange:o,formatValue:s=i=>Number(i.toFixed(3)),label:l}){return Tt("div",{className:"bb-transformAxesGrid",children:oh.map((i,c)=>cr("div",{className:"bb-transformAxis",children:[Tt("span",{className:"se-axisStepperLabel bb-transformAxisLabel",children:i}),Tt("div",{className:"bb-transformAxisControl",children:Tt("input",{type:"number",className:"se-numberInput bb-transformNumberInput",step:a,min:t,max:n,value:s(e[c]),disabled:r,"aria-label":`${i} ${l?.toLowerCase()||""}`,onChange:d=>{let u=Number(d.target.value);if(Number.isFinite(u)){let b=Math.max(t,Math.min(n,u)),g=[...e];g[c]=b,o(g)}}})})]},i))})}function sh({selectedItem:e,selectedBinding:t,open:n,onToggle:a,updateBinding:r,moveModeEnabled:o,onToggleMoveMode:s,transformSpace:l,onTransformSpaceChange:i,originalTransform:c}){let d=t.transform?.rotation??c?.rotation??[0,0,0],u=t.transform?.position??c?.position??[0,0,0],b=(p,m)=>{let S=p.transform?.rotation??c?.rotation??[0,0,0],M=p.transform?.position??c?.position??[0,0,0],k=p.transform?.scale??c?.scale??[1,1,1],R=c?.pivotLocal??[0,0,0],f=Ug(M,S,m,k,R,c?.rotationOrder??"XYZ");return{...p,transform:{...p.transform,position:f,rotation:m}}},g=(p,m)=>{e&&r(e,S=>{let M=S.transform?.rotation??c?.rotation??[0,0,0],k=tM(M,p,m);return b(S,k)})},h=(p,m)=>{e&&r(e,S=>{let k=[...S.transform?.rotation??c?.rotation??[0,0,0]];return k[p]=ih(wp(m)),b(S,k)})},w=(p,m)=>{e&&r(e,S=>{let k=[...S.transform?.position??c?.position??[0,0,0]];return k[p]=m,{...S,transform:{...S.transform,position:k}}})},B=(p,m)=>{e&&w(p,u[p]+m)},v=()=>{!e||!c||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 cr(Nn,{title:"Move & Rotate",open:n,onToggle:a,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:[cr("div",{className:"se-field",children:[cr("div",{className:"se-fieldLabel",children:[cr("span",{children:[Tt(Z2,{size:14,style:{marginRight:6,verticalAlign:"-2px"}}),"Transform gizmo"]}),cr("label",{className:"se-switch","aria-label":"Toggle move mode",children:[Tt("input",{type:"checkbox",checked:o,onChange:p=>s(p.target.checked)}),Tt("span",{className:"se-switchTrack",children:Tt("span",{className:"se-switchThumb"})})]})]}),Tt("span",{className:"bb-note",children:"Select a mesh \xB7 drag the colored arrows or planes to move"})]}),cr("div",{className:"se-field",style:{marginTop:10},children:[Tt("div",{className:"se-fieldLabel",children:Tt("span",{children:"Axis space"})}),Tt("div",{className:"se-segmentedControl",children:["world","local"].map(p=>Tt("button",{type:"button",className:`se-segmentedOption ${l===p?"se-segmentedOption--active":""}`,onClick:()=>i(p),children:p},p))})]}),cr("div",{className:"se-field",style:{marginTop:10},children:[Tt("div",{className:"se-fieldLabel",children:Tt("span",{children:"Rotation (degrees)"})}),Tt("div",{className:"bb-transformAxesGrid",children:oh.map((p,m)=>{let S=Math.round(ah(d[m]));return cr("div",{className:"bb-transformAxis",children:[Tt("span",{className:"se-axisStepperLabel bb-transformAxisLabel",children:p}),Tt("div",{className:"bb-transformAxisControl",children:Tt("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 k=Number(M.target.value);Number.isFinite(k)&&h(m,k)}})})]},p)})})]}),cr("div",{className:"se-field",style:{marginTop:10},children:[Tt("div",{className:"se-fieldLabel",children:Tt("span",{children:"Position"})}),Tt(nM,{value:u,min:-1/0,max:1/0,step:eM,disabled:!e,label:"position",onChange:p=>{e&&r(e,m=>({...m,transform:{...m.transform,position:p}}))}})]}),cr("button",{type:"button",className:"bb-button bb-button--ghost",style:{marginTop:10,display:"inline-flex",alignItems:"center",gap:6},disabled:!e||!c,onClick:v,title:"Restore this node's position and rotation to what they were in the original model",children:[Tt(Q2,{size:14}),"Restore original position & rotation"]})]})}import{useMemo as ch,useState as sM}from"react";function rM(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 Cp(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 oM(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 aM(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 iM(e){let t=oM(e);return{id:rM(e),modelObjectId:e,type:t,label:Cp(e),status:"normal",selectable:!0,hoverable:!0,visible:!0,style:{},actions:aM(t),metrics:{},metadata:{}}}function Sp(e){return Object.fromEntries(e.map(t=>[t,iM(t)]))}function lh(e){let{nodesById:t}=ha(e),n=[];for(let[a,r]of Object.entries(t)){let o=r;o.isMesh&&o.geometry&&r.name&&n.push(a)}return n.sort((a,r)=>a.localeCompare(r))}import{Fragment as lM,jsx as Ho,jsxs as ao}from"react/jsx-runtime";function dh({bindings:e,selectedItem:t,onSelect:n,onHover:a,isOpen:r=!0,onToggle:o}){let[s,l]=sM(""),i=ch(()=>Object.keys(e),[e]),c=ch(()=>{let d=s.trim().toLowerCase();return d?i.filter(u=>{let b=e[u];return u.toLowerCase().includes(d)||b.label?.toLowerCase().includes(d)||b.type.toLowerCase().includes(d)}):i},[e,i,s]);return ao("aside",{className:`bb-sidebar bb-sidebar--right ${r?"":"bb-sidebar--collapsed"}`,children:[ao("div",{className:"bb-header bb-header--sidebar",children:[!r&&Ho("button",{type:"button",className:"bb-sidebarToggle",onClick:()=>o?.(!0),"aria-label":"Open scene nodes sidebar",title:"Open scene nodes",children:"\u2190"}),r&&ao(lM,{children:[ao("div",{children:[Ho("div",{className:"bb-sectionKicker",children:"Scene Nodes"}),ao("div",{className:"bb-sectionHeading",children:[c.length," visible entries"]})]}),Ho("button",{type:"button",className:"bb-sidebarToggle",onClick:()=>o?.(!1),"aria-label":"Close scene nodes sidebar",title:"Close scene nodes",children:"\u2192"})]})]}),r&&ao("section",{className:"bb-nodeList",children:[Ho("div",{className:"bb-search",children:Ho("input",{className:"bb-input",placeholder:"Search nodes, labels, or types",value:s,onChange:d=>l(d.target.value)})}),Ho("div",{className:"bb-nodeItems",children:c.map(d=>{let u=e[d];return ao("button",{type:"button",className:`bb-nodeButton ${d===t?"bb-nodeButton--active":""}`,onClick:()=>n(d),onMouseEnter:()=>a?.(d),onMouseLeave:()=>a?.(null),children:[Ho("span",{className:"bb-nodeName",children:d}),ao("span",{className:"bb-nodeMeta",children:[u.type,u.label===Cp(d)?"":u.label||"\xB7 Untitled"]})]},d)})})]})]})}import{jsx as Ol,jsxs as ph}from"react/jsx-runtime";function Mp({title:e,label:t,open:n,onToggle:a,draft:r,error:o,example:s,onDraftChange:l,onCommit:i}){return Ol(Nn,{title:e,open:n,onToggle:a,children:ph("div",{className:"bb-field",children:[Ol("label",{className:"bb-label",children:t}),Ol("textarea",{className:"bb-textarea",value:r,onChange:c=>l(c.target.value),onBlur:i}),o?Ol("span",{className:"bb-status bb-status--error",children:o}):ph("span",{className:"bb-note",children:["Use a JSON object like ",s,"."]})]})})}function uh(e,t){let n=new Map(e.animations.clips.map(o=>[o.sourceName,o])),a=t.map(({sourceName:o})=>n.get(o)??{sourceName:o,displayName:o,hidden:!1,loopMode:"repeat",speed:1}),r=e.animations.autoplayClip&&a.some(o=>o.sourceName===e.animations.autoplayClip&&!o.hidden)?e.animations.autoplayClip:null;return{clips:a,autoplayClip:r}}import{useCallback as El,useReducer as cM,useRef as dM}from"react";var pM=100;function uM(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(-pM),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,...a]=e.future;return{past:[...e.past,e.present],present:n,future:a}}case"reset":return{past:[],present:t.value,future:[]}}}function kp(e,t=600){let[n,a]=cM(uM,{past:[],present:e,future:[]}),r=dM(0),o=El(c=>{let d=Date.now(),u=d-r.current<t;r.current=d,a({type:"set",updater:c,coalesce:u})},[t]),s=El(()=>{r.current=0,a({type:"undo"})},[]),l=El(()=>{r.current=0,a({type:"redo"})},[]),i=El(c=>{r.current=0,a({type:"reset",value:c})},[]);return{value:n.present,setValue:o,undo:s,redo:l,reset:i,canUndo:n.past.length>0,canRedo:n.future.length>0}}import{strToU8 as mM}from"fflate";function mh(e){return JSON.stringify(e,null,2)}function bh(e){return['import { defineObjectBindings } from "@liveroom-tech/react-immersive/utils";',"",`export const objectBindings = defineObjectBindings(${JSON.stringify(e,null,2)});`,""].join(`
9
+ `,Bc=class extends Lx{constructor(t=1){super("ExposureEffect",Nx,{blendFunction:Ex.NORMAL,uniforms:new Map([["exposure",new Dx(t)]])})}set exposure(t){this.uniforms.get("exposure").value=t}},sm=Ax(function({exposure:t},n){let a=Ox(()=>new Bc(t),[]);return a.exposure=t,Bx(n,()=>a,[a]),_x("primitive",{object:a,dispose:null})});import{useFrame as zx,useThree as ws}from"@react-three/fiber";import*as pm from"@react-three/postprocessing";import{BlendFunction as jx}from"postprocessing";import{Color as Ix,MathUtils as Fx,Mesh as Vx,Vector2 as lm,Vector3 as cm}from"three";import{useEffect as dm,useMemo as Cs,useRef as Oc}from"react";import{jsx as Hx}from"react/jsx-runtime";var Ux=pm.LensFlareEffect;function um({config:e}){let t=ws(b=>b.camera),n=ws(b=>b.raycaster),a=ws(b=>b.scene),r=ws(b=>b.viewport),o=Oc(null),s=Oc(new cm),l=Oc(new lm),i=Cs(()=>new cm(...e.lensPosition),[e.lensPosition]),c=Cs(()=>new Ix(e.colorGain??"#141414"),[e.colorGain]),d=Cs(()=>new lm(0,0),[]),u=Cs(()=>new Ux({blendFunction:jx.NORMAL,enabled:!0,glareSize:e.glareSize,lensPosition:i,screenRes:d,starPoints:6,flareSize:e.flareSize,flareSpeed:e.flareSpeed,flareShape:e.flareShape,animated:e.animated,anamorphic:e.anamorphic,colorGain:c,lensDirtTexture:null,haloScale:e.haloScale,secondaryGhosts:e.secondaryGhosts,aditionalStreaks:e.aditionalStreaks,ghostScale:e.ghostScale,opacity:e.opacity,starBurst:e.starBurst}),[c,e.aditionalStreaks,e.anamorphic,e.animated,e.flareShape,e.flareSize,e.flareSpeed,e.glareSize,e.haloScale,e.ghostScale,e.opacity,e.secondaryGhosts,e.starBurst,i,d]);return dm(()=>(o.current=u,()=>{u.dispose(),o.current=null}),[u]),dm(()=>{let b=u.uniforms.get("screenRes");b&&(b.value.x=r.width,b.value.y=r.height)},[u,r]),zx((b,g)=>{let h=o.current;if(!h)return;let w=h.uniforms.get("lensPosition"),B=h.uniforms.get("opacity");if(!w||!B)return;let v=1;if(s.current.copy(i).project(t),s.current.z>1)return;w.value.x=s.current.x,w.value.y=s.current.y,l.current.x=s.current.x,l.current.y=s.current.y,n.setFromCamera(l.current,t);let p=n.intersectObjects(a.children,!0),{object:m}=p[0]||{};m&&(m.userData?.lensflare==="no-occlusion"?v=0:m instanceof Vx&&(m.material.uniforms?._transmission?.value>.2||m.material._transmission&&m.material._transmission>.2?v=.2:m.material.transparent&&(v=m.material.opacity))),B.value=Fx.damp(B.value,v,12,g)}),Hx("primitive",{object:u,dispose:null})}import{RampType as Ec}from"@react-three/postprocessing";import{GlitchMode as Lc,KernelSize as ma,ToneMappingMode as Dc}from"postprocessing";import{Color as Gx}from"three";function mm(e){return e==="linear"?Dc.LINEAR:e==="reinhard"?Dc.REINHARD:Dc.ACES_FILMIC}function Ss(e){switch(e){case"verySmall":return ma.VERY_SMALL;case"small":return ma.SMALL;case"medium":return ma.MEDIUM;case"large":return ma.LARGE;case"veryLarge":return ma.VERY_LARGE;case"huge":return ma.HUGE}}function bm(e){switch(e){case"constantMild":return Lc.CONSTANT_MILD;case"constantWild":return Lc.CONSTANT_WILD;default:return Lc.SPORADIC}}function Nc(e){let t=new Gx(e);return[t.r,t.g,t.b,1]}function gm(e){return e==="radial"?Ec.Radial:e==="mirroredLinear"?Ec.MirroredLinear:Ec.Linear}import{Fragment as vv,jsx as dt,jsxs as _c}from"react/jsx-runtime";var Mo={edgeStrength:1,pulseSpeed:0,visibleEdgeColor:new Ms($r.color).getHex(),hiddenEdgeColor:new Ms($r.color).multiplyScalar(.35).getHex(),kernelSize:bv.VERY_SMALL,blur:!1,xRay:!1};function xv(e){let t=[];return e.traverse(n=>{n.isMesh&&t.push(n)}),t}function hm({sceneConfig:e,selectedObjectRef:t,hoveredObjectRef:n,highlightOnHover:a=!1,disabled:r=!1}){let o=fm(M=>M.scene),s=fm(M=>M.gl),l=fv(null),i=e?.postProcessing,c=t??null,d=i?.outline.enabled===!0,u=d?xv(o):n?[n]:[],b=d||a,[g,h]=hv(()=>s.xr?.isPresenting??!1);gv(()=>{let M=s.xr;if(!M)return;let k=()=>h(!0),R=()=>h(!1);return M.addEventListener("sessionstart",k),M.addEventListener("sessionend",R),h(M.isPresenting),()=>{M.removeEventListener("sessionstart",k),M.removeEventListener("sessionend",R)}},[s]);let w=o.children.filter(M=>M.isLight),B=gi(()=>new bi(i?.chromaticAberration.offsetX??.002,i?.chromaticAberration.offsetY??.002),[i?.chromaticAberration.offsetX,i?.chromaticAberration.offsetY]),v=gi(()=>new Ms(i?.outline.visibleEdgeColor??"#ffffff").getHex(),[i?.outline.visibleEdgeColor]),p=gi(()=>new Ms(i?.outline.hiddenEdgeColor??"#22090a").getHex(),[i?.outline.hiddenEdgeColor]),m=gi(()=>Nc(i?.ramp.startColor??"#000000"),[i?.ramp.startColor]),S=gi(()=>Nc(i?.ramp.endColor??"#ffffff"),[i?.ramp.endColor]);return!i||g||r?null:_c(vv,{children:[i.godRays.enabled===!0&&_c("mesh",{ref:l,position:i.godRays.sunPosition,visible:!1,frustumCulled:!1,children:[dt("sphereGeometry",{args:[.1,8,8]}),dt("meshBasicMaterial",{transparent:!0,opacity:0,depthWrite:!1})]}),_c(Zx,{multisampling:0,enableNormalPass:i.ssao.enabled===!0,autoClear:!1,children:[i.smaa.enabled===!0&&dt(dv,{}),i.ssao.enabled===!0&&dt(pv,{samples:i.ssao.samples,rings:i.ssao.rings,intensity:i.ssao.intensity,radius:i.ssao.radius,bias:i.ssao.bias,luminanceInfluence:i.ssao.luminanceInfluence,fade:i.ssao.fade,minRadiusScale:i.ssao.minRadiusScale,worldDistanceThreshold:i.ssao.worldDistanceThreshold,worldDistanceFalloff:i.ssao.worldDistanceFalloff,worldProximityThreshold:i.ssao.worldProximityThreshold,worldProximityFalloff:i.ssao.worldProximityFalloff}),i.autofocus.enabled===!0&&dt(Wx,{focusDistance:i.autofocus.focusDistance,focusRange:i.autofocus.focusRange,focalLength:i.autofocus.focalLength,bokehScale:i.autofocus.bokehScale,target:i.autofocus.target,mouse:i.autofocus.mouse,debug:i.autofocus.debug||void 0,manual:i.autofocus.manual,smoothTime:i.autofocus.smoothTime}),i.autofocus.enabled!==!0&&i.depthOfField.enabled===!0&&dt(Jx,{focusDistance:i.depthOfField.focusDistance,focusRange:i.depthOfField.focusRange,focalLength:i.depthOfField.focalLength,bokehScale:i.depthOfField.bokehScale}),i.bloom.enabled===!0&&dt($x,{intensity:i.bloom.intensity,luminanceThreshold:i.bloom.luminanceThreshold,luminanceSmoothing:i.bloom.luminanceSmoothing,mipmapBlur:i.bloom.mipmapBlur,radius:i.bloom.radius,levels:i.bloom.levels}),i.selectiveBloom.enabled===!0&&dt(lv,{selection:c??void 0,lights:w,selectionLayer:i.selectiveBloom.selectionLayer,intensity:i.selectiveBloom.intensity,luminanceThreshold:i.selectiveBloom.luminanceThreshold,luminanceSmoothing:i.selectiveBloom.luminanceSmoothing,kernelSize:Ss(i.selectiveBloom.kernelSize),mipmapBlur:i.selectiveBloom.mipmapBlur,inverted:i.selectiveBloom.inverted,ignoreBackground:i.selectiveBloom.ignoreBackground}),b&&dt(ov,{selection:u,selectionLayer:i.outline.selectionLayer,blendFunction:mi.SCREEN,edgeStrength:d?i.outline.edgeStrength:Mo.edgeStrength,pulseSpeed:d?i.outline.pulseSpeed:Mo.pulseSpeed,visibleEdgeColor:d?v:Mo.visibleEdgeColor,hiddenEdgeColor:d?p:Mo.hiddenEdgeColor,kernelSize:d?Ss(i.outline.kernelSize):Mo.kernelSize,blur:d?i.outline.blur:Mo.blur,xRay:d?i.outline.xRay:Mo.xRay}),i.chromaticAberration.enabled===!0&&dt(Kx,{offset:B,radialModulation:i.chromaticAberration.radialModulation,modulationOffset:i.chromaticAberration.modulationOffset}),i.colorAverage.enabled===!0&&dt(Yx,{}),i.dotScreen.enabled===!0&&dt(qx,{angle:i.dotScreen.angle,scale:i.dotScreen.scale}),i.glitch.enabled===!0&&dt(Qx,{mode:bm(i.glitch.mode),delay:new bi(i.glitch.delay[0],i.glitch.delay[1]),duration:new bi(i.glitch.duration[0],i.glitch.duration[1]),strength:new bi(i.glitch.strength[0],i.glitch.strength[1]),chromaticAberrationOffset:new bi(i.glitch.chromaticAberrationOffset[0],i.glitch.chromaticAberrationOffset[1]),columns:i.glitch.columns,ratio:i.glitch.ratio,active:!0}),i.grid.enabled===!0&&dt(tv,{scale:i.grid.scale,lineWidth:i.grid.lineWidth}),i.lensflare.enabled===!0&&dt(um,{config:i.lensflare}),i.godRays.enabled===!0&&dt(ev,{sun:l,samples:i.godRays.samples,density:i.godRays.density,decay:i.godRays.decay,weight:i.godRays.weight,exposure:i.godRays.exposure,clampMax:i.godRays.clampMax,blur:i.godRays.blur,kernelSize:Ss(i.godRays.kernelSize)}),i.noise.enabled===!0&&dt(rv,{premultiply:i.noise.premultiply,opacity:i.noise.opacity,blendFunction:mi.ADD}),i.brightnessContrast.enabled===!0&&dt(Xx,{brightness:i.brightnessContrast.brightness,contrast:i.brightnessContrast.contrast}),i.hueSaturation.enabled===!0&&dt(nv,{hue:i.hueSaturation.hue,saturation:i.hueSaturation.saturation}),i.toneMapping.enabled===!0&&dt(sm,{exposure:i.toneMapping.exposure}),i.vignette.enabled===!0&&dt(mv,{eskil:i.vignette.eskil,offset:i.vignette.offset,darkness:i.vignette.darkness,blendFunction:mi.NORMAL}),i.toneMapping.enabled===!0&&dt(uv,{mode:mm(i.toneMapping.mode),resolution:i.toneMapping.resolution,whitePoint:i.toneMapping.whitePoint,middleGrey:i.toneMapping.middleGrey,minLuminance:i.toneMapping.minLuminance,averageLuminance:i.toneMapping.averageLuminance,adaptationRate:i.toneMapping.adaptationRate}),i.sepia.enabled===!0&&dt(cv,{intensity:i.sepia.intensity,blendFunction:mi.NORMAL}),i.scanline.enabled===!0&&dt(sv,{density:i.scanline.density,blendFunction:mi.OVERLAY}),i.pixelation.enabled===!0&&dt(av,{granularity:i.pixelation.granularity}),i.ramp.enabled===!0&&dt(iv,{rampType:gm(i.ramp.rampType),rampStart:i.ramp.rampStart,rampEnd:i.ramp.rampEnd,startColor:m,endColor:S,opacity:i.ramp.rampMask?1:i.ramp.opacity??.5,rampBias:i.ramp.rampBias,rampGain:i.ramp.rampGain,rampMask:i.ramp.rampMask,rampInvert:i.ramp.rampInvert})]})]})}import{Component as yv}from"react";var ks=class extends yv{constructor(){super(...arguments);this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(n,a){this.props.onError?.(n)}render(){return this.state.hasError?this.props.fallback??null:this.props.children}};import{Fragment as Ev,jsx as In,jsxs as xm}from"react/jsx-runtime";var Bv=1.5;function Ov({captureRef:e}){let{gl:t,scene:n,camera:a,invalidate:r}=Cv();return Rv(()=>{if(e)return e.current={gl:t,scene:n,camera:a,invalidate:r},()=>{e.current=null}},[e,t,n,a,r]),null}function zc({children:e,camera:t,backgroundColor:n,shadows:a=!0,sceneConfig:r,selectedObjectRef:o,hoveredObjectRef:s,highlightOnHover:l,renderMode:i="demand",maxDpr:c=2,xrStore:d,rendererCaptureRef:u,preserveDrawingBuffer:b=!1,reduceGpuLoad:g}){let h=g??yc(),w=h?Math.min(c,Bv):c,B=a&&!h,v=Ps(()=>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=Ps(()=>{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=Ps(()=>{let x=r?.postProcessing;return x?!!(x.glitch.enabled||x.noise.enabled||x.lensflare.enabled&&x.lensflare.animated):!1},[r?.postProcessing]),[S,M]=Av(!1),k=r?.environment,R=r?.groundShadows,f=Ps(()=>{if(!k)return null;if(k.source==="custom"){let x=k.customEnvironmentUrl.trim();return cs(x)?{files:x}:null}return{preset:k.preset}},[k]),C=xm(Ev,{children:[In(Ov,{captureRef:u}),In(Ju,{cameraConfig:t}),In(Xu,{active:m}),In(Ku,{color:p}),f?In(ks,{onError:x=>console.warn("Failed to load environment map:",x),children:In(Tv,{fallback:null,children:In(Mv,{...f,environmentIntensity:k?.intensity??.25,backgroundIntensity:k?.intensity??.25,background:r?.background.enabled===!0&&r.background.type==="environment"})})}):null,In(Yu,{rotation:k?.rotation??0}),d&&In($u,{onPresentingChange:M}),R?.enabled&&R.mode==="shadowCatcher"&&!S&&In(Sv,{position:[0,R.height,0],scale:R.size,opacity:R.intensity,blur:R.borderFade,far:15,resolution:1024,color:"#000000"}),e,In(hm,{sceneConfig:r,selectedObjectRef:o,hoveredObjectRef:s,highlightOnHover:l,disabled:h})]});return In(wv,{frameloop:i,dpr:[1,w],shadows:B?"soft":!1,resize:{debounce:0,scroll:!1},raycaster:{firstHitOnly:!0},style:v,camera:t??{fov:50},gl:{preserveDrawingBuffer:b,toneMapping:Pv,toneMappingExposure:1},children:d?xm(kv,{store:d,children:[In(Wu,{renderMode:i}),C]}):C})}import{CameraControls as Lv}from"@react-three/drei";import{useEffect as Dv}from"react";import{jsx as Nv}from"react/jsx-runtime";function jc({controlsRef:e,onCameraChange:t}){return Dv(()=>{if(!t||!e||typeof e!="object"||!("current"in e))return;let n=e.current;if(!n)return;let a=()=>{t(n.camera,n)};return n.addEventListener("update",a),()=>{n.removeEventListener("update",a)}},[e,t]),Nv(Lv,{ref:e,makeDefault:!0,smoothTime:.3})}import{useRef as Fc,useMemo as Ts,useEffect as zv}from"react";import{useFrame as jv,useThree as vm}from"@react-three/fiber";import{Vector3 as Iv}from"three";var Ic=Symbol("react-immersive.model-node-id");function _v(e,t){Object.defineProperty(e,Ic,{value:t,configurable:!0})}function ba(e){let t=new Map;e.traverse(i=>{if(!i.name)return;let c=t.get(i.name);c?c.push(i):t.set(i.name,[i])});let n=Object.create(null),a=new WeakMap,r=new Map,o=new Set(Array.from(t,([i,c])=>c.length===1?i:null).filter(i=>i!==null)),s=new Set,l=(i,c)=>{_v(i,c),n[c]=i,a.set(i,c),s.add(c)};for(let[i,c]of t)c.length===1&&l(c[0],i);for(let[i,c]of t){if(c.length<2)continue;let d=[];c.forEach((u,b)=>{let g=`${i} [${b+1}]`,h=g,w=2;for(;o.has(h)||s.has(h);)h=`${g}.${w++}`;l(u,h),d.push(h)}),r.set(i,d)}return{nodesById:n,idByNode:a,duplicateNames:r}}function fi(e){return e[Ic]??e.name??null}function dr(e,t){let n=null,a=[];return e.traverse(r=>{r[Ic]===t&&(n=r),r.name===t&&a.push(r)}),n??(a.length===1?a[0]:null)}import{Fragment as Wv,jsx as ko,jsxs as $v}from"react/jsx-runtime";function wm(e,t){if(!t)return e;let n=t*Math.PI/180,a=Math.cos(n),r=Math.sin(n);return[e[0]*a+e[2]*r,e[1],-e[0]*r+e[2]*a]}function Fv(e,t){let[n,a,r]=e.center,o=e.radius,s=Math.hypot(t[0],t[1],t[2]),l=s>1e-6?[t[0]/s,t[1]/s,t[2]/s]:[0,1,0],i=o*2;return{position:[n+l[0]*i,a+l[1]*i,r+l[2]*i],target:e.center,extent:o,near:Math.max(o/100,.001),far:i+o*2}}function Vv(e,t){let n=t[0]-e.center[0],a=t[1]-e.center[1],r=t[2]-e.center[2],o=Math.hypot(n,a,r);return{near:Math.max(o-e.radius,o*.01,.001),far:o+e.radius*2}}function Uv(e,t,n){return t&&n&&!e.attachedToCamera?n.center:[0,0,0]}var Hv={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}]},Gv={enabled:!0,mapSize:2048,bias:-5e-4,normalBias:.02,radius:3};function ym({light:e,shadows:t,shadowsEnabled:n,environmentRotation:a,modelBounds:r,objectBindings:o,nodeRefs:s}){let l=Fc(null),i=Fc(null),c=Fc(null),d=vm(v=>v.camera),u=vm(v=>v.scene),b=Ts(()=>new Iv,[]),g=Ts(()=>e.attachedToCamera||e.attachment?e.position:wm(e.position,a),[e.position,e.attachedToCamera,e.attachment,a]);jv(()=>{let v=l.current??i.current??c.current;if(!v)return;if(e.attachedToCamera){v.position.copy(d.position);return}let p=e.attachment;if(!p)return;let m=o?bn(o,p.objectId):null,M=(m?o?.[m]:void 0)?.modelObjectId??p.objectId,k=(m?s?.current[m]:void 0)??dr(u,M);k&&(b.fromArray(p.offset),k.localToWorld(b),v.position.copy(b))});let h=n&&t.enabled&&e.castShadow,w=Ts(()=>e.type==="directional"&&h&&r&&!e.attachedToCamera?Fv(r,g):null,[e.type,e.attachedToCamera,h,r,g]),B=Ts(()=>e.type==="spot"&&h&&r&&!e.attachedToCamera?Vv(r,g):null,[e.type,e.attachedToCamera,h,r,g]);return zv(()=>{let v=l.current??c.current;if(!v)return;let[p,m,S]=Uv(e,h,r);v.target.position.set(p,m,S),v.target.updateMatrixWorld()},[e,h,r]),!e.visible||e.type==="none"?null:e.type==="directional"?ko("directionalLight",{ref:l,color:e.color,intensity:e.intensity,position:w?.position??g,castShadow:h,"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":w?.near??.5,"shadow-camera-far":w?.far??40,"shadow-camera-left":-(w?.extent??8),"shadow-camera-right":w?.extent??8,"shadow-camera-top":w?.extent??8,"shadow-camera-bottom":-(w?.extent??8)}):e.type==="point"?ko("pointLight",{ref:i,color:e.color,intensity:e.intensity,position:g,distance:e.distance,decay:e.decay,castShadow:h,"shadow-mapSize-width":t.mapSize,"shadow-mapSize-height":t.mapSize,"shadow-bias":e.shadowBias}):e.type==="spot"?ko("spotLight",{ref:c,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:h,"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":B?.near??.5,"shadow-camera-far":B?.far??40}):e.type==="hemisphere"?ko("hemisphereLight",{color:e.color,groundColor:"#444444",intensity:e.intensity}):null}function Vc({lightingConfig:e,shadowConfig:t,shadowsEnabled:n=!0,environmentRotation:a=0,environmentConfig:r,modelBounds:o,objectBindings:s,nodeRefs:l}){let i=e??Hv,c=t??Gv,d=r?.shadowLight,u=wm([5,10,5],a);return $v(Wv,{children:[ko("ambientLight",{intensity:i.ambient.intensity,color:i.ambient.color}),i.lights.map(b=>ko(ym,{light:b,shadows:c,shadowsEnabled:n,environmentRotation:a,modelBounds:o,objectBindings:s,nodeRefs:l},b.id)),d?.enabled&&ko(ym,{light:{id:"light-env-shadow",type:"directional",color:"#ffffff",intensity:d.intensity,position:u,attachedToCamera:!1,castShadow:!0,shadowBias:d.bias,visible:!0},shadows:c,shadowsEnabled:n,environmentRotation:0,modelBounds:o,objectBindings:s,nodeRefs:l})]})}import{useState as $y,useEffect as jt,useRef as nn,useMemo as gn}from"react";import{useFrame as qc,useThree as Xy}from"@react-three/fiber";import{useLoader as Im,useThree as fy}from"@react-three/fiber";import{FileLoader as hy,Loader as xy,LoadingManager as vy}from"three";import{FBXLoader as yy,GLTFLoader as wy,MTLLoader as Cy,OBJLoader as Sy}from"three-stdlib";import{USDLoader as My}from"three/examples/jsm/loaders/USDLoader.js";import{strFromU8 as Xv,strToU8 as Kv,unzip as Yv}from"fflate";var Cm;function Sm(e){Cm=e}function hi(e){Cm?.(e)}var Jv=[".glb",".gltf",".obj",".fbx",".usdz",".zip"],qv=["model/gltf-binary","model/gltf+json","model/vnd.usdz+zip","application/vnd.usdz+zip","application/zip","application/x-zip-compressed"],xi=1024*1024,Mm=128*xi,km=1024,Pm=128*xi,Tm=256*xi,Rm=200,Zv=xi,Or=new Map,Rs=".glb,.gltf,.obj,.fbx,.usdz,.zip,model/gltf-binary,model/gltf+json,model/vnd.usdz+zip,application/vnd.usdz+zip,application/zip";function Hc(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 Em(e){return Or.get(e)??{format:Hc(e)}}function Qv(e){let t=e.name.toLowerCase();return Jv.some(n=>t.endsWith(n))||qv.includes(e.type)}async function As(e){if(!Qv(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 Am(e,"usdz");if(t.endsWith(".zip")||ey(e.type))return ty(e);if(t.endsWith(".gltf")||e.type==="model/gltf+json")return Bm(e);let n=Hc(e.name);return n==="gltf"?Bm(e):Am(e,n)}function Am(e,t){let n=URL.createObjectURL(e);return Or.set(n,{format:t,entryPath:e.name}),{url:n,name:e.name,format:t,cleanup:()=>{hi(n),Or.delete(n),URL.revokeObjectURL(n)}}}function ey(e){return e==="application/zip"||e==="application/x-zip-compressed"}async function Bm(e){let t=await e.text(),n=Lm(t,e.name);for(let r of Dm(n))if(!Gc(r))throw new Error(`${e.name} references external assets. Upload a .zip containing the .gltf file and its dependencies.`);let a=URL.createObjectURL(e);return Or.set(a,{format:"gltf",entryPath:e.name}),{url:a,name:e.name,format:"gltf",cleanup:()=>{hi(a),Or.delete(a),URL.revokeObjectURL(a)}}}async function ty(e){if(e.size>Mm)throw new Error(`Model zip is too large. The compressed archive must be ${Uc(Mm)} or smaller.`);let t=await ny(new Uint8Array(await e.arrayBuffer())),n=new Map;for(let[s,l]of Object.entries(t)){let i=Wc(s);!i||Nm(i)||n.set(i,l)}let a=[...n.keys()].filter(s=>/\.(gltf|obj|fbx)$/i.test(s));if(a.length===0)throw new Error("Invalid model zip: no .gltf, .obj, or .fbx file found.");if(a.length>1)throw new Error("Invalid model zip: multiple model entry files found.");let r=a[0],o=Hc(r);if(o==="gltf")return oy(e,r,n);if(o==="obj"||o==="fbx")return ry(e,r,o,n);throw new Error(`Unsupported model entry ${r}.`)}function ny(e){return new Promise((t,n)=>{let a=0,r=0,o=null,s=i=>(o??(o=new Error(`Invalid model zip: ${i}`)),!1);Yv(e,{filter:i=>{if(o)return!1;if(a+=1,a>km)return s(`archive contains more than ${km.toLocaleString()} entries.`);if(i.originalSize>Pm)return s(`${i.name} expands beyond the ${Uc(Pm)} per-file limit.`);if(r+=i.originalSize,r>Tm)return s(`expanded contents exceed ${Uc(Tm)}.`);if(i.originalSize>=Zv&&(i.size===0||i.originalSize/i.size>Rm))return s(`${i.name} exceeds the ${Rm}:1 compression-ratio limit.`);let c=Wc(i.name);return!!c&&!Nm(c)}},(i,c)=>{o?n(o):i?n(new Error(`Invalid model zip: ${i.message}`)):t(c)})})}function Uc(e){return`${e/xi} MiB`}function ry(e,t,n,a){let r=[],o={};for(let[l,i]of a){let c=URL.createObjectURL(new Blob([i],{type:_m(l)}));r.push(c),o[l]=c}let s=o[t];if(!s)throw r.forEach(l=>URL.revokeObjectURL(l)),new Error(`Invalid model zip: could not read ${t}.`);return Or.set(s,{format:n,entryPath:t,resourceUrls:o}),{url:s,name:e.name,format:n,cleanup:()=>{hi(s),Or.delete(s),r.forEach(l=>URL.revokeObjectURL(l))}}}function oy(e,t,n){let a=n.get(t);if(!a)throw new Error("Invalid GLTF zip: no .gltf found.");let r=Lm(Xv(a),t);ay(r,t);let o=iy(t),s=[];try{Om(r.buffers,o,n,s),Om(r.images,o,n,s);let l=new Blob([Kv(JSON.stringify(r))],{type:"model/gltf+json"}),i=URL.createObjectURL(l);return s.push(i),Or.set(i,{format:"gltf",entryPath:t}),{url:i,name:e.name,format:"gltf",cleanup:()=>{hi(i),Or.delete(i),s.forEach(c=>URL.revokeObjectURL(c))}}}catch(l){throw s.forEach(i=>URL.revokeObjectURL(i)),l}}function Om(e,t,n,a){for(let r of e??[]){if(typeof r.uri!="string"||Gc(r.uri))continue;let o=sy(t,r.uri),s=n.get(o);if(!s)throw new Error(`Invalid GLTF zip: missing referenced asset ${r.uri}.`);let l=URL.createObjectURL(new Blob([s],{type:_m(o)}));a.push(l),r.uri=l}}function Lm(e,t){try{return JSON.parse(e)}catch{throw new Error(`${t} is not a valid .gltf JSON file.`)}}function Dm(e){return[...e.buffers??[],...e.images??[]].map(t=>t.uri).filter(t=>typeof t=="string"&&t.length>0)}function ay(e,t){for(let n of Dm(e)){if(Gc(n))continue;let a=/^[a-z][a-z0-9+.-]*:/i.test(n),r=n.startsWith("/")||n.startsWith("\\");if(a||r)throw new Error(`${t} references external assets. Include every dependency inside the uploaded .zip.`)}}function Gc(e){return e.startsWith("data:")}function Wc(e){let t=[];for(let n of e.replace(/\\/g,"/").replace(/^\/+/,"").split("/").filter(a=>a&&a!==".")){if(n===".."){t.pop();continue}t.push(n)}return t.join("/")}function Nm(e){let t=e.split("/");return e.endsWith("/")||t.includes("__MACOSX")||t.some(n=>n===".DS_Store"||n.startsWith("._"))}function iy(e){let t=e.lastIndexOf("/");return t===-1?"":e.slice(0,t)}function sy(e,t){let n=t.split(/[?#]/)[0],a=ly(n);return Wc(e?`${e}/${a}`:a)}function ly(e){try{return decodeURI(e)}catch{return e}}function _m(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 D5}from"@react-three/drei";import{useThree as _5}from"@react-three/fiber";import{useMemo as j5}from"react";import{SRGBColorSpace as cy}from"three";import{DRACOLoader as dy,KTX2Loader as py,MeshoptDecoder as uy}from"three-stdlib";function my(e){return{name:"RI_unlit_emissive_texture",async afterRoot(t){let n=e.json.materials??[],a=new Map;if(n.forEach(o=>{let s=!!o?.extensions?.KHR_materials_unlit,l=!!o?.pbrMetallicRoughness?.baseColorTexture;s&&!l&&o?.emissiveTexture&&o.name&&a.set(o.name,o.emissiveTexture.index)}),a.size===0||!t.scene)return;let r=new Map;await Promise.all([...a].map(async([o,s])=>{let l=await e.getDependency("texture",s);l&&(l.colorSpace=cy,r.set(o,l))})),t.scene.traverse(o=>{let s=Array.isArray(o.material)?o.material:o.material?[o.material]:[];for(let l of s){let i=l.name?r.get(l.name):void 0;i&&!l.map&&(l.map=i,l.needsUpdate=!0)}})}}}var by="https://assets.react-immersive.liveroom.dev/three-r184/draco/",gy="https://assets.react-immersive.liveroom.dev/three-r184/basis/";function zm(e,t={},n){let{dracoDecoderPath:a=by,ktx2TranscoderPath:r=gy,meshopt:o=!0}=t;if(a){let s=new dy;s.setDecoderPath(a),e.setDRACOLoader(s)}if(o&&e.setMeshoptDecoder(uy),r&&n){let s=new py().setTranscoderPath(r).detectSupport(n);e.setKTX2Loader(s)}e.register((s=>my(s)))}var Bs=class extends xy{constructor(){super(...arguments);this.options={source:{format:"glb"}}}configure(n){return this.options=n,this}load(n,a,r,o){this.loadAsset(n,r).then(a).catch(o)}async loadAsset(n,a){let r=Py(this.options.source),{format:o}=this.options.source;if(o==="obj")return ky(n,r,this.options.source,a);if(o==="fbx"){let i=$c(this,new yy(r)),c=Ay(n,this.options.source);c&&i.setResourcePath(c);let d=await i.loadAsync(n,a);return Xc(d,"FBXMesh",!1),{scene:d,animations:d.animations??[]}}if(o==="usdz"){let c=await $c(this,new My(r)).loadAsync(n,a);return Xc(c,"USDZMesh",!1),{scene:c,animations:c.animations??[]}}let s=$c(this,new wy(r));zm(s,this.options.decoderConfig,this.options.renderer);let l=await s.loadAsync(n,a);return{scene:l.scene,animations:l.animations??[]}}};Sm(e=>{Im.clear(Bs,e)});function Ls(e,t={},n){let a=fy(s=>s.gl),r=Em(e),o=n?{...r,format:n}:r;return Im(Bs,e,s=>{s.configure({source:o,decoderConfig:t,renderer:a})})}async function ky(e,t,n,a){let r=await jm(e,t,a),o=new Sy(t),s=Ty(r);if(s){let i=Ry(s,e,n);if(i)try{let c=await jm(i.url,t),u=new Cy(t).parse(c,i.basePath);u.preload(),o.setMaterials(u)}catch(c){console.warn(`[react-immersive] Could not load OBJ material ${s}; rendering geometry with fallback materials.`,c)}}let l=o.parse(r);return Xc(l,"OBJMesh",!0),{scene:l,animations:[]}}function Xc(e,t,n){let a=new Set,r=0;e.traverse(o=>{if(!("isMesh"in o&&o.isMesh===!0)){o.name&&a.add(o.name);return}let l=o.name||`${t}_${++r}`;if(!n&&o.name){a.add(o.name);return}let i=l,c=2;for(;a.has(i);)i=`${l}_${c++}`;o.name=i,a.add(i)})}function jm(e,t,n){let a=new hy(t);return a.setResponseType("text"),a.loadAsync(e,n)}function $c(e,t){return t.setCrossOrigin(e.crossOrigin),t.setWithCredentials(e.withCredentials),t.setRequestHeader(e.requestHeader),t}function Py(e){let t=new vy,n=e.resourceUrls;return n&&t.setURLModifier(a=>{if(/^(?:blob:|data:)/i.test(a))return a;let r=Es(Vm(a).split(/[?#]/)[0]),o=n[r];if(o)return o;let s=Os(e.entryPath??""),l=Es(s?`${s}/${r}`:r);return n[l]??a}),t}function Ty(e){return/^\s*mtllib\s+(.+?)\s*$/im.exec(e)?.[1]?.trim()||null}function Ry(e,t,n){if(n.resourceUrls&&n.entryPath){let a=Es(`${Os(n.entryPath)}/${Vm(e)}`),r=n.resourceUrls[a];if(!r)return null;let o=Os(a);return{url:r,basePath:o?`${o}/`:""}}try{let a=new URL(e,t).href;return{url:a,basePath:Fm(a)}}catch{return null}}function Ay(e,t){if(t.resourceUrls&&t.entryPath){let n=Os(t.entryPath);return n?`${n}/`:""}return Fm(e)}function Fm(e){let t=e.lastIndexOf("/");return t===-1?"":e.slice(0,t+1)}function Os(e){let t=Es(e),n=t.lastIndexOf("/");return n===-1?"":t.slice(0,n)}function Es(e){let t=[];for(let n of e.replace(/\\/g,"/").replace(/^\/+/,"").split("/").filter(a=>a&&a!=="."))n===".."?t.pop():t.push(n);return t.join("/")}function Vm(e){try{return decodeURI(e)}catch{return e}}import{MeshStandardMaterial as Ky,MeshBasicMaterial as Zc,MeshNormalMaterial as Yy,MeshMatcapMaterial as Jy,DoubleSide as qy,NormalBlending as Zy,AnimationMixer as Qy,LoopOnce as ew,LoopRepeat as tw,Box3 as Vs,Vector3 as Po,Matrix4 as nw,MathUtils as Us}from"three";import{SkeletonUtils as rw}from"three-stdlib";function Um(e){let t=new Map;return e.map((n,a)=>{let o=n.name.trim()||`Animation ${a+1}`,s=t.get(o)??0;return t.set(o,s+1),{clip:n,sourceName:s===0?o:`${o} (${s+1})`,duration:n.duration}})}import{AdditiveBlending as By,BackSide as Oy,DoubleSide as Ey,FrontSide as Ly,NoColorSpace as Dy,NormalBlending as Ny,SRGBColorSpace as _y,Vector2 as Hm}from"three";function Gm(e){return!!(e&&typeof e=="object"&&"clone"in e&&"color"in e&&"metalness"in e&&"roughness"in e)}function Wm(e){return!!(e&&typeof e=="object"&&"isMeshPhysicalMaterial"in e&&e.isMeshPhysicalMaterial)}function Xr(e){return!!(e&&"isMesh"in e&&e.isMesh)}var $m=["texture","metalnessMap","roughnessMap","emissiveMap","alphaMap","normalMap","bumpMap","aoMap","displacementMap","clearcoatMap","clearcoatRoughnessMap","clearcoatNormalMap","anisotropyMap","transmissionMap","thicknessMap","sheenColorMap","sheenRoughnessMap","specularIntensityMap","specularColorMap"],zy=new Set(["texture","emissiveMap","sheenColorMap","specularColorMap"]);function Ds(e){return zy.has(e)?_y:Dy}function Et(e,t){return e?.[t]?.path}function Xm(e){return e==="back"?Oy:e==="double"?Ey:Ly}function Km(e){return e==="additive"?By:Ny}function Er(e,t=1,n=t){if(e&&typeof e=="object"){let a=e;if(typeof a.x=="number"&&Number.isFinite(a.x)&&typeof a.y=="number"&&Number.isFinite(a.y))return new Hm(a.x,a.y)}return new Hm(t,n)}function Kc(e){return Number.isFinite(e)&&e>0?e:1}function Ns(e,t){return e?.animations.clips.find(n=>n.sourceName===t)}function Ym(e){return e?.loopMode??"repeat"}import{Color as Yc,MeshPhysicalMaterial as jy,MeshStandardMaterial as Iy,Texture as Jc}from"three";function _s(e){if(Gm(e))return e;if(!e||typeof e!="object")return null;let t=e,n=new Iy;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 Jc?(n.emissiveMap=t.map,n.emissive.set(16777215)):t.color instanceof Yc&&n.emissive.copy(t.color)):(t.color instanceof Yc&&n.color.copy(t.color),t.map instanceof Jc&&(n.map=t.map),t.emissive instanceof Yc&&n.emissive.copy(t.emissive),t.emissiveMap instanceof Jc&&(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 Jm(e){if(Wm(e))return e.clone();let t=new jy;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(Er(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 qm(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=Er(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=Er(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 zs,FrontSide as Fy,NormalBlending as Zm,SRGBColorSpace as js}from"three";function Qm(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 zs(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??Zm,e.depthWrite=e.userData.baseDepthWrite??!0,e.side=e.userData.baseSide??Fy,e.normalMap=e.userData.baseNormalMap??null,e.normalScale.copy(Er(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(Er(e.userData.baseClearcoatNormalScale)),e.sheen=e.userData.baseSheen??e.sheen,e.sheenColor.copy(e.userData.baseSheenColor??new zs(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 zs("#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 zs("#ffffff")),e.specularColorMap=e.userData.baseSpecularColorMap??null,e.flatShading=e.userData.baseFlatShading??e.flatShading,e.envMapIntensity=e.userData.baseEnvMapIntensity??e.envMapIntensity;let a=Et(t,"texture"),r=Et(t,"metalnessMap"),o=Et(t,"roughnessMap"),s=Et(t,"emissiveMap"),l=Et(t,"alphaMap"),i=Et(t,"normalMap"),c=Et(t,"bumpMap"),d=Et(t,"aoMap"),u=Et(t,"displacementMap"),b=Et(t,"clearcoatMap"),g=Et(t,"clearcoatRoughnessMap"),h=Et(t,"clearcoatNormalMap"),w=Et(t,"anisotropyMap"),B=Et(t,"transmissionMap"),v=Et(t,"thicknessMap"),p=Et(t,"sheenColorMap"),m=Et(t,"sheenRoughnessMap"),S=Et(t,"specularIntensityMap"),M=Et(t,"specularColorMap");if(a?(e.map=zt(a,js),e.color.set(n??"#ffffff")):n&&(e.map=null,e.color.set(n)),r&&(e.metalnessMap=zt(r)),t?.metalness!==void 0&&(e.metalness=t.metalness),o&&(e.roughnessMap=zt(o)),t?.roughness!==void 0&&(e.roughness=t.roughness),t?.emissive?e.emissive.set(t.emissive):s&&e.emissive.set("#ffffff"),t?.emissiveIntensity!==void 0&&(e.emissiveIntensity=t.emissiveIntensity),s&&(e.emissiveMap=zt(s,js)),t?.opacity!==void 0&&(e.opacity=t.opacity),l&&(e.alphaMap=zt(l)),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=Km(t.blendingMode),e.depthWrite=t.blendingMode!=="additive"),t?.side&&(e.side=Xm(t.side)),i&&(e.normalMap=zt(i)),i||t?.normalScale!==void 0){let k=t?.normalScale??Math.abs(Er(e.userData.baseNormalScale).x);e.normalScale.set(k,t?.flipNormalY?-k:k)}if(c&&(e.bumpMap=zt(c)),t?.bumpScale!==void 0&&(e.bumpScale=t.bumpScale),d&&(e.aoMap=zt(d)),t?.aoMapIntensity!==void 0&&(e.aoMapIntensity=t.aoMapIntensity),u&&(e.displacementMap=zt(u)),t?.displacementScale!==void 0&&(e.displacementScale=t.displacementScale),t?.displacementBias!==void 0&&(e.displacementBias=t.displacementBias),b&&(e.clearcoatMap=zt(b)),t?.clearcoat!==void 0&&(e.clearcoat=t.clearcoat),g&&(e.clearcoatRoughnessMap=zt(g)),t?.clearcoatRoughness!==void 0&&(e.clearcoatRoughness=t.clearcoatRoughness),h&&(e.clearcoatNormalMap=zt(h)),h||t?.clearcoatNormalScale!==void 0){let k=t?.clearcoatNormalScale??Math.abs(Er(e.userData.baseClearcoatNormalScale).x);e.clearcoatNormalScale.set(k,t?.flipClearcoatNormalY?-k:k)}t?.sheen!==void 0&&(e.sheen=t.sheen),t?.sheenColor&&e.sheenColor.set(t.sheenColor),p&&(e.sheenColorMap=zt(p,js)),t?.sheenRoughness!==void 0&&(e.sheenRoughness=t.sheenRoughness),m&&(e.sheenRoughnessMap=zt(m)),t?.anisotropy!==void 0&&(e.anisotropy=t.anisotropy),t?.anisotropyRotation!==void 0&&(e.anisotropyRotation=t.anisotropyRotation),w&&(e.anisotropyMap=zt(w)),t?.transmission!==void 0&&(e.transmission=t.transmission),B&&(e.transmissionMap=zt(B)),t?.thickness!==void 0&&(e.thickness=t.thickness),v&&(e.thicknessMap=zt(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),S&&(e.specularIntensityMap=zt(S)),t?.specularColor&&e.specularColor.set(t.specularColor),M&&(e.specularColorMap=zt(M,js)),e.transparent=e.opacity<1||e.transmission>0||e.blending!==Zm||!!((l||e.alphaMap)&&e.alphaTest<=0),e.transparent||(e.depthWrite=!0)}function vi(e){e.updateMatrixWorld(!0),e.traverse(t=>{let n=t;n.isSkinnedMesh&&(n.skeleton?.update(),n.computeBoundingBox?.(),n.computeBoundingSphere?.())})}import{Matrix4 as Vy}from"three";function Uy(e){return e.isSkinnedMesh===!0}function ga(e){let t=[];return e.traverse(n=>{Uy(n)&&t.push(n)}),t}var yi="reactImmersiveSkinFreeze";function eb(e){return!!e.userData[yi]}function Is(e,t){let n=e.userData,a=new Vy().copy(t).invert(),r=n[yi];if(r){r.frozenInverse.copy(a),e.bindMatrixInverse.copy(a);return}let o={frozenInverse:a,previousOnBeforeRender:e.onBeforeRender};e.bindMatrixInverse.copy(a),e.onBeforeRender=function(s,l,i,c,d,u){o.previousOnBeforeRender.call(this,s,l,i,c,d,u),e.bindMatrixInverse.copy(o.frozenInverse)},n[yi]=o}function fa(e){let t=e.userData,n=t[yi];n&&(e.onBeforeRender=n.previousOnBeforeRender,delete t[yi],e.updateMatrixWorld(!0))}import{useCallback as tb,useEffect as Hy,useRef as Gy}from"react";import{useThree as Wy}from"@react-three/fiber";function Fs(){let e=Wy(r=>r.gl.domElement),t=Gy(void 0),n=tb(r=>{t.current===void 0&&(t.current=e.style.cursor),e.style.cursor=r},[e]),a=tb(()=>{let r=t.current;r!==void 0&&(e.style.cursor=r,t.current=void 0)},[e]);return Hy(()=>()=>{a()},[a]),{setCanvasCursor:n,restoreCanvasCursor:a}}import{jsx as nb}from"react/jsx-runtime";function Hs(e,t,n){let a=n.get(e);a&&(t?.position?e.position.fromArray(t.position):e.position.copy(a.position),t?.rotation?e.rotation.set(t.rotation[0],t.rotation[1],t.rotation[2],a.rotation.order):e.rotation.copy(a.rotation),t?.scale?e.scale.fromArray(t.scale):e.scale.copy(a.scale),e.updateMatrix())}function ow(e){return e.material}function Gs(e,t){return Array.isArray(e)?e.map(t):t(e,0)}function ha(e,t){Array.isArray(e)?e.forEach(t):t(e,0)}function Qc(e,t){return Array.isArray(e)?e[t]:e}function Ht(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 xa(e){let t=e,n=Number(t.clearcoat)>0,a=Number(t.sheen)>0,r=Number(t.anisotropy)>0,o=Number(t.transmission)>0,s=t.transparent===!1&&t.blending===Zy&&t.alphaToCoverage!==!0;return[Ht(t.map),Ht(t.aoMap),Ht(t.lightMap),Ht(t.bumpMap),Ht(t.normalMap,!0),t.normalMap?t.normalMapType:"",Ht(t.displacementMap),Ht(t.emissiveMap),Ht(t.metalnessMap),Ht(t.roughnessMap),r,Ht(r?t.anisotropyMap:null),n,Ht(n?t.clearcoatMap:null),Ht(n?t.clearcoatNormalMap:null,!0),Ht(n?t.clearcoatRoughnessMap:null),a,Ht(a?t.sheenColorMap:null),Ht(a?t.sheenRoughnessMap:null),Ht(t.specularColorMap),Ht(t.specularIntensityMap),o,Ht(o?t.transmissionMap:null),Ht(o?t.thicknessMap:null),Ht(t.alphaMap),Number(t.alphaTest)>0,!!t.alphaHash,!!t.flatShading,!!t.dithering,t.side,s].join("|")}function ed({url:e,objectBindings:t,selectedItem:n,itemMaterials:a,onItemClick:r,onItemHover:o,onModelLoaded:s,onAnimationsReady:l,nodeRefsOut:i,onNodeRefsChange:c,materialRefsOut:d,panelHoveredItem:u,sceneConfig:b,zoomOnSelected:g=!0,highlightOnHover:h=!0,decoderConfig:w,modelFormat:B,explodeFactor:v=0,suspendBindingTransforms:p=!1}){let m=Ls(e,w,B),S=Xy(L=>L.invalidate),[M,k]=$y(null),R=nn(null),{setCanvasCursor:f,restoreCanvasCursor:C}=Fs();jt(()=>{h||(k(null),o?.(null),C())},[h,o,C]);let x=gn(()=>rw.clone(m.scene),[m.scene]),P=gn(()=>ba(x),[x]),z=P.nodesById;jt(()=>{P.duplicateNames.size!==0&&console.warn("[react-immersive] Duplicate model node names were assigned unique binding IDs.",Object.fromEntries(P.duplicateNames))},[P]);let A=gn(()=>{let L=new WeakMap;return x.traverse(_=>{L.set(_,{position:_.position.clone(),rotation:_.rotation.clone(),scale:_.scale.clone()})}),L},[x]);jt(()=>{let L=!1,_=null,H=null,K=window,Y=Object.entries(z).filter(([,qe])=>Xr(qe)),ie=new Vs,re=[],tt=0;x.traverse(qe=>{Xr(qe)&&(qe.castShadow=!1,qe.receiveShadow=!0)});let se=()=>{if(L)return;let qe=new Set,de=ie.getSize(new Po),ct=new Po;for(let{name:Vt,box:lt}of re)lt.getSize(ct),ct.x>de.x*.7&&ct.z>de.z*.7&&ct.y>de.y*.4&&qe.add(Vt);x.traverse(Vt=>{if(!Xr(Vt))return;let lt=fi(Vt);Vt.castShadow=!lt||!qe.has(lt),Vt.receiveShadow=!0}),S()},xt=()=>{L||(K.requestIdleCallback?_=K.requestIdleCallback(Le,{timeout:100}):H=window.setTimeout(()=>Le(),0))},Le=qe=>{if(_=null,H=null,L)return;let de=performance.now(),ct=0;for(;tt<Y.length&&!(ct>0&&!(qe?qe.didTimeout?ct<16:qe.timeRemaining()>1:performance.now()-de<8));){let[Vt,lt]=Y[tt];tt+=1,ct+=1;let cn=new Vs().setFromObject(lt);cn.isEmpty()||(re.push({name:Vt,box:cn}),ie.union(cn))}tt<Y.length?xt():se()};return xt(),()=>{L=!0,_!==null&&K.cancelIdleCallback?.(_),H!==null&&window.clearTimeout(H)}},[S,z,x]),jt(()=>{vi(x)},[x]),jt(()=>{let L=new AbortController;return ps(x,L.signal),()=>{L.abort(),us(x)}},[x]);let j=gn(()=>{let L={};for(let[_,H]of Object.entries(t))L[H.modelObjectId??_]=_;return L},[t]),T=gn(()=>Object.entries(t).map(([L,_])=>`${L}${_.modelObjectId??L}`).sort().join(""),[t]),I=gn(()=>Object.entries(t).map(([L,_])=>JSON.stringify([L,_.modelObjectId??L,_.transform??null])).sort().join(""),[t]),F=nn(new Map);jt(()=>{let L=new Map,_=new Map;for(let[Y,ie]of Object.entries(t)){if(!ie.transform)continue;let re=z[ie.modelObjectId??Y];re&&(L.set(re,ie.transform),_.set(re,ga(re)))}let H=new Set([...F.current.keys(),...L.keys()]);for(let Y of H){Hs(Y,void 0,A);for(let ie of ga(Y))fa(ie)}x.updateMatrixWorld(!0);let K=new Map;for(let Y of _.values())for(let ie of Y)K.has(ie)||K.set(ie,ie.matrixWorld.clone());for(let[Y,ie]of L)Hs(Y,ie,A);F.current=L,x.updateMatrixWorld(!0);for(let[Y,ie]of K)Is(Y,ie);S()},[x,z,A,I,S]),jt(()=>()=>{for(let L of ga(x))fa(L)},[x]);let O=gn(()=>{let L={};for(let[_,H]of Object.entries(t)){let K=H.modelObjectId??_,Y=z[K];if(!Xr(Y))continue;let ie=ow(Y);ie&&(L[_]=Gs(ie,re=>{let tt=_s(re),se=Jm(tt??new Ky);return qm(se),se}))}return L},[z,T]);jt(()=>{d&&(d.current=O)},[O,d]),jt(()=>()=>{for(let L of Object.values(O))ha(L,_=>_.dispose())},[O]);let E=b?.model.shading??"lit",W=b?.model.renderer??"pbr",U=b?.wireframe.enabled??!1,ae=b?.wireframe.color??"#93c5fd",xe=b?.wireframe.opacity??1,le=gn(()=>{let L={};if(E!=="unlit")return L;for(let[_,H]of Object.entries(O))L[_]=Gs(H,K=>{let Y=new Zc;return Y.color.copy(K.color),Y.map=K.map,Y.alphaMap=K.alphaMap,Y.alphaTest=K.alphaTest,Y.transparent=K.transparent,Y.opacity=K.opacity,Y.side=K.side,Y});return L},[O,E]),be=gn(()=>{let L={};if(E!=="normals")return L;for(let[_,H]of Object.entries(O))L[_]=Gs(H,()=>new Yy);return L},[O,E]),he=gn(()=>{let L={};if(E!=="lit"||W!=="matcap")return L;let _=am();for(let[H,K]of Object.entries(O))L[H]=Gs(K,Y=>{let ie=new Jy;return ie.matcap=_,ie.color.copy(Y.color),ie.alphaMap=Y.alphaMap,ie.alphaTest=Y.alphaTest,ie.side=Y.side,ie});return L},[O,E,W]);jt(()=>()=>{for(let L of Object.values(le))ha(L,_=>_.dispose());for(let L of Object.values(be))ha(L,_=>_.dispose());for(let L of Object.values(he))ha(L,_=>_.dispose())},[le,be,he]);let Se=L=>E==="normals"?be[L]:E==="unlit"?le[L]:W==="matcap"?he[L]:O[L],it=nn(s);it.current=s,jt(()=>{it.current?.(x)},[x]);let wt=gn(()=>{let L={};for(let[_,H]of Object.entries(t)){let K=H.modelObjectId??_,Y=z[K];Y&&(L[_]=Y)}return L},[z,T]);jt(()=>(i.current=wt,c?.(),()=>{i.current===wt&&(i.current={})}),[wt,i,c]);let Xe=nn({});jt(()=>()=>{for(let L of Object.values(Xe.current))for(let[_,H]of Object.entries(L))H&&ys(H,Ds(_));Xe.current={}},[]);let Me=gn(()=>{let L=new Map;for(let[_,H]of Object.entries(t)){let K=u===H||u?.id===H.id||u?.modelObjectId===H.modelObjectId,Y=h&&(M===_||K),ie=Y||n===_;(Y||ie)&&L.set(_,{emissive:Y,matcap:ie})}return L},[t,h,M,n,u]),Te=nn(Me);Te.current=Me,jt(()=>{let L=new Set;for(let[_,H]of Object.entries(t)){L.add(_);let K=H.modelObjectId??_,Y=z[K];if(!Xr(Y))continue;Y.visible=H.visible!==!1;let ie=O[_];if(!ie)continue;if(W!=="uv-checker"){let de=Se(_);de&&(Y.material=de)}if(H.visible===!1)continue;let re=le[_],tt=he[_],se=a[_]??a[H.modelObjectId??_],xt=H.style?.material,Le=Xe.current[_]??{};for(let de of $m){let ct=Et(xt,de),Vt=Le[de];if(Vt===ct)continue;let lt=Ds(de);Vt&&ys(Vt,lt),ct?(om(ct,lt,S),Le[de]=ct):delete Le[de]}Object.keys(Le).length>0?Xe.current[_]=Le:delete Xe.current[_];let qe=se?.hex??xt?.baseColor;ha(ie,(de,ct)=>{let Vt=xa(de);Qm(de,xt,qe);let lt=de.userData.reactImmersiveConfiguredEmissive;lt?.isColor?lt.copy(de.emissive):de.userData.reactImmersiveConfiguredEmissive=de.emissive.clone();let cn=Te.current.get(_);cn?.emissive&&de.emissive.add(Rc),Vt!==xa(de)&&(de.needsUpdate=!0);let Ge=Qc(re,ct);if(Ge){let at=xa(Ge);Ge.color.copy(de.color),Ge.map=de.map,Ge.alphaMap=de.alphaMap,Ge.alphaTest=de.alphaTest,Ge.transparent=de.transparent,Ge.opacity=de.opacity,Ge.side=de.side,at!==xa(Ge)&&(Ge.needsUpdate=!0)}let qt=Qc(tt,ct);if(qt){let at=xa(qt);cn?.matcap?qt.color.set($r.color):qt.color.copy(de.color),qt.map=de.map,qt.alphaMap=de.alphaMap,qt.alphaTest=de.alphaTest,qt.transparent=de.transparent,qt.opacity=de.opacity,qt.side=de.side,at!==xa(qt)&&(qt.needsUpdate=!0)}})}for(let _ of Object.keys(Xe.current))if(!L.has(_)){for(let[H,K]of Object.entries(Xe.current[_]))K&&ys(K,Ds(H));delete Xe.current[_]}S()},[t,z,O,le,be,he,a,E,W,S]);let Rt=nn(new Map);jt(()=>{let L=Rt.current,_=new Set([...L.keys(),...Me.keys()]),H=!1;for(let K of _){let Y=L.get(K),ie=Me.get(K),re=!!Y?.emissive!=!!ie?.emissive,tt=!!Y?.matcap!=!!ie?.matcap;if(!re&&!tt)continue;H=!0;let se=O[K],xt=he[K];se&&ha(se,(Le,qe)=>{let de=Le.userData.reactImmersiveConfiguredEmissive;re&&de?.isColor&&(Le.emissive.copy(de),ie?.emissive&&Le.emissive.add(Rc));let ct=Qc(xt,qe);tt&&ct&&(ie?.matcap?ct.color.set($r.color):ct.color.copy(Le.color))})}Rt.current=Me,H&&S()},[Me,O,he,S]),jt(()=>{if(W!=="uv-checker")return;let L=im(),_=[];return x.traverse(H=>{if(!Xr(H))return;let K=H.material,Y=Array.isArray(K)?K:[K],ie=!!H.geometry.getAttribute("uv"),re=Y.map((se,xt)=>{let Le=new Zc({color:ie?"#ffffff":"#ff00ff",map:ie?L:null,side:se.side});return Le.name=`${H.name||"mesh"}-uv-checker-${xt}`,Le.toneMapped=!1,Le}),tt=Array.isArray(K)?re:re[0];H.material=tt,_.push({node:H,original:K,diagnostic:tt})}),S(),()=>{for(let{node:H,original:K,diagnostic:Y}of _){H.material=K;let ie=Array.isArray(Y)?Y:[Y];for(let re of ie)re.dispose()}S()}},[x,W,S]),jt(()=>{if(!U)return;let L=[];for(let[_,H]of Object.entries(t)){let K=H.modelObjectId??_,Y=z[K];if(!Xr(Y))continue;let ie=new Zc({color:ae,wireframe:!0,transparent:!0,opacity:xe,depthTest:!1,depthWrite:!1,side:qy,toneMapped:!1}),re=Y.clone(!1);re.name="",re.position.set(0,0,0),re.quaternion.identity(),re.scale.set(1,1,1),re.matrix.identity(),re.matrixAutoUpdate=!0,re.material=ie,re.castShadow=!1,re.receiveShadow=!1,re.frustumCulled=!1,re.renderOrder=1,re.userData={isWireframeOverlay:!0},re.raycast=()=>{},Y.morphTargetInfluences&&(re.morphTargetInfluences=Y.morphTargetInfluences),Y.add(re),L.push({node:Y,overlay:re})}return S(),()=>{for(let{node:_,overlay:H}of L)_.remove(H),H.material.dispose()}},[U,ae,xe,z,t,S]);let Ke=gn(()=>Um(m.animations),[m.animations]),tn=nn(l);tn.current=l;let Ye=nn(b);Ye.current=b;let Jt=nn(null),At=nn({}),Be=nn(null),rt=nn(null),ee=nn(1),oe=nn(new Set),Bt=nn(0),st=()=>({currentClip:rt.current,isPlaying:Be.current?.paused===!1,speed:ee.current,time:Be.current?.time??0,duration:Be.current?.getClip().duration??0}),He=()=>{let L=st();oe.current.forEach(_=>_(L))},Je=(L,_)=>{let H=Ym(_);L.setLoop(H==="once"?ew:tw,H==="once"?1:1/0),L.clampWhenFinished=H==="once";let K=Kc(_?.speed??ee.current);ee.current=K,L.setEffectiveTimeScale(K)},Ot=()=>{Be.current?.stop(),Be.current=null,rt.current=null,He(),S()},Ft=()=>{Be.current&&(Be.current.paused=!0,He(),S())},Lt=L=>{let _=Kc(L);ee.current=_,Be.current?.setEffectiveTimeScale(_),He()},Pn=L=>{let _=Be.current;if(!_)return;let H=_.getClip().duration;_.time=Math.min(Math.max(L,0),H),Jt.current?.update(0),He(),S()},mn=L=>{let _=At.current[L];if(!_)return;let H=Ns(Ye.current,L);if(!H?.hidden){if(Be.current===_&&_.paused){Je(_,H),_.paused=!1,rt.current=L,He(),S();return}Be.current&&Be.current!==_&&Be.current.stop(),Je(_,H),_.paused=!1,_.enabled=!0,_.reset().play(),Be.current=_,rt.current=L,He(),S()}};jt(()=>{let L=new Qy(x);Jt.current=L;let _={};for(let{clip:re,sourceName:tt}of Ke)_[tt]=L.clipAction(re);At.current=_;let H=re=>{re.action&&re.action===Be.current&&Ot()};L.addEventListener("finished",H);let K=()=>{};tn.current?.({clips:Ke.map(({sourceName:re})=>re),clipDetails:Ke.map(({sourceName:re,duration:tt})=>({sourceName:re,duration:tt})),play:Ke.length?mn:K,pause:Ke.length?Ft:K,stop:Ke.length?Ot:K,setSpeed:Ke.length?Lt:K,seek:Ke.length?Pn:K,getState:st,subscribe:re=>(oe.current.add(re),re(st()),()=>{oe.current.delete(re)})}),ee.current=1,He();let Y=Ye.current?.animations.autoplayClip,ie=Y?Ns(Ye.current,Y):void 0;return Y&&!ie?.hidden&&mn(Y),()=>{L.removeEventListener("finished",H),L.stopAllAction(),L.uncacheRoot(x),Jt.current=null,At.current={},Be.current=null,rt.current=null,ee.current=1,He()}},[x,Ke]),jt(()=>{let L=rt.current,_=Be.current;if(!L||!_||!b?.animations)return;let H=Ns(b,L);if(H?.hidden){Ot();return}H&&(Je(_,H),He())},[b?.animations]),qc((L,_)=>{if(Jt.current&&Be.current?.paused===!1){if(Jt.current.update(_),!p)for(let[H,K]of F.current)Hs(H,K,A);S(),Bt.current+=_,Bt.current>=.066&&(Bt.current=0,He(),vi(x))}});let me=gn(()=>(b?.model.rotation??[0,0,0]).map(L=>L*Math.PI/180),[b?.model.rotation]);qc((L,_)=>{if(!R.current)return;let H=R.current.rotation;H.x=Us.lerp(H.x,me[0],1-Math.exp(-5*_)),H.y=Us.lerp(H.y,me[1],1-Math.exp(-5*_)),H.z=Us.lerp(H.z,me[2],1-Math.exp(-5*_)),Math.abs(H.x-me[0])<1e-4&&Math.abs(H.y-me[1])<1e-4&&Math.abs(H.z-me[2])<1e-4||S()});let et=nn([]),Ie=nn(0),Re=nn(0),ft=gn(()=>new Po,[]);jt(()=>{let L=new Map;for(let[se,xt]of Object.entries(t)){let Le=z[xt.modelObjectId??se];Le&&L.set(Le,xt)}for(let se of et.current)Hs(se.node,L.get(se.node)?.transform,A);Re.current=0,x.updateWorldMatrix(!0,!0);let _=new Vs().setFromObject(x),H=_.getCenter(new Po),K=_.getSize(new Po).length()*.5;Ie.current=Number.isFinite(K)?K:0;let Y=[...L.keys()],ie=new Set(Y),re=[],tt=new Po;for(let se of Y){if(!se.parent)continue;let xt=se.parent,Le=!1;for(;xt;){if(ie.has(xt)){Le=!0;break}xt=xt.parent}if(Le)continue;let qe=new Vs().setFromObject(se);if(qe.isEmpty())continue;qe.getCenter(tt);let de=tt.clone().sub(H);de.lengthSq()<1e-8||(de.normalize(),re.push({node:se,restLocalPos:se.position.clone(),restWorldPos:se.getWorldPosition(new Po),worldDir:de,parentInverse:new nw().copy(se.parent.matrixWorld).invert()}))}et.current=re,S()},[x,z,T,I,A,S]),jt(()=>{S()},[v,S]),qc((L,_)=>{let H=et.current;if(H.length===0)return;let K=Math.min(Math.max(v,0),1),Y=Re.current;if(Math.abs(Y-K)<1e-4){if(Y===K)return;Re.current=K}else Re.current=Us.lerp(Y,K,1-Math.exp(-6*_)),S();let ie=Re.current*Ie.current;for(let re of H)ft.copy(re.worldDir).multiplyScalar(ie).add(re.restWorldPos).applyMatrix4(re.parentInverse),re.node.position.copy(ft)});let ot=L=>{let _=L;for(;_;){let H=fi(_),K=H?j[H]:void 0;if(K&&t[K])return[K,t[K]];_=_.parent}return null},ht=L=>{let _=ot(L.object);if(!_)return;let[,H]=_;H.selectable!==!1&&(L.stopPropagation(),r(H))},Dt=L=>{if(!h)return;let _=ot(L.object);if(!_)return;let[H,K]=_;K.hoverable!==!1&&(L.stopPropagation(),f("pointer"),k(H),o?.(K))},Tn=L=>{h&&(L.stopPropagation(),C(),k(null),o?.(null))},Z=gn(()=>!ds(x),[x]);return nb("group",{ref:R,children:nb("primitive",{object:x,...Z?{onClick:ht,...h?{onPointerOver:Dt,onPointerOut:Tn}:{}}:{}})})}import{useEffect as qw,useMemo as Zw,useRef as Qw}from"react";import{useFrame as e1,useThree as t1}from"@react-three/fiber";function aw(e){try{let t=typeof location<"u"?location.href:void 0;return new URL(e,t).origin}catch{return null}}function rb(e){if(!e)return null;let t=e.length,n=e.indexOf("?"),a=e.indexOf("#");n!==-1&&(t=Math.min(t,n)),a!==-1&&(t=Math.min(t,a));let r=e.lastIndexOf(".",t),o=e.lastIndexOf("/",t),s=e.indexOf("://");return s!==-1&&s+2===o||r===-1||r<o?null:e.substring(r+1,t)||null}var $s,Xs=($s=class{static setXRSession(e){e!==this.session&&(this.flushPending(),this.session=e)}static requestAnimationFrame(e){let{session:t,pending:n}=this,a,r=()=>{n.delete(a),e()};return a=t?t.requestAnimationFrame(r):requestAnimationFrame(r),n.set(a,e),a}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)})}},oc($s,"pending",new Map),oc($s,"session",null),$s),ob=2**30,iw=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 a=e(t),r=e(n);return a<r?-1:+(a>r)}):this._unloadPriorityCallback=e}constructor(){this.minSize=6e3,this.maxSize=8e3,this.minBytesSize=.3*ob,this.maxBytesSize=.4*ob,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:a}=this;a.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 a=this.usedSet,r=this.itemList,o=this.callbacks;return r.push(e),a.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,a=this.itemList,r=this.bytesMap,o=this.callbacks,s=this.loadedSet;if(n.has(e)){this.cachedBytes-=r.get(e)||0,r.delete(e),o.get(e)(e);let l=a.indexOf(e);return a.splice(l,1),t.delete(e),n.delete(e),o.delete(e),s.delete(e),!0}return!1}setLoaded(e,t){let{itemSet:n,loadedSet:a}=this;n.has(e)&&(t===!0?a.add(e):a.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:a,itemSet:r,usedSet:o,loadedSet:s,callbacks:l,bytesMap:i,minBytesSize:c,maxBytesSize:d}=this,u=a.length-o.size,b=a.length-s.size,g=Math.max(Math.min(a.length-t,u),0),h=this.cachedBytes-c,w=this.unloadPriorityCallback||this.defaultPriorityCallback,B=!1,v=g>0&&u>0||b&&a.length>n;if(u&&this.cachedBytes>c||b&&this.cachedBytes>d||v){a.sort((f,C)=>{let x=o.has(f);if(x===o.has(C)){let P=s.has(f);return P===s.has(C)?-w(f,C):P?1:-1}else return x?1:-1});let p=Math.max(t*e,g*e),m=Math.ceil(Math.min(p,u,g)),S=Math.max(e*h,e*c),M=Math.min(S,h),k=0,R=0;for(;this.cachedBytes-R>d||a.length-k>n;){let f=a[k],C=i.get(f)||0;if(o.has(f)&&s.has(f)||this.cachedBytes-R-C<d&&a.length-k<=n)break;R+=C,k++}for(;R<M||k<m;){let f=a[k],C=i.get(f)||0;if(o.has(f)||this.cachedBytes-R-C<c&&k>=m)break;R+=C,k++}a.splice(0,k).forEach(f=>{this.cachedBytes-=i.get(f)||0,l.get(f)(f),i.delete(f),r.delete(f),l.delete(f),s.delete(f),o.delete(f)}),B=k<g||R<h&&k<u,B&&(B=k>0)}B&&(this.unloadingHandle=Xs.requestAnimationFrame(()=>this.scheduleUnload()))}scheduleUnload(){Xs.cancelAnimationFrame(this.unloadingHandle),this.scheduled||(this.scheduled=!0,queueMicrotask(()=>{this.scheduled=!1,this.unloadUnusedContent()}))}},sw=class extends DOMException{constructor(){super("PriorityQueue: Item removed","AbortError")}},Ys=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=>{Xs.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((a,r)=>{let o=this.items,s=this.callbacks;n.resolve=a,n.reject=r,o.unshift(e),s.set(e,n),this.autoUpdate&&this.scheduleJobRun()}),n.promise}remove(e){let t=this.items,n=this.callbacks,a=t.indexOf(e);if(a!==-1){let r=n.get(e);r.promise.catch(o=>{if(o.name!=="AbortError")throw o}),r.reject(new sw),t.splice(a,1),n.delete(e)}}removeByFilter(e){let{items:t}=this;for(let n=0;n<t.length;n++){let a=t[n];e(a)&&(this.remove(a),n--)}}tryRunJobs(){this.sort();let e=this.items,t=this.callbacks,n=this.maxJobs,a=0,r=()=>{this.currJobs--,this.autoUpdate&&this.scheduleJobRun()};for(;n>this.currJobs&&e.length>0&&a<n;){this.currJobs++,a++;let o=e.pop(),{callback:s,resolve:l,reject:i}=t.get(o);t.delete(o);let c;try{c=s(o)}catch(d){i(d),r();continue}c instanceof Promise?c.then(l).catch(i).finally(r):(l(c),r())}}flush(e){let{items:t,callbacks:n}=this,a=t.indexOf(e);if(!n.has(e))return;let{callback:r,resolve:o,reject:s}=n.get(e);n.delete(e),t.splice(a,1);let l;try{l=r(e)}catch(i){s(i);return}return l instanceof Promise?l.then(o).catch(s):o(l),l}scheduleJobRun(){this.scheduled||(this.scheduled=(this._schedulingCallback(this._runjobs),!0))}},lw=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,a=null){this.originQueues.forEach((i,c)=>{i.running||this.originQueues.delete(c)});let r=e===null?null:aw(e),o=this.originQueues.get(r);o||(o=new Ys,o.maxJobs=this._maxJobsPerOrigin,o.priorityCallback=this._priorityCallback,this.originQueues.set(r,o));let s=this._itemQueues.get(t);if(s&&s!==o&&s.has(t))throw Error("DownloadPriorityQueue: Item is already queued with a different url origin.");this._itemQueues.set(t,o);let l=o.add(t,n);return a!==null&&(a.aborted?this.remove(t):a.addEventListener("abort",()=>this.remove(t),{once:!0})),l}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 ad=6378137,HT=1/298.257223563,sb=6356752314245179e-9,Ws={inView:!1,error:1/0,distanceFromCamera:1/0};function Js(e){return e===4||e===-1}function Lr(e,t){return qs(e)&&e.traversal.lastFrameVisited===t&&e.traversal.used}function qs(e){return!!e.traversal}function Ci(e){let{children:t}=e,n=t.length===0||qs(t[t.length-1]),a=!e.internal.hasUnrenderableContent||Js(e.internal.loadingState);return n&&a}function To(e){return e.traversal.unconditionallyRefine}function wi(e,t){if(qs(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,Ws),e.traversal.inFrustum=Ws.inView,e.traversal.error=Ws.error,e.traversal.distanceFromCamera=Ws.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 td(e,t,n=!1){if(wi(e,t),n?t.markTileUsed(e):Ks(e),To(e)&&Ci(e)){let a=e.children;for(let r=0,o=a.length;r<o;r++)td(a[r],t,n)}}function lb(e,t){if(wi(e,t),e.traversal.usedLastFrame&&(Ks(e),e.traversal.wasSetActive&&(e.traversal.active=!0),(!e.traversal.active||To(e))&&Ci(e))){let n=e.children;for(let a=0,r=n.length;a<r;a++)lb(n[a],t)}}function Ks(e){e.traversal.used=!0}function cw(e,t){return!(e.traversal.error<=t.errorTarget&&!To(e)||t.maxDepth>0&&e.internal.depth+1>=t.maxDepth||!Ci(e))}function cb(e,t){let{frameCount:n}=t,{children:a}=e;for(let r=0,o=a.length;r<o;r++){let s=a[r];Lr(s,n)&&(s.traversal.active&&(s.traversal.kicked=!0,s.traversal.active=!1),cb(s,t))}}function ab(e){return!To(e)&&(!e.internal.hasContent||Js(e.internal.loadingState))}function db(e,t){if(wi(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(!cw(e,t)){Ks(e);return}let a=!1,r=!1,o=e.children;for(let s=0,l=o.length;s<l;s++){let i=o[s];db(i,t),a||(a=Lr(i,t.frameCount)),r||(r=i.traversal.inFrustum)}if(e.refine==="REPLACE"&&!r&&o.length!==0){e.traversal.inFrustum=!1,t.markTileUsed(e);for(let s=0,l=o.length;s<l;s++)td(o[s],t,!0);return}if(Ks(e),e.refine==="REPLACE"&&a&&(t.loadSiblings||t.loadAncestors))for(let s=0,l=o.length;s<l;s++)td(o[s],t)}function pb(e,t){let n=t.frameCount;if(!Lr(e,n))return;let a=e.children,r=!1;for(let s=0,l=a.length;s<l;s++){let i=a[s];r||(r=Lr(i,n))}if(!r)e.traversal.isLeaf=!0;else{for(let l=0,i=a.length;l<i;l++)pb(a[l],t);let s=!0;for(let l=0,i=a.length;l<i;l++){let c=a[l];if(Lr(c,n)){let d=!To(c),u=!c.internal.hasContent||Js(c.internal.loadingState);d&&u||c.traversal.allChildrenLoaded||(s=!1)}}e.traversal.allChildrenLoaded=s}let o=!0;for(let s=0,l=a.length;s<l;s++){let i=a[s];Lr(i,t.frameCount)&&!i.traversal.allUsedChildrenProcessed&&(o=!1)}e.traversal.allUsedChildrenProcessed=o&&Ci(e)}function ub(e,t){if(!Lr(e,t.frameCount))return;let n=e.children;if(e.refine==="REPLACE"&&t.loadAncestors&&!e.traversal.allChildrenLoaded&&!To(e)&&(e.traversal.isLeaf=!0),e.traversal.isLeaf){if(!To(e)&&(e.traversal.active=!0,Ci(e)&&e.internal.hasContent&&!Js(e.internal.loadingState)))for(let r=0,o=n.length;r<o;r++)lb(n[r],t);return}let a=n.length>0;for(let r=0,o=n.length;r<o;r++){let s=n[r];ub(s,t),Lr(s,t.frameCount)&&!(s.traversal.active&&ab(s))&&!s.traversal.allChildrenReady&&(a=!1)}e.traversal.allChildrenReady=a,e.refine==="REPLACE"&&!a&&e.traversal.wasSetActive&&ab(e)&&(e.traversal.active=!0,cb(e,t))}function mb(e,t){wi(e,t);let n=Lr(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||qs(e)&&e.traversal.usedLastFrame){let a=!1,r=!1;n?(a=e.traversal.active,r=t.displayActiveTiles&&e.traversal.active||e.traversal.visible):wi(e,t),e.internal.hasRenderableContent&&e.internal.loadingState===4?(a&&t.stats.active++,r&&t.stats.visible++,e.traversal.wasSetActive!==a&&t.invokeOnePlugin(s=>s.setTileActive&&s.setTileActive(e,a)),e.traversal.wasSetVisible!==r&&t.invokeOnePlugin(s=>s.setTileVisible&&s.setTileVisible(e,r))):e.internal.hasRenderableContent||(r=e.traversal.isLeaf,e.traversal.wasSetVisible!==r&&t.invokeOnePlugin(s=>s.setEmptyTileVisible&&s.setEmptyTileVisible(e,r))),e.traversal.visible=r,e.traversal.active=a;let o=e.children;for(let s=0,l=o.length;s<l;s++){let i=o[s];mb(i,t)}}}function dw(e,t){db(e,t),pb(e,t),ub(e,t),mb(e,t)}function pw(e){let t=null;return()=>{t===null&&(t=Xs.requestAnimationFrame(()=>{t=null,e()}))}}function uw(e,t=null,n=null){let a=[];for(a.push(e),a.push(null),a.push(0);a.length>0;){let r=a.pop(),o=a.pop(),s=a.pop();if(t&&t(s,o,r)){n&&n(s,o,r);return}let l=s.children;if(l)for(let i=l.length-1;i>=0;i--)a.push(l[i]),a.push(s),a.push(r+1);n&&n(s,o,r)}}var ib=Symbol("PLUGIN_REGISTERED"),Kr={inView:!0,error:0,distance:1/0},mw=(e,t)=>{let n=e.priority||0,a=t.priority||0;return n===a?!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>a?1:-1},bw=(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,gw=(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,id=(e,t)=>{let n=e.priority??1/0,a=t.priority??1/0;if(n!==a)return n>a?1:-1;if(!e.internal||!t.internal)return 0;let r=e.internal.renderer,o=t.internal.renderer,s=!r.loadAncestors,l=!o.loadAncestors;return s&&l?bw(e,t):mw(e,t)},bb=new iw;bb.unloadPriorityCallback=gw;var nd=new lw;nd.maxJobsPerOrigin=25,nd.priorityCallback=id;var rd=new Ys;rd.maxJobs=5,rd.priorityCallback=id;var od=new Ys;od.maxJobs=25,od.priorityCallback=(e,t)=>{let n=e.parent,a=t.parent;return n===a?0:n?a?id(n,a):-1:1};var gb=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,a=e.inCacheSinceLoad+ +!!t;return a===0?1:1-n/a}get downloadQueue(){return this._downloadQueue}set downloadQueue(e){if(e instanceof Ys){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=bb,this.downloadQueue=nd,this.parseQueue=rd,this.processNodeQueue=od,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=pw(()=>{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[ib]===!0)throw Error("TilesRendererBase: A plugin can only be registered to a single tileset");let t=this.plugins,n=e.priority||0,a=t.length;for(let r=0;r<t.length;r++)if((t[r].priority||0)>n){a=r;break}t.splice(a,0,e),e[ib]=!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 a=e(t[n]);if(a)return a}return null}invokeAllPlugins(e){let t=[...this.plugins,this],n=[];for(let a=0;a<t.length;a++){let r=e(t[a]);r&&n.push(r)}return n.length===0?null:Promise.all(n)}traverse(e,t,n=!0){this.root&&uw(this.root,(a,...r)=>(n&&this.ensureChildrenArePreprocessed(a,!0),e?e(a,...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:a,downloadQueue:r,parseQueue:o,processNodeQueue:s}=this;if(this.rootLoadingState===0&&(this.rootLoadingState=2,this.invokeOnePlugin(c=>c.loadRootTileset&&c.loadRootTileset()).then(c=>{let d=this.rootURL;d!==null&&this.invokeAllPlugins(u=>d=u.preprocessURL?u.preprocessURL(d,null):d),this.rootLoadingState=4,this.rootTileset=c,this.dispatchEvent({type:"needs-update"}),this.dispatchEvent({type:"load-tileset",tileset:c,url:d}),this.dispatchEvent({type:"load-root-tileset",tileset:c,url:d})}).catch(c=>{this.rootLoadingState=-1,console.error(c),this.rootTileset=null,this.dispatchEvent({type:"load-error",tile:null,error:c,url:this.rootURL})})),!a)return;let l=null;if(this.invokeAllPlugins(c=>{if(c.doTilesNeedUpdate){let d=c.doTilesNeedUpdate();l=l===null?d:!!(l||d)}}),l===!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(c=>e.markUnused(c)),t.clear(),this.prepareForTraversal(),dw(a,this),this.removeUnusedPendingTiles();let i=this.queuedTiles;i.sort(e.unloadPriorityCallback);for(let c=0,d=i.length;c<d&&!e.isFull();c++)this.requestTileContents(i[c]);i.length=0,e.scheduleUnload(),(r.running||o.running||s.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:a}=this;if(n>0&&Number.isFinite(t.distanceFromCamera)){let l=t.distanceFromCamera*a;t.error-=n*(1-Math.exp(-l*l))}let r=null,o=0,s=1/0;this.invokeAllPlugins(l=>{l!==this&&l.calculateTileViewError&&(Kr.inView=!0,Kr.error=0,Kr.distance=1/0,l.calculateTileViewError(e,Kr)&&(r===null&&(r=!0),r&&(r=Kr.inView),Kr.inView&&(s=Math.min(s,Kr.distance),o=Math.max(o,Kr.error))))}),t.inView&&r!==!1?(t.error=Math.max(t.error,o),t.distanceFromCamera=Math.min(t.distanceFromCamera,s)):r?(t.inView=!0,t.error=o,t.distanceFromCamera=s):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,a=t.length;n<a;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 a=rb(e.content.uri),r=!!(a&&/json$/.test(a));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(a=>{a!==this&&a.preprocessNode&&a.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 a of t)!e.isUsed(a)&&a.internal.loadingState===1&&n.push(a);for(let a=0;a<n.length;a++)e.remove(n[a])}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 a=r=>{for(let o=0,s=r.length;o<s;o++){let l=r[o];l&&!l.traversal&&this.preprocessNode(l,e.internal.basePath,e)}};t?(this.processNodeQueue.remove(e),a(n)):this.processNodeQueue.has(e)||this.processNodeQueue.add(e,r=>{a(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(a=>{n.has(a)&&t.setMemoryUsage(a,this.getBytesUsed(a))}):t.setMemoryUsage(e,this.getBytesUsed(e))}preprocessTileset(e,t,n=null){let[a,r]=e.asset.version.split(".").map(s=>parseInt(s));console.assert(a<=1,"TilesRenderer: asset.version is expected to be a 1.x or a compatible version."),a===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,a=new URL(e.content.uri,e.internal.basePath+"/").toString();this.invokeAllPlugins(b=>a=b.preprocessURL?b.preprocessURL(a,e):a);let r=this.stats,o=this.lruCache,s=this.downloadQueue,l=this.parseQueue,i=this.loadingTiles,c=rb(a),d=new AbortController,u=d.signal;if(o.add(e,b=>{d.abort(),t?b.children.length=0:this.invokeAllPlugins(g=>{g.disposeTile&&g.disposeTile(b)}),r.inCache--,this.cachedSinceLoadComplete.has(e)&&(this.cachedSinceLoadComplete.delete(e),r.inCacheSinceLoad--),b.internal.loadingState===1?r.queued--:b.internal.loadingState===2?r.downloading--:b.internal.loadingState===3?r.parsing--:b.internal.loadingState===4&&r.loaded--,b.internal.loadingState=0,l.remove(b),s.remove(b),i.delete(b)}))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,i.add(e),s.add(a,e,b=>{if(u.aborted)return Promise.resolve();e.internal.loadingState=2,r.downloading++,r.queued--;let g=this.invokeOnePlugin(h=>h.fetchData&&h.fetchData(a,{...this.fetchOptions,signal:u}));return this.dispatchEvent({type:"tile-download-start",tile:e,url:a,get uri(){return console.warn('tile-download-start event: "uri" has been renamed to "url".'),this.url}}),g}).then(b=>{if(!u.aborted){if(!(b instanceof Response))return b;if(b.ok)return c==="json"?b.json():b.arrayBuffer();throw Error(`Failed to load model with error code ${b.status}`)}}).then(b=>{if(!u.aborted)return r.downloading--,r.parsing++,e.internal.loadingState=3,l.add(e,g=>u.aborted?Promise.resolve():c==="json"&&b.root?(this.preprocessTileset(b,a,e),e.children.push(b.root),n=b,t=!0,Promise.resolve()):this.invokeOnePlugin(h=>h.parseTile&&h.parseTile(b,g,c,a,u)))}).then(()=>{if(u.aborted)return;r.parsing--,r.loaded++,e.internal.loadingState=4,i.delete(e),o.setLoaded(e,!0);let b=this.getBytesUsed(e);if(o.getMemoryUsage(e)===0&&b>0&&o.isFull()){o.remove(e);return}o.setMemoryUsage(e,b),this.dispatchEvent({type:"needs-update"}),t&&this.dispatchEvent({type:"load-tileset",tileset:n,url:a}),e.engineData.scene&&this.dispatchEvent({type:"load-model",scene:e.engineData.scene,tile:e,url:a})}).catch(b=>{u.aborted||(b.name==="AbortError"?o.remove(e):(l.remove(e),s.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(b),e.internal.loadingState=-1,i.delete(e),o.setLoaded(e,!0),this.dispatchEvent({type:"load-error",tile:e,error:b,url:a})))})}};function Ro(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 a=0;a<4;a++)n+=String.fromCharCode(t.getUint8(a));return n}var fw=new TextDecoder;function fb(e){return fw.decode(e)}function Zs(e){return e.replace(/[\\/][^\\/]+$/,"")+"/"}var Qs=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=Zs(e)),this.parse(t)))}resolveExternalURL(e){return new URL(e,this.workingPath).href}parse(e){throw Error("LoaderBase: Parse not implemented.")}};function hb(e,t,n,a,r,o){let s;switch(a){case"SCALAR":s=1;break;case"VEC2":s=2;break;case"VEC3":s=3;break;case"VEC4":s=4;break;default:throw Error(`FeatureTable : Feature type not provided for "${o}".`)}let l,i=n*s;switch(r){case"BYTE":l=new Int8Array(e,t,i);break;case"UNSIGNED_BYTE":l=new Uint8Array(e,t,i);break;case"SHORT":l=new Int16Array(e,t,i);break;case"UNSIGNED_SHORT":l=new Uint16Array(e,t,i);break;case"INT":l=new Int32Array(e,t,i);break;case"UNSIGNED_INT":l=new Uint32Array(e,t,i);break;case"FLOAT":l=new Float32Array(e,t,i);break;case"DOUBLE":l=new Float64Array(e,t,i);break;default:throw Error(`FeatureTable : Feature component type not provided for "${o}".`)}return l}var el=class{constructor(e,t,n,a){this.buffer=e,this.binOffset=t+n,this.binLength=a;let r=null;if(n!==0){let o=new Uint8Array(e,t,n);r=JSON.parse(fb(o))}else r={};this.header=r}getKeys(){return Object.keys(this.header).filter(e=>e!=="extensions")}getData(e,t,n=null,a=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:s,binOffset:l,binLength:i}=this,c=o.byteOffset||0,d=o.type||a,u=o.componentType||n;if("type"in o&&a&&o.type!==a)throw Error("FeatureTable: Specified type does not match expected type.");let b=l+c,g=hb(s,b,t,d,u,e);if(b+g.byteLength>l+i)throw Error("FeatureTable: Feature data read outside binary body length.");return g}}getBuffer(e,t){let{buffer:n,binOffset:a}=this;return n.slice(a+e,a+e+t)}},hw=class{constructor(e){this.batchTable=e;let t=e.header.extensions["3DTILES_batch_table_hierarchy"];this.classes=t.classes;for(let a of this.classes){let r=a.instances;for(let o in r)a.instances[o]=this._parseProperty(r[o],a.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 a=this.parentCounts.reduce((r,o)=>r+o,0);this.parentIds=this._parseProperty(t.parentIds,a,"parentIds")}else this.parentIds=null;this.instancesIds=[];let n={};for(let a of this.classIds)n[a]=n[a]??0,this.instancesIds.push(n[a]),n[a]++}_parseProperty(e,t,n){if(Array.isArray(e))return e;{let{buffer:a,binOffset:r}=this.batchTable,o=e.byteOffset,s=e.componentType||"UNSIGNED_SHORT";return hb(a,r+o,t,"SCALAR",s,n)}}getDataFromId(e,t={}){let n=this.parentCounts[e];if(this.parentIds&&n>0){let l=0;for(let i=0;i<e;i++)l+=this.parentCounts[i];for(let i=0;i<n;i++){let c=this.parentIds[l+i];c!==e&&this.getDataFromId(c,t)}}let a=this.classIds[e],r=this.classes[a].instances,o=this.classes[a].name,s=this.instancesIds[e];for(let l in r)t[o]=t[o]||{},t[o][l]=r[l][s];return t}},sd=class extends el{constructor(e,t,n,a,r){super(e,n,a,r),this.count=t,this.extensions={};let o=this.header.extensions;o&&o["3DTILES_batch_table_hierarchy"]&&(this.extensions["3DTILES_batch_table_hierarchy"]=new hw(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 a=this.extensions[n];a.getDataFromId instanceof Function&&(t[n]=t[n]||{},a.getDataFromId(e,t[n]))}return t}getPropertyArray(e){return super.getData(e,this.count)}},xb=class extends Qs{parse(e){let t=new DataView(e),n=Ro(t);console.assert(n==="b3dm");let a=t.getUint32(4,!0);console.assert(a===1);let r=t.getUint32(8,!0);console.assert(r===e.byteLength);let o=t.getUint32(12,!0),s=t.getUint32(16,!0),l=t.getUint32(20,!0),i=t.getUint32(24,!0),c=new el(e.slice(28,28+o+s),0,o,s),d=28+o+s,u=new sd(e.slice(d,d+l+i),c.getData("BATCH_LENGTH"),0,l,i),b=d+l+i;return{version:a,featureTable:c,batchTable:u,glbBytes:new Uint8Array(e,b,r-b)}}},vb=class extends Qs{parse(e){let t=new DataView(e),n=Ro(t);console.assert(n==="i3dm");let a=t.getUint32(4,!0);console.assert(a===1);let r=t.getUint32(8,!0);console.assert(r===e.byteLength);let o=t.getUint32(12,!0),s=t.getUint32(16,!0),l=t.getUint32(20,!0),i=t.getUint32(24,!0),c=t.getUint32(28,!0),d=new el(e.slice(32,32+o+s),0,o,s),u=32+o+s,b=new sd(e.slice(u,u+l+i),d.getData("INSTANCES_LENGTH"),0,l,i),g=u+l+i,h=new Uint8Array(e,g,r-g),w=null,B=null,v=null;if(c)w=h,B=Promise.resolve();else{let p=this.resolveExternalURL(fb(h));v=Zs(p),B=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=>{w=new Uint8Array(m)})}return B.then(()=>({version:a,featureTable:d,batchTable:b,glbBytes:w,gltfWorkingPath:v}))}},yb=class extends Qs{parse(e){let t=new DataView(e),n=Ro(t);console.assert(n==="pnts");let a=t.getUint32(4,!0);console.assert(a===1);let r=t.getUint32(8,!0);console.assert(r===e.byteLength);let o=t.getUint32(12,!0),s=t.getUint32(16,!0),l=t.getUint32(20,!0),i=t.getUint32(24,!0),c=new el(e.slice(28,28+o+s),0,o,s),d=28+o+s,u=new sd(e.slice(d,d+l+i),c.getData("BATCH_LENGTH")||c.getData("POINTS_LENGTH"),0,l,i);return Promise.resolve({version:a,featureTable:c,batchTable:u})}},wb=class extends Qs{parse(e){let t=new DataView(e),n=Ro(t);console.assert(n==="cmpt",'CMPTLoader: The magic bytes equal "cmpt".');let a=t.getUint32(4,!0);console.assert(a===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),s=[],l=16;for(let i=0;i<o;i++){let c=new DataView(e,l,12),d=Ro(c),u=c.getUint32(4,!0),b=c.getUint32(8,!0),g=new Uint8Array(e,l,b);s.push({type:d,buffer:g,version:u}),l+=b}return{version:a,tiles:s}}};import{Box3 as zb,BufferAttribute as Ao,BufferGeometry as xw,Clock as cR,Color as vw,DefaultLoadingManager as dl,Euler as yw,EventDispatcher as tl,Frustum as ww,Group as hd,InstancedMesh as Cw,LoadingManager as Sw,MathUtils as jb,Matrix3 as Mw,Matrix4 as rn,Mesh as dR,OrthographicCamera as pR,PerspectiveCamera as uR,Plane as kw,PlaneGeometry as mR,Points as Pw,PointsMaterial as Tw,Quaternion as Ib,Ray as xd,Raycaster as bR,ShaderMaterial as gR,Sphere as Fb,Spherical as Rw,TextureUtils as Aw,Vector2 as vd,Vector3 as Pe}from"three";import{GLTFLoader as yd}from"three/addons/loaders/GLTFLoader.js";import{estimateBytesUsed as Bw}from"three/addons/utils/BufferGeometryUtils.js";var wd=class extends xb{constructor(e=dl){super(),this.manager=e,this.adjustmentTransform=new rn}parse(e){let t=super.parse(e),n=t.glbBytes.slice().buffer;return new Promise((a,r)=>{let o=this.manager,s=this.fetchOptions,l=o.getHandler("path.gltf")||new yd(o);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 i=this.workingPath;!/[\\/]$/.test(i)&&i.length&&(i+="/");let c=this.adjustmentTransform;l.parse(n,i,d=>{let{batchTable:u,featureTable:b}=t,{scene:g}=d,h=b.getData("RTC_CENTER",1,"FLOAT","VEC3");h&&(g.position.x+=h[0],g.position.y+=h[1],g.position.z+=h[2]),d.scene.updateMatrix(),d.scene.matrix.multiply(c),d.scene.matrix.decompose(d.scene.position,d.scene.quaternion,d.scene.scale),d.batchTable=u,d.featureTable=b,g.batchTable=u,g.featureTable=b,a(d)},r)})}};function Ow(e){let t=e>>11,n=e>>5&63,a=e&31;return[Math.round(t/31*255),Math.round(n/63*255),Math.round(a/31*255)]}var Si=new vd;function Ew(e,t,n=new Pe){Si.set(e,t).divideScalar(256).multiplyScalar(2).subScalar(1),n.set(Si.x,Si.y,1-Math.abs(Si.x)-Math.abs(Si.y));let a=jb.clamp(-n.z,0,1);return n.x>=0?n.setX(n.x-a):n.setX(n.x+a),n.y>=0?n.setY(n.y-a):n.setY(n.y+a),n.normalize(),n}var Cb={RGB:"color",POSITION:"position"},Cd=class extends yb{constructor(e=dl){super(),this.manager=e}parse(e){return super.parse(e).then(async t=>{let{featureTable:n,batchTable:a}=t,r=new Tw,o=n.header.extensions,s=new Pe,l;if(o&&o["3DTILES_draco_point_compression"]){let{byteOffset:d,byteLength:u,properties:b}=o["3DTILES_draco_point_compression"],g=this.manager.getHandler("draco.drc");if(g==null)throw Error("PNTSLoader: dracoLoader not available.");let h={};for(let v in b)if(v in Cb&&v in b){let p=Cb[v];h[p]=b[v]}let w={attributeIDs:h,attributeTypes:{position:"Float32Array",color:"Uint8Array"},useUniqueIDs:!0},B=n.getBuffer(d,u);l=await g.decodeGeometry(B,w),l.attributes.color&&(r.vertexColors=!0)}else{let d=n.getData("POINTS_LENGTH"),u=n.getData("POSITION",d,"FLOAT","VEC3"),b=n.getData("NORMAL",d,"FLOAT","VEC3"),g=n.getData("NORMAL",d,"UNSIGNED_BYTE","VEC2"),h=n.getData("RGB",d,"UNSIGNED_BYTE","VEC3"),w=n.getData("RGBA",d,"UNSIGNED_BYTE","VEC4"),B=n.getData("RGB565",d,"UNSIGNED_SHORT","SCALAR"),v=n.getData("CONSTANT_RGBA",d,"UNSIGNED_BYTE","VEC4"),p=n.getData("POSITION_QUANTIZED",d,"UNSIGNED_SHORT","VEC3"),m=n.getData("QUANTIZED_VOLUME_SCALE",d,"FLOAT","VEC3"),S=n.getData("QUANTIZED_VOLUME_OFFSET",d,"FLOAT","VEC3");if(l=new xw,p){let M=new Float32Array(d*3);for(let k=0;k<d;k++)for(let R=0;R<3;R++){let f=3*k+R;M[f]=p[f]/65535*m[R]}s.x=S[0],s.y=S[1],s.z=S[2],l.setAttribute("position",new Ao(M,3,!1))}else l.setAttribute("position",new Ao(u,3,!1));if(b!==null)l.setAttribute("normal",new Ao(b,3,!1));else if(g!==null){let M=new Float32Array(d*3),k=new Pe;for(let R=0;R<d;R++){let f=g[R*2],C=g[R*2+1],x=Ew(f,C,k);M[R*3]=x.x,M[R*3+1]=x.y,M[R*3+2]=x.z}l.setAttribute("normal",new Ao(M,3,!1))}if(w!==null)l.setAttribute("color",new Ao(w,4,!0)),r.vertexColors=!0,r.transparent=!0,r.depthWrite=!1;else if(h!==null)l.setAttribute("color",new Ao(h,3,!0)),r.vertexColors=!0;else if(B!==null){let M=new Uint8Array(d*3);for(let k=0;k<d;k++){let R=Ow(B[k]);for(let f=0;f<3;f++){let C=3*k+f;M[C]=R[f]}}l.setAttribute("color",new Ao(M,3,!0)),r.vertexColors=!0}else if(v!==null){r.color=new vw(v[0],v[1],v[2]);let M=v[3]/255;M<1&&(r.opacity=M,r.transparent=!0,r.depthWrite=!1)}}let i=new Pw(l,r);i.position.copy(s),t.scene=i,t.scene.featureTable=n,t.scene.batchTable=a;let c=n.getData("RTC_CENTER",1,"FLOAT","VEC3");return c&&(t.scene.position.x+=c[0],t.scene.position.y+=c[1],t.scene.position.z+=c[2]),t})}};function Lw(e){let{x:t,y:n,z:a}=e;e.x=a,e.y=t,e.z=n}function Dw(e){return-e+Math.PI/2}var Sb=new Rw,Yr=new Pe,yn=new Pe,ld=new Pe,Jn=new rn,vr=new rn,cd=new Fb,En=new yw,Mb=new Pe,kb=new Pe,Pb=new Pe,Mi=new Pe,nl=new xd,Nw=1e-12,_w=.1;var Sd=class{constructor(e=1,t=1,n=1){this.name="",this.radius=new Pe(e,t,n)}intersectRay(e,t){return Jn.makeScale(...this.radius).invert(),cd.center.set(0,0,0),cd.radius=1,nl.copy(e).applyMatrix4(Jn),nl.intersectSphere(cd,t)?(Jn.makeScale(...this.radius),t.applyMatrix4(Jn),t):null}getEastNorthUpFrame(e,t,n,a){return n.isMatrix4&&(a=n,n=0,console.warn('Ellipsoid: The signature for "getEastNorthUpFrame" has changed.')),this.getEastNorthUpAxes(e,t,Mb,kb,Pb),this.getCartographicToPosition(e,t,n,Mi),a.makeBasis(Mb,kb,Pb).setPosition(Mi)}getOrientedEastNorthUpFrame(e,t,n,a,r,o,s){return this.getObjectFrame(e,t,n,a,r,o,s,0)}getObjectFrame(e,t,n,a,r,o,s,l=2){return this.getEastNorthUpFrame(e,t,n,Jn),En.set(r,o,-a,"ZXY"),s.makeRotationFromEuler(En).premultiply(Jn),l===1?(En.set(Math.PI/2,0,0,"XYZ"),vr.makeRotationFromEuler(En),s.multiply(vr)):l===2&&(En.set(-Math.PI/2,0,Math.PI,"XYZ"),vr.makeRotationFromEuler(En),s.multiply(vr)),s}getCartographicFromObjectFrame(e,t,n=2){return n===1?(En.set(-Math.PI/2,0,0,"XYZ"),vr.makeRotationFromEuler(En).premultiply(e)):n===2?(En.set(-Math.PI/2,0,Math.PI,"XYZ"),vr.makeRotationFromEuler(En).premultiply(e)):vr.copy(e),Mi.setFromMatrixPosition(vr),this.getPositionToCartographic(Mi,t),this.getEastNorthUpFrame(t.lat,t.lon,0,Jn).invert(),vr.premultiply(Jn),En.setFromRotationMatrix(vr,"ZXY"),t.azimuth=-En.z,t.elevation=En.x,t.roll=En.y,t}getEastNorthUpAxes(e,t,n,a,r,o=Mi){this.getCartographicToPosition(e,t,0,o),this.getCartographicToNormal(e,t,r),n.set(-o.y,o.x,0).normalize(),a.crossVectors(r,n).normalize()}getCartographicToPosition(e,t,n,a){this.getCartographicToNormal(e,t,Yr);let r=this.radius;yn.copy(Yr),yn.x*=r.x**2,yn.y*=r.y**2,yn.z*=r.z**2;let o=Math.sqrt(Yr.dot(yn));return yn.divideScalar(o),a.copy(yn).addScaledVector(Yr,n)}getPositionToCartographic(e,t){this.getPositionToSurfacePoint(e,yn),this.getPositionToNormal(yn,Yr);let n=ld.subVectors(e,yn);return t.lon=Math.atan2(Yr.y,Yr.x),t.lat=Math.asin(Yr.z),t.height=Math.sign(n.dot(e))*n.length(),t}getCartographicToNormal(e,t,n){return Sb.set(1,Dw(e),t),n.setFromSpherical(Sb).normalize(),Lw(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,a=1/n.x**2,r=1/n.y**2,o=1/n.z**2,s=e.x*e.x*a,l=e.y*e.y*r,i=e.z*e.z*o,c=s+l+i,d=Math.sqrt(1/c),u=yn.copy(e).multiplyScalar(d);if(c<_w)return isFinite(d)?t.copy(u):null;let b=ld.set(u.x*a*2,u.y*r*2,u.z*o*2),g=(1-d)*e.length()/(.5*b.length()),h=0,w,B,v,p,m,S,M,k,R,f,C;do{g-=h,v=1/(1+g*a),p=1/(1+g*r),m=1/(1+g*o),S=v*v,M=p*p,k=m*m,R=S*v,f=M*p,C=k*m,w=s*S+l*M+i*k-1,B=s*R*a+l*f*r+i*C*o;let x=-2*B;h=w/x}while(Math.abs(w)>Nw);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,a=e*jb.DEG2RAD,r=Math.sin(a)**2;return t/Math.sqrt(1-n*r)}getPositionElevation(e){this.getPositionToSurfacePoint(e,yn);let t=ld.subVectors(e,yn);return Math.sign(t.dot(e))*t.length()}closestPointToRayEstimate(e,t){return this.intersectRay(e,t)?t:(Jn.makeScale(...this.radius).invert(),nl.copy(e).applyMatrix4(Jn),yn.set(0,0,0),nl.closestPointToPoint(yn,t).normalize(),Jn.makeScale(...this.radius),t.applyMatrix4(Jn))}copy(e){return this.radius.copy(e.radius),this}clone(){return new this.constructor().copy(this)}},Ai=new Sd(ad,ad,sb);Ai.name="WGS84 Earth";var rl=new Pe,va=new Pe,ya=new Pe,dd=new Pe,ol=new Ib,al=new Pe,wa=new rn,Tb=new rn,Rb=new Pe,Ab=new rn,pd=new Ib,ud={};function Bb(e,t,n,a){if(e=e/n*2-1,t=t/n*2-1,a.x=e,a.y=t,a.z=1-Math.abs(e)-Math.abs(t),a.z<0){let r=a.x;a.x=(1-Math.abs(a.y))*(r>=0?1:-1),a.y=(1-Math.abs(r))*(a.y>=0?1:-1)}return a.normalize(),a}var Md=class extends vb{constructor(e=dl){super(),this.manager=e,this.adjustmentTransform=new rn,this.ellipsoid=Ai.clone()}resolveExternalURL(e){return this.manager.resolveURL(super.resolveExternalURL(e))}parse(e){return super.parse(e).then(t=>{let{featureTable:n,batchTable:a}=t,r=t.glbBytes.slice().buffer;return new Promise((o,s)=>{let l=this.fetchOptions,i=this.manager,c=i.getHandler("path.gltf")||new yd(i);l.credentials==="include"&&l.mode==="cors"&&c.setCrossOrigin("use-credentials"),"credentials"in l&&c.setWithCredentials(l.credentials==="include"),l.headers&&c.setRequestHeader(l.headers);let d=t.gltfWorkingPath??this.workingPath;/[\\/]$/.test(d)||(d+="/");let u=this.adjustmentTransform;c.parse(r,d,b=>{let g=n.getData("INSTANCES_LENGTH"),h=n.getData("POSITION",g,"FLOAT","VEC3"),w=n.getData("POSITION_QUANTIZED",g,"UNSIGNED_SHORT","VEC3"),B=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"),S=n.getData("NORMAL_UP_OCT32P",g,"UNSIGNED_SHORT","VEC2"),M=n.getData("NORMAL_RIGHT_OCT32P",g,"UNSIGNED_SHORT","VEC2"),k=n.getData("SCALE_NON_UNIFORM",g,"FLOAT","VEC3"),R=n.getData("SCALE",g,"FLOAT","SCALAR"),f=n.getData("RTC_CENTER",1,"FLOAT","VEC3"),C=n.getData("EAST_NORTH_UP");if(!h&&w){h=new Float32Array(g*3);for(let A=0;A<g;A++)h[A*3+0]=B[0]+w[A*3+0]/65535*v[0],h[A*3+1]=B[1]+w[A*3+1]/65535*v[1],h[A*3+2]=B[2]+w[A*3+2]/65535*v[2]}let x=new Pe;for(let A=0;A<g;A++)x.x+=h[A*3+0]/g,x.y+=h[A*3+1]/g,x.z+=h[A*3+2]/g;let P=[],z=[];b.scene.updateMatrixWorld(),b.scene.traverse(A=>{if(A.isMesh){z.push(A);let{geometry:j,material:T}=A,I=new Cw(j,T,g);I.position.copy(x),f&&(I.position.x+=f[0],I.position.y+=f[1],I.position.z+=f[2]),P.push(I)}});for(let A=0;A<g;A++){dd.set(h[A*3+0]-x.x,h[A*3+1]-x.y,h[A*3+2]-x.z),ol.identity(),p&&m?(va.set(p[A*3+0],p[A*3+1],p[A*3+2]),ya.set(m[A*3+0],m[A*3+1],m[A*3+2]),rl.crossVectors(ya,va).normalize(),wa.makeBasis(ya,va,rl),ol.setFromRotationMatrix(wa)):S&&M&&(Bb(S[A*2+0],S[A*2+1],65535,va),Bb(M[A*2+0],M[A*2+1],65535,ya),rl.crossVectors(ya,va).normalize(),wa.makeBasis(ya,va,rl),ol.setFromRotationMatrix(wa)),al.set(1,1,1),k&&al.set(k[A*3+0],k[A*3+1],k[A*3+2]),R&&al.multiplyScalar(R[A]);for(let j=0,T=P.length;j<T;j++){let I=P[j];pd.copy(ol),C&&(I.updateMatrixWorld(),Rb.copy(dd).applyMatrix4(I.matrixWorld),this.ellipsoid.getPositionToCartographic(Rb,ud),this.ellipsoid.getEastNorthUpFrame(ud.lat,ud.lon,Ab),pd.setFromRotationMatrix(Ab)),wa.compose(dd,pd,al).multiply(u);let F=z[j];Tb.multiplyMatrices(wa,F.matrixWorld),I.setMatrixAt(A,Tb)}}b.scene.clear(),b.scene.add(...P),b.batchTable=a,b.featureTable=n,b.scene.batchTable=a,b.scene.featureTable=n,o(b)},s)})})}},Vb=class extends wb{constructor(e=dl){super(),this.manager=e,this.adjustmentTransform=new rn,this.ellipsoid=Ai.clone()}parse(e){let t=super.parse(e),{manager:n,ellipsoid:a,adjustmentTransform:r}=this,o=[];for(let s in t.tiles){let{type:l,buffer:i}=t.tiles[s];switch(l){case"b3dm":{let c=i.slice(),d=new wd(n);d.workingPath=this.workingPath,d.fetchOptions=this.fetchOptions,d.adjustmentTransform.copy(r);let u=d.parse(c.buffer);o.push(u);break}case"pnts":{let c=i.slice(),d=new Cd(n);d.workingPath=this.workingPath,d.fetchOptions=this.fetchOptions;let u=d.parse(c.buffer);o.push(u);break}case"i3dm":{let c=i.slice(),d=new Md(n);d.workingPath=this.workingPath,d.fetchOptions=this.fetchOptions,d.ellipsoid.copy(a),d.adjustmentTransform.copy(r);let u=d.parse(c.buffer);o.push(u);break}}}return Promise.all(o).then(s=>{let l=new hd;return s.forEach(i=>{l.add(i.scene)}),{tiles:s,scene:l}})}},ki=new rn,zw=class extends hd{constructor(e){super(),this.isTilesGroup=!0,this.name="TilesRenderer.TilesGroup",this.tilesRenderer=e,this.matrixWorldInverse=new rn}raycast(e,t){return this.tilesRenderer.raycast(e,t),!1}updateMatrixWorld(e){if(this.matrixAutoUpdate&&this.updateMatrix(),this.matrixWorldNeedsUpdate||e){this.parent===null?ki.copy(this.matrix):ki.multiplyMatrices(this.parent.matrixWorld,this.matrix),this.matrixWorldNeedsUpdate=!1;let t=ki.elements,n=this.matrixWorld.elements,a=!1;for(let r=0;r<16;r++){let o=t[r],s=n[r];if(Math.abs(o-s)>2**-52){a=!0;break}}if(a){this.matrixWorld.copy(ki),this.matrixWorldInverse.copy(ki).invert();let r=this.children;for(let i=0,c=r.length;i<c;i++)r[i].updateMatrixWorld();let{tilesRenderer:o}=this,{activeTiles:s,visibleTiles:l}=o;s.forEach(i=>{l.has(i)||i.engineData.scene.updateMatrixWorld(!0)})}}}updateWorldMatrix(e,t){this.parent&&e&&this.parent.updateWorldMatrix(e,!1),this.updateMatrixWorld(!0)}},jw=new xd;function Iw(e,t,n,a){let{scene:r}=e.engineData;n.invokeOnePlugin(o=>o.raycastTile&&o.raycastTile(e,r,t,a))||t.intersectObject(r,!0,a)}function Fw(e){return"traversal"in e}function Ub(e,t,n,a,r=null){if(!Fw(t))return;let{group:o,activeTiles:s}=e,{boundingVolume:l}=t.engineData;if(r===null&&(r=jw,r.copy(n.ray).applyMatrix4(o.matrixWorldInverse)),!t.traversal.used||!l.intersectsRay(r))return;s.has(t)&&Iw(t,n,e,a);let i=t.children;for(let c=0,d=i.length;c<d;c++)Ub(e,i[c],n,a,r)}var il=new Pe,sl=new Pe,Ln=new Pe,ll=new xd,gd=class{constructor(e=new zb,t=new rn){this.box=e.clone(),this.transform=t.clone(),this.inverseTransform=new rn,this.points=Array(8).fill().map(()=>new Pe),this.planes=[,,,,,,].fill().map(()=>new kw)}copy(e){return this.box.copy(e.box),this.transform.copy(e.transform),this.update(),this}clone(){return new this.constructor().copy(this)}clampPoint(e,t){return t.copy(e).applyMatrix4(this.inverseTransform).clamp(this.box.min,this.box.max).applyMatrix4(this.transform)}distanceToPoint(e){return this.clampPoint(e,Ln).distanceTo(e)}containsPoint(e){return Ln.copy(e).applyMatrix4(this.inverseTransform),this.box.containsPoint(Ln)}intersectsRay(e){return ll.copy(e).applyMatrix4(this.inverseTransform),ll.intersectsBox(this.box)}intersectRay(e,t){return ll.copy(e).applyMatrix4(this.inverseTransform),ll.intersectBox(this.box,t)?(t.applyMatrix4(this.transform),t):null}update(){let{points:e,inverseTransform:t,transform:n,box:a}=this;t.copy(n).invert();let{min:r,max:o}=a,s=0;for(let l=-1;l<=1;l+=2)for(let i=-1;i<=1;i+=2)for(let c=-1;c<=1;c+=2)e[s].set(l<0?r.x:o.x,i<0?r.y:o.y,c<0?r.z:o.z).applyMatrix4(n),s++;this.updatePlanes()}updatePlanes(){il.copy(this.box.min).applyMatrix4(this.transform),sl.copy(this.box.max).applyMatrix4(this.transform),Ln.set(0,0,1).transformDirection(this.transform),this.planes[0].setFromNormalAndCoplanarPoint(Ln,il),this.planes[1].setFromNormalAndCoplanarPoint(Ln,sl).negate(),Ln.set(0,1,0).transformDirection(this.transform),this.planes[2].setFromNormalAndCoplanarPoint(Ln,il),this.planes[3].setFromNormalAndCoplanarPoint(Ln,sl).negate(),Ln.set(1,0,0).transformDirection(this.transform),this.planes[4].setFromNormalAndCoplanarPoint(Ln,il),this.planes[5].setFromNormalAndCoplanarPoint(Ln,sl).negate()}intersectsSphere(e){return this.clampPoint(e.center,Ln),Ln.distanceToSquared(e.center)<=e.radius*e.radius}intersectsFrustum(e){return this._intersectsPlaneShape(e.planes,e.points)}intersectsOBB(e){return this._intersectsPlaneShape(e.planes,e.points)}_intersectsPlaneShape(e,t){let n=this.points,a=this.planes;for(let r=0;r<6;r++){let o=e[r],s=-1/0;for(let l=0;l<8;l++){let i=n[l],c=o.distanceToPoint(i);s=s<c?c:s}if(s<0)return!1}for(let r=0;r<6;r++){let o=a[r],s=-1/0;for(let l=0;l<8;l++){let i=t[l],c=o.distanceToPoint(i);s=s<c?c:s}if(s<0)return!1}return!0}},Ri=Math.PI,md=Ri/2,Pi=new Pe,Bo=new Pe,pr=new Pe,fe=new Pe,wn=new rn,Vw=new zb,Ob=new rn;function Jr(e,t){t.radius=Math.max(t.radius,e.distanceToSquared(t.center))}function Eb(e){return e.x!==e.y}var Hb=class extends Sd{constructor(e=1,t=1,n=1,a=-md,r=md,o=0,s=2*Ri,l=0,i=0){super(e,t,n),this.latStart=a,this.latEnd=r,this.lonStart=o,this.lonEnd=s,this.heightStart=l,this.heightEnd=i}getBoundingBox(e,t){Eb(this.radius)&&console.warn("EllipsoidRegion: Triaxial ellipsoids are not supported.");let{latStart:n,latEnd:a,lonStart:r,lonEnd:o,heightStart:s,heightEnd:l}=this,i=(n+a)*.5,c=(r+o)*.5,d=n>0,u=a<0,b;b=d?n:u?a:0;let{min:g,max:h}=e;g.setScalar(1/0),h.setScalar(-1/0),o-r<=Ri?(this.getCartographicToNormal(i,c,pr),Bo.set(0,0,1),Pi.crossVectors(Bo,pr).normalize(),Bo.crossVectors(pr,Pi).normalize(),t.makeBasis(Pi,Bo,pr),wn.copy(t).invert(),this.getCartographicToPosition(b,r,l,fe).applyMatrix4(wn),h.x=Math.abs(fe.x),g.x=-h.x,this.getCartographicToPosition(a,r,l,fe).applyMatrix4(wn),h.y=fe.y,this.getCartographicToPosition(a,c,l,fe).applyMatrix4(wn),h.y=Math.max(fe.y,h.y),this.getCartographicToPosition(n,r,l,fe).applyMatrix4(wn),g.y=fe.y,this.getCartographicToPosition(n,c,l,fe).applyMatrix4(wn),g.y=Math.min(fe.y,g.y),this.getCartographicToPosition(i,c,l,fe).applyMatrix4(wn),h.z=fe.z,this.getCartographicToPosition(n,r,s,fe).applyMatrix4(wn),g.z=fe.z,this.getCartographicToPosition(a,r,s,fe).applyMatrix4(wn),g.z=Math.min(fe.z,g.z)):(this.getCartographicToPosition(b,c,l,pr),pr.z=0,pr.length()<1e-10?pr.set(1,0,0):pr.normalize(),Bo.set(0,0,1),Pi.crossVectors(pr,Bo).normalize(),t.makeBasis(Pi,Bo,pr),wn.copy(t).invert(),this.getCartographicToPosition(b,c+md,l,fe).applyMatrix4(wn),h.x=Math.abs(fe.x),g.x=-h.x,this.getCartographicToPosition(a,0,u?s:l,fe).applyMatrix4(wn),h.y=fe.y,this.getCartographicToPosition(n,0,d?s:l,fe).applyMatrix4(wn),g.y=fe.y,this.getCartographicToPosition(b,c,l,fe).applyMatrix4(wn),h.z=fe.z,this.getCartographicToPosition(b,o,l,fe).applyMatrix4(wn),g.z=fe.z),e.getCenter(fe),e.min.sub(fe).multiplyScalar(1.0000000000001),e.max.sub(fe).multiplyScalar(1.0000000000001),fe.applyMatrix4(t),t.setPosition(fe)}getBoundingSphere(e){Eb(this.radius)&&console.warn("EllipsoidRegion: Triaxial ellipsoids are not supported."),this.getBoundingBox(Vw,Ob),e.center.setFromMatrixPosition(Ob),e.radius=0;let{latStart:t,latEnd:n,lonStart:a,lonEnd:r,heightStart:o,heightEnd:s}=this,l=(t+n)*.5,i=(a+r)*.5,c=t>0,d=n<0,u;u=c?t:d?n:0,this.getCartographicToPosition(u,a,s,fe),Jr(fe,e),this.getCartographicToPosition(n,a,s,fe),Jr(fe,e),this.getCartographicToPosition(n,i,s,fe),Jr(fe,e),this.getCartographicToPosition(t,a,s,fe),Jr(fe,e),this.getCartographicToPosition(t,i,s,fe),Jr(fe,e),this.getCartographicToPosition(l,i,s,fe),Jr(fe,e),this.getCartographicToPosition(t,a,o,fe),Jr(fe,e),r-a>Ri&&(this.getCartographicToPosition(u,i+Ri,s,fe),Jr(fe,e)),e.radius=Math.sqrt(e.radius)*1.0000000000001}},Dr=new Pe,Nr=new Pe,_r=new Pe,Lb=new Pe,Db=new Pe,Uw=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,a=this.obb||this.regionObb,r=-1/0,o=-1/0;n&&e.intersectSphere(n,Lb)&&(r=n.containsPoint(e.origin)?0:e.origin.distanceToSquared(Lb)),a&&a.intersectRay(e,Db)&&(o=a.containsPoint(e.origin)?0:e.origin.distanceToSquared(Db));let s=Math.max(r,o);return s===-1/0?null:(e.at(Math.sqrt(s),t),t)}distanceToPoint(e){let t=this.sphere,n=this.obb||this.regionObb,a=-1/0,r=-1/0;return t&&(a=Math.max(t.distanceToPoint(e),0)),n&&(r=n.distanceToPoint(e)),a>r?a: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 gd;Dr.set(e[3],e[4],e[5]),Nr.set(e[6],e[7],e[8]),_r.set(e[9],e[10],e[11]);let a=Dr.length(),r=Nr.length(),o=_r.length();Dr.normalize(),Nr.normalize(),_r.normalize(),a===0&&Dr.crossVectors(Nr,_r),r===0&&Nr.crossVectors(Dr,_r),o===0&&_r.crossVectors(Dr,Nr),n.transform.set(Dr.x,Nr.x,_r.x,e[0],Dr.y,Nr.y,_r.y,e[1],Dr.z,Nr.z,_r.z,e[2],0,0,0,1).premultiply(t),n.box.min.set(-a,-r,-o),n.box.max.set(a,r,o),n.update(),this.obb=n}setSphereData(e,t,n,a,r){let o=new Fb;o.center.set(e,t,n),o.radius=a,o.applyMatrix4(r),this.sphere=o}setRegionData(e,t,n,a,r,o,s){let l=new Hb(...e.radius,n,r,t,a,o,s),i=new gd;l.getBoundingBox(i.box,i.transform),i.update(),this.region=l,this.regionObb=i}},Hw=new Mw;function Gw(e,t,n,a){let r=Hw.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 a.set(-e.constant,-t.constant,-n.constant),a.applyMatrix3(r.invert()),a}var Ww=class extends ww{constructor(){super(),this.points=Array(8).fill().map(()=>new Pe)}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,a)=>{Gw(n[0],n[1],n[2],t[a])})}};var fd=0;function Nb(e,t,n,a){try{return Aw.getByteLength(e,t,n,a)}catch{return fd}}function $w(e){if(!e)return 0;if(e.isExternalTexture)return e.userData?.byteLength??fd;let{format:t,type:n,image:a,mipmaps:r}=e;if(e.isCompressedTexture&&Array.isArray(r)&&r.length>0){let s=0;for(let l of r)l?.data?.byteLength?s+=l.data.byteLength:s+=Nb(l.width,l.height,t,n);return s}if(!a)return fd;let o=Nb(a.width,a.height,t,n);return o*=e.generateMipmaps?4/3:1,o}function Xw(e){let t=new Set,n=0;return e.traverse(a=>{if(a.geometry&&!t.has(a.geometry)&&(n+=Bw(a.geometry),t.add(a.geometry)),a.material){let r=a.material;for(let o in r){let s=r[o];s&&s.isTexture&&!t.has(s)&&(n+=$w(s),t.add(s))}}}),n}var Gb=Symbol("INITIAL_FRUSTUM_CULLED"),cl=new rn,Ti=new Pe,bd=new vd,Kw=new Pe(1,0,0),Yw=new Pe(0,1,0),Jw=()=>null;function _b(e,t){e.traverse(n=>{n.frustumCulled=n[Gb]&&t})}var kd=class extends gb{get autoDisableRendererCulling(){return this._autoDisableRendererCulling}set autoDisableRendererCulling(e){this._autoDisableRendererCulling!==e&&(super._autoDisableRendererCulling=e,this.forEachLoadedModel(t=>{_b(t,!e)}))}constructor(...e){super(...e),this.accelerateRaycast=!0,this.group=new zw(this),this.ellipsoid=Ai.clone(),this.cameras=[],this.cameraMap=new Map,this.cameraInfo=[],this._upRotationMatrix=new rn,this._bytesUsed=new WeakMap,this._autoDisableRendererCulling=!0,this.manager=new Sw,this._listeners={}}addEventListener(e,t){tl.prototype.addEventListener.call(this,e,t)}hasEventListener(e,t){return tl.prototype.hasEventListener.call(this,e,t)}removeEventListener(e,t){tl.prototype.removeEventListener.call(this,e,t)}dispatchEvent(e){tl.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)Ub(this,this.root,e,t);else{let n=e.firstHitOnly?[]:t;for(let a of this.activeTiles){let{scene:r}=a.engineData;this.invokeOnePlugin(o=>o.raycastTile&&o.raycastTile(a,r,e,n))||e.intersectObject(r,!0,n)}e.firstHitOnly&&n.length>0&&(n.sort((a,r)=>a.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 vd),t.push(e),this.dispatchEvent({type:"add-camera",camera:e}),!0)}setResolution(e,t,n){let a=this.cameraMap;if(!a.has(e))return!1;let r=t.isVector2?t.x:t,o=t.isVector2?t.y:n,s=a.get(e);return(s.width!==r||s.height!==o)&&(s.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(bd),this.setResolution(e,bd.x,bd.y)}deleteCamera(e){let t=this.cameras,n=this.cameraMap;if(n.has(e)){let a=t.indexOf(e);return t.splice(a,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:a={}}=t;switch((n&&n.gltfUpAxis||"y").toLowerCase()){case"x":this._upRotationMatrix.makeRotationAxis(Yw,-Math.PI/2);break;case"y":this._upRotationMatrix.makeRotationAxis(Kw,Math.PI/2);break}if("3DTILES_ellipsoid"in a){let r=a["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,a=this.cameraInfo;for(;a.length>t.length;)a.pop();for(;a.length<t.length;)a.push({frustum:new Ww,isOrthographic:!1,sseDenominator:-1,position:new Pe,invScale:-1,pixelSize:0});Ti.setFromMatrixScale(e.matrixWorldInverse),Math.abs(Math.max(Ti.x-Ti.y,Ti.x-Ti.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=a.length;r<o;r++){let s=t[r],l=a[r],i=l.frustum,c=l.position,d=n.get(s);(d.width===0||d.height===0)&&console.warn("TilesRenderer: resolution for camera error calculation is not set.");let u=s.projectionMatrix.elements;if(l.isOrthographic=u[15]===1,l.isOrthographic){let b=2/u[0],g=2/u[5];l.pixelSize=Math.max(g/d.height,b/d.width)}else l.sseDenominator=2/u[5]/d.height;cl.copy(e.matrixWorld),cl.premultiply(s.matrixWorldInverse),cl.premultiply(s.projectionMatrix),i.setFromProjectionMatrix(cl,s.coordinateSystem,s.reversedDepth),c.set(0,0,0),c.applyMatrix4(s.matrixWorld),c.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 a=new rn;if(e.transform){let s=e.transform;for(let l=0;l<16;l++)a.elements[l]=s[l]}n&&a.premultiply(n.engineData.transform);let r=new rn().copy(a).invert(),o=new Uw;"sphere"in e.boundingVolume&&o.setSphereData(...e.boundingVolume.sphere,a),"box"in e.boundingVolume&&o.setObbData(e.boundingVolume.box,a),"region"in e.boundingVolume&&o.setRegionData(this.ellipsoid,...e.boundingVolume.region),e.engineData.transform=a,e.engineData.transformInverse=r,e.engineData.boundingVolume=o,e.engineData.geometry=null,e.engineData.materials=null,e.engineData.textures=null,e.toJSON=Jw}async parseTile(e,t,n,a,r){let o=t.engineData,s=Zs(a),l=this.fetchOptions,i=this.manager,c=null,d=o.transform,u=this._upRotationMatrix,b=(Ro(e)||n).toLowerCase();switch(b){case"b3dm":{let m=new wd(i);m.workingPath=s,m.fetchOptions=l,m.adjustmentTransform.copy(u),c=m.parse(e);break}case"pnts":{let m=new Cd(i);m.workingPath=s,m.fetchOptions=l,c=m.parse(e);break}case"i3dm":{let m=new Md(i);m.workingPath=s,m.fetchOptions=l,m.adjustmentTransform.copy(u),m.ellipsoid.copy(this.ellipsoid),c=m.parse(e);break}case"cmpt":{let m=new Vb(i);m.workingPath=s,m.fetchOptions=l,m.adjustmentTransform.copy(u),m.ellipsoid.copy(this.ellipsoid),c=m.parse(e).then(S=>S.scene);break}case"gltf":case"glb":{let m=i.getHandler("path.gltf")||i.getHandler("path.glb")||new yd(i);m.setWithCredentials(l.credentials==="include"),m.setRequestHeader(l.headers||{}),l.credentials==="include"&&l.mode==="cors"&&m.setCrossOrigin("use-credentials");let S=m.resourcePath||m.path||s;!/[\\/]$/.test(S)&&S.length&&(S+="/"),c=m.parseAsync(e,S).then(M=>{M.scene=M.scene||new hd;let{scene:k}=M;return k.updateMatrix(),k.matrix.multiply(u).decompose(k.position,k.quaternion,k.scale),M});break}default:c=this.invokeOnePlugin(m=>m.parseToMesh&&m.parseToMesh(e,t,n,a,r));break}let g=await c;if(g===null)throw Error(`TilesRenderer: Content type "${b}" not supported.`);let h,w;g.isObject3D?(h=g,w=null):(h=g.scene,w=g),h.updateMatrix(),h.matrix.premultiply(d),h.matrix.decompose(h.position,h.quaternion,h.scale),await this.invokeAllPlugins(m=>m.processTileModel&&m.processTileModel(h,t)),h.traverse(m=>{m[Gb]=m.frustumCulled,m.userData.tile=t}),_b(h,!this.autoDisableRendererCulling);let B=[],v=[],p=[];if(h.traverse(m=>{if(m.geometry&&v.push(m.geometry),m.material){let S=m.material;B.push(m.material);for(let M in S){let k=S[M];k&&k.isTexture&&p.push(k)}}}),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=B,o.geometry=v,o.textures=p,o.scene=h,o.metadata=w}disposeTile(e){super.disposeTile(e);let t=e.engineData;if(t.scene){let n=t.materials,a=t.geometry,r=t.textures,o=t.scene.parent;t.scene.traverse(s=>{s.userData.meshFeatures&&s.userData.meshFeatures.dispose(),s.userData.structuralMetadata&&s.userData.structuralMetadata.dispose()});for(let s=0,l=a.length;s<l;s++)a[s].dispose();for(let s=0,l=n.length;s<l;s++)n[s].dispose();for(let s=0,l=r.length;s<l;s++){let i=r[s];i.image instanceof ImageBitmap&&i.image.close(),i.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:a,group:r}=this;n&&(t?r.add(n):(r.remove(n),a.has(e)&&(n.parent=r))),super.setTileVisible(e,t)}calculateBytesUsed(e,t){let n=this._bytesUsed;return!n.has(e)&&t&&n.set(e,Xw(t)),n.get(e)??null}calculateTileViewError(e,t){let n=e.engineData,a=this.cameras,r=this.cameraInfo,o=n.boundingVolume,s=!1,l=0,i=1/0,c=0,d=1/0;for(let u=0,b=a.length;u<b;u++){let g=r[u],h,w;if(g.isOrthographic){let v=g.pixelSize;h=e.geometricError/v,w=1/0}else{let v=g.sseDenominator;w=o.distanceToPoint(g.position),h=w===0?1/0:e.geometricError/(w*v)}let B=r[u].frustum;o.intersectsFrustum(B)&&(s=!0,l=Math.max(l,h),i=Math.min(i,w)),c=Math.max(c,h),d=Math.min(d,w)}s?(t.inView=!0,t.error=l,t.distanceFromCamera=i):(t.inView=!1,t.error=c,t.distanceFromCamera=d)}dispose(){super.dispose(),this.group.removeFromParent()}};import{jsx as n1}from"react/jsx-runtime";function Pd({url:e,rotation:t=[0,0,0],errorTarget:n=8,cacheSize:a=800,onModelLoaded:r,onLoadError:o}){let{camera:s,gl:l,invalidate:i}=t1(),c=Qw(!1),d=Zw(()=>{let u=new kd(e);return u.errorTarget=n,u.lruCache.maxSize=a,u},[a,n,e]);return qw(()=>{c.current=!1;let u=()=>i(),b=()=>{c.current||(c.current=!0,r?.(d.group),i())},g=h=>{o?.(h.error)};return d.setCamera(s),d.setResolutionFromRenderer(s,l),d.addEventListener("needs-update",u),d.addEventListener("load-model",b),d.addEventListener("load-error",g),()=>{d.removeEventListener("needs-update",u),d.removeEventListener("load-model",b),d.removeEventListener("load-error",g),d.deleteCamera(s),d.dispose()}},[s,l,i,o,r,d]),e1(()=>{d.setResolutionFromRenderer(s,l),d.update()}),n1("primitive",{object:d.group,rotation:t})}import{useMemo as Oo,useRef as qr,useState as Ma,useEffect as Sa,useCallback as Ca}from"react";import{Html as Wb}from"@react-three/drei";import{useFrame as $b,useThree as Rd}from"@react-three/fiber";import{MathUtils as Td,Vector3 as Bi}from"three";import{jsx as ur,jsxs as Ad}from"react/jsx-runtime";var r1=.02;function Xb(e,t){let n=qr(null),a=Rd(c=>c.scene),r=qr(null),o=Oo(()=>new Bi(...e.anchorLocalPosition??e.localPosition??e.worldPosition),[e.anchorLocalPosition,e.localPosition,e.worldPosition]),s=Oo(()=>new Bi,[]),l=Oo(()=>new Bi,[]),i=Oo(()=>new Bi,[]);return Sa(()=>{r.current=null},[e.anchorNodeName]),$b(({camera:c})=>{let d=n.current,u=d?.parent;if(!d||!u)return;let b=r.current;if(e.anchorNodeName&&(!b||!b.parent)&&(b=dr(a,e.anchorNodeName),r.current=b),b?(b.updateWorldMatrix(!0,!1),s.copy(o).applyMatrix4(b.matrixWorld)):(s.copy(o),u.localToWorld(s)),t){let g=t.current.get(e.id);g||(g=new Bi,t.current.set(e.id,g)),g.copy(s)}i.copy(c.position).sub(s),i.lengthSq()>0?(i.normalize(),l.copy(s).addScaledVector(i,r1)):l.copy(s),u.worldToLocal(l),d.position.copy(l)}),n}function o1({annotation:e,occluders:t,worldPositionsRef:n,onClick:a,onHover:r,showAnnotationOnHover:o}){let[s,l]=Ma(!1),i=Xb(e,n),[c,d]=Ma(!1),[u,b]=Ma(1),g=qr(null),h=qr(null),w=qr(null);Sa(()=>()=>{g.current&&(clearTimeout(g.current),g.current=null),w.current&&(clearTimeout(w.current),w.current=null)},[]);let B=M=>{M.stopPropagation(),M.preventDefault(),g.current&&(clearTimeout(g.current),g.current=null),g.current=window.setTimeout(()=>{a?.(e),g.current=null},10)},v=M=>{M.stopPropagation(),d(!0),b(100),w.current&&(clearTimeout(w.current),w.current=null),r?.(e),o&&a?.(e)},p=M=>{M.stopPropagation(),d(!1),b(1),w.current&&clearTimeout(w.current),w.current=window.setTimeout(()=>{r?.(null),o&&r?.(null),w.current=null},50)},m=M=>{M.stopPropagation();let k=M.currentTarget;k.dataset.pointerX=String(M.clientX),k.dataset.pointerY=String(M.clientY)},S=M=>{M.stopPropagation();let k=M.currentTarget,R=parseFloat(k.dataset.pointerX||"0"),f=parseFloat(k.dataset.pointerY||"0"),C=M.clientX-R,x=M.clientY-f;Math.sqrt(C*C+x*x)<10&&B(M)};return ur("group",{ref:i,children:ur(Wb,{center:!0,occlude:t,onOcclude:l,pointerEvents:s?"none":"auto",zIndexRange:[1,200],style:{pointerEvents:s?"none":"auto",zIndex:u},className:"annotation-html-wrapper",transparent:!0,children:ur("div",{ref:h,className:`ri-annotationMarker ${c?"ri-annotationMarker--hovered":""}`,title:e.title,style:{display:s?"none":"flex"},onPointerDown:m,onPointerUp:S,onPointerEnter:v,onPointerLeave:p,onDoubleClick:M=>{M.stopPropagation(),a?.(e)},role:"button",tabIndex:0,"aria-label":`Annotation ${e.id}`,children:ur("span",{className:"ri-annotationMarker-id",children:e.id})})})})}function a1({annotation:e,occluders:t,popupRef:n,onClose:a,hideCloseButton:r=!1}){let[o,s]=Ma(!1),l=Xb(e),i=Ad("div",{ref:n,className:"ri-viewAnnotationPopup",style:{display:o?"none":"block"},onPointerDown:c=>c.stopPropagation(),onClick:c=>c.stopPropagation(),children:[Ad("div",{className:"ri-viewAnnotationHeader",children:[ur("h4",{className:"ri-viewAnnotationTitle",children:e.title}),!r&&ur("button",{onClick:c=>{c.stopPropagation(),a?.()},className:"ri-viewAnnotationClose","aria-label":"Close annotation",children:"\xD7"})]}),e.description&&ur("p",{className:"ri-viewAnnotationDescription",children:e.description})]});return ur("group",{ref:l,children:ur(Wb,{occlude:t,onOcclude:s,pointerEvents:o?"none":"auto",zIndexRange:[1e3,2e3],style:{pointerEvents:o?"none":"auto",zIndex:1e3},transparent:!0,children:i})})}function Bd({annotations:e,sceneConfig:t,activeAnnotation:n,popupRef:a,canvasRootRef:r,worldPositionsRef:o,modelLoaded:s,onAnnotationClick:l,onAnnotationHover:i,onCloseAnnotation:c,hideCloseButton:d=!1,showAnnotationOnHover:u=!1}){let b=Rd(T=>T.invalidate),g=Rd(T=>T.scene),[h,w]=Ma(null),[B,v]=Ma(!1),p=qr(null),m=qr(null),S=qr(null),M=Oo(()=>{let T=[];return g.traverse(I=>{let F=I;F.isMesh&&!F.isSkinnedMesh&&T.push({current:I})}),T},[g,e,s]),k=Ca(()=>{b();let T=()=>{b(),m.current=window.requestAnimationFrame(()=>{b(),m.current=null})};m.current=window.requestAnimationFrame(T)},[b]);Sa(()=>{k()},[e,k]),Sa(()=>{k()},[n,k]),Sa(()=>()=>{m.current!==null&&window.cancelAnimationFrame(m.current),S.current&&clearTimeout(S.current)},[]);let R=B?h:n||h,f=Oo(()=>R?e.find(T=>T.id===R.id)??R:null,[R,e]),C=Ca(T=>{if(B&&h?.id===T.id){v(!1),w(null),c?.();return}v(!0),w(T),l?.(T)},[B,h,l,c]),x=Ca(T=>{i?.(T),u&&!B&&(S.current&&(clearTimeout(S.current),S.current=null),T?w(T):S.current=window.setTimeout(()=>{w(null),c?.(),S.current=null},100))},[B,i,u,c]),P=Ca(()=>{v(!1),w(null),c?.()},[c]),z=Ca(T=>{let I=T.target;if(I.closest?.(".ri-annotationMarker")||I.closest?.(".ri-viewAnnotationPopup")||I.closest?.(".annotation-html-wrapper"))return;let F=r.current;F&&F.contains(I)&&(v(!1),w(null),c?.())},[r,c]),A=Ca(T=>{T.key==="Escape"&&B&&(v(!1),w(null),c?.())},[B,c]);Sa(()=>{let T=r.current;return T&&(T.addEventListener("click",z),T.addEventListener("pointerdown",z)),document.addEventListener("keydown",A),()=>{T&&(T.removeEventListener("click",z),T.removeEventListener("pointerdown",z)),document.removeEventListener("keydown",A)}},[r,z,A]);let j=Oo(()=>(t?.model.rotation??[0,0,0]).map(T=>T*Math.PI/180),[t?.model.rotation]);return $b((T,I)=>{p.current&&(p.current.rotation.x=Td.lerp(p.current.rotation.x,j[0],1-Math.exp(-5*I)),p.current.rotation.y=Td.lerp(p.current.rotation.y,j[1],1-Math.exp(-5*I)),p.current.rotation.z=Td.lerp(p.current.rotation.z,j[2],1-Math.exp(-5*I)))}),Ad("group",{ref:p,children:[e.map(T=>{let I=`${T.worldPosition.join(",")}-${T.title}-${T.id}`;return ur(o1,{annotation:T,occluders:M,worldPositionsRef:o,onClick:C,onHover:x,showAnnotationOnHover:u},I)}),f?ur(a1,{annotation:f,occluders:M,popupRef:a,onClose:P,hideCloseButton:d},`popup-${f.id}`):null]})}import{useEffect as i1,useMemo as Kb}from"react";import{Html as Jb,Line as s1}from"@react-three/drei";import{BoxGeometry as l1,EdgesGeometry as c1,Vector3 as Yb}from"three";import{jsx as zr,jsxs as ka}from"react/jsx-runtime";var d1="#22d3ee",p1="#facc15";function pl(e,t){let n=e<10?e.toFixed(3):e.toFixed(2);return t?`${n} ${t}`:n}function u1(e,t){return[(e[0]+t[0])/2,(e[1]+t[1])/2,(e[2]+t[2])/2]}function ul({position:e,children:t}){return zr(Jb,{center:!0,position:e,zIndexRange:[20,0],children:zr("div",{className:"ri-measureLabel",children:t})})}function m1({box:e,unit:t}){let n=Kb(()=>[(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]),a=Kb(()=>{let[l,i,c]=e.size;return new c1(new l1(l||1e-4,i||1e-4,c||1e-4))},[e.size]);i1(()=>()=>{a.dispose()},[a]);let[r,o,s]=e.size;return ka("group",{position:n,children:[zr("lineSegments",{geometry:a,children:zr("lineBasicMaterial",{color:p1})}),ka(ul,{position:[0,-o/2,s/2],children:["W ",pl(r,t)]}),ka(ul,{position:[-r/2,0,s/2],children:["H ",pl(o,t)]}),ka(ul,{position:[r/2,-o/2,0],children:["D ",pl(s,t)]})]})}function Od({points:e,unit:t,box:n,showDimensions:a}){return ka("group",{children:[e.map(r=>zr(Jb,{center:!0,position:r.position,zIndexRange:[15,0],children:zr("div",{className:"ri-measureDot"})},r.id)),e.slice(1).map((r,o)=>{let s=e[o].position,l=r.position,i=new Yb(...s).distanceTo(new Yb(...l));return ka("group",{children:[zr(s1,{points:[s,l],color:d1,lineWidth:2}),zr(ul,{position:u1(s,l),children:pl(i,t)})]},`${e[o].id}-${r.id}`)}),a&&n?zr(m1,{box:n,unit:t}):null]})}import{forwardRef as b1,useCallback as Oi,useEffect as qb,useImperativeHandle as g1,useMemo as Zb,useRef as fn}from"react";import{useXR as Qb,useXRHitTest as f1,useXRInputSourceEvent as h1}from"@react-three/xr";import{useFrame as x1}from"@react-three/fiber";import{Matrix4 as v1,Vector3 as eg}from"three";import{Fragment as k1,jsx as Ei,jsxs as og}from"react/jsx-runtime";var y1=1,tg=1,w1=.1,C1=10;function S1(e,t){let[n,a,r]=e.size,o=(e.min[0]+e.max[0])/2,s=(e.min[2]+e.max[2])/2,l=Math.max(n,a,r)||1;return{scale:t==="real-world"?1:y1/l,offset:[-o,-e.min[1],-s]}}function ng(e){let t=e[0].clientX-e[1].clientX,n=e[0].clientY-e[1].clientY;return Math.hypot(t,n)}function rg(e){let t=e[0].clientX-e[1].clientX,n=e[0].clientY-e[1].clientY;return Math.atan2(n,t)}var M1=b1(function({box:t,scaleMode:n,children:a,onARStateChange:r},o){let s=fn(null),l=fn(null),i=fn(null),c=Qb(I=>I.session!=null),d=Qb(I=>I.mode==="immersive-ar"),u=Zb(()=>t?S1(t,n):null,[t,n]),b=fn(new eg(0,0,-tg)),g=fn(1),h=fn(0),w=fn(!0),B=fn(!1),v=Zb(()=>new v1,[]),p=fn(new eg),m=fn(!1),S=fn(null),M=fn(!1),k=fn(0),R=fn(0),f=fn(1),C=fn(0),x=Oi(()=>{if(!r||!d)return;let I={canPlace:m.current,isPlacementMode:w.current,isModelPlaced:B.current},F=S.current;F&&F.canPlace===I.canPlace&&F.isPlacementMode===I.isPlacementMode&&F.isModelPlaced===I.isModelPlaced||(S.current=I,r(I))},[d,r]),P=Oi(()=>!d||!m.current?!1:(b.current.copy(p.current),B.current=!0,w.current=!1,x(),!0),[x,d]),z=Oi(()=>{d&&(w.current=!0,x())},[x,d]),A=Oi(()=>{let I=P();return!I&&d&&(w.current=!1,x()),I},[x,d,P]),j=Oi(()=>{d&&(w.current=!1,x())},[x,d]);g1(o,()=>({placeCurrent:P,startPlacementMode:z,finishPlacementMode:A,cancelPlacementMode:j}),[j,A,P,z]),qb(()=>{if(!c){b.current.set(0,0,-tg),g.current=1,h.current=0,m.current=!1,M.current=!1,w.current=!0,B.current=!1,S.current=null;return}d&&(m.current=!1,M.current=!1,w.current=!0,B.current=!1,S.current=null,x())},[x,c,d]),f1((I,F)=>{if(!d||I.length===0){m.current&&(m.current=!1,x());return}F(v,I[0])&&(p.current.setFromMatrixPosition(v),m.current||(m.current=!0,x()))},"viewer"),h1("all","select",()=>{!d||M.current||!w.current||P()},[d,P]),qb(()=>{if(!d)return;let I=E=>{E.touches.length===2&&(M.current=!0,k.current=ng(E.touches),R.current=rg(E.touches),f.current=g.current,C.current=h.current)},F=E=>{if(!M.current||E.touches.length!==2)return;E.preventDefault();let W=ng(E.touches);if(k.current>0){let ae=W/k.current;g.current=Math.min(C1,Math.max(w1,f.current*ae))}let U=rg(E.touches);h.current=C.current-(U-R.current)},O=E=>{E.touches.length===0&&requestAnimationFrame(()=>{M.current=!1})};return window.addEventListener("touchstart",I),window.addEventListener("touchmove",F,{passive:!1}),window.addEventListener("touchend",O),window.addEventListener("touchcancel",O),()=>{window.removeEventListener("touchstart",I),window.removeEventListener("touchmove",F),window.removeEventListener("touchend",O),window.removeEventListener("touchcancel",O)}},[d]),x1(()=>{let I=s.current,F=l.current;if(!I||!F)return;!c||!u?(I.visible=!0,I.position.set(0,0,0),I.rotation.set(0,0,0),F.scale.setScalar(1)):(I.visible=!d||B.current,I.position.copy(b.current),I.rotation.set(0,h.current,0),F.scale.setScalar(u.scale*g.current));let O=i.current;if(O){let E=d&&w.current&&m.current;O.visible=E,E&&O.position.copy(p.current)}});let T=c&&u?u.offset:[0,0,0];return og(k1,{children:[og("mesh",{ref:i,visible:!1,rotation:[-Math.PI/2,0,0],children:[Ei("ringGeometry",{args:[.05,.07,32]}),Ei("meshBasicMaterial",{color:"#22d3ee",transparent:!0,opacity:.95})]}),Ei("group",{ref:s,children:Ei("group",{ref:l,children:Ei("group",{position:T,children:a})})})]})}),ag=M1;import{useEffect as ml,useMemo as yr,useRef as Zr}from"react";import{useFrame as P1,useThree as T1}from"@react-three/fiber";import{Box3 as R1,CatmullRomCurve3 as ig,Sphere as A1,Spherical as B1,Vector3 as Qr}from"three";var O1=1.2;function Ed({controlsRef:e,sceneRef:t,config:n,playing:a,resetOnPlay:r=!1,onFinished:o,onUserInteract:s,onStop:l}){let i=T1(j=>j.invalidate),c=yr(()=>n.waypoints??[],[n.waypoints]),d=c.length>=2,u=n.loop??!0,b=yr(()=>{if(c.length<2)return 24;let j=0;for(let T=0;T<c.length-1;T++)j+=c[T].segmentDuration??3.5;return u&&c.length>1&&(j+=c[c.length-1].segmentDuration??3.5),Math.max(j,4)},[c,u]),g=n.duration??b,h=yr(()=>c.map(j=>[...j.position,...j.target,j.azimuthAngle??"",j.polarAngle??"",j.segmentDuration??""].join(",")).join(";"),[c]),w=yr(()=>{let j=[];if(c.length<2)return j;let T=0;for(let I=0;I<c.length-1;I++)T+=c[I].segmentDuration??3.5,j.push(T);return u&&c.length>1&&(T+=c[c.length-1].segmentDuration??3.5,j.push(T)),j},[c,u]),B=yr(()=>j=>{if(c.length<2||w.length===0)return j/g;let T=w[w.length-1],I=u?j%g:Math.min(j,g),F=g>0?I/g*T:0;for(let O=0;O<w.length;O++)if(F<=w[O]){let E=O===0?0:w[O-1],W=w[O]-E,U=W>0?(F-E)/W:0,ae=u?c.length:c.length-1,xe=O/ae,le=1/ae;return xe+U*le}return 1},[c.length,w,g,u]),v=yr(()=>d?{position:new ig(c.map(j=>new Qr(...j.position)),u,"catmullrom",.5),target:new ig(c.map(j=>new Qr(...j.target)),u,"catmullrom",.5)}:null,[h,d,u]),p=yr(()=>{if(!d||!c.every(T=>Number.isFinite(T.azimuthAngle)&&Number.isFinite(T.polarAngle)))return null;let j=c.map(T=>({azimuth:T.azimuthAngle,polar:T.polarAngle,distance:new Qr(...T.position).distanceTo(new Qr(...T.target))}));for(let T=1;T<j.length;T+=1){let I=j[T-1].azimuth,F=j[T].azimuth;j[T].azimuth=F+Math.round((I-F)/(Math.PI*2))*Math.PI*2}return j},[h,d]),m=Zr(0),S=Zr(0),M=Zr(new Qr),k=Zr(new Qr),R=Zr(!1),f=Zr(0),C=Zr(!1),x=Zr(null),P=yr(()=>new Qr,[]),z=yr(()=>new Qr,[]),A=yr(()=>new B1,[]);return ml(()=>{m.current=0,f.current=0,S.current=0,C.current=!1},[h,u,g]),ml(()=>{r&&(f.current=0,m.current=0,C.current=!1)},[r]),ml(()=>{if(!a){R.current=!1,m.current>0&&!r?f.current=m.current:r&&(f.current=0),(m.current>0||C.current)&&l?.();return}m.current>=g&&!u&&(m.current=0,f.current=0,C.current=!1);let j=e.current;if(j&&(j.getPosition(M.current),j.getTarget(k.current)),r||C.current||f.current===0?(m.current=0,f.current=0,C.current=!1):f.current>0&&f.current<g?m.current=f.current:(m.current=0,f.current=0),S.current=0,!d){let T=t.current;if(T){let I=new R1().setFromObject(T).getBoundingSphere(new A1);x.current={center:I.center.clone(),radius:I.radius>0?I.radius:1}}}R.current=!0,i()},[a,d,e,t,i,g,u,h,r,l]),ml(()=>{if(!a||!s)return;let j=e.current;if(!j)return;let T=()=>{C.current||s()};return j.addEventListener("controlstart",T),()=>j.removeEventListener("controlstart",T)},[a,e,s]),P1((j,T)=>{if(!a||!R.current)return;let I=e.current;if(!I)return;m.current+=T,S.current+=T;let F=B(m.current),O=!u&&m.current>=g;if(F=u?F%1:Math.min(F,1),v)if(v.target.getPoint(F,z),p){let W=u?p.length:p.length-1,U=Math.min(F,1)*W,ae=Math.min(Math.floor(U),W-1),xe=(ae+1)%p.length,le=F>=1?1:U-ae,be=le*le*(3-2*le),he=p[ae],Se=p[xe],it=Se.azimuth+Math.round((he.azimuth-Se.azimuth)/(Math.PI*2))*Math.PI*2,wt=he.azimuth+(it-he.azimuth)*be,Xe=he.polar+(Se.polar-he.polar)*be,Me=he.distance+(Se.distance-he.distance)*be;A.set(Math.max(Me,1e-6),Math.min(Math.max(Xe,1e-6),Math.PI-1e-6),wt),P.setFromSpherical(A).add(z)}else v.position.getPoint(F,P);else{let W=x.current;if(!W)return;let U=F*Math.PI*2,ae=W.radius*2.2;P.set(W.center.x+Math.cos(U)*ae,W.center.y+W.radius*.6,W.center.z+Math.sin(U)*ae),z.copy(W.center)}let E=Math.min(S.current/O1,1);if(E<1){let W=E*E*(3-2*E);P.lerpVectors(M.current,P,W),z.lerpVectors(k.current,z,W)}if(I.setLookAt(P.x,P.y,P.z,z.x,z.y,z.z,!1),O){R.current=!1,C.current=!0,m.current=0,f.current=0,o?.();return}i()}),null}import{useEffect as _1,useState as z1}from"react";var E1="ri:license-grant:v1",L1={"260cd89ea13f":"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEwjr3ofKTkkcxOM0GYl/RlJj9JsuyjSF8sYmCd2YqsHJCEO8EvlNDrO2Kl4agFKo6dRhyR2/oWeiU6P9WIqRbvw=="},sg=new Map;function cg(e){let t=atob(e);return Uint8Array.from(t,n=>n.charCodeAt(0)).buffer}function lg(e){let t=e.replace(/-/g,"+").replace(/_/g,"/");return cg(t.padEnd(Math.ceil(t.length/4)*4,"="))}function D1(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 bl(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 Ld(e,t){return`${E1}:${t}:${e}`}function N1(e,t){let n=sg.get(e);if(n)return n;let a=crypto.subtle.importKey("spki",cg(t),{name:"ECDSA",namedCurve:"P-256"},!1,["verify"]);return sg.set(e,a),a}async function Dd(e,t,n){if(!globalThis.crypto?.subtle)return null;try{let[a,r,o,s,...l]=e.split("."),i=L1[r];if(a!=="ri1"||!i||!o||!s||l.length>0)return null;let c=JSON.parse(new TextDecoder().decode(lg(o)));if(!D1(c)||!await crypto.subtle.verify({name:"ECDSA",hash:"SHA-256"},await N1(r,i),lg(s),new TextEncoder().encode(`${a}.${r}.${o}`)))return null;let u=Math.floor(Date.now()/1e3),b=c.expiresAt-c.issuedAt;return c.licenseKeyHash!==t||c.domain!==n||c.expiresAt<=u||c.issuedAt>u+300||b<=0||b>43200?null:{environment:c.environment,tier:c.tier,expiresAt:c.expiresAt}}catch{return null}}async function dg(e,t,n){try{return await Dd(e,await bl(t),n)}catch{return null}}async function pg(e,t,n){try{let a=await bl(t);return await Dd(e,a,n)?(localStorage.setItem(Ld(a,n),e),!0):!1}catch{return!1}}async function ug(e,t){try{let n=await bl(e),a=Ld(n,t),r=localStorage.getItem(a);if(!r)return null;let o=await Dd(r,n,t);return o||localStorage.removeItem(a),o}catch{return null}}async function Nd(e,t){try{let n=await bl(e);localStorage.removeItem(Ld(n,t))}catch{}}var j1=["localhost","127.0.0.1","0.0.0.0"],I1=e=>j1.includes(e)||e.endsWith(".local")||e.endsWith(".localhost"),bg="https://react-immersive.liveroom.dev/api/validate-license",F1=()=>typeof window<"u",V1=300*1e3,U1=5e3,H1=400,zd=new Map,_d=new Map,eo=class extends Error{},gg=async(e,t,n)=>{let a=await ug(e,t);return a?(console.warn("[react-immersive] License server unreachable \u2014 using a previously verified, time-limited offline grant."),{status:"valid",reason:"Previously verified offline grant",environment:a.environment,tier:a.tier,isLocalDomain:n}):null},mg=async(e,t,n)=>{let a=await gg(e,t,n);return a||(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})},G1=e=>e instanceof eo||e instanceof TypeError,W1=()=>new Promise(e=>setTimeout(e,H1)),$1=e=>e==="development"||e==="production",X1=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&&!$1(t.environment)||t.tier!==void 0&&typeof t.tier!="string"||t.offlineGrant!==void 0&&typeof t.offlineGrant!="string")},K1=e=>{if(!e||typeof e!="object")return null;let t=e,n=t.reason??t.error;return typeof n=="string"&&n.trim()?n:null},Y1=(e,t,n)=>`${n}::${e}::${t}`,J1=e=>{let t=zd.get(e);return t?Date.now()-t.timestamp>V1?(zd.delete(e),null):t.result:null},q1=(e,t)=>({status:e.valid?"valid":"invalid",reason:e.reason,environment:e.environment,tier:e.tier,isLocalDomain:t}),Z1=(e,t)=>({status:"invalid",reason:e,isLocalDomain:t});async function Q1(e,t,n,a){let r=Y1(e,t,a),o=J1(r);if(o)return o;let s=_d.get(r);if(s)return s;let l=(async()=>{for(let i=0;i<2;i+=1)try{return await eC(e,t,n,r,a)}catch(c){if(!G1(c))throw c;if(i===0){let d=await gg(e,t,n);if(d)return d;await W1();continue}return mg(e,t,n)}return mg(e,t,n)})().finally(()=>{_d.delete(r)});return _d.set(r,l),l}async function eC(e,t,n,a,r){let o=new AbortController,s=setTimeout(()=>o.abort(),U1),l;try{l=await fetch(r,{method:"POST",headers:{"Content-Type":"application/json"},cache:"no-store",signal:o.signal,body:JSON.stringify({licenseKey:e,domain:t})})}catch(d){throw o.signal.aborted?new eo("License validation timed out"):d}finally{clearTimeout(s)}let i;try{i=await l.json()}catch{throw new eo(`License server returned a non-JSON response${l.status?` (${l.status})`:""}`)}if(!l.ok){if(l.status===429||l.status>=500)throw new eo(`License server error (${l.status})`);let d=K1(i)??`License validation failed${l.status?` (${l.status})`:""}`;return await Nd(e,t),Z1(d,n)}if(!X1(i))throw new eo("License server returned an unexpected payload");let c=q1(i,n);if(c.status==="valid"&&r!==bg){let d=i.offlineGrant?await dg(i.offlineGrant,e,t):null;if(!d)throw new eo("License validation endpoint did not return a verifiable signed grant");c={...c,environment:d.environment,tier:d.tier}}return c.status==="valid"?(zd.set(a,{result:c,timestamp:Date.now()}),i.offlineGrant&&(await pg(i.offlineGrant,e,t)||console.warn("[react-immersive] The license server returned an invalid offline grant; it was not cached."))):await Nd(e,t),c}var gl=(e,t=bg)=>{let[n,a]=z1({status:"checking",isLocalDomain:!1});return _1(()=>{if(!F1())return;let r=!1,o=d=>{r||a(d)},s=e.trim(),l=window.location.hostname.toLowerCase(),i=I1(l);return o({status:"checking",isLocalDomain:i}),s?((async()=>{try{o(await Q1(s,l,i,t))}catch(d){let u=d instanceof TypeError?"Could not reach license server":d instanceof Error?d.message:"License validation failed";o({status:"invalid",reason:u,isLocalDomain:i})}})(),()=>{r=!0}):(o({status:"invalid",reason:"No license key provided",isLocalDomain:i}),()=>{r=!0})},[e,t]),n};import{useRef as Eo,useState as tC,useCallback as wr,useEffect as nC}from"react";import{jsx as Fn,jsxs as jd}from"react/jsx-runtime";var rC={up:{width:38,height:22},down:{width:38,height:22},left:{width:22,height:38},right:{width:22,height:38}},oC={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"},fl=({direction:e})=>{let t=rC[e],n=oC[e];return jd("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:[Fn("polyline",{points:n,stroke:"rgba(0, 0, 0, 0.9)",strokeWidth:"6",strokeLinecap:"round",strokeLinejoin:"round"}),Fn("polyline",{points:n,stroke:"#2095F2",strokeWidth:"4",strokeLinecap:"round",strokeLinejoin:"round"})]})},jr=16,aC={"bottom-left":{bottom:jr,left:jr,top:"auto",right:"auto",transform:"none"},"bottom-right":{bottom:jr,right:jr,top:"auto",left:"auto",transform:"none"},"top-left":{top:jr,left:jr,bottom:"auto",right:"auto",transform:"none"},"top-right":{top:jr,right:jr,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:jr,left:"50%",bottom:"auto",right:"auto",transform:"translateX(-50%)"}},iC=({controlsRef:e,enabled:t=!0,opacity:n=.9,moveSensitivity:a=.001,rotateSensitivity:r=.01,position:o="center-bottom"})=>{let s=Eo(null),[l,i]=tC({x:0,y:0}),c=Eo(!1),d=Eo({x:0,y:0}),u=Eo(),b=Eo(),g=Eo(null),h=Eo(0),w=()=>e.current,B=(A,j,T)=>{let I=Math.hypot(A,j);if(I>T){let F=T/I;return{x:A*F,y:j*F}}return{x:A,y:j}},v=A=>{let T=Math.abs(A);return T<.12?0:Math.sign(A)*((T-.12)/(1-.12))},p=wr(()=>{let A=()=>{let{x:j,y:T}=d.current,I=v(j),F=v(T);if(t&&(I!==0||F!==0)){let O=w();O&&O.rotate(-I*r,-F*r,!0)}u.current=requestAnimationFrame(A)};u.current=requestAnimationFrame(A)},[t,r]),m=wr(()=>{u.current&&cancelAnimationFrame(u.current)},[]),S=wr((A,j)=>{if(!s.current||!c.current)return;let T=s.current.getBoundingClientRect(),I=T.left+T.width/2,F=T.top+T.height/2,O=T.width/2-18,E=A-I,W=j-F,U=B(E,W,O);i(U),d.current={x:U.x/O,y:U.y/O}},[]),M=wr(A=>{if(!t)return;A.preventDefault(),A.stopPropagation(),c.current=!0,p();let j="touches"in A?A.touches[0]:A;S(j.clientX,j.clientY)},[t,p,S]),k=wr(A=>{if(!c.current)return;A.preventDefault();let j="touches"in A?A.touches[0]:A;S(j.clientX,j.clientY)},[S]),R=wr(()=>{c.current=!1,i({x:0,y:0}),d.current={x:0,y:0},m()},[m]),f=a*10,C=wr(A=>{t&&w()?.forward(A*f,!0)},[t,f]),x=wr(A=>{t&&w()?.truck(A*f,0,!0)},[t,f]),P=wr((A,j,T)=>{if(!t)return;b.current&&cancelAnimationFrame(b.current),g.current={control:A,amount:j,action:T},h.current=0,T(j);let I=F=>{if(!g.current)return;if(h.current===0){h.current=F,b.current=requestAnimationFrame(I);return}if(F-h.current>200){let{amount:E,action:W}=g.current;W(E),h.current=F}b.current=requestAnimationFrame(I)};b.current=requestAnimationFrame(I)},[t]),z=wr(A=>{g.current?.control===A&&(b.current&&(cancelAnimationFrame(b.current),b.current=void 0),g.current=null,h.current=0)},[]);return nC(()=>(window.addEventListener("mousemove",k),window.addEventListener("mouseup",R),window.addEventListener("touchmove",k,{passive:!1}),window.addEventListener("touchend",R),window.addEventListener("touchcancel",R),()=>{window.removeEventListener("mousemove",k),window.removeEventListener("mouseup",R),window.removeEventListener("touchmove",k),window.removeEventListener("touchend",R),window.removeEventListener("touchcancel",R),m(),b.current&&cancelAnimationFrame(b.current)}),[k,R,m]),t?Fn("div",{className:"mc__wrapper",style:{opacity:n,...aC[o]},children:jd("div",{className:"mc__dpad",children:[Fn("button",{"aria-label":"Move forward",className:"mc__arrow mc__arrow--up",onMouseDown:()=>P("up",1,C),onMouseUp:()=>z("up"),onMouseLeave:()=>z("up"),onTouchStart:A=>{A.preventDefault(),P("up",1,C)},onTouchEnd:()=>z("up"),onTouchCancel:()=>z("up"),children:Fn(fl,{direction:"up"})}),jd("div",{className:"mc__middle-row",children:[Fn("button",{"aria-label":"Move left",className:"mc__arrow mc__arrow--left",onMouseDown:()=>P("left",-1,x),onMouseUp:()=>z("left"),onMouseLeave:()=>z("left"),onTouchStart:A=>{A.preventDefault(),P("left",-1,x)},onTouchEnd:()=>z("left"),onTouchCancel:()=>z("left"),children:Fn(fl,{direction:"left"})}),Fn("div",{ref:s,className:"mc__joystick",onMouseDown:M,onTouchStart:M,children:Fn("div",{className:"mc__knob",style:{transform:`translate(${l.x}px, ${l.y}px)`}})}),Fn("button",{"aria-label":"Move right",className:"mc__arrow mc__arrow--right",onMouseDown:()=>P("right",1,x),onMouseUp:()=>z("right"),onMouseLeave:()=>z("right"),onTouchStart:A=>{A.preventDefault(),P("right",1,x)},onTouchEnd:()=>z("right"),onTouchCancel:()=>z("right"),children:Fn(fl,{direction:"right"})})]}),Fn("button",{"aria-label":"Move backward",className:"mc__arrow mc__arrow--down",onMouseDown:()=>P("down",-1,C),onMouseUp:()=>z("down"),onMouseLeave:()=>z("down"),onTouchStart:A=>{A.preventDefault(),P("down",-1,C)},onTouchEnd:()=>z("down"),onTouchCancel:()=>z("down"),children:Fn(fl,{direction:"down"})})]})}):null},fg=iC;import{HexColorPicker as sC}from"react-colorful";import{jsx as hl,jsxs as hg}from"react/jsx-runtime";var Id=({colorPicker:e,onClose:t,itemMaterials:n,setItemMaterials:a,inline:r=!1})=>hg("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:[hl("p",{className:"ri-popoverLabel",children:"Color"}),hl(sC,{color:n[e.objectId]?.hex??"#ffffff",onChange:o=>a(s=>({...s,[e.objectId]:{...s[e.objectId],hex:o}}))}),hg("div",{className:"ri-inlineRow",children:[hl("span",{className:"ri-colorCode",children:n[e.objectId]?.hex??"#ffffff"}),hl("button",{className:"ri-secondaryButton",onClick:t,children:"Done"})]})]});import{jsx as Cr,jsxs as Fd}from"react/jsx-runtime";var Vd=({materialPopup:e,textureUrl:t,triggerFileUpload:n,clearTexture:a,inline:r=!1})=>Fd("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:[Cr("div",{className:"ri-popoverHeader",children:Cr("p",{className:"ri-popoverLabel",style:{marginBottom:0},children:"Material"})}),Fd("div",{className:"ri-materialBody",children:[t?Cr("div",{className:"ri-previewFrame",children:Cr("img",{src:t,alt:"texture preview",className:"ri-previewImage"})}):Fd("div",{className:"ri-emptyState",children:[Cr("svg",{width:"24",height:"24",fill:"none",stroke:"currentColor",strokeWidth:1.5,viewBox:"0 0 24 24",children:Cr("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"})}),Cr("span",{style:{fontSize:12},children:"No texture applied"})]}),Cr("button",{onClick:()=>n(e.objectId),className:"ri-uploadButton",children:t?"Replace image":"Upload image"}),t&&Cr("button",{onClick:()=>a(e.objectId),className:"ri-removeButton",children:"Remove texture"}),Cr("p",{className:"ri-formatHint",children:"JPG \xB7 PNG \xB7 WebP"})]})]});import{Fragment as lC,useEffect as Ud,useRef as cC,useState as Hd}from"react";import{Fragment as Gd,jsx as on,jsxs as Pa}from"react/jsx-runtime";function xg({entries:e}){return on(Gd,{children:e.map(([t,n])=>{let a=n!==null&&typeof n=="object",r=a?Object.entries(n):[];return a&&r.length>0?Pa("div",{className:"left-panel__data-group",children:[on("span",{className:"left-panel__data-key",children:t}),on("div",{className:"left-panel__data-children",children:on(xg,{entries:r})})]},t):Pa("div",{className:"left-panel__data-row",children:[on("span",{className:"left-panel__data-key",children:t}),on("span",{className:`left-panel__data-value left-panel__data-value--${typeof n}`,children:a?Array.isArray(n)?"[]":"{}":String(n)})]},t)})})}function dC({content:e}){let t=e!=null,[n,a]=Hd(t),[r,o]=Hd(t),s=cC(e);return t&&(s.current=e),Ud(()=>{if(t){a(!0);return}if(n){o(!1);let l=setTimeout(()=>a(!1),300);return()=>clearTimeout(l)}},[t,n]),Ud(()=>{if(n&&t){let l=requestAnimationFrame(()=>o(!0));return()=>cancelAnimationFrame(l)}},[n,t]),n?on("div",{className:`left-panel__action-extra${r?" left-panel__action-extra--open":""}`,children:on("div",{className:"left-panel__action-extra-inner",children:e??s.current})}):null}function Wd({isOpen:e,selectedObject:t,currentAction:n,onClose:a,onAction:r,renderActionExtra:o}){let[s,l]=Hd(t);Ud(()=>{t&&l(t)},[t]);let i=t??s,c=i?Object.entries(i).filter(([d])=>d!=="actions"):[];return on("div",{className:`left-panel ${e?"left-panel--open":"left-panel--closed"}`,children:i&&Pa(Gd,{children:[Pa("div",{className:"left-panel__header",children:[on("p",{className:"left-panel__title",children:i.label}),on("button",{onClick:a,className:"left-panel__close-btn","aria-label":"Close panel",children:"\u2715"})]}),c.length>0&&on("div",{className:"left-panel__data",children:on(xg,{entries:c})}),on("hr",{className:"left-panel__divider"}),i.actions&&i.actions.length>0&&Pa(Gd,{children:[on("div",{className:"left-panel__actions-label",children:"Actions"}),on("div",{className:"left-panel__actions-list",children:i.actions.map((d,u)=>{let b=n?.action.id===d.id&&(n.binding===i||n.binding?.id===i.id||n.binding?.modelObjectId===i.modelObjectId||n.objectId===i.id||n.objectId===i.modelObjectId),g=o?.(d.id);return Pa(lC,{children:[on("button",{onClick:h=>r({objectId:i.modelObjectId||i.id||"",action:d,binding:i,screenX:h.clientX,screenY:h.clientY}),className:["left-panel__action-btn",`left-panel__action-btn--${d.id}`,b?"left-panel__action-btn--active":""].filter(Boolean).join(" "),"data-action-id":d.id,"data-label":d.label,children:d.label}),on(dC,{content:g})]},u)})})]})]})})}import{useMemo as uC,useState as yg}from"react";import{Boxes as mC}from"lucide-react";import{useState as pC}from"react";import{jsx as Ir,jsxs as Li}from"react/jsx-runtime";function vg({openButtonLabel:e,openButtonAriaLabel:t,eyebrow:n,title:a,searchValue:r,onSearchChange:o,searchPlaceholder:s,children:l,isOpen:i,onToggle:c,openButtonIcon:d,closeButtonIcon:u,closeButtonAriaLabel:b}){let[g,h]=pC(!1),w=i!==void 0?i:g,B=v=>{i===void 0&&h(v),c?.(v)};return Li("div",{className:`ri-sidepanel-wrap ${w?"ri-sidepanel-wrap--open":"ri-sidepanel-wrap--closed"}`,children:[!w&&Li("button",{type:"button",className:"ri-sidepanel__open-btn",onClick:()=>B(!0),"aria-label":t,title:"Open panel",children:[d,e?Ir("span",{children:e}):null]}),Li("div",{className:`ri-sidepanel ${w?"ri-sidepanel--open":"ri-sidepanel--closed"}`,"aria-hidden":!w,children:[Li("div",{className:"ri-sidepanel__header",children:[Li("div",{className:"ri-sidepanel__header-top",children:[Ir("span",{className:"ri-sidepanel__eyebrow",children:n}),Ir("button",{type:"button",className:"ri-sidepanel__close-btn",onClick:()=>B(!1),"aria-label":b,title:"Close",children:u??Ir("svg",{width:"12",height:"12",viewBox:"0 0 12 12",fill:"none","aria-hidden":"true",children:Ir("path",{d:"M1 1L11 11M11 1L1 11",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round"})})})]}),Ir("p",{className:"ri-sidepanel__title",children:a})]}),Ir("div",{className:"ri-sidepanel__search-wrap",children:Ir("input",{className:"ri-sidepanel__search",type:"text",placeholder:s,value:r,onChange:v=>o(v.target.value)})}),Ir("div",{className:"ri-sidepanel__list",children:l})]})]})}import{jsx as Lo,jsxs as bC}from"react/jsx-runtime";function $d({objectBindings:e,onAction:t,onFocus:n,onHover:a,isOpen:r,onToggle:o}){let[s,l]=yg(null),[i,c]=yg(""),d=uC(()=>Object.entries(e).filter(([u,b])=>{let g=i.toLowerCase();return u.toLowerCase().includes(g)||(b.label??"").toLowerCase().includes(g)}),[e,i]);return Lo(vg,{openButtonLabel:"",openButtonAriaLabel:"Open scene objects panel",openButtonIcon:Lo(mC,{width:16,height:16,"aria-hidden":"true"}),eyebrow:"SCENE OBJECTS",title:`${d.length} visible entries`,searchValue:i,onSearchChange:c,searchPlaceholder:"Search nodes, labels",isOpen:r,onToggle:o,closeButtonAriaLabel:"Close scene objects panel",children:d.map(([u,b])=>{let g=b.visible!==!1,h=s===u;return bC("div",{onClick:()=>n(b),onMouseEnter:()=>{l(u),a?.(b)},onMouseLeave:()=>{l(null),a?.(null)},className:`ri-sidepanel__row${h?" ri-sidepanel__row--hovered":""}`,children:[Lo("span",{className:`ri-sidepanel__label${h?" ri-sidepanel__label--hovered":""}`,children:b.label??u}),Lo("button",{type:"button",onClick:w=>{w.stopPropagation(),t?.({objectId:u,action:{id:"toggle-visibility",label:"Toggle Visibility",type:"command"},binding:b})},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"})})})})]},u)})})}import{AlertTriangle as np,Box as Wg,Camera as nS,Download as rS,Eraser as oS,FileImage as aS,RotateCcw as iS,ChevronLeft as sS,Square as $g,ChevronRight as lS,RectangleGoggles as cS,QrCode as dS,X as rp,Expand as pS,Play as uS,Pause as mS,Smartphone as Xg,PencilRuler as bS,RulerDimensionLine as gS,Grid3X3 as fS}from"lucide-react";import{createContext as gC,useContext as fC}from"react";var Xd=gC({isInsideEditor:!1,activeTab:"object",activeSubTab:"General",tier:"free"});var qn=()=>fC(Xd);import{jsx as wg,jsxs as hC}from"react/jsx-runtime";function Ta({visible:e,message:t,tone:n="default",spinner:a=!0}){return e?hC("div",{className:"bb-loadingOverlay",role:"status","aria-live":"polite",children:[a&&wg("span",{className:"bb-loadingSpinner","aria-hidden":"true"}),wg("span",{className:`bb-loadingMessage bb-status--${n}`,children:t})]}):null}var Kd=new WeakSet;function Ra(e){Kd.add(e)}function Cg(e){let t=Kd.has(e);return t&&Kd.delete(e),t}import{useRef as pt,useEffect as Di,useMemo as Fr,useSyncExternalStore as wC}from"react";import{useThree as CC,useFrame as SC}from"@react-three/fiber";import{Sphere as MC,Line as kC}from"@react-three/drei";import{Vector3 as It,Vector2 as PC,AdditiveBlending as Yd,Plane as Pg,TextureLoader as TC}from"three";var Sg="data:image/png;base64,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";var Mg="data:image/png;base64,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";var kg="data:image/png;base64,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";import{Fragment as jC,jsx as De,jsxs as hn}from"react/jsx-runtime";var Aa=-100,Ba=100,Ng=.03,RC=.03,AC=.03,Tg=.5,BC=Sg,OC=Mg,EC=kg,LC=Math.PI/4,Rg=.4,Ea=64,Ag=Ng*3,Jd="#4d7dff",Bg="#ffcc00",Og=.02,_g=new It(0,1,0),xl=32,Eg="#ff9d3d",vl=4,Sr=1.4,yl=.35,DC=.13,Lg=.12,Dg=.055,NC={x:"#ff4444",y:"#44ff44",z:"#4444ff"};function zg(e){return new It(e==="x"?1:0,e==="y"?1:0,e==="z"?1:0)}function _C(e,t){let n=zg(e);t.lengthSq()<1e-8&&(t=n.clone());let a=new It().crossVectors(n,new It().crossVectors(t,n));if(a.lengthSq()<1e-8){let r=Math.abs(n.y)<.9?_g:new It(1,0,0);a=new It().crossVectors(n,r)}return a.normalize()}function qd(e){let t=new Float32Array((Ea+1)*3);for(let n=0;n<=Ea;n++){let a=n/Ea*Math.PI*2,r=Math.cos(a)*Rg,o=Math.sin(a)*Rg,s=0,l=0,i=0;e==="x"?(l=r,i=o):e==="y"?(s=r,i=o):(s=r,l=o),t[n*3]=s,t[n*3+1]=l,t[n*3+2]=i}return t}function zC(e){let t=Math.abs(e.y)<.99?new It(0,1,0):new It(1,0,0),n=new It().crossVectors(e,t).normalize(),a=new It().crossVectors(e,n).normalize();return[n,a]}function Oa(e,t,n){return Math.min(Math.max(e,t),n)}var La=null,Zd=new Set;function Ni(e){La!==e&&(La=e,Zd.forEach(t=>t()))}function Qd(e){return Zd.add(e),()=>Zd.delete(e)}function wl(){return La}function jg({light:e,position:t,color:n,intensity:a,visible:r,onPositionChange:o,onDraggingChange:s}){let{activeTab:l,activeSubTab:i,setActiveTab:c,setActiveSubTab:d}=qn(),{camera:u,gl:b,raycaster:g,invalidate:h}=CC(),w=pt(null),B=pt(null),v=pt(null),p=pt(null),m=pt(null),S=pt(null),M=pt(null),k=pt(null),R=pt(null),f=pt(null),C=pt(null),x=pt(null),P=pt(null),z=pt(null),A=pt(null),j=pt(null),T=pt(null),I=pt({dragging:!1,axis:null}),F=pt(new Pg),O=pt(new It),E=pt(null),W=pt(null),U=pt(new It),ae=pt(!1),xe=pt(new Pg),le=pt(s);Di(()=>{le.current=s},[s]);let be=Fr(()=>new It(t[0],t[1],t[2]),[t]),he=Fr(()=>new Float32Array(6),[]),Se=Fr(()=>new Float32Array(6),[]),it=Fr(()=>qd("x"),[]),wt=Fr(()=>qd("y"),[]),Xe=Fr(()=>qd("z"),[]),Me=Fr(()=>new Float32Array((xl+1)*3),[]),Te=Fr(()=>new Float32Array(vl*2*3),[]),Rt=e?.type==="point",Ke=e?.type==="spot",tn=Rt?OC:Ke?EC:BC,Ye=Rt?RC:Ke?AC:Ng,Jt=Fr(()=>new TC().load(tn),[tn]),At=wC(Qd,wl,wl),Be=!!e&&At===e.id;if(Di(()=>{ae.current||(U.current.copy(be),h())},[be,h]),Di(()=>{e&&La===e.id&&!r&&Ni(null)},[e?.id,r]),Di(()=>()=>{e&&La===e.id&&Ni(null)},[e?.id]),SC(()=>{if(w.current&&w.current.position.copy(U.current),v.current){v.current.lookAt(u.position);let ee=u,oe;ee.isOrthographicCamera?oe=Ye/ee.zoom:oe=u.position.distanceTo(U.current)*Ye,v.current.scale.setScalar(oe)}if(M.current){let ee=u,oe;ee.isOrthographicCamera?oe=Ag/ee.zoom:oe=u.position.distanceTo(U.current)*Ag,M.current.scale.setScalar(oe)}if(C.current){let ee=u,oe;ee.isOrthographicCamera?oe=Dg/ee.zoom:oe=u.position.distanceTo(U.current)*Dg,C.current.scale.setScalar(oe)}if(m.current){let ee=m.current.getAttribute("position"),oe=ee.array;oe[0]=0,oe[1]=0,oe[2]=0,oe[3]=U.current.x,oe[4]=U.current.y,oe[5]=U.current.z,ee.needsUpdate=!0,m.current.computeBoundingSphere()}if(S.current){let ee=U.current,oe=ee.length();S.current.visible=oe>Tg,oe>1e-6&&(S.current.position.copy(ee).multiplyScalar(.5),S.current.scale.set(1,oe,1),S.current.quaternion.setFromUnitVectors(_g,ee.clone().normalize()))}if(p.current&&(p.current.visible=U.current.length()>Tg),Ke&&k.current&&R.current&&f.current){let ee=U.current,oe=ee.length();if(oe>1e-6){k.current.visible=!0;let Bt=ee.clone().negate().normalize(),st=oe,He=e?.angle??Math.PI/6,Je=st*Math.tan(He),Ot=ee.clone().add(Bt.clone().multiplyScalar(st)),[Ft,Lt]=zC(Bt),Pn=R.current.getAttribute("position"),mn=Pn.array;for(let Ie=0;Ie<=xl;Ie++){let Re=Ie/xl*Math.PI*2,ft=Ot.x+(Ft.x*Math.cos(Re)+Lt.x*Math.sin(Re))*Je,ot=Ot.y+(Ft.y*Math.cos(Re)+Lt.y*Math.sin(Re))*Je,ht=Ot.z+(Ft.z*Math.cos(Re)+Lt.z*Math.sin(Re))*Je;mn[Ie*3]=ft,mn[Ie*3+1]=ot,mn[Ie*3+2]=ht}Pn.needsUpdate=!0,R.current.computeBoundingSphere();let me=f.current.getAttribute("position"),et=me.array;for(let Ie=0;Ie<vl;Ie++){let Re=Ie/vl*Math.PI*2,ft=Ot.x+(Ft.x*Math.cos(Re)+Lt.x*Math.sin(Re))*Je,ot=Ot.y+(Ft.y*Math.cos(Re)+Lt.y*Math.sin(Re))*Je,ht=Ot.z+(Ft.z*Math.cos(Re)+Lt.z*Math.sin(Re))*Je,Dt=Ie*6;et[Dt]=ee.x,et[Dt+1]=ee.y,et[Dt+2]=ee.z,et[Dt+3]=ft,et[Dt+4]=ot,et[Dt+5]=ht}me.needsUpdate=!0,f.current.computeBoundingSphere()}else k.current.visible=!1}if(E.current&&(E.current.visible=I.current.dragging),W.current&&I.current.dragging){let ee=W.current.getAttribute("position"),oe=ee.array;oe[0]=O.current.x,oe[1]=O.current.y,oe[2]=O.current.z,oe[3]=U.current.x,oe[4]=U.current.y,oe[5]=U.current.z,ee.needsUpdate=!0,W.current.computeBoundingSphere()}}),Di(()=>{let ee=me=>{let et=b.domElement.getBoundingClientRect();return new PC((me.clientX-et.left)/et.width*2-1,-((me.clientY-et.top)/et.height)*2+1)},oe=me=>!!me.target.closest?.("button, input, textarea, .ri-annotationPopup, .ri-colorPicker, .ri-materialPicker"),Bt=()=>{let me=[];return[x.current,A.current,P.current,j.current,z.current,T.current].forEach(et=>{et&&me.push(et)}),me},st=me=>me===x.current||me===A.current?"x":me===P.current||me===j.current?"y":me===z.current||me===T.current?"z":null,He=()=>{I.current.dragging&&(I.current={dragging:!1,axis:null},E.current&&(E.current.visible=!1),b.domElement.style.cursor="default",le.current?.(!1))},Je=()=>{ae.current&&(ae.current=!1,b.domElement.style.cursor="default",le.current?.(!1))},Ot=me=>{if(I.current.dragging&&I.current.axis){let ot=I.current.axis,ht=U.current,Dt=zg(ot),Tn=new It().subVectors(u.position,ht),Z=_C(ot,Tn);F.current.setFromNormalAndCoplanarPoint(Z,ht);let L=ee(me);g.setFromCamera(L,u);let _=new It,H=g.ray.intersectPlane(F.current,_);if(!H)return;let Y=H.clone().sub(ht).dot(Dt),ie=ht.clone().add(Dt.clone().multiplyScalar(Y)),re=[Oa(ot==="x"?ie.x:ht.x,Aa,Ba),Oa(ot==="y"?ie.y:ht.y,Aa,Ba),Oa(ot==="z"?ie.z:ht.z,Aa,Ba)];U.current.set(re[0],re[1],re[2]),o?.(re),h();return}if(!ae.current)return;let et=ee(me);g.setFromCamera(et,u);let Ie=new It,Re=g.ray.intersectPlane(xe.current,Ie);if(!Re)return;let ft=[Oa(Re.x,Aa,Ba),Oa(Re.y,Aa,Ba),Oa(Re.z,Aa,Ba)];U.current.set(ft[0],ft[1],ft[2]),o?.(ft),h()},Ft=me=>{if(oe(me))return;let et=ee(me);if(g.setFromCamera(et,u),Be){let ft=Bt(),ot=ft.length?g.intersectObjects(ft,!1):[];if(ot.length>0){let ht=ot[0].object,Dt=st(ht);if(Dt){let Tn=U.current;I.current={dragging:!0,axis:Dt},O.current.copy(Tn),le.current?.(!0),b.domElement.style.cursor="grabbing",b.domElement.setPointerCapture(me.pointerId),me.preventDefault(),me.stopPropagation();return}}}let Ie=[];if(B.current&&Ie.push(B.current),v.current&&Ie.push(v.current),Ie.length===0)return;if(g.intersectObjects(Ie,!1).length>0){let ft=e?.id??null;La!==ft&&(Ni(ft),c?.("scene"),d?.("Lighting"));let ot=new It;u.getWorldDirection(ot),xe.current.setFromNormalAndCoplanarPoint(ot,U.current),ae.current=!0,le.current?.(!0),b.domElement.style.cursor="grabbing",b.domElement.setPointerCapture(me.pointerId),me.preventDefault(),me.stopPropagation()}},Lt=me=>{if(I.current.dragging){He();try{b.domElement.releasePointerCapture(me.pointerId)}catch{}}if(ae.current){Je();try{b.domElement.releasePointerCapture(me.pointerId)}catch{}}},Pn=()=>{He(),Je()},mn=()=>{He(),Je()};return b.domElement.addEventListener("pointerdown",Ft),window.addEventListener("pointermove",Ot),window.addEventListener("pointerup",Lt),window.addEventListener("pointercancel",Pn),window.addEventListener("blur",mn),()=>{b.domElement.removeEventListener("pointerdown",Ft),window.removeEventListener("pointermove",Ot),window.removeEventListener("pointerup",Lt),window.removeEventListener("pointercancel",Pn),window.removeEventListener("blur",mn)}},[u,g,b,h,o,e,c,d,Be]),l!=="scene"||i!=="Lighting"||!e||!r||e.type==="none"||e.type==="hemisphere")return null;let rt=["x","y","z"];return hn("group",{ref:ee=>{ee&&Ru(ee)},children:[hn("group",{ref:w,children:[De("sprite",{ref:v,children:De("spriteMaterial",{map:Jt,transparent:!0,opacity:.9,blending:Yd,depthWrite:!1,rotation:Ke?LC:0},tn)}),De(MC,{ref:B,args:[.25,16,16],children:De("meshBasicMaterial",{transparent:!0,opacity:.01})}),Rt&&hn("group",{ref:M,children:[hn("lineLoop",{renderOrder:999,children:[De("bufferGeometry",{children:De("bufferAttribute",{attach:"attributes-position",args:[it,3],count:Ea+1})}),De("lineBasicMaterial",{color:Jd,transparent:!0,opacity:.6,depthTest:!1,depthWrite:!1})]}),hn("lineLoop",{renderOrder:999,children:[De("bufferGeometry",{children:De("bufferAttribute",{attach:"attributes-position",args:[wt,3],count:Ea+1})}),De("lineBasicMaterial",{color:Jd,transparent:!0,opacity:.6,depthTest:!1,depthWrite:!1})]}),hn("lineLoop",{renderOrder:999,children:[De("bufferGeometry",{children:De("bufferAttribute",{attach:"attributes-position",args:[Xe,3],count:Ea+1})}),De("lineBasicMaterial",{color:Jd,transparent:!0,opacity:.6,depthTest:!1,depthWrite:!1})]})]}),Be&&De("group",{ref:C,children:rt.map(ee=>{let oe=NC[ee],Bt=new It(ee==="x"?Sr:0,ee==="y"?Sr:0,ee==="z"?Sr:0),st=new It(ee==="x"?Sr-yl/2:0,ee==="y"?Sr-yl/2:0,ee==="z"?Sr-yl/2:0),He=new It(ee==="x"?Sr/2:0,ee==="y"?Sr/2:0,ee==="z"?Sr/2:0),Je=ee==="x"?[0,0,-Math.PI/2]:ee==="y"?[0,0,0]:[Math.PI/2,0,0],Ot=ee==="x"?x:ee==="y"?P:z,Ft=ee==="x"?A:ee==="y"?j:T;return hn("group",{children:[De(kC,{points:[new It(0,0,0),Bt],color:oe,transparent:!0,opacity:.9,lineWidth:2,depthTest:!1}),hn("mesh",{ref:Ft,position:He,rotation:Je,children:[De("cylinderGeometry",{args:[Lg,Lg,Sr,8]}),De("meshBasicMaterial",{transparent:!0,opacity:0,depthWrite:!1})]}),hn("mesh",{ref:Ot,position:st,rotation:Je,children:[De("coneGeometry",{args:[DC,yl,8]}),De("meshBasicMaterial",{color:oe,depthTest:!1})]})]},ee)})})]}),!Rt&&!Ke&&hn(jC,{children:[hn("mesh",{ref:S,children:[De("cylinderGeometry",{args:[Og,Og,1,8,1,!0]}),De("meshBasicMaterial",{color:Bg,transparent:!0,opacity:.05,blending:Yd,depthWrite:!1,depthTest:!1})]}),hn("line",{ref:p,children:[De("bufferGeometry",{ref:m,children:De("bufferAttribute",{attach:"attributes-position",args:[he,3],count:2})}),De("lineBasicMaterial",{color:Bg,transparent:!0,opacity:.7,blending:Yd})]})]}),Ke&&hn("group",{ref:k,children:[hn("lineLoop",{renderOrder:999,children:[De("bufferGeometry",{ref:R,children:De("bufferAttribute",{attach:"attributes-position",args:[Me,3],count:xl+1})}),De("lineBasicMaterial",{color:Eg,transparent:!0,opacity:.85,depthTest:!1,depthWrite:!1})]}),hn("lineSegments",{renderOrder:999,children:[De("bufferGeometry",{ref:f,children:De("bufferAttribute",{attach:"attributes-position",args:[Te,3],count:vl*2})}),De("lineBasicMaterial",{color:Eg,transparent:!0,opacity:.5,depthTest:!1,depthWrite:!1})]})]}),hn("line",{ref:ee=>{E.current=ee,ee&&(ee.visible=!1)},children:[De("bufferGeometry",{ref:W,children:De("bufferAttribute",{attach:"attributes-position",args:[Se,3],count:2})}),De("lineBasicMaterial",{color:"#ffffff",transparent:!0,opacity:.6})]})]})}import{useCallback as ep,useLayoutEffect as UC,useMemo as Mr,useRef as no}from"react";import{PivotControls as HC}from"@react-three/drei";import{useFrame as GC,useThree as WC}from"@react-three/fiber";import{Euler as Hg,Matrix4 as Sl,Quaternion as Ml,Vector3 as _i}from"three";import{Box3 as Ig,Euler as IC,Matrix4 as Fg,Quaternion as FC,Vector3 as to}from"three";function Cl(e){e.updateWorldMatrix(!0,!0);let t=new Fg().copy(e.matrixWorld).invert(),n=new Ig,a=new Ig,r=!1;return e.traverse(o=>{let s=o;if(!s.isMesh||!s.geometry||(s.geometry.boundingBox||s.geometry.computeBoundingBox(),!s.geometry.boundingBox))return;let l=new Fg().multiplyMatrices(t,o.matrixWorld);a.copy(s.geometry.boundingBox).applyMatrix4(l),n.union(a),r=!0}),r?n.getCenter(new to):new to}function Vg(e,t="XYZ"){return new FC().setFromEuler(new IC(e[0],e[1],e[2],t))}function VC(e,t,n,a,r="XYZ"){let s=new to(...a).multiply(new to(...n)).applyQuaternion(Vg(t,r)).add(new to(...e));return[s.x,s.y,s.z]}function Ug(e,t,n,a,r,o="XYZ"){let s=new to(...VC(e,t,a,r,o)),l=new to(...r).multiply(new to(...a)).applyQuaternion(Vg(n,o)),i=s.sub(l);return[i.x,i.y,i.z]}import{jsx as Gg}from"react/jsx-runtime";function tp({node:e,space:t,onTransformChange:n,onDraggingChange:a}){let r=WC(x=>x.invalidate),o=Mr(()=>Cl(e),[e]),s=Mr(()=>new Sl,[]),l=no(!1),i=no(new Sl),c=no(new Sl),d=no(null),u=no(0),b=no([]),g=no(null),h=Mr(()=>new _i,[]),w=Mr(()=>new Ml,[]),B=Mr(()=>new _i,[]),v=Mr(()=>new Ml,[]),p=Mr(()=>new _i(1,1,1),[]),m=Mr(()=>new Ml,[]),S=Mr(()=>new _i,[]),M=Mr(()=>new _i,[]),k=no([0,0,0]),R=ep(()=>{l.current||(e.updateWorldMatrix(!0,!1),h.copy(o).applyMatrix4(e.matrixWorld),e.getWorldQuaternion(w),v.copy(w),t==="world"&&v.identity(),s.compose(h,v,p))},[h,s,v,p,e,o,t,w]);UC(()=>(R(),()=>{g.current!==null&&(cancelAnimationFrame(g.current),g.current=null),a(!1);for(let x of b.current)fa(x);b.current=[]}),[a,R]),GC(()=>R());let f=ep(()=>{g.current!==null&&(cancelAnimationFrame(g.current),g.current=null),e.updateWorldMatrix(!0,!0),b.current=[];for(let x of ga(e))eb(x)||(Is(x,x.matrixWorld),b.current.push(x));e.updateWorldMatrix(!0,!1),h.copy(o).applyMatrix4(e.matrixWorld),e.getWorldQuaternion(w),e.getWorldScale(B),i.current.compose(h,w,B),c.current.copy(s),k.current=[e.rotation.x,e.rotation.y,e.rotation.z],d.current=null,l.current=!0,a(!0)},[h,s,e,a,o,w,B]),C=ep((x,P)=>{let z=i.current.clone().premultiply(P),A=c.current.clone().premultiply(P);z.decompose(S,w,M);let j=S.clone();A.decompose(h,v,p),t==="world"&&v.identity(),s.compose(h,v,p),x.decompose(S,m,M);let T=new Hg().setFromQuaternion(m,e.rotation.order),[I,F,O]=k.current,E=[I+T.x,F+T.y,O+T.z],W=new Ml().setFromEuler(new Hg(E[0],E[1],E[2],e.rotation.order)),ae=(e.parent?.matrixWorld||new Sl).clone().invert(),xe=j.clone().applyMatrix4(ae),le=o.clone().multiply(e.scale).applyQuaternion(W),be=xe.clone().sub(le),he=[be.x,be.y,be.z];e.position.set(he[0],he[1],he[2]),e.rotation.set(E[0],E[1],E[2],e.rotation.order),e.updateMatrixWorld(!0),r(),d.current={position:he,rotation:E}},[h,m,s,v,p,r,e,o,S,M,t,w]);return Gg("group",{children:Gg(HC,{matrix:s,autoTransform:!1,fixed:!0,scale:90,lineWidth:3,axisColors:["#ff2d6f","#64dfa6","#2f8fe8"],hoveredColor:"#ffd84d",opacity:.95,depthTest:!1,disableScaling:!0,onDragStart:f,onDrag:(x,P,z,A)=>C(P,A),onDragEnd:()=>{l.current=!1;let x=d.current;if(d.current=null,x)n(x),g.current=requestAnimationFrame(()=>{g.current=null,a(!1)});else if(b.current.length>0){for(let P of b.current)fa(P);e.updateMatrixWorld(!0),r(),a(!1)}else a(!1);b.current=[]}})})}import{Fragment as Do,jsx as $,jsxs as Ae}from"react/jsx-runtime";function hS(e){let t=e.object;if(!t.isSkinnedMesh||!e.face||!t.skeleton)return null;let n=t.geometry,a=n.getAttribute("skinIndex"),r=n.getAttribute("skinWeight"),o=n.getAttribute("position");if(!a||!r||!o)return null;let s=t.worldToLocal(e.point.clone()),l=[e.face.a,e.face.b,e.face.c],i=new Dn,c=l[0],d=1/0;for(let g of l){i.fromBufferAttribute(o,g);let h=i.distanceToSquared(s);h<d&&(d=h,c=g)}let u=a.getComponent(c,0),b=r.getComponent(c,0);for(let g=1;g<4;g++){let h=r.getComponent(c,g);h>b&&(b=h,u=a.getComponent(c,g))}return t.skeleton.bones[u]??null}function xS(e){let t=hS(e)??e.object,n=fi(t);if(!n)return null;t.updateWorldMatrix(!0,!1);let a=t.worldToLocal(e.point.clone());return{anchorNodeName:n,anchorLocalPosition:[a.x,a.y,a.z]}}function vS(e,t,n){if(!e.anchorNodeName||!e.anchorLocalPosition)return!1;let a=dr(t,e.anchorNodeName);return a?(a.updateWorldMatrix(!0,!1),n.set(...e.anchorLocalPosition).applyMatrix4(a.matrixWorld),!0):!1}function yS({annotation:e,enabled:t,controlsRef:n,offsetRef:a}){let r=JC(b=>b.scene),o=ut(null),s=ut(!1),l=Cn(()=>new Dn,[]),i=Cn(()=>new Dn,[]),c=Cn(()=>new Dn,[]),d=e?.anchorNodeName,u=e?.anchorLocalPosition;return gt(()=>{o.current=null,s.current=!1},[d,e?.id]),YC(()=>{let b=n.current,g=a.current;if(!t||!b||!g||!d||!u){s.current=!1;return}let h=o.current;if((!h||!h.parent)&&(h=dr(r,d),o.current=h),!h){s.current=!1;return}h.updateWorldMatrix(!0,!1),l.set(u[0],u[1],u[2]).applyMatrix4(h.matrixWorld),!(s.current&&l.distanceToSquared(i)<1e-8)&&(i.copy(l),s.current=!0,c.copy(l).add(g),b.setLookAt(c.x,c.y,c.z,l.x,l.y,l.z,!0))}),null}function wS(e){let t={total:0,missing:0};return e.traverse(n=>{let a=n;!a.isMesh||!a.geometry||(t.total+=1,a.geometry.getAttribute("uv")||(t.missing+=1))}),t}function CS(e,t){let n=t?.camera;if(!(n instanceof ZC))return;let r=new kl().setFromObject(e).getSize(new Dn).length();!Number.isFinite(r)||r<=0||(n.near=r/100,n.far=r*100,n.updateProjectionMatrix(),t&&(t.maxDistance=r*10))}async function Kg(e,t,n=.6){let a=e.smoothTime;e.smoothTime=n;try{return await t()}finally{e.smoothTime=a}}function Pl({modelUrl:e,tilesetUrl:t,tilesErrorTarget:n=8,tilesCacheSize:a=800,modelFormat:r,licenseKey:o,licenseValidationUrl:s,objectBindings:l,selectedObject:i,panelHoveredObject:c,onObjectBindingsChange:d,onObjectSelect:u,onObjectHover:b,onObjectEditLeaseChange:g,onModelLoaded:h,onLoadError:w,onAction:B,onHiddenObjectsChange:v,onCameraChange:p,onViewerReady:m,onTextureUpload:S,onAnimationsReady:M,onAnnotationsChange:k,activeAnnotation:R,onActiveAnnotationChange:f,lights:C,camera:x,backgroundColor:P,shadows:z=!0,showObjectBindingDataPanel:A=!0,customObjectBindingDataPanel:j,customSceneObjectsPanel:T,showSceneObjectsPanel:I=!0,showDownloadButton:F=!0,downloadFilename:O="model",showResetButton:E=!0,showLoadingOverlay:W=!0,showMouseController:U=!1,mouseControllerPosition:ae="center-bottom",mouseControllerOpacity:xe=1,moveSensitivity:le=.08,zoomSensitivity:be=1,sceneConfig:he,onSceneConfigChange:Se,disableZoom:it=!1,zoomOnSelected:wt=!0,highlightOnHover:Xe=!0,enableCameraControls:Me=!0,onAutoFit:Te,refitOnResize:Rt=!0,renderMode:Ke="demand",maxDpr:tn=2,preserveDrawingBuffer:Ye=!1,performanceProfile:Jt="auto",dracoDecoderPath:At,ktx2TranscoderPath:Be,meshopt:rt=!0,showMeasureTools:ee=!1,showUvCheckerButton:oe=!1,showExplodeControls:Bt=!1,cinematic:st,measurementUnit:He="m",enableXR:Je=!1,usdzUrl:Ot,arScaleMode:Ft="normalized",mobileHandoffUrl:Lt,showAnnotationNavigation:Pn=!0,showAnnotationOnHover:mn=!1,moveModeEnabled:me=!1,objectTransformSpace:et="world",enableKeyboardNavigation:Ie=!1,showViewGizmo:Re=!1}){let{isInsideEditor:ft,activeTab:ot,activeSubTab:ht}=qn(),Dt=ft&&ot==="scene"&&ht==="Lighting",Tn=gl(o,s),Z=Cn(()=>he??xo,[he]),[L,_]=Ne(null),H=Z.model.renderer==="uv-checker",K=oe?L??H:H,Y=Cn(()=>{let y=K?"uv-checker":H?"pbr":Z.model.renderer;return y===Z.model.renderer?Z:{...Z,model:{...Z.model,renderer:y}}},[H,Z,K]);gt(()=>{_(null)},[e,Z.model.renderer,oe,t]);let ie=Cn(()=>{if(P)return P;let y=Z.background;return y.enabled&&y.type==="color"?y.color:"#1c1c1d"},[P,Z]),re=Cn(()=>({dracoDecoderPath:At,ktx2TranscoderPath:Be,meshopt:rt}),[At,Be,rt]),tt=Cn(()=>Fu(Jt),[Jt]),se=ut(null),[xt,Le]=Ne(!1);gt(()=>{se.current&&(se.current.dollySpeed=Math.max(be,0))},[be]),gt(()=>{se.current&&(se.current.enabled=Me&&!xt)},[Me,xt]);let qe=ut(null),de=ut(new Map),ct=ut(null),Vt=ut(null),lt=ut(null),cn=ut({});gt(()=>()=>{for(let y of Object.values(cn.current))URL.revokeObjectURL(y)},[]);let Ge=ut({}),[,qt]=Ne(0),at=ye(()=>{qt(y=>y+1)},[]),Ua=ut({}),Ha=ut(null),Wn=ut(null),[Pr,Fl]=Ne(null),Vl=ye(y=>{Wn.current=y,Fl(y)},[]),$o=ut(new Set),$n=ut(null);gt(()=>{let y=Pr;if(!y||!Ie||!Me||me)return;let N=new Set(["w","a","s","d"," ","c"]),Q=new Set(["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"]),te=0,ue=Fe=>Fe.code==="Space"?" ":Fe.key.toLowerCase(),Oe=()=>{$o.current.clear(),te=0,$n.current!==null&&(cancelAnimationFrame($n.current),$n.current=null)},Zt=Fe=>{let Ct=se.current,Ze=$o.current;if(!Ct||Ze.size===0){$n.current=null,te=0;return}let On=te?Math.min((Fe-te)/1e3,.05):1/60;te=Fe;let Qt=Math.max(Ct.distance*.75,.01)*On;Ze.has("w")&&Ct.forward(Qt,!1),Ze.has("s")&&Ct.forward(-Qt,!1),Ze.has("a")&&Ct.truck(-Qt,0,!1),Ze.has("d")&&Ct.truck(Qt,0,!1),Ze.has(" ")&&Ct.truck(0,Qt,!1),Ze.has("c")&&Ct.truck(0,-Qt,!1),$n.current=requestAnimationFrame(Zt)},Bn=Fe=>{if(Fe.target!==y){Oe();return}if(Q.has(Fe.key)){let Ze=se.current;if(!Ze)return;Fe.preventDefault();let On=Math.PI/90,Qt=Math.max(Ze.distance*.05,.01);Fe.key==="ArrowUp"?Fe.shiftKey?Ze.forward(Qt,!0):Ze.rotate(0,-On,!0):Fe.key==="ArrowDown"?Fe.shiftKey?Ze.forward(-Qt,!0):Ze.rotate(0,On,!0):Fe.key==="ArrowLeft"?Ze.rotate(-On,0,!0):Ze.rotate(On,0,!0);return}let Ct=ue(Fe);N.has(Ct)&&(Fe.preventDefault(),$o.current.add(Ct),$n.current===null&&($n.current=requestAnimationFrame(Zt)))},_t=Fe=>{$o.current.delete(ue(Fe))};return y.addEventListener("keydown",Bn),y.addEventListener("keyup",_t),y.addEventListener("blur",Oe),()=>{y.removeEventListener("keydown",Bn),y.removeEventListener("keyup",_t),y.removeEventListener("blur",Oe),Oe()}},[Pr,Me,Ie,me]);let vt=ut(null),[Ga,ar]=Ne(l),[co,Xo]=Ne({}),[$i,Rn]=Ne(null),[Xi,Xn]=Ne(null),[Wa,Ul]=Ne(null),[Hl,$a]=Ne(null),[vn,Ki]=Ne(null),[gr,po]=Ne(null),dn=ut(null),ir=ut(!1),uo=ut(!1),Xa=ut(!!x);Xa.current=!!x;let sr=ut(null),[Ka,Ur]=Ne(!!e),[Ko,mo]=Ne(!e||!!Te||!!x),[Tr,Yi]=Ne(!1),[Gl,Ya]=Ne(!1),[Ji,Yo]=Ne(!1),[qi,Ja]=Ne(!1),[Zi,Wl]=Ne(null),[$l,Qi]=Ne(!1),[bo,es]=Ne({total:0,missing:0}),[Xl,qa]=Ne("Loading model..."),lr=ut({}),go=ye(()=>{let y=se.current;if(!y||sr.current)return;let N=y.getPosition(new Dn),Q=y.getTarget(new Dn);sr.current={position:[N.x,N.y,N.z],target:[Q.x,Q.y,Q.z]}},[]),[D,V]=Ne(!1),[ne,ge]=Ne(0),[Ce,Ut]=Ne(!1);gt(()=>{ge(0),Ut(!1)},[e,t]);let nt=Cn(()=>{let y=Z.cinematic,N=y?.enabled?{waypoints:y.waypoints,duration:y.duration,loop:y.loop,autoPlay:y.autoPlay}:null;return st===void 0?N&&(N.waypoints?.length??0)>=2?N:null:st===!1?null:st===!0?N??{}:{...N??{},...st}},[st,Z]),[ke,pn]=Ne(!1),[Xh,Jo]=Ne(!1),Kl=ut(!1);gt(()=>{pn(!1),Jo(!1),Kl.current=!1},[e,t]),gt(()=>{!nt?.autoPlay||Kl.current||Tr&&Ko&&!Ka&&(Kl.current=!0,pn(!0),Jo(!1))},[nt,Tr,Ko,Ka]);let{xrStore:fo,presenterRef:Kh,arSupported:Yl,vrSupported:$p,quickLookSupported:Xp,resolvedMobileHandoffUrl:ts,isMobileHandoffOpen:Kp,arOverlay:Yh,openMobileHandoff:Jh,closeMobileHandoff:Yp,openQuickLook:qh,handleARStateChange:Zh}=Hu({enableXR:Je,usdzUrl:Ot,mobileHandoffUrl:Lt}),[fr,Jp]=Ne(()=>he?.annotations??[]);gt(()=>{if(fr.length>0){let y=fr.reduce((N,Q)=>Math.max(N,Q.id),0);os.current=y}else os.current=0},[fr]);let[An,ns]=Ne(null),[Hr,rs]=Ne({title:"",description:""}),os=ut(0),[Qh,qp]=Ne(null),[Kn,qo]=Ne(-1),[Zp,as]=Ne(!1),Zo=ut(null),Nt=Cn(()=>[...fr].sort((y,N)=>y.id-N.id),[fr]),is=Cn(()=>Kn<0||Kn>=Nt.length?null:Nt[Kn],[Kn,Nt]),hr=ye(y=>{if(R!==void 0){f?.(y);return}qp(y?{annotation:y}:null)},[R,f]),Qo=ye(y=>{let N=se.current,Q=dn.current;if(!N)return;let te=new Dn,ue=de.current.get(y.id);ue?te.copy(ue):Q&&vS(y,Q,te)||te.set(y.worldPosition[0],y.worldPosition[1],y.worldPosition[2]),qe.current=null;let Oe=N.smoothTime;N.smoothTime=.6;let Zt=y.worldNormal;if(Q){let Bn=new kl().setFromObject(Q),_t=new Dn;Bn.getCenter(_t);let Fe=new Dn;Bn.getSize(Fe);let Ct=Fe.length()*.2,Ze;Zt?Ze=new Dn(Zt[0],Zt[1],Zt[2]):Ze=te.clone().sub(_t),Ze.lengthSq()<1e-6&&Ze.set(0,0,1),Ze.normalize();let On=Math.max(Ct*.6,.3),Qt=te.clone().add(Ze.multiplyScalar(On));N.setPosition(Qt.x,Qt.y,Qt.z,!0),y.anchorNodeName&&y.anchorLocalPosition&&(qe.current=Qt.clone().sub(te))}N.setTarget(te.x,te.y,te.z,!0),Zo.current&&clearTimeout(Zo.current),Zo.current=setTimeout(()=>{N.smoothTime=Oe,Zo.current=null},800),hr(y)},[hr]),e0=ye(()=>{Nt.length!==0&&(V(!0),qo(0),Qo(Nt[0]))},[Nt,Qo]),t0=ye(()=>{if(Nt.length===0||Kn<0)return;as(!0);let y=(Kn-1+Nt.length)%Nt.length;qo(y),Qo(Nt[y]),setTimeout(()=>as(!1),500)},[Kn,Nt,Qo]),n0=ye(()=>{if(Nt.length===0||Kn<0)return;if(Kn===Nt.length-1){if(V(!1),qo(-1),hr(null),se.current&&sr.current){let N=sr.current;se.current.setLookAt(N.position[0],N.position[1],N.position[2],N.target[0],N.target[1],N.target[2],!0)}return}as(!0);let y=Kn+1;qo(y),Qo(Nt[y]),setTimeout(()=>as(!1),500)},[Kn,Nt,Qo,hr]),r0=ye(()=>{if(V(!1),qo(-1),hr(null),se.current&&sr.current){let y=sr.current;se.current.setLookAt(y.position[0],y.position[1],y.position[2],y.target[0],y.target[1],y.target[2],!0)}},[hr]);gt(()=>{qo(-1),V(!1)},[Nt.length]),gt(()=>()=>{Zo.current&&clearTimeout(Zo.current)},[]),gt(()=>{is&&D&&hr(is)},[is,hr,D]),gt(()=>{if(he?.annotations===void 0)return;let y=he.annotations.map(N=>({...N,localPosition:N.localPosition??N.worldPosition}));Jp(y)},[he?.annotations]);let Za=ye(()=>{if(R!==void 0){f?.(null);return}qp(null)},[R,f]),Qa=R!==void 0?R:Qh?.annotation??null,ei=Cn(()=>Qa?fr.find(N=>N.id===Qa.id)??null:null,[Qa,fr]);gt(()=>{Qa&&!ei&&Za()},[Qa,ei,Za]);let ti=d!==void 0,bt=ti?l:Ga;lr.current=bt;let o0=Cn(()=>Object.entries(bt).map(([y,N])=>JSON.stringify([y,N.modelObjectId,N.transform??null])).sort().join(""),[bt]),{measureMode:ni,measureModeRef:a0,measurePoints:Qp,showDimensions:Jl,measureBox:eu,modelBounds:i0,refreshBounds:tu,clearMeasurements:s0,toggleMeasureMode:l0,toggleDimensions:c0,handleMeasurePointerDown:d0,handleMeasureClick:p0}=ju({canvasAreaRef:Wn,controlsRef:se,sceneRef:dn,modelUrl:e,modelRotation:Z.model.rotation,bindingTransformSignature:o0,modelLoaded:Tr}),{isDownloading:ql,downloadMenuOpen:u0,uvExportError:nu,toggleDownloadMenu:m0,handleDownloadMesh:b0,handleDownloadScreenshot:g0,handleDownloadUvLayout:f0}=_u({sceneRef:dn,materialRefs:Ua,rendererCaptureRef:lt,objectBindings:bt,downloadFilename:O}),ru=Cn(()=>Object.fromEntries(Object.entries(bt).filter(([,y])=>y.visible===!1).map(([y])=>[y,!0])),[bt]),Rr=Cn(()=>{let y=new WeakMap,N=new Map,Q=new Map;for(let[te,ue]of Object.entries(bt))y.set(ue,te),N.has(ue.id)||N.set(ue.id,te),Q.has(ue.modelObjectId)||Q.set(ue.modelObjectId,te);return{byReference:y,byId:N,byModelObjectId:Q}},[bt]),Gr=ye(y=>y?Rr.byReference.get(y)??Rr.byModelObjectId.get(y.modelObjectId)??Rr.byId.get(y.id)??null:null,[Rr]),Zl=i!==void 0,ri=Zl?i??null:Hl,xr=Gr(ri),Ql=xr?Ge.current[xr]??null:null,ou=Gr(Xe?c??Xi??Wa:null),h0=ou?Ge.current[ou]??null:null,x0=ye(y=>{Ul(y),b?.(y)},[b]),au=A&&ri!==null&&xr!==null,iu=(xr?bt[xr]:null)??ri;gt(()=>{ti||ar(l)},[ti,l]),gt(()=>{v?.(ru)},[ru,v]);let ea=ye(y=>{Zl||$a(y),u?.(y)},[Zl,u]),ta=ye(y=>{ti||ar(y),d?.(y)},[ti,d]),v0=ye(y=>{let N=xr;if(!N||!y)return;let Q=lr.current[N];Q&&ta({...lr.current,[N]:{...Q,transform:{...Q.transform,...y}}})},[ta,xr]),Ar=ye((y,N)=>bt[y]?y:N?Gr(N):Rr.byId.get(y)??Rr.byModelObjectId.get(y)??null,[bt,Gr,Rr]),oi=ye((y,N)=>{let Q=Ar(y),te=Q?bt[Q]:void 0;!Q||!te||ta({...bt,[Q]:{...te,style:N(te.style)}})},[Ar,bt,ta]),Yn=ye(()=>{if(vn){let y=co[vn.objectId]?.hex;y!==void 0&&(oi(vn.objectId,N=>({...N,material:{...N?.material,baseColor:y}})),Xo(N=>({...N,[vn.objectId]:{}})))}Ki(null)},[vn,co,oi]),su=ye(()=>{ea(null),Rn(null),Yn(),po(null)},[ea,Yn]),ec=ye((y,N,Q,te,ue)=>{let Oe=Ha.current,Zt=Wn.current,Bn=se.current?.camera;if(!Oe)return{objectId:y,x:24,y:24};let _t=Oe.getBoundingClientRect(),Fe=12,Ct=_t.width-N-Fe,Ze=_t.height-Q-Fe,On=Math.max(Fe,(_t.width-N)/2),Qt=Math.max(Fe,(_t.height-Q)/2),ra=Ar(y,te),xu=ra?Ge.current[ra]:null,ls=(oa,ho)=>ho<=Fe?Fe:Math.min(Math.max(oa,Fe),ho);if(Zt&&Bn&&xu){let oa=Zt.getBoundingClientRect(),ho=new Dn;new kl().setFromObject(xu).getCenter(ho),ho.project(Bn);let _0=(ho.x+1)/2*oa.width+(oa.left-_t.left),z0=(1-ho.y)/2*oa.height+(oa.top-_t.top);return{objectId:y,x:ls(_0+24,Ct),y:ls(z0-Q/2,Ze)}}let D0=typeof ue?.screenX=="number"?ue.screenX-_t.left:On,N0=typeof ue?.screenY=="number"?ue.screenY-_t.top:Qt;return{objectId:y,x:ls(D0,Ct),y:ls(N0,Ze)}},[Ar]),ss=ye(y=>{let{objectId:N,action:Q,binding:te}=y;switch(Rn(y),Q.id){case"toggle-visibility":{let ue=N;te?.modelObjectId&&(ue=Rr.byModelObjectId.get(te.modelObjectId)??ue);let Oe=bt[ue],Zt=Oe?.visible===!1;Oe&&ta({...bt,[ue]:{...Oe,visible:Zt}});break}case"change-color":Yn(),po(null),Xo(ue=>{let Oe=Ar(N,te)??N,Zt=ue[N]?.hex,Bn=bt[Oe]?.style?.material?.baseColor;return{...ue,[N]:{...ue[N],hex:Zt??Bn??"#ffffff"}}}),Ki(ec(N,225,250,te,y));break;case"change-material":Yn(),po(ec(N,300,320,te,y));break;default:break}B?.(y)},[ta,bt,ec,B,Yn,Ar,Rr]);gt(()=>{if(vn)return window.addEventListener("pointerdown",Yn),()=>window.removeEventListener("pointerdown",Yn)},[vn,Yn]),gt(()=>{if(!gr)return;let y=()=>po(null);return window.addEventListener("pointerdown",y),()=>window.removeEventListener("pointerdown",y)},[gr]),gt(()=>{if(!ei)return;let y=N=>{if(vt.current&&!vt.current.contains(N.target)){if(N.target.closest?.(".ri-annotationMarker"))return;Za()}};return document.addEventListener("mousedown",y),document.addEventListener("touchstart",y),()=>{document.removeEventListener("mousedown",y),document.removeEventListener("touchstart",y)}},[ei,Za]),gt(()=>{if(!An)return;let y=N=>{let Q=N.target;if(Q.closest?.(".ri-annotationPopup")||Q.closest?.("button, input, textarea, .ri-measureTools, .ri-xrTools, .ri-buttonContainer"))return;let te=Wn.current;!te||!te.contains(Q)||(ns(null),rs({title:"",description:""}))};return document.addEventListener("mousedown",y,!0),document.addEventListener("touchstart",y,!0),()=>{document.removeEventListener("mousedown",y,!0),document.removeEventListener("touchstart",y,!0)}},[An]);let lu=ye((y,N)=>{let Q=cn.current[y];Q&&URL.revokeObjectURL(Q),N.startsWith("blob:")?cn.current[y]=N:delete cn.current[y],oi(y,te=>({...te,material:{...te?.material,texture:{path:N}}}))},[oi]),y0=y=>{let N=y.target.files?.[0],Q=Vt.current;if(!N||!Q)return;let te=Ar(Q);te&&(S?S(N,te).then(ue=>lu(te,ue),ue=>console.error("onTextureUpload failed:",ue)):lu(te,URL.createObjectURL(N)),y.target.value="")},cu=y=>{Vt.current=y,ct.current?.click()},du=y=>{let N=Ar(y);if(!N)return;oi(N,te=>te?.material?.texture?{...te,material:{...te.material,texture:void 0}}:te);let Q=cn.current[N];Q&&(URL.revokeObjectURL(Q),delete cn.current[N])},tc=ut(m);tc.current=m;let cr=ye(()=>{let y=se.current;!y||!tc.current||tc.current({controls:y,scene:dn.current,objectBindings:lr.current,nodeRefs:Ge.current,homeCameraState:sr.current,captureImage:N=>gs(lt.current,N),invalidate:()=>lt.current?.invalidate()})},[]),na=ye(async(y=!1)=>{let N=se.current,Q=dn.current;if(!N||!Q)return!1;try{if(y){let te=N.getTarget(new Dn),Oe=N.getPosition(new Dn).clone().sub(te);Oe.lengthSq()<1e-6&&Oe.set(0,0,1),Oe.normalize();let Zt=new kl().setFromObject(Q).getBoundingSphere(new eS),Bn=Math.max(Zt.radius*10,20),_t=te.clone().add(Oe.multiplyScalar(Bn));await N.setLookAt(_t.x,_t.y,_t.z,te.x,te.y,te.z,!1)}return mo(!0),await Kg(N,()=>N.fitToBox(Q,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5})),await new Promise(te=>{let ue=performance.now(),Oe=()=>{N.active===!1||performance.now()-ue>8e3?(N.dispatchEvent({type:"update"}),lt.current?.invalidate(),te()):(lt.current?.invalidate(),setTimeout(Oe,100))};setTimeout(Oe,100)}),ir.current=!0,go(),cr(),!0}catch(te){return console.error("Fit scene error:",te),!1}},[go,cr]);gt(()=>{if(ir.current=!1,uo.current=!1,sr.current=null,dn.current=null,Yi(!1),Ya(!1),Yo(!1),es({total:0,missing:0}),qa("Loading model..."),!e){Ur(!1),mo(!0);return}Ur(!0),mo(!!Te||Xa.current);let y=!1,N=null,Q=ue=>{N=setTimeout(te,ue)},te=()=>{if(y||ir.current||uo.current)return;if(!se.current||!dn.current){Q(100);return}if(CS(dn.current,se.current),Cg(se.current)){ir.current=!0,go(),cr(),Ur(!1),mo(!0),lt.current?.invalidate();return}uo.current=!0,(Te?Te():Xa.current?Promise.resolve(!0):na(!0)).then(Oe=>{ir.current=Oe!==!1,ir.current?(go(),cr(),Ur(!1)):y||Q(100)}).catch(()=>{ir.current=!1,y||Q(100)}).finally(()=>{uo.current=!1})};return Q(50),()=>{y=!0,N&&clearTimeout(N)}},[go,na,e,cr,Te,t]),gt(()=>{if(!Rt)return;let y=Pr;if(!y)return;let N=null,Q=new ResizeObserver(()=>{!ir.current||uo.current||(N&&clearTimeout(N),N=setTimeout(()=>{na()},150))});return Q.observe(y),()=>{Q.disconnect(),N&&clearTimeout(N)}},[Pr,na,Rt]);let w0=ye(y=>{if(a0.current||(pn(!1),Yn(),po(null),Rn(null),ea(y),it||!wt))return;let N=se.current,Q=Gr(y),te=Q?Ge.current[Q]:null;N&&y.cameraState?.position&&y.cameraState?.target?(N.setPosition(y.cameraState.position[0],y.cameraState.position[1],y.cameraState.position[2],!0),N.setTarget(y.cameraState.target[0],y.cameraState.target[1],y.cameraState.target[2],!0)):N&&te&&N.fitToBox(te,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5}).catch(()=>{})},[ea,Yn,Gr,it,wt]),pu=ye(y=>{if(ea(y),it)return;let N=se.current,Q=Gr(y),te=Q?Ge.current[Q]:null;if(!N||!te)return;let ue=y.cameraState;ue?.position&&ue?.target?(N.setPosition(ue.position[0],ue.position[1],ue.position[2],!0),N.setTarget(ue.target[0],ue.target[1],ue.target[2],!0)):N.fitToBox(te,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5}).catch(()=>{})},[ea,Gr,it]);gt(()=>{cr()},[cr]);let uu=ye((y,N)=>{p?.(y,N),cr()},[cr,p]),mu=ye(y=>{dn.current=y,tu(y),es(wS(y));let N=ci(y);Wl(N>yo?N:null),Qi(!1),N>yo&&qa(`Preparing large model (${Math.round(N/1e6)}M triangles) \u2014 the first display can take a while on this device...`),Yi(!0),Ya(!1),Ja(!1),h?.(y),cr()},[cr,h,tu]),bu=ye(y=>{Ur(!1),mo(!0),Ya(!0),w?.(y)},[w]),C0=ye((y,N)=>{if(!Se)return;let Q={...Z,lighting:{...Z.lighting,lights:Z.lighting.lights.map(te=>te.id===y?{...te,position:N}:te)}};Se(Q)},[Z,Se]);gt(()=>{let y=dn.current;if(!Tr||!y){Yo(!1);return}let N=Object.entries(bt);if(N.length===0){Yo(!1);return}let Q=new Set(Object.keys(ba(y).nodesById)),te=N.some(([ue,Oe])=>!Q.has(Oe.modelObjectId??ue));Yo(te)},[Tr,bt]);let nc=ye(async()=>{if(Te){await Te();return}let y=se.current;if(!y)return;let N=sr.current;try{N?await Kg(y,()=>y.setLookAt(N.position[0],N.position[1],N.position[2],N.target[0],N.target[1],N.target[2],!0)):await na()}catch(Q){console.error("Reset camera error:",Q)}},[Te,na]),Mk=ye(()=>{Jo(!1),pn(!0)},[]),kk=ye(()=>{pn(!1)},[]),S0=ye(()=>{pn(!1),Jo(!0),setTimeout(()=>{nc()},100)},[nc]),M0=ye((y,N)=>{uu(y,N)},[uu]),k0=ye(y=>{if(ot!=="scene"||ht!=="Annotations"||y.target.closest("button, input, textarea, .ri-colorPicker, .ri-materialPicker, .ri-annotationPopup, .ri-annotationMarker, .ri-viewAnnotationPopup"))return;let Q=Wn.current,te=se.current?.camera,ue=dn.current;if(!Q||!te||!ue)return;let Oe=Q.getBoundingClientRect(),Zt=(y.clientX-Oe.left)/Oe.width*2-1,Bn=-((y.clientY-Oe.top)/Oe.height)*2+1,_t=new QC;_t.setFromCamera(new tS(Zt,Bn),te);let Fe=_t.intersectObject(ue,!0);if(Fe.length===0)return;let Ct=Fe[0],Ze=Ct.point,On=ue.worldToLocal(Ct.point.clone()),Qt=[0,0,1];if(Ct.face){let ra=Ct.face.normal.clone().transformDirection(Ct.object.matrixWorld).normalize();Qt=[ra.x,ra.y,ra.z]}ns({worldPosition:[Ze.x,Ze.y,Ze.z],localPosition:[On.x,On.y,On.z],worldNormal:Qt,anchor:xS(Ct),screenX:y.clientX-Oe.left,screenY:y.clientY-Oe.top}),rs({title:"",description:""})},[ot,ht]),gu=ye(()=>{if(!An||!Hr.title.trim())return;os.current+=1;let N={id:os.current,worldPosition:An.worldPosition,localPosition:An.localPosition,worldNormal:An.worldNormal,anchorNodeName:An.anchor?.anchorNodeName,anchorLocalPosition:An.anchor?.anchorLocalPosition,title:Hr.title.trim(),description:Hr.description},Q=[...fr,N];Jp(Q),k?.(Q),ns(null)},[An,Hr,fr,k]),rc=ye(()=>ns(null),[]),P0=ye(y=>{hr(y)},[hr]);if(Tn.status==="checking")return $("div",{className:"ri-viewer ri-viewer--license-checking",children:$(wo,{title:"Verifying License",message:"Checking your license key..."})});if(Tn.status==="invalid")return $("div",{className:"ri-viewer ri-viewer--license-invalid",children:$(wo,{tone:"error",title:"Invalid License",message:Tn.isLocalDomain?Tn.reason??"License has been revoked or has expired":"Failed to load. Please contact the site administrator."})});let fu=gr?Ar(gr.objectId):null,hu=fu?bt[fu]?.style?.material?.texture?.path:void 0,T0=Wn.current?.offsetWidth??600,R0=Wn.current?.offsetHeight??400,A0=350,B0=290,O0=An?Math.min(An.screenX+12,T0-A0-8):0,E0=An?Math.min(An.screenY,R0-B0-8):0,L0=W&&!!e&&!Gl&&(!Tr||!Ko||Ka),ai=Je&&(fo&&(Yl||$p)||Xp||!!ts),ii=y=>16+y*42;return Ae("div",{className:"ri-viewer",style:{background:ie},children:[Ae("div",{className:"ri-viewerLeft",ref:Ha,children:[j?j({isOpen:au,selectedObject:iu,currentAction:$i,onClose:su,onAction:ss}):$(Wd,{isOpen:au,selectedObject:iu,currentAction:$i,onClose:su,onAction:ss,renderActionExtra:y=>y==="change-color"&&vn?$(Id,{inline:!0,colorPicker:vn,onClose:Yn,itemMaterials:co,setItemMaterials:Xo}):y==="change-material"&&gr?$(Vd,{inline:!0,triggerFileUpload:cu,materialPopup:gr,textureUrl:hu,clearTexture:du}):null}),Ae("div",{className:`ri-canvasArea ${ni?"ri-canvasArea--measuring":""} ${Ko?"":"ri-canvasArea--positioning"} ${me?"ri-canvasArea--moveMode":""}`,ref:Vl,tabIndex:Ie?0:void 0,onDoubleClick:k0,onPointerDown:y=>{Ie&&Wn.current?.focus({preventScroll:!0}),d0(y)},onClick:p0,children:[Ji&&!qi&&Ae("div",{className:"ri-bindingsMismatchBanner",children:[$(np,{size:14,className:"ri-bindingsMismatchBanner__icon"}),$("span",{children:"Object bindings data don't match this model"}),$("button",{type:"button",className:"ri-bindingsMismatchBanner__dismiss",onClick:y=>{y.stopPropagation(),Ja(!0)},"aria-label":"Dismiss",children:$(rp,{size:12})})]}),Zi!==null&&!$l&&Ae("div",{className:`ri-largeModelBanner ${Ji&&!qi?"ri-largeModelBanner--offset":""}`,children:[$(np,{size:14,className:"ri-largeModelBanner__icon"}),Ae("span",{children:["Very large model (",Math.round(Zi/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:y=>{y.stopPropagation(),Qi(!0)},"aria-label":"Dismiss",children:$(rp,{size:12})})]}),Y.model.renderer==="uv-checker"&&bo.missing>0&&Ae("div",{className:"ri-uvCheckerBanner",role:"status",children:[$(np,{size:14,className:"ri-uvCheckerBanner__icon"}),Ae("span",{children:[bo.missing===bo.total?"UV Checker: this model has no UV0 coordinates.":`UV Checker: ${bo.missing} of ${bo.total} meshes have no UV0 coordinates.`," ","Missing UVs are shown in magenta."]})]}),$("input",{ref:ct,type:"file",accept:"image/png,image/jpeg,image/webp",className:"ri-hiddenInput",onChange:y0}),Ae(zc,{camera:x,backgroundColor:P,shadows:z&&Z.shadows.enabled,sceneConfig:Y,selectedObjectRef:Ql,hoveredObjectRef:h0,highlightOnHover:Xe,renderMode:Ke,maxDpr:tn,reduceGpuLoad:tt,xrStore:fo,rendererCaptureRef:lt,preserveDrawingBuffer:Ye,children:[C??Ae(Do,{children:[$(Vc,{lightingConfig:Z.lighting,shadowConfig:Z.shadows,shadowsEnabled:z,environmentRotation:Z.environment.rotation,environmentConfig:Z.environment,modelBounds:i0,objectBindings:bt,nodeRefs:Ge}),Dt&&Z.lighting.lights.map(y=>!y.visible||y.type==="none"||y.type==="hemisphere"||y.attachment?null:$(jg,{light:y,position:y.position,color:y.color,intensity:y.intensity,visible:y.visible,onPositionChange:N=>C0(y.id,N)},y.id))]}),$(jc,{controlsRef:se,onCameraChange:M0}),Re&&$(XC,{alignment:"top-right",margin:[80,80],renderPriority:2,onUpdate:()=>{se.current?.update(0),lt.current?.invalidate()},children:$(KC,{axisColors:["#ff3653","#8adb00","#2c8fff"],labelColor:"white"})}),me&&Ql&&xr&&$(tp,{node:Ql,space:et,onTransformChange:v0,onDraggingChange:y=>{Le(y),ri&&g?.(ri,y)}},xr),$(bs,{onLoadError:bu,children:$($C,{fallback:null,children:(()=>{let y=Ae(Do,{children:[t?$(Pd,{url:t,rotation:Y.model.rotation,errorTarget:n,cacheSize:a,onModelLoaded:mu,onLoadError:bu}):$(ed,{url:e,modelFormat:r,objectBindings:bt,selectedItem:xr,itemMaterials:co,onItemClick:w0,onItemHover:x0,onModelLoaded:mu,onAnimationsReady:M,nodeRefsOut:Ge,onNodeRefsChange:at,materialRefsOut:Ua,panelHoveredItem:c??Xi,sceneConfig:Y,zoomOnSelected:wt,highlightOnHover:Xe,decoderConfig:re,explodeFactor:ne,suspendBindingTransforms:xt}),$(Bd,{annotations:fr,sceneConfig:Z,activeAnnotation:ei,popupRef:vt,canvasRootRef:Wn,worldPositionsRef:de,modelLoaded:Tr,onAnnotationClick:P0,onCloseAnnotation:Za,hideCloseButton:D,showAnnotationOnHover:mn}),$(yS,{annotation:is,enabled:D,controlsRef:se,offsetRef:qe}),nt&&$(Ed,{controlsRef:se,sceneRef:dn,config:nt,playing:ke,resetOnPlay:Xh,onFinished:()=>{pn(!1),Jo(!1)},onUserInteract:()=>{pn(!1)}}),ee&&$(Od,{points:Qp,unit:He,box:eu,showDimensions:Jl})]});return fo?$(ag,{ref:Kh,box:eu,scaleMode:Ft,onARStateChange:Zh,children:y}):y})()})},t??e)]}),$(Ta,{visible:L0,message:Xl}),ai&&Ae("div",{className:"ri-xrTools",style:{top:`${ii(0)}px`},children:[!Yl&&Xp&&Ae("button",{type:"button",className:"ri-xrButton",onClick:qh,title:"View this model in AR with Apple Quick Look",children:[$(Wg,{size:16}),"View in AR"]}),ts&&Ae("button",{type:"button",className:"ri-xrButton",onClick:Jh,title:"Open this experience on a phone for AR","aria-haspopup":"dialog","aria-expanded":Kp,children:[$(dS,{size:16}),$("span",{children:"Open on phone"})]}),fo&&Yl&&Ae("button",{type:"button",className:"ri-xrButton",onClick:()=>fo.enterAR().catch(y=>{console.error("Failed to enter AR session:",y)}),title:"View this model in your space",children:[$(Xg,{size:16}),$("span",{className:"ri-xrButtonPrefix",children:"Enter"}),$("span",{children:"AR"})]}),fo&&$p&&Ae("button",{type:"button",className:"ri-xrButton",onClick:()=>fo.enterVR().catch(y=>{console.error("Failed to enter VR session:",y)}),title:"View this model in VR",children:[$(cS,{size:16}),$("span",{className:"ri-xrButtonPrefix",children:"Enter"}),$("span",{children:"VR"})]})]}),Yh,Kp&&ts&&$("div",{className:"ri-mobileHandoffBackdrop",onMouseDown:y=>{y.target===y.currentTarget&&Yp()},children:Ae("section",{className:"ri-mobileHandoffDialog",role:"dialog","aria-modal":"true","aria-labelledby":"ri-mobileHandoffTitle",children:[$("button",{type:"button",className:"ri-mobileHandoffClose",onClick:Yp,"aria-label":"Close phone handoff",children:$(rp,{size:18})}),$(Xg,{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:$(qC,{value:ts,size:208,level:"M",marginSize:4,title:"QR code to open this model on a phone"})})]})}),oe&&$("div",{className:"ri-uvCheckerTools",style:{top:`${ii(ai?1:0)}px`},children:$("button",{type:"button",className:`ri-measureButton ${K?"ri-measureButton--active":""}`,onClick:()=>_(y=>!(y??H)),title:K?"Disable UV checker":"Enable UV checker","aria-label":K?"Disable UV checker":"Enable UV checker","aria-pressed":K,children:$(fS,{size:16})})}),ee&&Ae("div",{className:"ri-measureTools",style:{top:`${ii((ai?1:0)+(oe?1:0))}px`},children:[$("button",{type:"button",className:`ri-measureButton ${ni?"ri-measureButton--active":""}`,onClick:l0,title:ni?"Stop measuring":"Measure distance","aria-pressed":ni,children:$(bS,{size:16})}),$("button",{type:"button",className:`ri-measureButton ${Jl?"ri-measureButton--active":""}`,onClick:c0,title:"Toggle bounding dimensions","aria-pressed":Jl,children:$(gS,{size:16})}),Qp.length>0&&$("button",{type:"button",className:"ri-measureButton",onClick:s0,title:"Clear measurements",children:$(oS,{size:16})}),ni&&$("span",{className:"ri-measureHint",children:"Click points on the model to measure"})]}),Bt&&Ae("div",{className:"ri-explodeTools",style:{top:`${ii((ai?1:0)+(oe?1:0)+(ee?1:0))}px`},children:[$("button",{type:"button",className:`ri-measureButton ${Ce||ne>0?"ri-measureButton--active":""}`,onClick:()=>Ut(y=>!y),title:"Exploded view","aria-pressed":Ce,children:$(pS,{size:16})}),Ce&&$("div",{className:"ri-explodeSlider",onPointerDown:y=>y.stopPropagation(),children:$("input",{type:"range",min:0,max:100,value:Math.round(ne*100),onChange:y=>ge(Number(y.target.value)/100),"aria-label":"Explode amount"})})]}),nt&&Ae("div",{className:"ri-cinematicTools",style:{top:`${ii((ai?1:0)+(oe?1:0)+(ee?1:0)+(Bt?1:0))}px`},children:[$("button",{type:"button",className:`ri-measureButton ${ke?"ri-measureButton--active":""}`,onClick:()=>{ke?pn(!1):(Jo(!1),pn(!0))},title:ke?"Pause cinematic":"Play cinematic","aria-pressed":ke,children:ke?$(mS,{size:16}):$(uS,{size:16})}),ke&&$("button",{type:"button",className:"ri-measureButton ri-measureButton--stop",onClick:S0,title:"Stop cinematic and reset camera",children:$($g,{size:16})})]}),(E||F||Pn&&Nt.length>0)&&Ae("div",{className:"ri-buttonContainer",children:[$("div",{className:"ri-tourControls",children:Pn&&Nt.length>0&&$(Do,{children:D?Ae(Do,{children:[Ae("button",{className:"ri-tourButton",onClick:t0,disabled:Zp||Nt.length===0||Kn<=0,title:"Previous annotation",children:[$(sS,{size:16}),$("span",{children:"Prev"})]}),$("button",{className:"ri-tourButton ri-tourButton--stop",onClick:r0,title:"Stop guided tour",children:$($g,{size:16})}),Ae("button",{className:"ri-tourButton ri-tourButton--next",onClick:n0,disabled:Zp||Nt.length===0,title:"Next annotation",children:[$("span",{children:"Next"}),$(lS,{size:16})]})]}):$("button",{className:"ri-navButtonSingle",onClick:e0,disabled:Nt.length===0,title:"Start guided tour",children:"Guided Tour"})})}),Ae("div",{className:"ri-rightControls",children:[E&&$("button",{className:"ri-resetButton",onClick:nc,title:"Reset camera view",children:$(iS,{})}),F&&Ae("div",{className:"ri-downloadWrapper",onPointerDown:y=>y.stopPropagation(),children:[u0&&Ae("div",{className:"ri-downloadMenu",children:[Ae("button",{className:"ri-downloadMenuItem",onClick:b0,disabled:ql||!dn.current,children:[$(Wg,{size:14}),"Download GLB"]}),$("div",{className:"ri-downloadMenuDivider"}),Ye&&Ae(Do,{children:[Ae("button",{className:"ri-downloadMenuItem",onClick:g0,disabled:!dn.current,children:[$(nS,{size:14}),"Download PNG"]}),$("div",{className:"ri-downloadMenuDivider"})]}),Ae("button",{className:"ri-downloadMenuItem",onClick:f0,disabled:!dn.current,children:[$(aS,{size:14}),"Download UV Layout"]}),nu&&$("div",{className:"ri-downloadMenuNotice",role:"status","aria-live":"polite",children:nu})]}),$("button",{className:"ri-downloadButton",onClick:m0,disabled:ql||!dn.current,title:"Download options",children:ql?Ae(Do,{children:[$("span",{className:"ri-downloadButton__spinner"}),"Exporting\u2026"]}):Ae(Do,{children:[$(rS,{size:15}),"Download"]})})]})]})]}),An&&Ae("div",{className:"ri-annotationPopup",style:{left:O0,top:E0},onPointerDown:y=>y.stopPropagation(),onClick:y=>y.stopPropagation(),children:[$("input",{autoFocus:!0,className:"ri-annotationInput",placeholder:"Title *",value:Hr.title,onChange:y=>rs(N=>({...N,title:y.target.value})),onKeyDown:y=>{y.key==="Enter"&&gu(),y.key==="Escape"&&rc()}}),$("textarea",{className:"ri-annotationTextarea",placeholder:"Description",value:Hr.description,onChange:y=>rs(N=>({...N,description:y.target.value})),onKeyDown:y=>{y.key==="Escape"&&rc()},rows:5}),Ae("div",{className:"ri-annotationActions",children:[$("button",{onClick:gu,className:`ri-annotationOkBtn ${Hr.title.trim()?"":"disabled"}`,disabled:!Hr.title.trim(),children:"OK"}),$("button",{onClick:rc,className:"ri-annotationCancelBtn",children:"Cancel"}),$("div",{className:"ri-annotationIcons"})]})]})]}),j&&vn&&$(Id,{colorPicker:vn,onClose:Yn,itemMaterials:co,setItemMaterials:Xo}),j&&gr&&$(Vd,{triggerFileUpload:cu,materialPopup:gr,textureUrl:hu,clearTexture:du})]}),I&&$("div",{className:"ri-viewerRight",children:T?T({objectBindings:bt,onAction:ss,onFocus:pu,onHover:Xn}):$($d,{objectBindings:bt,onAction:ss,onFocus:pu,onHover:Xn})}),U&&$(fg,{controlsRef:se,enabled:!0,opacity:xe,moveSensitivity:le,position:ae})]})}import{useCallback as un,useEffect as Wo,useMemo as Lp,useRef as jn,useState as $e}from"react";import{Redo2 as wh,Undo2 as Ch,Upload as Sh,ListRestart as Mh,X as gM,AlertTriangle as fM}from"lucide-react";import{useCallback as Nn,useRef as Da,useState as Yg}from"react";import{Vector3 as Jg}from"three";function qg(e){return[e.x,e.y,e.z]}function ro(e,t){let n=new Jg,a=new Jg;return t.getPosition(n),t.getTarget(a),{position:qg(n),target:qg(a),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 SS(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 zi(e,t,n=.6){let a=e.smoothTime;e.smoothTime=n;try{return await t()}finally{e.smoothTime=a}}function op(e={}){let t=Da(e);t.current=e;let n=Da(null),[a,r]=Yg(null),[o,s]=Yg(()=>({...e.presets})),l=Da(o);l.current=o;let i=Nn(C=>{r(x=>SS(x,C)?x:C)},[]),c=Nn((C,x)=>{i(ro(C,x))},[i]),d=Da(null),u=Da(null),b=Da(null),g=Nn(C=>{n.current=C;let x=ro(C.controls.camera,C.controls);i(x),C.scene!==u.current&&(u.current=C.scene,d.current=null,b.current=null),C.homeCameraState&&!d.current&&(d.current=C.homeCameraState);let{initialPosition:P,initialTarget:z,initialTransition:A=!1}=t.current;if((P||z)&&C.scene&&(P||C.homeCameraState)&&b.current!==C.controls){b.current=C.controls,C.homeCameraState||Ra(C.controls);let j=P??x.position,T=z??x.target;C.controls.setLookAt(j[0],j[1],j[2],T[0],T[1],T[2],A).then(()=>{if(n.current?.controls!==C.controls)return;let I=ro(C.controls.camera,C.controls);d.current={position:I.position,target:I.target},i(I)}).catch(()=>{})}},[i]),h=Nn(async()=>{let C=n.current,x=C?.controls;if(!x)return!1;try{let P=d.current;return P?await zi(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 zi(x,()=>x.fitToBox(C.scene,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5})):await zi(x,()=>x.reset(!0)),!0}catch{return!1}},[]),w=Nn(async()=>{let C=n.current;if(!C?.controls||!C.scene)return!1;try{return await zi(C.controls,()=>C.controls.fitToBox(C.scene,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5})),!0}catch{return!1}},[]),B=Nn(async C=>{let x=n.current;if(!x?.controls)return!1;let P=bn(x.objectBindings,C);if(!P)return!1;let z=x.nodeRefs[P];if(!z)return!1;try{return await zi(x.controls,()=>x.controls.fitToBox(z,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5})),!0}catch{return!1}},[]),v=Nn(async(C,x=!0)=>{let P=n.current?.controls;if(!P)return!1;try{return n.current?.homeCameraState||Ra(P),await P.setTarget(C[0],C[1],C[2],x),i(ro(P.camera,P)),!0}catch{return!1}},[i]),p=Nn(async(C,x=!0)=>{let P=n.current?.controls;if(!P)return!1;try{n.current?.homeCameraState||Ra(P);let z=[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&&z.push(P.rotateTo(C.azimuthAngle,C.polarAngle,x)),await Promise.all(z);let A=P.camera,j=!1;return C.fov!=null&&"fov"in A&&typeof A.fov=="number"&&(A.fov=C.fov,j=!0),C.zoom!=null&&"zoom"in A&&typeof A.zoom=="number"&&(A.zoom=C.zoom,j=!0),j&&"updateProjectionMatrix"in A&&A.updateProjectionMatrix(),i(ro(A,P)),!0}catch{return!1}},[i]),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 z=n.current?.controls;if(!z)return!1;try{return n.current?.homeCameraState||Ra(z),await z.rotateTo(C,x,P),i(ro(z.camera,z)),!0}catch{return!1}},[i]),k=Nn(async(C,x=!0)=>{let P=n.current?.controls;if(!P)return!1;try{return n.current?.homeCameraState||Ra(P),await P.dollyTo(C,x),i(ro(P.camera,P)),!0}catch{return!1}},[i]),R=Nn(C=>{let x=n.current?.controls,P=C.trim();if(!x||!P)return null;let z=ro(x.camera,x);return l.current={...l.current,[P]:z},s(A=>({...A,[P]:z})),i(z),z},[i]),f=Nn((C,x=!0)=>{let P=l.current[C];return P?p(P,x):Promise.resolve(!1)},[p]);return{cameraState:a,cameraPresets:o,resetView:h,focusObject:B,fitScene:w,setCameraTarget:v,setCameraState:m,lookAt:S,orbitTo:M,dollyTo:k,savePreset:R,goToPreset:f,handleCameraChange:c,handleViewerReady:g}}import{useCallback as Na,useEffect as MS,useRef as Zg,useState as No}from"react";function ap(){let e=Zg(null),[t,n]=No([]),a=Zg(null),[r,o]=No([]),[s,l]=No(null),[i,c]=No(!1),[d,u]=No(1),[b,g]=No(0),[h,w]=No(0);MS(()=>()=>{a.current?.()},[]);let B=Na(k=>{a.current?.(),e.current=k,n(k.clips),o(k.clipDetails??k.clips.map(f=>({sourceName:f,duration:0})));let R=k.getState?.()??{currentClip:null,isPlaying:!1,speed:1,time:0,duration:0};l(R.currentClip),c(R.isPlaying),u(R.speed),g(R.time),w(R.duration),k.subscribe?a.current=k.subscribe(f=>{l(f.currentClip),c(f.isPlaying),u(f.speed),g(f.time),w(f.duration)}):a.current=null},[]),v=Na(k=>{e.current?.play(k),l(k),c(!0)},[]),p=Na(()=>{e.current?.pause(),c(!1)},[]),m=Na(()=>{e.current?.stop(),l(null),c(!1),g(0)},[]),S=Na(k=>{e.current?.setSpeed(k),u(k)},[]),M=Na(k=>{e.current?.seek?.(k),g(k)},[]);return{clips:t,clipDetails:r,currentClip:s,isPlaying:i,speed:d,time:b,duration:h,play:v,pause:p,stop:m,setSpeed:S,seek:M,handleAnimationsReady:B}}import{useState as w2,useEffect as C2}from"react";import{useState as NS}from"react";import{ChevronDown as _S,ChevronLeft as zS,ChevronRight as jS,RotateCcw as IS}from"lucide-react";import{HexColorInput as FS,HexColorPicker as VS}from"react-colorful";import{useLayoutEffect as PS,useRef as ef,useState as tf}from"react";import{createPortal as TS}from"react-dom";import{ChevronDown as RS,Info as AS}from"lucide-react";import{HexColorInput as BS,HexColorPicker as OS}from"react-colorful";function _a(e){let t=e.replace("#","").match(/.{2}/g).map(a=>parseInt(a,16)/255).map(a=>a<=.03928?a/12.92:Math.pow((a+.055)/1.055,2.4));return .2126*t[0]+.7152*t[1]+.0722*t[2]>.179?"#000":"#fff"}import{useEffect as kS}from"react";function Qg(e,t,n){kS(()=>{if(!n)return;let a=Array.isArray(e)?e:[e],r=o=>{let s=o.target;a.some(i=>i.current?.contains(s))||t()};return document.addEventListener("pointerdown",r,!0),()=>{document.removeEventListener("pointerdown",r,!0)}},[e,t,n])}import{jsx as Ve,jsxs as Sn}from"react/jsx-runtime";function ip({anchorRef:e,onClose:t,children:n}){let a=ef(null),[r,o]=tf(null);return Qg([a,e],t,!0),PS(()=>{let s=e.current;if(!s)return;let l=s.getBoundingClientRect(),i=222,c=8,d=Math.min(Math.max(l.right-i,c),window.innerWidth-i-c),u=Math.min(l.bottom+6,window.innerHeight-200);o({top:u,left:d})},[e]),r?TS(Ve("div",{ref:a,className:"se-colorPickerPopover",style:{position:"fixed",top:r.top,left:r.left},children:n}),document.body):null}function ES(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 _o({title:e,children:t}){return Sn("section",{className:"se-section",children:[Ve("h3",{className:"se-sectionTitle",children:e}),Ve("div",{className:"se-sectionBody",children:t})]})}function _e({title:e,open:t,onToggle:n,trailing:a,children:r,disabled:o,tooltip:s}){let l=s?`${s}`:e;return Sn("section",{className:"se-panel",children:[Sn("button",{type:"button",className:"se-panelHeader",onClick:n,"aria-expanded":t,title:l,children:[Sn("span",{className:"se-panelHeaderMain",children:[Ve(RS,{size:16,className:`se-panelChevron ${t?"se-panelChevron--open":""}`}),Ve("span",{className:"se-panelTitle",children:e}),s?Ve("span",{className:"se-panelHelp",title:l,"aria-label":l,role:"img",onClick:i=>i.stopPropagation(),children:Ve(AS,{size:13})}):null]}),a?Ve("span",{className:"se-panelTrailing",onClick:i=>i.stopPropagation(),children:a}):null]}),t?Ve("div",{className:"se-panelBody",style:o?{opacity:.45,pointerEvents:"none"}:void 0,children:r}):null]})}function We({checked:e,onChange:t,label:n}){return Sn("label",{className:"se-switch","aria-label":n,children:[Ve("input",{type:"checkbox",checked:e,onChange:a=>t(a.target.checked)}),Ve("span",{className:"se-switchTrack",children:Ve("span",{className:"se-switchThumb"})})]})}function G({label:e,value:t,min:n,max:a,step:r,formatValue:o,onChange:s,disabled:l=!1}){return Sn("label",{className:`se-field ${l?"se-field--disabled":""}`,children:[Sn("span",{className:"se-fieldLabel",children:[e,Ve("span",{className:"se-fieldValue",children:o?o(t):t})]}),Ve("input",{className:"se-slider",type:"range",min:n,max:a,step:r,value:t,onChange:i=>s(Number(i.target.value)),disabled:l})]})}function Qe({label:e,checked:t,onChange:n}){return Sn("label",{className:"se-field se-fieldInline",children:[Ve("span",{className:"se-fieldLabel",children:e}),Ve("input",{type:"checkbox",className:"se-checkbox",checked:t,onChange:a=>n(a.target.checked)})]})}function Vn({label:e,value:t,options:n,onChange:a}){return Sn("label",{className:"se-field se-fieldInline",children:[Ve("span",{className:"se-fieldLabel",children:e}),Ve("select",{className:"se-select",value:t,onChange:r=>a(r.target.value),children:n.map(r=>Ve("option",{value:r,children:ES(r)},r))})]})}function Zn({label:e,value:t,onChange:n}){let[a,r]=tf(!1),o=ef(null);return Sn("div",{className:"se-field",children:[Sn("div",{className:"se-fieldInline",children:[Ve("span",{className:"se-fieldLabel",children:e}),Ve("span",{ref:o,style:{display:"inline-flex"},children:Ve(BS,{prefixed:!0,className:"se-swatch",onClick:()=>r(s=>!s),style:{background:t,color:_a(t)},color:t,onChange:n})})]}),a?Ve(ip,{anchorRef:o,onClose:()=>r(!1),children:Ve(OS,{color:t,onChange:n})}):null]})}function oo({label:e,value:t,min:n,max:a,step:r,onChange:o}){return Sn("div",{className:"se-field",children:[Ve("span",{className:"se-fieldLabel",children:e}),Ve("div",{className:"se-vectorRow",children:["X","Y","Z"].map((l,i)=>Sn("label",{className:"se-vectorAxis",children:[Ve("span",{children:l}),Ve("input",{type:"number",className:"se-numberInput",min:n,max:a,step:r,value:t[i],onChange:c=>{let d=[...t];d[i]=Number(c.target.value),o(d)}})]},l))})]})}function zo({label:e,value:t,min:n,max:a,step:r,onChange:o}){return Sn("div",{className:"se-field",children:[Ve("span",{className:"se-fieldLabel",children:e}),Ve("div",{className:"se-vectorRow",children:["X","Y"].map((l,i)=>Sn("label",{className:"se-vectorAxis",children:[Ve("span",{children:l}),Ve("input",{type:"number",className:"se-numberInput",min:n,max:a,step:r,value:t[i],onChange:c=>{let d=[...t];d[i]=Number(c.target.value),o(d)}})]},l))})]})}var nf={free:0,starter:1,growth:2};function rf(e){return e==="starter"||e==="growth"||e==="scale"?e==="scale"?"growth":e:"free"}function Vr(e,t){return nf[e]>=nf[t]}var of={free:"Free",starter:"Starter",growth:"Growth"};import{Lock as LS}from"lucide-react";import{jsx as DS,jsxs as af}from"react/jsx-runtime";function _n({requiredTier:e,feature:t}){return af("div",{className:"bb-tierLock",children:[DS(LS,{size:16}),af("p",{className:"bb-tierLockMessage",children:[t," requires the ",of[e]," plan or higher."]})]})}import{Fragment as sp,jsx as pe,jsxs as Gt}from"react/jsx-runtime";var US=["lit","unlit","normals"],HS=["color","image","environment"];function sf(e){let t=e%360;return t<0?t+360:t}function Tl({title:e,open:t,onToggle:n,children:a,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:[pe(_S,{size:16,className:`se-panelChevron ${t?"se-panelChevron--open":""}`}),pe("span",{className:"se-panelTitle",children:e})]}),r?pe("span",{className:"se-panelTrailing",onClick:o=>o.stopPropagation(),children:r}):null]}),t?pe("div",{className:"se-panelBody",children:a}):null]})}function lp({config:e,onChange:t}){let{model:n,camera:a,wireframe:r,background:o,environment:s}=e,{tier:l}=qn(),i=Vr(l,"starter"),[c,d]=NS({general:!0,camera:!0,wireframe:!1,background:!1}),u=p=>d(m=>({...m,[p]:!m[p]})),b=p=>t({...e,model:p}),g=p=>t({...e,camera:p}),h=p=>t({...e,wireframe:p}),w=p=>t({...e,background:p}),B=p=>t({...e,environment:p}),v=p=>{B({...s,source:"preset",preset:p})};return Gt("div",{className:"se-generalContent",children:[Gt(Tl,{title:"General",open:c.general,onToggle:()=>u("general"),children:[Gt("div",{className:"se-field",children:[Gt("div",{className:"se-fieldLabel",children:[pe("span",{children:"Straighten model"}),pe("button",{type:"button",className:"se-iconButton",onClick:()=>b({...n,rotation:[0,0,0]}),"aria-label":"Reset model rotation",children:pe(IS,{size:16})})]}),pe("div",{className:"se-axisStepperGrid",children:["X","Y","Z"].map((p,m)=>Gt("div",{className:"se-axisStepper",children:[pe("button",{type:"button",className:"se-axisStepperButton",onClick:()=>{let S=[...n.rotation];S[m]=sf(S[m]-90),b({...n,rotation:S})},"aria-label":`Rotate ${p} axis backward`,children:pe(zS,{size:16})}),pe("span",{className:"se-axisStepperLabel",children:p}),pe("button",{type:"button",className:"se-axisStepperButton",onClick:()=>{let S=[...n.rotation];S[m]=sf(S[m]+90),b({...n,rotation:S})},"aria-label":`Rotate ${p} axis forward`,children:pe(jS,{size:16})})]},p))})]}),pe(oo,{label:"Rotation",value:n.rotation,min:0,max:360,step:1,onChange:p=>b({...n,rotation:p})}),Gt("div",{className:"se-field",children:[pe("span",{className:"se-fieldLabel",children:"Renderer"}),pe("div",{className:"se-segmentedControl se-segmentedControl--renderer",children:yu.map(p=>pe("button",{type:"button",className:`se-segmentedOption ${n.renderer===p?"se-segmentedOption--active":""}`,onClick:()=>b({...n,renderer:p}),children:p==="uv-checker"?"UV CHECKER":p.toUpperCase()},p))})]}),pe(Vn,{label:"Shading",value:n.shading,options:US,onChange:p=>b({...n,shading:p})})]}),pe(Tl,{title:"Camera",open:c.camera,onToggle:()=>u("camera"),children:pe(G,{label:"Field Of View",value:a.fieldOfView,min:20,max:100,step:.1,formatValue:p=>`${p.toFixed(3)}\xB0`,onChange:p=>g({...a,fieldOfView:p})})}),pe(Tl,{title:"Wireframe",open:c.wireframe,onToggle:()=>u("wireframe"),trailing:Gt("label",{className:"se-switch","aria-label":"Toggle wireframe preview",children:[pe("input",{type:"checkbox",checked:i&&r.enabled,disabled:!i,onChange:p=>h({...r,enabled:p.target.checked})}),pe("span",{className:"se-switchTrack",children:pe("span",{className:"se-switchThumb"})})]}),children:i?Gt(sp,{children:[pe(G,{label:"Opacity",value:r.opacity,min:0,max:1,step:.01,onChange:p=>h({...r,opacity:p})}),pe(Zn,{label:"Wire color",value:r.color,onChange:p=>h({...r,color:p})})]}):pe(_n,{requiredTier:"starter",feature:"Wireframe preview"})}),pe(Tl,{title:"Background",open:c.background,onToggle:()=>u("background"),trailing:Gt("label",{className:"se-switch","aria-label":"Toggle scene background",children:[pe("input",{type:"checkbox",checked:o.enabled,onChange:p=>w({...o,enabled:p.target.checked})}),pe("span",{className:"se-switchTrack",children:pe("span",{className:"se-switchThumb"})})]}),children:o.enabled?Gt(sp,{children:[Gt("div",{className:"se-field",children:[pe("span",{className:"se-fieldLabel",children:"Background type"}),pe("div",{className:"se-segmentedControl",children:HS.map(p=>pe("button",{type:"button",className:`se-segmentedOption ${o.type===p?"se-segmentedOption--active":""}`,onClick:()=>w({...o,type:p}),children:p},p))})]}),o.type==="environment"?i?Gt(sp,{children:[Gt("div",{className:"se-field",children:[pe("span",{className:"se-fieldLabel",children:"Environment source"}),Gt("div",{className:"se-segmentedControl",children:[pe("button",{type:"button",className:`se-segmentedOption ${s.source==="preset"?"se-segmentedOption--active":""}`,onClick:()=>B({...s,source:"preset"}),children:"PRESET"}),pe("button",{type:"button",className:`se-segmentedOption ${s.source==="custom"?"se-segmentedOption--active":""}`,onClick:()=>B({...s,source:"custom"}),children:"CUSTOM"})]})]}),s.source==="preset"?pe(Vn,{label:"Environment preset",value:s.preset,options:wu,onChange:v}):Gt("label",{className:"se-field",children:[pe("span",{className:"se-fieldLabel",children:"Custom environment URL"}),pe("input",{type:"text",className:"se-textInput",placeholder:"https://example.com/environment.hdr",value:s.customEnvironmentUrl,onChange:p=>B({...s,customEnvironmentUrl:p.target.value})}),pe("span",{className:"bb-note",children:"Enter a HDR, EXR, JPG, JPEG, PNG, or WEBP URL."}),s.customEnvironmentUrl.trim()&&!cs(s.customEnvironmentUrl)?pe("span",{className:"bb-note",style:{color:"#fca5a5"},children:"Invalid image/HDRI URL."}):null]}),pe(G,{label:"Environment intensity",value:s.intensity,min:0,max:3,step:.05,onChange:p=>B({...s,intensity:p})})]}):pe(_n,{requiredTier:"starter",feature:"Environment backgrounds"}):null,o.type==="image"?Gt("label",{className:"se-field",children:[pe("span",{className:"se-fieldLabel",children:"Background image URL"}),pe("input",{type:"text",className:"se-textInput",placeholder:"https://example.com/background.jpg",value:o.imageUrl,onChange:p=>w({...o,imageUrl:p.target.value})})]}):null,o.type==="color"?Gt("div",{className:"se-field",children:[pe("span",{className:"se-fieldLabel",children:"Background color"}),pe("div",{className:"se-inlineColorPicker",children:pe(VS,{color:o.color,onChange:p=>w({...o,color:p})})}),pe("div",{className:"se-fieldInline",children:pe(FS,{prefixed:!0,className:"se-swatch",style:{background:o.color,color:_a(o.color)},color:o.color,onChange:p=>w({...o,color:p})})})]}):null]}):pe("div",{className:"se-placeholder",children:"Background rendering is disabled for this scene preset."})})]})}import{useState as WS}from"react";import{jsx as ce,jsxs as ji}from"react/jsx-runtime";function lf({pp:e,set:t,open:n,toggle:a}){let{ssao:r}=e;return ji(_e,{title:"SSAO",tooltip:"Adds soft contact shadows in corners, creases, and tight spaces.",open:n.ssao,onToggle:()=>a("ssao"),disabled:!r.enabled,trailing:ce(We,{checked:r.enabled,onChange:o=>t("ssao",{...r,enabled:o}),label:"Toggle SSAO"}),children:[ce(G,{label:"Samples",value:r.samples,min:1,max:64,step:1,onChange:o=>t("ssao",{...r,samples:o})}),ce(G,{label:"Rings",value:r.rings,min:1,max:12,step:1,onChange:o=>t("ssao",{...r,rings:o})}),ce(G,{label:"Intensity",value:r.intensity,min:0,max:20,step:.5,onChange:o=>t("ssao",{...r,intensity:o})}),ce(G,{label:"Radius",value:r.radius,min:.01,max:1,step:.01,onChange:o=>t("ssao",{...r,radius:o})}),ce(G,{label:"Bias",value:r.bias,min:0,max:.1,step:.001,onChange:o=>t("ssao",{...r,bias:o})}),ce(G,{label:"Luminance Influence",value:r.luminanceInfluence,min:0,max:1,step:.01,onChange:o=>t("ssao",{...r,luminanceInfluence:o})}),ce(G,{label:"Fade",value:r.fade,min:0,max:.1,step:.001,onChange:o=>t("ssao",{...r,fade:o})}),ce(G,{label:"Min Radius Scale",value:r.minRadiusScale,min:0,max:1,step:.01,onChange:o=>t("ssao",{...r,minRadiusScale:o})}),ce(G,{label:"World Distance Threshold",value:r.worldDistanceThreshold,min:0,max:100,step:.1,onChange:o=>t("ssao",{...r,worldDistanceThreshold:o})}),ce(G,{label:"World Distance Falloff",value:r.worldDistanceFalloff,min:0,max:20,step:.1,onChange:o=>t("ssao",{...r,worldDistanceFalloff:o})}),ce(G,{label:"World Proximity Threshold",value:r.worldProximityThreshold,min:0,max:100,step:.1,onChange:o=>t("ssao",{...r,worldProximityThreshold:o})}),ce(G,{label:"World Proximity Falloff",value:r.worldProximityFalloff,min:0,max:20,step:.1,onChange:o=>t("ssao",{...r,worldProximityFalloff:o})})]})}function cf({pp:e,set:t,open:n,toggle:a}){let{autofocus:r}=e;return ji(_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:()=>a("autofocus"),disabled:!r.enabled,trailing:ce(We,{checked:r.enabled,onChange:o=>t("autofocus",{...r,enabled:o}),label:"Toggle Autofocus"}),children:[ce(G,{label:"Focus Distance",value:r.focusDistance,min:0,max:50,step:.1,onChange:o=>t("autofocus",{...r,focusDistance:o})}),ce(G,{label:"Focus Range",value:r.focusRange,min:.1,max:50,step:.1,onChange:o=>t("autofocus",{...r,focusRange:o})}),ce(G,{label:"Focal Length",value:r.focalLength,min:0,max:1,step:.01,onChange:o=>t("autofocus",{...r,focalLength:o})}),ce(G,{label:"Bokeh Scale",value:r.bokehScale,min:0,max:20,step:.1,onChange:o=>t("autofocus",{...r,bokehScale:o})}),ce(oo,{label:"Target",value:r.target,min:-100,max:100,step:.1,onChange:o=>t("autofocus",{...r,target:o})}),ce(Qe,{label:"Mouse Follow",checked:r.mouse,onChange:o=>t("autofocus",{...r,mouse:o})}),ce(Qe,{label:"Manual Update",checked:r.manual,onChange:o=>t("autofocus",{...r,manual:o})}),ce(G,{label:"Debug",value:r.debug,min:0,max:1,step:.01,onChange:o=>t("autofocus",{...r,debug:o})}),ce(G,{label:"Smooth Time",value:r.smoothTime,min:0,max:2,step:.01,onChange:o=>t("autofocus",{...r,smoothTime:o})})]})}function df({pp:e,set:t,open:n,toggle:a}){let{godRays:r}=e;return ji(_e,{title:"God Rays",tooltip:"Creates light shafts that streak outward from a bright sun or light source.",open:n.godRays,onToggle:()=>a("godRays"),disabled:!r.enabled,trailing:ce(We,{checked:r.enabled,onChange:o=>t("godRays",{...r,enabled:o}),label:"Toggle GodRays"}),children:[ce(oo,{label:"Sun Position",value:r.sunPosition,min:-100,max:100,step:.1,onChange:o=>t("godRays",{...r,sunPosition:o})}),ce(G,{label:"Samples",value:r.samples,min:1,max:128,step:1,onChange:o=>t("godRays",{...r,samples:o})}),ce(G,{label:"Density",value:r.density,min:0,max:2,step:.01,onChange:o=>t("godRays",{...r,density:o})}),ce(G,{label:"Decay",value:r.decay,min:0,max:1,step:.01,onChange:o=>t("godRays",{...r,decay:o})}),ce(G,{label:"Weight",value:r.weight,min:0,max:2,step:.01,onChange:o=>t("godRays",{...r,weight:o})}),ce(G,{label:"Exposure",value:r.exposure,min:0,max:2,step:.01,onChange:o=>t("godRays",{...r,exposure:o})}),ce(G,{label:"Clamp Max",value:r.clampMax,min:0,max:2,step:.01,onChange:o=>t("godRays",{...r,clampMax:o})}),ce(Qe,{label:"Blur",checked:r.blur,onChange:o=>t("godRays",{...r,blur:o})}),ce(Vn,{label:"Kernel Size",value:r.kernelSize,options:si,onChange:o=>t("godRays",{...r,kernelSize:o})})]})}function pf({pp:e,set:t,open:n,toggle:a}){let{lensflare:r}=e;return ji(_e,{title:"Lens Flare",tooltip:"Adds camera flare artifacts and glow from a bright light source.",open:n.lensflare,onToggle:()=>a("lensflare"),disabled:!r.enabled,trailing:ce(We,{checked:r.enabled,onChange:o=>t("lensflare",{...r,enabled:o}),label:"Toggle Lensflare"}),children:[ce(oo,{label:"Lens Position",value:r.lensPosition,min:-100,max:100,step:.1,onChange:o=>t("lensflare",{...r,lensPosition:o})}),ce(G,{label:"Smooth Time",value:r.smoothTime,min:0,max:1,step:.01,onChange:o=>t("lensflare",{...r,smoothTime:o})}),ce(G,{label:"Glare Size",value:r.glareSize,min:0,max:1,step:.01,onChange:o=>t("lensflare",{...r,glareSize:o})}),ce(G,{label:"Flare Size",value:r.flareSize,min:0,max:.1,step:.001,onChange:o=>t("lensflare",{...r,flareSize:o})}),ce(G,{label:"Flare Speed",value:r.flareSpeed,min:0,max:.2,step:.001,onChange:o=>t("lensflare",{...r,flareSpeed:o})}),ce(G,{label:"Flare Shape",value:r.flareShape,min:0,max:.2,step:.001,onChange:o=>t("lensflare",{...r,flareShape:o})}),ce(Qe,{label:"Animated",checked:r.animated,onChange:o=>t("lensflare",{...r,animated:o})}),ce(Qe,{label:"Anamorphic",checked:r.anamorphic,onChange:o=>t("lensflare",{...r,anamorphic:o})}),ce(Zn,{label:"Color Gain",value:r.colorGain,onChange:o=>t("lensflare",{...r,colorGain:o})}),ce(G,{label:"Halo Scale",value:r.haloScale,min:0,max:2,step:.01,onChange:o=>t("lensflare",{...r,haloScale:o})}),ce(Qe,{label:"Secondary Ghosts",checked:r.secondaryGhosts,onChange:o=>t("lensflare",{...r,secondaryGhosts:o})}),ce(Qe,{label:"Additional Streaks",checked:r.aditionalStreaks,onChange:o=>t("lensflare",{...r,aditionalStreaks:o})}),ce(G,{label:"Ghost Scale",value:r.ghostScale,min:0,max:1,step:.01,onChange:o=>t("lensflare",{...r,ghostScale:o})}),ce(G,{label:"Opacity",value:r.opacity,min:0,max:1,step:.01,onChange:o=>t("lensflare",{...r,opacity:o})}),ce(Qe,{label:"Star Burst",checked:r.starBurst,onChange:o=>t("lensflare",{...r,starBurst:o})})]})}function uf({pp:e,set:t,open:n,toggle:a}){let{depthOfField:r}=e;return ji(_e,{title:"Depth Of Field",tooltip:"Blurs areas that sit away from the focal plane for a camera-like look.",open:n.depthOfField,onToggle:()=>a("depthOfField"),disabled:!r.enabled,trailing:ce(We,{checked:r.enabled,onChange:o=>t("depthOfField",{...r,enabled:o}),label:"Toggle DepthOfField"}),children:[ce(G,{label:"Focus Distance",value:r.focusDistance,min:0,max:50,step:.1,onChange:o=>t("depthOfField",{...r,focusDistance:o})}),ce(G,{label:"Focus Range",value:r.focusRange,min:.1,max:50,step:.1,onChange:o=>t("depthOfField",{...r,focusRange:o})}),ce(G,{label:"Focal Length",value:r.focalLength,min:0,max:1,step:.01,onChange:o=>t("depthOfField",{...r,focalLength:o})}),ce(G,{label:"Bokeh Scale",value:r.bokehScale,min:0,max:20,step:.1,onChange:o=>t("depthOfField",{...r,bokehScale:o})})]})}import{jsx as Ee,jsxs as za}from"react/jsx-runtime";var GS=["linear","reinhard","aces"];function mf({pp:e,set:t,open:n,toggle:a}){let{colorAverage:r}=e;return Ee(_e,{title:"Color Average",tooltip:"Blends the frame toward a single average color for a washed-out stylized look.",open:n.colorAverage,onToggle:()=>a("colorAverage"),disabled:!r.enabled,trailing:Ee(We,{checked:r.enabled,onChange:o=>t("colorAverage",{...r,enabled:o}),label:"Toggle ColorAverage"}),children:Ee("div",{className:"se-placeholder",children:"Averages the frame color using the docs default blend mode."})})}function bf({pp:e,set:t,open:n,toggle:a}){let{brightnessContrast:r}=e;return za(_e,{title:"Brightness Contrast",tooltip:"Raises or lowers overall brightness and contrast across the scene.",open:n.brightnessContrast,onToggle:()=>a("brightnessContrast"),disabled:!r.enabled,trailing:Ee(We,{checked:r.enabled,onChange:o=>t("brightnessContrast",{...r,enabled:o}),label:"Toggle BrightnessContrast"}),children:[Ee(G,{label:"Brightness",value:r.brightness,min:-1,max:1,step:.01,onChange:o=>t("brightnessContrast",{...r,brightness:o})}),Ee(G,{label:"Contrast",value:r.contrast,min:-1,max:1,step:.01,onChange:o=>t("brightnessContrast",{...r,contrast:o})})]})}function gf({pp:e,set:t,open:n,toggle:a}){let{hueSaturation:r}=e;return za(_e,{title:"Hue Saturation",tooltip:"Shifts the hue and saturation to tint the whole image.",open:n.hueSaturation,onToggle:()=>a("hueSaturation"),disabled:!r.enabled,trailing:Ee(We,{checked:r.enabled,onChange:o=>t("hueSaturation",{...r,enabled:o}),label:"Toggle HueSaturation"}),children:[Ee(G,{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})}),Ee(G,{label:"Saturation",value:r.saturation,min:-1,max:1,step:.01,onChange:o=>t("hueSaturation",{...r,saturation:o})})]})}function ff({pp:e,set:t,open:n,toggle:a}){let{vignette:r}=e;return za(_e,{title:"Vignette",tooltip:"Darkens the edges of the screen so the center feels more focused.",open:n.vignette,onToggle:()=>a("vignette"),disabled:!r.enabled,trailing:Ee(We,{checked:r.enabled,onChange:o=>t("vignette",{...r,enabled:o}),label:"Toggle Vignette"}),children:[Ee(G,{label:"Offset",value:r.offset,min:0,max:1,step:.01,onChange:o=>t("vignette",{...r,offset:o})}),Ee(G,{label:"Darkness",value:r.darkness,min:0,max:1,step:.01,onChange:o=>t("vignette",{...r,darkness:o})}),Ee(Qe,{label:"Eskil",checked:r.eskil,onChange:o=>t("vignette",{...r,eskil:o})})]})}function hf({pp:e,set:t,open:n,toggle:a}){let{bloom:r}=e;return za(_e,{title:"Bloom",tooltip:"Makes bright areas glow and bleed softly into nearby pixels.",open:n.bloom,onToggle:()=>a("bloom"),disabled:!r.enabled,trailing:Ee(We,{checked:r.enabled,onChange:o=>t("bloom",{...r,enabled:o}),label:"Toggle Bloom"}),children:[Ee(G,{label:"Threshold",value:r.luminanceThreshold,min:0,max:1,step:.01,onChange:o=>t("bloom",{...r,luminanceThreshold:o})}),Ee(G,{label:"Smoothing",value:r.luminanceSmoothing,min:0,max:1,step:.01,onChange:o=>t("bloom",{...r,luminanceSmoothing:o})}),Ee(G,{label:"Intensity",value:r.intensity,min:0,max:3,step:.05,onChange:o=>t("bloom",{...r,intensity:o})}),Ee(Qe,{label:"Mipmap Blur",checked:r.mipmapBlur,onChange:o=>t("bloom",{...r,mipmapBlur:o})}),Ee(G,{label:"Radius",value:r.radius,min:0,max:1,step:.01,onChange:o=>t("bloom",{...r,radius:o})}),Ee(G,{label:"Levels",value:r.levels,min:1,max:16,step:1,onChange:o=>t("bloom",{...r,levels:o})})]})}function xf({pp:e,set:t,open:n,toggle:a}){let{toneMapping:r}=e;return za(_e,{title:"Tone Mapping",tooltip:"Remaps HDR lighting to screen output and controls exposure style.",open:n.toneMapping,onToggle:()=>a("toneMapping"),disabled:!r.enabled,trailing:Ee(We,{checked:r.enabled,onChange:o=>t("toneMapping",{...r,enabled:o}),label:"Toggle ToneMapping"}),children:[za("div",{className:"se-field",children:[Ee("span",{className:"se-fieldLabel",children:"Mode"}),Ee("div",{className:"se-segmentedControl",children:GS.map(o=>Ee("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))})]}),Ee(G,{label:"Resolution",value:r.resolution,min:64,max:4096,step:64,onChange:o=>t("toneMapping",{...r,resolution:o})}),Ee(G,{label:"White Point",value:r.whitePoint,min:0,max:16,step:.01,onChange:o=>t("toneMapping",{...r,whitePoint:o})}),Ee(G,{label:"Middle Grey",value:r.middleGrey,min:0,max:1,step:.01,onChange:o=>t("toneMapping",{...r,middleGrey:o})}),Ee(G,{label:"Min Luminance",value:r.minLuminance,min:0,max:1,step:.01,onChange:o=>t("toneMapping",{...r,minLuminance:o})}),Ee(G,{label:"Average Luminance",value:r.averageLuminance,min:0,max:4,step:.01,onChange:o=>t("toneMapping",{...r,averageLuminance:o})}),Ee(G,{label:"Adaptation Rate",value:r.adaptationRate,min:0,max:10,step:.01,onChange:o=>t("toneMapping",{...r,adaptationRate:o})}),Ee(G,{label:"Exposure",value:r.exposure,min:0,max:3,step:.01,onChange:o=>t("toneMapping",{...r,exposure:o})})]})}function vf({pp:e,set:t,open:n,toggle:a}){let{sepia:r}=e;return Ee(_e,{title:"Sepia",tooltip:"Adds a warm vintage brown tint to the entire image.",open:n.sepia,onToggle:()=>a("sepia"),disabled:!r.enabled,trailing:Ee(We,{checked:r.enabled,onChange:o=>t("sepia",{...r,enabled:o}),label:"Toggle Sepia"}),children:Ee(G,{label:"Intensity",value:r.intensity,min:0,max:1,step:.01,onChange:o=>t("sepia",{...r,intensity:o})})})}import{jsx as we,jsxs as ja}from"react/jsx-runtime";function yf({pp:e,set:t,open:n,toggle:a}){let{dotScreen:r}=e;return ja(_e,{title:"Dot Screen",tooltip:"Overlays a halftone dot pattern for a printed or retro look.",open:n.dotScreen,onToggle:()=>a("dotScreen"),disabled:!r.enabled,trailing:we(We,{checked:r.enabled,onChange:o=>t("dotScreen",{...r,enabled:o}),label:"Toggle DotScreen"}),children:[we(G,{label:"Angle",value:r.angle,min:0,max:Math.PI*2,step:.01,formatValue:o=>`${o.toFixed(2)} rad`,onChange:o=>t("dotScreen",{...r,angle:o})}),we(G,{label:"Scale",value:r.scale,min:.1,max:10,step:.05,onChange:o=>t("dotScreen",{...r,scale:o})})]})}function wf({pp:e,set:t,open:n,toggle:a}){let{glitch:r}=e;return ja(_e,{title:"Glitch",tooltip:"Introduces digital distortion, tearing, and scan noise.",open:n.glitch,onToggle:()=>a("glitch"),disabled:!r.enabled,trailing:we(We,{checked:r.enabled,onChange:o=>t("glitch",{...r,enabled:o}),label:"Toggle Glitch"}),children:[we(Vn,{label:"Mode",value:r.mode,options:Cu,onChange:o=>t("glitch",{...r,mode:o})}),we(zo,{label:"Delay",value:r.delay,min:0,max:10,step:.01,onChange:o=>t("glitch",{...r,delay:o})}),we(zo,{label:"Duration",value:r.duration,min:0,max:5,step:.01,onChange:o=>t("glitch",{...r,duration:o})}),we(zo,{label:"Strength",value:r.strength,min:0,max:2,step:.01,onChange:o=>t("glitch",{...r,strength:o})}),we(zo,{label:"Chromatic Aberration Offset",value:r.chromaticAberrationOffset,min:0,max:.02,step:1e-4,onChange:o=>t("glitch",{...r,chromaticAberrationOffset:o})}),we(G,{label:"Columns",value:r.columns,min:0,max:.5,step:.001,onChange:o=>t("glitch",{...r,columns:o})}),we(G,{label:"Ratio",value:r.ratio,min:0,max:1,step:.01,onChange:o=>t("glitch",{...r,ratio:o})})]})}function Cf({pp:e,set:t,open:n,toggle:a}){let{grid:r}=e;return ja(_e,{title:"Grid",tooltip:"Adds a visual grid overlay that feels retro or debug-like.",open:n.grid,onToggle:()=>a("grid"),disabled:!r.enabled,trailing:we(We,{checked:r.enabled,onChange:o=>t("grid",{...r,enabled:o}),label:"Toggle Grid"}),children:[we(G,{label:"Scale",value:r.scale,min:.1,max:10,step:.05,onChange:o=>t("grid",{...r,scale:o})}),we(G,{label:"Line Width",value:r.lineWidth,min:0,max:1,step:.01,onChange:o=>t("grid",{...r,lineWidth:o})})]})}function Sf({pp:e,set:t,open:n,toggle:a}){let{chromaticAberration:r}=e;return ja(_e,{title:"Chromatic Aberration",tooltip:"Separates color channels slightly to mimic lens fringing.",open:n.chromaticAberration,onToggle:()=>a("chromaticAberration"),disabled:!r.enabled,trailing:we(We,{checked:r.enabled,onChange:o=>t("chromaticAberration",{...r,enabled:o}),label:"Toggle ChromaticAberration"}),children:[we(G,{label:"Offset X",value:r.offsetX,min:0,max:.02,step:1e-4,onChange:o=>t("chromaticAberration",{...r,offsetX:o})}),we(G,{label:"Offset Y",value:r.offsetY,min:0,max:.02,step:1e-4,onChange:o=>t("chromaticAberration",{...r,offsetY:o})}),we(Qe,{label:"Radial Modulation",checked:r.radialModulation,onChange:o=>t("chromaticAberration",{...r,radialModulation:o})}),we(G,{label:"Modulation Offset",value:r.modulationOffset,min:0,max:1,step:.01,onChange:o=>t("chromaticAberration",{...r,modulationOffset:o})})]})}function Mf({pp:e,set:t,open:n,toggle:a}){let{noise:r}=e;return ja(_e,{title:"Noise",tooltip:"Adds film grain or static noise to the rendered image.",open:n.noise,onToggle:()=>a("noise"),disabled:!r.enabled,trailing:we(We,{checked:r.enabled,onChange:o=>t("noise",{...r,enabled:o}),label:"Toggle Noise"}),children:[we(G,{label:"Amount",value:r.opacity,min:0,max:1,step:.01,onChange:o=>t("noise",{...r,opacity:o})}),we(Qe,{label:"Premultiply",checked:r.premultiply,onChange:o=>t("noise",{...r,premultiply:o})})]})}function kf({pp:e,set:t,open:n,toggle:a}){let{scanline:r}=e;return we(_e,{title:"Scan Line",tooltip:"Draws horizontal CRT-style scan lines over the frame.",open:n.scanline,onToggle:()=>a("scanline"),disabled:!r.enabled,trailing:we(We,{checked:r.enabled,onChange:o=>t("scanline",{...r,enabled:o}),label:"Toggle Scanline"}),children:we(G,{label:"Density",value:r.density,min:0,max:10,step:.25,onChange:o=>t("scanline",{...r,density:o})})})}function Pf({pp:e,set:t,open:n,toggle:a}){let{pixelation:r}=e;return we(_e,{title:"Pixelation",tooltip:"Reduces detail into larger pixels for a blocky stylized effect.",open:n.pixelation,onToggle:()=>a("pixelation"),disabled:!r.enabled,trailing:we(We,{checked:r.enabled,onChange:o=>t("pixelation",{...r,enabled:o}),label:"Toggle Pixelation"}),children:we(G,{label:"Granularity",value:r.granularity,min:0,max:20,step:1,onChange:o=>t("pixelation",{...r,granularity:o})})})}function Tf({pp:e,set:t,open:n,toggle:a}){let{ramp:r}=e;return ja(_e,{title:"Ramp",tooltip:"Adds a screen-space color gradient, or masks effects earlier in the stack.",open:n.ramp,onToggle:()=>a("ramp"),disabled:!r.enabled,trailing:we(We,{checked:r.enabled,onChange:o=>t("ramp",{...r,enabled:o}),label:"Toggle Ramp"}),children:[we(Vn,{label:"Ramp Type",value:r.rampType,options:Su,onChange:o=>t("ramp",{...r,rampType:o})}),we(zo,{label:"Ramp Start",value:r.rampStart,min:0,max:1,step:.01,onChange:o=>t("ramp",{...r,rampStart:o})}),we(zo,{label:"Ramp End",value:r.rampEnd,min:0,max:1,step:.01,onChange:o=>t("ramp",{...r,rampEnd:o})}),we(Zn,{label:"Start Color",value:r.startColor,onChange:o=>t("ramp",{...r,startColor:o})}),we(Zn,{label:"End Color",value:r.endColor,onChange:o=>t("ramp",{...r,endColor:o})}),!r.rampMask&&we(G,{label:"Gradient Opacity",value:r.opacity??.5,min:0,max:1,step:.01,onChange:o=>t("ramp",{...r,opacity:o})}),we(G,{label:"Bias",value:r.rampBias,min:0,max:1,step:.01,onChange:o=>t("ramp",{...r,rampBias:o})}),we(G,{label:"Gain",value:r.rampGain,min:0,max:1,step:.01,onChange:o=>t("ramp",{...r,rampGain:o})}),we(Qe,{label:"Mask Earlier Effects",checked:r.rampMask,onChange:o=>t("ramp",{...r,rampMask:o})}),we(Qe,{label:"Invert",checked:r.rampInvert,onChange:o=>t("ramp",{...r,rampInvert:o})})]})}import{jsx as St,jsxs as Of}from"react/jsx-runtime";function Rf({pp:e,set:t,open:n,toggle:a}){let{outline:r}=e;return Of(_e,{title:"Outline",tooltip:"Draws a visible edge around the selected object binding.",open:n.outline,onToggle:()=>a("outline"),disabled:!r.enabled,trailing:St(We,{checked:r.enabled,onChange:o=>t("outline",{...r,enabled:o}),label:"Toggle Outline"}),children:[St("div",{className:"se-placeholder",children:"Outlines the currently selected object binding in the model editor."}),St(G,{label:"Selection Layer",value:r.selectionLayer,min:0,max:20,step:1,onChange:o=>t("outline",{...r,selectionLayer:o})}),St(G,{label:"Edge Strength",value:r.edgeStrength,min:0,max:10,step:.1,onChange:o=>t("outline",{...r,edgeStrength:o})}),St(G,{label:"Pulse Speed",value:r.pulseSpeed,min:0,max:10,step:.1,onChange:o=>t("outline",{...r,pulseSpeed:o})}),St(Zn,{label:"Visible Edge Color",value:r.visibleEdgeColor,onChange:o=>t("outline",{...r,visibleEdgeColor:o})}),St(Zn,{label:"Hidden Edge Color",value:r.hiddenEdgeColor,onChange:o=>t("outline",{...r,hiddenEdgeColor:o})}),St(Vn,{label:"Kernel Size",value:r.kernelSize,options:si,onChange:o=>t("outline",{...r,kernelSize:o})}),St(Qe,{label:"Blur",checked:r.blur,onChange:o=>t("outline",{...r,blur:o})}),St(Qe,{label:"X-Ray",checked:r.xRay,onChange:o=>t("outline",{...r,xRay:o})})]})}function Af({pp:e,set:t,open:n,toggle:a}){let{selectiveBloom:r}=e;return Of(_e,{title:"Selective Bloom",tooltip:"Applies bloom only to objects assigned to the selected layer.",open:n.selectiveBloom,onToggle:()=>a("selectiveBloom"),disabled:!r.enabled,trailing:St(We,{checked:r.enabled,onChange:o=>t("selectiveBloom",{...r,enabled:o}),label:"Toggle SelectiveBloom"}),children:[St("div",{className:"se-placeholder",children:"Applies bloom to the currently selected object binding."}),St(G,{label:"Selection Layer",value:r.selectionLayer,min:0,max:20,step:1,onChange:o=>t("selectiveBloom",{...r,selectionLayer:o})}),St(G,{label:"Intensity",value:r.intensity,min:0,max:5,step:.05,onChange:o=>t("selectiveBloom",{...r,intensity:o})}),St(G,{label:"Threshold",value:r.luminanceThreshold,min:0,max:1,step:.01,onChange:o=>t("selectiveBloom",{...r,luminanceThreshold:o})}),St(G,{label:"Smoothing",value:r.luminanceSmoothing,min:0,max:1,step:.01,onChange:o=>t("selectiveBloom",{...r,luminanceSmoothing:o})}),St(Vn,{label:"Kernel Size",value:r.kernelSize,options:si,onChange:o=>t("selectiveBloom",{...r,kernelSize:o})}),St(Qe,{label:"Mipmap Blur",checked:r.mipmapBlur,onChange:o=>t("selectiveBloom",{...r,mipmapBlur:o})}),St(Qe,{label:"Inverted",checked:r.inverted,onChange:o=>t("selectiveBloom",{...r,inverted:o})}),St(Qe,{label:"Ignore Background",checked:r.ignoreBackground,onChange:o=>t("selectiveBloom",{...r,ignoreBackground:o})})]})}function Bf({pp:e,set:t,open:n,toggle:a}){let{smaa:r}=e;return St(_e,{title:"SMAA",tooltip:"Reduces jagged edges with subpixel anti-aliasing.",open:n.smaa,onToggle:()=>a("smaa"),trailing:St(We,{checked:r.enabled,onChange:o=>t("smaa",{...r,enabled:o}),label:"Toggle SMAA"}),children:St("div",{className:"se-placeholder",children:"Subpixel Morphological Anti-Aliasing smooths jagged edges in post-process."})})}import{jsx as Mt,jsxs as $S}from"react/jsx-runtime";function cp({config:e,onChange:t}){let[n,a]=WS({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=i=>a(c=>({...c,[i]:!c[i]})),o=e.postProcessing,l={pp:o,set:(i,c)=>t({...e,postProcessing:{...o,[i]:c}}),open:n,toggle:r};return $S("div",{className:"se-generalContent",children:[Mt(lf,{...l}),Mt(cf,{...l}),Mt(mf,{...l}),Mt(yf,{...l}),Mt(wf,{...l}),Mt(df,{...l}),Mt(Cf,{...l}),Mt(pf,{...l}),Mt(Rf,{...l}),Mt(Af,{...l}),Mt(bf,{...l}),Mt(gf,{...l}),Mt(uf,{...l}),Mt(Sf,{...l}),Mt(ff,{...l}),Mt(hf,{...l}),Mt(xf,{...l}),Mt(Mf,{...l}),Mt(vf,{...l}),Mt(kf,{...l}),Mt(Pf,{...l}),Mt(Tf,{...l}),Mt(Bf,{...l})]})}import{useState as Ef,useSyncExternalStore as XS}from"react";import{Eye as KS,EyeOff as YS,Plus as JS,Trash2 as qS}from"lucide-react";import{Fragment as Lf,jsx as ve,jsxs as Un}from"react/jsx-runtime";var ZS=["512","1024","2048","4096"],Df={none:"None",directional:"Direction",point:"Point",spot:"Spot",hemisphere:"Hemi"};function QS({index:e,light:t,selected:n,onSelect:a,onToggleVisible:r}){return Un("div",{className:`se-lightRow ${n?"se-lightRow--active":""}`,onClick:a,children:[Un("span",{className:"se-lightRowLabel",children:[e+1,": ",Df[t.type]]}),ve("button",{type:"button",className:"se-iconButton","aria-label":t.visible?"Hide light":"Show light",onClick:o=>{o.stopPropagation(),r()},children:t.visible?ve(KS,{size:14}):ve(YS,{size:14})})]})}function e2(){return{id:crypto.randomUUID(),type:"directional",color:"#ffffff",intensity:1,position:[5,10,5],attachedToCamera:!1,castShadow:!1,shadowBias:-5e-4,visible:!0}}function dp({config:e,onChange:t}){let[n,a]=Ef({lights:!0,shadows:!1,groundShadows:!1,environment:!1,envShadow:!1}),r=XS(Qd,wl),[o,s]=Ef(e.lighting.lights[0]?.id??null),l=r??o,i=f=>{s(f),Ni(f)},c=f=>a(C=>({...C,[f]:!C[f]})),{tier:d}=qn(),u=Vr(d,"starter"),{lighting:b,shadows:g,groundShadows:h,environment:w}=e,B=f=>t({...e,lighting:f}),v=f=>t({...e,shadows:f}),p=f=>t({...e,groundShadows:f}),m=f=>t({...e,environment:f}),S=(f,C)=>{B({...b,lights:b.lights.map(x=>x.id===f?{...x,...C}:x)})},M=b.lights.find(f=>f.id===l)??null,k=()=>{let f=e2();B({...b,lights:[...b.lights,f]}),i(f.id)},R=()=>{if(!M)return;let f=b.lights.filter(C=>C.id!==M.id);B({...b,lights:f}),i(f[0]?.id??null)};return Un("div",{className:"se-generalContent",children:[Un(_e,{title:"Lights",open:n.lights,onToggle:()=>c("lights"),children:[ve("div",{className:"se-lightList",children:b.lights.map((f,C)=>ve(QS,{index:C,light:f,selected:f.id===l,onSelect:()=>i(f.id),onToggleVisible:()=>S(f.id,{visible:!f.visible})},f.id))}),Un("div",{className:"se-lightActions",children:[ve("button",{type:"button",className:"se-iconButton",onClick:k,title:"Add light",children:ve(JS,{size:14})}),M&&b.lights.length>1&&ve("button",{type:"button",className:"se-iconButton",onClick:R,title:"Remove selected light",children:ve(qS,{size:14})})]}),M?Un("div",{className:"se-lightProps",children:[Un("div",{className:"se-field",children:[ve("span",{className:"se-fieldLabel",children:"Type"}),ve("div",{className:"se-segmentedControl",style:{gridAutoColumns:"1fr"},children:vu.map(f=>ve("button",{type:"button",className:`se-segmentedOption ${M.type===f?"se-segmentedOption--active":""}`,onClick:()=>S(M.id,{type:f}),children:Df[f]},f))})]}),ve(Zn,{label:"Color",value:M.color,onChange:f=>S(M.id,{color:f})}),ve(G,{label:"Intensity",value:M.intensity,min:0,max:10,step:.1,onChange:f=>S(M.id,{intensity:f})}),M.type!=="hemisphere"&&M.type!=="none"&&ve(oo,{label:"Position",value:M.position,min:-100,max:100,step:.05,onChange:f=>S(M.id,{position:f})}),M.type==="spot"&&Un(Lf,{children:[ve(G,{label:"Angle",value:M.angle??Math.PI/6,min:0,max:Math.PI/2,step:.01,formatValue:f=>`${Math.round(f*180/Math.PI)}\xB0`,onChange:f=>S(M.id,{angle:f})}),ve(G,{label:"Penumbra",value:M.penumbra??.2,min:0,max:1,step:.01,onChange:f=>S(M.id,{penumbra:f})}),ve(G,{label:"Distance",value:M.distance??0,min:0,max:100,step:.5,onChange:f=>S(M.id,{distance:f})}),ve(G,{label:"Decay",value:M.decay??2,min:0,max:4,step:.1,onChange:f=>S(M.id,{decay:f})})]}),ve(Qe,{label:"Attached to camera",checked:M.attachedToCamera,onChange:f=>S(M.id,{attachedToCamera:f})}),ve(Qe,{label:"Cast shadows",checked:M.castShadow,onChange:f=>S(M.id,{castShadow:f})}),ve(G,{label:"Shadow bias",value:M.shadowBias,min:-.01,max:.01,step:1e-4,onChange:f=>S(M.id,{shadowBias:f})})]}):null]}),Un(_e,{title:"Shadows",open:n.shadows,onToggle:()=>c("shadows"),disabled:!g.enabled,trailing:ve(We,{checked:g.enabled,onChange:f=>v({...g,enabled:f}),label:"Toggle shadows"}),children:[ve(Vn,{label:"Map size",value:String(g.mapSize),options:ZS,onChange:f=>v({...g,mapSize:Number(f)})}),ve(G,{label:"Bias",value:g.bias,min:-.01,max:.01,step:1e-4,onChange:f=>v({...g,bias:f})}),ve(G,{label:"Normal bias",value:g.normalBias,min:0,max:.2,step:.01,onChange:f=>v({...g,normalBias:f})}),ve(G,{label:"Radius (softness)",value:g.radius,min:0,max:20,step:.5,onChange:f=>v({...g,radius:f})})]}),Un(_e,{title:"Ground Shadows",open:n.groundShadows,onToggle:()=>c("groundShadows"),disabled:!h.enabled,trailing:ve(We,{checked:h.enabled,onChange:f=>p({...h,enabled:f}),label:"Toggle ground shadows"}),children:[Un("div",{className:"se-field",children:[ve("span",{className:"se-fieldLabel",children:"Mode"}),ve("div",{className:"se-segmentedControl",style:{gridAutoColumns:"1fr"},children:["shadowCatcher"].map(f=>ve("button",{type:"button",className:`se-segmentedOption ${h.mode===f?"se-segmentedOption--active":""}`,onClick:()=>p({...h,mode:f}),children:f==="shadowCatcher"?"Shadow Catcher":"Baked AO"},f))})]}),h.mode==="bakedAO"&&ve("div",{className:"se-placeholder",children:"Requires pre-baked AO textures \u2014 not yet available."}),ve(G,{label:"Intensity",value:h.intensity,min:0,max:1,step:.01,onChange:f=>p({...h,intensity:f})}),ve(G,{label:"Border fade",value:h.borderFade,min:0,max:10,step:.1,onChange:f=>p({...h,borderFade:f})}),ve(G,{label:"Height",value:h.height,min:-5,max:5,step:.1,onChange:f=>p({...h,height:f})}),ve(G,{label:"Size",value:h.size,min:1,max:50,step:.5,onChange:f=>p({...h,size:f})})]}),ve(_e,{title:"Environment",open:n.environment,onToggle:()=>c("environment"),children:u?Un(Lf,{children:[ve(G,{label:"Orientation",value:w.rotation,min:0,max:360,step:1,formatValue:f=>`${f}\xB0`,onChange:f=>m({...w,rotation:f})}),ve(G,{label:"Brightness",value:w.intensity,min:0,max:3,step:.05,onChange:f=>m({...w,intensity:f})}),Un(_e,{title:"Shadow",open:n.envShadow,onToggle:()=>c("envShadow"),trailing:ve(We,{checked:w.shadowLight.enabled,onChange:f=>m({...w,shadowLight:{...w.shadowLight,enabled:f}}),label:"Toggle environment shadow light"}),disabled:!w.shadowLight.enabled,children:[ve(G,{label:"Light intensity",value:w.shadowLight.intensity,min:0,max:20,step:.1,onChange:f=>m({...w,shadowLight:{...w.shadowLight,intensity:f}})}),ve(G,{label:"Shadow bias",value:w.shadowLight.bias,min:-.01,max:.01,step:1e-4,onChange:f=>m({...w,shadowLight:{...w.shadowLight,bias:f}})})]})]}):ve(_n,{requiredTier:"starter",feature:"Environment lighting"})})]})}import{useMemo as t2,useState as n2}from"react";import{ChevronDown as r2,Pause as o2,Play as a2,Square as i2,Trash2 as s2}from"lucide-react";import{jsx as ze,jsxs as kt}from"react/jsx-runtime";function l2(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),a=(t%60).toFixed(1).padStart(4,"0");return`${n}:${a}`}function Nf(e){let t=Number.isFinite(e)&&e>0?e:0;if(t<60)return`${t.toFixed(1)}s`;let n=Math.floor(t/60),a=(t%60).toFixed(1).padStart(4,"0");return`${n}:${a}`}function c2(e){return Number.isFinite(e)?Math.min(3,Math.max(.1,Number(e.toFixed(2)))):1}function pp({config:e,onChange:t,clipDetails:n,currentClip:a,isPlaying:r,time:o,play:s,pause:l,stop:i,setSpeed:c,seek:d}){let[u,b]=n2(!1),g=t2(()=>new Map(n.map(f=>[f.sourceName,f.duration])),[n]),h=e.animations.clips.filter(f=>!f.hidden),w=e.animations.clips.filter(f=>f.hidden),B=(f,C=e.animations.autoplayClip)=>{t({...e,animations:{clips:f(e.animations.clips),autoplayClip:C}})},v=(f,C)=>{B(x=>x.map(P=>P.sourceName===f?C(P):P))},p=(f,C)=>{v(f,x=>({...x,loopMode:C}))},m=(f,C)=>{let x=c2(C);v(f,P=>({...P,speed:x})),a===f&&c(x)},S=(f,C)=>{v(f,x=>({...x,displayName:C}))},M=f=>{let C=e.animations.autoplayClip===f?null:f;t({...e,animations:{...e.animations,autoplayClip:C}})},k=f=>{B(C=>C.map(x=>x.sourceName===f?{...x,hidden:!0}:x),e.animations.autoplayClip===f?null:e.animations.autoplayClip),a===f&&i()},R=f=>{B(C=>C.map(x=>x.sourceName===f?{...x,hidden:!1}:x))};return e.animations.clips.length===0?ze(_o,{title:"Animations",children:ze("div",{className:"se-helperCard",children:"Upload a model with embedded animations to manage playback, naming, autoplay, and per-clip speed here."})}):kt(_o,{title:"Animations",children:[h.length===0&&ze("div",{className:"se-helperCard",children:ze("span",{children:"Preview clips directly in the viewer, choose one optional autoplay animation, and use soft delete to hide clips without modifying the GLB."})}),h.length===0?ze("div",{className:"se-placeholder",children:"All animations are currently removed. Restore a clip below to make it available again."}):ze("div",{className:"se-animationList",children:h.map(f=>{let C=a===f.sourceName,x=g.get(f.sourceName)??0;return kt("article",{className:`se-animationCard ${C?"se-animationCard--active":""}`,children:[kt("div",{className:"se-animationHeader",children:[kt("div",{className:"se-animationHeading",children:[kt("div",{className:"se-animationTitleRow",children:[ze("span",{className:"se-animationStatus",children:C?r?"Playing":"Paused":"Ready"}),e.animations.autoplayClip===f.sourceName?ze("span",{className:"se-animationBadge",children:"Autoplay"}):null]}),ze("div",{className:"se-animationSource",children:f.sourceName})]}),ze("button",{type:"button",className:"se-animationDangerButton",onClick:()=>k(f.sourceName),title:"Remove animation",children:ze(s2,{size:16})})]}),kt("div",{className:"se-field",children:[ze("span",{className:"se-fieldLabel",children:"Display name"}),ze("input",{className:"se-textInput",value:f.displayName,onChange:z=>S(f.sourceName,z.target.value),placeholder:"Animation name"})]}),kt("div",{className:"se-animationMeta",children:[ze("span",{children:l2(x)}),ze("span",{children:f.loopMode==="once"?"Play once":"Looping"}),kt("span",{children:[f.speed.toFixed(2),"x"]})]}),kt("div",{className:"se-animationButtonRow",children:[(()=>{let z=C&&r;return ze("button",{type:"button",className:"se-animationButton se-animationButton--icon",onClick:()=>z?l():s(f.sourceName),"aria-label":z?"Pause":"Play",title:z?"Pause":"Play",children:z?ze(o2,{size:16}):ze(a2,{size:16})})})(),ze("button",{type:"button",className:"se-animationButton se-animationButton--icon",onClick:i,disabled:!C,"aria-label":"Stop",title:"Stop",children:ze(i2,{size:16})})]}),kt("div",{className:"se-animationSeekRow",children:[ze("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:z=>d(Number(z.target.value)),"aria-label":"Seek"}),kt("span",{className:"se-animationSeekTime",children:[Nf(C?Math.min(o,x):0)," / ",Nf(x)]})]}),kt("div",{className:"se-animationGrid",children:[kt("label",{className:"se-field",children:[ze("span",{className:"se-fieldLabel",children:"Loop mode"}),kt("select",{className:"se-select",value:f.loopMode,onChange:z=>p(f.sourceName,z.target.value),children:[ze("option",{value:"repeat",children:"Loop"}),ze("option",{value:"once",children:"Play Once"})]})]}),kt("label",{className:"se-field",children:[kt("span",{className:"se-fieldLabel",children:["Speed",kt("span",{className:"se-fieldValue",children:[f.speed.toFixed(2),"x"]})]}),kt("div",{className:"se-animationSpeedRow",children:[ze("input",{className:"se-slider",type:"range",min:.1,max:3,step:.1,value:f.speed,onChange:z=>m(f.sourceName,Number(z.target.value))}),ze("input",{className:"se-numberInput se-animationSpeedInput",type:"number",min:.1,max:3,step:.1,value:f.speed,onChange:z=>m(f.sourceName,Number(z.target.value))})]})]})]}),ze("button",{type:"button",className:`se-animationAutoplayButton ${e.animations.autoplayClip===f.sourceName?"se-animationAutoplayButton--active":""}`,onClick:()=>M(f.sourceName),children:e.animations.autoplayClip===f.sourceName?"Disable autoplay":"Set as autoplay"})]},f.sourceName)})}),w.length>0?kt("section",{className:"se-removedAnimations",children:[ze("button",{type:"button",className:"se-panelHeader",onClick:()=>b(f=>!f),children:kt("span",{className:"se-panelHeaderMain",children:[ze(r2,{size:16,className:`se-panelChevron ${u?"se-panelChevron--open":""}`}),kt("span",{className:"se-panelTitle",children:["Removed Animations (",w.length,")"]})]})}),u?ze("div",{className:"se-removedAnimationList",children:w.map(f=>kt("div",{className:"se-removedAnimationRow",children:[kt("div",{children:[ze("div",{className:"se-removedAnimationName",children:f.displayName||f.sourceName}),ze("div",{className:"se-animationSource",children:f.sourceName})]}),ze("button",{type:"button",className:"se-animationButton",onClick:()=>R(f.sourceName),children:"Restore"})]},f.sourceName))}):null]}):null]})}import{useState as _f}from"react";import{Pencil as d2,Trash2 as p2}from"lucide-react";import{jsx as an,jsxs as Qn}from"react/jsx-runtime";function up({config:e,onChange:t}){let[n,a]=_f(null),[r,o]=_f({title:"",description:""}),s=e.annotations,l=u=>{a(u),o({title:u.title,description:u.description||""})},i=()=>{if(!n||!r.title.trim())return;let u=s.map(b=>b.id===n.id?{...b,title:r.title.trim(),description:r.description||""}:b);t({...e,annotations:u}),a(null),o({title:"",description:""})},c=u=>{if(window.confirm("Delete this annotation?")){let g=s.filter(h=>h.id!==u).map((h,w)=>({...h,id:w+1}));t({...e,annotations:g}),a(null),o({title:"",description:""})}},d=()=>{a(null),o({title:"",description:""})};return Qn(_o,{title:"Annotations",children:[e.annotations.length===0?an("div",{className:"bb-emptyAnnotations",children:"No annotations yet. Double-click on the model to add one."}):an("div",{className:"bb-annotationsList",children:e.annotations.map(u=>Qn("div",{className:"bb-annotationCard",children:[Qn("div",{className:"bb-annotationHeader",children:[Qn("div",{className:"bb-annotationBadge",children:["#",u.id]}),Qn("div",{className:"bb-annotationActions",children:[an("button",{className:"bb-annotationAction bb-annotationAction--edit",onClick:()=>l(u),title:"Edit annotation",children:an(d2,{size:16})}),an("button",{className:"bb-annotationAction bb-annotationAction--delete",onClick:()=>c(u.id),title:"Delete annotation",children:an(p2,{size:16})})]})]}),an("div",{className:"bb-annotationTitle",children:u.title}),u.description&&an("div",{className:"bb-annotationDescription",children:u.description}),Qn("div",{className:"bb-annotationPosition",children:["Position: [",u.worldPosition[0].toFixed(2),","," ",u.worldPosition[1].toFixed(2),","," ",u.worldPosition[2].toFixed(2),"]"]})]},u.id))}),n&&an("div",{className:"bb-editAnnotationOverlay",onClick:d,children:Qn("div",{className:"bb-editAnnotationPopup",onClick:u=>u.stopPropagation(),children:[Qn("div",{className:"bb-editAnnotationHeader",children:[an("h3",{className:"bb-editAnnotationTitle",children:"Edit Annotation"}),an("button",{className:"bb-editAnnotationClose",onClick:d,children:"\xD7"})]}),Qn("div",{className:"bb-editAnnotationBody",children:[Qn("div",{className:"bb-field",children:[an("label",{className:"bb-label",children:"Title"}),an("input",{className:"bb-input",value:r.title,onChange:u=>o({...r,title:u.target.value}),placeholder:"Enter annotation title"})]}),Qn("div",{className:"bb-field",children:[an("label",{className:"bb-label",children:"Description"}),an("textarea",{className:"bb-textarea",value:r.description,onChange:u=>o({...r,description:u.target.value}),placeholder:"Enter annotation description",rows:3})]}),Qn("div",{className:"bb-editAnnotationActions",children:[an("button",{className:"bb-button",onClick:d,children:"Cancel"}),an("button",{className:"bb-button bb-button--primary",onClick:i,disabled:!r.title.trim(),children:"Save"}),an("button",{className:"bb-button bb-button--danger",onClick:()=>c(n.id),children:"Delete"})]})]})]})})]})}import{useState as u2,useCallback as jo}from"react";import{ArrowDown as m2,ArrowUp as b2,MapPin as g2,Plus as f2,Trash2 as h2,Settings as x2}from"lucide-react";import{Fragment as y2,jsx as mt,jsxs as Wt}from"react/jsx-runtime";var v2={enabled:!0,waypoints:[],loop:!0,autoPlay:!1},Io=3.5;function mp({config:e,onChange:t,cameraState:n,onPreviewWaypoint:a}){let r=e.cinematic??v2,{waypoints:o}=r,s=jo((v,p)=>{if(v.length<2)return 0;let m=0;for(let S=0;S<v.length-1;S++){let M=v[S].segmentDuration??Io;m+=M}return p&&v.length>1&&(m+=v[v.length-1].segmentDuration??Io),Math.max(m,0)},[]),l=jo(v=>{t({...e,cinematic:{...r,...v}})},[e,r,t]),i=jo(()=>{if(!n)return;let v={position:[...n.position],target:[...n.target],...n.azimuthAngle!=null?{azimuthAngle:n.azimuthAngle}:{},...n.polarAngle!=null?{polarAngle:n.polarAngle}:{},segmentDuration:Io},p=[...o,v],m=s(p,r.loop);l({waypoints:p,duration:m})},[n,o,r.loop,s,l]),c=jo(v=>{let p=o.filter((S,M)=>M!==v),m=s(p,r.loop);l({waypoints:p,duration:m})},[o,r.loop,s,l]),d=jo((v,p)=>{let m=v+p;if(m<0||m>=o.length)return;let S=[...o];[S[v],S[m]]=[S[m],S[v]];let M=s(S,r.loop);l({waypoints:S,duration:M})},[o,r.loop,s,l]),u=jo((v,p)=>{let m=o.map((M,k)=>k===v?{...M,...p}:M),S=s(m,r.loop);l({waypoints:m,duration:S})},[o,r.loop,s,l]),[b,g]=u2(!1),h=o.some(v=>v.segmentDuration!==void 0),w=jo(v=>v>=o.length-1?Io:o[v]?.segmentDuration??Io,[o]),B=o.length>=2;return Wt(_o,{title:"Cinematic Camera",children:[mt("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."}),Wt("button",{type:"button",className:"bb-button bb-button--primary se-cinematicAdd",onClick:i,disabled:!n,title:"Capture the current camera view as a waypoint",children:[mt(f2,{size:15}),"Add waypoint from current view"]}),Wt("div",{className:"se-customizeToggle",children:[Wt("label",{className:"se-toggleLabel",children:[mt("input",{type:"checkbox",checked:b,onChange:v=>g(v.target.checked)}),mt(x2,{size:14}),mt("span",{children:"Customize durations between waypoints"})]}),b&&Wt("span",{className:"se-toggleHint",children:["Set duration for each segment between waypoints: 1\u21922, 2\u21923, etc. Default: ",Io,"s"]})]}),o.length===0?mt("div",{className:"bb-emptyAnnotations",children:"No waypoints yet. Position the camera and add your first one."}):Wt(y2,{children:[mt("div",{className:"se-waypointList",children:o.map((v,p)=>{let m=w(p),S=p===o.length-1,M=v.segmentDuration!==void 0&&v.segmentDuration!==Io;return Wt("div",{children:[Wt("div",{className:"se-waypointCard",children:[mt("div",{className:"se-waypointBadge",children:p+1}),Wt("div",{className:"se-waypointBody",children:[Wt("div",{className:"se-waypointCoords",children:["pos [",v.position.map(k=>k.toFixed(1)).join(", "),"]"]}),Wt("div",{className:"se-waypointCoords",children:["look [",v.target.map(k=>k.toFixed(1)).join(", "),"]"]}),b&&!S&&Wt("div",{className:`se-customBadge ${M?"se-customBadge--custom":"se-customBadge--default"}`,children:[m.toFixed(1),"s",!M&&" (default)"]})]}),Wt("div",{className:"se-waypointActions",children:[mt("button",{className:"se-waypointAction",onClick:()=>a?.(v),title:"Fly camera to this waypoint",disabled:!a,children:mt(g2,{size:15})}),mt("button",{className:"se-waypointAction",onClick:()=>d(p,-1),title:"Move up",disabled:p===0,children:mt(b2,{size:15})}),mt("button",{className:"se-waypointAction",onClick:()=>d(p,1),title:"Move down",disabled:S,children:mt(m2,{size:15})}),mt("button",{className:"se-waypointAction se-waypointAction--delete",onClick:()=>c(p),title:"Delete waypoint",children:mt(h2,{size:15})})]})]}),b&&!S&&Wt("div",{className:"se-segmentBetween",children:[Wt("div",{className:"se-segmentLabel",children:[p+1," \u2192 ",p+2,!v.segmentDuration&&" (default)"]}),Wt("div",{className:"se-segmentControls",children:[mt("span",{className:"se-durationLabel",children:"Duration:"}),mt("input",{type:"range",className:"se-segmentSlider",min:1,max:20,step:.5,value:m,onChange:k=>{let R=parseFloat(k.target.value);u(p,{segmentDuration:R})}}),Wt("span",{className:"se-segmentValue",children:[m.toFixed(1),"s"]}),Wt("div",{className:"se-presetButtons",children:[[2,4,6,8].map(k=>Wt("button",{className:"se-presetButton",onClick:()=>u(p,{segmentDuration:k}),children:[k,"s"]},`preset-${p}-${k}`)),mt("button",{className:"se-presetButton se-presetButton--default",onClick:()=>{let k=o.map((f,C)=>{if(C===p){let{segmentDuration:x,...P}=f;return P}return f}),R=s(k,r.loop);l({waypoints:k,duration:R})},children:"Reset"})]})]})]})]},`waypoint-wrapper-${p}`)})}),Wt("div",{className:"se-totalDuration",children:[mt("span",{className:"se-totalLabel",children:"Total duration:"}),mt("span",{className:"se-totalValue",children:B?(r.duration??s(o,r.loop)).toFixed(1)+"s":"-"}),!B&&mt("span",{className:"se-totalHint",children:"(need at least 2 waypoints)"})]})]}),mt(Qe,{label:"Enable cinematic camera",checked:r.enabled,onChange:v=>l({enabled:v})}),mt(Qe,{label:"Loop",checked:r.loop,onChange:v=>{let p=v,m=s(o,p);l({loop:p,duration:m})}}),mt(Qe,{label:"Auto-play on load",checked:r.autoPlay,onChange:v=>l({autoPlay:v})}),!b&&B&&mt(G,{label:"Duration",value:r.duration??s(o,r.loop),min:4,max:120,step:1,formatValue:v=>`${v}s`,onChange:v=>l({duration:v})})]})}import{Box as S2,Clapperboard as M2,MessageSquareText as k2,Sparkles as P2,Spotlight as T2,Video as R2}from"lucide-react";import{jsx as sn,jsxs as B2}from"react/jsx-runtime";var A2=[{label:"General",icon:sn(S2,{})},{label:"Lighting",icon:sn(T2,{})},{label:"Animations",icon:sn(M2,{})},{label:"Post Processing",icon:sn(P2,{})},{label:"Annotations",icon:sn(k2,{})},{label:"Cinematic",icon:sn(R2,{})}],zf={currentClip:null,isPlaying:!1,time:0,duration:0,play:()=>{},pause:()=>{},stop:()=>{},setSpeed:()=>{},seek:()=>{}};function bp({config:e,onChange:t,activeSubTab:n,onActiveSubTabChange:a,cameraState:r=null,onPreviewWaypoint:o,animationClipDetails:s=[],animationPlayback:l=zf}){let[i,c]=w2("General"),d=n??i,u=l??zf,{tier:b}=qn(),g=Vr(b,"starter"),h=Vr(b,"growth");C2(()=>{n!==void 0&&c(n)},[n]);let w=B=>{n===void 0&&c(B),a?.(B)};return B2("div",{className:"se-tabContent",children:[sn("div",{className:"se-subTabRow",children:A2.map(B=>sn("button",{type:"button",title:B.label,className:`se-subTab ${d===B.label?"se-subTab--active":""}`,onClick:()=>w(B.label),children:B.icon},B.label))}),d==="General"&&sn(lp,{config:e,onChange:t}),d==="Lighting"&&sn(dp,{config:e,onChange:t}),d==="Animations"&&(g?sn(pp,{config:e,onChange:t,clipDetails:s,currentClip:u.currentClip,isPlaying:u.isPlaying,time:u.time,duration:u.duration,play:u.play,pause:u.pause,stop:u.stop,setSpeed:u.setSpeed,seek:u.seek}):sn(_n,{requiredTier:"starter",feature:"Animation configuration"})),d==="Post Processing"&&(h?sn(cp,{config:e,onChange:t}):sn(_n,{requiredTier:"growth",feature:"Post-processing effects"})),d==="Annotations"&&(g?sn(up,{config:e,onChange:t}):sn(_n,{requiredTier:"starter",feature:"Annotations"})),d==="Cinematic"&&(g?sn(mp,{config:e,onChange:t,cameraState:r,onPreviewWaypoint:o}):sn(_n,{requiredTier:"starter",feature:"Cinematic camera"}))]})}import{ChevronDown as jf,Info as If}from"lucide-react";import{jsx as Mn,jsxs as Fo}from"react/jsx-runtime";function Ff({title:e,trailing:t,children:n,disabled:a,open:r,onToggle:o,tooltip:s}){let l=s?`${s}`:e;return Fo("div",{className:"bb-materialPanel",children:[Fo("button",{type:"button",className:"bb-materialPanelHeader",onClick:o,"aria-expanded":r,title:l,children:[Fo("div",{className:"bb-materialPanelTitleWrap",children:[Mn(jf,{size:14,className:`bb-materialPanelChevron ${r?"bb-materialPanelChevron--open":""}`}),Mn("span",{className:"bb-materialPanelTitle",children:e}),s?Mn("span",{className:"bb-materialPanelHelp",title:l,"aria-label":l,role:"img",onClick:i=>i.stopPropagation(),children:Mn(If,{size:12})}):null]}),t?Mn("div",{onClick:i=>i.stopPropagation(),children:t}):null]}),r?Mn("div",{className:"bb-materialPanelBody",style:a?{opacity:.45,pointerEvents:"none"}:void 0,children:n}):null]})}function zn({title:e,open:t,onToggle:n,trailing:a,children:r,tooltip:o}){let s=o?`${e}: ${o}`:e;return Fo("div",{className:"bb-section",children:[Fo("button",{type:"button",className:"bb-sectionHeaderButton",onClick:n,"aria-expanded":t,title:s,children:[Fo("span",{className:"bb-sectionHeaderMain",children:[Mn(jf,{size:15,className:`bb-sectionChevron ${t?"bb-sectionChevron--open":""}`}),Mn("h2",{className:"bb-sectionTitle",children:e}),o?Mn("span",{className:"bb-sectionHelp",title:s,"aria-label":s,role:"img",onClick:l=>l.stopPropagation(),children:Mn(If,{size:13})}):null]}),a?Mn("span",{onClick:l=>l.stopPropagation(),children:a}):null]}),t?Mn("div",{className:"bb-sectionBody",children:r}):null]})}function Vf({checked:e,onChange:t,label:n}){return Fo("label",{className:"se-switch","aria-label":n,children:[Mn("input",{type:"checkbox",checked:e,onChange:a=>t(a.target.checked)}),Mn("span",{className:"se-switchTrack",children:Mn("span",{className:"se-switchThumb"})})]})}import{useState as Gf}from"react";import{jsx as gp}from"react/jsx-runtime";function Hn({panelKey:e,title:t,tooltip:n,toggleLabel:a,controls:r,children:o,requiredTier:s}){let{openMaterialPanels:l,materialPanelEnabled:i,onToggleMaterialPanel:c,onSetMaterialPanelState:d}=r,u=s?.locked??!1;return gp(Ff,{title:t,tooltip:n,disabled:u||!i[e],open:l[e],onToggle:()=>c(e),trailing:gp(Vf,{checked:!u&&i[e],onChange:u?()=>{}:b=>d(e,b),label:a??`Toggle ${t}`}),children:u&&s?gp(_n,{requiredTier:s.tier,feature:t}):o})}import{useRef as Uf,useState as O2}from"react";import{HexColorInput as E2,HexColorPicker as L2}from"react-colorful";import{FileUp as D2}from"lucide-react";import{jsx as $t,jsxs as ao}from"react/jsx-runtime";function Xt({label:e,value:t,placeholder:n,onChange:a}){let r=Uf(null);return ao("div",{className:"bb-field bb-field--full",children:[$t("label",{className:"bb-label",children:e}),ao("div",{className:"bb-fileField",children:[$t("input",{className:"bb-input bb-fileField-input",placeholder:n,value:t,onChange:o=>{let s=o.target.value;!s&&t&&Ac(t),a(s)}}),$t("button",{type:"button",className:"bb-fileFieldButton",onClick:()=>r.current?.click(),"aria-label":`Select file for ${e}`,title:`Select file for ${e}`,children:$t(D2,{size:20})}),$t("input",{ref:r,type:"file",accept:"image/png,image/jpeg,image/webp,image/avif",className:"bb-hiddenInput",onChange:o=>{let s=o.target.files?.[0];if(!s)return;let l=Qu(s);t&&t!==l&&Ac(t),rm(l,URL.createObjectURL(s)),a(l),o.target.value=""}})]})]})}function Vo({label:e,value:t,fallback:n="#ffffff",onChange:a}){let[r,o]=O2(!1),s=t||n,l=Uf(null);return ao("div",{className:"bb-field",children:[$t("span",{className:"bb-label",children:e}),$t("div",{className:"se-fieldInline",children:$t("span",{ref:l,style:{display:"inline-flex"},children:$t(E2,{prefixed:!0,className:"se-swatch",onClick:()=>o(i=>!i),style:{background:s,color:_a(s)},color:s,onChange:a})})}),r?$t(ip,{anchorRef:l,onClose:()=>o(!1),children:$t(L2,{color:s,onChange:a})}):null]})}function Ii({label:e,checked:t,onChange:n}){return ao("label",{className:"bb-checkbox",children:[$t("input",{type:"checkbox",checked:t,onChange:a=>n(a.target.checked)}),e]})}function Hf({label:e,value:t,min:n,max:a,step:r,placeholder:o,onChange:s}){return ao("div",{className:"bb-field",children:[$t("label",{className:"bb-label",children:e}),$t("input",{className:"bb-input",type:"number",min:n,max:a,step:r,placeholder:o,value:t??"",onChange:l=>s(l.target.value===""?void 0:Number(l.target.value))})]})}function Ia({label:e,value:t,options:n,onChange:a}){return ao("div",{className:"bb-field",children:[$t("label",{className:"bb-label",children:e}),$t("select",{className:"bb-select",value:t,onChange:r=>a(r.target.value),children:n.map(r=>$t("option",{value:r,children:r},r))})]})}function yt({label:e,value:t,min:n,max:a,step:r,onChange:o}){return ao("div",{className:"bb-field bb-field--full",children:[$t("label",{className:"bb-label",children:e}),ao("div",{className:"bb-sliderField",children:[$t("input",{className:`bb-slider ${t===void 0?"bb-slider--unset":""}`,type:"range",min:n,max:a,step:r,value:t??n,onChange:l=>o(Number(l.target.value))}),$t("input",{className:"bb-input bb-input--compact",type:"number",min:n,max:a,step:r,value:t??"",onChange:l=>o(l.target.value===""?void 0:Number(l.target.value))})]})]})}import{Fragment as fp,jsx as J,jsxs as en}from"react/jsx-runtime";function Wf({selectedItem:e,selectedMaterial:t,pbrWorkflow:n,onPbrWorkflowChange:a,openMaterialPanels:r,materialPanelEnabled:o,onToggleMaterialPanel:s,onSetMaterialPanelState:l,updateSelectedMaterial:i,setSelectedTexturePath:c}){let d={openMaterialPanels:r,materialPanelEnabled:o,onToggleMaterialPanel:s,onSetMaterialPanelState:l},{tier:u}=qn(),b=Vr(u,"starter"),g={tier:"starter",locked:!b},[h,w]=Gf("roughness"),[B,v]=Gf("factor");return en(fp,{children:[J(Hn,{panelKey:"pbr",title:"PBR Maps",tooltip:"Controls the base color and workflow used for physically based shading.",controls:d,children:b?en("div",{className:"bb-grid",children:[J(Ia,{label:"Workflow",value:n,options:["metalness","specular"],onChange:a}),J("div",{className:"bb-field bb-field--full",children:J("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."})}),J(Xt,{label:n==="specular"?"Albedo texture path":"Base color texture path",placeholder:"materials/oak-wood.jpg",value:t?.texture?.path??"",onChange:p=>c(e,"texture",p)}),J(Vo,{label:n==="specular"?"Albedo color":"Base color",value:t?.baseColor??"#ffffff",onChange:p=>i(e,m=>({...m,baseColor:p}))}),n==="metalness"?en(fp,{children:[J(yt,{label:"Metalness",value:t?.metalness,min:0,max:1,step:.01,onChange:p=>i(e,m=>({...m,metalness:p}))}),J(Xt,{label:"Metalness map path",placeholder:"materials/body-metalness.jpg",value:t?.metalnessMap?.path??"",onChange:p=>c(e,"metalnessMap",p)})]}):en(fp,{children:[J(yt,{label:"Specular intensity",value:t?.specularIntensity,min:0,max:1,step:.01,onChange:p=>i(e,m=>({...m,specularIntensity:p}))}),J(Vo,{label:"Specular color",value:t?.specularColor??"#ffffff",onChange:p=>i(e,m=>({...m,specularColor:p}))}),J(Xt,{label:"Specular intensity map path",placeholder:"materials/body-specular-intensity.jpg",value:t?.specularIntensityMap?.path??"",onChange:p=>c(e,"specularIntensityMap",p)}),J(Xt,{label:"Specular color map path",placeholder:"materials/body-specular-color.jpg",value:t?.specularColorMap?.path??"",onChange:p=>c(e,"specularColorMap",p)})]}),J(yt,{label:"Specular F0 / reflectivity",value:t?.reflectivity,min:0,max:1,step:.01,onChange:p=>i(e,m=>({...m,reflectivity:p}))})]}):en("div",{className:"bb-grid",children:[J(Vo,{label:"Base color",value:t?.baseColor??"#ffffff",onChange:p=>i(e,m=>({...m,baseColor:p}))}),J(yt,{label:"Metalness",value:t?.metalness,min:0,max:1,step:.01,onChange:p=>i(e,m=>({...m,metalness:p}))}),J("div",{className:"bb-field bb-field--full",children:J(_n,{requiredTier:"starter",feature:"Texture maps, the specular workflow, and reflectivity"})})]})}),J(Hn,{panelKey:"roughness",requiredTier:g,title:"Roughness / Glossiness",tooltip:"Adjusts how matte or shiny the surface appears.",toggleLabel:"Toggle Roughness and Glossiness",controls:d,children:en("div",{className:"bb-grid",children:[J(Ia,{label:"Mode",value:h,options:["roughness","glossiness"],onChange:w}),J("div",{className:"bb-field bb-field--full",children:J("p",{className:"bb-note",style:{margin:0},children:h==="roughness"?"Roughness: 0 is glossy, 1 is matte.":"Glossiness is the inverse of roughness (glossiness = 1 \u2212 roughness)"})}),h==="roughness"?J(yt,{label:"Roughness",value:t?.roughness,min:0,max:1,step:.01,onChange:p=>i(e,m=>({...m,roughness:p}))}):J(yt,{label:"Glossiness",value:t?.roughness===void 0?void 0:1-t.roughness,min:0,max:1,step:.01,onChange:p=>i(e,m=>({...m,roughness:p===void 0?void 0:1-p}))}),J(Xt,{label:h==="glossiness"?"Glossiness map path (applied as roughness)":"Roughness map path",placeholder:"materials/body-roughness.jpg",value:t?.roughnessMap?.path??"",onChange:p=>c(e,"roughnessMap",p)})]})}),J(Hn,{panelKey:"emission",requiredTier:g,title:"Emission",tooltip:"Makes the material self-illuminated with emissive color and intensity.",controls:d,children:en("div",{className:"bb-grid",children:[J(Vo,{label:"Emissive color",value:t?.emissive??"#000000",fallback:"#000000",onChange:p=>i(e,m=>({...m,emissive:p}))}),J(yt,{label:"Emissive intensity",value:t?.emissiveIntensity,min:0,max:10,step:.1,onChange:p=>i(e,m=>({...m,emissiveIntensity:p}))}),J(Xt,{label:"Emissive map path",placeholder:"materials/body-emissive.jpg",value:t?.emissiveMap?.path??"",onChange:p=>c(e,"emissiveMap",p)})]})}),J(Hn,{panelKey:"opacity",requiredTier:g,title:"Opacity",tooltip:"Controls transparency, alpha testing, and blending behavior.",controls:d,children:en("div",{className:"bb-grid",children:[J(yt,{label:"Opacity",value:t?.opacity,min:0,max:1,step:.01,onChange:p=>i(e,m=>({...m,opacity:p}))}),J(yt,{label:"Alpha test",value:t?.alphaTest,min:0,max:1,step:.01,onChange:p=>i(e,m=>({...m,alphaTest:p}))}),J(Xt,{label:"Alpha map path",placeholder:"materials/body-alpha.png",value:t?.alphaMap?.path??"",onChange:p=>c(e,"alphaMap",p)}),J(Ia,{label:"Blending mode",value:t?.blendingMode??"normal",options:ic,onChange:p=>i(e,m=>({...m,blendingMode:p}))}),en("div",{className:"bb-field",children:[J("label",{className:"bb-label",children:"Alpha hash"}),J("div",{className:"bb-checkboxRow",children:J(Ii,{label:"Use alpha hash",checked:t?.alphaHash??!1,onChange:p=>i(e,m=>({...m,alphaHash:p}))})})]}),en("div",{className:"bb-field",children:[J("label",{className:"bb-label",children:"Dithering"}),J("div",{className:"bb-checkboxRow",children:J(Ii,{label:"Use dithering",checked:t?.dithering??!1,onChange:p=>i(e,m=>({...m,dithering:p}))})})]})]})}),en(Hn,{panelKey:"normalBump",requiredTier:g,title:"Normal & Bump",tooltip:"Adds surface detail without changing the actual mesh shape.",toggleLabel:"Toggle Normal and Bump",controls:d,children:[en("div",{className:"bb-grid",children:[J(Xt,{label:"Normal map path",placeholder:"materials/body-normal.jpg",value:t?.normalMap?.path??"",onChange:p=>c(e,"normalMap",p)}),J(yt,{label:"Normal scale",value:t?.normalScale,min:0,max:5,step:.01,onChange:p=>i(e,m=>({...m,normalScale:p}))}),J(Xt,{label:"Bump map path",placeholder:"materials/body-bump.jpg",value:t?.bumpMap?.path??"",onChange:p=>c(e,"bumpMap",p)}),J(yt,{label:"Bump scale",value:t?.bumpScale,min:0,max:5,step:.01,onChange:p=>i(e,m=>({...m,bumpScale:p}))})]}),J("div",{className:"bb-checkboxRow",style:{marginTop:12},children:J(Ii,{label:"Flip normal Y",checked:t?.flipNormalY??!1,onChange:p=>i(e,m=>({...m,flipNormalY:p}))})})]}),J(Hn,{panelKey:"displacement",requiredTier:g,title:"Displacement",tooltip:"Offsets geometry using a texture to create real surface height.",controls:d,children:en("div",{className:"bb-grid",children:[J(Xt,{label:"Displacement map path",placeholder:"materials/body-displacement.jpg",value:t?.displacementMap?.path??"",onChange:p=>c(e,"displacementMap",p)}),J(yt,{label:"Displacement scale",value:t?.displacementScale,min:-5,max:5,step:.01,onChange:p=>i(e,m=>({...m,displacementScale:p}))}),J(yt,{label:"Displacement bias",value:t?.displacementBias,min:-5,max:5,step:.01,onChange:p=>i(e,m=>({...m,displacementBias:p}))})]})}),J(Hn,{panelKey:"ao",requiredTier:g,title:"Ambient Occlusion",tooltip:"Darkens creases and contact areas to add depth.",controls:d,children:en("div",{className:"bb-grid",children:[J(Xt,{label:"AO map path",placeholder:"materials/body-ao.jpg",value:t?.aoMap?.path??"",onChange:p=>c(e,"aoMap",p)}),J(yt,{label:"AO intensity",value:t?.aoMapIntensity,min:0,max:5,step:.01,onChange:p=>i(e,m=>({...m,aoMapIntensity:p}))})]})}),en(Hn,{panelKey:"clearcoat",requiredTier:g,title:"Clearcoat",tooltip:"Adds a glossy protective layer on top of the base material.",controls:d,children:[en("div",{className:"bb-grid",children:[J(Xt,{label:"Clearcoat map path",placeholder:"materials/body-clearcoat.jpg",value:t?.clearcoatMap?.path??"",onChange:p=>c(e,"clearcoatMap",p)}),J(yt,{label:"Clearcoat",value:t?.clearcoat,min:0,max:1,step:.01,onChange:p=>i(e,m=>({...m,clearcoat:p}))}),J(Xt,{label:"Clearcoat roughness map path",placeholder:"materials/body-clearcoat-roughness.jpg",value:t?.clearcoatRoughnessMap?.path??"",onChange:p=>c(e,"clearcoatRoughnessMap",p)}),J(yt,{label:"Clearcoat roughness",value:t?.clearcoatRoughness,min:0,max:1,step:.01,onChange:p=>i(e,m=>({...m,clearcoatRoughness:p}))}),J(Xt,{label:"Clearcoat normal map path",placeholder:"materials/body-clearcoat-normal.jpg",value:t?.clearcoatNormalMap?.path??"",onChange:p=>c(e,"clearcoatNormalMap",p)}),J(yt,{label:"Clearcoat normal scale",value:t?.clearcoatNormalScale,min:0,max:5,step:.01,onChange:p=>i(e,m=>({...m,clearcoatNormalScale:p}))})]}),J("div",{className:"bb-checkboxRow",style:{marginTop:12},children:J(Ii,{label:"Flip clearcoat normal Y",checked:t?.flipClearcoatNormalY??!1,onChange:p=>i(e,m=>({...m,flipClearcoatNormalY:p}))})})]}),J(Hn,{panelKey:"sheen",requiredTier:g,title:"Sheen",tooltip:"Adds a soft fabric-like sheen on grazing angles.",controls:d,children:en("div",{className:"bb-grid",children:[J(yt,{label:"Sheen",value:t?.sheen,min:0,max:1,step:.01,onChange:p=>i(e,m=>({...m,sheen:p}))}),J(Vo,{label:"Sheen color",value:t?.sheenColor??"#ffffff",onChange:p=>i(e,m=>({...m,sheenColor:p}))}),J(Xt,{label:"Sheen color map path",placeholder:"materials/body-sheen-color.jpg",value:t?.sheenColorMap?.path??"",onChange:p=>c(e,"sheenColorMap",p)}),J(yt,{label:"Sheen roughness",value:t?.sheenRoughness,min:0,max:1,step:.01,onChange:p=>i(e,m=>({...m,sheenRoughness:p}))}),J(Xt,{label:"Sheen roughness map path",placeholder:"materials/body-sheen-roughness.jpg",value:t?.sheenRoughnessMap?.path??"",onChange:p=>c(e,"sheenRoughnessMap",p)})]})}),J(Hn,{panelKey:"anisotropy",requiredTier:g,title:"Anisotropy",tooltip:"Stretches reflections in one direction for brushed or fiber-like surfaces.",controls:d,children:en("div",{className:"bb-grid",children:[J(yt,{label:"Intensity",value:t?.anisotropy,min:0,max:1,step:.01,onChange:p=>i(e,m=>({...m,anisotropy:p}))}),J(Ia,{label:"Tilt direction",value:B,options:["factor","texture"],onChange:v}),B==="factor"?J(yt,{label:"Rotation (rad)",value:t?.anisotropyRotation,min:0,max:6.28,step:.01,onChange:p=>i(e,m=>({...m,anisotropyRotation:p}))}):J(Xt,{label:"Anisotropy map path",placeholder:"materials/body-anisotropy.jpg",value:t?.anisotropyMap?.path??"",onChange:p=>c(e,"anisotropyMap",p)})]})}),J(Hn,{panelKey:"transmission",requiredTier:g,title:"Transmission & Volume",tooltip:"Controls glass-like transmission and how light travels through volume.",toggleLabel:"Toggle Transmission and Volume",controls:d,children:en("div",{className:"bb-grid",children:[J(yt,{label:"Transmission",value:t?.transmission,min:0,max:1,step:.01,onChange:p=>i(e,m=>({...m,transmission:p}))}),J(Xt,{label:"Transmission map path",placeholder:"materials/body-transmission.jpg",value:t?.transmissionMap?.path??"",onChange:p=>c(e,"transmissionMap",p)}),J(yt,{label:"Thickness",value:t?.thickness,min:0,max:5,step:.01,onChange:p=>i(e,m=>({...m,thickness:p}))}),J(Xt,{label:"Thickness map path",placeholder:"materials/body-thickness.jpg",value:t?.thicknessMap?.path??"",onChange:p=>c(e,"thicknessMap",p)}),J(Vo,{label:"Volume tint",value:t?.attenuationColor??"#ffffff",onChange:p=>i(e,m=>({...m,attenuationColor:p}))}),J(Hf,{label:"Attenuation distance",value:t?.attenuationDistance,min:0,step:.01,placeholder:"Infinity when unset",onChange:p=>i(e,m=>({...m,attenuationDistance:p}))})]})}),J(Hn,{panelKey:"faces",requiredTier:g,title:"Faces Rendering",tooltip:"Chooses which side of the mesh renders and how backfaces are handled.",controls:d,children:J("div",{className:"bb-grid",children:J(Ia,{label:"Side",value:t?.side??"front",options:ac,onChange:p=>i(e,m=>({...m,side:p}))})})})]})}var $f=[{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 hp,jsxs as N2}from"react/jsx-runtime";function Xf({disabled:e,onApply:t}){return hp("div",{className:"bb-presetGallery",children:$f.map(n=>N2("button",{type:"button",className:"bb-presetSwatch",disabled:e,title:`Apply ${n.label} preset`,onClick:()=>t(n.material),children:[hp("span",{className:"bb-presetSwatchColor",style:{background:n.swatch}}),hp("span",{className:"bb-presetSwatchLabel",children:n.label})]},n.id))})}import{useEffect as _2,useRef as z2,useState as j2}from"react";import{ChevronDown as I2,Download as F2,FileCode2 as V2,FileJson as U2}from"lucide-react";import{jsx as Rl,jsxs as Fi}from"react/jsx-runtime";function xp({disabled:e,exporting:t,onExportJson:n,onExportTs:a}){let[r,o]=j2(!1),s=z2(null);return _2(()=>{if(!r)return;let l=i=>{s.current?.contains(i.target)||o(!1)};return window.addEventListener("pointerdown",l),()=>window.removeEventListener("pointerdown",l)},[r]),Fi("div",{className:"bb-exportMenuWrapper",ref:s,children:[Fi("button",{type:"button",className:"bb-button bb-button--ghost",disabled:e||t,onClick:()=>o(l=>!l),title:"Export",children:[Rl(F2,{size:14}),t?"Exporting\u2026":"Export",Rl(I2,{size:12})]}),r&&Fi("div",{className:"bb-exportMenu",children:[Fi("button",{type:"button",className:"bb-exportMenuItem",onClick:()=>{o(!1),n()},children:[Rl(U2,{size:14}),"JSON"]}),Fi("button",{type:"button",className:"bb-exportMenuItem",onClick:()=>{o(!1),a()},children:[Rl(V2,{size:14}),"TypeScript"]})]})]})}import{jsx as Uo,jsxs as vp}from"react/jsx-runtime";function Kf({selectedItem:e,selectedBinding:t,open:n,onToggle:a,updateBinding:r,idError:o}){return Uo(zn,{title:"Identity",open:n,onToggle:a,children:vp("div",{className:"bb-grid",children:[vp("div",{className:"bb-field bb-field--full",children:[Uo("label",{className:"bb-label",children:"Model Node ID"}),Uo("span",{className:"bb-note",children:"This is the exact mesh name from the imported model and stays locked."}),Uo("input",{className:"bb-input bb-readonly",value:t.modelObjectId,readOnly:!0})]}),vp("div",{className:"bb-field bb-field--full",children:[Uo("label",{className:"bb-label",children:"ID"}),Uo("input",{className:`bb-input ${o?"bb-input--error":""}`,value:t.id,onChange:s=>r(e,l=>({...l,id:s.target.value}))}),o?Uo("span",{className:"bb-status bb-status--error",children:o}):null]})]})})}import{useEffect as H2,useState as qf}from"react";var Yf=["other","body","light","wheel","glass","interior","floor","wall","door","furniture","decor","electronics","seat","table","chair","window","sofa","bed","engine","headlight"],Jf=["normal","hidden","selected","disabled"];import{jsx as xn,jsxs as mr}from"react/jsx-runtime";function Zf({selectedItem:e,selectedBinding:t,open:n,onToggle:a,updateBinding:r}){let[o,s]=qf(t.group??""),[l,i]=qf(t.tags?.join(", ")??"");H2(()=>{s(t.group??""),i(t.tags?.join(", ")??"")},[e,t.group,t.tags]);let c=()=>{r(e,u=>({...u,group:o.trim()||void 0}))},d=()=>{let u=[...new Set(l.split(",").map(b=>b.trim()).filter(Boolean))];r(e,b=>({...b,tags:u.length>0?u:void 0}))};return mr(zn,{title:"Basics",open:n,onToggle:a,children:[mr("div",{className:"bb-grid",children:[mr("div",{className:"bb-field",children:[xn("label",{className:"bb-label",children:"Label"}),xn("input",{className:"bb-input",value:t.label??"",onChange:u=>r(e,b=>({...b,label:u.target.value}))})]}),mr("div",{className:"bb-field",children:[xn("label",{className:"bb-label",children:"Type"}),xn("input",{className:"bb-input",list:"binding-type-suggestions",value:t.type,onChange:u=>r(e,b=>({...b,type:u.target.value}))}),xn("datalist",{id:"binding-type-suggestions",children:Yf.map(u=>xn("option",{value:u},u))})]}),mr("div",{className:"bb-field",children:[xn("label",{className:"bb-label",children:"Status"}),xn("select",{className:"bb-select",value:t.status??"normal",onChange:u=>r(e,b=>({...b,status:u.target.value})),children:Jf.map(u=>xn("option",{value:u,children:u},u))})]}),mr("div",{className:"bb-field",children:[xn("label",{className:"bb-label",children:"Group"}),xn("input",{className:"bb-input",placeholder:"paint",value:o,onChange:u=>s(u.target.value),onBlur:c,onKeyDown:u=>{u.key==="Enter"&&u.currentTarget.blur()}})]}),mr("div",{className:"bb-field",children:[xn("label",{className:"bb-label",children:"Tags"}),xn("input",{className:"bb-input",placeholder:"exterior, configurable",value:l,onChange:u=>i(u.target.value),onBlur:d,onKeyDown:u=>{u.key==="Enter"&&u.currentTarget.blur()}})]})]}),mr("div",{className:"bb-checkboxRow",style:{marginTop:12},children:[mr("label",{className:"bb-checkbox",children:[xn("input",{type:"checkbox",checked:t.selectable??!1,onChange:u=>r(e,b=>({...b,selectable:u.target.checked}))}),"selectable"]}),mr("label",{className:"bb-checkbox",children:[xn("input",{type:"checkbox",checked:t.hoverable??!1,onChange:u=>r(e,b=>({...b,hoverable:u.target.checked}))}),"hoverable"]}),mr("label",{className:"bb-checkbox",children:[xn("input",{type:"checkbox",checked:t.visible??!1,onChange:u=>r(e,b=>({...b,visible:u.target.checked}))}),"visible"]})]})]})}import{useEffect as W2,useState as $2}from"react";var Ho=[{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."}],Al="__custom__";function Vi(e){return Ho.find(t=>t.id===e)}var cD=Ho.filter(e=>e.handling==="viewer").map(e=>e.id),G2=new Set(["","New Action",...Ho.map(e=>e.label)]);function yp(e){return G2.has(e.trim())}function Qf(e,t){let n=Array.from({length:t.length+1},(a,r)=>r);for(let a=1;a<=e.length;a+=1){let r=[a];for(let o=1;o<=t.length;o+=1){let s=n[o-1]+(e[a-1]===t[o-1]?0:1);r[o]=Math.min(r[o-1]+1,n[o]+1,s)}n=r}return n[t.length]}function eh(e){if(Vi(e))return null;let t=e.trim().toLowerCase();if(!t)return null;let n=t.replace(/[^a-z0-9]/g,""),a=null;for(let r of Ho){let o=Math.min(Qf(t,r.id),Qf(n,r.id.replace(/[^a-z0-9]/g,"")));(!a||o<a.distance)&&(a={id:r.id,distance:o})}return a&&a.distance<=2?a.id:null}import{Fragment as K2,jsx as Kt,jsxs as er}from"react/jsx-runtime";var th=Ho.filter(e=>e.handling==="viewer"),X2=Ho.filter(e=>e.handling==="host");function nh({selectedItem:e,selectedBinding:t,open:n,onToggle:a,updateBinding:r}){let[o,s]=$2(new Set);W2(()=>{s(new Set)},[e]);let l=t.actions??[],i=(u,b)=>r(e,g=>({...g,actions:(g.actions??[]).map((h,w)=>w===u?b(h):h)})),c=u=>{r(e,b=>({...b,actions:(b.actions??[]).filter((g,h)=>h!==u)})),s(b=>{let g=new Set;return b.forEach(h=>{h<u?g.add(h):h>u&&g.add(h-1)}),g})},d=(u,b)=>s(g=>{let h=new Set(g);return b?h.add(u):h.delete(u),h});return er(zn,{title:"Actions",open:n,onToggle:a,children:[Kt("div",{className:"bb-actionList",children:l.map((u,b)=>{let g=Vi(u.id),h=o.has(b)||!g,w=u.id.trim(),B=g?null:eh(u.id),v=w.length>0&&l.some((p,m)=>m!==b&&p.id.trim()===w);return er("div",{className:"bb-actionCard",children:[er("div",{className:"bb-actionCardHeader",children:[er("div",{className:"bb-actionCardTitle",children:["Action ",b+1]}),Kt("div",{className:"bb-actionCardMeta",children:u.type})]}),er("div",{className:"bb-actionGrid",children:[er("div",{className:"bb-field",children:[Kt("label",{className:"bb-label",children:"Action ID"}),er("select",{className:"bb-select",value:h?Al:u.id,onChange:p=>{let m=p.target.value;if(m===Al){d(b,!0);return}d(b,!1);let S=Vi(m);i(b,M=>({...M,id:m,label:S&&yp(M.label)?S.label:M.label}))},children:[Kt("optgroup",{label:"Handled by the viewer",children:th.map(p=>Kt("option",{value:p.id,children:p.id},p.id))}),Kt("optgroup",{label:"Handled by your app",children:X2.map(p=>Kt("option",{value:p.id,children:p.id},p.id))}),Kt("option",{value:Al,children:"Custom\u2026"})]})]}),h?er("div",{className:"bb-field",children:[Kt("label",{className:"bb-label",children:"Custom action ID"}),Kt("input",{className:"bb-input",value:u.id,placeholder:"open-datasheet",onChange:p=>{d(b,!0),i(b,m=>({...m,id:p.target.value}))}})]}):null,er("div",{className:"bb-field",children:[Kt("label",{className:"bb-label",children:"Label"}),Kt("input",{className:"bb-input",value:u.label,onChange:p=>i(b,m=>({...m,label:p.target.value}))})]}),g?Kt("span",{className:"bb-note",children:g.description}):w.length===0?Kt("span",{className:"bb-note",style:{color:"#fca5a5"},children:"An action ID is required, the button renders but can never be identified in onAction."}):er("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.",B?er(K2,{children:[" Did you mean ",Kt("button",{type:"button",className:"bb-linkButton",onClick:()=>{d(b,!1);let p=Vi(B);i(b,m=>({...m,id:B,label:p&&yp(m.label)?p.label:m.label}))},children:B}),"?"]}):null]}),u.effects?.length?er("span",{className:"bb-note",children:[u.effects.length," declarative effect",u.effects.length===1?"":"s",", execute with useViewerActions."]}):null,v?Kt("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]}),Kt("div",{className:"bb-actionFooter",children:Kt("button",{type:"button",className:"bb-button bb-button--ghost bb-actionRemove",onClick:()=>c(b),children:"Remove Action"})})]},b)})}),Kt("div",{style:{marginTop:10},children:Kt("button",{type:"button",className:"bb-button",onClick:()=>{let u=th.find(b=>!l.some(g=>g.id===b.id));r(e,b=>({...b,actions:[...b.actions??[],{id:u?.id??"",label:u?.label??"New Action",type:"command"}]})),u||d(l.length,!0)},children:"Add Action"})})]})}import{MapPin as Y2,Trash2 as J2}from"lucide-react";import{Fragment as q2,jsx as tr,jsxs as Gn}from"react/jsx-runtime";function rh({selectedBinding:e,open:t,onToggle:n,cameraState:a,formattedCameraState:r,savedCameraPosition:o,onSaveCameraPosition:s,onGoToSavedCamera:l,onClearSavedCamera:i,onResetView:c,onFitScene:d}){return Gn(zn,{title:"Camera Position",open:t,onToggle:n,children:[Gn("div",{className:"se-waypointCard bb-cameraWaypoint",children:[tr("span",{className:"bb-cameraLiveBadge",children:"LIVE"}),Gn("div",{className:"se-waypointBody",children:[tr("div",{className:"bb-cameraWaypointLabel",children:"Current view"}),a?Gn(q2,{children:[Gn("div",{className:"se-waypointCoords",children:["pos ",r?.position]}),Gn("div",{className:"se-waypointCoords",children:["look ",r?.target]})]}):tr("div",{className:"se-waypointCoords",children:"Move the camera to see live position"})]})]}),Gn("div",{className:"bb-cameraControls bb-cameraControls--centered",children:[tr("button",{type:"button",className:"bb-button bb-button--primary",onClick:s,disabled:!a,children:"Save"}),tr("button",{type:"button",className:"bb-button bb-button--ghost",onClick:c,children:"Reset View"}),tr("button",{type:"button",className:"bb-button bb-button--ghost",onClick:d,children:"Fit Scene"})]}),o?.position&&o?.target&&Gn("div",{className:"se-waypointCard bb-cameraWaypoint",children:[tr("span",{className:"bb-cameraSavedBadge",children:"SAVED"}),Gn("div",{className:"se-waypointBody",children:[Gn("div",{className:"bb-cameraWaypointLabel",children:["For ",e.label]}),Gn("div",{className:"se-waypointCoords",children:["pos [",o.position.map(u=>u.toFixed(1)).join(", "),"]"]}),Gn("div",{className:"se-waypointCoords",children:["look [",o.target.map(u=>u.toFixed(1)).join(", "),"]"]})]}),Gn("div",{className:"se-waypointActions",children:[tr("button",{className:"se-waypointAction",onClick:l,title:"Fly camera to the saved position",children:tr(Y2,{size:15})}),tr("button",{className:"se-waypointAction se-waypointAction--delete",onClick:i,title:"Delete saved position",children:tr(J2,{size:15})})]})]}),tr("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 Z2,RotateCcw as Q2}from"lucide-react";import{jsx as Pt,jsxs as br}from"react/jsx-runtime";var oh=["X","Y","Z"];var eM=.1;function wp(e){let t=e%360;return t<0?t+360:t}function ah(e){return wp(e*180/Math.PI)}function ih(e){return e*Math.PI/180}function tM(e,t,n){let a=[...e],r=ah(e[t]);return a[t]=ih(wp(r+n)),a}function nM({value:e,min:t=-1/0,max:n=1/0,step:a=.1,disabled:r=!1,onChange:o,formatValue:s=i=>Number(i.toFixed(3)),label:l}){return Pt("div",{className:"bb-transformAxesGrid",children:oh.map((i,c)=>br("div",{className:"bb-transformAxis",children:[Pt("span",{className:"se-axisStepperLabel bb-transformAxisLabel",children:i}),Pt("div",{className:"bb-transformAxisControl",children:Pt("input",{type:"number",className:"se-numberInput bb-transformNumberInput",step:a,min:t,max:n,value:s(e[c]),disabled:r,"aria-label":`${i} ${l?.toLowerCase()||""}`,onChange:d=>{let u=Number(d.target.value);if(Number.isFinite(u)){let b=Math.max(t,Math.min(n,u)),g=[...e];g[c]=b,o(g)}}})})]},i))})}function sh({selectedItem:e,selectedBinding:t,open:n,onToggle:a,updateBinding:r,moveModeEnabled:o,onToggleMoveMode:s,transformSpace:l,onTransformSpaceChange:i,originalTransform:c}){let d=t.transform?.rotation??c?.rotation??[0,0,0],u=t.transform?.position??c?.position??[0,0,0],b=(p,m)=>{let S=p.transform?.rotation??c?.rotation??[0,0,0],M=p.transform?.position??c?.position??[0,0,0],k=p.transform?.scale??c?.scale??[1,1,1],R=c?.pivotLocal??[0,0,0],f=Ug(M,S,m,k,R,c?.rotationOrder??"XYZ");return{...p,transform:{...p.transform,position:f,rotation:m}}},g=(p,m)=>{e&&r(e,S=>{let M=S.transform?.rotation??c?.rotation??[0,0,0],k=tM(M,p,m);return b(S,k)})},h=(p,m)=>{e&&r(e,S=>{let k=[...S.transform?.rotation??c?.rotation??[0,0,0]];return k[p]=ih(wp(m)),b(S,k)})},w=(p,m)=>{e&&r(e,S=>{let k=[...S.transform?.position??c?.position??[0,0,0]];return k[p]=m,{...S,transform:{...S.transform,position:k}}})},B=(p,m)=>{e&&w(p,u[p]+m)},v=()=>{!e||!c||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 br(zn,{title:"Move & Rotate",open:n,onToggle:a,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:[br("div",{className:"se-field",children:[br("div",{className:"se-fieldLabel",children:[br("span",{children:[Pt(Z2,{size:14,style:{marginRight:6,verticalAlign:"-2px"}}),"Transform gizmo"]}),br("label",{className:"se-switch","aria-label":"Toggle move mode",children:[Pt("input",{type:"checkbox",checked:o,onChange:p=>s(p.target.checked)}),Pt("span",{className:"se-switchTrack",children:Pt("span",{className:"se-switchThumb"})})]})]}),Pt("span",{className:"bb-note",children:"Select a mesh \xB7 drag the colored arrows or planes to move"})]}),br("div",{className:"se-field",style:{marginTop:10},children:[Pt("div",{className:"se-fieldLabel",children:Pt("span",{children:"Axis space"})}),Pt("div",{className:"se-segmentedControl",children:["world","local"].map(p=>Pt("button",{type:"button",className:`se-segmentedOption ${l===p?"se-segmentedOption--active":""}`,onClick:()=>i(p),children:p},p))})]}),br("div",{className:"se-field",style:{marginTop:10},children:[Pt("div",{className:"se-fieldLabel",children:Pt("span",{children:"Rotation (degrees)"})}),Pt("div",{className:"bb-transformAxesGrid",children:oh.map((p,m)=>{let S=Math.round(ah(d[m]));return br("div",{className:"bb-transformAxis",children:[Pt("span",{className:"se-axisStepperLabel bb-transformAxisLabel",children:p}),Pt("div",{className:"bb-transformAxisControl",children:Pt("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 k=Number(M.target.value);Number.isFinite(k)&&h(m,k)}})})]},p)})})]}),br("div",{className:"se-field",style:{marginTop:10},children:[Pt("div",{className:"se-fieldLabel",children:Pt("span",{children:"Position"})}),Pt(nM,{value:u,min:-1/0,max:1/0,step:eM,disabled:!e,label:"position",onChange:p=>{e&&r(e,m=>({...m,transform:{...m.transform,position:p}}))}})]}),br("button",{type:"button",className:"bb-button bb-button--ghost",style:{marginTop:10,display:"inline-flex",alignItems:"center",gap:6},disabled:!e||!c,onClick:v,title:"Restore this node's position and rotation to what they were in the original model",children:[Pt(Q2,{size:14}),"Restore original position & rotation"]})]})}import{useMemo as ch,useState as sM}from"react";function rM(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 Cp(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 oM(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 aM(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 iM(e){let t=oM(e);return{id:rM(e),modelObjectId:e,type:t,label:Cp(e),status:"normal",selectable:!0,hoverable:!0,visible:!0,style:{},actions:aM(t),metrics:{},metadata:{}}}function Sp(e){return Object.fromEntries(e.map(t=>[t,iM(t)]))}function lh(e){let{nodesById:t}=ba(e),n=[];for(let[a,r]of Object.entries(t)){let o=r;o.isMesh&&o.geometry&&r.name&&n.push(a)}return n.sort((a,r)=>a.localeCompare(r))}import{Fragment as lM,jsx as Go,jsxs as io}from"react/jsx-runtime";function dh({bindings:e,selectedItem:t,onSelect:n,onHover:a,isOpen:r=!0,onToggle:o}){let[s,l]=sM(""),i=ch(()=>Object.keys(e),[e]),c=ch(()=>{let d=s.trim().toLowerCase();return d?i.filter(u=>{let b=e[u];return u.toLowerCase().includes(d)||b.label?.toLowerCase().includes(d)||b.type.toLowerCase().includes(d)}):i},[e,i,s]);return io("aside",{className:`bb-sidebar bb-sidebar--right ${r?"":"bb-sidebar--collapsed"}`,children:[io("div",{className:"bb-header bb-header--sidebar",children:[!r&&Go("button",{type:"button",className:"bb-sidebarToggle",onClick:()=>o?.(!0),"aria-label":"Open scene nodes sidebar",title:"Open scene nodes",children:"\u2190"}),r&&io(lM,{children:[io("div",{children:[Go("div",{className:"bb-sectionKicker",children:"Scene Nodes"}),io("div",{className:"bb-sectionHeading",children:[c.length," visible entries"]})]}),Go("button",{type:"button",className:"bb-sidebarToggle",onClick:()=>o?.(!1),"aria-label":"Close scene nodes sidebar",title:"Close scene nodes",children:"\u2192"})]})]}),r&&io("section",{className:"bb-nodeList",children:[Go("div",{className:"bb-search",children:Go("input",{className:"bb-input",placeholder:"Search nodes, labels, or types",value:s,onChange:d=>l(d.target.value)})}),Go("div",{className:"bb-nodeItems",children:c.map(d=>{let u=e[d];return io("button",{type:"button",className:`bb-nodeButton ${d===t?"bb-nodeButton--active":""}`,onClick:()=>n(d),onMouseEnter:()=>a?.(d),onMouseLeave:()=>a?.(null),children:[Go("span",{className:"bb-nodeName",children:d}),io("span",{className:"bb-nodeMeta",children:[u.type,u.label===Cp(d)?"":u.label||"\xB7 Untitled"]})]},d)})})]})]})}import{jsx as Bl,jsxs as ph}from"react/jsx-runtime";function Mp({title:e,label:t,open:n,onToggle:a,draft:r,error:o,example:s,onDraftChange:l,onCommit:i}){return Bl(zn,{title:e,open:n,onToggle:a,children:ph("div",{className:"bb-field",children:[Bl("label",{className:"bb-label",children:t}),Bl("textarea",{className:"bb-textarea",value:r,onChange:c=>l(c.target.value),onBlur:i}),o?Bl("span",{className:"bb-status bb-status--error",children:o}):ph("span",{className:"bb-note",children:["Use a JSON object like ",s,"."]})]})})}function uh(e,t){let n=new Map(e.animations.clips.map(o=>[o.sourceName,o])),a=t.map(({sourceName:o})=>n.get(o)??{sourceName:o,displayName:o,hidden:!1,loopMode:"repeat",speed:1}),r=e.animations.autoplayClip&&a.some(o=>o.sourceName===e.animations.autoplayClip&&!o.hidden)?e.animations.autoplayClip:null;return{clips:a,autoplayClip:r}}import{useCallback as Ol,useReducer as cM,useRef as dM}from"react";var pM=100;function uM(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(-pM),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,...a]=e.future;return{past:[...e.past,e.present],present:n,future:a}}case"reset":return{past:[],present:t.value,future:[]}}}function kp(e,t=600){let[n,a]=cM(uM,{past:[],present:e,future:[]}),r=dM(0),o=Ol(c=>{let d=Date.now(),u=d-r.current<t;r.current=d,a({type:"set",updater:c,coalesce:u})},[t]),s=Ol(()=>{r.current=0,a({type:"undo"})},[]),l=Ol(()=>{r.current=0,a({type:"redo"})},[]),i=Ol(c=>{r.current=0,a({type:"reset",value:c})},[]);return{value:n.present,setValue:o,undo:s,redo:l,reset:i,canUndo:n.past.length>0,canRedo:n.future.length>0}}import{strToU8 as mM}from"fflate";function mh(e){return JSON.stringify(e,null,2)}function bh(e){return['import { defineObjectBindings } from "@liveroom-tech/react-immersive/utils";',"",`export const objectBindings = defineObjectBindings(${JSON.stringify(e,null,2)});`,""].join(`
10
10
  `)}function gh(e){return JSON.stringify(e,null,2)}function fh(e){return['import type { SceneConfig } from "@liveroom-tech/react-immersive/utils";',"",`export const sceneConfig: SceneConfig = ${JSON.stringify(e,null,2)};`,""].join(`
11
- `)}function Hi(e,t,n){Ar(new Blob([t],{type:n}),e)}function Pp(e){return JSON.stringify(e??{},null,2)}function Tp(e){return`[${e[0].toFixed(3)}, ${e[1].toFixed(3)}, ${e[2].toFixed(3)}]`}function bM(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 hh(e){let t=new Set;for(let r of Object.values(e))for(let o of bM(r))t.add(o);let n=[],a=[];return await Promise.all(Array.from(t).map(async r=>{let o=em(r);if(o)try{let s=await fetch(o);if(!s.ok)throw new Error(String(s.status));n.push({path:r,blob:await s.blob()})}catch{a.push(r)}})),{assets:n,failedPaths:a}}async function Rp(e,t,n,a,r){if(r.length===0){Hi(e,t,n);return}let o={[e]:mM(t)};for(let l of r)o[l.path]=new Uint8Array(await l.blob.arrayBuffer());let s=await hs(o);Ar(new Blob([s],{type:"application/zip"}),a)}var Ap={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"]},xh=Object.keys(Ap);function vh(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 Bp(e){if(e)return Object.values(e).some(vh)?e:void 0}function er(e,t){return e?Ap[t].some(n=>vh(e[n])):!1}function Op(e){return{pbr:er(e,"pbr"),roughness:er(e,"roughness"),emission:er(e,"emission"),opacity:er(e,"opacity"),normalBump:er(e,"normalBump"),displacement:er(e,"displacement"),ao:er(e,"ao"),clearcoat:er(e,"clearcoat"),sheen:er(e,"sheen"),anisotropy:er(e,"anisotropy"),transmission:er(e,"transmission"),faces:er(e,"faces")}}function Ep(e,t){if(t)return{...e,style:{...e.style,material:t}};if(!e.style)return e;let{material:n,...a}=e.style;return{...e,style:Object.keys(a).length>0?a:void 0}}function yh(e,t){if(!e)return;let n={...e};for(let a of Ap[t])delete n[a];return n}import{Fragment as Gi,jsx as q,jsxs as Ie}from"react/jsx-runtime";var hM="/room.glb";function Ll(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function kh(e,t){if(!Ll(e)||!Ll(t))return t??e;let n={...e};for(let[a,r]of Object.entries(t)){let o=n[a];n[a]=Ll(o)&&Ll(r)?kh(o,r):r}return n}function Ph({licenseKey:e,licenseValidationUrl:t,dracoDecoderPath:n,ktx2TranscoderPath:a,meshopt:r,project:o,onProjectChange:s,projectChangeDebounceMs:l=350,onModelUpload:i,onEditLeaseChange:c}){let d=Gn(null),u=Gn(null),b=Gn(null),[g,h]=$e(o?.model.url??null),[w,B]=$e(o?.model.name??""),[v,p]=$e(o?.model??null),[m,S]=$e(null),M=kp(o?.objectBindings??{}),k=M.value,R=M.setValue,[f,C]=$e(!1),[x,P]=$e(!1),[z,A]=$e("Load the demo model or upload a GLB, GLTF, OBJ, FBX, or USDZ model to generate bindings."),[j,T]=$e("default"),[I,F]=$e(!1),[O,E]=$e("{}"),[W,U]=$e("{}"),[ae,xe]=$e(null),[le,ge]=$e(null),[he,Se]=$e(!1),[at,wt]=$e(!1),[Xe,Me]=$e(!1),[Te,At]=$e({identity:!0,basics:!0,material:!1,actions:!1,camera:!1,transform:!1,metrics:!1,metadata:!1}),[Ke,nn]=$e({pbr:!0,roughness:!1,emission:!1,opacity:!1,normalBump:!1,displacement:!1,ao:!1,clearcoat:!1,sheen:!1,anisotropy:!1,transmission:!1,faces:!1}),Ye=D=>At(V=>({...V,[D]:!V[D]})),qt=D=>nn(V=>({...V,[D]:!V[D]})),[Bt,Be]=$e("object"),[nt,ee]=$e("General"),[oe,Ot]=$e("metalness"),[it,Ge]=$e(Op()),Je=Gn(null),[Et,Ut]=$e(!1),[Dt,Sn]=$e(!0),[pn,me]=$e(!0),[et,Fe]=$e(!1),[Re,ht]=$e(null),[rt,xt]=$e(!1),[Nt,Mn]=$e("world"),Z=Gn({}),L=kp(o?.sceneConfig??ho),_=L.value,H=L.setValue,[K,Y]=$e(null),[ie,re]=$e(null),tt=fl(e,t),se=rf(tt.tier),vt=Lp(()=>({isInsideEditor:!0,activeTab:Bt,activeSubTab:nt,tier:se,setActiveTab:Be,setActiveSubTab:ee}),[Bt,nt,se]),De=Gn(null),qe=Gn(0),de=Gn(0),lt=Gn(o?`${o.id}:${o.revision}`:null),Ht=Gn(!1),st=Gn(!1),Ct=Gn(o?{requestId:0,modelName:o.model.name??"model",modelUrl:o.model.url,storedBindings:o.objectBindings,streaming:!!o.model.tilesetUrl}:null),ct=Gn(null),{cameraState:Ce,resetView:Vr,focusObject:Wa,fitScene:$a,setCameraState:kn,handleCameraChange:Wo,handleViewerReady:Vl}=op(),Ul=dn(D=>{kn({position:D.position,target:D.target,fov:Ce?.fov??null,zoom:Ce?.zoom??1,azimuthAngle:D.azimuthAngle,polarAngle:D.polarAngle},!0)},[kn,Ce]),Mr=ap(),ot=m?k[m]??null:null,lo=ot?.style?.material,dr=ot?.cameraState,Xi=Ce?{position:Tp(Ce.position),target:Tp(Ce.target)}:null,co=dn(D=>{H(V=>{let te=V.annotations.map(ke=>ke.id).join(","),be=D.map(ke=>ke.id).join(",");return te===be?V:{...V,annotations:D}})},[]),$o=dn(D=>{Y(D?{annotation:D}:null)},[]);Go(()=>{if(!ot){E("{}"),U("{}"),xe(null),ge(null);return}E(Pp(ot.metrics)),U(Pp(ot.metadata)),xe(null),ge(null)},[ot]),Go(()=>{let D=Op(lo);if(Je.current!==m){Je.current=m,Ge(D);return}Ge(V=>{let te=!1,be={...V};for(let ke of xh)D[ke]&&!V[ke]&&(be[ke]=!0,te=!0);return te?be:V})},[m,lo]),Go(()=>()=>{De.current?.cleanup()},[]),Go(()=>{if(!o)return;let D=`${o.id}:${o.revision}`;if(lt.current===D)return;lt.current=D;let V=g!==o.model.url||v?.tilesetUrl!==o.model.tilesetUrl||v?.assetVersion!==o.model.assetVersion,te=k!==o.objectBindings,be=_!==o.sceneConfig;if((V||te||be)&&(st.current=!0),p(o.model),B(o.model.name??"model"),te&&M.reset(o.objectBindings),be&&L.reset(o.sceneConfig),V){let ke=++de.current;Ct.current={requestId:ke,modelName:o.model.name??"model",modelUrl:o.model.url,storedBindings:o.objectBindings,streaming:!!o.model.tilesetUrl},ct.current=null,S(null),C(!0),h(o.model.url)}},[k,o,g,_,v,M,L]),Go(()=>{if(!o||!s||!g)return;if(!Ht.current){Ht.current=!0;return}if(g===o.model.url&&k===o.objectBindings&&_===o.sceneConfig)return;if(st.current){st.current=!1;return}let D=window.setTimeout(()=>{s({projectId:o.id,baseRevision:o.revision,model:{...v??o.model,url:g,name:w||o.model.name},objectBindings:k,sceneConfig:_},"local")},l);return()=>window.clearTimeout(D)},[k,w,g,s,o,l,v,_]),Go(()=>{let D=V=>{if(V.key.toLowerCase()!=="z"||!(V.metaKey||V.ctrlKey))return;let te=V.target,be=te?.tagName;if(be==="INPUT"||be==="TEXTAREA"||te?.isContentEditable)return;V.preventDefault();let ke=Bt==="scene"?L:M;V.shiftKey?ke.redo():ke.undo()};return window.addEventListener("keydown",D),()=>window.removeEventListener("keydown",D)},[Bt,M,L]),Go(()=>{if(f||j==="default"||j==="success")return;F(!0);let D=window.setTimeout(()=>F(!1),4e3);return()=>window.clearTimeout(D)},[z,j,f]);let _n=Lp(()=>Object.keys(k),[k]),Xa=Lp(()=>!m||!ot?null:ot.id.trim()?Object.entries(k).some(([te,be])=>te!==m&&be.id===ot.id)?"Another binding already uses this ID.":null:"ID is required.",[k,m,ot]),Wn=(D,V)=>{R(te=>({...te,[D]:V(te[D])}))},Xo=(D,V)=>{Wn(D,te=>{let be=Bp(V(te.style?.material));return Ep(te,be)})},Hl=(D,V,te)=>{Xo(D,be=>({...be,[V]:te?{path:te}:void 0}))},Gl=(D,V)=>{Ge(te=>({...te,[D]:V})),!V&&m&&Wn(m,te=>{let be=Bp(yh(te.style?.material,D));return Ep(te,be)})},Ka=dn((D,V,te)=>{let be=lh(D),ke=Sp(be);if(te){let dt=new Map(Object.values(te).map(Oe=>[Oe.modelObjectId,Oe]));for(let Oe of be){let Pn=dt.get(Oe);Pn&&(ke[Oe]=Pn)}}D.updateMatrixWorld(!0);let _t={};for(let dt of be){let Oe=ar(D,dt);if(!Oe){_t[dt]={position:[0,0,0],rotation:[0,0,0],scale:[1,1,1],pivotLocal:[0,0,0],rotationOrder:"XYZ"};continue}let Pn=Sl(Oe);_t[dt]={position:[Oe.position.x,Oe.position.y,Oe.position.z],rotation:[Oe.rotation.x,Oe.rotation.y,Oe.rotation.z],scale:[Oe.scale.x,Oe.scale.y,Oe.scale.z],pivotLocal:[Pn.x,Pn.y,Pn.z],rotationOrder:Oe.rotation.order}}Z.current=_t,M.reset(ke),S(be[0]??null),te||H(dt=>({...dt,annotations:[]})),A(`Generated ${be.length} bindings from ${V}.`),T("success"),C(!1)},[M,H]),Ya=(D,V,te,be)=>{let ke=++de.current;C(!0);let _t=te?te/1048576:0;A(_t>=100?`Reading ${V} (${Math.round(_t)}MB \u2014 large file, this can take a while)...`:`Reading ${V} and generating starter bindings...`),T("default"),B(V),p(be??{url:D,name:V}),Y(null);let dt=ct.current;if(D===g&&dt?.url===D){Ct.current=null,Ka(dt.scene,V);return}Ct.current={requestId:ke,modelName:V,modelUrl:D,streaming:!!be?.tilesetUrl},h(D),M.reset({}),S(null)},zn=dn(D=>{let V=Ct.current;if(!(!V||V.requestId!==de.current)){if(Ct.current=null,ct.current={url:V.modelUrl,scene:D},V.streaming){V.storedBindings&&(st.current=!0,M.reset(V.storedBindings)),A(`Streaming ${V.modelName}. Scene settings are editable; per-part bindings require a stable object catalog from the ingestion worker.`),T("success"),C(!1);return}V.storedBindings&&(st.current=!0),Ka(D,V.modelName,V.storedBindings)}},[Ka,M]),Ki=dn(D=>{let V=Ct.current;!V||V.requestId!==de.current||(Ct.current=null,console.error(D),A(`Could not read ${V.modelName}. Make sure the file is a valid GLB, GLTF, OBJ, FBX, or USDZ asset.`),T("error"),C(!1))},[]),pr=dn(D=>{Mr.handleAnimationsReady(D);let V=D.clipDetails??D.clips.map(te=>({sourceName:te,duration:0}));H(te=>({...te,animations:uh(te,V)}))},[Mr,H]),Ko=async()=>{De.current?.cleanup(),De.current=null,await Ya(hM,"room.glb")},Zt=async D=>{if(i){try{C(!0),A(`Uploading ${D.name}...`),T("default");let te=await i(D);await Ya(te.url,te.name??D.name,D.size,te)}catch(te){C(!1),A(te instanceof Error?te.message:`Could not upload ${D.name}.`),T("error")}return}let V;try{V=await Bs(D)}catch(te){A(te instanceof Error?te.message:"Could not read model file. Upload a .glb, .gltf, .obj, .fbx, .usdz, or .zip asset."),T("error");return}De.current?.cleanup(),De.current=V,await Ya(V.url,V.name,D.size,{url:V.url,name:V.name})},ur=async D=>{let V=D.target.files?.[0];V&&(await Zt(V),D.target.value="")},po=()=>{De.current?.cleanup(),De.current=null,ct.current=null,Ct.current=null,Z.current={},qe.current=0,Se(!1),h(null),B(""),p(null),S(null),Y(null),M.reset({}),E("{}"),U("{}"),xe(null),ge(null),re(null),xt(!1),H(D=>({...D,animations:ho.animations,annotations:[]})),A("Load the demo model or upload a GLB, GLTF, OBJ, FBX, or USDZ model to generate bindings."),T("default")},Ja=()=>{d.current?.click()},rr=()=>{u.current?.click()},Yo=async D=>{P(!0);try{let{assets:V,failedPaths:te}=await hh(k);D==="json"?await Rp("objectBindings.json",mh(k),"application/json","objectBindings.zip",V):await Rp("objectBindings.ts",bh(k),"text/typescript","objectBindings-ts.zip",V),te.length>0?(A(`Exported, but ${te.length} uploaded image${te.length===1?"":"s"} couldn't be bundled: ${te.join(", ")}.`),T("error")):V.length>0&&(A(`Exported with ${V.length} uploaded image${V.length===1?"":"s"} bundled into the zip.`),T("success"))}catch(V){let te=V instanceof Error?V.message:"Unknown export error.";A(`Failed to export bindings: ${te}`),T("error")}finally{P(!1)}},uo=async D=>{if(!_n.length){A("Load a model before importing bindings."),T("error");return}let V;try{V=JSON.parse(await D.text())}catch{A(`${D.name} is not valid JSON.`),T("error");return}if(V===null||typeof V!="object"||Array.isArray(V)){A("Expected a JSON object mapping object IDs to bindings."),T("error");return}let te=new Map;for(let dt of Object.values(V))if(dt!==null&&typeof dt=="object"&&typeof dt.id=="string"&&typeof dt.type=="string"&&typeof dt.modelObjectId=="string"){let Oe=dt;te.set(Oe.modelObjectId,Oe)}if(te.size===0){A(`${D.name} doesn't look like an exported bindings file.`),T("error");return}let be={...k},ke=0;for(let dt of Object.keys(be)){let Oe=te.get(dt);Oe&&(be[dt]=Oe,ke++)}if(ke===0){A(`None of the object IDs in ${D.name} match this model \u2014 nothing imported.`),T("error");return}R(be);let _t=te.size-ke;A(_t>0?`Imported ${ke} binding${ke===1?"":"s"} from ${D.name} (${_t} skipped \u2014 not in this model).`:`Imported ${ke} binding${ke===1?"":"s"} from ${D.name}.`),T("success")},Jo=async D=>{let V=D.target.files?.[0];V&&(await uo(V),D.target.value="")},mo=()=>{b.current?.click()},kr=async D=>{let V;try{V=JSON.parse(await D.text())}catch{A(`${D.name} is not valid JSON.`),T("error");return}if(V===null||typeof V!="object"||Array.isArray(V)){A("Expected a JSON object with scene config sections."),T("error");return}let te=["model","camera","lighting","wireframe","shadows","environment","background","groundShadows","postProcessing","animations","annotations","cinematic"],be=V,ke=te.filter(_t=>be[_t]!==void 0);if(ke.length===0){A(`${D.name} doesn't look like an exported scene config file.`),T("error");return}H(_t=>{let dt={..._t};for(let Oe of ke)dt[Oe]=kh(_t[Oe],be[Oe]);return dt}),A(`Imported ${ke.length} section${ke.length===1?"":"s"} from ${D.name}.`),T("success")},Yi=async D=>{let V=D.target.files?.[0];V&&(await kr(V),D.target.value="")},Wl=D=>{D.preventDefault(),D.stopPropagation(),!(f||g)&&(qe.current+=1,Se(!0))},qa=D=>{D.preventDefault(),D.stopPropagation(),!(f||g)&&(D.dataTransfer.dropEffect="copy",Se(!0))},Ji=D=>{D.preventDefault(),D.stopPropagation(),!(f||g)&&(qe.current=Math.max(0,qe.current-1),qe.current===0&&Se(!1))},qo=async D=>{if(D.preventDefault(),D.stopPropagation(),qe.current=0,Se(!1),f||g)return;let V=D.dataTransfer.files?.[0];V&&await Zt(V)},Za=(D,V,te)=>{if(!m)return;let be;try{be=JSON.parse(V)}catch{te("Invalid JSON");return}if(be===null||typeof be!="object"||Array.isArray(be)){te("Expected a JSON object");return}if(D==="metrics"&&Object.values(be).some(_t=>typeof _t!="number"||!Number.isFinite(_t))){te("Metrics values must be numbers");return}Wn(m,ke=>({...ke,[D]:be})),te(null)},qi=dn(D=>{if(!D){S(null);return}let V=Object.entries(k).find(([te,be])=>be===D||te===D.modelObjectId||be.modelObjectId===D.modelObjectId)?.[0]??null;S(V)},[k]),Zi=dn(async D=>{S(D),re(null),await Wa(D)},[Wa]),$l=dn(()=>{if(!m||!Ce)return;let D={position:Ce.position,target:Ce.target,...Ce.fov!=null?{fov:Ce.fov}:{},zoom:Ce.zoom};Wn(m,V=>({...V,cameraState:D}))},[m,Ce]),Xl=dn(()=>{!dr?.position||!dr?.target||kn({position:dr.position,target:dr.target,fov:dr.fov??Ce?.fov??null,zoom:dr.zoom??Ce?.zoom??1},!0)},[dr,kn,Ce]),Qi=dn(()=>{m&&Wn(m,D=>({...D,cameraState:void 0}))},[m]),bo=dn(async()=>{await Vr()},[Vr]),es=dn(async()=>{await $a()},[$a]),ts=dn(D=>{ht(D),Fe(!0)},[]),Pr=dn(()=>{Fe(!1),ht(null)},[]),Zo=dn(()=>{if(Re==="bindings"){if(!_n.length){Pr();return}let D=Sp(_n);M.reset(D),S(_n[0]??null),A("Object bindings reset to default values."),T("success")}else Re==="scene"&&(L.reset(ho),A("Scene config reset to default values."),T("success"));Pr()},[Re,_n,M,L,Pr]);return tt.status==="checking"?q("div",{className:"bb-root bb-root--licenseChecking",children:q(yo,{title:"Verifying License",message:"Checking your license key..."})}):tt.status==="invalid"?q("div",{className:"bb-root bb-root--licenseInvalid",children:q(yo,{tone:"error",title:"Invalid License",message:tt.isLocalDomain?tt.reason??"License has been revoked or has expired":"Failed to load. Please contact the site administrator."})}):Ie(Xd.Provider,{value:vt,children:[Ie("div",{className:"bb-root",children:[q("input",{ref:d,type:"file",accept:As,className:"bb-hiddenInput",onChange:ur,disabled:f}),q("input",{ref:u,type:"file",accept:".json,application/json",className:"bb-hiddenInput",onChange:Jo,disabled:f}),q("input",{ref:b,type:"file",accept:".json,application/json",className:"bb-hiddenInput",onChange:Yi,disabled:f}),Ie("aside",{className:`bb-sidebar bb-sidebar--left ${at?"bb-sidebar--collapsed":""}`,children:[Ie("div",{className:"bb-header bb-header--sidebar",children:[!at&&q("h1",{className:"bb-title",children:"Binding Builder"}),q("button",{type:"button",className:"bb-sidebarToggle",onClick:()=>wt(D=>!D),"aria-label":at?"Open editor sidebar":"Collapse editor sidebar",title:at?"Open editor":"Collapse editor",children:at?"\u2192":"\u2190"})]}),!at&&Ie(Gi,{children:[Ie("div",{className:"bb-tabRow",children:[q("button",{type:"button",className:`bb-tab ${Bt==="object"?"bb-tab--active":""}`,onClick:()=>Be("object"),children:"Object"}),q("button",{type:"button",className:`bb-tab ${Bt==="scene"?"bb-tab--active":""}`,onClick:()=>Be("scene"),children:"Scene"})]}),q("section",{className:"bb-editor",children:Bt==="scene"?q(Gi,{children:g?q(bp,{config:_,onChange:H,activeSubTab:nt,onActiveSubTabChange:ee,cameraState:nt==="Cinematic"&&Ce?{position:Ce.position,target:Ce.target,azimuthAngle:Ce.azimuthAngle,polarAngle:Ce.polarAngle}:null,onPreviewWaypoint:Ul,animationClipDetails:Mr.clipDetails,animationPlayback:Mr}):q("div",{className:"bb-emptyEditor",children:"Upload a model to edit its scene settings."})}):!ot||!m?q("div",{className:"bb-emptyEditor",children:"Select a generated node binding to edit its values."}):Ie(Gi,{children:[q("div",{className:"bb-editorHeader",children:Ie("div",{children:[q("div",{className:"bb-sectionKicker",children:"Editing Binding"}),q("h2",{className:"bb-editorTitle",children:ot.label||m}),Ie("div",{className:"bb-editorMeta",children:[q("span",{children:ot.type}),q("span",{children:ot.modelObjectId})]})]})}),q(Kf,{selectedItem:m,selectedBinding:ot,open:Te.identity,onToggle:()=>Ye("identity"),updateBinding:Wn,idError:Xa}),q(Zf,{selectedItem:m,selectedBinding:ot,open:Te.basics,onToggle:()=>Ye("basics"),updateBinding:Wn}),Ie(Nn,{title:"Material",open:Te.material,onToggle:()=>Ye("material"),tooltip:"Edit the selected object's base material, textures, and surface properties.",children:[q(Xf,{disabled:!m,onApply:D=>m&&Xo(m,V=>({...V,...D}))}),q(Wf,{selectedItem:m,selectedMaterial:lo,pbrWorkflow:oe,onPbrWorkflowChange:Ot,openMaterialPanels:Ke,materialPanelEnabled:it,onToggleMaterialPanel:qt,onSetMaterialPanelState:Gl,updateSelectedMaterial:Xo,setSelectedTexturePath:Hl})]}),q(nh,{selectedItem:m,selectedBinding:ot,open:Te.actions,onToggle:()=>Ye("actions"),updateBinding:Wn}),q(rh,{selectedBinding:ot,open:Te.camera,onToggle:()=>Ye("camera"),cameraState:Ce,formattedCameraState:Xi,savedCameraPosition:dr,onSaveCameraPosition:$l,onGoToSavedCamera:Xl,onClearSavedCamera:Qi,onResetView:bo,onFitScene:es}),q(sh,{selectedItem:m,selectedBinding:ot,open:Te.transform,onToggle:()=>Ye("transform"),updateBinding:Wn,moveModeEnabled:rt,onToggleMoveMode:xt,transformSpace:Nt,onTransformSpaceChange:Mn,originalTransform:Z.current[m]??null}),q(Mp,{title:"Metrics",label:"Metrics JSON",open:Te.metrics,onToggle:()=>Ye("metrics"),draft:O,error:ae,example:'{"area": 42}',onDraftChange:E,onCommit:()=>Za("metrics",O,xe)}),q(Mp,{title:"Metadata",label:"Metadata JSON",open:Te.metadata,onToggle:()=>Ye("metadata"),draft:W,error:le,example:'{"room": "kitchen"}',onDraftChange:U,onCommit:()=>Za("metadata",W,ge)})]})}),Bt==="object"&&Ie("div",{className:"bb-toolbar",children:[Ie("div",{className:"bb-toolbarGroup",children:[q("button",{type:"button",className:"bb-iconButton",disabled:!M.canUndo,onClick:M.undo,title:"Undo (Cmd/Ctrl+Z)",children:q(Ch,{size:16})}),q("button",{type:"button",className:"bb-iconButton",disabled:!_n.length,onClick:()=>ts("bindings"),title:"Reset object bindings to default",children:q(Mh,{size:16})}),q("button",{type:"button",className:"bb-iconButton",disabled:!M.canRedo,onClick:M.redo,title:"Redo (Cmd/Ctrl+Shift+Z)",children:q(wh,{size:16})})]}),q("div",{className:"bb-toolbarDivider"}),Ie("button",{type:"button",className:"bb-button bb-button--ghost",disabled:!_n.length||f,onClick:rr,title:"Re-apply a previously exported objectBindings.json onto this model",children:[q(Sh,{size:14}),"Import"]}),q("div",{className:"bb-toolbarDivider"}),q(xp,{disabled:!_n.length||x,exporting:x,onExportJson:()=>Yo("json"),onExportTs:()=>Yo("ts")})]}),Bt==="scene"&&Ie("div",{className:"bb-toolbar",children:[Ie("div",{className:"bb-toolbarGroup",children:[q("button",{type:"button",className:"bb-iconButton",disabled:!L.canUndo,onClick:L.undo,title:"Undo (Cmd/Ctrl+Z)",children:q(Ch,{size:16})}),q("button",{type:"button",className:"bb-iconButton",onClick:()=>ts("scene"),title:"Reset scene config to default",children:q(Mh,{size:16})}),q("button",{type:"button",className:"bb-iconButton",disabled:!L.canRedo,onClick:L.redo,title:"Redo (Cmd/Ctrl+Shift+Z)",children:q(wh,{size:16})})]}),q("div",{className:"bb-toolbarDivider"}),Ie("button",{type:"button",className:"bb-button bb-button--ghost",disabled:!_n.length||f,onClick:mo,title:"Re-apply a previously exported sceneConfig.json",children:[q(Sh,{size:14}),"Import"]}),q("div",{className:"bb-toolbarDivider"}),q(xp,{disabled:!_n.length||f,onExportJson:()=>Hi("sceneConfig.json",gh(_),"application/json"),onExportTs:()=>Hi("sceneConfig.ts",fh(_),"text/typescript")})]})]})]}),Ie("main",{className:"bb-previewShell",children:[Ie("div",{className:"bb-previewHeader",children:[Ie("div",{className:"bb-previewToggles",children:[Ie("label",{className:"bb-checkbox bb-checkbox--compact",style:{color:"black"},children:[q("input",{type:"checkbox",checked:Et,onChange:D=>Ut(D.target.checked)}),"Zoom on selected"]}),Ie("label",{className:"bb-checkbox bb-checkbox--compact",style:{color:"black"},children:[q("input",{type:"checkbox",checked:Dt,onChange:D=>Sn(D.target.checked)}),"Highlight on hover"]}),Ie("label",{className:"bb-checkbox bb-checkbox--compact",style:{color:"black"},children:[q("input",{type:"checkbox",checked:pn,onChange:D=>me(D.target.checked)}),"Camera controller"]})]}),Ie("div",{className:"bb-previewControlsColumn",children:[Ie("div",{className:"bb-previewControls",children:[q("div",{className:"bb-previewMeta",children:q("span",{children:m?`Focused: ${m}`:"Select a node to inspect it"})}),g&&q("button",{type:"button",className:"bb-button bb-button--ghost bb-removeModelButton",onClick:po,children:"Remove model"})]}),g&&q("div",{className:"bb-moveHint",children:rt?q(Gi,{children:"Select a mesh \xB7 drag the colored arrows, planes, or rings"}):Ie(Gi,{children:[q("kbd",{children:"W"}),q("kbd",{children:"A"}),q("kbd",{children:"S"}),q("kbd",{children:"D"})," move \xB7 ",q("kbd",{children:"Space"}),"/",q("kbd",{children:"C"})," up \xB7 down \xB7 drag to look"]})})]})]}),Ie("div",{className:"bb-preview",children:[q(Ba,{visible:f||I,message:z,tone:j,spinner:f}),g?q(Tl,{modelUrl:g,tilesetUrl:v?.tilesetUrl,objectBindings:k,selectedObject:ot,onObjectSelect:qi,onObjectBindingsChange:R,onObjectEditLeaseChange:(D,V)=>c?.(D.modelObjectId||D.id,V),showObjectBindingDataPanel:!1,showSceneObjectsPanel:!1,onCameraChange:Wo,onViewerReady:Vl,onAnnotationsChange:co,activeAnnotation:K?.annotation??null,onActiveAnnotationChange:$o,onAnimationsReady:pr,onModelLoaded:zn,onLoadError:Ki,licenseKey:e,licenseValidationUrl:t,dracoDecoderPath:n,ktx2TranscoderPath:a,meshopt:r,sceneConfig:_,onSceneConfigChange:H,renderMode:"always",preserveDrawingBuffer:!0,disableZoom:!1,zoomOnSelected:Et,highlightOnHover:Dt,enableCameraControls:pn,moveModeEnabled:rt,objectTransformSpace:Nt,enableKeyboardNavigation:!0,showViewGizmo:!0,panelHoveredObject:Dt?ie:null,showLoadingOverlay:!1}):q("div",{className:`bb-previewPlaceholder ${he?"bb-previewPlaceholder--dragActive":""}`,onDragEnter:Wl,onDragOver:qa,onDragLeave:Ji,onDrop:qo,children:Ie("div",{children:[q("div",{children:"Upload a GLB, GLTF, OBJ, FBX, or USDZ model, or drag a supported model/ZIP bundle here to generate editable object bindings."}),q("button",{type:"button",className:"bb-previewPlaceholderButton",onClick:Ja,disabled:f,children:f?"Loading model...":"Upload"})]})})]})]}),q(dh,{bindings:k,selectedItem:m,onSelect:Zi,onHover:D=>{if(!D){re(null);return}re(k[D]??null)},isOpen:!Xe,onToggle:D=>Me(!D)})]}),et&&q("div",{className:"bb-reset-overlay",onClick:Pr,children:Ie("div",{className:"bb-reset-dialog",onClick:D=>D.stopPropagation(),children:[Ie("div",{className:"bb-reset-header",children:[Ie("h3",{className:"bb-reset-title",children:[q(fM,{size:20,className:"bb-icon-warning"}),"Confirm Reset"]}),q("button",{className:"bb-reset-close",onClick:Pr,children:q(gM,{size:20})})]}),Ie("div",{className:"bb-reset-body",children:[Ie("p",{className:"bb-reset-message",children:["Are you sure you want to reset"," ",q("strong",{children:Re==="bindings"?"Object Bindings":"Scene Config"}),"?"]}),q("p",{className:"bb-reset-details",children:Re==="bindings"?"This will remove all your custom changes to object properties, groups, tags, transforms, materials, actions, camera positions, metrics, and metadata.":"This will restore all scene settings (camera, lighting, environment, background, animations, annotations, etc.) to their default values."}),q("p",{className:"bb-reset-warning",children:"This action cannot be undone!"})]}),Ie("div",{className:"bb-reset-footer",children:[q("button",{className:"bb-reset-btn",onClick:Pr,children:"Cancel"}),q("button",{className:"bb-reset-btn-danger",onClick:Zo,children:"Yes, Reset"})]})]})})]})}import{useRef as io,useState as Jt,useCallback as Cn,useEffect as tr,useMemo as Dl,Component as xM,Suspense as Dp}from"react";import{CameraControls as vM,Environment as yM}from"@react-three/drei";import{useFrame as Eh,useThree as Ha}from"@react-three/fiber";import{Canvas as wM}from"@react-three/fiber";import{Box3 as CM,MeshStandardMaterial as SM,PerspectiveCamera as MM,Vector3 as kM}from"three";import{SkeletonUtils as PM}from"three-stdlib";import{X as Ip,Check as Lh,Settings as TM,ChevronDown as RM,Boxes as AM,Trash2 as BM,Upload as Np,AlertTriangle as OM}from"lucide-react";import{Fragment as Oh,jsx as X,jsxs as He}from"react/jsx-runtime";var Th={color:"#93c5fd",intensity:.05},EM=["apartment","city","dawn","forest","lobby","night","park","studio","sunset","warehouse"];function LM(e){return!!(e&&"isMesh"in e&&e.isMesh)}function Rh(e,t){Array.isArray(e)?e.forEach(t):t(e)}function DM(e,t){if(!t)return;let n=t.camera;if(!(n instanceof MM))return;let a=new CM().setFromObject(e).getSize(new kM).length();!Number.isFinite(a)||a<=0||(n.near=a/100,n.far=a*100,n.updateProjectionMatrix(),t.maxDistance=a*10)}var jp=class extends xM{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 NM({url:e,format:t,dracoDecoderPath:n,ktx2TranscoderPath:a,meshopt:r,hiddenKeys:o,selectedKey:s,panelHoveredKey:l,nodeRefsOut:i,onMeshesReady:c,onModelLoaded:d,onMeshClick:u,highlightOnHover:b}){let{scene:g}=Ds(e,{dracoDecoderPath:n,ktx2TranscoderPath:a,meshopt:r},t),h=Ha(x=>x.invalidate),{setCanvasCursor:w,restoreCanvasCursor:B}=Vs(),[v,p]=Jt(null),m=Dl(()=>PM.clone(g),[g]),S=Dl(()=>{let x={};return m.traverse(P=>{if(!LM(P))return;let z=P.name||P.uuid;x[z]={key:z,label:P.name||P.type,ref:P}}),x},[m]),M=Dl(()=>{let x={};for(let[P,{ref:z}]of Object.entries(S)){let j=(Array.isArray(z.material)?z.material:[z.material]).map(T=>{let F=(zs(T)??new SM).clone();return F.userData.baseColor=F.color.clone(),F.userData.baseMap=F.map,F.userData.baseEmissive=F.emissive.clone(),F.userData.baseEmissiveMap=F.emissiveMap,F.userData.baseEmissiveIntensity=F.emissiveIntensity,F});x[P]=Array.isArray(z.material)?j:j[0]}return x},[S]);tr(()=>()=>{Object.values(M).forEach(x=>Rh(x,P=>P.dispose()))},[M]);let k=io(null);tr(()=>{k.current!==e&&(k.current=e,m.updateWorldMatrix(!0,!0),yi(m),c(S),d(m))},[e,m,S,c,d]),tr(()=>{let x=new AbortController;return us(m,x.signal),()=>{x.abort(),ms(m)}},[m]);let R=Dl(()=>!ps(m),[m]);tr(()=>{for(let[x,{ref:P}]of Object.entries(S))i.current[x]=P},[S,i]),tr(()=>{!b&&v!==null&&(p(null),B())},[b,v,B]),tr(()=>{for(let[x,{ref:P}]of Object.entries(S)){P.visible=!o.has(x);let z=M[x];if(!z)continue;P.material=z;let A=b&&v===x,j=b&&l===x;Rh(z,T=>{if(T.color.copy(T.userData.baseColor),T.map=T.userData.baseMap??null,T.emissive.copy(T.userData.baseEmissive),T.emissiveMap=T.userData.baseEmissiveMap??null,T.emissiveIntensity=T.userData.baseEmissiveIntensity,j||A){let I=!!T.userData.baseEmissiveMap;T.emissive.set(Th.color),T.emissiveIntensity=I?T.userData.baseEmissiveIntensity:Th.intensity}T.needsUpdate=!0})}h()},[S,M,v,s,l,b,o,h]);let f=x=>{let P=x;for(;P;){let z=P.name||P.uuid;if(S[z])return z;P=P.parent}return null},C=R?{onClick:x=>{let P=f(x.object);P&&(x.stopPropagation(),u(P))},...b?{onPointerOver:x=>{let P=f(x.object);P&&(x.stopPropagation(),w("pointer"),p(P))},onPointerOut:x=>{x.stopPropagation(),B(),p(null)}}:{}}:{};return X("primitive",{object:m,...C})}function _M({scene:e,controlsRef:t,refitOnResize:n,onInitialFitComplete:a}){let r=io(!1),o=Ha(i=>i.invalidate),s=Ha(i=>i.size),l=io(null);return tr(()=>{r.current=!1,o()},[o,e]),Eh(()=>{if(!r.current){if(!e||!t.current){o();return}r.current=!0,DM(e,t.current),t.current.fitToBox(e,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5}).catch(()=>{}).finally(a)}}),tr(()=>{if(!(!n||!r.current||!e||!t.current))return l.current&&clearTimeout(l.current),l.current=setTimeout(()=>{t.current?.fitToBox(e,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5}).catch(()=>{}),o()},150),()=>{l.current&&clearTimeout(l.current)}},[s.width,s.height,n]),null}function zM({exposure:e}){let t=Ha(a=>a.gl),n=Ha(a=>a.invalidate);return tr(()=>{t.toneMappingExposure=e,n()},[t,e,n]),null}function jM({enabled:e,controlsRef:t}){let n=Ha(a=>a.invalidate);return Eh((a,r)=>{!e||!t.current||(t.current.rotate(r*.2,0,!1),n())}),null}function Nl(e){return Array.from(e.types).includes("Files")}function Ah({label:e,checked:t,onChange:n}){return He("div",{className:"env-row",children:[X("span",{className:"env-row__label",children:e}),X("div",{className:"env-row__value",children:X("button",{className:"env-checkbox-btn",onClick:()=>n(!t),children:X("span",{className:`env-checkbox${t?" env-checkbox--checked":""}`,children:t&&X(Lh,{size:9,strokeWidth:2,color:"white"})})})})]})}function _p({label:e,value:t,onChange:n}){return He("div",{className:"env-row",children:[X("span",{className:"env-row__label",children:e}),X("div",{className:"env-row__value",children:He("div",{className:"env-color-swatch",style:{background:t},children:[X("span",{className:"env-color-swatch__hex",children:t}),X("input",{type:"color",className:"env-color-swatch__input",value:t,onChange:a=>n(a.target.value)})]})})]})}function zp({label:e,value:t,min:n,max:a,step:r,onChange:o}){return He("div",{className:"env-row",children:[X("span",{className:"env-row__label",children:e}),He("div",{className:"env-row__value env-row__value--slider",children:[X("input",{type:"range",className:"env-slider",min:n,max:a,step:r,value:t,onChange:s=>o(Number(s.target.value))}),X("span",{className:"env-slider__value",children:t.toFixed(2)})]})]})}function IM({label:e,value:t,options:n,onChange:a}){return He("div",{className:"env-row",children:[X("span",{className:"env-row__label",children:e}),X("div",{className:"env-row__value",children:X("select",{className:"env-select",value:t,onChange:r=>a(r.target.value),children:n.map(r=>X("option",{value:r,children:r},r))})})]})}function Bh({title:e,children:t}){let[n,a]=Jt(!1);return He("div",{className:"env-section",children:[He("button",{className:"env-section__header",onClick:()=>a(r=>!r),children:[X(RM,{size:12,strokeWidth:2,className:`env-section__chevron${n?" env-section__chevron--collapsed":""}`}),X("span",{children:e})]}),!n&&X("div",{className:"env-section__body",children:t})]})}function FM({isOpen:e,onToggle:t,settings:n,onChange:a}){return He("div",{className:`left-panel-wrapper ${e?"left-panel-wrapper--open":"left-panel-wrapper--closed"}`,children:[!e&&X("button",{className:"side-panel__open-btn side-panel__open-btn--left",onClick:()=>t(!0),children:X(TM,{size:20,strokeWidth:1.8})}),He("div",{className:`side-panel side-panel--left ${e?"side-panel--open-left":"side-panel--closed-left"}`,"aria-hidden":!e,children:[X("div",{className:"side-panel__header",children:He("div",{className:"side-panel__header-top",children:[X("span",{className:"side-panel__eyebrow",children:"Scene Settings"}),X("button",{className:"side-panel__close-btn",onClick:()=>t(!1),title:"Close",children:X(Ip,{size:12,strokeWidth:1.6})})]})}),He("div",{className:"env-controls",children:[He(Bh,{title:"Background",children:[X(Ah,{label:"Background",checked:n.backgroundEnabled,onChange:r=>a("backgroundEnabled",r)}),X(_p,{label:"Background Color",value:n.backgroundColor,onChange:r=>a("backgroundColor",r)}),X(IM,{label:"Environment",value:n.envPreset,options:EM,onChange:r=>a("envPreset",r)}),X(Ah,{label:"Auto Rotate",checked:n.autoRotate,onChange:r=>a("autoRotate",r)})]}),He(Bh,{title:"Lighting",children:[X(zp,{label:"Exposure",value:n.exposure,min:0,max:2,step:.05,onChange:r=>a("exposure",r)}),X(zp,{label:"Ambient Light Intensity",value:n.ambientIntensity,min:0,max:3,step:.05,onChange:r=>a("ambientIntensity",r)}),X(_p,{label:"Ambient Light Color",value:n.ambientColor,onChange:r=>a("ambientColor",r)}),X(zp,{label:"Direct Light Intensity",value:n.directionalIntensity,min:0,max:5,step:.05,onChange:r=>a("directionalIntensity",r)}),X(_p,{label:"Direct Light Color",value:n.directionalColor,onChange:r=>a("directionalColor",r)})]})]})]})]})}function VM({meshKeys:e,hiddenKeys:t,selectedKey:n,isOpen:a,onToggle:r,onFocus:o,onHover:s,onToggleVisibility:l}){let[i,c]=Jt(""),[d,u]=Jt(null),b=Object.values(e).filter(g=>g.label.toLowerCase().includes(i.toLowerCase()));return He("div",{className:`right-panel-wrapper ${a?"right-panel-wrapper--open":"right-panel-wrapper--closed"}`,children:[!a&&X("button",{className:"side-panel__open-btn",onClick:()=>r(!0),children:X(AM,{size:20,strokeWidth:1.8})}),He("div",{className:`side-panel ${a?"side-panel--open":"side-panel--closed"}`,"aria-hidden":!a,children:[He("div",{className:"side-panel__header",children:[He("div",{className:"side-panel__header-top",children:[X("span",{className:"side-panel__eyebrow",children:"SCENE OBJECTS"}),X("button",{className:"side-panel__close-btn",onClick:()=>r(!1),title:"Close",children:X(Ip,{size:12,strokeWidth:1.6})})]}),He("p",{className:"side-panel__title",children:[b.length," objects"]})]}),X("div",{className:"side-panel__search-wrap",children:X("input",{className:"side-panel__search",type:"text",placeholder:"Search objects",value:i,onChange:g=>c(g.target.value)})}),X("div",{className:"side-panel__list",children:b.map(({key:g,label:h})=>{let w=!t.has(g),B=n===g,v=d===g;return He("div",{onClick:()=>o(g),onMouseEnter:()=>{u(g),s(g)},onMouseLeave:()=>{u(null),s(null)},className:["side-panel__row",v?"side-panel__row--hovered":"",B?"side-panel__row--selected":""].filter(Boolean).join(" "),children:[X("span",{className:`side-panel__label${v||B?" side-panel__label--hovered":""}`,children:h}),X("button",{className:"side-panel__vis-btn",title:w?"Hide":"Show",onClick:p=>{p.stopPropagation(),l(g)},children:X("span",{className:`side-panel__checkbox${w?" side-panel__checkbox--checked":""}`,children:w&&X(Lh,{size:9,strokeWidth:5,color:"white"})})})]},g)})})]})]})}function Dh({modelUrl:e,modelFormat:t,dracoDecoderPath:n,ktx2TranscoderPath:a,meshopt:r=!0,backgroundColor:o="#1a1a1a",showSceneObjectsPanel:s=!0,showSceneSettingsPanel:l=!0,enableModelUpload:i=!1,zoomOnSelected:c=!1,highlightOnHover:d=!1,showLoadingOverlay:u=!0,refitOnResize:b=!0,backgroundEnabled:g=!1,autoRotate:h=!1,envPreset:w="city",exposure:B=1,ambientIntensity:v=.6,ambientColor:p="#ffffff",directionalIntensity:m=1.2,directionalColor:S="#ffffff",onModelLoaded:M,onLoadError:k}){let R=io(null),f=io({}),C=io(null),x=io(null),P=io(0),[z,A]=Jt(null),[j,T]=Jt(null),[I,F]=Jt(!1),[O,E]=Jt({}),[W,U]=Jt(new Set),[ae,xe]=Jt(null),[le,ge]=Jt(null),[he,Se]=Jt(null),[at,wt]=Jt(null),[Xe,Me]=Jt(!1),[Te,At]=Jt(!1),[Ke,nn]=Jt(!1),[Ye,qt]=Jt(!1),[Bt,Be]=Jt(()=>typeof window>"u"?!0:window.innerWidth>900),[nt,ee]=Jt(()=>typeof window>"u"?!0:window.innerWidth>900),[oe,Ot]=Jt({backgroundEnabled:g,backgroundColor:o,autoRotate:h,envPreset:w,exposure:B,ambientIntensity:v,ambientColor:p,directionalIntensity:m,directionalColor:S}),it=i?he:e,Ge=Cn(()=>{A(null),T(null),F(!1),E({}),U(new Set),xe(null),ge(null),Me(!1),nn(!1)},[]),Je=Cn(()=>{x.current?.cleanup(),x.current=null},[]),Et=Cn(()=>{Je(),Se(null),wt(null),Ge(),Ot({backgroundEnabled:g,backgroundColor:o,autoRotate:h,envPreset:w,exposure:B,ambientIntensity:v,ambientColor:p,directionalIntensity:m,directionalColor:S})},[p,v,h,o,g,S,m,w,B,Ge,Je]),Ut=Cn(async Z=>{At(!0);try{let L=await Bs(Z);Je(),x.current=L,Se(L.url),wt(L.name),Ge()}catch(L){Me(!0),k?.(L)}finally{At(!1)}},[k,Ge,Je]),Dt=Cn(Z=>{let L=Z?.[0];L&&Ut(L)},[Ut]);tr(()=>()=>{Je()},[Je]);let Sn=Cn((Z,L)=>{Ot(_=>({..._,[Z]:L}))},[]);tr(()=>{Ot(Z=>({...Z,backgroundColor:o}))},[o]),tr(()=>{Ge()},[it,Ge]);let pn=Cn(Z=>{E(Z),U(new Set),xe(null)},[]),me=Cn(Z=>{A(Z),Me(!1);let L=di(Z);T(L>vo?L:null),F(!1),M?.(Z)},[M]),et=Cn(Z=>{Me(!0),k?.(Z)},[k]),Fe=Cn(Z=>{if(xe(Z),!c)return;let L=f.current[Z];!L||!R.current||R.current.fitToBox(L,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5}).catch(()=>{})},[c]),Re=Cn(Z=>{U(L=>{let _=new Set(L);return _.has(Z)?_.delete(Z):_.add(Z),_})},[]),ht=Cn(Z=>{!i||!Nl(Z.dataTransfer)||(Z.preventDefault(),Z.stopPropagation(),P.current+=1,qt(!0))},[i]),rt=Cn(Z=>{!i||!Nl(Z.dataTransfer)||(Z.preventDefault(),Z.stopPropagation(),Z.dataTransfer.dropEffect="copy",qt(!0))},[i]),xt=Cn(Z=>{!i||!Nl(Z.dataTransfer)||(Z.preventDefault(),Z.stopPropagation(),P.current=Math.max(0,P.current-1),P.current===0&&qt(!1))},[i]),Nt=Cn(Z=>{!i||!Nl(Z.dataTransfer)||(Z.preventDefault(),Z.stopPropagation(),P.current=0,qt(!1),Dt(Z.dataTransfer.files))},[i,Dt]),Mn=u&&(Te||!!(it&&!Xe&&(!z||!Ke)));return He("div",{className:"smv-root",style:{background:oe.backgroundColor},onDragEnter:ht,onDragOver:rt,onDragLeave:xt,onDrop:Nt,children:[l&&it&&X(FM,{isOpen:nt,onToggle:ee,settings:oe,onChange:Sn}),He("div",{className:"smv-canvasArea",children:[j!==null&&!I&&He("div",{className:"smv-largeModelBanner",children:[X(OM,{size:14,className:"smv-largeModelBanner__icon"}),He("span",{children:["Very large model detected (",Math.round(j/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."]}),X("button",{type:"button",className:"smv-largeModelBanner__dismiss",onClick:()=>F(!0),"aria-label":"Dismiss",children:X(Ip,{size:12})})]}),i?He(Oh,{children:[X("input",{ref:C,type:"file",accept:As,className:"smv-upload-input",onChange:Z=>{Dt(Z.target.files),Z.currentTarget.value=""}}),it?X("div",{className:"smv-upload-toolbar",children:He(Oh,{children:[X("span",{className:"smv-upload-toolbar__name",children:at??"Uploaded model"}),He("button",{type:"button",className:"smv-upload-toolbar__button smv-upload-toolbar__button--ghost",onClick:Et,children:[X(BM,{size:14}),"Clear"]})]})}):null]}):null,it?X(wM,{dpr:[1,2],frameloop:"demand",resize:{debounce:0,scroll:!1},raycaster:{firstHitOnly:!0},style:{background:oe.backgroundColor},camera:{position:[0,0,5],fov:45,near:.1,far:1e3},children:He(Dp,{fallback:null,children:[X("ambientLight",{intensity:oe.ambientIntensity,color:oe.ambientColor}),X("directionalLight",{position:[-4,5,7],intensity:oe.directionalIntensity,color:oe.directionalColor,castShadow:!0}),X("directionalLight",{position:[-5,5,5],intensity:.5}),X(Dp,{fallback:null,children:X(yM,{preset:oe.envPreset,background:oe.backgroundEnabled})}),X(zM,{exposure:oe.exposure}),X(jM,{enabled:oe.autoRotate,controlsRef:R}),X(jp,{onLoadError:et,children:X(Dp,{fallback:null,children:X(NM,{url:it,format:he?void 0:t,dracoDecoderPath:n,ktx2TranscoderPath:a,meshopt:r,hiddenKeys:W,selectedKey:ae,panelHoveredKey:le,nodeRefsOut:f,onMeshesReady:pn,onModelLoaded:me,onMeshClick:Fe,highlightOnHover:d})})},it),X(_M,{scene:z,controlsRef:R,refitOnResize:b,onInitialFitComplete:()=>nn(!0)}),X(vM,{ref:R,makeDefault:!0,smoothTime:.3})]})}):X("div",{className:"smv-upload-empty-state",style:{background:oe.backgroundColor},children:He("div",{className:"smv-upload-empty-state__card",children:[X("div",{className:"smv-upload-empty-state__icon",children:X(Np,{size:24})}),He("p",{className:"smv-upload-empty-state__body",children:["Drag and drop ",X("code",{children:".glb"}),", ",X("code",{children:".gltf"}),","," ",X("code",{children:".obj"}),", ",X("code",{children:".fbx"}),", ",X("code",{children:".usdz"}),", or"," ",X("code",{children:".zip"})," here"]}),He("button",{type:"button",className:"smv-upload-empty-state__button",onClick:()=>C.current?.click(),children:[X(Np,{size:15}),"Choose model"]})]})}),X(Ba,{visible:Mn,message:Te?"Preparing model...":"Loading model..."}),i&&Ye?X("div",{className:"smv-upload-drop-overlay",children:He("div",{className:"smv-upload-drop-overlay__card",children:[X(Np,{size:20}),X("span",{children:"Release to load your model"})]})}):null]}),s&&it&&X(VM,{meshKeys:O,hiddenKeys:W,selectedKey:ae,isOpen:Bt,onToggle:Be,onFocus:Fe,onHover:ge,onToggleVisibility:Re})]})}import{useCallback as Nh,useState as UM}from"react";function HM(e=null){let[t,n]=UM(e),a=Nh(o=>{n(o)},[n]),r=Nh(()=>{n(null)},[]);return{selectedObjectBinding:t,setSelectedObjectBinding:n,handleObjectSelect:a,clearSelection:r}}import{useMemo as GM}from"react";function WM(e,t){return GM(()=>{if(!t)return null;let n=e[t];return n||(Object.values(e).find(a=>a.id===t||a.modelObjectId===t)??null)},[e,t])}import{useMemo as $M}from"react";function XM(e){return $M(()=>Object.values(e).map(t=>t.modelObjectId),[e])}import{useCallback as cn,useMemo as _h,useState as KM}from"react";var zh={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 jh(e){if(e)return Object.fromEntries(Object.entries(e).map(([t,n])=>[t,n&&typeof n=="object"?{...n}:n]))}function YM(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t.visible===!1).map(([t])=>[t,!0]))}function JM(e){let[t,n]=KM(e),a=cn((R,f)=>{n(C=>f===void 0?la(C,R):la(C,R,f))},[]),r=cn((R,f)=>a(R,lc(f)),[a]),o=cn((R,f)=>r(R,{baseColor:f}),[r]),s=cn((R,f,C="baseColor")=>{let x=zh[C],P=typeof f=="string"?{path:f}:f;a(R,{style:{material:{[x]:P}}})},[a]),l=cn((R,f="baseColor")=>{let C=zh[f];a(R,{style:{material:{[C]:void 0}}})},[a]),i=cn((R,f)=>{n(C=>{let x=un(C,R);if(!x)return C;let P=jh(C[x]?.style?.material),z=xo(C,f);if(z.length===0)return C;let A=C;for(let j of z){let T=C[j];T&&(A===C&&(A={...C}),A[j]={...T,style:{...T.style,material:jh(P)}})}return A})},[]),c=cn(R=>a(R,{style:{material:void 0}}),[a]),d=cn((R,f)=>a(R,{transform:f}),[a]),u=cn(R=>a(R,{transform:void 0}),[a]),b=cn((R,f)=>a(R,{metadata:f}),[a]),g=cn(R=>sc(t,R),[t]),h=cn(R=>xo(t,R).map(f=>t[f]?.id??f),[t]),w=cn(R=>{let f=un(t,R);return f?t[f]?.style?.material??null:null},[t]),B=cn(R=>a(R,{visible:!1}),[a]),v=cn(R=>a(R,{visible:!0}),[a]),p=cn(R=>{n(f=>{let C=xo(f,R).reduce((x,P)=>{let z=f[P];return z&&x.push({ids:P,patch:{visible:z.visible===!1}}),x},[]);return la(f,C)})},[n]),m=cn(()=>{n(R=>la(R,Object.keys(R),{visible:!0}))},[n]),S=_h(()=>YM(t),[t]),M=_h(()=>Object.keys(S).map(R=>t[R]?.id??R),[S,t]),k=cn(R=>{let f=un(t,R);return f?t[f]?.visible===!1:!1},[t]);return{objectBindings:t,setObjectBindings:n,updateObjectBindings:a,setMaterial:r,setBaseColor:o,setTexture:s,clearTexture:l,copyMaterial:i,resetMaterial:c,getMaterial:w,setTransform:d,resetTransform:u,updateMetadata:b,selectObjectBindings:g,selectObjectBindingIds:h,hiddenObjects:S,hiddenObjectIds:M,hideObject:B,showObject:v,toggleObjectVisibility:p,isObjectHidden:k,clearHiddenObjects:m}}import{useCallback as nr,useMemo as qM,useRef as ZM,useState as QM}from"react";var ek={type:"point",color:"#ffffff",intensity:1,position:[0,0,0],distance:0,decay:2,attachedToCamera:!1,castShadow:!1,shadowBias:-5e-4,visible:!0};function tk(e){let t=ZM(null),[n,a]=QM(()=>{let v=typeof e=="function"?e():e;return t.current=v,v}),r=nr(v=>{a(p=>{let m=typeof v=="function"?v(p):v;return cc(p,m)})},[]),o=nr(()=>{let v=t.current;v&&a(v)},[]),s=nr((v,p)=>{r(m=>({lighting:{lights:m.lighting.lights.map(S=>S.id===v?{...S,...p}:S)}}))},[r]),l=nr(v=>{r(p=>p.lighting.lights.some(m=>m.id===v.id)?{}:{lighting:{lights:[...p.lighting.lights,{...ek,...v}]}})},[r]),i=nr(v=>{r(p=>({lighting:{lights:p.lighting.lights.filter(m=>m.id!==v)}}))},[r]),c=nr((v,p)=>s(v,{intensity:p}),[s]),d=nr((v,p)=>s(v,{color:p}),[s]),u=nr(v=>s(v,{visible:!0}),[s]),b=nr(v=>s(v,{visible:!1}),[s]),g=nr(v=>{r(p=>({lighting:{lights:p.lighting.lights.map(m=>m.id===v?{...m,visible:!m.visible}:m)}}))},[r]),h=nr((v,p)=>s(v,{attachment:p,attachedToCamera:!1}),[s]),w=nr(v=>s(v,{attachment:void 0}),[s]),B=qM(()=>({items:n.lighting.lights,get:v=>n.lighting.lights.find(p=>p.id===v),add:l,update:s,remove:i,setIntensity:c,setColor:d,show:u,hide:b,toggle:g,attach:h,detach:w}),[n.lighting.lights,l,s,i,c,d,u,b,g,h,w]);return{sceneConfig:n,setSceneConfig:a,updateSceneConfig:r,resetSceneConfig:o,lights:B}}import{useCallback as nk,useState as rk}from"react";function ok(){let[e,t]=rk(null),n=nk(a=>{t(a)},[t]);return{hoveredObjectBinding:e,handleHoveredObject:n}}import{useCallback as Fp,useState as Wi}from"react";import{Box3 as ak,Vector3 as Ih}from"three";function _l(e){return[e.x,e.y,e.z]}function ik(){let[e,t]=Wi(!0),[n,a]=Wi(!1),[r,o]=Wi(null),[s,l]=Wi(null),[i,c]=Wi(0),d=Fp(g=>{let h=new ak().setFromObject(g),w=h.min.clone(),B=h.max.clone(),v=new Ih,p=new Ih,m=0;g.traverse(S=>{"isMesh"in S&&S.isMesh&&(m+=1)}),h.getCenter(v),h.getSize(p),l({min:_l(w),max:_l(B),center:_l(v),size:_l(p)}),c(m),o(null),t(!1),a(!0)},[]),u=Fp(g=>{o(g),l(null),c(0),t(!1),a(!1)},[]),b=Fp(()=>{t(!0),a(!1),o(null),l(null),c(0)},[]);return{isLoading:e,isReady:n,error:r,bounds:s,objectCount:i,handleModelLoaded:d,handleLoadError:u,resetModelState:b}}import{useCallback as Vp}from"react";function sk({bindings:e,scene:t,camera:n,animations:a,onAction:r}){let{objectBindings:o,updateObjectBindings:s,showObject:l,hideObject:i,toggleObjectVisibility:c}=e,d=t?.updateSceneConfig,u=n?.focusObject,b=n?.fitScene,g=n?.resetView,h=n?.setCameraTarget,w=n?.setCameraState,B=a?.play,v=a?.pause,p=a?.stop,m=a?.setSpeed,S=a?.seek,M=Vp(f=>{let C=un(o,f);return C?o[C]?.actions??[]:[]},[o]),k=Vp(async f=>{for(let C of f.action.effects??[]){if("objectBindings"in C){s(C.target,C.objectBindings);continue}if("sceneConfig"in C){d?.(C.sceneConfig);continue}if("visibility"in C){C.visibility==="show"?l(C.target):C.visibility==="hide"?i(C.target):c(C.target);continue}if("camera"in C){let P=C.camera;P.type==="focus-object"?await u?.(P.objectId??f.objectId):P.type==="fit-scene"?await b?.():P.type==="reset"?await g?.():P.type==="set-target"?await h?.(P.target,P.transition??!0):await w?.(P.state,P.transition??!0);continue}let x=C.animation;x.type==="play"?B?.(x.clip):x.type==="pause"?v?.():x.type==="stop"?p?.():x.type==="set-speed"?m?.(x.speed):S?.(x.time)}await r?.(f)},[b,u,i,r,v,B,g,S,m,w,h,l,p,c,s,d]),R=Vp(async(f,C)=>{let x=un(o,f);if(!x)return null;let P=o[x],z=P?.actions?.find(j=>j.id===C);if(!P||!z)return null;let A={objectId:x,action:z,binding:P};return await k(A),A},[k,o]);return{getActionsForObject:M,handleAction:k,runAction:R}}import{useCallback as zl,useRef as Fh}from"react";function lk(e){return typeof e=="function"?e:e?.handleViewerReady??null}function ck(...e){let t=Fh(null),n=Fh(e);n.current=e;let a=zl(l=>{t.current=l;let i=new Set;for(let c of n.current){let d=lk(c);d&&!i.has(d)&&(i.add(d),d(l))}},[]),r=zl(()=>t.current,[]),o=zl(l=>{let i=t.current;return i?i.captureImage(l):Promise.reject(new Error("ModelViewer is not ready yet."))},[]),s=zl(()=>{let l=t.current;return l?(l.invalidate(),!0):!1},[]);return{handleViewerReady:a,getViewer:r,captureImage:o,invalidate:s}}import{useCallback as Rt,useEffect as dk,useRef as Sr}from"react";import{Material as pk,PointLight as uk,Vector3 as mk}from"three";var Gp=["emissiveIntensity","opacity","metalness","roughness","transmission","clearcoat","clearcoatRoughness","ior","thickness"],jl=1;function Il(e){return typeof e=="string"?[e]:e}function Fl(e,t=0,n=1){return Math.min(n,Math.max(t,e))}function Up(e,t){return e+Math.random()*(t-e)}function Vh([e,t],n){return e+(t-e)*n}function Hp([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 Uh(e,t){let n=Fl(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 bk(e){let t=e.material;return t?(Array.isArray(t)?t:[t]).filter(n=>n instanceof pk):[]}function gk(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 Gp){let a=e[n];typeof a=="number"&&(t[n]=a)}return t}function Hh(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 Gp){let a=t[n];a!==void 0&&typeof e[n]=="number"&&(e[n]=a)}t.transparent!==void 0&&(e.transparent=t.transparent),e.needsUpdate=!0}function fk(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 hk(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 xk(e={}){let t=Sr(e);t.current=e;let n=Sr(null),a=Sr(null),r=Sr(null),o=Sr(new Map),s=Sr(new Map),l=Sr(new Map),i=Sr(new Map),c=Rt(O=>{let E=n.current;if(!E)return null;let W=un(E.objectBindings,O);return E.nodeRefs[O]??(W?E.nodeRefs[W]:null)??(E.scene?ar(E.scene,O):null)??null},[]),d=Rt(O=>{let E=n.current;return E?typeof O=="object"&&!Array.isArray(O)?xo(E.objectBindings,O):Il(O).map(W=>un(E.objectBindings,W)??W):typeof O=="string"?[O]:Array.isArray(O)?O:[]},[]),u=Rt(()=>{n.current?.invalidate()},[]),b=Rt((O,E)=>{let W=!1;for(let U of d(O)){let ae=c(U);if(ae)for(let xe of bk(ae))l.current.has(xe)||l.current.set(xe,gk(xe)),Hh(xe,E),W=!0}return W},[c,d]),g=Rt((O,E)=>{let W=b(O,E);return W&&u(),W},[u,b]),h=Rt((O,E)=>{let W=!1;for(let U of d(O)){let ae=c(U);ae&&(i.current.has(ae)||i.current.set(ae,fk(ae)),hk(ae,E),W=!0)}return W},[c,d]),w=Rt((O,E)=>{let W=h(O,E);return W&&u(),W},[u,h]),B=Rt(O=>{let E=c(O);if(!E)return null;E.updateWorldMatrix(!0,!1);let W=E.getWorldPosition(new mk);return[W.x,W.y,W.z]},[c]),v=Rt(O=>{let E=s.current.get(O);return E?(E.light.removeFromParent(),E.light.dispose(),s.current.delete(O),u(),!0):!1},[u]),p=Rt(O=>{let E=c(O.target);if(!E)return!1;let W=s.current.get(O.id),U=W?.light??new uk;return W&&W.target!==O.target&&U.removeFromParent(),U.name=`react-immersive-runtime-light:${O.id}`,U.color.set(O.color??"#ffffff"),U.intensity=O.intensity??1,U.distance=O.distance??0,U.decay=O.decay??2,U.castShadow=O.castShadow??!1,U.position.set(...O.offset??[0,0,0]),U.parent!==E&&E.add(U),s.current.set(O.id,{light:U,target:O.target}),u(),!0},[u,c]),m=Rt((O,E)=>{let W=s.current.get(O);if(!W)return!1;if(E.target&&E.target!==W.target){let U=c(E.target);if(!U)return!1;W.light.removeFromParent(),U.add(W.light),W.target=E.target}return E.color!==void 0&&W.light.color.set(E.color),E.intensity!==void 0&&(W.light.intensity=E.intensity),E.distance!==void 0&&(W.light.distance=E.distance),E.decay!==void 0&&(W.light.decay=E.decay),E.offset!==void 0&&W.light.position.set(...E.offset),E.castShadow!==void 0&&(W.light.castShadow=E.castShadow),u(),!0},[u,c]),S=Rt((O,E)=>{let W=U=>E[U%E.length]??0;for(let U of O.materials??[])d(U.targets).forEach((ae,xe)=>{let le=W(xe),ge={};for(let he of Gp){let Se=U.values[he];Se&&(ge[he]=Vh(Se,le))}b(ae,ge)});for(let U of O.transforms??[])d(U.targets).forEach((ae,xe)=>{let le=W(xe),ge={};U.values.position&&(ge.position=Hp(U.values.position,le)),U.values.rotation&&(ge.rotation=Hp(U.values.rotation,le)),U.values.scale&&(ge.scale=Hp(U.values.scale,le)),h(ae,ge)});for(let U of O.lights??[])Il(U.lights).forEach((ae,xe)=>{let le=s.current.get(ae);le&&(le.light.intensity=Vh(U.intensity,W(xe)))})},[d,b,h]),M=Sr(()=>{}),k=Sr(()=>{});k.current=O=>{r.current=null;let E=!1;for(let[W,U]of o.current){U.startedAt===null&&(U.startedAt=O);let ae=U.lastFrameAt??O;U.lastFrameAt=O;let xe=U.override&&U.override.until>O?U.override.level:null;U.override&&xe===null&&(U.override=null);let le=U.update(O,O-U.startedAt,Math.min(100,O-ae),xe);E=!0,le||(o.current.delete(W),U.onComplete?.())}E&&u(),o.current.size>0&&M.current()},M.current=()=>{r.current!==null||typeof requestAnimationFrame>"u"||(r.current=requestAnimationFrame(O=>k.current(O)))};let R=Rt(O=>(o.current.set(O.id,O),M.current(),O.id),[]),f=Rt((O,E={})=>{let W=E.id??`transition-${jl++}`,U=Math.max(1,E.duration??400),ae=E.easing??"ease-in-out";return R({id:W,startedAt:null,lastFrameAt:null,override:null,onComplete:E.onComplete,update:(xe,le,ge,he)=>{let Se=he??Uh(le/U,ae);return S(O,[Se]),le<U}})},[S,R]),C=Rt((O,E={})=>{let W=E.id??`pulse-${jl++}`,U=Math.max(1,E.duration??1e3),ae=E.minLevel??0,xe=E.maxLevel??1,le=E.repeat??1/0,ge=E.synchronized??!0,he=Math.max(1,...[...O.materials??[],...O.transforms??[]].map(Se=>d(Se.targets).length),...(O.lights??[]).map(Se=>Il(Se.lights).length));return R({id:W,startedAt:null,lastFrameAt:null,override:null,onComplete:E.onComplete,update:(Se,at,wt,Xe)=>{let Me=at/U,Te=Array.from({length:ge?1:he},(At,Ke)=>{if(Xe!==null)return Xe;let nn=Me+(ge?0:Ke/he),Ye=.5-Math.cos(nn%1*Math.PI*2)/2;return ae+(xe-ae)*Ye});return S(O,Te),le===1/0||Me<le}})},[S,R,d]),x=Rt((O,E={})=>{let W=E.id??`timeline-${jl++}`,U=E.repeat??1,ae=O.map(le=>({...le,duration:Math.max(1,le.duration),hold:Math.max(0,le.hold??0)})),xe=Math.max(1,ae.reduce((le,ge)=>le+ge.duration+ge.hold,0));return R({id:W,startedAt:null,lastFrameAt:null,override:null,onComplete:E.onComplete,update:(le,ge,he,Se)=>{if(ae.length===0||U<=0)return!1;let at=ge/xe;if(U!==1/0&&at>=U){for(let Me of ae)S(Me.channels,[1]);return!1}let wt=ge%xe,Xe=0;for(let Me of ae){let Te=Xe+Me.duration,At=Te+Me.hold;if(wt>=Te){S(Me.channels,[Se??1]),Xe=At;continue}if(wt>=Xe){let Ke=Se??Uh((wt-Xe)/Me.duration,Me.easing??"ease-in-out");S(Me.channels,[Ke]);break}}return!0}})},[S,R]),P=Rt((O,E={})=>{let W=E.id??`flicker-${jl++}`,U=E.synchronized??!0,ae=E.minLevel??.15,xe=E.maxLevel??1,le=E.interval??[45,160],ge=typeof le=="number"?[le,le]:le,he=[Math.max(1,Math.min(...ge)),Math.max(1,Math.max(...ge))],Se=Fl(E.response??.7,.01,1),at=Fl(E.blackoutChance??.08),wt=Fl(E.flashChance??.12),Xe=E.flashLevel??1.15,Me=Math.max(1,...[...O.materials??[],...O.transforms??[]].map(Ye=>d(Ye.targets).length),...(O.lights??[]).map(Ye=>Il(Ye.lights).length)),Te=U?1:Me,At=Array.from({length:Te},()=>ae),Ke=Array.from({length:Te},()=>ae),nn=Array.from({length:Te},()=>0);return R({id:W,startedAt:null,lastFrameAt:null,override:null,onComplete:E.onComplete,update:(Ye,qt,Bt,Be)=>{for(let nt=0;nt<Te;nt+=1){if(Be!==null)Ke[nt]=Be;else if(Ye>=nn[nt]){let oe=Math.random();Ke[nt]=oe<at?Up(0,Math.min(.04,ae)):oe<at+wt?Xe:Up(ae,xe),nn[nt]=Ye+Up(...he)}let ee=1-Math.pow(1-Se,Math.max(1,Bt)/16.67);At[nt]+=(Ke[nt]-At[nt])*ee}return S(O,At),E.duration===void 0||qt<E.duration}})},[S,R,d]),z=Rt((O,E,W)=>{let U=o.current.get(O);if(!U)return!1;let ae=typeof performance>"u"?Date.now():performance.now();return U.override={level:E,until:ae+Math.max(0,W)},M.current(),!0},[]),A=Rt(O=>o.current.delete(O),[]),j=Rt(()=>{o.current.clear(),r.current!==null&&typeof cancelAnimationFrame<"u"&&(cancelAnimationFrame(r.current),r.current=null)},[]),T=Rt(()=>{for(let[O,E]of l.current)Hh(O,E);l.current.clear();for(let[O,E]of i.current)O.position.set(...E.position),O.rotation.set(...E.rotation),O.scale.set(...E.scale),O.visible=E.visible,O.updateMatrix(),O.updateMatrixWorld(!0);i.current.clear();for(let O of s.current.values())O.light.removeFromParent(),O.light.dispose();s.current.clear(),u()},[u]),I=Rt(()=>{j(),T()},[T,j]),F=Rt(O=>{a.current&&a.current!==O.scene&&T(),n.current=O,a.current=O.scene,t.current.onViewerReady?.(O)},[T]);return dk(()=>()=>{I(),n.current=null,a.current=null},[I]),{handleViewerReady:F,setMaterial:g,setTransform:w,getWorldPosition:B,addPointLight:p,updatePointLight:m,removePointLight:v,transition:f,timeline:x,pulse:C,flicker:P,overrideEffect:z,stopEffect:A,stopAllEffects:j,resetRuntime:I}}import{useCallback as Ga,useEffect as Wp,useRef as so,useState as vk}from"react";function $h(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function $i(e){return typeof e=="number"&&Number.isFinite(e)}function Gh(e){return Array.isArray(e)&&e.length===3&&e.every($i)}function yk(e){return!$h(e)||!Gh(e.position)||!Gh(e.target)||e.fov!==null&&!$i(e.fov)||!$i(e.zoom)||e.zoom<=0||e.azimuthAngle!==void 0&&!$i(e.azimuthAngle)||e.polarAngle!==void 0&&!$i(e.polarAngle)?null:{position:e.position,target:e.target,fov:e.fov,zoom:e.zoom,azimuthAngle:e.azimuthAngle,polarAngle:e.polarAngle}}function wk(e){if(!$h(e))return null;let t;if(e.camera!==void 0){let r=yk(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 a;if(e.selected===null||typeof e.selected=="string")a=e.selected;else if(e.selected!==void 0)return null;return{camera:t,hidden:n,selected:a}}function Wh(e,t,n){let a=Object.values(t).filter(r=>r.visible===!1).map(r=>r.id);return{camera:e??void 0,hidden:a,selected:n?.id??null}}function Ck({cameraState:e,setCameraState:t,objectBindings:n,onObjectBindingsChange:a,selectedObjectBinding:r,setSelectedObjectBinding:o,paramKey:s="view",debounceMs:l=400,autoSync:i=!0}){let c=so(null),d=so(null),u=so(null),b=so(null),g=so(null),h=Ga(()=>{g.current!==null&&(window.clearTimeout(g.current),g.current=null),u.current=null,b.current=null},[]),w=Ga(()=>{let C=Wh(e,n,r);return`${s}=${encodeURIComponent(JSON.stringify(C))}`},[e,n,r,s]),B=Ga(()=>{let C=new URL(window.location.href);return C.hash=w(),C.toString()},[w]),v=Ga(C=>{let x=new URL(window.location.href);x.hash=C,window.history.replaceState(null,"",x.toString()),d.current=C,c.current=new URLSearchParams(x.hash.slice(1)).get(s)},[s]),p=Ga(()=>{h(),v(w())},[w,h,v]),m=so({cameraState:e,objectBindings:n,selectedObjectBinding:r});m.current={cameraState:e,objectBindings:n,selectedObjectBinding:r};let[S,M]=vk(!1);Wp(()=>{if(!i||!S){h();return}let C=m.current,x=Wh(C.cameraState,C.objectBindings,C.selectedObjectBinding),P=`${s}=${encodeURIComponent(JSON.stringify(x))}`;if(P===d.current){h();return}P===u.current&&l===b.current||(h(),u.current=P,b.current=l,g.current=window.setTimeout(()=>{g.current=null,u.current=null,b.current=null,v(P)},Math.max(0,l)))},[i,e,h,l,n,s,S,r,v]),Wp(()=>h,[h]);let k=so(null),R=so(null),f=Ga(async()=>{M(!0);let C=window.location.hash.startsWith("#")?window.location.hash.slice(1):window.location.hash,x=new URLSearchParams(C).get(s);if(!x)return k.current=null,!1;if(x===c.current||x===k.current||x===R.current)return!1;let P;try{P=JSON.parse(x)}catch{return!1}let z=wk(P);if(!z)return!1;R.current=x;try{if(z.camera&&await t(z.camera,!1),z.hidden){let A=new Set(z.hidden);a(Object.fromEntries(Object.entries(n).map(([j,T])=>[j,{...T,visible:!A.has(T.id)}])))}if(z.selected!==void 0){let A=z.selected?un(n,z.selected):null;o(A?n[A]:null)}return k.current=x,!0}finally{R.current===x&&(R.current=null)}},[n,a,s,t,o]);return Wp(()=>{let C=()=>{f().catch(()=>{})};return window.addEventListener("hashchange",C),()=>{window.removeEventListener("hashchange",C)}},[f]),{getShareUrl:B,syncUrl:p,restoreFromUrl:f}}export{Ph as BindingBuilder,ho as DEFAULT_SCENE_CONFIG,ic as MATERIAL_BLENDING_MODES,ac as MATERIAL_SIDES,Tl as ModelViewer,Dh as SimpleModelViewer,j0 as defineObjectBindings,lc as material,la as patchBindings,cc as patchSceneConfig,xo as selectBindingKeys,sc as selectBindings,WM as useObjectBinding,XM as useObjectBindingIds,JM as useObjectBindings,tk as useSceneConfig,Ck as useShareableViewerState,sk as useViewerActions,ap as useViewerAnimations,op as useViewerCamera,ck as useViewerConnection,xk as useViewerEffects,ok as useViewerHover,ik as useViewerModel,HM as useViewerSelection};
11
+ `)}function Ui(e,t,n){Br(new Blob([t],{type:n}),e)}function Pp(e){return JSON.stringify(e??{},null,2)}function Tp(e){return`[${e[0].toFixed(3)}, ${e[1].toFixed(3)}, ${e[2].toFixed(3)}]`}function bM(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 hh(e){let t=new Set;for(let r of Object.values(e))for(let o of bM(r))t.add(o);let n=[],a=[];return await Promise.all(Array.from(t).map(async r=>{let o=em(r);if(o)try{let s=await fetch(o);if(!s.ok)throw new Error(String(s.status));n.push({path:r,blob:await s.blob()})}catch{a.push(r)}})),{assets:n,failedPaths:a}}async function Rp(e,t,n,a,r){if(r.length===0){Ui(e,t,n);return}let o={[e]:mM(t)};for(let l of r)o[l.path]=new Uint8Array(await l.blob.arrayBuffer());let s=await fs(o);Br(new Blob([s],{type:"application/zip"}),a)}var Ap={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"]},xh=Object.keys(Ap);function vh(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 Bp(e){if(e)return Object.values(e).some(vh)?e:void 0}function nr(e,t){return e?Ap[t].some(n=>vh(e[n])):!1}function Op(e){return{pbr:nr(e,"pbr"),roughness:nr(e,"roughness"),emission:nr(e,"emission"),opacity:nr(e,"opacity"),normalBump:nr(e,"normalBump"),displacement:nr(e,"displacement"),ao:nr(e,"ao"),clearcoat:nr(e,"clearcoat"),sheen:nr(e,"sheen"),anisotropy:nr(e,"anisotropy"),transmission:nr(e,"transmission"),faces:nr(e,"faces")}}function Ep(e,t){if(t)return{...e,style:{...e.style,material:t}};if(!e.style)return e;let{material:n,...a}=e.style;return{...e,style:Object.keys(a).length>0?a:void 0}}function yh(e,t){if(!e)return;let n={...e};for(let a of Ap[t])delete n[a];return n}import{Fragment as Hi,jsx as q,jsxs as je}from"react/jsx-runtime";var hM="/room.glb";function El(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function kh(e,t){if(!El(e)||!El(t))return t??e;let n={...e};for(let[a,r]of Object.entries(t)){let o=n[a];n[a]=El(o)&&El(r)?kh(o,r):r}return n}function Ph({licenseKey:e,licenseValidationUrl:t,dracoDecoderPath:n,ktx2TranscoderPath:a,meshopt:r,project:o,onProjectChange:s,projectChangeDebounceMs:l=350,onModelUpload:i,onEditLeaseChange:c}){let d=jn(null),u=jn(null),b=jn(null),[g,h]=$e(o?.model.url??null),[w,B]=$e(o?.model.name??""),[v,p]=$e(o?.model??null),[m,S]=$e(null),M=kp(o?.objectBindings??{}),k=M.value,R=M.setValue,[f,C]=$e(!1),[x,P]=$e(!1),[z,A]=$e("Load the demo model or upload a GLB, GLTF, OBJ, FBX, or USDZ model to generate bindings."),[j,T]=$e("default"),[I,F]=$e(!1),[O,E]=$e("{}"),[W,U]=$e("{}"),[ae,xe]=$e(null),[le,be]=$e(null),[he,Se]=$e(!1),[it,wt]=$e(!1),[Xe,Me]=$e(!1),[Te,Rt]=$e({identity:!0,basics:!0,material:!1,actions:!1,camera:!1,transform:!1,metrics:!1,metadata:!1}),[Ke,tn]=$e({pbr:!0,roughness:!1,emission:!1,opacity:!1,normalBump:!1,displacement:!1,ao:!1,clearcoat:!1,sheen:!1,anisotropy:!1,transmission:!1,faces:!1}),Ye=D=>Rt(V=>({...V,[D]:!V[D]})),Jt=D=>tn(V=>({...V,[D]:!V[D]})),[At,Be]=$e("object"),[rt,ee]=$e("General"),[oe,Bt]=$e("metalness"),[st,He]=$e(Op()),Je=jn(null),[Ot,Ft]=$e(!1),[Lt,Pn]=$e(!0),[mn,me]=$e(!0),[et,Ie]=$e(!1),[Re,ft]=$e(null),[ot,ht]=$e(!1),[Dt,Tn]=$e("world"),Z=jn({}),L=kp(o?.sceneConfig??xo),_=L.value,H=L.setValue,[K,Y]=$e(null),[ie,re]=$e(null),tt=gl(e,t),se=rf(tt.tier),xt=Lp(()=>({isInsideEditor:!0,activeTab:At,activeSubTab:rt,tier:se,setActiveTab:Be,setActiveSubTab:ee}),[At,rt,se]),Le=jn(null),qe=jn(0),de=jn(0),ct=jn(o?`${o.id}:${o.revision}`:null),Vt=jn(!1),lt=jn(!1),cn=jn(o?{modelUrl:o.model.url,bindings:o.objectBindings,sceneConfig:o.sceneConfig}:null),Ge=jn(o?{requestId:0,modelName:o.model.name??"model",modelUrl:o.model.url,storedBindings:o.objectBindings,streaming:!!o.model.tilesetUrl}:null),qt=jn(null),{cameraState:at,resetView:Ua,focusObject:Ha,fitScene:Wn,setCameraState:Pr,handleCameraChange:Fl,handleViewerReady:Vl}=op(),$o=un(D=>{Pr({position:D.position,target:D.target,fov:at?.fov??null,zoom:at?.zoom??1,azimuthAngle:D.azimuthAngle,polarAngle:D.polarAngle},!0)},[Pr,at]),$n=ap(),vt=m?k[m]??null:null,Ga=vt?.style?.material,ar=vt?.cameraState,co=at?{position:Tp(at.position),target:Tp(at.target)}:null,Xo=un(D=>{H(V=>{let ne=V.annotations.map(Ce=>Ce.id).join(","),ge=D.map(Ce=>Ce.id).join(",");return ne===ge?V:{...V,annotations:D}})},[]),$i=un(D=>{Y(D?{annotation:D}:null)},[]);Wo(()=>{if(!vt){E("{}"),U("{}"),xe(null),be(null);return}E(Pp(vt.metrics)),U(Pp(vt.metadata)),xe(null),be(null)},[vt]),Wo(()=>{let D=Op(Ga);if(Je.current!==m){Je.current=m,He(D);return}He(V=>{let ne=!1,ge={...V};for(let Ce of xh)D[Ce]&&!V[Ce]&&(ge[Ce]=!0,ne=!0);return ne?ge:V})},[m,Ga]),Wo(()=>()=>{Le.current?.cleanup()},[]),Wo(()=>{if(!o)return;let D=`${o.id}:${o.revision}`;if(ct.current===D)return;ct.current=D;let V=g!==o.model.url||v?.tilesetUrl!==o.model.tilesetUrl||v?.assetVersion!==o.model.assetVersion,ne=k!==o.objectBindings,ge=_!==o.sceneConfig;if((V||ne||ge)&&(lt.current=!0),p(o.model),B(o.model.name??"model"),ne&&M.reset(o.objectBindings),ge&&L.reset(o.sceneConfig),V){let Ce=++de.current;Ge.current={requestId:Ce,modelName:o.model.name??"model",modelUrl:o.model.url,storedBindings:o.objectBindings,streaming:!!o.model.tilesetUrl},qt.current=null,S(null),C(!0),h(o.model.url)}cn.current={modelUrl:o.model.url,bindings:o.objectBindings,sceneConfig:o.sceneConfig}},[k,o,g,_,v,M,L]),Wo(()=>{if(!o||!s||!g)return;if(!Vt.current){Vt.current=!0;return}if(Ge.current)return;let D=cn.current;if(g===o.model.url&&k===o.objectBindings&&_===o.sceneConfig||D!==null&&g===D.modelUrl&&k===D.bindings&&_===D.sceneConfig)return;if(lt.current){lt.current=!1;return}let V=window.setTimeout(()=>{s({projectId:o.id,baseRevision:o.revision,model:{...v??o.model,url:g,name:w||o.model.name},objectBindings:k,sceneConfig:_},"local")},l);return()=>window.clearTimeout(V)},[k,w,g,s,o,l,v,_]),Wo(()=>{let D=V=>{if(V.key.toLowerCase()!=="z"||!(V.metaKey||V.ctrlKey))return;let ne=V.target,ge=ne?.tagName;if(ge==="INPUT"||ge==="TEXTAREA"||ne?.isContentEditable)return;V.preventDefault();let Ce=At==="scene"?L:M;V.shiftKey?Ce.redo():Ce.undo()};return window.addEventListener("keydown",D),()=>window.removeEventListener("keydown",D)},[At,M,L]),Wo(()=>{if(f||j==="default"||j==="success")return;F(!0);let D=window.setTimeout(()=>F(!1),4e3);return()=>window.clearTimeout(D)},[z,j,f]);let Rn=Lp(()=>Object.keys(k),[k]),Xi=Lp(()=>!m||!vt?null:vt.id.trim()?Object.entries(k).some(([ne,ge])=>ne!==m&&ge.id===vt.id)?"Another binding already uses this ID.":null:"ID is required.",[k,m,vt]),Xn=(D,V)=>{R(ne=>({...ne,[D]:V(ne[D])}))},Wa=(D,V)=>{Xn(D,ne=>{let ge=Bp(V(ne.style?.material));return Ep(ne,ge)})},Ul=(D,V,ne)=>{Wa(D,ge=>({...ge,[V]:ne?{path:ne}:void 0}))},Hl=(D,V)=>{He(ne=>({...ne,[D]:V})),!V&&m&&Xn(m,ne=>{let ge=Bp(yh(ne.style?.material,D));return Ep(ne,ge)})},$a=un((D,V,ne)=>{let ge=lh(D),Ce=Sp(ge);if(ne){let nt=new Map(Object.values(ne).map(ke=>[ke.modelObjectId,ke]));for(let ke of ge){let pn=nt.get(ke);pn&&(Ce[ke]=pn)}}D.updateMatrixWorld(!0);let Ut={};for(let nt of ge){let ke=dr(D,nt);if(!ke){Ut[nt]={position:[0,0,0],rotation:[0,0,0],scale:[1,1,1],pivotLocal:[0,0,0],rotationOrder:"XYZ"};continue}let pn=Cl(ke);Ut[nt]={position:[ke.position.x,ke.position.y,ke.position.z],rotation:[ke.rotation.x,ke.rotation.y,ke.rotation.z],scale:[ke.scale.x,ke.scale.y,ke.scale.z],pivotLocal:[pn.x,pn.y,pn.z],rotationOrder:ke.rotation.order}}Z.current=Ut,M.reset(Ce),S(ge[0]??null),ne||H(nt=>({...nt,annotations:[]})),A(`Generated ${ge.length} bindings from ${V}.`),T("success"),C(!1)},[M,H]),vn=(D,V,ne,ge)=>{let Ce=++de.current;C(!0);let Ut=ne?ne/1048576:0;A(Ut>=100?`Reading ${V} (${Math.round(Ut)}MB \u2014 large file, this can take a while)...`:`Reading ${V} and generating starter bindings...`),T("default"),B(V),p(ge??{url:D,name:V}),Y(null);let nt=qt.current;if(D===g&&nt?.url===D){Ge.current=null,$a(nt.scene,V);return}Ge.current={requestId:Ce,modelName:V,modelUrl:D,streaming:!!ge?.tilesetUrl},h(D),M.reset({}),S(null)},Ki=un(D=>{let V=Ge.current;if(!(!V||V.requestId!==de.current)){if(Ge.current=null,qt.current={url:V.modelUrl,scene:D},V.streaming){V.storedBindings&&(lt.current=!0,M.reset(V.storedBindings)),A(`Streaming ${V.modelName}. Scene settings are editable; per-part bindings require a stable object catalog from the ingestion worker.`),T("success"),C(!1);return}V.storedBindings&&(lt.current=!0),$a(D,V.modelName,V.storedBindings)}},[$a,M]),gr=un(D=>{let V=Ge.current;!V||V.requestId!==de.current||(Ge.current=null,console.error(D),A(`Could not read ${V.modelName}. Make sure the file is a valid GLB, GLTF, OBJ, FBX, or USDZ asset.`),T("error"),C(!1))},[]),po=un(D=>{$n.handleAnimationsReady(D);let V=D.clipDetails??D.clips.map(ne=>({sourceName:ne,duration:0}));H(ne=>({...ne,animations:uh(ne,V)}))},[$n,H]),dn=async()=>{Le.current?.cleanup(),Le.current=null,await vn(hM,"room.glb")},ir=async D=>{if(i){try{C(!0),A(`Uploading ${D.name}...`),T("default");let ne=await i(D);await vn(ne.url,ne.name??D.name,D.size,ne)}catch(ne){C(!1),A(ne instanceof Error?ne.message:`Could not upload ${D.name}.`),T("error")}return}let V;try{V=await As(D)}catch(ne){A(ne instanceof Error?ne.message:"Could not read model file. Upload a .glb, .gltf, .obj, .fbx, .usdz, or .zip asset."),T("error");return}Le.current?.cleanup(),Le.current=V,await vn(V.url,V.name,D.size,{url:V.url,name:V.name})},uo=async D=>{let V=D.target.files?.[0];V&&(await ir(V),D.target.value="")},Xa=()=>{Le.current?.cleanup(),Le.current=null,qt.current=null,Ge.current=null,Z.current={},qe.current=0,Se(!1),h(null),B(""),p(null),S(null),Y(null),M.reset({}),E("{}"),U("{}"),xe(null),be(null),re(null),ht(!1),H(D=>({...D,animations:xo.animations,annotations:[]})),A("Load the demo model or upload a GLB, GLTF, OBJ, FBX, or USDZ model to generate bindings."),T("default")},sr=()=>{d.current?.click()},Ka=()=>{u.current?.click()},Ur=async D=>{P(!0);try{let{assets:V,failedPaths:ne}=await hh(k);D==="json"?await Rp("objectBindings.json",mh(k),"application/json","objectBindings.zip",V):await Rp("objectBindings.ts",bh(k),"text/typescript","objectBindings-ts.zip",V),ne.length>0?(A(`Exported, but ${ne.length} uploaded image${ne.length===1?"":"s"} couldn't be bundled: ${ne.join(", ")}.`),T("error")):V.length>0&&(A(`Exported with ${V.length} uploaded image${V.length===1?"":"s"} bundled into the zip.`),T("success"))}catch(V){let ne=V instanceof Error?V.message:"Unknown export error.";A(`Failed to export bindings: ${ne}`),T("error")}finally{P(!1)}},Ko=async D=>{if(!Rn.length){A("Load a model before importing bindings."),T("error");return}let V;try{V=JSON.parse(await D.text())}catch{A(`${D.name} is not valid JSON.`),T("error");return}if(V===null||typeof V!="object"||Array.isArray(V)){A("Expected a JSON object mapping object IDs to bindings."),T("error");return}let ne=new Map;for(let nt of Object.values(V))if(nt!==null&&typeof nt=="object"&&typeof nt.id=="string"&&typeof nt.type=="string"&&typeof nt.modelObjectId=="string"){let ke=nt;ne.set(ke.modelObjectId,ke)}if(ne.size===0){A(`${D.name} doesn't look like an exported bindings file.`),T("error");return}let ge={...k},Ce=0;for(let nt of Object.keys(ge)){let ke=ne.get(nt);ke&&(ge[nt]=ke,Ce++)}if(Ce===0){A(`None of the object IDs in ${D.name} match this model \u2014 nothing imported.`),T("error");return}R(ge);let Ut=ne.size-Ce;A(Ut>0?`Imported ${Ce} binding${Ce===1?"":"s"} from ${D.name} (${Ut} skipped \u2014 not in this model).`:`Imported ${Ce} binding${Ce===1?"":"s"} from ${D.name}.`),T("success")},mo=async D=>{let V=D.target.files?.[0];V&&(await Ko(V),D.target.value="")},Tr=()=>{b.current?.click()},Yi=async D=>{let V;try{V=JSON.parse(await D.text())}catch{A(`${D.name} is not valid JSON.`),T("error");return}if(V===null||typeof V!="object"||Array.isArray(V)){A("Expected a JSON object with scene config sections."),T("error");return}let ne=["model","camera","lighting","wireframe","shadows","environment","background","groundShadows","postProcessing","animations","annotations","cinematic"],ge=V,Ce=ne.filter(Ut=>ge[Ut]!==void 0);if(Ce.length===0){A(`${D.name} doesn't look like an exported scene config file.`),T("error");return}H(Ut=>{let nt={...Ut};for(let ke of Ce)nt[ke]=kh(Ut[ke],ge[ke]);return nt}),A(`Imported ${Ce.length} section${Ce.length===1?"":"s"} from ${D.name}.`),T("success")},Gl=async D=>{let V=D.target.files?.[0];V&&(await Yi(V),D.target.value="")},Ya=D=>{D.preventDefault(),D.stopPropagation(),!(f||g)&&(qe.current+=1,Se(!0))},Ji=D=>{D.preventDefault(),D.stopPropagation(),!(f||g)&&(D.dataTransfer.dropEffect="copy",Se(!0))},Yo=D=>{D.preventDefault(),D.stopPropagation(),!(f||g)&&(qe.current=Math.max(0,qe.current-1),qe.current===0&&Se(!1))},qi=async D=>{if(D.preventDefault(),D.stopPropagation(),qe.current=0,Se(!1),f||g)return;let V=D.dataTransfer.files?.[0];V&&await ir(V)},Ja=(D,V,ne)=>{if(!m)return;let ge;try{ge=JSON.parse(V)}catch{ne("Invalid JSON");return}if(ge===null||typeof ge!="object"||Array.isArray(ge)){ne("Expected a JSON object");return}if(D==="metrics"&&Object.values(ge).some(Ut=>typeof Ut!="number"||!Number.isFinite(Ut))){ne("Metrics values must be numbers");return}Xn(m,Ce=>({...Ce,[D]:ge})),ne(null)},Zi=un(D=>{if(!D){S(null);return}let V=Object.entries(k).find(([ne,ge])=>ge===D||ne===D.modelObjectId||ge.modelObjectId===D.modelObjectId)?.[0]??null;S(V)},[k]),Wl=un(async D=>{S(D),re(null),await Ha(D)},[Ha]),$l=un(()=>{if(!m||!at)return;let D={position:at.position,target:at.target,...at.fov!=null?{fov:at.fov}:{},zoom:at.zoom};Xn(m,V=>({...V,cameraState:D}))},[m,at]),Qi=un(()=>{!ar?.position||!ar?.target||Pr({position:ar.position,target:ar.target,fov:ar.fov??at?.fov??null,zoom:ar.zoom??at?.zoom??1},!0)},[ar,Pr,at]),bo=un(()=>{m&&Xn(m,D=>({...D,cameraState:void 0}))},[m]),es=un(async()=>{await Ua()},[Ua]),Xl=un(async()=>{await Wn()},[Wn]),qa=un(D=>{ft(D),Ie(!0)},[]),lr=un(()=>{Ie(!1),ft(null)},[]),go=un(()=>{if(Re==="bindings"){if(!Rn.length){lr();return}let D=Sp(Rn);M.reset(D),S(Rn[0]??null),A("Object bindings reset to default values."),T("success")}else Re==="scene"&&(L.reset(xo),A("Scene config reset to default values."),T("success"));lr()},[Re,Rn,M,L,lr]);return tt.status==="checking"?q("div",{className:"bb-root bb-root--licenseChecking",children:q(wo,{title:"Verifying License",message:"Checking your license key..."})}):tt.status==="invalid"?q("div",{className:"bb-root bb-root--licenseInvalid",children:q(wo,{tone:"error",title:"Invalid License",message:tt.isLocalDomain?tt.reason??"License has been revoked or has expired":"Failed to load. Please contact the site administrator."})}):je(Xd.Provider,{value:xt,children:[je("div",{className:"bb-root",children:[q("input",{ref:d,type:"file",accept:Rs,className:"bb-hiddenInput",onChange:uo,disabled:f}),q("input",{ref:u,type:"file",accept:".json,application/json",className:"bb-hiddenInput",onChange:mo,disabled:f}),q("input",{ref:b,type:"file",accept:".json,application/json",className:"bb-hiddenInput",onChange:Gl,disabled:f}),je("aside",{className:`bb-sidebar bb-sidebar--left ${it?"bb-sidebar--collapsed":""}`,children:[je("div",{className:"bb-header bb-header--sidebar",children:[!it&&q("h1",{className:"bb-title",children:"Binding Builder"}),q("button",{type:"button",className:"bb-sidebarToggle",onClick:()=>wt(D=>!D),"aria-label":it?"Open editor sidebar":"Collapse editor sidebar",title:it?"Open editor":"Collapse editor",children:it?"\u2192":"\u2190"})]}),!it&&je(Hi,{children:[je("div",{className:"bb-tabRow",children:[q("button",{type:"button",className:`bb-tab ${At==="object"?"bb-tab--active":""}`,onClick:()=>Be("object"),children:"Object"}),q("button",{type:"button",className:`bb-tab ${At==="scene"?"bb-tab--active":""}`,onClick:()=>Be("scene"),children:"Scene"})]}),q("section",{className:"bb-editor",children:At==="scene"?q(Hi,{children:g?q(bp,{config:_,onChange:H,activeSubTab:rt,onActiveSubTabChange:ee,cameraState:rt==="Cinematic"&&at?{position:at.position,target:at.target,azimuthAngle:at.azimuthAngle,polarAngle:at.polarAngle}:null,onPreviewWaypoint:$o,animationClipDetails:$n.clipDetails,animationPlayback:$n}):q("div",{className:"bb-emptyEditor",children:"Upload a model to edit its scene settings."})}):!vt||!m?q("div",{className:"bb-emptyEditor",children:"Select a generated node binding to edit its values."}):je(Hi,{children:[q("div",{className:"bb-editorHeader",children:je("div",{children:[q("div",{className:"bb-sectionKicker",children:"Editing Binding"}),q("h2",{className:"bb-editorTitle",children:vt.label||m}),je("div",{className:"bb-editorMeta",children:[q("span",{children:vt.type}),q("span",{children:vt.modelObjectId})]})]})}),q(Kf,{selectedItem:m,selectedBinding:vt,open:Te.identity,onToggle:()=>Ye("identity"),updateBinding:Xn,idError:Xi}),q(Zf,{selectedItem:m,selectedBinding:vt,open:Te.basics,onToggle:()=>Ye("basics"),updateBinding:Xn}),je(zn,{title:"Material",open:Te.material,onToggle:()=>Ye("material"),tooltip:"Edit the selected object's base material, textures, and surface properties.",children:[q(Xf,{disabled:!m,onApply:D=>m&&Wa(m,V=>({...V,...D}))}),q(Wf,{selectedItem:m,selectedMaterial:Ga,pbrWorkflow:oe,onPbrWorkflowChange:Bt,openMaterialPanels:Ke,materialPanelEnabled:st,onToggleMaterialPanel:Jt,onSetMaterialPanelState:Hl,updateSelectedMaterial:Wa,setSelectedTexturePath:Ul})]}),q(nh,{selectedItem:m,selectedBinding:vt,open:Te.actions,onToggle:()=>Ye("actions"),updateBinding:Xn}),q(rh,{selectedBinding:vt,open:Te.camera,onToggle:()=>Ye("camera"),cameraState:at,formattedCameraState:co,savedCameraPosition:ar,onSaveCameraPosition:$l,onGoToSavedCamera:Qi,onClearSavedCamera:bo,onResetView:es,onFitScene:Xl}),q(sh,{selectedItem:m,selectedBinding:vt,open:Te.transform,onToggle:()=>Ye("transform"),updateBinding:Xn,moveModeEnabled:ot,onToggleMoveMode:ht,transformSpace:Dt,onTransformSpaceChange:Tn,originalTransform:Z.current[m]??null}),q(Mp,{title:"Metrics",label:"Metrics JSON",open:Te.metrics,onToggle:()=>Ye("metrics"),draft:O,error:ae,example:'{"area": 42}',onDraftChange:E,onCommit:()=>Ja("metrics",O,xe)}),q(Mp,{title:"Metadata",label:"Metadata JSON",open:Te.metadata,onToggle:()=>Ye("metadata"),draft:W,error:le,example:'{"room": "kitchen"}',onDraftChange:U,onCommit:()=>Ja("metadata",W,be)})]})}),At==="object"&&je("div",{className:"bb-toolbar",children:[je("div",{className:"bb-toolbarGroup",children:[q("button",{type:"button",className:"bb-iconButton",disabled:!M.canUndo,onClick:M.undo,title:"Undo (Cmd/Ctrl+Z)",children:q(Ch,{size:16})}),q("button",{type:"button",className:"bb-iconButton",disabled:!Rn.length,onClick:()=>qa("bindings"),title:"Reset object bindings to default",children:q(Mh,{size:16})}),q("button",{type:"button",className:"bb-iconButton",disabled:!M.canRedo,onClick:M.redo,title:"Redo (Cmd/Ctrl+Shift+Z)",children:q(wh,{size:16})})]}),q("div",{className:"bb-toolbarDivider"}),je("button",{type:"button",className:"bb-button bb-button--ghost",disabled:!Rn.length||f,onClick:Ka,title:"Re-apply a previously exported objectBindings.json onto this model",children:[q(Sh,{size:14}),"Import"]}),q("div",{className:"bb-toolbarDivider"}),q(xp,{disabled:!Rn.length||x,exporting:x,onExportJson:()=>Ur("json"),onExportTs:()=>Ur("ts")})]}),At==="scene"&&je("div",{className:"bb-toolbar",children:[je("div",{className:"bb-toolbarGroup",children:[q("button",{type:"button",className:"bb-iconButton",disabled:!L.canUndo,onClick:L.undo,title:"Undo (Cmd/Ctrl+Z)",children:q(Ch,{size:16})}),q("button",{type:"button",className:"bb-iconButton",onClick:()=>qa("scene"),title:"Reset scene config to default",children:q(Mh,{size:16})}),q("button",{type:"button",className:"bb-iconButton",disabled:!L.canRedo,onClick:L.redo,title:"Redo (Cmd/Ctrl+Shift+Z)",children:q(wh,{size:16})})]}),q("div",{className:"bb-toolbarDivider"}),je("button",{type:"button",className:"bb-button bb-button--ghost",disabled:!Rn.length||f,onClick:Tr,title:"Re-apply a previously exported sceneConfig.json",children:[q(Sh,{size:14}),"Import"]}),q("div",{className:"bb-toolbarDivider"}),q(xp,{disabled:!Rn.length||f,onExportJson:()=>Ui("sceneConfig.json",gh(_),"application/json"),onExportTs:()=>Ui("sceneConfig.ts",fh(_),"text/typescript")})]})]})]}),je("main",{className:"bb-previewShell",children:[je("div",{className:"bb-previewHeader",children:[je("div",{className:"bb-previewToggles",children:[je("label",{className:"bb-checkbox bb-checkbox--compact",style:{color:"black"},children:[q("input",{type:"checkbox",checked:Ot,onChange:D=>Ft(D.target.checked)}),"Zoom on selected"]}),je("label",{className:"bb-checkbox bb-checkbox--compact",style:{color:"black"},children:[q("input",{type:"checkbox",checked:Lt,onChange:D=>Pn(D.target.checked)}),"Highlight on hover"]}),je("label",{className:"bb-checkbox bb-checkbox--compact",style:{color:"black"},children:[q("input",{type:"checkbox",checked:mn,onChange:D=>me(D.target.checked)}),"Camera controller"]})]}),je("div",{className:"bb-previewControlsColumn",children:[je("div",{className:"bb-previewControls",children:[q("div",{className:"bb-previewMeta",children:q("span",{children:m?`Focused: ${m}`:"Select a node to inspect it"})}),g&&q("button",{type:"button",className:"bb-button bb-button--ghost bb-removeModelButton",onClick:Xa,children:"Remove model"})]}),g&&q("div",{className:"bb-moveHint",children:ot?q(Hi,{children:"Select a mesh \xB7 drag the colored arrows, planes, or rings"}):je(Hi,{children:[q("kbd",{children:"W"}),q("kbd",{children:"A"}),q("kbd",{children:"S"}),q("kbd",{children:"D"})," move \xB7 ",q("kbd",{children:"Space"}),"/",q("kbd",{children:"C"})," up \xB7 down \xB7 drag to look"]})})]})]}),je("div",{className:"bb-preview",children:[q(Ta,{visible:f||I,message:z,tone:j,spinner:f}),g?q(Pl,{modelUrl:g,tilesetUrl:v?.tilesetUrl,objectBindings:k,selectedObject:vt,onObjectSelect:Zi,onObjectBindingsChange:R,onObjectEditLeaseChange:(D,V)=>c?.(D.modelObjectId||D.id,V),showObjectBindingDataPanel:!1,showSceneObjectsPanel:!1,onCameraChange:Fl,onViewerReady:Vl,onAnnotationsChange:Xo,activeAnnotation:K?.annotation??null,onActiveAnnotationChange:$i,onAnimationsReady:po,onModelLoaded:Ki,onLoadError:gr,licenseKey:e,licenseValidationUrl:t,dracoDecoderPath:n,ktx2TranscoderPath:a,meshopt:r,sceneConfig:_,onSceneConfigChange:H,renderMode:"always",preserveDrawingBuffer:!0,disableZoom:!1,zoomOnSelected:Ot,highlightOnHover:Lt,enableCameraControls:mn,moveModeEnabled:ot,objectTransformSpace:Dt,enableKeyboardNavigation:!0,showViewGizmo:!0,panelHoveredObject:Lt?ie:null,showLoadingOverlay:!1}):q("div",{className:`bb-previewPlaceholder ${he?"bb-previewPlaceholder--dragActive":""}`,onDragEnter:Ya,onDragOver:Ji,onDragLeave:Yo,onDrop:qi,children:je("div",{children:[q("div",{children:"Upload a GLB, GLTF, OBJ, FBX, or USDZ model, or drag a supported model/ZIP bundle here to generate editable object bindings."}),q("button",{type:"button",className:"bb-previewPlaceholderButton",onClick:sr,disabled:f,children:f?"Loading model...":"Upload"})]})})]})]}),q(dh,{bindings:k,selectedItem:m,onSelect:Wl,onHover:D=>{if(!D){re(null);return}re(k[D]??null)},isOpen:!Xe,onToggle:D=>Me(!D)})]}),et&&q("div",{className:"bb-reset-overlay",onClick:lr,children:je("div",{className:"bb-reset-dialog",onClick:D=>D.stopPropagation(),children:[je("div",{className:"bb-reset-header",children:[je("h3",{className:"bb-reset-title",children:[q(fM,{size:20,className:"bb-icon-warning"}),"Confirm Reset"]}),q("button",{className:"bb-reset-close",onClick:lr,children:q(gM,{size:20})})]}),je("div",{className:"bb-reset-body",children:[je("p",{className:"bb-reset-message",children:["Are you sure you want to reset"," ",q("strong",{children:Re==="bindings"?"Object Bindings":"Scene Config"}),"?"]}),q("p",{className:"bb-reset-details",children:Re==="bindings"?"This will remove all your custom changes to object properties, groups, tags, transforms, materials, actions, camera positions, metrics, and metadata.":"This will restore all scene settings (camera, lighting, environment, background, animations, annotations, etc.) to their default values."}),q("p",{className:"bb-reset-warning",children:"This action cannot be undone!"})]}),je("div",{className:"bb-reset-footer",children:[q("button",{className:"bb-reset-btn",onClick:lr,children:"Cancel"}),q("button",{className:"bb-reset-btn-danger",onClick:go,children:"Yes, Reset"})]})]})})]})}import{useRef as so,useState as Yt,useCallback as kn,useEffect as rr,useMemo as Ll,Component as xM,Suspense as Dp}from"react";import{CameraControls as vM,Environment as yM}from"@react-three/drei";import{useFrame as Eh,useThree as Fa}from"@react-three/fiber";import{Canvas as wM}from"@react-three/fiber";import{Box3 as CM,MeshStandardMaterial as SM,PerspectiveCamera as MM,Vector3 as kM}from"three";import{SkeletonUtils as PM}from"three-stdlib";import{X as Ip,Check as Lh,Settings as TM,ChevronDown as RM,Boxes as AM,Trash2 as BM,Upload as Np,AlertTriangle as OM}from"lucide-react";import{Fragment as Oh,jsx as X,jsxs as Ue}from"react/jsx-runtime";var Th={color:"#93c5fd",intensity:.05},EM=["apartment","city","dawn","forest","lobby","night","park","studio","sunset","warehouse"];function LM(e){return!!(e&&"isMesh"in e&&e.isMesh)}function Rh(e,t){Array.isArray(e)?e.forEach(t):t(e)}function DM(e,t){if(!t)return;let n=t.camera;if(!(n instanceof MM))return;let a=new CM().setFromObject(e).getSize(new kM).length();!Number.isFinite(a)||a<=0||(n.near=a/100,n.far=a*100,n.updateProjectionMatrix(),t.maxDistance=a*10)}var jp=class extends xM{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 NM({url:e,format:t,dracoDecoderPath:n,ktx2TranscoderPath:a,meshopt:r,hiddenKeys:o,selectedKey:s,panelHoveredKey:l,nodeRefsOut:i,onMeshesReady:c,onModelLoaded:d,onMeshClick:u,highlightOnHover:b}){let{scene:g}=Ls(e,{dracoDecoderPath:n,ktx2TranscoderPath:a,meshopt:r},t),h=Fa(x=>x.invalidate),{setCanvasCursor:w,restoreCanvasCursor:B}=Fs(),[v,p]=Yt(null),m=Ll(()=>PM.clone(g),[g]),S=Ll(()=>{let x={};return m.traverse(P=>{if(!LM(P))return;let z=P.name||P.uuid;x[z]={key:z,label:P.name||P.type,ref:P}}),x},[m]),M=Ll(()=>{let x={};for(let[P,{ref:z}]of Object.entries(S)){let j=(Array.isArray(z.material)?z.material:[z.material]).map(T=>{let F=(_s(T)??new SM).clone();return F.userData.baseColor=F.color.clone(),F.userData.baseMap=F.map,F.userData.baseEmissive=F.emissive.clone(),F.userData.baseEmissiveMap=F.emissiveMap,F.userData.baseEmissiveIntensity=F.emissiveIntensity,F});x[P]=Array.isArray(z.material)?j:j[0]}return x},[S]);rr(()=>()=>{Object.values(M).forEach(x=>Rh(x,P=>P.dispose()))},[M]);let k=so(null);rr(()=>{k.current!==e&&(k.current=e,m.updateWorldMatrix(!0,!0),vi(m),c(S),d(m))},[e,m,S,c,d]),rr(()=>{let x=new AbortController;return ps(m,x.signal),()=>{x.abort(),us(m)}},[m]);let R=Ll(()=>!ds(m),[m]);rr(()=>{for(let[x,{ref:P}]of Object.entries(S))i.current[x]=P},[S,i]),rr(()=>{!b&&v!==null&&(p(null),B())},[b,v,B]),rr(()=>{for(let[x,{ref:P}]of Object.entries(S)){P.visible=!o.has(x);let z=M[x];if(!z)continue;P.material=z;let A=b&&v===x,j=b&&l===x;Rh(z,T=>{if(T.color.copy(T.userData.baseColor),T.map=T.userData.baseMap??null,T.emissive.copy(T.userData.baseEmissive),T.emissiveMap=T.userData.baseEmissiveMap??null,T.emissiveIntensity=T.userData.baseEmissiveIntensity,j||A){let I=!!T.userData.baseEmissiveMap;T.emissive.set(Th.color),T.emissiveIntensity=I?T.userData.baseEmissiveIntensity:Th.intensity}T.needsUpdate=!0})}h()},[S,M,v,s,l,b,o,h]);let f=x=>{let P=x;for(;P;){let z=P.name||P.uuid;if(S[z])return z;P=P.parent}return null},C=R?{onClick:x=>{let P=f(x.object);P&&(x.stopPropagation(),u(P))},...b?{onPointerOver:x=>{let P=f(x.object);P&&(x.stopPropagation(),w("pointer"),p(P))},onPointerOut:x=>{x.stopPropagation(),B(),p(null)}}:{}}:{};return X("primitive",{object:m,...C})}function _M({scene:e,controlsRef:t,refitOnResize:n,onInitialFitComplete:a}){let r=so(!1),o=Fa(i=>i.invalidate),s=Fa(i=>i.size),l=so(null);return rr(()=>{r.current=!1,o()},[o,e]),Eh(()=>{if(!r.current){if(!e||!t.current){o();return}r.current=!0,DM(e,t.current),t.current.fitToBox(e,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5}).catch(()=>{}).finally(a)}}),rr(()=>{if(!(!n||!r.current||!e||!t.current))return l.current&&clearTimeout(l.current),l.current=setTimeout(()=>{t.current?.fitToBox(e,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5}).catch(()=>{}),o()},150),()=>{l.current&&clearTimeout(l.current)}},[s.width,s.height,n]),null}function zM({exposure:e}){let t=Fa(a=>a.gl),n=Fa(a=>a.invalidate);return rr(()=>{t.toneMappingExposure=e,n()},[t,e,n]),null}function jM({enabled:e,controlsRef:t}){let n=Fa(a=>a.invalidate);return Eh((a,r)=>{!e||!t.current||(t.current.rotate(r*.2,0,!1),n())}),null}function Dl(e){return Array.from(e.types).includes("Files")}function Ah({label:e,checked:t,onChange:n}){return Ue("div",{className:"env-row",children:[X("span",{className:"env-row__label",children:e}),X("div",{className:"env-row__value",children:X("button",{className:"env-checkbox-btn",onClick:()=>n(!t),children:X("span",{className:`env-checkbox${t?" env-checkbox--checked":""}`,children:t&&X(Lh,{size:9,strokeWidth:2,color:"white"})})})})]})}function _p({label:e,value:t,onChange:n}){return Ue("div",{className:"env-row",children:[X("span",{className:"env-row__label",children:e}),X("div",{className:"env-row__value",children:Ue("div",{className:"env-color-swatch",style:{background:t},children:[X("span",{className:"env-color-swatch__hex",children:t}),X("input",{type:"color",className:"env-color-swatch__input",value:t,onChange:a=>n(a.target.value)})]})})]})}function zp({label:e,value:t,min:n,max:a,step:r,onChange:o}){return Ue("div",{className:"env-row",children:[X("span",{className:"env-row__label",children:e}),Ue("div",{className:"env-row__value env-row__value--slider",children:[X("input",{type:"range",className:"env-slider",min:n,max:a,step:r,value:t,onChange:s=>o(Number(s.target.value))}),X("span",{className:"env-slider__value",children:t.toFixed(2)})]})]})}function IM({label:e,value:t,options:n,onChange:a}){return Ue("div",{className:"env-row",children:[X("span",{className:"env-row__label",children:e}),X("div",{className:"env-row__value",children:X("select",{className:"env-select",value:t,onChange:r=>a(r.target.value),children:n.map(r=>X("option",{value:r,children:r},r))})})]})}function Bh({title:e,children:t}){let[n,a]=Yt(!1);return Ue("div",{className:"env-section",children:[Ue("button",{className:"env-section__header",onClick:()=>a(r=>!r),children:[X(RM,{size:12,strokeWidth:2,className:`env-section__chevron${n?" env-section__chevron--collapsed":""}`}),X("span",{children:e})]}),!n&&X("div",{className:"env-section__body",children:t})]})}function FM({isOpen:e,onToggle:t,settings:n,onChange:a}){return Ue("div",{className:`left-panel-wrapper ${e?"left-panel-wrapper--open":"left-panel-wrapper--closed"}`,children:[!e&&X("button",{className:"side-panel__open-btn side-panel__open-btn--left",onClick:()=>t(!0),children:X(TM,{size:20,strokeWidth:1.8})}),Ue("div",{className:`side-panel side-panel--left ${e?"side-panel--open-left":"side-panel--closed-left"}`,"aria-hidden":!e,children:[X("div",{className:"side-panel__header",children:Ue("div",{className:"side-panel__header-top",children:[X("span",{className:"side-panel__eyebrow",children:"Scene Settings"}),X("button",{className:"side-panel__close-btn",onClick:()=>t(!1),title:"Close",children:X(Ip,{size:12,strokeWidth:1.6})})]})}),Ue("div",{className:"env-controls",children:[Ue(Bh,{title:"Background",children:[X(Ah,{label:"Background",checked:n.backgroundEnabled,onChange:r=>a("backgroundEnabled",r)}),X(_p,{label:"Background Color",value:n.backgroundColor,onChange:r=>a("backgroundColor",r)}),X(IM,{label:"Environment",value:n.envPreset,options:EM,onChange:r=>a("envPreset",r)}),X(Ah,{label:"Auto Rotate",checked:n.autoRotate,onChange:r=>a("autoRotate",r)})]}),Ue(Bh,{title:"Lighting",children:[X(zp,{label:"Exposure",value:n.exposure,min:0,max:2,step:.05,onChange:r=>a("exposure",r)}),X(zp,{label:"Ambient Light Intensity",value:n.ambientIntensity,min:0,max:3,step:.05,onChange:r=>a("ambientIntensity",r)}),X(_p,{label:"Ambient Light Color",value:n.ambientColor,onChange:r=>a("ambientColor",r)}),X(zp,{label:"Direct Light Intensity",value:n.directionalIntensity,min:0,max:5,step:.05,onChange:r=>a("directionalIntensity",r)}),X(_p,{label:"Direct Light Color",value:n.directionalColor,onChange:r=>a("directionalColor",r)})]})]})]})]})}function VM({meshKeys:e,hiddenKeys:t,selectedKey:n,isOpen:a,onToggle:r,onFocus:o,onHover:s,onToggleVisibility:l}){let[i,c]=Yt(""),[d,u]=Yt(null),b=Object.values(e).filter(g=>g.label.toLowerCase().includes(i.toLowerCase()));return Ue("div",{className:`right-panel-wrapper ${a?"right-panel-wrapper--open":"right-panel-wrapper--closed"}`,children:[!a&&X("button",{className:"side-panel__open-btn",onClick:()=>r(!0),children:X(AM,{size:20,strokeWidth:1.8})}),Ue("div",{className:`side-panel ${a?"side-panel--open":"side-panel--closed"}`,"aria-hidden":!a,children:[Ue("div",{className:"side-panel__header",children:[Ue("div",{className:"side-panel__header-top",children:[X("span",{className:"side-panel__eyebrow",children:"SCENE OBJECTS"}),X("button",{className:"side-panel__close-btn",onClick:()=>r(!1),title:"Close",children:X(Ip,{size:12,strokeWidth:1.6})})]}),Ue("p",{className:"side-panel__title",children:[b.length," objects"]})]}),X("div",{className:"side-panel__search-wrap",children:X("input",{className:"side-panel__search",type:"text",placeholder:"Search objects",value:i,onChange:g=>c(g.target.value)})}),X("div",{className:"side-panel__list",children:b.map(({key:g,label:h})=>{let w=!t.has(g),B=n===g,v=d===g;return Ue("div",{onClick:()=>o(g),onMouseEnter:()=>{u(g),s(g)},onMouseLeave:()=>{u(null),s(null)},className:["side-panel__row",v?"side-panel__row--hovered":"",B?"side-panel__row--selected":""].filter(Boolean).join(" "),children:[X("span",{className:`side-panel__label${v||B?" side-panel__label--hovered":""}`,children:h}),X("button",{className:"side-panel__vis-btn",title:w?"Hide":"Show",onClick:p=>{p.stopPropagation(),l(g)},children:X("span",{className:`side-panel__checkbox${w?" side-panel__checkbox--checked":""}`,children:w&&X(Lh,{size:9,strokeWidth:5,color:"white"})})})]},g)})})]})]})}function Dh({modelUrl:e,modelFormat:t,dracoDecoderPath:n,ktx2TranscoderPath:a,meshopt:r=!0,backgroundColor:o="#1a1a1a",showSceneObjectsPanel:s=!0,showSceneSettingsPanel:l=!0,enableModelUpload:i=!1,zoomOnSelected:c=!1,highlightOnHover:d=!1,showLoadingOverlay:u=!0,refitOnResize:b=!0,backgroundEnabled:g=!1,autoRotate:h=!1,envPreset:w="city",exposure:B=1,ambientIntensity:v=.6,ambientColor:p="#ffffff",directionalIntensity:m=1.2,directionalColor:S="#ffffff",onModelLoaded:M,onLoadError:k}){let R=so(null),f=so({}),C=so(null),x=so(null),P=so(0),[z,A]=Yt(null),[j,T]=Yt(null),[I,F]=Yt(!1),[O,E]=Yt({}),[W,U]=Yt(new Set),[ae,xe]=Yt(null),[le,be]=Yt(null),[he,Se]=Yt(null),[it,wt]=Yt(null),[Xe,Me]=Yt(!1),[Te,Rt]=Yt(!1),[Ke,tn]=Yt(!1),[Ye,Jt]=Yt(!1),[At,Be]=Yt(()=>typeof window>"u"?!0:window.innerWidth>900),[rt,ee]=Yt(()=>typeof window>"u"?!0:window.innerWidth>900),[oe,Bt]=Yt({backgroundEnabled:g,backgroundColor:o,autoRotate:h,envPreset:w,exposure:B,ambientIntensity:v,ambientColor:p,directionalIntensity:m,directionalColor:S}),st=i?he:e,He=kn(()=>{A(null),T(null),F(!1),E({}),U(new Set),xe(null),be(null),Me(!1),tn(!1)},[]),Je=kn(()=>{x.current?.cleanup(),x.current=null},[]),Ot=kn(()=>{Je(),Se(null),wt(null),He(),Bt({backgroundEnabled:g,backgroundColor:o,autoRotate:h,envPreset:w,exposure:B,ambientIntensity:v,ambientColor:p,directionalIntensity:m,directionalColor:S})},[p,v,h,o,g,S,m,w,B,He,Je]),Ft=kn(async Z=>{Rt(!0);try{let L=await As(Z);Je(),x.current=L,Se(L.url),wt(L.name),He()}catch(L){Me(!0),k?.(L)}finally{Rt(!1)}},[k,He,Je]),Lt=kn(Z=>{let L=Z?.[0];L&&Ft(L)},[Ft]);rr(()=>()=>{Je()},[Je]);let Pn=kn((Z,L)=>{Bt(_=>({..._,[Z]:L}))},[]);rr(()=>{Bt(Z=>({...Z,backgroundColor:o}))},[o]),rr(()=>{He()},[st,He]);let mn=kn(Z=>{E(Z),U(new Set),xe(null)},[]),me=kn(Z=>{A(Z),Me(!1);let L=ci(Z);T(L>yo?L:null),F(!1),M?.(Z)},[M]),et=kn(Z=>{Me(!0),k?.(Z)},[k]),Ie=kn(Z=>{if(xe(Z),!c)return;let L=f.current[Z];!L||!R.current||R.current.fitToBox(L,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5}).catch(()=>{})},[c]),Re=kn(Z=>{U(L=>{let _=new Set(L);return _.has(Z)?_.delete(Z):_.add(Z),_})},[]),ft=kn(Z=>{!i||!Dl(Z.dataTransfer)||(Z.preventDefault(),Z.stopPropagation(),P.current+=1,Jt(!0))},[i]),ot=kn(Z=>{!i||!Dl(Z.dataTransfer)||(Z.preventDefault(),Z.stopPropagation(),Z.dataTransfer.dropEffect="copy",Jt(!0))},[i]),ht=kn(Z=>{!i||!Dl(Z.dataTransfer)||(Z.preventDefault(),Z.stopPropagation(),P.current=Math.max(0,P.current-1),P.current===0&&Jt(!1))},[i]),Dt=kn(Z=>{!i||!Dl(Z.dataTransfer)||(Z.preventDefault(),Z.stopPropagation(),P.current=0,Jt(!1),Lt(Z.dataTransfer.files))},[i,Lt]),Tn=u&&(Te||!!(st&&!Xe&&(!z||!Ke)));return Ue("div",{className:"smv-root",style:{background:oe.backgroundColor},onDragEnter:ft,onDragOver:ot,onDragLeave:ht,onDrop:Dt,children:[l&&st&&X(FM,{isOpen:rt,onToggle:ee,settings:oe,onChange:Pn}),Ue("div",{className:"smv-canvasArea",children:[j!==null&&!I&&Ue("div",{className:"smv-largeModelBanner",children:[X(OM,{size:14,className:"smv-largeModelBanner__icon"}),Ue("span",{children:["Very large model detected (",Math.round(j/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."]}),X("button",{type:"button",className:"smv-largeModelBanner__dismiss",onClick:()=>F(!0),"aria-label":"Dismiss",children:X(Ip,{size:12})})]}),i?Ue(Oh,{children:[X("input",{ref:C,type:"file",accept:Rs,className:"smv-upload-input",onChange:Z=>{Lt(Z.target.files),Z.currentTarget.value=""}}),st?X("div",{className:"smv-upload-toolbar",children:Ue(Oh,{children:[X("span",{className:"smv-upload-toolbar__name",children:it??"Uploaded model"}),Ue("button",{type:"button",className:"smv-upload-toolbar__button smv-upload-toolbar__button--ghost",onClick:Ot,children:[X(BM,{size:14}),"Clear"]})]})}):null]}):null,st?X(wM,{dpr:[1,2],frameloop:"demand",resize:{debounce:0,scroll:!1},raycaster:{firstHitOnly:!0},style:{background:oe.backgroundColor},camera:{position:[0,0,5],fov:45,near:.1,far:1e3},children:Ue(Dp,{fallback:null,children:[X("ambientLight",{intensity:oe.ambientIntensity,color:oe.ambientColor}),X("directionalLight",{position:[-4,5,7],intensity:oe.directionalIntensity,color:oe.directionalColor,castShadow:!0}),X("directionalLight",{position:[-5,5,5],intensity:.5}),X(Dp,{fallback:null,children:X(yM,{preset:oe.envPreset,background:oe.backgroundEnabled})}),X(zM,{exposure:oe.exposure}),X(jM,{enabled:oe.autoRotate,controlsRef:R}),X(jp,{onLoadError:et,children:X(Dp,{fallback:null,children:X(NM,{url:st,format:he?void 0:t,dracoDecoderPath:n,ktx2TranscoderPath:a,meshopt:r,hiddenKeys:W,selectedKey:ae,panelHoveredKey:le,nodeRefsOut:f,onMeshesReady:mn,onModelLoaded:me,onMeshClick:Ie,highlightOnHover:d})})},st),X(_M,{scene:z,controlsRef:R,refitOnResize:b,onInitialFitComplete:()=>tn(!0)}),X(vM,{ref:R,makeDefault:!0,smoothTime:.3})]})}):X("div",{className:"smv-upload-empty-state",style:{background:oe.backgroundColor},children:Ue("div",{className:"smv-upload-empty-state__card",children:[X("div",{className:"smv-upload-empty-state__icon",children:X(Np,{size:24})}),Ue("p",{className:"smv-upload-empty-state__body",children:["Drag and drop ",X("code",{children:".glb"}),", ",X("code",{children:".gltf"}),","," ",X("code",{children:".obj"}),", ",X("code",{children:".fbx"}),", ",X("code",{children:".usdz"}),", or"," ",X("code",{children:".zip"})," here"]}),Ue("button",{type:"button",className:"smv-upload-empty-state__button",onClick:()=>C.current?.click(),children:[X(Np,{size:15}),"Choose model"]})]})}),X(Ta,{visible:Tn,message:Te?"Preparing model...":"Loading model..."}),i&&Ye?X("div",{className:"smv-upload-drop-overlay",children:Ue("div",{className:"smv-upload-drop-overlay__card",children:[X(Np,{size:20}),X("span",{children:"Release to load your model"})]})}):null]}),s&&st&&X(VM,{meshKeys:O,hiddenKeys:W,selectedKey:ae,isOpen:At,onToggle:Be,onFocus:Ie,onHover:be,onToggleVisibility:Re})]})}import{useCallback as Nh,useState as UM}from"react";function HM(e=null){let[t,n]=UM(e),a=Nh(o=>{n(o)},[n]),r=Nh(()=>{n(null)},[]);return{selectedObjectBinding:t,setSelectedObjectBinding:n,handleObjectSelect:a,clearSelection:r}}import{useMemo as GM}from"react";function WM(e,t){return GM(()=>{if(!t)return null;let n=e[t];return n||(Object.values(e).find(a=>a.id===t||a.modelObjectId===t)??null)},[e,t])}import{useMemo as $M}from"react";function XM(e){return $M(()=>Object.values(e).map(t=>t.modelObjectId),[e])}import{useCallback as ln,useMemo as _h,useState as KM}from"react";var zh={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 jh(e){if(e)return Object.fromEntries(Object.entries(e).map(([t,n])=>[t,n&&typeof n=="object"?{...n}:n]))}function YM(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t.visible===!1).map(([t])=>[t,!0]))}function JM(e){let[t,n]=KM(e),a=ln((R,f)=>{n(C=>f===void 0?aa(C,R):aa(C,R,f))},[]),r=ln((R,f)=>a(R,lc(f)),[a]),o=ln((R,f)=>r(R,{baseColor:f}),[r]),s=ln((R,f,C="baseColor")=>{let x=zh[C],P=typeof f=="string"?{path:f}:f;a(R,{style:{material:{[x]:P}}})},[a]),l=ln((R,f="baseColor")=>{let C=zh[f];a(R,{style:{material:{[C]:void 0}}})},[a]),i=ln((R,f)=>{n(C=>{let x=bn(C,R);if(!x)return C;let P=jh(C[x]?.style?.material),z=vo(C,f);if(z.length===0)return C;let A=C;for(let j of z){let T=C[j];T&&(A===C&&(A={...C}),A[j]={...T,style:{...T.style,material:jh(P)}})}return A})},[]),c=ln(R=>a(R,{style:{material:void 0}}),[a]),d=ln((R,f)=>a(R,{transform:f}),[a]),u=ln(R=>a(R,{transform:void 0}),[a]),b=ln((R,f)=>a(R,{metadata:f}),[a]),g=ln(R=>sc(t,R),[t]),h=ln(R=>vo(t,R).map(f=>t[f]?.id??f),[t]),w=ln(R=>{let f=bn(t,R);return f?t[f]?.style?.material??null:null},[t]),B=ln(R=>a(R,{visible:!1}),[a]),v=ln(R=>a(R,{visible:!0}),[a]),p=ln(R=>{n(f=>{let C=vo(f,R).reduce((x,P)=>{let z=f[P];return z&&x.push({ids:P,patch:{visible:z.visible===!1}}),x},[]);return aa(f,C)})},[n]),m=ln(()=>{n(R=>aa(R,Object.keys(R),{visible:!0}))},[n]),S=_h(()=>YM(t),[t]),M=_h(()=>Object.keys(S).map(R=>t[R]?.id??R),[S,t]),k=ln(R=>{let f=bn(t,R);return f?t[f]?.visible===!1:!1},[t]);return{objectBindings:t,setObjectBindings:n,updateObjectBindings:a,setMaterial:r,setBaseColor:o,setTexture:s,clearTexture:l,copyMaterial:i,resetMaterial:c,getMaterial:w,setTransform:d,resetTransform:u,updateMetadata:b,selectObjectBindings:g,selectObjectBindingIds:h,hiddenObjects:S,hiddenObjectIds:M,hideObject:B,showObject:v,toggleObjectVisibility:p,isObjectHidden:k,clearHiddenObjects:m}}import{useCallback as or,useMemo as qM,useRef as ZM,useState as QM}from"react";var ek={type:"point",color:"#ffffff",intensity:1,position:[0,0,0],distance:0,decay:2,attachedToCamera:!1,castShadow:!1,shadowBias:-5e-4,visible:!0};function tk(e){let t=ZM(null),[n,a]=QM(()=>{let v=typeof e=="function"?e():e;return t.current=v,v}),r=or(v=>{a(p=>{let m=typeof v=="function"?v(p):v;return cc(p,m)})},[]),o=or(()=>{let v=t.current;v&&a(v)},[]),s=or((v,p)=>{r(m=>({lighting:{lights:m.lighting.lights.map(S=>S.id===v?{...S,...p}:S)}}))},[r]),l=or(v=>{r(p=>p.lighting.lights.some(m=>m.id===v.id)?{}:{lighting:{lights:[...p.lighting.lights,{...ek,...v}]}})},[r]),i=or(v=>{r(p=>({lighting:{lights:p.lighting.lights.filter(m=>m.id!==v)}}))},[r]),c=or((v,p)=>s(v,{intensity:p}),[s]),d=or((v,p)=>s(v,{color:p}),[s]),u=or(v=>s(v,{visible:!0}),[s]),b=or(v=>s(v,{visible:!1}),[s]),g=or(v=>{r(p=>({lighting:{lights:p.lighting.lights.map(m=>m.id===v?{...m,visible:!m.visible}:m)}}))},[r]),h=or((v,p)=>s(v,{attachment:p,attachedToCamera:!1}),[s]),w=or(v=>s(v,{attachment:void 0}),[s]),B=qM(()=>({items:n.lighting.lights,get:v=>n.lighting.lights.find(p=>p.id===v),add:l,update:s,remove:i,setIntensity:c,setColor:d,show:u,hide:b,toggle:g,attach:h,detach:w}),[n.lighting.lights,l,s,i,c,d,u,b,g,h,w]);return{sceneConfig:n,setSceneConfig:a,updateSceneConfig:r,resetSceneConfig:o,lights:B}}import{useCallback as nk,useState as rk}from"react";function ok(){let[e,t]=rk(null),n=nk(a=>{t(a)},[t]);return{hoveredObjectBinding:e,handleHoveredObject:n}}import{useCallback as Fp,useState as Gi}from"react";import{Box3 as ak,Vector3 as Ih}from"three";function Nl(e){return[e.x,e.y,e.z]}function ik(){let[e,t]=Gi(!0),[n,a]=Gi(!1),[r,o]=Gi(null),[s,l]=Gi(null),[i,c]=Gi(0),d=Fp(g=>{let h=new ak().setFromObject(g),w=h.min.clone(),B=h.max.clone(),v=new Ih,p=new Ih,m=0;g.traverse(S=>{"isMesh"in S&&S.isMesh&&(m+=1)}),h.getCenter(v),h.getSize(p),l({min:Nl(w),max:Nl(B),center:Nl(v),size:Nl(p)}),c(m),o(null),t(!1),a(!0)},[]),u=Fp(g=>{o(g),l(null),c(0),t(!1),a(!1)},[]),b=Fp(()=>{t(!0),a(!1),o(null),l(null),c(0)},[]);return{isLoading:e,isReady:n,error:r,bounds:s,objectCount:i,handleModelLoaded:d,handleLoadError:u,resetModelState:b}}import{useCallback as Vp}from"react";function sk({bindings:e,scene:t,camera:n,animations:a,onAction:r}){let{objectBindings:o,updateObjectBindings:s,showObject:l,hideObject:i,toggleObjectVisibility:c}=e,d=t?.updateSceneConfig,u=n?.focusObject,b=n?.fitScene,g=n?.resetView,h=n?.setCameraTarget,w=n?.setCameraState,B=a?.play,v=a?.pause,p=a?.stop,m=a?.setSpeed,S=a?.seek,M=Vp(f=>{let C=bn(o,f);return C?o[C]?.actions??[]:[]},[o]),k=Vp(async f=>{for(let C of f.action.effects??[]){if("objectBindings"in C){s(C.target,C.objectBindings);continue}if("sceneConfig"in C){d?.(C.sceneConfig);continue}if("visibility"in C){C.visibility==="show"?l(C.target):C.visibility==="hide"?i(C.target):c(C.target);continue}if("camera"in C){let P=C.camera;P.type==="focus-object"?await u?.(P.objectId??f.objectId):P.type==="fit-scene"?await b?.():P.type==="reset"?await g?.():P.type==="set-target"?await h?.(P.target,P.transition??!0):await w?.(P.state,P.transition??!0);continue}let x=C.animation;x.type==="play"?B?.(x.clip):x.type==="pause"?v?.():x.type==="stop"?p?.():x.type==="set-speed"?m?.(x.speed):S?.(x.time)}await r?.(f)},[b,u,i,r,v,B,g,S,m,w,h,l,p,c,s,d]),R=Vp(async(f,C)=>{let x=bn(o,f);if(!x)return null;let P=o[x],z=P?.actions?.find(j=>j.id===C);if(!P||!z)return null;let A={objectId:x,action:z,binding:P};return await k(A),A},[k,o]);return{getActionsForObject:M,handleAction:k,runAction:R}}import{useCallback as _l,useRef as Fh}from"react";function lk(e){return typeof e=="function"?e:e?.handleViewerReady??null}function ck(...e){let t=Fh(null),n=Fh(e);n.current=e;let a=_l(l=>{t.current=l;let i=new Set;for(let c of n.current){let d=lk(c);d&&!i.has(d)&&(i.add(d),d(l))}},[]),r=_l(()=>t.current,[]),o=_l(l=>{let i=t.current;return i?i.captureImage(l):Promise.reject(new Error("ModelViewer is not ready yet."))},[]),s=_l(()=>{let l=t.current;return l?(l.invalidate(),!0):!1},[]);return{handleViewerReady:a,getViewer:r,captureImage:o,invalidate:s}}import{useCallback as Tt,useEffect as dk,useRef as kr}from"react";import{Material as pk,PointLight as uk,Vector3 as mk}from"three";var Gp=["emissiveIntensity","opacity","metalness","roughness","transmission","clearcoat","clearcoatRoughness","ior","thickness"],zl=1;function jl(e){return typeof e=="string"?[e]:e}function Il(e,t=0,n=1){return Math.min(n,Math.max(t,e))}function Up(e,t){return e+Math.random()*(t-e)}function Vh([e,t],n){return e+(t-e)*n}function Hp([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 Uh(e,t){let n=Il(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 bk(e){let t=e.material;return t?(Array.isArray(t)?t:[t]).filter(n=>n instanceof pk):[]}function gk(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 Gp){let a=e[n];typeof a=="number"&&(t[n]=a)}return t}function Hh(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 Gp){let a=t[n];a!==void 0&&typeof e[n]=="number"&&(e[n]=a)}t.transparent!==void 0&&(e.transparent=t.transparent),e.needsUpdate=!0}function fk(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 hk(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 xk(e={}){let t=kr(e);t.current=e;let n=kr(null),a=kr(null),r=kr(null),o=kr(new Map),s=kr(new Map),l=kr(new Map),i=kr(new Map),c=Tt(O=>{let E=n.current;if(!E)return null;let W=bn(E.objectBindings,O);return E.nodeRefs[O]??(W?E.nodeRefs[W]:null)??(E.scene?dr(E.scene,O):null)??null},[]),d=Tt(O=>{let E=n.current;return E?typeof O=="object"&&!Array.isArray(O)?vo(E.objectBindings,O):jl(O).map(W=>bn(E.objectBindings,W)??W):typeof O=="string"?[O]:Array.isArray(O)?O:[]},[]),u=Tt(()=>{n.current?.invalidate()},[]),b=Tt((O,E)=>{let W=!1;for(let U of d(O)){let ae=c(U);if(ae)for(let xe of bk(ae))l.current.has(xe)||l.current.set(xe,gk(xe)),Hh(xe,E),W=!0}return W},[c,d]),g=Tt((O,E)=>{let W=b(O,E);return W&&u(),W},[u,b]),h=Tt((O,E)=>{let W=!1;for(let U of d(O)){let ae=c(U);ae&&(i.current.has(ae)||i.current.set(ae,fk(ae)),hk(ae,E),W=!0)}return W},[c,d]),w=Tt((O,E)=>{let W=h(O,E);return W&&u(),W},[u,h]),B=Tt(O=>{let E=c(O);if(!E)return null;E.updateWorldMatrix(!0,!1);let W=E.getWorldPosition(new mk);return[W.x,W.y,W.z]},[c]),v=Tt(O=>{let E=s.current.get(O);return E?(E.light.removeFromParent(),E.light.dispose(),s.current.delete(O),u(),!0):!1},[u]),p=Tt(O=>{let E=c(O.target);if(!E)return!1;let W=s.current.get(O.id),U=W?.light??new uk;return W&&W.target!==O.target&&U.removeFromParent(),U.name=`react-immersive-runtime-light:${O.id}`,U.color.set(O.color??"#ffffff"),U.intensity=O.intensity??1,U.distance=O.distance??0,U.decay=O.decay??2,U.castShadow=O.castShadow??!1,U.position.set(...O.offset??[0,0,0]),U.parent!==E&&E.add(U),s.current.set(O.id,{light:U,target:O.target}),u(),!0},[u,c]),m=Tt((O,E)=>{let W=s.current.get(O);if(!W)return!1;if(E.target&&E.target!==W.target){let U=c(E.target);if(!U)return!1;W.light.removeFromParent(),U.add(W.light),W.target=E.target}return E.color!==void 0&&W.light.color.set(E.color),E.intensity!==void 0&&(W.light.intensity=E.intensity),E.distance!==void 0&&(W.light.distance=E.distance),E.decay!==void 0&&(W.light.decay=E.decay),E.offset!==void 0&&W.light.position.set(...E.offset),E.castShadow!==void 0&&(W.light.castShadow=E.castShadow),u(),!0},[u,c]),S=Tt((O,E)=>{let W=U=>E[U%E.length]??0;for(let U of O.materials??[])d(U.targets).forEach((ae,xe)=>{let le=W(xe),be={};for(let he of Gp){let Se=U.values[he];Se&&(be[he]=Vh(Se,le))}b(ae,be)});for(let U of O.transforms??[])d(U.targets).forEach((ae,xe)=>{let le=W(xe),be={};U.values.position&&(be.position=Hp(U.values.position,le)),U.values.rotation&&(be.rotation=Hp(U.values.rotation,le)),U.values.scale&&(be.scale=Hp(U.values.scale,le)),h(ae,be)});for(let U of O.lights??[])jl(U.lights).forEach((ae,xe)=>{let le=s.current.get(ae);le&&(le.light.intensity=Vh(U.intensity,W(xe)))})},[d,b,h]),M=kr(()=>{}),k=kr(()=>{});k.current=O=>{r.current=null;let E=!1;for(let[W,U]of o.current){U.startedAt===null&&(U.startedAt=O);let ae=U.lastFrameAt??O;U.lastFrameAt=O;let xe=U.override&&U.override.until>O?U.override.level:null;U.override&&xe===null&&(U.override=null);let le=U.update(O,O-U.startedAt,Math.min(100,O-ae),xe);E=!0,le||(o.current.delete(W),U.onComplete?.())}E&&u(),o.current.size>0&&M.current()},M.current=()=>{r.current!==null||typeof requestAnimationFrame>"u"||(r.current=requestAnimationFrame(O=>k.current(O)))};let R=Tt(O=>(o.current.set(O.id,O),M.current(),O.id),[]),f=Tt((O,E={})=>{let W=E.id??`transition-${zl++}`,U=Math.max(1,E.duration??400),ae=E.easing??"ease-in-out";return R({id:W,startedAt:null,lastFrameAt:null,override:null,onComplete:E.onComplete,update:(xe,le,be,he)=>{let Se=he??Uh(le/U,ae);return S(O,[Se]),le<U}})},[S,R]),C=Tt((O,E={})=>{let W=E.id??`pulse-${zl++}`,U=Math.max(1,E.duration??1e3),ae=E.minLevel??0,xe=E.maxLevel??1,le=E.repeat??1/0,be=E.synchronized??!0,he=Math.max(1,...[...O.materials??[],...O.transforms??[]].map(Se=>d(Se.targets).length),...(O.lights??[]).map(Se=>jl(Se.lights).length));return R({id:W,startedAt:null,lastFrameAt:null,override:null,onComplete:E.onComplete,update:(Se,it,wt,Xe)=>{let Me=it/U,Te=Array.from({length:be?1:he},(Rt,Ke)=>{if(Xe!==null)return Xe;let tn=Me+(be?0:Ke/he),Ye=.5-Math.cos(tn%1*Math.PI*2)/2;return ae+(xe-ae)*Ye});return S(O,Te),le===1/0||Me<le}})},[S,R,d]),x=Tt((O,E={})=>{let W=E.id??`timeline-${zl++}`,U=E.repeat??1,ae=O.map(le=>({...le,duration:Math.max(1,le.duration),hold:Math.max(0,le.hold??0)})),xe=Math.max(1,ae.reduce((le,be)=>le+be.duration+be.hold,0));return R({id:W,startedAt:null,lastFrameAt:null,override:null,onComplete:E.onComplete,update:(le,be,he,Se)=>{if(ae.length===0||U<=0)return!1;let it=be/xe;if(U!==1/0&&it>=U){for(let Me of ae)S(Me.channels,[1]);return!1}let wt=be%xe,Xe=0;for(let Me of ae){let Te=Xe+Me.duration,Rt=Te+Me.hold;if(wt>=Te){S(Me.channels,[Se??1]),Xe=Rt;continue}if(wt>=Xe){let Ke=Se??Uh((wt-Xe)/Me.duration,Me.easing??"ease-in-out");S(Me.channels,[Ke]);break}}return!0}})},[S,R]),P=Tt((O,E={})=>{let W=E.id??`flicker-${zl++}`,U=E.synchronized??!0,ae=E.minLevel??.15,xe=E.maxLevel??1,le=E.interval??[45,160],be=typeof le=="number"?[le,le]:le,he=[Math.max(1,Math.min(...be)),Math.max(1,Math.max(...be))],Se=Il(E.response??.7,.01,1),it=Il(E.blackoutChance??.08),wt=Il(E.flashChance??.12),Xe=E.flashLevel??1.15,Me=Math.max(1,...[...O.materials??[],...O.transforms??[]].map(Ye=>d(Ye.targets).length),...(O.lights??[]).map(Ye=>jl(Ye.lights).length)),Te=U?1:Me,Rt=Array.from({length:Te},()=>ae),Ke=Array.from({length:Te},()=>ae),tn=Array.from({length:Te},()=>0);return R({id:W,startedAt:null,lastFrameAt:null,override:null,onComplete:E.onComplete,update:(Ye,Jt,At,Be)=>{for(let rt=0;rt<Te;rt+=1){if(Be!==null)Ke[rt]=Be;else if(Ye>=tn[rt]){let oe=Math.random();Ke[rt]=oe<it?Up(0,Math.min(.04,ae)):oe<it+wt?Xe:Up(ae,xe),tn[rt]=Ye+Up(...he)}let ee=1-Math.pow(1-Se,Math.max(1,At)/16.67);Rt[rt]+=(Ke[rt]-Rt[rt])*ee}return S(O,Rt),E.duration===void 0||Jt<E.duration}})},[S,R,d]),z=Tt((O,E,W)=>{let U=o.current.get(O);if(!U)return!1;let ae=typeof performance>"u"?Date.now():performance.now();return U.override={level:E,until:ae+Math.max(0,W)},M.current(),!0},[]),A=Tt(O=>o.current.delete(O),[]),j=Tt(()=>{o.current.clear(),r.current!==null&&typeof cancelAnimationFrame<"u"&&(cancelAnimationFrame(r.current),r.current=null)},[]),T=Tt(()=>{for(let[O,E]of l.current)Hh(O,E);l.current.clear();for(let[O,E]of i.current)O.position.set(...E.position),O.rotation.set(...E.rotation),O.scale.set(...E.scale),O.visible=E.visible,O.updateMatrix(),O.updateMatrixWorld(!0);i.current.clear();for(let O of s.current.values())O.light.removeFromParent(),O.light.dispose();s.current.clear(),u()},[u]),I=Tt(()=>{j(),T()},[T,j]),F=Tt(O=>{a.current&&a.current!==O.scene&&T(),n.current=O,a.current=O.scene,t.current.onViewerReady?.(O)},[T]);return dk(()=>()=>{I(),n.current=null,a.current=null},[I]),{handleViewerReady:F,setMaterial:g,setTransform:w,getWorldPosition:B,addPointLight:p,updatePointLight:m,removePointLight:v,transition:f,timeline:x,pulse:C,flicker:P,overrideEffect:z,stopEffect:A,stopAllEffects:j,resetRuntime:I}}import{useCallback as Va,useEffect as Wp,useRef as lo,useState as vk}from"react";function $h(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Wi(e){return typeof e=="number"&&Number.isFinite(e)}function Gh(e){return Array.isArray(e)&&e.length===3&&e.every(Wi)}function yk(e){return!$h(e)||!Gh(e.position)||!Gh(e.target)||e.fov!==null&&!Wi(e.fov)||!Wi(e.zoom)||e.zoom<=0||e.azimuthAngle!==void 0&&!Wi(e.azimuthAngle)||e.polarAngle!==void 0&&!Wi(e.polarAngle)?null:{position:e.position,target:e.target,fov:e.fov,zoom:e.zoom,azimuthAngle:e.azimuthAngle,polarAngle:e.polarAngle}}function wk(e){if(!$h(e))return null;let t;if(e.camera!==void 0){let r=yk(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 a;if(e.selected===null||typeof e.selected=="string")a=e.selected;else if(e.selected!==void 0)return null;return{camera:t,hidden:n,selected:a}}function Wh(e,t,n){let a=Object.values(t).filter(r=>r.visible===!1).map(r=>r.id);return{camera:e??void 0,hidden:a,selected:n?.id??null}}function Ck({cameraState:e,setCameraState:t,objectBindings:n,onObjectBindingsChange:a,selectedObjectBinding:r,setSelectedObjectBinding:o,paramKey:s="view",debounceMs:l=400,autoSync:i=!0}){let c=lo(null),d=lo(null),u=lo(null),b=lo(null),g=lo(null),h=Va(()=>{g.current!==null&&(window.clearTimeout(g.current),g.current=null),u.current=null,b.current=null},[]),w=Va(()=>{let C=Wh(e,n,r);return`${s}=${encodeURIComponent(JSON.stringify(C))}`},[e,n,r,s]),B=Va(()=>{let C=new URL(window.location.href);return C.hash=w(),C.toString()},[w]),v=Va(C=>{let x=new URL(window.location.href);x.hash=C,window.history.replaceState(null,"",x.toString()),d.current=C,c.current=new URLSearchParams(x.hash.slice(1)).get(s)},[s]),p=Va(()=>{h(),v(w())},[w,h,v]),m=lo({cameraState:e,objectBindings:n,selectedObjectBinding:r});m.current={cameraState:e,objectBindings:n,selectedObjectBinding:r};let[S,M]=vk(!1);Wp(()=>{if(!i||!S){h();return}let C=m.current,x=Wh(C.cameraState,C.objectBindings,C.selectedObjectBinding),P=`${s}=${encodeURIComponent(JSON.stringify(x))}`;if(P===d.current){h();return}P===u.current&&l===b.current||(h(),u.current=P,b.current=l,g.current=window.setTimeout(()=>{g.current=null,u.current=null,b.current=null,v(P)},Math.max(0,l)))},[i,e,h,l,n,s,S,r,v]),Wp(()=>h,[h]);let k=lo(null),R=lo(null),f=Va(async()=>{M(!0);let C=window.location.hash.startsWith("#")?window.location.hash.slice(1):window.location.hash,x=new URLSearchParams(C).get(s);if(!x)return k.current=null,!1;if(x===c.current||x===k.current||x===R.current)return!1;let P;try{P=JSON.parse(x)}catch{return!1}let z=wk(P);if(!z)return!1;R.current=x;try{if(z.camera&&await t(z.camera,!1),z.hidden){let A=new Set(z.hidden);a(Object.fromEntries(Object.entries(n).map(([j,T])=>[j,{...T,visible:!A.has(T.id)}])))}if(z.selected!==void 0){let A=z.selected?bn(n,z.selected):null;o(A?n[A]:null)}return k.current=x,!0}finally{R.current===x&&(R.current=null)}},[n,a,s,t,o]);return Wp(()=>{let C=()=>{f().catch(()=>{})};return window.addEventListener("hashchange",C),()=>{window.removeEventListener("hashchange",C)}},[f]),{getShareUrl:B,syncUrl:p,restoreFromUrl:f}}export{Ph as BindingBuilder,xo as DEFAULT_SCENE_CONFIG,ic as MATERIAL_BLENDING_MODES,ac as MATERIAL_SIDES,Pl as ModelViewer,Dh as SimpleModelViewer,j0 as defineObjectBindings,lc as material,aa as patchBindings,cc as patchSceneConfig,vo as selectBindingKeys,sc as selectBindings,WM as useObjectBinding,XM as useObjectBindingIds,JM as useObjectBindings,tk as useSceneConfig,Ck as useShareableViewerState,sk as useViewerActions,ap as useViewerAnimations,op as useViewerCamera,ck as useViewerConnection,xk as useViewerEffects,ok as useViewerHover,ik as useViewerModel,HM as useViewerSelection};