@liveroom-tech/react-immersive 4.1.2 → 4.2.1
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.js +8 -8
- package/dist/index.mjs +7 -7
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
"use client";import{a as
|
|
1
|
+
"use client";import{a as Hs,b as Ch,c as Sh,d as Mh,e as Th,f as Ph,g as La,h as Ri,i as bn,j as Qc,k as Zc,l as Ei,m as ed,n as Po,o as td,p as Ty,q as nd}from"./chunk-CPHWRR2L.mjs";import{a as Jc}from"./chunk-JR557W27.mjs";import{useRef as ct,useState as Ue,useEffect as Ct,useCallback as ke,useMemo as Tn,Suspense as HT}from"react";import{Box3 as Py,BufferAttribute as ky,Mesh as _y}from"three";import{acceleratedRaycast as Ay,computeBoundsTree as Ry,disposeBoundsTree as Ey,MeshBVH as Ly}from"three-mesh-bvh";var kh=!1,ko=new WeakMap,Ba=new WeakMap;function By(){kh||(_y.prototype.raycast=Ay,kh=!0)}function Oy(e){let t=new Set;return e.traverse(n=>{let i=n.geometry;!i||!i.attributes?.position||t.add(i)}),[...t]}function _h(e){let t=0;for(let n of e){let i=n.index?n.index.count:n.attributes.position.count;t+=i/3}return t}var Li=12e6;function Ws(e){return Oa(e)>Li}function Oa(e){let t=new Set;return e.traverse(n=>{let i=n.geometry;i?.attributes?.position&&t.add(i)}),_h([...t])}function Dy(e,t){return new Promise((n,i)=>{let r=l=>{let u=l.data;if(!u||!u.error&&!u.serialized)return;if(e.removeEventListener("message",r),e.removeEventListener("error",o),u.error){i(new Error(String(u.error)));return}let{serialized:d}=u,p=Ly.deserialize(d,t,{setIndex:!1});d.index&&(t.index?t.index.array=d.index:t.setIndex(new ky(d.index,1,!1))),t.boundingBox=p.getBoundingBox(new Py),n(p)},o=l=>{e.removeEventListener("message",r),e.removeEventListener("error",o),i(new Error(l.message||"BVH worker error"))};e.addEventListener("message",r),e.addEventListener("error",o);let a=t.index?t.index.array.slice():null,s=t.attributes.position.array.slice(),c=[s,...a?[a]:[]].map(l=>l.buffer);e.postMessage({index:a,position:s,options:{groups:[...t.groups]}},c)})}async function Ny(){if(typeof window>"u"||typeof Worker>"u")return null;try{let{bvhWorkerCode:e}=await import("./bvhWorkerCode-6366A3UC.mjs"),t=new Blob([e],{type:"text/javascript"}),n=URL.createObjectURL(t),i=new Worker(n);return{worker:i,dispose:()=>{i.terminate(),URL.revokeObjectURL(n)}}}catch{return null}}async function Iy(e,t){if(t)try{return await Dy(t,e)}catch{}let n=Ry.call(e);return e.boundsTree=void 0,await new Promise(i=>setTimeout(i,0)),n}async function zy(e,t,n){if(e.boundsTree)return;if(t.buildPromise)return t.buildPromise;let i=(async()=>{let r=await n();t.references>0&&!e.boundsTree&&(e.boundsTree=r,t.ownedTree=r)})();return t.buildPromise=i.finally(()=>{t.buildPromise=void 0,t.references===0&&ko.delete(e)}),t.buildPromise}async function _o(e,t){if(t?.aborted)return;let n=Ba.get(e);if(!n){if(n=Oy(e),_h(n)>Li){Ba.set(e,[]);return}Ba.set(e,n);for(let r of n){let o=ko.get(r)??{references:0};o.references+=1,ko.set(r,o)}}if(n.length===0)return;By();let i=await Ny();if(t?.aborted){i?.dispose();return}try{for(let r of n){if(t?.aborted)return;let o=ko.get(r);o&&await zy(r,o,()=>Iy(r,i?.worker))}}finally{i?.dispose()}}function Bi(e){let t=Ba.get(e);if(t){Ba.delete(e);for(let n of t){let i=ko.get(n);i&&(i.references=Math.max(0,i.references-1),!(i.references>0)&&(i.ownedTree&&n.boundsTree===i.ownedTree&&(Ey.call(n),n.boundsTree=void 0),i.ownedTree=void 0,i.buildPromise||ko.delete(n)))}}}import{GizmoHelper as WT,GizmoViewport as $T}from"@react-three/drei";import{useFrame as XT,useThree as qT}from"@react-three/fiber";import{QRCodeSVG as YT}from"qrcode.react";import{Box3 as oa,PerspectiveCamera as zb,Raycaster as KT,Sphere as JT,Vector2 as QT,Vector3 as Ln}from"three";import{AlertTriangle as jy}from"lucide-react";import{jsx as $s,jsxs as Ah}from"react/jsx-runtime";function Oi({title:e,message:t,tone:n="default"}){return Ah("div",{className:`ri-license-overlay${n==="error"?" ri-license-overlay--error":""}`,children:[Ah("div",{className:"ri-license-overlay__header",children:[n==="error"?$s(jy,{size:16,className:"ri-license-overlay__icon","aria-hidden":"true"}):$s("span",{className:"ri-license-overlay__statusDot","aria-hidden":"true"}),$s("span",{className:"ri-license-overlay__title",children:e})]}),$s("p",{className:"ri-license-overlay__message",children:t})]})}import{Component as Vy}from"react";var Xs=class extends Vy{constructor(){super(...arguments);this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(n,i){this.props.onLoadError?.(n)}render(){return this.state.hasError?null:this.props.children}};import{PerspectiveCamera as rd,Vector2 as Fy}from"three";var Rh="riEditorGizmo";function Eh(e){return e.userData[Rh]=!0,e}function Lh(e){let t=[];return e.traverse(n=>{n.visible&&n.userData[Rh]&&(n.visible=!1,t.push(n))}),()=>{for(let n of t)n.visible=!0}}function qs(e,t={}){if(!e)return Promise.reject(new Error("Viewer not ready"));let{gl:n,scene:i,camera:r,invalidate:o}=e;if(!n.getContextAttributes().preserveDrawingBuffer)return Promise.reject(new Error("Screenshot capture is disabled. Set preserveDrawingBuffer on ModelViewer to enable it."));let{transparent:a=!1}=t,s=n.getSize(new Fy),c=n.getPixelRatio(),l=r instanceof rd?r.aspect:null,u=i.background,d=t.width??s.x,p=t.height??s.y,g=d!==s.x||p!==s.y,f=Lh(i);return a&&(i.background=null),g&&(n.setPixelRatio(1),n.setSize(d,p,!1),r instanceof rd&&(r.aspect=d/p,r.updateProjectionMatrix())),o(),new Promise((v,P)=>{requestAnimationFrame(()=>{requestAnimationFrame(()=>{let y,h;try{y=n.domElement.toDataURL("image/png")}catch(m){h=m}f(),a&&(i.background=u),g&&(n.setPixelRatio(c),n.setSize(s.x,s.y,!1),r instanceof rd&&l!==null&&(r.aspect=l,r.updateProjectionMatrix())),o(),h?P(h):v(y)})})})}import{useCallback as Js,useEffect as Qy,useState as sd}from"react";import{GLTFExporter as Uy}from"three-stdlib";function zr(e,t){let n=URL.createObjectURL(e),i=document.createElement("a");i.href=n,i.download=t,i.style.display="none";try{document.body.appendChild(i),i.click()}finally{i.remove(),window.setTimeout(()=>{URL.revokeObjectURL(n)},1e3)}}function Bh({scene:e,objectBindings:t,matRefs:n,downloadFilename:i,onComplete:r}){import("three").then(({Group:o,Mesh:a})=>{let s=new o,c=new Map;for(let[d,p]of Object.entries(t))c.set(p.modelObjectId??d,d);let l=d=>{let p=d;for(;p;){let g=p.name||p.uuid,f=c.get(g)??g,v=t[f];if(v?v.visible===!1:p.visible===!1)return!1;p=p.parent}return!0};e.traverse(d=>{let p=d;if(!p.isMesh||!p.geometry||!l(p))return;let g=p.name||p.uuid,f=c.get(g)??g,v=n[f]??p.material;if(!v)return;let P=new a(p.geometry,v);P.name=g,P.applyMatrix4(p.matrixWorld),s.add(P)}),new Uy().parse(s,d=>{let p=d instanceof ArrayBuffer?new Blob([d],{type:"model/gltf-binary"}):new Blob([JSON.stringify(d)],{type:"model/gltf+json"}),g=d instanceof ArrayBuffer?".glb":".gltf";zr(p,`${i}${g}`),r()},d=>{console.error("GLTFExporter error:",d),r()},{binary:!0})})}import{strToU8 as Hy}from"fflate";import{zip as Gy}from"fflate";function Ys(e,t=6){return new Promise((n,i)=>{Gy(e,{level:t},(r,o)=>{r?i(r):n(o)})})}var Da=2048,Oh=["#00e5ff","#ff4fd8","#ffe45e","#7cff6b","#ff784f","#a78bfa","#38bdf8","#fb7185"];function Dh(e){return e.split("&").join("&").split("<").join("<").split(">").join(">").split('"').join(""").split("'").join("'")}function ad(e,t){return e.normalize("NFKD").replace(/[\u0300-\u036f]/g,"").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||t}function Ih(e){return ad(e,"model")}function id(e,t){return e.index?Math.round(e.index.getX(t)):t}function Wy(e,t,n){let i=id(e,n),r=id(e,n+1),o=id(e,n+2);if(i>=t.count||r>=t.count||o>=t.count)return null;let a=[{index:i,u:t.getX(i),v:t.getY(i)},{index:r,u:t.getX(r),v:t.getY(r)},{index:o,u:t.getX(o),v:t.getY(o)}];return a.every(s=>Number.isFinite(s.u)&&Number.isFinite(s.v))?a:null}function Nh(e){return`${e.u.toFixed(6)},${e.v.toFixed(6)}`}function od(e,t,n,i){let r,o;i?(r=t.index,o=n.index):(r=Nh(t),o=Nh(n));let a=r<o?`${r}|${o}`:`${o}|${r}`,s=e.get(a);s?s.count+=1:e.set(a,{count:1,start:t,end:n})}function $y(e,t,n){od(e,t[0],t[1],n),od(e,t[1],t[2],n),od(e,t[2],t[0],n)}function Xy(e,t){return Array.isArray(e)?e[t]??null:e}function qy(e){let t=new Map,n=0,i=0,r=0;return e.traverse(o=>{let a=o;if(!a.isMesh||!a.geometry||!a.material)return;let s=a.geometry,c=s.getAttribute("uv");if(!c||c.itemSize<2||c.count<3)return;n+=1;let l=a.name||`Mesh ${n}`,u=s.index?.count??c.count,d=s.groups.length>0?s.groups:[{start:0,count:u,materialIndex:0}];for(let p of d){let g=p.materialIndex??0,f=Xy(a.material,g);if(!f)continue;let v=t.get(f.uuid);v||(i+=1,v={name:f.name||`Material ${i}`,layers:new Map},t.set(f.uuid,v));let P=v.layers.get(a.uuid);P||(P={name:l,color:Oh[r%Oh.length],edges:new Map},r+=1,v.layers.set(a.uuid,P));let y=Math.max(0,p.start),h=Math.min(u,y+p.count);for(let m=y;m+2<h;m+=3){let S=Wy(s,c,m);S&&$y(P.edges,S,!!s.index)}}}),[...t.values()].filter(o=>[...o.layers.values()].some(a=>a.edges.size>0))}function Ks(e){return(e*Da).toFixed(2)}function Yy(e){return`M${Ks(e.start.u)} ${Ks(1-e.start.v)}L${Ks(e.end.u)} ${Ks(1-e.end.v)}`}function Ky(e){let t=Dh(e.name),n=[...e.layers.values()].filter(i=>i.edges.size>0).map((i,r)=>{let o=Dh(i.name),a=`${ad(i.name,"mesh")}-${r+1}`,s=[...i.edges.values()],c=s.filter(d=>d.count===1),u=(c.length>0?c:s).map(Yy).join("");return[` <g id="${a}" data-mesh="${o}" fill="none" stroke="${i.color}"`,' stroke-width="1" stroke-linejoin="round" vector-effect="non-scaling-stroke">',` <title>${o}</title>`,` <path d="${u}"/>`," </g>"].join(`
|
|
2
2
|
`)}).join(`
|
|
3
|
-
`);return['<?xml version="1.0" encoding="UTF-8"?>',`<svg xmlns="http://www.w3.org/2000/svg" width="${
|
|
4
|
-
`)}function Wy(e,t="model"){let n=Uy(e),i=Lh(t);return n.map((r,o)=>{let a=ed(r.name,`material-${o+1}`);return{filename:n.length===1?`${i}-uv-layout.svg`:`${i}-uv-${a}-${o+1}.svg`,materialName:r.name,meshCount:[...r.layers.values()].filter(s=>s.edges.size>0).length,svg:Hy(r)}})}async function Bh(e,t="model"){let n=Wy(e,t);if(n.length===0)return n;if(n.length===1)return zr(new Blob([n[0].svg],{type:"image/svg+xml;charset=utf-8"}),n[0].filename),n;let i=Object.fromEntries(n.map(o=>[o.filename,zy(o.svg)])),r=await Ys(i);return zr(new Blob([r],{type:"application/zip"}),`${Lh(t)}-uv-layouts.zip`),n}function Oh({sceneRef:e,materialRefs:t,rendererCaptureRef:n,objectBindings:i,downloadFilename:r}){let[o,a]=td(!1),[l,s]=td(!1),[d,u]=td(null);$y(()=>{if(!l)return;let v=()=>s(!1);return window.addEventListener("pointerdown",v),()=>window.removeEventListener("pointerdown",v)},[l]);let c=Js(()=>{u(null),s(v=>!v)},[]),p=Js(()=>{let v=e.current;v&&(s(!1),a(!0),_h({scene:v,objectBindings:i,matRefs:t.current,downloadFilename:r,onComplete:()=>a(!1)}))},[r,t,i,e]),g=Js(()=>{s(!1),qs(n.current).then(v=>{let P=document.createElement("a");P.href=v,P.download=`${r}.png`,document.body.appendChild(P),P.click(),document.body.removeChild(P)}).catch(v=>{console.error("Screenshot failed:",v)})},[r,n]),f=Js(async()=>{let v=e.current;if(v)try{if((await Bh(v,r)).length===0){u("This model does not contain UV coordinates.");return}u(null),s(!1)}catch(P){console.error("UV layout export failed:",P),u("Could not create the UV layout archive.")}},[r,e]);return{isDownloading:o,downloadMenuOpen:l,uvExportError:d,toggleDownloadMenu:c,handleDownloadMesh:p,handleDownloadScreenshot:g,handleDownloadUvLayout:f}}import{useCallback as ko,useEffect as nd,useRef as rd,useState as La}from"react";import{Box3 as Dh,Raycaster as Xy,Vector2 as qy,Vector3 as id}from"three";function Yy(e){let t=new Dh().setFromObject(e),n=new id;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 Ky(e){let t=new Dh().setFromObject(e);if(t.isEmpty())return null;let n=t.getCenter(new id),i=t.getSize(new id).length()/2;return!Number.isFinite(i)||i<=0?null:{center:[n.x,n.y,n.z],radius:i}}function Nh({canvasAreaRef:e,controlsRef:t,sceneRef:n,modelUrl:i,modelRotation:r,bindingTransformSignature:o,modelLoaded:a}){let[l,s]=La(!1),[d,u]=La([]),[c,p]=La(!1),[g,f]=La(null),[v,P]=La(null),y=rd(!1),h=rd(0),m=rd(null);y.current=l;let S=ko(x=>{x.updateMatrixWorld(!0),f(Yy(x)),P(Ky(x))},[]),M=ko(()=>u([]),[]),T=ko(()=>s(x=>!x),[]),E=ko(()=>p(x=>!x),[]),b=ko(x=>{y.current&&(m.current={x:x.clientX,y:x.clientY})},[]),C=ko(x=>{if(!y.current)return;let k=m.current;if(m.current=null,k&&Math.hypot(x.clientX-k.x,x.clientY-k.y)>6||x.target.closest("button, input, textarea, .ri-measureTools"))return;let A=e.current,z=t.current?.camera,_=n.current;if(!A||!z||!_)return;let V=A.getBoundingClientRect(),F=(x.clientX-V.left)/V.width*2-1,L=-((x.clientY-V.top)/V.height)*2+1,B=new Xy;B.setFromCamera(new qy(F,L),z);let G=B.intersectObject(_,!0)[0];G&&(h.current+=1,u(U=>[...U,{id:h.current,position:[G.point.x,G.point.y,G.point.z]}]))},[e,t,n]);return nd(()=>{u([]),f(null),P(null)},[i]),nd(()=>{u([])},[r,o]),nd(()=>{let x=n.current;!a||!x||S(x)},[o,a,S,n]),{measureMode:l,measureModeRef:y,measurePoints:d,showDimensions:c,measureBox:g,modelBounds:v,refreshBounds:S,clearMeasurements:M,toggleMeasureMode:T,toggleDimensions:E,handleMeasurePointerDown:b,handleMeasureClick:C}}import{createPortal as Qy}from"react-dom";import{createXRStore as Zy}from"@react-three/xr";import{MapPin as ev}from"lucide-react";import{useCallback as Bi,useEffect as _o,useMemo as jh,useRef as tv,useState as ni}from"react";function od(){return typeof navigator>"u"?!1:/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)}function ad(){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 Ih(){return od()||ad()}function Jy(){if(typeof window>"u"||typeof navigator>"u")return!1;let e=a=>typeof window.matchMedia=="function"&&window.matchMedia(a).matches,t=e("(pointer: coarse)")||e("(any-pointer: coarse)"),n=e("(hover: none)")||e("(any-hover: none)"),i=navigator.maxTouchPoints>0,r=typeof window.screen<"u"&&Math.min(window.screen.width,window.screen.height)<=1024,o=od();return t||o||i&&n||i&&r}function sd(){if(!Jy())return!1;if(od())return!0;let e=navigator.deviceMemory;return!(typeof e=="number"&&e>=8)}function zh(e="auto"){switch(e){case"high":return!1;case"low":return!0;default:return sd()}}import{Fragment as nv,jsx as Ao,jsxs as ld}from"react/jsx-runtime";var Vh={canPlace:!1,isPlacementMode:!0,isModelPlaced:!1};function Fh({enableXR:e,usdzUrl:t,mobileHandoffUrl:n}){let i=tv(null),r=jh(()=>{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 Zy({emulate:!1})}catch{return null}},[e]),[o,a]=ni(!1),[l,s]=ni(!1),[d,u]=ni(!0),[c,p]=ni(null),[g,f]=ni(!1),[v,P]=ni(!1),[y,h]=ni(Vh),[m,S]=ni(!1),M=jh(()=>e&&!!t?.trim()&&ad(),[e,t]);_o(()=>{u(Ih())},[]);let T=Bi(()=>{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]);_o(()=>{if(!e||d){p(null),f(!1);return}p(T())},[e,d,T]),_o(()=>{if(r)return r.subscribe(F=>P(F.session!=null&&F.mode==="immersive-ar"))},[r]),_o(()=>{S(!1),h(Vh)},[v]),_o(()=>{if(!e||typeof navigator>"u")return;let F=navigator.xr;if(!F?.isSessionSupported)return;let L=!1;return F.isSessionSupported("immersive-ar").then(B=>!L&&a(B)).catch(()=>{}),F.isSessionSupported("immersive-vr").then(B=>!L&&s(B)).catch(()=>{}),()=>{L=!0}},[e]);let E=Bi(()=>{let F=T();F&&(p(F),f(!0))},[T]),b=Bi(()=>f(!1),[]),C=Bi(()=>{let F=t?.trim();if(!F)return;let L=document.createElement("a");L.setAttribute("rel","ar"),L.href=F,L.style.display="none";let B=document.createElement("img");B.alt="",B.src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==",L.appendChild(B),document.body.appendChild(L),L.click(),L.remove()},[t]),x=Bi(F=>{h(F),F.isPlacementMode||S(!1)},[]),k=Bi(F=>{S(!1),F?i.current?.finishPlacementMode():i.current?.cancelPlacementMode()},[]),I=Bi(F=>{F.preventDefault(),S(!0),i.current?.startPlacementMode()},[]);_o(()=>{if(!m)return;let F=()=>k(!0),L=()=>k(!1);return window.addEventListener("pointerup",F),window.addEventListener("pointercancel",L),()=>{window.removeEventListener("pointerup",F),window.removeEventListener("pointercancel",L)}},[k,m]);let A=y.isModelPlaced?y.isPlacementMode?y.canPlace?"Release to place":"Move your device over a flat surface":null:y.canPlace?null:"Move your device over a flat surface",z=y.isModelPlaced&&!y.isPlacementMode?"Pinch to resize \xB7 Twist to rotate":null,_=r?.getState().domOverlayRoot??null,V=v&&_?Qy(ld(nv,{children:[z&&Ao("div",{className:"ri-arHintOverlay",children:Ao("div",{className:"ri-arHint",children:z})}),Ao("div",{className:"ri-arOverlay",children:ld("div",{className:"ri-arControls",children:[A&&Ao("div",{className:"ri-arStatus",children:A}),y.isModelPlaced&&ld("button",{type:"button",className:`ri-arActionButton ${m?"ri-arActionButton--active":""}`,onPointerDown:F=>I(F.nativeEvent),"aria-pressed":m,children:[Ao(ev,{size:14}),"Relocate"]}),!y.isModelPlaced&&y.canPlace&&Ao("button",{type:"button",className:"ri-arActionButton ri-arActionButton--primary",onClick:()=>i.current?.placeCurrent(),children:"Tap to place"})]})})]}),_):null;return{xrStore:r,presenterRef:i,arSupported:o,vrSupported:l,quickLookSupported:M,resolvedMobileHandoffUrl:c,isMobileHandoffOpen:g,arOverlay:V,openMobileHandoff:E,closeMobileHandoff:b,openQuickLook:C,handleARStateChange:x}}import{Canvas as t1,useThree as n1}from"@react-three/fiber";import{ContactShadows as r1,Environment as i1}from"@react-three/drei";import{XR as o1}from"@react-three/xr";import{NoToneMapping as a1}from"three";import{Suspense as s1,useEffect as l1,useMemo as al,useState as c1}from"react";import{useFrame as dd,useThree as Oi}from"@react-three/fiber";import{useXR as Uh}from"@react-three/xr";import{Color as rv,PerspectiveCamera as iv}from"three";import{useEffect as Ro,useLayoutEffect as ov,useRef as cd}from"react";function Gh({renderMode:e}){let{scene:t}=Oi(),n=Oi(a=>a.setFrameloop),i=Uh(a=>a.session!=null),r=Uh(a=>a.mode==="immersive-ar"),o=cd(void 0);return Ro(()=>{n(i?"always":e)},[i,e,n]),Ro(()=>{r?(o.current=t.background,t.background=null):o.current!==void 0&&(t.background=o.current,o.current=void 0)},[r,t]),dd(()=>{r&&t.background!==null&&(t.background=null)}),null}function Hh({onPresentingChange:e}){let t=Oi(r=>r.gl),n=cd(null);Ro(()=>{let r=t.xr;if(!r)return;let o=s=>{s?(n.current=t.shadowMap.enabled,t.shadowMap.enabled=!1):n.current!==null&&(t.shadowMap.enabled=n.current,n.current=null),e(s)},a=()=>o(!0),l=()=>o(!1);return r.addEventListener("sessionstart",a),r.addEventListener("sessionend",l),o(r.isPresenting),()=>{r.removeEventListener("sessionstart",a),r.removeEventListener("sessionend",l)}},[t,e]);let i=cd(0);return dd(()=>{if(!t.xr.isPresenting)return;let r=performance.now();if(r-i.current<1e3)return;i.current=r;let o=t.xr}),null}function Wh({active:e}){let t=Oi(n=>n.invalidate);return Ro(()=>{e&&t()},[e,t]),dd(()=>{e&&t()}),null}function $h({color:e}){let{scene:t}=Oi();return Ro(()=>{let n=t.background;return t.background=e?new rv(e):null,()=>{t.background=n}},[t,e]),null}function Xh({rotation:e}){let{scene:t}=Oi();return ov(()=>{let n=e*Math.PI/180;t.environmentRotation.set(0,n,0),t.backgroundRotation.set(0,n,0)}),null}function qh({cameraConfig:e}){let{camera:t}=Oi();return Ro(()=>{if(!(t instanceof iv))return;let n=e?.fov;typeof n=="number"&&t.fov!==n&&(t.fov=n,t.updateProjectionMatrix())},[t,e]),null}import{useThree as gm}from"@react-three/fiber";import{Autofocus as Tv,Bloom as Pv,BrightnessContrast as kv,ChromaticAberration as _v,ColorAverage as Av,DepthOfField as Rv,DotScreen as Ev,EffectComposer as Lv,Glitch as Bv,GodRays as Ov,Grid as Dv,HueSaturation as Nv,Noise as Iv,Outline as zv,Pixelation as jv,Ramp as Vv,Scanline as Fv,SelectiveBloom as Uv,Sepia as Gv,SMAA as Hv,SSAO as Wv,ToneMapping as $v,Vignette as Xv}from"@react-three/postprocessing";import{BlendFunction as Da,KernelSize as qv}from"postprocessing";import{Color as il,Vector2 as Na}from"three";import{useEffect as Yv,useMemo as Ia,useRef as Kv,useState as Jv}from"react";import{CanvasTexture as Kh,Color as Jh,ImageLoader as av,NoColorSpace as Qs,RepeatWrapping as Yh,SRGBColorSpace as md,Texture as sv}from"three";var Eo=new Map,jr={color:"#93c5fd",intensity:.07},Oa=new Jh(jr.color).multiplyScalar(jr.intensity),Qh=new Jh(jr.color),Zh=.28,Lo=new Map,hd=new Map;function lv(e){return`${e.name}|${e.size}|${e.lastModified}`}function em(e){let t=lv(e),n=e.name.lastIndexOf("."),i=n>0?e.name.slice(0,n):e.name,r=n>0?e.name.slice(n):"",o=`materials/${e.name}`,a=2;for(;;){let l=hd.get(o);if(l===void 0||l===t)return hd.set(o,t),o;o=`materials/${i}-${a}${r}`,a+=1}}function tm(e){return Lo.get(e)}function nm(e,t){let n=++e.loadGeneration;e.loaded=!1;let i=()=>{if(e.loadGeneration!==n)return;e.loaded=!0;let r=e.pending;e.pending=[];for(let o of r)o()};new av().load(t,r=>{e.loadGeneration===n&&(e.texture.image=r,e.texture.needsUpdate=!0,i())},void 0,()=>{e.loadGeneration===n&&(console.warn(`Failed to load texture: ${t}`),i())})}function rm(e,t){for(let n of[md,Qs]){let i=Eo.get(Ba(e,n));i&&nm(i,t)}}function im(e,t){let n=Lo.get(e);n&&n!==t&&n.startsWith("blob:")&&URL.revokeObjectURL(n),Lo.set(e,t),rm(e,t)}function gd(e){let t=Lo.get(e);t&&(t.startsWith("blob:")&&URL.revokeObjectURL(t),Lo.delete(e),hd.delete(e),rm(e,e))}function Ba(e,t){return`${t}|${e}`}function Ut(e,t=Qs,n){let i=Ba(e,t),r=Eo.get(i);if(r)return n&&!r.loaded&&r.pending.push(n),r.texture;let o=Lo.get(e)??e,a={texture:new sv,refCount:0,loaded:!1,pending:n?[n]:[],loadGeneration:0};return a.texture.flipY=!1,a.texture.colorSpace=t,Eo.set(i,a),nm(a,o),a.texture}function Zs(e,t=Qs,n){let i=Ut(e,t,n);return Eo.get(Ba(e,t)).refCount+=1,i}function Di(e,t=Qs){let n=Eo.get(Ba(e,t));n&&(n.refCount-=1,n.refCount<=0&&(n.loadGeneration+=1,n.pending=[],n.texture.dispose(),Eo.delete(Ba(e,t))))}var ud=null;function el(){if(ud)return ud;let e=256,t=document.createElement("canvas");t.width=e,t.height=e;let n=t.getContext("2d"),i=n.createRadialGradient(e*.35,e*.35,e*.02,e*.5,e*.5,e*.55);i.addColorStop(0,"#ffffff"),i.addColorStop(.4,"#b5b5b5"),i.addColorStop(1,"#3a3a3a"),n.fillStyle=i,n.fillRect(0,0,e,e);let r=new Kh(t);return r.colorSpace=md,ud=r,r}var pd=null;function om(){if(pd)return pd;let e=1024,t=8,n=e/t,i=["#ef4444","#f59e0b","#22c55e","#6366f1"],r=document.createElement("canvas");r.width=e,r.height=e;let o=r.getContext("2d");o.textAlign="center",o.textBaseline="middle";for(let l=0;l<t;l+=1)for(let s=0;s<t;s+=1){let d=s*n,u=l*n,c=(Math.floor(s/2)+Math.floor(l/2))%4;o.fillStyle=i[c],o.fillRect(d,u,n,n),o.strokeStyle="rgba(0, 0, 0, 0.28)",o.lineWidth=2;for(let h=1;h<4;h+=1){let m=h*n/4;o.beginPath(),o.moveTo(d+m,u),o.lineTo(d+m,u+n),o.moveTo(d,u+m),o.lineTo(d+n,u+m),o.stroke()}o.strokeStyle="#09090b",o.lineWidth=7,o.strokeRect(d,u,n,n);let p=d+n*.23,g=u+n*.72,f=d+n*.72,v=u+n*.23;o.lineCap="round",o.lineJoin="round",o.beginPath(),o.moveTo(p,g),o.lineTo(f,v),o.lineTo(f-n*.2,v),o.moveTo(f,v),o.lineTo(f,v+n*.2),o.stroke();let P=l*t+s+1;o.font=`700 ${Math.round(n*.2)}px ui-monospace, SFMono-Regular, Menlo, monospace`,o.fillStyle="#ffffff",o.strokeStyle="rgba(0, 0, 0, 0.85)",o.lineWidth=6;let y=String(P).padStart(2,"0");o.strokeText(y,d+n/2,u+n*.82),o.fillText(y,d+n/2,u+n*.82)}let a=new Kh(r);return a.colorSpace=md,a.wrapS=Yh,a.wrapT=Yh,a.flipY=!1,a.anisotropy=8,a.needsUpdate=!0,pd=a,a}import{forwardRef as cv,useImperativeHandle as dv,useMemo as uv}from"react";import{BlendFunction as pv,Effect as hv}from"postprocessing";import{Uniform as mv}from"three";import{jsx as fv}from"react/jsx-runtime";var gv=`
|
|
3
|
+
`);return['<?xml version="1.0" encoding="UTF-8"?>',`<svg xmlns="http://www.w3.org/2000/svg" width="${Da}" height="${Da}" viewBox="0 0 ${Da} ${Da}">`,` <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 Jy(e,t="model"){let n=qy(e),i=Ih(t);return n.map((r,o)=>{let a=ad(r.name,`material-${o+1}`);return{filename:n.length===1?`${i}-uv-layout.svg`:`${i}-uv-${a}-${o+1}.svg`,materialName:r.name,meshCount:[...r.layers.values()].filter(c=>c.edges.size>0).length,svg:Ky(r)}})}async function zh(e,t="model"){let n=Jy(e,t);if(n.length===0)return n;if(n.length===1)return zr(new Blob([n[0].svg],{type:"image/svg+xml;charset=utf-8"}),n[0].filename),n;let i=Object.fromEntries(n.map(o=>[o.filename,Hy(o.svg)])),r=await Ys(i);return zr(new Blob([r],{type:"application/zip"}),`${Ih(t)}-uv-layouts.zip`),n}function jh({sceneRef:e,materialRefs:t,rendererCaptureRef:n,objectBindings:i,downloadFilename:r}){let[o,a]=sd(!1),[s,c]=sd(!1),[l,u]=sd(null);Qy(()=>{if(!s)return;let v=()=>c(!1);return window.addEventListener("pointerdown",v),()=>window.removeEventListener("pointerdown",v)},[s]);let d=Js(()=>{u(null),c(v=>!v)},[]),p=Js(()=>{let v=e.current;v&&(c(!1),a(!0),Bh({scene:v,objectBindings:i,matRefs:t.current,downloadFilename:r,onComplete:()=>a(!1)}))},[r,t,i,e]),g=Js(()=>{c(!1),qs(n.current).then(v=>{let P=document.createElement("a");P.href=v,P.download=`${r}.png`,document.body.appendChild(P),P.click(),document.body.removeChild(P)}).catch(v=>{console.error("Screenshot failed:",v)})},[r,n]),f=Js(async()=>{let v=e.current;if(v)try{if((await zh(v,r)).length===0){u("This model does not contain UV coordinates.");return}u(null),c(!1)}catch(P){console.error("UV layout export failed:",P),u("Could not create the UV layout archive.")}},[r,e]);return{isDownloading:o,downloadMenuOpen:s,uvExportError:l,toggleDownloadMenu:d,handleDownloadMesh:p,handleDownloadScreenshot:g,handleDownloadUvLayout:f}}import{useCallback as Ao,useEffect as ld,useRef as cd,useState as Na}from"react";import{Box3 as Vh,Raycaster as Zy,Vector2 as ev,Vector3 as dd}from"three";function tv(e){let t=new Vh().setFromObject(e),n=new dd;return t.getSize(n),{min:[t.min.x,t.min.y,t.min.z],max:[t.max.x,t.max.y,t.max.z],size:[n.x,n.y,n.z]}}function nv(e){let t=new Vh().setFromObject(e);if(t.isEmpty())return null;let n=t.getCenter(new dd),i=t.getSize(new dd).length()/2;return!Number.isFinite(i)||i<=0?null:{center:[n.x,n.y,n.z],radius:i}}function Fh({canvasAreaRef:e,controlsRef:t,sceneRef:n,modelUrl:i,modelRotation:r,bindingTransformSignature:o,modelLoaded:a}){let[s,c]=Na(!1),[l,u]=Na([]),[d,p]=Na(!1),[g,f]=Na(null),[v,P]=Na(null),y=cd(!1),h=cd(0),m=cd(null);y.current=s;let S=Ao(x=>{x.updateMatrixWorld(!0),f(tv(x)),P(nv(x))},[]),M=Ao(()=>u([]),[]),T=Ao(()=>c(x=>!x),[]),E=Ao(()=>p(x=>!x),[]),b=Ao(x=>{y.current&&(m.current={x:x.clientX,y:x.clientY})},[]),C=Ao(x=>{if(!y.current)return;let k=m.current;if(m.current=null,k&&Math.hypot(x.clientX-k.x,x.clientY-k.y)>6||x.target.closest("button, input, textarea, .ri-measureTools"))return;let A=e.current,z=t.current?.camera,_=n.current;if(!A||!z||!_)return;let F=A.getBoundingClientRect(),j=(x.clientX-F.left)/F.width*2-1,L=-((x.clientY-F.top)/F.height)*2+1,B=new Zy;B.setFromCamera(new ev(j,L),z);let G=B.intersectObject(_,!0)[0];G&&(h.current+=1,u(U=>[...U,{id:h.current,position:[G.point.x,G.point.y,G.point.z]}]))},[e,t,n]);return ld(()=>{u([]),f(null),P(null)},[i]),ld(()=>{u([])},[r,o]),ld(()=>{let x=n.current;!a||!x||S(x)},[o,a,S,n]),{measureMode:s,measureModeRef:y,measurePoints:l,showDimensions:d,measureBox:g,modelBounds:v,refreshBounds:S,clearMeasurements:M,toggleMeasureMode:T,toggleDimensions:E,handleMeasurePointerDown:b,handleMeasureClick:C}}import{createPortal as iv}from"react-dom";import{createXRStore as ov}from"@react-three/xr";import{MapPin as av}from"lucide-react";import{useCallback as Di,useEffect as Ro,useMemo as Hh,useRef as sv,useState as ri}from"react";function ud(){return typeof navigator>"u"?!1:/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)}function pd(){if(typeof navigator>"u")return!1;let e=navigator.userAgent;return/iPhone|iPad|iPod/i.test(e)?!0:navigator.platform==="MacIntel"&&typeof navigator.maxTouchPoints=="number"&&navigator.maxTouchPoints>1}function Uh(){return ud()||pd()}function rv(){if(typeof window>"u"||typeof navigator>"u")return!1;let e=a=>typeof window.matchMedia=="function"&&window.matchMedia(a).matches,t=e("(pointer: coarse)")||e("(any-pointer: coarse)"),n=e("(hover: none)")||e("(any-hover: none)"),i=navigator.maxTouchPoints>0,r=typeof window.screen<"u"&&Math.min(window.screen.width,window.screen.height)<=1024,o=ud();return t||o||i&&n||i&&r}function hd(){if(!rv())return!1;if(ud())return!0;let e=navigator.deviceMemory;return!(typeof e=="number"&&e>=8)}function Gh(e="auto"){switch(e){case"high":return!1;case"low":return!0;default:return hd()}}import{Fragment as lv,jsx as Eo,jsxs as md}from"react/jsx-runtime";var Wh={canPlace:!1,isPlacementMode:!0,isModelPlaced:!1};function $h({enableXR:e,usdzUrl:t,mobileHandoffUrl:n}){let i=sv(null),r=Hh(()=>{if(!e||typeof navigator>"u")return null;let j=navigator.xr;if(!j||typeof j.isSessionSupported!="function"||typeof j.addEventListener!="function")return null;try{return ov({emulate:!1})}catch{return null}},[e]),[o,a]=ri(!1),[s,c]=ri(!1),[l,u]=ri(!0),[d,p]=ri(null),[g,f]=ri(!1),[v,P]=ri(!1),[y,h]=ri(Wh),[m,S]=ri(!1),M=Hh(()=>e&&!!t?.trim()&&pd(),[e,t]);Ro(()=>{u(Uh())},[]);let T=Di(()=>{if(typeof window>"u")return null;try{let j=new URL(n?.trim()||window.location.href,window.location.href);return j.protocol==="http:"||j.protocol==="https:"?j.toString():null}catch{return null}},[n]);Ro(()=>{if(!e||l){p(null),f(!1);return}p(T())},[e,l,T]),Ro(()=>{if(r)return r.subscribe(j=>P(j.session!=null&&j.mode==="immersive-ar"))},[r]),Ro(()=>{S(!1),h(Wh)},[v]),Ro(()=>{if(!e||typeof navigator>"u")return;let j=navigator.xr;if(!j?.isSessionSupported)return;let L=!1;return j.isSessionSupported("immersive-ar").then(B=>!L&&a(B)).catch(()=>{}),j.isSessionSupported("immersive-vr").then(B=>!L&&c(B)).catch(()=>{}),()=>{L=!0}},[e]);let E=Di(()=>{let j=T();j&&(p(j),f(!0))},[T]),b=Di(()=>f(!1),[]),C=Di(()=>{let j=t?.trim();if(!j)return;let L=document.createElement("a");L.setAttribute("rel","ar"),L.href=j,L.style.display="none";let B=document.createElement("img");B.alt="",B.src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==",L.appendChild(B),document.body.appendChild(L),L.click(),L.remove()},[t]),x=Di(j=>{h(j),j.isPlacementMode||S(!1)},[]),k=Di(j=>{S(!1),j?i.current?.finishPlacementMode():i.current?.cancelPlacementMode()},[]),I=Di(j=>{j.preventDefault(),S(!0),i.current?.startPlacementMode()},[]);Ro(()=>{if(!m)return;let j=()=>k(!0),L=()=>k(!1);return window.addEventListener("pointerup",j),window.addEventListener("pointercancel",L),()=>{window.removeEventListener("pointerup",j),window.removeEventListener("pointercancel",L)}},[k,m]);let A=y.isModelPlaced?y.isPlacementMode?y.canPlace?"Release to place":"Move your device over a flat surface":null:y.canPlace?null:"Move your device over a flat surface",z=y.isModelPlaced&&!y.isPlacementMode?"Pinch to resize \xB7 Twist to rotate":null,_=r?.getState().domOverlayRoot??null,F=v&&_?iv(md(lv,{children:[z&&Eo("div",{className:"ri-arHintOverlay",children:Eo("div",{className:"ri-arHint",children:z})}),Eo("div",{className:"ri-arOverlay",children:md("div",{className:"ri-arControls",children:[A&&Eo("div",{className:"ri-arStatus",children:A}),y.isModelPlaced&&md("button",{type:"button",className:`ri-arActionButton ${m?"ri-arActionButton--active":""}`,onPointerDown:j=>I(j.nativeEvent),"aria-pressed":m,children:[Eo(av,{size:14}),"Relocate"]}),!y.isModelPlaced&&y.canPlace&&Eo("button",{type:"button",className:"ri-arActionButton ri-arActionButton--primary",onClick:()=>i.current?.placeCurrent(),children:"Tap to place"})]})})]}),_):null;return{xrStore:r,presenterRef:i,arSupported:o,vrSupported:s,quickLookSupported:M,resolvedMobileHandoffUrl:d,isMobileHandoffOpen:g,arOverlay:F,openMobileHandoff:E,closeMobileHandoff:b,openQuickLook:C,handleARStateChange:x}}import{Canvas as c1,useThree as d1}from"@react-three/fiber";import{ContactShadows as u1,Environment as p1}from"@react-three/drei";import{XR as h1}from"@react-three/xr";import{NoToneMapping as m1}from"three";import{Suspense as g1,useEffect as f1,useMemo as sl,useState as b1}from"react";import{useFrame as fd,useThree as Ni}from"@react-three/fiber";import{useXR as Xh}from"@react-three/xr";import{Color as cv,PerspectiveCamera as dv}from"three";import{useEffect as Lo,useLayoutEffect as uv,useRef as gd}from"react";function qh({renderMode:e}){let{scene:t}=Ni(),n=Ni(a=>a.setFrameloop),i=Xh(a=>a.session!=null),r=Xh(a=>a.mode==="immersive-ar"),o=gd(void 0);return Lo(()=>{n(i?"always":e)},[i,e,n]),Lo(()=>{r?(o.current=t.background,t.background=null):o.current!==void 0&&(t.background=o.current,o.current=void 0)},[r,t]),fd(()=>{r&&t.background!==null&&(t.background=null)}),null}function Yh({onPresentingChange:e}){let t=Ni(r=>r.gl),n=gd(null);Lo(()=>{let r=t.xr;if(!r)return;let o=c=>{c?(n.current=t.shadowMap.enabled,t.shadowMap.enabled=!1):n.current!==null&&(t.shadowMap.enabled=n.current,n.current=null),e(c)},a=()=>o(!0),s=()=>o(!1);return r.addEventListener("sessionstart",a),r.addEventListener("sessionend",s),o(r.isPresenting),()=>{r.removeEventListener("sessionstart",a),r.removeEventListener("sessionend",s)}},[t,e]);let i=gd(0);return fd(()=>{if(!t.xr.isPresenting)return;let r=performance.now();if(r-i.current<1e3)return;i.current=r;let o=t.xr}),null}function Kh({active:e}){let t=Ni(n=>n.invalidate);return Lo(()=>{e&&t()},[e,t]),fd(()=>{e&&t()}),null}function Jh({color:e}){let{scene:t}=Ni();return Lo(()=>{let n=t.background;return t.background=e?new cv(e):null,()=>{t.background=n}},[t,e]),null}function Qh({rotation:e}){let{scene:t}=Ni();return uv(()=>{let n=e*Math.PI/180;t.environmentRotation.set(0,n,0),t.backgroundRotation.set(0,n,0)}),null}function Zh({cameraConfig:e}){let{camera:t}=Ni();return Lo(()=>{if(!(t instanceof dv))return;let n=e?.fov;typeof n=="number"&&t.fov!==n&&(t.fov=n,t.updateProjectionMatrix())},[t,e]),null}import{useThree as il}from"@react-three/fiber";import{Autofocus as Ev,Bloom as Lv,BrightnessContrast as Bv,ChromaticAberration as Ov,ColorAverage as Dv,DepthOfField as Nv,DotScreen as Iv,EffectComposer as zv,Glitch as jv,GodRays as Vv,Grid as Fv,HueSaturation as Uv,Noise as Gv,Outline as Hv,Pixelation as Wv,Ramp as $v,Scanline as Xv,SelectiveBloom as qv,Sepia as Yv,SMAA as Kv,SSAO as Jv,ToneMapping as Qv,Vignette as Zv}from"@react-three/postprocessing";import{BlendFunction as ja,KernelSize as e1}from"postprocessing";import{Color as ol,Vector2 as Va}from"three";import{memo as t1,useCallback as n1,useEffect as vm,useMemo as Fa,useRef as wm,useState as Cm}from"react";import{CanvasTexture as tm,Color as nm,ImageLoader as pv,NoColorSpace as Qs,RepeatWrapping as em,SRGBColorSpace as vd,Texture as hv}from"three";var Bo=new Map,jr={color:"#93c5fd",intensity:.07},za=new nm(jr.color).multiplyScalar(jr.intensity),rm=new nm(jr.color),im=.28,Oo=new Map,yd=new Map;function mv(e){return`${e.name}|${e.size}|${e.lastModified}`}function om(e){let t=mv(e),n=e.name.lastIndexOf("."),i=n>0?e.name.slice(0,n):e.name,r=n>0?e.name.slice(n):"",o=`materials/${e.name}`,a=2;for(;;){let s=yd.get(o);if(s===void 0||s===t)return yd.set(o,t),o;o=`materials/${i}-${a}${r}`,a+=1}}function am(e){return Oo.get(e)}function sm(e,t){let n=++e.loadGeneration;e.loaded=!1;let i=()=>{if(e.loadGeneration!==n)return;e.loaded=!0;let r=e.pending;e.pending=[];for(let o of r)o()};new pv().load(t,r=>{e.loadGeneration===n&&(e.texture.image=r,e.texture.needsUpdate=!0,i())},void 0,()=>{e.loadGeneration===n&&(console.warn(`Failed to load texture: ${t}`),i())})}function lm(e,t){for(let n of[vd,Qs]){let i=Bo.get(Ia(e,n));i&&sm(i,t)}}function cm(e,t){let n=Oo.get(e);n&&n!==t&&n.startsWith("blob:")&&URL.revokeObjectURL(n),Oo.set(e,t),lm(e,t)}function wd(e){let t=Oo.get(e);t&&(t.startsWith("blob:")&&URL.revokeObjectURL(t),Oo.delete(e),yd.delete(e),lm(e,e))}function Ia(e,t){return`${t}|${e}`}function Ft(e,t=Qs,n){let i=Ia(e,t),r=Bo.get(i);if(r)return n&&!r.loaded&&r.pending.push(n),r.texture;let o=Oo.get(e)??e,a={texture:new hv,refCount:0,loaded:!1,pending:n?[n]:[],loadGeneration:0};return a.texture.flipY=!1,a.texture.colorSpace=t,Bo.set(i,a),sm(a,o),a.texture}function Zs(e,t=Qs,n){let i=Ft(e,t,n);return Bo.get(Ia(e,t)).refCount+=1,i}function Ii(e,t=Qs){let n=Bo.get(Ia(e,t));n&&(n.refCount-=1,n.refCount<=0&&(n.loadGeneration+=1,n.pending=[],n.texture.dispose(),Bo.delete(Ia(e,t))))}var bd=null;function el(){if(bd)return bd;let e=256,t=document.createElement("canvas");t.width=e,t.height=e;let n=t.getContext("2d"),i=n.createRadialGradient(e*.35,e*.35,e*.02,e*.5,e*.5,e*.55);i.addColorStop(0,"#ffffff"),i.addColorStop(.4,"#b5b5b5"),i.addColorStop(1,"#3a3a3a"),n.fillStyle=i,n.fillRect(0,0,e,e);let r=new tm(t);return r.colorSpace=vd,bd=r,r}var xd=null;function dm(){if(xd)return xd;let e=1024,t=8,n=e/t,i=["#ef4444","#f59e0b","#22c55e","#6366f1"],r=document.createElement("canvas");r.width=e,r.height=e;let o=r.getContext("2d");o.textAlign="center",o.textBaseline="middle";for(let s=0;s<t;s+=1)for(let c=0;c<t;c+=1){let l=c*n,u=s*n,d=(Math.floor(c/2)+Math.floor(s/2))%4;o.fillStyle=i[d],o.fillRect(l,u,n,n),o.strokeStyle="rgba(0, 0, 0, 0.28)",o.lineWidth=2;for(let h=1;h<4;h+=1){let m=h*n/4;o.beginPath(),o.moveTo(l+m,u),o.lineTo(l+m,u+n),o.moveTo(l,u+m),o.lineTo(l+n,u+m),o.stroke()}o.strokeStyle="#09090b",o.lineWidth=7,o.strokeRect(l,u,n,n);let p=l+n*.23,g=u+n*.72,f=l+n*.72,v=u+n*.23;o.lineCap="round",o.lineJoin="round",o.beginPath(),o.moveTo(p,g),o.lineTo(f,v),o.lineTo(f-n*.2,v),o.moveTo(f,v),o.lineTo(f,v+n*.2),o.stroke();let P=s*t+c+1;o.font=`700 ${Math.round(n*.2)}px ui-monospace, SFMono-Regular, Menlo, monospace`,o.fillStyle="#ffffff",o.strokeStyle="rgba(0, 0, 0, 0.85)",o.lineWidth=6;let y=String(P).padStart(2,"0");o.strokeText(y,l+n/2,u+n*.82),o.fillText(y,l+n/2,u+n*.82)}let a=new tm(r);return a.colorSpace=vd,a.wrapS=em,a.wrapT=em,a.flipY=!1,a.anisotropy=8,a.needsUpdate=!0,xd=a,a}import{forwardRef as gv,useImperativeHandle as fv,useMemo as bv}from"react";import{BlendFunction as xv,Effect as yv}from"postprocessing";import{Uniform as vv}from"three";import{jsx as Cv}from"react/jsx-runtime";var wv=`
|
|
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
|
-
`,fd=class extends hv{constructor(t=1){super("ExposureEffect",gv,{blendFunction:pv.NORMAL,uniforms:new Map([["exposure",new mv(t)]])})}set exposure(t){this.uniforms.get("exposure").value=t}},am=cv(function({exposure:t},n){let i=uv(()=>new fd(t),[]);return i.exposure=t,dv(n,()=>i,[i]),fv("primitive",{object:i,dispose:null})});import{useFrame as bv,useThree as tl}from"@react-three/fiber";import*as dm from"@react-three/postprocessing";import{BlendFunction as xv}from"postprocessing";import{Color as yv,MathUtils as vv,Mesh as wv,Vector2 as sm,Vector3 as lm}from"three";import{useEffect as cm,useMemo as nl,useRef as bd}from"react";import{jsx as Sv}from"react/jsx-runtime";var Cv=dm.LensFlareEffect;function um({config:e}){let t=tl(p=>p.camera),n=tl(p=>p.raycaster),i=tl(p=>p.scene),r=tl(p=>p.viewport),o=bd(null),a=bd(new lm),l=bd(new sm),s=nl(()=>new lm(...e.lensPosition),[e.lensPosition]),d=nl(()=>new yv(e.colorGain??"#141414"),[e.colorGain]),u=nl(()=>new sm(0,0),[]),c=nl(()=>new Cv({blendFunction:xv.NORMAL,enabled:!0,glareSize:e.glareSize,lensPosition:s,screenRes:u,starPoints:6,flareSize:e.flareSize,flareSpeed:e.flareSpeed,flareShape:e.flareShape,animated:e.animated,anamorphic:e.anamorphic,colorGain:d,lensDirtTexture:null,haloScale:e.haloScale,secondaryGhosts:e.secondaryGhosts,aditionalStreaks:e.aditionalStreaks,ghostScale:e.ghostScale,opacity:e.opacity,starBurst:e.starBurst}),[d,e.aditionalStreaks,e.anamorphic,e.animated,e.flareShape,e.flareSize,e.flareSpeed,e.glareSize,e.haloScale,e.ghostScale,e.opacity,e.secondaryGhosts,e.starBurst,s,u]);return cm(()=>(o.current=c,()=>{c.dispose(),o.current=null}),[c]),cm(()=>{let p=c.uniforms.get("screenRes");p&&(p.value.x=r.width,p.value.y=r.height)},[c,r]),bv((p,g)=>{let f=o.current;if(!f)return;let v=f.uniforms.get("lensPosition"),P=f.uniforms.get("opacity");if(!v||!P)return;let y=1;if(a.current.copy(s).project(t),a.current.z>1)return;v.value.x=a.current.x,v.value.y=a.current.y,l.current.x=a.current.x,l.current.y=a.current.y,n.setFromCamera(l.current,t);let h=n.intersectObjects(i.children,!0),{object:m}=h[0]||{};m&&(m.userData?.lensflare==="no-occlusion"?y=0:m instanceof wv&&(m.material.uniforms?._transmission?.value>.2||m.material._transmission&&m.material._transmission>.2?y=.2:m.material.transparent&&(y=m.material.opacity))),P.value=vv.damp(P.value,y,12,g)}),Sv("primitive",{object:c,dispose:null})}import{RampType as xd}from"@react-three/postprocessing";import{GlitchMode as yd,KernelSize as Bo,ToneMappingMode as vd}from"postprocessing";import{Color as Mv}from"three";function pm(e){return e==="linear"?vd.LINEAR:e==="reinhard"?vd.REINHARD:vd.ACES_FILMIC}function rl(e){switch(e){case"verySmall":return Bo.VERY_SMALL;case"small":return Bo.SMALL;case"medium":return Bo.MEDIUM;case"large":return Bo.LARGE;case"veryLarge":return Bo.VERY_LARGE;case"huge":return Bo.HUGE}}function hm(e){switch(e){case"constantMild":return yd.CONSTANT_MILD;case"constantWild":return yd.CONSTANT_WILD;default:return yd.SPORADIC}}function wd(e){let t=new Mv(e);return[t.r,t.g,t.b,1]}function mm(e){return e==="radial"?xd.Radial:e==="mirroredLinear"?xd.MirroredLinear:xd.Linear}import{Fragment as Zv,jsx as gt,jsxs as Cd}from"react/jsx-runtime";var Ni={edgeStrength:1,pulseSpeed:0,visibleEdgeColor:new il(jr.color).getHex(),hiddenEdgeColor:new il(jr.color).multiplyScalar(.35).getHex(),kernelSize:qv.VERY_SMALL,blur:!1,xRay:!1};function Qv(e){let t=[];return e.traverse(n=>{n.isMesh&&t.push(n)}),t}function fm({sceneConfig:e,selectedObjectRef:t,hoveredObjectRef:n,highlightOnHover:i=!1,disabled:r=!1}){let o=gm(M=>M.scene),a=gm(M=>M.gl),l=Kv(null),s=e?.postProcessing,d=t??null,u=s?.outline.enabled===!0,c=u?Qv(o):n?[n]:[],p=u||i,[g,f]=Jv(()=>a.xr?.isPresenting??!1);Yv(()=>{let M=a.xr;if(!M)return;let T=()=>f(!0),E=()=>f(!1);return M.addEventListener("sessionstart",T),M.addEventListener("sessionend",E),f(M.isPresenting),()=>{M.removeEventListener("sessionstart",T),M.removeEventListener("sessionend",E)}},[a]);let v=o.children.filter(M=>M.isLight),P=Ia(()=>new Na(s?.chromaticAberration.offsetX??.002,s?.chromaticAberration.offsetY??.002),[s?.chromaticAberration.offsetX,s?.chromaticAberration.offsetY]),y=Ia(()=>new il(s?.outline.visibleEdgeColor??"#ffffff").getHex(),[s?.outline.visibleEdgeColor]),h=Ia(()=>new il(s?.outline.hiddenEdgeColor??"#22090a").getHex(),[s?.outline.hiddenEdgeColor]),m=Ia(()=>wd(s?.ramp.startColor??"#000000"),[s?.ramp.startColor]),S=Ia(()=>wd(s?.ramp.endColor??"#ffffff"),[s?.ramp.endColor]);return!s||g||r?null:Cd(Zv,{children:[s.godRays.enabled===!0&&Cd("mesh",{ref:l,position:s.godRays.sunPosition,visible:!1,frustumCulled:!1,children:[gt("sphereGeometry",{args:[.1,8,8]}),gt("meshBasicMaterial",{transparent:!0,opacity:0,depthWrite:!1})]}),Cd(Lv,{multisampling:0,enableNormalPass:s.ssao.enabled===!0,autoClear:!1,children:[s.smaa.enabled===!0&>(Hv,{}),s.ssao.enabled===!0&>(Wv,{samples:s.ssao.samples,rings:s.ssao.rings,intensity:s.ssao.intensity,radius:s.ssao.radius,bias:s.ssao.bias,luminanceInfluence:s.ssao.luminanceInfluence,fade:s.ssao.fade,minRadiusScale:s.ssao.minRadiusScale,worldDistanceThreshold:s.ssao.worldDistanceThreshold,worldDistanceFalloff:s.ssao.worldDistanceFalloff,worldProximityThreshold:s.ssao.worldProximityThreshold,worldProximityFalloff:s.ssao.worldProximityFalloff}),s.autofocus.enabled===!0&>(Tv,{focusDistance:s.autofocus.focusDistance,focusRange:s.autofocus.focusRange,focalLength:s.autofocus.focalLength,bokehScale:s.autofocus.bokehScale,target:s.autofocus.target,mouse:s.autofocus.mouse,debug:s.autofocus.debug||void 0,manual:s.autofocus.manual,smoothTime:s.autofocus.smoothTime}),s.autofocus.enabled!==!0&&s.depthOfField.enabled===!0&>(Rv,{focusDistance:s.depthOfField.focusDistance,focusRange:s.depthOfField.focusRange,focalLength:s.depthOfField.focalLength,bokehScale:s.depthOfField.bokehScale}),s.bloom.enabled===!0&>(Pv,{intensity:s.bloom.intensity,luminanceThreshold:s.bloom.luminanceThreshold,luminanceSmoothing:s.bloom.luminanceSmoothing,mipmapBlur:s.bloom.mipmapBlur,radius:s.bloom.radius,levels:s.bloom.levels}),s.selectiveBloom.enabled===!0&>(Uv,{selection:d??void 0,lights:v,selectionLayer:s.selectiveBloom.selectionLayer,intensity:s.selectiveBloom.intensity,luminanceThreshold:s.selectiveBloom.luminanceThreshold,luminanceSmoothing:s.selectiveBloom.luminanceSmoothing,kernelSize:rl(s.selectiveBloom.kernelSize),mipmapBlur:s.selectiveBloom.mipmapBlur,inverted:s.selectiveBloom.inverted,ignoreBackground:s.selectiveBloom.ignoreBackground}),p&>(zv,{selection:c,selectionLayer:s.outline.selectionLayer,blendFunction:Da.SCREEN,edgeStrength:u?s.outline.edgeStrength:Ni.edgeStrength,pulseSpeed:u?s.outline.pulseSpeed:Ni.pulseSpeed,visibleEdgeColor:u?y:Ni.visibleEdgeColor,hiddenEdgeColor:u?h:Ni.hiddenEdgeColor,kernelSize:u?rl(s.outline.kernelSize):Ni.kernelSize,blur:u?s.outline.blur:Ni.blur,xRay:u?s.outline.xRay:Ni.xRay}),s.chromaticAberration.enabled===!0&>(_v,{offset:P,radialModulation:s.chromaticAberration.radialModulation,modulationOffset:s.chromaticAberration.modulationOffset}),s.colorAverage.enabled===!0&>(Av,{}),s.dotScreen.enabled===!0&>(Ev,{angle:s.dotScreen.angle,scale:s.dotScreen.scale}),s.glitch.enabled===!0&>(Bv,{mode:hm(s.glitch.mode),delay:new Na(s.glitch.delay[0],s.glitch.delay[1]),duration:new Na(s.glitch.duration[0],s.glitch.duration[1]),strength:new Na(s.glitch.strength[0],s.glitch.strength[1]),chromaticAberrationOffset:new Na(s.glitch.chromaticAberrationOffset[0],s.glitch.chromaticAberrationOffset[1]),columns:s.glitch.columns,ratio:s.glitch.ratio,active:!0}),s.grid.enabled===!0&>(Dv,{scale:s.grid.scale,lineWidth:s.grid.lineWidth}),s.lensflare.enabled===!0&>(um,{config:s.lensflare}),s.godRays.enabled===!0&>(Ov,{sun:l,samples:s.godRays.samples,density:s.godRays.density,decay:s.godRays.decay,weight:s.godRays.weight,exposure:s.godRays.exposure,clampMax:s.godRays.clampMax,blur:s.godRays.blur,kernelSize:rl(s.godRays.kernelSize)}),s.noise.enabled===!0&>(Iv,{premultiply:s.noise.premultiply,opacity:s.noise.opacity,blendFunction:Da.ADD}),s.brightnessContrast.enabled===!0&>(kv,{brightness:s.brightnessContrast.brightness,contrast:s.brightnessContrast.contrast}),s.hueSaturation.enabled===!0&>(Nv,{hue:s.hueSaturation.hue,saturation:s.hueSaturation.saturation}),s.toneMapping.enabled===!0&>(am,{exposure:s.toneMapping.exposure}),s.vignette.enabled===!0&>(Xv,{eskil:s.vignette.eskil,offset:s.vignette.offset,darkness:s.vignette.darkness,blendFunction:Da.NORMAL}),s.toneMapping.enabled===!0&>($v,{mode:pm(s.toneMapping.mode),resolution:s.toneMapping.resolution,whitePoint:s.toneMapping.whitePoint,middleGrey:s.toneMapping.middleGrey,minLuminance:s.toneMapping.minLuminance,averageLuminance:s.toneMapping.averageLuminance,adaptationRate:s.toneMapping.adaptationRate}),s.sepia.enabled===!0&>(Gv,{intensity:s.sepia.intensity,blendFunction:Da.NORMAL}),s.scanline.enabled===!0&>(Fv,{density:s.scanline.density,blendFunction:Da.OVERLAY}),s.pixelation.enabled===!0&>(jv,{granularity:s.pixelation.granularity}),s.ramp.enabled===!0&>(Vv,{rampType:mm(s.ramp.rampType),rampStart:s.ramp.rampStart,rampEnd:s.ramp.rampEnd,startColor:m,endColor:S,opacity:s.ramp.rampMask?1:s.ramp.opacity??.5,rampBias:s.ramp.rampBias,rampGain:s.ramp.rampGain,rampMask:s.ramp.rampMask,rampInvert:s.ramp.rampInvert})]})]})}import{Component as e1}from"react";var ol=class extends e1{constructor(){super(...arguments);this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(n,i){this.props.onError?.(n)}render(){return this.state.hasError?this.props.fallback??null:this.props.children}};import{Fragment as p1,jsx as jn,jsxs as bm}from"react/jsx-runtime";var d1=1.5;function u1({captureRef:e}){let{gl:t,scene:n,camera:i,invalidate:r}=n1();return l1(()=>{if(e)return e.current={gl:t,scene:n,camera:i,invalidate:r},()=>{e.current=null}},[e,t,n,i,r]),null}function Sd({children:e,camera:t,backgroundColor:n,shadows:i=!0,sceneConfig:r,selectedObjectRef:o,hoveredObjectRef:a,highlightOnHover:l,renderMode:s="demand",maxDpr:d=2,xrStore:u,rendererCaptureRef:c,preserveDrawingBuffer:p=!1,reduceGpuLoad:g}){let f=g??sd(),v=f?Math.min(d,d1):d,P=i&&!f,y=al(()=>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]),h=al(()=>{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=al(()=>{let x=r?.postProcessing;return x?!!(x.glitch.enabled||x.noise.enabled||x.lensflare.enabled&&x.lensflare.animated):!1},[r?.postProcessing]),[S,M]=c1(!1),T=r?.environment,E=r?.groundShadows,b=al(()=>{if(!T)return null;if(T.source==="custom"){let x=T.customEnvironmentUrl.trim();return Us(x)?{files:x}:null}return{preset:T.preset}},[T]),C=bm(p1,{children:[jn(u1,{captureRef:c}),jn(qh,{cameraConfig:t}),jn(Wh,{active:m}),jn($h,{color:h}),b?jn(ol,{onError:x=>console.warn("Failed to load environment map:",x),children:jn(s1,{fallback:null,children:jn(i1,{...b,environmentIntensity:T?.intensity??.25,backgroundIntensity:T?.intensity??.25,background:r?.background.enabled===!0&&r.background.type==="environment"})})}):null,jn(Xh,{rotation:T?.rotation??0}),u&&jn(Hh,{onPresentingChange:M}),E?.enabled&&E.mode==="shadowCatcher"&&!S&&jn(r1,{position:[0,E.height,0],scale:E.size,opacity:E.intensity,blur:E.borderFade,far:15,resolution:1024,color:"#000000"}),e,jn(fm,{sceneConfig:r,selectedObjectRef:o,hoveredObjectRef:a,highlightOnHover:l,disabled:f})]});return jn(t1,{frameloop:s,dpr:[1,v],shadows:P?"soft":!1,resize:{debounce:0,scroll:!1},raycaster:{firstHitOnly:!0},style:y,camera:t??{fov:50},gl:{preserveDrawingBuffer:p,toneMapping:a1,toneMappingExposure:1},children:u?bm(o1,{store:u,children:[jn(Gh,{renderMode:s}),C]}):C})}import{CameraControls as h1}from"@react-three/drei";import{useEffect as m1}from"react";import{jsx as g1}from"react/jsx-runtime";function Md({controlsRef:e,onCameraChange:t}){return m1(()=>{if(!t||!e||typeof e!="object"||!("current"in e))return;let n=e.current;if(!n)return;let i=()=>{t(n.camera,n)};return n.addEventListener("update",i),()=>{n.removeEventListener("update",i)}},[e,t]),g1(h1,{ref:e,makeDefault:!0,smoothTime:.3})}import{useRef as Pd,useMemo as sl,useEffect as b1}from"react";import{useFrame as x1,useThree as xm}from"@react-three/fiber";import{Vector3 as y1}from"three";var Td=Symbol("react-immersive.model-node-id");function f1(e,t){Object.defineProperty(e,Td,{value:t,configurable:!0})}function Oo(e){let t=new Map;e.traverse(s=>{if(!s.name)return;let d=t.get(s.name);d?d.push(s):t.set(s.name,[s])});let n=Object.create(null),i=new WeakMap,r=new Map,o=new Set(Array.from(t,([s,d])=>d.length===1?s:null).filter(s=>s!==null)),a=new Set,l=(s,d)=>{f1(s,d),n[d]=s,i.set(s,d),a.add(d)};for(let[s,d]of t)d.length===1&&l(d[0],s);for(let[s,d]of t){if(d.length<2)continue;let u=[];d.forEach((c,p)=>{let g=`${s} [${p+1}]`,f=g,v=2;for(;o.has(f)||a.has(f);)f=`${g}.${v++}`;l(c,f),u.push(f)}),r.set(s,u)}return{nodesById:n,idByNode:i,duplicateNames:r}}function za(e){return e[Td]??e.name??null}function mr(e,t){let n=null,i=[];return e.traverse(r=>{r[Td]===t&&(n=r),r.name===t&&i.push(r)}),n??(i.length===1?i[0]:null)}import{Fragment as T1,jsx as Ii,jsxs as P1}from"react/jsx-runtime";function vm(e,t){if(!t)return e;let n=t*Math.PI/180,i=Math.cos(n),r=Math.sin(n);return[e[0]*i+e[2]*r,e[1],-e[0]*r+e[2]*i]}function v1(e,t){let[n,i,r]=e.center,o=e.radius,a=Math.hypot(t[0],t[1],t[2]),l=a>1e-6?[t[0]/a,t[1]/a,t[2]/a]:[0,1,0],s=o*2;return{position:[n+l[0]*s,i+l[1]*s,r+l[2]*s],target:e.center,extent:o,near:Math.max(o/100,.001),far:s+o*2}}function w1(e,t){let n=t[0]-e.center[0],i=t[1]-e.center[1],r=t[2]-e.center[2],o=Math.hypot(n,i,r);return{near:Math.max(o-e.radius,o*.01,.001),far:o+e.radius*2}}function C1(e,t,n){return t&&n&&!e.attachedToCamera?n.center:[0,0,0]}var S1={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}]},M1={enabled:!0,mapSize:2048,bias:-5e-4,normalBias:.02,radius:3};function ym({light:e,shadows:t,shadowsEnabled:n,environmentRotation:i,modelBounds:r,objectBindings:o,nodeRefs:a}){let l=Pd(null),s=Pd(null),d=Pd(null),u=xm(y=>y.camera),c=xm(y=>y.scene),p=sl(()=>new y1,[]),g=sl(()=>e.attachedToCamera||e.attachment?e.position:vm(e.position,i),[e.position,e.attachedToCamera,e.attachment,i]);x1(()=>{let y=l.current??s.current??d.current;if(!y)return;if(e.attachedToCamera){y.position.copy(u.position);return}let h=e.attachment;if(!h)return;let m=o?mn(o,h.objectId):null,M=(m?o?.[m]:void 0)?.modelObjectId??h.objectId,T=(m?a?.current[m]:void 0)??mr(c,M);T&&(p.fromArray(h.offset),T.localToWorld(p),y.position.copy(p))});let f=n&&t.enabled&&e.castShadow,v=sl(()=>e.type==="directional"&&f&&r&&!e.attachedToCamera?v1(r,g):null,[e.type,e.attachedToCamera,f,r,g]),P=sl(()=>e.type==="spot"&&f&&r&&!e.attachedToCamera?w1(r,g):null,[e.type,e.attachedToCamera,f,r,g]);return b1(()=>{let y=l.current??d.current;if(!y)return;let[h,m,S]=C1(e,f,r);y.target.position.set(h,m,S),y.target.updateMatrixWorld()},[e,f,r]),!e.visible||e.type==="none"?null:e.type==="directional"?Ii("directionalLight",{ref:l,color:e.color,intensity:e.intensity,position:v?.position??g,castShadow:f,"shadow-mapSize-width":t.mapSize,"shadow-mapSize-height":t.mapSize,"shadow-bias":e.shadowBias,"shadow-normalBias":t.normalBias,"shadow-radius":t.radius,"shadow-camera-near":v?.near??.5,"shadow-camera-far":v?.far??40,"shadow-camera-left":-(v?.extent??8),"shadow-camera-right":v?.extent??8,"shadow-camera-top":v?.extent??8,"shadow-camera-bottom":-(v?.extent??8)}):e.type==="point"?Ii("pointLight",{ref:s,color:e.color,intensity:e.intensity,position:g,distance:e.distance,decay:e.decay,castShadow:f,"shadow-mapSize-width":t.mapSize,"shadow-mapSize-height":t.mapSize,"shadow-bias":e.shadowBias}):e.type==="spot"?Ii("spotLight",{ref:d,color:e.color,intensity:e.intensity,position:g,angle:e.angle??Math.PI/6,penumbra:e.penumbra??.2,distance:e.distance,decay:e.decay,castShadow:f,"shadow-mapSize-width":t.mapSize,"shadow-mapSize-height":t.mapSize,"shadow-bias":e.shadowBias,"shadow-normalBias":t.normalBias,"shadow-radius":t.radius,"shadow-camera-near":P?.near??.5,"shadow-camera-far":P?.far??40}):e.type==="hemisphere"?Ii("hemisphereLight",{color:e.color,groundColor:"#444444",intensity:e.intensity}):null}function kd({lightingConfig:e,shadowConfig:t,shadowsEnabled:n=!0,environmentRotation:i=0,environmentConfig:r,modelBounds:o,objectBindings:a,nodeRefs:l}){let s=e??S1,d=t??M1,u=r?.shadowLight,c=vm([5,10,5],i);return P1(T1,{children:[Ii("ambientLight",{intensity:s.ambient.intensity,color:s.ambient.color}),s.lights.map(p=>Ii(ym,{light:p,shadows:d,shadowsEnabled:n,environmentRotation:i,modelBounds:o,objectBindings:a,nodeRefs:l},p.id)),u?.enabled&&Ii(ym,{light:{id:"light-env-shadow",type:"directional",color:"#ffffff",intensity:u.intensity,position:c,attachedToCamera:!1,castShadow:!0,shadowBias:u.bias,visible:!0},shadows:d,shadowsEnabled:n,environmentRotation:0,modelBounds:o,objectBindings:a,nodeRefs:l})]})}import{useState as Mw,useEffect as Gt,useRef as on,useMemo as gn}from"react";import{useFrame as jd,useThree as Tw}from"@react-three/fiber";import{useLoader as zm,useThree as q1}from"@react-three/fiber";import{FileLoader as Y1,Loader as K1,LoadingManager as J1}from"three";import{FBXLoader as Q1,GLTFLoader as Z1,MTLLoader as ew,OBJLoader as tw}from"three-stdlib";import{USDLoader as nw}from"three/examples/jsm/loaders/USDLoader.js";import{strFromU8 as k1,strToU8 as _1,unzip as A1}from"fflate";var wm;function Cm(e){wm=e}function ja(e){wm?.(e)}var R1=[".glb",".gltf",".obj",".fbx",".usdz",".zip"],E1=["model/gltf-binary","model/gltf+json","model/vnd.usdz+zip","application/vnd.usdz+zip","application/zip","application/x-zip-compressed"],Va=1024*1024,Sm=128*Va,Mm=1024,Tm=128*Va,Pm=256*Va,km=200,L1=Va,Vr=new Map,ll=".glb,.gltf,.obj,.fbx,.usdz,.zip,model/gltf-binary,model/gltf+json,model/vnd.usdz+zip,application/vnd.usdz+zip,application/zip";function Ad(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 Vr.get(e)??{format:Ad(e)}}function B1(e){let t=e.name.toLowerCase();return R1.some(n=>t.endsWith(n))||E1.includes(e.type)}async function cl(e){if(!B1(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 _m(e,"usdz");if(t.endsWith(".zip")||O1(e.type))return D1(e);if(t.endsWith(".gltf")||e.type==="model/gltf+json")return Am(e);let n=Ad(e.name);return n==="gltf"?Am(e):_m(e,n)}function _m(e,t){let n=URL.createObjectURL(e);return Vr.set(n,{format:t,entryPath:e.name}),{url:n,name:e.name,format:t,cleanup:()=>{ja(n),Vr.delete(n),URL.revokeObjectURL(n)}}}function O1(e){return e==="application/zip"||e==="application/x-zip-compressed"}async function Am(e){let t=await e.text(),n=Lm(t,e.name);for(let r of Bm(n))if(!Rd(r))throw new Error(`${e.name} references external assets. Upload a .zip containing the .gltf file and its dependencies.`);let i=URL.createObjectURL(e);return Vr.set(i,{format:"gltf",entryPath:e.name}),{url:i,name:e.name,format:"gltf",cleanup:()=>{ja(i),Vr.delete(i),URL.revokeObjectURL(i)}}}async function D1(e){if(e.size>Sm)throw new Error(`Model zip is too large. The compressed archive must be ${_d(Sm)} or smaller.`);let t=await N1(new Uint8Array(await e.arrayBuffer())),n=new Map;for(let[a,l]of Object.entries(t)){let s=Ed(a);!s||Om(s)||n.set(s,l)}let i=[...n.keys()].filter(a=>/\.(gltf|obj|fbx)$/i.test(a));if(i.length===0)throw new Error("Invalid model zip: no .gltf, .obj, or .fbx file found.");if(i.length>1)throw new Error("Invalid model zip: multiple model entry files found.");let r=i[0],o=Ad(r);if(o==="gltf")return z1(e,r,n);if(o==="obj"||o==="fbx")return I1(e,r,o,n);throw new Error(`Unsupported model entry ${r}.`)}function N1(e){return new Promise((t,n)=>{let i=0,r=0,o=null,a=s=>(o??(o=new Error(`Invalid model zip: ${s}`)),!1);A1(e,{filter:s=>{if(o)return!1;if(i+=1,i>Mm)return a(`archive contains more than ${Mm.toLocaleString()} entries.`);if(s.originalSize>Tm)return a(`${s.name} expands beyond the ${_d(Tm)} per-file limit.`);if(r+=s.originalSize,r>Pm)return a(`expanded contents exceed ${_d(Pm)}.`);if(s.originalSize>=L1&&(s.size===0||s.originalSize/s.size>km))return a(`${s.name} exceeds the ${km}:1 compression-ratio limit.`);let d=Ed(s.name);return!!d&&!Om(d)}},(s,d)=>{o?n(o):s?n(new Error(`Invalid model zip: ${s.message}`)):t(d)})})}function _d(e){return`${e/Va} MiB`}function I1(e,t,n,i){let r=[],o={};for(let[l,s]of i){let d=URL.createObjectURL(new Blob([s],{type:Dm(l)}));r.push(d),o[l]=d}let a=o[t];if(!a)throw r.forEach(l=>URL.revokeObjectURL(l)),new Error(`Invalid model zip: could not read ${t}.`);return Vr.set(a,{format:n,entryPath:t,resourceUrls:o}),{url:a,name:e.name,format:n,cleanup:()=>{ja(a),Vr.delete(a),r.forEach(l=>URL.revokeObjectURL(l))}}}function z1(e,t,n){let i=n.get(t);if(!i)throw new Error("Invalid GLTF zip: no .gltf found.");let r=Lm(k1(i),t);j1(r,t);let o=V1(t),a=[];try{Rm(r.buffers,o,n,a),Rm(r.images,o,n,a);let l=new Blob([_1(JSON.stringify(r))],{type:"model/gltf+json"}),s=URL.createObjectURL(l);return a.push(s),Vr.set(s,{format:"gltf",entryPath:t}),{url:s,name:e.name,format:"gltf",cleanup:()=>{ja(s),Vr.delete(s),a.forEach(d=>URL.revokeObjectURL(d))}}}catch(l){throw a.forEach(s=>URL.revokeObjectURL(s)),l}}function Rm(e,t,n,i){for(let r of e??[]){if(typeof r.uri!="string"||Rd(r.uri))continue;let o=F1(t,r.uri),a=n.get(o);if(!a)throw new Error(`Invalid GLTF zip: missing referenced asset ${r.uri}.`);let l=URL.createObjectURL(new Blob([a],{type:Dm(o)}));i.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 Bm(e){return[...e.buffers??[],...e.images??[]].map(t=>t.uri).filter(t=>typeof t=="string"&&t.length>0)}function j1(e,t){for(let n of Bm(e)){if(Rd(n))continue;let i=/^[a-z][a-z0-9+.-]*:/i.test(n),r=n.startsWith("/")||n.startsWith("\\");if(i||r)throw new Error(`${t} references external assets. Include every dependency inside the uploaded .zip.`)}}function Rd(e){return e.startsWith("data:")}function Ed(e){let t=[];for(let n of e.replace(/\\/g,"/").replace(/^\/+/,"").split("/").filter(i=>i&&i!==".")){if(n===".."){t.pop();continue}t.push(n)}return t.join("/")}function Om(e){let t=e.split("/");return e.endsWith("/")||t.includes("__MACOSX")||t.some(n=>n===".DS_Store"||n.startsWith("._"))}function V1(e){let t=e.lastIndexOf("/");return t===-1?"":e.slice(0,t)}function F1(e,t){let n=t.split(/[?#]/)[0],i=U1(n);return Ed(e?`${e}/${i}`:i)}function U1(e){try{return decodeURI(e)}catch{return e}}function Dm(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 SR}from"@react-three/drei";import{useThree as TR}from"@react-three/fiber";import{useMemo as kR}from"react";import{SRGBColorSpace as G1}from"three";import{DRACOLoader as H1,KTX2Loader as W1,MeshoptDecoder as $1}from"three-stdlib";function X1(e){return{name:"RI_unlit_emissive_texture",async afterRoot(t){let n=e.json.materials??[],i=new Map;if(n.forEach(o=>{let a=!!o?.extensions?.KHR_materials_unlit,l=!!o?.pbrMetallicRoughness?.baseColorTexture;a&&!l&&o?.emissiveTexture&&o.name&&i.set(o.name,o.emissiveTexture.index)}),i.size===0||!t.scene)return;let r=new Map;await Promise.all([...i].map(async([o,a])=>{let l=await e.getDependency("texture",a);l&&(l.colorSpace=G1,r.set(o,l))})),t.scene.traverse(o=>{let a=Array.isArray(o.material)?o.material:o.material?[o.material]:[];for(let l of a){let s=l.name?r.get(l.name):void 0;s&&!l.map&&(l.map=s,l.needsUpdate=!0)}})}}}var Ld="https://assets.react-immersive.liveroom.dev/three-r184/draco/",Bd="https://assets.react-immersive.liveroom.dev/three-r184/basis/";function Nm(e,t={},n){let{dracoDecoderPath:i=Ld,ktx2TranscoderPath:r=Bd,meshopt:o=!0}=t;if(i){let a=new H1;a.setDecoderPath(i),e.setDRACOLoader(a)}if(o&&e.setMeshoptDecoder($1),r&&n){let a=new W1().setTranscoderPath(r).detectSupport(n);e.setKTX2Loader(a)}e.register((a=>X1(a)))}var dl=class extends K1{constructor(){super(...arguments);this.options={source:{format:"glb"}}}configure(n){return this.options=n,this}load(n,i,r,o){this.loadAsset(n,r).then(i).catch(o)}async loadAsset(n,i){let r=iw(this.options.source),{format:o}=this.options.source;if(o==="obj")return rw(n,r,this.options.source,i);if(o==="fbx"){let s=Od(this,new Q1(r)),d=sw(n,this.options.source);d&&s.setResourcePath(d);let u=await s.loadAsync(n,i);return Dd(u,"FBXMesh",!1),{scene:u,animations:u.animations??[]}}if(o==="usdz"){let d=await Od(this,new nw(r)).loadAsync(n,i);return Dd(d,"USDZMesh",!1),{scene:d,animations:d.animations??[]}}let a=Od(this,new Z1(r));Nm(a,this.options.decoderConfig,this.options.renderer);let l=await a.loadAsync(n,i);return{scene:l.scene,animations:l.animations??[]}}};Cm(e=>{zm.clear(dl,e)});function hl(e,t={},n){let i=q1(a=>a.gl),r=Em(e),o=n?{...r,format:n}:r;return zm(dl,e,a=>{a.configure({source:o,decoderConfig:t,renderer:i})})}async function rw(e,t,n,i){let r=await Im(e,t,i),o=new tw(t),a=ow(r);if(a){let s=aw(a,e,n);if(s)try{let d=await Im(s.url,t),c=new ew(t).parse(d,s.basePath);c.preload(),o.setMaterials(c)}catch(d){console.warn(`[react-immersive] Could not load OBJ material ${a}; rendering geometry with fallback materials.`,d)}}let l=o.parse(r);return Dd(l,"OBJMesh",!0),{scene:l,animations:[]}}function Dd(e,t,n){let i=new Set,r=0;e.traverse(o=>{if(!("isMesh"in o&&o.isMesh===!0)){o.name&&i.add(o.name);return}let l=o.name||`${t}_${++r}`;if(!n&&o.name){i.add(o.name);return}let s=l,d=2;for(;i.has(s);)s=`${l}_${d++}`;o.name=s,i.add(s)})}function Im(e,t,n){let i=new Y1(t);return i.setResponseType("text"),i.loadAsync(e,n)}function Od(e,t){return t.setCrossOrigin(e.crossOrigin),t.setWithCredentials(e.withCredentials),t.setRequestHeader(e.requestHeader),t}function iw(e){let t=new J1,n=e.resourceUrls;return n&&t.setURLModifier(i=>{if(/^(?:blob:|data:)/i.test(i))return i;let r=pl(Vm(i).split(/[?#]/)[0]),o=n[r];if(o)return o;let a=ul(e.entryPath??""),l=pl(a?`${a}/${r}`:r);return n[l]??i}),t}function ow(e){return/^\s*mtllib\s+(.+?)\s*$/im.exec(e)?.[1]?.trim()||null}function aw(e,t,n){if(n.resourceUrls&&n.entryPath){let i=pl(`${ul(n.entryPath)}/${Vm(e)}`),r=n.resourceUrls[i];if(!r)return null;let o=ul(i);return{url:r,basePath:o?`${o}/`:""}}try{let i=new URL(e,t).href;return{url:i,basePath:jm(i)}}catch{return null}}function sw(e,t){if(t.resourceUrls&&t.entryPath){let n=ul(t.entryPath);return n?`${n}/`:""}return jm(e)}function jm(e){let t=e.lastIndexOf("/");return t===-1?"":e.slice(0,t+1)}function ul(e){let t=pl(e),n=t.lastIndexOf("/");return n===-1?"":t.slice(0,n)}function pl(e){let t=[];for(let n of e.replace(/\\/g,"/").replace(/^\/+/,"").split("/").filter(i=>i&&i!=="."))n===".."?t.pop():t.push(n);return t.join("/")}function Vm(e){try{return decodeURI(e)}catch{return e}}import{MeshStandardMaterial as Pw,MeshBasicMaterial as Vd,MeshNormalMaterial as kw,MeshMatcapMaterial as _w,DoubleSide as Aw,NormalBlending as Rw,AnimationMixer as Ew,LoopOnce as Lw,LoopRepeat as Bw,Box3 as Sl,Vector3 as ji,Matrix4 as Ow,MathUtils as Ml}from"three";import{SkeletonUtils as Dw}from"three-stdlib";function Fm(e){let t=new Map;return e.map((n,i)=>{let o=n.name.trim()||`Animation ${i+1}`,a=t.get(o)??0;return t.set(o,a+1),{clip:n,sourceName:a===0?o:`${o} (${a+1})`,duration:n.duration}})}import{AdditiveBlending as lw,BackSide as cw,DoubleSide as dw,FrontSide as uw,NoColorSpace as pw,NormalBlending as hw,SRGBColorSpace as mw,Vector2 as Um}from"three";function Gm(e){return!!(e&&typeof e=="object"&&"clone"in e&&"color"in e&&"metalness"in e&&"roughness"in e)}function Hm(e){return!!(e&&typeof e=="object"&&"isMeshPhysicalMaterial"in e&&e.isMeshPhysicalMaterial)}function Kn(e){return!!(e&&"isMesh"in e&&e.isMesh)}var Fa=["texture","metalnessMap","roughnessMap","emissiveMap","alphaMap","normalMap","bumpMap","aoMap","displacementMap","clearcoatMap","clearcoatRoughnessMap","clearcoatNormalMap","anisotropyMap","transmissionMap","thicknessMap","sheenColorMap","sheenRoughnessMap","specularIntensityMap","specularColorMap"],gw=new Set(["texture","emissiveMap","sheenColorMap","specularColorMap"]);function zi(e){return gw.has(e)?mw:pw}function Pt(e,t){return e?.[t]?.path}function Wm(e){return e==="back"?cw:e==="double"?dw:uw}function $m(e){return e==="additive"?lw:hw}function Fr(e,t=1,n=t){if(e&&typeof e=="object"){let i=e;if(typeof i.x=="number"&&Number.isFinite(i.x)&&typeof i.y=="number"&&Number.isFinite(i.y))return new Um(i.x,i.y)}return new Um(t,n)}function Nd(e){return Number.isFinite(e)&&e>0?e:1}function ml(e,t){return e?.animations.clips.find(n=>n.sourceName===t)}function Xm(e){return e?.loopMode??"repeat"}import{Color as Id,MeshPhysicalMaterial as fw,MeshStandardMaterial as bw,Texture as zd}from"three";function Do(e){if(Gm(e))return e;if(!e||typeof e!="object")return null;let t=e,n=new bw;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 zd?(n.emissiveMap=t.map,n.emissive.set(16777215)):t.color instanceof Id&&n.emissive.copy(t.color)):(t.color instanceof Id&&n.color.copy(t.color),t.map instanceof zd&&(n.map=t.map),t.emissive instanceof Id&&n.emissive.copy(t.emissive),t.emissiveMap instanceof zd&&(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 gl(e){if(Hm(e))return e.clone();let t=new fw;return t.name=e.name,t.color.copy(e.color),t.map=e.map,t.lightMap=e.lightMap,t.lightMapIntensity=e.lightMapIntensity,t.aoMap=e.aoMap,t.aoMapIntensity=e.aoMapIntensity,t.emissive.copy(e.emissive),t.emissiveIntensity=e.emissiveIntensity,t.emissiveMap=e.emissiveMap,t.bumpMap=e.bumpMap,t.bumpScale=e.bumpScale,t.normalMap=e.normalMap,t.normalMapType=e.normalMapType,t.normalScale.copy(Fr(e.normalScale)),t.displacementMap=e.displacementMap,t.displacementScale=e.displacementScale,t.displacementBias=e.displacementBias,t.roughness=e.roughness,t.roughnessMap=e.roughnessMap,t.metalness=e.metalness,t.metalnessMap=e.metalnessMap,t.alphaMap=e.alphaMap,t.envMap=e.envMap,t.envMapRotation.copy(e.envMapRotation),t.envMapIntensity=e.envMapIntensity,t.wireframe=e.wireframe,t.wireframeLinewidth=e.wireframeLinewidth,t.flatShading=e.flatShading,t.fog=e.fog,t.opacity=e.opacity,t.transparent=e.transparent,t.alphaHash=e.alphaHash,t.blendSrc=e.blendSrc,t.blendDst=e.blendDst,t.blendEquation=e.blendEquation,t.blendSrcAlpha=e.blendSrcAlpha,t.blendDstAlpha=e.blendDstAlpha,t.blendEquationAlpha=e.blendEquationAlpha,t.blending=e.blending,t.premultipliedAlpha=e.premultipliedAlpha,t.dithering=e.dithering,t.alphaTest=e.alphaTest,t.depthTest=e.depthTest,t.depthWrite=e.depthWrite,t.colorWrite=e.colorWrite,t.stencilWrite=e.stencilWrite,t.stencilWriteMask=e.stencilWriteMask,t.stencilFunc=e.stencilFunc,t.stencilRef=e.stencilRef,t.stencilFuncMask=e.stencilFuncMask,t.stencilFail=e.stencilFail,t.stencilZFail=e.stencilZFail,t.stencilZPass=e.stencilZPass,t.side=e.side,t.shadowSide=e.shadowSide,t.toneMapped=e.toneMapped,t.vertexColors=e.vertexColors,t.visible=e.visible,t.clippingPlanes=e.clippingPlanes,t.clipIntersection=e.clipIntersection,t.clipShadows=e.clipShadows,t.forceSinglePass=e.forceSinglePass,t.polygonOffset=e.polygonOffset,t.polygonOffsetFactor=e.polygonOffsetFactor,t.polygonOffsetUnits=e.polygonOffsetUnits,t}function fl(e){e.userData.baseColor=e.color.clone(),e.userData.baseMap=e.map??null,e.userData.baseMetalness=e.metalness,e.userData.baseMetalnessMap=e.metalnessMap??null,e.userData.baseRoughness=e.roughness,e.userData.baseRoughnessMap=e.roughnessMap??null,e.userData.baseEmissive=e.emissive.clone(),e.userData.baseEmissiveIntensity=e.emissiveIntensity,e.userData.baseEmissiveMap=e.emissiveMap??null,e.userData.baseOpacity=e.opacity,e.userData.baseTransparent=e.transparent,e.userData.baseAlphaMap=e.alphaMap??null,e.userData.baseAlphaTest=e.alphaTest,e.userData.baseAlphaHash=e.alphaHash,e.userData.baseDithering=e.dithering,e.userData.baseBlending=e.blending,e.userData.baseDepthWrite=e.depthWrite,e.userData.baseSide=e.side,e.userData.baseNormalMap=e.normalMap??null,e.userData.baseNormalScale=Fr(e.normalScale),e.userData.baseBumpMap=e.bumpMap??null,e.userData.baseBumpScale=e.bumpScale,e.userData.baseAoMap=e.aoMap??null,e.userData.baseAoMapIntensity=e.aoMapIntensity,e.userData.baseDisplacementMap=e.displacementMap??null,e.userData.baseDisplacementScale=e.displacementScale,e.userData.baseDisplacementBias=e.displacementBias,e.userData.baseClearcoat=e.clearcoat,e.userData.baseClearcoatMap=e.clearcoatMap??null,e.userData.baseClearcoatRoughness=e.clearcoatRoughness,e.userData.baseClearcoatRoughnessMap=e.clearcoatRoughnessMap??null,e.userData.baseClearcoatNormalMap=e.clearcoatNormalMap??null,e.userData.baseClearcoatNormalScale=Fr(e.clearcoatNormalScale),e.userData.baseSheen=e.sheen,e.userData.baseSheenColor=e.sheenColor.clone(),e.userData.baseSheenColorMap=e.sheenColorMap??null,e.userData.baseSheenRoughness=e.sheenRoughness,e.userData.baseSheenRoughnessMap=e.sheenRoughnessMap??null,e.userData.baseAnisotropy=e.anisotropy,e.userData.baseAnisotropyRotation=e.anisotropyRotation,e.userData.baseAnisotropyMap=e.anisotropyMap??null,e.userData.baseTransmission=e.transmission,e.userData.baseTransmissionMap=e.transmissionMap??null,e.userData.baseThickness=e.thickness,e.userData.baseThicknessMap=e.thicknessMap??null,e.userData.baseAttenuationColor=e.attenuationColor.clone(),e.userData.baseAttenuationDistance=e.attenuationDistance,e.userData.baseReflectivity=e.reflectivity,e.userData.baseSpecularIntensity=e.specularIntensity,e.userData.baseSpecularIntensityMap=e.specularIntensityMap??null,e.userData.baseSpecularColor=e.specularColor.clone(),e.userData.baseSpecularColorMap=e.specularColorMap??null,e.userData.baseFlatShading=e.flatShading,e.userData.baseEnvMapIntensity=e.envMapIntensity}import{Color as bl,FrontSide as xw,NormalBlending as qm,SRGBColorSpace as xl}from"three";function yl(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 bl(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??qm,e.depthWrite=e.userData.baseDepthWrite??!0,e.side=e.userData.baseSide??xw,e.normalMap=e.userData.baseNormalMap??null,e.normalScale.copy(Fr(e.userData.baseNormalScale)),e.bumpMap=e.userData.baseBumpMap??null,e.bumpScale=e.userData.baseBumpScale??e.bumpScale,e.aoMap=e.userData.baseAoMap??null,e.aoMapIntensity=e.userData.baseAoMapIntensity??e.aoMapIntensity,e.displacementMap=e.userData.baseDisplacementMap??null,e.displacementScale=e.userData.baseDisplacementScale??e.displacementScale,e.displacementBias=e.userData.baseDisplacementBias??e.displacementBias,e.clearcoat=e.userData.baseClearcoat??e.clearcoat,e.clearcoatMap=e.userData.baseClearcoatMap??null,e.clearcoatRoughness=e.userData.baseClearcoatRoughness??e.clearcoatRoughness,e.clearcoatRoughnessMap=e.userData.baseClearcoatRoughnessMap??null,e.clearcoatNormalMap=e.userData.baseClearcoatNormalMap??null,e.clearcoatNormalScale.copy(Fr(e.userData.baseClearcoatNormalScale)),e.sheen=e.userData.baseSheen??e.sheen,e.sheenColor.copy(e.userData.baseSheenColor??new bl(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 bl("#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 bl("#ffffff")),e.specularColorMap=e.userData.baseSpecularColorMap??null,e.flatShading=e.userData.baseFlatShading??e.flatShading,e.envMapIntensity=e.userData.baseEnvMapIntensity??e.envMapIntensity;let i=Pt(t,"texture"),r=Pt(t,"metalnessMap"),o=Pt(t,"roughnessMap"),a=Pt(t,"emissiveMap"),l=Pt(t,"alphaMap"),s=Pt(t,"normalMap"),d=Pt(t,"bumpMap"),u=Pt(t,"aoMap"),c=Pt(t,"displacementMap"),p=Pt(t,"clearcoatMap"),g=Pt(t,"clearcoatRoughnessMap"),f=Pt(t,"clearcoatNormalMap"),v=Pt(t,"anisotropyMap"),P=Pt(t,"transmissionMap"),y=Pt(t,"thicknessMap"),h=Pt(t,"sheenColorMap"),m=Pt(t,"sheenRoughnessMap"),S=Pt(t,"specularIntensityMap"),M=Pt(t,"specularColorMap");if(i?(e.map=Ut(i,xl),e.color.set(n??"#ffffff")):n&&(e.map=null,e.color.set(n)),r&&(e.metalnessMap=Ut(r)),t?.metalness!==void 0&&(e.metalness=t.metalness),o&&(e.roughnessMap=Ut(o)),t?.roughness!==void 0&&(e.roughness=t.roughness),t?.emissive?e.emissive.set(t.emissive):a&&e.emissive.set("#ffffff"),t?.emissiveIntensity!==void 0&&(e.emissiveIntensity=t.emissiveIntensity),a&&(e.emissiveMap=Ut(a,xl)),t?.opacity!==void 0&&(e.opacity=t.opacity),l&&(e.alphaMap=Ut(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=$m(t.blendingMode),e.depthWrite=t.blendingMode!=="additive"),t?.side&&(e.side=Wm(t.side)),s&&(e.normalMap=Ut(s)),s||t?.normalScale!==void 0){let T=t?.normalScale??Math.abs(Fr(e.userData.baseNormalScale).x);e.normalScale.set(T,t?.flipNormalY?-T:T)}if(d&&(e.bumpMap=Ut(d)),t?.bumpScale!==void 0&&(e.bumpScale=t.bumpScale),u&&(e.aoMap=Ut(u)),t?.aoMapIntensity!==void 0&&(e.aoMapIntensity=t.aoMapIntensity),c&&(e.displacementMap=Ut(c)),t?.displacementScale!==void 0&&(e.displacementScale=t.displacementScale),t?.displacementBias!==void 0&&(e.displacementBias=t.displacementBias),p&&(e.clearcoatMap=Ut(p)),t?.clearcoat!==void 0&&(e.clearcoat=t.clearcoat),g&&(e.clearcoatRoughnessMap=Ut(g)),t?.clearcoatRoughness!==void 0&&(e.clearcoatRoughness=t.clearcoatRoughness),f&&(e.clearcoatNormalMap=Ut(f)),f||t?.clearcoatNormalScale!==void 0){let T=t?.clearcoatNormalScale??Math.abs(Fr(e.userData.baseClearcoatNormalScale).x);e.clearcoatNormalScale.set(T,t?.flipClearcoatNormalY?-T:T)}t?.sheen!==void 0&&(e.sheen=t.sheen),t?.sheenColor&&e.sheenColor.set(t.sheenColor),h&&(e.sheenColorMap=Ut(h,xl)),t?.sheenRoughness!==void 0&&(e.sheenRoughness=t.sheenRoughness),m&&(e.sheenRoughnessMap=Ut(m)),t?.anisotropy!==void 0&&(e.anisotropy=t.anisotropy),t?.anisotropyRotation!==void 0&&(e.anisotropyRotation=t.anisotropyRotation),v&&(e.anisotropyMap=Ut(v)),t?.transmission!==void 0&&(e.transmission=t.transmission),P&&(e.transmissionMap=Ut(P)),t?.thickness!==void 0&&(e.thickness=t.thickness),y&&(e.thicknessMap=Ut(y)),t?.attenuationColor&&e.attenuationColor.set(t.attenuationColor),t?.attenuationDistance!==void 0&&(e.attenuationDistance=t.attenuationDistance),t?.reflectivity!==void 0&&(e.reflectivity=t.reflectivity),t?.specularIntensity!==void 0&&(e.specularIntensity=t.specularIntensity),S&&(e.specularIntensityMap=Ut(S)),t?.specularColor&&e.specularColor.set(t.specularColor),M&&(e.specularColorMap=Ut(M,xl)),e.transparent=e.opacity<1||e.transmission>0||e.blending!==qm||!!((l||e.alphaMap)&&e.alphaTest<=0),e.transparent||(e.depthWrite=!0)}function Ua(e){return e.material}function Tr(e,t){return Array.isArray(e)?e.map(t):t(e,0)}function Jn(e,t){Array.isArray(e)?e.forEach(t):t(e,0)}function vl(e,t){return Array.isArray(e)?e[t]:e}function Ga(e){e.updateMatrixWorld(!0),e.traverse(t=>{let n=t;n.isSkinnedMesh&&(n.skeleton?.update(),n.computeBoundingBox?.(),n.computeBoundingSphere?.())})}import{Matrix4 as yw}from"three";function vw(e){return e.isSkinnedMesh===!0}function No(e){let t=[];return e.traverse(n=>{vw(n)&&t.push(n)}),t}var Ha="reactImmersiveSkinFreeze";function Ym(e){return!!e.userData[Ha]}function wl(e,t){let n=e.userData,i=new yw().copy(t).invert(),r=n[Ha];if(r){r.frozenInverse.copy(i),e.bindMatrixInverse.copy(i);return}let o={frozenInverse:i,previousOnBeforeRender:e.onBeforeRender};e.bindMatrixInverse.copy(i),e.onBeforeRender=function(a,l,s,d,u,c){o.previousOnBeforeRender.call(this,a,l,s,d,u,c),e.bindMatrixInverse.copy(o.frozenInverse)},n[Ha]=o}function Io(e){let t=e.userData,n=t[Ha];n&&(e.onBeforeRender=n.previousOnBeforeRender,delete t[Ha],e.updateMatrixWorld(!0))}import{useCallback as Km,useEffect as ww,useRef as Cw}from"react";import{useThree as Sw}from"@react-three/fiber";function Cl(){let e=Sw(r=>r.gl.domElement),t=Cw(void 0),n=Km(r=>{t.current===void 0&&(t.current=e.style.cursor),e.style.cursor=r},[e]),i=Km(()=>{let r=t.current;r!==void 0&&(e.style.cursor=r,t.current=void 0)},[e]);return ww(()=>()=>{i()},[i]),{setCanvasCursor:n,restoreCanvasCursor:i}}import{jsx as Jm}from"react/jsx-runtime";function Tl(e,t,n){let i=n.get(e);i&&(t?.position?e.position.fromArray(t.position):e.position.copy(i.position),t?.rotation?e.rotation.set(t.rotation[0],t.rotation[1],t.rotation[2],i.rotation.order):e.rotation.copy(i.rotation),t?.scale?e.scale.fromArray(t.scale):e.scale.copy(i.scale),e.updateMatrix())}function Xt(e,t=!1){if(!e||typeof e!="object")return"-";let n=e;return[n.channel??0,t?n.format??"":"",n.isVideoTexture?n.colorSpace??"":""].join(":")}function zo(e){let t=e,n=Number(t.clearcoat)>0,i=Number(t.sheen)>0,r=Number(t.anisotropy)>0,o=Number(t.transmission)>0,a=t.transparent===!1&&t.blending===Rw&&t.alphaToCoverage!==!0;return[Xt(t.map),Xt(t.aoMap),Xt(t.lightMap),Xt(t.bumpMap),Xt(t.normalMap,!0),t.normalMap?t.normalMapType:"",Xt(t.displacementMap),Xt(t.emissiveMap),Xt(t.metalnessMap),Xt(t.roughnessMap),r,Xt(r?t.anisotropyMap:null),n,Xt(n?t.clearcoatMap:null),Xt(n?t.clearcoatNormalMap:null,!0),Xt(n?t.clearcoatRoughnessMap:null),i,Xt(i?t.sheenColorMap:null),Xt(i?t.sheenRoughnessMap:null),Xt(t.specularColorMap),Xt(t.specularIntensityMap),o,Xt(o?t.transmissionMap:null),Xt(o?t.thicknessMap:null),Xt(t.alphaMap),Number(t.alphaTest)>0,!!t.alphaHash,!!t.flatShading,!!t.dithering,t.side,a].join("|")}function Fd({url:e,objectBindings:t,selectedItem:n,itemMaterials:i,onItemClick:r,onItemHover:o,onModelLoaded:a,onAnimationsReady:l,nodeRefsOut:s,onNodeRefsChange:d,materialRefsOut:u,panelHoveredItem:c,sceneConfig:p,zoomOnSelected:g=!0,highlightOnHover:f=!0,decoderConfig:v,modelFormat:P,explodeFactor:y=0,suspendBindingTransforms:h=!1}){let m=hl(e,v,P),S=Tw(R=>R.invalidate),[M,T]=Mw(null),E=on(null),{setCanvasCursor:b,restoreCanvasCursor:C}=Cl();Gt(()=>{f||(T(null),o?.(null),C())},[f,o,C]);let x=gn(()=>Dw.clone(m.scene),[m.scene]),k=gn(()=>Oo(x),[x]),I=k.nodesById;Gt(()=>{k.duplicateNames.size!==0&&console.warn("[react-immersive] Duplicate model node names were assigned unique binding IDs.",Object.fromEntries(k.duplicateNames))},[k]);let A=gn(()=>{let R=new WeakMap;return x.traverse(N=>{R.set(N,{position:N.position.clone(),rotation:N.rotation.clone(),scale:N.scale.clone()})}),R},[x]);Gt(()=>{let R=!1,N=null,H=null,Z=window,Y=Object.entries(I).filter(([,st])=>Kn(st)),se=new Sl,oe=[],tt=0;x.traverse(st=>{Kn(st)&&(st.castShadow=!1,st.receiveShadow=!0)});let ot=()=>{if(R)return;let st=new Set,ue=se.getSize(new ji),pt=new ji;for(let{name:$t,box:rn}of oe)rn.getSize(pt),pt.x>ue.x*.7&&pt.z>ue.z*.7&&pt.y>ue.y*.4&&st.add($t);x.traverse($t=>{if(!Kn($t))return;let rn=za($t);$t.castShadow=!rn||!st.has(rn),$t.receiveShadow=!0}),S()},be=()=>{R||(Z.requestIdleCallback?N=Z.requestIdleCallback(Ne,{timeout:100}):H=window.setTimeout(()=>Ne(),0))},Ne=st=>{if(N=null,H=null,R)return;let ue=performance.now(),pt=0;for(;tt<Y.length&&!(pt>0&&!(st?st.didTimeout?pt<16:st.timeRemaining()>1:performance.now()-ue<8));){let[$t,rn]=Y[tt];tt+=1,pt+=1;let Rt=new Sl().setFromObject(rn);Rt.isEmpty()||(oe.push({name:$t,box:Rt}),se.union(Rt))}tt<Y.length?be():ot()};return be(),()=>{R=!0,N!==null&&Z.cancelIdleCallback?.(N),H!==null&&window.clearTimeout(H)}},[S,I,x]),Gt(()=>{Ga(x)},[x]),Gt(()=>{let R=new AbortController;return Hs(x,R.signal),()=>{R.abort(),Ws(x)}},[x]);let z=gn(()=>{let R={};for(let[N,H]of Object.entries(t))R[H.modelObjectId??N]=N;return R},[t]),_=gn(()=>Object.entries(t).map(([R,N])=>`${R}${N.modelObjectId??R}`).sort().join(""),[t]),V=gn(()=>Object.entries(t).map(([R,N])=>JSON.stringify([R,N.modelObjectId??R,N.transform??null])).sort().join(""),[t]),F=on(new Map);Gt(()=>{let R=new Map,N=new Map;for(let[Y,se]of Object.entries(t)){if(!se.transform)continue;let oe=I[se.modelObjectId??Y];oe&&(R.set(oe,se.transform),N.set(oe,No(oe)))}let H=new Set([...F.current.keys(),...R.keys()]);for(let Y of H){Tl(Y,void 0,A);for(let se of No(Y))Io(se)}x.updateMatrixWorld(!0);let Z=new Map;for(let Y of N.values())for(let se of Y)Z.has(se)||Z.set(se,se.matrixWorld.clone());for(let[Y,se]of R)Tl(Y,se,A);F.current=R,x.updateMatrixWorld(!0);for(let[Y,se]of Z)wl(Y,se);S()},[x,I,A,V,S]),Gt(()=>()=>{for(let R of No(x))Io(R)},[x]);let L=gn(()=>{let R={};for(let[N,H]of Object.entries(t)){let Z=H.modelObjectId??N,Y=I[Z];if(!Kn(Y))continue;let se=Ua(Y);se&&(R[N]=Tr(se,oe=>{let tt=Do(oe),ot=gl(tt??new Pw);return fl(ot),ot}))}return R},[I,_]);Gt(()=>{u&&(u.current=L)},[L,u]),Gt(()=>()=>{for(let R of Object.values(L))Jn(R,N=>N.dispose())},[L]);let B=p?.model.shading??"lit",G=p?.model.renderer??"pbr",U=p?.wireframe.enabled??!1,ae=p?.wireframe.color??"#93c5fd",xe=p?.wireframe.opacity??1,le=gn(()=>{let R={};if(B!=="unlit")return R;for(let[N,H]of Object.entries(L))R[N]=Tr(H,Z=>{let Y=new Vd;return Y.color.copy(Z.color),Y.map=Z.map,Y.alphaMap=Z.alphaMap,Y.alphaTest=Z.alphaTest,Y.transparent=Z.transparent,Y.opacity=Z.opacity,Y.side=Z.side,Y});return R},[L,B]),ge=gn(()=>{let R={};if(B!=="normals")return R;for(let[N,H]of Object.entries(L))R[N]=Tr(H,()=>new kw);return R},[L,B]),ve=gn(()=>{let R={};if(B!=="lit"||G!=="matcap")return R;let N=el();for(let[H,Z]of Object.entries(L))R[H]=Tr(Z,Y=>{let se=new _w;return se.matcap=N,se.color.copy(Y.color),se.alphaMap=Y.alphaMap,se.alphaTest=Y.alphaTest,se.side=Y.side,se});return R},[L,B,G]);Gt(()=>()=>{for(let R of Object.values(le))Jn(R,N=>N.dispose());for(let R of Object.values(ge))Jn(R,N=>N.dispose());for(let R of Object.values(ve))Jn(R,N=>N.dispose())},[le,ge,ve]);let Te=R=>B==="normals"?ge[R]:B==="unlit"?le[R]:G==="matcap"?ve[R]:L[R],ne=on(a);ne.current=a,Gt(()=>{ne.current?.(x)},[x]);let ct=gn(()=>{let R={};for(let[N,H]of Object.entries(t)){let Z=H.modelObjectId??N,Y=I[Z];Y&&(R[N]=Y)}return R},[I,_]);Gt(()=>(s.current=ct,d?.(),()=>{s.current===ct&&(s.current={})}),[ct,s,d]);let Ee=on({});Gt(()=>()=>{for(let R of Object.values(Ee.current))for(let[N,H]of Object.entries(R))H&&Di(H,zi(N));Ee.current={}},[]);let Ae=gn(()=>{let R=new Map;for(let[N,H]of Object.entries(t)){let Z=c===H||c?.id===H.id||c?.modelObjectId===H.modelObjectId,Y=f&&(M===N||Z),se=Y||n===N;(Y||se)&&R.set(N,{emissive:Y,matcap:se})}return R},[t,f,M,n,c]),Be=on(Ae);Be.current=Ae,Gt(()=>{let R=new Set;for(let[N,H]of Object.entries(t)){R.add(N);let Z=H.modelObjectId??N,Y=I[Z];if(!Kn(Y))continue;Y.visible=H.visible!==!1;let se=L[N];if(!se)continue;if(G!=="uv-checker"){let ue=Te(N);ue&&(Y.material=ue)}if(H.visible===!1)continue;let oe=le[N],tt=ve[N],ot=i[N]??i[H.modelObjectId??N],be=H.style?.material,Ne=Ee.current[N]??{};for(let ue of Fa){let pt=Pt(be,ue),$t=Ne[ue];if($t===pt)continue;let rn=zi(ue);$t&&Di($t,rn),pt?(Zs(pt,rn,S),Ne[ue]=pt):delete Ne[ue]}Object.keys(Ne).length>0?Ee.current[N]=Ne:delete Ee.current[N];let st=ot?.hex??be?.baseColor;Jn(se,(ue,pt)=>{let $t=zo(ue);yl(ue,be,st);let rn=ue.userData.reactImmersiveConfiguredEmissive;rn?.isColor?rn.copy(ue.emissive):ue.userData.reactImmersiveConfiguredEmissive=ue.emissive.clone();let Rt=Be.current.get(N);Rt?.emissive&&ue.emissive.add(Oa),$t!==zo(ue)&&(ue.needsUpdate=!0);let It=vl(oe,pt);if(It){let vr=zo(It);It.color.copy(ue.color),It.map=ue.map,It.alphaMap=ue.alphaMap,It.alphaTest=ue.alphaTest,It.transparent=ue.transparent,It.opacity=ue.opacity,It.side=ue.side,vr!==zo(It)&&(It.needsUpdate=!0)}let Ye=vl(tt,pt);if(Ye){let vr=zo(Ye);Rt?.matcap?Ye.color.set(jr.color):Ye.color.copy(ue.color),Ye.map=ue.map,Ye.alphaMap=ue.alphaMap,Ye.alphaTest=ue.alphaTest,Ye.transparent=ue.transparent,Ye.opacity=ue.opacity,Ye.side=ue.side,vr!==zo(Ye)&&(Ye.needsUpdate=!0)}})}for(let N of Object.keys(Ee.current))if(!R.has(N)){for(let[H,Z]of Object.entries(Ee.current[N]))Z&&Di(Z,zi(H));delete Ee.current[N]}S()},[t,I,L,le,ge,ve,i,B,G,S]);let je=on(new Map);Gt(()=>{let R=je.current,N=new Set([...R.keys(),...Ae.keys()]),H=!1;for(let Z of N){let Y=R.get(Z),se=Ae.get(Z),oe=!!Y?.emissive!=!!se?.emissive,tt=!!Y?.matcap!=!!se?.matcap;if(!oe&&!tt)continue;H=!0;let ot=L[Z],be=ve[Z];ot&&Jn(ot,(Ne,st)=>{let ue=Ne.userData.reactImmersiveConfiguredEmissive;oe&&ue?.isColor&&(Ne.emissive.copy(ue),se?.emissive&&Ne.emissive.add(Oa));let pt=vl(be,st);tt&&pt&&(se?.matcap?pt.color.set(jr.color):pt.color.copy(Ne.color))})}je.current=Ae,H&&S()},[Ae,L,ve,S]),Gt(()=>{if(G!=="uv-checker")return;let R=om(),N=[];return x.traverse(H=>{if(!Kn(H))return;let Z=H.material,Y=Array.isArray(Z)?Z:[Z],se=!!H.geometry.getAttribute("uv"),oe=Y.map((ot,be)=>{let Ne=new Vd({color:se?"#ffffff":"#ff00ff",map:se?R:null,side:ot.side});return Ne.name=`${H.name||"mesh"}-uv-checker-${be}`,Ne.toneMapped=!1,Ne}),tt=Array.isArray(Z)?oe:oe[0];H.material=tt,N.push({node:H,original:Z,diagnostic:tt})}),S(),()=>{for(let{node:H,original:Z,diagnostic:Y}of N){H.material=Z;let se=Array.isArray(Y)?Y:[Y];for(let oe of se)oe.dispose()}S()}},[x,G,S]),Gt(()=>{if(!U)return;let R=[];for(let[N,H]of Object.entries(t)){let Z=H.modelObjectId??N,Y=I[Z];if(!Kn(Y))continue;let se=new Vd({color:ae,wireframe:!0,transparent:!0,opacity:xe,depthTest:!1,depthWrite:!1,side:Aw,toneMapped:!1}),oe=Y.clone(!1);oe.name="",oe.position.set(0,0,0),oe.quaternion.identity(),oe.scale.set(1,1,1),oe.matrix.identity(),oe.matrixAutoUpdate=!0,oe.material=se,oe.castShadow=!1,oe.receiveShadow=!1,oe.frustumCulled=!1,oe.renderOrder=1,oe.userData={isWireframeOverlay:!0},oe.raycast=()=>{},Y.morphTargetInfluences&&(oe.morphTargetInfluences=Y.morphTargetInfluences),Y.add(oe),R.push({node:Y,overlay:oe})}return S(),()=>{for(let{node:N,overlay:H}of R)N.remove(H),H.material.dispose()}},[U,ae,xe,I,t,S]);let Ve=gn(()=>Fm(m.animations),[m.animations]),_t=on(l);_t.current=l;let Le=on(p);Le.current=p;let zt=on(null),vt=on({}),Oe=on(null),re=on(null),X=on(1),q=on(new Set),Pe=on(0),De=()=>({currentClip:re.current,isPlaying:Oe.current?.paused===!1,speed:X.current,time:Oe.current?.time??0,duration:Oe.current?.getClip().duration??0}),Se=()=>{let R=De();q.current.forEach(N=>N(R))},fe=(R,N)=>{let H=Xm(N);R.setLoop(H==="once"?Lw:Bw,H==="once"?1:1/0),R.clampWhenFinished=H==="once";let Z=Nd(N?.speed??X.current);X.current=Z,R.setEffectiveTimeScale(Z)},dt=()=>{Oe.current?.stop(),Oe.current=null,re.current=null,Se(),S()},Wt=()=>{Oe.current&&(Oe.current.paused=!0,Se(),S())},jt=R=>{let N=Nd(R);X.current=N,Oe.current?.setEffectiveTimeScale(N),Se()},Nn=R=>{let N=Oe.current;if(!N)return;let H=N.getClip().duration;N.time=Math.min(Math.max(R,0),H),zt.current?.update(0),Se(),S()},pn=R=>{let N=vt.current[R];if(!N)return;let H=ml(Le.current,R);if(!H?.hidden){if(Oe.current===N&&N.paused){fe(N,H),N.paused=!1,re.current=R,Se(),S();return}Oe.current&&Oe.current!==N&&Oe.current.stop(),fe(N,H),N.paused=!1,N.enabled=!0,N.reset().play(),Oe.current=N,re.current=R,Se(),S()}};Gt(()=>{let R=new Ew(x);zt.current=R;let N={};for(let{clip:oe,sourceName:tt}of Ve)N[tt]=R.clipAction(oe);vt.current=N;let H=oe=>{oe.action&&oe.action===Oe.current&&dt()};R.addEventListener("finished",H);let Z=()=>{};_t.current?.({clips:Ve.map(({sourceName:oe})=>oe),clipDetails:Ve.map(({sourceName:oe,duration:tt})=>({sourceName:oe,duration:tt})),play:Ve.length?pn:Z,pause:Ve.length?Wt:Z,stop:Ve.length?dt:Z,setSpeed:Ve.length?jt:Z,seek:Ve.length?Nn:Z,getState:De,subscribe:oe=>(q.current.add(oe),oe(De()),()=>{q.current.delete(oe)})}),X.current=1,Se();let Y=Le.current?.animations.autoplayClip,se=Y?ml(Le.current,Y):void 0;return Y&&!se?.hidden&&pn(Y),()=>{R.removeEventListener("finished",H),R.stopAllAction(),R.uncacheRoot(x),zt.current=null,vt.current={},Oe.current=null,re.current=null,X.current=1,Se()}},[x,Ve]),Gt(()=>{let R=re.current,N=Oe.current;if(!R||!N||!p?.animations)return;let H=ml(p,R);if(H?.hidden){dt();return}H&&(fe(N,H),Se())},[p?.animations]),jd((R,N)=>{if(zt.current&&Oe.current?.paused===!1){if(zt.current.update(N),!h)for(let[H,Z]of F.current)Tl(H,Z,A);S(),Pe.current+=N,Pe.current>=.066&&(Pe.current=0,Se(),Ga(x))}});let we=gn(()=>(p?.model.rotation??[0,0,0]).map(R=>R*Math.PI/180),[p?.model.rotation]);jd((R,N)=>{if(!E.current)return;let H=E.current.rotation;H.x=Ml.lerp(H.x,we[0],1-Math.exp(-5*N)),H.y=Ml.lerp(H.y,we[1],1-Math.exp(-5*N)),H.z=Ml.lerp(H.z,we[2],1-Math.exp(-5*N)),Math.abs(H.x-we[0])<1e-4&&Math.abs(H.y-we[1])<1e-4&&Math.abs(H.z-we[2])<1e-4||S()});let qe=on([]),it=on(0),Re=on(0),wt=gn(()=>new ji,[]);Gt(()=>{let R=new Map;for(let[ot,be]of Object.entries(t)){let Ne=I[be.modelObjectId??ot];Ne&&R.set(Ne,be)}for(let ot of qe.current)Tl(ot.node,R.get(ot.node)?.transform,A);Re.current=0,x.updateWorldMatrix(!0,!0);let N=new Sl().setFromObject(x),H=N.getCenter(new ji),Z=N.getSize(new ji).length()*.5;it.current=Number.isFinite(Z)?Z:0;let Y=[...R.keys()],se=new Set(Y),oe=[],tt=new ji;for(let ot of Y){if(!ot.parent)continue;let be=ot.parent,Ne=!1;for(;be;){if(se.has(be)){Ne=!0;break}be=be.parent}if(Ne)continue;let st=new Sl().setFromObject(ot);if(st.isEmpty())continue;st.getCenter(tt);let ue=tt.clone().sub(H);ue.lengthSq()<1e-8||(ue.normalize(),oe.push({node:ot,restLocalPos:ot.position.clone(),restWorldPos:ot.getWorldPosition(new ji),worldDir:ue,parentInverse:new Ow().copy(ot.parent.matrixWorld).invert()}))}qe.current=oe,S()},[x,I,_,V,A,S]),Gt(()=>{S()},[y,S]),jd((R,N)=>{let H=qe.current;if(H.length===0)return;let Z=Math.min(Math.max(y,0),1),Y=Re.current;if(Math.abs(Y-Z)<1e-4){if(Y===Z)return;Re.current=Z}else Re.current=Ml.lerp(Y,Z,1-Math.exp(-6*N)),S();let se=Re.current*it.current;for(let oe of H)wt.copy(oe.worldDir).multiplyScalar(se).add(oe.restWorldPos).applyMatrix4(oe.parentInverse),oe.node.position.copy(wt)});let ut=R=>{let N=R;for(;N;){let H=za(N),Z=H?z[H]:void 0;if(Z&&t[Z])return[Z,t[Z]];N=N.parent}return null},Ct=R=>{let N=ut(R.object);if(!N)return;let[,H]=N;H.selectable!==!1&&(R.stopPropagation(),r(H))},At=R=>{if(!f)return;let N=ut(R.object);if(!N)return;let[H,Z]=N;Z.hoverable!==!1&&(R.stopPropagation(),b("pointer"),T(H),o?.(Z))},lr=R=>{f&&(R.stopPropagation(),C(),T(null),o?.(null))},ce=gn(()=>!Gs(x),[x]);return Jm("group",{ref:E,children:Jm("primitive",{object:x,...ce?{onClick:Ct,...f?{onPointerOver:At,onPointerOut:lr}:{}}:{}})})}import{useCallback as Hi,useEffect as Wi,useMemo as OS,useRef as Zn,useState as wu}from"react";import{useFrame as DS,useThree as NS}from"@react-three/fiber";import{Box3 as og,BoxGeometry as Ww,Group as rg,Matrix4 as ag,Mesh as $w,MeshBasicMaterial as Xw,Vector3 as Ur}from"three";import{MeshBasicMaterial as Nw,MeshMatcapMaterial as Iw,MeshNormalMaterial as zw,MeshStandardMaterial as jw,Vector3 as Qm}from"three";function Zm(e){let t={};for(let[n,i]of Object.entries(e))t[i.modelObjectId??n]=n;return t}function Gd(e){let t=e,n=null;for(;t;){let i=t.userData?.ri_name;if(typeof i=="string"&&i)return i;!n&&t.name&&(n=t.name),t=t.parent}return n}function eg(e,t){return e||(t?t.modelObjectId??t.id:null)}function Pl(e,t){let n=Gd(e);if(!n)return null;let i=t.keyByModelObject[n]??n,r=t.objectBindings[i];return r?{key:i,binding:r}:null}var jo=new Qm,Ud=new Qm;function kl(e,t){if(!Kn(e)&&!e.userData.riLogicalObject)return;let n=Pl(e,t);if(!n)return;let i=tg(e);if(i.rest??(i.rest={position:e.position.clone(),rotation:e.rotation.clone(),scale:e.scale.clone()}),t.suspendTransforms)return;let r=i.rest,o=n.binding.transform;o?.position?e.position.fromArray(o.position):e.position.copy(r.position),o?.rotation?e.rotation.set(o.rotation[0],o.rotation[1],o.rotation[2],r.rotation.order):e.rotation.copy(r.rotation),o?.scale?e.scale.fromArray(o.scale):e.scale.copy(r.scale);let a=t.explode;if(a&&a.factor>0&&a.radius>0){e.updateWorldMatrix(!0,!1),Ud.setFromMatrixPosition(e.matrixWorld);let l=e;for(;l.parent&&!l.userData.ri_name;)l=l.parent;let s=l.userData.ri_center;Array.isArray(s)&&s.length===3?jo.fromArray(s).applyMatrix4(e.matrixWorld).sub(a.centre):jo.copy(Ud).sub(a.centre),jo.lengthSq()>1e-8&&(jo.normalize().multiplyScalar(a.factor*a.radius).add(Ud),e.parent&&e.parent.worldToLocal(jo),e.position.copy(jo))}e.updateMatrix(),e.updateWorldMatrix(!0,!1)}function Vo(e,t){e.traverse(n=>kl(n,t))}function tg(e){var t;return(t=e.userData).riVisuals??(t.riVisuals={}),e.userData.riVisuals}function Vw(e,t,n,i){return JSON.stringify([e?.style?.material??null,t??null,n.shadingMode,n.rendererMode,i])}function Fw(e){if(e.textures){for(let t of Fa){let n=e.textures[t];n&&Di(n,zi(t))}e.textures=void 0}}function Uw(e,t,n){let i=e.textures??{};for(let r of Fa){let o=Pt(t,r),a=i[r];if(a===o)continue;let l=zi(r);a&&Di(a,l),o?(Zs(o,l,n),i[r]=o):delete i[r]}e.textures=Object.keys(i).length>0?i:void 0}function Gw(e,t){if(t.shadingMode==="normals")return Tr(e,()=>new zw);if(t.shadingMode==="unlit")return Tr(e,n=>{let i=new Nw;return i.color.copy(n.color),i.map=n.map,i.alphaMap=n.alphaMap,i.alphaTest=n.alphaTest,i.transparent=n.transparent,i.opacity=n.opacity,i.side=n.side,i});if(t.rendererMode==="matcap"){let n=el();return Tr(e,i=>{let r=new Iw;return r.matcap=n,r.color.copy(i.color),r.alphaMap=i.alphaMap,r.alphaTest=i.alphaTest,r.side=i.side,r})}return e}function Hw(e,t){if(!Kn(e))return;let i=tg(e);i.original??(i.original=Ua(e));let r=Pl(e,t);if(!r){i.original&&(e.material=i.original),e.visible=!0;return}let{key:o,binding:a}=r;e.visible=a.visible!==!1,kl(e,t);let l=t.itemMaterials?.[o]?.hex??t.itemMaterials?.[a.modelObjectId??o]?.hex,s=o===t.selectedKey||t.highlightOnHover!==!1&&o===t.hoveredKey,d=Vw(a,l,t,s);if(i.signature===d&&i.display){e.material=i.display;return}let u=a.style?.material;if(Uw(i,u,t.invalidate),!i.physical){let c=i.original??Ua(e);if(!c)return;i.physical=Tr(c,p=>{let g=Do(p),f=gl(g??new jw);return fl(f),f})}Jn(i.physical,c=>{yl(c,u,l??u?.baseColor),s&&(c.emissive.add(Oa),c.color.lerp(Qh,Zh)),c.needsUpdate=!0}),i.display&&i.display!==i.physical&&Jn(i.display,c=>c.dispose()),i.display=Gw(i.physical,t),i.signature=d,e.material=i.display}function ng(e,t){e.traverse(n=>Hw(n,t))}function Hd(e){e.traverse(t=>{if(!Kn(t))return;let n=t.userData.riVisuals;n&&(n.rest&&(t.position.copy(n.rest.position),t.rotation.copy(n.rest.rotation),t.scale.copy(n.rest.scale),t.updateMatrix()),n.original&&(t.material=n.original),n.display&&n.display!==n.physical&&Jn(n.display,i=>i.dispose()),n.physical&&Jn(n.physical,i=>i.dispose()),Fw(n),delete t.userData.riVisuals)})}var sg=new ag().makeRotationX(Math.PI/2),ig=sg.clone().invert();function qw(e){let t=new Ur(e[0],e[1],e[2]),n=new Ur(Math.abs(e[3])+Math.abs(e[6])+Math.abs(e[9]),Math.abs(e[4])+Math.abs(e[7])+Math.abs(e[10]),Math.abs(e[5])+Math.abs(e[8])+Math.abs(e[11]));return new og(t.clone().sub(n),t.clone().add(n))}function Yw(e){let t=e.getCenter(new Ur),n=e.getSize(new Ur).multiplyScalar(.5);return[t.x,t.y,t.z,n.x,0,0,0,n.y,0,0,0,n.z]}var _l=class{constructor(){this.group=new rg;this.objects=new Map;this.geometry=new Ww(1,1,1);this.material=new Xw;this.originalBounds=new WeakMap;this.signature="";this.lastContext=null;this.lastEffective=null;this.lastDragging=!1;this.version=0;this.tileVersions=new WeakMap;this.transforms=new Map}setCatalog(t){this.group.clear(),this.objects.clear();for(let n of t){let i=new og(new Ur(...n.minimum),new Ur(...n.maximum)).applyMatrix4(ig),r=new rg;r.name=n.name,r.userData.ri_name=n.name,r.userData.riLogicalObject=!0,r.userData.ri_center=i.getCenter(new Ur).toArray();let o=new $w(this.geometry,this.material);o.visible=!1,o.raycast=()=>{},o.position.copy(i.getCenter(new Ur)),o.scale.copy(i.getSize(new Ur)),r.add(o),this.group.add(r),this.objects.set(n.name,r)}this.signature="",this.lastContext=null}nodesByBinding(t){let n={};for(let[i,r]of this.objects){let o=t.keyByModelObject[i]??i;t.objectBindings[o]&&(n[o]=r)}return n}sync(t,n,i=!1){if(!i&&!this.lastDragging&&t===this.lastContext&&this.lastEffective)return this.lastEffective;this.lastContext=t,this.lastDragging=i;let r={...t,suspendTransforms:!1},o=n?t.objectBindings[n]:void 0,a=o?this.objects.get(o.modelObjectId??n):void 0;i&&a&&o&&(r={...r,objectBindings:{...t.objectBindings,[n]:{...o,transform:{position:a.position.toArray(),rotation:[a.rotation.x,a.rotation.y,a.rotation.z],scale:a.scale.toArray()}}}});for(let s of this.objects.values())i&&s===a||kl(s,r);this.group.updateWorldMatrix(!0,!0);let l=[...this.objects].map(([s,d])=>`${s}:${d.matrix.elements.join(",")}`).join(";");if(l!==this.signature){this.signature=l,this.version++,this.transforms.clear();for(let[s,d]of this.objects)d.matrix.equals(new ag)||this.transforms.set(s,sg.clone().multiply(d.matrix).multiply(ig))}return this.lastEffective=r,r}updateBounds(t){if(!t)return;let n=i=>{if(this.tileVersions.get(i)!==this.version){if(i.boundingVolume.box&&this.tileVersions.get(i)!==this.version){let r=this.originalBounds.get(i);r||(r={box:[...i.boundingVolume.box],error:i.geometricError},this.originalBounds.set(i,r));let o=qw(r.box),a=o.clone(),l=1;for(let d of i.extras?.featureIds??[]){let u=this.transforms.get(d);u&&(a.union(o.clone().applyMatrix4(u)),l=Math.max(l,u.getMaxScaleOnAxis()))}let s=Yw(a);i.boundingVolume.box=s,i.geometricError=r.error*l,i.engineData?.boundingVolume?.setObbData(s,i.engineData.transform),this.tileVersions.set(i,this.version)}i.children?.forEach(n)}};n(t)}dispose(){this.group.clear(),this.objects.clear(),this.geometry.dispose(),this.material.dispose()}};function Kw(e){try{let t=typeof location<"u"?location.href:void 0;return new URL(e,t).origin}catch{return null}}function lg(e){if(!e)return null;let t=e.length,n=e.indexOf("?"),i=e.indexOf("#");n!==-1&&(t=Math.min(t,n)),i!==-1&&(t=Math.min(t,i));let r=e.lastIndexOf(".",t),o=e.lastIndexOf("/",t),a=e.indexOf("://");return a!==-1&&a+2===o||r===-1||r<o?null:e.substring(r+1,t)||null}var Rl,El=(Rl=class{static setXRSession(e){e!==this.session&&(this.flushPending(),this.session=e)}static requestAnimationFrame(e){let{session:t,pending:n}=this,i,r=()=>{n.delete(i),e()};return i=t?t.requestAnimationFrame(r):requestAnimationFrame(r),n.set(i,e),i}static cancelAnimationFrame(e){let{pending:t,session:n}=this;t.delete(e),n?n.cancelAnimationFrame(e):cancelAnimationFrame(e)}static flushPending(){this.pending.forEach((e,t)=>{e(),this.cancelAnimationFrame(t)})}},Wc(Rl,"pending",new Map),Wc(Rl,"session",null),Rl),cg=2**30,pg=class{get unloadPriorityCallback(){return this._unloadPriorityCallback}set unloadPriorityCallback(e){e.length===1?(console.warn('LRUCache: "unloadPriorityCallback" function has been changed to take two arguments.'),this._unloadPriorityCallback=(t,n)=>{let i=e(t),r=e(n);return i<r?-1:+(i>r)}):this._unloadPriorityCallback=e}constructor(){this.minSize=6e3,this.maxSize=8e3,this.minBytesSize=.3*cg,this.maxBytesSize=.4*cg,this.unloadPercent=.05,this.autoMarkUnused=!0,this.cachedBytes=0,this.itemSet=new Map,this.itemList=[],this.usedSet=new Set,this.callbacks=new Map,this.unloadingHandle=-1,this.bytesMap=new Map,this.loadedSet=new Set,this._unloadPriorityCallback=null;let e=this.itemSet;this.defaultPriorityCallback=t=>e.get(t)}isFull(){return this.itemSet.size>=this.maxSize||this.cachedBytes>=this.maxBytesSize}getMemoryUsage(e){return this.bytesMap.get(e)||0}setMemoryUsage(e,t){let{bytesMap:n,itemSet:i}=this;i.has(e)&&(this.cachedBytes-=n.get(e)||0,n.set(e,t),this.cachedBytes+=t)}add(e,t){let n=this.itemSet;if(n.has(e)||this.isFull())return!1;let i=this.usedSet,r=this.itemList,o=this.callbacks;return r.push(e),i.add(e),n.set(e,Date.now()),o.set(e,t),!0}has(e){return this.itemSet.has(e)}remove(e){let t=this.usedSet,n=this.itemSet,i=this.itemList,r=this.bytesMap,o=this.callbacks,a=this.loadedSet;if(n.has(e)){this.cachedBytes-=r.get(e)||0,r.delete(e),o.get(e)(e);let l=i.indexOf(e);return i.splice(l,1),t.delete(e),n.delete(e),o.delete(e),a.delete(e),!0}return!1}setLoaded(e,t){let{itemSet:n,loadedSet:i}=this;n.has(e)&&(t===!0?i.add(e):i.delete(e))}markUsed(e){let t=this.itemSet,n=this.usedSet;t.has(e)&&!n.has(e)&&(t.set(e,Date.now()),n.add(e))}markUnused(e){this.usedSet.delete(e)}markAllUnused(){this.usedSet.clear()}isUsed(e){return this.usedSet.has(e)}unloadUnusedContent(){let{unloadPercent:e,minSize:t,maxSize:n,itemList:i,itemSet:r,usedSet:o,loadedSet:a,callbacks:l,bytesMap:s,minBytesSize:d,maxBytesSize:u}=this,c=i.length-o.size,p=i.length-a.size,g=Math.max(Math.min(i.length-t,c),0),f=this.cachedBytes-d,v=this.unloadPriorityCallback||this.defaultPriorityCallback,P=!1,y=g>0&&c>0||p&&i.length>n;if(c&&this.cachedBytes>d||p&&this.cachedBytes>u||y){i.sort((b,C)=>{let x=o.has(b);if(x===o.has(C)){let k=a.has(b);return k===a.has(C)?-v(b,C):k?1:-1}else return x?1:-1});let h=Math.max(t*e,g*e),m=Math.ceil(Math.min(h,c,g)),S=Math.max(e*f,e*d),M=Math.min(S,f),T=0,E=0;for(;this.cachedBytes-E>u||i.length-T>n;){let b=i[T],C=s.get(b)||0;if(o.has(b)&&a.has(b)||this.cachedBytes-E-C<u&&i.length-T<=n)break;E+=C,T++}for(;E<M||T<m;){let b=i[T],C=s.get(b)||0;if(o.has(b)||this.cachedBytes-E-C<d&&T>=m)break;E+=C,T++}i.splice(0,T).forEach(b=>{this.cachedBytes-=s.get(b)||0,l.get(b)(b),s.delete(b),r.delete(b),l.delete(b),a.delete(b),o.delete(b)}),P=T<g||E<f&&T<c,P&&(P=T>0)}P&&(this.unloadingHandle=El.requestAnimationFrame(()=>this.scheduleUnload()))}scheduleUnload(){El.cancelAnimationFrame(this.unloadingHandle),this.scheduled||(this.scheduled=!0,queueMicrotask(()=>{this.scheduled=!1,this.unloadUnusedContent()}))}},Jw=class extends DOMException{constructor(){super("PriorityQueue: Item removed","AbortError")}},Fo=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=>{El.requestAnimationFrame(e)},this._runjobs=()=>{this.scheduled=!1,this.tryRunJobs()}}sort(){let e=this.priorityCallback,t=this.items;e!==null&&t.sort(e)}has(e){return this.callbacks.has(e)}add(e,t){let n={callback:t,reject:null,resolve:null,promise:null};return n.promise=new Promise((i,r)=>{let o=this.items,a=this.callbacks;n.resolve=i,n.reject=r,o.unshift(e),a.set(e,n),this.autoUpdate&&this.scheduleJobRun()}),n.promise}remove(e){let t=this.items,n=this.callbacks,i=t.indexOf(e);if(i!==-1){let r=n.get(e);r.promise.catch(o=>{if(o.name!=="AbortError")throw o}),r.reject(new Jw),t.splice(i,1),n.delete(e)}}removeByFilter(e){let{items:t}=this;for(let n=0;n<t.length;n++){let i=t[n];e(i)&&(this.remove(i),n--)}}tryRunJobs(){this.sort();let e=this.items,t=this.callbacks,n=this.maxJobs,i=0,r=()=>{this.currJobs--,this.autoUpdate&&this.scheduleJobRun()};for(;n>this.currJobs&&e.length>0&&i<n;){this.currJobs++,i++;let o=e.pop(),{callback:a,resolve:l,reject:s}=t.get(o);t.delete(o);let d;try{d=a(o)}catch(u){s(u),r();continue}d instanceof Promise?d.then(l).catch(s).finally(r):(l(d),r())}}flush(e){let{items:t,callbacks:n}=this,i=t.indexOf(e);if(!n.has(e))return;let{callback:r,resolve:o,reject:a}=n.get(e);n.delete(e),t.splice(i,1);let l;try{l=r(e)}catch(s){a(s);return}return l instanceof Promise?l.then(o).catch(a):o(l),l}scheduleJobRun(){this.scheduled||(this.scheduled=(this._schedulingCallback(this._runjobs),!0))}},Qw=class{get running(){for(let e of this.originQueues.values())if(e.running)return!0;return!1}get maxJobsPerOrigin(){return this._maxJobsPerOrigin}set maxJobsPerOrigin(e){this._maxJobsPerOrigin=e,this.originQueues.forEach(t=>t.maxJobs=e)}get maxJobs(){return this.maxJobsPerOrigin}set maxJobs(e){console.warn('DownloadPriorityQueue: "maxJobs" is no longer valid and limits jobs per server origin. Use "maxJobsPerOrigin", instead.'),this.maxJobsPerOrigin=e}get priorityCallback(){return this._priorityCallback}set priorityCallback(e){this._priorityCallback=e,this.originQueues.forEach(t=>t.priorityCallback=e)}constructor(){this.originQueues=new Map,this._itemQueues=new WeakMap,this._maxJobsPerOrigin=6,this._priorityCallback=null}add(e,t,n,i=null){this.originQueues.forEach((s,d)=>{s.running||this.originQueues.delete(d)});let r=e===null?null:Kw(e),o=this.originQueues.get(r);o||(o=new Fo,o.maxJobs=this._maxJobsPerOrigin,o.priorityCallback=this._priorityCallback,this.originQueues.set(r,o));let a=this._itemQueues.get(t);if(a&&a!==o&&a.has(t))throw Error("DownloadPriorityQueue: Item is already queued with a different url origin.");this._itemQueues.set(t,o);let l=o.add(t,n);return i!==null&&(i.aborted?this.remove(t):i.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 Uo=6378137,X5=1/298.257223563,hg=6356752314245179e-9,Al={inView:!1,error:1/0,distanceFromCamera:1/0};function Ol(e){return e===4||e===-1}function Gr(e,t){return Dl(e)&&e.traversal.lastFrameVisited===t&&e.traversal.used}function Dl(e){return!!e.traversal}function $a(e){let{children:t}=e,n=t.length===0||Dl(t[t.length-1]),i=!e.internal.hasUnrenderableContent||Ol(e.internal.loadingState);return n&&i}function Vi(e){return e.traversal.unconditionallyRefine}function Wa(e,t){if(Dl(e)&&(t.ensureChildrenArePreprocessed(e),e.traversal.lastFrameVisited!==t.frameCount&&(e.traversal.wasInFrustum=e.traversal.inFrustum,e.traversal.wasSetActive=e.traversal.active,e.traversal.wasSetVisible=e.traversal.visible,e.traversal.usedLastFrame=e.traversal.used,e.traversal.lastFrameVisited=t.frameCount,e.traversal.used=!1,e.traversal.inFrustum=!1,e.traversal.isLeaf=!1,e.traversal.visible=!1,e.traversal.active=!1,e.traversal.error=1/0,e.traversal.distanceFromCamera=1/0,e.traversal.allChildrenReady=!1,e.traversal.allChildrenLoaded=!1,e.traversal.kicked=!1,e.traversal.allUsedChildrenProcessed=!1,t.calculateTileViewErrorWithPlugin(e,Al),e.traversal.inFrustum=Al.inView,e.traversal.error=Al.error,e.traversal.distanceFromCamera=Al.distanceFromCamera,e.traversal.unconditionallyRefine=e.internal.hasUnrenderableContent,!e.traversal.unconditionallyRefine))){let n=e.parent;for(;n&&n.traversal.unconditionallyRefine;)n=n.parent;n&&n.geometricError<=e.geometricError&&(e.traversal.unconditionallyRefine=!0)}}function Wd(e,t,n=!1){if(Wa(e,t),n?t.markTileUsed(e):Ll(e),Vi(e)&&$a(e)){let i=e.children;for(let r=0,o=i.length;r<o;r++)Wd(i[r],t,n)}}function mg(e,t){if(Wa(e,t),e.traversal.usedLastFrame&&(Ll(e),e.traversal.wasSetActive&&(e.traversal.active=!0),(!e.traversal.active||Vi(e))&&$a(e))){let n=e.children;for(let i=0,r=n.length;i<r;i++)mg(n[i],t)}}function Ll(e){e.traversal.used=!0}function Zw(e,t){return!(e.traversal.error<=t.errorTarget&&!Vi(e)||t.maxDepth>0&&e.internal.depth+1>=t.maxDepth||!$a(e))}function gg(e,t){let{frameCount:n}=t,{children:i}=e;for(let r=0,o=i.length;r<o;r++){let a=i[r];Gr(a,n)&&(a.traversal.active&&(a.traversal.kicked=!0,a.traversal.active=!1),gg(a,t))}}function dg(e){return!Vi(e)&&(!e.internal.hasContent||Ol(e.internal.loadingState))}function fg(e,t){if(Wa(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(!Zw(e,t)){Ll(e);return}let i=!1,r=!1,o=e.children;for(let a=0,l=o.length;a<l;a++){let s=o[a];fg(s,t),i||(i=Gr(s,t.frameCount)),r||(r=s.traversal.inFrustum)}if(e.refine==="REPLACE"&&!r&&o.length!==0){e.traversal.inFrustum=!1,t.markTileUsed(e);for(let a=0,l=o.length;a<l;a++)Wd(o[a],t,!0);return}if(Ll(e),e.refine==="REPLACE"&&i&&(t.loadSiblings||t.loadAncestors))for(let a=0,l=o.length;a<l;a++)Wd(o[a],t)}function bg(e,t){let n=t.frameCount;if(!Gr(e,n))return;let i=e.children,r=!1;for(let a=0,l=i.length;a<l;a++){let s=i[a];r||(r=Gr(s,n))}if(!r)e.traversal.isLeaf=!0;else{for(let l=0,s=i.length;l<s;l++)bg(i[l],t);let a=!0;for(let l=0,s=i.length;l<s;l++){let d=i[l];if(Gr(d,n)){let u=!Vi(d),c=!d.internal.hasContent||Ol(d.internal.loadingState);u&&c||d.traversal.allChildrenLoaded||(a=!1)}}e.traversal.allChildrenLoaded=a}let o=!0;for(let a=0,l=i.length;a<l;a++){let s=i[a];Gr(s,t.frameCount)&&!s.traversal.allUsedChildrenProcessed&&(o=!1)}e.traversal.allUsedChildrenProcessed=o&&$a(e)}function xg(e,t){if(!Gr(e,t.frameCount))return;let n=e.children;if(e.refine==="REPLACE"&&t.loadAncestors&&!e.traversal.allChildrenLoaded&&!Vi(e)&&(e.traversal.isLeaf=!0),e.traversal.isLeaf){if(!Vi(e)&&(e.traversal.active=!0,$a(e)&&e.internal.hasContent&&!Ol(e.internal.loadingState)))for(let r=0,o=n.length;r<o;r++)mg(n[r],t);return}let i=n.length>0;for(let r=0,o=n.length;r<o;r++){let a=n[r];xg(a,t),Gr(a,t.frameCount)&&!(a.traversal.active&&dg(a))&&!a.traversal.allChildrenReady&&(i=!1)}e.traversal.allChildrenReady=i,e.refine==="REPLACE"&&!i&&e.traversal.wasSetActive&&dg(e)&&(e.traversal.active=!0,gg(e,t))}function yg(e,t){Wa(e,t);let n=Gr(e,t.frameCount);if(n&&(e.internal.hasUnrenderableContent&&(t.markTileUsed(e),t.queueTileForDownload(e)),e.internal.hasRenderableContent&&e.refine==="ADD"&&(e.traversal.active=!0),(e.traversal.active||e.traversal.kicked)&&e.internal.hasContent&&(t.markTileUsed(e),e.traversal.allUsedChildrenProcessed&&t.queueTileForDownload(e),e.internal.loadingState!==4&&(e.traversal.active=!1)),t.loadAncestors&&e.internal.hasContent&&(t.markTileUsed(e),t.queueTileForDownload(e)),e.internal.virtualChildCount>0&&e.internal.hasContent&&t.markTileUsed(e),e.traversal.visible=e.internal.hasRenderableContent&&e.traversal.active&&e.traversal.inFrustum&&e.internal.loadingState===4,t.stats.used++,e.traversal.inFrustum&&t.stats.inFrustum++),n||Dl(e)&&e.traversal.usedLastFrame){let i=!1,r=!1;n?(i=e.traversal.active,r=t.displayActiveTiles&&e.traversal.active||e.traversal.visible):Wa(e,t),e.internal.hasRenderableContent&&e.internal.loadingState===4?(i&&t.stats.active++,r&&t.stats.visible++,e.traversal.wasSetActive!==i&&t.invokeOnePlugin(a=>a.setTileActive&&a.setTileActive(e,i)),e.traversal.wasSetVisible!==r&&t.invokeOnePlugin(a=>a.setTileVisible&&a.setTileVisible(e,r))):e.internal.hasRenderableContent||(r=e.traversal.isLeaf,e.traversal.wasSetVisible!==r&&t.invokeOnePlugin(a=>a.setEmptyTileVisible&&a.setEmptyTileVisible(e,r))),e.traversal.visible=r,e.traversal.active=i;let o=e.children;for(let a=0,l=o.length;a<l;a++){let s=o[a];yg(s,t)}}}function eC(e,t){fg(e,t),bg(e,t),xg(e,t),yg(e,t)}function tC(e){let t=null;return()=>{t===null&&(t=El.requestAnimationFrame(()=>{t=null,e()}))}}function nC(e,t=null,n=null){let i=[];for(i.push(e),i.push(null),i.push(0);i.length>0;){let r=i.pop(),o=i.pop(),a=i.pop();if(t&&t(a,o,r)){n&&n(a,o,r);return}let l=a.children;if(l)for(let s=l.length-1;s>=0;s--)i.push(l[s]),i.push(a),i.push(r+1);n&&n(a,o,r)}}var ug=Symbol("PLUGIN_REGISTERED"),ri={inView:!0,error:0,distance:1/0},rC=(e,t)=>{let n=e.priority||0,i=t.priority||0;return n===i?!e.traversal||!t.traversal?0:e.traversal.used===t.traversal.used?e.traversal.error===t.traversal.error?e.traversal.distanceFromCamera===t.traversal.distanceFromCamera?e.internal.depthFromRenderedParent===t.internal.depthFromRenderedParent?0:e.internal.depthFromRenderedParent>t.internal.depthFromRenderedParent?-1:1:e.traversal.distanceFromCamera>t.traversal.distanceFromCamera?-1:1:e.traversal.error>t.traversal.error?1:-1:e.traversal.used?1:-1:n>i?1:-1},iC=(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,oC=(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,Xa=(e,t)=>{let n=e.priority??1/0,i=t.priority??1/0;if(n!==i)return n>i?1:-1;if(!e.internal||!t.internal)return 0;let r=e.internal.renderer,o=t.internal.renderer,a=!r.loadAncestors,l=!o.loadAncestors;return a&&l?iC(e,t):rC(e,t)},vg=new pg;vg.unloadPriorityCallback=oC;var Bl=new Qw;Bl.maxJobsPerOrigin=25,Bl.priorityCallback=Xa;var $d=new Fo;$d.maxJobs=5,$d.priorityCallback=Xa;var Xd=new Fo;Xd.maxJobs=25,Xd.priorityCallback=(e,t)=>{let n=e.parent,i=t.parent;return n===i?0:n?i?Xa(n,i):-1:1};var wg=class{get root(){let e=this.rootTileset;return e?e.root:null}get loadProgress(){let{stats:e,isLoading:t}=this,n=e.queued+e.downloading+e.parsing,i=e.inCacheSinceLoad+ +!!t;return i===0?1:1-n/i}get downloadQueue(){return this._downloadQueue}set downloadQueue(e){if(e instanceof Fo){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=vg,this.downloadQueue=Bl,this.parseQueue=$d,this.processNodeQueue=Xd,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=tC(()=>{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[ug]===!0)throw Error("TilesRendererBase: A plugin can only be registered to a single tileset");let t=this.plugins,n=e.priority||0,i=t.length;for(let r=0;r<t.length;r++)if((t[r].priority||0)>n){i=r;break}t.splice(i,0,e),e[ug]=!0,e.init&&e.init(this)}unregisterPlugin(e){let t=this.plugins;if(typeof e=="string"&&(e=this.getPluginByName(e)),t.includes(e)){let n=t.indexOf(e);return t.splice(n,1),e.dispose&&e.dispose(),!0}return!1}getPluginByName(e){return this.plugins.find(t=>t.name===e)||null}invokeOnePlugin(e){let t=[...this.plugins,this];for(let n=0;n<t.length;n++){let i=e(t[n]);if(i)return i}return null}invokeAllPlugins(e){let t=[...this.plugins,this],n=[];for(let i=0;i<t.length;i++){let r=e(t[i]);r&&n.push(r)}return n.length===0?null:Promise.all(n)}traverse(e,t,n=!0){this.root&&nC(this.root,(i,...r)=>(n&&this.ensureChildrenArePreprocessed(i,!0),e?e(i,...r):!1),t)}getAttributions(e=[]){return this.invokeAllPlugins(t=>t!==this&&t.getAttributions&&t.getAttributions(e)),e}update(){let{lruCache:e,usedSet:t,stats:n,root:i,downloadQueue:r,parseQueue:o,processNodeQueue:a}=this;if(this.rootLoadingState===0&&(this.rootLoadingState=2,this.invokeOnePlugin(d=>d.loadRootTileset&&d.loadRootTileset()).then(d=>{let u=this.rootURL;u!==null&&this.invokeAllPlugins(c=>u=c.preprocessURL?c.preprocessURL(u,null):u),this.rootLoadingState=4,this.rootTileset=d,this.dispatchEvent({type:"needs-update"}),this.dispatchEvent({type:"load-tileset",tileset:d,url:u}),this.dispatchEvent({type:"load-root-tileset",tileset:d,url:u})}).catch(d=>{this.rootLoadingState=-1,console.error(d),this.rootTileset=null,this.dispatchEvent({type:"load-error",tile:null,error:d,url:this.rootURL})})),!i)return;let l=null;if(this.invokeAllPlugins(d=>{if(d.doTilesNeedUpdate){let u=d.doTilesNeedUpdate();l=l===null?u:!!(l||u)}}),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(d=>e.markUnused(d)),t.clear(),this.prepareForTraversal(),eC(i,this),this.removeUnusedPendingTiles();let s=this.queuedTiles;s.sort(e.unloadPriorityCallback);for(let d=0,u=s.length;d<u&&!e.isFull();d++)this.requestTileContents(s[d]);s.length=0,e.scheduleUnload(),(r.running||o.running||a.running)===!1&&this.isLoading===!0&&(this.cachedSinceLoadComplete.clear(),n.inCacheSinceLoad=0,this.dispatchEvent({type:"tiles-load-end"}),this.isLoading=!1),this.dispatchEvent({type:"update-after"})}resetFailedTiles(){this.rootLoadingState===-1&&(this.rootLoadingState=0);let e=this.stats;e.failed!==0&&(this.traverse(t=>{t.internal.loadingState===-1&&(t.internal.loadingState=0)},null,!1),e.failed=0)}calculateTileViewErrorWithPlugin(e,t){this.calculateTileViewError(e,t);let{errorFalloff:n,errorFalloffDensity:i}=this;if(n>0&&Number.isFinite(t.distanceFromCamera)){let l=t.distanceFromCamera*i;t.error-=n*(1-Math.exp(-l*l))}let r=null,o=0,a=1/0;this.invokeAllPlugins(l=>{l!==this&&l.calculateTileViewError&&(ri.inView=!0,ri.error=0,ri.distance=1/0,l.calculateTileViewError(e,ri)&&(r===null&&(r=!0),r&&(r=ri.inView),ri.inView&&(a=Math.min(a,ri.distance),o=Math.max(o,ri.error))))}),t.inView&&r!==!1?(t.error=Math.max(t.error,o),t.distanceFromCamera=Math.min(t.distanceFromCamera,a)):r?(t.inView=!0,t.error=o,t.distanceFromCamera=a):t.inView=!1}dispose(){[...this.plugins].forEach(n=>{this.unregisterPlugin(n)});let e=this.lruCache,t=[];this.traverse(n=>(t.push(n),!1),null,!1);for(let n=0,i=t.length;n<i;n++)e.remove(t[n]);this.stats={queued:0,parsing:0,downloading:0,failed:0,inFrustum:0,traversed:0,used:0,active:0,visible:0},this.frameCount=0,this.loadingTiles.clear()}calculateBytesUsed(e,t){return 0}dispatchEvent(e){}addEventListener(e,t){}removeEventListener(e,t){}parseTile(e,t,n){return null}prepareForTraversal(){}disposeTile(e){e.traversal.visible&&(e.internal.hasRenderableContent?this.invokeOnePlugin(n=>n.setTileVisible&&n.setTileVisible(e,!1)):this.invokeOnePlugin(n=>n.setEmptyTileVisible&&n.setEmptyTileVisible(e,!1)),e.traversal.visible=!1),e.traversal.active&&e.internal.hasRenderableContent&&this.invokeOnePlugin(n=>n.setTileActive&&n.setTileActive(e,!1)),e.traversal.active=!1;let{scene:t}=e.engineData;t&&this.dispatchEvent({type:"dispose-model",scene:t,tile:e})}preprocessNode(e,t,n=null){if(this.processedTiles.add(e),this.stats.tilesProcessed++,e.content&&(!("uri"in e.content)&&"url"in e.content&&(e.content.uri=e.content.url,delete e.content.url),e.content.boundingVolume&&!("box"in e.content.boundingVolume||"sphere"in e.content.boundingVolume||"region"in e.content.boundingVolume)&&delete e.content.boundingVolume),e.parent=n,e.children=e.children||[],e.internal={hasContent:!1,hasRenderableContent:!1,hasUnrenderableContent:!1,loadingState:0,basePath:t,depth:-1,depthFromRenderedParent:-1,isVirtual:!1,virtualChildCount:0,renderer:this,...e.internal},e.content?.uri){let i=lg(e.content.uri),r=!!(i&&/json$/.test(i));e.internal.hasContent=!0,e.internal.hasUnrenderableContent=r,e.internal.hasRenderableContent=!r}else e.internal.hasContent=!1,e.internal.hasUnrenderableContent=!1,e.internal.hasRenderableContent=!1;n?(e.internal.depth=n.internal.depth+1,e.internal.depthFromRenderedParent=n.internal.depthFromRenderedParent+ +!!e.internal.hasRenderableContent):(e.internal.depth=0,e.internal.depthFromRenderedParent=+!!e.internal.hasRenderableContent),e.traversal={distanceFromCamera:1/0,error:1/0,inFrustum:!1,wasInFrustum:!1,isLeaf:!1,used:!1,usedLastFrame:!1,visible:!1,wasSetVisible:!1,active:!1,wasSetActive:!1,allChildrenReady:!1,allChildrenLoaded:!1,kicked:!1,allUsedChildrenProcessed:!1,lastFrameVisited:-1},n===null?e.refine=e.refine||"REPLACE":e.refine=e.refine||n.refine,e.engineData={scene:null,metadata:null,boundingVolume:null},Object.defineProperty(e,"cached",{get(){return console.warn('TilesRenderer: "tile.cached" field has been renamed to "tile.engineData".'),this.engineData},enumerable:!1,configurable:!0}),this.invokeAllPlugins(i=>{i!==this&&i.preprocessNode&&i.preprocessNode(e,t,n)})}setTileActive(e,t){t?this.activeTiles.add(e):this.activeTiles.delete(e)}setTileVisible(e,t){t?this.visibleTiles.add(e):this.visibleTiles.delete(e),this.dispatchEvent({type:"tile-visibility-change",scene:e.engineData.scene,tile:e,visible:t})}calculateTileViewError(e,t){}removeUnusedPendingTiles(){let{lruCache:e,loadingTiles:t}=this,n=[];for(let i of t)!e.isUsed(i)&&i.internal.loadingState===1&&n.push(i);for(let i=0;i<n.length;i++)e.remove(n[i])}queueTileForDownload(e){e.internal.loadingState!==0||this.lruCache.isFull()||this.queuedTiles.push(e)}markTileUsed(e){this.usedSet.add(e),this.lruCache.markUsed(e)}fetchData(e,t){return fetch(e,t)}ensureChildrenArePreprocessed(e,t=this.stats.tilesProcessed<this.maxTilesProcessed){let n=e.children;if(n.length===0||n[n.length-1].traversal)return;let i=r=>{for(let o=0,a=r.length;o<a;o++){let l=r[o];l&&!l.traversal&&this.preprocessNode(l,e.internal.basePath,e)}};t?(this.processNodeQueue.remove(e),i(n)):this.processNodeQueue.has(e)||this.processNodeQueue.add(e,r=>{i(r.children),this._dispatchNeedsUpdateEvent()})}getBytesUsed(e){let t=0;return this.invokeAllPlugins(n=>{n.calculateBytesUsed&&(t+=n.calculateBytesUsed(e,e.engineData.scene)||0)}),t}recalculateBytesUsed(e=null){let{lruCache:t,processedTiles:n}=this;e===null?t.itemSet.forEach(i=>{n.has(i)&&t.setMemoryUsage(i,this.getBytesUsed(i))}):t.setMemoryUsage(e,this.getBytesUsed(e))}preprocessTileset(e,t,n=null){let[i,r]=e.asset.version.split(".").map(a=>parseInt(a));console.assert(i<=1,"TilesRenderer: asset.version is expected to be a 1.x or a compatible version."),i===1&&r>0&&console.warn("TilesRenderer: tiles versions at 1.1 or higher have limited support. Some new extensions and features may not be supported.");let o=t.replace(/\/[^/]*$/,"");o=new URL(o,window.location.href).toString(),this.preprocessNode(e.root,o,n)}loadRootTileset(){let e=this.rootURL;return this.invokeAllPlugins(t=>e=t.preprocessURL?t.preprocessURL(e,null):e),this.invokeOnePlugin(t=>t.fetchData&&t.fetchData(e,this.fetchOptions)).then(t=>{if(!(t instanceof Response))return t;if(t.ok)return t.json();throw Error(`TilesRenderer: Failed to load tileset "${e}" with status ${t.status} : ${t.statusText}`)}).then(t=>(this.preprocessTileset(t,e),t))}requestTileContents(e){if(e.internal.loadingState!==0)return;let t=!1,n=null,i=new URL(e.content.uri,e.internal.basePath+"/").toString();this.invokeAllPlugins(p=>i=p.preprocessURL?p.preprocessURL(i,e):i);let r=this.stats,o=this.lruCache,a=this.downloadQueue,l=this.parseQueue,s=this.loadingTiles,d=lg(i),u=new AbortController,c=u.signal;if(o.add(e,p=>{u.abort(),t?p.children.length=0:this.invokeAllPlugins(g=>{g.disposeTile&&g.disposeTile(p)}),r.inCache--,this.cachedSinceLoadComplete.has(e)&&(this.cachedSinceLoadComplete.delete(e),r.inCacheSinceLoad--),p.internal.loadingState===1?r.queued--:p.internal.loadingState===2?r.downloading--:p.internal.loadingState===3?r.parsing--:p.internal.loadingState===4&&r.loaded--,p.internal.loadingState=0,l.remove(p),a.remove(p),s.delete(p)}))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,s.add(e),a.add(i,e,p=>{if(c.aborted)return Promise.resolve();e.internal.loadingState=2,r.downloading++,r.queued--;let g=this.invokeOnePlugin(f=>f.fetchData&&f.fetchData(i,{...this.fetchOptions,signal:c}));return this.dispatchEvent({type:"tile-download-start",tile:e,url:i,get uri(){return console.warn('tile-download-start event: "uri" has been renamed to "url".'),this.url}}),g}).then(p=>{if(!c.aborted){if(!(p instanceof Response))return p;if(p.ok)return d==="json"?p.json():p.arrayBuffer();throw Error(`Failed to load model with error code ${p.status}`)}}).then(p=>{if(!c.aborted)return r.downloading--,r.parsing++,e.internal.loadingState=3,l.add(e,g=>c.aborted?Promise.resolve():d==="json"&&p.root?(this.preprocessTileset(p,i,e),e.children.push(p.root),n=p,t=!0,Promise.resolve()):this.invokeOnePlugin(f=>f.parseTile&&f.parseTile(p,g,d,i,c)))}).then(()=>{if(c.aborted)return;r.parsing--,r.loaded++,e.internal.loadingState=4,s.delete(e),o.setLoaded(e,!0);let p=this.getBytesUsed(e);if(o.getMemoryUsage(e)===0&&p>0&&o.isFull()){o.remove(e);return}o.setMemoryUsage(e,p),this.dispatchEvent({type:"needs-update"}),t&&this.dispatchEvent({type:"load-tileset",tileset:n,url:i}),e.engineData.scene&&this.dispatchEvent({type:"load-model",scene:e.engineData.scene,tile:e,url:i})}).catch(p=>{c.aborted||(p.name==="AbortError"?o.remove(e):(l.remove(e),a.remove(e),e.internal.loadingState===1?r.queued--:e.internal.loadingState===2?r.downloading--:e.internal.loadingState===3?r.parsing--:e.internal.loadingState===4&&r.loaded--,r.failed++,console.error(`TilesRenderer : Failed to load tile at url "${e.content.uri}".`),console.error(p),e.internal.loadingState=-1,s.delete(e),o.setLoaded(e,!0),this.dispatchEvent({type:"load-error",tile:e,error:p,url:i})))})}};function Fi(e){if(e===null||e.byteLength<4)return"";let t;if(t=e instanceof DataView?e:new DataView(e),String.fromCharCode(t.getUint8(0))==="{")return null;let n="";for(let i=0;i<4;i++)n+=String.fromCharCode(t.getUint8(i));return n}var aC=new TextDecoder;function Cg(e){return aC.decode(e)}function Nl(e){return e.replace(/[\\/][^\\/]+$/,"")+"/"}var qa=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=Nl(e)),this.parse(t)))}resolveExternalURL(e){return new URL(e,this.workingPath).href}parse(e){throw Error("LoaderBase: Parse not implemented.")}};function Sg(e,t,n,i,r,o){let a;switch(i){case"SCALAR":a=1;break;case"VEC2":a=2;break;case"VEC3":a=3;break;case"VEC4":a=4;break;default:throw Error(`FeatureTable : Feature type not provided for "${o}".`)}let l,s=n*a;switch(r){case"BYTE":l=new Int8Array(e,t,s);break;case"UNSIGNED_BYTE":l=new Uint8Array(e,t,s);break;case"SHORT":l=new Int16Array(e,t,s);break;case"UNSIGNED_SHORT":l=new Uint16Array(e,t,s);break;case"INT":l=new Int32Array(e,t,s);break;case"UNSIGNED_INT":l=new Uint32Array(e,t,s);break;case"FLOAT":l=new Float32Array(e,t,s);break;case"DOUBLE":l=new Float64Array(e,t,s);break;default:throw Error(`FeatureTable : Feature component type not provided for "${o}".`)}return l}var Il=class{constructor(e,t,n,i){this.buffer=e,this.binOffset=t+n,this.binLength=i;let r=null;if(n!==0){let o=new Uint8Array(e,t,n);r=JSON.parse(Cg(o))}else r={};this.header=r}getKeys(){return Object.keys(this.header).filter(e=>e!=="extensions")}getData(e,t,n=null,i=null){let r=this.header;if(!(e in r))return null;let o=r[e];if(!(o instanceof Object)||Array.isArray(o))return o;{let{buffer:a,binOffset:l,binLength:s}=this,d=o.byteOffset||0,u=o.type||i,c=o.componentType||n;if("type"in o&&i&&o.type!==i)throw Error("FeatureTable: Specified type does not match expected type.");let p=l+d,g=Sg(a,p,t,u,c,e);if(p+g.byteLength>l+s)throw Error("FeatureTable: Feature data read outside binary body length.");return g}}getBuffer(e,t){let{buffer:n,binOffset:i}=this;return n.slice(i+e,i+e+t)}},sC=class{constructor(e){this.batchTable=e;let t=e.header.extensions["3DTILES_batch_table_hierarchy"];this.classes=t.classes;for(let i of this.classes){let r=i.instances;for(let o in r)i.instances[o]=this._parseProperty(r[o],i.length,o)}if(this.instancesLength=t.instancesLength,this.classIds=this._parseProperty(t.classIds,this.instancesLength,"classIds"),t.parentCounts?this.parentCounts=this._parseProperty(t.parentCounts,this.instancesLength,"parentCounts"):this.parentCounts=Array(this.instancesLength).fill(1),t.parentIds){let i=this.parentCounts.reduce((r,o)=>r+o,0);this.parentIds=this._parseProperty(t.parentIds,i,"parentIds")}else this.parentIds=null;this.instancesIds=[];let n={};for(let i of this.classIds)n[i]=n[i]??0,this.instancesIds.push(n[i]),n[i]++}_parseProperty(e,t,n){if(Array.isArray(e))return e;{let{buffer:i,binOffset:r}=this.batchTable,o=e.byteOffset,a=e.componentType||"UNSIGNED_SHORT";return Sg(i,r+o,t,"SCALAR",a,n)}}getDataFromId(e,t={}){let n=this.parentCounts[e];if(this.parentIds&&n>0){let l=0;for(let s=0;s<e;s++)l+=this.parentCounts[s];for(let s=0;s<n;s++){let d=this.parentIds[l+s];d!==e&&this.getDataFromId(d,t)}}let i=this.classIds[e],r=this.classes[i].instances,o=this.classes[i].name,a=this.instancesIds[e];for(let l in r)t[o]=t[o]||{},t[o][l]=r[l][a];return t}},qd=class extends Il{constructor(e,t,n,i,r){super(e,n,i,r),this.count=t,this.extensions={};let o=this.header.extensions;o&&o["3DTILES_batch_table_hierarchy"]&&(this.extensions["3DTILES_batch_table_hierarchy"]=new sC(this))}getDataFromId(e,t={}){if(e<0||e>=this.count)throw Error(`BatchTable: id value "${e}" out of bounds for "${this.count}" features number.`);for(let n of this.getKeys())t[n]=super.getData(n,this.count)[e];for(let n in this.extensions){let i=this.extensions[n];i.getDataFromId instanceof Function&&(t[n]=t[n]||{},i.getDataFromId(e,t[n]))}return t}getPropertyArray(e){return super.getData(e,this.count)}},Mg=class extends qa{parse(e){let t=new DataView(e),n=Fi(t);console.assert(n==="b3dm");let i=t.getUint32(4,!0);console.assert(i===1);let r=t.getUint32(8,!0);console.assert(r===e.byteLength);let o=t.getUint32(12,!0),a=t.getUint32(16,!0),l=t.getUint32(20,!0),s=t.getUint32(24,!0),d=new Il(e.slice(28,28+o+a),0,o,a),u=28+o+a,c=new qd(e.slice(u,u+l+s),d.getData("BATCH_LENGTH"),0,l,s),p=u+l+s;return{version:i,featureTable:d,batchTable:c,glbBytes:new Uint8Array(e,p,r-p)}}},Tg=class extends qa{parse(e){let t=new DataView(e),n=Fi(t);console.assert(n==="i3dm");let i=t.getUint32(4,!0);console.assert(i===1);let r=t.getUint32(8,!0);console.assert(r===e.byteLength);let o=t.getUint32(12,!0),a=t.getUint32(16,!0),l=t.getUint32(20,!0),s=t.getUint32(24,!0),d=t.getUint32(28,!0),u=new Il(e.slice(32,32+o+a),0,o,a),c=32+o+a,p=new qd(e.slice(c,c+l+s),u.getData("INSTANCES_LENGTH"),0,l,s),g=c+l+s,f=new Uint8Array(e,g,r-g),v=null,P=null,y=null;if(d)v=f,P=Promise.resolve();else{let h=this.resolveExternalURL(Cg(f));y=Nl(h),P=fetch(h,this.fetchOptions).then(m=>{if(!m.ok)throw Error(`I3DMLoaderBase : Failed to load file "${h}" with status ${m.status} : ${m.statusText}`);return m.arrayBuffer()}).then(m=>{v=new Uint8Array(m)})}return P.then(()=>({version:i,featureTable:u,batchTable:p,glbBytes:v,gltfWorkingPath:y}))}},Pg=class extends qa{parse(e){let t=new DataView(e),n=Fi(t);console.assert(n==="pnts");let i=t.getUint32(4,!0);console.assert(i===1);let r=t.getUint32(8,!0);console.assert(r===e.byteLength);let o=t.getUint32(12,!0),a=t.getUint32(16,!0),l=t.getUint32(20,!0),s=t.getUint32(24,!0),d=new Il(e.slice(28,28+o+a),0,o,a),u=28+o+a,c=new qd(e.slice(u,u+l+s),d.getData("BATCH_LENGTH")||d.getData("POINTS_LENGTH"),0,l,s);return Promise.resolve({version:i,featureTable:d,batchTable:c})}},kg=class extends qa{parse(e){let t=new DataView(e),n=Fi(t);console.assert(n==="cmpt",'CMPTLoader: The magic bytes equal "cmpt".');let i=t.getUint32(4,!0);console.assert(i===1,'CMPTLoader: The version listed in the header is "1".');let r=t.getUint32(8,!0);console.assert(r===e.byteLength,"CMPTLoader: The contents buffer length listed in the header matches the file.");let o=t.getUint32(12,!0),a=[],l=16;for(let s=0;s<o;s++){let d=new DataView(e,l,12),u=Fi(d),c=d.getUint32(4,!0),p=d.getUint32(8,!0),g=new Uint8Array(e,l,p);a.push({type:u,buffer:g,version:c}),l+=p}return{version:i,tiles:a}}};import{Box3 as Gg,BufferAttribute as Ui,BufferGeometry as lC,Clock as hE,Color as cC,DefaultLoadingManager as Xl,Euler as dC,EventDispatcher as zl,Frustum as uC,Group as iu,InstancedMesh as pC,LoadingManager as hC,MathUtils as Hg,Matrix3 as mC,Matrix4 as an,Mesh as mE,OrthographicCamera as gE,PerspectiveCamera as fE,Plane as gC,PlaneGeometry as bE,Points as fC,PointsMaterial as bC,Quaternion as Wg,Ray as ou,Raycaster as xE,ShaderMaterial as yE,Sphere as $g,Spherical as xC,TextureUtils as yC,Vector2 as au,Vector3 as Ie}from"three";import{GLTFLoader as su}from"three/addons/loaders/GLTFLoader.js";import{estimateBytesUsed as vC}from"three/addons/utils/BufferGeometryUtils.js";var lu=class extends Mg{constructor(e=Xl){super(),this.manager=e,this.adjustmentTransform=new an}parse(e){let t=super.parse(e),n=t.glbBytes.slice().buffer;return new Promise((i,r)=>{let o=this.manager,a=this.fetchOptions,l=o.getHandler("path.gltf")||new su(o);a.credentials==="include"&&a.mode==="cors"&&l.setCrossOrigin("use-credentials"),"credentials"in a&&l.setWithCredentials(a.credentials==="include"),a.headers&&l.setRequestHeader(a.headers);let s=this.workingPath;!/[\\/]$/.test(s)&&s.length&&(s+="/");let d=this.adjustmentTransform;l.parse(n,s,u=>{let{batchTable:c,featureTable:p}=t,{scene:g}=u,f=p.getData("RTC_CENTER",1,"FLOAT","VEC3");f&&(g.position.x+=f[0],g.position.y+=f[1],g.position.z+=f[2]),u.scene.updateMatrix(),u.scene.matrix.multiply(d),u.scene.matrix.decompose(u.scene.position,u.scene.quaternion,u.scene.scale),u.batchTable=c,u.featureTable=p,g.batchTable=c,g.featureTable=p,i(u)},r)})}};function wC(e){let t=e>>11,n=e>>5&63,i=e&31;return[Math.round(t/31*255),Math.round(n/63*255),Math.round(i/31*255)]}var Ya=new au;function CC(e,t,n=new Ie){Ya.set(e,t).divideScalar(256).multiplyScalar(2).subScalar(1),n.set(Ya.x,Ya.y,1-Math.abs(Ya.x)-Math.abs(Ya.y));let i=Hg.clamp(-n.z,0,1);return n.x>=0?n.setX(n.x-i):n.setX(n.x+i),n.y>=0?n.setY(n.y-i):n.setY(n.y+i),n.normalize(),n}var _g={RGB:"color",POSITION:"position"},cu=class extends Pg{constructor(e=Xl){super(),this.manager=e}parse(e){return super.parse(e).then(async t=>{let{featureTable:n,batchTable:i}=t,r=new bC,o=n.header.extensions,a=new Ie,l;if(o&&o["3DTILES_draco_point_compression"]){let{byteOffset:u,byteLength:c,properties:p}=o["3DTILES_draco_point_compression"],g=this.manager.getHandler("draco.drc");if(g==null)throw Error("PNTSLoader: dracoLoader not available.");let f={};for(let y in p)if(y in _g&&y in p){let h=_g[y];f[h]=p[y]}let v={attributeIDs:f,attributeTypes:{position:"Float32Array",color:"Uint8Array"},useUniqueIDs:!0},P=n.getBuffer(u,c);l=await g.decodeGeometry(P,v),l.attributes.color&&(r.vertexColors=!0)}else{let u=n.getData("POINTS_LENGTH"),c=n.getData("POSITION",u,"FLOAT","VEC3"),p=n.getData("NORMAL",u,"FLOAT","VEC3"),g=n.getData("NORMAL",u,"UNSIGNED_BYTE","VEC2"),f=n.getData("RGB",u,"UNSIGNED_BYTE","VEC3"),v=n.getData("RGBA",u,"UNSIGNED_BYTE","VEC4"),P=n.getData("RGB565",u,"UNSIGNED_SHORT","SCALAR"),y=n.getData("CONSTANT_RGBA",u,"UNSIGNED_BYTE","VEC4"),h=n.getData("POSITION_QUANTIZED",u,"UNSIGNED_SHORT","VEC3"),m=n.getData("QUANTIZED_VOLUME_SCALE",u,"FLOAT","VEC3"),S=n.getData("QUANTIZED_VOLUME_OFFSET",u,"FLOAT","VEC3");if(l=new lC,h){let M=new Float32Array(u*3);for(let T=0;T<u;T++)for(let E=0;E<3;E++){let b=3*T+E;M[b]=h[b]/65535*m[E]}a.x=S[0],a.y=S[1],a.z=S[2],l.setAttribute("position",new Ui(M,3,!1))}else l.setAttribute("position",new Ui(c,3,!1));if(p!==null)l.setAttribute("normal",new Ui(p,3,!1));else if(g!==null){let M=new Float32Array(u*3),T=new Ie;for(let E=0;E<u;E++){let b=g[E*2],C=g[E*2+1],x=CC(b,C,T);M[E*3]=x.x,M[E*3+1]=x.y,M[E*3+2]=x.z}l.setAttribute("normal",new Ui(M,3,!1))}if(v!==null)l.setAttribute("color",new Ui(v,4,!0)),r.vertexColors=!0,r.transparent=!0,r.depthWrite=!1;else if(f!==null)l.setAttribute("color",new Ui(f,3,!0)),r.vertexColors=!0;else if(P!==null){let M=new Uint8Array(u*3);for(let T=0;T<u;T++){let E=wC(P[T]);for(let b=0;b<3;b++){let C=3*T+b;M[C]=E[b]}}l.setAttribute("color",new Ui(M,3,!0)),r.vertexColors=!0}else if(y!==null){r.color=new cC(y[0],y[1],y[2]);let M=y[3]/255;M<1&&(r.opacity=M,r.transparent=!0,r.depthWrite=!1)}}let s=new fC(l,r);s.position.copy(a),t.scene=s,t.scene.featureTable=n,t.scene.batchTable=i;let d=n.getData("RTC_CENTER",1,"FLOAT","VEC3");return d&&(t.scene.position.x+=d[0],t.scene.position.y+=d[1],t.scene.position.z+=d[2]),t})}};function SC(e){let{x:t,y:n,z:i}=e;e.x=i,e.y=t,e.z=n}function MC(e){return-e+Math.PI/2}var Ag=new xC,ii=new Ie,vn=new Ie,Yd=new Ie,Qn=new an,Pr=new an,Kd=new $g,Rn=new dC,Rg=new Ie,Eg=new Ie,Lg=new Ie,Ka=new Ie,jl=new ou,TC=1e-12,PC=.1;var du=class{constructor(e=1,t=1,n=1){this.name="",this.radius=new Ie(e,t,n)}intersectRay(e,t){return Qn.makeScale(...this.radius).invert(),Kd.center.set(0,0,0),Kd.radius=1,jl.copy(e).applyMatrix4(Qn),jl.intersectSphere(Kd,t)?(Qn.makeScale(...this.radius),t.applyMatrix4(Qn),t):null}getEastNorthUpFrame(e,t,n,i){return n.isMatrix4&&(i=n,n=0,console.warn('Ellipsoid: The signature for "getEastNorthUpFrame" has changed.')),this.getEastNorthUpAxes(e,t,Rg,Eg,Lg),this.getCartographicToPosition(e,t,n,Ka),i.makeBasis(Rg,Eg,Lg).setPosition(Ka)}getOrientedEastNorthUpFrame(e,t,n,i,r,o,a){return this.getObjectFrame(e,t,n,i,r,o,a,0)}getObjectFrame(e,t,n,i,r,o,a,l=2){return this.getEastNorthUpFrame(e,t,n,Qn),Rn.set(r,o,-i,"ZXY"),a.makeRotationFromEuler(Rn).premultiply(Qn),l===1?(Rn.set(Math.PI/2,0,0,"XYZ"),Pr.makeRotationFromEuler(Rn),a.multiply(Pr)):l===2&&(Rn.set(-Math.PI/2,0,Math.PI,"XYZ"),Pr.makeRotationFromEuler(Rn),a.multiply(Pr)),a}getCartographicFromObjectFrame(e,t,n=2){return n===1?(Rn.set(-Math.PI/2,0,0,"XYZ"),Pr.makeRotationFromEuler(Rn).premultiply(e)):n===2?(Rn.set(-Math.PI/2,0,Math.PI,"XYZ"),Pr.makeRotationFromEuler(Rn).premultiply(e)):Pr.copy(e),Ka.setFromMatrixPosition(Pr),this.getPositionToCartographic(Ka,t),this.getEastNorthUpFrame(t.lat,t.lon,0,Qn).invert(),Pr.premultiply(Qn),Rn.setFromRotationMatrix(Pr,"ZXY"),t.azimuth=-Rn.z,t.elevation=Rn.x,t.roll=Rn.y,t}getEastNorthUpAxes(e,t,n,i,r,o=Ka){this.getCartographicToPosition(e,t,0,o),this.getCartographicToNormal(e,t,r),n.set(-o.y,o.x,0).normalize(),i.crossVectors(r,n).normalize()}getCartographicToPosition(e,t,n,i){this.getCartographicToNormal(e,t,ii);let r=this.radius;vn.copy(ii),vn.x*=r.x**2,vn.y*=r.y**2,vn.z*=r.z**2;let o=Math.sqrt(ii.dot(vn));return vn.divideScalar(o),i.copy(vn).addScaledVector(ii,n)}getPositionToCartographic(e,t){this.getPositionToSurfacePoint(e,vn),this.getPositionToNormal(vn,ii);let n=Yd.subVectors(e,vn);return t.lon=Math.atan2(ii.y,ii.x),t.lat=Math.asin(ii.z),t.height=Math.sign(n.dot(e))*n.length(),t}getCartographicToNormal(e,t,n){return Ag.set(1,MC(e),t),n.setFromSpherical(Ag).normalize(),SC(n),n}getPositionToNormal(e,t){let n=this.radius;return t.copy(e),t.x/=n.x**2,t.y/=n.y**2,t.z/=n.z**2,t.normalize(),t}getPositionToSurfacePoint(e,t){let n=this.radius,i=1/n.x**2,r=1/n.y**2,o=1/n.z**2,a=e.x*e.x*i,l=e.y*e.y*r,s=e.z*e.z*o,d=a+l+s,u=Math.sqrt(1/d),c=vn.copy(e).multiplyScalar(u);if(d<PC)return isFinite(u)?t.copy(c):null;let p=Yd.set(c.x*i*2,c.y*r*2,c.z*o*2),g=(1-u)*e.length()/(.5*p.length()),f=0,v,P,y,h,m,S,M,T,E,b,C;do{g-=f,y=1/(1+g*i),h=1/(1+g*r),m=1/(1+g*o),S=y*y,M=h*h,T=m*m,E=S*y,b=M*h,C=T*m,v=a*S+l*M+s*T-1,P=a*E*i+l*b*r+s*C*o;let x=-2*P;f=v/x}while(Math.abs(v)>TC);return t.set(e.x*y,e.y*h,e.z*m)}calculateHorizonDistance(e,t){let n=this.calculateEffectiveRadius(e);return Math.sqrt(2*n*t+t**2)}calculateEffectiveRadius(e){let t=this.radius.x,n=1-this.radius.z**2/t**2,i=e*Hg.DEG2RAD,r=Math.sin(i)**2;return t/Math.sqrt(1-n*r)}getPositionElevation(e){this.getPositionToSurfacePoint(e,vn);let t=Yd.subVectors(e,vn);return Math.sign(t.dot(e))*t.length()}closestPointToRayEstimate(e,t){return this.intersectRay(e,t)?t:(Qn.makeScale(...this.radius).invert(),jl.copy(e).applyMatrix4(Qn),vn.set(0,0,0),jl.closestPointToPoint(vn,t).normalize(),Qn.makeScale(...this.radius),t.applyMatrix4(Qn))}copy(e){return this.radius.copy(e.radius),this}clone(){return new this.constructor().copy(this)}},ts=new du(Uo,Uo,hg);ts.name="WGS84 Earth";var Vl=new Ie,Go=new Ie,Ho=new Ie,Jd=new Ie,Fl=new Wg,Ul=new Ie,Wo=new an,Bg=new an,Og=new Ie,Dg=new an,Qd=new Wg,Zd={};function Ng(e,t,n,i){if(e=e/n*2-1,t=t/n*2-1,i.x=e,i.y=t,i.z=1-Math.abs(e)-Math.abs(t),i.z<0){let r=i.x;i.x=(1-Math.abs(i.y))*(r>=0?1:-1),i.y=(1-Math.abs(r))*(i.y>=0?1:-1)}return i.normalize(),i}var uu=class extends Tg{constructor(e=Xl){super(),this.manager=e,this.adjustmentTransform=new an,this.ellipsoid=ts.clone()}resolveExternalURL(e){return this.manager.resolveURL(super.resolveExternalURL(e))}parse(e){return super.parse(e).then(t=>{let{featureTable:n,batchTable:i}=t,r=t.glbBytes.slice().buffer;return new Promise((o,a)=>{let l=this.fetchOptions,s=this.manager,d=s.getHandler("path.gltf")||new su(s);l.credentials==="include"&&l.mode==="cors"&&d.setCrossOrigin("use-credentials"),"credentials"in l&&d.setWithCredentials(l.credentials==="include"),l.headers&&d.setRequestHeader(l.headers);let u=t.gltfWorkingPath??this.workingPath;/[\\/]$/.test(u)||(u+="/");let c=this.adjustmentTransform;d.parse(r,u,p=>{let g=n.getData("INSTANCES_LENGTH"),f=n.getData("POSITION",g,"FLOAT","VEC3"),v=n.getData("POSITION_QUANTIZED",g,"UNSIGNED_SHORT","VEC3"),P=n.getData("QUANTIZED_VOLUME_OFFSET",1,"FLOAT","VEC3"),y=n.getData("QUANTIZED_VOLUME_SCALE",1,"FLOAT","VEC3"),h=n.getData("NORMAL_UP",g,"FLOAT","VEC3"),m=n.getData("NORMAL_RIGHT",g,"FLOAT","VEC3"),S=n.getData("NORMAL_UP_OCT32P",g,"UNSIGNED_SHORT","VEC2"),M=n.getData("NORMAL_RIGHT_OCT32P",g,"UNSIGNED_SHORT","VEC2"),T=n.getData("SCALE_NON_UNIFORM",g,"FLOAT","VEC3"),E=n.getData("SCALE",g,"FLOAT","SCALAR"),b=n.getData("RTC_CENTER",1,"FLOAT","VEC3"),C=n.getData("EAST_NORTH_UP");if(!f&&v){f=new Float32Array(g*3);for(let A=0;A<g;A++)f[A*3+0]=P[0]+v[A*3+0]/65535*y[0],f[A*3+1]=P[1]+v[A*3+1]/65535*y[1],f[A*3+2]=P[2]+v[A*3+2]/65535*y[2]}let x=new Ie;for(let A=0;A<g;A++)x.x+=f[A*3+0]/g,x.y+=f[A*3+1]/g,x.z+=f[A*3+2]/g;let k=[],I=[];p.scene.updateMatrixWorld(),p.scene.traverse(A=>{if(A.isMesh){I.push(A);let{geometry:z,material:_}=A,V=new pC(z,_,g);V.position.copy(x),b&&(V.position.x+=b[0],V.position.y+=b[1],V.position.z+=b[2]),k.push(V)}});for(let A=0;A<g;A++){Jd.set(f[A*3+0]-x.x,f[A*3+1]-x.y,f[A*3+2]-x.z),Fl.identity(),h&&m?(Go.set(h[A*3+0],h[A*3+1],h[A*3+2]),Ho.set(m[A*3+0],m[A*3+1],m[A*3+2]),Vl.crossVectors(Ho,Go).normalize(),Wo.makeBasis(Ho,Go,Vl),Fl.setFromRotationMatrix(Wo)):S&&M&&(Ng(S[A*2+0],S[A*2+1],65535,Go),Ng(M[A*2+0],M[A*2+1],65535,Ho),Vl.crossVectors(Ho,Go).normalize(),Wo.makeBasis(Ho,Go,Vl),Fl.setFromRotationMatrix(Wo)),Ul.set(1,1,1),T&&Ul.set(T[A*3+0],T[A*3+1],T[A*3+2]),E&&Ul.multiplyScalar(E[A]);for(let z=0,_=k.length;z<_;z++){let V=k[z];Qd.copy(Fl),C&&(V.updateMatrixWorld(),Og.copy(Jd).applyMatrix4(V.matrixWorld),this.ellipsoid.getPositionToCartographic(Og,Zd),this.ellipsoid.getEastNorthUpFrame(Zd.lat,Zd.lon,Dg),Qd.setFromRotationMatrix(Dg)),Wo.compose(Jd,Qd,Ul).multiply(c);let F=I[z];Bg.multiplyMatrices(Wo,F.matrixWorld),V.setMatrixAt(A,Bg)}}p.scene.clear(),p.scene.add(...k),p.batchTable=i,p.featureTable=n,p.scene.batchTable=i,p.scene.featureTable=n,o(p)},a)})})}},Xg=class extends kg{constructor(e=Xl){super(),this.manager=e,this.adjustmentTransform=new an,this.ellipsoid=ts.clone()}parse(e){let t=super.parse(e),{manager:n,ellipsoid:i,adjustmentTransform:r}=this,o=[];for(let a in t.tiles){let{type:l,buffer:s}=t.tiles[a];switch(l){case"b3dm":{let d=s.slice(),u=new lu(n);u.workingPath=this.workingPath,u.fetchOptions=this.fetchOptions,u.adjustmentTransform.copy(r);let c=u.parse(d.buffer);o.push(c);break}case"pnts":{let d=s.slice(),u=new cu(n);u.workingPath=this.workingPath,u.fetchOptions=this.fetchOptions;let c=u.parse(d.buffer);o.push(c);break}case"i3dm":{let d=s.slice(),u=new uu(n);u.workingPath=this.workingPath,u.fetchOptions=this.fetchOptions,u.ellipsoid.copy(i),u.adjustmentTransform.copy(r);let c=u.parse(d.buffer);o.push(c);break}}}return Promise.all(o).then(a=>{let l=new iu;return a.forEach(s=>{l.add(s.scene)}),{tiles:a,scene:l}})}},Ja=new an,kC=class extends iu{constructor(e){super(),this.isTilesGroup=!0,this.name="TilesRenderer.TilesGroup",this.tilesRenderer=e,this.matrixWorldInverse=new an}raycast(e,t){return this.tilesRenderer.raycast(e,t),!1}updateMatrixWorld(e){if(this.matrixAutoUpdate&&this.updateMatrix(),this.matrixWorldNeedsUpdate||e){this.parent===null?Ja.copy(this.matrix):Ja.multiplyMatrices(this.parent.matrixWorld,this.matrix),this.matrixWorldNeedsUpdate=!1;let t=Ja.elements,n=this.matrixWorld.elements,i=!1;for(let r=0;r<16;r++){let o=t[r],a=n[r];if(Math.abs(o-a)>2**-52){i=!0;break}}if(i){this.matrixWorld.copy(Ja),this.matrixWorldInverse.copy(Ja).invert();let r=this.children;for(let s=0,d=r.length;s<d;s++)r[s].updateMatrixWorld();let{tilesRenderer:o}=this,{activeTiles:a,visibleTiles:l}=o;a.forEach(s=>{l.has(s)||s.engineData.scene.updateMatrixWorld(!0)})}}}updateWorldMatrix(e,t){this.parent&&e&&this.parent.updateWorldMatrix(e,!1),this.updateMatrixWorld(!0)}},_C=new ou;function AC(e,t,n,i){let{scene:r}=e.engineData;n.invokeOnePlugin(o=>o.raycastTile&&o.raycastTile(e,r,t,i))||t.intersectObject(r,!0,i)}function RC(e){return"traversal"in e}function qg(e,t,n,i,r=null){if(!RC(t))return;let{group:o,activeTiles:a}=e,{boundingVolume:l}=t.engineData;if(r===null&&(r=_C,r.copy(n.ray).applyMatrix4(o.matrixWorldInverse)),!t.traversal.used||!l.intersectsRay(r))return;a.has(t)&&AC(t,n,e,i);let s=t.children;for(let d=0,u=s.length;d<u;d++)qg(e,s[d],n,i,r)}var Gl=new Ie,Hl=new Ie,En=new Ie,Wl=new ou,nu=class{constructor(e=new Gg,t=new an){this.box=e.clone(),this.transform=t.clone(),this.inverseTransform=new an,this.points=Array(8).fill().map(()=>new Ie),this.planes=[,,,,,,].fill().map(()=>new gC)}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,En).distanceTo(e)}containsPoint(e){return En.copy(e).applyMatrix4(this.inverseTransform),this.box.containsPoint(En)}intersectsRay(e){return Wl.copy(e).applyMatrix4(this.inverseTransform),Wl.intersectsBox(this.box)}intersectRay(e,t){return Wl.copy(e).applyMatrix4(this.inverseTransform),Wl.intersectBox(this.box,t)?(t.applyMatrix4(this.transform),t):null}update(){let{points:e,inverseTransform:t,transform:n,box:i}=this;t.copy(n).invert();let{min:r,max:o}=i,a=0;for(let l=-1;l<=1;l+=2)for(let s=-1;s<=1;s+=2)for(let d=-1;d<=1;d+=2)e[a].set(l<0?r.x:o.x,s<0?r.y:o.y,d<0?r.z:o.z).applyMatrix4(n),a++;this.updatePlanes()}updatePlanes(){Gl.copy(this.box.min).applyMatrix4(this.transform),Hl.copy(this.box.max).applyMatrix4(this.transform),En.set(0,0,1).transformDirection(this.transform),this.planes[0].setFromNormalAndCoplanarPoint(En,Gl),this.planes[1].setFromNormalAndCoplanarPoint(En,Hl).negate(),En.set(0,1,0).transformDirection(this.transform),this.planes[2].setFromNormalAndCoplanarPoint(En,Gl),this.planes[3].setFromNormalAndCoplanarPoint(En,Hl).negate(),En.set(1,0,0).transformDirection(this.transform),this.planes[4].setFromNormalAndCoplanarPoint(En,Gl),this.planes[5].setFromNormalAndCoplanarPoint(En,Hl).negate()}intersectsSphere(e){return this.clampPoint(e.center,En),En.distanceToSquared(e.center)<=e.radius*e.radius}intersectsFrustum(e){return this._intersectsPlaneShape(e.planes,e.points)}intersectsOBB(e){return this._intersectsPlaneShape(e.planes,e.points)}_intersectsPlaneShape(e,t){let n=this.points,i=this.planes;for(let r=0;r<6;r++){let o=e[r],a=-1/0;for(let l=0;l<8;l++){let s=n[l],d=o.distanceToPoint(s);a=a<d?d:a}if(a<0)return!1}for(let r=0;r<6;r++){let o=i[r],a=-1/0;for(let l=0;l<8;l++){let s=t[l],d=o.distanceToPoint(s);a=a<d?d:a}if(a<0)return!1}return!0}},es=Math.PI,eu=es/2,Qa=new Ie,Gi=new Ie,gr=new Ie,ye=new Ie,wn=new an,EC=new Gg,Ig=new an;function oi(e,t){t.radius=Math.max(t.radius,e.distanceToSquared(t.center))}function zg(e){return e.x!==e.y}var Yg=class extends du{constructor(e=1,t=1,n=1,i=-eu,r=eu,o=0,a=2*es,l=0,s=0){super(e,t,n),this.latStart=i,this.latEnd=r,this.lonStart=o,this.lonEnd=a,this.heightStart=l,this.heightEnd=s}getBoundingBox(e,t){zg(this.radius)&&console.warn("EllipsoidRegion: Triaxial ellipsoids are not supported.");let{latStart:n,latEnd:i,lonStart:r,lonEnd:o,heightStart:a,heightEnd:l}=this,s=(n+i)*.5,d=(r+o)*.5,u=n>0,c=i<0,p;p=u?n:c?i:0;let{min:g,max:f}=e;g.setScalar(1/0),f.setScalar(-1/0),o-r<=es?(this.getCartographicToNormal(s,d,gr),Gi.set(0,0,1),Qa.crossVectors(Gi,gr).normalize(),Gi.crossVectors(gr,Qa).normalize(),t.makeBasis(Qa,Gi,gr),wn.copy(t).invert(),this.getCartographicToPosition(p,r,l,ye).applyMatrix4(wn),f.x=Math.abs(ye.x),g.x=-f.x,this.getCartographicToPosition(i,r,l,ye).applyMatrix4(wn),f.y=ye.y,this.getCartographicToPosition(i,d,l,ye).applyMatrix4(wn),f.y=Math.max(ye.y,f.y),this.getCartographicToPosition(n,r,l,ye).applyMatrix4(wn),g.y=ye.y,this.getCartographicToPosition(n,d,l,ye).applyMatrix4(wn),g.y=Math.min(ye.y,g.y),this.getCartographicToPosition(s,d,l,ye).applyMatrix4(wn),f.z=ye.z,this.getCartographicToPosition(n,r,a,ye).applyMatrix4(wn),g.z=ye.z,this.getCartographicToPosition(i,r,a,ye).applyMatrix4(wn),g.z=Math.min(ye.z,g.z)):(this.getCartographicToPosition(p,d,l,gr),gr.z=0,gr.length()<1e-10?gr.set(1,0,0):gr.normalize(),Gi.set(0,0,1),Qa.crossVectors(gr,Gi).normalize(),t.makeBasis(Qa,Gi,gr),wn.copy(t).invert(),this.getCartographicToPosition(p,d+eu,l,ye).applyMatrix4(wn),f.x=Math.abs(ye.x),g.x=-f.x,this.getCartographicToPosition(i,0,c?a:l,ye).applyMatrix4(wn),f.y=ye.y,this.getCartographicToPosition(n,0,u?a:l,ye).applyMatrix4(wn),g.y=ye.y,this.getCartographicToPosition(p,d,l,ye).applyMatrix4(wn),f.z=ye.z,this.getCartographicToPosition(p,o,l,ye).applyMatrix4(wn),g.z=ye.z),e.getCenter(ye),e.min.sub(ye).multiplyScalar(1.0000000000001),e.max.sub(ye).multiplyScalar(1.0000000000001),ye.applyMatrix4(t),t.setPosition(ye)}getBoundingSphere(e){zg(this.radius)&&console.warn("EllipsoidRegion: Triaxial ellipsoids are not supported."),this.getBoundingBox(EC,Ig),e.center.setFromMatrixPosition(Ig),e.radius=0;let{latStart:t,latEnd:n,lonStart:i,lonEnd:r,heightStart:o,heightEnd:a}=this,l=(t+n)*.5,s=(i+r)*.5,d=t>0,u=n<0,c;c=d?t:u?n:0,this.getCartographicToPosition(c,i,a,ye),oi(ye,e),this.getCartographicToPosition(n,i,a,ye),oi(ye,e),this.getCartographicToPosition(n,s,a,ye),oi(ye,e),this.getCartographicToPosition(t,i,a,ye),oi(ye,e),this.getCartographicToPosition(t,s,a,ye),oi(ye,e),this.getCartographicToPosition(l,s,a,ye),oi(ye,e),this.getCartographicToPosition(t,i,o,ye),oi(ye,e),r-i>es&&(this.getCartographicToPosition(c,s+es,a,ye),oi(ye,e)),e.radius=Math.sqrt(e.radius)*1.0000000000001}},Hr=new Ie,Wr=new Ie,$r=new Ie,jg=new Ie,Vg=new Ie,LC=class{constructor(){this.sphere=null,this.obb=null,this.region=null,this.regionObb=null}intersectsRay(e){let t=this.sphere,n=this.obb||this.regionObb;return!(t&&!e.intersectsSphere(t)||n&&!n.intersectsRay(e))}intersectRay(e,t=null){let n=this.sphere,i=this.obb||this.regionObb,r=-1/0,o=-1/0;n&&e.intersectSphere(n,jg)&&(r=n.containsPoint(e.origin)?0:e.origin.distanceToSquared(jg)),i&&i.intersectRay(e,Vg)&&(o=i.containsPoint(e.origin)?0:e.origin.distanceToSquared(Vg));let a=Math.max(r,o);return a===-1/0?null:(e.at(Math.sqrt(a),t),t)}distanceToPoint(e){let t=this.sphere,n=this.obb||this.regionObb,i=-1/0,r=-1/0;return t&&(i=Math.max(t.distanceToPoint(e),0)),n&&(r=n.distanceToPoint(e)),i>r?i:r}intersectsFrustum(e){let t=this.obb||this.regionObb,n=this.sphere;return n&&!e.intersectsSphere(n)||t&&!t.intersectsFrustum(e)?!1:!!(n||t)}intersectsSphere(e){let t=this.obb||this.regionObb,n=this.sphere;return n&&!n.intersectsSphere(e)||t&&!t.intersectsSphere(e)?!1:!!(n||t)}intersectsOBB(e){let t=this.obb||this.regionObb,n=this.sphere;return n&&!e.intersectsSphere(n)||t&&!t.intersectsOBB(e)?!1:!!(n||t)}getOBB(e,t){let n=this.obb||this.regionObb;n?(e.copy(n.box),t.copy(n.transform)):(this.getAABB(e),t.identity())}getAABB(e){if(this.sphere)this.sphere.getBoundingBox(e);else{let t=this.obb||this.regionObb;e.copy(t.box).applyMatrix4(t.transform)}}getSphere(e){if(this.sphere)e.copy(this.sphere);else if(this.region)this.region.getBoundingSphere(e);else{let t=this.obb||this.regionObb;t.box.getBoundingSphere(e),e.applyMatrix4(t.transform)}}setObbData(e,t){let n=new nu;Hr.set(e[3],e[4],e[5]),Wr.set(e[6],e[7],e[8]),$r.set(e[9],e[10],e[11]);let i=Hr.length(),r=Wr.length(),o=$r.length();Hr.normalize(),Wr.normalize(),$r.normalize(),i===0&&Hr.crossVectors(Wr,$r),r===0&&Wr.crossVectors(Hr,$r),o===0&&$r.crossVectors(Hr,Wr),n.transform.set(Hr.x,Wr.x,$r.x,e[0],Hr.y,Wr.y,$r.y,e[1],Hr.z,Wr.z,$r.z,e[2],0,0,0,1).premultiply(t),n.box.min.set(-i,-r,-o),n.box.max.set(i,r,o),n.update(),this.obb=n}setSphereData(e,t,n,i,r){let o=new $g;o.center.set(e,t,n),o.radius=i,o.applyMatrix4(r),this.sphere=o}setRegionData(e,t,n,i,r,o,a){let l=new Yg(...e.radius,n,r,t,i,o,a),s=new nu;l.getBoundingBox(s.box,s.transform),s.update(),this.region=l,this.regionObb=s}},BC=new mC;function OC(e,t,n,i){let r=BC.set(e.normal.x,e.normal.y,e.normal.z,t.normal.x,t.normal.y,t.normal.z,n.normal.x,n.normal.y,n.normal.z);return i.set(-e.constant,-t.constant,-n.constant),i.applyMatrix3(r.invert()),i}var DC=class extends uC{constructor(){super(),this.points=Array(8).fill().map(()=>new Ie)}setFromProjectionMatrix(...e){return super.setFromProjectionMatrix(...e),this.calculateFrustumPoints(),this}calculateFrustumPoints(){let{planes:e,points:t}=this;[[e[0],e[3],e[4]],[e[1],e[3],e[4]],[e[0],e[2],e[4]],[e[1],e[2],e[4]],[e[0],e[3],e[5]],[e[1],e[3],e[5]],[e[0],e[2],e[5]],[e[1],e[2],e[5]]].forEach((n,i)=>{OC(n[0],n[1],n[2],t[i])})}};var ru=0;function Fg(e,t,n,i){try{return yC.getByteLength(e,t,n,i)}catch{return ru}}function NC(e){if(!e)return 0;if(e.isExternalTexture)return e.userData?.byteLength??ru;let{format:t,type:n,image:i,mipmaps:r}=e;if(e.isCompressedTexture&&Array.isArray(r)&&r.length>0){let a=0;for(let l of r)l?.data?.byteLength?a+=l.data.byteLength:a+=Fg(l.width,l.height,t,n);return a}if(!i)return ru;let o=Fg(i.width,i.height,t,n);return o*=e.generateMipmaps?4/3:1,o}function IC(e){let t=new Set,n=0;return e.traverse(i=>{if(i.geometry&&!t.has(i.geometry)&&(n+=vC(i.geometry),t.add(i.geometry)),i.material){let r=i.material;for(let o in r){let a=r[o];a&&a.isTexture&&!t.has(a)&&(n+=NC(a),t.add(a))}}}),n}var Kg=Symbol("INITIAL_FRUSTUM_CULLED"),$l=new an,Za=new Ie,tu=new au,zC=new Ie(1,0,0),jC=new Ie(0,1,0),VC=()=>null;function Ug(e,t){e.traverse(n=>{n.frustumCulled=n[Kg]&&t})}var pu=class extends wg{get autoDisableRendererCulling(){return this._autoDisableRendererCulling}set autoDisableRendererCulling(e){this._autoDisableRendererCulling!==e&&(super._autoDisableRendererCulling=e,this.forEachLoadedModel(t=>{Ug(t,!e)}))}constructor(...e){super(...e),this.accelerateRaycast=!0,this.group=new kC(this),this.ellipsoid=ts.clone(),this.cameras=[],this.cameraMap=new Map,this.cameraInfo=[],this._upRotationMatrix=new an,this._bytesUsed=new WeakMap,this._autoDisableRendererCulling=!0,this.manager=new hC,this._listeners={}}addEventListener(e,t){zl.prototype.addEventListener.call(this,e,t)}hasEventListener(e,t){return zl.prototype.hasEventListener.call(this,e,t)}removeEventListener(e,t){zl.prototype.removeEventListener.call(this,e,t)}dispatchEvent(e){zl.prototype.dispatchEvent.call(this,e)}getBoundingBox(e){if(!this.root)return!1;let t=this.root.engineData.boundingVolume;return t?(t.getAABB(e),!0):!1}getOrientedBoundingBox(e,t){if(!this.root)return!1;let n=this.root.engineData.boundingVolume;return n?(n.getOBB(e,t),!0):!1}getBoundingSphere(e){if(!this.root)return!1;let t=this.root.engineData.boundingVolume;return t?(t.getSphere(e),!0):!1}forEachLoadedModel(e){this.traverse(t=>{let n=t.engineData&&t.engineData.scene;n&&e(n,t)},null,!1)}raycast(e,t){if(this.root)if(this.accelerateRaycast)qg(this,this.root,e,t);else{let n=e.firstHitOnly?[]:t;for(let i of this.activeTiles){let{scene:r}=i.engineData;this.invokeOnePlugin(o=>o.raycastTile&&o.raycastTile(i,r,e,n))||e.intersectObject(r,!0,n)}e.firstHitOnly&&n.length>0&&(n.sort((i,r)=>i.distance-r.distance),t.push(n[0]))}}hasCamera(e){return this.cameraMap.has(e)}setCamera(e){let t=this.cameras,n=this.cameraMap;return n.has(e)?!1:(n.set(e,new au),t.push(e),this.dispatchEvent({type:"add-camera",camera:e}),!0)}setResolution(e,t,n){let i=this.cameraMap;if(!i.has(e))return!1;let r=t.isVector2?t.x:t,o=t.isVector2?t.y:n,a=i.get(e);return(a.width!==r||a.height!==o)&&(a.set(r,o),this.dispatchEvent({type:"camera-resolution-change"})),!0}getResolution(e,t){let n=this.cameraMap.get(e);return n?t.copy(n):null}setResolutionFromRenderer(e,t){return t.getSize(tu),this.setResolution(e,tu.x,tu.y)}deleteCamera(e){let t=this.cameras,n=this.cameraMap;if(n.has(e)){let i=t.indexOf(e);return t.splice(i,1),n.delete(e),this.dispatchEvent({type:"delete-camera",camera:e}),!0}return!1}loadRootTileset(...e){return super.loadRootTileset(...e).then(t=>{let{asset:n,extensions:i={}}=t;switch((n&&n.gltfUpAxis||"y").toLowerCase()){case"x":this._upRotationMatrix.makeRotationAxis(jC,-Math.PI/2);break;case"y":this._upRotationMatrix.makeRotationAxis(zC,Math.PI/2);break}if("3DTILES_ellipsoid"in i){let r=i["3DTILES_ellipsoid"],{ellipsoid:o}=this;o.name=r.body,r.radii?o.radius.set(...r.radii):o.radius.set(1,1,1)}return t})}prepareForTraversal(){let e=this.group,t=this.cameras,n=this.cameraMap,i=this.cameraInfo;for(;i.length>t.length;)i.pop();for(;i.length<t.length;)i.push({frustum:new DC,isOrthographic:!1,sseDenominator:-1,position:new Ie,invScale:-1,pixelSize:0});Za.setFromMatrixScale(e.matrixWorldInverse),Math.abs(Math.max(Za.x-Za.y,Za.x-Za.z))>1e-6&&console.warn("ThreeTilesRenderer : Non uniform scale used for tile which may cause issues when calculating screen space error.");for(let r=0,o=i.length;r<o;r++){let a=t[r],l=i[r],s=l.frustum,d=l.position,u=n.get(a);(u.width===0||u.height===0)&&console.warn("TilesRenderer: resolution for camera error calculation is not set.");let c=a.projectionMatrix.elements;if(l.isOrthographic=c[15]===1,l.isOrthographic){let p=2/c[0],g=2/c[5];l.pixelSize=Math.max(g/u.height,p/u.width)}else l.sseDenominator=2/c[5]/u.height;$l.copy(e.matrixWorld),$l.premultiply(a.matrixWorldInverse),$l.premultiply(a.projectionMatrix),s.setFromProjectionMatrix($l,a.coordinateSystem,a.reversedDepth),d.set(0,0,0),d.applyMatrix4(a.matrixWorld),d.applyMatrix4(e.matrixWorldInverse)}}update(){if(super.update(),this.cameras.length===0&&this.root){let e=!1;this.invokeAllPlugins(t=>e||(e=!!(t!==this&&t.calculateTileViewError))),e===!1&&console.warn("TilesRenderer: no cameras defined. Cannot update 3d tiles.")}}preprocessNode(e,t,n=null){super.preprocessNode(e,t,n);let i=new an;if(e.transform){let a=e.transform;for(let l=0;l<16;l++)i.elements[l]=a[l]}n&&i.premultiply(n.engineData.transform);let r=new an().copy(i).invert(),o=new LC;"sphere"in e.boundingVolume&&o.setSphereData(...e.boundingVolume.sphere,i),"box"in e.boundingVolume&&o.setObbData(e.boundingVolume.box,i),"region"in e.boundingVolume&&o.setRegionData(this.ellipsoid,...e.boundingVolume.region),e.engineData.transform=i,e.engineData.transformInverse=r,e.engineData.boundingVolume=o,e.engineData.geometry=null,e.engineData.materials=null,e.engineData.textures=null,e.toJSON=VC}async parseTile(e,t,n,i,r){let o=t.engineData,a=Nl(i),l=this.fetchOptions,s=this.manager,d=null,u=o.transform,c=this._upRotationMatrix,p=(Fi(e)||n).toLowerCase();switch(p){case"b3dm":{let m=new lu(s);m.workingPath=a,m.fetchOptions=l,m.adjustmentTransform.copy(c),d=m.parse(e);break}case"pnts":{let m=new cu(s);m.workingPath=a,m.fetchOptions=l,d=m.parse(e);break}case"i3dm":{let m=new uu(s);m.workingPath=a,m.fetchOptions=l,m.adjustmentTransform.copy(c),m.ellipsoid.copy(this.ellipsoid),d=m.parse(e);break}case"cmpt":{let m=new Xg(s);m.workingPath=a,m.fetchOptions=l,m.adjustmentTransform.copy(c),m.ellipsoid.copy(this.ellipsoid),d=m.parse(e).then(S=>S.scene);break}case"gltf":case"glb":{let m=s.getHandler("path.gltf")||s.getHandler("path.glb")||new su(s);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||a;!/[\\/]$/.test(S)&&S.length&&(S+="/"),d=m.parseAsync(e,S).then(M=>{M.scene=M.scene||new iu;let{scene:T}=M;return T.updateMatrix(),T.matrix.multiply(c).decompose(T.position,T.quaternion,T.scale),M});break}default:d=this.invokeOnePlugin(m=>m.parseToMesh&&m.parseToMesh(e,t,n,i,r));break}let g=await d;if(g===null)throw Error(`TilesRenderer: Content type "${p}" not supported.`);let f,v;g.isObject3D?(f=g,v=null):(f=g.scene,v=g),f.updateMatrix(),f.matrix.premultiply(u),f.matrix.decompose(f.position,f.quaternion,f.scale),await this.invokeAllPlugins(m=>m.processTileModel&&m.processTileModel(f,t)),f.traverse(m=>{m[Kg]=m.frustumCulled,m.userData.tile=t}),Ug(f,!this.autoDisableRendererCulling);let P=[],y=[],h=[];if(f.traverse(m=>{if(m.geometry&&y.push(m.geometry),m.material){let S=m.material;P.push(m.material);for(let M in S){let T=S[M];T&&T.isTexture&&h.push(T)}}}),r.aborted){for(let m=0,S=h.length;m<S;m++){let M=h[m];M.image instanceof ImageBitmap&&M.image.close(),M.dispose()}return}o.materials=P,o.geometry=y,o.textures=h,o.scene=f,o.metadata=v}disposeTile(e){super.disposeTile(e);let t=e.engineData;if(t.scene){let n=t.materials,i=t.geometry,r=t.textures,o=t.scene.parent;t.scene.traverse(a=>{a.userData.meshFeatures&&a.userData.meshFeatures.dispose(),a.userData.structuralMetadata&&a.userData.structuralMetadata.dispose()});for(let a=0,l=i.length;a<l;a++)i[a].dispose();for(let a=0,l=n.length;a<l;a++)n[a].dispose();for(let a=0,l=r.length;a<l;a++){let s=r[a];s.image instanceof ImageBitmap&&s.image.close(),s.dispose()}o&&o.remove(t.scene),t.scene=null,t.materials=null,t.textures=null,t.geometry=null,t.metadata=null}}setTileActive(e,t){super.setTileActive(e,t);let n=e.engineData.scene;n&&(t?(n.parent=this.group,n.updateMatrixWorld(!0)):n.parent=null)}setTileVisible(e,t){let n=e.engineData.scene,{activeTiles:i,group:r}=this;n&&(t?r.add(n):(r.remove(n),i.has(e)&&(n.parent=r))),super.setTileVisible(e,t)}calculateBytesUsed(e,t){let n=this._bytesUsed;return!n.has(e)&&t&&n.set(e,IC(t)),n.get(e)??null}calculateTileViewError(e,t){let n=e.engineData,i=this.cameras,r=this.cameraInfo,o=n.boundingVolume,a=!1,l=0,s=1/0,d=0,u=1/0;for(let c=0,p=i.length;c<p;c++){let g=r[c],f,v;if(g.isOrthographic){let y=g.pixelSize;f=e.geometricError/y,v=1/0}else{let y=g.sseDenominator;v=o.distanceToPoint(g.position),f=v===0?1/0:e.geometricError/(v*y)}let P=r[c].frustum;o.intersectsFrustum(P)&&(a=!0,l=Math.max(l,f),s=Math.min(s,v)),d=Math.max(d,f),u=Math.min(u,v)}a?(t.inView=!0,t.error=l,t.distanceFromCamera=s):(t.inView=!1,t.error=d,t.distanceFromCamera=u)}dispose(){super.dispose(),this.group.removeFromParent()}};import{BatchedMesh as XE,Box2 as FC,Box3 as qE,Box3Helper as YE,BoxGeometry as KE,BufferAttribute as gu,BufferGeometry as JE,CanvasTexture as QE,Color as ZE,CustomBlending as UC,DataTexture as GC,DefaultLoadingManager as eL,DoubleSide as tL,EventDispatcher as nL,FileLoader as HC,FloatType as rL,Frustum as iL,GreaterDepth as oL,Group as aL,LineBasicMaterial as sL,LineSegments as lL,LinearFilter as WC,LinearMipMapLinearFilter as cL,MathUtils as fu,Matrix2 as $C,Matrix3 as XC,Matrix4 as qC,Mesh as dL,MeshBasicMaterial as YC,MeshLambertMaterial as uL,MeshStandardMaterial as pL,OneFactor as KC,PlaneGeometry as hL,Points as mL,PointsMaterial as gL,Quaternion as fL,REVISION as bL,RGFormat as xL,Ray as yL,Raycaster as vL,RedFormat as wL,SRGBColorSpace as CL,ShaderMaterial as JC,Source as SL,Sphere as ML,SphereGeometry as TL,Texture as PL,TextureUtils as kL,Triangle as _L,UnsignedByteType as AL,Vector2 as fr,Vector3 as hf,Vector4 as QC,WebGLArrayRenderTarget as RL,WebGLRenderTarget as Jg,WebGLRenderer as ZC,ZeroFactor as eS}from"three";import{GLTFLoader as tS}from"three/addons/loaders/GLTFLoader.js";import{FullScreenQuad as mf}from"three/addons/postprocessing/Pass.js";var BL=Object.freeze({fill:"#cccccc",stroke:"transparent",strokeWidth:1,radius:2,order:0,visible:!0});var Qg=new Fo;Qg.maxJobs=10,Qg.priorityCallback=(e,t)=>{let n=e.tile,i=t.tile,r=n.internal.renderer,o=i.internal.renderer,a=r.visibleTiles.has(n);return a===o.visibleTiles.has(i)?Xa(n,i):a?1:-1};var Zg=new hf;function ns(e,t){if(e.isInterleavedBufferAttribute||e.array instanceof t)return e;let n=t===Int8Array||t===Int16Array||t===Int32Array?-1:0,i=new gu(new t(e.count*e.itemSize),e.itemSize,!0),r=e.itemSize,o=e.count;for(let a=0;a<o;a++)for(let l=0;l<r;l++){let s=fu.clamp(e.getComponent(a,l),n,1);i.setComponent(a,l,s)}return i}function nS(e,t=Int16Array){let n=e.geometry,i=n.attributes,r=i.position;if(r.isInterleavedBufferAttribute||r.array instanceof t)return r;let o=new gu(new t(r.count*r.itemSize),r.itemSize,!1),a=r.itemSize,l=r.count;n.computeBoundingBox();let s=n.boundingBox,{min:d,max:u}=s,c=2**(8*t.BYTES_PER_ELEMENT-1)-1,p=-c;for(let g=0;g<l;g++)for(let f=0;f<a;f++){let v=f===0?"x":f===1?"y":"z",P=d[v],y=u[v],h=fu.mapLinear(r.getComponent(g,f),P,y,p,c);o.setComponent(g,f,h)}s.getCenter(Zg).multiply(e.scale).applyQuaternion(e.quaternion),e.position.add(Zg),e.scale.x*=.5*(u.x-d.x)/c,e.scale.y*=.5*(u.y-d.y)/c,e.scale.z*=.5*(u.z-d.z)/c,i.position=o,e.geometry.boundingBox=null,e.geometry.boundingSphere=null,e.updateMatrixWorld()}var bu=class{constructor(e){this._options={generateNormals:!1,disableMipmaps:!0,compressIndex:!0,compressNormals:!1,compressUvs:!1,compressPosition:!1,uvType:Int8Array,normalType:Int8Array,positionType:Int16Array,...e},this.name="TILES_COMPRESSION_PLUGIN",this.priority=-100}processTileModel(e,t){let{generateNormals:n,disableMipmaps:i,compressIndex:r,compressUvs:o,compressNormals:a,compressPosition:l,uvType:s,normalType:d,positionType:u}=this._options;e.traverse(c=>{if(c.material&&i){let p=c.material;for(let g in p){let f=p[g];f&&f.isTexture&&f.generateMipmaps&&(f.generateMipmaps=!1,f.minFilter=WC)}}if(c.geometry){let p=c.geometry,g=p.attributes;if(o){let{uv:f,uv1:v,uv2:P,uv3:y}=g;f&&(g.uv=ns(f,s)),v&&(g.uv1=ns(v,s)),P&&(g.uv2=ns(P,s)),y&&(g.uv3=ns(y,s))}if(n&&!g.normals&&p.computeVertexNormals(),a&&g.normals&&(g.normals=ns(g.normals,d)),l&&nS(c,u),r&&p.index){let f=g.position.count,v=p.index,P=f>65535?Uint32Array:f>255?Uint16Array:Uint8Array;if(!(v.array instanceof P)){let y=new P(p.index.count);y.set(v.array);let h=new gu(y,1);p.setIndex(h)}}}})}};function sn(e,t,n){return e&&t in e?e[t]:n}function gf(e){return e!=="BOOLEAN"&&e!=="STRING"&&e!=="ENUM"}function rS(e){return/^FLOAT/.test(e)}function as(e){return/^VEC/.test(e)}function ss(e){return/^MAT/.test(e)}function ff(e,t,n,i=null){return ss(n)||as(n)?i.fromArray(e,t):e[t]}function hu(e){let{type:t,componentType:n}=e;switch(t){case"SCALAR":return n==="INT64"?0n:0;case"VEC2":return new fr;case"VEC3":return new hf;case"VEC4":return new QC;case"MAT2":return new $C;case"MAT3":return new XC;case"MAT4":return new qC;case"BOOLEAN":return!1;case"STRING":return"";case"ENUM":return 0}}function ef(e,t){if(t==null)return!1;switch(e){case"SCALAR":return typeof t=="number"||typeof t=="bigint";case"VEC2":return t.isVector2;case"VEC3":return t.isVector3;case"VEC4":return t.isVector4;case"MAT2":return t.isMatrix2;case"MAT3":return t.isMatrix3;case"MAT4":return t.isMatrix4;case"BOOLEAN":return typeof t=="boolean";case"STRING":return typeof t=="string";case"ENUM":return typeof t=="number"||typeof t=="bigint"}throw Error("ClassProperty: invalid type.")}function os(e,t=null){switch(e){case"INT8":return Int8Array;case"INT16":return Int16Array;case"INT32":return Int32Array;case"INT64":return BigInt64Array;case"UINT8":return Uint8Array;case"UINT16":return Uint16Array;case"UINT32":return Uint32Array;case"UINT64":return BigUint64Array;case"FLOAT32":return Float32Array;case"FLOAT64":return Float64Array}switch(t){case"BOOLEAN":return Uint8Array;case"STRING":return Uint8Array}throw Error("ClassProperty: invalid type.")}function iS(e,t=null){if(e.array){t=t&&Array.isArray(t)?t:[],t.length=e.count;for(let n=0,i=t.length;n<i;n++)t[n]=ql(e,t[n])}else t=ql(e,t);return t}function ql(e,t=null){let n=e.default,i=e.type;if(t||(t=hu(e)),n===null){switch(i){case"SCALAR":return 0;case"VEC2":return t.set(0,0);case"VEC3":return t.set(0,0,0);case"VEC4":return t.set(0,0,0,0);case"MAT2":return t.identity();case"MAT3":return t.identity();case"MAT4":return t.identity();case"BOOLEAN":return!1;case"STRING":return"";case"ENUM":return""}throw Error("ClassProperty: invalid type.")}else if(ss(i))t.fromArray(n);else if(as(i))t.fromArray(n);else return n}function oS(e,t){if(e.noData===null)return t;let n=e.noData,i=e.type;if(Array.isArray(t))for(let a=0,l=t.length;a<l;a++)t[a]=r(t[a]);else t=r(t);return t;function r(a){return o(a)&&(a=ql(e,a)),a}function o(a){if(ss(i)){let l=a.elements;for(let s=0,d=n.length;s<d;s++)if(n[s]!==l[s])return!1;return!0}else if(as(i)){for(let l=0,s=n.length;l<s;l++)if(n[l]!==a.getComponent(l))return!1;return!0}else return n===a}}function aS(e,t){switch(e){case"INT8":return Math.max(t/127,-1);case"INT16":return Math.max(t,32767,-1);case"INT32":return Math.max(t/2147483647,-1);case"INT64":return Math.max(Number(t)/9223372036854776e3,-1);case"UINT8":return t/255;case"UINT16":return t/65535;case"UINT32":return t/4294967295;case"UINT64":return Number(t)/18446744073709552e3}}function sS(e,t){let{type:n,componentType:i,scale:r,offset:o,normalized:a}=e;if(Array.isArray(t))for(let c=0,p=t.length;c<p;c++)t[c]=l(t[c]);else t=l(t);return t;function l(c){return c=ss(n)?d(c):as(n)?s(c):u(c),c}function s(c){return c.x=u(c.x),c.y=u(c.y),"z"in c&&(c.z=u(c.z)),"w"in c&&(c.w=u(c.w)),c}function d(c){let p=c.elements;for(let g=0,f=p.length;g<f;g++)p[g]=u(p[g]);return c}function u(c){return a&&(c=aS(i,c)),(a||rS(i))&&(c=c*r+o),c}}function xu(e,t,n=null){if(e.array){Array.isArray(t)||(t=Array(e.count||0)),t.length=n===null?e.count:n;for(let i=0,r=t.length;i<r;i++)ef(e.type,t[i])||(t[i]=hu(e))}else ef(e.type,t)||(t=hu(e));return t}function Yl(e,t){for(let n in t)n in e||delete t[n];for(let n in e){let i=e[n];t[n]=xu(i,t[n])}}function lS(e){switch(e){case"ENUM":return 1;case"SCALAR":return 1;case"VEC2":return 2;case"VEC3":return 3;case"VEC4":return 4;case"MAT2":return 4;case"MAT3":return 9;case"MAT4":return 16;case"BOOLEAN":return-1;case"STRING":return-1;default:return-1}}var Jl=class{constructor(e,t,n=null){this.name=t.name||null,this.description=t.description||null,this.type=t.type,this.componentType=t.componentType||null,this.enumType=t.enumType||null,this.array=t.array||!1,this.count=t.count||0,this.normalized=t.normalized||!1,this.offset=t.offset||0,this.scale=sn(t,"scale",1),this.max=sn(t,"max",1/0),this.min=sn(t,"min",-1/0),this.required=t.required||!1,this.noData=sn(t,"noData",null),this.default=sn(t,"default",null),this.semantic=sn(t,"semantic",null),this.enumSet=null,this.accessorProperty=n,n&&(this.offset=sn(n,"offset",this.offset),this.scale=sn(n,"scale",this.scale),this.max=sn(n,"max",this.max),this.min=sn(n,"min",this.min)),t.type==="ENUM"&&(this.enumSet=e[this.enumType],this.componentType===null&&(this.componentType=sn(this.enumSet,"valueType","UINT16")))}shapeToProperty(e,t=null){return xu(this,e,t)}resolveDefaultElement(e){return ql(this,e)}resolveDefault(e){return iS(this,e)}resolveNoData(e){return oS(this,e)}resolveEnumsToStrings(e){let t=this.enumSet;if(this.type==="ENUM")if(Array.isArray(e))for(let i=0,r=e.length;i<r;i++)e[i]=n(e[i]);else e=n(e);return e;function n(i){let r=t.values.find(o=>o.value===i);return r===null?"":r.name}}adjustValueScaleOffset(e){return gf(this.type)?sS(this,e):e}},yu=class{constructor(e,t={},n={},i=null){this.definition=e,this.class=t[e.class],this.className=e.class,this.enums=n,this.data=i,this.name="name"in e?e.name:null,this.properties=null}getPropertyNames(){return Object.keys(this.class.properties)}includesData(e){return!!this.definition.properties[e]}dispose(){}_initProperties(e=Jl){let t={};for(let n in this.class.properties)t[n]=new e(this.enums,this.class.properties[n],this.definition.properties[n]);this.properties=t}},cS=class extends Jl{constructor(e,t,n=null){super(e,t,n),this.attribute=n?.attribute??null}},dS=class extends yu{constructor(...e){super(...e),this.isPropertyAttributeAccessor=!0,this._initProperties(cS)}getData(e,t,n={}){let i=this.properties;Yl(i,n);for(let r in i)n[r]=this.getPropertyValue(r,e,t,n[r]);return n}getPropertyValue(e,t,n,i=null){if(t>=this.count)throw Error("PropertyAttributeAccessor: Requested index is outside the range of the buffer.");let r=this.properties[e],o=r.type;if(!r)throw Error("PropertyAttributeAccessor: Requested class property does not exist.");if(!this.definition.properties[e])return r.resolveDefault(i);i=r.shapeToProperty(i);let a=n.getAttribute(r.attribute.toLowerCase());if(ss(o)){let l=i.elements;for(let s=l.length;0<s;)l[0]=a.getComponent(t,0)}else if(as(o))i.fromBufferAttribute(a,t);else if(o==="SCALAR"||o==="ENUM")i=a.getX(t);else throw Error("StructuredMetadata.PropertyAttributeAccessor: BOOLEAN and STRING types are not supported by property attributes.");return i=r.adjustValueScaleOffset(i),i=r.resolveEnumsToStrings(i),i=r.resolveNoData(i),i}},uS=class extends Jl{constructor(e,t,n=null){super(e,t,n),this.values=n?.values??null,this.valueLength=lS(this.type),this.arrayOffsets=sn(n,"arrayOffsets",null),this.stringOffsets=sn(n,"stringOffsets",null),this.arrayOffsetType=sn(n,"arrayOffsetType","UINT32"),this.stringOffsetType=sn(n,"stringOffsetType","UINT32")}getArrayLengthFromId(e,t){let n=this.count;if(this.arrayOffsets!==null){let{arrayOffsets:i,arrayOffsetType:r}=this,o=new(os(r))(e[i]);n=o[t+1]-o[t]}return n}getIndexOffsetFromId(e,t){let n=t;if(this.arrayOffsets){let{arrayOffsets:i,arrayOffsetType:r}=this;n=new(os(r))(e[i])[n]}else this.array&&(n*=this.count);return n}},pS=class extends yu{constructor(...e){super(...e),this.isPropertyTableAccessor=!0,this.count=this.definition.count,this._initProperties(uS)}getData(e,t={}){let n=this.properties;Yl(n,t);for(let i in n)t[i]=this.getPropertyValue(i,e,t[i]);return t}_readValueAtIndex(e,t,n,i=null){let r=this.properties[e],{componentType:o,type:a}=r,l=this.data,s=l[r.values],d=new(os(o,a))(s),u=r.getIndexOffsetFromId(l,t);if(gf(a)||a==="ENUM")return ff(d,(u+n)*r.valueLength,a,i);if(a==="STRING"){let c=u+n,p=0;if(r.stringOffsets!==null){let{stringOffsets:f,stringOffsetType:v}=r,P=new(os(v))(l[f]);p=P[c+1]-P[c],c=P[c]}let g=new Uint8Array(d.buffer,c,p);i=new TextDecoder().decode(g)}else if(a==="BOOLEAN"){let c=u+n,p=Math.floor(c/8),g=c%8;i=(d[p]>>g&1)==1}return i}getPropertyValue(e,t,n=null){if(t>=this.count)throw Error("PropertyTableAccessor: Requested index is outside the range of the table.");let i=this.properties[e];if(!i)throw Error("PropertyTableAccessor: Requested property does not exist.");if(!this.definition.properties[e])return i.resolveDefault(n);let r=i.array,o=this.data,a=i.getArrayLengthFromId(o,t);if(n=i.shapeToProperty(n,a),r)for(let l=0,s=n.length;l<s;l++)n[l]=this._readValueAtIndex(e,t,l,n[l]);else n=this._readValueAtIndex(e,t,0,n);return n=i.adjustValueScaleOffset(n),n=i.resolveEnumsToStrings(n),n=i.resolveNoData(n),n}},rs=new FC,tf=class{constructor(){this._renderer=new ZC,this._target=new Jg(1,1),this._texTarget=new Jg,this._quad=new mf(new JC({blending:UC,blendDst:eS,blendSrc:KC,uniforms:{map:{value:null},pixel:{value:new fr}},vertexShader:`
|
|
9
|
+
`,Cd=class extends yv{constructor(t=1){super("ExposureEffect",wv,{blendFunction:xv.NORMAL,uniforms:new Map([["exposure",new vv(t)]])})}set exposure(t){this.uniforms.get("exposure").value=t}},um=gv(function({exposure:t},n){let i=bv(()=>new Cd(t),[]);return i.exposure=t,fv(n,()=>i,[i]),Cv("primitive",{object:i,dispose:null})});import{useFrame as Sv,useThree as tl}from"@react-three/fiber";import*as gm from"@react-three/postprocessing";import{BlendFunction as Mv}from"postprocessing";import{Color as Tv,MathUtils as Pv,Mesh as kv,Vector2 as pm,Vector3 as hm}from"three";import{useEffect as mm,useMemo as nl,useRef as Sd}from"react";import{jsx as Av}from"react/jsx-runtime";var _v=gm.LensFlareEffect;function fm({config:e}){let t=tl(p=>p.camera),n=tl(p=>p.raycaster),i=tl(p=>p.scene),r=tl(p=>p.viewport),o=Sd(null),a=Sd(new hm),s=Sd(new pm),c=nl(()=>new hm(...e.lensPosition),[e.lensPosition]),l=nl(()=>new Tv(e.colorGain??"#141414"),[e.colorGain]),u=nl(()=>new pm(0,0),[]),d=nl(()=>new _v({blendFunction:Mv.NORMAL,enabled:!0,glareSize:e.glareSize,lensPosition:c,screenRes:u,starPoints:6,flareSize:e.flareSize,flareSpeed:e.flareSpeed,flareShape:e.flareShape,animated:e.animated,anamorphic:e.anamorphic,colorGain:l,lensDirtTexture:null,haloScale:e.haloScale,secondaryGhosts:e.secondaryGhosts,aditionalStreaks:e.aditionalStreaks,ghostScale:e.ghostScale,opacity:e.opacity,starBurst:e.starBurst}),[l,e.aditionalStreaks,e.anamorphic,e.animated,e.flareShape,e.flareSize,e.flareSpeed,e.glareSize,e.haloScale,e.ghostScale,e.opacity,e.secondaryGhosts,e.starBurst,c,u]);return mm(()=>(o.current=d,()=>{d.dispose(),o.current=null}),[d]),mm(()=>{let p=d.uniforms.get("screenRes");p&&(p.value.x=r.width,p.value.y=r.height)},[d,r]),Sv((p,g)=>{let f=o.current;if(!f)return;let v=f.uniforms.get("lensPosition"),P=f.uniforms.get("opacity");if(!v||!P)return;let y=1;if(a.current.copy(c).project(t),a.current.z>1)return;v.value.x=a.current.x,v.value.y=a.current.y,s.current.x=a.current.x,s.current.y=a.current.y,n.setFromCamera(s.current,t);let h=n.intersectObjects(i.children,!0),{object:m}=h[0]||{};m&&(m.userData?.lensflare==="no-occlusion"?y=0:m instanceof kv&&(m.material.uniforms?._transmission?.value>.2||m.material._transmission&&m.material._transmission>.2?y=.2:m.material.transparent&&(y=m.material.opacity))),P.value=Pv.damp(P.value,y,12,g)}),Av("primitive",{object:d,dispose:null})}import{RampType as Md}from"@react-three/postprocessing";import{GlitchMode as Td,KernelSize as Do,ToneMappingMode as Pd}from"postprocessing";import{Color as Rv}from"three";function bm(e){return e==="linear"?Pd.LINEAR:e==="reinhard"?Pd.REINHARD:Pd.ACES_FILMIC}function rl(e){switch(e){case"verySmall":return Do.VERY_SMALL;case"small":return Do.SMALL;case"medium":return Do.MEDIUM;case"large":return Do.LARGE;case"veryLarge":return Do.VERY_LARGE;case"huge":return Do.HUGE}}function xm(e){switch(e){case"constantMild":return Td.CONSTANT_MILD;case"constantWild":return Td.CONSTANT_WILD;default:return Td.SPORADIC}}function kd(e){let t=new Rv(e);return[t.r,t.g,t.b,1]}function ym(e){return e==="radial"?Md.Radial:e==="mirroredLinear"?Md.MirroredLinear:Md.Linear}import{Fragment as s1,jsx as ht,jsxs as _d}from"react/jsx-runtime";var zi={edgeStrength:1,pulseSpeed:0,visibleEdgeColor:new ol(jr.color).getHex(),hiddenEdgeColor:new ol(jr.color).multiplyScalar(.35).getHex(),kernelSize:e1.VERY_SMALL,blur:!1,xRay:!1};function r1(e){let t=[];return e.traverse(n=>{n.isMesh&&t.push(n)}),t}var Ad=[],i1=t1(function({sceneConfig:t,selectedObjectRef:n,highlightOnHover:i=!1,disabled:r=!1,onOutlineEffect:o}){let a=il(M=>M.scene),s=il(M=>M.gl),c=wm(null),l=t?.postProcessing,u=n??null,d=l?.outline.enabled===!0,p=d||i,[g,f]=Cm(()=>s.xr?.isPresenting??!1);vm(()=>{let M=s.xr;if(!M)return;let T=()=>f(!0),E=()=>f(!1);return M.addEventListener("sessionstart",T),M.addEventListener("sessionend",E),f(M.isPresenting),()=>{M.removeEventListener("sessionstart",T),M.removeEventListener("sessionend",E)}},[s]);let v=a.children.filter(M=>M.isLight),P=Fa(()=>new Va(l?.chromaticAberration.offsetX??.002,l?.chromaticAberration.offsetY??.002),[l?.chromaticAberration.offsetX,l?.chromaticAberration.offsetY]),y=Fa(()=>new ol(l?.outline.visibleEdgeColor??"#ffffff").getHex(),[l?.outline.visibleEdgeColor]),h=Fa(()=>new ol(l?.outline.hiddenEdgeColor??"#22090a").getHex(),[l?.outline.hiddenEdgeColor]),m=Fa(()=>kd(l?.ramp.startColor??"#000000"),[l?.ramp.startColor]),S=Fa(()=>kd(l?.ramp.endColor??"#ffffff"),[l?.ramp.endColor]);return!l||g||r?null:_d(s1,{children:[l.godRays.enabled===!0&&_d("mesh",{ref:c,position:l.godRays.sunPosition,visible:!1,frustumCulled:!1,children:[ht("sphereGeometry",{args:[.1,8,8]}),ht("meshBasicMaterial",{transparent:!0,opacity:0,depthWrite:!1})]}),_d(zv,{multisampling:0,enableNormalPass:l.ssao.enabled===!0,autoClear:!1,children:[l.smaa.enabled===!0&&ht(Kv,{}),l.ssao.enabled===!0&&ht(Jv,{samples:l.ssao.samples,rings:l.ssao.rings,intensity:l.ssao.intensity,radius:l.ssao.radius,bias:l.ssao.bias,luminanceInfluence:l.ssao.luminanceInfluence,fade:l.ssao.fade,minRadiusScale:l.ssao.minRadiusScale,worldDistanceThreshold:l.ssao.worldDistanceThreshold,worldDistanceFalloff:l.ssao.worldDistanceFalloff,worldProximityThreshold:l.ssao.worldProximityThreshold,worldProximityFalloff:l.ssao.worldProximityFalloff}),l.autofocus.enabled===!0&&ht(Ev,{focusDistance:l.autofocus.focusDistance,focusRange:l.autofocus.focusRange,focalLength:l.autofocus.focalLength,bokehScale:l.autofocus.bokehScale,target:l.autofocus.target,mouse:l.autofocus.mouse,debug:l.autofocus.debug||void 0,manual:l.autofocus.manual,smoothTime:l.autofocus.smoothTime}),l.autofocus.enabled!==!0&&l.depthOfField.enabled===!0&&ht(Nv,{focusDistance:l.depthOfField.focusDistance,focusRange:l.depthOfField.focusRange,focalLength:l.depthOfField.focalLength,bokehScale:l.depthOfField.bokehScale}),l.bloom.enabled===!0&&ht(Lv,{intensity:l.bloom.intensity,luminanceThreshold:l.bloom.luminanceThreshold,luminanceSmoothing:l.bloom.luminanceSmoothing,mipmapBlur:l.bloom.mipmapBlur,radius:l.bloom.radius,levels:l.bloom.levels}),l.selectiveBloom.enabled===!0&&ht(qv,{selection:u??void 0,lights:v,selectionLayer:l.selectiveBloom.selectionLayer,intensity:l.selectiveBloom.intensity,luminanceThreshold:l.selectiveBloom.luminanceThreshold,luminanceSmoothing:l.selectiveBloom.luminanceSmoothing,kernelSize:rl(l.selectiveBloom.kernelSize),mipmapBlur:l.selectiveBloom.mipmapBlur,inverted:l.selectiveBloom.inverted,ignoreBackground:l.selectiveBloom.ignoreBackground}),p&&ht(Hv,{ref:o,selection:Ad,selectionLayer:l.outline.selectionLayer,blendFunction:ja.SCREEN,edgeStrength:d?l.outline.edgeStrength:zi.edgeStrength,pulseSpeed:d?l.outline.pulseSpeed:zi.pulseSpeed,visibleEdgeColor:d?y:zi.visibleEdgeColor,hiddenEdgeColor:d?h:zi.hiddenEdgeColor,kernelSize:d?rl(l.outline.kernelSize):zi.kernelSize,blur:d?l.outline.blur:zi.blur,xRay:d?l.outline.xRay:zi.xRay}),l.chromaticAberration.enabled===!0&&ht(Ov,{offset:P,radialModulation:l.chromaticAberration.radialModulation,modulationOffset:l.chromaticAberration.modulationOffset}),l.colorAverage.enabled===!0&&ht(Dv,{}),l.dotScreen.enabled===!0&&ht(Iv,{angle:l.dotScreen.angle,scale:l.dotScreen.scale}),l.glitch.enabled===!0&&ht(jv,{mode:xm(l.glitch.mode),delay:new Va(l.glitch.delay[0],l.glitch.delay[1]),duration:new Va(l.glitch.duration[0],l.glitch.duration[1]),strength:new Va(l.glitch.strength[0],l.glitch.strength[1]),chromaticAberrationOffset:new Va(l.glitch.chromaticAberrationOffset[0],l.glitch.chromaticAberrationOffset[1]),columns:l.glitch.columns,ratio:l.glitch.ratio,active:!0}),l.grid.enabled===!0&&ht(Fv,{scale:l.grid.scale,lineWidth:l.grid.lineWidth}),l.lensflare.enabled===!0&&ht(fm,{config:l.lensflare}),l.godRays.enabled===!0&&ht(Vv,{sun:c,samples:l.godRays.samples,density:l.godRays.density,decay:l.godRays.decay,weight:l.godRays.weight,exposure:l.godRays.exposure,clampMax:l.godRays.clampMax,blur:l.godRays.blur,kernelSize:rl(l.godRays.kernelSize)}),l.noise.enabled===!0&&ht(Gv,{premultiply:l.noise.premultiply,opacity:l.noise.opacity,blendFunction:ja.ADD}),l.brightnessContrast.enabled===!0&&ht(Bv,{brightness:l.brightnessContrast.brightness,contrast:l.brightnessContrast.contrast}),l.hueSaturation.enabled===!0&&ht(Uv,{hue:l.hueSaturation.hue,saturation:l.hueSaturation.saturation}),l.toneMapping.enabled===!0&&ht(um,{exposure:l.toneMapping.exposure}),l.vignette.enabled===!0&&ht(Zv,{eskil:l.vignette.eskil,offset:l.vignette.offset,darkness:l.vignette.darkness,blendFunction:ja.NORMAL}),l.toneMapping.enabled===!0&&ht(Qv,{mode:bm(l.toneMapping.mode),resolution:l.toneMapping.resolution,whitePoint:l.toneMapping.whitePoint,middleGrey:l.toneMapping.middleGrey,minLuminance:l.toneMapping.minLuminance,averageLuminance:l.toneMapping.averageLuminance,adaptationRate:l.toneMapping.adaptationRate}),l.sepia.enabled===!0&&ht(Yv,{intensity:l.sepia.intensity,blendFunction:ja.NORMAL}),l.scanline.enabled===!0&&ht(Xv,{density:l.scanline.density,blendFunction:ja.OVERLAY}),l.pixelation.enabled===!0&&ht(Wv,{granularity:l.pixelation.granularity}),l.ramp.enabled===!0&&ht($v,{rampType:ym(l.ramp.rampType),rampStart:l.ramp.rampStart,rampEnd:l.ramp.rampEnd,startColor:m,endColor:S,opacity:l.ramp.rampMask?1:l.ramp.opacity??.5,rampBias:l.ramp.rampBias,rampGain:l.ramp.rampGain,rampMask:l.ramp.rampMask,rampInvert:l.ramp.rampInvert})]})]})});function o1(e){let t=[e];for(;t.length>0;){let n=t.pop();if(n.visible){if(n.isMesh)return!0;t.push(...n.children)}}return!1}function a1(e,t){return e.length===t.length&&e.every((n,i)=>n===t[i])}function Sm({hoveredObjectRef:e,...t}){let n=il(c=>c.scene),i=il(c=>c.invalidate),[r,o]=Cm(null),a=n1(c=>o(c),[]),s=wm({effect:null,objects:Ad});return vm(()=>{if(!r)return;let l=t.sceneConfig?.postProcessing?.outline.enabled===!0?r1(n):e&&o1(e)?[e]:Ad;s.current.effect===r&&a1(s.current.objects,l)||(s.current={effect:r,objects:l},r.selection.set(l),i())}),ht(i1,{...t,onOutlineEffect:a})}import{Component as l1}from"react";var al=class extends l1{constructor(){super(...arguments);this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(n,i){this.props.onError?.(n)}render(){return this.state.hasError?this.props.fallback??null:this.props.children}};import{Fragment as v1,jsx as jn,jsxs as Mm}from"react/jsx-runtime";var x1=1.5;function y1({captureRef:e}){let{gl:t,scene:n,camera:i,invalidate:r}=d1();return f1(()=>{if(e)return e.current={gl:t,scene:n,camera:i,invalidate:r},()=>{e.current=null}},[e,t,n,i,r]),null}function Rd({children:e,camera:t,backgroundColor:n,shadows:i=!0,sceneConfig:r,selectedObjectRef:o,hoveredObjectRef:a,highlightOnHover:s,renderMode:c="demand",maxDpr:l=2,xrStore:u,rendererCaptureRef:d,preserveDrawingBuffer:p=!1,reduceGpuLoad:g}){let f=g??hd(),v=f?Math.min(l,x1):l,P=i&&!f,y=sl(()=>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]),h=sl(()=>{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=sl(()=>{let x=r?.postProcessing;return x?!!(x.glitch.enabled||x.noise.enabled||x.lensflare.enabled&&x.lensflare.animated):!1},[r?.postProcessing]),[S,M]=b1(!1),T=r?.environment,E=r?.groundShadows,b=sl(()=>{if(!T)return null;if(T.source==="custom"){let x=T.customEnvironmentUrl.trim();return Hs(x)?{files:x}:null}return{preset:T.preset}},[T]),C=Mm(v1,{children:[jn(y1,{captureRef:d}),jn(Zh,{cameraConfig:t}),jn(Kh,{active:m}),jn(Jh,{color:h}),b?jn(al,{onError:x=>console.warn("Failed to load environment map:",x),children:jn(g1,{fallback:null,children:jn(p1,{...b,environmentIntensity:T?.intensity??.25,backgroundIntensity:T?.intensity??.25,background:r?.background.enabled===!0&&r.background.type==="environment"})})}):null,jn(Qh,{rotation:T?.rotation??0}),u&&jn(Yh,{onPresentingChange:M}),E?.enabled&&E.mode==="shadowCatcher"&&!S&&jn(u1,{position:[0,E.height,0],scale:E.size,opacity:E.intensity,blur:E.borderFade,far:15,resolution:1024,color:"#000000"}),e,jn(Sm,{sceneConfig:r,selectedObjectRef:o,hoveredObjectRef:a,highlightOnHover:s,disabled:f})]});return jn(c1,{frameloop:c,dpr:[1,v],shadows:P?"soft":!1,resize:{debounce:0,scroll:!1},raycaster:{firstHitOnly:!0},style:y,camera:t??{fov:50},gl:{preserveDrawingBuffer:p,toneMapping:m1,toneMappingExposure:1},children:u?Mm(h1,{store:u,children:[jn(qh,{renderMode:c}),C]}):C})}import{CameraControls as w1}from"@react-three/drei";import{useEffect as C1}from"react";import{jsx as S1}from"react/jsx-runtime";function Ed({controlsRef:e,onCameraChange:t}){return C1(()=>{if(!t||!e||typeof e!="object"||!("current"in e))return;let n=e.current;if(!n)return;let i=()=>{t(n.camera,n)};return n.addEventListener("update",i),()=>{n.removeEventListener("update",i)}},[e,t]),S1(w1,{ref:e,makeDefault:!0,smoothTime:.3,dollyToCursor:!0})}import{useRef as Bd,useMemo as ll,useEffect as T1}from"react";import{useFrame as P1,useThree as Tm}from"@react-three/fiber";import{Vector3 as k1}from"three";var Ld=Symbol("react-immersive.model-node-id");function M1(e,t){Object.defineProperty(e,Ld,{value:t,configurable:!0})}function No(e){let t=new Map;e.traverse(c=>{if(!c.name)return;let l=t.get(c.name);l?l.push(c):t.set(c.name,[c])});let n=Object.create(null),i=new WeakMap,r=new Map,o=new Set(Array.from(t,([c,l])=>l.length===1?c:null).filter(c=>c!==null)),a=new Set,s=(c,l)=>{M1(c,l),n[l]=c,i.set(c,l),a.add(l)};for(let[c,l]of t)l.length===1&&s(l[0],c);for(let[c,l]of t){if(l.length<2)continue;let u=[];l.forEach((d,p)=>{let g=`${c} [${p+1}]`,f=g,v=2;for(;o.has(f)||a.has(f);)f=`${g}.${v++}`;s(d,f),u.push(f)}),r.set(c,u)}return{nodesById:n,idByNode:i,duplicateNames:r}}function Ua(e){return e[Ld]??e.name??null}function gr(e,t){let n=null,i=[];return e.traverse(r=>{r[Ld]===t&&(n=r),r.name===t&&i.push(r)}),n??(i.length===1?i[0]:null)}import{Fragment as B1,jsx as ji,jsxs as O1}from"react/jsx-runtime";function km(e,t){if(!t)return e;let n=t*Math.PI/180,i=Math.cos(n),r=Math.sin(n);return[e[0]*i+e[2]*r,e[1],-e[0]*r+e[2]*i]}function _1(e,t){let[n,i,r]=e.center,o=e.radius,a=Math.hypot(t[0],t[1],t[2]),s=a>1e-6?[t[0]/a,t[1]/a,t[2]/a]:[0,1,0],c=o*2;return{position:[n+s[0]*c,i+s[1]*c,r+s[2]*c],target:e.center,extent:o,near:Math.max(o/100,.001),far:c+o*2}}function A1(e,t){let n=t[0]-e.center[0],i=t[1]-e.center[1],r=t[2]-e.center[2],o=Math.hypot(n,i,r);return{near:Math.max(o-e.radius,o*.01,.001),far:o+e.radius*2}}function R1(e,t,n){return t&&n&&!e.attachedToCamera?n.center:[0,0,0]}var E1={ambient:{intensity:.25,color:"#ffffff"},lights:[{id:"light-hemi",type:"hemisphere",color:"#ffffff",intensity:.3,position:[0,1,0],attachedToCamera:!1,castShadow:!1,shadowBias:-5e-4,visible:!0},{id:"light-key",type:"directional",color:"#ffffff",intensity:2.5,position:[6,12,6],attachedToCamera:!1,castShadow:!0,shadowBias:-5e-4,visible:!0},{id:"light-fill",type:"directional",color:"#ffffff",intensity:0,position:[-6,8,-6],attachedToCamera:!1,castShadow:!1,shadowBias:-5e-4,visible:!0}]},L1={enabled:!0,mapSize:2048,bias:-5e-4,normalBias:.02,radius:3};function Pm({light:e,shadows:t,shadowsEnabled:n,environmentRotation:i,modelBounds:r,objectBindings:o,nodeRefs:a}){let s=Bd(null),c=Bd(null),l=Bd(null),u=Tm(y=>y.camera),d=Tm(y=>y.scene),p=ll(()=>new k1,[]),g=ll(()=>e.attachedToCamera||e.attachment?e.position:km(e.position,i),[e.position,e.attachedToCamera,e.attachment,i]);P1(()=>{let y=s.current??c.current??l.current;if(!y)return;if(e.attachedToCamera){y.position.copy(u.position);return}let h=e.attachment;if(!h)return;let m=o?bn(o,h.objectId):null,M=(m?o?.[m]:void 0)?.modelObjectId??h.objectId,T=(m?a?.current[m]:void 0)??gr(d,M);T&&(p.fromArray(h.offset),T.localToWorld(p),y.position.copy(p))});let f=n&&t.enabled&&e.castShadow,v=ll(()=>e.type==="directional"&&f&&r&&!e.attachedToCamera?_1(r,g):null,[e.type,e.attachedToCamera,f,r,g]),P=ll(()=>e.type==="spot"&&f&&r&&!e.attachedToCamera?A1(r,g):null,[e.type,e.attachedToCamera,f,r,g]);return T1(()=>{let y=s.current??l.current;if(!y)return;let[h,m,S]=R1(e,f,r);y.target.position.set(h,m,S),y.target.updateMatrixWorld()},[e,f,r]),!e.visible||e.type==="none"?null:e.type==="directional"?ji("directionalLight",{ref:s,color:e.color,intensity:e.intensity,position:v?.position??g,castShadow:f,"shadow-mapSize-width":t.mapSize,"shadow-mapSize-height":t.mapSize,"shadow-bias":e.shadowBias,"shadow-normalBias":t.normalBias,"shadow-radius":t.radius,"shadow-camera-near":v?.near??.5,"shadow-camera-far":v?.far??40,"shadow-camera-left":-(v?.extent??8),"shadow-camera-right":v?.extent??8,"shadow-camera-top":v?.extent??8,"shadow-camera-bottom":-(v?.extent??8)}):e.type==="point"?ji("pointLight",{ref:c,color:e.color,intensity:e.intensity,position:g,distance:e.distance,decay:e.decay,castShadow:f,"shadow-mapSize-width":t.mapSize,"shadow-mapSize-height":t.mapSize,"shadow-bias":e.shadowBias}):e.type==="spot"?ji("spotLight",{ref:l,color:e.color,intensity:e.intensity,position:g,angle:e.angle??Math.PI/6,penumbra:e.penumbra??.2,distance:e.distance,decay:e.decay,castShadow:f,"shadow-mapSize-width":t.mapSize,"shadow-mapSize-height":t.mapSize,"shadow-bias":e.shadowBias,"shadow-normalBias":t.normalBias,"shadow-radius":t.radius,"shadow-camera-near":P?.near??.5,"shadow-camera-far":P?.far??40}):e.type==="hemisphere"?ji("hemisphereLight",{color:e.color,groundColor:"#444444",intensity:e.intensity}):null}function Od({lightingConfig:e,shadowConfig:t,shadowsEnabled:n=!0,environmentRotation:i=0,environmentConfig:r,modelBounds:o,objectBindings:a,nodeRefs:s}){let c=e??E1,l=t??L1,u=r?.shadowLight,d=km([5,10,5],i);return O1(B1,{children:[ji("ambientLight",{intensity:c.ambient.intensity,color:c.ambient.color}),c.lights.map(p=>ji(Pm,{light:p,shadows:l,shadowsEnabled:n,environmentRotation:i,modelBounds:o,objectBindings:a,nodeRefs:s},p.id)),u?.enabled&&ji(Pm,{light:{id:"light-env-shadow",type:"directional",color:"#ffffff",intensity:u.intensity,position:d,attachedToCamera:!1,castShadow:!0,shadowBias:u.bias,visible:!0},shadows:l,shadowsEnabled:n,environmentRotation:0,modelBounds:o,objectBindings:a,nodeRefs:s})]})}import{useState as Lw,useEffect as Ut,useRef as an,useMemo as xn}from"react";import{useFrame as $d,useThree as Bw}from"@react-three/fiber";import{useLoader as Wm,useThree as nw}from"@react-three/fiber";import{FileLoader as rw,Loader as iw,LoadingManager as ow}from"three";import{FBXLoader as aw,GLTFLoader as sw,MTLLoader as lw,OBJLoader as cw}from"three-stdlib";import{USDLoader as dw}from"three/examples/jsm/loaders/USDLoader.js";import{strFromU8 as D1,strToU8 as N1,unzip as I1}from"fflate";var _m;function Am(e){_m=e}function Ga(e){_m?.(e)}var z1=[".glb",".gltf",".obj",".fbx",".usdz",".zip"],j1=["model/gltf-binary","model/gltf+json","model/vnd.usdz+zip","application/vnd.usdz+zip","application/zip","application/x-zip-compressed"],Ha=1024*1024,Rm=128*Ha,Em=1024,Lm=128*Ha,Bm=256*Ha,Om=200,V1=Ha,Vr=new Map,cl=".glb,.gltf,.obj,.fbx,.usdz,.zip,model/gltf-binary,model/gltf+json,model/vnd.usdz+zip,application/vnd.usdz+zip,application/zip";function Nd(e){let t=e.split(/[?#]/,1)[0].toLowerCase();return t.endsWith(".obj")?"obj":t.endsWith(".fbx")?"fbx":t.endsWith(".usdz")?"usdz":t.endsWith(".gltf")?"gltf":"glb"}function zm(e){return Vr.get(e)??{format:Nd(e)}}function F1(e){let t=e.name.toLowerCase();return z1.some(n=>t.endsWith(n))||j1.includes(e.type)}async function dl(e){if(!F1(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 Dm(e,"usdz");if(t.endsWith(".zip")||U1(e.type))return G1(e);if(t.endsWith(".gltf")||e.type==="model/gltf+json")return Nm(e);let n=Nd(e.name);return n==="gltf"?Nm(e):Dm(e,n)}function Dm(e,t){let n=URL.createObjectURL(e);return Vr.set(n,{format:t,entryPath:e.name}),{url:n,name:e.name,format:t,cleanup:()=>{Ga(n),Vr.delete(n),URL.revokeObjectURL(n)}}}function U1(e){return e==="application/zip"||e==="application/x-zip-compressed"}async function Nm(e){let t=await e.text(),n=jm(t,e.name);for(let r of Vm(n))if(!Id(r))throw new Error(`${e.name} references external assets. Upload a .zip containing the .gltf file and its dependencies.`);let i=URL.createObjectURL(e);return Vr.set(i,{format:"gltf",entryPath:e.name}),{url:i,name:e.name,format:"gltf",cleanup:()=>{Ga(i),Vr.delete(i),URL.revokeObjectURL(i)}}}async function G1(e){if(e.size>Rm)throw new Error(`Model zip is too large. The compressed archive must be ${Dd(Rm)} or smaller.`);let t=await H1(new Uint8Array(await e.arrayBuffer())),n=new Map;for(let[a,s]of Object.entries(t)){let c=zd(a);!c||Fm(c)||n.set(c,s)}let i=[...n.keys()].filter(a=>/\.(gltf|obj|fbx)$/i.test(a));if(i.length===0)throw new Error("Invalid model zip: no .gltf, .obj, or .fbx file found.");if(i.length>1)throw new Error("Invalid model zip: multiple model entry files found.");let r=i[0],o=Nd(r);if(o==="gltf")return $1(e,r,n);if(o==="obj"||o==="fbx")return W1(e,r,o,n);throw new Error(`Unsupported model entry ${r}.`)}function H1(e){return new Promise((t,n)=>{let i=0,r=0,o=null,a=c=>(o??(o=new Error(`Invalid model zip: ${c}`)),!1);I1(e,{filter:c=>{if(o)return!1;if(i+=1,i>Em)return a(`archive contains more than ${Em.toLocaleString()} entries.`);if(c.originalSize>Lm)return a(`${c.name} expands beyond the ${Dd(Lm)} per-file limit.`);if(r+=c.originalSize,r>Bm)return a(`expanded contents exceed ${Dd(Bm)}.`);if(c.originalSize>=V1&&(c.size===0||c.originalSize/c.size>Om))return a(`${c.name} exceeds the ${Om}:1 compression-ratio limit.`);let l=zd(c.name);return!!l&&!Fm(l)}},(c,l)=>{o?n(o):c?n(new Error(`Invalid model zip: ${c.message}`)):t(l)})})}function Dd(e){return`${e/Ha} MiB`}function W1(e,t,n,i){let r=[],o={};for(let[s,c]of i){let l=URL.createObjectURL(new Blob([c],{type:Um(s)}));r.push(l),o[s]=l}let a=o[t];if(!a)throw r.forEach(s=>URL.revokeObjectURL(s)),new Error(`Invalid model zip: could not read ${t}.`);return Vr.set(a,{format:n,entryPath:t,resourceUrls:o}),{url:a,name:e.name,format:n,cleanup:()=>{Ga(a),Vr.delete(a),r.forEach(s=>URL.revokeObjectURL(s))}}}function $1(e,t,n){let i=n.get(t);if(!i)throw new Error("Invalid GLTF zip: no .gltf found.");let r=jm(D1(i),t);X1(r,t);let o=q1(t),a=[];try{Im(r.buffers,o,n,a),Im(r.images,o,n,a);let s=new Blob([N1(JSON.stringify(r))],{type:"model/gltf+json"}),c=URL.createObjectURL(s);return a.push(c),Vr.set(c,{format:"gltf",entryPath:t}),{url:c,name:e.name,format:"gltf",cleanup:()=>{Ga(c),Vr.delete(c),a.forEach(l=>URL.revokeObjectURL(l))}}}catch(s){throw a.forEach(c=>URL.revokeObjectURL(c)),s}}function Im(e,t,n,i){for(let r of e??[]){if(typeof r.uri!="string"||Id(r.uri))continue;let o=Y1(t,r.uri),a=n.get(o);if(!a)throw new Error(`Invalid GLTF zip: missing referenced asset ${r.uri}.`);let s=URL.createObjectURL(new Blob([a],{type:Um(o)}));i.push(s),r.uri=s}}function jm(e,t){try{return JSON.parse(e)}catch{throw new Error(`${t} is not a valid .gltf JSON file.`)}}function Vm(e){return[...e.buffers??[],...e.images??[]].map(t=>t.uri).filter(t=>typeof t=="string"&&t.length>0)}function X1(e,t){for(let n of Vm(e)){if(Id(n))continue;let i=/^[a-z][a-z0-9+.-]*:/i.test(n),r=n.startsWith("/")||n.startsWith("\\");if(i||r)throw new Error(`${t} references external assets. Include every dependency inside the uploaded .zip.`)}}function Id(e){return e.startsWith("data:")}function zd(e){let t=[];for(let n of e.replace(/\\/g,"/").replace(/^\/+/,"").split("/").filter(i=>i&&i!==".")){if(n===".."){t.pop();continue}t.push(n)}return t.join("/")}function Fm(e){let t=e.split("/");return e.endsWith("/")||t.includes("__MACOSX")||t.some(n=>n===".DS_Store"||n.startsWith("._"))}function q1(e){let t=e.lastIndexOf("/");return t===-1?"":e.slice(0,t)}function Y1(e,t){let n=t.split(/[?#]/)[0],i=K1(n);return zd(e?`${e}/${i}`:i)}function K1(e){try{return decodeURI(e)}catch{return e}}function Um(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 OR}from"@react-three/drei";import{useThree as NR}from"@react-three/fiber";import{useMemo as zR}from"react";import{SRGBColorSpace as J1}from"three";import{DRACOLoader as Q1,KTX2Loader as Z1,MeshoptDecoder as ew}from"three-stdlib";function tw(e){return{name:"RI_unlit_emissive_texture",async afterRoot(t){let n=e.json.materials??[],i=new Map;if(n.forEach(o=>{let a=!!o?.extensions?.KHR_materials_unlit,s=!!o?.pbrMetallicRoughness?.baseColorTexture;a&&!s&&o?.emissiveTexture&&o.name&&i.set(o.name,o.emissiveTexture.index)}),i.size===0||!t.scene)return;let r=new Map;await Promise.all([...i].map(async([o,a])=>{let s=await e.getDependency("texture",a);s&&(s.colorSpace=J1,r.set(o,s))})),t.scene.traverse(o=>{let a=Array.isArray(o.material)?o.material:o.material?[o.material]:[];for(let s of a){let c=s.name?r.get(s.name):void 0;c&&!s.map&&(s.map=c,s.needsUpdate=!0)}})}}}var jd="https://assets.react-immersive.liveroom.dev/three-r184/draco/",Vd="https://assets.react-immersive.liveroom.dev/three-r184/basis/";function Gm(e,t={},n){let{dracoDecoderPath:i=jd,ktx2TranscoderPath:r=Vd,meshopt:o=!0}=t;if(i){let a=new Q1;a.setDecoderPath(i),e.setDRACOLoader(a)}if(o&&e.setMeshoptDecoder(ew),r&&n){let a=new Z1().setTranscoderPath(r).detectSupport(n);e.setKTX2Loader(a)}e.register((a=>tw(a)))}var ul=class extends iw{constructor(){super(...arguments);this.options={source:{format:"glb"}}}configure(n){return this.options=n,this}load(n,i,r,o){this.loadAsset(n,r).then(i).catch(o)}async loadAsset(n,i){let r=pw(this.options.source),{format:o}=this.options.source;if(o==="obj")return uw(n,r,this.options.source,i);if(o==="fbx"){let c=Fd(this,new aw(r)),l=gw(n,this.options.source);l&&c.setResourcePath(l);let u=await c.loadAsync(n,i);return Ud(u,"FBXMesh",!1),{scene:u,animations:u.animations??[]}}if(o==="usdz"){let l=await Fd(this,new dw(r)).loadAsync(n,i);return Ud(l,"USDZMesh",!1),{scene:l,animations:l.animations??[]}}let a=Fd(this,new sw(r));Gm(a,this.options.decoderConfig,this.options.renderer);let s=await a.loadAsync(n,i);return{scene:s.scene,animations:s.animations??[]}}};Am(e=>{Wm.clear(ul,e)});function ml(e,t={},n){let i=nw(a=>a.gl),r=zm(e),o=n?{...r,format:n}:r;return Wm(ul,e,a=>{a.configure({source:o,decoderConfig:t,renderer:i})})}async function uw(e,t,n,i){let r=await Hm(e,t,i),o=new cw(t),a=hw(r);if(a){let c=mw(a,e,n);if(c)try{let l=await Hm(c.url,t),d=new lw(t).parse(l,c.basePath);d.preload(),o.setMaterials(d)}catch(l){console.warn(`[react-immersive] Could not load OBJ material ${a}; rendering geometry with fallback materials.`,l)}}let s=o.parse(r);return Ud(s,"OBJMesh",!0),{scene:s,animations:[]}}function Ud(e,t,n){let i=new Set,r=0;e.traverse(o=>{if(!("isMesh"in o&&o.isMesh===!0)){o.name&&i.add(o.name);return}let s=o.name||`${t}_${++r}`;if(!n&&o.name){i.add(o.name);return}let c=s,l=2;for(;i.has(c);)c=`${s}_${l++}`;o.name=c,i.add(c)})}function Hm(e,t,n){let i=new rw(t);return i.setResponseType("text"),i.loadAsync(e,n)}function Fd(e,t){return t.setCrossOrigin(e.crossOrigin),t.setWithCredentials(e.withCredentials),t.setRequestHeader(e.requestHeader),t}function pw(e){let t=new ow,n=e.resourceUrls;return n&&t.setURLModifier(i=>{if(/^(?:blob:|data:)/i.test(i))return i;let r=hl(Xm(i).split(/[?#]/)[0]),o=n[r];if(o)return o;let a=pl(e.entryPath??""),s=hl(a?`${a}/${r}`:r);return n[s]??i}),t}function hw(e){return/^\s*mtllib\s+(.+?)\s*$/im.exec(e)?.[1]?.trim()||null}function mw(e,t,n){if(n.resourceUrls&&n.entryPath){let i=hl(`${pl(n.entryPath)}/${Xm(e)}`),r=n.resourceUrls[i];if(!r)return null;let o=pl(i);return{url:r,basePath:o?`${o}/`:""}}try{let i=new URL(e,t).href;return{url:i,basePath:$m(i)}}catch{return null}}function gw(e,t){if(t.resourceUrls&&t.entryPath){let n=pl(t.entryPath);return n?`${n}/`:""}return $m(e)}function $m(e){let t=e.lastIndexOf("/");return t===-1?"":e.slice(0,t+1)}function pl(e){let t=hl(e),n=t.lastIndexOf("/");return n===-1?"":t.slice(0,n)}function hl(e){let t=[];for(let n of e.replace(/\\/g,"/").replace(/^\/+/,"").split("/").filter(i=>i&&i!=="."))n===".."?t.pop():t.push(n);return t.join("/")}function Xm(e){try{return decodeURI(e)}catch{return e}}import{MeshStandardMaterial as Ow,MeshBasicMaterial as Xd,MeshNormalMaterial as Dw,MeshMatcapMaterial as Nw,DoubleSide as Iw,NormalBlending as zw,AnimationMixer as jw,LoopOnce as Vw,LoopRepeat as Fw,Box3 as Ml,Vector3 as Fi,Matrix4 as Uw,MathUtils as Tl}from"three";import{SkeletonUtils as Gw}from"three-stdlib";function qm(e){let t=new Map;return e.map((n,i)=>{let o=n.name.trim()||`Animation ${i+1}`,a=t.get(o)??0;return t.set(o,a+1),{clip:n,sourceName:a===0?o:`${o} (${a+1})`,duration:n.duration}})}import{AdditiveBlending as fw,BackSide as bw,DoubleSide as xw,FrontSide as yw,NoColorSpace as vw,NormalBlending as ww,SRGBColorSpace as Cw,Vector2 as Ym}from"three";function Km(e){return!!(e&&typeof e=="object"&&"clone"in e&&"color"in e&&"metalness"in e&&"roughness"in e)}function Jm(e){return!!(e&&typeof e=="object"&&"isMeshPhysicalMaterial"in e&&e.isMeshPhysicalMaterial)}function Jn(e){return!!(e&&"isMesh"in e&&e.isMesh)}var Wa=["texture","metalnessMap","roughnessMap","emissiveMap","alphaMap","normalMap","bumpMap","aoMap","displacementMap","clearcoatMap","clearcoatRoughnessMap","clearcoatNormalMap","anisotropyMap","transmissionMap","thicknessMap","sheenColorMap","sheenRoughnessMap","specularIntensityMap","specularColorMap"],Sw=new Set(["texture","emissiveMap","sheenColorMap","specularColorMap"]);function Vi(e){return Sw.has(e)?Cw:vw}function kt(e,t){return e?.[t]?.path}function Qm(e){return e==="back"?bw:e==="double"?xw:yw}function Zm(e){return e==="additive"?fw:ww}function Fr(e,t=1,n=t){if(e&&typeof e=="object"){let i=e;if(typeof i.x=="number"&&Number.isFinite(i.x)&&typeof i.y=="number"&&Number.isFinite(i.y))return new Ym(i.x,i.y)}return new Ym(t,n)}function Gd(e){return Number.isFinite(e)&&e>0?e:1}function gl(e,t){return e?.animations.clips.find(n=>n.sourceName===t)}function eg(e){return e?.loopMode??"repeat"}import{Color as Hd,MeshPhysicalMaterial as Mw,MeshStandardMaterial as Tw,Texture as Wd}from"three";function Io(e){if(Km(e))return e;if(!e||typeof e!="object")return null;let t=e,n=new Tw;typeof t.name=="string"&&(n.name=t.name),n.metalness=0,n.roughness=1,t.type==="MeshBasicMaterial"||t.isMeshBasicMaterial===!0?(n.color.set(0),n.emissiveIntensity=1,t.map instanceof Wd?(n.emissiveMap=t.map,n.emissive.set(16777215)):t.color instanceof Hd&&n.emissive.copy(t.color)):(t.color instanceof Hd&&n.color.copy(t.color),t.map instanceof Wd&&(n.map=t.map),t.emissive instanceof Hd&&n.emissive.copy(t.emissive),t.emissiveMap instanceof Wd&&(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 fl(e){if(Jm(e))return e.clone();let t=new Mw;return t.name=e.name,t.color.copy(e.color),t.map=e.map,t.lightMap=e.lightMap,t.lightMapIntensity=e.lightMapIntensity,t.aoMap=e.aoMap,t.aoMapIntensity=e.aoMapIntensity,t.emissive.copy(e.emissive),t.emissiveIntensity=e.emissiveIntensity,t.emissiveMap=e.emissiveMap,t.bumpMap=e.bumpMap,t.bumpScale=e.bumpScale,t.normalMap=e.normalMap,t.normalMapType=e.normalMapType,t.normalScale.copy(Fr(e.normalScale)),t.displacementMap=e.displacementMap,t.displacementScale=e.displacementScale,t.displacementBias=e.displacementBias,t.roughness=e.roughness,t.roughnessMap=e.roughnessMap,t.metalness=e.metalness,t.metalnessMap=e.metalnessMap,t.alphaMap=e.alphaMap,t.envMap=e.envMap,t.envMapRotation.copy(e.envMapRotation),t.envMapIntensity=e.envMapIntensity,t.wireframe=e.wireframe,t.wireframeLinewidth=e.wireframeLinewidth,t.flatShading=e.flatShading,t.fog=e.fog,t.opacity=e.opacity,t.transparent=e.transparent,t.alphaHash=e.alphaHash,t.blendSrc=e.blendSrc,t.blendDst=e.blendDst,t.blendEquation=e.blendEquation,t.blendSrcAlpha=e.blendSrcAlpha,t.blendDstAlpha=e.blendDstAlpha,t.blendEquationAlpha=e.blendEquationAlpha,t.blending=e.blending,t.premultipliedAlpha=e.premultipliedAlpha,t.dithering=e.dithering,t.alphaTest=e.alphaTest,t.depthTest=e.depthTest,t.depthWrite=e.depthWrite,t.colorWrite=e.colorWrite,t.stencilWrite=e.stencilWrite,t.stencilWriteMask=e.stencilWriteMask,t.stencilFunc=e.stencilFunc,t.stencilRef=e.stencilRef,t.stencilFuncMask=e.stencilFuncMask,t.stencilFail=e.stencilFail,t.stencilZFail=e.stencilZFail,t.stencilZPass=e.stencilZPass,t.side=e.side,t.shadowSide=e.shadowSide,t.toneMapped=e.toneMapped,t.vertexColors=e.vertexColors,t.visible=e.visible,t.clippingPlanes=e.clippingPlanes,t.clipIntersection=e.clipIntersection,t.clipShadows=e.clipShadows,t.forceSinglePass=e.forceSinglePass,t.polygonOffset=e.polygonOffset,t.polygonOffsetFactor=e.polygonOffsetFactor,t.polygonOffsetUnits=e.polygonOffsetUnits,t}function bl(e){e.userData.baseColor=e.color.clone(),e.userData.baseMap=e.map??null,e.userData.baseMetalness=e.metalness,e.userData.baseMetalnessMap=e.metalnessMap??null,e.userData.baseRoughness=e.roughness,e.userData.baseRoughnessMap=e.roughnessMap??null,e.userData.baseEmissive=e.emissive.clone(),e.userData.baseEmissiveIntensity=e.emissiveIntensity,e.userData.baseEmissiveMap=e.emissiveMap??null,e.userData.baseOpacity=e.opacity,e.userData.baseTransparent=e.transparent,e.userData.baseAlphaMap=e.alphaMap??null,e.userData.baseAlphaTest=e.alphaTest,e.userData.baseAlphaHash=e.alphaHash,e.userData.baseDithering=e.dithering,e.userData.baseBlending=e.blending,e.userData.baseDepthWrite=e.depthWrite,e.userData.baseSide=e.side,e.userData.baseNormalMap=e.normalMap??null,e.userData.baseNormalScale=Fr(e.normalScale),e.userData.baseBumpMap=e.bumpMap??null,e.userData.baseBumpScale=e.bumpScale,e.userData.baseAoMap=e.aoMap??null,e.userData.baseAoMapIntensity=e.aoMapIntensity,e.userData.baseDisplacementMap=e.displacementMap??null,e.userData.baseDisplacementScale=e.displacementScale,e.userData.baseDisplacementBias=e.displacementBias,e.userData.baseClearcoat=e.clearcoat,e.userData.baseClearcoatMap=e.clearcoatMap??null,e.userData.baseClearcoatRoughness=e.clearcoatRoughness,e.userData.baseClearcoatRoughnessMap=e.clearcoatRoughnessMap??null,e.userData.baseClearcoatNormalMap=e.clearcoatNormalMap??null,e.userData.baseClearcoatNormalScale=Fr(e.clearcoatNormalScale),e.userData.baseSheen=e.sheen,e.userData.baseSheenColor=e.sheenColor.clone(),e.userData.baseSheenColorMap=e.sheenColorMap??null,e.userData.baseSheenRoughness=e.sheenRoughness,e.userData.baseSheenRoughnessMap=e.sheenRoughnessMap??null,e.userData.baseAnisotropy=e.anisotropy,e.userData.baseAnisotropyRotation=e.anisotropyRotation,e.userData.baseAnisotropyMap=e.anisotropyMap??null,e.userData.baseTransmission=e.transmission,e.userData.baseTransmissionMap=e.transmissionMap??null,e.userData.baseThickness=e.thickness,e.userData.baseThicknessMap=e.thicknessMap??null,e.userData.baseAttenuationColor=e.attenuationColor.clone(),e.userData.baseAttenuationDistance=e.attenuationDistance,e.userData.baseReflectivity=e.reflectivity,e.userData.baseSpecularIntensity=e.specularIntensity,e.userData.baseSpecularIntensityMap=e.specularIntensityMap??null,e.userData.baseSpecularColor=e.specularColor.clone(),e.userData.baseSpecularColorMap=e.specularColorMap??null,e.userData.baseFlatShading=e.flatShading,e.userData.baseEnvMapIntensity=e.envMapIntensity}import{Color as xl,FrontSide as Pw,NormalBlending as tg,SRGBColorSpace as yl}from"three";function vl(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 xl(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??tg,e.depthWrite=e.userData.baseDepthWrite??!0,e.side=e.userData.baseSide??Pw,e.normalMap=e.userData.baseNormalMap??null,e.normalScale.copy(Fr(e.userData.baseNormalScale)),e.bumpMap=e.userData.baseBumpMap??null,e.bumpScale=e.userData.baseBumpScale??e.bumpScale,e.aoMap=e.userData.baseAoMap??null,e.aoMapIntensity=e.userData.baseAoMapIntensity??e.aoMapIntensity,e.displacementMap=e.userData.baseDisplacementMap??null,e.displacementScale=e.userData.baseDisplacementScale??e.displacementScale,e.displacementBias=e.userData.baseDisplacementBias??e.displacementBias,e.clearcoat=e.userData.baseClearcoat??e.clearcoat,e.clearcoatMap=e.userData.baseClearcoatMap??null,e.clearcoatRoughness=e.userData.baseClearcoatRoughness??e.clearcoatRoughness,e.clearcoatRoughnessMap=e.userData.baseClearcoatRoughnessMap??null,e.clearcoatNormalMap=e.userData.baseClearcoatNormalMap??null,e.clearcoatNormalScale.copy(Fr(e.userData.baseClearcoatNormalScale)),e.sheen=e.userData.baseSheen??e.sheen,e.sheenColor.copy(e.userData.baseSheenColor??new xl(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 xl("#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 xl("#ffffff")),e.specularColorMap=e.userData.baseSpecularColorMap??null,e.flatShading=e.userData.baseFlatShading??e.flatShading,e.envMapIntensity=e.userData.baseEnvMapIntensity??e.envMapIntensity;let i=kt(t,"texture"),r=kt(t,"metalnessMap"),o=kt(t,"roughnessMap"),a=kt(t,"emissiveMap"),s=kt(t,"alphaMap"),c=kt(t,"normalMap"),l=kt(t,"bumpMap"),u=kt(t,"aoMap"),d=kt(t,"displacementMap"),p=kt(t,"clearcoatMap"),g=kt(t,"clearcoatRoughnessMap"),f=kt(t,"clearcoatNormalMap"),v=kt(t,"anisotropyMap"),P=kt(t,"transmissionMap"),y=kt(t,"thicknessMap"),h=kt(t,"sheenColorMap"),m=kt(t,"sheenRoughnessMap"),S=kt(t,"specularIntensityMap"),M=kt(t,"specularColorMap");if(i?(e.map=Ft(i,yl),e.color.set(n??"#ffffff")):n&&(e.map=null,e.color.set(n)),r&&(e.metalnessMap=Ft(r)),t?.metalness!==void 0&&(e.metalness=t.metalness),o&&(e.roughnessMap=Ft(o)),t?.roughness!==void 0&&(e.roughness=t.roughness),t?.emissive?e.emissive.set(t.emissive):a&&e.emissive.set("#ffffff"),t?.emissiveIntensity!==void 0&&(e.emissiveIntensity=t.emissiveIntensity),a&&(e.emissiveMap=Ft(a,yl)),t?.opacity!==void 0&&(e.opacity=t.opacity),s&&(e.alphaMap=Ft(s)),t?.alphaTest!==void 0&&(e.alphaTest=t.alphaTest),t?.alphaHash!==void 0&&(e.alphaHash=t.alphaHash),t?.dithering!==void 0&&(e.dithering=t.dithering),t?.blendingMode&&(e.blending=Zm(t.blendingMode),e.depthWrite=t.blendingMode!=="additive"),t?.side&&(e.side=Qm(t.side)),c&&(e.normalMap=Ft(c)),c||t?.normalScale!==void 0){let T=t?.normalScale??Math.abs(Fr(e.userData.baseNormalScale).x);e.normalScale.set(T,t?.flipNormalY?-T:T)}if(l&&(e.bumpMap=Ft(l)),t?.bumpScale!==void 0&&(e.bumpScale=t.bumpScale),u&&(e.aoMap=Ft(u)),t?.aoMapIntensity!==void 0&&(e.aoMapIntensity=t.aoMapIntensity),d&&(e.displacementMap=Ft(d)),t?.displacementScale!==void 0&&(e.displacementScale=t.displacementScale),t?.displacementBias!==void 0&&(e.displacementBias=t.displacementBias),p&&(e.clearcoatMap=Ft(p)),t?.clearcoat!==void 0&&(e.clearcoat=t.clearcoat),g&&(e.clearcoatRoughnessMap=Ft(g)),t?.clearcoatRoughness!==void 0&&(e.clearcoatRoughness=t.clearcoatRoughness),f&&(e.clearcoatNormalMap=Ft(f)),f||t?.clearcoatNormalScale!==void 0){let T=t?.clearcoatNormalScale??Math.abs(Fr(e.userData.baseClearcoatNormalScale).x);e.clearcoatNormalScale.set(T,t?.flipClearcoatNormalY?-T:T)}t?.sheen!==void 0&&(e.sheen=t.sheen),t?.sheenColor&&e.sheenColor.set(t.sheenColor),h&&(e.sheenColorMap=Ft(h,yl)),t?.sheenRoughness!==void 0&&(e.sheenRoughness=t.sheenRoughness),m&&(e.sheenRoughnessMap=Ft(m)),t?.anisotropy!==void 0&&(e.anisotropy=t.anisotropy),t?.anisotropyRotation!==void 0&&(e.anisotropyRotation=t.anisotropyRotation),v&&(e.anisotropyMap=Ft(v)),t?.transmission!==void 0&&(e.transmission=t.transmission),P&&(e.transmissionMap=Ft(P)),t?.thickness!==void 0&&(e.thickness=t.thickness),y&&(e.thicknessMap=Ft(y)),t?.attenuationColor&&e.attenuationColor.set(t.attenuationColor),t?.attenuationDistance!==void 0&&(e.attenuationDistance=t.attenuationDistance),t?.reflectivity!==void 0&&(e.reflectivity=t.reflectivity),t?.specularIntensity!==void 0&&(e.specularIntensity=t.specularIntensity),S&&(e.specularIntensityMap=Ft(S)),t?.specularColor&&e.specularColor.set(t.specularColor),M&&(e.specularColorMap=Ft(M,yl)),e.transparent=e.opacity<1||e.transmission>0||e.blending!==tg||!!((s||e.alphaMap)&&e.alphaTest<=0),e.transparent||(e.depthWrite=!0)}function $a(e){return e.material}function Pr(e,t){return Array.isArray(e)?e.map(t):t(e,0)}function Qn(e,t){Array.isArray(e)?e.forEach(t):t(e,0)}function wl(e,t){return Array.isArray(e)?e[t]:e}function Xa(e){e.updateMatrixWorld(!0),e.traverse(t=>{let n=t;n.isSkinnedMesh&&(n.skeleton?.update(),n.computeBoundingBox?.(),n.computeBoundingSphere?.())})}import{Matrix4 as kw}from"three";function _w(e){return e.isSkinnedMesh===!0}function zo(e){let t=[];return e.traverse(n=>{_w(n)&&t.push(n)}),t}var qa="reactImmersiveSkinFreeze";function ng(e){return!!e.userData[qa]}function Cl(e,t){let n=e.userData,i=new kw().copy(t).invert(),r=n[qa];if(r){r.frozenInverse.copy(i),e.bindMatrixInverse.copy(i);return}let o={frozenInverse:i,previousOnBeforeRender:e.onBeforeRender};e.bindMatrixInverse.copy(i),e.onBeforeRender=function(a,s,c,l,u,d){o.previousOnBeforeRender.call(this,a,s,c,l,u,d),e.bindMatrixInverse.copy(o.frozenInverse)},n[qa]=o}function jo(e){let t=e.userData,n=t[qa];n&&(e.onBeforeRender=n.previousOnBeforeRender,delete t[qa],e.updateMatrixWorld(!0))}import{useCallback as rg,useEffect as Aw,useRef as Rw}from"react";import{useThree as Ew}from"@react-three/fiber";function Sl(){let e=Ew(r=>r.gl.domElement),t=Rw(void 0),n=rg(r=>{t.current===void 0&&(t.current=e.style.cursor),e.style.cursor=r},[e]),i=rg(()=>{let r=t.current;r!==void 0&&(e.style.cursor=r,t.current=void 0)},[e]);return Aw(()=>()=>{i()},[i]),{setCanvasCursor:n,restoreCanvasCursor:i}}import{jsx as ig}from"react/jsx-runtime";function Pl(e,t,n){let i=n.get(e);i&&(t?.position?e.position.fromArray(t.position):e.position.copy(i.position),t?.rotation?e.rotation.set(t.rotation[0],t.rotation[1],t.rotation[2],i.rotation.order):e.rotation.copy(i.rotation),t?.scale?e.scale.fromArray(t.scale):e.scale.copy(i.scale),e.updateMatrix())}function qt(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 Vo(e){let t=e,n=Number(t.clearcoat)>0,i=Number(t.sheen)>0,r=Number(t.anisotropy)>0,o=Number(t.transmission)>0,a=t.transparent===!1&&t.blending===zw&&t.alphaToCoverage!==!0;return[qt(t.map),qt(t.aoMap),qt(t.lightMap),qt(t.bumpMap),qt(t.normalMap,!0),t.normalMap?t.normalMapType:"",qt(t.displacementMap),qt(t.emissiveMap),qt(t.metalnessMap),qt(t.roughnessMap),r,qt(r?t.anisotropyMap:null),n,qt(n?t.clearcoatMap:null),qt(n?t.clearcoatNormalMap:null,!0),qt(n?t.clearcoatRoughnessMap:null),i,qt(i?t.sheenColorMap:null),qt(i?t.sheenRoughnessMap:null),qt(t.specularColorMap),qt(t.specularIntensityMap),o,qt(o?t.transmissionMap:null),qt(o?t.thicknessMap:null),qt(t.alphaMap),Number(t.alphaTest)>0,!!t.alphaHash,!!t.flatShading,!!t.dithering,t.side,a].join("|")}function qd({url:e,objectBindings:t,selectedItem:n,itemMaterials:i,onItemClick:r,onItemHover:o,onModelLoaded:a,onAnimationsReady:s,nodeRefsOut:c,onNodeRefsChange:l,materialRefsOut:u,panelHoveredItem:d,sceneConfig:p,zoomOnSelected:g=!0,highlightOnHover:f=!0,decoderConfig:v,modelFormat:P,explodeFactor:y=0,suspendBindingTransforms:h=!1}){let m=ml(e,v,P),S=Bw(R=>R.invalidate),[M,T]=Lw(null),E=an(null),{setCanvasCursor:b,restoreCanvasCursor:C}=Sl();Ut(()=>{f||(T(null),o?.(null),C())},[f,o,C]);let x=xn(()=>Gw.clone(m.scene),[m.scene]),k=xn(()=>No(x),[x]),I=k.nodesById;Ut(()=>{k.duplicateNames.size!==0&&console.warn("[react-immersive] Duplicate model node names were assigned unique binding IDs.",Object.fromEntries(k.duplicateNames))},[k]);let A=xn(()=>{let R=new WeakMap;return x.traverse(N=>{R.set(N,{position:N.position.clone(),rotation:N.rotation.clone(),scale:N.scale.clone()})}),R},[x]);Ut(()=>{let R=!1,N=null,H=null,Z=window,Y=Object.entries(I).filter(([,ut])=>Jn(ut)),se=new Ml,ae=[],rt=0;x.traverse(ut=>{Jn(ut)&&(ut.castShadow=!1,ut.receiveShadow=!0)});let st=()=>{if(R)return;let ut=new Set,pe=se.getSize(new Fi),gt=new Fi;for(let{name:Wt,box:on}of ae)on.getSize(gt),gt.x>pe.x*.7&>.z>pe.z*.7&>.y>pe.y*.4&&ut.add(Wt);x.traverse(Wt=>{if(!Jn(Wt))return;let on=Ua(Wt);Wt.castShadow=!on||!ut.has(on),Wt.receiveShadow=!0}),S()},fe=()=>{R||(Z.requestIdleCallback?N=Z.requestIdleCallback(De,{timeout:100}):H=window.setTimeout(()=>De(),0))},De=ut=>{if(N=null,H=null,R)return;let pe=performance.now(),gt=0;for(;rt<Y.length&&!(gt>0&&!(ut?ut.didTimeout?gt<16:ut.timeRemaining()>1:performance.now()-pe<8));){let[Wt,on]=Y[rt];rt+=1,gt+=1;let Et=new Ml().setFromObject(on);Et.isEmpty()||(ae.push({name:Wt,box:Et}),se.union(Et))}rt<Y.length?fe():st()};return fe(),()=>{R=!0,N!==null&&Z.cancelIdleCallback?.(N),H!==null&&window.clearTimeout(H)}},[S,I,x]),Ut(()=>{Xa(x)},[x]),Ut(()=>{let R=new AbortController;return _o(x,R.signal),()=>{R.abort(),Bi(x)}},[x]);let z=xn(()=>{let R={};for(let[N,H]of Object.entries(t))R[H.modelObjectId??N]=N;return R},[t]),_=xn(()=>Object.entries(t).map(([R,N])=>`${R}${N.modelObjectId??R}`).sort().join(""),[t]),F=xn(()=>Object.entries(t).map(([R,N])=>JSON.stringify([R,N.modelObjectId??R,N.transform??null])).sort().join(""),[t]),j=an(new Map);Ut(()=>{let R=new Map,N=new Map;for(let[Y,se]of Object.entries(t)){if(!se.transform)continue;let ae=I[se.modelObjectId??Y];ae&&(R.set(ae,se.transform),N.set(ae,zo(ae)))}let H=new Set([...j.current.keys(),...R.keys()]);for(let Y of H){Pl(Y,void 0,A);for(let se of zo(Y))jo(se)}x.updateMatrixWorld(!0);let Z=new Map;for(let Y of N.values())for(let se of Y)Z.has(se)||Z.set(se,se.matrixWorld.clone());for(let[Y,se]of R)Pl(Y,se,A);j.current=R,x.updateMatrixWorld(!0);for(let[Y,se]of Z)Cl(Y,se);S()},[x,I,A,F,S]),Ut(()=>()=>{for(let R of zo(x))jo(R)},[x]);let L=xn(()=>{let R={};for(let[N,H]of Object.entries(t)){let Z=H.modelObjectId??N,Y=I[Z];if(!Jn(Y))continue;let se=$a(Y);se&&(R[N]=Pr(se,ae=>{let rt=Io(ae),st=fl(rt??new Ow);return bl(st),st}))}return R},[I,_]);Ut(()=>{u&&(u.current=L)},[L,u]),Ut(()=>()=>{for(let R of Object.values(L))Qn(R,N=>N.dispose())},[L]);let B=p?.model.shading??"lit",G=p?.model.renderer??"pbr",U=p?.wireframe.enabled??!1,oe=p?.wireframe.color??"#93c5fd",xe=p?.wireframe.opacity??1,le=xn(()=>{let R={};if(B!=="unlit")return R;for(let[N,H]of Object.entries(L))R[N]=Pr(H,Z=>{let Y=new Xd;return Y.color.copy(Z.color),Y.map=Z.map,Y.alphaMap=Z.alphaMap,Y.alphaTest=Z.alphaTest,Y.transparent=Z.transparent,Y.opacity=Z.opacity,Y.side=Z.side,Y});return R},[L,B]),ge=xn(()=>{let R={};if(B!=="normals")return R;for(let[N,H]of Object.entries(L))R[N]=Pr(H,()=>new Dw);return R},[L,B]),we=xn(()=>{let R={};if(B!=="lit"||G!=="matcap")return R;let N=el();for(let[H,Z]of Object.entries(L))R[H]=Pr(Z,Y=>{let se=new Nw;return se.matcap=N,se.color.copy(Y.color),se.alphaMap=Y.alphaMap,se.alphaTest=Y.alphaTest,se.side=Y.side,se});return R},[L,B,G]);Ut(()=>()=>{for(let R of Object.values(le))Qn(R,N=>N.dispose());for(let R of Object.values(ge))Qn(R,N=>N.dispose());for(let R of Object.values(we))Qn(R,N=>N.dispose())},[le,ge,we]);let Me=R=>B==="normals"?ge[R]:B==="unlit"?le[R]:G==="matcap"?we[R]:L[R],ne=an(a);ne.current=a,Ut(()=>{ne.current?.(x)},[x]);let pt=xn(()=>{let R={};for(let[N,H]of Object.entries(t)){let Z=H.modelObjectId??N,Y=I[Z];Y&&(R[N]=Y)}return R},[I,_]);Ut(()=>(c.current=pt,l?.(),()=>{c.current===pt&&(c.current={})}),[pt,c,l]);let Ee=an({});Ut(()=>()=>{for(let R of Object.values(Ee.current))for(let[N,H]of Object.entries(R))H&&Ii(H,Vi(N));Ee.current={}},[]);let Ae=xn(()=>{let R=new Map;for(let[N,H]of Object.entries(t)){let Z=d===H||d?.id===H.id||d?.modelObjectId===H.modelObjectId,Y=f&&(M===N||Z),se=Y||n===N;(Y||se)&&R.set(N,{emissive:Y,matcap:se})}return R},[t,f,M,n,d]),Be=an(Ae);Be.current=Ae,Ut(()=>{let R=new Set;for(let[N,H]of Object.entries(t)){R.add(N);let Z=H.modelObjectId??N,Y=I[Z];if(!Jn(Y))continue;Y.visible=H.visible!==!1;let se=L[N];if(!se)continue;if(G!=="uv-checker"){let pe=Me(N);pe&&(Y.material=pe)}if(H.visible===!1)continue;let ae=le[N],rt=we[N],st=i[N]??i[H.modelObjectId??N],fe=H.style?.material,De=Ee.current[N]??{};for(let pe of Wa){let gt=kt(fe,pe),Wt=De[pe];if(Wt===gt)continue;let on=Vi(pe);Wt&&Ii(Wt,on),gt?(Zs(gt,on,S),De[pe]=gt):delete De[pe]}Object.keys(De).length>0?Ee.current[N]=De:delete Ee.current[N];let ut=st?.hex??fe?.baseColor;Qn(se,(pe,gt)=>{let Wt=Vo(pe);vl(pe,fe,ut);let on=pe.userData.reactImmersiveConfiguredEmissive;on?.isColor?on.copy(pe.emissive):pe.userData.reactImmersiveConfiguredEmissive=pe.emissive.clone();let Et=Be.current.get(N);Et?.emissive&&pe.emissive.add(za),Wt!==Vo(pe)&&(pe.needsUpdate=!0);let zt=wl(ae,gt);if(zt){let wr=Vo(zt);zt.color.copy(pe.color),zt.map=pe.map,zt.alphaMap=pe.alphaMap,zt.alphaTest=pe.alphaTest,zt.transparent=pe.transparent,zt.opacity=pe.opacity,zt.side=pe.side,wr!==Vo(zt)&&(zt.needsUpdate=!0)}let Ke=wl(rt,gt);if(Ke){let wr=Vo(Ke);Et?.matcap?Ke.color.set(jr.color):Ke.color.copy(pe.color),Ke.map=pe.map,Ke.alphaMap=pe.alphaMap,Ke.alphaTest=pe.alphaTest,Ke.transparent=pe.transparent,Ke.opacity=pe.opacity,Ke.side=pe.side,wr!==Vo(Ke)&&(Ke.needsUpdate=!0)}})}for(let N of Object.keys(Ee.current))if(!R.has(N)){for(let[H,Z]of Object.entries(Ee.current[N]))Z&&Ii(Z,Vi(H));delete Ee.current[N]}S()},[t,I,L,le,ge,we,i,B,G,S]);let Ve=an(new Map);Ut(()=>{let R=Ve.current,N=new Set([...R.keys(),...Ae.keys()]),H=!1;for(let Z of N){let Y=R.get(Z),se=Ae.get(Z),ae=!!Y?.emissive!=!!se?.emissive,rt=!!Y?.matcap!=!!se?.matcap;if(!ae&&!rt)continue;H=!0;let st=L[Z],fe=we[Z];st&&Qn(st,(De,ut)=>{let pe=De.userData.reactImmersiveConfiguredEmissive;ae&&pe?.isColor&&(De.emissive.copy(pe),se?.emissive&&De.emissive.add(za));let gt=wl(fe,ut);rt&>&&(se?.matcap?gt.color.set(jr.color):gt.color.copy(De.color))})}Ve.current=Ae,H&&S()},[Ae,L,we,S]),Ut(()=>{if(G!=="uv-checker")return;let R=dm(),N=[];return x.traverse(H=>{if(!Jn(H))return;let Z=H.material,Y=Array.isArray(Z)?Z:[Z],se=!!H.geometry.getAttribute("uv"),ae=Y.map((st,fe)=>{let De=new Xd({color:se?"#ffffff":"#ff00ff",map:se?R:null,side:st.side});return De.name=`${H.name||"mesh"}-uv-checker-${fe}`,De.toneMapped=!1,De}),rt=Array.isArray(Z)?ae:ae[0];H.material=rt,N.push({node:H,original:Z,diagnostic:rt})}),S(),()=>{for(let{node:H,original:Z,diagnostic:Y}of N){H.material=Z;let se=Array.isArray(Y)?Y:[Y];for(let ae of se)ae.dispose()}S()}},[x,G,S]),Ut(()=>{if(!U)return;let R=[];for(let[N,H]of Object.entries(t)){let Z=H.modelObjectId??N,Y=I[Z];if(!Jn(Y))continue;let se=new Xd({color:oe,wireframe:!0,transparent:!0,opacity:xe,depthTest:!1,depthWrite:!1,side:Iw,toneMapped:!1}),ae=Y.clone(!1);ae.name="",ae.position.set(0,0,0),ae.quaternion.identity(),ae.scale.set(1,1,1),ae.matrix.identity(),ae.matrixAutoUpdate=!0,ae.material=se,ae.castShadow=!1,ae.receiveShadow=!1,ae.frustumCulled=!1,ae.renderOrder=1,ae.userData={isWireframeOverlay:!0},ae.raycast=()=>{},Y.morphTargetInfluences&&(ae.morphTargetInfluences=Y.morphTargetInfluences),Y.add(ae),R.push({node:Y,overlay:ae})}return S(),()=>{for(let{node:N,overlay:H}of R)N.remove(H),H.material.dispose()}},[U,oe,xe,I,t,S]);let Fe=xn(()=>qm(m.animations),[m.animations]),At=an(s);At.current=s;let Le=an(p);Le.current=p;let jt=an(null),St=an({}),Oe=an(null),re=an(null),$=an(1),q=an(new Set),Te=an(0),ze=()=>({currentClip:re.current,isPlaying:Oe.current?.paused===!1,speed:$.current,time:Oe.current?.time??0,duration:Oe.current?.getClip().duration??0}),Pe=()=>{let R=ze();q.current.forEach(N=>N(R))},ce=(R,N)=>{let H=eg(N);R.setLoop(H==="once"?Vw:Fw,H==="once"?1:1/0),R.clampWhenFinished=H==="once";let Z=Gd(N?.speed??$.current);$.current=Z,R.setEffectiveTimeScale(Z)},He=()=>{Oe.current?.stop(),Oe.current=null,re.current=null,Pe(),S()},nt=()=>{Oe.current&&(Oe.current.paused=!0,Pe(),S())},dt=R=>{let N=Gd(R);$.current=N,Oe.current?.setEffectiveTimeScale(N),Pe()},Nn=R=>{let N=Oe.current;if(!N)return;let H=N.getClip().duration;N.time=Math.min(Math.max(R,0),H),jt.current?.update(0),Pe(),S()},hn=R=>{let N=St.current[R];if(!N)return;let H=gl(Le.current,R);if(!H?.hidden){if(Oe.current===N&&N.paused){ce(N,H),N.paused=!1,re.current=R,Pe(),S();return}Oe.current&&Oe.current!==N&&Oe.current.stop(),ce(N,H),N.paused=!1,N.enabled=!0,N.reset().play(),Oe.current=N,re.current=R,Pe(),S()}};Ut(()=>{let R=new jw(x);jt.current=R;let N={};for(let{clip:ae,sourceName:rt}of Fe)N[rt]=R.clipAction(ae);St.current=N;let H=ae=>{ae.action&&ae.action===Oe.current&&He()};R.addEventListener("finished",H);let Z=()=>{};At.current?.({clips:Fe.map(({sourceName:ae})=>ae),clipDetails:Fe.map(({sourceName:ae,duration:rt})=>({sourceName:ae,duration:rt})),play:Fe.length?hn:Z,pause:Fe.length?nt:Z,stop:Fe.length?He:Z,setSpeed:Fe.length?dt:Z,seek:Fe.length?Nn:Z,getState:ze,subscribe:ae=>(q.current.add(ae),ae(ze()),()=>{q.current.delete(ae)})}),$.current=1,Pe();let Y=Le.current?.animations.autoplayClip,se=Y?gl(Le.current,Y):void 0;return Y&&!se?.hidden&&hn(Y),()=>{R.removeEventListener("finished",H),R.stopAllAction(),R.uncacheRoot(x),jt.current=null,St.current={},Oe.current=null,re.current=null,$.current=1,Pe()}},[x,Fe]),Ut(()=>{let R=re.current,N=Oe.current;if(!R||!N||!p?.animations)return;let H=gl(p,R);if(H?.hidden){He();return}H&&(ce(N,H),Pe())},[p?.animations]),$d((R,N)=>{if(jt.current&&Oe.current?.paused===!1){if(jt.current.update(N),!h)for(let[H,Z]of j.current)Pl(H,Z,A);S(),Te.current+=N,Te.current>=.066&&(Te.current=0,Pe(),Xa(x))}});let Ce=xn(()=>(p?.model.rotation??[0,0,0]).map(R=>R*Math.PI/180),[p?.model.rotation]);$d((R,N)=>{if(!E.current)return;let H=E.current.rotation;H.x=Tl.lerp(H.x,Ce[0],1-Math.exp(-5*N)),H.y=Tl.lerp(H.y,Ce[1],1-Math.exp(-5*N)),H.z=Tl.lerp(H.z,Ce[2],1-Math.exp(-5*N)),Math.abs(H.x-Ce[0])<1e-4&&Math.abs(H.y-Ce[1])<1e-4&&Math.abs(H.z-Ce[2])<1e-4||S()});let Ye=an([]),at=an(0),Re=an(0),Mt=xn(()=>new Fi,[]);Ut(()=>{let R=new Map;for(let[st,fe]of Object.entries(t)){let De=I[fe.modelObjectId??st];De&&R.set(De,fe)}for(let st of Ye.current)Pl(st.node,R.get(st.node)?.transform,A);Re.current=0,x.updateWorldMatrix(!0,!0);let N=new Ml().setFromObject(x),H=N.getCenter(new Fi),Z=N.getSize(new Fi).length()*.5;at.current=Number.isFinite(Z)?Z:0;let Y=[...R.keys()],se=new Set(Y),ae=[],rt=new Fi;for(let st of Y){if(!st.parent)continue;let fe=st.parent,De=!1;for(;fe;){if(se.has(fe)){De=!0;break}fe=fe.parent}if(De)continue;let ut=new Ml().setFromObject(st);if(ut.isEmpty())continue;ut.getCenter(rt);let pe=rt.clone().sub(H);pe.lengthSq()<1e-8||(pe.normalize(),ae.push({node:st,restLocalPos:st.position.clone(),restWorldPos:st.getWorldPosition(new Fi),worldDir:pe,parentInverse:new Uw().copy(st.parent.matrixWorld).invert()}))}Ye.current=ae,S()},[x,I,_,F,A,S]),Ut(()=>{S()},[y,S]),$d((R,N)=>{let H=Ye.current;if(H.length===0)return;let Z=Math.min(Math.max(y,0),1),Y=Re.current;if(Math.abs(Y-Z)<1e-4){if(Y===Z)return;Re.current=Z}else Re.current=Tl.lerp(Y,Z,1-Math.exp(-6*N)),S();let se=Re.current*at.current;for(let ae of H)Mt.copy(ae.worldDir).multiplyScalar(se).add(ae.restWorldPos).applyMatrix4(ae.parentInverse),ae.node.position.copy(Mt)});let mt=R=>{let N=R;for(;N;){let H=Ua(N),Z=H?z[H]:void 0;if(Z&&t[Z])return[Z,t[Z]];N=N.parent}return null},Tt=R=>{let N=mt(R.object);if(!N)return;let[,H]=N;H.selectable!==!1&&(R.stopPropagation(),r(H))},Rt=R=>{if(!f)return;let N=mt(R.object);if(!N)return;let[H,Z]=N;Z.hoverable!==!1&&(R.stopPropagation(),b("pointer"),T(H),o?.(Z))},cr=R=>{f&&(R.stopPropagation(),C(),T(null),o?.(null))},ue=xn(()=>!Ws(x),[x]);return ig("group",{ref:E,children:ig("primitive",{object:x,...ue?{onClick:Tt,...f?{onPointerOver:Rt,onPointerOut:cr}:{}}:{}})})}import{useCallback as $i,useEffect as Xi,useMemo as US,useRef as er,useState as _u}from"react";import{useFrame as GS,useThree as HS}from"@react-three/fiber";import{Box3 as pg,BoxGeometry as Zw,Group as dg,Matrix4 as hg,Mesh as eC,MeshBasicMaterial as tC,Vector3 as Ur}from"three";import{MeshBasicMaterial as Hw,MeshMatcapMaterial as Ww,MeshNormalMaterial as $w,MeshStandardMaterial as Xw,Vector3 as og}from"three";function ag(e){let t={};for(let[n,i]of Object.entries(e))t[i.modelObjectId??n]=n;return t}function Kd(e){let t=e,n=null;for(;t;){let i=t.userData?.ri_name;if(typeof i=="string"&&i)return i;!n&&t.name&&(n=t.name),t=t.parent}return n}function sg(e,t){return e||(t?t.modelObjectId??t.id:null)}function kl(e,t){let n=Kd(e);if(!n)return null;let i=t.keyByModelObject[n]??n,r=t.objectBindings[i];return r?{key:i,binding:r}:null}var Fo=new og,Yd=new og;function _l(e,t){if(!Jn(e)&&!e.userData.riLogicalObject)return;let n=kl(e,t);if(!n)return;let i=lg(e);if(i.rest??(i.rest={position:e.position.clone(),rotation:e.rotation.clone(),scale:e.scale.clone()}),t.suspendTransforms)return;let r=i.rest,o=n.binding.transform;o?.position?e.position.fromArray(o.position):e.position.copy(r.position),o?.rotation?e.rotation.set(o.rotation[0],o.rotation[1],o.rotation[2],r.rotation.order):e.rotation.copy(r.rotation),o?.scale?e.scale.fromArray(o.scale):e.scale.copy(r.scale);let a=t.explode;if(a&&a.factor>0&&a.radius>0){e.updateWorldMatrix(!0,!1),Yd.setFromMatrixPosition(e.matrixWorld);let s=e;for(;s.parent&&!s.userData.ri_name;)s=s.parent;let c=s.userData.ri_center;Array.isArray(c)&&c.length===3?Fo.fromArray(c).applyMatrix4(e.matrixWorld).sub(a.centre):Fo.copy(Yd).sub(a.centre),Fo.lengthSq()>1e-8&&(Fo.normalize().multiplyScalar(a.factor*a.radius).add(Yd),e.parent&&e.parent.worldToLocal(Fo),e.position.copy(Fo))}e.updateMatrix(),e.updateWorldMatrix(!0,!1)}function Uo(e,t){e.traverse(n=>_l(n,t))}function lg(e){var t;return(t=e.userData).riVisuals??(t.riVisuals={}),e.userData.riVisuals}function qw(e,t,n,i){return JSON.stringify([e?.style?.material??null,t??null,n.shadingMode,n.rendererMode,i])}function Yw(e){if(e.textures){for(let t of Wa){let n=e.textures[t];n&&Ii(n,Vi(t))}e.textures=void 0}}function Kw(e,t,n){let i=e.textures??{};for(let r of Wa){let o=kt(t,r),a=i[r];if(a===o)continue;let s=Vi(r);a&&Ii(a,s),o?(Zs(o,s,n),i[r]=o):delete i[r]}e.textures=Object.keys(i).length>0?i:void 0}function Jw(e,t){if(t.shadingMode==="normals")return Pr(e,()=>new $w);if(t.shadingMode==="unlit")return Pr(e,n=>{let i=new Hw;return i.color.copy(n.color),i.map=n.map,i.alphaMap=n.alphaMap,i.alphaTest=n.alphaTest,i.transparent=n.transparent,i.opacity=n.opacity,i.side=n.side,i});if(t.rendererMode==="matcap"){let n=el();return Pr(e,i=>{let r=new Ww;return r.matcap=n,r.color.copy(i.color),r.alphaMap=i.alphaMap,r.alphaTest=i.alphaTest,r.side=i.side,r})}return e}function Qw(e,t){if(!Jn(e))return;let i=lg(e);i.original??(i.original=$a(e));let r=kl(e,t);if(!r){i.original&&(e.material=i.original),e.visible=!0;return}let{key:o,binding:a}=r;e.visible=a.visible!==!1,_l(e,t);let s=t.itemMaterials?.[o]?.hex??t.itemMaterials?.[a.modelObjectId??o]?.hex,c=o===t.selectedKey||t.highlightOnHover!==!1&&o===t.hoveredKey,l=qw(a,s,t,c);if(i.signature===l&&i.display){e.material=i.display;return}let u=a.style?.material;if(Kw(i,u,t.invalidate),!i.physical){let d=i.original??$a(e);if(!d)return;i.physical=Pr(d,p=>{let g=Io(p),f=fl(g??new Xw);return bl(f),f})}Qn(i.physical,d=>{vl(d,u,s??u?.baseColor),c&&(d.emissive.add(za),d.color.lerp(rm,im)),d.needsUpdate=!0}),i.display&&i.display!==i.physical&&Qn(i.display,d=>d.dispose()),i.display=Jw(i.physical,t),i.signature=l,e.material=i.display}function cg(e,t){e.traverse(n=>Qw(n,t))}function Jd(e){e.traverse(t=>{if(!Jn(t))return;let n=t.userData.riVisuals;n&&(n.rest&&(t.position.copy(n.rest.position),t.rotation.copy(n.rest.rotation),t.scale.copy(n.rest.scale),t.updateMatrix()),n.original&&(t.material=n.original),n.display&&n.display!==n.physical&&Qn(n.display,i=>i.dispose()),n.physical&&Qn(n.physical,i=>i.dispose()),Yw(n),delete t.userData.riVisuals)})}var mg=new hg().makeRotationX(Math.PI/2),ug=mg.clone().invert();function nC(e){let t=new Ur(e[0],e[1],e[2]),n=new Ur(Math.abs(e[3])+Math.abs(e[6])+Math.abs(e[9]),Math.abs(e[4])+Math.abs(e[7])+Math.abs(e[10]),Math.abs(e[5])+Math.abs(e[8])+Math.abs(e[11]));return new pg(t.clone().sub(n),t.clone().add(n))}function rC(e){let t=e.getCenter(new Ur),n=e.getSize(new Ur).multiplyScalar(.5);return[t.x,t.y,t.z,n.x,0,0,0,n.y,0,0,0,n.z]}var Al=class{constructor(){this.group=new dg;this.objects=new Map;this.geometry=new Zw(1,1,1);this.material=new tC;this.originalBounds=new WeakMap;this.signature="";this.lastContext=null;this.lastEffective=null;this.lastDragging=!1;this.version=0;this.tileVersions=new WeakMap;this.transforms=new Map}setCatalog(t){this.group.clear(),this.objects.clear();for(let n of t){let i=new pg(new Ur(...n.minimum),new Ur(...n.maximum)).applyMatrix4(ug),r=new dg;r.name=n.name,r.userData.ri_name=n.name,r.userData.riLogicalObject=!0,r.userData.ri_center=i.getCenter(new Ur).toArray();let o=new eC(this.geometry,this.material);o.visible=!1,o.raycast=()=>{},o.position.copy(i.getCenter(new Ur)),o.scale.copy(i.getSize(new Ur)),r.add(o),this.group.add(r),this.objects.set(n.name,r)}this.signature="",this.lastContext=null}nodesByBinding(t){let n={};for(let[i,r]of this.objects){let o=t.keyByModelObject[i]??i;t.objectBindings[o]&&(n[o]=r)}return n}sync(t,n,i=!1){if(!i&&!this.lastDragging&&t===this.lastContext&&this.lastEffective)return this.lastEffective;this.lastContext=t,this.lastDragging=i;let r={...t,suspendTransforms:!1},o=n?t.objectBindings[n]:void 0,a=o?this.objects.get(o.modelObjectId??n):void 0;i&&a&&o&&(r={...r,objectBindings:{...t.objectBindings,[n]:{...o,transform:{position:a.position.toArray(),rotation:[a.rotation.x,a.rotation.y,a.rotation.z],scale:a.scale.toArray()}}}});for(let c of this.objects.values())i&&c===a||_l(c,r);this.group.updateWorldMatrix(!0,!0);let s=[...this.objects].map(([c,l])=>`${c}:${l.matrix.elements.join(",")}`).join(";");if(s!==this.signature){this.signature=s,this.version++,this.transforms.clear();for(let[c,l]of this.objects)l.matrix.equals(new hg)||this.transforms.set(c,mg.clone().multiply(l.matrix).multiply(ug))}return this.lastEffective=r,r}updateBounds(t){if(!t)return;let n=i=>{if(this.tileVersions.get(i)!==this.version){if(i.boundingVolume.box&&this.tileVersions.get(i)!==this.version){let r=this.originalBounds.get(i);r||(r={box:[...i.boundingVolume.box],error:i.geometricError},this.originalBounds.set(i,r));let o=nC(r.box),a=o.clone(),s=1;for(let l of i.extras?.featureIds??[]){let u=this.transforms.get(l);u&&(a.union(o.clone().applyMatrix4(u)),s=Math.max(s,u.getMaxScaleOnAxis()))}let c=rC(a);i.boundingVolume.box=c,i.geometricError=r.error*s,i.engineData?.boundingVolume?.setObbData(c,i.engineData.transform),this.tileVersions.set(i,this.version)}i.children?.forEach(n)}};n(t)}dispose(){this.group.clear(),this.objects.clear(),this.geometry.dispose(),this.material.dispose()}};function iC(e){try{let t=typeof location<"u"?location.href:void 0;return new URL(e,t).origin}catch{return null}}function gg(e){if(!e)return null;let t=e.length,n=e.indexOf("?"),i=e.indexOf("#");n!==-1&&(t=Math.min(t,n)),i!==-1&&(t=Math.min(t,i));let r=e.lastIndexOf(".",t),o=e.lastIndexOf("/",t),a=e.indexOf("://");return a!==-1&&a+2===o||r===-1||r<o?null:e.substring(r+1,t)||null}var El,Ll=(El=class{static setXRSession(e){e!==this.session&&(this.flushPending(),this.session=e)}static requestAnimationFrame(e){let{session:t,pending:n}=this,i,r=()=>{n.delete(i),e()};return i=t?t.requestAnimationFrame(r):requestAnimationFrame(r),n.set(i,e),i}static cancelAnimationFrame(e){let{pending:t,session:n}=this;t.delete(e),n?n.cancelAnimationFrame(e):cancelAnimationFrame(e)}static flushPending(){this.pending.forEach((e,t)=>{e(),this.cancelAnimationFrame(t)})}},Jc(El,"pending",new Map),Jc(El,"session",null),El),fg=2**30,yg=class{get unloadPriorityCallback(){return this._unloadPriorityCallback}set unloadPriorityCallback(e){e.length===1?(console.warn('LRUCache: "unloadPriorityCallback" function has been changed to take two arguments.'),this._unloadPriorityCallback=(t,n)=>{let i=e(t),r=e(n);return i<r?-1:+(i>r)}):this._unloadPriorityCallback=e}constructor(){this.minSize=6e3,this.maxSize=8e3,this.minBytesSize=.3*fg,this.maxBytesSize=.4*fg,this.unloadPercent=.05,this.autoMarkUnused=!0,this.cachedBytes=0,this.itemSet=new Map,this.itemList=[],this.usedSet=new Set,this.callbacks=new Map,this.unloadingHandle=-1,this.bytesMap=new Map,this.loadedSet=new Set,this._unloadPriorityCallback=null;let e=this.itemSet;this.defaultPriorityCallback=t=>e.get(t)}isFull(){return this.itemSet.size>=this.maxSize||this.cachedBytes>=this.maxBytesSize}getMemoryUsage(e){return this.bytesMap.get(e)||0}setMemoryUsage(e,t){let{bytesMap:n,itemSet:i}=this;i.has(e)&&(this.cachedBytes-=n.get(e)||0,n.set(e,t),this.cachedBytes+=t)}add(e,t){let n=this.itemSet;if(n.has(e)||this.isFull())return!1;let i=this.usedSet,r=this.itemList,o=this.callbacks;return r.push(e),i.add(e),n.set(e,Date.now()),o.set(e,t),!0}has(e){return this.itemSet.has(e)}remove(e){let t=this.usedSet,n=this.itemSet,i=this.itemList,r=this.bytesMap,o=this.callbacks,a=this.loadedSet;if(n.has(e)){this.cachedBytes-=r.get(e)||0,r.delete(e),o.get(e)(e);let s=i.indexOf(e);return i.splice(s,1),t.delete(e),n.delete(e),o.delete(e),a.delete(e),!0}return!1}setLoaded(e,t){let{itemSet:n,loadedSet:i}=this;n.has(e)&&(t===!0?i.add(e):i.delete(e))}markUsed(e){let t=this.itemSet,n=this.usedSet;t.has(e)&&!n.has(e)&&(t.set(e,Date.now()),n.add(e))}markUnused(e){this.usedSet.delete(e)}markAllUnused(){this.usedSet.clear()}isUsed(e){return this.usedSet.has(e)}unloadUnusedContent(){let{unloadPercent:e,minSize:t,maxSize:n,itemList:i,itemSet:r,usedSet:o,loadedSet:a,callbacks:s,bytesMap:c,minBytesSize:l,maxBytesSize:u}=this,d=i.length-o.size,p=i.length-a.size,g=Math.max(Math.min(i.length-t,d),0),f=this.cachedBytes-l,v=this.unloadPriorityCallback||this.defaultPriorityCallback,P=!1,y=g>0&&d>0||p&&i.length>n;if(d&&this.cachedBytes>l||p&&this.cachedBytes>u||y){i.sort((b,C)=>{let x=o.has(b);if(x===o.has(C)){let k=a.has(b);return k===a.has(C)?-v(b,C):k?1:-1}else return x?1:-1});let h=Math.max(t*e,g*e),m=Math.ceil(Math.min(h,d,g)),S=Math.max(e*f,e*l),M=Math.min(S,f),T=0,E=0;for(;this.cachedBytes-E>u||i.length-T>n;){let b=i[T],C=c.get(b)||0;if(o.has(b)&&a.has(b)||this.cachedBytes-E-C<u&&i.length-T<=n)break;E+=C,T++}for(;E<M||T<m;){let b=i[T],C=c.get(b)||0;if(o.has(b)||this.cachedBytes-E-C<l&&T>=m)break;E+=C,T++}i.splice(0,T).forEach(b=>{this.cachedBytes-=c.get(b)||0,s.get(b)(b),c.delete(b),r.delete(b),s.delete(b),a.delete(b),o.delete(b)}),P=T<g||E<f&&T<d,P&&(P=T>0)}P&&(this.unloadingHandle=Ll.requestAnimationFrame(()=>this.scheduleUnload()))}scheduleUnload(){Ll.cancelAnimationFrame(this.unloadingHandle),this.scheduled||(this.scheduled=!0,queueMicrotask(()=>{this.scheduled=!1,this.unloadUnusedContent()}))}},oC=class extends DOMException{constructor(){super("PriorityQueue: Item removed","AbortError")}},Go=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=>{Ll.requestAnimationFrame(e)},this._runjobs=()=>{this.scheduled=!1,this.tryRunJobs()}}sort(){let e=this.priorityCallback,t=this.items;e!==null&&t.sort(e)}has(e){return this.callbacks.has(e)}add(e,t){let n={callback:t,reject:null,resolve:null,promise:null};return n.promise=new Promise((i,r)=>{let o=this.items,a=this.callbacks;n.resolve=i,n.reject=r,o.unshift(e),a.set(e,n),this.autoUpdate&&this.scheduleJobRun()}),n.promise}remove(e){let t=this.items,n=this.callbacks,i=t.indexOf(e);if(i!==-1){let r=n.get(e);r.promise.catch(o=>{if(o.name!=="AbortError")throw o}),r.reject(new oC),t.splice(i,1),n.delete(e)}}removeByFilter(e){let{items:t}=this;for(let n=0;n<t.length;n++){let i=t[n];e(i)&&(this.remove(i),n--)}}tryRunJobs(){this.sort();let e=this.items,t=this.callbacks,n=this.maxJobs,i=0,r=()=>{this.currJobs--,this.autoUpdate&&this.scheduleJobRun()};for(;n>this.currJobs&&e.length>0&&i<n;){this.currJobs++,i++;let o=e.pop(),{callback:a,resolve:s,reject:c}=t.get(o);t.delete(o);let l;try{l=a(o)}catch(u){c(u),r();continue}l instanceof Promise?l.then(s).catch(c).finally(r):(s(l),r())}}flush(e){let{items:t,callbacks:n}=this,i=t.indexOf(e);if(!n.has(e))return;let{callback:r,resolve:o,reject:a}=n.get(e);n.delete(e),t.splice(i,1);let s;try{s=r(e)}catch(c){a(c);return}return s instanceof Promise?s.then(o).catch(a):o(s),s}scheduleJobRun(){this.scheduled||(this.scheduled=(this._schedulingCallback(this._runjobs),!0))}},aC=class{get running(){for(let e of this.originQueues.values())if(e.running)return!0;return!1}get maxJobsPerOrigin(){return this._maxJobsPerOrigin}set maxJobsPerOrigin(e){this._maxJobsPerOrigin=e,this.originQueues.forEach(t=>t.maxJobs=e)}get maxJobs(){return this.maxJobsPerOrigin}set maxJobs(e){console.warn('DownloadPriorityQueue: "maxJobs" is no longer valid and limits jobs per server origin. Use "maxJobsPerOrigin", instead.'),this.maxJobsPerOrigin=e}get priorityCallback(){return this._priorityCallback}set priorityCallback(e){this._priorityCallback=e,this.originQueues.forEach(t=>t.priorityCallback=e)}constructor(){this.originQueues=new Map,this._itemQueues=new WeakMap,this._maxJobsPerOrigin=6,this._priorityCallback=null}add(e,t,n,i=null){this.originQueues.forEach((c,l)=>{c.running||this.originQueues.delete(l)});let r=e===null?null:iC(e),o=this.originQueues.get(r);o||(o=new Go,o.maxJobs=this._maxJobsPerOrigin,o.priorityCallback=this._priorityCallback,this.originQueues.set(r,o));let a=this._itemQueues.get(t);if(a&&a!==o&&a.has(t))throw Error("DownloadPriorityQueue: Item is already queued with a different url origin.");this._itemQueues.set(t,o);let s=o.add(t,n);return i!==null&&(i.aborted?this.remove(t):i.addEventListener("abort",()=>this.remove(t),{once:!0})),s}remove(e){let t=this._itemQueues.get(e);t&&(t.remove(e),this._itemQueues.delete(e))}has(e){let t=this._itemQueues.get(e);return!!(t&&t.has(e))}};var Ho=6378137,iE=1/298.257223563,vg=6356752314245179e-9,Rl={inView:!1,error:1/0,distanceFromCamera:1/0};function Dl(e){return e===4||e===-1}function Gr(e,t){return Nl(e)&&e.traversal.lastFrameVisited===t&&e.traversal.used}function Nl(e){return!!e.traversal}function Ka(e){let{children:t}=e,n=t.length===0||Nl(t[t.length-1]),i=!e.internal.hasUnrenderableContent||Dl(e.internal.loadingState);return n&&i}function Ui(e){return e.traversal.unconditionallyRefine}function Ya(e,t){if(Nl(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,Rl),e.traversal.inFrustum=Rl.inView,e.traversal.error=Rl.error,e.traversal.distanceFromCamera=Rl.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 Qd(e,t,n=!1){if(Ya(e,t),n?t.markTileUsed(e):Bl(e),Ui(e)&&Ka(e)){let i=e.children;for(let r=0,o=i.length;r<o;r++)Qd(i[r],t,n)}}function wg(e,t){if(Ya(e,t),e.traversal.usedLastFrame&&(Bl(e),e.traversal.wasSetActive&&(e.traversal.active=!0),(!e.traversal.active||Ui(e))&&Ka(e))){let n=e.children;for(let i=0,r=n.length;i<r;i++)wg(n[i],t)}}function Bl(e){e.traversal.used=!0}function sC(e,t){return!(e.traversal.error<=t.errorTarget&&!Ui(e)||t.maxDepth>0&&e.internal.depth+1>=t.maxDepth||!Ka(e))}function Cg(e,t){let{frameCount:n}=t,{children:i}=e;for(let r=0,o=i.length;r<o;r++){let a=i[r];Gr(a,n)&&(a.traversal.active&&(a.traversal.kicked=!0,a.traversal.active=!1),Cg(a,t))}}function bg(e){return!Ui(e)&&(!e.internal.hasContent||Dl(e.internal.loadingState))}function Sg(e,t){if(Ya(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(!sC(e,t)){Bl(e);return}let i=!1,r=!1,o=e.children;for(let a=0,s=o.length;a<s;a++){let c=o[a];Sg(c,t),i||(i=Gr(c,t.frameCount)),r||(r=c.traversal.inFrustum)}if(e.refine==="REPLACE"&&!r&&o.length!==0){e.traversal.inFrustum=!1,t.markTileUsed(e);for(let a=0,s=o.length;a<s;a++)Qd(o[a],t,!0);return}if(Bl(e),e.refine==="REPLACE"&&i&&(t.loadSiblings||t.loadAncestors))for(let a=0,s=o.length;a<s;a++)Qd(o[a],t)}function Mg(e,t){let n=t.frameCount;if(!Gr(e,n))return;let i=e.children,r=!1;for(let a=0,s=i.length;a<s;a++){let c=i[a];r||(r=Gr(c,n))}if(!r)e.traversal.isLeaf=!0;else{for(let s=0,c=i.length;s<c;s++)Mg(i[s],t);let a=!0;for(let s=0,c=i.length;s<c;s++){let l=i[s];if(Gr(l,n)){let u=!Ui(l),d=!l.internal.hasContent||Dl(l.internal.loadingState);u&&d||l.traversal.allChildrenLoaded||(a=!1)}}e.traversal.allChildrenLoaded=a}let o=!0;for(let a=0,s=i.length;a<s;a++){let c=i[a];Gr(c,t.frameCount)&&!c.traversal.allUsedChildrenProcessed&&(o=!1)}e.traversal.allUsedChildrenProcessed=o&&Ka(e)}function Tg(e,t){if(!Gr(e,t.frameCount))return;let n=e.children;if(e.refine==="REPLACE"&&t.loadAncestors&&!e.traversal.allChildrenLoaded&&!Ui(e)&&(e.traversal.isLeaf=!0),e.traversal.isLeaf){if(!Ui(e)&&(e.traversal.active=!0,Ka(e)&&e.internal.hasContent&&!Dl(e.internal.loadingState)))for(let r=0,o=n.length;r<o;r++)wg(n[r],t);return}let i=n.length>0;for(let r=0,o=n.length;r<o;r++){let a=n[r];Tg(a,t),Gr(a,t.frameCount)&&!(a.traversal.active&&bg(a))&&!a.traversal.allChildrenReady&&(i=!1)}e.traversal.allChildrenReady=i,e.refine==="REPLACE"&&!i&&e.traversal.wasSetActive&&bg(e)&&(e.traversal.active=!0,Cg(e,t))}function Pg(e,t){Ya(e,t);let n=Gr(e,t.frameCount);if(n&&(e.internal.hasUnrenderableContent&&(t.markTileUsed(e),t.queueTileForDownload(e)),e.internal.hasRenderableContent&&e.refine==="ADD"&&(e.traversal.active=!0),(e.traversal.active||e.traversal.kicked)&&e.internal.hasContent&&(t.markTileUsed(e),e.traversal.allUsedChildrenProcessed&&t.queueTileForDownload(e),e.internal.loadingState!==4&&(e.traversal.active=!1)),t.loadAncestors&&e.internal.hasContent&&(t.markTileUsed(e),t.queueTileForDownload(e)),e.internal.virtualChildCount>0&&e.internal.hasContent&&t.markTileUsed(e),e.traversal.visible=e.internal.hasRenderableContent&&e.traversal.active&&e.traversal.inFrustum&&e.internal.loadingState===4,t.stats.used++,e.traversal.inFrustum&&t.stats.inFrustum++),n||Nl(e)&&e.traversal.usedLastFrame){let i=!1,r=!1;n?(i=e.traversal.active,r=t.displayActiveTiles&&e.traversal.active||e.traversal.visible):Ya(e,t),e.internal.hasRenderableContent&&e.internal.loadingState===4?(i&&t.stats.active++,r&&t.stats.visible++,e.traversal.wasSetActive!==i&&t.invokeOnePlugin(a=>a.setTileActive&&a.setTileActive(e,i)),e.traversal.wasSetVisible!==r&&t.invokeOnePlugin(a=>a.setTileVisible&&a.setTileVisible(e,r))):e.internal.hasRenderableContent||(r=e.traversal.isLeaf,e.traversal.wasSetVisible!==r&&t.invokeOnePlugin(a=>a.setEmptyTileVisible&&a.setEmptyTileVisible(e,r))),e.traversal.visible=r,e.traversal.active=i;let o=e.children;for(let a=0,s=o.length;a<s;a++){let c=o[a];Pg(c,t)}}}function lC(e,t){Sg(e,t),Mg(e,t),Tg(e,t),Pg(e,t)}function cC(e){let t=null;return()=>{t===null&&(t=Ll.requestAnimationFrame(()=>{t=null,e()}))}}function dC(e,t=null,n=null){let i=[];for(i.push(e),i.push(null),i.push(0);i.length>0;){let r=i.pop(),o=i.pop(),a=i.pop();if(t&&t(a,o,r)){n&&n(a,o,r);return}let s=a.children;if(s)for(let c=s.length-1;c>=0;c--)i.push(s[c]),i.push(a),i.push(r+1);n&&n(a,o,r)}}var xg=Symbol("PLUGIN_REGISTERED"),ii={inView:!0,error:0,distance:1/0},uC=(e,t)=>{let n=e.priority||0,i=t.priority||0;return n===i?!e.traversal||!t.traversal?0:e.traversal.used===t.traversal.used?e.traversal.error===t.traversal.error?e.traversal.distanceFromCamera===t.traversal.distanceFromCamera?e.internal.depthFromRenderedParent===t.internal.depthFromRenderedParent?0:e.internal.depthFromRenderedParent>t.internal.depthFromRenderedParent?-1:1:e.traversal.distanceFromCamera>t.traversal.distanceFromCamera?-1:1:e.traversal.error>t.traversal.error?1:-1:e.traversal.used?1:-1:n>i?1:-1},pC=(e,t)=>e.traversal.used===t.traversal.used?e.traversal.inFrustum===t.traversal.inFrustum?e.internal.hasUnrenderableContent===t.internal.hasUnrenderableContent?e.traversal.distanceFromCamera===t.traversal.distanceFromCamera?e.internal.depthFromRenderedParent===t.internal.depthFromRenderedParent?0:e.internal.depthFromRenderedParent>t.internal.depthFromRenderedParent?-1:1:e.traversal.distanceFromCamera>t.traversal.distanceFromCamera?-1:1:e.internal.hasUnrenderableContent?1:-1:e.traversal.inFrustum?1:-1:e.traversal.used?1:-1,hC=(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,Ja=(e,t)=>{let n=e.priority??1/0,i=t.priority??1/0;if(n!==i)return n>i?1:-1;if(!e.internal||!t.internal)return 0;let r=e.internal.renderer,o=t.internal.renderer,a=!r.loadAncestors,s=!o.loadAncestors;return a&&s?pC(e,t):uC(e,t)},kg=new yg;kg.unloadPriorityCallback=hC;var Ol=new aC;Ol.maxJobsPerOrigin=25,Ol.priorityCallback=Ja;var Zd=new Go;Zd.maxJobs=5,Zd.priorityCallback=Ja;var eu=new Go;eu.maxJobs=25,eu.priorityCallback=(e,t)=>{let n=e.parent,i=t.parent;return n===i?0:n?i?Ja(n,i):-1:1};var _g=class{get root(){let e=this.rootTileset;return e?e.root:null}get loadProgress(){let{stats:e,isLoading:t}=this,n=e.queued+e.downloading+e.parsing,i=e.inCacheSinceLoad+ +!!t;return i===0?1:1-n/i}get downloadQueue(){return this._downloadQueue}set downloadQueue(e){if(e instanceof Go){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=kg,this.downloadQueue=Ol,this.parseQueue=Zd,this.processNodeQueue=eu,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=cC(()=>{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[xg]===!0)throw Error("TilesRendererBase: A plugin can only be registered to a single tileset");let t=this.plugins,n=e.priority||0,i=t.length;for(let r=0;r<t.length;r++)if((t[r].priority||0)>n){i=r;break}t.splice(i,0,e),e[xg]=!0,e.init&&e.init(this)}unregisterPlugin(e){let t=this.plugins;if(typeof e=="string"&&(e=this.getPluginByName(e)),t.includes(e)){let n=t.indexOf(e);return t.splice(n,1),e.dispose&&e.dispose(),!0}return!1}getPluginByName(e){return this.plugins.find(t=>t.name===e)||null}invokeOnePlugin(e){let t=[...this.plugins,this];for(let n=0;n<t.length;n++){let i=e(t[n]);if(i)return i}return null}invokeAllPlugins(e){let t=[...this.plugins,this],n=[];for(let i=0;i<t.length;i++){let r=e(t[i]);r&&n.push(r)}return n.length===0?null:Promise.all(n)}traverse(e,t,n=!0){this.root&&dC(this.root,(i,...r)=>(n&&this.ensureChildrenArePreprocessed(i,!0),e?e(i,...r):!1),t)}getAttributions(e=[]){return this.invokeAllPlugins(t=>t!==this&&t.getAttributions&&t.getAttributions(e)),e}update(){let{lruCache:e,usedSet:t,stats:n,root:i,downloadQueue:r,parseQueue:o,processNodeQueue:a}=this;if(this.rootLoadingState===0&&(this.rootLoadingState=2,this.invokeOnePlugin(l=>l.loadRootTileset&&l.loadRootTileset()).then(l=>{let u=this.rootURL;u!==null&&this.invokeAllPlugins(d=>u=d.preprocessURL?d.preprocessURL(u,null):u),this.rootLoadingState=4,this.rootTileset=l,this.dispatchEvent({type:"needs-update"}),this.dispatchEvent({type:"load-tileset",tileset:l,url:u}),this.dispatchEvent({type:"load-root-tileset",tileset:l,url:u})}).catch(l=>{this.rootLoadingState=-1,console.error(l),this.rootTileset=null,this.dispatchEvent({type:"load-error",tile:null,error:l,url:this.rootURL})})),!i)return;let s=null;if(this.invokeAllPlugins(l=>{if(l.doTilesNeedUpdate){let u=l.doTilesNeedUpdate();s=s===null?u:!!(s||u)}}),s===!1){this.dispatchEvent({type:"update-before"}),this.dispatchEvent({type:"update-after"});return}this.dispatchEvent({type:"update-before"}),n.inFrustum=0,n.used=0,n.active=0,n.visible=0,n.tilesProcessed=0,this.frameCount++,t.forEach(l=>e.markUnused(l)),t.clear(),this.prepareForTraversal(),lC(i,this),this.removeUnusedPendingTiles();let c=this.queuedTiles;c.sort(e.unloadPriorityCallback);for(let l=0,u=c.length;l<u&&!e.isFull();l++)this.requestTileContents(c[l]);c.length=0,e.scheduleUnload(),(r.running||o.running||a.running)===!1&&this.isLoading===!0&&(this.cachedSinceLoadComplete.clear(),n.inCacheSinceLoad=0,this.dispatchEvent({type:"tiles-load-end"}),this.isLoading=!1),this.dispatchEvent({type:"update-after"})}resetFailedTiles(){this.rootLoadingState===-1&&(this.rootLoadingState=0);let e=this.stats;e.failed!==0&&(this.traverse(t=>{t.internal.loadingState===-1&&(t.internal.loadingState=0)},null,!1),e.failed=0)}calculateTileViewErrorWithPlugin(e,t){this.calculateTileViewError(e,t);let{errorFalloff:n,errorFalloffDensity:i}=this;if(n>0&&Number.isFinite(t.distanceFromCamera)){let s=t.distanceFromCamera*i;t.error-=n*(1-Math.exp(-s*s))}let r=null,o=0,a=1/0;this.invokeAllPlugins(s=>{s!==this&&s.calculateTileViewError&&(ii.inView=!0,ii.error=0,ii.distance=1/0,s.calculateTileViewError(e,ii)&&(r===null&&(r=!0),r&&(r=ii.inView),ii.inView&&(a=Math.min(a,ii.distance),o=Math.max(o,ii.error))))}),t.inView&&r!==!1?(t.error=Math.max(t.error,o),t.distanceFromCamera=Math.min(t.distanceFromCamera,a)):r?(t.inView=!0,t.error=o,t.distanceFromCamera=a):t.inView=!1}dispose(){[...this.plugins].forEach(n=>{this.unregisterPlugin(n)});let e=this.lruCache,t=[];this.traverse(n=>(t.push(n),!1),null,!1);for(let n=0,i=t.length;n<i;n++)e.remove(t[n]);this.stats={queued:0,parsing:0,downloading:0,failed:0,inFrustum:0,traversed:0,used:0,active:0,visible:0},this.frameCount=0,this.loadingTiles.clear()}calculateBytesUsed(e,t){return 0}dispatchEvent(e){}addEventListener(e,t){}removeEventListener(e,t){}parseTile(e,t,n){return null}prepareForTraversal(){}disposeTile(e){e.traversal.visible&&(e.internal.hasRenderableContent?this.invokeOnePlugin(n=>n.setTileVisible&&n.setTileVisible(e,!1)):this.invokeOnePlugin(n=>n.setEmptyTileVisible&&n.setEmptyTileVisible(e,!1)),e.traversal.visible=!1),e.traversal.active&&e.internal.hasRenderableContent&&this.invokeOnePlugin(n=>n.setTileActive&&n.setTileActive(e,!1)),e.traversal.active=!1;let{scene:t}=e.engineData;t&&this.dispatchEvent({type:"dispose-model",scene:t,tile:e})}preprocessNode(e,t,n=null){if(this.processedTiles.add(e),this.stats.tilesProcessed++,e.content&&(!("uri"in e.content)&&"url"in e.content&&(e.content.uri=e.content.url,delete e.content.url),e.content.boundingVolume&&!("box"in e.content.boundingVolume||"sphere"in e.content.boundingVolume||"region"in e.content.boundingVolume)&&delete e.content.boundingVolume),e.parent=n,e.children=e.children||[],e.internal={hasContent:!1,hasRenderableContent:!1,hasUnrenderableContent:!1,loadingState:0,basePath:t,depth:-1,depthFromRenderedParent:-1,isVirtual:!1,virtualChildCount:0,renderer:this,...e.internal},e.content?.uri){let i=gg(e.content.uri),r=!!(i&&/json$/.test(i));e.internal.hasContent=!0,e.internal.hasUnrenderableContent=r,e.internal.hasRenderableContent=!r}else e.internal.hasContent=!1,e.internal.hasUnrenderableContent=!1,e.internal.hasRenderableContent=!1;n?(e.internal.depth=n.internal.depth+1,e.internal.depthFromRenderedParent=n.internal.depthFromRenderedParent+ +!!e.internal.hasRenderableContent):(e.internal.depth=0,e.internal.depthFromRenderedParent=+!!e.internal.hasRenderableContent),e.traversal={distanceFromCamera:1/0,error:1/0,inFrustum:!1,wasInFrustum:!1,isLeaf:!1,used:!1,usedLastFrame:!1,visible:!1,wasSetVisible:!1,active:!1,wasSetActive:!1,allChildrenReady:!1,allChildrenLoaded:!1,kicked:!1,allUsedChildrenProcessed:!1,lastFrameVisited:-1},n===null?e.refine=e.refine||"REPLACE":e.refine=e.refine||n.refine,e.engineData={scene:null,metadata:null,boundingVolume:null},Object.defineProperty(e,"cached",{get(){return console.warn('TilesRenderer: "tile.cached" field has been renamed to "tile.engineData".'),this.engineData},enumerable:!1,configurable:!0}),this.invokeAllPlugins(i=>{i!==this&&i.preprocessNode&&i.preprocessNode(e,t,n)})}setTileActive(e,t){t?this.activeTiles.add(e):this.activeTiles.delete(e)}setTileVisible(e,t){t?this.visibleTiles.add(e):this.visibleTiles.delete(e),this.dispatchEvent({type:"tile-visibility-change",scene:e.engineData.scene,tile:e,visible:t})}calculateTileViewError(e,t){}removeUnusedPendingTiles(){let{lruCache:e,loadingTiles:t}=this,n=[];for(let i of t)!e.isUsed(i)&&i.internal.loadingState===1&&n.push(i);for(let i=0;i<n.length;i++)e.remove(n[i])}queueTileForDownload(e){e.internal.loadingState!==0||this.lruCache.isFull()||this.queuedTiles.push(e)}markTileUsed(e){this.usedSet.add(e),this.lruCache.markUsed(e)}fetchData(e,t){return fetch(e,t)}ensureChildrenArePreprocessed(e,t=this.stats.tilesProcessed<this.maxTilesProcessed){let n=e.children;if(n.length===0||n[n.length-1].traversal)return;let i=r=>{for(let o=0,a=r.length;o<a;o++){let s=r[o];s&&!s.traversal&&this.preprocessNode(s,e.internal.basePath,e)}};t?(this.processNodeQueue.remove(e),i(n)):this.processNodeQueue.has(e)||this.processNodeQueue.add(e,r=>{i(r.children),this._dispatchNeedsUpdateEvent()})}getBytesUsed(e){let t=0;return this.invokeAllPlugins(n=>{n.calculateBytesUsed&&(t+=n.calculateBytesUsed(e,e.engineData.scene)||0)}),t}recalculateBytesUsed(e=null){let{lruCache:t,processedTiles:n}=this;e===null?t.itemSet.forEach(i=>{n.has(i)&&t.setMemoryUsage(i,this.getBytesUsed(i))}):t.setMemoryUsage(e,this.getBytesUsed(e))}preprocessTileset(e,t,n=null){let[i,r]=e.asset.version.split(".").map(a=>parseInt(a));console.assert(i<=1,"TilesRenderer: asset.version is expected to be a 1.x or a compatible version."),i===1&&r>0&&console.warn("TilesRenderer: tiles versions at 1.1 or higher have limited support. Some new extensions and features may not be supported.");let o=t.replace(/\/[^/]*$/,"");o=new URL(o,window.location.href).toString(),this.preprocessNode(e.root,o,n)}loadRootTileset(){let e=this.rootURL;return this.invokeAllPlugins(t=>e=t.preprocessURL?t.preprocessURL(e,null):e),this.invokeOnePlugin(t=>t.fetchData&&t.fetchData(e,this.fetchOptions)).then(t=>{if(!(t instanceof Response))return t;if(t.ok)return t.json();throw Error(`TilesRenderer: Failed to load tileset "${e}" with status ${t.status} : ${t.statusText}`)}).then(t=>(this.preprocessTileset(t,e),t))}requestTileContents(e){if(e.internal.loadingState!==0)return;let t=!1,n=null,i=new URL(e.content.uri,e.internal.basePath+"/").toString();this.invokeAllPlugins(p=>i=p.preprocessURL?p.preprocessURL(i,e):i);let r=this.stats,o=this.lruCache,a=this.downloadQueue,s=this.parseQueue,c=this.loadingTiles,l=gg(i),u=new AbortController,d=u.signal;if(o.add(e,p=>{u.abort(),t?p.children.length=0:this.invokeAllPlugins(g=>{g.disposeTile&&g.disposeTile(p)}),r.inCache--,this.cachedSinceLoadComplete.has(e)&&(this.cachedSinceLoadComplete.delete(e),r.inCacheSinceLoad--),p.internal.loadingState===1?r.queued--:p.internal.loadingState===2?r.downloading--:p.internal.loadingState===3?r.parsing--:p.internal.loadingState===4&&r.loaded--,p.internal.loadingState=0,s.remove(p),a.remove(p),c.delete(p)}))return this.isLoading||(this.isLoading=!0,this.dispatchEvent({type:"tiles-load-start"})),o.setMemoryUsage(e,this.getBytesUsed(e)),this.cachedSinceLoadComplete.add(e),r.inCacheSinceLoad++,r.inCache++,r.queued++,e.internal.loadingState=1,c.add(e),a.add(i,e,p=>{if(d.aborted)return Promise.resolve();e.internal.loadingState=2,r.downloading++,r.queued--;let g=this.invokeOnePlugin(f=>f.fetchData&&f.fetchData(i,{...this.fetchOptions,signal:d}));return this.dispatchEvent({type:"tile-download-start",tile:e,url:i,get uri(){return console.warn('tile-download-start event: "uri" has been renamed to "url".'),this.url}}),g}).then(p=>{if(!d.aborted){if(!(p instanceof Response))return p;if(p.ok)return l==="json"?p.json():p.arrayBuffer();throw Error(`Failed to load model with error code ${p.status}`)}}).then(p=>{if(!d.aborted)return r.downloading--,r.parsing++,e.internal.loadingState=3,s.add(e,g=>d.aborted?Promise.resolve():l==="json"&&p.root?(this.preprocessTileset(p,i,e),e.children.push(p.root),n=p,t=!0,Promise.resolve()):this.invokeOnePlugin(f=>f.parseTile&&f.parseTile(p,g,l,i,d)))}).then(()=>{if(d.aborted)return;r.parsing--,r.loaded++,e.internal.loadingState=4,c.delete(e),o.setLoaded(e,!0);let p=this.getBytesUsed(e);if(o.getMemoryUsage(e)===0&&p>0&&o.isFull()){o.remove(e);return}o.setMemoryUsage(e,p),this.dispatchEvent({type:"needs-update"}),t&&this.dispatchEvent({type:"load-tileset",tileset:n,url:i}),e.engineData.scene&&this.dispatchEvent({type:"load-model",scene:e.engineData.scene,tile:e,url:i})}).catch(p=>{d.aborted||(p.name==="AbortError"?o.remove(e):(s.remove(e),a.remove(e),e.internal.loadingState===1?r.queued--:e.internal.loadingState===2?r.downloading--:e.internal.loadingState===3?r.parsing--:e.internal.loadingState===4&&r.loaded--,r.failed++,console.error(`TilesRenderer : Failed to load tile at url "${e.content.uri}".`),console.error(p),e.internal.loadingState=-1,c.delete(e),o.setLoaded(e,!0),this.dispatchEvent({type:"load-error",tile:e,error:p,url:i})))})}};function Gi(e){if(e===null||e.byteLength<4)return"";let t;if(t=e instanceof DataView?e:new DataView(e),String.fromCharCode(t.getUint8(0))==="{")return null;let n="";for(let i=0;i<4;i++)n+=String.fromCharCode(t.getUint8(i));return n}var mC=new TextDecoder;function Ag(e){return mC.decode(e)}function Il(e){return e.replace(/[\\/][^\\/]+$/,"")+"/"}var Qa=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=Il(e)),this.parse(t)))}resolveExternalURL(e){return new URL(e,this.workingPath).href}parse(e){throw Error("LoaderBase: Parse not implemented.")}};function Rg(e,t,n,i,r,o){let a;switch(i){case"SCALAR":a=1;break;case"VEC2":a=2;break;case"VEC3":a=3;break;case"VEC4":a=4;break;default:throw Error(`FeatureTable : Feature type not provided for "${o}".`)}let s,c=n*a;switch(r){case"BYTE":s=new Int8Array(e,t,c);break;case"UNSIGNED_BYTE":s=new Uint8Array(e,t,c);break;case"SHORT":s=new Int16Array(e,t,c);break;case"UNSIGNED_SHORT":s=new Uint16Array(e,t,c);break;case"INT":s=new Int32Array(e,t,c);break;case"UNSIGNED_INT":s=new Uint32Array(e,t,c);break;case"FLOAT":s=new Float32Array(e,t,c);break;case"DOUBLE":s=new Float64Array(e,t,c);break;default:throw Error(`FeatureTable : Feature component type not provided for "${o}".`)}return s}var zl=class{constructor(e,t,n,i){this.buffer=e,this.binOffset=t+n,this.binLength=i;let r=null;if(n!==0){let o=new Uint8Array(e,t,n);r=JSON.parse(Ag(o))}else r={};this.header=r}getKeys(){return Object.keys(this.header).filter(e=>e!=="extensions")}getData(e,t,n=null,i=null){let r=this.header;if(!(e in r))return null;let o=r[e];if(!(o instanceof Object)||Array.isArray(o))return o;{let{buffer:a,binOffset:s,binLength:c}=this,l=o.byteOffset||0,u=o.type||i,d=o.componentType||n;if("type"in o&&i&&o.type!==i)throw Error("FeatureTable: Specified type does not match expected type.");let p=s+l,g=Rg(a,p,t,u,d,e);if(p+g.byteLength>s+c)throw Error("FeatureTable: Feature data read outside binary body length.");return g}}getBuffer(e,t){let{buffer:n,binOffset:i}=this;return n.slice(i+e,i+e+t)}},gC=class{constructor(e){this.batchTable=e;let t=e.header.extensions["3DTILES_batch_table_hierarchy"];this.classes=t.classes;for(let i of this.classes){let r=i.instances;for(let o in r)i.instances[o]=this._parseProperty(r[o],i.length,o)}if(this.instancesLength=t.instancesLength,this.classIds=this._parseProperty(t.classIds,this.instancesLength,"classIds"),t.parentCounts?this.parentCounts=this._parseProperty(t.parentCounts,this.instancesLength,"parentCounts"):this.parentCounts=Array(this.instancesLength).fill(1),t.parentIds){let i=this.parentCounts.reduce((r,o)=>r+o,0);this.parentIds=this._parseProperty(t.parentIds,i,"parentIds")}else this.parentIds=null;this.instancesIds=[];let n={};for(let i of this.classIds)n[i]=n[i]??0,this.instancesIds.push(n[i]),n[i]++}_parseProperty(e,t,n){if(Array.isArray(e))return e;{let{buffer:i,binOffset:r}=this.batchTable,o=e.byteOffset,a=e.componentType||"UNSIGNED_SHORT";return Rg(i,r+o,t,"SCALAR",a,n)}}getDataFromId(e,t={}){let n=this.parentCounts[e];if(this.parentIds&&n>0){let s=0;for(let c=0;c<e;c++)s+=this.parentCounts[c];for(let c=0;c<n;c++){let l=this.parentIds[s+c];l!==e&&this.getDataFromId(l,t)}}let i=this.classIds[e],r=this.classes[i].instances,o=this.classes[i].name,a=this.instancesIds[e];for(let s in r)t[o]=t[o]||{},t[o][s]=r[s][a];return t}},tu=class extends zl{constructor(e,t,n,i,r){super(e,n,i,r),this.count=t,this.extensions={};let o=this.header.extensions;o&&o["3DTILES_batch_table_hierarchy"]&&(this.extensions["3DTILES_batch_table_hierarchy"]=new gC(this))}getDataFromId(e,t={}){if(e<0||e>=this.count)throw Error(`BatchTable: id value "${e}" out of bounds for "${this.count}" features number.`);for(let n of this.getKeys())t[n]=super.getData(n,this.count)[e];for(let n in this.extensions){let i=this.extensions[n];i.getDataFromId instanceof Function&&(t[n]=t[n]||{},i.getDataFromId(e,t[n]))}return t}getPropertyArray(e){return super.getData(e,this.count)}},Eg=class extends Qa{parse(e){let t=new DataView(e),n=Gi(t);console.assert(n==="b3dm");let i=t.getUint32(4,!0);console.assert(i===1);let r=t.getUint32(8,!0);console.assert(r===e.byteLength);let o=t.getUint32(12,!0),a=t.getUint32(16,!0),s=t.getUint32(20,!0),c=t.getUint32(24,!0),l=new zl(e.slice(28,28+o+a),0,o,a),u=28+o+a,d=new tu(e.slice(u,u+s+c),l.getData("BATCH_LENGTH"),0,s,c),p=u+s+c;return{version:i,featureTable:l,batchTable:d,glbBytes:new Uint8Array(e,p,r-p)}}},Lg=class extends Qa{parse(e){let t=new DataView(e),n=Gi(t);console.assert(n==="i3dm");let i=t.getUint32(4,!0);console.assert(i===1);let r=t.getUint32(8,!0);console.assert(r===e.byteLength);let o=t.getUint32(12,!0),a=t.getUint32(16,!0),s=t.getUint32(20,!0),c=t.getUint32(24,!0),l=t.getUint32(28,!0),u=new zl(e.slice(32,32+o+a),0,o,a),d=32+o+a,p=new tu(e.slice(d,d+s+c),u.getData("INSTANCES_LENGTH"),0,s,c),g=d+s+c,f=new Uint8Array(e,g,r-g),v=null,P=null,y=null;if(l)v=f,P=Promise.resolve();else{let h=this.resolveExternalURL(Ag(f));y=Il(h),P=fetch(h,this.fetchOptions).then(m=>{if(!m.ok)throw Error(`I3DMLoaderBase : Failed to load file "${h}" with status ${m.status} : ${m.statusText}`);return m.arrayBuffer()}).then(m=>{v=new Uint8Array(m)})}return P.then(()=>({version:i,featureTable:u,batchTable:p,glbBytes:v,gltfWorkingPath:y}))}},Bg=class extends Qa{parse(e){let t=new DataView(e),n=Gi(t);console.assert(n==="pnts");let i=t.getUint32(4,!0);console.assert(i===1);let r=t.getUint32(8,!0);console.assert(r===e.byteLength);let o=t.getUint32(12,!0),a=t.getUint32(16,!0),s=t.getUint32(20,!0),c=t.getUint32(24,!0),l=new zl(e.slice(28,28+o+a),0,o,a),u=28+o+a,d=new tu(e.slice(u,u+s+c),l.getData("BATCH_LENGTH")||l.getData("POINTS_LENGTH"),0,s,c);return Promise.resolve({version:i,featureTable:l,batchTable:d})}},Og=class extends Qa{parse(e){let t=new DataView(e),n=Gi(t);console.assert(n==="cmpt",'CMPTLoader: The magic bytes equal "cmpt".');let i=t.getUint32(4,!0);console.assert(i===1,'CMPTLoader: The version listed in the header is "1".');let r=t.getUint32(8,!0);console.assert(r===e.byteLength,"CMPTLoader: The contents buffer length listed in the header matches the file.");let o=t.getUint32(12,!0),a=[],s=16;for(let c=0;c<o;c++){let l=new DataView(e,s,12),u=Gi(l),d=l.getUint32(4,!0),p=l.getUint32(8,!0),g=new Uint8Array(e,s,p);a.push({type:u,buffer:g,version:d}),s+=p}return{version:i,tiles:a}}};import{Box3 as Kg,BufferAttribute as Hi,BufferGeometry as fC,Clock as ME,Color as bC,DefaultLoadingManager as ql,Euler as xC,EventDispatcher as jl,Frustum as yC,Group as uu,InstancedMesh as vC,LoadingManager as wC,MathUtils as Jg,Matrix3 as CC,Matrix4 as sn,Mesh as TE,OrthographicCamera as PE,PerspectiveCamera as kE,Plane as SC,PlaneGeometry as _E,Points as MC,PointsMaterial as TC,Quaternion as Qg,Ray as pu,Raycaster as AE,ShaderMaterial as RE,Sphere as Zg,Spherical as PC,TextureUtils as kC,Vector2 as hu,Vector3 as Ie}from"three";import{GLTFLoader as mu}from"three/addons/loaders/GLTFLoader.js";import{estimateBytesUsed as _C}from"three/addons/utils/BufferGeometryUtils.js";var gu=class extends Eg{constructor(e=ql){super(),this.manager=e,this.adjustmentTransform=new sn}parse(e){let t=super.parse(e),n=t.glbBytes.slice().buffer;return new Promise((i,r)=>{let o=this.manager,a=this.fetchOptions,s=o.getHandler("path.gltf")||new mu(o);a.credentials==="include"&&a.mode==="cors"&&s.setCrossOrigin("use-credentials"),"credentials"in a&&s.setWithCredentials(a.credentials==="include"),a.headers&&s.setRequestHeader(a.headers);let c=this.workingPath;!/[\\/]$/.test(c)&&c.length&&(c+="/");let l=this.adjustmentTransform;s.parse(n,c,u=>{let{batchTable:d,featureTable:p}=t,{scene:g}=u,f=p.getData("RTC_CENTER",1,"FLOAT","VEC3");f&&(g.position.x+=f[0],g.position.y+=f[1],g.position.z+=f[2]),u.scene.updateMatrix(),u.scene.matrix.multiply(l),u.scene.matrix.decompose(u.scene.position,u.scene.quaternion,u.scene.scale),u.batchTable=d,u.featureTable=p,g.batchTable=d,g.featureTable=p,i(u)},r)})}};function AC(e){let t=e>>11,n=e>>5&63,i=e&31;return[Math.round(t/31*255),Math.round(n/63*255),Math.round(i/31*255)]}var Za=new hu;function RC(e,t,n=new Ie){Za.set(e,t).divideScalar(256).multiplyScalar(2).subScalar(1),n.set(Za.x,Za.y,1-Math.abs(Za.x)-Math.abs(Za.y));let i=Jg.clamp(-n.z,0,1);return n.x>=0?n.setX(n.x-i):n.setX(n.x+i),n.y>=0?n.setY(n.y-i):n.setY(n.y+i),n.normalize(),n}var Dg={RGB:"color",POSITION:"position"},fu=class extends Bg{constructor(e=ql){super(),this.manager=e}parse(e){return super.parse(e).then(async t=>{let{featureTable:n,batchTable:i}=t,r=new TC,o=n.header.extensions,a=new Ie,s;if(o&&o["3DTILES_draco_point_compression"]){let{byteOffset:u,byteLength:d,properties:p}=o["3DTILES_draco_point_compression"],g=this.manager.getHandler("draco.drc");if(g==null)throw Error("PNTSLoader: dracoLoader not available.");let f={};for(let y in p)if(y in Dg&&y in p){let h=Dg[y];f[h]=p[y]}let v={attributeIDs:f,attributeTypes:{position:"Float32Array",color:"Uint8Array"},useUniqueIDs:!0},P=n.getBuffer(u,d);s=await g.decodeGeometry(P,v),s.attributes.color&&(r.vertexColors=!0)}else{let u=n.getData("POINTS_LENGTH"),d=n.getData("POSITION",u,"FLOAT","VEC3"),p=n.getData("NORMAL",u,"FLOAT","VEC3"),g=n.getData("NORMAL",u,"UNSIGNED_BYTE","VEC2"),f=n.getData("RGB",u,"UNSIGNED_BYTE","VEC3"),v=n.getData("RGBA",u,"UNSIGNED_BYTE","VEC4"),P=n.getData("RGB565",u,"UNSIGNED_SHORT","SCALAR"),y=n.getData("CONSTANT_RGBA",u,"UNSIGNED_BYTE","VEC4"),h=n.getData("POSITION_QUANTIZED",u,"UNSIGNED_SHORT","VEC3"),m=n.getData("QUANTIZED_VOLUME_SCALE",u,"FLOAT","VEC3"),S=n.getData("QUANTIZED_VOLUME_OFFSET",u,"FLOAT","VEC3");if(s=new fC,h){let M=new Float32Array(u*3);for(let T=0;T<u;T++)for(let E=0;E<3;E++){let b=3*T+E;M[b]=h[b]/65535*m[E]}a.x=S[0],a.y=S[1],a.z=S[2],s.setAttribute("position",new Hi(M,3,!1))}else s.setAttribute("position",new Hi(d,3,!1));if(p!==null)s.setAttribute("normal",new Hi(p,3,!1));else if(g!==null){let M=new Float32Array(u*3),T=new Ie;for(let E=0;E<u;E++){let b=g[E*2],C=g[E*2+1],x=RC(b,C,T);M[E*3]=x.x,M[E*3+1]=x.y,M[E*3+2]=x.z}s.setAttribute("normal",new Hi(M,3,!1))}if(v!==null)s.setAttribute("color",new Hi(v,4,!0)),r.vertexColors=!0,r.transparent=!0,r.depthWrite=!1;else if(f!==null)s.setAttribute("color",new Hi(f,3,!0)),r.vertexColors=!0;else if(P!==null){let M=new Uint8Array(u*3);for(let T=0;T<u;T++){let E=AC(P[T]);for(let b=0;b<3;b++){let C=3*T+b;M[C]=E[b]}}s.setAttribute("color",new Hi(M,3,!0)),r.vertexColors=!0}else if(y!==null){r.color=new bC(y[0],y[1],y[2]);let M=y[3]/255;M<1&&(r.opacity=M,r.transparent=!0,r.depthWrite=!1)}}let c=new MC(s,r);c.position.copy(a),t.scene=c,t.scene.featureTable=n,t.scene.batchTable=i;let l=n.getData("RTC_CENTER",1,"FLOAT","VEC3");return l&&(t.scene.position.x+=l[0],t.scene.position.y+=l[1],t.scene.position.z+=l[2]),t})}};function EC(e){let{x:t,y:n,z:i}=e;e.x=i,e.y=t,e.z=n}function LC(e){return-e+Math.PI/2}var Ng=new PC,oi=new Ie,Sn=new Ie,nu=new Ie,Zn=new sn,kr=new sn,ru=new Zg,Rn=new xC,Ig=new Ie,zg=new Ie,jg=new Ie,es=new Ie,Vl=new pu,BC=1e-12,OC=.1;var bu=class{constructor(e=1,t=1,n=1){this.name="",this.radius=new Ie(e,t,n)}intersectRay(e,t){return Zn.makeScale(...this.radius).invert(),ru.center.set(0,0,0),ru.radius=1,Vl.copy(e).applyMatrix4(Zn),Vl.intersectSphere(ru,t)?(Zn.makeScale(...this.radius),t.applyMatrix4(Zn),t):null}getEastNorthUpFrame(e,t,n,i){return n.isMatrix4&&(i=n,n=0,console.warn('Ellipsoid: The signature for "getEastNorthUpFrame" has changed.')),this.getEastNorthUpAxes(e,t,Ig,zg,jg),this.getCartographicToPosition(e,t,n,es),i.makeBasis(Ig,zg,jg).setPosition(es)}getOrientedEastNorthUpFrame(e,t,n,i,r,o,a){return this.getObjectFrame(e,t,n,i,r,o,a,0)}getObjectFrame(e,t,n,i,r,o,a,s=2){return this.getEastNorthUpFrame(e,t,n,Zn),Rn.set(r,o,-i,"ZXY"),a.makeRotationFromEuler(Rn).premultiply(Zn),s===1?(Rn.set(Math.PI/2,0,0,"XYZ"),kr.makeRotationFromEuler(Rn),a.multiply(kr)):s===2&&(Rn.set(-Math.PI/2,0,Math.PI,"XYZ"),kr.makeRotationFromEuler(Rn),a.multiply(kr)),a}getCartographicFromObjectFrame(e,t,n=2){return n===1?(Rn.set(-Math.PI/2,0,0,"XYZ"),kr.makeRotationFromEuler(Rn).premultiply(e)):n===2?(Rn.set(-Math.PI/2,0,Math.PI,"XYZ"),kr.makeRotationFromEuler(Rn).premultiply(e)):kr.copy(e),es.setFromMatrixPosition(kr),this.getPositionToCartographic(es,t),this.getEastNorthUpFrame(t.lat,t.lon,0,Zn).invert(),kr.premultiply(Zn),Rn.setFromRotationMatrix(kr,"ZXY"),t.azimuth=-Rn.z,t.elevation=Rn.x,t.roll=Rn.y,t}getEastNorthUpAxes(e,t,n,i,r,o=es){this.getCartographicToPosition(e,t,0,o),this.getCartographicToNormal(e,t,r),n.set(-o.y,o.x,0).normalize(),i.crossVectors(r,n).normalize()}getCartographicToPosition(e,t,n,i){this.getCartographicToNormal(e,t,oi);let r=this.radius;Sn.copy(oi),Sn.x*=r.x**2,Sn.y*=r.y**2,Sn.z*=r.z**2;let o=Math.sqrt(oi.dot(Sn));return Sn.divideScalar(o),i.copy(Sn).addScaledVector(oi,n)}getPositionToCartographic(e,t){this.getPositionToSurfacePoint(e,Sn),this.getPositionToNormal(Sn,oi);let n=nu.subVectors(e,Sn);return t.lon=Math.atan2(oi.y,oi.x),t.lat=Math.asin(oi.z),t.height=Math.sign(n.dot(e))*n.length(),t}getCartographicToNormal(e,t,n){return Ng.set(1,LC(e),t),n.setFromSpherical(Ng).normalize(),EC(n),n}getPositionToNormal(e,t){let n=this.radius;return t.copy(e),t.x/=n.x**2,t.y/=n.y**2,t.z/=n.z**2,t.normalize(),t}getPositionToSurfacePoint(e,t){let n=this.radius,i=1/n.x**2,r=1/n.y**2,o=1/n.z**2,a=e.x*e.x*i,s=e.y*e.y*r,c=e.z*e.z*o,l=a+s+c,u=Math.sqrt(1/l),d=Sn.copy(e).multiplyScalar(u);if(l<OC)return isFinite(u)?t.copy(d):null;let p=nu.set(d.x*i*2,d.y*r*2,d.z*o*2),g=(1-u)*e.length()/(.5*p.length()),f=0,v,P,y,h,m,S,M,T,E,b,C;do{g-=f,y=1/(1+g*i),h=1/(1+g*r),m=1/(1+g*o),S=y*y,M=h*h,T=m*m,E=S*y,b=M*h,C=T*m,v=a*S+s*M+c*T-1,P=a*E*i+s*b*r+c*C*o;let x=-2*P;f=v/x}while(Math.abs(v)>BC);return t.set(e.x*y,e.y*h,e.z*m)}calculateHorizonDistance(e,t){let n=this.calculateEffectiveRadius(e);return Math.sqrt(2*n*t+t**2)}calculateEffectiveRadius(e){let t=this.radius.x,n=1-this.radius.z**2/t**2,i=e*Jg.DEG2RAD,r=Math.sin(i)**2;return t/Math.sqrt(1-n*r)}getPositionElevation(e){this.getPositionToSurfacePoint(e,Sn);let t=nu.subVectors(e,Sn);return Math.sign(t.dot(e))*t.length()}closestPointToRayEstimate(e,t){return this.intersectRay(e,t)?t:(Zn.makeScale(...this.radius).invert(),Vl.copy(e).applyMatrix4(Zn),Sn.set(0,0,0),Vl.closestPointToPoint(Sn,t).normalize(),Zn.makeScale(...this.radius),t.applyMatrix4(Zn))}copy(e){return this.radius.copy(e.radius),this}clone(){return new this.constructor().copy(this)}},os=new bu(Ho,Ho,vg);os.name="WGS84 Earth";var Fl=new Ie,Wo=new Ie,$o=new Ie,iu=new Ie,Ul=new Qg,Gl=new Ie,Xo=new sn,Vg=new sn,Fg=new Ie,Ug=new sn,ou=new Qg,au={};function Gg(e,t,n,i){if(e=e/n*2-1,t=t/n*2-1,i.x=e,i.y=t,i.z=1-Math.abs(e)-Math.abs(t),i.z<0){let r=i.x;i.x=(1-Math.abs(i.y))*(r>=0?1:-1),i.y=(1-Math.abs(r))*(i.y>=0?1:-1)}return i.normalize(),i}var xu=class extends Lg{constructor(e=ql){super(),this.manager=e,this.adjustmentTransform=new sn,this.ellipsoid=os.clone()}resolveExternalURL(e){return this.manager.resolveURL(super.resolveExternalURL(e))}parse(e){return super.parse(e).then(t=>{let{featureTable:n,batchTable:i}=t,r=t.glbBytes.slice().buffer;return new Promise((o,a)=>{let s=this.fetchOptions,c=this.manager,l=c.getHandler("path.gltf")||new mu(c);s.credentials==="include"&&s.mode==="cors"&&l.setCrossOrigin("use-credentials"),"credentials"in s&&l.setWithCredentials(s.credentials==="include"),s.headers&&l.setRequestHeader(s.headers);let u=t.gltfWorkingPath??this.workingPath;/[\\/]$/.test(u)||(u+="/");let d=this.adjustmentTransform;l.parse(r,u,p=>{let g=n.getData("INSTANCES_LENGTH"),f=n.getData("POSITION",g,"FLOAT","VEC3"),v=n.getData("POSITION_QUANTIZED",g,"UNSIGNED_SHORT","VEC3"),P=n.getData("QUANTIZED_VOLUME_OFFSET",1,"FLOAT","VEC3"),y=n.getData("QUANTIZED_VOLUME_SCALE",1,"FLOAT","VEC3"),h=n.getData("NORMAL_UP",g,"FLOAT","VEC3"),m=n.getData("NORMAL_RIGHT",g,"FLOAT","VEC3"),S=n.getData("NORMAL_UP_OCT32P",g,"UNSIGNED_SHORT","VEC2"),M=n.getData("NORMAL_RIGHT_OCT32P",g,"UNSIGNED_SHORT","VEC2"),T=n.getData("SCALE_NON_UNIFORM",g,"FLOAT","VEC3"),E=n.getData("SCALE",g,"FLOAT","SCALAR"),b=n.getData("RTC_CENTER",1,"FLOAT","VEC3"),C=n.getData("EAST_NORTH_UP");if(!f&&v){f=new Float32Array(g*3);for(let A=0;A<g;A++)f[A*3+0]=P[0]+v[A*3+0]/65535*y[0],f[A*3+1]=P[1]+v[A*3+1]/65535*y[1],f[A*3+2]=P[2]+v[A*3+2]/65535*y[2]}let x=new Ie;for(let A=0;A<g;A++)x.x+=f[A*3+0]/g,x.y+=f[A*3+1]/g,x.z+=f[A*3+2]/g;let k=[],I=[];p.scene.updateMatrixWorld(),p.scene.traverse(A=>{if(A.isMesh){I.push(A);let{geometry:z,material:_}=A,F=new vC(z,_,g);F.position.copy(x),b&&(F.position.x+=b[0],F.position.y+=b[1],F.position.z+=b[2]),k.push(F)}});for(let A=0;A<g;A++){iu.set(f[A*3+0]-x.x,f[A*3+1]-x.y,f[A*3+2]-x.z),Ul.identity(),h&&m?(Wo.set(h[A*3+0],h[A*3+1],h[A*3+2]),$o.set(m[A*3+0],m[A*3+1],m[A*3+2]),Fl.crossVectors($o,Wo).normalize(),Xo.makeBasis($o,Wo,Fl),Ul.setFromRotationMatrix(Xo)):S&&M&&(Gg(S[A*2+0],S[A*2+1],65535,Wo),Gg(M[A*2+0],M[A*2+1],65535,$o),Fl.crossVectors($o,Wo).normalize(),Xo.makeBasis($o,Wo,Fl),Ul.setFromRotationMatrix(Xo)),Gl.set(1,1,1),T&&Gl.set(T[A*3+0],T[A*3+1],T[A*3+2]),E&&Gl.multiplyScalar(E[A]);for(let z=0,_=k.length;z<_;z++){let F=k[z];ou.copy(Ul),C&&(F.updateMatrixWorld(),Fg.copy(iu).applyMatrix4(F.matrixWorld),this.ellipsoid.getPositionToCartographic(Fg,au),this.ellipsoid.getEastNorthUpFrame(au.lat,au.lon,Ug),ou.setFromRotationMatrix(Ug)),Xo.compose(iu,ou,Gl).multiply(d);let j=I[z];Vg.multiplyMatrices(Xo,j.matrixWorld),F.setMatrixAt(A,Vg)}}p.scene.clear(),p.scene.add(...k),p.batchTable=i,p.featureTable=n,p.scene.batchTable=i,p.scene.featureTable=n,o(p)},a)})})}},ef=class extends Og{constructor(e=ql){super(),this.manager=e,this.adjustmentTransform=new sn,this.ellipsoid=os.clone()}parse(e){let t=super.parse(e),{manager:n,ellipsoid:i,adjustmentTransform:r}=this,o=[];for(let a in t.tiles){let{type:s,buffer:c}=t.tiles[a];switch(s){case"b3dm":{let l=c.slice(),u=new gu(n);u.workingPath=this.workingPath,u.fetchOptions=this.fetchOptions,u.adjustmentTransform.copy(r);let d=u.parse(l.buffer);o.push(d);break}case"pnts":{let l=c.slice(),u=new fu(n);u.workingPath=this.workingPath,u.fetchOptions=this.fetchOptions;let d=u.parse(l.buffer);o.push(d);break}case"i3dm":{let l=c.slice(),u=new xu(n);u.workingPath=this.workingPath,u.fetchOptions=this.fetchOptions,u.ellipsoid.copy(i),u.adjustmentTransform.copy(r);let d=u.parse(l.buffer);o.push(d);break}}}return Promise.all(o).then(a=>{let s=new uu;return a.forEach(c=>{s.add(c.scene)}),{tiles:a,scene:s}})}},ts=new sn,DC=class extends uu{constructor(e){super(),this.isTilesGroup=!0,this.name="TilesRenderer.TilesGroup",this.tilesRenderer=e,this.matrixWorldInverse=new sn}raycast(e,t){return this.tilesRenderer.raycast(e,t),!1}updateMatrixWorld(e){if(this.matrixAutoUpdate&&this.updateMatrix(),this.matrixWorldNeedsUpdate||e){this.parent===null?ts.copy(this.matrix):ts.multiplyMatrices(this.parent.matrixWorld,this.matrix),this.matrixWorldNeedsUpdate=!1;let t=ts.elements,n=this.matrixWorld.elements,i=!1;for(let r=0;r<16;r++){let o=t[r],a=n[r];if(Math.abs(o-a)>2**-52){i=!0;break}}if(i){this.matrixWorld.copy(ts),this.matrixWorldInverse.copy(ts).invert();let r=this.children;for(let c=0,l=r.length;c<l;c++)r[c].updateMatrixWorld();let{tilesRenderer:o}=this,{activeTiles:a,visibleTiles:s}=o;a.forEach(c=>{s.has(c)||c.engineData.scene.updateMatrixWorld(!0)})}}}updateWorldMatrix(e,t){this.parent&&e&&this.parent.updateWorldMatrix(e,!1),this.updateMatrixWorld(!0)}},NC=new pu;function IC(e,t,n,i){let{scene:r}=e.engineData;n.invokeOnePlugin(o=>o.raycastTile&&o.raycastTile(e,r,t,i))||t.intersectObject(r,!0,i)}function zC(e){return"traversal"in e}function tf(e,t,n,i,r=null){if(!zC(t))return;let{group:o,activeTiles:a}=e,{boundingVolume:s}=t.engineData;if(r===null&&(r=NC,r.copy(n.ray).applyMatrix4(o.matrixWorldInverse)),!t.traversal.used||!s.intersectsRay(r))return;a.has(t)&&IC(t,n,e,i);let c=t.children;for(let l=0,u=c.length;l<u;l++)tf(e,c[l],n,i,r)}var Hl=new Ie,Wl=new Ie,En=new Ie,$l=new pu,cu=class{constructor(e=new Kg,t=new sn){this.box=e.clone(),this.transform=t.clone(),this.inverseTransform=new sn,this.points=Array(8).fill().map(()=>new Ie),this.planes=[,,,,,,].fill().map(()=>new SC)}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,En).distanceTo(e)}containsPoint(e){return En.copy(e).applyMatrix4(this.inverseTransform),this.box.containsPoint(En)}intersectsRay(e){return $l.copy(e).applyMatrix4(this.inverseTransform),$l.intersectsBox(this.box)}intersectRay(e,t){return $l.copy(e).applyMatrix4(this.inverseTransform),$l.intersectBox(this.box,t)?(t.applyMatrix4(this.transform),t):null}update(){let{points:e,inverseTransform:t,transform:n,box:i}=this;t.copy(n).invert();let{min:r,max:o}=i,a=0;for(let s=-1;s<=1;s+=2)for(let c=-1;c<=1;c+=2)for(let l=-1;l<=1;l+=2)e[a].set(s<0?r.x:o.x,c<0?r.y:o.y,l<0?r.z:o.z).applyMatrix4(n),a++;this.updatePlanes()}updatePlanes(){Hl.copy(this.box.min).applyMatrix4(this.transform),Wl.copy(this.box.max).applyMatrix4(this.transform),En.set(0,0,1).transformDirection(this.transform),this.planes[0].setFromNormalAndCoplanarPoint(En,Hl),this.planes[1].setFromNormalAndCoplanarPoint(En,Wl).negate(),En.set(0,1,0).transformDirection(this.transform),this.planes[2].setFromNormalAndCoplanarPoint(En,Hl),this.planes[3].setFromNormalAndCoplanarPoint(En,Wl).negate(),En.set(1,0,0).transformDirection(this.transform),this.planes[4].setFromNormalAndCoplanarPoint(En,Hl),this.planes[5].setFromNormalAndCoplanarPoint(En,Wl).negate()}intersectsSphere(e){return this.clampPoint(e.center,En),En.distanceToSquared(e.center)<=e.radius*e.radius}intersectsFrustum(e){return this._intersectsPlaneShape(e.planes,e.points)}intersectsOBB(e){return this._intersectsPlaneShape(e.planes,e.points)}_intersectsPlaneShape(e,t){let n=this.points,i=this.planes;for(let r=0;r<6;r++){let o=e[r],a=-1/0;for(let s=0;s<8;s++){let c=n[s],l=o.distanceToPoint(c);a=a<l?l:a}if(a<0)return!1}for(let r=0;r<6;r++){let o=i[r],a=-1/0;for(let s=0;s<8;s++){let c=t[s],l=o.distanceToPoint(c);a=a<l?l:a}if(a<0)return!1}return!0}},is=Math.PI,su=is/2,ns=new Ie,Wi=new Ie,fr=new Ie,ye=new Ie,Mn=new sn,jC=new Kg,Hg=new sn;function ai(e,t){t.radius=Math.max(t.radius,e.distanceToSquared(t.center))}function Wg(e){return e.x!==e.y}var nf=class extends bu{constructor(e=1,t=1,n=1,i=-su,r=su,o=0,a=2*is,s=0,c=0){super(e,t,n),this.latStart=i,this.latEnd=r,this.lonStart=o,this.lonEnd=a,this.heightStart=s,this.heightEnd=c}getBoundingBox(e,t){Wg(this.radius)&&console.warn("EllipsoidRegion: Triaxial ellipsoids are not supported.");let{latStart:n,latEnd:i,lonStart:r,lonEnd:o,heightStart:a,heightEnd:s}=this,c=(n+i)*.5,l=(r+o)*.5,u=n>0,d=i<0,p;p=u?n:d?i:0;let{min:g,max:f}=e;g.setScalar(1/0),f.setScalar(-1/0),o-r<=is?(this.getCartographicToNormal(c,l,fr),Wi.set(0,0,1),ns.crossVectors(Wi,fr).normalize(),Wi.crossVectors(fr,ns).normalize(),t.makeBasis(ns,Wi,fr),Mn.copy(t).invert(),this.getCartographicToPosition(p,r,s,ye).applyMatrix4(Mn),f.x=Math.abs(ye.x),g.x=-f.x,this.getCartographicToPosition(i,r,s,ye).applyMatrix4(Mn),f.y=ye.y,this.getCartographicToPosition(i,l,s,ye).applyMatrix4(Mn),f.y=Math.max(ye.y,f.y),this.getCartographicToPosition(n,r,s,ye).applyMatrix4(Mn),g.y=ye.y,this.getCartographicToPosition(n,l,s,ye).applyMatrix4(Mn),g.y=Math.min(ye.y,g.y),this.getCartographicToPosition(c,l,s,ye).applyMatrix4(Mn),f.z=ye.z,this.getCartographicToPosition(n,r,a,ye).applyMatrix4(Mn),g.z=ye.z,this.getCartographicToPosition(i,r,a,ye).applyMatrix4(Mn),g.z=Math.min(ye.z,g.z)):(this.getCartographicToPosition(p,l,s,fr),fr.z=0,fr.length()<1e-10?fr.set(1,0,0):fr.normalize(),Wi.set(0,0,1),ns.crossVectors(fr,Wi).normalize(),t.makeBasis(ns,Wi,fr),Mn.copy(t).invert(),this.getCartographicToPosition(p,l+su,s,ye).applyMatrix4(Mn),f.x=Math.abs(ye.x),g.x=-f.x,this.getCartographicToPosition(i,0,d?a:s,ye).applyMatrix4(Mn),f.y=ye.y,this.getCartographicToPosition(n,0,u?a:s,ye).applyMatrix4(Mn),g.y=ye.y,this.getCartographicToPosition(p,l,s,ye).applyMatrix4(Mn),f.z=ye.z,this.getCartographicToPosition(p,o,s,ye).applyMatrix4(Mn),g.z=ye.z),e.getCenter(ye),e.min.sub(ye).multiplyScalar(1.0000000000001),e.max.sub(ye).multiplyScalar(1.0000000000001),ye.applyMatrix4(t),t.setPosition(ye)}getBoundingSphere(e){Wg(this.radius)&&console.warn("EllipsoidRegion: Triaxial ellipsoids are not supported."),this.getBoundingBox(jC,Hg),e.center.setFromMatrixPosition(Hg),e.radius=0;let{latStart:t,latEnd:n,lonStart:i,lonEnd:r,heightStart:o,heightEnd:a}=this,s=(t+n)*.5,c=(i+r)*.5,l=t>0,u=n<0,d;d=l?t:u?n:0,this.getCartographicToPosition(d,i,a,ye),ai(ye,e),this.getCartographicToPosition(n,i,a,ye),ai(ye,e),this.getCartographicToPosition(n,c,a,ye),ai(ye,e),this.getCartographicToPosition(t,i,a,ye),ai(ye,e),this.getCartographicToPosition(t,c,a,ye),ai(ye,e),this.getCartographicToPosition(s,c,a,ye),ai(ye,e),this.getCartographicToPosition(t,i,o,ye),ai(ye,e),r-i>is&&(this.getCartographicToPosition(d,c+is,a,ye),ai(ye,e)),e.radius=Math.sqrt(e.radius)*1.0000000000001}},Hr=new Ie,Wr=new Ie,$r=new Ie,$g=new Ie,Xg=new Ie,VC=class{constructor(){this.sphere=null,this.obb=null,this.region=null,this.regionObb=null}intersectsRay(e){let t=this.sphere,n=this.obb||this.regionObb;return!(t&&!e.intersectsSphere(t)||n&&!n.intersectsRay(e))}intersectRay(e,t=null){let n=this.sphere,i=this.obb||this.regionObb,r=-1/0,o=-1/0;n&&e.intersectSphere(n,$g)&&(r=n.containsPoint(e.origin)?0:e.origin.distanceToSquared($g)),i&&i.intersectRay(e,Xg)&&(o=i.containsPoint(e.origin)?0:e.origin.distanceToSquared(Xg));let a=Math.max(r,o);return a===-1/0?null:(e.at(Math.sqrt(a),t),t)}distanceToPoint(e){let t=this.sphere,n=this.obb||this.regionObb,i=-1/0,r=-1/0;return t&&(i=Math.max(t.distanceToPoint(e),0)),n&&(r=n.distanceToPoint(e)),i>r?i:r}intersectsFrustum(e){let t=this.obb||this.regionObb,n=this.sphere;return n&&!e.intersectsSphere(n)||t&&!t.intersectsFrustum(e)?!1:!!(n||t)}intersectsSphere(e){let t=this.obb||this.regionObb,n=this.sphere;return n&&!n.intersectsSphere(e)||t&&!t.intersectsSphere(e)?!1:!!(n||t)}intersectsOBB(e){let t=this.obb||this.regionObb,n=this.sphere;return n&&!e.intersectsSphere(n)||t&&!t.intersectsOBB(e)?!1:!!(n||t)}getOBB(e,t){let n=this.obb||this.regionObb;n?(e.copy(n.box),t.copy(n.transform)):(this.getAABB(e),t.identity())}getAABB(e){if(this.sphere)this.sphere.getBoundingBox(e);else{let t=this.obb||this.regionObb;e.copy(t.box).applyMatrix4(t.transform)}}getSphere(e){if(this.sphere)e.copy(this.sphere);else if(this.region)this.region.getBoundingSphere(e);else{let t=this.obb||this.regionObb;t.box.getBoundingSphere(e),e.applyMatrix4(t.transform)}}setObbData(e,t){let n=new cu;Hr.set(e[3],e[4],e[5]),Wr.set(e[6],e[7],e[8]),$r.set(e[9],e[10],e[11]);let i=Hr.length(),r=Wr.length(),o=$r.length();Hr.normalize(),Wr.normalize(),$r.normalize(),i===0&&Hr.crossVectors(Wr,$r),r===0&&Wr.crossVectors(Hr,$r),o===0&&$r.crossVectors(Hr,Wr),n.transform.set(Hr.x,Wr.x,$r.x,e[0],Hr.y,Wr.y,$r.y,e[1],Hr.z,Wr.z,$r.z,e[2],0,0,0,1).premultiply(t),n.box.min.set(-i,-r,-o),n.box.max.set(i,r,o),n.update(),this.obb=n}setSphereData(e,t,n,i,r){let o=new Zg;o.center.set(e,t,n),o.radius=i,o.applyMatrix4(r),this.sphere=o}setRegionData(e,t,n,i,r,o,a){let s=new nf(...e.radius,n,r,t,i,o,a),c=new cu;s.getBoundingBox(c.box,c.transform),c.update(),this.region=s,this.regionObb=c}},FC=new CC;function UC(e,t,n,i){let r=FC.set(e.normal.x,e.normal.y,e.normal.z,t.normal.x,t.normal.y,t.normal.z,n.normal.x,n.normal.y,n.normal.z);return i.set(-e.constant,-t.constant,-n.constant),i.applyMatrix3(r.invert()),i}var GC=class extends yC{constructor(){super(),this.points=Array(8).fill().map(()=>new Ie)}setFromProjectionMatrix(...e){return super.setFromProjectionMatrix(...e),this.calculateFrustumPoints(),this}calculateFrustumPoints(){let{planes:e,points:t}=this;[[e[0],e[3],e[4]],[e[1],e[3],e[4]],[e[0],e[2],e[4]],[e[1],e[2],e[4]],[e[0],e[3],e[5]],[e[1],e[3],e[5]],[e[0],e[2],e[5]],[e[1],e[2],e[5]]].forEach((n,i)=>{UC(n[0],n[1],n[2],t[i])})}};var du=0;function qg(e,t,n,i){try{return kC.getByteLength(e,t,n,i)}catch{return du}}function HC(e){if(!e)return 0;if(e.isExternalTexture)return e.userData?.byteLength??du;let{format:t,type:n,image:i,mipmaps:r}=e;if(e.isCompressedTexture&&Array.isArray(r)&&r.length>0){let a=0;for(let s of r)s?.data?.byteLength?a+=s.data.byteLength:a+=qg(s.width,s.height,t,n);return a}if(!i)return du;let o=qg(i.width,i.height,t,n);return o*=e.generateMipmaps?4/3:1,o}function WC(e){let t=new Set,n=0;return e.traverse(i=>{if(i.geometry&&!t.has(i.geometry)&&(n+=_C(i.geometry),t.add(i.geometry)),i.material){let r=i.material;for(let o in r){let a=r[o];a&&a.isTexture&&!t.has(a)&&(n+=HC(a),t.add(a))}}}),n}var rf=Symbol("INITIAL_FRUSTUM_CULLED"),Xl=new sn,rs=new Ie,lu=new hu,$C=new Ie(1,0,0),XC=new Ie(0,1,0),qC=()=>null;function Yg(e,t){e.traverse(n=>{n.frustumCulled=n[rf]&&t})}var yu=class extends _g{get autoDisableRendererCulling(){return this._autoDisableRendererCulling}set autoDisableRendererCulling(e){this._autoDisableRendererCulling!==e&&(super._autoDisableRendererCulling=e,this.forEachLoadedModel(t=>{Yg(t,!e)}))}constructor(...e){super(...e),this.accelerateRaycast=!0,this.group=new DC(this),this.ellipsoid=os.clone(),this.cameras=[],this.cameraMap=new Map,this.cameraInfo=[],this._upRotationMatrix=new sn,this._bytesUsed=new WeakMap,this._autoDisableRendererCulling=!0,this.manager=new wC,this._listeners={}}addEventListener(e,t){jl.prototype.addEventListener.call(this,e,t)}hasEventListener(e,t){return jl.prototype.hasEventListener.call(this,e,t)}removeEventListener(e,t){jl.prototype.removeEventListener.call(this,e,t)}dispatchEvent(e){jl.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)tf(this,this.root,e,t);else{let n=e.firstHitOnly?[]:t;for(let i of this.activeTiles){let{scene:r}=i.engineData;this.invokeOnePlugin(o=>o.raycastTile&&o.raycastTile(i,r,e,n))||e.intersectObject(r,!0,n)}e.firstHitOnly&&n.length>0&&(n.sort((i,r)=>i.distance-r.distance),t.push(n[0]))}}hasCamera(e){return this.cameraMap.has(e)}setCamera(e){let t=this.cameras,n=this.cameraMap;return n.has(e)?!1:(n.set(e,new hu),t.push(e),this.dispatchEvent({type:"add-camera",camera:e}),!0)}setResolution(e,t,n){let i=this.cameraMap;if(!i.has(e))return!1;let r=t.isVector2?t.x:t,o=t.isVector2?t.y:n,a=i.get(e);return(a.width!==r||a.height!==o)&&(a.set(r,o),this.dispatchEvent({type:"camera-resolution-change"})),!0}getResolution(e,t){let n=this.cameraMap.get(e);return n?t.copy(n):null}setResolutionFromRenderer(e,t){return t.getSize(lu),this.setResolution(e,lu.x,lu.y)}deleteCamera(e){let t=this.cameras,n=this.cameraMap;if(n.has(e)){let i=t.indexOf(e);return t.splice(i,1),n.delete(e),this.dispatchEvent({type:"delete-camera",camera:e}),!0}return!1}loadRootTileset(...e){return super.loadRootTileset(...e).then(t=>{let{asset:n,extensions:i={}}=t;switch((n&&n.gltfUpAxis||"y").toLowerCase()){case"x":this._upRotationMatrix.makeRotationAxis(XC,-Math.PI/2);break;case"y":this._upRotationMatrix.makeRotationAxis($C,Math.PI/2);break}if("3DTILES_ellipsoid"in i){let r=i["3DTILES_ellipsoid"],{ellipsoid:o}=this;o.name=r.body,r.radii?o.radius.set(...r.radii):o.radius.set(1,1,1)}return t})}prepareForTraversal(){let e=this.group,t=this.cameras,n=this.cameraMap,i=this.cameraInfo;for(;i.length>t.length;)i.pop();for(;i.length<t.length;)i.push({frustum:new GC,isOrthographic:!1,sseDenominator:-1,position:new Ie,invScale:-1,pixelSize:0});rs.setFromMatrixScale(e.matrixWorldInverse),Math.abs(Math.max(rs.x-rs.y,rs.x-rs.z))>1e-6&&console.warn("ThreeTilesRenderer : Non uniform scale used for tile which may cause issues when calculating screen space error.");for(let r=0,o=i.length;r<o;r++){let a=t[r],s=i[r],c=s.frustum,l=s.position,u=n.get(a);(u.width===0||u.height===0)&&console.warn("TilesRenderer: resolution for camera error calculation is not set.");let d=a.projectionMatrix.elements;if(s.isOrthographic=d[15]===1,s.isOrthographic){let p=2/d[0],g=2/d[5];s.pixelSize=Math.max(g/u.height,p/u.width)}else s.sseDenominator=2/d[5]/u.height;Xl.copy(e.matrixWorld),Xl.premultiply(a.matrixWorldInverse),Xl.premultiply(a.projectionMatrix),c.setFromProjectionMatrix(Xl,a.coordinateSystem,a.reversedDepth),l.set(0,0,0),l.applyMatrix4(a.matrixWorld),l.applyMatrix4(e.matrixWorldInverse)}}update(){if(super.update(),this.cameras.length===0&&this.root){let e=!1;this.invokeAllPlugins(t=>e||(e=!!(t!==this&&t.calculateTileViewError))),e===!1&&console.warn("TilesRenderer: no cameras defined. Cannot update 3d tiles.")}}preprocessNode(e,t,n=null){super.preprocessNode(e,t,n);let i=new sn;if(e.transform){let a=e.transform;for(let s=0;s<16;s++)i.elements[s]=a[s]}n&&i.premultiply(n.engineData.transform);let r=new sn().copy(i).invert(),o=new VC;"sphere"in e.boundingVolume&&o.setSphereData(...e.boundingVolume.sphere,i),"box"in e.boundingVolume&&o.setObbData(e.boundingVolume.box,i),"region"in e.boundingVolume&&o.setRegionData(this.ellipsoid,...e.boundingVolume.region),e.engineData.transform=i,e.engineData.transformInverse=r,e.engineData.boundingVolume=o,e.engineData.geometry=null,e.engineData.materials=null,e.engineData.textures=null,e.toJSON=qC}async parseTile(e,t,n,i,r){let o=t.engineData,a=Il(i),s=this.fetchOptions,c=this.manager,l=null,u=o.transform,d=this._upRotationMatrix,p=(Gi(e)||n).toLowerCase();switch(p){case"b3dm":{let m=new gu(c);m.workingPath=a,m.fetchOptions=s,m.adjustmentTransform.copy(d),l=m.parse(e);break}case"pnts":{let m=new fu(c);m.workingPath=a,m.fetchOptions=s,l=m.parse(e);break}case"i3dm":{let m=new xu(c);m.workingPath=a,m.fetchOptions=s,m.adjustmentTransform.copy(d),m.ellipsoid.copy(this.ellipsoid),l=m.parse(e);break}case"cmpt":{let m=new ef(c);m.workingPath=a,m.fetchOptions=s,m.adjustmentTransform.copy(d),m.ellipsoid.copy(this.ellipsoid),l=m.parse(e).then(S=>S.scene);break}case"gltf":case"glb":{let m=c.getHandler("path.gltf")||c.getHandler("path.glb")||new mu(c);m.setWithCredentials(s.credentials==="include"),m.setRequestHeader(s.headers||{}),s.credentials==="include"&&s.mode==="cors"&&m.setCrossOrigin("use-credentials");let S=m.resourcePath||m.path||a;!/[\\/]$/.test(S)&&S.length&&(S+="/"),l=m.parseAsync(e,S).then(M=>{M.scene=M.scene||new uu;let{scene:T}=M;return T.updateMatrix(),T.matrix.multiply(d).decompose(T.position,T.quaternion,T.scale),M});break}default:l=this.invokeOnePlugin(m=>m.parseToMesh&&m.parseToMesh(e,t,n,i,r));break}let g=await l;if(g===null)throw Error(`TilesRenderer: Content type "${p}" not supported.`);let f,v;g.isObject3D?(f=g,v=null):(f=g.scene,v=g),f.updateMatrix(),f.matrix.premultiply(u),f.matrix.decompose(f.position,f.quaternion,f.scale),await this.invokeAllPlugins(m=>m.processTileModel&&m.processTileModel(f,t)),f.traverse(m=>{m[rf]=m.frustumCulled,m.userData.tile=t}),Yg(f,!this.autoDisableRendererCulling);let P=[],y=[],h=[];if(f.traverse(m=>{if(m.geometry&&y.push(m.geometry),m.material){let S=m.material;P.push(m.material);for(let M in S){let T=S[M];T&&T.isTexture&&h.push(T)}}}),r.aborted){for(let m=0,S=h.length;m<S;m++){let M=h[m];M.image instanceof ImageBitmap&&M.image.close(),M.dispose()}return}o.materials=P,o.geometry=y,o.textures=h,o.scene=f,o.metadata=v}disposeTile(e){super.disposeTile(e);let t=e.engineData;if(t.scene){let n=t.materials,i=t.geometry,r=t.textures,o=t.scene.parent;t.scene.traverse(a=>{a.userData.meshFeatures&&a.userData.meshFeatures.dispose(),a.userData.structuralMetadata&&a.userData.structuralMetadata.dispose()});for(let a=0,s=i.length;a<s;a++)i[a].dispose();for(let a=0,s=n.length;a<s;a++)n[a].dispose();for(let a=0,s=r.length;a<s;a++){let c=r[a];c.image instanceof ImageBitmap&&c.image.close(),c.dispose()}o&&o.remove(t.scene),t.scene=null,t.materials=null,t.textures=null,t.geometry=null,t.metadata=null}}setTileActive(e,t){super.setTileActive(e,t);let n=e.engineData.scene;n&&(t?(n.parent=this.group,n.updateMatrixWorld(!0)):n.parent=null)}setTileVisible(e,t){let n=e.engineData.scene,{activeTiles:i,group:r}=this;n&&(t?r.add(n):(r.remove(n),i.has(e)&&(n.parent=r))),super.setTileVisible(e,t)}calculateBytesUsed(e,t){let n=this._bytesUsed;return!n.has(e)&&t&&n.set(e,WC(t)),n.get(e)??null}calculateTileViewError(e,t){let n=e.engineData,i=this.cameras,r=this.cameraInfo,o=n.boundingVolume,a=!1,s=0,c=1/0,l=0,u=1/0;for(let d=0,p=i.length;d<p;d++){let g=r[d],f,v;if(g.isOrthographic){let y=g.pixelSize;f=e.geometricError/y,v=1/0}else{let y=g.sseDenominator;v=o.distanceToPoint(g.position),f=v===0?1/0:e.geometricError/(v*y)}let P=r[d].frustum;o.intersectsFrustum(P)&&(a=!0,s=Math.max(s,f),c=Math.min(c,v)),l=Math.max(l,f),u=Math.min(u,v)}a?(t.inView=!0,t.error=s,t.distanceFromCamera=c):(t.inView=!1,t.error=l,t.distanceFromCamera=u)}dispose(){super.dispose(),this.group.removeFromParent()}};import{BatchedMesh as iL,Box2 as YC,Box3 as oL,Box3Helper as aL,BoxGeometry as sL,BufferAttribute as Cu,BufferGeometry as lL,CanvasTexture as cL,Color as dL,CustomBlending as KC,DataTexture as JC,DefaultLoadingManager as uL,DoubleSide as pL,EventDispatcher as hL,FileLoader as QC,FloatType as mL,Frustum as gL,GreaterDepth as fL,Group as bL,LineBasicMaterial as xL,LineSegments as yL,LinearFilter as ZC,LinearMipMapLinearFilter as vL,MathUtils as Su,Matrix2 as eS,Matrix3 as tS,Matrix4 as nS,Mesh as wL,MeshBasicMaterial as rS,MeshLambertMaterial as CL,MeshStandardMaterial as SL,OneFactor as iS,PlaneGeometry as ML,Points as TL,PointsMaterial as PL,Quaternion as kL,REVISION as _L,RGFormat as AL,Ray as RL,Raycaster as EL,RedFormat as LL,SRGBColorSpace as BL,ShaderMaterial as oS,Source as OL,Sphere as DL,SphereGeometry as NL,Texture as IL,TextureUtils as zL,Triangle as jL,UnsignedByteType as VL,Vector2 as br,Vector3 as vf,Vector4 as aS,WebGLArrayRenderTarget as FL,WebGLRenderTarget as of,WebGLRenderer as sS,ZeroFactor as lS}from"three";import{GLTFLoader as cS}from"three/addons/loaders/GLTFLoader.js";import{FullScreenQuad as wf}from"three/addons/postprocessing/Pass.js";var HL=Object.freeze({fill:"#cccccc",stroke:"transparent",strokeWidth:1,radius:2,order:0,visible:!0});var af=new Go;af.maxJobs=10,af.priorityCallback=(e,t)=>{let n=e.tile,i=t.tile,r=n.internal.renderer,o=i.internal.renderer,a=r.visibleTiles.has(n);return a===o.visibleTiles.has(i)?Ja(n,i):a?1:-1};var sf=new vf;function as(e,t){if(e.isInterleavedBufferAttribute||e.array instanceof t)return e;let n=t===Int8Array||t===Int16Array||t===Int32Array?-1:0,i=new Cu(new t(e.count*e.itemSize),e.itemSize,!0),r=e.itemSize,o=e.count;for(let a=0;a<o;a++)for(let s=0;s<r;s++){let c=Su.clamp(e.getComponent(a,s),n,1);i.setComponent(a,s,c)}return i}function dS(e,t=Int16Array){let n=e.geometry,i=n.attributes,r=i.position;if(r.isInterleavedBufferAttribute||r.array instanceof t)return r;let o=new Cu(new t(r.count*r.itemSize),r.itemSize,!1),a=r.itemSize,s=r.count;n.computeBoundingBox();let c=n.boundingBox,{min:l,max:u}=c,d=2**(8*t.BYTES_PER_ELEMENT-1)-1,p=-d;for(let g=0;g<s;g++)for(let f=0;f<a;f++){let v=f===0?"x":f===1?"y":"z",P=l[v],y=u[v],h=Su.mapLinear(r.getComponent(g,f),P,y,p,d);o.setComponent(g,f,h)}c.getCenter(sf).multiply(e.scale).applyQuaternion(e.quaternion),e.position.add(sf),e.scale.x*=.5*(u.x-l.x)/d,e.scale.y*=.5*(u.y-l.y)/d,e.scale.z*=.5*(u.z-l.z)/d,i.position=o,e.geometry.boundingBox=null,e.geometry.boundingSphere=null,e.updateMatrixWorld()}var Mu=class{constructor(e){this._options={generateNormals:!1,disableMipmaps:!0,compressIndex:!0,compressNormals:!1,compressUvs:!1,compressPosition:!1,uvType:Int8Array,normalType:Int8Array,positionType:Int16Array,...e},this.name="TILES_COMPRESSION_PLUGIN",this.priority=-100}processTileModel(e,t){let{generateNormals:n,disableMipmaps:i,compressIndex:r,compressUvs:o,compressNormals:a,compressPosition:s,uvType:c,normalType:l,positionType:u}=this._options;e.traverse(d=>{if(d.material&&i){let p=d.material;for(let g in p){let f=p[g];f&&f.isTexture&&f.generateMipmaps&&(f.generateMipmaps=!1,f.minFilter=ZC)}}if(d.geometry){let p=d.geometry,g=p.attributes;if(o){let{uv:f,uv1:v,uv2:P,uv3:y}=g;f&&(g.uv=as(f,c)),v&&(g.uv1=as(v,c)),P&&(g.uv2=as(P,c)),y&&(g.uv3=as(y,c))}if(n&&!g.normals&&p.computeVertexNormals(),a&&g.normals&&(g.normals=as(g.normals,l)),s&&dS(d,u),r&&p.index){let f=g.position.count,v=p.index,P=f>65535?Uint32Array:f>255?Uint16Array:Uint8Array;if(!(v.array instanceof P)){let y=new P(p.index.count);y.set(v.array);let h=new Cu(y,1);p.setIndex(h)}}}})}};function ln(e,t,n){return e&&t in e?e[t]:n}function Cf(e){return e!=="BOOLEAN"&&e!=="STRING"&&e!=="ENUM"}function uS(e){return/^FLOAT/.test(e)}function ds(e){return/^VEC/.test(e)}function us(e){return/^MAT/.test(e)}function Sf(e,t,n,i=null){return us(n)||ds(n)?i.fromArray(e,t):e[t]}function vu(e){let{type:t,componentType:n}=e;switch(t){case"SCALAR":return n==="INT64"?0n:0;case"VEC2":return new br;case"VEC3":return new vf;case"VEC4":return new aS;case"MAT2":return new eS;case"MAT3":return new tS;case"MAT4":return new nS;case"BOOLEAN":return!1;case"STRING":return"";case"ENUM":return 0}}function lf(e,t){if(t==null)return!1;switch(e){case"SCALAR":return typeof t=="number"||typeof t=="bigint";case"VEC2":return t.isVector2;case"VEC3":return t.isVector3;case"VEC4":return t.isVector4;case"MAT2":return t.isMatrix2;case"MAT3":return t.isMatrix3;case"MAT4":return t.isMatrix4;case"BOOLEAN":return typeof t=="boolean";case"STRING":return typeof t=="string";case"ENUM":return typeof t=="number"||typeof t=="bigint"}throw Error("ClassProperty: invalid type.")}function cs(e,t=null){switch(e){case"INT8":return Int8Array;case"INT16":return Int16Array;case"INT32":return Int32Array;case"INT64":return BigInt64Array;case"UINT8":return Uint8Array;case"UINT16":return Uint16Array;case"UINT32":return Uint32Array;case"UINT64":return BigUint64Array;case"FLOAT32":return Float32Array;case"FLOAT64":return Float64Array}switch(t){case"BOOLEAN":return Uint8Array;case"STRING":return Uint8Array}throw Error("ClassProperty: invalid type.")}function pS(e,t=null){if(e.array){t=t&&Array.isArray(t)?t:[],t.length=e.count;for(let n=0,i=t.length;n<i;n++)t[n]=Yl(e,t[n])}else t=Yl(e,t);return t}function Yl(e,t=null){let n=e.default,i=e.type;if(t||(t=vu(e)),n===null){switch(i){case"SCALAR":return 0;case"VEC2":return t.set(0,0);case"VEC3":return t.set(0,0,0);case"VEC4":return t.set(0,0,0,0);case"MAT2":return t.identity();case"MAT3":return t.identity();case"MAT4":return t.identity();case"BOOLEAN":return!1;case"STRING":return"";case"ENUM":return""}throw Error("ClassProperty: invalid type.")}else if(us(i))t.fromArray(n);else if(ds(i))t.fromArray(n);else return n}function hS(e,t){if(e.noData===null)return t;let n=e.noData,i=e.type;if(Array.isArray(t))for(let a=0,s=t.length;a<s;a++)t[a]=r(t[a]);else t=r(t);return t;function r(a){return o(a)&&(a=Yl(e,a)),a}function o(a){if(us(i)){let s=a.elements;for(let c=0,l=n.length;c<l;c++)if(n[c]!==s[c])return!1;return!0}else if(ds(i)){for(let s=0,c=n.length;s<c;s++)if(n[s]!==a.getComponent(s))return!1;return!0}else return n===a}}function mS(e,t){switch(e){case"INT8":return Math.max(t/127,-1);case"INT16":return Math.max(t,32767,-1);case"INT32":return Math.max(t/2147483647,-1);case"INT64":return Math.max(Number(t)/9223372036854776e3,-1);case"UINT8":return t/255;case"UINT16":return t/65535;case"UINT32":return t/4294967295;case"UINT64":return Number(t)/18446744073709552e3}}function gS(e,t){let{type:n,componentType:i,scale:r,offset:o,normalized:a}=e;if(Array.isArray(t))for(let d=0,p=t.length;d<p;d++)t[d]=s(t[d]);else t=s(t);return t;function s(d){return d=us(n)?l(d):ds(n)?c(d):u(d),d}function c(d){return d.x=u(d.x),d.y=u(d.y),"z"in d&&(d.z=u(d.z)),"w"in d&&(d.w=u(d.w)),d}function l(d){let p=d.elements;for(let g=0,f=p.length;g<f;g++)p[g]=u(p[g]);return d}function u(d){return a&&(d=mS(i,d)),(a||uS(i))&&(d=d*r+o),d}}function Tu(e,t,n=null){if(e.array){Array.isArray(t)||(t=Array(e.count||0)),t.length=n===null?e.count:n;for(let i=0,r=t.length;i<r;i++)lf(e.type,t[i])||(t[i]=vu(e))}else lf(e.type,t)||(t=vu(e));return t}function Kl(e,t){for(let n in t)n in e||delete t[n];for(let n in e){let i=e[n];t[n]=Tu(i,t[n])}}function fS(e){switch(e){case"ENUM":return 1;case"SCALAR":return 1;case"VEC2":return 2;case"VEC3":return 3;case"VEC4":return 4;case"MAT2":return 4;case"MAT3":return 9;case"MAT4":return 16;case"BOOLEAN":return-1;case"STRING":return-1;default:return-1}}var Ql=class{constructor(e,t,n=null){this.name=t.name||null,this.description=t.description||null,this.type=t.type,this.componentType=t.componentType||null,this.enumType=t.enumType||null,this.array=t.array||!1,this.count=t.count||0,this.normalized=t.normalized||!1,this.offset=t.offset||0,this.scale=ln(t,"scale",1),this.max=ln(t,"max",1/0),this.min=ln(t,"min",-1/0),this.required=t.required||!1,this.noData=ln(t,"noData",null),this.default=ln(t,"default",null),this.semantic=ln(t,"semantic",null),this.enumSet=null,this.accessorProperty=n,n&&(this.offset=ln(n,"offset",this.offset),this.scale=ln(n,"scale",this.scale),this.max=ln(n,"max",this.max),this.min=ln(n,"min",this.min)),t.type==="ENUM"&&(this.enumSet=e[this.enumType],this.componentType===null&&(this.componentType=ln(this.enumSet,"valueType","UINT16")))}shapeToProperty(e,t=null){return Tu(this,e,t)}resolveDefaultElement(e){return Yl(this,e)}resolveDefault(e){return pS(this,e)}resolveNoData(e){return hS(this,e)}resolveEnumsToStrings(e){let t=this.enumSet;if(this.type==="ENUM")if(Array.isArray(e))for(let i=0,r=e.length;i<r;i++)e[i]=n(e[i]);else e=n(e);return e;function n(i){let r=t.values.find(o=>o.value===i);return r===null?"":r.name}}adjustValueScaleOffset(e){return Cf(this.type)?gS(this,e):e}},Pu=class{constructor(e,t={},n={},i=null){this.definition=e,this.class=t[e.class],this.className=e.class,this.enums=n,this.data=i,this.name="name"in e?e.name:null,this.properties=null}getPropertyNames(){return Object.keys(this.class.properties)}includesData(e){return!!this.definition.properties[e]}dispose(){}_initProperties(e=Ql){let t={};for(let n in this.class.properties)t[n]=new e(this.enums,this.class.properties[n],this.definition.properties[n]);this.properties=t}},bS=class extends Ql{constructor(e,t,n=null){super(e,t,n),this.attribute=n?.attribute??null}},xS=class extends Pu{constructor(...e){super(...e),this.isPropertyAttributeAccessor=!0,this._initProperties(bS)}getData(e,t,n={}){let i=this.properties;Kl(i,n);for(let r in i)n[r]=this.getPropertyValue(r,e,t,n[r]);return n}getPropertyValue(e,t,n,i=null){if(t>=this.count)throw Error("PropertyAttributeAccessor: Requested index is outside the range of the buffer.");let r=this.properties[e],o=r.type;if(!r)throw Error("PropertyAttributeAccessor: Requested class property does not exist.");if(!this.definition.properties[e])return r.resolveDefault(i);i=r.shapeToProperty(i);let a=n.getAttribute(r.attribute.toLowerCase());if(us(o)){let s=i.elements;for(let c=s.length;0<c;)s[0]=a.getComponent(t,0)}else if(ds(o))i.fromBufferAttribute(a,t);else if(o==="SCALAR"||o==="ENUM")i=a.getX(t);else throw Error("StructuredMetadata.PropertyAttributeAccessor: BOOLEAN and STRING types are not supported by property attributes.");return i=r.adjustValueScaleOffset(i),i=r.resolveEnumsToStrings(i),i=r.resolveNoData(i),i}},yS=class extends Ql{constructor(e,t,n=null){super(e,t,n),this.values=n?.values??null,this.valueLength=fS(this.type),this.arrayOffsets=ln(n,"arrayOffsets",null),this.stringOffsets=ln(n,"stringOffsets",null),this.arrayOffsetType=ln(n,"arrayOffsetType","UINT32"),this.stringOffsetType=ln(n,"stringOffsetType","UINT32")}getArrayLengthFromId(e,t){let n=this.count;if(this.arrayOffsets!==null){let{arrayOffsets:i,arrayOffsetType:r}=this,o=new(cs(r))(e[i]);n=o[t+1]-o[t]}return n}getIndexOffsetFromId(e,t){let n=t;if(this.arrayOffsets){let{arrayOffsets:i,arrayOffsetType:r}=this;n=new(cs(r))(e[i])[n]}else this.array&&(n*=this.count);return n}},vS=class extends Pu{constructor(...e){super(...e),this.isPropertyTableAccessor=!0,this.count=this.definition.count,this._initProperties(yS)}getData(e,t={}){let n=this.properties;Kl(n,t);for(let i in n)t[i]=this.getPropertyValue(i,e,t[i]);return t}_readValueAtIndex(e,t,n,i=null){let r=this.properties[e],{componentType:o,type:a}=r,s=this.data,c=s[r.values],l=new(cs(o,a))(c),u=r.getIndexOffsetFromId(s,t);if(Cf(a)||a==="ENUM")return Sf(l,(u+n)*r.valueLength,a,i);if(a==="STRING"){let d=u+n,p=0;if(r.stringOffsets!==null){let{stringOffsets:f,stringOffsetType:v}=r,P=new(cs(v))(s[f]);p=P[d+1]-P[d],d=P[d]}let g=new Uint8Array(l.buffer,d,p);i=new TextDecoder().decode(g)}else if(a==="BOOLEAN"){let d=u+n,p=Math.floor(d/8),g=d%8;i=(l[p]>>g&1)==1}return i}getPropertyValue(e,t,n=null){if(t>=this.count)throw Error("PropertyTableAccessor: Requested index is outside the range of the table.");let i=this.properties[e];if(!i)throw Error("PropertyTableAccessor: Requested property does not exist.");if(!this.definition.properties[e])return i.resolveDefault(n);let r=i.array,o=this.data,a=i.getArrayLengthFromId(o,t);if(n=i.shapeToProperty(n,a),r)for(let s=0,c=n.length;s<c;s++)n[s]=this._readValueAtIndex(e,t,s,n[s]);else n=this._readValueAtIndex(e,t,0,n);return n=i.adjustValueScaleOffset(n),n=i.resolveEnumsToStrings(n),n=i.resolveNoData(n),n}},ss=new YC,cf=class{constructor(){this._renderer=new sS,this._target=new of(1,1),this._texTarget=new of,this._quad=new wf(new oS({blending:KC,blendDst:lS,blendSrc:iS,uniforms:{map:{value:null},pixel:{value:new br}},vertexShader:`
|
|
10
10
|
void main() {
|
|
11
11
|
|
|
12
12
|
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
|
|
@@ -21,6 +21,6 @@
|
|
|
21
21
|
gl_FragColor = texelFetch( map, pixel, 0 );
|
|
22
22
|
|
|
23
23
|
}
|
|
24
|
-
`}))}increaseSizeTo(e){this._target.setSize(Math.max(this._target.width,e),1)}readDataAsync(e){let{_renderer:t,_target:n}=this;return t.readRenderTargetPixelsAsync(n,0,0,e.length/4,1,e)}readData(e){let{_renderer:t,_target:n}=this;t.readRenderTargetPixels(n,0,0,e.length/4,1,e)}renderPixelToTarget(e,t,n){let{_renderer:i,_target:r}=this;rs.min.copy(t),rs.max.copy(t),rs.max.x+=1,rs.max.y+=1,i.initRenderTarget(r),i.copyTextureToTexture(e,r.texture,rs,n,0)}},si=new class{constructor(){let e=null;Object.getOwnPropertyNames(tf.prototype).forEach(t=>{t!=="constructor"&&(this[t]=(...n)=>(e||(e=new tf),e[t](...n)))})}},nf=new fr,rf=new fr,of=new fr;function hS(e,t){return t===0?e.getAttribute("uv"):e.getAttribute(`uv${t}`)}function bf(e,t,n=[,,,]){let i=3*t,r=3*t+1,o=3*t+2;return e.index&&(i=e.index.getX(i),r=e.index.getX(r),o=e.index.getX(o)),n[0]=i,n[1]=r,n[2]=o,n}function xf(e,t,n,i,r){let[o,a,l]=i,s=hS(e,t);nf.fromBufferAttribute(s,o),rf.fromBufferAttribute(s,a),of.fromBufferAttribute(s,l),r.set(0,0,0).addScaledVector(nf,n.x).addScaledVector(rf,n.y).addScaledVector(of,n.z)}function yf(e,t,n,i){let r=e.x-Math.floor(e.x),o=e.y-Math.floor(e.y),a=Math.floor(r*t%t),l=Math.floor(o*n%n);return i.set(a,l),i}var af=new fr,sf=new fr,lf=new fr,mS=class extends Jl{constructor(e,t,n=null){super(e,t,n),this.channels=sn(n,"channels",[0]),this.index=sn(n,"index",null),this.texCoord=sn(n,"texCoord",null),this.valueLength=parseInt(this.type.replace(/[^0-9]/g,""))||1}readDataFromBuffer(e,t,n=null){let i=this.type;if(i==="BOOLEAN"||i==="STRING")throw Error("PropertyTextureAccessor: BOOLEAN and STRING types not supported.");return ff(e,t*this.valueLength,i,n)}},gS=class extends yu{constructor(...e){super(...e),this.isPropertyTextureAccessor=!0,this._asyncRead=!1,this._initProperties(mS)}getData(e,t,n,i={}){let r=this.properties;Yl(r,i);let o=Object.keys(r),a=o.map(l=>i[l]);return this.getPropertyValuesAtTexel(o,e,t,n,a),o.forEach((l,s)=>i[l]=a[s]),i}async getDataAsync(e,t,n,i={}){let r=this.properties;Yl(r,i);let o=Object.keys(r),a=o.map(l=>i[l]);return await this.getPropertyValuesAtTexelAsync(o,e,t,n,a),o.forEach((l,s)=>i[l]=a[s]),i}getPropertyValuesAtTexelAsync(...e){this._asyncRead=!0;let t=this.getPropertyValuesAtTexel(...e);return this._asyncRead=!1,t}getPropertyValuesAtTexel(e,t,n,i,r=[]){for(;r.length<e.length;)r.push(null);r.length=e.length,si.increaseSizeTo(r.length);let o=this.data,a=this.definition.properties,l=this.properties,s=bf(i,t);for(let c=0,p=e.length;c<p;c++){let g=e[c];if(!a[g])continue;let f=l[g],v=o[f.index];xf(i,f.texCoord,n,s,af),yf(af,v.image.width,v.image.height,sf),lf.set(c,0),si.renderPixelToTarget(v,sf,lf)}let d=new Uint8Array(e.length*4);if(this._asyncRead)return si.readDataAsync(d).then(()=>(u.call(this),r));return si.readData(d),u.call(this),r;function u(){for(let c=0,p=e.length;c<p;c++){let g=e[c],f=l[g],v=f.type;if(r[c]=xu(f,r[c]),!f)throw Error("PropertyTextureAccessor: Requested property does not exist.");if(!a[g]){r[c]=f.resolveDefault(r);continue}let P=f.valueLength*(f.count||1),y=f.channels.map(S=>d[4*c+S]),h=f.componentType,m=new(os(h,v))(P);if(new Uint8Array(m.buffer).set(y),f.array){let S=r[c];for(let M=0,T=S.length;M<T;M++)S[M]=f.readDataFromBuffer(m,M,S[M])}else r[c]=f.readDataFromBuffer(m,0,r[c]);r[c]=f.adjustValueScaleOffset(r[c]),r[c]=f.resolveEnumsToStrings(r[c]),r[c]=f.resolveNoData(r[c])}}}dispose(){this.data.forEach(e=>{e&&(e.dispose(),e.image instanceof ImageBitmap&&e.image.close())})}},mu=class{constructor(e,t,n,i=null,r=null){let{schema:o,propertyTables:a=[],propertyTextures:l=[],propertyAttributes:s=[]}=e,{enums:d,classes:u}=o,c=a.map(f=>new pS(f,u,d,n)),p=[],g=[];i&&(i.propertyTextures&&(p=i.propertyTextures.map(f=>new gS(l[f],u,d,t))),i.propertyAttributes&&(g=i.propertyAttributes.map(f=>new dS(s[f],u,d)))),this.schema=o,this.tableAccessors=c,this.textureAccessors=p,this.attributeAccessors=g,this.object=r,this.textures=t,this.nodeMetadata=i}getPropertyTableData(e,t,n=null){if(!Array.isArray(e))n||(n={}),n=this.tableAccessors[e].getData(t,n);else{n||(n=[]);let i=Math.min(e.length,t.length);n.length=i;for(let r=0;r<i;r++){let o=this.tableAccessors[e[r]];n[r]=o.getData(t[r],n[r])}}if(Array.isArray(e)!==Array.isArray(n)||Array.isArray(e)!==Array.isArray(t))throw Error("StructuralMetadata: Scalar and array inputs cannot be mixed.");return n}getPropertyTableInfo(e=null){if(e===null&&(e=this.tableAccessors.map((t,n)=>n)),Array.isArray(e))return e.map(t=>{let n=this.tableAccessors[t];return{name:n.name,className:n.definition.class}});{let t=this.tableAccessors[e];return{name:t.name,className:t.definition.class}}}getPropertyTextureData(e,t,n=[]){let i=this.textureAccessors;n.length=i.length;for(let r=0;r<i.length;r++)n[r]=i[r].getData(e,t,this.object.geometry,n[r]);return n}async getPropertyTextureDataAsync(e,t,n=[]){let i=this.textureAccessors;n.length=i.length;let r=[];for(let o=0;o<i.length;o++){let a=i[o].getDataAsync(e,t,this.object.geometry,n[o]).then(l=>{n[o]=l});r.push(a)}return await Promise.all(r),n}getPropertyTextureInfo(){return this.textureAccessors}getPropertyAttributeData(e,t=[]){let n=this.attributeAccessors;t.length=n.length;for(let i=0;i<n.length;i++)t[i]=n[i].getData(e,this.object.geometry,t[i]);return t}getPropertyAttributeInfo(){return this.attributeAccessors.map(e=>({name:e.name,className:e.definition.class}))}dispose(){this.textureAccessors.forEach(e=>e.dispose()),this.tableAccessors.forEach(e=>e.dispose()),this.attributeAccessors.forEach(e=>e.dispose())}},is="EXT_structural_metadata";function fS(e,t=[]){let n=e.json.textures?.length||0,i=Array(n).fill(null);return t.forEach(({properties:r})=>{for(let o in r){let{index:a}=r[o];i[a]===null&&(i[a]=e.loadTexture(a))}}),Promise.all(i)}function bS(e,t=[]){let n=e.json.bufferViews?.length||0,i=Array(n).fill(null);return t.forEach(({properties:r})=>{for(let o in r){let{values:a,arrayOffsets:l,stringOffsets:s}=r[o];i[a]===null&&(i[a]=e.getDependency("bufferView",a)),i[l]===null&&(i[l]=e.getDependency("bufferView",l)),i[s]===null&&(i[s]=e.getDependency("bufferView",s))}}),Promise.all(i)}var vf=class{constructor(e){this.parser=e,this.name=is}async afterRoot({scene:e,parser:t}){let n=t.json.extensionsUsed;if(!n||!n.includes(is))return;let i=null,r=t.json.extensions[is];if(r.schemaUri){let{manager:s,path:d,requestHeader:u,crossOrigin:c}=t.options,p=new URL(r.schemaUri,d).toString(),g=new HC(s);g.setCrossOrigin(c),g.setResponseType("json"),g.setRequestHeader(u),i=g.loadAsync(p).then(f=>{r={...r,schema:f}})}let[o,a]=await Promise.all([fS(t,r.propertyTextures),bS(t,r.propertyTables),i]),l=new mu(r,o,a);e.userData.structuralMetadata=l,e.traverse(s=>{if(t.associations.has(s)){let{meshes:d,primitives:u}=t.associations.get(s),c=t.json.meshes[d]?.primitives[u];if(c&&c.extensions&&c.extensions[is]){let p=c.extensions[is];s.userData.structuralMetadata=new mu(r,o,a,p,s)}else s.userData.structuralMetadata=l}})}},cf=new fr,df=new fr,uf=new fr;function xS(e){return e.x>e.y&&e.x>e.z?0:e.y>e.z?1:2}var wf=class{constructor(e,t,n){this.geometry=e,this.textures=t,this.data=n,this._asyncRead=!1,this.featureIds=n.featureIds.map(i=>{let{texture:r,...o}=i,a={label:null,propertyTable:null,nullFeatureId:null,...o};return r&&(a.texture={texCoord:0,channels:[0],...r}),a})}getTextures(){return this.textures}getFeatureInfo(){return this.featureIds}getFeaturesAsync(...e){this._asyncRead=!0;let t=this.getFeatures(...e);return this._asyncRead=!1,t}getFeatures(e,t){let{geometry:n,textures:i,featureIds:r}=this,o=Array(r.length).fill(null),a=r.length;si.increaseSizeTo(a);let l=bf(n,e),s=l[xS(t)];for(let c=0,p=r.length;c<p;c++){let g=r[c],f="nullFeatureId"in g?g.nullFeatureId:null;if("texture"in g){let v=i[g.texture.index];xf(n,g.texture.texCoord,t,l,cf),yf(cf,v.image.width,v.image.height,df),uf.set(c,0),si.renderPixelToTarget(i[g.texture.index],df,uf)}else if("attribute"in g){let v=n.getAttribute(`_feature_id_${g.attribute}`).getX(s);v!==f&&(o[c]=v)}else{let v=s;v!==f&&(o[c]=v)}}let d=new Uint8Array(a*4);if(this._asyncRead)return si.readDataAsync(d).then(()=>(u(),o));return si.readData(d),u(),o;function u(){let c=new Uint32Array(1);for(let p=0,g=r.length;p<g;p++){let f=r[p],v="nullFeatureId"in f?f.nullFeatureId:null;if("texture"in f){let{channels:P}=f.texture,y=P.map(m=>d[4*p+m]);new Uint8Array(c.buffer).set(y);let h=c[0];h!==v&&(o[p]=h)}}}}dispose(){this.textures.forEach(e=>{e&&(e.dispose(),e.image instanceof ImageBitmap&&e.image.close())})}},Kl="EXT_mesh_features";function pf(e,t,n){e.traverse(i=>{if(t.associations.has(i)){let{meshes:r,primitives:o}=t.associations.get(i),a=t.json.meshes[r]?.primitives[o];a&&a.extensions&&a.extensions[Kl]&&n(i,a.extensions[Kl])}})}var Cf=class{constructor(e){this.parser=e,this.name=Kl}async afterRoot({scene:e,parser:t}){let n=t.json.extensionsUsed;if(!n||!n.includes(Kl))return;let i=t.json.textures?.length||0,r=Array(i).fill(null);pf(e,t,(a,{featureIds:l})=>{l.forEach(s=>{if(s.texture&&r[s.texture.index]===null){let d=s.texture.index;r[d]=t.loadTexture(d)}})});let o=await Promise.all(r);pf(e,t,(a,l)=>{a.userData.meshFeatures=new wf(a.geometry,o,l)})}},Sf=class{constructor(){this.name="CESIUM_RTC"}afterRoot(e){if(e.parser.json.extensions&&e.parser.json.extensions.CESIUM_RTC){let{center:t}=e.parser.json.extensions.CESIUM_RTC;t&&(e.scene.position.x+=t[0],e.scene.position.y+=t[1],e.scene.position.z+=t[2])}}},vu=class{constructor(e){e={metadata:!0,rtc:!0,plugins:[],dracoLoader:null,ktxLoader:null,meshoptDecoder:null,autoDispose:!0,...e},this.tiles=null,this.metadata=e.metadata,this.rtc=e.rtc,this.plugins=e.plugins,this.dracoLoader=e.dracoLoader,this.ktxLoader=e.ktxLoader,this.meshoptDecoder=e.meshoptDecoder,this._gltfRegex=/\.(gltf|glb)$/g,this._dracoRegex=/\.drc$/g,this._loader=null}init(e){let t=new tS(e.manager);this.dracoLoader&&(t.setDRACOLoader(this.dracoLoader),e.manager.addHandler(this._dracoRegex,this.dracoLoader)),this.ktxLoader&&t.setKTX2Loader(this.ktxLoader),this.meshoptDecoder&&t.setMeshoptDecoder(this.meshoptDecoder),this.rtc&&t.register(()=>new Sf),this.metadata&&(t.register(()=>new vf),t.register(()=>new Cf)),this.plugins.forEach(n=>t.register(n)),e.manager.addHandler(this._gltfRegex,t),this.tiles=e,this._loader=t}dispose(){this.tiles.manager.removeHandler(this._gltfRegex),this.tiles.manager.removeHandler(this._dracoRegex),this.autoDispose&&(this.ktxLoader.dispose(),this.dracoLoader.dispose())}};var{clamp:OL}=fu;var DL=new mf(new YC),yS=new GC(new Uint8Array([255,255,255,255]),1,1);yS.needsUpdate=!0;var vS=0,wS=1,CS=2,SS=3,MS=4,TS=5,PS=6,kS=7,_S=8,AS=9,RS=10,ES=11,NL=Object.freeze({NONE:vS,SCREEN_ERROR:wS,GEOMETRIC_ERROR:CS,DISTANCE:SS,DEPTH:MS,RELATIVE_DEPTH:TS,IS_LEAF:PS,RANDOM_COLOR:kS,RANDOM_NODE_COLOR:_S,CUSTOM_COLOR:AS,LOAD_ORDER:RS,INDEXED_COLOR:ES});var IL=Math.PI/4,zL=3/5;var ai={NONE:0,NOT_READY:1,NO_FIT:2,DEPTH:3,OCCUPANCY:4,SPACING:5,ANGLE:6,FACING:7};var jL=new class{constructor(){this._cache={}}getColor(...e){let t=e.pop(),n=e.join("_"),{_cache:i}=this;return n in i||(t.setHSL(Math.random(),1,.5),i[n]=t.getHex()),t.set(i[n])}};var VL={[ai.NONE]:16777215,[ai.NOT_READY]:7829367,[ai.NO_FIT]:2250239,[ai.DEPTH]:4473924,[ai.OCCUPANCY]:65535,[ai.SPACING]:16776960,[ai.ANGLE]:16711680,[ai.FACING]:16711935};var FL=Math.PI/180;var UL=Uo*Math.PI*2;var GL=Uo*Math.PI*2;import{DRACOLoader as IS}from"three/examples/jsm/loaders/DRACOLoader.js";import{KTX2Loader as zS}from"three/examples/jsm/loaders/KTX2Loader.js";import{MeshoptDecoder as jS}from"three/examples/jsm/libs/meshopt_decoder.module.js";import{Box3 as VS,MathUtils as FS,Sphere as US,Vector3 as GS}from"three";import{BufferAttribute as Mf,MathUtils as LS}from"three";function Tf(e,t,n,i){for(let r=0;r<e.count;r+=1)for(let o=0;o<e.itemSize;o+=1)t.setComponent(r,o,LS.clamp(e.getComponent(r,o),n,i));return t}function BS(e){for(let t=0;t<e.count;t+=1)for(let n=0;n<e.itemSize;n+=1){let i=e.getComponent(t,n);if(!Number.isFinite(i)||i<0||i>1)return!1}return!0}var Ql=class{constructor(){this.name="RI_VERTEX_COMPRESSION_PLUGIN";this.priority=-99}processTileModel(t){t.traverse(n=>{let i=n.geometry;if(!i)return;let r=i.attributes.normal;r&&!r.isInterleavedBufferAttribute&&!(r.array instanceof Int16Array)&&(i.attributes.normal=Tf(r,new Mf(new Int16Array(r.count*r.itemSize),r.itemSize,!0),-1,1));for(let o of["uv","uv1","uv2","uv3"]){let a=i.attributes[o];!a||a.isInterleavedBufferAttribute||a.array instanceof Uint16Array||!BS(a)||(i.attributes[o]=Tf(a,new Mf(new Uint16Array(a.count*a.itemSize),a.itemSize,!0),0,1))}})}};import{jsx as Pf,jsxs as WS}from"react/jsx-runtime";function HS(e){try{let t=typeof window>"u"?new URL(e):new URL(e,window.location.href);return new URL("objects.json",t).toString()}catch{return null}}function Cu({url:e,rotation:t=[0,0,0],errorTarget:n=64,cacheSize:i=800,memoryBudgetMB:r=800,decoderConfig:o,objectBindings:a,itemMaterials:l,sceneConfig:s,selectedItem:d,panelHoveredItem:u,highlightOnHover:c=!0,onItemClick:p,onItemHover:g,onObjectCatalog:f,onTilesetBounds:v,onModelLoaded:P,onLoadError:y,nodeRefsOut:h,onNodeRefsChange:m,materialRefsOut:S,explodeFactor:M=0,suspendBindingTransforms:T=!1}){let{camera:E,gl:b,invalidate:C}=NS(),x=Zn(null),[k,I]=wu(null),A=Zn({onItemClick:p,onItemHover:g,onObjectCatalog:f,onTilesetBounds:v,onModelLoaded:P,onLoadError:y,onNodeRefsChange:m});A.current={onItemClick:p,onItemHover:g,onObjectCatalog:f,onTilesetBounds:v,onModelLoaded:P,onLoadError:y,onNodeRefsChange:m};let z=Zn(!0),[_,V]=wu(null),F=Zn(null);F.current=_;let L=Zn([]),B=Zn(!1);Wi(()=>{let re=new _l;return V(re),()=>re.dispose()},[e]);let G=Zn(null),U=Zn(0),ae=Zn(!1),xe=r*1024*1024,le=Zn(!1),ge=o?.dracoDecoderPath??Ld,ve=o?.ktx2TranscoderPath??Bd,Te=o?.meshopt??!0,[ne,ct]=wu(null);Wi(()=>{ae.current=!1,le.current=!1;let re=new pu(e);re.loadAncestors=!0,re.downloadQueue.maxJobsPerOrigin=4,re.parseQueue.maxJobs=2;let X=ge?new IS().setDecoderPath(ge).setWorkerLimit(2):null,q=ve?new zS().setTranscoderPath(ve).detectSupport(b):null;return re.registerPlugin(new vu({dracoLoader:X,ktxLoader:q,meshoptDecoder:Te?jS:null,autoDispose:!1})),re.registerPlugin(new bu({disableMipmaps:!0,compressIndex:!0,compressNormals:!1,compressUvs:!1,compressPosition:!0})),re.registerPlugin(new Ql),ct(re),window.__riTiles=re,()=>{re.dispose(),X?.dispose(),q?.dispose(),ct(Pe=>Pe===re?null:Pe)}},[ge,b,ve,Te,e]),Wi(()=>{ne&&(ne.errorTarget=n,ne.lruCache.maxSize=i,ne.lruCache.minSize=Math.max(1,Math.floor(i*.75)),ne.lruCache.maxBytesSize=xe,ne.lruCache.minBytesSize=xe*.75,C())},[i,n,C,xe,ne]);let Ee=OS(()=>{let re=a??{};return{objectBindings:re,keyByModelObject:Zm(re),itemMaterials:l,shadingMode:s?.model.shading??"lit",rendererMode:s?.model.renderer??"pbr",selectedKey:d??null,hoveredKey:eg(k,u),highlightOnHover:c,suspendTransforms:T,invalidate:C}},[k,c,C,l,a,u,s,d,T]),Ae=Hi(()=>{if(!ne)return;let re=_t.current,X=B.current?F.current?.nodesByBinding(re)??{}:{},q={};ne.group.traverse(Pe=>{if(!Pe.isMesh)return;let De=Gd(Pe);if(!De)return;let Se=re.keyByModelObject[De]??De;if(!re.objectBindings[Se])return;X[Se]||(X[Se]=Pe);let fe=Pe.material;fe&&(q[Se]=fe)}),h&&(h.current=X),S&&(S.current=q),A.current.onNodeRefsChange?.()},[S,h,ne]),Be=Hi(re=>Pl(re,Ee),[Ee]),je=Hi(re=>ng(re,Ee),[Ee]),Ve=Zn(je);Ve.current=je;let _t=Zn(Ee);_t.current=Ee;let Le=Hi(()=>{let re=G.current,X=U.current;return!re||X<=0?_t.current:{..._t.current,explode:{factor:X,centre:re.centre,radius:re.radius}}},[]);Wi(()=>{ne&&(je(ne.group),z.current=!0,ne.forEachLoadedModel(re=>{je(re),Vo(re,Le())}),C())},[je,C,Le,ne]),Wi(()=>{let re=HS(e);if(!re)return;let X=!1;return fetch(re).then(q=>q.ok?q.json():null).then(q=>{X||!q?.objects||(L.current=q.objects,B.current=q.bindingFrame==="gltf-identity-v2",B.current&&F.current?.setCatalog(q.objects),z.current=!0,A.current.onObjectCatalog?.(q.objects),C())}).catch(()=>{}),()=>{X=!0}},[e,C,_]),Wi(()=>{if(!ne)return;let re=!1,X=()=>C(),q=fe=>{fe.scene&&(Ve.current(fe.scene),Vo(fe.scene,Le())),z.current=!0,re||(re=!0,A.current.onModelLoaded?.(ne.group)),C()},Pe=fe=>{A.current.onLoadError?.(fe.error)},De=fe=>{fe.scene&&Hd(fe.scene),z.current=!0};ne.setCamera(E),ne.setResolutionFromRenderer(E,b),ne.addEventListener("needs-update",X),ne.addEventListener("load-model",q),ne.addEventListener("load-error",Pe),ne.addEventListener("dispose-model",De);let Se=()=>{z.current=!0,C()};return ne.addEventListener("tile-visibility-change",Se),C(),()=>{ne.removeEventListener("needs-update",X),ne.removeEventListener("load-model",q),ne.removeEventListener("load-error",Pe),ne.removeEventListener("dispose-model",De),ne.removeEventListener("tile-visibility-change",Se),Hd(ne.group),ne.deleteCamera(E),h&&(h.current={}),S&&(S.current={})}},[E,b,C,S,h,Le,ne]);let zt=Hi(re=>{let X=Be(re.object);X&&(re.stopPropagation(),A.current.onItemClick?.(X.binding))},[Be,p]),vt=Hi(re=>{let X=Be(re.object),q=X?.key??null;q!==x.current&&(x.current=q,I(q),A.current.onItemHover?.(X?.binding??null))},[Be]),Oe=Hi(()=>{x.current!==null&&(x.current=null,I(null),A.current.onItemHover?.(null))},[]);return Wi(()=>{C()},[C,ne]),DS((re,X)=>{if(!ne)return;if(ne.setResolutionFromRenderer(E,b),B.current&&_){let fe=_.sync(Le(),d,T);_.updateBounds(ne.root),T&&ne.forEachLoadedModel(dt=>Vo(dt,fe))}if(ne.update(),!ae.current){let fe=new VS;if(ne.getBoundingBox(fe)){ae.current=!0,ne.group.updateMatrixWorld(),fe.applyMatrix4(ne.group.matrixWorld);let dt=fe.getBoundingSphere(new US);G.current={centre:dt.center.clone(),radius:fe.getSize(new GS).length()*.5},A.current.onTilesetBounds?.(fe),C()}}z.current&&(z.current=!1,Ae());let q=Math.min(Math.max(M,0),1),Pe=U.current;Math.abs(Pe-q)>1e-4?(U.current=FS.lerp(Pe,q,1-Math.exp(-6*X)),Vo(ne.group,Le()),C()):Pe!==q&&(U.current=q,Vo(ne.group,Le()),C()),!le.current&&ne.lruCache.isFull()&&(le.current=!0,console.warn("[react-immersive] The tile memory budget is full, so no further tiles will load and the model may render incompletely. This usually means the model's textures are too large for streaming \u2014 re-process it with a smaller MAX_TEXTURE_SIZE, or raise memoryBudgetMB."));let De=ne;((De.stats?.downloading??0)>0||(De.stats?.parsing??0)>0||De.loadProgress!==void 0&&De.loadProgress<1&&!ne.lruCache.isFull())&&C()}),ne?WS("group",{rotation:t,children:[_?Pf("primitive",{object:_.group}):null,Pf("primitive",{object:ne.group,onClick:zt,onPointerMove:vt,onPointerOut:Oe})]}):null}import{useMemo as $i,useRef as li,useState as qo,useEffect as Xo,useCallback as $o}from"react";import{Html as kf}from"@react-three/drei";import{useFrame as _f,useThree as Mu}from"@react-three/fiber";import{MathUtils as Su,Vector3 as ls}from"three";import{jsx as br,jsxs as Tu}from"react/jsx-runtime";var $S=.02;function Af(e,t){let n=li(null),i=Mu(d=>d.scene),r=li(null),o=$i(()=>new ls(...e.anchorLocalPosition??e.localPosition??e.worldPosition),[e.anchorLocalPosition,e.localPosition,e.worldPosition]),a=$i(()=>new ls,[]),l=$i(()=>new ls,[]),s=$i(()=>new ls,[]);return Xo(()=>{r.current=null},[e.anchorNodeName]),_f(({camera:d})=>{let u=n.current,c=u?.parent;if(!u||!c)return;let p=r.current;if(e.anchorNodeName&&(!p||!p.parent)&&(p=mr(i,e.anchorNodeName),r.current=p),p?(p.updateWorldMatrix(!0,!1),a.copy(o).applyMatrix4(p.matrixWorld)):(a.copy(o),c.localToWorld(a)),t){let g=t.current.get(e.id);g||(g=new ls,t.current.set(e.id,g)),g.copy(a)}s.copy(d.position).sub(a),s.lengthSq()>0?(s.normalize(),l.copy(a).addScaledVector(s,$S)):l.copy(a),c.worldToLocal(l),u.position.copy(l)}),n}function XS({annotation:e,occluders:t,worldPositionsRef:n,onClick:i,onHover:r,showAnnotationOnHover:o}){let[a,l]=qo(!1),s=Af(e,n),[d,u]=qo(!1),[c,p]=qo(1),g=li(null),f=li(null),v=li(null);Xo(()=>()=>{g.current&&(clearTimeout(g.current),g.current=null),v.current&&(clearTimeout(v.current),v.current=null)},[]);let P=M=>{M.stopPropagation(),M.preventDefault(),g.current&&(clearTimeout(g.current),g.current=null),g.current=window.setTimeout(()=>{i?.(e),g.current=null},10)},y=M=>{M.stopPropagation(),u(!0),p(100),v.current&&(clearTimeout(v.current),v.current=null),r?.(e),o&&i?.(e)},h=M=>{M.stopPropagation(),u(!1),p(1),v.current&&clearTimeout(v.current),v.current=window.setTimeout(()=>{r?.(null),o&&r?.(null),v.current=null},50)},m=M=>{M.stopPropagation();let T=M.currentTarget;T.dataset.pointerX=String(M.clientX),T.dataset.pointerY=String(M.clientY)},S=M=>{M.stopPropagation();let T=M.currentTarget,E=parseFloat(T.dataset.pointerX||"0"),b=parseFloat(T.dataset.pointerY||"0"),C=M.clientX-E,x=M.clientY-b;Math.sqrt(C*C+x*x)<10&&P(M)};return br("group",{ref:s,children:br(kf,{center:!0,occlude:t,onOcclude:l,pointerEvents:a?"none":"auto",zIndexRange:[1,200],style:{pointerEvents:a?"none":"auto",zIndex:c},className:"annotation-html-wrapper",transparent:!0,children:br("div",{ref:f,className:`ri-annotationMarker ${d?"ri-annotationMarker--hovered":""}`,title:e.title,style:{display:a?"none":"flex"},onPointerDown:m,onPointerUp:S,onPointerEnter:y,onPointerLeave:h,onDoubleClick:M=>{M.stopPropagation(),i?.(e)},role:"button",tabIndex:0,"aria-label":`Annotation ${e.id}`,children:br("span",{className:"ri-annotationMarker-id",children:e.id})})})})}function qS({annotation:e,occluders:t,popupRef:n,onClose:i,hideCloseButton:r=!1}){let[o,a]=qo(!1),l=Af(e),s=Tu("div",{ref:n,className:"ri-viewAnnotationPopup",style:{display:o?"none":"block"},onPointerDown:d=>d.stopPropagation(),onClick:d=>d.stopPropagation(),children:[Tu("div",{className:"ri-viewAnnotationHeader",children:[br("h4",{className:"ri-viewAnnotationTitle",children:e.title}),!r&&br("button",{onClick:d=>{d.stopPropagation(),i?.()},className:"ri-viewAnnotationClose","aria-label":"Close annotation",children:"\xD7"})]}),e.description&&br("p",{className:"ri-viewAnnotationDescription",children:e.description})]});return br("group",{ref:l,children:br(kf,{occlude:t,onOcclude:a,pointerEvents:o?"none":"auto",zIndexRange:[1e3,2e3],style:{pointerEvents:o?"none":"auto",zIndex:1e3},transparent:!0,children:s})})}function Pu({annotations:e,sceneConfig:t,activeAnnotation:n,popupRef:i,canvasRootRef:r,worldPositionsRef:o,modelLoaded:a,onAnnotationClick:l,onAnnotationHover:s,onCloseAnnotation:d,hideCloseButton:u=!1,showAnnotationOnHover:c=!1}){let p=Mu(_=>_.invalidate),g=Mu(_=>_.scene),[f,v]=qo(null),[P,y]=qo(!1),h=li(null),m=li(null),S=li(null),M=$i(()=>{let _=[];return g.traverse(V=>{let F=V;F.isMesh&&!F.isSkinnedMesh&&_.push({current:V})}),_},[g,e,a]),T=$o(()=>{p();let _=()=>{p(),m.current=window.requestAnimationFrame(()=>{p(),m.current=null})};m.current=window.requestAnimationFrame(_)},[p]);Xo(()=>{T()},[e,T]),Xo(()=>{T()},[n,T]),Xo(()=>()=>{m.current!==null&&window.cancelAnimationFrame(m.current),S.current&&clearTimeout(S.current)},[]);let E=P?f:n||f,b=$i(()=>E?e.find(_=>_.id===E.id)??E:null,[E,e]),C=$o(_=>{if(P&&f?.id===_.id){y(!1),v(null),d?.();return}y(!0),v(_),l?.(_)},[P,f,l,d]),x=$o(_=>{s?.(_),c&&!P&&(S.current&&(clearTimeout(S.current),S.current=null),_?v(_):S.current=window.setTimeout(()=>{v(null),d?.(),S.current=null},100))},[P,s,c,d]),k=$o(()=>{y(!1),v(null),d?.()},[d]),I=$o(_=>{let V=_.target;if(V.closest?.(".ri-annotationMarker")||V.closest?.(".ri-viewAnnotationPopup")||V.closest?.(".annotation-html-wrapper"))return;let F=r.current;F&&F.contains(V)&&(y(!1),v(null),d?.())},[r,d]),A=$o(_=>{_.key==="Escape"&&P&&(y(!1),v(null),d?.())},[P,d]);Xo(()=>{let _=r.current;return _&&(_.addEventListener("click",I),_.addEventListener("pointerdown",I)),document.addEventListener("keydown",A),()=>{_&&(_.removeEventListener("click",I),_.removeEventListener("pointerdown",I)),document.removeEventListener("keydown",A)}},[r,I,A]);let z=$i(()=>(t?.model.rotation??[0,0,0]).map(_=>_*Math.PI/180),[t?.model.rotation]);return _f((_,V)=>{h.current&&(h.current.rotation.x=Su.lerp(h.current.rotation.x,z[0],1-Math.exp(-5*V)),h.current.rotation.y=Su.lerp(h.current.rotation.y,z[1],1-Math.exp(-5*V)),h.current.rotation.z=Su.lerp(h.current.rotation.z,z[2],1-Math.exp(-5*V)))}),Tu("group",{ref:h,children:[e.map(_=>{let V=`${_.worldPosition.join(",")}-${_.title}-${_.id}`;return br(XS,{annotation:_,occluders:M,worldPositionsRef:o,onClick:C,onHover:x,showAnnotationOnHover:c},V)}),b?br(qS,{annotation:b,occluders:M,popupRef:i,onClose:k,hideCloseButton:u},`popup-${b.id}`):null]})}import{useEffect as YS,useMemo as Rf}from"react";import{Html as Lf,Line as KS}from"@react-three/drei";import{BoxGeometry as JS,EdgesGeometry as QS,Vector3 as Ef}from"three";import{jsx as Xr,jsxs as Yo}from"react/jsx-runtime";var ZS="#22d3ee",eM="#facc15";function Zl(e,t){let n=e<10?e.toFixed(3):e.toFixed(2);return t?`${n} ${t}`:n}function tM(e,t){return[(e[0]+t[0])/2,(e[1]+t[1])/2,(e[2]+t[2])/2]}function ec({position:e,children:t}){return Xr(Lf,{center:!0,position:e,zIndexRange:[20,0],children:Xr("div",{className:"ri-measureLabel",children:t})})}function nM({box:e,unit:t}){let n=Rf(()=>[(e.min[0]+e.max[0])/2,(e.min[1]+e.max[1])/2,(e.min[2]+e.max[2])/2],[e.min,e.max]),i=Rf(()=>{let[l,s,d]=e.size;return new QS(new JS(l||1e-4,s||1e-4,d||1e-4))},[e.size]);YS(()=>()=>{i.dispose()},[i]);let[r,o,a]=e.size;return Yo("group",{position:n,children:[Xr("lineSegments",{geometry:i,children:Xr("lineBasicMaterial",{color:eM})}),Yo(ec,{position:[0,-o/2,a/2],children:["W ",Zl(r,t)]}),Yo(ec,{position:[-r/2,0,a/2],children:["H ",Zl(o,t)]}),Yo(ec,{position:[r/2,-o/2,0],children:["D ",Zl(a,t)]})]})}function ku({points:e,unit:t,box:n,showDimensions:i}){return Yo("group",{children:[e.map(r=>Xr(Lf,{center:!0,position:r.position,zIndexRange:[15,0],children:Xr("div",{className:"ri-measureDot"})},r.id)),e.slice(1).map((r,o)=>{let a=e[o].position,l=r.position,s=new Ef(...a).distanceTo(new Ef(...l));return Yo("group",{children:[Xr(KS,{points:[a,l],color:ZS,lineWidth:2}),Xr(ec,{position:tM(a,l),children:Zl(s,t)})]},`${e[o].id}-${r.id}`)}),i&&n?Xr(nM,{box:n,unit:t}):null]})}import{forwardRef as rM,useCallback as cs,useEffect as Bf,useImperativeHandle as iM,useMemo as Of,useRef as fn}from"react";import{useXR as Df,useXRHitTest as oM,useXRInputSourceEvent as aM}from"@react-three/xr";import{useFrame as sM}from"@react-three/fiber";import{Matrix4 as lM,Vector3 as Nf}from"three";import{Fragment as mM,jsx as ds,jsxs as Vf}from"react/jsx-runtime";var cM=1,If=1,dM=.1,uM=10;function pM(e,t){let[n,i,r]=e.size,o=(e.min[0]+e.max[0])/2,a=(e.min[2]+e.max[2])/2,l=Math.max(n,i,r)||1;return{scale:t==="real-world"?1:cM/l,offset:[-o,-e.min[1],-a]}}function zf(e){let t=e[0].clientX-e[1].clientX,n=e[0].clientY-e[1].clientY;return Math.hypot(t,n)}function jf(e){let t=e[0].clientX-e[1].clientX,n=e[0].clientY-e[1].clientY;return Math.atan2(n,t)}var hM=rM(function({box:t,scaleMode:n,children:i,onARStateChange:r},o){let a=fn(null),l=fn(null),s=fn(null),d=Df(V=>V.session!=null),u=Df(V=>V.mode==="immersive-ar"),c=Of(()=>t?pM(t,n):null,[t,n]),p=fn(new Nf(0,0,-If)),g=fn(1),f=fn(0),v=fn(!0),P=fn(!1),y=Of(()=>new lM,[]),h=fn(new Nf),m=fn(!1),S=fn(null),M=fn(!1),T=fn(0),E=fn(0),b=fn(1),C=fn(0),x=cs(()=>{if(!r||!u)return;let V={canPlace:m.current,isPlacementMode:v.current,isModelPlaced:P.current},F=S.current;F&&F.canPlace===V.canPlace&&F.isPlacementMode===V.isPlacementMode&&F.isModelPlaced===V.isModelPlaced||(S.current=V,r(V))},[u,r]),k=cs(()=>!u||!m.current?!1:(p.current.copy(h.current),P.current=!0,v.current=!1,x(),!0),[x,u]),I=cs(()=>{u&&(v.current=!0,x())},[x,u]),A=cs(()=>{let V=k();return!V&&u&&(v.current=!1,x()),V},[x,u,k]),z=cs(()=>{u&&(v.current=!1,x())},[x,u]);iM(o,()=>({placeCurrent:k,startPlacementMode:I,finishPlacementMode:A,cancelPlacementMode:z}),[z,A,k,I]),Bf(()=>{if(!d){p.current.set(0,0,-If),g.current=1,f.current=0,m.current=!1,M.current=!1,v.current=!0,P.current=!1,S.current=null;return}u&&(m.current=!1,M.current=!1,v.current=!0,P.current=!1,S.current=null,x())},[x,d,u]),oM((V,F)=>{if(!u||V.length===0){m.current&&(m.current=!1,x());return}F(y,V[0])&&(h.current.setFromMatrixPosition(y),m.current||(m.current=!0,x()))},"viewer"),aM("all","select",()=>{!u||M.current||!v.current||k()},[u,k]),Bf(()=>{if(!u)return;let V=B=>{B.touches.length===2&&(M.current=!0,T.current=zf(B.touches),E.current=jf(B.touches),b.current=g.current,C.current=f.current)},F=B=>{if(!M.current||B.touches.length!==2)return;B.preventDefault();let G=zf(B.touches);if(T.current>0){let ae=G/T.current;g.current=Math.min(uM,Math.max(dM,b.current*ae))}let U=jf(B.touches);f.current=C.current-(U-E.current)},L=B=>{B.touches.length===0&&requestAnimationFrame(()=>{M.current=!1})};return window.addEventListener("touchstart",V),window.addEventListener("touchmove",F,{passive:!1}),window.addEventListener("touchend",L),window.addEventListener("touchcancel",L),()=>{window.removeEventListener("touchstart",V),window.removeEventListener("touchmove",F),window.removeEventListener("touchend",L),window.removeEventListener("touchcancel",L)}},[u]),sM(()=>{let V=a.current,F=l.current;if(!V||!F)return;!d||!c?(V.visible=!0,V.position.set(0,0,0),V.rotation.set(0,0,0),F.scale.setScalar(1)):(V.visible=!u||P.current,V.position.copy(p.current),V.rotation.set(0,f.current,0),F.scale.setScalar(c.scale*g.current));let L=s.current;if(L){let B=u&&v.current&&m.current;L.visible=B,B&&L.position.copy(h.current)}});let _=d&&c?c.offset:[0,0,0];return Vf(mM,{children:[Vf("mesh",{ref:s,visible:!1,rotation:[-Math.PI/2,0,0],children:[ds("ringGeometry",{args:[.05,.07,32]}),ds("meshBasicMaterial",{color:"#22d3ee",transparent:!0,opacity:.95})]}),ds("group",{ref:a,children:ds("group",{ref:l,children:ds("group",{position:_,children:i})})})]})}),Ff=hM;import{useEffect as tc,useMemo as kr,useRef as ci}from"react";import{useFrame as gM,useThree as fM}from"@react-three/fiber";import{Box3 as bM,CatmullRomCurve3 as Uf,Sphere as xM,Spherical as yM,Vector3 as di}from"three";var vM=1.2;function _u({controlsRef:e,sceneRef:t,config:n,playing:i,resetOnPlay:r=!1,onFinished:o,onUserInteract:a,onStop:l}){let s=fM(z=>z.invalidate),d=kr(()=>n.waypoints??[],[n.waypoints]),u=d.length>=2,c=n.loop??!0,p=kr(()=>{if(d.length<2)return 24;let z=0;for(let _=0;_<d.length-1;_++)z+=d[_].segmentDuration??3.5;return c&&d.length>1&&(z+=d[d.length-1].segmentDuration??3.5),Math.max(z,4)},[d,c]),g=n.duration??p,f=kr(()=>d.map(z=>[...z.position,...z.target,z.azimuthAngle??"",z.polarAngle??"",z.segmentDuration??""].join(",")).join(";"),[d]),v=kr(()=>{let z=[];if(d.length<2)return z;let _=0;for(let V=0;V<d.length-1;V++)_+=d[V].segmentDuration??3.5,z.push(_);return c&&d.length>1&&(_+=d[d.length-1].segmentDuration??3.5,z.push(_)),z},[d,c]),P=kr(()=>z=>{if(d.length<2||v.length===0)return z/g;let _=v[v.length-1],V=c?z%g:Math.min(z,g),F=g>0?V/g*_:0;for(let L=0;L<v.length;L++)if(F<=v[L]){let B=L===0?0:v[L-1],G=v[L]-B,U=G>0?(F-B)/G:0,ae=c?d.length:d.length-1,xe=L/ae,le=1/ae;return xe+U*le}return 1},[d.length,v,g,c]),y=kr(()=>u?{position:new Uf(d.map(z=>new di(...z.position)),c,"catmullrom",.5),target:new Uf(d.map(z=>new di(...z.target)),c,"catmullrom",.5)}:null,[f,u,c]),h=kr(()=>{if(!u||!d.every(_=>Number.isFinite(_.azimuthAngle)&&Number.isFinite(_.polarAngle)))return null;let z=d.map(_=>({azimuth:_.azimuthAngle,polar:_.polarAngle,distance:new di(..._.position).distanceTo(new di(..._.target))}));for(let _=1;_<z.length;_+=1){let V=z[_-1].azimuth,F=z[_].azimuth;z[_].azimuth=F+Math.round((V-F)/(Math.PI*2))*Math.PI*2}return z},[f,u]),m=ci(0),S=ci(0),M=ci(new di),T=ci(new di),E=ci(!1),b=ci(0),C=ci(!1),x=ci(null),k=kr(()=>new di,[]),I=kr(()=>new di,[]),A=kr(()=>new yM,[]);return tc(()=>{m.current=0,b.current=0,S.current=0,C.current=!1},[f,c,g]),tc(()=>{r&&(b.current=0,m.current=0,C.current=!1)},[r]),tc(()=>{if(!i){E.current=!1,m.current>0&&!r?b.current=m.current:r&&(b.current=0),(m.current>0||C.current)&&l?.();return}m.current>=g&&!c&&(m.current=0,b.current=0,C.current=!1);let z=e.current;if(z&&(z.getPosition(M.current),z.getTarget(T.current)),r||C.current||b.current===0?(m.current=0,b.current=0,C.current=!1):b.current>0&&b.current<g?m.current=b.current:(m.current=0,b.current=0),S.current=0,!u){let _=t.current;if(_){let V=new bM().setFromObject(_).getBoundingSphere(new xM);x.current={center:V.center.clone(),radius:V.radius>0?V.radius:1}}}E.current=!0,s()},[i,u,e,t,s,g,c,f,r,l]),tc(()=>{if(!i||!a)return;let z=e.current;if(!z)return;let _=()=>{C.current||a()};return z.addEventListener("controlstart",_),()=>z.removeEventListener("controlstart",_)},[i,e,a]),gM((z,_)=>{if(!i||!E.current)return;let V=e.current;if(!V)return;m.current+=_,S.current+=_;let F=P(m.current),L=!c&&m.current>=g;if(F=c?F%1:Math.min(F,1),y)if(y.target.getPoint(F,I),h){let G=c?h.length:h.length-1,U=Math.min(F,1)*G,ae=Math.min(Math.floor(U),G-1),xe=(ae+1)%h.length,le=F>=1?1:U-ae,ge=le*le*(3-2*le),ve=h[ae],Te=h[xe],ne=Te.azimuth+Math.round((ve.azimuth-Te.azimuth)/(Math.PI*2))*Math.PI*2,ct=ve.azimuth+(ne-ve.azimuth)*ge,Ee=ve.polar+(Te.polar-ve.polar)*ge,Ae=ve.distance+(Te.distance-ve.distance)*ge;A.set(Math.max(Ae,1e-6),Math.min(Math.max(Ee,1e-6),Math.PI-1e-6),ct),k.setFromSpherical(A).add(I)}else y.position.getPoint(F,k);else{let G=x.current;if(!G)return;let U=F*Math.PI*2,ae=G.radius*2.2;k.set(G.center.x+Math.cos(U)*ae,G.center.y+G.radius*.6,G.center.z+Math.sin(U)*ae),I.copy(G.center)}let B=Math.min(S.current/vM,1);if(B<1){let G=B*B*(3-2*B);k.lerpVectors(M.current,k,G),I.lerpVectors(T.current,I,G)}if(V.setLookAt(k.x,k.y,k.z,I.x,I.y,I.z,!1),L){E.current=!1,C.current=!0,m.current=0,b.current=0,o?.();return}s()}),null}import{useEffect as TM,useState as PM}from"react";var wM="ri:license-grant:v1",CM={"260cd89ea13f":"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEwjr3ofKTkkcxOM0GYl/RlJj9JsuyjSF8sYmCd2YqsHJCEO8EvlNDrO2Kl4agFKo6dRhyR2/oWeiU6P9WIqRbvw=="},Gf=new Map;function Wf(e){let t=atob(e);return Uint8Array.from(t,n=>n.charCodeAt(0)).buffer}function Hf(e){let t=e.replace(/-/g,"+").replace(/_/g,"/");return Wf(t.padEnd(Math.ceil(t.length/4)*4,"="))}function SM(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 nc(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 Au(e,t){return`${wM}:${t}:${e}`}function MM(e,t){let n=Gf.get(e);if(n)return n;let i=crypto.subtle.importKey("spki",Wf(t),{name:"ECDSA",namedCurve:"P-256"},!1,["verify"]);return Gf.set(e,i),i}async function Ru(e,t,n){if(!globalThis.crypto?.subtle)return null;try{let[i,r,o,a,...l]=e.split("."),s=CM[r];if(i!=="ri1"||!s||!o||!a||l.length>0)return null;let d=JSON.parse(new TextDecoder().decode(Hf(o)));if(!SM(d)||!await crypto.subtle.verify({name:"ECDSA",hash:"SHA-256"},await MM(r,s),Hf(a),new TextEncoder().encode(`${i}.${r}.${o}`)))return null;let c=Math.floor(Date.now()/1e3),p=d.expiresAt-d.issuedAt;return d.licenseKeyHash!==t||d.domain!==n||d.expiresAt<=c||d.issuedAt>c+300||p<=0||p>43200?null:{environment:d.environment,tier:d.tier,expiresAt:d.expiresAt}}catch{return null}}async function $f(e,t,n){try{return await Ru(e,await nc(t),n)}catch{return null}}async function Xf(e,t,n){try{let i=await nc(t);return await Ru(e,i,n)?(localStorage.setItem(Au(i,n),e),!0):!1}catch{return!1}}async function qf(e,t){try{let n=await nc(e),i=Au(n,t),r=localStorage.getItem(i);if(!r)return null;let o=await Ru(r,n,t);return o||localStorage.removeItem(i),o}catch{return null}}async function Eu(e,t){try{let n=await nc(e);localStorage.removeItem(Au(n,t))}catch{}}var kM=["localhost","127.0.0.1","0.0.0.0"],_M=e=>kM.includes(e)||e.endsWith(".local")||e.endsWith(".localhost"),Kf="https://react-immersive.liveroom.dev/api/validate-license",AM=()=>typeof window<"u",RM=300*1e3,EM=5e3,LM=400,Bu=new Map,Lu=new Map,ui=class extends Error{},Jf=async(e,t,n)=>{let i=await qf(e,t);return i?(console.warn("[react-immersive] License server unreachable \u2014 using a previously verified, time-limited offline grant."),{status:"valid",reason:"Previously verified offline grant",environment:i.environment,tier:i.tier,isLocalDomain:n}):null},Yf=async(e,t,n)=>{let i=await Jf(e,t,n);return i||(console.warn("[react-immersive] License server unreachable and no valid offline grant is available \u2014 license validation failed."),{status:"invalid",reason:"Could not reach license server",isLocalDomain:n})},BM=e=>e instanceof ui||e instanceof TypeError,OM=()=>new Promise(e=>setTimeout(e,LM)),DM=e=>e==="development"||e==="production",NM=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&&!DM(t.environment)||t.tier!==void 0&&typeof t.tier!="string"||t.offlineGrant!==void 0&&typeof t.offlineGrant!="string")},IM=e=>{if(!e||typeof e!="object")return null;let t=e,n=t.reason??t.error;return typeof n=="string"&&n.trim()?n:null},zM=(e,t,n)=>`${n}::${e}::${t}`,jM=e=>{let t=Bu.get(e);return t?Date.now()-t.timestamp>RM?(Bu.delete(e),null):t.result:null},VM=(e,t)=>({status:e.valid?"valid":"invalid",reason:e.reason,environment:e.environment,tier:e.tier,isLocalDomain:t}),FM=(e,t)=>({status:"invalid",reason:e,isLocalDomain:t});async function UM(e,t,n,i){let r=zM(e,t,i),o=jM(r);if(o)return o;let a=Lu.get(r);if(a)return a;let l=(async()=>{for(let s=0;s<2;s+=1)try{return await GM(e,t,n,r,i)}catch(d){if(!BM(d))throw d;if(s===0){let u=await Jf(e,t,n);if(u)return u;await OM();continue}return Yf(e,t,n)}return Yf(e,t,n)})().finally(()=>{Lu.delete(r)});return Lu.set(r,l),l}async function GM(e,t,n,i,r){let o=new AbortController,a=setTimeout(()=>o.abort(),EM),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(u){throw o.signal.aborted?new ui("License validation timed out"):u}finally{clearTimeout(a)}let s;try{s=await l.json()}catch{throw new ui(`License server returned a non-JSON response${l.status?` (${l.status})`:""}`)}if(!l.ok){if(l.status===429||l.status>=500)throw new ui(`License server error (${l.status})`);let u=IM(s)??`License validation failed${l.status?` (${l.status})`:""}`;return await Eu(e,t),FM(u,n)}if(!NM(s))throw new ui("License server returned an unexpected payload");let d=VM(s,n);if(d.status==="valid"&&r!==Kf){let u=s.offlineGrant?await $f(s.offlineGrant,e,t):null;if(!u)throw new ui("License validation endpoint did not return a verifiable signed grant");d={...d,environment:u.environment,tier:u.tier}}return d.status==="valid"?(Bu.set(i,{result:d,timestamp:Date.now()}),s.offlineGrant&&(await Xf(s.offlineGrant,e,t)||console.warn("[react-immersive] The license server returned an invalid offline grant; it was not cached."))):await Eu(e,t),d}var rc=(e,t=Kf)=>{let[n,i]=PM({status:"checking",isLocalDomain:!1});return TM(()=>{if(!AM())return;let r=!1,o=u=>{r||i(u)},a=e.trim(),l=window.location.hostname.toLowerCase(),s=_M(l);return o({status:"checking",isLocalDomain:s}),a?((async()=>{try{o(await UM(a,l,s,t))}catch(u){let c=u instanceof TypeError?"Could not reach license server":u instanceof Error?u.message:"License validation failed";o({status:"invalid",reason:c,isLocalDomain:s})}})(),()=>{r=!0}):(o({status:"invalid",reason:"No license key provided",isLocalDomain:s}),()=>{r=!0})},[e,t]),n};import{useRef as Xi,useState as HM,useCallback as _r,useEffect as WM}from"react";import{jsx as Vn,jsxs as Ou}from"react/jsx-runtime";var $M={up:{width:38,height:22},down:{width:38,height:22},left:{width:22,height:38},right:{width:22,height:38}},XM={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"},ic=({direction:e})=>{let t=$M[e],n=XM[e];return Ou("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:[Vn("polyline",{points:n,stroke:"rgba(0, 0, 0, 0.9)",strokeWidth:"6",strokeLinecap:"round",strokeLinejoin:"round"}),Vn("polyline",{points:n,stroke:"#2095F2",strokeWidth:"4",strokeLinecap:"round",strokeLinejoin:"round"})]})},qr=16,qM={"bottom-left":{bottom:qr,left:qr,top:"auto",right:"auto",transform:"none"},"bottom-right":{bottom:qr,right:qr,top:"auto",left:"auto",transform:"none"},"top-left":{top:qr,left:qr,bottom:"auto",right:"auto",transform:"none"},"top-right":{top:qr,right:qr,bottom:"auto",left:"auto",transform:"none"},center:{top:"50%",left:"50%",bottom:"auto",right:"auto",transform:"translate(-50%, -50%)"},"center-bottom":{bottom:-10,left:"50%",top:"auto",right:"auto",transform:"translateX(-50%)"},"center-top":{top:qr,left:"50%",bottom:"auto",right:"auto",transform:"translateX(-50%)"}},YM=({controlsRef:e,enabled:t=!0,opacity:n=.9,moveSensitivity:i=.001,rotateSensitivity:r=.01,position:o="center-bottom"})=>{let a=Xi(null),[l,s]=HM({x:0,y:0}),d=Xi(!1),u=Xi({x:0,y:0}),c=Xi(),p=Xi(),g=Xi(null),f=Xi(0),v=()=>e.current,P=(A,z,_)=>{let V=Math.hypot(A,z);if(V>_){let F=_/V;return{x:A*F,y:z*F}}return{x:A,y:z}},y=A=>{let _=Math.abs(A);return _<.12?0:Math.sign(A)*((_-.12)/(1-.12))},h=_r(()=>{let A=()=>{let{x:z,y:_}=u.current,V=y(z),F=y(_);if(t&&(V!==0||F!==0)){let L=v();L&&L.rotate(-V*r,-F*r,!0)}c.current=requestAnimationFrame(A)};c.current=requestAnimationFrame(A)},[t,r]),m=_r(()=>{c.current&&cancelAnimationFrame(c.current)},[]),S=_r((A,z)=>{if(!a.current||!d.current)return;let _=a.current.getBoundingClientRect(),V=_.left+_.width/2,F=_.top+_.height/2,L=_.width/2-18,B=A-V,G=z-F,U=P(B,G,L);s(U),u.current={x:U.x/L,y:U.y/L}},[]),M=_r(A=>{if(!t)return;A.preventDefault(),A.stopPropagation(),d.current=!0,h();let z="touches"in A?A.touches[0]:A;S(z.clientX,z.clientY)},[t,h,S]),T=_r(A=>{if(!d.current)return;A.preventDefault();let z="touches"in A?A.touches[0]:A;S(z.clientX,z.clientY)},[S]),E=_r(()=>{d.current=!1,s({x:0,y:0}),u.current={x:0,y:0},m()},[m]),b=i*10,C=_r(A=>{t&&v()?.forward(A*b,!0)},[t,b]),x=_r(A=>{t&&v()?.truck(A*b,0,!0)},[t,b]),k=_r((A,z,_)=>{if(!t)return;p.current&&cancelAnimationFrame(p.current),g.current={control:A,amount:z,action:_},f.current=0,_(z);let V=F=>{if(!g.current)return;if(f.current===0){f.current=F,p.current=requestAnimationFrame(V);return}if(F-f.current>200){let{amount:B,action:G}=g.current;G(B),f.current=F}p.current=requestAnimationFrame(V)};p.current=requestAnimationFrame(V)},[t]),I=_r(A=>{g.current?.control===A&&(p.current&&(cancelAnimationFrame(p.current),p.current=void 0),g.current=null,f.current=0)},[]);return WM(()=>(window.addEventListener("mousemove",T),window.addEventListener("mouseup",E),window.addEventListener("touchmove",T,{passive:!1}),window.addEventListener("touchend",E),window.addEventListener("touchcancel",E),()=>{window.removeEventListener("mousemove",T),window.removeEventListener("mouseup",E),window.removeEventListener("touchmove",T),window.removeEventListener("touchend",E),window.removeEventListener("touchcancel",E),m(),p.current&&cancelAnimationFrame(p.current)}),[T,E,m]),t?Vn("div",{className:"mc__wrapper",style:{opacity:n,...qM[o]},children:Ou("div",{className:"mc__dpad",children:[Vn("button",{"aria-label":"Move forward",className:"mc__arrow mc__arrow--up",onMouseDown:()=>k("up",1,C),onMouseUp:()=>I("up"),onMouseLeave:()=>I("up"),onTouchStart:A=>{A.preventDefault(),k("up",1,C)},onTouchEnd:()=>I("up"),onTouchCancel:()=>I("up"),children:Vn(ic,{direction:"up"})}),Ou("div",{className:"mc__middle-row",children:[Vn("button",{"aria-label":"Move left",className:"mc__arrow mc__arrow--left",onMouseDown:()=>k("left",-1,x),onMouseUp:()=>I("left"),onMouseLeave:()=>I("left"),onTouchStart:A=>{A.preventDefault(),k("left",-1,x)},onTouchEnd:()=>I("left"),onTouchCancel:()=>I("left"),children:Vn(ic,{direction:"left"})}),Vn("div",{ref:a,className:"mc__joystick",onMouseDown:M,onTouchStart:M,children:Vn("div",{className:"mc__knob",style:{transform:`translate(${l.x}px, ${l.y}px)`}})}),Vn("button",{"aria-label":"Move right",className:"mc__arrow mc__arrow--right",onMouseDown:()=>k("right",1,x),onMouseUp:()=>I("right"),onMouseLeave:()=>I("right"),onTouchStart:A=>{A.preventDefault(),k("right",1,x)},onTouchEnd:()=>I("right"),onTouchCancel:()=>I("right"),children:Vn(ic,{direction:"right"})})]}),Vn("button",{"aria-label":"Move backward",className:"mc__arrow mc__arrow--down",onMouseDown:()=>k("down",-1,C),onMouseUp:()=>I("down"),onMouseLeave:()=>I("down"),onTouchStart:A=>{A.preventDefault(),k("down",-1,C)},onTouchEnd:()=>I("down"),onTouchCancel:()=>I("down"),children:Vn(ic,{direction:"down"})})]})}):null},Qf=YM;import{HexColorPicker as KM}from"react-colorful";import{jsx as oc,jsxs as Zf}from"react/jsx-runtime";var Du=({colorPicker:e,onClose:t,itemMaterials:n,setItemMaterials:i,inline:r=!1})=>Zf("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:[oc("p",{className:"ri-popoverLabel",children:"Color"}),oc(KM,{color:n[e.objectId]?.hex??"#ffffff",onChange:o=>i(a=>({...a,[e.objectId]:{...a[e.objectId],hex:o}}))}),Zf("div",{className:"ri-inlineRow",children:[oc("span",{className:"ri-colorCode",children:n[e.objectId]?.hex??"#ffffff"}),oc("button",{className:"ri-secondaryButton",onClick:t,children:"Done"})]})]});import{jsx as Ar,jsxs as Nu}from"react/jsx-runtime";var Iu=({materialPopup:e,textureUrl:t,triggerFileUpload:n,clearTexture:i,inline:r=!1})=>Nu("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:[Ar("div",{className:"ri-popoverHeader",children:Ar("p",{className:"ri-popoverLabel",style:{marginBottom:0},children:"Material"})}),Nu("div",{className:"ri-materialBody",children:[t?Ar("div",{className:"ri-previewFrame",children:Ar("img",{src:t,alt:"texture preview",className:"ri-previewImage"})}):Nu("div",{className:"ri-emptyState",children:[Ar("svg",{width:"24",height:"24",fill:"none",stroke:"currentColor",strokeWidth:1.5,viewBox:"0 0 24 24",children:Ar("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"})}),Ar("span",{style:{fontSize:12},children:"No texture applied"})]}),Ar("button",{onClick:()=>n(e.objectId),className:"ri-uploadButton",children:t?"Replace image":"Upload image"}),t&&Ar("button",{onClick:()=>i(e.objectId),className:"ri-removeButton",children:"Remove texture"}),Ar("p",{className:"ri-formatHint",children:"JPG \xB7 PNG \xB7 WebP"})]})]});import{Fragment as JM,useEffect as zu,useRef as QM,useState as ju}from"react";import{Fragment as Vu,jsx as ln,jsxs as Ko}from"react/jsx-runtime";function eb({entries:e}){return ln(Vu,{children:e.map(([t,n])=>{let i=n!==null&&typeof n=="object",r=i?Object.entries(n):[];return i&&r.length>0?Ko("div",{className:"left-panel__data-group",children:[ln("span",{className:"left-panel__data-key",children:t}),ln("div",{className:"left-panel__data-children",children:ln(eb,{entries:r})})]},t):Ko("div",{className:"left-panel__data-row",children:[ln("span",{className:"left-panel__data-key",children:t}),ln("span",{className:`left-panel__data-value left-panel__data-value--${typeof n}`,children:i?Array.isArray(n)?"[]":"{}":String(n)})]},t)})})}function ZM({content:e}){let t=e!=null,[n,i]=ju(t),[r,o]=ju(t),a=QM(e);return t&&(a.current=e),zu(()=>{if(t){i(!0);return}if(n){o(!1);let l=setTimeout(()=>i(!1),300);return()=>clearTimeout(l)}},[t,n]),zu(()=>{if(n&&t){let l=requestAnimationFrame(()=>o(!0));return()=>cancelAnimationFrame(l)}},[n,t]),n?ln("div",{className:`left-panel__action-extra${r?" left-panel__action-extra--open":""}`,children:ln("div",{className:"left-panel__action-extra-inner",children:e??a.current})}):null}function Fu({isOpen:e,selectedObject:t,currentAction:n,onClose:i,onAction:r,renderActionExtra:o}){let[a,l]=ju(t);zu(()=>{t&&l(t)},[t]);let s=t??a,d=s?Object.entries(s).filter(([u])=>u!=="actions"):[];return ln("div",{className:`left-panel ${e?"left-panel--open":"left-panel--closed"}`,children:s&&Ko(Vu,{children:[Ko("div",{className:"left-panel__header",children:[ln("p",{className:"left-panel__title",children:s.label}),ln("button",{onClick:i,className:"left-panel__close-btn","aria-label":"Close panel",children:"\u2715"})]}),d.length>0&&ln("div",{className:"left-panel__data",children:ln(eb,{entries:d})}),ln("hr",{className:"left-panel__divider"}),s.actions&&s.actions.length>0&&Ko(Vu,{children:[ln("div",{className:"left-panel__actions-label",children:"Actions"}),ln("div",{className:"left-panel__actions-list",children:s.actions.map((u,c)=>{let p=n?.action.id===u.id&&(n.binding===s||n.binding?.id===s.id||n.binding?.modelObjectId===s.modelObjectId||n.objectId===s.id||n.objectId===s.modelObjectId),g=o?.(u.id);return Ko(JM,{children:[ln("button",{onClick:f=>r({objectId:s.modelObjectId||s.id||"",action:u,binding:s,screenX:f.clientX,screenY:f.clientY}),className:["left-panel__action-btn",`left-panel__action-btn--${u.id}`,p?"left-panel__action-btn--active":""].filter(Boolean).join(" "),"data-action-id":u.id,"data-label":u.label,children:u.label}),ln(ZM,{content:g})]},c)})})]})]})})}import{useMemo as tT,useState as nb}from"react";import{Boxes as nT}from"lucide-react";import{useState as eT}from"react";import{jsx as Yr,jsxs as us}from"react/jsx-runtime";function tb({openButtonLabel:e,openButtonAriaLabel:t,eyebrow:n,title:i,searchValue:r,onSearchChange:o,searchPlaceholder:a,children:l,isOpen:s,onToggle:d,openButtonIcon:u,closeButtonIcon:c,closeButtonAriaLabel:p}){let[g,f]=eT(!1),v=s!==void 0?s:g,P=y=>{s===void 0&&f(y),d?.(y)};return us("div",{className:`ri-sidepanel-wrap ${v?"ri-sidepanel-wrap--open":"ri-sidepanel-wrap--closed"}`,children:[!v&&us("button",{type:"button",className:"ri-sidepanel__open-btn",onClick:()=>P(!0),"aria-label":t,title:"Open panel",children:[u,e?Yr("span",{children:e}):null]}),us("div",{className:`ri-sidepanel ${v?"ri-sidepanel--open":"ri-sidepanel--closed"}`,"aria-hidden":!v,children:[us("div",{className:"ri-sidepanel__header",children:[us("div",{className:"ri-sidepanel__header-top",children:[Yr("span",{className:"ri-sidepanel__eyebrow",children:n}),Yr("button",{type:"button",className:"ri-sidepanel__close-btn",onClick:()=>P(!1),"aria-label":p,title:"Close",children:c??Yr("svg",{width:"12",height:"12",viewBox:"0 0 12 12",fill:"none","aria-hidden":"true",children:Yr("path",{d:"M1 1L11 11M11 1L1 11",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round"})})})]}),Yr("p",{className:"ri-sidepanel__title",children:i})]}),Yr("div",{className:"ri-sidepanel__search-wrap",children:Yr("input",{className:"ri-sidepanel__search",type:"text",placeholder:a,value:r,onChange:y=>o(y.target.value)})}),Yr("div",{className:"ri-sidepanel__list",children:l})]})]})}import{jsx as qi,jsxs as rT}from"react/jsx-runtime";function Uu({objectBindings:e,onAction:t,onFocus:n,onHover:i,isOpen:r,onToggle:o}){let[a,l]=nb(null),[s,d]=nb(""),u=tT(()=>Object.entries(e).filter(([c,p])=>{let g=s.toLowerCase();return c.toLowerCase().includes(g)||(p.label??"").toLowerCase().includes(g)}),[e,s]);return qi(tb,{openButtonLabel:"",openButtonAriaLabel:"Open scene objects panel",openButtonIcon:qi(nT,{width:16,height:16,"aria-hidden":"true"}),eyebrow:"SCENE OBJECTS",title:`${u.length} visible entries`,searchValue:s,onSearchChange:d,searchPlaceholder:"Search nodes, labels",isOpen:r,onToggle:o,closeButtonAriaLabel:"Close scene objects panel",children:u.map(([c,p])=>{let g=p.visible!==!1,f=a===c;return rT("div",{onClick:()=>n(p),onMouseEnter:()=>{l(c),i?.(p)},onMouseLeave:()=>{l(null),i?.(null)},className:`ri-sidepanel__row${f?" ri-sidepanel__row--hovered":""}`,children:[qi("span",{className:`ri-sidepanel__label${f?" ri-sidepanel__label--hovered":""}`,children:p.label??c}),qi("button",{type:"button",onClick:v=>{v.stopPropagation(),t?.({objectId:c,action:{id:"toggle-visibility",label:"Toggle Visibility",type:"command"},binding:p})},className:"ri-sidepanel__vis-btn",title:g?"Hide":"Show",children:qi("span",{className:`ri-sidepanel__checkbox${g?" ri-sidepanel__checkbox--checked":""}`,children:g&&qi("svg",{width:"9",height:"9",viewBox:"0 0 10 10",fill:"none",children:qi("path",{d:"M1.5 5L4 7.5L8.5 2.5",stroke:"white",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round"})})})})]},c)})})}import{AlertTriangle as Qu,Box as kb,Camera as WT,Download as $T,Eraser as XT,FileImage as qT,RotateCcw as YT,ChevronLeft as KT,Square as _b,ChevronRight as JT,RectangleGoggles as QT,QrCode as ZT,X as Zu,Expand as e2,Play as t2,Pause as n2,Smartphone as Ab,PencilRuler as r2,RulerDimensionLine as i2,Grid3X3 as o2}from"lucide-react";import{createContext as iT,useContext as oT}from"react";var Gu=iT({isInsideEditor:!1,activeTab:"object",activeSubTab:"General",tier:"free"});var er=()=>oT(Gu);import{jsx as rb,jsxs as aT}from"react/jsx-runtime";function Jo({visible:e,message:t,tone:n="default",spinner:i=!0}){return e?aT("div",{className:"bb-loadingOverlay",role:"status","aria-live":"polite",children:[i&&rb("span",{className:"bb-loadingSpinner","aria-hidden":"true"}),rb("span",{className:`bb-loadingMessage bb-status--${n}`,children:t})]}):null}var Hu=new WeakSet;function Qo(e){Hu.add(e)}function ib(e){let t=Hu.has(e);return t&&Hu.delete(e),t}import{useRef as ft,useEffect as ps,useMemo as Kr,useSyncExternalStore as dT}from"react";import{useThree as uT,useFrame as pT}from"@react-three/fiber";import{Sphere as hT,Line as mT}from"@react-three/drei";import{Vector3 as Ht,Vector2 as gT,AdditiveBlending as Wu,Plane as lb,TextureLoader as fT}from"three";var ob="data:image/png;base64,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";var ab="data:image/png;base64,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";var sb="data:image/png;base64,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";import{Fragment as kT,jsx as He,jsxs as bn}from"react/jsx-runtime";var Zo=-100,ea=100,bb=.03,bT=.03,xT=.03,cb=.5,yT=ob,vT=ab,wT=sb,CT=Math.PI/4,db=.4,na=64,ub=bb*3,$u="#4d7dff",pb="#ffcc00",hb=.02,xb=new Ht(0,1,0),ac=32,mb="#ff9d3d",sc=4,Rr=1.4,lc=.35,ST=.13,gb=.12,fb=.055,MT={x:"#ff4444",y:"#44ff44",z:"#4444ff"};function yb(e){return new Ht(e==="x"?1:0,e==="y"?1:0,e==="z"?1:0)}function TT(e,t){let n=yb(e);t.lengthSq()<1e-8&&(t=n.clone());let i=new Ht().crossVectors(n,new Ht().crossVectors(t,n));if(i.lengthSq()<1e-8){let r=Math.abs(n.y)<.9?xb:new Ht(1,0,0);i=new Ht().crossVectors(n,r)}return i.normalize()}function Xu(e){let t=new Float32Array((na+1)*3);for(let n=0;n<=na;n++){let i=n/na*Math.PI*2,r=Math.cos(i)*db,o=Math.sin(i)*db,a=0,l=0,s=0;e==="x"?(l=r,s=o):e==="y"?(a=r,s=o):(a=r,l=o),t[n*3]=a,t[n*3+1]=l,t[n*3+2]=s}return t}function PT(e){let t=Math.abs(e.y)<.99?new Ht(0,1,0):new Ht(1,0,0),n=new Ht().crossVectors(e,t).normalize(),i=new Ht().crossVectors(e,n).normalize();return[n,i]}function ta(e,t,n){return Math.min(Math.max(e,t),n)}var ra=null,qu=new Set;function hs(e){ra!==e&&(ra=e,qu.forEach(t=>t()))}function Yu(e){return qu.add(e),()=>qu.delete(e)}function cc(){return ra}function vb({light:e,position:t,color:n,intensity:i,visible:r,onPositionChange:o,onDraggingChange:a}){let{activeTab:l,activeSubTab:s,setActiveTab:d,setActiveSubTab:u}=er(),{camera:c,gl:p,raycaster:g,invalidate:f}=uT(),v=ft(null),P=ft(null),y=ft(null),h=ft(null),m=ft(null),S=ft(null),M=ft(null),T=ft(null),E=ft(null),b=ft(null),C=ft(null),x=ft(null),k=ft(null),I=ft(null),A=ft(null),z=ft(null),_=ft(null),V=ft({dragging:!1,axis:null}),F=ft(new lb),L=ft(new Ht),B=ft(null),G=ft(null),U=ft(new Ht),ae=ft(!1),xe=ft(new lb),le=ft(a);ps(()=>{le.current=a},[a]);let ge=Kr(()=>new Ht(t[0],t[1],t[2]),[t]),ve=Kr(()=>new Float32Array(6),[]),Te=Kr(()=>new Float32Array(6),[]),ne=Kr(()=>Xu("x"),[]),ct=Kr(()=>Xu("y"),[]),Ee=Kr(()=>Xu("z"),[]),Ae=Kr(()=>new Float32Array((ac+1)*3),[]),Be=Kr(()=>new Float32Array(sc*2*3),[]),je=e?.type==="point",Ve=e?.type==="spot",_t=je?vT:Ve?wT:yT,Le=je?bT:Ve?xT:bb,zt=Kr(()=>new fT().load(_t),[_t]),vt=dT(Yu,cc,cc),Oe=!!e&&vt===e.id;if(ps(()=>{ae.current||(U.current.copy(ge),f())},[ge,f]),ps(()=>{e&&ra===e.id&&!r&&hs(null)},[e?.id,r]),ps(()=>()=>{e&&ra===e.id&&hs(null)},[e?.id]),pT(()=>{if(v.current&&v.current.position.copy(U.current),y.current){y.current.lookAt(c.position);let X=c,q;X.isOrthographicCamera?q=Le/X.zoom:q=c.position.distanceTo(U.current)*Le,y.current.scale.setScalar(q)}if(M.current){let X=c,q;X.isOrthographicCamera?q=ub/X.zoom:q=c.position.distanceTo(U.current)*ub,M.current.scale.setScalar(q)}if(C.current){let X=c,q;X.isOrthographicCamera?q=fb/X.zoom:q=c.position.distanceTo(U.current)*fb,C.current.scale.setScalar(q)}if(m.current){let X=m.current.getAttribute("position"),q=X.array;q[0]=0,q[1]=0,q[2]=0,q[3]=U.current.x,q[4]=U.current.y,q[5]=U.current.z,X.needsUpdate=!0,m.current.computeBoundingSphere()}if(S.current){let X=U.current,q=X.length();S.current.visible=q>cb,q>1e-6&&(S.current.position.copy(X).multiplyScalar(.5),S.current.scale.set(1,q,1),S.current.quaternion.setFromUnitVectors(xb,X.clone().normalize()))}if(h.current&&(h.current.visible=U.current.length()>cb),Ve&&T.current&&E.current&&b.current){let X=U.current,q=X.length();if(q>1e-6){T.current.visible=!0;let Pe=X.clone().negate().normalize(),De=q,Se=e?.angle??Math.PI/6,fe=De*Math.tan(Se),dt=X.clone().add(Pe.clone().multiplyScalar(De)),[Wt,jt]=PT(Pe),Nn=E.current.getAttribute("position"),pn=Nn.array;for(let it=0;it<=ac;it++){let Re=it/ac*Math.PI*2,wt=dt.x+(Wt.x*Math.cos(Re)+jt.x*Math.sin(Re))*fe,ut=dt.y+(Wt.y*Math.cos(Re)+jt.y*Math.sin(Re))*fe,Ct=dt.z+(Wt.z*Math.cos(Re)+jt.z*Math.sin(Re))*fe;pn[it*3]=wt,pn[it*3+1]=ut,pn[it*3+2]=Ct}Nn.needsUpdate=!0,E.current.computeBoundingSphere();let we=b.current.getAttribute("position"),qe=we.array;for(let it=0;it<sc;it++){let Re=it/sc*Math.PI*2,wt=dt.x+(Wt.x*Math.cos(Re)+jt.x*Math.sin(Re))*fe,ut=dt.y+(Wt.y*Math.cos(Re)+jt.y*Math.sin(Re))*fe,Ct=dt.z+(Wt.z*Math.cos(Re)+jt.z*Math.sin(Re))*fe,At=it*6;qe[At]=X.x,qe[At+1]=X.y,qe[At+2]=X.z,qe[At+3]=wt,qe[At+4]=ut,qe[At+5]=Ct}we.needsUpdate=!0,b.current.computeBoundingSphere()}else T.current.visible=!1}if(B.current&&(B.current.visible=V.current.dragging),G.current&&V.current.dragging){let X=G.current.getAttribute("position"),q=X.array;q[0]=L.current.x,q[1]=L.current.y,q[2]=L.current.z,q[3]=U.current.x,q[4]=U.current.y,q[5]=U.current.z,X.needsUpdate=!0,G.current.computeBoundingSphere()}}),ps(()=>{let X=we=>{let qe=p.domElement.getBoundingClientRect();return new gT((we.clientX-qe.left)/qe.width*2-1,-((we.clientY-qe.top)/qe.height)*2+1)},q=we=>!!we.target.closest?.("button, input, textarea, .ri-annotationPopup, .ri-colorPicker, .ri-materialPicker"),Pe=()=>{let we=[];return[x.current,A.current,k.current,z.current,I.current,_.current].forEach(qe=>{qe&&we.push(qe)}),we},De=we=>we===x.current||we===A.current?"x":we===k.current||we===z.current?"y":we===I.current||we===_.current?"z":null,Se=()=>{V.current.dragging&&(V.current={dragging:!1,axis:null},B.current&&(B.current.visible=!1),p.domElement.style.cursor="default",le.current?.(!1))},fe=()=>{ae.current&&(ae.current=!1,p.domElement.style.cursor="default",le.current?.(!1))},dt=we=>{if(V.current.dragging&&V.current.axis){let ut=V.current.axis,Ct=U.current,At=yb(ut),lr=new Ht().subVectors(c.position,Ct),ce=TT(ut,lr);F.current.setFromNormalAndCoplanarPoint(ce,Ct);let R=X(we);g.setFromCamera(R,c);let N=new Ht,H=g.ray.intersectPlane(F.current,N);if(!H)return;let Y=H.clone().sub(Ct).dot(At),se=Ct.clone().add(At.clone().multiplyScalar(Y)),oe=[ta(ut==="x"?se.x:Ct.x,Zo,ea),ta(ut==="y"?se.y:Ct.y,Zo,ea),ta(ut==="z"?se.z:Ct.z,Zo,ea)];U.current.set(oe[0],oe[1],oe[2]),o?.(oe),f();return}if(!ae.current)return;let qe=X(we);g.setFromCamera(qe,c);let it=new Ht,Re=g.ray.intersectPlane(xe.current,it);if(!Re)return;let wt=[ta(Re.x,Zo,ea),ta(Re.y,Zo,ea),ta(Re.z,Zo,ea)];U.current.set(wt[0],wt[1],wt[2]),o?.(wt),f()},Wt=we=>{if(q(we))return;let qe=X(we);if(g.setFromCamera(qe,c),Oe){let wt=Pe(),ut=wt.length?g.intersectObjects(wt,!1):[];if(ut.length>0){let Ct=ut[0].object,At=De(Ct);if(At){let lr=U.current;V.current={dragging:!0,axis:At},L.current.copy(lr),le.current?.(!0),p.domElement.style.cursor="grabbing",p.domElement.setPointerCapture(we.pointerId),we.preventDefault(),we.stopPropagation();return}}}let it=[];if(P.current&&it.push(P.current),y.current&&it.push(y.current),it.length===0)return;if(g.intersectObjects(it,!1).length>0){let wt=e?.id??null;ra!==wt&&(hs(wt),d?.("scene"),u?.("Lighting"));let ut=new Ht;c.getWorldDirection(ut),xe.current.setFromNormalAndCoplanarPoint(ut,U.current),ae.current=!0,le.current?.(!0),p.domElement.style.cursor="grabbing",p.domElement.setPointerCapture(we.pointerId),we.preventDefault(),we.stopPropagation()}},jt=we=>{if(V.current.dragging){Se();try{p.domElement.releasePointerCapture(we.pointerId)}catch{}}if(ae.current){fe();try{p.domElement.releasePointerCapture(we.pointerId)}catch{}}},Nn=()=>{Se(),fe()},pn=()=>{Se(),fe()};return p.domElement.addEventListener("pointerdown",Wt),window.addEventListener("pointermove",dt),window.addEventListener("pointerup",jt),window.addEventListener("pointercancel",Nn),window.addEventListener("blur",pn),()=>{p.domElement.removeEventListener("pointerdown",Wt),window.removeEventListener("pointermove",dt),window.removeEventListener("pointerup",jt),window.removeEventListener("pointercancel",Nn),window.removeEventListener("blur",pn)}},[c,g,p,f,o,e,d,u,Oe]),l!=="scene"||s!=="Lighting"||!e||!r||e.type==="none"||e.type==="hemisphere")return null;let re=["x","y","z"];return bn("group",{ref:X=>{X&&Ph(X)},children:[bn("group",{ref:v,children:[He("sprite",{ref:y,children:He("spriteMaterial",{map:zt,transparent:!0,opacity:.9,blending:Wu,depthWrite:!1,rotation:Ve?CT:0},_t)}),He(hT,{ref:P,args:[.25,16,16],children:He("meshBasicMaterial",{transparent:!0,opacity:.01})}),je&&bn("group",{ref:M,children:[bn("lineLoop",{renderOrder:999,children:[He("bufferGeometry",{children:He("bufferAttribute",{attach:"attributes-position",args:[ne,3],count:na+1})}),He("lineBasicMaterial",{color:$u,transparent:!0,opacity:.6,depthTest:!1,depthWrite:!1})]}),bn("lineLoop",{renderOrder:999,children:[He("bufferGeometry",{children:He("bufferAttribute",{attach:"attributes-position",args:[ct,3],count:na+1})}),He("lineBasicMaterial",{color:$u,transparent:!0,opacity:.6,depthTest:!1,depthWrite:!1})]}),bn("lineLoop",{renderOrder:999,children:[He("bufferGeometry",{children:He("bufferAttribute",{attach:"attributes-position",args:[Ee,3],count:na+1})}),He("lineBasicMaterial",{color:$u,transparent:!0,opacity:.6,depthTest:!1,depthWrite:!1})]})]}),Oe&&He("group",{ref:C,children:re.map(X=>{let q=MT[X],Pe=new Ht(X==="x"?Rr:0,X==="y"?Rr:0,X==="z"?Rr:0),De=new Ht(X==="x"?Rr-lc/2:0,X==="y"?Rr-lc/2:0,X==="z"?Rr-lc/2:0),Se=new Ht(X==="x"?Rr/2:0,X==="y"?Rr/2:0,X==="z"?Rr/2:0),fe=X==="x"?[0,0,-Math.PI/2]:X==="y"?[0,0,0]:[Math.PI/2,0,0],dt=X==="x"?x:X==="y"?k:I,Wt=X==="x"?A:X==="y"?z:_;return bn("group",{children:[He(mT,{points:[new Ht(0,0,0),Pe],color:q,transparent:!0,opacity:.9,lineWidth:2,depthTest:!1}),bn("mesh",{ref:Wt,position:Se,rotation:fe,children:[He("cylinderGeometry",{args:[gb,gb,Rr,8]}),He("meshBasicMaterial",{transparent:!0,opacity:0,depthWrite:!1})]}),bn("mesh",{ref:dt,position:De,rotation:fe,children:[He("coneGeometry",{args:[ST,lc,8]}),He("meshBasicMaterial",{color:q,depthTest:!1})]})]},X)})})]}),!je&&!Ve&&bn(kT,{children:[bn("mesh",{ref:S,children:[He("cylinderGeometry",{args:[hb,hb,1,8,1,!0]}),He("meshBasicMaterial",{color:pb,transparent:!0,opacity:.05,blending:Wu,depthWrite:!1,depthTest:!1})]}),bn("line",{ref:h,children:[He("bufferGeometry",{ref:m,children:He("bufferAttribute",{attach:"attributes-position",args:[ve,3],count:2})}),He("lineBasicMaterial",{color:pb,transparent:!0,opacity:.7,blending:Wu})]})]}),Ve&&bn("group",{ref:T,children:[bn("lineLoop",{renderOrder:999,children:[He("bufferGeometry",{ref:E,children:He("bufferAttribute",{attach:"attributes-position",args:[Ae,3],count:ac+1})}),He("lineBasicMaterial",{color:mb,transparent:!0,opacity:.85,depthTest:!1,depthWrite:!1})]}),bn("lineSegments",{renderOrder:999,children:[He("bufferGeometry",{ref:b,children:He("bufferAttribute",{attach:"attributes-position",args:[Be,3],count:sc*2})}),He("lineBasicMaterial",{color:mb,transparent:!0,opacity:.5,depthTest:!1,depthWrite:!1})]})]}),bn("line",{ref:X=>{B.current=X,X&&(X.visible=!1)},children:[He("bufferGeometry",{ref:G,children:He("bufferAttribute",{attach:"attributes-position",args:[Te,3],count:2})}),He("lineBasicMaterial",{color:"#ffffff",transparent:!0,opacity:.6})]})]})}import{useCallback as Ku,useLayoutEffect as ET,useMemo as Er,useRef as hi}from"react";import{PivotControls as LT}from"@react-three/drei";import{useFrame as BT,useThree as OT}from"@react-three/fiber";import{Euler as Tb,Matrix4 as uc,Quaternion as pc,Vector3 as ms}from"three";import{Box3 as wb,Euler as _T,Matrix4 as Cb,Quaternion as AT,Vector3 as pi}from"three";function dc(e){e.updateWorldMatrix(!0,!0);let t=new Cb().copy(e.matrixWorld).invert(),n=new wb,i=new wb,r=!1;return e.traverse(o=>{let a=o;if(!a.isMesh||!a.geometry||(a.geometry.boundingBox||a.geometry.computeBoundingBox(),!a.geometry.boundingBox))return;let l=new Cb().multiplyMatrices(t,o.matrixWorld);i.copy(a.geometry.boundingBox).applyMatrix4(l),n.union(i),r=!0}),r?n.getCenter(new pi):new pi}function Sb(e,t="XYZ"){return new AT().setFromEuler(new _T(e[0],e[1],e[2],t))}function RT(e,t,n,i,r="XYZ"){let a=new pi(...i).multiply(new pi(...n)).applyQuaternion(Sb(t,r)).add(new pi(...e));return[a.x,a.y,a.z]}function Mb(e,t,n,i,r,o="XYZ"){let a=new pi(...RT(e,t,i,r,o)),l=new pi(...r).multiply(new pi(...i)).applyQuaternion(Sb(n,o)),s=a.sub(l);return[s.x,s.y,s.z]}import{jsx as Pb}from"react/jsx-runtime";function Ju({node:e,space:t,onTransformChange:n,onDraggingChange:i}){let r=OT(x=>x.invalidate),o=Er(()=>dc(e),[e]),a=Er(()=>new uc,[]),l=hi(!1),s=hi(new uc),d=hi(new uc),u=hi(null),c=hi(0),p=hi([]),g=hi(null),f=Er(()=>new ms,[]),v=Er(()=>new pc,[]),P=Er(()=>new ms,[]),y=Er(()=>new pc,[]),h=Er(()=>new ms(1,1,1),[]),m=Er(()=>new pc,[]),S=Er(()=>new ms,[]),M=Er(()=>new ms,[]),T=hi([0,0,0]),E=Ku(()=>{l.current||(e.updateWorldMatrix(!0,!1),f.copy(o).applyMatrix4(e.matrixWorld),e.getWorldQuaternion(v),y.copy(v),t==="world"&&y.identity(),a.compose(f,y,h))},[f,a,y,h,e,o,t,v]);ET(()=>(E(),()=>{g.current!==null&&(cancelAnimationFrame(g.current),g.current=null),i(!1);for(let x of p.current)Io(x);p.current=[]}),[i,E]),BT(()=>E());let b=Ku(()=>{g.current!==null&&(cancelAnimationFrame(g.current),g.current=null),e.updateWorldMatrix(!0,!0),p.current=[];for(let x of No(e))Ym(x)||(wl(x,x.matrixWorld),p.current.push(x));e.updateWorldMatrix(!0,!1),f.copy(o).applyMatrix4(e.matrixWorld),e.getWorldQuaternion(v),e.getWorldScale(P),s.current.compose(f,v,P),d.current.copy(a),T.current=[e.rotation.x,e.rotation.y,e.rotation.z],u.current=null,l.current=!0,i(!0)},[f,a,e,i,o,v,P]),C=Ku((x,k)=>{let I=s.current.clone().premultiply(k),A=d.current.clone().premultiply(k);I.decompose(S,v,M);let z=S.clone();A.decompose(f,y,h),t==="world"&&y.identity(),a.compose(f,y,h),x.decompose(S,m,M);let _=new Tb().setFromQuaternion(m,e.rotation.order),[V,F,L]=T.current,B=[V+_.x,F+_.y,L+_.z],G=new pc().setFromEuler(new Tb(B[0],B[1],B[2],e.rotation.order)),ae=(e.parent?.matrixWorld||new uc).clone().invert(),xe=z.clone().applyMatrix4(ae),le=o.clone().multiply(e.scale).applyQuaternion(G),ge=xe.clone().sub(le),ve=[ge.x,ge.y,ge.z];e.position.set(ve[0],ve[1],ve[2]),e.rotation.set(B[0],B[1],B[2],e.rotation.order),e.updateMatrixWorld(!0),r(),u.current={position:ve,rotation:B}},[f,m,a,y,h,r,e,o,S,M,t,v]);return Pb("group",{children:Pb(LT,{matrix:a,autoTransform:!1,fixed:!0,scale:90,lineWidth:3,axisColors:["#ff2d6f","#64dfa6","#2f8fe8"],hoveredColor:"#ffd84d",opacity:.95,depthTest:!1,disableScaling:!0,onDragStart:b,onDrag:(x,k,I,A)=>C(k,A),onDragEnd:()=>{l.current=!1;let x=u.current;if(u.current=null,x)n(x),g.current=requestAnimationFrame(()=>{g.current=null,i(!1)});else if(p.current.length>0){for(let k of p.current)Io(k);e.updateMatrixWorld(!0),r(),i(!1)}else i(!1);p.current=[]}})})}import{Fragment as Yi,jsx as $,jsxs as ze}from"react/jsx-runtime";function a2(e){let t=e.object;if(!t.isSkinnedMesh||!e.face||!t.skeleton)return null;let n=t.geometry,i=n.getAttribute("skinIndex"),r=n.getAttribute("skinWeight"),o=n.getAttribute("position");if(!i||!r||!o)return null;let a=t.worldToLocal(e.point.clone()),l=[e.face.a,e.face.b,e.face.c],s=new Ln,d=l[0],u=1/0;for(let g of l){s.fromBufferAttribute(o,g);let f=s.distanceToSquared(a);f<u&&(u=f,d=g)}let c=i.getComponent(d,0),p=r.getComponent(d,0);for(let g=1;g<4;g++){let f=r.getComponent(d,g);f>p&&(p=f,c=i.getComponent(d,g))}return t.skeleton.bones[c]??null}function s2(e){let t=a2(e)??e.object,n=za(t);if(!n)return null;t.updateWorldMatrix(!0,!1);let i=t.worldToLocal(e.point.clone());return{anchorNodeName:n,anchorLocalPosition:[i.x,i.y,i.z]}}function l2(e,t,n){if(!e.anchorNodeName||!e.anchorLocalPosition)return!1;let i=mr(t,e.anchorNodeName);return i?(i.updateWorldMatrix(!0,!1),n.set(...e.anchorLocalPosition).applyMatrix4(i.matrixWorld),!0):!1}function c2({annotation:e,enabled:t,controlsRef:n,offsetRef:i}){let r=jT(p=>p.scene),o=lt(null),a=lt(!1),l=Cn(()=>new Ln,[]),s=Cn(()=>new Ln,[]),d=Cn(()=>new Ln,[]),u=e?.anchorNodeName,c=e?.anchorLocalPosition;return yt(()=>{o.current=null,a.current=!1},[u,e?.id]),zT(()=>{let p=n.current,g=i.current;if(!t||!p||!g||!u||!c){a.current=!1;return}let f=o.current;if((!f||!f.parent)&&(f=mr(r,u),o.current=f),!f){a.current=!1;return}f.updateWorldMatrix(!0,!1),l.set(c[0],c[1],c[2]).applyMatrix4(f.matrixWorld),!(a.current&&l.distanceToSquared(s)<1e-8)&&(s.copy(l),a.current=!0,d.copy(l).add(g),p.setLookAt(d.x,d.y,d.z,l.x,l.y,l.z,!0))}),null}function d2(e){let t={total:0,missing:0};return e.traverse(n=>{let i=n;!i.isMesh||!i.geometry||(t.total+=1,i.geometry.getAttribute("uv")||(t.missing+=1))}),t}function u2(e,t){let n=t?.camera;if(!(n instanceof FT))return;let r=(e instanceof ia?e:new ia().setFromObject(e)).getSize(new Ln).length();!Number.isFinite(r)||r<=0||(n.near=r/100,n.far=r*100,n.updateProjectionMatrix(),t&&(t.maxDistance=r*10))}async function Rb(e,t,n=.6){let i=e.smoothTime;e.smoothTime=n;try{return await t()}finally{e.smoothTime=i}}function hc({modelUrl:e,tilesetUrl:t,tilesErrorTarget:n=8,tilesCacheSize:i=800,onObjectCatalog:r,modelFormat:o,licenseKey:a,licenseValidationUrl:l,objectBindings:s,selectedObject:d,panelHoveredObject:u,onObjectBindingsChange:c,onObjectSelect:p,onObjectHover:g,onObjectEditLeaseChange:f,onModelLoaded:v,onLoadError:P,onAction:y,onHiddenObjectsChange:h,onCameraChange:m,onViewerReady:S,onTextureUpload:M,onAnimationsReady:T,onAnnotationsChange:E,activeAnnotation:b,onActiveAnnotationChange:C,lights:x,camera:k,backgroundColor:I,shadows:A=!0,showObjectBindingDataPanel:z=!0,customObjectBindingDataPanel:_,customSceneObjectsPanel:V,showSceneObjectsPanel:F=!0,showDownloadButton:L=!0,downloadFilename:B="model",showResetButton:G=!0,showLoadingOverlay:U=!0,showMouseController:ae=!1,mouseControllerPosition:xe="center-bottom",mouseControllerOpacity:le=1,moveSensitivity:ge=.08,zoomSensitivity:ve=1,sceneConfig:Te,onSceneConfigChange:ne,disableZoom:ct=!1,zoomOnSelected:Ee=!0,highlightOnHover:Ae=!0,enableCameraControls:Be=!0,onAutoFit:je,refitOnResize:Ve=!0,renderMode:_t="demand",maxDpr:Le=2,preserveDrawingBuffer:zt=!1,performanceProfile:vt="auto",dracoDecoderPath:Oe,ktx2TranscoderPath:re,meshopt:X=!0,showMeasureTools:q=!1,showUvCheckerButton:Pe=!1,showExplodeControls:De=!1,cinematic:Se,measurementUnit:fe="m",enableXR:dt=!1,usdzUrl:Wt,arScaleMode:jt="normalized",mobileHandoffUrl:Nn,showAnnotationNavigation:pn=!0,showAnnotationOnHover:we=!1,moveModeEnabled:qe=!1,objectTransformSpace:it="world",enableKeyboardNavigation:Re=!1,showViewGizmo:wt=!1}){let{isInsideEditor:ut,activeTab:Ct,activeSubTab:At}=er(),lr=ut&&Ct==="scene"&&At==="Lighting",ce=rc(a,l),R=Cn(()=>Te??Ai,[Te]),[N,H]=Ue(null),Z=R.model.renderer==="uv-checker",Y=Pe?N??Z:Z,se=Cn(()=>{let w=Y?"uv-checker":Z?"pbr":R.model.renderer;return w===R.model.renderer?R:{...R,model:{...R.model,renderer:w}}},[Z,R,Y]);yt(()=>{H(null)},[e,R.model.renderer,Pe,t]);let oe=Cn(()=>{if(I)return I;let w=R.background;return w.enabled&&w.type==="color"?w.color:"#1c1c1d"},[I,R]),tt=Cn(()=>({dracoDecoderPath:Oe,ktx2TranscoderPath:re,meshopt:X}),[Oe,re,X]),ot=Cn(()=>zh(vt),[vt]),be=lt(null),[Ne,st]=Ue(!1);yt(()=>{be.current&&(be.current.dollySpeed=Math.max(ve,0))},[ve]),yt(()=>{be.current&&(be.current.enabled=Be&&!Ne)},[Be,Ne]);let ue=lt(null),pt=lt(new Map),$t=lt(null),rn=lt(null),Rt=lt(null),It=lt({});yt(()=>()=>{for(let w of Object.values(It.current))URL.revokeObjectURL(w)},[]);let Ye=lt({}),[,vr]=Ue(0),xt=ke(()=>{vr(w=>w+1)},[]),so=lt({}),ha=lt(null),Wn=lt(null),[Br,_c]=Ue(null),Ac=ke(w=>{Wn.current=w,_c(w)},[]),lo=lt(new Set),$n=lt(null);yt(()=>{let w=Br;if(!w||!Re||!Be||qe)return;let D=new Set(["w","a","s","d"," ","c"]),ee=new Set(["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"]),ie=0,de=Ke=>Ke.code==="Space"?" ":Ke.key.toLowerCase(),at=()=>{lo.current.clear(),ie=0,$n.current!==null&&(cancelAnimationFrame($n.current),$n.current=null)},Tt=Ke=>{let Et=be.current,nt=lo.current;if(!Et||nt.size===0){$n.current=null,ie=0;return}let An=ie?Math.min((Ke-ie)/1e3,.05):1/60;ie=Ke;let en=Math.max(Et.distance*.75,.01)*An;nt.has("w")&&Et.forward(en,!1),nt.has("s")&&Et.forward(-en,!1),nt.has("a")&&Et.truck(-en,0,!1),nt.has("d")&&Et.truck(en,0,!1),nt.has(" ")&&Et.truck(0,en,!1),nt.has("c")&&Et.truck(0,-en,!1),$n.current=requestAnimationFrame(Tt)},_n=Ke=>{if(Ke.target!==w){at();return}if(ee.has(Ke.key)){let nt=be.current;if(!nt)return;Ke.preventDefault();let An=Math.PI/90,en=Math.max(nt.distance*.05,.01);Ke.key==="ArrowUp"?Ke.shiftKey?nt.forward(en,!0):nt.rotate(0,-An,!0):Ke.key==="ArrowDown"?Ke.shiftKey?nt.forward(-en,!0):nt.rotate(0,An,!0):Ke.key==="ArrowLeft"?nt.rotate(-An,0,!0):nt.rotate(An,0,!0);return}let Et=de(Ke);D.has(Et)&&(Ke.preventDefault(),lo.current.add(Et),$n.current===null&&($n.current=requestAnimationFrame(Tt)))},Ft=Ke=>{lo.current.delete(de(Ke))};return w.addEventListener("keydown",_n),w.addEventListener("keyup",Ft),w.addEventListener("blur",at),()=>{w.removeEventListener("keydown",_n),w.removeEventListener("keyup",Ft),w.removeEventListener("blur",at),at()}},[Br,Be,Re,qe]);let St=lt(null),[ma,cr]=Ue(s),[Qr,co]=Ue({}),[Ms,Zr]=Ue(null),[vi,In]=Ue(null),[Rc,dr]=Ue(null),[ga,Ec]=Ue(null),[zn,uo]=Ue(null),[Xn,wi]=Ue(null),hn=lt(null),po=lt(null),Ts=lt(null),[Fp,Ps]=Ue(0),wr=lt(!1),Ci=lt(!1),fa=lt(!!k);fa.current=!!k;let ur=lt(null),[ho,Si]=Ue(!!e),[mo,Mi]=Ue(!e||!!je||!!k),[Or,ks]=Ue(!1),[Lc,ba]=Ue(!1),[_s,Ti]=Ue(!1),[xa,As]=Ue(!1),[Rs,Bc]=Ue(null),[Oc,Es]=Ue(!1),[Pi,Ls]=Ue({total:0,missing:0}),[Bs,Dr]=Ue("Loading model..."),go=lt({}),O=ke(()=>{let w=be.current;if(!w||ur.current)return;let D=w.getPosition(new Ln),ee=w.getTarget(new Ln);ur.current={position:[D.x,D.y,D.z],target:[ee.x,ee.y,ee.z]}},[]),[j,J]=Ue(!1),[me,Ce]=Ue(0),[Mt,ht]=Ue(!1);yt(()=>{Ce(0),ht(!1)},[e,t]);let Fe=Cn(()=>{let w=R.cinematic,D=w?.enabled?{waypoints:w.waypoints,duration:w.duration,loop:w.loop,autoPlay:w.autoPlay}:null;return Se===void 0?D&&(D.waypoints?.length??0)>=2?D:null:Se===!1?null:Se===!0?D??{}:{...D??{},...Se}},[Se,R]),[Pn,Cr]=Ue(!1),[_0,fo]=Ue(!1),Dc=lt(!1);yt(()=>{Cr(!1),fo(!1),Dc.current=!1},[e,t]),yt(()=>{!Fe?.autoPlay||Dc.current||Or&&mo&&!ho&&(Dc.current=!0,Cr(!0),fo(!1))},[Fe,Or,mo,ho]);let{xrStore:ki,presenterRef:A0,arSupported:Nc,vrSupported:Up,quickLookSupported:Gp,resolvedMobileHandoffUrl:Os,isMobileHandoffOpen:Hp,arOverlay:R0,openMobileHandoff:E0,closeMobileHandoff:Wp,openQuickLook:L0,handleARStateChange:B0}=Fh({enableXR:dt,usdzUrl:Wt,mobileHandoffUrl:Nn}),[Sr,$p]=Ue(()=>Te?.annotations??[]);yt(()=>{if(Sr.length>0){let w=Sr.reduce((D,ee)=>Math.max(D,ee.id),0);Is.current=w}else Is.current=0},[Sr]);let[kn,Ds]=Ue(null),[ei,Ns]=Ue({title:"",description:""}),Is=lt(0),[O0,Xp]=Ue(null),[qn,bo]=Ue(-1),[qp,zs]=Ue(!1),xo=lt(null),Vt=Cn(()=>[...Sr].sort((w,D)=>w.id-D.id),[Sr]),js=Cn(()=>qn<0||qn>=Vt.length?null:Vt[qn],[qn,Vt]),Mr=ke(w=>{if(b!==void 0){C?.(w);return}Xp(w?{annotation:w}:null)},[b,C]),yo=ke(w=>{let D=be.current,ee=hn.current;if(!D)return;let ie=new Ln,de=pt.current.get(w.id);de?ie.copy(de):ee&&l2(w,ee,ie)||ie.set(w.worldPosition[0],w.worldPosition[1],w.worldPosition[2]),ue.current=null;let at=D.smoothTime;D.smoothTime=.6;let Tt=w.worldNormal;if(ee){let _n=new ia().setFromObject(ee),Ft=new Ln;_n.getCenter(Ft);let Ke=new Ln;_n.getSize(Ke);let Et=Ke.length()*.2,nt;Tt?nt=new Ln(Tt[0],Tt[1],Tt[2]):nt=ie.clone().sub(Ft),nt.lengthSq()<1e-6&&nt.set(0,0,1),nt.normalize();let An=Math.max(Et*.6,.3),en=ie.clone().add(nt.multiplyScalar(An));D.setPosition(en.x,en.y,en.z,!0),w.anchorNodeName&&w.anchorLocalPosition&&(ue.current=en.clone().sub(ie))}D.setTarget(ie.x,ie.y,ie.z,!0),xo.current&&clearTimeout(xo.current),xo.current=setTimeout(()=>{D.smoothTime=at,xo.current=null},800),Mr(w)},[Mr]),D0=ke(()=>{Vt.length!==0&&(J(!0),bo(0),yo(Vt[0]))},[Vt,yo]),N0=ke(()=>{if(Vt.length===0||qn<0)return;zs(!0);let w=(qn-1+Vt.length)%Vt.length;bo(w),yo(Vt[w]),setTimeout(()=>zs(!1),500)},[qn,Vt,yo]),I0=ke(()=>{if(Vt.length===0||qn<0)return;if(qn===Vt.length-1){if(J(!1),bo(-1),Mr(null),be.current&&ur.current){let D=ur.current;be.current.setLookAt(D.position[0],D.position[1],D.position[2],D.target[0],D.target[1],D.target[2],!0)}return}zs(!0);let w=qn+1;bo(w),yo(Vt[w]),setTimeout(()=>zs(!1),500)},[qn,Vt,yo,Mr]),z0=ke(()=>{if(J(!1),bo(-1),Mr(null),be.current&&ur.current){let w=ur.current;be.current.setLookAt(w.position[0],w.position[1],w.position[2],w.target[0],w.target[1],w.target[2],!0)}},[Mr]);yt(()=>{bo(-1),J(!1)},[Vt.length]),yt(()=>()=>{xo.current&&clearTimeout(xo.current)},[]),yt(()=>{js&&j&&Mr(js)},[js,Mr,j]),yt(()=>{if(Te?.annotations===void 0)return;let w=Te.annotations.map(D=>({...D,localPosition:D.localPosition??D.worldPosition}));$p(w)},[Te?.annotations]);let ya=ke(()=>{if(b!==void 0){C?.(null);return}Xp(null)},[b,C]),va=b!==void 0?b:O0?.annotation??null,wa=Cn(()=>va?Sr.find(D=>D.id===va.id)??null:null,[va,Sr]);yt(()=>{va&&!wa&&ya()},[va,wa,ya]);let Ca=c!==void 0,mt=Ca?s:ma;go.current=mt;let j0=Cn(()=>Object.entries(mt).map(([w,D])=>JSON.stringify([w,D.modelObjectId,D.transform??null])).sort().join(""),[mt]),{measureMode:Sa,measureModeRef:V0,measurePoints:Yp,showDimensions:Ic,measureBox:Kp,modelBounds:F0,refreshBounds:Jp,clearMeasurements:U0,toggleMeasureMode:G0,toggleDimensions:H0,handleMeasurePointerDown:W0,handleMeasureClick:$0}=Nh({canvasAreaRef:Wn,controlsRef:be,sceneRef:hn,modelUrl:e,modelRotation:R.model.rotation,bindingTransformSignature:j0,modelLoaded:Or}),{isDownloading:zc,downloadMenuOpen:X0,uvExportError:Qp,toggleDownloadMenu:q0,handleDownloadMesh:Y0,handleDownloadScreenshot:K0,handleDownloadUvLayout:J0}=Oh({sceneRef:hn,materialRefs:so,rendererCaptureRef:Rt,objectBindings:mt,downloadFilename:B}),Zp=Cn(()=>Object.fromEntries(Object.entries(mt).filter(([,w])=>w.visible===!1).map(([w])=>[w,!0])),[mt]),Nr=Cn(()=>{let w=new WeakMap,D=new Map,ee=new Map;for(let[ie,de]of Object.entries(mt))w.set(de,ie),D.has(de.id)||D.set(de.id,ie),ee.has(de.modelObjectId)||ee.set(de.modelObjectId,ie);return{byReference:w,byId:D,byModelObjectId:ee}},[mt]),ti=ke(w=>w?Nr.byReference.get(w)??Nr.byModelObjectId.get(w.modelObjectId)??Nr.byId.get(w.id)??null:null,[Nr]),jc=d!==void 0,Ma=jc?d??null:ga,pr=ti(Ma),Vc=pr?Ye.current[pr]??null:null,eh=ti(Ae?u??vi??Rc:null),Q0=eh?Ye.current[eh]??null:null,th=ke(w=>{dr(w),g?.(w)},[g]),nh=z&&Ma!==null&&pr!==null,rh=(pr?mt[pr]:null)??Ma;yt(()=>{Ca||cr(s)},[Ca,s]),yt(()=>{h?.(Zp)},[Zp,h]);let vo=ke(w=>{jc||Ec(w),p?.(w)},[jc,p]),wo=ke(w=>{Ca||cr(w),c?.(w)},[Ca,c]),Z0=ke(w=>{let D=pr;if(!D||!w)return;let ee=go.current[D];ee&&wo({...go.current,[D]:{...ee,transform:{...ee.transform,...w}}})},[wo,pr]),Ir=ke((w,D)=>mt[w]?w:D?ti(D):Nr.byId.get(w)??Nr.byModelObjectId.get(w)??null,[mt,ti,Nr]),Ta=ke((w,D)=>{let ee=Ir(w),ie=ee?mt[ee]:void 0;!ee||!ie||wo({...mt,[ee]:{...ie,style:D(ie.style)}})},[Ir,mt,wo]),Yn=ke(()=>{if(zn){let w=Qr[zn.objectId]?.hex;w!==void 0&&(Ta(zn.objectId,D=>({...D,material:{...D?.material,baseColor:w}})),co(D=>({...D,[zn.objectId]:{}})))}uo(null)},[zn,Qr,Ta]),ih=ke(()=>{vo(null),Zr(null),Yn(),wi(null)},[vo,Yn]),Fc=ke((w,D,ee,ie,de)=>{let at=ha.current,Tt=Wn.current,_n=be.current?.camera;if(!at)return{objectId:w,x:24,y:24};let Ft=at.getBoundingClientRect(),Ke=12,Et=Ft.width-D-Ke,nt=Ft.height-ee-Ke,An=Math.max(Ke,(Ft.width-D)/2),en=Math.max(Ke,(Ft.height-ee)/2),So=Ir(w,ie),fh=So?Ye.current[So]:null,Fs=(Mo,_i)=>_i<=Ke?Ke:Math.min(Math.max(Mo,Ke),_i);if(Tt&&_n&&fh){let Mo=Tt.getBoundingClientRect(),_i=new Ln;new ia().setFromObject(fh).getCenter(_i),_i.project(_n);let by=(_i.x+1)/2*Mo.width+(Mo.left-Ft.left),xy=(1-_i.y)/2*Mo.height+(Mo.top-Ft.top);return{objectId:w,x:Fs(by+24,Et),y:Fs(xy-ee/2,nt)}}let gy=typeof de?.screenX=="number"?de.screenX-Ft.left:An,fy=typeof de?.screenY=="number"?de.screenY-Ft.top:en;return{objectId:w,x:Fs(gy,Et),y:Fs(fy,nt)}},[Ir]),Vs=ke(w=>{let{objectId:D,action:ee,binding:ie}=w;switch(Zr(w),ee.id){case"toggle-visibility":{let de=D;ie?.modelObjectId&&(de=Nr.byModelObjectId.get(ie.modelObjectId)??de);let at=mt[de],Tt=at?.visible===!1;at&&wo({...mt,[de]:{...at,visible:Tt}});break}case"change-color":Yn(),wi(null),co(de=>{let at=Ir(D,ie)??D,Tt=de[D]?.hex,_n=mt[at]?.style?.material?.baseColor;return{...de,[D]:{...de[D],hex:Tt??_n??"#ffffff"}}}),uo(Fc(D,225,250,ie,w));break;case"change-material":Yn(),wi(Fc(D,300,320,ie,w));break;default:break}y?.(w)},[wo,mt,Fc,y,Yn,Ir,Nr]);yt(()=>{if(zn)return window.addEventListener("pointerdown",Yn),()=>window.removeEventListener("pointerdown",Yn)},[zn,Yn]),yt(()=>{if(!Xn)return;let w=()=>wi(null);return window.addEventListener("pointerdown",w),()=>window.removeEventListener("pointerdown",w)},[Xn]),yt(()=>{if(!wa)return;let w=D=>{if(St.current&&!St.current.contains(D.target)){if(D.target.closest?.(".ri-annotationMarker"))return;ya()}};return document.addEventListener("mousedown",w),document.addEventListener("touchstart",w),()=>{document.removeEventListener("mousedown",w),document.removeEventListener("touchstart",w)}},[wa,ya]),yt(()=>{if(!kn)return;let w=D=>{let ee=D.target;if(ee.closest?.(".ri-annotationPopup")||ee.closest?.("button, input, textarea, .ri-measureTools, .ri-xrTools, .ri-buttonContainer"))return;let ie=Wn.current;!ie||!ie.contains(ee)||(Ds(null),Ns({title:"",description:""}))};return document.addEventListener("mousedown",w,!0),document.addEventListener("touchstart",w,!0),()=>{document.removeEventListener("mousedown",w,!0),document.removeEventListener("touchstart",w,!0)}},[kn]);let oh=ke((w,D)=>{let ee=It.current[w];ee&&URL.revokeObjectURL(ee),D.startsWith("blob:")?It.current[w]=D:delete It.current[w],Ta(w,ie=>({...ie,material:{...ie?.material,texture:{path:D}}}))},[Ta]),ey=w=>{let D=w.target.files?.[0],ee=rn.current;if(!D||!ee)return;let ie=Ir(ee);ie&&(M?M(D,ie).then(de=>oh(ie,de),de=>console.error("onTextureUpload failed:",de)):oh(ie,URL.createObjectURL(D)),w.target.value="")},ah=w=>{rn.current=w,$t.current?.click()},sh=w=>{let D=Ir(w);if(!D)return;Ta(D,ie=>ie?.material?.texture?{...ie,material:{...ie.material,texture:void 0}}:ie);let ee=It.current[D];ee&&(URL.revokeObjectURL(ee),delete It.current[D])},Uc=lt(S);Uc.current=S;let hr=ke(()=>{let w=be.current;!w||!Uc.current||Uc.current({controls:w,scene:hn.current,objectBindings:go.current,nodeRefs:Ye.current,homeCameraState:ur.current,captureImage:D=>qs(Rt.current,D),invalidate:()=>Rt.current?.invalidate()})},[]),Co=ke(async(w=!1)=>{let D=be.current,ee=po.current??hn.current;if(!D||!ee)return!1;try{if(w){let ie=(ee instanceof ia?ee:new ia().setFromObject(ee)).getBoundingSphere(new GT),de=ie.center.clone(),Tt=D.getPosition(new Ln).clone().sub(D.getTarget(new Ln));Tt.lengthSq()<1e-6&&Tt.set(0,0,1),Tt.normalize();let _n=Math.max(ie.radius*10,20),Ft=de.clone().add(Tt.multiplyScalar(_n));await D.setLookAt(Ft.x,Ft.y,Ft.z,de.x,de.y,de.z,!1)}return Mi(!0),await Rb(D,()=>D.fitToBox(ee,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5})),await new Promise(ie=>{let de=performance.now(),at=()=>{D.active===!1||performance.now()-de>8e3?(D.dispatchEvent({type:"update"}),Rt.current?.invalidate(),ie()):(Rt.current?.invalidate(),setTimeout(at,100))};setTimeout(at,100)}),wr.current=!0,O(),hr(),!0}catch(ie){return console.error("Fit scene error:",ie),!1}},[O,hr]);yt(()=>{if(wr.current=!1,Ci.current=!1,ur.current=null,hn.current=null,po.current=null,ks(!1),ba(!1),Ti(!1),Ls({total:0,missing:0}),Dr("Loading model..."),!e){Si(!1),Mi(!0);return}Si(!0),Mi(!!je||fa.current);let w=!1,D=null,ee=de=>{D=setTimeout(ie,de)},ie=()=>{if(w||wr.current||Ci.current)return;let de=po.current??hn.current;if(!be.current||!de){ee(100);return}if(u2(de,be.current),ib(be.current)){wr.current=!0,O(),hr(),Si(!1),Mi(!0),Rt.current?.invalidate();return}Ci.current=!0,(je?je():fa.current?Promise.resolve(!0):Co(!0)).then(Tt=>{wr.current=Tt!==!1,wr.current?(O(),hr(),Si(!1)):w||ee(100)}).catch(()=>{wr.current=!1,w||ee(100)}).finally(()=>{Ci.current=!1})};return ee(50),()=>{w=!0,D&&clearTimeout(D)}},[O,Co,e,hr,je,t]),yt(()=>{if(!Ve)return;let w=Br;if(!w)return;let D=null,ee=new ResizeObserver(()=>{!wr.current||Ci.current||(D&&clearTimeout(D),D=setTimeout(()=>{Co()},150))});return ee.observe(w),()=>{ee.disconnect(),D&&clearTimeout(D)}},[Br,Co,Ve]);let lh=ke(w=>{if(V0.current||(Cr(!1),Yn(),wi(null),Zr(null),vo(w),ct||!Ee))return;let D=be.current,ee=ti(w),ie=ee?Ye.current[ee]:null;D&&w.cameraState?.position&&w.cameraState?.target?(D.setPosition(w.cameraState.position[0],w.cameraState.position[1],w.cameraState.position[2],!0),D.setTarget(w.cameraState.target[0],w.cameraState.target[1],w.cameraState.target[2],!0)):D&&ie&&D.fitToBox(ie,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5}).catch(()=>{})},[vo,Yn,ti,ct,Ee]),ch=ke(w=>{if(vo(w),ct)return;let D=be.current,ee=ti(w),ie=ee?Ye.current[ee]:null;if(!D||!ie)return;let de=w.cameraState;de?.position&&de?.target?(D.setPosition(de.position[0],de.position[1],de.position[2],!0),D.setTarget(de.target[0],de.target[1],de.target[2],!0)):D.fitToBox(ie,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5}).catch(()=>{})},[vo,ti,ct]);yt(()=>{hr()},[hr]);let dh=ke((w,D)=>{m?.(w,D),hr()},[hr,m]),ty=ke(w=>{Ts.current=new Set(w.map(D=>D.name)),Ps(D=>D+1),r?.(w)},[r]),ny=ke(w=>{po.current=w,Rt.current?.invalidate()},[]),uh=ke(w=>{hn.current=w,Jp(w),Ls(d2(w));let D=Ra(w);Bc(D>Ei?D:null),Es(!1),D>Ei&&Dr(`Preparing large model (${Math.round(D/1e6)}M triangles) \u2014 the first display can take a while on this device...`),ks(!0),ba(!1),As(!1),v?.(w),hr()},[hr,v,Jp]),ph=ke(w=>{Si(!1),Mi(!0),ba(!0),P?.(w)},[P]),ry=ke((w,D)=>{if(!ne)return;let ee={...R,lighting:{...R.lighting,lights:R.lighting.lights.map(ie=>ie.id===w?{...ie,position:D}:ie)}};ne(ee)},[R,ne]);yt(()=>{let w=hn.current;if(!Or||!w){Ti(!1);return}let D=Object.entries(mt);if(D.length===0){Ti(!1);return}let ee=t?Ts.current:new Set(Object.keys(Oo(w).nodesById));if(!ee||ee.size===0){Ti(!1);return}let ie=D.some(([de,at])=>!ee.has(at.modelObjectId??de));Ti(ie)},[Or,mt,Fp,t]);let Gc=ke(async()=>{if(je){await je();return}let w=be.current;if(!w)return;let D=ur.current;try{D?await Rb(w,()=>w.setLookAt(D.position[0],D.position[1],D.position[2],D.target[0],D.target[1],D.target[2],!0)):await Co()}catch(ee){console.error("Reset camera error:",ee)}},[je,Co]),h_=ke(()=>{fo(!1),Cr(!0)},[]),m_=ke(()=>{Cr(!1)},[]),iy=ke(()=>{Cr(!1),fo(!0),setTimeout(()=>{Gc()},100)},[Gc]),oy=ke((w,D)=>{dh(w,D)},[dh]),ay=ke(w=>{if(Ct!=="scene"||At!=="Annotations"||w.target.closest("button, input, textarea, .ri-colorPicker, .ri-materialPicker, .ri-annotationPopup, .ri-annotationMarker, .ri-viewAnnotationPopup"))return;let ee=Wn.current,ie=be.current?.camera,de=hn.current;if(!ee||!ie||!de)return;let at=ee.getBoundingClientRect(),Tt=(w.clientX-at.left)/at.width*2-1,_n=-((w.clientY-at.top)/at.height)*2+1,Ft=new UT;Ft.setFromCamera(new HT(Tt,_n),ie);let Ke=Ft.intersectObject(de,!0);if(Ke.length===0)return;let Et=Ke[0],nt=Et.point,An=de.worldToLocal(Et.point.clone()),en=[0,0,1];if(Et.face){let So=Et.face.normal.clone().transformDirection(Et.object.matrixWorld).normalize();en=[So.x,So.y,So.z]}Ds({worldPosition:[nt.x,nt.y,nt.z],localPosition:[An.x,An.y,An.z],worldNormal:en,anchor:s2(Et),screenX:w.clientX-at.left,screenY:w.clientY-at.top}),Ns({title:"",description:""})},[Ct,At]),hh=ke(()=>{if(!kn||!ei.title.trim())return;Is.current+=1;let D={id:Is.current,worldPosition:kn.worldPosition,localPosition:kn.localPosition,worldNormal:kn.worldNormal,anchorNodeName:kn.anchor?.anchorNodeName,anchorLocalPosition:kn.anchor?.anchorLocalPosition,title:ei.title.trim(),description:ei.description},ee=[...Sr,D];$p(ee),E?.(ee),Ds(null)},[kn,ei,Sr,E]),Hc=ke(()=>Ds(null),[]),sy=ke(w=>{Mr(w)},[Mr]);if(ce.status==="checking")return $("div",{className:"ri-viewer ri-viewer--license-checking",children:$(Li,{title:"Verifying License",message:"Checking your license key..."})});if(ce.status==="invalid")return $("div",{className:"ri-viewer ri-viewer--license-invalid",children:$(Li,{tone:"error",title:"Invalid License",message:ce.isLocalDomain?ce.reason??"License has been revoked or has expired":"Failed to load. Please contact the site administrator."})});let mh=Xn?Ir(Xn.objectId):null,gh=mh?mt[mh]?.style?.material?.texture?.path:void 0,ly=Wn.current?.offsetWidth??600,cy=Wn.current?.offsetHeight??400,dy=350,uy=290,py=kn?Math.min(kn.screenX+12,ly-dy-8):0,hy=kn?Math.min(kn.screenY,cy-uy-8):0,my=U&&!!e&&!Lc&&(!Or||!mo||ho),Pa=dt&&(ki&&(Nc||Up)||Gp||!!Os),ka=w=>16+w*42;return ze("div",{className:"ri-viewer",style:{background:oe},children:[ze("div",{className:"ri-viewerLeft",ref:ha,children:[_?_({isOpen:nh,selectedObject:rh,currentAction:Ms,onClose:ih,onAction:Vs}):$(Fu,{isOpen:nh,selectedObject:rh,currentAction:Ms,onClose:ih,onAction:Vs,renderActionExtra:w=>w==="change-color"&&zn?$(Du,{inline:!0,colorPicker:zn,onClose:Yn,itemMaterials:Qr,setItemMaterials:co}):w==="change-material"&&Xn?$(Iu,{inline:!0,triggerFileUpload:ah,materialPopup:Xn,textureUrl:gh,clearTexture:sh}):null}),ze("div",{className:`ri-canvasArea ${Sa?"ri-canvasArea--measuring":""} ${mo?"":"ri-canvasArea--positioning"} ${qe?"ri-canvasArea--moveMode":""}`,ref:Ac,tabIndex:Re?0:void 0,onDoubleClick:ay,onPointerDown:w=>{Re&&Wn.current?.focus({preventScroll:!0}),W0(w)},onClick:$0,children:[_s&&!xa&&ze("div",{className:"ri-bindingsMismatchBanner",children:[$(Qu,{size:14,className:"ri-bindingsMismatchBanner__icon"}),$("span",{children:"Object bindings data don't match this model"}),$("button",{type:"button",className:"ri-bindingsMismatchBanner__dismiss",onClick:w=>{w.stopPropagation(),As(!0)},"aria-label":"Dismiss",children:$(Zu,{size:12})})]}),Rs!==null&&!Oc&&ze("div",{className:`ri-largeModelBanner ${_s&&!xa?"ri-largeModelBanner--offset":""}`,children:[$(Qu,{size:14,className:"ri-largeModelBanner__icon"}),ze("span",{children:["Very large model (",Math.round(Rs/1e6),"M triangles) \u2014 it may render and move slowly on this device, and click/hover selection on the model is disabled. Use the objects panel to select parts."]}),$("button",{type:"button",className:"ri-largeModelBanner__dismiss",onClick:w=>{w.stopPropagation(),Es(!0)},"aria-label":"Dismiss",children:$(Zu,{size:12})})]}),se.model.renderer==="uv-checker"&&Pi.missing>0&&ze("div",{className:"ri-uvCheckerBanner",role:"status",children:[$(Qu,{size:14,className:"ri-uvCheckerBanner__icon"}),ze("span",{children:[Pi.missing===Pi.total?"UV Checker: this model has no UV0 coordinates.":`UV Checker: ${Pi.missing} of ${Pi.total} meshes have no UV0 coordinates.`," ","Missing UVs are shown in magenta."]})]}),$("input",{ref:$t,type:"file",accept:"image/png,image/jpeg,image/webp",className:"ri-hiddenInput",onChange:ey}),ze(Sd,{camera:k,backgroundColor:I,shadows:A&&R.shadows.enabled,sceneConfig:se,selectedObjectRef:Vc,hoveredObjectRef:Q0,highlightOnHover:Ae,renderMode:_t,maxDpr:Le,reduceGpuLoad:ot,xrStore:ki,rendererCaptureRef:Rt,preserveDrawingBuffer:zt,children:[x??ze(Yi,{children:[$(kd,{lightingConfig:R.lighting,shadowConfig:R.shadows,shadowsEnabled:A,environmentRotation:R.environment.rotation,environmentConfig:R.environment,modelBounds:F0,objectBindings:mt,nodeRefs:Ye}),lr&&R.lighting.lights.map(w=>!w.visible||w.type==="none"||w.type==="hemisphere"||w.attachment?null:$(vb,{light:w,position:w.position,color:w.color,intensity:w.intensity,visible:w.visible,onPositionChange:D=>ry(w.id,D)},w.id))]}),$(Md,{controlsRef:be,onCameraChange:oy}),wt&&$(NT,{alignment:"top-right",margin:[80,80],renderPriority:2,onUpdate:()=>{be.current?.update(0),Rt.current?.invalidate()},children:$(IT,{axisColors:["#ff3653","#8adb00","#2c8fff"],labelColor:"white"})}),qe&&Vc&&pr&&$(Ju,{node:Vc,space:it,onTransformChange:Z0,onDraggingChange:w=>{st(w),Ma&&f?.(Ma,w)}},pr),$(Xs,{onLoadError:ph,children:$(DT,{fallback:null,children:(()=>{let w=ze(Yi,{children:[t?$(Cu,{url:t,rotation:se.model.rotation,errorTarget:n,cacheSize:i,decoderConfig:tt,objectBindings:mt,itemMaterials:Qr,sceneConfig:se,selectedItem:pr,panelHoveredItem:u??vi,highlightOnHover:Ae,onItemClick:lh,onItemHover:th,onObjectCatalog:ty,onTilesetBounds:ny,onModelLoaded:uh,onLoadError:ph,nodeRefsOut:Ye,onNodeRefsChange:xt,materialRefsOut:so,explodeFactor:me,suspendBindingTransforms:Ne}):$(Fd,{url:e,modelFormat:o,objectBindings:mt,selectedItem:pr,itemMaterials:Qr,onItemClick:lh,onItemHover:th,onModelLoaded:uh,onAnimationsReady:T,nodeRefsOut:Ye,onNodeRefsChange:xt,materialRefsOut:so,panelHoveredItem:u??vi,sceneConfig:se,zoomOnSelected:Ee,highlightOnHover:Ae,decoderConfig:tt,explodeFactor:me,suspendBindingTransforms:Ne}),$(Pu,{annotations:Sr,sceneConfig:R,activeAnnotation:wa,popupRef:St,canvasRootRef:Wn,worldPositionsRef:pt,modelLoaded:Or,onAnnotationClick:sy,onCloseAnnotation:ya,hideCloseButton:j,showAnnotationOnHover:we}),$(c2,{annotation:js,enabled:j,controlsRef:be,offsetRef:ue}),Fe&&$(_u,{controlsRef:be,sceneRef:hn,config:Fe,playing:Pn,resetOnPlay:_0,onFinished:()=>{Cr(!1),fo(!1)},onUserInteract:()=>{Cr(!1)}}),q&&$(ku,{points:Yp,unit:fe,box:Kp,showDimensions:Ic})]});return ki?$(Ff,{ref:A0,box:Kp,scaleMode:jt,onARStateChange:B0,children:w}):w})()})},t??e)]}),$(Jo,{visible:my,message:Bs}),Pa&&ze("div",{className:"ri-xrTools",style:{top:`${ka(0)}px`},children:[!Nc&&Gp&&ze("button",{type:"button",className:"ri-xrButton",onClick:L0,title:"View this model in AR with Apple Quick Look",children:[$(kb,{size:16}),"View in AR"]}),Os&&ze("button",{type:"button",className:"ri-xrButton",onClick:E0,title:"Open this experience on a phone for AR","aria-haspopup":"dialog","aria-expanded":Hp,children:[$(ZT,{size:16}),$("span",{children:"Open on phone"})]}),ki&&Nc&&ze("button",{type:"button",className:"ri-xrButton",onClick:()=>ki.enterAR().catch(w=>{console.error("Failed to enter AR session:",w)}),title:"View this model in your space",children:[$(Ab,{size:16}),$("span",{className:"ri-xrButtonPrefix",children:"Enter"}),$("span",{children:"AR"})]}),ki&&Up&&ze("button",{type:"button",className:"ri-xrButton",onClick:()=>ki.enterVR().catch(w=>{console.error("Failed to enter VR session:",w)}),title:"View this model in VR",children:[$(QT,{size:16}),$("span",{className:"ri-xrButtonPrefix",children:"Enter"}),$("span",{children:"VR"})]})]}),R0,Hp&&Os&&$("div",{className:"ri-mobileHandoffBackdrop",onMouseDown:w=>{w.target===w.currentTarget&&Wp()},children:ze("section",{className:"ri-mobileHandoffDialog",role:"dialog","aria-modal":"true","aria-labelledby":"ri-mobileHandoffTitle",children:[$("button",{type:"button",className:"ri-mobileHandoffClose",onClick:Wp,"aria-label":"Close phone handoff",children:$(Zu,{size:18})}),$(Ab,{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:$(VT,{value:Os,size:208,level:"M",marginSize:4,title:"QR code to open this model on a phone"})})]})}),Pe&&$("div",{className:"ri-uvCheckerTools",style:{top:`${ka(Pa?1:0)}px`},children:$("button",{type:"button",className:`ri-measureButton ${Y?"ri-measureButton--active":""}`,onClick:()=>H(w=>!(w??Z)),title:Y?"Disable UV checker":"Enable UV checker","aria-label":Y?"Disable UV checker":"Enable UV checker","aria-pressed":Y,children:$(o2,{size:16})})}),q&&ze("div",{className:"ri-measureTools",style:{top:`${ka((Pa?1:0)+(Pe?1:0))}px`},children:[$("button",{type:"button",className:`ri-measureButton ${Sa?"ri-measureButton--active":""}`,onClick:G0,title:Sa?"Stop measuring":"Measure distance","aria-pressed":Sa,children:$(r2,{size:16})}),$("button",{type:"button",className:`ri-measureButton ${Ic?"ri-measureButton--active":""}`,onClick:H0,title:"Toggle bounding dimensions","aria-pressed":Ic,children:$(i2,{size:16})}),Yp.length>0&&$("button",{type:"button",className:"ri-measureButton",onClick:U0,title:"Clear measurements",children:$(XT,{size:16})}),Sa&&$("span",{className:"ri-measureHint",children:"Click points on the model to measure"})]}),De&&ze("div",{className:"ri-explodeTools",style:{top:`${ka((Pa?1:0)+(Pe?1:0)+(q?1:0))}px`},children:[$("button",{type:"button",className:`ri-measureButton ${Mt||me>0?"ri-measureButton--active":""}`,onClick:()=>ht(w=>!w),title:"Exploded view","aria-pressed":Mt,children:$(e2,{size:16})}),Mt&&$("div",{className:"ri-explodeSlider",onPointerDown:w=>w.stopPropagation(),children:$("input",{type:"range",min:0,max:100,value:Math.round(me*100),onChange:w=>Ce(Number(w.target.value)/100),"aria-label":"Explode amount"})})]}),Fe&&ze("div",{className:"ri-cinematicTools",style:{top:`${ka((Pa?1:0)+(Pe?1:0)+(q?1:0)+(De?1:0))}px`},children:[$("button",{type:"button",className:`ri-measureButton ${Pn?"ri-measureButton--active":""}`,onClick:()=>{Pn?Cr(!1):(fo(!1),Cr(!0))},title:Pn?"Pause cinematic":"Play cinematic","aria-pressed":Pn,children:Pn?$(n2,{size:16}):$(t2,{size:16})}),Pn&&$("button",{type:"button",className:"ri-measureButton ri-measureButton--stop",onClick:iy,title:"Stop cinematic and reset camera",children:$(_b,{size:16})})]}),(G||L||pn&&Vt.length>0)&&ze("div",{className:"ri-buttonContainer",children:[$("div",{className:"ri-tourControls",children:pn&&Vt.length>0&&$(Yi,{children:j?ze(Yi,{children:[ze("button",{className:"ri-tourButton",onClick:N0,disabled:qp||Vt.length===0||qn<=0,title:"Previous annotation",children:[$(KT,{size:16}),$("span",{children:"Prev"})]}),$("button",{className:"ri-tourButton ri-tourButton--stop",onClick:z0,title:"Stop guided tour",children:$(_b,{size:16})}),ze("button",{className:"ri-tourButton ri-tourButton--next",onClick:I0,disabled:qp||Vt.length===0,title:"Next annotation",children:[$("span",{children:"Next"}),$(JT,{size:16})]})]}):$("button",{className:"ri-navButtonSingle",onClick:D0,disabled:Vt.length===0,title:"Start guided tour",children:"Guided Tour"})})}),ze("div",{className:"ri-rightControls",children:[G&&$("button",{className:"ri-resetButton",onClick:Gc,title:"Reset camera view",children:$(YT,{})}),L&&ze("div",{className:"ri-downloadWrapper",onPointerDown:w=>w.stopPropagation(),children:[X0&&ze("div",{className:"ri-downloadMenu",children:[ze("button",{className:"ri-downloadMenuItem",onClick:Y0,disabled:zc||!hn.current,children:[$(kb,{size:14}),"Download GLB"]}),$("div",{className:"ri-downloadMenuDivider"}),zt&&ze(Yi,{children:[ze("button",{className:"ri-downloadMenuItem",onClick:K0,disabled:!hn.current,children:[$(WT,{size:14}),"Download PNG"]}),$("div",{className:"ri-downloadMenuDivider"})]}),ze("button",{className:"ri-downloadMenuItem",onClick:J0,disabled:!hn.current,children:[$(qT,{size:14}),"Download UV Layout"]}),Qp&&$("div",{className:"ri-downloadMenuNotice",role:"status","aria-live":"polite",children:Qp})]}),$("button",{className:"ri-downloadButton",onClick:q0,disabled:zc||!hn.current,title:"Download options",children:zc?ze(Yi,{children:[$("span",{className:"ri-downloadButton__spinner"}),"Exporting\u2026"]}):ze(Yi,{children:[$($T,{size:15}),"Download"]})})]})]})]}),kn&&ze("div",{className:"ri-annotationPopup",style:{left:py,top:hy},onPointerDown:w=>w.stopPropagation(),onClick:w=>w.stopPropagation(),children:[$("input",{autoFocus:!0,className:"ri-annotationInput",placeholder:"Title *",value:ei.title,onChange:w=>Ns(D=>({...D,title:w.target.value})),onKeyDown:w=>{w.key==="Enter"&&hh(),w.key==="Escape"&&Hc()}}),$("textarea",{className:"ri-annotationTextarea",placeholder:"Description",value:ei.description,onChange:w=>Ns(D=>({...D,description:w.target.value})),onKeyDown:w=>{w.key==="Escape"&&Hc()},rows:5}),ze("div",{className:"ri-annotationActions",children:[$("button",{onClick:hh,className:`ri-annotationOkBtn ${ei.title.trim()?"":"disabled"}`,disabled:!ei.title.trim(),children:"OK"}),$("button",{onClick:Hc,className:"ri-annotationCancelBtn",children:"Cancel"}),$("div",{className:"ri-annotationIcons"})]})]})]}),_&&zn&&$(Du,{colorPicker:zn,onClose:Yn,itemMaterials:Qr,setItemMaterials:co}),_&&Xn&&$(Iu,{triggerFileUpload:ah,materialPopup:Xn,textureUrl:gh,clearTexture:sh})]}),F&&$("div",{className:"ri-viewerRight",children:V?V({objectBindings:mt,onAction:Vs,onFocus:ch,onHover:In}):$(Uu,{objectBindings:mt,onAction:Vs,onFocus:ch,onHover:In})}),ae&&$(Qf,{controlsRef:be,enabled:!0,opacity:le,moveSensitivity:ge,position:xe})]})}import{useCallback as nn,useEffect as ao,useMemo as _p,useRef as yn,useState as et}from"react";import{Redo2 as n0,Undo2 as r0,Upload as i0,ListRestart as o0,X as ik,AlertTriangle as ok}from"lucide-react";import{useCallback as Bn,useRef as oa,useState as Eb}from"react";import{Vector3 as Lb}from"three";function Bb(e){return[e.x,e.y,e.z]}function mi(e,t){let n=new Lb,i=new Lb;return t.getPosition(n),t.getTarget(i),{position:Bb(n),target:Bb(i),fov:"fov"in e&&typeof e.fov=="number"?e.fov:null,zoom:"zoom"in e&&typeof e.zoom=="number"?e.zoom:1,azimuthAngle:t.azimuthAngle,polarAngle:t.polarAngle}}function p2(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 gs(e,t,n=.6){let i=e.smoothTime;e.smoothTime=n;try{return await t()}finally{e.smoothTime=i}}function ep(e={}){let t=oa(e);t.current=e;let n=oa(null),[i,r]=Eb(null),[o,a]=Eb(()=>({...e.presets})),l=oa(o);l.current=o;let s=Bn(C=>{r(x=>p2(x,C)?x:C)},[]),d=Bn((C,x)=>{s(mi(C,x))},[s]),u=oa(null),c=oa(null),p=oa(null),g=Bn(C=>{n.current=C;let x=mi(C.controls.camera,C.controls);s(x),C.scene!==c.current&&(c.current=C.scene,u.current=null,p.current=null),C.homeCameraState&&!u.current&&(u.current=C.homeCameraState);let{initialPosition:k,initialTarget:I,initialTransition:A=!1}=t.current;if((k||I)&&C.scene&&(k||C.homeCameraState)&&p.current!==C.controls){p.current=C.controls,C.homeCameraState||Qo(C.controls);let z=k??x.position,_=I??x.target;C.controls.setLookAt(z[0],z[1],z[2],_[0],_[1],_[2],A).then(()=>{if(n.current?.controls!==C.controls)return;let V=mi(C.controls.camera,C.controls);u.current={position:V.position,target:V.target},s(V)}).catch(()=>{})}},[s]),f=Bn(async()=>{let C=n.current,x=C?.controls;if(!x)return!1;try{let k=u.current;return k?await gs(x,()=>x.setLookAt(k.position[0],k.position[1],k.position[2],k.target[0],k.target[1],k.target[2],!0)):C?.scene?await gs(x,()=>x.fitToBox(C.scene,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5})):await gs(x,()=>x.reset(!0)),!0}catch{return!1}},[]),v=Bn(async()=>{let C=n.current;if(!C?.controls||!C.scene)return!1;try{return await gs(C.controls,()=>C.controls.fitToBox(C.scene,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5})),!0}catch{return!1}},[]),P=Bn(async C=>{let x=n.current;if(!x?.controls)return!1;let k=mn(x.objectBindings,C);if(!k)return!1;let I=x.nodeRefs[k];if(!I)return!1;try{return await gs(x.controls,()=>x.controls.fitToBox(I,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5})),!0}catch{return!1}},[]),y=Bn(async(C,x=!0)=>{let k=n.current?.controls;if(!k)return!1;try{return n.current?.homeCameraState||Qo(k),await k.setTarget(C[0],C[1],C[2],x),s(mi(k.camera,k)),!0}catch{return!1}},[s]),h=Bn(async(C,x=!0)=>{let k=n.current?.controls;if(!k)return!1;try{n.current?.homeCameraState||Qo(k);let I=[k.setLookAt(C.position[0],C.position[1],C.position[2],C.target[0],C.target[1],C.target[2],x)];C.azimuthAngle!=null&&C.polarAngle!=null&&I.push(k.rotateTo(C.azimuthAngle,C.polarAngle,x)),await Promise.all(I);let A=k.camera,z=!1;return C.fov!=null&&"fov"in A&&typeof A.fov=="number"&&(A.fov=C.fov,z=!0),C.zoom!=null&&"zoom"in A&&typeof A.zoom=="number"&&(A.zoom=C.zoom,z=!0),z&&"updateProjectionMatrix"in A&&A.updateProjectionMatrix(),s(mi(A,k)),!0}catch{return!1}},[s]),m=Bn((C,x=!0)=>h(C,x),[h]),S=Bn((C,x,k=!0)=>h({position:C,target:x},k),[h]),M=Bn(async(C,x,k=!0)=>{let I=n.current?.controls;if(!I)return!1;try{return n.current?.homeCameraState||Qo(I),await I.rotateTo(C,x,k),s(mi(I.camera,I)),!0}catch{return!1}},[s]),T=Bn(async(C,x=!0)=>{let k=n.current?.controls;if(!k)return!1;try{return n.current?.homeCameraState||Qo(k),await k.dollyTo(C,x),s(mi(k.camera,k)),!0}catch{return!1}},[s]),E=Bn(C=>{let x=n.current?.controls,k=C.trim();if(!x||!k)return null;let I=mi(x.camera,x);return l.current={...l.current,[k]:I},a(A=>({...A,[k]:I})),s(I),I},[s]),b=Bn((C,x=!0)=>{let k=l.current[C];return k?h(k,x):Promise.resolve(!1)},[h]);return{cameraState:i,cameraPresets:o,resetView:f,focusObject:P,fitScene:v,setCameraTarget:y,setCameraState:m,lookAt:S,orbitTo:M,dollyTo:T,savePreset:E,goToPreset:b,handleCameraChange:d,handleViewerReady:g}}import{useCallback as aa,useEffect as h2,useRef as Ob,useState as Ki}from"react";function tp(){let e=Ob(null),[t,n]=Ki([]),i=Ob(null),[r,o]=Ki([]),[a,l]=Ki(null),[s,d]=Ki(!1),[u,c]=Ki(1),[p,g]=Ki(0),[f,v]=Ki(0);h2(()=>()=>{i.current?.()},[]);let P=aa(T=>{i.current?.(),e.current=T,n(T.clips),o(T.clipDetails??T.clips.map(b=>({sourceName:b,duration:0})));let E=T.getState?.()??{currentClip:null,isPlaying:!1,speed:1,time:0,duration:0};l(E.currentClip),d(E.isPlaying),c(E.speed),g(E.time),v(E.duration),T.subscribe?i.current=T.subscribe(b=>{l(b.currentClip),d(b.isPlaying),c(b.speed),g(b.time),v(b.duration)}):i.current=null},[]),y=aa(T=>{e.current?.play(T),l(T),d(!0)},[]),h=aa(()=>{e.current?.pause(),d(!1)},[]),m=aa(()=>{e.current?.stop(),l(null),d(!1),g(0)},[]),S=aa(T=>{e.current?.setSpeed(T),c(T)},[]),M=aa(T=>{e.current?.seek?.(T),g(T)},[]);return{clips:t,clipDetails:r,currentClip:a,isPlaying:s,speed:u,time:p,duration:f,play:y,pause:h,stop:m,setSpeed:S,seek:M,handleAnimationsReady:P}}import{useState as dP,useEffect as uP}from"react";import{useState as M2}from"react";import{ChevronDown as T2,ChevronLeft as P2,ChevronRight as k2,RotateCcw as _2}from"lucide-react";import{HexColorInput as A2,HexColorPicker as R2}from"react-colorful";import{useLayoutEffect as g2,useRef as Nb,useState as Ib}from"react";import{createPortal as f2}from"react-dom";import{ChevronDown as b2,Info as x2}from"lucide-react";import{HexColorInput as y2,HexColorPicker as v2}from"react-colorful";function sa(e){let t=e.replace("#","").match(/.{2}/g).map(i=>parseInt(i,16)/255).map(i=>i<=.03928?i/12.92:Math.pow((i+.055)/1.055,2.4));return .2126*t[0]+.7152*t[1]+.0722*t[2]>.179?"#000":"#fff"}import{useEffect as m2}from"react";function Db(e,t,n){m2(()=>{if(!n)return;let i=Array.isArray(e)?e:[e],r=o=>{let a=o.target;i.some(s=>s.current?.contains(a))||t()};return document.addEventListener("pointerdown",r,!0),()=>{document.removeEventListener("pointerdown",r,!0)}},[e,t,n])}import{jsx as Je,jsxs as Sn}from"react/jsx-runtime";function np({anchorRef:e,onClose:t,children:n}){let i=Nb(null),[r,o]=Ib(null);return Db([i,e],t,!0),g2(()=>{let a=e.current;if(!a)return;let l=a.getBoundingClientRect(),s=222,d=8,u=Math.min(Math.max(l.right-s,d),window.innerWidth-s-d),c=Math.min(l.bottom+6,window.innerHeight-200);o({top:c,left:u})},[e]),r?f2(Je("div",{ref:i,className:"se-colorPickerPopover",style:{position:"fixed",top:r.top,left:r.left},children:n}),document.body):null}function w2(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 Ji({title:e,children:t}){return Sn("section",{className:"se-section",children:[Je("h3",{className:"se-sectionTitle",children:e}),Je("div",{className:"se-sectionBody",children:t})]})}function We({title:e,open:t,onToggle:n,trailing:i,children:r,disabled:o,tooltip:a}){let l=a?`${a}`: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:[Je(b2,{size:16,className:`se-panelChevron ${t?"se-panelChevron--open":""}`}),Je("span",{className:"se-panelTitle",children:e}),a?Je("span",{className:"se-panelHelp",title:l,"aria-label":l,role:"img",onClick:s=>s.stopPropagation(),children:Je(x2,{size:13})}):null]}),i?Je("span",{className:"se-panelTrailing",onClick:s=>s.stopPropagation(),children:i}):null]}),t?Je("div",{className:"se-panelBody",style:o?{opacity:.45,pointerEvents:"none"}:void 0,children:r}):null]})}function Ze({checked:e,onChange:t,label:n}){return Sn("label",{className:"se-switch","aria-label":n,children:[Je("input",{type:"checkbox",checked:e,onChange:i=>t(i.target.checked)}),Je("span",{className:"se-switchTrack",children:Je("span",{className:"se-switchThumb"})})]})}function W({label:e,value:t,min:n,max:i,step:r,formatValue:o,onChange:a,disabled:l=!1}){return Sn("label",{className:`se-field ${l?"se-field--disabled":""}`,children:[Sn("span",{className:"se-fieldLabel",children:[e,Je("span",{className:"se-fieldValue",children:o?o(t):t})]}),Je("input",{className:"se-slider",type:"range",min:n,max:i,step:r,value:t,onChange:s=>a(Number(s.target.value)),disabled:l})]})}function rt({label:e,checked:t,onChange:n}){return Sn("label",{className:"se-field se-fieldInline",children:[Je("span",{className:"se-fieldLabel",children:e}),Je("input",{type:"checkbox",className:"se-checkbox",checked:t,onChange:i=>n(i.target.checked)})]})}function Fn({label:e,value:t,options:n,onChange:i}){return Sn("label",{className:"se-field se-fieldInline",children:[Je("span",{className:"se-fieldLabel",children:e}),Je("select",{className:"se-select",value:t,onChange:r=>i(r.target.value),children:n.map(r=>Je("option",{value:r,children:w2(r)},r))})]})}function tr({label:e,value:t,onChange:n}){let[i,r]=Ib(!1),o=Nb(null);return Sn("div",{className:"se-field",children:[Sn("div",{className:"se-fieldInline",children:[Je("span",{className:"se-fieldLabel",children:e}),Je("span",{ref:o,style:{display:"inline-flex"},children:Je(y2,{prefixed:!0,className:"se-swatch",onClick:()=>r(a=>!a),style:{background:t,color:sa(t)},color:t,onChange:n})})]}),i?Je(np,{anchorRef:o,onClose:()=>r(!1),children:Je(v2,{color:t,onChange:n})}):null]})}function gi({label:e,value:t,min:n,max:i,step:r,onChange:o}){return Sn("div",{className:"se-field",children:[Je("span",{className:"se-fieldLabel",children:e}),Je("div",{className:"se-vectorRow",children:["X","Y","Z"].map((l,s)=>Sn("label",{className:"se-vectorAxis",children:[Je("span",{children:l}),Je("input",{type:"number",className:"se-numberInput",min:n,max:i,step:r,value:t[s],onChange:d=>{let u=[...t];u[s]=Number(d.target.value),o(u)}})]},l))})]})}function Qi({label:e,value:t,min:n,max:i,step:r,onChange:o}){return Sn("div",{className:"se-field",children:[Je("span",{className:"se-fieldLabel",children:e}),Je("div",{className:"se-vectorRow",children:["X","Y"].map((l,s)=>Sn("label",{className:"se-vectorAxis",children:[Je("span",{children:l}),Je("input",{type:"number",className:"se-numberInput",min:n,max:i,step:r,value:t[s],onChange:d=>{let u=[...t];u[s]=Number(d.target.value),o(u)}})]},l))})]})}var zb={free:0,starter:1,growth:2};function jb(e){return e==="starter"||e==="growth"||e==="scale"?e==="scale"?"growth":e:"free"}function Jr(e,t){return zb[e]>=zb[t]}var Vb={free:"Free",starter:"Starter",growth:"Growth"};import{Lock as C2}from"lucide-react";import{jsx as S2,jsxs as Fb}from"react/jsx-runtime";function On({requiredTier:e,feature:t}){return Fb("div",{className:"bb-tierLock",children:[S2(C2,{size:16}),Fb("p",{className:"bb-tierLockMessage",children:[t," requires the ",Vb[e]," plan or higher."]})]})}import{Fragment as rp,jsx as he,jsxs as qt}from"react/jsx-runtime";var E2=["lit","unlit","normals"],L2=["color","image","environment"];function Ub(e){let t=e%360;return t<0?t+360:t}function mc({title:e,open:t,onToggle:n,children:i,trailing:r}){return qt("section",{className:"se-panel",children:[qt("button",{type:"button",className:"se-panelHeader",onClick:n,"aria-expanded":t,children:[qt("span",{className:"se-panelHeaderMain",children:[he(T2,{size:16,className:`se-panelChevron ${t?"se-panelChevron--open":""}`}),he("span",{className:"se-panelTitle",children:e})]}),r?he("span",{className:"se-panelTrailing",onClick:o=>o.stopPropagation(),children:r}):null]}),t?he("div",{className:"se-panelBody",children:i}):null]})}function ip({config:e,onChange:t}){let{model:n,camera:i,wireframe:r,background:o,environment:a}=e,{tier:l}=er(),s=Jr(l,"starter"),[d,u]=M2({general:!0,camera:!0,wireframe:!1,background:!1}),c=h=>u(m=>({...m,[h]:!m[h]})),p=h=>t({...e,model:h}),g=h=>t({...e,camera:h}),f=h=>t({...e,wireframe:h}),v=h=>t({...e,background:h}),P=h=>t({...e,environment:h}),y=h=>{P({...a,source:"preset",preset:h})};return qt("div",{className:"se-generalContent",children:[qt(mc,{title:"General",open:d.general,onToggle:()=>c("general"),children:[qt("div",{className:"se-field",children:[qt("div",{className:"se-fieldLabel",children:[he("span",{children:"Straighten model"}),he("button",{type:"button",className:"se-iconButton",onClick:()=>p({...n,rotation:[0,0,0]}),"aria-label":"Reset model rotation",children:he(_2,{size:16})})]}),he("div",{className:"se-axisStepperGrid",children:["X","Y","Z"].map((h,m)=>qt("div",{className:"se-axisStepper",children:[he("button",{type:"button",className:"se-axisStepperButton",onClick:()=>{let S=[...n.rotation];S[m]=Ub(S[m]-90),p({...n,rotation:S})},"aria-label":`Rotate ${h} axis backward`,children:he(P2,{size:16})}),he("span",{className:"se-axisStepperLabel",children:h}),he("button",{type:"button",className:"se-axisStepperButton",onClick:()=>{let S=[...n.rotation];S[m]=Ub(S[m]+90),p({...n,rotation:S})},"aria-label":`Rotate ${h} axis forward`,children:he(k2,{size:16})})]},h))})]}),he(gi,{label:"Rotation",value:n.rotation,min:0,max:360,step:1,onChange:h=>p({...n,rotation:h})}),qt("div",{className:"se-field",children:[he("span",{className:"se-fieldLabel",children:"Renderer"}),he("div",{className:"se-segmentedControl se-segmentedControl--renderer",children:xh.map(h=>he("button",{type:"button",className:`se-segmentedOption ${n.renderer===h?"se-segmentedOption--active":""}`,onClick:()=>p({...n,renderer:h}),children:h==="uv-checker"?"UV CHECKER":h.toUpperCase()},h))})]}),he(Fn,{label:"Shading",value:n.shading,options:E2,onChange:h=>p({...n,shading:h})})]}),he(mc,{title:"Camera",open:d.camera,onToggle:()=>c("camera"),children:he(W,{label:"Field Of View",value:i.fieldOfView,min:20,max:100,step:.1,formatValue:h=>`${h.toFixed(3)}\xB0`,onChange:h=>g({...i,fieldOfView:h})})}),he(mc,{title:"Wireframe",open:d.wireframe,onToggle:()=>c("wireframe"),trailing:qt("label",{className:"se-switch","aria-label":"Toggle wireframe preview",children:[he("input",{type:"checkbox",checked:s&&r.enabled,disabled:!s,onChange:h=>f({...r,enabled:h.target.checked})}),he("span",{className:"se-switchTrack",children:he("span",{className:"se-switchThumb"})})]}),children:s?qt(rp,{children:[he(W,{label:"Opacity",value:r.opacity,min:0,max:1,step:.01,onChange:h=>f({...r,opacity:h})}),he(tr,{label:"Wire color",value:r.color,onChange:h=>f({...r,color:h})})]}):he(On,{requiredTier:"starter",feature:"Wireframe preview"})}),he(mc,{title:"Background",open:d.background,onToggle:()=>c("background"),trailing:qt("label",{className:"se-switch","aria-label":"Toggle scene background",children:[he("input",{type:"checkbox",checked:o.enabled,onChange:h=>v({...o,enabled:h.target.checked})}),he("span",{className:"se-switchTrack",children:he("span",{className:"se-switchThumb"})})]}),children:o.enabled?qt(rp,{children:[qt("div",{className:"se-field",children:[he("span",{className:"se-fieldLabel",children:"Background type"}),he("div",{className:"se-segmentedControl",children:L2.map(h=>he("button",{type:"button",className:`se-segmentedOption ${o.type===h?"se-segmentedOption--active":""}`,onClick:()=>v({...o,type:h}),children:h},h))})]}),o.type==="environment"?s?qt(rp,{children:[qt("div",{className:"se-field",children:[he("span",{className:"se-fieldLabel",children:"Environment source"}),qt("div",{className:"se-segmentedControl",children:[he("button",{type:"button",className:`se-segmentedOption ${a.source==="preset"?"se-segmentedOption--active":""}`,onClick:()=>P({...a,source:"preset"}),children:"PRESET"}),he("button",{type:"button",className:`se-segmentedOption ${a.source==="custom"?"se-segmentedOption--active":""}`,onClick:()=>P({...a,source:"custom"}),children:"CUSTOM"})]})]}),a.source==="preset"?he(Fn,{label:"Environment preset",value:a.preset,options:yh,onChange:y}):qt("label",{className:"se-field",children:[he("span",{className:"se-fieldLabel",children:"Custom environment URL"}),he("input",{type:"text",className:"se-textInput",placeholder:"https://example.com/environment.hdr",value:a.customEnvironmentUrl,onChange:h=>P({...a,customEnvironmentUrl:h.target.value})}),he("span",{className:"bb-note",children:"Enter a HDR, EXR, JPG, JPEG, PNG, or WEBP URL."}),a.customEnvironmentUrl.trim()&&!Us(a.customEnvironmentUrl)?he("span",{className:"bb-note",style:{color:"#fca5a5"},children:"Invalid image/HDRI URL."}):null]}),he(W,{label:"Environment intensity",value:a.intensity,min:0,max:3,step:.05,onChange:h=>P({...a,intensity:h})})]}):he(On,{requiredTier:"starter",feature:"Environment backgrounds"}):null,o.type==="image"?qt("label",{className:"se-field",children:[he("span",{className:"se-fieldLabel",children:"Background image URL"}),he("input",{type:"text",className:"se-textInput",placeholder:"https://example.com/background.jpg",value:o.imageUrl,onChange:h=>v({...o,imageUrl:h.target.value})})]}):null,o.type==="color"?qt("div",{className:"se-field",children:[he("span",{className:"se-fieldLabel",children:"Background color"}),he("div",{className:"se-inlineColorPicker",children:he(R2,{color:o.color,onChange:h=>v({...o,color:h})})}),he("div",{className:"se-fieldInline",children:he(A2,{prefixed:!0,className:"se-swatch",style:{background:o.color,color:sa(o.color)},color:o.color,onChange:h=>v({...o,color:h})})})]}):null]}):he("div",{className:"se-placeholder",children:"Background rendering is disabled for this scene preset."})})]})}import{useState as O2}from"react";import{jsx as pe,jsxs as fs}from"react/jsx-runtime";function Gb({pp:e,set:t,open:n,toggle:i}){let{ssao:r}=e;return fs(We,{title:"SSAO",tooltip:"Adds soft contact shadows in corners, creases, and tight spaces.",open:n.ssao,onToggle:()=>i("ssao"),disabled:!r.enabled,trailing:pe(Ze,{checked:r.enabled,onChange:o=>t("ssao",{...r,enabled:o}),label:"Toggle SSAO"}),children:[pe(W,{label:"Samples",value:r.samples,min:1,max:64,step:1,onChange:o=>t("ssao",{...r,samples:o})}),pe(W,{label:"Rings",value:r.rings,min:1,max:12,step:1,onChange:o=>t("ssao",{...r,rings:o})}),pe(W,{label:"Intensity",value:r.intensity,min:0,max:20,step:.5,onChange:o=>t("ssao",{...r,intensity:o})}),pe(W,{label:"Radius",value:r.radius,min:.01,max:1,step:.01,onChange:o=>t("ssao",{...r,radius:o})}),pe(W,{label:"Bias",value:r.bias,min:0,max:.1,step:.001,onChange:o=>t("ssao",{...r,bias:o})}),pe(W,{label:"Luminance Influence",value:r.luminanceInfluence,min:0,max:1,step:.01,onChange:o=>t("ssao",{...r,luminanceInfluence:o})}),pe(W,{label:"Fade",value:r.fade,min:0,max:.1,step:.001,onChange:o=>t("ssao",{...r,fade:o})}),pe(W,{label:"Min Radius Scale",value:r.minRadiusScale,min:0,max:1,step:.01,onChange:o=>t("ssao",{...r,minRadiusScale:o})}),pe(W,{label:"World Distance Threshold",value:r.worldDistanceThreshold,min:0,max:100,step:.1,onChange:o=>t("ssao",{...r,worldDistanceThreshold:o})}),pe(W,{label:"World Distance Falloff",value:r.worldDistanceFalloff,min:0,max:20,step:.1,onChange:o=>t("ssao",{...r,worldDistanceFalloff:o})}),pe(W,{label:"World Proximity Threshold",value:r.worldProximityThreshold,min:0,max:100,step:.1,onChange:o=>t("ssao",{...r,worldProximityThreshold:o})}),pe(W,{label:"World Proximity Falloff",value:r.worldProximityFalloff,min:0,max:20,step:.1,onChange:o=>t("ssao",{...r,worldProximityFalloff:o})})]})}function Hb({pp:e,set:t,open:n,toggle:i}){let{autofocus:r}=e;return fs(We,{title:"Auto focus",tooltip:"Keeps the focus plane tracking a subject so the image stays sharp where you want it.",open:n.autofocus,onToggle:()=>i("autofocus"),disabled:!r.enabled,trailing:pe(Ze,{checked:r.enabled,onChange:o=>t("autofocus",{...r,enabled:o}),label:"Toggle Autofocus"}),children:[pe(W,{label:"Focus Distance",value:r.focusDistance,min:0,max:50,step:.1,onChange:o=>t("autofocus",{...r,focusDistance:o})}),pe(W,{label:"Focus Range",value:r.focusRange,min:.1,max:50,step:.1,onChange:o=>t("autofocus",{...r,focusRange:o})}),pe(W,{label:"Focal Length",value:r.focalLength,min:0,max:1,step:.01,onChange:o=>t("autofocus",{...r,focalLength:o})}),pe(W,{label:"Bokeh Scale",value:r.bokehScale,min:0,max:20,step:.1,onChange:o=>t("autofocus",{...r,bokehScale:o})}),pe(gi,{label:"Target",value:r.target,min:-100,max:100,step:.1,onChange:o=>t("autofocus",{...r,target:o})}),pe(rt,{label:"Mouse Follow",checked:r.mouse,onChange:o=>t("autofocus",{...r,mouse:o})}),pe(rt,{label:"Manual Update",checked:r.manual,onChange:o=>t("autofocus",{...r,manual:o})}),pe(W,{label:"Debug",value:r.debug,min:0,max:1,step:.01,onChange:o=>t("autofocus",{...r,debug:o})}),pe(W,{label:"Smooth Time",value:r.smoothTime,min:0,max:2,step:.01,onChange:o=>t("autofocus",{...r,smoothTime:o})})]})}function Wb({pp:e,set:t,open:n,toggle:i}){let{godRays:r}=e;return fs(We,{title:"God Rays",tooltip:"Creates light shafts that streak outward from a bright sun or light source.",open:n.godRays,onToggle:()=>i("godRays"),disabled:!r.enabled,trailing:pe(Ze,{checked:r.enabled,onChange:o=>t("godRays",{...r,enabled:o}),label:"Toggle GodRays"}),children:[pe(gi,{label:"Sun Position",value:r.sunPosition,min:-100,max:100,step:.1,onChange:o=>t("godRays",{...r,sunPosition:o})}),pe(W,{label:"Samples",value:r.samples,min:1,max:128,step:1,onChange:o=>t("godRays",{...r,samples:o})}),pe(W,{label:"Density",value:r.density,min:0,max:2,step:.01,onChange:o=>t("godRays",{...r,density:o})}),pe(W,{label:"Decay",value:r.decay,min:0,max:1,step:.01,onChange:o=>t("godRays",{...r,decay:o})}),pe(W,{label:"Weight",value:r.weight,min:0,max:2,step:.01,onChange:o=>t("godRays",{...r,weight:o})}),pe(W,{label:"Exposure",value:r.exposure,min:0,max:2,step:.01,onChange:o=>t("godRays",{...r,exposure:o})}),pe(W,{label:"Clamp Max",value:r.clampMax,min:0,max:2,step:.01,onChange:o=>t("godRays",{...r,clampMax:o})}),pe(rt,{label:"Blur",checked:r.blur,onChange:o=>t("godRays",{...r,blur:o})}),pe(Fn,{label:"Kernel Size",value:r.kernelSize,options:_a,onChange:o=>t("godRays",{...r,kernelSize:o})})]})}function $b({pp:e,set:t,open:n,toggle:i}){let{lensflare:r}=e;return fs(We,{title:"Lens Flare",tooltip:"Adds camera flare artifacts and glow from a bright light source.",open:n.lensflare,onToggle:()=>i("lensflare"),disabled:!r.enabled,trailing:pe(Ze,{checked:r.enabled,onChange:o=>t("lensflare",{...r,enabled:o}),label:"Toggle Lensflare"}),children:[pe(gi,{label:"Lens Position",value:r.lensPosition,min:-100,max:100,step:.1,onChange:o=>t("lensflare",{...r,lensPosition:o})}),pe(W,{label:"Smooth Time",value:r.smoothTime,min:0,max:1,step:.01,onChange:o=>t("lensflare",{...r,smoothTime:o})}),pe(W,{label:"Glare Size",value:r.glareSize,min:0,max:1,step:.01,onChange:o=>t("lensflare",{...r,glareSize:o})}),pe(W,{label:"Flare Size",value:r.flareSize,min:0,max:.1,step:.001,onChange:o=>t("lensflare",{...r,flareSize:o})}),pe(W,{label:"Flare Speed",value:r.flareSpeed,min:0,max:.2,step:.001,onChange:o=>t("lensflare",{...r,flareSpeed:o})}),pe(W,{label:"Flare Shape",value:r.flareShape,min:0,max:.2,step:.001,onChange:o=>t("lensflare",{...r,flareShape:o})}),pe(rt,{label:"Animated",checked:r.animated,onChange:o=>t("lensflare",{...r,animated:o})}),pe(rt,{label:"Anamorphic",checked:r.anamorphic,onChange:o=>t("lensflare",{...r,anamorphic:o})}),pe(tr,{label:"Color Gain",value:r.colorGain,onChange:o=>t("lensflare",{...r,colorGain:o})}),pe(W,{label:"Halo Scale",value:r.haloScale,min:0,max:2,step:.01,onChange:o=>t("lensflare",{...r,haloScale:o})}),pe(rt,{label:"Secondary Ghosts",checked:r.secondaryGhosts,onChange:o=>t("lensflare",{...r,secondaryGhosts:o})}),pe(rt,{label:"Additional Streaks",checked:r.aditionalStreaks,onChange:o=>t("lensflare",{...r,aditionalStreaks:o})}),pe(W,{label:"Ghost Scale",value:r.ghostScale,min:0,max:1,step:.01,onChange:o=>t("lensflare",{...r,ghostScale:o})}),pe(W,{label:"Opacity",value:r.opacity,min:0,max:1,step:.01,onChange:o=>t("lensflare",{...r,opacity:o})}),pe(rt,{label:"Star Burst",checked:r.starBurst,onChange:o=>t("lensflare",{...r,starBurst:o})})]})}function Xb({pp:e,set:t,open:n,toggle:i}){let{depthOfField:r}=e;return fs(We,{title:"Depth Of Field",tooltip:"Blurs areas that sit away from the focal plane for a camera-like look.",open:n.depthOfField,onToggle:()=>i("depthOfField"),disabled:!r.enabled,trailing:pe(Ze,{checked:r.enabled,onChange:o=>t("depthOfField",{...r,enabled:o}),label:"Toggle DepthOfField"}),children:[pe(W,{label:"Focus Distance",value:r.focusDistance,min:0,max:50,step:.1,onChange:o=>t("depthOfField",{...r,focusDistance:o})}),pe(W,{label:"Focus Range",value:r.focusRange,min:.1,max:50,step:.1,onChange:o=>t("depthOfField",{...r,focusRange:o})}),pe(W,{label:"Focal Length",value:r.focalLength,min:0,max:1,step:.01,onChange:o=>t("depthOfField",{...r,focalLength:o})}),pe(W,{label:"Bokeh Scale",value:r.bokehScale,min:0,max:20,step:.1,onChange:o=>t("depthOfField",{...r,bokehScale:o})})]})}import{jsx as Ge,jsxs as la}from"react/jsx-runtime";var B2=["linear","reinhard","aces"];function qb({pp:e,set:t,open:n,toggle:i}){let{colorAverage:r}=e;return Ge(We,{title:"Color Average",tooltip:"Blends the frame toward a single average color for a washed-out stylized look.",open:n.colorAverage,onToggle:()=>i("colorAverage"),disabled:!r.enabled,trailing:Ge(Ze,{checked:r.enabled,onChange:o=>t("colorAverage",{...r,enabled:o}),label:"Toggle ColorAverage"}),children:Ge("div",{className:"se-placeholder",children:"Averages the frame color using the docs default blend mode."})})}function Yb({pp:e,set:t,open:n,toggle:i}){let{brightnessContrast:r}=e;return la(We,{title:"Brightness Contrast",tooltip:"Raises or lowers overall brightness and contrast across the scene.",open:n.brightnessContrast,onToggle:()=>i("brightnessContrast"),disabled:!r.enabled,trailing:Ge(Ze,{checked:r.enabled,onChange:o=>t("brightnessContrast",{...r,enabled:o}),label:"Toggle BrightnessContrast"}),children:[Ge(W,{label:"Brightness",value:r.brightness,min:-1,max:1,step:.01,onChange:o=>t("brightnessContrast",{...r,brightness:o})}),Ge(W,{label:"Contrast",value:r.contrast,min:-1,max:1,step:.01,onChange:o=>t("brightnessContrast",{...r,contrast:o})})]})}function Kb({pp:e,set:t,open:n,toggle:i}){let{hueSaturation:r}=e;return la(We,{title:"Hue Saturation",tooltip:"Shifts the hue and saturation to tint the whole image.",open:n.hueSaturation,onToggle:()=>i("hueSaturation"),disabled:!r.enabled,trailing:Ge(Ze,{checked:r.enabled,onChange:o=>t("hueSaturation",{...r,enabled:o}),label:"Toggle HueSaturation"}),children:[Ge(W,{label:"Hue",value:r.hue,min:-Math.PI,max:Math.PI,step:.01,formatValue:o=>`${o.toFixed(2)} rad`,onChange:o=>t("hueSaturation",{...r,hue:o})}),Ge(W,{label:"Saturation",value:r.saturation,min:-1,max:1,step:.01,onChange:o=>t("hueSaturation",{...r,saturation:o})})]})}function Jb({pp:e,set:t,open:n,toggle:i}){let{vignette:r}=e;return la(We,{title:"Vignette",tooltip:"Darkens the edges of the screen so the center feels more focused.",open:n.vignette,onToggle:()=>i("vignette"),disabled:!r.enabled,trailing:Ge(Ze,{checked:r.enabled,onChange:o=>t("vignette",{...r,enabled:o}),label:"Toggle Vignette"}),children:[Ge(W,{label:"Offset",value:r.offset,min:0,max:1,step:.01,onChange:o=>t("vignette",{...r,offset:o})}),Ge(W,{label:"Darkness",value:r.darkness,min:0,max:1,step:.01,onChange:o=>t("vignette",{...r,darkness:o})}),Ge(rt,{label:"Eskil",checked:r.eskil,onChange:o=>t("vignette",{...r,eskil:o})})]})}function Qb({pp:e,set:t,open:n,toggle:i}){let{bloom:r}=e;return la(We,{title:"Bloom",tooltip:"Makes bright areas glow and bleed softly into nearby pixels.",open:n.bloom,onToggle:()=>i("bloom"),disabled:!r.enabled,trailing:Ge(Ze,{checked:r.enabled,onChange:o=>t("bloom",{...r,enabled:o}),label:"Toggle Bloom"}),children:[Ge(W,{label:"Threshold",value:r.luminanceThreshold,min:0,max:1,step:.01,onChange:o=>t("bloom",{...r,luminanceThreshold:o})}),Ge(W,{label:"Smoothing",value:r.luminanceSmoothing,min:0,max:1,step:.01,onChange:o=>t("bloom",{...r,luminanceSmoothing:o})}),Ge(W,{label:"Intensity",value:r.intensity,min:0,max:3,step:.05,onChange:o=>t("bloom",{...r,intensity:o})}),Ge(rt,{label:"Mipmap Blur",checked:r.mipmapBlur,onChange:o=>t("bloom",{...r,mipmapBlur:o})}),Ge(W,{label:"Radius",value:r.radius,min:0,max:1,step:.01,onChange:o=>t("bloom",{...r,radius:o})}),Ge(W,{label:"Levels",value:r.levels,min:1,max:16,step:1,onChange:o=>t("bloom",{...r,levels:o})})]})}function Zb({pp:e,set:t,open:n,toggle:i}){let{toneMapping:r}=e;return la(We,{title:"Tone Mapping",tooltip:"Remaps HDR lighting to screen output and controls exposure style.",open:n.toneMapping,onToggle:()=>i("toneMapping"),disabled:!r.enabled,trailing:Ge(Ze,{checked:r.enabled,onChange:o=>t("toneMapping",{...r,enabled:o}),label:"Toggle ToneMapping"}),children:[la("div",{className:"se-field",children:[Ge("span",{className:"se-fieldLabel",children:"Mode"}),Ge("div",{className:"se-segmentedControl",children:B2.map(o=>Ge("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))})]}),Ge(W,{label:"Resolution",value:r.resolution,min:64,max:4096,step:64,onChange:o=>t("toneMapping",{...r,resolution:o})}),Ge(W,{label:"White Point",value:r.whitePoint,min:0,max:16,step:.01,onChange:o=>t("toneMapping",{...r,whitePoint:o})}),Ge(W,{label:"Middle Grey",value:r.middleGrey,min:0,max:1,step:.01,onChange:o=>t("toneMapping",{...r,middleGrey:o})}),Ge(W,{label:"Min Luminance",value:r.minLuminance,min:0,max:1,step:.01,onChange:o=>t("toneMapping",{...r,minLuminance:o})}),Ge(W,{label:"Average Luminance",value:r.averageLuminance,min:0,max:4,step:.01,onChange:o=>t("toneMapping",{...r,averageLuminance:o})}),Ge(W,{label:"Adaptation Rate",value:r.adaptationRate,min:0,max:10,step:.01,onChange:o=>t("toneMapping",{...r,adaptationRate:o})}),Ge(W,{label:"Exposure",value:r.exposure,min:0,max:3,step:.01,onChange:o=>t("toneMapping",{...r,exposure:o})})]})}function ex({pp:e,set:t,open:n,toggle:i}){let{sepia:r}=e;return Ge(We,{title:"Sepia",tooltip:"Adds a warm vintage brown tint to the entire image.",open:n.sepia,onToggle:()=>i("sepia"),disabled:!r.enabled,trailing:Ge(Ze,{checked:r.enabled,onChange:o=>t("sepia",{...r,enabled:o}),label:"Toggle Sepia"}),children:Ge(W,{label:"Intensity",value:r.intensity,min:0,max:1,step:.01,onChange:o=>t("sepia",{...r,intensity:o})})})}import{jsx as _e,jsxs as ca}from"react/jsx-runtime";function tx({pp:e,set:t,open:n,toggle:i}){let{dotScreen:r}=e;return ca(We,{title:"Dot Screen",tooltip:"Overlays a halftone dot pattern for a printed or retro look.",open:n.dotScreen,onToggle:()=>i("dotScreen"),disabled:!r.enabled,trailing:_e(Ze,{checked:r.enabled,onChange:o=>t("dotScreen",{...r,enabled:o}),label:"Toggle DotScreen"}),children:[_e(W,{label:"Angle",value:r.angle,min:0,max:Math.PI*2,step:.01,formatValue:o=>`${o.toFixed(2)} rad`,onChange:o=>t("dotScreen",{...r,angle:o})}),_e(W,{label:"Scale",value:r.scale,min:.1,max:10,step:.05,onChange:o=>t("dotScreen",{...r,scale:o})})]})}function nx({pp:e,set:t,open:n,toggle:i}){let{glitch:r}=e;return ca(We,{title:"Glitch",tooltip:"Introduces digital distortion, tearing, and scan noise.",open:n.glitch,onToggle:()=>i("glitch"),disabled:!r.enabled,trailing:_e(Ze,{checked:r.enabled,onChange:o=>t("glitch",{...r,enabled:o}),label:"Toggle Glitch"}),children:[_e(Fn,{label:"Mode",value:r.mode,options:vh,onChange:o=>t("glitch",{...r,mode:o})}),_e(Qi,{label:"Delay",value:r.delay,min:0,max:10,step:.01,onChange:o=>t("glitch",{...r,delay:o})}),_e(Qi,{label:"Duration",value:r.duration,min:0,max:5,step:.01,onChange:o=>t("glitch",{...r,duration:o})}),_e(Qi,{label:"Strength",value:r.strength,min:0,max:2,step:.01,onChange:o=>t("glitch",{...r,strength:o})}),_e(Qi,{label:"Chromatic Aberration Offset",value:r.chromaticAberrationOffset,min:0,max:.02,step:1e-4,onChange:o=>t("glitch",{...r,chromaticAberrationOffset:o})}),_e(W,{label:"Columns",value:r.columns,min:0,max:.5,step:.001,onChange:o=>t("glitch",{...r,columns:o})}),_e(W,{label:"Ratio",value:r.ratio,min:0,max:1,step:.01,onChange:o=>t("glitch",{...r,ratio:o})})]})}function rx({pp:e,set:t,open:n,toggle:i}){let{grid:r}=e;return ca(We,{title:"Grid",tooltip:"Adds a visual grid overlay that feels retro or debug-like.",open:n.grid,onToggle:()=>i("grid"),disabled:!r.enabled,trailing:_e(Ze,{checked:r.enabled,onChange:o=>t("grid",{...r,enabled:o}),label:"Toggle Grid"}),children:[_e(W,{label:"Scale",value:r.scale,min:.1,max:10,step:.05,onChange:o=>t("grid",{...r,scale:o})}),_e(W,{label:"Line Width",value:r.lineWidth,min:0,max:1,step:.01,onChange:o=>t("grid",{...r,lineWidth:o})})]})}function ix({pp:e,set:t,open:n,toggle:i}){let{chromaticAberration:r}=e;return ca(We,{title:"Chromatic Aberration",tooltip:"Separates color channels slightly to mimic lens fringing.",open:n.chromaticAberration,onToggle:()=>i("chromaticAberration"),disabled:!r.enabled,trailing:_e(Ze,{checked:r.enabled,onChange:o=>t("chromaticAberration",{...r,enabled:o}),label:"Toggle ChromaticAberration"}),children:[_e(W,{label:"Offset X",value:r.offsetX,min:0,max:.02,step:1e-4,onChange:o=>t("chromaticAberration",{...r,offsetX:o})}),_e(W,{label:"Offset Y",value:r.offsetY,min:0,max:.02,step:1e-4,onChange:o=>t("chromaticAberration",{...r,offsetY:o})}),_e(rt,{label:"Radial Modulation",checked:r.radialModulation,onChange:o=>t("chromaticAberration",{...r,radialModulation:o})}),_e(W,{label:"Modulation Offset",value:r.modulationOffset,min:0,max:1,step:.01,onChange:o=>t("chromaticAberration",{...r,modulationOffset:o})})]})}function ox({pp:e,set:t,open:n,toggle:i}){let{noise:r}=e;return ca(We,{title:"Noise",tooltip:"Adds film grain or static noise to the rendered image.",open:n.noise,onToggle:()=>i("noise"),disabled:!r.enabled,trailing:_e(Ze,{checked:r.enabled,onChange:o=>t("noise",{...r,enabled:o}),label:"Toggle Noise"}),children:[_e(W,{label:"Amount",value:r.opacity,min:0,max:1,step:.01,onChange:o=>t("noise",{...r,opacity:o})}),_e(rt,{label:"Premultiply",checked:r.premultiply,onChange:o=>t("noise",{...r,premultiply:o})})]})}function ax({pp:e,set:t,open:n,toggle:i}){let{scanline:r}=e;return _e(We,{title:"Scan Line",tooltip:"Draws horizontal CRT-style scan lines over the frame.",open:n.scanline,onToggle:()=>i("scanline"),disabled:!r.enabled,trailing:_e(Ze,{checked:r.enabled,onChange:o=>t("scanline",{...r,enabled:o}),label:"Toggle Scanline"}),children:_e(W,{label:"Density",value:r.density,min:0,max:10,step:.25,onChange:o=>t("scanline",{...r,density:o})})})}function sx({pp:e,set:t,open:n,toggle:i}){let{pixelation:r}=e;return _e(We,{title:"Pixelation",tooltip:"Reduces detail into larger pixels for a blocky stylized effect.",open:n.pixelation,onToggle:()=>i("pixelation"),disabled:!r.enabled,trailing:_e(Ze,{checked:r.enabled,onChange:o=>t("pixelation",{...r,enabled:o}),label:"Toggle Pixelation"}),children:_e(W,{label:"Granularity",value:r.granularity,min:0,max:20,step:1,onChange:o=>t("pixelation",{...r,granularity:o})})})}function lx({pp:e,set:t,open:n,toggle:i}){let{ramp:r}=e;return ca(We,{title:"Ramp",tooltip:"Adds a screen-space color gradient, or masks effects earlier in the stack.",open:n.ramp,onToggle:()=>i("ramp"),disabled:!r.enabled,trailing:_e(Ze,{checked:r.enabled,onChange:o=>t("ramp",{...r,enabled:o}),label:"Toggle Ramp"}),children:[_e(Fn,{label:"Ramp Type",value:r.rampType,options:wh,onChange:o=>t("ramp",{...r,rampType:o})}),_e(Qi,{label:"Ramp Start",value:r.rampStart,min:0,max:1,step:.01,onChange:o=>t("ramp",{...r,rampStart:o})}),_e(Qi,{label:"Ramp End",value:r.rampEnd,min:0,max:1,step:.01,onChange:o=>t("ramp",{...r,rampEnd:o})}),_e(tr,{label:"Start Color",value:r.startColor,onChange:o=>t("ramp",{...r,startColor:o})}),_e(tr,{label:"End Color",value:r.endColor,onChange:o=>t("ramp",{...r,endColor:o})}),!r.rampMask&&_e(W,{label:"Gradient Opacity",value:r.opacity??.5,min:0,max:1,step:.01,onChange:o=>t("ramp",{...r,opacity:o})}),_e(W,{label:"Bias",value:r.rampBias,min:0,max:1,step:.01,onChange:o=>t("ramp",{...r,rampBias:o})}),_e(W,{label:"Gain",value:r.rampGain,min:0,max:1,step:.01,onChange:o=>t("ramp",{...r,rampGain:o})}),_e(rt,{label:"Mask Earlier Effects",checked:r.rampMask,onChange:o=>t("ramp",{...r,rampMask:o})}),_e(rt,{label:"Invert",checked:r.rampInvert,onChange:o=>t("ramp",{...r,rampInvert:o})})]})}import{jsx as Lt,jsxs as px}from"react/jsx-runtime";function cx({pp:e,set:t,open:n,toggle:i}){let{outline:r}=e;return px(We,{title:"Outline",tooltip:"Draws a visible edge around the selected object binding.",open:n.outline,onToggle:()=>i("outline"),disabled:!r.enabled,trailing:Lt(Ze,{checked:r.enabled,onChange:o=>t("outline",{...r,enabled:o}),label:"Toggle Outline"}),children:[Lt("div",{className:"se-placeholder",children:"Outlines the currently selected object binding in the model editor."}),Lt(W,{label:"Selection Layer",value:r.selectionLayer,min:0,max:20,step:1,onChange:o=>t("outline",{...r,selectionLayer:o})}),Lt(W,{label:"Edge Strength",value:r.edgeStrength,min:0,max:10,step:.1,onChange:o=>t("outline",{...r,edgeStrength:o})}),Lt(W,{label:"Pulse Speed",value:r.pulseSpeed,min:0,max:10,step:.1,onChange:o=>t("outline",{...r,pulseSpeed:o})}),Lt(tr,{label:"Visible Edge Color",value:r.visibleEdgeColor,onChange:o=>t("outline",{...r,visibleEdgeColor:o})}),Lt(tr,{label:"Hidden Edge Color",value:r.hiddenEdgeColor,onChange:o=>t("outline",{...r,hiddenEdgeColor:o})}),Lt(Fn,{label:"Kernel Size",value:r.kernelSize,options:_a,onChange:o=>t("outline",{...r,kernelSize:o})}),Lt(rt,{label:"Blur",checked:r.blur,onChange:o=>t("outline",{...r,blur:o})}),Lt(rt,{label:"X-Ray",checked:r.xRay,onChange:o=>t("outline",{...r,xRay:o})})]})}function dx({pp:e,set:t,open:n,toggle:i}){let{selectiveBloom:r}=e;return px(We,{title:"Selective Bloom",tooltip:"Applies bloom only to objects assigned to the selected layer.",open:n.selectiveBloom,onToggle:()=>i("selectiveBloom"),disabled:!r.enabled,trailing:Lt(Ze,{checked:r.enabled,onChange:o=>t("selectiveBloom",{...r,enabled:o}),label:"Toggle SelectiveBloom"}),children:[Lt("div",{className:"se-placeholder",children:"Applies bloom to the currently selected object binding."}),Lt(W,{label:"Selection Layer",value:r.selectionLayer,min:0,max:20,step:1,onChange:o=>t("selectiveBloom",{...r,selectionLayer:o})}),Lt(W,{label:"Intensity",value:r.intensity,min:0,max:5,step:.05,onChange:o=>t("selectiveBloom",{...r,intensity:o})}),Lt(W,{label:"Threshold",value:r.luminanceThreshold,min:0,max:1,step:.01,onChange:o=>t("selectiveBloom",{...r,luminanceThreshold:o})}),Lt(W,{label:"Smoothing",value:r.luminanceSmoothing,min:0,max:1,step:.01,onChange:o=>t("selectiveBloom",{...r,luminanceSmoothing:o})}),Lt(Fn,{label:"Kernel Size",value:r.kernelSize,options:_a,onChange:o=>t("selectiveBloom",{...r,kernelSize:o})}),Lt(rt,{label:"Mipmap Blur",checked:r.mipmapBlur,onChange:o=>t("selectiveBloom",{...r,mipmapBlur:o})}),Lt(rt,{label:"Inverted",checked:r.inverted,onChange:o=>t("selectiveBloom",{...r,inverted:o})}),Lt(rt,{label:"Ignore Background",checked:r.ignoreBackground,onChange:o=>t("selectiveBloom",{...r,ignoreBackground:o})})]})}function ux({pp:e,set:t,open:n,toggle:i}){let{smaa:r}=e;return Lt(We,{title:"SMAA",tooltip:"Reduces jagged edges with subpixel anti-aliasing.",open:n.smaa,onToggle:()=>i("smaa"),trailing:Lt(Ze,{checked:r.enabled,onChange:o=>t("smaa",{...r,enabled:o}),label:"Toggle SMAA"}),children:Lt("div",{className:"se-placeholder",children:"Subpixel Morphological Anti-Aliasing smooths jagged edges in post-process."})})}import{jsx as Bt,jsxs as D2}from"react/jsx-runtime";function op({config:e,onChange:t}){let[n,i]=O2({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=s=>i(d=>({...d,[s]:!d[s]})),o=e.postProcessing,l={pp:o,set:(s,d)=>t({...e,postProcessing:{...o,[s]:d}}),open:n,toggle:r};return D2("div",{className:"se-generalContent",children:[Bt(Gb,{...l}),Bt(Hb,{...l}),Bt(qb,{...l}),Bt(tx,{...l}),Bt(nx,{...l}),Bt(Wb,{...l}),Bt(rx,{...l}),Bt($b,{...l}),Bt(cx,{...l}),Bt(dx,{...l}),Bt(Yb,{...l}),Bt(Kb,{...l}),Bt(Xb,{...l}),Bt(ix,{...l}),Bt(Jb,{...l}),Bt(Qb,{...l}),Bt(Zb,{...l}),Bt(ox,{...l}),Bt(ex,{...l}),Bt(ax,{...l}),Bt(sx,{...l}),Bt(lx,{...l}),Bt(ux,{...l})]})}import{useState as hx,useSyncExternalStore as N2}from"react";import{Eye as I2,EyeOff as z2,Plus as j2,Trash2 as V2}from"lucide-react";import{Fragment as mx,jsx as Me,jsxs as Un}from"react/jsx-runtime";var F2=["512","1024","2048","4096"],gx={none:"None",directional:"Direction",point:"Point",spot:"Spot",hemisphere:"Hemi"};function U2({index:e,light:t,selected:n,onSelect:i,onToggleVisible:r}){return Un("div",{className:`se-lightRow ${n?"se-lightRow--active":""}`,onClick:i,children:[Un("span",{className:"se-lightRowLabel",children:[e+1,": ",gx[t.type]]}),Me("button",{type:"button",className:"se-iconButton","aria-label":t.visible?"Hide light":"Show light",onClick:o=>{o.stopPropagation(),r()},children:t.visible?Me(I2,{size:14}):Me(z2,{size:14})})]})}function G2(){return{id:crypto.randomUUID(),type:"directional",color:"#ffffff",intensity:1,position:[5,10,5],attachedToCamera:!1,castShadow:!1,shadowBias:-5e-4,visible:!0}}function ap({config:e,onChange:t}){let[n,i]=hx({lights:!0,shadows:!1,groundShadows:!1,environment:!1,envShadow:!1}),r=N2(Yu,cc),[o,a]=hx(e.lighting.lights[0]?.id??null),l=r??o,s=b=>{a(b),hs(b)},d=b=>i(C=>({...C,[b]:!C[b]})),{tier:u}=er(),c=Jr(u,"starter"),{lighting:p,shadows:g,groundShadows:f,environment:v}=e,P=b=>t({...e,lighting:b}),y=b=>t({...e,shadows:b}),h=b=>t({...e,groundShadows:b}),m=b=>t({...e,environment:b}),S=(b,C)=>{P({...p,lights:p.lights.map(x=>x.id===b?{...x,...C}:x)})},M=p.lights.find(b=>b.id===l)??null,T=()=>{let b=G2();P({...p,lights:[...p.lights,b]}),s(b.id)},E=()=>{if(!M)return;let b=p.lights.filter(C=>C.id!==M.id);P({...p,lights:b}),s(b[0]?.id??null)};return Un("div",{className:"se-generalContent",children:[Un(We,{title:"Lights",open:n.lights,onToggle:()=>d("lights"),children:[Me("div",{className:"se-lightList",children:p.lights.map((b,C)=>Me(U2,{index:C,light:b,selected:b.id===l,onSelect:()=>s(b.id),onToggleVisible:()=>S(b.id,{visible:!b.visible})},b.id))}),Un("div",{className:"se-lightActions",children:[Me("button",{type:"button",className:"se-iconButton",onClick:T,title:"Add light",children:Me(j2,{size:14})}),M&&p.lights.length>1&&Me("button",{type:"button",className:"se-iconButton",onClick:E,title:"Remove selected light",children:Me(V2,{size:14})})]}),M?Un("div",{className:"se-lightProps",children:[Un("div",{className:"se-field",children:[Me("span",{className:"se-fieldLabel",children:"Type"}),Me("div",{className:"se-segmentedControl",style:{gridAutoColumns:"1fr"},children:bh.map(b=>Me("button",{type:"button",className:`se-segmentedOption ${M.type===b?"se-segmentedOption--active":""}`,onClick:()=>S(M.id,{type:b}),children:gx[b]},b))})]}),Me(tr,{label:"Color",value:M.color,onChange:b=>S(M.id,{color:b})}),Me(W,{label:"Intensity",value:M.intensity,min:0,max:10,step:.1,onChange:b=>S(M.id,{intensity:b})}),M.type!=="hemisphere"&&M.type!=="none"&&Me(gi,{label:"Position",value:M.position,min:-100,max:100,step:.05,onChange:b=>S(M.id,{position:b})}),M.type==="spot"&&Un(mx,{children:[Me(W,{label:"Angle",value:M.angle??Math.PI/6,min:0,max:Math.PI/2,step:.01,formatValue:b=>`${Math.round(b*180/Math.PI)}\xB0`,onChange:b=>S(M.id,{angle:b})}),Me(W,{label:"Penumbra",value:M.penumbra??.2,min:0,max:1,step:.01,onChange:b=>S(M.id,{penumbra:b})}),Me(W,{label:"Distance",value:M.distance??0,min:0,max:100,step:.5,onChange:b=>S(M.id,{distance:b})}),Me(W,{label:"Decay",value:M.decay??2,min:0,max:4,step:.1,onChange:b=>S(M.id,{decay:b})})]}),Me(rt,{label:"Attached to camera",checked:M.attachedToCamera,onChange:b=>S(M.id,{attachedToCamera:b})}),Me(rt,{label:"Cast shadows",checked:M.castShadow,onChange:b=>S(M.id,{castShadow:b})}),Me(W,{label:"Shadow bias",value:M.shadowBias,min:-.01,max:.01,step:1e-4,onChange:b=>S(M.id,{shadowBias:b})})]}):null]}),Un(We,{title:"Shadows",open:n.shadows,onToggle:()=>d("shadows"),disabled:!g.enabled,trailing:Me(Ze,{checked:g.enabled,onChange:b=>y({...g,enabled:b}),label:"Toggle shadows"}),children:[Me(Fn,{label:"Map size",value:String(g.mapSize),options:F2,onChange:b=>y({...g,mapSize:Number(b)})}),Me(W,{label:"Bias",value:g.bias,min:-.01,max:.01,step:1e-4,onChange:b=>y({...g,bias:b})}),Me(W,{label:"Normal bias",value:g.normalBias,min:0,max:.2,step:.01,onChange:b=>y({...g,normalBias:b})}),Me(W,{label:"Radius (softness)",value:g.radius,min:0,max:20,step:.5,onChange:b=>y({...g,radius:b})})]}),Un(We,{title:"Ground Shadows",open:n.groundShadows,onToggle:()=>d("groundShadows"),disabled:!f.enabled,trailing:Me(Ze,{checked:f.enabled,onChange:b=>h({...f,enabled:b}),label:"Toggle ground shadows"}),children:[Un("div",{className:"se-field",children:[Me("span",{className:"se-fieldLabel",children:"Mode"}),Me("div",{className:"se-segmentedControl",style:{gridAutoColumns:"1fr"},children:["shadowCatcher"].map(b=>Me("button",{type:"button",className:`se-segmentedOption ${f.mode===b?"se-segmentedOption--active":""}`,onClick:()=>h({...f,mode:b}),children:b==="shadowCatcher"?"Shadow Catcher":"Baked AO"},b))})]}),f.mode==="bakedAO"&&Me("div",{className:"se-placeholder",children:"Requires pre-baked AO textures \u2014 not yet available."}),Me(W,{label:"Intensity",value:f.intensity,min:0,max:1,step:.01,onChange:b=>h({...f,intensity:b})}),Me(W,{label:"Border fade",value:f.borderFade,min:0,max:10,step:.1,onChange:b=>h({...f,borderFade:b})}),Me(W,{label:"Height",value:f.height,min:-5,max:5,step:.1,onChange:b=>h({...f,height:b})}),Me(W,{label:"Size",value:f.size,min:1,max:50,step:.5,onChange:b=>h({...f,size:b})})]}),Me(We,{title:"Environment",open:n.environment,onToggle:()=>d("environment"),children:c?Un(mx,{children:[Me(W,{label:"Orientation",value:v.rotation,min:0,max:360,step:1,formatValue:b=>`${b}\xB0`,onChange:b=>m({...v,rotation:b})}),Me(W,{label:"Brightness",value:v.intensity,min:0,max:3,step:.05,onChange:b=>m({...v,intensity:b})}),Un(We,{title:"Shadow",open:n.envShadow,onToggle:()=>d("envShadow"),trailing:Me(Ze,{checked:v.shadowLight.enabled,onChange:b=>m({...v,shadowLight:{...v.shadowLight,enabled:b}}),label:"Toggle environment shadow light"}),disabled:!v.shadowLight.enabled,children:[Me(W,{label:"Light intensity",value:v.shadowLight.intensity,min:0,max:20,step:.1,onChange:b=>m({...v,shadowLight:{...v.shadowLight,intensity:b}})}),Me(W,{label:"Shadow bias",value:v.shadowLight.bias,min:-.01,max:.01,step:1e-4,onChange:b=>m({...v,shadowLight:{...v.shadowLight,bias:b}})})]})]}):Me(On,{requiredTier:"starter",feature:"Environment lighting"})})]})}import{useMemo as H2,useState as W2}from"react";import{ChevronDown as $2,Pause as X2,Play as q2,Square as Y2,Trash2 as K2}from"lucide-react";import{jsx as $e,jsxs as Ot}from"react/jsx-runtime";function J2(e){if(!Number.isFinite(e)||e<=0)return"Unknown duration";let t=Math.round(e*10)/10;if(t<60)return`${t.toFixed(1)}s`;let n=Math.floor(t/60),i=(t%60).toFixed(1).padStart(4,"0");return`${n}:${i}`}function fx(e){let t=Number.isFinite(e)&&e>0?e:0;if(t<60)return`${t.toFixed(1)}s`;let n=Math.floor(t/60),i=(t%60).toFixed(1).padStart(4,"0");return`${n}:${i}`}function Q2(e){return Number.isFinite(e)?Math.min(3,Math.max(.1,Number(e.toFixed(2)))):1}function sp({config:e,onChange:t,clipDetails:n,currentClip:i,isPlaying:r,time:o,play:a,pause:l,stop:s,setSpeed:d,seek:u}){let[c,p]=W2(!1),g=H2(()=>new Map(n.map(b=>[b.sourceName,b.duration])),[n]),f=e.animations.clips.filter(b=>!b.hidden),v=e.animations.clips.filter(b=>b.hidden),P=(b,C=e.animations.autoplayClip)=>{t({...e,animations:{clips:b(e.animations.clips),autoplayClip:C}})},y=(b,C)=>{P(x=>x.map(k=>k.sourceName===b?C(k):k))},h=(b,C)=>{y(b,x=>({...x,loopMode:C}))},m=(b,C)=>{let x=Q2(C);y(b,k=>({...k,speed:x})),i===b&&d(x)},S=(b,C)=>{y(b,x=>({...x,displayName:C}))},M=b=>{let C=e.animations.autoplayClip===b?null:b;t({...e,animations:{...e.animations,autoplayClip:C}})},T=b=>{P(C=>C.map(x=>x.sourceName===b?{...x,hidden:!0}:x),e.animations.autoplayClip===b?null:e.animations.autoplayClip),i===b&&s()},E=b=>{P(C=>C.map(x=>x.sourceName===b?{...x,hidden:!1}:x))};return e.animations.clips.length===0?$e(Ji,{title:"Animations",children:$e("div",{className:"se-helperCard",children:"Upload a model with embedded animations to manage playback, naming, autoplay, and per-clip speed here."})}):Ot(Ji,{title:"Animations",children:[f.length===0&&$e("div",{className:"se-helperCard",children:$e("span",{children:"Preview clips directly in the viewer, choose one optional autoplay animation, and use soft delete to hide clips without modifying the GLB."})}),f.length===0?$e("div",{className:"se-placeholder",children:"All animations are currently removed. Restore a clip below to make it available again."}):$e("div",{className:"se-animationList",children:f.map(b=>{let C=i===b.sourceName,x=g.get(b.sourceName)??0;return Ot("article",{className:`se-animationCard ${C?"se-animationCard--active":""}`,children:[Ot("div",{className:"se-animationHeader",children:[Ot("div",{className:"se-animationHeading",children:[Ot("div",{className:"se-animationTitleRow",children:[$e("span",{className:"se-animationStatus",children:C?r?"Playing":"Paused":"Ready"}),e.animations.autoplayClip===b.sourceName?$e("span",{className:"se-animationBadge",children:"Autoplay"}):null]}),$e("div",{className:"se-animationSource",children:b.sourceName})]}),$e("button",{type:"button",className:"se-animationDangerButton",onClick:()=>T(b.sourceName),title:"Remove animation",children:$e(K2,{size:16})})]}),Ot("div",{className:"se-field",children:[$e("span",{className:"se-fieldLabel",children:"Display name"}),$e("input",{className:"se-textInput",value:b.displayName,onChange:I=>S(b.sourceName,I.target.value),placeholder:"Animation name"})]}),Ot("div",{className:"se-animationMeta",children:[$e("span",{children:J2(x)}),$e("span",{children:b.loopMode==="once"?"Play once":"Looping"}),Ot("span",{children:[b.speed.toFixed(2),"x"]})]}),Ot("div",{className:"se-animationButtonRow",children:[(()=>{let I=C&&r;return $e("button",{type:"button",className:"se-animationButton se-animationButton--icon",onClick:()=>I?l():a(b.sourceName),"aria-label":I?"Pause":"Play",title:I?"Pause":"Play",children:I?$e(X2,{size:16}):$e(q2,{size:16})})})(),$e("button",{type:"button",className:"se-animationButton se-animationButton--icon",onClick:s,disabled:!C,"aria-label":"Stop",title:"Stop",children:$e(Y2,{size:16})})]}),Ot("div",{className:"se-animationSeekRow",children:[$e("input",{className:"se-slider se-animationSeek",type:"range",min:0,max:Math.max(x,.001),step:.01,value:C?Math.min(o,x):0,disabled:!C||x<=0,onChange:I=>u(Number(I.target.value)),"aria-label":"Seek"}),Ot("span",{className:"se-animationSeekTime",children:[fx(C?Math.min(o,x):0)," / ",fx(x)]})]}),Ot("div",{className:"se-animationGrid",children:[Ot("label",{className:"se-field",children:[$e("span",{className:"se-fieldLabel",children:"Loop mode"}),Ot("select",{className:"se-select",value:b.loopMode,onChange:I=>h(b.sourceName,I.target.value),children:[$e("option",{value:"repeat",children:"Loop"}),$e("option",{value:"once",children:"Play Once"})]})]}),Ot("label",{className:"se-field",children:[Ot("span",{className:"se-fieldLabel",children:["Speed",Ot("span",{className:"se-fieldValue",children:[b.speed.toFixed(2),"x"]})]}),Ot("div",{className:"se-animationSpeedRow",children:[$e("input",{className:"se-slider",type:"range",min:.1,max:3,step:.1,value:b.speed,onChange:I=>m(b.sourceName,Number(I.target.value))}),$e("input",{className:"se-numberInput se-animationSpeedInput",type:"number",min:.1,max:3,step:.1,value:b.speed,onChange:I=>m(b.sourceName,Number(I.target.value))})]})]})]}),$e("button",{type:"button",className:`se-animationAutoplayButton ${e.animations.autoplayClip===b.sourceName?"se-animationAutoplayButton--active":""}`,onClick:()=>M(b.sourceName),children:e.animations.autoplayClip===b.sourceName?"Disable autoplay":"Set as autoplay"})]},b.sourceName)})}),v.length>0?Ot("section",{className:"se-removedAnimations",children:[$e("button",{type:"button",className:"se-panelHeader",onClick:()=>p(b=>!b),children:Ot("span",{className:"se-panelHeaderMain",children:[$e($2,{size:16,className:`se-panelChevron ${c?"se-panelChevron--open":""}`}),Ot("span",{className:"se-panelTitle",children:["Removed Animations (",v.length,")"]})]})}),c?$e("div",{className:"se-removedAnimationList",children:v.map(b=>Ot("div",{className:"se-removedAnimationRow",children:[Ot("div",{children:[$e("div",{className:"se-removedAnimationName",children:b.displayName||b.sourceName}),$e("div",{className:"se-animationSource",children:b.sourceName})]}),$e("button",{type:"button",className:"se-animationButton",onClick:()=>E(b.sourceName),children:"Restore"})]},b.sourceName))}):null]}):null]})}import{useState as bx}from"react";import{Pencil as Z2,Trash2 as eP}from"lucide-react";import{jsx as cn,jsxs as nr}from"react/jsx-runtime";function lp({config:e,onChange:t}){let[n,i]=bx(null),[r,o]=bx({title:"",description:""}),a=e.annotations,l=c=>{i(c),o({title:c.title,description:c.description||""})},s=()=>{if(!n||!r.title.trim())return;let c=a.map(p=>p.id===n.id?{...p,title:r.title.trim(),description:r.description||""}:p);t({...e,annotations:c}),i(null),o({title:"",description:""})},d=c=>{if(window.confirm("Delete this annotation?")){let g=a.filter(f=>f.id!==c).map((f,v)=>({...f,id:v+1}));t({...e,annotations:g}),i(null),o({title:"",description:""})}},u=()=>{i(null),o({title:"",description:""})};return nr(Ji,{title:"Annotations",children:[e.annotations.length===0?cn("div",{className:"bb-emptyAnnotations",children:"No annotations yet. Double-click on the model to add one."}):cn("div",{className:"bb-annotationsList",children:e.annotations.map(c=>nr("div",{className:"bb-annotationCard",children:[nr("div",{className:"bb-annotationHeader",children:[nr("div",{className:"bb-annotationBadge",children:["#",c.id]}),nr("div",{className:"bb-annotationActions",children:[cn("button",{className:"bb-annotationAction bb-annotationAction--edit",onClick:()=>l(c),title:"Edit annotation",children:cn(Z2,{size:16})}),cn("button",{className:"bb-annotationAction bb-annotationAction--delete",onClick:()=>d(c.id),title:"Delete annotation",children:cn(eP,{size:16})})]})]}),cn("div",{className:"bb-annotationTitle",children:c.title}),c.description&&cn("div",{className:"bb-annotationDescription",children:c.description}),nr("div",{className:"bb-annotationPosition",children:["Position: [",c.worldPosition[0].toFixed(2),","," ",c.worldPosition[1].toFixed(2),","," ",c.worldPosition[2].toFixed(2),"]"]})]},c.id))}),n&&cn("div",{className:"bb-editAnnotationOverlay",onClick:u,children:nr("div",{className:"bb-editAnnotationPopup",onClick:c=>c.stopPropagation(),children:[nr("div",{className:"bb-editAnnotationHeader",children:[cn("h3",{className:"bb-editAnnotationTitle",children:"Edit Annotation"}),cn("button",{className:"bb-editAnnotationClose",onClick:u,children:"\xD7"})]}),nr("div",{className:"bb-editAnnotationBody",children:[nr("div",{className:"bb-field",children:[cn("label",{className:"bb-label",children:"Title"}),cn("input",{className:"bb-input",value:r.title,onChange:c=>o({...r,title:c.target.value}),placeholder:"Enter annotation title"})]}),nr("div",{className:"bb-field",children:[cn("label",{className:"bb-label",children:"Description"}),cn("textarea",{className:"bb-textarea",value:r.description,onChange:c=>o({...r,description:c.target.value}),placeholder:"Enter annotation description",rows:3})]}),nr("div",{className:"bb-editAnnotationActions",children:[cn("button",{className:"bb-button",onClick:u,children:"Cancel"}),cn("button",{className:"bb-button bb-button--primary",onClick:s,disabled:!r.title.trim(),children:"Save"}),cn("button",{className:"bb-button bb-button--danger",onClick:()=>d(n.id),children:"Delete"})]})]})]})})]})}import{useState as tP,useCallback as Zi}from"react";import{ArrowDown as nP,ArrowUp as rP,MapPin as iP,Plus as oP,Trash2 as aP,Settings as sP}from"lucide-react";import{Fragment as cP,jsx as bt,jsxs as Yt}from"react/jsx-runtime";var lP={enabled:!0,waypoints:[],loop:!0,autoPlay:!1},eo=3.5;function cp({config:e,onChange:t,cameraState:n,onPreviewWaypoint:i}){let r=e.cinematic??lP,{waypoints:o}=r,a=Zi((y,h)=>{if(y.length<2)return 0;let m=0;for(let S=0;S<y.length-1;S++){let M=y[S].segmentDuration??eo;m+=M}return h&&y.length>1&&(m+=y[y.length-1].segmentDuration??eo),Math.max(m,0)},[]),l=Zi(y=>{t({...e,cinematic:{...r,...y}})},[e,r,t]),s=Zi(()=>{if(!n)return;let y={position:[...n.position],target:[...n.target],...n.azimuthAngle!=null?{azimuthAngle:n.azimuthAngle}:{},...n.polarAngle!=null?{polarAngle:n.polarAngle}:{},segmentDuration:eo},h=[...o,y],m=a(h,r.loop);l({waypoints:h,duration:m})},[n,o,r.loop,a,l]),d=Zi(y=>{let h=o.filter((S,M)=>M!==y),m=a(h,r.loop);l({waypoints:h,duration:m})},[o,r.loop,a,l]),u=Zi((y,h)=>{let m=y+h;if(m<0||m>=o.length)return;let S=[...o];[S[y],S[m]]=[S[m],S[y]];let M=a(S,r.loop);l({waypoints:S,duration:M})},[o,r.loop,a,l]),c=Zi((y,h)=>{let m=o.map((M,T)=>T===y?{...M,...h}:M),S=a(m,r.loop);l({waypoints:m,duration:S})},[o,r.loop,a,l]),[p,g]=tP(!1),f=o.some(y=>y.segmentDuration!==void 0),v=Zi(y=>y>=o.length-1?eo:o[y]?.segmentDuration??eo,[o]),P=o.length>=2;return Yt(Ji,{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."}),Yt("button",{type:"button",className:"bb-button bb-button--primary se-cinematicAdd",onClick:s,disabled:!n,title:"Capture the current camera view as a waypoint",children:[bt(oP,{size:15}),"Add waypoint from current view"]}),Yt("div",{className:"se-customizeToggle",children:[Yt("label",{className:"se-toggleLabel",children:[bt("input",{type:"checkbox",checked:p,onChange:y=>g(y.target.checked)}),bt(sP,{size:14}),bt("span",{children:"Customize durations between waypoints"})]}),p&&Yt("span",{className:"se-toggleHint",children:["Set duration for each segment between waypoints: 1\u21922, 2\u21923, etc. Default: ",eo,"s"]})]}),o.length===0?bt("div",{className:"bb-emptyAnnotations",children:"No waypoints yet. Position the camera and add your first one."}):Yt(cP,{children:[bt("div",{className:"se-waypointList",children:o.map((y,h)=>{let m=v(h),S=h===o.length-1,M=y.segmentDuration!==void 0&&y.segmentDuration!==eo;return Yt("div",{children:[Yt("div",{className:"se-waypointCard",children:[bt("div",{className:"se-waypointBadge",children:h+1}),Yt("div",{className:"se-waypointBody",children:[Yt("div",{className:"se-waypointCoords",children:["pos [",y.position.map(T=>T.toFixed(1)).join(", "),"]"]}),Yt("div",{className:"se-waypointCoords",children:["look [",y.target.map(T=>T.toFixed(1)).join(", "),"]"]}),p&&!S&&Yt("div",{className:`se-customBadge ${M?"se-customBadge--custom":"se-customBadge--default"}`,children:[m.toFixed(1),"s",!M&&" (default)"]})]}),Yt("div",{className:"se-waypointActions",children:[bt("button",{className:"se-waypointAction",onClick:()=>i?.(y),title:"Fly camera to this waypoint",disabled:!i,children:bt(iP,{size:15})}),bt("button",{className:"se-waypointAction",onClick:()=>u(h,-1),title:"Move up",disabled:h===0,children:bt(rP,{size:15})}),bt("button",{className:"se-waypointAction",onClick:()=>u(h,1),title:"Move down",disabled:S,children:bt(nP,{size:15})}),bt("button",{className:"se-waypointAction se-waypointAction--delete",onClick:()=>d(h),title:"Delete waypoint",children:bt(aP,{size:15})})]})]}),p&&!S&&Yt("div",{className:"se-segmentBetween",children:[Yt("div",{className:"se-segmentLabel",children:[h+1," \u2192 ",h+2,!y.segmentDuration&&" (default)"]}),Yt("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:T=>{let E=parseFloat(T.target.value);c(h,{segmentDuration:E})}}),Yt("span",{className:"se-segmentValue",children:[m.toFixed(1),"s"]}),Yt("div",{className:"se-presetButtons",children:[[2,4,6,8].map(T=>Yt("button",{className:"se-presetButton",onClick:()=>c(h,{segmentDuration:T}),children:[T,"s"]},`preset-${h}-${T}`)),bt("button",{className:"se-presetButton se-presetButton--default",onClick:()=>{let T=o.map((b,C)=>{if(C===h){let{segmentDuration:x,...k}=b;return k}return b}),E=a(T,r.loop);l({waypoints:T,duration:E})},children:"Reset"})]})]})]})]},`waypoint-wrapper-${h}`)})}),Yt("div",{className:"se-totalDuration",children:[bt("span",{className:"se-totalLabel",children:"Total duration:"}),bt("span",{className:"se-totalValue",children:P?(r.duration??a(o,r.loop)).toFixed(1)+"s":"-"}),!P&&bt("span",{className:"se-totalHint",children:"(need at least 2 waypoints)"})]})]}),bt(rt,{label:"Enable cinematic camera",checked:r.enabled,onChange:y=>l({enabled:y})}),bt(rt,{label:"Loop",checked:r.loop,onChange:y=>{let h=y,m=a(o,h);l({loop:h,duration:m})}}),bt(rt,{label:"Auto-play on load",checked:r.autoPlay,onChange:y=>l({autoPlay:y})}),!p&&P&&bt(W,{label:"Duration",value:r.duration??a(o,r.loop),min:4,max:120,step:1,formatValue:y=>`${y}s`,onChange:y=>l({duration:y})})]})}import{Box as pP,Clapperboard as hP,MessageSquareText as mP,Sparkles as gP,Spotlight as fP,Video as bP}from"lucide-react";import{jsx as dn,jsxs as yP}from"react/jsx-runtime";var xP=[{label:"General",icon:dn(pP,{})},{label:"Lighting",icon:dn(fP,{})},{label:"Animations",icon:dn(hP,{})},{label:"Post Processing",icon:dn(gP,{})},{label:"Annotations",icon:dn(mP,{})},{label:"Cinematic",icon:dn(bP,{})}],xx={currentClip:null,isPlaying:!1,time:0,duration:0,play:()=>{},pause:()=>{},stop:()=>{},setSpeed:()=>{},seek:()=>{}};function dp({config:e,onChange:t,activeSubTab:n,onActiveSubTabChange:i,cameraState:r=null,onPreviewWaypoint:o,animationClipDetails:a=[],animationPlayback:l=xx}){let[s,d]=dP("General"),u=n??s,c=l??xx,{tier:p}=er(),g=Jr(p,"starter"),f=Jr(p,"growth");uP(()=>{n!==void 0&&d(n)},[n]);let v=P=>{n===void 0&&d(P),i?.(P)};return yP("div",{className:"se-tabContent",children:[dn("div",{className:"se-subTabRow",children:xP.map(P=>dn("button",{type:"button",title:P.label,className:`se-subTab ${u===P.label?"se-subTab--active":""}`,onClick:()=>v(P.label),children:P.icon},P.label))}),u==="General"&&dn(ip,{config:e,onChange:t}),u==="Lighting"&&dn(ap,{config:e,onChange:t}),u==="Animations"&&(g?dn(sp,{config:e,onChange:t,clipDetails:a,currentClip:c.currentClip,isPlaying:c.isPlaying,time:c.time,duration:c.duration,play:c.play,pause:c.pause,stop:c.stop,setSpeed:c.setSpeed,seek:c.seek}):dn(On,{requiredTier:"starter",feature:"Animation configuration"})),u==="Post Processing"&&(f?dn(op,{config:e,onChange:t}):dn(On,{requiredTier:"growth",feature:"Post-processing effects"})),u==="Annotations"&&(g?dn(lp,{config:e,onChange:t}):dn(On,{requiredTier:"starter",feature:"Annotations"})),u==="Cinematic"&&(g?dn(cp,{config:e,onChange:t,cameraState:r,onPreviewWaypoint:o}):dn(On,{requiredTier:"starter",feature:"Cinematic camera"}))]})}import{ChevronDown as yx,Info as vx}from"lucide-react";import{jsx as Mn,jsxs as to}from"react/jsx-runtime";function wx({title:e,trailing:t,children:n,disabled:i,open:r,onToggle:o,tooltip:a}){let l=a?`${a}`:e;return to("div",{className:"bb-materialPanel",children:[to("button",{type:"button",className:"bb-materialPanelHeader",onClick:o,"aria-expanded":r,title:l,children:[to("div",{className:"bb-materialPanelTitleWrap",children:[Mn(yx,{size:14,className:`bb-materialPanelChevron ${r?"bb-materialPanelChevron--open":""}`}),Mn("span",{className:"bb-materialPanelTitle",children:e}),a?Mn("span",{className:"bb-materialPanelHelp",title:l,"aria-label":l,role:"img",onClick:s=>s.stopPropagation(),children:Mn(vx,{size:12})}):null]}),t?Mn("div",{onClick:s=>s.stopPropagation(),children:t}):null]}),r?Mn("div",{className:"bb-materialPanelBody",style:i?{opacity:.45,pointerEvents:"none"}:void 0,children:n}):null]})}function Dn({title:e,open:t,onToggle:n,trailing:i,children:r,tooltip:o}){let a=o?`${e}: ${o}`:e;return to("div",{className:"bb-section",children:[to("button",{type:"button",className:"bb-sectionHeaderButton",onClick:n,"aria-expanded":t,title:a,children:[to("span",{className:"bb-sectionHeaderMain",children:[Mn(yx,{size:15,className:`bb-sectionChevron ${t?"bb-sectionChevron--open":""}`}),Mn("h2",{className:"bb-sectionTitle",children:e}),o?Mn("span",{className:"bb-sectionHelp",title:a,"aria-label":a,role:"img",onClick:l=>l.stopPropagation(),children:Mn(vx,{size:13})}):null]}),i?Mn("span",{onClick:l=>l.stopPropagation(),children:i}):null]}),t?Mn("div",{className:"bb-sectionBody",children:r}):null]})}function Cx({checked:e,onChange:t,label:n}){return to("label",{className:"se-switch","aria-label":n,children:[Mn("input",{type:"checkbox",checked:e,onChange:i=>t(i.target.checked)}),Mn("span",{className:"se-switchTrack",children:Mn("span",{className:"se-switchThumb"})})]})}import{useState as Tx}from"react";import{jsx as up}from"react/jsx-runtime";function Gn({panelKey:e,title:t,tooltip:n,toggleLabel:i,controls:r,children:o,requiredTier:a}){let{openMaterialPanels:l,materialPanelEnabled:s,onToggleMaterialPanel:d,onSetMaterialPanelState:u}=r,c=a?.locked??!1;return up(wx,{title:t,tooltip:n,disabled:c||!s[e],open:l[e],onToggle:()=>d(e),trailing:up(Cx,{checked:!c&&s[e],onChange:c?()=>{}:p=>u(e,p),label:i??`Toggle ${t}`}),children:c&&a?up(On,{requiredTier:a.tier,feature:t}):o})}import{useRef as Sx,useState as vP}from"react";import{HexColorInput as wP,HexColorPicker as CP}from"react-colorful";import{FileUp as SP}from"lucide-react";import{jsx as Kt,jsxs as fi}from"react/jsx-runtime";function Jt({label:e,value:t,placeholder:n,onChange:i}){let r=Sx(null);return fi("div",{className:"bb-field bb-field--full",children:[Kt("label",{className:"bb-label",children:e}),fi("div",{className:"bb-fileField",children:[Kt("input",{className:"bb-input bb-fileField-input",placeholder:n,value:t,onChange:o=>{let a=o.target.value;!a&&t&&gd(t),i(a)}}),Kt("button",{type:"button",className:"bb-fileFieldButton",onClick:()=>r.current?.click(),"aria-label":`Select file for ${e}`,title:`Select file for ${e}`,children:Kt(SP,{size:20})}),Kt("input",{ref:r,type:"file",accept:"image/png,image/jpeg,image/webp,image/avif",className:"bb-hiddenInput",onChange:o=>{let a=o.target.files?.[0];if(!a)return;let l=em(a);t&&t!==l&&gd(t),im(l,URL.createObjectURL(a)),i(l),o.target.value=""}})]})]})}function no({label:e,value:t,fallback:n="#ffffff",onChange:i}){let[r,o]=vP(!1),a=t||n,l=Sx(null);return fi("div",{className:"bb-field",children:[Kt("span",{className:"bb-label",children:e}),Kt("div",{className:"se-fieldInline",children:Kt("span",{ref:l,style:{display:"inline-flex"},children:Kt(wP,{prefixed:!0,className:"se-swatch",onClick:()=>o(s=>!s),style:{background:a,color:sa(a)},color:a,onChange:i})})}),r?Kt(np,{anchorRef:l,onClose:()=>o(!1),children:Kt(CP,{color:a,onChange:i})}):null]})}function bs({label:e,checked:t,onChange:n}){return fi("label",{className:"bb-checkbox",children:[Kt("input",{type:"checkbox",checked:t,onChange:i=>n(i.target.checked)}),e]})}function Mx({label:e,value:t,min:n,max:i,step:r,placeholder:o,onChange:a}){return fi("div",{className:"bb-field",children:[Kt("label",{className:"bb-label",children:e}),Kt("input",{className:"bb-input",type:"number",min:n,max:i,step:r,placeholder:o,value:t??"",onChange:l=>a(l.target.value===""?void 0:Number(l.target.value))})]})}function da({label:e,value:t,options:n,onChange:i}){return fi("div",{className:"bb-field",children:[Kt("label",{className:"bb-label",children:e}),Kt("select",{className:"bb-select",value:t,onChange:r=>i(r.target.value),children:n.map(r=>Kt("option",{value:r,children:r},r))})]})}function kt({label:e,value:t,min:n,max:i,step:r,onChange:o}){return fi("div",{className:"bb-field bb-field--full",children:[Kt("label",{className:"bb-label",children:e}),fi("div",{className:"bb-sliderField",children:[Kt("input",{className:`bb-slider ${t===void 0?"bb-slider--unset":""}`,type:"range",min:n,max:i,step:r,value:t??n,onChange:l=>o(Number(l.target.value))}),Kt("input",{className:"bb-input bb-input--compact",type:"number",min:n,max:i,step:r,value:t??"",onChange:l=>o(l.target.value===""?void 0:Number(l.target.value))})]})]})}import{Fragment as pp,jsx as Q,jsxs as tn}from"react/jsx-runtime";function Px({selectedItem:e,selectedMaterial:t,pbrWorkflow:n,onPbrWorkflowChange:i,openMaterialPanels:r,materialPanelEnabled:o,onToggleMaterialPanel:a,onSetMaterialPanelState:l,updateSelectedMaterial:s,setSelectedTexturePath:d}){let u={openMaterialPanels:r,materialPanelEnabled:o,onToggleMaterialPanel:a,onSetMaterialPanelState:l},{tier:c}=er(),p=Jr(c,"starter"),g={tier:"starter",locked:!p},[f,v]=Tx("roughness"),[P,y]=Tx("factor");return tn(pp,{children:[Q(Gn,{panelKey:"pbr",title:"PBR Maps",tooltip:"Controls the base color and workflow used for physically based shading.",controls:u,children:p?tn("div",{className:"bb-grid",children:[Q(da,{label:"Workflow",value:n,options:["metalness","specular"],onChange:i}),Q("div",{className:"bb-field bb-field--full",children:Q("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."})}),Q(Jt,{label:n==="specular"?"Albedo texture path":"Base color texture path",placeholder:"materials/oak-wood.jpg",value:t?.texture?.path??"",onChange:h=>d(e,"texture",h)}),Q(no,{label:n==="specular"?"Albedo color":"Base color",value:t?.baseColor??"#ffffff",onChange:h=>s(e,m=>({...m,baseColor:h}))}),n==="metalness"?tn(pp,{children:[Q(kt,{label:"Metalness",value:t?.metalness,min:0,max:1,step:.01,onChange:h=>s(e,m=>({...m,metalness:h}))}),Q(Jt,{label:"Metalness map path",placeholder:"materials/body-metalness.jpg",value:t?.metalnessMap?.path??"",onChange:h=>d(e,"metalnessMap",h)})]}):tn(pp,{children:[Q(kt,{label:"Specular intensity",value:t?.specularIntensity,min:0,max:1,step:.01,onChange:h=>s(e,m=>({...m,specularIntensity:h}))}),Q(no,{label:"Specular color",value:t?.specularColor??"#ffffff",onChange:h=>s(e,m=>({...m,specularColor:h}))}),Q(Jt,{label:"Specular intensity map path",placeholder:"materials/body-specular-intensity.jpg",value:t?.specularIntensityMap?.path??"",onChange:h=>d(e,"specularIntensityMap",h)}),Q(Jt,{label:"Specular color map path",placeholder:"materials/body-specular-color.jpg",value:t?.specularColorMap?.path??"",onChange:h=>d(e,"specularColorMap",h)})]}),Q(kt,{label:"Specular F0 / reflectivity",value:t?.reflectivity,min:0,max:1,step:.01,onChange:h=>s(e,m=>({...m,reflectivity:h}))})]}):tn("div",{className:"bb-grid",children:[Q(no,{label:"Base color",value:t?.baseColor??"#ffffff",onChange:h=>s(e,m=>({...m,baseColor:h}))}),Q(kt,{label:"Metalness",value:t?.metalness,min:0,max:1,step:.01,onChange:h=>s(e,m=>({...m,metalness:h}))}),Q("div",{className:"bb-field bb-field--full",children:Q(On,{requiredTier:"starter",feature:"Texture maps, the specular workflow, and reflectivity"})})]})}),Q(Gn,{panelKey:"roughness",requiredTier:g,title:"Roughness / Glossiness",tooltip:"Adjusts how matte or shiny the surface appears.",toggleLabel:"Toggle Roughness and Glossiness",controls:u,children:tn("div",{className:"bb-grid",children:[Q(da,{label:"Mode",value:f,options:["roughness","glossiness"],onChange:v}),Q("div",{className:"bb-field bb-field--full",children:Q("p",{className:"bb-note",style:{margin:0},children:f==="roughness"?"Roughness: 0 is glossy, 1 is matte.":"Glossiness is the inverse of roughness (glossiness = 1 \u2212 roughness)"})}),f==="roughness"?Q(kt,{label:"Roughness",value:t?.roughness,min:0,max:1,step:.01,onChange:h=>s(e,m=>({...m,roughness:h}))}):Q(kt,{label:"Glossiness",value:t?.roughness===void 0?void 0:1-t.roughness,min:0,max:1,step:.01,onChange:h=>s(e,m=>({...m,roughness:h===void 0?void 0:1-h}))}),Q(Jt,{label:f==="glossiness"?"Glossiness map path (applied as roughness)":"Roughness map path",placeholder:"materials/body-roughness.jpg",value:t?.roughnessMap?.path??"",onChange:h=>d(e,"roughnessMap",h)})]})}),Q(Gn,{panelKey:"emission",requiredTier:g,title:"Emission",tooltip:"Makes the material self-illuminated with emissive color and intensity.",controls:u,children:tn("div",{className:"bb-grid",children:[Q(no,{label:"Emissive color",value:t?.emissive??"#000000",fallback:"#000000",onChange:h=>s(e,m=>({...m,emissive:h}))}),Q(kt,{label:"Emissive intensity",value:t?.emissiveIntensity,min:0,max:10,step:.1,onChange:h=>s(e,m=>({...m,emissiveIntensity:h}))}),Q(Jt,{label:"Emissive map path",placeholder:"materials/body-emissive.jpg",value:t?.emissiveMap?.path??"",onChange:h=>d(e,"emissiveMap",h)})]})}),Q(Gn,{panelKey:"opacity",requiredTier:g,title:"Opacity",tooltip:"Controls transparency, alpha testing, and blending behavior.",controls:u,children:tn("div",{className:"bb-grid",children:[Q(kt,{label:"Opacity",value:t?.opacity,min:0,max:1,step:.01,onChange:h=>s(e,m=>({...m,opacity:h}))}),Q(kt,{label:"Alpha test",value:t?.alphaTest,min:0,max:1,step:.01,onChange:h=>s(e,m=>({...m,alphaTest:h}))}),Q(Jt,{label:"Alpha map path",placeholder:"materials/body-alpha.png",value:t?.alphaMap?.path??"",onChange:h=>d(e,"alphaMap",h)}),Q(da,{label:"Blending mode",value:t?.blendingMode??"normal",options:Xc,onChange:h=>s(e,m=>({...m,blendingMode:h}))}),tn("div",{className:"bb-field",children:[Q("label",{className:"bb-label",children:"Alpha hash"}),Q("div",{className:"bb-checkboxRow",children:Q(bs,{label:"Use alpha hash",checked:t?.alphaHash??!1,onChange:h=>s(e,m=>({...m,alphaHash:h}))})})]}),tn("div",{className:"bb-field",children:[Q("label",{className:"bb-label",children:"Dithering"}),Q("div",{className:"bb-checkboxRow",children:Q(bs,{label:"Use dithering",checked:t?.dithering??!1,onChange:h=>s(e,m=>({...m,dithering:h}))})})]})]})}),tn(Gn,{panelKey:"normalBump",requiredTier:g,title:"Normal & Bump",tooltip:"Adds surface detail without changing the actual mesh shape.",toggleLabel:"Toggle Normal and Bump",controls:u,children:[tn("div",{className:"bb-grid",children:[Q(Jt,{label:"Normal map path",placeholder:"materials/body-normal.jpg",value:t?.normalMap?.path??"",onChange:h=>d(e,"normalMap",h)}),Q(kt,{label:"Normal scale",value:t?.normalScale,min:0,max:5,step:.01,onChange:h=>s(e,m=>({...m,normalScale:h}))}),Q(Jt,{label:"Bump map path",placeholder:"materials/body-bump.jpg",value:t?.bumpMap?.path??"",onChange:h=>d(e,"bumpMap",h)}),Q(kt,{label:"Bump scale",value:t?.bumpScale,min:0,max:5,step:.01,onChange:h=>s(e,m=>({...m,bumpScale:h}))})]}),Q("div",{className:"bb-checkboxRow",style:{marginTop:12},children:Q(bs,{label:"Flip normal Y",checked:t?.flipNormalY??!1,onChange:h=>s(e,m=>({...m,flipNormalY:h}))})})]}),Q(Gn,{panelKey:"displacement",requiredTier:g,title:"Displacement",tooltip:"Offsets geometry using a texture to create real surface height.",controls:u,children:tn("div",{className:"bb-grid",children:[Q(Jt,{label:"Displacement map path",placeholder:"materials/body-displacement.jpg",value:t?.displacementMap?.path??"",onChange:h=>d(e,"displacementMap",h)}),Q(kt,{label:"Displacement scale",value:t?.displacementScale,min:-5,max:5,step:.01,onChange:h=>s(e,m=>({...m,displacementScale:h}))}),Q(kt,{label:"Displacement bias",value:t?.displacementBias,min:-5,max:5,step:.01,onChange:h=>s(e,m=>({...m,displacementBias:h}))})]})}),Q(Gn,{panelKey:"ao",requiredTier:g,title:"Ambient Occlusion",tooltip:"Darkens creases and contact areas to add depth.",controls:u,children:tn("div",{className:"bb-grid",children:[Q(Jt,{label:"AO map path",placeholder:"materials/body-ao.jpg",value:t?.aoMap?.path??"",onChange:h=>d(e,"aoMap",h)}),Q(kt,{label:"AO intensity",value:t?.aoMapIntensity,min:0,max:5,step:.01,onChange:h=>s(e,m=>({...m,aoMapIntensity:h}))})]})}),tn(Gn,{panelKey:"clearcoat",requiredTier:g,title:"Clearcoat",tooltip:"Adds a glossy protective layer on top of the base material.",controls:u,children:[tn("div",{className:"bb-grid",children:[Q(Jt,{label:"Clearcoat map path",placeholder:"materials/body-clearcoat.jpg",value:t?.clearcoatMap?.path??"",onChange:h=>d(e,"clearcoatMap",h)}),Q(kt,{label:"Clearcoat",value:t?.clearcoat,min:0,max:1,step:.01,onChange:h=>s(e,m=>({...m,clearcoat:h}))}),Q(Jt,{label:"Clearcoat roughness map path",placeholder:"materials/body-clearcoat-roughness.jpg",value:t?.clearcoatRoughnessMap?.path??"",onChange:h=>d(e,"clearcoatRoughnessMap",h)}),Q(kt,{label:"Clearcoat roughness",value:t?.clearcoatRoughness,min:0,max:1,step:.01,onChange:h=>s(e,m=>({...m,clearcoatRoughness:h}))}),Q(Jt,{label:"Clearcoat normal map path",placeholder:"materials/body-clearcoat-normal.jpg",value:t?.clearcoatNormalMap?.path??"",onChange:h=>d(e,"clearcoatNormalMap",h)}),Q(kt,{label:"Clearcoat normal scale",value:t?.clearcoatNormalScale,min:0,max:5,step:.01,onChange:h=>s(e,m=>({...m,clearcoatNormalScale:h}))})]}),Q("div",{className:"bb-checkboxRow",style:{marginTop:12},children:Q(bs,{label:"Flip clearcoat normal Y",checked:t?.flipClearcoatNormalY??!1,onChange:h=>s(e,m=>({...m,flipClearcoatNormalY:h}))})})]}),Q(Gn,{panelKey:"sheen",requiredTier:g,title:"Sheen",tooltip:"Adds a soft fabric-like sheen on grazing angles.",controls:u,children:tn("div",{className:"bb-grid",children:[Q(kt,{label:"Sheen",value:t?.sheen,min:0,max:1,step:.01,onChange:h=>s(e,m=>({...m,sheen:h}))}),Q(no,{label:"Sheen color",value:t?.sheenColor??"#ffffff",onChange:h=>s(e,m=>({...m,sheenColor:h}))}),Q(Jt,{label:"Sheen color map path",placeholder:"materials/body-sheen-color.jpg",value:t?.sheenColorMap?.path??"",onChange:h=>d(e,"sheenColorMap",h)}),Q(kt,{label:"Sheen roughness",value:t?.sheenRoughness,min:0,max:1,step:.01,onChange:h=>s(e,m=>({...m,sheenRoughness:h}))}),Q(Jt,{label:"Sheen roughness map path",placeholder:"materials/body-sheen-roughness.jpg",value:t?.sheenRoughnessMap?.path??"",onChange:h=>d(e,"sheenRoughnessMap",h)})]})}),Q(Gn,{panelKey:"anisotropy",requiredTier:g,title:"Anisotropy",tooltip:"Stretches reflections in one direction for brushed or fiber-like surfaces.",controls:u,children:tn("div",{className:"bb-grid",children:[Q(kt,{label:"Intensity",value:t?.anisotropy,min:0,max:1,step:.01,onChange:h=>s(e,m=>({...m,anisotropy:h}))}),Q(da,{label:"Tilt direction",value:P,options:["factor","texture"],onChange:y}),P==="factor"?Q(kt,{label:"Rotation (rad)",value:t?.anisotropyRotation,min:0,max:6.28,step:.01,onChange:h=>s(e,m=>({...m,anisotropyRotation:h}))}):Q(Jt,{label:"Anisotropy map path",placeholder:"materials/body-anisotropy.jpg",value:t?.anisotropyMap?.path??"",onChange:h=>d(e,"anisotropyMap",h)})]})}),Q(Gn,{panelKey:"transmission",requiredTier:g,title:"Transmission & Volume",tooltip:"Controls glass-like transmission and how light travels through volume.",toggleLabel:"Toggle Transmission and Volume",controls:u,children:tn("div",{className:"bb-grid",children:[Q(kt,{label:"Transmission",value:t?.transmission,min:0,max:1,step:.01,onChange:h=>s(e,m=>({...m,transmission:h}))}),Q(Jt,{label:"Transmission map path",placeholder:"materials/body-transmission.jpg",value:t?.transmissionMap?.path??"",onChange:h=>d(e,"transmissionMap",h)}),Q(kt,{label:"Thickness",value:t?.thickness,min:0,max:5,step:.01,onChange:h=>s(e,m=>({...m,thickness:h}))}),Q(Jt,{label:"Thickness map path",placeholder:"materials/body-thickness.jpg",value:t?.thicknessMap?.path??"",onChange:h=>d(e,"thicknessMap",h)}),Q(no,{label:"Volume tint",value:t?.attenuationColor??"#ffffff",onChange:h=>s(e,m=>({...m,attenuationColor:h}))}),Q(Mx,{label:"Attenuation distance",value:t?.attenuationDistance,min:0,step:.01,placeholder:"Infinity when unset",onChange:h=>s(e,m=>({...m,attenuationDistance:h}))})]})}),Q(Gn,{panelKey:"faces",requiredTier:g,title:"Faces Rendering",tooltip:"Chooses which side of the mesh renders and how backfaces are handled.",controls:u,children:Q("div",{className:"bb-grid",children:Q(da,{label:"Side",value:t?.side??"front",options:$c,onChange:h=>s(e,m=>({...m,side:h}))})})})]})}var kx=[{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 MP}from"react/jsx-runtime";function _x({disabled:e,onApply:t}){return hp("div",{className:"bb-presetGallery",children:kx.map(n=>MP("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 TP,useRef as PP,useState as kP}from"react";import{ChevronDown as _P,Download as AP,FileCode2 as RP,FileJson as EP}from"lucide-react";import{jsx as gc,jsxs as xs}from"react/jsx-runtime";function mp({disabled:e,exporting:t,onExportJson:n,onExportTs:i}){let[r,o]=kP(!1),a=PP(null);return TP(()=>{if(!r)return;let l=s=>{a.current?.contains(s.target)||o(!1)};return window.addEventListener("pointerdown",l),()=>window.removeEventListener("pointerdown",l)},[r]),xs("div",{className:"bb-exportMenuWrapper",ref:a,children:[xs("button",{type:"button",className:"bb-button bb-button--ghost",disabled:e||t,onClick:()=>o(l=>!l),title:"Export",children:[gc(AP,{size:14}),t?"Exporting\u2026":"Export",gc(_P,{size:12})]}),r&&xs("div",{className:"bb-exportMenu",children:[xs("button",{type:"button",className:"bb-exportMenuItem",onClick:()=>{o(!1),n()},children:[gc(EP,{size:14}),"JSON"]}),xs("button",{type:"button",className:"bb-exportMenuItem",onClick:()=>{o(!1),i()},children:[gc(RP,{size:14}),"TypeScript"]})]})]})}import{jsx as ro,jsxs as gp}from"react/jsx-runtime";function Ax({selectedItem:e,selectedBinding:t,open:n,onToggle:i,updateBinding:r,idError:o}){return ro(Dn,{title:"Identity",open:n,onToggle:i,children:gp("div",{className:"bb-grid",children:[gp("div",{className:"bb-field bb-field--full",children:[ro("label",{className:"bb-label",children:"Model Node ID"}),ro("span",{className:"bb-note",children:"This is the exact mesh name from the imported model and stays locked."}),ro("input",{className:"bb-input bb-readonly",value:t.modelObjectId,readOnly:!0})]}),gp("div",{className:"bb-field bb-field--full",children:[ro("label",{className:"bb-label",children:"ID"}),ro("input",{className:`bb-input ${o?"bb-input--error":""}`,value:t.id,onChange:a=>r(e,l=>({...l,id:a.target.value}))}),o?ro("span",{className:"bb-status bb-status--error",children:o}):null]})]})})}import{useEffect as LP,useState as Lx}from"react";var Rx=["other","body","light","wheel","glass","interior","floor","wall","door","furniture","decor","electronics","seat","table","chair","window","sofa","bed","engine","headlight"],Ex=["normal","hidden","selected","disabled"];import{jsx as xn,jsxs as xr}from"react/jsx-runtime";function Bx({selectedItem:e,selectedBinding:t,open:n,onToggle:i,updateBinding:r}){let[o,a]=Lx(t.group??""),[l,s]=Lx(t.tags?.join(", ")??"");LP(()=>{a(t.group??""),s(t.tags?.join(", ")??"")},[e,t.group,t.tags]);let d=()=>{r(e,c=>({...c,group:o.trim()||void 0}))},u=()=>{let c=[...new Set(l.split(",").map(p=>p.trim()).filter(Boolean))];r(e,p=>({...p,tags:c.length>0?c:void 0}))};return xr(Dn,{title:"Basics",open:n,onToggle:i,children:[xr("div",{className:"bb-grid",children:[xr("div",{className:"bb-field",children:[xn("label",{className:"bb-label",children:"Label"}),xn("input",{className:"bb-input",value:t.label??"",onChange:c=>r(e,p=>({...p,label:c.target.value}))})]}),xr("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:c=>r(e,p=>({...p,type:c.target.value}))}),xn("datalist",{id:"binding-type-suggestions",children:Rx.map(c=>xn("option",{value:c},c))})]}),xr("div",{className:"bb-field",children:[xn("label",{className:"bb-label",children:"Status"}),xn("select",{className:"bb-select",value:t.status??"normal",onChange:c=>r(e,p=>({...p,status:c.target.value})),children:Ex.map(c=>xn("option",{value:c,children:c},c))})]}),xr("div",{className:"bb-field",children:[xn("label",{className:"bb-label",children:"Group"}),xn("input",{className:"bb-input",placeholder:"paint",value:o,onChange:c=>a(c.target.value),onBlur:d,onKeyDown:c=>{c.key==="Enter"&&c.currentTarget.blur()}})]}),xr("div",{className:"bb-field",children:[xn("label",{className:"bb-label",children:"Tags"}),xn("input",{className:"bb-input",placeholder:"exterior, configurable",value:l,onChange:c=>s(c.target.value),onBlur:u,onKeyDown:c=>{c.key==="Enter"&&c.currentTarget.blur()}})]})]}),xr("div",{className:"bb-checkboxRow",style:{marginTop:12},children:[xr("label",{className:"bb-checkbox",children:[xn("input",{type:"checkbox",checked:t.selectable??!1,onChange:c=>r(e,p=>({...p,selectable:c.target.checked}))}),"selectable"]}),xr("label",{className:"bb-checkbox",children:[xn("input",{type:"checkbox",checked:t.hoverable??!1,onChange:c=>r(e,p=>({...p,hoverable:c.target.checked}))}),"hoverable"]}),xr("label",{className:"bb-checkbox",children:[xn("input",{type:"checkbox",checked:t.visible??!1,onChange:c=>r(e,p=>({...p,visible:c.target.checked}))}),"visible"]})]})]})}import{useEffect as OP,useState as DP}from"react";var io=[{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."}],fc="__custom__";function ys(e){return io.find(t=>t.id===e)}var O3=io.filter(e=>e.handling==="viewer").map(e=>e.id),BP=new Set(["","New Action",...io.map(e=>e.label)]);function fp(e){return BP.has(e.trim())}function Ox(e,t){let n=Array.from({length:t.length+1},(i,r)=>r);for(let i=1;i<=e.length;i+=1){let r=[i];for(let o=1;o<=t.length;o+=1){let a=n[o-1]+(e[i-1]===t[o-1]?0:1);r[o]=Math.min(r[o-1]+1,n[o]+1,a)}n=r}return n[t.length]}function Dx(e){if(ys(e))return null;let t=e.trim().toLowerCase();if(!t)return null;let n=t.replace(/[^a-z0-9]/g,""),i=null;for(let r of io){let o=Math.min(Ox(t,r.id),Ox(n,r.id.replace(/[^a-z0-9]/g,"")));(!i||o<i.distance)&&(i={id:r.id,distance:o})}return i&&i.distance<=2?i.id:null}import{Fragment as IP,jsx as Qt,jsxs as rr}from"react/jsx-runtime";var Nx=io.filter(e=>e.handling==="viewer"),NP=io.filter(e=>e.handling==="host");function Ix({selectedItem:e,selectedBinding:t,open:n,onToggle:i,updateBinding:r}){let[o,a]=DP(new Set);OP(()=>{a(new Set)},[e]);let l=t.actions??[],s=(c,p)=>r(e,g=>({...g,actions:(g.actions??[]).map((f,v)=>v===c?p(f):f)})),d=c=>{r(e,p=>({...p,actions:(p.actions??[]).filter((g,f)=>f!==c)})),a(p=>{let g=new Set;return p.forEach(f=>{f<c?g.add(f):f>c&&g.add(f-1)}),g})},u=(c,p)=>a(g=>{let f=new Set(g);return p?f.add(c):f.delete(c),f});return rr(Dn,{title:"Actions",open:n,onToggle:i,children:[Qt("div",{className:"bb-actionList",children:l.map((c,p)=>{let g=ys(c.id),f=o.has(p)||!g,v=c.id.trim(),P=g?null:Dx(c.id),y=v.length>0&&l.some((h,m)=>m!==p&&h.id.trim()===v);return rr("div",{className:"bb-actionCard",children:[rr("div",{className:"bb-actionCardHeader",children:[rr("div",{className:"bb-actionCardTitle",children:["Action ",p+1]}),Qt("div",{className:"bb-actionCardMeta",children:c.type})]}),rr("div",{className:"bb-actionGrid",children:[rr("div",{className:"bb-field",children:[Qt("label",{className:"bb-label",children:"Action ID"}),rr("select",{className:"bb-select",value:f?fc:c.id,onChange:h=>{let m=h.target.value;if(m===fc){u(p,!0);return}u(p,!1);let S=ys(m);s(p,M=>({...M,id:m,label:S&&fp(M.label)?S.label:M.label}))},children:[Qt("optgroup",{label:"Handled by the viewer",children:Nx.map(h=>Qt("option",{value:h.id,children:h.id},h.id))}),Qt("optgroup",{label:"Handled by your app",children:NP.map(h=>Qt("option",{value:h.id,children:h.id},h.id))}),Qt("option",{value:fc,children:"Custom\u2026"})]})]}),f?rr("div",{className:"bb-field",children:[Qt("label",{className:"bb-label",children:"Custom action ID"}),Qt("input",{className:"bb-input",value:c.id,placeholder:"open-datasheet",onChange:h=>{u(p,!0),s(p,m=>({...m,id:h.target.value}))}})]}):null,rr("div",{className:"bb-field",children:[Qt("label",{className:"bb-label",children:"Label"}),Qt("input",{className:"bb-input",value:c.label,onChange:h=>s(p,m=>({...m,label:h.target.value}))})]}),g?Qt("span",{className:"bb-note",children:g.description}):v.length===0?Qt("span",{className:"bb-note",style:{color:"#fca5a5"},children:"An action ID is required, the button renders but can never be identified in onAction."}):rr("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.",P?rr(IP,{children:[" Did you mean ",Qt("button",{type:"button",className:"bb-linkButton",onClick:()=>{u(p,!1);let h=ys(P);s(p,m=>({...m,id:P,label:h&&fp(m.label)?h.label:m.label}))},children:P}),"?"]}):null]}),c.effects?.length?rr("span",{className:"bb-note",children:[c.effects.length," declarative effect",c.effects.length===1?"":"s",", execute with useViewerActions."]}):null,y?Qt("span",{className:"bb-note",style:{color:"#fcd34d"},children:"Another action on this binding uses the same ID, they will render as two identical buttons."}):null]}),Qt("div",{className:"bb-actionFooter",children:Qt("button",{type:"button",className:"bb-button bb-button--ghost bb-actionRemove",onClick:()=>d(p),children:"Remove Action"})})]},p)})}),Qt("div",{style:{marginTop:10},children:Qt("button",{type:"button",className:"bb-button",onClick:()=>{let c=Nx.find(p=>!l.some(g=>g.id===p.id));r(e,p=>({...p,actions:[...p.actions??[],{id:c?.id??"",label:c?.label??"New Action",type:"command"}]})),c||u(l.length,!0)},children:"Add Action"})})]})}import{MapPin as zP,Trash2 as jP}from"lucide-react";import{Fragment as VP,jsx as ir,jsxs as Hn}from"react/jsx-runtime";function zx({selectedBinding:e,open:t,onToggle:n,cameraState:i,formattedCameraState:r,savedCameraPosition:o,onSaveCameraPosition:a,onGoToSavedCamera:l,onClearSavedCamera:s,onResetView:d,onFitScene:u}){return Hn(Dn,{title:"Camera Position",open:t,onToggle:n,children:[Hn("div",{className:"se-waypointCard bb-cameraWaypoint",children:[ir("span",{className:"bb-cameraLiveBadge",children:"LIVE"}),Hn("div",{className:"se-waypointBody",children:[ir("div",{className:"bb-cameraWaypointLabel",children:"Current view"}),i?Hn(VP,{children:[Hn("div",{className:"se-waypointCoords",children:["pos ",r?.position]}),Hn("div",{className:"se-waypointCoords",children:["look ",r?.target]})]}):ir("div",{className:"se-waypointCoords",children:"Move the camera to see live position"})]})]}),Hn("div",{className:"bb-cameraControls bb-cameraControls--centered",children:[ir("button",{type:"button",className:"bb-button bb-button--primary",onClick:a,disabled:!i,children:"Save"}),ir("button",{type:"button",className:"bb-button bb-button--ghost",onClick:d,children:"Reset View"}),ir("button",{type:"button",className:"bb-button bb-button--ghost",onClick:u,children:"Fit Scene"})]}),o?.position&&o?.target&&Hn("div",{className:"se-waypointCard bb-cameraWaypoint",children:[ir("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(c=>c.toFixed(1)).join(", "),"]"]}),Hn("div",{className:"se-waypointCoords",children:["look [",o.target.map(c=>c.toFixed(1)).join(", "),"]"]})]}),Hn("div",{className:"se-waypointActions",children:[ir("button",{className:"se-waypointAction",onClick:l,title:"Fly camera to the saved position",children:ir(zP,{size:15})}),ir("button",{className:"se-waypointAction se-waypointAction--delete",onClick:s,title:"Delete saved position",children:ir(jP,{size:15})})]})]}),ir("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 FP,RotateCcw as UP}from"lucide-react";import{jsx as Dt,jsxs as yr}from"react/jsx-runtime";var jx=["X","Y","Z"];var GP=.1;function bp(e){let t=e%360;return t<0?t+360:t}function Vx(e){return bp(e*180/Math.PI)}function Fx(e){return e*Math.PI/180}function HP(e,t,n){let i=[...e],r=Vx(e[t]);return i[t]=Fx(bp(r+n)),i}function WP({value:e,min:t=-1/0,max:n=1/0,step:i=.1,disabled:r=!1,onChange:o,formatValue:a=s=>Number(s.toFixed(3)),label:l}){return Dt("div",{className:"bb-transformAxesGrid",children:jx.map((s,d)=>yr("div",{className:"bb-transformAxis",children:[Dt("span",{className:"se-axisStepperLabel bb-transformAxisLabel",children:s}),Dt("div",{className:"bb-transformAxisControl",children:Dt("input",{type:"number",className:"se-numberInput bb-transformNumberInput",step:i,min:t,max:n,value:a(e[d]),disabled:r,"aria-label":`${s} ${l?.toLowerCase()||""}`,onChange:u=>{let c=Number(u.target.value);if(Number.isFinite(c)){let p=Math.max(t,Math.min(n,c)),g=[...e];g[d]=p,o(g)}}})})]},s))})}function Ux({selectedItem:e,selectedBinding:t,open:n,onToggle:i,updateBinding:r,moveModeEnabled:o,onToggleMoveMode:a,transformSpace:l,onTransformSpaceChange:s,originalTransform:d}){let u=t.transform?.rotation??d?.rotation??[0,0,0],c=t.transform?.position??d?.position??[0,0,0],p=(h,m)=>{let S=h.transform?.rotation??d?.rotation??[0,0,0],M=h.transform?.position??d?.position??[0,0,0],T=h.transform?.scale??d?.scale??[1,1,1],E=d?.pivotLocal??[0,0,0],b=Mb(M,S,m,T,E,d?.rotationOrder??"XYZ");return{...h,transform:{...h.transform,position:b,rotation:m}}},g=(h,m)=>{e&&r(e,S=>{let M=S.transform?.rotation??d?.rotation??[0,0,0],T=HP(M,h,m);return p(S,T)})},f=(h,m)=>{e&&r(e,S=>{let T=[...S.transform?.rotation??d?.rotation??[0,0,0]];return T[h]=Fx(bp(m)),p(S,T)})},v=(h,m)=>{e&&r(e,S=>{let T=[...S.transform?.position??d?.position??[0,0,0]];return T[h]=m,{...S,transform:{...S.transform,position:T}}})},P=(h,m)=>{e&&v(h,c[h]+m)},y=()=>{!e||!d||r(e,h=>{let m={...h.transform};return delete m.position,delete m.rotation,{...h,transform:Object.keys(m).length>0?m:void 0}})};return yr(Dn,{title:"Move & Rotate",open:n,onToggle:i,tooltip:"Enable the transform gizmo to move or rotate the selected mesh on any axis. Rotation uses the object's visible center while exported position and rotation remain local GLTF transforms.",children:[yr("div",{className:"se-field",children:[yr("div",{className:"se-fieldLabel",children:[yr("span",{children:[Dt(FP,{size:14,style:{marginRight:6,verticalAlign:"-2px"}}),"Transform gizmo"]}),yr("label",{className:"se-switch","aria-label":"Toggle move mode",children:[Dt("input",{type:"checkbox",checked:o,onChange:h=>a(h.target.checked)}),Dt("span",{className:"se-switchTrack",children:Dt("span",{className:"se-switchThumb"})})]})]}),Dt("span",{className:"bb-note",children:"Select a mesh \xB7 drag the colored arrows or planes to move"})]}),yr("div",{className:"se-field",style:{marginTop:10},children:[Dt("div",{className:"se-fieldLabel",children:Dt("span",{children:"Axis space"})}),Dt("div",{className:"se-segmentedControl",children:["world","local"].map(h=>Dt("button",{type:"button",className:`se-segmentedOption ${l===h?"se-segmentedOption--active":""}`,onClick:()=>s(h),children:h},h))})]}),yr("div",{className:"se-field",style:{marginTop:10},children:[Dt("div",{className:"se-fieldLabel",children:Dt("span",{children:"Rotation (degrees)"})}),Dt("div",{className:"bb-transformAxesGrid",children:jx.map((h,m)=>{let S=Math.round(Vx(u[m]));return yr("div",{className:"bb-transformAxis",children:[Dt("span",{className:"se-axisStepperLabel bb-transformAxisLabel",children:h}),Dt("div",{className:"bb-transformAxisControl",children:Dt("input",{type:"number",className:"se-numberInput bb-transformNumberInput",step:1,min:0,max:359,value:S,disabled:!e,"aria-label":`${h} rotation in degrees`,onChange:M=>{let T=Number(M.target.value);Number.isFinite(T)&&f(m,T)}})})]},h)})})]}),yr("div",{className:"se-field",style:{marginTop:10},children:[Dt("div",{className:"se-fieldLabel",children:Dt("span",{children:"Position"})}),Dt(WP,{value:c,min:-1/0,max:1/0,step:GP,disabled:!e,label:"position",onChange:h=>{e&&r(e,m=>({...m,transform:{...m.transform,position:h}}))}})]}),yr("button",{type:"button",className:"bb-button bb-button--ghost",style:{marginTop:10,display:"inline-flex",alignItems:"center",gap:6},disabled:!e||!d,onClick:y,title:"Restore this node's position and rotation to what they were in the original model",children:[Dt(UP,{size:14}),"Restore original position & rotation"]})]})}import{useMemo as Hx,useState as KP}from"react";function $P(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 xp(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 XP(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 qP(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 YP(e){let t=XP(e);return{id:$P(e),modelObjectId:e,type:t,label:xp(e),status:"normal",selectable:!0,hoverable:!0,visible:!0,style:{},actions:qP(t),metrics:{},metadata:{}}}function bc(e){return Object.fromEntries(e.map(t=>[t,YP(t)]))}function Gx(e){let{nodesById:t}=Oo(e),n=[];for(let[i,r]of Object.entries(t)){let o=r;o.isMesh&&o.geometry&&r.name&&n.push(i)}return n.sort((i,r)=>i.localeCompare(r))}import{Fragment as JP,jsx as oo,jsxs as bi}from"react/jsx-runtime";function Wx({bindings:e,selectedItem:t,onSelect:n,onHover:i,isOpen:r=!0,onToggle:o}){let[a,l]=KP(""),s=Hx(()=>Object.keys(e),[e]),d=Hx(()=>{let u=a.trim().toLowerCase();return u?s.filter(c=>{let p=e[c];return c.toLowerCase().includes(u)||p.label?.toLowerCase().includes(u)||p.type.toLowerCase().includes(u)}):s},[e,s,a]);return bi("aside",{className:`bb-sidebar bb-sidebar--right ${r?"":"bb-sidebar--collapsed"}`,children:[bi("div",{className:"bb-header bb-header--sidebar",children:[!r&&oo("button",{type:"button",className:"bb-sidebarToggle",onClick:()=>o?.(!0),"aria-label":"Open scene nodes sidebar",title:"Open scene nodes",children:"\u2190"}),r&&bi(JP,{children:[bi("div",{children:[oo("div",{className:"bb-sectionKicker",children:"Scene Nodes"}),bi("div",{className:"bb-sectionHeading",children:[d.length," visible entries"]})]}),oo("button",{type:"button",className:"bb-sidebarToggle",onClick:()=>o?.(!1),"aria-label":"Close scene nodes sidebar",title:"Close scene nodes",children:"\u2192"})]})]}),r&&bi("section",{className:"bb-nodeList",children:[oo("div",{className:"bb-search",children:oo("input",{className:"bb-input",placeholder:"Search nodes, labels, or types",value:a,onChange:u=>l(u.target.value)})}),oo("div",{className:"bb-nodeItems",children:d.map(u=>{let c=e[u];return bi("button",{type:"button",className:`bb-nodeButton ${u===t?"bb-nodeButton--active":""}`,onClick:()=>n(u),onMouseEnter:()=>i?.(u),onMouseLeave:()=>i?.(null),children:[oo("span",{className:"bb-nodeName",children:u}),bi("span",{className:"bb-nodeMeta",children:[c.type,c.label===xp(u)?"":c.label||"\xB7 Untitled"]})]},u)})})]})]})}import{jsx as xc,jsxs as $x}from"react/jsx-runtime";function yp({title:e,label:t,open:n,onToggle:i,draft:r,error:o,example:a,onDraftChange:l,onCommit:s}){return xc(Dn,{title:e,open:n,onToggle:i,children:$x("div",{className:"bb-field",children:[xc("label",{className:"bb-label",children:t}),xc("textarea",{className:"bb-textarea",value:r,onChange:d=>l(d.target.value),onBlur:s}),o?xc("span",{className:"bb-status bb-status--error",children:o}):$x("span",{className:"bb-note",children:["Use a JSON object like ",a,"."]})]})})}function Xx(e,t){let n=new Map(e.animations.clips.map(o=>[o.sourceName,o])),i=t.map(({sourceName:o})=>n.get(o)??{sourceName:o,displayName:o,hidden:!1,loopMode:"repeat",speed:1}),r=e.animations.autoplayClip&&i.some(o=>o.sourceName===e.animations.autoplayClip&&!o.hidden)?e.animations.autoplayClip:null;return{clips:i,autoplayClip:r}}import{useCallback as yc,useReducer as QP,useRef as ZP}from"react";var ek=100;function tk(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(-ek),present:n,future:[]}}case"undo":{if(e.past.length===0)return e;let n=e.past[e.past.length-1];return{past:e.past.slice(0,-1),present:n,future:[e.present,...e.future]}}case"redo":{if(e.future.length===0)return e;let[n,...i]=e.future;return{past:[...e.past,e.present],present:n,future:i}}case"reset":return{past:[],present:t.value,future:[]}}}function vp(e,t=600){let[n,i]=QP(tk,{past:[],present:e,future:[]}),r=ZP(0),o=yc(d=>{let u=Date.now(),c=u-r.current<t;r.current=u,i({type:"set",updater:d,coalesce:c})},[t]),a=yc(()=>{r.current=0,i({type:"undo"})},[]),l=yc(()=>{r.current=0,i({type:"redo"})},[]),s=yc(d=>{r.current=0,i({type:"reset",value:d})},[]);return{value:n.present,setValue:o,undo:a,redo:l,reset:s,canUndo:n.past.length>0,canRedo:n.future.length>0}}import{strToU8 as nk}from"fflate";function qx(e){return JSON.stringify(e,null,2)}function Yx(e){return['import { defineObjectBindings } from "@liveroom-tech/react-immersive/utils";',"",`export const objectBindings = defineObjectBindings(${JSON.stringify(e,null,2)});`,""].join(`
|
|
25
|
-
`)}function
|
|
26
|
-
`)}function vs(e,t,n){zr(new Blob([t],{type:n}),e)}function wp(e){return JSON.stringify(e??{},null,2)}function Cp(e){return`[${e[0].toFixed(3)}, ${e[1].toFixed(3)}, ${e[2].toFixed(3)}]`}function rk(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 Qx(e){let t=new Set;for(let r of Object.values(e))for(let o of rk(r))t.add(o);let n=[],i=[];return await Promise.all(Array.from(t).map(async r=>{let o=tm(r);if(o)try{let a=await fetch(o);if(!a.ok)throw new Error(String(a.status));n.push({path:r,blob:await a.blob()})}catch{i.push(r)}})),{assets:n,failedPaths:i}}async function Sp(e,t,n,i,r){if(r.length===0){vs(e,t,n);return}let o={[e]:nk(t)};for(let l of r)o[l.path]=new Uint8Array(await l.blob.arrayBuffer());let a=await Ys(o);zr(new Blob([a],{type:"application/zip"}),i)}var Mp={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"]},Zx=Object.keys(Mp);function e0(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 Tp(e){if(e)return Object.values(e).some(e0)?e:void 0}function or(e,t){return e?Mp[t].some(n=>e0(e[n])):!1}function Pp(e){return{pbr:or(e,"pbr"),roughness:or(e,"roughness"),emission:or(e,"emission"),opacity:or(e,"opacity"),normalBump:or(e,"normalBump"),displacement:or(e,"displacement"),ao:or(e,"ao"),clearcoat:or(e,"clearcoat"),sheen:or(e,"sheen"),anisotropy:or(e,"anisotropy"),transmission:or(e,"transmission"),faces:or(e,"faces")}}function kp(e,t){if(t)return{...e,style:{...e.style,material:t}};if(!e.style)return e;let{material:n,...i}=e.style;return{...e,style:Object.keys(i).length>0?i:void 0}}function t0(e,t){if(!e)return;let n={...e};for(let i of Mp[t])delete n[i];return n}import{Fragment as ws,jsx as te,jsxs as Xe}from"react/jsx-runtime";var ak="/room.glb";function vc(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function a0(e,t){if(!vc(e)||!vc(t))return t??e;let n={...e};for(let[i,r]of Object.entries(t)){let o=n[i];n[i]=vc(o)&&vc(r)?a0(o,r):r}return n}function s0({licenseKey:e,licenseValidationUrl:t,dracoDecoderPath:n,ktx2TranscoderPath:i,meshopt:r,project:o,onProjectChange:a,projectChangeDebounceMs:l=350,onModelUpload:s,onEditLeaseChange:d}){let u=yn(null),c=yn(null),p=yn(null),[g,f]=et(o?.model.url??null),[v,P]=et(o?.model.name??""),[y,h]=et(o?.model??null),[m,S]=et(null),M=vp(o?.objectBindings??{}),T=M.value,E=M.setValue,[b,C]=et(!1),[x,k]=et(!1),[I,A]=et("Load the demo model or upload a GLB, GLTF, OBJ, FBX, or USDZ model to generate bindings."),[z,_]=et("default"),[V,F]=et(!1),[L,B]=et("{}"),[G,U]=et("{}"),[ae,xe]=et(null),[le,ge]=et(null),[ve,Te]=et(!1),[ne,ct]=et(!1),[Ee,Ae]=et(!1),[Be,je]=et({identity:!0,basics:!0,material:!1,actions:!1,camera:!1,transform:!1,metrics:!1,metadata:!1}),[Ve,_t]=et({pbr:!0,roughness:!1,emission:!1,opacity:!1,normalBump:!1,displacement:!1,ao:!1,clearcoat:!1,sheen:!1,anisotropy:!1,transmission:!1,faces:!1}),Le=O=>je(j=>({...j,[O]:!j[O]})),zt=O=>_t(j=>({...j,[O]:!j[O]})),[vt,Oe]=et("object"),[re,X]=et("General"),[q,Pe]=et("metalness"),[De,Se]=et(Pp()),fe=yn(null),[dt,Wt]=et(!1),[jt,Nn]=et(!0),[pn,we]=et(!0),[qe,it]=et(!1),[Re,wt]=et(null),[ut,Ct]=et(!1),[At,lr]=et("world"),ce=yn({}),R=vp(o?.sceneConfig??Ai),N=R.value,H=R.setValue,[Z,Y]=et(null),[se,oe]=et(null),tt=rc(e,t),ot=jb(tt.tier),be=_p(()=>({isInsideEditor:!0,activeTab:vt,activeSubTab:re,tier:ot,setActiveTab:Oe,setActiveSubTab:X}),[vt,re,ot]),Ne=yn(null),st=yn(0),ue=yn(0),pt=yn(o?`${o.id}:${o.revision}`:null),$t=yn(null),rn=yn(!1),Rt=yn(!1),It=yn(o?{modelUrl:o.model.url,bindings:o.objectBindings,sceneConfig:o.sceneConfig}:null),Ye=yn(o?{requestId:0,modelName:o.model.name??"model",modelUrl:o.model.url,storedBindings:o.objectBindings,streaming:!!o.model.tilesetUrl}:null),vr=yn(null),{cameraState:xt,resetView:so,focusObject:ha,fitScene:Wn,setCameraState:Br,handleCameraChange:_c,handleViewerReady:Ac}=ep(),lo=nn(O=>{Br({position:O.position,target:O.target,fov:xt?.fov??null,zoom:xt?.zoom??1,azimuthAngle:O.azimuthAngle,polarAngle:O.polarAngle},!0)},[Br,xt]),$n=tp(),St=m?T[m]??null:null,ma=St?.style?.material,cr=St?.cameraState,Qr=xt?{position:Cp(xt.position),target:Cp(xt.target)}:null,co=nn(O=>{H(j=>{let J=j.annotations.map(Ce=>Ce.id).join(","),me=O.map(Ce=>Ce.id).join(",");return J===me?j:{...j,annotations:O}})},[]),Ms=nn(O=>{Y(O?{annotation:O}:null)},[]);ao(()=>{if(!St){B("{}"),U("{}"),xe(null),ge(null);return}B(wp(St.metrics)),U(wp(St.metadata)),xe(null),ge(null)},[St]),ao(()=>{let O=Pp(ma);if(fe.current!==m){fe.current=m,Se(O);return}Se(j=>{let J=!1,me={...j};for(let Ce of Zx)O[Ce]&&!j[Ce]&&(me[Ce]=!0,J=!0);return J?me:j})},[m,ma]),ao(()=>()=>{Ne.current?.cleanup()},[]);let Zr=nn((O,j)=>{let J=bc(O);if(j){let me=new Map(Object.values(j).map(Ce=>[Ce.modelObjectId,Ce]));for(let Ce of O){let Mt=me.get(Ce);Mt&&(J[Ce]=Mt)}}return J},[]);ao(()=>{if(!o)return;let O=`${o.id}:${o.revision}`;if(pt.current===O)return;pt.current=O;let j=g!==o.model.url||y?.tilesetUrl!==o.model.tilesetUrl||y?.assetVersion!==o.model.assetVersion,J=T!==o.objectBindings,me=N!==o.sceneConfig;if((j||J||me)&&(Rt.current=!0),h(o.model),P(o.model.name??"model"),J){let Ce=$t.current;M.reset(Ce?Zr(Ce,o.objectBindings):o.objectBindings)}if(me&&R.reset(o.sceneConfig),j){let Ce=++ue.current;Ye.current={requestId:Ce,modelName:o.model.name??"model",modelUrl:o.model.url,storedBindings:o.objectBindings,streaming:!!o.model.tilesetUrl},vr.current=null,S(null),C(!0),f(o.model.url)}It.current={modelUrl:o.model.url,bindings:o.objectBindings,sceneConfig:o.sceneConfig}},[T,Zr,o,g,N,y,M,R]);let vi=yn(a);vi.current=a,ao(()=>{if(!o||!vi.current||!g)return;if(!rn.current){rn.current=!0;return}if(Ye.current)return;let O=It.current;if(g===o.model.url&&T===o.objectBindings&&N===o.sceneConfig||O!==null&&g===O.modelUrl&&T===O.bindings&&N===O.sceneConfig)return;if(Rt.current){Rt.current=!1;return}let j=window.setTimeout(()=>{vi.current?.({projectId:o.id,baseRevision:o.revision,model:{...y??o.model,url:g,name:v||o.model.name},objectBindings:T,sceneConfig:N},"local")},l);return()=>window.clearTimeout(j)},[T,v,g,o,l,y,N]),ao(()=>{let O=j=>{if(j.key.toLowerCase()!=="z"||!(j.metaKey||j.ctrlKey))return;let J=j.target,me=J?.tagName;if(me==="INPUT"||me==="TEXTAREA"||J?.isContentEditable)return;j.preventDefault();let Ce=vt==="scene"?R:M;j.shiftKey?Ce.redo():Ce.undo()};return window.addEventListener("keydown",O),()=>window.removeEventListener("keydown",O)},[vt,M,R]),ao(()=>{if(b||z==="default"||z==="success")return;F(!0);let O=window.setTimeout(()=>F(!1),4e3);return()=>window.clearTimeout(O)},[I,z,b]);let In=_p(()=>Object.keys(T),[T]),Rc=_p(()=>!m||!St?null:St.id.trim()?Object.entries(T).some(([J,me])=>J!==m&&me.id===St.id)?"Another binding already uses this ID.":null:"ID is required.",[T,m,St]),dr=(O,j)=>{E(J=>({...J,[O]:j(J[O])}))},ga=(O,j)=>{dr(O,J=>{let me=Tp(j(J.style?.material));return kp(J,me)})},Ec=(O,j,J)=>{ga(O,me=>({...me,[j]:J?{path:J}:void 0}))},zn=(O,j)=>{Se(J=>({...J,[O]:j})),!j&&m&&dr(m,J=>{let me=Tp(t0(J.style?.material,O));return kp(J,me)})},uo=nn((O,j,J)=>{let me=Gx(O),Ce=bc(me);if(J){let ht=new Map(Object.values(J).map(Fe=>[Fe.modelObjectId,Fe]));for(let Fe of me){let Pn=ht.get(Fe);Pn&&(Ce[Fe]=Pn)}}O.updateMatrixWorld(!0);let Mt={};for(let ht of me){let Fe=mr(O,ht);if(!Fe){Mt[ht]={position:[0,0,0],rotation:[0,0,0],scale:[1,1,1],pivotLocal:[0,0,0],rotationOrder:"XYZ"};continue}let Pn=dc(Fe);Mt[ht]={position:[Fe.position.x,Fe.position.y,Fe.position.z],rotation:[Fe.rotation.x,Fe.rotation.y,Fe.rotation.z],scale:[Fe.scale.x,Fe.scale.y,Fe.scale.z],pivotLocal:[Pn.x,Pn.y,Pn.z],rotationOrder:Fe.rotation.order}}ce.current=Mt,M.reset(Ce),S(me[0]??null),J||H(ht=>({...ht,annotations:[]})),A(`Generated ${me.length} bindings from ${j}.`),_("success"),C(!1)},[M,H]),Xn=(O,j,J,me)=>{let Ce=++ue.current;C(!0);let Mt=J?J/1048576:0;A(Mt>=100?`Reading ${j} (${Math.round(Mt)}MB \u2014 large file, this can take a while)...`:`Reading ${j} and generating starter bindings...`),_("default"),P(j),h(me??{url:O,name:j}),Y(null);let ht=vr.current;if(O===g&&ht?.url===O){Ye.current=null,uo(ht.scene,j);return}Ye.current={requestId:Ce,modelName:j,modelUrl:O,streaming:!!me?.tilesetUrl},f(O),M.reset({}),S(null)},wi=nn(O=>{let j=Ye.current;if(!(!j||j.requestId!==ue.current)){if(Ye.current=null,vr.current={url:j.modelUrl,scene:O},j.streaming){A(`Streaming ${j.modelName}.`),_("success"),C(!1);return}j.storedBindings&&(Rt.current=!0),uo(O,j.modelName,j.storedBindings)}},[uo,M]),hn=nn(O=>{let j=O.map(J=>J.name);j.length!==0&&($t.current=j,Rt.current=!0,M.reset(Zr(j,o?.objectBindings)),S(J=>J??j[0]??null),A(`Streaming ${j.length} bindable objects.`),_("success"),C(!1))},[Zr,M,o]),po=nn(O=>{let j=Ye.current;!j||j.requestId!==ue.current||(Ye.current=null,console.error(O),A(`Could not read ${j.modelName}. Make sure the file is a valid GLB, GLTF, OBJ, FBX, or USDZ asset.`),_("error"),C(!1))},[]),Ts=nn(O=>{$n.handleAnimationsReady(O);let j=O.clipDetails??O.clips.map(J=>({sourceName:J,duration:0}));H(J=>({...J,animations:Xx(J,j)}))},[$n,H]),Fp=async()=>{Ne.current?.cleanup(),Ne.current=null,await Xn(ak,"room.glb")},Ps=async O=>{if(s){try{C(!0),A(`Uploading ${O.name}...`),_("default");let J=await s(O);await Xn(J.url,J.name??O.name,O.size,J)}catch(J){C(!1),A(J instanceof Error?J.message:`Could not upload ${O.name}.`),_("error")}return}let j;try{j=await cl(O)}catch(J){A(J instanceof Error?J.message:"Could not read model file. Upload a .glb, .gltf, .obj, .fbx, .usdz, or .zip asset."),_("error");return}Ne.current?.cleanup(),Ne.current=j,await Xn(j.url,j.name,O.size,{url:j.url,name:j.name})},wr=async O=>{let j=O.target.files?.[0];j&&(await Ps(j),O.target.value="")},Ci=()=>{Ne.current?.cleanup(),Ne.current=null,vr.current=null,Ye.current=null,ce.current={},st.current=0,Te(!1),f(null),P(""),h(null),S(null),Y(null),M.reset({}),B("{}"),U("{}"),xe(null),ge(null),oe(null),Ct(!1),H(O=>({...O,animations:Ai.animations,annotations:[]})),A("Load the demo model or upload a GLB, GLTF, OBJ, FBX, or USDZ model to generate bindings."),_("default")},fa=()=>{u.current?.click()},ur=()=>{c.current?.click()},ho=async O=>{k(!0);try{let{assets:j,failedPaths:J}=await Qx(T);O==="json"?await Sp("objectBindings.json",qx(T),"application/json","objectBindings.zip",j):await Sp("objectBindings.ts",Yx(T),"text/typescript","objectBindings-ts.zip",j),J.length>0?(A(`Exported, but ${J.length} uploaded image${J.length===1?"":"s"} couldn't be bundled: ${J.join(", ")}.`),_("error")):j.length>0&&(A(`Exported with ${j.length} uploaded image${j.length===1?"":"s"} bundled into the zip.`),_("success"))}catch(j){let J=j instanceof Error?j.message:"Unknown export error.";A(`Failed to export bindings: ${J}`),_("error")}finally{k(!1)}},Si=async O=>{if(!In.length){A("Load a model before importing bindings."),_("error");return}let j;try{j=JSON.parse(await O.text())}catch{A(`${O.name} is not valid JSON.`),_("error");return}if(j===null||typeof j!="object"||Array.isArray(j)){A("Expected a JSON object mapping object IDs to bindings."),_("error");return}let J=new Map;for(let ht of Object.values(j))if(ht!==null&&typeof ht=="object"&&typeof ht.id=="string"&&typeof ht.type=="string"&&typeof ht.modelObjectId=="string"){let Fe=ht;J.set(Fe.modelObjectId,Fe)}if(J.size===0){A(`${O.name} doesn't look like an exported bindings file.`),_("error");return}let me={...T},Ce=0;for(let ht of Object.keys(me)){let Fe=J.get(ht);Fe&&(me[ht]=Fe,Ce++)}if(Ce===0){A(`None of the object IDs in ${O.name} match this model \u2014 nothing imported.`),_("error");return}E(me);let Mt=J.size-Ce;A(Mt>0?`Imported ${Ce} binding${Ce===1?"":"s"} from ${O.name} (${Mt} skipped \u2014 not in this model).`:`Imported ${Ce} binding${Ce===1?"":"s"} from ${O.name}.`),_("success")},mo=async O=>{let j=O.target.files?.[0];j&&(await Si(j),O.target.value="")},Mi=()=>{p.current?.click()},Or=async O=>{let j;try{j=JSON.parse(await O.text())}catch{A(`${O.name} is not valid JSON.`),_("error");return}if(j===null||typeof j!="object"||Array.isArray(j)){A("Expected a JSON object with scene config sections."),_("error");return}let J=["model","camera","lighting","wireframe","shadows","environment","background","groundShadows","postProcessing","animations","annotations","cinematic"],me=j,Ce=J.filter(Mt=>me[Mt]!==void 0);if(Ce.length===0){A(`${O.name} doesn't look like an exported scene config file.`),_("error");return}H(Mt=>{let ht={...Mt};for(let Fe of Ce)ht[Fe]=a0(Mt[Fe],me[Fe]);return ht}),A(`Imported ${Ce.length} section${Ce.length===1?"":"s"} from ${O.name}.`),_("success")},ks=async O=>{let j=O.target.files?.[0];j&&(await Or(j),O.target.value="")},Lc=O=>{O.preventDefault(),O.stopPropagation(),!(b||g)&&(st.current+=1,Te(!0))},ba=O=>{O.preventDefault(),O.stopPropagation(),!(b||g)&&(O.dataTransfer.dropEffect="copy",Te(!0))},_s=O=>{O.preventDefault(),O.stopPropagation(),!(b||g)&&(st.current=Math.max(0,st.current-1),st.current===0&&Te(!1))},Ti=async O=>{if(O.preventDefault(),O.stopPropagation(),st.current=0,Te(!1),b||g)return;let j=O.dataTransfer.files?.[0];j&&await Ps(j)},xa=(O,j,J)=>{if(!m)return;let me;try{me=JSON.parse(j)}catch{J("Invalid JSON");return}if(me===null||typeof me!="object"||Array.isArray(me)){J("Expected a JSON object");return}if(O==="metrics"&&Object.values(me).some(Mt=>typeof Mt!="number"||!Number.isFinite(Mt))){J("Metrics values must be numbers");return}dr(m,Ce=>({...Ce,[O]:me})),J(null)},As=nn(O=>{if(!O){S(null);return}let j=Object.entries(T).find(([J,me])=>me===O||J===O.modelObjectId||me.modelObjectId===O.modelObjectId)?.[0]??null;S(j)},[T]),Rs=nn(async O=>{S(O),oe(null),await ha(O)},[ha]),Bc=nn(()=>{if(!m||!xt)return;let O={position:xt.position,target:xt.target,...xt.fov!=null?{fov:xt.fov}:{},zoom:xt.zoom};dr(m,j=>({...j,cameraState:O}))},[m,xt]),Oc=nn(()=>{!cr?.position||!cr?.target||Br({position:cr.position,target:cr.target,fov:cr.fov??xt?.fov??null,zoom:cr.zoom??xt?.zoom??1},!0)},[cr,Br,xt]),Es=nn(()=>{m&&dr(m,O=>({...O,cameraState:void 0}))},[m]),Pi=nn(async()=>{await so()},[so]),Ls=nn(async()=>{await Wn()},[Wn]),Bs=nn(O=>{wt(O),it(!0)},[]),Dr=nn(()=>{it(!1),wt(null)},[]),go=nn(()=>{if(Re==="bindings"){if(!In.length){Dr();return}let O=bc(In);M.reset(O),S(In[0]??null),A("Object bindings reset to default values."),_("success")}else Re==="scene"&&(R.reset(Ai),A("Scene config reset to default values."),_("success"));Dr()},[Re,In,M,R,Dr]);return tt.status==="checking"?te("div",{className:"bb-root bb-root--licenseChecking",children:te(Li,{title:"Verifying License",message:"Checking your license key..."})}):tt.status==="invalid"?te("div",{className:"bb-root bb-root--licenseInvalid",children:te(Li,{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."})}):Xe(Gu.Provider,{value:be,children:[Xe("div",{className:"bb-root",children:[te("input",{ref:u,type:"file",accept:ll,className:"bb-hiddenInput",onChange:wr,disabled:b}),te("input",{ref:c,type:"file",accept:".json,application/json",className:"bb-hiddenInput",onChange:mo,disabled:b}),te("input",{ref:p,type:"file",accept:".json,application/json",className:"bb-hiddenInput",onChange:ks,disabled:b}),Xe("aside",{className:`bb-sidebar bb-sidebar--left ${ne?"bb-sidebar--collapsed":""}`,children:[Xe("div",{className:"bb-header bb-header--sidebar",children:[!ne&&te("h1",{className:"bb-title",children:"Binding Builder"}),te("button",{type:"button",className:"bb-sidebarToggle",onClick:()=>ct(O=>!O),"aria-label":ne?"Open editor sidebar":"Collapse editor sidebar",title:ne?"Open editor":"Collapse editor",children:ne?"\u2192":"\u2190"})]}),!ne&&Xe(ws,{children:[Xe("div",{className:"bb-tabRow",children:[te("button",{type:"button",className:`bb-tab ${vt==="object"?"bb-tab--active":""}`,onClick:()=>Oe("object"),children:"Object"}),te("button",{type:"button",className:`bb-tab ${vt==="scene"?"bb-tab--active":""}`,onClick:()=>Oe("scene"),children:"Scene"})]}),te("section",{className:"bb-editor",children:vt==="scene"?te(ws,{children:g?te(dp,{config:N,onChange:H,activeSubTab:re,onActiveSubTabChange:X,cameraState:re==="Cinematic"&&xt?{position:xt.position,target:xt.target,azimuthAngle:xt.azimuthAngle,polarAngle:xt.polarAngle}:null,onPreviewWaypoint:lo,animationClipDetails:$n.clipDetails,animationPlayback:$n}):te("div",{className:"bb-emptyEditor",children:"Upload a model to edit its scene settings."})}):!St||!m?te("div",{className:"bb-emptyEditor",children:"Select a generated node binding to edit its values."}):Xe(ws,{children:[te("div",{className:"bb-editorHeader",children:Xe("div",{children:[te("div",{className:"bb-sectionKicker",children:"Editing Binding"}),te("h2",{className:"bb-editorTitle",children:St.label||m}),Xe("div",{className:"bb-editorMeta",children:[te("span",{children:St.type}),te("span",{children:St.modelObjectId})]})]})}),te(Ax,{selectedItem:m,selectedBinding:St,open:Be.identity,onToggle:()=>Le("identity"),updateBinding:dr,idError:Rc}),te(Bx,{selectedItem:m,selectedBinding:St,open:Be.basics,onToggle:()=>Le("basics"),updateBinding:dr}),Xe(Dn,{title:"Material",open:Be.material,onToggle:()=>Le("material"),tooltip:"Edit the selected object's base material, textures, and surface properties.",children:[te(_x,{disabled:!m,onApply:O=>m&&ga(m,j=>({...j,...O}))}),te(Px,{selectedItem:m,selectedMaterial:ma,pbrWorkflow:q,onPbrWorkflowChange:Pe,openMaterialPanels:Ve,materialPanelEnabled:De,onToggleMaterialPanel:zt,onSetMaterialPanelState:zn,updateSelectedMaterial:ga,setSelectedTexturePath:Ec})]}),te(Ix,{selectedItem:m,selectedBinding:St,open:Be.actions,onToggle:()=>Le("actions"),updateBinding:dr}),te(zx,{selectedBinding:St,open:Be.camera,onToggle:()=>Le("camera"),cameraState:xt,formattedCameraState:Qr,savedCameraPosition:cr,onSaveCameraPosition:Bc,onGoToSavedCamera:Oc,onClearSavedCamera:Es,onResetView:Pi,onFitScene:Ls}),te(Ux,{selectedItem:m,selectedBinding:St,open:Be.transform,onToggle:()=>Le("transform"),updateBinding:dr,moveModeEnabled:ut,onToggleMoveMode:Ct,transformSpace:At,onTransformSpaceChange:lr,originalTransform:ce.current[m]??null}),te(yp,{title:"Metrics",label:"Metrics JSON",open:Be.metrics,onToggle:()=>Le("metrics"),draft:L,error:ae,example:'{"area": 42}',onDraftChange:B,onCommit:()=>xa("metrics",L,xe)}),te(yp,{title:"Metadata",label:"Metadata JSON",open:Be.metadata,onToggle:()=>Le("metadata"),draft:G,error:le,example:'{"room": "kitchen"}',onDraftChange:U,onCommit:()=>xa("metadata",G,ge)})]})}),vt==="object"&&Xe("div",{className:"bb-toolbar",children:[Xe("div",{className:"bb-toolbarGroup",children:[te("button",{type:"button",className:"bb-iconButton",disabled:!M.canUndo,onClick:M.undo,title:"Undo (Cmd/Ctrl+Z)",children:te(r0,{size:16})}),te("button",{type:"button",className:"bb-iconButton",disabled:!In.length,onClick:()=>Bs("bindings"),title:"Reset object bindings to default",children:te(o0,{size:16})}),te("button",{type:"button",className:"bb-iconButton",disabled:!M.canRedo,onClick:M.redo,title:"Redo (Cmd/Ctrl+Shift+Z)",children:te(n0,{size:16})})]}),te("div",{className:"bb-toolbarDivider"}),Xe("button",{type:"button",className:"bb-button bb-button--ghost",disabled:!In.length||b,onClick:ur,title:"Re-apply a previously exported objectBindings.json onto this model",children:[te(i0,{size:14}),"Import"]}),te("div",{className:"bb-toolbarDivider"}),te(mp,{disabled:!In.length||x,exporting:x,onExportJson:()=>ho("json"),onExportTs:()=>ho("ts")})]}),vt==="scene"&&Xe("div",{className:"bb-toolbar",children:[Xe("div",{className:"bb-toolbarGroup",children:[te("button",{type:"button",className:"bb-iconButton",disabled:!R.canUndo,onClick:R.undo,title:"Undo (Cmd/Ctrl+Z)",children:te(r0,{size:16})}),te("button",{type:"button",className:"bb-iconButton",onClick:()=>Bs("scene"),title:"Reset scene config to default",children:te(o0,{size:16})}),te("button",{type:"button",className:"bb-iconButton",disabled:!R.canRedo,onClick:R.redo,title:"Redo (Cmd/Ctrl+Shift+Z)",children:te(n0,{size:16})})]}),te("div",{className:"bb-toolbarDivider"}),Xe("button",{type:"button",className:"bb-button bb-button--ghost",disabled:!In.length||b,onClick:Mi,title:"Re-apply a previously exported sceneConfig.json",children:[te(i0,{size:14}),"Import"]}),te("div",{className:"bb-toolbarDivider"}),te(mp,{disabled:!In.length||b,onExportJson:()=>vs("sceneConfig.json",Kx(N),"application/json"),onExportTs:()=>vs("sceneConfig.ts",Jx(N),"text/typescript")})]})]})]}),Xe("main",{className:"bb-previewShell",children:[Xe("div",{className:"bb-previewHeader",children:[Xe("div",{className:"bb-previewToggles",children:[Xe("label",{className:"bb-checkbox bb-checkbox--compact",style:{color:"black"},children:[te("input",{type:"checkbox",checked:dt,onChange:O=>Wt(O.target.checked)}),"Zoom on selected"]}),Xe("label",{className:"bb-checkbox bb-checkbox--compact",style:{color:"black"},children:[te("input",{type:"checkbox",checked:jt,onChange:O=>Nn(O.target.checked)}),"Highlight on hover"]}),Xe("label",{className:"bb-checkbox bb-checkbox--compact",style:{color:"black"},children:[te("input",{type:"checkbox",checked:pn,onChange:O=>we(O.target.checked)}),"Camera controller"]})]}),Xe("div",{className:"bb-previewControlsColumn",children:[Xe("div",{className:"bb-previewControls",children:[te("div",{className:"bb-previewMeta",children:te("span",{children:m?`Focused: ${m}`:"Select a node to inspect it"})}),g&&te("button",{type:"button",className:"bb-button bb-button--ghost bb-removeModelButton",onClick:Ci,children:"Remove model"})]}),g&&te("div",{className:"bb-moveHint",children:ut?te(ws,{children:"Select a mesh \xB7 drag the colored arrows, planes, or rings"}):Xe(ws,{children:[te("kbd",{children:"W"}),te("kbd",{children:"A"}),te("kbd",{children:"S"}),te("kbd",{children:"D"})," move \xB7 ",te("kbd",{children:"Space"}),"/",te("kbd",{children:"C"})," up \xB7 down \xB7 drag to look"]})})]})]}),Xe("div",{className:"bb-preview",children:[te(Jo,{visible:b||V,message:I,tone:z,spinner:b}),g?te(hc,{modelUrl:g,tilesetUrl:y?.tilesetUrl,objectBindings:T,selectedObject:St,onObjectSelect:As,onObjectBindingsChange:E,onObjectEditLeaseChange:(O,j)=>d?.(O.modelObjectId||O.id,j),showObjectBindingDataPanel:!1,showSceneObjectsPanel:!1,onCameraChange:_c,onViewerReady:Ac,onAnnotationsChange:co,activeAnnotation:Z?.annotation??null,onActiveAnnotationChange:Ms,onAnimationsReady:Ts,onModelLoaded:wi,onLoadError:po,onObjectCatalog:hn,licenseKey:e,licenseValidationUrl:t,dracoDecoderPath:n,ktx2TranscoderPath:i,meshopt:r,sceneConfig:N,onSceneConfigChange:H,renderMode:"always",preserveDrawingBuffer:!0,disableZoom:!1,zoomOnSelected:dt,highlightOnHover:jt,enableCameraControls:pn,moveModeEnabled:ut,objectTransformSpace:At,enableKeyboardNavigation:!0,showViewGizmo:!0,panelHoveredObject:jt?se:null,showLoadingOverlay:!1}):te("div",{className:`bb-previewPlaceholder ${ve?"bb-previewPlaceholder--dragActive":""}`,onDragEnter:Lc,onDragOver:ba,onDragLeave:_s,onDrop:Ti,children:Xe("div",{children:[te("div",{children:"Upload a GLB, GLTF, OBJ, FBX, or USDZ model, or drag a supported model/ZIP bundle here to generate editable object bindings."}),te("button",{type:"button",className:"bb-previewPlaceholderButton",onClick:fa,disabled:b,children:b?"Loading model...":"Upload"})]})})]})]}),te(Wx,{bindings:T,selectedItem:m,onSelect:Rs,onHover:O=>{if(!O){oe(null);return}oe(T[O]??null)},isOpen:!Ee,onToggle:O=>Ae(!O)})]}),qe&&te("div",{className:"bb-reset-overlay",onClick:Dr,children:Xe("div",{className:"bb-reset-dialog",onClick:O=>O.stopPropagation(),children:[Xe("div",{className:"bb-reset-header",children:[Xe("h3",{className:"bb-reset-title",children:[te(ok,{size:20,className:"bb-icon-warning"}),"Confirm Reset"]}),te("button",{className:"bb-reset-close",onClick:Dr,children:te(ik,{size:20})})]}),Xe("div",{className:"bb-reset-body",children:[Xe("p",{className:"bb-reset-message",children:["Are you sure you want to reset"," ",te("strong",{children:Re==="bindings"?"Object Bindings":"Scene Config"}),"?"]}),te("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."}),te("p",{className:"bb-reset-warning",children:"This action cannot be undone!"})]}),Xe("div",{className:"bb-reset-footer",children:[te("button",{className:"bb-reset-btn",onClick:Dr,children:"Cancel"}),te("button",{className:"bb-reset-btn-danger",onClick:go,children:"Yes, Reset"})]})]})})]})}import{useRef as xi,useState as Zt,useCallback as Tn,useEffect as ar,useMemo as wc,Component as sk,Suspense as Ap}from"react";import{CameraControls as lk,Environment as ck}from"@react-three/drei";import{useFrame as h0,useThree as ua}from"@react-three/fiber";import{Canvas as dk}from"@react-three/fiber";import{Box3 as uk,MeshStandardMaterial as pk,PerspectiveCamera as hk,Vector3 as mk}from"three";import{SkeletonUtils as gk}from"three-stdlib";import{X as Op,Check as m0,Settings as fk,ChevronDown as bk,Boxes as xk,Trash2 as yk,Upload as Rp,AlertTriangle as vk}from"lucide-react";import{Fragment as p0,jsx as K,jsxs as Qe}from"react/jsx-runtime";var l0={color:"#93c5fd",intensity:.05},wk=["apartment","city","dawn","forest","lobby","night","park","studio","sunset","warehouse"];function Ck(e){return!!(e&&"isMesh"in e&&e.isMesh)}function c0(e,t){Array.isArray(e)?e.forEach(t):t(e)}function Sk(e,t){if(!t)return;let n=t.camera;if(!(n instanceof hk))return;let i=new uk().setFromObject(e).getSize(new mk).length();!Number.isFinite(i)||i<=0||(n.near=i/100,n.far=i*100,n.updateProjectionMatrix(),t.maxDistance=i*10)}var Bp=class extends sk{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 Mk({url:e,format:t,dracoDecoderPath:n,ktx2TranscoderPath:i,meshopt:r,hiddenKeys:o,selectedKey:a,panelHoveredKey:l,nodeRefsOut:s,onMeshesReady:d,onModelLoaded:u,onMeshClick:c,highlightOnHover:p}){let{scene:g}=hl(e,{dracoDecoderPath:n,ktx2TranscoderPath:i,meshopt:r},t),f=ua(x=>x.invalidate),{setCanvasCursor:v,restoreCanvasCursor:P}=Cl(),[y,h]=Zt(null),m=wc(()=>gk.clone(g),[g]),S=wc(()=>{let x={};return m.traverse(k=>{if(!Ck(k))return;let I=k.name||k.uuid;x[I]={key:I,label:k.name||k.type,ref:k}}),x},[m]),M=wc(()=>{let x={};for(let[k,{ref:I}]of Object.entries(S)){let z=(Array.isArray(I.material)?I.material:[I.material]).map(_=>{let F=(Do(_)??new pk).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[k]=Array.isArray(I.material)?z:z[0]}return x},[S]);ar(()=>()=>{Object.values(M).forEach(x=>c0(x,k=>k.dispose()))},[M]);let T=xi(null);ar(()=>{T.current!==e&&(T.current=e,m.updateWorldMatrix(!0,!0),Ga(m),d(S),u(m))},[e,m,S,d,u]),ar(()=>{let x=new AbortController;return Hs(m,x.signal),()=>{x.abort(),Ws(m)}},[m]);let E=wc(()=>!Gs(m),[m]);ar(()=>{for(let[x,{ref:k}]of Object.entries(S))s.current[x]=k},[S,s]),ar(()=>{!p&&y!==null&&(h(null),P())},[p,y,P]),ar(()=>{for(let[x,{ref:k}]of Object.entries(S)){k.visible=!o.has(x);let I=M[x];if(!I)continue;k.material=I;let A=p&&y===x,z=p&&l===x;c0(I,_=>{if(_.color.copy(_.userData.baseColor),_.map=_.userData.baseMap??null,_.emissive.copy(_.userData.baseEmissive),_.emissiveMap=_.userData.baseEmissiveMap??null,_.emissiveIntensity=_.userData.baseEmissiveIntensity,z||A){let V=!!_.userData.baseEmissiveMap;_.emissive.set(l0.color),_.emissiveIntensity=V?_.userData.baseEmissiveIntensity:l0.intensity}_.needsUpdate=!0})}f()},[S,M,y,a,l,p,o,f]);let b=x=>{let k=x;for(;k;){let I=k.name||k.uuid;if(S[I])return I;k=k.parent}return null},C=E?{onClick:x=>{let k=b(x.object);k&&(x.stopPropagation(),c(k))},...p?{onPointerOver:x=>{let k=b(x.object);k&&(x.stopPropagation(),v("pointer"),h(k))},onPointerOut:x=>{x.stopPropagation(),P(),h(null)}}:{}}:{};return K("primitive",{object:m,...C})}function Tk({scene:e,controlsRef:t,refitOnResize:n,onInitialFitComplete:i}){let r=xi(!1),o=ua(s=>s.invalidate),a=ua(s=>s.size),l=xi(null);return ar(()=>{r.current=!1,o()},[o,e]),h0(()=>{if(!r.current){if(!e||!t.current){o();return}r.current=!0,Sk(e,t.current),t.current.fitToBox(e,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5}).catch(()=>{}).finally(i)}}),ar(()=>{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)}},[a.width,a.height,n]),null}function Pk({exposure:e}){let t=ua(i=>i.gl),n=ua(i=>i.invalidate);return ar(()=>{t.toneMappingExposure=e,n()},[t,e,n]),null}function kk({enabled:e,controlsRef:t}){let n=ua(i=>i.invalidate);return h0((i,r)=>{!e||!t.current||(t.current.rotate(r*.2,0,!1),n())}),null}function Cc(e){return Array.from(e.types).includes("Files")}function d0({label:e,checked:t,onChange:n}){return Qe("div",{className:"env-row",children:[K("span",{className:"env-row__label",children:e}),K("div",{className:"env-row__value",children:K("button",{className:"env-checkbox-btn",onClick:()=>n(!t),children:K("span",{className:`env-checkbox${t?" env-checkbox--checked":""}`,children:t&&K(m0,{size:9,strokeWidth:2,color:"white"})})})})]})}function Ep({label:e,value:t,onChange:n}){return Qe("div",{className:"env-row",children:[K("span",{className:"env-row__label",children:e}),K("div",{className:"env-row__value",children:Qe("div",{className:"env-color-swatch",style:{background:t},children:[K("span",{className:"env-color-swatch__hex",children:t}),K("input",{type:"color",className:"env-color-swatch__input",value:t,onChange:i=>n(i.target.value)})]})})]})}function Lp({label:e,value:t,min:n,max:i,step:r,onChange:o}){return Qe("div",{className:"env-row",children:[K("span",{className:"env-row__label",children:e}),Qe("div",{className:"env-row__value env-row__value--slider",children:[K("input",{type:"range",className:"env-slider",min:n,max:i,step:r,value:t,onChange:a=>o(Number(a.target.value))}),K("span",{className:"env-slider__value",children:t.toFixed(2)})]})]})}function _k({label:e,value:t,options:n,onChange:i}){return Qe("div",{className:"env-row",children:[K("span",{className:"env-row__label",children:e}),K("div",{className:"env-row__value",children:K("select",{className:"env-select",value:t,onChange:r=>i(r.target.value),children:n.map(r=>K("option",{value:r,children:r},r))})})]})}function u0({title:e,children:t}){let[n,i]=Zt(!1);return Qe("div",{className:"env-section",children:[Qe("button",{className:"env-section__header",onClick:()=>i(r=>!r),children:[K(bk,{size:12,strokeWidth:2,className:`env-section__chevron${n?" env-section__chevron--collapsed":""}`}),K("span",{children:e})]}),!n&&K("div",{className:"env-section__body",children:t})]})}function Ak({isOpen:e,onToggle:t,settings:n,onChange:i}){return Qe("div",{className:`left-panel-wrapper ${e?"left-panel-wrapper--open":"left-panel-wrapper--closed"}`,children:[!e&&K("button",{className:"side-panel__open-btn side-panel__open-btn--left",onClick:()=>t(!0),children:K(fk,{size:20,strokeWidth:1.8})}),Qe("div",{className:`side-panel side-panel--left ${e?"side-panel--open-left":"side-panel--closed-left"}`,"aria-hidden":!e,children:[K("div",{className:"side-panel__header",children:Qe("div",{className:"side-panel__header-top",children:[K("span",{className:"side-panel__eyebrow",children:"Scene Settings"}),K("button",{className:"side-panel__close-btn",onClick:()=>t(!1),title:"Close",children:K(Op,{size:12,strokeWidth:1.6})})]})}),Qe("div",{className:"env-controls",children:[Qe(u0,{title:"Background",children:[K(d0,{label:"Background",checked:n.backgroundEnabled,onChange:r=>i("backgroundEnabled",r)}),K(Ep,{label:"Background Color",value:n.backgroundColor,onChange:r=>i("backgroundColor",r)}),K(_k,{label:"Environment",value:n.envPreset,options:wk,onChange:r=>i("envPreset",r)}),K(d0,{label:"Auto Rotate",checked:n.autoRotate,onChange:r=>i("autoRotate",r)})]}),Qe(u0,{title:"Lighting",children:[K(Lp,{label:"Exposure",value:n.exposure,min:0,max:2,step:.05,onChange:r=>i("exposure",r)}),K(Lp,{label:"Ambient Light Intensity",value:n.ambientIntensity,min:0,max:3,step:.05,onChange:r=>i("ambientIntensity",r)}),K(Ep,{label:"Ambient Light Color",value:n.ambientColor,onChange:r=>i("ambientColor",r)}),K(Lp,{label:"Direct Light Intensity",value:n.directionalIntensity,min:0,max:5,step:.05,onChange:r=>i("directionalIntensity",r)}),K(Ep,{label:"Direct Light Color",value:n.directionalColor,onChange:r=>i("directionalColor",r)})]})]})]})]})}function Rk({meshKeys:e,hiddenKeys:t,selectedKey:n,isOpen:i,onToggle:r,onFocus:o,onHover:a,onToggleVisibility:l}){let[s,d]=Zt(""),[u,c]=Zt(null),p=Object.values(e).filter(g=>g.label.toLowerCase().includes(s.toLowerCase()));return Qe("div",{className:`right-panel-wrapper ${i?"right-panel-wrapper--open":"right-panel-wrapper--closed"}`,children:[!i&&K("button",{className:"side-panel__open-btn",onClick:()=>r(!0),children:K(xk,{size:20,strokeWidth:1.8})}),Qe("div",{className:`side-panel ${i?"side-panel--open":"side-panel--closed"}`,"aria-hidden":!i,children:[Qe("div",{className:"side-panel__header",children:[Qe("div",{className:"side-panel__header-top",children:[K("span",{className:"side-panel__eyebrow",children:"SCENE OBJECTS"}),K("button",{className:"side-panel__close-btn",onClick:()=>r(!1),title:"Close",children:K(Op,{size:12,strokeWidth:1.6})})]}),Qe("p",{className:"side-panel__title",children:[p.length," objects"]})]}),K("div",{className:"side-panel__search-wrap",children:K("input",{className:"side-panel__search",type:"text",placeholder:"Search objects",value:s,onChange:g=>d(g.target.value)})}),K("div",{className:"side-panel__list",children:p.map(({key:g,label:f})=>{let v=!t.has(g),P=n===g,y=u===g;return Qe("div",{onClick:()=>o(g),onMouseEnter:()=>{c(g),a(g)},onMouseLeave:()=>{c(null),a(null)},className:["side-panel__row",y?"side-panel__row--hovered":"",P?"side-panel__row--selected":""].filter(Boolean).join(" "),children:[K("span",{className:`side-panel__label${y||P?" side-panel__label--hovered":""}`,children:f}),K("button",{className:"side-panel__vis-btn",title:v?"Hide":"Show",onClick:h=>{h.stopPropagation(),l(g)},children:K("span",{className:`side-panel__checkbox${v?" side-panel__checkbox--checked":""}`,children:v&&K(m0,{size:9,strokeWidth:5,color:"white"})})})]},g)})})]})]})}function g0({modelUrl:e,modelFormat:t,dracoDecoderPath:n,ktx2TranscoderPath:i,meshopt:r=!0,backgroundColor:o="#1a1a1a",showSceneObjectsPanel:a=!0,showSceneSettingsPanel:l=!0,enableModelUpload:s=!1,zoomOnSelected:d=!1,highlightOnHover:u=!1,showLoadingOverlay:c=!0,refitOnResize:p=!0,backgroundEnabled:g=!1,autoRotate:f=!1,envPreset:v="city",exposure:P=1,ambientIntensity:y=.6,ambientColor:h="#ffffff",directionalIntensity:m=1.2,directionalColor:S="#ffffff",onModelLoaded:M,onLoadError:T}){let E=xi(null),b=xi({}),C=xi(null),x=xi(null),k=xi(0),[I,A]=Zt(null),[z,_]=Zt(null),[V,F]=Zt(!1),[L,B]=Zt({}),[G,U]=Zt(new Set),[ae,xe]=Zt(null),[le,ge]=Zt(null),[ve,Te]=Zt(null),[ne,ct]=Zt(null),[Ee,Ae]=Zt(!1),[Be,je]=Zt(!1),[Ve,_t]=Zt(!1),[Le,zt]=Zt(!1),[vt,Oe]=Zt(()=>typeof window>"u"?!0:window.innerWidth>900),[re,X]=Zt(()=>typeof window>"u"?!0:window.innerWidth>900),[q,Pe]=Zt({backgroundEnabled:g,backgroundColor:o,autoRotate:f,envPreset:v,exposure:P,ambientIntensity:y,ambientColor:h,directionalIntensity:m,directionalColor:S}),De=s?ve:e,Se=Tn(()=>{A(null),_(null),F(!1),B({}),U(new Set),xe(null),ge(null),Ae(!1),_t(!1)},[]),fe=Tn(()=>{x.current?.cleanup(),x.current=null},[]),dt=Tn(()=>{fe(),Te(null),ct(null),Se(),Pe({backgroundEnabled:g,backgroundColor:o,autoRotate:f,envPreset:v,exposure:P,ambientIntensity:y,ambientColor:h,directionalIntensity:m,directionalColor:S})},[h,y,f,o,g,S,m,v,P,Se,fe]),Wt=Tn(async ce=>{je(!0);try{let R=await cl(ce);fe(),x.current=R,Te(R.url),ct(R.name),Se()}catch(R){Ae(!0),T?.(R)}finally{je(!1)}},[T,Se,fe]),jt=Tn(ce=>{let R=ce?.[0];R&&Wt(R)},[Wt]);ar(()=>()=>{fe()},[fe]);let Nn=Tn((ce,R)=>{Pe(N=>({...N,[ce]:R}))},[]);ar(()=>{Pe(ce=>({...ce,backgroundColor:o}))},[o]),ar(()=>{Se()},[De,Se]);let pn=Tn(ce=>{B(ce),U(new Set),xe(null)},[]),we=Tn(ce=>{A(ce),Ae(!1);let R=Ra(ce);_(R>Ei?R:null),F(!1),M?.(ce)},[M]),qe=Tn(ce=>{Ae(!0),T?.(ce)},[T]),it=Tn(ce=>{if(xe(ce),!d)return;let R=b.current[ce];!R||!E.current||E.current.fitToBox(R,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5}).catch(()=>{})},[d]),Re=Tn(ce=>{U(R=>{let N=new Set(R);return N.has(ce)?N.delete(ce):N.add(ce),N})},[]),wt=Tn(ce=>{!s||!Cc(ce.dataTransfer)||(ce.preventDefault(),ce.stopPropagation(),k.current+=1,zt(!0))},[s]),ut=Tn(ce=>{!s||!Cc(ce.dataTransfer)||(ce.preventDefault(),ce.stopPropagation(),ce.dataTransfer.dropEffect="copy",zt(!0))},[s]),Ct=Tn(ce=>{!s||!Cc(ce.dataTransfer)||(ce.preventDefault(),ce.stopPropagation(),k.current=Math.max(0,k.current-1),k.current===0&&zt(!1))},[s]),At=Tn(ce=>{!s||!Cc(ce.dataTransfer)||(ce.preventDefault(),ce.stopPropagation(),k.current=0,zt(!1),jt(ce.dataTransfer.files))},[s,jt]),lr=c&&(Be||!!(De&&!Ee&&(!I||!Ve)));return Qe("div",{className:"smv-root",style:{background:q.backgroundColor},onDragEnter:wt,onDragOver:ut,onDragLeave:Ct,onDrop:At,children:[l&&De&&K(Ak,{isOpen:re,onToggle:X,settings:q,onChange:Nn}),Qe("div",{className:"smv-canvasArea",children:[z!==null&&!V&&Qe("div",{className:"smv-largeModelBanner",children:[K(vk,{size:14,className:"smv-largeModelBanner__icon"}),Qe("span",{children:["Very large model detected (",Math.round(z/1e6),"M triangles) \u2014 it may render and move slowly on this device, and click/hover selection on the model is disabled. Use the scene objects panel to select parts."]}),K("button",{type:"button",className:"smv-largeModelBanner__dismiss",onClick:()=>F(!0),"aria-label":"Dismiss",children:K(Op,{size:12})})]}),s?Qe(p0,{children:[K("input",{ref:C,type:"file",accept:ll,className:"smv-upload-input",onChange:ce=>{jt(ce.target.files),ce.currentTarget.value=""}}),De?K("div",{className:"smv-upload-toolbar",children:Qe(p0,{children:[K("span",{className:"smv-upload-toolbar__name",children:ne??"Uploaded model"}),Qe("button",{type:"button",className:"smv-upload-toolbar__button smv-upload-toolbar__button--ghost",onClick:dt,children:[K(yk,{size:14}),"Clear"]})]})}):null]}):null,De?K(dk,{dpr:[1,2],frameloop:"demand",resize:{debounce:0,scroll:!1},raycaster:{firstHitOnly:!0},style:{background:q.backgroundColor},camera:{position:[0,0,5],fov:45,near:.1,far:1e3},children:Qe(Ap,{fallback:null,children:[K("ambientLight",{intensity:q.ambientIntensity,color:q.ambientColor}),K("directionalLight",{position:[-4,5,7],intensity:q.directionalIntensity,color:q.directionalColor,castShadow:!0}),K("directionalLight",{position:[-5,5,5],intensity:.5}),K(Ap,{fallback:null,children:K(ck,{preset:q.envPreset,background:q.backgroundEnabled})}),K(Pk,{exposure:q.exposure}),K(kk,{enabled:q.autoRotate,controlsRef:E}),K(Bp,{onLoadError:qe,children:K(Ap,{fallback:null,children:K(Mk,{url:De,format:ve?void 0:t,dracoDecoderPath:n,ktx2TranscoderPath:i,meshopt:r,hiddenKeys:G,selectedKey:ae,panelHoveredKey:le,nodeRefsOut:b,onMeshesReady:pn,onModelLoaded:we,onMeshClick:it,highlightOnHover:u})})},De),K(Tk,{scene:I,controlsRef:E,refitOnResize:p,onInitialFitComplete:()=>_t(!0)}),K(lk,{ref:E,makeDefault:!0,smoothTime:.3})]})}):K("div",{className:"smv-upload-empty-state",style:{background:q.backgroundColor},children:Qe("div",{className:"smv-upload-empty-state__card",children:[K("div",{className:"smv-upload-empty-state__icon",children:K(Rp,{size:24})}),Qe("p",{className:"smv-upload-empty-state__body",children:["Drag and drop ",K("code",{children:".glb"}),", ",K("code",{children:".gltf"}),","," ",K("code",{children:".obj"}),", ",K("code",{children:".fbx"}),", ",K("code",{children:".usdz"}),", or"," ",K("code",{children:".zip"})," here"]}),Qe("button",{type:"button",className:"smv-upload-empty-state__button",onClick:()=>C.current?.click(),children:[K(Rp,{size:15}),"Choose model"]})]})}),K(Jo,{visible:lr,message:Be?"Preparing model...":"Loading model..."}),s&&Le?K("div",{className:"smv-upload-drop-overlay",children:Qe("div",{className:"smv-upload-drop-overlay__card",children:[K(Rp,{size:20}),K("span",{children:"Release to load your model"})]})}):null]}),a&&De&&K(Rk,{meshKeys:L,hiddenKeys:G,selectedKey:ae,isOpen:vt,onToggle:Oe,onFocus:it,onHover:ge,onToggleVisibility:Re})]})}import{useCallback as f0,useState as Ek}from"react";function Lk(e=null){let[t,n]=Ek(e),i=f0(o=>{n(o)},[n]),r=f0(()=>{n(null)},[]);return{selectedObjectBinding:t,setSelectedObjectBinding:n,handleObjectSelect:i,clearSelection:r}}import{useMemo as Bk}from"react";function Ok(e,t){return Bk(()=>{if(!t)return null;let n=e[t];return n||(Object.values(e).find(i=>i.id===t||i.modelObjectId===t)??null)},[e,t])}import{useMemo as Dk}from"react";function Nk(e){return Dk(()=>Object.values(e).map(t=>t.modelObjectId),[e])}import{useCallback as un,useMemo as b0,useState as Ik}from"react";var x0={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 y0(e){if(e)return Object.fromEntries(Object.entries(e).map(([t,n])=>[t,n&&typeof n=="object"?{...n}:n]))}function zk(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t.visible===!1).map(([t])=>[t,!0]))}function jk(e){let[t,n]=Ik(e),i=un((E,b)=>{n(C=>b===void 0?To(C,E):To(C,E,b))},[]),r=un((E,b)=>i(E,Yc(b)),[i]),o=un((E,b)=>r(E,{baseColor:b}),[r]),a=un((E,b,C="baseColor")=>{let x=x0[C],k=typeof b=="string"?{path:b}:b;i(E,{style:{material:{[x]:k}}})},[i]),l=un((E,b="baseColor")=>{let C=x0[b];i(E,{style:{material:{[C]:void 0}}})},[i]),s=un((E,b)=>{n(C=>{let x=mn(C,E);if(!x)return C;let k=y0(C[x]?.style?.material),I=Ri(C,b);if(I.length===0)return C;let A=C;for(let z of I){let _=C[z];_&&(A===C&&(A={...C}),A[z]={..._,style:{..._.style,material:y0(k)}})}return A})},[]),d=un(E=>i(E,{style:{material:void 0}}),[i]),u=un((E,b)=>i(E,{transform:b}),[i]),c=un(E=>i(E,{transform:void 0}),[i]),p=un((E,b)=>i(E,{metadata:b}),[i]),g=un(E=>qc(t,E),[t]),f=un(E=>Ri(t,E).map(b=>t[b]?.id??b),[t]),v=un(E=>{let b=mn(t,E);return b?t[b]?.style?.material??null:null},[t]),P=un(E=>i(E,{visible:!1}),[i]),y=un(E=>i(E,{visible:!0}),[i]),h=un(E=>{n(b=>{let C=Ri(b,E).reduce((x,k)=>{let I=b[k];return I&&x.push({ids:k,patch:{visible:I.visible===!1}}),x},[]);return To(b,C)})},[n]),m=un(()=>{n(E=>To(E,Object.keys(E),{visible:!0}))},[n]),S=b0(()=>zk(t),[t]),M=b0(()=>Object.keys(S).map(E=>t[E]?.id??E),[S,t]),T=un(E=>{let b=mn(t,E);return b?t[b]?.visible===!1:!1},[t]);return{objectBindings:t,setObjectBindings:n,updateObjectBindings:i,setMaterial:r,setBaseColor:o,setTexture:a,clearTexture:l,copyMaterial:s,resetMaterial:d,getMaterial:v,setTransform:u,resetTransform:c,updateMetadata:p,selectObjectBindings:g,selectObjectBindingIds:f,hiddenObjects:S,hiddenObjectIds:M,hideObject:P,showObject:y,toggleObjectVisibility:h,isObjectHidden:T,clearHiddenObjects:m}}import{useCallback as sr,useMemo as Vk,useRef as Fk,useState as Uk}from"react";var Gk={type:"point",color:"#ffffff",intensity:1,position:[0,0,0],distance:0,decay:2,attachedToCamera:!1,castShadow:!1,shadowBias:-5e-4,visible:!0};function Hk(e){let t=Fk(null),[n,i]=Uk(()=>{let y=typeof e=="function"?e():e;return t.current=y,y}),r=sr(y=>{i(h=>{let m=typeof y=="function"?y(h):y;return Kc(h,m)})},[]),o=sr(()=>{let y=t.current;y&&i(y)},[]),a=sr((y,h)=>{r(m=>({lighting:{lights:m.lighting.lights.map(S=>S.id===y?{...S,...h}:S)}}))},[r]),l=sr(y=>{r(h=>h.lighting.lights.some(m=>m.id===y.id)?{}:{lighting:{lights:[...h.lighting.lights,{...Gk,...y}]}})},[r]),s=sr(y=>{r(h=>({lighting:{lights:h.lighting.lights.filter(m=>m.id!==y)}}))},[r]),d=sr((y,h)=>a(y,{intensity:h}),[a]),u=sr((y,h)=>a(y,{color:h}),[a]),c=sr(y=>a(y,{visible:!0}),[a]),p=sr(y=>a(y,{visible:!1}),[a]),g=sr(y=>{r(h=>({lighting:{lights:h.lighting.lights.map(m=>m.id===y?{...m,visible:!m.visible}:m)}}))},[r]),f=sr((y,h)=>a(y,{attachment:h,attachedToCamera:!1}),[a]),v=sr(y=>a(y,{attachment:void 0}),[a]),P=Vk(()=>({items:n.lighting.lights,get:y=>n.lighting.lights.find(h=>h.id===y),add:l,update:a,remove:s,setIntensity:d,setColor:u,show:c,hide:p,toggle:g,attach:f,detach:v}),[n.lighting.lights,l,a,s,d,u,c,p,g,f,v]);return{sceneConfig:n,setSceneConfig:i,updateSceneConfig:r,resetSceneConfig:o,lights:P}}import{useCallback as Wk,useState as $k}from"react";function Xk(){let[e,t]=$k(null),n=Wk(i=>{t(i)},[t]);return{hoveredObjectBinding:e,handleHoveredObject:n}}import{useCallback as Dp,useState as Cs}from"react";import{Box3 as qk,Vector3 as v0}from"three";function Sc(e){return[e.x,e.y,e.z]}function Yk(){let[e,t]=Cs(!0),[n,i]=Cs(!1),[r,o]=Cs(null),[a,l]=Cs(null),[s,d]=Cs(0),u=Dp(g=>{let f=new qk().setFromObject(g),v=f.min.clone(),P=f.max.clone(),y=new v0,h=new v0,m=0;g.traverse(S=>{"isMesh"in S&&S.isMesh&&(m+=1)}),f.getCenter(y),f.getSize(h),l({min:Sc(v),max:Sc(P),center:Sc(y),size:Sc(h)}),d(m),o(null),t(!1),i(!0)},[]),c=Dp(g=>{o(g),l(null),d(0),t(!1),i(!1)},[]),p=Dp(()=>{t(!0),i(!1),o(null),l(null),d(0)},[]);return{isLoading:e,isReady:n,error:r,bounds:a,objectCount:s,handleModelLoaded:u,handleLoadError:c,resetModelState:p}}import{useCallback as Np}from"react";function Kk({bindings:e,scene:t,camera:n,animations:i,onAction:r}){let{objectBindings:o,updateObjectBindings:a,showObject:l,hideObject:s,toggleObjectVisibility:d}=e,u=t?.updateSceneConfig,c=n?.focusObject,p=n?.fitScene,g=n?.resetView,f=n?.setCameraTarget,v=n?.setCameraState,P=i?.play,y=i?.pause,h=i?.stop,m=i?.setSpeed,S=i?.seek,M=Np(b=>{let C=mn(o,b);return C?o[C]?.actions??[]:[]},[o]),T=Np(async b=>{for(let C of b.action.effects??[]){if("objectBindings"in C){a(C.target,C.objectBindings);continue}if("sceneConfig"in C){u?.(C.sceneConfig);continue}if("visibility"in C){C.visibility==="show"?l(C.target):C.visibility==="hide"?s(C.target):d(C.target);continue}if("camera"in C){let k=C.camera;k.type==="focus-object"?await c?.(k.objectId??b.objectId):k.type==="fit-scene"?await p?.():k.type==="reset"?await g?.():k.type==="set-target"?await f?.(k.target,k.transition??!0):await v?.(k.state,k.transition??!0);continue}let x=C.animation;x.type==="play"?P?.(x.clip):x.type==="pause"?y?.():x.type==="stop"?h?.():x.type==="set-speed"?m?.(x.speed):S?.(x.time)}await r?.(b)},[p,c,s,r,y,P,g,S,m,v,f,l,h,d,a,u]),E=Np(async(b,C)=>{let x=mn(o,b);if(!x)return null;let k=o[x],I=k?.actions?.find(z=>z.id===C);if(!k||!I)return null;let A={objectId:x,action:I,binding:k};return await T(A),A},[T,o]);return{getActionsForObject:M,handleAction:T,runAction:E}}import{useCallback as Mc,useRef as w0}from"react";function Jk(e){return typeof e=="function"?e:e?.handleViewerReady??null}function Qk(...e){let t=w0(null),n=w0(e);n.current=e;let i=Mc(l=>{t.current=l;let s=new Set;for(let d of n.current){let u=Jk(d);u&&!s.has(u)&&(s.add(u),u(l))}},[]),r=Mc(()=>t.current,[]),o=Mc(l=>{let s=t.current;return s?s.captureImage(l):Promise.reject(new Error("ModelViewer is not ready yet."))},[]),a=Mc(()=>{let l=t.current;return l?(l.invalidate(),!0):!1},[]);return{handleViewerReady:i,getViewer:r,captureImage:o,invalidate:a}}import{useCallback as Nt,useEffect as Zk,useRef as Lr}from"react";import{Material as e_,PointLight as t_,Vector3 as n_}from"three";var jp=["emissiveIntensity","opacity","metalness","roughness","transmission","clearcoat","clearcoatRoughness","ior","thickness"],Tc=1;function Pc(e){return typeof e=="string"?[e]:e}function kc(e,t=0,n=1){return Math.min(n,Math.max(t,e))}function Ip(e,t){return e+Math.random()*(t-e)}function C0([e,t],n){return e+(t-e)*n}function zp([e,t],n){return[e[0]+(t[0]-e[0])*n,e[1]+(t[1]-e[1])*n,e[2]+(t[2]-e[2])*n]}function S0(e,t){let n=kc(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 r_(e){let t=e.material;return t?(Array.isArray(t)?t:[t]).filter(n=>n instanceof e_):[]}function i_(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 jp){let i=e[n];typeof i=="number"&&(t[n]=i)}return t}function M0(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 jp){let i=t[n];i!==void 0&&typeof e[n]=="number"&&(e[n]=i)}t.transparent!==void 0&&(e.transparent=t.transparent),e.needsUpdate=!0}function o_(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 a_(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 s_(e={}){let t=Lr(e);t.current=e;let n=Lr(null),i=Lr(null),r=Lr(null),o=Lr(new Map),a=Lr(new Map),l=Lr(new Map),s=Lr(new Map),d=Nt(L=>{let B=n.current;if(!B)return null;let G=mn(B.objectBindings,L);return B.nodeRefs[L]??(G?B.nodeRefs[G]:null)??(B.scene?mr(B.scene,L):null)??null},[]),u=Nt(L=>{let B=n.current;return B?typeof L=="object"&&!Array.isArray(L)?Ri(B.objectBindings,L):Pc(L).map(G=>mn(B.objectBindings,G)??G):typeof L=="string"?[L]:Array.isArray(L)?L:[]},[]),c=Nt(()=>{n.current?.invalidate()},[]),p=Nt((L,B)=>{let G=!1;for(let U of u(L)){let ae=d(U);if(ae)for(let xe of r_(ae))l.current.has(xe)||l.current.set(xe,i_(xe)),M0(xe,B),G=!0}return G},[d,u]),g=Nt((L,B)=>{let G=p(L,B);return G&&c(),G},[c,p]),f=Nt((L,B)=>{let G=!1;for(let U of u(L)){let ae=d(U);ae&&(s.current.has(ae)||s.current.set(ae,o_(ae)),a_(ae,B),G=!0)}return G},[d,u]),v=Nt((L,B)=>{let G=f(L,B);return G&&c(),G},[c,f]),P=Nt(L=>{let B=d(L);if(!B)return null;B.updateWorldMatrix(!0,!1);let G=B.getWorldPosition(new n_);return[G.x,G.y,G.z]},[d]),y=Nt(L=>{let B=a.current.get(L);return B?(B.light.removeFromParent(),B.light.dispose(),a.current.delete(L),c(),!0):!1},[c]),h=Nt(L=>{let B=d(L.target);if(!B)return!1;let G=a.current.get(L.id),U=G?.light??new t_;return G&&G.target!==L.target&&U.removeFromParent(),U.name=`react-immersive-runtime-light:${L.id}`,U.color.set(L.color??"#ffffff"),U.intensity=L.intensity??1,U.distance=L.distance??0,U.decay=L.decay??2,U.castShadow=L.castShadow??!1,U.position.set(...L.offset??[0,0,0]),U.parent!==B&&B.add(U),a.current.set(L.id,{light:U,target:L.target}),c(),!0},[c,d]),m=Nt((L,B)=>{let G=a.current.get(L);if(!G)return!1;if(B.target&&B.target!==G.target){let U=d(B.target);if(!U)return!1;G.light.removeFromParent(),U.add(G.light),G.target=B.target}return B.color!==void 0&&G.light.color.set(B.color),B.intensity!==void 0&&(G.light.intensity=B.intensity),B.distance!==void 0&&(G.light.distance=B.distance),B.decay!==void 0&&(G.light.decay=B.decay),B.offset!==void 0&&G.light.position.set(...B.offset),B.castShadow!==void 0&&(G.light.castShadow=B.castShadow),c(),!0},[c,d]),S=Nt((L,B)=>{let G=U=>B[U%B.length]??0;for(let U of L.materials??[])u(U.targets).forEach((ae,xe)=>{let le=G(xe),ge={};for(let ve of jp){let Te=U.values[ve];Te&&(ge[ve]=C0(Te,le))}p(ae,ge)});for(let U of L.transforms??[])u(U.targets).forEach((ae,xe)=>{let le=G(xe),ge={};U.values.position&&(ge.position=zp(U.values.position,le)),U.values.rotation&&(ge.rotation=zp(U.values.rotation,le)),U.values.scale&&(ge.scale=zp(U.values.scale,le)),f(ae,ge)});for(let U of L.lights??[])Pc(U.lights).forEach((ae,xe)=>{let le=a.current.get(ae);le&&(le.light.intensity=C0(U.intensity,G(xe)))})},[u,p,f]),M=Lr(()=>{}),T=Lr(()=>{});T.current=L=>{r.current=null;let B=!1;for(let[G,U]of o.current){U.startedAt===null&&(U.startedAt=L);let ae=U.lastFrameAt??L;U.lastFrameAt=L;let xe=U.override&&U.override.until>L?U.override.level:null;U.override&&xe===null&&(U.override=null);let le=U.update(L,L-U.startedAt,Math.min(100,L-ae),xe);B=!0,le||(o.current.delete(G),U.onComplete?.())}B&&c(),o.current.size>0&&M.current()},M.current=()=>{r.current!==null||typeof requestAnimationFrame>"u"||(r.current=requestAnimationFrame(L=>T.current(L)))};let E=Nt(L=>(o.current.set(L.id,L),M.current(),L.id),[]),b=Nt((L,B={})=>{let G=B.id??`transition-${Tc++}`,U=Math.max(1,B.duration??400),ae=B.easing??"ease-in-out";return E({id:G,startedAt:null,lastFrameAt:null,override:null,onComplete:B.onComplete,update:(xe,le,ge,ve)=>{let Te=ve??S0(le/U,ae);return S(L,[Te]),le<U}})},[S,E]),C=Nt((L,B={})=>{let G=B.id??`pulse-${Tc++}`,U=Math.max(1,B.duration??1e3),ae=B.minLevel??0,xe=B.maxLevel??1,le=B.repeat??1/0,ge=B.synchronized??!0,ve=Math.max(1,...[...L.materials??[],...L.transforms??[]].map(Te=>u(Te.targets).length),...(L.lights??[]).map(Te=>Pc(Te.lights).length));return E({id:G,startedAt:null,lastFrameAt:null,override:null,onComplete:B.onComplete,update:(Te,ne,ct,Ee)=>{let Ae=ne/U,Be=Array.from({length:ge?1:ve},(je,Ve)=>{if(Ee!==null)return Ee;let _t=Ae+(ge?0:Ve/ve),Le=.5-Math.cos(_t%1*Math.PI*2)/2;return ae+(xe-ae)*Le});return S(L,Be),le===1/0||Ae<le}})},[S,E,u]),x=Nt((L,B={})=>{let G=B.id??`timeline-${Tc++}`,U=B.repeat??1,ae=L.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 E({id:G,startedAt:null,lastFrameAt:null,override:null,onComplete:B.onComplete,update:(le,ge,ve,Te)=>{if(ae.length===0||U<=0)return!1;let ne=ge/xe;if(U!==1/0&&ne>=U){for(let Ae of ae)S(Ae.channels,[1]);return!1}let ct=ge%xe,Ee=0;for(let Ae of ae){let Be=Ee+Ae.duration,je=Be+Ae.hold;if(ct>=Be){S(Ae.channels,[Te??1]),Ee=je;continue}if(ct>=Ee){let Ve=Te??S0((ct-Ee)/Ae.duration,Ae.easing??"ease-in-out");S(Ae.channels,[Ve]);break}}return!0}})},[S,E]),k=Nt((L,B={})=>{let G=B.id??`flicker-${Tc++}`,U=B.synchronized??!0,ae=B.minLevel??.15,xe=B.maxLevel??1,le=B.interval??[45,160],ge=typeof le=="number"?[le,le]:le,ve=[Math.max(1,Math.min(...ge)),Math.max(1,Math.max(...ge))],Te=kc(B.response??.7,.01,1),ne=kc(B.blackoutChance??.08),ct=kc(B.flashChance??.12),Ee=B.flashLevel??1.15,Ae=Math.max(1,...[...L.materials??[],...L.transforms??[]].map(Le=>u(Le.targets).length),...(L.lights??[]).map(Le=>Pc(Le.lights).length)),Be=U?1:Ae,je=Array.from({length:Be},()=>ae),Ve=Array.from({length:Be},()=>ae),_t=Array.from({length:Be},()=>0);return E({id:G,startedAt:null,lastFrameAt:null,override:null,onComplete:B.onComplete,update:(Le,zt,vt,Oe)=>{for(let re=0;re<Be;re+=1){if(Oe!==null)Ve[re]=Oe;else if(Le>=_t[re]){let q=Math.random();Ve[re]=q<ne?Ip(0,Math.min(.04,ae)):q<ne+ct?Ee:Ip(ae,xe),_t[re]=Le+Ip(...ve)}let X=1-Math.pow(1-Te,Math.max(1,vt)/16.67);je[re]+=(Ve[re]-je[re])*X}return S(L,je),B.duration===void 0||zt<B.duration}})},[S,E,u]),I=Nt((L,B,G)=>{let U=o.current.get(L);if(!U)return!1;let ae=typeof performance>"u"?Date.now():performance.now();return U.override={level:B,until:ae+Math.max(0,G)},M.current(),!0},[]),A=Nt(L=>o.current.delete(L),[]),z=Nt(()=>{o.current.clear(),r.current!==null&&typeof cancelAnimationFrame<"u"&&(cancelAnimationFrame(r.current),r.current=null)},[]),_=Nt(()=>{for(let[L,B]of l.current)M0(L,B);l.current.clear();for(let[L,B]of s.current)L.position.set(...B.position),L.rotation.set(...B.rotation),L.scale.set(...B.scale),L.visible=B.visible,L.updateMatrix(),L.updateMatrixWorld(!0);s.current.clear();for(let L of a.current.values())L.light.removeFromParent(),L.light.dispose();a.current.clear(),c()},[c]),V=Nt(()=>{z(),_()},[_,z]),F=Nt(L=>{i.current&&i.current!==L.scene&&_(),n.current=L,i.current=L.scene,t.current.onViewerReady?.(L)},[_]);return Zk(()=>()=>{V(),n.current=null,i.current=null},[V]),{handleViewerReady:F,setMaterial:g,setTransform:v,getWorldPosition:P,addPointLight:h,updatePointLight:m,removePointLight:y,transition:b,timeline:x,pulse:C,flicker:k,overrideEffect:I,stopEffect:A,stopAllEffects:z,resetRuntime:V}}import{useCallback as pa,useEffect as Vp,useRef as yi,useState as l_}from"react";function k0(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function Ss(e){return typeof e=="number"&&Number.isFinite(e)}function T0(e){return Array.isArray(e)&&e.length===3&&e.every(Ss)}function c_(e){return!k0(e)||!T0(e.position)||!T0(e.target)||e.fov!==null&&!Ss(e.fov)||!Ss(e.zoom)||e.zoom<=0||e.azimuthAngle!==void 0&&!Ss(e.azimuthAngle)||e.polarAngle!==void 0&&!Ss(e.polarAngle)?null:{position:e.position,target:e.target,fov:e.fov,zoom:e.zoom,azimuthAngle:e.azimuthAngle,polarAngle:e.polarAngle}}function d_(e){if(!k0(e))return null;let t;if(e.camera!==void 0){let r=c_(e.camera);if(!r)return null;t=r}let n;if(e.hidden!==void 0){if(!Array.isArray(e.hidden)||!e.hidden.every(r=>typeof r=="string"))return null;n=e.hidden}let i;if(e.selected===null||typeof e.selected=="string")i=e.selected;else if(e.selected!==void 0)return null;return{camera:t,hidden:n,selected:i}}function P0(e,t,n){let i=Object.values(t).filter(r=>r.visible===!1).map(r=>r.id);return{camera:e??void 0,hidden:i,selected:n?.id??null}}function u_({cameraState:e,setCameraState:t,objectBindings:n,onObjectBindingsChange:i,selectedObjectBinding:r,setSelectedObjectBinding:o,paramKey:a="view",debounceMs:l=400,autoSync:s=!0}){let d=yi(null),u=yi(null),c=yi(null),p=yi(null),g=yi(null),f=pa(()=>{g.current!==null&&(window.clearTimeout(g.current),g.current=null),c.current=null,p.current=null},[]),v=pa(()=>{let C=P0(e,n,r);return`${a}=${encodeURIComponent(JSON.stringify(C))}`},[e,n,r,a]),P=pa(()=>{let C=new URL(window.location.href);return C.hash=v(),C.toString()},[v]),y=pa(C=>{let x=new URL(window.location.href);x.hash=C,window.history.replaceState(null,"",x.toString()),u.current=C,d.current=new URLSearchParams(x.hash.slice(1)).get(a)},[a]),h=pa(()=>{f(),y(v())},[v,f,y]),m=yi({cameraState:e,objectBindings:n,selectedObjectBinding:r});m.current={cameraState:e,objectBindings:n,selectedObjectBinding:r};let[S,M]=l_(!1);Vp(()=>{if(!s||!S){f();return}let C=m.current,x=P0(C.cameraState,C.objectBindings,C.selectedObjectBinding),k=`${a}=${encodeURIComponent(JSON.stringify(x))}`;if(k===u.current){f();return}k===c.current&&l===p.current||(f(),c.current=k,p.current=l,g.current=window.setTimeout(()=>{g.current=null,c.current=null,p.current=null,y(k)},Math.max(0,l)))},[s,e,f,l,n,a,S,r,y]),Vp(()=>f,[f]);let T=yi(null),E=yi(null),b=pa(async()=>{M(!0);let C=window.location.hash.startsWith("#")?window.location.hash.slice(1):window.location.hash,x=new URLSearchParams(C).get(a);if(!x)return T.current=null,!1;if(x===d.current||x===T.current||x===E.current)return!1;let k;try{k=JSON.parse(x)}catch{return!1}let I=d_(k);if(!I)return!1;E.current=x;try{if(I.camera&&await t(I.camera,!1),I.hidden){let A=new Set(I.hidden);i(Object.fromEntries(Object.entries(n).map(([z,_])=>[z,{..._,visible:!A.has(_.id)}])))}if(I.selected!==void 0){let A=I.selected?mn(n,I.selected):null;o(A?n[A]:null)}return T.current=x,!0}finally{E.current===x&&(E.current=null)}},[n,i,a,t,o]);return Vp(()=>{let C=()=>{b().catch(()=>{})};return window.addEventListener("hashchange",C),()=>{window.removeEventListener("hashchange",C)}},[b]),{getShareUrl:P,syncUrl:h,restoreFromUrl:b}}export{s0 as BindingBuilder,Ai as DEFAULT_SCENE_CONFIG,Xc as MATERIAL_BLENDING_MODES,$c as MATERIAL_SIDES,hc as ModelViewer,g0 as SimpleModelViewer,yy as defineObjectBindings,Yc as material,To as patchBindings,Kc as patchSceneConfig,Ri as selectBindingKeys,qc as selectBindings,Ok as useObjectBinding,Nk as useObjectBindingIds,jk as useObjectBindings,Hk as useSceneConfig,u_ as useShareableViewerState,Kk as useViewerActions,tp as useViewerAnimations,ep as useViewerCamera,Qk as useViewerConnection,s_ as useViewerEffects,Xk as useViewerHover,Yk as useViewerModel,Lk as useViewerSelection};
|
|
24
|
+
`}))}increaseSizeTo(e){this._target.setSize(Math.max(this._target.width,e),1)}readDataAsync(e){let{_renderer:t,_target:n}=this;return t.readRenderTargetPixelsAsync(n,0,0,e.length/4,1,e)}readData(e){let{_renderer:t,_target:n}=this;t.readRenderTargetPixels(n,0,0,e.length/4,1,e)}renderPixelToTarget(e,t,n){let{_renderer:i,_target:r}=this;ss.min.copy(t),ss.max.copy(t),ss.max.x+=1,ss.max.y+=1,i.initRenderTarget(r),i.copyTextureToTexture(e,r.texture,ss,n,0)}},li=new class{constructor(){let e=null;Object.getOwnPropertyNames(cf.prototype).forEach(t=>{t!=="constructor"&&(this[t]=(...n)=>(e||(e=new cf),e[t](...n)))})}},df=new br,uf=new br,pf=new br;function wS(e,t){return t===0?e.getAttribute("uv"):e.getAttribute(`uv${t}`)}function Mf(e,t,n=[,,,]){let i=3*t,r=3*t+1,o=3*t+2;return e.index&&(i=e.index.getX(i),r=e.index.getX(r),o=e.index.getX(o)),n[0]=i,n[1]=r,n[2]=o,n}function Tf(e,t,n,i,r){let[o,a,s]=i,c=wS(e,t);df.fromBufferAttribute(c,o),uf.fromBufferAttribute(c,a),pf.fromBufferAttribute(c,s),r.set(0,0,0).addScaledVector(df,n.x).addScaledVector(uf,n.y).addScaledVector(pf,n.z)}function Pf(e,t,n,i){let r=e.x-Math.floor(e.x),o=e.y-Math.floor(e.y),a=Math.floor(r*t%t),s=Math.floor(o*n%n);return i.set(a,s),i}var hf=new br,mf=new br,gf=new br,CS=class extends Ql{constructor(e,t,n=null){super(e,t,n),this.channels=ln(n,"channels",[0]),this.index=ln(n,"index",null),this.texCoord=ln(n,"texCoord",null),this.valueLength=parseInt(this.type.replace(/[^0-9]/g,""))||1}readDataFromBuffer(e,t,n=null){let i=this.type;if(i==="BOOLEAN"||i==="STRING")throw Error("PropertyTextureAccessor: BOOLEAN and STRING types not supported.");return Sf(e,t*this.valueLength,i,n)}},SS=class extends Pu{constructor(...e){super(...e),this.isPropertyTextureAccessor=!0,this._asyncRead=!1,this._initProperties(CS)}getData(e,t,n,i={}){let r=this.properties;Kl(r,i);let o=Object.keys(r),a=o.map(s=>i[s]);return this.getPropertyValuesAtTexel(o,e,t,n,a),o.forEach((s,c)=>i[s]=a[c]),i}async getDataAsync(e,t,n,i={}){let r=this.properties;Kl(r,i);let o=Object.keys(r),a=o.map(s=>i[s]);return await this.getPropertyValuesAtTexelAsync(o,e,t,n,a),o.forEach((s,c)=>i[s]=a[c]),i}getPropertyValuesAtTexelAsync(...e){this._asyncRead=!0;let t=this.getPropertyValuesAtTexel(...e);return this._asyncRead=!1,t}getPropertyValuesAtTexel(e,t,n,i,r=[]){for(;r.length<e.length;)r.push(null);r.length=e.length,li.increaseSizeTo(r.length);let o=this.data,a=this.definition.properties,s=this.properties,c=Mf(i,t);for(let d=0,p=e.length;d<p;d++){let g=e[d];if(!a[g])continue;let f=s[g],v=o[f.index];Tf(i,f.texCoord,n,c,hf),Pf(hf,v.image.width,v.image.height,mf),gf.set(d,0),li.renderPixelToTarget(v,mf,gf)}let l=new Uint8Array(e.length*4);if(this._asyncRead)return li.readDataAsync(l).then(()=>(u.call(this),r));return li.readData(l),u.call(this),r;function u(){for(let d=0,p=e.length;d<p;d++){let g=e[d],f=s[g],v=f.type;if(r[d]=Tu(f,r[d]),!f)throw Error("PropertyTextureAccessor: Requested property does not exist.");if(!a[g]){r[d]=f.resolveDefault(r);continue}let P=f.valueLength*(f.count||1),y=f.channels.map(S=>l[4*d+S]),h=f.componentType,m=new(cs(h,v))(P);if(new Uint8Array(m.buffer).set(y),f.array){let S=r[d];for(let M=0,T=S.length;M<T;M++)S[M]=f.readDataFromBuffer(m,M,S[M])}else r[d]=f.readDataFromBuffer(m,0,r[d]);r[d]=f.adjustValueScaleOffset(r[d]),r[d]=f.resolveEnumsToStrings(r[d]),r[d]=f.resolveNoData(r[d])}}}dispose(){this.data.forEach(e=>{e&&(e.dispose(),e.image instanceof ImageBitmap&&e.image.close())})}},wu=class{constructor(e,t,n,i=null,r=null){let{schema:o,propertyTables:a=[],propertyTextures:s=[],propertyAttributes:c=[]}=e,{enums:l,classes:u}=o,d=a.map(f=>new vS(f,u,l,n)),p=[],g=[];i&&(i.propertyTextures&&(p=i.propertyTextures.map(f=>new SS(s[f],u,l,t))),i.propertyAttributes&&(g=i.propertyAttributes.map(f=>new xS(c[f],u,l)))),this.schema=o,this.tableAccessors=d,this.textureAccessors=p,this.attributeAccessors=g,this.object=r,this.textures=t,this.nodeMetadata=i}getPropertyTableData(e,t,n=null){if(!Array.isArray(e))n||(n={}),n=this.tableAccessors[e].getData(t,n);else{n||(n=[]);let i=Math.min(e.length,t.length);n.length=i;for(let r=0;r<i;r++){let o=this.tableAccessors[e[r]];n[r]=o.getData(t[r],n[r])}}if(Array.isArray(e)!==Array.isArray(n)||Array.isArray(e)!==Array.isArray(t))throw Error("StructuralMetadata: Scalar and array inputs cannot be mixed.");return n}getPropertyTableInfo(e=null){if(e===null&&(e=this.tableAccessors.map((t,n)=>n)),Array.isArray(e))return e.map(t=>{let n=this.tableAccessors[t];return{name:n.name,className:n.definition.class}});{let t=this.tableAccessors[e];return{name:t.name,className:t.definition.class}}}getPropertyTextureData(e,t,n=[]){let i=this.textureAccessors;n.length=i.length;for(let r=0;r<i.length;r++)n[r]=i[r].getData(e,t,this.object.geometry,n[r]);return n}async getPropertyTextureDataAsync(e,t,n=[]){let i=this.textureAccessors;n.length=i.length;let r=[];for(let o=0;o<i.length;o++){let a=i[o].getDataAsync(e,t,this.object.geometry,n[o]).then(s=>{n[o]=s});r.push(a)}return await Promise.all(r),n}getPropertyTextureInfo(){return this.textureAccessors}getPropertyAttributeData(e,t=[]){let n=this.attributeAccessors;t.length=n.length;for(let i=0;i<n.length;i++)t[i]=n[i].getData(e,this.object.geometry,t[i]);return t}getPropertyAttributeInfo(){return this.attributeAccessors.map(e=>({name:e.name,className:e.definition.class}))}dispose(){this.textureAccessors.forEach(e=>e.dispose()),this.tableAccessors.forEach(e=>e.dispose()),this.attributeAccessors.forEach(e=>e.dispose())}},ls="EXT_structural_metadata";function MS(e,t=[]){let n=e.json.textures?.length||0,i=Array(n).fill(null);return t.forEach(({properties:r})=>{for(let o in r){let{index:a}=r[o];i[a]===null&&(i[a]=e.loadTexture(a))}}),Promise.all(i)}function TS(e,t=[]){let n=e.json.bufferViews?.length||0,i=Array(n).fill(null);return t.forEach(({properties:r})=>{for(let o in r){let{values:a,arrayOffsets:s,stringOffsets:c}=r[o];i[a]===null&&(i[a]=e.getDependency("bufferView",a)),i[s]===null&&(i[s]=e.getDependency("bufferView",s)),i[c]===null&&(i[c]=e.getDependency("bufferView",c))}}),Promise.all(i)}var kf=class{constructor(e){this.parser=e,this.name=ls}async afterRoot({scene:e,parser:t}){let n=t.json.extensionsUsed;if(!n||!n.includes(ls))return;let i=null,r=t.json.extensions[ls];if(r.schemaUri){let{manager:c,path:l,requestHeader:u,crossOrigin:d}=t.options,p=new URL(r.schemaUri,l).toString(),g=new QC(c);g.setCrossOrigin(d),g.setResponseType("json"),g.setRequestHeader(u),i=g.loadAsync(p).then(f=>{r={...r,schema:f}})}let[o,a]=await Promise.all([MS(t,r.propertyTextures),TS(t,r.propertyTables),i]),s=new wu(r,o,a);e.userData.structuralMetadata=s,e.traverse(c=>{if(t.associations.has(c)){let{meshes:l,primitives:u}=t.associations.get(c),d=t.json.meshes[l]?.primitives[u];if(d&&d.extensions&&d.extensions[ls]){let p=d.extensions[ls];c.userData.structuralMetadata=new wu(r,o,a,p,c)}else c.userData.structuralMetadata=s}})}},ff=new br,bf=new br,xf=new br;function PS(e){return e.x>e.y&&e.x>e.z?0:e.y>e.z?1:2}var _f=class{constructor(e,t,n){this.geometry=e,this.textures=t,this.data=n,this._asyncRead=!1,this.featureIds=n.featureIds.map(i=>{let{texture:r,...o}=i,a={label:null,propertyTable:null,nullFeatureId:null,...o};return r&&(a.texture={texCoord:0,channels:[0],...r}),a})}getTextures(){return this.textures}getFeatureInfo(){return this.featureIds}getFeaturesAsync(...e){this._asyncRead=!0;let t=this.getFeatures(...e);return this._asyncRead=!1,t}getFeatures(e,t){let{geometry:n,textures:i,featureIds:r}=this,o=Array(r.length).fill(null),a=r.length;li.increaseSizeTo(a);let s=Mf(n,e),c=s[PS(t)];for(let d=0,p=r.length;d<p;d++){let g=r[d],f="nullFeatureId"in g?g.nullFeatureId:null;if("texture"in g){let v=i[g.texture.index];Tf(n,g.texture.texCoord,t,s,ff),Pf(ff,v.image.width,v.image.height,bf),xf.set(d,0),li.renderPixelToTarget(i[g.texture.index],bf,xf)}else if("attribute"in g){let v=n.getAttribute(`_feature_id_${g.attribute}`).getX(c);v!==f&&(o[d]=v)}else{let v=c;v!==f&&(o[d]=v)}}let l=new Uint8Array(a*4);if(this._asyncRead)return li.readDataAsync(l).then(()=>(u(),o));return li.readData(l),u(),o;function u(){let d=new Uint32Array(1);for(let p=0,g=r.length;p<g;p++){let f=r[p],v="nullFeatureId"in f?f.nullFeatureId:null;if("texture"in f){let{channels:P}=f.texture,y=P.map(m=>l[4*p+m]);new Uint8Array(d.buffer).set(y);let h=d[0];h!==v&&(o[p]=h)}}}}dispose(){this.textures.forEach(e=>{e&&(e.dispose(),e.image instanceof ImageBitmap&&e.image.close())})}},Jl="EXT_mesh_features";function yf(e,t,n){e.traverse(i=>{if(t.associations.has(i)){let{meshes:r,primitives:o}=t.associations.get(i),a=t.json.meshes[r]?.primitives[o];a&&a.extensions&&a.extensions[Jl]&&n(i,a.extensions[Jl])}})}var Af=class{constructor(e){this.parser=e,this.name=Jl}async afterRoot({scene:e,parser:t}){let n=t.json.extensionsUsed;if(!n||!n.includes(Jl))return;let i=t.json.textures?.length||0,r=Array(i).fill(null);yf(e,t,(a,{featureIds:s})=>{s.forEach(c=>{if(c.texture&&r[c.texture.index]===null){let l=c.texture.index;r[l]=t.loadTexture(l)}})});let o=await Promise.all(r);yf(e,t,(a,s)=>{a.userData.meshFeatures=new _f(a.geometry,o,s)})}},Rf=class{constructor(){this.name="CESIUM_RTC"}afterRoot(e){if(e.parser.json.extensions&&e.parser.json.extensions.CESIUM_RTC){let{center:t}=e.parser.json.extensions.CESIUM_RTC;t&&(e.scene.position.x+=t[0],e.scene.position.y+=t[1],e.scene.position.z+=t[2])}}},ku=class{constructor(e){e={metadata:!0,rtc:!0,plugins:[],dracoLoader:null,ktxLoader:null,meshoptDecoder:null,autoDispose:!0,...e},this.tiles=null,this.metadata=e.metadata,this.rtc=e.rtc,this.plugins=e.plugins,this.dracoLoader=e.dracoLoader,this.ktxLoader=e.ktxLoader,this.meshoptDecoder=e.meshoptDecoder,this._gltfRegex=/\.(gltf|glb)$/g,this._dracoRegex=/\.drc$/g,this._loader=null}init(e){let t=new cS(e.manager);this.dracoLoader&&(t.setDRACOLoader(this.dracoLoader),e.manager.addHandler(this._dracoRegex,this.dracoLoader)),this.ktxLoader&&t.setKTX2Loader(this.ktxLoader),this.meshoptDecoder&&t.setMeshoptDecoder(this.meshoptDecoder),this.rtc&&t.register(()=>new Rf),this.metadata&&(t.register(()=>new kf),t.register(()=>new Af)),this.plugins.forEach(n=>t.register(n)),e.manager.addHandler(this._gltfRegex,t),this.tiles=e,this._loader=t}dispose(){this.tiles.manager.removeHandler(this._gltfRegex),this.tiles.manager.removeHandler(this._dracoRegex),this.autoDispose&&(this.ktxLoader.dispose(),this.dracoLoader.dispose())}};var{clamp:WL}=Su;var $L=new wf(new rS),kS=new JC(new Uint8Array([255,255,255,255]),1,1);kS.needsUpdate=!0;var _S=0,AS=1,RS=2,ES=3,LS=4,BS=5,OS=6,DS=7,NS=8,IS=9,zS=10,jS=11,XL=Object.freeze({NONE:_S,SCREEN_ERROR:AS,GEOMETRIC_ERROR:RS,DISTANCE:ES,DEPTH:LS,RELATIVE_DEPTH:BS,IS_LEAF:OS,RANDOM_COLOR:DS,RANDOM_NODE_COLOR:NS,CUSTOM_COLOR:IS,LOAD_ORDER:zS,INDEXED_COLOR:jS});var qL=Math.PI/4,YL=3/5;var si={NONE:0,NOT_READY:1,NO_FIT:2,DEPTH:3,OCCUPANCY:4,SPACING:5,ANGLE:6,FACING:7};var KL=new class{constructor(){this._cache={}}getColor(...e){let t=e.pop(),n=e.join("_"),{_cache:i}=this;return n in i||(t.setHSL(Math.random(),1,.5),i[n]=t.getHex()),t.set(i[n])}};var JL={[si.NONE]:16777215,[si.NOT_READY]:7829367,[si.NO_FIT]:2250239,[si.DEPTH]:4473924,[si.OCCUPANCY]:65535,[si.SPACING]:16776960,[si.ANGLE]:16711680,[si.FACING]:16711935};var QL=Math.PI/180;var ZL=Ho*Math.PI*2;var eB=Ho*Math.PI*2;import{DRACOLoader as WS}from"three/examples/jsm/loaders/DRACOLoader.js";import{KTX2Loader as $S}from"three/examples/jsm/loaders/KTX2Loader.js";import{MeshoptDecoder as XS}from"three/examples/jsm/libs/meshopt_decoder.module.js";import{Box3 as qS,DoubleSide as YS,MathUtils as KS,Sphere as JS,Vector3 as QS}from"three";import{BufferAttribute as Ef,MathUtils as VS}from"three";function Lf(e,t,n,i){for(let r=0;r<e.count;r+=1)for(let o=0;o<e.itemSize;o+=1)t.setComponent(r,o,VS.clamp(e.getComponent(r,o),n,i));return t}function FS(e){for(let t=0;t<e.count;t+=1)for(let n=0;n<e.itemSize;n+=1){let i=e.getComponent(t,n);if(!Number.isFinite(i)||i<0||i>1)return!1}return!0}var Zl=class{constructor(){this.name="RI_VERTEX_COMPRESSION_PLUGIN";this.priority=-99}processTileModel(t){t.traverse(n=>{let i=n.geometry;if(!i)return;let r=i.attributes.normal;r&&!r.isInterleavedBufferAttribute&&!(r.array instanceof Int16Array)&&(i.attributes.normal=Lf(r,new Ef(new Int16Array(r.count*r.itemSize),r.itemSize,!0),-1,1));for(let o of["uv","uv1","uv2","uv3"]){let a=i.attributes[o];!a||a.isInterleavedBufferAttribute||a.array instanceof Uint16Array||!FS(a)||(i.attributes[o]=Lf(a,new Ef(new Uint16Array(a.count*a.itemSize),a.itemSize,!0),0,1))}})}};import{jsx as Bf,jsxs as eM}from"react/jsx-runtime";function ZS(e){try{let t=typeof window>"u"?new URL(e):new URL(e,window.location.href);return new URL("objects.json",t).toString()}catch{return null}}function Au({url:e,rotation:t=[0,0,0],errorTarget:n=64,cacheSize:i=800,memoryBudgetMB:r=800,decoderConfig:o,objectBindings:a,itemMaterials:s,sceneConfig:c,selectedItem:l,panelHoveredItem:u,highlightOnHover:d=!0,onItemClick:p,onItemHover:g,onObjectCatalog:f,onTilesetBounds:v,onModelLoaded:P,onLoadError:y,nodeRefsOut:h,onNodeRefsChange:m,materialRefsOut:S,explodeFactor:M=0,suspendBindingTransforms:T=!1}){let{camera:E,gl:b,invalidate:C}=HS(),x=er(null),[k,I]=_u(null),A=er({onItemClick:p,onItemHover:g,onObjectCatalog:f,onTilesetBounds:v,onModelLoaded:P,onLoadError:y,onNodeRefsChange:m});A.current={onItemClick:p,onItemHover:g,onObjectCatalog:f,onTilesetBounds:v,onModelLoaded:P,onLoadError:y,onNodeRefsChange:m};let z=er(!0),[_,F]=_u(null),j=er(null);j.current=_;let L=er([]),B=er(!1);Xi(()=>{let re=new Al;return F(re),()=>re.dispose()},[e]);let G=er(null),U=er(0),oe=er(!1),xe=r*1024*1024,le=er(!1),ge=o?.dracoDecoderPath??jd,we=o?.ktx2TranscoderPath??Vd,Me=o?.meshopt??!0,[ne,pt]=_u(null);Xi(()=>{oe.current=!1,le.current=!1;let re=new yu(e);re.loadAncestors=!0,re.downloadQueue.maxJobsPerOrigin=4,re.parseQueue.maxJobs=2;let $=ge?new WS().setDecoderPath(ge).setWorkerLimit(2):null,q=we?new $S().setTranscoderPath(we).detectSupport(b):null;return re.registerPlugin(new ku({dracoLoader:$,ktxLoader:q,meshoptDecoder:Me?XS:null,autoDispose:!1})),re.registerPlugin(new Mu({disableMipmaps:!0,compressIndex:!0,compressNormals:!1,compressUvs:!1,compressPosition:!0})),re.registerPlugin(new Zl),pt(re),window.__riTiles=re,()=>{re.forEachLoadedModel(Te=>Bi(Te)),re.dispose(),$?.dispose(),q?.dispose(),pt(Te=>Te===re?null:Te)}},[ge,b,we,Me,e]),Xi(()=>{ne&&(ne.errorTarget=n,ne.lruCache.maxSize=i,ne.lruCache.minSize=Math.max(1,Math.floor(i*.75)),ne.lruCache.maxBytesSize=xe,ne.lruCache.minBytesSize=xe*.75,C())},[i,n,C,xe,ne]);let Ee=US(()=>{let re=a??{};return{objectBindings:re,keyByModelObject:ag(re),itemMaterials:s,shadingMode:c?.model.shading??"lit",rendererMode:c?.model.renderer??"pbr",selectedKey:l??null,hoveredKey:sg(k,u),highlightOnHover:d,suspendTransforms:T,invalidate:C}},[k,d,C,s,a,u,c,l,T]),Ae=$i(()=>{if(!ne)return;let re=At.current,$=B.current?j.current?.nodesByBinding(re)??{}:{},q={};ne.group.traverse(ce=>{if(!ce.isMesh)return;let He=Kd(ce);if(!He)return;let nt=re.keyByModelObject[He]??He;if(!re.objectBindings[nt])return;$[nt]||($[nt]=ce);let dt=ce.material;dt&&(q[nt]=dt)});let Te=h?.current??{},ze=Object.keys(Te),Pe=ze.length!==Object.keys($).length||ze.some(ce=>Te[ce]!==$[ce]);h&&(h.current=$),S&&(S.current=q),(Pe||!h)&&A.current.onNodeRefsChange?.()},[S,h,ne]),Be=$i(re=>kl(re,Ee),[Ee]),Ve=$i(re=>cg(re,Ee),[Ee]),Fe=er(Ve);Fe.current=Ve;let At=er(Ee);At.current=Ee;let Le=$i(()=>{let re=G.current,$=U.current;return!re||$<=0?At.current:{...At.current,explode:{factor:$,centre:re.centre,radius:re.radius}}},[]);Xi(()=>{ne&&(Ve(ne.group),z.current=!0,ne.forEachLoadedModel(re=>{Ve(re),Uo(re,Le())}),C())},[Ve,C,Le,ne]),Xi(()=>{let re=ZS(e);if(!re)return;let $=!1;return fetch(re).then(q=>q.ok?q.json():null).then(q=>{$||!q?.objects||(L.current=q.objects,B.current=q.bindingFrame==="gltf-identity-v2",B.current&&j.current?.setCatalog(q.objects),z.current=!0,A.current.onObjectCatalog?.(q.objects),C())}).catch(()=>{}),()=>{$=!0}},[e,C,_]),Xi(()=>{if(!ne)return;let re=!1,$=()=>C(),q=ce=>{ce.scene&&(ce.scene.traverse(He=>{let nt=He.material;for(let dt of Array.isArray(nt)?nt:nt?[nt]:[])dt.transparent&&dt.side===YS&&(dt.forceSinglePass=!0)}),Fe.current(ce.scene),Uo(ce.scene,Le()),_o(ce.scene)),z.current=!0,re||(re=!0,A.current.onModelLoaded?.(ne.group)),C()},Te=ce=>{A.current.onLoadError?.(ce.error)},ze=ce=>{ce.scene&&(Jd(ce.scene),Bi(ce.scene)),z.current=!0};ne.setCamera(E),ne.setResolutionFromRenderer(E,b),ne.addEventListener("needs-update",$),ne.addEventListener("load-model",q),ne.addEventListener("load-error",Te),ne.addEventListener("dispose-model",ze);let Pe=()=>{z.current=!0,C()};return ne.addEventListener("tile-visibility-change",Pe),C(),()=>{ne.removeEventListener("needs-update",$),ne.removeEventListener("load-model",q),ne.removeEventListener("load-error",Te),ne.removeEventListener("dispose-model",ze),ne.removeEventListener("tile-visibility-change",Pe),Jd(ne.group),ne.deleteCamera(E),h&&(h.current={}),S&&(S.current={})}},[E,b,C,S,h,Le,ne]);let jt=$i(re=>{let $=Be(re.object);$&&(re.stopPropagation(),A.current.onItemClick?.($.binding))},[Be,p]),St=$i(re=>{let $=Be(re.object),q=$?.key??null;q!==x.current&&(x.current=q,I(q),A.current.onItemHover?.($?.binding??null))},[Be]),Oe=$i(()=>{x.current!==null&&(x.current=null,I(null),A.current.onItemHover?.(null))},[]);return Xi(()=>{C()},[C,ne]),GS((re,$)=>{if(!ne)return;if(ne.setResolutionFromRenderer(E,b),B.current&&_){let ce=_.sync(Le(),l,T);_.updateBounds(ne.root),T&&ne.forEachLoadedModel(He=>Uo(He,ce))}if(ne.update(),!oe.current){let ce=new qS;if(ne.getBoundingBox(ce)){oe.current=!0,ne.group.updateMatrixWorld(),ce.applyMatrix4(ne.group.matrixWorld);let He=ce.getBoundingSphere(new JS);G.current={centre:He.center.clone(),radius:ce.getSize(new QS).length()*.5},A.current.onTilesetBounds?.(ce),C()}}z.current&&(z.current=!1,Ae());let q=Math.min(Math.max(M,0),1),Te=U.current;Math.abs(Te-q)>1e-4?(U.current=KS.lerp(Te,q,1-Math.exp(-6*$)),Uo(ne.group,Le()),C()):Te!==q&&(U.current=q,Uo(ne.group,Le()),C()),!le.current&&ne.lruCache.isFull()&&(le.current=!0,console.warn("[react-immersive] The tile memory budget is full, so no further tiles will load and the model may render incompletely. This usually means the model's textures are too large for streaming \u2014 re-process it with a smaller MAX_TEXTURE_SIZE, or raise memoryBudgetMB."));let ze=ne;((ze.stats?.downloading??0)>0||(ze.stats?.parsing??0)>0||ze.loadProgress!==void 0&&ze.loadProgress<1&&!ne.lruCache.isFull())&&C()}),ne?eM("group",{rotation:t,children:[_?Bf("primitive",{object:_.group}):null,Bf("primitive",{object:ne.group,onClick:jt,onPointerMove:St,onPointerOut:Oe})]}):null}import{useMemo as Yi,useRef as ci,useState as Yo,useEffect as qi,useCallback as qo}from"react";import{Html as Of}from"@react-three/drei";import{useFrame as Df,useThree as Eu}from"@react-three/fiber";import{MathUtils as Ru,Vector3 as ps}from"three";import{jsx as xr,jsxs as Lu}from"react/jsx-runtime";var tM=.02;function Nf(e,t){let n=ci(null),i=Eu(l=>l.scene),r=ci(null),o=Yi(()=>new ps(...e.anchorLocalPosition??e.localPosition??e.worldPosition),[e.anchorLocalPosition,e.localPosition,e.worldPosition]),a=Yi(()=>new ps,[]),s=Yi(()=>new ps,[]),c=Yi(()=>new ps,[]);return qi(()=>{r.current=null},[e.anchorNodeName]),Df(({camera:l})=>{let u=n.current,d=u?.parent;if(!u||!d)return;let p=r.current;if(e.anchorNodeName&&(!p||!p.parent)&&(p=gr(i,e.anchorNodeName),r.current=p),p?(p.updateWorldMatrix(!0,!1),a.copy(o).applyMatrix4(p.matrixWorld)):(a.copy(o),d.localToWorld(a)),t){let g=t.current.get(e.id);g||(g=new ps,t.current.set(e.id,g)),g.copy(a)}c.copy(l.position).sub(a),c.lengthSq()>0?(c.normalize(),s.copy(a).addScaledVector(c,tM)):s.copy(a),d.worldToLocal(s),u.position.copy(s)}),n}function nM({annotation:e,occluders:t,worldPositionsRef:n,onClick:i,onHover:r,showAnnotationOnHover:o}){let[a,s]=Yo(!1),c=Nf(e,n),[l,u]=Yo(!1),[d,p]=Yo(1),g=ci(null),f=ci(null),v=ci(null);qi(()=>()=>{g.current&&(clearTimeout(g.current),g.current=null),v.current&&(clearTimeout(v.current),v.current=null)},[]);let P=M=>{M.stopPropagation(),M.preventDefault(),g.current&&(clearTimeout(g.current),g.current=null),g.current=window.setTimeout(()=>{i?.(e),g.current=null},10)},y=M=>{M.stopPropagation(),u(!0),p(100),v.current&&(clearTimeout(v.current),v.current=null),r?.(e),o&&i?.(e)},h=M=>{M.stopPropagation(),u(!1),p(1),v.current&&clearTimeout(v.current),v.current=window.setTimeout(()=>{r?.(null),o&&r?.(null),v.current=null},50)},m=M=>{M.stopPropagation();let T=M.currentTarget;T.dataset.pointerX=String(M.clientX),T.dataset.pointerY=String(M.clientY)},S=M=>{M.stopPropagation();let T=M.currentTarget,E=parseFloat(T.dataset.pointerX||"0"),b=parseFloat(T.dataset.pointerY||"0"),C=M.clientX-E,x=M.clientY-b;Math.sqrt(C*C+x*x)<10&&P(M)};return xr("group",{ref:c,children:xr(Of,{center:!0,occlude:t,onOcclude:s,pointerEvents:a?"none":"auto",zIndexRange:[1,200],style:{pointerEvents:a?"none":"auto",zIndex:d},className:"annotation-html-wrapper",transparent:!0,children:xr("div",{ref:f,className:`ri-annotationMarker ${l?"ri-annotationMarker--hovered":""}`,title:e.title,style:{display:a?"none":"flex"},onPointerDown:m,onPointerUp:S,onPointerEnter:y,onPointerLeave:h,onDoubleClick:M=>{M.stopPropagation(),i?.(e)},role:"button",tabIndex:0,"aria-label":`Annotation ${e.id}`,children:xr("span",{className:"ri-annotationMarker-id",children:e.id})})})})}function rM({annotation:e,occluders:t,popupRef:n,onClose:i,hideCloseButton:r=!1}){let[o,a]=Yo(!1),s=Nf(e),c=Lu("div",{ref:n,className:"ri-viewAnnotationPopup",style:{display:o?"none":"block"},onPointerDown:l=>l.stopPropagation(),onClick:l=>l.stopPropagation(),children:[Lu("div",{className:"ri-viewAnnotationHeader",children:[xr("h4",{className:"ri-viewAnnotationTitle",children:e.title}),!r&&xr("button",{onClick:l=>{l.stopPropagation(),i?.()},className:"ri-viewAnnotationClose","aria-label":"Close annotation",children:"\xD7"})]}),e.description&&xr("p",{className:"ri-viewAnnotationDescription",children:e.description})]});return xr("group",{ref:s,children:xr(Of,{occlude:t,onOcclude:a,pointerEvents:o?"none":"auto",zIndexRange:[1e3,2e3],style:{pointerEvents:o?"none":"auto",zIndex:1e3},transparent:!0,children:c})})}function Bu({annotations:e,sceneConfig:t,activeAnnotation:n,popupRef:i,canvasRootRef:r,worldPositionsRef:o,modelLoaded:a,onAnnotationClick:s,onAnnotationHover:c,onCloseAnnotation:l,hideCloseButton:u=!1,showAnnotationOnHover:d=!1}){let p=Eu(_=>_.invalidate),g=Eu(_=>_.scene),[f,v]=Yo(null),[P,y]=Yo(!1),h=ci(null),m=ci(null),S=ci(null),M=Yi(()=>{let _=[];return g.traverse(F=>{let j=F;j.isMesh&&!j.isSkinnedMesh&&_.push({current:F})}),_},[g,e,a]),T=qo(()=>{p();let _=()=>{p(),m.current=window.requestAnimationFrame(()=>{p(),m.current=null})};m.current=window.requestAnimationFrame(_)},[p]);qi(()=>{T()},[e,T]),qi(()=>{T()},[n,T]),qi(()=>()=>{m.current!==null&&window.cancelAnimationFrame(m.current),S.current&&clearTimeout(S.current)},[]);let E=P?f:n||f,b=Yi(()=>E?e.find(_=>_.id===E.id)??E:null,[E,e]),C=qo(_=>{if(P&&f?.id===_.id){y(!1),v(null),l?.();return}y(!0),v(_),s?.(_)},[P,f,s,l]),x=qo(_=>{c?.(_),d&&!P&&(S.current&&(clearTimeout(S.current),S.current=null),_?v(_):S.current=window.setTimeout(()=>{v(null),l?.(),S.current=null},100))},[P,c,d,l]),k=qo(()=>{y(!1),v(null),l?.()},[l]),I=qo(_=>{let F=_.target;if(F.closest?.(".ri-annotationMarker")||F.closest?.(".ri-viewAnnotationPopup")||F.closest?.(".annotation-html-wrapper"))return;let j=r.current;j&&j.contains(F)&&(y(!1),v(null),l?.())},[r,l]),A=qo(_=>{_.key==="Escape"&&P&&(y(!1),v(null),l?.())},[P,l]);qi(()=>{let _=r.current;return _&&(_.addEventListener("click",I),_.addEventListener("pointerdown",I)),document.addEventListener("keydown",A),()=>{_&&(_.removeEventListener("click",I),_.removeEventListener("pointerdown",I)),document.removeEventListener("keydown",A)}},[r,I,A]);let z=Yi(()=>(t?.model.rotation??[0,0,0]).map(_=>_*Math.PI/180),[t?.model.rotation]);return qi(()=>{p()},[p,z]),Df((_,F)=>{if(!h.current)return;h.current.rotation.x=Ru.lerp(h.current.rotation.x,z[0],1-Math.exp(-5*F)),h.current.rotation.y=Ru.lerp(h.current.rotation.y,z[1],1-Math.exp(-5*F)),h.current.rotation.z=Ru.lerp(h.current.rotation.z,z[2],1-Math.exp(-5*F));let{rotation:j}=h.current;Math.abs(j.x-z[0])+Math.abs(j.y-z[1])+Math.abs(j.z-z[2])>1e-4&&p()}),Lu("group",{ref:h,children:[e.map(_=>{let F=`${_.worldPosition.join(",")}-${_.title}-${_.id}`;return xr(nM,{annotation:_,occluders:M,worldPositionsRef:o,onClick:C,onHover:x,showAnnotationOnHover:d},F)}),b?xr(rM,{annotation:b,occluders:M,popupRef:i,onClose:k,hideCloseButton:u},`popup-${b.id}`):null]})}import{useEffect as iM,useMemo as If}from"react";import{Html as jf,Line as oM}from"@react-three/drei";import{BoxGeometry as aM,EdgesGeometry as sM,Vector3 as zf}from"three";import{jsx as Xr,jsxs as Ko}from"react/jsx-runtime";var lM="#22d3ee",cM="#facc15";function ec(e,t){let n=e<10?e.toFixed(3):e.toFixed(2);return t?`${n} ${t}`:n}function dM(e,t){return[(e[0]+t[0])/2,(e[1]+t[1])/2,(e[2]+t[2])/2]}function tc({position:e,children:t}){return Xr(jf,{center:!0,position:e,zIndexRange:[20,0],children:Xr("div",{className:"ri-measureLabel",children:t})})}function uM({box:e,unit:t}){let n=If(()=>[(e.min[0]+e.max[0])/2,(e.min[1]+e.max[1])/2,(e.min[2]+e.max[2])/2],[e.min,e.max]),i=If(()=>{let[s,c,l]=e.size;return new sM(new aM(s||1e-4,c||1e-4,l||1e-4))},[e.size]);iM(()=>()=>{i.dispose()},[i]);let[r,o,a]=e.size;return Ko("group",{position:n,children:[Xr("lineSegments",{geometry:i,children:Xr("lineBasicMaterial",{color:cM})}),Ko(tc,{position:[0,-o/2,a/2],children:["W ",ec(r,t)]}),Ko(tc,{position:[-r/2,0,a/2],children:["H ",ec(o,t)]}),Ko(tc,{position:[r/2,-o/2,0],children:["D ",ec(a,t)]})]})}function Ou({points:e,unit:t,box:n,showDimensions:i}){return Ko("group",{children:[e.map(r=>Xr(jf,{center:!0,position:r.position,zIndexRange:[15,0],children:Xr("div",{className:"ri-measureDot"})},r.id)),e.slice(1).map((r,o)=>{let a=e[o].position,s=r.position,c=new zf(...a).distanceTo(new zf(...s));return Ko("group",{children:[Xr(oM,{points:[a,s],color:lM,lineWidth:2}),Xr(tc,{position:dM(a,s),children:ec(c,t)})]},`${e[o].id}-${r.id}`)}),i&&n?Xr(uM,{box:n,unit:t}):null]})}import{forwardRef as pM,useCallback as hs,useEffect as Vf,useImperativeHandle as hM,useMemo as Ff,useRef as yn}from"react";import{useXR as Uf,useXRHitTest as mM,useXRInputSourceEvent as gM}from"@react-three/xr";import{useFrame as fM}from"@react-three/fiber";import{Matrix4 as bM,Vector3 as Gf}from"three";import{Fragment as SM,jsx as ms,jsxs as Xf}from"react/jsx-runtime";var xM=1,Hf=1,yM=.1,vM=10;function wM(e,t){let[n,i,r]=e.size,o=(e.min[0]+e.max[0])/2,a=(e.min[2]+e.max[2])/2,s=Math.max(n,i,r)||1;return{scale:t==="real-world"?1:xM/s,offset:[-o,-e.min[1],-a]}}function Wf(e){let t=e[0].clientX-e[1].clientX,n=e[0].clientY-e[1].clientY;return Math.hypot(t,n)}function $f(e){let t=e[0].clientX-e[1].clientX,n=e[0].clientY-e[1].clientY;return Math.atan2(n,t)}var CM=pM(function({box:t,scaleMode:n,children:i,onARStateChange:r},o){let a=yn(null),s=yn(null),c=yn(null),l=Uf(F=>F.session!=null),u=Uf(F=>F.mode==="immersive-ar"),d=Ff(()=>t?wM(t,n):null,[t,n]),p=yn(new Gf(0,0,-Hf)),g=yn(1),f=yn(0),v=yn(!0),P=yn(!1),y=Ff(()=>new bM,[]),h=yn(new Gf),m=yn(!1),S=yn(null),M=yn(!1),T=yn(0),E=yn(0),b=yn(1),C=yn(0),x=hs(()=>{if(!r||!u)return;let F={canPlace:m.current,isPlacementMode:v.current,isModelPlaced:P.current},j=S.current;j&&j.canPlace===F.canPlace&&j.isPlacementMode===F.isPlacementMode&&j.isModelPlaced===F.isModelPlaced||(S.current=F,r(F))},[u,r]),k=hs(()=>!u||!m.current?!1:(p.current.copy(h.current),P.current=!0,v.current=!1,x(),!0),[x,u]),I=hs(()=>{u&&(v.current=!0,x())},[x,u]),A=hs(()=>{let F=k();return!F&&u&&(v.current=!1,x()),F},[x,u,k]),z=hs(()=>{u&&(v.current=!1,x())},[x,u]);hM(o,()=>({placeCurrent:k,startPlacementMode:I,finishPlacementMode:A,cancelPlacementMode:z}),[z,A,k,I]),Vf(()=>{if(!l){p.current.set(0,0,-Hf),g.current=1,f.current=0,m.current=!1,M.current=!1,v.current=!0,P.current=!1,S.current=null;return}u&&(m.current=!1,M.current=!1,v.current=!0,P.current=!1,S.current=null,x())},[x,l,u]),mM((F,j)=>{if(!u||F.length===0){m.current&&(m.current=!1,x());return}j(y,F[0])&&(h.current.setFromMatrixPosition(y),m.current||(m.current=!0,x()))},"viewer"),gM("all","select",()=>{!u||M.current||!v.current||k()},[u,k]),Vf(()=>{if(!u)return;let F=B=>{B.touches.length===2&&(M.current=!0,T.current=Wf(B.touches),E.current=$f(B.touches),b.current=g.current,C.current=f.current)},j=B=>{if(!M.current||B.touches.length!==2)return;B.preventDefault();let G=Wf(B.touches);if(T.current>0){let oe=G/T.current;g.current=Math.min(vM,Math.max(yM,b.current*oe))}let U=$f(B.touches);f.current=C.current-(U-E.current)},L=B=>{B.touches.length===0&&requestAnimationFrame(()=>{M.current=!1})};return window.addEventListener("touchstart",F),window.addEventListener("touchmove",j,{passive:!1}),window.addEventListener("touchend",L),window.addEventListener("touchcancel",L),()=>{window.removeEventListener("touchstart",F),window.removeEventListener("touchmove",j),window.removeEventListener("touchend",L),window.removeEventListener("touchcancel",L)}},[u]),fM(()=>{let F=a.current,j=s.current;if(!F||!j)return;!l||!d?(F.visible=!0,F.position.set(0,0,0),F.rotation.set(0,0,0),j.scale.setScalar(1)):(F.visible=!u||P.current,F.position.copy(p.current),F.rotation.set(0,f.current,0),j.scale.setScalar(d.scale*g.current));let L=c.current;if(L){let B=u&&v.current&&m.current;L.visible=B,B&&L.position.copy(h.current)}});let _=l&&d?d.offset:[0,0,0];return Xf(SM,{children:[Xf("mesh",{ref:c,visible:!1,rotation:[-Math.PI/2,0,0],children:[ms("ringGeometry",{args:[.05,.07,32]}),ms("meshBasicMaterial",{color:"#22d3ee",transparent:!0,opacity:.95})]}),ms("group",{ref:a,children:ms("group",{ref:s,children:ms("group",{position:_,children:i})})})]})}),qf=CM;import{useEffect as nc,useMemo as _r,useRef as di}from"react";import{useFrame as MM,useThree as TM}from"@react-three/fiber";import{Box3 as PM,CatmullRomCurve3 as Yf,Sphere as kM,Spherical as _M,Vector3 as ui}from"three";var AM=1.2;function Du({controlsRef:e,sceneRef:t,config:n,playing:i,resetOnPlay:r=!1,onFinished:o,onUserInteract:a,onStop:s}){let c=TM(z=>z.invalidate),l=_r(()=>n.waypoints??[],[n.waypoints]),u=l.length>=2,d=n.loop??!0,p=_r(()=>{if(l.length<2)return 24;let z=0;for(let _=0;_<l.length-1;_++)z+=l[_].segmentDuration??3.5;return d&&l.length>1&&(z+=l[l.length-1].segmentDuration??3.5),Math.max(z,4)},[l,d]),g=n.duration??p,f=_r(()=>l.map(z=>[...z.position,...z.target,z.azimuthAngle??"",z.polarAngle??"",z.segmentDuration??""].join(",")).join(";"),[l]),v=_r(()=>{let z=[];if(l.length<2)return z;let _=0;for(let F=0;F<l.length-1;F++)_+=l[F].segmentDuration??3.5,z.push(_);return d&&l.length>1&&(_+=l[l.length-1].segmentDuration??3.5,z.push(_)),z},[l,d]),P=_r(()=>z=>{if(l.length<2||v.length===0)return z/g;let _=v[v.length-1],F=d?z%g:Math.min(z,g),j=g>0?F/g*_:0;for(let L=0;L<v.length;L++)if(j<=v[L]){let B=L===0?0:v[L-1],G=v[L]-B,U=G>0?(j-B)/G:0,oe=d?l.length:l.length-1,xe=L/oe,le=1/oe;return xe+U*le}return 1},[l.length,v,g,d]),y=_r(()=>u?{position:new Yf(l.map(z=>new ui(...z.position)),d,"catmullrom",.5),target:new Yf(l.map(z=>new ui(...z.target)),d,"catmullrom",.5)}:null,[f,u,d]),h=_r(()=>{if(!u||!l.every(_=>Number.isFinite(_.azimuthAngle)&&Number.isFinite(_.polarAngle)))return null;let z=l.map(_=>({azimuth:_.azimuthAngle,polar:_.polarAngle,distance:new ui(..._.position).distanceTo(new ui(..._.target))}));for(let _=1;_<z.length;_+=1){let F=z[_-1].azimuth,j=z[_].azimuth;z[_].azimuth=j+Math.round((F-j)/(Math.PI*2))*Math.PI*2}return z},[f,u]),m=di(0),S=di(0),M=di(new ui),T=di(new ui),E=di(!1),b=di(0),C=di(!1),x=di(null),k=_r(()=>new ui,[]),I=_r(()=>new ui,[]),A=_r(()=>new _M,[]);return nc(()=>{m.current=0,b.current=0,S.current=0,C.current=!1},[f,d,g]),nc(()=>{r&&(b.current=0,m.current=0,C.current=!1)},[r]),nc(()=>{if(!i){E.current=!1,m.current>0&&!r?b.current=m.current:r&&(b.current=0),(m.current>0||C.current)&&s?.();return}m.current>=g&&!d&&(m.current=0,b.current=0,C.current=!1);let z=e.current;if(z&&(z.getPosition(M.current),z.getTarget(T.current)),r||C.current||b.current===0?(m.current=0,b.current=0,C.current=!1):b.current>0&&b.current<g?m.current=b.current:(m.current=0,b.current=0),S.current=0,!u){let _=t.current;if(_){let F=new PM().setFromObject(_).getBoundingSphere(new kM);x.current={center:F.center.clone(),radius:F.radius>0?F.radius:1}}}E.current=!0,c()},[i,u,e,t,c,g,d,f,r,s]),nc(()=>{if(!i||!a)return;let z=e.current;if(!z)return;let _=()=>{C.current||a()};return z.addEventListener("controlstart",_),()=>z.removeEventListener("controlstart",_)},[i,e,a]),MM((z,_)=>{if(!i||!E.current)return;let F=e.current;if(!F)return;m.current+=_,S.current+=_;let j=P(m.current),L=!d&&m.current>=g;if(j=d?j%1:Math.min(j,1),y)if(y.target.getPoint(j,I),h){let G=d?h.length:h.length-1,U=Math.min(j,1)*G,oe=Math.min(Math.floor(U),G-1),xe=(oe+1)%h.length,le=j>=1?1:U-oe,ge=le*le*(3-2*le),we=h[oe],Me=h[xe],ne=Me.azimuth+Math.round((we.azimuth-Me.azimuth)/(Math.PI*2))*Math.PI*2,pt=we.azimuth+(ne-we.azimuth)*ge,Ee=we.polar+(Me.polar-we.polar)*ge,Ae=we.distance+(Me.distance-we.distance)*ge;A.set(Math.max(Ae,1e-6),Math.min(Math.max(Ee,1e-6),Math.PI-1e-6),pt),k.setFromSpherical(A).add(I)}else y.position.getPoint(j,k);else{let G=x.current;if(!G)return;let U=j*Math.PI*2,oe=G.radius*2.2;k.set(G.center.x+Math.cos(U)*oe,G.center.y+G.radius*.6,G.center.z+Math.sin(U)*oe),I.copy(G.center)}let B=Math.min(S.current/AM,1);if(B<1){let G=B*B*(3-2*B);k.lerpVectors(M.current,k,G),I.lerpVectors(T.current,I,G)}if(F.setLookAt(k.x,k.y,k.z,I.x,I.y,I.z,!1),L){E.current=!1,C.current=!0,m.current=0,b.current=0,o?.();return}c()}),null}import{useEffect as OM,useState as DM}from"react";var RM="ri:license-grant:v1",EM={"260cd89ea13f":"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEwjr3ofKTkkcxOM0GYl/RlJj9JsuyjSF8sYmCd2YqsHJCEO8EvlNDrO2Kl4agFKo6dRhyR2/oWeiU6P9WIqRbvw=="},Kf=new Map;function Qf(e){let t=atob(e);return Uint8Array.from(t,n=>n.charCodeAt(0)).buffer}function Jf(e){let t=e.replace(/-/g,"+").replace(/_/g,"/");return Qf(t.padEnd(Math.ceil(t.length/4)*4,"="))}function LM(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 rc(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 Nu(e,t){return`${RM}:${t}:${e}`}function BM(e,t){let n=Kf.get(e);if(n)return n;let i=crypto.subtle.importKey("spki",Qf(t),{name:"ECDSA",namedCurve:"P-256"},!1,["verify"]);return Kf.set(e,i),i}async function Iu(e,t,n){if(!globalThis.crypto?.subtle)return null;try{let[i,r,o,a,...s]=e.split("."),c=EM[r];if(i!=="ri1"||!c||!o||!a||s.length>0)return null;let l=JSON.parse(new TextDecoder().decode(Jf(o)));if(!LM(l)||!await crypto.subtle.verify({name:"ECDSA",hash:"SHA-256"},await BM(r,c),Jf(a),new TextEncoder().encode(`${i}.${r}.${o}`)))return null;let d=Math.floor(Date.now()/1e3),p=l.expiresAt-l.issuedAt;return l.licenseKeyHash!==t||l.domain!==n||l.expiresAt<=d||l.issuedAt>d+300||p<=0||p>43200?null:{environment:l.environment,tier:l.tier,expiresAt:l.expiresAt}}catch{return null}}async function Zf(e,t,n){try{return await Iu(e,await rc(t),n)}catch{return null}}async function eb(e,t,n){try{let i=await rc(t);return await Iu(e,i,n)?(localStorage.setItem(Nu(i,n),e),!0):!1}catch{return!1}}async function tb(e,t){try{let n=await rc(e),i=Nu(n,t),r=localStorage.getItem(i);if(!r)return null;let o=await Iu(r,n,t);return o||localStorage.removeItem(i),o}catch{return null}}async function zu(e,t){try{let n=await rc(e);localStorage.removeItem(Nu(n,t))}catch{}}var NM=["localhost","127.0.0.1","0.0.0.0"],IM=e=>NM.includes(e)||e.endsWith(".local")||e.endsWith(".localhost"),rb="https://react-immersive.liveroom.dev/api/validate-license",zM=()=>typeof window<"u",jM=300*1e3,VM=5e3,FM=400,Vu=new Map,ju=new Map,pi=class extends Error{},ib=async(e,t,n)=>{let i=await tb(e,t);return i?(console.warn("[react-immersive] License server unreachable \u2014 using a previously verified, time-limited offline grant."),{status:"valid",reason:"Previously verified offline grant",environment:i.environment,tier:i.tier,isLocalDomain:n}):null},nb=async(e,t,n)=>{let i=await ib(e,t,n);return i||(console.warn("[react-immersive] License server unreachable and no valid offline grant is available \u2014 license validation failed."),{status:"invalid",reason:"Could not reach license server",isLocalDomain:n})},UM=e=>e instanceof pi||e instanceof TypeError,GM=()=>new Promise(e=>setTimeout(e,FM)),HM=e=>e==="development"||e==="production",WM=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&&!HM(t.environment)||t.tier!==void 0&&typeof t.tier!="string"||t.offlineGrant!==void 0&&typeof t.offlineGrant!="string")},$M=e=>{if(!e||typeof e!="object")return null;let t=e,n=t.reason??t.error;return typeof n=="string"&&n.trim()?n:null},XM=(e,t,n)=>`${n}::${e}::${t}`,qM=e=>{let t=Vu.get(e);return t?Date.now()-t.timestamp>jM?(Vu.delete(e),null):t.result:null},YM=(e,t)=>({status:e.valid?"valid":"invalid",reason:e.reason,environment:e.environment,tier:e.tier,isLocalDomain:t}),KM=(e,t)=>({status:"invalid",reason:e,isLocalDomain:t});async function JM(e,t,n,i){let r=XM(e,t,i),o=qM(r);if(o)return o;let a=ju.get(r);if(a)return a;let s=(async()=>{for(let c=0;c<2;c+=1)try{return await QM(e,t,n,r,i)}catch(l){if(!UM(l))throw l;if(c===0){let u=await ib(e,t,n);if(u)return u;await GM();continue}return nb(e,t,n)}return nb(e,t,n)})().finally(()=>{ju.delete(r)});return ju.set(r,s),s}async function QM(e,t,n,i,r){let o=new AbortController,a=setTimeout(()=>o.abort(),VM),s;try{s=await fetch(r,{method:"POST",headers:{"Content-Type":"application/json"},cache:"no-store",signal:o.signal,body:JSON.stringify({licenseKey:e,domain:t})})}catch(u){throw o.signal.aborted?new pi("License validation timed out"):u}finally{clearTimeout(a)}let c;try{c=await s.json()}catch{throw new pi(`License server returned a non-JSON response${s.status?` (${s.status})`:""}`)}if(!s.ok){if(s.status===429||s.status>=500)throw new pi(`License server error (${s.status})`);let u=$M(c)??`License validation failed${s.status?` (${s.status})`:""}`;return await zu(e,t),KM(u,n)}if(!WM(c))throw new pi("License server returned an unexpected payload");let l=YM(c,n);if(l.status==="valid"&&r!==rb){let u=c.offlineGrant?await Zf(c.offlineGrant,e,t):null;if(!u)throw new pi("License validation endpoint did not return a verifiable signed grant");l={...l,environment:u.environment,tier:u.tier}}return l.status==="valid"?(Vu.set(i,{result:l,timestamp:Date.now()}),c.offlineGrant&&(await eb(c.offlineGrant,e,t)||console.warn("[react-immersive] The license server returned an invalid offline grant; it was not cached."))):await zu(e,t),l}var ic=(e,t=rb)=>{let[n,i]=DM({status:"checking",isLocalDomain:!1});return OM(()=>{if(!zM())return;let r=!1,o=u=>{r||i(u)},a=e.trim(),s=window.location.hostname.toLowerCase(),c=IM(s);return o({status:"checking",isLocalDomain:c}),a?((async()=>{try{o(await JM(a,s,c,t))}catch(u){let d=u instanceof TypeError?"Could not reach license server":u instanceof Error?u.message:"License validation failed";o({status:"invalid",reason:d,isLocalDomain:c})}})(),()=>{r=!0}):(o({status:"invalid",reason:"No license key provided",isLocalDomain:c}),()=>{r=!0})},[e,t]),n};import{useRef as Ki,useState as ZM,useCallback as Ar,useEffect as eT}from"react";import{jsx as Vn,jsxs as Fu}from"react/jsx-runtime";var tT={up:{width:38,height:22},down:{width:38,height:22},left:{width:22,height:38},right:{width:22,height:38}},nT={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"},oc=({direction:e})=>{let t=tT[e],n=nT[e];return Fu("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:[Vn("polyline",{points:n,stroke:"rgba(0, 0, 0, 0.9)",strokeWidth:"6",strokeLinecap:"round",strokeLinejoin:"round"}),Vn("polyline",{points:n,stroke:"#2095F2",strokeWidth:"4",strokeLinecap:"round",strokeLinejoin:"round"})]})},qr=16,rT={"bottom-left":{bottom:qr,left:qr,top:"auto",right:"auto",transform:"none"},"bottom-right":{bottom:qr,right:qr,top:"auto",left:"auto",transform:"none"},"top-left":{top:qr,left:qr,bottom:"auto",right:"auto",transform:"none"},"top-right":{top:qr,right:qr,bottom:"auto",left:"auto",transform:"none"},center:{top:"50%",left:"50%",bottom:"auto",right:"auto",transform:"translate(-50%, -50%)"},"center-bottom":{bottom:-10,left:"50%",top:"auto",right:"auto",transform:"translateX(-50%)"},"center-top":{top:qr,left:"50%",bottom:"auto",right:"auto",transform:"translateX(-50%)"}},iT=({controlsRef:e,enabled:t=!0,opacity:n=.9,moveSensitivity:i=.001,rotateSensitivity:r=.01,position:o="center-bottom"})=>{let a=Ki(null),[s,c]=ZM({x:0,y:0}),l=Ki(!1),u=Ki({x:0,y:0}),d=Ki(),p=Ki(),g=Ki(null),f=Ki(0),v=()=>e.current,P=(A,z,_)=>{let F=Math.hypot(A,z);if(F>_){let j=_/F;return{x:A*j,y:z*j}}return{x:A,y:z}},y=A=>{let _=Math.abs(A);return _<.12?0:Math.sign(A)*((_-.12)/(1-.12))},h=Ar(()=>{let A=()=>{let{x:z,y:_}=u.current,F=y(z),j=y(_);if(t&&(F!==0||j!==0)){let L=v();L&&L.rotate(-F*r,-j*r,!0)}d.current=requestAnimationFrame(A)};d.current=requestAnimationFrame(A)},[t,r]),m=Ar(()=>{d.current&&cancelAnimationFrame(d.current)},[]),S=Ar((A,z)=>{if(!a.current||!l.current)return;let _=a.current.getBoundingClientRect(),F=_.left+_.width/2,j=_.top+_.height/2,L=_.width/2-18,B=A-F,G=z-j,U=P(B,G,L);c(U),u.current={x:U.x/L,y:U.y/L}},[]),M=Ar(A=>{if(!t)return;A.preventDefault(),A.stopPropagation(),l.current=!0,h();let z="touches"in A?A.touches[0]:A;S(z.clientX,z.clientY)},[t,h,S]),T=Ar(A=>{if(!l.current)return;A.preventDefault();let z="touches"in A?A.touches[0]:A;S(z.clientX,z.clientY)},[S]),E=Ar(()=>{l.current=!1,c({x:0,y:0}),u.current={x:0,y:0},m()},[m]),b=i*10,C=Ar(A=>{t&&v()?.forward(A*b,!0)},[t,b]),x=Ar(A=>{t&&v()?.truck(A*b,0,!0)},[t,b]),k=Ar((A,z,_)=>{if(!t)return;p.current&&cancelAnimationFrame(p.current),g.current={control:A,amount:z,action:_},f.current=0,_(z);let F=j=>{if(!g.current)return;if(f.current===0){f.current=j,p.current=requestAnimationFrame(F);return}if(j-f.current>200){let{amount:B,action:G}=g.current;G(B),f.current=j}p.current=requestAnimationFrame(F)};p.current=requestAnimationFrame(F)},[t]),I=Ar(A=>{g.current?.control===A&&(p.current&&(cancelAnimationFrame(p.current),p.current=void 0),g.current=null,f.current=0)},[]);return eT(()=>(window.addEventListener("mousemove",T),window.addEventListener("mouseup",E),window.addEventListener("touchmove",T,{passive:!1}),window.addEventListener("touchend",E),window.addEventListener("touchcancel",E),()=>{window.removeEventListener("mousemove",T),window.removeEventListener("mouseup",E),window.removeEventListener("touchmove",T),window.removeEventListener("touchend",E),window.removeEventListener("touchcancel",E),m(),p.current&&cancelAnimationFrame(p.current)}),[T,E,m]),t?Vn("div",{className:"mc__wrapper",style:{opacity:n,...rT[o]},children:Fu("div",{className:"mc__dpad",children:[Vn("button",{"aria-label":"Move forward",className:"mc__arrow mc__arrow--up",onMouseDown:()=>k("up",1,C),onMouseUp:()=>I("up"),onMouseLeave:()=>I("up"),onTouchStart:A=>{A.preventDefault(),k("up",1,C)},onTouchEnd:()=>I("up"),onTouchCancel:()=>I("up"),children:Vn(oc,{direction:"up"})}),Fu("div",{className:"mc__middle-row",children:[Vn("button",{"aria-label":"Move left",className:"mc__arrow mc__arrow--left",onMouseDown:()=>k("left",-1,x),onMouseUp:()=>I("left"),onMouseLeave:()=>I("left"),onTouchStart:A=>{A.preventDefault(),k("left",-1,x)},onTouchEnd:()=>I("left"),onTouchCancel:()=>I("left"),children:Vn(oc,{direction:"left"})}),Vn("div",{ref:a,className:"mc__joystick",onMouseDown:M,onTouchStart:M,children:Vn("div",{className:"mc__knob",style:{transform:`translate(${s.x}px, ${s.y}px)`}})}),Vn("button",{"aria-label":"Move right",className:"mc__arrow mc__arrow--right",onMouseDown:()=>k("right",1,x),onMouseUp:()=>I("right"),onMouseLeave:()=>I("right"),onTouchStart:A=>{A.preventDefault(),k("right",1,x)},onTouchEnd:()=>I("right"),onTouchCancel:()=>I("right"),children:Vn(oc,{direction:"right"})})]}),Vn("button",{"aria-label":"Move backward",className:"mc__arrow mc__arrow--down",onMouseDown:()=>k("down",-1,C),onMouseUp:()=>I("down"),onMouseLeave:()=>I("down"),onTouchStart:A=>{A.preventDefault(),k("down",-1,C)},onTouchEnd:()=>I("down"),onTouchCancel:()=>I("down"),children:Vn(oc,{direction:"down"})})]})}):null},ob=iT;import{HexColorPicker as oT}from"react-colorful";import{jsx as ac,jsxs as ab}from"react/jsx-runtime";var Uu=({colorPicker:e,onClose:t,itemMaterials:n,setItemMaterials:i,inline:r=!1})=>ab("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:[ac("p",{className:"ri-popoverLabel",children:"Color"}),ac(oT,{color:n[e.objectId]?.hex??"#ffffff",onChange:o=>i(a=>({...a,[e.objectId]:{...a[e.objectId],hex:o}}))}),ab("div",{className:"ri-inlineRow",children:[ac("span",{className:"ri-colorCode",children:n[e.objectId]?.hex??"#ffffff"}),ac("button",{className:"ri-secondaryButton",onClick:t,children:"Done"})]})]});import{jsx as Rr,jsxs as Gu}from"react/jsx-runtime";var Hu=({materialPopup:e,textureUrl:t,triggerFileUpload:n,clearTexture:i,inline:r=!1})=>Gu("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:[Rr("div",{className:"ri-popoverHeader",children:Rr("p",{className:"ri-popoverLabel",style:{marginBottom:0},children:"Material"})}),Gu("div",{className:"ri-materialBody",children:[t?Rr("div",{className:"ri-previewFrame",children:Rr("img",{src:t,alt:"texture preview",className:"ri-previewImage"})}):Gu("div",{className:"ri-emptyState",children:[Rr("svg",{width:"24",height:"24",fill:"none",stroke:"currentColor",strokeWidth:1.5,viewBox:"0 0 24 24",children:Rr("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"})}),Rr("span",{style:{fontSize:12},children:"No texture applied"})]}),Rr("button",{onClick:()=>n(e.objectId),className:"ri-uploadButton",children:t?"Replace image":"Upload image"}),t&&Rr("button",{onClick:()=>i(e.objectId),className:"ri-removeButton",children:"Remove texture"}),Rr("p",{className:"ri-formatHint",children:"JPG \xB7 PNG \xB7 WebP"})]})]});import{Fragment as aT,useEffect as Wu,useRef as sT,useState as $u}from"react";import{Fragment as Xu,jsx as cn,jsxs as Jo}from"react/jsx-runtime";function sb({entries:e}){return cn(Xu,{children:e.map(([t,n])=>{let i=n!==null&&typeof n=="object",r=i?Object.entries(n):[];return i&&r.length>0?Jo("div",{className:"left-panel__data-group",children:[cn("span",{className:"left-panel__data-key",children:t}),cn("div",{className:"left-panel__data-children",children:cn(sb,{entries:r})})]},t):Jo("div",{className:"left-panel__data-row",children:[cn("span",{className:"left-panel__data-key",children:t}),cn("span",{className:`left-panel__data-value left-panel__data-value--${typeof n}`,children:i?Array.isArray(n)?"[]":"{}":String(n)})]},t)})})}function lT({content:e}){let t=e!=null,[n,i]=$u(t),[r,o]=$u(t),a=sT(e);return t&&(a.current=e),Wu(()=>{if(t){i(!0);return}if(n){o(!1);let s=setTimeout(()=>i(!1),300);return()=>clearTimeout(s)}},[t,n]),Wu(()=>{if(n&&t){let s=requestAnimationFrame(()=>o(!0));return()=>cancelAnimationFrame(s)}},[n,t]),n?cn("div",{className:`left-panel__action-extra${r?" left-panel__action-extra--open":""}`,children:cn("div",{className:"left-panel__action-extra-inner",children:e??a.current})}):null}function qu({isOpen:e,selectedObject:t,currentAction:n,onClose:i,onAction:r,renderActionExtra:o}){let[a,s]=$u(t);Wu(()=>{t&&s(t)},[t]);let c=t??a,l=c?Object.entries(c).filter(([u])=>u!=="actions"):[];return cn("div",{className:`left-panel ${e?"left-panel--open":"left-panel--closed"}`,children:c&&Jo(Xu,{children:[Jo("div",{className:"left-panel__header",children:[cn("p",{className:"left-panel__title",children:c.label}),cn("button",{onClick:i,className:"left-panel__close-btn","aria-label":"Close panel",children:"\u2715"})]}),l.length>0&&cn("div",{className:"left-panel__data",children:cn(sb,{entries:l})}),cn("hr",{className:"left-panel__divider"}),c.actions&&c.actions.length>0&&Jo(Xu,{children:[cn("div",{className:"left-panel__actions-label",children:"Actions"}),cn("div",{className:"left-panel__actions-list",children:c.actions.map((u,d)=>{let p=n?.action.id===u.id&&(n.binding===c||n.binding?.id===c.id||n.binding?.modelObjectId===c.modelObjectId||n.objectId===c.id||n.objectId===c.modelObjectId),g=o?.(u.id);return Jo(aT,{children:[cn("button",{onClick:f=>r({objectId:c.modelObjectId||c.id||"",action:u,binding:c,screenX:f.clientX,screenY:f.clientY}),className:["left-panel__action-btn",`left-panel__action-btn--${u.id}`,p?"left-panel__action-btn--active":""].filter(Boolean).join(" "),"data-action-id":u.id,"data-label":u.label,children:u.label}),cn(lT,{content:g})]},d)})})]})]})})}import{useMemo as dT,useState as cb}from"react";import{Boxes as uT}from"lucide-react";import{useState as cT}from"react";import{jsx as Yr,jsxs as gs}from"react/jsx-runtime";function lb({openButtonLabel:e,openButtonAriaLabel:t,eyebrow:n,title:i,searchValue:r,onSearchChange:o,searchPlaceholder:a,children:s,isOpen:c,onToggle:l,openButtonIcon:u,closeButtonIcon:d,closeButtonAriaLabel:p}){let[g,f]=cT(!1),v=c!==void 0?c:g,P=y=>{c===void 0&&f(y),l?.(y)};return gs("div",{className:`ri-sidepanel-wrap ${v?"ri-sidepanel-wrap--open":"ri-sidepanel-wrap--closed"}`,children:[!v&&gs("button",{type:"button",className:"ri-sidepanel__open-btn",onClick:()=>P(!0),"aria-label":t,title:"Open panel",children:[u,e?Yr("span",{children:e}):null]}),gs("div",{className:`ri-sidepanel ${v?"ri-sidepanel--open":"ri-sidepanel--closed"}`,"aria-hidden":!v,children:[gs("div",{className:"ri-sidepanel__header",children:[gs("div",{className:"ri-sidepanel__header-top",children:[Yr("span",{className:"ri-sidepanel__eyebrow",children:n}),Yr("button",{type:"button",className:"ri-sidepanel__close-btn",onClick:()=>P(!1),"aria-label":p,title:"Close",children:d??Yr("svg",{width:"12",height:"12",viewBox:"0 0 12 12",fill:"none","aria-hidden":"true",children:Yr("path",{d:"M1 1L11 11M11 1L1 11",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round"})})})]}),Yr("p",{className:"ri-sidepanel__title",children:i})]}),Yr("div",{className:"ri-sidepanel__search-wrap",children:Yr("input",{className:"ri-sidepanel__search",type:"text",placeholder:a,value:r,onChange:y=>o(y.target.value)})}),Yr("div",{className:"ri-sidepanel__list",children:s})]})]})}import{jsx as Ji,jsxs as pT}from"react/jsx-runtime";function Yu({objectBindings:e,onAction:t,onFocus:n,onHover:i,isOpen:r,onToggle:o}){let[a,s]=cb(null),[c,l]=cb(""),u=dT(()=>Object.entries(e).filter(([d,p])=>{let g=c.toLowerCase();return d.toLowerCase().includes(g)||(p.label??"").toLowerCase().includes(g)}),[e,c]);return Ji(lb,{openButtonLabel:"",openButtonAriaLabel:"Open scene objects panel",openButtonIcon:Ji(uT,{width:16,height:16,"aria-hidden":"true"}),eyebrow:"SCENE OBJECTS",title:`${u.length} visible entries`,searchValue:c,onSearchChange:l,searchPlaceholder:"Search nodes, labels",isOpen:r,onToggle:o,closeButtonAriaLabel:"Close scene objects panel",children:u.map(([d,p])=>{let g=p.visible!==!1,f=a===d;return pT("div",{onClick:()=>n(p),onMouseEnter:()=>{s(d),i?.(p)},onMouseLeave:()=>{s(null),i?.(null)},className:`ri-sidepanel__row${f?" ri-sidepanel__row--hovered":""}`,children:[Ji("span",{className:`ri-sidepanel__label${f?" ri-sidepanel__label--hovered":""}`,children:p.label??d}),Ji("button",{type:"button",onClick:v=>{v.stopPropagation(),t?.({objectId:d,action:{id:"toggle-visibility",label:"Toggle Visibility",type:"command"},binding:p})},className:"ri-sidepanel__vis-btn",title:g?"Hide":"Show",children:Ji("span",{className:`ri-sidepanel__checkbox${g?" ri-sidepanel__checkbox--checked":""}`,children:g&&Ji("svg",{width:"9",height:"9",viewBox:"0 0 10 10",fill:"none",children:Ji("path",{d:"M1.5 5L4 7.5L8.5 2.5",stroke:"white",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round"})})})})]},d)})})}import{AlertTriangle as op,Box as Ob,Camera as ZT,Download as e2,Eraser as t2,FileImage as n2,RotateCcw as r2,ChevronLeft as i2,Square as Db,ChevronRight as o2,RectangleGoggles as a2,QrCode as s2,X as ap,Expand as l2,Play as c2,Pause as d2,Smartphone as Nb,PencilRuler as u2,RulerDimensionLine as p2,Grid3X3 as h2}from"lucide-react";import{createContext as hT,useContext as mT}from"react";var Ku=hT({isInsideEditor:!1,activeTab:"object",activeSubTab:"General",tier:"free"});var tr=()=>mT(Ku);import{jsx as db,jsxs as gT}from"react/jsx-runtime";function Qo({visible:e,message:t,tone:n="default",spinner:i=!0}){return e?gT("div",{className:"bb-loadingOverlay",role:"status","aria-live":"polite",children:[i&&db("span",{className:"bb-loadingSpinner","aria-hidden":"true"}),db("span",{className:`bb-loadingMessage bb-status--${n}`,children:t})]}):null}var Ju=new WeakSet;function Zo(e){Ju.add(e)}function ub(e){let t=Ju.has(e);return t&&Ju.delete(e),t}import{useRef as xt,useEffect as fs,useMemo as Kr,useSyncExternalStore as yT}from"react";import{useThree as vT,useFrame as wT}from"@react-three/fiber";import{Sphere as CT,Line as ST}from"@react-three/drei";import{Vector3 as Gt,Vector2 as MT,AdditiveBlending as Qu,Plane as gb,TextureLoader as TT}from"three";var pb="data:image/png;base64,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";var hb="data:image/png;base64,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";var mb="data:image/png;base64,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";import{Fragment as NT,jsx as We,jsxs as vn}from"react/jsx-runtime";var ea=-100,ta=100,Mb=.03,PT=.03,kT=.03,fb=.5,_T=pb,AT=hb,RT=mb,ET=Math.PI/4,bb=.4,ra=64,xb=Mb*3,Zu="#4d7dff",yb="#ffcc00",vb=.02,Tb=new Gt(0,1,0),sc=32,wb="#ff9d3d",lc=4,Er=1.4,cc=.35,LT=.13,Cb=.12,Sb=.055,BT={x:"#ff4444",y:"#44ff44",z:"#4444ff"};function Pb(e){return new Gt(e==="x"?1:0,e==="y"?1:0,e==="z"?1:0)}function OT(e,t){let n=Pb(e);t.lengthSq()<1e-8&&(t=n.clone());let i=new Gt().crossVectors(n,new Gt().crossVectors(t,n));if(i.lengthSq()<1e-8){let r=Math.abs(n.y)<.9?Tb:new Gt(1,0,0);i=new Gt().crossVectors(n,r)}return i.normalize()}function ep(e){let t=new Float32Array((ra+1)*3);for(let n=0;n<=ra;n++){let i=n/ra*Math.PI*2,r=Math.cos(i)*bb,o=Math.sin(i)*bb,a=0,s=0,c=0;e==="x"?(s=r,c=o):e==="y"?(a=r,c=o):(a=r,s=o),t[n*3]=a,t[n*3+1]=s,t[n*3+2]=c}return t}function DT(e){let t=Math.abs(e.y)<.99?new Gt(0,1,0):new Gt(1,0,0),n=new Gt().crossVectors(e,t).normalize(),i=new Gt().crossVectors(e,n).normalize();return[n,i]}function na(e,t,n){return Math.min(Math.max(e,t),n)}var ia=null,tp=new Set;function bs(e){ia!==e&&(ia=e,tp.forEach(t=>t()))}function np(e){return tp.add(e),()=>tp.delete(e)}function dc(){return ia}function kb({light:e,position:t,color:n,intensity:i,visible:r,onPositionChange:o,onDraggingChange:a}){let{activeTab:s,activeSubTab:c,setActiveTab:l,setActiveSubTab:u}=tr(),{camera:d,gl:p,raycaster:g,invalidate:f}=vT(),v=xt(null),P=xt(null),y=xt(null),h=xt(null),m=xt(null),S=xt(null),M=xt(null),T=xt(null),E=xt(null),b=xt(null),C=xt(null),x=xt(null),k=xt(null),I=xt(null),A=xt(null),z=xt(null),_=xt(null),F=xt({dragging:!1,axis:null}),j=xt(new gb),L=xt(new Gt),B=xt(null),G=xt(null),U=xt(new Gt),oe=xt(!1),xe=xt(new gb),le=xt(a);fs(()=>{le.current=a},[a]);let ge=Kr(()=>new Gt(t[0],t[1],t[2]),[t]),we=Kr(()=>new Float32Array(6),[]),Me=Kr(()=>new Float32Array(6),[]),ne=Kr(()=>ep("x"),[]),pt=Kr(()=>ep("y"),[]),Ee=Kr(()=>ep("z"),[]),Ae=Kr(()=>new Float32Array((sc+1)*3),[]),Be=Kr(()=>new Float32Array(lc*2*3),[]),Ve=e?.type==="point",Fe=e?.type==="spot",At=Ve?AT:Fe?RT:_T,Le=Ve?PT:Fe?kT:Mb,jt=Kr(()=>new TT().load(At),[At]),St=yT(np,dc,dc),Oe=!!e&&St===e.id;if(fs(()=>{oe.current||(U.current.copy(ge),f())},[ge,f]),fs(()=>{e&&ia===e.id&&!r&&bs(null)},[e?.id,r]),fs(()=>()=>{e&&ia===e.id&&bs(null)},[e?.id]),wT(()=>{if(v.current&&v.current.position.copy(U.current),y.current){y.current.lookAt(d.position);let $=d,q;$.isOrthographicCamera?q=Le/$.zoom:q=d.position.distanceTo(U.current)*Le,y.current.scale.setScalar(q)}if(M.current){let $=d,q;$.isOrthographicCamera?q=xb/$.zoom:q=d.position.distanceTo(U.current)*xb,M.current.scale.setScalar(q)}if(C.current){let $=d,q;$.isOrthographicCamera?q=Sb/$.zoom:q=d.position.distanceTo(U.current)*Sb,C.current.scale.setScalar(q)}if(m.current){let $=m.current.getAttribute("position"),q=$.array;q[0]=0,q[1]=0,q[2]=0,q[3]=U.current.x,q[4]=U.current.y,q[5]=U.current.z,$.needsUpdate=!0,m.current.computeBoundingSphere()}if(S.current){let $=U.current,q=$.length();S.current.visible=q>fb,q>1e-6&&(S.current.position.copy($).multiplyScalar(.5),S.current.scale.set(1,q,1),S.current.quaternion.setFromUnitVectors(Tb,$.clone().normalize()))}if(h.current&&(h.current.visible=U.current.length()>fb),Fe&&T.current&&E.current&&b.current){let $=U.current,q=$.length();if(q>1e-6){T.current.visible=!0;let Te=$.clone().negate().normalize(),ze=q,Pe=e?.angle??Math.PI/6,ce=ze*Math.tan(Pe),He=$.clone().add(Te.clone().multiplyScalar(ze)),[nt,dt]=DT(Te),Nn=E.current.getAttribute("position"),hn=Nn.array;for(let at=0;at<=sc;at++){let Re=at/sc*Math.PI*2,Mt=He.x+(nt.x*Math.cos(Re)+dt.x*Math.sin(Re))*ce,mt=He.y+(nt.y*Math.cos(Re)+dt.y*Math.sin(Re))*ce,Tt=He.z+(nt.z*Math.cos(Re)+dt.z*Math.sin(Re))*ce;hn[at*3]=Mt,hn[at*3+1]=mt,hn[at*3+2]=Tt}Nn.needsUpdate=!0,E.current.computeBoundingSphere();let Ce=b.current.getAttribute("position"),Ye=Ce.array;for(let at=0;at<lc;at++){let Re=at/lc*Math.PI*2,Mt=He.x+(nt.x*Math.cos(Re)+dt.x*Math.sin(Re))*ce,mt=He.y+(nt.y*Math.cos(Re)+dt.y*Math.sin(Re))*ce,Tt=He.z+(nt.z*Math.cos(Re)+dt.z*Math.sin(Re))*ce,Rt=at*6;Ye[Rt]=$.x,Ye[Rt+1]=$.y,Ye[Rt+2]=$.z,Ye[Rt+3]=Mt,Ye[Rt+4]=mt,Ye[Rt+5]=Tt}Ce.needsUpdate=!0,b.current.computeBoundingSphere()}else T.current.visible=!1}if(B.current&&(B.current.visible=F.current.dragging),G.current&&F.current.dragging){let $=G.current.getAttribute("position"),q=$.array;q[0]=L.current.x,q[1]=L.current.y,q[2]=L.current.z,q[3]=U.current.x,q[4]=U.current.y,q[5]=U.current.z,$.needsUpdate=!0,G.current.computeBoundingSphere()}}),fs(()=>{let $=Ce=>{let Ye=p.domElement.getBoundingClientRect();return new MT((Ce.clientX-Ye.left)/Ye.width*2-1,-((Ce.clientY-Ye.top)/Ye.height)*2+1)},q=Ce=>!!Ce.target.closest?.("button, input, textarea, .ri-annotationPopup, .ri-colorPicker, .ri-materialPicker"),Te=()=>{let Ce=[];return[x.current,A.current,k.current,z.current,I.current,_.current].forEach(Ye=>{Ye&&Ce.push(Ye)}),Ce},ze=Ce=>Ce===x.current||Ce===A.current?"x":Ce===k.current||Ce===z.current?"y":Ce===I.current||Ce===_.current?"z":null,Pe=()=>{F.current.dragging&&(F.current={dragging:!1,axis:null},B.current&&(B.current.visible=!1),p.domElement.style.cursor="default",le.current?.(!1))},ce=()=>{oe.current&&(oe.current=!1,p.domElement.style.cursor="default",le.current?.(!1))},He=Ce=>{if(F.current.dragging&&F.current.axis){let mt=F.current.axis,Tt=U.current,Rt=Pb(mt),cr=new Gt().subVectors(d.position,Tt),ue=OT(mt,cr);j.current.setFromNormalAndCoplanarPoint(ue,Tt);let R=$(Ce);g.setFromCamera(R,d);let N=new Gt,H=g.ray.intersectPlane(j.current,N);if(!H)return;let Y=H.clone().sub(Tt).dot(Rt),se=Tt.clone().add(Rt.clone().multiplyScalar(Y)),ae=[na(mt==="x"?se.x:Tt.x,ea,ta),na(mt==="y"?se.y:Tt.y,ea,ta),na(mt==="z"?se.z:Tt.z,ea,ta)];U.current.set(ae[0],ae[1],ae[2]),o?.(ae),f();return}if(!oe.current)return;let Ye=$(Ce);g.setFromCamera(Ye,d);let at=new Gt,Re=g.ray.intersectPlane(xe.current,at);if(!Re)return;let Mt=[na(Re.x,ea,ta),na(Re.y,ea,ta),na(Re.z,ea,ta)];U.current.set(Mt[0],Mt[1],Mt[2]),o?.(Mt),f()},nt=Ce=>{if(q(Ce))return;let Ye=$(Ce);if(g.setFromCamera(Ye,d),Oe){let Mt=Te(),mt=Mt.length?g.intersectObjects(Mt,!1):[];if(mt.length>0){let Tt=mt[0].object,Rt=ze(Tt);if(Rt){let cr=U.current;F.current={dragging:!0,axis:Rt},L.current.copy(cr),le.current?.(!0),p.domElement.style.cursor="grabbing",p.domElement.setPointerCapture(Ce.pointerId),Ce.preventDefault(),Ce.stopPropagation();return}}}let at=[];if(P.current&&at.push(P.current),y.current&&at.push(y.current),at.length===0)return;if(g.intersectObjects(at,!1).length>0){let Mt=e?.id??null;ia!==Mt&&(bs(Mt),l?.("scene"),u?.("Lighting"));let mt=new Gt;d.getWorldDirection(mt),xe.current.setFromNormalAndCoplanarPoint(mt,U.current),oe.current=!0,le.current?.(!0),p.domElement.style.cursor="grabbing",p.domElement.setPointerCapture(Ce.pointerId),Ce.preventDefault(),Ce.stopPropagation()}},dt=Ce=>{if(F.current.dragging){Pe();try{p.domElement.releasePointerCapture(Ce.pointerId)}catch{}}if(oe.current){ce();try{p.domElement.releasePointerCapture(Ce.pointerId)}catch{}}},Nn=()=>{Pe(),ce()},hn=()=>{Pe(),ce()};return p.domElement.addEventListener("pointerdown",nt),window.addEventListener("pointermove",He),window.addEventListener("pointerup",dt),window.addEventListener("pointercancel",Nn),window.addEventListener("blur",hn),()=>{p.domElement.removeEventListener("pointerdown",nt),window.removeEventListener("pointermove",He),window.removeEventListener("pointerup",dt),window.removeEventListener("pointercancel",Nn),window.removeEventListener("blur",hn)}},[d,g,p,f,o,e,l,u,Oe]),s!=="scene"||c!=="Lighting"||!e||!r||e.type==="none"||e.type==="hemisphere")return null;let re=["x","y","z"];return vn("group",{ref:$=>{$&&Eh($)},children:[vn("group",{ref:v,children:[We("sprite",{ref:y,children:We("spriteMaterial",{map:jt,transparent:!0,opacity:.9,blending:Qu,depthWrite:!1,rotation:Fe?ET:0},At)}),We(CT,{ref:P,args:[.25,16,16],children:We("meshBasicMaterial",{transparent:!0,opacity:.01})}),Ve&&vn("group",{ref:M,children:[vn("lineLoop",{renderOrder:999,children:[We("bufferGeometry",{children:We("bufferAttribute",{attach:"attributes-position",args:[ne,3],count:ra+1})}),We("lineBasicMaterial",{color:Zu,transparent:!0,opacity:.6,depthTest:!1,depthWrite:!1})]}),vn("lineLoop",{renderOrder:999,children:[We("bufferGeometry",{children:We("bufferAttribute",{attach:"attributes-position",args:[pt,3],count:ra+1})}),We("lineBasicMaterial",{color:Zu,transparent:!0,opacity:.6,depthTest:!1,depthWrite:!1})]}),vn("lineLoop",{renderOrder:999,children:[We("bufferGeometry",{children:We("bufferAttribute",{attach:"attributes-position",args:[Ee,3],count:ra+1})}),We("lineBasicMaterial",{color:Zu,transparent:!0,opacity:.6,depthTest:!1,depthWrite:!1})]})]}),Oe&&We("group",{ref:C,children:re.map($=>{let q=BT[$],Te=new Gt($==="x"?Er:0,$==="y"?Er:0,$==="z"?Er:0),ze=new Gt($==="x"?Er-cc/2:0,$==="y"?Er-cc/2:0,$==="z"?Er-cc/2:0),Pe=new Gt($==="x"?Er/2:0,$==="y"?Er/2:0,$==="z"?Er/2:0),ce=$==="x"?[0,0,-Math.PI/2]:$==="y"?[0,0,0]:[Math.PI/2,0,0],He=$==="x"?x:$==="y"?k:I,nt=$==="x"?A:$==="y"?z:_;return vn("group",{children:[We(ST,{points:[new Gt(0,0,0),Te],color:q,transparent:!0,opacity:.9,lineWidth:2,depthTest:!1}),vn("mesh",{ref:nt,position:Pe,rotation:ce,children:[We("cylinderGeometry",{args:[Cb,Cb,Er,8]}),We("meshBasicMaterial",{transparent:!0,opacity:0,depthWrite:!1})]}),vn("mesh",{ref:He,position:ze,rotation:ce,children:[We("coneGeometry",{args:[LT,cc,8]}),We("meshBasicMaterial",{color:q,depthTest:!1})]})]},$)})})]}),!Ve&&!Fe&&vn(NT,{children:[vn("mesh",{ref:S,children:[We("cylinderGeometry",{args:[vb,vb,1,8,1,!0]}),We("meshBasicMaterial",{color:yb,transparent:!0,opacity:.05,blending:Qu,depthWrite:!1,depthTest:!1})]}),vn("line",{ref:h,children:[We("bufferGeometry",{ref:m,children:We("bufferAttribute",{attach:"attributes-position",args:[we,3],count:2})}),We("lineBasicMaterial",{color:yb,transparent:!0,opacity:.7,blending:Qu})]})]}),Fe&&vn("group",{ref:T,children:[vn("lineLoop",{renderOrder:999,children:[We("bufferGeometry",{ref:E,children:We("bufferAttribute",{attach:"attributes-position",args:[Ae,3],count:sc+1})}),We("lineBasicMaterial",{color:wb,transparent:!0,opacity:.85,depthTest:!1,depthWrite:!1})]}),vn("lineSegments",{renderOrder:999,children:[We("bufferGeometry",{ref:b,children:We("bufferAttribute",{attach:"attributes-position",args:[Be,3],count:lc*2})}),We("lineBasicMaterial",{color:wb,transparent:!0,opacity:.5,depthTest:!1,depthWrite:!1})]})]}),vn("line",{ref:$=>{B.current=$,$&&($.visible=!1)},children:[We("bufferGeometry",{ref:G,children:We("bufferAttribute",{attach:"attributes-position",args:[Me,3],count:2})}),We("lineBasicMaterial",{color:"#ffffff",transparent:!0,opacity:.6})]})]})}import{useCallback as rp,useLayoutEffect as VT,useMemo as Lr,useRef as mi}from"react";import{PivotControls as FT}from"@react-three/drei";import{useFrame as UT,useThree as GT}from"@react-three/fiber";import{Euler as Lb,Matrix4 as pc,Quaternion as hc,Vector3 as xs}from"three";import{Box3 as _b,Euler as IT,Matrix4 as Ab,Quaternion as zT,Vector3 as hi}from"three";function uc(e){e.updateWorldMatrix(!0,!0);let t=new Ab().copy(e.matrixWorld).invert(),n=new _b,i=new _b,r=!1;return e.traverse(o=>{let a=o;if(!a.isMesh||!a.geometry||(a.geometry.boundingBox||a.geometry.computeBoundingBox(),!a.geometry.boundingBox))return;let s=new Ab().multiplyMatrices(t,o.matrixWorld);i.copy(a.geometry.boundingBox).applyMatrix4(s),n.union(i),r=!0}),r?n.getCenter(new hi):new hi}function Rb(e,t="XYZ"){return new zT().setFromEuler(new IT(e[0],e[1],e[2],t))}function jT(e,t,n,i,r="XYZ"){let a=new hi(...i).multiply(new hi(...n)).applyQuaternion(Rb(t,r)).add(new hi(...e));return[a.x,a.y,a.z]}function Eb(e,t,n,i,r,o="XYZ"){let a=new hi(...jT(e,t,i,r,o)),s=new hi(...r).multiply(new hi(...i)).applyQuaternion(Rb(n,o)),c=a.sub(s);return[c.x,c.y,c.z]}import{jsx as Bb}from"react/jsx-runtime";function ip({node:e,space:t,onTransformChange:n,onDraggingChange:i}){let r=GT(x=>x.invalidate),o=Lr(()=>uc(e),[e]),a=Lr(()=>new pc,[]),s=mi(!1),c=mi(new pc),l=mi(new pc),u=mi(null),d=mi(0),p=mi([]),g=mi(null),f=Lr(()=>new xs,[]),v=Lr(()=>new hc,[]),P=Lr(()=>new xs,[]),y=Lr(()=>new hc,[]),h=Lr(()=>new xs(1,1,1),[]),m=Lr(()=>new hc,[]),S=Lr(()=>new xs,[]),M=Lr(()=>new xs,[]),T=mi([0,0,0]),E=rp(()=>{s.current||(e.updateWorldMatrix(!0,!1),f.copy(o).applyMatrix4(e.matrixWorld),e.getWorldQuaternion(v),y.copy(v),t==="world"&&y.identity(),a.compose(f,y,h))},[f,a,y,h,e,o,t,v]);VT(()=>(E(),()=>{g.current!==null&&(cancelAnimationFrame(g.current),g.current=null),i(!1);for(let x of p.current)jo(x);p.current=[]}),[i,E]),UT(()=>E());let b=rp(()=>{g.current!==null&&(cancelAnimationFrame(g.current),g.current=null),e.updateWorldMatrix(!0,!0),p.current=[];for(let x of zo(e))ng(x)||(Cl(x,x.matrixWorld),p.current.push(x));e.updateWorldMatrix(!0,!1),f.copy(o).applyMatrix4(e.matrixWorld),e.getWorldQuaternion(v),e.getWorldScale(P),c.current.compose(f,v,P),l.current.copy(a),T.current=[e.rotation.x,e.rotation.y,e.rotation.z],u.current=null,s.current=!0,i(!0)},[f,a,e,i,o,v,P]),C=rp((x,k)=>{let I=c.current.clone().premultiply(k),A=l.current.clone().premultiply(k);I.decompose(S,v,M);let z=S.clone();A.decompose(f,y,h),t==="world"&&y.identity(),a.compose(f,y,h),x.decompose(S,m,M);let _=new Lb().setFromQuaternion(m,e.rotation.order),[F,j,L]=T.current,B=[F+_.x,j+_.y,L+_.z],G=new hc().setFromEuler(new Lb(B[0],B[1],B[2],e.rotation.order)),oe=(e.parent?.matrixWorld||new pc).clone().invert(),xe=z.clone().applyMatrix4(oe),le=o.clone().multiply(e.scale).applyQuaternion(G),ge=xe.clone().sub(le),we=[ge.x,ge.y,ge.z];e.position.set(we[0],we[1],we[2]),e.rotation.set(B[0],B[1],B[2],e.rotation.order),e.updateMatrixWorld(!0),r(),u.current={position:we,rotation:B}},[f,m,a,y,h,r,e,o,S,M,t,v]);return Bb("group",{children:Bb(FT,{matrix:a,autoTransform:!1,fixed:!0,scale:90,lineWidth:3,axisColors:["#ff2d6f","#64dfa6","#2f8fe8"],hoveredColor:"#ffd84d",opacity:.95,depthTest:!1,disableScaling:!0,onDragStart:b,onDrag:(x,k,I,A)=>C(k,A),onDragEnd:()=>{s.current=!1;let x=u.current;if(u.current=null,x)n(x),g.current=requestAnimationFrame(()=>{g.current=null,i(!1)});else if(p.current.length>0){for(let k of p.current)jo(k);e.updateMatrixWorld(!0),r(),i(!1)}else i(!1);p.current=[]}})})}import{Fragment as Qi,jsx as X,jsxs as je}from"react/jsx-runtime";function m2(e){let t=e.object;if(!t.isSkinnedMesh||!e.face||!t.skeleton)return null;let n=t.geometry,i=n.getAttribute("skinIndex"),r=n.getAttribute("skinWeight"),o=n.getAttribute("position");if(!i||!r||!o)return null;let a=t.worldToLocal(e.point.clone()),s=[e.face.a,e.face.b,e.face.c],c=new Ln,l=s[0],u=1/0;for(let g of s){c.fromBufferAttribute(o,g);let f=c.distanceToSquared(a);f<u&&(u=f,l=g)}let d=i.getComponent(l,0),p=r.getComponent(l,0);for(let g=1;g<4;g++){let f=r.getComponent(l,g);f>p&&(p=f,d=i.getComponent(l,g))}return t.skeleton.bones[d]??null}function g2(e){let t=m2(e)??e.object,n=Ua(t);if(!n)return null;t.updateWorldMatrix(!0,!1);let i=t.worldToLocal(e.point.clone());return{anchorNodeName:n,anchorLocalPosition:[i.x,i.y,i.z]}}function f2(e,t,n){if(!e.anchorNodeName||!e.anchorLocalPosition)return!1;let i=gr(t,e.anchorNodeName);return i?(i.updateWorldMatrix(!0,!1),n.set(...e.anchorLocalPosition).applyMatrix4(i.matrixWorld),!0):!1}function b2({annotation:e,enabled:t,controlsRef:n,offsetRef:i}){let r=qT(p=>p.scene),o=ct(null),a=ct(!1),s=Tn(()=>new Ln,[]),c=Tn(()=>new Ln,[]),l=Tn(()=>new Ln,[]),u=e?.anchorNodeName,d=e?.anchorLocalPosition;return Ct(()=>{o.current=null,a.current=!1},[u,e?.id]),XT(()=>{let p=n.current,g=i.current;if(!t||!p||!g||!u||!d){a.current=!1;return}let f=o.current;if((!f||!f.parent)&&(f=gr(r,u),o.current=f),!f){a.current=!1;return}f.updateWorldMatrix(!0,!1),s.set(d[0],d[1],d[2]).applyMatrix4(f.matrixWorld),!(a.current&&s.distanceToSquared(c)<1e-8)&&(c.copy(s),a.current=!0,l.copy(s).add(g),p.setLookAt(l.x,l.y,l.z,s.x,s.y,s.z,!0))}),null}function x2(e){let t={total:0,missing:0};return e.traverse(n=>{let i=n;!i.isMesh||!i.geometry||(t.total+=1,i.geometry.getAttribute("uv")||(t.missing+=1))}),t}function y2(e,t){let n=t?.camera;if(!(n instanceof zb))return null;let r=(e instanceof oa?e:new oa().setFromObject(e)).getSize(new Ln).length();return!Number.isFinite(r)||r<=0?null:(n.near=r/100,n.far=r*100,n.updateProjectionMatrix(),t&&(t.maxDistance=r*10),r)}function v2(e,t){let n=e.camera;if(!(n instanceof zb)||!(t>0))return;let i=Math.min(Math.max(e.distance/200,t/1e5),t/100);Math.abs(i-n.near)<=n.near*.01||(n.near=i,n.updateProjectionMatrix())}async function Ib(e,t,n=.6){let i=e.smoothTime;e.smoothTime=n;try{return await t()}finally{e.smoothTime=i}}function mc({modelUrl:e,tilesetUrl:t,tilesErrorTarget:n=8,tilesCacheSize:i=800,onObjectCatalog:r,modelFormat:o,licenseKey:a,licenseValidationUrl:s,objectBindings:c,selectedObject:l,panelHoveredObject:u,onObjectBindingsChange:d,onObjectSelect:p,onObjectHover:g,onObjectEditLeaseChange:f,onModelLoaded:v,onLoadError:P,onAction:y,onHiddenObjectsChange:h,onCameraChange:m,onViewerReady:S,onTextureUpload:M,onAnimationsReady:T,onAnnotationsChange:E,activeAnnotation:b,onActiveAnnotationChange:C,lights:x,camera:k,backgroundColor:I,shadows:A=!0,showObjectBindingDataPanel:z=!0,customObjectBindingDataPanel:_,customSceneObjectsPanel:F,showSceneObjectsPanel:j=!0,showDownloadButton:L=!0,downloadFilename:B="model",showResetButton:G=!0,showLoadingOverlay:U=!0,showMouseController:oe=!1,mouseControllerPosition:xe="center-bottom",mouseControllerOpacity:le=1,moveSensitivity:ge=.08,zoomSensitivity:we=1,sceneConfig:Me,onSceneConfigChange:ne,disableZoom:pt=!1,zoomOnSelected:Ee=!0,highlightOnHover:Ae=!0,enableCameraControls:Be=!0,onAutoFit:Ve,refitOnResize:Fe=!0,renderMode:At="demand",maxDpr:Le=2,preserveDrawingBuffer:jt=!1,performanceProfile:St="auto",dracoDecoderPath:Oe,ktx2TranscoderPath:re,meshopt:$=!0,showMeasureTools:q=!1,showUvCheckerButton:Te=!1,showExplodeControls:ze=!1,cinematic:Pe,measurementUnit:ce="m",enableXR:He=!1,usdzUrl:nt,arScaleMode:dt="normalized",mobileHandoffUrl:Nn,showAnnotationNavigation:hn=!0,showAnnotationOnHover:Ce=!1,moveModeEnabled:Ye=!1,objectTransformSpace:at="world",enableKeyboardNavigation:Re=!1,showViewGizmo:Mt=!1}){let{isInsideEditor:mt,activeTab:Tt,activeSubTab:Rt}=tr(),cr=mt&&Tt==="scene"&&Rt==="Lighting",ue=ic(a,s),R=Tn(()=>Me??Ri,[Me]),[N,H]=Ue(null),Z=R.model.renderer==="uv-checker",Y=Te?N??Z:Z,se=Tn(()=>{let w=Y?"uv-checker":Z?"pbr":R.model.renderer;return w===R.model.renderer?R:{...R,model:{...R.model,renderer:w}}},[Z,R,Y]);Ct(()=>{H(null)},[e,R.model.renderer,Te,t]);let ae=Tn(()=>{if(I)return I;let w=R.background;return w.enabled&&w.type==="color"?w.color:"#1c1c1d"},[I,R]),rt=Tn(()=>({dracoDecoderPath:Oe,ktx2TranscoderPath:re,meshopt:$}),[Oe,re,$]),st=Tn(()=>Gh(St),[St]),fe=ct(null),[De,ut]=Ue(!1);Ct(()=>{fe.current&&(fe.current.dollySpeed=Math.max(we,0))},[we]),Ct(()=>{fe.current&&(fe.current.enabled=Be&&!De)},[Be,De]);let pe=ct(null),gt=ct(new Map),Wt=ct(null),on=ct(null),Et=ct(null),zt=ct({});Ct(()=>()=>{for(let w of Object.values(zt.current))URL.revokeObjectURL(w)},[]);let Ke=ct({}),[,wr]=Ue(0),vt=ke(()=>{wr(w=>w+1)},[]),uo=ct({}),ma=ct(null),Wn=ct(null),[Or,Ac]=Ue(null),Rc=ke(w=>{Wn.current=w,Ac(w)},[]),po=ct(new Set),$n=ct(null);Ct(()=>{let w=Or;if(!w||!Re||!Be||Ye)return;let D=new Set(["w","a","s","d"," ","c"]),te=new Set(["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"]),ie=0,de=Ze=>Ze.code==="Space"?" ":Ze.key.toLowerCase(),wt=()=>{po.current.clear(),ie=0,$n.current!==null&&(cancelAnimationFrame($n.current),$n.current=null)},bt=Ze=>{let nn=fe.current,it=po.current;if(!nn||it.size===0){$n.current=null,ie=0;return}let fn=ie?Math.min((Ze-ie)/1e3,.05):1/60;ie=Ze;let Xt=Math.max(nn.distance*.75,.01)*fn;it.has("w")&&nn.forward(Xt,!1),it.has("s")&&nn.forward(-Xt,!1),it.has("a")&&nn.truck(-Xt,0,!1),it.has("d")&&nn.truck(Xt,0,!1),it.has(" ")&&nn.truck(0,Xt,!1),it.has("c")&&nn.truck(0,-Xt,!1),$n.current=requestAnimationFrame(bt)},tn=Ze=>{if(Ze.target!==w){wt();return}if(te.has(Ze.key)){let it=fe.current;if(!it)return;Ze.preventDefault();let fn=Math.PI/90,Xt=Math.max(it.distance*.05,.01);Ze.key==="ArrowUp"?Ze.shiftKey?it.forward(Xt,!0):it.rotate(0,-fn,!0):Ze.key==="ArrowDown"?Ze.shiftKey?it.forward(-Xt,!0):it.rotate(0,fn,!0):Ze.key==="ArrowLeft"?it.rotate(-fn,0,!0):it.rotate(fn,0,!0);return}let nn=de(Ze);D.has(nn)&&(Ze.preventDefault(),po.current.add(nn),$n.current===null&&($n.current=requestAnimationFrame(bt)))},$t=Ze=>{po.current.delete(de(Ze))};return w.addEventListener("keydown",tn),w.addEventListener("keyup",$t),w.addEventListener("blur",wt),()=>{w.removeEventListener("keydown",tn),w.removeEventListener("keyup",$t),w.removeEventListener("blur",wt),wt()}},[Or,Be,Re,Ye]);let Pt=ct(null),[ga,dr]=Ue(c),[Qr,ho]=Ue({}),[_s,Zr]=Ue(null),[wi,In]=Ue(null),[Ec,ur]=Ue(null),[fa,Lc]=Ue(null),[zn,mo]=Ue(null),[Xn,Ci]=Ue(null),mn=ct(null),go=ct(null),ba=ct(0),Bc=ct(null),[As,Oc]=Ue(0),Cr=ct(!1),Si=ct(!1),xa=ct(!!k);xa.current=!!k;let qn=ct(null),[ya,Mi]=Ue(!!e),[fo,Ti]=Ue(!e||!!Ve||!!k),[Dr,Rs]=Ue(!1),[Dc,va]=Ue(!1),[Es,ei]=Ue(!1),[Ls,Bs]=Ue(!1),[Os,Nc]=Ue(null),[Ic,Ds]=Ue(!1),[Pi,Ns]=Ue({total:0,missing:0}),[zc,wa]=Ue("Loading model..."),pr=ct({}),ki=ke(()=>{let w=fe.current;if(!w||qn.current)return;let D=w.getPosition(new Ln),te=w.getTarget(new Ln);qn.current={position:[D.x,D.y,D.z],target:[te.x,te.y,te.z]}},[]),[O,V]=Ue(!1),[J,be]=Ue(0),[ve,Lt]=Ue(!1);Ct(()=>{be(0),Lt(!1)},[e,t]);let lt=Tn(()=>{let w=R.cinematic,D=w?.enabled?{waypoints:w.waypoints,duration:w.duration,loop:w.loop,autoPlay:w.autoPlay}:null;return Pe===void 0?D&&(D.waypoints?.length??0)>=2?D:null:Pe===!1?null:Pe===!0?D??{}:{...D??{},...Pe}},[Pe,R]),[Ne,gn]=Ue(!1),[N0,bo]=Ue(!1),jc=ct(!1);Ct(()=>{gn(!1),bo(!1),jc.current=!1},[e,t]),Ct(()=>{!lt?.autoPlay||jc.current||Dr&&fo&&!ya&&(jc.current=!0,gn(!0),bo(!1))},[lt,Dr,fo,ya]);let{xrStore:_i,presenterRef:I0,arSupported:Vc,vrSupported:qp,quickLookSupported:Yp,resolvedMobileHandoffUrl:Is,isMobileHandoffOpen:Kp,arOverlay:z0,openMobileHandoff:j0,closeMobileHandoff:Jp,openQuickLook:V0,handleARStateChange:F0}=$h({enableXR:He,usdzUrl:nt,mobileHandoffUrl:Nn}),[Sr,Qp]=Ue(()=>Me?.annotations??[]);Ct(()=>{if(Sr.length>0){let w=Sr.reduce((D,te)=>Math.max(D,te.id),0);Vs.current=w}else Vs.current=0},[Sr]);let[An,zs]=Ue(null),[ti,js]=Ue({title:"",description:""}),Vs=ct(0),[U0,Zp]=Ue(null),[Yn,xo]=Ue(-1),[eh,Fs]=Ue(!1),yo=ct(null),Vt=Tn(()=>[...Sr].sort((w,D)=>w.id-D.id),[Sr]),Us=Tn(()=>Yn<0||Yn>=Vt.length?null:Vt[Yn],[Yn,Vt]),Mr=ke(w=>{if(b!==void 0){C?.(w);return}Zp(w?{annotation:w}:null)},[b,C]),vo=ke(w=>{let D=fe.current,te=mn.current;if(!D)return;let ie=new Ln,de=gt.current.get(w.id);de?ie.copy(de):te&&f2(w,te,ie)||ie.set(w.worldPosition[0],w.worldPosition[1],w.worldPosition[2]),pe.current=null;let wt=D.smoothTime;D.smoothTime=.6;let bt=w.worldNormal;if(te){let tn=new oa().setFromObject(te),$t=new Ln;tn.getCenter($t);let Ze=new Ln;tn.getSize(Ze);let nn=Ze.length()*.2,it;bt?it=new Ln(bt[0],bt[1],bt[2]):it=ie.clone().sub($t),it.lengthSq()<1e-6&&it.set(0,0,1),it.normalize();let fn=Math.max(nn*.6,.3),Xt=ie.clone().add(it.multiplyScalar(fn));D.setPosition(Xt.x,Xt.y,Xt.z,!0),w.anchorNodeName&&w.anchorLocalPosition&&(pe.current=Xt.clone().sub(ie))}D.setTarget(ie.x,ie.y,ie.z,!0),yo.current&&clearTimeout(yo.current),yo.current=setTimeout(()=>{D.smoothTime=wt,yo.current=null},800),Mr(w)},[Mr]),G0=ke(()=>{Vt.length!==0&&(V(!0),xo(0),vo(Vt[0]))},[Vt,vo]),H0=ke(()=>{if(Vt.length===0||Yn<0)return;Fs(!0);let w=(Yn-1+Vt.length)%Vt.length;xo(w),vo(Vt[w]),setTimeout(()=>Fs(!1),500)},[Yn,Vt,vo]),W0=ke(()=>{if(Vt.length===0||Yn<0)return;if(Yn===Vt.length-1){if(V(!1),xo(-1),Mr(null),fe.current&&qn.current){let D=qn.current;fe.current.setLookAt(D.position[0],D.position[1],D.position[2],D.target[0],D.target[1],D.target[2],!0)}return}Fs(!0);let w=Yn+1;xo(w),vo(Vt[w]),setTimeout(()=>Fs(!1),500)},[Yn,Vt,vo,Mr]),$0=ke(()=>{if(V(!1),xo(-1),Mr(null),fe.current&&qn.current){let w=qn.current;fe.current.setLookAt(w.position[0],w.position[1],w.position[2],w.target[0],w.target[1],w.target[2],!0)}},[Mr]);Ct(()=>{xo(-1),V(!1)},[Vt.length]),Ct(()=>()=>{yo.current&&clearTimeout(yo.current)},[]),Ct(()=>{Us&&O&&Mr(Us)},[Us,Mr,O]),Ct(()=>{if(Me?.annotations===void 0)return;let w=Me.annotations.map(D=>({...D,localPosition:D.localPosition??D.worldPosition}));Qp(w)},[Me?.annotations]);let Ca=ke(()=>{if(b!==void 0){C?.(null);return}Zp(null)},[b,C]),Sa=b!==void 0?b:U0?.annotation??null,Ma=Tn(()=>Sa?Sr.find(D=>D.id===Sa.id)??null:null,[Sa,Sr]);Ct(()=>{Sa&&!Ma&&Ca()},[Sa,Ma,Ca]);let Ta=d!==void 0,ft=Ta?c:ga;pr.current=ft;let X0=Tn(()=>Object.entries(ft).map(([w,D])=>JSON.stringify([w,D.modelObjectId,D.transform??null])).sort().join(""),[ft]),{measureMode:Pa,measureModeRef:q0,measurePoints:th,showDimensions:Fc,measureBox:nh,modelBounds:Y0,refreshBounds:rh,clearMeasurements:K0,toggleMeasureMode:J0,toggleDimensions:Q0,handleMeasurePointerDown:Z0,handleMeasureClick:ey}=Fh({canvasAreaRef:Wn,controlsRef:fe,sceneRef:mn,modelUrl:e,modelRotation:R.model.rotation,bindingTransformSignature:X0,modelLoaded:Dr}),{isDownloading:Uc,downloadMenuOpen:ty,uvExportError:ih,toggleDownloadMenu:ny,handleDownloadMesh:ry,handleDownloadScreenshot:iy,handleDownloadUvLayout:oy}=jh({sceneRef:mn,materialRefs:uo,rendererCaptureRef:Et,objectBindings:ft,downloadFilename:B}),oh=Tn(()=>Object.fromEntries(Object.entries(ft).filter(([,w])=>w.visible===!1).map(([w])=>[w,!0])),[ft]),Nr=Tn(()=>{let w=new WeakMap,D=new Map,te=new Map;for(let[ie,de]of Object.entries(ft))w.set(de,ie),D.has(de.id)||D.set(de.id,ie),te.has(de.modelObjectId)||te.set(de.modelObjectId,ie);return{byReference:w,byId:D,byModelObjectId:te}},[ft]),ni=ke(w=>w?Nr.byReference.get(w)??Nr.byModelObjectId.get(w.modelObjectId)??Nr.byId.get(w.id)??null:null,[Nr]),Gc=l!==void 0,ka=Gc?l??null:fa,hr=ni(ka),Hc=hr?Ke.current[hr]??null:null,ah=ni(Ae?u??wi??Ec:null),ay=ah?Ke.current[ah]??null:null,sh=ke(w=>{ur(w),g?.(w)},[g]),lh=z&&ka!==null&&hr!==null,ch=(hr?ft[hr]:null)??ka;Ct(()=>{Ta||dr(c)},[Ta,c]),Ct(()=>{h?.(oh)},[oh,h]);let wo=ke(w=>{Gc||Lc(w),p?.(w)},[Gc,p]),Co=ke(w=>{Ta||dr(w),d?.(w)},[Ta,d]),sy=ke(w=>{let D=hr;if(!D||!w)return;let te=pr.current[D];te&&Co({...pr.current,[D]:{...te,transform:{...te.transform,...w}}})},[Co,hr]),Ir=ke((w,D)=>ft[w]?w:D?ni(D):Nr.byId.get(w)??Nr.byModelObjectId.get(w)??null,[ft,ni,Nr]),_a=ke((w,D)=>{let te=Ir(w),ie=te?ft[te]:void 0;!te||!ie||Co({...ft,[te]:{...ie,style:D(ie.style)}})},[Ir,ft,Co]),Kn=ke(()=>{if(zn){let w=Qr[zn.objectId]?.hex;w!==void 0&&(_a(zn.objectId,D=>({...D,material:{...D?.material,baseColor:w}})),ho(D=>({...D,[zn.objectId]:{}})))}mo(null)},[zn,Qr,_a]),dh=ke(()=>{wo(null),Zr(null),Kn(),Ci(null)},[wo,Kn]),Wc=ke((w,D,te,ie,de)=>{let wt=ma.current,bt=Wn.current,tn=fe.current?.camera;if(!wt)return{objectId:w,x:24,y:24};let $t=wt.getBoundingClientRect(),Ze=12,nn=$t.width-D-Ze,it=$t.height-te-Ze,fn=Math.max(Ze,($t.width-D)/2),Xt=Math.max(Ze,($t.height-te)/2),Mo=Ir(w,ie),Ea=Mo?Ke.current[Mo]:null,Tr=(To,Ai)=>Ai<=Ze?Ze:Math.min(Math.max(To,Ze),Ai);if(bt&&tn&&Ea){let To=bt.getBoundingClientRect(),Ai=new Ln;new oa().setFromObject(Ea).getCenter(Ai),Ai.project(tn);let Sy=(Ai.x+1)/2*To.width+(To.left-$t.left),My=(1-Ai.y)/2*To.height+(To.top-$t.top);return{objectId:w,x:Tr(Sy+24,nn),y:Tr(My-te/2,it)}}let Yc=typeof de?.screenX=="number"?de.screenX-$t.left:fn,Kc=typeof de?.screenY=="number"?de.screenY-$t.top:Xt;return{objectId:w,x:Tr(Yc,nn),y:Tr(Kc,it)}},[Ir]),Gs=ke(w=>{let{objectId:D,action:te,binding:ie}=w;switch(Zr(w),te.id){case"toggle-visibility":{let de=D;ie?.modelObjectId&&(de=Nr.byModelObjectId.get(ie.modelObjectId)??de);let wt=ft[de],bt=wt?.visible===!1;wt&&Co({...ft,[de]:{...wt,visible:bt}});break}case"change-color":Kn(),Ci(null),ho(de=>{let wt=Ir(D,ie)??D,bt=de[D]?.hex,tn=ft[wt]?.style?.material?.baseColor;return{...de,[D]:{...de[D],hex:bt??tn??"#ffffff"}}}),mo(Wc(D,225,250,ie,w));break;case"change-material":Kn(),Ci(Wc(D,300,320,ie,w));break;default:break}y?.(w)},[Co,ft,Wc,y,Kn,Ir,Nr]);Ct(()=>{if(zn)return window.addEventListener("pointerdown",Kn),()=>window.removeEventListener("pointerdown",Kn)},[zn,Kn]),Ct(()=>{if(!Xn)return;let w=()=>Ci(null);return window.addEventListener("pointerdown",w),()=>window.removeEventListener("pointerdown",w)},[Xn]),Ct(()=>{if(!Ma)return;let w=D=>{if(Pt.current&&!Pt.current.contains(D.target)){if(D.target.closest?.(".ri-annotationMarker"))return;Ca()}};return document.addEventListener("mousedown",w),document.addEventListener("touchstart",w),()=>{document.removeEventListener("mousedown",w),document.removeEventListener("touchstart",w)}},[Ma,Ca]),Ct(()=>{if(!An)return;let w=D=>{let te=D.target;if(te.closest?.(".ri-annotationPopup")||te.closest?.("button, input, textarea, .ri-measureTools, .ri-xrTools, .ri-buttonContainer"))return;let ie=Wn.current;!ie||!ie.contains(te)||(zs(null),js({title:"",description:""}))};return document.addEventListener("mousedown",w,!0),document.addEventListener("touchstart",w,!0),()=>{document.removeEventListener("mousedown",w,!0),document.removeEventListener("touchstart",w,!0)}},[An]);let uh=ke((w,D)=>{let te=zt.current[w];te&&URL.revokeObjectURL(te),D.startsWith("blob:")?zt.current[w]=D:delete zt.current[w],_a(w,ie=>({...ie,material:{...ie?.material,texture:{path:D}}}))},[_a]),ly=w=>{let D=w.target.files?.[0],te=on.current;if(!D||!te)return;let ie=Ir(te);ie&&(M?M(D,ie).then(de=>uh(ie,de),de=>console.error("onTextureUpload failed:",de)):uh(ie,URL.createObjectURL(D)),w.target.value="")},ph=w=>{on.current=w,Wt.current?.click()},hh=w=>{let D=Ir(w);if(!D)return;_a(D,ie=>ie?.material?.texture?{...ie,material:{...ie.material,texture:void 0}}:ie);let te=zt.current[D];te&&(URL.revokeObjectURL(te),delete zt.current[D])},$c=ct(S);$c.current=S;let mr=ke(()=>{let w=fe.current;!w||!$c.current||$c.current({controls:w,scene:mn.current,objectBindings:pr.current,nodeRefs:Ke.current,homeCameraState:qn.current,captureImage:D=>qs(Et.current,D),invalidate:()=>Et.current?.invalidate()})},[]),So=ke(async(w=!1)=>{let D=fe.current,te=go.current??mn.current;if(!D||!te)return!1;try{if(w){let ie=(te instanceof oa?te:new oa().setFromObject(te)).getBoundingSphere(new JT),de=ie.center.clone(),bt=D.getPosition(new Ln).clone().sub(D.getTarget(new Ln));bt.lengthSq()<1e-6&&bt.set(0,0,1),bt.normalize();let tn=Math.max(ie.radius*10,20),$t=de.clone().add(bt.multiplyScalar(tn));await D.setLookAt($t.x,$t.y,$t.z,de.x,de.y,de.z,!1)}return Ti(!0),await Ib(D,()=>D.fitToBox(te,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5})),await new Promise(ie=>{let de=performance.now(),wt=()=>{D.active===!1||performance.now()-de>8e3?(D.dispatchEvent({type:"update"}),Et.current?.invalidate(),ie()):(Et.current?.invalidate(),setTimeout(wt,100))};setTimeout(wt,100)}),Cr.current=!0,ki(),mr(),!0}catch(ie){return console.error("Fit scene error:",ie),!1}},[ki,mr]);Ct(()=>{if(Cr.current=!1,Si.current=!1,qn.current=null,mn.current=null,go.current=null,Rs(!1),va(!1),ei(!1),Ns({total:0,missing:0}),wa("Loading model..."),!e){Mi(!1),Ti(!0);return}Mi(!0),Ti(!!Ve||xa.current);let w=!1,D=null,te=de=>{D=setTimeout(ie,de)},ie=()=>{if(w||Cr.current||Si.current)return;let de=go.current??mn.current;if(!fe.current||!de){te(100);return}if(ba.current=y2(de,fe.current)??ba.current,ub(fe.current)){Cr.current=!0,ki(),mr(),Mi(!1),Ti(!0),Et.current?.invalidate();return}Si.current=!0,(Ve?Ve():xa.current?Promise.resolve(!0):So(!0)).then(bt=>{Cr.current=bt!==!1,Cr.current?(ki(),mr(),Mi(!1)):w||te(100)}).catch(()=>{Cr.current=!1,w||te(100)}).finally(()=>{Si.current=!1})};return te(50),()=>{w=!0,D&&clearTimeout(D)}},[ki,So,e,mr,Ve,t]),Ct(()=>{if(!Fe)return;let w=Or;if(!w)return;let D=null,te=new ResizeObserver(()=>{!Cr.current||Si.current||(D&&clearTimeout(D),D=setTimeout(()=>{So()},150))});return te.observe(w),()=>{te.disconnect(),D&&clearTimeout(D)}},[Or,So,Fe]);let mh=ke(w=>{if(q0.current||(gn(!1),Kn(),Ci(null),Zr(null),wo(w),pt||!Ee))return;let D=fe.current,te=ni(w),ie=te?Ke.current[te]:null;D&&w.cameraState?.position&&w.cameraState?.target?(D.setPosition(w.cameraState.position[0],w.cameraState.position[1],w.cameraState.position[2],!0),D.setTarget(w.cameraState.target[0],w.cameraState.target[1],w.cameraState.target[2],!0)):D&&ie&&D.fitToBox(ie,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5}).catch(()=>{})},[wo,Kn,ni,pt,Ee]),gh=ke(w=>{if(wo(w),pt)return;let D=fe.current,te=ni(w),ie=te?Ke.current[te]:null;if(!D||!ie)return;let de=w.cameraState;de?.position&&de?.target?(D.setPosition(de.position[0],de.position[1],de.position[2],!0),D.setTarget(de.target[0],de.target[1],de.target[2],!0)):D.fitToBox(ie,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5}).catch(()=>{})},[wo,ni,pt]);Ct(()=>{mr()},[mr]);let fh=ke((w,D)=>{v2(D,ba.current),m?.(w,D),mr()},[mr,m]),cy=ke(w=>{Bc.current=new Set(w.map(D=>D.name)),Oc(D=>D+1),r?.(w)},[r]),dy=ke(w=>{go.current=w,Et.current?.invalidate()},[]),bh=ke(w=>{mn.current=w,rh(w),Ns(x2(w));let D=Oa(w);Nc(D>Li?D:null),Ds(!1),D>Li&&wa(`Preparing large model (${Math.round(D/1e6)}M triangles) \u2014 the first display can take a while on this device...`),Rs(!0),va(!1),Bs(!1),v?.(w),mr()},[mr,v,rh]),xh=ke(w=>{Mi(!1),Ti(!0),va(!0),P?.(w)},[P]),uy=ke((w,D)=>{if(!ne)return;let te={...R,lighting:{...R.lighting,lights:R.lighting.lights.map(ie=>ie.id===w?{...ie,position:D}:ie)}};ne(te)},[R,ne]);Ct(()=>{let w=mn.current;if(!Dr||!w){ei(!1);return}let D=Object.entries(ft);if(D.length===0){ei(!1);return}let te=t?Bc.current:new Set(Object.keys(No(w).nodesById));if(!te||te.size===0){ei(!1);return}let ie=D.some(([de,wt])=>!te.has(wt.modelObjectId??de));ei(ie)},[Dr,ft,As,t]);let Xc=ke(async()=>{if(Ve){await Ve();return}let w=fe.current;if(!w)return;let D=qn.current;try{D?await Ib(w,()=>w.setLookAt(D.position[0],D.position[1],D.position[2],D.target[0],D.target[1],D.target[2],!0)):await So()}catch(te){console.error("Reset camera error:",te)}},[Ve,So]),M_=ke(()=>{bo(!1),gn(!0)},[]),T_=ke(()=>{gn(!1)},[]),py=ke(()=>{gn(!1),bo(!0),setTimeout(()=>{Xc()},100)},[Xc]),hy=ke((w,D)=>{fh(w,D)},[fh]),my=ke(w=>{let D=Tt==="scene"&&Rt==="Annotations";if(w.target.closest("button, input, textarea, .ri-colorPicker, .ri-materialPicker, .ri-annotationPopup, .ri-annotationMarker, .ri-viewAnnotationPopup"))return;let ie=Wn.current,de=fe.current,wt=de?.camera,bt=mn.current;if(!ie||!de||!wt||!bt||!D&&!de.enabled)return;let tn=ie.getBoundingClientRect(),$t=(w.clientX-tn.left)/tn.width*2-1,Ze=-((w.clientY-tn.top)/tn.height)*2+1,nn=new KT;nn.setFromCamera(new QT($t,Ze),wt);let it=nn.intersectObject(bt,!0);if(it.length===0)return;if(!D){let{x:Tr,y:Yc,z:Kc}=it[0].point;de.setOrbitPoint(Tr,Yc,Kc);return}let fn=it[0],Xt=fn.point,Mo=bt.worldToLocal(fn.point.clone()),Ea=[0,0,1];if(fn.face){let Tr=fn.face.normal.clone().transformDirection(fn.object.matrixWorld).normalize();Ea=[Tr.x,Tr.y,Tr.z]}zs({worldPosition:[Xt.x,Xt.y,Xt.z],localPosition:[Mo.x,Mo.y,Mo.z],worldNormal:Ea,anchor:g2(fn),screenX:w.clientX-tn.left,screenY:w.clientY-tn.top}),js({title:"",description:""})},[Tt,Rt]),yh=ke(()=>{if(!An||!ti.title.trim())return;Vs.current+=1;let D={id:Vs.current,worldPosition:An.worldPosition,localPosition:An.localPosition,worldNormal:An.worldNormal,anchorNodeName:An.anchor?.anchorNodeName,anchorLocalPosition:An.anchor?.anchorLocalPosition,title:ti.title.trim(),description:ti.description},te=[...Sr,D];Qp(te),E?.(te),zs(null)},[An,ti,Sr,E]),qc=ke(()=>zs(null),[]),gy=ke(w=>{Mr(w)},[Mr]);if(ue.status==="checking")return X("div",{className:"ri-viewer ri-viewer--license-checking",children:X(Oi,{title:"Verifying License",message:"Checking your license key..."})});if(ue.status==="invalid")return X("div",{className:"ri-viewer ri-viewer--license-invalid",children:X(Oi,{tone:"error",title:"Invalid License",message:ue.isLocalDomain?ue.reason??"License has been revoked or has expired":"Failed to load. Please contact the site administrator."})});let vh=Xn?Ir(Xn.objectId):null,wh=vh?ft[vh]?.style?.material?.texture?.path:void 0,fy=Wn.current?.offsetWidth??600,by=Wn.current?.offsetHeight??400,xy=350,yy=290,vy=An?Math.min(An.screenX+12,fy-xy-8):0,wy=An?Math.min(An.screenY,by-yy-8):0,Cy=U&&!!e&&!Dc&&(!Dr||!fo||ya),Aa=He&&(_i&&(Vc||qp)||Yp||!!Is),Ra=w=>16+w*42;return je("div",{className:"ri-viewer",style:{background:ae},children:[je("div",{className:"ri-viewerLeft",ref:ma,children:[_?_({isOpen:lh,selectedObject:ch,currentAction:_s,onClose:dh,onAction:Gs}):X(qu,{isOpen:lh,selectedObject:ch,currentAction:_s,onClose:dh,onAction:Gs,renderActionExtra:w=>w==="change-color"&&zn?X(Uu,{inline:!0,colorPicker:zn,onClose:Kn,itemMaterials:Qr,setItemMaterials:ho}):w==="change-material"&&Xn?X(Hu,{inline:!0,triggerFileUpload:ph,materialPopup:Xn,textureUrl:wh,clearTexture:hh}):null}),je("div",{className:`ri-canvasArea ${Pa?"ri-canvasArea--measuring":""} ${fo?"":"ri-canvasArea--positioning"} ${Ye?"ri-canvasArea--moveMode":""}`,ref:Rc,tabIndex:Re?0:void 0,onDoubleClick:my,onPointerDown:w=>{Re&&Wn.current?.focus({preventScroll:!0}),Z0(w)},onClick:ey,children:[Es&&!Ls&&je("div",{className:"ri-bindingsMismatchBanner",children:[X(op,{size:14,className:"ri-bindingsMismatchBanner__icon"}),X("span",{children:"Object bindings data don't match this model"}),X("button",{type:"button",className:"ri-bindingsMismatchBanner__dismiss",onClick:w=>{w.stopPropagation(),Bs(!0)},"aria-label":"Dismiss",children:X(ap,{size:12})})]}),Os!==null&&!Ic&&je("div",{className:`ri-largeModelBanner ${Es&&!Ls?"ri-largeModelBanner--offset":""}`,children:[X(op,{size:14,className:"ri-largeModelBanner__icon"}),je("span",{children:["Very large model (",Math.round(Os/1e6),"M triangles) \u2014 it may render and move slowly on this device, and click/hover selection on the model is disabled. Use the objects panel to select parts."]}),X("button",{type:"button",className:"ri-largeModelBanner__dismiss",onClick:w=>{w.stopPropagation(),Ds(!0)},"aria-label":"Dismiss",children:X(ap,{size:12})})]}),se.model.renderer==="uv-checker"&&Pi.missing>0&&je("div",{className:"ri-uvCheckerBanner",role:"status",children:[X(op,{size:14,className:"ri-uvCheckerBanner__icon"}),je("span",{children:[Pi.missing===Pi.total?"UV Checker: this model has no UV0 coordinates.":`UV Checker: ${Pi.missing} of ${Pi.total} meshes have no UV0 coordinates.`," ","Missing UVs are shown in magenta."]})]}),X("input",{ref:Wt,type:"file",accept:"image/png,image/jpeg,image/webp",className:"ri-hiddenInput",onChange:ly}),je(Rd,{camera:k,backgroundColor:I,shadows:A&&R.shadows.enabled,sceneConfig:se,selectedObjectRef:Hc,hoveredObjectRef:ay,highlightOnHover:Ae,renderMode:At,maxDpr:Le,reduceGpuLoad:st,xrStore:_i,rendererCaptureRef:Et,preserveDrawingBuffer:jt,children:[x??je(Qi,{children:[X(Od,{lightingConfig:R.lighting,shadowConfig:R.shadows,shadowsEnabled:A,environmentRotation:R.environment.rotation,environmentConfig:R.environment,modelBounds:Y0,objectBindings:ft,nodeRefs:Ke}),cr&&R.lighting.lights.map(w=>!w.visible||w.type==="none"||w.type==="hemisphere"||w.attachment?null:X(kb,{light:w,position:w.position,color:w.color,intensity:w.intensity,visible:w.visible,onPositionChange:D=>uy(w.id,D)},w.id))]}),X(Ed,{controlsRef:fe,onCameraChange:hy}),Mt&&X(WT,{alignment:"top-right",margin:[80,80],renderPriority:2,onUpdate:()=>{fe.current?.update(0),Et.current?.invalidate()},children:X($T,{axisColors:["#ff3653","#8adb00","#2c8fff"],labelColor:"white"})}),Ye&&Hc&&hr&&X(ip,{node:Hc,space:at,onTransformChange:sy,onDraggingChange:w=>{ut(w),ka&&f?.(ka,w)}},hr),X(Xs,{onLoadError:xh,children:X(HT,{fallback:null,children:(()=>{let w=je(Qi,{children:[t?X(Au,{url:t,rotation:se.model.rotation,errorTarget:n,cacheSize:i,decoderConfig:rt,objectBindings:ft,itemMaterials:Qr,sceneConfig:se,selectedItem:hr,panelHoveredItem:u??wi,highlightOnHover:Ae,onItemClick:mh,onItemHover:sh,onObjectCatalog:cy,onTilesetBounds:dy,onModelLoaded:bh,onLoadError:xh,nodeRefsOut:Ke,onNodeRefsChange:vt,materialRefsOut:uo,explodeFactor:J,suspendBindingTransforms:De}):X(qd,{url:e,modelFormat:o,objectBindings:ft,selectedItem:hr,itemMaterials:Qr,onItemClick:mh,onItemHover:sh,onModelLoaded:bh,onAnimationsReady:T,nodeRefsOut:Ke,onNodeRefsChange:vt,materialRefsOut:uo,panelHoveredItem:u??wi,sceneConfig:se,zoomOnSelected:Ee,highlightOnHover:Ae,decoderConfig:rt,explodeFactor:J,suspendBindingTransforms:De}),X(Bu,{annotations:Sr,sceneConfig:R,activeAnnotation:Ma,popupRef:Pt,canvasRootRef:Wn,worldPositionsRef:gt,modelLoaded:Dr,onAnnotationClick:gy,onCloseAnnotation:Ca,hideCloseButton:O,showAnnotationOnHover:Ce}),X(b2,{annotation:Us,enabled:O,controlsRef:fe,offsetRef:pe}),lt&&X(Du,{controlsRef:fe,sceneRef:mn,config:lt,playing:Ne,resetOnPlay:N0,onFinished:()=>{gn(!1),bo(!1)},onUserInteract:()=>{gn(!1)}}),q&&X(Ou,{points:th,unit:ce,box:nh,showDimensions:Fc})]});return _i?X(qf,{ref:I0,box:nh,scaleMode:dt,onARStateChange:F0,children:w}):w})()})},t??e)]}),X(Qo,{visible:Cy,message:zc}),Aa&&je("div",{className:"ri-xrTools",style:{top:`${Ra(0)}px`},children:[!Vc&&Yp&&je("button",{type:"button",className:"ri-xrButton",onClick:V0,title:"View this model in AR with Apple Quick Look",children:[X(Ob,{size:16}),"View in AR"]}),Is&&je("button",{type:"button",className:"ri-xrButton",onClick:j0,title:"Open this experience on a phone for AR","aria-haspopup":"dialog","aria-expanded":Kp,children:[X(s2,{size:16}),X("span",{children:"Open on phone"})]}),_i&&Vc&&je("button",{type:"button",className:"ri-xrButton",onClick:()=>_i.enterAR().catch(w=>{console.error("Failed to enter AR session:",w)}),title:"View this model in your space",children:[X(Nb,{size:16}),X("span",{className:"ri-xrButtonPrefix",children:"Enter"}),X("span",{children:"AR"})]}),_i&&qp&&je("button",{type:"button",className:"ri-xrButton",onClick:()=>_i.enterVR().catch(w=>{console.error("Failed to enter VR session:",w)}),title:"View this model in VR",children:[X(a2,{size:16}),X("span",{className:"ri-xrButtonPrefix",children:"Enter"}),X("span",{children:"VR"})]})]}),z0,Kp&&Is&&X("div",{className:"ri-mobileHandoffBackdrop",onMouseDown:w=>{w.target===w.currentTarget&&Jp()},children:je("section",{className:"ri-mobileHandoffDialog",role:"dialog","aria-modal":"true","aria-labelledby":"ri-mobileHandoffTitle",children:[X("button",{type:"button",className:"ri-mobileHandoffClose",onClick:Jp,"aria-label":"Close phone handoff",children:X(ap,{size:18})}),X(Nb,{size:22,"aria-hidden":"true"}),X("h2",{id:"ri-mobileHandoffTitle",children:"View in AR"}),X("p",{children:"Scan the code and choose AR."}),X("div",{className:"ri-mobileHandoffQr",children:X(YT,{value:Is,size:208,level:"M",marginSize:4,title:"QR code to open this model on a phone"})})]})}),Te&&X("div",{className:"ri-uvCheckerTools",style:{top:`${Ra(Aa?1:0)}px`},children:X("button",{type:"button",className:`ri-measureButton ${Y?"ri-measureButton--active":""}`,onClick:()=>H(w=>!(w??Z)),title:Y?"Disable UV checker":"Enable UV checker","aria-label":Y?"Disable UV checker":"Enable UV checker","aria-pressed":Y,children:X(h2,{size:16})})}),q&&je("div",{className:"ri-measureTools",style:{top:`${Ra((Aa?1:0)+(Te?1:0))}px`},children:[X("button",{type:"button",className:`ri-measureButton ${Pa?"ri-measureButton--active":""}`,onClick:J0,title:Pa?"Stop measuring":"Measure distance","aria-pressed":Pa,children:X(u2,{size:16})}),X("button",{type:"button",className:`ri-measureButton ${Fc?"ri-measureButton--active":""}`,onClick:Q0,title:"Toggle bounding dimensions","aria-pressed":Fc,children:X(p2,{size:16})}),th.length>0&&X("button",{type:"button",className:"ri-measureButton",onClick:K0,title:"Clear measurements",children:X(t2,{size:16})}),Pa&&X("span",{className:"ri-measureHint",children:"Click points on the model to measure"})]}),ze&&je("div",{className:"ri-explodeTools",style:{top:`${Ra((Aa?1:0)+(Te?1:0)+(q?1:0))}px`},children:[X("button",{type:"button",className:`ri-measureButton ${ve||J>0?"ri-measureButton--active":""}`,onClick:()=>Lt(w=>!w),title:"Exploded view","aria-pressed":ve,children:X(l2,{size:16})}),ve&&X("div",{className:"ri-explodeSlider",onPointerDown:w=>w.stopPropagation(),children:X("input",{type:"range",min:0,max:100,value:Math.round(J*100),onChange:w=>be(Number(w.target.value)/100),"aria-label":"Explode amount"})})]}),lt&&je("div",{className:"ri-cinematicTools",style:{top:`${Ra((Aa?1:0)+(Te?1:0)+(q?1:0)+(ze?1:0))}px`},children:[X("button",{type:"button",className:`ri-measureButton ${Ne?"ri-measureButton--active":""}`,onClick:()=>{Ne?gn(!1):(bo(!1),gn(!0))},title:Ne?"Pause cinematic":"Play cinematic","aria-pressed":Ne,children:Ne?X(d2,{size:16}):X(c2,{size:16})}),Ne&&X("button",{type:"button",className:"ri-measureButton ri-measureButton--stop",onClick:py,title:"Stop cinematic and reset camera",children:X(Db,{size:16})})]}),(G||L||hn&&Vt.length>0)&&je("div",{className:"ri-buttonContainer",children:[X("div",{className:"ri-tourControls",children:hn&&Vt.length>0&&X(Qi,{children:O?je(Qi,{children:[je("button",{className:"ri-tourButton",onClick:H0,disabled:eh||Vt.length===0||Yn<=0,title:"Previous annotation",children:[X(i2,{size:16}),X("span",{children:"Prev"})]}),X("button",{className:"ri-tourButton ri-tourButton--stop",onClick:$0,title:"Stop guided tour",children:X(Db,{size:16})}),je("button",{className:"ri-tourButton ri-tourButton--next",onClick:W0,disabled:eh||Vt.length===0,title:"Next annotation",children:[X("span",{children:"Next"}),X(o2,{size:16})]})]}):X("button",{className:"ri-navButtonSingle",onClick:G0,disabled:Vt.length===0,title:"Start guided tour",children:"Guided Tour"})})}),je("div",{className:"ri-rightControls",children:[G&&X("button",{className:"ri-resetButton",onClick:Xc,title:"Reset camera view",children:X(r2,{})}),L&&je("div",{className:"ri-downloadWrapper",onPointerDown:w=>w.stopPropagation(),children:[ty&&je("div",{className:"ri-downloadMenu",children:[je("button",{className:"ri-downloadMenuItem",onClick:ry,disabled:Uc||!mn.current,children:[X(Ob,{size:14}),"Download GLB"]}),X("div",{className:"ri-downloadMenuDivider"}),jt&&je(Qi,{children:[je("button",{className:"ri-downloadMenuItem",onClick:iy,disabled:!mn.current,children:[X(ZT,{size:14}),"Download PNG"]}),X("div",{className:"ri-downloadMenuDivider"})]}),je("button",{className:"ri-downloadMenuItem",onClick:oy,disabled:!mn.current,children:[X(n2,{size:14}),"Download UV Layout"]}),ih&&X("div",{className:"ri-downloadMenuNotice",role:"status","aria-live":"polite",children:ih})]}),X("button",{className:"ri-downloadButton",onClick:ny,disabled:Uc||!mn.current,title:"Download options",children:Uc?je(Qi,{children:[X("span",{className:"ri-downloadButton__spinner"}),"Exporting\u2026"]}):je(Qi,{children:[X(e2,{size:15}),"Download"]})})]})]})]}),An&&je("div",{className:"ri-annotationPopup",style:{left:vy,top:wy},onPointerDown:w=>w.stopPropagation(),onClick:w=>w.stopPropagation(),children:[X("input",{autoFocus:!0,className:"ri-annotationInput",placeholder:"Title *",value:ti.title,onChange:w=>js(D=>({...D,title:w.target.value})),onKeyDown:w=>{w.key==="Enter"&&yh(),w.key==="Escape"&&qc()}}),X("textarea",{className:"ri-annotationTextarea",placeholder:"Description",value:ti.description,onChange:w=>js(D=>({...D,description:w.target.value})),onKeyDown:w=>{w.key==="Escape"&&qc()},rows:5}),je("div",{className:"ri-annotationActions",children:[X("button",{onClick:yh,className:`ri-annotationOkBtn ${ti.title.trim()?"":"disabled"}`,disabled:!ti.title.trim(),children:"OK"}),X("button",{onClick:qc,className:"ri-annotationCancelBtn",children:"Cancel"}),X("div",{className:"ri-annotationIcons"})]})]})]}),_&&zn&&X(Uu,{colorPicker:zn,onClose:Kn,itemMaterials:Qr,setItemMaterials:ho}),_&&Xn&&X(Hu,{triggerFileUpload:ph,materialPopup:Xn,textureUrl:wh,clearTexture:hh})]}),j&&X("div",{className:"ri-viewerRight",children:F?F({objectBindings:ft,onAction:Gs,onFocus:gh,onHover:In}):X(Yu,{objectBindings:ft,onAction:Gs,onFocus:gh,onHover:In})}),oe&&X(ob,{controlsRef:fe,enabled:!0,opacity:le,moveSensitivity:ge,position:xe})]})}import{useCallback as Ht,useEffect as co,useMemo as Dp,useRef as Cn,useState as tt}from"react";import{Redo2 as d0,Undo2 as u0,Upload as p0,ListRestart as h0,X as gk,AlertTriangle as fk}from"lucide-react";import{useCallback as Bn,useRef as aa,useState as jb}from"react";import{Vector3 as Vb}from"three";function Fb(e){return[e.x,e.y,e.z]}function gi(e,t){let n=new Vb,i=new Vb;return t.getPosition(n),t.getTarget(i),{position:Fb(n),target:Fb(i),fov:"fov"in e&&typeof e.fov=="number"?e.fov:null,zoom:"zoom"in e&&typeof e.zoom=="number"?e.zoom:1,azimuthAngle:t.azimuthAngle,polarAngle:t.polarAngle}}function w2(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 ys(e,t,n=.6){let i=e.smoothTime;e.smoothTime=n;try{return await t()}finally{e.smoothTime=i}}function sp(e={}){let t=aa(e);t.current=e;let n=aa(null),[i,r]=jb(null),[o,a]=jb(()=>({...e.presets})),s=aa(o);s.current=o;let c=Bn(C=>{r(x=>w2(x,C)?x:C)},[]),l=Bn((C,x)=>{c(gi(C,x))},[c]),u=aa(null),d=aa(null),p=aa(null),g=Bn(C=>{n.current=C;let x=gi(C.controls.camera,C.controls);c(x),C.scene!==d.current&&(d.current=C.scene,u.current=null,p.current=null),C.homeCameraState&&!u.current&&(u.current=C.homeCameraState);let{initialPosition:k,initialTarget:I,initialTransition:A=!1}=t.current;if((k||I)&&C.scene&&(k||C.homeCameraState)&&p.current!==C.controls){p.current=C.controls,C.homeCameraState||Zo(C.controls);let z=k??x.position,_=I??x.target;C.controls.setLookAt(z[0],z[1],z[2],_[0],_[1],_[2],A).then(()=>{if(n.current?.controls!==C.controls)return;let F=gi(C.controls.camera,C.controls);u.current={position:F.position,target:F.target},c(F)}).catch(()=>{})}},[c]),f=Bn(async()=>{let C=n.current,x=C?.controls;if(!x)return!1;try{let k=u.current;return k?await ys(x,()=>x.setLookAt(k.position[0],k.position[1],k.position[2],k.target[0],k.target[1],k.target[2],!0)):C?.scene?await ys(x,()=>x.fitToBox(C.scene,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5})):await ys(x,()=>x.reset(!0)),!0}catch{return!1}},[]),v=Bn(async()=>{let C=n.current;if(!C?.controls||!C.scene)return!1;try{return await ys(C.controls,()=>C.controls.fitToBox(C.scene,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5})),!0}catch{return!1}},[]),P=Bn(async C=>{let x=n.current;if(!x?.controls)return!1;let k=bn(x.objectBindings,C);if(!k)return!1;let I=x.nodeRefs[k];if(!I)return!1;try{return await ys(x.controls,()=>x.controls.fitToBox(I,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5})),!0}catch{return!1}},[]),y=Bn(async(C,x=!0)=>{let k=n.current?.controls;if(!k)return!1;try{return n.current?.homeCameraState||Zo(k),await k.setTarget(C[0],C[1],C[2],x),c(gi(k.camera,k)),!0}catch{return!1}},[c]),h=Bn(async(C,x=!0)=>{let k=n.current?.controls;if(!k)return!1;try{n.current?.homeCameraState||Zo(k);let I=[k.setLookAt(C.position[0],C.position[1],C.position[2],C.target[0],C.target[1],C.target[2],x)];C.azimuthAngle!=null&&C.polarAngle!=null&&I.push(k.rotateTo(C.azimuthAngle,C.polarAngle,x)),await Promise.all(I);let A=k.camera,z=!1;return C.fov!=null&&"fov"in A&&typeof A.fov=="number"&&(A.fov=C.fov,z=!0),C.zoom!=null&&"zoom"in A&&typeof A.zoom=="number"&&(A.zoom=C.zoom,z=!0),z&&"updateProjectionMatrix"in A&&A.updateProjectionMatrix(),c(gi(A,k)),!0}catch{return!1}},[c]),m=Bn((C,x=!0)=>h(C,x),[h]),S=Bn((C,x,k=!0)=>h({position:C,target:x},k),[h]),M=Bn(async(C,x,k=!0)=>{let I=n.current?.controls;if(!I)return!1;try{return n.current?.homeCameraState||Zo(I),await I.rotateTo(C,x,k),c(gi(I.camera,I)),!0}catch{return!1}},[c]),T=Bn(async(C,x=!0)=>{let k=n.current?.controls;if(!k)return!1;try{return n.current?.homeCameraState||Zo(k),await k.dollyTo(C,x),c(gi(k.camera,k)),!0}catch{return!1}},[c]),E=Bn(C=>{let x=n.current?.controls,k=C.trim();if(!x||!k)return null;let I=gi(x.camera,x);return s.current={...s.current,[k]:I},a(A=>({...A,[k]:I})),c(I),I},[c]),b=Bn((C,x=!0)=>{let k=s.current[C];return k?h(k,x):Promise.resolve(!1)},[h]);return{cameraState:i,cameraPresets:o,resetView:f,focusObject:P,fitScene:v,setCameraTarget:y,setCameraState:m,lookAt:S,orbitTo:M,dollyTo:T,savePreset:E,goToPreset:b,handleCameraChange:l,handleViewerReady:g}}import{useCallback as sa,useEffect as C2,useRef as Ub,useState as Zi}from"react";function lp(){let e=Ub(null),[t,n]=Zi([]),i=Ub(null),[r,o]=Zi([]),[a,s]=Zi(null),[c,l]=Zi(!1),[u,d]=Zi(1),[p,g]=Zi(0),[f,v]=Zi(0);C2(()=>()=>{i.current?.()},[]);let P=sa(T=>{i.current?.(),e.current=T,n(T.clips),o(T.clipDetails??T.clips.map(b=>({sourceName:b,duration:0})));let E=T.getState?.()??{currentClip:null,isPlaying:!1,speed:1,time:0,duration:0};s(E.currentClip),l(E.isPlaying),d(E.speed),g(E.time),v(E.duration),T.subscribe?i.current=T.subscribe(b=>{s(b.currentClip),l(b.isPlaying),d(b.speed),g(b.time),v(b.duration)}):i.current=null},[]),y=sa(T=>{e.current?.play(T),s(T),l(!0)},[]),h=sa(()=>{e.current?.pause(),l(!1)},[]),m=sa(()=>{e.current?.stop(),s(null),l(!1),g(0)},[]),S=sa(T=>{e.current?.setSpeed(T),d(T)},[]),M=sa(T=>{e.current?.seek?.(T),g(T)},[]);return{clips:t,clipDetails:r,currentClip:a,isPlaying:c,speed:u,time:p,duration:f,play:y,pause:h,stop:m,setSpeed:S,seek:M,handleAnimationsReady:P}}import{useState as yP,useEffect as vP}from"react";import{useState as B2}from"react";import{ChevronDown as O2,ChevronLeft as D2,ChevronRight as N2,RotateCcw as I2}from"lucide-react";import{HexColorInput as z2,HexColorPicker as j2}from"react-colorful";import{useLayoutEffect as M2,useRef as Hb,useState as Wb}from"react";import{createPortal as T2}from"react-dom";import{ChevronDown as P2,Info as k2}from"lucide-react";import{HexColorInput as _2,HexColorPicker as A2}from"react-colorful";function la(e){let t=e.replace("#","").match(/.{2}/g).map(i=>parseInt(i,16)/255).map(i=>i<=.03928?i/12.92:Math.pow((i+.055)/1.055,2.4));return .2126*t[0]+.7152*t[1]+.0722*t[2]>.179?"#000":"#fff"}import{useEffect as S2}from"react";function Gb(e,t,n){S2(()=>{if(!n)return;let i=Array.isArray(e)?e:[e],r=o=>{let a=o.target;i.some(c=>c.current?.contains(a))||t()};return document.addEventListener("pointerdown",r,!0),()=>{document.removeEventListener("pointerdown",r,!0)}},[e,t,n])}import{jsx as Je,jsxs as Pn}from"react/jsx-runtime";function cp({anchorRef:e,onClose:t,children:n}){let i=Hb(null),[r,o]=Wb(null);return Gb([i,e],t,!0),M2(()=>{let a=e.current;if(!a)return;let s=a.getBoundingClientRect(),c=222,l=8,u=Math.min(Math.max(s.right-c,l),window.innerWidth-c-l),d=Math.min(s.bottom+6,window.innerHeight-200);o({top:d,left:u})},[e]),r?T2(Je("div",{ref:i,className:"se-colorPickerPopover",style:{position:"fixed",top:r.top,left:r.left},children:n}),document.body):null}function R2(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 eo({title:e,children:t}){return Pn("section",{className:"se-section",children:[Je("h3",{className:"se-sectionTitle",children:e}),Je("div",{className:"se-sectionBody",children:t})]})}function $e({title:e,open:t,onToggle:n,trailing:i,children:r,disabled:o,tooltip:a}){let s=a?`${a}`:e;return Pn("section",{className:"se-panel",children:[Pn("button",{type:"button",className:"se-panelHeader",onClick:n,"aria-expanded":t,title:s,children:[Pn("span",{className:"se-panelHeaderMain",children:[Je(P2,{size:16,className:`se-panelChevron ${t?"se-panelChevron--open":""}`}),Je("span",{className:"se-panelTitle",children:e}),a?Je("span",{className:"se-panelHelp",title:s,"aria-label":s,role:"img",onClick:c=>c.stopPropagation(),children:Je(k2,{size:13})}):null]}),i?Je("span",{className:"se-panelTrailing",onClick:c=>c.stopPropagation(),children:i}):null]}),t?Je("div",{className:"se-panelBody",style:o?{opacity:.45,pointerEvents:"none"}:void 0,children:r}):null]})}function et({checked:e,onChange:t,label:n}){return Pn("label",{className:"se-switch","aria-label":n,children:[Je("input",{type:"checkbox",checked:e,onChange:i=>t(i.target.checked)}),Je("span",{className:"se-switchTrack",children:Je("span",{className:"se-switchThumb"})})]})}function W({label:e,value:t,min:n,max:i,step:r,formatValue:o,onChange:a,disabled:s=!1}){return Pn("label",{className:`se-field ${s?"se-field--disabled":""}`,children:[Pn("span",{className:"se-fieldLabel",children:[e,Je("span",{className:"se-fieldValue",children:o?o(t):t})]}),Je("input",{className:"se-slider",type:"range",min:n,max:i,step:r,value:t,onChange:c=>a(Number(c.target.value)),disabled:s})]})}function ot({label:e,checked:t,onChange:n}){return Pn("label",{className:"se-field se-fieldInline",children:[Je("span",{className:"se-fieldLabel",children:e}),Je("input",{type:"checkbox",className:"se-checkbox",checked:t,onChange:i=>n(i.target.checked)})]})}function Fn({label:e,value:t,options:n,onChange:i}){return Pn("label",{className:"se-field se-fieldInline",children:[Je("span",{className:"se-fieldLabel",children:e}),Je("select",{className:"se-select",value:t,onChange:r=>i(r.target.value),children:n.map(r=>Je("option",{value:r,children:R2(r)},r))})]})}function nr({label:e,value:t,onChange:n}){let[i,r]=Wb(!1),o=Hb(null);return Pn("div",{className:"se-field",children:[Pn("div",{className:"se-fieldInline",children:[Je("span",{className:"se-fieldLabel",children:e}),Je("span",{ref:o,style:{display:"inline-flex"},children:Je(_2,{prefixed:!0,className:"se-swatch",onClick:()=>r(a=>!a),style:{background:t,color:la(t)},color:t,onChange:n})})]}),i?Je(cp,{anchorRef:o,onClose:()=>r(!1),children:Je(A2,{color:t,onChange:n})}):null]})}function fi({label:e,value:t,min:n,max:i,step:r,onChange:o}){return Pn("div",{className:"se-field",children:[Je("span",{className:"se-fieldLabel",children:e}),Je("div",{className:"se-vectorRow",children:["X","Y","Z"].map((s,c)=>Pn("label",{className:"se-vectorAxis",children:[Je("span",{children:s}),Je("input",{type:"number",className:"se-numberInput",min:n,max:i,step:r,value:t[c],onChange:l=>{let u=[...t];u[c]=Number(l.target.value),o(u)}})]},s))})]})}function to({label:e,value:t,min:n,max:i,step:r,onChange:o}){return Pn("div",{className:"se-field",children:[Je("span",{className:"se-fieldLabel",children:e}),Je("div",{className:"se-vectorRow",children:["X","Y"].map((s,c)=>Pn("label",{className:"se-vectorAxis",children:[Je("span",{children:s}),Je("input",{type:"number",className:"se-numberInput",min:n,max:i,step:r,value:t[c],onChange:l=>{let u=[...t];u[c]=Number(l.target.value),o(u)}})]},s))})]})}var $b={free:0,starter:1,growth:2};function Xb(e){return e==="starter"||e==="growth"||e==="scale"?e==="scale"?"growth":e:"free"}function Jr(e,t){return $b[e]>=$b[t]}var qb={free:"Free",starter:"Starter",growth:"Growth"};import{Lock as E2}from"lucide-react";import{jsx as L2,jsxs as Yb}from"react/jsx-runtime";function On({requiredTier:e,feature:t}){return Yb("div",{className:"bb-tierLock",children:[L2(E2,{size:16}),Yb("p",{className:"bb-tierLockMessage",children:[t," requires the ",qb[e]," plan or higher."]})]})}import{Fragment as dp,jsx as me,jsxs as Yt}from"react/jsx-runtime";var V2=["lit","unlit","normals"],F2=["color","image","environment"];function Kb(e){let t=e%360;return t<0?t+360:t}function gc({title:e,open:t,onToggle:n,children:i,trailing:r}){return Yt("section",{className:"se-panel",children:[Yt("button",{type:"button",className:"se-panelHeader",onClick:n,"aria-expanded":t,children:[Yt("span",{className:"se-panelHeaderMain",children:[me(O2,{size:16,className:`se-panelChevron ${t?"se-panelChevron--open":""}`}),me("span",{className:"se-panelTitle",children:e})]}),r?me("span",{className:"se-panelTrailing",onClick:o=>o.stopPropagation(),children:r}):null]}),t?me("div",{className:"se-panelBody",children:i}):null]})}function up({config:e,onChange:t}){let{model:n,camera:i,wireframe:r,background:o,environment:a}=e,{tier:s}=tr(),c=Jr(s,"starter"),[l,u]=B2({general:!0,camera:!0,wireframe:!1,background:!1}),d=h=>u(m=>({...m,[h]:!m[h]})),p=h=>t({...e,model:h}),g=h=>t({...e,camera:h}),f=h=>t({...e,wireframe:h}),v=h=>t({...e,background:h}),P=h=>t({...e,environment:h}),y=h=>{P({...a,source:"preset",preset:h})};return Yt("div",{className:"se-generalContent",children:[Yt(gc,{title:"General",open:l.general,onToggle:()=>d("general"),children:[Yt("div",{className:"se-field",children:[Yt("div",{className:"se-fieldLabel",children:[me("span",{children:"Straighten model"}),me("button",{type:"button",className:"se-iconButton",onClick:()=>p({...n,rotation:[0,0,0]}),"aria-label":"Reset model rotation",children:me(I2,{size:16})})]}),me("div",{className:"se-axisStepperGrid",children:["X","Y","Z"].map((h,m)=>Yt("div",{className:"se-axisStepper",children:[me("button",{type:"button",className:"se-axisStepperButton",onClick:()=>{let S=[...n.rotation];S[m]=Kb(S[m]-90),p({...n,rotation:S})},"aria-label":`Rotate ${h} axis backward`,children:me(D2,{size:16})}),me("span",{className:"se-axisStepperLabel",children:h}),me("button",{type:"button",className:"se-axisStepperButton",onClick:()=>{let S=[...n.rotation];S[m]=Kb(S[m]+90),p({...n,rotation:S})},"aria-label":`Rotate ${h} axis forward`,children:me(N2,{size:16})})]},h))})]}),me(fi,{label:"Rotation",value:n.rotation,min:0,max:360,step:1,onChange:h=>p({...n,rotation:h})}),Yt("div",{className:"se-field",children:[me("span",{className:"se-fieldLabel",children:"Renderer"}),me("div",{className:"se-segmentedControl se-segmentedControl--renderer",children:Sh.map(h=>me("button",{type:"button",className:`se-segmentedOption ${n.renderer===h?"se-segmentedOption--active":""}`,onClick:()=>p({...n,renderer:h}),children:h==="uv-checker"?"UV CHECKER":h.toUpperCase()},h))})]}),me(Fn,{label:"Shading",value:n.shading,options:V2,onChange:h=>p({...n,shading:h})})]}),me(gc,{title:"Camera",open:l.camera,onToggle:()=>d("camera"),children:me(W,{label:"Field Of View",value:i.fieldOfView,min:20,max:100,step:.1,formatValue:h=>`${h.toFixed(3)}\xB0`,onChange:h=>g({...i,fieldOfView:h})})}),me(gc,{title:"Wireframe",open:l.wireframe,onToggle:()=>d("wireframe"),trailing:Yt("label",{className:"se-switch","aria-label":"Toggle wireframe preview",children:[me("input",{type:"checkbox",checked:c&&r.enabled,disabled:!c,onChange:h=>f({...r,enabled:h.target.checked})}),me("span",{className:"se-switchTrack",children:me("span",{className:"se-switchThumb"})})]}),children:c?Yt(dp,{children:[me(W,{label:"Opacity",value:r.opacity,min:0,max:1,step:.01,onChange:h=>f({...r,opacity:h})}),me(nr,{label:"Wire color",value:r.color,onChange:h=>f({...r,color:h})})]}):me(On,{requiredTier:"starter",feature:"Wireframe preview"})}),me(gc,{title:"Background",open:l.background,onToggle:()=>d("background"),trailing:Yt("label",{className:"se-switch","aria-label":"Toggle scene background",children:[me("input",{type:"checkbox",checked:o.enabled,onChange:h=>v({...o,enabled:h.target.checked})}),me("span",{className:"se-switchTrack",children:me("span",{className:"se-switchThumb"})})]}),children:o.enabled?Yt(dp,{children:[Yt("div",{className:"se-field",children:[me("span",{className:"se-fieldLabel",children:"Background type"}),me("div",{className:"se-segmentedControl",children:F2.map(h=>me("button",{type:"button",className:`se-segmentedOption ${o.type===h?"se-segmentedOption--active":""}`,onClick:()=>v({...o,type:h}),children:h},h))})]}),o.type==="environment"?c?Yt(dp,{children:[Yt("div",{className:"se-field",children:[me("span",{className:"se-fieldLabel",children:"Environment source"}),Yt("div",{className:"se-segmentedControl",children:[me("button",{type:"button",className:`se-segmentedOption ${a.source==="preset"?"se-segmentedOption--active":""}`,onClick:()=>P({...a,source:"preset"}),children:"PRESET"}),me("button",{type:"button",className:`se-segmentedOption ${a.source==="custom"?"se-segmentedOption--active":""}`,onClick:()=>P({...a,source:"custom"}),children:"CUSTOM"})]})]}),a.source==="preset"?me(Fn,{label:"Environment preset",value:a.preset,options:Mh,onChange:y}):Yt("label",{className:"se-field",children:[me("span",{className:"se-fieldLabel",children:"Custom environment URL"}),me("input",{type:"text",className:"se-textInput",placeholder:"https://example.com/environment.hdr",value:a.customEnvironmentUrl,onChange:h=>P({...a,customEnvironmentUrl:h.target.value})}),me("span",{className:"bb-note",children:"Enter a HDR, EXR, JPG, JPEG, PNG, or WEBP URL."}),a.customEnvironmentUrl.trim()&&!Hs(a.customEnvironmentUrl)?me("span",{className:"bb-note",style:{color:"#fca5a5"},children:"Invalid image/HDRI URL."}):null]}),me(W,{label:"Environment intensity",value:a.intensity,min:0,max:3,step:.05,onChange:h=>P({...a,intensity:h})})]}):me(On,{requiredTier:"starter",feature:"Environment backgrounds"}):null,o.type==="image"?Yt("label",{className:"se-field",children:[me("span",{className:"se-fieldLabel",children:"Background image URL"}),me("input",{type:"text",className:"se-textInput",placeholder:"https://example.com/background.jpg",value:o.imageUrl,onChange:h=>v({...o,imageUrl:h.target.value})})]}):null,o.type==="color"?Yt("div",{className:"se-field",children:[me("span",{className:"se-fieldLabel",children:"Background color"}),me("div",{className:"se-inlineColorPicker",children:me(j2,{color:o.color,onChange:h=>v({...o,color:h})})}),me("div",{className:"se-fieldInline",children:me(z2,{prefixed:!0,className:"se-swatch",style:{background:o.color,color:la(o.color)},color:o.color,onChange:h=>v({...o,color:h})})})]}):null]}):me("div",{className:"se-placeholder",children:"Background rendering is disabled for this scene preset."})})]})}import{useState as G2}from"react";import{jsx as he,jsxs as vs}from"react/jsx-runtime";function Jb({pp:e,set:t,open:n,toggle:i}){let{ssao:r}=e;return vs($e,{title:"SSAO",tooltip:"Adds soft contact shadows in corners, creases, and tight spaces.",open:n.ssao,onToggle:()=>i("ssao"),disabled:!r.enabled,trailing:he(et,{checked:r.enabled,onChange:o=>t("ssao",{...r,enabled:o}),label:"Toggle SSAO"}),children:[he(W,{label:"Samples",value:r.samples,min:1,max:64,step:1,onChange:o=>t("ssao",{...r,samples:o})}),he(W,{label:"Rings",value:r.rings,min:1,max:12,step:1,onChange:o=>t("ssao",{...r,rings:o})}),he(W,{label:"Intensity",value:r.intensity,min:0,max:20,step:.5,onChange:o=>t("ssao",{...r,intensity:o})}),he(W,{label:"Radius",value:r.radius,min:.01,max:1,step:.01,onChange:o=>t("ssao",{...r,radius:o})}),he(W,{label:"Bias",value:r.bias,min:0,max:.1,step:.001,onChange:o=>t("ssao",{...r,bias:o})}),he(W,{label:"Luminance Influence",value:r.luminanceInfluence,min:0,max:1,step:.01,onChange:o=>t("ssao",{...r,luminanceInfluence:o})}),he(W,{label:"Fade",value:r.fade,min:0,max:.1,step:.001,onChange:o=>t("ssao",{...r,fade:o})}),he(W,{label:"Min Radius Scale",value:r.minRadiusScale,min:0,max:1,step:.01,onChange:o=>t("ssao",{...r,minRadiusScale:o})}),he(W,{label:"World Distance Threshold",value:r.worldDistanceThreshold,min:0,max:100,step:.1,onChange:o=>t("ssao",{...r,worldDistanceThreshold:o})}),he(W,{label:"World Distance Falloff",value:r.worldDistanceFalloff,min:0,max:20,step:.1,onChange:o=>t("ssao",{...r,worldDistanceFalloff:o})}),he(W,{label:"World Proximity Threshold",value:r.worldProximityThreshold,min:0,max:100,step:.1,onChange:o=>t("ssao",{...r,worldProximityThreshold:o})}),he(W,{label:"World Proximity Falloff",value:r.worldProximityFalloff,min:0,max:20,step:.1,onChange:o=>t("ssao",{...r,worldProximityFalloff:o})})]})}function Qb({pp:e,set:t,open:n,toggle:i}){let{autofocus:r}=e;return vs($e,{title:"Auto focus",tooltip:"Keeps the focus plane tracking a subject so the image stays sharp where you want it.",open:n.autofocus,onToggle:()=>i("autofocus"),disabled:!r.enabled,trailing:he(et,{checked:r.enabled,onChange:o=>t("autofocus",{...r,enabled:o}),label:"Toggle Autofocus"}),children:[he(W,{label:"Focus Distance",value:r.focusDistance,min:0,max:50,step:.1,onChange:o=>t("autofocus",{...r,focusDistance:o})}),he(W,{label:"Focus Range",value:r.focusRange,min:.1,max:50,step:.1,onChange:o=>t("autofocus",{...r,focusRange:o})}),he(W,{label:"Focal Length",value:r.focalLength,min:0,max:1,step:.01,onChange:o=>t("autofocus",{...r,focalLength:o})}),he(W,{label:"Bokeh Scale",value:r.bokehScale,min:0,max:20,step:.1,onChange:o=>t("autofocus",{...r,bokehScale:o})}),he(fi,{label:"Target",value:r.target,min:-100,max:100,step:.1,onChange:o=>t("autofocus",{...r,target:o})}),he(ot,{label:"Mouse Follow",checked:r.mouse,onChange:o=>t("autofocus",{...r,mouse:o})}),he(ot,{label:"Manual Update",checked:r.manual,onChange:o=>t("autofocus",{...r,manual:o})}),he(W,{label:"Debug",value:r.debug,min:0,max:1,step:.01,onChange:o=>t("autofocus",{...r,debug:o})}),he(W,{label:"Smooth Time",value:r.smoothTime,min:0,max:2,step:.01,onChange:o=>t("autofocus",{...r,smoothTime:o})})]})}function Zb({pp:e,set:t,open:n,toggle:i}){let{godRays:r}=e;return vs($e,{title:"God Rays",tooltip:"Creates light shafts that streak outward from a bright sun or light source.",open:n.godRays,onToggle:()=>i("godRays"),disabled:!r.enabled,trailing:he(et,{checked:r.enabled,onChange:o=>t("godRays",{...r,enabled:o}),label:"Toggle GodRays"}),children:[he(fi,{label:"Sun Position",value:r.sunPosition,min:-100,max:100,step:.1,onChange:o=>t("godRays",{...r,sunPosition:o})}),he(W,{label:"Samples",value:r.samples,min:1,max:128,step:1,onChange:o=>t("godRays",{...r,samples:o})}),he(W,{label:"Density",value:r.density,min:0,max:2,step:.01,onChange:o=>t("godRays",{...r,density:o})}),he(W,{label:"Decay",value:r.decay,min:0,max:1,step:.01,onChange:o=>t("godRays",{...r,decay:o})}),he(W,{label:"Weight",value:r.weight,min:0,max:2,step:.01,onChange:o=>t("godRays",{...r,weight:o})}),he(W,{label:"Exposure",value:r.exposure,min:0,max:2,step:.01,onChange:o=>t("godRays",{...r,exposure:o})}),he(W,{label:"Clamp Max",value:r.clampMax,min:0,max:2,step:.01,onChange:o=>t("godRays",{...r,clampMax:o})}),he(ot,{label:"Blur",checked:r.blur,onChange:o=>t("godRays",{...r,blur:o})}),he(Fn,{label:"Kernel Size",value:r.kernelSize,options:La,onChange:o=>t("godRays",{...r,kernelSize:o})})]})}function ex({pp:e,set:t,open:n,toggle:i}){let{lensflare:r}=e;return vs($e,{title:"Lens Flare",tooltip:"Adds camera flare artifacts and glow from a bright light source.",open:n.lensflare,onToggle:()=>i("lensflare"),disabled:!r.enabled,trailing:he(et,{checked:r.enabled,onChange:o=>t("lensflare",{...r,enabled:o}),label:"Toggle Lensflare"}),children:[he(fi,{label:"Lens Position",value:r.lensPosition,min:-100,max:100,step:.1,onChange:o=>t("lensflare",{...r,lensPosition:o})}),he(W,{label:"Smooth Time",value:r.smoothTime,min:0,max:1,step:.01,onChange:o=>t("lensflare",{...r,smoothTime:o})}),he(W,{label:"Glare Size",value:r.glareSize,min:0,max:1,step:.01,onChange:o=>t("lensflare",{...r,glareSize:o})}),he(W,{label:"Flare Size",value:r.flareSize,min:0,max:.1,step:.001,onChange:o=>t("lensflare",{...r,flareSize:o})}),he(W,{label:"Flare Speed",value:r.flareSpeed,min:0,max:.2,step:.001,onChange:o=>t("lensflare",{...r,flareSpeed:o})}),he(W,{label:"Flare Shape",value:r.flareShape,min:0,max:.2,step:.001,onChange:o=>t("lensflare",{...r,flareShape:o})}),he(ot,{label:"Animated",checked:r.animated,onChange:o=>t("lensflare",{...r,animated:o})}),he(ot,{label:"Anamorphic",checked:r.anamorphic,onChange:o=>t("lensflare",{...r,anamorphic:o})}),he(nr,{label:"Color Gain",value:r.colorGain,onChange:o=>t("lensflare",{...r,colorGain:o})}),he(W,{label:"Halo Scale",value:r.haloScale,min:0,max:2,step:.01,onChange:o=>t("lensflare",{...r,haloScale:o})}),he(ot,{label:"Secondary Ghosts",checked:r.secondaryGhosts,onChange:o=>t("lensflare",{...r,secondaryGhosts:o})}),he(ot,{label:"Additional Streaks",checked:r.aditionalStreaks,onChange:o=>t("lensflare",{...r,aditionalStreaks:o})}),he(W,{label:"Ghost Scale",value:r.ghostScale,min:0,max:1,step:.01,onChange:o=>t("lensflare",{...r,ghostScale:o})}),he(W,{label:"Opacity",value:r.opacity,min:0,max:1,step:.01,onChange:o=>t("lensflare",{...r,opacity:o})}),he(ot,{label:"Star Burst",checked:r.starBurst,onChange:o=>t("lensflare",{...r,starBurst:o})})]})}function tx({pp:e,set:t,open:n,toggle:i}){let{depthOfField:r}=e;return vs($e,{title:"Depth Of Field",tooltip:"Blurs areas that sit away from the focal plane for a camera-like look.",open:n.depthOfField,onToggle:()=>i("depthOfField"),disabled:!r.enabled,trailing:he(et,{checked:r.enabled,onChange:o=>t("depthOfField",{...r,enabled:o}),label:"Toggle DepthOfField"}),children:[he(W,{label:"Focus Distance",value:r.focusDistance,min:0,max:50,step:.1,onChange:o=>t("depthOfField",{...r,focusDistance:o})}),he(W,{label:"Focus Range",value:r.focusRange,min:.1,max:50,step:.1,onChange:o=>t("depthOfField",{...r,focusRange:o})}),he(W,{label:"Focal Length",value:r.focalLength,min:0,max:1,step:.01,onChange:o=>t("depthOfField",{...r,focalLength:o})}),he(W,{label:"Bokeh Scale",value:r.bokehScale,min:0,max:20,step:.1,onChange:o=>t("depthOfField",{...r,bokehScale:o})})]})}import{jsx as Ge,jsxs as ca}from"react/jsx-runtime";var U2=["linear","reinhard","aces"];function nx({pp:e,set:t,open:n,toggle:i}){let{colorAverage:r}=e;return Ge($e,{title:"Color Average",tooltip:"Blends the frame toward a single average color for a washed-out stylized look.",open:n.colorAverage,onToggle:()=>i("colorAverage"),disabled:!r.enabled,trailing:Ge(et,{checked:r.enabled,onChange:o=>t("colorAverage",{...r,enabled:o}),label:"Toggle ColorAverage"}),children:Ge("div",{className:"se-placeholder",children:"Averages the frame color using the docs default blend mode."})})}function rx({pp:e,set:t,open:n,toggle:i}){let{brightnessContrast:r}=e;return ca($e,{title:"Brightness Contrast",tooltip:"Raises or lowers overall brightness and contrast across the scene.",open:n.brightnessContrast,onToggle:()=>i("brightnessContrast"),disabled:!r.enabled,trailing:Ge(et,{checked:r.enabled,onChange:o=>t("brightnessContrast",{...r,enabled:o}),label:"Toggle BrightnessContrast"}),children:[Ge(W,{label:"Brightness",value:r.brightness,min:-1,max:1,step:.01,onChange:o=>t("brightnessContrast",{...r,brightness:o})}),Ge(W,{label:"Contrast",value:r.contrast,min:-1,max:1,step:.01,onChange:o=>t("brightnessContrast",{...r,contrast:o})})]})}function ix({pp:e,set:t,open:n,toggle:i}){let{hueSaturation:r}=e;return ca($e,{title:"Hue Saturation",tooltip:"Shifts the hue and saturation to tint the whole image.",open:n.hueSaturation,onToggle:()=>i("hueSaturation"),disabled:!r.enabled,trailing:Ge(et,{checked:r.enabled,onChange:o=>t("hueSaturation",{...r,enabled:o}),label:"Toggle HueSaturation"}),children:[Ge(W,{label:"Hue",value:r.hue,min:-Math.PI,max:Math.PI,step:.01,formatValue:o=>`${o.toFixed(2)} rad`,onChange:o=>t("hueSaturation",{...r,hue:o})}),Ge(W,{label:"Saturation",value:r.saturation,min:-1,max:1,step:.01,onChange:o=>t("hueSaturation",{...r,saturation:o})})]})}function ox({pp:e,set:t,open:n,toggle:i}){let{vignette:r}=e;return ca($e,{title:"Vignette",tooltip:"Darkens the edges of the screen so the center feels more focused.",open:n.vignette,onToggle:()=>i("vignette"),disabled:!r.enabled,trailing:Ge(et,{checked:r.enabled,onChange:o=>t("vignette",{...r,enabled:o}),label:"Toggle Vignette"}),children:[Ge(W,{label:"Offset",value:r.offset,min:0,max:1,step:.01,onChange:o=>t("vignette",{...r,offset:o})}),Ge(W,{label:"Darkness",value:r.darkness,min:0,max:1,step:.01,onChange:o=>t("vignette",{...r,darkness:o})}),Ge(ot,{label:"Eskil",checked:r.eskil,onChange:o=>t("vignette",{...r,eskil:o})})]})}function ax({pp:e,set:t,open:n,toggle:i}){let{bloom:r}=e;return ca($e,{title:"Bloom",tooltip:"Makes bright areas glow and bleed softly into nearby pixels.",open:n.bloom,onToggle:()=>i("bloom"),disabled:!r.enabled,trailing:Ge(et,{checked:r.enabled,onChange:o=>t("bloom",{...r,enabled:o}),label:"Toggle Bloom"}),children:[Ge(W,{label:"Threshold",value:r.luminanceThreshold,min:0,max:1,step:.01,onChange:o=>t("bloom",{...r,luminanceThreshold:o})}),Ge(W,{label:"Smoothing",value:r.luminanceSmoothing,min:0,max:1,step:.01,onChange:o=>t("bloom",{...r,luminanceSmoothing:o})}),Ge(W,{label:"Intensity",value:r.intensity,min:0,max:3,step:.05,onChange:o=>t("bloom",{...r,intensity:o})}),Ge(ot,{label:"Mipmap Blur",checked:r.mipmapBlur,onChange:o=>t("bloom",{...r,mipmapBlur:o})}),Ge(W,{label:"Radius",value:r.radius,min:0,max:1,step:.01,onChange:o=>t("bloom",{...r,radius:o})}),Ge(W,{label:"Levels",value:r.levels,min:1,max:16,step:1,onChange:o=>t("bloom",{...r,levels:o})})]})}function sx({pp:e,set:t,open:n,toggle:i}){let{toneMapping:r}=e;return ca($e,{title:"Tone Mapping",tooltip:"Remaps HDR lighting to screen output and controls exposure style.",open:n.toneMapping,onToggle:()=>i("toneMapping"),disabled:!r.enabled,trailing:Ge(et,{checked:r.enabled,onChange:o=>t("toneMapping",{...r,enabled:o}),label:"Toggle ToneMapping"}),children:[ca("div",{className:"se-field",children:[Ge("span",{className:"se-fieldLabel",children:"Mode"}),Ge("div",{className:"se-segmentedControl",children:U2.map(o=>Ge("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))})]}),Ge(W,{label:"Resolution",value:r.resolution,min:64,max:4096,step:64,onChange:o=>t("toneMapping",{...r,resolution:o})}),Ge(W,{label:"White Point",value:r.whitePoint,min:0,max:16,step:.01,onChange:o=>t("toneMapping",{...r,whitePoint:o})}),Ge(W,{label:"Middle Grey",value:r.middleGrey,min:0,max:1,step:.01,onChange:o=>t("toneMapping",{...r,middleGrey:o})}),Ge(W,{label:"Min Luminance",value:r.minLuminance,min:0,max:1,step:.01,onChange:o=>t("toneMapping",{...r,minLuminance:o})}),Ge(W,{label:"Average Luminance",value:r.averageLuminance,min:0,max:4,step:.01,onChange:o=>t("toneMapping",{...r,averageLuminance:o})}),Ge(W,{label:"Adaptation Rate",value:r.adaptationRate,min:0,max:10,step:.01,onChange:o=>t("toneMapping",{...r,adaptationRate:o})}),Ge(W,{label:"Exposure",value:r.exposure,min:0,max:3,step:.01,onChange:o=>t("toneMapping",{...r,exposure:o})})]})}function lx({pp:e,set:t,open:n,toggle:i}){let{sepia:r}=e;return Ge($e,{title:"Sepia",tooltip:"Adds a warm vintage brown tint to the entire image.",open:n.sepia,onToggle:()=>i("sepia"),disabled:!r.enabled,trailing:Ge(et,{checked:r.enabled,onChange:o=>t("sepia",{...r,enabled:o}),label:"Toggle Sepia"}),children:Ge(W,{label:"Intensity",value:r.intensity,min:0,max:1,step:.01,onChange:o=>t("sepia",{...r,intensity:o})})})}import{jsx as _e,jsxs as da}from"react/jsx-runtime";function cx({pp:e,set:t,open:n,toggle:i}){let{dotScreen:r}=e;return da($e,{title:"Dot Screen",tooltip:"Overlays a halftone dot pattern for a printed or retro look.",open:n.dotScreen,onToggle:()=>i("dotScreen"),disabled:!r.enabled,trailing:_e(et,{checked:r.enabled,onChange:o=>t("dotScreen",{...r,enabled:o}),label:"Toggle DotScreen"}),children:[_e(W,{label:"Angle",value:r.angle,min:0,max:Math.PI*2,step:.01,formatValue:o=>`${o.toFixed(2)} rad`,onChange:o=>t("dotScreen",{...r,angle:o})}),_e(W,{label:"Scale",value:r.scale,min:.1,max:10,step:.05,onChange:o=>t("dotScreen",{...r,scale:o})})]})}function dx({pp:e,set:t,open:n,toggle:i}){let{glitch:r}=e;return da($e,{title:"Glitch",tooltip:"Introduces digital distortion, tearing, and scan noise.",open:n.glitch,onToggle:()=>i("glitch"),disabled:!r.enabled,trailing:_e(et,{checked:r.enabled,onChange:o=>t("glitch",{...r,enabled:o}),label:"Toggle Glitch"}),children:[_e(Fn,{label:"Mode",value:r.mode,options:Th,onChange:o=>t("glitch",{...r,mode:o})}),_e(to,{label:"Delay",value:r.delay,min:0,max:10,step:.01,onChange:o=>t("glitch",{...r,delay:o})}),_e(to,{label:"Duration",value:r.duration,min:0,max:5,step:.01,onChange:o=>t("glitch",{...r,duration:o})}),_e(to,{label:"Strength",value:r.strength,min:0,max:2,step:.01,onChange:o=>t("glitch",{...r,strength:o})}),_e(to,{label:"Chromatic Aberration Offset",value:r.chromaticAberrationOffset,min:0,max:.02,step:1e-4,onChange:o=>t("glitch",{...r,chromaticAberrationOffset:o})}),_e(W,{label:"Columns",value:r.columns,min:0,max:.5,step:.001,onChange:o=>t("glitch",{...r,columns:o})}),_e(W,{label:"Ratio",value:r.ratio,min:0,max:1,step:.01,onChange:o=>t("glitch",{...r,ratio:o})})]})}function ux({pp:e,set:t,open:n,toggle:i}){let{grid:r}=e;return da($e,{title:"Grid",tooltip:"Adds a visual grid overlay that feels retro or debug-like.",open:n.grid,onToggle:()=>i("grid"),disabled:!r.enabled,trailing:_e(et,{checked:r.enabled,onChange:o=>t("grid",{...r,enabled:o}),label:"Toggle Grid"}),children:[_e(W,{label:"Scale",value:r.scale,min:.1,max:10,step:.05,onChange:o=>t("grid",{...r,scale:o})}),_e(W,{label:"Line Width",value:r.lineWidth,min:0,max:1,step:.01,onChange:o=>t("grid",{...r,lineWidth:o})})]})}function px({pp:e,set:t,open:n,toggle:i}){let{chromaticAberration:r}=e;return da($e,{title:"Chromatic Aberration",tooltip:"Separates color channels slightly to mimic lens fringing.",open:n.chromaticAberration,onToggle:()=>i("chromaticAberration"),disabled:!r.enabled,trailing:_e(et,{checked:r.enabled,onChange:o=>t("chromaticAberration",{...r,enabled:o}),label:"Toggle ChromaticAberration"}),children:[_e(W,{label:"Offset X",value:r.offsetX,min:0,max:.02,step:1e-4,onChange:o=>t("chromaticAberration",{...r,offsetX:o})}),_e(W,{label:"Offset Y",value:r.offsetY,min:0,max:.02,step:1e-4,onChange:o=>t("chromaticAberration",{...r,offsetY:o})}),_e(ot,{label:"Radial Modulation",checked:r.radialModulation,onChange:o=>t("chromaticAberration",{...r,radialModulation:o})}),_e(W,{label:"Modulation Offset",value:r.modulationOffset,min:0,max:1,step:.01,onChange:o=>t("chromaticAberration",{...r,modulationOffset:o})})]})}function hx({pp:e,set:t,open:n,toggle:i}){let{noise:r}=e;return da($e,{title:"Noise",tooltip:"Adds film grain or static noise to the rendered image.",open:n.noise,onToggle:()=>i("noise"),disabled:!r.enabled,trailing:_e(et,{checked:r.enabled,onChange:o=>t("noise",{...r,enabled:o}),label:"Toggle Noise"}),children:[_e(W,{label:"Amount",value:r.opacity,min:0,max:1,step:.01,onChange:o=>t("noise",{...r,opacity:o})}),_e(ot,{label:"Premultiply",checked:r.premultiply,onChange:o=>t("noise",{...r,premultiply:o})})]})}function mx({pp:e,set:t,open:n,toggle:i}){let{scanline:r}=e;return _e($e,{title:"Scan Line",tooltip:"Draws horizontal CRT-style scan lines over the frame.",open:n.scanline,onToggle:()=>i("scanline"),disabled:!r.enabled,trailing:_e(et,{checked:r.enabled,onChange:o=>t("scanline",{...r,enabled:o}),label:"Toggle Scanline"}),children:_e(W,{label:"Density",value:r.density,min:0,max:10,step:.25,onChange:o=>t("scanline",{...r,density:o})})})}function gx({pp:e,set:t,open:n,toggle:i}){let{pixelation:r}=e;return _e($e,{title:"Pixelation",tooltip:"Reduces detail into larger pixels for a blocky stylized effect.",open:n.pixelation,onToggle:()=>i("pixelation"),disabled:!r.enabled,trailing:_e(et,{checked:r.enabled,onChange:o=>t("pixelation",{...r,enabled:o}),label:"Toggle Pixelation"}),children:_e(W,{label:"Granularity",value:r.granularity,min:0,max:20,step:1,onChange:o=>t("pixelation",{...r,granularity:o})})})}function fx({pp:e,set:t,open:n,toggle:i}){let{ramp:r}=e;return da($e,{title:"Ramp",tooltip:"Adds a screen-space color gradient, or masks effects earlier in the stack.",open:n.ramp,onToggle:()=>i("ramp"),disabled:!r.enabled,trailing:_e(et,{checked:r.enabled,onChange:o=>t("ramp",{...r,enabled:o}),label:"Toggle Ramp"}),children:[_e(Fn,{label:"Ramp Type",value:r.rampType,options:Ph,onChange:o=>t("ramp",{...r,rampType:o})}),_e(to,{label:"Ramp Start",value:r.rampStart,min:0,max:1,step:.01,onChange:o=>t("ramp",{...r,rampStart:o})}),_e(to,{label:"Ramp End",value:r.rampEnd,min:0,max:1,step:.01,onChange:o=>t("ramp",{...r,rampEnd:o})}),_e(nr,{label:"Start Color",value:r.startColor,onChange:o=>t("ramp",{...r,startColor:o})}),_e(nr,{label:"End Color",value:r.endColor,onChange:o=>t("ramp",{...r,endColor:o})}),!r.rampMask&&_e(W,{label:"Gradient Opacity",value:r.opacity??.5,min:0,max:1,step:.01,onChange:o=>t("ramp",{...r,opacity:o})}),_e(W,{label:"Bias",value:r.rampBias,min:0,max:1,step:.01,onChange:o=>t("ramp",{...r,rampBias:o})}),_e(W,{label:"Gain",value:r.rampGain,min:0,max:1,step:.01,onChange:o=>t("ramp",{...r,rampGain:o})}),_e(ot,{label:"Mask Earlier Effects",checked:r.rampMask,onChange:o=>t("ramp",{...r,rampMask:o})}),_e(ot,{label:"Invert",checked:r.rampInvert,onChange:o=>t("ramp",{...r,rampInvert:o})})]})}import{jsx as Bt,jsxs as vx}from"react/jsx-runtime";function bx({pp:e,set:t,open:n,toggle:i}){let{outline:r}=e;return vx($e,{title:"Outline",tooltip:"Draws a visible edge around the selected object binding.",open:n.outline,onToggle:()=>i("outline"),disabled:!r.enabled,trailing:Bt(et,{checked:r.enabled,onChange:o=>t("outline",{...r,enabled:o}),label:"Toggle Outline"}),children:[Bt("div",{className:"se-placeholder",children:"Outlines the currently selected object binding in the model editor."}),Bt(W,{label:"Selection Layer",value:r.selectionLayer,min:0,max:20,step:1,onChange:o=>t("outline",{...r,selectionLayer:o})}),Bt(W,{label:"Edge Strength",value:r.edgeStrength,min:0,max:10,step:.1,onChange:o=>t("outline",{...r,edgeStrength:o})}),Bt(W,{label:"Pulse Speed",value:r.pulseSpeed,min:0,max:10,step:.1,onChange:o=>t("outline",{...r,pulseSpeed:o})}),Bt(nr,{label:"Visible Edge Color",value:r.visibleEdgeColor,onChange:o=>t("outline",{...r,visibleEdgeColor:o})}),Bt(nr,{label:"Hidden Edge Color",value:r.hiddenEdgeColor,onChange:o=>t("outline",{...r,hiddenEdgeColor:o})}),Bt(Fn,{label:"Kernel Size",value:r.kernelSize,options:La,onChange:o=>t("outline",{...r,kernelSize:o})}),Bt(ot,{label:"Blur",checked:r.blur,onChange:o=>t("outline",{...r,blur:o})}),Bt(ot,{label:"X-Ray",checked:r.xRay,onChange:o=>t("outline",{...r,xRay:o})})]})}function xx({pp:e,set:t,open:n,toggle:i}){let{selectiveBloom:r}=e;return vx($e,{title:"Selective Bloom",tooltip:"Applies bloom only to objects assigned to the selected layer.",open:n.selectiveBloom,onToggle:()=>i("selectiveBloom"),disabled:!r.enabled,trailing:Bt(et,{checked:r.enabled,onChange:o=>t("selectiveBloom",{...r,enabled:o}),label:"Toggle SelectiveBloom"}),children:[Bt("div",{className:"se-placeholder",children:"Applies bloom to the currently selected object binding."}),Bt(W,{label:"Selection Layer",value:r.selectionLayer,min:0,max:20,step:1,onChange:o=>t("selectiveBloom",{...r,selectionLayer:o})}),Bt(W,{label:"Intensity",value:r.intensity,min:0,max:5,step:.05,onChange:o=>t("selectiveBloom",{...r,intensity:o})}),Bt(W,{label:"Threshold",value:r.luminanceThreshold,min:0,max:1,step:.01,onChange:o=>t("selectiveBloom",{...r,luminanceThreshold:o})}),Bt(W,{label:"Smoothing",value:r.luminanceSmoothing,min:0,max:1,step:.01,onChange:o=>t("selectiveBloom",{...r,luminanceSmoothing:o})}),Bt(Fn,{label:"Kernel Size",value:r.kernelSize,options:La,onChange:o=>t("selectiveBloom",{...r,kernelSize:o})}),Bt(ot,{label:"Mipmap Blur",checked:r.mipmapBlur,onChange:o=>t("selectiveBloom",{...r,mipmapBlur:o})}),Bt(ot,{label:"Inverted",checked:r.inverted,onChange:o=>t("selectiveBloom",{...r,inverted:o})}),Bt(ot,{label:"Ignore Background",checked:r.ignoreBackground,onChange:o=>t("selectiveBloom",{...r,ignoreBackground:o})})]})}function yx({pp:e,set:t,open:n,toggle:i}){let{smaa:r}=e;return Bt($e,{title:"SMAA",tooltip:"Reduces jagged edges with subpixel anti-aliasing.",open:n.smaa,onToggle:()=>i("smaa"),trailing:Bt(et,{checked:r.enabled,onChange:o=>t("smaa",{...r,enabled:o}),label:"Toggle SMAA"}),children:Bt("div",{className:"se-placeholder",children:"Subpixel Morphological Anti-Aliasing smooths jagged edges in post-process."})})}import{jsx as Ot,jsxs as H2}from"react/jsx-runtime";function pp({config:e,onChange:t}){let[n,i]=G2({autofocus:!1,colorAverage:!1,dotScreen:!1,glitch:!1,godRays:!1,grid:!1,lensflare:!1,outline:!1,selectiveBloom:!1,ramp:!1,ssao:!1,brightnessContrast:!1,hueSaturation:!1,depthOfField:!1,chromaticAberration:!1,vignette:!1,bloom:!1,toneMapping:!1,noise:!1,sepia:!1,scanline:!1,pixelation:!1,smaa:!1}),r=c=>i(l=>({...l,[c]:!l[c]})),o=e.postProcessing,s={pp:o,set:(c,l)=>t({...e,postProcessing:{...o,[c]:l}}),open:n,toggle:r};return H2("div",{className:"se-generalContent",children:[Ot(Jb,{...s}),Ot(Qb,{...s}),Ot(nx,{...s}),Ot(cx,{...s}),Ot(dx,{...s}),Ot(Zb,{...s}),Ot(ux,{...s}),Ot(ex,{...s}),Ot(bx,{...s}),Ot(xx,{...s}),Ot(rx,{...s}),Ot(ix,{...s}),Ot(tx,{...s}),Ot(px,{...s}),Ot(ox,{...s}),Ot(ax,{...s}),Ot(sx,{...s}),Ot(hx,{...s}),Ot(lx,{...s}),Ot(mx,{...s}),Ot(gx,{...s}),Ot(fx,{...s}),Ot(yx,{...s})]})}import{useState as wx,useSyncExternalStore as W2}from"react";import{Eye as $2,EyeOff as X2,Plus as q2,Trash2 as Y2}from"lucide-react";import{Fragment as Cx,jsx as Se,jsxs as Un}from"react/jsx-runtime";var K2=["512","1024","2048","4096"],Sx={none:"None",directional:"Direction",point:"Point",spot:"Spot",hemisphere:"Hemi"};function J2({index:e,light:t,selected:n,onSelect:i,onToggleVisible:r}){return Un("div",{className:`se-lightRow ${n?"se-lightRow--active":""}`,onClick:i,children:[Un("span",{className:"se-lightRowLabel",children:[e+1,": ",Sx[t.type]]}),Se("button",{type:"button",className:"se-iconButton","aria-label":t.visible?"Hide light":"Show light",onClick:o=>{o.stopPropagation(),r()},children:t.visible?Se($2,{size:14}):Se(X2,{size:14})})]})}function Q2(){return{id:crypto.randomUUID(),type:"directional",color:"#ffffff",intensity:1,position:[5,10,5],attachedToCamera:!1,castShadow:!1,shadowBias:-5e-4,visible:!0}}function hp({config:e,onChange:t}){let[n,i]=wx({lights:!0,shadows:!1,groundShadows:!1,environment:!1,envShadow:!1}),r=W2(np,dc),[o,a]=wx(e.lighting.lights[0]?.id??null),s=r??o,c=b=>{a(b),bs(b)},l=b=>i(C=>({...C,[b]:!C[b]})),{tier:u}=tr(),d=Jr(u,"starter"),{lighting:p,shadows:g,groundShadows:f,environment:v}=e,P=b=>t({...e,lighting:b}),y=b=>t({...e,shadows:b}),h=b=>t({...e,groundShadows:b}),m=b=>t({...e,environment:b}),S=(b,C)=>{P({...p,lights:p.lights.map(x=>x.id===b?{...x,...C}:x)})},M=p.lights.find(b=>b.id===s)??null,T=()=>{let b=Q2();P({...p,lights:[...p.lights,b]}),c(b.id)},E=()=>{if(!M)return;let b=p.lights.filter(C=>C.id!==M.id);P({...p,lights:b}),c(b[0]?.id??null)};return Un("div",{className:"se-generalContent",children:[Un($e,{title:"Lights",open:n.lights,onToggle:()=>l("lights"),children:[Se("div",{className:"se-lightList",children:p.lights.map((b,C)=>Se(J2,{index:C,light:b,selected:b.id===s,onSelect:()=>c(b.id),onToggleVisible:()=>S(b.id,{visible:!b.visible})},b.id))}),Un("div",{className:"se-lightActions",children:[Se("button",{type:"button",className:"se-iconButton",onClick:T,title:"Add light",children:Se(q2,{size:14})}),M&&p.lights.length>1&&Se("button",{type:"button",className:"se-iconButton",onClick:E,title:"Remove selected light",children:Se(Y2,{size:14})})]}),M?Un("div",{className:"se-lightProps",children:[Un("div",{className:"se-field",children:[Se("span",{className:"se-fieldLabel",children:"Type"}),Se("div",{className:"se-segmentedControl",style:{gridAutoColumns:"1fr"},children:Ch.map(b=>Se("button",{type:"button",className:`se-segmentedOption ${M.type===b?"se-segmentedOption--active":""}`,onClick:()=>S(M.id,{type:b}),children:Sx[b]},b))})]}),Se(nr,{label:"Color",value:M.color,onChange:b=>S(M.id,{color:b})}),Se(W,{label:"Intensity",value:M.intensity,min:0,max:10,step:.1,onChange:b=>S(M.id,{intensity:b})}),M.type!=="hemisphere"&&M.type!=="none"&&Se(fi,{label:"Position",value:M.position,min:-100,max:100,step:.05,onChange:b=>S(M.id,{position:b})}),M.type==="spot"&&Un(Cx,{children:[Se(W,{label:"Angle",value:M.angle??Math.PI/6,min:0,max:Math.PI/2,step:.01,formatValue:b=>`${Math.round(b*180/Math.PI)}\xB0`,onChange:b=>S(M.id,{angle:b})}),Se(W,{label:"Penumbra",value:M.penumbra??.2,min:0,max:1,step:.01,onChange:b=>S(M.id,{penumbra:b})}),Se(W,{label:"Distance",value:M.distance??0,min:0,max:100,step:.5,onChange:b=>S(M.id,{distance:b})}),Se(W,{label:"Decay",value:M.decay??2,min:0,max:4,step:.1,onChange:b=>S(M.id,{decay:b})})]}),Se(ot,{label:"Attached to camera",checked:M.attachedToCamera,onChange:b=>S(M.id,{attachedToCamera:b})}),Se(ot,{label:"Cast shadows",checked:M.castShadow,onChange:b=>S(M.id,{castShadow:b})}),Se(W,{label:"Shadow bias",value:M.shadowBias,min:-.01,max:.01,step:1e-4,onChange:b=>S(M.id,{shadowBias:b})})]}):null]}),Un($e,{title:"Shadows",open:n.shadows,onToggle:()=>l("shadows"),disabled:!g.enabled,trailing:Se(et,{checked:g.enabled,onChange:b=>y({...g,enabled:b}),label:"Toggle shadows"}),children:[Se(Fn,{label:"Map size",value:String(g.mapSize),options:K2,onChange:b=>y({...g,mapSize:Number(b)})}),Se(W,{label:"Bias",value:g.bias,min:-.01,max:.01,step:1e-4,onChange:b=>y({...g,bias:b})}),Se(W,{label:"Normal bias",value:g.normalBias,min:0,max:.2,step:.01,onChange:b=>y({...g,normalBias:b})}),Se(W,{label:"Radius (softness)",value:g.radius,min:0,max:20,step:.5,onChange:b=>y({...g,radius:b})})]}),Un($e,{title:"Ground Shadows",open:n.groundShadows,onToggle:()=>l("groundShadows"),disabled:!f.enabled,trailing:Se(et,{checked:f.enabled,onChange:b=>h({...f,enabled:b}),label:"Toggle ground shadows"}),children:[Un("div",{className:"se-field",children:[Se("span",{className:"se-fieldLabel",children:"Mode"}),Se("div",{className:"se-segmentedControl",style:{gridAutoColumns:"1fr"},children:["shadowCatcher"].map(b=>Se("button",{type:"button",className:`se-segmentedOption ${f.mode===b?"se-segmentedOption--active":""}`,onClick:()=>h({...f,mode:b}),children:b==="shadowCatcher"?"Shadow Catcher":"Baked AO"},b))})]}),f.mode==="bakedAO"&&Se("div",{className:"se-placeholder",children:"Requires pre-baked AO textures \u2014 not yet available."}),Se(W,{label:"Intensity",value:f.intensity,min:0,max:1,step:.01,onChange:b=>h({...f,intensity:b})}),Se(W,{label:"Border fade",value:f.borderFade,min:0,max:10,step:.1,onChange:b=>h({...f,borderFade:b})}),Se(W,{label:"Height",value:f.height,min:-5,max:5,step:.1,onChange:b=>h({...f,height:b})}),Se(W,{label:"Size",value:f.size,min:1,max:50,step:.5,onChange:b=>h({...f,size:b})})]}),Se($e,{title:"Environment",open:n.environment,onToggle:()=>l("environment"),children:d?Un(Cx,{children:[Se(W,{label:"Orientation",value:v.rotation,min:0,max:360,step:1,formatValue:b=>`${b}\xB0`,onChange:b=>m({...v,rotation:b})}),Se(W,{label:"Brightness",value:v.intensity,min:0,max:3,step:.05,onChange:b=>m({...v,intensity:b})}),Un($e,{title:"Shadow",open:n.envShadow,onToggle:()=>l("envShadow"),trailing:Se(et,{checked:v.shadowLight.enabled,onChange:b=>m({...v,shadowLight:{...v.shadowLight,enabled:b}}),label:"Toggle environment shadow light"}),disabled:!v.shadowLight.enabled,children:[Se(W,{label:"Light intensity",value:v.shadowLight.intensity,min:0,max:20,step:.1,onChange:b=>m({...v,shadowLight:{...v.shadowLight,intensity:b}})}),Se(W,{label:"Shadow bias",value:v.shadowLight.bias,min:-.01,max:.01,step:1e-4,onChange:b=>m({...v,shadowLight:{...v.shadowLight,bias:b}})})]})]}):Se(On,{requiredTier:"starter",feature:"Environment lighting"})})]})}import{useMemo as Z2,useState as eP}from"react";import{ChevronDown as tP,Pause as nP,Play as rP,Square as iP,Trash2 as oP}from"lucide-react";import{jsx as Xe,jsxs as Dt}from"react/jsx-runtime";function aP(e){if(!Number.isFinite(e)||e<=0)return"Unknown duration";let t=Math.round(e*10)/10;if(t<60)return`${t.toFixed(1)}s`;let n=Math.floor(t/60),i=(t%60).toFixed(1).padStart(4,"0");return`${n}:${i}`}function Mx(e){let t=Number.isFinite(e)&&e>0?e:0;if(t<60)return`${t.toFixed(1)}s`;let n=Math.floor(t/60),i=(t%60).toFixed(1).padStart(4,"0");return`${n}:${i}`}function sP(e){return Number.isFinite(e)?Math.min(3,Math.max(.1,Number(e.toFixed(2)))):1}function mp({config:e,onChange:t,clipDetails:n,currentClip:i,isPlaying:r,time:o,play:a,pause:s,stop:c,setSpeed:l,seek:u}){let[d,p]=eP(!1),g=Z2(()=>new Map(n.map(b=>[b.sourceName,b.duration])),[n]),f=e.animations.clips.filter(b=>!b.hidden),v=e.animations.clips.filter(b=>b.hidden),P=(b,C=e.animations.autoplayClip)=>{t({...e,animations:{clips:b(e.animations.clips),autoplayClip:C}})},y=(b,C)=>{P(x=>x.map(k=>k.sourceName===b?C(k):k))},h=(b,C)=>{y(b,x=>({...x,loopMode:C}))},m=(b,C)=>{let x=sP(C);y(b,k=>({...k,speed:x})),i===b&&l(x)},S=(b,C)=>{y(b,x=>({...x,displayName:C}))},M=b=>{let C=e.animations.autoplayClip===b?null:b;t({...e,animations:{...e.animations,autoplayClip:C}})},T=b=>{P(C=>C.map(x=>x.sourceName===b?{...x,hidden:!0}:x),e.animations.autoplayClip===b?null:e.animations.autoplayClip),i===b&&c()},E=b=>{P(C=>C.map(x=>x.sourceName===b?{...x,hidden:!1}:x))};return e.animations.clips.length===0?Xe(eo,{title:"Animations",children:Xe("div",{className:"se-helperCard",children:"Upload a model with embedded animations to manage playback, naming, autoplay, and per-clip speed here."})}):Dt(eo,{title:"Animations",children:[f.length===0&&Xe("div",{className:"se-helperCard",children:Xe("span",{children:"Preview clips directly in the viewer, choose one optional autoplay animation, and use soft delete to hide clips without modifying the GLB."})}),f.length===0?Xe("div",{className:"se-placeholder",children:"All animations are currently removed. Restore a clip below to make it available again."}):Xe("div",{className:"se-animationList",children:f.map(b=>{let C=i===b.sourceName,x=g.get(b.sourceName)??0;return Dt("article",{className:`se-animationCard ${C?"se-animationCard--active":""}`,children:[Dt("div",{className:"se-animationHeader",children:[Dt("div",{className:"se-animationHeading",children:[Dt("div",{className:"se-animationTitleRow",children:[Xe("span",{className:"se-animationStatus",children:C?r?"Playing":"Paused":"Ready"}),e.animations.autoplayClip===b.sourceName?Xe("span",{className:"se-animationBadge",children:"Autoplay"}):null]}),Xe("div",{className:"se-animationSource",children:b.sourceName})]}),Xe("button",{type:"button",className:"se-animationDangerButton",onClick:()=>T(b.sourceName),title:"Remove animation",children:Xe(oP,{size:16})})]}),Dt("div",{className:"se-field",children:[Xe("span",{className:"se-fieldLabel",children:"Display name"}),Xe("input",{className:"se-textInput",value:b.displayName,onChange:I=>S(b.sourceName,I.target.value),placeholder:"Animation name"})]}),Dt("div",{className:"se-animationMeta",children:[Xe("span",{children:aP(x)}),Xe("span",{children:b.loopMode==="once"?"Play once":"Looping"}),Dt("span",{children:[b.speed.toFixed(2),"x"]})]}),Dt("div",{className:"se-animationButtonRow",children:[(()=>{let I=C&&r;return Xe("button",{type:"button",className:"se-animationButton se-animationButton--icon",onClick:()=>I?s():a(b.sourceName),"aria-label":I?"Pause":"Play",title:I?"Pause":"Play",children:I?Xe(nP,{size:16}):Xe(rP,{size:16})})})(),Xe("button",{type:"button",className:"se-animationButton se-animationButton--icon",onClick:c,disabled:!C,"aria-label":"Stop",title:"Stop",children:Xe(iP,{size:16})})]}),Dt("div",{className:"se-animationSeekRow",children:[Xe("input",{className:"se-slider se-animationSeek",type:"range",min:0,max:Math.max(x,.001),step:.01,value:C?Math.min(o,x):0,disabled:!C||x<=0,onChange:I=>u(Number(I.target.value)),"aria-label":"Seek"}),Dt("span",{className:"se-animationSeekTime",children:[Mx(C?Math.min(o,x):0)," / ",Mx(x)]})]}),Dt("div",{className:"se-animationGrid",children:[Dt("label",{className:"se-field",children:[Xe("span",{className:"se-fieldLabel",children:"Loop mode"}),Dt("select",{className:"se-select",value:b.loopMode,onChange:I=>h(b.sourceName,I.target.value),children:[Xe("option",{value:"repeat",children:"Loop"}),Xe("option",{value:"once",children:"Play Once"})]})]}),Dt("label",{className:"se-field",children:[Dt("span",{className:"se-fieldLabel",children:["Speed",Dt("span",{className:"se-fieldValue",children:[b.speed.toFixed(2),"x"]})]}),Dt("div",{className:"se-animationSpeedRow",children:[Xe("input",{className:"se-slider",type:"range",min:.1,max:3,step:.1,value:b.speed,onChange:I=>m(b.sourceName,Number(I.target.value))}),Xe("input",{className:"se-numberInput se-animationSpeedInput",type:"number",min:.1,max:3,step:.1,value:b.speed,onChange:I=>m(b.sourceName,Number(I.target.value))})]})]})]}),Xe("button",{type:"button",className:`se-animationAutoplayButton ${e.animations.autoplayClip===b.sourceName?"se-animationAutoplayButton--active":""}`,onClick:()=>M(b.sourceName),children:e.animations.autoplayClip===b.sourceName?"Disable autoplay":"Set as autoplay"})]},b.sourceName)})}),v.length>0?Dt("section",{className:"se-removedAnimations",children:[Xe("button",{type:"button",className:"se-panelHeader",onClick:()=>p(b=>!b),children:Dt("span",{className:"se-panelHeaderMain",children:[Xe(tP,{size:16,className:`se-panelChevron ${d?"se-panelChevron--open":""}`}),Dt("span",{className:"se-panelTitle",children:["Removed Animations (",v.length,")"]})]})}),d?Xe("div",{className:"se-removedAnimationList",children:v.map(b=>Dt("div",{className:"se-removedAnimationRow",children:[Dt("div",{children:[Xe("div",{className:"se-removedAnimationName",children:b.displayName||b.sourceName}),Xe("div",{className:"se-animationSource",children:b.sourceName})]}),Xe("button",{type:"button",className:"se-animationButton",onClick:()=>E(b.sourceName),children:"Restore"})]},b.sourceName))}):null]}):null]})}import{useState as Tx}from"react";import{Pencil as lP,Trash2 as cP}from"lucide-react";import{jsx as dn,jsxs as rr}from"react/jsx-runtime";function gp({config:e,onChange:t}){let[n,i]=Tx(null),[r,o]=Tx({title:"",description:""}),a=e.annotations,s=d=>{i(d),o({title:d.title,description:d.description||""})},c=()=>{if(!n||!r.title.trim())return;let d=a.map(p=>p.id===n.id?{...p,title:r.title.trim(),description:r.description||""}:p);t({...e,annotations:d}),i(null),o({title:"",description:""})},l=d=>{if(window.confirm("Delete this annotation?")){let g=a.filter(f=>f.id!==d).map((f,v)=>({...f,id:v+1}));t({...e,annotations:g}),i(null),o({title:"",description:""})}},u=()=>{i(null),o({title:"",description:""})};return rr(eo,{title:"Annotations",children:[e.annotations.length===0?dn("div",{className:"bb-emptyAnnotations",children:"No annotations yet. Double-click on the model to add one."}):dn("div",{className:"bb-annotationsList",children:e.annotations.map(d=>rr("div",{className:"bb-annotationCard",children:[rr("div",{className:"bb-annotationHeader",children:[rr("div",{className:"bb-annotationBadge",children:["#",d.id]}),rr("div",{className:"bb-annotationActions",children:[dn("button",{className:"bb-annotationAction bb-annotationAction--edit",onClick:()=>s(d),title:"Edit annotation",children:dn(lP,{size:16})}),dn("button",{className:"bb-annotationAction bb-annotationAction--delete",onClick:()=>l(d.id),title:"Delete annotation",children:dn(cP,{size:16})})]})]}),dn("div",{className:"bb-annotationTitle",children:d.title}),d.description&&dn("div",{className:"bb-annotationDescription",children:d.description}),rr("div",{className:"bb-annotationPosition",children:["Position: [",d.worldPosition[0].toFixed(2),","," ",d.worldPosition[1].toFixed(2),","," ",d.worldPosition[2].toFixed(2),"]"]})]},d.id))}),n&&dn("div",{className:"bb-editAnnotationOverlay",onClick:u,children:rr("div",{className:"bb-editAnnotationPopup",onClick:d=>d.stopPropagation(),children:[rr("div",{className:"bb-editAnnotationHeader",children:[dn("h3",{className:"bb-editAnnotationTitle",children:"Edit Annotation"}),dn("button",{className:"bb-editAnnotationClose",onClick:u,children:"\xD7"})]}),rr("div",{className:"bb-editAnnotationBody",children:[rr("div",{className:"bb-field",children:[dn("label",{className:"bb-label",children:"Title"}),dn("input",{className:"bb-input",value:r.title,onChange:d=>o({...r,title:d.target.value}),placeholder:"Enter annotation title"})]}),rr("div",{className:"bb-field",children:[dn("label",{className:"bb-label",children:"Description"}),dn("textarea",{className:"bb-textarea",value:r.description,onChange:d=>o({...r,description:d.target.value}),placeholder:"Enter annotation description",rows:3})]}),rr("div",{className:"bb-editAnnotationActions",children:[dn("button",{className:"bb-button",onClick:u,children:"Cancel"}),dn("button",{className:"bb-button bb-button--primary",onClick:c,disabled:!r.title.trim(),children:"Save"}),dn("button",{className:"bb-button bb-button--danger",onClick:()=>l(n.id),children:"Delete"})]})]})]})})]})}import{useState as dP,useCallback as no}from"react";import{ArrowDown as uP,ArrowUp as pP,MapPin as hP,Plus as mP,Trash2 as gP,Settings as fP}from"lucide-react";import{Fragment as xP,jsx as yt,jsxs as Kt}from"react/jsx-runtime";var bP={enabled:!0,waypoints:[],loop:!0,autoPlay:!1},ro=3.5;function fp({config:e,onChange:t,cameraState:n,onPreviewWaypoint:i}){let r=e.cinematic??bP,{waypoints:o}=r,a=no((y,h)=>{if(y.length<2)return 0;let m=0;for(let S=0;S<y.length-1;S++){let M=y[S].segmentDuration??ro;m+=M}return h&&y.length>1&&(m+=y[y.length-1].segmentDuration??ro),Math.max(m,0)},[]),s=no(y=>{t({...e,cinematic:{...r,...y}})},[e,r,t]),c=no(()=>{if(!n)return;let y={position:[...n.position],target:[...n.target],...n.azimuthAngle!=null?{azimuthAngle:n.azimuthAngle}:{},...n.polarAngle!=null?{polarAngle:n.polarAngle}:{},segmentDuration:ro},h=[...o,y],m=a(h,r.loop);s({waypoints:h,duration:m})},[n,o,r.loop,a,s]),l=no(y=>{let h=o.filter((S,M)=>M!==y),m=a(h,r.loop);s({waypoints:h,duration:m})},[o,r.loop,a,s]),u=no((y,h)=>{let m=y+h;if(m<0||m>=o.length)return;let S=[...o];[S[y],S[m]]=[S[m],S[y]];let M=a(S,r.loop);s({waypoints:S,duration:M})},[o,r.loop,a,s]),d=no((y,h)=>{let m=o.map((M,T)=>T===y?{...M,...h}:M),S=a(m,r.loop);s({waypoints:m,duration:S})},[o,r.loop,a,s]),[p,g]=dP(!1),f=o.some(y=>y.segmentDuration!==void 0),v=no(y=>y>=o.length-1?ro:o[y]?.segmentDuration??ro,[o]),P=o.length>=2;return Kt(eo,{title:"Cinematic Camera",children:[yt("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."}),Kt("button",{type:"button",className:"bb-button bb-button--primary se-cinematicAdd",onClick:c,disabled:!n,title:"Capture the current camera view as a waypoint",children:[yt(mP,{size:15}),"Add waypoint from current view"]}),Kt("div",{className:"se-customizeToggle",children:[Kt("label",{className:"se-toggleLabel",children:[yt("input",{type:"checkbox",checked:p,onChange:y=>g(y.target.checked)}),yt(fP,{size:14}),yt("span",{children:"Customize durations between waypoints"})]}),p&&Kt("span",{className:"se-toggleHint",children:["Set duration for each segment between waypoints: 1\u21922, 2\u21923, etc. Default: ",ro,"s"]})]}),o.length===0?yt("div",{className:"bb-emptyAnnotations",children:"No waypoints yet. Position the camera and add your first one."}):Kt(xP,{children:[yt("div",{className:"se-waypointList",children:o.map((y,h)=>{let m=v(h),S=h===o.length-1,M=y.segmentDuration!==void 0&&y.segmentDuration!==ro;return Kt("div",{children:[Kt("div",{className:"se-waypointCard",children:[yt("div",{className:"se-waypointBadge",children:h+1}),Kt("div",{className:"se-waypointBody",children:[Kt("div",{className:"se-waypointCoords",children:["pos [",y.position.map(T=>T.toFixed(1)).join(", "),"]"]}),Kt("div",{className:"se-waypointCoords",children:["look [",y.target.map(T=>T.toFixed(1)).join(", "),"]"]}),p&&!S&&Kt("div",{className:`se-customBadge ${M?"se-customBadge--custom":"se-customBadge--default"}`,children:[m.toFixed(1),"s",!M&&" (default)"]})]}),Kt("div",{className:"se-waypointActions",children:[yt("button",{className:"se-waypointAction",onClick:()=>i?.(y),title:"Fly camera to this waypoint",disabled:!i,children:yt(hP,{size:15})}),yt("button",{className:"se-waypointAction",onClick:()=>u(h,-1),title:"Move up",disabled:h===0,children:yt(pP,{size:15})}),yt("button",{className:"se-waypointAction",onClick:()=>u(h,1),title:"Move down",disabled:S,children:yt(uP,{size:15})}),yt("button",{className:"se-waypointAction se-waypointAction--delete",onClick:()=>l(h),title:"Delete waypoint",children:yt(gP,{size:15})})]})]}),p&&!S&&Kt("div",{className:"se-segmentBetween",children:[Kt("div",{className:"se-segmentLabel",children:[h+1," \u2192 ",h+2,!y.segmentDuration&&" (default)"]}),Kt("div",{className:"se-segmentControls",children:[yt("span",{className:"se-durationLabel",children:"Duration:"}),yt("input",{type:"range",className:"se-segmentSlider",min:1,max:20,step:.5,value:m,onChange:T=>{let E=parseFloat(T.target.value);d(h,{segmentDuration:E})}}),Kt("span",{className:"se-segmentValue",children:[m.toFixed(1),"s"]}),Kt("div",{className:"se-presetButtons",children:[[2,4,6,8].map(T=>Kt("button",{className:"se-presetButton",onClick:()=>d(h,{segmentDuration:T}),children:[T,"s"]},`preset-${h}-${T}`)),yt("button",{className:"se-presetButton se-presetButton--default",onClick:()=>{let T=o.map((b,C)=>{if(C===h){let{segmentDuration:x,...k}=b;return k}return b}),E=a(T,r.loop);s({waypoints:T,duration:E})},children:"Reset"})]})]})]})]},`waypoint-wrapper-${h}`)})}),Kt("div",{className:"se-totalDuration",children:[yt("span",{className:"se-totalLabel",children:"Total duration:"}),yt("span",{className:"se-totalValue",children:P?(r.duration??a(o,r.loop)).toFixed(1)+"s":"-"}),!P&&yt("span",{className:"se-totalHint",children:"(need at least 2 waypoints)"})]})]}),yt(ot,{label:"Enable cinematic camera",checked:r.enabled,onChange:y=>s({enabled:y})}),yt(ot,{label:"Loop",checked:r.loop,onChange:y=>{let h=y,m=a(o,h);s({loop:h,duration:m})}}),yt(ot,{label:"Auto-play on load",checked:r.autoPlay,onChange:y=>s({autoPlay:y})}),!p&&P&&yt(W,{label:"Duration",value:r.duration??a(o,r.loop),min:4,max:120,step:1,formatValue:y=>`${y}s`,onChange:y=>s({duration:y})})]})}import{Box as wP,Clapperboard as CP,MessageSquareText as SP,Sparkles as MP,Spotlight as TP,Video as PP}from"lucide-react";import{jsx as un,jsxs as _P}from"react/jsx-runtime";var kP=[{label:"General",icon:un(wP,{})},{label:"Lighting",icon:un(TP,{})},{label:"Animations",icon:un(CP,{})},{label:"Post Processing",icon:un(MP,{})},{label:"Annotations",icon:un(SP,{})},{label:"Cinematic",icon:un(PP,{})}],Px={currentClip:null,isPlaying:!1,time:0,duration:0,play:()=>{},pause:()=>{},stop:()=>{},setSpeed:()=>{},seek:()=>{}};function bp({config:e,onChange:t,activeSubTab:n,onActiveSubTabChange:i,cameraState:r=null,onPreviewWaypoint:o,animationClipDetails:a=[],animationPlayback:s=Px}){let[c,l]=yP("General"),u=n??c,d=s??Px,{tier:p}=tr(),g=Jr(p,"starter"),f=Jr(p,"growth");vP(()=>{n!==void 0&&l(n)},[n]);let v=P=>{n===void 0&&l(P),i?.(P)};return _P("div",{className:"se-tabContent",children:[un("div",{className:"se-subTabRow",children:kP.map(P=>un("button",{type:"button",title:P.label,className:`se-subTab ${u===P.label?"se-subTab--active":""}`,onClick:()=>v(P.label),children:P.icon},P.label))}),u==="General"&&un(up,{config:e,onChange:t}),u==="Lighting"&&un(hp,{config:e,onChange:t}),u==="Animations"&&(g?un(mp,{config:e,onChange:t,clipDetails:a,currentClip:d.currentClip,isPlaying:d.isPlaying,time:d.time,duration:d.duration,play:d.play,pause:d.pause,stop:d.stop,setSpeed:d.setSpeed,seek:d.seek}):un(On,{requiredTier:"starter",feature:"Animation configuration"})),u==="Post Processing"&&(f?un(pp,{config:e,onChange:t}):un(On,{requiredTier:"growth",feature:"Post-processing effects"})),u==="Annotations"&&(g?un(gp,{config:e,onChange:t}):un(On,{requiredTier:"starter",feature:"Annotations"})),u==="Cinematic"&&(g?un(fp,{config:e,onChange:t,cameraState:r,onPreviewWaypoint:o}):un(On,{requiredTier:"starter",feature:"Cinematic camera"}))]})}import{ChevronDown as kx,Info as _x}from"lucide-react";import{jsx as kn,jsxs as io}from"react/jsx-runtime";function Ax({title:e,trailing:t,children:n,disabled:i,open:r,onToggle:o,tooltip:a}){let s=a?`${a}`:e;return io("div",{className:"bb-materialPanel",children:[io("button",{type:"button",className:"bb-materialPanelHeader",onClick:o,"aria-expanded":r,title:s,children:[io("div",{className:"bb-materialPanelTitleWrap",children:[kn(kx,{size:14,className:`bb-materialPanelChevron ${r?"bb-materialPanelChevron--open":""}`}),kn("span",{className:"bb-materialPanelTitle",children:e}),a?kn("span",{className:"bb-materialPanelHelp",title:s,"aria-label":s,role:"img",onClick:c=>c.stopPropagation(),children:kn(_x,{size:12})}):null]}),t?kn("div",{onClick:c=>c.stopPropagation(),children:t}):null]}),r?kn("div",{className:"bb-materialPanelBody",style:i?{opacity:.45,pointerEvents:"none"}:void 0,children:n}):null]})}function Dn({title:e,open:t,onToggle:n,trailing:i,children:r,tooltip:o}){let a=o?`${e}: ${o}`:e;return io("div",{className:"bb-section",children:[io("button",{type:"button",className:"bb-sectionHeaderButton",onClick:n,"aria-expanded":t,title:a,children:[io("span",{className:"bb-sectionHeaderMain",children:[kn(kx,{size:15,className:`bb-sectionChevron ${t?"bb-sectionChevron--open":""}`}),kn("h2",{className:"bb-sectionTitle",children:e}),o?kn("span",{className:"bb-sectionHelp",title:a,"aria-label":a,role:"img",onClick:s=>s.stopPropagation(),children:kn(_x,{size:13})}):null]}),i?kn("span",{onClick:s=>s.stopPropagation(),children:i}):null]}),t?kn("div",{className:"bb-sectionBody",children:r}):null]})}function Rx({checked:e,onChange:t,label:n}){return io("label",{className:"se-switch","aria-label":n,children:[kn("input",{type:"checkbox",checked:e,onChange:i=>t(i.target.checked)}),kn("span",{className:"se-switchTrack",children:kn("span",{className:"se-switchThumb"})})]})}import{useState as Bx}from"react";import{jsx as xp}from"react/jsx-runtime";function Gn({panelKey:e,title:t,tooltip:n,toggleLabel:i,controls:r,children:o,requiredTier:a}){let{openMaterialPanels:s,materialPanelEnabled:c,onToggleMaterialPanel:l,onSetMaterialPanelState:u}=r,d=a?.locked??!1;return xp(Ax,{title:t,tooltip:n,disabled:d||!c[e],open:s[e],onToggle:()=>l(e),trailing:xp(Rx,{checked:!d&&c[e],onChange:d?()=>{}:p=>u(e,p),label:i??`Toggle ${t}`}),children:d&&a?xp(On,{requiredTier:a.tier,feature:t}):o})}import{useRef as Ex,useState as AP}from"react";import{HexColorInput as RP,HexColorPicker as EP}from"react-colorful";import{FileUp as LP}from"lucide-react";import{jsx as Jt,jsxs as bi}from"react/jsx-runtime";function Qt({label:e,value:t,placeholder:n,onChange:i}){let r=Ex(null);return bi("div",{className:"bb-field bb-field--full",children:[Jt("label",{className:"bb-label",children:e}),bi("div",{className:"bb-fileField",children:[Jt("input",{className:"bb-input bb-fileField-input",placeholder:n,value:t,onChange:o=>{let a=o.target.value;!a&&t&&wd(t),i(a)}}),Jt("button",{type:"button",className:"bb-fileFieldButton",onClick:()=>r.current?.click(),"aria-label":`Select file for ${e}`,title:`Select file for ${e}`,children:Jt(LP,{size:20})}),Jt("input",{ref:r,type:"file",accept:"image/png,image/jpeg,image/webp,image/avif",className:"bb-hiddenInput",onChange:o=>{let a=o.target.files?.[0];if(!a)return;let s=om(a);t&&t!==s&&wd(t),cm(s,URL.createObjectURL(a)),i(s),o.target.value=""}})]})]})}function oo({label:e,value:t,fallback:n="#ffffff",onChange:i}){let[r,o]=AP(!1),a=t||n,s=Ex(null);return bi("div",{className:"bb-field",children:[Jt("span",{className:"bb-label",children:e}),Jt("div",{className:"se-fieldInline",children:Jt("span",{ref:s,style:{display:"inline-flex"},children:Jt(RP,{prefixed:!0,className:"se-swatch",onClick:()=>o(c=>!c),style:{background:a,color:la(a)},color:a,onChange:i})})}),r?Jt(cp,{anchorRef:s,onClose:()=>o(!1),children:Jt(EP,{color:a,onChange:i})}):null]})}function ws({label:e,checked:t,onChange:n}){return bi("label",{className:"bb-checkbox",children:[Jt("input",{type:"checkbox",checked:t,onChange:i=>n(i.target.checked)}),e]})}function Lx({label:e,value:t,min:n,max:i,step:r,placeholder:o,onChange:a}){return bi("div",{className:"bb-field",children:[Jt("label",{className:"bb-label",children:e}),Jt("input",{className:"bb-input",type:"number",min:n,max:i,step:r,placeholder:o,value:t??"",onChange:s=>a(s.target.value===""?void 0:Number(s.target.value))})]})}function ua({label:e,value:t,options:n,onChange:i}){return bi("div",{className:"bb-field",children:[Jt("label",{className:"bb-label",children:e}),Jt("select",{className:"bb-select",value:t,onChange:r=>i(r.target.value),children:n.map(r=>Jt("option",{value:r,children:r},r))})]})}function _t({label:e,value:t,min:n,max:i,step:r,onChange:o}){return bi("div",{className:"bb-field bb-field--full",children:[Jt("label",{className:"bb-label",children:e}),bi("div",{className:"bb-sliderField",children:[Jt("input",{className:`bb-slider ${t===void 0?"bb-slider--unset":""}`,type:"range",min:n,max:i,step:r,value:t??n,onChange:s=>o(Number(s.target.value))}),Jt("input",{className:"bb-input bb-input--compact",type:"number",min:n,max:i,step:r,value:t??"",onChange:s=>o(s.target.value===""?void 0:Number(s.target.value))})]})]})}import{Fragment as yp,jsx as Q,jsxs as rn}from"react/jsx-runtime";function Ox({selectedItem:e,selectedMaterial:t,pbrWorkflow:n,onPbrWorkflowChange:i,openMaterialPanels:r,materialPanelEnabled:o,onToggleMaterialPanel:a,onSetMaterialPanelState:s,updateSelectedMaterial:c,setSelectedTexturePath:l}){let u={openMaterialPanels:r,materialPanelEnabled:o,onToggleMaterialPanel:a,onSetMaterialPanelState:s},{tier:d}=tr(),p=Jr(d,"starter"),g={tier:"starter",locked:!p},[f,v]=Bx("roughness"),[P,y]=Bx("factor");return rn(yp,{children:[Q(Gn,{panelKey:"pbr",title:"PBR Maps",tooltip:"Controls the base color and workflow used for physically based shading.",controls:u,children:p?rn("div",{className:"bb-grid",children:[Q(ua,{label:"Workflow",value:n,options:["metalness","specular"],onChange:i}),Q("div",{className:"bb-field bb-field--full",children:Q("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."})}),Q(Qt,{label:n==="specular"?"Albedo texture path":"Base color texture path",placeholder:"materials/oak-wood.jpg",value:t?.texture?.path??"",onChange:h=>l(e,"texture",h)}),Q(oo,{label:n==="specular"?"Albedo color":"Base color",value:t?.baseColor??"#ffffff",onChange:h=>c(e,m=>({...m,baseColor:h}))}),n==="metalness"?rn(yp,{children:[Q(_t,{label:"Metalness",value:t?.metalness,min:0,max:1,step:.01,onChange:h=>c(e,m=>({...m,metalness:h}))}),Q(Qt,{label:"Metalness map path",placeholder:"materials/body-metalness.jpg",value:t?.metalnessMap?.path??"",onChange:h=>l(e,"metalnessMap",h)})]}):rn(yp,{children:[Q(_t,{label:"Specular intensity",value:t?.specularIntensity,min:0,max:1,step:.01,onChange:h=>c(e,m=>({...m,specularIntensity:h}))}),Q(oo,{label:"Specular color",value:t?.specularColor??"#ffffff",onChange:h=>c(e,m=>({...m,specularColor:h}))}),Q(Qt,{label:"Specular intensity map path",placeholder:"materials/body-specular-intensity.jpg",value:t?.specularIntensityMap?.path??"",onChange:h=>l(e,"specularIntensityMap",h)}),Q(Qt,{label:"Specular color map path",placeholder:"materials/body-specular-color.jpg",value:t?.specularColorMap?.path??"",onChange:h=>l(e,"specularColorMap",h)})]}),Q(_t,{label:"Specular F0 / reflectivity",value:t?.reflectivity,min:0,max:1,step:.01,onChange:h=>c(e,m=>({...m,reflectivity:h}))})]}):rn("div",{className:"bb-grid",children:[Q(oo,{label:"Base color",value:t?.baseColor??"#ffffff",onChange:h=>c(e,m=>({...m,baseColor:h}))}),Q(_t,{label:"Metalness",value:t?.metalness,min:0,max:1,step:.01,onChange:h=>c(e,m=>({...m,metalness:h}))}),Q("div",{className:"bb-field bb-field--full",children:Q(On,{requiredTier:"starter",feature:"Texture maps, the specular workflow, and reflectivity"})})]})}),Q(Gn,{panelKey:"roughness",requiredTier:g,title:"Roughness / Glossiness",tooltip:"Adjusts how matte or shiny the surface appears.",toggleLabel:"Toggle Roughness and Glossiness",controls:u,children:rn("div",{className:"bb-grid",children:[Q(ua,{label:"Mode",value:f,options:["roughness","glossiness"],onChange:v}),Q("div",{className:"bb-field bb-field--full",children:Q("p",{className:"bb-note",style:{margin:0},children:f==="roughness"?"Roughness: 0 is glossy, 1 is matte.":"Glossiness is the inverse of roughness (glossiness = 1 \u2212 roughness)"})}),f==="roughness"?Q(_t,{label:"Roughness",value:t?.roughness,min:0,max:1,step:.01,onChange:h=>c(e,m=>({...m,roughness:h}))}):Q(_t,{label:"Glossiness",value:t?.roughness===void 0?void 0:1-t.roughness,min:0,max:1,step:.01,onChange:h=>c(e,m=>({...m,roughness:h===void 0?void 0:1-h}))}),Q(Qt,{label:f==="glossiness"?"Glossiness map path (applied as roughness)":"Roughness map path",placeholder:"materials/body-roughness.jpg",value:t?.roughnessMap?.path??"",onChange:h=>l(e,"roughnessMap",h)})]})}),Q(Gn,{panelKey:"emission",requiredTier:g,title:"Emission",tooltip:"Makes the material self-illuminated with emissive color and intensity.",controls:u,children:rn("div",{className:"bb-grid",children:[Q(oo,{label:"Emissive color",value:t?.emissive??"#000000",fallback:"#000000",onChange:h=>c(e,m=>({...m,emissive:h}))}),Q(_t,{label:"Emissive intensity",value:t?.emissiveIntensity,min:0,max:10,step:.1,onChange:h=>c(e,m=>({...m,emissiveIntensity:h}))}),Q(Qt,{label:"Emissive map path",placeholder:"materials/body-emissive.jpg",value:t?.emissiveMap?.path??"",onChange:h=>l(e,"emissiveMap",h)})]})}),Q(Gn,{panelKey:"opacity",requiredTier:g,title:"Opacity",tooltip:"Controls transparency, alpha testing, and blending behavior.",controls:u,children:rn("div",{className:"bb-grid",children:[Q(_t,{label:"Opacity",value:t?.opacity,min:0,max:1,step:.01,onChange:h=>c(e,m=>({...m,opacity:h}))}),Q(_t,{label:"Alpha test",value:t?.alphaTest,min:0,max:1,step:.01,onChange:h=>c(e,m=>({...m,alphaTest:h}))}),Q(Qt,{label:"Alpha map path",placeholder:"materials/body-alpha.png",value:t?.alphaMap?.path??"",onChange:h=>l(e,"alphaMap",h)}),Q(ua,{label:"Blending mode",value:t?.blendingMode??"normal",options:Zc,onChange:h=>c(e,m=>({...m,blendingMode:h}))}),rn("div",{className:"bb-field",children:[Q("label",{className:"bb-label",children:"Alpha hash"}),Q("div",{className:"bb-checkboxRow",children:Q(ws,{label:"Use alpha hash",checked:t?.alphaHash??!1,onChange:h=>c(e,m=>({...m,alphaHash:h}))})})]}),rn("div",{className:"bb-field",children:[Q("label",{className:"bb-label",children:"Dithering"}),Q("div",{className:"bb-checkboxRow",children:Q(ws,{label:"Use dithering",checked:t?.dithering??!1,onChange:h=>c(e,m=>({...m,dithering:h}))})})]})]})}),rn(Gn,{panelKey:"normalBump",requiredTier:g,title:"Normal & Bump",tooltip:"Adds surface detail without changing the actual mesh shape.",toggleLabel:"Toggle Normal and Bump",controls:u,children:[rn("div",{className:"bb-grid",children:[Q(Qt,{label:"Normal map path",placeholder:"materials/body-normal.jpg",value:t?.normalMap?.path??"",onChange:h=>l(e,"normalMap",h)}),Q(_t,{label:"Normal scale",value:t?.normalScale,min:0,max:5,step:.01,onChange:h=>c(e,m=>({...m,normalScale:h}))}),Q(Qt,{label:"Bump map path",placeholder:"materials/body-bump.jpg",value:t?.bumpMap?.path??"",onChange:h=>l(e,"bumpMap",h)}),Q(_t,{label:"Bump scale",value:t?.bumpScale,min:0,max:5,step:.01,onChange:h=>c(e,m=>({...m,bumpScale:h}))})]}),Q("div",{className:"bb-checkboxRow",style:{marginTop:12},children:Q(ws,{label:"Flip normal Y",checked:t?.flipNormalY??!1,onChange:h=>c(e,m=>({...m,flipNormalY:h}))})})]}),Q(Gn,{panelKey:"displacement",requiredTier:g,title:"Displacement",tooltip:"Offsets geometry using a texture to create real surface height.",controls:u,children:rn("div",{className:"bb-grid",children:[Q(Qt,{label:"Displacement map path",placeholder:"materials/body-displacement.jpg",value:t?.displacementMap?.path??"",onChange:h=>l(e,"displacementMap",h)}),Q(_t,{label:"Displacement scale",value:t?.displacementScale,min:-5,max:5,step:.01,onChange:h=>c(e,m=>({...m,displacementScale:h}))}),Q(_t,{label:"Displacement bias",value:t?.displacementBias,min:-5,max:5,step:.01,onChange:h=>c(e,m=>({...m,displacementBias:h}))})]})}),Q(Gn,{panelKey:"ao",requiredTier:g,title:"Ambient Occlusion",tooltip:"Darkens creases and contact areas to add depth.",controls:u,children:rn("div",{className:"bb-grid",children:[Q(Qt,{label:"AO map path",placeholder:"materials/body-ao.jpg",value:t?.aoMap?.path??"",onChange:h=>l(e,"aoMap",h)}),Q(_t,{label:"AO intensity",value:t?.aoMapIntensity,min:0,max:5,step:.01,onChange:h=>c(e,m=>({...m,aoMapIntensity:h}))})]})}),rn(Gn,{panelKey:"clearcoat",requiredTier:g,title:"Clearcoat",tooltip:"Adds a glossy protective layer on top of the base material.",controls:u,children:[rn("div",{className:"bb-grid",children:[Q(Qt,{label:"Clearcoat map path",placeholder:"materials/body-clearcoat.jpg",value:t?.clearcoatMap?.path??"",onChange:h=>l(e,"clearcoatMap",h)}),Q(_t,{label:"Clearcoat",value:t?.clearcoat,min:0,max:1,step:.01,onChange:h=>c(e,m=>({...m,clearcoat:h}))}),Q(Qt,{label:"Clearcoat roughness map path",placeholder:"materials/body-clearcoat-roughness.jpg",value:t?.clearcoatRoughnessMap?.path??"",onChange:h=>l(e,"clearcoatRoughnessMap",h)}),Q(_t,{label:"Clearcoat roughness",value:t?.clearcoatRoughness,min:0,max:1,step:.01,onChange:h=>c(e,m=>({...m,clearcoatRoughness:h}))}),Q(Qt,{label:"Clearcoat normal map path",placeholder:"materials/body-clearcoat-normal.jpg",value:t?.clearcoatNormalMap?.path??"",onChange:h=>l(e,"clearcoatNormalMap",h)}),Q(_t,{label:"Clearcoat normal scale",value:t?.clearcoatNormalScale,min:0,max:5,step:.01,onChange:h=>c(e,m=>({...m,clearcoatNormalScale:h}))})]}),Q("div",{className:"bb-checkboxRow",style:{marginTop:12},children:Q(ws,{label:"Flip clearcoat normal Y",checked:t?.flipClearcoatNormalY??!1,onChange:h=>c(e,m=>({...m,flipClearcoatNormalY:h}))})})]}),Q(Gn,{panelKey:"sheen",requiredTier:g,title:"Sheen",tooltip:"Adds a soft fabric-like sheen on grazing angles.",controls:u,children:rn("div",{className:"bb-grid",children:[Q(_t,{label:"Sheen",value:t?.sheen,min:0,max:1,step:.01,onChange:h=>c(e,m=>({...m,sheen:h}))}),Q(oo,{label:"Sheen color",value:t?.sheenColor??"#ffffff",onChange:h=>c(e,m=>({...m,sheenColor:h}))}),Q(Qt,{label:"Sheen color map path",placeholder:"materials/body-sheen-color.jpg",value:t?.sheenColorMap?.path??"",onChange:h=>l(e,"sheenColorMap",h)}),Q(_t,{label:"Sheen roughness",value:t?.sheenRoughness,min:0,max:1,step:.01,onChange:h=>c(e,m=>({...m,sheenRoughness:h}))}),Q(Qt,{label:"Sheen roughness map path",placeholder:"materials/body-sheen-roughness.jpg",value:t?.sheenRoughnessMap?.path??"",onChange:h=>l(e,"sheenRoughnessMap",h)})]})}),Q(Gn,{panelKey:"anisotropy",requiredTier:g,title:"Anisotropy",tooltip:"Stretches reflections in one direction for brushed or fiber-like surfaces.",controls:u,children:rn("div",{className:"bb-grid",children:[Q(_t,{label:"Intensity",value:t?.anisotropy,min:0,max:1,step:.01,onChange:h=>c(e,m=>({...m,anisotropy:h}))}),Q(ua,{label:"Tilt direction",value:P,options:["factor","texture"],onChange:y}),P==="factor"?Q(_t,{label:"Rotation (rad)",value:t?.anisotropyRotation,min:0,max:6.28,step:.01,onChange:h=>c(e,m=>({...m,anisotropyRotation:h}))}):Q(Qt,{label:"Anisotropy map path",placeholder:"materials/body-anisotropy.jpg",value:t?.anisotropyMap?.path??"",onChange:h=>l(e,"anisotropyMap",h)})]})}),Q(Gn,{panelKey:"transmission",requiredTier:g,title:"Transmission & Volume",tooltip:"Controls glass-like transmission and how light travels through volume.",toggleLabel:"Toggle Transmission and Volume",controls:u,children:rn("div",{className:"bb-grid",children:[Q(_t,{label:"Transmission",value:t?.transmission,min:0,max:1,step:.01,onChange:h=>c(e,m=>({...m,transmission:h}))}),Q(Qt,{label:"Transmission map path",placeholder:"materials/body-transmission.jpg",value:t?.transmissionMap?.path??"",onChange:h=>l(e,"transmissionMap",h)}),Q(_t,{label:"Thickness",value:t?.thickness,min:0,max:5,step:.01,onChange:h=>c(e,m=>({...m,thickness:h}))}),Q(Qt,{label:"Thickness map path",placeholder:"materials/body-thickness.jpg",value:t?.thicknessMap?.path??"",onChange:h=>l(e,"thicknessMap",h)}),Q(oo,{label:"Volume tint",value:t?.attenuationColor??"#ffffff",onChange:h=>c(e,m=>({...m,attenuationColor:h}))}),Q(Lx,{label:"Attenuation distance",value:t?.attenuationDistance,min:0,step:.01,placeholder:"Infinity when unset",onChange:h=>c(e,m=>({...m,attenuationDistance:h}))})]})}),Q(Gn,{panelKey:"faces",requiredTier:g,title:"Faces Rendering",tooltip:"Chooses which side of the mesh renders and how backfaces are handled.",controls:u,children:Q("div",{className:"bb-grid",children:Q(ua,{label:"Side",value:t?.side??"front",options:Qc,onChange:h=>c(e,m=>({...m,side:h}))})})})]})}var Dx=[{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 vp,jsxs as BP}from"react/jsx-runtime";function Nx({disabled:e,onApply:t}){return vp("div",{className:"bb-presetGallery",children:Dx.map(n=>BP("button",{type:"button",className:"bb-presetSwatch",disabled:e,title:`Apply ${n.label} preset`,onClick:()=>t(n.material),children:[vp("span",{className:"bb-presetSwatchColor",style:{background:n.swatch}}),vp("span",{className:"bb-presetSwatchLabel",children:n.label})]},n.id))})}import{useEffect as OP,useRef as DP,useState as NP}from"react";import{ChevronDown as IP,Download as zP,FileCode2 as jP,FileJson as VP}from"lucide-react";import{jsx as fc,jsxs as Cs}from"react/jsx-runtime";function wp({disabled:e,exporting:t,onExportJson:n,onExportTs:i}){let[r,o]=NP(!1),a=DP(null);return OP(()=>{if(!r)return;let s=c=>{a.current?.contains(c.target)||o(!1)};return window.addEventListener("pointerdown",s),()=>window.removeEventListener("pointerdown",s)},[r]),Cs("div",{className:"bb-exportMenuWrapper",ref:a,children:[Cs("button",{type:"button",className:"bb-button bb-button--ghost",disabled:e||t,onClick:()=>o(s=>!s),title:"Export",children:[fc(zP,{size:14}),t?"Exporting\u2026":"Export",fc(IP,{size:12})]}),r&&Cs("div",{className:"bb-exportMenu",children:[Cs("button",{type:"button",className:"bb-exportMenuItem",onClick:()=>{o(!1),n()},children:[fc(VP,{size:14}),"JSON"]}),Cs("button",{type:"button",className:"bb-exportMenuItem",onClick:()=>{o(!1),i()},children:[fc(jP,{size:14}),"TypeScript"]})]})]})}import{jsx as ao,jsxs as Cp}from"react/jsx-runtime";function Ix({selectedItem:e,selectedBinding:t,open:n,onToggle:i,updateBinding:r,idError:o}){return ao(Dn,{title:"Identity",open:n,onToggle:i,children:Cp("div",{className:"bb-grid",children:[Cp("div",{className:"bb-field bb-field--full",children:[ao("label",{className:"bb-label",children:"Model Node ID"}),ao("span",{className:"bb-note",children:"This is the exact mesh name from the imported model and stays locked."}),ao("input",{className:"bb-input bb-readonly",value:t.modelObjectId,readOnly:!0})]}),Cp("div",{className:"bb-field bb-field--full",children:[ao("label",{className:"bb-label",children:"ID"}),ao("input",{className:`bb-input ${o?"bb-input--error":""}`,value:t.id,onChange:a=>r(e,s=>({...s,id:a.target.value}))}),o?ao("span",{className:"bb-status bb-status--error",children:o}):null]})]})})}import{useEffect as FP,useState as Vx}from"react";var zx=["other","body","light","wheel","glass","interior","floor","wall","door","furniture","decor","electronics","seat","table","chair","window","sofa","bed","engine","headlight"],jx=["normal","hidden","selected","disabled"];import{jsx as wn,jsxs as yr}from"react/jsx-runtime";function Fx({selectedItem:e,selectedBinding:t,open:n,onToggle:i,updateBinding:r}){let[o,a]=Vx(t.group??""),[s,c]=Vx(t.tags?.join(", ")??"");FP(()=>{a(t.group??""),c(t.tags?.join(", ")??"")},[e,t.group,t.tags]);let l=()=>{r(e,d=>({...d,group:o.trim()||void 0}))},u=()=>{let d=[...new Set(s.split(",").map(p=>p.trim()).filter(Boolean))];r(e,p=>({...p,tags:d.length>0?d:void 0}))};return yr(Dn,{title:"Basics",open:n,onToggle:i,children:[yr("div",{className:"bb-grid",children:[yr("div",{className:"bb-field",children:[wn("label",{className:"bb-label",children:"Label"}),wn("input",{className:"bb-input",value:t.label??"",onChange:d=>r(e,p=>({...p,label:d.target.value}))})]}),yr("div",{className:"bb-field",children:[wn("label",{className:"bb-label",children:"Type"}),wn("input",{className:"bb-input",list:"binding-type-suggestions",value:t.type,onChange:d=>r(e,p=>({...p,type:d.target.value}))}),wn("datalist",{id:"binding-type-suggestions",children:zx.map(d=>wn("option",{value:d},d))})]}),yr("div",{className:"bb-field",children:[wn("label",{className:"bb-label",children:"Status"}),wn("select",{className:"bb-select",value:t.status??"normal",onChange:d=>r(e,p=>({...p,status:d.target.value})),children:jx.map(d=>wn("option",{value:d,children:d},d))})]}),yr("div",{className:"bb-field",children:[wn("label",{className:"bb-label",children:"Group"}),wn("input",{className:"bb-input",placeholder:"paint",value:o,onChange:d=>a(d.target.value),onBlur:l,onKeyDown:d=>{d.key==="Enter"&&d.currentTarget.blur()}})]}),yr("div",{className:"bb-field",children:[wn("label",{className:"bb-label",children:"Tags"}),wn("input",{className:"bb-input",placeholder:"exterior, configurable",value:s,onChange:d=>c(d.target.value),onBlur:u,onKeyDown:d=>{d.key==="Enter"&&d.currentTarget.blur()}})]})]}),yr("div",{className:"bb-checkboxRow",style:{marginTop:12},children:[yr("label",{className:"bb-checkbox",children:[wn("input",{type:"checkbox",checked:t.selectable??!1,onChange:d=>r(e,p=>({...p,selectable:d.target.checked}))}),"selectable"]}),yr("label",{className:"bb-checkbox",children:[wn("input",{type:"checkbox",checked:t.hoverable??!1,onChange:d=>r(e,p=>({...p,hoverable:d.target.checked}))}),"hoverable"]}),yr("label",{className:"bb-checkbox",children:[wn("input",{type:"checkbox",checked:t.visible??!1,onChange:d=>r(e,p=>({...p,visible:d.target.checked}))}),"visible"]})]})]})}import{useEffect as GP,useState as HP}from"react";var so=[{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."}],bc="__custom__";function Ss(e){return so.find(t=>t.id===e)}var $z=so.filter(e=>e.handling==="viewer").map(e=>e.id),UP=new Set(["","New Action",...so.map(e=>e.label)]);function Sp(e){return UP.has(e.trim())}function Ux(e,t){let n=Array.from({length:t.length+1},(i,r)=>r);for(let i=1;i<=e.length;i+=1){let r=[i];for(let o=1;o<=t.length;o+=1){let a=n[o-1]+(e[i-1]===t[o-1]?0:1);r[o]=Math.min(r[o-1]+1,n[o]+1,a)}n=r}return n[t.length]}function Gx(e){if(Ss(e))return null;let t=e.trim().toLowerCase();if(!t)return null;let n=t.replace(/[^a-z0-9]/g,""),i=null;for(let r of so){let o=Math.min(Ux(t,r.id),Ux(n,r.id.replace(/[^a-z0-9]/g,"")));(!i||o<i.distance)&&(i={id:r.id,distance:o})}return i&&i.distance<=2?i.id:null}import{Fragment as $P,jsx as Zt,jsxs as ir}from"react/jsx-runtime";var Hx=so.filter(e=>e.handling==="viewer"),WP=so.filter(e=>e.handling==="host");function Wx({selectedItem:e,selectedBinding:t,open:n,onToggle:i,updateBinding:r}){let[o,a]=HP(new Set);GP(()=>{a(new Set)},[e]);let s=t.actions??[],c=(d,p)=>r(e,g=>({...g,actions:(g.actions??[]).map((f,v)=>v===d?p(f):f)})),l=d=>{r(e,p=>({...p,actions:(p.actions??[]).filter((g,f)=>f!==d)})),a(p=>{let g=new Set;return p.forEach(f=>{f<d?g.add(f):f>d&&g.add(f-1)}),g})},u=(d,p)=>a(g=>{let f=new Set(g);return p?f.add(d):f.delete(d),f});return ir(Dn,{title:"Actions",open:n,onToggle:i,children:[Zt("div",{className:"bb-actionList",children:s.map((d,p)=>{let g=Ss(d.id),f=o.has(p)||!g,v=d.id.trim(),P=g?null:Gx(d.id),y=v.length>0&&s.some((h,m)=>m!==p&&h.id.trim()===v);return ir("div",{className:"bb-actionCard",children:[ir("div",{className:"bb-actionCardHeader",children:[ir("div",{className:"bb-actionCardTitle",children:["Action ",p+1]}),Zt("div",{className:"bb-actionCardMeta",children:d.type})]}),ir("div",{className:"bb-actionGrid",children:[ir("div",{className:"bb-field",children:[Zt("label",{className:"bb-label",children:"Action ID"}),ir("select",{className:"bb-select",value:f?bc:d.id,onChange:h=>{let m=h.target.value;if(m===bc){u(p,!0);return}u(p,!1);let S=Ss(m);c(p,M=>({...M,id:m,label:S&&Sp(M.label)?S.label:M.label}))},children:[Zt("optgroup",{label:"Handled by the viewer",children:Hx.map(h=>Zt("option",{value:h.id,children:h.id},h.id))}),Zt("optgroup",{label:"Handled by your app",children:WP.map(h=>Zt("option",{value:h.id,children:h.id},h.id))}),Zt("option",{value:bc,children:"Custom\u2026"})]})]}),f?ir("div",{className:"bb-field",children:[Zt("label",{className:"bb-label",children:"Custom action ID"}),Zt("input",{className:"bb-input",value:d.id,placeholder:"open-datasheet",onChange:h=>{u(p,!0),c(p,m=>({...m,id:h.target.value}))}})]}):null,ir("div",{className:"bb-field",children:[Zt("label",{className:"bb-label",children:"Label"}),Zt("input",{className:"bb-input",value:d.label,onChange:h=>c(p,m=>({...m,label:h.target.value}))})]}),g?Zt("span",{className:"bb-note",children:g.description}):v.length===0?Zt("span",{className:"bb-note",style:{color:"#fca5a5"},children:"An action ID is required, the button renders but can never be identified in onAction."}):ir("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.",P?ir($P,{children:[" Did you mean ",Zt("button",{type:"button",className:"bb-linkButton",onClick:()=>{u(p,!1);let h=Ss(P);c(p,m=>({...m,id:P,label:h&&Sp(m.label)?h.label:m.label}))},children:P}),"?"]}):null]}),d.effects?.length?ir("span",{className:"bb-note",children:[d.effects.length," declarative effect",d.effects.length===1?"":"s",", execute with useViewerActions."]}):null,y?Zt("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]}),Zt("div",{className:"bb-actionFooter",children:Zt("button",{type:"button",className:"bb-button bb-button--ghost bb-actionRemove",onClick:()=>l(p),children:"Remove Action"})})]},p)})}),Zt("div",{style:{marginTop:10},children:Zt("button",{type:"button",className:"bb-button",onClick:()=>{let d=Hx.find(p=>!s.some(g=>g.id===p.id));r(e,p=>({...p,actions:[...p.actions??[],{id:d?.id??"",label:d?.label??"New Action",type:"command"}]})),d||u(s.length,!0)},children:"Add Action"})})]})}import{MapPin as XP,Trash2 as qP}from"lucide-react";import{Fragment as YP,jsx as or,jsxs as Hn}from"react/jsx-runtime";function $x({selectedBinding:e,open:t,onToggle:n,cameraState:i,formattedCameraState:r,savedCameraPosition:o,onSaveCameraPosition:a,onGoToSavedCamera:s,onClearSavedCamera:c,onResetView:l,onFitScene:u}){return Hn(Dn,{title:"Camera Position",open:t,onToggle:n,children:[Hn("div",{className:"se-waypointCard bb-cameraWaypoint",children:[or("span",{className:"bb-cameraLiveBadge",children:"LIVE"}),Hn("div",{className:"se-waypointBody",children:[or("div",{className:"bb-cameraWaypointLabel",children:"Current view"}),i?Hn(YP,{children:[Hn("div",{className:"se-waypointCoords",children:["pos ",r?.position]}),Hn("div",{className:"se-waypointCoords",children:["look ",r?.target]})]}):or("div",{className:"se-waypointCoords",children:"Move the camera to see live position"})]})]}),Hn("div",{className:"bb-cameraControls bb-cameraControls--centered",children:[or("button",{type:"button",className:"bb-button bb-button--primary",onClick:a,disabled:!i,children:"Save"}),or("button",{type:"button",className:"bb-button bb-button--ghost",onClick:l,children:"Reset View"}),or("button",{type:"button",className:"bb-button bb-button--ghost",onClick:u,children:"Fit Scene"})]}),o?.position&&o?.target&&Hn("div",{className:"se-waypointCard bb-cameraWaypoint",children:[or("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(d=>d.toFixed(1)).join(", "),"]"]}),Hn("div",{className:"se-waypointCoords",children:["look [",o.target.map(d=>d.toFixed(1)).join(", "),"]"]})]}),Hn("div",{className:"se-waypointActions",children:[or("button",{className:"se-waypointAction",onClick:s,title:"Fly camera to the saved position",children:or(XP,{size:15})}),or("button",{className:"se-waypointAction se-waypointAction--delete",onClick:c,title:"Delete saved position",children:or(qP,{size:15})})]})]}),or("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 KP,RotateCcw as JP}from"lucide-react";import{jsx as Nt,jsxs as vr}from"react/jsx-runtime";var Xx=["X","Y","Z"];var QP=.1;function Mp(e){let t=e%360;return t<0?t+360:t}function qx(e){return Mp(e*180/Math.PI)}function Yx(e){return e*Math.PI/180}function ZP(e,t,n){let i=[...e],r=qx(e[t]);return i[t]=Yx(Mp(r+n)),i}function ek({value:e,min:t=-1/0,max:n=1/0,step:i=.1,disabled:r=!1,onChange:o,formatValue:a=c=>Number(c.toFixed(3)),label:s}){return Nt("div",{className:"bb-transformAxesGrid",children:Xx.map((c,l)=>vr("div",{className:"bb-transformAxis",children:[Nt("span",{className:"se-axisStepperLabel bb-transformAxisLabel",children:c}),Nt("div",{className:"bb-transformAxisControl",children:Nt("input",{type:"number",className:"se-numberInput bb-transformNumberInput",step:i,min:t,max:n,value:a(e[l]),disabled:r,"aria-label":`${c} ${s?.toLowerCase()||""}`,onChange:u=>{let d=Number(u.target.value);if(Number.isFinite(d)){let p=Math.max(t,Math.min(n,d)),g=[...e];g[l]=p,o(g)}}})})]},c))})}function Kx({selectedItem:e,selectedBinding:t,open:n,onToggle:i,updateBinding:r,moveModeEnabled:o,onToggleMoveMode:a,transformSpace:s,onTransformSpaceChange:c,originalTransform:l}){let u=t.transform?.rotation??l?.rotation??[0,0,0],d=t.transform?.position??l?.position??[0,0,0],p=(h,m)=>{let S=h.transform?.rotation??l?.rotation??[0,0,0],M=h.transform?.position??l?.position??[0,0,0],T=h.transform?.scale??l?.scale??[1,1,1],E=l?.pivotLocal??[0,0,0],b=Eb(M,S,m,T,E,l?.rotationOrder??"XYZ");return{...h,transform:{...h.transform,position:b,rotation:m}}},g=(h,m)=>{e&&r(e,S=>{let M=S.transform?.rotation??l?.rotation??[0,0,0],T=ZP(M,h,m);return p(S,T)})},f=(h,m)=>{e&&r(e,S=>{let T=[...S.transform?.rotation??l?.rotation??[0,0,0]];return T[h]=Yx(Mp(m)),p(S,T)})},v=(h,m)=>{e&&r(e,S=>{let T=[...S.transform?.position??l?.position??[0,0,0]];return T[h]=m,{...S,transform:{...S.transform,position:T}}})},P=(h,m)=>{e&&v(h,d[h]+m)},y=()=>{!e||!l||r(e,h=>{let m={...h.transform};return delete m.position,delete m.rotation,{...h,transform:Object.keys(m).length>0?m:void 0}})};return vr(Dn,{title:"Move & Rotate",open:n,onToggle:i,tooltip:"Enable the transform gizmo to move or rotate the selected mesh on any axis. Rotation uses the object's visible center while exported position and rotation remain local GLTF transforms.",children:[vr("div",{className:"se-field",children:[vr("div",{className:"se-fieldLabel",children:[vr("span",{children:[Nt(KP,{size:14,style:{marginRight:6,verticalAlign:"-2px"}}),"Transform gizmo"]}),vr("label",{className:"se-switch","aria-label":"Toggle move mode",children:[Nt("input",{type:"checkbox",checked:o,onChange:h=>a(h.target.checked)}),Nt("span",{className:"se-switchTrack",children:Nt("span",{className:"se-switchThumb"})})]})]}),Nt("span",{className:"bb-note",children:"Select a mesh \xB7 drag the colored arrows or planes to move"})]}),vr("div",{className:"se-field",style:{marginTop:10},children:[Nt("div",{className:"se-fieldLabel",children:Nt("span",{children:"Axis space"})}),Nt("div",{className:"se-segmentedControl",children:["world","local"].map(h=>Nt("button",{type:"button",className:`se-segmentedOption ${s===h?"se-segmentedOption--active":""}`,onClick:()=>c(h),children:h},h))})]}),vr("div",{className:"se-field",style:{marginTop:10},children:[Nt("div",{className:"se-fieldLabel",children:Nt("span",{children:"Rotation (degrees)"})}),Nt("div",{className:"bb-transformAxesGrid",children:Xx.map((h,m)=>{let S=Math.round(qx(u[m]));return vr("div",{className:"bb-transformAxis",children:[Nt("span",{className:"se-axisStepperLabel bb-transformAxisLabel",children:h}),Nt("div",{className:"bb-transformAxisControl",children:Nt("input",{type:"number",className:"se-numberInput bb-transformNumberInput",step:1,min:0,max:359,value:S,disabled:!e,"aria-label":`${h} rotation in degrees`,onChange:M=>{let T=Number(M.target.value);Number.isFinite(T)&&f(m,T)}})})]},h)})})]}),vr("div",{className:"se-field",style:{marginTop:10},children:[Nt("div",{className:"se-fieldLabel",children:Nt("span",{children:"Position"})}),Nt(ek,{value:d,min:-1/0,max:1/0,step:QP,disabled:!e,label:"position",onChange:h=>{e&&r(e,m=>({...m,transform:{...m.transform,position:h}}))}})]}),vr("button",{type:"button",className:"bb-button bb-button--ghost",style:{marginTop:10,display:"inline-flex",alignItems:"center",gap:6},disabled:!e||!l,onClick:y,title:"Restore this node's position and rotation to what they were in the original model",children:[Nt(JP,{size:14}),"Restore original position & rotation"]})]})}import{memo as ok,useMemo as Qx,useState as ak}from"react";function tk(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 Tp(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 nk(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 rk(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 ik(e){let t=nk(e);return{id:tk(e),modelObjectId:e,type:t,label:Tp(e),status:"normal",selectable:!0,hoverable:!0,visible:!0,style:{},actions:rk(t),metrics:{},metadata:{}}}function xc(e){return Object.fromEntries(e.map(t=>[t,ik(t)]))}function Jx(e){let{nodesById:t}=No(e),n=[];for(let[i,r]of Object.entries(t)){let o=r;o.isMesh&&o.geometry&&r.name&&n.push(i)}return n.sort((i,r)=>i.localeCompare(r))}import{Fragment as lk,jsx as lo,jsxs as xi}from"react/jsx-runtime";var Zx=ok(sk);function sk({bindings:e,selectedItem:t,onSelect:n,onHover:i,isOpen:r=!0,onToggle:o}){let[a,s]=ak(""),c=Qx(()=>Object.keys(e),[e]),l=Qx(()=>{let u=a.trim().toLowerCase();return u?c.filter(d=>{let p=e[d];return d.toLowerCase().includes(u)||p.label?.toLowerCase().includes(u)||p.type.toLowerCase().includes(u)}):c},[e,c,a]);return xi("aside",{className:`bb-sidebar bb-sidebar--right ${r?"":"bb-sidebar--collapsed"}`,children:[xi("div",{className:"bb-header bb-header--sidebar",children:[!r&&lo("button",{type:"button",className:"bb-sidebarToggle",onClick:()=>o?.(!0),"aria-label":"Open scene nodes sidebar",title:"Open scene nodes",children:"\u2190"}),r&&xi(lk,{children:[xi("div",{children:[lo("div",{className:"bb-sectionKicker",children:"Scene Nodes"}),xi("div",{className:"bb-sectionHeading",children:[l.length," visible entries"]})]}),lo("button",{type:"button",className:"bb-sidebarToggle",onClick:()=>o?.(!1),"aria-label":"Close scene nodes sidebar",title:"Close scene nodes",children:"\u2192"})]})]}),r&&xi("section",{className:"bb-nodeList",children:[lo("div",{className:"bb-search",children:lo("input",{className:"bb-input",placeholder:"Search nodes, labels, or types",value:a,onChange:u=>s(u.target.value)})}),lo("div",{className:"bb-nodeItems",children:l.map(u=>{let d=e[u];return xi("button",{type:"button",className:`bb-nodeButton ${u===t?"bb-nodeButton--active":""}`,onClick:()=>n(u),onMouseEnter:()=>i?.(u),onMouseLeave:()=>i?.(null),children:[lo("span",{className:"bb-nodeName",children:u}),xi("span",{className:"bb-nodeMeta",children:[d.type,d.label===Tp(u)?"":d.label||"\xB7 Untitled"]})]},u)})})]})]})}import{jsx as yc,jsxs as e0}from"react/jsx-runtime";function Pp({title:e,label:t,open:n,onToggle:i,draft:r,error:o,example:a,onDraftChange:s,onCommit:c}){return yc(Dn,{title:e,open:n,onToggle:i,children:e0("div",{className:"bb-field",children:[yc("label",{className:"bb-label",children:t}),yc("textarea",{className:"bb-textarea",value:r,onChange:l=>s(l.target.value),onBlur:c}),o?yc("span",{className:"bb-status bb-status--error",children:o}):e0("span",{className:"bb-note",children:["Use a JSON object like ",a,"."]})]})})}function t0(e,t){let n=new Map(e.animations.clips.map(o=>[o.sourceName,o])),i=t.map(({sourceName:o})=>n.get(o)??{sourceName:o,displayName:o,hidden:!1,loopMode:"repeat",speed:1}),r=e.animations.autoplayClip&&i.some(o=>o.sourceName===e.animations.autoplayClip&&!o.hidden)?e.animations.autoplayClip:null;return{clips:i,autoplayClip:r}}import{useCallback as vc,useReducer as ck,useRef as dk}from"react";var uk=100;function pk(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(-uk),present:n,future:[]}}case"undo":{if(e.past.length===0)return e;let n=e.past[e.past.length-1];return{past:e.past.slice(0,-1),present:n,future:[e.present,...e.future]}}case"redo":{if(e.future.length===0)return e;let[n,...i]=e.future;return{past:[...e.past,e.present],present:n,future:i}}case"reset":return{past:[],present:t.value,future:[]}}}function kp(e,t=600){let[n,i]=ck(pk,{past:[],present:e,future:[]}),r=dk(0),o=vc(l=>{let u=Date.now(),d=u-r.current<t;r.current=u,i({type:"set",updater:l,coalesce:d})},[t]),a=vc(()=>{r.current=0,i({type:"undo"})},[]),s=vc(()=>{r.current=0,i({type:"redo"})},[]),c=vc(l=>{r.current=0,i({type:"reset",value:l})},[]);return{value:n.present,setValue:o,undo:a,redo:s,reset:c,canUndo:n.past.length>0,canRedo:n.future.length>0}}import{strToU8 as hk}from"fflate";function n0(e){return JSON.stringify(e,null,2)}function r0(e){return['import { defineObjectBindings } from "@liveroom-tech/react-immersive/utils";',"",`export const objectBindings = defineObjectBindings(${JSON.stringify(e,null,2)});`,""].join(`
|
|
25
|
+
`)}function i0(e){return JSON.stringify(e,null,2)}function o0(e){return['import type { SceneConfig } from "@liveroom-tech/react-immersive/utils";',"",`export const sceneConfig: SceneConfig = ${JSON.stringify(e,null,2)};`,""].join(`
|
|
26
|
+
`)}function Ms(e,t,n){zr(new Blob([t],{type:n}),e)}function _p(e){return JSON.stringify(e??{},null,2)}function Ap(e){return`[${e[0].toFixed(3)}, ${e[1].toFixed(3)}, ${e[2].toFixed(3)}]`}function mk(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 a0(e){let t=new Set;for(let r of Object.values(e))for(let o of mk(r))t.add(o);let n=[],i=[];return await Promise.all(Array.from(t).map(async r=>{let o=am(r);if(o)try{let a=await fetch(o);if(!a.ok)throw new Error(String(a.status));n.push({path:r,blob:await a.blob()})}catch{i.push(r)}})),{assets:n,failedPaths:i}}async function Rp(e,t,n,i,r){if(r.length===0){Ms(e,t,n);return}let o={[e]:hk(t)};for(let s of r)o[s.path]=new Uint8Array(await s.blob.arrayBuffer());let a=await Ys(o);zr(new Blob([a],{type:"application/zip"}),i)}var Ep={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"]},s0=Object.keys(Ep);function l0(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 Lp(e){if(e)return Object.values(e).some(l0)?e:void 0}function ar(e,t){return e?Ep[t].some(n=>l0(e[n])):!1}function Bp(e){return{pbr:ar(e,"pbr"),roughness:ar(e,"roughness"),emission:ar(e,"emission"),opacity:ar(e,"opacity"),normalBump:ar(e,"normalBump"),displacement:ar(e,"displacement"),ao:ar(e,"ao"),clearcoat:ar(e,"clearcoat"),sheen:ar(e,"sheen"),anisotropy:ar(e,"anisotropy"),transmission:ar(e,"transmission"),faces:ar(e,"faces")}}function Op(e,t){if(t)return{...e,style:{...e.style,material:t}};if(!e.style)return e;let{material:n,...i}=e.style;return{...e,style:Object.keys(i).length>0?i:void 0}}function c0(e,t){if(!e)return;let n={...e};for(let i of Ep[t])delete n[i];return n}import{Fragment as Ts,jsx as ee,jsxs as qe}from"react/jsx-runtime";var bk="/room.glb";function wc(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function m0(e,t){if(!wc(e)||!wc(t))return t??e;let n={...e};for(let[i,r]of Object.entries(t)){let o=n[i];n[i]=wc(o)&&wc(r)?m0(o,r):r}return n}function g0({licenseKey:e,licenseValidationUrl:t,dracoDecoderPath:n,ktx2TranscoderPath:i,meshopt:r,project:o,onProjectChange:a,projectChangeDebounceMs:s=350,onModelUpload:c,onEditLeaseChange:l}){let u=Cn(null),d=Cn(null),p=Cn(null),[g,f]=tt(o?.model.url??null),[v,P]=tt(o?.model.name??""),[y,h]=tt(o?.model??null),[m,S]=tt(null),M=kp(o?.objectBindings??{}),T=M.value,E=M.setValue,[b,C]=tt(!1),[x,k]=tt(!1),[I,A]=tt("Load the demo model or upload a GLB, GLTF, OBJ, FBX, or USDZ model to generate bindings."),[z,_]=tt("default"),[F,j]=tt(!1),[L,B]=tt("{}"),[G,U]=tt("{}"),[oe,xe]=tt(null),[le,ge]=tt(null),[we,Me]=tt(!1),[ne,pt]=tt(!1),[Ee,Ae]=tt(!1),[Be,Ve]=tt({identity:!0,basics:!0,material:!1,actions:!1,camera:!1,transform:!1,metrics:!1,metadata:!1}),[Fe,At]=tt({pbr:!0,roughness:!1,emission:!1,opacity:!1,normalBump:!1,displacement:!1,ao:!1,clearcoat:!1,sheen:!1,anisotropy:!1,transmission:!1,faces:!1}),Le=O=>Ve(V=>({...V,[O]:!V[O]})),jt=O=>At(V=>({...V,[O]:!V[O]})),[St,Oe]=tt("object"),[re,$]=tt("General"),[q,Te]=tt("metalness"),[ze,Pe]=tt(Bp()),ce=Cn(null),[He,nt]=tt(!1),[dt,Nn]=tt(!0),[hn,Ce]=tt(!0),[Ye,at]=tt(!1),[Re,Mt]=tt(null),[mt,Tt]=tt(!1),[Rt,cr]=tt("world"),ue=Cn({}),R=kp(o?.sceneConfig??Ri),N=R.value,H=R.setValue,[Z,Y]=tt(null),[se,ae]=tt(null),rt=ic(e,t),st=Xb(rt.tier),fe=Dp(()=>({isInsideEditor:!0,activeTab:St,activeSubTab:re,tier:st,setActiveTab:Oe,setActiveSubTab:$}),[St,re,st]),De=Cn(null),ut=Cn(0),pe=Cn(0),gt=Cn(o?`${o.id}:${o.revision}`:null),Wt=Cn(null),on=Cn(!1),Et=Cn(!1),zt=Cn(o?{modelUrl:o.model.url,bindings:o.objectBindings,sceneConfig:o.sceneConfig}:null),Ke=Cn(o?{requestId:0,modelName:o.model.name??"model",modelUrl:o.model.url,storedBindings:o.objectBindings,streaming:!!o.model.tilesetUrl}:null),wr=Cn(null),{cameraState:vt,resetView:uo,focusObject:ma,fitScene:Wn,setCameraState:Or,handleCameraChange:Ac,handleViewerReady:Rc}=sp(),po=Ht(O=>{Or({position:O.position,target:O.target,fov:vt?.fov??null,zoom:vt?.zoom??1,azimuthAngle:O.azimuthAngle,polarAngle:O.polarAngle},!0)},[Or,vt]),$n=lp(),Pt=m?T[m]??null:null,ga=Pt?.style?.material,dr=Pt?.cameraState,Qr=vt?{position:Ap(vt.position),target:Ap(vt.target)}:null,ho=Ht(O=>{H(V=>{let J=V.annotations.map(ve=>ve.id).join(","),be=O.map(ve=>ve.id).join(",");return J===be?V:{...V,annotations:O}})},[]),_s=Ht(O=>{Y(O?{annotation:O}:null)},[]);co(()=>{if(!Pt){B("{}"),U("{}"),xe(null),ge(null);return}B(_p(Pt.metrics)),U(_p(Pt.metadata)),xe(null),ge(null)},[Pt]),co(()=>{let O=Bp(ga);if(ce.current!==m){ce.current=m,Pe(O);return}Pe(V=>{let J=!1,be={...V};for(let ve of s0)O[ve]&&!V[ve]&&(be[ve]=!0,J=!0);return J?be:V})},[m,ga]),co(()=>()=>{De.current?.cleanup()},[]);let Zr=Ht((O,V)=>{let J=xc(O);if(V){let be=new Map(Object.values(V).map(ve=>[ve.modelObjectId,ve]));for(let ve of O){let Lt=be.get(ve);Lt&&(J[ve]=Lt)}}return J},[]);co(()=>{if(!o)return;let O=`${o.id}:${o.revision}`;if(gt.current===O)return;gt.current=O;let V=g!==o.model.url||y?.tilesetUrl!==o.model.tilesetUrl||y?.assetVersion!==o.model.assetVersion,J=T!==o.objectBindings,be=N!==o.sceneConfig;if((V||J||be)&&(Et.current=!0),h(o.model),P(o.model.name??"model"),J){let ve=Wt.current;M.reset(ve?Zr(ve,o.objectBindings):o.objectBindings)}if(be&&R.reset(o.sceneConfig),V){let ve=++pe.current;Ke.current={requestId:ve,modelName:o.model.name??"model",modelUrl:o.model.url,storedBindings:o.objectBindings,streaming:!!o.model.tilesetUrl},wr.current=null,S(null),C(!0),f(o.model.url)}zt.current={modelUrl:o.model.url,bindings:o.objectBindings,sceneConfig:o.sceneConfig}},[T,Zr,o,g,N,y,M,R]);let wi=Cn(a);wi.current=a,co(()=>{if(!o||!wi.current||!g)return;if(!on.current){on.current=!0;return}if(Ke.current)return;let O=zt.current;if(g===o.model.url&&T===o.objectBindings&&N===o.sceneConfig||O!==null&&g===O.modelUrl&&T===O.bindings&&N===O.sceneConfig)return;if(Et.current){Et.current=!1;return}let V=window.setTimeout(()=>{wi.current?.({projectId:o.id,baseRevision:o.revision,model:{...y??o.model,url:g,name:v||o.model.name},objectBindings:T,sceneConfig:N},"local")},s);return()=>window.clearTimeout(V)},[T,v,g,o,s,y,N]),co(()=>{let O=V=>{if(V.key.toLowerCase()!=="z"||!(V.metaKey||V.ctrlKey))return;let J=V.target,be=J?.tagName;if(be==="INPUT"||be==="TEXTAREA"||J?.isContentEditable)return;V.preventDefault();let ve=St==="scene"?R:M;V.shiftKey?ve.redo():ve.undo()};return window.addEventListener("keydown",O),()=>window.removeEventListener("keydown",O)},[St,M,R]),co(()=>{if(b||z==="default"||z==="success")return;j(!0);let O=window.setTimeout(()=>j(!1),4e3);return()=>window.clearTimeout(O)},[I,z,b]);let In=Dp(()=>Object.keys(T),[T]),Ec=Dp(()=>!m||!Pt?null:Pt.id.trim()?Object.entries(T).some(([J,be])=>J!==m&&be.id===Pt.id)?"Another binding already uses this ID.":null:"ID is required.",[T,m,Pt]),ur=(O,V)=>{E(J=>({...J,[O]:V(J[O])}))},fa=(O,V)=>{ur(O,J=>{let be=Lp(V(J.style?.material));return Op(J,be)})},Lc=(O,V,J)=>{fa(O,be=>({...be,[V]:J?{path:J}:void 0}))},zn=(O,V)=>{Pe(J=>({...J,[O]:V})),!V&&m&&ur(m,J=>{let be=Lp(c0(J.style?.material,O));return Op(J,be)})},mo=Ht((O,V,J)=>{let be=Jx(O),ve=xc(be);if(J){let lt=new Map(Object.values(J).map(Ne=>[Ne.modelObjectId,Ne]));for(let Ne of be){let gn=lt.get(Ne);gn&&(ve[Ne]=gn)}}O.updateMatrixWorld(!0);let Lt={};for(let lt of be){let Ne=gr(O,lt);if(!Ne){Lt[lt]={position:[0,0,0],rotation:[0,0,0],scale:[1,1,1],pivotLocal:[0,0,0],rotationOrder:"XYZ"};continue}let gn=uc(Ne);Lt[lt]={position:[Ne.position.x,Ne.position.y,Ne.position.z],rotation:[Ne.rotation.x,Ne.rotation.y,Ne.rotation.z],scale:[Ne.scale.x,Ne.scale.y,Ne.scale.z],pivotLocal:[gn.x,gn.y,gn.z],rotationOrder:Ne.rotation.order}}ue.current=Lt,M.reset(ve),S(be[0]??null),J||H(lt=>({...lt,annotations:[]})),A(`Generated ${be.length} bindings from ${V}.`),_("success"),C(!1)},[M,H]),Xn=(O,V,J,be)=>{let ve=++pe.current;C(!0);let Lt=J?J/1048576:0;A(Lt>=100?`Reading ${V} (${Math.round(Lt)}MB \u2014 large file, this can take a while)...`:`Reading ${V} and generating starter bindings...`),_("default"),P(V),h(be??{url:O,name:V}),Y(null);let lt=wr.current;if(O===g&<?.url===O){Ke.current=null,mo(lt.scene,V);return}Ke.current={requestId:ve,modelName:V,modelUrl:O,streaming:!!be?.tilesetUrl},f(O),M.reset({}),S(null)},Ci=Ht(O=>{let V=Ke.current;if(!(!V||V.requestId!==pe.current)){if(Ke.current=null,wr.current={url:V.modelUrl,scene:O},V.streaming){A(`Streaming ${V.modelName}.`),_("success"),C(!1);return}V.storedBindings&&(Et.current=!0),mo(O,V.modelName,V.storedBindings)}},[mo,M]),mn=Ht(O=>{let V=O.map(J=>J.name);V.length!==0&&(Wt.current=V,Et.current=!0,M.reset(Zr(V,o?.objectBindings)),S(J=>J??V[0]??null),A(`Streaming ${V.length} bindable objects.`),_("success"),C(!1))},[Zr,M,o]),go=Ht(O=>{let V=Ke.current;!V||V.requestId!==pe.current||(Ke.current=null,console.error(O),A(`Could not read ${V.modelName}. Make sure the file is a valid GLB, GLTF, OBJ, FBX, or USDZ asset.`),_("error"),C(!1))},[]),ba=Ht(O=>{$n.handleAnimationsReady(O);let V=O.clipDetails??O.clips.map(J=>({sourceName:J,duration:0}));H(J=>({...J,animations:t0(J,V)}))},[$n,H]),Bc=async()=>{De.current?.cleanup(),De.current=null,await Xn(bk,"room.glb")},As=async O=>{if(c){try{C(!0),A(`Uploading ${O.name}...`),_("default");let J=await c(O);await Xn(J.url,J.name??O.name,O.size,J)}catch(J){C(!1),A(J instanceof Error?J.message:`Could not upload ${O.name}.`),_("error")}return}let V;try{V=await dl(O)}catch(J){A(J instanceof Error?J.message:"Could not read model file. Upload a .glb, .gltf, .obj, .fbx, .usdz, or .zip asset."),_("error");return}De.current?.cleanup(),De.current=V,await Xn(V.url,V.name,O.size,{url:V.url,name:V.name})},Oc=async O=>{let V=O.target.files?.[0];V&&(await As(V),O.target.value="")},Cr=()=>{De.current?.cleanup(),De.current=null,wr.current=null,Ke.current=null,ue.current={},ut.current=0,Me(!1),f(null),P(""),h(null),S(null),Y(null),M.reset({}),B("{}"),U("{}"),xe(null),ge(null),ae(null),Tt(!1),H(O=>({...O,animations:Ri.animations,annotations:[]})),A("Load the demo model or upload a GLB, GLTF, OBJ, FBX, or USDZ model to generate bindings."),_("default")},Si=()=>{u.current?.click()},xa=()=>{d.current?.click()},qn=async O=>{k(!0);try{let{assets:V,failedPaths:J}=await a0(T);O==="json"?await Rp("objectBindings.json",n0(T),"application/json","objectBindings.zip",V):await Rp("objectBindings.ts",r0(T),"text/typescript","objectBindings-ts.zip",V),J.length>0?(A(`Exported, but ${J.length} uploaded image${J.length===1?"":"s"} couldn't be bundled: ${J.join(", ")}.`),_("error")):V.length>0&&(A(`Exported with ${V.length} uploaded image${V.length===1?"":"s"} bundled into the zip.`),_("success"))}catch(V){let J=V instanceof Error?V.message:"Unknown export error.";A(`Failed to export bindings: ${J}`),_("error")}finally{k(!1)}},ya=async O=>{if(!In.length){A("Load a model before importing bindings."),_("error");return}let V;try{V=JSON.parse(await O.text())}catch{A(`${O.name} is not valid JSON.`),_("error");return}if(V===null||typeof V!="object"||Array.isArray(V)){A("Expected a JSON object mapping object IDs to bindings."),_("error");return}let J=new Map;for(let lt of Object.values(V))if(lt!==null&&typeof lt=="object"&&typeof lt.id=="string"&&typeof lt.type=="string"&&typeof lt.modelObjectId=="string"){let Ne=lt;J.set(Ne.modelObjectId,Ne)}if(J.size===0){A(`${O.name} doesn't look like an exported bindings file.`),_("error");return}let be={...T},ve=0;for(let lt of Object.keys(be)){let Ne=J.get(lt);Ne&&(be[lt]=Ne,ve++)}if(ve===0){A(`None of the object IDs in ${O.name} match this model \u2014 nothing imported.`),_("error");return}E(be);let Lt=J.size-ve;A(Lt>0?`Imported ${ve} binding${ve===1?"":"s"} from ${O.name} (${Lt} skipped \u2014 not in this model).`:`Imported ${ve} binding${ve===1?"":"s"} from ${O.name}.`),_("success")},Mi=async O=>{let V=O.target.files?.[0];V&&(await ya(V),O.target.value="")},fo=()=>{p.current?.click()},Ti=async O=>{let V;try{V=JSON.parse(await O.text())}catch{A(`${O.name} is not valid JSON.`),_("error");return}if(V===null||typeof V!="object"||Array.isArray(V)){A("Expected a JSON object with scene config sections."),_("error");return}let J=["model","camera","lighting","wireframe","shadows","environment","background","groundShadows","postProcessing","animations","annotations","cinematic"],be=V,ve=J.filter(Lt=>be[Lt]!==void 0);if(ve.length===0){A(`${O.name} doesn't look like an exported scene config file.`),_("error");return}H(Lt=>{let lt={...Lt};for(let Ne of ve)lt[Ne]=m0(Lt[Ne],be[Ne]);return lt}),A(`Imported ${ve.length} section${ve.length===1?"":"s"} from ${O.name}.`),_("success")},Dr=async O=>{let V=O.target.files?.[0];V&&(await Ti(V),O.target.value="")},Rs=O=>{O.preventDefault(),O.stopPropagation(),!(b||g)&&(ut.current+=1,Me(!0))},Dc=O=>{O.preventDefault(),O.stopPropagation(),!(b||g)&&(O.dataTransfer.dropEffect="copy",Me(!0))},va=O=>{O.preventDefault(),O.stopPropagation(),!(b||g)&&(ut.current=Math.max(0,ut.current-1),ut.current===0&&Me(!1))},Es=async O=>{if(O.preventDefault(),O.stopPropagation(),ut.current=0,Me(!1),b||g)return;let V=O.dataTransfer.files?.[0];V&&await As(V)},ei=(O,V,J)=>{if(!m)return;let be;try{be=JSON.parse(V)}catch{J("Invalid JSON");return}if(be===null||typeof be!="object"||Array.isArray(be)){J("Expected a JSON object");return}if(O==="metrics"&&Object.values(be).some(Lt=>typeof Lt!="number"||!Number.isFinite(Lt))){J("Metrics values must be numbers");return}ur(m,ve=>({...ve,[O]:be})),J(null)},Ls=Ht(O=>{if(!O){S(null);return}let V=Object.entries(T).find(([J,be])=>be===O||J===O.modelObjectId||be.modelObjectId===O.modelObjectId)?.[0]??null;S(V)},[T]),Bs=Ht(async O=>{S(O),ae(null),await ma(O)},[ma]),Os=Ht(O=>{ae(O?T[O]??null:null)},[T]),Nc=Ht(O=>Ae(!O),[]),Ic=Ht(()=>{if(!m||!vt)return;let O={position:vt.position,target:vt.target,...vt.fov!=null?{fov:vt.fov}:{},zoom:vt.zoom};ur(m,V=>({...V,cameraState:O}))},[m,vt]),Ds=Ht(()=>{!dr?.position||!dr?.target||Or({position:dr.position,target:dr.target,fov:dr.fov??vt?.fov??null,zoom:dr.zoom??vt?.zoom??1},!0)},[dr,Or,vt]),Pi=Ht(()=>{m&&ur(m,O=>({...O,cameraState:void 0}))},[m]),Ns=Ht(async()=>{await uo()},[uo]),zc=Ht(async()=>{await Wn()},[Wn]),wa=Ht(O=>{Mt(O),at(!0)},[]),pr=Ht(()=>{at(!1),Mt(null)},[]),ki=Ht(()=>{if(Re==="bindings"){if(!In.length){pr();return}let O=xc(In);M.reset(O),S(In[0]??null),A("Object bindings reset to default values."),_("success")}else Re==="scene"&&(R.reset(Ri),A("Scene config reset to default values."),_("success"));pr()},[Re,In,M,R,pr]);return rt.status==="checking"?ee("div",{className:"bb-root bb-root--licenseChecking",children:ee(Oi,{title:"Verifying License",message:"Checking your license key..."})}):rt.status==="invalid"?ee("div",{className:"bb-root bb-root--licenseInvalid",children:ee(Oi,{tone:"error",title:"Invalid License",message:rt.isLocalDomain?rt.reason??"License has been revoked or has expired":"Failed to load. Please contact the site administrator."})}):qe(Ku.Provider,{value:fe,children:[qe("div",{className:"bb-root",children:[ee("input",{ref:u,type:"file",accept:cl,className:"bb-hiddenInput",onChange:Oc,disabled:b}),ee("input",{ref:d,type:"file",accept:".json,application/json",className:"bb-hiddenInput",onChange:Mi,disabled:b}),ee("input",{ref:p,type:"file",accept:".json,application/json",className:"bb-hiddenInput",onChange:Dr,disabled:b}),qe("aside",{className:`bb-sidebar bb-sidebar--left ${ne?"bb-sidebar--collapsed":""}`,children:[qe("div",{className:"bb-header bb-header--sidebar",children:[!ne&&ee("h1",{className:"bb-title",children:"Binding Builder"}),ee("button",{type:"button",className:"bb-sidebarToggle",onClick:()=>pt(O=>!O),"aria-label":ne?"Open editor sidebar":"Collapse editor sidebar",title:ne?"Open editor":"Collapse editor",children:ne?"\u2192":"\u2190"})]}),!ne&&qe(Ts,{children:[qe("div",{className:"bb-tabRow",children:[ee("button",{type:"button",className:`bb-tab ${St==="object"?"bb-tab--active":""}`,onClick:()=>Oe("object"),children:"Object"}),ee("button",{type:"button",className:`bb-tab ${St==="scene"?"bb-tab--active":""}`,onClick:()=>Oe("scene"),children:"Scene"})]}),ee("section",{className:"bb-editor",children:St==="scene"?ee(Ts,{children:g?ee(bp,{config:N,onChange:H,activeSubTab:re,onActiveSubTabChange:$,cameraState:re==="Cinematic"&&vt?{position:vt.position,target:vt.target,azimuthAngle:vt.azimuthAngle,polarAngle:vt.polarAngle}:null,onPreviewWaypoint:po,animationClipDetails:$n.clipDetails,animationPlayback:$n}):ee("div",{className:"bb-emptyEditor",children:"Upload a model to edit its scene settings."})}):!Pt||!m?ee("div",{className:"bb-emptyEditor",children:"Select a generated node binding to edit its values."}):qe(Ts,{children:[ee("div",{className:"bb-editorHeader",children:qe("div",{children:[ee("div",{className:"bb-sectionKicker",children:"Editing Binding"}),ee("h2",{className:"bb-editorTitle",children:Pt.label||m}),qe("div",{className:"bb-editorMeta",children:[ee("span",{children:Pt.type}),ee("span",{children:Pt.modelObjectId})]})]})}),ee(Ix,{selectedItem:m,selectedBinding:Pt,open:Be.identity,onToggle:()=>Le("identity"),updateBinding:ur,idError:Ec}),ee(Fx,{selectedItem:m,selectedBinding:Pt,open:Be.basics,onToggle:()=>Le("basics"),updateBinding:ur}),qe(Dn,{title:"Material",open:Be.material,onToggle:()=>Le("material"),tooltip:"Edit the selected object's base material, textures, and surface properties.",children:[ee(Nx,{disabled:!m,onApply:O=>m&&fa(m,V=>({...V,...O}))}),ee(Ox,{selectedItem:m,selectedMaterial:ga,pbrWorkflow:q,onPbrWorkflowChange:Te,openMaterialPanels:Fe,materialPanelEnabled:ze,onToggleMaterialPanel:jt,onSetMaterialPanelState:zn,updateSelectedMaterial:fa,setSelectedTexturePath:Lc})]}),ee(Wx,{selectedItem:m,selectedBinding:Pt,open:Be.actions,onToggle:()=>Le("actions"),updateBinding:ur}),ee($x,{selectedBinding:Pt,open:Be.camera,onToggle:()=>Le("camera"),cameraState:vt,formattedCameraState:Qr,savedCameraPosition:dr,onSaveCameraPosition:Ic,onGoToSavedCamera:Ds,onClearSavedCamera:Pi,onResetView:Ns,onFitScene:zc}),ee(Kx,{selectedItem:m,selectedBinding:Pt,open:Be.transform,onToggle:()=>Le("transform"),updateBinding:ur,moveModeEnabled:mt,onToggleMoveMode:Tt,transformSpace:Rt,onTransformSpaceChange:cr,originalTransform:ue.current[m]??null}),ee(Pp,{title:"Metrics",label:"Metrics JSON",open:Be.metrics,onToggle:()=>Le("metrics"),draft:L,error:oe,example:'{"area": 42}',onDraftChange:B,onCommit:()=>ei("metrics",L,xe)}),ee(Pp,{title:"Metadata",label:"Metadata JSON",open:Be.metadata,onToggle:()=>Le("metadata"),draft:G,error:le,example:'{"room": "kitchen"}',onDraftChange:U,onCommit:()=>ei("metadata",G,ge)})]})}),St==="object"&&qe("div",{className:"bb-toolbar",children:[qe("div",{className:"bb-toolbarGroup",children:[ee("button",{type:"button",className:"bb-iconButton",disabled:!M.canUndo,onClick:M.undo,title:"Undo (Cmd/Ctrl+Z)",children:ee(u0,{size:16})}),ee("button",{type:"button",className:"bb-iconButton",disabled:!In.length,onClick:()=>wa("bindings"),title:"Reset object bindings to default",children:ee(h0,{size:16})}),ee("button",{type:"button",className:"bb-iconButton",disabled:!M.canRedo,onClick:M.redo,title:"Redo (Cmd/Ctrl+Shift+Z)",children:ee(d0,{size:16})})]}),ee("div",{className:"bb-toolbarDivider"}),qe("button",{type:"button",className:"bb-button bb-button--ghost",disabled:!In.length||b,onClick:xa,title:"Re-apply a previously exported objectBindings.json onto this model",children:[ee(p0,{size:14}),"Import"]}),ee("div",{className:"bb-toolbarDivider"}),ee(wp,{disabled:!In.length||x,exporting:x,onExportJson:()=>qn("json"),onExportTs:()=>qn("ts")})]}),St==="scene"&&qe("div",{className:"bb-toolbar",children:[qe("div",{className:"bb-toolbarGroup",children:[ee("button",{type:"button",className:"bb-iconButton",disabled:!R.canUndo,onClick:R.undo,title:"Undo (Cmd/Ctrl+Z)",children:ee(u0,{size:16})}),ee("button",{type:"button",className:"bb-iconButton",onClick:()=>wa("scene"),title:"Reset scene config to default",children:ee(h0,{size:16})}),ee("button",{type:"button",className:"bb-iconButton",disabled:!R.canRedo,onClick:R.redo,title:"Redo (Cmd/Ctrl+Shift+Z)",children:ee(d0,{size:16})})]}),ee("div",{className:"bb-toolbarDivider"}),qe("button",{type:"button",className:"bb-button bb-button--ghost",disabled:!In.length||b,onClick:fo,title:"Re-apply a previously exported sceneConfig.json",children:[ee(p0,{size:14}),"Import"]}),ee("div",{className:"bb-toolbarDivider"}),ee(wp,{disabled:!In.length||b,onExportJson:()=>Ms("sceneConfig.json",i0(N),"application/json"),onExportTs:()=>Ms("sceneConfig.ts",o0(N),"text/typescript")})]})]})]}),qe("main",{className:"bb-previewShell",children:[qe("div",{className:"bb-previewHeader",children:[qe("div",{className:"bb-previewToggles",children:[qe("label",{className:"bb-checkbox bb-checkbox--compact",style:{color:"black"},children:[ee("input",{type:"checkbox",checked:He,onChange:O=>nt(O.target.checked)}),"Zoom on selected"]}),qe("label",{className:"bb-checkbox bb-checkbox--compact",style:{color:"black"},children:[ee("input",{type:"checkbox",checked:dt,onChange:O=>Nn(O.target.checked)}),"Highlight on hover"]}),qe("label",{className:"bb-checkbox bb-checkbox--compact",style:{color:"black"},children:[ee("input",{type:"checkbox",checked:hn,onChange:O=>Ce(O.target.checked)}),"Camera controller"]})]}),qe("div",{className:"bb-previewControlsColumn",children:[qe("div",{className:"bb-previewControls",children:[ee("div",{className:"bb-previewMeta",children:ee("span",{children:m?`Focused: ${m}`:"Select a node to inspect it"})}),g&&ee("button",{type:"button",className:"bb-button bb-button--ghost bb-removeModelButton",onClick:Cr,children:"Remove model"})]}),g&&ee("div",{className:"bb-moveHint",children:mt?ee(Ts,{children:"Select a mesh \xB7 drag the colored arrows, planes, or rings"}):qe(Ts,{children:[ee("kbd",{children:"W"}),ee("kbd",{children:"A"}),ee("kbd",{children:"S"}),ee("kbd",{children:"D"})," move \xB7 ",ee("kbd",{children:"Space"}),"/",ee("kbd",{children:"C"})," up \xB7 down \xB7 drag to look"]})})]})]}),qe("div",{className:"bb-preview",children:[ee(Qo,{visible:b||F,message:I,tone:z,spinner:b}),g?ee(mc,{modelUrl:g,tilesetUrl:y?.tilesetUrl,objectBindings:T,selectedObject:Pt,onObjectSelect:Ls,onObjectBindingsChange:E,onObjectEditLeaseChange:(O,V)=>l?.(O.modelObjectId||O.id,V),showObjectBindingDataPanel:!1,showSceneObjectsPanel:!1,onCameraChange:Ac,onViewerReady:Rc,onAnnotationsChange:ho,activeAnnotation:Z?.annotation??null,onActiveAnnotationChange:_s,onAnimationsReady:ba,onModelLoaded:Ci,onLoadError:go,onObjectCatalog:mn,licenseKey:e,licenseValidationUrl:t,dracoDecoderPath:n,ktx2TranscoderPath:i,meshopt:r,sceneConfig:N,onSceneConfigChange:H,preserveDrawingBuffer:!0,disableZoom:!1,zoomOnSelected:He,highlightOnHover:dt,enableCameraControls:hn,moveModeEnabled:mt,objectTransformSpace:Rt,enableKeyboardNavigation:!0,showViewGizmo:!0,panelHoveredObject:dt?se:null,showLoadingOverlay:!1}):ee("div",{className:`bb-previewPlaceholder ${we?"bb-previewPlaceholder--dragActive":""}`,onDragEnter:Rs,onDragOver:Dc,onDragLeave:va,onDrop:Es,children:qe("div",{children:[ee("div",{children:"Upload a GLB, GLTF, OBJ, FBX, or USDZ model, or drag a supported model/ZIP bundle here to generate editable object bindings."}),ee("button",{type:"button",className:"bb-previewPlaceholderButton",onClick:Si,disabled:b,children:b?"Loading model...":"Upload"})]})})]})]}),ee(Zx,{bindings:T,selectedItem:m,onSelect:Bs,onHover:Os,isOpen:!Ee,onToggle:Nc})]}),Ye&&ee("div",{className:"bb-reset-overlay",onClick:pr,children:qe("div",{className:"bb-reset-dialog",onClick:O=>O.stopPropagation(),children:[qe("div",{className:"bb-reset-header",children:[qe("h3",{className:"bb-reset-title",children:[ee(fk,{size:20,className:"bb-icon-warning"}),"Confirm Reset"]}),ee("button",{className:"bb-reset-close",onClick:pr,children:ee(gk,{size:20})})]}),qe("div",{className:"bb-reset-body",children:[qe("p",{className:"bb-reset-message",children:["Are you sure you want to reset"," ",ee("strong",{children:Re==="bindings"?"Object Bindings":"Scene Config"}),"?"]}),ee("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."}),ee("p",{className:"bb-reset-warning",children:"This action cannot be undone!"})]}),qe("div",{className:"bb-reset-footer",children:[ee("button",{className:"bb-reset-btn",onClick:pr,children:"Cancel"}),ee("button",{className:"bb-reset-btn-danger",onClick:ki,children:"Yes, Reset"})]})]})})]})}import{useRef as yi,useState as en,useCallback as _n,useEffect as sr,useMemo as Cc,Component as xk,Suspense as Np}from"react";import{CameraControls as yk,Environment as vk}from"@react-three/drei";import{useFrame as w0,useThree as pa}from"@react-three/fiber";import{Canvas as wk}from"@react-three/fiber";import{Box3 as Ck,MeshStandardMaterial as Sk,PerspectiveCamera as Mk,Vector3 as Tk}from"three";import{SkeletonUtils as Pk}from"three-stdlib";import{X as Fp,Check as C0,Settings as kk,ChevronDown as _k,Boxes as Ak,Trash2 as Rk,Upload as Ip,AlertTriangle as Ek}from"lucide-react";import{Fragment as v0,jsx as K,jsxs as Qe}from"react/jsx-runtime";var f0={color:"#93c5fd",intensity:.05},Lk=["apartment","city","dawn","forest","lobby","night","park","studio","sunset","warehouse"];function Bk(e){return!!(e&&"isMesh"in e&&e.isMesh)}function b0(e,t){Array.isArray(e)?e.forEach(t):t(e)}function Ok(e,t){if(!t)return;let n=t.camera;if(!(n instanceof Mk))return;let i=new Ck().setFromObject(e).getSize(new Tk).length();!Number.isFinite(i)||i<=0||(n.near=i/100,n.far=i*100,n.updateProjectionMatrix(),t.maxDistance=i*10)}var Vp=class extends xk{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 Dk({url:e,format:t,dracoDecoderPath:n,ktx2TranscoderPath:i,meshopt:r,hiddenKeys:o,selectedKey:a,panelHoveredKey:s,nodeRefsOut:c,onMeshesReady:l,onModelLoaded:u,onMeshClick:d,highlightOnHover:p}){let{scene:g}=ml(e,{dracoDecoderPath:n,ktx2TranscoderPath:i,meshopt:r},t),f=pa(x=>x.invalidate),{setCanvasCursor:v,restoreCanvasCursor:P}=Sl(),[y,h]=en(null),m=Cc(()=>Pk.clone(g),[g]),S=Cc(()=>{let x={};return m.traverse(k=>{if(!Bk(k))return;let I=k.name||k.uuid;x[I]={key:I,label:k.name||k.type,ref:k}}),x},[m]),M=Cc(()=>{let x={};for(let[k,{ref:I}]of Object.entries(S)){let z=(Array.isArray(I.material)?I.material:[I.material]).map(_=>{let j=(Io(_)??new Sk).clone();return j.userData.baseColor=j.color.clone(),j.userData.baseMap=j.map,j.userData.baseEmissive=j.emissive.clone(),j.userData.baseEmissiveMap=j.emissiveMap,j.userData.baseEmissiveIntensity=j.emissiveIntensity,j});x[k]=Array.isArray(I.material)?z:z[0]}return x},[S]);sr(()=>()=>{Object.values(M).forEach(x=>b0(x,k=>k.dispose()))},[M]);let T=yi(null);sr(()=>{T.current!==e&&(T.current=e,m.updateWorldMatrix(!0,!0),Xa(m),l(S),u(m))},[e,m,S,l,u]),sr(()=>{let x=new AbortController;return _o(m,x.signal),()=>{x.abort(),Bi(m)}},[m]);let E=Cc(()=>!Ws(m),[m]);sr(()=>{for(let[x,{ref:k}]of Object.entries(S))c.current[x]=k},[S,c]),sr(()=>{!p&&y!==null&&(h(null),P())},[p,y,P]),sr(()=>{for(let[x,{ref:k}]of Object.entries(S)){k.visible=!o.has(x);let I=M[x];if(!I)continue;k.material=I;let A=p&&y===x,z=p&&s===x;b0(I,_=>{if(_.color.copy(_.userData.baseColor),_.map=_.userData.baseMap??null,_.emissive.copy(_.userData.baseEmissive),_.emissiveMap=_.userData.baseEmissiveMap??null,_.emissiveIntensity=_.userData.baseEmissiveIntensity,z||A){let F=!!_.userData.baseEmissiveMap;_.emissive.set(f0.color),_.emissiveIntensity=F?_.userData.baseEmissiveIntensity:f0.intensity}_.needsUpdate=!0})}f()},[S,M,y,a,s,p,o,f]);let b=x=>{let k=x;for(;k;){let I=k.name||k.uuid;if(S[I])return I;k=k.parent}return null},C=E?{onClick:x=>{let k=b(x.object);k&&(x.stopPropagation(),d(k))},...p?{onPointerOver:x=>{let k=b(x.object);k&&(x.stopPropagation(),v("pointer"),h(k))},onPointerOut:x=>{x.stopPropagation(),P(),h(null)}}:{}}:{};return K("primitive",{object:m,...C})}function Nk({scene:e,controlsRef:t,refitOnResize:n,onInitialFitComplete:i}){let r=yi(!1),o=pa(c=>c.invalidate),a=pa(c=>c.size),s=yi(null);return sr(()=>{r.current=!1,o()},[o,e]),w0(()=>{if(!r.current){if(!e||!t.current){o();return}r.current=!0,Ok(e,t.current),t.current.fitToBox(e,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5}).catch(()=>{}).finally(i)}}),sr(()=>{if(!(!n||!r.current||!e||!t.current))return s.current&&clearTimeout(s.current),s.current=setTimeout(()=>{t.current?.fitToBox(e,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5}).catch(()=>{}),o()},150),()=>{s.current&&clearTimeout(s.current)}},[a.width,a.height,n]),null}function Ik({exposure:e}){let t=pa(i=>i.gl),n=pa(i=>i.invalidate);return sr(()=>{t.toneMappingExposure=e,n()},[t,e,n]),null}function zk({enabled:e,controlsRef:t}){let n=pa(i=>i.invalidate);return w0((i,r)=>{!e||!t.current||(t.current.rotate(r*.2,0,!1),n())}),null}function Sc(e){return Array.from(e.types).includes("Files")}function x0({label:e,checked:t,onChange:n}){return Qe("div",{className:"env-row",children:[K("span",{className:"env-row__label",children:e}),K("div",{className:"env-row__value",children:K("button",{className:"env-checkbox-btn",onClick:()=>n(!t),children:K("span",{className:`env-checkbox${t?" env-checkbox--checked":""}`,children:t&&K(C0,{size:9,strokeWidth:2,color:"white"})})})})]})}function zp({label:e,value:t,onChange:n}){return Qe("div",{className:"env-row",children:[K("span",{className:"env-row__label",children:e}),K("div",{className:"env-row__value",children:Qe("div",{className:"env-color-swatch",style:{background:t},children:[K("span",{className:"env-color-swatch__hex",children:t}),K("input",{type:"color",className:"env-color-swatch__input",value:t,onChange:i=>n(i.target.value)})]})})]})}function jp({label:e,value:t,min:n,max:i,step:r,onChange:o}){return Qe("div",{className:"env-row",children:[K("span",{className:"env-row__label",children:e}),Qe("div",{className:"env-row__value env-row__value--slider",children:[K("input",{type:"range",className:"env-slider",min:n,max:i,step:r,value:t,onChange:a=>o(Number(a.target.value))}),K("span",{className:"env-slider__value",children:t.toFixed(2)})]})]})}function jk({label:e,value:t,options:n,onChange:i}){return Qe("div",{className:"env-row",children:[K("span",{className:"env-row__label",children:e}),K("div",{className:"env-row__value",children:K("select",{className:"env-select",value:t,onChange:r=>i(r.target.value),children:n.map(r=>K("option",{value:r,children:r},r))})})]})}function y0({title:e,children:t}){let[n,i]=en(!1);return Qe("div",{className:"env-section",children:[Qe("button",{className:"env-section__header",onClick:()=>i(r=>!r),children:[K(_k,{size:12,strokeWidth:2,className:`env-section__chevron${n?" env-section__chevron--collapsed":""}`}),K("span",{children:e})]}),!n&&K("div",{className:"env-section__body",children:t})]})}function Vk({isOpen:e,onToggle:t,settings:n,onChange:i}){return Qe("div",{className:`left-panel-wrapper ${e?"left-panel-wrapper--open":"left-panel-wrapper--closed"}`,children:[!e&&K("button",{className:"side-panel__open-btn side-panel__open-btn--left",onClick:()=>t(!0),children:K(kk,{size:20,strokeWidth:1.8})}),Qe("div",{className:`side-panel side-panel--left ${e?"side-panel--open-left":"side-panel--closed-left"}`,"aria-hidden":!e,children:[K("div",{className:"side-panel__header",children:Qe("div",{className:"side-panel__header-top",children:[K("span",{className:"side-panel__eyebrow",children:"Scene Settings"}),K("button",{className:"side-panel__close-btn",onClick:()=>t(!1),title:"Close",children:K(Fp,{size:12,strokeWidth:1.6})})]})}),Qe("div",{className:"env-controls",children:[Qe(y0,{title:"Background",children:[K(x0,{label:"Background",checked:n.backgroundEnabled,onChange:r=>i("backgroundEnabled",r)}),K(zp,{label:"Background Color",value:n.backgroundColor,onChange:r=>i("backgroundColor",r)}),K(jk,{label:"Environment",value:n.envPreset,options:Lk,onChange:r=>i("envPreset",r)}),K(x0,{label:"Auto Rotate",checked:n.autoRotate,onChange:r=>i("autoRotate",r)})]}),Qe(y0,{title:"Lighting",children:[K(jp,{label:"Exposure",value:n.exposure,min:0,max:2,step:.05,onChange:r=>i("exposure",r)}),K(jp,{label:"Ambient Light Intensity",value:n.ambientIntensity,min:0,max:3,step:.05,onChange:r=>i("ambientIntensity",r)}),K(zp,{label:"Ambient Light Color",value:n.ambientColor,onChange:r=>i("ambientColor",r)}),K(jp,{label:"Direct Light Intensity",value:n.directionalIntensity,min:0,max:5,step:.05,onChange:r=>i("directionalIntensity",r)}),K(zp,{label:"Direct Light Color",value:n.directionalColor,onChange:r=>i("directionalColor",r)})]})]})]})]})}function Fk({meshKeys:e,hiddenKeys:t,selectedKey:n,isOpen:i,onToggle:r,onFocus:o,onHover:a,onToggleVisibility:s}){let[c,l]=en(""),[u,d]=en(null),p=Object.values(e).filter(g=>g.label.toLowerCase().includes(c.toLowerCase()));return Qe("div",{className:`right-panel-wrapper ${i?"right-panel-wrapper--open":"right-panel-wrapper--closed"}`,children:[!i&&K("button",{className:"side-panel__open-btn",onClick:()=>r(!0),children:K(Ak,{size:20,strokeWidth:1.8})}),Qe("div",{className:`side-panel ${i?"side-panel--open":"side-panel--closed"}`,"aria-hidden":!i,children:[Qe("div",{className:"side-panel__header",children:[Qe("div",{className:"side-panel__header-top",children:[K("span",{className:"side-panel__eyebrow",children:"SCENE OBJECTS"}),K("button",{className:"side-panel__close-btn",onClick:()=>r(!1),title:"Close",children:K(Fp,{size:12,strokeWidth:1.6})})]}),Qe("p",{className:"side-panel__title",children:[p.length," objects"]})]}),K("div",{className:"side-panel__search-wrap",children:K("input",{className:"side-panel__search",type:"text",placeholder:"Search objects",value:c,onChange:g=>l(g.target.value)})}),K("div",{className:"side-panel__list",children:p.map(({key:g,label:f})=>{let v=!t.has(g),P=n===g,y=u===g;return Qe("div",{onClick:()=>o(g),onMouseEnter:()=>{d(g),a(g)},onMouseLeave:()=>{d(null),a(null)},className:["side-panel__row",y?"side-panel__row--hovered":"",P?"side-panel__row--selected":""].filter(Boolean).join(" "),children:[K("span",{className:`side-panel__label${y||P?" side-panel__label--hovered":""}`,children:f}),K("button",{className:"side-panel__vis-btn",title:v?"Hide":"Show",onClick:h=>{h.stopPropagation(),s(g)},children:K("span",{className:`side-panel__checkbox${v?" side-panel__checkbox--checked":""}`,children:v&&K(C0,{size:9,strokeWidth:5,color:"white"})})})]},g)})})]})]})}function S0({modelUrl:e,modelFormat:t,dracoDecoderPath:n,ktx2TranscoderPath:i,meshopt:r=!0,backgroundColor:o="#1a1a1a",showSceneObjectsPanel:a=!0,showSceneSettingsPanel:s=!0,enableModelUpload:c=!1,zoomOnSelected:l=!1,highlightOnHover:u=!1,showLoadingOverlay:d=!0,refitOnResize:p=!0,backgroundEnabled:g=!1,autoRotate:f=!1,envPreset:v="city",exposure:P=1,ambientIntensity:y=.6,ambientColor:h="#ffffff",directionalIntensity:m=1.2,directionalColor:S="#ffffff",onModelLoaded:M,onLoadError:T}){let E=yi(null),b=yi({}),C=yi(null),x=yi(null),k=yi(0),[I,A]=en(null),[z,_]=en(null),[F,j]=en(!1),[L,B]=en({}),[G,U]=en(new Set),[oe,xe]=en(null),[le,ge]=en(null),[we,Me]=en(null),[ne,pt]=en(null),[Ee,Ae]=en(!1),[Be,Ve]=en(!1),[Fe,At]=en(!1),[Le,jt]=en(!1),[St,Oe]=en(()=>typeof window>"u"?!0:window.innerWidth>900),[re,$]=en(()=>typeof window>"u"?!0:window.innerWidth>900),[q,Te]=en({backgroundEnabled:g,backgroundColor:o,autoRotate:f,envPreset:v,exposure:P,ambientIntensity:y,ambientColor:h,directionalIntensity:m,directionalColor:S}),ze=c?we:e,Pe=_n(()=>{A(null),_(null),j(!1),B({}),U(new Set),xe(null),ge(null),Ae(!1),At(!1)},[]),ce=_n(()=>{x.current?.cleanup(),x.current=null},[]),He=_n(()=>{ce(),Me(null),pt(null),Pe(),Te({backgroundEnabled:g,backgroundColor:o,autoRotate:f,envPreset:v,exposure:P,ambientIntensity:y,ambientColor:h,directionalIntensity:m,directionalColor:S})},[h,y,f,o,g,S,m,v,P,Pe,ce]),nt=_n(async ue=>{Ve(!0);try{let R=await dl(ue);ce(),x.current=R,Me(R.url),pt(R.name),Pe()}catch(R){Ae(!0),T?.(R)}finally{Ve(!1)}},[T,Pe,ce]),dt=_n(ue=>{let R=ue?.[0];R&&nt(R)},[nt]);sr(()=>()=>{ce()},[ce]);let Nn=_n((ue,R)=>{Te(N=>({...N,[ue]:R}))},[]);sr(()=>{Te(ue=>({...ue,backgroundColor:o}))},[o]),sr(()=>{Pe()},[ze,Pe]);let hn=_n(ue=>{B(ue),U(new Set),xe(null)},[]),Ce=_n(ue=>{A(ue),Ae(!1);let R=Oa(ue);_(R>Li?R:null),j(!1),M?.(ue)},[M]),Ye=_n(ue=>{Ae(!0),T?.(ue)},[T]),at=_n(ue=>{if(xe(ue),!l)return;let R=b.current[ue];!R||!E.current||E.current.fitToBox(R,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5}).catch(()=>{})},[l]),Re=_n(ue=>{U(R=>{let N=new Set(R);return N.has(ue)?N.delete(ue):N.add(ue),N})},[]),Mt=_n(ue=>{!c||!Sc(ue.dataTransfer)||(ue.preventDefault(),ue.stopPropagation(),k.current+=1,jt(!0))},[c]),mt=_n(ue=>{!c||!Sc(ue.dataTransfer)||(ue.preventDefault(),ue.stopPropagation(),ue.dataTransfer.dropEffect="copy",jt(!0))},[c]),Tt=_n(ue=>{!c||!Sc(ue.dataTransfer)||(ue.preventDefault(),ue.stopPropagation(),k.current=Math.max(0,k.current-1),k.current===0&&jt(!1))},[c]),Rt=_n(ue=>{!c||!Sc(ue.dataTransfer)||(ue.preventDefault(),ue.stopPropagation(),k.current=0,jt(!1),dt(ue.dataTransfer.files))},[c,dt]),cr=d&&(Be||!!(ze&&!Ee&&(!I||!Fe)));return Qe("div",{className:"smv-root",style:{background:q.backgroundColor},onDragEnter:Mt,onDragOver:mt,onDragLeave:Tt,onDrop:Rt,children:[s&&ze&&K(Vk,{isOpen:re,onToggle:$,settings:q,onChange:Nn}),Qe("div",{className:"smv-canvasArea",children:[z!==null&&!F&&Qe("div",{className:"smv-largeModelBanner",children:[K(Ek,{size:14,className:"smv-largeModelBanner__icon"}),Qe("span",{children:["Very large model detected (",Math.round(z/1e6),"M triangles) \u2014 it may render and move slowly on this device, and click/hover selection on the model is disabled. Use the scene objects panel to select parts."]}),K("button",{type:"button",className:"smv-largeModelBanner__dismiss",onClick:()=>j(!0),"aria-label":"Dismiss",children:K(Fp,{size:12})})]}),c?Qe(v0,{children:[K("input",{ref:C,type:"file",accept:cl,className:"smv-upload-input",onChange:ue=>{dt(ue.target.files),ue.currentTarget.value=""}}),ze?K("div",{className:"smv-upload-toolbar",children:Qe(v0,{children:[K("span",{className:"smv-upload-toolbar__name",children:ne??"Uploaded model"}),Qe("button",{type:"button",className:"smv-upload-toolbar__button smv-upload-toolbar__button--ghost",onClick:He,children:[K(Rk,{size:14}),"Clear"]})]})}):null]}):null,ze?K(wk,{dpr:[1,2],frameloop:"demand",resize:{debounce:0,scroll:!1},raycaster:{firstHitOnly:!0},style:{background:q.backgroundColor},camera:{position:[0,0,5],fov:45,near:.1,far:1e3},children:Qe(Np,{fallback:null,children:[K("ambientLight",{intensity:q.ambientIntensity,color:q.ambientColor}),K("directionalLight",{position:[-4,5,7],intensity:q.directionalIntensity,color:q.directionalColor,castShadow:!0}),K("directionalLight",{position:[-5,5,5],intensity:.5}),K(Np,{fallback:null,children:K(vk,{preset:q.envPreset,background:q.backgroundEnabled})}),K(Ik,{exposure:q.exposure}),K(zk,{enabled:q.autoRotate,controlsRef:E}),K(Vp,{onLoadError:Ye,children:K(Np,{fallback:null,children:K(Dk,{url:ze,format:we?void 0:t,dracoDecoderPath:n,ktx2TranscoderPath:i,meshopt:r,hiddenKeys:G,selectedKey:oe,panelHoveredKey:le,nodeRefsOut:b,onMeshesReady:hn,onModelLoaded:Ce,onMeshClick:at,highlightOnHover:u})})},ze),K(Nk,{scene:I,controlsRef:E,refitOnResize:p,onInitialFitComplete:()=>At(!0)}),K(yk,{ref:E,makeDefault:!0,smoothTime:.3})]})}):K("div",{className:"smv-upload-empty-state",style:{background:q.backgroundColor},children:Qe("div",{className:"smv-upload-empty-state__card",children:[K("div",{className:"smv-upload-empty-state__icon",children:K(Ip,{size:24})}),Qe("p",{className:"smv-upload-empty-state__body",children:["Drag and drop ",K("code",{children:".glb"}),", ",K("code",{children:".gltf"}),","," ",K("code",{children:".obj"}),", ",K("code",{children:".fbx"}),", ",K("code",{children:".usdz"}),", or"," ",K("code",{children:".zip"})," here"]}),Qe("button",{type:"button",className:"smv-upload-empty-state__button",onClick:()=>C.current?.click(),children:[K(Ip,{size:15}),"Choose model"]})]})}),K(Qo,{visible:cr,message:Be?"Preparing model...":"Loading model..."}),c&&Le?K("div",{className:"smv-upload-drop-overlay",children:Qe("div",{className:"smv-upload-drop-overlay__card",children:[K(Ip,{size:20}),K("span",{children:"Release to load your model"})]})}):null]}),a&&ze&&K(Fk,{meshKeys:L,hiddenKeys:G,selectedKey:oe,isOpen:St,onToggle:Oe,onFocus:at,onHover:ge,onToggleVisibility:Re})]})}import{useCallback as M0,useState as Uk}from"react";function Gk(e=null){let[t,n]=Uk(e),i=M0(o=>{n(o)},[n]),r=M0(()=>{n(null)},[]);return{selectedObjectBinding:t,setSelectedObjectBinding:n,handleObjectSelect:i,clearSelection:r}}import{useMemo as Hk}from"react";function Wk(e,t){return Hk(()=>{if(!t)return null;let n=e[t];return n||(Object.values(e).find(i=>i.id===t||i.modelObjectId===t)??null)},[e,t])}import{useMemo as $k}from"react";function Xk(e){return $k(()=>Object.values(e).map(t=>t.modelObjectId),[e])}import{useCallback as pn,useMemo as T0,useState as qk}from"react";var P0={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 k0(e){if(e)return Object.fromEntries(Object.entries(e).map(([t,n])=>[t,n&&typeof n=="object"?{...n}:n]))}function Yk(e){return Object.fromEntries(Object.entries(e).filter(([,t])=>t.visible===!1).map(([t])=>[t,!0]))}function Kk(e){let[t,n]=qk(e),i=pn((E,b)=>{n(C=>b===void 0?Po(C,E):Po(C,E,b))},[]),r=pn((E,b)=>i(E,td(b)),[i]),o=pn((E,b)=>r(E,{baseColor:b}),[r]),a=pn((E,b,C="baseColor")=>{let x=P0[C],k=typeof b=="string"?{path:b}:b;i(E,{style:{material:{[x]:k}}})},[i]),s=pn((E,b="baseColor")=>{let C=P0[b];i(E,{style:{material:{[C]:void 0}}})},[i]),c=pn((E,b)=>{n(C=>{let x=bn(C,E);if(!x)return C;let k=k0(C[x]?.style?.material),I=Ei(C,b);if(I.length===0)return C;let A=C;for(let z of I){let _=C[z];_&&(A===C&&(A={...C}),A[z]={..._,style:{..._.style,material:k0(k)}})}return A})},[]),l=pn(E=>i(E,{style:{material:void 0}}),[i]),u=pn((E,b)=>i(E,{transform:b}),[i]),d=pn(E=>i(E,{transform:void 0}),[i]),p=pn((E,b)=>i(E,{metadata:b}),[i]),g=pn(E=>ed(t,E),[t]),f=pn(E=>Ei(t,E).map(b=>t[b]?.id??b),[t]),v=pn(E=>{let b=bn(t,E);return b?t[b]?.style?.material??null:null},[t]),P=pn(E=>i(E,{visible:!1}),[i]),y=pn(E=>i(E,{visible:!0}),[i]),h=pn(E=>{n(b=>{let C=Ei(b,E).reduce((x,k)=>{let I=b[k];return I&&x.push({ids:k,patch:{visible:I.visible===!1}}),x},[]);return Po(b,C)})},[n]),m=pn(()=>{n(E=>Po(E,Object.keys(E),{visible:!0}))},[n]),S=T0(()=>Yk(t),[t]),M=T0(()=>Object.keys(S).map(E=>t[E]?.id??E),[S,t]),T=pn(E=>{let b=bn(t,E);return b?t[b]?.visible===!1:!1},[t]);return{objectBindings:t,setObjectBindings:n,updateObjectBindings:i,setMaterial:r,setBaseColor:o,setTexture:a,clearTexture:s,copyMaterial:c,resetMaterial:l,getMaterial:v,setTransform:u,resetTransform:d,updateMetadata:p,selectObjectBindings:g,selectObjectBindingIds:f,hiddenObjects:S,hiddenObjectIds:M,hideObject:P,showObject:y,toggleObjectVisibility:h,isObjectHidden:T,clearHiddenObjects:m}}import{useCallback as lr,useMemo as Jk,useRef as Qk,useState as Zk}from"react";var e_={type:"point",color:"#ffffff",intensity:1,position:[0,0,0],distance:0,decay:2,attachedToCamera:!1,castShadow:!1,shadowBias:-5e-4,visible:!0};function t_(e){let t=Qk(null),[n,i]=Zk(()=>{let y=typeof e=="function"?e():e;return t.current=y,y}),r=lr(y=>{i(h=>{let m=typeof y=="function"?y(h):y;return nd(h,m)})},[]),o=lr(()=>{let y=t.current;y&&i(y)},[]),a=lr((y,h)=>{r(m=>({lighting:{lights:m.lighting.lights.map(S=>S.id===y?{...S,...h}:S)}}))},[r]),s=lr(y=>{r(h=>h.lighting.lights.some(m=>m.id===y.id)?{}:{lighting:{lights:[...h.lighting.lights,{...e_,...y}]}})},[r]),c=lr(y=>{r(h=>({lighting:{lights:h.lighting.lights.filter(m=>m.id!==y)}}))},[r]),l=lr((y,h)=>a(y,{intensity:h}),[a]),u=lr((y,h)=>a(y,{color:h}),[a]),d=lr(y=>a(y,{visible:!0}),[a]),p=lr(y=>a(y,{visible:!1}),[a]),g=lr(y=>{r(h=>({lighting:{lights:h.lighting.lights.map(m=>m.id===y?{...m,visible:!m.visible}:m)}}))},[r]),f=lr((y,h)=>a(y,{attachment:h,attachedToCamera:!1}),[a]),v=lr(y=>a(y,{attachment:void 0}),[a]),P=Jk(()=>({items:n.lighting.lights,get:y=>n.lighting.lights.find(h=>h.id===y),add:s,update:a,remove:c,setIntensity:l,setColor:u,show:d,hide:p,toggle:g,attach:f,detach:v}),[n.lighting.lights,s,a,c,l,u,d,p,g,f,v]);return{sceneConfig:n,setSceneConfig:i,updateSceneConfig:r,resetSceneConfig:o,lights:P}}import{useCallback as n_,useState as r_}from"react";function i_(){let[e,t]=r_(null),n=n_(i=>{t(i)},[t]);return{hoveredObjectBinding:e,handleHoveredObject:n}}import{useCallback as Up,useState as Ps}from"react";import{Box3 as o_,Vector3 as _0}from"three";function Mc(e){return[e.x,e.y,e.z]}function a_(){let[e,t]=Ps(!0),[n,i]=Ps(!1),[r,o]=Ps(null),[a,s]=Ps(null),[c,l]=Ps(0),u=Up(g=>{let f=new o_().setFromObject(g),v=f.min.clone(),P=f.max.clone(),y=new _0,h=new _0,m=0;g.traverse(S=>{"isMesh"in S&&S.isMesh&&(m+=1)}),f.getCenter(y),f.getSize(h),s({min:Mc(v),max:Mc(P),center:Mc(y),size:Mc(h)}),l(m),o(null),t(!1),i(!0)},[]),d=Up(g=>{o(g),s(null),l(0),t(!1),i(!1)},[]),p=Up(()=>{t(!0),i(!1),o(null),s(null),l(0)},[]);return{isLoading:e,isReady:n,error:r,bounds:a,objectCount:c,handleModelLoaded:u,handleLoadError:d,resetModelState:p}}import{useCallback as Gp}from"react";function s_({bindings:e,scene:t,camera:n,animations:i,onAction:r}){let{objectBindings:o,updateObjectBindings:a,showObject:s,hideObject:c,toggleObjectVisibility:l}=e,u=t?.updateSceneConfig,d=n?.focusObject,p=n?.fitScene,g=n?.resetView,f=n?.setCameraTarget,v=n?.setCameraState,P=i?.play,y=i?.pause,h=i?.stop,m=i?.setSpeed,S=i?.seek,M=Gp(b=>{let C=bn(o,b);return C?o[C]?.actions??[]:[]},[o]),T=Gp(async b=>{for(let C of b.action.effects??[]){if("objectBindings"in C){a(C.target,C.objectBindings);continue}if("sceneConfig"in C){u?.(C.sceneConfig);continue}if("visibility"in C){C.visibility==="show"?s(C.target):C.visibility==="hide"?c(C.target):l(C.target);continue}if("camera"in C){let k=C.camera;k.type==="focus-object"?await d?.(k.objectId??b.objectId):k.type==="fit-scene"?await p?.():k.type==="reset"?await g?.():k.type==="set-target"?await f?.(k.target,k.transition??!0):await v?.(k.state,k.transition??!0);continue}let x=C.animation;x.type==="play"?P?.(x.clip):x.type==="pause"?y?.():x.type==="stop"?h?.():x.type==="set-speed"?m?.(x.speed):S?.(x.time)}await r?.(b)},[p,d,c,r,y,P,g,S,m,v,f,s,h,l,a,u]),E=Gp(async(b,C)=>{let x=bn(o,b);if(!x)return null;let k=o[x],I=k?.actions?.find(z=>z.id===C);if(!k||!I)return null;let A={objectId:x,action:I,binding:k};return await T(A),A},[T,o]);return{getActionsForObject:M,handleAction:T,runAction:E}}import{useCallback as Tc,useRef as A0}from"react";function l_(e){return typeof e=="function"?e:e?.handleViewerReady??null}function c_(...e){let t=A0(null),n=A0(e);n.current=e;let i=Tc(s=>{t.current=s;let c=new Set;for(let l of n.current){let u=l_(l);u&&!c.has(u)&&(c.add(u),u(s))}},[]),r=Tc(()=>t.current,[]),o=Tc(s=>{let c=t.current;return c?c.captureImage(s):Promise.reject(new Error("ModelViewer is not ready yet."))},[]),a=Tc(()=>{let s=t.current;return s?(s.invalidate(),!0):!1},[]);return{handleViewerReady:i,getViewer:r,captureImage:o,invalidate:a}}import{useCallback as It,useEffect as d_,useRef as Br}from"react";import{Material as u_,PointLight as p_,Vector3 as h_}from"three";var $p=["emissiveIntensity","opacity","metalness","roughness","transmission","clearcoat","clearcoatRoughness","ior","thickness"],Pc=1;function kc(e){return typeof e=="string"?[e]:e}function _c(e,t=0,n=1){return Math.min(n,Math.max(t,e))}function Hp(e,t){return e+Math.random()*(t-e)}function R0([e,t],n){return e+(t-e)*n}function Wp([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 E0(e,t){let n=_c(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 m_(e){let t=e.material;return t?(Array.isArray(t)?t:[t]).filter(n=>n instanceof u_):[]}function g_(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 $p){let i=e[n];typeof i=="number"&&(t[n]=i)}return t}function L0(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 $p){let i=t[n];i!==void 0&&typeof e[n]=="number"&&(e[n]=i)}t.transparent!==void 0&&(e.transparent=t.transparent),e.needsUpdate=!0}function f_(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 b_(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 x_(e={}){let t=Br(e);t.current=e;let n=Br(null),i=Br(null),r=Br(null),o=Br(new Map),a=Br(new Map),s=Br(new Map),c=Br(new Map),l=It(L=>{let B=n.current;if(!B)return null;let G=bn(B.objectBindings,L);return B.nodeRefs[L]??(G?B.nodeRefs[G]:null)??(B.scene?gr(B.scene,L):null)??null},[]),u=It(L=>{let B=n.current;return B?typeof L=="object"&&!Array.isArray(L)?Ei(B.objectBindings,L):kc(L).map(G=>bn(B.objectBindings,G)??G):typeof L=="string"?[L]:Array.isArray(L)?L:[]},[]),d=It(()=>{n.current?.invalidate()},[]),p=It((L,B)=>{let G=!1;for(let U of u(L)){let oe=l(U);if(oe)for(let xe of m_(oe))s.current.has(xe)||s.current.set(xe,g_(xe)),L0(xe,B),G=!0}return G},[l,u]),g=It((L,B)=>{let G=p(L,B);return G&&d(),G},[d,p]),f=It((L,B)=>{let G=!1;for(let U of u(L)){let oe=l(U);oe&&(c.current.has(oe)||c.current.set(oe,f_(oe)),b_(oe,B),G=!0)}return G},[l,u]),v=It((L,B)=>{let G=f(L,B);return G&&d(),G},[d,f]),P=It(L=>{let B=l(L);if(!B)return null;B.updateWorldMatrix(!0,!1);let G=B.getWorldPosition(new h_);return[G.x,G.y,G.z]},[l]),y=It(L=>{let B=a.current.get(L);return B?(B.light.removeFromParent(),B.light.dispose(),a.current.delete(L),d(),!0):!1},[d]),h=It(L=>{let B=l(L.target);if(!B)return!1;let G=a.current.get(L.id),U=G?.light??new p_;return G&&G.target!==L.target&&U.removeFromParent(),U.name=`react-immersive-runtime-light:${L.id}`,U.color.set(L.color??"#ffffff"),U.intensity=L.intensity??1,U.distance=L.distance??0,U.decay=L.decay??2,U.castShadow=L.castShadow??!1,U.position.set(...L.offset??[0,0,0]),U.parent!==B&&B.add(U),a.current.set(L.id,{light:U,target:L.target}),d(),!0},[d,l]),m=It((L,B)=>{let G=a.current.get(L);if(!G)return!1;if(B.target&&B.target!==G.target){let U=l(B.target);if(!U)return!1;G.light.removeFromParent(),U.add(G.light),G.target=B.target}return B.color!==void 0&&G.light.color.set(B.color),B.intensity!==void 0&&(G.light.intensity=B.intensity),B.distance!==void 0&&(G.light.distance=B.distance),B.decay!==void 0&&(G.light.decay=B.decay),B.offset!==void 0&&G.light.position.set(...B.offset),B.castShadow!==void 0&&(G.light.castShadow=B.castShadow),d(),!0},[d,l]),S=It((L,B)=>{let G=U=>B[U%B.length]??0;for(let U of L.materials??[])u(U.targets).forEach((oe,xe)=>{let le=G(xe),ge={};for(let we of $p){let Me=U.values[we];Me&&(ge[we]=R0(Me,le))}p(oe,ge)});for(let U of L.transforms??[])u(U.targets).forEach((oe,xe)=>{let le=G(xe),ge={};U.values.position&&(ge.position=Wp(U.values.position,le)),U.values.rotation&&(ge.rotation=Wp(U.values.rotation,le)),U.values.scale&&(ge.scale=Wp(U.values.scale,le)),f(oe,ge)});for(let U of L.lights??[])kc(U.lights).forEach((oe,xe)=>{let le=a.current.get(oe);le&&(le.light.intensity=R0(U.intensity,G(xe)))})},[u,p,f]),M=Br(()=>{}),T=Br(()=>{});T.current=L=>{r.current=null;let B=!1;for(let[G,U]of o.current){U.startedAt===null&&(U.startedAt=L);let oe=U.lastFrameAt??L;U.lastFrameAt=L;let xe=U.override&&U.override.until>L?U.override.level:null;U.override&&xe===null&&(U.override=null);let le=U.update(L,L-U.startedAt,Math.min(100,L-oe),xe);B=!0,le||(o.current.delete(G),U.onComplete?.())}B&&d(),o.current.size>0&&M.current()},M.current=()=>{r.current!==null||typeof requestAnimationFrame>"u"||(r.current=requestAnimationFrame(L=>T.current(L)))};let E=It(L=>(o.current.set(L.id,L),M.current(),L.id),[]),b=It((L,B={})=>{let G=B.id??`transition-${Pc++}`,U=Math.max(1,B.duration??400),oe=B.easing??"ease-in-out";return E({id:G,startedAt:null,lastFrameAt:null,override:null,onComplete:B.onComplete,update:(xe,le,ge,we)=>{let Me=we??E0(le/U,oe);return S(L,[Me]),le<U}})},[S,E]),C=It((L,B={})=>{let G=B.id??`pulse-${Pc++}`,U=Math.max(1,B.duration??1e3),oe=B.minLevel??0,xe=B.maxLevel??1,le=B.repeat??1/0,ge=B.synchronized??!0,we=Math.max(1,...[...L.materials??[],...L.transforms??[]].map(Me=>u(Me.targets).length),...(L.lights??[]).map(Me=>kc(Me.lights).length));return E({id:G,startedAt:null,lastFrameAt:null,override:null,onComplete:B.onComplete,update:(Me,ne,pt,Ee)=>{let Ae=ne/U,Be=Array.from({length:ge?1:we},(Ve,Fe)=>{if(Ee!==null)return Ee;let At=Ae+(ge?0:Fe/we),Le=.5-Math.cos(At%1*Math.PI*2)/2;return oe+(xe-oe)*Le});return S(L,Be),le===1/0||Ae<le}})},[S,E,u]),x=It((L,B={})=>{let G=B.id??`timeline-${Pc++}`,U=B.repeat??1,oe=L.map(le=>({...le,duration:Math.max(1,le.duration),hold:Math.max(0,le.hold??0)})),xe=Math.max(1,oe.reduce((le,ge)=>le+ge.duration+ge.hold,0));return E({id:G,startedAt:null,lastFrameAt:null,override:null,onComplete:B.onComplete,update:(le,ge,we,Me)=>{if(oe.length===0||U<=0)return!1;let ne=ge/xe;if(U!==1/0&&ne>=U){for(let Ae of oe)S(Ae.channels,[1]);return!1}let pt=ge%xe,Ee=0;for(let Ae of oe){let Be=Ee+Ae.duration,Ve=Be+Ae.hold;if(pt>=Be){S(Ae.channels,[Me??1]),Ee=Ve;continue}if(pt>=Ee){let Fe=Me??E0((pt-Ee)/Ae.duration,Ae.easing??"ease-in-out");S(Ae.channels,[Fe]);break}}return!0}})},[S,E]),k=It((L,B={})=>{let G=B.id??`flicker-${Pc++}`,U=B.synchronized??!0,oe=B.minLevel??.15,xe=B.maxLevel??1,le=B.interval??[45,160],ge=typeof le=="number"?[le,le]:le,we=[Math.max(1,Math.min(...ge)),Math.max(1,Math.max(...ge))],Me=_c(B.response??.7,.01,1),ne=_c(B.blackoutChance??.08),pt=_c(B.flashChance??.12),Ee=B.flashLevel??1.15,Ae=Math.max(1,...[...L.materials??[],...L.transforms??[]].map(Le=>u(Le.targets).length),...(L.lights??[]).map(Le=>kc(Le.lights).length)),Be=U?1:Ae,Ve=Array.from({length:Be},()=>oe),Fe=Array.from({length:Be},()=>oe),At=Array.from({length:Be},()=>0);return E({id:G,startedAt:null,lastFrameAt:null,override:null,onComplete:B.onComplete,update:(Le,jt,St,Oe)=>{for(let re=0;re<Be;re+=1){if(Oe!==null)Fe[re]=Oe;else if(Le>=At[re]){let q=Math.random();Fe[re]=q<ne?Hp(0,Math.min(.04,oe)):q<ne+pt?Ee:Hp(oe,xe),At[re]=Le+Hp(...we)}let $=1-Math.pow(1-Me,Math.max(1,St)/16.67);Ve[re]+=(Fe[re]-Ve[re])*$}return S(L,Ve),B.duration===void 0||jt<B.duration}})},[S,E,u]),I=It((L,B,G)=>{let U=o.current.get(L);if(!U)return!1;let oe=typeof performance>"u"?Date.now():performance.now();return U.override={level:B,until:oe+Math.max(0,G)},M.current(),!0},[]),A=It(L=>o.current.delete(L),[]),z=It(()=>{o.current.clear(),r.current!==null&&typeof cancelAnimationFrame<"u"&&(cancelAnimationFrame(r.current),r.current=null)},[]),_=It(()=>{for(let[L,B]of s.current)L0(L,B);s.current.clear();for(let[L,B]of c.current)L.position.set(...B.position),L.rotation.set(...B.rotation),L.scale.set(...B.scale),L.visible=B.visible,L.updateMatrix(),L.updateMatrixWorld(!0);c.current.clear();for(let L of a.current.values())L.light.removeFromParent(),L.light.dispose();a.current.clear(),d()},[d]),F=It(()=>{z(),_()},[_,z]),j=It(L=>{i.current&&i.current!==L.scene&&_(),n.current=L,i.current=L.scene,t.current.onViewerReady?.(L)},[_]);return d_(()=>()=>{F(),n.current=null,i.current=null},[F]),{handleViewerReady:j,setMaterial:g,setTransform:v,getWorldPosition:P,addPointLight:h,updatePointLight:m,removePointLight:y,transition:b,timeline:x,pulse:C,flicker:k,overrideEffect:I,stopEffect:A,stopAllEffects:z,resetRuntime:F}}import{useCallback as ha,useEffect as Xp,useRef as vi,useState as y_}from"react";function D0(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function ks(e){return typeof e=="number"&&Number.isFinite(e)}function B0(e){return Array.isArray(e)&&e.length===3&&e.every(ks)}function v_(e){return!D0(e)||!B0(e.position)||!B0(e.target)||e.fov!==null&&!ks(e.fov)||!ks(e.zoom)||e.zoom<=0||e.azimuthAngle!==void 0&&!ks(e.azimuthAngle)||e.polarAngle!==void 0&&!ks(e.polarAngle)?null:{position:e.position,target:e.target,fov:e.fov,zoom:e.zoom,azimuthAngle:e.azimuthAngle,polarAngle:e.polarAngle}}function w_(e){if(!D0(e))return null;let t;if(e.camera!==void 0){let r=v_(e.camera);if(!r)return null;t=r}let n;if(e.hidden!==void 0){if(!Array.isArray(e.hidden)||!e.hidden.every(r=>typeof r=="string"))return null;n=e.hidden}let i;if(e.selected===null||typeof e.selected=="string")i=e.selected;else if(e.selected!==void 0)return null;return{camera:t,hidden:n,selected:i}}function O0(e,t,n){let i=Object.values(t).filter(r=>r.visible===!1).map(r=>r.id);return{camera:e??void 0,hidden:i,selected:n?.id??null}}function C_({cameraState:e,setCameraState:t,objectBindings:n,onObjectBindingsChange:i,selectedObjectBinding:r,setSelectedObjectBinding:o,paramKey:a="view",debounceMs:s=400,autoSync:c=!0}){let l=vi(null),u=vi(null),d=vi(null),p=vi(null),g=vi(null),f=ha(()=>{g.current!==null&&(window.clearTimeout(g.current),g.current=null),d.current=null,p.current=null},[]),v=ha(()=>{let C=O0(e,n,r);return`${a}=${encodeURIComponent(JSON.stringify(C))}`},[e,n,r,a]),P=ha(()=>{let C=new URL(window.location.href);return C.hash=v(),C.toString()},[v]),y=ha(C=>{let x=new URL(window.location.href);x.hash=C,window.history.replaceState(null,"",x.toString()),u.current=C,l.current=new URLSearchParams(x.hash.slice(1)).get(a)},[a]),h=ha(()=>{f(),y(v())},[v,f,y]),m=vi({cameraState:e,objectBindings:n,selectedObjectBinding:r});m.current={cameraState:e,objectBindings:n,selectedObjectBinding:r};let[S,M]=y_(!1);Xp(()=>{if(!c||!S){f();return}let C=m.current,x=O0(C.cameraState,C.objectBindings,C.selectedObjectBinding),k=`${a}=${encodeURIComponent(JSON.stringify(x))}`;if(k===u.current){f();return}k===d.current&&s===p.current||(f(),d.current=k,p.current=s,g.current=window.setTimeout(()=>{g.current=null,d.current=null,p.current=null,y(k)},Math.max(0,s)))},[c,e,f,s,n,a,S,r,y]),Xp(()=>f,[f]);let T=vi(null),E=vi(null),b=ha(async()=>{M(!0);let C=window.location.hash.startsWith("#")?window.location.hash.slice(1):window.location.hash,x=new URLSearchParams(C).get(a);if(!x)return T.current=null,!1;if(x===l.current||x===T.current||x===E.current)return!1;let k;try{k=JSON.parse(x)}catch{return!1}let I=w_(k);if(!I)return!1;E.current=x;try{if(I.camera&&await t(I.camera,!1),I.hidden){let A=new Set(I.hidden);i(Object.fromEntries(Object.entries(n).map(([z,_])=>[z,{..._,visible:!A.has(_.id)}])))}if(I.selected!==void 0){let A=I.selected?bn(n,I.selected):null;o(A?n[A]:null)}return T.current=x,!0}finally{E.current===x&&(E.current=null)}},[n,i,a,t,o]);return Xp(()=>{let C=()=>{b().catch(()=>{})};return window.addEventListener("hashchange",C),()=>{window.removeEventListener("hashchange",C)}},[b]),{getShareUrl:P,syncUrl:h,restoreFromUrl:b}}export{g0 as BindingBuilder,Ri as DEFAULT_SCENE_CONFIG,Zc as MATERIAL_BLENDING_MODES,Qc as MATERIAL_SIDES,mc as ModelViewer,S0 as SimpleModelViewer,Ty as defineObjectBindings,td as material,Po as patchBindings,nd as patchSceneConfig,Ei as selectBindingKeys,ed as selectBindings,Wk as useObjectBinding,Xk as useObjectBindingIds,Kk as useObjectBindings,t_ as useSceneConfig,C_ as useShareableViewerState,s_ as useViewerActions,lp as useViewerAnimations,sp as useViewerCamera,c_ as useViewerConnection,x_ as useViewerEffects,i_ as useViewerHover,a_ as useViewerModel,Gk as useViewerSelection};
|