@liveroom-tech/react-immersive 5.1.0 → 5.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +10 -6
- package/README.md +106 -3427
- package/dist/binding-builder.css +1 -1
- package/dist/binding-builder.js +64 -13
- package/dist/binding-builder.mjs +1 -1
- package/dist/chunk-4FDMYUGT.mjs +3 -0
- package/dist/chunk-CV4E7DOO.mjs +79 -0
- package/dist/chunk-F4WT3HEK.mjs +1 -0
- package/dist/chunk-FPJZDEON.mjs +1 -0
- package/dist/chunk-JHKMRMJH.mjs +1 -0
- package/dist/chunk-TW2M4UXT.mjs +1 -0
- package/dist/chunk-W24UP6NM.mjs +1 -0
- package/dist/hosted.css +1 -1
- package/dist/hosted.d.mts +8 -5
- package/dist/hosted.d.ts +8 -5
- package/dist/hosted.js +63 -12
- package/dist/hosted.mjs +1 -1
- package/dist/index.css +1 -1
- package/dist/index.d.mts +48 -9
- package/dist/index.d.ts +48 -9
- package/dist/index.js +62 -11
- package/dist/index.mjs +1 -1
- package/dist/materialVariants-DjTuiWmN.d.mts +314 -0
- package/dist/materialVariants-DjTuiWmN.d.ts +314 -0
- package/dist/modelInfo-BQ5UZu95.d.ts +43 -0
- package/dist/modelInfo-CcYpydB7.d.mts +43 -0
- package/dist/{ModelViewer-Bj-KjiDL.d.mts → modelViewerProps-BalkRDni.d.ts} +133 -12
- package/dist/{ModelViewer-BkQ73y6N.d.ts → modelViewerProps-DdsJDRB7.d.mts} +133 -12
- package/dist/{objectCatalog-BIeXURoq.d.ts → rendererBackend-C_Jb4_Jy.d.mts} +47 -5
- package/dist/{objectCatalog-BIeXURoq.d.mts → rendererBackend-C_Jb4_Jy.d.ts} +47 -5
- package/dist/simple-model-viewer.css +1 -1
- package/dist/simple-model-viewer.d.mts +32 -4
- package/dist/simple-model-viewer.d.ts +32 -4
- package/dist/simple-model-viewer.js +3 -3
- package/dist/simple-model-viewer.mjs +1 -1
- package/dist/utils.d.mts +5 -4
- package/dist/utils.d.ts +5 -4
- package/dist/utils.js +1 -1
- package/dist/utils.mjs +1 -1
- package/package.json +3 -1
- package/dist/chunk-32WCLPTZ.mjs +0 -1
- package/dist/chunk-CSGNL4XU.mjs +0 -3
- package/dist/chunk-F2ILTIPG.mjs +0 -28
- package/dist/chunk-SEESCGUS.mjs +0 -1
- package/dist/chunk-V6GALFL5.mjs +0 -1
- package/dist/chunk-WN6GMMHF.mjs +0 -1
- package/dist/modelInfo-DnkmTGMd.d.mts +0 -23
- package/dist/modelInfo-DnkmTGMd.d.ts +0 -23
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import{A as zn,B as tl,C as oo,D as og,E as tn,F as ag,G as sg,H as hg,I as mg,J as fa,K as rl,L as nl,M as il,N as ol,O as xg,P as vg,Q as Cg,R as Tg,a as Of,b as me,c as od,d as If,e as Bf,f as Js,g as da,h as no,i as jf,j as zf,k as Nf,l as Vf,m as Ff,n as Uf,o as Gf,p as Hf,q as Wf,r as Xf,s as qf,t as ad,u as $f,w as Yf,y as Kf,z as ur}from"./chunk-F4WT3HEK.mjs";import{A as wg,B as Mg,C as Sg,H as _g,I as Pg,J as Eg,d as sd,g as io,h as lg,o as cg,p as ha,q as ug,r as ao,s as ma,t as dg,u as pg,v as Nn}from"./chunk-W24UP6NM.mjs";import{A as yg,B as ld,b as Lf,d as Qf,g as Et,h as jn,i as Zs,j as Tr,k as tt,l as Jf,m as Zf,n as eg,o as tg,p as rg,q as pa,r as el,s as ng,t as ig,u as fg,v as gg,w as bg,x as so}from"./chunk-JHKMRMJH.mjs";import{a as id}from"./chunk-JR557W27.mjs";var Ag={showObjectBindingDataPanel:!1,showSceneObjectsPanel:!1,showDownloadButton:!1,showResetButton:!1,showAnnotationNavigation:!1,showMaterialVariants:!1},bS=Object.freeze({minimal:Object.freeze({...Ag}),showcase:Object.freeze({...Ag,autoRotate:!0}),configurator:Object.freeze({showObjectBindingDataPanel:!0,showSceneObjectsPanel:!1,showDownloadButton:!1,showResetButton:!0,showMaterialVariants:!0}),inspector:Object.freeze({showObjectBindingDataPanel:!0,showSceneObjectsPanel:!0,showDownloadButton:!0,showResetButton:!0,showViewGizmo:!0,showMeasureTools:!0,showUvCheckerButton:!0,showExplodeControls:!0,showSectionTools:!0,showIsolateControls:!0,enableKeyboardNavigation:!0})}),yS=["preset","ui","tools","controls","perf","tiles","xr","decoders"];function Rg(e){let t={};for(let r of Object.keys(e))e[r]!==void 0&&(t[r]=e[r]);return t}function xS({ui:e,tools:t,controls:r,perf:n,tiles:i,xr:o,decoders:a}){let s=e?.download,l=e?.mouseController,u=t?.measure,d=r?.autoRotate;return{showObjectBindingDataPanel:e?.objectPanel,showSceneObjectsPanel:e?.sceneObjects,showDownloadButton:s===void 0?void 0:s!==!1,downloadFilename:typeof s=="string"?s:void 0,showResetButton:e?.reset,showFullscreenButton:e?.fullscreen,showLoadingOverlay:e?.loadingOverlay,showViewGizmo:e?.viewGizmo,showMouseController:l===void 0?void 0:l!==!1,mouseControllerPosition:typeof l=="object"?l.position:void 0,mouseControllerOpacity:typeof l=="object"?l.opacity:void 0,showAnnotationNavigation:e?.annotationNavigation,showAnnotationOnHover:e?.annotationOnHover,showAnnotationFilters:e?.annotationFilters,highlightOnHover:e?.highlightOnHover,showMaterialVariants:e?.materialVariants,showObjectNavigator:e?.objectNavigator,showMeasureTools:u===void 0?void 0:u!==!1,measurementUnit:typeof u=="object"?u.unit:void 0,showUvCheckerButton:t?.uvChecker,showExplodeControls:t?.explode,showSectionTools:t?.section,showIsolateControls:t?.isolate,texturePositioning:t?.texturePositioning,enableCameraControls:r?.enabled,enableKeyboardNavigation:r?.keyboard,reducedMotion:r?.reducedMotion,disableZoom:r?.zoom===void 0?void 0:!r.zoom,zoomOnSelected:r?.zoomOnSelect,autoRotate:d===void 0?void 0:d!==!1,autoRotateSpeed:typeof d=="number"?d:void 0,refitOnResize:r?.refitOnResize,cameraLimits:r?.limits,moveSensitivity:r?.moveSensitivity,zoomSensitivity:r?.zoomSensitivity,renderMode:n?.renderMode,maxDpr:n?.maxDpr,performanceProfile:n?.profile,preserveDrawingBuffer:n?.preserveDrawingBuffer,webgpu:n?.webgpu,tilesetUrl:i?.url,tilesErrorTarget:i?.errorTarget,tilesCacheSize:i?.cacheSize,enableXR:o?.enabled,usdzUrl:o?.usdzUrl,arScaleMode:o?.scaleMode,mobileHandoffUrl:o?.mobileHandoffUrl,dracoDecoderPath:a?.draco,ktx2TranscoderPath:a?.ktx2,meshopt:a?.meshopt}}function kg(e){let t={...e};for(let r of yS)delete t[r];return{...e.preset?bS[e.preset]:void 0,...Rg(t),...Rg(xS(e))}}import{useCallback as $t,useRef as po,useState as Vg}from"react";import{Vector3 as Fg}from"three";var cd=new WeakSet;function lo(e){cd.add(e)}function Dg(e){let t=cd.has(e);return t&&cd.delete(e),t}var ud=new WeakSet;function Lg(e,t){t?ud.add(e):ud.delete(e)}function co(e,t){return ud.has(e)?0:t}import{Box3 as jg,Matrix4 as vS,PerspectiveCamera as zg,Vector3 as hd}from"three";import{Vector3 as Og}from"three";function dd(e){if(!e?.trim()||/[\u0000-\u001f\u007f]/.test(e))return null;try{let t=new URL(e.trim(),"https://annotation.invalid/");return t.protocol==="https:"||t.protocol==="http:"?e.trim():null}catch{return null}}function pd(e){return e.category?.trim()??""}function Ig(e,t){if(t===null)return e;let r=new Set(t.map(n=>n.trim()));return e.filter(n=>r.has(pd(n)))}function Bg(e,t){let r=Number.isFinite(e.minDistance)?Math.max(0,e.minDistance):0,n=Number.isFinite(e.maxDistance)?Math.max(0,e.maxDistance):1/0;return t>=r&&t<=n}function al(e){return!!e&&[e.position,e.target].every(t=>Array.isArray(t)&&t.length===3&&t.every(Number.isFinite))}function uo(e){let t=e.camera;return{position:e.getPosition(new Og,!1).toArray(),target:e.getTarget(new Og,!1).toArray(),azimuthAngle:e.azimuthAngle,polarAngle:e.polarAngle,fov:"fov"in t?Number(t.fov):null,zoom:t.zoom}}function ga(e,t){al(t)&&(e.setLookAt(...t.position,...t.target,!0),Number.isFinite(t.azimuthAngle)&&Number.isFinite(t.polarAngle)&&e.rotateTo(t.azimuthAngle,t.polarAngle,!0),xi(e,t))}function xi(e,t){let r=!1;t.fov!=null&&Number.isFinite(t.fov)&&t.fov>0&&t.fov<180&&"fov"in e.camera&&(e.camera.fov=t.fov,e.camera.updateProjectionMatrix(),r=!0),t.zoom!=null&&Number.isFinite(t.zoom)&&t.zoom>0&&e.zoomTo(t.zoom,!0),r&&e.dispatchEvent({type:"update"})}function Ng(e,t){let r=uo(e);if(!(e.camera instanceof zg)||!t)return r;let n=t instanceof jg?t:new jg().setFromObject(t);return n.isEmpty()||(r.framing={aspect:e.camera.aspect,min:n.min.toArray(),max:n.max.toArray()}),r}function sl(e,t){let r=t.camera,n=e.framing;if(!(r instanceof zg)||!n||!(r.aspect>0)||Math.abs(r.aspect-n.aspect)<1e-6)return[...e.position];let i=new hd(...e.position),o=new hd(...e.target),a=i.clone().sub(o).normalize(),s=new vS().lookAt(i,o,r.up).invert(),l=Math.tan((e.fov??r.fov)*Math.PI/360)/(e.zoom??r.zoom);if(!(l>0)||!Number.isFinite(l))return[...e.position];let u=0;for(let d of[n.min[0],n.max[0]])for(let p of[n.min[1],n.max[1]])for(let c of[n.min[2],n.max[2]]){let h=new hd(d,p,c).sub(i).applyMatrix4(s);u=Math.max(u,Math.abs(h.x)/(l*r.aspect)+h.z,Math.abs(h.y)/l+h.z)}return i.addScaledVector(a,u*1.02).toArray()}function Ug(e){return[e.x,e.y,e.z]}function rn(e,t){let r=new Fg,n=new Fg;return t.getPosition(r),t.getTarget(n),{position:Ug(r),target:Ug(n),fov:"fov"in e&&typeof e.fov=="number"?e.fov:null,zoom:"zoom"in e&&typeof e.zoom=="number"?e.zoom:1,azimuthAngle:t.azimuthAngle,polarAngle:t.polarAngle}}function wS(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 ba(e,t,r=.6){let n=e.smoothTime;e.smoothTime=co(e,r);try{return await t()}finally{e.smoothTime=n}}function oL(e={}){let t=po(e);t.current=e;let r=po(null),[n,i]=Vg(null),[o,a]=Vg(()=>({...e.presets})),s=po(o);s.current=o;let l=$t(_=>{i(S=>wS(S,_)?S:_)},[]),u=$t(_=>{l(_)},[l]),d=po(null),p=po(null),c=po(null),h=$t(_=>{r.current=_;let S=rn(_.raw.controls.camera,_.raw.controls);l(S),_.raw.scene!==p.current&&(p.current=_.raw.scene,d.current=null,c.current=null),_.homeCameraState&&!d.current&&(d.current=_.homeCameraState);let{initialPosition:C,initialTarget:R,initialTransition:A=!1}=t.current;if((C||R)&&_.raw.scene&&(C||_.homeCameraState)&&c.current!==_.raw.controls){c.current=_.raw.controls,_.homeCameraState||lo(_.raw.controls);let B=C??S.position,N=R??S.target;_.raw.controls.setLookAt(B[0],B[1],B[2],N[0],N[1],N[2],A).then(()=>{if(r.current?.raw.controls!==_.raw.controls)return;let D=rn(_.raw.controls.camera,_.raw.controls);d.current={position:D.position,target:D.target},l(D)}).catch(()=>{})}},[l]),m=$t(async()=>{let _=r.current,S=_?.raw.controls;if(!S)return!1;try{let C=d.current;if(C){xi(S,C);let R=sl(C,S);await ba(S,()=>S.setLookAt(R[0],R[1],R[2],C.target[0],C.target[1],C.target[2],!0))}else _?.raw.scene?await ba(S,()=>S.fitToBox(_.raw.scene,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5})):await ba(S,()=>S.reset(!0));return!0}catch{return!1}},[]),g=$t(async()=>{let _=r.current;if(!_?.raw.controls||!_.raw.scene)return!1;try{return await ba(_.raw.controls,()=>_.raw.controls.fitToBox(_.raw.scene,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5})),!0}catch{return!1}},[]),f=$t(async _=>{let S=r.current;if(!S?.raw.controls)return!1;let C=io(S.objectBindings,_);if(!C)return!1;let R=S.raw.nodes[C];if(!R)return!1;try{return await ba(S.raw.controls,()=>S.raw.controls.fitToBox(R,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5})),!0}catch{return!1}},[]),b=$t(async(_,S=!0)=>{let C=r.current?.raw.controls;if(!C)return!1;try{return r.current?.homeCameraState||lo(C),await C.setTarget(_[0],_[1],_[2],S),l(rn(C.camera,C)),!0}catch{return!1}},[l]),w=$t(async(_,S=!0)=>{let C=r.current?.raw.controls;if(!C)return!1;try{r.current?.homeCameraState||lo(C);let R=[C.setLookAt(_.position[0],_.position[1],_.position[2],_.target[0],_.target[1],_.target[2],S)];_.azimuthAngle!=null&&_.polarAngle!=null&&R.push(C.rotateTo(_.azimuthAngle,_.polarAngle,S)),await Promise.all(R);let A=C.camera,B=!1;return _.fov!=null&&"fov"in A&&typeof A.fov=="number"&&(A.fov=_.fov,B=!0),_.zoom!=null&&"zoom"in A&&typeof A.zoom=="number"&&(A.zoom=_.zoom,B=!0),B&&"updateProjectionMatrix"in A&&A.updateProjectionMatrix(),l(rn(A,C)),!0}catch{return!1}},[l]),y=$t((_,S=!0)=>w(_,S),[w]),M=$t((_,S,C=!0)=>w({position:_,target:S},C),[w]),E=$t(async(_,S,C=!0)=>{let R=r.current?.raw.controls;if(!R)return!1;try{return r.current?.homeCameraState||lo(R),await R.rotateTo(_*Math.PI/180,S*Math.PI/180,C),l(rn(R.camera,R)),!0}catch{return!1}},[l]),v=$t(async(_,S=!0)=>{let C=r.current?.raw.controls;if(!C)return!1;try{return r.current?.homeCameraState||lo(C),await C.dollyTo(_,S),l(rn(C.camera,C)),!0}catch{return!1}},[l]),P=$t(_=>{let S=r.current?.raw.controls,C=_.trim();if(!S||!C)return null;let R=rn(S.camera,S);return s.current={...s.current,[C]:R},a(A=>({...A,[C]:R})),l(R),R},[l]),T=$t((_,S=!0)=>{let C=s.current[_];return C?w(C,S):Promise.resolve(!1)},[w]);return{cameraState:n,cameraPresets:o,resetView:m,focusObject:f,fitScene:g,setCameraTarget:b,setCameraState:y,lookAt:M,orbitTo:E,dollyTo:v,savePreset:P,goToPreset:T,handleCameraChange:u,handleViewerReady:h}}import{useCallback as Vn,useEffect as MS,useRef as Gg,useState as md}from"react";var fd={currentClip:null,isPlaying:!1,speed:1,time:0,duration:0,active:[]};function lL(){let e=Gg(null),t=Gg(null),[r,n]=md([]),[i,o]=md([]),[a,s]=md(fd);MS(()=>()=>{t.current?.()},[]);let l=Vn(f=>{t.current?.(),e.current=f,n(f.clips),o(f.clipDetails??f.clips.map(b=>({sourceName:b,duration:0}))),s(f.getState?.()??fd),t.current=f.subscribe?.(s)??null},[]),u=Vn(()=>{t.current?.(),t.current=null,e.current=null,n([]),o([]),s(fd)},[]),d=Vn(f=>{let b=e.current;b&&(f(b),!b.subscribe&&b.getState&&s(b.getState()))},[]),p=Vn((f,b)=>d(w=>w.play(f,b)),[d]),c=Vn(f=>d(b=>b.pause(f)),[d]),h=Vn(f=>d(b=>b.stop(f)),[d]),m=Vn((f,b)=>d(w=>w.setSpeed(f,b)),[d]),g=Vn((f,b)=>d(w=>w.seek?.(f,b)),[d]);return{clips:r,clipDetails:i,...a,play:p,pause:c,stop:h,setSpeed:m,seek:g,handleAnimationsReady:l,clearAnimations:u}}import{AlertTriangle as SS}from"lucide-react";import{jsx as ll,jsxs as Hg}from"react/jsx-runtime";function cl({title:e,message:t,tone:r="default"}){return Hg("div",{className:`ri-license-overlay${r==="error"?" ri-license-overlay--error":""}`,children:[Hg("div",{className:"ri-license-overlay__header",children:[r==="error"?ll(SS,{size:16,className:"ri-license-overlay__icon","aria-hidden":"true"}):ll("span",{className:"ri-license-overlay__statusDot","aria-hidden":"true"}),ll("span",{className:"ri-license-overlay__title",children:e})]}),ll("p",{className:"ri-license-overlay__message",children:t})]})}function gd(e,t){if(e)return e;let r=t?.background;return r?.enabled&&r.type==="color"?r.color:"#1c1c1d"}var CS={glb:"GLB",gltf:"glTF",obj:"OBJ",fbx:"FBX",usdz:"USDZ",stl:"STL",ply:"PLY"},TS=/\.(glb|gltf|obj|fbx|usdz|stl|ply|zip)$/i;function _S(e,t){let r=e?.response?.status;if(typeof r=="number")return r;let n=/responded with (\d{3})/.exec(t);return n?Number(n[1]):null}function Wg(e,t,r,n){let i=e instanceof Error?e.message:e==null?"":String(e),o=(c,h)=>Lf(n,c,h),a=o("loadErrorTitle"),s=i||null;if(Kf(e))return{title:a,detail:o("loadErrorPointCloud"),technical:s};let l=_S(e,i);if(l===404||l===410)return{title:a,detail:o("loadErrorNotFound",{status:l}),technical:s};if(l===401||l===403)return{title:a,detail:o("loadErrorDenied",{status:l}),technical:s};if(l!==null)return{title:a,detail:o("loadErrorStatus",{status:l}),technical:s};if(/failed to fetch|networkerror|load failed|network error/i.test(i))return{title:a,detail:o("loadErrorNetwork"),technical:s};if(/<!doctype|<html/i.test(i))return{title:a,detail:o("loadErrorHtml"),technical:s};let u=t.split(/[?#]/,1)[0],d=CS[r??Yf(t)],p=TS.test(u);return{title:a,detail:p||r?o(r?"loadErrorInvalidExplicitFormat":"loadErrorInvalidFile",{format:d}):o("loadErrorMissingFormat",{format:d}),technical:s}}import{useEffect as kS,useState as DS}from"react";var PS="ri:license-grant:v1",ES={"260cd89ea13f":"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEwjr3ofKTkkcxOM0GYl/RlJj9JsuyjSF8sYmCd2YqsHJCEO8EvlNDrO2Kl4agFKo6dRhyR2/oWeiU6P9WIqRbvw=="},Xg=new Map;function $g(e){let t=atob(e);return Uint8Array.from(t,r=>r.charCodeAt(0)).buffer}function qg(e){let t=e.replace(/-/g,"+").replace(/_/g,"/");return $g(t.padEnd(Math.ceil(t.length/4)*4,"="))}function AS(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 ul(e){let t=await crypto.subtle.digest("SHA-256",new TextEncoder().encode(e.trim())),r=String.fromCharCode(...new Uint8Array(t));return btoa(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function bd(e,t){return`${PS}:${t}:${e}`}function RS(e,t){let r=Xg.get(e);if(r)return r;let n=crypto.subtle.importKey("spki",$g(t),{name:"ECDSA",namedCurve:"P-256"},!1,["verify"]);return Xg.set(e,n),n}async function yd(e,t,r){if(!globalThis.crypto?.subtle)return null;try{let[n,i,o,a,...s]=e.split("."),l=ES[i];if(n!=="ri1"||!l||!o||!a||s.length>0)return null;let u=JSON.parse(new TextDecoder().decode(qg(o)));if(!AS(u)||!await crypto.subtle.verify({name:"ECDSA",hash:"SHA-256"},await RS(i,l),qg(a),new TextEncoder().encode(`${n}.${i}.${o}`)))return null;let p=Math.floor(Date.now()/1e3),c=u.expiresAt-u.issuedAt;return u.licenseKeyHash!==t||u.domain!==r||u.expiresAt<=p||u.issuedAt>p+300||c<=0||c>43200?null:{environment:u.environment,tier:u.tier,expiresAt:u.expiresAt}}catch{return null}}async function Yg(e,t,r){try{return await yd(e,await ul(t),r)}catch{return null}}async function Kg(e,t,r){try{let n=await ul(t);return await yd(e,n,r)?(localStorage.setItem(bd(n,r),e),!0):!1}catch{return!1}}async function Qg(e,t){try{let r=await ul(e),n=bd(r,t),i=localStorage.getItem(n);if(!i)return null;let o=await yd(i,r,t);return o||localStorage.removeItem(n),o}catch{return null}}async function xd(e,t){try{let r=await ul(e);localStorage.removeItem(bd(r,t))}catch{}}var LS=["localhost","127.0.0.1","0.0.0.0"],OS=e=>LS.includes(e)||e.endsWith(".local")||e.endsWith(".localhost"),eb="https://react-immersive.liveroom.dev/api/validate-license",tb=()=>typeof window<"u",IS=300*1e3,BS=5e3,jS=400,wd=new Map,vd=new Map,Fn=class extends Error{},rb=async(e,t,r)=>{let n=await Qg(e,t);return n?(console.warn("[react-immersive] License server unreachable \u2014 using a previously verified, time-limited offline grant."),{status:"valid",reason:"Previously verified offline grant",environment:n.environment,tier:n.tier,isLocalDomain:r}):null},Jg=async(e,t,r)=>{let n=await rb(e,t,r);return n||(console.warn("[react-immersive] License server unreachable and no valid offline grant is available \u2014 license validation failed."),{status:"invalid",reason:"Could not reach license server",isLocalDomain:r})},zS=e=>e instanceof Fn||e instanceof TypeError,NS=()=>new Promise(e=>setTimeout(e,jS)),VS=e=>e==="development"||e==="production",FS=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&&!VS(t.environment)||t.tier!==void 0&&typeof t.tier!="string"||t.offlineGrant!==void 0&&typeof t.offlineGrant!="string")},US=e=>{if(!e||typeof e!="object")return null;let t=e,r=t.reason??t.error;return typeof r=="string"&&r.trim()?r:null},nb=(e,t,r)=>`${r}::${e}::${t}`,ib=e=>{let t=wd.get(e);return t?Date.now()-t.timestamp>IS?(wd.delete(e),null):t.result:null},GS=(e,t)=>({status:e.valid?"valid":"invalid",reason:e.reason,environment:e.environment,tier:e.tier,isLocalDomain:t}),HS=(e,t)=>({status:"invalid",reason:e,isLocalDomain:t});async function WS(e,t,r,n){let i=nb(e,t,n),o=ib(i);if(o)return o;let a=vd.get(i);if(a)return a;let s=(async()=>{for(let l=0;l<2;l+=1)try{return await XS(e,t,r,i,n)}catch(u){if(!zS(u))throw u;if(l===0){let d=await rb(e,t,r);if(d)return d;await NS();continue}return Jg(e,t,r)}return Jg(e,t,r)})().finally(()=>{vd.delete(i)});return vd.set(i,s),s}async function XS(e,t,r,n,i){let o=new AbortController,a=setTimeout(()=>o.abort(),BS),s;try{s=await fetch(i,{method:"POST",headers:{"Content-Type":"application/json"},cache:"no-store",signal:o.signal,body:JSON.stringify({licenseKey:e,domain:t})})}catch(d){throw o.signal.aborted?new Fn("License validation timed out"):d}finally{clearTimeout(a)}let l;try{l=await s.json()}catch{throw new Fn(`License server returned a non-JSON response${s.status?` (${s.status})`:""}`)}if(!s.ok){if(s.status===429||s.status>=500)throw new Fn(`License server error (${s.status})`);let d=US(l)??`License validation failed${s.status?` (${s.status})`:""}`;return await xd(e,t),HS(d,r)}if(!FS(l))throw new Fn("License server returned an unexpected payload");let u=GS(l,r);if(u.status==="valid"&&i!==eb){let d=l.offlineGrant?await Yg(l.offlineGrant,e,t):null;if(!d)throw new Fn("License validation endpoint did not return a verifiable signed grant");u={...u,environment:d.environment,tier:d.tier}}return u.status==="valid"?(wd.set(n,{result:u,timestamp:Date.now()}),l.offlineGrant&&(await Kg(l.offlineGrant,e,t)||console.warn("[react-immersive] The license server returned an invalid offline grant; it was not cached."))):await xd(e,t),u}var Zg=(e,t)=>{let r=e.trim();return!tb()||!r?null:ib(nb(r,window.location.hostname.toLowerCase(),t))},ob=(e,t=eb)=>{let[r,n]=DS(()=>Zg(e,t)??{status:"checking",isLocalDomain:!1});return kS(()=>{if(!tb())return;let i=!1,o=p=>{i||n(p)},a=e.trim(),s=window.location.hostname.toLowerCase(),l=OS(s),u=Zg(e,t);return u?(o(u),()=>{i=!0}):(o({status:"checking",isLocalDomain:l}),a?((async()=>{try{o(await WS(a,s,l,t))}catch(p){let c=p instanceof TypeError?"Could not reach license server":p instanceof Error?p.message:"License validation failed";o({status:"invalid",reason:c,isLocalDomain:l})}})(),()=>{i=!0}):(o({status:"invalid",reason:"No license key provided",isLocalDomain:l}),()=>{i=!0}))},[e,t]),r};import{createContext as qS,useContext as $S}from"react";var YS=qS({isInsideEditor:!1,activeTab:"object",activeSubTab:"General",tier:"free"});var dl=()=>$S(YS);import{Box3 as rC,Mesh as nC,Raycaster as iC,Triangle as oC,Vector3 as Fr}from"three";import{useCallback as pl,useEffect as KS,useRef as hl}from"react";import{Matrix4 as QS,Triangle as ab,Vector3 as ya}from"three";var JS=500,ZS=10,eC=5;function ml(e,t,r){let n=hl({resolve:e,onContextMenu:t,anchorOf:r});n.current={resolve:e,onContextMenu:t,anchorOf:r};let i=hl(null),o=hl(!1),a=hl(null),s=pl(()=>{let p=i.current;p?.timer&&clearTimeout(p.timer),i.current=null,a.current?.(),a.current=null},[]),l=pl(()=>{let p=i.current;p&&(s(),p.kind==="touch"&&(o.current=!0,setTimeout(()=>o.current=!1,800)),n.current.onContextMenu?.(p.target,p.pointer))},[s]),u=pl(p=>{let c=p.nativeEvent,h=c.pointerType!=="touch"&&c.button===2,m=c.pointerType==="touch"&&c.button===0;if(!n.current.onContextMenu||!h&&!m)return;let g=n.current.resolve(p.object);if(g===null)return;s();let f={target:g,kind:h?"right":"touch",pointerId:c.pointerId,pointer:ho(p,n.current.anchorOf?.(p.object)),timer:m?setTimeout(l,JS):null};i.current=f;let b=h?eC:ZS,w=v=>Math.hypot(v.clientX-f.pointer.clientX,v.clientY-f.pointer.clientY)>b,y=v=>{v.pointerId===f.pointerId&&w(v)&&s()},M=v=>{v.pointerId===f.pointerId&&(f.kind==="right"&&!w(v)?l():s())},E=v=>{v.pointerId!==f.pointerId&&s()};window.addEventListener("pointermove",y),window.addEventListener("pointerup",M),window.addEventListener("pointercancel",s),window.addEventListener("pointerdown",E),a.current=()=>{window.removeEventListener("pointermove",y),window.removeEventListener("pointerup",M),window.removeEventListener("pointercancel",s),window.removeEventListener("pointerdown",E)}},[s,l]);KS(()=>s,[s]);let d=pl(()=>o.current?(o.current=!1,!0):!1,[]);return{onPointerDown:u,consumeClick:d}}function tC(e,t){let r=e.face,n=t.geometry.getAttribute("position");if(!r||!n)return null;let i=e.barycoord??null;if(!i){let[p,c,h]=[r.a,r.b,r.c].map(m=>t.getVertexPosition(m,new ya));if(i=ab.getBarycoord(t.worldToLocal(e.point.clone()),p,c,h,new ya),!i)return null}let[o,a,s]=[r.a,r.b,r.c].map(p=>new ya().fromBufferAttribute(n,p)),l=new ya().addScaledVector(o,i.x).addScaledVector(a,i.y).addScaledVector(s,i.z),u=new ab(o,a,s).getNormal(new ya);return r.normal.clone().transformDirection(t.matrixWorld).dot(e.ray.direction)>0&&u.negate(),{position:[l.x,l.y,l.z],normal:[u.x,u.y,u.z]}}function vi(e,t){if(t.updateWorldMatrix(!0,!1),e.object===t&&t.isSkinnedMesh===!0){let i=tC(e,t);if(i)return i}let r=t.worldToLocal(e.point.clone()),n=e.face?e.face.normal.clone().transformDirection(e.object.matrixWorld):e.ray.direction.clone().negate();return n.dot(e.ray.direction)>0&&n.negate(),n.transformDirection(new QS().copy(t.matrixWorld).invert()),{position:[r.x,r.y,r.z],normal:[n.x,n.y,n.z]}}function ho(e,t){let r=e.nativeEvent;return{clientX:r.clientX,clientY:r.clientY,pointerType:"pointerType"in r?r.pointerType:"mouse",...t?{surface:vi(e,t)}:{}}}function sb(e,t){if(!(e instanceof nC)||!t)return null;let r=e.geometry.getAttribute("position");if(!r?.count)return null;e.updateWorldMatrix(!0,!1),t.updateWorldMatrix(!0,!1);let n=new rC,i=new Fr;if(ur(e)){let v=e;v.computeBoundingBox(),v.computeBoundingSphere();for(let P=0;P<r.count;P++)n.expandByPoint(e.getVertexPosition(P,i))}else e.geometry.boundingBox||e.geometry.computeBoundingBox(),n.copy(e.geometry.boundingBox);if(n.applyMatrix4(e.matrixWorld),n.isEmpty())return null;let o=n.getCenter(new Fr),a=t.getWorldPosition(new Fr),s=t.getWorldDirection(new Fr),l=t.isOrthographicCamera,u=new iC,d=v=>{if(l){let T=a.distanceTo(o)+n.getSize(i).length()+1;u.set(v.clone().addScaledVector(s,-T),s)}else u.set(a,v.clone().sub(a).normalize());let P=u.intersectObject(e,!1)[0];return P?vi({...P,ray:u.ray},e):null},p=d(o);if(p)return p;let c=e.geometry.index,h=c?.count??r.count,m=new Fr,g=new Fr,f=new Fr,b=new Fr,w=new Fr,y=new Fr,M=null,E=1/0;for(let v=0;v+2<h;v+=3){if(e.getVertexPosition(c?c.getX(v):v,m).applyMatrix4(e.matrixWorld),e.getVertexPosition(c?c.getX(v+1):v+1,g).applyMatrix4(e.matrixWorld),e.getVertexPosition(c?c.getX(v+2):v+2,f).applyMatrix4(e.matrixWorld),b.copy(m).add(g).add(f).multiplyScalar(1/3),oC.getNormal(m,g,f,w),l?y.copy(s).negate():y.copy(a).sub(b),w.dot(y)<=0)continue;let P=b.distanceToSquared(o);P<E&&(E=P,M=b.clone())}return M?d(M):null}import{Mesh as aC,Raycaster as sC,Triangle as lC,Vector2 as lb,Vector3 as nn}from"three";function cb(e,t,r,n){if(!(e instanceof aC)||!t)return null;e.updateWorldMatrix(!0,!1),t.updateWorldMatrix(!0,!1);let i=new nn().fromArray(r.position);if(ur(e)){let u=e;u.computeBoundingBox(),u.computeBoundingSphere();let d=u.geometry.getAttribute("position");if(!d)return null;let p=u.geometry.index,c=p?.count??d.count,h=new lC,m=new nn,g=new nn,f=1/0,b=null;for(let w=0;w+2<c;w+=3){let y=[0,1,2].map(E=>p?p.getX(w+E):w+E);h.a.fromBufferAttribute(d,y[0]),h.b.fromBufferAttribute(d,y[1]),h.c.fromBufferAttribute(d,y[2]),h.closestPointToPoint(i,m);let M=m.distanceToSquared(i);if(!(M>=f||!h.getBarycoord(m,g))&&(f=M,b=new nn().addScaledVector(u.getVertexPosition(y[0],new nn),g.x).addScaledVector(u.getVertexPosition(y[1],new nn),g.y).addScaledVector(u.getVertexPosition(y[2],new nn),g.z),f<1e-12))break}if(!b)return null;i.copy(b)}if(i.applyMatrix4(e.matrixWorld).project(t),!Number.isFinite(i.x)||i.z<-1||i.z>1)return null;let o=new lb(n==="left"?-.0035:n==="right"?.0035:0,n==="down"?-.0035:n==="up"?.0035:0),a=new sC,s=r.size*.01,l=new nn().fromArray(r.position);for(let u=1;u>=1/1024;u/=2){a.setFromCamera(new lb(i.x,i.y).addScaledVector(o,u),t);let d=a.intersectObject(e,!1)[0];if(d){let p=vi({...d,ray:a.ray},e);if(new nn().fromArray(p.position).distanceTo(l)<=s)return p}}return null}import{useRef as ye,useState as be,useEffect as Ue,useCallback as fe,useMemo as Ot,Suspense as h1}from"react";import{GizmoHelper as vD,GizmoViewport as wD}from"@react-three/drei";import{Box3 as MD,Raycaster as SD,Vector2 as CD,Vector3 as Uh}from"three";import{Component as cC}from"react";var Ur=class extends cC{constructor(){super(...arguments);this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(r,n){this.props.onLoadError?.(r)}render(){return this.state.hasError?null:this.props.children}};import{useCallback as ub,useEffect as db,useState as uC}from"react";function pb({enabled:e,activeUrl:t,models:r,errorsRef:n,activeFailed:i,activeError:o,onActiveError:a,onExtraError:s}){let[l,u]=uC(0),d=ub((c,h)=>{n.current.set(c,h),u(m=>m+1),c!==t&&s?.(c,h)},[t,n,s]),p=ub(c=>{n.current.delete(c)&&u(h=>h+1)},[n]);return db(()=>{let c=new Set(e?r?.map(h=>h.url):[]);for(let h of n.current.keys())c.has(h)||n.current.delete(h)},[e,r,n]),db(()=>{if(!e||!n.current.has(t))return;let c=n.current.get(t);i&&Object.is(o,c)||a(c)},[e,t,r,n,l,i,o,a]),{reportError:d,clearError:p}}import{useCallback as dC,useEffect as hb,useRef as fl}from"react";function mb(e,t){let r=fl({}),n=fl({}),i=fl({}),o=fl(0),a=dC(s=>{var l;return(l=i.current)[s]??(l[s]={current:{}})},[]);return hb(()=>{let s=new Set(e?t?.map(l=>l.url):[]);for(let l of Object.keys(r.current))s.has(l)||delete r.current[l];for(let l of Object.keys(n.current))s.has(l)||delete n.current[l];for(let l of Object.keys(i.current))s.has(l)||(i.current[l].current={},delete i.current[l])},[e,t]),hb(()=>{let s=++o.current;return()=>{queueMicrotask(()=>{o.current===s&&(r.current={},n.current={},Object.values(i.current).forEach(l=>{l.current={}}),i.current={})})}},[]),{scenesByUrlRef:r,cameraHomesByUrlRef:n,materialRefsByUrlRef:i,getMaterialRefsForUrl:a}}import{useCallback as fb,useEffect as mC,useState as gb}from"react";import{useEffect as pC,useRef as hC}from"react";function on(e,t){let r=hC(t);pC(()=>{let n=r.current;r.current=t,t.some((i,o)=>!Object.is(i,n[o]))&&e()},t)}var fC={};function bb({modelUrl:e,tilesetUrl:t,models:r,objectBindings:n="auto",onChange:i,initialBindings:o,initialModelEdits:a}){let s=!!(r?.length&&!t),l=n==="auto"&&!s,u=!l&&i!==void 0,d=n==="auto"?fC:n,[p,c]=gb(()=>o??d),[h,m]=gb(()=>{let y=new Map(a),M=s?r?.find(E=>E.url===e):void 0;return M&&o&&a===void 0&&y.set(e,{source:M.objectBindings,bindings:o}),y});on(()=>{u||c(d)},[u,d]),mC(()=>{let y=new Map(s?r?.map(M=>[M.url,M.objectBindings]):[]);m(M=>{let E=[...M].filter(([v,P])=>!u&&y.get(v)===P.source);return E.length===M.size?M:new Map(E)})},[s,r,u]);let g=fb(y=>{let M=u?void 0:h.get(y.url);return M?.source===y.objectBindings?M.bindings:y.objectBindings},[u,h]),f=s?r?.find(y=>y.url===e):void 0,b=f?g(f):u?d:p,w=fb(y=>{u||(f?m(M=>new Map(M).set(f.url,{source:f.objectBindings,bindings:y})):c(y)),i?.(y)},[u,f,i]);return{autoBindings:l,controlled:u,currentBindings:b,applyBindings:w,bindingsForModel:g,modelEdits:h}}import{PerspectiveCamera as Md,Vector2 as gC}from"three";var yb="riEditorGizmo";function gl(e){return e.userData[yb]=!0,e}function bl(e){let t=[];return e.traverse(r=>{r.visible&&r.userData[yb]&&(r.visible=!1,t.push(r))}),()=>{for(let r of t)r.visible=!0}}function yl(e,t={}){if(!e)return Promise.reject(new Error("Viewer not ready"));let{gl:r,scene:n,camera:i,invalidate:o}=e,a=no(r);if(!a&&!r.getContextAttributes().preserveDrawingBuffer)return Promise.reject(new Error("Screenshot capture is disabled. Set preserveDrawingBuffer on ModelViewer to enable it."));let{transparent:s=!1}=t,l=r.getSize(new gC),u=r.getPixelRatio(),d=i instanceof Md?i.aspect:null,p=n.background,c=t.width??l.x,h=t.height??l.y,m=c!==l.x||h!==l.y,g=bl(n);s&&(n.background=null),m&&(r.setPixelRatio(1),r.setSize(c,h,!1),i instanceof Md&&(i.aspect=c/h,i.updateProjectionMatrix()));let f=()=>{g(),s&&(n.background=p),m&&(r.setPixelRatio(u),r.setSize(l.x,l.y,!1),i instanceof Md&&d!==null&&(i.aspect=d,i.updateProjectionMatrix())),o()};if(a)try{return r.render(n,i),Promise.resolve(r.domElement.toDataURL("image/png"))}catch(b){return Promise.reject(b)}finally{f()}return o(),new Promise((b,w)=>{requestAnimationFrame(()=>{requestAnimationFrame(()=>{let y,M;try{y=r.domElement.toDataURL("image/png")}catch(E){M=E}f(),M?w(M):b(y)})})})}import{useCallback as vl,useEffect as SC,useRef as Sb,useState as Cb}from"react";import{Vector3 as Tb}from"three";import{useEffect as xl,useMemo as an,useRef as sn}from"react";import{useFrame as bC,useThree as yC}from"@react-three/fiber";import{Box3 as xC,CatmullRomCurve3 as xb,Sphere as vC,Spherical as wC,Vector3 as Un}from"three";function Sd(e){if(e.duration!==void 0)return e.duration;let t=e.waypoints??[];if(t.length<2)return 24;let r=e.loop===!1?t.slice(0,-1):t;return Math.max(r.reduce((n,i)=>n+(i.segmentDuration??3.5),0),4)}var MC=1.2;function mo({controlsRef:e,sceneRef:t,config:r,playing:n,resetOnPlay:i=!1,onFinished:o,onUserInteract:a,onStop:s,playOnce:l=!1,startAtPath:u=!1,onStarted:d,onProgress:p}){let c=yC(O=>O.invalidate),h=an(()=>r.waypoints??[],[r.waypoints]),m=h.length>=2,g=r.loop??!0,f=Sd(r),b=an(()=>h.map(O=>[...O.position,...O.target,O.azimuthAngle??"",O.polarAngle??"",O.segmentDuration??""].join(",")).join(";"),[h]),w=an(()=>{let O=[];if(h.length<2)return O;let k=0;for(let W=0;W<h.length-1;W++)k+=h[W].segmentDuration??3.5,O.push(k);return g&&h.length>1&&(k+=h[h.length-1].segmentDuration??3.5,O.push(k)),O},[h,g]),y=an(()=>O=>{if(h.length<2||w.length===0)return O/f;let k=w[w.length-1],W=g?O%f:Math.min(O,f),he=f>0?W/f*k:0;for(let ae=0;ae<w.length;ae++)if(he<=w[ae]){let te=ae===0?0:w[ae-1],ve=w[ae]-te,U=ve>0?(he-te)/ve:0,G=g?h.length:h.length-1,J=ae/G,se=1/G;return J+U*se}return 1},[h.length,w,f,g]),M=an(()=>m?{position:new xb(h.map(O=>new Un(...O.position)),g,"catmullrom",.5),target:new xb(h.map(O=>new Un(...O.target)),g,"catmullrom",.5)}:null,[b,m,g]),E=an(()=>{if(!m||!h.every(k=>Number.isFinite(k.azimuthAngle)&&Number.isFinite(k.polarAngle)))return null;let O=h.map(k=>({azimuth:k.azimuthAngle,polar:k.polarAngle,distance:new Un(...k.position).distanceTo(new Un(...k.target))}));for(let k=1;k<O.length;k+=1){let W=O[k-1].azimuth,he=O[k].azimuth;O[k].azimuth=he+Math.round((W-he)/(Math.PI*2))*Math.PI*2}return O},[b,m]),v=sn(0),P=sn(0),T=sn(new Un),_=sn(new Un),S=sn(!1),C=sn(!0),R=sn(0),A=sn(!1),B=sn(null),N=an(()=>new Un,[]),D=an(()=>new Un,[]),V=an(()=>new wC,[]);return xl(()=>{v.current=0,R.current=0,P.current=0,A.current=!1},[b,g,f]),xl(()=>{i&&(R.current=0,v.current=0,A.current=!1)},[i]),xl(()=>{if(!n){S.current=!1,v.current>0&&!i?R.current=v.current:i&&(R.current=0),(v.current>0||A.current)&&s?.();return}v.current>=f&&!g&&(v.current=0,R.current=0,A.current=!1);let O=e.current;if(O&&(O.getPosition(T.current),O.getTarget(_.current)),i||A.current||R.current===0?(v.current=0,R.current=0,A.current=!1):R.current>0&&R.current<f?v.current=R.current:(v.current=0,R.current=0),P.current=0,!m){let k=t.current;if(k){let W=new xC().setFromObject(k).getBoundingSphere(new vC);B.current={center:W.center.clone(),radius:W.radius>0?W.radius:1}}}S.current=!0,C.current=!0,c()},[n,m,e,t,c,f,g,b,i,s]),xl(()=>{if(!n||!a)return;let O=e.current;if(!O)return;let k=()=>{A.current||a()};return O.addEventListener("controlstart",k),()=>O.removeEventListener("controlstart",k)},[n,e,a]),bC((O,k)=>{if(!n||!S.current)return;let W=e.current;if(!W)return;let he=C.current;C.current=!1,(!he||!u)&&(v.current+=k,P.current+=k);let ae=(!g||l)&&v.current>=f,te=ae&&g?0:y(v.current);if(te=g?te%1:Math.min(te,1),M)if(M.target.getPoint(te,D),E){let U=g?E.length:E.length-1,G=Math.min(te,1)*U,J=Math.min(Math.floor(G),U-1),se=(J+1)%E.length,Ee=te>=1?1:G-J,X=Ee*Ee*(3-2*Ee),ie=E[J],Ce=E[se],Ge=Ce.azimuth+Math.round((ie.azimuth-Ce.azimuth)/(Math.PI*2))*Math.PI*2,Q=ie.azimuth+(Ge-ie.azimuth)*X,ot=ie.polar+(Ce.polar-ie.polar)*X,rt=ie.distance+(Ce.distance-ie.distance)*X;V.set(Math.max(rt,1e-6),Math.min(Math.max(ot,1e-6),Math.PI-1e-6),Q),N.setFromSpherical(V).add(D)}else M.position.getPoint(te,N);else{let U=B.current;if(!U)return;let G=te*Math.PI*2,J=U.radius*2.2;N.set(U.center.x+Math.cos(G)*J,U.center.y+U.radius*.6,U.center.z+Math.sin(G)*J),D.copy(U.center)}let ve=u?1:Math.min(P.current/MC,1);if(ve<1){let U=ve*ve*(3-2*ve);N.lerpVectors(T.current,N,U),D.lerpVectors(_.current,D,U)}if(W.setLookAt(N.x,N.y,N.z,D.x,D.y,D.z,!1),he&&d?.(),p?.(Math.min(v.current/f,1)),ae){S.current=!1,A.current=!0,v.current=0,R.current=0,o?.();return}c()}),null}function vb(){return typeof document<"u"&&typeof HTMLCanvasElement<"u"&&typeof HTMLCanvasElement.prototype.captureStream=="function"}function wb(e,t={}){let{fps:r=15,gifWidth:n=480,signal:i}=t;if(!Number.isFinite(r)||r<1||r>60)throw new Error("Video frame rate must be between 1 and 60.");if(!Number.isInteger(n)||n<16||n>4096)throw new Error("GIF width must be a whole number of pixels from 16 to 4096.");if(i?.aborted)throw new DOMException("Video export cancelled.","AbortError");if(typeof e.captureStream!="function"||typeof document>"u")throw new Error("Video recording as GIF is not supported in this browser.");let o=1e3/r,a,s,l,u=null,d,p=0,c=0,h=0,m=null,g=0,f=0,b=0,w=!1,y=!1,M,E,v,P,T,_,S=new Promise((k,W)=>{T=k,_=W}),C=()=>{clearTimeout(M),clearInterval(E),v!==void 0&&cancelAnimationFrame(v),P!==void 0&&cancelAnimationFrame(P),i?.removeEventListener("abort",A),e.removeEventListener("webglcontextlost",B),l&&(l.pause(),l.srcObject=null),s?.getTracks().forEach(k=>k.stop())},R=(k=new DOMException("Video export cancelled.","AbortError"))=>{w||(w=!0,C(),_(k))},A=()=>R(),B=()=>R(new Error("Video export stopped because the WebGL context was lost.")),N=()=>R(new Error("Video export timed out. Keep the viewer tab visible while recording."));i?.addEventListener("abort",A,{once:!0}),e.addEventListener("webglcontextlost",B),M=setTimeout(N,3e4);let D=(async()=>{if(a=await import("gifenc"),!w&&(s=e.captureStream(r),l=document.createElement("video"),l.muted=!0,l.playsInline=!0,l.srcObject=s,await l.play(),!w)){if(u=document.createElement("canvas").getContext("2d",{willReadFrequently:!0}),!u)throw new Error("Video recording as GIF is not supported in this browser.");d=a.GIFEncoder()}})().catch(k=>R(k)),V=k=>{if(!m||!d)return;let W=Math.max(2,Math.round((k-g)/10)-b);b+=W,d.writeFrame(m.index,p,c,{palette:m.palette,delay:W*10}),m=null},O=()=>{if(w||!a||!l||!u||!d||l.readyState<2||!l.videoWidth)return;let k=performance.now();if(!(h>0&&k-f<o/2)){p||(p=Math.min(n,l.videoWidth),c=Math.max(1,Math.round(p*l.videoHeight/l.videoWidth)),u.canvas.width=p,u.canvas.height=c);try{u.drawImage(l,0,0,p,c);let{data:W}=u.getImageData(0,0,p,c),he=a.quantize(W,256),ae=a.applyPalette(W,he);h===0&&(g=k),V(k),m={index:ae,palette:he},f=k,h+=1}catch(W){R(W)}}};return{result:S,cancel:R,start(k){w||v!==void 0||(v=requestAnimationFrame(()=>{D.then(()=>{w||(O(),E=setInterval(O,o),clearTimeout(M),M=setTimeout(N,(k+30)*1e3))})}))},finish(){w||y||(y=!0,P=requestAnimationFrame(()=>{D.then(()=>{if(w||(O(),w))return;if(!d||h===0){R(new Error("The browser produced an empty video."));return}V(f+o),d.finish();let k=new Blob([d.bytes()],{type:"image/gif"});w=!0,C(),T(k)})}))}}}var Cd={webm:["video/webm;codecs=vp9","video/webm;codecs=vp8","video/webm"],mp4:["video/mp4;codecs=avc1.42E01E","video/mp4"]};function ln(e="auto"){return e==="gif"?vb()?"image/gif":null:typeof MediaRecorder>"u"?null:(e==="auto"?[...Cd.webm,...Cd.mp4]:Cd[e]).find(r=>MediaRecorder.isTypeSupported(r))??null}function Mb(e,t={}){if(t.format==="gif")return wb(e,t);let{fps:r=30,videoBitsPerSecond:n=8e6,signal:i}=t;if(!Number.isFinite(r)||r<1||r>60)throw new Error("Video frame rate must be between 1 and 60.");if(!Number.isFinite(n)||n<=0)throw new Error("Video bitrate must be a positive number.");if(i?.aborted)throw new DOMException("Video export cancelled.","AbortError");let o=ln(t.format);if(!o||typeof e.captureStream!="function"){let v=t.format&&t.format!=="auto"?` as ${t.format.toUpperCase()}`:"";throw new Error(`Video recording${v} is not supported in this browser.`)}let a,s,l=!1,u=!1,d,p,c,h=[],m,g,f=new Promise((v,P)=>{m=v,g=P}),b=()=>{clearTimeout(d),p!==void 0&&cancelAnimationFrame(p),c!==void 0&&cancelAnimationFrame(c),i?.removeEventListener("abort",y),e.removeEventListener("webglcontextlost",M),s&&(s.ondataavailable=null,s.onstop=null,s.onerror=null),a?.getTracks().forEach(v=>v.stop())},w=(v=new DOMException("Video export cancelled.","AbortError"))=>{if(!l){if(l=!0,b(),s&&s.state!=="inactive")try{s.stop()}catch{}g(v)}},y=()=>w(),M=()=>w(new Error("Video export stopped because the WebGL context was lost.")),E=()=>w(new Error("Video export timed out. Keep the viewer tab visible while recording."));return i?.addEventListener("abort",y,{once:!0}),e.addEventListener("webglcontextlost",M),d=setTimeout(E,3e4),{result:f,cancel:w,start(v){l||p!==void 0||(p=requestAnimationFrame(()=>{if(!l)try{a=e.captureStream(r);let P=new MediaRecorder(a,{mimeType:o,videoBitsPerSecond:n});s=P,P.ondataavailable=({data:T})=>{T.size>0&&h.push(T)},P.onerror=()=>w(new Error("The browser could not encode the video.")),P.onstop=()=>{if(l)return;l=!0,b();let T=new Blob(h,{type:P.mimeType||o});T.size===0?g(new Error("The browser produced an empty video.")):m(T)},P.start(1e3),clearTimeout(d),d=setTimeout(E,(v+30)*1e3)}catch(P){w(P)}}))},finish(){l||u||(u=!0,c=requestAnimationFrame(()=>{if(!l)try{if(!s)throw new Error("Video recording did not start.");s.stop()}catch(v){w(v)}}))}}}function _b(e){let t=Sb(e);t.current=e;let r=Sb(null),[n,i]=Cb(null),[o,a]=Cb(0),s=vl(()=>r.current?.cancel(),[]),l=vl(()=>r.current!==null,[]);SC(()=>s,[e.modelUrl,s]);let u=vl(async(p={})=>{let{rendererCaptureRef:c,controlsRef:h,cinematicConfig:m,ready:g,onCaptureStart:f}=t.current,b=c.current,w=h.current;if(!g||!b||!w)throw new Error("Viewer not ready for video export.");if(b.gl.xr.isPresenting)throw new Error("Exit the XR session before recording a video.");if(r.current)throw new Error("A video export is already in progress.");let y=p.mode??(m?"cinematic":"turntable");if(y==="cinematic"&&!m)throw new Error("Enable a cinematic camera path before recording it.");let M=y==="cinematic"?m:{loop:!0},E=p.duration??(y==="turntable"&&p.format==="gif"?8:Sd(M));if(!Number.isFinite(E)||E<=0||E>300)throw new Error("Video duration must be greater than 0 and at most 300 seconds.");let v=Mb(b.gl.domElement,p);r.current=v;let P=w.getPosition(new Tb),T=w.getTarget(new Tb),_=w.enabled,S=bl(b.scene);w.stop(),w.enabled=!1,a(0),f(),i({config:{...M,duration:E,autoPlay:!1},onStarted:()=>v.start(E),onFinished:v.finish});try{return await v.result}finally{S(),w.enabled=_,w.setLookAt(P.x,P.y,P.z,T.x,T.y,T.z,!1),b.invalidate(),r.current=null,i(null)}},[]),d=vl(p=>{let c=Math.floor(p*100);a(h=>h===c?h:c)},[]);return{captureVideo:u,cancelVideo:s,isRecording:l,recording:n,progress:o,onProgress:d}}import{useCallback as CC,useEffect as TC,useRef as _C,useState as xa}from"react";function Pb(e){let[t,r]=xa(null),[n,i]=xa(!1),[o,a]=xa(!1),[s,l]=xa(!1),[u,d]=xa(null),p=_C(!1);TC(()=>{if(!t||!e){i(!1),a(!1),d(null);return}let h=t.ownerDocument;i(h.fullscreenEnabled===!0&&typeof t.requestFullscreen=="function"&&typeof h.exitFullscreen=="function");let m=()=>{a(h.fullscreenElement===t),d(null)};return m(),h.addEventListener("fullscreenchange",m),()=>h.removeEventListener("fullscreenchange",m)},[t,e]);let c=CC(async()=>{if(!t||!e||!n||p.current)return;let h=t.ownerDocument,m=h.fullscreenElement===t;p.current=!0,l(!0),d(null);try{m?await h.exitFullscreen():await t.requestFullscreen(),a(h.fullscreenElement===t)}catch{d(m?"Could not exit fullscreen. Press Escape to exit.":"Could not enter fullscreen. Check your browser or iframe fullscreen permissions and try again.")}finally{p.current=!1,l(!1)}},[t,e,n]);return{rootRef:r,supported:n,active:o,pending:s,error:u,toggle:c}}import{useCallback as wl,useEffect as Ab,useRef as va,useState as Td}from"react";function Eb(e,{onLost:t,onRestored:r,initiallyLost:n=!1}){let i=n,o=s=>{s.preventDefault(),!i&&(i=!0,t())},a=()=>{i&&(i=!1,r())};return e.addEventListener("webglcontextlost",o),e.addEventListener("webglcontextrestored",a),n&&t(),()=>{e.removeEventListener("webglcontextlost",o),e.removeEventListener("webglcontextrestored",a)}}function Rb(e){let t=va(e);t.current=e;let[r,n]=Td(null),[i,o]=Td(0),[a,s]=Td("ready"),l=va(null),u=va(!1),d=va(null),p=va(null),c=wl(f=>{p.current?.dispose(),p.current=null,d.current=f,n(f)},[]),h=wl(()=>{u.current||(u.current=!0,t.current?.(),l.current?.(),l.current=null,d.current&&(p.current=d.current),d.current=null,n(null),s("rebuilding"),o(f=>f+1))},[]),m=wl(()=>{l.current?.(),l.current=null;let f=d.current;d.current=null,n(null),f&&Ff(f)},[]),g=wl(()=>{u.current=!1,s("lost")},[]);return Ab(()=>()=>{p.current?.dispose(),p.current=null},[]),Ab(()=>{if(!r)return;if(u.current=!1,s("ready"),no(r)){let b=r,w=b.onDeviceLost;return b.onDeviceLost=y=>{console.warn("[react-immersive] The WebGPU device was lost.",y),g()},()=>{b.onDeviceLost=w}}let f=Eb(r.domElement,{initiallyLost:r.getContext().isContextLost(),onLost:g,onRestored:h});return l.current=f,()=>{f(),l.current===f&&(l.current=null)}},[r,g,h]),{generation:i,status:a,reload:h,fail:g,release:m,onRendererCreated:c}}function Ml(e,t){return t||e}async function kb(e,t){await e.setLookAt(...t.position,...t.target,!1);let r=e.camera;t.fov!=null&&Number.isFinite(t.fov)&&t.fov>0&&t.fov<180&&"fov"in r&&(r.fov=t.fov,r.updateProjectionMatrix()),t.zoom!=null&&Number.isFinite(t.zoom)&&t.zoom>0&&await e.zoomTo(t.zoom,!1)}import{Component as PC}from"react";var fo=class extends PC{constructor(){super(...arguments);this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(r,n){this.props.onError?.(r)}render(){return this.state.hasError?this.props.fallback??null:this.props.children}};import{useEffect as EC,useMemo as AC,useRef as RC}from"react";function Db({modelUrl:e,tilesetUrl:t=null,getOptions:r,now:n=()=>performance.now(),timestamp:i=()=>new Date().toISOString(),sessionId:o=typeof crypto<"u"&&crypto.randomUUID?crypto.randomUUID():`viewer-${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`,log:a=l=>console.info("[react-immersive engagement]",l),warn:s=l=>console.warn("[react-immersive] onEngagement callback failed:",l)}){let l=n(),u=()=>{let C=r();return!!(C.onEngagement||C.debugEngagement)},d=C=>Math.max(0,Math.round(n()-C)),p=C=>{let{onEngagement:R,debugEngagement:A}=r();if(!R&&!A)return;let B={...C,sessionId:o,timestamp:i(),elapsedMs:d(l),modelUrl:e,tilesetUrl:t};A&&a(B);try{Promise.resolve(R?.(B)).catch(s)}catch(N){s(N)}},c=null,h=null,m="[]",g=null,f=null,b=C=>{c=C},w=C=>{!u()||c===C.objectKey||(c=C.objectKey,p({type:"part-viewed",...C}))},y=(C,R,A=null)=>{let B=JSON.stringify([A,R,C]);!u()||C===R||B===h||(h=B,p({type:"variant-chosen",variant:C,previousVariant:R,group:A}))},M=C=>{let R=JSON.stringify(C);R!==m&&(m=R,h=null)},E=()=>{!u()||g!==null||(g=n(),p({type:"ar-started"}))},v=(C="session-ended")=>{if(g===null)return;let R=d(g);g=null,p({type:"ar-ended",durationMs:R,reason:C})},P=(C="stopped")=>{if(!f)return;let{startedAt:R,annotationCount:A}=f;f=null,p({type:"tour-stopped",annotationCount:A,durationMs:d(R),reason:C})};return{setSelectedPart:b,viewPart:w,setActiveVariants:M,chooseVariant:y,startAR:E,endAR:v,startTour:C=>{!u()||C<=0||(P("restarted"),f={startedAt:n(),annotationCount:C},p({type:"tour-started",annotationCount:C}))},stopTour:P,completeTour:()=>{if(!f)return;let{startedAt:C,annotationCount:R}=f;f=null,p({type:"tour-completed",annotationCount:R,durationMs:d(C)})},interrupt:()=>{v("interrupted"),P("interrupted")},requestARLaunch:C=>p({type:"ar-launch-requested",channel:C})}}function Lb(e){let t=RC(e);t.current=e;let r=!!(e.onEngagement||e.debugEngagement),n=AC(()=>Db({modelUrl:e.modelUrl,tilesetUrl:e.tilesetUrl,getOptions:()=>t.current}),[e.modelUrl,e.tilesetUrl,r]);return EC(()=>()=>n.interrupt(),[n]),n}import{Color as kC}from"three";function Ob(e,t,r){let n=t[r]?.modelObjectId;return e.lighting.lights.filter(i=>{let o=i.attachment?.objectId;return o?io(t,o)===r||o===n:!1})}function _d(e,t){return e.lighting.lights.some(r=>t[r.id])?{...e,lighting:{...e.lighting,lights:e.lighting.lights.map(r=>t[r.id]?{...r,...t[r.id]}:r)}}:e}function Ib(e){let t=null;if(e?.traverse(i=>{if(t)return;let o=i.material;for(let a of Array.isArray(o)?o:o?[o]:[])if(a.emissive instanceof kC){t=a;return}}),!t)return{color:"#000000",intensity:0,on:!1};let r=`#${t.emissive.getHexString()}`,n=t.emissiveIntensity??1;return{color:r,intensity:n,on:r!=="#000000"&&n>0}}import{HexColorPicker as DC}from"react-colorful";import{Fragment as Bb,jsx as Gn,jsxs as wa}from"react/jsx-runtime";function jb({kind:e,color:t,brightness:r,onColorChange:n,onBrightnessChange:i,onClose:o}){return Gn("div",{className:"ri-popover ri-popover--inline",style:{padding:12},onPointerDown:a=>a.stopPropagation(),children:e==="change-light-color"?wa(Bb,{children:[Gn("p",{className:"ri-popoverLabel",children:"Light color"}),Gn(DC,{color:t,onChange:n}),wa("div",{className:"ri-inlineRow",children:[Gn("span",{className:"ri-colorCode",children:t}),Gn("button",{className:"ri-secondaryButton",onClick:o,children:"Done"})]})]}):wa(Bb,{children:[Gn("p",{className:"ri-popoverLabel",children:"Brightness"}),Gn("input",{type:"range",min:0,max:200,step:1,value:r,"aria-label":"Brightness",style:{width:"100%"},onChange:a=>i(Number(a.target.value))}),wa("div",{className:"ri-inlineRow",children:[wa("span",{className:"ri-colorCode",children:[r,"%"]}),Gn("button",{className:"ri-secondaryButton",onClick:o,children:"Done"})]})]})})}import{useRef as zC,useState as Fb}from"react";import{ArrowDown as LC,ArrowLeft as OC,ArrowRight as IC,ArrowUp as BC}from"lucide-react";import{useEffect as jC,useRef as Pd}from"react";function zb(e){let t=!1,r,n=()=>{t||(e(),t||(r=setTimeout(n,70)))};return e(),r=setTimeout(n,300),()=>{t=!0,clearTimeout(r)}}import{jsx as Ma,jsxs as Nb}from"react/jsx-runtime";function Vb({onNudge:e}){let t=me(),r=Pd(e);r.current=e;let n=Pd(null),i=Pd(null),o=()=>{n.current?.(),n.current=null,i.current=null};return jC(()=>{let a=l=>{l.pointerId===i.current&&o()},s=l=>{l.key==="Escape"&&o()};return window.addEventListener("pointerup",a,!0),window.addEventListener("pointercancel",a,!0),window.addEventListener("blur",o),window.addEventListener("keydown",s),()=>{o(),window.removeEventListener("pointerup",a,!0),window.removeEventListener("pointercancel",a,!0),window.removeEventListener("blur",o),window.removeEventListener("keydown",s)}},[]),Nb("div",{className:"ri-decalPosition",children:[Nb("div",{children:[Ma("div",{className:"ri-decalPosition__label",children:t("position")}),Ma("div",{className:"ri-decalPosition__hint",children:t("decalNudgeHint")})]}),Ma("div",{className:"ri-decalPosition__pad",role:"group","aria-label":t("decalNudgeControls"),children:[["up",BC],["left",OC],["right",IC],["down",LC]].map(([a,s])=>Ma("button",{type:"button",className:`ri-decalPosition__button ri-decalPosition__button--${a}`,"aria-label":t("moveDecal",{direction:t(a)}),title:t("moveDecalOnSurface",{direction:t(a)}),onPointerDown:l=>{l.button===0&&(l.preventDefault(),l.currentTarget.focus({preventScroll:!0}),o(),i.current=l.pointerId,n.current=zb(()=>r.current(a)))},onClick:l=>{l.detail===0&&r.current(a)},children:Ma(s,{size:16})},a))})]})}import{Fragment as Ub,jsx as ht,jsxs as Gr}from"react/jsx-runtime";var NC=e=>Math.round(e*180/Math.PI);function Gb({kind:e,decals:t,activeId:r,error:n,moving:i,defaultSize:o,onSelect:a,onAddText:s,onAddImage:l,onChange:u,onMove:d,onNudge:p,onRemove:c,onClose:h}){let m=me(),[g,f]=Fb(""),[b,w]=Fb("#ffffff"),y=zC(null),M=t.find(v=>v.id===r)??null;return Gr("div",{className:"ri-popover ri-popover--inline ri-decalControl",onPointerDown:v=>v.stopPropagation(),children:[e==="add-text"?Gr(Ub,{children:[ht("p",{className:"ri-popoverLabel",children:m("text")}),Gr("div",{className:"ri-decalControl__row",children:[ht("input",{className:"ri-decalControl__input",value:g,placeholder:m("yourText"),"aria-label":m("textToAdd"),onChange:v=>f(v.target.value)}),ht("input",{type:"color",className:"ri-decalControl__color",value:b,"aria-label":m("textColour"),onChange:v=>w(v.target.value)})]}),ht("button",{type:"button",className:"ri-uploadButton",disabled:!g.trim(),onClick:()=>{s(g.trim(),b)&&f("")},children:m("addText")})]}):Gr(Ub,{children:[ht("p",{className:"ri-popoverLabel",children:m("image")}),ht("button",{type:"button",className:"ri-uploadButton",onClick:()=>y.current?.click(),children:m("chooseImage")}),ht("input",{ref:y,type:"file",accept:"image/png,image/jpeg,image/webp,image/svg+xml",className:"ri-hiddenInput","aria-label":m("imageToAdd"),onChange:v=>{let P=v.target.files?.[0];v.target.value="",P&&l(P)}})]}),n?ht("div",{className:"ri-decalControl__hint",role:"alert",children:n}):null,t.length>0?ht("div",{className:"ri-decalControl__list",role:"group","aria-label":m("added"),children:t.map((v,P)=>ht("button",{type:"button",className:`ri-decalControl__chip ${v.id===r?"ri-decalControl__chip--active":""}`,"aria-pressed":v.id===r,onClick:()=>a(v.id),children:v.image?m("decalImage",{index:P+1}):v.text||m("decalText",{index:P+1})},v.id))}):null,M?Gr("div",{className:"ri-decalControl__editor",children:[ht(Vb,{onNudge:v=>p(M.id,v)}),M.image?null:Gr("div",{className:"ri-decalControl__row",children:[ht("input",{className:"ri-decalControl__input",value:M.text??"","aria-label":m("text"),onChange:v=>u(M.id,{text:v.target.value})}),ht("input",{type:"color",className:"ri-decalControl__color",value:M.color??"#ffffff","aria-label":m("colour"),onChange:v=>u(M.id,{color:v.target.value})})]}),Gr("label",{className:"ri-decalControl__slider",children:[ht("span",{children:m("size")}),ht("input",{type:"range",min:o/10,max:o*4,step:o/50,value:M.size,"aria-label":m("size"),onChange:v=>u(M.id,{size:Number(v.target.value)})})]}),Gr("label",{className:"ri-decalControl__slider",children:[ht("span",{children:m("turn")}),ht("input",{type:"range",min:-180,max:180,step:1,value:NC(M.rotation??0),"aria-label":m("rotation"),onChange:v=>u(M.id,{rotation:Number(v.target.value)*Math.PI/180})})]}),Gr("div",{className:"ri-inlineRow",children:[ht("button",{type:"button",className:"ri-secondaryButton","aria-pressed":i,title:m("dragTheDecalAcrossTheObjectsSurface"),onClick:()=>d(M.id),children:m("move")}),ht("button",{type:"button",className:"ri-removeButton",onClick:()=>c(M.id),children:m("remove")})]})]}):null,Gr("div",{className:"ri-inlineRow",children:[ht("span",{className:"ri-colorCode",children:t.length===0?m("noneAddedYet"):m("decalAdded",{count:t.length})}),ht("button",{type:"button",className:"ri-secondaryButton",onClick:h,children:m("done")})]})]})}import{useEffect as sT,useRef as lT}from"react";import{useThree as cT}from"@react-three/fiber";import{Mesh as uT,Raycaster as dT,Vector2 as Bd,Vector3 as ly}from"three";import{BufferGeometry as VC,CanvasTexture as FC,Float32BufferAttribute as Sl,Matrix4 as UC,Object3D as GC,SRGBColorSpace as HC,Uint16BufferAttribute as WC,Vector3 as cn}from"three";var XC=.5,Sa=4;function qC(e,t=0){let r=new cn(...e);r.lengthSq()<1e-12&&r.set(0,0,1),r.normalize();let n=new GC;return Math.abs(r.y)>.999&&n.up.set(0,0,-Math.sign(r.y)),n.lookAt(r),n.rotateZ(t),n.rotation.clone()}function $C(e,t,r){let n=null;if(e.bones&&t.bones){n=new Map;for(let[i,o]of e.bones)n.set(i,o*(1-r));for(let[i,o]of t.bones)n.set(i,(n.get(i)??0)+o*r)}return{position:e.position.clone().lerp(t.position,r),normal:e.normal.clone().lerp(t.normal,r),bones:n}}function Hb(e,t,r,n){let i=a=>n?a.position[t]<=r:a.position[t]>=r,o=[];for(let a=0;a<e.length;a++){let s=e[a],l=e[(a+1)%e.length],u=i(s);if(u&&o.push(s),u!==i(l)){let d=l.position[t]-s.position[t];o.push($C(s,l,(r-s.position[t])/d))}}return o}function Cl(e,t,r){let n=e.geometry,i=n.getAttribute("position");if(!i)return null;let o=n.getAttribute("normal"),a=n.getAttribute("skinIndex"),s=n.getAttribute("skinWeight"),l=!!(a&&s),u=n.getIndex(),d=Math.max(t.size,1e-6),p=d/(r>0&&Number.isFinite(r)?r:1),c=Math.max(d,p)*XC,h={x:d/2,y:p/2,z:c/2},m=new UC().makeRotationFromEuler(qC(t.normal,t.rotation)).setPosition(...t.position),g=m.clone().invert(),f=(N,D)=>{let V=null;if(l){V=new Map;for(let O=0;O<Sa;O++){let k=s.getComponent(N,O);if(k<=0)continue;let W=a.getComponent(N,O);V.set(W,(V.get(W)??0)+k)}}return{position:D.clone(),normal:o?new cn().fromBufferAttribute(o,N):new cn,bones:V}},b=[],w=[],y=[],M=[],E=[],v=new cn,P=new cn,T=new cn,_=N=>{if(y.push(.5+N.position.x/d,.5-N.position.y/p),v.copy(N.position).applyMatrix4(m),b.push(v.x,v.y,v.z),w.push(N.normal.x,N.normal.y,N.normal.z),!N.bones)return;let D=[...N.bones].sort((O,k)=>k[1]-O[1]).slice(0,Sa),V=D.reduce((O,[,k])=>O+k,0)||1;for(let O=0;O<Sa;O++)M.push(D[O]?.[0]??0),E.push((D[O]?.[1]??0)/V)},S=["x","y","z"],C=[new cn,new cn,new cn],R=[0,0,0],A=(u?u.count:i.count)/3;for(let N=0;N<A;N++){for(let O=0;O<3;O++){let k=N*3+O;R[O]=u?u.getX(k):k,C[O].fromBufferAttribute(i,R[O]).applyMatrix4(g)}if(S.some(O=>C[0][O]>h[O]&&C[1][O]>h[O]&&C[2][O]>h[O]||C[0][O]<-h[O]&&C[1][O]<-h[O]&&C[2][O]<-h[O]))continue;let D=C.map((O,k)=>f(R[k],O));if(!o){P.copy(D[1].position).sub(D[0].position),T.copy(D[2].position).sub(D[0].position);let O=P.cross(T).transformDirection(m);for(let k of D)k.normal.copy(O)}let V=D;for(let O of S)if(V=Hb(V,O,h[O],!0),V=Hb(V,O,-h[O],!1),V.length<3)break;for(let O=1;O+1<V.length;O++)_(V[0]),_(V[O]),_(V[O+1])}if(b.length===0)return null;let B=new VC;return B.setAttribute("position",new Sl(b,3)),B.setAttribute("normal",new Sl(w,3)),B.setAttribute("uv",new Sl(y,2)),l&&(B.setAttribute("skinIndex",new WC(M,Sa)),B.setAttribute("skinWeight",new Sl(E,Sa))),B}function Xb(e){return JSON.stringify([e.image??null,e.image?null:[e.text??"",e.color,e.fontFamily,e.fontWeight],e.position,e.normal,e.size,e.rotation??0])}var Wb=256,Ed=24;function qb(e){let t=`${e.fontWeight??"bold"} ${Wb-Ed*2}px ${e.fontFamily||"sans-serif"}`,r=document.createElement("canvas"),n=r.getContext("2d");n.font=t;let i=e.text||" ";r.width=Math.min(Math.max(Math.ceil(n.measureText(i).width)+Ed*2,8),4096),r.height=Wb,n.font=t,n.textAlign="center",n.textBaseline="middle",n.fillStyle=e.color??"#ffffff",n.fillText(i,r.width/2,r.height/2,r.width-Ed);let o=new FC(r);return o.flipY=!1,o.colorSpace=HC,{texture:o,aspect:r.width/r.height}}import{useEffect as ny,useRef as JC}from"react";import{BufferGeometry as ZC,Float32BufferAttribute as eT,Mesh as tT,MeshStandardMaterial as rT,SkinnedMesh as nT,SRGBColorSpace as oy}from"three";import{CanvasTexture as $b,Color as Yb,ImageLoader as YC,NoColorSpace as _l,RepeatWrapping as Tl,SRGBColorSpace as Dd,Texture as KC}from"three";var go=new Map,un={color:"#93c5fd",intensity:.07},wi=new Yb(un.color).multiplyScalar(un.intensity),Kb=new Yb(un.color),Qb=.28,bo=new Map,kd=new Map;function QC(e){return`${e.name}|${e.size}|${e.lastModified}`}function eI(e){let t=QC(e),r=e.name.lastIndexOf("."),n=r>0?e.name.slice(0,r):e.name,i=r>0?e.name.slice(r):"",o=`materials/${e.name}`,a=2;for(;;){let s=kd.get(o);if(s===void 0||s===t)return kd.set(o,t),o;o=`materials/${n}-${a}${i}`,a+=1}}function Jb(e){return bo.get(e)}function Zb(e,t){let r=++e.loadGeneration;e.loaded=!1;let n=()=>{if(e.loadGeneration!==r)return;e.loaded=!0;let i=e.pending;e.pending=[];for(let o of i)o()};new YC().load(t,i=>{e.loadGeneration===r&&(e.texture.image=i,e.texture.needsUpdate=!0,n())},void 0,()=>{e.loadGeneration===r&&(console.warn(`Failed to load texture: ${t}`),n())})}function ey(e,t){for(let r of[Dd,_l]){let n=go.get(Ca(e,r));n&&Zb(n,t)}}function tI(e,t){let r=bo.get(e);r&&r!==t&&r.startsWith("blob:")&&URL.revokeObjectURL(r),bo.set(e,t),ey(e,t)}function rI(e){let t=bo.get(e);t&&(t.startsWith("blob:")&&URL.revokeObjectURL(t),bo.delete(e),kd.delete(e),ey(e,e))}function Ca(e,t){return`${t}|${e}`}function Ta(e,t=_l,r){let n=Ca(e,t),i=go.get(n);if(i)return r&&!i.loaded&&i.pending.push(r),i.texture;let o=bo.get(e)??e,a={texture:new KC,refCount:0,loaded:!1,pending:r?[r]:[],loadGeneration:0};return a.texture.flipY=!1,a.texture.colorSpace=t,go.set(n,a),Zb(a,o),a.texture}function yo(e,t=_l,r){let n=Ta(e,t,r);return go.get(Ca(e,t)).refCount+=1,n}function dn(e,t=_l){let r=go.get(Ca(e,t));r&&(r.refCount-=1,r.refCount<=0&&(r.loadGeneration+=1,r.pending=[],r.texture.dispose(),go.delete(Ca(e,t))))}function Pl(e,t,r,n,i,o=1,a=0){let s=e.offsetTextures??(e.offsetTextures={}),l=s[t],u=l;if(!u||u.sourcePath!==n||u.base!==r){l?.texture.dispose();let p=r.clone();p.wrapS=Tl,p.wrapT=Tl,p.center.set(.5,.5),p.needsUpdate=!0,u={texture:p,sourcePath:n,base:r},s[t]=u}let d=o>0?o:1;return u.texture.offset.set(i[0],i[1]),u.texture.repeat.set(1/d,1/d),u.texture.rotation=a,u.texture}function El(e,t){let r=e.offsetTextures,n=r?.[t];n&&(n.texture.dispose(),delete r[t])}function ty(e){let t=e.offsetTextures;if(t){for(let r of Object.values(t))r.texture.dispose();delete e.offsetTextures}}var Ad=null;function Al(){if(Ad)return Ad;let e=256,t=document.createElement("canvas");t.width=e,t.height=e;let r=t.getContext("2d"),n=r.createRadialGradient(e*.35,e*.35,e*.02,e*.5,e*.5,e*.55);n.addColorStop(0,"#ffffff"),n.addColorStop(.4,"#b5b5b5"),n.addColorStop(1,"#3a3a3a"),r.fillStyle=n,r.fillRect(0,0,e,e);let i=new $b(t);return i.colorSpace=Dd,Ad=i,i}var Rd=null;function ry(){if(Rd)return Rd;let e=1024,t=8,r=e/t,n=["#ef4444","#f59e0b","#22c55e","#6366f1"],i=document.createElement("canvas");i.width=e,i.height=e;let o=i.getContext("2d");o.textAlign="center",o.textBaseline="middle";for(let s=0;s<t;s+=1)for(let l=0;l<t;l+=1){let u=l*r,d=s*r,p=(Math.floor(l/2)+Math.floor(s/2))%4;o.fillStyle=n[p],o.fillRect(u,d,r,r),o.strokeStyle="rgba(0, 0, 0, 0.28)",o.lineWidth=2;for(let w=1;w<4;w+=1){let y=w*r/4;o.beginPath(),o.moveTo(u+y,d),o.lineTo(u+y,d+r),o.moveTo(u,d+y),o.lineTo(u+r,d+y),o.stroke()}o.strokeStyle="#09090b",o.lineWidth=7,o.strokeRect(u,d,r,r);let c=u+r*.23,h=d+r*.72,m=u+r*.72,g=d+r*.23;o.lineCap="round",o.lineJoin="round",o.beginPath(),o.moveTo(c,h),o.lineTo(m,g),o.lineTo(m-r*.2,g),o.moveTo(m,g),o.lineTo(m,g+r*.2),o.stroke();let f=s*t+l+1;o.font=`700 ${Math.round(r*.2)}px ui-monospace, SFMono-Regular, Menlo, monospace`,o.fillStyle="#ffffff",o.strokeStyle="rgba(0, 0, 0, 0.85)",o.lineWidth=6;let b=String(f).padStart(2,"0");o.strokeText(b,u+r/2,d+r*.82),o.fillText(b,u+r/2,d+r*.82)}let a=new $b(i);return a.colorSpace=Dd,a.wrapS=Tl,a.wrapT=Tl,a.flipY=!1,a.anisotropy=8,a.needsUpdate=!0,Rd=a,a}var Mi="riDecal",Id="riDecalId";function Ld(){return new ZC().setAttribute("position",new eT([],3))}function iy(e){let t=e.image;return t?.width&&t.height?t.width/t.height:1}function Od(e){e.disposed=!0,e.node.remove(e.mesh),e.mesh.geometry.dispose(),e.mesh.material.dispose(),e.imagePath&&dn(e.imagePath,oy),e.ownTexture?.dispose()}function iT(e,t,r,n){let i=new rT({transparent:!0,polygonOffset:!0,polygonOffsetFactor:-4,depthWrite:!1,metalness:0,roughness:.7}),o=ur(e)&&e.skeleton?e:null,a=o?new nT(Ld(),i):new tT(Ld(),i);if(o){let u=a;u.bind(o.skeleton,o.bindMatrix),u.frustumCulled=!1,u.onBeforeRender=()=>{let d=og(o);d&&u.bindMatrixInverse.copy(d)}}a.userData[Mi]=!0,a.userData[Id]=t.id,a.raycast=()=>{},a.castShadow=!1,a.receiveShadow=!0,a.renderOrder=1;let s={node:e,mesh:a,signature:r,disposed:!1},l=u=>{let d=Cl(e,t,u);a.geometry.dispose(),a.geometry=d??Ld(),a.visible=d!==null};if(t.image){s.imagePath=t.image;let u=yo(t.image,oy,()=>{s.disposed||(l(iy(u)),i.needsUpdate=!0,n())});i.map=u,l(iy(u))}else{let{texture:u,aspect:d}=qb(t);s.ownTexture=u,i.map=u,l(d)}return e.add(a),s}function ay({objectBindings:e,nodeMap:t,invalidate:r}){let n=JC(new Map);ny(()=>{let i=n.current,o=new Set;for(let[a,s]of Object.entries(e)){if(!s.decals?.length)continue;let l=t[s.modelObjectId??a];if(Et(l))for(let u of s.decals){if(!u.image&&!u.text)continue;let d=`${a}
|
|
2
|
+
${u.id}`,p=Xb(u),c=i.get(d);c&&(c.node!==l||c.signature!==p)&&(Od(c),c=void 0),c||(c=iT(l,u,p,r),i.set(d,c)),c.mesh.material.opacity=(u.opacity??1)*(s.style?.material?.opacity??1),o.add(d)}}for(let[a,s]of i)o.has(a)||(Od(s),i.delete(a));r()},[e,t,r]),ny(()=>{let i=n.current;return()=>{for(let o of i.values())Od(o);i.clear()}},[])}import{Mesh as oT,SkinnedMesh as aT}from"three";function sy(e,t){let r=[];if(ur(e)){let n=e;n.computeBoundingSphere(),n.computeBoundingBox(),aT.prototype.raycast.call(n,t,r)}else oT.prototype.raycast.call(e,t,r);return r.sort((n,i)=>n.distance-i.distance)[0]}function cy({target:e,nodes:t,controls:r}){let{camera:n,gl:i,invalidate:o}=cT(),a=lT(e);return a.current=e,sT(()=>{let s=i.domElement,l=new dT,u=new Bd,d=s.style.cursor,p=s.style.touchAction;s.style.cursor="grab",s.style.touchAction="none";let c=0,h=null,m=null,g=(P,T=new Bd)=>{let _=s.getBoundingClientRect();u.set((P.clientX-_.left-T.x)/_.width*2-1,-((P.clientY-_.top-T.y)/_.height)*2+1),l.setFromCamera(u,n)},f=P=>{if(!m)return;g(P,m.offset),m.node.updateWorldMatrix(!0,!1);let T=l.intersectObject(m.node,!1)[0];if(!T)return;let _=vi({...T,ray:l.ray},m.node),S=Cl(m.node,{...m.decal,..._},m.aspect);S&&(m.mesh.geometry!==m.geometry&&m.mesh.geometry.dispose(),m.mesh.geometry=S,m.surface=_,o())},b=P=>{if(!m)return;cancelAnimationFrame(c),c=0,h=null;let T=m;m=null,T.mesh.geometry!==T.geometry&&(P&&T.surface?T.geometry.dispose():(T.mesh.geometry.dispose(),T.mesh.geometry=T.geometry)),T.controller&&(T.controller.enabled=T.controlsEnabled),s.hasPointerCapture(T.pointerId)&&s.releasePointerCapture(T.pointerId),s.style.cursor="grab",o();let _=()=>{window.removeEventListener("click",S,!0),window.removeEventListener("pointerdown",_,!0),clearTimeout(C)},S=R=>{R.target===s&&(R.preventDefault(),R.stopImmediatePropagation()),_()},C=setTimeout(_,300);window.addEventListener("click",S,!0),window.addEventListener("pointerdown",_,!0),P&&T.surface&&a.current.onCommit(T.surface)},w=P=>{if(P.button!==0||m)return;let T=a.current,_=t.current[T.objectId];if(!(_ instanceof uT)||!_.visible)return;let S=_.children.find(O=>O.userData[Mi]&&O.userData[Id]===T.decal.id);if(!S?.visible)return;_.updateWorldMatrix(!0,!0),g(P);let C=sy(S,l),R=l.intersectObject(_,!1)[0];if(!C||!R||C.distance>R.distance+1e-4)return;let A=new ly;if(ur(S)){let O=new ly,k=S.geometry.getAttribute("position").count;if(!k)return;for(let W=0;W<k;W++)A.add(S.getVertexPosition(W,O));A.divideScalar(k).applyMatrix4(S.matrixWorld)}else A.fromArray(T.decal.position).applyMatrix4(_.matrixWorld);A.project(n);let B=s.getBoundingClientRect(),N=new Bd(P.clientX-(B.left+(A.x+1)/2*B.width),P.clientY-(B.top+(1-A.y)/2*B.height)),D=S.material.map?.image,V=r.current;m={pointerId:P.pointerId,node:_,mesh:S,geometry:S.geometry,decal:T.decal,surface:null,offset:N,aspect:D?.width&&D.height?D.width/D.height:1,controller:V,controlsEnabled:V?.enabled??!1},V&&(V.enabled=!1),P.preventDefault(),P.stopImmediatePropagation(),s.setPointerCapture(P.pointerId),s.style.cursor="grabbing"},y=P=>{!m||P.pointerId!==m.pointerId||(P.preventDefault(),P.stopImmediatePropagation(),h=P,c||(c=requestAnimationFrame(()=>{c=0,h&&f(h)})))},M=P=>{!m||P.pointerId!==m.pointerId||(P.preventDefault(),P.stopImmediatePropagation(),h&&f(h),b(!0))},E=()=>b(!1),v=P=>{P.key==="Escape"&&(b(!1),a.current.onCancel())};return s.addEventListener("pointerdown",w,!0),window.addEventListener("pointermove",y,{capture:!0,passive:!1}),window.addEventListener("pointerup",M,!0),window.addEventListener("pointercancel",E),window.addEventListener("blur",E),window.addEventListener("keydown",v),s.addEventListener("lostpointercapture",E),()=>{b(!1),s.style.cursor=d,s.style.touchAction=p,s.removeEventListener("pointerdown",w,!0),window.removeEventListener("pointermove",y,!0),window.removeEventListener("pointerup",M,!0),window.removeEventListener("pointercancel",E),window.removeEventListener("blur",E),window.removeEventListener("keydown",v),s.removeEventListener("lostpointercapture",E)}},[n,i,o,t,r,e.objectId,e.decal]),null}import{useCallback as Ea,useEffect as MT,useState as Aa}from"react";import{GLTFExporter as pT}from"three-stdlib";function _a(e,t){let r=URL.createObjectURL(e),n=document.createElement("a");n.href=r,n.download=t,n.style.display="none";try{document.body.appendChild(n),n.click()}finally{n.remove(),window.setTimeout(()=>{URL.revokeObjectURL(r)},1e3)}}function jd({sources:e,downloadFilename:t,onComplete:r}){import("three").then(({Group:n,Mesh:i})=>{let o=new n;for(let{scene:s,objectBindings:l,matRefs:u}of e){s.updateMatrixWorld(!0);let d=new Map;for(let[c,h]of Object.entries(l))d.set(h.modelObjectId??c,c);let p=c=>{let h=c;for(;h;){let m=h.name||h.uuid,g=d.get(m)??m,f=l[g];if(f?f.visible===!1:h.visible===!1)return!1;h=h.parent}return!0};s.traverse(c=>{let h=c;if(!h.isMesh||!h.geometry)return;let m=h.name||h.uuid,g=d.get(m)??m,f=u[g]??h.material;if(!f)return;let b=ur(h),w=b?ag(h):h.geometry,y=b?sg(h):h.matrixWorld,M=new i(w,f);M.name=m,M.matrix.copy(y),M.matrixAutoUpdate=!1,M.visible=p(h),o.add(M)})}new pT().parse(o,s=>{let l=s instanceof ArrayBuffer?new Blob([s],{type:"model/gltf-binary"}):new Blob([JSON.stringify(s)],{type:"model/gltf+json"}),u=s instanceof ArrayBuffer?".glb":".gltf";_a(l,`${t}${u}`),r()},s=>{console.error("GLTFExporter error:",s),r()},{binary:!0,onlyVisible:!0})})}import{strToU8 as mT}from"fflate";import{zip as hT}from"fflate";function uy(e,t=6){return new Promise((r,n)=>{hT(e,{level:t},(i,o)=>{i?n(i):r(o)})})}var Pa=2048,dy=["#00e5ff","#ff4fd8","#ffe45e","#7cff6b","#ff784f","#a78bfa","#38bdf8","#fb7185"];function py(e){return e.split("&").join("&").split("<").join("<").split(">").join(">").split('"').join(""").split("'").join("'")}function Vd(e,t){return e.normalize("NFKD").replace(/[\u0300-\u036f]/g,"").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||t}function my(e){return Vd(e,"model")}function zd(e,t){return e.index?Math.round(e.index.getX(t)):t}function fT(e,t,r){let n=zd(e,r),i=zd(e,r+1),o=zd(e,r+2);if(n>=t.count||i>=t.count||o>=t.count)return null;let a=[{index:n,u:t.getX(n),v:t.getY(n)},{index:i,u:t.getX(i),v:t.getY(i)},{index:o,u:t.getX(o),v:t.getY(o)}];return a.every(s=>Number.isFinite(s.u)&&Number.isFinite(s.v))?a:null}function hy(e){return`${e.u.toFixed(6)},${e.v.toFixed(6)}`}function Nd(e,t,r,n){let i,o;n?(i=t.index,o=r.index):(i=hy(t),o=hy(r));let a=i<o?`${i}|${o}`:`${o}|${i}`,s=e.get(a);s?s.count+=1:e.set(a,{count:1,start:t,end:r})}function gT(e,t,r){Nd(e,t[0],t[1],r),Nd(e,t[1],t[2],r),Nd(e,t[2],t[0],r)}function bT(e,t){return Array.isArray(e)?e[t]??null:e}function yT(e){let t=new Map,r=0,n=0,i=0;return e.traverse(o=>{let a=o;if(!a.isMesh||!a.geometry||!a.material)return;let s=a.geometry,l=s.getAttribute("uv");if(!l||l.itemSize<2||l.count<3)return;r+=1;let u=a.name||`Mesh ${r}`,d=s.index?.count??l.count,p=s.groups.length>0?s.groups:[{start:0,count:d,materialIndex:0}];for(let c of p){let h=c.materialIndex??0,m=bT(a.material,h);if(!m)continue;let g=t.get(m.uuid);g||(n+=1,g={name:m.name||`Material ${n}`,layers:new Map},t.set(m.uuid,g));let f=g.layers.get(a.uuid);f||(f={name:u,color:dy[i%dy.length],edges:new Map},i+=1,g.layers.set(a.uuid,f));let b=Math.max(0,c.start),w=Math.min(d,b+c.count);for(let y=b;y+2<w;y+=3){let M=fT(s,l,y);M&&gT(f.edges,M,!!s.index)}}}),[...t.values()].filter(o=>[...o.layers.values()].some(a=>a.edges.size>0))}function Rl(e){return(e*Pa).toFixed(2)}function xT(e){return`M${Rl(e.start.u)} ${Rl(1-e.start.v)}L${Rl(e.end.u)} ${Rl(1-e.end.v)}`}function vT(e){let t=py(e.name),r=[...e.layers.values()].filter(n=>n.edges.size>0).map((n,i)=>{let o=py(n.name),a=`${Vd(n.name,"mesh")}-${i+1}`,s=[...n.edges.values()],l=s.filter(p=>p.count===1),d=(l.length>0?l:s).map(xT).join("");return[` <g id="${a}" data-mesh="${o}" fill="none" stroke="${n.color}"`,' stroke-width="1" stroke-linejoin="round" vector-effect="non-scaling-stroke">',` <title>${o}</title>`,` <path d="${d}"/>`," </g>"].join(`
|
|
3
|
+
`)}).join(`
|
|
4
|
+
`);return['<?xml version="1.0" encoding="UTF-8"?>',`<svg xmlns="http://www.w3.org/2000/svg" width="${Pa}" height="${Pa}" viewBox="0 0 ${Pa} ${Pa}">`,` <title>${t} UV layout</title>`," <desc>UV0 island-outline template exported by React Immersive. The SVG canvas maps to the complete 0\u20131 texture area.</desc>",' <rect width="2048" height="2048" fill="none" stroke="#94a3b8" stroke-width="2"/>',r,"</svg>"].join(`
|
|
5
|
+
`)}function wT(e){let t=[],r=new Set;return e.forEach((n,i)=>{let o=yT(n.scene);if(o.length===0)return;let a=my(n.label||`model-${i+1}`);o.forEach((s,l)=>{let u=Vd(s.name,`material-${l+1}`),d=o.length===1?`${a}-uv-layout.svg`:`${a}-uv-${u}-${l+1}.svg`;if(r.has(d)){let p=d.replace(/\.svg$/,""),c=2;for(;r.has(`${p}-${c}.svg`);)c+=1;d=`${p}-${c}.svg`}r.add(d),t.push({filename:d,materialName:s.name,meshCount:[...s.layers.values()].filter(p=>p.edges.size>0).length,svg:vT(s)})})}),t}async function Fd(e,t="model"){let r=wT(e);if(r.length===0)return r;if(r.length===1)return _a(new Blob([r[0].svg],{type:"image/svg+xml;charset=utf-8"}),r[0].filename),r;let n=Object.fromEntries(r.map(o=>[o.filename,mT(o.svg)])),i=await uy(n);return _a(new Blob([i],{type:"application/zip"}),`${my(t)}-uv-layouts.zip`),r}async function fy(e,t="model"){return Fd([{scene:e,label:t}],t)}function gy({sceneRef:e,materialRefs:t,rendererCaptureRef:r,objectBindings:n,downloadFilename:i,getAllLoadedModels:o,getAllLoadedModelUvSources:a,captureVideo:s}){let[l,u]=Aa(!1),[d,p]=Aa(!1),[c,h]=Aa(null),[m,g]=Aa(null),[f,b]=Aa("auto");MT(()=>{if(!d)return;let P=()=>p(!1);return window.addEventListener("pointerdown",P),()=>window.removeEventListener("pointerdown",P)},[d]);let w=Ea(()=>{h(null),g(null),p(P=>!P)},[]),y=Ea(()=>{let P=o?.()??null;if(P&&P.length>0){p(!1),u(!0),jd({sources:P,downloadFilename:i,onComplete:()=>u(!1)});return}let T=e.current;T&&(p(!1),u(!0),jd({sources:[{scene:T,objectBindings:n,matRefs:t.current??{}}],downloadFilename:i,onComplete:()=>u(!1)}))},[i,t,n,e,o]),M=Ea(()=>{p(!1),yl(r.current).then(P=>{let T=document.createElement("a");T.href=P,T.download=`${i}.png`,document.body.appendChild(T),T.click(),document.body.removeChild(T)}).catch(P=>{console.error("Screenshot failed:",P)})},[i,r]),E=Ea(async()=>{let P=a?.()??null;try{let T;if(P&&P.length>0)T=await Fd(P,i);else{let _=e.current;if(!_)return;T=await fy(_,i)}if(T.length===0){h("This model does not contain UV coordinates.");return}h(null),p(!1)}catch(T){console.error("UV layout export failed:",T),h("Could not create the UV layout archive.")}},[i,e,a]),v=Ea(async P=>{p(!1),g(null);try{let T=await s({mode:P,format:f}),_=T.type==="image/gif"?"gif":T.type.startsWith("video/mp4")?"mp4":"webm",S=URL.createObjectURL(T),C=document.createElement("a");C.href=S,C.download=`${i}-${P}.${_}`,document.body.appendChild(C);try{C.click()}finally{C.remove(),setTimeout(()=>URL.revokeObjectURL(S),1e3)}}catch(T){if(T instanceof DOMException&&T.name==="AbortError")return;g(T instanceof Error?T.message:"Could not export the video."),p(!0)}},[s,i,f]);return{isDownloading:l,downloadMenuOpen:d,uvExportError:c,toggleDownloadMenu:w,handleDownloadMesh:y,handleDownloadScreenshot:M,handleDownloadUvLayout:E,handleDownloadVideo:v,videoFormat:f,setVideoFormat:b,videoExportError:m}}import{useCallback as nr,useEffect as Ra,useRef as Ol,useReducer as IT,useState as xo}from"react";import{Box3 as Ay,Raycaster as BT,Vector2 as Hd,Vector3 as Wd}from"three";import{BufferGeometry as ST,Float32BufferAttribute as CT,Matrix4 as yy,Mesh as Ud,ShapeUtils as TT,Vector2 as xy,Vector3 as ct,Vector4 as _T}from"three";function kl(e){if(e.length!==3)return null;let t=new ct(...e[0]).sub(new ct(...e[1])),r=new ct(...e[2]).sub(new ct(...e[1]));return t.lengthSq()===0||r.lengthSq()===0?null:Math.acos(Math.max(-1,Math.min(1,t.normalize().dot(r.normalize()))))*180/Math.PI}function vy(e,t){if(!e.normal)return null;let r=new ct(...e.normal);if(r.lengthSq()===0)return null;r.normalize();let n=new ct(...t),i=n.clone().sub(new ct(...e.position)).dot(r);return{distance:Math.abs(i),projection:n.addScaledVector(r,-i).toArray()}}function Dl(e){if(e.length<3)return{error:"Pick at least three points to finish the area."};let t=new ct(...e[0]),r=e.map(f=>new ct(...f).sub(t)),n=Math.max(...r.map(f=>f.length()));if(n===0)return{error:"Area points must be distinct."};let i=new ct;for(let f=1;f<r.length-1;f+=1){let b=r[f].clone().cross(r[f+1]);b.lengthSq()>i.lengthSq()&&i.copy(b)}if(i.length()<=n*n*1e-10)return{error:"Area points must not lie on one straight line."};i.normalize();let o=Math.max(n*1e-5,Number.EPSILON*Math.max(...e.flat().map(Math.abs))*32);if(r.some(f=>Math.abs(f.dot(i))>o))return{error:"Area points must lie on one plane."};let a=r.find(f=>f.length()>n*1e-10).clone().normalize(),s=i.clone().cross(a).normalize(),l=r.map(f=>new xy(f.dot(a),f.dot(s))),u=(f,b,w)=>(b.x-f.x)*(w.y-f.y)-(b.y-f.y)*(w.x-f.x),d=n*n*1e-10,p=(f,b,w)=>Math.abs(u(f,b,w))<=d&&w.x>=Math.min(f.x,b.x)-n*1e-10&&w.x<=Math.max(f.x,b.x)+n*1e-10&&w.y>=Math.min(f.y,b.y)-n*1e-10&&w.y<=Math.max(f.y,b.y)+n*1e-10;for(let f=0;f<l.length;f+=1){let b=l[f],w=l[(f+1)%l.length];if(b.distanceTo(w)<=n*1e-10)return{error:"Area points must be distinct."};for(let y=f+1;y<l.length;y+=1){if(y===f+1||f===0&&y===l.length-1)continue;let M=l[y],E=l[(y+1)%l.length],v=u(b,w,M),P=u(b,w,E),T=u(M,E,b),_=u(M,E,w);if(v*P<0&&T*_<0||p(b,w,M)||p(b,w,E)||p(M,E,b)||p(M,E,w))return{error:"Area edges must not cross or touch each other."}}}let c=0,h=0,m=0;for(let f=0;f<l.length;f+=1){let b=l[f],w=l[(f+1)%l.length],y=b.x*w.y-w.x*b.y;c+=y,h+=(b.x+w.x)*y,m+=(b.y+w.y)*y}if(Math.abs(c)<=d)return{error:"The polygon has no measurable area."};let g=t.clone().addScaledVector(a,h/(3*c)).addScaledVector(s,m/(3*c));return{area:Math.abs(c)/2,center:g.toArray(),triangles:TT.triangulateShape(l,[])}}function Gd(e,t){if(e.length<2)return 0;let r=0;for(let n=1;n<e.length;n+=1)r+=new ct(...e[n]).distanceTo(new ct(...e[n-1]));return t&&(r+=new ct(...e[e.length-1]).distanceTo(new ct(...e[0]))),r}var PT=1e-5;function ET(e,t){let r=e.getAttribute("position"),n=e.getIndex(),i=r.count,o=Math.max(t,1e-9),a=(m,g,f)=>`${Math.round(m/o)}_${Math.round(g/o)}_${Math.round(f/o)}`,s=new Int32Array(i),l=[],u=new Map;for(let m=0;m<i;m+=1){let g=r.getX(m),f=r.getY(m),b=r.getZ(m),w=a(g,f,b),y=u.get(w);y===void 0&&(y=l.length,l.push(new ct(g,f,b)),u.set(w,y)),s[m]=y}let d=l.map(()=>new Map),p=(m,g)=>{if(m===g)return;let f=l[m].distanceTo(l[g]);d[m].has(g)||d[m].set(g,f),d[g].has(m)||d[g].set(m,f)},c=(n?n.count:i)/3,h=m=>n?n.getX(m):m;for(let m=0;m<c;m+=1)p(s[h(m*3)],s[h(m*3+1)]),p(s[h(m*3+1)],s[h(m*3+2)]),p(s[h(m*3+2)],s[h(m*3)]);return{weldedId:s,weldedPosition:l,neighbors:d}}function AT(e,t,r){let n=new Map([[t,0]]),i=[t];for(let o=0;o<r&&i.length>0;o+=1){let a=[];for(let s of i){let l=n.get(s)??0;for(let[u,d]of e[s]??[])n.has(u)||(n.set(u,l+d),a.push(u))}i=a}return n}function RT(e){let r=(Math.abs(e.y)<.9?new ct(0,1,0):new ct(1,0,0)).clone().cross(e).normalize(),n=e.clone().cross(r).normalize();return[r,n]}function kT(e,t,r){let[n,i]=RT(t),o=0,a=0,s=0;for(let g of r){let f=g.clone().sub(e),b=f.dot(n),w=f.dot(i);o+=b*b,a+=b*w,s+=w*w}let l=o+s,u=o*s-a*a,d=Math.sqrt(Math.max(0,l*l/4-u)),p=l/2+d,c=1,h=0;Math.abs(a)>1e-12?(c=p-s,h=a):s>o&&(c=0,h=1);let m=Math.hypot(c,h)||1;return n.clone().multiplyScalar(c/m).add(i.clone().multiplyScalar(h/m)).normalize()}function DT(e,t,r,n){let i=e.getAttribute("position"),o=e.getIndex(),a=i.count,s=(o?o.count:a)/3,l=c=>o?o.getX(c):c,u=c=>new ct(i.getX(c),i.getY(c),i.getZ(c)).applyMatrix4(t),d=c=>c.clone().sub(r).dot(n),p=[];for(let c=0;c<s;c+=1){let h=u(l(c*3)),m=u(l(c*3+1)),g=u(l(c*3+2)),f=d(h),b=d(m),w=d(g),y=[],M=(E,v,P,T)=>{v>0!=T>0&&y.push(E.clone().lerp(P,v/(v-T)))};M(h,f,m,b),M(m,b,g,w),M(g,w,h,f),y.length===2&&p.push([y[0],y[1]])}return p}function LT(e,t){let r=Math.max(t,1e-9),n=c=>`${Math.round(c.x/r)}_${Math.round(c.y/r)}_${Math.round(c.z/r)}`,i=new Map,o=[],a=c=>{let h=n(c),m=i.get(h);return m===void 0&&(m=o.length,o.push(c),i.set(h,m)),m},s=[],l=c=>{for(;s.length<=c;)s.push(new Map)};for(let[c,h]of e){let m=a(c),g=a(h);m!==g&&(l(m),l(g),s[m].set(g,(s[m].get(g)??0)+1),s[g].set(m,(s[g].get(m)??0)+1))}let u=(c,h)=>c<h?`${c}_${h}`:`${h}_${c}`,d=new Set,p=[];for(let c=0;c<s.length;c+=1)for(let h of s[c]?.keys()??[]){if(d.has(u(c,h)))continue;let m=[c],g=c,f=h;d.add(u(g,f));let b=0;for(;f!==c&&f>=0&&b<s.length+4;){m.push(f);let w=[...s[f].keys()].filter(M=>M!==g),y;if(w.length<=1)y=w[0];else{let M=o[f].clone().sub(o[g]).normalize(),E=-1/0;for(let v of w){let P=o[v].clone().sub(o[f]).normalize(),T=M.dot(P);T>E&&(E=T,y=v)}}if(y===void 0){f=-1;break}d.add(u(f,y)),g=f,f=y,b+=1}f===c&&m.length>=3&&p.push(m.map(w=>o[w]))}return p}function by(e,t){let r=1/0;for(let n of e)r=Math.min(r,n.distanceTo(t));return r}function OT(e,t){let r=0,n=1/0;return e.forEach((i,o)=>{let a=i.distanceTo(t);a<n&&(n=a,r=o)}),[...e.slice(r),...e.slice(0,r)]}function wy(e,t,r,n,i){let o=DT(e,t,n,i);if(o.length===0)return{error:"Couldn't trace a loop around this point."};let a=LT(o,r*t.getMaxScaleOnAxis());if(a.length===0)return{error:"The surface here doesn't form a closed loop around this point (it may be near an open edge)."};let s=a[0],l=by(s,n);for(let d of a.slice(1)){let p=by(d,n);p<l&&(l=p,s=d)}let u=OT(s,n).map(d=>d.toArray());return{points:u,length:Gd(u,!0)}}function My(e){if(!(e.object instanceof Ud)||!e.face)return null;let t=e.object,r=t.geometry;if(t.isSkinnedMesh||t.morphTargetInfluences?.some(o=>o!==0)){let o=r.getAttribute("position"),a=new CT(new Float32Array(o.count*3),3),s=new ct;for(let l=0;l<o.count;l++)t.getVertexPosition(l,s),a.setXYZ(l,s.x,s.y,s.z);r=new ST().setAttribute("position",a).setIndex(r.getIndex())}let n=t.matrixWorld.clone();if(e.instanceId!==void 0&&"getMatrixAt"in t){let o=new yy;t.getMatrixAt(e.instanceId,o),n.multiply(o)}r.computeBoundingSphere();let i=r.boundingSphere&&r.boundingSphere.radius>0?r.boundingSphere.radius:1;return{face:e.face,geometry:r,matrix:n,weldTolerance:i*PT}}function Sy(e,t=6){let r=My(e);if(!r)return{error:"Pick a point on the mesh surface to trace a loop around it."};let{face:n,geometry:i,matrix:o,weldTolerance:a}=r,s=Ty(e);if(!s)return{error:"Pick a point on the mesh surface to trace a loop around it."};let l=s[1].clone().sub(s[0]).cross(s[2].clone().sub(s[0]));if(l.lengthSq()===0)return{error:"Couldn't determine the surface direction at this point."};l.normalize();let{weldedId:u,weldedPosition:d,neighbors:p}=ET(i,a),c=i.getAttribute("position"),h=e.point.clone().applyMatrix4(o.clone().invert()),m=[n.a,n.b,n.c],g=m[0],f=1/0;for(let v of m){let T=new ct(c.getX(v),c.getY(v),c.getZ(v)).distanceTo(h);T<f&&(f=T,g=v)}let b=u[g],w=d[b].clone().applyMatrix4(o),y=AT(p,b,t),M=[];for(let v of y.keys())M.push(d[v].clone().applyMatrix4(o));if(M.length<6)return{error:"Not enough surface detail near this point to trace a loop. Try a different spot."};let E=kT(w,l,M);return wy(i,o,a,e.point.clone(),E)}function Cy(e,t=new ct(0,1,0)){let r=My(e);if(!r)return{error:"Pick a point on the mesh surface to trace a loop around it."};let{geometry:n,matrix:i,weldTolerance:o}=r,a=t.clone().normalize();return a.lengthSq()===0?{error:"Couldn't determine a horizontal direction."}:wy(n,i,o,e.point.clone(),a)}function Ty(e){if(!(e.object instanceof Ud)||!e.face)return null;let t=e.object,r=t.matrixWorld.clone();if(e.instanceId!==void 0&&"getMatrixAt"in t){let n=new yy;t.getMatrixAt(e.instanceId,n),r.multiply(n)}return[e.face.a,e.face.b,e.face.c].map(n=>t.getVertexPosition(n,new ct).applyMatrix4(r))}function _y(e){if(!(e.object instanceof Ud))return!1;for(let r=e.object;r;r=r.parent)if(!r.visible||r.userData.riEditorGizmo||r.userData.riDecal)return!1;return(Array.isArray(e.object.material)?e.object.material:[e.object.material])[e.face?.materialIndex??0]?.visible!==!1}function Py(e,t,r,n,i,o=12){let a=Ty(e),s=a?a[1].clone().sub(a[0]).cross(a[2].clone().sub(a[0])).normalize():null,l={position:e.point.toArray(),...s&&s.lengthSq()>0?{normal:s.toArray()}:{},...a?{faceVertices:a.map(c=>c.toArray())}:{}};if(!a||i==="none")return l;let u=c=>{let h=new _T(c.x,c.y,c.z,1).applyMatrix4(t.matrixWorldInverse).applyMatrix4(t.projectionMatrix);return h.w<=0||h.z/h.w<-1||h.z/h.w>1?null:{screen:new xy((h.x/h.w+1)*n.width/2,(1-h.y/h.w)*n.height/2),w:h.w}},d=a.map(u),p=o;if((i==="vertex"||i==="auto")&&(d.forEach((c,h)=>{let m=c?.screen.distanceTo(r)??1/0;m<=p&&(p=m,l.position=a[h].toArray(),l.snapped="vertex")}),l.snapped))return l;if(i==="edge"||i==="auto")for(let c=0;c<3;c+=1){let h=(c+1)%3,m=d[c],g=d[h];if(!m||!g)continue;let f=g.screen.clone().sub(m.screen);if(f.lengthSq()===0)continue;let b=Math.max(0,Math.min(1,r.clone().sub(m.screen).dot(f)/f.lengthSq())),w=m.screen.clone().addScaledVector(f,b).distanceTo(r);if(w<=p){p=w;let y=b*m.w/((1-b)*g.w+b*m.w);l.position=a[c].clone().lerp(a[h],y).toArray(),l.snapped="edge"}}return l}var Ll={tool:"distance",points:[],areaClosed:!1,error:null};function Ey(e,t){if(t.type==="tool")return{...Ll,tool:t.tool};if(t.type==="clear")return{...Ll,tool:e.tool};if(t.type==="fail")return{...e,error:t.error};if(t.type==="wrapResult")return{...e,points:t.points,areaClosed:!1,error:null};if(t.type==="undo")return{...e,points:e.points.slice(0,-1),areaClosed:!1,error:null};if(t.type==="finishArea"){if(e.tool!=="area")return e;let o=Dl(e.points.map(a=>a.position));return"error"in o?{...e,error:o.error}:{...e,areaClosed:!0,error:null}}if(t.type!=="place")return e;let n=e.areaClosed||e.tool==="angle"&&e.points.length===3||e.tool==="pointToPlane"&&e.points.length===2?[]:e.points;if(e.tool==="pointToPlane"&&n.length===0&&!t.point.normal)return{...e,error:"Pick a triangle face to define the reference plane."};if(n.length>=256)return{...e,error:"Finish or clear this measurement before adding more points."};let i=[...n,t.point];return e.tool==="angle"&&i.length===3&&kl(i.map(o=>o.position))===null?{...e,error:"Pick a point away from the angle's vertex."}:{...e,points:i,areaClosed:!1,error:null}}function jT(e){let t=new Ay().setFromObject(e),r=new Wd;return t.getSize(r),{min:[t.min.x,t.min.y,t.min.z],max:[t.max.x,t.max.y,t.max.z],size:[r.x,r.y,r.z]}}function zT(e){let t=new Ay().setFromObject(e);if(t.isEmpty())return null;let r=t.getCenter(new Wd),n=t.getSize(new Wd).length()/2;return!Number.isFinite(n)||n<=0?null:{center:[r.x,r.y,r.z],radius:n}}function Ry({canvasAreaRef:e,controlsRef:t,sceneRef:r,modelUrl:n,modelRotation:i,bindingTransformSignature:o,modelLoaded:a,enabled:s}){let[l,u]=xo(!1),[d,p]=IT(Ey,Ll),[c,h]=xo("none"),[m,g]=xo(null),[f,b]=xo(!1),[w,y]=xo(null),[M,E]=xo(null),v=Ol(!1),P=Ol(0),T=Ol(null),_=Ol(null);v.current=l&&s;let S=nr(te=>{te.updateMatrixWorld(!0),y(jT(te)),E(zT(te))},[]),C=nr(()=>{p({type:"clear"}),g(null)},[]),R=nr(te=>{p({type:"tool",tool:te}),g(null)},[]),A=nr(()=>p({type:"undo"}),[]),B=nr(()=>p({type:"finishArea"}),[]),N=nr(()=>u(te=>!te),[]),D=nr(()=>b(te=>!te),[]),V=nr(te=>{!v.current||te.button!==0||(T.current={x:te.clientX,y:te.clientY})},[]),O=nr((te,ve)=>{let U=e.current,G=t.current?.camera,J=r.current;if(!U||!G||!J)return null;let se=U.getBoundingClientRect();if(!se.width||!se.height)return null;J.updateMatrixWorld(!0),G.updateMatrixWorld(!0);let Ee=new Hd(te-se.left,ve-se.top),X=new BT;return X.setFromCamera(new Hd(Ee.x/se.width*2-1,1-Ee.y/se.height*2),G),X.intersectObject(J,!0).find(_y)??null},[e,t,r]),k=nr((te,ve)=>{let U=e.current,G=t.current?.camera,J=O(te,ve);if(!J||!U||!G)return null;let se=U.getBoundingClientRect(),Ee=new Hd(te-se.left,ve-se.top);return Py(J,G,Ee,se,c)},[e,t,O,c]),W=nr(()=>{_.current!==null&&cancelAnimationFrame(_.current),_.current=null,g(null)},[]),he=nr(te=>{if(!v.current||c==="none"||te.buttons!==0||te.target.closest("button, input, select, label, textarea, .ri-measureTools")){W();return}_.current!==null&&cancelAnimationFrame(_.current);let{clientX:ve,clientY:U}=te;_.current=requestAnimationFrame(()=>{_.current=null;let G=k(ve,U);g(G?.snapped?G:null)})},[W,k,c]),ae=nr(te=>{if(!v.current)return;let ve=T.current;if(T.current=null,ve&&Math.hypot(te.clientX-ve.x,te.clientY-ve.y)>6||te.target.closest("button, input, select, label, textarea, .ri-measureTools"))return;if(d.tool==="wrap"||d.tool==="wrapHorizontal"){let J=O(te.clientX,te.clientY);if(!J)return;let se=d.tool==="wrapHorizontal"?Cy(J):Sy(J);if("error"in se){p({type:"fail",error:se.error});return}let Ee=se.points.map((X,ie)=>({id:P.current+ie+1,position:X}));P.current+=Ee.length,p({type:"wrapResult",points:Ee});return}let G=k(te.clientX,te.clientY);G&&(P.current+=1,p({type:"place",point:{...G,id:P.current}}))},[d.tool,k,O]);return Ra(()=>{C(),y(null),E(null)},[n,C]),Ra(()=>{C()},[i,o,C]),Ra(()=>(W(),W),[W,l,c]),Ra(()=>{s||(u(!1),W())},[s,W]),Ra(()=>{let te=r.current;!a||!te||S(te)},[o,a,S,r]),{measureMode:l,measureModeRef:v,measurePoints:d.points,measurementTool:d.tool,areaClosed:d.areaClosed,measurementError:d.error,selectMeasurementTool:R,undoMeasurementPoint:A,finishMeasureArea:B,snapMode:c,setSnapMode:h,snapPreview:m,handleMeasurePointerMove:he,clearSnapPreview:W,showDimensions:f,measureBox:w,modelBounds:M,refreshBounds:S,clearMeasurements:C,toggleMeasureMode:N,toggleDimensions:D,handleMeasurePointerDown:V,handleMeasureClick:ae}}import{createPortal as NT}from"react-dom";import{createXRStore as VT}from"@react-three/xr";import{MapPin as FT}from"lucide-react";import{useCallback as Si,useEffect as Ci,useMemo as Dy,useRef as UT,useState as Hn}from"react";function ky(e,t){let r=null,n=o=>{let a=o.mode==="immersive-ar"?o.session??null:null;a!==r&&(r&&t.endAR(),r=a,r&&t.startAR())},i=e.subscribe(n);return n(e.getState()),()=>{i(),r&&t.endAR("interrupted"),r=null}}import{Fragment as GT,jsx as vo,jsxs as Xd}from"react/jsx-runtime";var Ly={canPlace:!1,isPlacementMode:!0,isModelPlaced:!1};function Oy({enableXR:e,usdzUrl:t,mobileHandoffUrl:r,engagement:n}){let i=me(),o=UT(null),a=Dy(()=>{if(!e||typeof navigator>"u")return null;let k=navigator.xr;if(!k||typeof k.isSessionSupported!="function"||typeof k.addEventListener!="function")return null;try{return VT({emulate:!1})}catch{return null}},[e]),[s,l]=Hn(!1),[u,d]=Hn(!1),[p,c]=Hn(!0),[h,m]=Hn(null),[g,f]=Hn(!1),[b,w]=Hn(!1),[y,M]=Hn(Ly),[E,v]=Hn(!1),P=Dy(()=>e&&!!t?.trim()&&Gf(),[e,t]);Ci(()=>{c(Hf())},[]);let T=Si(()=>{if(typeof window>"u")return null;try{let k=new URL(r?.trim()||window.location.href,window.location.href);return k.protocol==="http:"||k.protocol==="https:"?k.toString():null}catch{return null}},[r]);Ci(()=>{if(!e||p){m(null),f(!1);return}m(T())},[e,p,T]),Ci(()=>{if(a)return a.subscribe(k=>w(k.session!=null&&k.mode==="immersive-ar"))},[a]),Ci(()=>{if(a)return ky(a,n)},[a,n]),Ci(()=>{v(!1),M(Ly)},[b]),Ci(()=>{if(!e||typeof navigator>"u")return;let k=navigator.xr;if(!k?.isSessionSupported)return;let W=!1;return k.isSessionSupported("immersive-ar").then(he=>!W&&l(he)).catch(()=>{}),k.isSessionSupported("immersive-vr").then(he=>!W&&d(he)).catch(()=>{}),()=>{W=!0}},[e]);let _=Si(()=>{let k=T();k&&(n.requestARLaunch("mobile-handoff"),m(k),f(!0))},[T,n]),S=Si(()=>f(!1),[]),C=Si(()=>{let k=t?.trim();if(!k)return;n.requestARLaunch("quick-look");let W=document.createElement("a");W.setAttribute("rel","ar"),W.href=k,W.style.display="none";let he=document.createElement("img");he.alt="",he.src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==",W.appendChild(he),document.body.appendChild(W),W.click(),W.remove()},[t,n]),R=Si(k=>{M(k),k.isPlacementMode||v(!1)},[]),A=Si(k=>{v(!1),k?o.current?.finishPlacementMode():o.current?.cancelPlacementMode()},[]),B=Si(k=>{k.preventDefault(),v(!0),o.current?.startPlacementMode()},[]);Ci(()=>{if(!E)return;let k=()=>A(!0),W=()=>A(!1);return window.addEventListener("pointerup",k),window.addEventListener("pointercancel",W),()=>{window.removeEventListener("pointerup",k),window.removeEventListener("pointercancel",W)}},[A,E]);let N=y.isModelPlaced?y.isPlacementMode?y.canPlace?i("arReleaseToPlace"):i("arFindSurface"):null:y.canPlace?null:i("arFindSurface"),D=y.isModelPlaced&&!y.isPlacementMode?i("arGestureHint"):null,V=a?.getState().domOverlayRoot??null,O=b&&V?NT(Xd(GT,{children:[D&&vo("div",{className:"ri-arHintOverlay",children:vo("div",{className:"ri-arHint",children:D})}),vo("div",{className:"ri-arOverlay",children:Xd("div",{className:"ri-arControls",children:[N&&vo("div",{className:"ri-arStatus",children:N}),y.isModelPlaced&&Xd("button",{type:"button",className:`ri-arActionButton ${E?"ri-arActionButton--active":""}`,onPointerDown:k=>B(k.nativeEvent),"aria-pressed":E,children:[vo(FT,{size:14}),i("arRelocate")]}),!y.isModelPlaced&&y.canPlace&&vo("button",{type:"button",className:"ri-arActionButton ri-arActionButton--primary",onClick:()=>o.current?.placeCurrent(),children:i("tapToPlace")})]})})]}),V):null;return{xrStore:a,presenterRef:o,arSupported:s,vrSupported:u,quickLookSupported:P,resolvedMobileHandoffUrl:h,isMobileHandoffOpen:g,arOverlay:O,openMobileHandoff:_,closeMobileHandoff:S,openQuickLook:C,handleARStateChange:R}}import{Canvas as oP,useThree as cx}from"@react-three/fiber";import{Environment as aP}from"@react-three/drei";import{XR as sP}from"@react-three/xr";import{ACESFilmicToneMapping as lP,LinearToneMapping as cP,NoToneMapping as dx,ReinhardToneMapping as uP}from"three";import{Suspense as dP,useEffect as pP,useMemo as Fl,useState as hP}from"react";import{useFrame as ka,useThree as pn}from"@react-three/fiber";import{ContactShadows as HT}from"@react-three/drei";import{useXR as Iy}from"@react-three/xr";import{Color as WT,PerspectiveCamera as XT}from"three";import{useEffect as Ti,useLayoutEffect as qT,useRef as Il}from"react";import{Fragment as YT,jsx as By,jsxs as KT}from"react/jsx-runtime";function jy({renderMode:e,suspended:t=!1}){let{scene:r}=pn(),n=pn(s=>s.setFrameloop),i=Iy(s=>s.session!=null),o=Iy(s=>s.mode==="immersive-ar"),a=Il(void 0);return Ti(()=>{n(t?"never":i?"always":e)},[i,e,t,n]),Ti(()=>{o?(a.current=r.background,r.background=null):a.current!==void 0&&(r.background=a.current,a.current=void 0)},[o,r]),ka(()=>{o&&r.background!==null&&(r.background=null)}),null}function zy({onPresentingChange:e}){let t=pn(i=>i.gl),r=Il(null);Ti(()=>{let i=t.xr;if(!i)return;let o=l=>{l?(r.current=t.shadowMap.enabled,t.shadowMap.enabled=!1):r.current!==null&&(t.shadowMap.enabled=r.current,r.current=null),e(l)},a=()=>o(!0),s=()=>o(!1);return i.addEventListener("sessionstart",a),i.addEventListener("sessionend",s),o(i.isPresenting),()=>{i.removeEventListener("sessionstart",a),i.removeEventListener("sessionend",s)}},[t,e]);let n=Il(0);return ka(()=>{if(!t.xr.isPresenting)return;let i=performance.now();if(i-n.current<1e3)return;n.current=i;let o=t.xr}),null}function Ny({active:e}){let t=pn(r=>r.invalidate);return Ti(()=>{e&&t()},[e,t]),ka(()=>{e&&t()}),null}function Vy(e){let t=pn(n=>n.gl),r=Il(t.autoClear);return ka(()=>{r.current=t.autoClear,t.autoClear=!0},-1),KT(YT,{children:[By(HT,{...e}),By($T,{saved:r})]})}function $T({saved:e}){let t=pn(r=>r.gl);return ka(()=>{t.autoClear=e.current}),null}function Fy({color:e}){let{scene:t,invalidate:r}=pn();return Ti(()=>{let n=t.background;return t.background=e?new WT(e):null,r(),()=>{t.background=n}},[t,e,r]),null}function Uy({rotation:e}){let{scene:t,invalidate:r}=pn();return qT(()=>{let n=e*Math.PI/180;t.environmentRotation.set(0,n,0),t.backgroundRotation.set(0,n,0)}),Ti(()=>{r()},[e,r]),null}function Gy({cameraConfig:e}){let{camera:t,invalidate:r}=pn();return Ti(()=>{if(!(t instanceof XT))return;let n=e?.fov;typeof n=="number"&&t.fov!==n&&(t.fov=n,t.updateProjectionMatrix(),r())},[t,e,r]),null}import{useThree as Oa}from"@react-three/fiber";import{Autofocus as P_,Bloom as E_,BrightnessContrast as A_,ChromaticAberration as R_,ColorAverage as k_,DepthOfField as D_,DotScreen as L_,EffectComposer as O_,Glitch as I_,GodRays as B_,Grid as j_,HueSaturation as z_,Noise as N_,Outline as V_,Pixelation as F_,Ramp as U_,Scanline as G_,SelectiveBloom as H_,Sepia as W_,SMAA as X_,SSAO as q_,ToneMapping as $_,Vignette as Y_}from"@react-three/postprocessing";import{BlendFunction as Mo,KernelSize as K_}from"postprocessing";import{Color as Ia,Vector2 as Da}from"three";import{memo as Q_,useCallback as J_,useEffect as ep,useLayoutEffect as Z_,useMemo as Pi,useRef as tp,useState as sx}from"react";import{forwardRef as QT,useImperativeHandle as JT,useMemo as ZT}from"react";import{BlendFunction as e_,Effect as t_}from"postprocessing";import{Uniform as r_}from"three";import{jsx as i_}from"react/jsx-runtime";var n_=`
|
|
6
|
+
uniform float exposure;
|
|
7
|
+
void mainImage(const in vec4 inputColor, const in vec2 uv, out vec4 outputColor) {
|
|
8
|
+
outputColor = vec4(inputColor.rgb * exposure, inputColor.a);
|
|
9
|
+
}
|
|
10
|
+
`,qd=class extends t_{constructor(t=1){super("ExposureEffect",n_,{blendFunction:e_.NORMAL,uniforms:new Map([["exposure",new r_(t)]])})}set exposure(t){this.uniforms.get("exposure").value=t}},Hy=QT(function({exposure:t},r){let n=ZT(()=>new qd(t),[]);return n.exposure=t,JT(r,()=>n,[n]),i_("primitive",{object:n,dispose:null})});import{useFrame as o_,useThree as Bl}from"@react-three/fiber";import*as $y from"@react-three/postprocessing";import{BlendFunction as a_}from"postprocessing";import{Color as s_,MathUtils as l_,Mesh as c_,Vector2 as Wy,Vector3 as Xy}from"three";import{useEffect as qy,useMemo as jl,useRef as $d}from"react";import{jsx as d_}from"react/jsx-runtime";var u_=$y.LensFlareEffect;function Yy({config:e}){let t=Bl(c=>c.camera),r=Bl(c=>c.raycaster),n=Bl(c=>c.scene),i=Bl(c=>c.viewport),o=$d(null),a=$d(new Xy),s=$d(new Wy),l=jl(()=>new Xy(...e.lensPosition),[e.lensPosition]),u=jl(()=>new s_(e.colorGain??"#141414"),[e.colorGain]),d=jl(()=>new Wy(0,0),[]),p=jl(()=>new u_({blendFunction:a_.NORMAL,enabled:!0,glareSize:e.glareSize,lensPosition:l,screenRes:d,starPoints:6,flareSize:e.flareSize,flareSpeed:e.flareSpeed,flareShape:e.flareShape,animated:e.animated,anamorphic:e.anamorphic,colorGain:u,lensDirtTexture:null,haloScale:e.haloScale,secondaryGhosts:e.secondaryGhosts,aditionalStreaks:e.aditionalStreaks,ghostScale:e.ghostScale,opacity:e.opacity,starBurst:e.starBurst}),[u,e.aditionalStreaks,e.anamorphic,e.animated,e.flareShape,e.flareSize,e.flareSpeed,e.glareSize,e.haloScale,e.ghostScale,e.opacity,e.secondaryGhosts,e.starBurst,l,d]);return qy(()=>(o.current=p,()=>{p.dispose(),o.current=null}),[p]),qy(()=>{let c=p.uniforms.get("screenRes");c&&(c.value.x=i.width,c.value.y=i.height)},[p,i]),o_((c,h)=>{let m=o.current;if(!m)return;let g=m.uniforms.get("lensPosition"),f=m.uniforms.get("opacity");if(!g||!f)return;let b=1;if(a.current.copy(l).project(t),a.current.z>1)return;g.value.x=a.current.x,g.value.y=a.current.y,s.current.x=a.current.x,s.current.y=a.current.y,r.setFromCamera(s.current,t);let w=r.intersectObjects(n.children,!0),{object:y}=w[0]||{};y&&(y.userData?.lensflare==="no-occlusion"?b=0:y instanceof c_&&(y.material.uniforms?._transmission?.value>.2||y.material._transmission&&y.material._transmission>.2?b=.2:y.material.transparent&&(b=y.material.opacity))),f.value=l_.damp(f.value,b,12,h)}),d_("primitive",{object:p,dispose:null})}import{useThree as ex}from"@react-three/fiber";import{EffectPass as M_}from"postprocessing";import{useEffect as S_,useMemo as C_}from"react";import{BlendFunction as p_,Effect as h_,RenderPass as m_}from"postprocessing";import{Color as Ky,Mesh as Zy,NearestFilter as zl,NoBlending as f_,ShaderMaterial as Qy,Uniform as _i,Vector2 as g_,Vector3 as b_,WebGLRenderTarget as Jy}from"three";var y_=`
|
|
11
|
+
#include <common>
|
|
12
|
+
#include <morphtarget_pars_vertex>
|
|
13
|
+
#include <skinning_pars_vertex>
|
|
14
|
+
#include <clipping_planes_pars_vertex>
|
|
15
|
+
#include <logdepthbuf_pars_vertex>
|
|
16
|
+
void main() {
|
|
17
|
+
#include <skinbase_vertex>
|
|
18
|
+
#include <begin_vertex>
|
|
19
|
+
#include <morphtarget_vertex>
|
|
20
|
+
#include <skinning_vertex>
|
|
21
|
+
#include <project_vertex>
|
|
22
|
+
#include <logdepthbuf_vertex>
|
|
23
|
+
#include <clipping_planes_vertex>
|
|
24
|
+
}`,x_=`
|
|
25
|
+
#include <common>
|
|
26
|
+
#include <clipping_planes_pars_fragment>
|
|
27
|
+
#include <logdepthbuf_pars_fragment>
|
|
28
|
+
uniform vec3 objectId;
|
|
29
|
+
uniform bool onlySelected;
|
|
30
|
+
void main() {
|
|
31
|
+
#include <clipping_planes_fragment>
|
|
32
|
+
#include <logdepthbuf_fragment>
|
|
33
|
+
if (onlySelected && length(objectId) < 0.001) discard;
|
|
34
|
+
gl_FragColor = vec4(objectId, step(0.001, length(objectId)));
|
|
35
|
+
}`,v_=`
|
|
36
|
+
uniform sampler2D selectionMask;
|
|
37
|
+
uniform sampler2D visibleMask;
|
|
38
|
+
uniform vec2 texelSize;
|
|
39
|
+
uniform vec3 outlineColor;
|
|
40
|
+
uniform float edgeStrength;
|
|
41
|
+
float different(vec4 a, vec4 b) {
|
|
42
|
+
return max(a.a, b.a) * step(0.001, length(a.rgb - b.rgb) + abs(a.a - b.a));
|
|
43
|
+
}
|
|
44
|
+
float visible(vec4 id, vec4 surface) {
|
|
45
|
+
return surface.a * (1.0 - step(0.001, length(id.rgb - surface.rgb)));
|
|
46
|
+
}
|
|
47
|
+
float edgeAt(vec2 uv, vec2 offset, vec4 center, float centerVisible) {
|
|
48
|
+
vec4 neighbor = texture2D(selectionMask, uv + offset);
|
|
49
|
+
return different(center, neighbor) * max(centerVisible, visible(neighbor, texture2D(visibleMask, uv + offset)));
|
|
50
|
+
}
|
|
51
|
+
void mainImage(const in vec4 inputColor, const in vec2 uv, out vec4 outputColor) {
|
|
52
|
+
vec4 c = texture2D(selectionMask, uv);
|
|
53
|
+
float shown = visible(c, texture2D(visibleMask, uv));
|
|
54
|
+
float edge = max(max(edgeAt(uv, vec2(texelSize.x, 0.0), c, shown), edgeAt(uv, vec2(-texelSize.x, 0.0), c, shown)),
|
|
55
|
+
max(edgeAt(uv, vec2(0.0, texelSize.y), c, shown), edgeAt(uv, vec2(0.0, -texelSize.y), c, shown)));
|
|
56
|
+
outputColor = vec4(outlineColor * edge * edgeStrength, max(inputColor.a, edge));
|
|
57
|
+
}`,Nl=class extends h_{constructor(r,n,i,o,a={}){super("SelectionOutlineEffect",v_,{blendFunction:p_.SCREEN,uniforms:new Map([["selectionMask",new _i(null)],["visibleMask",new _i(null)],["texelSize",new _i(new g_)],["outlineColor",new _i(new Ky(a.visibleEdgeColor??2278750))],["edgeStrength",new _i(a.edgeStrength??3)]])});this.scene=r;this.camera=n;this.getObjects=i;this.layer=o;this.maskTarget=new Jy(1,1,{minFilter:zl,magFilter:zl});this.visibleTarget=new Jy(1,1,{minFilter:zl,magFilter:zl});this.visibleTarget.texture.name="SelectionOutline.VisibleIDs",this.uniforms.get("visibleMask").value=this.visibleTarget.texture,this.maskTarget.texture.name="SelectionOutline.IDs",this.uniforms.get("selectionMask").value=this.maskTarget.texture,this.maskMaterial=new Qy({name:"SelectionOutline.IDs",vertexShader:y_,fragmentShader:x_,uniforms:{objectId:new _i(new b_),onlySelected:new _i(!1)},blending:f_,toneMapped:!1,clipping:!0}),this.maskPass=new m_(r,n,this.maskMaterial),this.maskPass.skipShadowMapUpdate=!0,this.maskPass.ignoreBackground=!0,this.maskPass.clearPass.overrideClearColor=new Ky(0),this.maskPass.clearPass.overrideClearAlpha=0}update(r){let n=w_(this.scene,this.getObjects()),i=[],o=this.camera.layers.mask;try{this.scene.traverseVisible(a=>{if(!(a instanceof Zy))return;let s=n.get(a)??0,l=a.onBeforeRender;a.onBeforeRender=function(...u){l.apply(this,u);let d=u[4];d instanceof Qy&&d.uniforms.objectId&&(d.uniforms.objectId.value.set((s&255)/255,(s>>>8&255)/255,(s>>>16&255)/255),d.uniformsNeedUpdate=!0)},i.push(()=>{a.onBeforeRender=l})}),this.maskMaterial.uniforms.onlySelected.value=!1,this.maskPass.render(r,this.visibleTarget,null);for(let a of n.keys()){let s=a.layers.mask;a.layers.enable(this.layer),i.push(()=>{a.layers.mask=s})}this.camera.layers.set(this.layer),this.maskMaterial.uniforms.onlySelected.value=!0,this.maskPass.render(r,this.maskTarget,null)}finally{this.camera.layers.mask=o;for(let a of i)a()}}setSize(r,n){this.maskTarget.setSize(r,n),this.visibleTarget.setSize(r,n),this.uniforms.get("texelSize").value.set(1/r,1/n)}dispose(){this.maskPass.dispose(),this.maskMaterial.dispose(),this.maskTarget.dispose(),this.visibleTarget.dispose()}};function w_(e,t){let r=new Map(t.map((o,a)=>[o,a+1])),n=new Map,i=(o,a)=>{if(!o.visible)return;let s=r.get(o)??a;s&&o instanceof Zy&&n.set(o,s);for(let l of o.children)i(l,s)};return i(e,0),n}import{jsx as T_}from"react/jsx-runtime";function tx({objects:e,layer:t,options:r}){let n=ex(a=>a.scene),i=ex(a=>a.camera),o=C_(()=>new M_(i,new Nl(n,i,()=>e.current,t,r)),[n,i,e,t,r]);return S_(()=>()=>o.dispose(),[o]),T_("primitive",{object:o,dispose:null})}function rx(e){let t=[e];for(;t.length>0;){let r=t.pop();if(r.visible){if(r.isMesh)return!0;t.push(...r.children)}}return!1}function nx(e,t){let r=e.update,n=t,i=NaN,o=NaN;return e.update=function(...a){(i!==n.near||o!==n.far)&&(this.mainCamera=t,i=n.near,o=n.far),r.apply(this,a)},()=>{e.update=r}}import{RampType as Yd}from"@react-three/postprocessing";import{GlitchMode as Kd,KernelSize as wo,ToneMappingMode as Qd}from"postprocessing";import{Color as __}from"three";function ix(e){return e==="linear"?Qd.LINEAR:e==="reinhard"?Qd.REINHARD:Qd.ACES_FILMIC}function Vl(e){switch(e){case"verySmall":return wo.VERY_SMALL;case"small":return wo.SMALL;case"medium":return wo.MEDIUM;case"large":return wo.LARGE;case"veryLarge":return wo.VERY_LARGE;case"huge":return wo.HUGE}}function ox(e){switch(e){case"constantMild":return Kd.CONSTANT_MILD;case"constantWild":return Kd.CONSTANT_WILD;default:return Kd.SPORADIC}}function Jd(e){let t=new __(e);return[t.r,t.g,t.b,1]}function ax(e){return e==="radial"?Yd.Radial:e==="mirroredLinear"?Yd.MirroredLinear:Yd.Linear}import{Fragment as iP,jsx as We,jsxs as Zd}from"react/jsx-runtime";var Ei={edgeStrength:1,pulseSpeed:0,visibleEdgeColor:new Ia(un.color).getHex(),hiddenEdgeColor:new Ia(un.color).multiplyScalar(.35).getHex(),kernelSize:K_.VERY_SMALL,blur:!1,xRay:!1},eP={edgeStrength:3};function tP(e){let t=[];return e.traverse(r=>{r.isMesh&&t.push(r)}),t}var La=[],rP=Q_(function({sceneConfig:t,selectedObjectRef:r,selectedObjectOutlineColor:n,highlightOnHover:i=!1,disabled:o=!1,onOutlineEffect:a,hasMultiSelection:s,multiOutlineObjects:l}){let u=Oa(C=>C.scene),d=Oa(C=>C.gl),p=tp(null),c=t?.postProcessing,h=r??null,m=c?.outline.enabled===!0,g=m||i,f=Pi(()=>new Ia(n??"#22c55e").getHex(),[n]),b=Pi(()=>({...eP,blendFunction:Mo.SCREEN,visibleEdgeColor:f}),[f]),w=2;for(;w===c?.outline.selectionLayer||w===c?.selectiveBloom.selectionLayer;)w+=1;let[y,M]=sx(()=>d.xr?.isPresenting??!1);ep(()=>{let C=d.xr;if(!C)return;let R=()=>M(!0),A=()=>M(!1);return C.addEventListener("sessionstart",R),C.addEventListener("sessionend",A),M(C.isPresenting),()=>{C.removeEventListener("sessionstart",R),C.removeEventListener("sessionend",A)}},[d]);let E=u.children.filter(C=>C.isLight),v=Pi(()=>new Da(c?.chromaticAberration.offsetX??.002,c?.chromaticAberration.offsetY??.002),[c?.chromaticAberration.offsetX,c?.chromaticAberration.offsetY]),P=Pi(()=>new Ia(c?.outline.visibleEdgeColor??"#ffffff").getHex(),[c?.outline.visibleEdgeColor]),T=Pi(()=>new Ia(c?.outline.hiddenEdgeColor??"#22090a").getHex(),[c?.outline.hiddenEdgeColor]),_=Pi(()=>Jd(c?.ramp.startColor??"#000000"),[c?.ramp.startColor]),S=Pi(()=>Jd(c?.ramp.endColor??"#ffffff"),[c?.ramp.endColor]);return!c||y||o?null:Zd(iP,{children:[c.godRays.enabled===!0&&Zd("mesh",{ref:p,position:c.godRays.sunPosition,visible:!1,frustumCulled:!1,children:[We("sphereGeometry",{args:[.1,8,8]}),We("meshBasicMaterial",{transparent:!0,opacity:0,depthWrite:!1})]}),Zd(O_,{multisampling:0,enableNormalPass:c.ssao.enabled===!0,autoClear:!1,children:[c.smaa.enabled===!0&&We(X_,{}),c.ssao.enabled===!0&&We(q_,{samples:c.ssao.samples,rings:c.ssao.rings,intensity:c.ssao.intensity,radius:c.ssao.radius,bias:c.ssao.bias,luminanceInfluence:c.ssao.luminanceInfluence,fade:c.ssao.fade,minRadiusScale:c.ssao.minRadiusScale,worldDistanceThreshold:c.ssao.worldDistanceThreshold,worldDistanceFalloff:c.ssao.worldDistanceFalloff,worldProximityThreshold:c.ssao.worldProximityThreshold,worldProximityFalloff:c.ssao.worldProximityFalloff}),c.autofocus.enabled===!0&&We(P_,{focusDistance:c.autofocus.focusDistance,focusRange:c.autofocus.focusRange,focalLength:c.autofocus.focalLength,bokehScale:c.autofocus.bokehScale,target:c.autofocus.target,mouse:c.autofocus.mouse,debug:c.autofocus.debug||void 0,manual:c.autofocus.manual,smoothTime:c.autofocus.smoothTime}),c.autofocus.enabled!==!0&&c.depthOfField.enabled===!0&&We(D_,{focusDistance:c.depthOfField.focusDistance,focusRange:c.depthOfField.focusRange,focalLength:c.depthOfField.focalLength,bokehScale:c.depthOfField.bokehScale}),c.bloom.enabled===!0&&We(E_,{intensity:c.bloom.intensity,luminanceThreshold:c.bloom.luminanceThreshold,luminanceSmoothing:c.bloom.luminanceSmoothing,mipmapBlur:c.bloom.mipmapBlur,radius:c.bloom.radius,levels:c.bloom.levels}),c.selectiveBloom.enabled===!0&&We(H_,{selection:h??void 0,lights:E,selectionLayer:c.selectiveBloom.selectionLayer,intensity:c.selectiveBloom.intensity,luminanceThreshold:c.selectiveBloom.luminanceThreshold,luminanceSmoothing:c.selectiveBloom.luminanceSmoothing,kernelSize:Vl(c.selectiveBloom.kernelSize),mipmapBlur:c.selectiveBloom.mipmapBlur,inverted:c.selectiveBloom.inverted,ignoreBackground:c.selectiveBloom.ignoreBackground}),g&&We(V_,{ref:a,selection:La,selectionLayer:c.outline.selectionLayer,blendFunction:Mo.SCREEN,edgeStrength:m?c.outline.edgeStrength:Ei.edgeStrength,pulseSpeed:m?c.outline.pulseSpeed:Ei.pulseSpeed,visibleEdgeColor:m?P:Ei.visibleEdgeColor,hiddenEdgeColor:m?T:Ei.hiddenEdgeColor,kernelSize:m?Vl(c.outline.kernelSize):Ei.kernelSize,blur:m?c.outline.blur:Ei.blur,xRay:m?c.outline.xRay:Ei.xRay}),s&&We(tx,{objects:l,layer:w,options:b}),c.chromaticAberration.enabled===!0&&We(R_,{offset:v,radialModulation:c.chromaticAberration.radialModulation,modulationOffset:c.chromaticAberration.modulationOffset}),c.colorAverage.enabled===!0&&We(k_,{}),c.dotScreen.enabled===!0&&We(L_,{angle:c.dotScreen.angle,scale:c.dotScreen.scale}),c.glitch.enabled===!0&&We(I_,{mode:ox(c.glitch.mode),delay:new Da(c.glitch.delay[0],c.glitch.delay[1]),duration:new Da(c.glitch.duration[0],c.glitch.duration[1]),strength:new Da(c.glitch.strength[0],c.glitch.strength[1]),chromaticAberrationOffset:new Da(c.glitch.chromaticAberrationOffset[0],c.glitch.chromaticAberrationOffset[1]),columns:c.glitch.columns,ratio:c.glitch.ratio,active:!0}),c.grid.enabled===!0&&We(j_,{scale:c.grid.scale,lineWidth:c.grid.lineWidth}),c.lensflare.enabled===!0&&We(Yy,{config:c.lensflare}),c.godRays.enabled===!0&&We(B_,{sun:p,samples:c.godRays.samples,density:c.godRays.density,decay:c.godRays.decay,weight:c.godRays.weight,exposure:c.godRays.exposure,clampMax:c.godRays.clampMax,blur:c.godRays.blur,kernelSize:Vl(c.godRays.kernelSize)}),c.noise.enabled===!0&&We(N_,{premultiply:c.noise.premultiply,opacity:c.noise.opacity,blendFunction:Mo.ADD}),c.brightnessContrast.enabled===!0&&We(A_,{brightness:c.brightnessContrast.brightness,contrast:c.brightnessContrast.contrast}),c.hueSaturation.enabled===!0&&We(z_,{hue:c.hueSaturation.hue,saturation:c.hueSaturation.saturation}),c.toneMapping.enabled===!0&&We(Hy,{exposure:c.toneMapping.exposure}),c.vignette.enabled===!0&&We(Y_,{eskil:c.vignette.eskil,offset:c.vignette.offset,darkness:c.vignette.darkness,blendFunction:Mo.NORMAL}),c.toneMapping.enabled===!0&&We($_,{mode:ix(c.toneMapping.mode),resolution:c.toneMapping.resolution,whitePoint:c.toneMapping.whitePoint,middleGrey:c.toneMapping.middleGrey,minLuminance:c.toneMapping.minLuminance,averageLuminance:c.toneMapping.averageLuminance,adaptationRate:c.toneMapping.adaptationRate}),c.sepia.enabled===!0&&We(W_,{intensity:c.sepia.intensity,blendFunction:Mo.NORMAL}),c.scanline.enabled===!0&&We(G_,{density:c.scanline.density,blendFunction:Mo.OVERLAY}),c.pixelation.enabled===!0&&We(F_,{granularity:c.pixelation.granularity}),c.ramp.enabled===!0&&We(U_,{rampType:ax(c.ramp.rampType),rampStart:c.ramp.rampStart,rampEnd:c.ramp.rampEnd,startColor:_,endColor:S,opacity:c.ramp.rampMask?1:c.ramp.opacity??.5,rampBias:c.ramp.rampBias,rampGain:c.ramp.rampGain,rampMask:c.ramp.rampMask,rampInvert:c.ramp.rampInvert})]})]})});function nP(e,t){return e.length===t.length&&e.every((r,n)=>r===t[n])}function lx({hoveredObjectRef:e,selectedObjectRefs:t,...r}){let n=Oa(p=>p.scene),i=Oa(p=>p.camera),o=Oa(p=>p.invalidate),[a,s]=sx(null),l=tp(La);l.current=t??La;let u=J_(p=>s(p),[]);Z_(()=>{if(a)return nx(a,i)},[a,i]);let d=tp({effect:null,objects:La});return ep(()=>{if(!a)return;let c=r.sceneConfig?.postProcessing?.outline.enabled===!0?tP(n):e&&rx(e)?[e]:La;d.current.effect===a&&nP(d.current.objects,c)||(d.current={effect:a,objects:c},a.selection.set(c),o())}),ep(()=>{o()},[t,o]),We(rP,{...r,onOutlineEffect:u,hasMultiSelection:l.current.length>0,multiOutlineObjects:l})}import{Fragment as bP,jsx as Ht,jsxs as ux}from"react/jsx-runtime";var mP=1.5;function rp({children:e,camera:t,backgroundColor:r,shadows:n=!0,sceneConfig:i,selectedObjectRef:o,selectedObjectRefs:a,selectedObjectOutlineColor:s,hoveredObjectRef:l,highlightOnHover:u,renderMode:d="demand",maxDpr:p=2,xrStore:c,rendererCaptureRef:h,preserveDrawingBuffer:m=!1,reduceGpuLoad:g,suspended:f=!1,paused:b=!1,onRendererCreated:w,backend:y="webgl"}){let M=y==="webgpu",E=g??Wf(),v=E?Math.min(p,mP):p,P=n&&!E,T=Fl(()=>r?{background:r}:i?.background.enabled?i.background.type==="color"?{background:i.background.color}:i.background.type==="image"&&i.background.imageUrl.trim()?{backgroundImage:`url("${i.background.imageUrl}")`,backgroundPosition:"center",backgroundRepeat:"no-repeat",backgroundSize:"cover"}:{background:"linear-gradient(180deg, #3a3a3c 0%, #1c1c1d 100%)"}:{background:"transparent"},[r,i]),_=Fl(()=>{if(r)return r;let V=i?.background;if(V?.enabled){if(V.type==="color")return V.color;if(V.type==="image"&&V.imageUrl.trim()||V.type==="environment")return null}return"#1c1c1d"},[r,i]),S=Fl(()=>{let V=i?.postProcessing;return V?!!(V.glitch.enabled||V.noise.enabled||V.lensflare.enabled&&V.lensflare.animated):!1},[i?.postProcessing]),[C,R]=hP(!1),A=i?.environment,B=i?.groundShadows,N=Fl(()=>{if(!A)return null;if(A.source==="custom"){let V=A.customEnvironmentUrl.trim();return lg(V)?{files:V}:null}return{preset:A.preset}},[A]),D=ux(bP,{children:[Ht(Nf,{captureRef:h}),Ht(Vf,{}),Ht(Gy,{cameraConfig:t}),Ht(Ny,{active:S}),Ht(Fy,{color:_}),N?Ht(fo,{onError:V=>console.warn("Failed to load environment map:",V),children:Ht(dP,{fallback:null,children:Ht(aP,{...N,environmentIntensity:A?.intensity??.25,backgroundIntensity:A?.intensity??.25,background:i?.background.enabled===!0&&i.background.type==="environment"})})}):null,Ht(Uy,{rotation:A?.rotation??0}),c&&Ht(zy,{onPresentingChange:R}),B?.enabled&&B.mode==="shadowCatcher"&&!C&&!M&&Ht(Vy,{position:[0,B.height,0],scale:B.size,opacity:B.intensity,blur:B.borderFade,far:15,resolution:1024,color:"#000000"}),e,Ht(lx,{sceneConfig:i,selectedObjectRef:o,selectedObjectRefs:a,selectedObjectOutlineColor:s,hoveredObjectRef:l,highlightOnHover:u,disabled:E||M}),M?Ht(gP,{toneMapping:i?.postProcessing.toneMapping}):null]});return Ht(oP,{frameloop:f||b&&!C?"never":d,onCreated:({gl:V})=>w?.(V),dpr:[1,v],shadows:P?"percentage":!1,resize:{debounce:0,scroll:!1},raycaster:{firstHitOnly:!0},style:T,camera:t??{fov:50},gl:M?zf:{preserveDrawingBuffer:m,toneMapping:dx,toneMappingExposure:1},flat:M||void 0,children:c&&!M?ux(sP,{store:c,children:[Ht(jy,{renderMode:d,suspended:f}),D]}):D})}var fP={linear:cP,reinhard:uP,aces:lP};function gP({toneMapping:e}){let t=cx(a=>a.gl),r=cx(a=>a.invalidate),n=e?.enabled===!0,i=e?.mode??"aces",o=e?.exposure??1;return pP(()=>{t.toneMapping=n?fP[i]:dx,t.toneMappingExposure=n?o:1,r()},[t,r,n,i,o]),null}import{CameraControls as yP,PointerLockControls as xP}from"@react-three/drei";import{Box3 as vP,Vector3 as hx}from"three";import{useEffect as So,useRef as wP}from"react";var Ul=e=>e*Math.PI/180;function px(e){return{minDistance:e?.minDistance??0,maxDistance:e?.maxDistance??1/0,minPolarAngle:Ul(e?.minPolarAngle??0),maxPolarAngle:Ul(e?.maxPolarAngle??180),minAzimuthAngle:Ul(e?.minAzimuthAngle??-1/0),maxAzimuthAngle:Ul(e?.maxAzimuthAngle??1/0),boundaryEnclosesCamera:e?.boundaryEnclosesCamera??!1,boundaryFriction:e?.boundaryFriction??0,panBoundary:e?.panBoundary}}import{jsx as mx}from"react/jsx-runtime";function np({controlsRef:e,onCameraChange:t,cameraLimits:r,controllerType:n="orbit",onPointerLockExit:i,reducedMotion:o=!1}){let a=n==="orbit",s=wP(null);return So(()=>{if(!a)return s.current?.lock(),()=>{s.current?.unlock()}},[a]),So(()=>{a&&document.pointerLockElement&&document.exitPointerLock()},[a]),So(()=>{if(a)return;let l=()=>{document.pointerLockElement||i?.()};return document.addEventListener("pointerlockchange",l),()=>{document.removeEventListener("pointerlockchange",l)}},[a,i]),So(()=>{if(!a||!e||typeof e!="object"||!("current"in e))return;let l=e.current;l&&Lg(l,o)},[a,e,o]),So(()=>{if(!a||!t||!e||typeof e!="object"||!("current"in e))return;let l=e.current;if(!l)return;let u=()=>{t(l.camera,l)};return l.addEventListener("update",u),()=>{l.removeEventListener("update",u)}},[a,e,t]),So(()=>{if(!a||!e||typeof e!="object"||!("current"in e))return;let l=e.current;if(!l)return;let u=px(r);l.minDistance=u.minDistance,l.maxDistance=u.maxDistance,l.minPolarAngle=u.minPolarAngle,l.maxPolarAngle=u.maxPolarAngle,l.minAzimuthAngle=u.minAzimuthAngle,l.maxAzimuthAngle=u.maxAzimuthAngle,l.boundaryEnclosesCamera=u.boundaryEnclosesCamera,l.boundaryFriction=u.boundaryFriction,l.setBoundary(u.panBoundary?new vP(new hx(...u.panBoundary[0]),new hx(...u.panBoundary[1])):void 0)},[a,e,r?.minDistance,r?.maxDistance,r?.minPolarAngle,r?.maxPolarAngle,r?.minAzimuthAngle,r?.maxAzimuthAngle,r?.boundaryEnclosesCamera,r?.boundaryFriction,r?.panBoundary]),a?mx(yP,{ref:e,makeDefault:!0,smoothTime:o?0:.3,dollyToCursor:!0}):mx(xP,{ref:s,makeDefault:!0,selector:"[data-ri-pointer-lock-trigger]"})}import{useRef as ip,useMemo as Gl,useEffect as MP}from"react";import{useFrame as SP,useThree as fx}from"@react-three/fiber";import{Vector3 as CP}from"three";import{Fragment as RP,jsx as Ai,jsxs as kP}from"react/jsx-runtime";function bx(e,t){if(!t)return e;let r=t*Math.PI/180,n=Math.cos(r),i=Math.sin(r);return[e[0]*n+e[2]*i,e[1],-e[0]*i+e[2]*n]}function TP(e,t){let[r,n,i]=e.center,o=e.radius,a=Math.hypot(t[0],t[1],t[2]),s=a>1e-6?[t[0]/a,t[1]/a,t[2]/a]:[0,1,0],l=o*2;return{position:[r+s[0]*l,n+s[1]*l,i+s[2]*l],target:e.center,extent:o,near:Math.max(o/100,.001),far:l+o*2}}function _P(e,t){let r=t[0]-e.center[0],n=t[1]-e.center[1],i=t[2]-e.center[2],o=Math.hypot(r,n,i);return{near:Math.max(o-e.radius,o*.01,.001),far:o+e.radius*2}}function PP(e,t,r){return t&&r&&!e.attachedToCamera?r.center:[0,0,0]}var EP={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}]},AP={enabled:!0,mapSize:2048,bias:-5e-4,normalBias:.02,radius:3};function gx({light:e,shadows:t,shadowsEnabled:r,environmentRotation:n,modelBounds:i,objectBindings:o,nodeRefs:a}){let s=ip(null),l=ip(null),u=ip(null),d=fx(b=>b.camera),p=fx(b=>b.scene),c=Gl(()=>new CP,[]),h=Gl(()=>e.attachedToCamera||e.attachment?e.position:bx(e.position,n),[e.position,e.attachedToCamera,e.attachment,n]);SP(()=>{let b=s.current??l.current??u.current;if(!b)return;if(e.attachedToCamera){b.position.copy(d.position);return}let w=e.attachment;if(!w)return;let y=o?io(o,w.objectId):null,E=(y?o?.[y]:void 0)?.modelObjectId??w.objectId,v=(y?a?.current[y]:void 0)??Nn(p,E);v&&(c.fromArray(w.offset),v.localToWorld(c),b.position.copy(c))});let m=r&&t.enabled&&e.castShadow,g=Gl(()=>e.type==="directional"&&m&&i&&!e.attachedToCamera?TP(i,h):null,[e.type,e.attachedToCamera,m,i,h]),f=Gl(()=>e.type==="spot"&&m&&i&&!e.attachedToCamera?_P(i,h):null,[e.type,e.attachedToCamera,m,i,h]);return MP(()=>{let b=s.current??u.current;if(!b)return;let[w,y,M]=PP(e,m,i);b.target.position.set(w,y,M),b.target.updateMatrixWorld()},[e,m,i]),!e.visible||e.type==="none"?null:e.type==="directional"?Ai("directionalLight",{ref:s,color:e.color,intensity:e.intensity,position:g?.position??h,castShadow:m,"shadow-mapSize-width":t.mapSize,"shadow-mapSize-height":t.mapSize,"shadow-bias":e.shadowBias,"shadow-normalBias":t.normalBias,"shadow-radius":t.radius,"shadow-camera-near":g?.near??.5,"shadow-camera-far":g?.far??40,"shadow-camera-left":-(g?.extent??8),"shadow-camera-right":g?.extent??8,"shadow-camera-top":g?.extent??8,"shadow-camera-bottom":-(g?.extent??8)}):e.type==="point"?Ai("pointLight",{ref:l,color:e.color,intensity:e.intensity,position:h,distance:e.distance,decay:e.decay,castShadow:m,"shadow-mapSize-width":t.mapSize,"shadow-mapSize-height":t.mapSize,"shadow-bias":e.shadowBias}):e.type==="spot"?Ai("spotLight",{ref:u,color:e.color,intensity:e.intensity,position:h,angle:e.angle??Math.PI/6,penumbra:e.penumbra??.2,distance:e.distance,decay:e.decay,castShadow:m,"shadow-mapSize-width":t.mapSize,"shadow-mapSize-height":t.mapSize,"shadow-bias":e.shadowBias,"shadow-normalBias":t.normalBias,"shadow-radius":t.radius,"shadow-camera-near":f?.near??.5,"shadow-camera-far":f?.far??40}):e.type==="hemisphere"?Ai("hemisphereLight",{color:e.color,groundColor:"#444444",intensity:e.intensity}):null}function op({lightingConfig:e,shadowConfig:t,shadowsEnabled:r=!0,environmentRotation:n=0,environmentConfig:i,modelBounds:o,objectBindings:a,nodeRefs:s}){let l=e??EP,u=t??AP,d=i?.shadowLight,p=bx([5,10,5],n);return kP(RP,{children:[Ai("ambientLight",{intensity:l.ambient.intensity,color:l.ambient.color}),l.lights.map(c=>Ai(gx,{light:c,shadows:u,shadowsEnabled:r,environmentRotation:n,modelBounds:o,objectBindings:a,nodeRefs:s},c.id)),d?.enabled&&Ai(gx,{light:{id:"light-env-shadow",type:"directional",color:"#ffffff",intensity:d.intensity,position:p,attachedToCamera:!1,castShadow:!0,shadowBias:d.bias,visible:!0},shadows:u,shadowsEnabled:r,environmentRotation:0,modelBounds:o,objectBindings:a,nodeRefs:s})]})}import{useState as sp,useEffect as Xe,useRef as St,useMemo as ut,useCallback as UP,Suspense as GP}from"react";import{useFrame as Yl,useThree as HP}from"@react-three/fiber";import{Matrix4 as yx,Quaternion as DP,Vector3 as Hl}from"three";function Co(e){return new yx().set(1,e[0],e[1],0,0,1,e[2],0,0,0,1,0,0,0,0,1)}function Ri(e,t){e.matrixAutoUpdate=!t,e.updateMatrix(),t&&(e.matrix.makeRotationFromQuaternion(e.quaternion).multiply(Co(t)).scale(e.scale).setPosition(e.position),e.matrixWorldNeedsUpdate=!0)}function xx(e,t,r){let n=new Hl().setFromMatrixColumn(e,0),i=new Hl().setFromMatrixColumn(e,1),o=new Hl().setFromMatrixColumn(e,2),a=(m,g)=>{let f=m*(g<0?-1:1);return Math.abs(f-g)<1e-10?g:f},s=a(n.length(),t.x);if(Math.abs(s)<1e-12)return{rotation:r.clone(),scale:t.clone(),shear:void 0};n.divideScalar(s);let l=n.dot(i);i.addScaledVector(n,-l);let u=a(i.length(),t.y);if(Math.abs(u)<1e-12)return{rotation:r.clone(),scale:t.clone(),shear:void 0};i.divideScalar(u);let d=n.dot(o);o.addScaledVector(n,-d);let p=i.dot(o);o.addScaledVector(i,-p);let c=a(o.length(),t.z);if(Math.abs(c)<1e-12)return{rotation:r.clone(),scale:t.clone(),shear:void 0};o.divideScalar(c);let h=[l/u,d/c,p/c].map(m=>Math.abs(m)<1e-10?0:m);return{rotation:new DP().setFromRotationMatrix(new yx().makeBasis(n,i,o)).normalize(),scale:new Hl(s,u,c),shear:h.some(Boolean)?h:void 0}}import{useCallback as LP,useEffect as vx,useRef as ap,useState as wx}from"react";function Mx(e,t,r){let[n,i]=wx({}),o=ap(new Map),[a,s]=wx(0),l=ap(t);l.current=t;let u=ap(r);u.current=r;let d=LP((p,c)=>{l.current?.some(h=>h.url===p)&&i(h=>h[p]===c?h:{...h,[p]:c})},[]);return vx(()=>{let p=new Set(t?.map(h=>h.url)),c=!1;for(let[h,m]of o.current)p.has(h)&&n[h]===m&&m.parent===e||(m.removeFromParent(),o.current.delete(h),c=!0);for(let[h,m]of Object.entries(n))!p.has(h)||o.current.get(h)===m||(e.add(m),o.current.set(h,m),c=!0,u.current?.(h,m));i(h=>{let m=Object.entries(h).filter(([g])=>p.has(g));return m.length===Object.keys(h).length?h:Object.fromEntries(m)}),c&&s(h=>h+1)},[e,t,n]),vx(()=>()=>{o.current.forEach(p=>p.removeFromParent()),o.current.clear()},[]),{rootsByUrl:n,revision:a,onSourceReady:d}}import{Box3 as Sx,Euler as OP,Matrix4 as Cx,Quaternion as IP,Vector3 as hn}from"three";function Ba(e){e.updateWorldMatrix(!0,!0);let t=new Cx().copy(e.matrixWorld).invert(),r=new Sx,n=new Sx,i=!1;return e.traverse(o=>{let a=o;if(!a.isMesh||!a.geometry||(a.geometry.boundingBox||a.geometry.computeBoundingBox(),!a.geometry.boundingBox))return;let s=new Cx().multiplyMatrices(t,o.matrixWorld);n.copy(a.geometry.boundingBox).applyMatrix4(s),r.union(n),i=!0}),i?r:null}function ki(e){let t=Ba(e);return t?t.getCenter(new hn):new hn}function Tx(e,t="XYZ"){return new IP().setFromEuler(new OP(e[0],e[1],e[2],t))}function BP(e,t,r,n,i="XYZ",o){let a=new hn(...n).multiply(new hn(...r));o&&a.applyMatrix4(Co(o)),a.applyQuaternion(Tx(t,i));let s=a.add(new hn(...e));return[s.x,s.y,s.z]}function Wl(e,t,r,n="XYZ",i){return{point:[...e],offset:BP([0,0,0],t,r,e,n,i)}}function ja(e,t,r,n,i="XYZ",o){if(!n)return e;let a=new hn(...n.point).multiply(new hn(...r));return o&&a.applyMatrix4(Co(o)),a.applyQuaternion(Tx(t,i)),new hn(...e).add(new hn(...n.offset)).sub(a).toArray()}function F5(e,t){let r=t.findIndex(n=>Math.abs(n)>1e-12);return r<0?1:Math.abs(e[r]/t[r])}import{Color as WP,MeshStandardMaterial as XP,MeshBasicMaterial as lp,MeshNormalMaterial as qP,MeshMatcapMaterial as $P,DoubleSide as YP,NormalBlending as KP,Box3 as Kl,Vector3 as Di,Matrix4 as QP,MathUtils as Ql}from"three";import{SkeletonUtils as Dx}from"three-stdlib";function _x(e){let t=new Map;return e.map((r,n)=>{let o=r.name.trim()||`Animation ${n+1}`,a=t.get(o)??0;return t.set(o,a+1),{clip:r,sourceName:a===0?o:`${o} (${a+1})`,duration:r.duration}})}import{AnimationMixer as jP,LoopOnce as zP,LoopPingPong as Px,LoopRepeat as NP}from"three";function Ex(e){let t=e._loopCount;return e.loop===Px&&(t&1)===1}function VP(e){return Ex(e)?e.getClip().duration-e.time:e.time}function Ax({root:e,clips:t,getClipConfig:r,onChange:n}){let i=new jP(e),o=new Map;for(let{clip:S,sourceName:C}of t)o.set(C,i.clipAction(S));let a=new Map,s=new Set,l=new Map,u=1,d=S=>typeof S=="string",p=S=>d(S)?a.has(S)?[S]:[]:[...a.keys()],c=(S,C)=>{let R=ig(r(C));R==="once"?S.setLoop(zP,1):R==="ping-pong"?S.setLoop(Px,1/0):S.setLoop(NP,1/0),S.clampWhenFinished=R==="once"},h=S=>{S.action.setEffectiveTimeScale(S.reverse?-S.speed:S.speed)},m=S=>{let C=a.get(S);C&&(C.action.stop(),a.delete(S))},g=(S,C={})=>{let R=o.get(S);if(!R||r(S)?.hidden)return;let A=Number.isFinite(C.fade)&&C.fade>0?C.fade:0,B=C.reverse??!1;if(!C.alongside)for(let[O,k]of[...a])O!==S&&(A>0?(a.delete(O),k.action.fadeOut(A),s.add(k.action)):m(O));s.delete(R)&&R.stop();let N=R.getClip().duration,D=a.get(S),V=()=>{R.reset(),B&&(R.time=N),R.play()};if(!D)V(),A>0&&R.fadeIn(A);else{let O=B?R.time<=0:R.time>=N;D.finished&&O&&V(),R.paused=!1,R.enabled=!0,a.delete(S)}c(R,S),D={action:R,speed:r(S)?.speed??l.get(S)??u,reverse:B,finished:!1},D.speed=el(D.speed),h(D),a.set(S,D),n()},f=S=>{for(let C of p(S))a.get(C).action.paused=!0;n()},b=S=>{for(let C of p(S))m(C);if(!d(S)){for(let C of s)C.stop();s.clear()}n()},w=(S,C)=>{let R=el(S);d(C)?l.set(C,R):u=R;for(let A of p(C)){let B=a.get(A);l.set(A,R),B.speed=R,h(B)}n()},y=(S,C)=>{for(let R of p(C)){let A=a.get(R),B=A.action.getClip().duration,N=Math.min(Math.max(S,0),B);A.action.time=Ex(A.action)?B-N:N,A.finished&&(A.finished=!1,A.action.paused=!0)}i.update(0),n()},M=()=>{for(let[S,C]of[...a]){let R=r(S);if(R?.hidden){m(S);continue}c(C.action,S),R?.speed!==void 0&&(C.speed=el(R.speed),h(C))}n()},E=S=>{for(let C of a.values())C.action===S.action&&(C.finished=!0);n()};return i.addEventListener("finished",E),{play:g,pause:f,stop:b,setSpeed:w,seek:y,getState:()=>{let S=[...a].map(([R,A])=>({clip:R,status:A.finished?"finished":A.action.paused?"paused":"playing",time:VP(A.action),duration:A.action.getClip().duration,speed:A.speed,reverse:A.reverse})),C=S[S.length-1];return{currentClip:C?.clip??null,isPlaying:S.some(R=>R.status==="playing"),speed:C?.speed??u,time:C?.time??0,duration:C?.duration??0,active:S}},applyClipConfigs:M,isRunning:()=>{if(s.size>0)return!0;for(let{action:S}of a.values())if(!S.paused&&S.enabled)return!0;return!1},update:S=>{i.update(S);for(let C of s)(!C.enabled||C.getEffectiveWeight()<=0)&&(C.stop(),s.delete(C))},dispose:()=>{i.removeEventListener("finished",E),i.stopAllAction(),i.uncacheRoot(e),a.clear(),s.clear()}}}import{Color as Xl,FrontSide as FP,NormalBlending as Rx}from"three";function kx(e,t,r,n){let i=Tr(t),o=Ta(r,i),a=Jf(n,t),s=Zf(n,t),l=eg(n,t);return a||s||l?Pl(e.userData,t,o,r,a??[0,0],s??1,l??0):(El(e.userData,t),o)}function At(e,t,r,n){if(!r){El(e.userData,t);return}let i=Zs[t];e[i]=kx(e,t,r,n)}function ql(e,t,r){e.map=e.userData.baseMap??null,e.color.copy(e.userData.baseColor),e.vertexColors=e.userData.baseVertexColors??e.vertexColors,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??Rx,e.depthWrite=e.userData.baseDepthWrite??!0,e.side=e.userData.baseSide??FP,e.normalMap=e.userData.baseNormalMap??null,e.normalScale.copy(pa(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(pa(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 n=tt(t,"texture"),i=tt(t,"metalnessMap"),o=tt(t,"roughnessMap"),a=tt(t,"emissiveMap"),s=tt(t,"alphaMap"),l=tt(t,"normalMap"),u=tt(t,"bumpMap"),d=tt(t,"aoMap"),p=tt(t,"displacementMap"),c=tt(t,"clearcoatMap"),h=tt(t,"clearcoatRoughnessMap"),m=tt(t,"clearcoatNormalMap"),g=tt(t,"anisotropyMap"),f=tt(t,"transmissionMap"),b=tt(t,"thicknessMap"),w=tt(t,"sheenColorMap"),y=tt(t,"sheenRoughnessMap"),M=tt(t,"specularIntensityMap"),E=tt(t,"specularColorMap");if(n?(e.map=kx(e,"texture",n,t),e.color.set(r??"#ffffff"),e.vertexColors=!1):(El(e.userData,"texture"),r&&(e.map=null,e.color.set(r),e.vertexColors=!1)),At(e,"metalnessMap",i,t),t?.metalness!==void 0&&(e.metalness=t.metalness),At(e,"roughnessMap",o,t),t?.roughness!==void 0&&(e.roughness=t.roughness),t?.emissive?e.emissive.set(t.emissive):a&&e.emissive.set("#ffffff"),t?.emissiveIntensity!==void 0&&(e.emissiveIntensity=t.emissiveIntensity),At(e,"emissiveMap",a,t),t?.opacity!==void 0&&(e.opacity=t.opacity),At(e,"alphaMap",s,t),t?.alphaTest!==void 0&&(e.alphaTest=t.alphaTest),t?.alphaHash!==void 0&&(e.alphaHash=t.alphaHash),t?.dithering!==void 0&&(e.dithering=t.dithering),t?.blendingMode&&(e.blending=rg(t.blendingMode),e.depthWrite=t.blendingMode!=="additive"),t?.side&&(e.side=tg(t.side)),At(e,"normalMap",l,t),l||t?.normalScale!==void 0){let v=t?.normalScale??Math.abs(pa(e.userData.baseNormalScale).x);e.normalScale.set(v,t?.flipNormalY?-v:v)}if(At(e,"bumpMap",u,t),t?.bumpScale!==void 0&&(e.bumpScale=t.bumpScale),At(e,"aoMap",d,t),t?.aoMapIntensity!==void 0&&(e.aoMapIntensity=t.aoMapIntensity),At(e,"displacementMap",p,t),t?.displacementScale!==void 0&&(e.displacementScale=t.displacementScale),t?.displacementBias!==void 0&&(e.displacementBias=t.displacementBias),At(e,"clearcoatMap",c,t),t?.clearcoat!==void 0&&(e.clearcoat=t.clearcoat),At(e,"clearcoatRoughnessMap",h,t),t?.clearcoatRoughness!==void 0&&(e.clearcoatRoughness=t.clearcoatRoughness),At(e,"clearcoatNormalMap",m,t),m||t?.clearcoatNormalScale!==void 0){let v=t?.clearcoatNormalScale??Math.abs(pa(e.userData.baseClearcoatNormalScale).x);e.clearcoatNormalScale.set(v,t?.flipClearcoatNormalY?-v:v)}t?.sheen!==void 0&&(e.sheen=t.sheen),t?.sheenColor&&e.sheenColor.set(t.sheenColor),At(e,"sheenColorMap",w,t),t?.sheenRoughness!==void 0&&(e.sheenRoughness=t.sheenRoughness),At(e,"sheenRoughnessMap",y,t),t?.anisotropy!==void 0&&(e.anisotropy=t.anisotropy),t?.anisotropyRotation!==void 0&&(e.anisotropyRotation=t.anisotropyRotation),At(e,"anisotropyMap",g,t),t?.transmission!==void 0&&(e.transmission=t.transmission),At(e,"transmissionMap",f,t),t?.thickness!==void 0&&(e.thickness=t.thickness),At(e,"thicknessMap",b,t),t?.attenuationColor&&e.attenuationColor.set(t.attenuationColor),t?.attenuationDistance!==void 0&&(e.attenuationDistance=t.attenuationDistance),t?.reflectivity!==void 0&&(e.reflectivity=t.reflectivity),t?.specularIntensity!==void 0&&(e.specularIntensity=t.specularIntensity),At(e,"specularIntensityMap",M,t),t?.specularColor&&e.specularColor.set(t.specularColor),At(e,"specularColorMap",E,t),e.transparent=e.opacity<1||e.transmission>0||e.blending!==Rx||!!((s||e.alphaMap)&&e.alphaTest<=0),e.transparent||(e.depthWrite=!0)}function za(e){return e.material}function Hr(e,t){return Array.isArray(e)?e.map(t):t(e,0)}function Yt(e,t){Array.isArray(e)?e.forEach(t):t(e,0)}function $l(e,t){return Array.isArray(e)?e[t]:e}import{jsx as Zl,jsxs as e2}from"react/jsx-runtime";function Jl(e,t,r){let n=r.get(e);n&&(t?.rotation?e.rotation.set(t.rotation[0],t.rotation[1],t.rotation[2],n.rotation.order):e.rotation.copy(n.rotation),t?.scale?e.scale.fromArray(t.scale):e.scale.copy(n.scale),e.position.fromArray(ja(t?.position??n.position.toArray(),[e.rotation.x,e.rotation.y,e.rotation.z],e.scale.toArray(),t?.pivot,n.rotation.order,t?.shear)),Ri(e,t?.shear))}function xt(e,t=!1){if(!e||typeof e!="object")return"-";let r=e;return[r.channel??0,t?r.format??"":"",r.isVideoTexture?r.colorSpace??"":""].join(":")}function To(e){let t=e,r=Number(t.clearcoat)>0,n=Number(t.sheen)>0,i=Number(t.anisotropy)>0,o=Number(t.transmission)>0,a=t.transparent===!1&&t.blending===KP&&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),i,xt(i?t.anisotropyMap:null),r,xt(r?t.clearcoatMap:null),xt(r?t.clearcoatNormalMap:null,!0),xt(r?t.clearcoatRoughnessMap:null),n,xt(n?t.sheenColorMap:null),xt(n?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.vertexColors,t.side,a].join("|")}var JP={};function Na({url:e,objectBindings:t,selectedItem:r,itemMaterials:n,interactive:i=!0,onItemClick:o,onItemHover:a,onItemDoubleClick:s,onItemContextMenu:l,onModelLoaded:u,onAnimationsReady:d,nodeRefsOut:p,onNodeRefsChange:c,materialRefsOut:h,panelHoveredItem:m,sceneConfig:g,zoomOnSelected:f=!0,highlightOnHover:b=!0,decoderConfig:w,modelFormat:y,onLoadProgress:M,explodeFactor:E=0,suspendBindingTransforms:v=!1,originalNodePoses:P,mergeModels:T,onMergeModelLoaded:_,onMergeModelError:S,pulses:C=JP}){let R=fa(e,w,y,M),A=HP(I=>I.invalidate),[B,N]=sp(null),D=St(null),{setCanvasCursor:V,restoreCanvasCursor:O}=xg();Xe(()=>{(!i||!b)&&(N(null),a?.(null),O())},[i,b,a,O]);let k=ut(()=>Dx.clone(R.scene),[R.scene]),{revision:W,onSourceReady:he}=Mx(k,T,_),ae=St(new Map),[te,ve]=sp(0),U=UP((I,j,z)=>{he(I,j),ae.current.get(I)!==z&&(ae.current.set(I,z),ve(H=>H+1))},[he]);Xe(()=>{let I=new Set(T?.map(z=>z.url)),j=!1;for(let z of ae.current.keys())I.has(z)||(ae.current.delete(z),j=!0);j&&ve(z=>z+1)},[T]);let G=ut(()=>ao(k),[k,W]),J=G.nodesById,{originalMaterials:se,ownMeshes:Ee}=ut(()=>{let I=new WeakMap,j=new WeakSet;return k.traverse(z=>{Et(z)&&(I.set(z,z.material),j.add(z))}),{originalMaterials:I,ownMeshes:j}},[k]);ut(()=>{k.traverse(I=>{Et(I)&&!se.has(I)&&se.set(I,I.material)})},[k,W,se]);let X=R.materialVariants,Ce=(g?so(g.model):[]).join(`
|
|
58
|
+
`),[Ge,Q]=sp(null);Xe(()=>{let I=Ce?Ce.split(`
|
|
59
|
+
`):[],j=[];for(let H of I){let oe=X?X.names.indexOf(H):-1;if(oe>=0){j.push(oe);continue}console.warn(`[react-immersive] The model has no material variant "${H}".`+(X?` Its variants are: ${X.names.join(", ")}.`:" It has no material variants."))}if(!X||j.length===0){Q(null);return}let z=!1,q=[];return k.traverse(H=>{if(!Et(H)||!Ee.has(H))return;let oe=gg(fg(H),j);oe!==null&&q.push(X.resolveMaterial(oe,H).then(ce=>[H,ce]))}),Promise.all(q).then(H=>{z||Q({scene:k,materials:new Map(H)})}).catch(H=>{z||console.warn(`[react-immersive] Material variants "${I.join('", "')}" failed to load.`,H)}),()=>{z=!0}},[k,Ee,X,Ce]);let ot=Ge?.scene===k?Ge.materials:void 0,rt=I=>ot?.get(I)??se.get(I)??za(I);Xe(()=>{G.duplicateNames.size!==0&&console.warn("[react-immersive] Duplicate model node names were assigned unique binding IDs.",Object.fromEntries(G.duplicateNames))},[G]);let Ve=ut(()=>new WeakMap,[k]),ee=ut(()=>{let I=new WeakMap;if(k.traverse(j=>{let z=Ve.get(j);z||(z={position:j.position.clone(),rotation:j.rotation.clone(),scale:j.scale.clone()},Ve.set(j,z)),I.set(j,{position:z.position.clone(),rotation:z.rotation.clone(),scale:z.scale.clone()})}),P)for(let[j,z]of Object.entries(P)){let q=J[j],H=q&&I.get(q);H&&(H.position.fromArray(z.position),z.rotation&&H.rotation.set(z.rotation[0],z.rotation[1],z.rotation[2],H.rotation.order),z.scale&&H.scale.fromArray(z.scale))}return I},[k,J,P,Ve]);Xe(()=>{let I=!1,j=null,z=null,q=window,H=Object.entries(J).filter(([,Fe])=>Et(Fe)),oe=new Kl,ce=[],Ze=0;k.traverse(Fe=>{!Et(Fe)||Fe.userData[Mi]||(Fe.castShadow=!1,Fe.receiveShadow=!0)});let ze=()=>{if(I)return;let Fe=new Set,It=oe.getSize(new Di),Z=new Di;for(let{name:gt,box:Nt}of ce)Nt.getSize(Z),Z.x>It.x*.7&&Z.z>It.z*.7&&Z.y>It.y*.4&&Fe.add(gt);k.traverse(gt=>{if(!Et(gt)||gt.userData[Mi])return;let Nt=ma(gt);gt.castShadow=!Nt||!Fe.has(Nt),gt.receiveShadow=!0}),A()},pt=()=>{I||(q.requestIdleCallback?j=q.requestIdleCallback(et,{timeout:100}):z=window.setTimeout(()=>et(),0))},et=Fe=>{if(j=null,z=null,I)return;let It=performance.now(),Z=0;for(;Ze<H.length&&!(Z>0&&!(Fe?Fe.didTimeout?Z<16:Fe.timeRemaining()>1:performance.now()-It<8));){let[gt,Nt]=H[Ze];Ze+=1,Z+=1;let rr=new Kl().setFromObject(Nt);rr.isEmpty()||(ce.push({name:gt,box:rr}),oe.union(rr))}Ze<H.length?pt():ze()};return pt(),()=>{I=!0,j!==null&&q.cancelIdleCallback?.(j),z!==null&&window.clearTimeout(z)}},[A,J,k]),Xe(()=>{ol(k,{precise:!0})},[k,W]),Xe(()=>{let I=new AbortController;return Js(k,I.signal),()=>{I.abort(),da(k)}},[k,W]);let we=ut(()=>{let I={};for(let[j,z]of Object.entries(t))I[z.modelObjectId??j]=j;return I},[t]),at=ut(()=>Object.entries(t).map(([I,j])=>`${I}${j.modelObjectId??I}`).sort().join(""),[t]),st=ut(()=>Object.entries(t).map(([I,j])=>JSON.stringify([I,j.modelObjectId??I,j.transform??null])).sort().join(""),[t]),ft=St(new Map);Xe(()=>{let I=new Map,j=new Map;for(let[H,oe]of Object.entries(t)){if(!oe.transform)continue;let ce=J[oe.modelObjectId??H];ce&&(I.set(ce,oe.transform),j.set(ce,zn(ce)))}let z=new Set([...ft.current.keys(),...I.keys()]);for(let H of z){Jl(H,void 0,ee);for(let oe of zn(H))tn(oe)}k.updateMatrixWorld(!0);let q=new Map;for(let H of j.values())for(let oe of H)q.has(oe)||q.set(oe,oe.matrixWorld.clone());for(let[H,oe]of I)Jl(H,oe,ee);ft.current=I,k.updateMatrixWorld(!0);for(let[H,oe]of q)oo(H,oe);A()},[k,J,ee,st,A]),Xe(()=>()=>{for(let I of zn(k))tn(I)},[k]);let ne=ut(()=>{let I={};for(let[j,z]of Object.entries(t)){let q=z.modelObjectId??j,H=J[q];if(!Et(H))continue;let oe=rt(H);oe&&(I[j]=Hr(oe,ce=>{let Ze=rl(ce),ze=nl(Ze??new XP);return il(ze),ze}))}return I},[J,at,se,ot]);Xe(()=>(h&&(h.current=ne),()=>{h?.current===ne&&(h.current={})}),[ne,h]),Xe(()=>()=>{for(let I of Object.values(ne))Yt(I,j=>{ty(j.userData),j.dispose()})},[ne]);let ue=g?.model.shading??"lit",Se=g?.model.renderer??"pbr",Ie=g?.wireframe.enabled??!1,He=g?.wireframe.color??"#93c5fd",$=g?.wireframe.opacity??1,le=ut(()=>{let I={};if(ue!=="unlit")return I;for(let[j,z]of Object.entries(ne))I[j]=Hr(z,q=>{let H=new lp;return H.color.copy(q.color),H.map=q.map,H.alphaMap=q.alphaMap,H.alphaTest=q.alphaTest,H.transparent=q.transparent,H.opacity=q.opacity,H.side=q.side,H});return I},[ne,ue]),de=ut(()=>{let I={};if(ue!=="normals")return I;for(let[j,z]of Object.entries(ne))I[j]=Hr(z,()=>new qP);return I},[ne,ue]),Te=ut(()=>{let I={};if(ue!=="lit"||Se!=="matcap")return I;let j=Al();for(let[z,q]of Object.entries(ne))I[z]=Hr(q,H=>{let oe=new $P;return oe.matcap=j,oe.color.copy(H.color),oe.alphaMap=H.alphaMap,oe.alphaTest=H.alphaTest,oe.side=H.side,oe});return I},[ne,ue,Se]);Xe(()=>()=>{for(let I of Object.values(le))Yt(I,j=>j.dispose());for(let I of Object.values(de))Yt(I,j=>j.dispose());for(let I of Object.values(Te))Yt(I,j=>j.dispose())},[le,de,Te]);let Ye=I=>ue==="normals"?de[I]:ue==="unlit"?le[I]:Se==="matcap"?Te[I]:ne[I],Be=St(u);Be.current=u,Xe(()=>{Be.current?.(k)},[k]);let je=ut(()=>{let I={};for(let[j,z]of Object.entries(t)){let q=z.modelObjectId??j,H=J[q];H&&(I[j]=H)}return I},[J,at]);Xe(()=>(p.current=je,c?.(),()=>{p.current===je&&(p.current={})}),[je,p,c]);let pe=St({});Xe(()=>()=>{for(let I of Object.values(pe.current))for(let[j,z]of Object.entries(I))z&&dn(z,Tr(j));pe.current={}},[]);let _e=St(new Map);Xe(()=>()=>{_e.current.clear()},[]);let Ae=ut(()=>{let I=new Map;for(let[j,z]of Object.entries(t)){let q=m===z||m?.id===z.id||m?.modelObjectId===z.modelObjectId,H=b&&(B===j||q),oe=H||r===j;(H||oe)&&I.set(j,{emissive:H,matcap:oe})}return I},[t,b,B,r,m]),Ct=St(Ae);Ct.current=Ae,Xe(()=>{let I=new Set;for(let[j,z]of Object.entries(t)){I.add(j);let q=z.modelObjectId??j,H=J[q];if(!Et(H))continue;if(z.removed){H.parent&&(_e.current.set(H,H.parent),H.parent.remove(H),k.dispatchEvent({type:"childremoved",child:H}));continue}let oe=_e.current.get(H);oe&&(H.parent||(oe.add(H),k.dispatchEvent({type:"childadded",child:H})),_e.current.delete(H)),H.visible=z.visible!==!1;let ce=ne[j];if(!ce)continue;if(Se!=="uv-checker"){let Z=Ye(j);Z&&(H.material=Z)}if(z.visible===!1)continue;let Ze=le[j],ze=Te[j],pt=n[j]??n[z.modelObjectId??j],et=z.style?.material,Fe=pe.current[j]??{};for(let Z of jn){let gt=tt(et,Z),Nt=Fe[Z];if(Nt===gt)continue;let rr=Tr(Z);Nt&&dn(Nt,rr),gt?(yo(gt,rr,A),Fe[Z]=gt):delete Fe[Z]}Object.keys(Fe).length>0?pe.current[j]=Fe:delete pe.current[j];let It=pt?.hex??et?.baseColor;Yt(ce,(Z,gt)=>{let Nt=To(Z);ql(Z,et,It);let rr=Z.userData.reactImmersiveConfiguredEmissive;rr?.isColor?rr.copy(Z.emissive):Z.userData.reactImmersiveConfiguredEmissive=Z.emissive.clone();let Hi=Ct.current.get(j);Hi?.emissive&&Z.emissive.add(wi),Nt!==To(Z)&&(Z.needsUpdate=!0);let Vt=$l(Ze,gt);if(Vt){let Yo=To(Vt);Vt.color.copy(Z.color),Vt.map=Z.map,Vt.vertexColors=Z.vertexColors,Vt.alphaMap=Z.alphaMap,Vt.alphaTest=Z.alphaTest,Vt.transparent=Z.transparent,Vt.opacity=Z.opacity,Vt.side=Z.side,Yo!==To(Vt)&&(Vt.needsUpdate=!0)}let Lt=$l(ze,gt);if(Lt){let Yo=To(Lt);Hi?.matcap?Lt.color.set(un.color):Lt.color.copy(Z.color),Lt.map=Z.map,Lt.vertexColors=Z.vertexColors,Lt.alphaMap=Z.alphaMap,Lt.alphaTest=Z.alphaTest,Lt.transparent=Z.transparent,Lt.opacity=Z.opacity,Lt.side=Z.side,Yo!==To(Lt)&&(Lt.needsUpdate=!0)}})}for(let j of Object.keys(pe.current))if(!I.has(j)){for(let[z,q]of Object.entries(pe.current[j]))q&&dn(q,Tr(z));delete pe.current[j]}A()},[t,J,ne,le,de,Te,n,ue,Se,A]);let gr=St(new Map);Xe(()=>{let I=gr.current,j=new Set([...I.keys(),...Ae.keys()]),z=!1;for(let q of j){let H=I.get(q),oe=Ae.get(q),ce=!!H?.emissive!=!!oe?.emissive,Ze=!!H?.matcap!=!!oe?.matcap;if(!ce&&!Ze)continue;z=!0;let ze=ne[q],pt=Te[q];ze&&Yt(ze,(et,Fe)=>{let It=et.userData.reactImmersiveConfiguredEmissive;ce&&It?.isColor&&(et.emissive.copy(It),oe?.emissive&&et.emissive.add(wi));let Z=$l(pt,Fe);Ze&&Z&&(oe?.matcap?Z.color.set(un.color):Z.color.copy(et.color))})}gr.current=Ae,z&&A()},[Ae,ne,Te,A]),ay({objectBindings:t,nodeMap:J,invalidate:A});let nt=ut(()=>Object.entries(C).map(([I,j])=>({key:I,color:new WP(j.color),speed:j.speed})),[C]),dt=St(new Set);Xe(()=>{let I=new Set(nt.map(({key:j})=>j));for(let j of dt.current){if(I.has(j)||!ne[j])continue;let z=Ct.current.get(j)?.emissive;Yt(ne[j],q=>{let H=q.userData.reactImmersiveConfiguredEmissive;H?.isColor&&(q.emissive.copy(H),z&&q.emissive.add(wi))})}dt.current=I,A()},[nt,ne,A]),Yl(({clock:I})=>{if(nt.length===0)return;let j=I.getElapsedTime();for(let{key:z,color:q,speed:H}of nt){let oe=ne[z];if(!oe)continue;let ce=(1-Math.cos(2*Math.PI*H*j))/2,Ze=Ct.current.get(z)?.emissive;Yt(oe,ze=>{let pt=ze.userData.reactImmersiveConfiguredEmissive;pt?.isColor&&(ze.emissive.copy(pt).lerp(q,ce),Ze&&ze.emissive.add(wi))})}A()}),Xe(()=>{if(Se==="uv-checker")return;let I=new Set(Object.values(je)),j=!1;k.traverse(z=>{if(!Et(z)||I.has(z)||!se.has(z))return;let q=ot?.get(z)??se.get(z);z.material!==q&&(z.material=q,j=!0)}),j&&A()},[k,je,se,ot,Se,A]),Xe(()=>{if(Se!=="uv-checker")return;let I=ry(),j=[];return k.traverse(z=>{if(!Et(z)||z.userData[Mi])return;let q=z.material,H=Array.isArray(q)?q:[q],oe=!!z.geometry.getAttribute("uv"),ce=H.map((ze,pt)=>{let et=new lp({color:oe?"#ffffff":"#ff00ff",map:oe?I:null,side:ze.side});return et.name=`${z.name||"mesh"}-uv-checker-${pt}`,et.toneMapped=!1,et}),Ze=Array.isArray(q)?ce:ce[0];z.material=Ze,j.push({node:z,original:q,diagnostic:Ze})}),A(),()=>{for(let{node:z,original:q,diagnostic:H}of j){z.material=q;let oe=Array.isArray(H)?H:[H];for(let ce of oe)ce.dispose()}A()}},[k,Se,A,W]),Xe(()=>{if(!Ie)return;let I=[];for(let[j,z]of Object.entries(t)){let q=z.modelObjectId??j,H=J[q];if(!Et(H))continue;let oe=new lp({color:He,wireframe:!0,transparent:!0,opacity:$,depthTest:!1,depthWrite:!1,side:YP,toneMapped:!1}),ce=H.clone(!1);ce.name="",ce.position.set(0,0,0),ce.quaternion.identity(),ce.scale.set(1,1,1),ce.matrix.identity(),ce.matrixAutoUpdate=!0,ce.material=oe,ce.castShadow=!1,ce.receiveShadow=!1,ce.frustumCulled=!1,ce.renderOrder=1,ce.userData={isWireframeOverlay:!0},ce.raycast=()=>{},H.morphTargetInfluences&&(ce.morphTargetInfluences=H.morphTargetInfluences),H.add(ce),I.push({node:H,overlay:ce})}return A(),()=>{for(let{node:j,overlay:z}of I)j.remove(z),z.material.dispose()}},[Ie,He,$,J,t,A]);let qt=ut(()=>{let I=Array.from(ae.current.values()).flat();return _x([...R.animations,...I])},[R.animations,te]),er=St(d);er.current=d;let Rr=St(g);Rr.current=g;let br=St(null),it=St(null),tr=St(new Set),Pn=St(0),kr=I=>{tr.current.forEach(j=>j(I))};Xe(()=>{let I=Ax({root:k,clips:qt,getClipConfig:z=>ng(Rr.current,z),onChange:()=>{kr(I.getState()),ol(k),A()}});br.current=I,it.current={clips:qt.map(({sourceName:z})=>z),clipDetails:qt.map(({sourceName:z,duration:q})=>({sourceName:z,duration:q})),play:I.play,pause:I.pause,stop:I.stop,setSpeed:I.setSpeed,seek:I.seek,getState:I.getState,subscribe:z=>(tr.current.add(z),z(I.getState()),()=>{tr.current.delete(z)})},kr(I.getState());let j=Rr.current?.animations.autoplayClip;return j&&I.play(j),()=>{I.dispose(),br.current=null,it.current=null,kr(I.getState())}},[k,qt]);let Wo=!!d;Xe(()=>{Wo&&it.current&&er.current?.(it.current)},[k,qt,Wo,i]),Xe(()=>{g?.animations&&br.current?.applyClipConfigs()},[g?.animations]),Yl((I,j)=>{let z=br.current;if(z?.isRunning()){if(z.update(j),!v)for(let[q,H]of ft.current)Jl(q,H,ee);Pn.current+=j,ol(k,{updateFallbacks:Pn.current>=.066}),A(),Pn.current>=.066&&(Pn.current=0,kr(z.getState()))}});let Jr=ut(()=>(g?.model.rotation??[0,0,0]).map(I=>I*Math.PI/180),[g?.model.rotation]);Yl((I,j)=>{if(!D.current)return;let z=D.current.rotation;z.x=Ql.lerp(z.x,Jr[0],1-Math.exp(-5*j)),z.y=Ql.lerp(z.y,Jr[1],1-Math.exp(-5*j)),z.z=Ql.lerp(z.z,Jr[2],1-Math.exp(-5*j)),Math.abs(z.x-Jr[0])<1e-4&&Math.abs(z.y-Jr[1])<1e-4&&Math.abs(z.z-Jr[2])<1e-4||A()});let Xo=St([]),Ss=St(0),ii=St(0),qo=ut(()=>new Di,[]);Xe(()=>{let I=new Map;for(let[ze,pt]of Object.entries(t)){let et=J[pt.modelObjectId??ze];et&&I.set(et,pt)}for(let ze of Xo.current)Jl(ze.node,I.get(ze.node)?.transform,ee);ii.current=0,k.updateWorldMatrix(!0,!0);let j=new Kl().setFromObject(k),z=j.getCenter(new Di),q=j.getSize(new Di).length()*.5;Ss.current=Number.isFinite(q)?q:0;let H=[...I.keys()],oe=new Set(H),ce=[],Ze=new Di;for(let ze of H){if(!ze.parent)continue;let pt=ze.parent,et=!1;for(;pt;){if(oe.has(pt)){et=!0;break}pt=pt.parent}if(et)continue;let Fe=new Kl().setFromObject(ze);if(Fe.isEmpty())continue;Fe.getCenter(Ze);let It=Ze.clone().sub(z);It.lengthSq()<1e-8||(It.normalize(),ce.push({node:ze,restLocalPos:ze.position.clone(),restWorldPos:ze.getWorldPosition(new Di),worldDir:It,parentInverse:new QP().copy(ze.parent.matrixWorld).invert()}))}Xo.current=ce,A()},[k,J,at,st,ee,A]),Xe(()=>{A()},[E,A]),Yl((I,j)=>{let z=Xo.current;if(z.length===0)return;let q=Math.min(Math.max(E,0),1),H=ii.current;if(Math.abs(H-q)<1e-4){if(H===q)return;ii.current=q}else ii.current=Ql.lerp(H,q,1-Math.exp(-6*j)),A();let oe=ii.current*Ss.current;for(let ce of z)qo.copy(ce.worldDir).multiplyScalar(oe).add(ce.restWorldPos).applyMatrix4(ce.parentInverse),ce.node.position.copy(qo),ce.node.matrixAutoUpdate||(ce.node.matrix.setPosition(ce.node.position),ce.node.matrixWorldNeedsUpdate=!0)});let En=I=>{let j=I;for(;j;){let z=ma(j),q=z?we[z]:void 0;if(q&&t[q])return[q,t[q]];j=j.parent}return null},$o=I=>{let j=En(I);if(!j)return null;let[z,q]=j;return J[q.modelObjectId??z]??null},Cs=ml(I=>{let j=En(I);return j&&j[1].selectable!==!1?j[1]:null},i?l:void 0,$o),Jc=I=>{if(Cs.consumeClick())return;let j=En(I.object);if(!j)return;let[,z]=j;z.selectable!==!1&&(I.stopPropagation(),o(z,ho(I,$o(I.object))))},Dr=I=>{let j=En(I.object);if(!j)return;let[,z]=j;if(z.selectable===!1)return;s?.(z,ho(I,$o(I.object)))&&I.stopPropagation()},Lr=I=>{if(!b)return;let j=En(I.object);if(!j)return;let[z,q]=j;q.hoverable!==!1&&(I.stopPropagation(),V("pointer"),N(z),a?.(q))},Ts=I=>{b&&(I.stopPropagation(),O(),N(null),a?.(null))},oi=ut(()=>!If(k),[k,W]);return e2("group",{ref:D,children:[Zl("primitive",{object:k,...i&&oi?{onClick:Jc,onDoubleClick:Dr,...l?{onPointerDown:Cs.onPointerDown}:{},...b?{onPointerOver:Lr,onPointerOut:Ts}:{}}:{}}),T?.map(I=>Zl(Ur,{onLoadError:j=>S?.(I.url,j),children:Zl(GP,{fallback:null,children:Zl(ZP,{url:I.url,namePrefix:I.namePrefix,decoderConfig:w,onReady:U})})},I.url))]})}function ZP({url:e,namePrefix:t,decoderConfig:r,onReady:n}){let i=fa(e,r),o=ut(()=>{let l=Dx.clone(i.scene);return dg(l,t),l},[i.scene,t]),a=ut(()=>i.animations.map(l=>pg(l,t)),[i.animations,t]),s=St(n);return s.current=n,Xe(()=>{s.current(e,o,a)},[e,o,a]),null}import{Suspense as t2,useEffect as r2,useRef as n2}from"react";import{jsx as ec}from"react/jsx-runtime";function i2({url:e,decoderConfig:t,onModelLoaded:r}){let{scene:n}=fa(e,t),i=n2(r);return i.current=r,r2(()=>{i.current?.(n)},[n]),ec("primitive",{object:n})}function Lx({url:e,decoderConfig:t,onLoadError:r,onModelLoaded:n}){return ec(Ur,{onLoadError:i=>r?.(e,i),children:ec(t2,{fallback:null,children:ec(i2,{url:e,decoderConfig:t,onModelLoaded:n})})})}import{Suspense as o2,useCallback as Ox,useRef as Ix}from"react";import{jsx as cp}from"react/jsx-runtime";var a2={};function Bx({entry:e,isActive:t,decoderConfig:r,itemMaterials:n,sceneConfig:i,zoomOnSelected:o,highlightOnHover:a,explodeFactor:s,suspendBindingTransforms:l,onLoadProgress:u,onAnimationsReady:d,onModelAnimationsReady:p,onLoadError:c,onModelLoaded:h,selectedItem:m,panelHoveredItem:g,onItemClick:f,onItemDoubleClick:b,onItemContextMenu:w,onItemHover:y,nodeRefsOut:M,onNodeRefsChange:E,materialRefsOut:v,onMergeModelLoaded:P,onMergeModelError:T,pulses:_}){let S=Ix({}),C=Ix({}),R=Ox(()=>{},[]),A=Ox(N=>{t&&d?.(N),p?.(e.url,N)},[t,d,p,e.url]),B=!!d||!!p;return cp(Ur,{onLoadError:N=>c?.(e.url,N),children:cp(o2,{fallback:null,children:cp(Na,{url:e.url,interactive:t,objectBindings:e.objectBindings,selectedItem:t?m:null,itemMaterials:t?n:a2,onItemClick:t?f:R,onItemDoubleClick:t?b:void 0,onItemContextMenu:t?w:void 0,onItemHover:t?y:void 0,onModelLoaded:h?N=>h(e.url,N):void 0,onAnimationsReady:B?A:void 0,nodeRefsOut:t?M:S,onNodeRefsChange:t?E:void 0,materialRefsOut:v??C,panelHoveredItem:t?g:void 0,sceneConfig:t?i:e.sceneConfig??i,zoomOnSelected:t&&o,highlightOnHover:t&&!!a,decoderConfig:r,onLoadProgress:t?u:void 0,explodeFactor:s,suspendBindingTransforms:t?l:!1,originalNodePoses:e.originalNodePoses,mergeModels:e.mergeModels,onMergeModelLoaded:P,onMergeModelError:T,pulses:t?_:void 0})})})}import{useCallback as Qn,useEffect as Jn,useMemo as bA,useRef as jt,useState as Jp}from"react";import{useFrame as yA,useThree as xA}from"@react-three/fiber";import{Box3 as Xx,BoxGeometry as C2,Group as Hx,Matrix4 as qx,Mesh as T2,MeshBasicMaterial as _2,Vector3 as mn}from"three";import{Euler as s2,Matrix4 as Li,MeshBasicMaterial as l2,MeshMatcapMaterial as c2,MeshNormalMaterial as u2,MeshStandardMaterial as d2,Quaternion as p2,Vector3 as Fa}from"three";function Vx(e){let t={};for(let[r,n]of Object.entries(e))t[n.modelObjectId??r]=r;return t}function pp(e){let t=e,r=null;for(;t;){let n=t.userData?.ri_name;if(typeof n=="string"&&n)return n;!r&&t.name&&(r=t.name),t=t.parent}return r}function Fx(e,t){return e||(t?t.modelObjectId??t.id:null)}function rc(e,t){let r=pp(e);if(!r)return null;let n=t.keyByModelObject[r]??r,i=t.objectBindings[n];return i?{key:n,binding:i}:null}var _o=new Fa,up=new Fa,h2=new Li,jx=new Li,Va=new Li,m2=new Li,tc=new Li,f2=new Li,g2=new Li,zx=new Fa,Nx=new Fa,Wn=new Fa,dp=new p2,b2=new s2;function y2(e,t,r,n,i){let o=!!(r?.position||r?.rotation||r?.scale||r?.shear),a=!!(i&&i.factor>0&&i.radius>0);if(!o&&!a){e.matrixAutoUpdate=!0,e.position.copy(t.position),e.rotation.copy(t.rotation),e.scale.copy(t.scale),e.updateMatrix(),e.updateWorldMatrix(!0,!1);return}jx.compose(t.position,dp.setFromEuler(t.rotation),t.scale);let s=r?.rotation;Va.compose(zx.fromArray(ja(r?.position??[0,0,0],s??[0,0,0],r?.scale??[1,1,1],r?.pivot,"XYZ",r?.shear)),dp.setFromEuler(b2.set(s?.[0]??0,s?.[1]??0,s?.[2]??0)),Nx.fromArray(r?.scale??[1,1,1])),r?.shear&&Va.makeRotationFromQuaternion(dp).multiply(Co(r.shear)).scale(Nx).setPosition(zx),Va.premultiply(n).multiply(m2.copy(n).invert()),e.parent?.updateWorldMatrix(!0,!1);let l=e.parent?.matrixWorld??h2;if(tc.multiplyMatrices(l,jx).premultiply(Va),a&&i){let u=e;for(;u.parent&&!u.userData.ri_name;)u=u.parent;let d=u.userData.ri_center;Array.isArray(d)&&d.length===3?Wn.fromArray(d).applyMatrix4(n).applyMatrix4(Va):Wn.setFromMatrixPosition(tc),Wn.sub(i.centre),Wn.lengthSq()>1e-8&&(Wn.normalize().multiplyScalar(i.factor*i.radius),tc.premultiply(g2.makeTranslation(Wn.x,Wn.y,Wn.z)))}e.matrixAutoUpdate=!1,e.matrix.multiplyMatrices(f2.copy(l).invert(),tc),e.matrixWorldNeedsUpdate=!0,e.updateWorldMatrix(!1,!1)}function nc(e,t){if(!Et(e)&&!e.userData.riLogicalObject)return;let r=rc(e,t);if(!r)return;let n=Ux(e);if(n.rest??(n.rest={position:e.position.clone(),rotation:e.rotation.clone(),scale:e.scale.clone()}),t.suspendTransforms)return;if(t.placementFrame&&!e.userData.riLogicalObject){y2(e,n.rest,r.binding.transform,t.placementFrame,t.explode);return}let i=n.rest,o=r.binding.transform;o?.position?e.position.fromArray(o.position):e.position.copy(i.position),o?.rotation?e.rotation.set(o.rotation[0],o.rotation[1],o.rotation[2],i.rotation.order):e.rotation.copy(i.rotation),o?.scale?e.scale.fromArray(o.scale):e.scale.copy(i.scale),e.position.fromArray(ja(e.position.toArray(),[e.rotation.x,e.rotation.y,e.rotation.z],e.scale.toArray(),o?.pivot,i.rotation.order,o?.shear)),Ri(e,o?.shear);let a=t.explode;if(a&&a.factor>0&&a.radius>0){e.updateWorldMatrix(!0,!1),up.setFromMatrixPosition(e.matrixWorld);let s=e;for(;s.parent&&!s.userData.ri_name;)s=s.parent;let l=s.userData.ri_center;Array.isArray(l)&&l.length===3?_o.fromArray(l).applyMatrix4(e.matrixWorld).sub(a.centre):_o.copy(up).sub(a.centre),_o.lengthSq()>1e-8&&(_o.normalize().multiplyScalar(a.factor*a.radius).add(up),e.parent&&e.parent.worldToLocal(_o),e.position.copy(_o))}Ri(e,o?.shear),e.updateWorldMatrix(!0,!1)}function Po(e,t){e.traverse(r=>nc(r,t))}function Ux(e){var t;return(t=e.userData).riVisuals??(t.riVisuals={}),e.userData.riVisuals}function x2(e,t,r,n){return JSON.stringify([e?.style?.material??null,t??null,r.shadingMode,r.rendererMode,n])}function v2(e){if(e.textures){for(let t of jn){let r=e.textures[t];r&&dn(r,Tr(t))}e.textures=void 0}}function w2(e,t,r){let n=e.textures??{};for(let i of jn){let o=tt(t,i),a=n[i];if(a===o)continue;let s=Tr(i);a&&dn(a,s),o?(yo(o,s,r),n[i]=o):delete n[i]}e.textures=Object.keys(n).length>0?n:void 0}function M2(e,t){if(t.shadingMode==="normals")return Hr(e,()=>new u2);if(t.shadingMode==="unlit")return Hr(e,r=>{let n=new l2;return n.color.copy(r.color),n.map=r.map,n.vertexColors=r.vertexColors,n.alphaMap=r.alphaMap,n.alphaTest=r.alphaTest,n.transparent=r.transparent,n.opacity=r.opacity,n.side=r.side,n});if(t.rendererMode==="matcap"){let r=Al();return Hr(e,n=>{let i=new c2;return i.matcap=r,i.color.copy(n.color),i.vertexColors=n.vertexColors,i.alphaMap=n.alphaMap,i.alphaTest=n.alphaTest,i.side=n.side,i})}return e}function S2(e,t){if(!Et(e))return;let n=Ux(e);n.original??(n.original=za(e));let i=rc(e,t);if(!i){n.original&&(e.material=n.original),e.visible=!0;return}let{key:o,binding:a}=i;e.visible=a.visible!==!1,nc(e,t);let s=t.itemMaterials?.[o]?.hex??t.itemMaterials?.[a.modelObjectId??o]?.hex,l=t.highlightOnHover!==!1&&o===t.hoveredKey,u=x2(a,s,t,l);if(n.signature===u&&n.display){e.material=n.display;return}let d=a.style?.material;if(w2(n,d,t.invalidate),!n.physical){let p=n.original??za(e);if(!p)return;n.physical=Hr(p,c=>{let h=rl(c),m=nl(h??new d2);return il(m),m})}Yt(n.physical,p=>{ql(p,d,s??d?.baseColor),l&&(p.emissive.add(wi),p.color.lerp(Kb,Qb)),p.needsUpdate=!0}),n.display&&n.display!==n.physical&&Yt(n.display,p=>p.dispose()),n.display=M2(n.physical,t),n.signature=u,e.material=n.display}function Gx(e,t){e.traverse(r=>S2(r,t))}function hp(e){e.traverse(t=>{if(!Et(t))return;let r=t.userData.riVisuals;r&&(r.rest&&(t.matrixAutoUpdate=!0,t.position.copy(r.rest.position),t.rotation.copy(r.rest.rotation),t.scale.copy(r.rest.scale),t.updateMatrix()),r.original&&(t.material=r.original),r.display&&r.display!==r.physical&&Yt(r.display,n=>n.dispose()),r.physical&&Yt(r.physical,n=>n.dispose()),v2(r),delete t.userData.riVisuals)})}var $x=new qx().makeRotationX(Math.PI/2),Wx=$x.clone().invert();function P2(e){let t=new mn(e[0],e[1],e[2]),r=new mn(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 Xx(t.clone().sub(r),t.clone().add(r))}function E2(e){let t=e.getCenter(new mn),r=e.getSize(new mn).multiplyScalar(.5);return[t.x,t.y,t.z,r.x,0,0,0,r.y,0,0,0,r.z]}var ic=class{constructor(){this.group=new Hx;this.objects=new Map;this.geometry=new C2(1,1,1);this.material=new _2;this.originalBounds=new WeakMap;this.signature="";this.lastContext=null;this.lastEffective=null;this.lastDragging=!1;this.version=0;this.tileVersions=new WeakMap;this.transforms=new Map}setCatalog(t){this.group.clear(),this.objects.clear();for(let r of t){let n=new Xx(new mn(...r.minimum),new mn(...r.maximum)).applyMatrix4(Wx),i=new Hx;i.name=r.name,i.userData.ri_name=r.name,i.userData.riLogicalObject=!0,i.userData.ri_center=n.getCenter(new mn).toArray();let o=new T2(this.geometry,this.material);o.visible=!1,o.raycast=()=>{},o.position.copy(n.getCenter(new mn)),o.scale.copy(n.getSize(new mn)),i.add(o),this.group.add(i),this.objects.set(r.name,i)}this.signature="",this.lastContext=null}nodesByBinding(t){let r={};for(let[n,i]of this.objects){let o=t.keyByModelObject[n]??n;t.objectBindings[o]&&(r[o]=i)}return r}sync(t,r,n=!1){if(!n&&!this.lastDragging&&t===this.lastContext&&this.lastEffective)return this.lastEffective;this.lastContext=t,this.lastDragging=n;let i={...t,suspendTransforms:!1},o=r?t.objectBindings[r]:void 0,a=o?this.objects.get(o.modelObjectId??r):void 0;n&&a&&o&&(i={...i,objectBindings:{...t.objectBindings,[r]:{...o,transform:{position:a.position.toArray(),rotation:[a.rotation.x,a.rotation.y,a.rotation.z],scale:a.scale.toArray()}}}});for(let l of this.objects.values())n&&l===a||nc(l,i);this.group.updateWorldMatrix(!0,!0);let s=[...this.objects].map(([l,u])=>`${l}:${u.matrix.elements.join(",")}`).join(";");if(s!==this.signature){this.signature=s,this.version++,this.transforms.clear();for(let[l,u]of this.objects)u.matrix.equals(new qx)||this.transforms.set(l,$x.clone().multiply(u.matrix).multiply(Wx))}return this.lastEffective=i,i}updateBounds(t){if(!t)return;let r=n=>{if(this.tileVersions.get(n)!==this.version){if(n.boundingVolume.box&&this.tileVersions.get(n)!==this.version){let i=this.originalBounds.get(n);i||(i={box:[...n.boundingVolume.box],error:n.geometricError},this.originalBounds.set(n,i));let o=P2(i.box),a=o.clone(),s=1;for(let u of n.extras?.featureIds??[]){let d=this.transforms.get(u);d&&(a.union(o.clone().applyMatrix4(d)),s=Math.max(s,d.getMaxScaleOnAxis()))}let l=E2(a);n.boundingVolume.box=l,n.geometricError=i.error*s,n.engineData?.boundingVolume?.setObbData(l,n.engineData.transform),this.tileVersions.set(n,this.version)}n.children?.forEach(r)}};r(t)}dispose(){this.group.clear(),this.objects.clear(),this.geometry.dispose(),this.material.dispose()}};var mp=Object.freeze({factor:1,loosened:!1,tooFine:0,raisedAt:-1/0,changedAt:-1/0}),Ua=16,fp=1.25,A2=1.5,R2=1.25,k2=500,D2=3e3,Yx=5e3,Kx=2e3,L2=.9;function Qx(e){return e.full&&(e.wanting||e.usage>1)}function Jx(e){return e.loosened?D2:k2}function Zx(e){let t=e.factor/R2;return t<=1+1e-6?1:t}function ev(e,t){return e.factor>1&&!e.loosened&&!t.full&&!t.wanting&&t.usage<L2&&Zx(e)>e.tooFine}function tv(e,t){let{now:r}=t,n=t.moved&&e.tooFine>0?{...e,tooFine:0}:e;if(Qx(t)){if(r-n.changedAt<Jx(n))return n;let i=Math.max(n.tooFine,n.factor);return n.factor>=Ua?n.loosened&&n.tooFine===i?n:{...n,loosened:!0,tooFine:i,changedAt:r}:{factor:Math.min(Ua,n.factor*A2),loosened:!0,tooFine:i,raisedAt:r,changedAt:r}}return n.loosened&&!t.wanting?{...n,loosened:!1,changedAt:r}:ev(n,t)&&r-n.raisedAt>=Yx&&r-n.changedAt>=Kx?{...n,factor:Zx(n),changedAt:r}:n}function rv(e,t){let{now:r}=t;return Qx(t)?e.factor>=Ua&&e.loosened?null:Math.max(0,Jx(e)-(r-e.changedAt)):e.loosened&&!t.wanting?0:ev(e,t)?Math.max(0,Yx-(r-e.raisedAt),Kx-(r-e.changedAt)):null}function av(e){try{let t=typeof location<"u"?location.href:void 0;return new URL(e,t).origin}catch{return null}}function gp(e){if(!e)return null;let t=e.length,r=e.indexOf("?"),n=e.indexOf("#");r!==-1&&(t=Math.min(t,r)),n!==-1&&(t=Math.min(t,n));let i=e.lastIndexOf(".",t),o=e.lastIndexOf("/",t),a=e.indexOf("://");return a!==-1&&a+2===o||i===-1||i<o?null:e.substring(i+1,t)||null}var ac,Ga=(ac=class{static setXRSession(e){e!==this.session&&(this.flushPending(),this.session=e)}static requestAnimationFrame(e){let{session:t,pending:r}=this,n,i=()=>{r.delete(n),e()};return n=t?t.requestAnimationFrame(i):requestAnimationFrame(i),r.set(n,e),n}static cancelAnimationFrame(e){let{pending:t,session:r}=this;t.delete(e),r?r.cancelAnimationFrame(e):cancelAnimationFrame(e)}static flushPending(){this.pending.forEach((e,t)=>{e(),this.cancelAnimationFrame(t)})}},id(ac,"pending",new Map),id(ac,"session",null),ac),nv=2**30,Xa=class{get unloadPriorityCallback(){return this._unloadPriorityCallback}set unloadPriorityCallback(e){e.length===1?(console.warn('LRUCache: "unloadPriorityCallback" function has been changed to take two arguments.'),this._unloadPriorityCallback=(t,r)=>{let n=e(t),i=e(r);return n<i?-1:+(n>i)}):this._unloadPriorityCallback=e}constructor(){this.minSize=6e3,this.maxSize=8e3,this.minBytesSize=.3*nv,this.maxBytesSize=.4*nv,this.unloadPercent=.05,this.autoMarkUnused=!0,this.cachedBytes=0,this.itemSet=new Map,this.itemList=[],this.usedSet=new Set,this.callbacks=new Map,this.unloadingHandle=-1,this.bytesMap=new Map,this.loadedSet=new Set,this._unloadPriorityCallback=null;let e=this.itemSet;this.defaultPriorityCallback=t=>e.get(t)}isFull(){return this.itemSet.size>=this.maxSize||this.cachedBytes>=this.maxBytesSize}getMemoryUsage(e){return this.bytesMap.get(e)||0}setMemoryUsage(e,t){let{bytesMap:r,itemSet:n}=this;n.has(e)&&(this.cachedBytes-=r.get(e)||0,r.set(e,t),this.cachedBytes+=t)}add(e,t){let r=this.itemSet;if(r.has(e)||this.isFull())return!1;let n=this.usedSet,i=this.itemList,o=this.callbacks;return i.push(e),n.add(e),r.set(e,Date.now()),o.set(e,t),!0}has(e){return this.itemSet.has(e)}remove(e){let t=this.usedSet,r=this.itemSet,n=this.itemList,i=this.bytesMap,o=this.callbacks,a=this.loadedSet;if(r.has(e)){this.cachedBytes-=i.get(e)||0,i.delete(e),o.get(e)(e);let s=n.indexOf(e);return n.splice(s,1),t.delete(e),r.delete(e),o.delete(e),a.delete(e),!0}return!1}setLoaded(e,t){let{itemSet:r,loadedSet:n}=this;r.has(e)&&(t===!0?n.add(e):n.delete(e))}markUsed(e){let t=this.itemSet,r=this.usedSet;t.has(e)&&!r.has(e)&&(t.set(e,Date.now()),r.add(e))}markUnused(e){this.usedSet.delete(e)}markAllUnused(){this.usedSet.clear()}isUsed(e){return this.usedSet.has(e)}unloadUnusedContent(){let{unloadPercent:e,minSize:t,maxSize:r,itemList:n,itemSet:i,usedSet:o,loadedSet:a,callbacks:s,bytesMap:l,minBytesSize:u,maxBytesSize:d}=this,p=n.length-o.size,c=n.length-a.size,h=Math.max(Math.min(n.length-t,p),0),m=this.cachedBytes-u,g=this.unloadPriorityCallback||this.defaultPriorityCallback,f=!1,b=h>0&&p>0||c&&n.length>r;if(p&&this.cachedBytes>u||c&&this.cachedBytes>d||b){n.sort((T,_)=>{let S=o.has(T);if(S===o.has(_)){let C=a.has(T);return C===a.has(_)?-g(T,_):C?1:-1}else return S?1:-1});let w=Math.max(t*e,h*e),y=Math.ceil(Math.min(w,p,h)),M=Math.max(e*m,e*u),E=Math.min(M,m),v=0,P=0;for(;this.cachedBytes-P>d||n.length-v>r;){let T=n[v],_=l.get(T)||0;if(o.has(T)&&a.has(T)||this.cachedBytes-P-_<d&&n.length-v<=r)break;P+=_,v++}for(;P<E||v<y;){let T=n[v],_=l.get(T)||0;if(o.has(T)||this.cachedBytes-P-_<u&&v>=y)break;P+=_,v++}n.splice(0,v).forEach(T=>{this.cachedBytes-=l.get(T)||0,s.get(T)(T),l.delete(T),i.delete(T),s.delete(T),a.delete(T),o.delete(T)}),f=v<h||P<m&&v<p,f&&(f=v>0)}f&&(this.unloadingHandle=Ga.requestAnimationFrame(()=>this.scheduleUnload()))}scheduleUnload(){Ga.cancelAnimationFrame(this.unloadingHandle),this.scheduled||(this.scheduled=!0,queueMicrotask(()=>{this.scheduled=!1,this.unloadUnusedContent()}))}},O2=class extends DOMException{constructor(){super("PriorityQueue: Item removed","AbortError")}},Wr=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=>{Ga.requestAnimationFrame(e)},this._runjobs=()=>{this.scheduled=!1,this.tryRunJobs()}}sort(){let e=this.priorityCallback,t=this.items;e!==null&&t.sort(e)}has(e){return this.callbacks.has(e)}add(e,t){let r={callback:t,reject:null,resolve:null,promise:null};return r.promise=new Promise((n,i)=>{let o=this.items,a=this.callbacks;r.resolve=n,r.reject=i,o.unshift(e),a.set(e,r),this.autoUpdate&&this.scheduleJobRun()}),r.promise}remove(e){let t=this.items,r=this.callbacks,n=t.indexOf(e);if(n!==-1){let i=r.get(e);i.promise.catch(o=>{if(o.name!=="AbortError")throw o}),i.reject(new O2),t.splice(n,1),r.delete(e)}}removeByFilter(e){let{items:t}=this;for(let r=0;r<t.length;r++){let n=t[r];e(n)&&(this.remove(n),r--)}}tryRunJobs(){this.sort();let e=this.items,t=this.callbacks,r=this.maxJobs,n=0,i=()=>{this.currJobs--,this.autoUpdate&&this.scheduleJobRun()};for(;r>this.currJobs&&e.length>0&&n<r;){this.currJobs++,n++;let o=e.pop(),{callback:a,resolve:s,reject:l}=t.get(o);t.delete(o);let u;try{u=a(o)}catch(d){l(d),i();continue}u instanceof Promise?u.then(s).catch(l).finally(i):(s(u),i())}}flush(e){let{items:t,callbacks:r}=this,n=t.indexOf(e);if(!r.has(e))return;let{callback:i,resolve:o,reject:a}=r.get(e);r.delete(e),t.splice(n,1);let s;try{s=i(e)}catch(l){a(l);return}return s instanceof Promise?s.then(o).catch(a):o(s),s}scheduleJobRun(){this.scheduled||(this.scheduled=(this._schedulingCallback(this._runjobs),!0))}},uc=class{get running(){for(let e of this.originQueues.values())if(e.running)return!0;return!1}get maxJobsPerOrigin(){return this._maxJobsPerOrigin}set maxJobsPerOrigin(e){this._maxJobsPerOrigin=e,this.originQueues.forEach(t=>t.maxJobs=e)}get maxJobs(){return this.maxJobsPerOrigin}set maxJobs(e){console.warn('DownloadPriorityQueue: "maxJobs" is no longer valid and limits jobs per server origin. Use "maxJobsPerOrigin", instead.'),this.maxJobsPerOrigin=e}get priorityCallback(){return this._priorityCallback}set priorityCallback(e){this._priorityCallback=e,this.originQueues.forEach(t=>t.priorityCallback=e)}constructor(){this.originQueues=new Map,this._itemQueues=new WeakMap,this._maxJobsPerOrigin=6,this._priorityCallback=null}add(e,t,r,n=null){this.originQueues.forEach((l,u)=>{l.running||this.originQueues.delete(u)});let i=e===null?null:av(e),o=this.originQueues.get(i);o||(o=new Wr,o.maxJobs=this._maxJobsPerOrigin,o.priorityCallback=this._priorityCallback,this.originQueues.set(i,o));let a=this._itemQueues.get(t);if(a&&a!==o&&a.has(t))throw Error("DownloadPriorityQueue: Item is already queued with a different url origin.");this._itemQueues.set(t,o);let s=o.add(t,r);return n!==null&&(n.aborted?this.remove(t):n.addEventListener("abort",()=>this.remove(t),{once:!0})),s}remove(e){let t=this._itemQueues.get(e);t&&(t.remove(e),this._itemQueues.delete(e))}has(e){let t=this._itemQueues.get(e);return!!(t&&t.has(e))}};var Bi=6378137,I2=1/298.257223563,yp=6356752314245179e-9,oc={inView:!1,error:1/0,distanceFromCamera:1/0};function dc(e){return e===4||e===-1}function fn(e,t){return pc(e)&&e.traversal.lastFrameVisited===t&&e.traversal.used}function pc(e){return!!e.traversal}function qa(e){let{children:t}=e,r=t.length===0||pc(t[t.length-1]),n=!e.internal.hasUnrenderableContent||dc(e.internal.loadingState);return r&&n}function Oi(e){return e.traversal.unconditionallyRefine}function Ha(e,t){if(pc(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,oc),e.traversal.inFrustum=oc.inView,e.traversal.error=oc.error,e.traversal.distanceFromCamera=oc.distanceFromCamera,e.traversal.unconditionallyRefine=e.internal.hasUnrenderableContent,!e.traversal.unconditionallyRefine))){let r=e.parent;for(;r&&r.traversal.unconditionallyRefine;)r=r.parent;r&&r.geometricError<=e.geometricError&&(e.traversal.unconditionallyRefine=!0)}}function bp(e,t,r=!1){if(Ha(e,t),r?t.markTileUsed(e):sc(e),Oi(e)&&qa(e)){let n=e.children;for(let i=0,o=n.length;i<o;i++)bp(n[i],t,r)}}function sv(e,t){if(Ha(e,t),e.traversal.usedLastFrame&&(sc(e),e.traversal.wasSetActive&&(e.traversal.active=!0),(!e.traversal.active||Oi(e))&&qa(e))){let r=e.children;for(let n=0,i=r.length;n<i;n++)sv(r[n],t)}}function sc(e){e.traversal.used=!0}function B2(e,t){return!(e.traversal.error<=t.errorTarget&&!Oi(e)||t.maxDepth>0&&e.internal.depth+1>=t.maxDepth||!qa(e))}function lv(e,t){let{frameCount:r}=t,{children:n}=e;for(let i=0,o=n.length;i<o;i++){let a=n[i];fn(a,r)&&(a.traversal.active&&(a.traversal.kicked=!0,a.traversal.active=!1),lv(a,t))}}function iv(e){return!Oi(e)&&(!e.internal.hasContent||dc(e.internal.loadingState))}function cv(e,t){if(Ha(e,t),!e.traversal.inFrustum)return;let r=e.parent;if(r&&r.refine==="ADD"&&e.geometricError>0&&e.traversal.error*(r.geometricError/e.geometricError)<=t.errorTarget)return;if(!B2(e,t)){sc(e);return}let n=!1,i=!1,o=e.children;for(let a=0,s=o.length;a<s;a++){let l=o[a];cv(l,t),n||(n=fn(l,t.frameCount)),i||(i=l.traversal.inFrustum)}if(e.refine==="REPLACE"&&!i&&o.length!==0){e.traversal.inFrustum=!1,t.markTileUsed(e);for(let a=0,s=o.length;a<s;a++)bp(o[a],t,!0);return}if(sc(e),e.refine==="REPLACE"&&n&&(t.loadSiblings||t.loadAncestors))for(let a=0,s=o.length;a<s;a++)bp(o[a],t)}function uv(e,t){let r=t.frameCount;if(!fn(e,r))return;let n=e.children,i=!1;for(let a=0,s=n.length;a<s;a++){let l=n[a];i||(i=fn(l,r))}if(!i)e.traversal.isLeaf=!0;else{for(let s=0,l=n.length;s<l;s++)uv(n[s],t);let a=!0;for(let s=0,l=n.length;s<l;s++){let u=n[s];if(fn(u,r)){let d=!Oi(u),p=!u.internal.hasContent||dc(u.internal.loadingState);d&&p||u.traversal.allChildrenLoaded||(a=!1)}}e.traversal.allChildrenLoaded=a}let o=!0;for(let a=0,s=n.length;a<s;a++){let l=n[a];fn(l,t.frameCount)&&!l.traversal.allUsedChildrenProcessed&&(o=!1)}e.traversal.allUsedChildrenProcessed=o&&qa(e)}function dv(e,t){if(!fn(e,t.frameCount))return;let r=e.children;if(e.refine==="REPLACE"&&t.loadAncestors&&!e.traversal.allChildrenLoaded&&!Oi(e)&&(e.traversal.isLeaf=!0),e.traversal.isLeaf){if(!Oi(e)&&(e.traversal.active=!0,qa(e)&&e.internal.hasContent&&!dc(e.internal.loadingState)))for(let i=0,o=r.length;i<o;i++)sv(r[i],t);return}let n=r.length>0;for(let i=0,o=r.length;i<o;i++){let a=r[i];dv(a,t),fn(a,t.frameCount)&&!(a.traversal.active&&iv(a))&&!a.traversal.allChildrenReady&&(n=!1)}e.traversal.allChildrenReady=n,e.refine==="REPLACE"&&!n&&e.traversal.wasSetActive&&iv(e)&&(e.traversal.active=!0,lv(e,t))}function pv(e,t){Ha(e,t);let r=fn(e,t.frameCount);if(r&&(e.internal.hasUnrenderableContent&&(t.markTileUsed(e),t.queueTileForDownload(e)),e.internal.hasRenderableContent&&e.refine==="ADD"&&(e.traversal.active=!0),(e.traversal.active||e.traversal.kicked)&&e.internal.hasContent&&(t.markTileUsed(e),e.traversal.allUsedChildrenProcessed&&t.queueTileForDownload(e),e.internal.loadingState!==4&&(e.traversal.active=!1)),t.loadAncestors&&e.internal.hasContent&&(t.markTileUsed(e),t.queueTileForDownload(e)),e.internal.virtualChildCount>0&&e.internal.hasContent&&t.markTileUsed(e),e.traversal.visible=e.internal.hasRenderableContent&&e.traversal.active&&e.traversal.inFrustum&&e.internal.loadingState===4,t.stats.used++,e.traversal.inFrustum&&t.stats.inFrustum++),r||pc(e)&&e.traversal.usedLastFrame){let n=!1,i=!1;r?(n=e.traversal.active,i=t.displayActiveTiles&&e.traversal.active||e.traversal.visible):Ha(e,t),e.internal.hasRenderableContent&&e.internal.loadingState===4?(n&&t.stats.active++,i&&t.stats.visible++,e.traversal.wasSetActive!==n&&t.invokeOnePlugin(a=>a.setTileActive&&a.setTileActive(e,n)),e.traversal.wasSetVisible!==i&&t.invokeOnePlugin(a=>a.setTileVisible&&a.setTileVisible(e,i))):e.internal.hasRenderableContent||(i=e.traversal.isLeaf,e.traversal.wasSetVisible!==i&&t.invokeOnePlugin(a=>a.setEmptyTileVisible&&a.setEmptyTileVisible(e,i))),e.traversal.visible=i,e.traversal.active=n;let o=e.children;for(let a=0,s=o.length;a<s;a++){let l=o[a];pv(l,t)}}}function j2(e,t){cv(e,t),uv(e,t),dv(e,t),pv(e,t)}function z2(e){let t=null;return()=>{t===null&&(t=Ga.requestAnimationFrame(()=>{t=null,e()}))}}function N2(e,t=null,r=null){let n=[];for(n.push(e),n.push(null),n.push(0);n.length>0;){let i=n.pop(),o=n.pop(),a=n.pop();if(t&&t(a,o,i)){r&&r(a,o,i);return}let s=a.children;if(s)for(let l=s.length-1;l>=0;l--)n.push(s[l]),n.push(a),n.push(i+1);r&&r(a,o,i)}}var ov=Symbol("PLUGIN_REGISTERED"),Xn={inView:!0,error:0,distance:1/0},V2=(e,t)=>{let r=e.priority||0,n=t.priority||0;return r===n?!e.traversal||!t.traversal?0:e.traversal.used===t.traversal.used?e.traversal.error===t.traversal.error?e.traversal.distanceFromCamera===t.traversal.distanceFromCamera?e.internal.depthFromRenderedParent===t.internal.depthFromRenderedParent?0:e.internal.depthFromRenderedParent>t.internal.depthFromRenderedParent?-1:1:e.traversal.distanceFromCamera>t.traversal.distanceFromCamera?-1:1:e.traversal.error>t.traversal.error?1:-1:e.traversal.used?1:-1:r>n?1:-1},F2=(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,U2=(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,Eo=(e,t)=>{let r=e.priority??1/0,n=t.priority??1/0;if(r!==n)return r>n?1:-1;if(!e.internal||!t.internal)return 0;let i=e.internal.renderer,o=t.internal.renderer,a=!i.loadAncestors,s=!o.loadAncestors;return a&&s?F2(e,t):V2(e,t)},xp=new Xa;xp.unloadPriorityCallback=U2;var Wa=new uc;Wa.maxJobsPerOrigin=25,Wa.priorityCallback=Eo;var lc=new Wr;lc.maxJobs=5,lc.priorityCallback=Eo;var cc=new Wr;cc.maxJobs=25,cc.priorityCallback=(e,t)=>{let r=e.parent,n=t.parent;return r===n?0:r?n?Eo(r,n):-1:1};var vp=class{get root(){let e=this.rootTileset;return e?e.root:null}get loadProgress(){let{stats:e,isLoading:t}=this,r=e.queued+e.downloading+e.parsing,n=e.inCacheSinceLoad+ +!!t;return n===0?1:1-r/n}get downloadQueue(){return this._downloadQueue}set downloadQueue(e){if(e instanceof Wr){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=xp,this.downloadQueue=Wa,this.parseQueue=lc,this.processNodeQueue=cc,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=z2(()=>{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[ov]===!0)throw Error("TilesRendererBase: A plugin can only be registered to a single tileset");let t=this.plugins,r=e.priority||0,n=t.length;for(let i=0;i<t.length;i++)if((t[i].priority||0)>r){n=i;break}t.splice(n,0,e),e[ov]=!0,e.init&&e.init(this)}unregisterPlugin(e){let t=this.plugins;if(typeof e=="string"&&(e=this.getPluginByName(e)),t.includes(e)){let r=t.indexOf(e);return t.splice(r,1),e.dispose&&e.dispose(),!0}return!1}getPluginByName(e){return this.plugins.find(t=>t.name===e)||null}invokeOnePlugin(e){let t=[...this.plugins,this];for(let r=0;r<t.length;r++){let n=e(t[r]);if(n)return n}return null}invokeAllPlugins(e){let t=[...this.plugins,this],r=[];for(let n=0;n<t.length;n++){let i=e(t[n]);i&&r.push(i)}return r.length===0?null:Promise.all(r)}traverse(e,t,r=!0){this.root&&N2(this.root,(n,...i)=>(r&&this.ensureChildrenArePreprocessed(n,!0),e?e(n,...i):!1),t)}getAttributions(e=[]){return this.invokeAllPlugins(t=>t!==this&&t.getAttributions&&t.getAttributions(e)),e}update(){let{lruCache:e,usedSet:t,stats:r,root:n,downloadQueue:i,parseQueue:o,processNodeQueue:a}=this;if(this.rootLoadingState===0&&(this.rootLoadingState=2,this.invokeOnePlugin(u=>u.loadRootTileset&&u.loadRootTileset()).then(u=>{let d=this.rootURL;d!==null&&this.invokeAllPlugins(p=>d=p.preprocessURL?p.preprocessURL(d,null):d),this.rootLoadingState=4,this.rootTileset=u,this.dispatchEvent({type:"needs-update"}),this.dispatchEvent({type:"load-tileset",tileset:u,url:d}),this.dispatchEvent({type:"load-root-tileset",tileset:u,url:d})}).catch(u=>{this.rootLoadingState=-1,console.error(u),this.rootTileset=null,this.dispatchEvent({type:"load-error",tile:null,error:u,url:this.rootURL})})),!n)return;let s=null;if(this.invokeAllPlugins(u=>{if(u.doTilesNeedUpdate){let d=u.doTilesNeedUpdate();s=s===null?d:!!(s||d)}}),s===!1){this.dispatchEvent({type:"update-before"}),this.dispatchEvent({type:"update-after"});return}this.dispatchEvent({type:"update-before"}),r.inFrustum=0,r.used=0,r.active=0,r.visible=0,r.tilesProcessed=0,this.frameCount++,t.forEach(u=>e.markUnused(u)),t.clear(),this.prepareForTraversal(),j2(n,this),this.removeUnusedPendingTiles();let l=this.queuedTiles;l.sort(e.unloadPriorityCallback);for(let u=0,d=l.length;u<d&&!e.isFull();u++)this.requestTileContents(l[u]);l.length=0,e.scheduleUnload(),(i.running||o.running||a.running)===!1&&this.isLoading===!0&&(this.cachedSinceLoadComplete.clear(),r.inCacheSinceLoad=0,this.dispatchEvent({type:"tiles-load-end"}),this.isLoading=!1),this.dispatchEvent({type:"update-after"})}resetFailedTiles(){this.rootLoadingState===-1&&(this.rootLoadingState=0);let e=this.stats;e.failed!==0&&(this.traverse(t=>{t.internal.loadingState===-1&&(t.internal.loadingState=0)},null,!1),e.failed=0)}calculateTileViewErrorWithPlugin(e,t){this.calculateTileViewError(e,t);let{errorFalloff:r,errorFalloffDensity:n}=this;if(r>0&&Number.isFinite(t.distanceFromCamera)){let s=t.distanceFromCamera*n;t.error-=r*(1-Math.exp(-s*s))}let i=null,o=0,a=1/0;this.invokeAllPlugins(s=>{s!==this&&s.calculateTileViewError&&(Xn.inView=!0,Xn.error=0,Xn.distance=1/0,s.calculateTileViewError(e,Xn)&&(i===null&&(i=!0),i&&(i=Xn.inView),Xn.inView&&(a=Math.min(a,Xn.distance),o=Math.max(o,Xn.error))))}),t.inView&&i!==!1?(t.error=Math.max(t.error,o),t.distanceFromCamera=Math.min(t.distanceFromCamera,a)):i?(t.inView=!0,t.error=o,t.distanceFromCamera=a):t.inView=!1}dispose(){[...this.plugins].forEach(r=>{this.unregisterPlugin(r)});let e=this.lruCache,t=[];this.traverse(r=>(t.push(r),!1),null,!1);for(let r=0,n=t.length;r<n;r++)e.remove(t[r]);this.stats={queued:0,parsing:0,downloading:0,failed:0,inFrustum:0,traversed:0,used:0,active:0,visible:0},this.frameCount=0,this.loadingTiles.clear()}calculateBytesUsed(e,t){return 0}dispatchEvent(e){}addEventListener(e,t){}removeEventListener(e,t){}parseTile(e,t,r){return null}prepareForTraversal(){}disposeTile(e){e.traversal.visible&&(e.internal.hasRenderableContent?this.invokeOnePlugin(r=>r.setTileVisible&&r.setTileVisible(e,!1)):this.invokeOnePlugin(r=>r.setEmptyTileVisible&&r.setEmptyTileVisible(e,!1)),e.traversal.visible=!1),e.traversal.active&&e.internal.hasRenderableContent&&this.invokeOnePlugin(r=>r.setTileActive&&r.setTileActive(e,!1)),e.traversal.active=!1;let{scene:t}=e.engineData;t&&this.dispatchEvent({type:"dispose-model",scene:t,tile:e})}preprocessNode(e,t,r=null){if(this.processedTiles.add(e),this.stats.tilesProcessed++,e.content&&(!("uri"in e.content)&&"url"in e.content&&(e.content.uri=e.content.url,delete e.content.url),e.content.boundingVolume&&!("box"in e.content.boundingVolume||"sphere"in e.content.boundingVolume||"region"in e.content.boundingVolume)&&delete e.content.boundingVolume),e.parent=r,e.children=e.children||[],e.internal={hasContent:!1,hasRenderableContent:!1,hasUnrenderableContent:!1,loadingState:0,basePath:t,depth:-1,depthFromRenderedParent:-1,isVirtual:!1,virtualChildCount:0,renderer:this,...e.internal},e.content?.uri){let n=gp(e.content.uri),i=!!(n&&/json$/.test(n));e.internal.hasContent=!0,e.internal.hasUnrenderableContent=i,e.internal.hasRenderableContent=!i}else e.internal.hasContent=!1,e.internal.hasUnrenderableContent=!1,e.internal.hasRenderableContent=!1;r?(e.internal.depth=r.internal.depth+1,e.internal.depthFromRenderedParent=r.internal.depthFromRenderedParent+ +!!e.internal.hasRenderableContent):(e.internal.depth=0,e.internal.depthFromRenderedParent=+!!e.internal.hasRenderableContent),e.traversal={distanceFromCamera:1/0,error:1/0,inFrustum:!1,wasInFrustum:!1,isLeaf:!1,used:!1,usedLastFrame:!1,visible:!1,wasSetVisible:!1,active:!1,wasSetActive:!1,allChildrenReady:!1,allChildrenLoaded:!1,kicked:!1,allUsedChildrenProcessed:!1,lastFrameVisited:-1},r===null?e.refine=e.refine||"REPLACE":e.refine=e.refine||r.refine,e.engineData={scene:null,metadata:null,boundingVolume:null},Object.defineProperty(e,"cached",{get(){return console.warn('TilesRenderer: "tile.cached" field has been renamed to "tile.engineData".'),this.engineData},enumerable:!1,configurable:!0}),this.invokeAllPlugins(n=>{n!==this&&n.preprocessNode&&n.preprocessNode(e,t,r)})}setTileActive(e,t){t?this.activeTiles.add(e):this.activeTiles.delete(e)}setTileVisible(e,t){t?this.visibleTiles.add(e):this.visibleTiles.delete(e),this.dispatchEvent({type:"tile-visibility-change",scene:e.engineData.scene,tile:e,visible:t})}calculateTileViewError(e,t){}removeUnusedPendingTiles(){let{lruCache:e,loadingTiles:t}=this,r=[];for(let n of t)!e.isUsed(n)&&n.internal.loadingState===1&&r.push(n);for(let n=0;n<r.length;n++)e.remove(r[n])}queueTileForDownload(e){e.internal.loadingState!==0||this.lruCache.isFull()||this.queuedTiles.push(e)}markTileUsed(e){this.usedSet.add(e),this.lruCache.markUsed(e)}fetchData(e,t){return fetch(e,t)}ensureChildrenArePreprocessed(e,t=this.stats.tilesProcessed<this.maxTilesProcessed){let r=e.children;if(r.length===0||r[r.length-1].traversal)return;let n=i=>{for(let o=0,a=i.length;o<a;o++){let s=i[o];s&&!s.traversal&&this.preprocessNode(s,e.internal.basePath,e)}};t?(this.processNodeQueue.remove(e),n(r)):this.processNodeQueue.has(e)||this.processNodeQueue.add(e,i=>{n(i.children),this._dispatchNeedsUpdateEvent()})}getBytesUsed(e){let t=0;return this.invokeAllPlugins(r=>{r.calculateBytesUsed&&(t+=r.calculateBytesUsed(e,e.engineData.scene)||0)}),t}recalculateBytesUsed(e=null){let{lruCache:t,processedTiles:r}=this;e===null?t.itemSet.forEach(n=>{r.has(n)&&t.setMemoryUsage(n,this.getBytesUsed(n))}):t.setMemoryUsage(e,this.getBytesUsed(e))}preprocessTileset(e,t,r=null){let[n,i]=e.asset.version.split(".").map(a=>parseInt(a));console.assert(n<=1,"TilesRenderer: asset.version is expected to be a 1.x or a compatible version."),n===1&&i>0&&console.warn("TilesRenderer: tiles versions at 1.1 or higher have limited support. Some new extensions and features may not be supported.");let o=t.replace(/\/[^/]*$/,"");o=new URL(o,window.location.href).toString(),this.preprocessNode(e.root,o,r)}loadRootTileset(){let e=this.rootURL;return this.invokeAllPlugins(t=>e=t.preprocessURL?t.preprocessURL(e,null):e),this.invokeOnePlugin(t=>t.fetchData&&t.fetchData(e,this.fetchOptions)).then(t=>{if(!(t instanceof Response))return t;if(t.ok)return t.json();throw Error(`TilesRenderer: Failed to load tileset "${e}" with status ${t.status} : ${t.statusText}`)}).then(t=>(this.preprocessTileset(t,e),t))}requestTileContents(e){if(e.internal.loadingState!==0)return;let t=!1,r=null,n=new URL(e.content.uri,e.internal.basePath+"/").toString();this.invokeAllPlugins(c=>n=c.preprocessURL?c.preprocessURL(n,e):n);let i=this.stats,o=this.lruCache,a=this.downloadQueue,s=this.parseQueue,l=this.loadingTiles,u=gp(n),d=new AbortController,p=d.signal;if(o.add(e,c=>{d.abort(),t?c.children.length=0:this.invokeAllPlugins(h=>{h.disposeTile&&h.disposeTile(c)}),i.inCache--,this.cachedSinceLoadComplete.has(e)&&(this.cachedSinceLoadComplete.delete(e),i.inCacheSinceLoad--),c.internal.loadingState===1?i.queued--:c.internal.loadingState===2?i.downloading--:c.internal.loadingState===3?i.parsing--:c.internal.loadingState===4&&i.loaded--,c.internal.loadingState=0,s.remove(c),a.remove(c),l.delete(c)}))return this.isLoading||(this.isLoading=!0,this.dispatchEvent({type:"tiles-load-start"})),o.setMemoryUsage(e,this.getBytesUsed(e)),this.cachedSinceLoadComplete.add(e),i.inCacheSinceLoad++,i.inCache++,i.queued++,e.internal.loadingState=1,l.add(e),a.add(n,e,c=>{if(p.aborted)return Promise.resolve();e.internal.loadingState=2,i.downloading++,i.queued--;let h=this.invokeOnePlugin(m=>m.fetchData&&m.fetchData(n,{...this.fetchOptions,signal:p}));return this.dispatchEvent({type:"tile-download-start",tile:e,url:n,get uri(){return console.warn('tile-download-start event: "uri" has been renamed to "url".'),this.url}}),h}).then(c=>{if(!p.aborted){if(!(c instanceof Response))return c;if(c.ok)return u==="json"?c.json():c.arrayBuffer();throw Error(`Failed to load model with error code ${c.status}`)}}).then(c=>{if(!p.aborted)return i.downloading--,i.parsing++,e.internal.loadingState=3,s.add(e,h=>p.aborted?Promise.resolve():u==="json"&&c.root?(this.preprocessTileset(c,n,e),e.children.push(c.root),r=c,t=!0,Promise.resolve()):this.invokeOnePlugin(m=>m.parseTile&&m.parseTile(c,h,u,n,p)))}).then(()=>{if(p.aborted)return;i.parsing--,i.loaded++,e.internal.loadingState=4,l.delete(e),o.setLoaded(e,!0);let c=this.getBytesUsed(e);if(o.getMemoryUsage(e)===0&&c>0&&o.isFull()){o.remove(e);return}o.setMemoryUsage(e,c),this.dispatchEvent({type:"needs-update"}),t&&this.dispatchEvent({type:"load-tileset",tileset:r,url:n}),e.engineData.scene&&this.dispatchEvent({type:"load-model",scene:e.engineData.scene,tile:e,url:n})}).catch(c=>{p.aborted||(c.name==="AbortError"?o.remove(e):(s.remove(e),a.remove(e),e.internal.loadingState===1?i.queued--:e.internal.loadingState===2?i.downloading--:e.internal.loadingState===3?i.parsing--:e.internal.loadingState===4&&i.loaded--,i.failed++,console.error(`TilesRenderer : Failed to load tile at url "${e.content.uri}".`),console.error(c),e.internal.loadingState=-1,l.delete(e),o.setLoaded(e,!0),this.dispatchEvent({type:"load-error",tile:e,error:c,url:n})))})}};function Ii(e){if(e===null||e.byteLength<4)return"";let t;if(t=e instanceof DataView?e:new DataView(e),String.fromCharCode(t.getUint8(0))==="{")return null;let r="";for(let n=0;n<4;n++)r+=String.fromCharCode(t.getUint8(n));return r}var G2=new TextDecoder;function hv(e){return G2.decode(e)}function hc(e){return e.replace(/[\\/][^\\/]+$/,"")+"/"}var Ao=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=hc(e)),this.parse(t)))}resolveExternalURL(e){return new URL(e,this.workingPath).href}parse(e){throw Error("LoaderBase: Parse not implemented.")}};function wp(e,t,r,n,i,o){let a;switch(n){case"SCALAR":a=1;break;case"VEC2":a=2;break;case"VEC3":a=3;break;case"VEC4":a=4;break;default:throw Error(`FeatureTable : Feature type not provided for "${o}".`)}let s,l=r*a;switch(i){case"BYTE":s=new Int8Array(e,t,l);break;case"UNSIGNED_BYTE":s=new Uint8Array(e,t,l);break;case"SHORT":s=new Int16Array(e,t,l);break;case"UNSIGNED_SHORT":s=new Uint16Array(e,t,l);break;case"INT":s=new Int32Array(e,t,l);break;case"UNSIGNED_INT":s=new Uint32Array(e,t,l);break;case"FLOAT":s=new Float32Array(e,t,l);break;case"DOUBLE":s=new Float64Array(e,t,l);break;default:throw Error(`FeatureTable : Feature component type not provided for "${o}".`)}return s}var $a=class{constructor(e,t,r,n){this.buffer=e,this.binOffset=t+r,this.binLength=n;let i=null;if(r!==0){let o=new Uint8Array(e,t,r);i=JSON.parse(hv(o))}else i={};this.header=i}getKeys(){return Object.keys(this.header).filter(e=>e!=="extensions")}getData(e,t,r=null,n=null){let i=this.header;if(!(e in i))return null;let o=i[e];if(!(o instanceof Object)||Array.isArray(o))return o;{let{buffer:a,binOffset:s,binLength:l}=this,u=o.byteOffset||0,d=o.type||n,p=o.componentType||r;if("type"in o&&n&&o.type!==n)throw Error("FeatureTable: Specified type does not match expected type.");let c=s+u,h=wp(a,c,t,d,p,e);if(c+h.byteLength>s+l)throw Error("FeatureTable: Feature data read outside binary body length.");return h}}getBuffer(e,t){let{buffer:r,binOffset:n}=this;return r.slice(n+e,n+e+t)}},H2=class{constructor(e){this.batchTable=e;let t=e.header.extensions["3DTILES_batch_table_hierarchy"];this.classes=t.classes;for(let n of this.classes){let i=n.instances;for(let o in i)n.instances[o]=this._parseProperty(i[o],n.length,o)}if(this.instancesLength=t.instancesLength,this.classIds=this._parseProperty(t.classIds,this.instancesLength,"classIds"),t.parentCounts?this.parentCounts=this._parseProperty(t.parentCounts,this.instancesLength,"parentCounts"):this.parentCounts=Array(this.instancesLength).fill(1),t.parentIds){let n=this.parentCounts.reduce((i,o)=>i+o,0);this.parentIds=this._parseProperty(t.parentIds,n,"parentIds")}else this.parentIds=null;this.instancesIds=[];let r={};for(let n of this.classIds)r[n]=r[n]??0,this.instancesIds.push(r[n]),r[n]++}_parseProperty(e,t,r){if(Array.isArray(e))return e;{let{buffer:n,binOffset:i}=this.batchTable,o=e.byteOffset,a=e.componentType||"UNSIGNED_SHORT";return wp(n,i+o,t,"SCALAR",a,r)}}getDataFromId(e,t={}){let r=this.parentCounts[e];if(this.parentIds&&r>0){let s=0;for(let l=0;l<e;l++)s+=this.parentCounts[l];for(let l=0;l<r;l++){let u=this.parentIds[s+l];u!==e&&this.getDataFromId(u,t)}}let n=this.classIds[e],i=this.classes[n].instances,o=this.classes[n].name,a=this.instancesIds[e];for(let s in i)t[o]=t[o]||{},t[o][s]=i[s][a];return t}},mc=class extends $a{constructor(e,t,r,n,i){super(e,r,n,i),this.count=t,this.extensions={};let o=this.header.extensions;o&&o["3DTILES_batch_table_hierarchy"]&&(this.extensions["3DTILES_batch_table_hierarchy"]=new H2(this))}getDataFromId(e,t={}){if(e<0||e>=this.count)throw Error(`BatchTable: id value "${e}" out of bounds for "${this.count}" features number.`);for(let r of this.getKeys())t[r]=super.getData(r,this.count)[e];for(let r in this.extensions){let n=this.extensions[r];n.getDataFromId instanceof Function&&(t[r]=t[r]||{},n.getDataFromId(e,t[r]))}return t}getPropertyArray(e){return super.getData(e,this.count)}},Mp=class extends Ao{parse(e){let t=new DataView(e),r=Ii(t);console.assert(r==="b3dm");let n=t.getUint32(4,!0);console.assert(n===1);let i=t.getUint32(8,!0);console.assert(i===e.byteLength);let o=t.getUint32(12,!0),a=t.getUint32(16,!0),s=t.getUint32(20,!0),l=t.getUint32(24,!0),u=new $a(e.slice(28,28+o+a),0,o,a),d=28+o+a,p=new mc(e.slice(d,d+s+l),u.getData("BATCH_LENGTH"),0,s,l),c=d+s+l;return{version:n,featureTable:u,batchTable:p,glbBytes:new Uint8Array(e,c,i-c)}}},Sp=class extends Ao{parse(e){let t=new DataView(e),r=Ii(t);console.assert(r==="i3dm");let n=t.getUint32(4,!0);console.assert(n===1);let i=t.getUint32(8,!0);console.assert(i===e.byteLength);let o=t.getUint32(12,!0),a=t.getUint32(16,!0),s=t.getUint32(20,!0),l=t.getUint32(24,!0),u=t.getUint32(28,!0),d=new $a(e.slice(32,32+o+a),0,o,a),p=32+o+a,c=new mc(e.slice(p,p+s+l),d.getData("INSTANCES_LENGTH"),0,s,l),h=p+s+l,m=new Uint8Array(e,h,i-h),g=null,f=null,b=null;if(u)g=m,f=Promise.resolve();else{let w=this.resolveExternalURL(hv(m));b=hc(w),f=fetch(w,this.fetchOptions).then(y=>{if(!y.ok)throw Error(`I3DMLoaderBase : Failed to load file "${w}" with status ${y.status} : ${y.statusText}`);return y.arrayBuffer()}).then(y=>{g=new Uint8Array(y)})}return f.then(()=>({version:n,featureTable:d,batchTable:c,glbBytes:g,gltfWorkingPath:b}))}},Cp=class extends Ao{parse(e){let t=new DataView(e),r=Ii(t);console.assert(r==="pnts");let n=t.getUint32(4,!0);console.assert(n===1);let i=t.getUint32(8,!0);console.assert(i===e.byteLength);let o=t.getUint32(12,!0),a=t.getUint32(16,!0),s=t.getUint32(20,!0),l=t.getUint32(24,!0),u=new $a(e.slice(28,28+o+a),0,o,a),d=28+o+a,p=new mc(e.slice(d,d+s+l),u.getData("BATCH_LENGTH")||u.getData("POINTS_LENGTH"),0,s,l);return Promise.resolve({version:n,featureTable:u,batchTable:p})}},Tp=class extends Ao{parse(e){let t=new DataView(e),r=Ii(t);console.assert(r==="cmpt",'CMPTLoader: The magic bytes equal "cmpt".');let n=t.getUint32(4,!0);console.assert(n===1,'CMPTLoader: The version listed in the header is "1".');let i=t.getUint32(8,!0);console.assert(i===e.byteLength,"CMPTLoader: The contents buffer length listed in the header matches the file.");let o=t.getUint32(12,!0),a=[],s=16;for(let l=0;l<o;l++){let u=new DataView(e,s,12),d=Ii(u),p=u.getUint32(4,!0),c=u.getUint32(8,!0),h=new Uint8Array(e,s,c);a.push({type:d,buffer:h,version:p}),s+=c}return{version:n,tiles:a}}};import{Box3 as Av,BufferAttribute as ji,BufferGeometry as W2,Clock as xj,Color as X2,DefaultLoadingManager as Cc,Euler as q2,EventDispatcher as fc,Frustum as $2,Group as Ip,InstancedMesh as Y2,LoadingManager as K2,MathUtils as Rv,Matrix3 as Q2,Matrix4 as Rt,Mesh as vj,OrthographicCamera as wj,PerspectiveCamera as Mj,Plane as J2,PlaneGeometry as Sj,Points as Z2,PointsMaterial as eE,Quaternion as kv,Ray as Bp,Raycaster as Cj,ShaderMaterial as Tj,Sphere as Dv,Spherical as tE,TextureUtils as rE,Vector2 as jp,Vector3 as De}from"three";import{GLTFLoader as zp}from"three/addons/loaders/GLTFLoader.js";import{estimateBytesUsed as nE}from"three/addons/utils/BufferGeometryUtils.js";var Np=class extends Mp{constructor(e=Cc){super(),this.manager=e,this.adjustmentTransform=new Rt}parse(e){let t=super.parse(e),r=t.glbBytes.slice().buffer;return new Promise((n,i)=>{let o=this.manager,a=this.fetchOptions,s=o.getHandler("path.gltf")||new zp(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 l=this.workingPath;!/[\\/]$/.test(l)&&l.length&&(l+="/");let u=this.adjustmentTransform;s.parse(r,l,d=>{let{batchTable:p,featureTable:c}=t,{scene:h}=d,m=c.getData("RTC_CENTER",1,"FLOAT","VEC3");m&&(h.position.x+=m[0],h.position.y+=m[1],h.position.z+=m[2]),d.scene.updateMatrix(),d.scene.matrix.multiply(u),d.scene.matrix.decompose(d.scene.position,d.scene.quaternion,d.scene.scale),d.batchTable=p,d.featureTable=c,h.batchTable=p,h.featureTable=c,n(d)},i)})}};function iE(e){let t=e>>11,r=e>>5&63,n=e&31;return[Math.round(t/31*255),Math.round(r/63*255),Math.round(n/31*255)]}var Ya=new jp;function oE(e,t,r=new De){Ya.set(e,t).divideScalar(256).multiplyScalar(2).subScalar(1),r.set(Ya.x,Ya.y,1-Math.abs(Ya.x)-Math.abs(Ya.y));let n=Rv.clamp(-r.z,0,1);return r.x>=0?r.setX(r.x-n):r.setX(r.x+n),r.y>=0?r.setY(r.y-n):r.setY(r.y+n),r.normalize(),r}var mv={RGB:"color",POSITION:"position"},Vp=class extends Cp{constructor(e=Cc){super(),this.manager=e}parse(e){return super.parse(e).then(async t=>{let{featureTable:r,batchTable:n}=t,i=new eE,o=r.header.extensions,a=new De,s;if(o&&o["3DTILES_draco_point_compression"]){let{byteOffset:d,byteLength:p,properties:c}=o["3DTILES_draco_point_compression"],h=this.manager.getHandler("draco.drc");if(h==null)throw Error("PNTSLoader: dracoLoader not available.");let m={};for(let b in c)if(b in mv&&b in c){let w=mv[b];m[w]=c[b]}let g={attributeIDs:m,attributeTypes:{position:"Float32Array",color:"Uint8Array"},useUniqueIDs:!0},f=r.getBuffer(d,p);s=await h.decodeGeometry(f,g),s.attributes.color&&(i.vertexColors=!0)}else{let d=r.getData("POINTS_LENGTH"),p=r.getData("POSITION",d,"FLOAT","VEC3"),c=r.getData("NORMAL",d,"FLOAT","VEC3"),h=r.getData("NORMAL",d,"UNSIGNED_BYTE","VEC2"),m=r.getData("RGB",d,"UNSIGNED_BYTE","VEC3"),g=r.getData("RGBA",d,"UNSIGNED_BYTE","VEC4"),f=r.getData("RGB565",d,"UNSIGNED_SHORT","SCALAR"),b=r.getData("CONSTANT_RGBA",d,"UNSIGNED_BYTE","VEC4"),w=r.getData("POSITION_QUANTIZED",d,"UNSIGNED_SHORT","VEC3"),y=r.getData("QUANTIZED_VOLUME_SCALE",d,"FLOAT","VEC3"),M=r.getData("QUANTIZED_VOLUME_OFFSET",d,"FLOAT","VEC3");if(s=new W2,w){let E=new Float32Array(d*3);for(let v=0;v<d;v++)for(let P=0;P<3;P++){let T=3*v+P;E[T]=w[T]/65535*y[P]}a.x=M[0],a.y=M[1],a.z=M[2],s.setAttribute("position",new ji(E,3,!1))}else s.setAttribute("position",new ji(p,3,!1));if(c!==null)s.setAttribute("normal",new ji(c,3,!1));else if(h!==null){let E=new Float32Array(d*3),v=new De;for(let P=0;P<d;P++){let T=h[P*2],_=h[P*2+1],S=oE(T,_,v);E[P*3]=S.x,E[P*3+1]=S.y,E[P*3+2]=S.z}s.setAttribute("normal",new ji(E,3,!1))}if(g!==null)s.setAttribute("color",new ji(g,4,!0)),i.vertexColors=!0,i.transparent=!0,i.depthWrite=!1;else if(m!==null)s.setAttribute("color",new ji(m,3,!0)),i.vertexColors=!0;else if(f!==null){let E=new Uint8Array(d*3);for(let v=0;v<d;v++){let P=iE(f[v]);for(let T=0;T<3;T++){let _=3*v+T;E[_]=P[T]}}s.setAttribute("color",new ji(E,3,!0)),i.vertexColors=!0}else if(b!==null){i.color=new X2(b[0],b[1],b[2]);let E=b[3]/255;E<1&&(i.opacity=E,i.transparent=!0,i.depthWrite=!1)}}let l=new Z2(s,i);l.position.copy(a),t.scene=l,t.scene.featureTable=r,t.scene.batchTable=n;let u=r.getData("RTC_CENTER",1,"FLOAT","VEC3");return u&&(t.scene.position.x+=u[0],t.scene.position.y+=u[1],t.scene.position.z+=u[2]),t})}};function aE(e){let{x:t,y:r,z:n}=e;e.x=n,e.y=t,e.z=r}function sE(e){return-e+Math.PI/2}var fv=new tE,qn=new De,Wt=new De,_p=new De,dr=new Rt,Xr=new Rt,Pp=new Dv,Kt=new q2,gv=new De,bv=new De,yv=new De,Ka=new De,gc=new Bp,lE=1e-12,cE=.1;var Fp=class{constructor(e=1,t=1,r=1){this.name="",this.radius=new De(e,t,r)}intersectRay(e,t){return dr.makeScale(...this.radius).invert(),Pp.center.set(0,0,0),Pp.radius=1,gc.copy(e).applyMatrix4(dr),gc.intersectSphere(Pp,t)?(dr.makeScale(...this.radius),t.applyMatrix4(dr),t):null}getEastNorthUpFrame(e,t,r,n){return r.isMatrix4&&(n=r,r=0,console.warn('Ellipsoid: The signature for "getEastNorthUpFrame" has changed.')),this.getEastNorthUpAxes(e,t,gv,bv,yv),this.getCartographicToPosition(e,t,r,Ka),n.makeBasis(gv,bv,yv).setPosition(Ka)}getOrientedEastNorthUpFrame(e,t,r,n,i,o,a){return this.getObjectFrame(e,t,r,n,i,o,a,0)}getObjectFrame(e,t,r,n,i,o,a,s=2){return this.getEastNorthUpFrame(e,t,r,dr),Kt.set(i,o,-n,"ZXY"),a.makeRotationFromEuler(Kt).premultiply(dr),s===1?(Kt.set(Math.PI/2,0,0,"XYZ"),Xr.makeRotationFromEuler(Kt),a.multiply(Xr)):s===2&&(Kt.set(-Math.PI/2,0,Math.PI,"XYZ"),Xr.makeRotationFromEuler(Kt),a.multiply(Xr)),a}getCartographicFromObjectFrame(e,t,r=2){return r===1?(Kt.set(-Math.PI/2,0,0,"XYZ"),Xr.makeRotationFromEuler(Kt).premultiply(e)):r===2?(Kt.set(-Math.PI/2,0,Math.PI,"XYZ"),Xr.makeRotationFromEuler(Kt).premultiply(e)):Xr.copy(e),Ka.setFromMatrixPosition(Xr),this.getPositionToCartographic(Ka,t),this.getEastNorthUpFrame(t.lat,t.lon,0,dr).invert(),Xr.premultiply(dr),Kt.setFromRotationMatrix(Xr,"ZXY"),t.azimuth=-Kt.z,t.elevation=Kt.x,t.roll=Kt.y,t}getEastNorthUpAxes(e,t,r,n,i,o=Ka){this.getCartographicToPosition(e,t,0,o),this.getCartographicToNormal(e,t,i),r.set(-o.y,o.x,0).normalize(),n.crossVectors(i,r).normalize()}getCartographicToPosition(e,t,r,n){this.getCartographicToNormal(e,t,qn);let i=this.radius;Wt.copy(qn),Wt.x*=i.x**2,Wt.y*=i.y**2,Wt.z*=i.z**2;let o=Math.sqrt(qn.dot(Wt));return Wt.divideScalar(o),n.copy(Wt).addScaledVector(qn,r)}getPositionToCartographic(e,t){this.getPositionToSurfacePoint(e,Wt),this.getPositionToNormal(Wt,qn);let r=_p.subVectors(e,Wt);return t.lon=Math.atan2(qn.y,qn.x),t.lat=Math.asin(qn.z),t.height=Math.sign(r.dot(e))*r.length(),t}getCartographicToNormal(e,t,r){return fv.set(1,sE(e),t),r.setFromSpherical(fv).normalize(),aE(r),r}getPositionToNormal(e,t){let r=this.radius;return t.copy(e),t.x/=r.x**2,t.y/=r.y**2,t.z/=r.z**2,t.normalize(),t}getPositionToSurfacePoint(e,t){let r=this.radius,n=1/r.x**2,i=1/r.y**2,o=1/r.z**2,a=e.x*e.x*n,s=e.y*e.y*i,l=e.z*e.z*o,u=a+s+l,d=Math.sqrt(1/u),p=Wt.copy(e).multiplyScalar(d);if(u<cE)return isFinite(d)?t.copy(p):null;let c=_p.set(p.x*n*2,p.y*i*2,p.z*o*2),h=(1-d)*e.length()/(.5*c.length()),m=0,g,f,b,w,y,M,E,v,P,T,_;do{h-=m,b=1/(1+h*n),w=1/(1+h*i),y=1/(1+h*o),M=b*b,E=w*w,v=y*y,P=M*b,T=E*w,_=v*y,g=a*M+s*E+l*v-1,f=a*P*n+s*T*i+l*_*o;let S=-2*f;m=g/S}while(Math.abs(g)>lE);return t.set(e.x*b,e.y*w,e.z*y)}calculateHorizonDistance(e,t){let r=this.calculateEffectiveRadius(e);return Math.sqrt(2*r*t+t**2)}calculateEffectiveRadius(e){let t=this.radius.x,r=1-this.radius.z**2/t**2,n=e*Rv.DEG2RAD,i=Math.sin(n)**2;return t/Math.sqrt(1-r*i)}getPositionElevation(e){this.getPositionToSurfacePoint(e,Wt);let t=_p.subVectors(e,Wt);return Math.sign(t.dot(e))*t.length()}closestPointToRayEstimate(e,t){return this.intersectRay(e,t)?t:(dr.makeScale(...this.radius).invert(),gc.copy(e).applyMatrix4(dr),Wt.set(0,0,0),gc.closestPointToPoint(Wt,t).normalize(),dr.makeScale(...this.radius),t.applyMatrix4(dr))}copy(e){return this.radius.copy(e.radius),this}clone(){return new this.constructor().copy(this)}},ts=new Fp(Bi,Bi,yp);ts.name="WGS84 Earth";var bc=new De,Ro=new De,ko=new De,Ep=new De,yc=new kv,xc=new De,Do=new Rt,xv=new Rt,vv=new De,wv=new Rt,Ap=new kv,Rp={};function Mv(e,t,r,n){if(e=e/r*2-1,t=t/r*2-1,n.x=e,n.y=t,n.z=1-Math.abs(e)-Math.abs(t),n.z<0){let i=n.x;n.x=(1-Math.abs(n.y))*(i>=0?1:-1),n.y=(1-Math.abs(i))*(n.y>=0?1:-1)}return n.normalize(),n}var Up=class extends Sp{constructor(e=Cc){super(),this.manager=e,this.adjustmentTransform=new Rt,this.ellipsoid=ts.clone()}resolveExternalURL(e){return this.manager.resolveURL(super.resolveExternalURL(e))}parse(e){return super.parse(e).then(t=>{let{featureTable:r,batchTable:n}=t,i=t.glbBytes.slice().buffer;return new Promise((o,a)=>{let s=this.fetchOptions,l=this.manager,u=l.getHandler("path.gltf")||new zp(l);s.credentials==="include"&&s.mode==="cors"&&u.setCrossOrigin("use-credentials"),"credentials"in s&&u.setWithCredentials(s.credentials==="include"),s.headers&&u.setRequestHeader(s.headers);let d=t.gltfWorkingPath??this.workingPath;/[\\/]$/.test(d)||(d+="/");let p=this.adjustmentTransform;u.parse(i,d,c=>{let h=r.getData("INSTANCES_LENGTH"),m=r.getData("POSITION",h,"FLOAT","VEC3"),g=r.getData("POSITION_QUANTIZED",h,"UNSIGNED_SHORT","VEC3"),f=r.getData("QUANTIZED_VOLUME_OFFSET",1,"FLOAT","VEC3"),b=r.getData("QUANTIZED_VOLUME_SCALE",1,"FLOAT","VEC3"),w=r.getData("NORMAL_UP",h,"FLOAT","VEC3"),y=r.getData("NORMAL_RIGHT",h,"FLOAT","VEC3"),M=r.getData("NORMAL_UP_OCT32P",h,"UNSIGNED_SHORT","VEC2"),E=r.getData("NORMAL_RIGHT_OCT32P",h,"UNSIGNED_SHORT","VEC2"),v=r.getData("SCALE_NON_UNIFORM",h,"FLOAT","VEC3"),P=r.getData("SCALE",h,"FLOAT","SCALAR"),T=r.getData("RTC_CENTER",1,"FLOAT","VEC3"),_=r.getData("EAST_NORTH_UP");if(!m&&g){m=new Float32Array(h*3);for(let A=0;A<h;A++)m[A*3+0]=f[0]+g[A*3+0]/65535*b[0],m[A*3+1]=f[1]+g[A*3+1]/65535*b[1],m[A*3+2]=f[2]+g[A*3+2]/65535*b[2]}let S=new De;for(let A=0;A<h;A++)S.x+=m[A*3+0]/h,S.y+=m[A*3+1]/h,S.z+=m[A*3+2]/h;let C=[],R=[];c.scene.updateMatrixWorld(),c.scene.traverse(A=>{if(A.isMesh){R.push(A);let{geometry:B,material:N}=A,D=new Y2(B,N,h);D.position.copy(S),T&&(D.position.x+=T[0],D.position.y+=T[1],D.position.z+=T[2]),C.push(D)}});for(let A=0;A<h;A++){Ep.set(m[A*3+0]-S.x,m[A*3+1]-S.y,m[A*3+2]-S.z),yc.identity(),w&&y?(Ro.set(w[A*3+0],w[A*3+1],w[A*3+2]),ko.set(y[A*3+0],y[A*3+1],y[A*3+2]),bc.crossVectors(ko,Ro).normalize(),Do.makeBasis(ko,Ro,bc),yc.setFromRotationMatrix(Do)):M&&E&&(Mv(M[A*2+0],M[A*2+1],65535,Ro),Mv(E[A*2+0],E[A*2+1],65535,ko),bc.crossVectors(ko,Ro).normalize(),Do.makeBasis(ko,Ro,bc),yc.setFromRotationMatrix(Do)),xc.set(1,1,1),v&&xc.set(v[A*3+0],v[A*3+1],v[A*3+2]),P&&xc.multiplyScalar(P[A]);for(let B=0,N=C.length;B<N;B++){let D=C[B];Ap.copy(yc),_&&(D.updateMatrixWorld(),vv.copy(Ep).applyMatrix4(D.matrixWorld),this.ellipsoid.getPositionToCartographic(vv,Rp),this.ellipsoid.getEastNorthUpFrame(Rp.lat,Rp.lon,wv),Ap.setFromRotationMatrix(wv)),Do.compose(Ep,Ap,xc).multiply(p);let V=R[B];xv.multiplyMatrices(Do,V.matrixWorld),D.setMatrixAt(A,xv)}}c.scene.clear(),c.scene.add(...C),c.batchTable=n,c.featureTable=r,c.scene.batchTable=n,c.scene.featureTable=r,o(c)},a)})})}},Lv=class extends Tp{constructor(e=Cc){super(),this.manager=e,this.adjustmentTransform=new Rt,this.ellipsoid=ts.clone()}parse(e){let t=super.parse(e),{manager:r,ellipsoid:n,adjustmentTransform:i}=this,o=[];for(let a in t.tiles){let{type:s,buffer:l}=t.tiles[a];switch(s){case"b3dm":{let u=l.slice(),d=new Np(r);d.workingPath=this.workingPath,d.fetchOptions=this.fetchOptions,d.adjustmentTransform.copy(i);let p=d.parse(u.buffer);o.push(p);break}case"pnts":{let u=l.slice(),d=new Vp(r);d.workingPath=this.workingPath,d.fetchOptions=this.fetchOptions;let p=d.parse(u.buffer);o.push(p);break}case"i3dm":{let u=l.slice(),d=new Up(r);d.workingPath=this.workingPath,d.fetchOptions=this.fetchOptions,d.ellipsoid.copy(n),d.adjustmentTransform.copy(i);let p=d.parse(u.buffer);o.push(p);break}}}return Promise.all(o).then(a=>{let s=new Ip;return a.forEach(l=>{s.add(l.scene)}),{tiles:a,scene:s}})}},Qa=new Rt,uE=class extends Ip{constructor(e){super(),this.isTilesGroup=!0,this.name="TilesRenderer.TilesGroup",this.tilesRenderer=e,this.matrixWorldInverse=new Rt}raycast(e,t){return this.tilesRenderer.raycast(e,t),!1}updateMatrixWorld(e){if(this.matrixAutoUpdate&&this.updateMatrix(),this.matrixWorldNeedsUpdate||e){this.parent===null?Qa.copy(this.matrix):Qa.multiplyMatrices(this.parent.matrixWorld,this.matrix),this.matrixWorldNeedsUpdate=!1;let t=Qa.elements,r=this.matrixWorld.elements,n=!1;for(let i=0;i<16;i++){let o=t[i],a=r[i];if(Math.abs(o-a)>2**-52){n=!0;break}}if(n){this.matrixWorld.copy(Qa),this.matrixWorldInverse.copy(Qa).invert();let i=this.children;for(let l=0,u=i.length;l<u;l++)i[l].updateMatrixWorld();let{tilesRenderer:o}=this,{activeTiles:a,visibleTiles:s}=o;a.forEach(l=>{s.has(l)||l.engineData.scene.updateMatrixWorld(!0)})}}}updateWorldMatrix(e,t){this.parent&&e&&this.parent.updateWorldMatrix(e,!1),this.updateMatrixWorld(!0)}},dE=new Bp;function pE(e,t,r,n){let{scene:i}=e.engineData;r.invokeOnePlugin(o=>o.raycastTile&&o.raycastTile(e,i,t,n))||t.intersectObject(i,!0,n)}function hE(e){return"traversal"in e}function Ov(e,t,r,n,i=null){if(!hE(t))return;let{group:o,activeTiles:a}=e,{boundingVolume:s}=t.engineData;if(i===null&&(i=dE,i.copy(r.ray).applyMatrix4(o.matrixWorldInverse)),!t.traversal.used||!s.intersectsRay(i))return;a.has(t)&&pE(t,r,e,n);let l=t.children;for(let u=0,d=l.length;u<d;u++)Ov(e,l[u],r,n,i)}var vc=new De,wc=new De,Qt=new De,Mc=new Bp,Lp=class{constructor(e=new Av,t=new Rt){this.box=e.clone(),this.transform=t.clone(),this.inverseTransform=new Rt,this.points=Array(8).fill().map(()=>new De),this.planes=[,,,,,,].fill().map(()=>new J2)}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,Qt).distanceTo(e)}containsPoint(e){return Qt.copy(e).applyMatrix4(this.inverseTransform),this.box.containsPoint(Qt)}intersectsRay(e){return Mc.copy(e).applyMatrix4(this.inverseTransform),Mc.intersectsBox(this.box)}intersectRay(e,t){return Mc.copy(e).applyMatrix4(this.inverseTransform),Mc.intersectBox(this.box,t)?(t.applyMatrix4(this.transform),t):null}update(){let{points:e,inverseTransform:t,transform:r,box:n}=this;t.copy(r).invert();let{min:i,max:o}=n,a=0;for(let s=-1;s<=1;s+=2)for(let l=-1;l<=1;l+=2)for(let u=-1;u<=1;u+=2)e[a].set(s<0?i.x:o.x,l<0?i.y:o.y,u<0?i.z:o.z).applyMatrix4(r),a++;this.updatePlanes()}updatePlanes(){vc.copy(this.box.min).applyMatrix4(this.transform),wc.copy(this.box.max).applyMatrix4(this.transform),Qt.set(0,0,1).transformDirection(this.transform),this.planes[0].setFromNormalAndCoplanarPoint(Qt,vc),this.planes[1].setFromNormalAndCoplanarPoint(Qt,wc).negate(),Qt.set(0,1,0).transformDirection(this.transform),this.planes[2].setFromNormalAndCoplanarPoint(Qt,vc),this.planes[3].setFromNormalAndCoplanarPoint(Qt,wc).negate(),Qt.set(1,0,0).transformDirection(this.transform),this.planes[4].setFromNormalAndCoplanarPoint(Qt,vc),this.planes[5].setFromNormalAndCoplanarPoint(Qt,wc).negate()}intersectsSphere(e){return this.clampPoint(e.center,Qt),Qt.distanceToSquared(e.center)<=e.radius*e.radius}intersectsFrustum(e){return this._intersectsPlaneShape(e.planes,e.points)}intersectsOBB(e){return this._intersectsPlaneShape(e.planes,e.points)}_intersectsPlaneShape(e,t){let r=this.points,n=this.planes;for(let i=0;i<6;i++){let o=e[i],a=-1/0;for(let s=0;s<8;s++){let l=r[s],u=o.distanceToPoint(l);a=a<u?u:a}if(a<0)return!1}for(let i=0;i<6;i++){let o=n[i],a=-1/0;for(let s=0;s<8;s++){let l=t[s],u=o.distanceToPoint(l);a=a<u?u:a}if(a<0)return!1}return!0}},es=Math.PI,kp=es/2,Ja=new De,zi=new De,_r=new De,xe=new De,Xt=new Rt,mE=new Av,Sv=new Rt;function $n(e,t){t.radius=Math.max(t.radius,e.distanceToSquared(t.center))}function Cv(e){return e.x!==e.y}var Iv=class extends Fp{constructor(e=1,t=1,r=1,n=-kp,i=kp,o=0,a=2*es,s=0,l=0){super(e,t,r),this.latStart=n,this.latEnd=i,this.lonStart=o,this.lonEnd=a,this.heightStart=s,this.heightEnd=l}getBoundingBox(e,t){Cv(this.radius)&&console.warn("EllipsoidRegion: Triaxial ellipsoids are not supported.");let{latStart:r,latEnd:n,lonStart:i,lonEnd:o,heightStart:a,heightEnd:s}=this,l=(r+n)*.5,u=(i+o)*.5,d=r>0,p=n<0,c;c=d?r:p?n:0;let{min:h,max:m}=e;h.setScalar(1/0),m.setScalar(-1/0),o-i<=es?(this.getCartographicToNormal(l,u,_r),zi.set(0,0,1),Ja.crossVectors(zi,_r).normalize(),zi.crossVectors(_r,Ja).normalize(),t.makeBasis(Ja,zi,_r),Xt.copy(t).invert(),this.getCartographicToPosition(c,i,s,xe).applyMatrix4(Xt),m.x=Math.abs(xe.x),h.x=-m.x,this.getCartographicToPosition(n,i,s,xe).applyMatrix4(Xt),m.y=xe.y,this.getCartographicToPosition(n,u,s,xe).applyMatrix4(Xt),m.y=Math.max(xe.y,m.y),this.getCartographicToPosition(r,i,s,xe).applyMatrix4(Xt),h.y=xe.y,this.getCartographicToPosition(r,u,s,xe).applyMatrix4(Xt),h.y=Math.min(xe.y,h.y),this.getCartographicToPosition(l,u,s,xe).applyMatrix4(Xt),m.z=xe.z,this.getCartographicToPosition(r,i,a,xe).applyMatrix4(Xt),h.z=xe.z,this.getCartographicToPosition(n,i,a,xe).applyMatrix4(Xt),h.z=Math.min(xe.z,h.z)):(this.getCartographicToPosition(c,u,s,_r),_r.z=0,_r.length()<1e-10?_r.set(1,0,0):_r.normalize(),zi.set(0,0,1),Ja.crossVectors(_r,zi).normalize(),t.makeBasis(Ja,zi,_r),Xt.copy(t).invert(),this.getCartographicToPosition(c,u+kp,s,xe).applyMatrix4(Xt),m.x=Math.abs(xe.x),h.x=-m.x,this.getCartographicToPosition(n,0,p?a:s,xe).applyMatrix4(Xt),m.y=xe.y,this.getCartographicToPosition(r,0,d?a:s,xe).applyMatrix4(Xt),h.y=xe.y,this.getCartographicToPosition(c,u,s,xe).applyMatrix4(Xt),m.z=xe.z,this.getCartographicToPosition(c,o,s,xe).applyMatrix4(Xt),h.z=xe.z),e.getCenter(xe),e.min.sub(xe).multiplyScalar(1.0000000000001),e.max.sub(xe).multiplyScalar(1.0000000000001),xe.applyMatrix4(t),t.setPosition(xe)}getBoundingSphere(e){Cv(this.radius)&&console.warn("EllipsoidRegion: Triaxial ellipsoids are not supported."),this.getBoundingBox(mE,Sv),e.center.setFromMatrixPosition(Sv),e.radius=0;let{latStart:t,latEnd:r,lonStart:n,lonEnd:i,heightStart:o,heightEnd:a}=this,s=(t+r)*.5,l=(n+i)*.5,u=t>0,d=r<0,p;p=u?t:d?r:0,this.getCartographicToPosition(p,n,a,xe),$n(xe,e),this.getCartographicToPosition(r,n,a,xe),$n(xe,e),this.getCartographicToPosition(r,l,a,xe),$n(xe,e),this.getCartographicToPosition(t,n,a,xe),$n(xe,e),this.getCartographicToPosition(t,l,a,xe),$n(xe,e),this.getCartographicToPosition(s,l,a,xe),$n(xe,e),this.getCartographicToPosition(t,n,o,xe),$n(xe,e),i-n>es&&(this.getCartographicToPosition(p,l+es,a,xe),$n(xe,e)),e.radius=Math.sqrt(e.radius)*1.0000000000001}},gn=new De,bn=new De,yn=new De,Tv=new De,_v=new De,fE=class{constructor(){this.sphere=null,this.obb=null,this.region=null,this.regionObb=null}intersectsRay(e){let t=this.sphere,r=this.obb||this.regionObb;return!(t&&!e.intersectsSphere(t)||r&&!r.intersectsRay(e))}intersectRay(e,t=null){let r=this.sphere,n=this.obb||this.regionObb,i=-1/0,o=-1/0;r&&e.intersectSphere(r,Tv)&&(i=r.containsPoint(e.origin)?0:e.origin.distanceToSquared(Tv)),n&&n.intersectRay(e,_v)&&(o=n.containsPoint(e.origin)?0:e.origin.distanceToSquared(_v));let a=Math.max(i,o);return a===-1/0?null:(e.at(Math.sqrt(a),t),t)}distanceToPoint(e){let t=this.sphere,r=this.obb||this.regionObb,n=-1/0,i=-1/0;return t&&(n=Math.max(t.distanceToPoint(e),0)),r&&(i=r.distanceToPoint(e)),n>i?n:i}intersectsFrustum(e){let t=this.obb||this.regionObb,r=this.sphere;return r&&!e.intersectsSphere(r)||t&&!t.intersectsFrustum(e)?!1:!!(r||t)}intersectsSphere(e){let t=this.obb||this.regionObb,r=this.sphere;return r&&!r.intersectsSphere(e)||t&&!t.intersectsSphere(e)?!1:!!(r||t)}intersectsOBB(e){let t=this.obb||this.regionObb,r=this.sphere;return r&&!e.intersectsSphere(r)||t&&!t.intersectsOBB(e)?!1:!!(r||t)}getOBB(e,t){let r=this.obb||this.regionObb;r?(e.copy(r.box),t.copy(r.transform)):(this.getAABB(e),t.identity())}getAABB(e){if(this.sphere)this.sphere.getBoundingBox(e);else{let t=this.obb||this.regionObb;e.copy(t.box).applyMatrix4(t.transform)}}getSphere(e){if(this.sphere)e.copy(this.sphere);else if(this.region)this.region.getBoundingSphere(e);else{let t=this.obb||this.regionObb;t.box.getBoundingSphere(e),e.applyMatrix4(t.transform)}}setObbData(e,t){let r=new Lp;gn.set(e[3],e[4],e[5]),bn.set(e[6],e[7],e[8]),yn.set(e[9],e[10],e[11]);let n=gn.length(),i=bn.length(),o=yn.length();gn.normalize(),bn.normalize(),yn.normalize(),n===0&&gn.crossVectors(bn,yn),i===0&&bn.crossVectors(gn,yn),o===0&&yn.crossVectors(gn,bn),r.transform.set(gn.x,bn.x,yn.x,e[0],gn.y,bn.y,yn.y,e[1],gn.z,bn.z,yn.z,e[2],0,0,0,1).premultiply(t),r.box.min.set(-n,-i,-o),r.box.max.set(n,i,o),r.update(),this.obb=r}setSphereData(e,t,r,n,i){let o=new Dv;o.center.set(e,t,r),o.radius=n,o.applyMatrix4(i),this.sphere=o}setRegionData(e,t,r,n,i,o,a){let s=new Iv(...e.radius,r,i,t,n,o,a),l=new Lp;s.getBoundingBox(l.box,l.transform),l.update(),this.region=s,this.regionObb=l}},gE=new Q2;function bE(e,t,r,n){let i=gE.set(e.normal.x,e.normal.y,e.normal.z,t.normal.x,t.normal.y,t.normal.z,r.normal.x,r.normal.y,r.normal.z);return n.set(-e.constant,-t.constant,-r.constant),n.applyMatrix3(i.invert()),n}var yE=class extends $2{constructor(){super(),this.points=Array(8).fill().map(()=>new De)}setFromProjectionMatrix(...e){return super.setFromProjectionMatrix(...e),this.calculateFrustumPoints(),this}calculateFrustumPoints(){let{planes:e,points:t}=this;[[e[0],e[3],e[4]],[e[1],e[3],e[4]],[e[0],e[2],e[4]],[e[1],e[2],e[4]],[e[0],e[3],e[5]],[e[1],e[3],e[5]],[e[0],e[2],e[5]],[e[1],e[2],e[5]]].forEach((r,n)=>{bE(r[0],r[1],r[2],t[n])})}};var Op=0;function Pv(e,t,r,n){try{return rE.getByteLength(e,t,r,n)}catch{return Op}}function xE(e){if(!e)return 0;if(e.isExternalTexture)return e.userData?.byteLength??Op;let{format:t,type:r,image:n,mipmaps:i}=e;if(e.isCompressedTexture&&Array.isArray(i)&&i.length>0){let a=0;for(let s of i)s?.data?.byteLength?a+=s.data.byteLength:a+=Pv(s.width,s.height,t,r);return a}if(!n)return Op;let o=Pv(n.width,n.height,t,r);return o*=e.generateMipmaps?4/3:1,o}function vE(e){let t=new Set,r=0;return e.traverse(n=>{if(n.geometry&&!t.has(n.geometry)&&(r+=nE(n.geometry),t.add(n.geometry)),n.material){let i=n.material;for(let o in i){let a=i[o];a&&a.isTexture&&!t.has(a)&&(r+=xE(a),t.add(a))}}}),r}var Bv=Symbol("INITIAL_FRUSTUM_CULLED"),Sc=new Rt,Za=new De,Dp=new jp,wE=new De(1,0,0),ME=new De(0,1,0),SE=()=>null;function Ev(e,t){e.traverse(r=>{r.frustumCulled=r[Bv]&&t})}var Gp=class extends vp{get autoDisableRendererCulling(){return this._autoDisableRendererCulling}set autoDisableRendererCulling(e){this._autoDisableRendererCulling!==e&&(super._autoDisableRendererCulling=e,this.forEachLoadedModel(t=>{Ev(t,!e)}))}constructor(...e){super(...e),this.accelerateRaycast=!0,this.group=new uE(this),this.ellipsoid=ts.clone(),this.cameras=[],this.cameraMap=new Map,this.cameraInfo=[],this._upRotationMatrix=new Rt,this._bytesUsed=new WeakMap,this._autoDisableRendererCulling=!0,this.manager=new K2,this._listeners={}}addEventListener(e,t){fc.prototype.addEventListener.call(this,e,t)}hasEventListener(e,t){return fc.prototype.hasEventListener.call(this,e,t)}removeEventListener(e,t){fc.prototype.removeEventListener.call(this,e,t)}dispatchEvent(e){fc.prototype.dispatchEvent.call(this,e)}getBoundingBox(e){if(!this.root)return!1;let t=this.root.engineData.boundingVolume;return t?(t.getAABB(e),!0):!1}getOrientedBoundingBox(e,t){if(!this.root)return!1;let r=this.root.engineData.boundingVolume;return r?(r.getOBB(e,t),!0):!1}getBoundingSphere(e){if(!this.root)return!1;let t=this.root.engineData.boundingVolume;return t?(t.getSphere(e),!0):!1}forEachLoadedModel(e){this.traverse(t=>{let r=t.engineData&&t.engineData.scene;r&&e(r,t)},null,!1)}raycast(e,t){if(this.root)if(this.accelerateRaycast)Ov(this,this.root,e,t);else{let r=e.firstHitOnly?[]:t;for(let n of this.activeTiles){let{scene:i}=n.engineData;this.invokeOnePlugin(o=>o.raycastTile&&o.raycastTile(n,i,e,r))||e.intersectObject(i,!0,r)}e.firstHitOnly&&r.length>0&&(r.sort((n,i)=>n.distance-i.distance),t.push(r[0]))}}hasCamera(e){return this.cameraMap.has(e)}setCamera(e){let t=this.cameras,r=this.cameraMap;return r.has(e)?!1:(r.set(e,new jp),t.push(e),this.dispatchEvent({type:"add-camera",camera:e}),!0)}setResolution(e,t,r){let n=this.cameraMap;if(!n.has(e))return!1;let i=t.isVector2?t.x:t,o=t.isVector2?t.y:r,a=n.get(e);return(a.width!==i||a.height!==o)&&(a.set(i,o),this.dispatchEvent({type:"camera-resolution-change"})),!0}getResolution(e,t){let r=this.cameraMap.get(e);return r?t.copy(r):null}setResolutionFromRenderer(e,t){return t.getSize(Dp),this.setResolution(e,Dp.x,Dp.y)}deleteCamera(e){let t=this.cameras,r=this.cameraMap;if(r.has(e)){let n=t.indexOf(e);return t.splice(n,1),r.delete(e),this.dispatchEvent({type:"delete-camera",camera:e}),!0}return!1}loadRootTileset(...e){return super.loadRootTileset(...e).then(t=>{let{asset:r,extensions:n={}}=t;switch((r&&r.gltfUpAxis||"y").toLowerCase()){case"x":this._upRotationMatrix.makeRotationAxis(ME,-Math.PI/2);break;case"y":this._upRotationMatrix.makeRotationAxis(wE,Math.PI/2);break}if("3DTILES_ellipsoid"in n){let i=n["3DTILES_ellipsoid"],{ellipsoid:o}=this;o.name=i.body,i.radii?o.radius.set(...i.radii):o.radius.set(1,1,1)}return t})}prepareForTraversal(){let e=this.group,t=this.cameras,r=this.cameraMap,n=this.cameraInfo;for(;n.length>t.length;)n.pop();for(;n.length<t.length;)n.push({frustum:new yE,isOrthographic:!1,sseDenominator:-1,position:new De,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 i=0,o=n.length;i<o;i++){let a=t[i],s=n[i],l=s.frustum,u=s.position,d=r.get(a);(d.width===0||d.height===0)&&console.warn("TilesRenderer: resolution for camera error calculation is not set.");let p=a.projectionMatrix.elements;if(s.isOrthographic=p[15]===1,s.isOrthographic){let c=2/p[0],h=2/p[5];s.pixelSize=Math.max(h/d.height,c/d.width)}else s.sseDenominator=2/p[5]/d.height;Sc.copy(e.matrixWorld),Sc.premultiply(a.matrixWorldInverse),Sc.premultiply(a.projectionMatrix),l.setFromProjectionMatrix(Sc,a.coordinateSystem,a.reversedDepth),u.set(0,0,0),u.applyMatrix4(a.matrixWorld),u.applyMatrix4(e.matrixWorldInverse)}}update(){if(super.update(),this.cameras.length===0&&this.root){let e=!1;this.invokeAllPlugins(t=>e||(e=!!(t!==this&&t.calculateTileViewError))),e===!1&&console.warn("TilesRenderer: no cameras defined. Cannot update 3d tiles.")}}preprocessNode(e,t,r=null){super.preprocessNode(e,t,r);let n=new Rt;if(e.transform){let a=e.transform;for(let s=0;s<16;s++)n.elements[s]=a[s]}r&&n.premultiply(r.engineData.transform);let i=new Rt().copy(n).invert(),o=new fE;"sphere"in e.boundingVolume&&o.setSphereData(...e.boundingVolume.sphere,n),"box"in e.boundingVolume&&o.setObbData(e.boundingVolume.box,n),"region"in e.boundingVolume&&o.setRegionData(this.ellipsoid,...e.boundingVolume.region),e.engineData.transform=n,e.engineData.transformInverse=i,e.engineData.boundingVolume=o,e.engineData.geometry=null,e.engineData.materials=null,e.engineData.textures=null,e.toJSON=SE}async parseTile(e,t,r,n,i){let o=t.engineData,a=hc(n),s=this.fetchOptions,l=this.manager,u=null,d=o.transform,p=this._upRotationMatrix,c=(Ii(e)||r).toLowerCase();switch(c){case"b3dm":{let y=new Np(l);y.workingPath=a,y.fetchOptions=s,y.adjustmentTransform.copy(p),u=y.parse(e);break}case"pnts":{let y=new Vp(l);y.workingPath=a,y.fetchOptions=s,u=y.parse(e);break}case"i3dm":{let y=new Up(l);y.workingPath=a,y.fetchOptions=s,y.adjustmentTransform.copy(p),y.ellipsoid.copy(this.ellipsoid),u=y.parse(e);break}case"cmpt":{let y=new Lv(l);y.workingPath=a,y.fetchOptions=s,y.adjustmentTransform.copy(p),y.ellipsoid.copy(this.ellipsoid),u=y.parse(e).then(M=>M.scene);break}case"gltf":case"glb":{let y=l.getHandler("path.gltf")||l.getHandler("path.glb")||new zp(l);y.setWithCredentials(s.credentials==="include"),y.setRequestHeader(s.headers||{}),s.credentials==="include"&&s.mode==="cors"&&y.setCrossOrigin("use-credentials");let M=y.resourcePath||y.path||a;!/[\\/]$/.test(M)&&M.length&&(M+="/"),u=y.parseAsync(e,M).then(E=>{E.scene=E.scene||new Ip;let{scene:v}=E;return v.updateMatrix(),v.matrix.multiply(p).decompose(v.position,v.quaternion,v.scale),E});break}default:u=this.invokeOnePlugin(y=>y.parseToMesh&&y.parseToMesh(e,t,r,n,i));break}let h=await u;if(h===null)throw Error(`TilesRenderer: Content type "${c}" not supported.`);let m,g;h.isObject3D?(m=h,g=null):(m=h.scene,g=h),m.updateMatrix(),m.matrix.premultiply(d),m.matrix.decompose(m.position,m.quaternion,m.scale),await this.invokeAllPlugins(y=>y.processTileModel&&y.processTileModel(m,t)),m.traverse(y=>{y[Bv]=y.frustumCulled,y.userData.tile=t}),Ev(m,!this.autoDisableRendererCulling);let f=[],b=[],w=[];if(m.traverse(y=>{if(y.geometry&&b.push(y.geometry),y.material){let M=y.material;f.push(y.material);for(let E in M){let v=M[E];v&&v.isTexture&&w.push(v)}}}),i.aborted){for(let y=0,M=w.length;y<M;y++){let E=w[y];E.image instanceof ImageBitmap&&E.image.close(),E.dispose()}return}o.materials=f,o.geometry=b,o.textures=w,o.scene=m,o.metadata=g}disposeTile(e){super.disposeTile(e);let t=e.engineData;if(t.scene){let r=t.materials,n=t.geometry,i=t.textures,o=t.scene.parent;t.scene.traverse(a=>{a.userData.meshFeatures&&a.userData.meshFeatures.dispose(),a.userData.structuralMetadata&&a.userData.structuralMetadata.dispose()});for(let a=0,s=n.length;a<s;a++)n[a].dispose();for(let a=0,s=r.length;a<s;a++)r[a].dispose();for(let a=0,s=i.length;a<s;a++){let l=i[a];l.image instanceof ImageBitmap&&l.image.close(),l.dispose()}o&&o.remove(t.scene),t.scene=null,t.materials=null,t.textures=null,t.geometry=null,t.metadata=null}}setTileActive(e,t){super.setTileActive(e,t);let r=e.engineData.scene;r&&(t?(r.parent=this.group,r.updateMatrixWorld(!0)):r.parent=null)}setTileVisible(e,t){let r=e.engineData.scene,{activeTiles:n,group:i}=this;r&&(t?i.add(r):(i.remove(r),n.has(e)&&(r.parent=i))),super.setTileVisible(e,t)}calculateBytesUsed(e,t){let r=this._bytesUsed;return!r.has(e)&&t&&r.set(e,vE(t)),r.get(e)??null}calculateTileViewError(e,t){let r=e.engineData,n=this.cameras,i=this.cameraInfo,o=r.boundingVolume,a=!1,s=0,l=1/0,u=0,d=1/0;for(let p=0,c=n.length;p<c;p++){let h=i[p],m,g;if(h.isOrthographic){let b=h.pixelSize;m=e.geometricError/b,g=1/0}else{let b=h.sseDenominator;g=o.distanceToPoint(h.position),m=g===0?1/0:e.geometricError/(g*b)}let f=i[p].frustum;o.intersectsFrustum(f)&&(a=!0,s=Math.max(s,m),l=Math.min(l,g)),u=Math.max(u,m),d=Math.min(d,g)}a?(t.inView=!0,t.error=s,t.distanceFromCamera=l):(t.inView=!1,t.error=u,t.distanceFromCamera=d)}dispose(){super.dispose(),this.group.removeFromParent()}};import{BatchedMesh as cz,Box2 as CE,Box3 as uz,Box3Helper as dz,BoxGeometry as pz,BufferAttribute as Xp,BufferGeometry as hz,CanvasTexture as mz,Color as fz,CustomBlending as TE,DataTexture as _E,DefaultLoadingManager as gz,DoubleSide as bz,EventDispatcher as yz,FileLoader as PE,FloatType as xz,Frustum as vz,GreaterDepth as wz,Group as Mz,LineBasicMaterial as Sz,LineSegments as Cz,LinearFilter as EE,LinearMipMapLinearFilter as Tz,MathUtils as qp,Matrix2 as AE,Matrix3 as RE,Matrix4 as kE,Mesh as _z,MeshBasicMaterial as DE,MeshLambertMaterial as Pz,MeshStandardMaterial as Ez,OneFactor as LE,PlaneGeometry as Az,Points as Rz,PointsMaterial as kz,Quaternion as Dz,REVISION as Lz,RGFormat as Oz,Ray as Iz,Raycaster as Bz,RedFormat as jz,SRGBColorSpace as zz,ShaderMaterial as OE,Source as Nz,Sphere as Vz,SphereGeometry as Fz,Texture as Uz,TextureUtils as Gz,Triangle as Hz,UnsignedByteType as Wz,Vector2 as Pr,Vector3 as Jv,Vector4 as IE,WebGLArrayRenderTarget as Xz,WebGLRenderTarget as jv,WebGLRenderer as BE,ZeroFactor as jE}from"three";import{GLTFLoader as zE}from"three/addons/loaders/GLTFLoader.js";import{FullScreenQuad as Zv}from"three/addons/postprocessing/Pass.js";var Yz=Object.freeze({fill:"#cccccc",stroke:"transparent",strokeWidth:1,radius:2,order:0,visible:!0});var zv=new Wr;zv.maxJobs=10,zv.priorityCallback=(e,t)=>{let r=e.tile,n=t.tile,i=r.internal.renderer,o=n.internal.renderer,a=i.visibleTiles.has(r);return a===o.visibleTiles.has(n)?Eo(r,n):a?1:-1};var Nv=new Jv;function rs(e,t){if(e.isInterleavedBufferAttribute||e.array instanceof t)return e;let r=t===Int8Array||t===Int16Array||t===Int32Array?-1:0,n=new Xp(new t(e.count*e.itemSize),e.itemSize,!0),i=e.itemSize,o=e.count;for(let a=0;a<o;a++)for(let s=0;s<i;s++){let l=qp.clamp(e.getComponent(a,s),r,1);n.setComponent(a,s,l)}return n}function NE(e,t=Int16Array){let r=e.geometry,n=r.attributes,i=n.position;if(i.isInterleavedBufferAttribute||i.array instanceof t)return i;let o=new Xp(new t(i.count*i.itemSize),i.itemSize,!1),a=i.itemSize,s=i.count;r.computeBoundingBox();let l=r.boundingBox,{min:u,max:d}=l,p=2**(8*t.BYTES_PER_ELEMENT-1)-1,c=-p;for(let h=0;h<s;h++)for(let m=0;m<a;m++){let g=m===0?"x":m===1?"y":"z",f=u[g],b=d[g],w=qp.mapLinear(i.getComponent(h,m),f,b,c,p);o.setComponent(h,m,w)}l.getCenter(Nv).multiply(e.scale).applyQuaternion(e.quaternion),e.position.add(Nv),e.scale.x*=.5*(d.x-u.x)/p,e.scale.y*=.5*(d.y-u.y)/p,e.scale.z*=.5*(d.z-u.z)/p,n.position=o,e.geometry.boundingBox=null,e.geometry.boundingSphere=null,e.updateMatrixWorld()}var $p=class{constructor(e){this._options={generateNormals:!1,disableMipmaps:!0,compressIndex:!0,compressNormals:!1,compressUvs:!1,compressPosition:!1,uvType:Int8Array,normalType:Int8Array,positionType:Int16Array,...e},this.name="TILES_COMPRESSION_PLUGIN",this.priority=-100}processTileModel(e,t){let{generateNormals:r,disableMipmaps:n,compressIndex:i,compressUvs:o,compressNormals:a,compressPosition:s,uvType:l,normalType:u,positionType:d}=this._options;e.traverse(p=>{if(p.material&&n){let c=p.material;for(let h in c){let m=c[h];m&&m.isTexture&&m.generateMipmaps&&(m.generateMipmaps=!1,m.minFilter=EE)}}if(p.geometry){let c=p.geometry,h=c.attributes;if(o){let{uv:m,uv1:g,uv2:f,uv3:b}=h;m&&(h.uv=rs(m,l)),g&&(h.uv1=rs(g,l)),f&&(h.uv2=rs(f,l)),b&&(h.uv3=rs(b,l))}if(r&&!h.normals&&c.computeVertexNormals(),a&&h.normals&&(h.normals=rs(h.normals,u)),s&&NE(p,d),i&&c.index){let m=h.position.count,g=c.index,f=m>65535?Uint32Array:m>255?Uint16Array:Uint8Array;if(!(g.array instanceof f)){let b=new f(c.index.count);b.set(g.array);let w=new Xp(b,1);c.setIndex(w)}}}})}};function kt(e,t,r){return e&&t in e?e[t]:r}function e0(e){return e!=="BOOLEAN"&&e!=="STRING"&&e!=="ENUM"}function VE(e){return/^FLOAT/.test(e)}function as(e){return/^VEC/.test(e)}function ss(e){return/^MAT/.test(e)}function t0(e,t,r,n=null){return ss(r)||as(r)?n.fromArray(e,t):e[t]}function Hp(e){let{type:t,componentType:r}=e;switch(t){case"SCALAR":return r==="INT64"?0n:0;case"VEC2":return new Pr;case"VEC3":return new Jv;case"VEC4":return new IE;case"MAT2":return new AE;case"MAT3":return new RE;case"MAT4":return new kE;case"BOOLEAN":return!1;case"STRING":return"";case"ENUM":return 0}}function Vv(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 FE(e,t=null){if(e.array){t=t&&Array.isArray(t)?t:[],t.length=e.count;for(let r=0,n=t.length;r<n;r++)t[r]=Tc(e,t[r])}else t=Tc(e,t);return t}function Tc(e,t=null){let r=e.default,n=e.type;if(t||(t=Hp(e)),r===null){switch(n){case"SCALAR":return 0;case"VEC2":return t.set(0,0);case"VEC3":return t.set(0,0,0);case"VEC4":return t.set(0,0,0,0);case"MAT2":return t.identity();case"MAT3":return t.identity();case"MAT4":return t.identity();case"BOOLEAN":return!1;case"STRING":return"";case"ENUM":return""}throw Error("ClassProperty: invalid type.")}else if(ss(n))t.fromArray(r);else if(as(n))t.fromArray(r);else return r}function UE(e,t){if(e.noData===null)return t;let r=e.noData,n=e.type;if(Array.isArray(t))for(let a=0,s=t.length;a<s;a++)t[a]=i(t[a]);else t=i(t);return t;function i(a){return o(a)&&(a=Tc(e,a)),a}function o(a){if(ss(n)){let s=a.elements;for(let l=0,u=r.length;l<u;l++)if(r[l]!==s[l])return!1;return!0}else if(as(n)){for(let s=0,l=r.length;s<l;s++)if(r[s]!==a.getComponent(s))return!1;return!0}else return r===a}}function GE(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 HE(e,t){let{type:r,componentType:n,scale:i,offset:o,normalized:a}=e;if(Array.isArray(t))for(let p=0,c=t.length;p<c;p++)t[p]=s(t[p]);else t=s(t);return t;function s(p){return p=ss(r)?u(p):as(r)?l(p):d(p),p}function l(p){return p.x=d(p.x),p.y=d(p.y),"z"in p&&(p.z=d(p.z)),"w"in p&&(p.w=d(p.w)),p}function u(p){let c=p.elements;for(let h=0,m=c.length;h<m;h++)c[h]=d(c[h]);return p}function d(p){return a&&(p=GE(n,p)),(a||VE(n))&&(p=p*i+o),p}}function Yp(e,t,r=null){if(e.array){Array.isArray(t)||(t=Array(e.count||0)),t.length=r===null?e.count:r;for(let n=0,i=t.length;n<i;n++)Vv(e.type,t[n])||(t[n]=Hp(e))}else Vv(e.type,t)||(t=Hp(e));return t}function _c(e,t){for(let r in t)r in e||delete t[r];for(let r in e){let n=e[r];t[r]=Yp(n,t[r])}}function WE(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 Ec=class{constructor(e,t,r=null){this.name=t.name||null,this.description=t.description||null,this.type=t.type,this.componentType=t.componentType||null,this.enumType=t.enumType||null,this.array=t.array||!1,this.count=t.count||0,this.normalized=t.normalized||!1,this.offset=t.offset||0,this.scale=kt(t,"scale",1),this.max=kt(t,"max",1/0),this.min=kt(t,"min",-1/0),this.required=t.required||!1,this.noData=kt(t,"noData",null),this.default=kt(t,"default",null),this.semantic=kt(t,"semantic",null),this.enumSet=null,this.accessorProperty=r,r&&(this.offset=kt(r,"offset",this.offset),this.scale=kt(r,"scale",this.scale),this.max=kt(r,"max",this.max),this.min=kt(r,"min",this.min)),t.type==="ENUM"&&(this.enumSet=e[this.enumType],this.componentType===null&&(this.componentType=kt(this.enumSet,"valueType","UINT16")))}shapeToProperty(e,t=null){return Yp(this,e,t)}resolveDefaultElement(e){return Tc(this,e)}resolveDefault(e){return FE(this,e)}resolveNoData(e){return UE(this,e)}resolveEnumsToStrings(e){let t=this.enumSet;if(this.type==="ENUM")if(Array.isArray(e))for(let n=0,i=e.length;n<i;n++)e[n]=r(e[n]);else e=r(e);return e;function r(n){let i=t.values.find(o=>o.value===n);return i===null?"":i.name}}adjustValueScaleOffset(e){return e0(this.type)?HE(this,e):e}},Kp=class{constructor(e,t={},r={},n=null){this.definition=e,this.class=t[e.class],this.className=e.class,this.enums=r,this.data=n,this.name="name"in e?e.name:null,this.properties=null}getPropertyNames(){return Object.keys(this.class.properties)}includesData(e){return!!this.definition.properties[e]}dispose(){}_initProperties(e=Ec){let t={};for(let r in this.class.properties)t[r]=new e(this.enums,this.class.properties[r],this.definition.properties[r]);this.properties=t}},XE=class extends Ec{constructor(e,t,r=null){super(e,t,r),this.attribute=r?.attribute??null}},qE=class extends Kp{constructor(...e){super(...e),this.isPropertyAttributeAccessor=!0,this._initProperties(XE)}getData(e,t,r={}){let n=this.properties;_c(n,r);for(let i in n)r[i]=this.getPropertyValue(i,e,t,r[i]);return r}getPropertyValue(e,t,r,n=null){if(t>=this.count)throw Error("PropertyAttributeAccessor: Requested index is outside the range of the buffer.");let i=this.properties[e],o=i.type;if(!i)throw Error("PropertyAttributeAccessor: Requested class property does not exist.");if(!this.definition.properties[e])return i.resolveDefault(n);n=i.shapeToProperty(n);let a=r.getAttribute(i.attribute.toLowerCase());if(ss(o)){let s=n.elements;for(let l=s.length;0<l;)s[0]=a.getComponent(t,0)}else if(as(o))n.fromBufferAttribute(a,t);else if(o==="SCALAR"||o==="ENUM")n=a.getX(t);else throw Error("StructuredMetadata.PropertyAttributeAccessor: BOOLEAN and STRING types are not supported by property attributes.");return n=i.adjustValueScaleOffset(n),n=i.resolveEnumsToStrings(n),n=i.resolveNoData(n),n}},$E=class extends Ec{constructor(e,t,r=null){super(e,t,r),this.values=r?.values??null,this.valueLength=WE(this.type),this.arrayOffsets=kt(r,"arrayOffsets",null),this.stringOffsets=kt(r,"stringOffsets",null),this.arrayOffsetType=kt(r,"arrayOffsetType","UINT32"),this.stringOffsetType=kt(r,"stringOffsetType","UINT32")}getArrayLengthFromId(e,t){let r=this.count;if(this.arrayOffsets!==null){let{arrayOffsets:n,arrayOffsetType:i}=this,o=new(os(i))(e[n]);r=o[t+1]-o[t]}return r}getIndexOffsetFromId(e,t){let r=t;if(this.arrayOffsets){let{arrayOffsets:n,arrayOffsetType:i}=this;r=new(os(i))(e[n])[r]}else this.array&&(r*=this.count);return r}},YE=class extends Kp{constructor(...e){super(...e),this.isPropertyTableAccessor=!0,this.count=this.definition.count,this._initProperties($E)}getData(e,t={}){let r=this.properties;_c(r,t);for(let n in r)t[n]=this.getPropertyValue(n,e,t[n]);return t}_readValueAtIndex(e,t,r,n=null){let i=this.properties[e],{componentType:o,type:a}=i,s=this.data,l=s[i.values],u=new(os(o,a))(l),d=i.getIndexOffsetFromId(s,t);if(e0(a)||a==="ENUM")return t0(u,(d+r)*i.valueLength,a,n);if(a==="STRING"){let p=d+r,c=0;if(i.stringOffsets!==null){let{stringOffsets:m,stringOffsetType:g}=i,f=new(os(g))(s[m]);c=f[p+1]-f[p],p=f[p]}let h=new Uint8Array(u.buffer,p,c);n=new TextDecoder().decode(h)}else if(a==="BOOLEAN"){let p=d+r,c=Math.floor(p/8),h=p%8;n=(u[c]>>h&1)==1}return n}getPropertyValue(e,t,r=null){if(t>=this.count)throw Error("PropertyTableAccessor: Requested index is outside the range of the table.");let n=this.properties[e];if(!n)throw Error("PropertyTableAccessor: Requested property does not exist.");if(!this.definition.properties[e])return n.resolveDefault(r);let i=n.array,o=this.data,a=n.getArrayLengthFromId(o,t);if(r=n.shapeToProperty(r,a),i)for(let s=0,l=r.length;s<l;s++)r[s]=this._readValueAtIndex(e,t,s,r[s]);else r=this._readValueAtIndex(e,t,0,r);return r=n.adjustValueScaleOffset(r),r=n.resolveEnumsToStrings(r),r=n.resolveNoData(r),r}},ns=new CE,Fv=class{constructor(){this._renderer=new BE,this._target=new jv(1,1),this._texTarget=new jv,this._quad=new Zv(new OE({blending:TE,blendDst:jE,blendSrc:LE,uniforms:{map:{value:null},pixel:{value:new Pr}},vertexShader:`
|
|
60
|
+
void main() {
|
|
61
|
+
|
|
62
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
|
|
63
|
+
|
|
64
|
+
}
|
|
65
|
+
`,fragmentShader:`
|
|
66
|
+
uniform sampler2D map;
|
|
67
|
+
uniform ivec2 pixel;
|
|
68
|
+
|
|
69
|
+
void main() {
|
|
70
|
+
|
|
71
|
+
gl_FragColor = texelFetch( map, pixel, 0 );
|
|
72
|
+
|
|
73
|
+
}
|
|
74
|
+
`}))}increaseSizeTo(e){this._target.setSize(Math.max(this._target.width,e),1)}readDataAsync(e){let{_renderer:t,_target:r}=this;return t.readRenderTargetPixelsAsync(r,0,0,e.length/4,1,e)}readData(e){let{_renderer:t,_target:r}=this;t.readRenderTargetPixels(r,0,0,e.length/4,1,e)}renderPixelToTarget(e,t,r){let{_renderer:n,_target:i}=this;ns.min.copy(t),ns.max.copy(t),ns.max.x+=1,ns.max.y+=1,n.initRenderTarget(i),n.copyTextureToTexture(e,i.texture,ns,r,0)}},Kn=new class{constructor(){let e=null;Object.getOwnPropertyNames(Fv.prototype).forEach(t=>{t!=="constructor"&&(this[t]=(...r)=>(e||(e=new Fv),e[t](...r)))})}},Uv=new Pr,Gv=new Pr,Hv=new Pr;function KE(e,t){return t===0?e.getAttribute("uv"):e.getAttribute(`uv${t}`)}function r0(e,t,r=[,,,]){let n=3*t,i=3*t+1,o=3*t+2;return e.index&&(n=e.index.getX(n),i=e.index.getX(i),o=e.index.getX(o)),r[0]=n,r[1]=i,r[2]=o,r}function n0(e,t,r,n,i){let[o,a,s]=n,l=KE(e,t);Uv.fromBufferAttribute(l,o),Gv.fromBufferAttribute(l,a),Hv.fromBufferAttribute(l,s),i.set(0,0,0).addScaledVector(Uv,r.x).addScaledVector(Gv,r.y).addScaledVector(Hv,r.z)}function i0(e,t,r,n){let i=e.x-Math.floor(e.x),o=e.y-Math.floor(e.y),a=Math.floor(i*t%t),s=Math.floor(o*r%r);return n.set(a,s),n}var Wv=new Pr,Xv=new Pr,qv=new Pr,QE=class extends Ec{constructor(e,t,r=null){super(e,t,r),this.channels=kt(r,"channels",[0]),this.index=kt(r,"index",null),this.texCoord=kt(r,"texCoord",null),this.valueLength=parseInt(this.type.replace(/[^0-9]/g,""))||1}readDataFromBuffer(e,t,r=null){let n=this.type;if(n==="BOOLEAN"||n==="STRING")throw Error("PropertyTextureAccessor: BOOLEAN and STRING types not supported.");return t0(e,t*this.valueLength,n,r)}},JE=class extends Kp{constructor(...e){super(...e),this.isPropertyTextureAccessor=!0,this._asyncRead=!1,this._initProperties(QE)}getData(e,t,r,n={}){let i=this.properties;_c(i,n);let o=Object.keys(i),a=o.map(s=>n[s]);return this.getPropertyValuesAtTexel(o,e,t,r,a),o.forEach((s,l)=>n[s]=a[l]),n}async getDataAsync(e,t,r,n={}){let i=this.properties;_c(i,n);let o=Object.keys(i),a=o.map(s=>n[s]);return await this.getPropertyValuesAtTexelAsync(o,e,t,r,a),o.forEach((s,l)=>n[s]=a[l]),n}getPropertyValuesAtTexelAsync(...e){this._asyncRead=!0;let t=this.getPropertyValuesAtTexel(...e);return this._asyncRead=!1,t}getPropertyValuesAtTexel(e,t,r,n,i=[]){for(;i.length<e.length;)i.push(null);i.length=e.length,Kn.increaseSizeTo(i.length);let o=this.data,a=this.definition.properties,s=this.properties,l=r0(n,t);for(let p=0,c=e.length;p<c;p++){let h=e[p];if(!a[h])continue;let m=s[h],g=o[m.index];n0(n,m.texCoord,r,l,Wv),i0(Wv,g.image.width,g.image.height,Xv),qv.set(p,0),Kn.renderPixelToTarget(g,Xv,qv)}let u=new Uint8Array(e.length*4);if(this._asyncRead)return Kn.readDataAsync(u).then(()=>(d.call(this),i));return Kn.readData(u),d.call(this),i;function d(){for(let p=0,c=e.length;p<c;p++){let h=e[p],m=s[h],g=m.type;if(i[p]=Yp(m,i[p]),!m)throw Error("PropertyTextureAccessor: Requested property does not exist.");if(!a[h]){i[p]=m.resolveDefault(i);continue}let f=m.valueLength*(m.count||1),b=m.channels.map(M=>u[4*p+M]),w=m.componentType,y=new(os(w,g))(f);if(new Uint8Array(y.buffer).set(b),m.array){let M=i[p];for(let E=0,v=M.length;E<v;E++)M[E]=m.readDataFromBuffer(y,E,M[E])}else i[p]=m.readDataFromBuffer(y,0,i[p]);i[p]=m.adjustValueScaleOffset(i[p]),i[p]=m.resolveEnumsToStrings(i[p]),i[p]=m.resolveNoData(i[p])}}}dispose(){this.data.forEach(e=>{e&&(e.dispose(),e.image instanceof ImageBitmap&&e.image.close())})}},Wp=class{constructor(e,t,r,n=null,i=null){let{schema:o,propertyTables:a=[],propertyTextures:s=[],propertyAttributes:l=[]}=e,{enums:u,classes:d}=o,p=a.map(m=>new YE(m,d,u,r)),c=[],h=[];n&&(n.propertyTextures&&(c=n.propertyTextures.map(m=>new JE(s[m],d,u,t))),n.propertyAttributes&&(h=n.propertyAttributes.map(m=>new qE(l[m],d,u)))),this.schema=o,this.tableAccessors=p,this.textureAccessors=c,this.attributeAccessors=h,this.object=i,this.textures=t,this.nodeMetadata=n}getPropertyTableData(e,t,r=null){if(!Array.isArray(e))r||(r={}),r=this.tableAccessors[e].getData(t,r);else{r||(r=[]);let n=Math.min(e.length,t.length);r.length=n;for(let i=0;i<n;i++){let o=this.tableAccessors[e[i]];r[i]=o.getData(t[i],r[i])}}if(Array.isArray(e)!==Array.isArray(r)||Array.isArray(e)!==Array.isArray(t))throw Error("StructuralMetadata: Scalar and array inputs cannot be mixed.");return r}getPropertyTableInfo(e=null){if(e===null&&(e=this.tableAccessors.map((t,r)=>r)),Array.isArray(e))return e.map(t=>{let r=this.tableAccessors[t];return{name:r.name,className:r.definition.class}});{let t=this.tableAccessors[e];return{name:t.name,className:t.definition.class}}}getPropertyTextureData(e,t,r=[]){let n=this.textureAccessors;r.length=n.length;for(let i=0;i<n.length;i++)r[i]=n[i].getData(e,t,this.object.geometry,r[i]);return r}async getPropertyTextureDataAsync(e,t,r=[]){let n=this.textureAccessors;r.length=n.length;let i=[];for(let o=0;o<n.length;o++){let a=n[o].getDataAsync(e,t,this.object.geometry,r[o]).then(s=>{r[o]=s});i.push(a)}return await Promise.all(i),r}getPropertyTextureInfo(){return this.textureAccessors}getPropertyAttributeData(e,t=[]){let r=this.attributeAccessors;t.length=r.length;for(let n=0;n<r.length;n++)t[n]=r[n].getData(e,this.object.geometry,t[n]);return t}getPropertyAttributeInfo(){return this.attributeAccessors.map(e=>({name:e.name,className:e.definition.class}))}dispose(){this.textureAccessors.forEach(e=>e.dispose()),this.tableAccessors.forEach(e=>e.dispose()),this.attributeAccessors.forEach(e=>e.dispose())}},is="EXT_structural_metadata";function ZE(e,t=[]){let r=e.json.textures?.length||0,n=Array(r).fill(null);return t.forEach(({properties:i})=>{for(let o in i){let{index:a}=i[o];n[a]===null&&(n[a]=e.loadTexture(a))}}),Promise.all(n)}function eA(e,t=[]){let r=e.json.bufferViews?.length||0,n=Array(r).fill(null);return t.forEach(({properties:i})=>{for(let o in i){let{values:a,arrayOffsets:s,stringOffsets:l}=i[o];n[a]===null&&(n[a]=e.getDependency("bufferView",a)),n[s]===null&&(n[s]=e.getDependency("bufferView",s)),n[l]===null&&(n[l]=e.getDependency("bufferView",l))}}),Promise.all(n)}var o0=class{constructor(e){this.parser=e,this.name=is}async afterRoot({scene:e,parser:t}){let r=t.json.extensionsUsed;if(!r||!r.includes(is))return;let n=null,i=t.json.extensions[is];if(i.schemaUri){let{manager:l,path:u,requestHeader:d,crossOrigin:p}=t.options,c=new URL(i.schemaUri,u).toString(),h=new PE(l);h.setCrossOrigin(p),h.setResponseType("json"),h.setRequestHeader(d),n=h.loadAsync(c).then(m=>{i={...i,schema:m}})}let[o,a]=await Promise.all([ZE(t,i.propertyTextures),eA(t,i.propertyTables),n]),s=new Wp(i,o,a);e.userData.structuralMetadata=s,e.traverse(l=>{if(t.associations.has(l)){let{meshes:u,primitives:d}=t.associations.get(l),p=t.json.meshes[u]?.primitives[d];if(p&&p.extensions&&p.extensions[is]){let c=p.extensions[is];l.userData.structuralMetadata=new Wp(i,o,a,c,l)}else l.userData.structuralMetadata=s}})}},$v=new Pr,Yv=new Pr,Kv=new Pr;function tA(e){return e.x>e.y&&e.x>e.z?0:e.y>e.z?1:2}var a0=class{constructor(e,t,r){this.geometry=e,this.textures=t,this.data=r,this._asyncRead=!1,this.featureIds=r.featureIds.map(n=>{let{texture:i,...o}=n,a={label:null,propertyTable:null,nullFeatureId:null,...o};return i&&(a.texture={texCoord:0,channels:[0],...i}),a})}getTextures(){return this.textures}getFeatureInfo(){return this.featureIds}getFeaturesAsync(...e){this._asyncRead=!0;let t=this.getFeatures(...e);return this._asyncRead=!1,t}getFeatures(e,t){let{geometry:r,textures:n,featureIds:i}=this,o=Array(i.length).fill(null),a=i.length;Kn.increaseSizeTo(a);let s=r0(r,e),l=s[tA(t)];for(let p=0,c=i.length;p<c;p++){let h=i[p],m="nullFeatureId"in h?h.nullFeatureId:null;if("texture"in h){let g=n[h.texture.index];n0(r,h.texture.texCoord,t,s,$v),i0($v,g.image.width,g.image.height,Yv),Kv.set(p,0),Kn.renderPixelToTarget(n[h.texture.index],Yv,Kv)}else if("attribute"in h){let g=r.getAttribute(`_feature_id_${h.attribute}`).getX(l);g!==m&&(o[p]=g)}else{let g=l;g!==m&&(o[p]=g)}}let u=new Uint8Array(a*4);if(this._asyncRead)return Kn.readDataAsync(u).then(()=>(d(),o));return Kn.readData(u),d(),o;function d(){let p=new Uint32Array(1);for(let c=0,h=i.length;c<h;c++){let m=i[c],g="nullFeatureId"in m?m.nullFeatureId:null;if("texture"in m){let{channels:f}=m.texture,b=f.map(y=>u[4*c+y]);new Uint8Array(p.buffer).set(b);let w=p[0];w!==g&&(o[c]=w)}}}}dispose(){this.textures.forEach(e=>{e&&(e.dispose(),e.image instanceof ImageBitmap&&e.image.close())})}},Pc="EXT_mesh_features";function Qv(e,t,r){e.traverse(n=>{if(t.associations.has(n)){let{meshes:i,primitives:o}=t.associations.get(n),a=t.json.meshes[i]?.primitives[o];a&&a.extensions&&a.extensions[Pc]&&r(n,a.extensions[Pc])}})}var s0=class{constructor(e){this.parser=e,this.name=Pc}async afterRoot({scene:e,parser:t}){let r=t.json.extensionsUsed;if(!r||!r.includes(Pc))return;let n=t.json.textures?.length||0,i=Array(n).fill(null);Qv(e,t,(a,{featureIds:s})=>{s.forEach(l=>{if(l.texture&&i[l.texture.index]===null){let u=l.texture.index;i[u]=t.loadTexture(u)}})});let o=await Promise.all(i);Qv(e,t,(a,s)=>{a.userData.meshFeatures=new a0(a.geometry,o,s)})}},l0=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])}}},Qp=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 zE(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 l0),this.metadata&&(t.register(()=>new o0),t.register(()=>new s0)),this.plugins.forEach(r=>t.register(r)),e.manager.addHandler(this._gltfRegex,t),this.tiles=e,this._loader=t}dispose(){this.tiles.manager.removeHandler(this._gltfRegex),this.tiles.manager.removeHandler(this._dracoRegex),this.autoDispose&&(this.ktxLoader.dispose(),this.dracoLoader.dispose())}};var{clamp:Kz}=qp;var Qz=new Zv(new DE),rA=new _E(new Uint8Array([255,255,255,255]),1,1);rA.needsUpdate=!0;var nA=0,iA=1,oA=2,aA=3,sA=4,lA=5,cA=6,uA=7,dA=8,pA=9,hA=10,mA=11,Jz=Object.freeze({NONE:nA,SCREEN_ERROR:iA,GEOMETRIC_ERROR:oA,DISTANCE:aA,DEPTH:sA,RELATIVE_DEPTH:lA,IS_LEAF:cA,RANDOM_COLOR:uA,RANDOM_NODE_COLOR:dA,CUSTOM_COLOR:pA,LOAD_ORDER:hA,INDEXED_COLOR:mA});var Zz=Math.PI/4,eN=3/5;var Yn={NONE:0,NOT_READY:1,NO_FIT:2,DEPTH:3,OCCUPANCY:4,SPACING:5,ANGLE:6,FACING:7};var tN=new class{constructor(){this._cache={}}getColor(...e){let t=e.pop(),r=e.join("_"),{_cache:n}=this;return r in n||(t.setHSL(Math.random(),1,.5),n[r]=t.getHex()),t.set(n[r])}};var rN={[Yn.NONE]:16777215,[Yn.NOT_READY]:7829367,[Yn.NO_FIT]:2250239,[Yn.DEPTH]:4473924,[Yn.OCCUPANCY]:65535,[Yn.SPACING]:16776960,[Yn.ANGLE]:16711680,[Yn.FACING]:16711935};var nN=Math.PI/180;var iN=Bi*Math.PI*2;var oN=Bi*Math.PI*2;import{DRACOLoader as vA}from"three/examples/jsm/loaders/DRACOLoader.js";import{KTX2Loader as wA}from"three/examples/jsm/loaders/KTX2Loader.js";import{MeshoptDecoder as MA}from"three/examples/jsm/libs/meshopt_decoder.module.js";import{Box3 as SA,DoubleSide as CA,MathUtils as TA,Matrix4 as p0,Sphere as _A,Vector3 as PA}from"three";import{BufferAttribute as c0,MathUtils as fA}from"three";function u0(e){return!!e&&!e.isInterleavedBufferAttribute}function d0(e,t,r,n){for(let i=0;i<e.count;i+=1)for(let o=0;o<e.itemSize;o+=1)t.setComponent(i,o,fA.clamp(e.getComponent(i,o),r,n));return t}function gA(e){for(let t=0;t<e.count;t+=1)for(let r=0;r<e.itemSize;r+=1){let n=e.getComponent(t,r);if(!Number.isFinite(n)||n<0||n>1)return!1}return!0}var Ac=class{constructor(){this.name="RI_VERTEX_COMPRESSION_PLUGIN";this.priority=-99}processTileModel(t){t.traverse(r=>{let n=r.geometry;if(!n)return;let i=n.attributes.normal;u0(i)&&!(i.array instanceof Int16Array)&&(n.attributes.normal=d0(i,new c0(new Int16Array(i.count*i.itemSize),i.itemSize,!0),-1,1));for(let o of["uv","uv1","uv2","uv3"]){let a=n.attributes[o];!u0(a)||a.array instanceof Uint16Array||!gA(a)||(n.attributes[o]=d0(a,new c0(new Uint16Array(a.count*a.itemSize),a.itemSize,!0),0,1))}})}};import{jsx as m0,jsxs as LA}from"react/jsx-runtime";var EA=0,h0=4,AA=6,RA=12,kA=4;function DA(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 Zp({url:e,rotation:t=[0,0,0],errorTarget:r=64,cacheSize:n=800,memoryBudgetMB:i=800,decoderConfig:o,objectBindings:a,itemMaterials:s,sceneConfig:l,selectedItem:u,panelHoveredItem:d,highlightOnHover:p=!0,onItemClick:c,onItemHover:h,onItemDoubleClick:m,onItemContextMenu:g,onObjectCatalog:f,onTilesetBounds:b,onModelLoaded:w,onLoadError:y,nodeRefsOut:M,onNodeRefsChange:E,materialRefsOut:v,explodeFactor:P=0,suspendBindingTransforms:T=!1}){let{camera:_,gl:S,invalidate:C}=xA(),R=jt(null),[A,B]=Jp(null),N=jt({onItemClick:c,onItemHover:h,onItemDoubleClick:m,onObjectCatalog:f,onTilesetBounds:b,onModelLoaded:w,onLoadError:y,onNodeRefsChange:E});N.current={onItemClick:c,onItemHover:h,onItemDoubleClick:m,onObjectCatalog:f,onTilesetBounds:b,onModelLoaded:w,onLoadError:y,onNodeRefsChange:E};let D=jt(!0),[V,O]=Jp(null),k=jt(null);k.current=V;let W=jt([]),he=jt(!1);Jn(()=>{let $=new ic;return O($),()=>$.dispose()},[e]);let ae=jt(null),te=jt(0),ve=jt(!1),U=i*1024*1024,G=jt(!1),J=jt(mp),se=jt(null),Ee=jt(null),X=jt(null);Jn(()=>()=>{X.current!==null&&clearTimeout(X.current)},[]);let ie=o?.dracoDecoderPath??hg,Ce=o?.ktx2TranscoderPath??mg,Ge=o?.meshopt??!0,[Q,ot]=Jp(null);Jn(()=>{ve.current=!1,G.current=!1;let $=new Gp(e);$.loadAncestors=!0;let le=new uc;le.priorityCallback=$.downloadQueue.priorityCallback,le.maxJobsPerOrigin=RA;let de=new Wr;de.priorityCallback=$.parseQueue.priorityCallback,de.maxJobs=AA;let Te=new Wr;Te.priorityCallback=$.processNodeQueue.priorityCallback,Te.maxJobs=$.processNodeQueue.maxJobs;let Ye=new Xa;Ye.unloadPriorityCallback=$.lruCache.unloadPriorityCallback,$.downloadQueue=le,$.parseQueue=de,$.processNodeQueue=Te,$.lruCache=Ye;let Be=ie?new vA().setDecoderPath(ie).setWorkerLimit(kA):null,je=Ce?new wA().setTranscoderPath(Ce).detectSupport(S):null;return $.registerPlugin(new Qp({dracoLoader:Be,ktxLoader:je,meshoptDecoder:Ge?MA:null,autoDispose:!1})),$.registerPlugin(new $p({disableMipmaps:!1,compressIndex:!0,compressNormals:!1,compressUvs:!1,compressPosition:!0})),$.registerPlugin(new Ac),ot($),window.__riTiles=$,()=>{$.forEachLoadedModel(pe=>da(pe)),$.dispose(),Be?.dispose(),je?.dispose(),ot(pe=>pe===$?null:pe)}},[ie,S,Ce,Ge,e]),Jn(()=>{Q&&(J.current=mp,se.current=null,Q.errorTarget=r,Q.lruCache.maxSize=n,Q.lruCache.minSize=Math.max(1,Math.floor(n*.75)),Q.lruCache.maxBytesSize=U,Q.lruCache.minBytesSize=U*.75,C())},[n,r,C,U,Q]);let rt=bA(()=>{let $=a??{};return{objectBindings:$,keyByModelObject:Vx($),itemMaterials:s,shadingMode:l?.model.shading??"lit",rendererMode:l?.model.renderer??"pbr",selectedKey:u??null,hoveredKey:Fx(A,d),highlightOnHover:p,suspendTransforms:T,placementFrame:Q?.group.matrixWorld,invalidate:C}},[A,p,C,s,a,d,l,u,T,Q]),Ve=Qn(()=>{if(!Q)return;let $=st.current,le=he.current?k.current?.nodesByBinding($)??{}:{},de={};Q.group.traverse(je=>{if(!je.isMesh)return;let pe=pp(je);if(!pe)return;let _e=$.keyByModelObject[pe]??pe;if(!$.objectBindings[_e])return;le[_e]||(le[_e]=je);let Ae=je.material;Ae&&(de[_e]=Ae)});let Te=M?.current??{},Ye=Object.keys(Te),Be=Ye.length!==Object.keys(le).length||Ye.some(je=>Te[je]!==le[je]);M&&(M.current=le),v&&(v.current=de),(Be||!M)&&N.current.onNodeRefsChange?.()},[v,M,Q]),ee=Qn($=>rc($,rt),[rt]),we=Qn($=>Gx($,rt),[rt]),at=jt(we);at.current=we;let st=jt(rt);st.current=rt;let ft=Qn(()=>{let $=ae.current,le=te.current;return!$||le<=0?st.current:{...st.current,explode:{factor:le,centre:$.centre,radius:$.radius}}},[]);Jn(()=>{Q&&(we(Q.group),D.current=!0,Q.forEachLoadedModel($=>{we($),Po($,ft())}),C())},[we,C,ft,Q]),Jn(()=>{let $=DA(e);if(!$)return;let le=!1;return fetch($).then(de=>de.ok?de.json():null).then(de=>{le||!de?.objects||(W.current=de.objects,he.current=de.bindingFrame==="gltf-identity-v2",he.current&&k.current?.setCatalog(de.objects),D.current=!0,N.current.onObjectCatalog?.(de.objects),C())}).catch(()=>{}),()=>{le=!0}},[e,C,V]),Jn(()=>{if(!Q)return;let $=!1,le=()=>C(),de=pe=>{pe.scene&&(pe.scene.traverse(_e=>{let Ae=_e.material;for(let Ct of Array.isArray(Ae)?Ae:Ae?[Ae]:[])Ct.transparent&&Ct.side===CA&&(Ct.forceSinglePass=!0)}),at.current(pe.scene),Po(pe.scene,ft()),Js(pe.scene)),D.current=!0,$||($=!0,N.current.onModelLoaded?.(Q.group)),C()},Te=pe=>{N.current.onLoadError?.(pe.error)},Ye=pe=>{pe.scene&&(hp(pe.scene),da(pe.scene)),D.current=!0};Q.setCamera(_),Q.setResolutionFromRenderer(_,S),Q.addEventListener("needs-update",le),Q.addEventListener("load-model",de),Q.addEventListener("load-error",Te),Q.addEventListener("dispose-model",Ye);let Be=()=>{D.current=!0,C()};Q.addEventListener("tile-visibility-change",Be);let je=()=>{let pe=Q.root;pe&&!pe.content?.uri&&pe.refine==="REPLACE"&&(pe.refine="ADD",C())};return Q.addEventListener("load-root-tileset",je),C(),()=>{Q.removeEventListener("needs-update",le),Q.removeEventListener("load-model",de),Q.removeEventListener("load-error",Te),Q.removeEventListener("dispose-model",Ye),Q.removeEventListener("tile-visibility-change",Be),Q.removeEventListener("load-root-tileset",je),hp(Q.group),Q.deleteCamera(_),M&&(M.current={}),v&&(v.current={})}},[_,S,C,v,M,ft,Q]);let ne=ml($=>ee($)?.binding??null,g),ue=Qn($=>{if(ne.consumeClick())return;let le=ee($.object);le&&($.stopPropagation(),N.current.onItemClick?.(le.binding))},[ee,ne,c]),Se=Qn($=>{let le=ee($.object);if(!le)return;N.current.onItemDoubleClick?.(le.binding,ho($))&&$.stopPropagation()},[ee]),Ie=Qn($=>{let le=ee($.object),de=le?.key??null;de!==R.current&&(R.current=de,B(de),N.current.onItemHover?.(le?.binding??null))},[ee]),He=Qn(()=>{R.current!==null&&(R.current=null,B(null),N.current.onItemHover?.(null))},[]);return Jn(()=>{C()},[C,Q]),yA(($,le)=>{if(!Q)return;if(Q.setResolutionFromRenderer(_,S),he.current&&V){let it=V.sync(ft(),u,T);V.updateBounds(Q.root),T&&Q.forEachLoadedModel(tr=>Po(tr,it))}if(Q.update(),!ve.current){let it=new SA;if(Q.getBoundingBox(it)){ve.current=!0,Q.group.updateMatrixWorld(),it.applyMatrix4(Q.group.matrixWorld);let tr=it.getBoundingSphere(new _A);ae.current={centre:tr.center.clone(),radius:it.getSize(new PA).length()*.5},N.current.onTilesetBounds?.(it),C()}}D.current&&(D.current=!1,Ve());let de=Math.min(Math.max(P,0),1),Te=te.current;Math.abs(Te-de)>1e-4?(te.current=TA.lerp(Te,de,1-Math.exp(-6*le)),Po(Q.group,ft()),C()):Te!==de&&(te.current=de,Po(Q.group,ft()),C());let Ye=Q,Be=Q.lruCache,je=Be.isFull(),pe=J.current,_e=pe.loosened&&se.current?se.current:{bytes:Be.maxBytesSize,items:Be.maxSize},Ae=0;for(let it of Be.usedSet??[])Ae+=Be.bytesMap?.get(it)??0;let Ct=!1,gr=Q;for(let it of gr.usedSet??[]){let tr=it.internal?.loadingState??h0;if(it.traversal?.used&&it.internal?.hasContent&&tr>=EA&&tr<h0){Ct=!0;break}}let nt=Ee.current??(Ee.current={world:new p0,projection:new p0}),dt=!nt.world.equals(_.matrixWorld)||!nt.projection.equals(_.projectionMatrix);dt&&(nt.world.copy(_.matrixWorld),nt.projection.copy(_.projectionMatrix));let qt={full:je,wanting:Ct,moved:dt,usage:Math.max(Ae/Math.max(1,_e.bytes),(Be.usedSet?.size??0)/Math.max(1,_e.items)),now:performance.now()},er=tv(pe,qt);er!==pe&&(er.loosened&&(!pe.loosened||er.raisedAt!==pe.raisedAt)?(pe.loosened||(se.current=_e),Be.maxBytesSize=Math.max(_e.bytes,Be.cachedBytes??0)*fp,Be.maxSize=Math.ceil(Math.max(_e.items,Be.itemSet?.size??0)*fp)):!er.loosened&&pe.loosened&&se.current&&(Be.maxBytesSize=se.current.bytes,Be.maxSize=se.current.items,se.current=null),J.current=er,Q.errorTarget=r*er.factor,C()),!G.current&&je&&qt.wanting&&er.factor>=Ua&&(G.current=!0,console.warn("[react-immersive] The tile memory budget is full even at the coarsest level of detail, so the model may render incompletely. This usually means the model's textures are too large for streaming \u2014 re-process it with a smaller MAX_TEXTURE_SIZE, or raise memoryBudgetMB."));let Rr=rv(er,qt);Rr===0?C():Rr!==null&&X.current===null&&(X.current=setTimeout(()=>{X.current=null,C()},Rr)),((Ye.stats?.downloading??0)>0||(Ye.stats?.parsing??0)>0||Ye.loadProgress!==void 0&&Ye.loadProgress<1&&!je)&&C()}),Q?LA("group",{rotation:t,children:[V?m0("primitive",{object:V.group}):null,m0("primitive",{object:Q.group,onClick:ue,onDoubleClick:Se,onPointerDown:g?ne.onPointerDown:void 0,onPointerMove:Ie,onPointerOut:He})]}):null}import{Matrix4 as eh}from"three";var OA=new eh().makeRotationX(Math.PI/2);function f0(e){e.updateMatrixWorld(!0);let t=new eh().copy(e.matrixWorld).invert().premultiply(OA),r=new eh,n=[];for(let[i,o]of Object.entries(ao(e).nodesById)){let a=o;if(!a.isMesh||!a.geometry||!o.name)continue;let s=a.geometry;s.boundingBox||s.computeBoundingBox();let l=s.boundingBox.clone().applyMatrix4(r.multiplyMatrices(t,o.matrixWorld)),u=s.index?s.index.count:s.getAttribute("position")?.count??0;n.push({name:i,triangles:Math.floor(u/3),minimum:l.min.toArray(),maximum:l.max.toArray()})}return n.sort((i,o)=>i.name.localeCompare(o.name))}import{useMemo as Zn,useRef as qr,useState as Ni,useEffect as xn,useCallback as Lo}from"react";import{Html as g0}from"@react-three/drei";import{useFrame as b0,useThree as rh}from"@react-three/fiber";import{MathUtils as th,Vector3 as Oo}from"three";import{jsx as Jt,jsxs as nh}from"react/jsx-runtime";var IA=.02;function y0(e,t,r=!1){let n=qr(null),[i,o]=Ni(!0),a=qr(!0),s=Zn(()=>new Oo,[]),l=rh(m=>m.scene),u=qr(null),d=Zn(()=>new Oo(...e.anchorLocalPosition??e.localPosition??e.worldPosition),[e.anchorLocalPosition,e.localPosition,e.worldPosition]),p=Zn(()=>new Oo,[]),c=Zn(()=>new Oo,[]),h=Zn(()=>new Oo,[]);return xn(()=>{u.current=null},[e.anchorNodeName]),b0(({camera:m})=>{let g=n.current,f=g?.parent;if(!g||!f)return;let b=u.current;if(e.anchorNodeName&&(!b||!b.parent)&&(b=Nn(l,e.anchorNodeName),u.current=b),b?(b.updateWorldMatrix(!0,!1),p.copy(d).applyMatrix4(b.matrixWorld)):(p.copy(d),f.localToWorld(p)),t){let y=t.current.get(e.id);y||(y=new Oo,t.current.set(e.id,y)),y.copy(p)}m.getWorldPosition(s);let w=!r||Bg(e,s.distanceTo(p));w!==a.current&&(a.current=w,o(w)),h.copy(s).sub(p),h.lengthSq()>0?(h.normalize(),c.copy(p).addScaledVector(h,IA)):c.copy(p),f.worldToLocal(c),g.position.copy(c)}),{anchorRef:n,inRange:i}}function BA({annotation:e,occluders:t,worldPositionsRef:r,onClick:n,onHover:i,showAnnotationOnHover:o}){let a=me(),[s,l]=Ni(!1),{anchorRef:u,inRange:d}=y0(e,r,!0),p=s||!d,[c,h]=Ni(!1),[m,g]=Ni(1),f=qr(null),b=qr(null),w=qr(null);xn(()=>{d||(f.current&&clearTimeout(f.current),c&&(h(!1),i?.(null)))},[d,c,i]),xn(()=>()=>{f.current&&(clearTimeout(f.current),f.current=null),w.current&&(clearTimeout(w.current),w.current=null)},[]);let y=T=>{T.stopPropagation(),T.preventDefault(),f.current&&(clearTimeout(f.current),f.current=null),f.current=window.setTimeout(()=>{n?.(e),f.current=null},10)},M=T=>{T.stopPropagation(),h(!0),g(100),w.current&&(clearTimeout(w.current),w.current=null),i?.(e)},E=T=>{T.stopPropagation(),h(!1),g(1),w.current&&clearTimeout(w.current),w.current=window.setTimeout(()=>{i?.(null),o&&i?.(null),w.current=null},50)},v=T=>{T.stopPropagation();let _=T.currentTarget;_.dataset.pointerX=String(T.clientX),_.dataset.pointerY=String(T.clientY)},P=T=>{T.stopPropagation();let _=T.currentTarget,S=parseFloat(_.dataset.pointerX||"0"),C=parseFloat(_.dataset.pointerY||"0"),R=T.clientX-S,A=T.clientY-C;Math.sqrt(R*R+A*A)<10&&y(T)};return Jt("group",{ref:u,children:Jt(g0,{center:!0,occlude:t,onOcclude:l,pointerEvents:p?"none":"auto",zIndexRange:[1,200],style:{pointerEvents:p?"none":"auto",zIndex:m},className:"annotation-html-wrapper",transparent:!0,children:Jt("div",{ref:b,className:`ri-annotationMarker ${c?"ri-annotationMarker--hovered":""}`,title:e.title,style:{display:p?"none":"flex"},onPointerDown:v,onPointerUp:P,onPointerEnter:M,onPointerLeave:E,onDoubleClick:T=>{T.stopPropagation(),n?.(e)},role:"button",tabIndex:0,"aria-label":a("annotationMarker",{id:e.id,title:e.title}),onKeyDown:T=>{(T.key==="Enter"||T.key===" ")&&(T.preventDefault(),T.stopPropagation(),n?.(e))},children:Jt("span",{className:"ri-annotationMarker-id",children:e.id})})})})}function jA({annotation:e,occluders:t,popupRef:r,onClose:n,hideCloseButton:i=!1}){let o=me(),[a,s]=Ni(!1),{anchorRef:l}=y0(e),u=nh("div",{ref:r,className:"ri-viewAnnotationPopup",style:{display:a?"none":"block"},onPointerDown:d=>d.stopPropagation(),onClick:d=>d.stopPropagation(),children:[nh("div",{className:"ri-viewAnnotationHeader",children:[Jt("h4",{className:"ri-viewAnnotationTitle",children:e.title}),!i&&Jt("button",{onClick:d=>{d.stopPropagation(),n?.()},className:"ri-viewAnnotationClose","aria-label":o("closeAnnotation"),children:"\xD7"})]}),e.category&&Jt("span",{className:"ri-annotationCategory",children:e.category}),e.description&&Jt("p",{className:"ri-viewAnnotationDescription",children:e.description}),e.images?.map((d,p)=>{let c=dd(d.src);return c?Jt("img",{className:"ri-annotationImage",src:c,alt:d.alt??"",loading:"lazy"},`${c}-${p}`):null}),e.links?.map((d,p)=>{let c=dd(d.href);return c?Jt("a",{className:"ri-annotationLink",href:c,target:"_blank",rel:"noopener noreferrer",children:d.label||o("learnMore")},`${c}-${p}`):null})]});return Jt("group",{ref:l,children:Jt(g0,{occlude:t,onOcclude:s,pointerEvents:a?"none":"auto",zIndexRange:[1e3,2e3],style:{pointerEvents:a?"none":"auto",zIndex:1e3},transparent:!0,children:u})})}function Rc({annotations:e,sceneConfig:t,activeAnnotation:r,popupRef:n,canvasRootRef:i,worldPositionsRef:o,modelLoaded:a,onAnnotationClick:s,onAnnotationHover:l,onCloseAnnotation:u,hideCloseButton:d=!1,showAnnotationOnHover:p=!1}){let c=rh(D=>D.invalidate),h=rh(D=>D.scene),[m,g]=Ni(null),[f,b]=Ni(!1),w=qr(null);xn(()=>{w.current!==null&&r===null&&(g(null),b(!1)),w.current=r?.id??null},[r]);let y=qr(null),M=qr(null),E=qr(null),v=Zn(()=>{let D=[];return h.traverse(V=>{let O=V;O.isMesh&&!O.isSkinnedMesh&&D.push({current:V})}),D},[h,e,a]),P=Lo(()=>{c();let D=()=>{c(),M.current=window.requestAnimationFrame(()=>{c(),M.current=null})};M.current=window.requestAnimationFrame(D)},[c]);xn(()=>{P()},[e,P]),xn(()=>{P()},[r,P]),xn(()=>()=>{M.current!==null&&window.cancelAnimationFrame(M.current),E.current&&clearTimeout(E.current)},[]);let T=r||m,_=Zn(()=>T?e.find(D=>D.id===T.id)??null:null,[T,e]),S=Lo(D=>{if(f&&m?.id===D.id){b(!1),g(null),u?.();return}b(!0),g(D),s?.(D)},[f,m,s,u]),C=Lo(D=>{l?.(D),p&&!f&&(E.current&&(clearTimeout(E.current),E.current=null),D?g(D):E.current=window.setTimeout(()=>{g(null),u?.(),E.current=null},100))},[f,l,p,u]),R=Lo(()=>{b(!1),g(null),u?.()},[u]),A=Lo(D=>{let V=D.target;if(V.closest?.(".ri-annotationMarker")||V.closest?.(".ri-viewAnnotationPopup")||V.closest?.(".annotation-html-wrapper"))return;let O=i.current;O&&O.contains(V)&&(b(!1),g(null),u?.())},[i,u]),B=Lo(D=>{D.key==="Escape"&&f&&(b(!1),g(null),u?.())},[f,u]);xn(()=>{let D=i.current;return D&&(D.addEventListener("click",A),D.addEventListener("pointerdown",A)),document.addEventListener("keydown",B),()=>{D&&(D.removeEventListener("click",A),D.removeEventListener("pointerdown",A)),document.removeEventListener("keydown",B)}},[i,A,B]);let N=Zn(()=>(t?.model.rotation??[0,0,0]).map(D=>D*Math.PI/180),[t?.model.rotation]);return xn(()=>{c()},[c,N]),b0((D,V)=>{if(!y.current)return;y.current.rotation.x=th.lerp(y.current.rotation.x,N[0],1-Math.exp(-5*V)),y.current.rotation.y=th.lerp(y.current.rotation.y,N[1],1-Math.exp(-5*V)),y.current.rotation.z=th.lerp(y.current.rotation.z,N[2],1-Math.exp(-5*V));let{rotation:O}=y.current;Math.abs(O.x-N[0])+Math.abs(O.y-N[1])+Math.abs(O.z-N[2])>1e-4&&c()}),nh("group",{ref:y,children:[e.map(D=>{let V=`${D.worldPosition.join(",")}-${D.title}-${D.id}`;return Jt(BA,{annotation:D,occluders:v,worldPositionsRef:o,onClick:S,onHover:C,showAnnotationOnHover:p},V)}),_?Jt(jA,{annotation:_,occluders:v,popupRef:n,onClose:R,hideCloseButton:d},`popup-${_.id}`):null]})}import{useEffect as M0,useMemo as cs}from"react";import{Html as oh}from"@react-three/drei";import{useEffect as zA,useMemo as NA}from"react";import{Line as VA}from"@react-three/drei";import{useThree as FA}from"@react-three/fiber";import{BufferGeometry as UA,Line as GA,LineBasicMaterial as HA,LineDashedMaterial as WA,Vector3 as x0}from"three";import{jsx as ih}from"react/jsx-runtime";function ei(e){return FA(r=>no(r.gl))?ih(XA,{...e}):ih(VA,{points:e.points,color:e.color,lineWidth:e.lineWidth,dashed:e.dashed})}function XA({points:e,color:t,dashed:r=!1}){let n=NA(()=>{let i=new UA().setFromPoints(e.map(s=>s instanceof x0?s:new x0(...s))),o=r?new WA({color:t,dashSize:.02,gapSize:.02}):new HA({color:t}),a=new GA(i,o);return r&&a.computeLineDistances(),a},[e,t,r]);return zA(()=>()=>{n.geometry.dispose(),n.material.dispose()},[n]),ih("primitive",{object:n})}import{BoxGeometry as qA,BufferGeometry as $A,DoubleSide as YA,EdgesGeometry as KA,Float32BufferAttribute as QA,Vector3 as vn}from"three";import{Fragment as ls,jsx as $e,jsxs as ir}from"react/jsx-runtime";var ti="#22d3ee",JA="#facc15";function Vi(e,t){let r=e<10?e.toFixed(3):e.toFixed(2);return t?`${r} ${t}`:r}function v0(e,t){return[(e[0]+t[0])/2,(e[1]+t[1])/2,(e[2]+t[2])/2]}function ZA(e){let t=e.reduce((r,n)=>[r[0]+n[0],r[1]+n[1],r[2]+n[2]],[0,0,0]);return[t[0]/e.length,t[1]/e.length,t[2]/e.length]}function wn({position:e,children:t}){return $e(oh,{center:!0,position:e,zIndexRange:[20,0],style:{pointerEvents:"none"},children:$e("div",{className:"ri-measureLabel",children:t})})}function w0({positions:e,triangles:t}){let r=cs(()=>{let n=new vn(...e[0]),i=new $A;return i.setAttribute("position",new QA(e.flatMap(o=>new vn(...o).sub(n).toArray()),3)),i.setIndex(t.flat()),i},[e,t]);return M0(()=>()=>r.dispose(),[r]),$e("mesh",{position:e[0],geometry:r,raycast:()=>{},renderOrder:100,children:$e("meshBasicMaterial",{color:ti,side:YA,transparent:!0,opacity:.18,depthWrite:!1})})}var eR=[[0,1,2]];function tR({positions:e}){let t=kl(e);if(t===null)return null;let r=new vn(...e[1]),n=new vn(...e[0]).sub(r),i=new vn(...e[2]).sub(r),o=Math.min(n.length(),i.length())*.22;n.normalize(),i.normalize();let a=n.clone().cross(i);a.lengthSq()<1e-12&&a.copy(n).cross(Math.abs(n.y)<.9?new vn(0,1,0):new vn(1,0,0)),a.normalize();let s=t*Math.PI/180,l=Array.from({length:33},(d,p)=>n.clone().applyAxisAngle(a,s*p/32).multiplyScalar(o).add(r).toArray()),u=n.clone().applyAxisAngle(a,s/2).multiplyScalar(o*1.4).add(r).toArray();return ir(ls,{children:[$e(ei,{points:l,color:ti,lineWidth:2}),ir(wn,{position:u,children:[t.toFixed(2),"\xB0"]})]})}function rR({box:e,unit:t}){let r=cs(()=>[(e.min[0]+e.max[0])/2,(e.min[1]+e.max[1])/2,(e.min[2]+e.max[2])/2],[e.min,e.max]),n=cs(()=>{let[s,l,u]=e.size,d=new qA(s||1e-4,l||1e-4,u||1e-4),p=new KA(d);return d.dispose(),p},[e.size]);M0(()=>()=>{n.dispose()},[n]);let[i,o,a]=e.size;return ir("group",{position:r,children:[$e("lineSegments",{geometry:n,children:$e("lineBasicMaterial",{color:JA})}),ir(wn,{position:[0,-o/2,a/2],children:["W ",Vi(i,t)]}),ir(wn,{position:[-i/2,0,a/2],children:["H ",Vi(o,t)]}),ir(wn,{position:[i/2,-o/2,0],children:["D ",Vi(a,t)]})]})}function kc({points:e,unit:t,box:r,showDimensions:n,tool:i="distance",areaClosed:o=!1,snapPreview:a}){let s=cs(()=>e.map(d=>d.position),[e]),l=cs(()=>i==="area"&&o?Dl(s):null,[i,o,s]),u=i==="pointToPlane"&&e.length===2?vy(e[0],e[1].position):null;return ir("group",{children:[i!=="wrap"&&i!=="wrapHorizontal"&&e.map(d=>$e(oh,{center:!0,position:d.position,zIndexRange:[15,0],style:{pointerEvents:"none"},children:$e("div",{className:`ri-measureDot${d.snapped?" ri-measureDot--snapped":""}`})},d.id)),i==="distance"&&e.slice(1).map((d,p)=>{let c=e[p].position,h=d.position,m=new vn(...c).distanceTo(new vn(...h));return ir("group",{children:[$e(ei,{points:[c,h],color:ti,lineWidth:2}),$e(wn,{position:v0(c,h),children:Vi(m,t)})]},`${e[p].id}-${d.id}`)}),(i==="angle"||i==="area")&&s.length>=2&&$e(ei,{points:o?[...s,s[0]]:s,color:ti,lineWidth:2}),i==="angle"&&$e(tR,{positions:s}),l&&!("error"in l)&&ir(ls,{children:[$e(w0,{positions:s,triangles:l.triangles}),$e(wn,{position:l.center,children:Vi(l.area,t?`${t}\xB2`:"")})]}),i==="pointToPlane"&&e[0]?.faceVertices&&ir(ls,{children:[$e(w0,{positions:e[0].faceVertices,triangles:eR}),$e(ei,{points:[...e[0].faceVertices,e[0].faceVertices[0]],color:ti,lineWidth:1}),e.length===1&&$e(wn,{position:e[0].position,children:"Reference plane"})]}),u&&ir(ls,{children:[$e(ei,{points:[e[1].position,u.projection],color:ti,lineWidth:2}),$e(ei,{points:[e[0].position,u.projection],color:ti,lineWidth:1,dashed:!0}),$e(wn,{position:v0(e[1].position,u.projection),children:Vi(u.distance,t)})]}),(i==="wrap"||i==="wrapHorizontal")&&s.length>=3&&ir(ls,{children:[$e(ei,{points:[...s,s[0]],color:ti,lineWidth:2}),$e(wn,{position:ZA(s),children:Vi(Gd(s,!0),t)})]}),a&&ir(oh,{center:!0,position:a.position,zIndexRange:[20,0],style:{pointerEvents:"none"},children:[$e("div",{className:"ri-measureSnapTarget"}),$e("div",{className:"ri-measureSnapLabel",children:a.snapped==="vertex"?"Vertex":"Edge"})]}),n&&r?$e(rR,{box:r,unit:t}):null]})}import{Eraser as nR,PencilRuler as iR,RulerDimensionLine as oR,Undo2 as aR}from"lucide-react";import{useLayoutEffect as sR,useRef as lR}from"react";import{Fragment as S0,jsx as vt,jsxs as Io}from"react/jsx-runtime";function ah(e){let t=me(),r=lR(null);sR(()=>{if(!r.current)return;let s=()=>e.onHeight(r.current?.getBoundingClientRect().height??34),l=new ResizeObserver(s);return l.observe(r.current),s(),()=>l.disconnect()},[e.onHeight]);let{tool:n,pointCount:i,areaClosed:o}=e,a=n==="angle"?[t("angleFirstArmHint"),t("angleVertexHint"),t("angleSecondArmHint"),t("angleNewHint")][i]:n==="area"?t(o?"areaNewHint":"areaCornersHint"):n==="pointToPlane"?[t("pointToPlaneFaceHint"),t("pointToPlanePointHint"),t("pointToPlaneNewHint")][i]:t(n==="wrap"?"wrapHint":n==="wrapHorizontal"?"wrapHorizontalHint":"distanceHint");return Io("div",{ref:r,className:"ri-measureTools",style:{top:e.top},children:[Io("div",{className:"ri-measureToolbarRow",children:[vt("button",{type:"button",className:`ri-measureButton ${e.active?"ri-measureButton--active":""}`,disabled:e.disabled,onClick:e.onToggle,title:e.active?t("stopMeasuring"):t("startMeasuring"),"aria-pressed":e.active,children:vt(iR,{size:16})}),vt("button",{type:"button",className:`ri-measureButton ${e.showDimensions?"ri-measureButton--active":""}`,disabled:e.disabled,onClick:e.onDimensions,title:t("toggleBoundingDimensions"),"aria-pressed":e.showDimensions,children:vt(oR,{size:16})}),e.active&&Io(S0,{children:[Io("select",{className:"ri-measureSelect","aria-label":t("measurementTool"),value:n,disabled:e.disabled,onChange:s=>e.onTool(s.target.value),children:[vt("option",{value:"distance",children:t("distance")}),vt("option",{value:"angle",children:t("angle")}),vt("option",{value:"area",children:t("area")}),vt("option",{value:"pointToPlane",children:t("pointToPlane")}),vt("option",{value:"wrap",children:t("wrap")}),vt("option",{value:"wrapHorizontal",children:t("wrapHorizontal")})]}),Io("select",{className:"ri-measureSelect","aria-label":t("measurementSnapping"),value:e.snap,disabled:e.disabled,onChange:s=>e.onSnap(s.target.value),children:[vt("option",{value:"none",children:t("noSnapping")}),vt("option",{value:"auto",children:t("snapAuto")}),vt("option",{value:"vertex",children:t("snapVertex")}),vt("option",{value:"edge",children:t("snapEdge")})]})]}),i>0&&Io(S0,{children:[vt("button",{type:"button",className:"ri-measureButton",onClick:e.onUndo,disabled:e.disabled,title:t("undoMeasurementPoint"),children:vt(aR,{size:16})}),vt("button",{type:"button",className:"ri-measureButton",onClick:e.onClear,disabled:e.disabled,title:t("clearMeasurements"),children:vt(nR,{size:16})})]}),e.active&&n==="area"&&!o&&vt("button",{type:"button",className:"ri-measureFinish",onClick:e.onFinishArea,disabled:e.disabled||i<3,children:t("finishArea")})]}),e.active&&vt("div",{className:`ri-measureHint${e.error?" ri-measureHint--error":""}`,role:"status",children:e.error?t.message(e.error):a})]})}import{forwardRef as cR,useCallback as us,useEffect as C0,useImperativeHandle as uR,useMemo as T0,useRef as zt}from"react";import{useXR as _0,useXRHitTest as dR,useXRInputSourceEvent as pR}from"@react-three/xr";import{useFrame as hR}from"@react-three/fiber";import{Matrix4 as mR,Vector3 as P0}from"three";import{Fragment as vR,jsx as ds,jsxs as k0}from"react/jsx-runtime";var fR=1,E0=1,gR=.1,bR=10;function yR(e,t){let[r,n,i]=e.size,o=(e.min[0]+e.max[0])/2,a=(e.min[2]+e.max[2])/2,s=Math.max(r,n,i)||1;return{scale:t==="real-world"?1:fR/s,offset:[-o,-e.min[1],-a]}}function A0(e){let t=e[0].clientX-e[1].clientX,r=e[0].clientY-e[1].clientY;return Math.hypot(t,r)}function R0(e){let t=e[0].clientX-e[1].clientX,r=e[0].clientY-e[1].clientY;return Math.atan2(r,t)}var xR=cR(function({box:t,scaleMode:r,children:n,onARStateChange:i},o){let a=zt(null),s=zt(null),l=zt(null),u=_0(D=>D.session!=null),d=_0(D=>D.mode==="immersive-ar"),p=T0(()=>t?yR(t,r):null,[t,r]),c=zt(new P0(0,0,-E0)),h=zt(1),m=zt(0),g=zt(!0),f=zt(!1),b=T0(()=>new mR,[]),w=zt(new P0),y=zt(!1),M=zt(null),E=zt(!1),v=zt(0),P=zt(0),T=zt(1),_=zt(0),S=us(()=>{if(!i||!d)return;let D={canPlace:y.current,isPlacementMode:g.current,isModelPlaced:f.current},V=M.current;V&&V.canPlace===D.canPlace&&V.isPlacementMode===D.isPlacementMode&&V.isModelPlaced===D.isModelPlaced||(M.current=D,i(D))},[d,i]),C=us(()=>!d||!y.current?!1:(c.current.copy(w.current),f.current=!0,g.current=!1,S(),!0),[S,d]),R=us(()=>{d&&(g.current=!0,S())},[S,d]),A=us(()=>{let D=C();return!D&&d&&(g.current=!1,S()),D},[S,d,C]),B=us(()=>{d&&(g.current=!1,S())},[S,d]);uR(o,()=>({placeCurrent:C,startPlacementMode:R,finishPlacementMode:A,cancelPlacementMode:B}),[B,A,C,R]),C0(()=>{if(!u){c.current.set(0,0,-E0),h.current=1,m.current=0,y.current=!1,E.current=!1,g.current=!0,f.current=!1,M.current=null;return}d&&(y.current=!1,E.current=!1,g.current=!0,f.current=!1,M.current=null,S())},[S,u,d]),dR((D,V)=>{if(!d||D.length===0){y.current&&(y.current=!1,S());return}V(b,D[0])&&(w.current.setFromMatrixPosition(b),y.current||(y.current=!0,S()))},"viewer"),pR("all","select",()=>{!d||E.current||!g.current||C()},[d,C]),C0(()=>{if(!d)return;let D=k=>{k.touches.length===2&&(E.current=!0,v.current=A0(k.touches),P.current=R0(k.touches),T.current=h.current,_.current=m.current)},V=k=>{if(!E.current||k.touches.length!==2)return;k.preventDefault();let W=A0(k.touches);if(v.current>0){let ae=W/v.current;h.current=Math.min(bR,Math.max(gR,T.current*ae))}let he=R0(k.touches);m.current=_.current-(he-P.current)},O=k=>{k.touches.length===0&&requestAnimationFrame(()=>{E.current=!1})};return window.addEventListener("touchstart",D),window.addEventListener("touchmove",V,{passive:!1}),window.addEventListener("touchend",O),window.addEventListener("touchcancel",O),()=>{window.removeEventListener("touchstart",D),window.removeEventListener("touchmove",V),window.removeEventListener("touchend",O),window.removeEventListener("touchcancel",O)}},[d]),hR(()=>{let D=a.current,V=s.current;if(!D||!V)return;!u||!p?(D.visible=!0,D.position.set(0,0,0),D.rotation.set(0,0,0),V.scale.setScalar(1)):(D.visible=!d||f.current,D.position.copy(c.current),D.rotation.set(0,m.current,0),V.scale.setScalar(p.scale*h.current));let O=l.current;if(O){let k=d&&g.current&&y.current;O.visible=k,k&&O.position.copy(w.current)}});let N=u&&p?p.offset:[0,0,0];return k0(vR,{children:[k0("mesh",{ref:l,visible:!1,rotation:[-Math.PI/2,0,0],children:[ds("ringGeometry",{args:[.05,.07,32]}),ds("meshBasicMaterial",{color:"#22d3ee",transparent:!0,opacity:.95})]}),ds("group",{ref:a,children:ds("group",{ref:s,children:ds("group",{position:N,children:n})})})]})}),D0=xR;import{useRef as Fi,useState as wR,useCallback as $r,useEffect as MR}from"react";import{jsx as or,jsxs as sh}from"react/jsx-runtime";var SR={up:{width:38,height:22},down:{width:38,height:22},left:{width:22,height:38},right:{width:22,height:38}},CR={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"},Dc=({direction:e})=>{let t=SR[e],r=CR[e];return sh("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:[or("polyline",{points:r,stroke:"rgba(0, 0, 0, 0.9)",strokeWidth:"6",strokeLinecap:"round",strokeLinejoin:"round"}),or("polyline",{points:r,stroke:"#2095F2",strokeWidth:"4",strokeLinecap:"round",strokeLinejoin:"round"})]})},Mn=16,TR={"bottom-left":{bottom:Mn,left:Mn,top:"auto",right:"auto",transform:"none"},"bottom-right":{bottom:Mn,right:Mn,top:"auto",left:"auto",transform:"none"},"top-left":{top:Mn,left:Mn,bottom:"auto",right:"auto",transform:"none"},"top-right":{top:Mn,right:Mn,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:Mn,left:"50%",bottom:"auto",right:"auto",transform:"translateX(-50%)"}},_R=({controlsRef:e,enabled:t=!0,opacity:r=.9,moveSensitivity:n=.001,rotateSensitivity:i=.01,position:o="center-bottom"})=>{let a=me(),s=Fi(null),[l,u]=wR({x:0,y:0}),d=Fi(!1),p=Fi({x:0,y:0}),c=Fi(void 0),h=Fi(void 0),m=Fi(null),g=Fi(0),f=()=>e.current,b=(B,N,D)=>{let V=Math.hypot(B,N);if(V>D){let O=D/V;return{x:B*O,y:N*O}}return{x:B,y:N}},w=B=>{let D=Math.abs(B);return D<.12?0:Math.sign(B)*((D-.12)/(1-.12))},y=$r(()=>{let B=()=>{let{x:N,y:D}=p.current,V=w(N),O=w(D);if(t&&(V!==0||O!==0)){let k=f();k&&k.rotate(-V*i,-O*i,!0)}c.current=requestAnimationFrame(B)};c.current=requestAnimationFrame(B)},[t,i]),M=$r(()=>{c.current&&cancelAnimationFrame(c.current)},[]),E=$r((B,N)=>{if(!s.current||!d.current)return;let D=s.current.getBoundingClientRect(),V=D.left+D.width/2,O=D.top+D.height/2,k=D.width/2-18,W=B-V,he=N-O,ae=b(W,he,k);u(ae),p.current={x:ae.x/k,y:ae.y/k}},[]),v=$r(B=>{if(!t)return;B.preventDefault(),B.stopPropagation(),d.current=!0,y();let N="touches"in B?B.touches[0]:B;E(N.clientX,N.clientY)},[t,y,E]),P=$r(B=>{if(!d.current)return;B.preventDefault();let N="touches"in B?B.touches[0]:B;E(N.clientX,N.clientY)},[E]),T=$r(()=>{d.current=!1,u({x:0,y:0}),p.current={x:0,y:0},M()},[M]),_=n*10,S=$r(B=>{t&&f()?.forward(B*_,!0)},[t,_]),C=$r(B=>{t&&f()?.truck(B*_,0,!0)},[t,_]),R=$r((B,N,D)=>{if(!t)return;h.current&&cancelAnimationFrame(h.current),m.current={control:B,amount:N,action:D},g.current=0,D(N);let V=O=>{if(!m.current)return;if(g.current===0){g.current=O,h.current=requestAnimationFrame(V);return}if(O-g.current>200){let{amount:W,action:he}=m.current;he(W),g.current=O}h.current=requestAnimationFrame(V)};h.current=requestAnimationFrame(V)},[t]),A=$r(B=>{m.current?.control===B&&(h.current&&(cancelAnimationFrame(h.current),h.current=void 0),m.current=null,g.current=0)},[]);return MR(()=>(window.addEventListener("mousemove",P),window.addEventListener("mouseup",T),window.addEventListener("touchmove",P,{passive:!1}),window.addEventListener("touchend",T),window.addEventListener("touchcancel",T),()=>{window.removeEventListener("mousemove",P),window.removeEventListener("mouseup",T),window.removeEventListener("touchmove",P),window.removeEventListener("touchend",T),window.removeEventListener("touchcancel",T),M(),h.current&&cancelAnimationFrame(h.current)}),[P,T,M]),t?or("div",{className:"mc__wrapper",style:{opacity:r,...TR[o]},children:sh("div",{className:"mc__dpad",children:[or("button",{"aria-label":a("moveForward"),className:"mc__arrow mc__arrow--up",onMouseDown:()=>R("up",1,S),onMouseUp:()=>A("up"),onMouseLeave:()=>A("up"),onTouchStart:B=>{B.preventDefault(),R("up",1,S)},onTouchEnd:()=>A("up"),onTouchCancel:()=>A("up"),children:or(Dc,{direction:"up"})}),sh("div",{className:"mc__middle-row",children:[or("button",{"aria-label":a("moveLeft"),className:"mc__arrow mc__arrow--left",onMouseDown:()=>R("left",-1,C),onMouseUp:()=>A("left"),onMouseLeave:()=>A("left"),onTouchStart:B=>{B.preventDefault(),R("left",-1,C)},onTouchEnd:()=>A("left"),onTouchCancel:()=>A("left"),children:or(Dc,{direction:"left"})}),or("div",{ref:s,className:"mc__joystick",onMouseDown:v,onTouchStart:v,children:or("div",{className:"mc__knob",style:{transform:`translate(${l.x}px, ${l.y}px)`}})}),or("button",{"aria-label":a("moveRight"),className:"mc__arrow mc__arrow--right",onMouseDown:()=>R("right",1,C),onMouseUp:()=>A("right"),onMouseLeave:()=>A("right"),onTouchStart:B=>{B.preventDefault(),R("right",1,C)},onTouchEnd:()=>A("right"),onTouchCancel:()=>A("right"),children:or(Dc,{direction:"right"})})]}),or("button",{"aria-label":a("moveBackward"),className:"mc__arrow mc__arrow--down",onMouseDown:()=>R("down",-1,S),onMouseUp:()=>A("down"),onMouseLeave:()=>A("down"),onTouchStart:B=>{B.preventDefault(),R("down",-1,S)},onTouchEnd:()=>A("down"),onTouchCancel:()=>A("down"),children:or(Dc,{direction:"down"})})]})}):null},L0=_R;import{useMemo as ER}from"react";import{useEffect as PR}from"react";import{useThree as O0}from"@react-three/fiber";var I0=new WeakMap;function Lc(e){let t=O0(n=>n.get),r=O0(n=>n.setEvents);PR(()=>{if(!e)return;let n=I0.get(t);if(!n){let o=new Set;n=o,I0.set(t,o);let a=t().events.filter;r({filter:(s,l)=>{let u=a?a(s,l):s;return o.size===0?u:u.filter(d=>{for(let p of o)if(!p(d))return!1;return!0})}})}n.add(e);let i=n;return()=>{i.delete(e)}},[e,t,r])}function lh({setAside:e,nodeRefs:t}){let r=ER(()=>{if(e.size===0)return null;let n={refs:null,bound:new Map};return i=>{let o=t.current??{};if(n.refs!==o){let s=new Map;for(let[l,u]of Object.entries(o))s.set(u,e.has(l));n={refs:o,bound:s}}let{bound:a}=n;for(let s=i.object;s;s=s.parent){let l=a.get(s);if(l!==void 0)return!l}return!0}},[e,t]);return Lc(r),null}import{useEffect as uh,useMemo as dh,useRef as G0,useState as F0}from"react";import{Edges as AR}from"@react-three/drei";import{useFrame as RR,useThree as ph}from"@react-three/fiber";import{DoubleSide as Ic,Plane as kR}from"three";import{Vector3 as B0}from"three";var Oc={x:0,y:1,z:2},j0=e=>Math.min(Math.max(e,0),1);function ch(e,t){let r=Oc[t.axis],n=e.min[r],i=e.max[r];if(!Number.isFinite(n)||!Number.isFinite(i)||i<n)return null;let o=Number.isFinite(t.position)?t.position:.5;return n+(i-n)*j0(o)}function z0(e,t,r){let n=ch(t,r);if(n===null)return!1;let i=new B0;return i.setComponent(Oc[r.axis],r.flip?1:-1),e.normal.copy(i),e.constant=r.flip?-n:n,!0}function N0(e,t,r,n){let i=Oc[n],o=new B0().setComponent(i,1),a=r.clone().addScaledVector(o,-r.dot(o));if(a.lengthSq()<1e-8)return null;a.normalize();let s=e.direction.dot(a);if(Math.abs(s)<1e-8)return null;let l=t.clone().sub(e.origin).dot(a)/s;return Number.isFinite(l)?e.origin.getComponent(i)+e.direction.getComponent(i)*l:null}function V0(e,t,r){let n=Oc[t],i=e.max[n]-e.min[n];return i>0?j0((r-e.min[n])/i):null}import{jsx as Bc,jsxs as OR}from"react/jsx-runtime";var DR={x:0,y:1,z:2},U0="#22d3ee";function hh({section:e,box:t,modelRef:r,showHandle:n,onPositionChange:i,onDraggingChange:o}){let a=ph(g=>g.gl),s=ph(g=>g.raycaster),l=ph(g=>g.invalidate),u=dh(()=>new kR,[]),d=dh(()=>[u],[u]),p=e.enabled&&t!==null&&z0(u,t,e),c=G0(new Map),h=()=>{for(let[g,f]of c.current)g.clippingPlanes=f.clippingPlanes,g.side=f.side,g.needsUpdate=!0;c.current.clear()};uh(()=>{if(p)return a.localClippingEnabled=!0,l(),()=>{h(),l()}},[p,a,l]),uh(()=>{p&&l()},[p,e.axis,e.position,e.flip,t,l]),RR(()=>{let g=r.current;if(!p||!g)return;let f=c.current;g.traverse(b=>{let w=b.material;if(w)for(let y of Array.isArray(w)?w:[w]){let M=f.get(y);if(y.clippingPlanes===d&&y.side===Ic)continue;let E=y.side===Ic&&M?M.side:y.side;f.set(y,{clippingPlanes:M?M.clippingPlanes:y.clippingPlanes,side:E}),y.clippingPlanes=d,y.clipShadows=!0,y.side=Ic,y.needsUpdate=!0}})});let m=dh(()=>p?g=>!!g.object.userData.riSectionHandle||u.distanceToPoint(g.point)>=-1e-4:null,[p,u]);return Lc(m),uh(()=>{if(!p)return;let g=s,f=g.firstHitOnly;return g.firstHitOnly=!1,()=>{g.firstHitOnly=f}},[p,s]),!p||!n||!t?null:Bc(LR,{section:e,box:t,onPositionChange:i,onDraggingChange:o})}function LR({section:e,box:t,onPositionChange:r,onDraggingChange:n}){let[i,o]=F0(!1),[a,s]=F0(!1),l=G0(null),u=DR[e.axis],d=ch(t,e)??0,p=[0,1,2].map(b=>(t.max[b]-t.min[b])*1.08||.01),c=[0,1,2].map(b=>(t.min[b]+t.max[b])/2);c[u]=d;let[h,m]=e.axis==="x"?[p[2],p[1]]:e.axis==="y"?[p[0],p[2]]:[p[0],p[1]],g=e.axis==="x"?[0,Math.PI/2,0]:e.axis==="y"?[-Math.PI/2,0,0]:[0,0,0],f=b=>{a&&(b.target?.releasePointerCapture?.(b.pointerId),l.current=null,s(!1),n(!1))};return OR("mesh",{ref:b=>{b&&(gl(b),b.userData.riSectionHandle=!0)},position:c,rotation:g,renderOrder:2,onPointerOver:b=>{b.stopPropagation(),o(!0)},onPointerOut:()=>o(!1),onPointerDown:b=>{b.stopPropagation(),b.target?.setPointerCapture?.(b.pointerId),l.current={point:b.point.clone(),direction:b.ray.direction.clone(),coordinate:b.point.getComponent(u),cut:d},s(!0),n(!0)},onPointerMove:b=>{let w=l.current;if(!a||!w)return;b.stopPropagation();let y=N0(b.ray,w.point,w.direction,e.axis);if(y===null)return;let M=V0(t,e.axis,w.cut+(y-w.coordinate));M!==null&&r(M)},onPointerUp:f,onPointerCancel:f,onClick:b=>b.stopPropagation(),children:[Bc("planeGeometry",{args:[h,m]}),Bc("meshBasicMaterial",{color:U0,transparent:!0,opacity:a?.22:i?.16:.08,side:Ic,depthWrite:!1,toneMapped:!1}),Bc(AR,{color:U0,renderOrder:3})]})}import{HexColorPicker as IR}from"react-colorful";import{jsx as jc,jsxs as H0}from"react/jsx-runtime";var mh=({colorPicker:e,onClose:t,itemMaterials:r,setItemMaterials:n,inline:i=!1})=>{let o=me();return H0("div",{className:`ri-popover${i?" ri-popover--inline":""}`,style:i?{padding:12}:{left:e.x,top:e.y,width:"min(225px, calc(100vw - 24px))",padding:12},onPointerDown:a=>a.stopPropagation(),children:[jc("p",{className:"ri-popoverLabel",children:o("color")}),jc(IR,{color:r[e.objectId]?.hex??"#ffffff",onChange:a=>n(s=>({...s,[e.objectId]:{...s[e.objectId],hex:a}}))}),H0("div",{className:"ri-inlineRow",children:[jc("span",{className:"ri-colorCode",children:r[e.objectId]?.hex??"#ffffff"}),jc("button",{className:"ri-secondaryButton",onClick:t,children:o("done")})]})]})};import{jsx as mt,jsxs as Sn}from"react/jsx-runtime";var fh=({materialPopup:e,textureUrl:t,triggerFileUpload:r,clearTexture:n,canPlaceImage:i=!0,inline:o=!1,offset:a,rotationDegrees:s,onOffsetChange:l,onRotationChange:u,isPositioning:d=!1,onEndPositioning:p})=>{let c=me();return Sn("div",{className:`ri-popover${o?" ri-popover--inline":""}`,style:o?{overflow:"hidden"}:{left:e.x,top:e.y,width:"min(300px, calc(100vw - 24px))",overflow:"hidden"},onPointerDown:h=>h.stopPropagation(),children:[mt("div",{className:"ri-popoverHeader",children:mt("p",{className:"ri-popoverLabel",style:{marginBottom:0},children:c("material")})}),Sn("div",{className:"ri-materialBody",children:[t?mt("div",{className:"ri-previewFrame",children:mt("img",{src:t,alt:c("texturePreview"),className:"ri-previewImage"})}):Sn("div",{className:"ri-emptyState",children:[mt("svg",{width:"24",height:"24",fill:"none",stroke:"currentColor",strokeWidth:1.5,viewBox:"0 0 24 24",children:mt("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"})}),mt("span",{style:{fontSize:12},children:c("noTextureApplied")})]}),i?mt("button",{onClick:()=>r(e.objectId),className:"ri-uploadButton",children:c(t?"replaceImage":"uploadImage")}):mt("p",{className:"ri-formatHint",children:c("noTextureCoordinates")}),t&&mt("button",{onClick:()=>n(e.objectId),className:"ri-removeButton",children:c("removeTexture")}),i?mt("p",{className:"ri-formatHint",children:"JPG \xB7 PNG \xB7 WebP"}):null,t&&(l||u)&&Sn("div",{className:"ri-texturePosition",children:[mt("p",{className:"ri-texturePositionLabel",children:c("texturePosition")}),Sn("div",{className:"ri-texturePositionGrid",children:[Sn("label",{className:"ri-texturePositionField",children:[mt("span",{children:c("offsetX")}),mt("input",{type:"number",step:.01,value:a?.[0]??0,onChange:h=>l?.(e.objectId,0,Number(h.target.value))})]}),Sn("label",{className:"ri-texturePositionField",children:[mt("span",{children:c("offsetY")}),mt("input",{type:"number",step:.01,value:a?.[1]??0,onChange:h=>l?.(e.objectId,1,Number(h.target.value))})]})]}),Sn("label",{className:"ri-texturePositionField ri-texturePositionField--full",children:[mt("span",{children:c("rotation")}),Sn("div",{className:"ri-texturePositionSliderRow",children:[mt("input",{type:"range",min:0,max:360,step:1,value:s??0,onChange:h=>u?.(e.objectId,Number(h.target.value))}),mt("input",{type:"number",min:0,max:360,step:1,value:Math.round(s??0),onChange:h=>u?.(e.objectId,Number(h.target.value))})]})]}),d?mt("button",{type:"button",className:"ri-uploadButton",onClick:p,title:c("confirmTexturePosition"),children:c("donePositioning")}):mt("p",{className:"ri-texturePositionHint",children:c("textureOffsetHint")})]})]})]})};import{Fragment as BR,useEffect as gh,useRef as jR,useState as bh}from"react";import{Fragment as yh,jsx as Dt,jsxs as Bo}from"react/jsx-runtime";function W0({entries:e}){return Dt(yh,{children:e.map(([t,r])=>{let n=r!==null&&typeof r=="object",i=n?Object.entries(r):[];return n&&i.length>0?Bo("div",{className:"left-panel__data-group",children:[Dt("span",{className:"left-panel__data-key",children:t}),Dt("div",{className:"left-panel__data-children",children:Dt(W0,{entries:i})})]},t):Bo("div",{className:"left-panel__data-row",children:[Dt("span",{className:"left-panel__data-key",children:t}),Dt("span",{className:`left-panel__data-value left-panel__data-value--${typeof r}`,children:n?Array.isArray(r)?"[]":"{}":String(r)})]},t)})})}function zR({content:e}){let t=e!=null,[r,n]=bh(t),[i,o]=bh(t),a=jR(e);return t&&(a.current=e),gh(()=>{if(t){n(!0);return}if(r){o(!1);let s=setTimeout(()=>n(!1),300);return()=>clearTimeout(s)}},[t,r]),gh(()=>{if(r&&t){let s=requestAnimationFrame(()=>o(!0));return()=>cancelAnimationFrame(s)}},[r,t]),r?Dt("div",{className:`left-panel__action-extra${i?" left-panel__action-extra--open":""}`,children:Dt("div",{className:"left-panel__action-extra-inner",children:e??a.current})}):null}function xh({isOpen:e,selectedObject:t,currentAction:r,onClose:n,onAction:i,renderActionExtra:o,translateDefaultActions:a=!1}){let s=me(),[l,u]=bh(t);gh(()=>{t&&u(t)},[t]);let d=t??l,p=d?Object.entries(d).filter(([c])=>c!=="actions"&&c!=="decals"):[];return Dt("div",{className:`left-panel ${e?"left-panel--open":"left-panel--closed"}`,children:d&&Bo(yh,{children:[Bo("div",{className:"left-panel__header",children:[Dt("p",{className:"left-panel__title",children:d.label}),Dt("button",{onClick:n,className:"left-panel__close-btn","aria-label":s("closePanel"),children:"\u2715"})]}),p.length>0&&Dt("div",{className:"left-panel__data",children:Dt(W0,{entries:p})}),Dt("hr",{className:"left-panel__divider"}),d.actions&&d.actions.length>0&&Bo(yh,{children:[Dt("div",{className:"left-panel__actions-label",children:s("actions")}),Dt("div",{className:"left-panel__actions-list",children:d.actions.map((c,h)=>{let m=r?.action.id===c.id&&(r.binding===d||r.binding?.id===d.id||r.binding?.modelObjectId===d.modelObjectId||r.objectId===d.id||r.objectId===d.modelObjectId),g=o?.(c.id);return Bo(BR,{children:[Dt("button",{onClick:f=>i({objectId:d.modelObjectId||d.id||"",action:c,binding:d,screenX:f.clientX,screenY:f.clientY}),className:["left-panel__action-btn",`left-panel__action-btn--${c.id}`,m?"left-panel__action-btn--active":""].filter(Boolean).join(" "),"data-action-id":c.id,"data-label":c.label,children:a?s.message(c.label):c.label}),Dt(zR,{content:g})]},h)})})]})]})})}import{useMemo as VR,useState as q0}from"react";import{Boxes as FR,Focus as UR}from"lucide-react";import{useState as NR}from"react";import{jsx as Cn,jsxs as ps}from"react/jsx-runtime";function X0({openButtonLabel:e,openButtonAriaLabel:t,eyebrow:r,title:n,searchValue:i,onSearchChange:o,searchPlaceholder:a,children:s,isOpen:l,onToggle:u,openButtonIcon:d,closeButtonIcon:p,closeButtonAriaLabel:c}){let h=me(),[m,g]=NR(!1),f=l!==void 0?l:m,b=w=>{l===void 0&&g(w),u?.(w)};return ps("div",{className:`ri-sidepanel-wrap ${f?"ri-sidepanel-wrap--open":"ri-sidepanel-wrap--closed"}`,children:[!f&&ps("button",{type:"button",className:"ri-sidepanel__open-btn",onClick:()=>b(!0),"aria-label":t,title:h("openPanel"),children:[d,e?Cn("span",{children:e}):null]}),ps("div",{className:`ri-sidepanel ${f?"ri-sidepanel--open":"ri-sidepanel--closed"}`,"aria-hidden":!f,children:[ps("div",{className:"ri-sidepanel__header",children:[ps("div",{className:"ri-sidepanel__header-top",children:[Cn("span",{className:"ri-sidepanel__eyebrow",children:r}),Cn("button",{type:"button",className:"ri-sidepanel__close-btn",onClick:()=>b(!1),"aria-label":c,title:h("close"),children:p??Cn("svg",{width:"12",height:"12",viewBox:"0 0 12 12",fill:"none","aria-hidden":"true",children:Cn("path",{d:"M1 1L11 11M11 1L1 11",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round"})})})]}),Cn("p",{className:"ri-sidepanel__title",children:n})]}),Cn("div",{className:"ri-sidepanel__search-wrap",children:Cn("input",{className:"ri-sidepanel__search",type:"text",placeholder:a,value:i,onChange:w=>o(w.target.value)})}),Cn("div",{className:"ri-sidepanel__list",children:s})]})]})}import{jsx as Tn,jsxs as GR}from"react/jsx-runtime";function vh({objectBindings:e,onAction:t,onFocus:r,onHover:n,isOpen:i,onToggle:o,isolatedKeys:a=null,onIsolate:s}){let l=me(),[u,d]=q0(null),[p,c]=q0(""),h=VR(()=>Object.entries(e).filter(([m,g])=>{let f=p.toLowerCase();return m.toLowerCase().includes(f)||(g.label??"").toLowerCase().includes(f)}),[e,p]);return Tn(X0,{openButtonLabel:"",openButtonAriaLabel:l("openSceneObjectsPanel"),openButtonIcon:Tn(FR,{width:16,height:16,"aria-hidden":"true"}),eyebrow:l("sceneObjects"),title:l("visibleEntries",{count:h.length}),searchValue:p,onSearchChange:c,searchPlaceholder:l("searchNodesLabels"),isOpen:i,onToggle:o,closeButtonAriaLabel:l("closeSceneObjectsPanel"),children:h.map(([m,g])=>{let f=g.visible!==!1,b=u===m,w=a?.has(m)??!1;return GR("div",{onClick:()=>r(g),onMouseEnter:()=>{d(m),n?.(g)},onMouseLeave:()=>{d(null),n?.(null)},className:`ri-sidepanel__row${b?" ri-sidepanel__row--hovered":""}${a!==null&&!w?" ri-sidepanel__row--setAside":""}`,children:[Tn("button",{type:"button",className:`ri-sidepanel__label ri-sidepanel__labelButton${b?" ri-sidepanel__label--hovered":""}`,onFocus:()=>{d(m),n?.(g)},onBlur:()=>{d(null),n?.(null)},children:g.label??m}),s?Tn("button",{type:"button",onClick:M=>{M.stopPropagation(),s(g)},className:`ri-sidepanel__isolate-btn${w?" ri-sidepanel__isolate-btn--active":""}`,title:l(w?"showAll":"isolate"),"aria-label":l(w?"showAllObject":"isolateObject",{name:g.label??m}),"aria-pressed":w,children:Tn(UR,{width:14,height:14,"aria-hidden":"true"})}):null,Tn("button",{type:"button",onClick:M=>{M.stopPropagation(),t?.({objectId:m,action:{id:"toggle-visibility",label:"Toggle Visibility",type:"command"},binding:g})},className:"ri-sidepanel__vis-btn",title:l(f?"hide":"show"),"aria-label":l(f?"hideObject":"showObject",{name:g.label??m}),children:Tn("span",{className:`ri-sidepanel__checkbox${f?" ri-sidepanel__checkbox--checked":""}`,children:f&&Tn("svg",{width:"9",height:"9",viewBox:"0 0 10 10",fill:"none",children:Tn("path",{d:"M1.5 5L4 7.5L8.5 2.5",stroke:"white",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round"})})})})]},m)})})}import{useEffect as Q0,useId as HR,useRef as J0,useState as Z0}from"react";function $0(e,t){let r=[];for(let[n,i]of Object.entries(e))(t.bindings[n]??i).visible!==!1&&(t.setAside.has(n)||r.push({key:n,binding:i,label:i.label||n}));return r}function Y0(e,t,r){if(r===0)return null;switch(e){case"ArrowDown":case"ArrowRight":return Math.min(t+1,r-1);case"ArrowUp":case"ArrowLeft":return Math.max(t-1,0);case"Home":return 0;case"End":return r-1;default:return null}}function K0(e,t,r){let n=r.toLocaleLowerCase();if(!n)return null;let i=[...n].every(s=>s===n[0]),o=n.length>1&&!i?t:t+1,a=i?[n,n[0]]:[n];for(let s of a)for(let l=0;l<e.length;l++){let u=((o+l)%e.length+e.length)%e.length;if(e[u].label.toLocaleLowerCase().startsWith(s))return u}return null}import{jsx as zc,jsxs as ew}from"react/jsx-runtime";var WR=600;function tw({objects:e,selectedKey:t,onHighlight:r,onSelect:n,onClearSelection:i}){let o=me(),a=HR(),[s,l]=Z0(!1),[u,d]=Z0(null),p=J0({query:"",at:0}),c=u?e.findIndex(M=>M.key===u):-1,h=c>=0?e[c]:null;Q0(()=>{t&&e.some(M=>M.key===t)&&d(t)},[t,e]);let m=s?h?.binding??null:null,g=J0(r);g.current=r,Q0(()=>{if(s)return g.current(m),()=>g.current(null)},[s,m]);let f=M=>{M!==null&&e[M]&&d(e[M].key)},b=M=>{let E=h?c:-1,v=Y0(M.key,Math.max(E,0),e.length);if(v!==null){M.preventDefault(),f(E<0&&M.key!=="End"?0:v);return}if(M.key==="Enter"||M.key===" "){if(!h)return;M.preventDefault(),n(h.binding);return}if(M.key==="Escape"){if(!t)return;M.preventDefault(),M.stopPropagation(),i();return}if(M.key.length===1&&M.key!==" "&&!M.ctrlKey&&!M.metaKey&&!M.altKey){let P=Date.now(),T=p.current;T.query=P-T.at>WR?M.key:T.query+M.key,T.at=P,M.preventDefault(),f(K0(e,E,T.query))}};if(e.length===0)return null;let w=`${a}-option`,y=`${a}-hint`;return ew("div",{className:`ri-objectNavigator${s?" ri-objectNavigator--focused":""}`,children:[zc("div",{role:"listbox",tabIndex:0,className:"ri-objectNavigator__list","aria-label":o("objectNavigator"),"aria-describedby":y,"aria-activedescendant":h?w:void 0,onFocus:()=>{l(!0),h||d(e[0].key)},onBlur:()=>l(!1),onKeyDown:b,children:h?ew("div",{id:w,role:"option","aria-selected":h.key===t,"aria-setsize":e.length,"aria-posinset":c+1,className:`ri-objectNavigator__option${h.key===t?" ri-objectNavigator__option--selected":""}`,children:[zc("span",{className:"ri-objectNavigator__name",children:h.label}),zc("span",{className:"ri-objectNavigator__position","aria-hidden":"true",children:o("objectNavigatorPosition",{position:c+1,count:e.length})})]}):null}),zc("div",{id:y,className:"ri-objectNavigator__hint",children:o("objectNavigatorHint")})]})}import{RotateCcw as TD}from"lucide-react";import{useRef as wt,useEffect as hs,useMemo as pr,useCallback as Nc,useSyncExternalStore as YR}from"react";import{useThree as KR,useFrame as QR}from"@react-three/fiber";import{Sphere as JR,PivotControls as ZR}from"@react-three/drei";import{Vector3 as Er,Vector2 as ek,AdditiveBlending as wh,TextureLoader as tk,Matrix4 as rk,Quaternion as jo,Euler as Vc}from"three";var rw="data:image/png;base64,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";var nw="data:image/png;base64,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";var iw="data:image/png;base64,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";import{Fragment as pk,jsx as Qe,jsxs as hr}from"react/jsx-runtime";var Mh=-100,Sh=100,hw=.03,nk=.03,ik=.03,ow=.5,ok=rw,ak=nw,sk=iw,lk=Math.PI/4,aw=.4,zo=64,sw=hw*3,Ch="#4d7dff",lw="#ffcc00",cw=.02,ck=new Er(0,1,0),Fc=32,uw="#ff9d3d",Uc=4;function Th(e){let t=new Float32Array((zo+1)*3);for(let r=0;r<=zo;r++){let n=r/zo*Math.PI*2,i=Math.cos(n)*aw,o=Math.sin(n)*aw,a=0,s=0,l=0;e==="x"?(s=i,l=o):e==="y"?(a=i,l=o):(a=i,s=o),t[r*3]=a,t[r*3+1]=s,t[r*3+2]=l}return t}function uk(e){let t=Math.abs(e.y)<.99?new Er(0,1,0):new Er(1,0,0),r=new Er().crossVectors(e,t).normalize(),n=new Er().crossVectors(e,r).normalize();return[r,n]}function dw(e,t,r=1e-5){return Math.abs(e[0]-t[0])<r&&Math.abs(e[1]-t[1])<r&&Math.abs(e[2]-t[2])<r}var No=null,Ph=new Set;function _h(e){No!==e&&(No=e,Ph.forEach(t=>t()))}function dk(e){return Ph.add(e),()=>Ph.delete(e)}function pw(){return No}function mw({light:e,position:t,rotation:r=[0,0,0],color:n,intensity:i,visible:o,onPositionChange:a,onRotationChange:s,onDraggingChange:l}){let{activeTab:u,activeSubTab:d,setActiveTab:p,setActiveSubTab:c}=dl(),{camera:h,gl:m,raycaster:g,invalidate:f}=KR(),b=wt(null),w=wt(null),y=wt(null),M=wt(null),E=wt(null),v=wt(null),P=wt(null),T=wt(null),_=wt(null),S=wt(null),C=wt(null),R=pr(()=>new rk,[]),A=pr(()=>new jo,[]),B=pr(()=>new Er(1,1,1),[]),N=wt([0,0,0]),D=wt([0,0,0]),V=wt(!1),O=wt(null),k=wt(null),W=wt(null),he=wt(l);hs(()=>{he.current=l},[l]);let ae=pr(()=>new Er(t[0],t[1],t[2]),[t]),te=pr(()=>new Vc(r[0],r[1],r[2]),[r]),ve=pr(()=>new Float32Array(6),[]),U=pr(()=>Th("x"),[]),G=pr(()=>Th("y"),[]),J=pr(()=>Th("z"),[]),se=pr(()=>new Float32Array((Fc+1)*3),[]),Ee=pr(()=>new Float32Array(Uc*2*3),[]),X=e?.type==="point",ie=e?.type==="spot",Ce=X?ak:ie?sk:ok,Ge=X?nk:ie?ik:hw,Q=pr(()=>new tk().load(Ce),[Ce]),ot=YR(dk,pw,pw),rt=!!e&&ot===e.id,Ve=wt(new Er),ee=wt(new Vc);hs(()=>{V.current||(Ve.current.copy(ae),ee.current.copy(te),f())},[ae,te,f]),hs(()=>{e&&No===e.id&&!o&&_h(null)},[e?.id,o]),hs(()=>()=>{e&&No===e.id&&_h(null),W.current!==null&&(cancelAnimationFrame(W.current),W.current=null)},[e?.id]);let we=Nc(()=>{if(V.current||!rt)return;let ne=Ve.current,ue=new jo().setFromEuler(ee.current);R.compose(ne,ue,B)},[R,B,rt]);QR(()=>{if(b.current&&b.current.position.copy(Ve.current),we(),y.current){y.current.lookAt(h.position);let ne=h,ue;ne.isOrthographicCamera?ue=Ge/ne.zoom:ue=h.position.distanceTo(Ve.current)*Ge,y.current.scale.setScalar(ue)}if(P.current){let ne=h,ue;ne.isOrthographicCamera?ue=sw/ne.zoom:ue=h.position.distanceTo(Ve.current)*sw,P.current.scale.setScalar(ue)}if(E.current){let ne=E.current.getAttribute("position"),ue=ne.array;ue[0]=0,ue[1]=0,ue[2]=0,ue[3]=Ve.current.x,ue[4]=Ve.current.y,ue[5]=Ve.current.z,ne.needsUpdate=!0,E.current.computeBoundingSphere()}if(v.current){let ne=Ve.current,ue=ne.length();v.current.visible=ue>ow,ue>1e-6&&(v.current.position.copy(ne).multiplyScalar(.5),v.current.scale.set(1,ue,1),v.current.quaternion.setFromUnitVectors(ck,ne.clone().normalize()))}if(M.current&&(M.current.visible=Ve.current.length()>ow),ie&&T.current&&_.current&&S.current){let ne=Ve.current,ue=ne.length();if(ue>1e-6){T.current.visible=!0;let Se=ne.clone().negate().normalize(),Ie=ue,He=e?.angle??Math.PI/6,$=Ie*Math.tan(He),le=ne.clone().add(Se.clone().multiplyScalar(Ie)),[de,Te]=uk(Se),Ye=_.current.getAttribute("position"),Be=Ye.array;for(let _e=0;_e<=Fc;_e++){let Ae=_e/Fc*Math.PI*2,Ct=le.x+(de.x*Math.cos(Ae)+Te.x*Math.sin(Ae))*$,gr=le.y+(de.y*Math.cos(Ae)+Te.y*Math.sin(Ae))*$,nt=le.z+(de.z*Math.cos(Ae)+Te.z*Math.sin(Ae))*$;Be[_e*3]=Ct,Be[_e*3+1]=gr,Be[_e*3+2]=nt}Ye.needsUpdate=!0,_.current.computeBoundingSphere();let je=S.current.getAttribute("position"),pe=je.array;for(let _e=0;_e<Uc;_e++){let Ae=_e/Uc*Math.PI*2,Ct=le.x+(de.x*Math.cos(Ae)+Te.x*Math.sin(Ae))*$,gr=le.y+(de.y*Math.cos(Ae)+Te.y*Math.sin(Ae))*$,nt=le.z+(de.z*Math.cos(Ae)+Te.z*Math.sin(Ae))*$,dt=_e*6;pe[dt]=ne.x,pe[dt+1]=ne.y,pe[dt+2]=ne.z,pe[dt+3]=Ct,pe[dt+4]=gr,pe[dt+5]=nt}je.needsUpdate=!0,S.current.computeBoundingSphere()}else T.current.visible=!1}});let at=Nc(()=>{W.current!==null&&(cancelAnimationFrame(W.current),W.current=null),N.current=t,D.current=[r[0],r[1],r[2]],V.current=!0,O.current=null,k.current=null,he.current?.(!0)},[t,r]),st=Nc((ne,ue,Se,Ie)=>{let He=new Er(N.current[0],N.current[1],N.current[2]),$=new Er,le=new jo,de=new Er;Ie.decompose($,le,de);let Te=He.clone().applyMatrix4(Ie),Ye=[Math.min(Math.max(Te.x,Mh),Sh),Math.min(Math.max(Te.y,Mh),Sh),Math.min(Math.max(Te.z,Mh),Sh)],Be=new jo().setFromEuler(new Vc(D.current[0],D.current[1],D.current[2],"XYZ")),je=new jo().copy(le).multiply(Be),pe=new Vc().setFromQuaternion(je,"XYZ"),_e=[pe.x,pe.y,pe.z];Ve.current.set(Ye[0],Ye[1],Ye[2]),ee.current.set(_e[0],_e[1],_e[2]),O.current=Ye,k.current=_e;let Ae=new jo().setFromEuler(ee.current);R.compose(Ve.current,Ae,B),f()},[R,B,f]),ft=Nc(()=>{V.current=!1;let ne=O.current,ue=k.current;O.current=null,k.current=null;let Se=ne&&!dw(ne,N.current),Ie=ue&&!dw(ue,D.current);Se&&a&&a(ne),Ie&&s&&s(ue),Se||Ie?W.current=requestAnimationFrame(()=>{W.current=null,he.current?.(!1)}):he.current?.(!1)},[a,s]);return hs(()=>{let ne=Ie=>{let He=m.domElement.getBoundingClientRect();return new ek((Ie.clientX-He.left)/He.width*2-1,-((Ie.clientY-He.top)/He.height)*2+1)},ue=Ie=>!!Ie.target.closest?.("button, input, textarea, .ri-annotationPopup, .ri-colorPicker, .ri-materialPicker"),Se=Ie=>{if(ue(Ie))return;let He=ne(Ie);g.setFromCamera(He,h);let $=[];if(w.current&&$.push(w.current),y.current&&$.push(y.current),$.length===0)return;if(g.intersectObjects($,!1).length>0){let de=e?.id??null;No!==de&&(_h(de),p?.("scene"),c?.("Lighting")),Ie.preventDefault(),Ie.stopPropagation()}};return m.domElement.addEventListener("pointerdown",Se),()=>{m.domElement.removeEventListener("pointerdown",Se)}},[h,g,m,e,p,c]),u!=="scene"||d!=="Lighting"||!e||!o||e.type==="none"||e.type==="hemisphere"?null:hr("group",{ref:ne=>{ne&&gl(ne)},children:[hr("group",{ref:b,children:[Qe("sprite",{ref:y,children:Qe("spriteMaterial",{map:Q,transparent:!0,opacity:.9,blending:wh,depthWrite:!1,rotation:ie?lk:0},Ce)}),Qe(JR,{ref:w,args:[.25,16,16],children:Qe("meshBasicMaterial",{transparent:!0,opacity:.01})}),X&&hr("group",{ref:P,children:[hr("lineLoop",{renderOrder:999,children:[Qe("bufferGeometry",{children:Qe("bufferAttribute",{attach:"attributes-position",args:[U,3],count:zo+1})}),Qe("lineBasicMaterial",{color:Ch,transparent:!0,opacity:.6,depthTest:!1,depthWrite:!1})]}),hr("lineLoop",{renderOrder:999,children:[Qe("bufferGeometry",{children:Qe("bufferAttribute",{attach:"attributes-position",args:[G,3],count:zo+1})}),Qe("lineBasicMaterial",{color:Ch,transparent:!0,opacity:.6,depthTest:!1,depthWrite:!1})]}),hr("lineLoop",{renderOrder:999,children:[Qe("bufferGeometry",{children:Qe("bufferAttribute",{attach:"attributes-position",args:[J,3],count:zo+1})}),Qe("lineBasicMaterial",{color:Ch,transparent:!0,opacity:.6,depthTest:!1,depthWrite:!1})]})]})]}),!X&&!ie&&hr(pk,{children:[hr("mesh",{ref:v,children:[Qe("cylinderGeometry",{args:[cw,cw,1,8,1,!0]}),Qe("meshBasicMaterial",{color:lw,transparent:!0,opacity:.05,blending:wh,depthWrite:!1,depthTest:!1})]}),hr("line",{ref:M,children:[Qe("bufferGeometry",{ref:E,children:Qe("bufferAttribute",{attach:"attributes-position",args:[ve,3],count:2})}),Qe("lineBasicMaterial",{color:lw,transparent:!0,opacity:.7,blending:wh})]})]}),ie&&hr("group",{ref:T,children:[hr("lineLoop",{renderOrder:999,children:[Qe("bufferGeometry",{ref:_,children:Qe("bufferAttribute",{attach:"attributes-position",args:[se,3],count:Fc+1})}),Qe("lineBasicMaterial",{color:uw,transparent:!0,opacity:.85,depthTest:!1,depthWrite:!1})]}),hr("lineSegments",{renderOrder:999,children:[Qe("bufferGeometry",{ref:S,children:Qe("bufferAttribute",{attach:"attributes-position",args:[Ee,3],count:Uc*2})}),Qe("lineBasicMaterial",{color:uw,transparent:!0,opacity:.5,depthTest:!1,depthWrite:!1})]})]}),rt&&a&&Qe(ZR,{ref:C,matrix:R,autoTransform:!1,fixed:!0,scale:90,lineWidth:3,axisColors:["#ff2d6f","#64dfa6","#2f8fe8"],hoveredColor:"#ffd84d",opacity:.95,depthTest:!1,disableScaling:!0,onDragStart:at,onDrag:st,onDragEnd:ft})]})}import{useCallback as Yr,useEffect as hk,useLayoutEffect as mk,useMemo as Zt,useRef as mr}from"react";import{Html as fk,PivotControls as gk}from"@react-three/drei";import{useFrame as bk,useThree as Eh}from"@react-three/fiber";import{Euler as fw,Matrix4 as ms,Quaternion as fs,Vector3 as ar}from"three";import{Maximize2 as yk}from"lucide-react";import{jsx as gs,jsxs as vk}from"react/jsx-runtime";var xk=.01,Ah=.5;function Rh({node:e,space:t,moveEnabled:r,scaleEnabled:n,onTransformChange:i,onDraggingChange:o,transform:a}){let s=Eh(X=>X.invalidate),l=Eh(X=>X.camera),u=Eh(X=>X.size),d=Zt(()=>ki(e),[e]),p=Zt(()=>new ar,[e]);a?.pivot?p.fromArray(a.pivot.point):p.copy(d);let c=Zt(()=>{let X=Ba(e);if(!X)return[p.clone().add(new ar(Ah,Ah,Ah))];let ie=[];for(let Ce of[X.min.x,X.max.x])for(let Ge of[X.min.y,X.max.y])for(let Q of[X.min.z,X.max.z])ie.push(new ar(Ce,Ge,Q));return ie},[e,p]),h=Zt(()=>new ar,[]),m=Zt(()=>new ar,[]),g=mr(null),f=Zt(()=>new ms,[]),b=mr(!1),w=mr(new ms),y=mr(new ms),M=mr(null),E=mr([]),v=mr(null),P=mr(o);P.current=o;let T=Zt(()=>new ar,[]),_=Zt(()=>new fs,[]),S=Zt(()=>new ar,[]),C=Zt(()=>new fs,[]),R=Zt(()=>new ar(1,1,1),[]),A=Zt(()=>new fs,[]),B=Zt(()=>new ar,[]),N=Zt(()=>new ar,[]),D=mr([0,0,0]),V=mr(new ar(1,1,1)),O=mr({point:[0,0,0],offset:[0,0,0]}),k=Yr(()=>{b.current||(e.updateWorldMatrix(!0,!1),T.copy(p).applyMatrix4(e.matrixWorld),e.getWorldQuaternion(_),C.copy(_),t==="world"&&C.identity(),f.compose(T,C,R))},[T,f,C,R,e,p,t,_]),W=Yr(()=>{e.updateWorldMatrix(!0,!1);let X=1/0;for(let ie of c){h.copy(ie).applyMatrix4(e.matrixWorld);let Ce=h.distanceToSquared(l.position);Ce<X&&(X=Ce,m.copy(h))}g.current?.position.copy(m)},[l,m,c,e,h]);mk(()=>(k(),W(),()=>{let X=v.current!==null;X&&(cancelAnimationFrame(v.current),v.current=null),(b.current||X)&&(b.current=!1,P.current(!1));for(let ie of E.current)tn(ie);E.current=[]}),[k]),bk(()=>{k(),W()});let he=Yr(()=>{v.current!==null&&(cancelAnimationFrame(v.current),v.current=null),e.updateWorldMatrix(!0,!0),E.current=[];for(let X of zn(e))tl(X)||(oo(X,X.matrixWorld),E.current.push(X));e.updateWorldMatrix(!0,!1),T.copy(p).applyMatrix4(e.matrixWorld),e.getWorldQuaternion(_),e.getWorldScale(S),w.current.compose(T,_,S),y.current.copy(f),D.current=[e.rotation.x,e.rotation.y,e.rotation.z],V.current.copy(e.scale),O.current=a?.pivot??Wl(p.toArray(),D.current,e.scale.toArray(),e.rotation.order),M.current=null,b.current=!0,o(!0)},[T,f,e,o,p,_,S,a?.pivot]),ae=Yr((X,ie)=>{let Ce=w.current.clone().premultiply(ie),Ge=y.current.clone().premultiply(ie);Ce.decompose(B,_,N);let Q=B.clone();Ge.decompose(T,C,R),t==="world"&&C.identity(),f.compose(T,C,R),X.decompose(B,A,N);let ot=new fw().setFromQuaternion(A,e.rotation.order),[rt,Ve,ee]=D.current,we=[rt+ot.x,Ve+ot.y,ee+ot.z],at=new fs().setFromEuler(new fw(we[0],we[1],we[2],e.rotation.order));e.scale.copy(V.current);let ft=(e.parent?.matrixWorld||new ms).clone().invert(),ne=Q.clone().applyMatrix4(ft),ue=p.clone().multiply(e.scale).applyQuaternion(at),Se=ne.clone().sub(ue);e.position.copy(Se),e.rotation.set(we[0],we[1],we[2],e.rotation.order),e.updateMatrixWorld(!0),s();let Ie=O.current,He=ne.clone().sub(new ar(...Ie.offset)),$=[He.x,He.y,He.z];M.current={position:$,rotation:we,pivot:Ie}},[T,A,f,C,R,s,e,p,B,N,t,_]),te=Yr(()=>{b.current=!1;let X=M.current;if(M.current=null,X)i(X),v.current=requestAnimationFrame(()=>{v.current=null,o(!1)});else if(E.current.length>0){for(let ie of E.current)tn(ie);e.updateMatrixWorld(!0),s(),o(!1)}else o(!1);E.current=[]},[s,e,o,i]),ve=mr(null),U=Yr(X=>{let ie=X.clone().project(l);return{x:u.left+(ie.x*.5+.5)*u.width,y:u.top+(-ie.y*.5+.5)*u.height}},[l,u]),G=Yr((X,ie)=>{let Ce=Math.max(xk,Number.isFinite(X)?X:1);e.scale.copy(V.current).multiplyScalar(Ce);let Q=(e.parent?.matrixWorld||new ms).clone().invert(),ot=ie.clone().applyMatrix4(Q),rt=new fs().setFromEuler(e.rotation),Ve=p.clone().multiply(e.scale).applyQuaternion(rt),ee=ot.clone().sub(Ve);e.position.set(ee.x,ee.y,ee.z),e.updateMatrixWorld(!0),W(),s(),M.current={position:ot.clone().sub(new ar(...O.current.offset)).toArray(),scale:e.scale.toArray(),pivot:O.current}},[s,e,p,W]),J=Yr(X=>{if(!n)return;X.stopPropagation(),X.preventDefault(),X.currentTarget.setPointerCapture(X.pointerId),he();let ie=T.clone(),Ce=U(ie),Ge=Math.max(1,Math.hypot(X.clientX-Ce.x,X.clientY-Ce.y));ve.current={pointerId:X.pointerId,centerScreen:Ce,startDistance:Ge,pivotWorld:ie}},[he,T,U,n]),se=Yr(X=>{let ie=ve.current;if(!ie||X.pointerId!==ie.pointerId)return;X.stopPropagation();let Ce=Math.hypot(X.clientX-ie.centerScreen.x,X.clientY-ie.centerScreen.y);G(Ce/ie.startDistance,ie.pivotWorld)},[G]),Ee=Yr(X=>{let ie=ve.current;!ie||X.pointerId!==ie.pointerId||(X.stopPropagation(),X.currentTarget.hasPointerCapture(X.pointerId)&&X.currentTarget.releasePointerCapture(X.pointerId),ve.current=null,te())},[te]);return hk(()=>{n||ve.current&&(ve.current=null,te())},[n,te]),vk("group",{children:[gs(gk,{matrix:f,autoTransform:!1,fixed:!0,scale:90,lineWidth:3,axisColors:["#ff2d6f","#64dfa6","#2f8fe8"],hoveredColor:"#ffd84d",opacity:.95,depthTest:!1,disableAxes:!r,disableSliders:!r,disableRotations:!r,disableScaling:!0,onDragStart:he,onDrag:(X,ie,Ce,Ge)=>ae(ie,Ge),onDragEnd:te}),n&&gs("group",{ref:g,children:gs(fk,{portal:void 0,zIndexRange:[10,0],style:{pointerEvents:"none",transition:"opacity 0.2s"},children:gs("div",{onPointerDown:J,onPointerMove:se,onPointerUp:Ee,onPointerCancel:Ee,title:"Drag to resize",style:{position:"absolute",transform:"translate(-50%, -50%)",width:24,height:24,borderRadius:"50%",display:"flex",alignItems:"center",justifyContent:"center",background:"#113456",border:"2px solid #ffffff",boxShadow:"0 2px 6px rgba(0,0,0,0.5)",cursor:"nwse-resize",touchAction:"none",pointerEvents:"auto"},children:gs(yk,{size:13,color:"#ffffff"})})})})]})}import{useCallback as Kr,useEffect as Mk,useLayoutEffect as yw,useMemo as Ui,useRef as fr}from"react";import{Html as Sk,PivotControls as Ck}from"@react-three/drei";import{useFrame as Tk,useThree as Lh}from"@react-three/fiber";import{Matrix4 as bs,Quaternion as _k,Vector3 as Gi}from"three";import{Maximize2 as Pk}from"lucide-react";import{Matrix4 as wk,Vector3 as gw}from"three";function kh(e){let t=new Set(e.map(({node:n})=>n)),r=new Set;return e.filter(({node:n})=>{if(r.has(n))return!1;r.add(n);for(let i=n.parent;i;i=i.parent)if(t.has(i))return!1;return!0})}function bw(e){return kh(e).map(({key:t,node:r,transform:n})=>{r.updateWorldMatrix(!0,!0);let i=n?.pivot?.point??ki(r).toArray(),o=n?.pivot??Wl(i,[r.rotation.x,r.rotation.y,r.rotation.z],r.scale.toArray(),r.rotation.order,n?.shear);return{key:t,node:r,pivot:o,startWorld:r.matrixWorld.clone(),startMatrix:r.matrix.clone(),startMatrixAutoUpdate:r.matrixAutoUpdate,startPosition:r.position.clone(),startQuaternion:r.quaternion.clone(),startScale:r.scale.clone(),pivotWorld:new gw(...o.point).applyMatrix4(r.matrixWorld)}})}function Dh(e,t,r=1){return e.map(n=>{let{node:i,pivot:o}=n;i.parent?.updateWorldMatrix(!0,!1);let a=(i.parent?.matrixWorld.clone()??new wk).invert(),s=a.clone().multiply(t).multiply(n.startWorld),{rotation:l,scale:u,shear:d}=xx(s,n.startScale.clone().multiplyScalar(r),n.startQuaternion),p=n.pivotWorld.clone().applyMatrix4(t).applyMatrix4(a);return i.position.setFromMatrixPosition(s),i.quaternion.copy(l),i.scale.copy(u),Ri(i,d),i.updateMatrixWorld(!0),{key:n.key,transform:{position:p.clone().sub(new gw(...o.offset)).toArray(),rotation:[i.rotation.x,i.rotation.y,i.rotation.z],scale:u.toArray(),pivot:o,shear:d}}})}import{jsx as ys,jsxs as Ak}from"react/jsx-runtime";var Ek=.01;function Oh({entries:e,referenceNode:t,space:r,moveEnabled:n,scaleEnabled:i,onTransformChange:o,onDraggingChange:a}){let s=Lh(U=>U.invalidate),l=Lh(U=>U.camera),u=Lh(U=>U.size),d=fr(e);d.current=e;let p=fr([]);(e.length!==p.current.length||e.some((U,G)=>U.key!==p.current[G].key||U.node!==p.current[G].node))&&(p.current=e);let c=p.current,h=Ui(()=>kh(c).map(({node:U})=>U),[c]),m=t??e[e.length-1]?.node,g=Ui(()=>new Gi,[]),f=Ui(()=>new _k,[]),b=Ui(()=>new bs,[]),w=Ui(()=>new Gi(1,1,1),[]),y=Ui(()=>new Gi,[]),M=fr(null),E=Ui(()=>h.flatMap(U=>{let G=Ba(U);if(!G)return[{node:U,point:ki(U).addScalar(.5)}];let J=[];for(let se of[G.min.x,G.max.x])for(let Ee of[G.min.y,G.max.y])for(let X of[G.min.z,G.max.z])J.push({node:U,point:new Gi(se,Ee,X)});return J}),[h]),v=fr(!1),P=fr(new bs),T=fr([]),_=fr(null),S=fr([]),C=fr(null),R=fr(null),A=fr(a);A.current=a;let B=fr(o);B.current=o;let N=Kr(()=>{if(!v.current){g.set(0,0,0);for(let U of h)U.updateWorldMatrix(!0,!1),g.add(ki(U).applyMatrix4(U.matrixWorld));h.length&&g.divideScalar(h.length),f.identity(),r==="local"&&m&&(m.updateWorldMatrix(!0,!1),m.getWorldQuaternion(f)),b.compose(g,f,w)}},[g,b,f,h,m,r,w]),D=Kr(()=>{let U=1/0,G=new Gi;for(let{node:J,point:se}of E){J.updateWorldMatrix(!0,!1),G.copy(se).applyMatrix4(J.matrixWorld);let Ee=G.distanceToSquared(l.position);Ee<U&&(U=Ee,y.copy(G))}M.current?.position.copy(y)},[l,E,y]),V=Kr(()=>{let U=R.current;R.current=null,U?.target.hasPointerCapture(U.pointerId)&&U.target.releasePointerCapture(U.pointerId)},[]);yw(()=>{N(),D()},[N,D]),yw(()=>()=>{V();let U=C.current!==null;if(U&&(cancelAnimationFrame(C.current),C.current=null),v.current)for(let G of T.current)G.node.matrixAutoUpdate=G.startMatrixAutoUpdate,G.node.matrix.copy(G.startMatrix),G.node.position.copy(G.startPosition),G.node.quaternion.copy(G.startQuaternion),G.node.scale.copy(G.startScale),G.node.updateMatrixWorld(!0);(v.current||U)&&(v.current=!1,_.current=null,A.current(!1),s());for(let G of S.current)tn(G);S.current=[]},[c,s,V]),Tk(()=>{N(),D()});let O=Kr(()=>{C.current!==null&&(cancelAnimationFrame(C.current),C.current=null),N(),T.current=bw(d.current),S.current=[];for(let{node:U}of T.current)for(let G of zn(U))tl(G)||(oo(G,G.matrixWorld),S.current.push(G));P.current.copy(b),_.current=null,v.current=!0,A.current(!0)},[b,N]),k=Kr((U,G)=>{if(!v.current)return;P.current.clone().premultiply(G).decompose(g,f,new Gi),r==="world"&&f.identity(),b.compose(g,f,w),_.current=Dh(T.current,G),D(),s()},[g,b,f,s,r,D,w]),W=Kr(()=>{if(!v.current)return;v.current=!1,V();let U=_.current;if(_.current=null,U?.length)C.current=requestAnimationFrame(()=>{C.current=null,A.current(!1)}),B.current(U);else{for(let G of S.current)tn(G);s(),A.current(!1)}S.current=[]},[s,V]);Mk(()=>{(!i&&R.current||!n&&v.current&&!R.current)&&W()},[i,n,W]);let he=Kr(U=>{let G=U.clone().project(l);return{x:u.left+(G.x*.5+.5)*u.width,y:u.top+(-G.y*.5+.5)*u.height}},[l,u]),ae=Kr(U=>{if(!i)return;U.stopPropagation(),U.preventDefault(),U.currentTarget.setPointerCapture(U.pointerId),O();let G=he(g);R.current={pointerId:U.pointerId,target:U.currentTarget,centerScreen:G,startDistance:Math.max(1,Math.hypot(U.clientX-G.x,U.clientY-G.y))}},[O,g,he,i]),te=Kr(U=>{let G=R.current;if(!G||U.pointerId!==G.pointerId)return;U.stopPropagation();let J=Math.hypot(U.clientX-G.centerScreen.x,U.clientY-G.centerScreen.y),se=Math.max(Ek,J/G.startDistance),Ee=new Gi().setFromMatrixPosition(P.current),X=new bs().makeTranslation(...Ee.toArray()).multiply(new bs().makeScale(se,se,se)).multiply(new bs().makeTranslation(...Ee.clone().negate().toArray()));_.current=Dh(T.current,X,se),D(),s()},[s,D]),ve=Kr(U=>{U.pointerId===R.current?.pointerId&&(U.stopPropagation(),W())},[W]);return Ak("group",{children:[ys(Ck,{matrix:b,autoTransform:!1,fixed:!0,scale:90,lineWidth:3,axisColors:["#ff2d6f","#64dfa6","#2f8fe8"],hoveredColor:"#ffd84d",opacity:.95,depthTest:!1,disableAxes:!n,disableSliders:!n,disableRotations:!n,disableScaling:!0,onDragStart:O,onDrag:(U,G,J,se)=>k(G,se),onDragEnd:W}),i&&ys("group",{ref:M,children:ys(Sk,{children:ys("div",{onPointerDown:ae,onPointerMove:te,onPointerUp:ve,onPointerCancel:ve,title:"Drag to resize",style:{position:"absolute",transform:"translate(-50%, -50%)",width:24,height:24,borderRadius:"50%",display:"flex",alignItems:"center",justifyContent:"center",background:"#113456",border:"2px solid #ffffff",boxShadow:"0 1px 4px rgba(0,0,0,0.4)",cursor:"nwse-resize",touchAction:"none",pointerEvents:"auto"},children:ys(Pk,{size:13,color:"#ffffff"})})})})]})}import{Vector3 as Rk}from"three";function kk(e){let t=e.object;if(!t.isSkinnedMesh||!e.face||!t.skeleton)return null;let r=t.geometry,n=r.getAttribute("skinIndex"),i=r.getAttribute("skinWeight"),o=r.getAttribute("position");if(!n||!i||!o)return null;let a=t.worldToLocal(e.point.clone()),s=[e.face.a,e.face.b,e.face.c],l=new Rk,u=s[0],d=1/0;for(let h of s){l.fromBufferAttribute(o,h);let m=l.distanceToSquared(a);m<d&&(d=m,u=h)}let p=n.getComponent(u,0),c=i.getComponent(u,0);for(let h=1;h<4;h++){let m=i.getComponent(u,h);m>c&&(c=m,p=n.getComponent(u,h))}return t.skeleton.bones[p]??null}function xw(e){let t=kk(e)??e.object,r=ma(t);if(!r)return null;t.updateWorldMatrix(!0,!1);let n=t.worldToLocal(e.point.clone());return{anchorNodeName:r,anchorLocalPosition:[n.x,n.y,n.z]}}function vw(e,t,r){if(!e.anchorNodeName||!e.anchorLocalPosition)return!1;let n=Nn(t,e.anchorNodeName);return n?(n.updateWorldMatrix(!0,!1),r.set(...e.anchorLocalPosition).applyMatrix4(n.matrixWorld),!0):!1}import{useEffect as Dk,useMemo as Ih,useRef as ww}from"react";import{useFrame as Lk,useThree as Ok}from"@react-three/fiber";import{Vector3 as Bh}from"three";function Gc({annotation:e,enabled:t,controlsRef:r,offsetRef:n}){let i=Ok(c=>c.scene),o=ww(null),a=ww(!1),s=Ih(()=>new Bh,[]),l=Ih(()=>new Bh,[]),u=Ih(()=>new Bh,[]),d=e?.anchorNodeName,p=e?.anchorLocalPosition;return Dk(()=>{o.current=null,a.current=!1},[d,e?.id]),Lk(()=>{let c=r.current,h=n.current;if(!t||!c||!h||!d||!p){a.current=!1;return}let m=o.current;if((!m||!m.parent)&&(m=Nn(i,d),o.current=m),!m){a.current=!1;return}m.updateWorldMatrix(!0,!1),s.set(p[0],p[1],p[2]).applyMatrix4(m.matrixWorld),!(a.current&&s.distanceToSquared(l)<1e-8)&&(l.copy(s),a.current=!0,u.copy(s).add(h),c.setLookAt(u.x,u.y,u.z,s.x,s.y,s.z,!0))}),null}import{useCallback as Qr,useEffect as Vo,useMemo as Fo,useRef as jh,useState as ri}from"react";import{Box3 as Ik,Vector3 as Hc}from"three";function Mw({sceneAnnotations:e,controlledAnnotationCategories:t,onAnnotationCategoriesChange:r,showAnnotationFilters:n,initialCategories:i,controlledActiveAnnotation:o,onActiveAnnotationChange:a,onAnnotationsChange:s,controlsRef:l,sceneRef:u,annotationWorldPositionsRef:d,tourCameraOffsetRef:p,initialCameraStateRef:c,engagement:h,engagementRef:m}){let[g,f]=ri(!1),[b,w]=ri(()=>e??[]);Vo(()=>{if(b.length>0){let ee=b.reduce((we,at)=>Math.max(we,at.id),0);P.current=ee}else P.current=0},[b]);let[y,M]=ri(null),[E,v]=ri({title:"",description:""}),P=jh(0),[T,_]=ri(null),[S,C]=ri(-1),[R,A]=ri(!1),B=jh(null),[N,D]=ri(()=>i),V=t===void 0?N:t,O=Fo(()=>Ig(b,V),[b,V]),k=Fo(()=>[...new Set(b.map(pd))].sort(),[b]),W=n&&k.some(Boolean),he=ee=>{t===void 0&&D(ee),r?.(ee)},ae=Fo(()=>[...O].sort((ee,we)=>ee.id-we.id),[O]),te=Fo(()=>JSON.stringify([V?.map(ee=>ee.trim()).sort()??null,ae]),[V,ae]),ve=Fo(()=>S<0||S>=ae.length?null:ae[S],[S,ae]),U=Qr(ee=>{if(o!==void 0){a?.(ee);return}_(ee?{annotation:ee}:null)},[o,a]),G=jh(null),J=Qr(ee=>{let we=l.current,at=u.current;if(!we)return;let st=new Hc,ft=d.current.get(ee.id);ft?st.copy(ft):at&&vw(ee,at,st)||st.set(ee.worldPosition[0],ee.worldPosition[1],ee.worldPosition[2]),p.current=null;let ne=we.smoothTime;we.smoothTime=co(we,.6);let ue=ee.worldNormal;if(al(ee.cameraView))ga(we,ee.cameraView);else{if(at){let Se=new Ik().setFromObject(at),Ie=new Hc;Se.getCenter(Ie);let He=new Hc;Se.getSize(He);let $=He.length()*.2,le;ue?le=new Hc(ue[0],ue[1],ue[2]):le=st.clone().sub(Ie),le.lengthSq()<1e-6&&le.set(0,0,1),le.normalize();let de=Math.max($*.6,.3),Te=st.clone().add(le.multiplyScalar(de));we.setPosition(Te.x,Te.y,Te.z,!0),ee.anchorNodeName&&ee.anchorLocalPosition&&(p.current=Te.clone().sub(st))}we.setTarget(st.x,st.y,st.z,!0),G.current&&xi(we,G.current)}B.current&&clearTimeout(B.current),B.current=setTimeout(()=>{we.smoothTime=ne,B.current=null},800),U(ee)},[U]),se=Qr(()=>{ae.length!==0&&(l.current&&(G.current=uo(l.current)),h.startTour(ae.length),f(!0),C(0),J(ae[0]))},[ae,J,h]),Ee=Qr(()=>{if(ae.length===0||S<0)return;A(!0);let ee=(S-1+ae.length)%ae.length;C(ee),J(ae[ee]),setTimeout(()=>A(!1),500)},[S,ae,J]),X=Qr(()=>{if(ae.length===0||S<0)return;if(S===ae.length-1){if(h.completeTour(),f(!1),C(-1),U(null),l.current&&c.current){let we=c.current;ga(l.current,{...G.current,...we}),G.current=null}return}A(!0);let ee=S+1;C(ee),J(ae[ee]),setTimeout(()=>A(!1),500)},[S,ae,J,U,h]),ie=Qr(()=>{if(h.stopTour(),f(!1),C(-1),U(null),l.current&&c.current){let ee=c.current;ga(l.current,{...G.current,...ee}),G.current=null}},[U,h]);Vo(()=>{m.current.stopTour("annotations-changed"),G.current&&l.current&&(ga(l.current,{...G.current,...c.current??{}}),G.current=null),p.current=null,C(-1),f(!1)},[te]),Vo(()=>()=>{B.current&&clearTimeout(B.current)},[]),Vo(()=>{ve&&g&&G.current&&U(ve)},[ve,U,g]),Vo(()=>{if(e===void 0)return;let ee=e.map(we=>({...we,localPosition:we.localPosition??we.worldPosition}));w(ee)},[e]);let Ce=Qr(()=>{if(o!==void 0){a?.(null);return}_(null)},[o,a]),Ge=o!==void 0?o:T?.annotation??null,Q=Fo(()=>Ge?O.find(we=>we.id===Ge.id)??null:null,[Ge,O]);Vo(()=>{Ge&&!Q&&Ce()},[Ge,Q,Ce]);let ot=Qr(()=>{if(!y||!E.title.trim())return;P.current+=1;let we={id:P.current,worldPosition:y.worldPosition,localPosition:y.localPosition,worldNormal:y.worldNormal,anchorNodeName:y.anchor?.anchorNodeName,anchorLocalPosition:y.anchor?.anchorLocalPosition,title:E.title.trim(),description:E.description},at=[...b,we];w(at),s?.(at),M(null)},[y,E,b,s]),rt=Qr(()=>M(null),[]),Ve=Qr(ee=>{al(ee.cameraView)?J(ee):U(ee)},[U,J]);return{annotations:b,pendingAnnotation:y,setPendingAnnotation:M,annotationForm:E,setAnnotationForm:v,currentAnnotationIndex:S,isNavigating:R,localAnnotationCategories:N,selectedAnnotationCategories:V,visibleAnnotations:O,availableAnnotationCategories:k,annotationFiltersVisible:W,changeAnnotationCategories:he,sortedAnnotations:ae,currentAnnotation:ve,setActiveAnnotation:U,focusAnnotation:J,startGuidedTour:se,goToPreviousAnnotation:Ee,goToNextAnnotation:X,stopGuidedTour:ie,closeViewingAnnotation:Ce,activeAnnotation:Ge,activeViewingAnnotation:Q,isGuidedTourActive:g,handleAnnotationOk:ot,handleAnnotationCancel:rt,handleAnnotationMarkerClick:Ve}}import{useCallback as Wc,useEffect as Sw,useMemo as Bk,useRef as jk}from"react";import{Vector3 as zk}from"three";var Cw=()=>`decal-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`;function Tw({currentObjectBindings:e,currentObjectBindingsRef:t,applyObjectBindings:r,nodeRefsMap:n,controlsRef:i,decalMove:o,decalDragging:a,setDecalDragging:s,setDecalError:l,setDecalControl:u,decalRequestRef:d,onTextureUpload:p,currentPanelObjectId:c,modelUrl:h}){let m=Wc((v,P)=>{let T=t.current,_=T[v];if(!_)return;let S=P(_.decals??[]);r({...T,[v]:{..._,decals:S.length>0?S:void 0}})},[r,e]),g=Bk(()=>{if(!a)return null;let{objectKey:v,decalId:P}=a,T=e[v],_=T?.decals?.find(S=>S.id===P);return _?{objectId:T.modelObjectId??v,decal:_,onCancel:()=>s(null),onCommit:S=>{m(v,C=>C.map(R=>R.id===P?{...R,...S}:R)),s(null)}}:null},[a,e,m]),f=o??g,b=Wc((v,P)=>{d.current++;let T=t.current[v],_=n.current[T?.modelObjectId??v],S=sb(_,i.current?.camera);if(!S)return l("Could not find a surface on this object for the decal."),!1;let C={...P,...S};return m(v,R=>[...R,C]),l(null),u(R=>R&&{...R,activeId:C.id}),s({objectKey:v,decalId:C.id}),!0},[m]),w=Wc(v=>{let P=t.current[v],T=n.current[P?.modelObjectId??v]?.geometry;if(!T)return .2;T.boundingBox||T.computeBoundingBox();let _=T.boundingBox?.getSize(new zk),S=_?Math.max(_.x,_.y,_.z):0;return S>0&&Number.isFinite(S)?S/3:.2},[]),y=jk([]);Sw(()=>()=>{for(let v of y.current)URL.revokeObjectURL(v)},[]);let M=Wc(async(v,P,T)=>{let _=++d.current;s(null);let S;if(p){if(S=await p(T,v),_!==d.current)return}else S=URL.createObjectURL(T),y.current.push(S);b(P,{id:Cw(),image:S,size:w(P)})},[w,p,b]);return Sw(()=>{d.current++,l(null),s(null)},[c,h]),{editDecals:m,activeDecalMove:f,addCenteredDecal:b,decalSizeFor:w,startImageDecal:M,decalControlHandlers:(v,P)=>({onSelect:T=>{d.current++,l(null),s(null),u({...v,activeId:T})},onAddText:(T,_)=>b(P,{id:Cw(),text:T,color:_,size:w(P)}),onAddImage:T=>{M(v.objectId,P,T)},onChange:(T,_)=>m(P,S=>S.map(C=>C.id===T?{...C,..._}:C)),onNudge:(T,_)=>{let S=t.current[P],C=S?.decals?.find(B=>B.id===T);if(!C)return;let R=n.current[S.modelObjectId??P],A=cb(R,i.current?.camera,C,_);if(!A){l("No visible surface in that direction. Try another arrow or rotate the view.");return}l(null),s(null),m(P,B=>B.map(N=>N.id===T?{...N,...A}:N))},onMove:T=>{d.current++,e[P]?.decals?.find(S=>S.id===T)&&(l(null),s(S=>S?.objectKey===P&&S.decalId===T?null:{objectKey:P,decalId:T}))},onRemove:T=>{s(null),m(P,_=>_.filter(S=>S.id!==T)),u({...v,activeId:null})},onClose:()=>{d.current++,l(null),s(null),u(null)}})}}import{useEffect as Nk,useRef as _w}from"react";function Pw({canvasAreaElement:e,controlsRef:t,enabled:r}){let n=_w(new Set),i=_w(null);Nk(()=>{let o=e;if(!o||!r)return;let a=new Set(["w","a","s","d"," ","c"]),s=new Set(["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"]),l=0,u=m=>m.code==="Space"?" ":m.key.toLowerCase(),d=()=>{n.current.clear(),l=0,i.current!==null&&(cancelAnimationFrame(i.current),i.current=null)},p=m=>{let g=t.current,f=n.current;if(!g||f.size===0){i.current=null,l=0;return}let b=l?Math.min((m-l)/1e3,.05):1/60;l=m;let w=Math.max(g.distance*.75,.01)*b;f.has("w")&&g.forward(w,!1),f.has("s")&&g.forward(-w,!1),f.has("a")&&g.truck(-w,0,!1),f.has("d")&&g.truck(w,0,!1),f.has(" ")&&g.truck(0,w,!1),f.has("c")&&g.truck(0,-w,!1),i.current=requestAnimationFrame(p)},c=m=>{if(m.target!==o){d();return}if(s.has(m.key)){let f=t.current;if(!f)return;m.preventDefault();let b=Math.PI/90,w=Math.max(f.distance*.05,.01);m.key==="ArrowUp"?m.shiftKey?f.forward(w,!0):f.rotate(0,-b,!0):m.key==="ArrowDown"?m.shiftKey?f.forward(-w,!0):f.rotate(0,b,!0):m.key==="ArrowLeft"?f.rotate(-b,0,!0):f.rotate(b,0,!0);return}let g=u(m);a.has(g)&&(m.preventDefault(),n.current.add(g),i.current===null&&(i.current=requestAnimationFrame(p)))},h=m=>{n.current.delete(u(m))};return o.addEventListener("keydown",c),o.addEventListener("keyup",h),o.addEventListener("blur",d),()=>{o.removeEventListener("keydown",c),o.removeEventListener("keyup",h),o.removeEventListener("blur",d),d()}},[e,t,r])}import{useCallback as Uo,useEffect as zh,useRef as Go}from"react";var Ew=1,Vk=4,Fk=.0015,Uk=.1,Gk=8;function Aw({moveZoomTarget:e,setMoveZoomTarget:t,currentObjectBindingsRef:r,materialRefsOut:n,rendererCaptureRef:i,canvasAreaRef:o,canvasAreaElement:a,applyBindingStyle:s}){let l=Go(null),u=Go(!1),d=Go([0,0]),p=Go([0,0]),c=Go(1),h=Go(null),m=Uo((M,E)=>{let v=e;if(!v)return;let P=r.current[v.objectKey]?.style?.material?.[v.textureKey],T=P?.path;if(!T)return;let _=P?.rotation??0,S=Tr(v.textureKey),C=Ta(T,S),R=n.current[v.objectKey],A=Array.isArray(R)?R:R?[R]:[],B=Zs[v.textureKey];for(let N of A){let D=N;B in D&&(D[B]=Pl(D.userData,v.textureKey,C,T,M,E,_))}i.current?.invalidate()},[e]),g=Uo(M=>{if(!e)return;M.currentTarget.setPointerCapture?.(M.pointerId),l.current={x:M.clientX,y:M.clientY},u.current=!1;let E=r.current[e.objectKey]?.style?.material?.[e.textureKey];if(d.current=E?.offset??[0,0],p.current=d.current,c.current=E?.scale??1,h.current===null){let v=()=>{i.current?.invalidate(),h.current=requestAnimationFrame(v)};h.current=requestAnimationFrame(v)}},[e]),f=Uo(M=>{if(!e||!l.current)return;let E=o.current,v=E?.clientWidth||1,P=E?.clientHeight||1,T=M.clientX-l.current.x,_=M.clientY-l.current.y;if(!u.current&&Math.hypot(T,_)<Vk)return;u.current=!0;let S=-(T/v)*Ew,C=_/P*Ew,[R,A]=d.current,B=[R+S,A+C];p.current=B,m(B,c.current),s(e.objectKey,N=>({...N,material:{...N?.material,[e.textureKey]:{...N?.material?.[e.textureKey],path:r.current[e.objectKey]?.style?.material?.[e.textureKey]?.path,offset:B}}}))},[e,m,s]),b=Uo(M=>{if(!e)return;M.target?.releasePointerCapture?.(M.pointerId),h.current!==null&&(cancelAnimationFrame(h.current),h.current=null);let E=u.current,v=e;if(E){s(v.objectKey,P=>({...P,material:{...P?.material,[v.textureKey]:{...P?.material?.[v.textureKey],path:r.current[v.objectKey]?.style?.material?.[v.textureKey]?.path,offset:p.current}}})),l.current=null,u.current=!1;return}l.current=null,t(null)},[e,s]);zh(()=>{if(!e)return h.current!==null&&(cancelAnimationFrame(h.current),h.current=null),()=>{h.current!==null&&(cancelAnimationFrame(h.current),h.current=null)}},[e]),zh(()=>{let M=a;if(!(!M||!e))return M.addEventListener("pointermove",f),M.addEventListener("pointerup",b),M.addEventListener("pointercancel",b),()=>{M.removeEventListener("pointermove",f),M.removeEventListener("pointerup",b),M.removeEventListener("pointercancel",b)}},[a,e,f,b]);let w=Uo(M=>{if(!e)return;M.preventDefault();let E=e,v=Math.exp(-M.deltaY*Fk),P=Math.min(Gk,Math.max(Uk,c.current*v));c.current=P,m(p.current,P),s(E.objectKey,T=>({...T,material:{...T?.material,[E.textureKey]:{...T?.material?.[E.textureKey],path:r.current[E.objectKey]?.style?.material?.[E.textureKey]?.path,scale:P}}}))},[e,m,s]);return zh(()=>{let M=a;if(!(!M||!e))return M.addEventListener("wheel",w,{passive:!1}),()=>M.removeEventListener("wheel",w)},[a,e,w]),{beginMoveZoom:Uo(M=>{u.current=!1,l.current=null,t(M)},[t]),handleMoveZoomPointerDown:g}}import{useFrame as Hk,useThree as Wk}from"@react-three/fiber";var Xk=.2;function Nh({enabled:e,speed:t,controlsRef:r}){let n=Wk(i=>i.invalidate);return Hk((i,o)=>{!e||!r.current||(r.current.rotate(o*Xk*t,0,!1),n())}),null}import{AlertTriangle as xs,RotateCcw as qk,X as Rw}from"lucide-react";import{jsx as Mt,jsxs as ni}from"react/jsx-runtime";function kw({count:e,onDismiss:t}){let r=me();return ni("div",{className:"ri-bindingsMismatchBanner",children:[Mt(xs,{size:14,className:"ri-bindingsMismatchBanner__icon"}),Mt("span",{children:r(e===1?"bindingMismatchOne":"bindingMismatchMany",{count:e})}),Mt("button",{type:"button",className:"ri-bindingsMismatchBanner__dismiss",onClick:n=>{n.stopPropagation(),t()},"aria-label":r("dismiss"),children:Mt(Rw,{size:12})})]})}function Dw({triangles:e,offset:t,onDismiss:r}){let n=me();return ni("div",{className:`ri-largeModelBanner ${t?"ri-largeModelBanner--offset":""}`,children:[Mt(xs,{size:14,className:"ri-largeModelBanner__icon"}),Mt("span",{children:n("largeModelWarning",{millions:Math.round(e/1e6)})}),Mt("button",{type:"button",className:"ri-largeModelBanner__dismiss",onClick:i=>{i.stopPropagation(),r()},"aria-label":n("dismiss"),children:Mt(Rw,{size:12})})]})}function Lw({missing:e,total:t}){let r=me();return ni("div",{className:"ri-uvCheckerBanner",role:"status",children:[Mt(xs,{size:14,className:"ri-uvCheckerBanner__icon"}),ni("span",{children:[e===t?"UV Checker: this model has no UV0 coordinates.":`UV Checker: ${e} of ${t} meshes have no UV0 coordinates.`," ",r("missingUVsAreShownInMagenta")]})]})}function Ow({failure:e,source:t}){return Mt("div",{className:"ri-loadError",role:"alert",children:ni("div",{className:"ri-loadError__card",children:[ni("div",{className:"ri-loadError__header",children:[Mt(xs,{size:16,"aria-hidden":"true"}),Mt("span",{className:"ri-loadError__title",children:e.title})]}),Mt("p",{className:"ri-loadError__detail",children:e.detail}),Mt("p",{className:"ri-loadError__source",children:t}),e.technical&&Mt("p",{className:"ri-loadError__technical",children:e.technical})]})})}function Iw({rebuilding:e,onReload:t}){let r=me();return Mt("div",{className:"ri-contextRecovery",role:"alert",children:ni("div",{className:"ri-contextRecovery__card",children:[Mt(xs,{size:24,"aria-hidden":"true"}),Mt("h2",{children:r(e?"contextRestoringTitle":"contextLostTitle")}),Mt("p",{children:r(e?"contextRestoringMessage":"contextLostMessage")}),ni("button",{type:"button",onClick:t,disabled:e,children:[Mt(qk,{size:16,"aria-hidden":"true"}),r("reloadViewer")]})]})})}import{useCallback as Xc}from"react";function Bw({applyBindingStyle:e,resolveObjectKey:t,onTextureUpload:r,fileInputRef:n,pendingObjectId:i,createdBlobUrls:o,texturePositioning:a,setMoveZoomTarget:s}){let l=Xc((b,w)=>{let y=o.current[b];y&&URL.revokeObjectURL(y),w.startsWith("blob:")?o.current[b]=w:delete o.current[b],e(b,M=>({...M,material:{...M?.material,texture:{path:w}}}))},[e]),u=b=>{let w=b.target.files?.[0],y=i.current;if(!w||!y)return;let M=t(y);M&&(r?r(w,M).then(E=>l(M,E),E=>console.error("onTextureUpload failed:",E)):l(M,URL.createObjectURL(w)),b.target.value="")},d=b=>{i.current=b,n.current?.click()},p=b=>{let w=t(b);if(!w)return;e(w,M=>M?.material?.texture?{...M,material:{...M.material,texture:void 0}}:M);let y=o.current[w];y&&(URL.revokeObjectURL(y),delete o.current[w])},c=!!a,h=typeof a=="object"?a:void 0,m=Xc((b,w,y)=>{if(h?.onOffsetChange){h.onOffsetChange(b,w,y);return}e(b,M=>{let E=M?.material?.texture;if(!E?.path)return M;let v=E.offset??[0,0],P=[v[0],v[1]];return P[w]=y,{...M,material:{...M?.material,texture:{...E,offset:P}}}})},[e,h]),g=Xc((b,w)=>{if(h?.onRotationChange){h.onRotationChange(b,w);return}e(b,y=>{let M=y?.material?.texture;if(!M?.path)return y;let E=(w%360+360)%360;return{...y,material:{...y?.material,texture:{...M,rotation:E*Math.PI/180}}}})},[e,h]),f=Xc(()=>{s(null),h?.onEndPositioning?.()},[h]);return{handleFileChange:u,triggerFileUpload:d,clearTexture:p,texturePositioningEnabled:c,texturePositioningOverrides:h,setMaterialTextureOffset:m,setMaterialTextureRotation:g,endMaterialTexturePositioning:f}}function jw({materialPopup:e,resolveObjectKey:t,currentObjectBindings:r,nodeRefsMap:n,moveZoomTarget:i,texturePositioningEnabled:o,texturePositioningOverrides:a,setMaterialTextureOffset:s,setMaterialTextureRotation:l,endMaterialTexturePositioning:u}){let d=e?t(e.objectId):null,p=d?r[d]?.style?.material?.texture?.path:void 0,c=p?Jb(p)??p:void 0,h=Qf(d?n.current[d]:null),m=o?a?.offset??(d?r[d]?.style?.material?.texture?.offset:void 0):void 0,g=o?a?.rotationDegrees??(d?((r[d]?.style?.material?.texture?.rotation??0)*180/Math.PI%360+360)%360:0):0,f=o?a?.isPositioning??!!(d&&i?.objectKey===d&&i?.textureKey==="texture"):!1;return{materialTextureUrl:c,materialTargetTakesImage:h,materialTextureOffset:m,materialTextureRotationDegrees:g,isMaterialTexturePositioning:f,materialTextureOnOffsetChange:o?s:void 0,materialTextureOnRotationChange:o?l:void 0,materialTextureOnEndPositioning:o?u:void 0}}import{useCallback as Vh,useRef as $k}from"react";var qc=e=>e==="#000000"?"#ffffff":e;function zw({nodeRefsMap:e,currentObjectBindingsRef:t,applyObjectBindings:r}){let n=$k({}),i=Vh(a=>{let s=Ib(e.current[a]),l=t.current[a]?.style?.material,u=l?.emissive??s.color,d=l?.emissiveIntensity??s.intensity;return{color:u,intensity:d,on:u!=="#000000"&&d>0}},[]),o=Vh((a,s)=>{let l=t.current,u=l[a];u&&r({...l,[a]:{...u,style:{...u.style,material:{...u.style?.material,...s}}}})},[r]);return{glowMemoryRef:n,readObjectGlow:i,applyGlow:o}}function Nw({setCurrentAction:e,bindingKeyIndex:t,currentObjectBindings:r,applyObjectBindings:n,resolveObjectKey:i,closeColorPicker:o,setColorPicker:a,setMaterialPopupsByObject:s,setItemMaterials:l,getPopoverPosition:u,decalRequestRef:d,setDecalError:p,setDecalDragging:c,setDecalControl:h,resolvedSceneConfigRef:m,applyLightPatches:g,readObjectGlow:f,applyGlow:b,glowMemoryRef:w,setLightControl:y,onAction:M}){return Vh(E=>{let{objectId:v,action:P,binding:T}=E;switch(e(E),P.id){case"toggle-visibility":{let _=v;T?.modelObjectId&&(_=t.byModelObjectId.get(T.modelObjectId)??_);let S=r[_],C=S?.visible===!1;S&&n({...r,[_]:{...S,visible:C}});break}case"change-color":o(),s(_=>{if(!(v in _))return _;let S={..._};return delete S[v],S}),l(_=>{let S=i(v,T)??v,C=_[v]?.hex,R=r[S]?.style?.material?.baseColor;return{..._,[v]:{..._[v],hex:C??R??"#ffffff"}}}),a(u(v,225,250,T,E));break;case"change-material":o(),s(_=>{if(v in _){let S={..._};return delete S[v],S}return{..._,[v]:u(v,300,320,T,E)}});break;case"add-text":case"add-image":{o();let _=P.id;d.current++,p(null),c(null),h(S=>S?.objectId===v&&S.kind===_?null:{objectId:v,kind:_,activeId:null});break}case"toggle-light":case"change-light-color":case"set-brightness":{let _=i(v,T);if(!_)break;let S=Ob(m.current,r,_);if(P.id==="toggle-light"){if(S.length>0){let B=!S.some(N=>N.visible);g(Object.fromEntries(S.map(N=>[N.id,{visible:B}])));break}let A=f(_);A.on?(w.current[_]=A.intensity,b(_,{emissiveIntensity:0})):b(_,{emissive:qc(A.color),emissiveIntensity:w.current[_]??1});break}let C=P.id,R=S.length>0?null:f(_);y(A=>A?.objectId===v&&A.kind===C?null:{objectId:v,kind:C,target:R?{type:"glow",objectKey:_,baseIntensity:R.on?R.intensity:w.current[_]??1}:{type:"lights",lightIds:S.map(B=>B.id),baseIntensity:Object.fromEntries(S.map(B=>[B.id,B.intensity]))},percent:R&&!R.on?0:100});break}default:break}M?.(E)},[n,b,g,f,r,u,M,o,i,t])}import{useId as Yk}from"react";import{Box as Kk,Camera as Qk,ChevronLeft as Jk,ChevronRight as Zk,Download as eD,FileImage as tD,Maximize as rD,Minimize as nD,Orbit as iD,Play as Vw,Square as oD}from"lucide-react";import{Fragment as vs,jsx as ge,jsxs as Je}from"react/jsx-runtime";function Fw({categories:e,selected:t,disabled:r,onChange:n}){let i=me();return Je("div",{className:"ri-annotationFilters",role:"group","aria-label":i("annotationCategories"),onPointerDown:o=>o.stopPropagation(),children:[ge("span",{children:i("annotations")}),ge("button",{type:"button","aria-pressed":t===null,disabled:r,onClick:()=>n(null),children:i("all")}),e.map(o=>ge("button",{type:"button",disabled:r,"aria-pressed":t?.some(a=>a.trim()===o)??!1,onClick:()=>n(t===null?[o]:t.some(a=>a.trim()===o)?t.filter(a=>a.trim()!==o):[...t,o]),children:o||i("uncategorized")},o))]})}function Uw({onCancel:e}){let t=me();return Je("div",{className:"ri-isolationPill",role:"status",onPointerDown:r=>r.stopPropagation(),children:[ge("span",{className:"ri-isolationPill__label",children:t("decalDragHint")}),ge("button",{type:"button",className:"ri-isolationPill__button",onClick:e,children:t("cancel")})]})}function Gw({label:e,onShowAll:t}){let r=me();return Je("div",{className:"ri-isolationPill",onPointerDown:n=>n.stopPropagation(),children:[ge("span",{className:"ri-isolationPill__label",children:e}),ge("button",{type:"button",className:"ri-isolationPill__button",onClick:t,children:r("showAll")})]})}function Hw({groups:e,activeVariants:t,onSelect:r}){let n=me();return ge(vs,{children:e.map((i,o)=>Je("div",{className:"ri-variantPicker",role:"group","aria-label":i.name??n("materialVariants"),onPointerDown:a=>a.stopPropagation(),children:[i.name?ge("span",{className:"ri-variantPicker__group","aria-hidden":"true",children:i.name}):null,i.variants.map(a=>{let s=t.includes(a.name);return Je("button",{type:"button",className:`ri-variantPicker__option ${s?"ri-variantPicker__option--active":""}`,"aria-pressed":s,onClick:()=>r(a.name),children:[a.swatch?ge("span",{className:"ri-variantPicker__swatch",style:{background:a.swatch},"aria-hidden":"true"}):null,a.label]},a.name)})]},i.name??`group-${o}`))})}function Ww({count:e,active:t,index:r,navigating:n,onStart:i,onPrevious:o,onNext:a,onStop:s}){let l=me();return t?Je(vs,{children:[Je("button",{className:"ri-tourButton",onClick:o,disabled:n||e===0||r<=0,title:l("previousAnnotation"),children:[ge(Jk,{size:16}),ge("span",{children:l("previous")})]}),ge("button",{className:"ri-tourButton ri-tourButton--stop",onClick:s,title:l("stopGuidedTour"),children:ge(oD,{size:16})}),Je("button",{className:"ri-tourButton ri-tourButton--next",onClick:a,disabled:n||e===0,title:l("nextAnnotation"),children:[ge("span",{children:l("next")}),ge(Zk,{size:16})]})]}):ge("button",{className:"ri-navButtonSingle",onClick:i,disabled:e===0,title:l("startGuidedTour"),children:l("guidedTour")})}function Xw({fullscreen:e,disabled:t}){let r=me();return Je("div",{className:"mv-fullscreenWrapper",children:[e.error&&ge("div",{className:"mv-fullscreenError",role:"alert",children:r.message(e.error)}),ge("button",{type:"button",className:"mv-fullscreenButton",onClick:()=>{e.toggle()},disabled:e.pending||t,title:e.active?r("exitFullscreen"):r("enterFullscreen"),"aria-label":e.active?r("exitFullscreen"):r("enterFullscreen"),"aria-pressed":e.active,children:e.active?ge(nD,{}):ge(rD,{})})]})}function qw({open:e,current:t,disabled:r,onSelect:n,onToggle:i}){let o=me();return Je("div",{className:"mv-controllersWrapper",onPointerDown:a=>a.stopPropagation(),children:[e&&Je("div",{className:"mv-controllersMenu",children:[ge("button",{type:"button",className:`mv-controllersMenuItem ${t==="orbit"?"mv-controllersMenuItem--active":""}`,onClick:()=>n("orbit"),children:o("orbitControl")}),ge("button",{type:"button",className:`mv-controllersMenuItem ${t==="pointerLock"?"mv-controllersMenuItem--active":""}`,onClick:()=>n("pointerLock"),children:o("pointLock")})]}),ge("button",{className:"mv-controllersButton",onClick:i,title:o("cameraController"),"aria-label":o("cameraControllerSettings"),disabled:r,children:ge(iD,{size:15})})]})}function $w({menu:e,recording:t,hasScene:r,canCaptureImage:n,canRecord:i,hasCinematic:o}){let a=me(),s=Yk(),{isDownloading:l,downloadMenuOpen:u,uvExportError:d,toggleDownloadMenu:p,handleDownloadMesh:c,handleDownloadScreenshot:h,handleDownloadUvLayout:m,handleDownloadVideo:g,videoFormat:f,setVideoFormat:b,videoExportError:w}=e;return Je("div",{className:"mv-downloadWrapper",onPointerDown:y=>y.stopPropagation(),children:[u&&Je("div",{className:"mv-downloadMenu",children:[Je("button",{className:"mv-downloadMenuItem",onClick:c,disabled:l||t||!r,"aria-describedby":s,children:[ge(Kk,{size:14}),a("downloadGLB")]}),ge("p",{className:"mv-downloadMenuDescription",id:s,children:a("downloadGLBDescription")}),ge("div",{className:"mv-downloadMenuDivider"}),n&&Je(vs,{children:[Je("button",{className:"mv-downloadMenuItem",onClick:h,disabled:t||!r,children:[ge(Qk,{size:14}),a("downloadPNG")]}),ge("div",{className:"mv-downloadMenuDivider"})]}),Je("button",{className:"mv-downloadMenuItem",onClick:m,disabled:t||!r,children:[ge(tD,{size:14}),a("downloadUVLayout")]}),ge("div",{className:"mv-downloadMenuDivider"}),Je("label",{className:"mv-downloadMenuItem",children:[a("videoFormat"),Je("select",{"aria-label":a("videoFormat"),value:f,onChange:y=>b(y.target.value),children:[ge("option",{value:"auto",children:a("auto")}),ge("option",{value:"webm",disabled:!ln("webm"),children:"WebM"}),ge("option",{value:"mp4",disabled:!ln("mp4"),children:"MP4"}),ge("option",{value:"gif",disabled:!ln("gif"),children:"GIF"})]})]}),Je("button",{className:"mv-downloadMenuItem",onClick:()=>{g("turntable")},disabled:t||!i||!ln(f),children:[ge(Vw,{size:14}),a("recordTurntableVideo")]}),o&&Je("button",{className:"mv-downloadMenuItem",onClick:()=>{g("cinematic")},disabled:t||!i||!ln(f),children:[ge(Vw,{size:14}),a("recordCinematicVideo")]}),!ln()&&!ln("gif")&&ge("div",{className:"mv-downloadMenuNotice",role:"status",children:a("videoUnsupported")}),w&&ge("div",{className:"mv-downloadMenuNotice",role:"alert",children:a.message(w)}),d&&ge("div",{className:"mv-downloadMenuNotice",role:"status","aria-live":"polite",children:a.message(d)})]}),ge("button",{className:"mv-downloadButton",onClick:p,disabled:l||t||!r,title:a("downloadOptions"),children:l?Je(vs,{children:[ge("span",{className:"mv-downloadButton__spinner"}),a("exporting")]}):Je(vs,{children:[ge(eD,{size:15}),a("download")]})})]})}function Yw({x:e,y:t,form:r,setForm:n,onOk:i,onCancel:o}){let a=me();return Je("div",{className:"ri-annotationPopup",style:{left:e,top:t},onPointerDown:s=>s.stopPropagation(),onClick:s=>s.stopPropagation(),children:[ge("input",{autoFocus:!0,className:"ri-annotationInput",placeholder:a("annotationTitlePlaceholder"),value:r.title,onChange:s=>n(l=>({...l,title:s.target.value})),onKeyDown:s=>{s.key==="Enter"&&i(),s.key==="Escape"&&o()}}),ge("textarea",{className:"ri-annotationTextarea",placeholder:a("description"),value:r.description,onChange:s=>n(l=>({...l,description:s.target.value})),onKeyDown:s=>{s.key==="Escape"&&o()},rows:5}),Je("div",{className:"ri-annotationActions",children:[ge("button",{onClick:i,className:`ri-annotationOkBtn ${r.title.trim()?"":"disabled"}`,disabled:!r.title.trim(),children:a("ok")}),ge("button",{onClick:o,className:"ri-annotationCancelBtn",children:a("cancel")}),ge("div",{className:"ri-annotationIcons"})]})]})}import{QRCodeSVG as aD}from"qrcode.react";import{Box as sD,Expand as lD,FlipVertical2 as cD,Grid3X3 as uD,Pause as dD,Play as pD,QrCode as hD,RectangleGoggles as mD,Slice as fD,Smartphone as Kw,Square as gD,X as bD}from"lucide-react";import{jsx as Pe,jsxs as Ar}from"react/jsx-runtime";function Qw({top:e,xrStore:t,arSupported:r,vrSupported:n,quickLookSupported:i,mobileHandoffUrl:o,mobileHandoffOpen:a,onQuickLook:s,onOpenMobileHandoff:l}){let u=me();return Ar("div",{className:"ri-xrTools",style:{top:`${e}px`},children:[!r&&i&&Ar("button",{type:"button",className:"ri-xrButton",onClick:s,title:u("viewThisModelInARWithAppleQuickLook"),children:[Pe(sD,{size:16}),u("viewInAR")]}),o&&Ar("button",{type:"button",className:"ri-xrButton",onClick:l,title:u("openThisExperienceOnAPhoneForAR"),"aria-haspopup":"dialog","aria-expanded":a,children:[Pe(hD,{size:16}),Pe("span",{children:u("openOnPhone")})]}),t&&r&&Ar("button",{type:"button",className:"ri-xrButton",onClick:()=>t.enterAR().catch(d=>{console.error("Failed to enter AR session:",d)}),title:u("viewThisModelInYourSpace"),children:[Pe(Kw,{size:16}),Pe("span",{children:u("enterAR")})]}),t&&n&&Ar("button",{type:"button",className:"ri-xrButton",onClick:()=>t.enterVR().catch(d=>{console.error("Failed to enter VR session:",d)}),title:u("viewThisModelInVR"),children:[Pe(mD,{size:16}),Pe("span",{children:u("enterVR")})]})]})}function Jw({url:e,onClose:t}){let r=me();return Pe("div",{className:"ri-mobileHandoffBackdrop",onMouseDown:n=>{n.target===n.currentTarget&&t()},children:Ar("section",{className:"ri-mobileHandoffDialog",role:"dialog","aria-modal":"true","aria-labelledby":"ri-mobileHandoffTitle",children:[Pe("button",{type:"button",className:"ri-mobileHandoffClose",onClick:t,"aria-label":r("closePhoneHandoff"),children:Pe(bD,{size:18})}),Pe(Kw,{size:22,"aria-hidden":"true"}),Pe("h2",{id:"ri-mobileHandoffTitle",children:r("viewInAR")}),Pe("p",{children:r("arScanCode")}),Pe("div",{className:"ri-mobileHandoffQr",children:Pe(aD,{value:e,size:208,level:"M",marginSize:4,title:r("qrCodeToOpenThisModelOnAPhone")})})]})})}function Zw({top:e,active:t,onToggle:r}){let n=me();return Pe("div",{className:"ri-uvCheckerTools",style:{top:`${e}px`},children:Pe("button",{type:"button",className:`ri-measureButton ${t?"ri-measureButton--active":""}`,onClick:r,title:n(t?"disableUVChecker":"enableUVChecker"),"aria-label":n(t?"disableUVChecker":"enableUVChecker"),"aria-pressed":t,children:Pe(uD,{size:16})})})}function e1({top:e,open:t,factor:r,onToggleOpen:n,onFactorChange:i}){let o=me();return Ar("div",{className:"ri-explodeTools",style:{top:`${e}px`},children:[Pe("button",{type:"button",className:`ri-measureButton ${t||r>0?"ri-measureButton--active":""}`,onClick:n,title:o("explodedView"),"aria-pressed":t,children:Pe(lD,{size:16})}),t&&Pe("div",{className:"ri-explodeSlider",onPointerDown:a=>a.stopPropagation(),children:Pe("input",{type:"range",min:0,max:100,value:Math.round(r*100),onChange:a=>i(Number(a.target.value)/100),"aria-label":o("explodeAmount")})})]})}function t1({top:e,section:t,onChange:r}){let n=me();return Ar("div",{className:"ri-sectionTools",style:{top:`${e}px`},children:[Pe("button",{type:"button",className:`ri-measureButton ${t.enabled?"ri-measureButton--active":""}`,onClick:()=>r({enabled:!t.enabled}),title:t.enabled?n("removeSectionCut"):n("sectionCut"),"aria-label":n("sectionCut"),"aria-pressed":t.enabled,children:Pe(fD,{size:16})}),t.enabled&&Ar("div",{className:"ri-sectionPanel",onPointerDown:i=>i.stopPropagation(),children:[Pe("div",{className:"ri-sectionAxes",role:"group","aria-label":n("sectionAxis"),children:cg.map(i=>Pe("button",{type:"button",className:`ri-sectionAxis ${t.axis===i?"ri-sectionAxis--active":""}`,"aria-pressed":t.axis===i,onClick:()=>r({axis:i}),children:i.toUpperCase()},i))}),Pe("input",{type:"range",min:0,max:100,value:Math.round(t.position*100),onChange:i=>r({position:Number(i.target.value)/100}),"aria-label":n("sectionPosition")}),Pe("button",{type:"button",className:`ri-sectionAxis ${t.flip?"ri-sectionAxis--active":""}`,"aria-pressed":t.flip,"aria-label":n("keepTheOtherSide"),title:n("keepTheOtherSide"),onClick:()=>r({flip:!t.flip}),children:Pe(cD,{size:14})})]})]})}function r1({top:e,playing:t,disabled:r,onPlay:n,onPause:i,onStop:o}){let a=me();return Ar("div",{className:"ri-cinematicTools",style:{top:`${e}px`},children:[Pe("button",{type:"button",className:`ri-measureButton ${t?"ri-measureButton--active":""}`,disabled:r,onClick:t?i:n,title:a(t?"pauseCinematic":"playCinematic"),"aria-pressed":t,children:t?Pe(dD,{size:16}):Pe(pD,{size:16})}),t&&Pe("button",{type:"button",className:"ri-measureButton ri-measureButton--stop",onClick:o,title:a("stopCinematicAndResetCamera"),children:Pe(gD,{size:16})})]})}function n1({progress:e,onCancel:t}){let r=me();return Pe("div",{className:"ri-recordingOverlay",onPointerDown:n=>n.stopPropagation(),children:Ar("div",{className:"ri-isolationPill",role:"status","aria-live":"polite",children:[Pe("span",{className:"ri-isolationPill__label",children:r("recordingVideo",{progress:e})}),Pe("button",{type:"button",className:"ri-isolationPill__button",onClick:t,children:r("cancel")})]})})}function i1(e){let t={total:0,missing:0};return e.traverse(r=>{let n=r;!n.isMesh||!n.geometry||(t.total+=1,n.geometry.getAttribute("uv")||(t.missing+=1))}),t}import{Box3 as ws,PerspectiveCamera as o1,Sphere as yD,Vector3 as Ho}from"three";function a1(e,t,r,n,i){return!!(e?.usesSlots&&t.usesSlots&&e.url!==t.url&&r.includes(e.url)&&r.includes(t.url)&&n[e.url]&&n[t.url]&&i[e.url]&&i[t.url])}function s1(e,t,r){let n=t?.camera;if(!(n instanceof o1))return null;let o=(e instanceof ws?e:new ws().setFromObject(e)).getSize(new Ho).length();return!Number.isFinite(o)||o<=0?null:(n.near=o/100,n.far=o*100,n.updateProjectionMatrix(),t&&r===void 0&&(t.maxDistance=o*10),o)}function l1(e,t){let r=e.camera;if(!(r instanceof o1)||!(t>0))return;let n=Math.min(Math.max(e.distance/200,t/1e5),t/100);Math.abs(n-r.near)<=r.near*.01||(r.near=n,r.updateProjectionMatrix())}var $c={paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5},Ms={kind:"model"};function c1(e,t){let r=new ws().setFromObject(t);return r.isEmpty()?!1:(r.expandByScalar(r.getSize(new Ho).length()*.05),r.containsPoint(e.getTarget(new Ho)))}function u1(e,t){return e.getTarget(new Ho).distanceTo(t)<=Math.max(e.distance,1)*.001}async function Fh(e,t,r=.6){let n=e.smoothTime;e.smoothTime=co(e,r);try{return await t()}finally{e.smoothTime=n}}async function d1(e,t,{flyIn:r,onStart:n,invalidate:i}){if(r){let o=(t instanceof ws?t:new ws().setFromObject(t)).getBoundingSphere(new yD),a=o.center.clone(),l=e.getPosition(new Ho).clone().sub(e.getTarget(new Ho));l.lengthSq()<1e-6&&l.set(0,0,1),l.normalize();let u=Math.max(o.radius*10,20),d=a.clone().add(l.multiplyScalar(u));await e.setLookAt(d.x,d.y,d.z,a.x,a.y,a.z,!1)}n(),await Fh(e,()=>e.fitToBox(t,!0,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5})),await new Promise(o=>{let a=performance.now(),s=()=>{e.active===!1||performance.now()-a>8e3?(e.dispatchEvent({type:"update"}),i(),o()):(i(),setTimeout(s,100))};setTimeout(s,100)})}import{useEffect as xD}from"react";function p1({enabled:e,canvasAreaElement:t,fitAttemptedRef:r,fitInFlightRef:n,controlsRef:i,cameraFramingRef:o,nodeRefsMap:a,fitScene:s}){xD(()=>{if(!e)return;let l=t;if(!l)return;let u=null,d=new ResizeObserver(()=>{!r.current||n.current||(u&&clearTimeout(u),u=setTimeout(()=>{let p=i.current,c=o.current;if(c.kind==="view"&&p){if(u1(p,c.target))return}else if(c.kind==="object"&&p){let h=a.current[c.key];if(h&&c1(p,h)){p.fitToBox(h,!0,$c).catch(()=>{});return}}s()},150))});return d.observe(l),()=>{d.disconnect(),u&&clearTimeout(u)}},[t,s,e])}import{Fragment as AD,jsx as Y,jsxs as _n}from"react/jsx-runtime";function Gh(e){let r=e.split(/[?#]/)[0].split("/");return(r[r.length-1]||e).replace(/\.[^./]+$/,"")||e}var _D=Object.freeze({});function PD(e){let t=kg(e),r=Ml(t.modelUrl,t.tilesetUrl),n=ye(r);n.current=r;let i=ye(null),o=ye(null),a=fe(()=>{let g=o.current;g&&(i.current=g.snapshot())},[]),s=Rb(a),l=Lb(e),[u,d]=be(null);Ue(()=>()=>{u&&URL.revokeObjectURL(u)},[u]);let p=()=>{a();let g=n.current;o.current?.captureFrame().then(f=>{f&&(g===n.current?d(f):URL.revokeObjectURL(f))})};on(()=>{i.current=null,d(null)},[r]);let c=ye(null),h=qf({loading:t.loading,reveal:t.reveal,rootRef:c,onPark:p}),{release:m}=s;return Ue(()=>{h.live||m()},[h.live,m]),Y(Of,{labels:e.labels,children:Y("div",{className:"ri-viewerSlot",ref:c,children:h.live?Y(ED,{...t,contextRecovery:s,engagement:l,resumeRef:i,viewerHandleRef:o,offscreen:!h.visible,frame:u},s.generation):Y($f,{className:"ri-viewer",background:gd(t.backgroundColor,t.sceneConfig),poster:u??t.poster,onReveal:h.awaitingReveal?h.reveal:void 0})})})}function ED({labels:e,contextRecovery:t,engagement:r,modelUrl:n,tilesetUrl:i,tilesErrorTarget:o=8,tilesCacheSize:a=800,onObjectCatalog:s,modelFormat:l,licenseKey:u,licenseValidationUrl:d,objectBindings:p="auto",selectedObject:c,multiSelectedKeys:h,selectedObjectRefs:m,selectedObjectOutlineColor:g,panelHoveredObject:f,onObjectBindingsChange:b,onObjectSelect:w,onObjectHover:y,onObjectDoubleClick:M,onDecalDoubleClick:E,onObjectContextMenu:v,decalMove:P,onObjectEditLeaseChange:T,onSelectionClear:_,onSceneLoaded:S,onModelLoaded:C,onLoadError:R,onProgress:A,onCameraControllerChange:B,cameraControllerType:N,onAction:D,onHiddenObjectsChange:V,onCameraChange:O,onViewerReady:k,onTextureUpload:W,onAnimationsReady:he,onModelAnimationsReady:ae,onAnnotationsChange:te,activeAnnotation:ve,onActiveAnnotationChange:U,camera:G,cameraLimits:J,backgroundColor:se,shadows:Ee=!0,showObjectBindingDataPanel:X=!0,customObjectBindingDataPanel:ie,customSceneObjectsPanel:Ce,showSceneObjectsPanel:Ge=!0,showDownloadButton:Q=!0,downloadFilename:ot="model",showResetButton:rt=!0,showFullscreenButton:Ve=!1,showLoadingOverlay:ee=!0,showMouseController:we=!1,mouseControllerPosition:at="center-bottom",mouseControllerOpacity:st=1,moveSensitivity:ft=.08,zoomSensitivity:ne=1,sceneConfig:ue,onSceneConfigChange:Se,disableZoom:Ie=!1,zoomOnSelected:He=!0,highlightOnHover:$=!0,enableCameraControls:le=!0,onAutoFit:de,refitOnResize:Te=!0,renderMode:Ye="demand",maxDpr:Be=2,preserveDrawingBuffer:je=!1,webgpu:pe=!1,performanceProfile:_e="auto",dracoDecoderPath:Ae,ktx2TranscoderPath:Ct,meshopt:gr=!0,showMeasureTools:nt=!1,showUvCheckerButton:dt=!1,showExplodeControls:qt=!1,showMaterialVariants:er=!0,showObjectNavigator:Rr=!0,showSectionTools:br=!1,isolation:it,onIsolationChange:tr,showIsolateControls:Pn=!1,cinematic:kr,measurementUnit:Wo="m",enableXR:Jr=!1,usdzUrl:Xo,arScaleMode:Ss="normalized",mobileHandoffUrl:ii,showAnnotationNavigation:qo=!0,showAnnotationOnHover:En=!1,showAnnotationFilters:$o=!0,annotationCategories:Cs,onAnnotationCategoriesChange:Jc,moveModeEnabled:Dr=!1,scaleModeEnabled:Lr=!1,objectTransformSpace:Ts="world",enableKeyboardNavigation:oi=!1,reducedMotion:I="user",showViewGizmo:j=!1,overlay:z,unsafe_sceneChildren:q,autoRotate:H,autoRotateSpeed:oe,onTexturePositioningChange:ce,endTexturePositioningRef:Ze,texturePositioning:ze,extraModelUrls:pt,onExtraModelError:et,onExtraModelLoaded:Fe,originalNodePoses:It,models:Z,mergeModels:gt,onMergeModelLoaded:Nt,onMergeModelError:rr,poster:Hi,resumeRef:Vt,viewerHandleRef:Lt,offscreen:Yo,frame:Wh,onModelChange:Xh}){let Bt=me(),qh=Ml(n,i),[Tt]=be(()=>Vt.current?.model===qh?Vt.current:null),Ko=Cg(I);Ue(()=>()=>r.interrupt(),[r]);let $h=ye(r);$h.current=r;let{autoBindings:Zc,controlled:Yh,currentBindings:Me,applyBindings:yr,bindingsForModel:eu,modelEdits:b1}=bb({modelUrl:n,tilesetUrl:i,models:Z,objectBindings:p,onChange:b,initialBindings:Tt?.objectBindings,initialModelEdits:Tt?.modelBindingEdits}),{isInsideEditor:tu,activeTab:ru,activeSubTab:nu}=dl(),y1=tu&&ru==="scene"&&nu==="Lighting",_s=ob(u,d),[iu,x1]=be(()=>Tt?.lightEdits??{}),[Ps,Kh]=be(Tt?.variantEdit),[Es,Qh]=be(Tt?.sectionEdit),Le=Ot(()=>{let x=_d(ue??ug,iu);return Ps!==void 0&&(x={...x,model:ld(x.model,Ps)}),Es!==void 0&&(x={...x,section:{...ha,...x.section,...Es}}),x},[ue,iu,Ps,Es]),Qo=ye(Le);Qo.current=Le;let ou=Ot(()=>so(Le.model),[Le.model]);Ue(()=>{r.setActiveVariants(ou)},[ou,r]);let v1=ue?so(ue.model).join(`
|
|
75
|
+
`):"";on(()=>{Kh(void 0)},[v1,n]);let w1=JSON.stringify(ue?.section??null);on(()=>{Qh(void 0)},[w1,n]);let Jh=fe(x=>{if(Se){let L=Qo.current;Se({...L,section:{...ha,...L.section,...x}});return}Qh(L=>({...L,...x}))},[Se]),[Zh,M1]=be(!1),em=ye([]),S1=fe(x=>{let L=Qo.current,F=so(L.model),K=em.current,re=K.find(Oe=>Oe.variants.some(Ke=>Ke.name===x)),Ne=F.find(Oe=>re?re.variants.some(Ke=>Ke.name===Oe):Oe===x)??null,ke=F.includes(x)?F.filter(Oe=>Oe!==x):bg(F,x,K);if(r.chooseVariant(ke.includes(x)?x:null,Ne,re?.name??null),Se){Se({...L,model:ld(L.model,ke)});return}Kh(ke)},[Se,r]),au=fe(x=>{if(Se){Se(_d(Qo.current,x));return}x1(L=>{let F={...L};for(let[K,re]of Object.entries(x))F[K]={...L[K],...re};return F})},[Se]),[su,lu]=be(null),[cu,tm]=be(null),[rm,nm]=be(null),im=ye(0),[uu,om]=be(null),[am,sm]=be(Tt?.uvCheckerOverride??null),Jo=Le.model.renderer==="uv-checker",du=dt?am??Jo:Jo,An=Ot(()=>{let x=du?"uv-checker":Jo?"pbr":Le.model.renderer;return x===Le.model.renderer?Le:{...Le,model:{...Le.model,renderer:x}}},[Jo,Le,du]);on(()=>{sm(null)},[n,Le.model.renderer,dt,i]);let lm=Ot(()=>gd(se,Le),[se,Le]),As=Ot(()=>({dracoDecoderPath:Ae,ktx2TranscoderPath:Ct,meshopt:gr}),[Ae,Ct,gr]),C1=Ot(()=>Xf(_e),[_e]),Re=ye(null),[cm,T1]=be(()=>Tt&&Tt.cameraControllerType!=="pointerLock"?Tt.cameraControllerType:"orbit"),[_1,um]=be(!1),ai=N!==void 0?N:cm,Rs=fe(x=>{um(!1),x!==ai&&(T1(x),B?.(x))},[ai,B]),[Zo,dm]=be(!1),pm=ye({dragging:!1,endedAt:-1/0}),hm=fe(x=>{pm.current={dragging:x,endedAt:x?-1/0:performance.now()},dm(x)},[]),[Ft,ea]=be(null),ta=!!(ze||ce||Ze),mm=ye(ce);mm.current=ce,Ue(()=>{mm.current?.(Ft)},[Ft]),Ue(()=>{if(Ze)return Ze.current=()=>ea(null),()=>{Ze.current=null}},[]),Ue(()=>{Re.current&&(Re.current.dollySpeed=Math.max(ne,0))},[ne]),Ue(()=>{Re.current&&(Re.current.enabled=le&&!Zo&&!Zh&&!Ft)},[le,Zo,Zh,Ft]);let pu=ye(null),hu=ye(new Map),fm=ye(null),P1=ye(null),sr=ye(null),gm=ye({});Ue(()=>()=>{for(let x of Object.values(gm.current))URL.revokeObjectURL(x)},[]);let _t=ye({}),Wi=ye(Ms),[E1,A1]=be(0),mu=fe(()=>{A1(x=>x+1)},[]),Xi=ye({}),Pt=!!(Z&&Z.length>=1&&!i),ks=ye(Z);ks.current=Z;let Ds=ye(new Map),{scenesByUrlRef:qi,cameraHomesByUrlRef:Rn,materialRefsByUrlRef:R1,getMaterialRefsForUrl:k1}=mb(Pt,Z),Ls=ye(null),bm=ye(null),Os=Pb(Ve),xr=ye(null),[fu,D1]=be(null),L1=fe(x=>{xr.current=x,D1(x)},[]);Pw({canvasAreaElement:fu,controlsRef:Re,enabled:oi&&le&&!Dr&&!Lr});let Is=ye(null),[si,Bs]=be({}),[ym,gu]=be(null),[js,bu]=be(null),[O1,I1]=be(null),[B1,j1]=be(null),[vr,xm]=be(null),[z1,N1]=be({}),bt=ye(null),$i=ye(null),yu=ye(0),vm=ye(null),[V1,F1]=be(0),Or=ye(!1),ra=ye(!1),xu=ye(null),vu=ye(!!G);vu.current=!!G;let wr=ye(null),zs=ye(Tt?.camera?{camera:Tt.camera,home:Tt.home}:null),[Ns,li]=be(!!n),[ci,ui]=be(!n||!!de||!!G),[Ut,wm]=be(!1),[wu,Mm]=be([]),[Mu,Su]=be(!1),[Sm,Cu]=be(null),[Cm,Yi]=be(!1),[U1,G1]=be(0),Tu=ye(""),Tm=ye(new Set),_m=ye(""),[Pm,Em]=be(!1),_u=ye(new Set),[H1,W1]=be(0),[Pu,X1]=be(null),[q1,Am]=be(!1),[Eu,Rm]=be({total:0,missing:0}),[$1,km]=be("loadingModel"),[Y1,Au]=be(null),Ir=ye({}),Ki=fe(()=>{let x=Re.current;if(!x||wr.current)return;wr.current=Ng(x,$i.current??bt.current);let L=xu.current;L?.usesSlots&&(Rn.current[L.url]=wr.current)},[Rn]),[na,Dm]=be(()=>Tt?.explodeFactor??0),[K1,Lm]=be(!1);on(()=>{Dm(0),Lm(!1)},[n,i]);let Br=Ot(()=>{let x=Le.cinematic,L=x?.enabled?{waypoints:x.waypoints,duration:x.duration,loop:x.loop,autoPlay:x.autoPlay}:null;return kr===void 0?L&&(L.waypoints?.length??0)>=2?L:null:kr===!1?null:kr===!0?L??{}:{...L??{},...kr}},[kr,Le]),[Ru,Gt]=be(!1),[Om,kn]=be(!1),ku=ye(!1);Ue(()=>{Gt(!1),kn(!1),ku.current=!1},[n,i]),Ue(()=>{if(!(!Br?.autoPlay||ku.current)&&Ut&&ci&&!Ns){if(ku.current=!0,Ko)return;Gt(!0),kn(!1)}},[Br,Ut,ci,Ns,Ko]);let Q1=fe(()=>{Gt(!1),kn(!0)},[]),{captureVideo:Du,cancelVideo:Lu,isRecording:Im,recording:lt,progress:J1,onProgress:Bm}=_b({rendererCaptureRef:sr,controlsRef:Re,cinematicConfig:Br,ready:t.status==="ready"&&Ut&&ci&&!Ns,modelUrl:`${n}|${i??""}`,onCaptureStart:Q1});Ue(()=>{t.status==="lost"&&(r.interrupt(),Lu(),Gt(!1),Re.current?.stop())},[t.status,Lu,r]);let{xrStore:Z1,presenterRef:eM,arSupported:jm,vrSupported:zm,quickLookSupported:Nm,resolvedMobileHandoffUrl:Vs,isMobileHandoffOpen:Vm,arOverlay:tM,openMobileHandoff:rM,closeMobileHandoff:nM,openQuickLook:iM,handleARStateChange:oM}=Oy({enableXR:Jr,usdzUrl:Xo,mobileHandoffUrl:ii,engagement:r}),Qi=jf(pe),Fm=ye(Qi);Fm.current=Qi;let di=Qi==="webgpu",Fs=di?null:Z1,Um=br||Le.section?.enabled===!0;Ue(()=>{if(!di)return;let x=[Um&&"the section cut",(Dr||Lr)&&"the transform gizmo"].filter(Boolean);x.length!==0&&console.info(`[react-immersive] With WebGPU, ${x.join(" and ")} ${x.length>1?"aren't":"isn't"} available; ${x.length>1?"they need":"it needs"} WebGL.`)},[di,Um,Dr,Lr]);let{annotations:DD,pendingAnnotation:pi,setPendingAnnotation:Gm,annotationForm:aM,setAnnotationForm:Ou,currentAnnotationIndex:sM,isNavigating:lM,localAnnotationCategories:cM,selectedAnnotationCategories:uM,visibleAnnotations:Hm,availableAnnotationCategories:dM,annotationFiltersVisible:Iu,changeAnnotationCategories:pM,sortedAnnotations:Bu,currentAnnotation:Wm,setActiveAnnotation:LD,focusAnnotation:OD,startGuidedTour:hM,goToPreviousAnnotation:mM,goToNextAnnotation:fM,stopGuidedTour:gM,closeViewingAnnotation:Us,activeAnnotation:ID,activeViewingAnnotation:Gs,isGuidedTourActive:ia,handleAnnotationOk:bM,handleAnnotationCancel:yM,handleAnnotationMarkerClick:Xm}=Mw({sceneAnnotations:ue?.annotations,controlledAnnotationCategories:Cs,onAnnotationCategoriesChange:Jc,showAnnotationFilters:$o,initialCategories:Tt?.annotationCategories??null,controlledActiveAnnotation:ve,onActiveAnnotationChange:U,onAnnotationsChange:te,controlsRef:Re,sceneRef:bt,annotationWorldPositionsRef:hu,tourCameraOffsetRef:pu,initialCameraStateRef:wr,engagement:r,engagementRef:$h}),xM=Le.section??ha,qm=er&&Ut&&wu.length>0;em.current=wu;let $m=rt||Q||Ve&&Os.supported||qo&&Bu.length>0;Ir.current=Me,Ue(()=>{if(!Ft)return;let x=Me[Ft.objectKey]?.style?.material?.[Ft.textureKey]?.path;(!ta||!x)&&ea(null)},[Me,ta,Ft]);let ju=ye({}),[Hs,vM]=be({});Ue(()=>{let x={...Hs},L=!1,F=new Set;for(let[K,re]of Object.entries(Me)){F.add(K);let Ne=re.style?.material,ke=ju.current[K]??{},Oe={};for(let yt of jn){let Cr=Ne?.[yt]?.path;Cr&&(Oe[yt]=Cr,Cr!==ke[yt]&&(x[K]!==yt&&(L=!0),x[K]=yt))}let Ke=x[K];if(Ke&&!Oe[Ke]){let yt=jn.find(Cr=>!!Oe[Cr]);yt?x[K]=yt:delete x[K],L=!0}ju.current[K]=Oe}for(let K of Object.keys(x))F.has(K)||(delete x[K],delete ju.current[K],L=!0);L&&vM(x)},[Me]);let wM=Ot(()=>Object.entries(Me).map(([x,L])=>JSON.stringify([x,L.modelObjectId,L.transform??null])).sort().join(""),[Me]),{measureMode:Zr,measureModeRef:Ym,measurePoints:zu,measurementTool:Nu,areaClosed:Vu,measurementError:MM,selectMeasurementTool:SM,undoMeasurementPoint:CM,finishMeasureArea:TM,snapMode:_M,setSnapMode:PM,snapPreview:Km,handleMeasurePointerMove:EM,clearSnapPreview:Qm,showDimensions:Fu,measureBox:Ws,modelBounds:AM,refreshBounds:Jm,clearMeasurements:RM,toggleMeasureMode:kM,toggleDimensions:DM,handleMeasurePointerDown:LM,handleMeasureClick:OM}=Ry({canvasAreaRef:xr,controlsRef:Re,sceneRef:bt,modelUrl:`${n}|${i??""}`,modelRotation:Le.model.rotation,bindingTransformSignature:wM,modelLoaded:Ut,enabled:nt&&!lt}),IM=fe(()=>{if(!Z||Z.length<2)return null;let x=Z.map(L=>{let F=qi.current[L.url];if(!F)return null;let K=L.url===n?Xi.current:R1.current[L.url]?.current??{};return{scene:F,objectBindings:eu(L),matRefs:K}}).filter(L=>L!==null);return x.length>0?x:null},[Z,n,eu]),BM=fe(()=>{if(!Z||Z.length<2)return null;let x=Z.map(L=>{let F=qi.current[L.url];return F?{scene:F,label:L.label||Gh(L.url)}:null}).filter(L=>L!==null);return x.length>0?x:null},[Z]),[jM,zM]=be(34),NM=gy({sceneRef:bt,materialRefs:Xi,rendererCaptureRef:sr,objectBindings:Me,downloadFilename:ot,getAllLoadedModels:IM,getAllLoadedModelUvSources:BM,captureVideo:Du}),Zm=Ot(()=>Object.fromEntries(Object.entries(Me).filter(([,x])=>x.visible===!1).map(([x])=>[x,!0])),[Me]),Dn=Ot(()=>{let x=new WeakMap,L=new Map,F=new Map;for(let[K,re]of Object.entries(Me))x.set(re,K),L.has(re.id)||L.set(re.id,K),F.has(re.modelObjectId)||F.set(re.modelObjectId,K);return{byReference:x,byId:L,byModelObjectId:F}},[Me]),Mr=fe(x=>x?Dn.byReference.get(x)??Dn.byModelObjectId.get(x.modelObjectId)??Dn.byId.get(x.id)??null:null,[Dn]),Uu=c!==void 0,hi=Uu?c??null:B1,qe=Mr(hi);Ue(()=>{r.setSelectedPart(qe)},[qe,r]);let mi=qe?_t.current[qe]??null:null,VM=qe?Hs[qe]:void 0,ef=Mr($?f??js??O1:null),FM=ef?_t.current[ef]??null:null,Gu=m??(h?h.map(x=>_t.current[x]).filter(Boolean):null),Xs=Ot(()=>{let x=Gu??(mi&&Me[qe??""]?.transform?.shear?[mi]:null);if(!x?.length)return null;let L=new Set(x),F=Object.entries(_t.current).filter(([,K])=>L.has(K)).map(([K,re])=>({key:K,node:re,transform:Me[K]?.transform}));return F.length>1||F.some(({transform:K})=>K?.shear)?F:null},[Gu,Me,mi,qe]),tf=fe(x=>{I1(x),y?.(x)},[y]),rf=X&&hi!==null&&qe!==null,fi=(qe?Me[qe]:null)??hi,oa=fi&&(fi.modelObjectId||fi.id)||null,aa=oa?z1[oa]??null:null,[UM,nf]=be(""),of=ye(null);Ue(()=>{let x=of.current;if(x!==qe)if(of.current=qe,qe){let L=fi?.label||hi?.label||qe;nf(Bt("objectSelected",{name:L}))}else x&&nf(Bt("selectionCleared"))},[qe,fi,hi,Bt]),Ue(()=>{V?.(Zm)},[Zm,V]);let Ji=fe((x,L)=>{if(ai==="pointerLock"){Rs("orbit");return}x&&L?r.viewPart({objectId:x.id,objectKey:Mr(x)??(x.modelObjectId||x.id),label:x.label,source:L}):x||r.setSelectedPart(null),Uu||j1(x),w?.(x)},[ai,Rs,Uu,w,Mr,r]),af=ye(Tt?.objectBindings?`${n}
|
|
76
|
+
${i??""}`:null),qs=fe((x,L)=>{if(!Zc)return;let F=`${n}
|
|
77
|
+
${i??""}`,K=af.current===F?Ir.current:_D;af.current=F;let re=_g(x,L);for(let Ne of Object.keys(re))K[Ne]&&(re[Ne]=K[Ne]);yr(re)},[Zc,n,i,yr]),{glowMemoryRef:sf,readObjectGlow:$s,applyGlow:Hu}=zw({nodeRefsMap:_t,currentObjectBindingsRef:Ir,applyObjectBindings:yr}),GM=fe(x=>{let L=qe;if(!L||!x)return;let F=Ir.current[L];F&&yr({...Ir.current,[L]:{...F,transform:{...F.transform,...x}}})},[yr,qe]),HM=fe(x=>{let L=Ir.current,F={...L};for(let{key:K,transform:re}of x){let Ne=L[K];Ne&&(F[K]={...Ne,transform:{...Ne.transform,...re}})}yr(F)},[yr]),Ln=fe((x,L)=>Me[x]?x:L?Mr(L):Dn.byId.get(x)??Dn.byModelObjectId.get(x)??null,[Me,Mr,Dn]),Ys=fe((x,L)=>{let F=Ln(x),K=F?Me[F]:void 0;!F||!K||yr({...Me,[F]:{...K,style:L(K.style)}})},[Ln,Me,yr]),jr=fe(()=>{if(vr){let x=si[vr.objectId]?.hex;x!==void 0&&(Ys(vr.objectId,L=>({...L,material:{...L?.material,baseColor:x}})),Bs(L=>({...L,[vr.objectId]:{}})))}xm(null)},[vr,si,Ys]),Wu=fe(()=>{Ji(null),gu(null),jr()},[Ji,jr]),WM=fe((x,L,F,K,re)=>{let Ne=bm.current,ke=xr.current,Oe=Re.current?.camera;if(!Ne)return{objectId:x,x:24,y:24};let Ke=Ne.getBoundingClientRect(),yt=12,Cr=Ke.width-L-yt,yi=Ke.height-F-yt,In=Math.max(yt,(Ke.width-L)/2),la=Math.max(yt,(Ke.height-F)/2),ro=Ln(x,K),ca=ro?_t.current[ro]:null,cr=(Nr,Vr)=>Vr<=yt?yt:Math.min(Math.max(Nr,yt),Vr);if(ke&&Oe&&ca){let Nr=ke.getBoundingClientRect(),Vr=new Uh;new MD().setFromObject(ca).getCenter(Vr),Vr.project(Oe);let rd=(Vr.x+1)/2*Nr.width+(Nr.left-Ke.left),Bn=(1-Vr.y)/2*Nr.height+(Nr.top-Ke.top);return{objectId:x,x:cr(rd+24,Cr),y:cr(Bn-F/2,yi)}}let zr=typeof re?.screenX=="number"?re.screenX-Ke.left:In,ua=typeof re?.screenY=="number"?re.screenY-Ke.top:la;return{objectId:x,x:cr(zr,Cr),y:cr(ua,yi)}},[Ln]),Ks=Nw({setCurrentAction:gu,bindingKeyIndex:Dn,currentObjectBindings:Me,applyObjectBindings:yr,resolveObjectKey:Ln,closeColorPicker:jr,setColorPicker:xm,setMaterialPopupsByObject:N1,setItemMaterials:Bs,getPopoverPosition:WM,decalRequestRef:im,setDecalError:nm,setDecalDragging:om,setDecalControl:tm,resolvedSceneConfigRef:Qo,applyLightPatches:au,readObjectGlow:$s,applyGlow:Hu,glowMemoryRef:sf,setLightControl:lu,onAction:D});Ue(()=>{if(vr)return window.addEventListener("pointerdown",jr),()=>window.removeEventListener("pointerdown",jr)},[vr,jr]),Ue(()=>{if(!Gs)return;let x=L=>{if(Is.current&&!Is.current.contains(L.target)){if(L.target.closest?.(".ri-annotationMarker"))return;Us()}};return document.addEventListener("mousedown",x),document.addEventListener("touchstart",x),()=>{document.removeEventListener("mousedown",x),document.removeEventListener("touchstart",x)}},[Gs,Us]),Ue(()=>{if(!pi)return;let x=L=>{let F=L.target;if(F.closest?.(".ri-annotationPopup")||F.closest?.("button, input, textarea, .ri-measureTools, .ri-xrTools, .ri-buttonContainer"))return;let K=xr.current;!K||!K.contains(F)||(Gm(null),Ou({title:"",description:""}))};return document.addEventListener("mousedown",x,!0),document.addEventListener("touchstart",x,!0),()=>{document.removeEventListener("mousedown",x,!0),document.removeEventListener("touchstart",x,!0)}},[pi]);let{handleFileChange:XM,triggerFileUpload:lf,clearTexture:cf,texturePositioningEnabled:qM,texturePositioningOverrides:$M,setMaterialTextureOffset:YM,setMaterialTextureRotation:KM,endMaterialTexturePositioning:QM}=Bw({applyBindingStyle:Ys,resolveObjectKey:Ln,onTextureUpload:W,fileInputRef:fm,pendingObjectId:P1,createdBlobUrls:gm,texturePositioning:ze,setMoveZoomTarget:ea}),Xu=ye(k);Xu.current=k;let lr=fe(()=>{let x=Re.current;!x||!Xu.current||Xu.current({objectBindings:Ir.current,homeCameraState:wr.current,captureImage:L=>Im()?Promise.reject(new Error("Wait for video export to finish before capturing an image.")):yl(sr.current,L),captureVideo:Du,invalidate:()=>sr.current?.invalidate(),rendererBackend:Fm.current??"webgl",raw:{controls:x,scene:bt.current,nodes:_t.current}})},[Du,Im]),sa=fe(async(x=!1)=>{let L=Re.current,F=$i.current??bt.current;if(!L||!F)return!1;Wi.current=Ms;try{return await d1(L,F,{flyIn:x,onStart:()=>ui(!0),invalidate:()=>sr.current?.invalidate()}),($i.current??bt.current)!==F?!1:(Or.current=!0,Ki(),lr(),!0)}catch(K){return console.error("Fit scene error:",K),!1}},[Ki,lr]);Ue(()=>{let x={url:n,usesSlots:Pt},L=a1(xu.current,x,(ks.current??[]).map(ke=>ke.url),qi.current,Rn.current);if(xu.current=x,Or.current=!1,ra.current=!1,wr.current=Pt?Rn.current[n]??null:null,bt.current=null,$i.current=null,wm(!1),Mm([]),Su(!1),Cu(null),Yi(!1),Tu.current="",Tm.current=new Set,_u.current=new Set,Rm({total:0,missing:0}),km("loadingModel"),Au(null),Tt?.model!==Ml(n,i)&&(zs.current=null),!n){li(!1),ui(!0);return}if(Pt&&Ds.current.has(n)){li(!1),ui(!0);return}li(!L),ui(L||!!de||vu.current);let F=!1,K=null,re=ke=>{K=setTimeout(Ne,ke)},Ne=()=>{if(F||Or.current||ra.current||Pt&&Ds.current.has(n))return;let ke=$i.current??bt.current;if(!Re.current||!ke){re(100);return}yu.current=s1(ke,Re.current,J?.maxDistance)??yu.current;let Oe=zs.current;if(Oe){zs.current=null,kb(Re.current,Oe.camera),Or.current=!0,Oe.home?(wr.current=Oe.home,Pt&&(Rn.current[n]=Oe.home)):Ki(),lr(),li(!1),ui(!0),sr.current?.invalidate();return}if(Dg(Re.current)||L){Or.current=!0,Ki(),lr(),li(!1),ui(!0),sr.current?.invalidate();return}ra.current=!0,(de?de():vu.current?Promise.resolve(!0):sa(!0)).then(yt=>{F||(Or.current=yt!==!1,Or.current?(Ki(),lr(),li(!1)):F||re(100))}).catch(()=>{Or.current=!1,F||re(100)}).finally(()=>{F||(ra.current=!1)})};return re(50),()=>{F=!0,K&&clearTimeout(K)}},[Ki,Rn,J?.maxDistance,sa,n,lr,de,Tt,i,Pt]),p1({enabled:Te,canvasAreaElement:fu,fitAttemptedRef:Or,fitInFlightRef:ra,controlsRef:Re,cameraFramingRef:Wi,nodeRefsMap:_t,fitScene:sa});let Qs=fe(x=>{let L=Re.current;if(!L)return;let F=x.cameraState;if(F?.position&&F?.target){let[Ne,ke,Oe]=F.position,Ke=new Uh(...F.target);L.setPosition(Ne,ke,Oe,!0),L.setTarget(Ke.x,Ke.y,Ke.z,!0),Wi.current={kind:"view",target:Ke};return}let K=Mr(x),re=K?_t.current[K]:null;!K||!re||(L.fitToBox(re,!0,$c).catch(()=>{}),Wi.current={kind:"object",key:K})},[Mr]);Ue(()=>{qe||(Wi.current=Ms)},[qe]);let qu=fe((x,L="canvas")=>{if(Ym.current)return;let F=pm.current;F.dragging||performance.now()-F.endedAt<150||(Gt(!1),jr(),gu(null),Ji(x,L),!(Ie||!He)&&Qs(x))},[Ji,jr,Qs,Ie,He]),{beginMoveZoom:uf,handleMoveZoomPointerDown:JM}=Aw({moveZoomTarget:Ft,setMoveZoomTarget:ea,currentObjectBindingsRef:Ir,materialRefsOut:Xi,rendererCaptureRef:sr,canvasAreaRef:xr,canvasAreaElement:fu,applyBindingStyle:Ys}),df=fe(x=>{if(!ta)return!1;let L=Mr(x);if(!L)return!1;let F=Hs[L];return F?(uf({objectKey:L,textureKey:F}),!0):!1},[ta,Mr,Hs,uf]),$u=ye(!1),{editDecals:jD,activeDecalMove:Zi,addCenteredDecal:zD,decalSizeFor:ZM,startImageDecal:ND,decalControlHandlers:eS}=Tw({currentObjectBindings:Me,currentObjectBindingsRef:Ir,applyObjectBindings:yr,nodeRefsMap:_t,controlsRef:Re,decalMove:P,decalDragging:uu,setDecalDragging:om,setDecalError:nm,setDecalControl:tm,decalRequestRef:im,onTextureUpload:W,currentPanelObjectId:oa,modelUrl:n}),pf=Ot(()=>wg(Me,An.styleRules),[Me,An.styleRules]),[hf,mf]=be(()=>Tt?.isolation??null);on(()=>{mf(null)},[n]);let eo=it!==void 0?it:hf,Yu=fe(x=>{it===void 0&&mf(x),tr?.(x)},[it,tr]),Sr=Ot(()=>Sg(pf,eo),[pf,eo]),en=Ot(()=>Sr.setAside.size>0?Mg(Me,eo):null,[Sr,Me,eo]),tS=fe(x=>{let L=Mr(x),F=L!==null&&en?.size===1&&en.has(L);Yu(F?null:{...eo,target:x.id})},[Yu,eo,en]),{sourceOf:On}=Sr,rS=Ot(()=>Rr?$0(Me,Sr):[],[Rr,Me,Sr]),Ku=fe(x=>{let L=On(x);qu(L)},[qu,On]),Qu=fe(x=>tf(x&&On(x)),[tf,On]),Ju=fe((x,L)=>{let F=On(x);return M?.({binding:F,...L})===!0?($u.current=!0,!0):df(F)},[M,df,On]),Zu=Ot(()=>v?(x,L)=>v({binding:On(x),...L}):void 0,[v,On]),ff=fe(x=>{Ji(x,"panel"),!Ie&&Qs(x)},[Ji,Qs,Ie]);Ue(()=>{lr()},[lr,Me,E1]);let gf=fe((x,L)=>{l1(L,yu.current),O?.(rn(x,L)),lr()},[lr,O]),nS=fe(x=>{vm.current=new Set(x.map(L=>L.name)),F1(L=>L+1),qs(x.map(L=>L.name)),s?.(x)},[qs,s]),iS=fe(x=>{$i.current=x,sr.current?.invalidate()},[]),to=fe(x=>{bt.current=x,Jm(x),Rm(i1(x));let L=Bf(x);X1(L>od?L:null),Am(!1),Au(null),L>od&&km("preparingLargeModel"),wm(!0),Mm(yg(x)),Su(!1),Cu(null),Em(!1),i||(s&&s(f0(x)),qs(Eg(x),Pg(x))),S?.(x),C?.(vg(x)),lr()},[qs,lr,C,s,S,Jm,i]),ed=fe(x=>{li(!1),ui(!0),Su(!0),Cu(x),R?.(x)},[R]),{reportError:bf,clearError:yf}=pb({enabled:Pt,activeUrl:n,models:Z,errorsRef:Ds,activeFailed:Mu,activeError:Sm,onActiveError:ed,onExtraError:et}),oS=fe((x,L)=>{!Pt||!ks.current?.some(F=>F.url===x)||(delete qi.current[x],delete Rn.current[x],bf(x,L))},[Pt,bf,Rn]),aS=fe((x,L)=>{!Pt||!ks.current?.some(F=>F.url===x)||(yf(x),qi.current[x]=L,x===n&&(Ls.current!==x||bt.current!==L)&&(Ls.current=x,to(L)),Fe?.(x,L))},[Pt,n,to,Fe,yf]);Ue(()=>{if(!Pt||Ds.current.has(n))return;let x=qi.current[n];x&&(Ls.current===n&&bt.current===x||(Ls.current=n,to(x)))},[Pt,n,Ut,to]);let xf=fe((x,L)=>{_u.current.add(x),W1(F=>F+1),Nt?.(x,L)},[Nt]),vf=Pt&&Z?Z.find(x=>x.url===n)?.mergeModels:gt,wf=Ot(()=>new Set((vf??[]).map(x=>x.url)),[vf]),Mf=fe(x=>{x.lengthComputable&&x.total>0&&Au(x.loaded/x.total*100),A?.(x)},[A]),Sf=fe((x,L,F)=>{if(!Se)return;let K={...Le,lighting:{...Le.lighting,lights:Le.lighting.lights.map(re=>re.id===x?{...re,position:L,...F?{rotation:F}:{}}:re)}};Se(K)},[Le,Se]);Ue(()=>{let x=bt.current;if(!Ut||!x){Yi(!1);return}if(Array.from(wf).some(ke=>!_u.current.has(ke))){Yi(!1);return}let F=Object.entries(Me).filter(([,ke])=>!ke.removed);if(F.length===0){Yi(!1);return}let K=i?vm.current:(()=>{let ke=Tm.current;for(let Oe of Object.keys(ao(x).nodesById))ke.add(Oe);return ke})();if(!K||K.size===0){Yi(!1);return}let re=F.map(([ke,Oe])=>Oe.modelObjectId??ke).filter(ke=>!K.has(ke));Yi(re.length>0),G1(re.length);let Ne=re.join(`
|
|
78
|
+
`);if(re.length>0&&Ne!==Tu.current){let ke=re.slice(0,10).map(Ke=>`"${Ke}"`).join(", "),Oe=re.length>10?` and ${re.length-10} more`:"";console.warn(`[react-immersive] ${re.length} object binding(s) point at nodes this model doesn't have, so they can't be selected: ${ke}${Oe}. Each binding's modelObjectId (or its key) must match a node name; log onObjectCatalog to see this model's names.`)}Tu.current=Ne},[Ut,Me,V1,i,wf,H1]),Ue(()=>{if(D||tu)return;let x=[];for(let[F,K]of Object.entries(Me))for(let re of K.actions??[])sd.includes(re.id)||x.push(`"${re.id}" on "${K.label??F}"`);let L=x.join(`
|
|
79
|
+
`);if(x.length>0&&L!==_m.current){let F=x.slice(0,10).join(", "),K=x.length>10?` and ${x.length-10} more`:"";console.warn(`[react-immersive] ${x.length} action button(s) do nothing because ModelViewer has no onAction handler: ${F}${K}. ModelViewer itself handles ${sd.join(", ")}; handle other ids in onAction, or pass useViewerActions().handleAction to run their effects.`)}_m.current=L},[Me,tu,D]);let td=fe(async()=>{if(Re.current&&wr.current&&xi(Re.current,wr.current),de){await de();return}let x=Re.current;if(!x)return;let L=wr.current;try{if(L){Wi.current=Ms;let F=sl(L,x);await Fh(x,()=>x.setLookAt(F[0],F[1],F[2],L.target[0],L.target[1],L.target[2],!0))}else await sa()}catch(F){console.error("Reset camera error:",F)}},[de,sa]),VD=fe(()=>{kn(!1),Gt(!0)},[]),FD=fe(()=>{Gt(!1)},[]),sS=fe(()=>{Gt(!1),kn(!0),setTimeout(()=>{td()},100)},[td]),lS=fe((x,L)=>{gf(x,L)},[gf]),cS=fe(x=>{if(Ym.current)return;if($u.current){$u.current=!1;return}let L=ru==="scene"&&nu==="Annotations";if(x.target.closest("button, input, textarea, .ri-colorPicker, .ri-materialPicker, .ri-annotationPopup, .ri-annotationMarker, .ri-viewAnnotationPopup"))return;let K=xr.current,re=Re.current,Ne=re?.camera,ke=bt.current;if(!K||!re||!Ne||!ke||!L&&!re.enabled)return;let Oe=K.getBoundingClientRect(),Ke=(x.clientX-Oe.left)/Oe.width*2-1,yt=-((x.clientY-Oe.top)/Oe.height)*2+1,Cr=new SD;Cr.setFromCamera(new CD(Ke,yt),Ne);let yi=Cr.intersectObject(ke,!0);if(yi.length===0)return;if(!L&&E){let cr=yi[0].point,zr=null;for(let[ua,Nr]of Object.entries(Ir.current)){if(!Nr.decals?.length)continue;let Vr=_t.current[ua];if(!Vr)continue;let rd=Vr.worldToLocal(cr.clone());for(let Bn of Nr.decals){if(!Bn.position)continue;let nd=rd.distanceTo(new Uh(Bn.position[0],Bn.position[1],Bn.position[2]));nd<=Bn.size/2&&(!zr||nd<zr.distance)&&(zr={binding:Nr,id:Bn.id,distance:nd})}}if(zr){ea(null),E(zr.binding,zr.id);return}}if(!L){let{x:cr,y:zr,z:ua}=yi[0].point;re.setOrbitPoint(cr,zr,ua);return}let In=yi[0],la=In.point,ro=ke.worldToLocal(In.point.clone()),ca=[0,0,1];if(In.face){let cr=In.face.normal.clone().transformDirection(In.object.matrixWorld).normalize();ca=[cr.x,cr.y,cr.z]}Gm({worldPosition:[la.x,la.y,la.z],localPosition:[ro.x,ro.y,ro.z],worldNormal:ca,anchor:xw(In),screenX:x.clientX-Oe.left,screenY:x.clientY-Oe.top}),Ou({title:"",description:""})},[ru,nu,E]);if(Ue(()=>{Lt.current={snapshot:()=>{let x=Re.current,L=zs.current;return{model:qh,camera:Or.current&&x?uo(x):L?.camera,home:wr.current??L?.home,lightEdits:iu,variantEdit:Ps,sectionEdit:Es,isolation:hf,objectBindings:Yh||Pt?void 0:Me,modelBindingEdits:Yh?void 0:b1,explodeFactor:na,cameraControllerType:cm,uvCheckerOverride:am,annotationCategories:cM}},captureFrame:()=>{let x=sr.current;return!x||t.status!=="ready"||!Ut||!ci?Promise.resolve(null):Uf(x)}}}),Ue(()=>()=>{Lt.current=null},[Lt]),_s.status==="checking"){let x=Wh??Hi;return x?Y("div",{className:"ri-viewer ri-viewerPlaceholder",style:{background:lm},children:Y(ad,{src:x})}):Y("div",{className:"ri-viewer ri-viewer--license-checking",children:Y(cl,{title:Bt("verifyingLicense"),message:Bt("checkingYourLicenseKey")})})}if(_s.status==="invalid")return Y("div",{className:"ri-viewer ri-viewer--license-invalid",children:Y(cl,{tone:"error",title:Bt("invalidLicense"),message:_s.isLocalDomain?_s.reason??Bt("licenseHasBeenRevokedOrHasExpired"):Bt("failedToLoadPleaseContactTheSiteAdministrator")})});let{materialTextureUrl:Cf,materialTargetTakesImage:Tf,materialTextureOffset:_f,materialTextureRotationDegrees:Pf,isMaterialTexturePositioning:Ef,materialTextureOnOffsetChange:Af,materialTextureOnRotationChange:Rf,materialTextureOnEndPositioning:kf}=jw({materialPopup:aa,resolveObjectKey:Ln,currentObjectBindings:Me,nodeRefsMap:_t,moveZoomTarget:Ft,texturePositioningEnabled:qM,texturePositioningOverrides:$M,setMaterialTextureOffset:YM,setMaterialTextureRotation:KM,endMaterialTexturePositioning:QM}),uS=xr.current?.offsetWidth??600,dS=xr.current?.offsetHeight??400,pS=350,hS=290,mS=pi?Math.min(pi.screenX+12,uS-pS-8):0,fS=pi?Math.min(pi.screenY,dS-hS-8):0,gS=ee&&!!n&&!Mu&&!Ut,gi=Jr&&(Fs&&(jm||zm)||Nm||!!Vs),Df=(gi?1:0)+(dt?1:0),bi=x=>16+x*42+(nt&&x>Df?Math.max(0,jM-34):0);return _n("div",{className:"ri-viewer",ref:Os.rootRef,style:{background:lm},"data-reduced-motion":Ko?"":void 0,children:[Y("div",{className:"ri-visuallyHidden",role:"status","aria-atomic":"true",children:UM}),t.status!=="ready"&&Y(Iw,{rebuilding:t.status==="rebuilding",onReload:t.reload}),_n("div",{className:"ri-viewerLeft",ref:bm,inert:t.status!=="ready",children:[ie?ie({isOpen:rf,selectedObject:fi,currentAction:ym,onClose:Wu,onAction:Ks}):Y(xh,{translateDefaultActions:Zc,isOpen:rf,selectedObject:fi,currentAction:ym,onClose:Wu,onAction:Ks,renderActionExtra:x=>{if(x==="change-color"&&vr)return Y(mh,{inline:!0,colorPicker:vr,onClose:jr,itemMaterials:si,setItemMaterials:Bs});if((x==="change-light-color"||x==="set-brightness")&&su?.kind===x&&su.objectId===oa){let L=su,F=L.target,K=F.type==="lights"?Le.lighting.lights.find(re=>re.id===F.lightIds[0])?.color??"#ffffff":qc($s(F.objectKey).color);return Y(jb,{kind:L.kind,color:K,brightness:L.percent,onColorChange:re=>{if(F.type==="lights"){au(Object.fromEntries(F.lightIds.map(ke=>[ke,{color:re}])));return}let Ne=$s(F.objectKey);Hu(F.objectKey,{emissive:re,emissiveIntensity:Ne.intensity>0?Ne.intensity:sf.current[F.objectKey]??1})},onBrightnessChange:re=>{if(lu({...L,percent:re}),F.type==="lights"){au(Object.fromEntries(F.lightIds.map(Ne=>[Ne,{intensity:(F.baseIntensity[Ne]??0)*(re/100)}])));return}Hu(F.objectKey,{emissive:qc($s(F.objectKey).color),emissiveIntensity:F.baseIntensity*(re/100)})},onClose:()=>lu(null)})}if((x==="add-text"||x==="add-image")&&cu?.kind===x&&cu.objectId===oa){let L=cu,F=Ln(L.objectId);if(!F)return null;let K=x==="add-image";return Y(Gb,{kind:x,decals:(Me[F]?.decals??[]).filter(re=>!!re.image===K),activeId:L.activeId,error:rm?Bt.message(rm):null,moving:uu?.objectKey===F&&uu.decalId===L.activeId,defaultSize:ZM(F),...eS(L,F)})}return x==="change-material"&&aa?Y(fh,{inline:!0,triggerFileUpload:lf,materialPopup:aa,textureUrl:Cf,clearTexture:cf,canPlaceImage:Tf,offset:_f,rotationDegrees:Pf,onOffsetChange:Af,onRotationChange:Rf,isPositioning:Ef,onEndPositioning:kf}):null}}),_n("div",{className:`ri-canvasArea ${Zr?"ri-canvasArea--measuring":""} ${ci?"":"ri-canvasArea--positioning"} ${Dr||Lr?"ri-canvasArea--moveMode":""}`,ref:L1,tabIndex:oi?0:void 0,role:oi?"group":void 0,"aria-label":oi?Bt("cameraKeyboardHelp"):void 0,onDoubleClick:cS,onPointerDown:x=>{if(oi&&xr.current?.focus({preventScroll:!0}),Ft){JM(x);return}LM(x)},onClick:Ft?void 0:OM,onPointerMove:EM,onPointerLeave:Qm,onWheel:Qm,children:[Ut&&!Zr&&t.status==="ready"?Y(tw,{objects:rS,selectedKey:qe,onHighlight:bu,onSelect:x=>qu(x,"keyboard"),onClearSelection:()=>{Wu(),_?.()}}):null,ta&&!i&&(Ft||VM)&&Y("div",{className:"ri-moveZoomHint",role:"status",style:{position:"absolute",top:12,left:"50%",transform:"translateX(-50%)",zIndex:5,padding:"6px 12px",borderRadius:999,fontSize:12,fontWeight:500,color:"#fff",background:Ft?"rgba(37, 99, 235, 0.92)":"rgba(0, 0, 0, 0.6)",pointerEvents:"none",whiteSpace:"nowrap"},children:Bt(Ft?"texturePositioningHint":"texturePositioningStartHint")}),Cm&&!Pm&&Y(kw,{count:U1,onDismiss:()=>Em(!0)}),Pu!==null&&!q1&&Y(Dw,{triangles:Pu,offset:Cm&&!Pm,onDismiss:()=>Am(!0)}),An.model.renderer==="uv-checker"&&Eu.missing>0&&Y(Lw,{missing:Eu.missing,total:Eu.total}),Y("input",{ref:fm,type:"file",accept:"image/png,image/jpeg,image/webp",className:"ri-hiddenInput",onChange:XM}),Y(fo,{onError:t.fail,children:Qi?_n(rp,{backend:Qi,onRendererCreated:t.onRendererCreated,suspended:t.status!=="ready",paused:Yo&&!lt,camera:G,backgroundColor:se,shadows:Ee&&Le.shadows.enabled,sceneConfig:An,selectedObjectRef:mi,selectedObjectRefs:Gu,selectedObjectOutlineColor:g,hoveredObjectRef:FM,highlightOnHover:$,renderMode:Ye,maxDpr:Be,reduceGpuLoad:C1,xrStore:Fs,rendererCaptureRef:sr,preserveDrawingBuffer:je,children:[Y(op,{lightingConfig:Le.lighting,shadowConfig:Le.shadows,shadowsEnabled:Ee,environmentRotation:Le.environment.rotation,environmentConfig:Le.environment,modelBounds:AM,objectBindings:Me,nodeRefs:_t}),y1&&Le.lighting.lights.map(x=>!x.visible||x.type==="none"||x.type==="hemisphere"||x.attachment?null:Y(mw,{light:x,position:x.position,rotation:x.rotation,color:x.color,intensity:x.intensity,visible:x.visible,onPositionChange:L=>Sf(x.id,L,x.rotation),onRotationChange:L=>Sf(x.id,x.position,L),onDraggingChange:dm},x.id)),Y(lh,{setAside:Sr.setAside,nodeRefs:_t}),!di&&Y(hh,{section:Le.section??ha,box:Ws,modelRef:bt,showHandle:br,onPositionChange:x=>Jh({position:x}),onDraggingChange:M1}),Y(np,{controlsRef:Re,onCameraChange:lS,cameraLimits:J,controllerType:ai,onPointerLockExit:()=>Rs("orbit"),reducedMotion:Ko}),Y(Nh,{enabled:lt||Zr||Zi||Ko||ai==="pointerLock"?!1:H??Le.model.autoRotate??!1,speed:oe??Le.model.autoRotateSpeed??1,controlsRef:Re}),j&&!lt&&Y(vD,{alignment:"top-right",margin:[80,80],renderPriority:2,onUpdate:()=>{Re.current?.update(0),sr.current?.invalidate()},children:Y(wD,{axisColors:["#ff3653","#8adb00","#2c8fff"],labelColor:"white"})}),(Dr||Lr)&&!di&&!Xs&&mi&&qe&&Y(Rh,{node:mi,space:Ts,moveEnabled:Dr,scaleEnabled:Lr,onTransformChange:GM,transform:Me[qe]?.transform,onDraggingChange:x=>{hm(x),hi&&T?.(hi,x)}},qe),(Dr||Lr)&&!di&&Xs&&Y(Oh,{entries:Xs,referenceNode:mi,space:Ts,moveEnabled:Dr,scaleEnabled:Lr,onTransformChange:HM,onDraggingChange:x=>{hm(x);for(let L of Xs){let F=Me[L.key];F&&T?.(F,x)}}}),Zi&&Y(cy,{target:Zi,nodes:_t,controls:Re}),(()=>{let x=Pt&&Z?_n(AD,{children:[Z.map(L=>Y(Bx,{entry:{...L,objectBindings:L.url===n?Sr.bindings:eu(L)},isActive:L.url===n,pulses:Sr.pulses,decoderConfig:As,itemMaterials:si,sceneConfig:An,zoomOnSelected:He,highlightOnHover:$,explodeFactor:na,suspendBindingTransforms:Zo,onLoadProgress:Mf,onAnimationsReady:he,onModelAnimationsReady:ae,onLoadError:oS,onModelLoaded:aS,selectedItem:qe,panelHoveredItem:f??js,onItemClick:Ku,onItemDoubleClick:Ju,onItemContextMenu:Zu,onItemHover:Qu,nodeRefsOut:_t,onNodeRefsChange:mu,materialRefsOut:L.url===n?Xi:k1(L.url),onMergeModelLoaded:xf,onMergeModelError:rr},L.url)),Y(Rc,{annotations:Hm,sceneConfig:Le,activeAnnotation:Gs,popupRef:Is,canvasRootRef:xr,worldPositionsRef:hu,modelLoaded:Ut,onAnnotationClick:Xm,onCloseAnnotation:Us,hideCloseButton:ia,showAnnotationOnHover:En}),Y(Gc,{annotation:Wm,enabled:ia&&!lt,controlsRef:Re,offsetRef:pu}),lt?Y(mo,{controlsRef:Re,sceneRef:bt,config:lt.config,playing:!0,resetOnPlay:!0,playOnce:!0,startAtPath:!0,onStarted:lt.onStarted,onFinished:lt.onFinished,onProgress:Bm},"video-export"):Br&&Y(mo,{controlsRef:Re,sceneRef:bt,config:Br,playing:Ru&&!Zr,resetOnPlay:Om,onFinished:()=>{Gt(!1),kn(!1)},onUserInteract:()=>{Gt(!1)}},"cinematic-preview"),nt&&Y(kc,{points:zu,unit:Wo,box:Ws,showDimensions:Fu,tool:Nu,areaClosed:Vu,snapPreview:Zr?Km:null})]}):Y(Ur,{onLoadError:ed,children:_n(h1,{fallback:null,children:[i?Y(Zp,{url:i,rotation:An.model.rotation,errorTarget:o,cacheSize:a,decoderConfig:As,objectBindings:Sr.bindings,itemMaterials:si,sceneConfig:An,selectedItem:qe,panelHoveredItem:f??js,highlightOnHover:$,onItemClick:Ku,onItemHover:Qu,onItemDoubleClick:Ju,onItemContextMenu:Zu,onObjectCatalog:nS,onTilesetBounds:iS,onModelLoaded:to,onLoadError:ed,nodeRefsOut:_t,onNodeRefsChange:mu,materialRefsOut:Xi,explodeFactor:na,suspendBindingTransforms:Zo}):Y(Na,{url:n,modelFormat:l,objectBindings:Sr.bindings,selectedItem:qe,itemMaterials:si,onItemClick:Ku,onItemDoubleClick:Ju,onItemContextMenu:Zu,onItemHover:Qu,onModelLoaded:to,onAnimationsReady:he,nodeRefsOut:_t,onNodeRefsChange:mu,materialRefsOut:Xi,panelHoveredItem:f??js,sceneConfig:An,zoomOnSelected:He,highlightOnHover:$,decoderConfig:As,onLoadProgress:Mf,explodeFactor:na,suspendBindingTransforms:Zo,originalNodePoses:It,mergeModels:gt,onMergeModelLoaded:xf,onMergeModelError:rr,pulses:Sr.pulses}),pt?.map(L=>Y(Lx,{url:L,decoderConfig:As,onLoadError:et,onModelLoaded:Fe?F=>Fe(L,F):void 0},L)),Y(Rc,{annotations:Hm,sceneConfig:Le,activeAnnotation:Gs,popupRef:Is,canvasRootRef:xr,worldPositionsRef:hu,modelLoaded:Ut,onAnnotationClick:Xm,onCloseAnnotation:Us,hideCloseButton:ia,showAnnotationOnHover:En}),Y(Gc,{annotation:Wm,enabled:ia&&!lt,controlsRef:Re,offsetRef:pu}),lt?Y(mo,{controlsRef:Re,sceneRef:bt,config:lt.config,playing:!0,resetOnPlay:!0,playOnce:!0,startAtPath:!0,onStarted:lt.onStarted,onFinished:lt.onFinished,onProgress:Bm},"video-export"):Br&&Y(mo,{controlsRef:Re,sceneRef:bt,config:Br,playing:Ru&&!Zr,resetOnPlay:Om,onFinished:()=>{Gt(!1),kn(!1)},onUserInteract:()=>{Gt(!1)}},"cinematic-preview"),nt&&Y(kc,{points:zu,unit:Wo,box:Ws,showDimensions:Fu,tool:Nu,areaClosed:Vu,snapPreview:Zr?Km:null})]})},i??n);return Fs?Y(D0,{ref:eM,box:Ws,scaleMode:Ss,onARStateChange:oM,children:x}):x})(),q&&Y(h1,{fallback:null,children:q})]}):null}),Y(ad,{src:Wh??Hi,hidden:Ut&&ci}),z&&Y("div",{className:"ri-overlay",children:z}),ee&&n&&Mu&&Y(Ow,{failure:Wg(Sm,i||n,i?void 0:l,e),source:i||n}),Y(Tg,{visible:gS,message:Bt($1,{millions:Math.round((Pu??0)/1e6)}),progress:Y1??void 0}),gi&&Y(Qw,{top:bi(0),xrStore:Fs,arSupported:jm,vrSupported:zm,quickLookSupported:Nm,mobileHandoffUrl:Vs,mobileHandoffOpen:Vm,onQuickLook:iM,onOpenMobileHandoff:rM}),tM,Vm&&Vs&&Y(Jw,{url:Vs,onClose:nM}),dt&&Y(Zw,{top:bi(gi?1:0),active:du,onToggle:()=>sm(x=>!(x??Jo))}),nt&&Y(ah,{top:bi(Df),active:Zr,disabled:!!lt,tool:Nu,snap:_M,pointCount:zu.length,areaClosed:Vu,error:MM,showDimensions:Fu,onToggle:()=>{Gt(!1),kM()},onTool:SM,onSnap:PM,onUndo:CM,onClear:RM,onFinishArea:TM,onDimensions:DM,onHeight:zM}),qt&&Y(e1,{top:bi((gi?1:0)+(dt?1:0)+(nt?1:0)),open:K1,factor:na,onToggleOpen:()=>Lm(x=>!x),onFactorChange:Dm}),br&&!di&&Y(t1,{top:bi((gi?1:0)+(dt?1:0)+(nt?1:0)+(qt?1:0)),section:xM,onChange:Jh}),Br&&Y(r1,{top:bi((gi?1:0)+(dt?1:0)+(nt?1:0)+(qt?1:0)+(br?1:0)),playing:Ru,disabled:!!lt||Zr,onPlay:()=>{kn(!1),Gt(!0)},onPause:()=>Gt(!1),onStop:sS}),lt&&Y(n1,{progress:J1,onCancel:Lu}),Pt&&Z&&Z.length>1&&Xh&&Y("div",{className:"ri-modelSwitcher",style:{top:`${bi((gi?1:0)+(dt?1:0)+(nt?1:0)+(qt?1:0)+(br?1:0)+(Br?1:0))}px`},role:"group","aria-label":"Switch model",children:Z.map(x=>Y("button",{type:"button",className:`ri-modelSwitcherButton ${x.url===n?"ri-modelSwitcherButton--active":""}`,onClick:()=>Xh?.(x.url),title:`Switch to ${x.label||Gh(x.url)}`,"aria-pressed":x.url===n,children:x.label||Gh(x.url)},x.url))}),(Iu||qm||Zi||Pn&&en)&&_n("div",{className:`ri-bottomStack ${$m?"ri-bottomStack--aboveButtons":""} ${Iu?"ri-bottomStack--annotationFilters":""}`,children:[Iu&&Y(Fw,{categories:dM,selected:uM,disabled:!!lt,onChange:pM}),Zi&&Y(Uw,{onCancel:Zi.onCancel}),Pn&&en&&Y(Gw,{label:en.size===1?Bt("isolatedObject",{name:(()=>{let[x]=en;return Me[x]?.label??x})()}):Bt("isolatedObjects",{count:en.size}),onShowAll:()=>Yu(null)}),qm&&Y(Hw,{groups:wu,activeVariants:ou,onSelect:S1})]}),$m&&_n("div",{className:"ri-buttonContainer",children:[Y("div",{className:"ri-tourControls",children:qo&&Bu.length>0&&Y(Ww,{count:Bu.length,active:ia,index:sM,navigating:lM,onStart:hM,onPrevious:mM,onNext:fM,onStop:gM})}),_n("div",{className:"mv-rightControls",children:[Ve&&Os.supported&&Y(Xw,{fullscreen:Os,disabled:!!lt}),rt&&Y("button",{className:"mv-resetButton",onClick:td,disabled:!!lt,title:Bt("resetCameraView"),children:Y(TD,{})}),Y(qw,{open:_1,current:ai,disabled:!!lt,onSelect:Rs,onToggle:()=>um(x=>!x)}),Q&&Y($w,{menu:NM,recording:!!lt,hasScene:!!bt.current,canCaptureImage:je||Qi==="webgpu",canRecord:Ut&&ci&&!Ns,hasCinematic:!!Br})]})]}),pi&&Y(Yw,{x:mS,y:fS,form:aM,setForm:Ou,onOk:bM,onCancel:yM})]}),ie&&vr&&Y(mh,{colorPicker:vr,onClose:jr,itemMaterials:si,setItemMaterials:Bs}),ie&&aa&&Y(fh,{triggerFileUpload:lf,materialPopup:aa,textureUrl:Cf,clearTexture:cf,canPlaceImage:Tf,offset:_f,rotationDegrees:Pf,onOffsetChange:Af,onRotationChange:Rf,isPositioning:Ef,onEndPositioning:kf})]}),Ge&&Y("div",{className:"ri-viewerRight",inert:t.status!=="ready",children:Ce?Ce({objectBindings:Me,onAction:Ks,onFocus:ff,onHover:bu}):Y(vh,{objectBindings:Me,onAction:Ks,onFocus:ff,onHover:bu,isolatedKeys:en,onIsolate:Pn?tS:void 0})}),we&&Y(L0,{controlsRef:Re,enabled:t.status==="ready",opacity:st,moveSensitivity:ft,position:at})]})}import{Vector3 as Yc}from"three";var Kc=1e-6;function RW(){let e=[null,null],t=0,r=!1,n=new Yc,i=new Yc,o=new Yc,a=new Yc,s=(u,d)=>{let p=e[u],c=e[d];if(!p||!c)return;p.controls.getPosition(n,!1),p.controls.getTarget(o,!1),c.controls.getPosition(i,!1),c.controls.getTarget(a,!1);let h=p.controls.camera.zoom;if(!(n.distanceToSquared(i)<Kc&&o.distanceToSquared(a)<Kc&&Math.abs(h-c.controls.camera.zoom)<Kc)){r=!0;try{Math.abs(h-c.controls.camera.zoom)>=Kc&&c.controls.zoomTo(h,!1),c.controls.setLookAt(n.x,n.y,n.z,o.x,o.y,o.z,!1)}finally{r=!1}c.invalidate()}},l=u=>{r||(u===t?s(u,1-u):s(t,u))};return{attach(u,d,p){let c=e[u];if(c?.controls===d){c.invalidate=p;return}c?.detach();let h=()=>l(u),m=()=>{t=u};d.addEventListener("update",h),d.addEventListener("controlstart",m),e[u]={controls:d,invalidate:p,detach:()=>{d.removeEventListener("update",h),d.removeEventListener("controlstart",m)}},s(t,1-t)},get leader(){return t},detach(){e.forEach(u=>u?.detach()),e[0]=e[1]=null}}}import{Fragment as RD,jsx as Hh,jsxs as g1}from"react/jsx-runtime";var Qc=.05,m1=.2,f1=e=>Math.min(Math.max(Number.isFinite(e)?e:.5,0),1);function LW({split:e,onSplitChange:t,labels:r,containerRef:n,beforeAction:i}){let o=me(),a=p=>{let c=n.current?.getBoundingClientRect();c&&c.width>0&&t(f1((p-c.left)/c.width))},s=p=>{p.preventDefault(),p.stopPropagation(),p.currentTarget.setPointerCapture(p.pointerId),p.currentTarget.focus(),a(p.clientX)},l=p=>{p.currentTarget.hasPointerCapture(p.pointerId)&&a(p.clientX)},u=p=>{let c={ArrowLeft:e-Qc,ArrowDown:e-Qc,ArrowRight:e+Qc,ArrowUp:e+Qc,PageDown:e-m1,PageUp:e+m1,Home:0,End:1}[p.key];c!==void 0&&(p.preventDefault(),p.stopPropagation(),t(f1(c)))},d=Math.round(e*100);return g1(RD,{children:[g1("span",{className:"ri-compare__label ri-compare__label--before",hidden:e<.08,children:[r[0],i]}),Hh("span",{className:"ri-compare__label ri-compare__label--after",hidden:e>.92,children:r[1]}),Hh("div",{className:"ri-compare__divider",role:"slider",tabIndex:0,"aria-label":o("compareDivider"),"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":d,"aria-valuetext":o("compareDividerValue",{before:r[0],after:r[1],percent:d,rest:100-d}),onPointerDown:s,onPointerMove:l,onKeyDown:u,children:Hh("span",{className:"ri-compare__handle","aria-hidden":"true"})})]})}export{cl as a,gd as b,Wg as c,bS as d,Vb as e,eI as f,Jb as g,tI as h,rI as i,_a as j,uy as k,ki as l,Wl as m,F5 as n,dd as o,al as p,ob as q,oL as r,YS as s,dl as t,_h as u,dk as v,pw as w,sb as x,cb as y,PD as z,RW as A,f1 as B,LW as C,lL as D};
|