@liveroom-tech/react-immersive 5.1.0 → 5.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/README.md +486 -57
  2. package/dist/binding-builder.css +1 -1
  3. package/dist/binding-builder.js +17 -13
  4. package/dist/binding-builder.mjs +1 -1
  5. package/dist/chunk-4NLJSD3S.mjs +1 -0
  6. package/dist/chunk-B7REIGDG.mjs +1 -0
  7. package/dist/{chunk-WN6GMMHF.mjs → chunk-HYFJ5DYJ.mjs} +1 -1
  8. package/dist/chunk-QC3NT76G.mjs +3 -0
  9. package/dist/chunk-T3M3BQ7H.mjs +32 -0
  10. package/dist/chunk-ZPK67UG7.mjs +1 -0
  11. package/dist/hosted.css +1 -1
  12. package/dist/hosted.d.mts +4 -3
  13. package/dist/hosted.d.ts +4 -3
  14. package/dist/hosted.js +16 -12
  15. package/dist/hosted.mjs +1 -1
  16. package/dist/index.css +1 -1
  17. package/dist/index.d.mts +39 -8
  18. package/dist/index.d.ts +39 -8
  19. package/dist/index.js +14 -10
  20. package/dist/index.mjs +1 -1
  21. package/dist/materialVariants-DnZe9eMC.d.mts +309 -0
  22. package/dist/materialVariants-DnZe9eMC.d.ts +309 -0
  23. package/dist/modelInfo-BYebMPdZ.d.mts +43 -0
  24. package/dist/modelInfo-XfUQO7C_.d.ts +43 -0
  25. package/dist/{ModelViewer-Bj-KjiDL.d.mts → modelViewerProps-CIZ2R_Fv.d.ts} +82 -10
  26. package/dist/{ModelViewer-BkQ73y6N.d.ts → modelViewerProps-DoRiTZMn.d.mts} +82 -10
  27. package/dist/{objectCatalog-BIeXURoq.d.ts → rendererBackend-QwMzISTn.d.mts} +32 -4
  28. package/dist/{objectCatalog-BIeXURoq.d.mts → rendererBackend-QwMzISTn.d.ts} +32 -4
  29. package/dist/simple-model-viewer.css +1 -1
  30. package/dist/simple-model-viewer.d.mts +32 -4
  31. package/dist/simple-model-viewer.d.ts +32 -4
  32. package/dist/simple-model-viewer.js +3 -3
  33. package/dist/simple-model-viewer.mjs +1 -1
  34. package/dist/utils.d.mts +5 -4
  35. package/dist/utils.d.ts +5 -4
  36. package/dist/utils.js +1 -1
  37. package/dist/utils.mjs +1 -1
  38. package/package.json +2 -1
  39. package/dist/chunk-32WCLPTZ.mjs +0 -1
  40. package/dist/chunk-CSGNL4XU.mjs +0 -3
  41. package/dist/chunk-F2ILTIPG.mjs +0 -28
  42. package/dist/chunk-V6GALFL5.mjs +0 -1
  43. package/dist/modelInfo-DnkmTGMd.d.mts +0 -23
  44. package/dist/modelInfo-DnkmTGMd.d.ts +0 -23
