@liveroom-tech/react-immersive 6.2.1 → 6.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -0
- 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/RulesTab-2U4MFYOZ.mjs +1 -0
- package/dist/SequencesTab-JZEE5WAM.mjs +1 -0
- package/dist/SequencesTab-O7USMDFP.css +1 -0
- package/dist/{StreamingTilesModel-6Z7SIC2J.mjs → StreamingTilesModel-IM2DDWO5.mjs} +1 -1
- 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 +45 -45
- package/dist/binding-builder.mjs +1 -1
- package/dist/chunk-37QOMZW6.mjs +1 -0
- package/dist/{chunk-NMRTI3NQ.mjs → chunk-3GA7JFNH.mjs} +1 -1
- package/dist/chunk-3I7PPFUV.mjs +1 -0
- package/dist/chunk-3PLML3PO.mjs +1 -0
- package/dist/chunk-5C4H7SRF.mjs +1 -0
- package/dist/chunk-CHMFH4D4.mjs +1 -0
- package/dist/chunk-CUDL77ZY.mjs +1 -0
- package/dist/{chunk-UTVFRMYW.mjs → chunk-IEKGBS46.mjs} +2 -2
- package/dist/chunk-LU3BQ7WG.mjs +69 -0
- package/dist/chunk-QZNUWZG7.mjs +50 -0
- package/dist/{chunk-3OCHN3CA.mjs → chunk-SOAUR4DL.mjs} +1 -1
- package/dist/chunk-SXN3YYD3.mjs +1 -0
- package/dist/chunk-TI2YXAHW.mjs +3 -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 +44 -44
- package/dist/hosted.mjs +1 -1
- package/dist/index.css +1 -1
- package/dist/index.d.mts +8 -4
- package/dist/index.d.ts +8 -4
- package/dist/index.js +42 -42
- package/dist/index.mjs +1 -1
- package/dist/{modelFileResolver-CVmON8hg.d.mts → modelFileResolver-An1aQ0D3.d.mts} +42 -29
- package/dist/{modelFileResolver-CVmON8hg.d.ts → modelFileResolver-An1aQ0D3.d.ts} +42 -29
- package/dist/{modelViewerProps-BBnZTFO-.d.ts → modelViewerProps-BnVflYRA.d.mts} +22 -3
- package/dist/{modelViewerProps-CIY4nsNY.d.mts → modelViewerProps-H_K454u_.d.ts} +22 -3
- package/dist/{publicProps-BARVwXu7.d.ts → publicProps-AdNUI06n.d.ts} +1 -1
- package/dist/{publicProps-n0Yvr_Km.d.mts → publicProps-BOQBJBA_.d.mts} +1 -1
- package/dist/simple-model-viewer.css +1 -1
- package/dist/simple-model-viewer.d.mts +6 -2
- package/dist/simple-model-viewer.d.ts +6 -2
- 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 +15 -15
- package/dist/utils.mjs +1 -1
- package/package.json +7 -5
- 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-VZKEKAUG.mjs +0 -1
- package/dist/chunk-25WC5KDO.mjs +0 -50
- package/dist/chunk-7OVEHDDE.mjs +0 -1
- package/dist/chunk-AL6UIGWP.mjs +0 -1
- package/dist/chunk-KYXJG3TX.mjs +0 -1
- package/dist/chunk-LD7QWHB4.mjs +0 -3
- package/dist/chunk-RKDATTUM.mjs +0 -1
- package/dist/chunk-UAZ6I25Y.mjs +0 -1
- package/dist/chunk-UHRJ2RBF.mjs +0 -1
- package/dist/chunk-YKDDNX2D.mjs +0 -69
- package/dist/exportSceneMesh-YJFOLFHS.mjs +0 -1
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import{e as ve,f as gt}from"./chunk-LX3GXQNU.mjs";import{p as vt}from"./chunk-7JCFNZJM.mjs";import{b as Fe,c as Ct,i as Ie,t as jt}from"./chunk-37QOMZW6.mjs";import{a as bt,b as Te}from"./chunk-GV4ZRXL6.mjs";import{f as ht,h as yt}from"./chunk-7OWHW66D.mjs";import{a as kt,o as Re,q as Ot}from"./chunk-UCD76KQ6.mjs";import{a as ye,b as St,c as wt,d as ke,e as Oe,f as xt,g as At,h as Mt}from"./chunk-RXZ4Q7CY.mjs";var Ee=new WeakMap;function oo(e,t){return Ee.set(e,t),()=>{Ee.get(e)===t&&Ee.delete(e)}}function It(e){Ee.get(e)?.()}var Tt=new WeakMap;function We(e){let t=Tt.get(e);return t||(t={state:"active",listeners:new Set},Tt.set(e,t)),t}function qe(e){return e?We(e).state:"active"}function Ge(e){return qe(e)==="paused"}function He(e,t){let r=We(e);return r.listeners.add(t),()=>{r.listeners.delete(t)}}function so(e,t){let r=We(e);r.state!==t&&(r.state=t,r.listeners.forEach(n=>n()))}async function oe(e,t,r){if(qe(e)==="disconnected")throw new Error("The camera is disconnected from the viewer.");It(e);let n=async()=>{await t(!1),e.update(0)};if(Ge(e))return n();if(!r){await t(!1);return}let o=[];try{await new Promise((a,s)=>{let i=!1,c=l=>{i||(i=!0,l())};if(o.push(He(e,()=>{let l=qe(e);l==="paused"?n().then(()=>c(a),f=>c(()=>s(f))):l==="disconnected"&&c(()=>s(new Error("The camera move was cancelled because the viewer disconnected.")))})),e.addEventListener&&e.removeEventListener){let l=!1,f=()=>{l=!0},u=()=>{l&&c(a)};e.addEventListener("update",f),e.addEventListener("sleep",u),o.push(()=>{e.removeEventListener?.("update",f),e.removeEventListener?.("sleep",u)})}Promise.resolve().then(()=>t(!0)).then(()=>c(a),l=>c(()=>s(l)))})}finally{o.forEach(a=>a())}}import{useCallback as Y,useRef as pe,useState as Ye,useSyncExternalStore as _n}from"react";import{Vector3 as Nt}from"three";var Xe=new WeakSet;function fe(e){Xe.add(e)}function lo(e){let t=Xe.has(e);return t&&Xe.delete(e),t}var Ke=new WeakSet;function uo(e,t){t?Ke.add(e):Ke.delete(e)}function Rt(e,t){return Ke.has(e)?0:t}import{Box3 as Et,Matrix4 as Un,PerspectiveCamera as Bt,Vector3 as Ze}from"three";function bo(e,t){let r=ht(e);if(!(e.camera instanceof Bt)||!t)return r;let n=t instanceof Et?t:new Et().setFromObject(t);return n.isEmpty()||(r.framing={aspect:e.camera.aspect,min:n.min.toArray(),max:n.max.toArray()}),r}function Pt(e,t){let r=t.camera,n=e.framing;if(!(r instanceof Bt)||!n||!(r.aspect>0)||Math.abs(r.aspect-n.aspect)<1e-6)return[...e.position];let o=new Ze(...e.position),a=new Ze(...e.target),s=o.clone().sub(a).normalize(),i=new Un().lookAt(o,a,r.up).invert(),c=Math.tan((e.fov??r.fov)*Math.PI/360)/(e.zoom??r.zoom);if(!(c>0)||!Number.isFinite(c))return[...e.position];let l=0;for(let f of[n.min[0],n.max[0]])for(let u of[n.min[1],n.max[1]])for(let m of[n.min[2],n.max[2]]){let d=new Ze(f,u,m).sub(o).applyMatrix4(i);l=Math.max(l,Math.abs(d.x)/(c*r.aspect)+d.z,Math.abs(d.y)/c+d.z)}return o.addScaledVector(s,l*1.02).toArray()}function Vt(e){return[e.x,e.y,e.z]}function re(e,t){let r=new Nt,n=new Nt;return t.getPosition(r),t.getTarget(n),{position:Vt(r),target:Vt(n),fov:"fov"in e&&typeof e.fov=="number"?e.fov:null,zoom:"zoom"in e&&typeof e.zoom=="number"?e.zoom:1,azimuthAngle:t.azimuthAngle,polarAngle:t.polarAngle}}function Fn(e,t){return e?e.position[0]===t.position[0]&&e.position[1]===t.position[1]&&e.position[2]===t.position[2]&&e.target[0]===t.target[0]&&e.target[1]===t.target[1]&&e.target[2]===t.target[2]&&e.fov===t.fov&&e.zoom===t.zoom&&e.azimuthAngle===t.azimuthAngle&&e.polarAngle===t.polarAngle:!1}async function ge(e,t,r=.6){let n=e.smoothTime;e.smoothTime=Rt(e,r);try{await oe(e,t,!0)}finally{e.smoothTime=n}}function Oo(e={}){let t=pe(e);t.current=e;let r=pe(null),[n,o]=Ye(null),a=Y(y=>n?He(n,y):()=>{},[n]),s=Y(()=>Ge(n),[n]),i=_n(a,s,()=>!1),[c,l]=Ye(null),[f,u]=Ye(()=>({...e.presets})),m=pe(f);m.current=f;let d=Y(y=>{l(C=>Fn(C,y)?C:y)},[]),b=Y(y=>{d(y)},[d]),x=pe(null),h=pe(null),w=pe(null),M=Y(y=>{r.current=y,o(y.raw.controls);let C=re(y.raw.controls.camera,y.raw.controls);d(C),y.raw.scene!==h.current&&(h.current=y.raw.scene,x.current=null,w.current=null),y.homeCameraState&&!x.current&&(x.current=y.homeCameraState);let{initialPosition:k,initialTarget:T,initialTransition:_=!1}=t.current;if((k||T)&&y.raw.scene&&(k||y.homeCameraState)&&w.current!==y.raw.controls){w.current=y.raw.controls,y.homeCameraState||fe(y.raw.controls);let H=k??C.position,K=T??C.target;oe(y.raw.controls,X=>y.raw.controls.setLookAt(H[0],H[1],H[2],K[0],K[1],K[2],X),_).then(()=>{if(r.current?.raw.controls!==y.raw.controls)return;let X=re(y.raw.controls.camera,y.raw.controls);x.current={position:X.position,target:X.target},d(X)}).catch(()=>{})}},[d]),g=Y(async()=>{let y=r.current,C=y?.raw.controls;if(!C)return!1;try{let k=x.current;if(k){yt(C,k);let T=Pt(k,C);await ge(C,_=>C.setLookAt(T[0],T[1],T[2],k.target[0],k.target[1],k.target[2],_))}else y?.raw.scene?await ge(C,T=>C.fitToBox(y.raw.scene,T,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5})):await ge(C,T=>C.reset(T));return!0}catch{return!1}},[]),A=Y(async()=>{let y=r.current;if(!y?.raw.controls||!y.raw.scene)return!1;try{return await ge(y.raw.controls,C=>y.raw.controls.fitToBox(y.raw.scene,C,{paddingTop:.5,paddingBottom:.5,paddingLeft:.5,paddingRight:.5})),!0}catch{return!1}},[]),j=Y(async(y,C={})=>{let k=r.current;if(!k?.raw.controls)return!1;let T=bt(k.objectBindings,y);if(!T)return!1;let _=k.objectBindings[T]?.cameraState;if(_?.position&&_?.target){let[X,J,O]=_.position,[U,N,$]=_.target;try{return await ge(k.raw.controls,Z=>k.raw.controls.setLookAt(X,J,O,U,N,$,Z)),!0}catch{return!1}}let H=k.raw.nodes[T];if(!H)return!1;let K={paddingTop:C.paddingTop??C.padding??.5,paddingBottom:C.paddingBottom??C.padding??.5,paddingLeft:C.paddingLeft??C.padding??.5,paddingRight:C.paddingRight??C.padding??.5};if(Object.values(K).some(X=>!Number.isFinite(X)||X<0))return!1;try{return await ge(k.raw.controls,X=>k.raw.controls.fitToBox(H,X,K)),!0}catch{return!1}},[]),E=Y(async(y,C=!0)=>{let k=r.current?.raw.controls;if(!k)return!1;try{return r.current?.homeCameraState||fe(k),await oe(k,T=>k.setTarget(y[0],y[1],y[2],T),C),d(re(k.camera,k)),!0}catch{return!1}},[d]),L=Y(async(y,C=!0)=>{let k=r.current?.raw.controls;if(!k)return!1;try{r.current?.homeCameraState||fe(k),await oe(k,async H=>{let K=[k.setLookAt(y.position[0],y.position[1],y.position[2],y.target[0],y.target[1],y.target[2],H)];y.azimuthAngle!=null&&y.polarAngle!=null&&K.push(k.rotateTo(y.azimuthAngle,y.polarAngle,H)),await Promise.all(K)},C);let T=k.camera,_=!1;return y.fov!=null&&"fov"in T&&typeof T.fov=="number"&&(T.fov=y.fov,_=!0),y.zoom!=null&&"zoom"in T&&typeof T.zoom=="number"&&(T.zoom=y.zoom,_=!0),_&&"updateProjectionMatrix"in T&&T.updateProjectionMatrix(),d(re(T,k)),!0}catch{return!1}},[d]),V=Y((y,C=!0)=>L(y,C),[L]),S=Y((y,C,k=!0)=>L({position:y,target:C},k),[L]),p=Y(async(y,C,k=!0)=>{let T=r.current?.raw.controls;if(!T)return!1;try{return r.current?.homeCameraState||fe(T),await oe(T,_=>T.rotateTo(y*Math.PI/180,C*Math.PI/180,_),k),d(re(T.camera,T)),!0}catch{return!1}},[d]),v=Y(async(y,C=!0)=>{let k=r.current?.raw.controls;if(!k)return!1;try{return r.current?.homeCameraState||fe(k),await oe(k,T=>k.dollyTo(y,T),C),d(re(k.camera,k)),!0}catch{return!1}},[d]),I=Y(y=>{let C={...y};m.current=C,u(C)},[]),P=Y(y=>{let C=r.current?.raw.controls,k=y.trim();if(!C||!k)return null;let T=re(C.camera,C);return m.current={...m.current,[k]:T},u(_=>({..._,[k]:T})),d(T),T},[d]),B=Y((y,C=!0)=>{let k=m.current[y];return k?L(k,C):Promise.resolve(!1)},[L]);return{isRenderPaused:i,cameraState:c,cameraPresets:f,setCameraPresets:I,resetView:g,focusObject:j,fitScene:A,setCameraTarget:E,setCameraState:V,lookAt:S,orbitTo:p,dollyTo:v,savePreset:P,goToPreset:B,handleCameraChange:b,handleViewerReady:M}}function To(e){let t=e.trim();return t?/\.(hdr|exr|jpg|jpeg|png|webp)(?:[?#].*)?$/i.test(t):!1}var Ro=["none","directional","point","spot","hemisphere"],Eo=["pbr","matcap","uv-checker"],Bo=["neutral","apartment","city","dawn","forest","lobby","night","park","studio","sunset","warehouse"];var Po=["sporadic","constantMild","constantWild"],No=["linear","radial","mirroredLinear"],Vo=["verySmall","small","medium","large","veryLarge","huge"];var Je={enabled:!1,axis:"y",position:.5,flip:!1},qn={clips:[],autoplayClip:null},Wn={autofocus:{enabled:!1,focusDistance:5,focusRange:5,focalLength:.02,bokehScale:6,target:[0,0,0],mouse:!0,debug:0,manual:!1,smoothTime:.25},toneMapping:{enabled:!1,mode:"aces",exposure:1,resolution:256,whitePoint:4,middleGrey:.6,minLuminance:.01,averageLuminance:1,adaptationRate:1},brightnessContrast:{enabled:!1,brightness:0,contrast:0},hueSaturation:{enabled:!1,hue:0,saturation:0},colorAverage:{enabled:!1},dotScreen:{enabled:!1,angle:Math.PI/2,scale:1},glitch:{enabled:!1,mode:"sporadic",delay:[1.5,3.5],duration:[.6,1],strength:[.3,1],chromaticAberrationOffset:[0,0],columns:.05,ratio:.85},ssao:{enabled:!1,samples:30,rings:4,intensity:8,radius:.25,bias:.025,luminanceInfluence:.6,fade:.01,minRadiusScale:.33,worldDistanceThreshold:20,worldDistanceFalloff:5,worldProximityThreshold:6,worldProximityFalloff:3},bloom:{enabled:!1,intensity:.3,luminanceThreshold:.9,luminanceSmoothing:.2,mipmapBlur:!0,radius:0,levels:8},godRays:{enabled:!1,sunPosition:[5,10,5],samples:60,density:.96,decay:.9,weight:.4,exposure:.6,clampMax:1,blur:!0,kernelSize:"small"},grid:{enabled:!1,scale:1,lineWidth:0},noise:{enabled:!1,opacity:1,premultiply:!1},depthOfField:{enabled:!1,focusDistance:5,focusRange:5,focalLength:.02,bokehScale:6},chromaticAberration:{enabled:!1,offsetX:.002,offsetY:.002,radialModulation:!1,modulationOffset:.15},lensflare:{enabled:!1,lensPosition:[-25,6,-60],smoothTime:.07,glareSize:.2,flareSize:.01,flareSpeed:.01,flareShape:.01,animated:!0,anamorphic:!1,colorGain:"#141414",haloScale:.5,secondaryGhosts:!0,aditionalStreaks:!0,ghostScale:0,opacity:1,starBurst:!1},vignette:{enabled:!1,offset:.3,darkness:.3,eskil:!1},smaa:{enabled:!1},sepia:{enabled:!1,intensity:0},scanline:{enabled:!1,density:1.25},pixelation:{enabled:!1,granularity:5},outline:{enabled:!1,selectionLayer:10,edgeStrength:2.5,pulseSpeed:0,visibleEdgeColor:"#ffffff",hiddenEdgeColor:"#22090a",kernelSize:"large",blur:!1,xRay:!0},selectiveBloom:{enabled:!1,selectionLayer:10,intensity:1,luminanceThreshold:.9,luminanceSmoothing:.025,kernelSize:"large",mipmapBlur:!0,inverted:!1,ignoreBackground:!1},ramp:{enabled:!1,rampType:"linear",rampStart:[.5,.5],rampEnd:[1,1],startColor:"#000000",endColor:"#ffffff",opacity:.5,rampBias:.5,rampGain:.5,rampMask:!1,rampInvert:!1}},be={model:{rotation:[0,0,0],showAdvancedRotation:!1,renderer:"pbr",shading:"lit",autoRotate:!1,autoRotateSpeed:1},camera:{fieldOfView:50,showAdvancedSettings:!1},lighting:{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:[3,6,3],attachedToCamera:!1,castShadow:!0,shadowBias:-5e-4,visible:!0},{id:"light-fill",type:"directional",color:"#ffffff",intensity:0,position:[-3,4,-3],attachedToCamera:!1,castShadow:!1,shadowBias:-5e-4,visible:!0}]},shadows:{enabled:!0,mapSize:2048,bias:-5e-4,normalBias:.02,radius:3},environment:{source:"preset",preset:"neutral",customEnvironmentUrl:"",intensity:.25,rotation:0,shadowLight:{enabled:!1,intensity:2.5,bias:-5e-4}},wireframe:{enabled:!1,color:"#000000",opacity:1},background:{enabled:!1,type:"color",color:"#1c1c1d",imageUrl:""},groundShadows:{enabled:!1,mode:"shadowCatcher",intensity:.7,borderFade:1,height:0,size:10},postProcessing:Wn,animations:qn,annotations:[]};function Se(e){let t=f=>{throw new Error(`Invalid section: ${f}`)},r=f=>f&&typeof f=="object"&&!Array.isArray(f)?f:t("expected an object"),n=f=>typeof f=="string"&&f.trim().length>0&&f.length<=200?f:t("expected a nonempty name or id (up to 200 characters)"),o=f=>typeof f=="number"&&Number.isFinite(f)&&f>=0&&f<=1?f:t("position must be between 0 and 1"),a=f=>!Array.isArray(f)||f.length!==3||!f.every(u=>typeof u=="number"&&Number.isFinite(u))||Math.hypot(...f)<1e-8?t("normal must be a finite, nonzero vector"):[...f],s=f=>{let u=r(f);return!["x","y","z"].includes(u.axis)||typeof u.enabled!="boolean"||typeof u.flip!="boolean"?t("invalid plane"):{enabled:u.enabled,axis:u.axis,position:o(u.position),flip:u.flip,...u.normal!==void 0?{normal:a(u.normal)}:{}}},i=f=>{let u=r(f),m=s(u);if(u.mode!==void 0){if(!["plane","planes","box"].includes(u.mode))return t("invalid mode");m.mode=u.mode}if(u.planes!==void 0){if(!Array.isArray(u.planes)||u.planes.length>6)return t("at most six planes are supported");let d=new Set;m.planes=u.planes.map(b=>{let x=r(b),h=n(x.id);return d.has(h)?t("duplicate plane id"):(d.add(h),{...s(x),id:h,name:n(x.name)})})}if(u.activePlaneId!==void 0&&(m.activePlaneId=n(u.activePlaneId)),u.invertBox!==void 0){if(typeof u.invertBox!="boolean")return t("invalid box inversion");m.invertBox=u.invertBox}if(u.box!==void 0){let d=r(u.box),b=w=>!Array.isArray(w)||w.length!==3?t("invalid box bounds"):w.map(o),x=b(d.min),h=b(d.max);if(x.some((w,M)=>w>=h[M]))return t("box minimum must be below its maximum on every axis");m.box={min:x,max:h}}return m},c=r(e),l=i(c);if(c.presets!==void 0){if(!Array.isArray(c.presets)||c.presets.length>32)return t("at most 32 presets are supported");let f=new Set;l.presets=c.presets.map(u=>{let m=r(u),d=n(m.id);return f.has(d)?t("duplicate preset id"):(f.add(d),{id:d,name:n(m.name),settings:i(m.settings)})})}return l}function Lo(e){let{presets:t,...r}=Se(e);return r}function $o(e){try{return Se(e)}catch{return Je}}function Uo(e,t){if(!t||typeof t!="object"||Array.isArray(t))throw new Error("Invalid section: expected an object");let r=["enabled","axis","position","flip"].every(n=>Object.prototype.hasOwnProperty.call(t,n));return Se(r?t:{...Je,...e,...t})}import{Box3 as zt,Matrix4 as Pe,Quaternion as Gn,Vector3 as Be,Euler as Hn}from"three";var qo={version:1,placements:{},gridSize:1};function Qe(e){return e.id??e.url}function we(e){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("Expected an asset transform object.");let t={};for(let r of["position","rotation","scale"]){let n=e[r];if(n!==void 0){if(!Array.isArray(n)||n.length!==3||!n.every(o=>typeof o=="number"&&Number.isFinite(o))||r==="scale"&&n.some(o=>o===0))throw new Error(`Invalid asset ${r}: expected three finite ${r==="scale"?"nonzero ":""}numbers.`);t[r]=[...n]}}return t}function Wo(e){if(!e||typeof e!="object"||Array.isArray(e))throw new Error("Invalid scene composition.");let t=e;if(t.version!==1||!Number.isFinite(t.gridSize)||t.gridSize<=0||!t.placements||typeof t.placements!="object"||Array.isArray(t.placements)||Object.keys(t.placements).length>256)throw new Error("Invalid scene composition version, grid size or placements (maximum 256).");let r={};for(let[n,o]of Object.entries(t.placements)){if(!n||["__proto__","constructor","prototype"].includes(n))throw new Error("Invalid asset instance ID.");let a=we(o);if(o.label!==void 0&&(typeof o.label!="string"||o.label.length>512))throw new Error("Invalid asset label.");for(let s of["visible","deleted"])if(o[s]!==void 0&&typeof o[s]!="boolean")throw new Error(`Invalid asset ${s}.`);r[n]={...a,...o.label!==void 0?{label:o.label}:{},...o.visible!==void 0?{visible:o.visible}:{},...o.deleted!==void 0?{deleted:o.deleted}:{}}}return{version:1,gridSize:t.gridSize,placements:r}}function Go(e,t){if(!Number.isFinite(t)||t<=0)throw new Error("Grid size must be positive.");let r=we(e),[n,o,a]=r.position??[0,0,0];return{...r,position:[Math.round(n/t)*t,o,Math.round(a/t)*t]}}function Ho(e,t){let r=we(e),n=r.position??[0,0,0],o=new Pe().compose(new Be(...n),new Gn().setFromEuler(new Hn(...r.rotation??[0,0,0])),new Be(...r.scale??[1,1,1])),a=new zt(new Be(...t.min),new Be(...t.max)).applyMatrix4(o);if(!Number.isFinite(a.min.y))throw new Error("Cannot place an asset with empty bounds.");return{...r,position:[n[0],n[1]-a.min.y,n[2]]}}function Xo(e){e.updateWorldMatrix(!0,!0);let t=new Pe().copy(e.parent?.parent?.matrixWorld??new Pe).invert(),r=new zt;return e.traverse(n=>{let o=n;o.geometry&&(o.geometry.computeBoundingBox(),o.geometry.boundingBox&&r.union(o.geometry.boundingBox.clone().applyMatrix4(new Pe().multiplyMatrices(t,o.matrixWorld))))}),r.isEmpty()||![...r.min.toArray(),...r.max.toArray()].every(Number.isFinite)?null:{min:r.min.toArray(),max:r.max.toArray()}}import{BufferGeometry as Xn,Float32BufferAttribute as Kn,Matrix4 as Lt,Mesh as et,ShapeUtils as Zn,Vector2 as $t,Vector3 as q,Vector4 as Yn}from"three";function Ut(e){if(e.length!==3)return null;let t=new q(...e[0]).sub(new q(...e[1])),r=new q(...e[2]).sub(new q(...e[1]));return t.lengthSq()===0||r.lengthSq()===0?null:Math.acos(Math.max(-1,Math.min(1,t.normalize().dot(r.normalize()))))*180/Math.PI}function _t(e,t){if(!e.normal)return null;let r=new q(...e.normal);if(r.lengthSq()===0)return null;r.normalize();let n=new q(...t),o=n.clone().sub(new q(...e.position)).dot(r);return{distance:Math.abs(o),projection:n.addScaledVector(r,-o).toArray()}}function Ft(e){if(e.length<3)return{error:"Pick at least three points to finish the area."};let t=new q(...e[0]),r=e.map(h=>new q(...h).sub(t)),n=Math.max(...r.map(h=>h.length()));if(n===0)return{error:"Area points must be distinct."};let o=new q;for(let h=1;h<r.length-1;h+=1){let w=r[h].clone().cross(r[h+1]);w.lengthSq()>o.lengthSq()&&o.copy(w)}if(o.length()<=n*n*1e-10)return{error:"Area points must not lie on one straight line."};o.normalize();let a=Math.max(n*1e-5,Number.EPSILON*Math.max(...e.flat().map(Math.abs))*32);if(r.some(h=>Math.abs(h.dot(o))>a))return{error:"Area points must lie on one plane."};let s=r.find(h=>h.length()>n*1e-10).clone().normalize(),i=o.clone().cross(s).normalize(),c=r.map(h=>new $t(h.dot(s),h.dot(i))),l=(h,w,M)=>(w.x-h.x)*(M.y-h.y)-(w.y-h.y)*(M.x-h.x),f=n*n*1e-10,u=(h,w,M)=>Math.abs(l(h,w,M))<=f&&M.x>=Math.min(h.x,w.x)-n*1e-10&&M.x<=Math.max(h.x,w.x)+n*1e-10&&M.y>=Math.min(h.y,w.y)-n*1e-10&&M.y<=Math.max(h.y,w.y)+n*1e-10;for(let h=0;h<c.length;h+=1){let w=c[h],M=c[(h+1)%c.length];if(w.distanceTo(M)<=n*1e-10)return{error:"Area points must be distinct."};for(let g=h+1;g<c.length;g+=1){if(g===h+1||h===0&&g===c.length-1)continue;let A=c[g],j=c[(g+1)%c.length],E=l(w,M,A),L=l(w,M,j),V=l(A,j,w),S=l(A,j,M);if(E*L<0&&V*S<0||u(w,M,A)||u(w,M,j)||u(A,j,w)||u(A,j,M))return{error:"Area edges must not cross or touch each other."}}}let m=0,d=0,b=0;for(let h=0;h<c.length;h+=1){let w=c[h],M=c[(h+1)%c.length],g=w.x*M.y-M.x*w.y;m+=g,d+=(w.x+M.x)*g,b+=(w.y+M.y)*g}if(Math.abs(m)<=f)return{error:"The polygon has no measurable area."};let x=t.clone().addScaledVector(s,d/(3*m)).addScaledVector(i,b/(3*m));return{area:Math.abs(m)/2,center:x.toArray(),triangles:Zn.triangulateShape(c,[])}}function tt(e,t){if(e.length<2)return 0;let r=0;for(let n=1;n<e.length;n+=1)r+=new q(...e[n]).distanceTo(new q(...e[n-1]));return t&&(r+=new q(...e[e.length-1]).distanceTo(new q(...e[0]))),r}var Jn=1e-5;function Qn(e,t){let r=e.getAttribute("position"),n=e.getIndex(),o=r.count,a=Math.max(t,1e-9),s=(b,x,h)=>`${Math.round(b/a)}_${Math.round(x/a)}_${Math.round(h/a)}`,i=new Int32Array(o),c=[],l=new Map;for(let b=0;b<o;b+=1){let x=r.getX(b),h=r.getY(b),w=r.getZ(b),M=s(x,h,w),g=l.get(M);g===void 0&&(g=c.length,c.push(new q(x,h,w)),l.set(M,g)),i[b]=g}let f=c.map(()=>new Map),u=(b,x)=>{if(b===x)return;let h=c[b].distanceTo(c[x]);f[b].has(x)||f[b].set(x,h),f[x].has(b)||f[x].set(b,h)},m=(n?n.count:o)/3,d=b=>n?n.getX(b):b;for(let b=0;b<m;b+=1)u(i[d(b*3)],i[d(b*3+1)]),u(i[d(b*3+1)],i[d(b*3+2)]),u(i[d(b*3+2)],i[d(b*3)]);return{weldedId:i,weldedPosition:c,neighbors:f}}function er(e,t,r){let n=new Map([[t,0]]),o=[t];for(let a=0;a<r&&o.length>0;a+=1){let s=[];for(let i of o){let c=n.get(i)??0;for(let[l,f]of e[i]??[])n.has(l)||(n.set(l,c+f),s.push(l))}o=s}return n}function tr(e){let r=(Math.abs(e.y)<.9?new q(0,1,0):new q(1,0,0)).clone().cross(e).normalize(),n=e.clone().cross(r).normalize();return[r,n]}function nr(e,t,r){let[n,o]=tr(t),a=0,s=0,i=0;for(let x of r){let h=x.clone().sub(e),w=h.dot(n),M=h.dot(o);a+=w*w,s+=w*M,i+=M*M}let c=a+i,l=a*i-s*s,f=Math.sqrt(Math.max(0,c*c/4-l)),u=c/2+f,m=1,d=0;Math.abs(s)>1e-12?(m=u-i,d=s):i>a&&(m=0,d=1);let b=Math.hypot(m,d)||1;return n.clone().multiplyScalar(m/b).add(o.clone().multiplyScalar(d/b)).normalize()}function rr(e,t,r,n){let o=e.getAttribute("position"),a=e.getIndex(),s=o.count,i=(a?a.count:s)/3,c=m=>a?a.getX(m):m,l=m=>new q(o.getX(m),o.getY(m),o.getZ(m)).applyMatrix4(t),f=m=>m.clone().sub(r).dot(n),u=[];for(let m=0;m<i;m+=1){let d=l(c(m*3)),b=l(c(m*3+1)),x=l(c(m*3+2)),h=f(d),w=f(b),M=f(x),g=[],A=(j,E,L,V)=>{E>0!=V>0&&g.push(j.clone().lerp(L,E/(E-V)))};A(d,h,b,w),A(b,w,x,M),A(x,M,d,h),g.length===2&&u.push([g[0],g[1]])}return u}function or(e,t){let r=Math.max(t,1e-9),n=m=>`${Math.round(m.x/r)}_${Math.round(m.y/r)}_${Math.round(m.z/r)}`,o=new Map,a=[],s=m=>{let d=n(m),b=o.get(d);return b===void 0&&(b=a.length,a.push(m),o.set(d,b)),b},i=[],c=m=>{for(;i.length<=m;)i.push(new Map)};for(let[m,d]of e){let b=s(m),x=s(d);b!==x&&(c(b),c(x),i[b].set(x,(i[b].get(x)??0)+1),i[x].set(b,(i[x].get(b)??0)+1))}let l=(m,d)=>m<d?`${m}_${d}`:`${d}_${m}`,f=new Set,u=[];for(let m=0;m<i.length;m+=1)for(let d of i[m]?.keys()??[]){if(f.has(l(m,d)))continue;let b=[m],x=m,h=d;f.add(l(x,h));let w=0;for(;h!==m&&h>=0&&w<i.length+4;){b.push(h);let M=[...i[h].keys()].filter(A=>A!==x),g;if(M.length<=1)g=M[0];else{let A=a[h].clone().sub(a[x]).normalize(),j=-1/0;for(let E of M){let L=a[E].clone().sub(a[h]).normalize(),V=A.dot(L);V>j&&(j=V,g=E)}}if(g===void 0){h=-1;break}f.add(l(h,g)),x=h,h=g,w+=1}h===m&&b.length>=3&&u.push(b.map(M=>a[M]))}return u}function Dt(e,t){let r=1/0;for(let n of e)r=Math.min(r,n.distanceTo(t));return r}function ir(e,t){let r=0,n=1/0;return e.forEach((o,a)=>{let s=o.distanceTo(t);s<n&&(n=s,r=a)}),[...e.slice(r),...e.slice(0,r)]}function qt(e,t,r,n,o){let a=rr(e,t,n,o);if(a.length===0)return{error:"Couldn't trace a loop around this point."};let s=or(a,r*t.getMaxScaleOnAxis());if(s.length===0)return{error:"The surface here doesn't form a closed loop around this point (it may be near an open edge)."};let i=s[0],c=Dt(i,n);for(let f of s.slice(1)){let u=Dt(f,n);u<c&&(c=u,i=f)}let l=ir(i,n).map(f=>f.toArray());return{points:l,length:tt(l,!0)}}function Wt(e){if(!(e.object instanceof et)||!e.face)return null;let t=e.object,r=t.geometry;if(t.isSkinnedMesh||t.morphTargetInfluences?.some(a=>a!==0)){let a=r.getAttribute("position"),s=new Kn(new Float32Array(a.count*3),3),i=new q;for(let c=0;c<a.count;c++)t.getVertexPosition(c,i),s.setXYZ(c,i.x,i.y,i.z);r=new Xn().setAttribute("position",s).setIndex(r.getIndex())}let n=t.matrixWorld.clone();if(e.instanceId!==void 0&&"getMatrixAt"in t){let a=new Lt;t.getMatrixAt(e.instanceId,a),n.multiply(a)}r.computeBoundingSphere();let o=r.boundingSphere&&r.boundingSphere.radius>0?r.boundingSphere.radius:1;return{face:e.face,geometry:r,matrix:n,weldTolerance:o*Jn}}function Yo(e,t=6){let r=Wt(e);if(!r)return{error:"Pick a point on the mesh surface to trace a loop around it."};let{face:n,geometry:o,matrix:a,weldTolerance:s}=r,i=Gt(e);if(!i)return{error:"Pick a point on the mesh surface to trace a loop around it."};let c=i[1].clone().sub(i[0]).cross(i[2].clone().sub(i[0]));if(c.lengthSq()===0)return{error:"Couldn't determine the surface direction at this point."};c.normalize();let{weldedId:l,weldedPosition:f,neighbors:u}=Qn(o,s),m=o.getAttribute("position"),d=e.point.clone().applyMatrix4(a.clone().invert()),b=[n.a,n.b,n.c],x=b[0],h=1/0;for(let E of b){let V=new q(m.getX(E),m.getY(E),m.getZ(E)).distanceTo(d);V<h&&(h=V,x=E)}let w=l[x],M=f[w].clone().applyMatrix4(a),g=er(u,w,t),A=[];for(let E of g.keys())A.push(f[E].clone().applyMatrix4(a));if(A.length<6)return{error:"Not enough surface detail near this point to trace a loop. Try a different spot."};let j=nr(M,c,A);return qt(o,a,s,e.point.clone(),j)}function Jo(e,t=new q(0,1,0)){let r=Wt(e);if(!r)return{error:"Pick a point on the mesh surface to trace a loop around it."};let{geometry:n,matrix:o,weldTolerance:a}=r,s=t.clone().normalize();return s.lengthSq()===0?{error:"Couldn't determine a horizontal direction."}:qt(n,o,a,e.point.clone(),s)}function Gt(e){if(!(e.object instanceof et)||!e.face)return null;let t=e.object,r=t.matrixWorld.clone();if(e.instanceId!==void 0&&"getMatrixAt"in t){let n=new Lt;t.getMatrixAt(e.instanceId,n),r.multiply(n)}return[e.face.a,e.face.b,e.face.c].map(n=>t.getVertexPosition(n,new q).applyMatrix4(r))}function Qo(e){if(!(e.object instanceof et))return!1;for(let r=e.object;r;r=r.parent)if(!r.visible||r.userData.riEditorGizmo||r.userData.riDecal)return!1;return(Array.isArray(e.object.material)?e.object.material:[e.object.material])[e.face?.materialIndex??0]?.visible!==!1}function ei(e,t,r,n,o,a=12){let s=Gt(e),i=s?s[1].clone().sub(s[0]).cross(s[2].clone().sub(s[0])).normalize():null,c={position:e.point.toArray(),...i&&i.lengthSq()>0?{normal:i.toArray()}:{},...s?{faceVertices:s.map(m=>m.toArray())}:{}};if(!s||o==="none")return c;let l=m=>{let d=new Yn(m.x,m.y,m.z,1).applyMatrix4(t.matrixWorldInverse).applyMatrix4(t.projectionMatrix);return d.w<=0||d.z/d.w<-1||d.z/d.w>1?null:{screen:new $t((d.x/d.w+1)*n.width/2,(1-d.y/d.w)*n.height/2),w:d.w}},f=s.map(l),u=a;if((o==="vertex"||o==="auto")&&(f.forEach((m,d)=>{let b=m?.screen.distanceTo(r)??1/0;b<=u&&(u=b,c.position=s[d].toArray(),c.snapped="vertex")}),c.snapped))return c;if(o==="edge"||o==="auto")for(let m=0;m<3;m+=1){let d=(m+1)%3,b=f[m],x=f[d];if(!b||!x)continue;let h=x.screen.clone().sub(b.screen);if(h.lengthSq()===0)continue;let w=Math.max(0,Math.min(1,r.clone().sub(b.screen).dot(h)/h.lengthSq())),M=b.screen.clone().addScaledVector(h,w).distanceTo(r);if(M<=u){u=M;let g=w*b.w/((1-w)*x.w+w*b.w);c.position=s[m].clone().lerp(s[d],g).toArray(),c.snapped="edge"}}return c}var ar=["m","cm","mm","in","ft"],nt={m:1,cm:.01,mm:.001,in:.0254,ft:.3048},sr=["distance","angle","area","pointToPlane","wrap","wrapHorizontal"];function rt(e){return ar.includes(e)}function cr(e={},t="m"){let r=e.displayUnit??t,n=e.metersPerUnit??nt[e.sourceUnit??"m"];if(!Number.isFinite(n)||n<=0)throw new Error("Measurement scale must be a positive finite number.");return{displayUnit:r,metersPerUnit:n,factor:rt(r)?n/nt[r]:1}}function ri(e){try{return new URL(e,typeof window<"u"?window.location?.href:void 0).href}catch{return e}}function oi(e,t,r,n={}){if(!rt(r)||!Number.isFinite(e)||e<=0||!Number.isFinite(t)||t<=0)throw new Error("Calibration needs two distinct points and a positive known distance.");let o=t*nt[r]/e;if(!Number.isFinite(o)||o<=0)throw new Error("Calibration scale is outside the supported range.");return{...n,metersPerUnit:o}}function Ht(e,t){let r=t.map(n=>n.position);if(e==="angle"){let n=Ut(r);return n===null?null:{value:n,dimension:0}}if(e==="area"){let n=Ft(r);return"error"in n?null:{value:n.area,dimension:2}}if(e==="pointToPlane"){let n=t.length===2?_t(t[0],t[1].position):null;return n?{value:n.distance,dimension:1}:null}return t.length<(e==="distance"?2:3)?null:{value:tt(r,e!=="distance"),dimension:1}}function lr(e,t={},r="m",n=e.points,o=e.approximate?"approximate":"ready"){let a=Ht(e.tool,n),{factor:s,displayUnit:i}=cr(t,r),c=o==="ready"||o==="approximate",l=c&&a?a.value*s**a.dimension:null;return{id:e.id,status:c?a&&l!==null&&Number.isFinite(l)?o:"invalid":o,rawValue:c&&a&&Number.isFinite(a.value)?a.value:null,value:l!==null&&Number.isFinite(l)?l:null,unit:e.tool==="angle"?"\xB0":e.tool==="area"?`${i}\xB2`:i}}function xe(e){function t(){throw new Error("Invalid measurements: expected settings and valid named measurements with finite points.")}let r=i=>!!i&&typeof i=="object"&&!Array.isArray(i),n=i=>Array.isArray(i)&&i.length===3&&i.every(c=>typeof c=="number"&&Number.isFinite(c));typeof e=="string"&&(e.length>5*1024*1024&&t(),e=JSON.parse(e)),(!r(e)||e.version!==void 0&&e.version!==1||!r(e.settings)||!Array.isArray(e.items)||e.items.length>256)&&t();let o={};for(let i of["sourceUnit","displayUnit"])e.settings[i]!==void 0&&(rt(e.settings[i])||t(),o[i]=e.settings[i]);e.settings.metersPerUnit!==void 0&&((typeof e.settings.metersPerUnit!="number"||!Number.isFinite(e.settings.metersPerUnit)||e.settings.metersPerUnit<=0)&&t(),o.metersPerUnit=e.settings.metersPerUnit);let a=new Set,s=e.items.map(i=>{(!r(i)||typeof i.id!="string"||!i.id||a.has(i.id)||typeof i.name!="string"||!i.name.trim()||typeof i.modelId!="string"||!i.modelId||!sr.includes(i.tool)||!Array.isArray(i.points)||i.points.length>8192||typeof i.createdAt!="string"||!Number.isFinite(Date.parse(i.createdAt)))&&t(),a.add(i.id),i.tilesetUrl!==void 0&&i.tilesetUrl!==null&&typeof i.tilesetUrl!="string"&&t(),(i.visible!==void 0&&typeof i.visible!="boolean"||i.approximate!==void 0&&typeof i.approximate!="boolean")&&t();let c=new Set,l=i.points.map(u=>{if((!r(u)||typeof u.id!="number"||!Number.isFinite(u.id)||!n(u.position))&&t(),c.has(u.id)&&t(),c.add(u.id),u.normal!==void 0&&!n(u.normal)&&t(),u.faceVertices!==void 0&&(!Array.isArray(u.faceVertices)||u.faceVertices.length!==3||!u.faceVertices.every(n))&&t(),u.snapped!==void 0&&!["vertex","edge"].includes(u.snapped)&&t(),u.anchor!==void 0){let d=u.anchor;(!r(d)||typeof d.nodeId!="string"||!d.nodeId||!n(d.localPosition)||typeof d.geometrySignature!="string"||typeof d.poseSignature!="string")&&t(),d.localNormal!==void 0&&!n(d.localNormal)&&t(),d.localFaceVertices!==void 0&&(!Array.isArray(d.localFaceVertices)||d.localFaceVertices.length!==3||!d.localFaceVertices.every(n))&&t(),d.instanceId!==void 0&&(!Number.isInteger(d.instanceId)||d.instanceId<0)&&t()}let m=u.anchor;return{id:u.id,position:[...u.position],...u.normal?{normal:[...u.normal]}:{},...u.faceVertices?{faceVertices:u.faceVertices.map(d=>[...d])}:{},...u.snapped?{snapped:u.snapped}:{},...m?{anchor:{nodeId:m.nodeId,localPosition:[...m.localPosition],geometrySignature:m.geometrySignature,poseSignature:m.poseSignature,...m.localNormal?{localNormal:[...m.localNormal]}:{},...m.localFaceVertices?{localFaceVertices:m.localFaceVertices.map(d=>[...d])}:{},...m.instanceId!==void 0?{instanceId:m.instanceId}:{}}}:{}}}),f={id:i.id,name:i.name,modelId:i.modelId,tool:i.tool,points:l,createdAt:i.createdAt,...i.tilesetUrl!==void 0?{tilesetUrl:i.tilesetUrl}:{},...i.visible!==void 0?{visible:i.visible}:{},...i.approximate!==void 0?{approximate:i.approximate}:{}};return Ht(f.tool,l)||t(),f});return{settings:o,items:s}}function ii(e){return JSON.stringify({version:1,...xe(e)},null,2)}function ai(e,t,r="m"){let n=xe(e),o=new Map(t?.map(s=>[s.id,s])),a=s=>{let i=String(s??"");return/^[=+@-]/.test(i)&&(i=`'${i}`),`"${i.replace(/"/g,'""')}"`};return[["id","name","modelId","type","status","value","unit","createdAt"],...n.items.map(s=>{let i=o.get(s.id)??lr(s,n.settings,r);return[s.id,s.name,s.modelId,s.tool,i.status,i.value,i.unit,s.createdAt]})].map(s=>s.map(a).join(",")).join(`\r
|
|
2
|
+
`)}function Xt(e){if(!Array.isArray(e)||e.length>128)throw new Error("Invalid selections: expected up to 128 named selection sets.");let t=new Set;return e.map(r=>{if(!r||typeof r!="object"||typeof r.id!="string"||!r.id||t.has(r.id)||typeof r.name!="string"||!r.name.trim()||r.name.length>200||!Array.isArray(r.objectIds)||r.objectIds.length>1e5||r.objectIds.some(n=>typeof n!="string"||!n))throw new Error("Invalid selections: each set needs a unique id, a name, and model object ids.");return t.add(r.id),{id:r.id,name:r.name.trim(),objectIds:[...new Set(r.objectIds)]}})}var ie=5*1024*1024,mr=["activeModelId","modelUrl","modelFormat","tilesetUrl","models","mergeModels","sceneConfig","isolation","multiSelectedKeys","activeAnnotation","annotationCategories","backgroundColor","shadows","cinematic","cameraControllerType","objectTransformSpace","arScaleMode","usdzUrl","measurements","measurementSettings","measurementUnit","measurementModelId"];function R(e,t){throw new Error(`Invalid viewer state at ${e}: ${t}`)}function W(e,t){(!e||typeof e!="object"||Array.isArray(e))&&R(t,"expected an object.")}function Ae(e,t){(!Array.isArray(e)||!e.every(r=>typeof r=="string"))&&R(t,"expected strings.")}function Q(e,t,r){(!Array.isArray(e)||e.length!==t||!e.every(n=>typeof n=="number"&&Number.isFinite(n)))&&R(r,`expected ${t} finite numbers.`)}function dr(e){let t=new Set,r=0;function n(o,a,s){if((++r>2e5||s>64)&&R(a,"configuration is too complex."),o===null||typeof o=="string"||typeof o=="boolean"||typeof o=="number"&&Number.isFinite(o))return o;(typeof o!="object"||!o)&&R(a,"expected JSON data (finite numbers, no functions)."),t.has(o)&&R(a,"cyclic data."),!Array.isArray(o)&&Object.getPrototypeOf(o)!==Object.prototype&&Object.getPrototypeOf(o)!==null&&R(a,"expected plain JSON data."),t.add(o);let i=Array.isArray(o)?[]:{};for(let[c,l]of Object.entries(o))["__proto__","constructor","prototype"].includes(c)&&R(`${a}.${c}`,"reserved property."),l!==void 0?i[c]=n(l,`${a}.${c}`,s+1):Array.isArray(o)&&R(a,"undefined array entry.");return t.delete(o),i}return n(e,"state",0)}function ee(e,t,r,n,o=!1,a){let s=e[t];if(s==null||s==="")return;typeof s!="string"&&R(r,"expected a URL.");let i=o?Ie(s)??s:s;if(i.trim().startsWith("blob:")){if(o&&a){a.set(s,{source:i,path:r});return}R(r,o?"this image is temporary. Use getStateAsync() for JSON or createShareUrl() to include it.":"upload this model/environment asset to a durable URL before saving or sharing.")}if(i!==s&&(s=i,e[t]=i),o&&/^data:image\//i.test(s))return;let c;try{c=new URL(s,n??"https://relative.invalid/")}catch{R(r,"invalid asset URL.")}["http:","https:"].includes(c.protocol)||R(r,"use an HTTP(S) asset URL."),n&&(e[t]=c.href)}function ur(e,t){W(e,t),Q(e.position,3,`${t}.position`),Q(e.target,3,`${t}.target`),(typeof e.zoom!="number"||e.zoom<=0)&&R(t,"zoom must be positive."),e.fov!==null&&(typeof e.fov!="number"||e.fov<=0||e.fov>=180)&&R(t,"fov must be null or between 0 and 180.");for(let r of["azimuthAngle","polarAngle"])e[r]!==void 0&&typeof e[r]!="number"&&R(t,`${r} must be a number.`)}function Yt(e,t,r,n){W(e,t),(typeof e.id!="number"||typeof e.title!="string"||typeof e.description!="string")&&R(t,"expected an annotation id, title and description.");for(let o of["worldPosition","localPosition"])Q(e[o],3,`${t}.${o}`);e.images!==void 0&&(Array.isArray(e.images)||R(t,"images must be an array."),e.images.forEach(o=>{W(o,t),ee(o,"src",t,r,!0,n)})),e.links!==void 0&&(Array.isArray(e.links)||R(t,"links must be an array."),e.links.forEach(o=>{W(o,t),ee(o,"href",t,r,!1,n)}))}function Jt(e,t){W(e,t),e.waypoints!==void 0&&(Array.isArray(e.waypoints)||R(t,"expected waypoints."),e.waypoints.forEach(r=>{W(r,t),Q(r.position,3,t),Q(r.target,3,t)}));for(let r of["enabled","loop","autoPlay"])e[r]!==void 0&&typeof e[r]!="boolean"&&R(t,`${r} must be boolean.`);e.duration!==void 0&&(typeof e.duration!="number"||e.duration<=0)&&R(t,"duration must be positive.")}function ot(e,t,r){if(t!==null)if(Array.isArray(t))Array.isArray(e)||R(r,"expected an array."),t.length&&e.forEach(n=>ot(n,t[0],r));else if(typeof t=="object"){W(e,r);for(let[n,o]of Object.entries(t))ot(e[n],o,`${r}.${n}`)}else typeof e!=typeof t&&R(r,`expected ${typeof t}.`)}function Kt(e,t,r,n){if(ot(e,be,t),e.measurements!==void 0&&(e.measurements=xe(e.measurements)),e.sequences!==void 0&&(e.sequences=ve(e.sequences)),e.selectionSets!==void 0&&(e.selectionSets=Xt(e.selectionSets)),e.product!==void 0&&(e.product=vt(e.product),e.product.definition.groups.forEach(o=>o.options.forEach(a=>a.appearance?.forEach(s=>{for(let[i,c]of Object.entries(s.material??{}))c&&typeof c=="object"&&!Array.isArray(c)&&"path"in c&&ee(c,"path",`${t}.product.material.${i}.path`,r,!0,n)})))),Q(e.model.rotation,3,`${t}.model.rotation`),e.lighting.lights.forEach(o=>Q(o.position,3,`${t}.lighting.lights`)),e.annotations.forEach(o=>Yt(o,`${t}.annotations`,r,n)),e.animations.autoplayClip!==null&&typeof e.animations.autoplayClip!="string"&&R(t,"invalid autoplay clip."),e.animations.clips.forEach(o=>{W(o,t),(typeof o.sourceName!="string"||typeof o.displayName!="string"||typeof o.hidden!="boolean"||typeof o.speed!="number"||!["repeat","once","ping-pong"].includes(o.loopMode))&&R(t,"invalid animation clip settings.")}),e.cinematic!==void 0&&Jt(e.cinematic,`${t}.cinematic`),e.styleRules!==void 0&&!Array.isArray(e.styleRules)&&R(t,"styleRules must be an array."),ee(e.environment,"customEnvironmentUrl",`${t}.environment`,r,!1,n),ee(e.background,"imageUrl",`${t}.background`,r,!0,n),e.model.activeVariants!==void 0&&Ae(e.model.activeVariants,t),e.section!==void 0)try{e.section=Se(e.section)}catch(o){R(`${t}.section`,o.message)}}function Qt(e,t,r,n){W(e,t);for(let[o,a]of Object.entries(e)){let s=`${t}.${o}`;W(a,s),(typeof a.id!="string"||typeof a.modelObjectId!="string")&&R(s,"expected binding id and modelObjectId.");for(let i of["label","group","type","status"])a[i]!==void 0&&typeof a[i]!="string"&&R(s,`${i} must be a string.`);a.tags!==void 0&&Ae(a.tags,s),a.metadata!==void 0&&W(a.metadata,`${s}.metadata`),a.metrics!==void 0&&(W(a.metrics,s),Object.values(a.metrics).some(i=>typeof i!="number")&&R(s,"metrics must be numbers.")),a.actions!==void 0&&(Array.isArray(a.actions)||R(s,"actions must be an array."),a.actions.forEach(i=>{W(i,s),(typeof i.id!="string"||typeof i.label!="string"||i.type!=="command"||i.effects!==void 0&&!Array.isArray(i.effects))&&R(s,"invalid action.")}));for(let i of["visible","removed","selectable","hoverable"])a[i]!==void 0&&typeof a[i]!="boolean"&&R(s,`${i} must be boolean.`);if(a.transform!==void 0){W(a.transform,s);for(let i of["position","rotation","scale","shear"])a.transform[i]!==void 0&&Q(a.transform[i],3,`${s}.transform.${i}`);a.transform.pivot!==void 0&&(W(a.transform.pivot,s),Q(a.transform.pivot.point,3,s),Q(a.transform.pivot.offset,3,s))}if(a.style!==void 0&&(W(a.style,s),a.style.material!==void 0)){W(a.style.material,s);for(let[i,c]of Object.entries(a.style.material))c&&typeof c=="object"&&!Array.isArray(c)&&"path"in c&&ee(c,"path",`${s}.style.material.${i}.path`,r,!0,n)}a.decals!==void 0&&(Array.isArray(a.decals)||R(s,"decals must be an array."),a.decals.forEach(i=>{W(i,s),(typeof i.id!="string"||typeof i.size!="number"||i.size<=0)&&R(s,"invalid decal."),Q(i.position,3,s),Q(i.normal,3,s),ee(i,"image",s,r,!0,n)}))}}function Zt(e,t,r,n){Array.isArray(e)||R(t,"expected merge sources."),e.forEach(o=>{W(o,t),(typeof o.url!="string"||!o.url||typeof o.namePrefix!="string")&&R(t,"expected source URL and prefix."),ee(o,"url",t,r,!1,n)})}function fr(e,t,r){W(e,"configuration");let n=Object.fromEntries(mr.filter(o=>e[o]!==void 0).map(o=>[o,e[o]]));(typeof n.modelUrl!="string"||!n.modelUrl)&&R("configuration.modelUrl","expected the active model URL.");for(let o of["modelUrl","tilesetUrl","usdzUrl"])ee(n,o,`configuration.${o}`,t,!1,r);if(n.sceneConfig!==void 0&&Kt(n.sceneConfig,"configuration.sceneConfig",t,r),n.mergeModels!==void 0&&Zt(n.mergeModels,"configuration.mergeModels",t,r),n.models!==void 0){(!Array.isArray(n.models)||n.models.length===0)&&R("configuration.models","expected model entries.");let o=new Set,a=new Set;n.models.forEach(s=>{W(s,"model"),(typeof s.url!="string"||!s.url)&&R("model.url","expected a URL."),ee(s,"url","model.url",t,!1,r),s.id!==void 0&&(typeof s.id!="string"||!s.id.trim())&&R("model.id","expected a nonempty instance ID.");let i=Qe({id:s.id,url:s.url});a.has(i)&&R("configuration.models","instance identities must be unique; assign IDs when reusing a URL."),a.add(i),s.transform!==void 0&&(s.transform=we(s.transform)),s.visible!==void 0&&typeof s.visible!="boolean"&&R("model.visible","expected boolean."),o.add(s.url),Qt(s.objectBindings,"model.objectBindings",t,r),s.sceneConfig!==void 0&&Kt(s.sceneConfig,"model.sceneConfig",t,r),s.mergeModels!==void 0&&Zt(s.mergeModels,"model.mergeModels",t,r)}),n.activeModelId!==void 0&&(typeof n.activeModelId!="string"||!a.has(n.activeModelId))&&R("configuration.activeModelId","active instance is not in models."),n.activeModelId!==void 0&&n.models.find(s=>Qe(s)===n.activeModelId)?.url!==n.modelUrl&&R("configuration.modelUrl","source does not match the active instance."),o.has(n.modelUrl)||R("configuration.modelUrl","active model is not in models.")}if(n.multiSelectedKeys!==void 0&&Ae(n.multiSelectedKeys,"configuration.multiSelectedKeys"),n.annotationCategories!==void 0&&n.annotationCategories!==null&&Ae(n.annotationCategories,"configuration.annotationCategories"),n.activeAnnotation!==void 0&&n.activeAnnotation!==null&&Yt(n.activeAnnotation,"configuration.activeAnnotation",t,r),n.measurements!==void 0||n.measurementSettings!==void 0){let o=xe({items:n.measurements??[],settings:n.measurementSettings??{}});n.measurements!==void 0&&(n.measurements=o.items),n.measurementSettings!==void 0&&(n.measurementSettings=o.settings)}n.measurementModelId!==void 0&&typeof n.measurementModelId!="string"&&R("configuration.measurementModelId","expected a stable id."),n.measurementUnit!==void 0&&typeof n.measurementUnit!="string"&&R("configuration.measurementUnit","expected a unit label.");for(let o of["backgroundColor"])n[o]!==void 0&&typeof n[o]!="string"&&R(o,"expected a string.");n.shadows!==void 0&&typeof n.shadows!="boolean"&&R("shadows","expected boolean.");for(let[o,a]of Object.entries({modelFormat:["glb","gltf","obj","fbx","usdz","stl","ply"],cameraControllerType:["orbit","pointerLock"],objectTransformSpace:["world","local"],arScaleMode:["normalized","real-world"]}))n[o]!==void 0&&!a.includes(n[o])&&R(o,"unsupported value.");if(n.cinematic!==void 0&&Jt(n.cinematic,"cinematic"),n.isolation!==void 0&&n.isolation!==null){let{target:o,mode:a,ghostOpacity:s}=n.isolation;typeof o=="string"||Array.isArray(o)&&o.every(i=>typeof i=="string")||o&&typeof o=="object"&&["group","tag","type"].some(i=>typeof o[i]=="string")||R("configuration.isolation","invalid target."),a!==void 0&&!["ghost","hide"].includes(a)&&R("configuration.isolation","invalid mode."),s!==void 0&&(typeof s!="number"||s<0||s>1)&&R("configuration.isolation","opacity must be between 0 and 1.")}return n}function en(e,t,r,n){if(!(!e||typeof e!="object"))for(let[o,a]of Object.entries(e))o!=="metadata"&&(typeof a=="string"&&["url","modelUrl","tilesetUrl","usdzUrl","path","image","src","href","imageUrl","customEnvironmentUrl"].includes(o)?ee(e,o,`${t}.${o}`,r,["path","image","src","imageUrl"].includes(o),n):en(a,`${t}.${o}`,r,n))}function tn(e,t,r){typeof e=="string"&&(new TextEncoder().encode(e).length>ie&&R("state","exceeds the 5 MiB limit."),e=JSON.parse(e));let n=dr(e);W(n,"state"),new TextEncoder().encode(JSON.stringify(n)).length>ie&&R("state","exceeds the 5 MiB limit."),n.version!==void 0&&n.version!==1&&R("version","unsupported version."),n.version===void 0&&(n.objectBindings!==void 0||n.configuration!==void 0)&&R("version","full configurations require version 1.");let o={};return n.version!==void 0&&(o.version=1),n.camera!==void 0&&(ur(n.camera,"camera"),o.camera=n.camera),n.hidden!==void 0&&(Ae(n.hidden,"hidden"),o.hidden=n.hidden),n.selected!==void 0&&(n.selected!==null&&typeof n.selected!="string"&&R("selected","expected an object id or null."),o.selected=n.selected),n.objectBindings!==void 0&&(Qt(n.objectBindings,"objectBindings",t,r),o.objectBindings=n.objectBindings),n.configuration!==void 0&&(o.configuration=fr(n.configuration,t,r)),en(o,"state",t,r),new TextEncoder().encode(JSON.stringify(o)).length>ie&&R("state","exceeds the 5 MiB limit."),o}function hi(e,t){return JSON.stringify(Ne(e,t))}function Ne(e,t){return tn(e,t)}async function nn(e,t){let r=new Map,n=tn(e,t,r),o=new Map,a=new Map;for(let[i,{source:c,path:l}]of r){let f=o.get(c);f||(f=(async()=>{let u;try{u=await fetch(c)}catch{R(l,"this temporary image is no longer available. Reload or reselect it before saving.")}u.ok||R(l,"could not read the temporary image. Reload or reselect it before saving.");let m=await u.blob();m.size>ie*3/4&&R(l,"embedded image exceeds the 5 MiB configuration limit. Use a hosted image URL.");let d=new Uint8Array(await m.arrayBuffer()),b=m.type.split(";")[0].toLowerCase(),x=b.startsWith("image/")?b:pr(d);x||R(l,"temporary asset is not a supported image. Use a hosted asset URL.");let h="";for(let w=0;w<d.length;w+=32768)h+=String.fromCharCode(...d.subarray(w,w+32768));return`data:${x};base64,${btoa(h)}`})(),o.set(c,f)),a.set(i,await f)}function s(i){if(!(!i||typeof i!="object"))for(let[c,l]of Object.entries(i))c!=="metadata"&&(["path","image","src","imageUrl"].includes(c)&&typeof l=="string"&&a.has(l)?i[c]=a.get(l):s(l))}return s(n),Ne(n,t)}function pr(e){let t=(r,n)=>String.fromCharCode(...e.subarray(r,n));if(e[0]===137&&t(1,4)==="PNG")return"image/png";if(e[0]===255&&e[1]===216&&e[2]===255)return"image/jpeg";if(t(0,3)==="GIF")return"image/gif";if(t(0,4)==="RIFF"&&t(8,12)==="WEBP")return"image/webp";if(t(4,8)==="ftyp"&&["avif","avis"].includes(t(8,12)))return"image/avif";if(/<svg[\s>]/i.test(new TextDecoder().decode(e.subarray(0,1024))))return"image/svg+xml"}import{strFromU8 as gr,strToU8 as rn,unzlibSync as br,zlibSync as hr}from"fflate";var Ve="ri-ar",ze="ri-ar-id",on=4096,yr=2200,Sr=rn(JSON.stringify(be)).byteLength;function an(e){return e==="localhost"||e.endsWith(".localhost")||/^127\./.test(e)||e==="[::1]"||e==="0.0.0.0"}function sn(e){if(typeof e=="string"&&/^https?:\/\//i.test(e)&&an(new URL(e).hostname))throw new Error("An asset URL points to this computer. Use model and texture URLs reachable from the phone.");if(e&&typeof e=="object")for(let t of Object.values(e))sn(t)}function Mi(e){return e&&typeof e=="object"?e:void 0}function Ci(e){let t=new URLSearchParams(new URL(e,"https://viewer.invalid/").hash.slice(1));return t.has(Ve)||t.has(ze)}function wr(e,t){let r=new URL(e,t);if(!["https:","http:"].includes(r.protocol))throw new Error("AR handoff requires an HTTP(S) URL.");return r.toString()}function ji(e,t="",r=2048){let n=new Set,o=a=>{if(typeof a=="string")return Ie(a)??a;if(a===null||typeof a!="object")return a;if(n.has(a))throw new Error("AR configuration cannot contain cycles.");n.add(a);let s=Array.isArray(a)?a.map(o):Object.fromEntries(Object.keys(a).sort().map(i=>[i,o(a[i])]));return n.delete(a),s};return JSON.stringify([t,r,o({...e,camera:void 0})])}function cn(e,t){if(JSON.stringify(e)!==JSON.stringify(t))return e&&t&&typeof e=="object"&&typeof t=="object"&&!Array.isArray(e)&&!Array.isArray(t)?Object.fromEntries(Object.entries(e).map(([r,n])=>[r,cn(n,t[r])]).filter(([,r])=>r!==void 0)):e}function ln(e,t,r=0){if(r>64)throw new Error("AR configuration is too deeply nested.");if(e&&t&&typeof e=="object"&&typeof t=="object"&&!Array.isArray(e)&&!Array.isArray(t)){let n=e,o=t;return Object.fromEntries([...new Set([...Object.keys(o),...Object.keys(n)])].map(a=>[a,Object.prototype.hasOwnProperty.call(n,a)?ln(n[a],o[a],r+1):o[a]]))}return e}function mn(e,t){let r=structuredClone(e);if(r.configuration){r.configuration.sceneConfig&&(r.configuration.sceneConfig=t(r.configuration.sceneConfig));for(let n of r.configuration.models??[])n.sceneConfig&&(n.sceneConfig=t(n.sceneConfig))}return r}function Me(e){e?.throwIfAborted()}async function vi(e,t,r,n){Me(n);let o=new URL(wr(t));if(an(o.hostname))throw new Error("Phone links need a viewer URL reachable from your phone. Download the USDZ for local uploads, or provide a public viewer URL.");let a=await nn(e,o.toString());Me(n),sn(a);let s=new URLSearchParams(o.hash.slice(1));if(s.delete(Ve),s.delete(ze),s.delete("view"),s.delete("viewId"),s.delete("view-id"),r){let i=await r.save(a);if(Me(n),typeof i!="string"||!i||i.length>512)throw new Error("AR storage returned an invalid configuration ID.");s.set(ze,i)}else{let i=hr(rn(JSON.stringify({ar:1,state:mn(a,l=>cn(l,be)??{})})),{level:9});if(i.byteLength>on)throw new Error("This configuration needs an AR storage adapter to share on a phone. The USDZ download is still available.");let c="";for(let l of i)c+=String.fromCharCode(l);s.set(Ve,btoa(c).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,""))}if(o.hash=s.toString(),o.toString().length>yr)throw new Error("This configuration is too large for a reliable QR code. Use an AR storage adapter or download the USDZ.");return o.toString()}async function ki(e,t,r){let n=new URL(e),o=new URLSearchParams(n.hash.slice(1)),a=o.get(ze),s=o.get(Ve);if(a!==null&&s!==null)throw new Error("AR link contains conflicting configurations.");if(a===null&&s===null)return null;Me(r);let i;if(a!==null){if(!t)throw new Error("This AR link requires the application's configuration storage adapter.");if(!a||a.length>512)throw new Error("Invalid AR configuration ID.");i=await t.load(a)}else{if(!s||s.length>Math.ceil(on*4/3)||!/^[\w-]+$/.test(s))throw new Error("Invalid or oversized AR link.");let l=atob(s.replace(/-/g,"+").replace(/_/g,"/")),f=Uint8Array.from(l,d=>d.charCodeAt(0)),u=br(f);if(u.byteLength>ie)throw new Error("AR configuration exceeds the 5 MiB limit.");let m=JSON.parse(gr(u));if(m?.ar===1&&m.state){let d=m.state.configuration,b=(d?.sceneConfig?1:0)+(Array.isArray(d?.models)?d.models.filter(x=>x?.sceneConfig).length:0);if(u.byteLength+b*Sr>ie)throw new Error("Expanded AR configuration exceeds the 5 MiB limit.");i=mn(m.state,x=>ln(x,be))}else i=m}Me(r);let c=Ne(i,n.toString());if(c.version!==1||!c.configuration)throw new Error("AR handoff requires a complete versioned viewer configuration.");return c}var it=new WeakMap;function Ii(e,t){t?it.set(e,t):it.delete(e)}function dn(e){e.traverse(t=>{let r=it.get(t);if(r)throw new Error(r)})}import{Box3 as _r,BufferAttribute as De,BufferGeometry as Fr,Color as qr,DoubleSide as Wr,FrontSide as Rn,Group as En,Matrix4 as Gr,Mesh as Hr,Vector3 as Le}from"three";import{PropertyBinding as at}from"three";var st=Symbol("react-immersive.model-node-id");function xr(e,t){Object.defineProperty(e,st,{value:t,configurable:!0})}function ae(e){let t=new Map;e.traverse(c=>{if(!c.name)return;let l=t.get(c.name);l?l.push(c):t.set(c.name,[c])});let r=Object.create(null),n=new WeakMap,o=new Map,a=new Set(Array.from(t,([c,l])=>l.length===1?c:null).filter(c=>c!==null)),s=new Set,i=(c,l)=>{xr(c,l),r[l]=c,n.set(c,l),s.add(l)};for(let[c,l]of t)l.length===1&&i(l[0],c);for(let[c,l]of t){if(l.length<2)continue;let f=[];l.forEach((u,m)=>{let d=`${c} [${m+1}]`,b=d,x=2;for(;a.has(b)||s.has(b);)b=`${d}.${x++}`;i(u,b),f.push(b)}),o.set(c,f)}return{nodesById:r,idByNode:n,duplicateNames:o}}function Ce(e){return e[st]??e.name??null}function Ei(e,t){let r=t.replace(/\.[^./\\]+$/,"");e.traverse(n=>{n.name&&(n.name=at.sanitizeNodeName(`${r}_${n.name}`))})}function Bi(e,t){let r=t.replace(/\.[^./\\]+$/,""),n=e.clone();for(let o of n.tracks){let s=at.parseTrackName(o.name).nodeName??"",i=at.sanitizeNodeName(`${r}_${s}`);o.name=i+o.name.slice(s.length)}return n}function un(e,t){let r=null,n=[];return e.traverse(o=>{o[st]===t&&(r=o),o.name===t&&n.push(o)}),r??(n.length===1?n[0]:null)}import{AnimationClip as Rr,Group as Er,Matrix4 as Br,Vector3 as Pr,PropertyBinding as kn}from"three";import{clone as Nr}from"three/examples/jsm/utils/SkeletonUtils.js";import{strFromU8 as Vr,strToU8 as pt,unzipSync as zr,zipSync as Dr}from"fflate";import{AnimationMixer as Ar,LoopOnce as Mr,LoopPingPong as fn,LoopRepeat as Cr}from"three";function pn(e){let t=e._loopCount;return e.loop===fn&&(t&1)===1}function jr(e){return pn(e)?e.getClip().duration-e.time:e.time}function gn({root:e,clips:t,getClipConfig:r,onChange:n}){let o=new Ar(e),a=new Map;for(let{clip:p,sourceName:v}of t)a.set(v,o.clipAction(p));let s=new Map,i=new Set,c=new Map,l=1,f=p=>typeof p=="string",u=p=>f(p)?s.has(p)?[p]:[]:[...s.keys()],m=(p,v)=>{let I=Ot(r(v));I==="once"?p.setLoop(Mr,1):I==="ping-pong"?p.setLoop(fn,1/0):p.setLoop(Cr,1/0),p.clampWhenFinished=I==="once"},d=p=>{p.action.setEffectiveTimeScale(p.reverse?-p.speed:p.speed)},b=p=>{let v=s.get(p);v&&(v.action.stop(),s.delete(p))},x=(p,v={})=>{let I=a.get(p);if(!I||r(p)?.hidden)return;let P=Number.isFinite(v.fade)&&v.fade>0?v.fade:0,B=v.reverse??!1;if(!v.alongside)for(let[T,_]of[...s])T!==p&&(P>0?(s.delete(T),_.action.fadeOut(P),i.add(_.action)):b(T));i.delete(I)&&I.stop();let y=I.getClip().duration,C=s.get(p),k=()=>{I.reset(),B&&(I.time=y),I.play()};if(!C)k(),P>0&&I.fadeIn(P);else{let T=B?I.time<=0:I.time>=y;C.finished&&T&&k(),I.paused=!1,I.enabled=!0,s.delete(p)}m(I,p),C={action:I,speed:r(p)?.speed??c.get(p)??l,reverse:B,finished:!1},C.speed=Re(C.speed),d(C),s.set(p,C),n()},h=p=>{for(let v of u(p))s.get(v).action.paused=!0;n()},w=p=>{for(let v of u(p))b(v);if(!f(p)){for(let v of i)v.stop();i.clear()}n()},M=(p,v)=>{let I=Re(p);f(v)?c.set(v,I):l=I;for(let P of u(v)){let B=s.get(P);c.set(P,I),B.speed=I,d(B)}n()},g=(p,v)=>{for(let I of u(v)){let P=s.get(I),B=P.action.getClip().duration,y=Math.min(Math.max(p,0),B);P.action.time=pn(P.action)?B-y:y,P.finished&&(P.finished=!1,P.action.paused=!0)}o.update(0),n()},A=()=>{for(let[p,v]of[...s]){let I=r(p);if(I?.hidden){b(p);continue}m(v.action,p),I?.speed!==void 0&&(v.speed=Re(I.speed),d(v))}n()},j=p=>{for(let v of s.values())v.action===p.action&&(v.finished=!0);n()};return o.addEventListener("finished",j),{play:x,pause:h,stop:w,setSpeed:M,seek:g,getState:()=>{let p=[...s].map(([I,P])=>({clip:I,status:P.finished?"finished":P.action.paused?"paused":"playing",time:jr(P.action),duration:P.action.getClip().duration,speed:P.speed,reverse:P.reverse})),v=p[p.length-1];return{currentClip:v?.clip??null,isPlaying:p.some(I=>I.status==="playing"),speed:v?.speed??l,time:v?.time??0,duration:v?.duration??0,active:p}},applyClipConfigs:A,isRunning:()=>{if(i.size>0)return!0;for(let{action:p}of s.values())if(!p.paused&&p.enabled)return!0;return!1},update:p=>{o.update(p);for(let v of i)(!v.enabled||v.getEffectiveWeight()<=0)&&(v.stop(),i.delete(v))},dispose:()=>{o.removeEventListener("finished",j),o.stopAllAction(),o.uncacheRoot(e),s.clear(),i.clear()}}}import{Color as bn}from"three";var ct=e=>e==="baseColor"?"color":e;function hn(e){let t=new Set;return e.traverse(r=>{let n=r;if(n.isMesh)for(let o of Array.isArray(n.material)?n.material:[n.material])o&&t.add(o)}),[...t]}function yn({root:e,controls:t,animations:r,invalidate:n,cameraEnabled:o=()=>!0}){let a=new Map,s=new Map,i=new Map,c=new Set,l=new Map,f=null,u="",m=g=>e()?un(e(),g):null,d=g=>{if(g.kind==="camera"){let V=t();if(!V)return null;let S=re(V.camera,V);return{position:S.position,target:S.target,fov:S.fov,zoom:S.zoom}}if(g.kind==="clip"){let V=r();return V?.clips.includes(g.clip)?V.getState?.().active.find(S=>S.clip===g.clip)?.time??0:null}let A=m(g.objectId);if(!A)return null;let j=g.property;if(j==="position"||j==="rotation"||j==="scale")return[A[j].x,A[j].y,A[j].z];if(j==="visible")return A.visible;let E=hn(A).find(V=>V[ct(j)]!==void 0),L=E?E[ct(j)]:void 0;return L?.isColor?`#${L.getHexString()}`:typeof L=="number"?L:null},b=g=>{if(!o())return;let A=t();A&&(A.stop(),A.setLookAt(...g.position,...g.target,!1),g.fov!==null&&"fov"in A.camera&&(A.camera.fov=g.fov,A.camera.updateProjectionMatrix()),A.zoomTo(g.zoom,!1),A.update(0))},x=g=>{if(a.has(g))return;g.updateWorldMatrix(!0,!0);let A=g.matrixAutoUpdate?void 0:Ct(g.matrix,g.scale,g.quaternion).shear;a.set(g,{position:g.position.toArray(),rotation:[g.rotation.x,g.rotation.y,g.rotation.z],scale:g.scale.toArray(),matrix:g.matrix.clone(),auto:g.matrixAutoUpdate,shear:A});for(let j of St(g))wt(j)||(ke(j,j.matrixWorld),c.add(j))},h=(g,A)=>{let j=r();j?.stop(g),A&&j&&(j.play(g,{alongside:!0,reverse:A.reverse}),j.setSpeed(A.speed,g),j.seek?.(A.time,g),A.status!=="playing"&&j.pause(g))};return{capture:d,restore:()=>{for(let[g,A]of l)h(g,A);l.clear();for(let[g,A]of a)g.position.fromArray(A.position),g.rotation.set(...A.rotation),g.scale.fromArray(A.scale),g.matrix.copy(A.matrix),g.matrixAutoUpdate=A.auto,g.matrixWorldNeedsUpdate=!0;a.clear(),s.forEach((g,A)=>A.visible=g),s.clear(),i.forEach((g,A)=>{g.forEach((j,E)=>{j instanceof bn?A[E].copy(j):A[E]=j}),A.needsUpdate=!0}),i.clear(),c.forEach(At),c.clear(),f&&b(f),f=null,u="",e()?.updateWorldMatrix(!0,!0),n()},inspect:g=>g.tracks.filter(A=>!A.muted&&A.keyframes.length&&(A.target.kind!=="camera"||o())&&d(A.target)===null).map(A=>`Unavailable target: ${A.name}.`),invalidate:n,apply:({sequence:g,time:A,playing:j})=>{let E=g.tracks.filter(S=>S.target.kind!=="camera"||o()).map(S=>({track:S,value:gt(S,A)})).filter(S=>S.value!==null);for(let[S,p]of l)E.some(({track:v})=>v.target.kind==="clip"&&v.target.clip===S)||(h(S,p),l.delete(S));for(let{track:S}of E)if(S.target.kind==="object"&&["position","rotation","scale"].includes(S.target.property)){let p=m(S.target.objectId);p&&x(p)}let L=new Map([...i.keys()].map(S=>[S,S.transparent]));s.forEach((S,p)=>p.visible=S),a.forEach((S,p)=>{p.position.fromArray(S.position),p.rotation.set(...S.rotation),p.scale.fromArray(S.scale),Fe(p,S.shear)}),i.forEach((S,p)=>S.forEach((v,I)=>{v instanceof bn?p[I].copy(v):p[I]=v}));let V=r();for(let{track:S,value:p}of E){if(S.target.kind!=="clip"||!V?.seek||!V.clips.includes(S.target.clip))continue;let v=S.target.clip;l.has(v)||(l.set(v,V.getState?.().active.find(I=>I.clip===v)),V.play(v,{alongside:!0}),V.pause(v)),V.seek(p,v)}for(let{track:S,value:p}of E){let v=S.target;if(v.kind==="clip")continue;if(v.kind==="camera"){f||(f=d(v));let B=JSON.stringify(p);(j||B!==u)&&(b(p),u=B);continue}let I=m(v.objectId);if(!I)continue;let P=v.property;if(P==="visible")s.has(I)||s.set(I,I.visible),I.visible=p;else if(P==="position"||P==="rotation"||P==="scale")P==="rotation"?I.rotation.set(...p):I[P].fromArray(p),Fe(I,a.get(I)?.shear);else for(let B of hn(I)){let y=ct(P),C=B[y];if(C===void 0)continue;let k=i.get(B);if(k||(k=new Map,i.set(B,k)),L.has(B)||L.set(B,B.transparent),k.has(y)||k.set(y,C?.isColor?C.clone():C),C?.isColor?C.set(p):B[y]=p,P==="opacity"){k.has("transparent")||k.set("transparent",B.transparent);let T=p<1||k.get("transparent")===!0;B.transparent=T}}}f&&!E.some(({track:S})=>S.target.kind==="camera")&&(b(f),u=""),L.forEach((S,p)=>{S!==p.transparent&&(p.needsUpdate=!0)}),e()?.updateWorldMatrix(!0,!0)}}}function Sn(e){let t=new Map;return e.map((r,n)=>{let a=r.name.trim()||`Animation ${n+1}`,s=t.get(a)??0;return t.set(a,s+1),{clip:r,sourceName:s===0?a:`${a} (${s+1})`,duration:r.duration}})}import{Box3 as lt,Group as vr,BufferAttribute as kr,Matrix4 as wn,Mesh as Or,Quaternion as Ir,Vector3 as he}from"three";function Tr(e){let t=e.getAttribute("arSourceVertex"),r=e.getAttribute("arNormalSign");if(!t)return;let n=new Map,o=[],a=[];for(let i=0;i<t.count;i++){let c=`${t.getX(i)}:${r?.getX(i)??1}`,l=n.get(c);l===void 0&&(l=o.length,o.push(i),n.set(c,l)),a.push(l)}let s=e.index?Array.from(e.index.array,i=>a[i]):a;for(let[i,c]of Object.entries(e.attributes)){let l=new Float32Array(o.length*c.itemSize);o.forEach((f,u)=>{for(let m=0;m<c.itemSize;m++)l[u*c.itemSize+m]=c.getComponent(f,m)}),e.setAttribute(i,new kr(l,c.itemSize))}e.setIndex(s)}function xn(e,t,r,n){let o=[],a=[],s=new Map;for(let i of e){let c=i.source;if(!c.isSkinnedMesh)continue;let l=t.get(c),f=c.skeleton,u=JSON.stringify(f.bones.map((S,p)=>[S.uuid,f.boneInverses[p].elements])),m=s.get(u);if(!m){let S=new Map(f.bones.map((C,k)=>[C,k])),p=f.bones.map(C=>{for(let k=C.parent;k;k=k.parent)if(S.has(k))return S.get(k);return-1}),v=[],I=C=>{v.includes(C)||(p[C]>=0&&I(p[C]),v.push(C))};f.bones.forEach((C,k)=>I(k));let P=v.map(C=>v.indexOf(p[C])),B=[];v.forEach((C,k)=>B.push(`${P[k]<0?"":B[P[k]]+"/"}J_${C}`));let y={name:`${n}_${o.length}`,joints:B,parents:P,bones:v.map(C=>t.get(f.bones[C])),bindTransforms:v.map(C=>f.boneInverses[C].clone().invert()),restTransforms:[],worlds:v.map(()=>new wn),referenceInverse:r.clone().invert(),frames:[]};if(y.bones.some(C=>!C))throw new Error("The AR skeleton has joints outside the exported scene.");m={rig:y,order:v},s.set(u,m),o.push(y)}Tr(i.exported.geometry);let d=i.exported.geometry.getAttribute("arSourceVertex"),b=c.geometry.getAttribute("skinIndex"),x=c.geometry.getAttribute("skinWeight");if(!d||!b||!x||b.itemSize!==4||x.itemSize!==4)throw new Error("AR skeletal animation needs four joint indices and weights per vertex.");let h={target:i,node:l,rig:m.rig,reference:r,geomBind:c.bindMatrix.clone(),jointIndices:[],jointWeights:[],jointBounds:m.order.map(()=>new lt),extent:new lt},w=i.exported.geometry.getAttribute("position"),M=i.exported.geometry.getAttribute("normal"),g=c.geometry.getAttribute("normal"),A=i.exported.geometry.getAttribute("arNormalSign"),j=new he,E=new he,L=new Map(m.order.map((S,p)=>[S,p])),V=h.rig.bindTransforms.map(S=>S.clone().invert().multiply(c.bindMatrix));for(let S=0;S<d.count;S++){let p=d.getX(S);if(Or.prototype.getVertexPosition.call(c,p,j),w.setXYZ(S,j.x,j.y,j.z),g&&M){E.fromBufferAttribute(g,p);let I=E.clone();c.geometry.morphAttributes.normal?.forEach((P,B)=>{let y=c.morphTargetInfluences?.[B]??0;y&&E.addScaledVector(new he().fromBufferAttribute(P,p).sub(c.geometry.morphTargetsRelative?new he:I),y)}),E.normalize().multiplyScalar(A?.getX(S)??1),M.setXYZ(S,E.x,E.y,E.z)}let v=[0,1,2,3].reduce((I,P)=>I+x.getComponent(p,P),0);if(!Number.isFinite(v)||v<=0)throw new Error("The AR skin has a vertex without valid joint weights.");for(let I=0;I<4;I++){let P=x.getComponent(p,I)/v,B=P?L.get(b.getComponent(p,I))??-1:0;if(B<0||!Number.isFinite(P)||P<0)throw new Error("The AR skin has invalid joint indices or weights.");h.jointIndices.push(B),h.jointWeights.push(P),P&&h.jointBounds[B].expandByPoint(j.clone().applyMatrix4(V[B]))}}w.needsUpdate=!0,M?M.needsUpdate=!0:i.exported.geometry.computeVertexNormals(),i.exported.geometry.computeBoundingBox(),i.exported.matrixAutoUpdate=!1,i.exported.matrix.copy(ut(h)),a.push(h)}return{rigs:o,skins:a}}function ut(e){return e.node.matrixWorld.clone().multiply(e.node.bindMatrixInverse).multiply(e.reference)}function An(e,t,r){let n=new he,o=new Ir,a=new he,s=new wn;for(let i of e){let c={time:r,translations:[],rotations:[],scales:[]};i.bones.forEach((l,f)=>i.worlds[f].multiplyMatrices(i.referenceInverse,l.matrixWorld)),i.worlds.forEach((l,f)=>{let u=i.parents[f],m=u<0?l.clone():i.worlds[u].clone().invert().multiply(l);m.decompose(n,o,a),o.normalize(),s.compose(n,o,a);let d=1e-5*Math.max(1,...m.elements.map(Math.abs));if(!m.elements.every(Number.isFinite)||m.elements.some((b,x)=>Math.abs(b-s.elements[x])>d)||Math.abs(m.determinant())<1e-15)throw new Error("The AR skeleton contains a sheared or zero-scale joint that Quick Look cannot preserve. Use arHandoff.createUSDZ for this rig.");c.translations.push(...n.toArray()),c.rotations.push(o.w,o.x,o.y,o.z),c.scales.push(...a.toArray()),i.frames.length||i.restTransforms.push(m)}),i.frames.push(c)}for(let i of t)i.jointBounds.forEach((c,l)=>{c.isEmpty()||i.extent.union(c.clone().applyMatrix4(i.rig.worlds[l]))})}var ft=e=>String(Number(e.toPrecision(9))),mt=e=>{let t=Array.isArray(e)?e:e.elements;return`(${[0,4,8,12].map(r=>`(${t.slice(r,r+4).map(ft).join(", ")})`).join(", ")})`},dt=(e,t)=>Array.from({length:e.length/t},(r,n)=>`(${e.slice(n*t,(n+1)*t).map(ft).join(", ")})`).join(", ");function Mn(e){let t=(s,i,c=1e-7)=>Math.abs(s-i)>c*Math.max(1,Math.abs(s),Math.abs(i)),r=[["translations",3,"float3"],["rotations",4,"quatf"],["scales",3,"half3"]],n=e.frames[0],o=e.joints.map((s,i)=>i).filter(s=>r.some(([i,c])=>e.frames.some(l=>l[i].slice(s*c,(s+1)*c).some((f,u)=>t(f,n[i][s*c+u])))));o.length||(o=e.joints.map((s,i)=>i));let a=r.map(([s,i,c])=>{let l=e.frames.map(u=>o.flatMap(m=>u[s].slice(m*i,(m+1)*i)));return l.some(u=>u.some((m,d)=>t(m,l[0][d],c==="half3"?1e-4:1e-7)))?`${c}[] ${s}.timeSamples = {${e.frames.map((u,m)=>`${u.time}: [${dt(l[m],i)}]`).join(`,
|
|
3
|
+
`)}}`:`${c}[] ${s} = [${dt(l[0],i)}]`}).join(`
|
|
4
|
+
`);return`#usda 1.0
|
|
5
|
+
(
|
|
6
|
+
defaultPrim = "Skeleton"
|
|
7
|
+
metersPerUnit = 1
|
|
8
|
+
upAxis = "Y"
|
|
9
|
+
timeCodesPerSecond = 30
|
|
10
|
+
framesPerSecond = 30
|
|
11
|
+
)
|
|
12
|
+
def Skeleton "Skeleton" (prepend apiSchemas = ["SkelBindingAPI"]) {
|
|
13
|
+
uniform token[] joints = ${JSON.stringify(e.joints)}
|
|
14
|
+
uniform matrix4d[] bindTransforms = [${e.bindTransforms.map(mt).join(", ")}]
|
|
15
|
+
uniform matrix4d[] restTransforms = [${e.restTransforms.map(mt).join(", ")}]
|
|
16
|
+
rel skel:animationSource = <Animation>
|
|
17
|
+
def SkelAnimation "Animation" {
|
|
18
|
+
uniform token[] joints = ${JSON.stringify(o.map(s=>e.joints[s]))}
|
|
19
|
+
${a}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
`}function Cn(e,t){let r=new Map;for(let n of e){let o=n.target.exported,a=t.get(o.name),s=l=>Math.round(l*1e7)/1e7,i=JSON.stringify([n.rig.name,a?.map(l=>l.matrix.map(s))??o.matrix.elements.map(s)]),c=r.get(i);if(!c){let l=new vr;l.name=`AR_Rig_${r.size}`,l.matrixAutoUpdate=!1,l.matrix.copy(o.matrix),o.parent.add(l),c={node:l,rig:n.rig,skins:[],extent:new lt},r.set(i,c),a&&t.set(l.name,a)}c.node.add(o),o.matrix.identity(),t.delete(o.name),c.skins.push(n),c.extent.union(n.extent)}return[...r.values()]}function jn(e){return`
|
|
23
|
+
rel skel:skeleton = <Skeleton>
|
|
24
|
+
rel skel:animationSource = <Skeleton/Animation>
|
|
25
|
+
float3[] extent = [${dt([...e.extent.min.toArray(),...e.extent.max.toArray()],3)}]
|
|
26
|
+
def Skeleton "Skeleton" (prepend references = @./rigs/${e.rig.name}.usda@</Skeleton>) {}
|
|
27
|
+
`}function vn(e){return`
|
|
28
|
+
over "Geometry" (prepend apiSchemas = ["SkelBindingAPI"]) {
|
|
29
|
+
rel skel:skeleton = <../../Skeleton>
|
|
30
|
+
uniform token[] skel:joints = ${JSON.stringify(e.rig.joints)}
|
|
31
|
+
uniform token primvars:skel:skinningMethod = "classicLinear"
|
|
32
|
+
matrix4d primvars:skel:geomBindTransform = ${mt(e.geomBind)}
|
|
33
|
+
int[] primvars:skel:jointIndices = [${e.jointIndices.join(", ")}] (
|
|
34
|
+
interpolation = "vertex"
|
|
35
|
+
elementSize = 4
|
|
36
|
+
)
|
|
37
|
+
float[] primvars:skel:jointWeights = [${e.jointWeights.map(ft).join(", ")}] (
|
|
38
|
+
interpolation = "vertex"
|
|
39
|
+
elementSize = 4
|
|
40
|
+
)
|
|
41
|
+
}
|
|
42
|
+
`}var se=30,Lr=12e4,$r=1e6,On=new Set(["position","quaternion","rotation","scale"]);function Ur(e){let t=ve(e.sceneConfig?.sequences??[]).find(l=>l.autoPlay),r=e.sceneConfig?.animations.autoplayClip,n=Sn(e.scene.animations),o=n.find(l=>l.sourceName===r),a=e.sceneConfig?.animations.clips.find(l=>l.sourceName===r),s=a?.speed??1,i=Number.isFinite(s)&&s>0?s:1,c=o&&!a?.hidden?o.duration*(a?.loopMode==="ping-pong"?2:1)/i:0;return{sequence:t,autoplay:r,clips:n,duration:Math.max(c,t?.duration??0)}}function In(e,t,r){let n=new Set,o=new Map,a=0,s=0,i=0,c=[],l=[],f=e.map(Ur),u=Math.max(0,...f.map(m=>m.duration));for(let[m,d]of e.entries()){r?.throwIfAborted();let{sequence:b,autoplay:x}=f[m];if(!b&&!x)continue;let h=Nr(d.scene),w=[],M=[];d.scene.traverse(O=>w.push(O)),h.traverse(O=>M.push(O));let g=new Map;w.forEach((O,U)=>{M[U].uuid=O.uuid,g.set(O,M[U]);let N=Oe(O);N&&O.isSkinnedMesh&&(delete M[U].userData.reactImmersiveSkinFreeze,ke(M[U],N.clone().invert(),xt(O)??void 0))});let A=ae(h),j=new Er;j.matrixAutoUpdate=!1,j.matrix.copy(d.scene.parent?.matrixWorld??new Br),j.add(h),j.updateMatrixWorld(!0);let E=t.filter(O=>O.sourceIndex===m),L=E.some(O=>O.source.isSkinnedMesh),V=new Set(b?.tracks.filter(O=>!O.muted&&O.target.kind==="clip").map(O=>O.target.kind==="clip"?O.target.clip:"")??[]);x&&V.add(x);let S=f[m].clips.map(O=>{if(!V.has(O.sourceName))return O;let U=O.clip.tracks.filter(N=>{let $=kn.parseTrackName(N.name),Z=kn.findNode(h,$.nodeName),te=!!Z&&On.has($.propertyName)&&(Z?.type!=="Bone"||L)&&!$.objectName;return te||n.add(Z?.type==="Bone"?"Skeletal tracks without an exported skinned mesh are omitted.":"Quick Look exports object and skeletal motion. Morph and other unsupported clip tracks keep their captured pose."),te});return{...O,clip:new Rr(O.clip.name,O.duration,U)}}),p=O=>d.sceneConfig?.animations.clips.find(U=>U.sourceName===O),v=gn({root:h,clips:S,getClipConfig:p,onChange(){}}),I={...v,clips:S.map(O=>O.sourceName)},P=yn({root:()=>h,controls:()=>null,animations:()=>I,invalidate(){},cameraEnabled:()=>!1}),B=b?.tracks.filter(O=>{if(!L&&O.target.kind==="object"&&A.nodesById[O.target.objectId]?.type==="Bone")return O.muted||n.add("Quick Look keeps skeletal deformation at its captured pose."),!1;let U=O.target.kind==="clip"||O.target.kind==="object"&&On.has(O.target.property);return!U&&!O.muted&&n.add("Quick Look exports sequence object motion. Camera, visibility and appearance tracks stay in WebXR."),U}),y=b?{...b,tracks:B??[]}:void 0;y&&P.inspect(y).forEach(O=>n.add(O));let C=S.some(O=>V.has(O.sourceName)&&O.clip.tracks.length&&!p(O.sourceName)?.hidden),k=B?.some(O=>!O.muted&&O.keyframes.length&&O.target.kind==="object");if(!C&&!k){v.dispose();continue}let T=xn(E,g,j.matrix,`Skin_${m}`),_=new Map(T.skins.map(O=>[O.target,O])),H=u,K=Math.ceil(H*se);if(s+=(K+1)*E.length,i+=(K+1)*T.rigs.reduce((O,U)=>O+U.joints.length,0),!Number.isFinite(H)||s>Lr||i>$r)throw v.dispose(),new Error("This animation is too large for browser USDZ conversion. Use arHandoff.createUSDZ for this model.");let X=Object.entries(d.objectBindings??{}).flatMap(([O,U])=>{if(!U.transform)return[];let N=A.nodesById[U.modelObjectId??O];return N?[{node:N,matrix:N.matrix.clone(),position:N.position.clone(),quaternion:N.quaternion.clone(),scale:N.scale.clone()}]:[]}),J=E.map(O=>({target:O,node:g.get(O.source),inverse:O.bakedMatrix.clone().invert(),frames:[]}));try{x&&v.play(x);let O=0;for(let U=0;U<=K;U++){r?.throwIfAborted();let N=Math.min(U/se,H);v.update(N-O),O=N;for(let $ of X)$.node.position.copy($.position),$.node.quaternion.copy($.quaternion),$.node.scale.copy($.scale),$.node.matrix.copy($.matrix);if(y){let $=y.loop&&N>y.duration?N%y.duration:Math.min(N,y.duration);P.apply({sequence:y,time:$,playing:!1})}j.updateMatrixWorld(!0),An(T.rigs,T.skins,N*se);for(let $ of J){let Z=_.get($.target),te=Z?ut(Z):$.node.matrixWorld.clone().multiply($.target.instanceMatrix).multiply($.inverse);if(!te.elements.every(Number.isFinite)||te.determinant()<=0)throw new Error("Quick Look animation cannot preserve a reflected or zero-scale transform. Use arHandoff.createUSDZ.");$.frames.push({time:N*se,matrix:te.toArray()})}}for(let U of J){let N=U.frames[0]?.matrix;N&&U.frames.some($=>$.matrix.some((Z,te)=>Math.abs(Z-N[te])>1e-8))&&(o.set(U.target.exported.name,U.frames),a=Math.max(a,H))}if(T.skins.length){for(let U of T.skins)U.extent.expandByScalar(Math.max(1e-6,U.extent.getSize(new Pr).length()*.001));c.push(...T.rigs),l.push(...T.skins),a=Math.max(a,H)}}finally{P.restore(),v.dispose()}}return{samples:o,rigs:c,skins:l,duration:a,warnings:[...n]}}function Tn(e,t,r){if(!t.samples.size&&!t.skins.length)return e;let n=zr(e),o=Vr(n["model.usda"]);o=o.replace(" metersPerUnit = 1",` startTimeCode = 0
|
|
43
|
+
endTimeCode = ${t.duration*se}
|
|
44
|
+
timeCodesPerSecond = ${se}
|
|
45
|
+
framesPerSecond = ${se}
|
|
46
|
+
autoPlay = true
|
|
47
|
+
metersPerUnit = 1`);for(let[i,c]of t.samples){let l=new RegExp(`(def Xform "${i}"[\\s\\S]*?\\n[\\t ]*)matrix4d xformOp:transform = [^\\n]+`);if(!l.test(o))throw new Error("The USDZ exporter produced an unsupported animation layout.");let f=c.map(u=>{let m=[0,4,8,12].map(d=>`(${u.matrix.slice(d,d+4).join(", ")})`);return`${u.time}: (${m.join(", ")})`}).join(`,
|
|
48
|
+
`);o=o.replace(l,(u,m)=>`${m}matrix4d xformOp:transform.timeSamples = {
|
|
49
|
+
${f}
|
|
50
|
+
}`)}for(let i of t.rigs)n[`rigs/${i.name}.usda`]=pt(Mn(i));for(let i of r){let c=new RegExp(`def Xform "${i.node.name}"(\\s*\\{)`);if(!c.test(o))throw new Error("The USDZ exporter produced an unsupported skeleton root layout.");o=o.replace(c,`def SkelRoot "${i.node.name}" (prepend apiSchemas = ["SkelBindingAPI"]) $1${jn(i)}`)}for(let i of t.skins){let c=new RegExp(`def Xform "${i.target.exported.name}"(\\s*\\([\\s\\S]*?\\)\\s*\\{)`);if(!c.test(o))throw new Error("The USDZ exporter produced an unsupported skeleton layout.");o=o.replace(c,(l,f)=>`def Xform "${i.target.exported.name}"${f}${vn(i)}`)}n["model.usda"]=pt(o);let a={},s=0;for(let[i,c]of Object.entries(n)){s+=34+pt(i).length;let l=s&63;a[i]=l===4?c:[c,{extra:{12345:new Uint8Array(64-l)}}],s=c.length}return Dr(a,{level:0})}function Xr(e,t={}){t.signal?.throwIfAborted();let r=new En,n=new En;r.add(n);let o=new Set,a=[],s=[],i=[],c=new Map,l=new Map,f=[],u=0,m=0,d=()=>{a.forEach(x=>x.dispose()),s.forEach(x=>x.dispose()),i.forEach(x=>x.dispose())},b=(x,h,w)=>{let M=l.get(x);M||(M=new Map,l.set(x,M));let g=w?`${w.r},${w.g},${w.b}`:"",A=M.get(g);if(A)return A;let j=x.clone();s.push(j),j.side=Rn;let E=x.userData.reactImmersiveConfiguredEmissive;E?.isColor&&j.emissive.copy(E),w&&j.color.multiply(w);for(let[L,V]of Object.entries(j)){if(!V?.isTexture)continue;let S=V;if(jt(S)||!S.image||S.image.complete===!1)throw new Error(`Texture on ${h} is not ready. Wait for image loading or replace failed textures before preparing AR.`);let p=c.get(S);p||(p=S.clone(),c.set(S,p),i.push(p)),j[L]=p}return M.set(g,j),j};try{for(let[g,{scene:A,objectBindings:j={},materialOverrides:E={}}]of e.entries()){dn(A),A.updateWorldMatrix(!0,!0);let L=new Map(Object.entries(j).map(([V,S])=>[S.modelObjectId??V,V]));A.traverse(V=>{let S=V;if(!S.isMesh||!S.geometry)return;for(let y=V;y;y=y.parent){let C=Ce(y)??y.name??y.uuid;if(!y.visible||j[L.get(C)??C]?.visible===!1||j[L.get(C)??C]?.removed)return}let p=Ce(S)??S.name??S.uuid,v=E[L.get(p)??p]??S.material;if(!v)throw new Error(`Material for ${p} is not ready. Wait for the model to finish loading.`);let I=Array.isArray(v)?v:[v],P=S.isInstancedMesh?S.count:1;if(S.userData.riDecal&&ye(S)&&S.parent){let y=Oe(S.parent);y&&S.bindMatrixInverse.copy(y)}let B=ye(S)?Mt(S):S.geometry.clone();try{if(!ye(S)&&S.morphTargetInfluences?.some(k=>k!==0)){let k=B.getAttribute("position"),T=new Le;for(let _=0;_<k.count;_++)S.getVertexPosition(_,T),k.setXYZ(_,T.x,T.y,T.z);B.morphAttributes={},B.computeVertexNormals()}if(!B.getAttribute("position"))throw new Error(`Mesh ${p} has no positions.`);let y=B.index?.count??B.getAttribute("position").count,C=Array.isArray(v)?B.groups:[{start:0,count:y,materialIndex:0}];if(!C.length)throw new Error(`Mesh ${p} has multiple materials without geometry groups.`);for(let k=0;k<P;k++){let T=S.matrixWorld.clone(),_=new Gr;S.isInstancedMesh&&(S.getMatrixAt(k,_),T.multiply(_));let H=S.isInstancedMesh&&S.instanceColor?new qr:void 0;H&&S.getColorAt(k,H);for(let K of C){let X=I[K.materialIndex??0];if(!X)throw new Error(`A material group on ${p} is missing its material.`);if(!X.visible)continue;let J=X;if(!J.isMeshStandardMaterial||J.wireframe||J.vertexColors)throw new Error(`AR snapshot cannot preserve ${X.type}${J.wireframe?" wireframe":J.vertexColors?" vertex colors":""} on ${p}. Use a PBR material or provide arHandoff.createUSDZ.`);let O=Math.max(K.start,B.drawRange.start),U=Math.min(y,K.start+K.count,B.drawRange.start+B.drawRange.count);if(U<=O)continue;if(O%3||(U-O)%3)throw new Error(`Mesh ${p} has an incomplete triangle range.`);let N=new Fr;a.push(N);let $=Array.from({length:U-O},(D,F)=>B.index?B.index.getX(O+F):O+F);if(T.determinant()<0)for(let D=0;D<$.length;D+=3)[$[D+1],$[D+2]]=[$[D+2],$[D+1]];let Z=B.getAttribute("normal")?[...new Set($)]:$,te=new Map(Z.map((D,F)=>[D,F])),le=Z===$?$.map((D,F)=>F):$.map(D=>te.get(D));for(let[D,F]of Object.entries(B.attributes)){let G=new Float32Array(Z.length*F.itemSize);for(let z=0;z<Z.length;z++)for(let ne=0;ne<F.itemSize;ne++)G[z*F.itemSize+ne]=F.getComponent(Z[z],ne);N.setAttribute(D,new De(G,F.itemSize))}ye(S)&&(N.setAttribute("arSourceVertex",new De(new Float32Array(Z),1)),N.setAttribute("arNormalSign",new De(new Float32Array(Z.length).fill(1),1))),N.setIndex(le),N.applyMatrix4(T);let je=N.getAttribute("position");for(let D=0;D<je.count;D++)if(![je.getX(D),je.getY(D),je.getZ(D)].every(Number.isFinite))throw new Error(`Mesh ${p} contains invalid coordinates.`);N.getAttribute("normal")||N.computeVertexNormals();let me=b(J,p,H);if(J.side===Wr){let D=N.getAttribute("position").count;for(let[G,z]of Object.entries(N.attributes)){let ne=new Float32Array(D*z.itemSize*2);for(let de=0;de<D;de++)for(let ue=0;ue<z.itemSize;ue++)ne[de*z.itemSize+ue]=z.getComponent(de,ue),ne[(D+de)*z.itemSize+ue]=z.getComponent(de,ue)*(G==="normal"||G==="arNormalSign"?-1:1);N.setAttribute(G,new De(ne,z.itemSize))}let F=[];for(let G=0;G<le.length;G+=3)F.push(le[G+2]+D,le[G+1]+D,le[G]+D);N.setIndex(le.concat(F))}else if(J.side!==Rn){let D=N.getIndex();for(let z=0;z<D.count;z+=3){let ne=D.getX(z+1);D.setX(z+1,D.getX(z+2)),D.setX(z+2,ne)}let F=N.getAttribute("normal");for(let z=0;z<F.count;z++)F.setXYZ(z,-F.getX(z),-F.getY(z),-F.getZ(z));let G=N.getAttribute("arNormalSign");if(G)for(let z=0;z<G.count;z++)G.setX(z,-G.getX(z))}for(let D of Object.values(me)){if(!D?.isTexture)continue;let F=D;if(!N.getAttribute(F.channel?`uv${F.channel}`:"uv"))throw new Error(`Texture on ${p} needs UV coordinates missing from this geometry.`)}if(S.userData.riDecal){N.computeBoundingBox();let D=Math.max(1e-6,N.boundingBox.getSize(new Le).length()*1e-4),F=N.getAttribute("position"),G=N.getAttribute("normal");for(let z=0;z<F.count;z++)F.setXYZ(z,F.getX(z)+G.getX(z)*D,F.getY(z)+G.getY(z)*D,F.getZ(z)+G.getZ(z)*D)}let _e=new Hr(N,me);_e.name=`AR_${u++}`,n.add(_e),f.push({sourceIndex:g,source:S,exported:_e,bakedMatrix:T.clone(),instanceMatrix:_}),m+=(N.index?.count??N.getAttribute("position").count)/3,(me.clearcoat||me.transmission||me.iridescence||me.anisotropy)&&o.add("Advanced PBR effects may look different in Quick Look.")}}}finally{B.dispose()}})}if(!u||!m)throw new Error("There is no visible model geometry to send to AR.");let x=new _r().setFromObject(n),h=x.getSize(new Le),w=x.getCenter(new Le),M=t.scaleMode==="real-world"?1:1/Math.max(h.x,h.y,h.z,1e-9);return n.position.set(-w.x*M,-x.min.y*M,-w.z*M),n.scale.setScalar(M),r.updateMatrixWorld(!0),o.add("Viewer lighting, background, post-processing, annotations and measurement overlays stay in the web viewer."),{root:r,meshCount:u,triangleCount:m,scale:M,warnings:[...o],textures:i,motionMeshes:f,dispose:d}}catch(x){throw d(),x}}async function ya(e,t={}){let r=t.maxTextureSize??2048;if(!Number.isInteger(r)||r<256||r>4096)throw new Error("AR maxTextureSize must be an integer from 256 to 4096.");let n=Xr(e,t),o=[];try{let a=In(e,n.motionMeshes,t.signal),s=Cn(a.skins,a.samples);n.root.updateMatrixWorld(!0);let{USDZExporter:i}=await import("three/examples/jsm/exporters/USDZExporter.js");t.signal?.throwIfAborted();for(let f of n.textures){if(!f.isCompressedTexture)continue;let{decompress:u}=await import("three/examples/jsm/utils/WebGLTextureUtils.js"),m=u(f,r);o.push(m),n.root.traverse(d=>{let b=d.material;if(b)for(let x of Object.keys(b))b[x]===f&&(b[x]=m)})}let c=await new i().parseAsync(n.root,{onlyVisible:!0,quickLookCompatible:!0,maxTextureSize:r});t.signal?.throwIfAborted();let l=Tn(c,a,s);return{blob:new Blob([new Uint8Array(l)],{type:"model/vnd.usdz+zip"}),meshCount:n.meshCount,triangleCount:n.triangleCount,scale:n.scale,warnings:[...n.warnings,...a.warnings]}}catch(a){if(t.signal?.aborted)throw a;let s=a instanceof Error&&a.name==="SecurityError"?" Textures must allow cross-origin canvas access.":"";throw new Error(`Could not prepare the configured USDZ: ${a instanceof Error?a.message:"export failed"}${s}`)}finally{n.dispose(),o.forEach(a=>a.dispose())}}var $e=Object.freeze([{id:"change-color",label:"Change Color",handling:"viewer",description:"Opens a color picker docked under the action and commits the result to style.material.baseColor."},{id:"change-material",label:"Change Material",handling:"viewer",description:"Opens the material picker so the viewer can swap the object's texture."},{id:"add-text",label:"Add Text",handling:"viewer",description:"Opens a text box docked under the action; the viewer's user types, clicks the object to place it, and can resize, turn, move, or remove it. Saved to the binding's decals."},{id:"add-image",label:"Add Image",handling:"viewer",description:"Lets the viewer's user choose an image, click the object to place it, and resize, turn, move, or remove it. Saved to the binding's decals."},{id:"toggle-visibility",label:"Toggle Visibility",handling:"viewer",description:"Flips the binding's visible flag."},{id:"toggle-light",label:"Toggle Light",handling:"viewer",description:"Turns the scene lights attached to this object on or off, or the object's own glow when none is attached."},{id:"change-light-color",label:"Change Light Color",handling:"viewer",description:"Opens a color picker docked under the action for the scene lights attached to this object, or the object's own glow."},{id:"set-brightness",label:"Set Brightness",handling:"viewer",description:"Opens a brightness slider docked under the action for the scene lights attached to this object, or the object's own glow."}]),wa="__custom__";function Kr(e){return $e.find(t=>t.id===e)}var Pn=$e.filter(e=>e.handling==="viewer").map(e=>e.id),Zr=new Set(["","New Action",...$e.map(e=>e.label)]);function xa(e){return Zr.has(e.trim())}function Bn(e,t){let r=Array.from({length:t.length+1},(n,o)=>o);for(let n=1;n<=e.length;n+=1){let o=[n];for(let a=1;a<=t.length;a+=1){let s=r[a-1]+(e[n-1]===t[a-1]?0:1);o[a]=Math.min(o[a-1]+1,r[a]+1,s)}r=o}return r[t.length]}function Aa(e){if(Kr(e))return null;let t=e.trim().toLowerCase();if(!t)return null;let r=t.replace(/[^a-z0-9]/g,""),n=null;for(let o of $e){let a=Math.min(Bn(t,o.id),Bn(r,o.id.replace(/[^a-z0-9]/g,"")));(!n||a<n.distance)&&(n={id:o.id,distance:a})}return n&&n.distance<=2?n.id:null}var Yr=.12,Nn=new Set;function Jr(e,t){return t?new Set(Te(e,t.target)):Nn}function ja(e,t){let r=Jr(e.bindings,t);if(!t||r.size===0)return{...e,setAside:Nn};let n=Math.min(Math.max(t.ghostOpacity??Yr,0),1),o={...e.bindings},a=new WeakMap,s=new Set;for(let[i,c]of Object.entries(e.bindings)){if(r.has(i))continue;s.add(i);let l=t.mode==="hide"?{...c,visible:!1}:{...c,style:{...c.style,material:{...c.style?.material,opacity:Math.min(c.style?.material?.opacity??1,n)}}};o[i]=l,a.set(l,e.sourceOf(c))}return{bindings:o,pulses:e.pulses,sourceOf:i=>a.get(i)??e.sourceOf(i),setAside:s}}function Qr(e){return e.trim().replace(/([a-z0-9])([A-Z])/g,"$1-$2").replace(/[_\s]+/g,"-").replace(/[^a-zA-Z0-9-]/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"").toLowerCase()}function eo(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/[_-]+/g," ").replace(/\s+/g," ").trim().replace(/\b\w/g,t=>t.toUpperCase())}function to(e){let t=e.toLowerCase();return t.includes("light")?"light":t.includes("wheel")||t.includes("rim")||t.includes("tire")?"wheel":t.includes("glass")||t.includes("window")||t.includes("windshield")||t.includes("sunroof")?"glass":t.includes("seat")||t.includes("dashboard")||t.includes("console")||t.includes("doorpanel")?"interior":t.includes("floor")?"floor":t.includes("wall")?"wall":t.includes("door")?"door":t.includes("chair")||t.includes("table")||t.includes("sofa")||t.includes("bed")?"furniture":"other"}function Vn(e,t=!0){return e==="light"||e.endsWith("light")?[{id:"toggle-light",label:"Toggle Light",type:"command"},{id:"change-light-color",label:"Change Light Color",type:"command"},{id:"set-brightness",label:"Set Brightness",type:"command"}]:[{id:"change-color",label:"Change Color",type:"command"},...t?[{id:"change-material",label:"Change Material",type:"command"}]:[],{id:"toggle-visibility",label:"Toggle Visibility",type:"command"}]}function zn(e,t=!0){let r=to(e);return{id:Qr(e),modelObjectId:e,type:r,label:eo(e),status:"normal",selectable:!0,hoverable:!0,visible:!0,style:{},actions:Vn(r,t),metrics:{},metadata:{}}}function Ta(e,t){return Object.fromEntries(e.map(r=>[r,zn(r,!t?.has(r))]))}function Ra(e,t){let r=new Set,n={};for(let o of e){let a=zn(o,!t?.has(o)),s=a.id||"object",i=s;for(let l=2;r.has(i);l++)i=`${s}-${l}`;r.add(i),a.id=i;let c=(a.actions??[]).filter(l=>Pn.includes(l.id));a.actions=c.length>0?c:Vn("other",!t?.has(o)),n[o]=a}return n}function Ea(e){let t=new Set;for(let[r,n]of Object.entries(ae(e).nodesById))kt(n)||t.add(r);return t}function Ba(e){let{nodesById:t}=ae(e),r=[];for(let[n,o]of Object.entries(t)){let a=o;a.isMesh&&a.geometry&&o.name&&r.push(n)}return r.sort((n,o)=>n.localeCompare(o))}var $n={id:"identity",modelObjectId:"identity",label:"identity",type:"identity",group:"identity",tags:"identity",style:"appearance",decals:"appearance",transform:"transform",visible:"visibility",removed:"visibility",status:"visibility",selectable:"behavior",hoverable:"behavior",actions:"behavior",cameraState:"behavior",metadata:"data",metrics:"data"},no=Object.keys($n),ro=new Set(["__proto__","prototype","constructor"]);function ce(e,t=new Set){if(e==null||typeof e=="string"||typeof e=="boolean")return e;if(typeof e=="number"){if(!Number.isFinite(e))throw new Error("Comparison values must be finite JSON data");return e}if(typeof e!="object"||t.has(e))throw new Error("Comparison values must be acyclic JSON data");t.add(e);let r=Array.isArray(e)?e.map(n=>ce(n,t)):Object.fromEntries(Object.entries(e).filter(([n,o])=>!ro.has(n)&&o!==void 0).map(([n,o])=>[n,ce(o,t)]));return t.delete(e),r}var Dn=e=>e&&typeof e=="object"&&!Array.isArray(e)&&!Object.keys(e).length;function Ln(e,t){let r=ce(e);r.visible=e.visible??!0,r.selectable=e.selectable??!0,r.hoverable=e.hoverable??!0,r.status=e.status??"normal",r.type=e.type??"other",r.tags=[...new Set(e.tags??[])].sort(),Dn(r.transform)&&delete r.transform,r.metadata=Object.fromEntries(Object.entries(e.metadata??{}).filter(([n])=>!t.includes(n)));for(let n of["metrics","style","metadata"])Dn(r[n])&&delete r[n];for(let n of["actions","decals"])Array.isArray(r[n])&&!r[n].length&&delete r[n];return r}function Ue(e,t,r,n,o,a){let s=c=>c===void 0||Array.isArray(c)&&c.length===0;if(Object.is(e,t)||s(e)&&s(t)||typeof e=="number"&&typeof t=="number"&&Math.abs(e-t)<=o)return;let i=c=>!!c&&typeof c=="object"&&!Array.isArray(c);if(i(e)&&i(t)){for(let c of[...new Set([...Object.keys(e),...Object.keys(t)])].sort())Ue(e[c],t[c],`${r}.${c}`,n,o,a);return}if(Array.isArray(e)&&Array.isArray(t)&&e.length===t.length){for(let c=0;c<e.length;c++)Ue(e[c],t[c],`${r}[${c}]`,n,o,a);return}a.push({path:r,category:n,...e!==void 0?{before:ce(e)}:{},...t!==void 0?{after:ce(t)}:{}})}function Na(e,t,r={}){let n=r.tolerance??1e-6;if(!Number.isFinite(n)||n<0)throw new Error("Comparison tolerance must be finite and nonnegative");let o=Object.entries(e.objectBindings).filter(([,w])=>!w.removed),a=Object.entries(t.objectBindings).filter(([,w])=>!w.removed),s=new Map(o),i=new Map(a),c=new Set,l=new Set,f=[],u=w=>{let M=r.matchBy??"modelObjectId",g=typeof M=="object"?w.metadata?.[M.metadataKey]:w[M];return typeof g=="string"&&g.length>0||typeof g=="number"?`${typeof g}:${g}`:null};function m(w,M,g){let A=w===void 0?void 0:s.get(w),j=M===void 0?void 0:i.get(M),E=[];if(A||j){let V=A?Ln(A,r.ignoreMetadataKeys??[]):{},S=j?Ln(j,r.ignoreMetadataKeys??[]):{};for(let p of no)Ue(V[p],S[p],p,$n[p],n,E)}let L=A?j?E.length?"modified":"unchanged":"removed":"added";f.push({id:JSON.stringify([w??null,M??null]),identity:g,label:j?.label??A?.label??j?.modelObjectId??A?.modelObjectId??g,status:L,beforeKey:w,afterKey:M,beforeObjectId:A?.modelObjectId,afterObjectId:j?.modelObjectId,changes:E}),w!==void 0&&c.add(w),M!==void 0&&l.add(M)}let d=new Set;for(let[w,M]of Object.entries(r.mapping??{})){if(!s.has(w)||!i.has(M)||d.has(M))throw new Error("Comparison mapping must reference existing, unique binding keys");d.add(M),m(w,M,`mapped:${w}`)}let b=new Map;for(let[w,M,g]of[[o,c,"a"],[a,l,"b"]])for(let[A,j]of w){if(M.has(A))continue;let E=u(j);if(E===null){f.push({id:JSON.stringify([g,A]),identity:"",label:j.label??j.modelObjectId,status:"ambiguous",...g==="a"?{beforeKey:A,beforeObjectId:j.modelObjectId}:{afterKey:A,afterObjectId:j.modelObjectId},changes:[],message:"Missing match identity. Supply an explicit mapping or another match field."});continue}let L=b.get(E)??{a:[],b:[]};L[g].push(A),b.set(E,L)}for(let[w,M]of b){if(M.a.length<=1&&M.b.length<=1){m(M.a[0],M.b[0],w);continue}for(let g of["a","b"])for(let A of M[g]){let j=(g==="a"?s:i).get(A);f.push({id:JSON.stringify([g,A]),identity:w,label:j.label??j.modelObjectId,status:"ambiguous",...g==="a"?{beforeKey:A,beforeObjectId:j.modelObjectId}:{afterKey:A,afterObjectId:j.modelObjectId},changes:[],message:"Duplicate match identity. Supply an explicit one-to-one mapping."})}}f.sort((w,M)=>w.label.localeCompare(M.label)||w.id.localeCompare(M.id));let x=[];Ue(ce(e.sceneConfig??{}),ce(t.sceneConfig??{}),"sceneConfig","scene",n,x);let h={added:0,removed:0,modified:0,unchanged:0,ambiguous:0};for(let w of f)h[w.status]++;return{version:1,objects:f,counts:h,sceneChanges:x}}function Va(e,t,r){let n={added:"#22c55e",removed:"#f87171",modified:"#fbbf24",unchanged:"#94a3b8",ambiguous:"#c084fc"};return e.objects.flatMap(o=>{let a=t==="before"?o.beforeObjectId:o.afterObjectId;return a&&(o.status!=="unchanged"||o.id===r)?[{objectId:a,color:o.id===r?"#22d3ee":n[o.status]}]:[]})}var Da=["front","back","double"],La=["normal","additive"];function _a(e){ae(e);let t=[],r=[{node:e,path:"0",parentId:null}];for(;r.length;){let{node:o,path:a,parentId:s}=r.pop(),i=`node:${a}`,c=o.isMesh&&o.name?Ce(o):null;t.push({id:i,parentId:s,name:o.name||o.type||"Group",...c?{objectId:c}:{}});for(let l=o.children.length-1;l>=0;l--)r.push({node:o.children[l],path:`${a}/${l}`,parentId:i})}let n=new Set;for(let o=t.length-1;o>=0;o--){let a=t[o];(a.objectId||n.has(a.id))&&(n.add(a.id),a.parentId&&n.add(a.parentId))}return t.filter(o=>n.has(o.id))}function Wa(e){return structuredClone(e.style??{})}function Ga(e,t,r){let n=Te(e,t).filter(a=>!e[a].removed);if(!n.length)return e;let o={...e};for(let a of n)o[a]={...e[a],style:structuredClone(r)};return o}export{ae as a,Ce as b,Ei as c,Bi as d,un as e,oo as f,qe as g,so as h,oe as i,lo as j,uo as k,Rt as l,bo as m,Pt as n,re as o,Oo as p,yn as q,To as r,Ro as s,Eo as t,Bo as u,Po as v,No as w,Vo as x,Je as y,be as z,Se as A,Lo as B,$o as C,Uo as D,qo as E,Qe as F,we as G,Wo as H,Go as I,Ho as J,Xo as K,Ut as L,_t as M,Ft as N,tt as O,Yo as P,Jo as Q,Qo as R,ei as S,ar as T,rt as U,cr as V,ri as W,oi as X,Ht as Y,lr as Z,xe as _,ii as $,ai as aa,Xt as ba,ie as ca,hi as da,Ne as ea,nn as fa,Mi as ga,Ci as ha,wr as ia,ji as ja,vi as ka,ki as la,Ii as ma,dn as na,gn as oa,Sn as pa,ya as qa,$e as ra,wa as sa,Kr as ta,Pn as ua,xa as va,Aa as wa,Jr as xa,ja as ya,to as za,zn as Aa,Ta as Ba,Ra as Ca,Ea as Da,Ba as Ea,Na as Fa,Va as Ga,Da as Ha,La as Ia,_a as Ja,Wa as Ka,Ga as La};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{a as B,l as N,o as A,p as O}from"./chunk-UHRJ2RBF.mjs";import{f as L,g as k,h as u,i as W,j as X,k as Y,l as F,m as H,n as D}from"./chunk-UCD76KQ6.mjs";import{useCallback as E,useEffect as Z,useRef as I}from"react";import{Matrix4 as G,Triangle as _,Vector3 as S}from"three";var q=500,J=10,$=5;function ae(e,n,t){let s=I({resolve:e,onContextMenu:n,anchorOf:t});s.current={resolve:e,onContextMenu:n,anchorOf:t};let o=I(null),r=I(!1),p=I(null),c=E(()=>{let a=o.current;a?.timer&&clearTimeout(a.timer),o.current=null,p.current?.(),p.current=null},[]),l=E(()=>{let a=o.current;a&&(c(),a.kind==="touch"&&(r.current=!0,setTimeout(()=>r.current=!1,800)),s.current.onContextMenu?.(a.target,a.pointer))},[c]),f=E(a=>{let b=a.nativeEvent,T=b.pointerType!=="touch"&&b.button===2,x=b.pointerType==="touch"&&b.button===0;if(!s.current.onContextMenu||!T&&!x)return;let v=s.current.resolve(a.object);if(v===null)return;c();let d={target:v,kind:T?"right":"touch",pointerId:b.pointerId,pointer:ne(a,s.current.anchorOf?.(a.object)),timer:x?setTimeout(l,q):null};o.current=d;let j=T?$:J,P=i=>Math.hypot(i.clientX-d.pointer.clientX,i.clientY-d.pointer.clientY)>j,w=i=>{i.pointerId===d.pointerId&&P(i)&&c()},C=i=>{i.pointerId===d.pointerId&&(d.kind==="right"&&!P(i)?l():c())},R=i=>{i.pointerId!==d.pointerId&&c()};window.addEventListener("pointermove",w),window.addEventListener("pointerup",C),window.addEventListener("pointercancel",c),window.addEventListener("pointerdown",R),p.current=()=>{window.removeEventListener("pointermove",w),window.removeEventListener("pointerup",C),window.removeEventListener("pointercancel",c),window.removeEventListener("pointerdown",R)}},[c,l]);Z(()=>c,[c]);let M=E(()=>r.current?(r.current=!1,!0):!1,[]);return{onPointerDown:f,consumeClick:M}}function m(e,n){let t=e.face,s=n.geometry.getAttribute("position");if(!t||!s)return null;let o=e.barycoord??null;if(!o){let[a,b,T]=[t.a,t.b,t.c].map(x=>n.getVertexPosition(x,new S));if(o=_.getBarycoord(n.worldToLocal(e.point.clone()),a,b,T,new S),!o)return null}let[r,p,c]=[t.a,t.b,t.c].map(a=>new S().fromBufferAttribute(s,a)),l=new S().addScaledVector(r,o.x).addScaledVector(p,o.y).addScaledVector(c,o.z),f=new _(r,p,c).getNormal(new S);return t.normal.clone().transformDirection(n.matrixWorld).dot(e.ray.direction)>0&&f.negate(),{position:[l.x,l.y,l.z],normal:[f.x,f.y,f.z]}}function ee(e,n){if(n.updateWorldMatrix(!0,!1),e.object===n&&n.isSkinnedMesh===!0){let o=m(e,n);if(o)return o}let t=n.worldToLocal(e.point.clone()),s=e.face?e.face.normal.clone().transformDirection(e.object.matrixWorld):e.ray.direction.clone().negate();return s.dot(e.ray.direction)>0&&s.negate(),s.transformDirection(new G().copy(n.matrixWorld).invert()),{position:[t.x,t.y,t.z],normal:[s.x,s.y,s.z]}}function ne(e,n){let t=e.nativeEvent;return{clientX:t.clientX,clientY:t.clientY,pointerType:"pointerType"in t?t.pointerType:"mouse",...n?{surface:ee(e,n)}:{}}}import{Box3 as g,Euler as te,Matrix4 as z,Quaternion as se,Vector3 as y}from"three";function oe(e){e.updateWorldMatrix(!0,!0);let n=new z().copy(e.matrixWorld).invert(),t=new g,s=new g,o=!1;return e.traverse(r=>{let p=r;if(!p.isMesh||!p.geometry||(p.geometry.boundingBox||p.geometry.computeBoundingBox(),!p.geometry.boundingBox))return;let c=new z().multiplyMatrices(n,r.matrixWorld);s.copy(p.geometry.boundingBox).applyMatrix4(c),t.union(s),o=!0}),o?t:null}function de(e){let n=oe(e);return n?n.getCenter(new y):new y}function U(e,n="XYZ"){return new se().setFromEuler(new te(e[0],e[1],e[2],n))}function pe(e,n,t,s,o="XYZ",r){let p=new y(...s).multiply(new y(...t));r&&p.applyMatrix4(B(r)),p.applyQuaternion(U(n,o));let c=p.add(new y(...e));return[c.x,c.y,c.z]}function ye(e,n,t,s="XYZ",o){return{point:[...e],offset:pe([0,0,0],n,t,e,s,o)}}function fe(e,n,t,s,o="XYZ",r){if(!s)return e;let p=new y(...s.point).multiply(new y(...t));return r&&p.applyMatrix4(B(r)),p.applyQuaternion(U(n,o)),new y(...e).add(new y(...s.offset)).sub(p).toArray()}function Te(e,n){let t=n.findIndex(s=>Math.abs(s)>1e-12);return t<0?1:Math.abs(e[t]/n[t])}import{Color as V,FrontSide as ce,NormalBlending as K}from"three";function Q(e,n,t,s){let o=k(n),r=N(t,o),p=W(s,n),c=X(s,n),l=Y(s,n);return p||c||l?A(e.userData,n,r,t,p??[0,0],c??1,l??0):(O(e.userData,n),r)}function h(e,n,t,s){if(!t){O(e.userData,n);return}let o=L[n];e[o]=Q(e,n,t,s)}function Pe(e,n,t){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 V(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??K,e.depthWrite=e.userData.baseDepthWrite??!0,e.side=e.userData.baseSide??ce,e.normalMap=e.userData.baseNormalMap??null,e.normalScale.copy(D(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(D(e.userData.baseClearcoatNormalScale)),e.sheen=e.userData.baseSheen??e.sheen,e.sheenColor.copy(e.userData.baseSheenColor??new V(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 V("#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 V("#ffffff")),e.specularColorMap=e.userData.baseSpecularColorMap??null,e.flatShading=e.userData.baseFlatShading??e.flatShading,e.envMapIntensity=e.userData.baseEnvMapIntensity??e.envMapIntensity;let s=u(n,"texture"),o=u(n,"metalnessMap"),r=u(n,"roughnessMap"),p=u(n,"emissiveMap"),c=u(n,"alphaMap"),l=u(n,"normalMap"),f=u(n,"bumpMap"),M=u(n,"aoMap"),a=u(n,"displacementMap"),b=u(n,"clearcoatMap"),T=u(n,"clearcoatRoughnessMap"),x=u(n,"clearcoatNormalMap"),v=u(n,"anisotropyMap"),d=u(n,"transmissionMap"),j=u(n,"thicknessMap"),P=u(n,"sheenColorMap"),w=u(n,"sheenRoughnessMap"),C=u(n,"specularIntensityMap"),R=u(n,"specularColorMap");if(s?(e.map=Q(e,"texture",s,n),e.color.set(t??"#ffffff"),e.vertexColors=!1):(O(e.userData,"texture"),t&&(e.map=null,e.color.set(t),e.vertexColors=!1)),h(e,"metalnessMap",o,n),n?.metalness!==void 0&&(e.metalness=n.metalness),h(e,"roughnessMap",r,n),n?.roughness!==void 0&&(e.roughness=n.roughness),n?.emissive?e.emissive.set(n.emissive):p&&e.emissive.set("#ffffff"),n?.emissiveIntensity!==void 0&&(e.emissiveIntensity=n.emissiveIntensity),h(e,"emissiveMap",p,n),n?.opacity!==void 0&&(e.opacity=n.opacity),h(e,"alphaMap",c,n),n?.alphaTest!==void 0&&(e.alphaTest=n.alphaTest),n?.alphaHash!==void 0&&(e.alphaHash=n.alphaHash),n?.dithering!==void 0&&(e.dithering=n.dithering),n?.blendingMode&&(e.blending=H(n.blendingMode),e.depthWrite=n.blendingMode!=="additive"),n?.side&&(e.side=F(n.side)),h(e,"normalMap",l,n),l||n?.normalScale!==void 0){let i=n?.normalScale??Math.abs(D(e.userData.baseNormalScale).x);e.normalScale.set(i,n?.flipNormalY?-i:i)}if(h(e,"bumpMap",f,n),n?.bumpScale!==void 0&&(e.bumpScale=n.bumpScale),h(e,"aoMap",M,n),n?.aoMapIntensity!==void 0&&(e.aoMapIntensity=n.aoMapIntensity),h(e,"displacementMap",a,n),n?.displacementScale!==void 0&&(e.displacementScale=n.displacementScale),n?.displacementBias!==void 0&&(e.displacementBias=n.displacementBias),h(e,"clearcoatMap",b,n),n?.clearcoat!==void 0&&(e.clearcoat=n.clearcoat),h(e,"clearcoatRoughnessMap",T,n),n?.clearcoatRoughness!==void 0&&(e.clearcoatRoughness=n.clearcoatRoughness),h(e,"clearcoatNormalMap",x,n),x||n?.clearcoatNormalScale!==void 0){let i=n?.clearcoatNormalScale??Math.abs(D(e.userData.baseClearcoatNormalScale).x);e.clearcoatNormalScale.set(i,n?.flipClearcoatNormalY?-i:i)}n?.sheen!==void 0&&(e.sheen=n.sheen),n?.sheenColor&&e.sheenColor.set(n.sheenColor),h(e,"sheenColorMap",P,n),n?.sheenRoughness!==void 0&&(e.sheenRoughness=n.sheenRoughness),h(e,"sheenRoughnessMap",w,n),n?.anisotropy!==void 0&&(e.anisotropy=n.anisotropy),n?.anisotropyRotation!==void 0&&(e.anisotropyRotation=n.anisotropyRotation),h(e,"anisotropyMap",v,n),n?.transmission!==void 0&&(e.transmission=n.transmission),h(e,"transmissionMap",d,n),n?.thickness!==void 0&&(e.thickness=n.thickness),h(e,"thicknessMap",j,n),n?.attenuationColor&&e.attenuationColor.set(n.attenuationColor),n?.attenuationDistance!==void 0&&(e.attenuationDistance=n.attenuationDistance),n?.reflectivity!==void 0&&(e.reflectivity=n.reflectivity),n?.specularIntensity!==void 0&&(e.specularIntensity=n.specularIntensity),h(e,"specularIntensityMap",C,n),n?.specularColor&&e.specularColor.set(n.specularColor),h(e,"specularColorMap",R,n),e.transparent=e.opacity<1||e.transmission>0||e.blending!==K||!!((c||e.alphaMap)&&e.alphaTest<=0),e.transparent||(e.depthWrite=!0)}function Ce(e){return e.material}function Re(e,n){return Array.isArray(e)?e.map(n):n(e,0)}function Oe(e,n){Array.isArray(e)?e.forEach(n):n(e,0)}function Ee(e,n){return Array.isArray(e)?e[n]:e}export{ae as a,ee as b,ne as c,oe as d,de as e,ye as f,fe as g,Te as h,Pe as i,Ce as j,Re as k,Oe as l,Ee as m};
|
|
1
|
+
import{a as B,l as N,o as A,p as O}from"./chunk-37QOMZW6.mjs";import{f as L,g as k,h as u,i as W,j as X,k as Y,l as F,m as H,n as D}from"./chunk-UCD76KQ6.mjs";import{useCallback as E,useEffect as Z,useRef as I}from"react";import{Matrix4 as G,Triangle as _,Vector3 as S}from"three";var q=500,J=10,$=5;function ae(e,n,t){let s=I({resolve:e,onContextMenu:n,anchorOf:t});s.current={resolve:e,onContextMenu:n,anchorOf:t};let o=I(null),r=I(!1),p=I(null),c=E(()=>{let a=o.current;a?.timer&&clearTimeout(a.timer),o.current=null,p.current?.(),p.current=null},[]),l=E(()=>{let a=o.current;a&&(c(),a.kind==="touch"&&(r.current=!0,setTimeout(()=>r.current=!1,800)),s.current.onContextMenu?.(a.target,a.pointer))},[c]),f=E(a=>{let b=a.nativeEvent,T=b.pointerType!=="touch"&&b.button===2,x=b.pointerType==="touch"&&b.button===0;if(!s.current.onContextMenu||!T&&!x)return;let v=s.current.resolve(a.object);if(v===null)return;c();let d={target:v,kind:T?"right":"touch",pointerId:b.pointerId,pointer:ne(a,s.current.anchorOf?.(a.object)),timer:x?setTimeout(l,q):null};o.current=d;let j=T?$:J,P=i=>Math.hypot(i.clientX-d.pointer.clientX,i.clientY-d.pointer.clientY)>j,w=i=>{i.pointerId===d.pointerId&&P(i)&&c()},C=i=>{i.pointerId===d.pointerId&&(d.kind==="right"&&!P(i)?l():c())},R=i=>{i.pointerId!==d.pointerId&&c()};window.addEventListener("pointermove",w),window.addEventListener("pointerup",C),window.addEventListener("pointercancel",c),window.addEventListener("pointerdown",R),p.current=()=>{window.removeEventListener("pointermove",w),window.removeEventListener("pointerup",C),window.removeEventListener("pointercancel",c),window.removeEventListener("pointerdown",R)}},[c,l]);Z(()=>c,[c]);let M=E(()=>r.current?(r.current=!1,!0):!1,[]);return{onPointerDown:f,consumeClick:M}}function m(e,n){let t=e.face,s=n.geometry.getAttribute("position");if(!t||!s)return null;let o=e.barycoord??null;if(!o){let[a,b,T]=[t.a,t.b,t.c].map(x=>n.getVertexPosition(x,new S));if(o=_.getBarycoord(n.worldToLocal(e.point.clone()),a,b,T,new S),!o)return null}let[r,p,c]=[t.a,t.b,t.c].map(a=>new S().fromBufferAttribute(s,a)),l=new S().addScaledVector(r,o.x).addScaledVector(p,o.y).addScaledVector(c,o.z),f=new _(r,p,c).getNormal(new S);return t.normal.clone().transformDirection(n.matrixWorld).dot(e.ray.direction)>0&&f.negate(),{position:[l.x,l.y,l.z],normal:[f.x,f.y,f.z]}}function ee(e,n){if(n.updateWorldMatrix(!0,!1),e.object===n&&n.isSkinnedMesh===!0){let o=m(e,n);if(o)return o}let t=n.worldToLocal(e.point.clone()),s=e.face?e.face.normal.clone().transformDirection(e.object.matrixWorld):e.ray.direction.clone().negate();return s.dot(e.ray.direction)>0&&s.negate(),s.transformDirection(new G().copy(n.matrixWorld).invert()),{position:[t.x,t.y,t.z],normal:[s.x,s.y,s.z]}}function ne(e,n){let t=e.nativeEvent;return{clientX:t.clientX,clientY:t.clientY,pointerType:"pointerType"in t?t.pointerType:"mouse",...n?{surface:ee(e,n)}:{}}}import{Box3 as g,Euler as te,Matrix4 as z,Quaternion as se,Vector3 as y}from"three";function oe(e){e.updateWorldMatrix(!0,!0);let n=new z().copy(e.matrixWorld).invert(),t=new g,s=new g,o=!1;return e.traverse(r=>{let p=r;if(!p.isMesh||!p.geometry||(p.geometry.boundingBox||p.geometry.computeBoundingBox(),!p.geometry.boundingBox))return;let c=new z().multiplyMatrices(n,r.matrixWorld);s.copy(p.geometry.boundingBox).applyMatrix4(c),t.union(s),o=!0}),o?t:null}function de(e){let n=oe(e);return n?n.getCenter(new y):new y}function U(e,n="XYZ"){return new se().setFromEuler(new te(e[0],e[1],e[2],n))}function pe(e,n,t,s,o="XYZ",r){let p=new y(...s).multiply(new y(...t));r&&p.applyMatrix4(B(r)),p.applyQuaternion(U(n,o));let c=p.add(new y(...e));return[c.x,c.y,c.z]}function ye(e,n,t,s="XYZ",o){return{point:[...e],offset:pe([0,0,0],n,t,e,s,o)}}function fe(e,n,t,s,o="XYZ",r){if(!s)return e;let p=new y(...s.point).multiply(new y(...t));return r&&p.applyMatrix4(B(r)),p.applyQuaternion(U(n,o)),new y(...e).add(new y(...s.offset)).sub(p).toArray()}function Te(e,n){let t=n.findIndex(s=>Math.abs(s)>1e-12);return t<0?1:Math.abs(e[t]/n[t])}import{Color as V,FrontSide as ce,NormalBlending as K}from"three";function Q(e,n,t,s){let o=k(n),r=N(t,o),p=W(s,n),c=X(s,n),l=Y(s,n);return p||c||l?A(e.userData,n,r,t,p??[0,0],c??1,l??0):(O(e.userData,n),r)}function h(e,n,t,s){if(!t){O(e.userData,n);return}let o=L[n];e[o]=Q(e,n,t,s)}function Pe(e,n,t){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 V(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??K,e.depthWrite=e.userData.baseDepthWrite??!0,e.side=e.userData.baseSide??ce,e.normalMap=e.userData.baseNormalMap??null,e.normalScale.copy(D(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(D(e.userData.baseClearcoatNormalScale)),e.sheen=e.userData.baseSheen??e.sheen,e.sheenColor.copy(e.userData.baseSheenColor??new V(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 V("#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 V("#ffffff")),e.specularColorMap=e.userData.baseSpecularColorMap??null,e.flatShading=e.userData.baseFlatShading??e.flatShading,e.envMapIntensity=e.userData.baseEnvMapIntensity??e.envMapIntensity;let s=u(n,"texture"),o=u(n,"metalnessMap"),r=u(n,"roughnessMap"),p=u(n,"emissiveMap"),c=u(n,"alphaMap"),l=u(n,"normalMap"),f=u(n,"bumpMap"),M=u(n,"aoMap"),a=u(n,"displacementMap"),b=u(n,"clearcoatMap"),T=u(n,"clearcoatRoughnessMap"),x=u(n,"clearcoatNormalMap"),v=u(n,"anisotropyMap"),d=u(n,"transmissionMap"),j=u(n,"thicknessMap"),P=u(n,"sheenColorMap"),w=u(n,"sheenRoughnessMap"),C=u(n,"specularIntensityMap"),R=u(n,"specularColorMap");if(s?(e.map=Q(e,"texture",s,n),e.color.set(t??"#ffffff"),e.vertexColors=!1):(O(e.userData,"texture"),t&&(e.map=null,e.color.set(t),e.vertexColors=!1)),h(e,"metalnessMap",o,n),n?.metalness!==void 0&&(e.metalness=n.metalness),h(e,"roughnessMap",r,n),n?.roughness!==void 0&&(e.roughness=n.roughness),n?.emissive?e.emissive.set(n.emissive):p&&e.emissive.set("#ffffff"),n?.emissiveIntensity!==void 0&&(e.emissiveIntensity=n.emissiveIntensity),h(e,"emissiveMap",p,n),n?.opacity!==void 0&&(e.opacity=n.opacity),h(e,"alphaMap",c,n),n?.alphaTest!==void 0&&(e.alphaTest=n.alphaTest),n?.alphaHash!==void 0&&(e.alphaHash=n.alphaHash),n?.dithering!==void 0&&(e.dithering=n.dithering),n?.blendingMode&&(e.blending=H(n.blendingMode),e.depthWrite=n.blendingMode!=="additive"),n?.side&&(e.side=F(n.side)),h(e,"normalMap",l,n),l||n?.normalScale!==void 0){let i=n?.normalScale??Math.abs(D(e.userData.baseNormalScale).x);e.normalScale.set(i,n?.flipNormalY?-i:i)}if(h(e,"bumpMap",f,n),n?.bumpScale!==void 0&&(e.bumpScale=n.bumpScale),h(e,"aoMap",M,n),n?.aoMapIntensity!==void 0&&(e.aoMapIntensity=n.aoMapIntensity),h(e,"displacementMap",a,n),n?.displacementScale!==void 0&&(e.displacementScale=n.displacementScale),n?.displacementBias!==void 0&&(e.displacementBias=n.displacementBias),h(e,"clearcoatMap",b,n),n?.clearcoat!==void 0&&(e.clearcoat=n.clearcoat),h(e,"clearcoatRoughnessMap",T,n),n?.clearcoatRoughness!==void 0&&(e.clearcoatRoughness=n.clearcoatRoughness),h(e,"clearcoatNormalMap",x,n),x||n?.clearcoatNormalScale!==void 0){let i=n?.clearcoatNormalScale??Math.abs(D(e.userData.baseClearcoatNormalScale).x);e.clearcoatNormalScale.set(i,n?.flipClearcoatNormalY?-i:i)}n?.sheen!==void 0&&(e.sheen=n.sheen),n?.sheenColor&&e.sheenColor.set(n.sheenColor),h(e,"sheenColorMap",P,n),n?.sheenRoughness!==void 0&&(e.sheenRoughness=n.sheenRoughness),h(e,"sheenRoughnessMap",w,n),n?.anisotropy!==void 0&&(e.anisotropy=n.anisotropy),n?.anisotropyRotation!==void 0&&(e.anisotropyRotation=n.anisotropyRotation),h(e,"anisotropyMap",v,n),n?.transmission!==void 0&&(e.transmission=n.transmission),h(e,"transmissionMap",d,n),n?.thickness!==void 0&&(e.thickness=n.thickness),h(e,"thicknessMap",j,n),n?.attenuationColor&&e.attenuationColor.set(n.attenuationColor),n?.attenuationDistance!==void 0&&(e.attenuationDistance=n.attenuationDistance),n?.reflectivity!==void 0&&(e.reflectivity=n.reflectivity),n?.specularIntensity!==void 0&&(e.specularIntensity=n.specularIntensity),h(e,"specularIntensityMap",C,n),n?.specularColor&&e.specularColor.set(n.specularColor),h(e,"specularColorMap",R,n),e.transparent=e.opacity<1||e.transmission>0||e.blending!==K||!!((c||e.alphaMap)&&e.alphaTest<=0),e.transparent||(e.depthWrite=!0)}function Ce(e){return e.material}function Re(e,n){return Array.isArray(e)?e.map(n):n(e,0)}function Oe(e,n){Array.isArray(e)?e.forEach(n):n(e,0)}function Ee(e,n){return Array.isArray(e)?e[n]:e}export{ae as a,ee as b,ne as c,oe as d,de as e,ye as f,fe as g,Te as h,Pe as i,Ce as j,Re as k,Oe as l,Ee as m};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{b as w}from"./chunk-3PLML3PO.mjs";import{useLayoutEffect as k,useRef as x,useState as g}from"react";import{createPortal as P}from"react-dom";import{ChevronRight as H,Info as S}from"lucide-react";import{HexColorInput as I,HexColorPicker as M}from"react-colorful";import{useEffect as T}from"react";function y(e,n,t){T(()=>{if(!t)return;let a=Array.isArray(e)?e:[e],s=i=>{let o=i.target;a.some(u=>u.current?.contains(o))||n()};return document.addEventListener("pointerdown",s,!0),()=>{document.removeEventListener("pointerdown",s,!0)}},[e,n,t])}import{jsx as r,jsxs as c}from"react/jsx-runtime";function F({anchorRef:e,onClose:n,children:t}){let a=x(null),[s,i]=g(null);return y([a,e],n,!0),k(()=>{let o=e.current;if(!o)return;let l=o.getBoundingClientRect(),u=222,p=8,m=Math.min(Math.max(l.right-u,p),window.innerWidth-u-p),b=Math.min(l.bottom+6,window.innerHeight-200);i({top:b,left:m})},[e]),s?P(r("div",{ref:a,className:"se-colorPickerPopover",style:{position:"fixed",top:s.top,left:s.left},children:t}),document.body):null}function $(e){return e.replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/[_-]+/g," ").replace(/\s+/g," ").trim().replace(/\b\w/g,n=>n.toUpperCase())}function W({label:e,title:n,path:t,children:a}){return c("div",{className:"se-field se-fieldInline","data-ri-path":t,children:[r("span",{className:"se-fieldLabel",title:n??e,children:e}),a]})}function _({children:e}){return r("div",{className:"rui-actions",children:e})}function q({title:e,children:n}){return c("div",{className:"se-listHeader",children:[r("span",{children:e}),n?r("span",{className:"se-listHeaderActions",children:n}):null]})}function J({title:e,actions:n,children:t}){return c("div",{className:"rui-group",children:[c("div",{className:"rui-groupHeader",children:[r("span",{children:e}),n]}),t]})}function Q({title:e,children:n}){return c("section",{className:"se-section",children:[r("h3",{className:"se-sectionTitle",children:e}),r("div",{className:"se-sectionBody",children:n})]})}function ee({title:e,open:n,onToggle:t,trailing:a,children:s,disabled:i,tooltip:o}){return c("section",{className:"se-panel","data-ri-section":e,children:[c("div",{className:"se-panelHeaderRow",children:[c("button",{type:"button",className:"se-panelHeader",onClick:t,"aria-expanded":n,title:o,children:[r(H,{size:13,className:`se-panelChevron ${n?"se-panelChevron--open":""}`}),r("span",{className:"se-panelTitle",children:e}),o?r(S,{size:11,className:"se-panelHelp","aria-hidden":"true"}):null]}),a?r("span",{className:"se-panelTrailing",children:a}):null]}),n?r("div",{className:`se-panelBody ${i?"se-panelBody--disabled":""}`,children:s}):null]})}function ne({checked:e,onChange:n,label:t}){return c("label",{className:"se-switch","aria-label":t,children:[r("input",{type:"checkbox",checked:e,onChange:a=>n(a.target.checked)}),r("span",{className:"se-switchTrack",children:r("span",{className:"se-switchThumb"})})]})}function E(e){return e>=1||!Number.isFinite(e)?0:Math.min(6,Math.ceil(-Math.log10(e)-1e-9))}function N(e,n,t){let a=e;return n!==void 0&&Number.isFinite(n)&&(a=Math.max(n,a)),t!==void 0&&Number.isFinite(t)&&(a=Math.min(t,a)),a}function D({value:e,step:n,min:t,max:a,disabled:s,onChange:i}){return{onPointerDown(o){if(s||o.button!==0)return;o.preventDefault();let l=o.currentTarget;l.setPointerCapture(o.pointerId);let u=o.clientX,p=e,m=E(n),b=v=>{let h=(v.clientX-u)*n*(v.shiftKey?10:1);i(N(Number((p+h).toFixed(m)),t,a))},f=()=>{l.removeEventListener("pointermove",b),l.removeEventListener("pointerup",f),l.removeEventListener("pointercancel",f)};l.addEventListener("pointermove",b),l.addEventListener("pointerup",f),l.addEventListener("pointercancel",f)}}}function V({label:e,value:n,min:t,max:a,step:s,formatValue:i,onChange:o,disabled:l=!1,unset:u=!1}){let[p,m]=g(!1),[b,f]=g(""),v=a>t?N((n-t)/(a-t)*100,0,100):0,h=u?"\u2013":i?i(n):String(Number(n.toFixed(E(s)))),C=()=>{l||(f(String(n)),m(!0))},R=()=>{let d=Number(b);b.trim()!==""&&Number.isFinite(d)&&o(d),m(!1)};return p?r("input",{className:"rui-sliderInput",type:"number","aria-label":e,autoFocus:!0,step:s,value:b,onFocus:d=>d.currentTarget.select(),onChange:d=>f(d.target.value),onBlur:R,onKeyDown:d=>{d.key==="Enter"&&R(),d.key==="Escape"&&(d.stopPropagation(),m(!1))}}):c("div",{className:`rui-slider ${l?"rui-slider--disabled":""}`,children:[r("i",{className:"rui-sliderFill",style:{width:`${v}%`}}),r("span",{className:"rui-sliderValue",children:h}),r("input",{type:"range","aria-label":e,min:t,max:a,step:s,value:N(n,t,a),disabled:l,onChange:d=>o(Number(d.target.value)),onDoubleClick:C,onKeyDown:d=>{d.key==="Enter"&&(d.preventDefault(),C())}})]})}function te({label:e,value:n,min:t,max:a,step:s,formatValue:i,onChange:o,disabled:l=!1,path:u}){return c("div",{className:`se-field se-fieldInline ${l?"se-field--disabled":""}`,"data-ri-path":u,children:[r("span",{className:"se-fieldLabel",title:e,children:e}),r(V,{label:e,value:n,min:t,max:a,step:s,formatValue:i,onChange:o,disabled:l})]})}function ae({label:e,checked:n,onChange:t,path:a}){return c("label",{className:"se-field se-fieldInline","data-ri-path":a,children:[r("span",{className:"se-fieldLabel",title:e,children:e}),r("span",{className:"rui-checkCell",children:r("input",{type:"checkbox",className:"se-checkbox",checked:n,onChange:s=>t(s.target.checked)})})]})}function re({label:e,value:n,options:t,onChange:a,path:s}){return c("label",{className:"se-field se-fieldInline","data-ri-path":s,children:[r("span",{className:"se-fieldLabel",title:e,children:e}),r(w,{className:"se-select",value:n,onChange:i=>a(i.target.value),children:t.map(i=>r("option",{value:i,children:$(i)},i))})]})}function O({label:e,value:n,onChange:t}){let[a,s]=g(!1),i=x(null);return c("span",{className:"rui-color",ref:i,children:[r("button",{type:"button",className:"rui-colorSwatch",style:{background:n},"aria-label":`Pick ${e}`,"aria-expanded":a,onClick:()=>s(o=>!o)}),r(I,{prefixed:!0,className:"rui-colorHex","aria-label":e,color:n,onChange:t}),a?r(F,{anchorRef:i,onClose:()=>s(!1),children:r(M,{color:n,onChange:t})}):null]})}function se({label:e,value:n,onChange:t,path:a}){return c("div",{className:"se-field se-fieldInline","data-ri-path":a,children:[r("span",{className:"se-fieldLabel",title:e,children:e}),r(O,{label:e,value:n,onChange:t})]})}function A({value:e,min:n,max:t,step:a,label:s,onChange:i}){let[o,l]=g(String(e)),u=x(!1);return k(()=>{u.current||l(String(e))},[e]),r("input",{type:"number",className:"se-numberInput","aria-label":s,min:n,max:t,step:a,value:o,onFocus:()=>{u.current=!0},onChange:p=>{let m=p.target.value;l(m),m!==""&&m!=="-"&&!Number.isNaN(Number(m))&&i(Number(m))},onBlur:()=>{u.current=!1,l(String(e))}})}function L({axis:e,label:n,value:t,min:a,max:s,step:i,onChange:o}){let l=D({value:t,step:i,min:a,max:s,onChange:o});return c("span",{className:"se-vectorAxis",children:[r("span",{className:`rui-axis rui-axis--${e.toLowerCase()}`,title:`Drag to change ${e}`,...l,children:e}),r(A,{value:t,min:a,max:s,step:i,label:`${n} ${e}`,onChange:o})]})}function ie({label:e,value:n,min:t,max:a,step:s,onChange:i,path:o}){return c("div",{className:"se-field se-fieldInline","data-ri-path":o,children:[r("span",{className:"se-fieldLabel",title:e,children:e}),r("div",{className:"se-vectorRow",children:["X","Y","Z"].map((u,p)=>r(L,{axis:u,label:e,value:n[p],min:t,max:a,step:s,onChange:m=>{let b=[...n];b[p]=m,i(b)}},u))})]})}function oe({label:e,value:n,min:t,max:a,step:s,onChange:i,path:o}){return c("div",{className:"se-field se-fieldInline","data-ri-path":o,children:[r("span",{className:"se-fieldLabel",title:e,children:e}),r("div",{className:"se-vectorRow se-vectorRow--2",children:["X","Y"].map((u,p)=>r(L,{axis:u,label:e,value:n[p],min:t,max:a,step:s,onChange:m=>{let b=[...n];b[p]=m,i(b)}},u))})]})}export{y as a,W as b,_ as c,q as d,J as e,Q as f,ee as g,ne as h,D as i,V as j,te as k,ae as l,re as m,O as n,se as o,ie as p,oe as q};
|