u-space 0.0.0-alpha.1

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 (96) hide show
  1. package/README.md +21 -0
  2. package/dist/index.cjs +1 -0
  3. package/dist/index.js +1374 -0
  4. package/dist/plugins/atmosphere/Atmosphere.d.ts +9 -0
  5. package/dist/plugins/atmosphere/index.cjs +1 -0
  6. package/dist/plugins/atmosphere/index.d.ts +1 -0
  7. package/dist/plugins/atmosphere/index.js +15 -0
  8. package/dist/plugins/curve-movement/CurveMovement.d.ts +78 -0
  9. package/dist/plugins/curve-movement/CurveMovementCamera.d.ts +8 -0
  10. package/dist/plugins/curve-movement/CurveMovementObject.d.ts +14 -0
  11. package/dist/plugins/curve-movement/index.cjs +1 -0
  12. package/dist/plugins/curve-movement/index.d.ts +3 -0
  13. package/dist/plugins/curve-movement/index.js +153 -0
  14. package/dist/plugins/keyboard-controls/KeyboardControls.d.ts +31 -0
  15. package/dist/plugins/keyboard-controls/index.cjs +1 -0
  16. package/dist/plugins/keyboard-controls/index.d.ts +1 -0
  17. package/dist/plugins/keyboard-controls/index.js +67 -0
  18. package/dist/plugins/minimap/Minimap.d.ts +22 -0
  19. package/dist/plugins/minimap/index.cjs +1 -0
  20. package/dist/plugins/minimap/index.d.ts +1 -0
  21. package/dist/plugins/minimap/index.js +67 -0
  22. package/dist/plugins/tiles/ArcgisTilesRenderer.d.ts +14 -0
  23. package/dist/plugins/tiles/Globe.d.ts +22 -0
  24. package/dist/plugins/tiles/index.cjs +1 -0
  25. package/dist/plugins/tiles/index.d.ts +2 -0
  26. package/dist/plugins/tiles/index.js +179 -0
  27. package/dist/plugins/tiles/plugins/TileMaterialReplacementPlugin.d.ts +11 -0
  28. package/dist/plugins/tiles/plugins/fade/FadeMaterialManager.d.ts +17 -0
  29. package/dist/plugins/tiles/plugins/fade/TilesFadePlugin.d.ts +5 -0
  30. package/dist/plugins/tiles/plugins/fade/wrapFadeNodeMaterial.d.ts +3 -0
  31. package/dist/plugins/tracking-controls/TrackingControls.d.ts +13 -0
  32. package/dist/plugins/tracking-controls/index.cjs +1 -0
  33. package/dist/plugins/tracking-controls/index.d.ts +1 -0
  34. package/dist/plugins/tracking-controls/index.js +23 -0
  35. package/dist/plugins/u-manager/Watermarker.d.ts +12 -0
  36. package/dist/plugins/u-manager/constants.d.ts +5 -0
  37. package/dist/plugins/u-manager/index.cjs +86 -0
  38. package/dist/plugins/u-manager/index.d.ts +6 -0
  39. package/dist/plugins/u-manager/index.js +20877 -0
  40. package/dist/plugins/u-manager/license/decryptUtils.d.ts +5 -0
  41. package/dist/plugins/u-manager/loaders/AnimationsLoader.d.ts +59 -0
  42. package/dist/plugins/u-manager/loaders/BaseFileLoader.d.ts +5 -0
  43. package/dist/plugins/u-manager/loaders/PropertiesLoader.d.ts +12 -0
  44. package/dist/plugins/u-manager/loaders/SceneLoader.d.ts +15 -0
  45. package/dist/plugins/u-manager/loaders/TopologiesLoader.d.ts +10 -0
  46. package/dist/plugins/u-manager/loaders/VisionsLoader.d.ts +26 -0
  47. package/dist/plugins/u-manager/types.d.ts +84 -0
  48. package/dist/src/animations/Tween.d.ts +20 -0
  49. package/dist/src/animations/index.d.ts +1 -0
  50. package/dist/src/effects/MaterialEffects.d.ts +10 -0
  51. package/dist/src/effects/TSLEffects.d.ts +24 -0
  52. package/dist/src/effects/index.d.ts +2 -0
  53. package/dist/src/index.d.ts +9 -0
  54. package/dist/src/interactions/InteractionEvent.d.ts +39 -0
  55. package/dist/src/interactions/InteractionManager.d.ts +55 -0
  56. package/dist/src/interactions/index.d.ts +2 -0
  57. package/dist/src/interfaces/base.d.ts +11 -0
  58. package/dist/src/interfaces/index.d.ts +1 -0
  59. package/dist/src/loaders/ModelLoaderManager.d.ts +40 -0
  60. package/dist/src/loaders/SBMLoader.d.ts +6 -0
  61. package/dist/src/loaders/SBMUtils.d.ts +5 -0
  62. package/dist/src/loaders/SBMXLoader.d.ts +6 -0
  63. package/dist/src/loaders/TextureLoaderManager.d.ts +11 -0
  64. package/dist/src/loaders/index.d.ts +4 -0
  65. package/dist/src/managers/ObjectManager.d.ts +60 -0
  66. package/dist/src/managers/index.d.ts +1 -0
  67. package/dist/src/objects/BaseGroup.d.ts +8 -0
  68. package/dist/src/objects/BaseMesh.d.ts +8 -0
  69. package/dist/src/objects/BaseSprite.d.ts +8 -0
  70. package/dist/src/objects/CircleMesh.d.ts +17 -0
  71. package/dist/src/objects/ExtrudeMesh.d.ts +17 -0
  72. package/dist/src/objects/Model.d.ts +17 -0
  73. package/dist/src/objects/ObjectUtils.d.ts +4 -0
  74. package/dist/src/objects/PlaneMesh.d.ts +17 -0
  75. package/dist/src/objects/Poi.d.ts +38 -0
  76. package/dist/src/objects/ShapeMesh.d.ts +17 -0
  77. package/dist/src/objects/SphereMesh.d.ts +20 -0
  78. package/dist/src/objects/Topology.d.ts +64 -0
  79. package/dist/src/objects/TubeMesh.d.ts +18 -0
  80. package/dist/src/objects/index.d.ts +13 -0
  81. package/dist/src/types.d.ts +1 -0
  82. package/dist/src/viewers/CameraControls.d.ts +19 -0
  83. package/dist/src/viewers/Info.d.ts +18 -0
  84. package/dist/src/viewers/RenderPipeline.d.ts +17 -0
  85. package/dist/src/viewers/RoomEnvironment.d.ts +11 -0
  86. package/dist/src/viewers/Viewer.d.ts +59 -0
  87. package/dist/src/viewers/ViewerHelper.d.ts +12 -0
  88. package/dist/src/viewers/index.d.ts +3 -0
  89. package/docs/api-interactions.md +64 -0
  90. package/docs/api-managers.md +54 -0
  91. package/docs/api-objects.md +65 -0
  92. package/docs/api-plugins.md +103 -0
  93. package/docs/api-viewer.md +84 -0
  94. package/docs/examples-guide.md +48 -0
  95. package/docs/getting-started.md +126 -0
  96. package/package.json +60 -0
