u-space 0.0.29 → 0.0.31

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 (90) hide show
  1. package/README.md +9 -0
  2. package/dist/Viewer-BKNV67Jj.cjs +1 -0
  3. package/dist/Viewer-Cs_y7IiH.js +1256 -0
  4. package/dist/getTransferables-C97JPUVf.cjs +1 -0
  5. package/dist/getTransferables-DrzSmiCR.js +43 -0
  6. package/dist/index.cjs +3 -3
  7. package/dist/index.js +2280 -1542
  8. package/dist/modelDecodeProtocol-D1Apm9iG.cjs +1 -0
  9. package/dist/modelDecodeProtocol-wDB7ksYw.js +56 -0
  10. package/dist/plugins/atmosphere/AgxToneMapping.d.ts +1 -1
  11. package/dist/plugins/atmosphere/index.cjs +1 -1
  12. package/dist/plugins/atmosphere/index.js +4 -4
  13. package/dist/plugins/curve-movement/index.cjs +1 -1
  14. package/dist/plugins/curve-movement/index.js +1 -1
  15. package/dist/plugins/fire/index.cjs +1 -1
  16. package/dist/plugins/fire/index.js +5 -5
  17. package/dist/plugins/object-controls/index.cjs +1 -1
  18. package/dist/plugins/object-controls/index.js +4 -4
  19. package/dist/plugins/tiles/index.cjs +1 -1
  20. package/dist/plugins/tiles/index.js +5 -5
  21. package/dist/plugins/u-manager/index.cjs +48 -48
  22. package/dist/plugins/u-manager/index.d.ts +1 -1
  23. package/dist/plugins/u-manager/index.js +8126 -8660
  24. package/dist/plugins/u-manager/loaders/SceneEditableBatchLayer.d.ts +17 -0
  25. package/dist/plugins/u-manager/loaders/SceneInstancedLayer.d.ts +3 -3
  26. package/dist/plugins/u-manager/loaders/SceneLoader.d.ts +11 -3
  27. package/dist/plugins/u-manager/semantics/objects/BuildingGroup.d.ts +4 -5
  28. package/dist/plugins/u-manager/semantics/objects/FacilityInstancedLayer.d.ts +4 -4
  29. package/dist/plugins/u-manager/semantics/objects/FloorMesh.d.ts +20 -22
  30. package/dist/plugins/u-manager/semantics/objects/SemanticGroup.d.ts +2 -3
  31. package/dist/protocol-C-OMPz15.js +10 -0
  32. package/dist/protocol-IUAzx0lk.cjs +1 -0
  33. package/dist/src/batches/EditableGeometryBatchLayer.d.ts +50 -0
  34. package/dist/src/batches/ModelInstancedLayer.d.ts +42 -0
  35. package/dist/src/batches/index.d.ts +2 -0
  36. package/dist/src/effects/TSLEffects.d.ts +24 -1
  37. package/dist/src/index.d.ts +2 -0
  38. package/dist/src/instances/InstanceObject.d.ts +57 -0
  39. package/dist/src/instances/index.d.ts +1 -0
  40. package/dist/src/interactions/MeshBVHRaycast.d.ts +9 -0
  41. package/dist/src/interactions/index.d.ts +1 -0
  42. package/dist/src/loaders/ModelDecodeWorkerClient.d.ts +31 -0
  43. package/dist/src/loaders/ModelLoaderManager.d.ts +15 -2
  44. package/dist/src/loaders/buildDecodedGltfModel.d.ts +4 -0
  45. package/dist/src/loaders/index.d.ts +1 -0
  46. package/dist/src/objects/Model.d.ts +1 -0
  47. package/dist/src/viewers/RenderPipeline.d.ts +37 -0
  48. package/dist/src/viewers/ReversedDepthSSGICompat.d.ts +10 -0
  49. package/dist/src/viewers/ReversedDepthSSRCompat.d.ts +20 -0
  50. package/dist/src/viewers/Viewer.d.ts +3 -1
  51. package/dist/src/viewers/renderInvalidation.d.ts +2 -0
  52. package/dist/src/worker/FrameTimingWindow.d.ts +16 -0
  53. package/dist/src/worker/OffscreenViewerHost.d.ts +20 -0
  54. package/dist/src/worker/WorkerDomTarget.d.ts +44 -0
  55. package/dist/src/worker/createWorkerViewer.d.ts +18 -0
  56. package/dist/src/worker/decodeGltfModel.d.ts +10 -0
  57. package/dist/src/worker/getTransferables.d.ts +1 -0
  58. package/dist/src/worker/index.d.ts +3 -0
  59. package/dist/src/worker/installWorkerImageLoader.d.ts +8 -0
  60. package/dist/src/worker/model-decoder.d.ts +13 -0
  61. package/dist/src/worker/modelDecodeProtocol.d.ts +205 -0
  62. package/dist/src/worker/protocol.d.ts +102 -0
  63. package/dist/src/worker/runtime.d.ts +2 -0
  64. package/dist/src/worker/workerImageUtils.d.ts +8 -0
  65. package/dist/worker/index.cjs +1 -0
  66. package/dist/worker/index.js +226 -0
  67. package/dist/worker/model-decoder.cjs +1 -0
  68. package/dist/worker/model-decoder.js +339 -0
  69. package/dist/worker/runtime.cjs +1 -0
  70. package/dist/worker/runtime.js +412 -0
  71. package/dist/workerImageUtils-lmOMyTQN.cjs +1 -0
  72. package/dist/workerImageUtils-mQD3TQ1N.js +105 -0
  73. package/docs/api-batches.md +112 -0
  74. package/docs/api-effects.md +2 -2
  75. package/docs/api-interactions.md +8 -0
  76. package/docs/api-managers.md +1 -1
  77. package/docs/api-objects.md +207 -0
  78. package/docs/api-plugin-u-manager.md +193 -102
  79. package/docs/api-render-pipeline.md +103 -5
  80. package/docs/api-viewer.md +232 -1
  81. package/docs/changelog.md +68 -12
  82. package/docs/examples-guide.md +104 -20
  83. package/docs/getting-started.md +1 -1
  84. package/docs/index.md +11 -4
  85. package/docs/mcp.md +30 -14
  86. package/docs/release.md +97 -0
  87. package/package.json +35 -4
  88. package/dist/plugins/u-manager/instances/SemanticInstanceObject.d.ts +0 -51
  89. package/dist/plugins/u-manager/instances/SemanticModelInstancedLayer.d.ts +0 -42
  90. package/dist/plugins/u-manager/instances/index.d.ts +0 -2
