@liveroom-tech/react-immersive 6.2.0 → 6.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AnimationsTab-IKAAKT3P.mjs +1 -0
- package/dist/AnnotationsTab-NEJIXCOM.mjs +1 -0
- package/dist/CinematicTab-TIQXCPFE.mjs +1 -0
- package/dist/ConfigureTab-NYRMOFW4.mjs +6 -0
- package/dist/DownloadedEnvironment-NHM4U2LJ.mjs +1 -0
- package/dist/RulesTab-2U4MFYOZ.mjs +1 -0
- package/dist/SequencesTab-LTMJTB76.mjs +1 -0
- package/dist/SequencesTab-O7USMDFP.css +1 -0
- package/dist/StreamingTilesModel-IM2DDWO5.mjs +16 -0
- package/dist/binding-builder.css +1 -1
- package/dist/binding-builder.d.mts +3 -3
- package/dist/binding-builder.d.ts +3 -3
- package/dist/binding-builder.js +55 -54
- package/dist/binding-builder.mjs +1 -1
- package/dist/chunk-2AJK643D.mjs +1 -0
- package/dist/chunk-2LGQKX6Z.mjs +50 -0
- package/dist/chunk-37QOMZW6.mjs +1 -0
- package/dist/chunk-3PLML3PO.mjs +1 -0
- package/dist/chunk-5C4H7SRF.mjs +1 -0
- package/dist/chunk-IT2PUTJS.mjs +1 -0
- package/dist/chunk-KFLS7GI6.mjs +1 -0
- package/dist/chunk-LEOHZ5HM.mjs +69 -0
- package/dist/{chunk-GXY3VML4.mjs → chunk-NMRTI3NQ.mjs} +1 -1
- package/dist/chunk-RSUXTWM6.mjs +1 -0
- package/dist/chunk-RXZ4Q7CY.mjs +1 -0
- package/dist/chunk-SOAUR4DL.mjs +1 -0
- package/dist/chunk-SXN3YYD3.mjs +1 -0
- package/dist/chunk-TUYVYSN5.mjs +1 -0
- package/dist/{chunk-IOLT2VXU.mjs → chunk-UAZ6I25Y.mjs} +1 -1
- package/dist/chunk-UCD76KQ6.mjs +1 -0
- package/dist/chunk-WU3SQZGD.mjs +3 -0
- package/dist/chunk-XKJQC3N5.mjs +47 -0
- package/dist/exportSceneMesh-MSQIMBFF.mjs +1 -0
- package/dist/hosted.css +1 -1
- package/dist/hosted.d.mts +5 -3
- package/dist/hosted.d.ts +5 -3
- package/dist/hosted.js +54 -53
- package/dist/hosted.mjs +1 -1
- package/dist/index.css +1 -1
- package/dist/index.d.mts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +56 -55
- package/dist/index.mjs +1 -1
- package/dist/meshFormats-4C6NHYOA.mjs +1 -0
- package/dist/modelFileResolver-Bq4pW9vc.d.mts +1734 -0
- package/dist/modelFileResolver-Bq4pW9vc.d.ts +1734 -0
- package/dist/modelViewerProps-BnrJO5DK.d.ts +950 -0
- package/dist/modelViewerProps-wjBT4fks.d.mts +950 -0
- package/dist/{publicProps-Cmh9JtzJ.d.ts → publicProps-BZPMIRwj.d.ts} +1 -1
- package/dist/{publicProps-TMARX628.d.mts → publicProps-CW5X_HFh.d.mts} +1 -1
- package/dist/simple-model-viewer.css +1 -1
- package/dist/simple-model-viewer.d.mts +22 -4
- package/dist/simple-model-viewer.d.ts +22 -4
- package/dist/simple-model-viewer.js +5 -5
- package/dist/simple-model-viewer.mjs +1 -1
- package/dist/utils.d.mts +4 -4
- package/dist/utils.d.ts +4 -4
- package/dist/utils.js +2 -2
- package/dist/utils.mjs +1 -1
- package/dist/xrRuntime-5S7KYUVB.mjs +1 -0
- package/package.json +1 -1
- package/dist/AnimationsTab-NUJTEMZ5.mjs +0 -1
- package/dist/AnnotationsTab-OHRVWRKI.mjs +0 -1
- package/dist/CinematicTab-IJAY2BS6.mjs +0 -1
- package/dist/ConfigureTab-UQRRATCY.mjs +0 -6
- package/dist/RulesTab-YVBZGJZX.mjs +0 -1
- package/dist/SequencesTab-IC5LWQ6N.css +0 -1
- package/dist/SequencesTab-ODR5IGDX.mjs +0 -1
- package/dist/chunk-2CUPPOBW.mjs +0 -3
- package/dist/chunk-3MIILDHB.mjs +0 -83
- package/dist/chunk-3XZKDTB2.mjs +0 -1
- package/dist/chunk-6Q6YZ7O5.mjs +0 -1
- package/dist/chunk-7MN2TMY6.mjs +0 -47
- package/dist/chunk-AL6UIGWP.mjs +0 -1
- package/dist/chunk-EWNN4BBR.mjs +0 -1
- package/dist/chunk-X4WRTDO6.mjs +0 -50
- package/dist/modelFileResolver-ChKYsF21.d.mts +0 -495
- package/dist/modelFileResolver-ChKYsF21.d.ts +0 -495
- package/dist/modelViewerProps-Ch6pIZIE.d.ts +0 -2159
- package/dist/modelViewerProps-HazR2IE_.d.mts +0 -2159
package/dist/chunk-3MIILDHB.mjs
DELETED
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
import{c as Pv}from"./chunk-EWNN4BBR.mjs";import{c as jc,h as gi,i as rx}from"./chunk-FGAJ2UT7.mjs";import{A as Oy,C as Ly,D as Iy,E as By,F as Ny,G as jy,H as zy,I as Vy,J as Fy,K as Uy,L as Gy,M as Oc,N as Hy,O as Wy,P as gs,Q as Lc,R as Ic,S as Bc,T as Nc,U as qy,V as Xy,W as Jy,a as $o,b as lv,c as uc,d as kc,e as by,f as vy,g as yy,j as nm,l as im,m as My,n as Cy,o as Dc,p as fs,q as fi,r as Py,s as Ty,t as _y,u as Ay,v as Ry,w as Ey,x as ky,y as Dy,z as om}from"./chunk-7MN2TMY6.mjs";import{a as Cv,b as ce}from"./chunk-GXY3VML4.mjs";import{a as Qy}from"./chunk-37YITTIK.mjs";import{A as vc,Aa as ny,B as Qo,Ba as iy,C as Rn,Ca as oy,D as yc,Da as tm,E as xc,Ea as ay,F as Av,Fa as hy,G as wc,Ga as fy,H as Rv,Ha as gy,I as Ev,La as am,Oa as Yy,P as us,Pa as Ky,Q as Sc,S as Kp,T as kv,Ta as Zy,Ua as ex,Va as tx,W as Le,a as ui,aa as Mc,b as di,ba as Dv,c as av,ca as Cc,d as sv,da as Ov,e as pi,ea as Lv,f as cv,fa as Iv,g as Xp,ga as Bv,h as uv,ha as Nv,i as dv,ia as Pc,j as mc,ja as jv,k as fv,ka as Tc,l as gv,la as ds,m as bv,ma as zv,na as Qp,o as cs,oa as _c,p as eo,pa as Vv,q as Sv,qa as Fv,r as Mv,ra as Uv,s as Ko,t as to,u as Tv,v as _v,wa as ry,x as bc,xa as Rc,za as em}from"./chunk-X4WRTDO6.mjs";import{c as $y}from"./chunk-CCBFMNAU.mjs";import{a as $p,b as pv,c as mv,d as hv,e as Yp,f as hc,g as ls,h as fc}from"./chunk-7OWHW66D.mjs";import{e as dc}from"./chunk-LX3GXQNU.mjs";import{d as Xv,e as Ac,f as ro,g as $v,h as Yv,i as Zp,j as Kv,k as Qv,l as Jv,o as Zv,q as ey,r as ty,s as ps}from"./chunk-7JCFNZJM.mjs";import{a as pc}from"./chunk-GV4ZRXL6.mjs";import{A as xy,B as hs,C as rm,E as wy,F as Sy,a as fr,b as mi,c as gc,d as Yo,e as vv,f as yv,g as An,h as xv,i as wv,j as sy,m as Qt,n as hi,o as Ec,p as Zr,q as At,r as ly,s as cy,t as uy,u as dy,v as py,w as ms,y as my}from"./chunk-6Q6YZ7O5.mjs";import{a as Gv,b as Hv,c as Wv,d as En,g as qv,h as Jp}from"./chunk-BNKTI3CY.mjs";import{a as qp}from"./chunk-JR557W27.mjs";var nx={showObjectBindingDataPanel:!1,showSceneObjectsPanel:!1,showDownloadButton:!1,showResetButton:!1,showAnnotationNavigation:!1,showMaterialVariants:!1},P_=Object.freeze({minimal:Object.freeze({...nx}),showcase:Object.freeze({...nx,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})}),T_=["preset","ui","tools","controls","perf","tiles","xr","decoders"];function ix(e){let t={};for(let r of Object.keys(e))e[r]!==void 0&&(t[r]=e[r]);return t}function __({ui:e,tools:t,controls:r,perf:n,tiles:i,xr:o,decoders:a}){let s=e?.download,l=e?.mouseController,c=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:c===void 0?void 0:c!==!1,measurementUnit:typeof c=="object"?c.unit:void 0,showUvCheckerButton:t?.uvChecker,showExplodeControls:t?.explode,showSectionTools:t?.section,showSequenceControls:t?.sequences,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,arHandoff:o?.arHandoff,dracoDecoderPath:a?.draco,ktx2TranscoderPath:a?.ktx2,meshopt:a?.meshopt}}function ox(e){let t={...e};for(let r of T_)delete t[r];return{...e.preset?P_[e.preset]:void 0,...ix(t),...ix(__(e))}}import{useCallback as Jo,useEffect as zc,useMemo as sm,useRef as Zo,useState as ea}from"react";var ax=e=>e instanceof Error?e.message:String(e);function A_(e){if(!e||!Number.isSafeInteger(e.amountMinor)||e.amountMinor<0||!/^[A-Z]{3}$/.test(e.currency)||e.expiresAt!==void 0&&(!Number.isFinite(Date.parse(e.expiresAt))||Date.parse(e.expiresAt)<=Date.now()))throw new Error("The pricing service returned an invalid price.");return{amountMinor:e.amountMinor,currency:e.currency,...e.expiresAt?{expiresAt:e.expiresAt}:{},...e.label?{label:String(e.label)}:{}}}function R_(e,t){let r=new Set;if(!e||typeof e.available!="boolean"||e.message!==void 0&&typeof e.message!="string")throw new Error("The availability service returned invalid data.");if(e.options!==void 0){if(!Array.isArray(e.options))throw new Error("The availability service returned invalid data.");for(let n of e.options){let i=JSON.stringify([n?.groupId,n?.optionId]);if(!n||typeof n.available!="boolean"||n.reason!==void 0&&typeof n.reason!="string"||r.has(i)||!t.groups.some(o=>o.id===n.groupId&&o.options.some(a=>a.id===n.optionId)))throw new Error("The availability service returned invalid data.");r.add(i)}}return{available:e.available,...e.message!==void 0?{message:e.message}:{},...e.options?{options:e.options.map(({groupId:n,optionId:i,available:o,reason:a})=>({groupId:n,optionId:i,available:o,...a!==void 0?{reason:a}:{}}))}:{}}}function sx(e){let t=JSON.stringify(e.product),r=sm(()=>Xv(e.product),[t]),n=JSON.stringify([r.id,r.revision]),[i,o]=ea(()=>({productIdentity:n,selections:e.initialSelections??Ac(r)})),a=e.selections??(i.productIdentity===n?i.selections:Ac(r)),[s,l]=ea(e.initialQuantity??1),c=JSON.stringify(a),d=sm(()=>ro(r,a,s),[r,c,s]),m=e.adapter,u=m?.key??"",h=`${t}
|
|
2
|
-
${d.key}
|
|
3
|
-
${u}`;if(m&&(typeof m.key!="string"||!m.key.trim()))throw new Error("A commerce adapter needs a stable key identifying its backend/pricing context.");let[p,g]=ea(0),[b,w]=ea(null),[f,y]=ea(null),[S,M]=ea({identity:h,pending:null,result:null,error:null}),x=Zo(!1),C=Zo(!0),A=Zo(0),P=Zo(null),_=Zo(null),R=Zo({options:e,product:r,base:d,identity:h,commerce:b,adapter:m,optionStates:[]}),k=e.selections!==void 0&&!e.onSelectionsChange,T=b?.identity===h&&b.adapterKey===u?b:null,L=T?.configuration??d,F=sm(()=>Zv(r,d.selections,T?.availability??void 0,s),[r,d,T?.availability,s]);R.current={options:e,product:r,base:d,identity:h,commerce:b,adapter:m,optionStates:F},zc(()=>{M({identity:h,pending:null,result:null,error:null}),y(null)},[h]);let j=Jo(()=>{x.current=!1,M(U=>({...U,error:null,result:null})),g(U=>U+1)},[]);zc(()=>{let U=new AbortController,Q=++A.current;return x.current=!1,d.valid?(w({identity:h,adapterKey:u,status:"loading",configuration:d,price:null,availability:null,error:null}),(async()=>{try{let q=structuredClone(d),G={signal:U.signal};if(m?.resolveSku){let ve=await m.resolveSku(structuredClone(q),G);if(ve!==null&&(typeof ve!="string"||!ve.trim()))throw new Error("The SKU service returned an invalid SKU.");q.sku=ve}if(U.signal.aborted)return;let[H,se]=await Promise.all([m?.getPrice?Promise.resolve().then(()=>m.getPrice(structuredClone(q),G)).then(A_):Promise.resolve(null),m?.getAvailability?Promise.resolve().then(()=>m.getAvailability(structuredClone(q),G)).then(ve=>R_(ve,r)):Promise.resolve(null)]);if(U.signal.aborted||Q!==A.current||R.current.identity!==h||R.current.adapter?.key!==m?.key)return;x.current=!0,w({identity:h,adapterKey:u,status:"ready",configuration:q,price:H??null,availability:se??null,error:null})}catch(q){if(U.signal.aborted||Q!==A.current||R.current.identity!==h||R.current.adapter?.key!==m?.key)return;w({identity:h,adapterKey:u,status:"error",configuration:d,price:null,availability:null,error:ax(q)})}})(),()=>U.abort()):(w(null),()=>U.abort())},[h,u,p]),zc(()=>{let U=T?.price?.expiresAt;if(!U)return;let Q=Date.parse(U)-Date.now(),q,G=()=>{let H=Date.parse(U)-Date.now();if(H>0){q=setTimeout(G,Math.min(H,2147483647));return}x.current=!1,w(se=>se?.identity===h?{...se,status:"error",error:"The price expired. Refresh it before continuing."}:se)};return q=setTimeout(G,Math.min(Math.max(Q,0),2147483647)),()=>clearTimeout(q)},[T?.price?.expiresAt,h]),zc(()=>(C.current=!0,()=>{C.current=!1,x.current=!1,A.current++,P.current?.controller.abort()}),[]);let V=Jo(U=>{let Q=R.current;if(Q.options.selections!==void 0&&!Q.options.onSelectionsChange)throw new Error("Selections are controlled; supply onSelectionsChange to edit them.");if(P.current)throw new Error("Wait for the current cart or quote request to finish.");let q=ro(Q.product,U,Q.base.quantity);if(q.issues.some(G=>G.code==="unknown-group"||G.code==="unknown-option"))throw new Error("Selections reference unknown product options.");if(q.key===Q.base.key){y(null);return}x.current=!1,y(null),g(G=>G+1),Q.options.onSelectionsChange&&Q.options.onSelectionsChange(structuredClone(q.selections)),Q.options.selections===void 0&&o({productIdentity:JSON.stringify([Q.product.id,Q.product.revision]),selections:q.selections})},[]),E=Jo((U,Q)=>{let q=R.current,G=q.product.groups.find(ve=>ve.id===U),H=q.optionStates.find(ve=>ve.groupId===U&&ve.optionId===Q);if(!G||Q!==null&&!H)throw new Error("Unknown product option.");let se=Q===null?ro(q.product,{...q.base.selections,[U]:null},q.base.quantity).issues.filter(ve=>ve.groupIds.includes(U)&&ve.code!=="sku"):[];return se.length||H&&!H.available?(y(H?.reasons.join(" ")||se.map(ve=>ve.message).join(" ")),!1):(V({...q.base.selections,[U]:Q}),!0)},[V]),O=Jo((U,Q)=>{let q=R.current,G=$v(q.product,q.base.selections,U,Q,q.base.quantity);return G?(V(G),!0):(y("This choice isn't available with any combination."),!1)},[V]),Z=Jo(U=>{if(P.current)throw new Error("Wait for the current cart or quote request to finish.");ro(R.current.product,R.current.base.selections,U),U!==R.current.base.quantity&&(x.current=!1,l(U))},[]),ee=Jo(U=>{if(P.current)return P.current.kind===U&&P.current.identity===R.current.identity?P.current.promise:Promise.reject(new Error("Another commerce request is already running."));let Q=R.current,q=Q.commerce,G=U==="cart"?Q.adapter?.addToCart:Q.adapter?.requestQuote,H=we=>(M({identity:Q.identity,pending:null,result:null,error:we}),Promise.reject(new Error(we)));if(!G)return H("No commerce adapter is configured for this action.");if(!Q.base.valid)return H("Resolve the option conflicts before continuing.");if(!x.current||!q||q.identity!==Q.identity||q.adapterKey!==(Q.adapter?.key??"")||q.status!=="ready")return H("Wait for current pricing and availability, or retry the service request.");if(q.availability?.available===!1||q.availability?.options?.some(we=>!we.available&&Q.base.selections[we.groupId]===we.optionId))return H(q.availability?.message??"This configuration is currently unavailable.");if(U==="cart"&&Q.adapter?.resolveSku&&!q.configuration.sku)return H("No SKU is available for this configuration.");if(q.price?.expiresAt&&Date.parse(q.price.expiresAt)<=Date.now())return j(),H("The price expired. Refresh it before continuing.");let se=structuredClone(q.configuration),ve=q.price?structuredClone(q.price):null,Ne=new AbortController,$=Q.identity;(_.current?.identity!==$||_.current.kind!==U)&&(_.current={identity:$,kind:U,key:crypto.randomUUID()});let xe=_.current.key;M({identity:$,pending:U,result:null,error:null});let Te=Promise.resolve().then(()=>(Ne.signal.throwIfAborted(),G(se,{signal:Ne.signal,idempotencyKey:xe,price:ve}))).then(we=>{if(!we||typeof we!="object"||we.id!==void 0&&typeof we.id!="string"||we.message!==void 0&&typeof we.message!="string")throw new Error("The commerce service returned an invalid result.");let pt={...we.id?{id:we.id}:{},...we.message?{message:we.message}:{}};return R.current.identity===$&&!Ne.signal.aborted&&M({identity:$,pending:null,result:pt,error:null}),_.current=null,pt}).catch(we=>{throw R.current.identity===$&&!Ne.signal.aborted&&M({identity:$,pending:null,result:null,error:ax(we)}),we}).finally(()=>{P.current?.promise===Te&&(P.current=null),C.current&&M(we=>({...we,pending:null}))});return P.current={identity:$,kind:U,promise:Te,controller:Ne},Te},[j]),J=d.valid&&T?.status==="ready"&&x.current&&!P.current&&T.availability?.available!==!1&&!T.availability?.options?.some(U=>!U.available&&d.selections[U.groupId]===U.optionId)&&(!T.price?.expiresAt||Date.parse(T.price.expiresAt)>Date.now());return{product:r,configuration:L,optionStates:F,selectOption:E,selectOptionWithFix:O,setSelections:V,reset:()=>V(Ac(r)),setQuantity:Z,exportConfiguration:()=>ey(L),importConfiguration:U=>{let Q=ty(U,r);V(Q.selections),Z(Q.quantity)},viewerProps:{...e.objectBindings!==void 0?{objectBindings:e.objectBindings}:{},sceneConfig:{...e.sceneConfig??Sc,product:{definition:r,selections:d.selections}}},status:T?.status??(d.valid?"loading":"idle"),price:T?.price??(m?.getPrice||!d.valid?null:Yv(r,L)),checkoutUrl:T?.availability?.available===!1?null:Kv(r,L),availability:T?.availability??null,error:f??(S.identity===h?S.error:null)??T?.error??null,readOnly:k,pendingAction:P.current?P.current.kind:null,result:S.identity===h?S.result:null,canAddToCart:!!(J&&m?.addToCart&&(!m.resolveSku||L.sku)),canRequestQuote:!!(J&&m?.requestQuote),hasCommerce:!!m,hasCart:!!m?.addToCart,hasQuote:!!m?.requestQuote,addToCart:()=>ee("cart"),requestQuote:()=>ee("quote"),refresh:j}}import{useId as E_}from"react";import{Fragment as O_,jsx as ot,jsxs as Ft}from"react/jsx-runtime";function k_(e,t){return t.map(r=>e.groups.find(n=>n.id===r.groupId)?.options.find(n=>n.id===r.optionId)?.label).filter(Boolean).join(", ")}function D_({c:e,group:t,option:r,state:n,name:i,display:o,busy:a}){let s=ce(),l=`${i}-${r.id}-reason`,c=!n.available&&n.fix?.length?n.fix:null,d=!n.available&&!c,m=c?s("productAlsoChanges",{changes:k_(e.product,c)}):n.available?"":n.reasons.join(" "),u=r.priceDeltaMinor&&e.product.pricing?Zp(r.priceDeltaMinor,e.product.pricing.currency,!0):"",h=["ri-productChoice",n.selected&&"ri-productChoice--selected",!n.available&&"ri-productChoice--unavailable"].filter(Boolean).join(" "),p=ot("input",{type:"radio",name:i,checked:n.selected,disabled:d||a||e.readOnly,"aria-describedby":m?l:void 0,onChange:()=>{c?e.selectOptionWithFix(t.id,r.id):e.selectOption(t.id,r.id)}});return o==="swatches"?Ft("label",{className:`${h} ri-productSwatch`,title:[r.label,u,m].filter(Boolean).join(" \xB7 "),children:[p,ot("span",{className:"ri-productSwatchChip",style:{background:r.swatch??"var(--ri-ui-field)"},"aria-hidden":"true"}),Ft("span",{className:"ri-productVisuallyHidden",children:[r.label,u?` ${u}`:""]}),m?ot("span",{id:l,className:"ri-productVisuallyHidden",children:m}):null]}):o==="chips"?Ft("label",{className:`${h} ri-productChip`,title:m||void 0,children:[p,Ft("span",{children:[r.label,u?ot("em",{children:u}):null]}),m?ot("span",{id:l,className:"ri-productVisuallyHidden",children:m}):null]}):Ft("label",{className:h,children:[p,r.swatch?ot("span",{className:"ri-productSwatchChip",style:{background:r.swatch},"aria-hidden":"true"}):null,Ft("span",{className:"ri-productChoiceText",children:[Ft("span",{className:"ri-productChoiceTitle",children:[ot("span",{children:r.label}),u?ot("em",{children:u}):null]}),r.description?ot("small",{children:r.description}):null,m?ot("small",{id:l,children:m}):null]})]})}function lm({configurator:e,className:t="",showCommerce:r=!0,actions:n}){let i=ce(),o=!!e.pendingAction,a=E_(),s=e.price?Zp(e.price.amountMinor,e.price.currency):"",l=r&&(e.hasCommerce||!!e.product.pricing||!!e.product.checkout);return Ft("section",{className:`ri-productOptions ${t}`,"aria-label":i("productOptionsFor",{product:e.product.label}),children:[Ft("div",{className:"ri-productHeader",children:[ot("strong",{children:e.product.label}),ot("button",{type:"button",disabled:o||e.readOnly,onClick:e.reset,children:i("productReset")})]}),e.product.groups.map((c,d)=>{let m=`${a}-${d}`,u=c.display??"list",h=c.options.find(g=>g.id===e.configuration.selections[c.id]),p=c.required?[]:ro(e.product,{...e.configuration.selections,[c.id]:null},e.configuration.quantity).issues.filter(g=>g.groupIds.includes(c.id)).map(g=>g.message);return Ft("fieldset",{disabled:o||e.readOnly,children:[Ft("legend",{children:[c.label,c.required?null:Ft("small",{children:[" (",i("productOptional"),")"]}),u==="swatches"&&h?ot("span",{className:"ri-productLegendValue",children:h.label}):null]}),Ft("div",{className:`ri-productChoices ri-productChoices--${u}`,children:[c.required?null:Ft("label",{className:`ri-productChoice${u==="swatches"||u==="chips"?" ri-productChip":""}${e.configuration.selections[c.id]===null?" ri-productChoice--selected":""}${p.length?" ri-productChoice--unavailable":""}`,title:p.join(" ")||void 0,children:[ot("input",{type:"radio",name:m,checked:e.configuration.selections[c.id]===null,disabled:!!p.length,onChange:()=>e.selectOption(c.id,null)}),ot("span",{children:i("productNone")})]}),c.options.map(g=>{let b=e.optionStates.find(w=>w.groupId===c.id&&w.optionId===g.id);return ot(D_,{c:e,group:c,option:g,state:b,name:m,display:u,busy:o},g.id)})]})]},c.id)}),e.configuration.issues.length?ot("ul",{className:"ri-productIssues","aria-label":i("productIssues"),children:e.configuration.issues.map((c,d)=>ot("li",{children:c.message},d))}):null,l?Ft("div",{className:"ri-productCommerce",children:[Ft("label",{className:"ri-productQuantity",children:[i("productQuantity"),ot("input",{type:"number",min:1,max:9999,step:1,value:e.configuration.quantity,disabled:o,onChange:c=>{let d=c.target.valueAsNumber;Number.isSafeInteger(d)&&d>=1&&d<=9999&&e.setQuantity(d)}})]}),e.status==="loading"&&e.hasCommerce?ot("p",{role:"status",children:i("productCheckingPrice")}):Ft(O_,{children:[s?Ft("p",{className:"ri-productPrice",children:[s,ot("small",{children:e.price?.label??i("productTotal")})]}):null,e.configuration.sku?Ft("p",{className:"ri-productSku",children:["SKU: ",e.configuration.sku]}):null,e.availability?.available===!1?ot("p",{className:"ri-productIssues",children:e.availability.message??i("productUnavailable")}):null]}),Ft("div",{className:"ri-productActions",children:[e.checkoutUrl?ot("a",{className:"ri-productPrimary",href:e.checkoutUrl,target:"_blank",rel:"noopener noreferrer",children:e.product.checkout?.label??i("productBuy")}):null,e.hasCart?ot("button",{type:"button",className:e.checkoutUrl?void 0:"ri-productPrimary",disabled:!e.canAddToCart,onClick:()=>{e.addToCart().catch(()=>{})},children:e.pendingAction==="cart"?i("productAddingToCart"):i("productAddToCart")}):null,e.hasQuote?ot("button",{type:"button",disabled:!e.canRequestQuote,onClick:()=>{e.requestQuote().catch(()=>{})},children:e.pendingAction==="quote"?i("productRequestingQuote"):i("productRequestQuote")}):null,e.hasCommerce?ot("button",{type:"button",disabled:o||!e.configuration.valid,onClick:e.refresh,children:i("productRefresh")}):null,n]})]}):n?ot("div",{className:"ri-productActions",children:n}):null,e.error?ot("p",{className:"ri-productError",role:"alert",children:e.error}):null,e.result?ot("p",{className:"ri-productSuccess",role:"status",children:e.result.message??(e.result.id?i("productSaved",{id:e.result.id}):i("productRequestDone"))}):null]})}import{useCallback as bi,useEffect as L_,useRef as lx,useState as cm}from"react";var um={currentClip:null,isPlaying:!1,speed:1,time:0,duration:0,active:[]};function sj(){let e=lx(null),t=lx(null),[r,n]=cm([]),[i,o]=cm([]),[a,s]=cm(um);L_(()=>()=>{t.current?.()},[]);let l=bi(b=>{t.current?.(),e.current=b,n(b.clips),o(b.clipDetails??b.clips.map(w=>({sourceName:w,duration:0}))),s(b.getState?.()??um),t.current=b.subscribe?.(s)??null},[]),c=bi(()=>{t.current?.(),t.current=null,e.current=null,n([]),o([]),s(um)},[]),d=bi(b=>{let w=e.current;w&&(b(w),!w.subscribe&&w.getState&&s(w.getState()))},[]),m=bi((b,w)=>d(f=>f.play(b,w)),[d]),u=bi(b=>d(w=>w.pause(b)),[d]),h=bi(b=>d(w=>w.stop(b)),[d]),p=bi((b,w)=>d(f=>f.setSpeed(b,w)),[d]),g=bi((b,w)=>d(f=>f.seek?.(b,w)),[d]);return{clips:r,clipDetails:i,...a,isRenderPaused:a.isRenderPaused??!1,play:m,pause:u,stop:h,setSpeed:p,seek:g,handleAnimationsReady:l,clearAnimations:c}}function un(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)}}import{Fragment as Vc,jsx as be,jsxs as me}from"react/jsx-runtime";var kn=e=>e.toLocaleString(),ta=e=>e==null?"Unknown":e>=1024*1024?`${(e/1024/1024).toFixed(1)} MiB`:`${(e/1024).toFixed(1)} KiB`,dm=e=>e===null?"Unavailable":kn(e);function I_({report:e,runtimeStats:t,onRefresh:r,onSelectObject:n}){return me("div",{className:"ri-assetDiagnostics",children:[me("div",{className:"ri-diagnosticsActions",children:[r&&be("button",{type:"button",disabled:!e||e.status==="failed",onClick:r,children:"Rescan asset"}),be("button",{type:"button",disabled:!e,onClick:()=>{un(new Blob([JSON.stringify({asset:e,runtime:t??null},null,2)],{type:"application/json"}),"asset-diagnostics.json")},children:"Download report"})]}),e?me(Vc,{children:[me("div",{className:`ri-diagnosticsSummary ri-diagnosticsSummary--${e.issues.some(i=>i.severity==="error")?"error":e.issues.some(i=>i.severity==="warning")?"warning":"info"}`,children:[be("strong",{children:e.status==="failed"?"Asset could not be inspected":e.issues.some(i=>i.severity==="error")?"Issues need attention":e.issues.some(i=>i.severity==="warning")?"Review recommended":"No blocking issues found"}),me("span",{children:[e.issues.filter(i=>i.severity==="error").length," errors \xB7 ",e.issues.filter(i=>i.severity==="warning").length," warnings \xB7 ",e.issues.filter(i=>i.severity==="info").length," notes"]})]}),me("p",{className:"ri-diagnosticsSource",children:[e.source.name??"Loaded asset"," ",be("span",{children:e.source.format?.toUpperCase()})]}),me("details",{className:"ri-diagnosticsDetail",children:[be("summary",{children:"Asset statistics"}),me("dl",{className:"ri-diagnosticsMetrics",children:[me("div",{children:[be("dt",{children:"Source"}),be("dd",{children:e.source.name??"Loaded asset"})]}),me("div",{children:[be("dt",{children:"Format"}),be("dd",{children:e.source.format?.toUpperCase()??"Unknown"})]}),me("div",{children:[be("dt",{children:"Source file size"}),be("dd",{children:ta(e.source.sourceBytes)})]}),me("div",{children:[be("dt",{children:"Initial asset load"}),be("dd",{children:e.source.loadDurationMs==null?"Unknown":`${(e.source.loadDurationMs/1e3).toFixed(2)} s`})]}),me("div",{children:[be("dt",{children:"Units"}),be("dd",{children:e.units==="unknown"?"Unknown \u2014 verify scale":e.units})]}),e.bounds&&me("div",{children:[be("dt",{children:"Bounds (scene units)"}),be("dd",{children:e.bounds.size.map(i=>Number(i.toPrecision(4))).join(" \xD7 ")})]}),e.statistics&&me(Vc,{children:[me("div",{children:[be("dt",{children:"Meshes / instances"}),me("dd",{children:[kn(e.statistics.meshes)," / ",kn(e.statistics.instances)]})]}),me("div",{children:[be("dt",{children:"Unique triangles"}),be("dd",{children:kn(e.statistics.triangles)})]}),me("div",{children:[be("dt",{children:"Unique vertices"}),be("dd",{children:kn(e.statistics.vertices)})]}),me("div",{children:[be("dt",{children:"Materials / textures"}),me("dd",{children:[kn(e.statistics.materials)," / ",kn(e.statistics.textures)]})]}),me("div",{children:[be("dt",{children:"Geometry buffers"}),be("dd",{children:ta(e.statistics.geometryBytes)})]}),me("div",{children:[be("dt",{children:"Texture memory estimate"}),me("dd",{children:[ta(e.statistics.estimatedTextureBytes),e.statistics.unknownTextureSizes?` + ${e.statistics.unknownTextureSizes} unknown`:""]})]})]})]}),me("p",{className:"ri-diagnosticsNote",children:[e.scope==="resident-tiles"?"Counts cover loaded tiles only. ":"Counts include loaded hidden meshes. ","Buffer sizes and texture memory are estimates, not a GPU memory budget. Units do not verify physical scale."]})]}),be("div",{className:"ri-diagnosticsIssues",children:e.issues.map((i,o)=>me("details",{className:`ri-diagnosticsIssue ri-diagnosticsIssue--${i.severity}`,children:[me("summary",{children:[be("span",{className:"ri-diagnosticsSeverity",children:i.severity}),i.title,i.count!==void 0&&be("span",{className:"ri-diagnosticsCount",children:kn(i.count)})]}),me("div",{children:[be("p",{children:i.detail}),be("p",{className:"ri-diagnosticsFix",children:i.suggestion}),!!i.objects?.length&&be("ul",{"aria-label":`Affected objects: ${i.title}`,children:i.objects.map((a,s)=>be("li",{children:n&&!["failed-resources","large-textures"].includes(i.code)?be("button",{type:"button",onClick:()=>n(a),children:a}):a},`${a}-${s}`))}),i.count&&i.count>(i.objects?.length??0)&&i.objects&&me("small",{children:["Showing the first ",i.objects.length," of ",kn(i.count),"."]})]})]},`${i.code}-${o}`))}),!!e.textures.length&&me("details",{className:"ri-diagnosticsDetail",children:[me("summary",{children:["Texture dimensions (",e.textures.length,")"]}),be("ul",{children:e.textures.map((i,o)=>me("li",{children:[be("strong",{children:i.name}),me("span",{children:[i.width??"?"," \xD7 ",i.height??"?",i.compressed?" \xB7 compressed":""," \xB7 ",ta(i.estimatedBytes)]})]},o))})]}),!!e.extensions.length&&me("details",{className:"ri-diagnosticsDetail",children:[me("summary",{children:["glTF extensions (",e.extensions.length,")"]}),be("ul",{children:e.extensions.map(i=>me("li",{children:[be("strong",{children:i.name}),me("span",{children:[i.recognized?"Recognized":"Not recognized",i.required?" \xB7 required":" \xB7 optional"]})]},i.name))}),be("p",{className:"ri-diagnosticsNote",children:"Recognized by the bundled loader; compressed formats still require configured decoders and device support."})]})]}):be("p",{className:"ri-diagnosticsNote",role:"status",children:"Waiting for the active asset to load\u2026"}),me("details",{className:"ri-diagnosticsDetail ri-diagnosticsRuntimeDetail",children:[be("summary",{children:"Runtime statistics \xB7 live"}),me("section",{className:"ri-diagnosticsRuntime","aria-label":"Runtime statistics",children:[me("h4",{children:["Runtime statistics ",be("span",{children:"Live \xB7 this canvas"})]}),t?me(Vc,{children:[me("dl",{className:"ri-diagnosticsMetrics",children:[me("div",{children:[be("dt",{children:"Renderer / render loop"}),me("dd",{children:[t.renderer.toUpperCase()," / ",t.renderMode]})]}),me("div",{children:[be("dt",{children:"Draw calls (last pass)"}),be("dd",{children:dm(t.drawCalls)})]}),me("div",{children:[be("dt",{children:"Triangles (last pass)"}),be("dd",{children:dm(t.triangles)})]}),me("div",{children:[be("dt",{children:"Frame interval / FPS"}),be("dd",{children:t.frameIntervalMs===null?"Idle / no active frame sample":`${t.frameIntervalMs.toFixed(1)} ms / ${t.fps?.toFixed(0)}`})]}),me("div",{children:[be("dt",{children:"Quality profile"}),me("dd",{children:[t.quality.profile," \xB7 ",t.quality.reducedGpuLoad?"reduced GPU load":"full quality"]})]}),me("div",{children:[be("dt",{children:"Pixel ratio"}),be("dd",{children:t.quality.dpr.toFixed(2)})]}),me("div",{children:[be("dt",{children:"Shadows / post FX"}),me("dd",{children:[t.quality.shadows?"On":"Off"," / ",t.quality.postProcessing?"Allowed":"Skipped"]})]}),t.streaming&&me(Vc,{children:[me("div",{children:[be("dt",{children:"Tile cache / base budget"}),me("dd",{children:[ta(t.streaming.cachedBytes)," / ",ta(t.streaming.budgetBytes)]})]}),me("div",{children:[be("dt",{children:"Cached / loading / parsing tiles"}),me("dd",{children:[dm(t.streaming.cachedTiles)," / ",t.streaming.downloading," / ",t.streaming.parsing]})]}),me("div",{children:[be("dt",{children:"Detail / error target"}),me("dd",{children:["\xD7",t.streaming.detailFactor.toFixed(1)," / ",t.streaming.errorTarget.toFixed(1)]})]})]})]}),t.streaming&&(t.streaming.cacheFull||t.streaming.detailFactor>1)&&me("p",{className:"ri-diagnosticsPressure",children:[t.streaming.cacheFull?"Tile cache is full. ":"",t.streaming.detailFactor>1?"Detail was reduced by the existing memory-pressure safeguard. ":"","Try smaller textures or a larger cache budget when the device can support it."]}),be("p",{className:"ri-diagnosticsNote",children:"Frame intervals describe active frame callbacks, not CPU/GPU execution time. Long demand-loop idle gaps are excluded. Draw counts may reflect a post-processing pass. Sampling does not keep rendering awake."})]}):be("p",{className:"ri-diagnosticsNote",children:"Collecting a sample\u2026"})]})]})]})}import{AlertTriangle as B_}from"lucide-react";import{jsx as bs,jsxs as cx}from"react/jsx-runtime";function Fc({title:e,message:t,tone:r="default",showKeySetup:n=!1}){let i=ce();return cx("div",{className:`ri-license-overlay${r==="error"?" ri-license-overlay--error":""}`,children:[cx("div",{className:"ri-license-overlay__header",children:[r==="error"?bs(B_,{size:16,className:"ri-license-overlay__icon","aria-hidden":"true"}):bs("span",{className:"ri-license-overlay__statusDot","aria-hidden":"true"}),bs("span",{className:"ri-license-overlay__title",children:e})]}),t?bs("p",{className:"ri-license-overlay__message",children:t}):null,n&&bs("a",{href:"https://react-immersive.liveroom.dev/console",target:"_blank",rel:"noopener noreferrer",children:i("createDevelopmentKey")})]})}function pm(e,t){if(e)return e;let r=t?.background;return r?.enabled&&r.type==="color"?r.color:"#1c1c1d"}import{useEffect as gx,useState as F_,useRef as U_}from"react";var N_="ri:license-grant:v1",j_={"260cd89ea13f":"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEwjr3ofKTkkcxOM0GYl/RlJj9JsuyjSF8sYmCd2YqsHJCEO8EvlNDrO2Kl4agFKo6dRhyR2/oWeiU6P9WIqRbvw=="},ux=new Map;function px(e){let t=atob(e);return Uint8Array.from(t,r=>r.charCodeAt(0)).buffer}function dx(e){let t=e.replace(/-/g,"+").replace(/_/g,"/");return px(t.padEnd(Math.ceil(t.length/4)*4,"="))}function z_(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 Uc(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 mm(e,t){return`${N_}:${t}:${e}`}function V_(e,t){let r=ux.get(e);if(r)return r;let n=crypto.subtle.importKey("spki",px(t),{name:"ECDSA",namedCurve:"P-256"},!1,["verify"]);return ux.set(e,n),n}async function hm(e,t,r){if(!globalThis.crypto?.subtle)return null;try{let[n,i,o,a,...s]=e.split("."),l=j_[i];if(n!=="ri1"||!l||!o||!a||s.length>0)return null;let c=JSON.parse(new TextDecoder().decode(dx(o)));if(!z_(c)||!await crypto.subtle.verify({name:"ECDSA",hash:"SHA-256"},await V_(i,l),dx(a),new TextEncoder().encode(`${n}.${i}.${o}`)))return null;let m=Math.floor(Date.now()/1e3),u=c.expiresAt-c.issuedAt;return c.licenseKeyHash!==t||c.domain!==r||c.expiresAt<=m||c.issuedAt>m+300||u<=0||u>43200?null:{environment:c.environment,tier:c.tier,expiresAt:c.expiresAt}}catch{return null}}async function mx(e,t,r){try{return await hm(e,await Uc(t),r)}catch{return null}}async function hx(e,t,r){try{let n=await Uc(t);return await hm(e,n,r)?(localStorage.setItem(mm(n,r),e),!0):!1}catch{return!1}}async function fx(e,t){try{let r=await Uc(e),n=mm(r,t),i=localStorage.getItem(n);if(!i)return null;let o=await hm(i,r,t);return o||localStorage.removeItem(n),o}catch{return null}}async function fm(e,t){try{let r=await Uc(e);localStorage.removeItem(mm(r,t))}catch{}}var G_=["localhost","127.0.0.1","0.0.0.0"],H_=e=>G_.includes(e)||e.endsWith(".local")||e.endsWith(".localhost"),yx="https://react-immersive.liveroom.dev/api/validate-license",xx=()=>typeof window<"u",W_=300*1e3,q_=5e3,X_=400,bm=new Map,gm=new Map,vi=class extends Error{},wx=async(e,t,r)=>{let n=await fx(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},bx=async(e,t,r)=>{let n=await wx(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})},$_=e=>e instanceof vi||e instanceof TypeError,Y_=()=>new Promise(e=>setTimeout(e,X_)),K_=e=>e==="development"||e==="production",Q_=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&&!K_(t.environment)||t.tier!==void 0&&typeof t.tier!="string"||t.offlineGrant!==void 0&&typeof t.offlineGrant!="string")},J_=e=>{if(!e||typeof e!="object")return null;let t=e,r=t.reason??t.error;return typeof r=="string"&&r.trim()?r:null},Sx=(e,t,r)=>`${r}::${e}::${t}`,Mx=e=>{let t=bm.get(e);return t?Date.now()-t.timestamp>W_?(bm.delete(e),null):t.result:null},Z_=(e,t)=>({status:e.valid?"valid":"invalid",reason:e.reason,environment:e.environment,tier:e.tier,isLocalDomain:t}),eA=(e,t)=>({status:"invalid",reason:e,isLocalDomain:t});async function tA(e,t,r,n){let i=Sx(e,t,n),o=Mx(i);if(o)return o;let a=gm.get(i);if(a)return a;let s=(async()=>{for(let l=0;l<2;l+=1)try{return await rA(e,t,r,i,n)}catch(c){if(!$_(c))throw c;if(l===0){let d=await wx(e,t,r);if(d)return d;await Y_();continue}return bx(e,t,r)}return bx(e,t,r)})().finally(()=>{gm.delete(i)});return gm.set(i,s),s}async function rA(e,t,r,n,i){let o=new AbortController,a=setTimeout(()=>o.abort(),q_),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 vi("License validation timed out"):d}finally{clearTimeout(a)}let l;try{l=await s.json()}catch{throw new vi(`License server returned a non-JSON response${s.status?` (${s.status})`:""}`)}if(!s.ok){if(s.status===429||s.status>=500)throw new vi(`License server error (${s.status})`);let d=J_(l)??`License validation failed${s.status?` (${s.status})`:""}`;return await fm(e,t),eA(d,r)}if(!Q_(l))throw new vi("License server returned an unexpected payload");let c=Z_(l,r);if(c.status==="valid"&&i!==yx){let d=l.offlineGrant?await mx(l.offlineGrant,e,t):null;if(!d)throw new vi("License validation endpoint did not return a verifiable signed grant");c={...c,environment:d.environment,tier:d.tier}}return c.status==="valid"?(bm.set(n,{result:c,timestamp:Date.now()}),l.offlineGrant&&(await hx(l.offlineGrant,e,t)||console.warn("[react-immersive] The license server returned an invalid offline grant; it was not cached."))):await fm(e,t),c}var vx=(e,t)=>{let r=e.trim();return!xx()||!r?null:Mx(Sx(r,window.location.hostname.toLowerCase(),t))},Cx=(e,t=yx,r)=>{let[n,i]=F_(()=>vx(e,t)??{status:"checking",isLocalDomain:!1}),o=U_(r);return o.current=r,gx(()=>{o.current?.(n)},[n]),gx(()=>{if(!xx())return;let a=!1,s=h=>{a||i(h)},l=e.trim(),c=window.location.hostname.toLowerCase(),d=H_(c),m=vx(e,t);return m?(s(m),()=>{a=!0}):(s({status:"checking",isLocalDomain:d}),l?((async()=>{try{s(await tA(l,c,d,t))}catch(h){let p=h instanceof TypeError?"Could not reach license server":h instanceof Error?h.message:"License validation failed";s({status:"invalid",reason:p,isLocalDomain:d})}})(),()=>{a=!0}):(s({status:"invalid",reason:"No license key provided",isLocalDomain:d}),()=>{a=!0}))},[e,t]),n};import{Box3 as cA,Mesh as uA,Raycaster as dA,Triangle as pA,Vector3 as dn}from"three";import{useCallback as Gc,useEffect as nA,useRef as Hc}from"react";import{Matrix4 as iA,Triangle as Px,Vector3 as vs}from"three";var oA=500,aA=10,sA=5;function Wc(e,t,r){let n=Hc({resolve:e,onContextMenu:t,anchorOf:r});n.current={resolve:e,onContextMenu:t,anchorOf:r};let i=Hc(null),o=Hc(!1),a=Hc(null),s=Gc(()=>{let m=i.current;m?.timer&&clearTimeout(m.timer),i.current=null,a.current?.(),a.current=null},[]),l=Gc(()=>{let m=i.current;m&&(s(),m.kind==="touch"&&(o.current=!0,setTimeout(()=>o.current=!1,800)),n.current.onContextMenu?.(m.target,m.pointer))},[s]),c=Gc(m=>{let u=m.nativeEvent,h=u.pointerType!=="touch"&&u.button===2,p=u.pointerType==="touch"&&u.button===0;if(!n.current.onContextMenu||!h&&!p)return;let g=n.current.resolve(m.object);if(g===null)return;s();let b={target:g,kind:h?"right":"touch",pointerId:u.pointerId,pointer:ra(m,n.current.anchorOf?.(m.object)),timer:p?setTimeout(l,oA):null};i.current=b;let w=h?sA:aA,f=x=>Math.hypot(x.clientX-b.pointer.clientX,x.clientY-b.pointer.clientY)>w,y=x=>{x.pointerId===b.pointerId&&f(x)&&s()},S=x=>{x.pointerId===b.pointerId&&(b.kind==="right"&&!f(x)?l():s())},M=x=>{x.pointerId!==b.pointerId&&s()};window.addEventListener("pointermove",y),window.addEventListener("pointerup",S),window.addEventListener("pointercancel",s),window.addEventListener("pointerdown",M),a.current=()=>{window.removeEventListener("pointermove",y),window.removeEventListener("pointerup",S),window.removeEventListener("pointercancel",s),window.removeEventListener("pointerdown",M)}},[s,l]);nA(()=>s,[s]);let d=Gc(()=>o.current?(o.current=!1,!0):!1,[]);return{onPointerDown:c,consumeClick:d}}function lA(e,t){let r=e.face,n=t.geometry.getAttribute("position");if(!r||!n)return null;let i=e.barycoord??null;if(!i){let[m,u,h]=[r.a,r.b,r.c].map(p=>t.getVertexPosition(p,new vs));if(i=Px.getBarycoord(t.worldToLocal(e.point.clone()),m,u,h,new vs),!i)return null}let[o,a,s]=[r.a,r.b,r.c].map(m=>new vs().fromBufferAttribute(n,m)),l=new vs().addScaledVector(o,i.x).addScaledVector(a,i.y).addScaledVector(s,i.z),c=new Px(o,a,s).getNormal(new vs);return r.normal.clone().transformDirection(t.matrixWorld).dot(e.ray.direction)>0&&c.negate(),{position:[l.x,l.y,l.z],normal:[c.x,c.y,c.z]}}function no(e,t){if(t.updateWorldMatrix(!0,!1),e.object===t&&t.isSkinnedMesh===!0){let i=lA(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 iA().copy(t.matrixWorld).invert()),{position:[r.x,r.y,r.z],normal:[n.x,n.y,n.z]}}function ra(e,t){let r=e.nativeEvent;return{clientX:r.clientX,clientY:r.clientY,pointerType:"pointerType"in r?r.pointerType:"mouse",...t?{surface:no(e,t)}:{}}}function Tx(e,t){if(!(e instanceof uA)||!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 cA,i=new dn;if(fr(e)){let x=e;x.computeBoundingBox(),x.computeBoundingSphere();for(let C=0;C<r.count;C++)n.expandByPoint(e.getVertexPosition(C,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 dn),a=t.getWorldPosition(new dn),s=t.getWorldDirection(new dn),l=t.isOrthographicCamera,c=new dA,d=x=>{if(l){let A=a.distanceTo(o)+n.getSize(i).length()+1;c.set(x.clone().addScaledVector(s,-A),s)}else c.set(a,x.clone().sub(a).normalize());let C=c.intersectObject(e,!1)[0];return C?no({...C,ray:c.ray},e):null},m=d(o);if(m)return m;let u=e.geometry.index,h=u?.count??r.count,p=new dn,g=new dn,b=new dn,w=new dn,f=new dn,y=new dn,S=null,M=1/0;for(let x=0;x+2<h;x+=3){if(e.getVertexPosition(u?u.getX(x):x,p).applyMatrix4(e.matrixWorld),e.getVertexPosition(u?u.getX(x+1):x+1,g).applyMatrix4(e.matrixWorld),e.getVertexPosition(u?u.getX(x+2):x+2,b).applyMatrix4(e.matrixWorld),w.copy(p).add(g).add(b).multiplyScalar(1/3),pA.getNormal(p,g,b,f),l?y.copy(s).negate():y.copy(a).sub(w),f.dot(y)<=0)continue;let C=w.distanceToSquared(o);C<M&&(M=C,S=w.clone())}return S?d(S):null}import{Mesh as mA,Raycaster as hA,Triangle as fA,Vector2 as _x,Vector3 as Dn}from"three";function Ax(e,t,r,n){if(!(e instanceof mA)||!t)return null;e.updateWorldMatrix(!0,!1),t.updateWorldMatrix(!0,!1);let i=new Dn().fromArray(r.position);if(fr(e)){let c=e;c.computeBoundingBox(),c.computeBoundingSphere();let d=c.geometry.getAttribute("position");if(!d)return null;let m=c.geometry.index,u=m?.count??d.count,h=new fA,p=new Dn,g=new Dn,b=1/0,w=null;for(let f=0;f+2<u;f+=3){let y=[0,1,2].map(M=>m?m.getX(f+M):f+M);h.a.fromBufferAttribute(d,y[0]),h.b.fromBufferAttribute(d,y[1]),h.c.fromBufferAttribute(d,y[2]),h.closestPointToPoint(i,p);let S=p.distanceToSquared(i);if(!(S>=b||!h.getBarycoord(p,g))&&(b=S,w=new Dn().addScaledVector(c.getVertexPosition(y[0],new Dn),g.x).addScaledVector(c.getVertexPosition(y[1],new Dn),g.y).addScaledVector(c.getVertexPosition(y[2],new Dn),g.z),b<1e-12))break}if(!w)return null;i.copy(w)}if(i.applyMatrix4(e.matrixWorld).project(t),!Number.isFinite(i.x)||i.z<-1||i.z>1)return null;let o=new _x(n==="left"?-.0035:n==="right"?.0035:0,n==="down"?-.0035:n==="up"?.0035:0),a=new hA,s=r.size*.01,l=new Dn().fromArray(r.position);for(let c=1;c>=1/1024;c/=2){a.setFromCamera(new _x(i.x,i.y).addScaledVector(o,c),t);let d=a.intersectObject(e,!1)[0];if(d){let m=no({...d,ray:a.ray},e);if(new Dn().fromArray(m.position).distanceTo(l)<=s)return m}}return null}import{Box3 as ys,PerspectiveCamera as Rx,Sphere as gA,Vector3 as na}from"three";function Ex(e,t,r,n,i,o=!1){return!!(e?.usesSlots&&t.usesSlots&&e.url!==t.url&&r.includes(e.url)&&r.includes(t.url)&&n[e.url]&&n[t.url]&&(o||i[e.url]&&i[t.url]))}function kx(e,t,r){let n=t?.camera;if(!(n instanceof Rx))return null;let o=(e instanceof ys?e:new ys().setFromObject(e)).getSize(new na).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 Dx(e,t){let r=e.camera;if(!(r instanceof Rx)||!(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 qc={paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5},xs={kind:"model"};function Ox(e,t){let r=new ys().setFromObject(t);return r.isEmpty()?!1:(r.expandByScalar(r.getSize(new na).length()*.05),r.containsPoint(e.getTarget(new na)))}function Lx(e,t){return e.getTarget(new na).distanceTo(t)<=Math.max(e.distance,1)*.001}async function vm(e,t,r=.6){let n=e.smoothTime;e.smoothTime=mc(e,r);try{return await t()}finally{e.smoothTime=n}}async function Ix(e,t,{flyIn:r,onStart:n,invalidate:i}){if(r){let o=(t instanceof ys?t:new ys().setFromObject(t)).getBoundingSphere(new gA),a=o.center.clone(),l=e.getPosition(new na).clone().sub(e.getTarget(new na));l.lengthSq()<1e-6&&l.set(0,0,1),l.normalize();let c=Math.max(o.radius*10,20),d=a.clone().add(l.multiplyScalar(c));await e.setLookAt(d.x,d.y,d.z,a.x,a.y,a.z,!1)}n(),await vm(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 bA,useMemo as Bx,useRef as vA}from"react";import{useFrame as yA,useThree as xA}from"@react-three/fiber";import{Box3 as wA,Box3Helper as SA,Group as MA}from"three";import{jsx as CA}from"react/jsx-runtime";function Nx({source:e,highlights:t}){let r=xA(a=>a.invalidate),n=Bx(()=>new MA,[]),i=Bx(()=>t.map(a=>{let s=new SA(new wA,a.color);s.raycast=()=>{};let l=s.material;return l.depthTest=!1,l.transparent=!0,l.opacity=.85,s.renderOrder=1e3,$o(s),{helper:s,id:a.objectId}}),[t]);bA(()=>{for(let{helper:a}of i)n.add(a);return r(),()=>{for(let{helper:a}of i)n.remove(a),a.geometry.dispose(),a.material.dispose();r()}},[n,i,r]);let o=vA(null);return yA(()=>{let a=e.current;if(!a){n.visible=!1;return}n.visible=!0,(o.current?.root!==a||o.current.helpers!==i)&&(o.current={root:a,helpers:i,nodes:ui(a).nodesById});let s=o.current.nodes;for(let{helper:l,id:c}of i){let d=s[c];l.visible=!!d,d&&l.box.setFromObject(d)}}),CA("primitive",{object:n})}function jx(e){let t=[],r="",n=null,i=null,o=0,a="stopped",s=!1,l=[],c=0,d=!1,m=!1,u={sequenceId:null,time:0,duration:0,status:a,previewing:s,ready:!1,issues:[]},h=new Set,p=()=>t.find(S=>S.id===i),g=()=>{u={sequenceId:i,time:o,duration:p()?.duration??0,status:a,previewing:s,ready:!!n,issues:l},h.forEach(S=>S())},b=()=>{n?.restore(),o=0,a="stopped",s=!1,g(),n?.invalidate()},w=S=>t.some(M=>M.id===S)?(i===S||(n?.restore(),i=S,o=0,a="stopped",s=!1,l=n?.inspect(p())??[],g(),n?.invalidate()),!0):!1,f=S=>{if(S&&!w(S))return!1;let M=p();return!n||!M?.tracks.some(x=>!x.muted&&x.keyframes.length)?!1:(e?.(),m=!0,o>=M.duration&&(o=0),a="playing",s=!0,l=n.inspect(M),g(),n.invalidate(),!0)},y=()=>{if(!n||!d||m)return;let S=t.find(M=>M.autoPlay);S&&f(S.id)};return{getState:()=>u,subscribe:S=>(h.add(S),()=>{h.delete(S)}),select:w,play:f,stop:b,pause:()=>{a==="playing"&&(a="paused",g())},seek:S=>{let M=p();return!n||!M||!Number.isFinite(S)?!1:(e?.(),o=Math.max(0,Math.min(M.duration,S)),s=!0,a!=="playing"&&(a="paused"),l=n.inspect(M),g(),n.invalidate(),!0)},capture:S=>n?.capture(S)??null,configure:(S,M)=>{d=M;try{let x=dc(S??[]),C=JSON.stringify(x);if(r===C){y();return}n?.restore(),t=x,r=C,p()||(i=t[0]?.id??null,o=0,s=!1),o=Math.min(o,p()?.duration??0),a=s?"paused":"stopped",l=p()?n?.inspect(p())??[]:[],g(),n?.invalidate(),y()}catch(x){b(),t=[],r="",i=null,l=[x instanceof Error?x.message:"Invalid sequence configuration."],g()}},connect:S=>{n?.restore(),n=S,S||(a="stopped",s=!1,o=0),l=p()?n?.inspect(p())??[]:[],g(),y()},advance:S=>{let M=p();if(!M||!n||a!=="playing"||!Number.isFinite(S)||S<0)return;let x=Math.min(S,.1);o+=x,c+=x,o>=M.duration&&(M.loop?o%=M.duration:(o=M.duration,a="finished")),(c>=1/30||a==="finished")&&(c=0,g())},frame:()=>{let S=p();return s&&S?{sequence:S,time:o,playing:a==="playing"}:null},destroy:()=>{n?.restore(),n=null,a="stopped",s=!1,o=0,g()}}}import{useLayoutEffect as Xc,useMemo as PA,useRef as TA}from"react";import{useFrame as _A,useThree as AA}from"@react-three/fiber";function zx({controller:e,source:t,controls:r,animations:n,ready:i,sequences:o,autoPlay:a,authoredRevision:s,cameraEnabled:l=!0}){let c=AA(u=>u.invalidate),d=TA({source:t,controls:r,animations:n,cameraEnabled:l});d.current={source:t,controls:r,animations:n,cameraEnabled:l};let m=PA(()=>Mv({root:()=>d.current.source.current,controls:()=>d.current.controls.current,animations:()=>d.current.animations.current,cameraEnabled:()=>d.current.cameraEnabled,invalidate:c}),[e,c]);return Xc(()=>(c(),()=>m.restore()),[m,s,o,c]),Xc(()=>{e.configure(o,a)},[e,o,a]),Xc(()=>(e.connect(i?m:null),()=>e.connect(null)),[e,m,i]),Xc(()=>{if(!l)return;let u=r.current,h=()=>e.pause();return u?.addEventListener("controlstart",h),()=>u?.removeEventListener("controlstart",h)},[e,r,i,l]),_A((u,h)=>{if(!i)return;e.advance(h);let p=e.frame();p&&m.apply(p),p?.playing&&c()}),null}import{useEffect as Vx,useRef as Fx,useState as Ux}from"react";function Gx(e,t){if(!e?.configuration)return e;let r=e.configuration,n=r.models?.find(o=>Le(o)===t||o.url===t);if(!n)return e;let i=r.activeModelId??r.modelUrl;return{...e,objectBindings:n.objectBindings,configuration:{...r,models:r.models?.map(o=>Le(o)===i?{...o,sceneConfig:r.sceneConfig,objectBindings:e.objectBindings??o.objectBindings}:o),activeModelId:Le(n),modelUrl:n.url,sceneConfig:n.sceneConfig??r.sceneConfig}}}function Hx(e){let[t,r]=Ux(null),[n,i]=Ux(null),o=Rc(e.arHandoff),a=!!e.arHandoff&&o?.autoRestore!==!1,s=o?.storage,l=`${e.modelUrl}
|
|
4
|
-
${e.activeModelId??""}`,c=Fx(l);c.current=l;let d=Fx(l);if(Vx(()=>{l!==d.current&&(d.current=l,r(null))},[l]),Vx(()=>{if(!a||typeof window>"u"){r(null),i(null);return}let u,h=()=>{u?.abort(),u=new AbortController;let p=u.signal,g=c.current;i(null),oy(window.location.href,s,p).then(b=>{!p.aborted&&c.current===g&&r(b)}).catch(b=>{!p.aborted&&c.current===g&&(r(null),i(b instanceof Error?b.message:"Could not restore the AR configuration."))})};return h(),window.addEventListener("hashchange",h),()=>{u?.abort(),window.removeEventListener("hashchange",h)}},[a,s]),!t?.configuration)return{props:e,error:n};let m=t.configuration;return{error:n,props:{...e,...m,objectBindings:t.objectBindings??e.objectBindings,onObjectBindingsChange:u=>{r(h=>h?.configuration?{...h,objectBindings:u,configuration:{...h.configuration,models:h.configuration.models?.map(p=>Le(p)===(h.configuration?.activeModelId??h.configuration?.modelUrl)?{...p,objectBindings:u}:p)}}:h),e.onObjectBindingsChange?.(u)},onSceneConfigChange:u=>{r(h=>h?.configuration?{...h,configuration:{...h.configuration,sceneConfig:u}}:h),e.onSceneConfigChange?.(u)},onIsolationChange:u=>{r(h=>h?.configuration?{...h,configuration:{...h.configuration,isolation:u}}:h),e.onIsolationChange?.(u)},onActiveModelChange:u=>{r(h=>Gx(h,u)),e.onActiveModelChange?.(u)},onModelChange:u=>{r(h=>Gx(h,u)),e.onModelChange?.(u)}}}}import{useCallback as ym,useEffect as $c,useRef as ws,useState as xm}from"react";function Wx({enabled:e,options:t,state:r,getSources:n,baseUrl:i,revision:o="",autoPrepare:a=!1,preparePhoneLink:s=!0}){let l,c=!1;try{l=e?ny(r,t?.assetVersion,t?.maxTextureSize)+(i??"")+o:"disabled"}catch{c=!0,l="invalid-configuration"+(t?.assetVersion??"")+o}s||(l+=":usdz-only");let[d,m]=xm(!1),[u,h]=xm(!1),[p,g]=xm(null),b=ws(null),w=ws(!1),f=ws(null),y=ws(null),S=ws({key:l,state:r,options:t,getSources:n,baseUrl:i,enabled:e,invalidConfiguration:c,preparePhoneLink:s});S.current={key:l,state:r,options:t,getSources:n,baseUrl:i,enabled:e,invalidConfiguration:c,preparePhoneLink:s};let M=ym(()=>{f.current&&URL.revokeObjectURL(f.current),f.current=null},[]);$c(()=>{b.current?.abort(),w.current=!1,h(!1),M(),g(R=>e&&R?{key:R.key,invalidated:!0,warnings:[]}:null),e||m(!1)},[l,e,M]),$c(()=>()=>{b.current?.abort(),M()},[M]);let x=e&&!p?.invalidated&&p?.key===l,C=x&&!!(p.usdzUrl||p.phoneUrl),A=u?"preparing":e?p&&!x?"stale":x?C?"ready":"error":"idle":"idle";$c(()=>{S.current.options?.onStatusChange?.(A)},[A]);let P=ym(()=>{b.current?.abort(),w.current&&(g(null),M()),w.current=!1,h(!1),m(!1)},[M]),_=ym(async()=>{let R=S.current;if(!R.enabled)return;b.current?.abort(),M(),g(null),h(!0),w.current=!0;let k=new AbortController;b.current=k;let T=()=>!k.signal.aborted&&S.current.key===R.key&&S.current.enabled,L=ee=>{T()&&g(J=>({...J?.key===R.key&&!J.invalidated?J:{key:R.key,warnings:[]},...ee}))},F;try{if(R.invalidConfiguration)throw new Error("Invalid configuration");F=structuredClone(R.state)}catch{let ee=new Error("Configuration contains data that cannot be copied for AR. Use JSON-compatible binding metadata.");w.current=!1,h(!1),L({exportError:ee.message}),R.options?.onError?.(ee);return}let j,V={configurationKey:R.key,state:F,signal:k.signal,exportUSDZ:()=>j??(j=Promise.resolve().then(()=>gy(R.getSources(),{scaleMode:R.state.configuration?.arScaleMode,maxTextureSize:R.options?.maxTextureSize,signal:k.signal})))},E=[],O=async()=>{try{let ee=R.options?.createUSDZ?await R.options.createUSDZ(V):(await V.exportUSDZ()).blob,J=j?await j.then(Q=>Q.warnings,()=>[]):[];if(!T())return;let U;if(typeof ee=="string")U=em(ee,window.location.href);else if(ee instanceof Blob&&ee.size>0)U=URL.createObjectURL(ee),f.current=U;else throw new Error("The USDZ adapter returned an empty asset.");L({usdzUrl:U,warnings:J})}catch(ee){let J=ee instanceof Error?ee.message:String(ee);E.push(J),L({exportError:J})}},Z=async()=>{try{let ee=R.options?.createMobileUrl?await R.options.createMobileUrl(V):await ry(V.state,window.location.href).then(U=>iy(U,R.baseUrl||window.location.href,R.options?.storage,k.signal));if(!T())return;let J=em(ee,window.location.href);if(J.length>2200)throw new Error("The phone link is too long for a reliable QR code.");L({phoneUrl:J})}catch(ee){let J=ee instanceof Error?ee.message:String(ee);!R.options?.createMobileUrl&&J.includes("durable URL")&&(J="QR sharing isn\u2019t available for local uploads. Download the USDZ and send it to your phone."),!R.options?.createMobileUrl&&(J.includes("reachable from your phone")||J.includes("asset URL points to this computer"))&&(J="QR sharing needs a viewer page and model files your phone can reach. Use an online viewer, or download the USDZ."),E.push(J),L({linkError:J})}};await Promise.all([O(),R.preparePhoneLink?Z():Promise.resolve()]),T()&&(w.current=!1,h(!1),E.length&&R.options?.onError?.(new Error(E.join(`
|
|
5
|
-
`))))},[M]);return $c(()=>{if(!e||!d&&!a){y.current=null;return}C||u||y.current===l||(y.current=l,_())},[e,d,a,l,C,u,_]),{open:e&&d,show:()=>m(!0),close:P,prepare:_,status:A,busy:u,prepared:x?p:null}}import{useEffect as RA,useId as EA,useRef as kA}from"react";import{QRCodeSVG as DA}from"qrcode.react";import{Download as OA,ExternalLink as LA,LoaderCircle as IA,RefreshCw as BA,Smartphone as NA,X as jA}from"lucide-react";import{Fragment as zA,jsx as Lt,jsxs as ia}from"react/jsx-runtime";function qx({handoff:e,filename:t,onQuickLook:r}){let n=ce(),i=EA(),o=kA(null),a=e.close;RA(()=>{let d=document.activeElement;o.current?.focus();let m=u=>{if(u.key==="Escape"&&(u.preventDefault(),a()),u.key!=="Tab")return;let h=Array.from(o.current.querySelectorAll("button:not(:disabled), a[href], summary")),p=h[0],g=h[h.length-1];u.shiftKey&&(document.activeElement===p||document.activeElement===o.current)?(u.preventDefault(),g?.focus()):!u.shiftKey&&(document.activeElement===g||document.activeElement===o.current)&&(u.preventDefault(),p?.focus())};return document.addEventListener("keydown",m),()=>{document.removeEventListener("keydown",m),d?.focus()}},[a]);let s=e.prepared,l=!e.busy&&(e.status==="ready"||e.status==="error"),c=e.status==="error"?n("arRetry"):n("arRefresh");return Lt("div",{className:"ri-mobileHandoffBackdrop",onMouseDown:d=>{d.target===d.currentTarget&&a()},children:ia("section",{ref:o,tabIndex:-1,className:"ri-mobileHandoffDialog ri-configuredARDialog",role:"dialog","aria-modal":"true","aria-labelledby":i,"aria-busy":e.busy&&!s?.phoneUrl&&!s?.usdzUrl,children:[Lt("button",{type:"button",className:"ri-mobileHandoffClose",onClick:a,"aria-label":n("closePhoneHandoff"),children:Lt(jA,{size:18})}),Lt(NA,{size:22,"aria-hidden":"true"}),Lt("h2",{id:i,children:n("arConfiguredTitle")}),Lt("div",{role:"status","aria-live":"polite",className:"ri-configuredARProgress",children:(e.busy||e.status==="idle"||e.status==="stale")&&ia("p",{children:[Lt(IA,{size:16,"aria-hidden":"true"}),n("arPreparing")]})}),s?.phoneUrl&&ia(zA,{children:[Lt("p",{children:n("arScanConfigured")}),Lt("div",{className:"ri-mobileHandoffQr",children:Lt(DA,{value:s.phoneUrl,size:208,level:"M",marginSize:4,title:n("qrCodeToOpenThisModelOnAPhone")})})]}),s?.usdzUrl&&kc()&&ia("a",{rel:"ar",className:"ri-configuredARLaunch",href:s.usdzUrl,onClick:r,children:[Lt("img",{alt:"",width:"1",height:"1",src:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw=="}),n("viewInAR")]}),(s?.phoneUrl||s?.usdzUrl||l)&&ia("div",{className:"ri-configuredARActions",children:[s?.phoneUrl&&Lt("a",{className:"ri-configuredARAction",href:s.phoneUrl,target:"_blank",rel:"noopener noreferrer",title:n("arOpenConfiguredLink"),"aria-label":n("arOpenConfiguredLink"),children:Lt(LA,{size:16,"aria-hidden":"true"})}),s?.usdzUrl&&Lt("a",{className:"ri-configuredARAction",href:s.usdzUrl,download:`${t}-configured.usdz`,title:n("arDownloadUSDZ"),"aria-label":n("arDownloadUSDZ"),children:Lt(OA,{size:16,"aria-hidden":"true"})}),l&&Lt("button",{type:"button",className:"ri-configuredARAction",onClick:()=>{e.prepare()},title:c,"aria-label":c,children:Lt(BA,{size:16,"aria-hidden":"true"})})]}),s?.exportError&&Lt("p",{role:"alert",children:s.exportError}),s?.linkError&&Lt("p",{role:"status",children:s.linkError}),!!s?.warnings.length&&ia("details",{className:"ri-configuredARDetails",children:[Lt("summary",{children:n("arExportDetails")}),s.warnings.map(d=>Lt("p",{className:"ri-configuredARNote",children:d},d))]})]})})}import{useState as Xx}from"react";import{Smartphone as $x}from"lucide-react";import{jsx as oa,jsxs as wm}from"react/jsx-runtime";function Yx({xrStore:e,arSupported:t,checkingAR:r,quickLookSupported:n,modelReady:i,inARSession:o,handoff:a,onQuickLook:s,animationControls:l}){let c=ce(),[d,m]=Xx(!1),[u,h]=Xx(null);if(o)return null;let p=!!(e&&t),g=a.prepared?.usdzUrl,b=!p&&n?a.prepared?.exportError:void 0,w=p||n,f=i&&(p||!!(n&&g)),y=r?c("arCheckingSupport"):w?i?!f&&!b?c("arPreparing"):null:c("loadingModel"):c("arUnavailable"),S=async()=>{if(e){m(!0),h(null);try{await e.enterAR()}catch(M){h(M instanceof Error?M.message:c("arStartFailed"))}finally{m(!1)}}};return wm("div",{className:"ri-arLandingControls",children:[n&&!p&&i&&l,f&&!p&&g?wm("a",{className:"ri-arLandingStart",rel:"ar",href:g,onClick:s,children:[oa("img",{alt:"",width:"1",height:"1",src:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw=="}),oa($x,{size:20,"aria-hidden":"true"}),c("arStart")]}):b?oa("button",{type:"button",className:"ri-arLandingStart",onClick:()=>{a.prepare()},children:c("arRetry")}):wm("button",{type:"button",className:"ri-arLandingStart",disabled:!f||d,onClick:()=>{S()},children:[oa($x,{size:20,"aria-hidden":"true"}),c(d?"arStarting":"arStart")]}),y&&oa("p",{role:"status",children:y}),(u||b)&&oa("p",{role:"alert",children:u||b})]})}import{useCallback as Qx,useEffect as VA,useMemo as FA,useRef as UA,useState as GA,useSyncExternalStore as HA}from"react";import{Pause as WA,Play as qA}from"lucide-react";function Yc(e,t){return[...e.flatMap(r=>r.controls.clips.flatMap(n=>{let i=r.config?.clips.find(o=>o.sourceName===n);return i?.hidden?[]:[{kind:"clip",id:JSON.stringify(["clip",r.id,n]),label:i?.displayName?.trim()||n,source:r,clip:n}]})),...t.filter(r=>r.tracks.some(n=>!n.muted&&n.keyframes.length&&n.target.kind!=="camera")).map(r=>({kind:"sequence",id:JSON.stringify(["sequence",r.id]),label:r.name,sequence:r}))]}function Ss(e,t,r,n=!1){(n||e.kind==="clip"&&r.getState().previewing)&&r.stop(),n&&t.forEach(({controls:i})=>i.stop()),e.kind==="clip"?e.source.controls.play(e.clip):r.play(e.sequence.id)}function Kx(e,t){e.kind==="clip"?e.source.controls.pause(e.clip):t.pause()}import{jsx as io,jsxs as Jx}from"react/jsx-runtime";function Zx({sources:e,sequences:t,sequenceControls:r}){let n=ce(),[i,o]=GA(null),a=UA(null),s=FA(()=>Yc(e,t),[e,t]),l=Qx(p=>{let g=e.map(b=>b.controls.subscribe?.(p));return g.push(r.subscribe(p)),()=>g.forEach(b=>b?.())},[e,r]),c=Qx(()=>{let p=r.getState();return JSON.stringify([e.map(({controls:g})=>{let b=g.getState?.();return[b?.currentClip,b?.active.map(w=>[w.clip,w.status])]}),[p.sequenceId,p.status,p.previewing,p.ready]])},[e,r]);HA(l,c,c),VA(()=>{let p=a.current,g=b=>b.preventDefault();return p?.addEventListener("beforexrselect",g),()=>p?.removeEventListener("beforexrselect",g)},[s.length]);let d=r.getState(),m=s.find(p=>p.id===i)??s.find(p=>p.kind==="sequence"&&d.previewing&&p.sequence.id===d.sequenceId)??s.find(p=>p.kind==="clip"&&p.source.controls.getState?.().currentClip===p.clip)??s[0];if(!m)return null;let u=m.kind==="clip"?m.source.controls.getState?.().active.some(p=>p.clip===m.clip&&p.status==="playing"):d.sequenceId===m.sequence.id&&d.status==="playing",h=n(u?"arAnimationPause":"arAnimationPlay");return Jx("div",{className:"ri-arAnimations",ref:a,role:"group","aria-label":n("arAnimations"),onPointerDown:p=>p.stopPropagation(),onTouchStart:p=>p.stopPropagation(),onTouchMove:p=>p.stopPropagation(),children:[Jx("select",{"aria-label":n("arAnimationSelect"),value:m.id,onChange:p=>{let g=s.find(b=>b.id===p.target.value);g&&(o(g.id),Ss(g,e,r,!0))},children:[e.map(p=>{let g=s.filter(b=>b.kind==="clip"&&b.source.id===p.id);return g.length?io("optgroup",{label:e.length>1?p.label:n("arAnimationClips"),children:g.map(b=>io("option",{value:b.id,children:b.label},b.id))},p.id):null}),s.some(p=>p.kind==="sequence")&&io("optgroup",{label:n("arAnimationSequences"),children:s.filter(p=>p.kind==="sequence").map(p=>io("option",{value:p.id,children:p.label},p.id))})]}),io("button",{type:"button",className:"ri-arActionButton","aria-label":h,title:h,disabled:m.kind==="sequence"&&!d.ready,onClick:()=>{u?Kx(m,r):Ss(m,e,r)},children:u?io(WA,{size:18,"aria-hidden":"true"}):io(qA,{size:18,"aria-hidden":"true"})})]})}import{jsx as aa,jsxs as XA}from"react/jsx-runtime";function e0({options:e,sources:t,value:r,onChange:n}){let i=ce();if(!e.length)return null;let o=e.filter(c=>c.kind==="clip"?c.source.config?.autoplayClip===c.clip:c.sequence.autoPlay),a=o.length===1?o[0]:void 0,s=a?.label??i(o.length?"arAnimationSaved":"arAnimationNone"),l=a?e.filter(c=>c.id!==a.id):e;return aa("div",{className:"ri-arAnimations ri-arQuickLookAnimations",children:XA("select",{"aria-label":i("arAnimationSelect"),value:a?.id===r?"":r,onChange:c=>n(c.target.value),children:[aa("option",{value:"",children:s}),t.map(c=>{let d=l.filter(m=>m.kind==="clip"&&m.source.id===c.id);return d.length?aa("optgroup",{label:t.length>1?c.label:i("arAnimationClips"),children:d.map(m=>aa("option",{value:m.id,children:m.label},m.id))},c.id):null}),l.some(c=>c.kind==="sequence")&&aa("optgroup",{label:i("arAnimationSequences"),children:l.filter(c=>c.kind==="sequence").map(c=>aa("option",{value:c.id,children:c.label},c.id))})]})})}function t0(e,t,r){return t?e.map(n=>({...n,sceneConfig:{...n.sceneConfig,animations:{clips:n.sceneConfig?.animations.clips??[],autoplayClip:t.kind==="clip"&&n.instanceId===t.source.id?t.clip:null},sequences:(n.sceneConfig?.sequences??[]).map(i=>({...i,autoPlay:t.kind==="sequence"&&n.instanceId===r&&i.id===t.sequence.id}))}})):e}import{useRef as de,useState as Ce,useEffect as We,useCallback as fe,useMemo as wt,Suspense as $1}from"react";import{createPortal as xN}from"react-dom";import{Box3 as wN,Color as SN,Raycaster as MN,Vector2 as CN,Vector3 as Gf}from"three";import{Component as $A}from"react";var pn=class extends $A{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 r0,useEffect as n0,useState as YA}from"react";function i0({enabled:e,activeUrl:t,models:r,errorsRef:n,activeFailed:i,activeError:o,onActiveError:a,onExtraError:s}){let[l,c]=YA(0),d=r0((u,h)=>{n.current.set(u,h),c(p=>p+1),u!==t&&s?.(u,h)},[t,n,s]),m=r0(u=>{n.current.delete(u)&&c(h=>h+1)},[n]);return n0(()=>{let u=new Set(e?r?.map(Le):[]);for(let h of n.current.keys())u.has(h)||n.current.delete(h)},[e,r,n]),n0(()=>{if(!e||!n.current.has(t))return;let u=n.current.get(t);i&&Object.is(o,u)||a(u)},[e,t,r,n,l,i,o,a]),{reportError:d,clearError:m}}import{useCallback as KA,useEffect as o0,useRef as Kc}from"react";function a0(e,t){let r=Kc({}),n=Kc({}),i=Kc({}),o=Kc(0),a=KA(s=>{var l;return(l=i.current)[s]??(l[s]={current:{}})},[]);return o0(()=>{let s=new Set(e?t?.map(Le):[]);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]),o0(()=>{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 s0,useEffect as ZA,useState as l0}from"react";import{useEffect as QA,useRef as JA}from"react";function On(e,t){let r=JA(t);QA(()=>{let n=r.current;r.current=t,t.some((i,o)=>!Object.is(i,n[o]))&&e()},t)}var eR={};function c0({modelUrl:e,activeModelId:t,tilesetUrl:r,models:n,objectBindings:i="auto",onChange:o,initialBindings:a,initialModelEdits:s}){let l=t??e,c=!!(n?.length&&!r),d=i==="auto"&&!c,m=!d&&o!==void 0,u=i==="auto"?eR:i,[h,p]=l0(()=>a??u),[g,b]=l0(()=>{let M=new Map(s),x=c?n?.find(C=>Le(C)===l):void 0;return x&&a&&s===void 0&&M.set(l,{source:x.objectBindings,bindings:a}),M});On(()=>{m||p(u)},[m,u]),ZA(()=>{let M=new Map(c?n?.map(x=>[Le(x),x.objectBindings]):[]);b(x=>{let C=[...x].filter(([A,P])=>!m&&M.get(A)===P.source);return C.length===x.size?x:new Map(C)})},[c,n,m]);let w=s0(M=>{let x=m?void 0:g.get(Le(M));return x?.source===M.objectBindings?x.bindings:M.objectBindings},[m,g]),f=c?n?.find(M=>Le(M)===l):void 0,y=f?w(f):m?u:h,S=s0(M=>{m||(f?b(x=>new Map(x).set(Le(f),{source:f.objectBindings,bindings:M})):p(M)),o?.(M)},[m,f,o]);return{autoBindings:d,controlled:m,currentBindings:y,applyBindings:S,bindingsForModel:w,modelEdits:g}}import{PerspectiveCamera as Sm,Vector2 as tR}from"three";function Qc(e,t={}){if(!e)return Promise.reject(new Error("Viewer not ready"));let{gl:r,scene:n,camera:i,invalidate:o}=e,a=fi(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,type:l="image/png",quality:c}=t,d=r.getSize(new tR),m=r.getPixelRatio(),u=i instanceof Sm?i.aspect:null,h=n.background,p=t.width??d.x,g=t.height??d.y,b=p!==d.x||g!==d.y,w=uc(n);s&&(n.background=null),b&&(r.setPixelRatio(1),r.setSize(p,g,!1),i instanceof Sm&&(i.aspect=p/g,i.updateProjectionMatrix()));let f=()=>{w(),s&&(n.background=h),b&&(r.setPixelRatio(m),r.setSize(d.x,d.y,!1),i instanceof Sm&&u!==null&&(i.aspect=u,i.updateProjectionMatrix())),o()};if(a)try{return r.render(n,i),Promise.resolve(r.domElement.toDataURL(l,c))}catch(y){return Promise.reject(y)}finally{f()}return o(),new Promise((y,S)=>{requestAnimationFrame(()=>{requestAnimationFrame(()=>{let M,x;try{M=r.domElement.toDataURL(l,c)}catch(C){x=C}f(),x?S(x):y(M)})})})}import{useEffect as rR,useRef as nR}from"react";import{GizmoHelper as iR,GizmoViewport as oR}from"@react-three/drei";import{useThree as aR}from"@react-three/fiber";import{jsx as Mm}from"react/jsx-runtime";function u0({onUpdate:e}){let t=aR(n=>n.scene),r=nR(null);return rR(()=>{if(r.current)return lv(t,r.current)},[t]),Mm(iR,{alignment:"top-right",margin:[80,80],renderPriority:2,onUpdate:e,children:Mm("group",{ref:r,children:Mm(oR,{axisColors:["#e5484d","#46a758","#3e8bff"],labelColor:"white"})})})}import{useCallback as Zc,useEffect as mR,useRef as f0,useState as g0}from"react";import{Vector3 as b0}from"three";import{useEffect as Jc,useMemo as Ln,useRef as In}from"react";import{useFrame as sR,useThree as lR}from"@react-three/fiber";import{Box3 as cR,CatmullRomCurve3 as d0,Sphere as uR,Spherical as dR,Vector3 as yi}from"three";function Cm(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 pR=1.2;function sa({controlsRef:e,sceneRef:t,config:r,playing:n,resetOnPlay:i=!1,onFinished:o,onUserInteract:a,onStop:s,playOnce:l=!1,startAtPath:c=!1,onStarted:d,onProgress:m}){let u=lR(E=>E.invalidate),h=Ln(()=>r.waypoints??[],[r.waypoints]),p=h.length>=2,g=r.loop??!0,b=Cm(r),w=Ln(()=>h.map(E=>[...E.position,...E.target,E.azimuthAngle??"",E.polarAngle??"",E.segmentDuration??""].join(",")).join(";"),[h]),f=Ln(()=>{let E=[];if(h.length<2)return E;let O=0;for(let Z=0;Z<h.length-1;Z++)O+=h[Z].segmentDuration??3.5,E.push(O);return g&&h.length>1&&(O+=h[h.length-1].segmentDuration??3.5,E.push(O)),E},[h,g]),y=Ln(()=>E=>{if(h.length<2||f.length===0)return E/b;let O=f[f.length-1],Z=g?E%b:Math.min(E,b),ee=b>0?Z/b*O:0;for(let J=0;J<f.length;J++)if(ee<=f[J]){let U=J===0?0:f[J-1],Q=f[J]-U,q=Q>0?(ee-U)/Q:0,G=g?h.length:h.length-1,H=J/G,se=1/G;return H+q*se}return 1},[h.length,f,b,g]),S=Ln(()=>p?{position:new d0(h.map(E=>new yi(...E.position)),g,"catmullrom",.5),target:new d0(h.map(E=>new yi(...E.target)),g,"catmullrom",.5)}:null,[w,p,g]),M=Ln(()=>{if(!p||!h.every(O=>Number.isFinite(O.azimuthAngle)&&Number.isFinite(O.polarAngle)))return null;let E=h.map(O=>({azimuth:O.azimuthAngle,polar:O.polarAngle,distance:new yi(...O.position).distanceTo(new yi(...O.target))}));for(let O=1;O<E.length;O+=1){let Z=E[O-1].azimuth,ee=E[O].azimuth;E[O].azimuth=ee+Math.round((Z-ee)/(Math.PI*2))*Math.PI*2}return E},[w,p]),x=In(0),C=In(0),A=In(new yi),P=In(new yi),_=In(!1),R=In(!0),k=In(0),T=In(!1),L=In(null),F=Ln(()=>new yi,[]),j=Ln(()=>new yi,[]),V=Ln(()=>new dR,[]);return Jc(()=>{x.current=0,k.current=0,C.current=0,T.current=!1},[w,g,b]),Jc(()=>{i&&(k.current=0,x.current=0,T.current=!1)},[i]),Jc(()=>{if(!n){_.current=!1,x.current>0&&!i?k.current=x.current:i&&(k.current=0),(x.current>0||T.current)&&s?.();return}x.current>=b&&!g&&(x.current=0,k.current=0,T.current=!1);let E=e.current;if(E&&(E.getPosition(A.current),E.getTarget(P.current)),i||T.current||k.current===0?(x.current=0,k.current=0,T.current=!1):k.current>0&&k.current<b?x.current=k.current:(x.current=0,k.current=0),C.current=0,!p){let O=t.current;if(O){let Z=new cR().setFromObject(O).getBoundingSphere(new uR);L.current={center:Z.center.clone(),radius:Z.radius>0?Z.radius:1}}}_.current=!0,R.current=!0,u()},[n,p,e,t,u,b,g,w,i,s]),Jc(()=>{if(!n||!a)return;let E=e.current;if(!E)return;let O=()=>{T.current||a()};return E.addEventListener("controlstart",O),()=>E.removeEventListener("controlstart",O)},[n,e,a]),sR((E,O)=>{if(!n||!_.current)return;let Z=e.current;if(!Z)return;let ee=R.current;R.current=!1,(!ee||!c)&&(x.current+=O,C.current+=O);let J=(!g||l)&&x.current>=b,U=J&&g?0:y(x.current);if(U=g?U%1:Math.min(U,1),S)if(S.target.getPoint(U,j),M){let q=g?M.length:M.length-1,G=Math.min(U,1)*q,H=Math.min(Math.floor(G),q-1),se=(H+1)%M.length,ve=U>=1?1:G-H,Ne=ve*ve*(3-2*ve),$=M[H],xe=M[se],Te=xe.azimuth+Math.round(($.azimuth-xe.azimuth)/(Math.PI*2))*Math.PI*2,we=$.azimuth+(Te-$.azimuth)*Ne,pt=$.polar+(xe.polar-$.polar)*Ne,te=$.distance+(xe.distance-$.distance)*Ne;V.set(Math.max(te,1e-6),Math.min(Math.max(pt,1e-6),Math.PI-1e-6),we),F.setFromSpherical(V).add(j)}else S.position.getPoint(U,F);else{let q=L.current;if(!q)return;let G=U*Math.PI*2,H=q.radius*2.2;F.set(q.center.x+Math.cos(G)*H,q.center.y+q.radius*.6,q.center.z+Math.sin(G)*H),j.copy(q.center)}let Q=c?1:Math.min(C.current/pR,1);if(Q<1){let q=Q*Q*(3-2*Q);F.lerpVectors(A.current,F,q),j.lerpVectors(P.current,j,q)}if(Z.setLookAt(F.x,F.y,F.z,j.x,j.y,j.z,!1),ee&&d?.(),m?.(Math.min(x.current/b,1)),J){_.current=!1,T.current=!0,x.current=0,k.current=0,o?.();return}u()}),null}function p0(){return typeof document<"u"&&typeof HTMLCanvasElement<"u"&&typeof HTMLCanvasElement.prototype.captureStream=="function"}function m0(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,c=null,d,m=0,u=0,h=0,p=null,g=0,b=0,w=0,f=!1,y=!1,S,M,x,C,A,P,_=new Promise((O,Z)=>{A=O,P=Z}),R=()=>{clearTimeout(S),clearInterval(M),x!==void 0&&cancelAnimationFrame(x),C!==void 0&&cancelAnimationFrame(C),i?.removeEventListener("abort",T),e.removeEventListener("webglcontextlost",L),l&&(l.pause(),l.srcObject=null),s?.getTracks().forEach(O=>O.stop())},k=(O=new DOMException("Video export cancelled.","AbortError"))=>{f||(f=!0,R(),P(O))},T=()=>k(),L=()=>k(new Error("Video export stopped because the WebGL context was lost.")),F=()=>k(new Error("Video export timed out. Keep the viewer tab visible while recording."));i?.addEventListener("abort",T,{once:!0}),e.addEventListener("webglcontextlost",L),S=setTimeout(F,3e4);let j=(async()=>{if(a=await import("gifenc"),!f&&(s=e.captureStream(r),l=document.createElement("video"),l.muted=!0,l.playsInline=!0,l.srcObject=s,await l.play(),!f)){if(c=document.createElement("canvas").getContext("2d",{willReadFrequently:!0}),!c)throw new Error("Video recording as GIF is not supported in this browser.");d=a.GIFEncoder()}})().catch(O=>k(O)),V=O=>{if(!p||!d)return;let Z=Math.max(2,Math.round((O-g)/10)-w);w+=Z,d.writeFrame(p.index,m,u,{palette:p.palette,delay:Z*10}),p=null},E=()=>{if(f||!a||!l||!c||!d||l.readyState<2||!l.videoWidth)return;let O=performance.now();if(!(h>0&&O-b<o/2)){m||(m=Math.min(n,l.videoWidth),u=Math.max(1,Math.round(m*l.videoHeight/l.videoWidth)),c.canvas.width=m,c.canvas.height=u);try{c.drawImage(l,0,0,m,u);let{data:Z}=c.getImageData(0,0,m,u),ee=a.quantize(Z,256),J=a.applyPalette(Z,ee);h===0&&(g=O),V(O),p={index:J,palette:ee},b=O,h+=1}catch(Z){k(Z)}}};return{result:_,cancel:k,start(O){f||x!==void 0||(x=requestAnimationFrame(()=>{j.then(()=>{f||(E(),M=setInterval(E,o),clearTimeout(S),S=setTimeout(F,(O+30)*1e3))})}))},finish(){f||y||(y=!0,C=requestAnimationFrame(()=>{j.then(()=>{if(f||(E(),f))return;if(!d||h===0){k(new Error("The browser produced an empty video."));return}V(b+o),d.finish();let O=new Blob([d.bytes()],{type:"image/gif"});f=!0,R(),A(O)})}))}}}var Pm={webm:["video/webm;codecs=vp9","video/webm;codecs=vp8","video/webm"],mp4:["video/mp4;codecs=avc1.42E01E","video/mp4"]};function Bn(e="auto"){return e==="gif"?p0()?"image/gif":null:typeof MediaRecorder>"u"?null:(e==="auto"?[...Pm.webm,...Pm.mp4]:Pm[e]).find(r=>MediaRecorder.isTypeSupported(r))??null}function h0(e,t={}){if(t.format==="gif")return m0(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=Bn(t.format);if(!o||typeof e.captureStream!="function"){let x=t.format&&t.format!=="auto"?` as ${t.format.toUpperCase()}`:"";throw new Error(`Video recording${x} is not supported in this browser.`)}let a,s,l=!1,c=!1,d,m,u,h=[],p,g,b=new Promise((x,C)=>{p=x,g=C}),w=()=>{clearTimeout(d),m!==void 0&&cancelAnimationFrame(m),u!==void 0&&cancelAnimationFrame(u),i?.removeEventListener("abort",y),e.removeEventListener("webglcontextlost",S),s&&(s.ondataavailable=null,s.onstop=null,s.onerror=null),a?.getTracks().forEach(x=>x.stop())},f=(x=new DOMException("Video export cancelled.","AbortError"))=>{if(!l){if(l=!0,w(),s&&s.state!=="inactive")try{s.stop()}catch{}g(x)}},y=()=>f(),S=()=>f(new Error("Video export stopped because the WebGL context was lost.")),M=()=>f(new Error("Video export timed out. Keep the viewer tab visible while recording."));return i?.addEventListener("abort",y,{once:!0}),e.addEventListener("webglcontextlost",S),d=setTimeout(M,3e4),{result:b,cancel:f,start(x){l||m!==void 0||(m=requestAnimationFrame(()=>{if(!l)try{a=e.captureStream(r);let C=new MediaRecorder(a,{mimeType:o,videoBitsPerSecond:n});s=C,C.ondataavailable=({data:A})=>{A.size>0&&h.push(A)},C.onerror=()=>f(new Error("The browser could not encode the video.")),C.onstop=()=>{if(l)return;l=!0,w();let A=new Blob(h,{type:C.mimeType||o});A.size===0?g(new Error("The browser produced an empty video.")):p(A)},C.start(1e3),clearTimeout(d),d=setTimeout(M,(x+30)*1e3)}catch(C){f(C)}}))},finish(){l||c||(c=!0,u=requestAnimationFrame(()=>{if(!l)try{if(!s)throw new Error("Video recording did not start.");s.stop()}catch(x){f(x)}}))}}}function v0(e){let t=f0(e);t.current=e;let r=f0(null),[n,i]=g0(null),[o,a]=g0(0),s=Zc(()=>r.current?.cancel(),[]),l=Zc(()=>r.current!==null,[]);mR(()=>s,[e.modelUrl,s]);let c=Zc(async(m={})=>{let{rendererCaptureRef:u,controlsRef:h,cinematicConfig:p,ready:g,onCaptureStart:b}=t.current,w=u.current,f=h.current;if(!g||!w||!f)throw new Error("Viewer not ready for video export.");if(w.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=m.mode??(p?"cinematic":"turntable");if(y==="cinematic"&&!p)throw new Error("Enable a cinematic camera path before recording it.");let S=y==="cinematic"?p:{loop:!0},M=m.duration??(y==="turntable"&&m.format==="gif"?8:Cm(S));if(!Number.isFinite(M)||M<=0||M>300)throw new Error("Video duration must be greater than 0 and at most 300 seconds.");let x=h0(w.gl.domElement,m);r.current=x;let C=f.getPosition(new b0),A=f.getTarget(new b0),P=f.enabled,_=uc(w.scene);f.stop(),f.enabled=!1,a(0),b(),i({config:{...S,duration:M,autoPlay:!1},onStarted:()=>x.start(M),onFinished:x.finish});try{return await x.result}finally{_(),f.enabled=P,f.setLookAt(C.x,C.y,C.z,A.x,A.y,A.z,!1),w.invalidate(),r.current=null,i(null)}},[]),d=Zc(m=>{let u=Math.floor(m*100);a(h=>h===u?h:u)},[]);return{captureVideo:c,cancelVideo:s,isRecording:l,recording:n,progress:o,onProgress:d}}import{useCallback as hR,useEffect as fR,useRef as gR,useState as Ms}from"react";function y0(e){let[t,r]=Ms(null),[n,i]=Ms(!1),[o,a]=Ms(!1),[s,l]=Ms(!1),[c,d]=Ms(null),m=gR(!1);fR(()=>{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 p=()=>{a(h.fullscreenElement===t),d(null)};return p(),h.addEventListener("fullscreenchange",p),()=>h.removeEventListener("fullscreenchange",p)},[t,e]);let u=hR(async()=>{if(!t||!e||!n||m.current)return;let h=t.ownerDocument,p=h.fullscreenElement===t;m.current=!0,l(!0),d(null);try{p?await h.exitFullscreen():await t.requestFullscreen(),a(h.fullscreenElement===t)}catch{d(p?"Could not exit fullscreen. Press Escape to exit.":"Could not enter fullscreen. Check your browser or iframe fullscreen permissions and try again.")}finally{m.current=!1,l(!1)}},[t,e,n]);return{rootRef:r,supported:n,active:o,pending:s,error:c,toggle:u}}import{useCallback as eu,useEffect as w0,useRef as Cs,useState as Tm}from"react";function x0(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 S0(e){let t=Cs(e);t.current=e;let[r,n]=Tm(null),[i,o]=Tm(0),[a,s]=Tm("ready"),l=Cs(null),c=Cs(!1),d=Cs(null),m=Cs(null),u=eu(b=>{m.current?.dispose(),m.current=null,d.current=b,n(b)},[]),h=eu(()=>{c.current||(c.current=!0,t.current?.(),l.current?.(),l.current=null,d.current&&(m.current=d.current),d.current=null,n(null),s("rebuilding"),o(b=>b+1))},[]),p=eu(()=>{l.current?.(),l.current=null;let b=d.current;d.current=null,n(null),b&&Ey(b)},[]),g=eu(()=>{c.current=!1,s("lost")},[]);return w0(()=>()=>{m.current?.dispose(),m.current=null},[]),w0(()=>{if(!r)return;if(c.current=!1,s("ready"),fi(r)){let w=r,f=w.onDeviceLost;return w.onDeviceLost=y=>{console.warn("[react-immersive] The WebGPU device was lost.",y),g()},()=>{w.onDeviceLost=f}}let b=x0(r.domElement,{initiallyLost:r.getContext().isContextLost(),onLost:g,onRestored:h});return l.current=b,()=>{b(),l.current===b&&(l.current=null)}},[r,g,h]),{generation:i,status:a,reload:h,fail:g,release:p,onRendererCreated:u}}function tu(e,t){return t||e}async function M0(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 bR}from"react";var la=class extends bR{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 vR,useMemo as yR,useRef as xR}from"react";function C0({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(),c=()=>{let R=r();return!!(R.onEngagement||R.debugEngagement)},d=R=>Math.max(0,Math.round(n()-R)),m=R=>{let{onEngagement:k,debugEngagement:T}=r();if(!k&&!T)return;let L={...R,sessionId:o,timestamp:i(),elapsedMs:d(l),modelUrl:e,tilesetUrl:t};T&&a(L);try{Promise.resolve(k?.(L)).catch(s)}catch(F){s(F)}},u=null,h=null,p="[]",g=null,b=null,w=R=>{u=R},f=R=>{!c()||u===R.objectKey||(u=R.objectKey,m({type:"part-viewed",...R}))},y=(R,k,T=null)=>{let L=JSON.stringify([T,k,R]);!c()||R===k||L===h||(h=L,m({type:"variant-chosen",variant:R,previousVariant:k,group:T}))},S=R=>{let k=JSON.stringify(R);k!==p&&(p=k,h=null)},M=()=>{!c()||g!==null||(g=n(),m({type:"ar-started"}))},x=(R="session-ended")=>{if(g===null)return;let k=d(g);g=null,m({type:"ar-ended",durationMs:k,reason:R})},C=(R="stopped")=>{if(!b)return;let{startedAt:k,annotationCount:T}=b;b=null,m({type:"tour-stopped",annotationCount:T,durationMs:d(k),reason:R})};return{setSelectedPart:w,viewPart:f,setActiveVariants:S,chooseVariant:y,startAR:M,endAR:x,startTour:R=>{!c()||R<=0||(C("restarted"),b={startedAt:n(),annotationCount:R},m({type:"tour-started",annotationCount:R}))},stopTour:C,completeTour:()=>{if(!b)return;let{startedAt:R,annotationCount:k}=b;b=null,m({type:"tour-completed",annotationCount:k,durationMs:d(R)})},interrupt:()=>{x("interrupted"),C("interrupted")},requestARLaunch:R=>m({type:"ar-launch-requested",channel:R})}}function P0(e){let t=xR(e);t.current=e;let r=!!(e.onEngagement||e.debugEngagement),n=yR(()=>C0({modelUrl:e.modelUrl,tilesetUrl:e.tilesetUrl,getOptions:()=>t.current}),[e.modelUrl,e.tilesetUrl,r]);return vR(()=>()=>n.interrupt(),[n]),n}import{Color as wR}from"three";function T0(e,t,r){let n=t[r]?.modelObjectId;return e.lighting.lights.filter(i=>{let o=i.attachment?.objectId;return o?pc(t,o)===r||o===n:!1})}function _m(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 _0(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 wR){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 SR}from"react-colorful";import{Fragment as A0,jsx as xi,jsxs as Ps}from"react/jsx-runtime";function R0({kind:e,color:t,brightness:r,onColorChange:n,onBrightnessChange:i,onClose:o}){return xi("div",{className:"ri-popover ri-popover--inline",style:{padding:12},onPointerDown:a=>a.stopPropagation(),children:e==="change-light-color"?Ps(A0,{children:[xi("p",{className:"ri-popoverLabel",children:"Light color"}),xi(SR,{color:t,onChange:n}),Ps("div",{className:"ri-inlineRow",children:[xi("span",{className:"ri-colorCode",children:t}),xi("button",{className:"ri-secondaryButton",onClick:o,children:"Done"})]})]}):Ps(A0,{children:[xi("p",{className:"ri-popoverLabel",children:"Brightness"}),xi("input",{type:"range",min:0,max:200,step:1,value:r,"aria-label":"Brightness",style:{width:"100%"},onChange:a=>i(Number(a.target.value))}),Ps("div",{className:"ri-inlineRow",children:[Ps("span",{className:"ri-colorCode",children:[r,"%"]}),xi("button",{className:"ri-secondaryButton",onClick:o,children:"Done"})]})]})})}import{useCallback as Am,useRef as MR}from"react";var ru=e=>e==="#000000"?"#ffffff":e;function E0({nodeRefsMap:e,currentObjectBindingsRef:t,applyObjectBindings:r}){let n=MR({}),i=Am(a=>{let s=_0(e.current[a]),l=t.current[a]?.style?.material,c=l?.emissive??s.color,d=l?.emissiveIntensity??s.intensity;return{color:c,intensity:d,on:c!=="#000000"&&d>0}},[]),o=Am((a,s)=>{let l=t.current,c=l[a];c&&r({...l,[a]:{...c,style:{...c.style,material:{...c.style?.material,...s}}}})},[r]);return{glowMemoryRef:n,readObjectGlow:i,applyGlow:o}}function k0({setCurrentAction:e,bindingKeyIndex:t,currentObjectBindings:r,applyObjectBindings:n,resolveObjectKey:i,closeColorPicker:o,setColorPicker:a,setMaterialPopupsByObject:s,setItemMaterials:l,getPopoverPosition:c,decalRequestRef:d,setDecalError:m,setDecalDragging:u,setDecalControl:h,resolvedSceneConfigRef:p,applyLightPatches:g,readObjectGlow:b,applyGlow:w,glowMemoryRef:f,setLightControl:y,onAction:S}){return Am(M=>{let{objectId:x,action:C,binding:A}=M;switch(e(M),C.id){case"toggle-visibility":{let P=x;A?.modelObjectId&&(P=t.byModelObjectId.get(A.modelObjectId)??P);let _=r[P],R=_?.visible===!1;_&&n({...r,[P]:{..._,visible:R}});break}case"change-color":o(),s(P=>{if(!(x in P))return P;let _={...P};return delete _[x],_}),l(P=>{let _=i(x,A)??x,R=P[x]?.hex,k=r[_]?.style?.material?.baseColor;return{...P,[x]:{...P[x],hex:R??k??"#ffffff"}}}),a(c(x,225,250,A,M));break;case"change-material":o(),s(P=>{if(x in P){let _={...P};return delete _[x],_}return{...P,[x]:c(x,300,320,A,M)}});break;case"add-text":case"add-image":{o();let P=C.id;d.current++,m(null),u(null),h(_=>_?.objectId===x&&_.kind===P?null:{objectId:x,kind:P,activeId:null});break}case"toggle-light":case"change-light-color":case"set-brightness":{let P=i(x,A);if(!P)break;let _=T0(p.current,r,P);if(C.id==="toggle-light"){if(_.length>0){let L=!_.some(F=>F.visible);g(Object.fromEntries(_.map(F=>[F.id,{visible:L}])));break}let T=b(P);T.on?(f.current[P]=T.intensity,w(P,{emissiveIntensity:0})):w(P,{emissive:ru(T.color),emissiveIntensity:f.current[P]??1});break}let R=C.id,k=_.length>0?null:b(P);y(T=>T?.objectId===x&&T.kind===R?null:{objectId:x,kind:R,target:k?{type:"glow",objectKey:P,baseIntensity:k.on?k.intensity:f.current[P]??1}:{type:"lights",lightIds:_.map(L=>L.id),baseIntensity:Object.fromEntries(_.map(L=>[L.id,L.intensity]))},percent:k&&!k.on?0:100});break}default:break}S?.(M)},[n,w,g,b,r,c,S,o,i,t])}import{jsx as CR}from"react/jsx-runtime";function D0({control:e,lights:t,readObjectGlow:r,applyGlow:n,glowMemoryRef:i,applyLightPatches:o,onControlChange:a}){let s=e.target,l=s.type==="lights"?t.find(c=>c.id===s.lightIds[0])?.color??"#ffffff":ru(r(s.objectKey).color);return CR(R0,{kind:e.kind,color:l,brightness:e.percent,onColorChange:c=>{if(s.type==="lights"){o(Object.fromEntries(s.lightIds.map(m=>[m,{color:c}])));return}let d=r(s.objectKey);n(s.objectKey,{emissive:c,emissiveIntensity:d.intensity>0?d.intensity:i.current[s.objectKey]??1})},onBrightnessChange:c=>{if(a({...e,percent:c}),s.type==="lights"){o(Object.fromEntries(s.lightIds.map(d=>[d,{intensity:(s.baseIntensity[d]??0)*(c/100)}])));return}n(s.objectKey,{emissive:ru(r(s.objectKey).color),emissiveIntensity:s.baseIntensity*(c/100)})},onClose:()=>a(null)})}import{useRef as ER,useState as B0}from"react";import{ArrowDown as PR,ArrowLeft as TR,ArrowRight as _R,ArrowUp as AR}from"lucide-react";import{useEffect as RR,useRef as Rm}from"react";function O0(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 Ts,jsxs as L0}from"react/jsx-runtime";function I0({onNudge:e}){let t=ce(),r=Rm(e);r.current=e;let n=Rm(null),i=Rm(null),o=()=>{n.current?.(),n.current=null,i.current=null};return RR(()=>{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)}},[]),L0("div",{className:"ri-decalPosition",children:[L0("div",{children:[Ts("div",{className:"ri-decalPosition__label",children:t("position")}),Ts("div",{className:"ri-decalPosition__hint",children:t("decalNudgeHint")})]}),Ts("div",{className:"ri-decalPosition__pad",role:"group","aria-label":t("decalNudgeControls"),children:[["up",AR],["left",TR],["right",_R],["down",PR]].map(([a,s])=>Ts("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=O0(()=>r.current(a)))},onClick:l=>{l.detail===0&&r.current(a)},children:Ts(s,{size:16})},a))})]})}import{Fragment as N0,jsx as It,jsxs as mn}from"react/jsx-runtime";var kR=e=>Math.round(e*180/Math.PI);function j0({kind:e,decals:t,activeId:r,error:n,moving:i,defaultSize:o,onSelect:a,onAddText:s,onAddImage:l,onChange:c,onMove:d,onNudge:m,onRemove:u,onClose:h}){let p=ce(),[g,b]=B0(""),[w,f]=B0("#ffffff"),y=ER(null),S=t.find(x=>x.id===r)??null;return mn("div",{className:"ri-popover ri-popover--inline ri-decalControl",onPointerDown:x=>x.stopPropagation(),children:[e==="add-text"?mn(N0,{children:[It("p",{className:"ri-popoverLabel",children:p("text")}),mn("div",{className:"ri-decalControl__row",children:[It("input",{className:"ri-decalControl__input",value:g,placeholder:p("yourText"),"aria-label":p("textToAdd"),onChange:x=>b(x.target.value)}),It("input",{type:"color",className:"ri-decalControl__color",value:w,"aria-label":p("textColour"),onChange:x=>f(x.target.value)})]}),It("button",{type:"button",className:"ri-uploadButton",disabled:!g.trim(),onClick:()=>{s(g.trim(),w)&&b("")},children:p("addText")})]}):mn(N0,{children:[It("p",{className:"ri-popoverLabel",children:p("image")}),It("button",{type:"button",className:"ri-uploadButton",onClick:()=>y.current?.click(),children:p("chooseImage")}),It("input",{ref:y,type:"file",accept:"image/png,image/jpeg,image/webp,image/svg+xml",className:"ri-hiddenInput","aria-label":p("imageToAdd"),onChange:x=>{let C=x.target.files?.[0];x.target.value="",C&&l(C)}})]}),n?It("div",{className:"ri-decalControl__hint",role:"alert",children:n}):null,t.length>0?It("div",{className:"ri-decalControl__list",role:"group","aria-label":p("added"),children:t.map((x,C)=>It("button",{type:"button",className:`ri-decalControl__chip ${x.id===r?"ri-decalControl__chip--active":""}`,"aria-pressed":x.id===r,onClick:()=>a(x.id),children:x.image?p("decalImage",{index:C+1}):x.text||p("decalText",{index:C+1})},x.id))}):null,S?mn("div",{className:"ri-decalControl__editor",children:[It(I0,{onNudge:x=>m(S.id,x)}),S.image?null:mn("div",{className:"ri-decalControl__row",children:[It("input",{className:"ri-decalControl__input",value:S.text??"","aria-label":p("text"),onChange:x=>c(S.id,{text:x.target.value})}),It("input",{type:"color",className:"ri-decalControl__color",value:S.color??"#ffffff","aria-label":p("colour"),onChange:x=>c(S.id,{color:x.target.value})})]}),mn("label",{className:"ri-decalControl__slider",children:[It("span",{children:p("size")}),It("input",{type:"range",min:o/10,max:o*4,step:o/50,value:S.size,"aria-label":p("size"),onChange:x=>c(S.id,{size:Number(x.target.value)})})]}),mn("label",{className:"ri-decalControl__slider",children:[It("span",{children:p("turn")}),It("input",{type:"range",min:-180,max:180,step:1,value:kR(S.rotation??0),"aria-label":p("rotation"),onChange:x=>c(S.id,{rotation:Number(x.target.value)*Math.PI/180})})]}),mn("div",{className:"ri-inlineRow",children:[It("button",{type:"button",className:"ri-secondaryButton","aria-pressed":i,title:p("dragTheDecalAcrossTheObjectsSurface"),onClick:()=>d(S.id),children:p("move")}),It("button",{type:"button",className:"ri-removeButton",onClick:()=>u(S.id),children:p("remove")})]})]}):null,mn("div",{className:"ri-inlineRow",children:[It("span",{className:"ri-colorCode",children:t.length===0?p("noneAddedYet"):p("decalAdded",{count:t.length})}),It("button",{type:"button",className:"ri-secondaryButton",onClick:h,children:p("done")})]})]})}import{useEffect as KR,useRef as QR}from"react";import{useThree as JR}from"@react-three/fiber";import{Mesh as ZR,Raycaster as eE,Vector2 as Lm,Vector3 as $0}from"three";import{BufferGeometry as DR,CanvasTexture as OR,Float32BufferAttribute as nu,Matrix4 as LR,Object3D as IR,SRGBColorSpace as BR,Uint16BufferAttribute as NR,Vector3 as Nn}from"three";var jR=.5,_s=4;function zR(e,t=0){let r=new Nn(...e);r.lengthSq()<1e-12&&r.set(0,0,1),r.normalize();let n=new IR;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 VR(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 z0(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],c=i(s);if(c&&o.push(s),c!==i(l)){let d=l.position[t]-s.position[t];o.push(VR(s,l,(r-s.position[t])/d))}}return o}function iu(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),c=n.getIndex(),d=Math.max(t.size,1e-6),m=d/(r>0&&Number.isFinite(r)?r:1),u=Math.max(d,m)*jR,h={x:d/2,y:m/2,z:u/2},p=new LR().makeRotationFromEuler(zR(t.normal,t.rotation)).setPosition(...t.position),g=p.clone().invert(),b=(F,j)=>{let V=null;if(l){V=new Map;for(let E=0;E<_s;E++){let O=s.getComponent(F,E);if(O<=0)continue;let Z=a.getComponent(F,E);V.set(Z,(V.get(Z)??0)+O)}}return{position:j.clone(),normal:o?new Nn().fromBufferAttribute(o,F):new Nn,bones:V}},w=[],f=[],y=[],S=[],M=[],x=new Nn,C=new Nn,A=new Nn,P=F=>{if(y.push(.5+F.position.x/d,.5-F.position.y/m),x.copy(F.position).applyMatrix4(p),w.push(x.x,x.y,x.z),f.push(F.normal.x,F.normal.y,F.normal.z),!F.bones)return;let j=[...F.bones].sort((E,O)=>O[1]-E[1]).slice(0,_s),V=j.reduce((E,[,O])=>E+O,0)||1;for(let E=0;E<_s;E++)S.push(j[E]?.[0]??0),M.push((j[E]?.[1]??0)/V)},_=["x","y","z"],R=[new Nn,new Nn,new Nn],k=[0,0,0],T=(c?c.count:i.count)/3;for(let F=0;F<T;F++){for(let E=0;E<3;E++){let O=F*3+E;k[E]=c?c.getX(O):O,R[E].fromBufferAttribute(i,k[E]).applyMatrix4(g)}if(_.some(E=>R[0][E]>h[E]&&R[1][E]>h[E]&&R[2][E]>h[E]||R[0][E]<-h[E]&&R[1][E]<-h[E]&&R[2][E]<-h[E]))continue;let j=R.map((E,O)=>b(k[O],E));if(!o){C.copy(j[1].position).sub(j[0].position),A.copy(j[2].position).sub(j[0].position);let E=C.cross(A).transformDirection(p);for(let O of j)O.normal.copy(E)}let V=j;for(let E of _)if(V=z0(V,E,h[E],!0),V=z0(V,E,-h[E],!1),V.length<3)break;for(let E=1;E+1<V.length;E++)P(V[0]),P(V[E]),P(V[E+1])}if(w.length===0)return null;let L=new DR;return L.setAttribute("position",new nu(w,3)),L.setAttribute("normal",new nu(f,3)),L.setAttribute("uv",new nu(y,2)),l&&(L.setAttribute("skinIndex",new NR(S,_s)),L.setAttribute("skinWeight",new nu(M,_s))),L}function F0(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 V0=256,Em=24;function U0(e){let t=`${e.fontWeight??"bold"} ${V0-Em*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)+Em*2,8),4096),r.height=V0,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-Em);let o=new OR(r);return o.flipY=!1,o.colorSpace=BR,{texture:o,aspect:r.width/r.height}}import{useEffect as G0,useRef as FR}from"react";import{BufferGeometry as UR,Float32BufferAttribute as GR,Mesh as HR,MeshStandardMaterial as WR,SkinnedMesh as qR,SRGBColorSpace as W0}from"three";var oo="riDecal",Om="riDecalId";function km(){return new UR().setAttribute("position",new GR([],3))}function H0(e){let t=e.image;return t?.width&&t.height?t.width/t.height:1}function Dm(e){e.disposed=!0,e.node.remove(e.mesh),e.mesh.geometry.dispose(),e.mesh.material.dispose(),e.imagePath&&Rn(e.imagePath,W0),e.ownTexture?.dispose()}function XR(e,t,r,n){let i=new WR({transparent:!0,polygonOffset:!0,polygonOffsetFactor:-4,depthWrite:!1,metalness:0,roughness:.7}),o=fr(e)&&e.skeleton?e:null,a=o?new qR(km(),i):new HR(km(),i);if(o){let c=a;c.bind(o.skeleton,o.bindMatrix),c.frustumCulled=!1,c.onBeforeRender=()=>{let d=vv(o);d&&c.bindMatrixInverse.copy(d)}}a.userData[oo]=!0,a.userData[Om]=t.id,a.raycast=()=>{},a.castShadow=!1,a.receiveShadow=!0,a.renderOrder=1;let s={node:e,mesh:a,signature:r,disposed:!1},l=c=>{let d=iu(e,t,c);a.geometry.dispose(),a.geometry=d??km(),a.visible=d!==null};if(t.image){s.imagePath=t.image;let c=Qo(t.image,W0,()=>{s.disposed||(l(H0(c)),i.needsUpdate=!0,n())});i.map=c,l(H0(c))}else{let{texture:c,aspect:d}=U0(t);s.ownTexture=c,i.map=c,l(d)}return e.add(a),s}function q0({objectBindings:e,nodeMap:t,invalidate:r}){let n=FR(new Map);G0(()=>{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(Qt(l))for(let c of s.decals){if(!c.image&&!c.text)continue;let d=`${a}
|
|
6
|
-
${c.id}`,m=F0(c),u=i.get(d);u&&(u.node!==l||u.signature!==m)&&(Dm(u),u=void 0),u||(u=XR(l,c,m,r),i.set(d,u)),u.mesh.material.opacity=(c.opacity??1)*(s.style?.material?.opacity??1),o.add(d)}}for(let[a,s]of i)o.has(a)||(Dm(s),i.delete(a));r()},[e,t,r]),G0(()=>{let i=n.current;return()=>{for(let o of i.values())Dm(o);i.clear()}},[])}import{Mesh as $R,SkinnedMesh as YR}from"three";function X0(e,t){let r=[];if(fr(e)){let n=e;n.computeBoundingSphere(),n.computeBoundingBox(),YR.prototype.raycast.call(n,t,r)}else $R.prototype.raycast.call(e,t,r);return r.sort((n,i)=>n.distance-i.distance)[0]}function Y0({target:e,nodes:t,controls:r}){let{camera:n,gl:i,invalidate:o}=JR(),a=QR(e);return a.current=e,KR(()=>{let s=i.domElement,l=new eE,c=new Lm,d=s.style.cursor,m=s.style.touchAction;s.style.cursor="grab",s.style.touchAction="none";let u=0,h=null,p=null,g=(C,A=new Lm)=>{let P=s.getBoundingClientRect();c.set((C.clientX-P.left-A.x)/P.width*2-1,-((C.clientY-P.top-A.y)/P.height)*2+1),l.setFromCamera(c,n)},b=C=>{if(!p)return;g(C,p.offset),p.node.updateWorldMatrix(!0,!1);let A=l.intersectObject(p.node,!1)[0];if(!A)return;let P=no({...A,ray:l.ray},p.node),_=iu(p.node,{...p.decal,...P},p.aspect);_&&(p.mesh.geometry!==p.geometry&&p.mesh.geometry.dispose(),p.mesh.geometry=_,p.surface=P,o())},w=C=>{if(!p)return;cancelAnimationFrame(u),u=0,h=null;let A=p;p=null,A.mesh.geometry!==A.geometry&&(C&&A.surface?A.geometry.dispose():(A.mesh.geometry.dispose(),A.mesh.geometry=A.geometry)),A.controller&&(A.controller.enabled=A.controlsEnabled),s.hasPointerCapture(A.pointerId)&&s.releasePointerCapture(A.pointerId),s.style.cursor="grab",o();let P=()=>{window.removeEventListener("click",_,!0),window.removeEventListener("pointerdown",P,!0),clearTimeout(R)},_=k=>{k.target===s&&(k.preventDefault(),k.stopImmediatePropagation()),P()},R=setTimeout(P,300);window.addEventListener("click",_,!0),window.addEventListener("pointerdown",P,!0),C&&A.surface&&a.current.onCommit(A.surface)},f=C=>{if(C.button!==0||p)return;let A=a.current,P=t.current[A.objectId];if(!(P instanceof ZR)||!P.visible)return;let _=P.children.find(E=>E.userData[oo]&&E.userData[Om]===A.decal.id);if(!_?.visible)return;P.updateWorldMatrix(!0,!0),g(C);let R=X0(_,l),k=l.intersectObject(P,!1)[0];if(!R||!k||R.distance>k.distance+1e-4)return;let T=new $0;if(fr(_)){let E=new $0,O=_.geometry.getAttribute("position").count;if(!O)return;for(let Z=0;Z<O;Z++)T.add(_.getVertexPosition(Z,E));T.divideScalar(O).applyMatrix4(_.matrixWorld)}else T.fromArray(A.decal.position).applyMatrix4(P.matrixWorld);T.project(n);let L=s.getBoundingClientRect(),F=new Lm(C.clientX-(L.left+(T.x+1)/2*L.width),C.clientY-(L.top+(1-T.y)/2*L.height)),j=_.material.map?.image,V=r.current;p={pointerId:C.pointerId,node:P,mesh:_,geometry:_.geometry,decal:A.decal,surface:null,offset:F,aspect:j?.width&&j.height?j.width/j.height:1,controller:V,controlsEnabled:V?.enabled??!1},V&&(V.enabled=!1),C.preventDefault(),C.stopImmediatePropagation(),s.setPointerCapture(C.pointerId),s.style.cursor="grabbing"},y=C=>{!p||C.pointerId!==p.pointerId||(C.preventDefault(),C.stopImmediatePropagation(),h=C,u||(u=requestAnimationFrame(()=>{u=0,h&&b(h)})))},S=C=>{!p||C.pointerId!==p.pointerId||(C.preventDefault(),C.stopImmediatePropagation(),h&&b(h),w(!0))},M=()=>w(!1),x=C=>{C.key==="Escape"&&(w(!1),a.current.onCancel())};return s.addEventListener("pointerdown",f,!0),window.addEventListener("pointermove",y,{capture:!0,passive:!1}),window.addEventListener("pointerup",S,!0),window.addEventListener("pointercancel",M),window.addEventListener("blur",M),window.addEventListener("keydown",x),s.addEventListener("lostpointercapture",M),()=>{w(!1),s.style.cursor=d,s.style.touchAction=m,s.removeEventListener("pointerdown",f,!0),window.removeEventListener("pointermove",y,!0),window.removeEventListener("pointerup",S,!0),window.removeEventListener("pointercancel",M),window.removeEventListener("blur",M),window.removeEventListener("keydown",x),s.removeEventListener("lostpointercapture",M)}},[n,i,o,t,r,e.objectId,e.decal]),null}import{useCallback as ca,useEffect as AE,useState as Rs}from"react";import{AnimationClip as tE,Group as wi,Matrix4 as J0,Mesh as rE,PropertyBinding as ou,Quaternion as nE,Scene as iE,Vector3 as Q0}from"three";import{GLTFExporter as oE,SkeletonUtils as aE}from"three-stdlib";var Im=new WeakMap;function Bm(e){e.traverse(t=>{if(Im.has(t))return;let r=t.morphTargetInfluences;Im.set(t,{position:t.position.clone(),quaternion:t.quaternion.clone(),scale:t.scale.clone(),morphTargetInfluences:r?[...r]:void 0})})}function K0(e){return Im.get(e)}var sE="reactImmersiveSkinFreeze",lE=new Set(["position","quaternion","scale","morphTargetInfluences"]);function au({sources:e,downloadFilename:t,filenameSuffix:r="",onComplete:n}){let i=new iE,o=[];try{for(let s of e){let l=cE(s,e.length>1);if(e.length===1)i.name=l.sceneName,i.userData=l.sceneUserData,l.nodes.length&&i.add(...l.nodes);else{let c=new wi;c.name=s.label??l.sceneName,l.nodes.length&&c.add(...l.nodes),i.add(c)}o.push(...l.animations)}}catch(s){console.error("GLB export failed:",s),n();return}new oE().parse(i,s=>{let l=s instanceof ArrayBuffer?new Blob([s],{type:"model/gltf-binary"}):new Blob([JSON.stringify(s)],{type:"model/gltf+json"}),c=s instanceof ArrayBuffer?".glb":".gltf";un(l,`${t}${r}${c}`),n()},s=>{console.error("GLTFExporter error:",s),n()},{binary:!0,onlyVisible:!0,animations:o})}function cE(e,t){let{root:r,clone:n,animations:i}=mE(e,t);return n?{sceneName:n.name,sceneUserData:{...n.userData},nodes:uE(r,n,i),animations:i}:{sceneName:e.scene.name,sceneUserData:{},nodes:[],animations:i}}function uE(e,t,r){e.updateWorldMatrix(!0,!0);let n=t.matrixWorld.clone(),i=[...t.children],o=()=>(i.forEach(l=>t.remove(l)),i),a=new Set(r.flatMap(l=>l.tracks.map(c=>ou.parseTrackName(c.name).nodeName)));if(a.has(t.uuid))return[e.children[0]];if(n.equals(dE))return o();let s=[];for(let l of i){if(a.has(l.uuid))return[e.children[0]];l.updateMatrix();let c=n.clone().multiply(l.matrix),d=new Q0,m=new nE,u=new Q0;c.decompose(d,m,u);let h=new J0().compose(d,m,u);if(!pE(h,c))return[e.children[0]];s.push(c)}return i.forEach((l,c)=>{s[c].decompose(l.position,l.quaternion,l.scale),l.matrix.copy(s[c])}),o()}var dE=new J0;function pE(e,t){let r=Math.max(1,...t.elements.map(Math.abs));return e.elements.every((n,i)=>Math.abs(n-t.elements[i])<=1e-6*r)}function mE({scene:e,objectBindings:t,matRefs:r,label:n},i){let o=new wi;o.name=n??e.name??"";let a=new Map;for(let[f,y]of Object.entries(t))a.set(y.modelObjectId??f,f);let s=f=>{let y=f.name||f.uuid;return a.get(y)??y},l=f=>{let y=t[s(f)];return y?y.visible===!1:f.visible===!1};for(let f=e;f;f=f.parent)if(l(f))return{root:o,clone:null,animations:[]};e.updateWorldMatrix(!0,!0);let c=aE.clone(e),d=new Map,m=[],u=[];e.traverse(f=>m.push(f)),c.traverse(f=>u.push(f)),m.forEach((f,y)=>d.set(f,u[y]));let h=[];for(let f=e.parent;f;f=f.parent)h.unshift(f);let p=o;for(let f of h){let y=Nm(f);p.add(y),p=y}p.add(c);let g=[],b=new Set;for(let f of m){let y=d.get(f);if(f.userData?.isWireframeOverlay){g.push(y);continue}delete y.userData[sE];let S=y;if(S.isMesh){let M=r[s(f)];M&&(S.material=M)}(l(f)||f.parent&&b.has(f.parent))&&b.add(f),y.visible=!0}g.forEach(f=>f.removeFromParent());for(let f of b){let y=d.get(f);if(su(y,o)){if(!gE(y)){y.removeFromParent();continue}if(y.isMesh){let S=Nm(y);S.name=y.name,S.userData=y.userData;for(let M of[...y.children])S.add(M);y.parent.add(S),y.removeFromParent(),d.set(f,S)}}}let w=bE(e,o,d,i&&n?`${n}: `:"");return w.length===0?fE(m,d,o):hE(m,d,o,w),{root:o,clone:c,animations:w}}function Nm(e){let t=new wi;return t.position.copy(e.position),t.quaternion.copy(e.quaternion),t.scale.copy(e.scale),t.matrix.copy(e.matrix),t.matrixAutoUpdate=e.matrixAutoUpdate,t}function hE(e,t,r,n){let i=n.map(o=>[...o.tracks]);for(let o of e){let a=yv(o),s=t.get(o);if(!a||!fr(s)||!su(s,r))continue;let l=s,c=new Set;for(let g of l.skeleton.bones)for(let b=g;b&&(c.add(b),b!==r);b=b.parent);let d=new Map,m=g=>{let b=g.isBone?g.clone(!1):Nm(g);d.set(g.uuid,b);for(let w of g.children)c.has(w)&&b.add(m(w));return b},u=m(r),h=new wi,p=h;for(let g of[...a].reverse()){let b=new wi;g.decompose(b.position,b.quaternion,b.scale);let w=new wi;w.scale.set(1/b.scale.x,1/b.scale.y,1/b.scale.z);let f=new wi;f.quaternion.copy(b.quaternion).invert();let y=new wi;y.position.copy(b.position).negate(),p.add(w),w.add(f),f.add(y),p=y}p.add(u),l.add(h),l.skeleton.bones=l.skeleton.bones.map(g=>d.get(g.uuid)),n.forEach((g,b)=>{for(let w of i[b]){let f=ou.parseTrackName(w.name);if(f.propertyName==="morphTargetInfluences")continue;let y=d.get(f.nodeName);if(!y)continue;let S=w.clone();S.name=Z0(y.uuid,f),g.tracks.push(S)}})}}function fE(e,t,r){r.updateWorldMatrix(!0,!0);for(let n of e){let i=t.get(n);if(!fr(n)||!fr(i)||!i.parent||!su(i,r))continue;let o=i,a=new rE(xv(n),o.material);a.name=o.name,a.userData=o.userData,a.matrix.copy(i.parent.matrixWorld).invert().multiply(wv(n)),a.matrixAutoUpdate=!1,a.matrix.decompose(a.position,a.quaternion,a.scale);let s=i.parent;s.children.splice(s.children.indexOf(i),1,a),a.parent=s,i.parent=null,a.updateMatrixWorld(!0);for(let l of[...i.children])a.attach(l)}}function gE(e){let t=!1;return e.traverse(r=>{r.isBone&&(t=!0)}),t}function su(e,t){for(let r=e;r;r=r.parent)if(r===t)return!0;return!1}function bE(e,t,r,n){let i=[];for(let o of e.animations??[]){let a=[];for(let s of o.tracks){let l=ou.parseTrackName(s.name);if(!lE.has(l.propertyName))continue;let c=ou.findNode(e,l.nodeName);if(l.objectName){if(l.objectName!=="bones"||!c||!fr(c))continue;c=c.skeleton.getBoneByName(l.objectIndex)??null,l.objectName="",l.objectIndex=""}let d=c?r.get(c):void 0;if(!d||!su(d,t)||l.propertyName==="morphTargetInfluences"&&!d.morphTargetInfluences)continue;vE(c,d,l.propertyName);let m=s.clone();m.name=Z0(d.uuid,l),a.push(m)}a.length!==0&&i.push(new tE(`${n}${o.name}`,o.duration,a,o.blendMode))}return i}function vE(e,t,r){let n=K0(e);n&&(r==="position"?t.position.copy(n.position):r==="quaternion"?t.quaternion.copy(n.quaternion):r==="scale"?t.scale.copy(n.scale):r==="morphTargetInfluences"&&n.morphTargetInfluences&&t.morphTargetInfluences?.length===n.morphTargetInfluences.length&&(t.morphTargetInfluences=[...n.morphTargetInfluences]))}function Z0(e,t){let r=t.objectName?`.${t.objectName}${t.objectIndex!==void 0?`[${t.objectIndex}]`:""}`:"",n=t.propertyIndex!==void 0?`[${t.propertyIndex}]`:"";return`${e}${r}.${t.propertyName}${n}`}import{strToU8 as xE}from"fflate";import{zip as yE}from"fflate";function ew(e,t=6){return new Promise((r,n)=>{yE(e,{level:t},(i,o)=>{i?n(i):r(o)})})}var As=2048,tw=["#00e5ff","#ff4fd8","#ffe45e","#7cff6b","#ff784f","#a78bfa","#38bdf8","#fb7185"];function rw(e){return e.split("&").join("&").split("<").join("<").split(">").join(">").split('"').join(""").split("'").join("'")}function Vm(e,t){return e.normalize("NFKD").replace(/[\u0300-\u036f]/g,"").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||t}function iw(e){return Vm(e,"model")}function jm(e,t){return e.index?Math.round(e.index.getX(t)):t}function wE(e,t,r){let n=jm(e,r),i=jm(e,r+1),o=jm(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 nw(e){return`${e.u.toFixed(6)},${e.v.toFixed(6)}`}function zm(e,t,r,n){let i,o;n?(i=t.index,o=r.index):(i=nw(t),o=nw(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 SE(e,t,r){zm(e,t[0],t[1],r),zm(e,t[1],t[2],r),zm(e,t[2],t[0],r)}function ME(e,t){return Array.isArray(e)?e[t]??null:e}function CE(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 c=a.name||`Mesh ${r}`,d=s.index?.count??l.count,m=s.groups.length>0?s.groups:[{start:0,count:d,materialIndex:0}];for(let u of m){let h=u.materialIndex??0,p=ME(a.material,h);if(!p)continue;let g=t.get(p.uuid);g||(n+=1,g={name:p.name||`Material ${n}`,layers:new Map},t.set(p.uuid,g));let b=g.layers.get(a.uuid);b||(b={name:c,color:tw[i%tw.length],edges:new Map},i+=1,g.layers.set(a.uuid,b));let w=Math.max(0,u.start),f=Math.min(d,w+u.count);for(let y=w;y+2<f;y+=3){let S=wE(s,l,y);S&&SE(b.edges,S,!!s.index)}}}),[...t.values()].filter(o=>[...o.layers.values()].some(a=>a.edges.size>0))}function lu(e){return(e*As).toFixed(2)}function PE(e){return`M${lu(e.start.u)} ${lu(1-e.start.v)}L${lu(e.end.u)} ${lu(1-e.end.v)}`}function TE(e){let t=rw(e.name),r=[...e.layers.values()].filter(n=>n.edges.size>0).map((n,i)=>{let o=rw(n.name),a=`${Vm(n.name,"mesh")}-${i+1}`,s=[...n.edges.values()],l=s.filter(m=>m.count===1),d=(l.length>0?l:s).map(PE).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(`
|
|
7
|
-
`)}).join(`
|
|
8
|
-
`);return['<?xml version="1.0" encoding="UTF-8"?>',`<svg xmlns="http://www.w3.org/2000/svg" width="${As}" height="${As}" viewBox="0 0 ${As} ${As}">`,` <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(`
|
|
9
|
-
`)}function _E(e){let t=[],r=new Set;return e.forEach((n,i)=>{let o=CE(n.scene);if(o.length===0)return;let a=iw(n.label||`model-${i+1}`);o.forEach((s,l)=>{let c=Vm(s.name,`material-${l+1}`),d=o.length===1?`${a}-uv-layout.svg`:`${a}-uv-${c}-${l+1}.svg`;if(r.has(d)){let m=d.replace(/\.svg$/,""),u=2;for(;r.has(`${m}-${u}.svg`);)u+=1;d=`${m}-${u}.svg`}r.add(d),t.push({filename:d,materialName:s.name,meshCount:[...s.layers.values()].filter(m=>m.edges.size>0).length,svg:TE(s)})})}),t}async function Fm(e,t="model"){let r=_E(e);if(r.length===0)return r;if(r.length===1)return un(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,xE(o.svg)])),i=await ew(n);return un(new Blob([i],{type:"application/zip"}),`${iw(t)}-uv-layouts.zip`),r}async function ow(e,t="model"){return Fm([{scene:e,label:t}],t)}function aw({sceneRef:e,materialRefs:t,rendererCaptureRef:r,objectBindings:n,downloadFilename:i,getAllLoadedModels:o,getAllLoadedModelUvSources:a,captureVideo:s,openConfiguredAR:l}){let[c,d]=Rs(!1),[m,u]=Rs(!1),[h,p]=Rs(null),[g,b]=Rs(null),[w,f]=Rs("auto");AE(()=>{if(!m)return;let P=()=>u(!1);return window.addEventListener("pointerdown",P),()=>window.removeEventListener("pointerdown",P)},[m]);let y=ca(()=>{p(null),b(null),u(P=>!P)},[]),S=ca(()=>{let P=o?.()??null;if(P&&P.length>0){u(!1),d(!0),au({sources:P,downloadFilename:i,onComplete:()=>d(!1)});return}let _=e.current;_&&(u(!1),d(!0),au({sources:[{scene:_,objectBindings:n,matRefs:t.current??{}}],downloadFilename:i,onComplete:()=>d(!1)}))},[i,t,n,e,o]),M=ca(async()=>{let P=o?.()??null;if(!P||P.length===0)return;u(!1),d(!0);let _=new Set;try{for(let R=0;R<P.length;R++){let k=P[R],T=(k.label||`model-${R+1}`).replace(/[\\/:*?"<>|]+/g,"-"),L=T,F=2;for(;_.has(L);)L=`${T}-${F++}`;_.add(L),await new Promise(j=>{au({sources:[k],downloadFilename:i,filenameSuffix:`-${L}`,onComplete:j})}),await new Promise(j=>setTimeout(j,300))}}finally{d(!1)}},[i,o]),x=ca(()=>{u(!1),Qc(r.current).then(P=>{let _=document.createElement("a");_.href=P,_.download=`${i}.png`,document.body.appendChild(_),_.click(),document.body.removeChild(_)}).catch(P=>{console.error("Screenshot failed:",P)})},[i,r]),C=ca(async()=>{let P=a?.()??null;try{let _;if(P&&P.length>0)_=await Fm(P,i);else{let R=e.current;if(!R)return;_=await ow(R,i)}if(_.length===0){p("This model does not contain UV coordinates.");return}p(null),u(!1)}catch(_){console.error("UV layout export failed:",_),p("Could not create the UV layout archive.")}},[i,e,a]),A=ca(async P=>{u(!1),b(null);try{let _=await s({mode:P,format:w}),R=_.type==="image/gif"?"gif":_.type.startsWith("video/mp4")?"mp4":"webm",k=URL.createObjectURL(_),T=document.createElement("a");T.href=k,T.download=`${i}-${P}.${R}`,document.body.appendChild(T);try{T.click()}finally{T.remove(),setTimeout(()=>URL.revokeObjectURL(k),1e3)}}catch(_){if(_ instanceof DOMException&&_.name==="AbortError")return;b(_ instanceof Error?_.message:"Could not export the video."),u(!0)}},[s,i,w]);return{openConfiguredAR:l?()=>{u(!1),l()}:void 0,isDownloading:c,downloadMenuOpen:m,uvExportError:h,toggleDownloadMenu:y,handleDownloadMesh:S,handleDownloadSeparateMeshes:M,handleDownloadScreenshot:x,handleDownloadUvLayout:C,handleDownloadVideo:A,videoFormat:w,setVideoFormat:f,videoExportError:g}}import{useCallback as gr,useEffect as ks,useRef as pu,useReducer as DE,useState as ao}from"react";import{Box3 as gw,Raycaster as OE,Vector2 as Wm,Vector3 as qm}from"three";var cu={tool:"distance",points:[],areaClosed:!1,error:null};function sw(e,t){if(t.type==="tool")return{...cu,tool:t.tool};if(t.type==="clear")return{...cu,tool:e.tool};if(t.type==="fail")return{...e,error:t.error};if(t.type==="clearError")return{...e,error:null};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=Cc(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&&Mc(i.map(o=>o.position))===null?{...e,error:"Pick a point away from the angle's vertex."}:{...e,points:i,areaClosed:!1,error:null}}import{Matrix3 as uw,Matrix4 as RE,Mesh as dw,Vector3 as uu}from"three";var lw=new WeakMap,Um=new WeakMap,EE=0;function Gm(e){return Um.has(e)||Um.set(e,++EE),`${Um.get(e)}:${e.version??e.data?.version??0}:${e.count}`}var pw=new ArrayBuffer(8),kE=new Float64Array(pw),cw=new Uint32Array(pw);function zr(e,t){return kE[0]=t,Math.imul(Math.imul(e^cw[0],16777619)^cw[1],16777619)}function mw(e){let t=e.getAttribute("position");if(!t)return"no-position";let r=e.getIndex(),n=[e.getAttribute("skinIndex"),e.getAttribute("skinWeight")].filter(Boolean),i=`${Gm(t)}:${r?Gm(r):"none"}:${e.morphTargetsRelative}:${[...e.morphAttributes.position??[],...n].map(Gm).join(";")}`,o=lw.get(e);if(o?.position===t&&o.index===r&&o.version===i)return o.signature;let a=e.morphTargetsRelative?zr(2166136261,1):2166136261;for(let l=0;l<t.count;l++)a=zr(a,t.getX(l)),a=zr(a,t.getY(l)),a=zr(a,t.getZ(l));if(r)for(let l=0;l<r.count;l++)a=zr(a,r.getX(l));for(let l of e.morphAttributes.position??[])for(let c=0;c<l.count;c++)a=zr(a,l.getX(c)),a=zr(a,l.getY(c)),a=zr(a,l.getZ(c));for(let l of n)for(let c=0;c<l.count;c++)for(let d=0;d<l.itemSize;d++)a=zr(a,l.getComponent(c,d));let s=`${t.count}:${r?.count??0}:${a>>>0}`;return lw.set(e,{position:t,index:r,version:i,signature:s}),s}function hw(e){let t=2166136261,r=e.skeleton;if(r){for(let n of[e.bindMatrix,...r.boneInverses])for(let i of n.elements)t=zr(t,i);for(let n of r.bones){n.matrixAutoUpdate&&n.updateMatrix();for(let i of n.matrix.elements)t=zr(t,i)}}for(let n of e.morphTargetInfluences??[])t=zr(t,n);return`${r?"skin":"mesh"}:${t>>>0}`}function fw(e,t){e.updateWorldMatrix(!0,!1);let r=e.matrixWorld.clone();if(t!==void 0){if(!e.isInstancedMesh||t>=e.count)return null;let n=new RE;e.getMatrixAt(t,n),r.multiply(n)}return Math.abs(r.determinant())>1e-15?r:null}function Hm(e,t){if(!(t.object instanceof dw))return e;let r=di(t.object),n=fw(t.object,t.instanceId);if(!r||!n)return e;let i=n.clone().invert(),o=a=>new uu(...a).applyMatrix4(i).toArray();return{...e,anchor:{nodeId:r,localPosition:o(e.position),geometrySignature:mw(t.object.geometry),poseSignature:hw(t.object),...t.instanceId!==void 0?{instanceId:t.instanceId}:{},...e.normal?{localNormal:new uu(...e.normal).applyNormalMatrix(new uw().getNormalMatrix(i)).toArray()}:{},...e.faceVertices?{localFaceVertices:e.faceVertices.map(o)}:{}}}}function du(e,t,r,n,i){let o=c=>({measurement:e,points:[],status:c});if(e.modelId!==r||ds(e.tilesetUrl??"")!==ds(n??""))return o("model-changed");if(!t)return o("missing-object");let a=i??Es(t),s=[],l=new Map;for(let c of e.points){if(!c.anchor){s.push(c);continue}let d=c.anchor,m=a(d.nodeId);if(!(m instanceof dw))return o("missing-object");for(let g=m;g;g=g.parent)if(!g.visible)return o("hidden-object");if(mw(m.geometry)!==d.geometrySignature)return o("geometry-changed");let u=l.get(m);if(u===void 0&&(u=hw(m),l.set(m,u)),u!==d.poseSignature)return o("pose-changed");let h=fw(m,d.instanceId);if(!h)return o("geometry-changed");let p=g=>new uu(...g).applyMatrix4(h).toArray();s.push({...c,position:p(d.localPosition),...d.localNormal?{normal:new uu(...d.localNormal).applyNormalMatrix(new uw().getNormalMatrix(h)).toArray()}:{},...d.localFaceVertices?{faceVertices:d.localFaceVertices.map(p)}:{}})}return{measurement:e,points:s,status:e.approximate?"approximate":"ready"}}function Es(e){let t=new Map;return e.traverse(r=>{let n=di(r);n&&t.set(n,t.has(n)?null:r)}),r=>t.get(r)??null}function LE(e){let t=new gw().setFromObject(e),r=new qm;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 IE(e){let t=new gw().setFromObject(e);if(t.isEmpty())return null;let r=t.getCenter(new qm),n=t.getSize(new qm).length()/2;return!Number.isFinite(n)||n<=0?null:{center:[r.x,r.y,r.z],radius:n}}function bw({canvasAreaRef:e,controlsRef:t,sceneRef:r,modelUrl:n,tilesetUrl:i,measurementModelId:o,savedMeasurements:a,measurementSettings:s,measurementUnit:l,onMeasurementsChange:c,onMeasurementSettingsChange:d,onCollectionChange:m,modelRotation:u,bindingTransformSignature:h,modelLoaded:p,enabled:g}){let[b,w]=ao(!1),[f,y]=DE(sw,cu),[S,M]=ao("none"),[x,C]=ao(null),[A,P]=ao(!1),[_,R]=ao(null),[k,T]=ao(null),L=pu(!1),F=pu(0),j=pu(null),V=pu(null);L.current=b&&g;let E=gr(ae=>{ae.updateMatrixWorld(!0),R(LE(ae)),T(IE(ae))},[]),O=gr(()=>{y({type:"clear"}),C(null)},[]),Z=gr(ae=>{y({type:"tool",tool:ae}),C(null)},[]),ee=gr(()=>y({type:"undo"}),[]),J=gr(()=>y({type:"finishArea"}),[]),U=gr(()=>w(ae=>!ae),[]),Q=gr(()=>P(ae=>!ae),[]),q=gr(ae=>{!L.current||ae.button!==0||(j.current={x:ae.clientX,y:ae.clientY})},[]),G=gr((ae,qe)=>{let ze=e.current,pe=t.current?.camera,_e=r.current;if(!ze||!pe||!_e)return null;let Be=ze.getBoundingClientRect();if(!Be.width||!Be.height)return null;_e.updateMatrixWorld(!0),pe.updateMatrixWorld(!0);let Ye=new Wm(ae-Be.left,qe-Be.top),Nt=new OE;return Nt.setFromCamera(new Wm(Ye.x/Be.width*2-1,1-Ye.y/Be.height*2),pe),Nt.intersectObject(_e,!0).find(Bv)??null},[e,t,r]),H=gr((ae,qe)=>{let ze=e.current,pe=t.current?.camera,_e=G(ae,qe);if(!_e||!ze||!pe)return null;let Be=ze.getBoundingClientRect(),Ye=new Wm(ae-Be.left,qe-Be.top);return Hm(Nv(_e,pe,Ye,Be,S),_e)},[e,t,G,S]),se=gr(()=>{V.current!==null&&cancelAnimationFrame(V.current),V.current=null,C(null)},[]),ve=gr(ae=>{if(!L.current||S==="none"||ae.buttons!==0||ae.target.closest("button, input, select, label, textarea, .ri-measureTools")){se();return}V.current!==null&&cancelAnimationFrame(V.current);let{clientX:qe,clientY:ze}=ae;V.current=requestAnimationFrame(()=>{V.current=null;let pe=H(qe,ze);C(pe?.snapped?pe:null)})},[se,H,S]),Ne=gr(ae=>{if(!L.current)return;let qe=j.current;if(j.current=null,qe&&Math.hypot(ae.clientX-qe.x,ae.clientY-qe.y)>6||ae.target.closest("button, input, select, label, textarea, .ri-measureTools"))return;if(f.tool==="wrap"||f.tool==="wrapHorizontal"){let _e=G(ae.clientX,ae.clientY);if(!_e)return;let Be=f.tool==="wrapHorizontal"?Iv(_e):Lv(_e);if("error"in Be){y({type:"fail",error:Be.error});return}let Ye=Be.points.map((Nt,jt)=>({id:F.current+jt+1,...Hm({position:Nt},_e)}));F.current+=Ye.length,y({type:"wrapResult",points:Ye});return}let pe=H(ae.clientX,ae.clientY);pe&&(F.current+=1,y({type:"place",point:{...pe,id:F.current}}))},[f.tool,H,G]);ks(()=>{O(),R(null),T(null)},[n,O]),ks(()=>{O()},[u[0],u[1],u[2],h,O]),ks(()=>(se(),se),[se,b,S]),ks(()=>{g||(w(!1),se())},[g,se]),ks(()=>{let ae=r.current;!p||!ae||E(ae)},[h,p,E,r]);let[$,xe]=ao([]),Te=f.points.length>0&&Qp(f.tool,f.points)!==null&&(f.tool!=="area"||f.areaClosed),we=f.tool==="distance"&&f.points.length===2,pt=gr(ae=>{if(!Te)return;if(f.points.length>8192){y({type:"fail",error:"A saved measurement can contain up to 8,192 points. Choose a simpler surface and measure again."});return}if(f.points.some(ze=>!ze.anchor)){y({type:"fail",error:"This surface has no stable measurement anchor. Give the mesh a unique name and measure again."});return}if(a.length>=256){y({type:"fail",error:"A model can keep up to 256 named measurements."});return}let qe={id:crypto.randomUUID(),name:ae.trim()||`Measurement ${a.length+1}`,modelId:o,...i?{tilesetUrl:i,approximate:!0}:{},tool:f.tool,points:structuredClone(f.points),createdAt:new Date().toISOString()};c([...a,qe]),O()},[Te,a,o,i,f,c,O]),te=gr((ae,qe)=>{try{if(!we)throw new Error("Pick two distance points before calibrating.");let ze=Qp("distance",f.points).value;d(zv(ze,ae,qe,s)),y({type:"clearError"})}catch(ze){y({type:"fail",error:ze instanceof Error?ze.message:String(ze)})}},[we,f.points,s,d]),_t={settings:s,items:a};return{saveMeasurement:pt,canSaveMeasurement:Te,canCalibrate:we,calibrate:te,savedResults:$,setSavedResults:xe,exportMeasurementJson:()=>un(new Blob([Fv(_t)],{type:"application/json"}),"measurements.json"),exportMeasurementCsv:()=>{let ae=r.current?Es(r.current):void 0,qe=a.map(ze=>{let pe=du(ze,r.current,o,i,ae);return _c(ze,s,l,pe.points,pe.status)});un(new Blob([Uv(_t,qe,l)],{type:"text/csv;charset=utf-8"}),"measurements.csv")},importMeasurements:ae=>{try{m(Vv(ae)),O()}catch(qe){y({type:"fail",error:qe instanceof Error?qe.message:String(qe)})}},measureMode:b,measureModeRef:L,measurePoints:f.points,measurementTool:f.tool,areaClosed:f.areaClosed,measurementError:f.error,selectMeasurementTool:Z,undoMeasurementPoint:ee,finishMeasureArea:J,snapMode:S,setSnapMode:M,snapPreview:x,handleMeasurePointerMove:ve,clearSnapPreview:se,showDimensions:A,measureBox:_,modelBounds:k,refreshBounds:E,clearMeasurements:O,toggleMeasureMode:U,toggleDimensions:Q,handleMeasurePointerDown:q,handleMeasureClick:Ne}}import{createPortal as BE}from"react-dom";import{createXRStore as NE}from"@react-three/xr";import{MapPin as jE}from"lucide-react";import{useCallback as so,useEffect as lo,useMemo as yw,useRef as zE,useState as jn}from"react";function vw(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 VE,jsx as ua,jsxs as Xm}from"react/jsx-runtime";var xw={canPlace:!1,isPlacementMode:!0,isModelPlaced:!1};function ww({enableXR:e,configuredHandoff:t=!1,usdzUrl:r,mobileHandoffUrl:n,engagement:i,animationControls:o}){let a=ce(),s=zE(null),l=yw(()=>{if(!e||typeof navigator>"u")return null;let U=navigator.xr;if(!U||typeof U.isSessionSupported!="function"||typeof U.addEventListener!="function")return null;try{return NE({emulate:!1})}catch{return null}},[e]),[c,d]=jn(!1),[m,u]=jn(e),[h,p]=jn(!1),[g,b]=jn(!0),[w,f]=jn(null),[y,S]=jn(!1),[M,x]=jn(!1),[C,A]=jn(xw),[P,_]=jn(!1),R=yw(()=>e&&(t||!!r?.trim())&&kc(),[e,r,t]);lo(()=>{b(by())},[]);let k=so(()=>{if(typeof window>"u")return null;try{let U=new URL(n?.trim()||window.location.href,window.location.href);return U.protocol==="http:"||U.protocol==="https:"?U.toString():null}catch{return null}},[n]);lo(()=>{if(!e||g){f(null),S(!1);return}f(k())},[e,g,k]),lo(()=>{if(l)return l.subscribe(U=>x(U.session!=null&&U.mode==="immersive-ar"))},[l]),lo(()=>{if(l)return vw(l,i)},[l,i]),lo(()=>{_(!1),A(xw)},[M]),lo(()=>{if(!e||typeof navigator>"u"){u(!1);return}let U=navigator.xr;if(!U?.isSessionSupported){u(!1);return}let Q=!1;return u(!0),U.isSessionSupported("immersive-ar").then(q=>!Q&&d(q)).catch(()=>{}).finally(()=>{Q||u(!1)}),U.isSessionSupported("immersive-vr").then(q=>!Q&&p(q)).catch(()=>{}),()=>{Q=!0}},[e]);let T=so(()=>{let U=k();U&&(i.requestARLaunch("mobile-handoff"),f(U),S(!0))},[k,i]),L=so(()=>S(!1),[]),F=so(()=>{let U=r?.trim();if(!U)return;i.requestARLaunch("quick-look");let Q=document.createElement("a");Q.setAttribute("rel","ar"),Q.href=U,Q.style.display="none";let q=document.createElement("img");q.alt="",q.src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==",Q.appendChild(q),document.body.appendChild(Q),Q.click(),Q.remove()},[r,i]),j=so(U=>{A(U),U.isPlacementMode||_(!1)},[]),V=so(U=>{_(!1),U?s.current?.finishPlacementMode():s.current?.cancelPlacementMode()},[]),E=so(U=>{U.preventDefault(),_(!0),s.current?.startPlacementMode()},[]);lo(()=>{if(!P)return;let U=()=>V(!0),Q=()=>V(!1);return window.addEventListener("pointerup",U),window.addEventListener("pointercancel",Q),()=>{window.removeEventListener("pointerup",U),window.removeEventListener("pointercancel",Q)}},[V,P]);let O=C.isModelPlaced?C.isPlacementMode?C.canPlace?a("arReleaseToPlace"):a("arFindSurface"):null:C.canPlace?null:a("arFindSurface"),Z=C.isModelPlaced&&!C.isPlacementMode?a("arGestureHint"):null,ee=l?.getState().domOverlayRoot??null,J=M&&ee?BE(Xm(VE,{children:[Z&&ua("div",{className:"ri-arHintOverlay",children:ua("div",{className:"ri-arHint",children:Z})}),ua("div",{className:"ri-arOverlay",children:Xm("div",{className:"ri-arControls",children:[o,O&&ua("div",{className:"ri-arStatus",children:O}),C.isModelPlaced&&Xm("button",{type:"button",className:`ri-arActionButton ${P?"ri-arActionButton--active":""}`,onPointerDown:U=>E(U.nativeEvent),"aria-pressed":P,children:[ua(jE,{size:14}),a("arRelocate")]}),!C.isModelPlaced&&C.canPlace&&ua("button",{type:"button",className:"ri-arActionButton ri-arActionButton--primary",onClick:()=>s.current?.placeCurrent(),children:a("tapToPlace")})]})})]}),ee):null;return{xrStore:l,inARSession:M,presenterRef:s,arSupported:c,checkingAR:m,vrSupported:h,quickLookSupported:R,resolvedMobileHandoffUrl:w,isMobileHandoffOpen:y,arOverlay:J,openMobileHandoff:T,closeMobileHandoff:L,openQuickLook:F,handleARStateChange:j}}import{useEffect as FE,useRef as Mw}from"react";import{useFrame as UE,useThree as GE}from"@react-three/fiber";var mu=e=>typeof e=="number"&&Number.isFinite(e)&&e>=0?e:null,hu=class{constructor(){this.lastFrame=null;this.intervals=[]}frame(t,r){let n=this.lastFrame===null?0:t-this.lastFrame;n>0&&(r==="always"||n<=250)&&this.intervals.length<1e3&&this.intervals.push(n),this.lastFrame=t}sample(t,r,n){let o=r.renderMode!=="never"&&this.lastFrame!==null&&n-this.lastFrame<=250?this.intervals:[],a=o.length?o.reduce((l,c)=>l+c,0)/o.length:null;this.intervals=[];let s=t.info;return{sampledAt:new Date().toISOString(),...structuredClone(r),drawCalls:mu(r.renderer==="webgpu"?s?.render?.drawCalls:s?.render?.calls),triangles:mu(s?.render?.triangles),geometries:mu(s?.memory?.geometries),textures:mu(s?.memory?.textures),frameIntervalMs:a,fps:a?1e3/a:null,frameSamples:o.length}}};function Sw(e=1e3){return Number.isFinite(e)?Math.min(1e4,Math.max(250,e)):1e3}function Cw(e){let t=GE(o=>o.get),r=Mw(e);r.current=e;let n=Mw(new hu);UE(o=>n.current.frame(performance.now(),o.frameloop));let i=Sw(e.intervalMs);return FE(()=>{let o=setInterval(()=>{let{gl:a,viewport:s,frameloop:l}=t(),c=r.current,d=n.current.sample(a,{renderer:fi(a)?"webgpu":"webgl",renderMode:l,quality:{profile:c.profile,reducedGpuLoad:c.reducedGpuLoad,dpr:a.getPixelRatio?.()??s.dpr,shadows:a.shadowMap?.enabled??c.shadows,postProcessing:c.postProcessing},streaming:c.streamingRef?.current??null},performance.now());c.onStats(d)},i);return()=>clearInterval(o)},[t,i]),null}import{Canvas as Jk,useThree as Hw}from"@react-three/fiber";import{Environment as Zk}from"@react-three/drei";import{XR as eD}from"@react-three/xr";import{ACESFilmicToneMapping as tD,LinearToneMapping as rD,NoToneMapping as qw,ReinhardToneMapping as nD}from"three";import{Suspense as iD,useEffect as oD,useMemo as xu,useState as aD}from"react";import{useThree as Ls}from"@react-three/fiber";import{Autofocus as xk,Bloom as wk,BrightnessContrast as Sk,ChromaticAberration as Mk,ColorAverage as Ck,DepthOfField as Pk,DotScreen as Tk,EffectComposer as _k,Glitch as Ak,GodRays as Rk,Grid as Ek,HueSaturation as kk,Noise as Dk,Outline as Ok,Pixelation as Lk,Ramp as Ik,Scanline as Bk,SelectiveBloom as Nk,Sepia as jk,SMAA as zk,SSAO as Vk,ToneMapping as Fk,Vignette as Uk}from"@react-three/postprocessing";import{BlendFunction as pa,KernelSize as Gk}from"postprocessing";import{Color as Is,Vector2 as Ds}from"three";import{memo as Hk,useCallback as Wk,useEffect as th,useLayoutEffect as qk,useMemo as uo,useRef as rh,useState as Uw}from"react";import{forwardRef as HE,useImperativeHandle as WE,useMemo as qE}from"react";import{BlendFunction as XE,Effect as $E}from"postprocessing";import{Uniform as YE}from"three";import{jsx as QE}from"react/jsx-runtime";var KE=`
|
|
10
|
-
uniform float exposure;
|
|
11
|
-
void mainImage(const in vec4 inputColor, const in vec2 uv, out vec4 outputColor) {
|
|
12
|
-
outputColor = vec4(inputColor.rgb * exposure, inputColor.a);
|
|
13
|
-
}
|
|
14
|
-
`,$m=class extends $E{constructor(t=1){super("ExposureEffect",KE,{blendFunction:XE.NORMAL,uniforms:new Map([["exposure",new YE(t)]])})}set exposure(t){this.uniforms.get("exposure").value=t}},Pw=HE(function({exposure:t},r){let n=qE(()=>new $m(t),[]);return n.exposure=t,WE(r,()=>n,[n]),QE("primitive",{object:n,dispose:null})});import{useFrame as JE,useThree as fu}from"@react-three/fiber";import*as Rw from"@react-three/postprocessing";import{BlendFunction as ZE}from"postprocessing";import{Color as ek,MathUtils as tk,Mesh as rk,Vector2 as Tw,Vector3 as _w}from"three";import{useEffect as Aw,useMemo as gu,useRef as Ym}from"react";import{jsx as ik}from"react/jsx-runtime";var nk=Rw.LensFlareEffect;function Ew({config:e}){let t=fu(u=>u.camera),r=fu(u=>u.raycaster),n=fu(u=>u.scene),i=fu(u=>u.viewport),o=Ym(null),a=Ym(new _w),s=Ym(new Tw),l=gu(()=>new _w(...e.lensPosition),[e.lensPosition]),c=gu(()=>new ek(e.colorGain??"#141414"),[e.colorGain]),d=gu(()=>new Tw(0,0),[]),m=gu(()=>new nk({blendFunction:ZE.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:c,lensDirtTexture:null,haloScale:e.haloScale,secondaryGhosts:e.secondaryGhosts,aditionalStreaks:e.aditionalStreaks,ghostScale:e.ghostScale,opacity:e.opacity,starBurst:e.starBurst}),[c,e.aditionalStreaks,e.anamorphic,e.animated,e.flareShape,e.flareSize,e.flareSpeed,e.glareSize,e.haloScale,e.ghostScale,e.opacity,e.secondaryGhosts,e.starBurst,l,d]);return Aw(()=>(o.current=m,()=>{m.dispose(),o.current=null}),[m]),Aw(()=>{let u=m.uniforms.get("screenRes");u&&(u.value.x=i.width,u.value.y=i.height)},[m,i]),JE((u,h)=>{let p=o.current;if(!p)return;let g=p.uniforms.get("lensPosition"),b=p.uniforms.get("opacity");if(!g||!b)return;let w=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 f=r.intersectObjects(n.children,!0),{object:y}=f[0]||{};y&&(y.userData?.lensflare==="no-occlusion"?w=0:y instanceof rk&&(y.material.uniforms?._transmission?.value>.2||y.material._transmission&&y.material._transmission>.2?w=.2:y.material.transparent&&(w=y.material.opacity))),b.value=tk.damp(b.value,w,12,h)}),ik("primitive",{object:m,dispose:null})}import{useThree as Iw}from"@react-three/fiber";import{EffectPass as fk}from"postprocessing";import{useEffect as gk,useMemo as bk}from"react";import{BlendFunction as ok,Effect as ak,RenderPass as sk}from"postprocessing";import{Color as kw,Mesh as Lw,NearestFilter as bu,NoBlending as lk,ShaderMaterial as Dw,Uniform as co,Vector2 as ck,Vector3 as uk,WebGLRenderTarget as Ow}from"three";var dk=`
|
|
15
|
-
#include <common>
|
|
16
|
-
#include <morphtarget_pars_vertex>
|
|
17
|
-
#include <skinning_pars_vertex>
|
|
18
|
-
#include <clipping_planes_pars_vertex>
|
|
19
|
-
#include <logdepthbuf_pars_vertex>
|
|
20
|
-
void main() {
|
|
21
|
-
#include <skinbase_vertex>
|
|
22
|
-
#include <begin_vertex>
|
|
23
|
-
#include <morphtarget_vertex>
|
|
24
|
-
#include <skinning_vertex>
|
|
25
|
-
#include <project_vertex>
|
|
26
|
-
#include <logdepthbuf_vertex>
|
|
27
|
-
#include <clipping_planes_vertex>
|
|
28
|
-
}`,pk=`
|
|
29
|
-
#include <common>
|
|
30
|
-
#include <clipping_planes_pars_fragment>
|
|
31
|
-
#include <logdepthbuf_pars_fragment>
|
|
32
|
-
uniform vec3 objectId;
|
|
33
|
-
uniform bool onlySelected;
|
|
34
|
-
void main() {
|
|
35
|
-
#include <clipping_planes_fragment>
|
|
36
|
-
#include <logdepthbuf_fragment>
|
|
37
|
-
if (onlySelected && length(objectId) < 0.001) discard;
|
|
38
|
-
gl_FragColor = vec4(objectId, step(0.001, length(objectId)));
|
|
39
|
-
}`,mk=`
|
|
40
|
-
uniform sampler2D selectionMask;
|
|
41
|
-
uniform sampler2D visibleMask;
|
|
42
|
-
uniform vec2 texelSize;
|
|
43
|
-
uniform vec3 outlineColor;
|
|
44
|
-
uniform float edgeStrength;
|
|
45
|
-
float different(vec4 a, vec4 b) {
|
|
46
|
-
return max(a.a, b.a) * step(0.001, length(a.rgb - b.rgb) + abs(a.a - b.a));
|
|
47
|
-
}
|
|
48
|
-
float visible(vec4 id, vec4 surface) {
|
|
49
|
-
return surface.a * (1.0 - step(0.001, length(id.rgb - surface.rgb)));
|
|
50
|
-
}
|
|
51
|
-
float edgeAt(vec2 uv, vec2 offset, vec4 center, float centerVisible) {
|
|
52
|
-
vec4 neighbor = texture2D(selectionMask, uv + offset);
|
|
53
|
-
return different(center, neighbor) * max(centerVisible, visible(neighbor, texture2D(visibleMask, uv + offset)));
|
|
54
|
-
}
|
|
55
|
-
void mainImage(const in vec4 inputColor, const in vec2 uv, out vec4 outputColor) {
|
|
56
|
-
vec4 c = texture2D(selectionMask, uv);
|
|
57
|
-
float shown = visible(c, texture2D(visibleMask, uv));
|
|
58
|
-
float edge = max(max(edgeAt(uv, vec2(texelSize.x, 0.0), c, shown), edgeAt(uv, vec2(-texelSize.x, 0.0), c, shown)),
|
|
59
|
-
max(edgeAt(uv, vec2(0.0, texelSize.y), c, shown), edgeAt(uv, vec2(0.0, -texelSize.y), c, shown)));
|
|
60
|
-
outputColor = vec4(outlineColor * edge * edgeStrength, max(inputColor.a, edge));
|
|
61
|
-
}`,vu=class extends ak{constructor(r,n,i,o,a={}){super("SelectionOutlineEffect",mk,{blendFunction:ok.SCREEN,uniforms:new Map([["selectionMask",new co(null)],["visibleMask",new co(null)],["texelSize",new co(new ck)],["outlineColor",new co(new kw(a.visibleEdgeColor??2278750))],["edgeStrength",new co(a.edgeStrength??3)]])});this.scene=r;this.camera=n;this.getObjects=i;this.layer=o;this.maskTarget=new Ow(1,1,{minFilter:bu,magFilter:bu});this.visibleTarget=new Ow(1,1,{minFilter:bu,magFilter:bu});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 Dw({name:"SelectionOutline.IDs",vertexShader:dk,fragmentShader:pk,uniforms:{objectId:new co(new uk),onlySelected:new co(!1)},blending:lk,toneMapped:!1,clipping:!0}),this.maskPass=new sk(r,n,this.maskMaterial),this.maskPass.skipShadowMapUpdate=!0,this.maskPass.ignoreBackground=!0,this.maskPass.clearPass.overrideClearColor=new kw(0),this.maskPass.clearPass.overrideClearAlpha=0}update(r){let n=hk(this.scene,this.getObjects()),i=[],o=this.camera.layers.mask;try{this.scene.traverseVisible(a=>{if(!(a instanceof Lw))return;let s=n.get(a)??0,l=a.onBeforeRender;a.onBeforeRender=function(...c){l.apply(this,c);let d=c[4];d instanceof Dw&&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 hk(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 Lw&&n.set(o,s);for(let l of o.children)i(l,s)};return i(e,0),n}import{jsx as vk}from"react/jsx-runtime";function Bw({objects:e,layer:t,options:r}){let n=Iw(a=>a.scene),i=Iw(a=>a.camera),o=bk(()=>new fk(i,new vu(n,i,()=>e.current,t,r)),[n,i,e,t,r]);return gk(()=>()=>o.dispose(),[o]),vk("primitive",{object:o,dispose:null})}function Nw(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 jw(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 Km}from"@react-three/postprocessing";import{GlitchMode as Qm,KernelSize as da,ToneMappingMode as Jm}from"postprocessing";import{Color as yk}from"three";function zw(e){return e==="linear"?Jm.LINEAR:e==="reinhard"?Jm.REINHARD:Jm.ACES_FILMIC}function yu(e){switch(e){case"verySmall":return da.VERY_SMALL;case"small":return da.SMALL;case"medium":return da.MEDIUM;case"large":return da.LARGE;case"veryLarge":return da.VERY_LARGE;case"huge":return da.HUGE}}function Vw(e){switch(e){case"constantMild":return Qm.CONSTANT_MILD;case"constantWild":return Qm.CONSTANT_WILD;default:return Qm.SPORADIC}}function Zm(e){let t=new yk(e);return[t.r,t.g,t.b,1]}function Fw(e){return e==="radial"?Km.Radial:e==="mirroredLinear"?Km.MirroredLinear:Km.Linear}import{Fragment as Qk,jsx as lt,jsxs as eh}from"react/jsx-runtime";var po={edgeStrength:1,pulseSpeed:0,visibleEdgeColor:new Is(Ko.color).getHex(),hiddenEdgeColor:new Is(Ko.color).multiplyScalar(.35).getHex(),kernelSize:Gk.VERY_SMALL,blur:!1,xRay:!1},Xk={edgeStrength:3};function $k(e){let t=[];return e.traverse(r=>{r.isMesh&&t.push(r)}),t}var Os=[],Yk=Hk(function({sceneConfig:t,selectedObjectRef:r,selectedObjectOutlineColor:n,highlightOnHover:i=!1,disabled:o=!1,onOutlineEffect:a,hasMultiSelection:s,multiOutlineObjects:l}){let c=Ls(R=>R.scene),d=Ls(R=>R.gl),m=rh(null),u=t?.postProcessing,h=r??null,p=u?.outline.enabled===!0,g=p||i,b=uo(()=>new Is(n??"#22c55e").getHex(),[n]),w=uo(()=>({...Xk,blendFunction:pa.SCREEN,visibleEdgeColor:b}),[b]),f=2;for(;f===u?.outline.selectionLayer||f===u?.selectiveBloom.selectionLayer;)f+=1;let[y,S]=Uw(()=>d.xr?.isPresenting??!1);th(()=>{let R=d.xr;if(!R)return;let k=()=>S(!0),T=()=>S(!1);return R.addEventListener("sessionstart",k),R.addEventListener("sessionend",T),S(R.isPresenting),()=>{R.removeEventListener("sessionstart",k),R.removeEventListener("sessionend",T)}},[d]);let M=c.children.filter(R=>R.isLight),x=uo(()=>new Ds(u?.chromaticAberration.offsetX??.002,u?.chromaticAberration.offsetY??.002),[u?.chromaticAberration.offsetX,u?.chromaticAberration.offsetY]),C=uo(()=>new Is(u?.outline.visibleEdgeColor??"#ffffff").getHex(),[u?.outline.visibleEdgeColor]),A=uo(()=>new Is(u?.outline.hiddenEdgeColor??"#22090a").getHex(),[u?.outline.hiddenEdgeColor]),P=uo(()=>Zm(u?.ramp.startColor??"#000000"),[u?.ramp.startColor]),_=uo(()=>Zm(u?.ramp.endColor??"#ffffff"),[u?.ramp.endColor]);return!u||y||o?null:eh(Qk,{children:[u.godRays.enabled===!0&&eh("mesh",{ref:m,position:u.godRays.sunPosition,visible:!1,frustumCulled:!1,children:[lt("sphereGeometry",{args:[.1,8,8]}),lt("meshBasicMaterial",{transparent:!0,opacity:0,depthWrite:!1})]}),eh(_k,{multisampling:0,enableNormalPass:u.ssao.enabled===!0,autoClear:!1,children:[u.smaa.enabled===!0&<(zk,{}),u.ssao.enabled===!0&<(Vk,{samples:u.ssao.samples,rings:u.ssao.rings,intensity:u.ssao.intensity,radius:u.ssao.radius,bias:u.ssao.bias,luminanceInfluence:u.ssao.luminanceInfluence,fade:u.ssao.fade,minRadiusScale:u.ssao.minRadiusScale,worldDistanceThreshold:u.ssao.worldDistanceThreshold,worldDistanceFalloff:u.ssao.worldDistanceFalloff,worldProximityThreshold:u.ssao.worldProximityThreshold,worldProximityFalloff:u.ssao.worldProximityFalloff}),u.autofocus.enabled===!0&<(xk,{focusDistance:u.autofocus.focusDistance,focusRange:u.autofocus.focusRange,focalLength:u.autofocus.focalLength,bokehScale:u.autofocus.bokehScale,target:u.autofocus.target,mouse:u.autofocus.mouse,debug:u.autofocus.debug||void 0,manual:u.autofocus.manual,smoothTime:u.autofocus.smoothTime}),u.autofocus.enabled!==!0&&u.depthOfField.enabled===!0&<(Pk,{focusDistance:u.depthOfField.focusDistance,focusRange:u.depthOfField.focusRange,focalLength:u.depthOfField.focalLength,bokehScale:u.depthOfField.bokehScale}),u.bloom.enabled===!0&<(wk,{intensity:u.bloom.intensity,luminanceThreshold:u.bloom.luminanceThreshold,luminanceSmoothing:u.bloom.luminanceSmoothing,mipmapBlur:u.bloom.mipmapBlur,radius:u.bloom.radius,levels:u.bloom.levels}),u.selectiveBloom.enabled===!0&<(Nk,{selection:h??void 0,lights:M,selectionLayer:u.selectiveBloom.selectionLayer,intensity:u.selectiveBloom.intensity,luminanceThreshold:u.selectiveBloom.luminanceThreshold,luminanceSmoothing:u.selectiveBloom.luminanceSmoothing,kernelSize:yu(u.selectiveBloom.kernelSize),mipmapBlur:u.selectiveBloom.mipmapBlur,inverted:u.selectiveBloom.inverted,ignoreBackground:u.selectiveBloom.ignoreBackground}),g&<(Ok,{ref:a,selection:Os,selectionLayer:u.outline.selectionLayer,blendFunction:pa.SCREEN,edgeStrength:p?u.outline.edgeStrength:po.edgeStrength,pulseSpeed:p?u.outline.pulseSpeed:po.pulseSpeed,visibleEdgeColor:p?C:po.visibleEdgeColor,hiddenEdgeColor:p?A:po.hiddenEdgeColor,kernelSize:p?yu(u.outline.kernelSize):po.kernelSize,blur:p?u.outline.blur:po.blur,xRay:p?u.outline.xRay:po.xRay}),s&<(Bw,{objects:l,layer:f,options:w}),u.chromaticAberration.enabled===!0&<(Mk,{offset:x,radialModulation:u.chromaticAberration.radialModulation,modulationOffset:u.chromaticAberration.modulationOffset}),u.colorAverage.enabled===!0&<(Ck,{}),u.dotScreen.enabled===!0&<(Tk,{angle:u.dotScreen.angle,scale:u.dotScreen.scale}),u.glitch.enabled===!0&<(Ak,{mode:Vw(u.glitch.mode),delay:new Ds(u.glitch.delay[0],u.glitch.delay[1]),duration:new Ds(u.glitch.duration[0],u.glitch.duration[1]),strength:new Ds(u.glitch.strength[0],u.glitch.strength[1]),chromaticAberrationOffset:new Ds(u.glitch.chromaticAberrationOffset[0],u.glitch.chromaticAberrationOffset[1]),columns:u.glitch.columns,ratio:u.glitch.ratio,active:!0}),u.grid.enabled===!0&<(Ek,{scale:u.grid.scale,lineWidth:u.grid.lineWidth}),u.lensflare.enabled===!0&<(Ew,{config:u.lensflare}),u.godRays.enabled===!0&<(Rk,{sun:m,samples:u.godRays.samples,density:u.godRays.density,decay:u.godRays.decay,weight:u.godRays.weight,exposure:u.godRays.exposure,clampMax:u.godRays.clampMax,blur:u.godRays.blur,kernelSize:yu(u.godRays.kernelSize)}),u.noise.enabled===!0&<(Dk,{premultiply:u.noise.premultiply,opacity:u.noise.opacity,blendFunction:pa.ADD}),u.brightnessContrast.enabled===!0&<(Sk,{brightness:u.brightnessContrast.brightness,contrast:u.brightnessContrast.contrast}),u.hueSaturation.enabled===!0&<(kk,{hue:u.hueSaturation.hue,saturation:u.hueSaturation.saturation}),u.toneMapping.enabled===!0&<(Pw,{exposure:u.toneMapping.exposure}),u.vignette.enabled===!0&<(Uk,{eskil:u.vignette.eskil,offset:u.vignette.offset,darkness:u.vignette.darkness,blendFunction:pa.NORMAL}),u.toneMapping.enabled===!0&<(Fk,{mode:zw(u.toneMapping.mode),resolution:u.toneMapping.resolution,whitePoint:u.toneMapping.whitePoint,middleGrey:u.toneMapping.middleGrey,minLuminance:u.toneMapping.minLuminance,averageLuminance:u.toneMapping.averageLuminance,adaptationRate:u.toneMapping.adaptationRate}),u.sepia.enabled===!0&<(jk,{intensity:u.sepia.intensity,blendFunction:pa.NORMAL}),u.scanline.enabled===!0&<(Bk,{density:u.scanline.density,blendFunction:pa.OVERLAY}),u.pixelation.enabled===!0&<(Lk,{granularity:u.pixelation.granularity}),u.ramp.enabled===!0&<(Ik,{rampType:Fw(u.ramp.rampType),rampStart:u.ramp.rampStart,rampEnd:u.ramp.rampEnd,startColor:P,endColor:_,opacity:u.ramp.rampMask?1:u.ramp.opacity??.5,rampBias:u.ramp.rampBias,rampGain:u.ramp.rampGain,rampMask:u.ramp.rampMask,rampInvert:u.ramp.rampInvert})]})]})});function Kk(e,t){return e.length===t.length&&e.every((r,n)=>r===t[n])}function Gw({hoveredObjectRef:e,selectedObjectRefs:t,...r}){let n=Ls(m=>m.scene),i=Ls(m=>m.camera),o=Ls(m=>m.invalidate),[a,s]=Uw(null),l=rh(Os);l.current=t??Os;let c=Wk(m=>s(m),[]);qk(()=>{if(a)return jw(a,i)},[a,i]);let d=rh({effect:null,objects:Os});return th(()=>{if(!a)return;let u=r.sceneConfig?.postProcessing?.outline.enabled===!0?$k(n):e&&Nw(e)?[e]:Os;d.current.effect===a&&Kk(d.current.objects,u)||(d.current={effect:a,objects:u},a.selection.set(u),o())}),th(()=>{o()},[t,o]),lt(Yk,{...r,onOutlineEffect:c,hasMultiSelection:l.current.length>0,multiOutlineObjects:l})}import{Fragment as uD,jsx as cr,jsxs as Ww}from"react/jsx-runtime";var sD=1.5;function nh({runtimeStats:e,children:t,camera:r,backgroundColor:n,shadows:i=!0,sceneConfig:o,selectedObjectRef:a,selectedObjectRefs:s,selectedObjectOutlineColor:l,hoveredObjectRef:c,highlightOnHover:d,renderMode:m="demand",maxDpr:u=2,xrStore:h,rendererCaptureRef:p,preserveDrawingBuffer:g=!1,reduceGpuLoad:b,suspended:w=!1,paused:f=!1,onRendererCreated:y,backend:S="webgl"}){let M=S==="webgpu",x=b??vy(),C=x?Math.min(u,sD):u,A=i&&!x,P=xu(()=>{if(n)return{background:n};if(!o?.background.enabled)return{background:"transparent"};if(o.background.type==="color")return{background:o.background.color};if(o.background.type==="image"&&o.background.imageUrl.trim()){let E=o.background.imageUrl.trim(),O=bc(E)??E;return{backgroundImage:`url(${JSON.stringify(O)})`,backgroundPosition:"center",backgroundRepeat:"no-repeat",backgroundSize:"cover"}}return{background:"linear-gradient(180deg, #3a3a3c 0%, #1c1c1d 100%)"}},[n,o]),_=xu(()=>{if(n)return n;let E=o?.background;if(E?.enabled){if(E.type==="color")return E.color;if(E.type==="image"&&E.imageUrl.trim()||E.type==="environment")return null}return"#1c1c1d"},[n,o]),R=xu(()=>{let E=o?.postProcessing;return E?!!(E.glitch.enabled||E.noise.enabled||E.lensflare.enabled&&E.lensflare.animated):!1},[o?.postProcessing]),[k,T]=aD(!1),L=o?.environment,F=o?.groundShadows,j=xu(()=>{if(!L)return null;if(L.source==="custom"){let E=L.customEnvironmentUrl.trim();return Ev(E)?{files:E}:null}return{preset:L.preset}},[L]),V=Ww(uD,{children:[cr(Ay,{captureRef:p}),e&&cr(Cw,{...e,reducedGpuLoad:x,shadows:A,postProcessing:!x&&!M}),cr(Ry,{}),cr(Uy,{cameraConfig:r}),cr(jy,{active:R}),cr(Vy,{color:_}),j?cr(la,{onError:E=>console.warn("Failed to load environment map:",E),children:cr(iD,{fallback:null,children:cr(Zk,{...j,environmentIntensity:L?.intensity??.25,backgroundIntensity:L?.intensity??.25,background:o?.background.enabled===!0&&o.background.type==="environment"})})}):null,cr(Fy,{rotation:L?.rotation??0}),h&&cr(Ny,{onPresentingChange:T}),F?.enabled&&F.mode==="shadowCatcher"&&!k&&!M&&cr(zy,{position:[0,F.height,0],scale:F.size,opacity:F.intensity,blur:F.borderFade,far:15,resolution:1024,color:"#000000"}),t,cr(Gw,{sceneConfig:o,selectedObjectRef:a,selectedObjectRefs:s,selectedObjectOutlineColor:l,hoveredObjectRef:c,highlightOnHover:d,disabled:x||M}),M?cr(cD,{toneMapping:o?.postProcessing.toneMapping}):null]});return cr(Jk,{frameloop:w||f&&!k?"never":m,onCreated:({gl:E})=>y?.(E),dpr:[1,C],shadows:A?"percentage":!1,resize:{debounce:0,scroll:!1},raycaster:{firstHitOnly:!0},style:P,camera:r??{fov:50},gl:M?Ty:{preserveDrawingBuffer:g,toneMapping:qw,toneMappingExposure:1},flat:M||void 0,children:h&&!M?Ww(eD,{store:h,children:[cr(By,{renderMode:m,suspended:w}),V]}):V})}var lD={linear:rD,reinhard:nD,aces:tD};function cD({toneMapping:e}){let t=Hw(a=>a.gl),r=Hw(a=>a.invalidate),n=e?.enabled===!0,i=e?.mode??"aces",o=e?.exposure??1;return oD(()=>{t.toneMapping=n?lD[i]:qw,t.toneMappingExposure=n?o:1,r()},[t,r,n,i,o]),null}import{useThree as dD}from"@react-three/fiber";import{CameraControls as pD,PointerLockControls as mD}from"@react-three/drei";import{Box3 as hD,Vector3 as Xw}from"three";import{useEffect as Si,useRef as fD}from"react";import{jsx as $w}from"react/jsx-runtime";function ih({controlsRef:e,onCameraChange:t,cameraLimits:r,controllerType:n="orbit",onPointerLockExit:i,reducedMotion:o=!1}){let a=n==="orbit",s=dD(c=>c.frameloop);Si(()=>{if(!e||typeof e!="object")return;let c=e.current;c&&Xp(c,a?s==="never"?"paused":"active":"disconnected")},[e,s,a]),Si(()=>{let c=e&&typeof e=="object"?e.current:null;return()=>{c&&Xp(c,"disconnected")}},[e,a]);let l=fD(null);return Si(()=>{if(!a)return l.current?.lock(),()=>{l.current?.unlock()}},[a]),Si(()=>{a&&document.pointerLockElement&&document.exitPointerLock()},[a]),Si(()=>{if(a)return;let c=()=>{document.pointerLockElement||i?.()};return document.addEventListener("pointerlockchange",c),()=>{document.removeEventListener("pointerlockchange",c)}},[a,i]),Si(()=>{if(!a||!e||typeof e!="object"||!("current"in e))return;let c=e.current;c&&dv(c,o)},[a,e,o]),Si(()=>{if(!a||!t||!e||typeof e!="object"||!("current"in e))return;let c=e.current;if(!c)return;let d=()=>{t(c.camera,c)};return c.addEventListener("update",d),()=>{c.removeEventListener("update",d)}},[a,e,t]),Si(()=>{if(!a||!e||typeof e!="object"||!("current"in e))return;let c=e.current;if(!c)return;let d=Gy(r);c.minDistance=d.minDistance,c.maxDistance=d.maxDistance,c.minPolarAngle=d.minPolarAngle,c.maxPolarAngle=d.maxPolarAngle,c.minAzimuthAngle=d.minAzimuthAngle,c.maxAzimuthAngle=d.maxAzimuthAngle,c.boundaryEnclosesCamera=d.boundaryEnclosesCamera,c.boundaryFriction=d.boundaryFriction,c.setBoundary(d.panBoundary?new hD(new Xw(...d.panBoundary[0]),new Xw(...d.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?$w(pD,{ref:e,makeDefault:!0,smoothTime:o?0:.3,dollyToCursor:!0}):$w(mD,{ref:l,makeDefault:!0,selector:"[data-ri-pointer-lock-trigger]"})}import{useRef as Su,useMemo as Ns,useEffect as gD}from"react";import{useFrame as Qw,useThree as Jw}from"@react-three/fiber";import{Vector3 as bD}from"three";var Bs=new WeakMap;function Yw(e,t,r){let n=Bs.get(e);n||(n=new Map,Bs.set(e,n)),n.set(t,r)}function wu(e,t){let r=Bs.get(e);r?.delete(t),r?.size===0&&Bs.delete(e)}function Kw(e,t){return Bs.get(e)?.get(t)??null}import{Fragment as xD,jsx as ho,jsxs as wD}from"react/jsx-runtime";function mo(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 Zw(e,t,r=[0,0,0]){let[n,i,o]=e.center,a=e.radius,s=[t[0]-r[0],t[1]-r[1],t[2]-r[2]],l=Math.hypot(s[0],s[1],s[2]),c=l>1e-6?[s[0]/l,s[1]/l,s[2]/l]:[0,1,0],d=a*2;return{position:[n+c[0]*d,i+c[1]*d,o+c[2]*d],target:e.center,extent:a,near:Math.max(a/100,.001),far:d+a*2}}function eS(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 tS(e,t){if(!e)return;let r=e.shadow.camera,n=t?.near??.5,i=t?.far??40;r.near=n,r.far=i,r.updateProjectionMatrix()}function js(e,t,r){return t&&r&&!e.attachedToCamera?r.center:[0,0,0]}var vD={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}]},yD={enabled:!0,mapSize:2048,bias:-5e-4,normalBias:.02,radius:3};function rS({light:e,shadows:t,shadowsEnabled:r,environmentRotation:n,modelBounds:i,objectBindings:o,nodeRefs:a}){let s=Su(null),l=Su(null),c=Su(null),d=Jw(y=>y.camera),m=Jw(y=>y.scene),u=Ns(()=>new bD,[]),h=Ns(()=>e.attachedToCamera||e.attachment?e.position:mo(e.position,n),[e.position,e.attachedToCamera,e.attachment,n]);Qw(()=>{let y=s.current??l.current??c.current;if(!y)return;if(e.attachedToCamera){y.position.copy(d.position);return}let S=e.attachment;if(!S)return;let M=o?pc(o,S.objectId):null,C=(M?o?.[M]:void 0)?.modelObjectId??S.objectId,A=(M?a?.current[M]:void 0)??pi(m,C);A&&(u.fromArray(S.offset),A.localToWorld(u),y.position.copy(u))});let p=r&&t.enabled&&e.castShadow,g=Ns(()=>(e.type==="spot"||e.type==="directional")&&e.target&&!e.attachedToCamera?e.attachment?e.target:mo(e.target,n):null,[e.type,e.target,e.attachedToCamera,e.attachment,n]),b=Ns(()=>e.type==="directional"&&p&&i&&!e.attachedToCamera?Zw(i,h,g??void 0):null,[e.type,e.attachedToCamera,p,i,h,g]),w=Ns(()=>e.type==="spot"&&p&&i&&!e.attachedToCamera?eS(i,h):null,[e.type,e.attachedToCamera,p,i,h]);gD(()=>{let y=s.current??c.current;if(!y)return;let[S,M,x]=g&&!(e.type==="directional"&&b)?g:b?.target??js(e,p,i);y.target.position.set(S,M,x),y.target.updateMatrixWorld()},[e,p,i,g,b]);let f=Su(!1);return Qw(()=>{let y=s.current??l.current??c.current;if(!y||e.attachedToCamera||e.attachment)return;let S=s.current??c.current,M=Kw(m,e.id);if(!M){if(!f.current)return;if(f.current=!1,y.position.fromArray(b?.position??h),tS(c.current,w),S){let[P,_,R]=g&&!(e.type==="directional"&&b)?g:b?.target??js(e,p,i);S.target.position.set(P,_,R),S.target.updateMatrixWorld()}return}f.current=!0;let x=mo(M.position,n),C=M.target?mo(M.target,n):g??js(e,p,i),A=e.type==="directional"&&p&&i?Zw(i,x,C):null;y.position.fromArray(A?.position??x),tS(c.current,p&&i?eS(i,x):null),S&&(S.target.position.fromArray(A?.target??C),S.target.updateMatrixWorld())}),!e.visible||e.type==="none"?null:e.type==="directional"?ho("directionalLight",{ref:s,color:e.color,intensity:e.intensity,position:b?.position??h,castShadow:p,"shadow-mapSize-width":t.mapSize,"shadow-mapSize-height":t.mapSize,"shadow-bias":e.shadowBias,"shadow-normalBias":t.normalBias,"shadow-radius":t.radius,"shadow-camera-near":b?.near??.5,"shadow-camera-far":b?.far??40,"shadow-camera-left":-(b?.extent??8),"shadow-camera-right":b?.extent??8,"shadow-camera-top":b?.extent??8,"shadow-camera-bottom":-(b?.extent??8)}):e.type==="point"?ho("pointLight",{ref:l,color:e.color,intensity:e.intensity,position:h,distance:e.distance,decay:e.decay,castShadow:p,"shadow-mapSize-width":t.mapSize,"shadow-mapSize-height":t.mapSize,"shadow-bias":e.shadowBias}):e.type==="spot"?ho("spotLight",{ref:c,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:p,"shadow-mapSize-width":t.mapSize,"shadow-mapSize-height":t.mapSize,"shadow-bias":e.shadowBias,"shadow-normalBias":t.normalBias,"shadow-radius":t.radius,"shadow-camera-near":w?.near??.5,"shadow-camera-far":w?.far??40}):e.type==="hemisphere"?ho("hemisphereLight",{color:e.color,groundColor:"#444444",intensity:e.intensity}):null}function oh({lightingConfig:e,shadowConfig:t,shadowsEnabled:r=!0,environmentRotation:n=0,environmentConfig:i,modelBounds:o,objectBindings:a,nodeRefs:s}){let l=e??vD,c=t??yD,d=i?.shadowLight,m=mo([5,10,5],n);return wD(xD,{children:[ho("ambientLight",{intensity:l.ambient.intensity,color:l.ambient.color}),l.lights.map(u=>ho(rS,{light:u,shadows:c,shadowsEnabled:r,environmentRotation:n,modelBounds:o,objectBindings:a,nodeRefs:s},u.id)),d?.enabled&&ho(rS,{light:{id:"light-env-shadow",type:"directional",color:"#ffffff",intensity:d.intensity,position:m,attachedToCamera:!1,castShadow:!0,shadowBias:d.bias,visible:!0},shadows:c,shadowsEnabled:r,environmentRotation:0,modelBounds:o,objectBindings:a,nodeRefs:s})]})}import{useState as sh,useEffect as tt,useRef as Gt,useMemo as Dt,useCallback as _D,Suspense as AD}from"react";import{useFrame as _u,useThree as dS}from"@react-three/fiber";import{useCallback as SD,useEffect as nS,useRef as ah,useState as iS}from"react";function oS(e,t,r){let[n,i]=iS({}),o=ah(new Map),[a,s]=iS(0),l=ah(t);l.current=t;let c=ah(r);c.current=r;let d=SD((m,u)=>{l.current?.some(h=>h.url===m)&&i(h=>h[m]===u?h:{...h,[m]:u})},[]);return nS(()=>{let m=new Set(t?.map(h=>h.url)),u=!1;for(let[h,p]of o.current)m.has(h)&&n[h]===p&&p.parent===e||(p.removeFromParent(),o.current.delete(h),u=!0);for(let[h,p]of Object.entries(n))!m.has(h)||o.current.get(h)===p||(e.add(p),o.current.set(h,p),u=!0,c.current?.(h,p));i(h=>{let p=Object.entries(h).filter(([g])=>m.has(g));return p.length===Object.keys(h).length?h:Object.fromEntries(p)}),u&&s(h=>h+1)},[e,t,n]),nS(()=>()=>{o.current.forEach(m=>m.removeFromParent()),o.current.clear()},[]),{rootsByUrl:n,revision:a,onSourceReady:d}}import{Box3 as aS,Euler as MD,Matrix4 as sS,Quaternion as CD,Vector3 as zn}from"three";function zs(e){e.updateWorldMatrix(!0,!0);let t=new sS().copy(e.matrixWorld).invert(),r=new aS,n=new aS,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 sS().multiplyMatrices(t,o.matrixWorld);n.copy(a.geometry.boundingBox).applyMatrix4(s),r.union(n),i=!0}),i?r:null}function fo(e){let t=zs(e);return t?t.getCenter(new zn):new zn}function lS(e,t="XYZ"){return new CD().setFromEuler(new MD(e[0],e[1],e[2],t))}function PD(e,t,r,n,i="XYZ",o){let a=new zn(...n).multiply(new zn(...r));o&&a.applyMatrix4(cs(o)),a.applyQuaternion(lS(t,i));let s=a.add(new zn(...e));return[s.x,s.y,s.z]}function Mu(e,t,r,n="XYZ",i){return{point:[...e],offset:PD([0,0,0],t,r,e,n,i)}}function Vs(e,t,r,n,i="XYZ",o){if(!n)return e;let a=new zn(...n.point).multiply(new zn(...r));return o&&a.applyMatrix4(cs(o)),a.applyQuaternion(lS(t,i)),new zn(...e).add(new zn(...n.offset)).sub(a).toArray()}function iG(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 RD,MeshStandardMaterial as ED,MeshBasicMaterial as lh,MeshNormalMaterial as kD,MeshMatcapMaterial as DD,DoubleSide as OD,NormalBlending as LD,Box3 as Au,Vector3 as go,Matrix4 as ID,MathUtils as Ru}from"three";import{SkeletonUtils as pS}from"three-stdlib";import{Color as Cu,FrontSide as TD,NormalBlending as cS}from"three";function uS(e,t,r,n){let i=Zr(t),o=vc(r,i),a=ly(n,t),s=cy(n,t),l=uy(n,t);return a||s||l?yc(e.userData,t,o,r,a??[0,0],s??1,l??0):(xc(e.userData,t),o)}function Jt(e,t,r,n){if(!r){xc(e.userData,t);return}let i=Ec[t];e[i]=uS(e,t,r,n)}function Pu(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 Cu(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??cS,e.depthWrite=e.userData.baseDepthWrite??!0,e.side=e.userData.baseSide??TD,e.normalMap=e.userData.baseNormalMap??null,e.normalScale.copy(ms(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(ms(e.userData.baseClearcoatNormalScale)),e.sheen=e.userData.baseSheen??e.sheen,e.sheenColor.copy(e.userData.baseSheenColor??new Cu(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 Cu("#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 Cu("#ffffff")),e.specularColorMap=e.userData.baseSpecularColorMap??null,e.flatShading=e.userData.baseFlatShading??e.flatShading,e.envMapIntensity=e.userData.baseEnvMapIntensity??e.envMapIntensity;let n=At(t,"texture"),i=At(t,"metalnessMap"),o=At(t,"roughnessMap"),a=At(t,"emissiveMap"),s=At(t,"alphaMap"),l=At(t,"normalMap"),c=At(t,"bumpMap"),d=At(t,"aoMap"),m=At(t,"displacementMap"),u=At(t,"clearcoatMap"),h=At(t,"clearcoatRoughnessMap"),p=At(t,"clearcoatNormalMap"),g=At(t,"anisotropyMap"),b=At(t,"transmissionMap"),w=At(t,"thicknessMap"),f=At(t,"sheenColorMap"),y=At(t,"sheenRoughnessMap"),S=At(t,"specularIntensityMap"),M=At(t,"specularColorMap");if(n?(e.map=uS(e,"texture",n,t),e.color.set(r??"#ffffff"),e.vertexColors=!1):(xc(e.userData,"texture"),r&&(e.map=null,e.color.set(r),e.vertexColors=!1)),Jt(e,"metalnessMap",i,t),t?.metalness!==void 0&&(e.metalness=t.metalness),Jt(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),Jt(e,"emissiveMap",a,t),t?.opacity!==void 0&&(e.opacity=t.opacity),Jt(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=py(t.blendingMode),e.depthWrite=t.blendingMode!=="additive"),t?.side&&(e.side=dy(t.side)),Jt(e,"normalMap",l,t),l||t?.normalScale!==void 0){let x=t?.normalScale??Math.abs(ms(e.userData.baseNormalScale).x);e.normalScale.set(x,t?.flipNormalY?-x:x)}if(Jt(e,"bumpMap",c,t),t?.bumpScale!==void 0&&(e.bumpScale=t.bumpScale),Jt(e,"aoMap",d,t),t?.aoMapIntensity!==void 0&&(e.aoMapIntensity=t.aoMapIntensity),Jt(e,"displacementMap",m,t),t?.displacementScale!==void 0&&(e.displacementScale=t.displacementScale),t?.displacementBias!==void 0&&(e.displacementBias=t.displacementBias),Jt(e,"clearcoatMap",u,t),t?.clearcoat!==void 0&&(e.clearcoat=t.clearcoat),Jt(e,"clearcoatRoughnessMap",h,t),t?.clearcoatRoughness!==void 0&&(e.clearcoatRoughness=t.clearcoatRoughness),Jt(e,"clearcoatNormalMap",p,t),p||t?.clearcoatNormalScale!==void 0){let x=t?.clearcoatNormalScale??Math.abs(ms(e.userData.baseClearcoatNormalScale).x);e.clearcoatNormalScale.set(x,t?.flipClearcoatNormalY?-x:x)}t?.sheen!==void 0&&(e.sheen=t.sheen),t?.sheenColor&&e.sheenColor.set(t.sheenColor),Jt(e,"sheenColorMap",f,t),t?.sheenRoughness!==void 0&&(e.sheenRoughness=t.sheenRoughness),Jt(e,"sheenRoughnessMap",y,t),t?.anisotropy!==void 0&&(e.anisotropy=t.anisotropy),t?.anisotropyRotation!==void 0&&(e.anisotropyRotation=t.anisotropyRotation),Jt(e,"anisotropyMap",g,t),t?.transmission!==void 0&&(e.transmission=t.transmission),Jt(e,"transmissionMap",b,t),t?.thickness!==void 0&&(e.thickness=t.thickness),Jt(e,"thicknessMap",w,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),Jt(e,"specularIntensityMap",S,t),t?.specularColor&&e.specularColor.set(t.specularColor),Jt(e,"specularColorMap",M,t),e.transparent=e.opacity<1||e.transmission>0||e.blending!==cS||!!((s||e.alphaMap)&&e.alphaTest<=0),e.transparent||(e.depthWrite=!0)}function Fs(e){return e.material}function hn(e,t){return Array.isArray(e)?e.map(t):t(e,0)}function wr(e,t){Array.isArray(e)?e.forEach(t):t(e,0)}function Tu(e,t){return Array.isArray(e)?e[t]:e}import{jsx as ku,jsxs as jD}from"react/jsx-runtime";function Eu(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(Vs(t?.position??n.position.toArray(),[e.rotation.x,e.rotation.y,e.rotation.z],e.scale.toArray(),t?.pivot,n.rotation.order,t?.shear)),eo(e,t?.shear))}function Ut(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 ma(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===LD&&t.alphaToCoverage!==!0;return[Ut(t.map),Ut(t.aoMap),Ut(t.lightMap),Ut(t.bumpMap),Ut(t.normalMap,!0),t.normalMap?t.normalMapType:"",Ut(t.displacementMap),Ut(t.emissiveMap),Ut(t.metalnessMap),Ut(t.roughnessMap),i,Ut(i?t.anisotropyMap:null),r,Ut(r?t.clearcoatMap:null),Ut(r?t.clearcoatNormalMap:null,!0),Ut(r?t.clearcoatRoughnessMap:null),n,Ut(n?t.sheenColorMap:null),Ut(n?t.sheenRoughnessMap:null),Ut(t.specularColorMap),Ut(t.specularIntensityMap),o,Ut(o?t.transmissionMap:null),Ut(o?t.thicknessMap:null),Ut(t.alphaMap),Number(t.alphaTest)>0,!!t.alphaHash,!!t.flatShading,!!t.dithering,!!t.vertexColors,t.side,a].join("|")}var BD={};function Us({url:e,objectBindings:t,selectedItem:r,itemMaterials:n,interactive:i=!0,onItemClick:o,onItemHover:a,onItemDoubleClick:s,onItemContextMenu:l,onModelLoaded:c,onAnimationsReady:d,nodeRefsOut:m,onNodeRefsChange:u,materialRefsOut:h,panelHoveredItem:p,sceneConfig:g,zoomOnSelected:b=!0,highlightOnHover:w=!0,decoderConfig:f,modelFormat:y,onLoadProgress:S,explodeFactor:M=0,suspendBindingTransforms:x=!1,originalNodePoses:C,mergeModels:A,onMergeModelLoaded:P,onMergeModelError:_,pulses:R=BD}){let k=gs(e,f,y,S),T=dS(I=>I.invalidate),[L,F]=sh(null),j=Gt(null),{setCanvasCursor:V,restoreCanvasCursor:E}=qy();tt(()=>{(!i||!w)&&(F(null),a?.(null),E())},[i,w,a,E]);let O=Dt(()=>{let I=pS.clone(k.scene),N=hs(k.scene);return N&&xy(I,N),Bm(I),I},[k.scene]),{rootsByUrl:Z,revision:ee,onSourceReady:J}=oS(O,A,P),U=Gt(new Map),[Q,q]=sh(0),G=_D((I,N,B)=>{J(I,N),U.current.get(I)!==B&&(U.current.set(I,B),q(W=>W+1))},[J]);tt(()=>{let I=new Set(A?.map(B=>B.url)),N=!1;for(let B of U.current.keys())I.has(B)||(U.current.delete(B),N=!0);N&&q(B=>B+1)},[A]);let H=Dt(()=>ui(O),[O,ee]),se=H.nodesById,{originalMaterials:ve,ownMeshes:Ne}=Dt(()=>{let I=new WeakMap,N=new WeakSet;return O.traverse(B=>{Qt(B)&&(I.set(B,B.material),N.add(B))}),{originalMaterials:I,ownMeshes:N}},[O]);Dt(()=>{O.traverse(I=>{Qt(I)&&!ve.has(I)&&ve.set(I,I.material)})},[O,ee,ve]);let $=k.materialVariants,Te=(g?En(g.model):[]).join(`
|
|
62
|
-
`),[we,pt]=sh(null);tt(()=>{let I=Te?Te.split(`
|
|
63
|
-
`):[],N=[];for(let W of I){let ue=$?$.names.indexOf(W):-1;if(ue>=0){N.push(ue);continue}console.warn(`[react-immersive] The model has no material variant "${W}".`+($?` Its variants are: ${$.names.join(", ")}.`:" It has no material variants."))}if(!$||N.length===0){pt(null);return}let B=!1,Y=[];return O.traverse(W=>{if(!Qt(W)||!Ne.has(W))return;let ue=Hv(Gv(W),N);ue!==null&&Y.push($.resolveMaterial(ue,W).then(ge=>[W,ge]))}),Promise.all(Y).then(W=>{B||pt({scene:O,key:Te,materials:new Map(W)})}).catch(W=>{B||console.warn(`[react-immersive] Material variants "${I.join('", "')}" failed to load.`,W)}),()=>{B=!0}},[O,Ne,$,Te]);let te=we?.scene===O?we.materials:void 0,_t=I=>te?.get(I)??ve.get(I)??Fs(I);tt(()=>{H.duplicateNames.size!==0&&console.warn("[react-immersive] Duplicate model node names were assigned unique binding IDs.",Object.fromEntries(H.duplicateNames))},[H]);let ne=Dt(()=>new WeakMap,[O]),De=Dt(()=>{let I=new WeakMap;if(O.traverse(N=>{let B=ne.get(N);B||(B={position:N.position.clone(),rotation:N.rotation.clone(),scale:N.scale.clone()},ne.set(N,B)),I.set(N,{position:B.position.clone(),rotation:B.rotation.clone(),scale:B.scale.clone()})}),C)for(let[N,B]of Object.entries(C)){let Y=se[N],W=Y&&I.get(Y);W&&(W.position.fromArray(B.position),B.rotation&&W.rotation.set(B.rotation[0],B.rotation[1],B.rotation[2],W.rotation.order),B.scale&&W.scale.fromArray(B.scale))}return I},[O,se,C,ne]);tt(()=>{let I=!1,N=null,B=null,Y=window,W=Object.entries(se).filter(([,mt])=>Qt(mt)),ue=new Au,ge=[],vt=0;O.traverse(mt=>{!Qt(mt)||mt.userData[oo]||(mt.castShadow=!1,mt.receiveShadow=!0)});let rt=()=>{if(I)return;let mt=new Set,or=ue.getSize(new go),Pe=new go;for(let{name:zt,box:Yt}of ge)Yt.getSize(Pe),Pe.x>or.x*.7&&Pe.z>or.z*.7&&Pe.y>or.y*.4&&mt.add(zt);O.traverse(zt=>{if(!Qt(zt)||zt.userData[oo])return;let Yt=di(zt);zt.castShadow=!Yt||!mt.has(Yt),zt.receiveShadow=!0}),T()},st=()=>{I||(Y.requestIdleCallback?N=Y.requestIdleCallback(nt,{timeout:100}):B=window.setTimeout(()=>nt(),0))},nt=mt=>{if(N=null,B=null,I)return;let or=performance.now(),Pe=0;for(;vt<W.length&&!(Pe>0&&!(mt?mt.didTimeout?Pe<16:mt.timeRemaining()>1:performance.now()-or<8));){let[zt,Yt]=W[vt];vt+=1,Pe+=1;let Ir=new Au().setFromObject(Yt);Ir.isEmpty()||(ge.push({name:zt,box:Ir}),ue.union(Ir))}vt<W.length?st():rt()};return st(),()=>{I=!0,N!==null&&Y.cancelIdleCallback?.(N),B!==null&&window.clearTimeout(B)}},[T,se,O]),tt(()=>{Nc(O,{precise:!0})},[O,ee]),tt(()=>{let I=new AbortController;return Dc(O,I.signal),()=>{I.abort(),fs(O)}},[O,ee]);let Fe=Dt(()=>{let I={};for(let[N,B]of Object.entries(t))I[B.modelObjectId??N]=N;return I},[t]),ae=Dt(()=>Object.entries(t).map(([I,N])=>`${I}${N.modelObjectId??I}`).sort().join(""),[t]),qe=Dt(()=>Object.entries(t).map(([I,N])=>JSON.stringify([I,N.modelObjectId??I,N.transform??null])).sort().join(""),[t]),ze=Gt(new Map);tt(()=>{let I=new Map,N=new Map;for(let[W,ue]of Object.entries(t)){if(!ue.transform)continue;let ge=se[ue.modelObjectId??W];ge&&(I.set(ge,ue.transform),N.set(ge,mi(ge)))}let B=new Set([...ze.current.keys(),...I.keys()]);for(let W of B){Eu(W,void 0,De);for(let ue of mi(W))An(ue)}O.updateMatrixWorld(!0);let Y=new Map;for(let W of N.values())for(let ue of W)if(!Y.has(ue)){let ge=[];for(let vt=ue;vt;vt=vt.parent)ge.unshift(vt.matrix.clone());Y.set(ue,{world:ue.matrixWorld.clone(),transforms:ge})}for(let[W,ue]of I)Eu(W,ue,De);ze.current=I,O.updateMatrixWorld(!0);for(let[W,ue]of Y)Yo(W,ue.world,ue.transforms);T()},[O,se,De,qe,T]),tt(()=>()=>{for(let I of mi(O))An(I)},[O]);let pe=Dt(()=>{let I={};for(let[N,B]of Object.entries(t)){let Y=B.modelObjectId??N,W=se[Y];if(!Qt(W))continue;let ue=_t(W);ue&&(I[N]=hn(ue,ge=>{let vt=Lc(ge),rt=Ic(vt??new ED);return Bc(rt),rt}))}return I},[se,ae,ve,te]);tt(()=>(h&&(h.current=pe),()=>{h?.current===pe&&(h.current={})}),[pe,h]),tt(()=>()=>{for(let I of Object.values(pe))wr(I,N=>{Av(N.userData),N.dispose()})},[pe]);let _e=g?.model.shading??"lit",Be=g?.model.renderer??"pbr",Ye=g?.wireframe.enabled??!1,Nt=g?.wireframe.color??"#93c5fd",jt=g?.wireframe.opacity??1,ie=Dt(()=>{let I={};if(_e!=="unlit")return I;for(let[N,B]of Object.entries(pe))I[N]=hn(B,Y=>{let W=new lh;return W.color.copy(Y.color),W.map=Y.map,W.alphaMap=Y.alphaMap,W.alphaTest=Y.alphaTest,W.transparent=Y.transparent,W.opacity=Y.opacity,W.side=Y.side,W});return I},[pe,_e]),Ie=Dt(()=>{let I={};if(_e!=="normals")return I;for(let[N,B]of Object.entries(pe))I[N]=hn(B,()=>new kD);return I},[pe,_e]),je=Dt(()=>{let I={};if(_e!=="lit"||Be!=="matcap")return I;let N=wc();for(let[B,Y]of Object.entries(pe))I[B]=hn(Y,W=>{let ue=new DD;return ue.matcap=N,ue.color.copy(W.color),ue.alphaMap=W.alphaMap,ue.alphaTest=W.alphaTest,ue.side=W.side,ue});return I},[pe,_e,Be]);tt(()=>()=>{for(let I of Object.values(ie))wr(I,N=>N.dispose());for(let I of Object.values(Ie))wr(I,N=>N.dispose());for(let I of Object.values(je))wr(I,N=>N.dispose())},[ie,Ie,je]);let Mt=I=>_e==="normals"?Ie[I]:_e==="unlit"?ie[I]:Be==="matcap"?je[I]:pe[I],Ue=Gt(c);Ue.current=c,tt(()=>{Ue.current?.(O)},[O]);let re=Dt(()=>{let I={};for(let[N,B]of Object.entries(t)){let Y=B.modelObjectId??N,W=se[Y];W&&(I[N]=W)}return I},[se,ae]);tt(()=>(m.current=re,u?.(),()=>{m.current===re&&(m.current={})}),[re,m,u]);let oe=Gt({});tt(()=>()=>{for(let I of Object.values(oe.current))for(let[N,B]of Object.entries(I))B&&Rn(B,Zr(N));oe.current={}},[]);let le=Gt(new Map);tt(()=>()=>{le.current.clear()},[]);let Ee=Dt(()=>{let I=new Map;for(let[N,B]of Object.entries(t)){let Y=p===B||p?.id===B.id||p?.modelObjectId===B.modelObjectId,W=w&&(L===N||Y),ue=W||r===N;(W||ue)&&I.set(N,{emissive:W,matcap:ue})}return I},[t,w,L,r,p]),Oe=Gt(Ee);Oe.current=Ee,tt(()=>{let I=new Set;for(let[N,B]of Object.entries(t)){I.add(N);let Y=B.modelObjectId??N,W=se[Y];if(!Qt(W))continue;if(B.removed){W.parent&&(le.current.set(W,W.parent),W.parent.remove(W),O.dispatchEvent({type:"childremoved",child:W}));continue}let ue=le.current.get(W);ue&&(W.parent||(ue.add(W),O.dispatchEvent({type:"childadded",child:W})),le.current.delete(W)),W.visible=B.visible!==!1;let ge=pe[N];if(!ge)continue;if(Be!=="uv-checker"){let Pe=Mt(N);Pe&&(W.material=Pe)}if(B.visible===!1)continue;let vt=ie[N],rt=je[N],st=n[N]??n[B.modelObjectId??N],nt=B.style?.material,mt=oe.current[N]??{};for(let Pe of hi){let zt=At(nt,Pe),Yt=mt[Pe];if(Yt===zt)continue;let Ir=Zr(Pe);Yt&&Rn(Yt,Ir),zt?(Qo(zt,Ir,T),mt[Pe]=zt):delete mt[Pe]}Object.keys(mt).length>0?oe.current[N]=mt:delete oe.current[N];let or=st?.hex??nt?.baseColor;wr(ge,(Pe,zt)=>{let Yt=ma(Pe);Pu(Pe,nt,or);let Ir=Pe.userData.reactImmersiveConfiguredEmissive;Ir?.isColor?Ir.copy(Pe.emissive):Pe.userData.reactImmersiveConfiguredEmissive=Pe.emissive.clone();let Ba=Oe.current.get(N);Ba?.emissive&&Pe.emissive.add(to),Yt!==ma(Pe)&&(Pe.needsUpdate=!0);let pr=Tu(vt,zt);if(pr){let Na=ma(pr);pr.color.copy(Pe.color),pr.map=Pe.map,pr.vertexColors=Pe.vertexColors,pr.alphaMap=Pe.alphaMap,pr.alphaTest=Pe.alphaTest,pr.transparent=Pe.transparent,pr.opacity=Pe.opacity,pr.side=Pe.side,Na!==ma(pr)&&(pr.needsUpdate=!0)}let ar=Tu(rt,zt);if(ar){let Na=ma(ar);Ba?.matcap?ar.color.set(Ko.color):ar.color.copy(Pe.color),ar.map=Pe.map,ar.vertexColors=Pe.vertexColors,ar.alphaMap=Pe.alphaMap,ar.alphaTest=Pe.alphaTest,ar.transparent=Pe.transparent,ar.opacity=Pe.opacity,ar.side=Pe.side,Na!==ma(ar)&&(ar.needsUpdate=!0)}})}for(let N of Object.keys(oe.current))if(!I.has(N)){for(let[B,Y]of Object.entries(oe.current[N]))Y&&Rn(Y,Zr(B));delete oe.current[N]}T()},[t,se,pe,ie,Ie,je,n,_e,Be,T]);let Ot=Gt(new Map);tt(()=>{let I=Ot.current,N=new Set([...I.keys(),...Ee.keys()]),B=!1;for(let Y of N){let W=I.get(Y),ue=Ee.get(Y),ge=!!W?.emissive!=!!ue?.emissive,vt=!!W?.matcap!=!!ue?.matcap;if(!ge&&!vt)continue;B=!0;let rt=pe[Y],st=je[Y];rt&&wr(rt,(nt,mt)=>{let or=nt.userData.reactImmersiveConfiguredEmissive;ge&&or?.isColor&&(nt.emissive.copy(or),ue?.emissive&&nt.emissive.add(to));let Pe=Tu(st,mt);vt&&Pe&&(ue?.matcap?Pe.color.set(Ko.color):Pe.color.copy(nt.color))})}Ot.current=Ee,B&&T()},[Ee,pe,je,T]),q0({objectBindings:t,nodeMap:se,invalidate:T});let qt=Dt(()=>Object.entries(R).map(([I,N])=>({key:I,color:new RD(N.color),speed:N.speed})),[R]),Rt=Gt(new Set);tt(()=>{let I=new Set(qt.map(({key:N})=>N));for(let N of Rt.current){if(I.has(N)||!pe[N])continue;let B=Oe.current.get(N)?.emissive;wr(pe[N],Y=>{let W=Y.userData.reactImmersiveConfiguredEmissive;W?.isColor&&(Y.emissive.copy(W),B&&Y.emissive.add(to))})}Rt.current=I,T()},[qt,pe,T]),_u(({clock:I})=>{if(qt.length===0)return;let N=I.getElapsedTime();for(let{key:B,color:Y,speed:W}of qt){let ue=pe[B];if(!ue)continue;let ge=(1-Math.cos(2*Math.PI*W*N))/2,vt=Oe.current.get(B)?.emissive;wr(ue,rt=>{let st=rt.userData.reactImmersiveConfiguredEmissive;st?.isColor&&(rt.emissive.copy(st).lerp(Y,ge),vt&&rt.emissive.add(to))})}T()}),tt(()=>{if(Be==="uv-checker")return;let I=new Set(Object.values(re)),N=!1;O.traverse(B=>{if(!Qt(B)||I.has(B)||!ve.has(B))return;let Y=te?.get(B)??ve.get(B);B.material!==Y&&(B.material=Y,N=!0)}),N&&T()},[O,re,ve,te,Be,T]),tt(()=>{if(Be!=="uv-checker")return;let I=Rv(),N=[];return O.traverse(B=>{if(!Qt(B)||B.userData[oo])return;let Y=B.material,W=Array.isArray(Y)?Y:[Y],ue=!!B.geometry.getAttribute("uv"),ge=W.map((rt,st)=>{let nt=new lh({color:ue?"#ffffff":"#ff00ff",map:ue?I:null,side:rt.side});return nt.name=`${B.name||"mesh"}-uv-checker-${st}`,nt.toneMapped=!1,nt}),vt=Array.isArray(Y)?ge:ge[0];B.material=vt,N.push({node:B,original:Y,diagnostic:vt})}),T(),()=>{for(let{node:B,original:Y,diagnostic:W}of N){B.material=Y;let ue=Array.isArray(W)?W:[W];for(let ge of ue)ge.dispose()}T()}},[O,Be,T,ee]),tt(()=>{if(!Ye)return;let I=[];for(let[N,B]of Object.entries(t)){let Y=B.modelObjectId??N,W=se[Y];if(!Qt(W))continue;let ue=new lh({color:Nt,wireframe:!0,transparent:!0,opacity:jt,depthTest:!1,depthWrite:!1,side:OD,toneMapped:!1}),ge=W.clone(!1);ge.name="",ge.position.set(0,0,0),ge.quaternion.identity(),ge.scale.set(1,1,1),ge.matrix.identity(),ge.matrixAutoUpdate=!0,ge.material=ue,ge.castShadow=!1,ge.receiveShadow=!1,ge.frustumCulled=!1,ge.renderOrder=1,ge.userData={isWireframeOverlay:!0},ge.raycast=()=>{},W.morphTargetInfluences&&(ge.morphTargetInfluences=W.morphTargetInfluences),W.add(ge),I.push({node:W,overlay:ge})}return T(),()=>{for(let{node:N,overlay:B}of I)N.remove(B),B.material.dispose()}},[Ye,Nt,jt,se,t,T]);let gt=Dt(()=>{let I=Array.from(U.current.values()).flat();return fy([...k.animations,...I])},[k.animations,Q]);tt(()=>{O.animations=gt.map(({clip:I})=>I)},[O,gt]);let rr=Gt(d);rr.current=d;let kt=Gt(g);kt.current=g;let Xt=dS(I=>I.frameloop==="never"),$t=Gt(Xt);$t.current=Xt;let Ke=Gt(null),Qe=Gt(null),bt=Gt(new Set),_r=Gt(0),Wr=I=>{bt.current.forEach(N=>N({...I,isRenderPaused:$t.current}))};tt(()=>{let I=hy({root:O,clips:gt,getClipConfig:B=>my(kt.current,B),onChange:()=>{Wr(I.getState()),Nc(O),T()}});Ke.current=I,Qe.current={clips:gt.map(({sourceName:B})=>B),clipDetails:gt.map(({sourceName:B,duration:Y})=>({sourceName:B,duration:Y})),play:I.play,pause:I.pause,stop:I.stop,setSpeed:I.setSpeed,seek:I.seek,getState:()=>({...I.getState(),isRenderPaused:$t.current}),subscribe:B=>(bt.current.add(B),B({...I.getState(),isRenderPaused:$t.current}),()=>{bt.current.delete(B)})},Wr(I.getState());let N=kt.current?.animations.autoplayClip;return N&&I.play(N),()=>{I.dispose(),Ke.current=null,Qe.current=null,Wr(I.getState())}},[O,gt]),tt(()=>{Ke.current&&Wr(Ke.current.getState())},[Xt]);let Sn=!!d;tt(()=>{Sn&&Qe.current&&rr.current?.(Qe.current)},[O,gt,Sn,i]),tt(()=>{g?.animations&&Ke.current?.applyClipConfigs()},[g?.animations]),_u((I,N)=>{let B=Ke.current;if(B?.isRunning()){if(B.update(N),!x)for(let[Y,W]of ze.current)Eu(Y,W,De);_r.current+=N,Nc(O,{updateFallbacks:_r.current>=.066}),T(),_r.current>=.066&&(_r.current=0,Wr(B.getState()))}});let nr=Dt(()=>(g?.model.rotation??[0,0,0]).map(I=>I*Math.PI/180),[g?.model.rotation]);_u((I,N)=>{if(!j.current)return;let B=j.current.rotation;B.x=Ru.lerp(B.x,nr[0],1-Math.exp(-5*N)),B.y=Ru.lerp(B.y,nr[1],1-Math.exp(-5*N)),B.z=Ru.lerp(B.z,nr[2],1-Math.exp(-5*N)),Math.abs(B.x-nr[0])<1e-4&&Math.abs(B.y-nr[1])<1e-4&&Math.abs(B.z-nr[2])<1e-4||T()});let Jn=Gt([]),Ia=Gt(0),Mn=Gt(0),Zn=Dt(()=>new go,[]);tt(()=>{let I=new Map;for(let[rt,st]of Object.entries(t)){let nt=se[st.modelObjectId??rt];nt&&I.set(nt,st)}for(let rt of Jn.current)Eu(rt.node,I.get(rt.node)?.transform,De);Mn.current=0,O.updateWorldMatrix(!0,!0);let N=new Au().setFromObject(O),B=N.getCenter(new go),Y=N.getSize(new go).length()*.5;Ia.current=Number.isFinite(Y)?Y:0;let W=[...I.keys()],ue=new Set(W),ge=[],vt=new go;for(let rt of W){if(!rt.parent)continue;let st=rt.parent,nt=!1;for(;st;){if(ue.has(st)){nt=!0;break}st=st.parent}if(nt)continue;let mt=new Au().setFromObject(rt);if(mt.isEmpty())continue;mt.getCenter(vt);let or=vt.clone().sub(B);or.lengthSq()<1e-8||(or.normalize(),ge.push({node:rt,restLocalPos:rt.position.clone(),restWorldPos:rt.getWorldPosition(new go),worldDir:or,parentInverse:new ID().copy(rt.parent.matrixWorld).invert()}))}Jn.current=ge,T()},[O,se,ae,qe,De,T]),tt(()=>{T()},[M,T]),_u((I,N)=>{let B=Jn.current;if(B.length===0)return;let Y=Math.min(Math.max(M,0),1),W=Mn.current;if(Math.abs(W-Y)<1e-4){if(W===Y)return;Mn.current=Y}else Mn.current=Ru.lerp(W,Y,1-Math.exp(-6*N)),T();let ue=Mn.current*Ia.current;for(let ge of B)Zn.copy(ge.worldDir).multiplyScalar(ue).add(ge.restWorldPos).applyMatrix4(ge.parentInverse),ge.node.position.copy(Zn),ge.node.matrixAutoUpdate||(ge.node.matrix.setPosition(ge.node.position),ge.node.matrixWorldNeedsUpdate=!0)});let nn=I=>{if(!Oc(I))return null;let N=I;for(;N;){let B=di(N),Y=B?Fe[B]:void 0;if(Y&&t[Y]){let W=t[Y];return W.visible===!1?null:[Y,W]}N=N.parent}return null},ko=I=>{let N=nn(I);if(!N)return null;let[B,Y]=N;return se[Y.modelObjectId??B]??null},ei=Wc(I=>{let N=nn(I);return N&&N[1].selectable!==!1?N[1]:null},i?l:void 0,ko),_l=I=>{if(ei.consumeClick())return;let N=nn(I.object);if(!N)return;let[,B]=N;B.selectable!==!1&&(I.stopPropagation(),o(B,ra(I,ko(I.object))))},Ld=I=>{let N=nn(I.object);if(!N)return;let[,B]=N;if(B.selectable===!1)return;s?.(B,ra(I,ko(I.object)))&&I.stopPropagation()},Bi=I=>{if(!w)return;let N=nn(I.object);if(!N)return;let[B,Y]=N;Y.hoverable!==!1&&(I.stopPropagation(),V("pointer"),F(B),a?.(Y))},Do=I=>{w&&(I.stopPropagation(),E(),F(null),a?.(null))},Id=Dt(()=>!My(O),[O,ee]);return tt(()=>{let I=Te&&(we?.scene!==O||we.key!==Te),N=A?.some(B=>!Z[B.url]||Z[B.url].parent!==O);return tm(O,I?"Wait for the selected material variants to finish loading before preparing AR.":N?"Wait for all merged models to finish loading before preparing AR.":Be!=="pbr"?"Switch the model renderer to PBR before preparing a USDZ snapshot, or provide arHandoff.createUSDZ.":void 0),()=>tm(O)},[O,we,Te,A,Z,ee,Be]),jD("group",{ref:j,children:[ku("primitive",{object:O,...i&&Id?{onClick:_l,onDoubleClick:Ld,...l?{onPointerDown:ei.onPointerDown}:{},...w?{onPointerOver:Bi,onPointerOut:Do}:{}}:{}}),A?.map(I=>ku(pn,{onLoadError:N=>_?.(I.url,N),children:ku(AD,{fallback:null,children:ku(ND,{url:I.url,namePrefix:I.namePrefix,decoderConfig:f,onReady:G})})},I.url))]})}function ND({url:e,namePrefix:t,decoderConfig:r,onReady:n}){let i=gs(e,r),o=Dt(()=>{let l=pS.clone(i.scene);return av(l,t),Bm(l),l},[i.scene,t]),a=Dt(()=>i.animations.map(l=>sv(l,t)),[i.animations,t]),s=Gt(n);return s.current=n,tt(()=>{s.current(e,o,a)},[e,o,a]),null}import{Suspense as zD,useEffect as VD,useRef as FD}from"react";import{jsx as Du}from"react/jsx-runtime";function UD({url:e,decoderConfig:t,onModelLoaded:r}){let{scene:n}=gs(e,t),i=FD(r);return i.current=r,VD(()=>{i.current?.(n)},[n]),Du("primitive",{object:n})}function mS({url:e,decoderConfig:t,onLoadError:r,onModelLoaded:n}){return Du(pn,{onLoadError:i=>r?.(e,i),children:Du(zD,{fallback:null,children:Du(UD,{url:e,decoderConfig:t,onModelLoaded:n})})})}import{Suspense as GD,useCallback as hS,useMemo as HD,useRef as fS}from"react";import{jsx as Ou}from"react/jsx-runtime";var WD={};function gS({entry:e,isActive:t,decoderConfig:r,itemMaterials:n,sceneConfig:i,zoomOnSelected:o,highlightOnHover:a,explodeFactor:s,suspendBindingTransforms:l,onLoadProgress:c,onAnimationsReady:d,onModelAnimationsReady:m,onLoadError:u,onModelLoaded:h,selectedItem:p,panelHoveredItem:g,onItemClick:b,onItemDoubleClick:w,onItemContextMenu:f,onItemHover:y,nodeRefsOut:S,onNodeRefsChange:M,materialRefsOut:x,onMergeModelLoaded:C,onMergeModelError:A,pulses:P}){let _=fS({}),R=fS({}),k=hS(()=>{},[]),T=HD(()=>t?null:ps(e.objectBindings,e.sceneConfig?.product,En((e.sceneConfig??i)?.model??{})),[t,e.objectBindings,e.sceneConfig,i]),L=e.sceneConfig?.product&&T?{...e.sceneConfig,model:{...e.sceneConfig.model,activeVariants:T.activeVariants}}:e.sceneConfig??i,F=hS(V=>{t&&d?.(V),m?.(Le(e),V)},[t,d,m,e.url,e.id]),j=!!d||!!m;return Ou(pn,{onLoadError:V=>u?.(Le(e),V),children:Ou(GD,{fallback:null,children:Ou("group",{position:e.transform?.position,rotation:e.transform?.rotation,scale:e.transform?.scale,visible:e.visible!==!1,children:Ou(Us,{url:e.url,interactive:t&&e.visible!==!1,objectBindings:t?e.objectBindings:T?.objectBindings??e.objectBindings,selectedItem:t?p:null,itemMaterials:t?n:WD,onItemClick:t?b:k,onItemDoubleClick:t?w:void 0,onItemContextMenu:t?f:void 0,onItemHover:t?y:void 0,onModelLoaded:h?V=>h(Le(e),V):void 0,onAnimationsReady:j?F:void 0,nodeRefsOut:t?S:_,onNodeRefsChange:t?M:void 0,materialRefsOut:x??R,panelHoveredItem:t?g:void 0,sceneConfig:t?i:L,zoomOnSelected:t&&o,highlightOnHover:t&&!!a,decoderConfig:r,onLoadProgress:t?c:void 0,explodeFactor:s,suspendBindingTransforms:t?l:!1,originalNodePoses:e.originalNodePoses,mergeModels:e.mergeModels,onMergeModelLoaded:C,onMergeModelError:A,pulses:t?P:void 0})})})},e.url)}import{useCallback as Ri,useEffect as Ei,useMemo as rI,useRef as ur,useState as Zh}from"react";import{useFrame as nI,useThree as iI}from"@react-three/fiber";import{Box3 as _S,BoxGeometry as cO,Group as PS,Matrix4 as AS,Mesh as uO,MeshBasicMaterial as dO,Vector3 as Vn}from"three";import{Euler as qD,Matrix4 as bo,MeshBasicMaterial as XD,MeshMatcapMaterial as $D,MeshNormalMaterial as YD,MeshStandardMaterial as KD,Quaternion as QD,Vector3 as Hs}from"three";function xS(e){let t={};for(let[r,n]of Object.entries(e))t[n.modelObjectId??r]=r;return t}function dh(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 wS(e,t){return e||(t?t.modelObjectId??t.id:null)}function ph(e,t){let r=dh(e);if(!r)return null;let n=t.keyByModelObject[r]??r,i=t.objectBindings[n];return i?{key:n,binding:i}:null}function mh(e,t,r){if(!Oc(e))return null;let n=ph(e,t);return!n||n.binding.visible===!1||(r==="select"?n.binding.selectable:n.binding.hoverable)===!1?null:n}function SS(e,t,r,n){for(let i of e){if(i.eventObject!==t)continue;let o=mh(i.object,r,n);if(o)return o}return null}var ha=new Hs,ch=new Hs,JD=new bo,bS=new bo,Gs=new bo,ZD=new bo,Lu=new bo,eO=new bo,tO=new bo,vS=new Hs,yS=new Hs,Mi=new Hs,uh=new QD,rO=new qD;function nO(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}bS.compose(t.position,uh.setFromEuler(t.rotation),t.scale);let s=r?.rotation;Gs.compose(vS.fromArray(Vs(r?.position??[0,0,0],s??[0,0,0],r?.scale??[1,1,1],r?.pivot,"XYZ",r?.shear)),uh.setFromEuler(rO.set(s?.[0]??0,s?.[1]??0,s?.[2]??0)),yS.fromArray(r?.scale??[1,1,1])),r?.shear&&Gs.makeRotationFromQuaternion(uh).multiply(cs(r.shear)).scale(yS).setPosition(vS),Gs.premultiply(n).multiply(ZD.copy(n).invert()),e.parent?.updateWorldMatrix(!0,!1);let l=e.parent?.matrixWorld??JD;if(Lu.multiplyMatrices(l,bS).premultiply(Gs),a&&i){let c=e;for(;c.parent&&!c.userData.ri_name;)c=c.parent;let d=c.userData.ri_center;Array.isArray(d)&&d.length===3?Mi.fromArray(d).applyMatrix4(n).applyMatrix4(Gs):Mi.setFromMatrixPosition(Lu),Mi.sub(i.centre),Mi.lengthSq()>1e-8&&(Mi.normalize().multiplyScalar(i.factor*i.radius),Lu.premultiply(tO.makeTranslation(Mi.x,Mi.y,Mi.z)))}e.matrixAutoUpdate=!1,e.matrix.multiplyMatrices(eO.copy(l).invert(),Lu),e.matrixWorldNeedsUpdate=!0,e.updateWorldMatrix(!1,!1)}function Iu(e,t){if(!Qt(e)&&!e.userData.riLogicalObject)return;let r=ph(e,t);if(!r)return;let n=MS(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){nO(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(Vs(e.position.toArray(),[e.rotation.x,e.rotation.y,e.rotation.z],e.scale.toArray(),o?.pivot,i.rotation.order,o?.shear)),eo(e,o?.shear);let a=t.explode;if(a&&a.factor>0&&a.radius>0){e.updateWorldMatrix(!0,!1),ch.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?ha.fromArray(l).applyMatrix4(e.matrixWorld).sub(a.centre):ha.copy(ch).sub(a.centre),ha.lengthSq()>1e-8&&(ha.normalize().multiplyScalar(a.factor*a.radius).add(ch),e.parent&&e.parent.worldToLocal(ha),e.position.copy(ha))}eo(e,o?.shear),e.updateWorldMatrix(!0,!1)}function fa(e,t){e.traverse(r=>Iu(r,t))}function MS(e){var t;return(t=e.userData).riVisuals??(t.riVisuals={}),e.userData.riVisuals}function iO(e,t,r,n){return JSON.stringify([e?.style?.material??null,t??null,r.shadingMode,r.rendererMode,n])}function oO(e){if(e.textures){for(let t of hi){let r=e.textures[t];r&&Rn(r,Zr(t))}e.textures=void 0}}function aO(e,t,r){let n=e.textures??{};for(let i of hi){let o=At(t,i),a=n[i];if(a===o)continue;let s=Zr(i);a&&Rn(a,s),o?(Qo(o,s,r),n[i]=o):delete n[i]}e.textures=Object.keys(n).length>0?n:void 0}function sO(e,t){if(t.shadingMode==="normals")return hn(e,()=>new YD);if(t.shadingMode==="unlit")return hn(e,r=>{let n=new XD;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=wc();return hn(e,n=>{let i=new $D;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 lO(e,t){if(!Qt(e))return;let n=MS(e);n.original??(n.original=Fs(e));let i=ph(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,Iu(e,t);let s=t.itemMaterials?.[o]?.hex??t.itemMaterials?.[a.modelObjectId??o]?.hex,l=t.highlightOnHover!==!1&&o===t.hoveredKey,c=iO(a,s,t,l);if(n.signature===c&&n.display){e.material=n.display;return}let d=a.style?.material;if(aO(n,d,t.invalidate),!n.physical){let m=n.original??Fs(e);if(!m)return;n.physical=hn(m,u=>{let h=Lc(u),p=Ic(h??new KD);return Bc(p),p})}wr(n.physical,m=>{Pu(m,d,s??d?.baseColor),l&&(m.emissive.add(to),m.color.lerp(Tv,_v)),m.needsUpdate=!0}),n.display&&n.display!==n.physical&&wr(n.display,m=>m.dispose()),n.display=sO(n.physical,t),n.signature=c,e.material=n.display}function CS(e,t){e.traverse(r=>lO(r,t))}function hh(e){e.traverse(t=>{if(!Qt(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&&wr(r.display,n=>n.dispose()),r.physical&&wr(r.physical,n=>n.dispose()),oO(r),delete t.userData.riVisuals)})}var RS=new AS().makeRotationX(Math.PI/2),TS=RS.clone().invert();function pO(e){let t=new Vn(e[0],e[1],e[2]),r=new Vn(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 _S(t.clone().sub(r),t.clone().add(r))}function mO(e){let t=e.getCenter(new Vn),r=e.getSize(new Vn).multiplyScalar(.5);return[t.x,t.y,t.z,r.x,0,0,0,r.y,0,0,0,r.z]}var Bu=class{constructor(){this.group=new PS;this.objects=new Map;this.geometry=new cO(1,1,1);this.material=new dO;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 _S(new Vn(...r.minimum),new Vn(...r.maximum)).applyMatrix4(TS),i=new PS;i.name=r.name,i.userData.ri_name=r.name,i.userData.riLogicalObject=!0,i.userData.ri_center=n.getCenter(new Vn).toArray();let o=new uO(this.geometry,this.material);o.visible=!1,o.raycast=()=>{},o.position.copy(n.getCenter(new Vn)),o.scale.copy(n.getSize(new Vn)),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||Iu(l,i);this.group.updateWorldMatrix(!0,!0);let s=[...this.objects].map(([l,c])=>`${l}:${c.matrix.elements.join(",")}`).join(";");if(s!==this.signature){this.signature=s,this.version++,this.transforms.clear();for(let[l,c]of this.objects)c.matrix.equals(new AS)||this.transforms.set(l,RS.clone().multiply(c.matrix).multiply(TS))}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=pO(i.box),a=o.clone(),s=1;for(let c of n.extras?.featureIds??[]){let d=this.transforms.get(c);d&&(a.union(o.clone().applyMatrix4(d)),s=Math.max(s,d.getMaxScaleOnAxis()))}let l=mO(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 fh=Object.freeze({factor:1,loosened:!1,tooFine:0,raisedAt:-1/0,changedAt:-1/0}),Ws=16,gh=1.25,hO=1.5,fO=1.25,gO=500,bO=3e3,ES=5e3,kS=2e3,vO=.9;function DS(e){return e.full&&(e.wanting||e.usage>1)}function OS(e){return e.loosened?bO:gO}function LS(e){let t=e.factor/fO;return t<=1+1e-6?1:t}function IS(e,t){return e.factor>1&&!e.loosened&&!t.full&&!t.wanting&&t.usage<vO&&LS(e)>e.tooFine}function BS(e,t){let{now:r}=t,n=t.moved&&e.tooFine>0?{...e,tooFine:0}:e;if(DS(t)){if(r-n.changedAt<OS(n))return n;let i=Math.max(n.tooFine,n.factor);return n.factor>=Ws?n.loosened&&n.tooFine===i?n:{...n,loosened:!0,tooFine:i,changedAt:r}:{factor:Math.min(Ws,n.factor*hO),loosened:!0,tooFine:i,raisedAt:r,changedAt:r}}return n.loosened&&!t.wanting?{...n,loosened:!1,changedAt:r}:IS(n,t)&&r-n.raisedAt>=ES&&r-n.changedAt>=kS?{...n,factor:LS(n),changedAt:r}:n}function NS(e,t){let{now:r}=t;return DS(t)?e.factor>=Ws&&e.loosened?null:Math.max(0,OS(e)-(r-e.changedAt)):e.loosened&&!t.wanting?0:IS(e,t)?Math.max(0,ES-(r-e.raisedAt),kS-(r-e.changedAt)):null}function FS(e){try{let t=typeof location<"u"?location.href:void 0;return new URL(e,t).origin}catch{return null}}function bh(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 ju,qs=(ju=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)})}},qp(ju,"pending",new Map),qp(ju,"session",null),ju),jS=2**30,Ys=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*jS,this.maxBytesSize=.4*jS,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:c,maxBytesSize:d}=this,m=n.length-o.size,u=n.length-a.size,h=Math.max(Math.min(n.length-t,m),0),p=this.cachedBytes-c,g=this.unloadPriorityCallback||this.defaultPriorityCallback,b=!1,w=h>0&&m>0||u&&n.length>r;if(m&&this.cachedBytes>c||u&&this.cachedBytes>d||w){n.sort((A,P)=>{let _=o.has(A);if(_===o.has(P)){let R=a.has(A);return R===a.has(P)?-g(A,P):R?1:-1}else return _?1:-1});let f=Math.max(t*e,h*e),y=Math.ceil(Math.min(f,m,h)),S=Math.max(e*p,e*c),M=Math.min(S,p),x=0,C=0;for(;this.cachedBytes-C>d||n.length-x>r;){let A=n[x],P=l.get(A)||0;if(o.has(A)&&a.has(A)||this.cachedBytes-C-P<d&&n.length-x<=r)break;C+=P,x++}for(;C<M||x<y;){let A=n[x],P=l.get(A)||0;if(o.has(A)||this.cachedBytes-C-P<c&&x>=y)break;C+=P,x++}n.splice(0,x).forEach(A=>{this.cachedBytes-=l.get(A)||0,s.get(A)(A),l.delete(A),i.delete(A),s.delete(A),a.delete(A),o.delete(A)}),b=x<h||C<p&&x<m,b&&(b=x>0)}b&&(this.unloadingHandle=qs.requestAnimationFrame(()=>this.scheduleUnload()))}scheduleUnload(){qs.cancelAnimationFrame(this.unloadingHandle),this.scheduled||(this.scheduled=!0,queueMicrotask(()=>{this.scheduled=!1,this.unloadUnusedContent()}))}},yO=class extends DOMException{constructor(){super("PriorityQueue: Item removed","AbortError")}},fn=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=>{qs.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 yO),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 c;try{c=a(o)}catch(d){l(d),i();continue}c instanceof Promise?c.then(s).catch(l).finally(i):(s(c),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))}},Uu=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,c)=>{l.running||this.originQueues.delete(c)});let i=e===null?null:FS(e),o=this.originQueues.get(i);o||(o=new fn,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 xo=6378137,xO=1/298.257223563,yh=6356752314245179e-9,Nu={inView:!1,error:1/0,distanceFromCamera:1/0};function Gu(e){return e===4||e===-1}function Fn(e,t){return Hu(e)&&e.traversal.lastFrameVisited===t&&e.traversal.used}function Hu(e){return!!e.traversal}function Ks(e){let{children:t}=e,r=t.length===0||Hu(t[t.length-1]),n=!e.internal.hasUnrenderableContent||Gu(e.internal.loadingState);return r&&n}function vo(e){return e.traversal.unconditionallyRefine}function Xs(e,t){if(Hu(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,Nu),e.traversal.inFrustum=Nu.inView,e.traversal.error=Nu.error,e.traversal.distanceFromCamera=Nu.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 vh(e,t,r=!1){if(Xs(e,t),r?t.markTileUsed(e):zu(e),vo(e)&&Ks(e)){let n=e.children;for(let i=0,o=n.length;i<o;i++)vh(n[i],t,r)}}function US(e,t){if(Xs(e,t),e.traversal.usedLastFrame&&(zu(e),e.traversal.wasSetActive&&(e.traversal.active=!0),(!e.traversal.active||vo(e))&&Ks(e))){let r=e.children;for(let n=0,i=r.length;n<i;n++)US(r[n],t)}}function zu(e){e.traversal.used=!0}function wO(e,t){return!(e.traversal.error<=t.errorTarget&&!vo(e)||t.maxDepth>0&&e.internal.depth+1>=t.maxDepth||!Ks(e))}function GS(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),GS(a,t))}}function zS(e){return!vo(e)&&(!e.internal.hasContent||Gu(e.internal.loadingState))}function HS(e,t){if(Xs(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(!wO(e,t)){zu(e);return}let n=!1,i=!1,o=e.children;for(let a=0,s=o.length;a<s;a++){let l=o[a];HS(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++)vh(o[a],t,!0);return}if(zu(e),e.refine==="REPLACE"&&n&&(t.loadSiblings||t.loadAncestors))for(let a=0,s=o.length;a<s;a++)vh(o[a],t)}function WS(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++)WS(n[s],t);let a=!0;for(let s=0,l=n.length;s<l;s++){let c=n[s];if(Fn(c,r)){let d=!vo(c),m=!c.internal.hasContent||Gu(c.internal.loadingState);d&&m||c.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&&Ks(e)}function qS(e,t){if(!Fn(e,t.frameCount))return;let r=e.children;if(e.refine==="REPLACE"&&t.loadAncestors&&!e.traversal.allChildrenLoaded&&!vo(e)&&(e.traversal.isLeaf=!0),e.traversal.isLeaf){if(!vo(e)&&(e.traversal.active=!0,Ks(e)&&e.internal.hasContent&&!Gu(e.internal.loadingState)))for(let i=0,o=r.length;i<o;i++)US(r[i],t);return}let n=r.length>0;for(let i=0,o=r.length;i<o;i++){let a=r[i];qS(a,t),Fn(a,t.frameCount)&&!(a.traversal.active&&zS(a))&&!a.traversal.allChildrenReady&&(n=!1)}e.traversal.allChildrenReady=n,e.refine==="REPLACE"&&!n&&e.traversal.wasSetActive&&zS(e)&&(e.traversal.active=!0,GS(e,t))}function XS(e,t){Xs(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||Hu(e)&&e.traversal.usedLastFrame){let n=!1,i=!1;r?(n=e.traversal.active,i=t.displayActiveTiles&&e.traversal.active||e.traversal.visible):Xs(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];XS(l,t)}}}function SO(e,t){HS(e,t),WS(e,t),qS(e,t),XS(e,t)}function MO(e){let t=null;return()=>{t===null&&(t=qs.requestAnimationFrame(()=>{t=null,e()}))}}function CO(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 VS=Symbol("PLUGIN_REGISTERED"),Ci={inView:!0,error:0,distance:1/0},PO=(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},TO=(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,_O=(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,ga=(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?TO(e,t):PO(e,t)},xh=new Ys;xh.unloadPriorityCallback=_O;var $s=new Uu;$s.maxJobsPerOrigin=25,$s.priorityCallback=ga;var Vu=new fn;Vu.maxJobs=5,Vu.priorityCallback=ga;var Fu=new fn;Fu.maxJobs=25,Fu.priorityCallback=(e,t)=>{let r=e.parent,n=t.parent;return r===n?0:r?n?ga(r,n):-1:1};var wh=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 fn){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=xh,this.downloadQueue=$s,this.parseQueue=Vu,this.processNodeQueue=Fu,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=MO(()=>{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[VS]===!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[VS]=!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&&CO(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(c=>c.loadRootTileset&&c.loadRootTileset()).then(c=>{let d=this.rootURL;d!==null&&this.invokeAllPlugins(m=>d=m.preprocessURL?m.preprocessURL(d,null):d),this.rootLoadingState=4,this.rootTileset=c,this.dispatchEvent({type:"needs-update"}),this.dispatchEvent({type:"load-tileset",tileset:c,url:d}),this.dispatchEvent({type:"load-root-tileset",tileset:c,url:d})}).catch(c=>{this.rootLoadingState=-1,console.error(c),this.rootTileset=null,this.dispatchEvent({type:"load-error",tile:null,error:c,url:this.rootURL})})),!n)return;let s=null;if(this.invokeAllPlugins(c=>{if(c.doTilesNeedUpdate){let d=c.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(c=>e.markUnused(c)),t.clear(),this.prepareForTraversal(),SO(n,this),this.removeUnusedPendingTiles();let l=this.queuedTiles;l.sort(e.unloadPriorityCallback);for(let c=0,d=l.length;c<d&&!e.isFull();c++)this.requestTileContents(l[c]);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&&(Ci.inView=!0,Ci.error=0,Ci.distance=1/0,s.calculateTileViewError(e,Ci)&&(i===null&&(i=!0),i&&(i=Ci.inView),Ci.inView&&(a=Math.min(a,Ci.distance),o=Math.max(o,Ci.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=bh(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(u=>n=u.preprocessURL?u.preprocessURL(n,e):n);let i=this.stats,o=this.lruCache,a=this.downloadQueue,s=this.parseQueue,l=this.loadingTiles,c=bh(n),d=new AbortController,m=d.signal;if(o.add(e,u=>{d.abort(),t?u.children.length=0:this.invokeAllPlugins(h=>{h.disposeTile&&h.disposeTile(u)}),i.inCache--,this.cachedSinceLoadComplete.has(e)&&(this.cachedSinceLoadComplete.delete(e),i.inCacheSinceLoad--),u.internal.loadingState===1?i.queued--:u.internal.loadingState===2?i.downloading--:u.internal.loadingState===3?i.parsing--:u.internal.loadingState===4&&i.loaded--,u.internal.loadingState=0,s.remove(u),a.remove(u),l.delete(u)}))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,u=>{if(m.aborted)return Promise.resolve();e.internal.loadingState=2,i.downloading++,i.queued--;let h=this.invokeOnePlugin(p=>p.fetchData&&p.fetchData(n,{...this.fetchOptions,signal:m}));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(u=>{if(!m.aborted){if(!(u instanceof Response))return u;if(u.ok)return c==="json"?u.json():u.arrayBuffer();throw Error(`Failed to load model with error code ${u.status}`)}}).then(u=>{if(!m.aborted)return i.downloading--,i.parsing++,e.internal.loadingState=3,s.add(e,h=>m.aborted?Promise.resolve():c==="json"&&u.root?(this.preprocessTileset(u,n,e),e.children.push(u.root),r=u,t=!0,Promise.resolve()):this.invokeOnePlugin(p=>p.parseTile&&p.parseTile(u,h,c,n,m)))}).then(()=>{if(m.aborted)return;i.parsing--,i.loaded++,e.internal.loadingState=4,l.delete(e),o.setLoaded(e,!0);let u=this.getBytesUsed(e);if(o.getMemoryUsage(e)===0&&u>0&&o.isFull()){o.remove(e);return}o.setMemoryUsage(e,u),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(u=>{m.aborted||(u.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(u),e.internal.loadingState=-1,l.delete(e),o.setLoaded(e,!0),this.dispatchEvent({type:"load-error",tile:e,error:u,url:n})))})}};function yo(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 AO=new TextDecoder;function $S(e){return AO.decode(e)}function Wu(e){return e.replace(/[\\/][^\\/]+$/,"")+"/"}var ba=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=Wu(e)),this.parse(t)))}resolveExternalURL(e){return new URL(e,this.workingPath).href}parse(e){throw Error("LoaderBase: Parse not implemented.")}};function Sh(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 Qs=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($S(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,c=o.byteOffset||0,d=o.type||n,m=o.componentType||r;if("type"in o&&n&&o.type!==n)throw Error("FeatureTable: Specified type does not match expected type.");let u=s+c,h=Sh(a,u,t,d,m,e);if(u+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)}},RO=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 Sh(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 c=this.parentIds[s+l];c!==e&&this.getDataFromId(c,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}},qu=class extends Qs{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 RO(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)}},Mh=class extends ba{parse(e){let t=new DataView(e),r=yo(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),c=new Qs(e.slice(28,28+o+a),0,o,a),d=28+o+a,m=new qu(e.slice(d,d+s+l),c.getData("BATCH_LENGTH"),0,s,l),u=d+s+l;return{version:n,featureTable:c,batchTable:m,glbBytes:new Uint8Array(e,u,i-u)}}},Ch=class extends ba{parse(e){let t=new DataView(e),r=yo(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),c=t.getUint32(28,!0),d=new Qs(e.slice(32,32+o+a),0,o,a),m=32+o+a,u=new qu(e.slice(m,m+s+l),d.getData("INSTANCES_LENGTH"),0,s,l),h=m+s+l,p=new Uint8Array(e,h,i-h),g=null,b=null,w=null;if(c)g=p,b=Promise.resolve();else{let f=this.resolveExternalURL($S(p));w=Wu(f),b=fetch(f,this.fetchOptions).then(y=>{if(!y.ok)throw Error(`I3DMLoaderBase : Failed to load file "${f}" with status ${y.status} : ${y.statusText}`);return y.arrayBuffer()}).then(y=>{g=new Uint8Array(y)})}return b.then(()=>({version:n,featureTable:d,batchTable:u,glbBytes:g,gltfWorkingPath:w}))}},Ph=class extends ba{parse(e){let t=new DataView(e),r=yo(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),c=new Qs(e.slice(28,28+o+a),0,o,a),d=28+o+a,m=new qu(e.slice(d,d+s+l),c.getData("BATCH_LENGTH")||c.getData("POINTS_LENGTH"),0,s,l);return Promise.resolve({version:n,featureTable:c,batchTable:m})}},Th=class extends ba{parse(e){let t=new DataView(e),r=yo(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 c=new DataView(e,s,12),d=yo(c),m=c.getUint32(4,!0),u=c.getUint32(8,!0),h=new Uint8Array(e,s,u);a.push({type:d,buffer:h,version:m}),s+=u}return{version:n,tiles:a}}};import{Box3 as uM,BufferAttribute as wo,BufferGeometry as EO,Clock as V5,Color as kO,DefaultLoadingManager as rd,Euler as DO,EventDispatcher as Xu,Frustum as OO,Group as Bh,InstancedMesh as LO,LoadingManager as IO,MathUtils as dM,Matrix3 as BO,Matrix4 as Zt,Mesh as F5,OrthographicCamera as U5,PerspectiveCamera as G5,Plane as NO,PlaneGeometry as H5,Points as jO,PointsMaterial as zO,Quaternion as pM,Ray as Nh,Raycaster as W5,ShaderMaterial as q5,Sphere as mM,Spherical as VO,TextureUtils as FO,Vector2 as jh,Vector3 as Ge}from"three";import{GLTFLoader as zh}from"three/addons/loaders/GLTFLoader.js";import{estimateBytesUsed as UO}from"three/addons/utils/BufferGeometryUtils.js";var Vh=class extends Mh{constructor(e=rd){super(),this.manager=e,this.adjustmentTransform=new Zt}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 zh(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 c=this.adjustmentTransform;s.parse(r,l,d=>{let{batchTable:m,featureTable:u}=t,{scene:h}=d,p=u.getData("RTC_CENTER",1,"FLOAT","VEC3");p&&(h.position.x+=p[0],h.position.y+=p[1],h.position.z+=p[2]),d.scene.updateMatrix(),d.scene.matrix.multiply(c),d.scene.matrix.decompose(d.scene.position,d.scene.quaternion,d.scene.scale),d.batchTable=m,d.featureTable=u,h.batchTable=m,h.featureTable=u,n(d)},i)})}};function GO(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 Js=new jh;function HO(e,t,r=new Ge){Js.set(e,t).divideScalar(256).multiplyScalar(2).subScalar(1),r.set(Js.x,Js.y,1-Math.abs(Js.x)-Math.abs(Js.y));let n=dM.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 YS={RGB:"color",POSITION:"position"},Fh=class extends Ph{constructor(e=rd){super(),this.manager=e}parse(e){return super.parse(e).then(async t=>{let{featureTable:r,batchTable:n}=t,i=new zO,o=r.header.extensions,a=new Ge,s;if(o&&o["3DTILES_draco_point_compression"]){let{byteOffset:d,byteLength:m,properties:u}=o["3DTILES_draco_point_compression"],h=this.manager.getHandler("draco.drc");if(h==null)throw Error("PNTSLoader: dracoLoader not available.");let p={};for(let w in u)if(w in YS&&w in u){let f=YS[w];p[f]=u[w]}let g={attributeIDs:p,attributeTypes:{position:"Float32Array",color:"Uint8Array"},useUniqueIDs:!0},b=r.getBuffer(d,m);s=await h.decodeGeometry(b,g),s.attributes.color&&(i.vertexColors=!0)}else{let d=r.getData("POINTS_LENGTH"),m=r.getData("POSITION",d,"FLOAT","VEC3"),u=r.getData("NORMAL",d,"FLOAT","VEC3"),h=r.getData("NORMAL",d,"UNSIGNED_BYTE","VEC2"),p=r.getData("RGB",d,"UNSIGNED_BYTE","VEC3"),g=r.getData("RGBA",d,"UNSIGNED_BYTE","VEC4"),b=r.getData("RGB565",d,"UNSIGNED_SHORT","SCALAR"),w=r.getData("CONSTANT_RGBA",d,"UNSIGNED_BYTE","VEC4"),f=r.getData("POSITION_QUANTIZED",d,"UNSIGNED_SHORT","VEC3"),y=r.getData("QUANTIZED_VOLUME_SCALE",d,"FLOAT","VEC3"),S=r.getData("QUANTIZED_VOLUME_OFFSET",d,"FLOAT","VEC3");if(s=new EO,f){let M=new Float32Array(d*3);for(let x=0;x<d;x++)for(let C=0;C<3;C++){let A=3*x+C;M[A]=f[A]/65535*y[C]}a.x=S[0],a.y=S[1],a.z=S[2],s.setAttribute("position",new wo(M,3,!1))}else s.setAttribute("position",new wo(m,3,!1));if(u!==null)s.setAttribute("normal",new wo(u,3,!1));else if(h!==null){let M=new Float32Array(d*3),x=new Ge;for(let C=0;C<d;C++){let A=h[C*2],P=h[C*2+1],_=HO(A,P,x);M[C*3]=_.x,M[C*3+1]=_.y,M[C*3+2]=_.z}s.setAttribute("normal",new wo(M,3,!1))}if(g!==null)s.setAttribute("color",new wo(g,4,!0)),i.vertexColors=!0,i.transparent=!0,i.depthWrite=!1;else if(p!==null)s.setAttribute("color",new wo(p,3,!0)),i.vertexColors=!0;else if(b!==null){let M=new Uint8Array(d*3);for(let x=0;x<d;x++){let C=GO(b[x]);for(let A=0;A<3;A++){let P=3*x+A;M[P]=C[A]}}s.setAttribute("color",new wo(M,3,!0)),i.vertexColors=!0}else if(w!==null){i.color=new kO(w[0],w[1],w[2]);let M=w[3]/255;M<1&&(i.opacity=M,i.transparent=!0,i.depthWrite=!1)}}let l=new jO(s,i);l.position.copy(a),t.scene=l,t.scene.featureTable=r,t.scene.batchTable=n;let c=r.getData("RTC_CENTER",1,"FLOAT","VEC3");return c&&(t.scene.position.x+=c[0],t.scene.position.y+=c[1],t.scene.position.z+=c[2]),t})}};function WO(e){let{x:t,y:r,z:n}=e;e.x=n,e.y=t,e.z=r}function qO(e){return-e+Math.PI/2}var KS=new VO,Pi=new Ge,br=new Ge,_h=new Ge,Vr=new Zt,gn=new Zt,Ah=new mM,Sr=new DO,QS=new Ge,JS=new Ge,ZS=new Ge,Zs=new Ge,$u=new Nh,XO=1e-12,$O=.1;var Uh=class{constructor(e=1,t=1,r=1){this.name="",this.radius=new Ge(e,t,r)}intersectRay(e,t){return Vr.makeScale(...this.radius).invert(),Ah.center.set(0,0,0),Ah.radius=1,$u.copy(e).applyMatrix4(Vr),$u.intersectSphere(Ah,t)?(Vr.makeScale(...this.radius),t.applyMatrix4(Vr),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,QS,JS,ZS),this.getCartographicToPosition(e,t,r,Zs),n.makeBasis(QS,JS,ZS).setPosition(Zs)}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,Vr),Sr.set(i,o,-n,"ZXY"),a.makeRotationFromEuler(Sr).premultiply(Vr),s===1?(Sr.set(Math.PI/2,0,0,"XYZ"),gn.makeRotationFromEuler(Sr),a.multiply(gn)):s===2&&(Sr.set(-Math.PI/2,0,Math.PI,"XYZ"),gn.makeRotationFromEuler(Sr),a.multiply(gn)),a}getCartographicFromObjectFrame(e,t,r=2){return r===1?(Sr.set(-Math.PI/2,0,0,"XYZ"),gn.makeRotationFromEuler(Sr).premultiply(e)):r===2?(Sr.set(-Math.PI/2,0,Math.PI,"XYZ"),gn.makeRotationFromEuler(Sr).premultiply(e)):gn.copy(e),Zs.setFromMatrixPosition(gn),this.getPositionToCartographic(Zs,t),this.getEastNorthUpFrame(t.lat,t.lon,0,Vr).invert(),gn.premultiply(Vr),Sr.setFromRotationMatrix(gn,"ZXY"),t.azimuth=-Sr.z,t.elevation=Sr.x,t.roll=Sr.y,t}getEastNorthUpAxes(e,t,r,n,i,o=Zs){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,Pi);let i=this.radius;br.copy(Pi),br.x*=i.x**2,br.y*=i.y**2,br.z*=i.z**2;let o=Math.sqrt(Pi.dot(br));return br.divideScalar(o),n.copy(br).addScaledVector(Pi,r)}getPositionToCartographic(e,t){this.getPositionToSurfacePoint(e,br),this.getPositionToNormal(br,Pi);let r=_h.subVectors(e,br);return t.lon=Math.atan2(Pi.y,Pi.x),t.lat=Math.asin(Pi.z),t.height=Math.sign(r.dot(e))*r.length(),t}getCartographicToNormal(e,t,r){return KS.set(1,qO(e),t),r.setFromSpherical(KS).normalize(),WO(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,c=a+s+l,d=Math.sqrt(1/c),m=br.copy(e).multiplyScalar(d);if(c<$O)return isFinite(d)?t.copy(m):null;let u=_h.set(m.x*n*2,m.y*i*2,m.z*o*2),h=(1-d)*e.length()/(.5*u.length()),p=0,g,b,w,f,y,S,M,x,C,A,P;do{h-=p,w=1/(1+h*n),f=1/(1+h*i),y=1/(1+h*o),S=w*w,M=f*f,x=y*y,C=S*w,A=M*f,P=x*y,g=a*S+s*M+l*x-1,b=a*C*n+s*A*i+l*P*o;let _=-2*b;p=g/_}while(Math.abs(g)>XO);return t.set(e.x*w,e.y*f,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*dM.DEG2RAD,i=Math.sin(n)**2;return t/Math.sqrt(1-r*i)}getPositionElevation(e){this.getPositionToSurfacePoint(e,br);let t=_h.subVectors(e,br);return Math.sign(t.dot(e))*t.length()}closestPointToRayEstimate(e,t){return this.intersectRay(e,t)?t:(Vr.makeScale(...this.radius).invert(),$u.copy(e).applyMatrix4(Vr),br.set(0,0,0),$u.closestPointToPoint(br,t).normalize(),Vr.makeScale(...this.radius),t.applyMatrix4(Vr))}copy(e){return this.radius.copy(e.radius),this}clone(){return new this.constructor().copy(this)}},il=new Uh(xo,xo,yh);il.name="WGS84 Earth";var Yu=new Ge,va=new Ge,ya=new Ge,Rh=new Ge,Ku=new pM,Qu=new Ge,xa=new Zt,eM=new Zt,tM=new Ge,rM=new Zt,Eh=new pM,kh={};function nM(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 Gh=class extends Ch{constructor(e=rd){super(),this.manager=e,this.adjustmentTransform=new Zt,this.ellipsoid=il.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,c=l.getHandler("path.gltf")||new zh(l);s.credentials==="include"&&s.mode==="cors"&&c.setCrossOrigin("use-credentials"),"credentials"in s&&c.setWithCredentials(s.credentials==="include"),s.headers&&c.setRequestHeader(s.headers);let d=t.gltfWorkingPath??this.workingPath;/[\\/]$/.test(d)||(d+="/");let m=this.adjustmentTransform;c.parse(i,d,u=>{let h=r.getData("INSTANCES_LENGTH"),p=r.getData("POSITION",h,"FLOAT","VEC3"),g=r.getData("POSITION_QUANTIZED",h,"UNSIGNED_SHORT","VEC3"),b=r.getData("QUANTIZED_VOLUME_OFFSET",1,"FLOAT","VEC3"),w=r.getData("QUANTIZED_VOLUME_SCALE",1,"FLOAT","VEC3"),f=r.getData("NORMAL_UP",h,"FLOAT","VEC3"),y=r.getData("NORMAL_RIGHT",h,"FLOAT","VEC3"),S=r.getData("NORMAL_UP_OCT32P",h,"UNSIGNED_SHORT","VEC2"),M=r.getData("NORMAL_RIGHT_OCT32P",h,"UNSIGNED_SHORT","VEC2"),x=r.getData("SCALE_NON_UNIFORM",h,"FLOAT","VEC3"),C=r.getData("SCALE",h,"FLOAT","SCALAR"),A=r.getData("RTC_CENTER",1,"FLOAT","VEC3"),P=r.getData("EAST_NORTH_UP");if(!p&&g){p=new Float32Array(h*3);for(let T=0;T<h;T++)p[T*3+0]=b[0]+g[T*3+0]/65535*w[0],p[T*3+1]=b[1]+g[T*3+1]/65535*w[1],p[T*3+2]=b[2]+g[T*3+2]/65535*w[2]}let _=new Ge;for(let T=0;T<h;T++)_.x+=p[T*3+0]/h,_.y+=p[T*3+1]/h,_.z+=p[T*3+2]/h;let R=[],k=[];u.scene.updateMatrixWorld(),u.scene.traverse(T=>{if(T.isMesh){k.push(T);let{geometry:L,material:F}=T,j=new LO(L,F,h);j.position.copy(_),A&&(j.position.x+=A[0],j.position.y+=A[1],j.position.z+=A[2]),R.push(j)}});for(let T=0;T<h;T++){Rh.set(p[T*3+0]-_.x,p[T*3+1]-_.y,p[T*3+2]-_.z),Ku.identity(),f&&y?(va.set(f[T*3+0],f[T*3+1],f[T*3+2]),ya.set(y[T*3+0],y[T*3+1],y[T*3+2]),Yu.crossVectors(ya,va).normalize(),xa.makeBasis(ya,va,Yu),Ku.setFromRotationMatrix(xa)):S&&M&&(nM(S[T*2+0],S[T*2+1],65535,va),nM(M[T*2+0],M[T*2+1],65535,ya),Yu.crossVectors(ya,va).normalize(),xa.makeBasis(ya,va,Yu),Ku.setFromRotationMatrix(xa)),Qu.set(1,1,1),x&&Qu.set(x[T*3+0],x[T*3+1],x[T*3+2]),C&&Qu.multiplyScalar(C[T]);for(let L=0,F=R.length;L<F;L++){let j=R[L];Eh.copy(Ku),P&&(j.updateMatrixWorld(),tM.copy(Rh).applyMatrix4(j.matrixWorld),this.ellipsoid.getPositionToCartographic(tM,kh),this.ellipsoid.getEastNorthUpFrame(kh.lat,kh.lon,rM),Eh.setFromRotationMatrix(rM)),xa.compose(Rh,Eh,Qu).multiply(m);let V=k[L];eM.multiplyMatrices(xa,V.matrixWorld),j.setMatrixAt(T,eM)}}u.scene.clear(),u.scene.add(...R),u.batchTable=n,u.featureTable=r,u.scene.batchTable=n,u.scene.featureTable=r,o(u)},a)})})}},hM=class extends Th{constructor(e=rd){super(),this.manager=e,this.adjustmentTransform=new Zt,this.ellipsoid=il.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 c=l.slice(),d=new Vh(r);d.workingPath=this.workingPath,d.fetchOptions=this.fetchOptions,d.adjustmentTransform.copy(i);let m=d.parse(c.buffer);o.push(m);break}case"pnts":{let c=l.slice(),d=new Fh(r);d.workingPath=this.workingPath,d.fetchOptions=this.fetchOptions;let m=d.parse(c.buffer);o.push(m);break}case"i3dm":{let c=l.slice(),d=new Gh(r);d.workingPath=this.workingPath,d.fetchOptions=this.fetchOptions,d.ellipsoid.copy(n),d.adjustmentTransform.copy(i);let m=d.parse(c.buffer);o.push(m);break}}}return Promise.all(o).then(a=>{let s=new Bh;return a.forEach(l=>{s.add(l.scene)}),{tiles:a,scene:s}})}},el=new Zt,YO=class extends Bh{constructor(e){super(),this.isTilesGroup=!0,this.name="TilesRenderer.TilesGroup",this.tilesRenderer=e,this.matrixWorldInverse=new Zt}raycast(e,t){return this.tilesRenderer.raycast(e,t),!1}updateMatrixWorld(e){if(this.matrixAutoUpdate&&this.updateMatrix(),this.matrixWorldNeedsUpdate||e){this.parent===null?el.copy(this.matrix):el.multiplyMatrices(this.parent.matrixWorld,this.matrix),this.matrixWorldNeedsUpdate=!1;let t=el.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(el),this.matrixWorldInverse.copy(el).invert();let i=this.children;for(let l=0,c=i.length;l<c;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)}},KO=new Nh;function QO(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 JO(e){return"traversal"in e}function fM(e,t,r,n,i=null){if(!JO(t))return;let{group:o,activeTiles:a}=e,{boundingVolume:s}=t.engineData;if(i===null&&(i=KO,i.copy(r.ray).applyMatrix4(o.matrixWorldInverse)),!t.traversal.used||!s.intersectsRay(i))return;a.has(t)&&QO(t,r,e,n);let l=t.children;for(let c=0,d=l.length;c<d;c++)fM(e,l[c],r,n,i)}var Ju=new Ge,Zu=new Ge,Mr=new Ge,ed=new Nh,Lh=class{constructor(e=new uM,t=new Zt){this.box=e.clone(),this.transform=t.clone(),this.inverseTransform=new Zt,this.points=Array(8).fill().map(()=>new Ge),this.planes=[,,,,,,].fill().map(()=>new NO)}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,Mr).distanceTo(e)}containsPoint(e){return Mr.copy(e).applyMatrix4(this.inverseTransform),this.box.containsPoint(Mr)}intersectsRay(e){return ed.copy(e).applyMatrix4(this.inverseTransform),ed.intersectsBox(this.box)}intersectRay(e,t){return ed.copy(e).applyMatrix4(this.inverseTransform),ed.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 c=-1;c<=1;c+=2)e[a].set(s<0?i.x:o.x,l<0?i.y:o.y,c<0?i.z:o.z).applyMatrix4(r),a++;this.updatePlanes()}updatePlanes(){Ju.copy(this.box.min).applyMatrix4(this.transform),Zu.copy(this.box.max).applyMatrix4(this.transform),Mr.set(0,0,1).transformDirection(this.transform),this.planes[0].setFromNormalAndCoplanarPoint(Mr,Ju),this.planes[1].setFromNormalAndCoplanarPoint(Mr,Zu).negate(),Mr.set(0,1,0).transformDirection(this.transform),this.planes[2].setFromNormalAndCoplanarPoint(Mr,Ju),this.planes[3].setFromNormalAndCoplanarPoint(Mr,Zu).negate(),Mr.set(1,0,0).transformDirection(this.transform),this.planes[4].setFromNormalAndCoplanarPoint(Mr,Ju),this.planes[5].setFromNormalAndCoplanarPoint(Mr,Zu).negate()}intersectsSphere(e){return this.clampPoint(e.center,Mr),Mr.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],c=o.distanceToPoint(l);a=a<c?c: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],c=o.distanceToPoint(l);a=a<c?c:a}if(a<0)return!1}return!0}},nl=Math.PI,Dh=nl/2,tl=new Ge,So=new Ge,en=new Ge,Re=new Ge,vr=new Zt,ZO=new uM,iM=new Zt;function Ti(e,t){t.radius=Math.max(t.radius,e.distanceToSquared(t.center))}function oM(e){return e.x!==e.y}var gM=class extends Uh{constructor(e=1,t=1,r=1,n=-Dh,i=Dh,o=0,a=2*nl,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){oM(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,c=(i+o)*.5,d=r>0,m=n<0,u;u=d?r:m?n:0;let{min:h,max:p}=e;h.setScalar(1/0),p.setScalar(-1/0),o-i<=nl?(this.getCartographicToNormal(l,c,en),So.set(0,0,1),tl.crossVectors(So,en).normalize(),So.crossVectors(en,tl).normalize(),t.makeBasis(tl,So,en),vr.copy(t).invert(),this.getCartographicToPosition(u,i,s,Re).applyMatrix4(vr),p.x=Math.abs(Re.x),h.x=-p.x,this.getCartographicToPosition(n,i,s,Re).applyMatrix4(vr),p.y=Re.y,this.getCartographicToPosition(n,c,s,Re).applyMatrix4(vr),p.y=Math.max(Re.y,p.y),this.getCartographicToPosition(r,i,s,Re).applyMatrix4(vr),h.y=Re.y,this.getCartographicToPosition(r,c,s,Re).applyMatrix4(vr),h.y=Math.min(Re.y,h.y),this.getCartographicToPosition(l,c,s,Re).applyMatrix4(vr),p.z=Re.z,this.getCartographicToPosition(r,i,a,Re).applyMatrix4(vr),h.z=Re.z,this.getCartographicToPosition(n,i,a,Re).applyMatrix4(vr),h.z=Math.min(Re.z,h.z)):(this.getCartographicToPosition(u,c,s,en),en.z=0,en.length()<1e-10?en.set(1,0,0):en.normalize(),So.set(0,0,1),tl.crossVectors(en,So).normalize(),t.makeBasis(tl,So,en),vr.copy(t).invert(),this.getCartographicToPosition(u,c+Dh,s,Re).applyMatrix4(vr),p.x=Math.abs(Re.x),h.x=-p.x,this.getCartographicToPosition(n,0,m?a:s,Re).applyMatrix4(vr),p.y=Re.y,this.getCartographicToPosition(r,0,d?a:s,Re).applyMatrix4(vr),h.y=Re.y,this.getCartographicToPosition(u,c,s,Re).applyMatrix4(vr),p.z=Re.z,this.getCartographicToPosition(u,o,s,Re).applyMatrix4(vr),h.z=Re.z),e.getCenter(Re),e.min.sub(Re).multiplyScalar(1.0000000000001),e.max.sub(Re).multiplyScalar(1.0000000000001),Re.applyMatrix4(t),t.setPosition(Re)}getBoundingSphere(e){oM(this.radius)&&console.warn("EllipsoidRegion: Triaxial ellipsoids are not supported."),this.getBoundingBox(ZO,iM),e.center.setFromMatrixPosition(iM),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,c=t>0,d=r<0,m;m=c?t:d?r:0,this.getCartographicToPosition(m,n,a,Re),Ti(Re,e),this.getCartographicToPosition(r,n,a,Re),Ti(Re,e),this.getCartographicToPosition(r,l,a,Re),Ti(Re,e),this.getCartographicToPosition(t,n,a,Re),Ti(Re,e),this.getCartographicToPosition(t,l,a,Re),Ti(Re,e),this.getCartographicToPosition(s,l,a,Re),Ti(Re,e),this.getCartographicToPosition(t,n,o,Re),Ti(Re,e),i-n>nl&&(this.getCartographicToPosition(m,l+nl,a,Re),Ti(Re,e)),e.radius=Math.sqrt(e.radius)*1.0000000000001}},Un=new Ge,Gn=new Ge,Hn=new Ge,aM=new Ge,sM=new Ge,eL=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,aM)&&(i=r.containsPoint(e.origin)?0:e.origin.distanceToSquared(aM)),n&&n.intersectRay(e,sM)&&(o=n.containsPoint(e.origin)?0:e.origin.distanceToSquared(sM));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 Lh;Un.set(e[3],e[4],e[5]),Gn.set(e[6],e[7],e[8]),Hn.set(e[9],e[10],e[11]);let n=Un.length(),i=Gn.length(),o=Hn.length();Un.normalize(),Gn.normalize(),Hn.normalize(),n===0&&Un.crossVectors(Gn,Hn),i===0&&Gn.crossVectors(Un,Hn),o===0&&Hn.crossVectors(Un,Gn),r.transform.set(Un.x,Gn.x,Hn.x,e[0],Un.y,Gn.y,Hn.y,e[1],Un.z,Gn.z,Hn.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 mM;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 gM(...e.radius,r,i,t,n,o,a),l=new Lh;s.getBoundingBox(l.box,l.transform),l.update(),this.region=s,this.regionObb=l}},tL=new BO;function rL(e,t,r,n){let i=tL.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 nL=class extends OO{constructor(){super(),this.points=Array(8).fill().map(()=>new Ge)}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)=>{rL(r[0],r[1],r[2],t[n])})}};var Ih=0;function lM(e,t,r,n){try{return FO.getByteLength(e,t,r,n)}catch{return Ih}}function iL(e){if(!e)return 0;if(e.isExternalTexture)return e.userData?.byteLength??Ih;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+=lM(s.width,s.height,t,r);return a}if(!n)return Ih;let o=lM(n.width,n.height,t,r);return o*=e.generateMipmaps?4/3:1,o}function oL(e){let t=new Set,r=0;return e.traverse(n=>{if(n.geometry&&!t.has(n.geometry)&&(r+=UO(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+=iL(a),t.add(a))}}}),r}var bM=Symbol("INITIAL_FRUSTUM_CULLED"),td=new Zt,rl=new Ge,Oh=new jh,aL=new Ge(1,0,0),sL=new Ge(0,1,0),lL=()=>null;function cM(e,t){e.traverse(r=>{r.frustumCulled=r[bM]&&t})}var Hh=class extends wh{get autoDisableRendererCulling(){return this._autoDisableRendererCulling}set autoDisableRendererCulling(e){this._autoDisableRendererCulling!==e&&(super._autoDisableRendererCulling=e,this.forEachLoadedModel(t=>{cM(t,!e)}))}constructor(...e){super(...e),this.accelerateRaycast=!0,this.group=new YO(this),this.ellipsoid=il.clone(),this.cameras=[],this.cameraMap=new Map,this.cameraInfo=[],this._upRotationMatrix=new Zt,this._bytesUsed=new WeakMap,this._autoDisableRendererCulling=!0,this.manager=new IO,this._listeners={}}addEventListener(e,t){Xu.prototype.addEventListener.call(this,e,t)}hasEventListener(e,t){return Xu.prototype.hasEventListener.call(this,e,t)}removeEventListener(e,t){Xu.prototype.removeEventListener.call(this,e,t)}dispatchEvent(e){Xu.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)fM(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 jh),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(Oh),this.setResolution(e,Oh.x,Oh.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(sL,-Math.PI/2);break;case"y":this._upRotationMatrix.makeRotationAxis(aL,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 nL,isOrthographic:!1,sseDenominator:-1,position:new Ge,invScale:-1,pixelSize:0});rl.setFromMatrixScale(e.matrixWorldInverse),Math.abs(Math.max(rl.x-rl.y,rl.x-rl.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,c=s.position,d=r.get(a);(d.width===0||d.height===0)&&console.warn("TilesRenderer: resolution for camera error calculation is not set.");let m=a.projectionMatrix.elements;if(s.isOrthographic=m[15]===1,s.isOrthographic){let u=2/m[0],h=2/m[5];s.pixelSize=Math.max(h/d.height,u/d.width)}else s.sseDenominator=2/m[5]/d.height;td.copy(e.matrixWorld),td.premultiply(a.matrixWorldInverse),td.premultiply(a.projectionMatrix),l.setFromProjectionMatrix(td,a.coordinateSystem,a.reversedDepth),c.set(0,0,0),c.applyMatrix4(a.matrixWorld),c.applyMatrix4(e.matrixWorldInverse)}}update(){if(super.update(),this.cameras.length===0&&this.root){let e=!1;this.invokeAllPlugins(t=>e||(e=!!(t!==this&&t.calculateTileViewError))),e===!1&&console.warn("TilesRenderer: no cameras defined. Cannot update 3d tiles.")}}preprocessNode(e,t,r=null){super.preprocessNode(e,t,r);let n=new Zt;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 Zt().copy(n).invert(),o=new eL;"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=lL}async parseTile(e,t,r,n,i){let o=t.engineData,a=Wu(n),s=this.fetchOptions,l=this.manager,c=null,d=o.transform,m=this._upRotationMatrix,u=(yo(e)||r).toLowerCase();switch(u){case"b3dm":{let y=new Vh(l);y.workingPath=a,y.fetchOptions=s,y.adjustmentTransform.copy(m),c=y.parse(e);break}case"pnts":{let y=new Fh(l);y.workingPath=a,y.fetchOptions=s,c=y.parse(e);break}case"i3dm":{let y=new Gh(l);y.workingPath=a,y.fetchOptions=s,y.adjustmentTransform.copy(m),y.ellipsoid.copy(this.ellipsoid),c=y.parse(e);break}case"cmpt":{let y=new hM(l);y.workingPath=a,y.fetchOptions=s,y.adjustmentTransform.copy(m),y.ellipsoid.copy(this.ellipsoid),c=y.parse(e).then(S=>S.scene);break}case"gltf":case"glb":{let y=l.getHandler("path.gltf")||l.getHandler("path.glb")||new zh(l);y.setWithCredentials(s.credentials==="include"),y.setRequestHeader(s.headers||{}),s.credentials==="include"&&s.mode==="cors"&&y.setCrossOrigin("use-credentials");let S=y.resourcePath||y.path||a;!/[\\/]$/.test(S)&&S.length&&(S+="/"),c=y.parseAsync(e,S).then(M=>{M.scene=M.scene||new Bh;let{scene:x}=M;return x.updateMatrix(),x.matrix.multiply(m).decompose(x.position,x.quaternion,x.scale),M});break}default:c=this.invokeOnePlugin(y=>y.parseToMesh&&y.parseToMesh(e,t,r,n,i));break}let h=await c;if(h===null)throw Error(`TilesRenderer: Content type "${u}" not supported.`);let p,g;h.isObject3D?(p=h,g=null):(p=h.scene,g=h),p.updateMatrix(),p.matrix.premultiply(d),p.matrix.decompose(p.position,p.quaternion,p.scale),await this.invokeAllPlugins(y=>y.processTileModel&&y.processTileModel(p,t)),p.traverse(y=>{y[bM]=y.frustumCulled,y.userData.tile=t}),cM(p,!this.autoDisableRendererCulling);let b=[],w=[],f=[];if(p.traverse(y=>{if(y.geometry&&w.push(y.geometry),y.material){let S=y.material;b.push(y.material);for(let M in S){let x=S[M];x&&x.isTexture&&f.push(x)}}}),i.aborted){for(let y=0,S=f.length;y<S;y++){let M=f[y];M.image instanceof ImageBitmap&&M.image.close(),M.dispose()}return}o.materials=b,o.geometry=w,o.textures=f,o.scene=p,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,oL(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,c=0,d=1/0;for(let m=0,u=n.length;m<u;m++){let h=i[m],p,g;if(h.isOrthographic){let w=h.pixelSize;p=e.geometricError/w,g=1/0}else{let w=h.sseDenominator;g=o.distanceToPoint(h.position),p=g===0?1/0:e.geometricError/(g*w)}let b=i[m].frustum;o.intersectsFrustum(b)&&(a=!0,s=Math.max(s,p),l=Math.min(l,g)),c=Math.max(c,p),d=Math.min(d,g)}a?(t.inView=!0,t.error=s,t.distanceFromCamera=l):(t.inView=!1,t.error=c,t.distanceFromCamera=d)}dispose(){super.dispose(),this.group.removeFromParent()}};import{BatchedMesh as E4,Box2 as cL,Box3 as k4,Box3Helper as D4,BoxGeometry as O4,BufferAttribute as Xh,BufferGeometry as L4,CanvasTexture as I4,Color as B4,CustomBlending as uL,DataTexture as dL,DefaultLoadingManager as N4,DoubleSide as j4,EventDispatcher as z4,FileLoader as pL,FloatType as V4,Frustum as F4,GreaterDepth as U4,Group as G4,LineBasicMaterial as H4,LineSegments as W4,LinearFilter as mL,LinearMipMapLinearFilter as q4,MathUtils as $h,Matrix2 as hL,Matrix3 as fL,Matrix4 as gL,Mesh as X4,MeshBasicMaterial as bL,MeshLambertMaterial as $4,MeshStandardMaterial as Y4,OneFactor as vL,PlaneGeometry as K4,Points as Q4,PointsMaterial as J4,Quaternion as Z4,REVISION as eH,RGFormat as tH,Ray as rH,Raycaster as nH,RedFormat as iH,SRGBColorSpace as oH,ShaderMaterial as yL,Source as aH,Sphere as sH,SphereGeometry as lH,Texture as cH,TextureUtils as uH,Triangle as dH,UnsignedByteType as pH,Vector2 as tn,Vector3 as OM,Vector4 as xL,WebGLArrayRenderTarget as mH,WebGLRenderTarget as vM,WebGLRenderer as wL,ZeroFactor as SL}from"three";import{GLTFLoader as ML}from"three/addons/loaders/GLTFLoader.js";import{FullScreenQuad as LM}from"three/addons/postprocessing/Pass.js";var gH=Object.freeze({fill:"#cccccc",stroke:"transparent",strokeWidth:1,radius:2,order:0,visible:!0});var yM=new fn;yM.maxJobs=10,yM.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)?ga(r,n):a?1:-1};var xM=new OM;function ol(e,t){if(e.isInterleavedBufferAttribute||e.array instanceof t)return e;let r=t===Int8Array||t===Int16Array||t===Int32Array?-1:0,n=new Xh(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=$h.clamp(e.getComponent(a,s),r,1);n.setComponent(a,s,l)}return n}function CL(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 Xh(new t(i.count*i.itemSize),i.itemSize,!1),a=i.itemSize,s=i.count;r.computeBoundingBox();let l=r.boundingBox,{min:c,max:d}=l,m=2**(8*t.BYTES_PER_ELEMENT-1)-1,u=-m;for(let h=0;h<s;h++)for(let p=0;p<a;p++){let g=p===0?"x":p===1?"y":"z",b=c[g],w=d[g],f=$h.mapLinear(i.getComponent(h,p),b,w,u,m);o.setComponent(h,p,f)}l.getCenter(xM).multiply(e.scale).applyQuaternion(e.quaternion),e.position.add(xM),e.scale.x*=.5*(d.x-c.x)/m,e.scale.y*=.5*(d.y-c.y)/m,e.scale.z*=.5*(d.z-c.z)/m,n.position=o,e.geometry.boundingBox=null,e.geometry.boundingSphere=null,e.updateMatrixWorld()}var Yh=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:c,positionType:d}=this._options;e.traverse(m=>{if(m.material&&n){let u=m.material;for(let h in u){let p=u[h];p&&p.isTexture&&p.generateMipmaps&&(p.generateMipmaps=!1,p.minFilter=mL)}}if(m.geometry){let u=m.geometry,h=u.attributes;if(o){let{uv:p,uv1:g,uv2:b,uv3:w}=h;p&&(h.uv=ol(p,l)),g&&(h.uv1=ol(g,l)),b&&(h.uv2=ol(b,l)),w&&(h.uv3=ol(w,l))}if(r&&!h.normals&&u.computeVertexNormals(),a&&h.normals&&(h.normals=ol(h.normals,c)),s&&CL(m,d),i&&u.index){let p=h.position.count,g=u.index,b=p>65535?Uint32Array:p>255?Uint16Array:Uint8Array;if(!(g.array instanceof b)){let w=new b(u.index.count);w.set(g.array);let f=new Xh(w,1);u.setIndex(f)}}}})}};function er(e,t,r){return e&&t in e?e[t]:r}function IM(e){return e!=="BOOLEAN"&&e!=="STRING"&&e!=="ENUM"}function PL(e){return/^FLOAT/.test(e)}function cl(e){return/^VEC/.test(e)}function ul(e){return/^MAT/.test(e)}function BM(e,t,r,n=null){return ul(r)||cl(r)?n.fromArray(e,t):e[t]}function Wh(e){let{type:t,componentType:r}=e;switch(t){case"SCALAR":return r==="INT64"?0n:0;case"VEC2":return new tn;case"VEC3":return new OM;case"VEC4":return new xL;case"MAT2":return new hL;case"MAT3":return new fL;case"MAT4":return new gL;case"BOOLEAN":return!1;case"STRING":return"";case"ENUM":return 0}}function wM(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 ll(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 TL(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]=nd(e,t[r])}else t=nd(e,t);return t}function nd(e,t=null){let r=e.default,n=e.type;if(t||(t=Wh(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(ul(n))t.fromArray(r);else if(cl(n))t.fromArray(r);else return r}function _L(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=nd(e,a)),a}function o(a){if(ul(n)){let s=a.elements;for(let l=0,c=r.length;l<c;l++)if(r[l]!==s[l])return!1;return!0}else if(cl(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 AL(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 RL(e,t){let{type:r,componentType:n,scale:i,offset:o,normalized:a}=e;if(Array.isArray(t))for(let m=0,u=t.length;m<u;m++)t[m]=s(t[m]);else t=s(t);return t;function s(m){return m=ul(r)?c(m):cl(r)?l(m):d(m),m}function l(m){return m.x=d(m.x),m.y=d(m.y),"z"in m&&(m.z=d(m.z)),"w"in m&&(m.w=d(m.w)),m}function c(m){let u=m.elements;for(let h=0,p=u.length;h<p;h++)u[h]=d(u[h]);return m}function d(m){return a&&(m=AL(n,m)),(a||PL(n))&&(m=m*i+o),m}}function Kh(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++)wM(e.type,t[n])||(t[n]=Wh(e))}else wM(e.type,t)||(t=Wh(e));return t}function id(e,t){for(let r in t)r in e||delete t[r];for(let r in e){let n=e[r];t[r]=Kh(n,t[r])}}function EL(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 ad=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=er(t,"scale",1),this.max=er(t,"max",1/0),this.min=er(t,"min",-1/0),this.required=t.required||!1,this.noData=er(t,"noData",null),this.default=er(t,"default",null),this.semantic=er(t,"semantic",null),this.enumSet=null,this.accessorProperty=r,r&&(this.offset=er(r,"offset",this.offset),this.scale=er(r,"scale",this.scale),this.max=er(r,"max",this.max),this.min=er(r,"min",this.min)),t.type==="ENUM"&&(this.enumSet=e[this.enumType],this.componentType===null&&(this.componentType=er(this.enumSet,"valueType","UINT16")))}shapeToProperty(e,t=null){return Kh(this,e,t)}resolveDefaultElement(e){return nd(this,e)}resolveDefault(e){return TL(this,e)}resolveNoData(e){return _L(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 IM(this.type)?RL(this,e):e}},Qh=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=ad){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}},kL=class extends ad{constructor(e,t,r=null){super(e,t,r),this.attribute=r?.attribute??null}},DL=class extends Qh{constructor(...e){super(...e),this.isPropertyAttributeAccessor=!0,this._initProperties(kL)}getData(e,t,r={}){let n=this.properties;id(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(ul(o)){let s=n.elements;for(let l=s.length;0<l;)s[0]=a.getComponent(t,0)}else if(cl(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}},OL=class extends ad{constructor(e,t,r=null){super(e,t,r),this.values=r?.values??null,this.valueLength=EL(this.type),this.arrayOffsets=er(r,"arrayOffsets",null),this.stringOffsets=er(r,"stringOffsets",null),this.arrayOffsetType=er(r,"arrayOffsetType","UINT32"),this.stringOffsetType=er(r,"stringOffsetType","UINT32")}getArrayLengthFromId(e,t){let r=this.count;if(this.arrayOffsets!==null){let{arrayOffsets:n,arrayOffsetType:i}=this,o=new(ll(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(ll(i))(e[n])[r]}else this.array&&(r*=this.count);return r}},LL=class extends Qh{constructor(...e){super(...e),this.isPropertyTableAccessor=!0,this.count=this.definition.count,this._initProperties(OL)}getData(e,t={}){let r=this.properties;id(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],c=new(ll(o,a))(l),d=i.getIndexOffsetFromId(s,t);if(IM(a)||a==="ENUM")return BM(c,(d+r)*i.valueLength,a,n);if(a==="STRING"){let m=d+r,u=0;if(i.stringOffsets!==null){let{stringOffsets:p,stringOffsetType:g}=i,b=new(ll(g))(s[p]);u=b[m+1]-b[m],m=b[m]}let h=new Uint8Array(c.buffer,m,u);n=new TextDecoder().decode(h)}else if(a==="BOOLEAN"){let m=d+r,u=Math.floor(m/8),h=m%8;n=(c[u]>>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}},al=new cL,SM=class{constructor(){this._renderer=new wL,this._target=new vM(1,1),this._texTarget=new vM,this._quad=new LM(new yL({blending:uL,blendDst:SL,blendSrc:vL,uniforms:{map:{value:null},pixel:{value:new tn}},vertexShader:`
|
|
64
|
-
void main() {
|
|
65
|
-
|
|
66
|
-
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
|
|
67
|
-
|
|
68
|
-
}
|
|
69
|
-
`,fragmentShader:`
|
|
70
|
-
uniform sampler2D map;
|
|
71
|
-
uniform ivec2 pixel;
|
|
72
|
-
|
|
73
|
-
void main() {
|
|
74
|
-
|
|
75
|
-
gl_FragColor = texelFetch( map, pixel, 0 );
|
|
76
|
-
|
|
77
|
-
}
|
|
78
|
-
`}))}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;al.min.copy(t),al.max.copy(t),al.max.x+=1,al.max.y+=1,n.initRenderTarget(i),n.copyTextureToTexture(e,i.texture,al,r,0)}},Ai=new class{constructor(){let e=null;Object.getOwnPropertyNames(SM.prototype).forEach(t=>{t!=="constructor"&&(this[t]=(...r)=>(e||(e=new SM),e[t](...r)))})}},MM=new tn,CM=new tn,PM=new tn;function IL(e,t){return t===0?e.getAttribute("uv"):e.getAttribute(`uv${t}`)}function NM(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 jM(e,t,r,n,i){let[o,a,s]=n,l=IL(e,t);MM.fromBufferAttribute(l,o),CM.fromBufferAttribute(l,a),PM.fromBufferAttribute(l,s),i.set(0,0,0).addScaledVector(MM,r.x).addScaledVector(CM,r.y).addScaledVector(PM,r.z)}function zM(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 TM=new tn,_M=new tn,AM=new tn,BL=class extends ad{constructor(e,t,r=null){super(e,t,r),this.channels=er(r,"channels",[0]),this.index=er(r,"index",null),this.texCoord=er(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 BM(e,t*this.valueLength,n,r)}},NL=class extends Qh{constructor(...e){super(...e),this.isPropertyTextureAccessor=!0,this._asyncRead=!1,this._initProperties(BL)}getData(e,t,r,n={}){let i=this.properties;id(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;id(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,Ai.increaseSizeTo(i.length);let o=this.data,a=this.definition.properties,s=this.properties,l=NM(n,t);for(let m=0,u=e.length;m<u;m++){let h=e[m];if(!a[h])continue;let p=s[h],g=o[p.index];jM(n,p.texCoord,r,l,TM),zM(TM,g.image.width,g.image.height,_M),AM.set(m,0),Ai.renderPixelToTarget(g,_M,AM)}let c=new Uint8Array(e.length*4);if(this._asyncRead)return Ai.readDataAsync(c).then(()=>(d.call(this),i));return Ai.readData(c),d.call(this),i;function d(){for(let m=0,u=e.length;m<u;m++){let h=e[m],p=s[h],g=p.type;if(i[m]=Kh(p,i[m]),!p)throw Error("PropertyTextureAccessor: Requested property does not exist.");if(!a[h]){i[m]=p.resolveDefault(i);continue}let b=p.valueLength*(p.count||1),w=p.channels.map(S=>c[4*m+S]),f=p.componentType,y=new(ll(f,g))(b);if(new Uint8Array(y.buffer).set(w),p.array){let S=i[m];for(let M=0,x=S.length;M<x;M++)S[M]=p.readDataFromBuffer(y,M,S[M])}else i[m]=p.readDataFromBuffer(y,0,i[m]);i[m]=p.adjustValueScaleOffset(i[m]),i[m]=p.resolveEnumsToStrings(i[m]),i[m]=p.resolveNoData(i[m])}}}dispose(){this.data.forEach(e=>{e&&(e.dispose(),e.image instanceof ImageBitmap&&e.image.close())})}},qh=class{constructor(e,t,r,n=null,i=null){let{schema:o,propertyTables:a=[],propertyTextures:s=[],propertyAttributes:l=[]}=e,{enums:c,classes:d}=o,m=a.map(p=>new LL(p,d,c,r)),u=[],h=[];n&&(n.propertyTextures&&(u=n.propertyTextures.map(p=>new NL(s[p],d,c,t))),n.propertyAttributes&&(h=n.propertyAttributes.map(p=>new DL(l[p],d,c)))),this.schema=o,this.tableAccessors=m,this.textureAccessors=u,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())}},sl="EXT_structural_metadata";function jL(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 zL(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 VM=class{constructor(e){this.parser=e,this.name=sl}async afterRoot({scene:e,parser:t}){let r=t.json.extensionsUsed;if(!r||!r.includes(sl))return;let n=null,i=t.json.extensions[sl];if(i.schemaUri){let{manager:l,path:c,requestHeader:d,crossOrigin:m}=t.options,u=new URL(i.schemaUri,c).toString(),h=new pL(l);h.setCrossOrigin(m),h.setResponseType("json"),h.setRequestHeader(d),n=h.loadAsync(u).then(p=>{i={...i,schema:p}})}let[o,a]=await Promise.all([jL(t,i.propertyTextures),zL(t,i.propertyTables),n]),s=new qh(i,o,a);e.userData.structuralMetadata=s,e.traverse(l=>{if(t.associations.has(l)){let{meshes:c,primitives:d}=t.associations.get(l),m=t.json.meshes[c]?.primitives[d];if(m&&m.extensions&&m.extensions[sl]){let u=m.extensions[sl];l.userData.structuralMetadata=new qh(i,o,a,u,l)}else l.userData.structuralMetadata=s}})}},RM=new tn,EM=new tn,kM=new tn;function VL(e){return e.x>e.y&&e.x>e.z?0:e.y>e.z?1:2}var FM=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;Ai.increaseSizeTo(a);let s=NM(r,e),l=s[VL(t)];for(let m=0,u=i.length;m<u;m++){let h=i[m],p="nullFeatureId"in h?h.nullFeatureId:null;if("texture"in h){let g=n[h.texture.index];jM(r,h.texture.texCoord,t,s,RM),zM(RM,g.image.width,g.image.height,EM),kM.set(m,0),Ai.renderPixelToTarget(n[h.texture.index],EM,kM)}else if("attribute"in h){let g=r.getAttribute(`_feature_id_${h.attribute}`).getX(l);g!==p&&(o[m]=g)}else{let g=l;g!==p&&(o[m]=g)}}let c=new Uint8Array(a*4);if(this._asyncRead)return Ai.readDataAsync(c).then(()=>(d(),o));return Ai.readData(c),d(),o;function d(){let m=new Uint32Array(1);for(let u=0,h=i.length;u<h;u++){let p=i[u],g="nullFeatureId"in p?p.nullFeatureId:null;if("texture"in p){let{channels:b}=p.texture,w=b.map(y=>c[4*u+y]);new Uint8Array(m.buffer).set(w);let f=m[0];f!==g&&(o[u]=f)}}}}dispose(){this.textures.forEach(e=>{e&&(e.dispose(),e.image instanceof ImageBitmap&&e.image.close())})}},od="EXT_mesh_features";function DM(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[od]&&r(n,a.extensions[od])}})}var UM=class{constructor(e){this.parser=e,this.name=od}async afterRoot({scene:e,parser:t}){let r=t.json.extensionsUsed;if(!r||!r.includes(od))return;let n=t.json.textures?.length||0,i=Array(n).fill(null);DM(e,t,(a,{featureIds:s})=>{s.forEach(l=>{if(l.texture&&i[l.texture.index]===null){let c=l.texture.index;i[c]=t.loadTexture(c)}})});let o=await Promise.all(i);DM(e,t,(a,s)=>{a.userData.meshFeatures=new FM(a.geometry,o,s)})}},GM=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])}}},Jh=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 ML(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 GM),this.metadata&&(t.register(()=>new VM),t.register(()=>new UM)),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:bH}=$h;var vH=new LM(new bL),FL=new dL(new Uint8Array([255,255,255,255]),1,1);FL.needsUpdate=!0;var UL=0,GL=1,HL=2,WL=3,qL=4,XL=5,$L=6,YL=7,KL=8,QL=9,JL=10,ZL=11,yH=Object.freeze({NONE:UL,SCREEN_ERROR:GL,GEOMETRIC_ERROR:HL,DISTANCE:WL,DEPTH:qL,RELATIVE_DEPTH:XL,IS_LEAF:$L,RANDOM_COLOR:YL,RANDOM_NODE_COLOR:KL,CUSTOM_COLOR:QL,LOAD_ORDER:JL,INDEXED_COLOR:ZL});var xH=Math.PI/4,wH=3/5;var _i={NONE:0,NOT_READY:1,NO_FIT:2,DEPTH:3,OCCUPANCY:4,SPACING:5,ANGLE:6,FACING:7};var SH=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 MH={[_i.NONE]:16777215,[_i.NOT_READY]:7829367,[_i.NO_FIT]:2250239,[_i.DEPTH]:4473924,[_i.OCCUPANCY]:65535,[_i.SPACING]:16776960,[_i.ANGLE]:16711680,[_i.FACING]:16711935};var CH=Math.PI/180;var PH=xo*Math.PI*2;var TH=xo*Math.PI*2;import{DRACOLoader as oI}from"three/examples/jsm/loaders/DRACOLoader.js";import{KTX2Loader as aI}from"three/examples/jsm/loaders/KTX2Loader.js";import{MeshoptDecoder as sI}from"three/examples/jsm/libs/meshopt_decoder.module.js";import{Box3 as lI,DoubleSide as cI,MathUtils as uI,Matrix4 as XM,Sphere as dI,Vector3 as pI}from"three";import{BufferAttribute as HM,MathUtils as eI}from"three";function WM(e){return!!e&&!e.isInterleavedBufferAttribute}function qM(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,eI.clamp(e.getComponent(i,o),r,n));return t}function tI(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 sd=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;WM(i)&&!(i.array instanceof Int16Array)&&(n.attributes.normal=qM(i,new HM(new Int16Array(i.count*i.itemSize),i.itemSize,!0),-1,1));for(let o of["uv","uv1","uv2","uv3"]){let a=n.attributes[o];!WM(a)||a.array instanceof Uint16Array||!tI(a)||(n.attributes[o]=qM(a,new HM(new Uint16Array(a.count*a.itemSize),a.itemSize,!0),0,1))}})}};import{jsx as YM,jsxs as vI}from"react/jsx-runtime";var mI=0,$M=4,hI=6,fI=12,gI=4;function bI(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 ef({diagnosticsRef:e,loadingRef:t,url:r,rotation:n=[0,0,0],errorTarget:i=64,cacheSize:o=800,memoryBudgetMB:a=800,decoderConfig:s,objectBindings:l,itemMaterials:c,sceneConfig:d,selectedItem:m,panelHoveredItem:u,highlightOnHover:h=!0,onItemClick:p,onItemHover:g,onItemDoubleClick:b,onItemContextMenu:w,onObjectCatalog:f,onTilesetBounds:y,onModelLoaded:S,onLoadError:M,nodeRefsOut:x,onNodeRefsChange:C,materialRefsOut:A,explodeFactor:P=0,suspendBindingTransforms:_=!1}){let{camera:R,gl:k,invalidate:T}=iI(),L=ur(null),[F,j]=Zh(null),V=ur({onItemClick:p,onItemHover:g,onItemDoubleClick:b,onObjectCatalog:f,onTilesetBounds:y,onModelLoaded:S,onLoadError:M,onNodeRefsChange:C});V.current={onItemClick:p,onItemHover:g,onItemDoubleClick:b,onObjectCatalog:f,onTilesetBounds:y,onModelLoaded:S,onLoadError:M,onNodeRefsChange:C};let E=ur(!0),[O,Z]=Zh(null),ee=ur(null);ee.current=O;let J=ur([]),U=ur(!1);Ei(()=>{let ie=new Bu;return Z(ie),()=>ie.dispose()},[r]);let Q=ur(null),q=ur(0),G=ur(!1),H=a*1024*1024,se=ur(!1),ve=ur(fh),Ne=ur(null),$=ur(null),xe=ur(null);Ei(()=>()=>{xe.current!==null&&clearTimeout(xe.current)},[]);let Te=s?.dracoDecoderPath??Hy,we=s?.ktx2TranscoderPath??Wy,pt=s?.meshopt??!0,[te,_t]=Zh(null);Ei(()=>{G.current=!1,se.current=!1;let ie=new Hh(r);ie.loadAncestors=!0;let Ie=new Uu;Ie.priorityCallback=ie.downloadQueue.priorityCallback,Ie.maxJobsPerOrigin=fI;let je=new fn;je.priorityCallback=ie.parseQueue.priorityCallback,je.maxJobs=hI;let Mt=new fn;Mt.priorityCallback=ie.processNodeQueue.priorityCallback,Mt.maxJobs=ie.processNodeQueue.maxJobs;let Ue=new Ys;Ue.unloadPriorityCallback=ie.lruCache.unloadPriorityCallback,ie.downloadQueue=Ie,ie.parseQueue=je,ie.processNodeQueue=Mt,ie.lruCache=Ue;let re=Te?new oI().setDecoderPath(Te).setWorkerLimit(gI):null,oe=we?new aI().setTranscoderPath(we).detectSupport(k):null;return ie.registerPlugin(new Jh({dracoLoader:re,ktxLoader:oe,meshoptDecoder:pt?sI:null,autoDispose:!1})),ie.registerPlugin(new Yh({disableMipmaps:!1,compressIndex:!0,compressNormals:!1,compressUvs:!1,compressPosition:!0})),ie.registerPlugin(new sd),_t(ie),window.__riTiles=ie,()=>{ie.forEachLoadedModel(le=>fs(le)),ie.dispose(),re?.dispose(),oe?.dispose(),_t(le=>le===ie?null:le)}},[Te,k,we,pt,r]),Ei(()=>{te&&(ve.current=fh,Ne.current=null,te.errorTarget=i,te.lruCache.maxSize=o,te.lruCache.minSize=Math.max(1,Math.floor(o*.75)),te.lruCache.maxBytesSize=H,te.lruCache.minBytesSize=H*.75,T())},[o,i,T,H,te]);let ne=rI(()=>{let ie=l??{};return{objectBindings:ie,keyByModelObject:xS(ie),itemMaterials:c,shadingMode:d?.model.shading??"lit",rendererMode:d?.model.renderer??"pbr",selectedKey:m??null,hoveredKey:wS(F,u),highlightOnHover:h,suspendTransforms:_,placementFrame:te?.group.matrixWorld,invalidate:T}},[F,h,T,c,l,u,d,m,_,te]),De=Ri(()=>{if(!te)return;let ie=ze.current,Ie=U.current?ee.current?.nodesByBinding(ie)??{}:{},je={};te.group.traverse(oe=>{if(!oe.isMesh)return;let le=dh(oe);if(!le)return;let Ee=ie.keyByModelObject[le]??le;if(!ie.objectBindings[Ee])return;Ie[Ee]||(Ie[Ee]=oe);let Oe=oe.material;Oe&&(je[Ee]=Oe)});let Mt=x?.current??{},Ue=Object.keys(Mt),re=Ue.length!==Object.keys(Ie).length||Ue.some(oe=>Mt[oe]!==Ie[oe]);x&&(x.current=Ie),A&&(A.current=je),(re||!x)&&V.current.onNodeRefsChange?.()},[A,x,te]),Fe=Ri(ie=>mh(ie,ne,"select"),[ne]),ae=Ri(ie=>CS(ie,ne),[ne]),qe=ur(ae);qe.current=ae;let ze=ur(ne);ze.current=ne;let pe=Ri(()=>{let ie=Q.current,Ie=q.current;return!ie||Ie<=0?ze.current:{...ze.current,explode:{factor:Ie,centre:ie.centre,radius:ie.radius}}},[]);Ei(()=>{te&&(ae(te.group),E.current=!0,te.forEachLoadedModel(ie=>{ae(ie),fa(ie,pe())}),T())},[ae,T,pe,te]),Ei(()=>{let ie=bI(r);if(!ie)return;let Ie=!1;return fetch(ie).then(je=>je.ok?je.json():null).then(je=>{Ie||!je?.objects||(J.current=je.objects,U.current=je.bindingFrame==="gltf-identity-v2",U.current&&ee.current?.setCatalog(je.objects),E.current=!0,V.current.onObjectCatalog?.(je.objects),T())}).catch(()=>{}),()=>{Ie=!0}},[r,T,O]),Ei(()=>{if(!te)return;let ie=!1,Ie=()=>T(),je=le=>{le.scene&&(le.scene.traverse(Ee=>{let Oe=Ee.material;for(let Ot of Array.isArray(Oe)?Oe:Oe?[Oe]:[])Ot.transparent&&Ot.side===cI&&(Ot.forceSinglePass=!0)}),qe.current(le.scene),fa(le.scene,pe()),Dc(le.scene)),E.current=!0,ie||(ie=!0,V.current.onModelLoaded?.(te.group)),T()},Mt=le=>{V.current.onLoadError?.(le.error)},Ue=le=>{le.scene&&(hh(le.scene),fs(le.scene)),E.current=!0};te.setCamera(R),te.setResolutionFromRenderer(R,k),te.addEventListener("needs-update",Ie),te.addEventListener("load-model",je),te.addEventListener("load-error",Mt),te.addEventListener("dispose-model",Ue);let re=()=>{E.current=!0,T()};te.addEventListener("tile-visibility-change",re);let oe=()=>{let le=te.root;le&&!le.content?.uri&&le.refine==="REPLACE"&&(le.refine="ADD",T())};return te.addEventListener("load-root-tileset",oe),T(),()=>{te.removeEventListener("needs-update",Ie),te.removeEventListener("load-model",je),te.removeEventListener("load-error",Mt),te.removeEventListener("dispose-model",Ue),te.removeEventListener("tile-visibility-change",re),te.removeEventListener("load-root-tileset",oe),hh(te.group),te.deleteCamera(R),x&&(x.current={}),A&&(A.current={})}},[R,k,T,A,x,pe,te]);let _e=Wc(ie=>Fe(ie)?.binding??null,w),Be=Ri(ie=>{if(_e.consumeClick())return;let Ie=Fe(ie.object);Ie&&(ie.stopPropagation(),V.current.onItemClick?.(Ie.binding))},[Fe,_e,p]),Ye=Ri(ie=>{let Ie=Fe(ie.object);if(!Ie)return;V.current.onItemDoubleClick?.(Ie.binding,ra(ie))&&ie.stopPropagation()},[Fe]),Nt=Ri(ie=>{let Ie=SS(ie.intersections,ie.eventObject,ne,"hover"),je=Ie?.key??null;je!==L.current&&(L.current=je,j(je),V.current.onItemHover?.(Ie?.binding??null))},[ne]),jt=Ri(()=>{L.current!==null&&(L.current=null,j(null),V.current.onItemHover?.(null))},[]);return Ei(()=>{T()},[T,te]),nI((ie,Ie)=>{if(!te)return;if(te.setResolutionFromRenderer(R,k),U.current&&O){let Ke=O.sync(pe(),m,_);O.updateBounds(te.root),_&&te.forEachLoadedModel(Qe=>fa(Qe,Ke))}if(te.update(),!G.current){let Ke=new lI;if(te.getBoundingBox(Ke)){G.current=!0,te.group.updateMatrixWorld(),Ke.applyMatrix4(te.group.matrixWorld);let Qe=Ke.getBoundingSphere(new dI);Q.current={centre:Qe.center.clone(),radius:Ke.getSize(new pI).length()*.5},V.current.onTilesetBounds?.(Ke),T()}}E.current&&(E.current=!1,De());let je=Math.min(Math.max(P,0),1),Mt=q.current;Math.abs(Mt-je)>1e-4?(q.current=uI.lerp(Mt,je,1-Math.exp(-6*Ie)),fa(te.group,pe()),T()):Mt!==je&&(q.current=je,fa(te.group,pe()),T());let Ue=te,re=te.lruCache,oe=re.isFull(),le=ve.current,Ee=le.loosened&&Ne.current?Ne.current:{bytes:re.maxBytesSize,items:re.maxSize},Oe=0;for(let Ke of re.usedSet??[])Oe+=re.bytesMap?.get(Ke)??0;let Ot=!1,qt=te;for(let Ke of qt.usedSet??[]){let Qe=Ke.internal?.loadingState??$M;if(Ke.traversal?.used&&Ke.internal?.hasContent&&Qe>=mI&&Qe<$M){Ot=!0;break}}let Rt=$.current??($.current={world:new XM,projection:new XM}),gt=!Rt.world.equals(R.matrixWorld)||!Rt.projection.equals(R.projectionMatrix);gt&&(Rt.world.copy(R.matrixWorld),Rt.projection.copy(R.projectionMatrix));let rr={full:oe,wanting:Ot,moved:gt,usage:Math.max(Oe/Math.max(1,Ee.bytes),(re.usedSet?.size??0)/Math.max(1,Ee.items)),now:performance.now()},kt=BS(le,rr);kt!==le&&(kt.loosened&&(!le.loosened||kt.raisedAt!==le.raisedAt)?(le.loosened||(Ne.current=Ee),re.maxBytesSize=Math.max(Ee.bytes,re.cachedBytes??0)*gh,re.maxSize=Math.ceil(Math.max(Ee.items,re.itemSet?.size??0)*gh)):!kt.loosened&&le.loosened&&Ne.current&&(re.maxBytesSize=Ne.current.bytes,re.maxSize=Ne.current.items,Ne.current=null),ve.current=kt,te.errorTarget=i*kt.factor,T()),!se.current&&oe&&rr.wanting&&kt.factor>=Ws&&(se.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.")),e&&(e.current={cachedBytes:re.cachedBytes??null,budgetBytes:Ee.bytes,cachedTiles:re.itemSet?.size??null,downloading:Ue.stats?.downloading??0,parsing:Ue.stats?.parsing??0,cacheFull:oe,detailFactor:kt.factor,errorTarget:te.errorTarget});let Xt=NS(kt,rr);Xt===0?T():Xt!==null&&xe.current===null&&(xe.current=setTimeout(()=>{xe.current=null,T()},Xt));let $t=(Ue.stats?.downloading??0)>0||(Ue.stats?.parsing??0)>0||Ue.loadProgress!==void 0&&Ue.loadProgress<1&&!oe;t&&(t.current=$t),$t&&T()}),te?vI("group",{rotation:n,children:[O?YM("primitive",{object:O.group}):null,YM("primitive",{object:te.group,onClick:Be,onDoubleClick:Ye,onPointerDown:w?_e.onPointerDown:void 0,onPointerMove:Nt,onPointerOut:jt})]}):null}import{Matrix4 as tf}from"three";var yI=new tf().makeRotationX(Math.PI/2);function KM(e){e.updateMatrixWorld(!0);let t=new tf().copy(e.matrixWorld).invert().premultiply(yI),r=new tf,n=[];for(let[i,o]of Object.entries(ui(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)),c=s.index?s.index.count:s.getAttribute("position")?.count??0;n.push({name:i,triangles:Math.floor(c/3),minimum:l.min.toArray(),maximum:l.max.toArray()})}return n.sort((i,o)=>i.name.localeCompare(o.name))}import{useMemo as ki,useRef as rn,useState as Mo,useEffect as Wn,useCallback as wa}from"react";import{Html as QM}from"@react-three/drei";import{useFrame as JM,useThree as nf}from"@react-three/fiber";import{MathUtils as rf,Vector3 as Sa}from"three";import{jsx as Cr,jsxs as of}from"react/jsx-runtime";var xI=[],wI=.02;function ZM(e,t,r=!1,n){let i=rn(null),[o,a]=Mo(!0),s=rn(!0),l=ki(()=>new Sa,[]),c=nf(b=>b.scene),d=rn(null),m=rn(null),u=ki(()=>new Sa(...e.anchorLocalPosition??e.localPosition??e.worldPosition),[e.anchorLocalPosition,e.localPosition,e.worldPosition]),h=ki(()=>new Sa,[]),p=ki(()=>new Sa,[]),g=ki(()=>new Sa,[]);return Wn(()=>{d.current=null},[e.anchorNodeName]),JM(({camera:b})=>{let w=i.current,f=w?.parent;if(!w||!f)return;let y=n?n.current:c;m.current!==y&&(m.current=y,d.current=null);let S=d.current;if(e.anchorNodeName&&(!S||!S.parent)&&(S=y?pi(y,e.anchorNodeName):null,d.current=S),S?(S.updateWorldMatrix(!0,!1),h.copy(u).applyMatrix4(S.matrixWorld)):(h.copy(u),f.localToWorld(h)),t){let x=t.current.get(e.id);x||(x=new Sa,t.current.set(e.id,x)),x.copy(h)}b.getWorldPosition(l);let M=!r||hv(e,l.distanceTo(h));M!==s.current&&(s.current=M,a(M)),g.copy(l).sub(h),g.lengthSq()>0?(g.normalize(),p.copy(h).addScaledVector(g,wI)):p.copy(h),f.worldToLocal(p),w.position.copy(p)}),{anchorRef:i,inRange:o}}function SI({anchorSceneRef:e,annotation:t,occluders:r,worldPositionsRef:n,onClick:i,onHover:o,showAnnotationOnHover:a}){let s=ce(),[l,c]=Mo(!1),{anchorRef:d,inRange:m}=ZM(t,n,!0,e),u=l||!m,[h,p]=Mo(!1),[g,b]=Mo(1),w=rn(null),f=rn(null),y=rn(null);Wn(()=>{m||(w.current&&clearTimeout(w.current),h&&(p(!1),o?.(null)))},[m,h,o]),Wn(()=>()=>{w.current&&(clearTimeout(w.current),w.current=null),y.current&&(clearTimeout(y.current),y.current=null)},[]);let S=P=>{P.stopPropagation(),P.preventDefault(),w.current&&(clearTimeout(w.current),w.current=null),w.current=window.setTimeout(()=>{i?.(t),w.current=null},10)},M=P=>{P.stopPropagation(),p(!0),b(100),y.current&&(clearTimeout(y.current),y.current=null),o?.(t)},x=P=>{P.stopPropagation(),p(!1),b(1),y.current&&clearTimeout(y.current),y.current=window.setTimeout(()=>{o?.(null),a&&o?.(null),y.current=null},50)},C=P=>{P.stopPropagation();let _=P.currentTarget;_.dataset.pointerX=String(P.clientX),_.dataset.pointerY=String(P.clientY)},A=P=>{P.stopPropagation();let _=P.currentTarget,R=parseFloat(_.dataset.pointerX||"0"),k=parseFloat(_.dataset.pointerY||"0"),T=P.clientX-R,L=P.clientY-k;Math.sqrt(T*T+L*L)<10&&S(P)};return Cr("group",{ref:d,children:Cr(QM,{center:!0,occlude:r,onOcclude:c,pointerEvents:u?"none":"auto",zIndexRange:[1,200],style:{pointerEvents:u?"none":"auto",zIndex:g},className:"annotation-html-wrapper",transparent:!0,children:Cr("div",{ref:f,className:`ri-annotationMarker ${h?"ri-annotationMarker--hovered":""}`,title:t.title,style:{display:u?"none":"flex"},onPointerDown:C,onPointerUp:A,onPointerEnter:M,onPointerLeave:x,onDoubleClick:P=>{P.stopPropagation(),i?.(t)},role:"button",tabIndex:0,"aria-label":s("annotationMarker",{id:t.id,title:t.title}),onKeyDown:P=>{(P.key==="Enter"||P.key===" ")&&(P.preventDefault(),P.stopPropagation(),i?.(t))},children:Cr("span",{className:"ri-annotationMarker-id",children:t.id})})})})}function MI({anchorSceneRef:e,annotation:t,occluders:r,popupRef:n,onClose:i,hideCloseButton:o=!1}){let a=ce(),[s,l]=Mo(!1),{anchorRef:c}=ZM(t,void 0,!1,e),d=of("div",{ref:n,className:"ri-viewAnnotationPopup",style:{display:s?"none":"block"},onPointerDown:m=>m.stopPropagation(),onClick:m=>m.stopPropagation(),children:[of("div",{className:"ri-viewAnnotationHeader",children:[Cr("h4",{className:"ri-viewAnnotationTitle",children:t.title}),!o&&Cr("button",{onClick:m=>{m.stopPropagation(),i?.()},className:"ri-viewAnnotationClose","aria-label":a("closeAnnotation"),children:"\xD7"})]}),t.category&&Cr("span",{className:"ri-annotationCategory",children:t.category}),t.description&&Cr("p",{className:"ri-viewAnnotationDescription",children:t.description}),t.images?.map((m,u)=>{let h=$p(m.src);return h?Cr("img",{className:"ri-annotationImage",src:h,alt:m.alt??"",loading:"lazy"},`${h}-${u}`):null}),t.links?.map((m,u)=>{let h=$p(m.href);return h?Cr("a",{className:"ri-annotationLink",href:h,target:"_blank",rel:"noopener noreferrer",children:m.label||a("learnMore")},`${h}-${u}`):null})]});return Cr("group",{ref:c,children:Cr(QM,{occlude:r,onOcclude:l,pointerEvents:s?"none":"auto",zIndexRange:[1e3,2e3],style:{pointerEvents:s?"none":"auto",zIndex:1e3},transparent:!0,children:d})})}function ld({anchorSceneRef:e,annotations:t,sceneConfig:r,activeAnnotation:n,popupRef:i,canvasRootRef:o,worldPositionsRef:a,modelLoaded:s,onAnnotationClick:l,onAnnotationHover:c,onCloseAnnotation:d,hideCloseButton:m=!1,showAnnotationOnHover:u=!1,guidedTour:h=!1}){let p=nf(E=>E.invalidate),g=nf(E=>E.scene),[b,w]=Mo(null),[f,y]=Mo(!1),S=rn(null);Wn(()=>{S.current!==null&&n===null&&(w(null),y(!1)),S.current=n?.id??null},[n]);let M=rn(null),x=rn(null),C=rn(null),A=ki(()=>{let E=[];return g.traverse(O=>{let Z=O;Z.isMesh&&!Z.isSkinnedMesh&&E.push({current:O})}),E},[g,t,s]),P=wa(()=>{p();let E=()=>{p(),x.current=window.requestAnimationFrame(()=>{p(),x.current=null})};x.current=window.requestAnimationFrame(E)},[p]);Wn(()=>{P()},[t,P]),Wn(()=>{P()},[n,P]),Wn(()=>()=>{x.current!==null&&window.cancelAnimationFrame(x.current),C.current&&clearTimeout(C.current)},[]);let _=n||b,R=ki(()=>_?t.find(E=>E.id===_.id)??null:null,[_,t]),k=wa(E=>{if(f&&b?.id===E.id){y(!1),w(null),d?.();return}y(!0),w(E),l?.(E)},[f,b,l,d]),T=wa(E=>{c?.(E),u&&!f&&(C.current&&(clearTimeout(C.current),C.current=null),E?w(E):C.current=window.setTimeout(()=>{w(null),d?.(),C.current=null},100))},[f,c,u,d]),L=wa(()=>{y(!1),w(null),d?.()},[d]),F=wa(E=>{let O=E.target;if(O.closest?.(".ri-annotationMarker")||O.closest?.(".ri-viewAnnotationPopup")||O.closest?.(".annotation-html-wrapper"))return;let Z=o.current;Z&&Z.contains(O)&&(y(!1),w(null),d?.())},[o,d]),j=wa(E=>{E.key==="Escape"&&f&&(y(!1),w(null),d?.())},[f,d]);Wn(()=>{let E=o.current;return E&&(E.addEventListener("click",F),E.addEventListener("pointerdown",F)),document.addEventListener("keydown",j),()=>{E&&(E.removeEventListener("click",F),E.removeEventListener("pointerdown",F)),document.removeEventListener("keydown",j)}},[o,F,j]);let V=ki(()=>(r?.model.rotation??[0,0,0]).map(E=>E*Math.PI/180),[r?.model.rotation]);return Wn(()=>{p()},[p,V]),JM((E,O)=>{if(!M.current)return;M.current.rotation.x=rf.lerp(M.current.rotation.x,V[0],1-Math.exp(-5*O)),M.current.rotation.y=rf.lerp(M.current.rotation.y,V[1],1-Math.exp(-5*O)),M.current.rotation.z=rf.lerp(M.current.rotation.z,V[2],1-Math.exp(-5*O));let{rotation:Z}=M.current;Math.abs(Z.x-V[0])+Math.abs(Z.y-V[1])+Math.abs(Z.z-V[2])>1e-4&&p()}),of("group",{ref:M,children:[t.map(E=>{let O=`${E.worldPosition.join(",")}-${E.title}-${E.id}`;return Cr(SI,{anchorSceneRef:e,annotation:E,occluders:A,worldPositionsRef:a,onClick:k,onHover:T,showAnnotationOnHover:u},O)}),R?Cr(MI,{anchorSceneRef:e,annotation:R,occluders:h?xI:A,popupRef:i,onClose:L,hideCloseButton:m},`popup-${R.id}`):null]})}import{useEffect as nC,useMemo as pl}from"react";import{Html as sf}from"@react-three/drei";import{useEffect as CI,useMemo as PI}from"react";import{Line as TI}from"@react-three/drei";import{useThree as _I}from"@react-three/fiber";import{BufferGeometry as AI,Line as RI,LineBasicMaterial as EI,LineDashedMaterial as kI,Vector3 as eC}from"three";import{jsx as af}from"react/jsx-runtime";function Di(e){return _I(r=>fi(r.gl))?af(DI,{...e}):af(TI,{points:e.points,color:e.color,lineWidth:e.lineWidth,dashed:e.dashed})}function DI({points:e,color:t,dashed:r=!1}){let n=PI(()=>{let i=new AI().setFromPoints(e.map(s=>s instanceof eC?s:new eC(...s))),o=r?new kI({color:t,dashSize:.02,gapSize:.02}):new EI({color:t}),a=new RI(i,o);return r&&a.computeLineDistances(),a},[e,t,r]);return CI(()=>()=>{n.geometry.dispose(),n.material.dispose()},[n]),af("primitive",{object:n})}import{BoxGeometry as OI,BufferGeometry as LI,DoubleSide as II,EdgesGeometry as BI,Float32BufferAttribute as NI,Vector3 as qn}from"three";import{Fragment as dl,jsx as xt,jsxs as kr}from"react/jsx-runtime";var Oi="#22d3ee",jI="#facc15";function Co(e,t){let r=e<10?e.toFixed(3):e.toFixed(2);return t?`${r} ${t}`:r}function tC(e,t){return[(e[0]+t[0])/2,(e[1]+t[1])/2,(e[2]+t[2])/2]}function zI(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 Xn({position:e,children:t}){return xt(sf,{center:!0,position:e,zIndexRange:[20,0],style:{pointerEvents:"none"},children:xt("div",{className:"ri-measureLabel",children:t})})}function rC({positions:e,triangles:t}){let r=pl(()=>{let n=new qn(...e[0]),i=new LI;return i.setAttribute("position",new NI(e.flatMap(o=>new qn(...o).sub(n).toArray()),3)),i.setIndex(t.flat()),i},[e,t]);return nC(()=>()=>r.dispose(),[r]),xt("mesh",{position:e[0],geometry:r,raycast:()=>{},renderOrder:100,children:xt("meshBasicMaterial",{color:Oi,side:II,transparent:!0,opacity:.18,depthWrite:!1})})}var VI=[[0,1,2]];function FI({positions:e}){let t=Mc(e);if(t===null)return null;let r=new qn(...e[1]),n=new qn(...e[0]).sub(r),i=new qn(...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 qn(0,1,0):new qn(1,0,0)),a.normalize();let s=t*Math.PI/180,l=Array.from({length:33},(d,m)=>n.clone().applyAxisAngle(a,s*m/32).multiplyScalar(o).add(r).toArray()),c=n.clone().applyAxisAngle(a,s/2).multiplyScalar(o*1.4).add(r).toArray();return kr(dl,{children:[xt(Di,{points:l,color:Oi,lineWidth:2}),kr(Xn,{position:c,children:[t.toFixed(2),"\xB0"]})]})}function UI({box:e,unit:t,scale:r}){let n=pl(()=>[(e.min[0]+e.max[0])/2,(e.min[1]+e.max[1])/2,(e.min[2]+e.max[2])/2],[e.min,e.max]),i=pl(()=>{let[l,c,d]=e.size,m=new OI(l||1e-4,c||1e-4,d||1e-4),u=new BI(m);return m.dispose(),u},[e.size]);nC(()=>()=>{i.dispose()},[i]);let[o,a,s]=e.size;return kr("group",{position:n,children:[xt("lineSegments",{geometry:i,children:xt("lineBasicMaterial",{color:jI})}),kr(Xn,{position:[0,-a/2,s/2],children:["W ",Co(o*r,t)]}),kr(Xn,{position:[-o/2,0,s/2],children:["H ",Co(a*r,t)]}),kr(Xn,{position:[o/2,-a/2,0],children:["D ",Co(s*r,t)]})]})}function Ma({points:e,unit:t,scale:r=1,box:n,showDimensions:i,tool:o="distance",areaClosed:a=!1,snapPreview:s}){let l=pl(()=>e.map(m=>m.position),[e]),c=pl(()=>o==="area"&&a?Cc(l):null,[o,a,l]),d=o==="pointToPlane"&&e.length===2?Dv(e[0],e[1].position):null;return kr("group",{children:[o!=="wrap"&&o!=="wrapHorizontal"&&e.map(m=>xt(sf,{center:!0,position:m.position,zIndexRange:[15,0],style:{pointerEvents:"none"},children:xt("div",{className:`ri-measureDot${m.snapped?" ri-measureDot--snapped":""}`})},m.id)),o==="distance"&&e.slice(1).map((m,u)=>{let h=e[u].position,p=m.position,g=new qn(...h).distanceTo(new qn(...p));return kr("group",{children:[xt(Di,{points:[h,p],color:Oi,lineWidth:2}),xt(Xn,{position:tC(h,p),children:Co(g*r,t)})]},`${e[u].id}-${m.id}`)}),(o==="angle"||o==="area")&&l.length>=2&&xt(Di,{points:a?[...l,l[0]]:l,color:Oi,lineWidth:2}),o==="angle"&&xt(FI,{positions:l}),c&&!("error"in c)&&kr(dl,{children:[xt(rC,{positions:l,triangles:c.triangles}),xt(Xn,{position:c.center,children:Co(c.area*r**2,t?`${t}\xB2`:"")})]}),o==="pointToPlane"&&e[0]?.faceVertices&&kr(dl,{children:[xt(rC,{positions:e[0].faceVertices,triangles:VI}),xt(Di,{points:[...e[0].faceVertices,e[0].faceVertices[0]],color:Oi,lineWidth:1}),e.length===1&&xt(Xn,{position:e[0].position,children:"Reference plane"})]}),d&&kr(dl,{children:[xt(Di,{points:[e[1].position,d.projection],color:Oi,lineWidth:2}),xt(Di,{points:[e[0].position,d.projection],color:Oi,lineWidth:1,dashed:!0}),xt(Xn,{position:tC(e[1].position,d.projection),children:Co(d.distance*r,t)})]}),(o==="wrap"||o==="wrapHorizontal")&&l.length>=3&&kr(dl,{children:[xt(Di,{points:[...l,l[0]],color:Oi,lineWidth:2}),xt(Xn,{position:zI(l),children:Co(Ov(l,!0)*r,t)})]}),s&&kr(sf,{center:!0,position:s.position,zIndexRange:[20,0],style:{pointerEvents:"none"},children:[xt("div",{className:"ri-measureSnapTarget"}),xt("div",{className:"ri-measureSnapLabel",children:s.snapped==="vertex"?"Vertex":"Edge"})]}),i&&n?xt(UI,{box:n,unit:t,scale:r}):null]})}import{Eraser as iC,PencilRuler as oC,RulerDimensionLine as GI,Undo2 as aC,X as HI}from"lucide-react";import{useEffect as WI,useLayoutEffect as qI,useRef as sC,useState as cd}from"react";import{createPortal as XI}from"react-dom";import{Fragment as ml,jsx as he,jsxs as ct}from"react/jsx-runtime";function lf(e){let t=ce(),{isInsideEditor:r,measurementPanelTarget:n,tier:i}=gi(),o=r&&!jc(i,"calibratedMeasurements"),a=sC(null),[s,l]=cd(!1),[c,d]=cd(""),[m,u]=cd("1"),[h,p]=cd("m"),g=sC(null),b={ready:"measurementReady",approximate:"measurementApproximate","model-changed":"measurementModelChanged","missing-object":"measurementObjectMissing","geometry-changed":"measurementGeometryChanged","pose-changed":"measurementPoseChanged","hidden-object":"measurementObjectHidden",invalid:"measurementInvalid"};qI(()=>{if(!a.current)return;let k=()=>e.onHeight(a.current?.getBoundingClientRect().height??34),T=new ResizeObserver(k);return T.observe(a.current),k(),()=>T.disconnect()},[e.onHeight]);let w=r&&e.active&&!n,{onToggle:f}=e;WI(()=>{w&&f()},[w,f]);let{tool:y,pointCount:S,areaClosed:M}=e,x=y==="angle"?[t("angleFirstArmHint"),t("angleVertexHint"),t("angleSecondArmHint"),t("angleNewHint")][S]:y==="area"?t(M?"areaNewHint":"areaCornersHint"):y==="pointToPlane"?[t("pointToPlaneFaceHint"),t("pointToPlanePointHint"),t("pointToPlaneNewHint")][S]:t(y==="wrap"?"wrapHint":y==="wrapHorizontal"?"wrapHorizontalHint":"distanceHint"),C=r?"ri-measureField":"ri-measureSelect",A=ct("select",{className:C,"aria-label":t("measurementTool"),value:y,disabled:e.disabled,onChange:k=>e.onTool(k.target.value),children:[he("option",{value:"distance",children:t("distance")}),he("option",{value:"angle",children:t("angle")}),he("option",{value:"area",children:t("area")}),he("option",{value:"pointToPlane",children:t("pointToPlane")}),he("option",{value:"wrap",children:t("wrap")}),he("option",{value:"wrapHorizontal",children:t("wrapHorizontal")})]}),P=ct("select",{className:C,"aria-label":t("measurementSnapping"),value:e.snap,disabled:e.disabled,onChange:k=>e.onSnap(k.target.value),children:[he("option",{value:"none",children:t("noSnapping")}),he("option",{value:"auto",children:t("snapAuto")}),he("option",{value:"vertex",children:t("snapVertex")}),he("option",{value:"edge",children:t("snapEdge")})]}),_=e.active&&y==="area"&&!M&&he("button",{type:"button",className:r?"ri-measureAction":"ri-measureFinish",onClick:e.onFinishArea,disabled:e.disabled||S<3,children:t("finishArea")}),R=ct("div",{className:`ri-measureLibrary${r?" ri-measureLibrary--sidebar":""}`,onClick:k=>k.stopPropagation(),onPointerDown:k=>k.stopPropagation(),onPointerMove:k=>k.stopPropagation(),onKeyDown:k=>k.stopPropagation(),children:[r&&he("div",{className:"ri-measureActions",children:ct("button",{type:"button",className:`ri-measureAction ri-measureStart${e.active?" ri-measureStart--active":""}`,disabled:e.disabled,onClick:e.onToggle,"aria-pressed":e.active,children:[he(oC,{size:13}),e.active?t("stopMeasuring"):t("startMeasuring")]})}),r&&e.active&&ct(ml,{children:[ct("div",{className:"ri-measureRow",children:[he("span",{children:"Tool"}),A]}),ct("div",{className:"ri-measureRow",children:[he("span",{children:"Snapping"}),P]}),!e.error&&he("p",{className:"ri-measureGuide",role:"status",children:x}),(S>0||_)&&ct("div",{className:"ri-measureActions",children:[S>0&&ct(ml,{children:[ct("button",{type:"button",className:"ri-measureAction",onClick:e.onUndo,disabled:e.disabled,children:[he(aC,{size:13}),"Undo point"]}),ct("button",{type:"button",className:"ri-measureAction",onClick:e.onClear,disabled:e.disabled,children:[he(iC,{size:13}),"Clear"]})]}),_]})]}),r&&ct("label",{className:"ri-measureRow",children:[he("span",{children:"Bounding box"}),he("input",{type:"checkbox","aria-label":t("toggleBoundingDimensions"),checked:e.showDimensions,disabled:e.disabled,onChange:e.onDimensions})]}),ct("label",{className:"ri-measureRow",children:[he("span",{children:t("measurementSourceUnit")}),he("select",{"aria-label":t("measurementSourceUnit"),className:"ri-measureField",disabled:e.disabled||e.settingsReadOnly,value:e.settings.sourceUnit??"m",onChange:k=>e.onSettings({...e.settings,sourceUnit:k.target.value,metersPerUnit:void 0}),children:Pc.map(k=>he("option",{value:k,children:k},k))})]}),ct("label",{className:"ri-measureRow",children:[he("span",{children:t("measurementDisplayUnit")}),ct("select",{"aria-label":t("measurementDisplayUnit"),className:"ri-measureField",disabled:e.disabled||e.settingsReadOnly,value:e.displayUnit,onChange:k=>e.onSettings({...e.settings,displayUnit:k.target.value}),children:[!jv(e.displayUnit)&&he("option",{value:e.displayUnit,children:e.displayUnit}),Pc.map(k=>he("option",{value:k,children:k},k))]})]}),e.active&&ct(ml,{children:[ct("div",{className:"ri-measureRow",children:[he("span",{children:t("measurementName")}),ct("span",{className:"ri-measureCombo",children:[he("input",{"aria-label":t("measurementName"),className:"ri-measureField",value:c,onChange:k=>d(k.target.value),placeholder:t("measurementNamePlaceholder")}),he("button",{type:"button",className:"ri-measureAction",disabled:e.disabled||e.readOnly||!e.canSave||o,title:o?"Saving measurements requires the Starter plan or higher.":void 0,onClick:()=>{e.onSave(c),d(""),l(!0)},children:t("saveMeasurement")})]})]}),ct("div",{className:"ri-measureRow",title:t("measurementCalibrationHint"),children:[he("span",{children:t("knownMeasurementDistance")}),ct("span",{className:"ri-measureCombo",children:[he("input",{"aria-label":t("knownMeasurementDistance"),type:"number",min:"0",step:"any",className:"ri-measureField",value:m,onChange:k=>u(k.target.value)}),he("select",{"aria-label":t("calibrationUnit"),className:"ri-measureField ri-measureField--unit",value:h,onChange:k=>p(k.target.value),children:Pc.map(k=>he("option",{children:k},k))}),he("button",{type:"button",className:"ri-measureAction",disabled:e.disabled||e.settingsReadOnly||!e.canCalibrate||o,title:o?"Calibration requires the Starter plan or higher.":void 0,onClick:()=>e.onCalibrate(Number(m),h),children:t("calibrateMeasurement")})]})]})]}),e.settings.metersPerUnit!==void 0&&ct("div",{className:"ri-measureRow",children:[he("span",{children:t("measurementCalibratedScale",{scale:e.settings.metersPerUnit.toPrecision(6)})}),he("button",{type:"button",className:"ri-measureAction",disabled:e.disabled||e.settingsReadOnly,onClick:()=>e.onSettings({...e.settings,metersPerUnit:void 0}),children:t("resetMeasurementCalibration")})]}),e.items.length>0&&he("div",{className:"ri-savedMeasurementList",children:e.items.map(k=>{let T=e.results.find(L=>L.id===k.id);return ct("div",{className:"ri-savedMeasurementRow",children:[he("input",{type:"checkbox","aria-label":t("showSavedMeasurement",{name:k.name}),checked:k.visible!==!1,disabled:e.disabled||e.readOnly,onChange:L=>e.onItems(e.items.map(F=>F.id===k.id?{...F,visible:L.target.checked}:F))}),he("input",{"aria-label":t("renameSavedMeasurement",{name:k.name}),className:"ri-savedMeasurementName",defaultValue:k.name,disabled:e.disabled||e.readOnly,onBlur:L=>{let F=L.target.value.trim()||k.name;F!==k.name?e.onItems(e.items.map(j=>j.id===k.id?{...j,name:F}:j)):L.target.value=F}},`${k.id}:${k.name}`),he("span",{className:"ri-savedMeasurementValue",title:t(T?b[T.status]:"measurementWaiting"),children:T?.value!=null?`${T.value.toFixed(3)} ${T.unit}`:"\u2014"}),he("button",{type:"button",className:"ri-savedMeasurementDelete","aria-label":t("deleteSavedMeasurement",{name:k.name}),disabled:e.disabled||e.readOnly,onClick:()=>e.onItems(e.items.filter(L=>L.id!==k.id)),children:he(HI,{size:13})})]},k.id)})}),!e.items.length&&he("p",{className:"ri-measureEmpty",children:t("noSavedMeasurements")}),ct("details",{className:"ri-measureTransfer",children:[he("summary",{children:t("measurementFiles")}),ct("div",{className:"ri-measureActions",children:[he("button",{type:"button",className:"ri-measureAction",disabled:e.disabled||!e.items.length,onClick:e.onExportJson,children:t("exportMeasurementJson")}),he("button",{type:"button",className:"ri-measureAction",disabled:e.disabled||!e.items.length,onClick:e.onExportCsv,children:t("exportMeasurementCsv")}),he("button",{type:"button",className:"ri-measureAction",disabled:e.disabled||e.readOnly||e.settingsReadOnly,onClick:()=>g.current?.click(),children:t("importMeasurementJson")}),he("input",{ref:g,type:"file",accept:".json,application/json",hidden:!0,onChange:k=>{let T=k.target.files?.[0];if(k.target.value="",!!T){if(T.size>5*1024*1024){e.onImport("{}");return}T.text().then(e.onImport).catch(()=>e.onImport("{}"))}}})]})]}),r&&e.error&&he("p",{className:"ri-measureLibraryError",role:"status",children:t.message(e.error)})]});return r?n?XI(R,n):null:ct("div",{ref:a,className:"ri-measureTools",style:{top:e.top},children:[ct("div",{className:"ri-measureToolbarRow",children:[he("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:he(oC,{size:16})}),he("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:he(GI,{size:16})}),he("button",{type:"button",className:"ri-measureSelect","aria-expanded":s,onClick:()=>l(!s),children:t("savedMeasurements",{count:e.items.length})}),e.active&&ct(ml,{children:[A,P]}),S>0&&ct(ml,{children:[he("button",{type:"button",className:"ri-measureButton",onClick:e.onUndo,disabled:e.disabled,title:t("undoMeasurementPoint"),children:he(aC,{size:16})}),he("button",{type:"button",className:"ri-measureButton",onClick:e.onClear,disabled:e.disabled,title:t("clearMeasurements"),children:he(iC,{size:16})})]}),_]}),(e.active||s)&&R,(e.active||e.error)&&he("div",{className:`ri-measureHint${e.error?" ri-measureHint--error":""}`,role:"status",children:e.error?t.message(e.error):x})]})}import{useCallback as $I,useEffect as lC,useRef as ud,useState as YI}from"react";import{useFrame as KI}from"@react-three/fiber";import{Fragment as JI,jsx as cC}from"react/jsx-runtime";var QI=100;function dd({items:e,sceneRef:t,modelId:r,tilesetUrl:n,settings:i,legacyUnit:o,revision:a,onResults:s}){let[l,c]=YI([]),d=ud(""),m=$I(()=>{let w=e.length&&t.current?Es(t.current):void 0,f=e.map(M=>du(M,t.current,r,n,w)),y=f.map(({measurement:M,points:x,status:C})=>_c(M,i,o,x,C)),S=JSON.stringify([f.map(({measurement:M,points:x,status:C})=>[M.id,M.tool,M.visible,C,x.map(A=>[A.position,A.normal,A.faceVertices])]),y]);d.current!==S&&(d.current=S,c(f),s(y))},[e,t,r,n,i,o,s]);lC(()=>{m()},[m,a]);let u=ud(0),h=ud(null),p=ud(m);p.current=m,lC(()=>()=>{h.current&&clearTimeout(h.current)},[]),KI(()=>{if(!e.length)return;let w=u.current+QI-performance.now();w<=0?(u.current=performance.now(),m()):h.current??(h.current=setTimeout(()=>{h.current=null,u.current=performance.now(),p.current()},w))});let{factor:g,displayUnit:b}=Tc(i,o);return cC(JI,{children:l.filter(({measurement:w,status:f})=>w.visible!==!1&&(f==="ready"||f==="approximate")).map(({measurement:w,points:f})=>cC(Ma,{points:f,unit:b,scale:g,box:null,showDimensions:!1,tool:w.tool,areaClosed:w.tool==="area"},w.id))})}import{forwardRef as ZI,useCallback as hl,useEffect as uC,useImperativeHandle as eB,useMemo as dC,useRef as dr}from"react";import{useXR as pC,useXRHitTest as tB,useXRInputSourceEvent as rB}from"@react-three/xr";import{useFrame as nB}from"@react-three/fiber";import{Matrix4 as iB,Vector3 as mC}from"three";import{Fragment as uB,jsx as fl,jsxs as bC}from"react/jsx-runtime";var oB=1,hC=1,aB=.1,sB=10;function lB(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:oB/s,offset:[-o,-e.min[1],-a]}}function fC(e){let t=e[0].clientX-e[1].clientX,r=e[0].clientY-e[1].clientY;return Math.hypot(t,r)}function gC(e){let t=e[0].clientX-e[1].clientX,r=e[0].clientY-e[1].clientY;return Math.atan2(r,t)}var cB=ZI(function({box:t,scaleMode:r,children:n,onARStateChange:i},o){let a=dr(null),s=dr(null),l=dr(null),c=pC(j=>j.session!=null),d=pC(j=>j.mode==="immersive-ar"),m=dC(()=>t?lB(t,r):null,[t,r]),u=dr(new mC(0,0,-hC)),h=dr(1),p=dr(0),g=dr(!0),b=dr(!1),w=dC(()=>new iB,[]),f=dr(new mC),y=dr(!1),S=dr(null),M=dr(!1),x=dr(0),C=dr(0),A=dr(1),P=dr(0),_=hl(()=>{if(!i||!d)return;let j={canPlace:y.current,isPlacementMode:g.current,isModelPlaced:b.current},V=S.current;V&&V.canPlace===j.canPlace&&V.isPlacementMode===j.isPlacementMode&&V.isModelPlaced===j.isModelPlaced||(S.current=j,i(j))},[d,i]),R=hl(()=>!d||!y.current?!1:(u.current.copy(f.current),b.current=!0,g.current=!1,_(),!0),[_,d]),k=hl(()=>{d&&(g.current=!0,_())},[_,d]),T=hl(()=>{let j=R();return!j&&d&&(g.current=!1,_()),j},[_,d,R]),L=hl(()=>{d&&(g.current=!1,_())},[_,d]);eB(o,()=>({placeCurrent:R,startPlacementMode:k,finishPlacementMode:T,cancelPlacementMode:L}),[L,T,R,k]),uC(()=>{if(!c){u.current.set(0,0,-hC),h.current=1,p.current=0,y.current=!1,M.current=!1,g.current=!0,b.current=!1,S.current=null;return}d&&(y.current=!1,M.current=!1,g.current=!0,b.current=!1,S.current=null,_())},[_,c,d]),tB((j,V)=>{if(!d||j.length===0){y.current&&(y.current=!1,_());return}V(w,j[0])&&(f.current.setFromMatrixPosition(w),y.current||(y.current=!0,_()))},"viewer"),rB("all","select",()=>{!d||M.current||!g.current||R()},[d,R]),uC(()=>{if(!d)return;let j=O=>{O.touches.length===2&&(M.current=!0,x.current=fC(O.touches),C.current=gC(O.touches),A.current=h.current,P.current=p.current)},V=O=>{if(!M.current||O.touches.length!==2)return;O.preventDefault();let Z=fC(O.touches);if(x.current>0){let J=Z/x.current;h.current=Math.min(sB,Math.max(aB,A.current*J))}let ee=gC(O.touches);p.current=P.current-(ee-C.current)},E=O=>{O.touches.length===0&&requestAnimationFrame(()=>{M.current=!1})};return window.addEventListener("touchstart",j),window.addEventListener("touchmove",V,{passive:!1}),window.addEventListener("touchend",E),window.addEventListener("touchcancel",E),()=>{window.removeEventListener("touchstart",j),window.removeEventListener("touchmove",V),window.removeEventListener("touchend",E),window.removeEventListener("touchcancel",E)}},[d]),nB(()=>{let j=a.current,V=s.current;if(!j||!V)return;!c||!m?(j.visible=!0,j.position.set(0,0,0),j.rotation.set(0,0,0),V.scale.setScalar(1)):(j.visible=!d||b.current,j.position.copy(u.current),j.rotation.set(0,p.current,0),V.scale.setScalar(m.scale*h.current));let E=l.current;if(E){let O=d&&g.current&&y.current;E.visible=O,O&&E.position.copy(f.current)}});let F=c&&m?m.offset:[0,0,0];return bC(uB,{children:[bC("mesh",{ref:l,visible:!1,rotation:[-Math.PI/2,0,0],children:[fl("ringGeometry",{args:[.05,.07,32]}),fl("meshBasicMaterial",{color:"#22d3ee",transparent:!0,opacity:.95})]}),fl("group",{ref:a,children:fl("group",{ref:s,children:fl("group",{position:F,children:n})})})]})}),vC=cB;import{useRef as Po,useState as dB,useCallback as bn,useEffect as pB}from"react";import{jsx as Dr,jsxs as cf}from"react/jsx-runtime";var mB={up:{width:38,height:22},down:{width:38,height:22},left:{width:22,height:38},right:{width:22,height:38}},hB={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"},pd=({direction:e})=>{let t=mB[e],r=hB[e];return cf("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:[Dr("polyline",{points:r,stroke:"rgba(0, 0, 0, 0.9)",strokeWidth:"6",strokeLinecap:"round",strokeLinejoin:"round"}),Dr("polyline",{points:r,stroke:"#2095F2",strokeWidth:"4",strokeLinecap:"round",strokeLinejoin:"round"})]})},$n=16,fB={"bottom-left":{bottom:$n,left:$n,top:"auto",right:"auto",transform:"none"},"bottom-right":{bottom:$n,right:$n,top:"auto",left:"auto",transform:"none"},"top-left":{top:$n,left:$n,bottom:"auto",right:"auto",transform:"none"},"top-right":{top:$n,right:$n,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:$n,left:"50%",bottom:"auto",right:"auto",transform:"translateX(-50%)"}},gB=({controlsRef:e,enabled:t=!0,opacity:r=.9,moveSensitivity:n=.001,rotateSensitivity:i=.01,position:o="center-bottom"})=>{let a=ce(),s=Po(null),[l,c]=dB({x:0,y:0}),d=Po(!1),m=Po({x:0,y:0}),u=Po(void 0),h=Po(void 0),p=Po(null),g=Po(0),b=()=>e.current,w=(L,F,j)=>{let V=Math.hypot(L,F);if(V>j){let E=j/V;return{x:L*E,y:F*E}}return{x:L,y:F}},f=L=>{let j=Math.abs(L);return j<.12?0:Math.sign(L)*((j-.12)/(1-.12))},y=bn(()=>{let L=()=>{let{x:F,y:j}=m.current,V=f(F),E=f(j);if(t&&(V!==0||E!==0)){let O=b();O&&O.rotate(-V*i,-E*i,!0)}u.current=requestAnimationFrame(L)};u.current=requestAnimationFrame(L)},[t,i]),S=bn(()=>{u.current&&cancelAnimationFrame(u.current)},[]),M=bn((L,F)=>{if(!s.current||!d.current)return;let j=s.current.getBoundingClientRect(),V=j.left+j.width/2,E=j.top+j.height/2,O=j.width/2-18,Z=L-V,ee=F-E,J=w(Z,ee,O);c(J),m.current={x:J.x/O,y:J.y/O}},[]),x=bn(L=>{if(!t)return;L.preventDefault(),L.stopPropagation(),d.current=!0,y();let F="touches"in L?L.touches[0]:L;M(F.clientX,F.clientY)},[t,y,M]),C=bn(L=>{if(!d.current)return;L.preventDefault();let F="touches"in L?L.touches[0]:L;M(F.clientX,F.clientY)},[M]),A=bn(()=>{d.current=!1,c({x:0,y:0}),m.current={x:0,y:0},S()},[S]),P=n*10,_=bn(L=>{t&&b()?.forward(L*P,!0)},[t,P]),R=bn(L=>{t&&b()?.truck(L*P,0,!0)},[t,P]),k=bn((L,F,j)=>{if(!t)return;h.current&&cancelAnimationFrame(h.current),p.current={control:L,amount:F,action:j},g.current=0,j(F);let V=E=>{if(!p.current)return;if(g.current===0){g.current=E,h.current=requestAnimationFrame(V);return}if(E-g.current>200){let{amount:Z,action:ee}=p.current;ee(Z),g.current=E}h.current=requestAnimationFrame(V)};h.current=requestAnimationFrame(V)},[t]),T=bn(L=>{p.current?.control===L&&(h.current&&(cancelAnimationFrame(h.current),h.current=void 0),p.current=null,g.current=0)},[]);return pB(()=>(window.addEventListener("mousemove",C),window.addEventListener("mouseup",A),window.addEventListener("touchmove",C,{passive:!1}),window.addEventListener("touchend",A),window.addEventListener("touchcancel",A),()=>{window.removeEventListener("mousemove",C),window.removeEventListener("mouseup",A),window.removeEventListener("touchmove",C),window.removeEventListener("touchend",A),window.removeEventListener("touchcancel",A),S(),h.current&&cancelAnimationFrame(h.current)}),[C,A,S]),t?Dr("div",{className:"mc__wrapper",style:{opacity:r,...fB[o]},children:cf("div",{className:"mc__dpad",children:[Dr("button",{"aria-label":a("moveForward"),className:"mc__arrow mc__arrow--up",onMouseDown:()=>k("up",1,_),onMouseUp:()=>T("up"),onMouseLeave:()=>T("up"),onTouchStart:L=>{L.preventDefault(),k("up",1,_)},onTouchEnd:()=>T("up"),onTouchCancel:()=>T("up"),children:Dr(pd,{direction:"up"})}),cf("div",{className:"mc__middle-row",children:[Dr("button",{"aria-label":a("moveLeft"),className:"mc__arrow mc__arrow--left",onMouseDown:()=>k("left",-1,R),onMouseUp:()=>T("left"),onMouseLeave:()=>T("left"),onTouchStart:L=>{L.preventDefault(),k("left",-1,R)},onTouchEnd:()=>T("left"),onTouchCancel:()=>T("left"),children:Dr(pd,{direction:"left"})}),Dr("div",{ref:s,className:"mc__joystick",onMouseDown:x,onTouchStart:x,children:Dr("div",{className:"mc__knob",style:{transform:`translate(${l.x}px, ${l.y}px)`}})}),Dr("button",{"aria-label":a("moveRight"),className:"mc__arrow mc__arrow--right",onMouseDown:()=>k("right",1,R),onMouseUp:()=>T("right"),onMouseLeave:()=>T("right"),onTouchStart:L=>{L.preventDefault(),k("right",1,R)},onTouchEnd:()=>T("right"),onTouchCancel:()=>T("right"),children:Dr(pd,{direction:"right"})})]}),Dr("button",{"aria-label":a("moveBackward"),className:"mc__arrow mc__arrow--down",onMouseDown:()=>k("down",-1,_),onMouseUp:()=>T("down"),onMouseLeave:()=>T("down"),onTouchStart:L=>{L.preventDefault(),k("down",-1,_)},onTouchEnd:()=>T("down"),onTouchCancel:()=>T("down"),children:Dr(pd,{direction:"down"})})]})}):null},yC=gB;import{useEffect as md,useMemo as bB,useRef as xC,useState as wC}from"react";import{Check as vB,Link as yB,SlidersHorizontal as xB,X as wB}from"lucide-react";import{jsx as Ca,jsxs as uf}from"react/jsx-runtime";function SC({product:e,options:t,onSelectionsChange:r,top:n=12}){let i=ce(),o={"--ri-product-dock-top":`${n}px`},{adapter:a,urlParam:s,onConfigurationChange:l,defaultClosed:c}=t,d=bB(()=>{let x=s&&typeof window<"u"?new URLSearchParams(window.location.search).get(s):null;return x?Jv(x,e.definition):e.selections},[]),m=sx({product:e.definition,initialSelections:d,adapter:a}),{selections:u}=m.configuration,h=JSON.stringify(u),[p,g]=wC(()=>!c&&(typeof window>"u"||window.innerWidth>640)),[b,w]=wC(!1),f=xC(r);f.current=r,md(()=>{f.current(u)},[h]);let y=xC(l);y.current=l,md(()=>{y.current?.(m.configuration,m.checkoutUrl)},[m.configuration.key,m.checkoutUrl]);let S=()=>{let x=new URL(window.location.href);return x.searchParams.set(s,Qv(u)),x.href};md(()=>{s&&window.history.replaceState(window.history.state,"",S())},[s,h]),md(()=>{if(!b)return;let x=setTimeout(()=>w(!1),2e3);return()=>clearTimeout(x)},[b]);let M=!!s&&typeof window<"u"&&window.self===window.top;return p?uf("div",{className:"ri-productDock",style:o,children:[Ca("button",{type:"button",className:"ri-productDockClose",onClick:()=>g(!1),title:i("productHideOptions"),"aria-label":i("productHideOptions"),children:Ca(wB,{size:14,"aria-hidden":"true"})}),Ca(lm,{configurator:m,actions:M?uf("button",{type:"button",onClick:()=>{navigator.clipboard.writeText(S()).then(()=>w(!0)).catch(()=>{})},children:[b?Ca(vB,{size:13,"aria-hidden":"true"}):Ca(yB,{size:13,"aria-hidden":"true"}),i(b?"productLinkCopied":"productCopyLink")]}):void 0})]}):uf("button",{type:"button",className:"ri-productDockToggle",style:o,onClick:()=>g(!0),title:i("productShowOptions"),children:[Ca(xB,{size:14,"aria-hidden":"true"}),i("productOptions")]})}import{useMemo as MB}from"react";import{useEffect as SB}from"react";import{useThree as MC}from"@react-three/fiber";var CC=new WeakMap;function hd(e){let t=MC(n=>n.get),r=MC(n=>n.setEvents);SB(()=>{if(!e)return;let n=CC.get(t);if(!n){let o=new Set;n=o,CC.set(t,o);let a=t().events.filter;r({filter:(s,l)=>{let c=a?a(s,l):s;return o.size===0?c:c.filter(d=>{for(let m of o)if(!m(d))return!1;return!0})}})}n.add(e);let i=n;return()=>{i.delete(e)}},[e,t,r])}function df({setAside:e,nodeRefs:t}){let r=MB(()=>{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,c]of Object.entries(o))s.set(c,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 hd(r),null}import{useEffect as gl,useMemo as Pa,useRef as _B,useState as EC}from"react";import{Edges as AB}from"@react-three/drei";import{useFrame as RB,useThree as pf}from"@react-three/fiber";import{DoubleSide as EB,Quaternion as kB,Vector3 as To}from"three";import{Vector3 as fd,Plane as CB}from"three";var PC={x:0,y:1,z:2},PB=e=>Math.min(Math.max(e,0),1);function TB(e,t){let r=1/0,n=-1/0;for(let i=0;i<8;i++){let o=new fd(...e.min);for(let s=0;s<3;s++)i&1<<s&&o.setComponent(s,e.max[s]);let a=o.dot(t);r=Math.min(r,a),n=Math.max(n,a)}return[r,n]}function TC(e,t){if(!e.enabled||t.min.some((n,i)=>!Number.isFinite(n)||!Number.isFinite(t.max[i])||n>t.max[i]))return{cuts:[],intersection:!1};let r=(n,i,o,a,s)=>{let l=s?new fd(...s).normalize():new fd().setComponent(PC[i],1),[c,d]=TB(t,l),m=c+(d-c)*PB(o),u=a?1:-1;return{id:n,direction:l,min:c,max:d,coordinate:m,plane:new CB(l.clone().multiplyScalar(u),-m*u)}};if(e.mode==="box"){let n=e.box??{min:[0,0,0],max:[1,1,1]};return{intersection:!!e.invertBox,cuts:["x","y","z"].flatMap((i,o)=>[r(`${i}-min`,i,n.min[o],!e.invertBox),r(`${i}-max`,i,n.max[o],!!e.invertBox)])}}return e.mode==="planes"?{intersection:!1,cuts:(e.planes??[]).filter(n=>n.enabled).map(n=>r(n.id,n.axis,n.position,n.flip,n.normal))}:{intersection:!1,cuts:[r("plane",e.axis,e.position,e.flip,e.normal)]}}function _C(e,t,r){return e.length?t?e.some(n=>n.distanceToPoint(r)>=-1e-4):e.every(n=>n.distanceToPoint(r)>=-1e-4):!0}function gd(e,t,r){if(e.mode==="planes")return{planes:e.planes?.map(n=>n.id===t?{...n,position:r}:n)};if(e.mode==="box"){let n=e.box??{min:[0,0,0],max:[1,1,1]},i=[...n.min],o=[...n.max],a=PC[t[0]];return t.endsWith("min")?i[a]=Math.max(0,Math.min(r,o[a]-.001)):o[a]=Math.min(1,Math.max(r,i[a]+.001)),{box:{min:i,max:o}}}return{position:r}}function AC(e,t,r,n){let i=r.clone().addScaledVector(n,-r.dot(n));if(i.lengthSq()<1e-8)return null;i.normalize();let o=e.direction.dot(i);if(Math.abs(o)<1e-8)return null;let a=t.clone().sub(e.origin).dot(i)/o;return Number.isFinite(a)?e.at(a,new fd).dot(n):null}import{DoubleSide as bd}from"three";function RC(){let e=new Map;function t(r){let n=e.get(r);n&&(r.clippingPlanes===n.owned&&(r.clippingPlanes=n.planes,r.clipShadows=n.shadows,r.clipIntersection=n.intersection,r.side===bd&&(r.side=n.side),r.needsUpdate=!0),e.delete(r))}return{apply(r,n,i){let o=e.get(r);o&&r.clippingPlanes!==o.owned&&(e.delete(r),o=void 0),o||(o={planes:r.clippingPlanes,side:r.side,shadows:r.clipShadows,intersection:r.clipIntersection,owned:n},e.set(r,o)),r.side!==bd&&(o.side=r.side),!(r.clippingPlanes===n&&r.clipIntersection===i&&r.side===bd&&r.clipShadows)&&(o.owned=n,r.clippingPlanes=n,r.clipIntersection=i,r.clipShadows=!0,r.side=bd,r.needsUpdate=!0)},retain(r){for(let n of e.keys())r.has(n)||t(n)},restore(){for(let r of e.keys())t(r)}}}import{jsx as vd,jsxs as OB}from"react/jsx-runtime";function mf({section:e,box:t,modelRef:r,showHandle:n,onChange:i,onDraggingChange:o}){let a=pf(f=>f.gl),s=pf(f=>f.raycaster),l=pf(f=>f.invalidate),c=Pa(()=>kv(e),[e]),{cuts:d,intersection:m}=Pa(()=>t?TC(c,t):{cuts:[],intersection:!1},[c,t]),u=Pa(()=>d.map(f=>f.plane),[d]),h=u.length>0,p=Pa(()=>RC(),[]);gl(()=>{if(!h)return;let f=a.localClippingEnabled;return a.localClippingEnabled=!0,l(),()=>{p.restore(),a.localClippingEnabled=f,l()}},[h,a,p,l]),gl(()=>{l()},[u,m,l]);let g=Pa(()=>new Set,[]);RB(()=>{h&&(g.clear(),r.current?.traverse(f=>{let y=f.material;if(y){if(!Array.isArray(y)){g.add(y),p.apply(y,u,m);return}for(let S of y)g.add(S),p.apply(S,u,m)}}),p.retain(g))});let b=Pa(()=>h?f=>{if(f.object.userData.riSectionHandle)return!0;let y=f.object;for(;y&&y!==r.current;)y=y.parent;return!y||_C(u,m,f.point)}:null,[h,u,m,r]);hd(b),gl(()=>{if(!h)return;let f=s,y=f.firstHitOnly;return f.firstHitOnly=!1,()=>{f.firstHitOnly=y}},[h,s]),gl(()=>()=>o(!1),[o]);let w=d.find(f=>f.id===c.activePlaneId)??(c.mode==="planes"&&c.activePlaneId?null:d[0]);return!h||!n||!t||!w?null:vd(DB,{cut:w,box:t,onMove:f=>i(gd(c,w.id,f)),onDraggingChange:o},w.id)}function DB({cut:e,box:t,onMove:r,onDraggingChange:n}){let[i,o]=EC(!1),[a,s]=EC(!1),l=_B(null),c=new To(...t.min).add(new To(...t.max)).multiplyScalar(.5);c.addScaledVector(e.direction,e.coordinate-c.dot(e.direction));let d=new kB().setFromUnitVectors(new To(0,0,1),e.direction),m=new To(1,0,0).applyQuaternion(d),u=new To(0,1,0).applyQuaternion(d),h=new To(...t.max).sub(new To(...t.min)),p=b=>Math.max(.01,Math.abs(b.x)*h.x+Math.abs(b.y)*h.y+Math.abs(b.z)*h.z)*1.08;gl(()=>()=>n(!1),[n]);let g=b=>{l.current&&(b.target?.releasePointerCapture?.(b.pointerId),l.current=null,s(!1),n(!1))};return OB("mesh",{ref:b=>{b&&($o(b),b.userData.riSectionHandle=!0)},position:c,quaternion:d,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(),view:b.ray.direction.clone(),at:b.point.dot(e.direction),cut:e.coordinate},s(!0),n(!0)},onPointerMove:b=>{let w=l.current;if(!w)return;b.stopPropagation();let f=AC(b.ray,w.point,w.view,e.direction);f!==null&&e.max>e.min&&r(Math.max(0,Math.min(1,(w.cut+f-w.at-e.min)/(e.max-e.min))))},onPointerUp:g,onPointerCancel:g,onClick:b=>b.stopPropagation(),children:[vd("planeGeometry",{args:[p(m),p(u)]}),vd("meshBasicMaterial",{color:"#22d3ee",transparent:!0,opacity:a?.22:i?.16:.08,side:EB,depthWrite:!1,toneMapped:!1}),vd(AB,{color:"#22d3ee",renderOrder:3})]})}import{HexColorPicker as LB}from"react-colorful";import{jsx as yd,jsxs as kC}from"react/jsx-runtime";var hf=({colorPicker:e,onClose:t,itemMaterials:r,setItemMaterials:n,inline:i=!1})=>{let o=ce();return kC("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:[yd("p",{className:"ri-popoverLabel",children:o("color")}),yd(LB,{color:r[e.objectId]?.hex??"#ffffff",onChange:a=>n(s=>({...s,[e.objectId]:{...s[e.objectId],hex:a}}))}),kC("div",{className:"ri-inlineRow",children:[yd("span",{className:"ri-colorCode",children:r[e.objectId]?.hex??"#ffffff"}),yd("button",{className:"ri-secondaryButton",onClick:t,children:o("done")})]})]})};import{jsx as Bt,jsxs as Yn}from"react/jsx-runtime";var ff=({materialPopup:e,textureUrl:t,triggerFileUpload:r,clearTexture:n,canPlaceImage:i=!0,inline:o=!1,offset:a,rotationDegrees:s,onOffsetChange:l,onRotationChange:c,isPositioning:d=!1,onEndPositioning:m})=>{let u=ce();return Yn("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:[Bt("div",{className:"ri-popoverHeader",children:Bt("p",{className:"ri-popoverLabel",style:{marginBottom:0},children:u("material")})}),Yn("div",{className:"ri-materialBody",children:[t?Bt("div",{className:"ri-previewFrame",children:Bt("img",{src:t,alt:u("texturePreview"),className:"ri-previewImage"})}):Yn("div",{className:"ri-emptyState",children:[Bt("svg",{width:"24",height:"24",fill:"none",stroke:"currentColor",strokeWidth:1.5,viewBox:"0 0 24 24",children:Bt("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"})}),Bt("span",{style:{fontSize:12},children:u("noTextureApplied")})]}),i?Bt("button",{onClick:()=>r(e.objectId),className:"ri-uploadButton",children:u(t?"replaceImage":"uploadImage")}):Bt("p",{className:"ri-formatHint",children:u("noTextureCoordinates")}),t&&Bt("button",{onClick:()=>n(e.objectId),className:"ri-removeButton",children:u("removeTexture")}),i?Bt("p",{className:"ri-formatHint",children:"JPG \xB7 PNG \xB7 WebP"}):null,t&&(l||c)&&Yn("div",{className:"ri-texturePosition",children:[Bt("p",{className:"ri-texturePositionLabel",children:u("texturePosition")}),Yn("div",{className:"ri-texturePositionGrid",children:[Yn("label",{className:"ri-texturePositionField",children:[Bt("span",{children:u("offsetX")}),Bt("input",{type:"number",step:.01,value:a?.[0]??0,onChange:h=>l?.(e.objectId,0,Number(h.target.value))})]}),Yn("label",{className:"ri-texturePositionField",children:[Bt("span",{children:u("offsetY")}),Bt("input",{type:"number",step:.01,value:a?.[1]??0,onChange:h=>l?.(e.objectId,1,Number(h.target.value))})]})]}),Yn("label",{className:"ri-texturePositionField ri-texturePositionField--full",children:[Bt("span",{children:u("rotation")}),Yn("div",{className:"ri-texturePositionSliderRow",children:[Bt("input",{type:"range",min:0,max:360,step:1,value:s??0,onChange:h=>c?.(e.objectId,Number(h.target.value))}),Bt("input",{type:"number",min:0,max:360,step:1,value:Math.round(s??0),onChange:h=>c?.(e.objectId,Number(h.target.value))})]})]}),d?Bt("button",{type:"button",className:"ri-uploadButton",onClick:m,title:u("confirmTexturePosition"),children:u("donePositioning")}):Bt("p",{className:"ri-texturePositionHint",children:u("textureOffsetHint")})]})]})]})};import{Fragment as IB,useEffect as gf,useLayoutEffect as BB,useRef as bf,useState as vf}from"react";import{Fragment as yf,jsx as tr,jsxs as Ta}from"react/jsx-runtime";function DC({entries:e}){return tr(yf,{children:e.map(([t,r])=>{let n=r!==null&&typeof r=="object",i=n?Object.entries(r):[];return n&&i.length>0?Ta("div",{className:"ri-left-panel__data-group",children:[tr("span",{className:"ri-left-panel__data-key",children:t}),tr("div",{className:"ri-left-panel__data-children",children:tr(DC,{entries:i})})]},t):Ta("div",{className:"ri-left-panel__data-row",children:[tr("span",{className:"ri-left-panel__data-key",children:t}),tr("span",{className:`ri-left-panel__data-value ri-left-panel__data-value--${typeof r}`,children:n?Array.isArray(r)?"[]":"{}":String(r)})]},t)})})}function NB({content:e}){let t=e!=null,[r,n]=vf(t),[i,o]=vf(t),a=bf(e);return t&&(a.current=e),gf(()=>{if(t){n(!0);return}if(r){o(!1);let s=setTimeout(()=>n(!1),300);return()=>clearTimeout(s)}},[t,r]),gf(()=>{if(r&&t){let s=requestAnimationFrame(()=>o(!0));return()=>cancelAnimationFrame(s)}},[r,t]),r?tr("div",{className:`ri-left-panel__action-extra${i?" ri-left-panel__action-extra--open":""}`,children:tr("div",{className:"ri-left-panel__action-extra-inner",children:e??a.current})}):null}function xf({isOpen:e,selectedObject:t,currentAction:r,onClose:n,onAction:i,renderActionExtra:o,translateDefaultActions:a=!1}){let s=ce(),l=bf(null),c=bf(()=>{});BB(()=>{if(!e)return;let p=l.current,g=document.activeElement;return c.current=()=>{g instanceof HTMLElement&&g!==document.body&&g.isConnected?g.focus({preventScroll:!0}):p?.closest(".ri-viewerLeft")?.querySelector(".ri-canvasArea")?.focus({preventScroll:!0})},()=>{p?.contains(document.activeElement)&&g instanceof HTMLElement&&g.isConnected&&g.focus({preventScroll:!0})}},[e]);let[d,m]=vf(t);gf(()=>{t&&m(t)},[t]);let u=t??d,h=u?Object.entries(u).filter(([p])=>p!=="actions"&&p!=="decals"):[];return tr("div",{ref:l,inert:!e,className:`ri-left-panel ${e?"ri-left-panel--open":"ri-left-panel--closed"}`,children:u&&Ta(yf,{children:[Ta("div",{className:"ri-left-panel__header",children:[tr("p",{className:"ri-left-panel__title",children:u.label}),tr("button",{onClick:()=>{c.current(),n()},className:"ri-left-panel__close-btn","aria-label":s("closePanel"),children:"\u2715"})]}),h.length>0&&tr("div",{className:"ri-left-panel__data",children:tr(DC,{entries:h})}),tr("hr",{className:"ri-left-panel__divider"}),u.actions&&u.actions.length>0&&Ta(yf,{children:[tr("div",{className:"ri-left-panel__actions-label",children:s("actions")}),tr("div",{className:"ri-left-panel__actions-list",children:u.actions.map((p,g)=>{let b=r?.action.id===p.id&&(r.binding===u||r.binding?.id===u.id||r.binding?.modelObjectId===u.modelObjectId||r.objectId===u.id||r.objectId===u.modelObjectId),w=o?.(p.id);return Ta(IB,{children:[tr("button",{onClick:f=>i({objectId:u.modelObjectId||u.id||"",action:p,binding:u,screenX:f.clientX,screenY:f.clientY}),className:["ri-left-panel__action-btn",`ri-left-panel__action-btn--${p.id}`,b?"ri-left-panel__action-btn--active":""].filter(Boolean).join(" "),"data-action-id":p.id,"data-label":p.label,children:a?s.message(p.label):p.label}),tr(NB,{content:w})]},g)})})]})]})})}import{useMemo as zB,useState as LC}from"react";import{Boxes as VB,Focus as FB}from"lucide-react";import{useState as jB}from"react";import{jsx as Kn,jsxs as bl}from"react/jsx-runtime";function OC({openButtonLabel:e,openButtonAriaLabel:t,eyebrow:r,title:n,searchValue:i,onSearchChange:o,searchPlaceholder:a,children:s,isOpen:l,onToggle:c,openButtonIcon:d,closeButtonIcon:m,closeButtonAriaLabel:u}){let h=ce(),[p,g]=jB(!1),b=l!==void 0?l:p,w=f=>{l===void 0&&g(f),c?.(f)};return bl("div",{className:`ri-sidepanel-wrap ${b?"ri-sidepanel-wrap--open":"ri-sidepanel-wrap--closed"}`,children:[!b&&bl("button",{type:"button",className:"ri-sidepanel__open-btn",onClick:()=>w(!0),"aria-label":t,title:h("openPanel"),children:[d,e?Kn("span",{children:e}):null]}),bl("div",{className:`ri-sidepanel ${b?"ri-sidepanel--open":"ri-sidepanel--closed"}`,"aria-hidden":!b,children:[bl("div",{className:"ri-sidepanel__header",children:[bl("div",{className:"ri-sidepanel__header-top",children:[Kn("span",{className:"ri-sidepanel__eyebrow",children:r}),Kn("button",{type:"button",className:"ri-sidepanel__close-btn",onClick:()=>w(!1),"aria-label":u,title:h("close"),children:m??Kn("svg",{width:"12",height:"12",viewBox:"0 0 12 12",fill:"none","aria-hidden":"true",children:Kn("path",{d:"M1 1L11 11M11 1L1 11",stroke:"currentColor",strokeWidth:"1.6",strokeLinecap:"round"})})})]}),Kn("p",{className:"ri-sidepanel__title",children:n})]}),Kn("div",{className:"ri-sidepanel__search-wrap",children:Kn("input",{className:"ri-sidepanel__search",type:"text",placeholder:a,value:i,onChange:f=>o(f.target.value)})}),Kn("div",{className:"ri-sidepanel__list",children:s})]})]})}import{jsx as Qn,jsxs as UB}from"react/jsx-runtime";function wf({objectBindings:e,onAction:t,onFocus:r,onHover:n,isOpen:i,onToggle:o,isolatedKeys:a=null,onIsolate:s}){let l=ce(),[c,d]=LC(null),[m,u]=LC(""),h=zB(()=>Object.entries(e).filter(([p,g])=>{let b=m.toLowerCase();return p.toLowerCase().includes(b)||(g.label??"").toLowerCase().includes(b)}),[e,m]);return Qn(OC,{openButtonLabel:"",openButtonAriaLabel:l("openSceneObjectsPanel"),openButtonIcon:Qn(VB,{width:16,height:16,"aria-hidden":"true"}),eyebrow:l("sceneObjects"),title:l("visibleEntries",{count:h.length}),searchValue:m,onSearchChange:u,searchPlaceholder:l("searchNodesLabels"),isOpen:i,onToggle:o,closeButtonAriaLabel:l("closeSceneObjectsPanel"),children:h.map(([p,g])=>{let b=g.visible!==!1,w=c===p,f=a?.has(p)??!1;return UB("div",{onClick:()=>r(g),onMouseEnter:()=>{d(p),n?.(g)},onMouseLeave:()=>{d(null),n?.(null)},className:`ri-sidepanel__row${w?" ri-sidepanel__row--hovered":""}${a!==null&&!f?" ri-sidepanel__row--setAside":""}`,children:[Qn("button",{type:"button",className:`ri-sidepanel__label ri-sidepanel__labelButton${w?" ri-sidepanel__label--hovered":""}`,onFocus:()=>{d(p),n?.(g)},onBlur:()=>{d(null),n?.(null)},children:g.label??p}),s?Qn("button",{type:"button",onClick:S=>{S.stopPropagation(),s(g)},className:`ri-sidepanel__isolate-btn${f?" ri-sidepanel__isolate-btn--active":""}`,title:l(f?"showAll":"isolate"),"aria-label":l(f?"showAllObject":"isolateObject",{name:g.label??p}),"aria-pressed":f,children:Qn(FB,{width:14,height:14,"aria-hidden":"true"})}):null,Qn("button",{type:"button",onClick:S=>{S.stopPropagation(),t?.({objectId:p,action:{id:"toggle-visibility",label:"Toggle Visibility",type:"command"},binding:g})},className:"ri-sidepanel__vis-btn",title:l(b?"hide":"show"),"aria-label":l(b?"hideObject":"showObject",{name:g.label??p}),children:Qn("span",{className:`ri-sidepanel__checkbox${b?" ri-sidepanel__checkbox--checked":""}`,children:b&&Qn("svg",{width:"9",height:"9",viewBox:"0 0 10 10",fill:"none",children:Qn("path",{d:"M1.5 5L4 7.5L8.5 2.5",stroke:"white",strokeWidth:"1.8",strokeLinecap:"round",strokeLinejoin:"round"})})})})]},p)})})}import{useEffect as jC,useId as GB,useRef as zC,useState as VC}from"react";function IC(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 BC(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 NC(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 c=((o+l)%e.length+e.length)%e.length;if(e[c].label.toLocaleLowerCase().startsWith(s))return c}return null}import{jsx as xd,jsxs as FC}from"react/jsx-runtime";var HB=600;function UC({objects:e,selectedKey:t,onHighlight:r,onSelect:n,onClearSelection:i}){let o=ce(),a=GB(),[s,l]=VC(!1),[c,d]=VC(null),m=zC({query:"",at:0}),u=c?e.findIndex(S=>S.key===c):-1,h=u>=0?e[u]:null;jC(()=>{t&&e.some(S=>S.key===t)&&d(t)},[t,e]);let p=s?h?.binding??null:null,g=zC(r);g.current=r,jC(()=>{if(s)return g.current(p),()=>g.current(null)},[s,p]);let b=S=>{S!==null&&e[S]&&d(e[S].key)},w=S=>{let M=h?u:-1,x=BC(S.key,Math.max(M,0),e.length);if(x!==null){S.preventDefault(),b(M<0&&S.key!=="End"?0:x);return}if(S.key==="Enter"||S.key===" "){if(!h)return;S.preventDefault(),n(h.binding);return}if(S.key==="Escape"){if(!t)return;S.preventDefault(),S.stopPropagation(),i();return}if(S.key.length===1&&S.key!==" "&&!S.ctrlKey&&!S.metaKey&&!S.altKey){let C=Date.now(),A=m.current;A.query=C-A.at>HB?S.key:A.query+S.key,A.at=C,S.preventDefault(),b(NC(e,M,A.query))}};if(e.length===0)return null;let f=`${a}-option`,y=`${a}-hint`;return FC("div",{className:`ri-objectNavigator${s?" ri-objectNavigator--focused":""}`,children:[xd("div",{role:"listbox",tabIndex:0,className:"ri-objectNavigator__list","aria-label":o("objectNavigator"),"aria-describedby":y,"aria-activedescendant":h?f:void 0,onFocus:()=>{l(!0),h||d(e[0].key)},onBlur:()=>l(!1),onKeyDown:w,children:h?FC("div",{id:f,role:"option","aria-selected":h.key===t,"aria-setsize":e.length,"aria-posinset":u+1,className:`ri-objectNavigator__option${h.key===t?" ri-objectNavigator__option--selected":""}`,children:[xd("span",{className:"ri-objectNavigator__name",children:h.label}),xd("span",{className:"ri-objectNavigator__position","aria-hidden":"true",children:o("objectNavigatorPosition",{position:u+1,count:e.length})})]}):null}),xd("div",{id:y,className:"ri-objectNavigator__hint",children:o("objectNavigatorHint")})]})}import{RotateCcw as PN}from"lucide-react";import{useRef as Tt,useEffect as _a,useMemo as Fr,useCallback as wd,useSyncExternalStore as $B}from"react";import{useThree as YB,useFrame as KB}from"@react-three/fiber";import{Sphere as QB,PivotControls as JB}from"@react-three/drei";import{Vector3 as Or,Vector2 as ZB,AdditiveBlending as Sf,TextureLoader as e2,Matrix4 as t2,Quaternion as Aa,Euler as Sd}from"three";var GC="data:image/png;base64,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";var HC="data:image/png;base64,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";var WC="data:image/png;base64,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";import{Fragment as u2,jsx as at,jsxs as Pr}from"react/jsx-runtime";var Mf=-100,Cf=100,e1=.03,r2=.03,n2=.03,Pf=.5,i2=GC,o2=HC,a2=WC,s2=Math.PI/4,qC=.4,Ra=64,XC=e1*3,Tf="#4d7dff",Md="#ffcc00",$C=.02,YC=.012,KC=new Or(0,1,0),Cd=32,QC="#ff9d3d",Pd=4;function _f(e){let t=new Float32Array((Ra+1)*3);for(let r=0;r<=Ra;r++){let n=r/Ra*Math.PI*2,i=Math.cos(n)*qC,o=Math.sin(n)*qC,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 l2(e){let t=Math.abs(e.y)<.99?new Or(0,1,0):new Or(1,0,0),r=new Or().crossVectors(e,t).normalize(),n=new Or().crossVectors(e,r).normalize();return[r,n]}function JC(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 _o=null,vl=null,Rf=new Set;function Af(e){_o!==e&&(_o=e,Rf.forEach(t=>t()))}function c2(e){return Rf.add(e),()=>Rf.delete(e)}function ZC(){return _o}function t1({light:e,position:t,rotation:r=[0,0,0],color:n,intensity:i,visible:o,onPositionChange:a,onRotationChange:s,target:l,onTransformChange:c,onDraggingChange:d}){let{activeTab:m,activeSubTab:u,setActiveTab:h,setActiveSubTab:p}=gi(),{camera:g,gl:b,raycaster:w,invalidate:f,scene:y}=YB(),S=Tt(null),M=Tt(null),x=Tt(null),C=Tt(null),A=Tt(null),P=Tt(null),_=Tt(null),R=Tt(null),k=Tt(null),T=Tt(null),L=Tt(null),F=Tt(null),j=Tt(null),V=Fr(()=>new t2,[]),E=Fr(()=>new Aa,[]),O=Fr(()=>new Or(1,1,1),[]),Z=Tt([0,0,0]),ee=Tt([0,0,0]),J=Tt(!1),U=Tt(null),Q=Tt(null),q=Tt(new Or),G=Tt(null),H=Tt(null),se=Tt(d);_a(()=>{se.current=d},[d]);let ve=Fr(()=>new Or(t[0],t[1],t[2]),[t]),Ne=Fr(()=>new Sd(r[0],r[1],r[2]),[r]),$=Fr(()=>new Float32Array(6),[]),xe=Fr(()=>_f("x"),[]),Te=Fr(()=>_f("y"),[]),we=Fr(()=>_f("z"),[]),pt=Fr(()=>new Float32Array((Cd+1)*3),[]),te=Fr(()=>new Float32Array(Pd*2*3),[]),_t=e?.type==="point",ne=e?.type==="spot",De=e?.type==="directional",Fe=_t?o2:ne?a2:i2,ae=_t?r2:ne?n2:e1,qe=Fr(()=>new e2().load(Fe),[Fe]),ze=$B(c2,ZC,ZC),pe=!!e&&ze===e.id,_e=Tt(new Or),Be=Tt(new Sd),Ye=Tt(new Or),Nt=l?.[0]??0,jt=l?.[1]??0,ie=l?.[2]??0;_a(()=>{J.current||(_e.current.copy(ve),Be.current.copy(Ne),Ye.current.set(Nt,jt,ie),f())},[ve,Ne,Nt,jt,ie,f]),_a(()=>{e&&_o===e.id&&!o&&Af(null)},[e?.id,o]),_a(()=>()=>{e&&_o===e.id&&Af(null),H.current!==null&&(cancelAnimationFrame(H.current),H.current=null),e&&wu(y,e.id)},[e?.id,y]),_a(()=>{if(!pe)return;let re=j.current;return vl=re,()=>{vl===re&&(vl=null)}});let Ie=wd(()=>{if(J.current||!pe)return;let re=_e.current,oe=new Aa().setFromEuler(Be.current);V.compose(re,oe,O)},[V,O,pe]);KB(()=>{if(S.current&&S.current.position.copy(_e.current),Ie(),x.current){x.current.lookAt(g.position);let re=g,oe;re.isOrthographicCamera?oe=ae/re.zoom:oe=g.position.distanceTo(_e.current)*ae,x.current.scale.setScalar(oe)}if(k.current){let re=g,oe;re.isOrthographicCamera?oe=XC/re.zoom:oe=g.position.distanceTo(_e.current)*XC,k.current.scale.setScalar(oe)}if(A.current){let re=A.current.getAttribute("position"),oe=re.array;oe[0]=_e.current.x,oe[1]=_e.current.y,oe[2]=_e.current.z,oe[3]=Ye.current.x,oe[4]=Ye.current.y,oe[5]=Ye.current.z,re.needsUpdate=!0,A.current.computeBoundingSphere()}if(P.current){let re=Ye.current,oe=_e.current.clone().sub(re),le=oe.length();P.current.visible=le>Pf,le>1e-6&&(P.current.position.copy(re).addScaledVector(oe,.5),P.current.scale.set(1,le,1),P.current.quaternion.setFromUnitVectors(KC,oe.normalize()))}if(C.current&&(C.current.visible=_e.current.distanceTo(Ye.current)>Pf),_.current&&R.current){let re=Ye.current,oe=re.clone().sub(_e.current),le=oe.length()>Pf;if(_.current.visible=le,R.current.visible=le,le){let Ee=g,Oe=Ee.isOrthographicCamera?YC/Ee.zoom:g.position.distanceTo(re)*YC;oe.normalize(),_.current.position.copy(re).addScaledVector(oe,-Oe),_.current.quaternion.setFromUnitVectors(KC,oe),_.current.scale.setScalar(Oe),R.current.position.copy(re),R.current.scale.setScalar(Oe*.45)}}if(ne&&T.current&&L.current&&F.current){let re=_e.current,oe=Ye.current.clone().sub(re),le=oe.length();if(le>1e-6){T.current.visible=!0;let Ee=oe.normalize(),Oe=le,Ot=e?.angle??Math.PI/6,qt=Oe*Math.tan(Ot),Rt=re.clone().add(Ee.clone().multiplyScalar(Oe)),[gt,rr]=l2(Ee),kt=L.current.getAttribute("position"),Xt=kt.array;for(let Qe=0;Qe<=Cd;Qe++){let bt=Qe/Cd*Math.PI*2,_r=Rt.x+(gt.x*Math.cos(bt)+rr.x*Math.sin(bt))*qt,Wr=Rt.y+(gt.y*Math.cos(bt)+rr.y*Math.sin(bt))*qt,Sn=Rt.z+(gt.z*Math.cos(bt)+rr.z*Math.sin(bt))*qt;Xt[Qe*3]=_r,Xt[Qe*3+1]=Wr,Xt[Qe*3+2]=Sn}kt.needsUpdate=!0,L.current.computeBoundingSphere();let $t=F.current.getAttribute("position"),Ke=$t.array;for(let Qe=0;Qe<Pd;Qe++){let bt=Qe/Pd*Math.PI*2,_r=Rt.x+(gt.x*Math.cos(bt)+rr.x*Math.sin(bt))*qt,Wr=Rt.y+(gt.y*Math.cos(bt)+rr.y*Math.sin(bt))*qt,Sn=Rt.z+(gt.z*Math.cos(bt)+rr.z*Math.sin(bt))*qt,nr=Qe*6;Ke[nr]=re.x,Ke[nr+1]=re.y,Ke[nr+2]=re.z,Ke[nr+3]=_r,Ke[nr+4]=Wr,Ke[nr+5]=Sn}$t.needsUpdate=!0,F.current.computeBoundingSphere()}else T.current.visible=!1}});let je=wd(()=>{H.current!==null&&(cancelAnimationFrame(H.current),H.current=null),e&&wu(y,e.id),Z.current=t,ee.current=[r[0],r[1],r[2]],q.current.copy(Ye.current),J.current=!0,U.current=null,Q.current=null,G.current=null,se.current?.(!0)},[t,r,e?.id,y]),Mt=wd((re,oe)=>{let le=oe,Ee=new Or(Z.current[0],Z.current[1],Z.current[2]),Oe=new Or,Ot=new Aa,qt=new Or;le.decompose(Oe,Ot,qt);let Rt=Ee.clone().applyMatrix4(le),gt=[Math.min(Math.max(Rt.x,Mf),Cf),Math.min(Math.max(Rt.y,Mf),Cf),Math.min(Math.max(Rt.z,Mf),Cf)],rr=new Aa().setFromEuler(new Sd(ee.current[0],ee.current[1],ee.current[2],"XYZ")),kt=new Aa().copy(Ot).multiply(rr),Xt=new Sd().setFromQuaternion(kt,"XYZ"),$t=[Xt.x,Xt.y,Xt.z];if(ne||De){let Qe=q.current.clone().applyMatrix4(le);Ye.current.copy(Qe),G.current=Qe.toArray()}_e.current.set(gt[0],gt[1],gt[2]),Be.current.set($t[0],$t[1],$t[2]),U.current=gt,Q.current=$t,e&&Yw(y,e.id,{position:gt,...G.current?{target:G.current}:{}});let Ke=new Aa().setFromEuler(Be.current);V.compose(_e.current,Ke,O),f()},[V,O,f,ne,De,e?.id,y]),Ue=wd(()=>{J.current=!1;let re=U.current,oe=Q.current,le=G.current;U.current=null,Q.current=null,G.current=null;let Ee=re&&!JC(re,Z.current),Oe=oe&&!JC(oe,ee.current);c?(Ee||Oe)&&c({position:re??Z.current,rotation:oe??ee.current,...le?{target:le}:{}}):(Ee&&a&&a(re),Oe&&s&&s(oe)),e&&wu(y,e.id),Ee||Oe?H.current=requestAnimationFrame(()=>{H.current=null,se.current?.(!1)}):se.current?.(!1)},[a,s,c,e?.id,y]);return _a(()=>{let re=Ee=>{let Oe=b.domElement.getBoundingClientRect();return new ZB((Ee.clientX-Oe.left)/Oe.width*2-1,-((Ee.clientY-Oe.top)/Oe.height)*2+1)},oe=Ee=>!!Ee.target.closest?.("button, input, textarea, .ri-annotationPopup, .ri-colorPicker, .ri-materialPicker"),le=Ee=>{if(oe(Ee)||e&&_o===e.id)return;let Oe=re(Ee);if(w.setFromCamera(Oe,g),vl&&w.intersectObject(vl,!0).length>0)return;let Ot=[];if(M.current&&Ot.push(M.current),x.current&&Ot.push(x.current),Ot.length===0)return;if(w.intersectObjects(Ot,!1).length>0){let Rt=e?.id??null;_o!==Rt&&(Af(Rt),h?.("scene"),p?.("lighting")),Ee.preventDefault(),Ee.stopPropagation()}};return b.domElement.addEventListener("pointerdown",le),()=>{b.domElement.removeEventListener("pointerdown",le)}},[g,w,b,e,h,p]),m!=="scene"||u!=="lighting"||!e||!o||e.type==="none"||e.type==="hemisphere"?null:Pr("group",{ref:re=>{re&&$o(re)},children:[Pr("group",{ref:S,children:[at("sprite",{ref:x,children:at("spriteMaterial",{map:qe,transparent:!0,opacity:.9,blending:Sf,depthWrite:!1,rotation:ne?s2:0},Fe)}),at(QB,{ref:M,args:[.25,16,16],children:at("meshBasicMaterial",{transparent:!0,opacity:.01})}),_t&&Pr("group",{ref:k,children:[Pr("lineLoop",{renderOrder:999,children:[at("bufferGeometry",{children:at("bufferAttribute",{attach:"attributes-position",args:[xe,3],count:Ra+1})}),at("lineBasicMaterial",{color:Tf,transparent:!0,opacity:.6,depthTest:!1,depthWrite:!1})]}),Pr("lineLoop",{renderOrder:999,children:[at("bufferGeometry",{children:at("bufferAttribute",{attach:"attributes-position",args:[Te,3],count:Ra+1})}),at("lineBasicMaterial",{color:Tf,transparent:!0,opacity:.6,depthTest:!1,depthWrite:!1})]}),Pr("lineLoop",{renderOrder:999,children:[at("bufferGeometry",{children:at("bufferAttribute",{attach:"attributes-position",args:[we,3],count:Ra+1})}),at("lineBasicMaterial",{color:Tf,transparent:!0,opacity:.6,depthTest:!1,depthWrite:!1})]})]})]}),!_t&&!ne&&Pr(u2,{children:[Pr("mesh",{ref:P,children:[at("cylinderGeometry",{args:[$C,$C,1,8,1,!0]}),at("meshBasicMaterial",{color:Md,transparent:!0,opacity:.05,blending:Sf,depthWrite:!1,depthTest:!1})]}),Pr("mesh",{ref:_,renderOrder:999,children:[at("coneGeometry",{args:[.45,2,12]}),at("meshBasicMaterial",{color:Md,transparent:!0,opacity:.9,depthTest:!1,depthWrite:!1})]}),Pr("mesh",{ref:R,renderOrder:999,children:[at("sphereGeometry",{args:[1,12,8]}),at("meshBasicMaterial",{color:Md,transparent:!0,opacity:.9,depthTest:!1,depthWrite:!1})]}),Pr("line",{ref:C,children:[at("bufferGeometry",{ref:A,children:at("bufferAttribute",{attach:"attributes-position",args:[$,3],count:2})}),at("lineBasicMaterial",{color:Md,transparent:!0,opacity:.7,blending:Sf})]})]}),ne&&Pr("group",{ref:T,children:[Pr("lineLoop",{renderOrder:999,children:[at("bufferGeometry",{ref:L,children:at("bufferAttribute",{attach:"attributes-position",args:[pt,3],count:Cd+1})}),at("lineBasicMaterial",{color:QC,transparent:!0,opacity:.85,depthTest:!1,depthWrite:!1})]}),Pr("lineSegments",{renderOrder:999,children:[at("bufferGeometry",{ref:F,children:at("bufferAttribute",{attach:"attributes-position",args:[te,3],count:Pd*2})}),at("lineBasicMaterial",{color:QC,transparent:!0,opacity:.5,depthTest:!1,depthWrite:!1})]})]}),pe&&(a||c)&&at(JB,{ref:j,matrix:V,autoTransform:!1,fixed:!0,scale:90,lineWidth:3,axisColors:["#ff2d6f","#64dfa6","#2f8fe8"],hoveredColor:"#ffd84d",opacity:.95,depthTest:!1,disableScaling:!0,disableRotations:_t,onDragStart:je,onDrag:Mt,onDragEnd:Ue})]})}import{useCallback as vn,useEffect as d2,useLayoutEffect as p2,useMemo as Tr,useRef as Ur}from"react";import{Html as m2,PivotControls as h2}from"@react-three/drei";import{useFrame as f2,useThree as Ef}from"@react-three/fiber";import{Euler as r1,Matrix4 as yl,Quaternion as xl,Vector3 as Lr}from"three";import{Maximize2 as g2}from"lucide-react";import{jsx as wl,jsxs as v2}from"react/jsx-runtime";var b2=.01,kf=.5;function Df({node:e,space:t,moveEnabled:r,gizmoTool:n,scaleEnabled:i,onTransformChange:o,onDraggingChange:a,transform:s}){let l=Ef($=>$.invalidate),c=Ef($=>$.camera),d=Ef($=>$.size),m=Tr(()=>fo(e),[e]),u=Tr(()=>new Lr,[e]);s?.pivot?u.fromArray(s.pivot.point):u.copy(m);let h=Tr(()=>{let $=zs(e);if(!$)return[u.clone().add(new Lr(kf,kf,kf))];let xe=[];for(let Te of[$.min.x,$.max.x])for(let we of[$.min.y,$.max.y])for(let pt of[$.min.z,$.max.z])xe.push(new Lr(Te,we,pt));return xe},[e,u]),p=Tr(()=>new Lr,[]),g=Tr(()=>new Lr,[]),b=Ur(null),w=Tr(()=>new yl,[]),f=Ur(!1),y=Ur(new yl),S=Ur(new yl),M=Ur(null),x=Ur([]),C=Ur(null),A=Ur(a);A.current=a;let P=Tr(()=>new Lr,[]),_=Tr(()=>new xl,[]),R=Tr(()=>new Lr,[]),k=Tr(()=>new xl,[]),T=Tr(()=>new Lr(1,1,1),[]),L=Tr(()=>new xl,[]),F=Tr(()=>new Lr,[]),j=Tr(()=>new Lr,[]),V=Ur([0,0,0]),E=Ur(new Lr(1,1,1)),O=Ur({point:[0,0,0],offset:[0,0,0]}),Z=vn(()=>{f.current||(e.updateWorldMatrix(!0,!1),P.copy(u).applyMatrix4(e.matrixWorld),e.getWorldQuaternion(_),k.copy(_),t==="world"&&k.identity(),w.compose(P,k,T))},[P,w,k,T,e,u,t,_]),ee=vn(()=>{e.updateWorldMatrix(!0,!1);let $=1/0;for(let xe of h){p.copy(xe).applyMatrix4(e.matrixWorld);let Te=p.distanceToSquared(c.position);Te<$&&($=Te,g.copy(p))}b.current?.position.copy(g)},[c,g,h,e,p]);p2(()=>(Z(),ee(),()=>{let $=C.current!==null;$&&(cancelAnimationFrame(C.current),C.current=null),(f.current||$)&&(f.current=!1,A.current(!1));for(let xe of x.current)An(xe);x.current=[]}),[Z]),f2(()=>{Z(),ee()});let J=vn(()=>{C.current!==null&&(cancelAnimationFrame(C.current),C.current=null),e.updateWorldMatrix(!0,!0),x.current=[];for(let $ of mi(e))gc($)||(Yo($,$.matrixWorld),x.current.push($));e.updateWorldMatrix(!0,!1),P.copy(u).applyMatrix4(e.matrixWorld),e.getWorldQuaternion(_),e.getWorldScale(R),y.current.compose(P,_,R),S.current.copy(w),V.current=[e.rotation.x,e.rotation.y,e.rotation.z],E.current.copy(e.scale),O.current=s?.pivot??Mu(u.toArray(),V.current,e.scale.toArray(),e.rotation.order),M.current=null,f.current=!0,a(!0)},[P,w,e,a,u,_,R,s?.pivot]),U=vn(($,xe)=>{let Te=y.current.clone().premultiply(xe),we=S.current.clone().premultiply(xe);Te.decompose(F,_,j);let pt=F.clone();we.decompose(P,k,T),t==="world"&&k.identity(),w.compose(P,k,T),$.decompose(F,L,j);let te=new r1().setFromQuaternion(L,e.rotation.order),[_t,ne,De]=V.current,Fe=[_t+te.x,ne+te.y,De+te.z],ae=new xl().setFromEuler(new r1(Fe[0],Fe[1],Fe[2],e.rotation.order));e.scale.copy(E.current);let ze=(e.parent?.matrixWorld||new yl).clone().invert(),pe=pt.clone().applyMatrix4(ze),_e=u.clone().multiply(e.scale).applyQuaternion(ae),Be=pe.clone().sub(_e);e.position.copy(Be),e.rotation.set(Fe[0],Fe[1],Fe[2],e.rotation.order),e.updateMatrixWorld(!0),l();let Ye=O.current,Nt=pe.clone().sub(new Lr(...Ye.offset)),jt=[Nt.x,Nt.y,Nt.z];M.current={position:jt,rotation:Fe,pivot:Ye}},[P,L,w,k,T,l,e,u,F,j,t,_]),Q=vn(()=>{f.current=!1;let $=M.current;if(M.current=null,$)o($),C.current=requestAnimationFrame(()=>{C.current=null,a(!1)});else if(x.current.length>0){for(let xe of x.current)An(xe);e.updateMatrixWorld(!0),l(),a(!1)}else a(!1);x.current=[]},[l,e,a,o]),q=Ur(null),G=vn($=>{let xe=$.clone().project(c);return{x:d.left+(xe.x*.5+.5)*d.width,y:d.top+(-xe.y*.5+.5)*d.height}},[c,d]),H=vn(($,xe)=>{let Te=Math.max(b2,Number.isFinite($)?$:1);e.scale.copy(E.current).multiplyScalar(Te);let pt=(e.parent?.matrixWorld||new yl).clone().invert(),te=xe.clone().applyMatrix4(pt),_t=new xl().setFromEuler(e.rotation),ne=u.clone().multiply(e.scale).applyQuaternion(_t),De=te.clone().sub(ne);e.position.set(De.x,De.y,De.z),e.updateMatrixWorld(!0),ee(),l(),M.current={position:te.clone().sub(new Lr(...O.current.offset)).toArray(),scale:e.scale.toArray(),pivot:O.current}},[l,e,u,ee]),se=vn($=>{if(!i)return;$.stopPropagation(),$.preventDefault(),$.currentTarget.setPointerCapture($.pointerId),J();let xe=P.clone(),Te=G(xe),we=Math.max(1,Math.hypot($.clientX-Te.x,$.clientY-Te.y));q.current={pointerId:$.pointerId,centerScreen:Te,startDistance:we,pivotWorld:xe}},[J,P,G,i]),ve=vn($=>{let xe=q.current;if(!xe||$.pointerId!==xe.pointerId)return;$.stopPropagation();let Te=Math.hypot($.clientX-xe.centerScreen.x,$.clientY-xe.centerScreen.y);H(Te/xe.startDistance,xe.pivotWorld)},[H]),Ne=vn($=>{let xe=q.current;!xe||$.pointerId!==xe.pointerId||($.stopPropagation(),$.currentTarget.hasPointerCapture($.pointerId)&&$.currentTarget.releasePointerCapture($.pointerId),q.current=null,Q())},[Q]);return d2(()=>{i||q.current&&(q.current=null,Q())},[i,Q]),v2("group",{children:[wl(h2,{matrix:w,autoTransform:!1,fixed:!0,scale:90,lineWidth:3,axisColors:["#e5484d","#46a758","#3e8bff"],hoveredColor:"#35c0dc",opacity:.95,depthTest:!1,disableAxes:!r||n==="rotate",disableSliders:!r||n==="rotate",disableRotations:!r||n==="move",disableScaling:!0,onDragStart:J,onDrag:($,xe,Te,we)=>U(xe,we),onDragEnd:Q}),i&&wl("group",{ref:b,children:wl(m2,{portal:void 0,zIndexRange:[10,0],style:{pointerEvents:"none",transition:"opacity 0.2s"},children:wl("div",{onPointerDown:se,onPointerMove:ve,onPointerUp:Ne,onPointerCancel:Ne,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:wl(g2,{size:13,color:"#ffffff"})})})})]})}import{useCallback as yn,useEffect as x2,useLayoutEffect as o1,useMemo as Ao,useRef as Gr}from"react";import{Html as w2,PivotControls as S2}from"@react-three/drei";import{useFrame as M2,useThree as If}from"@react-three/fiber";import{Matrix4 as Sl,Quaternion as C2,Vector3 as Ro}from"three";import{Maximize2 as P2}from"lucide-react";import{Matrix4 as y2,Vector3 as n1}from"three";function Of(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 i1(e){return Of(e).map(({key:t,node:r,transform:n})=>{r.updateWorldMatrix(!0,!0);let i=n?.pivot?.point??fo(r).toArray(),o=n?.pivot??Mu(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 n1(...o.point).applyMatrix4(r.matrixWorld)}})}function Lf(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 y2).invert(),s=a.clone().multiply(t).multiply(n.startWorld),{rotation:l,scale:c,shear:d}=Sv(s,n.startScale.clone().multiplyScalar(r),n.startQuaternion),m=n.pivotWorld.clone().applyMatrix4(t).applyMatrix4(a);return i.position.setFromMatrixPosition(s),i.quaternion.copy(l),i.scale.copy(c),eo(i,d),i.updateMatrixWorld(!0),{key:n.key,transform:{position:m.clone().sub(new n1(...o.offset)).toArray(),rotation:[i.rotation.x,i.rotation.y,i.rotation.z],scale:c.toArray(),pivot:o,shear:d}}})}import{jsx as Ml,jsxs as _2}from"react/jsx-runtime";var T2=.01;function Bf({entries:e,referenceNode:t,space:r,moveEnabled:n,gizmoTool:i,scaleEnabled:o,onTransformChange:a,onDraggingChange:s}){let l=If(G=>G.invalidate),c=If(G=>G.camera),d=If(G=>G.size),m=Gr(e);m.current=e;let u=Gr([]);(e.length!==u.current.length||e.some((G,H)=>G.key!==u.current[H].key||G.node!==u.current[H].node))&&(u.current=e);let h=u.current,p=Ao(()=>Of(h).map(({node:G})=>G),[h]),g=t??e[e.length-1]?.node,b=Ao(()=>new Ro,[]),w=Ao(()=>new C2,[]),f=Ao(()=>new Sl,[]),y=Ao(()=>new Ro(1,1,1),[]),S=Ao(()=>new Ro,[]),M=Gr(null),x=Ao(()=>p.flatMap(G=>{let H=zs(G);if(!H)return[{node:G,point:fo(G).addScalar(.5)}];let se=[];for(let ve of[H.min.x,H.max.x])for(let Ne of[H.min.y,H.max.y])for(let $ of[H.min.z,H.max.z])se.push({node:G,point:new Ro(ve,Ne,$)});return se}),[p]),C=Gr(!1),A=Gr(new Sl),P=Gr([]),_=Gr(null),R=Gr([]),k=Gr(null),T=Gr(null),L=Gr(s);L.current=s;let F=Gr(a);F.current=a;let j=yn(()=>{if(!C.current){b.set(0,0,0);for(let G of p)G.updateWorldMatrix(!0,!1),b.add(fo(G).applyMatrix4(G.matrixWorld));p.length&&b.divideScalar(p.length),w.identity(),r==="local"&&g&&(g.updateWorldMatrix(!0,!1),g.getWorldQuaternion(w)),f.compose(b,w,y)}},[b,f,w,p,g,r,y]),V=yn(()=>{let G=1/0,H=new Ro;for(let{node:se,point:ve}of x){se.updateWorldMatrix(!0,!1),H.copy(ve).applyMatrix4(se.matrixWorld);let Ne=H.distanceToSquared(c.position);Ne<G&&(G=Ne,S.copy(H))}M.current?.position.copy(S)},[c,x,S]),E=yn(()=>{let G=T.current;T.current=null,G?.target.hasPointerCapture(G.pointerId)&&G.target.releasePointerCapture(G.pointerId)},[]);o1(()=>{j(),V()},[j,V]),o1(()=>()=>{E();let G=k.current!==null;if(G&&(cancelAnimationFrame(k.current),k.current=null),C.current)for(let H of P.current)H.node.matrixAutoUpdate=H.startMatrixAutoUpdate,H.node.matrix.copy(H.startMatrix),H.node.position.copy(H.startPosition),H.node.quaternion.copy(H.startQuaternion),H.node.scale.copy(H.startScale),H.node.updateMatrixWorld(!0);(C.current||G)&&(C.current=!1,_.current=null,L.current(!1),l());for(let H of R.current)An(H);R.current=[]},[h,l,E]),M2(()=>{j(),V()});let O=yn(()=>{k.current!==null&&(cancelAnimationFrame(k.current),k.current=null),j(),P.current=i1(m.current),R.current=[];for(let{node:G}of P.current)for(let H of mi(G))gc(H)||(Yo(H,H.matrixWorld),R.current.push(H));A.current.copy(f),_.current=null,C.current=!0,L.current(!0)},[f,j]),Z=yn((G,H)=>{if(!C.current)return;A.current.clone().premultiply(H).decompose(b,w,new Ro),r==="world"&&w.identity(),f.compose(b,w,y),_.current=Lf(P.current,H),V(),l()},[b,f,w,l,r,V,y]),ee=yn(()=>{if(!C.current)return;C.current=!1,E();let G=_.current;if(_.current=null,G?.length)k.current=requestAnimationFrame(()=>{k.current=null,L.current(!1)}),F.current(G);else{for(let H of R.current)An(H);l(),L.current(!1)}R.current=[]},[l,E]);x2(()=>{(!o&&T.current||!n&&C.current&&!T.current)&&ee()},[o,n,ee]);let J=yn(G=>{let H=G.clone().project(c);return{x:d.left+(H.x*.5+.5)*d.width,y:d.top+(-H.y*.5+.5)*d.height}},[c,d]),U=yn(G=>{if(!o)return;G.stopPropagation(),G.preventDefault(),G.currentTarget.setPointerCapture(G.pointerId),O();let H=J(b);T.current={pointerId:G.pointerId,target:G.currentTarget,centerScreen:H,startDistance:Math.max(1,Math.hypot(G.clientX-H.x,G.clientY-H.y))}},[O,b,J,o]),Q=yn(G=>{let H=T.current;if(!H||G.pointerId!==H.pointerId)return;G.stopPropagation();let se=Math.hypot(G.clientX-H.centerScreen.x,G.clientY-H.centerScreen.y),ve=Math.max(T2,se/H.startDistance),Ne=new Ro().setFromMatrixPosition(A.current),$=new Sl().makeTranslation(...Ne.toArray()).multiply(new Sl().makeScale(ve,ve,ve)).multiply(new Sl().makeTranslation(...Ne.clone().negate().toArray()));_.current=Lf(P.current,$,ve),V(),l()},[l,V]),q=yn(G=>{G.pointerId===T.current?.pointerId&&(G.stopPropagation(),ee())},[ee]);return _2("group",{children:[Ml(S2,{matrix:f,autoTransform:!1,fixed:!0,scale:90,lineWidth:3,axisColors:["#e5484d","#46a758","#3e8bff"],hoveredColor:"#35c0dc",opacity:.95,depthTest:!1,disableAxes:!n||i==="rotate",disableSliders:!n||i==="rotate",disableRotations:!n||i==="move",disableScaling:!0,onDragStart:O,onDrag:(G,H,se,ve)=>Z(H,ve),onDragEnd:ee}),o&&Ml("group",{ref:M,children:Ml(w2,{children:Ml("div",{onPointerDown:U,onPointerMove:Q,onPointerUp:q,onPointerCancel:q,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:Ml(P2,{size:13,color:"#ffffff"})})})})]})}import{Vector3 as A2}from"three";function R2(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 A2,c=s[0],d=1/0;for(let h of s){l.fromBufferAttribute(o,h);let p=l.distanceToSquared(a);p<d&&(d=p,c=h)}let m=n.getComponent(c,0),u=i.getComponent(c,0);for(let h=1;h<4;h++){let p=i.getComponent(c,h);p>u&&(u=p,m=n.getComponent(c,h))}return t.skeleton.bones[m]??null}function a1(e){let t=R2(e)??e.object,r=di(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 s1(e,t,r){if(!e.anchorNodeName||!e.anchorLocalPosition)return!1;let n=pi(t,e.anchorNodeName);return n?(n.updateWorldMatrix(!0,!1),r.set(...e.anchorLocalPosition).applyMatrix4(n.matrixWorld),!0):!1}import{useEffect as E2,useMemo as Nf,useRef as l1}from"react";import{useFrame as k2,useThree as D2}from"@react-three/fiber";import{Vector3 as jf}from"three";function Td({annotation:e,enabled:t,controlsRef:r,offsetRef:n}){let i=D2(u=>u.scene),o=l1(null),a=l1(!1),s=Nf(()=>new jf,[]),l=Nf(()=>new jf,[]),c=Nf(()=>new jf,[]),d=e?.anchorNodeName,m=e?.anchorLocalPosition;return E2(()=>{o.current=null,a.current=!1},[d,e?.id]),k2(()=>{let u=r.current,h=n.current;if(!t||!u||!h||!d||!m){a.current=!1;return}let p=o.current;if((!p||!p.parent)&&(p=pi(i,d),o.current=p),!p){a.current=!1;return}p.updateWorldMatrix(!0,!1),s.set(m[0],m[1],m[2]).applyMatrix4(p.matrixWorld),!(a.current&&s.distanceToSquared(l)<1e-8)&&(l.copy(s),a.current=!0,c.copy(s).add(h),u.setLookAt(c.x,c.y,c.z,s.x,s.y,s.z,!0))}),null}import{useCallback as xn,useEffect as Ea,useMemo as ka,useRef as zf,useState as Li}from"react";import{Box3 as O2,Raycaster as L2,Vector3 as Eo}from"three";var I2=[[0,0],[35,0],[-35,0],[0,30],[35,30],[-35,30],[70,0],[-70,0],[70,30],[-70,30],[0,60]];function B2(e,t,r,n){let i=[],o=!0;for(let u=e.parent;u;u=u.parent)if(!u.visible){o=!1;break}o&&e.traverseVisible(u=>{let h=u;h.isMesh&&!h.isSkinnedMesh&&i.push(u)});let a=Math.abs(r.y)>.99?new Eo(1,0,0):new Eo(0,1,0),s=new Eo().crossVectors(a,r).normalize(),l=n*.02,c=new L2,d={direction:r.clone(),clearance:-1};for(let[u,h]of I2){let p=r.clone().applyAxisAngle(a,u*Math.PI/180).applyAxisAngle(s,-h*Math.PI/180).normalize();c.set(t.clone().addScaledVector(p,l),p),c.far=n-l;let g=c.intersectObjects(i,!1)[0];if(!g)return t.clone().addScaledVector(p,n);g.distance>d.clearance&&(d={direction:p,clearance:g.distance})}let m=Math.max(l+d.clearance*.85,l*2);return t.clone().addScaledVector(d.direction,m)}function c1({sceneAnnotations:e,controlledAnnotationCategories:t,onAnnotationCategoriesChange:r,showAnnotationFilters:n,initialCategories:i,controlledActiveAnnotation:o,onActiveAnnotationChange:a,onAnnotationsChange:s,controlsRef:l,sceneRef:c,annotationWorldPositionsRef:d,tourCameraOffsetRef:m,initialCameraStateRef:u,engagement:h,engagementRef:p}){let[g,b]=Li(!1),[w,f]=Li(()=>e??[]);Ea(()=>{if(w.length>0){let ne=w.reduce((De,Fe)=>Math.max(De,Fe.id),0);C.current=ne}else C.current=0},[w]);let[y,S]=Li(null),[M,x]=Li({title:"",description:""}),C=zf(0),[A,P]=Li(null),[_,R]=Li(-1),[k,T]=Li(!1),L=zf(null),[F,j]=Li(()=>i),V=t===void 0?F:t,E=ka(()=>mv(w,V),[w,V]),O=ka(()=>[...new Set(w.map(pv))].sort(),[w]),Z=n&&O.some(Boolean),ee=ne=>{t===void 0&&j(ne),r?.(ne)},J=ka(()=>[...E].sort((ne,De)=>ne.id-De.id),[E]),U=ka(()=>JSON.stringify([V?.map(ne=>ne.trim()).sort()??null,J]),[V,J]),Q=ka(()=>_<0||_>=J.length?null:J[_],[_,J]),q=xn(ne=>{if(o!==void 0){a?.(ne);return}P(ne?{annotation:ne}:null)},[o,a]),G=zf(null),H=xn(ne=>{let De=l.current,Fe=c.current;if(!De)return;let ae=new Eo,qe=d.current.get(ne.id);qe?ae.copy(qe):Fe&&s1(ne,Fe,ae)||ae.set(ne.worldPosition[0],ne.worldPosition[1],ne.worldPosition[2]),m.current=null;let ze=De.smoothTime;De.smoothTime=mc(De,.6);let pe=ne.worldNormal;if(Yp(ne.cameraView))ls(De,ne.cameraView);else{if(Fe){let _e=new O2().setFromObject(Fe),Be=new Eo;_e.getCenter(Be);let Ye=new Eo;_e.getSize(Ye);let Nt=Ye.length()*.2,jt;pe?jt=new Eo(pe[0],pe[1],pe[2]):jt=ae.clone().sub(Be),jt.lengthSq()<1e-6&&jt.set(0,0,1),jt.normalize();let ie=Math.max(Nt*.6,.3),Ie=B2(Fe,ae,jt,ie);De.setPosition(Ie.x,Ie.y,Ie.z,!0),ne.anchorNodeName&&ne.anchorLocalPosition&&(m.current=Ie.clone().sub(ae))}De.setTarget(ae.x,ae.y,ae.z,!0),G.current&&fc(De,G.current)}L.current&&clearTimeout(L.current),L.current=setTimeout(()=>{De.smoothTime=ze,L.current=null},800),q(ne)},[q]),se=xn(()=>{J.length!==0&&(l.current&&(G.current=hc(l.current)),h.startTour(J.length),b(!0),R(0),H(J[0]))},[J,H,h]),ve=xn(()=>{if(J.length===0||_<0)return;T(!0);let ne=(_-1+J.length)%J.length;R(ne),H(J[ne]),setTimeout(()=>T(!1),500)},[_,J,H]),Ne=xn(()=>{if(J.length===0||_<0)return;if(_===J.length-1){if(h.completeTour(),b(!1),R(-1),q(null),l.current&&u.current){let De=u.current;ls(l.current,{...G.current,...De}),G.current=null}return}T(!0);let ne=_+1;R(ne),H(J[ne]),setTimeout(()=>T(!1),500)},[_,J,H,q,h]),$=xn(()=>{if(h.stopTour(),b(!1),R(-1),q(null),l.current&&u.current){let ne=u.current;ls(l.current,{...G.current,...ne}),G.current=null}},[q,h]);Ea(()=>{p.current.stopTour("annotations-changed"),G.current&&l.current&&(ls(l.current,{...G.current,...u.current??{}}),G.current=null),m.current=null,R(-1),b(!1)},[U]),Ea(()=>()=>{L.current&&clearTimeout(L.current)},[]),Ea(()=>{Q&&g&&G.current&&q(Q)},[Q,q,g]),Ea(()=>{if(e===void 0)return;let ne=e.map(De=>({...De,localPosition:De.localPosition??De.worldPosition}));f(ne)},[e]);let xe=xn(()=>{if(o!==void 0){a?.(null);return}P(null)},[o,a]),Te=o!==void 0?o:A?.annotation??null,we=ka(()=>Te?E.find(De=>De.id===Te.id)??null:null,[Te,E]);Ea(()=>{Te&&!we&&xe()},[Te,we,xe]);let pt=xn(()=>{if(!y||!M.title.trim())return;C.current+=1;let De={id:C.current,worldPosition:y.worldPosition,localPosition:y.localPosition,worldNormal:y.worldNormal,anchorNodeName:y.anchor?.anchorNodeName,anchorLocalPosition:y.anchor?.anchorLocalPosition,title:M.title.trim(),description:M.description},Fe=[...w,De];f(Fe),s?.(Fe),S(null)},[y,M,w,s]),te=xn(()=>S(null),[]),_t=xn(ne=>{Yp(ne.cameraView)?H(ne):q(ne)},[q,H]);return{annotations:w,pendingAnnotation:y,setPendingAnnotation:S,annotationForm:M,setAnnotationForm:x,currentAnnotationIndex:_,isNavigating:k,localAnnotationCategories:F,selectedAnnotationCategories:V,visibleAnnotations:E,availableAnnotationCategories:O,annotationFiltersVisible:Z,changeAnnotationCategories:ee,sortedAnnotations:J,currentAnnotation:Q,setActiveAnnotation:q,focusAnnotation:H,startGuidedTour:se,goToPreviousAnnotation:ve,goToNextAnnotation:Ne,stopGuidedTour:$,closeViewingAnnotation:xe,activeAnnotation:Te,activeViewingAnnotation:we,isGuidedTourActive:g,handleAnnotationOk:pt,handleAnnotationCancel:te,handleAnnotationMarkerClick:_t}}import{useCallback as _d,useEffect as u1,useMemo as N2,useRef as j2}from"react";import{Vector3 as z2}from"three";var d1=()=>`decal-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`;function p1({currentObjectBindings:e,currentObjectBindingsRef:t,applyObjectBindings:r,nodeRefsMap:n,controlsRef:i,decalMove:o,decalDragging:a,setDecalDragging:s,setDecalError:l,setDecalControl:c,decalRequestRef:d,onTextureUpload:m,currentPanelObjectId:u,modelUrl:h}){let p=_d((x,C)=>{let A=t.current,P=A[x];if(!P)return;let _=C(P.decals??[]);r({...A,[x]:{...P,decals:_.length>0?_:void 0}})},[r,e]),g=N2(()=>{if(!a)return null;let{objectKey:x,decalId:C}=a,A=e[x],P=A?.decals?.find(_=>_.id===C);return P?{objectId:A.modelObjectId??x,decal:P,onCancel:()=>s(null),onCommit:_=>{p(x,R=>R.map(k=>k.id===C?{...k,..._}:k)),s(null)}}:null},[a,e,p]),b=o??g,w=_d((x,C)=>{d.current++;let A=t.current[x],P=n.current[A?.modelObjectId??x],_=Tx(P,i.current?.camera);if(!_)return l("Could not find a surface on this object for the decal."),!1;let R={...C,..._};return p(x,k=>[...k,R]),l(null),c(k=>k&&{...k,activeId:R.id}),s({objectKey:x,decalId:R.id}),!0},[p]),f=_d(x=>{let C=t.current[x],A=n.current[C?.modelObjectId??x]?.geometry;if(!A)return .2;A.boundingBox||A.computeBoundingBox();let P=A.boundingBox?.getSize(new z2),_=P?Math.max(P.x,P.y,P.z):0;return _>0&&Number.isFinite(_)?_/3:.2},[]),y=j2([]);u1(()=>()=>{for(let x of y.current)URL.revokeObjectURL(x)},[]);let S=_d(async(x,C,A)=>{let P=++d.current;s(null);let _;if(m){if(_=await m(A,x),P!==d.current)return}else _=URL.createObjectURL(A),y.current.push(_);w(C,{id:d1(),image:_,size:f(C)})},[f,m,w]);return u1(()=>{d.current++,l(null),s(null)},[u,h]),{editDecals:p,activeDecalMove:b,addCenteredDecal:w,decalSizeFor:f,startImageDecal:S,decalControlHandlers:(x,C)=>({onSelect:A=>{d.current++,l(null),s(null),c({...x,activeId:A})},onAddText:(A,P)=>w(C,{id:d1(),text:A,color:P,size:f(C)}),onAddImage:A=>{S(x.objectId,C,A)},onChange:(A,P)=>p(C,_=>_.map(R=>R.id===A?{...R,...P}:R)),onNudge:(A,P)=>{let _=t.current[C],R=_?.decals?.find(L=>L.id===A);if(!R)return;let k=n.current[_.modelObjectId??C],T=Ax(k,i.current?.camera,R,P);if(!T){l("No visible surface in that direction. Try another arrow or rotate the view.");return}l(null),s(null),p(C,L=>L.map(F=>F.id===A?{...F,...T}:F))},onMove:A=>{d.current++,e[C]?.decals?.find(_=>_.id===A)&&(l(null),s(_=>_?.objectKey===C&&_.decalId===A?null:{objectKey:C,decalId:A}))},onRemove:A=>{s(null),p(C,P=>P.filter(_=>_.id!==A)),c({...x,activeId:null})},onClose:()=>{d.current++,l(null),s(null),c(null)}})}}import{useEffect as V2,useRef as m1}from"react";function h1({canvasAreaElement:e,controlsRef:t,enabled:r}){let n=m1(new Set),i=m1(null);V2(()=>{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,c=p=>p.code==="Space"?" ":p.key.toLowerCase(),d=()=>{n.current.clear(),l=0,i.current!==null&&(cancelAnimationFrame(i.current),i.current=null)},m=p=>{let g=t.current,b=n.current;if(!g||b.size===0){i.current=null,l=0;return}let w=l?Math.min((p-l)/1e3,.05):1/60;l=p;let f=Math.max(g.distance*.75,.01)*w;b.has("w")&&g.forward(f,!1),b.has("s")&&g.forward(-f,!1),b.has("a")&&g.truck(-f,0,!1),b.has("d")&&g.truck(f,0,!1),b.has(" ")&&g.truck(0,f,!1),b.has("c")&&g.truck(0,-f,!1),i.current=requestAnimationFrame(m)},u=p=>{if(p.target!==o){d();return}if(s.has(p.key)){let b=t.current;if(!b)return;p.preventDefault();let w=Math.PI/90,f=Math.max(b.distance*.05,.01);p.key==="ArrowUp"?p.shiftKey?b.forward(f,!0):b.rotate(0,-w,!0):p.key==="ArrowDown"?p.shiftKey?b.forward(-f,!0):b.rotate(0,w,!0):p.key==="ArrowLeft"?b.rotate(-w,0,!0):b.rotate(w,0,!0);return}let g=c(p);a.has(g)&&(p.preventDefault(),n.current.add(g),i.current===null&&(i.current=requestAnimationFrame(m)))},h=p=>{n.current.delete(c(p))};return o.addEventListener("keydown",u),o.addEventListener("keyup",h),o.addEventListener("blur",d),()=>{o.removeEventListener("keydown",u),o.removeEventListener("keyup",h),o.removeEventListener("blur",d),d()}},[e,t,r])}import{useCallback as Da,useEffect as Vf,useRef as Oa}from"react";var f1=1,F2=4,U2=.0015,G2=.1,H2=8;function g1({moveZoomTarget:e,setMoveZoomTarget:t,currentObjectBindingsRef:r,materialRefsOut:n,rendererCaptureRef:i,canvasAreaRef:o,canvasAreaElement:a,applyBindingStyle:s}){let l=Oa(null),c=Oa(!1),d=Oa([0,0]),m=Oa([0,0]),u=Oa(1),h=Oa(null),p=Da((S,M)=>{let x=e;if(!x)return;let C=r.current[x.objectKey]?.style?.material?.[x.textureKey],A=C?.path;if(!A)return;let P=C?.rotation??0,_=Zr(x.textureKey),R=vc(A,_),k=n.current[x.objectKey],T=Array.isArray(k)?k:k?[k]:[],L=Ec[x.textureKey];for(let F of T){let j=F;L in j&&(j[L]=yc(j.userData,x.textureKey,R,A,S,M,P))}i.current?.invalidate()},[e]),g=Da(S=>{if(!e)return;S.currentTarget.setPointerCapture?.(S.pointerId),l.current={x:S.clientX,y:S.clientY},c.current=!1;let M=r.current[e.objectKey]?.style?.material?.[e.textureKey];if(d.current=M?.offset??[0,0],m.current=d.current,u.current=M?.scale??1,h.current===null){let x=()=>{i.current?.invalidate(),h.current=requestAnimationFrame(x)};h.current=requestAnimationFrame(x)}},[e]),b=Da(S=>{if(!e||!l.current)return;let M=o.current,x=M?.clientWidth||1,C=M?.clientHeight||1,A=S.clientX-l.current.x,P=S.clientY-l.current.y;if(!c.current&&Math.hypot(A,P)<F2)return;c.current=!0;let _=-(A/x)*f1,R=P/C*f1,[k,T]=d.current,L=[k+_,T+R];m.current=L,p(L,u.current),s(e.objectKey,F=>({...F,material:{...F?.material,[e.textureKey]:{...F?.material?.[e.textureKey],path:r.current[e.objectKey]?.style?.material?.[e.textureKey]?.path,offset:L}}}))},[e,p,s]),w=Da(S=>{if(!e)return;S.target?.releasePointerCapture?.(S.pointerId),h.current!==null&&(cancelAnimationFrame(h.current),h.current=null);let M=c.current,x=e;if(M){s(x.objectKey,C=>({...C,material:{...C?.material,[x.textureKey]:{...C?.material?.[x.textureKey],path:r.current[x.objectKey]?.style?.material?.[x.textureKey]?.path,offset:m.current}}})),l.current=null,c.current=!1;return}l.current=null,t(null)},[e,s]);Vf(()=>{if(!e)return h.current!==null&&(cancelAnimationFrame(h.current),h.current=null),()=>{h.current!==null&&(cancelAnimationFrame(h.current),h.current=null)}},[e]),Vf(()=>{let S=a;if(!(!S||!e))return S.addEventListener("pointermove",b),S.addEventListener("pointerup",w),S.addEventListener("pointercancel",w),()=>{S.removeEventListener("pointermove",b),S.removeEventListener("pointerup",w),S.removeEventListener("pointercancel",w)}},[a,e,b,w]);let f=Da(S=>{if(!e)return;S.preventDefault();let M=e,x=Math.exp(-S.deltaY*U2),C=Math.min(H2,Math.max(G2,u.current*x));u.current=C,p(m.current,C),s(M.objectKey,A=>({...A,material:{...A?.material,[M.textureKey]:{...A?.material?.[M.textureKey],path:r.current[M.objectKey]?.style?.material?.[M.textureKey]?.path,scale:C}}}))},[e,p,s]);return Vf(()=>{let S=a;if(!(!S||!e))return S.addEventListener("wheel",f,{passive:!1}),()=>S.removeEventListener("wheel",f)},[a,e,f]),{beginMoveZoom:Da(S=>{c.current=!1,l.current=null,t(S)},[t]),handleMoveZoomPointerDown:g}}import{useFrame as W2,useThree as q2}from"@react-three/fiber";var X2=.2;function Ff({enabled:e,speed:t,controlsRef:r}){let n=q2(i=>i.invalidate);return W2((i,o)=>{!e||!r.current||(r.current.rotate(o*X2*t,0,!1),n())}),null}import{AlertTriangle as Cl,RotateCcw as $2,X as b1}from"lucide-react";import{jsx as Ht,jsxs as Ii}from"react/jsx-runtime";function v1({count:e,onDismiss:t}){let r=ce();return Ii("div",{className:"ri-bindingsMismatchBanner",children:[Ht(Cl,{size:14,className:"ri-bindingsMismatchBanner__icon"}),Ht("span",{children:r(e===1?"bindingMismatchOne":"bindingMismatchMany",{count:e})}),Ht("button",{type:"button",className:"ri-bindingsMismatchBanner__dismiss",onClick:n=>{n.stopPropagation(),t()},"aria-label":r("dismiss"),children:Ht(b1,{size:12})})]})}function y1({triangles:e,offset:t,onDismiss:r}){let n=ce();return Ii("div",{className:`ri-largeModelBanner ${t?"ri-largeModelBanner--offset":""}`,children:[Ht(Cl,{size:14,className:"ri-largeModelBanner__icon"}),Ht("span",{children:n("largeModelWarning",{millions:Math.round(e/1e6)})}),Ht("button",{type:"button",className:"ri-largeModelBanner__dismiss",onClick:i=>{i.stopPropagation(),r()},"aria-label":n("dismiss"),children:Ht(b1,{size:12})})]})}function x1({missing:e,total:t}){let r=ce();return Ii("div",{className:"ri-uvCheckerBanner",role:"status",children:[Ht(Cl,{size:14,className:"ri-uvCheckerBanner__icon"}),Ii("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 w1({failure:e,source:t}){return Ht("div",{className:"ri-loadError",role:"alert",children:Ii("div",{className:"ri-loadError__card",children:[Ii("div",{className:"ri-loadError__header",children:[Ht(Cl,{size:16,"aria-hidden":"true"}),Ht("span",{className:"ri-loadError__title",children:e.title})]}),Ht("p",{className:"ri-loadError__detail",children:e.detail}),Ht("p",{className:"ri-loadError__source",children:t}),e.technical&&Ht("p",{className:"ri-loadError__technical",children:e.technical})]})})}function S1({rebuilding:e,onReload:t}){let r=ce();return Ht("div",{className:"ri-contextRecovery",role:"alert",children:Ii("div",{className:"ri-contextRecovery__card",children:[Ht(Cl,{size:24,"aria-hidden":"true"}),Ht("h2",{children:r(e?"contextRestoringTitle":"contextLostTitle")}),Ht("p",{children:r(e?"contextRestoringMessage":"contextLostMessage")}),Ii("button",{type:"button",onClick:t,disabled:e,children:[Ht($2,{size:16,"aria-hidden":"true"}),r("reloadViewer")]})]})})}import{useCallback as Ad}from"react";function M1({applyBindingStyle:e,resolveObjectKey:t,onTextureUpload:r,fileInputRef:n,pendingObjectId:i,createdBlobUrls:o,texturePositioning:a,setMoveZoomTarget:s}){let l=Ad((w,f)=>{let y=o.current[w];y&&URL.revokeObjectURL(y),f.startsWith("blob:")?o.current[w]=f:delete o.current[w],e(w,S=>({...S,material:{...S?.material,texture:{path:f}}}))},[e]),c=w=>{let f=w.target.files?.[0],y=i.current;if(!f||!y)return;let S=t(y);S&&(r?r(f,S).then(M=>l(S,M),M=>console.error("onTextureUpload failed:",M)):l(S,URL.createObjectURL(f)),w.target.value="")},d=w=>{i.current=w,n.current?.click()},m=w=>{let f=t(w);if(!f)return;e(f,S=>S?.material?.texture?{...S,material:{...S.material,texture:void 0}}:S);let y=o.current[f];y&&(URL.revokeObjectURL(y),delete o.current[f])},u=!!a,h=typeof a=="object"?a:void 0,p=Ad((w,f,y)=>{if(h?.onOffsetChange){h.onOffsetChange(w,f,y);return}e(w,S=>{let M=S?.material?.texture;if(!M?.path)return S;let x=M.offset??[0,0],C=[x[0],x[1]];return C[f]=y,{...S,material:{...S?.material,texture:{...M,offset:C}}}})},[e,h]),g=Ad((w,f)=>{if(h?.onRotationChange){h.onRotationChange(w,f);return}e(w,y=>{let S=y?.material?.texture;if(!S?.path)return y;let M=(f%360+360)%360;return{...y,material:{...y?.material,texture:{...S,rotation:M*Math.PI/180}}}})},[e,h]),b=Ad(()=>{s(null),h?.onEndPositioning?.()},[h]);return{handleFileChange:c,triggerFileUpload:d,clearTexture:m,texturePositioningEnabled:u,texturePositioningOverrides:h,setMaterialTextureOffset:p,setMaterialTextureRotation:g,endMaterialTexturePositioning:b}}function C1({materialPopup:e,resolveObjectKey:t,currentObjectBindings:r,nodeRefsMap:n,moveZoomTarget:i,texturePositioningEnabled:o,texturePositioningOverrides:a,setMaterialTextureOffset:s,setMaterialTextureRotation:l,endMaterialTexturePositioning:c}){let d=e?t(e.objectId):null,m=d?r[d]?.style?.material?.texture?.path:void 0,u=m?bc(m)??m:void 0,h=sy(d?n.current[d]:null),p=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,b=o?a?.isPositioning??!!(d&&i?.objectKey===d&&i?.textureKey==="texture"):!1;return{materialTextureUrl:u,materialTargetTakesImage:h,materialTextureOffset:p,materialTextureRotationDegrees:g,isMaterialTexturePositioning:b,materialTextureOnOffsetChange:o?s:void 0,materialTextureOnRotationChange:o?l:void 0,materialTextureOnEndPositioning:o?c:void 0}}import{useId as P1}from"react";import{Box as Uf,Camera as Y2,ChevronLeft as K2,ChevronRight as Q2,Download as J2,FileImage as Z2,Maximize as eN,Minimize as tN,Orbit as rN,Play as T1,Square as nN}from"lucide-react";import{Fragment as La,jsx as Me,jsxs as ut}from"react/jsx-runtime";function _1({categories:e,selected:t,disabled:r,onChange:n}){let i=ce();return ut("div",{className:"ri-annotationFilters",role:"group","aria-label":i("annotationCategories"),onPointerDown:o=>o.stopPropagation(),children:[Me("span",{children:i("annotations")}),Me("button",{type:"button","aria-pressed":t===null,disabled:r,onClick:()=>n(null),children:i("all")}),e.map(o=>Me("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 A1({onCancel:e}){let t=ce();return ut("div",{className:"ri-isolationPill",role:"status",onPointerDown:r=>r.stopPropagation(),children:[Me("span",{className:"ri-isolationPill__label",children:t("decalDragHint")}),Me("button",{type:"button",className:"ri-isolationPill__button",onClick:e,children:t("cancel")})]})}function R1({label:e,onShowAll:t}){let r=ce();return ut("div",{className:"ri-isolationPill",onPointerDown:n=>n.stopPropagation(),children:[Me("span",{className:"ri-isolationPill__label",children:e}),Me("button",{type:"button",className:"ri-isolationPill__button",onClick:t,children:r("showAll")})]})}function E1({groups:e,activeVariants:t,onSelect:r}){let n=ce();return Me(La,{children:e.map((i,o)=>ut("div",{className:"ri-variantPicker",role:"group","aria-label":i.name??n("materialVariants"),onPointerDown:a=>a.stopPropagation(),children:[i.name?Me("span",{className:"ri-variantPicker__group","aria-hidden":"true",children:i.name}):null,i.variants.map(a=>{let s=t.includes(a.name);return ut("button",{type:"button",className:`ri-variantPicker__option ${s?"ri-variantPicker__option--active":""}`,"aria-pressed":s,onClick:()=>r(a.name),children:[a.swatch?Me("span",{className:"ri-variantPicker__swatch",style:{background:a.swatch},"aria-hidden":"true"}):null,a.label]},a.name)})]},i.name??`group-${o}`))})}function k1({count:e,active:t,index:r,navigating:n,onStart:i,onPrevious:o,onNext:a,onStop:s}){let l=ce();return t?ut(La,{children:[ut("button",{className:"ri-tourButton",onClick:o,disabled:n||e===0||r<=0,title:l("previousAnnotation"),children:[Me(K2,{size:16}),Me("span",{children:l("previous")})]}),Me("button",{className:"ri-tourButton ri-tourButton--stop",onClick:s,title:l("stopGuidedTour"),children:Me(nN,{size:16})}),ut("button",{className:"ri-tourButton ri-tourButton--next",onClick:a,disabled:n||e===0,title:l("nextAnnotation"),children:[Me("span",{children:l("next")}),Me(Q2,{size:16})]})]}):Me("button",{className:"ri-navButtonSingle",onClick:i,disabled:e===0,title:l("startGuidedTour"),children:l("guidedTour")})}function D1({fullscreen:e,disabled:t}){let r=ce();return ut("div",{className:"mv-fullscreenWrapper",children:[e.error&&Me("div",{className:"mv-fullscreenError",role:"alert",children:r.message(e.error)}),Me("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?Me(tN,{}):Me(eN,{})})]})}function O1({open:e,current:t,disabled:r,onSelect:n,onToggle:i}){let o=ce();return ut("div",{className:"mv-controllersWrapper",onPointerDown:a=>a.stopPropagation(),children:[e&&ut("div",{className:"mv-controllersMenu",children:[Me("button",{type:"button",className:`mv-controllersMenuItem ${t==="orbit"?"mv-controllersMenuItem--active":""}`,onClick:()=>n("orbit"),children:o("orbitControl")}),Me("button",{type:"button",className:`mv-controllersMenuItem ${t==="pointerLock"?"mv-controllersMenuItem--active":""}`,onClick:()=>n("pointerLock"),children:o("pointLock")})]}),Me("button",{className:"mv-controllersButton",onClick:i,title:o("cameraController"),"aria-label":o("cameraControllerSettings"),disabled:r,children:Me(rN,{size:15})})]})}function L1({menu:e,recording:t,hasScene:r,canCaptureImage:n,canRecord:i,hasCinematic:o,hasMultipleModels:a=!1}){let s=ce(),l=P1(),c=P1(),{isDownloading:d,downloadMenuOpen:m,uvExportError:u,toggleDownloadMenu:h,handleDownloadMesh:p,handleDownloadSeparateMeshes:g,handleDownloadScreenshot:b,handleDownloadUvLayout:w,handleDownloadVideo:f,videoFormat:y,setVideoFormat:S,videoExportError:M}=e;return ut("div",{className:"mv-downloadWrapper",onPointerDown:x=>x.stopPropagation(),children:[m&&ut("div",{className:"mv-downloadMenu",children:[ut("button",{className:"mv-downloadMenuItem",onClick:p,disabled:d||t||!r,"aria-describedby":l,children:[Me(Uf,{size:14}),s(a?"downloadCombinedGLB":"downloadGLB")]}),Me("p",{className:"mv-downloadMenuDescription",id:l,children:s("downloadGLBDescription")}),e.openConfiguredAR&&ut("button",{type:"button",className:"mv-downloadMenuItem",onClick:e.openConfiguredAR,disabled:t||!r,"aria-haspopup":"dialog",children:[Me(Uf,{size:14}),s("arConfiguredButton")]}),a&&ut(La,{children:[ut("button",{className:"mv-downloadMenuItem",onClick:g,disabled:d||t||!r,"aria-describedby":c,children:[Me(Uf,{size:14}),s("downloadSeparateGLBs")]}),Me("p",{className:"mv-downloadMenuDescription",id:c,children:s("downloadSeparateGLBsDescription")})]}),Me("div",{className:"mv-downloadMenuDivider"}),n&&ut(La,{children:[ut("button",{className:"mv-downloadMenuItem",onClick:b,disabled:t||!r,children:[Me(Y2,{size:14}),s("downloadPNG")]}),Me("div",{className:"mv-downloadMenuDivider"})]}),ut("button",{className:"mv-downloadMenuItem",onClick:w,disabled:t||!r,children:[Me(Z2,{size:14}),s("downloadUVLayout")]}),Me("div",{className:"mv-downloadMenuDivider"}),ut("label",{className:"mv-downloadMenuItem",children:[s("videoFormat"),ut("select",{"aria-label":s("videoFormat"),value:y,onChange:x=>S(x.target.value),children:[Me("option",{value:"auto",children:s("auto")}),Me("option",{value:"webm",disabled:!Bn("webm"),children:"WebM"}),Me("option",{value:"mp4",disabled:!Bn("mp4"),children:"MP4"}),Me("option",{value:"gif",disabled:!Bn("gif"),children:"GIF"})]})]}),ut("button",{className:"mv-downloadMenuItem",onClick:()=>{f("turntable")},disabled:t||!i||!Bn(y),children:[Me(T1,{size:14}),s("recordTurntableVideo")]}),o&&ut("button",{className:"mv-downloadMenuItem",onClick:()=>{f("cinematic")},disabled:t||!i||!Bn(y),children:[Me(T1,{size:14}),s("recordCinematicVideo")]}),!Bn()&&!Bn("gif")&&Me("div",{className:"mv-downloadMenuNotice",role:"status",children:s("videoUnsupported")}),M&&Me("div",{className:"mv-downloadMenuNotice",role:"alert",children:s.message(M)}),u&&Me("div",{className:"mv-downloadMenuNotice",role:"status","aria-live":"polite",children:s.message(u)})]}),Me("button",{className:"mv-downloadButton",onClick:h,disabled:d||t||!r,title:s("downloadOptions"),children:d?ut(La,{children:[Me("span",{className:"mv-downloadButton__spinner"}),s("exporting")]}):ut(La,{children:[Me(J2,{size:15}),s("download")]})})]})}function I1({x:e,y:t,form:r,setForm:n,onOk:i,onCancel:o}){let a=ce();return ut("div",{className:"ri-annotationPopup",style:{left:e,top:t},onPointerDown:s=>s.stopPropagation(),onClick:s=>s.stopPropagation(),children:[Me("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()}}),Me("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}),ut("div",{className:"ri-annotationActions",children:[Me("button",{onClick:i,className:`ri-annotationOkBtn ${r.title.trim()?"":"disabled"}`,disabled:!r.title.trim(),children:a("ok")}),Me("button",{onClick:o,className:"ri-annotationCancelBtn",children:a("cancel")}),Me("div",{className:"ri-annotationIcons"})]})]})}import{useEffect as iN,useState as B1}from"react";import{Fragment as Rd,jsx as ft,jsxs as dt}from"react/jsx-runtime";function N1({section:e,onChange:t}){let{isInsideEditor:r,tier:n}=gi(),i=r&&!jc(n,"sectionPlanes"),[o,a]=B1(""),s=e.mode??"plane",l=e.planes??[],c=l.find(p=>p.id===e.activePlaneId)??l[0],d=s==="planes"?c:e,m=p=>t(s==="planes"?{planes:l.map(g=>g.id===c?.id?{...g,...p}:g)}:p),u={x:0,y:1,z:2},h=()=>globalThis.crypto?.randomUUID?.()??`section-${Date.now()}-${Math.random().toString(36).slice(2)}`;return dt("div",{className:"ri-sectionControls",children:[i?ft(rx,{requiredTier:"starter",feature:"Multiple planes and section boxes"}):null,dt("label",{children:["Cut type",dt("select",{value:s,disabled:i,onChange:p=>{let g=p.target.value;t({mode:g,...g==="planes"&&!l.length?{planes:[{id:"cut-1",name:"Plane 1",axis:e.axis,position:e.position,flip:e.flip,enabled:!0,...e.normal?{normal:e.normal}:{}}],activePlaneId:"cut-1"}:{}})},children:[ft("option",{value:"plane",children:"Single plane"}),ft("option",{value:"planes",children:"Multiple planes"}),ft("option",{value:"box",children:"Section box"})]})]}),s==="planes"&&dt(Rd,{children:[dt("label",{children:["Active plane",ft("select",{value:c?.id??"",onChange:p=>t({activePlaneId:p.target.value}),children:l.map(p=>dt("option",{value:p.id,children:[p.name,p.enabled?"":" (off)"]},p.id))})]}),dt("div",{className:"ri-sectionControls__actions",children:[ft("button",{type:"button",disabled:l.length>=6,onClick:()=>{let p=h();t({planes:[...l,{id:p,name:`Plane ${l.length+1}`,axis:"x",position:.5,flip:!1,enabled:!0}],activePlaneId:p})},children:"Add plane"}),ft("button",{type:"button",disabled:!c,onClick:()=>t({planes:l.filter(p=>p.id!==c?.id),activePlaneId:l.find(p=>p.id!==c?.id)?.id}),children:"Remove plane"})]}),c&&dt(Rd,{children:[dt("label",{children:["Name",ft("input",{value:c.name,maxLength:200,onChange:p=>m({name:p.target.value.trim()||"Plane"})})]}),dt("label",{className:"ri-sectionControls__check",children:[ft("input",{type:"checkbox",checked:c.enabled,onChange:p=>m({enabled:p.target.checked})}),"Enable this plane"]})]})]}),s==="box"?dt(Rd,{children:[dt("label",{children:["Draggable face",ft("select",{value:e.activePlaneId?.match(/^[xyz]-(min|max)$/)?e.activePlaneId:"x-min",onChange:p=>t({activePlaneId:p.target.value}),children:["x","y","z"].flatMap(p=>["min","max"].map(g=>dt("option",{value:`${p}-${g}`,children:[p.toUpperCase()," ",g]},`${p}-${g}`)))})]}),ft("div",{className:"ri-sectionControls__bounds",children:["x","y","z"].flatMap(p=>["min","max"].map(g=>{let b=(e.box??{min:[0,0,0],max:[1,1,1]})[g][u[p]];return dt("label",{children:[p.toUpperCase()," ",g,dt("output",{children:[Math.round(b*100),"%"]}),ft("input",{"aria-label":`${p.toUpperCase()} ${g}`,type:"range",min:"0",max:"1",step:".001",value:b,onChange:w=>t(gd(e,`${p}-${g}`,Number(w.target.value)))})]},p+g)}))}),dt("label",{className:"ri-sectionControls__check",children:[ft("input",{type:"checkbox",checked:!!e.invertBox,onChange:p=>t({invertBox:p.target.checked})}),"Keep outside box"]})]}):d&&dt(Rd,{children:[dt("label",{children:["Orientation",dt("select",{value:d.normal?"custom":d.axis,onChange:p=>p.target.value==="custom"?m({normal:[1,1,0]}):m({axis:p.target.value,normal:void 0}),children:[ft("option",{value:"x",children:"X"}),ft("option",{value:"y",children:"Y"}),ft("option",{value:"z",children:"Z"}),ft("option",{value:"custom",children:"Angled plane"})]})]}),d.normal&&ft("div",{className:"ri-sectionControls__vector",children:[0,1,2].map(p=>dt("label",{children:["Normal ","XYZ"[p],ft(oN,{label:`Normal ${"XYZ"[p]}`,value:d.normal[p],onChange:g=>{let b=[...d.normal];b[p]=g,Math.hypot(...b)>1e-8&&m({normal:b})}})]},p))}),dt("label",{children:["Position",dt("output",{children:[Math.round(d.position*100),"%"]}),ft("input",{type:"range",min:"0",max:"1",step:".001","aria-label":"Section position",value:d.position,onChange:p=>m({position:Number(p.target.value)})})]}),dt("label",{className:"ri-sectionControls__check",children:[ft("input",{type:"checkbox",checked:d.flip,onChange:p=>m({flip:p.target.checked})}),"Keep the other side"]})]}),dt("details",{children:[dt("summary",{children:["Saved section presets (",e.presets?.length??0,")"]}),dt("form",{onSubmit:p=>{p.preventDefault();let g=o.trim();!g||(e.presets?.length??0)>=32||(t({presets:[...e.presets??[],{id:h(),name:g,settings:Kp(e)}]}),a(""))},children:[dt("label",{children:["Preset name",ft("input",{value:o,maxLength:200,onChange:p=>a(p.target.value)})]}),ft("button",{disabled:!o.trim()||(e.presets?.length??0)>=32,children:"Save current section"})]}),e.presets?.map(p=>dt("div",{className:"ri-sectionControls__actions",children:[ft("button",{type:"button",onClick:()=>t({...Kp(p.settings),normal:p.settings.normal,planes:p.settings.planes,activePlaneId:p.settings.activePlaneId,box:p.settings.box,invertBox:p.settings.invertBox,mode:p.settings.mode}),children:p.name}),ft("button",{type:"button","aria-label":`Delete preset ${p.name}`,onClick:()=>t({presets:e.presets?.filter(g=>g.id!==p.id)}),children:"Delete"})]},p.id))]}),ft("p",{children:"Visual cuts of the active asset. Multiple planes keep their common region. Presets are saved with your scene."})]})}function oN({label:e,value:t,onChange:r}){let[n,i]=B1(String(t));return iN(()=>i(String(t)),[t]),ft("input",{type:"number",step:".1","aria-label":e,value:n,onChange:o=>{let a=o.target.value;i(a),a.trim()&&Number.isFinite(Number(a))&&r(Number(a))},onBlur:()=>i(String(t))})}import{useState as aN}from"react";import{QRCodeSVG as sN}from"qrcode.react";import{Box as lN,ChevronDown as cN,Expand as uN,Grid3X3 as dN,Pause as pN,Play as mN,QrCode as hN,RectangleGoggles as fN,Slice as gN,Smartphone as j1,Square as bN,X as vN}from"lucide-react";import{jsx as He,jsxs as wn}from"react/jsx-runtime";function z1({top:e,configuredHandoff:t=!1,xrStore:r,arSupported:n,vrSupported:i,quickLookSupported:o,mobileHandoffUrl:a,mobileHandoffOpen:s,onQuickLook:l,onOpenMobileHandoff:c}){let d=ce();return wn("div",{className:"ri-xrTools",style:{top:`${e}px`},children:[!n&&o&&wn("button",{type:"button",className:"ri-xrButton",onClick:l,title:d("viewThisModelInARWithAppleQuickLook"),children:[He(lN,{size:16}),d("viewInAR")]}),(a||t&&!o)&&wn("button",{type:"button",className:"ri-xrButton",onClick:c,title:d(t?"arConfiguredTitle":"openThisExperienceOnAPhoneForAR"),"aria-haspopup":"dialog","aria-expanded":s,children:[He(hN,{size:16}),He("span",{children:d(t?"arConfiguredButton":"openOnPhone")})]}),r&&n&&wn("button",{type:"button",className:"ri-xrButton",onClick:()=>r.enterAR().catch(m=>{console.error("Failed to enter AR session:",m)}),title:d("viewThisModelInYourSpace"),children:[He(j1,{size:16}),He("span",{children:d("enterAR")})]}),r&&i&&wn("button",{type:"button",className:"ri-xrButton",onClick:()=>r.enterVR().catch(m=>{console.error("Failed to enter VR session:",m)}),title:d("viewThisModelInVR"),children:[He(fN,{size:16}),He("span",{children:d("enterVR")})]})]})}function V1({url:e,onClose:t}){let r=ce();return He("div",{className:"ri-mobileHandoffBackdrop",onMouseDown:n=>{n.target===n.currentTarget&&t()},children:wn("section",{className:"ri-mobileHandoffDialog",role:"dialog","aria-modal":"true","aria-labelledby":"ri-mobileHandoffTitle",children:[He("button",{type:"button",className:"ri-mobileHandoffClose",onClick:t,"aria-label":r("closePhoneHandoff"),children:He(vN,{size:18})}),He(j1,{size:22,"aria-hidden":"true"}),He("h2",{id:"ri-mobileHandoffTitle",children:r("viewInAR")}),He("p",{children:r("arScanCode")}),He("div",{className:"ri-mobileHandoffQr",children:He(sN,{value:e,size:208,level:"M",marginSize:4,title:r("qrCodeToOpenThisModelOnAPhone")})})]})})}function F1({top:e,active:t,onToggle:r}){let n=ce();return He("div",{className:"ri-uvCheckerTools",style:{top:`${e}px`},children:He("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:He(dN,{size:16})})})}function U1({top:e,open:t,factor:r,onToggleOpen:n,onFactorChange:i}){let o=ce();return wn("div",{className:"ri-explodeTools",style:{top:`${e}px`},children:[He("button",{type:"button",className:`ri-measureButton ${t||r>0?"ri-measureButton--active":""}`,onClick:n,title:o("explodedView"),"aria-pressed":t,children:He(uN,{size:16})}),t&&He("div",{className:"ri-explodeSlider",onPointerDown:a=>a.stopPropagation(),children:He("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 G1({top:e,section:t,onChange:r}){let n=ce(),[i,o]=aN(!1);return wn("div",{className:"ri-sectionTools",style:{top:`${e}px`},children:[He("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:He(gN,{size:16})}),t.enabled&&He("button",{type:"button",className:"ri-measureButton","aria-label":"Section settings",title:"Section settings","aria-expanded":i,onClick:()=>o(a=>!a),children:He(cN,{size:14})}),t.enabled&&i&&He("div",{className:"ri-sectionPanel",onPointerDown:a=>a.stopPropagation(),children:He(N1,{section:t,onChange:r})})]})}function H1({top:e,playing:t,disabled:r,onPlay:n,onPause:i,onStop:o}){let a=ce();return wn("div",{className:"ri-cinematicTools",style:{top:`${e}px`},children:[He("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?He(pN,{size:16}):He(mN,{size:16})}),t&&He("button",{type:"button",className:"ri-measureButton ri-measureButton--stop",onClick:o,title:a("stopCinematicAndResetCamera"),children:He(bN,{size:16})})]})}function W1({progress:e,onCancel:t}){let r=ce();return He("div",{className:"ri-recordingOverlay",onPointerDown:n=>n.stopPropagation(),children:wn("div",{className:"ri-isolationPill",role:"status","aria-live":"polite",children:[He("span",{className:"ri-isolationPill__label",children:r("recordingVideo",{progress:e})}),He("button",{type:"button",className:"ri-isolationPill__button",onClick:t,children:r("cancel")})]})})}function q1(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{useEffect as yN}from"react";function X1({enabled:e,canvasAreaElement:t,fitAttemptedRef:r,fitInFlightRef:n,controlsRef:i,cameraFramingRef:o,nodeRefsMap:a,fitScene:s}){yN(()=>{if(!e)return;let l=t;if(!l)return;let c=null,d=new ResizeObserver(()=>{!r.current||n.current||(c&&clearTimeout(c),c=setTimeout(()=>{let m=i.current,u=o.current;if(u.kind==="view"&&m){if(Lx(m,u.target))return}else if(u.kind==="object"&&m){let h=a.current[u.key];if(h&&Ox(m,h)){m.fitToBox(h,!0,qc).catch(()=>{});return}}s()},150))});return d.observe(l),()=>{d.disconnect(),c&&clearTimeout(c)}},[t,s,e])}import{Fragment as Hf,jsx as K,jsxs as Hr}from"react/jsx-runtime";function Pl(e){let r=e.split(/[?#]/)[0].split("/");return(r[r.length-1]||e).replace(/\.[^./]+$/,"")||e}var TN=Object.freeze({}),_N=[],AN={};function RN(e){let t=Hx(ox(e)),r=t.props,n=tu(r.activeModelId??Le(r.models?.find(b=>b.url===r.modelUrl)??{url:r.modelUrl}),r.tilesetUrl),i=de(n);i.current=n;let o=de(null),a=de(null),s=fe(()=>{let b=a.current;b&&(o.current=b.snapshot())},[]),l=S0(s),c=P0(e),[d,m]=Ce(null);We(()=>()=>{d&&URL.revokeObjectURL(d)},[d]);let u=()=>{s();let b=i.current;a.current?.captureFrame().then(w=>{w&&(b===i.current?m(w):URL.revokeObjectURL(w))})};On(()=>{o.current=null,m(null)},[n]);let h=de(null),p=Dy({loading:r.loading,reveal:r.reveal,rootRef:h,onPark:u}),{release:g}=l;return We(()=>{p.live||g()},[p.live,g]),K(Cv,{labels:e.labels,children:Hr("div",{className:"ri-viewerSlot",ref:h,children:[t.error&&K("div",{className:"ri-configuredARError",role:"alert",children:t.error}),p.live?K(kN,{...r,contextRecovery:l,engagement:c,resumeRef:o,viewerHandleRef:a,offscreen:!p.visible,frame:d},l.generation):K(Oy,{className:"ri-viewer",background:pm(r.backgroundColor,r.sceneConfig),poster:d??r.poster,onReveal:p.awaitingReveal?p.reveal:void 0})]})})}var EN={};function kN({labels:e,contextRecovery:t,engagement:r,modelUrl:n,tilesetUrl:i,tilesErrorTarget:o=8,tilesCacheSize:a=800,onObjectCatalog:s,modelFormat:l,licenseKey:c,licenseValidationUrl:d,onLicenseStatusChange:m,hideLicenseCheckingOverlay:u=!1,objectBindings:h="auto",selectedObject:p,comparisonHighlights:g,multiSelectedKeys:b,selectedObjectRefs:w,selectedObjectOutlineColor:f,panelHoveredObject:y,onObjectBindingsChange:S,onObjectSelect:M,onObjectHover:x,onObjectDoubleClick:C,onDecalDoubleClick:A,onObjectContextMenu:P,decalMove:_,onObjectEditLeaseChange:R,onSelectionClear:k,onSceneLoaded:T,onModelLoaded:L,onAssetDiagnostics:F,onRuntimeStats:j,runtimeStatsIntervalMs:V,onLoadError:E,onProgress:O,onCameraControllerChange:Z,cameraControllerType:ee,onAction:J,onHiddenObjectsChange:U,onCameraChange:Q,onViewerReady:q,onTextureUpload:G,onAnimationsReady:H,onSequencesReady:se,showSequenceControls:ve=!0,sequenceAutoPlay:Ne=!0,onModelAnimationsReady:$,onAnnotationsChange:xe,activeAnnotation:Te,onActiveAnnotationChange:we,camera:pt,cameraLimits:te,backgroundColor:_t,shadows:ne=!0,showObjectBindingDataPanel:De=!0,customObjectBindingDataPanel:Fe,customSceneObjectsPanel:ae,showSceneObjectsPanel:qe=!0,showDownloadButton:ze=!0,downloadFilename:pe="model",showResetButton:_e=!0,showFullscreenButton:Be=!1,showLoadingOverlay:Ye=!0,showMouseController:Nt=!1,mouseControllerPosition:jt="center-bottom",mouseControllerOpacity:ie=1,moveSensitivity:Ie=.08,zoomSensitivity:je=1,sceneConfig:Mt,onSceneConfigChange:Ue,disableZoom:re=!1,zoomOnSelected:oe=!0,highlightOnHover:le=!0,enableCameraControls:Ee=!0,onAutoFit:Oe,refitOnResize:Ot=!0,renderMode:qt="demand",maxDpr:Rt=2,preserveDrawingBuffer:gt=!1,webgpu:rr=!1,performanceProfile:kt="auto",dracoDecoderPath:Xt,ktx2TranscoderPath:$t,meshopt:Ke=!0,showMeasureTools:Qe=!1,showUvCheckerButton:bt=!1,showExplodeControls:_r=!1,showMaterialVariants:Wr=!0,showObjectNavigator:Sn=!0,showSectionTools:nr=!1,isolation:Jn,onIsolationChange:Ia,showIsolateControls:Mn=!1,cinematic:Zn,measurementUnit:nn="m",measurements:ko,onMeasurementsChange:ei,measurementSettings:_l,measurementModelId:Ld,onMeasurementSettingsChange:Bi,enableXR:Do=!1,usdzUrl:Id,arScaleMode:I="normalized",mobileHandoffUrl:N,arHandoff:B,arLanding:Y=!1,showAnnotationNavigation:W=!0,showAnnotationOnHover:ue=!1,showAnnotationFilters:ge=!0,annotationCategories:vt,onAnnotationCategoriesChange:rt,moveModeEnabled:st=!1,scaleModeEnabled:nt=!1,gizmoTool:mt,showFloorGrid:or=!1,productOptions:Pe,objectTransformSpace:zt="world",enableKeyboardNavigation:Yt=!1,reducedMotion:Ir="user",showViewGizmo:Ba=!1,overlay:pr,unsafe_sceneChildren:ar,autoRotate:Na,autoRotateSpeed:eP,onTexturePositioningChange:Bd,endTexturePositioningRef:Al,texturePositioning:Xf,extraModelUrls:tP,onExtraModelError:$f,onExtraModelLoaded:Rl,originalNodePoses:rP,models:Xe,mergeModels:Nd,onMergeModelLoaded:Yf,onMergeModelError:Kf,poster:Qf,resumeRef:Jf,viewerHandleRef:jd,offscreen:nP,frame:Zf,onModelChange:eg,activeModelId:iP,onActiveModelChange:zd}){let sr=ce(),ye=iP??Le(Xe?.find(v=>v.url===n)??{url:n}),tg=Xe?.find(v=>Le(v)===ye)?.visible!==!1,qr=tu(ye,i),[Wt]=Ce(()=>Jf.current?.model===qr?Jf.current:null),ti=Qy(Ir);We(()=>()=>r.interrupt(),[r]);let rg=de(r);rg.current=r;let{autoBindings:Vd,controlled:ng,currentBindings:ke,applyBindings:Xr,bindingsForModel:Ni,modelEdits:oP}=c0({modelUrl:n,activeModelId:ye,tilesetUrl:i,models:Xe,objectBindings:h,onChange:S,initialBindings:Wt?.objectBindings,initialModelEdits:Wt?.modelBindingEdits}),{isInsideEditor:Br,activeTab:aP,activeSubTab:sP,annotating:El,openMeasurementsPanel:lP,xrToolsTarget:ig}=gi(),cP=Br&&aP==="scene"&&sP==="lighting",Oo=Cx(c,d,m),[Fd,uP]=Ce(()=>Wt?.lightEdits??{}),[kl,og]=Ce(Wt?.variantEdit),[Dl,ag]=Ce(Wt?.sectionEdit),[Ol,sg]=Ce(()=>Wt?.measurementEdits??{}),Ud=JSON.stringify(Mt?.measurements??null),lg=de(new Map);We(()=>{let v=lg.current.get(qr);lg.current.set(qr,Ud),v!==void 0&&v!==Ud&&sg(D=>{let z={...D};return delete z[qr],z})},[qr,Ud]);let Ae=wt(()=>{let v=_m(Mt??Sc,Fd);return kl!==void 0&&(v={...v,model:Jp(v.model,kl)}),Dl!==void 0&&(v={...v,section:{...us,...v.section,...Dl}}),Ol[qr]&&(v={...v,measurements:Ol[qr]}),v},[Mt,Fd,kl,Dl,Ol,qr]),Lo=de(Ae);Lo.current=Ae;let ja=fe(v=>{let D=Lo.current,z={settings:{},items:[],...D.measurements,...v};Ue?Ue({...D,measurements:z}):sg(X=>({...X,[qr]:z}))},[qr,Ue]),cg=fe(v=>{ei?ei(v):ja({items:v})},[ei,ja]),ug=fe(v=>{Bi?Bi(v):ja({settings:v})},[Bi,ja]),Ll=ko??Ae.measurements?.items??_N,za=_l??Ae.measurements?.settings??AN,Gd=Ld??ds(ye),Va=Tc(za,nn),Hd=wt(()=>En(Ae.model),[Ae.model]);We(()=>{r.setActiveVariants(Hd)},[Hd,r]);let dP=Mt?En(Mt.model).join(`
|
|
79
|
-
`):"";On(()=>{og(void 0)},[dP,ye,n]);let pP=JSON.stringify(Mt?.section??null);On(()=>{ag(void 0)},[pP,ye,n]);let dg=fe(v=>{if(Ue){let D=Lo.current;Ue({...D,section:{...us,...D.section,...v}});return}ag(D=>({...D,...v}))},[Ue]),[pg,mP]=Ce(!1),mg=de([]),hP=fe(v=>{let D=Lo.current,z=En(D.model),X=mg.current,Se=X.find(et=>et.variants.some(it=>it.name===v)),$e=z.find(et=>Se?Se.variants.some(it=>it.name===et):et===v)??null,Je=z.includes(v)?z.filter(et=>et!==v):Wv(z,v,X);if(r.chooseVariant(Je.includes(v)?v:null,$e,Se?.name??null),Ue){Ue({...D,model:Jp(D.model,Je)});return}og(Je)},[Ue,r]),hg=fe(v=>{if(Ue){Ue(_m(Lo.current,v));return}uP(D=>{let z={...D};for(let[X,Se]of Object.entries(v))z[X]={...D[X],...Se};return z})},[Ue]),[Wd,fg]=Ce(null),[qd,gg]=Ce(null),[bg,vg]=Ce(null),yg=de(0),[Xd,xg]=Ce(null),[wg,Sg]=Ce(Wt?.uvCheckerOverride??null),Fa=Ae.model.renderer==="uv-checker",$d=bt?wg??Fa:Fa,yr=wt(()=>{let v=$d?"uv-checker":Fa?"pbr":Ae.model.renderer;return v===Ae.model.renderer?Ae:{...Ae,model:{...Ae.model,renderer:v}}},[Fa,Ae,$d]);On(()=>{Sg(null)},[ye,n,Ae.model.renderer,bt,i]);let Mg=wt(()=>pm(_t,Ae),[_t,Ae]),Il=wt(()=>({dracoDecoderPath:Xt,ktx2TranscoderPath:$t,meshopt:Ke}),[Xt,$t,Ke]),fP=wt(()=>yy(kt),[kt]),Ve=de(null),[Cg,gP]=Ce(()=>Wt&&Wt.cameraControllerType!=="pointerLock"?Wt.cameraControllerType:"orbit"),[bP,Pg]=Ce(!1),ji=ee!==void 0?ee:Cg,Bl=fe(v=>{Pg(!1),v!==ji&&(gP(v),Z?.(v))},[ji,Z]),[Ua,Tg]=Ce(!1),_g=de({dragging:!1,endedAt:-1/0}),Ag=fe(v=>{_g.current={dragging:v,endedAt:v?-1/0:performance.now()},Tg(v)},[]),[mr,Ga]=Ce(null),Ha=!!(Xf||Bd||Al),Rg=de(Bd);Rg.current=Bd,We(()=>{Rg.current?.(mr)},[mr]),We(()=>{if(Al)return Al.current=()=>Ga(null),()=>{Al.current=null}},[]),We(()=>{Ve.current&&(Ve.current.dollySpeed=Math.max(je,0))},[je]),We(()=>{Ve.current&&(Ve.current.enabled=Ee&&!Ua&&!pg&&!mr)},[Ee,Ua,pg,mr]);let Yd=de(null),Kd=de(new Map),Eg=de(null),vP=de(null),Nr=de(null),kg=de({});We(()=>()=>{for(let v of Object.values(kg.current))URL.revokeObjectURL(v)},[]);let Kt=de({}),Io=de(xs),[yP,xP]=Ce(0),Qd=fe(()=>{xP(v=>v+1)},[]),ri=de({}),Ct=!!(Xe&&Xe.length>=1&&!i),Nl=de(Xe);Nl.current=Xe;let jl=de(new Map),{scenesByUrlRef:zi,cameraHomesByUrlRef:$r,materialRefsByUrlRef:Dg,getMaterialRefsForUrl:wP}=a0(Ct,Xe),zl=de(null),Og=de(null),Vl=y0(Be),Yr=de(null),[Jd,SP]=Ce(null),MP=fe(v=>{Yr.current=v,SP(v)},[]);h1({canvasAreaElement:Jd,controlsRef:Ve,enabled:Yt&&Ee&&!st&&!nt});let Fl=de(null),[Vi,Ul]=Ce({}),[Lg,Zd]=Ce(null),[Gl,ep]=Ce(null),[CP,PP]=Ce(null),[TP,_P]=Ce(null),[Kr,Ig]=Ce(null),[AP,RP]=Ce({}),Ze=de(null),tp=de(null),rp=de(!1),Bg=de(n);Bg.current=n;let Hl=de(null),np=de(F);np.current=F;let Fi=de(null),ip=de(0),Ng=de(null),[EP,kP]=Ce(0),on=de(!1),Wa=de(!1),qa=de(null),Wl=de(!!pt);Wl.current=!!pt;let Qr=de(null),ql=de(Wt?.camera?{camera:Wt.camera,home:Wt.home}:null),[Xl,Ui]=Ce(!!n),[ni,Gi]=Ce(!n||!!Oe||!!pt),[Pt,jg]=Ce(!1),[Xa,zg]=Ce([]),[$a,op]=Ce(!1),[Hi,ap]=Ce(null),[Vg,Bo]=Ce(!1),[DP,OP]=Ce(0),sp=de(""),Fg=de(new Set),Ug=de(""),[Gg,Hg]=Ce(!1),lp=de(new Set),[Wg,LP]=Ce(0),[cp,IP]=Ce(null),[BP,qg]=Ce(!1),[up,Xg]=Ce({total:0,missing:0}),[NP,$g]=Ce("loadingModel"),[jP,dp]=Ce(null),zP=Iy(jP),an=de({}),No=fe(()=>{let v=Ve.current;if(!v||Qr.current)return;Qr.current=fv(v,Fi.current??Ze.current);let D=qa.current;D?.usesSlots&&($r.current[D.url]=Qr.current)},[$r]),[jo,Yg]=Ce(()=>Wt?.explodeFactor??0),[VP,Kg]=Ce(!1);On(()=>{Yg(0),Kg(!1)},[ye,n,i]);let sn=wt(()=>{let v=Ae.cinematic,D=v?.enabled?{waypoints:v.waypoints,duration:v.duration,loop:v.loop,autoPlay:v.autoPlay}:null;return Zn===void 0?D&&(D.waypoints?.length??0)>=2?D:null:Zn===!1?null:Zn===!0?D??{}:{...D??{},...Zn}},[Zn,Ae]),[Ya,lr]=Ce(!1),[Qg,ii]=Ce(!1),pp=de(!1);We(()=>{lr(!1),ii(!1),pp.current=!1},[ye,n,i]),We(()=>{if(!(!sn?.autoPlay||pp.current)&&Pt&&ni&&!Xl){if(pp.current=!0,ti)return;lr(!0),ii(!1)}},[sn,Pt,ni,Xl,ti]);let FP=fe(()=>{lr(!1),ii(!0)},[]),{captureVideo:mp,cancelVideo:hp,isRecording:Jg,recording:yt,progress:UP,onProgress:Zg}=v0({rendererCaptureRef:Nr,controlsRef:Ve,cinematicConfig:sn,ready:t.status==="ready"&&Pt&&ni&&!Xl,modelUrl:`${ye}|${i??""}`,onCaptureStart:FP});We(()=>{t.status==="lost"&&(r.interrupt(),hp(),lr(!1),Ve.current?.stop())},[t.status,hp,r]);let xr=wt(()=>jx(()=>lr(!1)),[ye,n]),fp=wt(()=>({current:null}),[ye,n]),[eb,tb]=Ce(()=>new Map),$l=fe((v,D)=>{tb(z=>z.get(v)===D?z:new Map(z).set(v,D))},[]),rb=de(H);rb.current=H;let nb=de($);nb.current=$;let gp=de(se);gp.current=se;let ib=fe(v=>{fp.current=v,rb.current?.(v),Ct||$l(ye,v)},[fp,Ct,$l,ye]),GP=fe((v,D)=>{$l(v,D),nb.current?.(v,D)},[$l]),zo=wt(()=>{try{return dc(Ae.sequences??[])}catch{return[]}},[Ae.sequences]),Vo=wt(()=>(Ct&&Xe?Xe:[{url:n,id:ye}]).flatMap(D=>{let z=Le(D),X=eb.get(z);return!X||D.visible===!1?[]:[{id:z,label:D.label||Pl(D.url),controls:X,config:z===ye?Ae.animations:(D.sceneConfig??Ae).animations}]}),[Ct,Xe,n,ye,eb,Ae]),ob=JSON.stringify(Ct&&Xe?Xe.map(Le):[ye]),bp=wt(()=>Yc(Vo,zo),[Vo,zo]),[HP,WP]=Ce(""),Yl=bp.find(v=>v.id===HP),qP=v=>{WP(v);let D=bp.find(z=>z.id===v);if(D)Ss(D,Vo,xr,!0);else{xr.stop();for(let X of Vo)X.controls.stop(),X.config?.autoplayClip&&X.controls.play(X.config.autoplayClip);let z=zo.find(X=>X.autoPlay);z&&xr.play(z.id)}};We(()=>{let v=new Set(JSON.parse(ob));tb(D=>[...D.keys()].every(z=>v.has(z))?D:new Map([...D].filter(([z])=>v.has(z))))},[ob]);let{xrStore:XP,inARSession:vp,presenterRef:$P,arSupported:Kl,checkingAR:YP,vrSupported:ab,quickLookSupported:Ql,resolvedMobileHandoffUrl:Jl,isMobileHandoffOpen:sb,arOverlay:KP,openMobileHandoff:QP,closeMobileHandoff:JP,openQuickLook:ZP,handleARStateChange:eT}=ww({enableXR:Do,usdzUrl:Id,mobileHandoffUrl:N,configuredHandoff:!!B,engagement:r,animationControls:Pt?K(Zx,{sources:Vo,sequences:zo,sequenceControls:xr}):null});We(()=>(gp.current?.(Pt?xr:null),()=>gp.current?.(null)),[xr,Pt]),We(()=>()=>xr.destroy(),[xr]),We(()=>{ti&&xr.pause()},[xr,ti]);let Fo=Py(rr),lb=de(Fo);lb.current=Fo;let oi=Fo==="webgpu",Ka=oi?null:XP,cb=nr||Ae.section?.enabled===!0;We(()=>{if(!oi)return;let v=[cb&&"the section cut",(st||nt)&&"the transform gizmo"].filter(Boolean);v.length!==0&&console.info(`[react-immersive] With WebGPU, ${v.join(" and ")} ${v.length>1?"aren't":"isn't"} available; ${v.length>1?"they need":"it needs"} WebGL.`)},[oi,cb,st,nt]);let{annotations:NN,pendingAnnotation:Wi,setPendingAnnotation:ub,annotationForm:tT,setAnnotationForm:yp,currentAnnotationIndex:rT,isNavigating:nT,localAnnotationCategories:iT,selectedAnnotationCategories:oT,visibleAnnotations:db,availableAnnotationCategories:aT,annotationFiltersVisible:xp,changeAnnotationCategories:sT,sortedAnnotations:wp,currentAnnotation:pb,setActiveAnnotation:jN,focusAnnotation:zN,startGuidedTour:lT,goToPreviousAnnotation:cT,goToNextAnnotation:uT,stopGuidedTour:dT,closeViewingAnnotation:Zl,activeAnnotation:VN,activeViewingAnnotation:ec,isGuidedTourActive:qi,handleAnnotationOk:pT,handleAnnotationCancel:mT,handleAnnotationMarkerClick:mb}=c1({sceneAnnotations:Mt?.annotations,controlledAnnotationCategories:vt,onAnnotationCategoriesChange:rt,showAnnotationFilters:ge,initialCategories:Wt?.annotationCategories??null,controlledActiveAnnotation:Te,onActiveAnnotationChange:we,onAnnotationsChange:xe,controlsRef:Ve,sceneRef:Ze,annotationWorldPositionsRef:Kd,tourCameraOffsetRef:Yd,initialCameraStateRef:Qr,engagement:r,engagementRef:rg}),hT=Ae.section??us,hb=!Y&&Wr&&Pt&&Xa.length>0;mg.current=Xa;let fb=!Y&&(_e||ze||Be&&Vl.supported||W&&wp.length>0);an.current=ke,We(()=>{if(!mr)return;let v=ke[mr.objectKey]?.style?.material?.[mr.textureKey]?.path;(!Ha||!v)&&Ga(null)},[ke,Ha,mr]);let Sp=de({}),[tc,fT]=Ce({});We(()=>{let v={...tc},D=!1,z=new Set;for(let[X,Se]of Object.entries(ke)){z.add(X);let $e=Se.style?.material,Je=Sp.current[X]??{},et={};for(let Vt of hi){let hr=$e?.[Vt]?.path;hr&&(et[Vt]=hr,hr!==Je[Vt]&&(v[X]!==Vt&&(D=!0),v[X]=Vt))}let it=v[X];if(it&&!et[it]){let Vt=hi.find(hr=>!!et[hr]);Vt?v[X]=Vt:delete v[X],D=!0}Sp.current[X]=et}for(let X of Object.keys(v))z.has(X)||(delete v[X],delete Sp.current[X],D=!0);D&&fT(v)},[ke]);let Mp=wt(()=>Object.entries(ke).map(([v,D])=>JSON.stringify([v,D.modelObjectId,D.transform??null])).sort().join(""),[ke]),{measureMode:Ar,measureModeRef:gb,measurePoints:Cp,measurementTool:Pp,areaClosed:Tp,measurementError:gT,selectMeasurementTool:bT,undoMeasurementPoint:vT,finishMeasureArea:yT,snapMode:xT,setSnapMode:wT,snapPreview:bb,handleMeasurePointerMove:ST,clearSnapPreview:vb,showDimensions:_p,measureBox:rc,modelBounds:yb,refreshBounds:xb,clearMeasurements:MT,toggleMeasureMode:CT,toggleDimensions:PT,handleMeasurePointerDown:TT,handleMeasureClick:_T,saveMeasurement:AT,canSaveMeasurement:RT,canCalibrate:ET,calibrate:kT,savedResults:DT,setSavedResults:wb,exportMeasurementJson:OT,exportMeasurementCsv:LT,importMeasurements:IT}=bw({canvasAreaRef:Yr,controlsRef:Ve,sceneRef:Ze,modelUrl:ye,tilesetUrl:i,measurementModelId:Gd,savedMeasurements:Ll,measurementSettings:za,measurementUnit:nn,onMeasurementsChange:cg,onMeasurementSettingsChange:ug,onCollectionChange:v=>{ei?.(v.items),Bi?.(v.settings),ja(v)},modelRotation:Ae.model.rotation,bindingTransformSignature:Mp,modelLoaded:Pt,enabled:Qe&&!yt}),BT=fe(()=>{if(!Xe||Xe.length<2)return null;let v=Xe.map(D=>{let z=zi.current[Le(D)];if(!z)return null;let X=Le(D)===ye?ri.current:Dg.current[Le(D)]?.current??{};return{scene:z,objectBindings:Ni(D),matRefs:X,label:D.label||Pl(D.url)}}).filter(D=>D!==null);return v.length>0?v:null},[Xe,ye,n,Ni]),NT=fe(()=>{if(!Xe||Xe.length<2)return null;let v=Xe.map(D=>{let z=zi.current[Le(D)];return z?{scene:z,label:D.label||Pl(D.url)}:null}).filter(D=>D!==null);return v.length>0?v:null},[Xe]);We(()=>{(Ya||Ar||yt||t.status!=="ready")&&xr.stop()},[xr,Ya,Ar,yt,t.status]);let Ap=de(null),nc=de(Ae),jT=fe(()=>{if(!Pt)throw new Error("Wait for the current model to finish loading before preparing AR.");if(i)throw new Error("Streaming tiles are incomplete model data. Provide arHandoff.createUSDZ to prepare this asset.");let v=Ct?Xe:void 0,D=v?v.filter(z=>z.visible!==!1).map(z=>{let X=Le(z),Se=zi.current[X];if(!Se)throw new Error("Wait for every visible model to finish loading before preparing AR.");let $e=X===ye?Ap.current??Ni(z):ps(Ni(z),z.sceneConfig?.product).objectBindings;return{scene:Se,instanceId:X,objectBindings:$e,sceneConfig:X===ye?nc.current:z.sceneConfig??nc.current,materialOverrides:X===ye?ri.current:Dg.current[X]?.current}}):Ze.current?[{scene:Ze.current,instanceId:ye,sceneConfig:nc.current,objectBindings:Ap.current??ke,materialOverrides:ri.current}]:[];if(!D.length)throw new Error("Wait for a visible model to finish loading before preparing AR.");for(let z of D)ay(z.scene);return t0(D,Y?Yl:void 0,ye)},[Pt,i,Ct,Xe,Ni,ye,ke,Y,Yl]),[zT,VT]=Ce(34),Sb=de(void 0),FT=aw({openConfiguredAR:Do&&B?()=>Sb.current?.():void 0,sceneRef:Ze,materialRefs:ri,rendererCaptureRef:Nr,objectBindings:ke,downloadFilename:pe,getAllLoadedModels:BT,getAllLoadedModelUvSources:NT,captureVideo:mp}),Mb=wt(()=>Object.fromEntries(Object.entries(ke).filter(([,v])=>v.visible===!1).map(([v])=>[v,!0])),[ke]),ai=wt(()=>{let v=new WeakMap,D=new Map,z=new Map;for(let[X,Se]of Object.entries(ke))v.set(Se,X),D.has(Se.id)||D.set(Se.id,X),z.has(Se.modelObjectId)||z.set(Se.modelObjectId,X);return{byReference:v,byId:D,byModelObjectId:z}},[ke]),Jr=fe(v=>v?ai.byReference.get(v)??ai.byModelObjectId.get(v.modelObjectId)??ai.byId.get(v.id)??null:null,[ai]),Rp=p!==void 0,Xi=Rp?p??null:TP,ht=Jr(Xi);We(()=>{r.setSelectedPart(ht)},[ht,r]);let $i=ht?Kt.current[ht]??null:null,UT=ht?tc[ht]:void 0,Cb=Jr(le?y??Gl??CP:null),GT=Cb?Kt.current[Cb]??null:null,Ep=w??(b?b.map(v=>Kt.current[v]).filter(Boolean):null),ic=wt(()=>{let v=Ep??($i&&ke[ht??""]?.transform?.shear?[$i]:null);if(!v?.length)return null;let D=new Set(v),z=Object.entries(Kt.current).filter(([,X])=>D.has(X)).map(([X,Se])=>({key:X,node:Se,transform:ke[X]?.transform}));return z.length>1||z.some(({transform:X})=>X?.shear)?z:null},[Ep,ke,$i,ht]),Pb=fe(v=>{PP(v),x?.(v)},[x]),Tb=De&&Xi!==null&&ht!==null,Yi=(ht?ke[ht]:null)??Xi,Qa=Yi&&(Yi.modelObjectId||Yi.id)||null,Ja=Qa?AP[Qa]??null:null,[HT,_b]=Ce(""),Ab=de(null);We(()=>{let v=Ab.current;if(v!==ht)if(Ab.current=ht,ht){let D=Yi?.label||Xi?.label||ht;_b(sr("objectSelected",{name:D}))}else v&&_b(sr("selectionCleared"))},[ht,Yi,Xi,sr]),We(()=>{U?.(Mb)},[Mb,U]);let Uo=fe((v,D)=>{if(ji==="pointerLock"){Bl("orbit");return}v&&D?r.viewPart({objectId:v.id,objectKey:Jr(v)??(v.modelObjectId||v.id),label:v.label,source:D}):v||r.setSelectedPart(null),Rp||_P(v),M?.(v)},[ji,Bl,Rp,M,Jr,r]),Rb=de(Wt?.objectBindings?`${n}
|
|
80
|
-
${i??""}`:null),oc=fe((v,D)=>{if(!Vd)return;let z=`${n}
|
|
81
|
-
${i??""}`,X=Rb.current===z?an.current:TN;Rb.current=z;let Se=Zy(v,D);for(let $e of Object.keys(Se))X[$e]&&(Se[$e]=X[$e]);Xr(Se)},[Vd,n,i,Xr]),{glowMemoryRef:Eb,readObjectGlow:kb,applyGlow:Db}=E0({nodeRefsMap:Kt,currentObjectBindingsRef:an,applyObjectBindings:Xr}),WT=fe(v=>{let D=ht;if(!D||!v)return;let z=an.current[D];z&&Xr({...an.current,[D]:{...z,transform:{...z.transform,...v}}})},[Xr,ht]),qT=fe(v=>{let D=an.current,z={...D};for(let{key:X,transform:Se}of v){let $e=D[X];$e&&(z[X]={...$e,transform:{...$e.transform,...Se}})}Xr(z)},[Xr]),si=fe((v,D)=>ke[v]?v:D?Jr(D):ai.byId.get(v)??ai.byModelObjectId.get(v)??null,[ke,Jr,ai]),ac=fe((v,D)=>{let z=si(v),X=z?ke[z]:void 0;!z||!X||Xr({...ke,[z]:{...X,style:D(X.style)}})},[si,ke,Xr]),ln=fe(()=>{if(Kr){let v=Vi[Kr.objectId]?.hex;v!==void 0&&(ac(Kr.objectId,D=>({...D,material:{...D?.material,baseColor:v}})),Ul(D=>({...D,[Kr.objectId]:{}})))}Ig(null)},[Kr,Vi,ac]),kp=fe(()=>{Uo(null),Zd(null),ln()},[Uo,ln]),XT=fe((v,D,z,X,Se)=>{let $e=Og.current,Je=Yr.current,et=Ve.current?.camera;if(!$e)return{objectId:v,x:24,y:24};let it=$e.getBoundingClientRect(),Vt=12,hr=it.width-D-Vt,Pn=it.height-z-Vt,rs=Math.max(Vt,(it.width-D)/2),ns=Math.max(Vt,(it.height-z)/2),is=si(v,X),cn=is?Kt.current[is]:null,Er=(Tn,_n)=>_n<=Vt?Vt:Math.min(Math.max(Tn,Vt),_n);if(Je&&et&&cn){let Tn=Je.getBoundingClientRect(),_n=new Gf;new wN().setFromObject(cn).getCenter(_n),_n.project(et);let ci=(_n.x+1)/2*Tn.width+(Tn.left-it.left),ss=(1-_n.y)/2*Tn.height+(Tn.top-it.top);return{objectId:v,x:Er(ci+24,hr),y:Er(ss-z/2,Pn)}}let os=typeof Se?.screenX=="number"?Se.screenX-it.left:rs,as=typeof Se?.screenY=="number"?Se.screenY-it.top:ns;return{objectId:v,x:Er(os,hr),y:Er(as,Pn)}},[si]),sc=k0({setCurrentAction:Zd,bindingKeyIndex:ai,currentObjectBindings:ke,applyObjectBindings:Xr,resolveObjectKey:si,closeColorPicker:ln,setColorPicker:Ig,setMaterialPopupsByObject:RP,setItemMaterials:Ul,getPopoverPosition:XT,decalRequestRef:yg,setDecalError:vg,setDecalDragging:xg,setDecalControl:gg,resolvedSceneConfigRef:Lo,applyLightPatches:hg,readObjectGlow:kb,applyGlow:Db,glowMemoryRef:Eb,setLightControl:fg,onAction:J});We(()=>{if(Kr)return window.addEventListener("pointerdown",ln),()=>window.removeEventListener("pointerdown",ln)},[Kr,ln]),We(()=>{if(!ec)return;let v=D=>{if(Fl.current&&!Fl.current.contains(D.target)){if(D.target.closest?.(".ri-annotationMarker"))return;Zl()}};return document.addEventListener("mousedown",v),document.addEventListener("touchstart",v),()=>{document.removeEventListener("mousedown",v),document.removeEventListener("touchstart",v)}},[ec,Zl]),We(()=>{if(!Wi)return;let v=D=>{let z=D.target;if(z.closest?.(".ri-annotationPopup")||z.closest?.("button, input, textarea, .ri-measureTools, .ri-xrTools, .ri-buttonContainer"))return;let X=Yr.current;!X||!X.contains(z)||(ub(null),yp({title:"",description:""}))};return document.addEventListener("mousedown",v,!0),document.addEventListener("touchstart",v,!0),()=>{document.removeEventListener("mousedown",v,!0),document.removeEventListener("touchstart",v,!0)}},[Wi]);let{handleFileChange:$T,triggerFileUpload:Ob,clearTexture:Lb,texturePositioningEnabled:YT,texturePositioningOverrides:KT,setMaterialTextureOffset:QT,setMaterialTextureRotation:JT,endMaterialTexturePositioning:ZT}=M1({applyBindingStyle:ac,resolveObjectKey:si,onTextureUpload:G,fileInputRef:Eg,pendingObjectId:vP,createdBlobUrls:kg,texturePositioning:Xf,setMoveZoomTarget:Ga}),Dp=de(q);Dp.current=q;let jr=fe(()=>{let v=Ve.current;!v||!Dp.current||Dp.current({objectBindings:an.current,homeCameraState:Qr.current,captureImage:D=>Jg()?Promise.reject(new Error("Wait for video export to finish before capturing an image.")):Qc(Nr.current,D),isLoadingTiles:()=>rp.current,captureVideo:mp,invalidate:()=>Nr.current?.invalidate(),rendererBackend:lb.current??"webgl",raw:{controls:v,scene:Ze.current,nodes:Kt.current}})},[mp,Jg]),Go=fe(async(v=!1)=>{let D=Ve.current,z=Fi.current??Ze.current;if(!D||!z)return!1;Io.current=xs;try{return await Ix(D,z,{flyIn:v,onStart:()=>Gi(!0),invalidate:()=>Nr.current?.invalidate()}),(Fi.current??Ze.current)!==z?!1:(on.current=!0,No(),jr(),!0)}catch(X){return console.error("Fit scene error:",X),!1}},[No,jr]);We(()=>{let v={url:ye,usesSlots:Ct},D=Ex(qa.current,v,(Nl.current??[]).map(et=>Le(et)),zi.current,$r.current,Br),z=qa.current?$r.current[qa.current.url]:void 0;if(D&&z&&!$r.current[ye]&&($r.current[ye]=z),qa.current=v,on.current=!1,Wa.current=!1,Qr.current=Ct?$r.current[ye]??null:null,Ze.current=null,tp.current=null,rp.current=!1,Hl.current=null,Fi.current=null,jg(!1),zg([]),op(!1),ap(null),Bo(!1),sp.current="",Fg.current=new Set,lp.current=new Set,Xg({total:0,missing:0}),$g("loadingModel"),dp(null),Wt?.model!==tu(ye,i)&&(ql.current=null),!n){Ui(!1),Gi(!0);return}if(Ct&&jl.current.has(ye)){Ui(!1),Gi(!0);return}Ui(!D),Gi(D||!!Oe||Wl.current);let X=!1,Se=null,$e=et=>{Se=setTimeout(Je,et)},Je=()=>{if(X||on.current||Wa.current||Ct&&jl.current.has(ye))return;let et=Fi.current??Ze.current;if(!Ve.current||!et){$e(100);return}ip.current=kx(et,Ve.current,te?.maxDistance)??ip.current;let it=ql.current;if(it){ql.current=null,M0(Ve.current,it.camera),on.current=!0,it.home?(Qr.current=it.home,Ct&&($r.current[ye]=it.home)):No(),jr(),Ui(!1),Gi(!0),Nr.current?.invalidate();return}if(uv(Ve.current)||D){on.current=!0,No(),jr(),Ui(!1),Gi(!0),Nr.current?.invalidate();return}Wa.current=!0,(Oe?Oe():Wl.current?Promise.resolve(!0):Go(!0)).then(hr=>{X||(on.current=hr!==!1,on.current?(No(),jr(),Ui(!1)):X||$e(100))}).catch(()=>{on.current=!1,X||$e(100)}).finally(()=>{X||(Wa.current=!1)})};return $e(50),()=>{X=!0,Se&&clearTimeout(Se)}},[No,$r,te?.maxDistance,Go,ye,Br,n,jr,Oe,Wt,i,Ct]),X1({enabled:Ot,canvasAreaElement:Jd,fitAttemptedRef:on,fitInFlightRef:Wa,controlsRef:Ve,cameraFramingRef:Io,nodeRefsMap:Kt,fitScene:Go});let lc=fe(v=>{let D=Ve.current;if(!D)return;let z=v.cameraState;if(z?.position&&z?.target){let[$e,Je,et]=z.position,it=new Gf(...z.target);D.setPosition($e,Je,et,!0),D.setTarget(it.x,it.y,it.z,!0),Io.current={kind:"view",target:it};return}let X=Jr(v),Se=X?Kt.current[X]:null;!X||!Se||(D.fitToBox(Se,!0,qc).catch(()=>{}),Io.current={kind:"object",key:X})},[Jr]);We(()=>{ht||(Io.current=xs)},[ht]);let Op=fe((v,D="canvas")=>{if(gb.current)return;let z=_g.current;z.dragging||performance.now()-z.endedAt<150||(lr(!1),ln(),Zd(null),Uo(v,D),!(re||!oe)&&lc(v))},[Uo,ln,lc,re,oe]),{beginMoveZoom:Ib,handleMoveZoomPointerDown:e_}=g1({moveZoomTarget:mr,setMoveZoomTarget:Ga,currentObjectBindingsRef:an,materialRefsOut:ri,rendererCaptureRef:Nr,canvasAreaRef:Yr,canvasAreaElement:Jd,applyBindingStyle:ac}),Bb=fe(v=>{if(!Ha)return!1;let D=Jr(v);if(!D)return!1;let z=tc[D];return z?(Ib({objectKey:D,textureKey:z}),!0):!1},[Ha,Jr,tc,Ib]),Lp=de(!1),{editDecals:UN,activeDecalMove:Ho,addCenteredDecal:GN,decalSizeFor:t_,startImageDecal:HN,decalControlHandlers:r_}=p1({currentObjectBindings:ke,currentObjectBindingsRef:an,applyObjectBindings:Xr,nodeRefsMap:Kt,controlsRef:Ve,decalMove:_,decalDragging:Xd,setDecalDragging:xg,setDecalError:vg,setDecalControl:gg,decalRequestRef:yg,onTextureUpload:G,currentPanelObjectId:Qa,modelUrl:ye}),cc=Pe===!0?EN:Pe||null,Ki=yr.product?JSON.stringify([ye,yr.product.definition.id,yr.product.definition.revision]):null,[Ip,n_]=Ce(null),Wo=wt(()=>yr.product&&cc&&Ip?.key===Ki?{...yr.product,selections:Ip.selections}:yr.product,[yr.product,cc,Ip,Ki]),i_=fe(v=>{n_(Ki?{key:Ki,selections:v}:null)},[Ki]),Za=wt(()=>ps(ke,Wo,En(yr.model),Xa),[ke,Wo,yr.model,Xa]);Ap.current=Za.objectBindings;let ir=wt(()=>Wo?{...yr,product:Wo,model:{...yr.model,activeVariants:Za.activeVariants}}:yr,[yr,Wo,Za.activeVariants]);nc.current=ir;let Nb=wt(()=>$y(Za.objectBindings,ir.styleRules),[Za.objectBindings,ir.styleRules]),[jb,zb]=Ce(()=>Wt?.isolation??null);On(()=>{zb(null)},[ye,n]);let Qi=Jn!==void 0?Jn:jb,Bp=fe(v=>{Jn===void 0&&zb(v),Ia?.(v)},[Jn,Ia]),Rr=wt(()=>Ky(Nb,Qi),[Nb,Qi]),o_=wt(()=>({bindings:Rr.bindings,model:ir.model,camera:ir.camera,animations:ir.animations}),[Rr.bindings,ir.model,ir.camera,ir.animations]),Ji=Wx({revision:JSON.stringify([jo,Y?Yl?.id:null]),enabled:Do&&!!B,options:Rc(B),baseUrl:N,autoPrepare:Y&&!Kl&&Ql&&Pt,preparePhoneLink:!Y,state:{version:1,objectBindings:ke,configuration:{modelUrl:n,modelFormat:l,tilesetUrl:i,activeModelId:ye,models:Xe?.map(v=>({...v,objectBindings:Ni(v),sceneConfig:Le(v)===ye?ir:v.sceneConfig})),mergeModels:Nd,sceneConfig:ir,arScaleMode:I,isolation:Qi,backgroundColor:_t,shadows:ne}},getSources:jT});Sb.current=Ji.show;let Cn=wt(()=>Rr.setAside.size>0?Yy(ke,Qi):null,[Rr,ke,Qi]),a_=fe(v=>{let D=Jr(v),z=D!==null&&Cn?.size===1&&Cn.has(D);Bp(z?null:{...Qi,target:v.id})},[Bp,Qi,Cn]),{sourceOf:li}=Rr,s_=wt(()=>Sn?IC(ke,Rr):[],[Sn,ke,Rr]),Np=fe(v=>{let D=li(v);Op(D)},[Op,li]),jp=fe(v=>Pb(v&&li(v)),[Pb,li]),zp=fe((v,D)=>{let z=li(v);return C?.({binding:z,...D})===!0?(Lp.current=!0,!0):Bb(z)},[C,Bb,li]),Vp=wt(()=>P?(v,D)=>P({binding:li(v),...D}):void 0,[P,li]),Vb=fe(v=>{Uo(v,"panel"),!re&&lc(v)},[Uo,lc,re]);We(()=>{jr()},[jr,ke,yP]);let Fb=de(0),Ub=fe((v,D)=>{Fb.current=D.distance,Dx(D,ip.current),Q?.(bv(v,D)),jr()},[jr,Q]),l_=fe(v=>{Ng.current=new Set(v.map(D=>D.name)),kP(D=>D+1),oc(v.map(D=>D.name)),s?.(v)},[oc,s]),c_=fe(v=>{Fi.current=v,Nr.current?.invalidate()},[]),qo=fe(v=>{Ze.current=v,xb(v),Xg(q1(v));let D=Cy(v);IP(D>im?D:null),qg(!1),dp(null),D>im&&$g("preparingLargeModel"),jg(!0),zg(qv(v)),op(!1),ap(null),Hg(!1),i||(s&&s(KM(v)),oc(tx(v),ex(v))),T?.(v),L?.(Xy(v)),jr()},[oc,jr,L,s,T,xb,i]),u_=fe(()=>Fi.current??Ze.current,[]),{background:Fp}=Ae,d_=Fp.enabled&&Fp.type==="color"&&new SN(Fp.color).getHSL({h:0,s:0,l:0}).l>.5?"#000000":"#ffffff",es=Pt?Ze.current:null,Gb=!!F;We(()=>{if(!Gb)return;if($a){if(Hl.current?.url!==n||Hl.current.error!==Hi)return;let D=Hi&&typeof Hi=="object"?hs(Hi):void 0;np.current?.(Sy({...D,name:D?.name??rm(n),format:D?.format??l??nm(n).format}));return}if(!es||Ze.current!==es)return;let v=nm(n);np.current?.(wy(es,{scope:i?"resident-tiles":"asset",source:{...hs(es),format:i?"3d-tiles":l??v.format,name:v.entryPath??rm(n)}}))},[Gb,es,n,l,i,Wg,$a,Hi]);let Up=fe(v=>{Ui(!1),Gi(!0),op(!0),ap(v),Hl.current={url:Bg.current,error:v},E?.(v)},[E]),{reportError:Hb,clearError:Wb}=i0({enabled:Ct,activeUrl:ye,models:Xe,errorsRef:jl,activeFailed:$a,activeError:Hi,onActiveError:Up,onExtraError:$f}),p_=fe((v,D)=>{!Ct||!Nl.current?.some(z=>Le(z)===v)||(delete zi.current[v],delete $r.current[v],Hb(v,D))},[Ct,Hb,$r]),m_=fe((v,D)=>{!Ct||!Nl.current?.some(z=>Le(z)===v)||(Wb(v),zi.current[v]=D,v===ye&&(zl.current!==v||Ze.current!==D)&&(zl.current=v,qo(D)),Rl?.(v,D))},[Ct,ye,n,qo,Rl,Wb]);We(()=>{if(!Ct||jl.current.has(ye))return;let v=zi.current[ye];v&&(zl.current===ye&&Ze.current===v||(zl.current=ye,qo(v)))},[Ct,ye,n,Pt,qo]);let qb=fe((v,D)=>{lp.current.add(v),LP(z=>z+1),Yf?.(v,D)},[Yf]),Xb=Ct&&Xe?Xe.find(v=>Le(v)===ye)?.mergeModels:Nd,$b=wt(()=>new Set((Xb??[]).map(v=>v.url)),[Xb]),Yb=fe(v=>{v.lengthComputable&&v.total>0&&dp(v.loaded/v.total*100),O?.(v)},[O]),h_=fe((v,D,z,X)=>{if(!Ue)return;let Se={...Ae,lighting:{...Ae.lighting,lights:Ae.lighting.lights.map($e=>$e.id===v?{...$e,position:D,...z?{rotation:z}:{},...X?{target:X}:{}}:$e)}};Ue(Se)},[Ae,Ue]);We(()=>{let v=Ze.current;if(!Pt||!v){Bo(!1);return}if(Array.from($b).some(Je=>!lp.current.has(Je))){Bo(!1);return}let z=Object.entries(ke).filter(([,Je])=>!Je.removed);if(z.length===0){Bo(!1);return}let X=i?Ng.current:(()=>{let Je=Fg.current;for(let et of Object.keys(ui(v).nodesById))Je.add(et);return Je})();if(!X||X.size===0){Bo(!1);return}let Se=z.map(([Je,et])=>et.modelObjectId??Je).filter(Je=>!X.has(Je));Bo(Se.length>0),OP(Se.length);let $e=Se.join(`
|
|
82
|
-
`);if(Se.length>0&&$e!==sp.current){let Je=Se.slice(0,10).map(it=>`"${it}"`).join(", "),et=Se.length>10?` and ${Se.length-10} more`:"";console.warn(`[react-immersive] ${Se.length} object binding(s) point at nodes this model doesn't have, so they can't be selected: ${Je}${et}. Each binding's modelObjectId (or its key) must match a node name; log onObjectCatalog to see this model's names.`)}sp.current=$e},[Pt,ke,EP,i,$b,Wg]),We(()=>{if(J||Br)return;let v=[];for(let[z,X]of Object.entries(ke))for(let Se of X.actions??[])am.includes(Se.id)||v.push(`"${Se.id}" on "${X.label??z}"`);let D=v.join(`
|
|
83
|
-
`);if(v.length>0&&D!==Ug.current){let z=v.slice(0,10).join(", "),X=v.length>10?` and ${v.length-10} more`:"";console.warn(`[react-immersive] ${v.length} action button(s) do nothing because ModelViewer has no onAction handler: ${z}${X}. ModelViewer itself handles ${am.join(", ")}; handle other ids in onAction, or pass useViewerActions().handleAction to run their effects.`)}Ug.current=D},[ke,Br,J]);let Gp=fe(async()=>{if(Ve.current&&Qr.current&&fc(Ve.current,Qr.current),Oe){await Oe();return}let v=Ve.current;if(!v)return;let D=Qr.current;try{if(D&&!Wl.current&&Number.isFinite(D.azimuthAngle)&&Number.isFinite(D.polarAngle))v.rotateTo(D.azimuthAngle,D.polarAngle,!0),await Go();else if(D){Io.current=xs;let z=gv(D,v);await vm(v,()=>v.setLookAt(z[0],z[1],z[2],D.target[0],D.target[1],D.target[2],!0))}else await Go()}catch(z){console.error("Reset camera error:",z)}},[Oe,Go]),WN=fe(()=>{ii(!1),lr(!0)},[]),qN=fe(()=>{lr(!1)},[]),f_=fe(()=>{lr(!1),ii(!0),setTimeout(()=>{Gp()},100)},[Gp]),g_=fe((v,D)=>{Ub(v,D)},[Ub]),b_=fe(v=>{if(gb.current)return;if(Lp.current){Lp.current=!1;return}if(v.target.closest("button, input, textarea, .ri-colorPicker, .ri-materialPicker, .ri-annotationPopup, .ri-annotationMarker, .ri-viewAnnotationPopup"))return;let z=Yr.current,X=Ve.current,Se=X?.camera,$e=Ze.current;if(!z||!X||!Se||!$e||!El&&!X.enabled)return;let Je=z.getBoundingClientRect(),et=(v.clientX-Je.left)/Je.width*2-1,it=-((v.clientY-Je.top)/Je.height)*2+1,Vt=new MN;Vt.setFromCamera(new CN(et,it),Se);let hr=Vt.intersectObject($e,!0);if(hr.length===0)return;if(!El&&A){let cn=hr[0].point,Er=null;for(let[os,as]of Object.entries(an.current)){if(!as.decals?.length)continue;let Tn=Kt.current[os];if(!Tn)continue;let _n=Tn.worldToLocal(cn.clone());for(let ci of as.decals){if(!ci.position)continue;let ss=_n.distanceTo(new Gf(ci.position[0],ci.position[1],ci.position[2]));ss<=ci.size/2&&(!Er||ss<Er.distance)&&(Er={binding:as,id:ci.id,distance:ss})}}if(Er){Ga(null),A(Er.binding,Er.id);return}}if(!El){let{x:cn,y:Er,z:os}=hr[0].point;X.setOrbitPoint(cn,Er,os);return}let Pn=hr[0],rs=Pn.point,ns=$e.worldToLocal(Pn.point.clone()),is=[0,0,1];if(Pn.face){let cn=Pn.face.normal.clone().transformDirection(Pn.object.matrixWorld).normalize();is=[cn.x,cn.y,cn.z]}ub({worldPosition:[rs.x,rs.y,rs.z],localPosition:[ns.x,ns.y,ns.z],worldNormal:is,anchor:a1(Pn),screenX:v.clientX-Je.left,screenY:v.clientY-Je.top}),yp({title:"",description:""})},[El,A]);if(We(()=>{jd.current={snapshot:()=>{let v=Ve.current,D=ql.current;return{model:qr,camera:on.current&&v?hc(v):D?.camera,home:Qr.current??D?.home,lightEdits:Fd,variantEdit:kl,sectionEdit:Dl,measurementEdits:Ol,isolation:jb,objectBindings:ng||Ct?void 0:ke,modelBindingEdits:ng?void 0:oP,explodeFactor:jo,cameraControllerType:Cg,uvCheckerOverride:wg,annotationCategories:iT}},captureFrame:()=>{let v=Nr.current;return!v||t.status!=="ready"||!Pt||!ni?Promise.resolve(null):ky(v)}}}),We(()=>()=>{jd.current=null},[jd]),Oo.status==="checking"){let v=Zf??Qf;return v?K("div",{className:"ri-viewer ri-viewerPlaceholder",style:{background:Mg},children:K(om,{src:v})}):K("div",{className:"ri-viewer ri-viewer--license-checking",children:!u&&K(Fc,{title:sr("verifyingLicense"),message:sr("checkingYourLicenseKey")})})}if(Oo.status==="invalid")return K("div",{className:"ri-viewer ri-viewer--license-invalid",children:K(Fc,{tone:"error",title:sr("invalidLicense"),showKeySetup:Oo.isLocalDomain&&Oo.reason==="No license key provided",message:Oo.isLocalDomain?Oo.reason??sr("licenseHasBeenRevokedOrHasExpired"):sr("failedToLoadPleaseContactTheSiteAdministrator")})});let{materialTextureUrl:Kb,materialTargetTakesImage:Qb,materialTextureOffset:Jb,materialTextureRotationDegrees:Zb,isMaterialTexturePositioning:ev,materialTextureOnOffsetChange:tv,materialTextureOnRotationChange:rv,materialTextureOnEndPositioning:nv}=C1({materialPopup:Ja,resolveObjectKey:si,currentObjectBindings:ke,nodeRefsMap:Kt,moveZoomTarget:mr,texturePositioningEnabled:YT,texturePositioningOverrides:KT,setMaterialTextureOffset:QT,setMaterialTextureRotation:JT,endMaterialTexturePositioning:ZT}),v_=Yr.current?.offsetWidth??600,y_=Yr.current?.offsetHeight??400,x_=350,w_=290,S_=Wi?Math.min(Wi.screenX+12,v_-x_-8):0,M_=Wi?Math.min(Wi.screenY,y_-w_-8):0,C_=Ye&&!!n&&!$a&&!Pt,iv=Do&&(Ka&&(Kl||ab)||Ql||!!B||!!Jl),Xo=iv&&!Br&&!Y,ts=Qe&&!Br,Hp=nr&&!Br,ov=(Xo?1:0)+(bt?1:0),Zi=v=>(Br?50:16)+v*42+(ts&&v>ov?Math.max(0,zT-34):0),Wp=iv&&!Y?K(z1,{configuredHandoff:!!B,top:Zi(0),xrStore:Ka,arSupported:Kl,vrSupported:ab,quickLookSupported:Ql,mobileHandoffUrl:Jl,mobileHandoffOpen:B?Ji.open:sb,onQuickLook:B?Ji.show:ZP,onOpenMobileHandoff:B?Ji.show:QP}):null;return Hr("div",{className:"ri-viewer",ref:Vl.rootRef,style:{background:Mg},"data-reduced-motion":ti?"":void 0,children:[K("div",{className:"ri-visuallyHidden",role:"status","aria-atomic":"true",children:HT}),t.status!=="ready"&&K(S1,{rebuilding:t.status==="rebuilding",onReload:t.reload}),Hr("div",{className:"ri-viewerLeft",ref:Og,inert:t.status!=="ready",children:[De&&(Fe?Fe({isOpen:Tb,selectedObject:Yi,currentAction:Lg,onClose:kp,onAction:sc}):K(xf,{translateDefaultActions:Vd,isOpen:Tb,selectedObject:Yi,currentAction:Lg,onClose:kp,onAction:sc,renderActionExtra:v=>{if(v==="change-color"&&Kr)return K(hf,{inline:!0,colorPicker:Kr,onClose:ln,itemMaterials:Vi,setItemMaterials:Ul});if((v==="change-light-color"||v==="set-brightness")&&Wd?.kind===v&&Wd.objectId===Qa)return K(D0,{control:Wd,lights:Ae.lighting.lights,readObjectGlow:kb,applyGlow:Db,glowMemoryRef:Eb,applyLightPatches:hg,onControlChange:fg});if((v==="add-text"||v==="add-image")&&qd?.kind===v&&qd.objectId===Qa){let D=qd,z=si(D.objectId);if(!z)return null;let X=v==="add-image";return K(j0,{kind:v,decals:(ke[z]?.decals??[]).filter(Se=>!!Se.image===X),activeId:D.activeId,error:bg?sr.message(bg):null,moving:Xd?.objectKey===z&&Xd.decalId===D.activeId,defaultSize:t_(z),...r_(D,z)})}return v==="change-material"&&Ja?K(ff,{inline:!0,triggerFileUpload:Ob,materialPopup:Ja,textureUrl:Kb,clearTexture:Lb,canPlaceImage:Qb,offset:Jb,rotationDegrees:Zb,onOffsetChange:tv,onRotationChange:rv,isPositioning:ev,onEndPositioning:nv}):null}})),Hr("div",{className:`ri-canvasArea ${Ar?"ri-canvasArea--measuring":""} ${ni?"":"ri-canvasArea--positioning"} ${st||nt?"ri-canvasArea--moveMode":""}`,ref:MP,tabIndex:Yt?0:void 0,role:Yt?"group":void 0,"aria-label":Yt?sr("cameraKeyboardHelp"):void 0,onDoubleClick:b_,onPointerDown:v=>{if(Yt&&Yr.current?.focus({preventScroll:!0}),mr){e_(v);return}TT(v)},onClick:mr?void 0:_T,onPointerMove:ST,onPointerLeave:vb,onWheel:vb,children:[Pt&&!Ar&&t.status==="ready"?K(UC,{objects:s_,selectedKey:ht,onHighlight:ep,onSelect:v=>Op(v,"keyboard"),onClearSelection:()=>{kp(),k?.()}}):null,Ha&&!i&&(mr||UT)&&K("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:mr?"rgba(37, 99, 235, 0.92)":"rgba(0, 0, 0, 0.6)",pointerEvents:"none",whiteSpace:"nowrap"},children:sr(mr?"texturePositioningHint":"texturePositioningStartHint")}),Vg&&!Gg&&K(v1,{count:DP,onDismiss:()=>Hg(!0)}),cp!==null&&!BP&&K(y1,{triangles:cp,offset:Vg&&!Gg,onDismiss:()=>qg(!0)}),ir.model.renderer==="uv-checker"&&up.missing>0&&K(x1,{missing:up.missing,total:up.total}),K("input",{ref:Eg,type:"file",accept:"image/png,image/jpeg,image/webp",className:"ri-hiddenInput",onChange:$T}),K(la,{onError:t.fail,children:Fo?Hr(nh,{backend:Fo,onRendererCreated:t.onRendererCreated,suspended:t.status!=="ready",paused:nP&&!yt,camera:pt,backgroundColor:_t,shadows:ne&&Ae.shadows.enabled,sceneConfig:ir,selectedObjectRef:$i,selectedObjectRefs:Ep,selectedObjectOutlineColor:f,hoveredObjectRef:GT,highlightOnHover:le,renderMode:qt,maxDpr:Rt,reduceGpuLoad:fP,runtimeStats:j?{onStats:j,intervalMs:V,profile:kt,streamingRef:tp}:void 0,xrStore:Ka,rendererCaptureRef:Nr,preserveDrawingBuffer:gt,children:[K(oh,{lightingConfig:Ae.lighting,shadowConfig:Ae.shadows,shadowsEnabled:ne,environmentRotation:Ae.environment.rotation,environmentConfig:Ae.environment,modelBounds:yb,objectBindings:ke,nodeRefs:Kt}),cP&&Ae.lighting.lights.map(v=>!v.visible||v.type==="none"||v.type==="hemisphere"||v.attachment?null:K("group",{rotation:[0,v.attachedToCamera?0:Ae.environment.rotation*Math.PI/180,0],children:K(t1,{light:v,position:v.position,rotation:v.rotation,color:v.color,intensity:v.intensity,visible:v.visible,target:v.type==="spot"||v.type==="directional"?v.target??mo(js(v,ne&&Ae.shadows.enabled&&v.castShadow,yb),v.attachedToCamera?0:-Ae.environment.rotation):void 0,onTransformChange:({position:D,rotation:z,target:X})=>h_(v.id,D,z,X),onDraggingChange:Tg})},v.id)),K(df,{setAside:Rr.setAside,nodeRefs:Kt}),!oi&&K(mf,{section:Ae.section??us,box:rc,modelRef:Ze,showHandle:nr,onChange:dg,onDraggingChange:mP}),K(ih,{controlsRef:Ve,onCameraChange:g_,cameraLimits:te,controllerType:ji,onPointerLockExit:()=>Bl("orbit"),reducedMotion:ti}),K(Ff,{enabled:yt||Ar||Ho||ti||ji==="pointerLock"?!1:Na??Ae.model.autoRotate??!1,speed:eP??Ae.model.autoRotateSpeed??1,controlsRef:Ve}),or&&!oi&&!yt&&K(_y,{getTarget:u_,revision:`${ye}:${Pt}`,lineColor:d_}),Ba&&!yt&&K(u0,{onUpdate:()=>{let v=Ve.current;if(v){v.camera.up.set(0,1,0);let D=Fb.current;D>0&&v.dollyTo(D,!1),v.update(0)}Nr.current?.invalidate()}}),(st||nt)&&!oi&&!ic&&$i&&ht&&K(Df,{node:$i,space:zt,moveEnabled:st,gizmoTool:mt,scaleEnabled:nt,onTransformChange:WT,transform:ke[ht]?.transform,onDraggingChange:v=>{Ag(v),Xi&&R?.(Xi,v)}},ht),(st||nt)&&!oi&&ic&&K(Bf,{entries:ic,referenceNode:$i,space:zt,moveEnabled:st,gizmoTool:mt,scaleEnabled:nt,onTransformChange:qT,onDraggingChange:v=>{Ag(v);for(let D of ic){let z=ke[D.key];z&&R?.(z,v)}}}),Ho&&K(Y0,{target:Ho,nodes:Kt,controls:Ve}),(()=>{let v=Ct&&Xe?Hr(Hf,{children:[Xe.map(D=>K(gS,{entry:{...D,objectBindings:Le(D)===ye?Rr.bindings:Ni(D)},isActive:Le(D)===ye,pulses:Rr.pulses,decoderConfig:Il,itemMaterials:Vi,sceneConfig:ir,zoomOnSelected:oe,highlightOnHover:le,explodeFactor:jo,suspendBindingTransforms:Ua,onLoadProgress:Yb,onAnimationsReady:ib,onModelAnimationsReady:GP,onLoadError:p_,onModelLoaded:m_,selectedItem:ht,panelHoveredItem:y??Gl,onItemClick:Np,onItemDoubleClick:zp,onItemContextMenu:Vp,onItemHover:jp,nodeRefsOut:Kt,onNodeRefsChange:Qd,materialRefsOut:Le(D)===ye?ri:wP(Le(D)),onMergeModelLoaded:qb,onMergeModelError:Kf},Le(D))),K(ld,{anchorSceneRef:Ze,annotations:tg?db:[],sceneConfig:Ae,activeAnnotation:ec,popupRef:Fl,canvasRootRef:Yr,worldPositionsRef:Kd,modelLoaded:Pt,onAnnotationClick:mb,onCloseAnnotation:Zl,hideCloseButton:qi,guidedTour:qi,showAnnotationOnHover:ue}),K(Td,{annotation:pb,enabled:qi&&!yt,controlsRef:Ve,offsetRef:Yd}),yt?K(sa,{controlsRef:Ve,sceneRef:Ze,config:yt.config,playing:!0,resetOnPlay:!0,playOnce:!0,startAtPath:!0,onStarted:yt.onStarted,onFinished:yt.onFinished,onProgress:Zg},"video-export"):sn&&K(sa,{controlsRef:Ve,sceneRef:Ze,config:sn,playing:Ya&&!Ar,resetOnPlay:Qg,onFinished:()=>{lr(!1),ii(!1)},onUserInteract:()=>{lr(!1)}},"cinematic-preview"),Qe&&Hr(Hf,{children:[K(dd,{items:Ll,sceneRef:Ze,modelId:Gd,tilesetUrl:i,settings:za,legacyUnit:nn,revision:Mp,onResults:wb}),K(Ma,{points:Cp,unit:Va.displayUnit,scale:Va.factor,box:rc,showDimensions:_p,tool:Pp,areaClosed:Tp,snapPreview:Ar?bb:null})]})]}):K(pn,{onLoadError:Up,children:Hr($1,{fallback:null,children:[i?K(ef,{diagnosticsRef:j?tp:void 0,loadingRef:rp,url:i,rotation:ir.model.rotation,errorTarget:o,cacheSize:a,decoderConfig:Il,objectBindings:Rr.bindings,itemMaterials:Vi,sceneConfig:ir,selectedItem:ht,panelHoveredItem:y??Gl,highlightOnHover:le,onItemClick:Np,onItemHover:jp,onItemDoubleClick:zp,onItemContextMenu:Vp,onObjectCatalog:l_,onTilesetBounds:c_,onModelLoaded:qo,onLoadError:Up,nodeRefsOut:Kt,onNodeRefsChange:Qd,materialRefsOut:ri,explodeFactor:jo,suspendBindingTransforms:Ua}):K(Us,{url:n,modelFormat:l,objectBindings:Rr.bindings,selectedItem:ht,itemMaterials:Vi,onItemClick:Np,onItemDoubleClick:zp,onItemContextMenu:Vp,onItemHover:jp,onModelLoaded:qo,onAnimationsReady:ib,nodeRefsOut:Kt,onNodeRefsChange:Qd,materialRefsOut:ri,panelHoveredItem:y??Gl,sceneConfig:ir,zoomOnSelected:oe,highlightOnHover:le,decoderConfig:Il,onLoadProgress:Yb,explodeFactor:jo,suspendBindingTransforms:Ua,originalNodePoses:rP,mergeModels:Nd,onMergeModelLoaded:qb,onMergeModelError:Kf,pulses:Rr.pulses}),tP?.map(D=>K(mS,{url:D,decoderConfig:Il,onLoadError:$f,onModelLoaded:Rl?z=>Rl(D,z):void 0},D)),K(ld,{anchorSceneRef:Ze,annotations:tg?db:[],sceneConfig:Ae,activeAnnotation:ec,popupRef:Fl,canvasRootRef:Yr,worldPositionsRef:Kd,modelLoaded:Pt,onAnnotationClick:mb,onCloseAnnotation:Zl,hideCloseButton:qi,guidedTour:qi,showAnnotationOnHover:ue}),K(Td,{annotation:pb,enabled:qi&&!yt,controlsRef:Ve,offsetRef:Yd}),yt?K(sa,{controlsRef:Ve,sceneRef:Ze,config:yt.config,playing:!0,resetOnPlay:!0,playOnce:!0,startAtPath:!0,onStarted:yt.onStarted,onFinished:yt.onFinished,onProgress:Zg},"video-export"):sn&&K(sa,{controlsRef:Ve,sceneRef:Ze,config:sn,playing:Ya&&!Ar,resetOnPlay:Qg,onFinished:()=>{lr(!1),ii(!1)},onUserInteract:()=>{lr(!1)}},"cinematic-preview"),Qe&&Hr(Hf,{children:[K(dd,{items:Ll,sceneRef:Ze,modelId:Gd,tilesetUrl:i,settings:za,legacyUnit:nn,revision:Mp,onResults:wb}),K(Ma,{points:Cp,unit:Va.displayUnit,scale:Va.factor,box:rc,showDimensions:_p,tool:Pp,areaClosed:Tp,snapPreview:Ar?bb:null})]})]})},i??n);return Ka?K(vC,{ref:$P,box:rc,scaleMode:I,onARStateChange:eT,children:v}):v})(),K(zx,{controller:xr,source:Ze,controls:Ve,animations:fp,cameraEnabled:!vp,ready:Pt&&ni,sequences:Ae.sequences,autoPlay:Ne&&!ti,authoredRevision:o_}),g&&K(Nx,{source:Ze,highlights:g}),ar&&K($1,{fallback:null,children:ar})]}):null}),K(om,{src:Zf??Qf,hidden:Pt&&ni}),pr&&K("div",{className:"ri-overlay",children:pr}),Ye&&n&&$a&&K(w1,{failure:Ly(Hi,i||n,i?void 0:l,e),source:i||n}),K(Jy,{visible:C_,message:sr(NP,{millions:Math.round((cp??0)/1e6)}),progress:zP??void 0}),Br?ig&&Wp&&xN(Wp,ig):Wp,Y&&K(Yx,{xrStore:Ka,arSupported:Kl,checkingAR:YP,quickLookSupported:Ql,modelReady:Pt,inARSession:vp,handoff:Ji,animationControls:K(e0,{options:bp,sources:Vo,value:Yl?.id??"",onChange:qP}),onQuickLook:()=>r.requestARLaunch("quick-look")}),KP,ve&&!Y&&!Br&&!vp&&!yt&&!Ar&&zo.length>0&&K(Pv,{controls:xr,sequences:zo}),Ji.open&&K(qx,{handoff:Ji,filename:pe,onQuickLook:()=>r.requestARLaunch("quick-look")}),!B&&sb&&Jl&&K(V1,{url:Jl,onClose:JP}),bt&&K(F1,{top:Zi(Xo?1:0),active:$d,onToggle:()=>Sg(v=>!(v??Fa))}),Qe&&K(lf,{top:Zi(ov),active:Ar,disabled:!!yt,tool:Pp,snap:xT,pointCount:Cp.length,areaClosed:Tp,error:gT,showDimensions:_p,onToggle:()=>{lr(!1),Ar||lP?.(),CT()},onTool:bT,onSnap:wT,onUndo:vT,onClear:MT,onFinishArea:yT,onDimensions:PT,onHeight:VT,settings:za,displayUnit:Va.displayUnit,onSettings:ug,items:Ll,results:DT,onItems:cg,onSave:AT,canSave:RT,canCalibrate:ET,onCalibrate:kT,onExportJson:OT,onExportCsv:LT,onImport:IT,readOnly:ko!==void 0&&!ei,settingsReadOnly:_l!==void 0&&!Bi}),_r&&K(U1,{top:Zi((Xo?1:0)+(bt?1:0)+(ts?1:0)),open:VP,factor:jo,onToggleOpen:()=>Kg(v=>!v),onFactorChange:Yg}),Hp&&!oi&&K(G1,{top:Zi((Xo?1:0)+(bt?1:0)+(ts?1:0)+(_r?1:0)),section:hT,onChange:dg}),sn&&K(H1,{top:Zi((Xo?1:0)+(bt?1:0)+(ts?1:0)+(_r?1:0)+(Hp?1:0)),playing:Ya,disabled:!!yt||Ar,onPlay:()=>{ii(!1),lr(!0)},onPause:()=>lr(!1),onStop:f_}),yt&&K(W1,{progress:UP,onCancel:hp}),!Br&&Ct&&Xe&&Xe.length>1&&(eg||zd)&&K("div",{className:"ri-modelSwitcher",style:{top:`${Zi((Xo?1:0)+(bt?1:0)+(ts?1:0)+(_r?1:0)+(Hp?1:0)+(sn?1:0))}px`},role:"group","aria-label":"Switch model",children:Xe.map(v=>K("button",{type:"button",className:`ri-modelSwitcherButton ${Le(v)===ye?"ri-modelSwitcherButton--active":""}`,onClick:()=>zd?zd(Le(v)):eg?.(v.url),title:`Switch to ${v.label||Pl(v.url)}`,"aria-pressed":Le(v)===ye,children:v.label||Pl(v.url)},Le(v)))}),(xp||hb||Ho||Mn&&Cn)&&Hr("div",{className:`ri-bottomStack ${fb?"ri-bottomStack--aboveButtons":""} ${xp?"ri-bottomStack--annotationFilters":""}`,children:[xp&&K(_1,{categories:aT,selected:oT,disabled:!!yt,onChange:sT}),Ho&&K(A1,{onCancel:Ho.onCancel}),Mn&&Cn&&K(R1,{label:Cn.size===1?sr("isolatedObject",{name:(()=>{let[v]=Cn;return ke[v]?.label??v})()}):sr("isolatedObjects",{count:Cn.size}),onShowAll:()=>Bp(null)}),hb&&K(E1,{groups:Xa,activeVariants:Hd,onSelect:hP})]}),fb&&Hr("div",{className:"ri-buttonContainer",children:[K("div",{className:"ri-tourControls",children:W&&wp.length>0&&K(k1,{count:wp.length,active:qi,index:rT,navigating:nT,onStart:lT,onPrevious:cT,onNext:uT,onStop:dT})}),Hr("div",{className:"mv-rightControls",children:[Be&&Vl.supported&&K(D1,{fullscreen:Vl,disabled:!!yt}),_e&&K("button",{className:"mv-resetButton",onClick:Gp,disabled:!!yt,title:sr("resetCameraView"),children:K(PN,{})}),K(O1,{open:bP,current:ji,disabled:!!yt,onSelect:Bl,onToggle:()=>Pg(v=>!v)}),ze&&K(L1,{menu:FT,recording:!!yt,hasScene:!!Ze.current,canCaptureImage:gt||Fo==="webgpu",canRecord:Pt&&ni&&!Xl,hasCinematic:!!sn,hasMultipleModels:!!(Xe&&Xe.length>=2)})]})]}),Wi&&K(I1,{x:S_,y:M_,form:tT,setForm:yp,onOk:pT,onCancel:mT})]}),Fe&&Kr&&K(hf,{colorPicker:Kr,onClose:ln,itemMaterials:Vi,setItemMaterials:Ul}),Fe&&Ja&&K(ff,{triggerFileUpload:Ob,materialPopup:Ja,textureUrl:Kb,clearTexture:Lb,canPlaceImage:Qb,offset:Jb,rotationDegrees:Zb,onOffsetChange:tv,onRotationChange:rv,isPositioning:ev,onEndPositioning:nv})]}),cc&&Wo&&Ki?K(SC,{product:yr.product,options:cc,onSelectionsChange:i_,top:qe?56:12},Ki):null,qe&&K("div",{className:"ri-viewerRight",inert:t.status!=="ready",children:ae?ae({objectBindings:ke,onAction:sc,onFocus:Vb,onHover:ep}):K(wf,{objectBindings:ke,onAction:sc,onFocus:Vb,onHover:ep,isolatedKeys:Cn,onIsolate:Mn?a_:void 0})}),Nt&&K(yC,{controlsRef:Ve,enabled:t.status==="ready",opacity:ie,moveSensitivity:Ie,position:jt})]})}import{useState as Ed}from"react";import{ArrowRight as DN,ChevronRight as ON,Download as LN}from"lucide-react";import{jsx as St,jsxs as Et}from"react/jsx-runtime";function kd(e){return e===void 0?"Not set":JSON.stringify(e)}var Wf={changes:"Changes only",all:"All objects",added:"Added",removed:"Removed",modified:"Modified",unchanged:"Unchanged",ambiguous:"Unmatched"},Y1={all:"All categories",identity:"Identity",appearance:"Appearance",transform:"Transform",visibility:"Visibility",data:"Data",behavior:"Behavior"};function K1({change:e}){return Et("div",{className:"ri-semanticPanel__change",children:[St("code",{title:e.path,children:e.path}),Et("span",{children:[St("del",{title:kd(e.before),children:kd(e.before)}),St(DN,{size:11,"aria-hidden":"true"}),St("ins",{title:kd(e.after),children:kd(e.after)})]})]})}function YK({report:e,selected:t,onSelect:r,onClear:n,matchBy:i,onMatchByChange:o,showOutlines:a,onShowOutlinesChange:s}){let[l,c]=Ed(!0),[d,m]=Ed(""),[u,h]=Ed("changes"),[p,g]=Ed("all"),b=e.objects.filter(f=>(u==="all"||(u==="changes"?f.status!=="unchanged":f.status===u))&&(p==="all"||f.changes.some(y=>y.category===p))&&`${f.label} ${f.identity}`.toLowerCase().includes(d.toLowerCase())),w=()=>{let f=URL.createObjectURL(new Blob([JSON.stringify(e,null,2)],{type:"application/json"})),y=document.createElement("a");y.href=f,y.download="configuration-comparison.json",y.click(),setTimeout(()=>URL.revokeObjectURL(f),1e3)};return Et("aside",{className:"ri-semanticPanel","aria-label":"Configuration comparison",onPointerDown:f=>f.stopPropagation(),children:[Et("button",{className:"ri-semanticPanel__heading",type:"button","aria-expanded":l,onClick:()=>c(!l),children:[St(ON,{size:13,"aria-hidden":"true",className:l?"ri-semanticPanel__chevron--open":void 0}),"Changes",Et("span",{className:"ri-semanticPanel__counts",children:[Et("span",{"data-status":"added",title:`${e.counts.added} added`,children:["+",e.counts.added]}),Et("span",{"data-status":"removed",title:`${e.counts.removed} removed`,children:["\u2212",e.counts.removed]}),Et("span",{"data-status":"modified",title:`${e.counts.modified} modified`,children:["~",e.counts.modified]})]})]}),l&&Et("div",{className:"ri-semanticPanel__body",children:[o&&Et("details",{children:[St("summary",{children:"Matching"}),Et("label",{children:["Match by",Et("select",{"aria-label":"Match objects by",value:typeof i=="object"?"metadata":i??"modelObjectId",onChange:f=>o(f.target.value==="metadata"?{metadataKey:"partId"}:f.target.value),children:[St("option",{value:"modelObjectId",children:"Model object ID"}),St("option",{value:"id",children:"Binding ID"}),St("option",{value:"metadata",children:"Metadata value"})]})]}),typeof i=="object"&&Et("label",{children:["Key",St("input",{"aria-label":"Comparison metadata key",value:i.metadataKey,onChange:f=>o({metadataKey:f.target.value})})]})]}),St("input",{className:"ri-semanticPanel__search","aria-label":"Search comparison",placeholder:"Filter objects",value:d,onChange:f=>m(f.target.value)}),Et("div",{className:"ri-semanticPanel__filters",children:[St("select",{"aria-label":"Filter comparison status",value:u,onChange:f=>h(f.target.value),children:Object.keys(Wf).map(f=>St("option",{value:f,children:Wf[f]},f))}),St("select",{"aria-label":"Filter change category",value:p,onChange:f=>g(f.target.value),children:Object.keys(Y1).map(f=>St("option",{value:f,children:Y1[f]},f))})]}),Et("div",{className:"ri-semanticPanel__rows",children:[b.map(f=>Et("div",{className:"ri-semanticPanel__row","data-status":f.status,children:[Et("button",{type:"button","aria-pressed":t===f.id,onClick:()=>r(f),children:[St("span",{children:f.label}),St("small",{children:Wf[f.status]})]}),t===f.id&&Et("div",{className:"ri-semanticPanel__details",children:[f.message&&St("p",{children:f.message}),f.changes.map(y=>St(K1,{change:y},y.path)),!f.changes.length&&!f.message&&St("p",{children:f.status==="unchanged"?"No authored changes.":`Object ${f.status}.`})]})]},f.id)),!b.length&&St("p",{className:"ri-semanticPanel__empty",children:"No matching objects."})]}),e.sceneChanges.length>0&&Et("details",{children:[Et("summary",{children:["Scene changes (",e.sceneChanges.length,")"]}),St("div",{className:"ri-semanticPanel__details",children:e.sceneChanges.map(f=>St(K1,{change:f},f.path))})]}),Et("div",{className:"ri-semanticPanel__footer",title:"Compares authored bindings and settings. Geometry changes inside model files are not detected.",children:[Et("label",{className:"ri-semanticPanel__outlineToggle",children:[St("input",{type:"checkbox",checked:a,onChange:f=>s(f.target.checked)}),"Outlines"]}),t&&n&&St("button",{type:"button",onClick:n,children:"Clear focus"}),Et("button",{type:"button",onClick:w,children:[St(LN,{size:12,"aria-hidden":"true"}),"Report"]})]})]})]})}import{Vector3 as Dd}from"three";var Tl=1e-6;function eQ(){let e=[null,null],t=0,r=!1,n=new Dd,i=new Dd,o=new Dd,a=new Dd,s=(c,d)=>{let m=e[c],u=e[d];if(!m||!u)return;m.controls.getPosition(n,!1),m.controls.getTarget(o,!1),u.controls.getPosition(i,!1),u.controls.getTarget(a,!1);let h=m.controls.camera.zoom,p=m.controls.camera.fov,g=typeof p=="number"&&typeof u.controls.camera.fov=="number"&&Math.abs(p-u.controls.camera.fov)>=Tl;if(!(n.distanceToSquared(i)<Tl&&o.distanceToSquared(a)<Tl&&Math.abs(h-u.controls.camera.zoom)<Tl&&!g)){r=!0;try{g&&(u.controls.camera.fov=p,u.controls.camera.updateProjectionMatrix?.()),Math.abs(h-u.controls.camera.zoom)>=Tl&&u.controls.zoomTo(h,!1),u.controls.setLookAt(n.x,n.y,n.z,o.x,o.y,o.z,!1)}finally{r=!1}u.invalidate()}},l=c=>{r||(c===t?s(c,1-c):s(t,c))};return{attach(c,d,m){let u=e[c];if(u?.controls===d){u.invalidate=m;return}u?.detach();let h=()=>l(c),p=()=>{t=c},g=cv(d,p);d.addEventListener("update",h),d.addEventListener("controlstart",p),e[c]={controls:d,invalidate:m,detach:()=>{g(),d.removeEventListener("update",h),d.removeEventListener("controlstart",p)}},s(t,1-t)},setLeader(c){t=c},get leader(){return t},detach(){e.forEach(c=>c?.detach()),e[0]=e[1]=null}}}import{Fragment as IN,jsx as qf,jsxs as Z1}from"react/jsx-runtime";var Od=.05,Q1=.2,J1=e=>Math.min(Math.max(Number.isFinite(e)?e:.5,0),1);function nQ({split:e,onSplitChange:t,labels:r,containerRef:n,beforeAction:i}){let o=ce(),a=m=>{let u=n.current?.getBoundingClientRect();u&&u.width>0&&t(J1((m-u.left)/u.width))},s=m=>{m.preventDefault(),m.stopPropagation(),m.currentTarget.setPointerCapture(m.pointerId),m.currentTarget.focus(),a(m.clientX)},l=m=>{m.currentTarget.hasPointerCapture(m.pointerId)&&a(m.clientX)},c=m=>{let u={ArrowLeft:e-Od,ArrowDown:e-Od,ArrowRight:e+Od,ArrowUp:e+Od,PageDown:e-Q1,PageUp:e+Q1,Home:0,End:1}[m.key];u!==void 0&&(m.preventDefault(),m.stopPropagation(),t(J1(u)))},d=Math.round(e*100);return Z1(IN,{children:[Z1("span",{className:"ri-compare__label ri-compare__label--before",hidden:e<.08,children:[r[0],i]}),qf("span",{className:"ri-compare__label ri-compare__label--after",hidden:e>.92,children:r[1]}),qf("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:c,children:qf("span",{className:"ri-compare__handle","aria-hidden":"true"})})]})}export{Fc as a,pm as b,P_ as c,I0 as d,un as e,ew as f,fo as g,Mu as h,iG as i,Cx as j,sx as k,lm as l,Af as m,c2 as n,ZC as o,Tx as p,Ax as q,N1 as r,kx as s,qc as t,RN as u,YK as v,eQ as w,J1 as x,nQ as y,sj as z,I_ as A};
|