@@ -0,0 +1 @@
1
+ import{A as K,b as N,c as $,e as H,f as Z,q as v,y as X,z as Y}from"./chunk-4NLJSD3S.mjs";import{createContext as $e,useContext as He,useMemo as Ze}from"react";import{jsx as Xe}from"react/jsx-runtime";var J=$e(void 0);function Dr({labels:e,children:t}){return Xe(J.Provider,{value:e,children:t})}function q(){let e=He(J);return Ze(()=>Object.assign((t,r)=>N(e,t,r),{message:t=>$(e,t)}),[e])}import{Box3 as Ye,BufferAttribute as Ke,Mesh as Je}from"three";import{acceleratedRaycast as qe,computeBoundsTree as Qe,disposeBoundsTree as et,MeshBVH as tt}from"three-mesh-bvh";var Q=!1,m=new WeakMap,b=new WeakMap;function rt(){Q||(Je.prototype.raycast=qe,Q=!0)}function nt(e){let t=new Set;return e.traverse(r=>{let n=r.geometry;!n||!n.attributes?.position||t.add(n)}),[...t]}function ee(e){let t=0;for(let r of e){let n=r.index?r.index.count:r.attributes.position.count;t+=n/3}return t}var te=12e6;function Cr(e){return st(e)>te}function st(e){let t=new Set;return e.traverse(r=>{let n=r.geometry;n?.attributes?.position&&t.add(n)}),ee([...t])}function ot(e,t){return new Promise((r,n)=>{let s=u=>{let c=u.data;if(!c||!c.error&&!c.serialized)return;if(e.removeEventListener("message",s),e.removeEventListener("error",o),c.error){n(new Error(String(c.error)));return}let{serialized:p}=c,f=tt.deserialize(p,t,{setIndex:!1});p.index&&(t.index?t.index.array=p.index:t.setIndex(new Ke(p.index,1,!1))),t.boundingBox=f.getBoundingBox(new Ye),r(f)},o=u=>{e.removeEventListener("message",s),e.removeEventListener("error",o),n(new Error(u.message||"BVH worker error"))};e.addEventListener("message",s),e.addEventListener("error",o);let a=t.index?t.index.array.slice():null,l=t.attributes.position.array.slice(),i=[l,...a?[a]:[]].map(u=>u.buffer);e.postMessage({index:a,position:l,options:{groups:[...t.groups]}},i)})}async function at(){if(typeof window>"u"||typeof Worker>"u")return null;try{let{bvhWorkerCode:e}=await import("./bvhWorkerCode-6366A3UC.mjs"),t=new Blob([e],{type:"text/javascript"}),r=URL.createObjectURL(t),n=new Worker(r);return{worker:n,dispose:()=>{n.terminate(),URL.revokeObjectURL(r)}}}catch{return null}}async function it(e,t){if(t)try{return await ot(t,e)}catch{}let r=Qe.call(e);return e.boundsTree=void 0,await new Promise(n=>setTimeout(n,0)),r}async function lt(e,t,r){if(e.boundsTree)return;if(t.buildPromise)return t.buildPromise;let n=(async()=>{let s=await r();t.references>0&&!e.boundsTree&&(e.boundsTree=s,t.ownedTree=s)})();return t.buildPromise=n.finally(()=>{t.buildPromise=void 0,t.references===0&&m.delete(e)}),t.buildPromise}async function Ur(e,t){if(t?.aborted)return;let r=b.get(e);if(!r){if(r=nt(e),ee(r)>te){b.set(e,[]);return}b.set(e,r);for(let s of r){let o=m.get(s)??{references:0};o.references+=1,m.set(s,o)}}if(r.length===0)return;rt();let n=await at();if(t?.aborted){n?.dispose();return}try{for(let s of r){if(t?.aborted)return;let o=m.get(s);o&&await lt(s,o,()=>it(s,n?.worker))}}finally{n?.dispose()}}function Or(e){let t=b.get(e);if(t){b.delete(e);for(let r of t){let n=m.get(r);n&&(n.references=Math.max(0,n.references-1),!(n.references>0)&&(n.ownedTree&&r.boundsTree===n.ownedTree&&(et.call(r),r.boundsTree=void 0),n.ownedTree=void 0,n.buildPromise||m.delete(r)))}}}import{useThree as D}from"@react-three/fiber";import{useEffect as se}from"react";import{useEffect as ut,useState as ct}from"react";function y(e){return!!e?.isWebGPURenderer}var re;function pt(){return re??(re=(async()=>{let e=typeof navigator>"u"?void 0:navigator.gpu;if(!e)return!1;try{return!!await e.requestAdapter()}catch{return!1}})()),re}var ne=!1;function zr(e){let[t,r]=ct(null);return ut(()=>{if(!e)return;let n=!1;return pt().then(s=>{n||(!s&&!ne&&(ne=!0,console.info("[react-immersive] WebGPU isn't available in this browser; using WebGL.")),r(s))}),()=>{n=!0}},[e]),e?t===null?null:t?"webgpu":"webgl":"webgl"}async function Ir(e){let{WebGPURenderer:t}=await import("three/webgpu"),r=new t({canvas:e.canvas,antialias:e.antialias??!0,alpha:e.alpha??!0});return await r.init(),r}function jr({captureRef:e}){let{gl:t,scene:r,camera:n,invalidate:s,get:o}=D();return se(()=>{if(!e)return;let a=()=>{let l=o();l.advance(l.frameloop==="never"?l.clock.elapsedTime:performance.now())};return e.current={gl:t,scene:r,camera:n,invalidate:s,drawNow:a},()=>{e.current=null}},[e,t,r,n,s,o]),null}function Nr(){let e=D(r=>r.frameloop),t=D(r=>r.invalidate);return se(()=>{e!=="never"&&t()},[e,t]),null}function $r(e){e.dispose(),"forceContextLoss"in e&&!y(e)&&(e.forceContextLoss(),e.forceContextLoss=()=>{})}function Hr(e){if(!e)return Promise.resolve(null);try{e.drawNow();let t=e.gl.domElement;return new Promise(r=>{t.toBlob(n=>r(n?URL.createObjectURL(n):null),"image/webp",.85)})}catch{return Promise.resolve(null)}}import{useEffect as wt,useState as xt}from"react";import{useEffect as dt,useState as oe}from"react";var ft="200px",ae=new Map;function ie(e,t,r){let n=ae.get(t);if(!n){let a=new Map;n={observer:new IntersectionObserver(i=>{for(let u of i)a.get(u.target)?.(u.isIntersecting)},{rootMargin:t}),watchers:a},ae.set(t,n)}let{observer:s,watchers:o}=n;return o.set(e,r),s.observe(e),()=>{o.delete(e),s.unobserve(e)}}function le(e){let t=typeof IntersectionObserver<"u",[r,n]=oe(!t),[s,o]=oe(!t);return dt(()=>{let a=e.current;if(!a||!t)return;let l=ie(a,ft,n),i=ie(a,"0px",o);return()=>{l(),i()}},[e,t]),{near:r,visible:s}}import{useEffect as ue,useRef as ce,useState as ht}from"react";function E(){return typeof navigator>"u"?!1:/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)}function mt(){if(typeof navigator>"u")return!1;let e=navigator.userAgent;return/iPhone|iPad|iPod/i.test(e)?!0:navigator.platform==="MacIntel"&&typeof navigator.maxTouchPoints=="number"&&navigator.maxTouchPoints>1}function Kr(){return E()||mt()}function bt(){if(typeof window>"u"||typeof navigator>"u")return!1;let e=a=>typeof window.matchMedia=="function"&&window.matchMedia(a).matches,t=e("(pointer: coarse)")||e("(any-pointer: coarse)"),r=e("(hover: none)")||e("(any-hover: none)"),n=navigator.maxTouchPoints>0,s=typeof window.screen<"u"&&Math.min(window.screen.width,window.screen.height)<=1024,o=E();return t||o||n&&r||n&&s}function A(){if(!bt())return!1;if(E())return!0;let e=navigator.deviceMemory;return!(typeof e=="number"&&e>=8)}function Jr(e="auto"){switch(e){case"high":return!1;case"low":return!0;default:return A()}}function gt(e,t){let r=new Set,n=s=>{for(let o of s){if(r.size>=t)return;r.add(o.id)}};return n(e.filter(s=>s.wanted).sort((s,o)=>Number(o.visible)-Number(s.visible)||Number(o.live)-Number(s.live)||s.since-o.since)),n(e.filter(s=>!s.wanted&&s.live).sort((s,o)=>o.since-s.since)),r}var vt=12,yt=6,M=new Map,Mt=1,T=!1,pe;function de(){T||(T=!0,queueMicrotask(()=>{T=!1,pe??(pe=A()?yt:vt);let e=gt([...M.values()],pe);for(let t of M.values()){let r=e.has(t.id);r!==t.live&&(t.live=r,t.onLiveChange(r))}}))}function fe({managed:e,wanted:t,visible:r,onPark:n}){let[s,o]=ht(!1),a=ce(n);a.current=n;let l=ce(null);return ue(()=>{if(!e)return;let i={id:Mt++,wanted:!1,visible:!1,live:!1,since:performance.now(),onLiveChange:u=>{u||a.current?.(),o(u)}};return M.set(i.id,i),l.current=i,()=>{M.delete(i.id),l.current=null,o(!1),de()}},[e]),ue(()=>{let i=l.current;!i||i.wanted===t&&i.visible===r||(i.wanted!==t&&(i.since=performance.now()),i.wanted=t,i.visible=r,de())},[e,t,r]),e?s:t}function on({loading:e="lazy",reveal:t="auto",rootRef:r,onPark:n}){let{near:s,visible:o}=le(r),[a,l]=xt(t==="auto");return wt(()=>{t==="auto"&&l(!0)},[t]),{live:fe({managed:e==="lazy",wanted:a&&(e==="eager"||s),visible:o,onPark:n}),visible:o,awaitingReveal:!a,reveal:()=>l(!0)}}import{Box as St}from"lucide-react";import{jsx as B,jsxs as me}from"react/jsx-runtime";function Lt({src:e,hidden:t=!1}){return e?B("img",{className:`ri-poster${t?" ri-poster--hidden":""}`,src:e,alt:"","aria-hidden":"true",draggable:!1,decoding:"async"}):null}function fn({className:e,background:t,poster:r,onReveal:n}){let s=q();return me("div",{className:`${e} ri-viewerPlaceholder`,style:{background:t},children:[B(Lt,{src:r}),n?me("button",{type:"button",className:"ri-revealButton",onClick:n,children:[B(St,{size:16,"aria-hidden":"true"}),s("viewIn3D")]}):null]})}import{strFromU8 as Pt,strToU8 as Rt,unzip as Dt}from"fflate";var be;function he(e){be=e}function h(e){be?.(e)}var Et=[".glb",".gltf",".obj",".fbx",".usdz",".stl",".ply",".zip"],At=["model/gltf-binary","model/gltf+json","model/vnd.usdz+zip","application/vnd.usdz+zip","application/zip","application/x-zip-compressed"],g=1024*1024,ge=128*g,ve=1024,ye=128*g,Me=256*g,we=200,Tt=g,d=new Map,yn=".glb,.gltf,.obj,.fbx,.usdz,.stl,.ply,.zip,model/gltf-binary,model/gltf+json,model/vnd.usdz+zip,application/vnd.usdz+zip,application/zip";function U(e){let t=e.split(/[?#]/,1)[0].toLowerCase();return t.endsWith(".obj")?"obj":t.endsWith(".fbx")?"fbx":t.endsWith(".usdz")?"usdz":t.endsWith(".stl")?"stl":t.endsWith(".ply")?"ply":t.endsWith(".gltf")?"gltf":"glb"}function Pe(e){return d.get(e)??{format:U(e)}}function Bt(e){let t=e.name.toLowerCase();return Et.some(r=>t.endsWith(r))||At.includes(e.type)}async function Mn(e){if(!Bt(e))throw new Error("Unsupported model file. Please upload a .glb, .gltf, .obj, .fbx, .usdz, .stl, .ply, or .zip asset.");let t=e.name.toLowerCase();if(t.endsWith(".usdz")||e.type==="model/vnd.usdz+zip"||e.type==="application/vnd.usdz+zip")return xe(e,"usdz");if(t.endsWith(".zip")||Ct(e.type))return Ut(e);if(t.endsWith(".gltf")||e.type==="model/gltf+json")return Se(e);let r=U(e.name);return r==="gltf"?Se(e):xe(e,r)}function xe(e,t){let r=URL.createObjectURL(e);return d.set(r,{format:t,entryPath:e.name}),{url:r,name:e.name,format:t,cleanup:()=>{h(r),d.delete(r),URL.revokeObjectURL(r)}}}function Ct(e){return e==="application/zip"||e==="application/x-zip-compressed"}async function Se(e){let t=await e.text(),r=Re(t,e.name);for(let s of De(r))if(!O(s))throw new Error(`${e.name} references external assets. Upload a .zip containing the .gltf file and its dependencies.`);let n=URL.createObjectURL(e);return d.set(n,{format:"gltf",entryPath:e.name}),{url:n,name:e.name,format:"gltf",cleanup:()=>{h(n),d.delete(n),URL.revokeObjectURL(n)}}}async function Ut(e){if(e.size>ge)throw new Error(`Model zip is too large. The compressed archive must be ${C(ge)} or smaller.`);let t=await Ot(new Uint8Array(await e.arrayBuffer())),r=new Map;for(let[a,l]of Object.entries(t)){let i=k(a);!i||Ee(i)||r.set(i,l)}let n=[...r.keys()].filter(a=>/\.(gltf|obj|fbx|stl|ply)$/i.test(a));if(n.length===0)throw new Error("Invalid model zip: no .gltf, .obj, .fbx, .stl, or .ply file found.");if(n.length>1)throw new Error("Invalid model zip: multiple model entry files found.");let s=n[0],o=U(s);if(o==="gltf")return Gt(e,s,r);if(o==="obj"||o==="fbx"||o==="stl"||o==="ply")return kt(e,s,o,r);throw new Error(`Unsupported model entry ${s}.`)}function Ot(e){return new Promise((t,r)=>{let n=0,s=0,o=null,a=i=>(o??(o=new Error(`Invalid model zip: ${i}`)),!1);Dt(e,{filter:i=>{if(o)return!1;if(n+=1,n>ve)return a(`archive contains more than ${ve.toLocaleString()} entries.`);if(i.originalSize>ye)return a(`${i.name} expands beyond the ${C(ye)} per-file limit.`);if(s+=i.originalSize,s>Me)return a(`expanded contents exceed ${C(Me)}.`);if(i.originalSize>=Tt&&(i.size===0||i.originalSize/i.size>we))return a(`${i.name} exceeds the ${we}:1 compression-ratio limit.`);let u=k(i.name);return!!u&&!Ee(u)}},(i,u)=>{o?r(o):i?r(new Error(`Invalid model zip: ${i.message}`)):t(u)})})}function C(e){return`${e/g} MiB`}function kt(e,t,r,n){let s=[],o={};for(let[l,i]of n){let u=URL.createObjectURL(new Blob([i],{type:Ae(l)}));s.push(u),o[l]=u}let a=o[t];if(!a)throw s.forEach(l=>URL.revokeObjectURL(l)),new Error(`Invalid model zip: could not read ${t}.`);return d.set(a,{format:r,entryPath:t,resourceUrls:o}),{url:a,name:e.name,format:r,cleanup:()=>{h(a),d.delete(a),s.forEach(l=>URL.revokeObjectURL(l))}}}function Gt(e,t,r){let n=r.get(t);if(!n)throw new Error("Invalid GLTF zip: no .gltf found.");let s=Re(Pt(n),t);zt(s,t);let o=It(t),a=[];try{Le(s.buffers,o,r,a),Le(s.images,o,r,a);let l=new Blob([Rt(JSON.stringify(s))],{type:"model/gltf+json"}),i=URL.createObjectURL(l);return a.push(i),d.set(i,{format:"gltf",entryPath:t}),{url:i,name:e.name,format:"gltf",cleanup:()=>{h(i),d.delete(i),a.forEach(u=>URL.revokeObjectURL(u))}}}catch(l){throw a.forEach(i=>URL.revokeObjectURL(i)),l}}function Le(e,t,r,n){for(let s of e??[]){if(typeof s.uri!="string"||O(s.uri))continue;let o=Ft(t,s.uri),a=r.get(o);if(!a)throw new Error(`Invalid GLTF zip: missing referenced asset ${s.uri}.`);let l=URL.createObjectURL(new Blob([a],{type:Ae(o)}));n.push(l),s.uri=l}}function Re(e,t){try{return JSON.parse(e)}catch{throw new Error(`${t} is not a valid .gltf JSON file.`)}}function De(e){return[...e.buffers??[],...e.images??[]].map(t=>t.uri).filter(t=>typeof t=="string"&&t.length>0)}function zt(e,t){for(let r of De(e)){if(O(r))continue;let n=/^[a-z][a-z0-9+.-]*:/i.test(r),s=r.startsWith("/")||r.startsWith("\\");if(n||s)throw new Error(`${t} references external assets. Include every dependency inside the uploaded .zip.`)}}function O(e){return e.startsWith("data:")}function k(e){let t=[];for(let r of e.replace(/\\/g,"/").replace(/^\/+/,"").split("/").filter(n=>n&&n!==".")){if(r===".."){t.pop();continue}t.push(r)}return t.join("/")}function Ee(e){let t=e.split("/");return e.endsWith("/")||t.includes("__MACOSX")||t.some(r=>r===".DS_Store"||r.startsWith("._"))}function It(e){let t=e.lastIndexOf("/");return t===-1?"":e.slice(0,t)}function Ft(e,t){let r=t.split(/[?#]/)[0],n=Wt(r);return k(e?`${e}/${n}`:n)}function Wt(e){try{return decodeURI(e)}catch{return e}}function Ae(e){let t=e.toLowerCase();return t.endsWith(".obj")||t.endsWith(".mtl")?"text/plain":t.endsWith(".fbx")?"application/octet-stream":t.endsWith(".usdz")?"model/vnd.usdz+zip":t.endsWith(".bin")?"application/octet-stream":t.endsWith(".png")?"image/png":t.endsWith(".jpg")||t.endsWith(".jpeg")?"image/jpeg":t.endsWith(".webp")?"image/webp":t.endsWith(".avif")?"image/avif":t.endsWith(".ktx2")?"image/ktx2":"application/octet-stream"}import{BufferGeometry as Vt,Float32BufferAttribute as _t,Group as Be,Mesh as G,MeshStandardMaterial as jt}from"three";import{STLLoader as Nt}from"three/examples/jsm/loaders/STLLoader.js";import{PLYLoader as $t}from"three/examples/jsm/loaders/PLYLoader.js";var Ht=12106948,Ce="This PLY file is a point cloud: it has vertices but no faces.",w=class extends Error{constructor(){super(Ce),this.name="PointCloudError"}};function Pn(e){return e instanceof w||e instanceof Error&&e.message.includes(Ce)}function Ue(e,t){let r=e.split(/[?#]/,1)[0],n=r.slice(r.lastIndexOf("/")+1);try{n=decodeURIComponent(n)}catch{}return n.replace(/\.[^.]*$/,"").trim()||t}function z(e){return new jt({color:e?16777215:Ht,vertexColors:e,metalness:0,roughness:.6})}function Te(e,t,r){let n=e.itemSize;return new _t(e.array.slice(t*n,(t+r)*n),n)}function Oe(e,t){let r=new Nt().parse(e),n=!!r.hasColors,s=new Be;if(r.groups.length>1){let l=r.userData.groupNames??[],i=r.getAttribute("position"),u=r.getAttribute("normal");return r.groups.forEach((c,p)=>{let f=new Vt;f.setAttribute("position",Te(i,c.start,c.count)),u&&f.setAttribute("normal",Te(u,c.start,c.count));let j=new G(f,z(!1));j.name=l[p]?.trim()||`${t} ${p+1}`,s.add(j)}),r.dispose(),s}r.clearGroups();let o=z(n);n&&r.alpha!==void 0&&r.alpha<1&&(o.opacity=r.alpha,o.transparent=!0);let a=new G(r,o);return a.name=t,s.add(a),s}function Zt(e){let r=new TextDecoder().decode(new Uint8Array(e,0,Math.min(e.byteLength,65536))).split("end_header",1)[0],n=/^\s*element\s+face\s+(\d+)/m.exec(r);return!!(n&&Number(n[1])>0)}function ke(e,t){if(!Zt(e))throw new w;let r=new $t().parse(e);r.getAttribute("normal")||r.computeVertexNormals();let n=new G(r,z(!!r.getAttribute("color")));n.name=t;let s=new Be;return s.add(n),s}import{useLoader as Ie,useThree as rr}from"@react-three/fiber";import{FileLoader as Fe,Loader as nr,LoadingManager as sr}from"three";import{FBXLoader as or,GLTFLoader as ar,MTLLoader as ir,OBJLoader as lr}from"three-stdlib";import{USDLoader as ur}from"three/examples/jsm/loaders/USDLoader.js";import{useGLTF as En}from"@react-three/drei";import{useThree as Tn}from"@react-three/fiber";import{useMemo as Cn}from"react";import{SRGBColorSpace as Xt}from"three";import{DRACOLoader as Yt,KTX2Loader as Kt,MeshoptDecoder as Jt}from"three-stdlib";function qt(e){return{name:"RI_unlit_emissive_texture",async afterRoot(t){let r=e.json.materials??[],n=new Map;if(r.forEach(o=>{let a=!!o?.extensions?.KHR_materials_unlit,l=!!o?.pbrMetallicRoughness?.baseColorTexture;a&&!l&&o?.emissiveTexture&&o.name&&n.set(o.name,o.emissiveTexture.index)}),n.size===0||!t.scene)return;let s=new Map;await Promise.all([...n].map(async([o,a])=>{let l=await e.getDependency("texture",a);l&&(l.colorSpace=Xt,s.set(o,l))})),t.scene.traverse(o=>{let a=Array.isArray(o.material)?o.material:o.material?[o.material]:[];for(let l of a){let i=l.name?s.get(l.name):void 0;i&&!l.map&&(l.map=i,l.needsUpdate=!0)}})}}}var Qt="https://assets.react-immersive.liveroom.dev/three-r184/draco/",er="https://assets.react-immersive.liveroom.dev/three-r184/basis/";function tr(e,t){if(!y(t))return e.detectSupport(t);let r=t,n=s=>r.hasFeature(s);return e.workerConfig={astcSupported:n("texture-compression-astc"),etc1Supported:n("texture-compression-etc1"),etc2Supported:n("texture-compression-etc2"),dxtSupported:n("texture-compression-s3tc"),bptcSupported:n("texture-compression-bc"),pvrtcSupported:n("texture-compression-pvrtc")},e}function Ge(e,t={},r){let{dracoDecoderPath:n=Qt,ktx2TranscoderPath:s=er,meshopt:o=!0}=t;if(n){let a=new Yt;a.setDecoderPath(n),e.setDRACOLoader(a)}if(o&&e.setMeshoptDecoder(Jt),s&&r){let a=tr(new Kt().setTranscoderPath(s),r);e.setKTX2Loader(a)}e.register((a=>qt(a)))}var S=class extends nr{constructor(){super(...arguments);this.options={source:{format:"glb"}}}configure(r){return this.options=r,this}load(r,n,s,o){this.loadAsset(r,s).then(n).catch(o)}async loadAsset(r,n){let s=dr(this.options.source),{format:o}=this.options.source;if(o==="obj")return cr(r,s,this.options.source,n);if(o==="fbx"){let i=I(this,new or(s)),u=br(r,this.options.source);u&&i.setResourcePath(u);let c=await i.loadAsync(r,n);return x(c,"FBXMesh",!1),{scene:c,animations:c.animations??[]}}if(o==="stl"||o==="ply"){let i=await pr(r,s,n),u=Ue(this.options.source.entryPath??r,o==="stl"?"STL model":"PLY model"),c=o==="stl"?Oe(i,u):ke(i,u);return x(c,o==="stl"?"STLMesh":"PLYMesh",!0),{scene:c,animations:[]}}if(o==="usdz"){let u=await I(this,new ur(s)).loadAsync(r,n);return x(u,"USDZMesh",!1),{scene:u,animations:u.animations??[]}}let a=I(this,new ar(s));Ge(a,this.options.decoderConfig,this.options.renderer);let l=await a.loadAsync(r,n);return{scene:l.scene,animations:l.animations??[],materialVariants:X(l)}}};he(e=>{Ie.clear(S,e)});function Hn(e,t={},r,n){let s=rr(l=>l.gl),o=Pe(e),a=r?{...o,format:r}:o;return Ie(S,e,l=>{l.configure({source:a,decoderConfig:t,renderer:s})},n)}async function cr(e,t,r,n){let s=await ze(e,t,n),o=new lr(t),a=fr(s);if(a){let i=mr(a,e,r);if(i)try{let u=await ze(i.url,t),p=new ir(t).parse(u,i.basePath);p.preload(),o.setMaterials(p)}catch(u){console.warn(`[react-immersive] Could not load OBJ material ${a}; rendering geometry with fallback materials.`,u)}}let l=o.parse(s);return x(l,"OBJMesh",!0),{scene:l,animations:[]}}function x(e,t,r){let n=new Set,s=0;e.traverse(o=>{if(!("isMesh"in o&&o.isMesh===!0)){o.name&&n.add(o.name);return}let l=o.name||`${t}_${++s}`;if(!r&&o.name){n.add(o.name);return}let i=l,u=2;for(;n.has(i);)i=`${l}_${u++}`;o.name=i,n.add(i)})}function ze(e,t,r){let n=new Fe(t);return n.setResponseType("text"),n.loadAsync(e,r)}function pr(e,t,r){let n=new Fe(t);return n.setResponseType("arraybuffer"),n.loadAsync(e,r)}function I(e,t){return t.setCrossOrigin(e.crossOrigin),t.setWithCredentials(e.withCredentials),t.setRequestHeader(e.requestHeader),t}function dr(e){let t=new sr,r=e.resourceUrls;return r&&t.setURLModifier(n=>{if(/^(?:blob:|data:)/i.test(n))return n;let s=P(Ve(n).split(/[?#]/)[0]),o=r[s];if(o)return o;let a=L(e.entryPath??""),l=P(a?`${a}/${s}`:s);return r[l]??n}),t}function fr(e){return/^\s*mtllib\s+(.+?)\s*$/im.exec(e)?.[1]?.trim()||null}function mr(e,t,r){if(r.resourceUrls&&r.entryPath){let n=P(`${L(r.entryPath)}/${Ve(e)}`),s=r.resourceUrls[n];if(!s)return null;let o=L(n);return{url:s,basePath:o?`${o}/`:""}}try{let n=new URL(e,t).href;return{url:n,basePath:We(n)}}catch{return null}}function br(e,t){if(t.resourceUrls&&t.entryPath){let r=L(t.entryPath);return r?`${r}/`:""}return We(e)}function We(e){let t=e.lastIndexOf("/");return t===-1?"":e.slice(0,t+1)}function L(e){let t=P(e),r=t.lastIndexOf("/");return r===-1?"":t.slice(0,r)}function P(e){let t=[];for(let r of e.replace(/\\/g,"/").replace(/^\/+/,"").split("/").filter(n=>n&&n!=="."))r===".."?t.pop():t.push(r);return t.join("/")}function Ve(e){try{return decodeURI(e)}catch{return e}}import{Color as F,MeshPhysicalMaterial as hr,MeshStandardMaterial as gr,Texture as W}from"three";function Kn(e){if(H(e))return e;if(!e||typeof e!="object")return null;let t=e,r=new gr;typeof t.name=="string"&&(r.name=t.name),r.metalness=0,r.roughness=1,t.type==="MeshBasicMaterial"||t.isMeshBasicMaterial===!0?(r.color.set(0),r.emissiveIntensity=1,t.map instanceof W?(r.emissiveMap=t.map,r.emissive.set(16777215)):t.color instanceof F&&r.emissive.copy(t.color)):(t.color instanceof F&&r.color.copy(t.color),t.map instanceof W&&(r.map=t.map),t.emissive instanceof F&&r.emissive.copy(t.emissive),t.emissiveMap instanceof W&&(r.emissiveMap=t.emissiveMap));let s=["aoMap","aoMapIntensity","lightMap","lightMapIntensity","alphaMap","opacity","transparent","alphaTest","side","vertexColors","wireframe","depthTest","depthWrite","visible","toneMapped","fog"];for(let o of s)t[o]!==void 0&&(r[o]=t[o]);return r.needsUpdate=!0,r}function Jn(e){if(Z(e))return e.clone();let t=new hr;return t.name=e.name,t.color.copy(e.color),t.map=e.map,t.lightMap=e.lightMap,t.lightMapIntensity=e.lightMapIntensity,t.aoMap=e.aoMap,t.aoMapIntensity=e.aoMapIntensity,t.emissive.copy(e.emissive),t.emissiveIntensity=e.emissiveIntensity,t.emissiveMap=e.emissiveMap,t.bumpMap=e.bumpMap,t.bumpScale=e.bumpScale,t.normalMap=e.normalMap,t.normalMapType=e.normalMapType,t.normalScale.copy(v(e.normalScale)),t.displacementMap=e.displacementMap,t.displacementScale=e.displacementScale,t.displacementBias=e.displacementBias,t.roughness=e.roughness,t.roughnessMap=e.roughnessMap,t.metalness=e.metalness,t.metalnessMap=e.metalnessMap,t.alphaMap=e.alphaMap,t.envMap=e.envMap,t.envMapRotation.copy(e.envMapRotation),t.envMapIntensity=e.envMapIntensity,t.wireframe=e.wireframe,t.wireframeLinewidth=e.wireframeLinewidth,t.flatShading=e.flatShading,t.fog=e.fog,t.opacity=e.opacity,t.transparent=e.transparent,t.alphaHash=e.alphaHash,t.blendSrc=e.blendSrc,t.blendDst=e.blendDst,t.blendEquation=e.blendEquation,t.blendSrcAlpha=e.blendSrcAlpha,t.blendDstAlpha=e.blendDstAlpha,t.blendEquationAlpha=e.blendEquationAlpha,t.blending=e.blending,t.premultipliedAlpha=e.premultipliedAlpha,t.dithering=e.dithering,t.alphaTest=e.alphaTest,t.depthTest=e.depthTest,t.depthWrite=e.depthWrite,t.colorWrite=e.colorWrite,t.stencilWrite=e.stencilWrite,t.stencilWriteMask=e.stencilWriteMask,t.stencilFunc=e.stencilFunc,t.stencilRef=e.stencilRef,t.stencilFuncMask=e.stencilFuncMask,t.stencilFail=e.stencilFail,t.stencilZFail=e.stencilZFail,t.stencilZPass=e.stencilZPass,t.side=e.side,t.shadowSide=e.shadowSide,t.toneMapped=e.toneMapped,t.vertexColors=e.vertexColors,t.visible=e.visible,t.clippingPlanes=e.clippingPlanes,t.clipIntersection=e.clipIntersection,t.clipShadows=e.clipShadows,t.forceSinglePass=e.forceSinglePass,t.polygonOffset=e.polygonOffset,t.polygonOffsetFactor=e.polygonOffsetFactor,t.polygonOffsetUnits=e.polygonOffsetUnits,t}function qn(e){e.userData.baseColor=e.color.clone(),e.userData.baseMap=e.map??null,e.userData.baseVertexColors=e.vertexColors,e.userData.baseMetalness=e.metalness,e.userData.baseMetalnessMap=e.metalnessMap??null,e.userData.baseRoughness=e.roughness,e.userData.baseRoughnessMap=e.roughnessMap??null,e.userData.baseEmissive=e.emissive.clone(),e.userData.baseEmissiveIntensity=e.emissiveIntensity,e.userData.baseEmissiveMap=e.emissiveMap??null,e.userData.baseOpacity=e.opacity,e.userData.baseTransparent=e.transparent,e.userData.baseAlphaMap=e.alphaMap??null,e.userData.baseAlphaTest=e.alphaTest,e.userData.baseAlphaHash=e.alphaHash,e.userData.baseDithering=e.dithering,e.userData.baseBlending=e.blending,e.userData.baseDepthWrite=e.depthWrite,e.userData.baseSide=e.side,e.userData.baseNormalMap=e.normalMap??null,e.userData.baseNormalScale=v(e.normalScale),e.userData.baseBumpMap=e.bumpMap??null,e.userData.baseBumpScale=e.bumpScale,e.userData.baseAoMap=e.aoMap??null,e.userData.baseAoMapIntensity=e.aoMapIntensity,e.userData.baseDisplacementMap=e.displacementMap??null,e.userData.baseDisplacementScale=e.displacementScale,e.userData.baseDisplacementBias=e.displacementBias,e.userData.baseClearcoat=e.clearcoat,e.userData.baseClearcoatMap=e.clearcoatMap??null,e.userData.baseClearcoatRoughness=e.clearcoatRoughness,e.userData.baseClearcoatRoughnessMap=e.clearcoatRoughnessMap??null,e.userData.baseClearcoatNormalMap=e.clearcoatNormalMap??null,e.userData.baseClearcoatNormalScale=v(e.clearcoatNormalScale),e.userData.baseSheen=e.sheen,e.userData.baseSheenColor=e.sheenColor.clone(),e.userData.baseSheenColorMap=e.sheenColorMap??null,e.userData.baseSheenRoughness=e.sheenRoughness,e.userData.baseSheenRoughnessMap=e.sheenRoughnessMap??null,e.userData.baseAnisotropy=e.anisotropy,e.userData.baseAnisotropyRotation=e.anisotropyRotation,e.userData.baseAnisotropyMap=e.anisotropyMap??null,e.userData.baseTransmission=e.transmission,e.userData.baseTransmissionMap=e.transmissionMap??null,e.userData.baseThickness=e.thickness,e.userData.baseThicknessMap=e.thicknessMap??null,e.userData.baseAttenuationColor=e.attenuationColor.clone(),e.userData.baseAttenuationDistance=e.attenuationDistance,e.userData.baseReflectivity=e.reflectivity,e.userData.baseSpecularIntensity=e.specularIntensity,e.userData.baseSpecularIntensityMap=e.specularIntensityMap??null,e.userData.baseSpecularColor=e.specularColor.clone(),e.userData.baseSpecularColorMap=e.specularColorMap??null,e.userData.baseFlatShading=e.flatShading,e.userData.baseEnvMapIntensity=e.envMapIntensity}function es(e){e.updateMatrixWorld(!0),e.traverse(t=>{let r=t;r.isSkinnedMesh&&(r.skeleton?.update(),r.computeBoundingBox?.(),r.computeBoundingSphere?.())})}import{useCallback as _e,useEffect as vr,useRef as yr}from"react";import{useThree as Mr}from"@react-three/fiber";function ss(){let e=Mr(s=>s.gl.domElement),t=yr(void 0),r=_e(s=>{t.current===void 0&&(t.current=e.style.cursor),e.style.cursor=s},[e]),n=_e(()=>{let s=t.current;s!==void 0&&(e.style.cursor=s,t.current=void 0)},[e]);return vr(()=>()=>{n()},[n]),{setCanvasCursor:r,restoreCanvasCursor:n}}import{Box3 as wr,Vector3 as je}from"three";function R(e){return[e.x,e.y,e.z]}function ls(e){let t=new wr().setFromObject(e),r=0;return e.traverse(n=>{n.isMesh&&(r+=1)}),{bounds:{min:R(t.min),max:R(t.max),center:R(t.getCenter(new je)),size:R(t.getSize(new je))},objectCount:r,materialVariants:Y(e),materialVariantGroups:K(e)}}import{useSyncExternalStore as xr}from"react";var Ne="(prefers-reduced-motion: reduce)";function Sr(e){if(typeof window>"u"||!window.matchMedia)return()=>{};let t=window.matchMedia(Ne);return t.addEventListener("change",e),()=>t.removeEventListener("change",e)}var Lr=()=>typeof window<"u"&&!!window.matchMedia?.(Ne).matches;function ps(e="user"){let t=xr(Sr,Lr,()=>!1);return e==="always"?!0:e==="never"?!1:t}import{jsx as V,jsxs as _}from"react/jsx-runtime";function hs({visible:e,message:t,tone:r="default",progress:n}){if(!e)return null;let s=typeof n=="number"&&Number.isFinite(n),o=s?Math.min(Math.max(n,0),100):0,a=Math.round(o);return _("div",{className:"bb-loadingOverlay",role:"status","aria-live":"polite",children:[s&&_("div",{className:"bb-loadingProgressRow",children:[V("div",{className:"bb-loadingProgress",role:"progressbar","aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":a,children:V("div",{className:"bb-loadingProgress__bar",style:{width:`${a}%`}})}),_("span",{className:"bb-loadingProgress__label",children:[a,"%"]})]}),V("span",{className:`bb-loadingMessage bb-status--${r}`,children:t})]})}export{Dr as a,q as b,te as c,Cr as d,st as e,Ur as f,Or as g,y as h,zr as i,Ir as j,jr as k,Nr as l,$r as m,Hr as n,mt as o,Kr as p,A as q,Jr as r,on as s,Lt as t,fn as u,yn as v,U as w,Mn as x,Pn as y,Qt as z,er as A,Hn as B,Kn as C,Jn as D,qn as E,es as F,ss as G,ls as H,ps as I,hs as J};