package/README.md ADDED
@@ -0,0 +1,21 @@
1
+ # u-space
2
+
3
+ The library based on three.js with WebGPURenderer.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install u-space
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ```typescript
14
+ import { Viewer } from 'u-space';
15
+
16
+ const viewer = new Viewer({
17
+ el: document.getElementById('app')!,
18
+ });
19
+ ```
20
+
21
+
package/dist/index.cjs ADDED
@@ -0,0 +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=null;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._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(){this.raycaster.setFromCamera(this.pointer,this.camera);const e=this.targetObjects||this.scene.children;return this.raycaster.intersectObjects(e,!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(),this._handleEvent("contextmenu",e)};_onPointerDown=e=>{this.pointerDownTime=Date.now(),this._updatePointer(e),this.pointerDownPos.copy(this.pointer),this._handleEvent("pointerdown",e)};_onPointerUp=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 Te 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 be={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:be});class ee extends K{constructor(...e){super(...e),this.minDistance=.2,this.smoothTime=.2,this.dollySpeed=.2}absoluteRotations(){this.azimuthAngle=Ee(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 Ee(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 Te(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(Le(e.slice(0,8))==="SBMG----"){const o=Oe(e.slice(8));return super.parse(o,t,s,n)}else return super.parse(e,t,s,n)}}function Le(c){return new TextDecoder().decode(new Uint8Array(c))}function Oe(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 T=De(a,[l,u,g,v,m],Ge(f));this.materials.set(a,T),f&&this.options.path&&this.textureLoader.load(r.LoaderUtils.resolveURL(f,this.options.path),b=>{b.colorSpace=r.SRGBColorSpace,b.wrapS=r.RepeatWrapping,b.wrapT=r.RepeatWrapping,b.flipY=!1,b.anisotropy=16,T.map=b})}}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 E=e.getUint16(t,this.littleEndian);if(t+=2,E>0)for(let w=0;w<E;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 T=e.getUint16(t,this.littleEndian);if(t+=2,T>0)for(let w=0;w<T;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 L=[M,I,_];v.push(L),g.length>0&&m.push([g[L[0]],g[L[1]],g[L[2]]])}const b=[],C=[];for(let w=0;w<v.length;w++){const M=v[w],I=u[M[0]],_=u[M[1]],L=u[M[2]];b.push(...I.toArray(),..._.toArray(),...L.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(b),S=new Float32Array(C),O=new r.BufferGeometry;if(x.length>0&&O.setAttribute("position",new r.BufferAttribute(x,3)),S.length>0&&O.setAttribute("uv",new r.BufferAttribute(S,2)),O.computeVertexNormals(),this.materials.has(l)){const w=new r.Mesh(O,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=[]}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 E=0,T=0,b=0,C=0,x=0,S=0;const O=!!n,w=!!i;if(O&&w)switch(v){case"top":E=Math.max(a,y),T=a+l+f,x=(E-y)/2,S=f/2,b=(E-a)/2,C=f+l;break;case"bottom":E=Math.max(a,y),T=a+l+f,b=(E-a)/2,C=0,x=(E-y)/2,S=a+l+f/2;break;case"left":E=a+l+y,T=Math.max(a,f),x=0,S=T/2,b=y+l,C=(T-a)/2;break;default:E=a+l+y,T=Math.max(a,f),b=0,C=(T-a)/2,x=a+l,S=T/2;break}else O?(E=a,T=a,b=0,C=0):w&&(E=y,T=f,x=0,S=f/2);const M=E+l*2,I=T+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()),O&&s.drawImage(n,b+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 L=.01;this.scale.set(M*L,I*L,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;