@babylonjs/core 8.3.0 → 8.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Animations/animation.d.ts +4 -0
- package/Animations/animation.js +22 -13
- package/Animations/animation.js.map +1 -1
- package/Animations/animation.optimizations.d.ts +31 -0
- package/Animations/animation.optimizations.js +41 -0
- package/Animations/animation.optimizations.js.map +1 -0
- package/Animations/index.d.ts +1 -0
- package/Animations/index.js +1 -0
- package/Animations/index.js.map +1 -1
- package/Animations/pathCursor.js +3 -1
- package/Animations/pathCursor.js.map +1 -1
- package/Animations/runtimeAnimation.d.ts +3 -1
- package/Animations/runtimeAnimation.js +127 -116
- package/Animations/runtimeAnimation.js.map +1 -1
- package/Audio/audioSceneComponent.js +4 -4
- package/Audio/audioSceneComponent.js.map +1 -1
- package/Behaviors/Meshes/attachToBoxBehavior.js +6 -6
- package/Behaviors/Meshes/attachToBoxBehavior.js.map +1 -1
- package/Behaviors/Meshes/fadeInOutBehavior.js +3 -2
- package/Behaviors/Meshes/fadeInOutBehavior.js.map +1 -1
- package/Behaviors/Meshes/multiPointerScaleBehavior.js +6 -4
- package/Behaviors/Meshes/multiPointerScaleBehavior.js.map +1 -1
- package/Behaviors/Meshes/sixDofDragBehavior.js +3 -2
- package/Behaviors/Meshes/sixDofDragBehavior.js.map +1 -1
- package/Bones/skeleton.js +6 -6
- package/Bones/skeleton.js.map +1 -1
- package/Cameras/Inputs/followCameraKeyboardMoveInput.js +2 -2
- package/Cameras/Inputs/followCameraKeyboardMoveInput.js.map +1 -1
- package/Cameras/VR/vrExperienceHelper.js +2 -2
- package/Cameras/VR/vrExperienceHelper.js.map +1 -1
- package/Cameras/arcRotateCamera.js +6 -2
- package/Cameras/arcRotateCamera.js.map +1 -1
- package/Cameras/camera.js +2 -2
- package/Cameras/camera.js.map +1 -1
- package/Cameras/deviceOrientationCamera.js +3 -2
- package/Cameras/deviceOrientationCamera.js.map +1 -1
- package/Collisions/gpuPicker.d.ts +1 -0
- package/Collisions/gpuPicker.js +9 -0
- package/Collisions/gpuPicker.js.map +1 -1
- package/Debug/axesViewer.js +3 -2
- package/Debug/axesViewer.js.map +1 -1
- package/Debug/directionalLightFrustumViewer.js +4 -4
- package/Debug/directionalLightFrustumViewer.js.map +1 -1
- package/Debug/physicsViewer.js +7 -6
- package/Debug/physicsViewer.js.map +1 -1
- package/Debug/skeletonViewer.js +4 -4
- package/Debug/skeletonViewer.js.map +1 -1
- package/Engines/Native/nativeInterfaces.d.ts +6 -7
- package/Engines/Native/nativeInterfaces.js.map +1 -1
- package/Engines/Processors/shaderCodeNode.js +2 -2
- package/Engines/Processors/shaderCodeNode.js.map +1 -1
- package/Engines/abstractEngine.d.ts +1 -0
- package/Engines/abstractEngine.js +14 -8
- package/Engines/abstractEngine.js.map +1 -1
- package/Engines/constants.d.ts +27 -5
- package/Engines/constants.js +27 -5
- package/Engines/constants.js.map +1 -1
- package/Engines/engine.js +8 -8
- package/Engines/engine.js.map +1 -1
- package/Engines/nativeEngine.js +13 -27
- package/Engines/nativeEngine.js.map +1 -1
- package/Engines/webgpuEngine.js +6 -2
- package/Engines/webgpuEngine.js.map +1 -1
- package/FlowGraph/Blocks/Data/Transformers/flowGraphJsonPointerParserBlock.js +2 -2
- package/FlowGraph/Blocks/Data/Transformers/flowGraphJsonPointerParserBlock.js.map +1 -1
- package/FlowGraph/Blocks/Data/flowGraphDataSwitchBlock.js +3 -2
- package/FlowGraph/Blocks/Data/flowGraphDataSwitchBlock.js.map +1 -1
- package/FlowGraph/Blocks/Event/flowGraphReceiveCustomEventBlock.js +3 -2
- package/FlowGraph/Blocks/Event/flowGraphReceiveCustomEventBlock.js.map +1 -1
- package/FlowGraph/Blocks/Event/flowGraphSendCustomEventBlock.js +2 -2
- package/FlowGraph/Blocks/Event/flowGraphSendCustomEventBlock.js.map +1 -1
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphSwitchBlock.js +3 -2
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphSwitchBlock.js.map +1 -1
- package/FlowGraph/flowGraphAsyncExecutionBlock.js +5 -3
- package/FlowGraph/flowGraphAsyncExecutionBlock.js.map +1 -1
- package/FlowGraph/flowGraphBlock.js +3 -2
- package/FlowGraph/flowGraphBlock.js.map +1 -1
- package/FlowGraph/flowGraphCoordinator.js +10 -6
- package/FlowGraph/flowGraphCoordinator.js.map +1 -1
- package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.js +2 -2
- package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.js.map +1 -1
- package/FrameGraph/Node/nodeRenderGraphBlock.js +5 -4
- package/FrameGraph/Node/nodeRenderGraphBlock.js.map +1 -1
- package/FrameGraph/Tasks/PostProcesses/depthOfFieldMergeTask.js +4 -3
- package/FrameGraph/Tasks/PostProcesses/depthOfFieldMergeTask.js.map +1 -1
- package/Gamepads/gamepadManager.js +2 -2
- package/Gamepads/gamepadManager.js.map +1 -1
- package/Gizmos/axisDragGizmo.js +3 -2
- package/Gizmos/axisDragGizmo.js.map +1 -1
- package/Gizmos/axisScaleGizmo.js +6 -4
- package/Gizmos/axisScaleGizmo.js.map +1 -1
- package/Gizmos/boundingBoxGizmo.js +28 -26
- package/Gizmos/boundingBoxGizmo.js.map +1 -1
- package/Gizmos/cameraGizmo.js +6 -3
- package/Gizmos/cameraGizmo.js.map +1 -1
- package/Gizmos/gizmo.js +11 -10
- package/Gizmos/gizmo.js.map +1 -1
- package/Gizmos/gizmoManager.js +16 -12
- package/Gizmos/gizmoManager.js.map +1 -1
- package/Gizmos/lightGizmo.js +3 -2
- package/Gizmos/lightGizmo.js.map +1 -1
- package/Gizmos/planeDragGizmo.js +3 -2
- package/Gizmos/planeDragGizmo.js.map +1 -1
- package/Gizmos/planeRotationGizmo.js +3 -2
- package/Gizmos/planeRotationGizmo.js.map +1 -1
- package/Gizmos/positionGizmo.js +41 -28
- package/Gizmos/positionGizmo.js.map +1 -1
- package/Gizmos/rotationGizmo.js +26 -18
- package/Gizmos/rotationGizmo.js.map +1 -1
- package/Gizmos/scaleGizmo.js +47 -32
- package/Gizmos/scaleGizmo.js.map +1 -1
- package/Layers/effectLayerSceneComponent.js +4 -4
- package/Layers/effectLayerSceneComponent.js.map +1 -1
- package/Layers/layerSceneComponent.js +4 -4
- package/Layers/layerSceneComponent.js.map +1 -1
- package/LensFlares/lensFlareSystemSceneComponent.js +4 -4
- package/LensFlares/lensFlareSystemSceneComponent.js.map +1 -1
- package/Lights/Shadows/shadowGenerator.js +3 -3
- package/Lights/Shadows/shadowGenerator.js.map +1 -1
- package/Lights/light.js +4 -4
- package/Lights/light.js.map +1 -1
- package/Loading/Plugins/babylonFileLoader.js +54 -46
- package/Loading/Plugins/babylonFileLoader.js.map +1 -1
- package/Loading/loadingScreen.js +4 -3
- package/Loading/loadingScreen.js.map +1 -1
- package/Loading/sceneLoader.js +15 -12
- package/Loading/sceneLoader.js.map +1 -1
- package/Materials/Node/Blocks/Dual/currentScreenBlock.js +9 -3
- package/Materials/Node/Blocks/Dual/currentScreenBlock.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js +11 -0
- package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js.map +1 -1
- package/Materials/Node/Blocks/Input/inputBlock.js +18 -31
- package/Materials/Node/Blocks/Input/inputBlock.js.map +1 -1
- package/Materials/Node/Blocks/baseMathBlock.js +3 -1
- package/Materials/Node/Blocks/baseMathBlock.js.map +1 -1
- package/Materials/Node/Blocks/customBlock.js +53 -43
- package/Materials/Node/Blocks/customBlock.js.map +1 -1
- package/Materials/Node/Enums/nodeMaterialModes.d.ts +3 -1
- package/Materials/Node/Enums/nodeMaterialModes.js +2 -0
- package/Materials/Node/Enums/nodeMaterialModes.js.map +1 -1
- package/Materials/Node/nodeMaterial.d.ts +5 -0
- package/Materials/Node/nodeMaterial.js +33 -20
- package/Materials/Node/nodeMaterial.js.map +1 -1
- package/Materials/Node/nodeMaterialBlock.js +7 -4
- package/Materials/Node/nodeMaterialBlock.js.map +1 -1
- package/Materials/Node/nodeMaterialBuildState.d.ts +13 -2
- package/Materials/Node/nodeMaterialBuildState.js +72 -7
- package/Materials/Node/nodeMaterialBuildState.js.map +1 -1
- package/Materials/Node/nodeMaterialDefault.d.ts +5 -0
- package/Materials/Node/nodeMaterialDefault.js +28 -0
- package/Materials/Node/nodeMaterialDefault.js.map +1 -1
- package/Materials/Textures/cubeTexture.js +3 -1
- package/Materials/Textures/cubeTexture.js.map +1 -1
- package/Materials/Textures/videoTexture.js +5 -4
- package/Materials/Textures/videoTexture.js.map +1 -1
- package/Materials/materialDefines.js +3 -1
- package/Materials/materialDefines.js.map +1 -1
- package/Materials/multiMaterial.js +3 -1
- package/Materials/multiMaterial.js.map +1 -1
- package/Materials/shaderMaterial.js +3 -2
- package/Materials/shaderMaterial.js.map +1 -1
- package/Meshes/Compression/dracoEncoder.js +2 -2
- package/Meshes/Compression/dracoEncoder.js.map +1 -1
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.js +8 -8
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.js.map +1 -1
- package/Meshes/GreasedLine/greasedLineMesh.js +6 -6
- package/Meshes/GreasedLine/greasedLineMesh.js.map +1 -1
- package/Meshes/GreasedLine/greasedLineRibbonMesh.js +4 -3
- package/Meshes/GreasedLine/greasedLineRibbonMesh.js.map +1 -1
- package/Meshes/Node/Blocks/mathBlock.js +3 -1
- package/Meshes/Node/Blocks/mathBlock.js.map +1 -1
- package/Meshes/Node/nodeGeometryBlock.js +8 -5
- package/Meshes/Node/nodeGeometryBlock.js.map +1 -1
- package/Meshes/abstractMesh.js +2 -2
- package/Meshes/abstractMesh.js.map +1 -1
- package/Meshes/geodesicMesh.js +2 -2
- package/Meshes/geodesicMesh.js.map +1 -1
- package/Meshes/mesh.js +6 -6
- package/Meshes/mesh.js.map +1 -1
- package/Meshes/mesh.vertexData.functions.js +11 -10
- package/Meshes/mesh.vertexData.functions.js.map +1 -1
- package/Meshes/mesh.vertexData.subdivide.js +10 -10
- package/Meshes/mesh.vertexData.subdivide.js.map +1 -1
- package/Meshes/meshSimplification.js +10 -10
- package/Meshes/meshSimplification.js.map +1 -1
- package/Meshes/meshUtils.js +6 -3
- package/Meshes/meshUtils.js.map +1 -1
- package/Meshes/polygonMesh.js +10 -10
- package/Meshes/polygonMesh.js.map +1 -1
- package/Misc/PerformanceViewer/performanceViewerCollector.js +4 -4
- package/Misc/PerformanceViewer/performanceViewerCollector.js.map +1 -1
- package/Misc/arrayTools.js +2 -2
- package/Misc/arrayTools.js.map +1 -1
- package/Misc/asyncLock.js +9 -9
- package/Misc/asyncLock.js.map +1 -1
- package/Misc/basis.js +4 -2
- package/Misc/basis.js.map +1 -1
- package/Misc/deepCopier.js +3 -2
- package/Misc/deepCopier.js.map +1 -1
- package/Misc/deepMerger.js +3 -2
- package/Misc/deepMerger.js.map +1 -1
- package/Misc/fileTools.js +4 -4
- package/Misc/fileTools.js.map +1 -1
- package/Misc/greasedLineTools.js +14 -13
- package/Misc/greasedLineTools.js.map +1 -1
- package/Misc/logger.js +3 -2
- package/Misc/logger.js.map +1 -1
- package/Misc/observable.extensions.js +4 -4
- package/Misc/observable.extensions.js.map +1 -1
- package/Misc/sceneSerializer.js +5 -4
- package/Misc/sceneSerializer.js.map +1 -1
- package/Misc/snapshotRenderingHelper.js +3 -1
- package/Misc/snapshotRenderingHelper.js.map +1 -1
- package/Misc/tags.js +2 -2
- package/Misc/tags.js.map +1 -1
- package/Misc/trajectoryClassifier.js +8 -8
- package/Misc/trajectoryClassifier.js.map +1 -1
- package/Particles/IParticleSystem.d.ts +1 -1
- package/Particles/IParticleSystem.js.map +1 -1
- package/Particles/baseParticleSystem.d.ts +11 -3
- package/Particles/baseParticleSystem.js +37 -3
- package/Particles/baseParticleSystem.js.map +1 -1
- package/Particles/gpuParticleSystem.js +1 -14
- package/Particles/gpuParticleSystem.js.map +1 -1
- package/Particles/particle.js +2 -2
- package/Particles/particle.js.map +1 -1
- package/Particles/particleSystem.js +15 -13
- package/Particles/particleSystem.js.map +1 -1
- package/Particles/thinParticleSystem.js +3 -16
- package/Particles/thinParticleSystem.js.map +1 -1
- package/Physics/physicsHelper.js +18 -14
- package/Physics/physicsHelper.js.map +1 -1
- package/Physics/v1/Plugins/ammoJSPlugin.js +10 -8
- package/Physics/v1/Plugins/ammoJSPlugin.js.map +1 -1
- package/Physics/v1/Plugins/cannonJSPlugin.js +13 -8
- package/Physics/v1/Plugins/cannonJSPlugin.js.map +1 -1
- package/Physics/v1/Plugins/oimoJSPlugin.js +9 -8
- package/Physics/v1/Plugins/oimoJSPlugin.js.map +1 -1
- package/Physics/v1/physicsEngine.js +4 -4
- package/Physics/v1/physicsEngine.js.map +1 -1
- package/Physics/v1/physicsImpostor.js +10 -21
- package/Physics/v1/physicsImpostor.js.map +1 -1
- package/Physics/v2/Plugins/havokPlugin.js +12 -10
- package/Physics/v2/Plugins/havokPlugin.js.map +1 -1
- package/Physics/v2/ragdoll.js +4 -4
- package/Physics/v2/ragdoll.js.map +1 -1
- package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.js +3 -2
- package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.js.map +1 -1
- package/PostProcesses/RenderPipeline/postProcessRenderEffect.js +8 -6
- package/PostProcesses/RenderPipeline/postProcessRenderEffect.js.map +1 -1
- package/PostProcesses/depthOfFieldMergePostProcess.js +4 -3
- package/PostProcesses/depthOfFieldMergePostProcess.js.map +1 -1
- package/Rendering/GlobalIllumination/giRSMManager.js +6 -6
- package/Rendering/GlobalIllumination/giRSMManager.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsRenderPipeline.js +14 -14
- package/Rendering/IBLShadows/iblShadowsRenderPipeline.js.map +1 -1
- package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js +14 -12
- package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js.map +1 -1
- package/Rendering/iblCdfGenerator.js +4 -4
- package/Rendering/iblCdfGenerator.js.map +1 -1
- package/Rendering/objectRenderer.js +2 -2
- package/Rendering/objectRenderer.js.map +1 -1
- package/Rendering/reflectiveShadowMap.js +7 -5
- package/Rendering/reflectiveShadowMap.js.map +1 -1
- package/Sprites/spriteMap.js +2 -2
- package/Sprites/spriteMap.js.map +1 -1
- package/XR/features/WebXRAbstractFeature.js +2 -2
- package/XR/features/WebXRAbstractFeature.js.map +1 -1
- package/XR/features/WebXRAnchorSystem.js +4 -4
- package/XR/features/WebXRAnchorSystem.js.map +1 -1
- package/XR/features/WebXRBackgroundRemover.js +3 -1
- package/XR/features/WebXRBackgroundRemover.js.map +1 -1
- package/XR/features/WebXRControllerMovement.js +6 -3
- package/XR/features/WebXRControllerMovement.js.map +1 -1
- package/XR/features/WebXRControllerPhysics.js +12 -7
- package/XR/features/WebXRControllerPhysics.js.map +1 -1
- package/XR/features/WebXRControllerPointerSelection.js +12 -7
- package/XR/features/WebXRControllerPointerSelection.js.map +1 -1
- package/XR/features/WebXRControllerTeleportation.js +11 -7
- package/XR/features/WebXRControllerTeleportation.js.map +1 -1
- package/XR/features/WebXRDepthSensing.js +6 -6
- package/XR/features/WebXRDepthSensing.js.map +1 -1
- package/XR/features/WebXRHandTracking.js +60 -24
- package/XR/features/WebXRHandTracking.js.map +1 -1
- package/XR/features/WebXRHitTest.js +4 -4
- package/XR/features/WebXRHitTest.js.map +1 -1
- package/XR/features/WebXRImageTracking.js +2 -2
- package/XR/features/WebXRImageTracking.js.map +1 -1
- package/XR/features/WebXRLayers.js +2 -2
- package/XR/features/WebXRLayers.js.map +1 -1
- package/XR/features/WebXRNearInteraction.js +12 -7
- package/XR/features/WebXRNearInteraction.js.map +1 -1
- package/XR/features/WebXRRawCameraAccess.js +9 -4
- package/XR/features/WebXRRawCameraAccess.js.map +1 -1
- package/XR/features/WebXRSpaceWarp.js +2 -2
- package/XR/features/WebXRSpaceWarp.js.map +1 -1
- package/XR/motionController/webXRAbstractMotionController.js +19 -8
- package/XR/motionController/webXRAbstractMotionController.js.map +1 -1
- package/XR/motionController/webXRGenericMotionController.js +2 -2
- package/XR/motionController/webXRGenericMotionController.js.map +1 -1
- package/XR/motionController/webXRHTCViveMotionController.js +5 -4
- package/XR/motionController/webXRHTCViveMotionController.js.map +1 -1
- package/XR/motionController/webXRMicrosoftMixedRealityController.js +9 -6
- package/XR/motionController/webXRMicrosoftMixedRealityController.js.map +1 -1
- package/XR/motionController/webXRMotionControllerManager.js +4 -4
- package/XR/motionController/webXRMotionControllerManager.js.map +1 -1
- package/XR/motionController/webXROculusTouchMotionController.js +5 -4
- package/XR/motionController/webXROculusTouchMotionController.js.map +1 -1
- package/XR/motionController/webXRProfiledMotionController.js +15 -10
- package/XR/motionController/webXRProfiledMotionController.js.map +1 -1
- package/XR/webXRCamera.js +3 -2
- package/XR/webXRCamera.js.map +1 -1
- package/XR/webXREnterExitUI.js +5 -4
- package/XR/webXREnterExitUI.js.map +1 -1
- package/XR/webXRExperienceHelper.js +2 -2
- package/XR/webXRExperienceHelper.js.map +1 -1
- package/XR/webXRFeaturesManager.js +10 -7
- package/XR/webXRFeaturesManager.js.map +1 -1
- package/XR/webXRInput.js +8 -8
- package/XR/webXRInput.js.map +1 -1
- package/XR/webXRInputSource.js +4 -1
- package/XR/webXRInputSource.js.map +1 -1
- package/XR/webXRRenderTargetTextureProvider.js +3 -1
- package/XR/webXRRenderTargetTextureProvider.js.map +1 -1
- package/assetContainer.js +156 -135
- package/assetContainer.js.map +1 -1
- package/node.js +2 -2
- package/node.js.map +1 -1
- package/package.json +1 -1
- package/scene.js +18 -11
- package/scene.js.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebXRDepthSensing.js","sourceRoot":"","sources":["../../../../../dev/core/src/XR/features/WebXRDepthSensing.ts"],"names":[],"mappings":"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","sourcesContent":["import { RawTexture } from \"../../Materials/Textures/rawTexture\";\r\nimport { WebXRFeatureName, WebXRFeaturesManager } from \"../webXRFeaturesManager\";\r\nimport type { WebXRSessionManager } from \"../webXRSessionManager\";\r\nimport { WebXRAbstractFeature } from \"./WebXRAbstractFeature\";\r\nimport { Tools } from \"../../Misc/tools\";\r\nimport { Texture } from \"../../Materials/Textures/texture\";\r\nimport type { Observer } from \"../../Misc/observable\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { Constants } from \"../../Engines/constants\";\r\nimport { WebGLHardwareTexture } from \"../../Engines/WebGL/webGLHardwareTexture\";\r\nimport type { InternalTexture } from \"../../Materials/Textures/internalTexture\";\r\nimport type { ThinEngine } from \"../../Engines/thinEngine\";\r\nimport { MaterialPluginBase } from \"core/Materials/materialPluginBase\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport type { Material } from \"core/Materials/material\";\r\nimport { MaterialDefines } from \"core/Materials/materialDefines\";\r\nimport type { UniformBuffer } from \"core/Materials/uniformBuffer\";\r\nimport { PBRBaseMaterial } from \"core/Materials/PBR/pbrBaseMaterial\";\r\nimport { RegisterMaterialPlugin } from \"core/Materials/materialPluginManager\";\r\nimport type { Camera } from \"core/Cameras/camera\";\r\nimport { Matrix } from \"core/Maths/math.vector\";\r\nimport type { Engine } from \"core/Engines/engine\";\r\n\r\nexport type WebXRDepthUsage = \"cpu\" | \"gpu\";\r\nexport type WebXRDepthDataFormat = \"ushort\" | \"float\" | \"luminance-alpha\";\r\n\r\n/**\r\n * Options for Depth Sensing feature\r\n */\r\nexport interface IWebXRDepthSensingOptions {\r\n /**\r\n * The desired depth sensing usage for the session\r\n */\r\n usagePreference: WebXRDepthUsage[];\r\n /**\r\n * The desired depth sensing data format for the session\r\n */\r\n dataFormatPreference: WebXRDepthDataFormat[];\r\n\r\n /**\r\n * Depth sensing will be enabled on all materials per default, if the GPU variant is enabled.\r\n * If you just want to use the texture or the CPU variant instead set this to true.\r\n */\r\n disableDepthSensingOnMaterials?: boolean;\r\n\r\n /**\r\n * If set to true the occluded pixels will not be discarded but the pixel color will be changed based on the occlusion factor\r\n * Enabling this will lead to worse performance but slightly better outcome.\r\n * It is possible we will change this in the future to look even better.\r\n */\r\n useToleranceFactorForDepthSensing?: boolean;\r\n\r\n /**\r\n * If set to true the texture will be set to be used for visualization.\r\n * In this case it will probably NOT work correctly on the materials.\r\n * So be aware that, for the time being, you can only use one or the other.\r\n */\r\n prepareTextureForVisualization?: boolean;\r\n}\r\n\r\ntype GetDepthInMetersType = (x: number, y: number) => number;\r\n\r\nclass DepthSensingMaterialDefines extends MaterialDefines {\r\n /**\r\n * Is the feature enabled\r\n */\r\n DEPTH_SENSING = false;\r\n\r\n /**\r\n * Is the texture type provided as a texture array\r\n */\r\n DEPTH_SENSING_TEXTURE_ARRAY = false;\r\n\r\n /**\r\n * Is the texture type provided as Alpha-Luminance (unpacked differently on the shader)\r\n */\r\n DEPTH_SENSING_TEXTURE_AL = false;\r\n\r\n /**\r\n * Should the shader discard the pixel if the depth is less than the asset depth\r\n * Will lead to better performance. the other variant is to change the color based on a tolerance factor\r\n */\r\n DEPTH_SENSING_DISCARD = true;\r\n}\r\n\r\nlet isPluginEnabled = false;\r\nlet depthTexture: Nullable<RawTexture> = null;\r\nlet alphaLuminanceTexture = false;\r\nconst screenSize = { width: 512, height: 512 };\r\nconst shaderViewport = { x: 0, y: 0, width: 1, height: 1 };\r\nlet globalRawValueToMeters = 1;\r\nlet viewIndex = 0;\r\nlet enableDiscard = true;\r\nconst uvTransform = Matrix.Identity();\r\nconst managedMaterialPlugins: WebXRDepthSensingMaterialPlugin[] = [];\r\n\r\n/**\r\n * @internal\r\n */\r\nclass WebXRDepthSensingMaterialPlugin extends MaterialPluginBase {\r\n private _varColorName: string;\r\n private _isEnabled = false;\r\n\r\n /** @internal */\r\n protected _markAllDefinesAsDirty(): void {\r\n this._enable(this._isEnabled);\r\n this.markAllDefinesAsDirty();\r\n }\r\n\r\n /**\r\n * Gets whether the mesh debug plugin is enabled in the material.\r\n */\r\n public get isEnabled(): boolean {\r\n return this._isEnabled;\r\n }\r\n /**\r\n * Sets whether the mesh debug plugin is enabled in the material.\r\n * @param value enabled\r\n */\r\n public set isEnabled(value: boolean) {\r\n if (this._isEnabled === value) {\r\n return;\r\n }\r\n this._isEnabled = value;\r\n this._markAllDefinesAsDirty();\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that the plugin is compatible with a given shader language.\r\n * @param shaderLanguage The shader language to use.\r\n * @returns true if the plugin is compatible with the shader language\r\n */\r\n public override isCompatible(shaderLanguage: ShaderLanguage): boolean {\r\n switch (shaderLanguage) {\r\n case ShaderLanguage.GLSL:\r\n return true;\r\n default:\r\n // no webgpu for webxr yet, however - if this is not true the plugin fails to load.\r\n // webxr is currently only supported on webgl, and the plugin is disabled per default.\r\n return true;\r\n }\r\n }\r\n\r\n constructor(material: Material) {\r\n super(material, \"DepthSensing\", 222, new DepthSensingMaterialDefines());\r\n this._varColorName = material instanceof PBRBaseMaterial ? \"finalColor\" : \"color\";\r\n managedMaterialPlugins.push(this);\r\n }\r\n\r\n /**\r\n * Prepare the defines\r\n * @param defines the defines\r\n */\r\n public override prepareDefines(defines: DepthSensingMaterialDefines) {\r\n defines.DEPTH_SENSING = !!depthTexture && isPluginEnabled;\r\n defines.DEPTH_SENSING_TEXTURE_ARRAY = depthTexture?.is2DArray ?? false;\r\n defines.DEPTH_SENSING_TEXTURE_AL = alphaLuminanceTexture;\r\n defines.DEPTH_SENSING_DISCARD = enableDiscard;\r\n }\r\n\r\n public override getUniforms() {\r\n return {\r\n // first, define the UBO with the correct type and size.\r\n ubo: [\r\n { name: \"ds_invScreenSize\", size: 2, type: \"vec2\" },\r\n { name: \"ds_rawValueToMeters\", size: 1, type: \"float\" },\r\n { name: \"ds_viewIndex\", size: 1, type: \"float\" },\r\n { name: \"ds_shaderViewport\", size: 4, type: \"vec4\" },\r\n { name: \"ds_uvTransform\", size: 16, type: \"mat4\" },\r\n ],\r\n // now, on the fragment shader, add the uniform itself in case uniform buffers are not supported by the engine\r\n fragment: `#ifdef DEPTH_SENSING\r\n uniform vec2 ds_invScreenSize;\r\n uniform float ds_rawValueToMeters;\r\n uniform float ds_viewIndex;\r\n uniform vec4 ds_shaderViewport;\r\n uniform mat4 ds_uvTransform;\r\n #endif\r\n `,\r\n };\r\n }\r\n\r\n public override getSamplers(samplers: string[]): void {\r\n samplers.push(\"ds_depthSampler\");\r\n }\r\n\r\n public override bindForSubMesh(uniformBuffer: UniformBuffer) {\r\n if (isPluginEnabled && depthTexture) {\r\n uniformBuffer.updateFloat2(\"ds_invScreenSize\", 1 / screenSize.width, 1 / screenSize.height);\r\n uniformBuffer.updateFloat(\"ds_rawValueToMeters\", globalRawValueToMeters);\r\n uniformBuffer.updateFloat(\"ds_viewIndex\", viewIndex);\r\n uniformBuffer.updateFloat4(\"ds_shaderViewport\", shaderViewport.x, shaderViewport.y, shaderViewport.width, shaderViewport.height);\r\n uniformBuffer.setTexture(\"ds_depthSampler\", depthTexture);\r\n uniformBuffer.updateMatrix(\"ds_uvTransform\", uvTransform);\r\n }\r\n }\r\n\r\n public override getClassName() {\r\n return \"DepthSensingMaterialPlugin\";\r\n }\r\n\r\n public override getCustomCode(shaderType: string): Nullable<{ [pointName: string]: string }> {\r\n return shaderType === \"vertex\"\r\n ? {\r\n CUSTOM_VERTEX_MAIN_BEGIN: `\r\n #ifdef DEPTH_SENSING\r\n #ifdef MULTIVIEW\r\n ds_viewIndexMultiview = float(gl_ViewID_OVR);\r\n #endif\r\n #endif\r\n `,\r\n CUSTOM_VERTEX_DEFINITIONS: `\r\n #ifdef DEPTH_SENSING\r\n #ifdef MULTIVIEW\r\n varying float ds_viewIndexMultiview;\r\n #endif\r\n #endif\r\n `,\r\n }\r\n : {\r\n CUSTOM_FRAGMENT_DEFINITIONS: `\r\n #ifdef DEPTH_SENSING\r\n #ifdef DEPTH_SENSING_TEXTURE_ARRAY\r\n uniform highp sampler2DArray ds_depthSampler;\r\n #else\r\n uniform sampler2D ds_depthSampler;\r\n #endif\r\n #ifdef MULTIVIEW\r\n varying float ds_viewIndexMultiview;\r\n #endif\r\n #endif\r\n `,\r\n CUSTOM_FRAGMENT_MAIN_BEGIN: `\r\n#ifdef DEPTH_SENSING\r\n #ifdef MULTIVIEW\r\n float ds_viewIndexSet = ds_viewIndexMultiview;\r\n vec2 ds_compensation = vec2(0.0, 0.0);\r\n #else\r\n float ds_viewIndexSet = ds_viewIndex;\r\n vec2 ds_compensation = vec2(ds_viewIndexSet, 0.0);\r\n #endif\r\n vec2 ds_baseUv = gl_FragCoord.xy * ds_invScreenSize;\r\n #ifdef DEPTH_SENSING_TEXTURE_ARRAY\r\n vec2 ds_uv = ds_baseUv - ds_compensation;\r\n vec3 ds_depthUv = vec3((ds_uvTransform * vec4(ds_uv, 0.0, 1.0)).xy, ds_viewIndexSet);\r\n #else\r\n vec2 ds_depthUv = (ds_uvTransform * vec4(ds_baseUv.x, 1.0 - ds_baseUv.y, 0.0, 1.0)).xy;\r\n #endif\r\n #ifdef DEPTH_SENSING_TEXTURE_AL\r\n // from alpha-luminance - taken from the explainer\r\n vec2 ds_alphaLuminance = texture(ds_depthSampler, ds_depthUv).ra;\r\n float ds_cameraDepth = dot(ds_alphaLuminance, vec2(255.0, 256.0 * 255.0));\r\n #else\r\n float ds_cameraDepth = texture(ds_depthSampler, ds_depthUv).r;\r\n #endif\r\n\r\n ds_cameraDepth = ds_cameraDepth * ds_rawValueToMeters;\r\n\r\n float ds_assetDepth = gl_FragCoord.z;\r\n #ifdef DEPTH_SENSING_DISCARD\r\n if(ds_cameraDepth < ds_assetDepth) {\r\n discard;\r\n }\r\n #endif\r\n#endif \r\n `,\r\n CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR: `\r\n#ifdef DEPTH_SENSING\r\n #ifndef DEPTH_SENSING_DISCARD\r\n const float ds_depthTolerancePerM = 0.005;\r\n float ds_occlusion = clamp(1.0 - 0.5 * (ds_cameraDepth - ds_assetDepth) / (ds_depthTolerancePerM * ds_assetDepth) +\r\n 0.5, 0.0, 1.0);\r\n ${this._varColorName} *= (1.0 - ds_occlusion);\r\n #endif\r\n#endif \r\n `,\r\n };\r\n }\r\n\r\n public override dispose(_forceDisposeTextures?: boolean): void {\r\n const index = managedMaterialPlugins.indexOf(this);\r\n if (index !== -1) {\r\n managedMaterialPlugins.splice(index, 1);\r\n }\r\n super.dispose(_forceDisposeTextures);\r\n }\r\n}\r\n\r\n/**\r\n * WebXR Feature for WebXR Depth Sensing Module\r\n * @since 5.49.1\r\n */\r\nexport class WebXRDepthSensing extends WebXRAbstractFeature {\r\n private _width: Nullable<number> = null;\r\n private _height: Nullable<number> = null;\r\n private _rawValueToMeters: Nullable<number> = null;\r\n private _textureType: Nullable<string> = null;\r\n private _normDepthBufferFromNormView: Nullable<XRRigidTransform> = null;\r\n private _cachedDepthBuffer: Nullable<ArrayBuffer> = null;\r\n private _cachedWebGLTexture: Nullable<WebGLTexture> = null;\r\n private _cachedDepthImageTexture: Nullable<RawTexture> = null;\r\n private _onCameraObserver: Nullable<Observer<Camera>> = null;\r\n\r\n /**\r\n * Width of depth data. If depth data is not exist, returns null.\r\n */\r\n public get width(): Nullable<number> {\r\n return this._width;\r\n }\r\n\r\n /**\r\n * Height of depth data. If depth data is not exist, returns null.\r\n */\r\n public get height(): Nullable<number> {\r\n return this._height;\r\n }\r\n\r\n /**\r\n * Scale factor by which the raw depth values must be multiplied in order to get the depths in meters.\r\n */\r\n public get rawValueToMeters(): Nullable<number> {\r\n return this._rawValueToMeters;\r\n }\r\n\r\n /**\r\n * An XRRigidTransform that needs to be applied when indexing into the depth buffer.\r\n */\r\n public get normDepthBufferFromNormView(): Nullable<XRRigidTransform> {\r\n return this._normDepthBufferFromNormView;\r\n }\r\n\r\n /**\r\n * Describes which depth-sensing usage (\"cpu\" or \"gpu\") is used.\r\n */\r\n public get depthUsage(): WebXRDepthUsage {\r\n switch (this._xrSessionManager.session.depthUsage) {\r\n case \"cpu-optimized\":\r\n return \"cpu\";\r\n case \"gpu-optimized\":\r\n return \"gpu\";\r\n }\r\n }\r\n\r\n /**\r\n * Describes which depth sensing data format (\"ushort\" or \"float\") is used.\r\n */\r\n public get depthDataFormat(): WebXRDepthDataFormat {\r\n switch (this._xrSessionManager.session.depthDataFormat) {\r\n case \"luminance-alpha\":\r\n return \"ushort\";\r\n case \"float32\":\r\n return \"float\";\r\n case \"unsigned-short\":\r\n return \"ushort\";\r\n }\r\n }\r\n\r\n /**\r\n * Latest cached InternalTexture which containing depth buffer information.\r\n * This can be used when the depth usage is \"gpu\".\r\n * @deprecated This will be removed in the future. Use latestDepthImageTexture\r\n */\r\n public get latestInternalTexture(): Nullable<InternalTexture> {\r\n if (!this._cachedWebGLTexture) {\r\n return null;\r\n }\r\n\r\n return this._getInternalTextureFromDepthInfo();\r\n }\r\n\r\n /**\r\n * cached depth buffer\r\n */\r\n public get latestDepthBuffer(): Nullable<ArrayBufferView> {\r\n if (!this._cachedDepthBuffer) {\r\n return null;\r\n }\r\n\r\n return this.depthDataFormat === \"float\" ? new Float32Array(this._cachedDepthBuffer) : new Uint16Array(this._cachedDepthBuffer);\r\n }\r\n\r\n /**\r\n * Event that notify when `DepthInformation.getDepthInMeters` is available.\r\n * `getDepthInMeters` method needs active XRFrame (not available for cached XRFrame)\r\n */\r\n public onGetDepthInMetersAvailable: Observable<GetDepthInMetersType> = new Observable<GetDepthInMetersType>();\r\n\r\n /**\r\n * Latest cached Texture of depth image which is made from the depth buffer data.\r\n */\r\n public get latestDepthImageTexture(): Nullable<RawTexture> {\r\n return this._cachedDepthImageTexture;\r\n }\r\n\r\n /**\r\n * XRWebGLBinding which is used for acquiring WebGLDepthInformation\r\n */\r\n private _glBinding?: XRWebGLBinding;\r\n\r\n /**\r\n * The module's name\r\n */\r\n public static readonly Name = WebXRFeatureName.DEPTH_SENSING;\r\n\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 * Creates a new instance of the depth sensing feature\r\n * @param _xrSessionManager the WebXRSessionManager\r\n * @param options options for WebXR Depth Sensing Feature\r\n */\r\n constructor(\r\n _xrSessionManager: WebXRSessionManager,\r\n public readonly options: IWebXRDepthSensingOptions\r\n ) {\r\n super(_xrSessionManager);\r\n this.xrNativeFeatureName = \"depth-sensing\";\r\n\r\n // https://immersive-web.github.io/depth-sensing/\r\n Tools.Warn(\"depth-sensing is an experimental and unstable feature.\");\r\n enableDiscard = !options.useToleranceFactorForDepthSensing;\r\n }\r\n\r\n /**\r\n * attach this feature\r\n * Will usually be called by the features manager\r\n * @param force should attachment be forced (even when already attached)\r\n * @returns true if successful.\r\n */\r\n public override attach(force?: boolean | undefined): boolean {\r\n if (!super.attach(force)) {\r\n return false;\r\n }\r\n\r\n const isBothDepthUsageAndFormatNull = this._xrSessionManager.session.depthDataFormat == null || this._xrSessionManager.session.depthUsage == null;\r\n if (isBothDepthUsageAndFormatNull) {\r\n return false;\r\n }\r\n\r\n this._glBinding = new XRWebGLBinding(this._xrSessionManager.session, (this._xrSessionManager.scene.getEngine() as ThinEngine)._gl);\r\n\r\n isPluginEnabled = !this.options.disableDepthSensingOnMaterials;\r\n if (isPluginEnabled) {\r\n managedMaterialPlugins.forEach((plugin) => {\r\n plugin.isEnabled = true;\r\n });\r\n this._onCameraObserver = this._xrSessionManager.scene.onBeforeCameraRenderObservable.add((camera) => {\r\n if (!isPluginEnabled) {\r\n return;\r\n }\r\n // make sure this is a webxr camera\r\n if (camera.outputRenderTarget) {\r\n const viewport = camera.rigCameras.length > 0 ? camera.rigCameras[0].viewport : camera.viewport;\r\n screenSize.width = camera.outputRenderTarget.getRenderWidth() / (camera.rigParent ? camera.rigParent.rigCameras.length || 1 : 1);\r\n screenSize.height = camera.outputRenderTarget.getRenderHeight();\r\n shaderViewport.x = viewport.x;\r\n shaderViewport.y = viewport.y;\r\n shaderViewport.width = viewport.width;\r\n shaderViewport.height = viewport.height;\r\n\r\n // find the viewIndex\r\n if (camera.rigParent) {\r\n // should use the viewIndexes array!\r\n viewIndex = camera.isLeftCamera ? 0 : 1;\r\n }\r\n }\r\n });\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public override detach() {\r\n isPluginEnabled = false;\r\n depthTexture = null;\r\n this._cachedWebGLTexture = null;\r\n this._cachedDepthBuffer = null;\r\n managedMaterialPlugins.forEach((plugin) => {\r\n plugin.isEnabled = false;\r\n });\r\n if (this._onCameraObserver) {\r\n this._xrSessionManager.scene.onBeforeCameraRenderObservable.remove(this._onCameraObserver);\r\n }\r\n return super.detach();\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._cachedDepthImageTexture?.dispose();\r\n this.onGetDepthInMetersAvailable.clear();\r\n // cleanup\r\n if (this._onCameraObserver) {\r\n this._xrSessionManager.scene.onBeforeCameraRenderObservable.remove(this._onCameraObserver);\r\n }\r\n managedMaterialPlugins.forEach((plugin) => {\r\n plugin.dispose();\r\n });\r\n managedMaterialPlugins.length = 0;\r\n }\r\n\r\n protected _onXRFrame(_xrFrame: XRFrame): void {\r\n const referenceSPace = this._xrSessionManager.referenceSpace;\r\n const pose = _xrFrame.getViewerPose(referenceSPace);\r\n if (pose == null) {\r\n return;\r\n }\r\n for (const view of pose.views) {\r\n switch (this.depthUsage) {\r\n case \"cpu\":\r\n this._updateDepthInformationAndTextureCPUDepthUsage(_xrFrame, view, this.depthDataFormat);\r\n break;\r\n case \"gpu\":\r\n if (!this._glBinding) {\r\n break;\r\n }\r\n this._updateDepthInformationAndTextureWebGLDepthUsage(this._glBinding, view, this.depthDataFormat);\r\n break;\r\n default:\r\n Tools.Error(\"Unknown depth usage\");\r\n this.detach();\r\n break;\r\n }\r\n }\r\n }\r\n\r\n private _updateDepthInformationAndTextureCPUDepthUsage(frame: XRFrame, view: XRView, dataFormat: WebXRDepthDataFormat): void {\r\n const depthInfo = frame.getDepthInformation(view);\r\n if (depthInfo === null) {\r\n return;\r\n }\r\n\r\n const { data, width, height, rawValueToMeters, getDepthInMeters, normDepthBufferFromNormView } = depthInfo as XRCPUDepthInformation;\r\n\r\n this._width = width;\r\n this._height = height;\r\n this._rawValueToMeters = rawValueToMeters;\r\n this._cachedDepthBuffer = data;\r\n globalRawValueToMeters = rawValueToMeters;\r\n alphaLuminanceTexture = dataFormat === \"luminance-alpha\";\r\n uvTransform.fromArray(normDepthBufferFromNormView.matrix);\r\n\r\n // to avoid Illegal Invocation error, bind `this`\r\n this.onGetDepthInMetersAvailable.notifyObservers(getDepthInMeters.bind(depthInfo));\r\n\r\n if (!this._cachedDepthImageTexture) {\r\n this._cachedDepthImageTexture = RawTexture.CreateRTexture(\r\n null,\r\n width,\r\n height,\r\n this._xrSessionManager.scene,\r\n false,\r\n false,\r\n Texture.NEAREST_SAMPLINGMODE,\r\n Constants.TEXTURETYPE_FLOAT\r\n );\r\n depthTexture = this._cachedDepthImageTexture;\r\n }\r\n\r\n let float32Array: Float32Array | null = null;\r\n switch (dataFormat) {\r\n case \"ushort\":\r\n case \"luminance-alpha\":\r\n float32Array = Float32Array.from(new Uint16Array(data));\r\n\r\n break;\r\n case \"float\":\r\n float32Array = new Float32Array(data);\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n if (float32Array) {\r\n if (this.options.prepareTextureForVisualization) {\r\n float32Array = float32Array.map((val) => val * rawValueToMeters);\r\n }\r\n this._cachedDepthImageTexture.update(float32Array);\r\n }\r\n }\r\n\r\n private _updateDepthInformationAndTextureWebGLDepthUsage(webglBinding: XRWebGLBinding, view: XRView, dataFormat: WebXRDepthDataFormat): void {\r\n const depthInfo = webglBinding.getDepthInformation(view);\r\n if (depthInfo === null) {\r\n return;\r\n }\r\n const { texture, width, height, textureType, rawValueToMeters, normDepthBufferFromNormView } = depthInfo as XRWebGLDepthInformation;\r\n\r\n globalRawValueToMeters = rawValueToMeters;\r\n alphaLuminanceTexture = dataFormat === \"luminance-alpha\";\r\n uvTransform.fromArray(normDepthBufferFromNormView.matrix);\r\n\r\n if (this._cachedWebGLTexture) {\r\n return;\r\n }\r\n\r\n this._width = width;\r\n this._height = height;\r\n this._cachedWebGLTexture = texture;\r\n this._textureType = textureType;\r\n\r\n const scene = this._xrSessionManager.scene;\r\n const internalTexture = this._getInternalTextureFromDepthInfo();\r\n\r\n if (!this._cachedDepthImageTexture) {\r\n this._cachedDepthImageTexture = RawTexture.CreateRTexture(\r\n null,\r\n width,\r\n height,\r\n scene,\r\n false,\r\n true,\r\n Texture.NEAREST_SAMPLINGMODE,\r\n dataFormat === \"float\" ? Constants.TEXTURETYPE_FLOAT : Constants.TEXTURETYPE_UNSIGNED_BYTE\r\n );\r\n }\r\n\r\n this._cachedDepthImageTexture._texture = internalTexture;\r\n depthTexture = this._cachedDepthImageTexture;\r\n this._xrSessionManager.scene.markAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n\r\n /**\r\n * Extends the session init object if needed\r\n * @returns augmentation object for the xr session init object.\r\n */\r\n public getXRSessionInitExtension(): Promise<Partial<XRSessionInit>> {\r\n const isDepthUsageDeclared = this.options.usagePreference != null && this.options.usagePreference.length !== 0;\r\n const isDataFormatDeclared = this.options.dataFormatPreference != null && this.options.dataFormatPreference.length !== 0;\r\n\r\n return new Promise((resolve) => {\r\n if (isDepthUsageDeclared && isDataFormatDeclared) {\r\n const usages: XRDepthUsage[] = this.options.usagePreference.map((usage) => {\r\n switch (usage) {\r\n case \"cpu\":\r\n return \"cpu-optimized\";\r\n case \"gpu\":\r\n return \"gpu-optimized\";\r\n }\r\n });\r\n const dataFormats: XRDepthDataFormat[] = this.options.dataFormatPreference.map((format) => {\r\n switch (format) {\r\n case \"luminance-alpha\":\r\n return \"luminance-alpha\";\r\n case \"float\":\r\n return \"float32\";\r\n case \"ushort\":\r\n return \"unsigned-short\";\r\n }\r\n });\r\n\r\n resolve({\r\n depthSensing: {\r\n usagePreference: usages,\r\n dataFormatPreference: dataFormats,\r\n },\r\n });\r\n } else {\r\n resolve({});\r\n }\r\n });\r\n }\r\n\r\n private _getInternalTextureFromDepthInfo(): InternalTexture {\r\n const engine = this._xrSessionManager.scene.getEngine();\r\n const dataFormat = this.depthDataFormat;\r\n const textureType = this._textureType;\r\n if (!this._width || !this._height || !this._cachedWebGLTexture) {\r\n throw new Error(\"Depth information is not available\");\r\n }\r\n const internalTexture = (engine as Engine).wrapWebGLTexture(\r\n this._cachedWebGLTexture,\r\n false,\r\n Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n this._width || 256,\r\n this._height || 256\r\n );\r\n internalTexture.isCube = false;\r\n internalTexture.invertY = false;\r\n internalTexture._useSRGBBuffer = false;\r\n internalTexture.format = dataFormat === \"luminance-alpha\" ? Constants.TEXTUREFORMAT_LUMINANCE_ALPHA : Constants.TEXTUREFORMAT_RGBA;\r\n internalTexture.generateMipMaps = false;\r\n internalTexture.type =\r\n dataFormat === \"float\" ? Constants.TEXTURETYPE_FLOAT : dataFormat === \"ushort\" ? Constants.TEXTURETYPE_UNSIGNED_SHORT : Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n internalTexture._cachedWrapU = Constants.TEXTURE_WRAP_ADDRESSMODE;\r\n internalTexture._cachedWrapV = Constants.TEXTURE_WRAP_ADDRESSMODE;\r\n internalTexture._hardwareTexture = new WebGLHardwareTexture(this._cachedWebGLTexture, (engine as ThinEngine)._gl);\r\n internalTexture.is2DArray = textureType === \"texture-array\";\r\n\r\n return internalTexture;\r\n }\r\n}\r\n\r\nWebXRFeaturesManager.AddWebXRFeature(\r\n WebXRDepthSensing.Name,\r\n (xrSessionManager, options) => {\r\n return () => new WebXRDepthSensing(xrSessionManager, options);\r\n },\r\n WebXRDepthSensing.Version,\r\n false\r\n);\r\n\r\nRegisterMaterialPlugin(\"WebXRDepthSensingMaterialPlugin\", (material) => new WebXRDepthSensingMaterialPlugin(material));\r\n"]}
|
|
1
|
+
{"version":3,"file":"WebXRDepthSensing.js","sourceRoot":"","sources":["../../../../../dev/core/src/XR/features/WebXRDepthSensing.ts"],"names":[],"mappings":"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","sourcesContent":["import { RawTexture } from \"../../Materials/Textures/rawTexture\";\r\nimport { WebXRFeatureName, WebXRFeaturesManager } from \"../webXRFeaturesManager\";\r\nimport type { WebXRSessionManager } from \"../webXRSessionManager\";\r\nimport { WebXRAbstractFeature } from \"./WebXRAbstractFeature\";\r\nimport { Tools } from \"../../Misc/tools\";\r\nimport { Texture } from \"../../Materials/Textures/texture\";\r\nimport type { Observer } from \"../../Misc/observable\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { Constants } from \"../../Engines/constants\";\r\nimport { WebGLHardwareTexture } from \"../../Engines/WebGL/webGLHardwareTexture\";\r\nimport type { InternalTexture } from \"../../Materials/Textures/internalTexture\";\r\nimport type { ThinEngine } from \"../../Engines/thinEngine\";\r\nimport { MaterialPluginBase } from \"core/Materials/materialPluginBase\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport type { Material } from \"core/Materials/material\";\r\nimport { MaterialDefines } from \"core/Materials/materialDefines\";\r\nimport type { UniformBuffer } from \"core/Materials/uniformBuffer\";\r\nimport { PBRBaseMaterial } from \"core/Materials/PBR/pbrBaseMaterial\";\r\nimport { RegisterMaterialPlugin } from \"core/Materials/materialPluginManager\";\r\nimport type { Camera } from \"core/Cameras/camera\";\r\nimport { Matrix } from \"core/Maths/math.vector\";\r\nimport type { Engine } from \"core/Engines/engine\";\r\n\r\nexport type WebXRDepthUsage = \"cpu\" | \"gpu\";\r\nexport type WebXRDepthDataFormat = \"ushort\" | \"float\" | \"luminance-alpha\";\r\n\r\n/**\r\n * Options for Depth Sensing feature\r\n */\r\nexport interface IWebXRDepthSensingOptions {\r\n /**\r\n * The desired depth sensing usage for the session\r\n */\r\n usagePreference: WebXRDepthUsage[];\r\n /**\r\n * The desired depth sensing data format for the session\r\n */\r\n dataFormatPreference: WebXRDepthDataFormat[];\r\n\r\n /**\r\n * Depth sensing will be enabled on all materials per default, if the GPU variant is enabled.\r\n * If you just want to use the texture or the CPU variant instead set this to true.\r\n */\r\n disableDepthSensingOnMaterials?: boolean;\r\n\r\n /**\r\n * If set to true the occluded pixels will not be discarded but the pixel color will be changed based on the occlusion factor\r\n * Enabling this will lead to worse performance but slightly better outcome.\r\n * It is possible we will change this in the future to look even better.\r\n */\r\n useToleranceFactorForDepthSensing?: boolean;\r\n\r\n /**\r\n * If set to true the texture will be set to be used for visualization.\r\n * In this case it will probably NOT work correctly on the materials.\r\n * So be aware that, for the time being, you can only use one or the other.\r\n */\r\n prepareTextureForVisualization?: boolean;\r\n}\r\n\r\ntype GetDepthInMetersType = (x: number, y: number) => number;\r\n\r\nclass DepthSensingMaterialDefines extends MaterialDefines {\r\n /**\r\n * Is the feature enabled\r\n */\r\n DEPTH_SENSING = false;\r\n\r\n /**\r\n * Is the texture type provided as a texture array\r\n */\r\n DEPTH_SENSING_TEXTURE_ARRAY = false;\r\n\r\n /**\r\n * Is the texture type provided as Alpha-Luminance (unpacked differently on the shader)\r\n */\r\n DEPTH_SENSING_TEXTURE_AL = false;\r\n\r\n /**\r\n * Should the shader discard the pixel if the depth is less than the asset depth\r\n * Will lead to better performance. the other variant is to change the color based on a tolerance factor\r\n */\r\n DEPTH_SENSING_DISCARD = true;\r\n}\r\n\r\nlet isPluginEnabled = false;\r\nlet depthTexture: Nullable<RawTexture> = null;\r\nlet alphaLuminanceTexture = false;\r\nconst screenSize = { width: 512, height: 512 };\r\nconst shaderViewport = { x: 0, y: 0, width: 1, height: 1 };\r\nlet globalRawValueToMeters = 1;\r\nlet viewIndex = 0;\r\nlet enableDiscard = true;\r\nconst uvTransform = Matrix.Identity();\r\nconst managedMaterialPlugins: WebXRDepthSensingMaterialPlugin[] = [];\r\n\r\n/**\r\n * @internal\r\n */\r\nclass WebXRDepthSensingMaterialPlugin extends MaterialPluginBase {\r\n private _varColorName: string;\r\n private _isEnabled = false;\r\n\r\n /** @internal */\r\n protected _markAllDefinesAsDirty(): void {\r\n this._enable(this._isEnabled);\r\n this.markAllDefinesAsDirty();\r\n }\r\n\r\n /**\r\n * Gets whether the mesh debug plugin is enabled in the material.\r\n */\r\n public get isEnabled(): boolean {\r\n return this._isEnabled;\r\n }\r\n /**\r\n * Sets whether the mesh debug plugin is enabled in the material.\r\n * @param value enabled\r\n */\r\n public set isEnabled(value: boolean) {\r\n if (this._isEnabled === value) {\r\n return;\r\n }\r\n this._isEnabled = value;\r\n this._markAllDefinesAsDirty();\r\n }\r\n\r\n /**\r\n * Gets a boolean indicating that the plugin is compatible with a given shader language.\r\n * @param shaderLanguage The shader language to use.\r\n * @returns true if the plugin is compatible with the shader language\r\n */\r\n public override isCompatible(shaderLanguage: ShaderLanguage): boolean {\r\n switch (shaderLanguage) {\r\n case ShaderLanguage.GLSL:\r\n return true;\r\n default:\r\n // no webgpu for webxr yet, however - if this is not true the plugin fails to load.\r\n // webxr is currently only supported on webgl, and the plugin is disabled per default.\r\n return true;\r\n }\r\n }\r\n\r\n constructor(material: Material) {\r\n super(material, \"DepthSensing\", 222, new DepthSensingMaterialDefines());\r\n this._varColorName = material instanceof PBRBaseMaterial ? \"finalColor\" : \"color\";\r\n managedMaterialPlugins.push(this);\r\n }\r\n\r\n /**\r\n * Prepare the defines\r\n * @param defines the defines\r\n */\r\n public override prepareDefines(defines: DepthSensingMaterialDefines) {\r\n defines.DEPTH_SENSING = !!depthTexture && isPluginEnabled;\r\n defines.DEPTH_SENSING_TEXTURE_ARRAY = depthTexture?.is2DArray ?? false;\r\n defines.DEPTH_SENSING_TEXTURE_AL = alphaLuminanceTexture;\r\n defines.DEPTH_SENSING_DISCARD = enableDiscard;\r\n }\r\n\r\n public override getUniforms() {\r\n return {\r\n // first, define the UBO with the correct type and size.\r\n ubo: [\r\n { name: \"ds_invScreenSize\", size: 2, type: \"vec2\" },\r\n { name: \"ds_rawValueToMeters\", size: 1, type: \"float\" },\r\n { name: \"ds_viewIndex\", size: 1, type: \"float\" },\r\n { name: \"ds_shaderViewport\", size: 4, type: \"vec4\" },\r\n { name: \"ds_uvTransform\", size: 16, type: \"mat4\" },\r\n ],\r\n // now, on the fragment shader, add the uniform itself in case uniform buffers are not supported by the engine\r\n fragment: `#ifdef DEPTH_SENSING\r\n uniform vec2 ds_invScreenSize;\r\n uniform float ds_rawValueToMeters;\r\n uniform float ds_viewIndex;\r\n uniform vec4 ds_shaderViewport;\r\n uniform mat4 ds_uvTransform;\r\n #endif\r\n `,\r\n };\r\n }\r\n\r\n public override getSamplers(samplers: string[]): void {\r\n samplers.push(\"ds_depthSampler\");\r\n }\r\n\r\n public override bindForSubMesh(uniformBuffer: UniformBuffer) {\r\n if (isPluginEnabled && depthTexture) {\r\n uniformBuffer.updateFloat2(\"ds_invScreenSize\", 1 / screenSize.width, 1 / screenSize.height);\r\n uniformBuffer.updateFloat(\"ds_rawValueToMeters\", globalRawValueToMeters);\r\n uniformBuffer.updateFloat(\"ds_viewIndex\", viewIndex);\r\n uniformBuffer.updateFloat4(\"ds_shaderViewport\", shaderViewport.x, shaderViewport.y, shaderViewport.width, shaderViewport.height);\r\n uniformBuffer.setTexture(\"ds_depthSampler\", depthTexture);\r\n uniformBuffer.updateMatrix(\"ds_uvTransform\", uvTransform);\r\n }\r\n }\r\n\r\n public override getClassName() {\r\n return \"DepthSensingMaterialPlugin\";\r\n }\r\n\r\n public override getCustomCode(shaderType: string): Nullable<{ [pointName: string]: string }> {\r\n return shaderType === \"vertex\"\r\n ? {\r\n CUSTOM_VERTEX_MAIN_BEGIN: `\r\n #ifdef DEPTH_SENSING\r\n #ifdef MULTIVIEW\r\n ds_viewIndexMultiview = float(gl_ViewID_OVR);\r\n #endif\r\n #endif\r\n `,\r\n CUSTOM_VERTEX_DEFINITIONS: `\r\n #ifdef DEPTH_SENSING\r\n #ifdef MULTIVIEW\r\n varying float ds_viewIndexMultiview;\r\n #endif\r\n #endif\r\n `,\r\n }\r\n : {\r\n CUSTOM_FRAGMENT_DEFINITIONS: `\r\n #ifdef DEPTH_SENSING\r\n #ifdef DEPTH_SENSING_TEXTURE_ARRAY\r\n uniform highp sampler2DArray ds_depthSampler;\r\n #else\r\n uniform sampler2D ds_depthSampler;\r\n #endif\r\n #ifdef MULTIVIEW\r\n varying float ds_viewIndexMultiview;\r\n #endif\r\n #endif\r\n `,\r\n CUSTOM_FRAGMENT_MAIN_BEGIN: `\r\n#ifdef DEPTH_SENSING\r\n #ifdef MULTIVIEW\r\n float ds_viewIndexSet = ds_viewIndexMultiview;\r\n vec2 ds_compensation = vec2(0.0, 0.0);\r\n #else\r\n float ds_viewIndexSet = ds_viewIndex;\r\n vec2 ds_compensation = vec2(ds_viewIndexSet, 0.0);\r\n #endif\r\n vec2 ds_baseUv = gl_FragCoord.xy * ds_invScreenSize;\r\n #ifdef DEPTH_SENSING_TEXTURE_ARRAY\r\n vec2 ds_uv = ds_baseUv - ds_compensation;\r\n vec3 ds_depthUv = vec3((ds_uvTransform * vec4(ds_uv, 0.0, 1.0)).xy, ds_viewIndexSet);\r\n #else\r\n vec2 ds_depthUv = (ds_uvTransform * vec4(ds_baseUv.x, 1.0 - ds_baseUv.y, 0.0, 1.0)).xy;\r\n #endif\r\n #ifdef DEPTH_SENSING_TEXTURE_AL\r\n // from alpha-luminance - taken from the explainer\r\n vec2 ds_alphaLuminance = texture(ds_depthSampler, ds_depthUv).ra;\r\n float ds_cameraDepth = dot(ds_alphaLuminance, vec2(255.0, 256.0 * 255.0));\r\n #else\r\n float ds_cameraDepth = texture(ds_depthSampler, ds_depthUv).r;\r\n #endif\r\n\r\n ds_cameraDepth = ds_cameraDepth * ds_rawValueToMeters;\r\n\r\n float ds_assetDepth = gl_FragCoord.z;\r\n #ifdef DEPTH_SENSING_DISCARD\r\n if(ds_cameraDepth < ds_assetDepth) {\r\n discard;\r\n }\r\n #endif\r\n#endif \r\n `,\r\n CUSTOM_FRAGMENT_BEFORE_FRAGCOLOR: `\r\n#ifdef DEPTH_SENSING\r\n #ifndef DEPTH_SENSING_DISCARD\r\n const float ds_depthTolerancePerM = 0.005;\r\n float ds_occlusion = clamp(1.0 - 0.5 * (ds_cameraDepth - ds_assetDepth) / (ds_depthTolerancePerM * ds_assetDepth) +\r\n 0.5, 0.0, 1.0);\r\n ${this._varColorName} *= (1.0 - ds_occlusion);\r\n #endif\r\n#endif \r\n `,\r\n };\r\n }\r\n\r\n public override dispose(_forceDisposeTextures?: boolean): void {\r\n const index = managedMaterialPlugins.indexOf(this);\r\n if (index !== -1) {\r\n managedMaterialPlugins.splice(index, 1);\r\n }\r\n super.dispose(_forceDisposeTextures);\r\n }\r\n}\r\n\r\n/**\r\n * WebXR Feature for WebXR Depth Sensing Module\r\n * @since 5.49.1\r\n */\r\nexport class WebXRDepthSensing extends WebXRAbstractFeature {\r\n private _width: Nullable<number> = null;\r\n private _height: Nullable<number> = null;\r\n private _rawValueToMeters: Nullable<number> = null;\r\n private _textureType: Nullable<string> = null;\r\n private _normDepthBufferFromNormView: Nullable<XRRigidTransform> = null;\r\n private _cachedDepthBuffer: Nullable<ArrayBuffer> = null;\r\n private _cachedWebGLTexture: Nullable<WebGLTexture> = null;\r\n private _cachedDepthImageTexture: Nullable<RawTexture> = null;\r\n private _onCameraObserver: Nullable<Observer<Camera>> = null;\r\n\r\n /**\r\n * Width of depth data. If depth data is not exist, returns null.\r\n */\r\n public get width(): Nullable<number> {\r\n return this._width;\r\n }\r\n\r\n /**\r\n * Height of depth data. If depth data is not exist, returns null.\r\n */\r\n public get height(): Nullable<number> {\r\n return this._height;\r\n }\r\n\r\n /**\r\n * Scale factor by which the raw depth values must be multiplied in order to get the depths in meters.\r\n */\r\n public get rawValueToMeters(): Nullable<number> {\r\n return this._rawValueToMeters;\r\n }\r\n\r\n /**\r\n * An XRRigidTransform that needs to be applied when indexing into the depth buffer.\r\n */\r\n public get normDepthBufferFromNormView(): Nullable<XRRigidTransform> {\r\n return this._normDepthBufferFromNormView;\r\n }\r\n\r\n /**\r\n * Describes which depth-sensing usage (\"cpu\" or \"gpu\") is used.\r\n */\r\n public get depthUsage(): WebXRDepthUsage {\r\n switch (this._xrSessionManager.session.depthUsage) {\r\n case \"cpu-optimized\":\r\n return \"cpu\";\r\n case \"gpu-optimized\":\r\n return \"gpu\";\r\n }\r\n }\r\n\r\n /**\r\n * Describes which depth sensing data format (\"ushort\" or \"float\") is used.\r\n */\r\n public get depthDataFormat(): WebXRDepthDataFormat {\r\n switch (this._xrSessionManager.session.depthDataFormat) {\r\n case \"luminance-alpha\":\r\n return \"ushort\";\r\n case \"float32\":\r\n return \"float\";\r\n case \"unsigned-short\":\r\n return \"ushort\";\r\n }\r\n }\r\n\r\n /**\r\n * Latest cached InternalTexture which containing depth buffer information.\r\n * This can be used when the depth usage is \"gpu\".\r\n * @deprecated This will be removed in the future. Use latestDepthImageTexture\r\n */\r\n public get latestInternalTexture(): Nullable<InternalTexture> {\r\n if (!this._cachedWebGLTexture) {\r\n return null;\r\n }\r\n\r\n return this._getInternalTextureFromDepthInfo();\r\n }\r\n\r\n /**\r\n * cached depth buffer\r\n */\r\n public get latestDepthBuffer(): Nullable<ArrayBufferView> {\r\n if (!this._cachedDepthBuffer) {\r\n return null;\r\n }\r\n\r\n return this.depthDataFormat === \"float\" ? new Float32Array(this._cachedDepthBuffer) : new Uint16Array(this._cachedDepthBuffer);\r\n }\r\n\r\n /**\r\n * Event that notify when `DepthInformation.getDepthInMeters` is available.\r\n * `getDepthInMeters` method needs active XRFrame (not available for cached XRFrame)\r\n */\r\n public onGetDepthInMetersAvailable: Observable<GetDepthInMetersType> = new Observable<GetDepthInMetersType>();\r\n\r\n /**\r\n * Latest cached Texture of depth image which is made from the depth buffer data.\r\n */\r\n public get latestDepthImageTexture(): Nullable<RawTexture> {\r\n return this._cachedDepthImageTexture;\r\n }\r\n\r\n /**\r\n * XRWebGLBinding which is used for acquiring WebGLDepthInformation\r\n */\r\n private _glBinding?: XRWebGLBinding;\r\n\r\n /**\r\n * The module's name\r\n */\r\n public static readonly Name = WebXRFeatureName.DEPTH_SENSING;\r\n\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 * Creates a new instance of the depth sensing feature\r\n * @param _xrSessionManager the WebXRSessionManager\r\n * @param options options for WebXR Depth Sensing Feature\r\n */\r\n constructor(\r\n _xrSessionManager: WebXRSessionManager,\r\n public readonly options: IWebXRDepthSensingOptions\r\n ) {\r\n super(_xrSessionManager);\r\n this.xrNativeFeatureName = \"depth-sensing\";\r\n\r\n // https://immersive-web.github.io/depth-sensing/\r\n Tools.Warn(\"depth-sensing is an experimental and unstable feature.\");\r\n enableDiscard = !options.useToleranceFactorForDepthSensing;\r\n }\r\n\r\n /**\r\n * attach this feature\r\n * Will usually be called by the features manager\r\n * @param force should attachment be forced (even when already attached)\r\n * @returns true if successful.\r\n */\r\n public override attach(force?: boolean | undefined): boolean {\r\n if (!super.attach(force)) {\r\n return false;\r\n }\r\n\r\n const isBothDepthUsageAndFormatNull = this._xrSessionManager.session.depthDataFormat == null || this._xrSessionManager.session.depthUsage == null;\r\n if (isBothDepthUsageAndFormatNull) {\r\n return false;\r\n }\r\n\r\n this._glBinding = new XRWebGLBinding(this._xrSessionManager.session, (this._xrSessionManager.scene.getEngine() as ThinEngine)._gl);\r\n\r\n isPluginEnabled = !this.options.disableDepthSensingOnMaterials;\r\n if (isPluginEnabled) {\r\n for (const plugin of managedMaterialPlugins) {\r\n plugin.isEnabled = true;\r\n }\r\n this._onCameraObserver = this._xrSessionManager.scene.onBeforeCameraRenderObservable.add((camera) => {\r\n if (!isPluginEnabled) {\r\n return;\r\n }\r\n // make sure this is a webxr camera\r\n if (camera.outputRenderTarget) {\r\n const viewport = camera.rigCameras.length > 0 ? camera.rigCameras[0].viewport : camera.viewport;\r\n screenSize.width = camera.outputRenderTarget.getRenderWidth() / (camera.rigParent ? camera.rigParent.rigCameras.length || 1 : 1);\r\n screenSize.height = camera.outputRenderTarget.getRenderHeight();\r\n shaderViewport.x = viewport.x;\r\n shaderViewport.y = viewport.y;\r\n shaderViewport.width = viewport.width;\r\n shaderViewport.height = viewport.height;\r\n\r\n // find the viewIndex\r\n if (camera.rigParent) {\r\n // should use the viewIndexes array!\r\n viewIndex = camera.isLeftCamera ? 0 : 1;\r\n }\r\n }\r\n });\r\n }\r\n\r\n return true;\r\n }\r\n\r\n public override detach() {\r\n isPluginEnabled = false;\r\n depthTexture = null;\r\n this._cachedWebGLTexture = null;\r\n this._cachedDepthBuffer = null;\r\n for (const plugin of managedMaterialPlugins) {\r\n plugin.isEnabled = false;\r\n }\r\n if (this._onCameraObserver) {\r\n this._xrSessionManager.scene.onBeforeCameraRenderObservable.remove(this._onCameraObserver);\r\n }\r\n return super.detach();\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._cachedDepthImageTexture?.dispose();\r\n this.onGetDepthInMetersAvailable.clear();\r\n // cleanup\r\n if (this._onCameraObserver) {\r\n this._xrSessionManager.scene.onBeforeCameraRenderObservable.remove(this._onCameraObserver);\r\n }\r\n for (const plugin of managedMaterialPlugins) {\r\n plugin.dispose();\r\n }\r\n managedMaterialPlugins.length = 0;\r\n }\r\n\r\n protected _onXRFrame(_xrFrame: XRFrame): void {\r\n const referenceSPace = this._xrSessionManager.referenceSpace;\r\n const pose = _xrFrame.getViewerPose(referenceSPace);\r\n if (pose == null) {\r\n return;\r\n }\r\n for (const view of pose.views) {\r\n switch (this.depthUsage) {\r\n case \"cpu\":\r\n this._updateDepthInformationAndTextureCPUDepthUsage(_xrFrame, view, this.depthDataFormat);\r\n break;\r\n case \"gpu\":\r\n if (!this._glBinding) {\r\n break;\r\n }\r\n this._updateDepthInformationAndTextureWebGLDepthUsage(this._glBinding, view, this.depthDataFormat);\r\n break;\r\n default:\r\n Tools.Error(\"Unknown depth usage\");\r\n this.detach();\r\n break;\r\n }\r\n }\r\n }\r\n\r\n private _updateDepthInformationAndTextureCPUDepthUsage(frame: XRFrame, view: XRView, dataFormat: WebXRDepthDataFormat): void {\r\n const depthInfo = frame.getDepthInformation(view);\r\n if (depthInfo === null) {\r\n return;\r\n }\r\n\r\n const { data, width, height, rawValueToMeters, getDepthInMeters, normDepthBufferFromNormView } = depthInfo as XRCPUDepthInformation;\r\n\r\n this._width = width;\r\n this._height = height;\r\n this._rawValueToMeters = rawValueToMeters;\r\n this._cachedDepthBuffer = data;\r\n globalRawValueToMeters = rawValueToMeters;\r\n alphaLuminanceTexture = dataFormat === \"luminance-alpha\";\r\n uvTransform.fromArray(normDepthBufferFromNormView.matrix);\r\n\r\n // to avoid Illegal Invocation error, bind `this`\r\n this.onGetDepthInMetersAvailable.notifyObservers(getDepthInMeters.bind(depthInfo));\r\n\r\n if (!this._cachedDepthImageTexture) {\r\n this._cachedDepthImageTexture = RawTexture.CreateRTexture(\r\n null,\r\n width,\r\n height,\r\n this._xrSessionManager.scene,\r\n false,\r\n false,\r\n Texture.NEAREST_SAMPLINGMODE,\r\n Constants.TEXTURETYPE_FLOAT\r\n );\r\n depthTexture = this._cachedDepthImageTexture;\r\n }\r\n\r\n let float32Array: Float32Array | null = null;\r\n switch (dataFormat) {\r\n case \"ushort\":\r\n case \"luminance-alpha\":\r\n float32Array = Float32Array.from(new Uint16Array(data));\r\n\r\n break;\r\n case \"float\":\r\n float32Array = new Float32Array(data);\r\n break;\r\n\r\n default:\r\n break;\r\n }\r\n if (float32Array) {\r\n if (this.options.prepareTextureForVisualization) {\r\n float32Array = float32Array.map((val) => val * rawValueToMeters);\r\n }\r\n this._cachedDepthImageTexture.update(float32Array);\r\n }\r\n }\r\n\r\n private _updateDepthInformationAndTextureWebGLDepthUsage(webglBinding: XRWebGLBinding, view: XRView, dataFormat: WebXRDepthDataFormat): void {\r\n const depthInfo = webglBinding.getDepthInformation(view);\r\n if (depthInfo === null) {\r\n return;\r\n }\r\n const { texture, width, height, textureType, rawValueToMeters, normDepthBufferFromNormView } = depthInfo as XRWebGLDepthInformation;\r\n\r\n globalRawValueToMeters = rawValueToMeters;\r\n alphaLuminanceTexture = dataFormat === \"luminance-alpha\";\r\n uvTransform.fromArray(normDepthBufferFromNormView.matrix);\r\n\r\n if (this._cachedWebGLTexture) {\r\n return;\r\n }\r\n\r\n this._width = width;\r\n this._height = height;\r\n this._cachedWebGLTexture = texture;\r\n this._textureType = textureType;\r\n\r\n const scene = this._xrSessionManager.scene;\r\n const internalTexture = this._getInternalTextureFromDepthInfo();\r\n\r\n if (!this._cachedDepthImageTexture) {\r\n this._cachedDepthImageTexture = RawTexture.CreateRTexture(\r\n null,\r\n width,\r\n height,\r\n scene,\r\n false,\r\n true,\r\n Texture.NEAREST_SAMPLINGMODE,\r\n dataFormat === \"float\" ? Constants.TEXTURETYPE_FLOAT : Constants.TEXTURETYPE_UNSIGNED_BYTE\r\n );\r\n }\r\n\r\n this._cachedDepthImageTexture._texture = internalTexture;\r\n depthTexture = this._cachedDepthImageTexture;\r\n this._xrSessionManager.scene.markAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n\r\n /**\r\n * Extends the session init object if needed\r\n * @returns augmentation object for the xr session init object.\r\n */\r\n public getXRSessionInitExtension(): Promise<Partial<XRSessionInit>> {\r\n const isDepthUsageDeclared = this.options.usagePreference != null && this.options.usagePreference.length !== 0;\r\n const isDataFormatDeclared = this.options.dataFormatPreference != null && this.options.dataFormatPreference.length !== 0;\r\n\r\n return new Promise((resolve) => {\r\n if (isDepthUsageDeclared && isDataFormatDeclared) {\r\n const usages: XRDepthUsage[] = this.options.usagePreference.map((usage) => {\r\n switch (usage) {\r\n case \"cpu\":\r\n return \"cpu-optimized\";\r\n case \"gpu\":\r\n return \"gpu-optimized\";\r\n }\r\n });\r\n const dataFormats: XRDepthDataFormat[] = this.options.dataFormatPreference.map((format) => {\r\n switch (format) {\r\n case \"luminance-alpha\":\r\n return \"luminance-alpha\";\r\n case \"float\":\r\n return \"float32\";\r\n case \"ushort\":\r\n return \"unsigned-short\";\r\n }\r\n });\r\n\r\n resolve({\r\n depthSensing: {\r\n usagePreference: usages,\r\n dataFormatPreference: dataFormats,\r\n },\r\n });\r\n } else {\r\n resolve({});\r\n }\r\n });\r\n }\r\n\r\n private _getInternalTextureFromDepthInfo(): InternalTexture {\r\n const engine = this._xrSessionManager.scene.getEngine();\r\n const dataFormat = this.depthDataFormat;\r\n const textureType = this._textureType;\r\n if (!this._width || !this._height || !this._cachedWebGLTexture) {\r\n throw new Error(\"Depth information is not available\");\r\n }\r\n const internalTexture = (engine as Engine).wrapWebGLTexture(\r\n this._cachedWebGLTexture,\r\n false,\r\n Constants.TEXTURE_NEAREST_SAMPLINGMODE,\r\n this._width || 256,\r\n this._height || 256\r\n );\r\n internalTexture.isCube = false;\r\n internalTexture.invertY = false;\r\n internalTexture._useSRGBBuffer = false;\r\n internalTexture.format = dataFormat === \"luminance-alpha\" ? Constants.TEXTUREFORMAT_LUMINANCE_ALPHA : Constants.TEXTUREFORMAT_RGBA;\r\n internalTexture.generateMipMaps = false;\r\n internalTexture.type =\r\n dataFormat === \"float\" ? Constants.TEXTURETYPE_FLOAT : dataFormat === \"ushort\" ? Constants.TEXTURETYPE_UNSIGNED_SHORT : Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n internalTexture._cachedWrapU = Constants.TEXTURE_WRAP_ADDRESSMODE;\r\n internalTexture._cachedWrapV = Constants.TEXTURE_WRAP_ADDRESSMODE;\r\n internalTexture._hardwareTexture = new WebGLHardwareTexture(this._cachedWebGLTexture, (engine as ThinEngine)._gl);\r\n internalTexture.is2DArray = textureType === \"texture-array\";\r\n\r\n return internalTexture;\r\n }\r\n}\r\n\r\nWebXRFeaturesManager.AddWebXRFeature(\r\n WebXRDepthSensing.Name,\r\n (xrSessionManager, options) => {\r\n return () => new WebXRDepthSensing(xrSessionManager, options);\r\n },\r\n WebXRDepthSensing.Version,\r\n false\r\n);\r\n\r\nRegisterMaterialPlugin(\"WebXRDepthSensingMaterialPlugin\", (material) => new WebXRDepthSensingMaterialPlugin(material));\r\n"]}
|
|
@@ -266,18 +266,20 @@ export class WebXRHand {
|
|
|
266
266
|
this._handMesh = handMesh;
|
|
267
267
|
// Avoid any strange frustum culling. We will manually control visibility via attach and detach.
|
|
268
268
|
handMesh.alwaysSelectAsActiveMesh = true;
|
|
269
|
-
handMesh.getChildMeshes()
|
|
269
|
+
const children = handMesh.getChildMeshes();
|
|
270
|
+
for (const mesh of children) {
|
|
270
271
|
mesh.alwaysSelectAsActiveMesh = true;
|
|
271
|
-
}
|
|
272
|
+
}
|
|
272
273
|
// Link the bones in the hand mesh to the transform nodes that will be bound to the WebXR tracked joints.
|
|
273
274
|
if (this._handMesh.skeleton) {
|
|
274
275
|
const handMeshSkeleton = this._handMesh.skeleton;
|
|
275
|
-
handJointReferenceArray.
|
|
276
|
+
for (let jointIdx = 0; jointIdx < handJointReferenceArray.length; jointIdx++) {
|
|
277
|
+
const jointName = handJointReferenceArray[jointIdx];
|
|
276
278
|
const jointBoneIdx = handMeshSkeleton.getBoneIndexByName(rigMapping ? rigMapping[jointName] : jointName);
|
|
277
279
|
if (jointBoneIdx !== -1) {
|
|
278
280
|
handMeshSkeleton.bones[jointBoneIdx].linkTransformNode(this._jointTransforms[jointIdx]);
|
|
279
281
|
}
|
|
280
|
-
}
|
|
282
|
+
}
|
|
281
283
|
}
|
|
282
284
|
this.onHandMeshSetObservable.notifyObservers(this);
|
|
283
285
|
}
|
|
@@ -316,7 +318,7 @@ export class WebXRHand {
|
|
|
316
318
|
if (!trackingSuccessful) {
|
|
317
319
|
return;
|
|
318
320
|
}
|
|
319
|
-
handJointReferenceArray.
|
|
321
|
+
for (let jointIdx = 0; jointIdx < handJointReferenceArray.length; jointIdx++) {
|
|
320
322
|
const jointTransform = this._jointTransforms[jointIdx];
|
|
321
323
|
Matrix.FromArrayToRef(this._jointTransformMatrices, jointIdx * 16, this._tempJointMatrix);
|
|
322
324
|
this._tempJointMatrix.decompose(undefined, jointTransform.rotationQuaternion, jointTransform.position);
|
|
@@ -338,7 +340,7 @@ export class WebXRHand {
|
|
|
338
340
|
jointTransform.rotationQuaternion.w *= -1;
|
|
339
341
|
}
|
|
340
342
|
}
|
|
341
|
-
}
|
|
343
|
+
}
|
|
342
344
|
if (this._handMesh) {
|
|
343
345
|
this._handMesh.isVisible = true;
|
|
344
346
|
}
|
|
@@ -357,7 +359,9 @@ export class WebXRHand {
|
|
|
357
359
|
this._handMesh.isVisible = false;
|
|
358
360
|
}
|
|
359
361
|
}
|
|
360
|
-
|
|
362
|
+
for (const transform of this._jointTransforms) {
|
|
363
|
+
transform.dispose();
|
|
364
|
+
}
|
|
361
365
|
this._jointTransforms.length = 0;
|
|
362
366
|
this.onHandMeshSetObservable.clear();
|
|
363
367
|
}
|
|
@@ -445,7 +449,8 @@ export class WebXRHandTracking extends WebXRAbstractFeature {
|
|
|
445
449
|
handNodes.fingerColor.value = handColors.fingerColor;
|
|
446
450
|
handNodes.tipFresnel.value = handColors.tipFresnel;
|
|
447
451
|
const isMultiview = xrSessionManager._getBaseLayerWrapper()?.isMultiview;
|
|
448
|
-
["left", "right"]
|
|
452
|
+
const hd = ["left", "right"];
|
|
453
|
+
for (const handedness of hd) {
|
|
449
454
|
const handGLB = handedness == "left" ? WebXRHandTracking._LeftHandGLB : WebXRHandTracking._RightHandGLB;
|
|
450
455
|
if (!handGLB) {
|
|
451
456
|
// this should never happen!
|
|
@@ -463,7 +468,7 @@ export class WebXRHandTracking extends WebXRAbstractFeature {
|
|
|
463
468
|
if (!handsDefined && !scene.useRightHandedSystem) {
|
|
464
469
|
handGLB.meshes[1].rotate(Axis.Y, Math.PI);
|
|
465
470
|
}
|
|
466
|
-
}
|
|
471
|
+
}
|
|
467
472
|
handShader.dispose();
|
|
468
473
|
resolve({ left: riggedMeshes.left, right: riggedMeshes.right });
|
|
469
474
|
});
|
|
@@ -586,16 +591,18 @@ export class WebXRHandTracking extends WebXRAbstractFeature {
|
|
|
586
591
|
options.handMeshes = options.handMeshes || {};
|
|
587
592
|
const leftRigMapping = {};
|
|
588
593
|
const rightRigMapping = {};
|
|
589
|
-
[
|
|
594
|
+
const rigMappingTuples = [
|
|
590
595
|
[anyJointMeshOptions.rigMapping.left, leftRigMapping],
|
|
591
596
|
[anyJointMeshOptions.rigMapping.right, rightRigMapping],
|
|
592
|
-
]
|
|
597
|
+
];
|
|
598
|
+
for (const rigMappingTuple of rigMappingTuples) {
|
|
593
599
|
const legacyRigMapping = rigMappingTuple[0];
|
|
594
600
|
const rigMapping = rigMappingTuple[1];
|
|
595
|
-
legacyRigMapping.
|
|
601
|
+
for (let index = 0; index < legacyRigMapping.length; index++) {
|
|
602
|
+
const modelJointName = legacyRigMapping[index];
|
|
596
603
|
rigMapping[handJointReferenceArray[index]] = modelJointName;
|
|
597
|
-
}
|
|
598
|
-
}
|
|
604
|
+
}
|
|
605
|
+
}
|
|
599
606
|
options.handMeshes.customRigMappings = {
|
|
600
607
|
left: leftRigMapping,
|
|
601
608
|
right: rightRigMapping,
|
|
@@ -641,7 +648,9 @@ export class WebXRHandTracking extends WebXRAbstractFeature {
|
|
|
641
648
|
}
|
|
642
649
|
});
|
|
643
650
|
}
|
|
644
|
-
this.options.xrInput.controllers
|
|
651
|
+
for (const controller of this.options.xrInput.controllers) {
|
|
652
|
+
this._attachHand(controller);
|
|
653
|
+
}
|
|
645
654
|
this._addNewAttachObserver(this.options.xrInput.onControllerAddedObservable, this._attachHand);
|
|
646
655
|
this._addNewAttachObserver(this.options.xrInput.onControllerRemovedObservable, this._detachHand);
|
|
647
656
|
return true;
|
|
@@ -672,11 +681,18 @@ export class WebXRHandTracking extends WebXRAbstractFeature {
|
|
|
672
681
|
if (!super.detach()) {
|
|
673
682
|
return false;
|
|
674
683
|
}
|
|
675
|
-
Object.keys(this._attachedHands)
|
|
684
|
+
const keys = Object.keys(this._attachedHands);
|
|
685
|
+
for (const uniqueId of keys) {
|
|
686
|
+
this._detachHandById(uniqueId, this.options.handMeshes?.disposeOnSessionEnd);
|
|
687
|
+
}
|
|
676
688
|
if (this.options.handMeshes?.disposeOnSessionEnd) {
|
|
677
689
|
if (this._handResources.jointMeshes) {
|
|
678
|
-
this._handResources.jointMeshes.left
|
|
679
|
-
|
|
690
|
+
for (const trackedMesh of this._handResources.jointMeshes.left) {
|
|
691
|
+
trackedMesh.dispose();
|
|
692
|
+
}
|
|
693
|
+
for (const trackedMesh of this._handResources.jointMeshes.right) {
|
|
694
|
+
trackedMesh.dispose();
|
|
695
|
+
}
|
|
680
696
|
this._handResources.jointMeshes = null;
|
|
681
697
|
}
|
|
682
698
|
if (this._handResources.handMeshes) {
|
|
@@ -684,8 +700,16 @@ export class WebXRHandTracking extends WebXRAbstractFeature {
|
|
|
684
700
|
this._handResources.handMeshes.right.dispose();
|
|
685
701
|
this._handResources.handMeshes = null;
|
|
686
702
|
}
|
|
687
|
-
WebXRHandTracking._RightHandGLB
|
|
688
|
-
|
|
703
|
+
if (WebXRHandTracking._RightHandGLB) {
|
|
704
|
+
for (const mesh of WebXRHandTracking._RightHandGLB.meshes) {
|
|
705
|
+
mesh.dispose();
|
|
706
|
+
}
|
|
707
|
+
}
|
|
708
|
+
if (WebXRHandTracking._LeftHandGLB) {
|
|
709
|
+
for (const mesh of WebXRHandTracking._LeftHandGLB.meshes) {
|
|
710
|
+
mesh.dispose();
|
|
711
|
+
}
|
|
712
|
+
}
|
|
689
713
|
WebXRHandTracking._RightHandGLB = null;
|
|
690
714
|
WebXRHandTracking._LeftHandGLB = null;
|
|
691
715
|
this._originalMesh?.dispose();
|
|
@@ -709,14 +733,26 @@ export class WebXRHandTracking extends WebXRAbstractFeature {
|
|
|
709
733
|
this._handResources.handMeshes.left.dispose();
|
|
710
734
|
this._handResources.handMeshes.right.dispose();
|
|
711
735
|
// remove the cached meshes
|
|
712
|
-
WebXRHandTracking._RightHandGLB
|
|
713
|
-
|
|
736
|
+
if (WebXRHandTracking._RightHandGLB) {
|
|
737
|
+
for (const mesh of WebXRHandTracking._RightHandGLB.meshes) {
|
|
738
|
+
mesh.dispose();
|
|
739
|
+
}
|
|
740
|
+
}
|
|
741
|
+
if (WebXRHandTracking._LeftHandGLB) {
|
|
742
|
+
for (const mesh of WebXRHandTracking._LeftHandGLB.meshes) {
|
|
743
|
+
mesh.dispose();
|
|
744
|
+
}
|
|
745
|
+
}
|
|
714
746
|
WebXRHandTracking._RightHandGLB = null;
|
|
715
747
|
WebXRHandTracking._LeftHandGLB = null;
|
|
716
748
|
}
|
|
717
749
|
if (this._handResources.jointMeshes) {
|
|
718
|
-
this._handResources.jointMeshes.left
|
|
719
|
-
|
|
750
|
+
for (const trackedMesh of this._handResources.jointMeshes.left) {
|
|
751
|
+
trackedMesh.dispose();
|
|
752
|
+
}
|
|
753
|
+
for (const trackedMesh of this._handResources.jointMeshes.right) {
|
|
754
|
+
trackedMesh.dispose();
|
|
755
|
+
}
|
|
720
756
|
}
|
|
721
757
|
}
|
|
722
758
|
}
|