@onerjs/core 8.55.8 → 8.56.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.
- package/Animations/animation.pure.js +2 -2
- package/Animations/animation.pure.js.map +1 -1
- package/Animations/runtimeAnimation.js +4 -0
- package/Animations/runtimeAnimation.js.map +1 -1
- package/AudioV2/webAudio/webAudioEngine.d.ts +7 -0
- package/AudioV2/webAudio/webAudioEngine.js +6 -5
- package/AudioV2/webAudio/webAudioEngine.js.map +1 -1
- package/Behaviors/Cameras/autoRotationBehavior.js +1 -1
- package/Behaviors/Cameras/autoRotationBehavior.js.map +1 -1
- package/Behaviors/Meshes/followBehavior.js +1 -0
- package/Behaviors/Meshes/followBehavior.js.map +1 -1
- package/Behaviors/Meshes/surfaceMagnetismBehavior.js +1 -0
- package/Behaviors/Meshes/surfaceMagnetismBehavior.js.map +1 -1
- package/Cameras/Inputs/followCameraMouseWheelInput.js +2 -2
- package/Cameras/Inputs/followCameraMouseWheelInput.js.map +1 -1
- package/Cameras/Inputs/followCameraPointersInput.d.ts +15 -0
- package/Cameras/Inputs/followCameraPointersInput.js +18 -3
- package/Cameras/Inputs/followCameraPointersInput.js.map +1 -1
- package/Cameras/Stereoscopic/stereoscopicScreenUniversalCamera.js +1 -1
- package/Cameras/Stereoscopic/stereoscopicScreenUniversalCamera.js.map +1 -1
- package/Cameras/Stereoscopic/stereoscopicUniversalCamera.pure.js +1 -1
- package/Cameras/Stereoscopic/stereoscopicUniversalCamera.pure.js.map +1 -1
- package/Cameras/arcRotateCamera.pure.js +1 -1
- package/Cameras/arcRotateCamera.pure.js.map +1 -1
- package/Collisions/gpuPicker.d.ts +1 -0
- package/Collisions/gpuPicker.js +5 -4
- package/Collisions/gpuPicker.js.map +1 -1
- package/Culling/Helper/boundingInfoHelper.js +9 -5
- package/Culling/Helper/boundingInfoHelper.js.map +1 -1
- package/Culling/boundingSphere.js +7 -4
- package/Culling/boundingSphere.js.map +1 -1
- package/Engines/AbstractEngine/abstractEngine.textureLoaders.d.ts +5 -1
- package/Engines/AbstractEngine/abstractEngine.textureLoaders.js +7 -3
- package/Engines/AbstractEngine/abstractEngine.textureLoaders.js.map +1 -1
- package/Engines/AbstractEngine/abstractEngine.textureLoaders.pure.d.ts +6 -0
- package/Engines/AbstractEngine/abstractEngine.textureLoaders.pure.js +16 -0
- package/Engines/AbstractEngine/abstractEngine.textureLoaders.pure.js.map +1 -0
- package/Engines/AbstractEngine/pure.d.ts +1 -0
- package/Engines/AbstractEngine/pure.js +1 -0
- package/Engines/AbstractEngine/pure.js.map +1 -1
- package/Engines/Extensions/engine.prefilteredCubeTexture.pure.js +1 -1
- package/Engines/Extensions/engine.prefilteredCubeTexture.pure.js.map +1 -1
- package/Engines/IDrawContext.d.ts +2 -0
- package/Engines/IDrawContext.js.map +1 -1
- package/Engines/Native/Extensions/nativeEngine.cubeTexture.pure.js +48 -6
- package/Engines/Native/Extensions/nativeEngine.cubeTexture.pure.js.map +1 -1
- package/Engines/Native/nativeInterfaces.d.ts +1 -1
- package/Engines/Native/nativeInterfaces.js.map +1 -1
- package/Engines/WebGPU/webgpuDrawContext.d.ts +8 -0
- package/Engines/WebGPU/webgpuDrawContext.js +15 -0
- package/Engines/WebGPU/webgpuDrawContext.js.map +1 -1
- package/Engines/abstractEngine.pure.js +2 -2
- package/Engines/abstractEngine.pure.js.map +1 -1
- package/Engines/engine.d.ts +21 -4
- package/Engines/thinNativeEngine.pure.d.ts +6 -1
- package/Engines/thinNativeEngine.pure.js +29 -2
- package/Engines/thinNativeEngine.pure.js.map +1 -1
- package/Engines/webgpuEngine.d.ts +1 -0
- package/Engines/webgpuEngine.js +1 -0
- package/Engines/webgpuEngine.js.map +1 -1
- package/Engines/webgpuEngine.pure.d.ts +10 -0
- package/Engines/webgpuEngine.pure.js +15 -1
- package/Engines/webgpuEngine.pure.js.map +1 -1
- package/FlowGraph/Blocks/Data/flowGraphIsKeyPressedBlock.d.ts +3 -63
- package/FlowGraph/Blocks/Data/flowGraphIsKeyPressedBlock.js +5 -71
- package/FlowGraph/Blocks/Data/flowGraphIsKeyPressedBlock.js.map +1 -1
- package/FlowGraph/Blocks/Data/flowGraphIsKeyPressedBlock.pure.d.ts +71 -0
- package/FlowGraph/Blocks/Data/flowGraphIsKeyPressedBlock.pure.js +86 -0
- package/FlowGraph/Blocks/Data/flowGraphIsKeyPressedBlock.pure.js.map +1 -0
- package/FlowGraph/Blocks/Data/pure.d.ts +1 -0
- package/FlowGraph/Blocks/Data/pure.js +1 -0
- package/FlowGraph/Blocks/Data/pure.js.map +1 -1
- package/FlowGraph/Blocks/Event/flowGraphKeyDownEventBlock.d.ts +3 -37
- package/FlowGraph/Blocks/Event/flowGraphKeyDownEventBlock.js +5 -39
- package/FlowGraph/Blocks/Event/flowGraphKeyDownEventBlock.js.map +1 -1
- package/FlowGraph/Blocks/Event/flowGraphKeyDownEventBlock.pure.d.ts +45 -0
- package/FlowGraph/Blocks/Event/flowGraphKeyDownEventBlock.pure.js +54 -0
- package/FlowGraph/Blocks/Event/flowGraphKeyDownEventBlock.pure.js.map +1 -0
- package/FlowGraph/Blocks/Event/flowGraphKeyUpEventBlock.d.ts +3 -17
- package/FlowGraph/Blocks/Event/flowGraphKeyUpEventBlock.js +5 -22
- package/FlowGraph/Blocks/Event/flowGraphKeyUpEventBlock.js.map +1 -1
- package/FlowGraph/Blocks/Event/flowGraphKeyUpEventBlock.pure.d.ts +25 -0
- package/FlowGraph/Blocks/Event/flowGraphKeyUpEventBlock.pure.js +37 -0
- package/FlowGraph/Blocks/Event/flowGraphKeyUpEventBlock.pure.js.map +1 -0
- package/FlowGraph/Blocks/Event/pure.d.ts +2 -0
- package/FlowGraph/Blocks/Event/pure.js +2 -0
- package/FlowGraph/Blocks/Event/pure.js.map +1 -1
- package/FlowGraph/Blocks/flowGraphBlockFactory.d.ts +1 -1
- package/FlowGraph/Blocks/flowGraphBlockFactory.js +198 -172
- package/FlowGraph/Blocks/flowGraphBlockFactory.js.map +1 -1
- package/FrameGraph/Tasks/Rendering/iblShadowsRendererTask.pure.js +2 -5
- package/FrameGraph/Tasks/Rendering/iblShadowsRendererTask.pure.js.map +1 -1
- package/FrameGraph/frameGraph.js +10 -1
- package/FrameGraph/frameGraph.js.map +1 -1
- package/Gamepads/gamepadManager.d.ts +1 -0
- package/Gamepads/gamepadManager.js +5 -2
- package/Gamepads/gamepadManager.js.map +1 -1
- package/Gizmos/scaleGizmo.js +1 -0
- package/Gizmos/scaleGizmo.js.map +1 -1
- package/Lights/IES/iesLoader.js +6 -8
- package/Lights/IES/iesLoader.js.map +1 -1
- package/Lights/Shadows/cascadedShadowGenerator.pure.js +4 -6
- package/Lights/Shadows/cascadedShadowGenerator.pure.js.map +1 -1
- package/Lights/Shadows/shadowGenerator.js +2 -2
- package/Lights/Shadows/shadowGenerator.js.map +1 -1
- package/Lights/light.js +3 -5
- package/Lights/light.js.map +1 -1
- package/Lights/spotLight.pure.js +1 -1
- package/Lights/spotLight.pure.js.map +1 -1
- package/Materials/Background/backgroundMaterial.pure.d.ts +1 -1
- package/Materials/Background/backgroundMaterial.pure.js +3 -12
- package/Materials/Background/backgroundMaterial.pure.js.map +1 -1
- package/Materials/GaussianSplatting/gaussianSplattingMaterial.pure.js +2 -0
- package/Materials/GaussianSplatting/gaussianSplattingMaterial.pure.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/TBNBlock.pure.js +1 -1
- package/Materials/Node/Blocks/Fragment/TBNBlock.pure.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/imageProcessingBlock.pure.js +2 -0
- package/Materials/Node/Blocks/Fragment/imageProcessingBlock.pure.js.map +1 -1
- package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.pure.js +1 -0
- package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.pure.js.map +1 -1
- package/Materials/Node/Blocks/powBlock.pure.js +2 -1
- package/Materials/Node/Blocks/powBlock.pure.js.map +1 -1
- package/Materials/Node/Blocks/triPlanarBlock.pure.js +14 -12
- package/Materials/Node/Blocks/triPlanarBlock.pure.js.map +1 -1
- package/Materials/Node/nodeMaterial.pure.d.ts +1 -0
- package/Materials/Node/nodeMaterialBuildState.d.ts +3 -3
- package/Materials/PBR/openpbrMaterial.pure.d.ts +2 -1
- package/Materials/PBR/openpbrMaterial.pure.js +3 -12
- package/Materials/PBR/openpbrMaterial.pure.js.map +1 -1
- package/Materials/PBR/pbrBaseMaterial.pure.d.ts +2 -1
- package/Materials/PBR/pbrBaseMaterial.pure.js +3 -12
- package/Materials/PBR/pbrBaseMaterial.pure.js.map +1 -1
- package/Materials/Textures/index.d.ts +1 -0
- package/Materials/Textures/index.js +1 -0
- package/Materials/Textures/index.js.map +1 -1
- package/Materials/Textures/renderTargetTexture.pure.js +1 -1
- package/Materials/Textures/renderTargetTexture.pure.js.map +1 -1
- package/Materials/drawWrapper.js +3 -0
- package/Materials/drawWrapper.js.map +1 -1
- package/Materials/imageProcessingConfiguration.defines.d.ts +3 -0
- package/Materials/imageProcessingConfiguration.defines.js +2 -0
- package/Materials/imageProcessingConfiguration.defines.js.map +1 -1
- package/Materials/imageProcessingConfiguration.functions.js +3 -0
- package/Materials/imageProcessingConfiguration.functions.js.map +1 -1
- package/Materials/imageProcessingConfiguration.pure.d.ts +58 -0
- package/Materials/imageProcessingConfiguration.pure.js +123 -2
- package/Materials/imageProcessingConfiguration.pure.js.map +1 -1
- package/Materials/material.pure.js +2 -2
- package/Materials/material.pure.js.map +1 -1
- package/Materials/standardMaterial.pure.d.ts +2 -1
- package/Materials/standardMaterial.pure.js +4 -13
- package/Materials/standardMaterial.pure.js.map +1 -1
- package/Materials/uniformBuffer.d.ts +29 -0
- package/Materials/uniformBuffer.js +146 -0
- package/Materials/uniformBuffer.js.map +1 -1
- package/Maths/colorTemperature.functions.d.ts +29 -0
- package/Maths/colorTemperature.functions.js +196 -0
- package/Maths/colorTemperature.functions.js.map +1 -0
- package/Maths/index.d.ts +1 -0
- package/Maths/index.js +1 -0
- package/Maths/index.js.map +1 -1
- package/Maths/math.path.js +1 -1
- package/Maths/math.path.js.map +1 -1
- package/Maths/math.polar.js +1 -1
- package/Maths/math.polar.js.map +1 -1
- package/Maths/math.vector.pure.js +4 -3
- package/Maths/math.vector.pure.js.map +1 -1
- package/Maths/pure.d.ts +1 -0
- package/Maths/pure.js +1 -0
- package/Maths/pure.js.map +1 -1
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.d.ts +72 -0
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.js +164 -1
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.js.map +1 -1
- package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.d.ts +2 -1
- package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js +36 -18
- package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js.map +1 -1
- package/Meshes/GaussianSplatting/gaussianSplattingPartProxyMesh.pure.d.ts +5 -4
- package/Meshes/GaussianSplatting/gaussianSplattingPartProxyMesh.pure.js +25 -8
- package/Meshes/GaussianSplatting/gaussianSplattingPartProxyMesh.pure.js.map +1 -1
- package/Meshes/GreasedLine/greasedLineRibbonMesh.pure.js +3 -3
- package/Meshes/GreasedLine/greasedLineRibbonMesh.pure.js.map +1 -1
- package/Meshes/Node/Blocks/Instances/instantiateOnVolumeBlock.pure.js +1 -1
- package/Meshes/Node/Blocks/Instances/instantiateOnVolumeBlock.pure.js.map +1 -1
- package/Meshes/Node/Blocks/geometryOptimizeBlock.pure.js +2 -2
- package/Meshes/Node/Blocks/geometryOptimizeBlock.pure.js.map +1 -1
- package/Meshes/Node/Blocks/mappingBlock.pure.js +2 -2
- package/Meshes/Node/Blocks/mappingBlock.pure.js.map +1 -1
- package/Meshes/csg.js +5 -5
- package/Meshes/csg.js.map +1 -1
- package/Meshes/groundMesh.pure.js +1 -1
- package/Meshes/groundMesh.pure.js.map +1 -1
- package/Meshes/mesh.pure.js +2 -2
- package/Meshes/mesh.pure.js.map +1 -1
- package/Misc/deepMerger.js +1 -1
- package/Misc/deepMerger.js.map +1 -1
- package/Misc/dumpTools.pure.js +1 -1
- package/Misc/dumpTools.pure.js.map +1 -1
- package/Misc/index.d.ts +1 -0
- package/Misc/index.js +1 -0
- package/Misc/index.js.map +1 -1
- package/Misc/observable.pure.js +1 -3
- package/Misc/observable.pure.js.map +1 -1
- package/Misc/pure.d.ts +1 -0
- package/Misc/pure.js +1 -0
- package/Misc/pure.js.map +1 -1
- package/Misc/shaderImportLoader.d.ts +25 -0
- package/Misc/shaderImportLoader.js +54 -0
- package/Misc/shaderImportLoader.js.map +1 -0
- package/Misc/tools.pure.js +1 -1
- package/Misc/tools.pure.js.map +1 -1
- package/Particles/Node/Blocks/particleClampBlock.pure.d.ts +0 -1
- package/Particles/Node/Blocks/particleClampBlock.pure.js +1 -6
- package/Particles/Node/Blocks/particleClampBlock.pure.js.map +1 -1
- package/Particles/Node/Blocks/particleMathBlock.pure.js +1 -1
- package/Particles/Node/Blocks/particleMathBlock.pure.js.map +1 -1
- package/Particles/Node/Blocks/particleNLerpBlock.pure.js +8 -3
- package/Particles/Node/Blocks/particleNLerpBlock.pure.js.map +1 -1
- package/Particles/Node/Blocks/particleSmoothStepBlock.pure.js +3 -2
- package/Particles/Node/Blocks/particleSmoothStepBlock.pure.js.map +1 -1
- package/Particles/Node/Blocks/particleStepBlock.pure.js +3 -2
- package/Particles/Node/Blocks/particleStepBlock.pure.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/defaultRenderingPipeline.pure.js +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/defaultRenderingPipeline.pure.js.map +1 -1
- package/PostProcesses/depthOfFieldEffect.js +1 -1
- package/PostProcesses/depthOfFieldEffect.js.map +1 -1
- package/PostProcesses/imageProcessingPostProcess.d.ts +41 -1
- package/PostProcesses/imageProcessingPostProcess.js +41 -1
- package/PostProcesses/imageProcessingPostProcess.js.map +1 -1
- package/PostProcesses/screenSpaceCurvaturePostProcess.pure.js +1 -1
- package/PostProcesses/screenSpaceCurvaturePostProcess.pure.js.map +1 -1
- package/PostProcesses/sharpenPostProcess.pure.js +1 -1
- package/PostProcesses/sharpenPostProcess.pure.js.map +1 -1
- package/PostProcesses/thinImageProcessingPostProcess.d.ts +50 -0
- package/PostProcesses/thinImageProcessingPostProcess.js +65 -0
- package/PostProcesses/thinImageProcessingPostProcess.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsMaterialCompatibility.pure.d.ts +12 -0
- package/Rendering/IBLShadows/iblShadowsMaterialCompatibility.pure.js +22 -0
- package/Rendering/IBLShadows/iblShadowsMaterialCompatibility.pure.js.map +1 -0
- package/Rendering/IBLShadows/iblShadowsPluginMaterial.pure.d.ts +1 -0
- package/Rendering/IBLShadows/iblShadowsPluginMaterial.pure.js +39 -0
- package/Rendering/IBLShadows/iblShadowsPluginMaterial.pure.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsRenderPipeline.pure.d.ts +12 -0
- package/Rendering/IBLShadows/iblShadowsRenderPipeline.pure.js +17 -5
- package/Rendering/IBLShadows/iblShadowsRenderPipeline.pure.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsVoxelRenderer.pure.d.ts +14 -0
- package/Rendering/IBLShadows/iblShadowsVoxelRenderer.pure.js +122 -6
- package/Rendering/IBLShadows/iblShadowsVoxelRenderer.pure.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.d.ts +7 -0
- package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.js +17 -0
- package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.js.map +1 -1
- package/Rendering/IBLShadows/pure.d.ts +1 -0
- package/Rendering/IBLShadows/pure.js +1 -0
- package/Rendering/IBLShadows/pure.js.map +1 -1
- package/Rendering/boundingBoxRenderer.pure.js +3 -3
- package/Rendering/boundingBoxRenderer.pure.js.map +1 -1
- package/Rendering/fluidRenderer/fluidRenderingObject.d.ts +11 -0
- package/Rendering/fluidRenderer/fluidRenderingObject.js +36 -14
- package/Rendering/fluidRenderer/fluidRenderingObject.js.map +1 -1
- package/Rendering/fluidRenderer/fluidRenderingObjectCustomParticles.d.ts +5 -0
- package/Rendering/fluidRenderer/fluidRenderingObjectCustomParticles.js +16 -3
- package/Rendering/fluidRenderer/fluidRenderingObjectCustomParticles.js.map +1 -1
- package/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.d.ts +5 -0
- package/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.js +12 -0
- package/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.js.map +1 -1
- package/Rendering/iblCdfGenerator.js +10 -1
- package/Rendering/iblCdfGenerator.js.map +1 -1
- package/Rendering/outlineRenderer.pure.js +1 -0
- package/Rendering/outlineRenderer.pure.js.map +1 -1
- package/Rendering/subSurfaceConfiguration.js +1 -1
- package/Rendering/subSurfaceConfiguration.js.map +1 -1
- package/Rendering/subSurfaceSceneComponent.pure.d.ts +1 -1
- package/Rendering/subSurfaceSceneComponent.pure.js +1 -1
- package/Rendering/subSurfaceSceneComponent.pure.js.map +1 -1
- package/Rendering/utilityLayerRenderer.js +1 -1
- package/Rendering/utilityLayerRenderer.js.map +1 -1
- package/Shaders/ShadersInclude/hdrFilteringFunctions.js +1 -1
- package/Shaders/ShadersInclude/hdrFilteringFunctions.js.map +1 -1
- package/Shaders/ShadersInclude/helperFunctions.js +2 -2
- package/Shaders/ShadersInclude/helperFunctions.js.map +1 -1
- package/Shaders/ShadersInclude/imageProcessingDeclaration.js +3 -0
- package/Shaders/ShadersInclude/imageProcessingDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/imageProcessingFunctions.js +3 -0
- package/Shaders/ShadersInclude/imageProcessingFunctions.js.map +1 -1
- package/Shaders/ShadersInclude/openpbrDirectLighting.js +34 -4
- package/Shaders/ShadersInclude/openpbrDirectLighting.js.map +1 -1
- package/Shaders/ShadersInclude/openpbrIblFunctions.js +8 -2
- package/Shaders/ShadersInclude/openpbrIblFunctions.js.map +1 -1
- package/Shaders/ShadersInclude/pbrDirectLightingFunctions.js +5 -0
- package/Shaders/ShadersInclude/pbrDirectLightingFunctions.js.map +1 -1
- package/Shaders/fluidRenderingParticleDepth.vertex.js +7 -1
- package/Shaders/fluidRenderingParticleDepth.vertex.js.map +1 -1
- package/Shaders/fluidRenderingParticleDiffuse.vertex.js +7 -1
- package/Shaders/fluidRenderingParticleDiffuse.vertex.js.map +1 -1
- package/Shaders/fluidRenderingParticleThickness.vertex.js +7 -1
- package/Shaders/fluidRenderingParticleThickness.vertex.js.map +1 -1
- package/Shaders/gaussianSplattingVoxel.fragment.js +4 -10
- package/Shaders/gaussianSplattingVoxel.fragment.js.map +1 -1
- package/Shaders/iblCombineVoxelGrids.fragment.js +1 -1
- package/Shaders/iblCombineVoxelGrids.fragment.js.map +1 -1
- package/Shaders/iblShadowVoxelTracing.fragment.js +24 -7
- package/Shaders/iblShadowVoxelTracing.fragment.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/iblVoxelOpacityAtomicMax.d.ts +5 -0
- package/ShadersWGSL/ShadersInclude/iblVoxelOpacityAtomicMax.js +13 -0
- package/ShadersWGSL/ShadersInclude/iblVoxelOpacityAtomicMax.js.map +1 -0
- package/ShadersWGSL/ShadersInclude/imageProcessingDeclaration.js +3 -0
- package/ShadersWGSL/ShadersInclude/imageProcessingDeclaration.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/imageProcessingFunctions.js +3 -0
- package/ShadersWGSL/ShadersInclude/imageProcessingFunctions.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrDirectLighting.js +35 -5
- package/ShadersWGSL/ShadersInclude/openpbrDirectLighting.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrDirectLightingInit.js +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrDirectLightingInit.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/openpbrIblFunctions.js +8 -2
- package/ShadersWGSL/ShadersInclude/openpbrIblFunctions.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions.js +5 -0
- package/ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions.js.map +1 -1
- package/ShadersWGSL/fluidRenderingParticleDepth.vertex.js +16 -4
- package/ShadersWGSL/fluidRenderingParticleDepth.vertex.js.map +1 -1
- package/ShadersWGSL/fluidRenderingParticleDiffuse.vertex.js +15 -3
- package/ShadersWGSL/fluidRenderingParticleDiffuse.vertex.js.map +1 -1
- package/ShadersWGSL/fluidRenderingParticleThickness.vertex.js +15 -3
- package/ShadersWGSL/fluidRenderingParticleThickness.vertex.js.map +1 -1
- package/ShadersWGSL/gaussianSplattingVoxel.fragment.js +15 -9
- package/ShadersWGSL/gaussianSplattingVoxel.fragment.js.map +1 -1
- package/ShadersWGSL/iblCombineVoxelGrids.fragment.js +1 -1
- package/ShadersWGSL/iblCombineVoxelGrids.fragment.js.map +1 -1
- package/ShadersWGSL/iblCopyVoxelBufferToGrid.compute.d.ts +5 -0
- package/ShadersWGSL/iblCopyVoxelBufferToGrid.compute.js +14 -0
- package/ShadersWGSL/iblCopyVoxelBufferToGrid.compute.js.map +1 -0
- package/ShadersWGSL/iblShadowVoxelTracing.fragment.js +24 -7
- package/ShadersWGSL/iblShadowVoxelTracing.fragment.js.map +1 -1
- package/ShadersWGSL/iblVoxelGrid.fragment.js +26 -6
- package/ShadersWGSL/iblVoxelGrid.fragment.js.map +1 -1
- package/SmartAssets/smartAssetManager.pure.js +1 -1
- package/SmartAssets/smartAssetManager.pure.js.map +1 -1
- package/Sprites/thinSprite.js +1 -1
- package/Sprites/thinSprite.js.map +1 -1
- package/XR/features/Layers/WebXRCompositionLayer.d.ts +182 -12
- package/XR/features/Layers/WebXRCompositionLayer.js +272 -3
- package/XR/features/Layers/WebXRCompositionLayer.js.map +1 -1
- package/XR/features/Layers/WebXRFallbackLayer.d.ts +84 -0
- package/XR/features/Layers/WebXRFallbackLayer.js +137 -0
- package/XR/features/Layers/WebXRFallbackLayer.js.map +1 -0
- package/XR/features/Layers/WebXRWebGPUCompositionLayer.d.ts +4 -4
- package/XR/features/Layers/WebXRWebGPUCompositionLayer.js.map +1 -1
- package/XR/features/WebXRAnchorSystem.pure.d.ts +45 -0
- package/XR/features/WebXRAnchorSystem.pure.js +153 -13
- package/XR/features/WebXRAnchorSystem.pure.js.map +1 -1
- package/XR/features/WebXRControllerPointerSelection.pure.js +2 -1
- package/XR/features/WebXRControllerPointerSelection.pure.js.map +1 -1
- package/XR/features/WebXRControllerTeleportation.pure.js +2 -1
- package/XR/features/WebXRControllerTeleportation.pure.js.map +1 -1
- package/XR/features/WebXRDepthSensing.pure.d.ts +21 -0
- package/XR/features/WebXRDepthSensing.pure.js +42 -0
- package/XR/features/WebXRDepthSensing.pure.js.map +1 -1
- package/XR/features/WebXRHandTracking.pure.js +2 -0
- package/XR/features/WebXRHandTracking.pure.js.map +1 -1
- package/XR/features/WebXRLayers.pure.d.ts +183 -8
- package/XR/features/WebXRLayers.pure.js +531 -99
- package/XR/features/WebXRLayers.pure.js.map +1 -1
- package/XR/features/WebXRLayersFallback.d.ts +5 -0
- package/XR/features/WebXRLayersFallback.js +8 -0
- package/XR/features/WebXRLayersFallback.js.map +1 -0
- package/XR/features/WebXRLayersFallback.pure.d.ts +6 -0
- package/XR/features/WebXRLayersFallback.pure.js +44 -0
- package/XR/features/WebXRLayersFallback.pure.js.map +1 -0
- package/XR/features/WebXRLightEstimation.pure.d.ts +3 -4
- package/XR/features/WebXRLightEstimation.pure.js +22 -21
- package/XR/features/WebXRLightEstimation.pure.js.map +1 -1
- package/XR/features/WebXRMeshDetector.pure.d.ts +5 -0
- package/XR/features/WebXRMeshDetector.pure.js +1 -0
- package/XR/features/WebXRMeshDetector.pure.js.map +1 -1
- package/XR/features/WebXRNearInteraction.pure.js +3 -3
- package/XR/features/WebXRNearInteraction.pure.js.map +1 -1
- package/XR/features/WebXRPlaneDetector.pure.d.ts +9 -5
- package/XR/features/WebXRPlaneDetector.pure.js +12 -8
- package/XR/features/WebXRPlaneDetector.pure.js.map +1 -1
- package/XR/features/WebXRTrackedSources.d.ts +5 -0
- package/XR/features/WebXRTrackedSources.js +8 -0
- package/XR/features/WebXRTrackedSources.js.map +1 -0
- package/XR/features/WebXRTrackedSources.pure.d.ts +70 -0
- package/XR/features/WebXRTrackedSources.pure.js +153 -0
- package/XR/features/WebXRTrackedSources.pure.js.map +1 -0
- package/XR/features/index.d.ts +1 -0
- package/XR/features/index.js +1 -0
- package/XR/features/index.js.map +1 -1
- package/XR/features/pure.d.ts +2 -0
- package/XR/features/pure.js +2 -0
- package/XR/features/pure.js.map +1 -1
- package/XR/motionController/webXRAbstractMotionController.d.ts +53 -1
- package/XR/motionController/webXRAbstractMotionController.js +61 -0
- package/XR/motionController/webXRAbstractMotionController.js.map +1 -1
- package/XR/webXRCamera.d.ts +2 -0
- package/XR/webXRCamera.js +8 -2
- package/XR/webXRCamera.js.map +1 -1
- package/XR/webXRDefaultExperience.js +8 -4
- package/XR/webXRDefaultExperience.js.map +1 -1
- package/XR/webXRExperienceHelper.js +86 -44
- package/XR/webXRExperienceHelper.js.map +1 -1
- package/XR/webXRFeaturesManager.d.ts +9 -0
- package/XR/webXRFeaturesManager.js +4 -0
- package/XR/webXRFeaturesManager.js.map +1 -1
- package/XR/webXRGraphicsBinding.d.ts +29 -0
- package/XR/webXRGraphicsBinding.js +40 -0
- package/XR/webXRGraphicsBinding.js.map +1 -1
- package/XR/webXRInputSource.js +1 -1
- package/XR/webXRInputSource.js.map +1 -1
- package/XR/webXRLayerWrapper.d.ts +26 -10
- package/XR/webXRLayerWrapper.js +19 -7
- package/XR/webXRLayerWrapper.js.map +1 -1
- package/XR/webXRRenderTargetTextureProvider.d.ts +4 -4
- package/XR/webXRRenderTargetTextureProvider.js.map +1 -1
- package/XR/webXRSessionManager.d.ts +45 -0
- package/XR/webXRSessionManager.js +174 -29
- package/XR/webXRSessionManager.js.map +1 -1
- package/XR/webXRWebGLRenderTargetTextureProvider.d.ts +2 -1
- package/XR/webXRWebGLRenderTargetTextureProvider.js.map +1 -1
- package/XR/webXRWebGPURenderTargetTextureProvider.d.ts +3 -3
- package/XR/webXRWebGPURenderTargetTextureProvider.js.map +1 -1
- package/package.json +1 -1
- package/scene.pure.d.ts +5 -0
- package/scene.pure.js +25 -0
- package/scene.pure.js.map +1 -1
|
@@ -2,7 +2,7 @@ import { type RenderTargetTexture } from "../../../Materials/Textures/renderTarg
|
|
|
2
2
|
import { type Viewport } from "../../../Maths/math.viewport.js";
|
|
3
3
|
import { Observable } from "../../../Misc/observable.js";
|
|
4
4
|
import { type WebXRLayerRenderTargetTexture } from "../../webXRLayerRenderTargetTexture.js";
|
|
5
|
-
import { type WebXRLayerType } from "../../webXRLayerWrapper.js";
|
|
5
|
+
import { type WebXRLayerType, type WebXRSupportedLayerType } from "../../webXRLayerWrapper.js";
|
|
6
6
|
import { type WebXRLayerRenderTargetTextureProvider } from "../../webXRRenderTargetTextureProvider.js";
|
|
7
7
|
import { WebXRWebGPURenderTargetTextureProvider } from "../../webXRWebGPURenderTargetTextureProvider.js";
|
|
8
8
|
import { type WebXRSessionManager } from "../../webXRSessionManager.js";
|
|
@@ -22,9 +22,9 @@ export declare class WebXRWebGPUCompositionLayerWrapper extends WebXRComposition
|
|
|
22
22
|
* {@link XRGPUSubImage} GPUTextures instead of WebGL textures.
|
|
23
23
|
* @internal
|
|
24
24
|
*/
|
|
25
|
-
export declare class WebXRWebGPUCompositionLayerRenderTargetTextureProvider extends WebXRWebGPURenderTargetTextureProvider {
|
|
25
|
+
export declare class WebXRWebGPUCompositionLayerRenderTargetTextureProvider<LayerTypeT extends WebXRSupportedLayerType = WebXRLayerType> extends WebXRWebGPURenderTargetTextureProvider<LayerTypeT> {
|
|
26
26
|
protected readonly _xrGPUBinding: XRGPUBinding;
|
|
27
|
-
readonly layerWrapper:
|
|
27
|
+
readonly layerWrapper: WebXRCompositionLayerWrapper<XRCompositionLayer, LayerTypeT>;
|
|
28
28
|
protected readonly _depthStencilFormat?: GPUTextureFormat | undefined;
|
|
29
29
|
protected _lastSubImages: Map<XREye, XRGPUSubImage>;
|
|
30
30
|
/**
|
|
@@ -43,7 +43,7 @@ export declare class WebXRWebGPUCompositionLayerRenderTargetTextureProvider exte
|
|
|
43
43
|
texture: RenderTargetTexture;
|
|
44
44
|
eye?: XREye;
|
|
45
45
|
}>;
|
|
46
|
-
constructor(_xrSessionManager: WebXRSessionManager, _xrGPUBinding: XRGPUBinding, layerWrapper:
|
|
46
|
+
constructor(_xrSessionManager: WebXRSessionManager, _xrGPUBinding: XRGPUBinding, layerWrapper: WebXRCompositionLayerWrapper<XRCompositionLayer, LayerTypeT>, _depthStencilFormat?: GPUTextureFormat | undefined);
|
|
47
47
|
protected _getRenderTargetForSubImage(subImage: XRGPUSubImage, eye?: XREye): WebXRLayerRenderTargetTexture;
|
|
48
48
|
private _getSubImageForEye;
|
|
49
49
|
getRenderTargetTextureForEye(eye?: XREye): Nullable<RenderTargetTexture>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebXRWebGPUCompositionLayer.js","sourceRoot":"","sources":["../../../../../../dev/core/src/XR/features/Layers/WebXRWebGPUCompositionLayer.ts"],"names":[],"mappings":"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","sourcesContent":["import { type RenderTargetTexture } from \"core/Materials/Textures/renderTargetTexture\";\nimport { type Viewport } from \"core/Maths/math.viewport\";\nimport { Observable } from \"core/Misc/observable\";\nimport { type WebXRLayerRenderTargetTexture } from \"core/XR/webXRLayerRenderTargetTexture\";\nimport { type WebXRLayerType } from \"core/XR/webXRLayerWrapper\";\nimport { type WebXRLayerRenderTargetTextureProvider } from \"core/XR/webXRRenderTargetTextureProvider\";\nimport { WebXRWebGPURenderTargetTextureProvider } from \"core/XR/webXRWebGPURenderTargetTextureProvider\";\nimport { type WebXRSessionManager } from \"core/XR/webXRSessionManager\";\nimport { type Nullable } from \"core/types\";\nimport { WebXRCompositionLayerWrapper } from \"./WebXRCompositionLayer\";\n\n/**\n * Wraps xr composition layers for the WebGPU (XRGPUBinding) backend.\n * Mirrors {@link WebXRCompositionLayerWrapper} for WebGPU.\n * @internal\n */\nexport class WebXRWebGPUCompositionLayerWrapper extends WebXRCompositionLayerWrapper {\n constructor(\n getWidth: () => number,\n getHeight: () => number,\n layer: XRCompositionLayer,\n layerType: WebXRLayerType,\n isMultiview: boolean,\n createRTTProvider: (xrSessionManager: WebXRSessionManager) => WebXRLayerRenderTargetTextureProvider\n ) {\n super(getWidth, getHeight, layer, layerType, isMultiview, createRTTProvider);\n }\n}\n\n/**\n * Provides render target textures and other important rendering information for a given XRCompositionLayer\n * on the WebGPU backend. Mirrors {@link WebXRCompositionLayerRenderTargetTextureProvider}, but wraps\n * {@link XRGPUSubImage} GPUTextures instead of WebGL textures.\n * @internal\n */\nexport class WebXRWebGPUCompositionLayerRenderTargetTextureProvider extends WebXRWebGPURenderTargetTextureProvider {\n protected _lastSubImages = new Map<XREye, XRGPUSubImage>();\n /**\n * Per-eye render targets, indexed by eye (0 = left/none, 1 = right). Kept separate from the base\n * `_renderTargetTextures` registry: that array is an append-only owned list (each entry is disposed once\n * on provider dispose), whereas this map is a mutable per-eye slot. Reusing `_renderTargetTextures` as\n * both would let a rebuilt eye target both stay in the registry (leaking / double-disposing the old one)\n * and grow the registry unboundedly on repeated size changes.\n */\n protected _renderTargetTexturesByEye: WebXRLayerRenderTargetTexture[] = [];\n private _compositionLayer: XRCompositionLayer;\n /**\n * Fires every time a new render target texture is created (either for eye, for view, or for the entire frame)\n */\n public onRenderTargetTextureCreatedObservable = new Observable<{ texture: RenderTargetTexture; eye?: XREye }>();\n\n constructor(\n _xrSessionManager: WebXRSessionManager,\n protected readonly _xrGPUBinding: XRGPUBinding,\n public override readonly layerWrapper: WebXRWebGPUCompositionLayerWrapper,\n protected readonly _depthStencilFormat?: GPUTextureFormat\n ) {\n super(_xrSessionManager, layerWrapper);\n this._compositionLayer = layerWrapper.layer;\n }\n\n protected _getRenderTargetForSubImage(subImage: XRGPUSubImage, eye: XREye = \"none\") {\n const lastSubImage = this._lastSubImages.get(eye);\n const eyeIndex = eye == \"right\" ? 1 : 0;\n\n const colorTexture = subImage.colorTexture;\n const colorTextureWidth = colorTexture.width;\n const colorTextureHeight = colorTexture.height;\n\n const depthStencilTexture = subImage.depthStencilTexture ?? null;\n\n const existingRenderTarget = this._renderTargetTexturesByEye[eyeIndex];\n const sizeChanged = !existingRenderTarget || lastSubImage?.colorTexture.width !== colorTextureWidth || lastSubImage?.colorTexture.height !== colorTextureHeight;\n\n if (sizeChanged) {\n if (existingRenderTarget) {\n // A previous target for this eye exists (the sub-image size changed, e.g. a scale-factor or\n // display-config change). Dispose it and remove it from the owned registry before creating the\n // replacement so the registry does not accumulate stale entries or double-dispose on teardown.\n this._destroyRenderTargetTexture(existingRenderTarget);\n }\n this._renderTargetTexturesByEye[eyeIndex] = this._createRenderTargetTextureFromGPUTextures(\n colorTextureWidth,\n colorTextureHeight,\n colorTexture,\n depthStencilTexture,\n this._depthStencilFormat,\n this.layerWrapper.isMultiview\n );\n\n this._framebufferDimensions = {\n framebufferWidth: colorTextureWidth,\n framebufferHeight: colorTextureHeight,\n };\n this.onRenderTargetTextureCreatedObservable.notifyObservers({ texture: this._renderTargetTexturesByEye[eyeIndex], eye });\n } else {\n // Same size: repoint the wrapped textures at this frame's GPUTextures, preserving the\n // RenderTargetTexture / InternalTexture identity held by the XR camera's outputRenderTarget.\n this._updateRenderTargetTextureFromGPUTextures(existingRenderTarget, colorTexture, depthStencilTexture);\n }\n\n this._lastSubImages.set(eye, subImage);\n\n // The projection-layer color/depth textures may be a texture ARRAY with one layer per eye\n // (depthOrArrayLayers > 1). The sub-image's view descriptor carries the authoritative array-layer\n // index for this eye, so route it into the render target's bind so each eye renders into its own\n // layer. For non-layered textures this is 0 (unchanged behavior).\n const renderTargetTexture = this._renderTargetTexturesByEye[eyeIndex];\n renderTargetTexture.layerIndex = subImage.getViewDescriptor().baseArrayLayer ?? 0;\n\n return renderTargetTexture;\n }\n\n private _getSubImageForEye(eye?: XREye): Nullable<XRGPUSubImage> {\n const currentFrame = this._xrSessionManager.currentFrame;\n if (currentFrame) {\n return this._xrGPUBinding.getSubImage(this._compositionLayer, currentFrame, eye);\n }\n return null;\n }\n\n public getRenderTargetTextureForEye(eye?: XREye): Nullable<RenderTargetTexture> {\n const subImage = this._getSubImageForEye(eye);\n if (subImage) {\n return this._getRenderTargetForSubImage(subImage, eye);\n }\n return null;\n }\n\n public getRenderTargetTextureForView(view?: XRView): Nullable<RenderTargetTexture> {\n return this.getRenderTargetTextureForEye(view?.eye);\n }\n\n protected _setViewportForSubImage(viewport: Viewport, subImage: XRGPUSubImage) {\n const textureWidth = subImage.colorTexture.width;\n const textureHeight = subImage.colorTexture.height;\n const xrViewport = subImage.viewport;\n viewport.x = xrViewport.x / textureWidth;\n viewport.y = xrViewport.y / textureHeight;\n viewport.width = xrViewport.width / textureWidth;\n viewport.height = xrViewport.height / textureHeight;\n }\n\n public trySetViewportForView(viewport: Viewport, view: XRView): boolean {\n const subImage = this._lastSubImages.get(view.eye) || this._getSubImageForEye(view.eye);\n if (subImage) {\n this._setViewportForSubImage(viewport, subImage);\n return true;\n }\n return false;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"WebXRWebGPUCompositionLayer.js","sourceRoot":"","sources":["../../../../../../dev/core/src/XR/features/Layers/WebXRWebGPUCompositionLayer.ts"],"names":[],"mappings":"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","sourcesContent":["import { type RenderTargetTexture } from \"core/Materials/Textures/renderTargetTexture\";\nimport { type Viewport } from \"core/Maths/math.viewport\";\nimport { Observable } from \"core/Misc/observable\";\nimport { type WebXRLayerRenderTargetTexture } from \"core/XR/webXRLayerRenderTargetTexture\";\nimport { type WebXRLayerType, type WebXRSupportedLayerType } from \"core/XR/webXRLayerWrapper\";\nimport { type WebXRLayerRenderTargetTextureProvider } from \"core/XR/webXRRenderTargetTextureProvider\";\nimport { WebXRWebGPURenderTargetTextureProvider } from \"core/XR/webXRWebGPURenderTargetTextureProvider\";\nimport { type WebXRSessionManager } from \"core/XR/webXRSessionManager\";\nimport { type Nullable } from \"core/types\";\nimport { WebXRCompositionLayerWrapper } from \"./WebXRCompositionLayer\";\n\n/**\n * Wraps xr composition layers for the WebGPU (XRGPUBinding) backend.\n * Mirrors {@link WebXRCompositionLayerWrapper} for WebGPU.\n * @internal\n */\nexport class WebXRWebGPUCompositionLayerWrapper extends WebXRCompositionLayerWrapper {\n constructor(\n getWidth: () => number,\n getHeight: () => number,\n layer: XRCompositionLayer,\n layerType: WebXRLayerType,\n isMultiview: boolean,\n createRTTProvider: (xrSessionManager: WebXRSessionManager) => WebXRLayerRenderTargetTextureProvider\n ) {\n super(getWidth, getHeight, layer, layerType, isMultiview, createRTTProvider);\n }\n}\n\n/**\n * Provides render target textures and other important rendering information for a given XRCompositionLayer\n * on the WebGPU backend. Mirrors {@link WebXRCompositionLayerRenderTargetTextureProvider}, but wraps\n * {@link XRGPUSubImage} GPUTextures instead of WebGL textures.\n * @internal\n */\nexport class WebXRWebGPUCompositionLayerRenderTargetTextureProvider<\n LayerTypeT extends WebXRSupportedLayerType = WebXRLayerType,\n> extends WebXRWebGPURenderTargetTextureProvider<LayerTypeT> {\n protected _lastSubImages = new Map<XREye, XRGPUSubImage>();\n /**\n * Per-eye render targets, indexed by eye (0 = left/none, 1 = right). Kept separate from the base\n * `_renderTargetTextures` registry: that array is an append-only owned list (each entry is disposed once\n * on provider dispose), whereas this map is a mutable per-eye slot. Reusing `_renderTargetTextures` as\n * both would let a rebuilt eye target both stay in the registry (leaking / double-disposing the old one)\n * and grow the registry unboundedly on repeated size changes.\n */\n protected _renderTargetTexturesByEye: WebXRLayerRenderTargetTexture[] = [];\n private _compositionLayer: XRCompositionLayer;\n /**\n * Fires every time a new render target texture is created (either for eye, for view, or for the entire frame)\n */\n public onRenderTargetTextureCreatedObservable = new Observable<{ texture: RenderTargetTexture; eye?: XREye }>();\n\n constructor(\n _xrSessionManager: WebXRSessionManager,\n protected readonly _xrGPUBinding: XRGPUBinding,\n public override readonly layerWrapper: WebXRCompositionLayerWrapper<XRCompositionLayer, LayerTypeT>,\n protected readonly _depthStencilFormat?: GPUTextureFormat\n ) {\n super(_xrSessionManager, layerWrapper);\n this._compositionLayer = layerWrapper.layer;\n }\n\n protected _getRenderTargetForSubImage(subImage: XRGPUSubImage, eye: XREye = \"none\") {\n const lastSubImage = this._lastSubImages.get(eye);\n const eyeIndex = eye == \"right\" ? 1 : 0;\n\n const colorTexture = subImage.colorTexture;\n const colorTextureWidth = colorTexture.width;\n const colorTextureHeight = colorTexture.height;\n\n const depthStencilTexture = subImage.depthStencilTexture ?? null;\n\n const existingRenderTarget = this._renderTargetTexturesByEye[eyeIndex];\n const sizeChanged = !existingRenderTarget || lastSubImage?.colorTexture.width !== colorTextureWidth || lastSubImage?.colorTexture.height !== colorTextureHeight;\n\n if (sizeChanged) {\n if (existingRenderTarget) {\n // A previous target for this eye exists (the sub-image size changed, e.g. a scale-factor or\n // display-config change). Dispose it and remove it from the owned registry before creating the\n // replacement so the registry does not accumulate stale entries or double-dispose on teardown.\n this._destroyRenderTargetTexture(existingRenderTarget);\n }\n this._renderTargetTexturesByEye[eyeIndex] = this._createRenderTargetTextureFromGPUTextures(\n colorTextureWidth,\n colorTextureHeight,\n colorTexture,\n depthStencilTexture,\n this._depthStencilFormat,\n this.layerWrapper.isMultiview\n );\n\n this._framebufferDimensions = {\n framebufferWidth: colorTextureWidth,\n framebufferHeight: colorTextureHeight,\n };\n this.onRenderTargetTextureCreatedObservable.notifyObservers({ texture: this._renderTargetTexturesByEye[eyeIndex], eye });\n } else {\n // Same size: repoint the wrapped textures at this frame's GPUTextures, preserving the\n // RenderTargetTexture / InternalTexture identity held by the XR camera's outputRenderTarget.\n this._updateRenderTargetTextureFromGPUTextures(existingRenderTarget, colorTexture, depthStencilTexture);\n }\n\n this._lastSubImages.set(eye, subImage);\n\n // The projection-layer color/depth textures may be a texture ARRAY with one layer per eye\n // (depthOrArrayLayers > 1). The sub-image's view descriptor carries the authoritative array-layer\n // index for this eye, so route it into the render target's bind so each eye renders into its own\n // layer. For non-layered textures this is 0 (unchanged behavior).\n const renderTargetTexture = this._renderTargetTexturesByEye[eyeIndex];\n renderTargetTexture.layerIndex = subImage.getViewDescriptor().baseArrayLayer ?? 0;\n\n return renderTargetTexture;\n }\n\n private _getSubImageForEye(eye?: XREye): Nullable<XRGPUSubImage> {\n const currentFrame = this._xrSessionManager.currentFrame;\n if (currentFrame) {\n return this._xrGPUBinding.getSubImage(this._compositionLayer, currentFrame, eye);\n }\n return null;\n }\n\n public getRenderTargetTextureForEye(eye?: XREye): Nullable<RenderTargetTexture> {\n const subImage = this._getSubImageForEye(eye);\n if (subImage) {\n return this._getRenderTargetForSubImage(subImage, eye);\n }\n return null;\n }\n\n public getRenderTargetTextureForView(view?: XRView): Nullable<RenderTargetTexture> {\n return this.getRenderTargetTextureForEye(view?.eye);\n }\n\n protected _setViewportForSubImage(viewport: Viewport, subImage: XRGPUSubImage) {\n const textureWidth = subImage.colorTexture.width;\n const textureHeight = subImage.colorTexture.height;\n const xrViewport = subImage.viewport;\n viewport.x = xrViewport.x / textureWidth;\n viewport.y = xrViewport.y / textureHeight;\n viewport.width = xrViewport.width / textureWidth;\n viewport.height = xrViewport.height / textureHeight;\n }\n\n public trySetViewportForView(viewport: Viewport, view: XRView): boolean {\n const subImage = this._lastSubImages.get(view.eye) || this._getSubImageForEye(view.eye);\n if (subImage) {\n this._setViewportForSubImage(viewport, subImage);\n return true;\n }\n return false;\n }\n}\n"]}
|
|
@@ -39,6 +39,10 @@ export interface IWebXRAnchor {
|
|
|
39
39
|
* The native anchor object
|
|
40
40
|
*/
|
|
41
41
|
xrAnchor: XRAnchor;
|
|
42
|
+
/**
|
|
43
|
+
* The persistent handle associated with this anchor, if one was requested or the anchor was restored from one
|
|
44
|
+
*/
|
|
45
|
+
persistentHandle?: string;
|
|
42
46
|
/**
|
|
43
47
|
* if defined, this object will be constantly updated by the anchor's position and rotation
|
|
44
48
|
*/
|
|
@@ -127,6 +131,44 @@ export declare class WebXRAnchorSystem extends WebXRAbstractFeature {
|
|
|
127
131
|
* Get the list of anchors currently being tracked by the system
|
|
128
132
|
*/
|
|
129
133
|
get anchors(): IWebXRAnchor[];
|
|
134
|
+
/**
|
|
135
|
+
* Whether the current XR session exposes all session-level persistent anchor APIs
|
|
136
|
+
* @returns Whether all session-level persistent anchor APIs are supported
|
|
137
|
+
*/
|
|
138
|
+
get isPersistentAnchorSupported(): boolean;
|
|
139
|
+
/**
|
|
140
|
+
* Get the persistent anchor handles known to the current XR session
|
|
141
|
+
* @returns The persistent anchor handles
|
|
142
|
+
* @throws If persistent anchor enumeration is not supported by the current session
|
|
143
|
+
*/
|
|
144
|
+
get persistentAnchors(): ReadonlyArray<string>;
|
|
145
|
+
/**
|
|
146
|
+
* Request a persistent handle for a tracked anchor
|
|
147
|
+
* @param anchor The Babylon anchor to persist
|
|
148
|
+
* @returns A promise that resolves with the persistent handle
|
|
149
|
+
* @throws If requesting persistent handles is not supported by the native anchor
|
|
150
|
+
*/
|
|
151
|
+
requestPersistentHandleAsync(anchor: IWebXRAnchor): Promise<string>;
|
|
152
|
+
/**
|
|
153
|
+
* Restore a persistent anchor into the Babylon anchor lifecycle
|
|
154
|
+
* @param handle The persistent anchor handle to restore
|
|
155
|
+
* @returns A promise that resolves after the restored anchor is tracked by an XR frame
|
|
156
|
+
* @throws If restoring persistent anchors is not supported by the current session
|
|
157
|
+
*/
|
|
158
|
+
restorePersistentAnchorAsync(handle: string): Promise<IWebXRAnchor>;
|
|
159
|
+
/**
|
|
160
|
+
* Restore all persistent anchors known to the current XR session
|
|
161
|
+
* @returns A promise that resolves after all restored anchors are tracked by an XR frame
|
|
162
|
+
* @throws If persistent anchor enumeration or restoration is not supported by the current session
|
|
163
|
+
*/
|
|
164
|
+
restorePersistentAnchorsAsync(): Promise<IWebXRAnchor[]>;
|
|
165
|
+
/**
|
|
166
|
+
* Delete a persistent anchor from native storage
|
|
167
|
+
* @param handle The persistent anchor handle to delete
|
|
168
|
+
* @returns A promise that resolves after native persistent storage is deleted
|
|
169
|
+
* @throws If deleting persistent anchors is not supported by the current session
|
|
170
|
+
*/
|
|
171
|
+
deletePersistentAnchorAsync(handle: string): Promise<void>;
|
|
130
172
|
/**
|
|
131
173
|
* detach this feature.
|
|
132
174
|
* Will usually be called by the features manager
|
|
@@ -145,6 +187,9 @@ export declare class WebXRAnchorSystem extends WebXRAbstractFeature {
|
|
|
145
187
|
* @returns the index of the anchor in the array or -1 if not found
|
|
146
188
|
*/
|
|
147
189
|
private _findIndexInAnchorArray;
|
|
190
|
+
private _findFutureAnchor;
|
|
191
|
+
private _setPersistentHandle;
|
|
192
|
+
private _rejectPendingPersistentAnchors;
|
|
148
193
|
private _updateAnchorWithXRFrame;
|
|
149
194
|
private _createAnchorAtTransformationAsync;
|
|
150
195
|
}
|
|
@@ -45,6 +45,7 @@ export class WebXRAnchorSystem extends WebXRAbstractFeature {
|
|
|
45
45
|
this.xrNativeFeatureName = "anchors";
|
|
46
46
|
if (this._options.clearAnchorsOnSessionInit) {
|
|
47
47
|
this._xrSessionManager.onXRSessionInit.add(() => {
|
|
48
|
+
this._rejectPendingPersistentAnchors("Persistent anchor restoration was interrupted before tracking began");
|
|
48
49
|
this._trackedAnchors.length = 0;
|
|
49
50
|
this._futureAnchors.length = 0;
|
|
50
51
|
this._lastFrameDetected.clear();
|
|
@@ -140,6 +141,111 @@ export class WebXRAnchorSystem extends WebXRAbstractFeature {
|
|
|
140
141
|
get anchors() {
|
|
141
142
|
return this._trackedAnchors;
|
|
142
143
|
}
|
|
144
|
+
/**
|
|
145
|
+
* Whether the current XR session exposes all session-level persistent anchor APIs
|
|
146
|
+
* @returns Whether all session-level persistent anchor APIs are supported
|
|
147
|
+
*/
|
|
148
|
+
get isPersistentAnchorSupported() {
|
|
149
|
+
const session = this._xrSessionManager.session;
|
|
150
|
+
return (!!session && session.persistentAnchors !== undefined && typeof session.restorePersistentAnchor === "function" && typeof session.deletePersistentAnchor === "function");
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Get the persistent anchor handles known to the current XR session
|
|
154
|
+
* @returns The persistent anchor handles
|
|
155
|
+
* @throws If persistent anchor enumeration is not supported by the current session
|
|
156
|
+
*/
|
|
157
|
+
get persistentAnchors() {
|
|
158
|
+
const persistentAnchors = this._xrSessionManager.session?.persistentAnchors;
|
|
159
|
+
if (persistentAnchors === undefined) {
|
|
160
|
+
throw new Error("Persistent anchor enumeration is not supported in this environment/browser");
|
|
161
|
+
}
|
|
162
|
+
return persistentAnchors;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Request a persistent handle for a tracked anchor
|
|
166
|
+
* @param anchor The Babylon anchor to persist
|
|
167
|
+
* @returns A promise that resolves with the persistent handle
|
|
168
|
+
* @throws If requesting persistent handles is not supported by the native anchor
|
|
169
|
+
*/
|
|
170
|
+
async requestPersistentHandleAsync(anchor) {
|
|
171
|
+
const requestPersistentHandle = anchor.xrAnchor.requestPersistentHandle;
|
|
172
|
+
if (!requestPersistentHandle) {
|
|
173
|
+
throw new Error("Requesting persistent anchor handles is not supported in this environment/browser");
|
|
174
|
+
}
|
|
175
|
+
const handle = await requestPersistentHandle.call(anchor.xrAnchor);
|
|
176
|
+
this._setPersistentHandle(anchor, handle);
|
|
177
|
+
return handle;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Restore a persistent anchor into the Babylon anchor lifecycle
|
|
181
|
+
* @param handle The persistent anchor handle to restore
|
|
182
|
+
* @returns A promise that resolves after the restored anchor is tracked by an XR frame
|
|
183
|
+
* @throws If restoring persistent anchors is not supported by the current session
|
|
184
|
+
*/
|
|
185
|
+
async restorePersistentAnchorAsync(handle) {
|
|
186
|
+
if (!this.attached) {
|
|
187
|
+
throw new Error("Restoring persistent anchors requires the anchor system to be attached");
|
|
188
|
+
}
|
|
189
|
+
const session = this._xrSessionManager.session;
|
|
190
|
+
const restorePersistentAnchor = session?.restorePersistentAnchor;
|
|
191
|
+
if (!restorePersistentAnchor) {
|
|
192
|
+
throw new Error("Restoring persistent anchors is not supported in this environment/browser");
|
|
193
|
+
}
|
|
194
|
+
const nativeAnchor = await restorePersistentAnchor.call(session, handle);
|
|
195
|
+
if (!this.attached || this._xrSessionManager.session !== session) {
|
|
196
|
+
nativeAnchor.delete();
|
|
197
|
+
throw new Error("Persistent anchor restoration was interrupted before tracking began");
|
|
198
|
+
}
|
|
199
|
+
const existingAnchorIndex = this._findIndexInAnchorArray(nativeAnchor);
|
|
200
|
+
if (existingAnchorIndex !== -1) {
|
|
201
|
+
const existingAnchor = this._trackedAnchors[existingAnchorIndex];
|
|
202
|
+
existingAnchor.persistentHandle = handle;
|
|
203
|
+
return existingAnchor;
|
|
204
|
+
}
|
|
205
|
+
return await new Promise((resolve, reject) => {
|
|
206
|
+
this._futureAnchors.push({
|
|
207
|
+
nativeAnchor,
|
|
208
|
+
resolved: false,
|
|
209
|
+
submitted: true,
|
|
210
|
+
persistentHandle: handle,
|
|
211
|
+
resolve,
|
|
212
|
+
reject,
|
|
213
|
+
});
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Restore all persistent anchors known to the current XR session
|
|
218
|
+
* @returns A promise that resolves after all restored anchors are tracked by an XR frame
|
|
219
|
+
* @throws If persistent anchor enumeration or restoration is not supported by the current session
|
|
220
|
+
*/
|
|
221
|
+
async restorePersistentAnchorsAsync() {
|
|
222
|
+
return await Promise.all(this.persistentAnchors.map(async (handle) => await this.restorePersistentAnchorAsync(handle)));
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Delete a persistent anchor from native storage
|
|
226
|
+
* @param handle The persistent anchor handle to delete
|
|
227
|
+
* @returns A promise that resolves after native persistent storage is deleted
|
|
228
|
+
* @throws If deleting persistent anchors is not supported by the current session
|
|
229
|
+
*/
|
|
230
|
+
async deletePersistentAnchorAsync(handle) {
|
|
231
|
+
const session = this._xrSessionManager.session;
|
|
232
|
+
const deletePersistentAnchor = session?.deletePersistentAnchor;
|
|
233
|
+
if (!deletePersistentAnchor) {
|
|
234
|
+
throw new Error("Deleting persistent anchors is not supported in this environment/browser");
|
|
235
|
+
}
|
|
236
|
+
await deletePersistentAnchor.call(session, handle);
|
|
237
|
+
for (const anchor of this._trackedAnchors) {
|
|
238
|
+
if (anchor.persistentHandle === handle) {
|
|
239
|
+
anchor._removed = true;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
for (const futureAnchor of this._futureAnchors) {
|
|
243
|
+
if (!futureAnchor.resolved && futureAnchor.persistentHandle === handle) {
|
|
244
|
+
futureAnchor.resolved = true;
|
|
245
|
+
futureAnchor.reject(new Error("The persistent anchor was deleted before tracking began"));
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
143
249
|
/**
|
|
144
250
|
* detach this feature.
|
|
145
251
|
* Will usually be called by the features manager
|
|
@@ -150,6 +256,7 @@ export class WebXRAnchorSystem extends WebXRAbstractFeature {
|
|
|
150
256
|
if (!super.detach()) {
|
|
151
257
|
return false;
|
|
152
258
|
}
|
|
259
|
+
this._rejectPendingPersistentAnchors("Persistent anchor restoration was interrupted before tracking began");
|
|
153
260
|
if (!this._options.doNotRemoveAnchorsOnSessionEnded) {
|
|
154
261
|
while (this._trackedAnchors.length) {
|
|
155
262
|
const toRemove = this._trackedAnchors.pop();
|
|
@@ -167,8 +274,8 @@ export class WebXRAnchorSystem extends WebXRAbstractFeature {
|
|
|
167
274
|
* Dispose this feature and all of the resources attached
|
|
168
275
|
*/
|
|
169
276
|
dispose() {
|
|
170
|
-
this._futureAnchors.length = 0;
|
|
171
277
|
super.dispose();
|
|
278
|
+
this._futureAnchors.length = 0;
|
|
172
279
|
this.onAnchorAddedObservable.clear();
|
|
173
280
|
this.onAnchorRemovedObservable.clear();
|
|
174
281
|
this.onAnchorUpdatedObservable.clear();
|
|
@@ -190,31 +297,35 @@ export class WebXRAnchorSystem extends WebXRAbstractFeature {
|
|
|
190
297
|
}
|
|
191
298
|
// now check for new ones
|
|
192
299
|
trackedAnchors.forEach((xrAnchor) => {
|
|
193
|
-
|
|
194
|
-
|
|
300
|
+
const trackedAnchorIndex = this._findIndexInAnchorArray(xrAnchor);
|
|
301
|
+
const futureAnchor = this._findFutureAnchor(xrAnchor);
|
|
302
|
+
if (!this._lastFrameDetected.has(xrAnchor) || (trackedAnchorIndex === -1 && futureAnchor !== undefined)) {
|
|
303
|
+
const anchor = {
|
|
304
|
+
_removed: false,
|
|
195
305
|
id: AnchorIdProvider++,
|
|
196
306
|
xrAnchor: xrAnchor,
|
|
307
|
+
transformationMatrix: new Matrix(),
|
|
308
|
+
persistentHandle: futureAnchor?.persistentHandle,
|
|
197
309
|
remove: () => {
|
|
198
|
-
|
|
310
|
+
anchor._removed = true;
|
|
199
311
|
},
|
|
200
312
|
};
|
|
201
|
-
|
|
313
|
+
this._updateAnchorWithXRFrame(xrAnchor, anchor, frame);
|
|
202
314
|
this._trackedAnchors.push(anchor);
|
|
203
315
|
this.onAnchorAddedObservable.notifyObservers(anchor);
|
|
204
316
|
// search for the future anchor promise that matches this
|
|
205
|
-
const
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
317
|
+
for (const pendingAnchor of this._futureAnchors) {
|
|
318
|
+
if (pendingAnchor.nativeAnchor === xrAnchor && !pendingAnchor.resolved) {
|
|
319
|
+
pendingAnchor.resolve(anchor);
|
|
320
|
+
pendingAnchor.resolved = true;
|
|
321
|
+
}
|
|
210
322
|
}
|
|
211
323
|
}
|
|
212
324
|
else {
|
|
213
|
-
|
|
214
|
-
if (index < 0) {
|
|
325
|
+
if (trackedAnchorIndex < 0) {
|
|
215
326
|
return;
|
|
216
327
|
}
|
|
217
|
-
const anchor = this._trackedAnchors[
|
|
328
|
+
const anchor = this._trackedAnchors[trackedAnchorIndex];
|
|
218
329
|
this._updateAnchorWithXRFrame(xrAnchor, anchor, frame);
|
|
219
330
|
if (anchor.attachedNode) {
|
|
220
331
|
anchor.attachedNode.rotationQuaternion = anchor.attachedNode.rotationQuaternion || new Quaternion();
|
|
@@ -228,6 +339,11 @@ export class WebXRAnchorSystem extends WebXRAbstractFeature {
|
|
|
228
339
|
// process future anchors
|
|
229
340
|
for (const futureAnchor of this._futureAnchors) {
|
|
230
341
|
if (!futureAnchor.resolved && !futureAnchor.submitted) {
|
|
342
|
+
if (!futureAnchor.xrTransformation) {
|
|
343
|
+
futureAnchor.resolved = true;
|
|
344
|
+
futureAnchor.reject(new Error("Anchor creation requires an XR transformation"));
|
|
345
|
+
continue;
|
|
346
|
+
}
|
|
231
347
|
// eslint-disable-next-line github/no-then
|
|
232
348
|
this._createAnchorAtTransformationAsync(futureAnchor.xrTransformation, frame).then((nativeAnchor) => {
|
|
233
349
|
futureAnchor.nativeAnchor = nativeAnchor;
|
|
@@ -238,6 +354,11 @@ export class WebXRAnchorSystem extends WebXRAbstractFeature {
|
|
|
238
354
|
futureAnchor.submitted = true;
|
|
239
355
|
}
|
|
240
356
|
}
|
|
357
|
+
for (let i = this._futureAnchors.length - 1; i >= 0; --i) {
|
|
358
|
+
if (this._futureAnchors[i].resolved) {
|
|
359
|
+
this._futureAnchors.splice(i, 1);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
241
362
|
}
|
|
242
363
|
/**
|
|
243
364
|
* avoiding using Array.find for global support.
|
|
@@ -252,6 +373,25 @@ export class WebXRAnchorSystem extends WebXRAbstractFeature {
|
|
|
252
373
|
}
|
|
253
374
|
return -1;
|
|
254
375
|
}
|
|
376
|
+
_findFutureAnchor(xrAnchor) {
|
|
377
|
+
for (const futureAnchor of this._futureAnchors) {
|
|
378
|
+
if (futureAnchor.nativeAnchor === xrAnchor && !futureAnchor.resolved) {
|
|
379
|
+
return futureAnchor;
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
return undefined;
|
|
383
|
+
}
|
|
384
|
+
_setPersistentHandle(anchor, handle) {
|
|
385
|
+
anchor.persistentHandle = handle;
|
|
386
|
+
}
|
|
387
|
+
_rejectPendingPersistentAnchors(message) {
|
|
388
|
+
for (const futureAnchor of this._futureAnchors) {
|
|
389
|
+
if (!futureAnchor.resolved && futureAnchor.persistentHandle !== undefined) {
|
|
390
|
+
futureAnchor.resolved = true;
|
|
391
|
+
futureAnchor.reject(new Error(message));
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
}
|
|
255
395
|
_updateAnchorWithXRFrame(xrAnchor, anchor, xrFrame) {
|
|
256
396
|
// matrix
|
|
257
397
|
const pose = xrFrame.getPose(xrAnchor.anchorSpace, this._xrSessionManager.referenceSpace);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebXRAnchorSystem.pure.js","sourceRoot":"","sources":["../../../../../dev/core/src/XR/features/WebXRAnchorSystem.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/** This file must only contain pure code and pure imports */\r\n\r\nimport { WebXRFeatureName, WebXRFeaturesManager } from \"../webXRFeaturesManager\";\r\nimport { type WebXRSessionManager } from \"../webXRSessionManager\";\r\nimport { Observable } from \"../../Misc/observable.pure\";\r\nimport { Matrix, Vector3, Quaternion } from \"../../Maths/math.vector.pure\";\r\nimport { type TransformNode } from \"../../Meshes/transformNode.pure\";\r\nimport { WebXRAbstractFeature } from \"./WebXRAbstractFeature\";\r\nimport { type IWebXRHitResult } from \"./WebXRHitTest.pure\";\r\n\r\n/**\r\n * Configuration options of the anchor system\r\n */\r\nexport interface IWebXRAnchorSystemOptions {\r\n /**\r\n * a node that will be used to convert local to world coordinates\r\n */\r\n worldParentNode?: TransformNode;\r\n\r\n /**\r\n * If set to true a reference of the created anchors will be kept until the next session starts\r\n * If not defined, anchors will be removed from the array when the feature is detached or the session ended.\r\n */\r\n doNotRemoveAnchorsOnSessionEnded?: boolean;\r\n\r\n /**\r\n * If set to true, all anchor arrays will be cleared when the session initializes\r\n */\r\n clearAnchorsOnSessionInit?: boolean;\r\n}\r\n\r\n/**\r\n * A babylon container for an XR Anchor\r\n */\r\nexport interface IWebXRAnchor {\r\n /**\r\n * A babylon-assigned ID for this anchor\r\n */\r\n id: number;\r\n /**\r\n * Transformation matrix to apply to an object attached to this anchor\r\n */\r\n transformationMatrix: Matrix;\r\n /**\r\n * The native anchor object\r\n */\r\n xrAnchor: XRAnchor;\r\n\r\n /**\r\n * if defined, this object will be constantly updated by the anchor's position and rotation\r\n */\r\n attachedNode?: TransformNode;\r\n\r\n /**\r\n * Remove this anchor from the scene\r\n */\r\n remove(): void;\r\n\r\n /**\r\n * @internal - set to true when the anchor was removed\r\n */\r\n _removed: boolean;\r\n}\r\n\r\n/**\r\n * An internal interface for a future (promise based) anchor\r\n */\r\ninterface IWebXRFutureAnchor {\r\n /**\r\n * The native anchor\r\n */\r\n nativeAnchor?: XRAnchor;\r\n /**\r\n * Was this request submitted to the xr frame?\r\n */\r\n submitted: boolean;\r\n /**\r\n * Was this promise resolved already?\r\n */\r\n resolved: boolean;\r\n /**\r\n * A resolve function\r\n */\r\n resolve: (xrAnchor: IWebXRAnchor) => void;\r\n /**\r\n * A reject function\r\n */\r\n reject: (msg?: string) => void;\r\n /**\r\n * The XR Transformation of the future anchor\r\n */\r\n xrTransformation: XRRigidTransform;\r\n}\r\n\r\nlet AnchorIdProvider = 0;\r\n\r\n/**\r\n * An implementation of the anchor system for WebXR.\r\n * For further information see https://github.com/immersive-web/anchors/\r\n */\r\nexport class WebXRAnchorSystem extends WebXRAbstractFeature {\r\n private _lastFrameDetected: XRAnchorSet = new Set();\r\n\r\n private _trackedAnchors: Array<IWebXRAnchor> = [];\r\n\r\n private _referenceSpaceForFrameAnchors: XRReferenceSpace;\r\n\r\n private _futureAnchors: IWebXRFutureAnchor[] = [];\r\n\r\n /**\r\n * The module's name\r\n */\r\n public static readonly Name = WebXRFeatureName.ANCHOR_SYSTEM;\r\n /**\r\n * The (Babylon) version of this module.\r\n * This is an integer representing the implementation version.\r\n * This number does not correspond to the WebXR specs version\r\n */\r\n public static readonly Version = 1;\r\n\r\n /**\r\n * Observers registered here will be executed when a new anchor was added to the session\r\n */\r\n public onAnchorAddedObservable: Observable<IWebXRAnchor> = new Observable();\r\n /**\r\n * Observers registered here will be executed when an anchor was removed from the session\r\n */\r\n public onAnchorRemovedObservable: Observable<IWebXRAnchor> = new Observable();\r\n /**\r\n * Observers registered here will be executed when an existing anchor updates\r\n * This can execute N times every frame\r\n */\r\n public onAnchorUpdatedObservable: Observable<IWebXRAnchor> = new Observable();\r\n\r\n /**\r\n * Set the reference space to use for anchor creation, when not using a hit test.\r\n * Will default to the session's reference space if not defined\r\n */\r\n public set referenceSpaceForFrameAnchors(referenceSpace: XRReferenceSpace) {\r\n this._referenceSpaceForFrameAnchors = referenceSpace;\r\n }\r\n\r\n /**\r\n * constructs a new anchor system\r\n * @param _xrSessionManager an instance of WebXRSessionManager\r\n * @param _options configuration object for this feature\r\n */\r\n constructor(\r\n _xrSessionManager: WebXRSessionManager,\r\n private _options: IWebXRAnchorSystemOptions = {}\r\n ) {\r\n super(_xrSessionManager);\r\n this.xrNativeFeatureName = \"anchors\";\r\n\r\n if (this._options.clearAnchorsOnSessionInit) {\r\n this._xrSessionManager.onXRSessionInit.add(() => {\r\n this._trackedAnchors.length = 0;\r\n this._futureAnchors.length = 0;\r\n this._lastFrameDetected.clear();\r\n });\r\n }\r\n }\r\n\r\n private _tmpVector = new Vector3();\r\n private _tmpQuaternion = new Quaternion();\r\n\r\n private _populateTmpTransformation(position: Vector3, rotationQuaternion: Quaternion) {\r\n this._tmpVector.copyFrom(position);\r\n this._tmpQuaternion.copyFrom(rotationQuaternion);\r\n if (!this._xrSessionManager.scene.useRightHandedSystem) {\r\n this._tmpVector.z *= -1;\r\n this._tmpQuaternion.z *= -1;\r\n this._tmpQuaternion.w *= -1;\r\n }\r\n return {\r\n position: this._tmpVector,\r\n rotationQuaternion: this._tmpQuaternion,\r\n };\r\n }\r\n\r\n /**\r\n * Create a new anchor point using a hit test result at a specific point in the scene\r\n * An anchor is tracked only after it is added to the trackerAnchors in xrFrame. The promise returned here does not yet guaranty that.\r\n * Use onAnchorAddedObservable to get newly added anchors if you require tracking guaranty.\r\n *\r\n * @param hitTestResult The hit test result to use for this anchor creation\r\n * @param position an optional position offset for this anchor\r\n * @param rotationQuaternion an optional rotation offset for this anchor\r\n * @returns A promise that fulfills when babylon has created the corresponding WebXRAnchor object and tracking has begun\r\n */\r\n public async addAnchorPointUsingHitTestResultAsync(\r\n hitTestResult: IWebXRHitResult,\r\n position: Vector3 = new Vector3(),\r\n rotationQuaternion: Quaternion = new Quaternion()\r\n ): Promise<IWebXRAnchor> {\r\n // convert to XR space (right handed) if needed\r\n this._populateTmpTransformation(position, rotationQuaternion);\r\n // the matrix that we'll use\r\n const m = new XRRigidTransform(\r\n { x: this._tmpVector.x, y: this._tmpVector.y, z: this._tmpVector.z },\r\n { x: this._tmpQuaternion.x, y: this._tmpQuaternion.y, z: this._tmpQuaternion.z, w: this._tmpQuaternion.w }\r\n );\r\n if (!hitTestResult.xrHitResult.createAnchor) {\r\n this.detach();\r\n throw new Error(\"Anchors not enabled in this environment/browser\");\r\n } else {\r\n try {\r\n const nativeAnchor = await hitTestResult.xrHitResult.createAnchor(m);\r\n return await new Promise<IWebXRAnchor>((resolve, reject) => {\r\n this._futureAnchors.push({\r\n nativeAnchor,\r\n resolved: false,\r\n submitted: true,\r\n xrTransformation: m,\r\n resolve,\r\n reject,\r\n });\r\n });\r\n } catch (error) {\r\n throw new Error(String(error), { cause: error });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Add a new anchor at a specific position and rotation\r\n * This function will add a new anchor per default in the next available frame. Unless forced, the createAnchor function\r\n * will be called in the next xrFrame loop to make sure that the anchor can be created correctly.\r\n * An anchor is tracked only after it is added to the trackerAnchors in xrFrame. The promise returned here does not yet guaranty that.\r\n * Use onAnchorAddedObservable to get newly added anchors if you require tracking guaranty.\r\n *\r\n * @param position the position in which to add an anchor\r\n * @param rotationQuaternion an optional rotation for the anchor transformation\r\n * @param forceCreateInCurrentFrame force the creation of this anchor in the current frame. Must be called inside xrFrame loop!\r\n * @returns A promise that fulfills when babylon has created the corresponding WebXRAnchor object and tracking has begun\r\n */\r\n public async addAnchorAtPositionAndRotationAsync(\r\n position: Vector3,\r\n rotationQuaternion: Quaternion = new Quaternion(),\r\n forceCreateInCurrentFrame = false\r\n ): Promise<IWebXRAnchor> {\r\n // convert to XR space (right handed) if needed\r\n this._populateTmpTransformation(position, rotationQuaternion);\r\n // the matrix that we'll use\r\n const xrTransformation = new XRRigidTransform(\r\n { x: this._tmpVector.x, y: this._tmpVector.y, z: this._tmpVector.z },\r\n { x: this._tmpQuaternion.x, y: this._tmpQuaternion.y, z: this._tmpQuaternion.z, w: this._tmpQuaternion.w }\r\n );\r\n const xrAnchor =\r\n forceCreateInCurrentFrame && this.attached && this._xrSessionManager.currentFrame\r\n ? await this._createAnchorAtTransformationAsync(xrTransformation, this._xrSessionManager.currentFrame)\r\n : undefined;\r\n // add the transformation to the future anchors list\r\n return await new Promise<IWebXRAnchor>((resolve, reject) => {\r\n this._futureAnchors.push({\r\n nativeAnchor: xrAnchor,\r\n resolved: false,\r\n submitted: false,\r\n xrTransformation,\r\n resolve,\r\n reject,\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Get the list of anchors currently being tracked by the system\r\n */\r\n public get anchors(): IWebXRAnchor[] {\r\n return this._trackedAnchors;\r\n }\r\n\r\n /**\r\n * detach this feature.\r\n * Will usually be called by the features manager\r\n *\r\n * @returns true if successful.\r\n */\r\n public override detach(): boolean {\r\n if (!super.detach()) {\r\n return false;\r\n }\r\n\r\n if (!this._options.doNotRemoveAnchorsOnSessionEnded) {\r\n while (this._trackedAnchors.length) {\r\n const toRemove = this._trackedAnchors.pop();\r\n if (toRemove && !toRemove._removed) {\r\n // as the xr frame loop is removed, we need to notify manually\r\n this.onAnchorRemovedObservable.notifyObservers(toRemove);\r\n toRemove._removed = true;\r\n // no need to call the remove fn as the anchor is already removed from the session\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Dispose this feature and all of the resources attached\r\n */\r\n public override dispose(): void {\r\n this._futureAnchors.length = 0;\r\n super.dispose();\r\n this.onAnchorAddedObservable.clear();\r\n this.onAnchorRemovedObservable.clear();\r\n this.onAnchorUpdatedObservable.clear();\r\n }\r\n\r\n protected _onXRFrame(frame: XRFrame) {\r\n if (!this.attached || !frame) {\r\n return;\r\n }\r\n\r\n const trackedAnchors = frame.trackedAnchors;\r\n if (trackedAnchors) {\r\n for (const anchor of this._trackedAnchors) {\r\n if (!anchor._removed) {\r\n continue;\r\n }\r\n const index = this._trackedAnchors.indexOf(anchor);\r\n this._trackedAnchors.splice(index, 1);\r\n anchor.xrAnchor.delete();\r\n this.onAnchorRemovedObservable.notifyObservers(anchor);\r\n }\r\n // now check for new ones\r\n trackedAnchors.forEach((xrAnchor) => {\r\n if (!this._lastFrameDetected.has(xrAnchor)) {\r\n const newAnchor: Partial<IWebXRAnchor> = {\r\n id: AnchorIdProvider++,\r\n xrAnchor: xrAnchor,\r\n remove: () => {\r\n newAnchor._removed = true;\r\n },\r\n };\r\n const anchor = this._updateAnchorWithXRFrame(xrAnchor, newAnchor, frame);\r\n this._trackedAnchors.push(anchor);\r\n this.onAnchorAddedObservable.notifyObservers(anchor);\r\n // search for the future anchor promise that matches this\r\n const results = this._futureAnchors.filter((futureAnchor) => futureAnchor.nativeAnchor === xrAnchor);\r\n const result = results[0];\r\n if (result) {\r\n result.resolve(anchor);\r\n result.resolved = true;\r\n }\r\n } else {\r\n const index = this._findIndexInAnchorArray(xrAnchor);\r\n if (index < 0) {\r\n return;\r\n }\r\n const anchor = this._trackedAnchors[index];\r\n this._updateAnchorWithXRFrame(xrAnchor, anchor, frame);\r\n if (anchor.attachedNode) {\r\n anchor.attachedNode.rotationQuaternion = anchor.attachedNode.rotationQuaternion || new Quaternion();\r\n anchor.transformationMatrix.decompose(anchor.attachedNode.scaling, anchor.attachedNode.rotationQuaternion, anchor.attachedNode.position);\r\n }\r\n this.onAnchorUpdatedObservable.notifyObservers(anchor);\r\n }\r\n });\r\n this._lastFrameDetected = trackedAnchors;\r\n }\r\n\r\n // process future anchors\r\n for (const futureAnchor of this._futureAnchors) {\r\n if (!futureAnchor.resolved && !futureAnchor.submitted) {\r\n // eslint-disable-next-line github/no-then\r\n this._createAnchorAtTransformationAsync(futureAnchor.xrTransformation, frame).then(\r\n (nativeAnchor) => {\r\n futureAnchor.nativeAnchor = nativeAnchor;\r\n },\r\n (error) => {\r\n futureAnchor.resolved = true;\r\n futureAnchor.reject(error);\r\n }\r\n );\r\n futureAnchor.submitted = true;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * avoiding using Array.find for global support.\r\n * @param xrAnchor the plane to find in the array\r\n * @returns the index of the anchor in the array or -1 if not found\r\n */\r\n private _findIndexInAnchorArray(xrAnchor: XRAnchor) {\r\n for (let i = 0; i < this._trackedAnchors.length; ++i) {\r\n if (this._trackedAnchors[i].xrAnchor === xrAnchor) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n }\r\n\r\n private _updateAnchorWithXRFrame(xrAnchor: XRAnchor, anchor: Partial<IWebXRAnchor>, xrFrame: XRFrame): IWebXRAnchor {\r\n // matrix\r\n const pose = xrFrame.getPose(xrAnchor.anchorSpace, this._xrSessionManager.referenceSpace);\r\n if (pose) {\r\n const mat = anchor.transformationMatrix || new Matrix();\r\n Matrix.FromArrayToRef(pose.transform.matrix, 0, mat);\r\n if (!this._xrSessionManager.scene.useRightHandedSystem) {\r\n mat.toggleModelMatrixHandInPlace();\r\n }\r\n anchor.transformationMatrix = mat;\r\n if (!this._options.worldParentNode) {\r\n // Logger.Warn(\"Please provide a world parent node to apply world transformation\");\r\n } else {\r\n mat.multiplyToRef(this._options.worldParentNode.getWorldMatrix(), mat);\r\n }\r\n }\r\n\r\n return <IWebXRAnchor>anchor;\r\n }\r\n\r\n private async _createAnchorAtTransformationAsync(xrTransformation: XRRigidTransform, xrFrame: XRFrame) {\r\n if (xrFrame.createAnchor) {\r\n try {\r\n return await xrFrame.createAnchor(xrTransformation, this._referenceSpaceForFrameAnchors ?? this._xrSessionManager.referenceSpace);\r\n } catch (error) {\r\n throw new Error(String(error), { cause: error });\r\n }\r\n } else {\r\n this.detach();\r\n throw new Error(\"Anchors are not enabled in your browser\");\r\n }\r\n }\r\n}\r\n\r\nlet _Registered = false;\r\n/**\r\n * Register side effects for webXRAnchorSystem.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\nexport function RegisterWebXRAnchorSystem(): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n // register the plugin\r\n WebXRFeaturesManager.AddWebXRFeature(\r\n WebXRAnchorSystem.Name,\r\n (xrSessionManager, options) => {\r\n return () => new WebXRAnchorSystem(xrSessionManager, options);\r\n },\r\n WebXRAnchorSystem.Version\r\n );\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"WebXRAnchorSystem.pure.js","sourceRoot":"","sources":["../../../../../dev/core/src/XR/features/WebXRAnchorSystem.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/** This file must only contain pure code and pure imports */\r\n\r\nimport { WebXRFeatureName, WebXRFeaturesManager } from \"../webXRFeaturesManager\";\r\nimport { type WebXRSessionManager } from \"../webXRSessionManager\";\r\nimport { Observable } from \"../../Misc/observable.pure\";\r\nimport { Matrix, Vector3, Quaternion } from \"../../Maths/math.vector.pure\";\r\nimport { type TransformNode } from \"../../Meshes/transformNode.pure\";\r\nimport { WebXRAbstractFeature } from \"./WebXRAbstractFeature\";\r\nimport { type IWebXRHitResult } from \"./WebXRHitTest.pure\";\r\n\r\n/**\r\n * Configuration options of the anchor system\r\n */\r\nexport interface IWebXRAnchorSystemOptions {\r\n /**\r\n * a node that will be used to convert local to world coordinates\r\n */\r\n worldParentNode?: TransformNode;\r\n\r\n /**\r\n * If set to true a reference of the created anchors will be kept until the next session starts\r\n * If not defined, anchors will be removed from the array when the feature is detached or the session ended.\r\n */\r\n doNotRemoveAnchorsOnSessionEnded?: boolean;\r\n\r\n /**\r\n * If set to true, all anchor arrays will be cleared when the session initializes\r\n */\r\n clearAnchorsOnSessionInit?: boolean;\r\n}\r\n\r\n/**\r\n * A babylon container for an XR Anchor\r\n */\r\nexport interface IWebXRAnchor {\r\n /**\r\n * A babylon-assigned ID for this anchor\r\n */\r\n id: number;\r\n /**\r\n * Transformation matrix to apply to an object attached to this anchor\r\n */\r\n transformationMatrix: Matrix;\r\n /**\r\n * The native anchor object\r\n */\r\n xrAnchor: XRAnchor;\r\n\r\n /**\r\n * The persistent handle associated with this anchor, if one was requested or the anchor was restored from one\r\n */\r\n persistentHandle?: string;\r\n\r\n /**\r\n * if defined, this object will be constantly updated by the anchor's position and rotation\r\n */\r\n attachedNode?: TransformNode;\r\n\r\n /**\r\n * Remove this anchor from the scene\r\n */\r\n remove(): void;\r\n\r\n /**\r\n * @internal - set to true when the anchor was removed\r\n */\r\n _removed: boolean;\r\n}\r\n\r\n/**\r\n * An internal interface for a future (promise based) anchor\r\n */\r\ninterface IWebXRFutureAnchor {\r\n /**\r\n * The native anchor\r\n */\r\n nativeAnchor?: XRAnchor;\r\n /**\r\n * Was this request submitted to the xr frame?\r\n */\r\n submitted: boolean;\r\n /**\r\n * Was this promise resolved already?\r\n */\r\n resolved: boolean;\r\n /**\r\n * A resolve function\r\n */\r\n resolve: (xrAnchor: IWebXRAnchor) => void;\r\n /**\r\n * A reject function\r\n */\r\n reject: (reason?: unknown) => void;\r\n /**\r\n * The XR Transformation of the future anchor\r\n */\r\n xrTransformation?: XRRigidTransform;\r\n /**\r\n * The persistent handle used to restore this anchor\r\n */\r\n persistentHandle?: string;\r\n}\r\n\r\nlet AnchorIdProvider = 0;\r\n\r\n/**\r\n * An implementation of the anchor system for WebXR.\r\n * For further information see https://github.com/immersive-web/anchors/\r\n */\r\nexport class WebXRAnchorSystem extends WebXRAbstractFeature {\r\n private _lastFrameDetected: XRAnchorSet = new Set();\r\n\r\n private _trackedAnchors: Array<IWebXRAnchor> = [];\r\n\r\n private _referenceSpaceForFrameAnchors: XRReferenceSpace;\r\n\r\n private _futureAnchors: IWebXRFutureAnchor[] = [];\r\n\r\n /**\r\n * The module's name\r\n */\r\n public static readonly Name = WebXRFeatureName.ANCHOR_SYSTEM;\r\n /**\r\n * The (Babylon) version of this module.\r\n * This is an integer representing the implementation version.\r\n * This number does not correspond to the WebXR specs version\r\n */\r\n public static readonly Version = 1;\r\n\r\n /**\r\n * Observers registered here will be executed when a new anchor was added to the session\r\n */\r\n public onAnchorAddedObservable: Observable<IWebXRAnchor> = new Observable();\r\n /**\r\n * Observers registered here will be executed when an anchor was removed from the session\r\n */\r\n public onAnchorRemovedObservable: Observable<IWebXRAnchor> = new Observable();\r\n /**\r\n * Observers registered here will be executed when an existing anchor updates\r\n * This can execute N times every frame\r\n */\r\n public onAnchorUpdatedObservable: Observable<IWebXRAnchor> = new Observable();\r\n\r\n /**\r\n * Set the reference space to use for anchor creation, when not using a hit test.\r\n * Will default to the session's reference space if not defined\r\n */\r\n public set referenceSpaceForFrameAnchors(referenceSpace: XRReferenceSpace) {\r\n this._referenceSpaceForFrameAnchors = referenceSpace;\r\n }\r\n\r\n /**\r\n * constructs a new anchor system\r\n * @param _xrSessionManager an instance of WebXRSessionManager\r\n * @param _options configuration object for this feature\r\n */\r\n constructor(\r\n _xrSessionManager: WebXRSessionManager,\r\n private _options: IWebXRAnchorSystemOptions = {}\r\n ) {\r\n super(_xrSessionManager);\r\n this.xrNativeFeatureName = \"anchors\";\r\n\r\n if (this._options.clearAnchorsOnSessionInit) {\r\n this._xrSessionManager.onXRSessionInit.add(() => {\r\n this._rejectPendingPersistentAnchors(\"Persistent anchor restoration was interrupted before tracking began\");\r\n this._trackedAnchors.length = 0;\r\n this._futureAnchors.length = 0;\r\n this._lastFrameDetected.clear();\r\n });\r\n }\r\n }\r\n\r\n private _tmpVector = new Vector3();\r\n private _tmpQuaternion = new Quaternion();\r\n\r\n private _populateTmpTransformation(position: Vector3, rotationQuaternion: Quaternion) {\r\n this._tmpVector.copyFrom(position);\r\n this._tmpQuaternion.copyFrom(rotationQuaternion);\r\n if (!this._xrSessionManager.scene.useRightHandedSystem) {\r\n this._tmpVector.z *= -1;\r\n this._tmpQuaternion.z *= -1;\r\n this._tmpQuaternion.w *= -1;\r\n }\r\n return {\r\n position: this._tmpVector,\r\n rotationQuaternion: this._tmpQuaternion,\r\n };\r\n }\r\n\r\n /**\r\n * Create a new anchor point using a hit test result at a specific point in the scene\r\n * An anchor is tracked only after it is added to the trackerAnchors in xrFrame. The promise returned here does not yet guaranty that.\r\n * Use onAnchorAddedObservable to get newly added anchors if you require tracking guaranty.\r\n *\r\n * @param hitTestResult The hit test result to use for this anchor creation\r\n * @param position an optional position offset for this anchor\r\n * @param rotationQuaternion an optional rotation offset for this anchor\r\n * @returns A promise that fulfills when babylon has created the corresponding WebXRAnchor object and tracking has begun\r\n */\r\n public async addAnchorPointUsingHitTestResultAsync(\r\n hitTestResult: IWebXRHitResult,\r\n position: Vector3 = new Vector3(),\r\n rotationQuaternion: Quaternion = new Quaternion()\r\n ): Promise<IWebXRAnchor> {\r\n // convert to XR space (right handed) if needed\r\n this._populateTmpTransformation(position, rotationQuaternion);\r\n // the matrix that we'll use\r\n const m = new XRRigidTransform(\r\n { x: this._tmpVector.x, y: this._tmpVector.y, z: this._tmpVector.z },\r\n { x: this._tmpQuaternion.x, y: this._tmpQuaternion.y, z: this._tmpQuaternion.z, w: this._tmpQuaternion.w }\r\n );\r\n if (!hitTestResult.xrHitResult.createAnchor) {\r\n this.detach();\r\n throw new Error(\"Anchors not enabled in this environment/browser\");\r\n } else {\r\n try {\r\n const nativeAnchor = await hitTestResult.xrHitResult.createAnchor(m);\r\n return await new Promise<IWebXRAnchor>((resolve, reject) => {\r\n this._futureAnchors.push({\r\n nativeAnchor,\r\n resolved: false,\r\n submitted: true,\r\n xrTransformation: m,\r\n resolve,\r\n reject,\r\n });\r\n });\r\n } catch (error) {\r\n throw new Error(String(error), { cause: error });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Add a new anchor at a specific position and rotation\r\n * This function will add a new anchor per default in the next available frame. Unless forced, the createAnchor function\r\n * will be called in the next xrFrame loop to make sure that the anchor can be created correctly.\r\n * An anchor is tracked only after it is added to the trackerAnchors in xrFrame. The promise returned here does not yet guaranty that.\r\n * Use onAnchorAddedObservable to get newly added anchors if you require tracking guaranty.\r\n *\r\n * @param position the position in which to add an anchor\r\n * @param rotationQuaternion an optional rotation for the anchor transformation\r\n * @param forceCreateInCurrentFrame force the creation of this anchor in the current frame. Must be called inside xrFrame loop!\r\n * @returns A promise that fulfills when babylon has created the corresponding WebXRAnchor object and tracking has begun\r\n */\r\n public async addAnchorAtPositionAndRotationAsync(\r\n position: Vector3,\r\n rotationQuaternion: Quaternion = new Quaternion(),\r\n forceCreateInCurrentFrame = false\r\n ): Promise<IWebXRAnchor> {\r\n // convert to XR space (right handed) if needed\r\n this._populateTmpTransformation(position, rotationQuaternion);\r\n // the matrix that we'll use\r\n const xrTransformation = new XRRigidTransform(\r\n { x: this._tmpVector.x, y: this._tmpVector.y, z: this._tmpVector.z },\r\n { x: this._tmpQuaternion.x, y: this._tmpQuaternion.y, z: this._tmpQuaternion.z, w: this._tmpQuaternion.w }\r\n );\r\n const xrAnchor =\r\n forceCreateInCurrentFrame && this.attached && this._xrSessionManager.currentFrame\r\n ? await this._createAnchorAtTransformationAsync(xrTransformation, this._xrSessionManager.currentFrame)\r\n : undefined;\r\n // add the transformation to the future anchors list\r\n return await new Promise<IWebXRAnchor>((resolve, reject) => {\r\n this._futureAnchors.push({\r\n nativeAnchor: xrAnchor,\r\n resolved: false,\r\n submitted: false,\r\n xrTransformation,\r\n resolve,\r\n reject,\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Get the list of anchors currently being tracked by the system\r\n */\r\n public get anchors(): IWebXRAnchor[] {\r\n return this._trackedAnchors;\r\n }\r\n\r\n /**\r\n * Whether the current XR session exposes all session-level persistent anchor APIs\r\n * @returns Whether all session-level persistent anchor APIs are supported\r\n */\r\n public get isPersistentAnchorSupported(): boolean {\r\n const session = this._xrSessionManager.session;\r\n return (\r\n !!session && session.persistentAnchors !== undefined && typeof session.restorePersistentAnchor === \"function\" && typeof session.deletePersistentAnchor === \"function\"\r\n );\r\n }\r\n\r\n /**\r\n * Get the persistent anchor handles known to the current XR session\r\n * @returns The persistent anchor handles\r\n * @throws If persistent anchor enumeration is not supported by the current session\r\n */\r\n public get persistentAnchors(): ReadonlyArray<string> {\r\n const persistentAnchors = this._xrSessionManager.session?.persistentAnchors;\r\n if (persistentAnchors === undefined) {\r\n throw new Error(\"Persistent anchor enumeration is not supported in this environment/browser\");\r\n }\r\n return persistentAnchors;\r\n }\r\n\r\n /**\r\n * Request a persistent handle for a tracked anchor\r\n * @param anchor The Babylon anchor to persist\r\n * @returns A promise that resolves with the persistent handle\r\n * @throws If requesting persistent handles is not supported by the native anchor\r\n */\r\n public async requestPersistentHandleAsync(anchor: IWebXRAnchor): Promise<string> {\r\n const requestPersistentHandle = anchor.xrAnchor.requestPersistentHandle;\r\n if (!requestPersistentHandle) {\r\n throw new Error(\"Requesting persistent anchor handles is not supported in this environment/browser\");\r\n }\r\n const handle = await requestPersistentHandle.call(anchor.xrAnchor);\r\n this._setPersistentHandle(anchor, handle);\r\n return handle;\r\n }\r\n\r\n /**\r\n * Restore a persistent anchor into the Babylon anchor lifecycle\r\n * @param handle The persistent anchor handle to restore\r\n * @returns A promise that resolves after the restored anchor is tracked by an XR frame\r\n * @throws If restoring persistent anchors is not supported by the current session\r\n */\r\n public async restorePersistentAnchorAsync(handle: string): Promise<IWebXRAnchor> {\r\n if (!this.attached) {\r\n throw new Error(\"Restoring persistent anchors requires the anchor system to be attached\");\r\n }\r\n\r\n const session = this._xrSessionManager.session;\r\n const restorePersistentAnchor = session?.restorePersistentAnchor;\r\n if (!restorePersistentAnchor) {\r\n throw new Error(\"Restoring persistent anchors is not supported in this environment/browser\");\r\n }\r\n\r\n const nativeAnchor = await restorePersistentAnchor.call(session, handle);\r\n if (!this.attached || this._xrSessionManager.session !== session) {\r\n nativeAnchor.delete();\r\n throw new Error(\"Persistent anchor restoration was interrupted before tracking began\");\r\n }\r\n const existingAnchorIndex = this._findIndexInAnchorArray(nativeAnchor);\r\n if (existingAnchorIndex !== -1) {\r\n const existingAnchor = this._trackedAnchors[existingAnchorIndex];\r\n existingAnchor.persistentHandle = handle;\r\n return existingAnchor;\r\n }\r\n\r\n return await new Promise<IWebXRAnchor>((resolve, reject) => {\r\n this._futureAnchors.push({\r\n nativeAnchor,\r\n resolved: false,\r\n submitted: true,\r\n persistentHandle: handle,\r\n resolve,\r\n reject,\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Restore all persistent anchors known to the current XR session\r\n * @returns A promise that resolves after all restored anchors are tracked by an XR frame\r\n * @throws If persistent anchor enumeration or restoration is not supported by the current session\r\n */\r\n public async restorePersistentAnchorsAsync(): Promise<IWebXRAnchor[]> {\r\n return await Promise.all(this.persistentAnchors.map(async (handle) => await this.restorePersistentAnchorAsync(handle)));\r\n }\r\n\r\n /**\r\n * Delete a persistent anchor from native storage\r\n * @param handle The persistent anchor handle to delete\r\n * @returns A promise that resolves after native persistent storage is deleted\r\n * @throws If deleting persistent anchors is not supported by the current session\r\n */\r\n public async deletePersistentAnchorAsync(handle: string): Promise<void> {\r\n const session = this._xrSessionManager.session;\r\n const deletePersistentAnchor = session?.deletePersistentAnchor;\r\n if (!deletePersistentAnchor) {\r\n throw new Error(\"Deleting persistent anchors is not supported in this environment/browser\");\r\n }\r\n\r\n await deletePersistentAnchor.call(session, handle);\r\n for (const anchor of this._trackedAnchors) {\r\n if (anchor.persistentHandle === handle) {\r\n anchor._removed = true;\r\n }\r\n }\r\n for (const futureAnchor of this._futureAnchors) {\r\n if (!futureAnchor.resolved && futureAnchor.persistentHandle === handle) {\r\n futureAnchor.resolved = true;\r\n futureAnchor.reject(new Error(\"The persistent anchor was deleted before tracking began\"));\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * detach this feature.\r\n * Will usually be called by the features manager\r\n *\r\n * @returns true if successful.\r\n */\r\n public override detach(): boolean {\r\n if (!super.detach()) {\r\n return false;\r\n }\r\n\r\n this._rejectPendingPersistentAnchors(\"Persistent anchor restoration was interrupted before tracking began\");\r\n\r\n if (!this._options.doNotRemoveAnchorsOnSessionEnded) {\r\n while (this._trackedAnchors.length) {\r\n const toRemove = this._trackedAnchors.pop();\r\n if (toRemove && !toRemove._removed) {\r\n // as the xr frame loop is removed, we need to notify manually\r\n this.onAnchorRemovedObservable.notifyObservers(toRemove);\r\n toRemove._removed = true;\r\n // no need to call the remove fn as the anchor is already removed from the session\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Dispose this feature and all of the resources attached\r\n */\r\n public override dispose(): void {\r\n super.dispose();\r\n this._futureAnchors.length = 0;\r\n this.onAnchorAddedObservable.clear();\r\n this.onAnchorRemovedObservable.clear();\r\n this.onAnchorUpdatedObservable.clear();\r\n }\r\n\r\n protected _onXRFrame(frame: XRFrame) {\r\n if (!this.attached || !frame) {\r\n return;\r\n }\r\n\r\n const trackedAnchors = frame.trackedAnchors;\r\n if (trackedAnchors) {\r\n for (const anchor of this._trackedAnchors) {\r\n if (!anchor._removed) {\r\n continue;\r\n }\r\n const index = this._trackedAnchors.indexOf(anchor);\r\n this._trackedAnchors.splice(index, 1);\r\n anchor.xrAnchor.delete();\r\n this.onAnchorRemovedObservable.notifyObservers(anchor);\r\n }\r\n // now check for new ones\r\n trackedAnchors.forEach((xrAnchor) => {\r\n const trackedAnchorIndex = this._findIndexInAnchorArray(xrAnchor);\r\n const futureAnchor = this._findFutureAnchor(xrAnchor);\r\n if (!this._lastFrameDetected.has(xrAnchor) || (trackedAnchorIndex === -1 && futureAnchor !== undefined)) {\r\n const anchor: IWebXRAnchor = {\r\n _removed: false,\r\n id: AnchorIdProvider++,\r\n xrAnchor: xrAnchor,\r\n transformationMatrix: new Matrix(),\r\n persistentHandle: futureAnchor?.persistentHandle,\r\n remove: () => {\r\n anchor._removed = true;\r\n },\r\n };\r\n this._updateAnchorWithXRFrame(xrAnchor, anchor, frame);\r\n this._trackedAnchors.push(anchor);\r\n this.onAnchorAddedObservable.notifyObservers(anchor);\r\n // search for the future anchor promise that matches this\r\n for (const pendingAnchor of this._futureAnchors) {\r\n if (pendingAnchor.nativeAnchor === xrAnchor && !pendingAnchor.resolved) {\r\n pendingAnchor.resolve(anchor);\r\n pendingAnchor.resolved = true;\r\n }\r\n }\r\n } else {\r\n if (trackedAnchorIndex < 0) {\r\n return;\r\n }\r\n const anchor = this._trackedAnchors[trackedAnchorIndex];\r\n this._updateAnchorWithXRFrame(xrAnchor, anchor, frame);\r\n if (anchor.attachedNode) {\r\n anchor.attachedNode.rotationQuaternion = anchor.attachedNode.rotationQuaternion || new Quaternion();\r\n anchor.transformationMatrix.decompose(anchor.attachedNode.scaling, anchor.attachedNode.rotationQuaternion, anchor.attachedNode.position);\r\n }\r\n this.onAnchorUpdatedObservable.notifyObservers(anchor);\r\n }\r\n });\r\n this._lastFrameDetected = trackedAnchors;\r\n }\r\n\r\n // process future anchors\r\n for (const futureAnchor of this._futureAnchors) {\r\n if (!futureAnchor.resolved && !futureAnchor.submitted) {\r\n if (!futureAnchor.xrTransformation) {\r\n futureAnchor.resolved = true;\r\n futureAnchor.reject(new Error(\"Anchor creation requires an XR transformation\"));\r\n continue;\r\n }\r\n // eslint-disable-next-line github/no-then\r\n this._createAnchorAtTransformationAsync(futureAnchor.xrTransformation, frame).then(\r\n (nativeAnchor) => {\r\n futureAnchor.nativeAnchor = nativeAnchor;\r\n },\r\n (error) => {\r\n futureAnchor.resolved = true;\r\n futureAnchor.reject(error);\r\n }\r\n );\r\n futureAnchor.submitted = true;\r\n }\r\n }\r\n for (let i = this._futureAnchors.length - 1; i >= 0; --i) {\r\n if (this._futureAnchors[i].resolved) {\r\n this._futureAnchors.splice(i, 1);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * avoiding using Array.find for global support.\r\n * @param xrAnchor the plane to find in the array\r\n * @returns the index of the anchor in the array or -1 if not found\r\n */\r\n private _findIndexInAnchorArray(xrAnchor: XRAnchor) {\r\n for (let i = 0; i < this._trackedAnchors.length; ++i) {\r\n if (this._trackedAnchors[i].xrAnchor === xrAnchor) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n }\r\n\r\n private _findFutureAnchor(xrAnchor: XRAnchor): IWebXRFutureAnchor | undefined {\r\n for (const futureAnchor of this._futureAnchors) {\r\n if (futureAnchor.nativeAnchor === xrAnchor && !futureAnchor.resolved) {\r\n return futureAnchor;\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n private _setPersistentHandle(anchor: IWebXRAnchor, handle: string): void {\r\n anchor.persistentHandle = handle;\r\n }\r\n\r\n private _rejectPendingPersistentAnchors(message: string): void {\r\n for (const futureAnchor of this._futureAnchors) {\r\n if (!futureAnchor.resolved && futureAnchor.persistentHandle !== undefined) {\r\n futureAnchor.resolved = true;\r\n futureAnchor.reject(new Error(message));\r\n }\r\n }\r\n }\r\n\r\n private _updateAnchorWithXRFrame(xrAnchor: XRAnchor, anchor: Partial<IWebXRAnchor>, xrFrame: XRFrame): IWebXRAnchor {\r\n // matrix\r\n const pose = xrFrame.getPose(xrAnchor.anchorSpace, this._xrSessionManager.referenceSpace);\r\n if (pose) {\r\n const mat = anchor.transformationMatrix || new Matrix();\r\n Matrix.FromArrayToRef(pose.transform.matrix, 0, mat);\r\n if (!this._xrSessionManager.scene.useRightHandedSystem) {\r\n mat.toggleModelMatrixHandInPlace();\r\n }\r\n anchor.transformationMatrix = mat;\r\n if (!this._options.worldParentNode) {\r\n // Logger.Warn(\"Please provide a world parent node to apply world transformation\");\r\n } else {\r\n mat.multiplyToRef(this._options.worldParentNode.getWorldMatrix(), mat);\r\n }\r\n }\r\n\r\n return <IWebXRAnchor>anchor;\r\n }\r\n\r\n private async _createAnchorAtTransformationAsync(xrTransformation: XRRigidTransform, xrFrame: XRFrame) {\r\n if (xrFrame.createAnchor) {\r\n try {\r\n return await xrFrame.createAnchor(xrTransformation, this._referenceSpaceForFrameAnchors ?? this._xrSessionManager.referenceSpace);\r\n } catch (error) {\r\n throw new Error(String(error), { cause: error });\r\n }\r\n } else {\r\n this.detach();\r\n throw new Error(\"Anchors are not enabled in your browser\");\r\n }\r\n }\r\n}\r\n\r\nlet _Registered = false;\r\n/**\r\n * Register side effects for webXRAnchorSystem.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\nexport function RegisterWebXRAnchorSystem(): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n // register the plugin\r\n WebXRFeaturesManager.AddWebXRFeature(\r\n WebXRAnchorSystem.Name,\r\n (xrSessionManager, options) => {\r\n return () => new WebXRAnchorSystem(xrSessionManager, options);\r\n },\r\n WebXRAnchorSystem.Version\r\n );\r\n}\r\n"]}
|
|
@@ -6,7 +6,7 @@ import { Axis } from "../../Maths/math.axis.js";
|
|
|
6
6
|
import { StandardMaterial } from "../../Materials/standardMaterial.pure.js";
|
|
7
7
|
import { CreateCylinder } from "../../Meshes/Builders/cylinderBuilder.pure.js";
|
|
8
8
|
import { CreateTorus } from "../../Meshes/Builders/torusBuilder.pure.js";
|
|
9
|
-
import { Ray } from "../../Culling/ray.pure.js";
|
|
9
|
+
import { Ray, RegisterRay } from "../../Culling/ray.pure.js";
|
|
10
10
|
import { PickingInfo } from "../../Collisions/pickingInfo.js";
|
|
11
11
|
import { WebXRAbstractFeature } from "./WebXRAbstractFeature.js";
|
|
12
12
|
import { UtilityLayerRenderer } from "../../Rendering/utilityLayerRenderer.js";
|
|
@@ -796,6 +796,7 @@ export function RegisterWebXRControllerPointerSelection() {
|
|
|
796
796
|
return;
|
|
797
797
|
}
|
|
798
798
|
_Registered = true;
|
|
799
|
+
RegisterRay();
|
|
799
800
|
//register the plugin
|
|
800
801
|
WebXRFeaturesManager.AddWebXRFeature(WebXRControllerPointerSelection.Name, (xrSessionManager, options) => {
|
|
801
802
|
return () => new WebXRControllerPointerSelection(xrSessionManager, options);
|