package/README.md CHANGED
@@ -20,4 +20,13 @@ const viewer = new Viewer({
20
20
  });
21
21
  ```
22
22
 
23
+ ## Release
24
+
25
+ Maintainers can publish `u-space`, `u-space-mcp`, docs, and examples with one command:
26
+
27
+ ```bash
28
+ pnpm release:all
29
+ ```
30
+
31
+ See the [release guide](https://u-space-phi.vercel.app/release) for the one-time npm Trusted Publishing and Vercel setup.
23
32
 
@@ -0,0 +1 @@
1
+ "use strict";const n=require("three/webgpu"),z=require("three-mesh-bvh"),a=require("three/tsl"),A=require("three/addons/tsl/display/BloomNode.js"),L=require("three/addons/tsl/display/TRAANode.js"),U=require("three/addons/tsl/display/SSGINode.js"),q=require("three/addons/tsl/display/RecurrentDenoiseNode.js"),V=require("three/addons/tsl/display/SSRNode.js"),H=require("three/addons/tsl/display/TemporalReprojectNode.js"),x=require("camera-controls"),G=require("three/addons/environments/RoomEnvironment.js"),W=require("three/addons/helpers/ViewHelper.js"),C=require("three/addons/renderers/CSS2DRenderer.js"),w=require("three/addons/renderers/CSS3DRenderer.js");class R{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 E{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;_enabled=!0;_excludeSet=new Set;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.raycaster.firstHitOnly=!0,this.targetObjects=this.scene.children,this._bindEvents()}setCamera(e){this.camera=e}enable(){this._enabled=!0}disable(){this._enabled=!1}setInteractable(e,t){t?this._excludeSet.delete(e):this._excludeSet.add(e)}addIgnore(e){this._excludeSet.add(e)}removeIgnore(e){this._excludeSet.delete(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.raycaster.intersectObjects(this.targetObjects,!0);return this._excludeSet.size>0?e.filter(t=>{let s=t.object;for(;s;){if(this._excludeSet.has(s))return!1;s=s.parent}return!0}):e}_dispatchToTarget(e,t,s,i){const o=new R({type:e,target:t,intersect:s,originalEvent:i});let h=t;for(;h&&!o.propagationStopped;)o.currentTarget=h,h.dispatchEvent({type:e,event:o}),h=h.parent}_handleEvent(e,t){if(!this._enabled)return;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._enabled||!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.clickTimer&&(clearTimeout(this.clickTimer),this.clickTimer=null),this.hoveredObject=null,this._excludeSet.clear()}}const Q=1e4,g=new WeakMap,P=new n.Sphere;function $(r){const e=r.getAttribute("position");if(!e)return 0;const t=r.index?.count??e.count,s=Math.min(t-r.drawRange.start,r.drawRange.count);return Math.max(0,Math.floor(s/3))}function M(r){if(g.has(r))return g.get(r)??null;if($(r)<Q)return g.set(r,null),null;let e=null;try{e=new z.MeshBVH(r,{indirect:!0,verbose:!1})}catch{}return g.set(r,e),e}function K(r,e){const{geometry:t}=r;return t.boundingSphere===null&&t.computeBoundingSphere(),t.boundingSphere?(P.copy(t.boundingSphere).applyMatrix4(r.matrixWorld),e.ray.intersectsSphere(P)):!0}function Y(r){return!(r instanceof n.InstancedMesh)&&!(r instanceof n.SkinnedMesh)&&!r.morphTargetInfluences&&r.raycast===n.Mesh.prototype.raycast&&!r.userData.raycastAcceleration}function X(r){return r.traverse(e=>{if(!(e instanceof n.Mesh)||!Y(e))return;const t=e,s=t.raycast.bind(t);let i;t.userData.raycastAcceleration="lazy",t.raycast=(o,h)=>{K(t,o)&&(i===void 0&&(i=M(t.geometry),t.userData.raycastAcceleration=i?"three-mesh-bvh":"default"),i?i.raycastObject3D(t,o,h):s(o,h))}}),r}function T(r,e){const t=r;if(t.setInstanceVisible){t.setInstanceVisible(e);return}r.visible=e,t.markInstanceRenderDirty?.()}class O{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}show(e){const t=this.idMap.get(e);t&&T(t,!0)}hide(e){const t=this.idMap.get(e);t&&T(t,!1)}isolate(e){const t=new Set(e);for(const s of this.allObjects){const i=this.objectIds.get(s)??new Set;T(s,[...i].some(o=>t.has(o)))}}setOpacity(e,t){const s=this.idMap.get(e);if(!s)return;const i=s;if(i.setInstanceOpacity){i.setInstanceOpacity(t);return}s.traverse(o=>{if(!o.isMesh)return;const h=o.material;if(!h)return;const l=Array.isArray(h)?h:[h];for(const u of l)u.transparent=t<1,u.opacity=t,u.needsUpdate=!0})}getBoundingBox(e){const t=new n.Box3;if(e){const s=this.idMap.get(e);s&&t.setFromObject(s)}else for(const s of this.allObjects)t.expandByObject(s);return t}forEach(e){for(const t of this.allObjects){const s=this.objectIds.get(t)||new Set;e(t,s)}}filter(e){const t=[];for(const s of this.allObjects)e(s)&&t.push(s);return t}showAll(){for(const e of this.allObjects)T(e,!0)}}function J(r){if(typeof r!="object"||r===null||!("_material"in r))throw new Error("ReversedDepthSSGINode: Three.js no longer exposes _material.");const e=r._material;if(typeof e!="object"||e===null||!("colorNode"in e)||!("needsUpdate"in e))throw new Error("ReversedDepthSSGINode: Three.js _material is incompatible.");return e}class Z extends U{setup(e){const t=super.setup(e);if(!e.renderer.reversedDepthBuffer)return t;const s=J(this),i=s.colorNode;if(i===null)throw new Error("ReversedDepthSSGINode: Three.js did not build its color node.");return s.colorNode=a.Fn(()=>(this.depthNode.sample(a.uv()).r.lessThanEqual(0).discard(),i))().context(e.getSharedContext()),s.needsUpdate=!0,t}}const ee=(r,e,t,s)=>a.nodeObject(new Z(a.convertToTexture(r),a.nodeObject(e),a.nodeObject(t),s));function N(r,e,t){if(typeof r!="object"||r===null||!(e in r))throw new Error(`${t}: Three.js no longer exposes ${e}.`);const s=r[e];if(typeof s!="object"||s===null||!("fragmentNode"in s)||!("needsUpdate"in s))throw new Error(`${t}: Three.js ${e} is incompatible.`);return s}function I(r,e){if(r.fragmentNode===null)throw new Error(`${e}: Three.js did not build its fragment node.`);return r.fragmentNode}function te(r){return"getTextureNode"in r&&typeof r.getTextureNode=="function"}class se extends V{setup(e){const t=super.setup(e);if(!e.renderer.reversedDepthBuffer)return t;const s=this;if(typeof s._ssrFn!="function"||typeof s._buildSSRMaterial!="function")throw new Error("ReversedDepthSSRNode: Three.js SSR internals are incompatible.");const i=s._ssrFn;return s._ssrFn=a.Fn(()=>(this.depthNode.sample(a.uv()).r.lessThanEqual(0).discard(),i())),s._buildSSRMaterial(),t}}class ie extends H{setup(e){const t=super.setup(e);if(!e.renderer.reversedDepthBuffer)return t;const s=N(this,"_resolveMaterial","ReversedDepthTemporalReprojectNode"),i=I(s,"ReversedDepthTemporalReprojectNode");return s.fragmentNode=a.Fn(()=>{const o=a.ivec2(a.floor(a.screenCoordinate.xy.sub(.5)));return a.textureLoad(this.depthNode,o).r.lessThanEqual(0).discard(),i})().context(e.getSharedContext()),s.needsUpdate=!0,t}}class ne extends q{setup(e){const t=super.setup(e);if(!e.renderer.reversedDepthBuffer)return t;const s=N(this,"_material","ReversedDepthRecurrentDenoiseNode"),i=I(s,"ReversedDepthRecurrentDenoiseNode");return s.fragmentNode=a.Fn(()=>((this.depthNode?this.depthNode.sample(a.uv()).x:a.float(.5)).lessThanEqual(0).discard(),i))().context(e.getSharedContext()),s.needsUpdate=!0,t}}const re=(r,e,t,s={})=>a.nodeObject(new se(a.nodeObject(r),a.nodeObject(e),a.nodeObject(t),s)),ae=(r,e,t,s,i,o={})=>a.nodeObject(new ie(a.convertToTexture(r),a.nodeObject(e),a.nodeObject(t),a.nodeObject(s),i,o)),oe=(r,e,t={})=>{const s=te(r)?r.getTextureNode():a.convertToTexture(r);return a.nodeObject(new ne(s,e,t))};class D extends n.RenderPipeline{scene;camera;scenePass;needsUpdateOutputNode;#r;#s;#a=!1;#l={strength:1,radius:0,threshold:0};#o=null;#h=!1;#c={sliceCount:1,stepCount:12,aoIntensity:1,giIntensity:10,radius:12,thickness:1};#g=null;#i=!1;#d={resolutionScale:1,quality:.25,mirrorBias:.5,maxDistance:.4,intensity:1,thickness:.1,maxLuminance:35,stepExponent:3,binaryRefine:!1,screenEdgeFade:.2,screenEdgeFadeBlack:!0,temporal:{maxFrames:16,clampIntensity:.25,flickerSuppression:1,hitPointReprojection:!0},denoise:{lumaPhi:.75,depthPhi:20,normalPhi:.3,roughnessPhi:100,radius:1.5,alphaPhi:5,strength:.725,adapt:.5,smoothDisocclusions:!0,flickerSuppression:1,adaptiveTrust:1}};#e=null;#u=null;#t=null;#T=new n.DataTexture(new Float32Array([0,0,0,1]),1,1,n.RGBAFormat,n.FloatType);#m=!1;#f=null;#y=null;#v;#p;#S=!1;#w=!0;constructor(...e){const[t,s,i]=e;super(t),this.scene=s,this.camera=i,this.scenePass=a.pass(s,i),this.needsUpdateOutputNode=!0,this.#r=new Set,this.#s=[],this.#v=new Set,this.#p=new Map,this.#T.needsUpdate=!0,this.#P()}get currentOutputNode(){return this.scenePass}addOverlayPass(e){this.#r.add(e),this.needsUpdateOutputNode=!0}removeOverlayPass(e){this.#r.delete(e),this.needsUpdateOutputNode=!0}setCamera(e){this.camera=e,this.#n()}setCurrentOutputNode(e){this.setOutputComposer(()=>e)}resetCurrentOutputNode(){this.setOutputComposer(null)}setOutputComposer(e){this.#y=e,this.needsUpdateOutputNode=!0}addOutputEffect(e){return this.#v.add(e),this.needsUpdateOutputNode=!0,this}removeOutputEffect(e){return this.#v.delete(e),this.needsUpdateOutputNode=!0,this}addMRTChannel(e,t){return this.#p.get(e)===t?this:(this.#p.set(e,t),this.#n(),this)}removeMRTChannel(e){return this.#p.delete(e)&&this.#n(),this}enableBloom(e){e&&Object.assign(this.#l,e),this.#a=!0,this.#n()}disableBloom(){this.#a=!1,this.#o=null,this.#n()}updateBloom(e){Object.assign(this.#l,e),this.#a&&(this.needsUpdateOutputNode=!0)}enableSSGI(e){e&&Object.assign(this.#c,e),this.#h=!0,this.#n()}disableSSGI(){this.#h=!1,this.#g=null,this.#n()}updateSSGI(e){if(Object.assign(this.#c,e),this.#g){const t=this.#g;e.sliceCount!==void 0&&(t.sliceCount.value=e.sliceCount),e.stepCount!==void 0&&(t.stepCount.value=e.stepCount),e.aoIntensity!==void 0&&(t.aoIntensity.value=e.aoIntensity),e.giIntensity!==void 0&&(t.giIntensity.value=e.giIntensity),e.radius!==void 0&&(t.radius.value=e.radius),e.thickness!==void 0&&(t.thickness.value=e.thickness)}}enableSSR(e){e&&this.#C(e),this.#i=!0,this.#n()}disableSSR(){this.#i=!1,this.#e=null,this.#u=null,this.#t=null,this.#n()}updateSSR(e){if(this.#C(e),this.#e){const t=this.#d;this.#e.resolutionScale=t.resolutionScale,this.#e.quality.value=t.quality,this.#e.mirrorBias.value=t.mirrorBias,this.#e.maxDistance.value=t.maxDistance,this.#e.intensity.value=t.intensity,this.#e.thickness.value=t.thickness,this.#e.maxLuminance.value=t.maxLuminance,this.#e.stepExponent=t.stepExponent,this.#e.binaryRefine=t.binaryRefine,this.#e.screenEdgeFade.value=t.screenEdgeFade,this.#e.screenEdgeFadeBlack=t.screenEdgeFadeBlack}if(this.#u){const t=this.#d.temporal;this.#u.maxFrames.value=t.maxFrames,this.#u.clampIntensity.value=t.clampIntensity,this.#u.flickerSuppression.value=t.flickerSuppression,this.#u.hitPointReprojection.value=t.hitPointReprojection}if(this.#t){const t=this.#d.denoise;this.#t.lumaPhi.value=t.lumaPhi,this.#t.depthPhi.value=t.depthPhi,this.#t.normalPhi.value=t.normalPhi,this.#t.roughnessPhi.value=t.roughnessPhi,this.#t.radius.value=t.radius,this.#t.alphaPhi.value=t.alphaPhi,this.#t.strength.value=t.strength,this.#t.adapt.value=t.adapt,this.#t.smoothDisocclusions.value=t.smoothDisocclusions,this.#t.flickerSuppression.value=t.flickerSuppression,this.#t.adaptiveTrust.value=t.adaptiveTrust}}enableTRAA(){this.#m=!0,this.#n()}disableTRAA(){this.#m=!1,this.#f=null,this.#n()}#C(e){const{temporal:t,denoise:s,...i}=e;Object.assign(this.#d,i),t&&Object.assign(this.#d.temporal,t),s&&Object.assign(this.#d.denoise,s)}#n(){const e=this.scenePass;this.scenePass=a.pass(this.scene,this.camera),this.#P(),this.needsUpdateOutputNode=!0,e.dispose()}#P(){if(this.#a||this.#h||this.#i||this.#m||this.#p.size>0){const t={output:a.output};this.#p.forEach((s,i)=>{i!=="output"&&(t[i]=s)}),this.#a&&(t.emissive=a.emissive),this.#h&&(t.normal=a.normalView,this.#i||(t.ssgiDiffuse=a.diffuseColor)),this.#i&&(t.ssrDiffuse=a.vec4(a.diffuseColor.rgb,a.materialMetalness),t.ssrNormal=a.vec4(a.packNormalToRGB(a.normalView).rgb,a.materialRoughness)),(this.#m||this.#i)&&(t.velocity=a.velocity),this.scenePass.setMRT(a.mrt(t)),this.#h&&!this.#i&&(this.scenePass.getTexture("ssgiDiffuse").type=n.UnsignedByteType),this.#i&&(this.scenePass.getTexture("ssrDiffuse").type=n.UnsignedByteType,this.scenePass.getTexture("ssrNormal").type=n.UnsignedByteType)}}#b(){for(const e of this.#s)e.dispose();this.#s=[]}#x(){let e=this.scenePass.getTextureNode();if(this.#h)if(!(this.camera instanceof n.PerspectiveCamera))console.warn("RenderPipeline: SSGI requires a PerspectiveCamera, skipping.");else{const t=this.scenePass.getTextureNode(),s=this.scenePass.getTextureNode("depth"),i=this.scenePass.getTextureNode("normal"),o=this.scenePass.getTextureNode(this.#i?"ssrDiffuse":"ssgiDiffuse"),h=ee(t,s,i,this.camera);h.sliceCount.value=this.#c.sliceCount,h.stepCount.value=this.#c.stepCount,h.aoIntensity.value=this.#c.aoIntensity,h.giIntensity.value=this.#c.giIntensity,h.radius.value=this.#c.radius,h.thickness.value=this.#c.thickness,this.#g=h;const l=h.getAONode(),u=h.getGINode();e=a.vec4(e.rgb.mul(l.r).add(o.rgb.mul(u.rgb)),e.a),this.#s.push(h)}if(this.#i)if(!(this.camera instanceof n.PerspectiveCamera))console.warn("RenderPipeline: SSR requires a PerspectiveCamera, skipping.");else{const t=this.#d,s=this.scenePass.getTextureNode(),i=this.scenePass.getTextureNode("depth"),o=this.scenePass.getTextureNode("velocity"),h=this.scenePass.getTextureNode("ssrNormal"),l=this.scenePass.getTextureNode("ssrDiffuse"),u=a.sample(v=>a.unpackRGBToNormal(h.sample(v).rgb)),S=a.sample(v=>a.vec2(l.sample(v).a,h.sample(v).a)),c=re(s,i,u,{stochastic:!0,diffuseNode:l,metalnessNode:l.a,roughnessNode:h.a,environmentNode:this.#T,binaryRefine:t.binaryRefine,camera:this.camera});c.resolutionScale=t.resolutionScale,c.quality.value=t.quality,c.mirrorBias.value=t.mirrorBias,c.maxDistance.value=t.maxDistance,c.intensity.value=t.intensity,c.thickness.value=t.thickness,c.maxLuminance.value=t.maxLuminance,c.stepExponent=t.stepExponent,c.screenEdgeFade.value=t.screenEdgeFade,c.screenEdgeFadeBlack=t.screenEdgeFadeBlack;const m=t.temporal;this.renderer.reversedDepthBuffer&&(i.value.type=n.FloatType);const f=ae(c,i,h,o,this.camera,{mode:"specular",accumulate:!1,hitPointReprojection:m.hitPointReprojection}),F=f;F._historyRenderTarget.depthTexture.type=i.value.type,f.maxFrames.value=m.maxFrames,f.clampIntensity.value=m.clampIntensity,f.flickerSuppression.value=m.flickerSuppression;const p=t.denoise,d=oe(f,this.camera,{depth:i,normal:h,raw:c,metalRoughness:S,mode:"specular",accumulate:!0});d.alphaSource="raylength",d.lumaPhi.value=p.lumaPhi,d.depthPhi.value=p.depthPhi,d.normalPhi.value=p.normalPhi,d.roughnessPhi.value=p.roughnessPhi,d.radius.value=p.radius,d.alphaPhi.value=p.alphaPhi,d.strength.value=p.strength,d.adapt.value=p.adapt,d.smoothDisocclusions.value=p.smoothDisocclusions,d.flickerSuppression.value=p.flickerSuppression,d.adaptiveTrust.value=p.adaptiveTrust,c.setHistory(d,o),f.setHistoryTexture(d),this.#e=c,this.#u=f,this.#t=d,this.#s.push(c,f,d),e=a.vec4(e.rgb.add(d.rgb),1)}if(this.#a){const t=this.scenePass.getTextureNode("emissive");this.#o=A.bloom(t,this.#l.strength,this.#l.radius,this.#l.threshold),e=a.add(e,this.#o),this.#s.push(this.#o)}return e}#R(e){e?(this.#S||(this.#w=this.outputColorTransform),this.outputColorTransform=!1):this.#S&&(this.outputColorTransform=this.#w),this.#S=e}#E(){this.#b();let e,t=!1,s=!1;const i=this.#y!==null;if(i?e=this.#y(this.scenePass):this.#a||this.#h||this.#i?e=this.#x():e=this.#v.size>0?this.scenePass.getTextureNode():this.scenePass,i||this.#v.forEach(o=>{t||=o.includesTemporalAntialias===!0,s||=o.includesOutputTransform===!0,e=o(this.scenePass,e)}),this.#R(s),this.#m&&!t){const o=this.scenePass.getTextureNode("depth"),h=this.scenePass.getTextureNode("velocity");this.#f=L.traa(e,o,h,this.camera),this.#s.push(this.#f),e=this.#f}else this.#f=null;this.#r.size>0&&this.#r.forEach(o=>{const h=a.blendColor(e,o);this.#s.push(h),e=h}),this.outputNode=e,this.needsUpdate=!0}render(){this.needsUpdateOutputNode&&(this.#E(),this.needsUpdateOutputNode=!1),super.render()}dispose(){this.#b(),this.#T.dispose(),this.scenePass.dispose(),super.dispose()}}const he={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};x.install({THREE:he});class _ extends x{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:o=.1,cover:h=!1}=t;if(s!=="current"){const l=s.toUpperCase(),u=b[l]??b.FRONTTOP,S=u.theta,c=u.phi;if(await this.rotateTo(S,c,i),le.has(l))await this.fitToBox(e,i,{paddingLeft:o,paddingRight:o,paddingTop:o,paddingBottom:o,cover:h});else{const m=new n.Sphere;e.getBoundingSphere(m),m.radius+=o,await this.fitToSphere(m,i)}}else{const l=new n.Sphere;e.getBoundingSphere(l),l.radius+=o,await this.fitToSphere(l,i)}return!0}async flyToObject(e,t={}){const s=new n.Box3().setFromObject(e);return this.flyToBox(s,t)}async flyTo(e,t,s={}){const{enableTransition:i=!0}=s;return this.absoluteRotations(),this.setLookAt(e.x,e.y,e.z,t.x,t.y,t.z,i)}getCameraViewpoint(){const e=new n.Vector3,t=new n.Vector3;return this.getPosition(e),this.getTarget(t),{position:{x:e.x,y:e.y,z:e.z},target:{x:t.x,y:t.y,z:t.z},zoom:this.camera.zoom}}lock(){this.enabled=!1}unlock(){this.enabled=!0}async setViewMode(e,t=!0){if(e==="2d"){const s=new n.Vector3;this.getTarget(s),await this.rotateTo(0,0,t),this.minPolarAngle=0,this.maxPolarAngle=0}else this.minPolarAngle=0,this.maxPolarAngle=Math.PI,await this.rotateTo(0,Math.PI/4,t)}async setCameraViewpoint(e,t=!0){const{position:s,target:i,zoom:o=this.camera.zoom}=e;return Promise.all([this.zoomTo(o,t),this.setLookAt(s.x,s.y,s.z,i.x,i.y,i.z,t)])}}const b={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)},le=new Set(["LEFT","RIGHT","FRONT","BACK","TOP","BOTTOM"]);function ce(r,e){const t=r-e;return n.MathUtils.euclideanModulo(t+Math.PI,Math.PI*2)-Math.PI}class j{environment=new G.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 y=128;class de extends W.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=a.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-y-e.right,e.top!==null?s=e.top:s=this.viewer.el.offsetHeight-y-e.bottom,this.overlayPass.setViewport(t,s,y,y)};enable(){return this.viewer.renderPipeline.addOverlayPass(this.overlayPass),this.viewer.addEventListener("beforeRender",this._update),this.viewer.invalidate(),this}disable(){return this.viewer.renderPipeline.removeOverlayPass(this.overlayPass),this.viewer.removeEventListener("beforeRender",this._update),this.viewer.invalidate(),this}}const B="position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;overflow:hidden;",ue=B+"z-index:0;",pe=B+"z-index:1;";class k{el;css2dRenderer=null;css3dRenderer=null;constructor(e){this.el=e,getComputedStyle(e).position==="static"&&(e.style.position="relative")}initCSS2DRenderer(){const e=new C.CSS2DRenderer;return e.setSize(this.el.clientWidth,this.el.clientHeight),e.domElement.style.cssText=pe,this.el.appendChild(e.domElement),this.css2dRenderer=e,e}initCSS3DRenderer(){const e=new w.CSS3DRenderer;return e.setSize(this.el.clientWidth,this.el.clientHeight),e.domElement.style.cssText=ue,this.el.appendChild(e.domElement),this.css3dRenderer=e,e}createCSS2DObject(e){return this.css2dRenderer||this.initCSS2DRenderer(),new C.CSS2DObject(e)}createCSS25DObject(e){return this.css3dRenderer||this.initCSS3DRenderer(),new w.CSS3DSprite(e)}createCSS3DObject(e){return this.css3dRenderer||this.initCSS3DRenderer(),new w.CSS3DObject(e)}render(e,t){this.css2dRenderer&&this.css2dRenderer.render(e,t),this.css3dRenderer&&this.css3dRenderer.render(e,t)}resize(e,t){this.css2dRenderer&&this.css2dRenderer.setSize(e,t),this.css3dRenderer&&this.css3dRenderer.setSize(e,t)}dispose(){this.css2dRenderer&&(this.el.removeChild(this.css2dRenderer.domElement),this.css2dRenderer=null),this.css3dRenderer&&(this.el.removeChild(this.css3dRenderer.domElement),this.css3dRenderer=null)}}const me="timestamp-query";class fe{el;renderer;container;drawCallsText;frameCallsText;trianglesText;pointsText;linesText;timestampText;_enabled=!1;#r=!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(h,l=!0){const u=document.createElement("span");return l&&(u.style.marginLeft="6px"),u.innerText=h,u}function o(){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(o()),this.container.appendChild(i("frame calls",!1)),this.container.appendChild(this.frameCallsText),this.container.appendChild(o()),this.container.appendChild(i("triangles",!1)),this.container.appendChild(this.trianglesText),this.container.appendChild(o()),this.container.appendChild(i("points",!1)),this.container.appendChild(this.pointsText),this.container.appendChild(o()),this.container.appendChild(i("lines",!1)),this.container.appendChild(this.linesText),this.container.appendChild(o()),this.container.appendChild(i("timestamp",!1)),this.container.appendChild(this.timestampText),this.container.appendChild(o())}update(){if(this._enabled){const{render:e}=this.renderer.info;if(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.#r){this.timestampText.innerText="0";return}this.#o(n.TimestampQuery.RENDER).then(t=>{this._enabled&&(this.timestampText.innerText=t?.toFixed(2)??"0")}),this.#o(n.TimestampQuery.COMPUTE)}}enable(){this._enabled=!0,this.#l(!0),this.el.appendChild(this.container)}disable(){this._enabled=!1,this.#l(!1),this.#h(),this.container.remove()}dispose(){this.disable()}#s(){return this.renderer.backend}#a(){try{return this.renderer.hasFeature(me)}catch{return!0}}#l(e){const t=this.#s();if(!t){this.#r=!1;return}t.trackTimestamp=e&&this.#a(),this.#r=t.trackTimestamp===!0}#o(e){const t=this.#s()?.timestampQueryPool?.[e];return t?.resolveQueriesAsync?Promise.resolve(t.resolveQueriesAsync()).catch(()=>{}):Promise.resolve(void 0)}#h(){this.#o(n.TimestampQuery.RENDER),this.#o(n.TimestampQuery.COMPUTE)}}function ve(r,e=1){return Number.isFinite(e)?Math.max(r,Math.max(0,Math.ceil(e))):r}n.Cache.enabled=!0;class ge extends n.EventDispatcher{el;renderer;scene;camera;info;controls;renderPipeline;timer;roomEnvironment;interactionManager;objectManager;viewerHelper;cssRenderer;frameCount=1;frameloop="demand";constructor({el:e,rendererOptions:t,pixelRatio:s}){super(),this.el=e,this.renderer=this._initRenderer(t,s),this.scene=this.createScene(),this.camera=this.createPerspectiveCamera(),this.info=new fe(this.el,this.renderer),this.controls=new _(this.camera,this.renderer.domElement),this.renderPipeline=new D(this.renderer,this.scene,this.camera),this.timer=new n.Timer,this.roomEnvironment=new j(this.renderer),this.interactionManager=new E(this.renderer.domElement,this.scene,this.camera),this.objectManager=new O,this.viewerHelper=new de(this),this.cssRenderer=new k(this.el),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.cssRenderer.resize(e,t),this.invalidate()};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())}invalidate(e=1){this.frameCount=ve(this.frameCount,e)}render(e=1){return this.invalidate(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.cssRenderer.render(this.scene,this.camera),this.info.update(),this.dispatchEvent({type:"afterRender",time:e,delta:t}))};_initRenderer(e,t=Math.min(window.devicePixelRatio,1.5)){const s=new n.WebGPURenderer({reversedDepthBuffer:!0,antialias:!1,depth:!1,trackTimestamp:!1,...e});return s.setPixelRatio(t),s.setSize(this.el.clientWidth,this.el.clientHeight),s.shadowMap.enabled=!0,s.shadowMap.type=n.PCFShadowMap,s.toneMapping=n.AgXToneMapping,s.toneMappingExposure=1,s.info.autoReset=!1,s.setAnimationLoop(this.animate),this.el.appendChild(s.domElement),s}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}resize(e,t){e!==void 0&&t!==void 0&&(this.el.style.width=`${e}px`,this.el.style.height=`${t}px`),this.onWindowResize()}async screenshot(e={}){const{type:t="image/png",quality:s=1}=e,i=this.el.clientWidth,o=this.el.clientHeight,h=e.width&&e.height;h&&this.renderer.setSize(e.width,e.height),await this.render();const l=this.renderer.domElement.toDataURL(t,s);return h&&(this.renderer.setSize(i,o),this.onWindowResize()),l}setBackground(e){e===null?this.scene.background=null:e instanceof n.Color||typeof e=="number"||typeof e=="string"?this.scene.background=new n.Color(e):this.scene.background=e,this.invalidate()}setEnvironment(e){this.scene.environment=e,this.invalidate()}enableShadow(){this.renderer.shadowMap.enabled=!0,this.invalidate()}disableShadow(){this.renderer.shadowMap.enabled=!1,this.invalidate()}enableFog(e={}){const{color:t=13421772,near:s=10,far:i=100}=e;this.scene.fog=new n.Fog(t,s,i),this.invalidate()}enableFogExp2(e={}){const{color:t=13421772,density:s=.01}=e;this.scene.fog=new n.FogExp2(t,s),this.invalidate()}disableFog(){this.scene.fog=null,this.invalidate()}dispose(){this.el.removeChild(this.renderer.domElement),window.removeEventListener("resize",this.onWindowResize),this.info.dispose(),this.interactionManager.dispose(),this.roomEnvironment.dispose(),this.cssRenderer.dispose(),this.renderPipeline.dispose(),this.renderer.dispose()}}exports.CSSRenderer=k;exports.CameraControls=_;exports.InteractionEvent=R;exports.InteractionManager=E;exports.ObjectManager=O;exports.RenderPipeline=D;exports.RoomEnvironment=j;exports.Viewer=ge;exports.enableMeshBVHRaycast=X;exports.getGeometryBoundsTree=M;