u-space 0.0.2 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("three/webgpu"),d=require("three/tsl"),K=require("camera-controls"),pe=require("three/addons/environments/RoomEnvironment.js"),ue=require("three/addons/helpers/ViewHelper.js"),V=require("three/addons/loaders/GLTFLoader.js"),me=require("three/addons/loaders/FBXLoader.js"),ge=require("three/addons/loaders/OBJLoader.js"),we=require("three/addons/loaders/STLLoader.js"),ye=require("three/addons/loaders/DRACOLoader.js"),fe=require("three/addons/loaders/KTX2Loader.js"),Q=require("three/addons/libs/meshopt_decoder.module.js"),ve=require("three/addons/loaders/HDRLoader.js"),Me=require("three/addons/utils/SkeletonUtils.js"),R=require("three"),p=require("three/addons/libs/tween.module.js");class Y{type;target;currentTarget;intersect;originalEvent;_propagationStopped=!1;constructor(e){this.type=e.type,this.target=e.target,this.currentTarget=e.target,this.intersect=e.intersect,this.originalEvent=e.originalEvent}stopPropagation(){this._propagationStopped=!0}get propagationStopped(){return this._propagationStopped}}class J{domElement;scene;camera;raycaster=new r.Raycaster;pointer=new r.Vector2;hoveredObject=null;pointerDownTime=0;pointerDownPos=new r.Vector2;clickTimer=null;longPressThreshold=500;moveThreshold=.01;targetObjects;pointerMoveEventsEnabled=!1;constructor(e,t,s){this.domElement=e,this.scene=t,this.camera=s,this.raycaster.params.Points.threshold=.1,this.raycaster.params.Line.threshold=.1,this.targetObjects=this.scene.children,this._bindEvents()}setCamera(e){this.camera=e}_bindEvents(){this.domElement.addEventListener("click",this._onClick),this.domElement.addEventListener("dblclick",this._onDblClick),this.domElement.addEventListener("contextmenu",this._onContextMenu),this.domElement.addEventListener("pointerdown",this._onPointerDown),this.domElement.addEventListener("pointerup",this._onPointerUp),this.domElement.addEventListener("pointermove",this._onPointerMove)}_updatePointer(e){const t=this.domElement.getBoundingClientRect();this.pointer.x=(e.clientX-t.left)/t.width*2-1,this.pointer.y=-((e.clientY-t.top)/t.height)*2+1}_getIntersects(){return this.raycaster.setFromCamera(this.pointer,this.camera),this.raycaster.intersectObjects(this.targetObjects,!0)}_dispatchToTarget(e,t,s,n){const i=new Y({type:e,target:t,intersect:s,originalEvent:n});let o=t;for(;o&&!i.propagationStopped;)i.currentTarget=o,o.dispatchEvent({type:e,event:i}),o=o.parent}_handleEvent(e,t){this._updatePointer(t);const s=this._getIntersects();if(s.length===0)return;const n=s[0];this._dispatchToTarget(e,n.object,n,t)}_onClick=e=>{const t=Date.now()-this.pointerDownTime,s=this.pointer.distanceTo(this.pointerDownPos);if(!(t>this.longPressThreshold||s>this.moveThreshold)){if(this.clickTimer){clearTimeout(this.clickTimer),this.clickTimer=null;return}this.clickTimer=setTimeout(()=>{this._handleEvent("click",e),this.clickTimer=null},200)}};_onDblClick=e=>{this.clickTimer&&(clearTimeout(this.clickTimer),this.clickTimer=null),this._handleEvent("dblclick",e)};_onContextMenu=e=>{e.preventDefault()};_onPointerDown=e=>{this.pointerDownTime=Date.now(),this._updatePointer(e),this.pointerDownPos.copy(this.pointer),this._handleEvent("pointerdown",e)};_onPointerUp=e=>{if(this._updatePointer(e),e.button===2){const t=Date.now()-this.pointerDownTime,s=this.pointer.distanceTo(this.pointerDownPos);t<=this.longPressThreshold&&s<=this.moveThreshold&&this._handleEvent("rightclick",e)}this._handleEvent("pointerup",e)};_onPointerMove=e=>{if(!this.pointerMoveEventsEnabled)return;this._updatePointer(e);const t=this._getIntersects(),s=t.length>0?t[0].object:null,n=t.length>0?t[0]:null;this.hoveredObject!==s&&(this.hoveredObject&&this._dispatchToTarget("pointerleave",this.hoveredObject,null,e),this.hoveredObject=s,s&&n&&this._dispatchToTarget("pointerenter",s,n,e)),s&&n&&this._dispatchToTarget("pointermove",s,n,e)};dispose(){this.domElement.removeEventListener("click",this._onClick),this.domElement.removeEventListener("dblclick",this._onDblClick),this.domElement.removeEventListener("contextmenu",this._onContextMenu),this.domElement.removeEventListener("pointerdown",this._onPointerDown),this.domElement.removeEventListener("pointerup",this._onPointerUp),this.domElement.removeEventListener("pointermove",this._onPointerMove),this.hoveredObject=null}}class Z{idMap=new Map;nameMap=new Map;typeMap=new Map;objectIds=new Map;allObjects=new Set;add(e,t){if(this.idMap.has(e)){console.warn(`ObjectManager: Object with id ${e} already exists.`);return}this.idMap.set(e,t),this.allObjects.add(t),this.objectIds.has(t)||this.objectIds.set(t,new Set),this.objectIds.get(t).add(e),t.name&&(this.nameMap.has(t.name)||this.nameMap.set(t.name,new Set),this.nameMap.get(t.name).add(t)),t.type&&(this.typeMap.has(t.type)||this.typeMap.set(t.type,new Set),this.typeMap.get(t.type).add(t))}getById(e){return this.idMap.get(e)}getByName(e){return this.nameMap.get(e)||new Set}getByType(e){return this.typeMap.get(e)||new Set}getObjectIds(e){return this.objectIds.get(e)||new Set}remove(e){const t=this.objectIds.get(e);if(t){for(const s of t)this.idMap.delete(s);this.objectIds.delete(e)}if(e.name&&this.nameMap.has(e.name)){const s=this.nameMap.get(e.name);s.delete(e),s.size===0&&this.nameMap.delete(e.name)}if(e.type&&this.typeMap.has(e.type)){const s=this.typeMap.get(e.type);s.delete(e),s.size===0&&this.typeMap.delete(e.type)}this.allObjects.delete(e)}removeById(e){const t=this.idMap.get(e);t&&this.remove(t)}removeByName(e){const t=this.getByName(e);for(const s of t)this.remove(s)}removeByType(e){const t=this.getByType(e);for(const s of t)this.remove(s)}clear(){this.idMap.clear(),this.nameMap.clear(),this.typeMap.clear(),this.objectIds.clear(),this.allObjects.clear()}getAll(){return this.allObjects}get size(){return this.allObjects.size}}class Ee extends r.RenderPipeline{scene;camera;currentOutputNode;needsUpdateOutputNode;#e;constructor(...e){const[t,s,n]=e;super(t),this.scene=s,this.camera=n,this.currentOutputNode=d.pass(s,n),this.needsUpdateOutputNode=!0,this.#e=new Set}addOverlayPass(e){this.#e.add(e),this.needsUpdateOutputNode=!0}removeOverlayPass(e){this.#e.delete(e),this.needsUpdateOutputNode=!0}setCamera(e){this.camera=e,this.needsUpdateOutputNode=!0}setCurrentOutputNode(e){this.currentOutputNode.dispose(),this.currentOutputNode=e,this.needsUpdateOutputNode=!0}resetCurrentOutputNode(){this.currentOutputNode.dispose(),this.currentOutputNode=d.pass(this.scene,this.camera),this.needsUpdateOutputNode=!0}#t(){let e=this.currentOutputNode;this.#e.size>0&&this.#e.forEach(t=>{e=d.blendColor(e,t)}),this.outputNode=e,this.needsUpdate=!0}render(){this.needsUpdateOutputNode&&(this.#t(),this.needsUpdateOutputNode=!1),super.render()}}const Te={Vector2:r.Vector2,Vector3:r.Vector3,Vector4:r.Vector4,Quaternion:r.Quaternion,Matrix4:r.Matrix4,Spherical:r.Spherical,Box3:r.Box3,Sphere:r.Sphere,Raycaster:r.Raycaster};K.install({THREE:Te});class ee extends K{constructor(...e){super(...e),this.minDistance=.2,this.smoothTime=.2,this.dollySpeed=.2}absoluteRotations(){this.azimuthAngle=be(this.azimuthAngle,0)}async flyToBox(e,t={}){if(e.isEmpty())return console.warn("CameraControls.flyToBox: The provided Box3 is empty."),!1;this.absoluteRotations();const{viewpoint:s="frontTop",enableTransition:n=!0,padding:i=.1,cover:o=!1}=t,h=[];if(s!=="current"){const a=$[s.toUpperCase()]??$.FRONTTOP,l=a.theta,u=a.phi;h.push(this.fitToBox(e,n,{paddingLeft:i,paddingRight:i,paddingTop:i,paddingBottom:i,cover:o})),h.push(this.rotateTo(l,u,n))}else{const a=new r.Sphere;e.getBoundingSphere(a),a.radius+=i,h.push(this.fitToSphere(a,n))}return await Promise.all(h),!0}async flyToObject(e,t={}){const s=new r.Box3().setFromObject(e);return this.flyToBox(s,t)}}const $={LEFT:new r.Spherical(0,Math.PI/2,-Math.PI/2),RIGHT:new r.Spherical(0,Math.PI/2,Math.PI/2),FRONT:new r.Spherical(0,Math.PI/2,0),BACK:new r.Spherical(0,Math.PI/2,Math.PI),TOP:new r.Spherical(0,0,0),BOTTOM:new r.Spherical(0,Math.PI,0),FRONTTOP:new r.Spherical(0,Math.PI/4,0),BACKTOP:new r.Spherical(0,Math.PI/4,Math.PI),LEFTTOP:new r.Spherical(0,Math.PI/4,-Math.PI/2),RIGHTTOP:new r.Spherical(0,Math.PI/4,Math.PI/2),LEFTFRONTTOP:new r.Spherical(0,Math.PI/4,-Math.PI/4),RIGHTFRONTTOP:new r.Spherical(0,Math.PI/4,Math.PI/4),LEFTBACKTOP:new r.Spherical(0,Math.PI/4,-Math.PI/4*3),RIGHTBACKTOP:new r.Spherical(0,Math.PI/4,Math.PI/4*3)};function be(c,e){const t=c-e;return r.MathUtils.euclideanModulo(t+Math.PI,Math.PI*2)-Math.PI}class te{environment=new pe.RoomEnvironment;renderer;pmremGenerator;envMap=null;constructor(e){this.renderer=e,this.pmremGenerator=new r.PMREMGenerator(e)}update(){this.envMap||(this.envMap=this.pmremGenerator.fromScene(this.environment).texture)}dispose(){this.pmremGenerator.dispose(),this.envMap?.dispose()}}const U=128;class Ce extends ue.ViewHelper{viewer;overlayPass;constructor(e){super(e.camera,e.el),this.viewer=e;const t=new r.OrthographicCamera(-2,2,2,-2,0,4);t.position.set(0,0,2),this.overlayPass=d.pass(this,t),this.setLabels("x","y","z")}_update=()=>{this.quaternion.copy(this.viewer.camera.quaternion).invert();const e=this.location;let t,s;e.left!==null?t=e.left:t=this.viewer.el.offsetWidth-U-e.right,e.top!==null?s=e.top:s=this.viewer.el.offsetHeight-U-e.bottom,this.overlayPass.setViewport(t,s,U,U)};enable(){return this.viewer.renderPipeline.addOverlayPass(this.overlayPass),this.viewer.addEventListener("beforeRender",this._update),this.viewer.render(),this}disable(){return this.viewer.renderPipeline.removeOverlayPass(this.overlayPass),this.viewer.removeEventListener("beforeRender",this._update),this.viewer.render(),this}}class xe{el;renderer;container;drawCallsText;frameCallsText;trianglesText;pointsText;linesText;timestampText;_enabled=!1;constructor(e,t){this.el=e,this.renderer=t;const s=document.createElement("div");s.style.position="absolute",s.style.left="12px",s.style.bottom="12px",s.style.fontSize="12px",s.style.color="#fff",s.style.pointerEvents="none",this.container=s;function n(o,h=!0){const a=document.createElement("span");return h&&(a.style.marginLeft="6px"),a.innerText=o,a}function i(){return document.createElement("br")}this.drawCallsText=n("0"),this.frameCallsText=n("0"),this.trianglesText=n("0"),this.linesText=n("0"),this.pointsText=n("0"),this.timestampText=n("0"),this.container.appendChild(n("draw calls",!1)),this.container.appendChild(this.drawCallsText),this.container.appendChild(i()),this.container.appendChild(n("frame calls",!1)),this.container.appendChild(this.frameCallsText),this.container.appendChild(i()),this.container.appendChild(n("triangles",!1)),this.container.appendChild(this.trianglesText),this.container.appendChild(i()),this.container.appendChild(n("points",!1)),this.container.appendChild(this.pointsText),this.container.appendChild(i()),this.container.appendChild(n("lines",!1)),this.container.appendChild(this.linesText),this.container.appendChild(i()),this.container.appendChild(n("timestamp",!1)),this.container.appendChild(this.timestampText),this.container.appendChild(i())}update(){if(this._enabled){const{render:e}=this.renderer.info;this.drawCallsText.innerText=e.drawCalls.toString(),this.frameCallsText.innerText=e.frameCalls.toString(),this.trianglesText.innerText=e.triangles.toString(),this.pointsText.innerText=e.points.toString(),this.linesText.innerText=e.lines.toString(),this.renderer.resolveTimestampsAsync(r.TimestampQuery.RENDER).then(t=>{this.timestampText.innerText=t?.toFixed(2)??"0"})}}enable(){this._enabled=!0,this.el.appendChild(this.container)}disable(){this._enabled=!1,this.container.remove()}dispose(){this.disable()}}r.Cache.enabled=!0;class Se extends r.EventDispatcher{el;renderer;scene;camera;info;controls;renderPipeline;timer;roomEnvironment;interactionManager;objectManager;viewerHelper;frameCount=1;frameloop="demand";constructor({el:e,rendererOptions:t}){super(),this.el=e,this.renderer=this._initRenderer(t),this.scene=this.createScene(),this.camera=this.createPerspectiveCamera(),this.info=new xe(this.el,this.renderer),this.controls=new ee(this.camera,this.renderer.domElement),this.renderPipeline=new Ee(this.renderer,this.scene,this.camera),this.timer=new r.Timer,this.roomEnvironment=new te(this.renderer),this.interactionManager=new J(this.renderer.domElement,this.scene,this.camera),this.objectManager=new Z,this.viewerHelper=new Ce(this),window.addEventListener("resize",this.onWindowResize)}onWindowResize=()=>{const e=this.el.clientWidth,t=this.el.clientHeight;this.camera instanceof r.PerspectiveCamera?(this.camera.aspect=e/t,this.camera.updateProjectionMatrix()):this.camera instanceof r.OrthographicCamera&&(this.camera.left=-e/2,this.camera.right=e/2,this.camera.top=t/2,this.camera.bottom=-t/2,this.camera.updateProjectionMatrix()),this.renderer.setSize(e,t),this.render()};async init(){await this.renderer.init(),this.roomEnvironment.update(),this.scene.environment=this.roomEnvironment.envMap}setCamera(e){this.camera=e,this.controls.camera=e,this.interactionManager.setCamera(e),this.renderPipeline.setCamera(e),this.onWindowResize(),this.dispatchEvent({type:"cameraChange",camera:e})}setCameraByType(e){e==="perspective"&&!(this.camera instanceof r.PerspectiveCamera)?this.setCamera(this.createPerspectiveCamera()):e==="orthographic"&&!(this.camera instanceof r.OrthographicCamera)&&this.setCamera(this.createOrthographicCamera())}render(e=1){return this.frameCount+=e,new Promise(t=>{const s=()=>{this.removeEventListener("afterRender",s),t()};this.addEventListener("afterRender",s)})}animate=e=>{this.timer.update(e),this.dispatchEvent({type:"beforeControlsUpdate",time:e});let t=this.controls.update(this.timer.getDelta());this.dispatchEvent({type:"afterControlsUpdate",time:e}),this.frameCount>0&&(this.frameCount--,t=!0),this.frameloop==="always"&&(t=!0),t&&(this.dispatchEvent({type:"beforeRender",time:e}),this.renderer.info.reset(),this.renderPipeline.render(),this.info.update(),this.dispatchEvent({type:"afterRender",time:e}))};_initRenderer(e){const t=new r.WebGPURenderer({logarithmicDepthBuffer:!0,antialias:!1,depth:!1,trackTimestamp:!0,...e});return t.setSize(this.el.clientWidth,this.el.clientHeight),t.shadowMap.enabled=!0,t.shadowMap.type=r.PCFShadowMap,t.toneMapping=r.AgXToneMapping,t.toneMappingExposure=1,t.info.autoReset=!1,t.setPixelRatio(window.devicePixelRatio),t.setAnimationLoop(this.animate),this.el.appendChild(t.domElement),t}createScene(){const e=new r.Scene;return e.background=new r.Color(0),e}createPerspectiveCamera(){const e=new r.PerspectiveCamera(50,this.el.clientWidth/this.el.clientHeight,.1,1e5);return e.position.setScalar(5),e}createOrthographicCamera(){const e=new r.OrthographicCamera(-this.el.clientWidth/2,this.el.clientWidth/2,this.el.clientHeight/2,-this.el.clientHeight/2,.1,1e5);return e.position.setScalar(5),e}dispose(){this.el.removeChild(this.renderer.domElement),window.removeEventListener("resize",this.onWindowResize),this.info.dispose(),this.interactionManager.dispose(),this.roomEnvironment.dispose(),this.renderPipeline.dispose(),this.renderer.dispose()}}class se extends V.GLTFLoader{constructor(e){super(e)}parse(e,t,s,n){if(Oe(e.slice(0,8))==="SBMG----"){const o=Le(e.slice(8));return super.parse(o,t,s,n)}else return super.parse(e,t,s,n)}}function Oe(c){return new TextDecoder().decode(new Uint8Array(c))}function Le(c){const e=new DataView(c);for(let t=0;t<e.byteLength;t++){const s=e.getUint8(t),n=(s>>4&15)+(s<<4&240);e.setUint8(t,n)}return e.buffer}const Pe=8,Ie=130,X=66,Be="SBK-----",_e="SBM-----",ne=new TextDecoder,Re=new TextEncoder;function Ne(c){let e=Pe;const t=new Uint8Array(c,0,e);if(ne.decode(t)!==Be)return c;e+=Ie;const n=new Uint8Array(c,0,e);if(n[40]===1){const o=Re.encode(_e),h=new Uint8Array([n[41]]),a=Ae(n),l=Ue(a);let u=X%l.length;const g=e+X,v=new Uint8Array(c,g),m=new Uint8Array(v.length);for(let f=0;f<v.length;f++)m[f]=v[f]^l[u],u=(u+1)%l.length;const y=new Uint8Array(o.length+h.length+m.length);return y.set(o),y.set(h,o.length),y.set(m,o.length+h.length),y.buffer}}function Ae(c){const e=new Uint8Array(128);return e.set(c.slice(42,74),0),e.set(c.slice(74,138),32),e.set(c.slice(8,40),96),e}function Ue(c){const e=new Uint8Array(64);return e.set(c.slice(0,8),0),e.set(c.slice(24,32),8),e.set(c.slice(40,56),16),e.set(c.slice(64,88),32),e.set(c.slice(96,104),56),e}const je=(c,e,t)=>{const s=c.buffer.slice(t,t+e);let n=ne.decode(s);return n=n.replace("\\","/"),n.startsWith("Maps/")||(n=`Maps/${n}`),n},De=(c,e,t)=>{const[s,n,i,o,h]=e,a=t||o<1;return new r.MeshStandardNodeMaterial({name:c,color:new r.Color(s,n,i),opacity:o,transparent:a,alphaTest:.01,side:h})},Ge=c=>c?.toLowerCase().endsWith(".png")??!1;class ke{data;options;textureLoader;littleEndian=!0;materials=new Map;constructor(e,t){this.data=e,this.options=t,this.textureLoader=new r.TextureLoader(t.manager),this.textureLoader.setCrossOrigin(t.crossOrigin),this.textureLoader.setRequestHeader(t.requestHeader)}parse(e,t){let s=this.data;const n=Ne(this.data);n&&(s=n);const i=new DataView(s);let o=8;const h=i.getUint8(o);o+=1,h===1?this._parseV2(i,o,e):h===2?this._parseV2(i,o,e):h===3?this._parseV3(i,o,e):t?.(new Error(`SBMLoader: Unsupported SBM version: ${h}`))}_parseV2(e,t,s){const n=new r.Group,i=e.getUint16(t,this.littleEndian);t+=2;const o=e.getUint16(t,this.littleEndian);t+=2;for(let h=0;h<i;++h){const a=e.getUint16(t,this.littleEndian).toString();t+=2,t+=4,t+=4,t+=4,t+=4;const l=e.getFloat32(t,this.littleEndian);t+=4;const u=e.getFloat32(t,this.littleEndian);t+=4;const g=e.getFloat32(t,this.littleEndian);t+=4;const v=e.getFloat32(t,this.littleEndian);t+=4,t+=4,t+=4,t+=4,t+=4;let m=e.getUint8(t);t+=1,m===0?m=r.FrontSide:m===1?m=r.BackSide:m===2&&(m=r.DoubleSide);const y=e.getUint16(t,this.littleEndian);t+=2;const f=y>0?je(e,y,t):"";if(t+=y,!this.materials.has(a)){const E=De(a,[l,u,g,v,m],Ge(f));this.materials.set(a,E),f&&this.options.path&&this.textureLoader.load(r.LoaderUtils.resolveURL(f,this.options.path),T=>{T.colorSpace=r.SRGBColorSpace,T.wrapS=r.RepeatWrapping,T.wrapT=r.RepeatWrapping,T.flipY=!1,T.anisotropy=16,E.map=T})}}for(let h=0;h<o;++h){const a=e.getUint16(t,this.littleEndian).toString();t+=2;const l=e.getUint16(t,this.littleEndian).toString();t+=2;const u=[],g=[],v=[],m=[],y=e.getUint16(t,this.littleEndian);if(t+=2,y>0)for(let w=0;w<y;w++){const M=new r.Vector3;M.setX(e.getFloat32(t,this.littleEndian)),t+=4,M.setY(e.getFloat32(t,this.littleEndian)),t+=4,M.setZ(e.getFloat32(t,this.littleEndian)),t+=4,u.push(M)}const f=e.getUint16(t,this.littleEndian);if(t+=2,f>0)for(let w=0;w<f;w++)t+=4,t+=4,t+=4;const b=e.getUint16(t,this.littleEndian);if(t+=2,b>0)for(let w=0;w<b;w++){const M=new r.Vector2;M.setX(e.getFloat32(t,this.littleEndian)),t+=4,M.setY(e.getFloat32(t,this.littleEndian)),t+=4,g.push(M)}const E=e.getUint16(t,this.littleEndian);if(t+=2,E>0)for(let w=0;w<E;w++){const M=e.getUint16(t,this.littleEndian);t+=2;const I=e.getUint16(t,this.littleEndian);t+=2;const _=e.getUint16(t,this.littleEndian);t+=2;const O=[M,I,_];v.push(O),g.length>0&&m.push([g[O[0]],g[O[1]],g[O[2]]])}const T=[],C=[];for(let w=0;w<v.length;w++){const M=v[w],I=u[M[0]],_=u[M[1]],O=u[M[2]];T.push(...I.toArray(),..._.toArray(),...O.toArray());let q=new r.Vector2,z=new r.Vector2,W=new r.Vector2;const A=m[w];A!==void 0&&(q=A[0],z=A[1],W=A[2]),C.push(...q.toArray(),...z.toArray(),...W.toArray())}const x=new Float32Array(T),S=new Float32Array(C),L=new r.BufferGeometry;if(x.length>0&&L.setAttribute("position",new r.BufferAttribute(x,3)),S.length>0&&L.setAttribute("uv",new r.BufferAttribute(S,2)),L.computeVertexNormals(),this.materials.has(l)){const w=new r.Mesh(L,this.materials.get(l));w.name=a,w.castShadow=!0,w.receiveShadow=!0,n.add(w)}}s(n)}_parseV3(e,t,s){const n=new r.Group;console.warn("SBMLoader: SBM version 3 is not supported yet."),s(n)}}class re extends r.Loader{load(e,t,s,n){let i;if(this.resourcePath!=="")i=this.resourcePath;else if(this.path!==""){const a=r.LoaderUtils.extractUrlBase(e);i=r.LoaderUtils.resolveURL(a,this.path)}else i=r.LoaderUtils.extractUrlBase(e);this.manager.itemStart(e);const o=a=>{n?n(a):console.error(a),this.manager.itemError(e),this.manager.itemEnd(e)},h=new r.FileLoader(this.manager);h.setPath(this.path),h.setResponseType("arraybuffer"),h.setRequestHeader(this.requestHeader),h.setWithCredentials(this.withCredentials),h.load(e,a=>{try{this.parse(a,i,l=>{t(l),this.manager.itemEnd(e)},o)}catch(l){o(l)}},s,o)}parse(e,t,s,n){const i=new TextDecoder().decode(e.slice(0,8));if(i!=="SBK-----"&&i!=="SBM-----"){n?.(new Error(`SBMLoader: Invalid SBM format: ${i}`));return}new ke(e,{path:t,crossOrigin:this.crossOrigin,requestHeader:this.requestHeader,manager:this.manager}).parse(s,n)}parseAsync(e,t){return new Promise((s,n)=>{this.parse(e,t,i=>{s(i)},i=>{n(i)})})}}class P{static CACHE_NAME="u-space-model-loader-cache";static fileLoader=new r.FileLoader().setResponseType("arraybuffer");static dracoLoader=new ye.DRACOLoader().setDecoderPath(`https://cdn.jsdelivr.net/npm/three@0.${r.REVISION}.0/examples/jsm/libs/draco/`);static ktx2Loader=new fe.KTX2Loader().setTranscoderPath(`https://cdn.jsdelivr.net/npm/three@0.${r.REVISION}.0/examples/jsm/libs/basis/`);static gltfLoader=new V.GLTFLoader().setDRACOLoader(P.dracoLoader).setKTX2Loader(P.ktx2Loader).setMeshoptDecoder(Q.MeshoptDecoder);static sbmxLoader=new se().setDRACOLoader(P.dracoLoader).setKTX2Loader(P.ktx2Loader).setMeshoptDecoder(Q.MeshoptDecoder);static sbmLoader=new re;static fbxLoader=new me.FBXLoader;static objLoader=new ge.OBJLoader;static stlLoader=new we.STLLoader;static setLoadingManager(e){this.fileLoader.manager=e,this.dracoLoader.manager=e,this.ktx2Loader.manager=e,this.gltfLoader.manager=e,this.sbmxLoader.manager=e,this.sbmLoader.manager=e,this.fbxLoader.manager=e,this.objLoader.manager=e,this.stlLoader.manager=e}static async setRenderer(e){await e.init(),this.ktx2Loader.detectSupport(e)}static setDracoPath(e){this.dracoLoader.setDecoderPath(e)}static setKTX2Path(e){this.ktx2Loader.setTranscoderPath(e)}static async loadAsync(e,t={persistent:!0}){const s=e.split(".").pop()?.split("?")[0].toLowerCase();let n;switch(t.persistent&&typeof caches<"u"?n=await this.getPersistentData(e):n=await this.fileLoader.loadAsync(e),s){case"gltf":case"glb":return(await this.gltfLoader.parseAsync(n,r.LoaderUtils.extractUrlBase(e))).scene;case"sbmx":return(await this.sbmxLoader.parseAsync(n,r.LoaderUtils.extractUrlBase(e))).scene;case"sbm":return await this.sbmLoader.parseAsync(n,r.LoaderUtils.extractUrlBase(e));case"fbx":return this.fbxLoader.parse(n,r.LoaderUtils.extractUrlBase(e));case"obj":const l=new TextDecoder().decode(n);return this.objLoader.parse(l);case"stl":const g=this.stlLoader.parse(n);return new r.Mesh(g,new r.MeshStandardNodeMaterial);default:throw new Error(`Unsupported model format: ${s}`)}}static async getPersistentData(e){try{const t=await caches.open(this.CACHE_NAME),s=await t.match(e);if(s)return await s.arrayBuffer();const n=await this.fileLoader.loadAsync(e),i=new Response(n);return await t.put(e,i),n}catch(t){return console.warn(`[LoaderManager] Failed to use Cache API for ${e}:`,t),await this.fileLoader.loadAsync(e)}}}class Fe{static textureLoader=new r.TextureLoader;static hdrLoader=new ve.HDRLoader;static cubeTextureLoader=new r.CubeTextureLoader;static setLoadingManager(e){this.textureLoader.manager=e,this.hdrLoader.manager=e,this.cubeTextureLoader.manager=e}static async loadAsyncTexture(e){return await this.textureLoader.loadAsync(e)}static async loadAsyncHDR(e){const t=await this.hdrLoader.loadAsync(e);return t.mapping=r.EquirectangularReflectionMapping,t}static async loadAsyncCubeTexture(e,t){return this.cubeTextureLoader.setPath(e),await this.cubeTextureLoader.loadAsync(t)}}class B extends r.Mesh{isBaseMesh=!0;type="BaseMesh";ignoreInvisibleWhenRaycast=!0;constructor(...e){super(...e)}raycast(e,t){return this.visible===!1&&this.ignoreInvisibleWhenRaycast===!0?!1:super.raycast(e,t)}}class G extends r.Group{isBaseGroup=!0;type="BaseGroup";ignoreInvisibleWhenRaycast=!0;constructor(...e){super(...e)}raycast(e,t){return this.visible===!1&&this.ignoreInvisibleWhenRaycast===!0?!1:super.raycast(e,t)}}class ie extends r.Sprite{isBaseSprite=!0;type="BaseSprite";ignoreInvisibleWhenRaycast=!0;constructor(...e){super(...e)}raycast(e,t){return this.visible===!1&&this.ignoreInvisibleWhenRaycast===!0?!1:super.raycast(e,t)}}class N extends G{isModel=!0;type="Model";static memoryCache=new Map;constructor(){super()}async loadAsync(e){const{url:t,cache:s=!0,persistent:n=!0}=e;try{let i;s?N.memoryCache.has(t)?i=N.memoryCache.get(t):(i=P.loadAsync(t,{persistent:n}),N.memoryCache.set(t,i)):i=P.loadAsync(t,{persistent:n});const o=await i,h=Me.clone(o);return this.add(h),h}catch(i){return console.error(`[Model] Failed to load model from ${t}:`,i),null}}static clearMemoryCache(){this.memoryCache.clear()}static async clearPersistentCache(){typeof caches<"u"&&await caches.delete("u-space-loader-cache")}}class ae extends B{isSphereMesh=!0;type="SphereMesh";constructor({geometryParameters:e,materialParameters:t}={}){super(),this.geometry=new r.SphereGeometry(e?.radius,e?.widthSegments,e?.heightSegments,e?.phiStart,e?.phiLength,e?.thetaStart,e?.thetaLength),this.material=new r.MeshStandardNodeMaterial(t)}}class D extends B{isTubeMesh=!0;type="TubeMesh";constructor({geometryParameters:e,materialParameters:t}={}){super(),this.geometry=new r.TubeGeometry(e?.path,e?.tubularSegments,e?.radius,e?.radialSegments,e?.closed),this.material=new r.MeshStandardNodeMaterial(t)}}class He extends G{isTopology=!0;type="Topology";parameters={nodeColor:255,nodeRadius:.5,edgeColor:65280,edgeRadius:.1,pathColor:16711935,pathRadius:.2};nodes=new Map;adjacencyMap=new Map;graphGroup=null;pathMeshes=[];constructor(e){super(),e&&Object.assign(this.parameters,e)}addNode(e,t){this.nodes.has(e)&&console.warn(`[Topology] Node ${e} already exists. Overwriting.`),this.nodes.set(e,t),this.adjacencyMap.has(e)||this.adjacencyMap.set(e,new Map)}removeNode(e){if(!this.nodes.has(e)){console.warn(`[Topology] Node ${e} does not exist.`);return}this.nodes.delete(e),this.adjacencyMap.delete(e)}addEdge(e,t,s,n=!0){const i=this.nodes.get(e),o=this.nodes.get(t);if(!i||!o){console.error(`[Topology] Cannot add edge. One or both nodes not found: ${e}, ${t}`);return}const h=s??i.distanceTo(o);this.getNeighbors(e)?.set(t,h),n&&this.getNeighbors(t)?.set(e,h)}removeEdge(e,t,s=!0){this.getNeighbors(e)?.delete(t),s&&this.getNeighbors(t)?.delete(e)}getShortestPath(e,t){if(!this.nodes.has(e)||!this.nodes.has(t))return console.warn("[Topology] Start or End node not found."),[];const s=new Map,n=new Map,i=new Set;for(const[a]of this.nodes)s.set(a,1/0),n.set(a,null),i.add(a);for(s.set(e,0);i.size>0;){let a=null,l=1/0;for(const g of i){const v=s.get(g);v<l&&(l=v,a=g)}if(a===null||a===t||l===1/0)break;i.delete(a);const u=this.adjacencyMap?.get(a);if(u)for(const[g,v]of u){if(!i.has(g))continue;const m=s.get(a)+v;m<s.get(g)&&(s.set(g,m),n.set(g,a))}}const o=[];let h=t;if(n.get(t)===null&&e!==t)return[];for(;h!==null;){const a=this.nodes.get(h);a&&o.unshift(a),h=n.get(h)||null}return o}renderGraph(){this.clearGraph(),this.graphGroup=new r.Group;const e=new ae({geometryParameters:{radius:this.parameters.nodeRadius,widthSegments:16,heightSegments:16},materialParameters:{color:this.parameters.nodeColor}});this.nodes.forEach((s,n)=>{const i=e.clone();i.position.copy(s),Object.assign(i.userData,{id:n,type:"node"}),this.graphGroup.add(i)});const t=new Set;this.adjacencyMap.forEach((s,n)=>{s.forEach((i,o)=>{const h=[n,o].sort().join("-");if(t.has(h))return;t.add(h);const a=this.nodes.get(n),l=this.nodes.get(o);if(a&&l){const u=new r.LineCurve3(a,l),g=new D({geometryParameters:{path:u,tubularSegments:1,radius:this.parameters.edgeRadius,radialSegments:8,closed:!1},materialParameters:{color:this.parameters.edgeColor}});Object.assign(g.userData,{from:n,to:o,weight:i,type:"edge"}),this.graphGroup.add(g)}})}),this.add(this.graphGroup)}clearGraph(){this.graphGroup&&(this.remove(this.graphGroup),this.graphGroup.traverse(e=>{e instanceof r.Mesh&&(e.geometry.dispose(),e.material.dispose())}),this.graphGroup=null)}renderPath(e,t=this.parameters.pathColor){if(e.length<2)return;const s=new r.CatmullRomCurve3(e,!1,"catmullrom",0),n=new D({geometryParameters:{path:s,tubularSegments:e.length*10,radius:this.parameters.pathRadius,closed:!1},materialParameters:{color:t}});return this.add(n),this.pathMeshes.push(n),n}clearPaths(){this.pathMeshes.forEach(e=>{this.remove(e),e.geometry.dispose(),e.material.dispose()}),this.pathMeshes=[]}exportData(){const e={};this.nodes.forEach((n,i)=>{e[i]={x:n.x,y:n.y,z:n.z}});const t=[],s=new Set;return this.adjacencyMap.forEach((n,i)=>{n.forEach((o,h)=>{const a=[i,h].sort().join("-");s.has(a)||(s.add(a),t.push({from:i,to:h,weight:o}))})}),{nodes:e,edges:t}}importData(e){this.clearGraph(),this.clearPaths(),this.nodes.clear(),this.adjacencyMap.clear(),Object.entries(e.nodes).forEach(([t,s])=>{this.addNode(t,new r.Vector3(s.x,s.y,s.z))}),e.edges.forEach(({from:t,to:s,weight:n})=>{this.addEdge(t,s,n)}),this.renderGraph()}dispose(){this.clearGraph(),this.clearPaths()}getNeighbors(e){return this.adjacencyMap.get(e)}}class qe extends ie{isPoi=!0;type="Poi";parameters={img:"",text:"",fontSize:32,fontFamily:"Arial",color:"#ffffff",iconSize:64,padding:10,backgroundColor:"rgba(0, 0, 0, 0.5)",borderRadius:8,textPosition:"right"};constructor(e={}){super(new r.SpriteNodeMaterial),Object.assign(this.parameters,e)}async updateAsync(e={}){Object.assign(this.parameters,e);const t=document.createElement("canvas"),s=t.getContext("2d");if(!s)return;s.font=`${this.parameters.fontSize}px ${this.parameters.fontFamily}`;let n=null;this.parameters.img&&(n=await this._loadImage(this.parameters.img));const{text:i,fontSize:o,color:h,iconSize:a,padding:l,backgroundColor:u,borderRadius:g,textPosition:v}=this.parameters,m=s.measureText(i),y=i?m.width:0,f=i?o:0;let b=0,E=0,T=0,C=0,x=0,S=0;const L=!!n,w=!!i;if(L&&w)switch(v){case"top":b=Math.max(a,y),E=a+l+f,x=(b-y)/2,S=f/2,T=(b-a)/2,C=f+l;break;case"bottom":b=Math.max(a,y),E=a+l+f,T=(b-a)/2,C=0,x=(b-y)/2,S=a+l+f/2;break;case"left":b=a+l+y,E=Math.max(a,f),x=0,S=E/2,T=y+l,C=(E-a)/2;break;default:b=a+l+y,E=Math.max(a,f),T=0,C=(E-a)/2,x=a+l,S=E/2;break}else L?(b=a,E=a,T=0,C=0):w&&(b=y,E=f,x=0,S=f/2);const M=b+l*2,I=E+l*2;t.width=M,t.height=I,s.font=`${o}px ${this.parameters.fontFamily}`,s.textBaseline="middle",u&&(s.fillStyle=u,this._drawRoundedRect(s,0,0,M,I,g),s.fill()),L&&s.drawImage(n,T+l,C+l,a,a),w&&(s.fillStyle=h,s.fillText(i,x+l,S+l)),this.material.map?.dispose();const _=new r.CanvasTexture(t);_.colorSpace=r.SRGBColorSpace,this.material.map=_;const O=.01;this.scale.set(M*O,I*O,1)}_loadImage(e){return new Promise((t,s)=>{if(typeof e=="string"){const n=new Image;n.crossOrigin="Anonymous",n.onload=()=>t(n),n.onerror=i=>s(i),n.src=e}else t(e)})}_drawRoundedRect(e,t,s,n,i,o){e.beginPath(),e.moveTo(t+o,s),e.lineTo(t+n-o,s),e.quadraticCurveTo(t+n,s,t+n,s+o),e.lineTo(t+n,s+i-o),e.quadraticCurveTo(t+n,s+i,t+n-o,s+i),e.lineTo(t+o,s+i),e.quadraticCurveTo(t,s+i,t,s+i-o),e.lineTo(t,s+o),e.quadraticCurveTo(t,s,t+o,s),e.closePath()}dispose(){this.material.map?.dispose(),this.material.dispose()}}class k extends B{isShapeMesh=!0;type="ShapeMesh";constructor({geometryParameters:e,materialParameters:t}={}){super(),this.geometry=new r.ShapeGeometry(e?.shape,e?.curveSegments),this.material=new r.MeshStandardNodeMaterial(t),this.geometry.rotateX(-Math.PI/2)}static createFromPoints(e,t={}){return new k({...t,geometryParameters:{...t.geometryParameters,shape:new r.Shape(e.map(s=>new r.Vector2(s.x,-s.z)))}})}}class F extends B{isExtrudeMesh=!0;type="ExtrudeMesh";constructor({geometryParameters:e,materialParameters:t}={}){super(),this.geometry=new r.ExtrudeGeometry(e?.shape,e?.options),this.material=new r.MeshStandardNodeMaterial(t),this.geometry.rotateX(-Math.PI/2)}static createFromPoints(e,t={}){return new F({...t,geometryParameters:{...t.geometryParameters,shape:new r.Shape(e.map(s=>new r.Vector2(s.x,-s.z)))}})}}class ze extends B{isPlaneMesh=!0;type="PlaneMesh";constructor({geometryParameters:e,materialParameters:t}={}){super(),this.geometry=new r.PlaneGeometry(e?.width,e?.height,e?.widthSegments,e?.heightSegments),this.material=new r.MeshStandardNodeMaterial(t)}}class We extends B{isCircleMesh=!0;type="CircleMesh";constructor({geometryParameters:e,materialParameters:t}={}){super(new r.CircleGeometry(e?.radius,e?.segments,e?.thetaStart,e?.thetaLength),new r.MeshStandardNodeMaterial(t)),this.geometry.rotateX(-Math.PI/2)}}class oe{static traverseMeshes(e,t){e.traverse(s=>{s instanceof r.Mesh&&t(s)})}}class Qe{static flow(e={}){const{baseColor:t=16777215,flowColor:s=65280,speed:n=1,scale:i=3,intensity:o=4}=e,h=d.color(new R.Color(t)),a=d.color(new R.Color(s)),l=d.uv().x.mul(i).sub(d.time.mul(n)),u=d.pow(d.sin(l).add(1).mul(.5),o);return d.mix(h,a,u)}static breathe(e={}){const{baseColor:t=16777215,breathColor:s=65280,speed:n=1,intensity:i=2}=e,o=d.color(new R.Color(t)),h=d.color(new R.Color(s)),a=d.sin(d.time.mul(n)).add(1).mul(.5),l=d.pow(a,i);return d.mix(o,h,l)}static fluid(e={}){const{baseColor:t=16777215,flowColor:s=255,speed:n=1,scale:i=1,intensity:o=1,distortion:h=.5}=e,a=d.color(new R.Color(t)),l=d.color(new R.Color(s)),u=d.uv().mul(i),g=d.time.mul(n),v=d.mx_noise_float(u.add(g),1,0),m=u.add(v.mul(h)),y=d.mx_noise_float(m,1,0).add(1).mul(.5),f=d.pow(y,o);return d.mix(a,l,f)}}function $e(c){}const j="uSpaceHighlight",H=`${j}/enabled`,ce=`${j}/opacity`,he=`${j}/color`,le=`${j}/overwrite`,Xe=d.Fn(()=>{const c=d.userData(H,"uint"),e=d.userData(he,"uint"),t=d.userData(le,"uint"),s=Ye(e),n=d.materialColor.mul(s),i=d.select(t.greaterThan(0),s,n);return d.select(c.greaterThan(0),i,d.materialColor)})(),Ke=d.Fn(()=>{const c=d.userData(H,"uint"),e=d.userData(ce,"float");return d.select(c.greaterThan(0),e,d.materialOpacity)})();class Ve{static highlight(e,t={}){const s=Object.assign({enabled:!0,opacity:.5,color:16711680,overwrite:!1},t);s.color=new r.Color(s.color).getHex(),oe.traverseMeshes(e,n=>{n.userData[H]=s.enabled?1:0,n.userData[ce]=s.opacity,n.userData[he]=s.color,n.userData[le]=s.overwrite?1:0;const i=n.material;i&&!Array.isArray(i)&&(i.transparent=!0,i.colorNode=Xe,i.opacityNode=Ke,i.needsUpdate=!0)})}}const Ye=c=>{const e=c.shiftRight(16).bitAnd(255).toFloat().div(255),t=c.shiftRight(8).bitAnd(255).toFloat().div(255),s=c.bitAnd(255).toFloat().div(255);return d.vec3(e,t,s)};class de extends p.Tween{viewer;constructor(e,t){super(t),this.viewer=e}_update=({time:e})=>{this.update(e)&&this.viewer.render()};easingByMode(e){const t=Ze[e];return super.easing(t)}start(e,t){return this.viewer.addEventListener("afterControlsUpdate",this._update),super.start(e,t)}stop(){return this.viewer.removeEventListener("afterControlsUpdate",this._update),super.stop()}}function Je(c,e,t,s={},n,i){return new Promise((o,h)=>{const{duration:a=1e3,delay:l=0,repeat:u=!1,mode:g="Linear.None",yoyo:v=!1}=s,m=new de(c,e).to(t,a).easingByMode(g).delay(l).onUpdate(y=>{n?.(y,m)}).onComplete(()=>{o()}).onStop(()=>{h("animation stop")}).onStart(()=>{i?.(m)});typeof u=="number"?m.repeat(u):typeof u=="boolean"&&u&&m.repeat(1/0),v&&m.repeatDelay(20),m.yoyo(v),m.start()})}const Ze={"Linear.None":p.Easing.Linear.None,"Quadratic.In":p.Easing.Quadratic.In,"Quadratic.Out":p.Easing.Quadratic.Out,"Quadratic.InOut":p.Easing.Quadratic.InOut,"Cubic.In":p.Easing.Cubic.In,"Cubic.Out":p.Easing.Cubic.Out,"Cubic.InOut":p.Easing.Cubic.InOut,"Quartic.In":p.Easing.Quartic.In,"Quartic.Out":p.Easing.Quartic.Out,"Quartic.InOut":p.Easing.Quartic.InOut,"Quintic.In":p.Easing.Quintic.In,"Quintic.Out":p.Easing.Quintic.Out,"Quintic.InOut":p.Easing.Quintic.InOut,"Sinusoidal.In":p.Easing.Sinusoidal.In,"Sinusoidal.Out":p.Easing.Sinusoidal.Out,"Sinusoidal.InOut":p.Easing.Sinusoidal.InOut,"Exponential.In":p.Easing.Exponential.In,"Exponential.Out":p.Easing.Exponential.Out,"Exponential.InOut":p.Easing.Exponential.InOut,"Circular.In":p.Easing.Circular.In,"Circular.Out":p.Easing.Circular.Out,"Circular.InOut":p.Easing.Circular.InOut,"Elastic.In":p.Easing.Elastic.In,"Elastic.Out":p.Easing.Elastic.Out,"Elastic.InOut":p.Easing.Elastic.InOut,"Back.In":p.Easing.Back.In,"Back.Out":p.Easing.Back.Out,"Back.InOut":p.Easing.Back.InOut,"Bounce.In":p.Easing.Bounce.In,"Bounce.Out":p.Easing.Bounce.Out,"Bounce.InOut":p.Easing.Bounce.InOut};exports.BaseGroup=G;exports.BaseMesh=B;exports.BaseSprite=ie;exports.CameraControls=ee;exports.CircleMesh=We;exports.ExtrudeMesh=F;exports.InteractionEvent=Y;exports.InteractionManager=J;exports.MaterialEffects=Ve;exports.Model=N;exports.ModelLoaderManager=P;exports.ObjectManager=Z;exports.ObjectUtils=oe;exports.PlaneMesh=ze;exports.Poi=qe;exports.RoomEnvironment=te;exports.SBMLoader=re;exports.SBMXLoader=se;exports.ShapeMesh=k;exports.SphereMesh=ae;exports.TSLEffects=Qe;exports.TextureLoaderManager=Fe;exports.Topology=He;exports.TubeMesh=D;exports.Tween=de;exports.Viewer=Se;exports.reinterpretType=$e;exports.tweenAnimation=Je;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("three/webgpu"),p=require("three/tsl"),K=require("camera-controls"),ue=require("three/addons/environments/RoomEnvironment.js"),me=require("three/addons/helpers/ViewHelper.js"),V=require("three/addons/loaders/GLTFLoader.js"),ge=require("three/addons/loaders/FBXLoader.js"),we=require("three/addons/loaders/OBJLoader.js"),fe=require("three/addons/loaders/STLLoader.js"),ye=require("three/addons/loaders/DRACOLoader.js"),ve=require("three/addons/loaders/KTX2Loader.js"),$=require("three/addons/libs/meshopt_decoder.module.js"),Me=require("three/addons/loaders/HDRLoader.js"),Te=require("three/addons/utils/SkeletonUtils.js"),N=require("three"),u=require("three/addons/libs/tween.module.js");class Y{type;target;currentTarget;intersect;originalEvent;_propagationStopped=!1;constructor(e){this.type=e.type,this.target=e.target,this.currentTarget=e.target,this.intersect=e.intersect,this.originalEvent=e.originalEvent}stopPropagation(){this._propagationStopped=!0}get propagationStopped(){return this._propagationStopped}}class J{domElement;scene;camera;raycaster=new n.Raycaster;pointer=new n.Vector2;hoveredObject=null;pointerDownTime=0;pointerDownPos=new n.Vector2;clickTimer=null;longPressThreshold=500;moveThreshold=.01;targetObjects;pointerMoveEventsEnabled=!1;constructor(e,t,s){this.domElement=e,this.scene=t,this.camera=s,this.raycaster.params.Points.threshold=.1,this.raycaster.params.Line.threshold=.1,this.targetObjects=this.scene.children,this._bindEvents()}setCamera(e){this.camera=e}_bindEvents(){this.domElement.addEventListener("click",this._onClick),this.domElement.addEventListener("dblclick",this._onDblClick),this.domElement.addEventListener("contextmenu",this._onContextMenu),this.domElement.addEventListener("pointerdown",this._onPointerDown),this.domElement.addEventListener("pointerup",this._onPointerUp),this.domElement.addEventListener("pointermove",this._onPointerMove)}_updatePointer(e){const t=this.domElement.getBoundingClientRect();this.pointer.x=(e.clientX-t.left)/t.width*2-1,this.pointer.y=-((e.clientY-t.top)/t.height)*2+1}_getIntersects(){return this.raycaster.setFromCamera(this.pointer,this.camera),this.raycaster.intersectObjects(this.targetObjects,!0)}_dispatchToTarget(e,t,s,i){const r=new Y({type:e,target:t,intersect:s,originalEvent:i});let a=t;for(;a&&!r.propagationStopped;)r.currentTarget=a,a.dispatchEvent({type:e,event:r}),a=a.parent}_handleEvent(e,t){this._updatePointer(t);const s=this._getIntersects();if(s.length===0)return;const i=s[0];this._dispatchToTarget(e,i.object,i,t)}_onClick=e=>{const t=Date.now()-this.pointerDownTime,s=this.pointer.distanceTo(this.pointerDownPos);if(!(t>this.longPressThreshold||s>this.moveThreshold)){if(this.clickTimer){clearTimeout(this.clickTimer),this.clickTimer=null;return}this.clickTimer=setTimeout(()=>{this._handleEvent("click",e),this.clickTimer=null},200)}};_onDblClick=e=>{this.clickTimer&&(clearTimeout(this.clickTimer),this.clickTimer=null),this._handleEvent("dblclick",e)};_onContextMenu=e=>{e.preventDefault()};_onPointerDown=e=>{this.pointerDownTime=Date.now(),this._updatePointer(e),this.pointerDownPos.copy(this.pointer),this._handleEvent("pointerdown",e)};_onPointerUp=e=>{if(this._updatePointer(e),e.button===2){const t=Date.now()-this.pointerDownTime,s=this.pointer.distanceTo(this.pointerDownPos);t<=this.longPressThreshold&&s<=this.moveThreshold&&this._handleEvent("rightclick",e)}this._handleEvent("pointerup",e)};_onPointerMove=e=>{if(!this.pointerMoveEventsEnabled)return;this._updatePointer(e);const t=this._getIntersects(),s=t.length>0?t[0].object:null,i=t.length>0?t[0]:null;this.hoveredObject!==s&&(this.hoveredObject&&this._dispatchToTarget("pointerleave",this.hoveredObject,null,e),this.hoveredObject=s,s&&i&&this._dispatchToTarget("pointerenter",s,i,e)),s&&i&&this._dispatchToTarget("pointermove",s,i,e)};dispose(){this.domElement.removeEventListener("click",this._onClick),this.domElement.removeEventListener("dblclick",this._onDblClick),this.domElement.removeEventListener("contextmenu",this._onContextMenu),this.domElement.removeEventListener("pointerdown",this._onPointerDown),this.domElement.removeEventListener("pointerup",this._onPointerUp),this.domElement.removeEventListener("pointermove",this._onPointerMove),this.hoveredObject=null}}class Z{idMap=new Map;nameMap=new Map;typeMap=new Map;objectIds=new Map;allObjects=new Set;add(e,t){if(this.idMap.has(e)){console.warn(`ObjectManager: Object with id ${e} already exists.`);return}this.idMap.set(e,t),this.allObjects.add(t),this.objectIds.has(t)||this.objectIds.set(t,new Set),this.objectIds.get(t).add(e),t.name&&(this.nameMap.has(t.name)||this.nameMap.set(t.name,new Set),this.nameMap.get(t.name).add(t)),t.type&&(this.typeMap.has(t.type)||this.typeMap.set(t.type,new Set),this.typeMap.get(t.type).add(t))}getById(e){return this.idMap.get(e)}getByName(e){return this.nameMap.get(e)||new Set}getByType(e){return this.typeMap.get(e)||new Set}getObjectIds(e){return this.objectIds.get(e)||new Set}remove(e){const t=this.objectIds.get(e);if(t){for(const s of t)this.idMap.delete(s);this.objectIds.delete(e)}if(e.name&&this.nameMap.has(e.name)){const s=this.nameMap.get(e.name);s.delete(e),s.size===0&&this.nameMap.delete(e.name)}if(e.type&&this.typeMap.has(e.type)){const s=this.typeMap.get(e.type);s.delete(e),s.size===0&&this.typeMap.delete(e.type)}this.allObjects.delete(e)}removeById(e){const t=this.idMap.get(e);t&&this.remove(t)}removeByName(e){const t=this.getByName(e);for(const s of t)this.remove(s)}removeByType(e){const t=this.getByType(e);for(const s of t)this.remove(s)}clear(){this.idMap.clear(),this.nameMap.clear(),this.typeMap.clear(),this.objectIds.clear(),this.allObjects.clear()}getAll(){return this.allObjects}get size(){return this.allObjects.size}}class Ee extends n.RenderPipeline{scene;camera;currentOutputNode;needsUpdateOutputNode;#e;constructor(...e){const[t,s,i]=e;super(t),this.scene=s,this.camera=i,this.currentOutputNode=p.pass(s,i),this.needsUpdateOutputNode=!0,this.#e=new Set}addOverlayPass(e){this.#e.add(e),this.needsUpdateOutputNode=!0}removeOverlayPass(e){this.#e.delete(e),this.needsUpdateOutputNode=!0}setCamera(e){this.camera=e,this.needsUpdateOutputNode=!0}setCurrentOutputNode(e){this.currentOutputNode.dispose(),this.currentOutputNode=e,this.needsUpdateOutputNode=!0}resetCurrentOutputNode(){this.currentOutputNode.dispose(),this.currentOutputNode=p.pass(this.scene,this.camera),this.needsUpdateOutputNode=!0}#t(){let e=this.currentOutputNode;this.#e.size>0&&this.#e.forEach(t=>{e=p.blendColor(e,t)}),this.outputNode=e,this.needsUpdate=!0}render(){this.needsUpdateOutputNode&&(this.#t(),this.needsUpdateOutputNode=!1),super.render()}}const be={Vector2:n.Vector2,Vector3:n.Vector3,Vector4:n.Vector4,Quaternion:n.Quaternion,Matrix4:n.Matrix4,Spherical:n.Spherical,Box3:n.Box3,Sphere:n.Sphere,Raycaster:n.Raycaster};K.install({THREE:be});class ee extends K{constructor(...e){super(...e),this.minDistance=.2,this.smoothTime=.2,this.dollySpeed=.2}absoluteRotations(){this.azimuthAngle=Ce(this.azimuthAngle,0)}async flyToBox(e,t={}){if(e.isEmpty())return console.warn("CameraControls.flyToBox: The provided Box3 is empty."),!1;this.absoluteRotations();const{viewpoint:s="frontTop",enableTransition:i=!0,padding:r=.1,cover:a=!1}=t,o=[];if(s!=="current"){const c=Q[s.toUpperCase()]??Q.FRONTTOP,l=c.theta,d=c.phi;o.push(this.fitToBox(e,i,{paddingLeft:r,paddingRight:r,paddingTop:r,paddingBottom:r,cover:a})),o.push(this.rotateTo(l,d,i))}else{const c=new n.Sphere;e.getBoundingSphere(c),c.radius+=r,o.push(this.fitToSphere(c,i))}return await Promise.all(o),!0}async flyToObject(e,t={}){const s=new n.Box3().setFromObject(e);return this.flyToBox(s,t)}}const Q={LEFT:new n.Spherical(0,Math.PI/2,-Math.PI/2),RIGHT:new n.Spherical(0,Math.PI/2,Math.PI/2),FRONT:new n.Spherical(0,Math.PI/2,0),BACK:new n.Spherical(0,Math.PI/2,Math.PI),TOP:new n.Spherical(0,0,0),BOTTOM:new n.Spherical(0,Math.PI,0),FRONTTOP:new n.Spherical(0,Math.PI/4,0),BACKTOP:new n.Spherical(0,Math.PI/4,Math.PI),LEFTTOP:new n.Spherical(0,Math.PI/4,-Math.PI/2),RIGHTTOP:new n.Spherical(0,Math.PI/4,Math.PI/2),LEFTFRONTTOP:new n.Spherical(0,Math.PI/4,-Math.PI/4),RIGHTFRONTTOP:new n.Spherical(0,Math.PI/4,Math.PI/4),LEFTBACKTOP:new n.Spherical(0,Math.PI/4,-Math.PI/4*3),RIGHTBACKTOP:new n.Spherical(0,Math.PI/4,Math.PI/4*3)};function Ce(h,e){const t=h-e;return n.MathUtils.euclideanModulo(t+Math.PI,Math.PI*2)-Math.PI}class te{environment=new ue.RoomEnvironment;renderer;pmremGenerator;envMap=null;constructor(e){this.renderer=e,this.pmremGenerator=new n.PMREMGenerator(e)}update(){this.envMap||(this.envMap=this.pmremGenerator.fromScene(this.environment).texture)}dispose(){this.pmremGenerator.dispose(),this.envMap?.dispose()}}const G=128;class xe extends me.ViewHelper{viewer;overlayPass;constructor(e){super(e.camera,e.el),this.viewer=e;const t=new n.OrthographicCamera(-2,2,2,-2,0,4);t.position.set(0,0,2),this.overlayPass=p.pass(this,t),this.setLabels("x","y","z")}_update=()=>{this.quaternion.copy(this.viewer.camera.quaternion).invert();const e=this.location;let t,s;e.left!==null?t=e.left:t=this.viewer.el.offsetWidth-G-e.right,e.top!==null?s=e.top:s=this.viewer.el.offsetHeight-G-e.bottom,this.overlayPass.setViewport(t,s,G,G)};enable(){return this.viewer.renderPipeline.addOverlayPass(this.overlayPass),this.viewer.addEventListener("beforeRender",this._update),this.viewer.render(),this}disable(){return this.viewer.renderPipeline.removeOverlayPass(this.overlayPass),this.viewer.removeEventListener("beforeRender",this._update),this.viewer.render(),this}}class Se{el;renderer;container;drawCallsText;frameCallsText;trianglesText;pointsText;linesText;timestampText;_enabled=!1;constructor(e,t){this.el=e,this.renderer=t;const s=document.createElement("div");s.style.position="absolute",s.style.left="12px",s.style.bottom="12px",s.style.fontSize="12px",s.style.color="#fff",s.style.pointerEvents="none",this.container=s;function i(a,o=!0){const c=document.createElement("span");return o&&(c.style.marginLeft="6px"),c.innerText=a,c}function r(){return document.createElement("br")}this.drawCallsText=i("0"),this.frameCallsText=i("0"),this.trianglesText=i("0"),this.linesText=i("0"),this.pointsText=i("0"),this.timestampText=i("0"),this.container.appendChild(i("draw calls",!1)),this.container.appendChild(this.drawCallsText),this.container.appendChild(r()),this.container.appendChild(i("frame calls",!1)),this.container.appendChild(this.frameCallsText),this.container.appendChild(r()),this.container.appendChild(i("triangles",!1)),this.container.appendChild(this.trianglesText),this.container.appendChild(r()),this.container.appendChild(i("points",!1)),this.container.appendChild(this.pointsText),this.container.appendChild(r()),this.container.appendChild(i("lines",!1)),this.container.appendChild(this.linesText),this.container.appendChild(r()),this.container.appendChild(i("timestamp",!1)),this.container.appendChild(this.timestampText),this.container.appendChild(r())}update(){if(this._enabled){const{render:e}=this.renderer.info;this.drawCallsText.innerText=e.drawCalls.toString(),this.frameCallsText.innerText=e.frameCalls.toString(),this.trianglesText.innerText=e.triangles.toString(),this.pointsText.innerText=e.points.toString(),this.linesText.innerText=e.lines.toString(),this.renderer.resolveTimestampsAsync(n.TimestampQuery.RENDER).then(t=>{this.timestampText.innerText=t?.toFixed(2)??"0"})}}enable(){this._enabled=!0,this.el.appendChild(this.container)}disable(){this._enabled=!1,this.container.remove()}dispose(){this.disable()}}n.Cache.enabled=!0;class Le extends n.EventDispatcher{el;renderer;scene;camera;info;controls;renderPipeline;timer;roomEnvironment;interactionManager;objectManager;viewerHelper;frameCount=1;frameloop="demand";constructor({el:e,rendererOptions:t}){super(),this.el=e,this.renderer=this._initRenderer(t),this.scene=this.createScene(),this.camera=this.createPerspectiveCamera(),this.info=new Se(this.el,this.renderer),this.controls=new ee(this.camera,this.renderer.domElement),this.renderPipeline=new Ee(this.renderer,this.scene,this.camera),this.timer=new n.Timer,this.roomEnvironment=new te(this.renderer),this.interactionManager=new J(this.renderer.domElement,this.scene,this.camera),this.objectManager=new Z,this.viewerHelper=new xe(this),window.addEventListener("resize",this.onWindowResize)}onWindowResize=()=>{const e=this.el.clientWidth,t=this.el.clientHeight;this.camera instanceof n.PerspectiveCamera?(this.camera.aspect=e/t,this.camera.updateProjectionMatrix()):this.camera instanceof n.OrthographicCamera&&(this.camera.left=-e/2,this.camera.right=e/2,this.camera.top=t/2,this.camera.bottom=-t/2,this.camera.updateProjectionMatrix()),this.renderer.setSize(e,t),this.render()};async init(){await this.renderer.init(),this.roomEnvironment.update(),this.scene.environment=this.roomEnvironment.envMap}setCamera(e){this.camera=e,this.controls.camera=e,this.interactionManager.setCamera(e),this.renderPipeline.setCamera(e),this.onWindowResize(),this.dispatchEvent({type:"cameraChange",camera:e})}setCameraByType(e){e==="perspective"&&!(this.camera instanceof n.PerspectiveCamera)?this.setCamera(this.createPerspectiveCamera()):e==="orthographic"&&!(this.camera instanceof n.OrthographicCamera)&&this.setCamera(this.createOrthographicCamera())}render(e=1){return this.frameCount+=e,new Promise(t=>{const s=()=>{this.removeEventListener("afterRender",s),t()};this.addEventListener("afterRender",s)})}animate=e=>{this.timer.update(e);const t=this.timer.getDelta();this.dispatchEvent({type:"beforeControlsUpdate",time:e,delta:t});let s=this.controls.update(t);this.dispatchEvent({type:"afterControlsUpdate",time:e,delta:t}),this.frameCount>0&&(this.frameCount--,s=!0),this.frameloop==="always"&&(s=!0),s&&(this.dispatchEvent({type:"beforeRender",time:e,delta:t}),this.renderer.info.reset(),this.renderPipeline.render(),this.info.update(),this.dispatchEvent({type:"afterRender",time:e,delta:t}))};_initRenderer(e){const t=new n.WebGPURenderer({logarithmicDepthBuffer:!0,antialias:!1,depth:!1,trackTimestamp:!0,...e});return t.setSize(this.el.clientWidth,this.el.clientHeight),t.shadowMap.enabled=!0,t.shadowMap.type=n.PCFShadowMap,t.toneMapping=n.AgXToneMapping,t.toneMappingExposure=1,t.info.autoReset=!1,t.setPixelRatio(window.devicePixelRatio),t.setAnimationLoop(this.animate),this.el.appendChild(t.domElement),t}createScene(){const e=new n.Scene;return e.background=new n.Color(0),e}createPerspectiveCamera(){const e=new n.PerspectiveCamera(50,this.el.clientWidth/this.el.clientHeight,.1,1e5);return e.position.setScalar(5),e}createOrthographicCamera(){const e=new n.OrthographicCamera(-this.el.clientWidth/2,this.el.clientWidth/2,this.el.clientHeight/2,-this.el.clientHeight/2,.1,1e5);return e.position.setScalar(5),e}dispose(){this.el.removeChild(this.renderer.domElement),window.removeEventListener("resize",this.onWindowResize),this.info.dispose(),this.interactionManager.dispose(),this.roomEnvironment.dispose(),this.renderPipeline.dispose(),this.renderer.dispose()}}class se extends V.GLTFLoader{constructor(e){super(e)}parse(e,t,s,i){if(Oe(e.slice(0,8))==="SBMG----"){const a=Pe(e.slice(8));return super.parse(a,t,s,i)}else return super.parse(e,t,s,i)}}function Oe(h){return new TextDecoder().decode(new Uint8Array(h))}function Pe(h){const e=new DataView(h);for(let t=0;t<e.byteLength;t++){const s=e.getUint8(t),i=(s>>4&15)+(s<<4&240);e.setUint8(t,i)}return e.buffer}const Ie=8,Be=130,X=66,_e="SBK-----",Ae="SBM-----",ie=new TextDecoder,Re=new TextEncoder;function Ne(h){let e=Ie;const t=new Uint8Array(h,0,e);if(ie.decode(t)!==_e)return h;e+=Be;const i=new Uint8Array(h,0,e);if(i[40]===1){const a=Re.encode(Ae),o=new Uint8Array([i[41]]),c=Ue(i),l=je(c);let d=X%l.length;const m=e+X,f=new Uint8Array(h,m),g=new Uint8Array(f.length);for(let T=0;T<f.length;T++)g[T]=f[T]^l[d],d=(d+1)%l.length;const v=new Uint8Array(a.length+o.length+g.length);return v.set(a),v.set(o,a.length),v.set(g,a.length+o.length),v.buffer}}function Ue(h){const e=new Uint8Array(128);return e.set(h.slice(42,74),0),e.set(h.slice(74,138),32),e.set(h.slice(8,40),96),e}function je(h){const e=new Uint8Array(64);return e.set(h.slice(0,8),0),e.set(h.slice(24,32),8),e.set(h.slice(40,56),16),e.set(h.slice(64,88),32),e.set(h.slice(96,104),56),e}const De=(h,e,t)=>{const s=h.buffer.slice(t,t+e);let i=ie.decode(s);return i=i.replace("\\","/"),i.startsWith("Maps/")||(i=`Maps/${i}`),i},Ge=(h,e,t)=>{const[s,i,r,a,o]=e,c=t||a<1;return new n.MeshStandardNodeMaterial({name:h,color:new n.Color(s,i,r),opacity:a,transparent:c,alphaTest:.01,side:o})},Fe=h=>h?.toLowerCase().endsWith(".png")??!1;class ke{data;options;textureLoader;littleEndian=!0;materials=new Map;constructor(e,t){this.data=e,this.options=t,this.textureLoader=new n.TextureLoader(t.manager),this.textureLoader.setCrossOrigin(t.crossOrigin),this.textureLoader.setRequestHeader(t.requestHeader)}parse(e,t){let s=this.data;const i=Ne(this.data);i&&(s=i);const r=new DataView(s);let a=8;const o=r.getUint8(a);a+=1,o===1?this._parseV2(r,a,e):o===2?this._parseV2(r,a,e):o===3?this._parseV3(r,a,e):t?.(new Error(`SBMLoader: Unsupported SBM version: ${o}`))}_parseV2(e,t,s){const i=new n.Group,r=e.getUint16(t,this.littleEndian);t+=2;const a=e.getUint16(t,this.littleEndian);t+=2;for(let o=0;o<r;++o){const c=e.getUint16(t,this.littleEndian).toString();t+=2,t+=4,t+=4,t+=4,t+=4;const l=e.getFloat32(t,this.littleEndian);t+=4;const d=e.getFloat32(t,this.littleEndian);t+=4;const m=e.getFloat32(t,this.littleEndian);t+=4;const f=e.getFloat32(t,this.littleEndian);t+=4,t+=4,t+=4,t+=4,t+=4;let g=e.getUint8(t);t+=1,g===0?g=n.FrontSide:g===1?g=n.BackSide:g===2&&(g=n.DoubleSide);const v=e.getUint16(t,this.littleEndian);t+=2;const T=v>0?De(e,v,t):"";if(t+=v,!this.materials.has(c)){const E=Ge(c,[l,d,m,f,g],Fe(T));this.materials.set(c,E),T&&this.options.path&&this.textureLoader.load(n.LoaderUtils.resolveURL(T,this.options.path),y=>{y.colorSpace=n.SRGBColorSpace,y.wrapS=n.RepeatWrapping,y.wrapT=n.RepeatWrapping,y.flipY=!1,y.anisotropy=16,E.map=y})}}for(let o=0;o<a;++o){const c=e.getUint16(t,this.littleEndian).toString();t+=2;const l=e.getUint16(t,this.littleEndian).toString();t+=2;const d=[],m=[],f=[],g=[],v=e.getUint16(t,this.littleEndian);if(t+=2,v>0)for(let w=0;w<v;w++){const M=new n.Vector3;M.setX(e.getFloat32(t,this.littleEndian)),t+=4,M.setY(e.getFloat32(t,this.littleEndian)),t+=4,M.setZ(e.getFloat32(t,this.littleEndian)),t+=4,d.push(M)}const T=e.getUint16(t,this.littleEndian);if(t+=2,T>0)for(let w=0;w<T;w++)t+=4,t+=4,t+=4;const C=e.getUint16(t,this.littleEndian);if(t+=2,C>0)for(let w=0;w<C;w++){const M=new n.Vector2;M.setX(e.getFloat32(t,this.littleEndian)),t+=4,M.setY(e.getFloat32(t,this.littleEndian)),t+=4,m.push(M)}const E=e.getUint16(t,this.littleEndian);if(t+=2,E>0)for(let w=0;w<E;w++){const M=e.getUint16(t,this.littleEndian);t+=2;const I=e.getUint16(t,this.littleEndian);t+=2;const B=e.getUint16(t,this.littleEndian);t+=2;const S=[M,I,B];f.push(S),m.length>0&&g.push([m[S[0]],m[S[1]],m[S[2]]])}const y=[],b=[];for(let w=0;w<f.length;w++){const M=f[w],I=d[M[0]],B=d[M[1]],S=d[M[2]];y.push(...I.toArray(),...B.toArray(),...S.toArray());let D=new n.Vector2,U=new n.Vector2,A=new n.Vector2;const R=g[w];R!==void 0&&(D=R[0],U=R[1],A=R[2]),b.push(...D.toArray(),...U.toArray(),...A.toArray())}const L=new Float32Array(y),O=new Float32Array(b),x=new n.BufferGeometry;if(L.length>0&&x.setAttribute("position",new n.BufferAttribute(L,3)),O.length>0&&x.setAttribute("uv",new n.BufferAttribute(O,2)),x.computeVertexNormals(),this.materials.has(l)){const w=new n.Mesh(x,this.materials.get(l));w.name=c,w.castShadow=!0,w.receiveShadow=!0,i.add(w)}}s(i)}_parseV3(e,t,s){const i=new n.Group;console.warn("SBMLoader: SBM version 3 is not supported yet."),s(i)}}class ne extends n.Loader{load(e,t,s,i){let r;if(this.resourcePath!=="")r=this.resourcePath;else if(this.path!==""){const c=n.LoaderUtils.extractUrlBase(e);r=n.LoaderUtils.resolveURL(c,this.path)}else r=n.LoaderUtils.extractUrlBase(e);this.manager.itemStart(e);const a=c=>{i?i(c):console.error(c),this.manager.itemError(e),this.manager.itemEnd(e)},o=new n.FileLoader(this.manager);o.setPath(this.path),o.setResponseType("arraybuffer"),o.setRequestHeader(this.requestHeader),o.setWithCredentials(this.withCredentials),o.load(e,c=>{try{this.parse(c,r,l=>{t(l),this.manager.itemEnd(e)},a)}catch(l){a(l)}},s,a)}parse(e,t,s,i){const r=new TextDecoder().decode(e.slice(0,8));if(r!=="SBK-----"&&r!=="SBM-----"){i?.(new Error(`SBMLoader: Invalid SBM format: ${r}`));return}new ke(e,{path:t,crossOrigin:this.crossOrigin,requestHeader:this.requestHeader,manager:this.manager}).parse(s,i)}parseAsync(e,t){return new Promise((s,i)=>{this.parse(e,t,r=>{s(r)},r=>{i(r)})})}}class P{static CACHE_NAME="u-space-model-loader-cache";static fileLoader=new n.FileLoader().setResponseType("arraybuffer");static dracoLoader=new ye.DRACOLoader().setDecoderPath(`https://cdn.jsdelivr.net/npm/three@0.${n.REVISION}.0/examples/jsm/libs/draco/`);static ktx2Loader=new ve.KTX2Loader().setTranscoderPath(`https://cdn.jsdelivr.net/npm/three@0.${n.REVISION}.0/examples/jsm/libs/basis/`);static gltfLoader=new V.GLTFLoader().setDRACOLoader(P.dracoLoader).setKTX2Loader(P.ktx2Loader).setMeshoptDecoder($.MeshoptDecoder);static sbmxLoader=new se().setDRACOLoader(P.dracoLoader).setKTX2Loader(P.ktx2Loader).setMeshoptDecoder($.MeshoptDecoder);static sbmLoader=new ne;static fbxLoader=new ge.FBXLoader;static objLoader=new we.OBJLoader;static stlLoader=new fe.STLLoader;static setLoadingManager(e){this.fileLoader.manager=e,this.dracoLoader.manager=e,this.ktx2Loader.manager=e,this.gltfLoader.manager=e,this.sbmxLoader.manager=e,this.sbmLoader.manager=e,this.fbxLoader.manager=e,this.objLoader.manager=e,this.stlLoader.manager=e}static async setRenderer(e){await e.init(),this.ktx2Loader.detectSupport(e)}static setDracoPath(e){this.dracoLoader.setDecoderPath(e)}static setKTX2Path(e){this.ktx2Loader.setTranscoderPath(e)}static async loadAsync(e,t={persistent:!0}){const s=e.split(".").pop()?.split("?")[0].toLowerCase();let i;switch(t.persistent&&typeof caches<"u"?i=await this.getPersistentData(e):i=await this.fileLoader.loadAsync(e),s){case"gltf":case"glb":const r=await this.gltfLoader.parseAsync(i,n.LoaderUtils.extractUrlBase(e));return r.scene.animations=r.animations,r.scene;case"sbmx":const a=await this.sbmxLoader.parseAsync(i,n.LoaderUtils.extractUrlBase(e));return a.scene.animations=a.animations,a.scene;case"sbm":return await this.sbmLoader.parseAsync(i,n.LoaderUtils.extractUrlBase(e));case"fbx":return this.fbxLoader.parse(i,n.LoaderUtils.extractUrlBase(e));case"obj":const l=new TextDecoder().decode(i);return this.objLoader.parse(l);case"stl":const m=this.stlLoader.parse(i);return new n.Mesh(m,new n.MeshStandardNodeMaterial);default:throw new Error(`Unsupported model format: ${s}`)}}static async getPersistentData(e){try{const t=await caches.open(this.CACHE_NAME),s=await t.match(e);if(s)return await s.arrayBuffer();const i=await this.fileLoader.loadAsync(e),r=new Response(i);return await t.put(e,r),i}catch(t){return console.warn(`[LoaderManager] Failed to use Cache API for ${e}:`,t),await this.fileLoader.loadAsync(e)}}}class He{static textureLoader=new n.TextureLoader;static hdrLoader=new Me.HDRLoader;static cubeTextureLoader=new n.CubeTextureLoader;static setLoadingManager(e){this.textureLoader.manager=e,this.hdrLoader.manager=e,this.cubeTextureLoader.manager=e}static async loadAsyncTexture(e){return await this.textureLoader.loadAsync(e)}static async loadAsyncHDR(e){const t=await this.hdrLoader.loadAsync(e);return t.mapping=n.EquirectangularReflectionMapping,t}static async loadAsyncCubeTexture(e,t){return this.cubeTextureLoader.setPath(e),await this.cubeTextureLoader.loadAsync(t)}}class _ extends n.Mesh{isBaseMesh=!0;type="BaseMesh";ignoreInvisibleWhenRaycast=!0;constructor(...e){super(...e)}raycast(e,t){return this.visible===!1&&this.ignoreInvisibleWhenRaycast===!0?!1:super.raycast(e,t)}}class H extends n.Group{isBaseGroup=!0;type="BaseGroup";ignoreInvisibleWhenRaycast=!0;constructor(...e){super(...e)}raycast(e,t){return this.visible===!1&&this.ignoreInvisibleWhenRaycast===!0?!1:super.raycast(e,t)}}class re extends n.Sprite{isBaseSprite=!0;type="BaseSprite";ignoreInvisibleWhenRaycast=!0;constructor(...e){super(...e)}raycast(e,t){return this.visible===!1&&this.ignoreInvisibleWhenRaycast===!0?!1:super.raycast(e,t)}}class j extends H{isModel=!0;type="Model";static memoryCache=new Map;mixer=null;animations=[];actions=new Map;constructor(){super()}async loadAsync(e){const{url:t,cache:s=!0,persistent:i=!0}=e;try{let r;s?j.memoryCache.has(t)?r=j.memoryCache.get(t):(r=P.loadAsync(t,{persistent:i}),j.memoryCache.set(t,r)):r=P.loadAsync(t,{persistent:i});const a=await r,o=Te.clone(a);return this.add(o),o.animations&&o.animations.length>0&&(this.animations=o.animations,this.mixer=new n.AnimationMixer(o)),o}catch(r){return console.error(`[Model] Failed to load model from ${t}:`,r),null}}playAnimation(e,t={}){if(!this.mixer||this.animations.length===0)return null;const{loop:s=!0,repetitions:i=1/0,timeScale:r=1,clampWhenFinished:a=!1}=t;let o;if(e===void 0?o=this.animations[0]:typeof e=="number"?o=this.animations[e]:o=this.animations.find(l=>l.name===e),!o)return console.warn(`[Model] Animation not found: ${e}`),null;let c=this.actions.get(o.name);return c||(c=this.mixer.clipAction(o),this.actions.set(o.name,c)),c.setLoop(s?n.LoopRepeat:n.LoopOnce,i),c.clampWhenFinished=a,c.timeScale=r,c.reset().play(),c}playAllAnimations(e={}){return this.animations.map((t,s)=>this.playAnimation(s,e)).filter(t=>t!==null)}stopAnimation(e){if(!this.mixer)return;if(e===void 0){this.mixer.stopAllAction();return}let t;typeof e=="number"?t=this.animations[e]?.name:t=e,t&&this.actions.get(t)?.stop()}updateAnimation(e){this.mixer?.update(e)}static clearMemoryCache(){this.memoryCache.clear()}static async clearPersistentCache(){typeof caches<"u"&&await caches.delete("u-space-loader-cache")}}class ae extends _{isSphereMesh=!0;type="SphereMesh";constructor({geometryParameters:e,materialParameters:t}={}){super(),this.geometry=new n.SphereGeometry(e?.radius,e?.widthSegments,e?.heightSegments,e?.phiStart,e?.phiLength,e?.thetaStart,e?.thetaLength),this.material=new n.MeshStandardNodeMaterial(t)}}class k extends _{isTubeMesh=!0;type="TubeMesh";constructor({geometryParameters:e,materialParameters:t}={}){super(),this.geometry=new n.TubeGeometry(e?.path,e?.tubularSegments,e?.radius,e?.radialSegments,e?.closed),this.material=new n.MeshStandardNodeMaterial(t)}}class qe extends H{isTopology=!0;type="Topology";parameters={nodeColor:255,nodeRadius:.5,edgeColor:65280,edgeRadius:.1,pathColor:16711935,pathRadius:.2};nodes=new Map;adjacencyMap=new Map;graphGroup=null;pathMeshes=[];constructor(e){super(),e&&Object.assign(this.parameters,e)}addNode(e,t){this.nodes.has(e)&&console.warn(`[Topology] Node ${e} already exists. Overwriting.`),this.nodes.set(e,t),this.adjacencyMap.has(e)||this.adjacencyMap.set(e,new Map)}removeNode(e){if(!this.nodes.has(e)){console.warn(`[Topology] Node ${e} does not exist.`);return}this.nodes.delete(e),this.adjacencyMap.delete(e)}addEdge(e,t,s,i=!0){const r=this.nodes.get(e),a=this.nodes.get(t);if(!r||!a){console.error(`[Topology] Cannot add edge. One or both nodes not found: ${e}, ${t}`);return}const o=s??r.distanceTo(a);this.getNeighbors(e)?.set(t,o),i&&this.getNeighbors(t)?.set(e,o)}removeEdge(e,t,s=!0){this.getNeighbors(e)?.delete(t),s&&this.getNeighbors(t)?.delete(e)}getShortestPath(e,t){if(!this.nodes.has(e)||!this.nodes.has(t))return console.warn("[Topology] Start or End node not found."),[];const s=new Map,i=new Map,r=new Set;for(const[c]of this.nodes)s.set(c,1/0),i.set(c,null),r.add(c);for(s.set(e,0);r.size>0;){let c=null,l=1/0;for(const m of r){const f=s.get(m);f<l&&(l=f,c=m)}if(c===null||c===t||l===1/0)break;r.delete(c);const d=this.adjacencyMap?.get(c);if(d)for(const[m,f]of d){if(!r.has(m))continue;const g=s.get(c)+f;g<s.get(m)&&(s.set(m,g),i.set(m,c))}}const a=[];let o=t;if(i.get(t)===null&&e!==t)return[];for(;o!==null;){const c=this.nodes.get(o);c&&a.unshift(c),o=i.get(o)||null}return a}renderGraph(){this.clearGraph(),this.graphGroup=new n.Group;const e=new ae({geometryParameters:{radius:this.parameters.nodeRadius,widthSegments:16,heightSegments:16},materialParameters:{color:this.parameters.nodeColor}});this.nodes.forEach((s,i)=>{const r=e.clone();r.position.copy(s),Object.assign(r.userData,{id:i,type:"node"}),this.graphGroup.add(r)});const t=new Set;this.adjacencyMap.forEach((s,i)=>{s.forEach((r,a)=>{const o=[i,a].sort().join("-");if(t.has(o))return;t.add(o);const c=this.nodes.get(i),l=this.nodes.get(a);if(c&&l){const d=new n.LineCurve3(c,l),m=new k({geometryParameters:{path:d,tubularSegments:1,radius:this.parameters.edgeRadius,radialSegments:8,closed:!1},materialParameters:{color:this.parameters.edgeColor}});Object.assign(m.userData,{from:i,to:a,weight:r,type:"edge"}),this.graphGroup.add(m)}})}),this.add(this.graphGroup)}clearGraph(){this.graphGroup&&(this.remove(this.graphGroup),this.graphGroup.traverse(e=>{e instanceof n.Mesh&&(e.geometry.dispose(),e.material.dispose())}),this.graphGroup=null)}renderPath(e,t=this.parameters.pathColor){if(e.length<2)return;const s=new n.CatmullRomCurve3(e,!1,"catmullrom",0),i=new k({geometryParameters:{path:s,tubularSegments:e.length*10,radius:this.parameters.pathRadius,closed:!1},materialParameters:{color:t}});return this.add(i),this.pathMeshes.push(i),i}clearPaths(){this.pathMeshes.forEach(e=>{this.remove(e),e.geometry.dispose(),e.material.dispose()}),this.pathMeshes=[]}exportData(){const e={};this.nodes.forEach((i,r)=>{e[r]={x:i.x,y:i.y,z:i.z}});const t=[],s=new Set;return this.adjacencyMap.forEach((i,r)=>{i.forEach((a,o)=>{const c=[r,o].sort().join("-");s.has(c)||(s.add(c),t.push({from:r,to:o,weight:a}))})}),{nodes:e,edges:t}}importData(e){this.clearGraph(),this.clearPaths(),this.nodes.clear(),this.adjacencyMap.clear(),Object.entries(e.nodes).forEach(([t,s])=>{this.addNode(t,new n.Vector3(s.x,s.y,s.z))}),e.edges.forEach(({from:t,to:s,weight:i})=>{this.addEdge(t,s,i)}),this.renderGraph()}dispose(){this.clearGraph(),this.clearPaths()}getNeighbors(e){return this.adjacencyMap.get(e)}}class ze extends re{isPoi=!0;type="Poi";parameters={img:"",text:"",fontSize:32,fontFamily:"Arial",color:"#ffffff",iconSize:64,padding:10,backgroundColor:"rgba(0, 0, 0, 0)",borderRadius:8,textPosition:"right",scaleFactor:.01};_canvas=document.createElement("canvas");_lastParametersJSON="";constructor(e={}){super(new n.SpriteNodeMaterial),Object.assign(this.parameters,e),this.updateAsync()}async updateAsync(e={}){Object.assign(this.parameters,e);const t=JSON.stringify(this.parameters);if(t===this._lastParametersJSON)return;this._lastParametersJSON=t;const s=this._canvas,i=s.getContext("2d");if(!i)return;i.font=`${this.parameters.fontSize}px ${this.parameters.fontFamily}`;let r=null;this.parameters.img&&(r=await this._loadImage(this.parameters.img));const{text:a,fontSize:o,color:c,iconSize:l,padding:d,backgroundColor:m,borderRadius:f,textPosition:g,scaleFactor:v}=this.parameters,T=i.measureText(a),C=a?T.width:0,E=a?o:0;let y=0,b=0,L=0,O=0,x=0,w=0;const M=!!r,I=!!a;if(M&&I)switch(g){case"top":y=Math.max(l,C),b=l+d+E,x=(y-C)/2,w=E/2,L=(y-l)/2,O=E+d;break;case"bottom":y=Math.max(l,C),b=l+d+E,L=(y-l)/2,O=0,x=(y-C)/2,w=l+d+E/2;break;case"left":y=l+d+C,b=Math.max(l,E),x=0,w=b/2,L=C+d,O=(b-l)/2;break;default:y=l+d+C,b=Math.max(l,E),L=0,O=(b-l)/2,x=l+d,w=b/2;break}else M?(y=l,b=l,L=0,O=0):I&&(y=C,b=E,x=0,w=E/2);const B=y+d*2,S=b+d*2;if(s.width=B,s.height=S,i.font=`${o}px ${this.parameters.fontFamily}`,m&&(i.fillStyle=m,this._drawRoundedRect(i,0,0,B,S,f),i.fill()),M&&i.drawImage(r,L+d,O+d,l,l),I){i.fillStyle=c;const A=i.measureText(a),R=A.actualBoundingBoxAscent+A.actualBoundingBoxDescent,pe=A.actualBoundingBoxAscent-R/2;i.textBaseline="alphabetic",i.fillText(a,x+d,w+d+pe)}const D=this.material.map,U=new n.CanvasTexture(s);U.colorSpace=n.SRGBColorSpace,this.material.map=U,D?.dispose(),this.scale.set(B*v,S*v,1)}_loadImage(e){return new Promise((t,s)=>{if(typeof e=="string"){const i=new Image;i.crossOrigin="Anonymous",i.onload=()=>t(i),i.onerror=()=>s(new Error(`Failed to load image: ${e}`)),i.src=e}else t(e)})}_drawRoundedRect(e,t,s,i,r,a){e.beginPath(),e.moveTo(t+a,s),e.lineTo(t+i-a,s),e.quadraticCurveTo(t+i,s,t+i,s+a),e.lineTo(t+i,s+r-a),e.quadraticCurveTo(t+i,s+r,t+i-a,s+r),e.lineTo(t+a,s+r),e.quadraticCurveTo(t,s+r,t,s+r-a),e.lineTo(t,s+a),e.quadraticCurveTo(t,s,t+a,s),e.closePath()}dispose(){this.material.map?.dispose(),this.material.dispose()}}class q extends _{isShapeMesh=!0;type="ShapeMesh";constructor({geometryParameters:e,materialParameters:t}={}){super(),this.geometry=new n.ShapeGeometry(e?.shape,e?.curveSegments),this.material=new n.MeshStandardNodeMaterial(t),this.geometry.rotateX(-Math.PI/2)}static createFromPoints(e,t={}){return new q({...t,geometryParameters:{...t.geometryParameters,shape:new n.Shape(e.map(s=>new n.Vector2(s.x,-s.z)))}})}}class z extends _{isExtrudeMesh=!0;type="ExtrudeMesh";constructor({geometryParameters:e,materialParameters:t}={}){super(),this.geometry=new n.ExtrudeGeometry(e?.shape,e?.options),this.material=new n.MeshStandardNodeMaterial(t),this.geometry.rotateX(-Math.PI/2)}static createFromPoints(e,t={}){return new z({...t,geometryParameters:{...t.geometryParameters,shape:new n.Shape(e.map(s=>new n.Vector2(s.x,-s.z)))}})}}class We extends _{isPlaneMesh=!0;type="PlaneMesh";constructor({geometryParameters:e,materialParameters:t}={}){super(),this.geometry=new n.PlaneGeometry(e?.width,e?.height,e?.widthSegments,e?.heightSegments),this.material=new n.MeshStandardNodeMaterial(t)}}class $e extends _{isCircleMesh=!0;type="CircleMesh";constructor({geometryParameters:e,materialParameters:t}={}){super(new n.CircleGeometry(e?.radius,e?.segments,e?.thetaStart,e?.thetaLength),new n.MeshStandardNodeMaterial(t)),this.geometry.rotateX(-Math.PI/2)}}class oe{static traverseMeshes(e,t){e.traverse(s=>{s instanceof n.Mesh&&t(s)})}}class Qe{static flow(e={}){const{baseColor:t=16777215,flowColor:s=65280,speed:i=1,scale:r=3,intensity:a=4}=e,o=p.color(new N.Color(t)),c=p.color(new N.Color(s)),l=p.uv().x.mul(r).sub(p.time.mul(i)),d=p.pow(p.sin(l).add(1).mul(.5),a);return p.mix(o,c,d)}static breathe(e={}){const{baseColor:t=16777215,breathColor:s=65280,speed:i=1,intensity:r=2}=e,a=p.color(new N.Color(t)),o=p.color(new N.Color(s)),c=p.sin(p.time.mul(i)).add(1).mul(.5),l=p.pow(c,r);return p.mix(a,o,l)}static fluid(e={}){const{baseColor:t=16777215,flowColor:s=255,speed:i=1,scale:r=1,intensity:a=1,distortion:o=.5}=e,c=p.color(new N.Color(t)),l=p.color(new N.Color(s)),d=p.uv().mul(r),m=p.time.mul(i),f=p.mx_noise_float(d.add(m),1,0),g=d.add(f.mul(o)),v=p.mx_noise_float(g,1,0).add(1).mul(.5),T=p.pow(v,a);return p.mix(c,l,T)}}function Xe(h){}const F="uSpaceHighlight",W=`${F}/enabled`,ce=`${F}/opacity`,he=`${F}/color`,le=`${F}/overwrite`,Ke=p.Fn(()=>{const h=p.userData(W,"uint"),e=p.userData(he,"uint"),t=p.userData(le,"uint"),s=Je(e),i=p.materialColor.mul(s),r=p.select(t.greaterThan(0),s,i);return p.select(h.greaterThan(0),r,p.materialColor)})(),Ve=p.Fn(()=>{const h=p.userData(W,"uint"),e=p.userData(ce,"float");return p.select(h.greaterThan(0),e,p.materialOpacity)})();class Ye{static highlight(e,t={}){const s=Object.assign({enabled:!0,opacity:.5,color:16711680,overwrite:!1},t);s.color=new n.Color(s.color).getHex(),oe.traverseMeshes(e,i=>{i.userData[W]=s.enabled?1:0,i.userData[ce]=s.opacity,i.userData[he]=s.color,i.userData[le]=s.overwrite?1:0;const r=i.material;r&&!Array.isArray(r)&&(r.transparent=!0,r.colorNode=Ke,r.opacityNode=Ve,r.needsUpdate=!0)})}}const Je=h=>{const e=h.shiftRight(16).bitAnd(255).toFloat().div(255),t=h.shiftRight(8).bitAnd(255).toFloat().div(255),s=h.bitAnd(255).toFloat().div(255);return p.vec3(e,t,s)};class de extends u.Tween{viewer;constructor(e,t){super(t),this.viewer=e}_update=({time:e})=>{this.update(e)&&this.viewer.render()};easingByMode(e){const t=et[e];return super.easing(t)}start(e,t){return this.viewer.addEventListener("afterControlsUpdate",this._update),super.start(e,t)}stop(){return this.viewer.removeEventListener("afterControlsUpdate",this._update),super.stop()}}function Ze(h,e,t,s={},i,r){return new Promise((a,o)=>{const{duration:c=1e3,delay:l=0,repeat:d=!1,mode:m="Linear.None",yoyo:f=!1}=s,g=new de(h,e).to(t,c).easingByMode(m).delay(l).onUpdate(v=>{i?.(v,g)}).onComplete(()=>{a()}).onStop(()=>{o("animation stop")}).onStart(()=>{r?.(g)});typeof d=="number"?g.repeat(d):typeof d=="boolean"&&d&&g.repeat(1/0),f&&g.repeatDelay(20),g.yoyo(f),g.start()})}const et={"Linear.None":u.Easing.Linear.None,"Quadratic.In":u.Easing.Quadratic.In,"Quadratic.Out":u.Easing.Quadratic.Out,"Quadratic.InOut":u.Easing.Quadratic.InOut,"Cubic.In":u.Easing.Cubic.In,"Cubic.Out":u.Easing.Cubic.Out,"Cubic.InOut":u.Easing.Cubic.InOut,"Quartic.In":u.Easing.Quartic.In,"Quartic.Out":u.Easing.Quartic.Out,"Quartic.InOut":u.Easing.Quartic.InOut,"Quintic.In":u.Easing.Quintic.In,"Quintic.Out":u.Easing.Quintic.Out,"Quintic.InOut":u.Easing.Quintic.InOut,"Sinusoidal.In":u.Easing.Sinusoidal.In,"Sinusoidal.Out":u.Easing.Sinusoidal.Out,"Sinusoidal.InOut":u.Easing.Sinusoidal.InOut,"Exponential.In":u.Easing.Exponential.In,"Exponential.Out":u.Easing.Exponential.Out,"Exponential.InOut":u.Easing.Exponential.InOut,"Circular.In":u.Easing.Circular.In,"Circular.Out":u.Easing.Circular.Out,"Circular.InOut":u.Easing.Circular.InOut,"Elastic.In":u.Easing.Elastic.In,"Elastic.Out":u.Easing.Elastic.Out,"Elastic.InOut":u.Easing.Elastic.InOut,"Back.In":u.Easing.Back.In,"Back.Out":u.Easing.Back.Out,"Back.InOut":u.Easing.Back.InOut,"Bounce.In":u.Easing.Bounce.In,"Bounce.Out":u.Easing.Bounce.Out,"Bounce.InOut":u.Easing.Bounce.InOut};exports.BaseGroup=H;exports.BaseMesh=_;exports.BaseSprite=re;exports.CameraControls=ee;exports.CircleMesh=$e;exports.ExtrudeMesh=z;exports.InteractionEvent=Y;exports.InteractionManager=J;exports.MaterialEffects=Ye;exports.Model=j;exports.ModelLoaderManager=P;exports.ObjectManager=Z;exports.ObjectUtils=oe;exports.PlaneMesh=We;exports.Poi=ze;exports.RoomEnvironment=te;exports.SBMLoader=ne;exports.SBMXLoader=se;exports.ShapeMesh=q;exports.SphereMesh=ae;exports.TSLEffects=Qe;exports.TextureLoaderManager=He;exports.Topology=qe;exports.TubeMesh=k;exports.Tween=de;exports.Viewer=Le;exports.reinterpretType=Xe;exports.tweenAnimation=Ze;