@onerjs/core 8.54.4 → 8.54.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Engines/WebGPU/Extensions/engine.cubeTexture.pure.js +1 -1
- package/Engines/WebGPU/Extensions/engine.cubeTexture.pure.js.map +1 -1
- package/Engines/WebGPU/Extensions/engine.rawTexture.pure.js +2 -2
- package/Engines/WebGPU/Extensions/engine.rawTexture.pure.js.map +1 -1
- package/Engines/WebGPU/webgpuCacheRenderPipeline.d.ts +1 -0
- package/Engines/WebGPU/webgpuCacheRenderPipeline.js +18 -4
- package/Engines/WebGPU/webgpuCacheRenderPipeline.js.map +1 -1
- package/Engines/WebGPU/webgpuCacheTextureView.d.ts +13 -0
- package/Engines/WebGPU/webgpuCacheTextureView.js +32 -0
- package/Engines/WebGPU/webgpuCacheTextureView.js.map +1 -0
- package/Engines/WebGPU/webgpuRenderTargetWrapper.d.ts +10 -0
- package/Engines/WebGPU/webgpuRenderTargetWrapper.js +10 -0
- package/Engines/WebGPU/webgpuRenderTargetWrapper.js.map +1 -1
- package/Engines/WebGPU/webgpuShaderProcessorsWGSL.pure.js +57 -4
- package/Engines/WebGPU/webgpuShaderProcessorsWGSL.pure.js.map +1 -1
- package/Engines/WebGPU/webgpuTextureManager.d.ts +1 -1
- package/Engines/WebGPU/webgpuTextureManager.js +4 -2
- package/Engines/WebGPU/webgpuTextureManager.js.map +1 -1
- package/Engines/abstractEngine.pure.js +2 -2
- package/Engines/abstractEngine.pure.js.map +1 -1
- package/Engines/thinNativeEngine.pure.d.ts +5 -0
- package/Engines/thinNativeEngine.pure.js +29 -6
- package/Engines/thinNativeEngine.pure.js.map +1 -1
- package/Engines/webgpuEngine.pure.d.ts +1 -0
- package/Engines/webgpuEngine.pure.js +21 -8
- package/Engines/webgpuEngine.pure.js.map +1 -1
- package/FlowGraph/Blocks/Data/Math/flowGraphMathBlocks.pure.d.ts +95 -1
- package/FlowGraph/Blocks/Data/Math/flowGraphMathBlocks.pure.js +169 -4
- package/FlowGraph/Blocks/Data/Math/flowGraphMathBlocks.pure.js.map +1 -1
- package/FlowGraph/Blocks/Data/Math/flowGraphMathCombineExtractBlocks.pure.d.ts +21 -6
- package/FlowGraph/Blocks/Data/Math/flowGraphMathCombineExtractBlocks.pure.js +28 -26
- package/FlowGraph/Blocks/Data/Math/flowGraphMathCombineExtractBlocks.pure.js.map +1 -1
- package/FlowGraph/Blocks/Data/Math/flowGraphMatrixMathBlocks.pure.d.ts +30 -2
- package/FlowGraph/Blocks/Data/Math/flowGraphMatrixMathBlocks.pure.js +111 -29
- package/FlowGraph/Blocks/Data/Math/flowGraphMatrixMathBlocks.pure.js.map +1 -1
- package/FlowGraph/Blocks/Data/Math/flowGraphVectorMathBlocks.pure.d.ts +56 -2
- package/FlowGraph/Blocks/Data/Math/flowGraphVectorMathBlocks.pure.js +99 -14
- package/FlowGraph/Blocks/Data/Math/flowGraphVectorMathBlocks.pure.js.map +1 -1
- package/FlowGraph/Blocks/Data/Transformers/flowGraphJsonPointerParserBlock.pure.js +10 -2
- package/FlowGraph/Blocks/Data/Transformers/flowGraphJsonPointerParserBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Data/Utils/flowGraphArrayIndexBlock.pure.js +21 -1
- package/FlowGraph/Blocks/Data/Utils/flowGraphArrayIndexBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Data/flowGraphCachedOperationBlock.d.ts +18 -0
- package/FlowGraph/Blocks/Data/flowGraphCachedOperationBlock.js +29 -2
- package/FlowGraph/Blocks/Data/flowGraphCachedOperationBlock.js.map +1 -1
- package/FlowGraph/Blocks/Event/flowGraphReceiveCustomEventBlock.pure.d.ts +15 -0
- package/FlowGraph/Blocks/Event/flowGraphReceiveCustomEventBlock.pure.js +44 -7
- package/FlowGraph/Blocks/Event/flowGraphReceiveCustomEventBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Event/flowGraphSceneReadyEventBlock.pure.d.ts +9 -0
- package/FlowGraph/Blocks/Event/flowGraphSceneReadyEventBlock.pure.js +9 -1
- package/FlowGraph/Blocks/Event/flowGraphSceneReadyEventBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Event/flowGraphSceneTickEventBlock.pure.d.ts +7 -0
- package/FlowGraph/Blocks/Event/flowGraphSceneTickEventBlock.pure.js +8 -1
- package/FlowGraph/Blocks/Event/flowGraphSceneTickEventBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Event/flowGraphStopEventPropagationBlock.d.ts +5 -0
- package/FlowGraph/Blocks/Event/flowGraphStopEventPropagationBlock.js +8 -0
- package/FlowGraph/Blocks/Event/flowGraphStopEventPropagationBlock.js.map +1 -0
- package/FlowGraph/Blocks/Event/flowGraphStopEventPropagationBlock.pure.d.ts +37 -0
- package/FlowGraph/Blocks/Event/flowGraphStopEventPropagationBlock.pure.js +44 -0
- package/FlowGraph/Blocks/Event/flowGraphStopEventPropagationBlock.pure.js.map +1 -0
- package/FlowGraph/Blocks/Event/index.d.ts +1 -0
- package/FlowGraph/Blocks/Event/index.js +1 -0
- package/FlowGraph/Blocks/Event/index.js.map +1 -1
- package/FlowGraph/Blocks/Event/pure.d.ts +1 -0
- package/FlowGraph/Blocks/Event/pure.js +1 -0
- package/FlowGraph/Blocks/Event/pure.js.map +1 -1
- package/FlowGraph/Blocks/Execution/Animation/flowGraphBezierCurveEasingBlock.pure.d.ts +4 -1
- package/FlowGraph/Blocks/Execution/Animation/flowGraphBezierCurveEasingBlock.pure.js +67 -2
- package/FlowGraph/Blocks/Execution/Animation/flowGraphBezierCurveEasingBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Execution/Animation/flowGraphPlayAnimationBlock.pure.d.ts +13 -0
- package/FlowGraph/Blocks/Execution/Animation/flowGraphPlayAnimationBlock.pure.js +102 -7
- package/FlowGraph/Blocks/Execution/Animation/flowGraphPlayAnimationBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Execution/Animation/flowGraphStopAnimationBlock.pure.js +5 -1
- package/FlowGraph/Blocks/Execution/Animation/flowGraphStopAnimationBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphCancelDelayBlock.pure.js +5 -1
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphCancelDelayBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphForLoopBlock.pure.d.ts +11 -2
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphForLoopBlock.pure.js +21 -3
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphForLoopBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphSetDelayBlock.pure.js +25 -4
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphSetDelayBlock.pure.js.map +1 -1
- package/FlowGraph/Blocks/flowGraphBlockFactory.js +18 -0
- package/FlowGraph/Blocks/flowGraphBlockFactory.js.map +1 -1
- package/FlowGraph/Blocks/flowGraphBlockNames.d.ts +9 -0
- package/FlowGraph/Blocks/flowGraphBlockNames.js +9 -0
- package/FlowGraph/Blocks/flowGraphBlockNames.js.map +1 -1
- package/FlowGraph/CustomTypes/flowGraphMatrix.d.ts +17 -3
- package/FlowGraph/CustomTypes/flowGraphMatrix.js +27 -21
- package/FlowGraph/CustomTypes/flowGraphMatrix.js.map +1 -1
- package/FlowGraph/flowGraphContext.d.ts +23 -0
- package/FlowGraph/flowGraphContext.js +29 -0
- package/FlowGraph/flowGraphContext.js.map +1 -1
- package/FlowGraph/flowGraphCoordinator.d.ts +58 -1
- package/FlowGraph/flowGraphCoordinator.js +72 -0
- package/FlowGraph/flowGraphCoordinator.js.map +1 -1
- package/FlowGraph/flowGraphDelayRegistry.d.ts +31 -0
- package/FlowGraph/flowGraphDelayRegistry.js +50 -0
- package/FlowGraph/flowGraphDelayRegistry.js.map +1 -0
- package/FlowGraph/flowGraphHostResolver.d.ts +69 -0
- package/FlowGraph/flowGraphHostResolver.js +25 -0
- package/FlowGraph/flowGraphHostResolver.js.map +1 -0
- package/FlowGraph/flowGraphMath.d.ts +48 -1
- package/FlowGraph/flowGraphMath.js +169 -4
- package/FlowGraph/flowGraphMath.js.map +1 -1
- package/FlowGraph/flowGraphPathConverterComponent.d.ts +14 -3
- package/FlowGraph/flowGraphPathConverterComponent.js +110 -18
- package/FlowGraph/flowGraphPathConverterComponent.js.map +1 -1
- package/FlowGraph/flowGraphSignalConnection.pure.js +7 -1
- package/FlowGraph/flowGraphSignalConnection.pure.js.map +1 -1
- package/FlowGraph/index.d.ts +2 -0
- package/FlowGraph/index.js +2 -0
- package/FlowGraph/index.js.map +1 -1
- package/FlowGraph/pure.d.ts +2 -0
- package/FlowGraph/pure.js +2 -0
- package/FlowGraph/pure.js.map +1 -1
- package/Maths/math.vector.pure.d.ts +10 -0
- package/Maths/math.vector.pure.js +13 -0
- package/Maths/math.vector.pure.js.map +1 -1
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.d.ts +216 -1
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.js +714 -67
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.js.map +1 -1
- package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.d.ts +81 -4
- package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js +466 -52
- package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js.map +1 -1
- package/Meshes/GaussianSplatting/gaussianSplattingPartProxyMesh.pure.d.ts +19 -0
- package/Meshes/GaussianSplatting/gaussianSplattingPartProxyMesh.pure.js +24 -0
- package/Meshes/GaussianSplatting/gaussianSplattingPartProxyMesh.pure.js.map +1 -1
- package/Meshes/GaussianSplatting/gaussianSplattingSortWorker.js +31 -6
- package/Meshes/GaussianSplatting/gaussianSplattingSortWorker.js.map +1 -1
- package/Meshes/GreasedLine/greasedLineRibbonMesh.pure.js +5 -1
- package/Meshes/GreasedLine/greasedLineRibbonMesh.pure.js.map +1 -1
- package/Misc/greasedLineTools.js +1 -1
- package/Misc/greasedLineTools.js.map +1 -1
- package/Misc/tools.pure.js +14 -2
- package/Misc/tools.pure.js.map +1 -1
- package/Particles/gpuParticleSystem.pure.d.ts +66 -1
- package/Particles/gpuParticleSystem.pure.js +189 -49
- package/Particles/gpuParticleSystem.pure.js.map +1 -1
- package/Physics/v2/characterController.js +69 -17
- package/Physics/v2/characterController.js.map +1 -1
- package/XR/features/Layers/WebXRWebGPUCompositionLayer.d.ts +3 -9
- package/XR/features/Layers/WebXRWebGPUCompositionLayer.js +4 -11
- package/XR/features/Layers/WebXRWebGPUCompositionLayer.js.map +1 -1
- package/XR/features/WebXRAbstractFeature.d.ts +9 -0
- package/XR/features/WebXRAbstractFeature.js +16 -0
- package/XR/features/WebXRAbstractFeature.js.map +1 -1
- package/XR/features/WebXRDepthSensing.pure.d.ts +7 -0
- package/XR/features/WebXRDepthSensing.pure.js +350 -39
- package/XR/features/WebXRDepthSensing.pure.js.map +1 -1
- package/XR/features/WebXRImageTracking.pure.js.map +1 -1
- package/XR/features/WebXRLayers.pure.d.ts +6 -5
- package/XR/features/WebXRLayers.pure.js +65 -8
- package/XR/features/WebXRLayers.pure.js.map +1 -1
- package/XR/features/WebXRRawCameraAccess.pure.js +9 -2
- package/XR/features/WebXRRawCameraAccess.pure.js.map +1 -1
- package/XR/features/WebXRSpaceWarp.pure.d.ts +0 -1
- package/XR/features/WebXRSpaceWarp.pure.js +13 -4
- package/XR/features/WebXRSpaceWarp.pure.js.map +1 -1
- package/XR/features/WebXRWalkingLocomotion.pure.js.map +1 -1
- package/XR/webXRCamera.js +27 -0
- package/XR/webXRCamera.js.map +1 -1
- package/XR/webXRFeatureWarningRegistry.d.ts +14 -0
- package/XR/webXRFeatureWarningRegistry.js +19 -0
- package/XR/webXRFeatureWarningRegistry.js.map +1 -0
- package/XR/webXRFeaturesManager.d.ts +5 -0
- package/XR/webXRFeaturesManager.js +23 -4
- package/XR/webXRFeaturesManager.js.map +1 -1
- package/XR/webXRGraphicsBinding.d.ts +17 -10
- package/XR/webXRGraphicsBinding.js +8 -5
- package/XR/webXRGraphicsBinding.js.map +1 -1
- package/XR/webXRSessionManager.d.ts +3 -5
- package/XR/webXRSessionManager.js +1 -3
- package/XR/webXRSessionManager.js.map +1 -1
- package/XR/webXRWebGPURenderTargetTextureProvider.d.ts +21 -5
- package/XR/webXRWebGPURenderTargetTextureProvider.js +38 -10
- package/XR/webXRWebGPURenderTargetTextureProvider.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebXRDepthSensing.pure.js","sourceRoot":"","sources":["../../../../../dev/core/src/XR/features/WebXRDepthSensing.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/** This file must only contain pure code and pure imports */\r\n\r\nimport { RawTexture } from \"../../Materials/Textures/rawTexture\";\r\nimport { WebXRFeatureName, WebXRFeaturesManager } from \"../webXRFeaturesManager\";\r\nimport { type WebXRSessionManager } from \"../webXRSessionManager\";\r\nimport { WebXRAbstractFeature } from \"./WebXRAbstractFeature\";\r\nimport { Logger } from \"../../Misc/logger\";\r\nimport { Texture } from \"../../Materials/Textures/texture.pure\";\r\nimport { Observable } from \"../../Misc/observable.pure\";\r\nimport { type Observer } 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.pure\";\r\nimport { MaterialPluginBase } from \"core/Materials/materialPluginBase.pure\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport { type Material } from \"core/Materials/material.pure\";\r\nimport { MaterialDefines } from \"core/Materials/materialDefines\";\r\nimport { type UniformBuffer } from \"core/Materials/uniformBuffer\";\r\nimport { PBRBaseMaterial } from \"core/Materials/PBR/pbrBaseMaterial.pure\";\r\nimport { RegisterMaterialPlugin, UnregisterMaterialPlugin } from \"core/Materials/materialPluginManager.pure\";\r\nimport { type Camera } from \"core/Cameras/camera.pure\";\r\nimport { Matrix } from \"core/Maths/math.vector.pure\";\r\nimport { type Engine } from \"core/Engines/engine.pure\";\r\nimport { RegisterClass } from \"../../Misc/typeStore\";\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 = /*#__PURE__*/ 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 this.doNotSerialize = true;\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 Logger.Warn(\"depth-sensing is an experimental and unstable feature.\");\r\n EnableDiscard = !options.useToleranceFactorForDepthSensing;\r\n\r\n RegisterMaterialPlugin(\"WebXRDepthSensingMaterialPlugin\", (material) => new WebXRDepthSensingMaterialPlugin(material));\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): 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 super.dispose();\r\n UnregisterMaterialPlugin(\"WebXRDepthSensingMaterialPlugin\");\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 Logger.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 async 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 await 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\nlet _Registered = false;\r\n/**\r\n * Register side effects for webXRDepthSensing.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\nexport function RegisterWebXRDepthSensing(): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n RegisterClass(`BABYLON.DepthSensingMaterialPlugin`, WebXRDepthSensingMaterialPlugin);\r\n\r\n WebXRFeaturesManager.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\n"]}
|
|
1
|
+
{"version":3,"file":"WebXRDepthSensing.pure.js","sourceRoot":"","sources":["../../../../../dev/core/src/XR/features/WebXRDepthSensing.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/** This file must only contain pure code and pure imports */\r\n\r\nimport { RawTexture } from \"../../Materials/Textures/rawTexture\";\r\nimport { WebXRFeatureName, WebXRFeaturesManager } from \"../webXRFeaturesManager\";\r\nimport { type WebXRSessionManager } from \"../webXRSessionManager\";\r\nimport { WebXRAbstractFeature } from \"./WebXRAbstractFeature\";\r\nimport { Logger } from \"../../Misc/logger\";\r\nimport { Texture } from \"../../Materials/Textures/texture.pure\";\r\nimport { Observable } from \"../../Misc/observable.pure\";\r\nimport { type Observer } 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.pure\";\r\nimport { MaterialPluginBase } from \"core/Materials/materialPluginBase.pure\";\r\nimport { ShaderLanguage } from \"core/Materials/shaderLanguage\";\r\nimport { type Material } from \"core/Materials/material.pure\";\r\nimport { MaterialDefines } from \"core/Materials/materialDefines\";\r\nimport { type UniformBuffer } from \"core/Materials/uniformBuffer\";\r\nimport { PBRBaseMaterial } from \"core/Materials/PBR/pbrBaseMaterial.pure\";\r\nimport { RegisterMaterialPlugin, UnregisterMaterialPlugin } from \"core/Materials/materialPluginManager.pure\";\r\nimport { type Camera } from \"core/Cameras/camera.pure\";\r\nimport { Matrix } from \"core/Maths/math.vector.pure\";\r\nimport { type Engine } from \"core/Engines/engine.pure\";\r\nimport { RegisterClass } from \"../../Misc/typeStore\";\r\nimport { WebXRGraphicsBindingType } from \"../webXRGraphicsBinding\";\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 DepthTextureRight: 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 GlobalRawValueToMetersRight = 1;\r\nlet GlobalDepthAvailableLeft = 0;\r\nlet GlobalDepthAvailableRight = 0;\r\nlet GlobalWorldScale = 1;\r\nlet ViewIndex = 0;\r\nlet EnableDiscard = true;\r\nconst UvTransform = /*#__PURE__*/ Matrix.Identity();\r\nconst UvTransformRight = /*#__PURE__*/ Matrix.Identity();\r\nconst RightView = /*#__PURE__*/ Matrix.Identity();\r\nconst ManagedMaterialPlugins: WebXRDepthSensingMaterialPlugin[] = [];\r\nconst WebGPUGPUDepthWarning =\r\n \"WebXR Depth Sensing is unavailable with WebGPU XR when the session negotiates gpu-optimized depth because XRGPUBinding has no environment-depth equivalent; request cpu-optimized depth to use the feature.\";\r\n\r\ninterface IWebXRCPUDepthViewState {\r\n available: boolean;\r\n height: number;\r\n rawValueToMeters: number;\r\n texture: Nullable<RawTexture>;\r\n uvTransform: Matrix;\r\n visualizationDepthBuffer: Nullable<Float32Array>;\r\n width: number;\r\n}\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 case ShaderLanguage.WGSL:\r\n return true;\r\n default:\r\n return false;\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 this.doNotSerialize = true;\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(shaderLanguage = ShaderLanguage.GLSL) {\r\n const 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 if (shaderLanguage === ShaderLanguage.WGSL) {\r\n ubo.push(\r\n { name: \"ds_rawValueToMetersRight\", size: 1, type: \"float\" },\r\n { name: \"ds_depthAvailableLeft\", size: 1, type: \"float\" },\r\n { name: \"ds_depthAvailableRight\", size: 1, type: \"float\" },\r\n { name: \"ds_worldScale\", size: 1, type: \"float\" },\r\n { name: \"ds_viewDepthSign\", size: 1, type: \"float\" },\r\n { name: \"ds_uvTransformRight\", size: 16, type: \"mat4\" },\r\n { name: \"ds_viewRight\", size: 16, type: \"mat4\" }\r\n );\r\n }\r\n return {\r\n // first, define the UBO with the correct type and size.\r\n ubo,\r\n // now, on the fragment shader, add the uniform itself in case uniform buffers are not supported by the engine\r\n fragment:\r\n shaderLanguage === ShaderLanguage.GLSL\r\n ? `#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\r\n public override getSamplers(samplers: string[]): void {\r\n samplers.push(\"ds_depthSampler\");\r\n samplers.push(\"ds_depthSamplerRight\");\r\n }\r\n\r\n public override bindForSubMesh(uniformBuffer: UniformBuffer) {\r\n if (IsPluginEnabled && DepthTexture) {\r\n const isWGSL = this._material.shaderLanguage === ShaderLanguage.WGSL;\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 if (isWGSL) {\r\n uniformBuffer.updateFloat(\"ds_rawValueToMetersRight\", GlobalRawValueToMetersRight);\r\n uniformBuffer.updateFloat(\"ds_depthAvailableLeft\", GlobalDepthAvailableLeft);\r\n uniformBuffer.updateFloat(\"ds_depthAvailableRight\", GlobalDepthAvailableRight);\r\n uniformBuffer.updateFloat(\"ds_worldScale\", GlobalWorldScale);\r\n uniformBuffer.updateFloat(\"ds_viewDepthSign\", this._material.getScene().useRightHandedSystem ? -1 : 1);\r\n uniformBuffer.setTexture(\"ds_depthSamplerRight\", DepthTextureRight);\r\n uniformBuffer.updateMatrix(\"ds_uvTransformRight\", UvTransformRight);\r\n uniformBuffer.updateMatrix(\"ds_viewRight\", RightView);\r\n }\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, shaderLanguage = ShaderLanguage.GLSL): Nullable<{ [pointName: string]: string }> {\r\n if (shaderLanguage === ShaderLanguage.WGSL) {\r\n return shaderType === \"vertex\"\r\n ? {\r\n CUSTOM_VERTEX_MAIN_BEGIN: `\r\n #ifdef DEPTH_SENSING\r\n #ifdef MULTIVIEW\r\n vertexOutputs.ds_viewIndexMultiview = f32(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 ds_viewIndexMultiview: f32;\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 var ds_depthSampler: texture_2d_array<f32>;\r\n #else\r\n var ds_depthSampler: texture_2d<f32>;\r\n #endif\r\n var ds_depthSamplerSampler: sampler;\r\n #if defined(MULTIVIEW) && !defined(DEPTH_SENSING_TEXTURE_ARRAY)\r\n var ds_depthSamplerRight: texture_2d<f32>;\r\n var ds_depthSamplerRightSampler: sampler;\r\n #endif\r\n #ifdef MULTIVIEW\r\n varying ds_viewIndexMultiview: f32;\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 let ds_viewIndexSet: f32 = fragmentInputs.ds_viewIndexMultiview;\r\n let ds_compensation: vec2f = vec2f(0.0, 0.0);\r\n #else\r\n let ds_viewIndexSet: f32 = uniforms.ds_viewIndex;\r\n let ds_compensation: vec2f = vec2f(ds_viewIndexSet, 0.0);\r\n #endif\r\n let ds_baseUvBottomLeft: vec2f = (fragmentInputs.position.xy * uniforms.ds_invScreenSize - uniforms.ds_shaderViewport.xy) / uniforms.ds_shaderViewport.zw;\r\n let ds_baseUv: vec2f = vec2f(ds_baseUvBottomLeft.x, 1.0 - ds_baseUvBottomLeft.y);\r\n var ds_depthSample: vec4f = vec4f(0.0);\r\n var ds_rawValueToMetersSet: f32 = uniforms.ds_rawValueToMeters;\r\n #if defined(MULTIVIEW) && !defined(DEPTH_SENSING_TEXTURE_ARRAY)\r\n var ds_depthAvailable: f32 = uniforms.ds_depthAvailableLeft;\r\n if (ds_viewIndexSet < 0.5) {\r\n if (ds_depthAvailable > 0.5) {\r\n let ds_depthUv: vec2f = (uniforms.ds_uvTransform * vec4f(ds_baseUv, 0.0, 1.0)).xy;\r\n ds_depthSample = textureSampleLevel(ds_depthSampler, ds_depthSamplerSampler, ds_depthUv, 0.0);\r\n }\r\n } else {\r\n ds_depthAvailable = uniforms.ds_depthAvailableRight;\r\n if (ds_depthAvailable > 0.5) {\r\n let ds_depthUv: vec2f = (uniforms.ds_uvTransformRight * vec4f(ds_baseUv, 0.0, 1.0)).xy;\r\n ds_depthSample = textureSampleLevel(ds_depthSamplerRight, ds_depthSamplerRightSampler, ds_depthUv, 0.0);\r\n }\r\n ds_rawValueToMetersSet = uniforms.ds_rawValueToMetersRight;\r\n }\r\n #else\r\n let ds_depthAvailable: f32 = 1.0;\r\n #ifdef DEPTH_SENSING_TEXTURE_ARRAY\r\n let ds_uv: vec2f = ds_baseUv - ds_compensation;\r\n let ds_depthUv: vec2f = (uniforms.ds_uvTransform * vec4f(ds_uv, 0.0, 1.0)).xy;\r\n ds_depthSample = textureSample(ds_depthSampler, ds_depthSamplerSampler, ds_depthUv, i32(ds_viewIndexSet));\r\n #else\r\n let ds_depthUv: vec2f = (uniforms.ds_uvTransform * vec4f(ds_baseUv, 0.0, 1.0)).xy;\r\n ds_depthSample = textureSample(ds_depthSampler, ds_depthSamplerSampler, ds_depthUv);\r\n #endif\r\n #endif\r\n var ds_cameraDepth: f32;\r\n #ifdef DEPTH_SENSING_TEXTURE_AL\r\n let ds_alphaLuminance: vec2f = ds_depthSample.ra;\r\n ds_cameraDepth = dot(ds_alphaLuminance, vec2f(255.0, 256.0 * 255.0));\r\n #else\r\n ds_cameraDepth = ds_depthSample.r;\r\n #endif\r\n\r\n ds_cameraDepth = ds_cameraDepth * ds_rawValueToMetersSet;\r\n\r\n var ds_viewPosition: vec4f = scene.view * vec4f(fragmentInputs.vPositionW, 1.0);\r\n #ifdef MULTIVIEW\r\n if (ds_viewIndexSet >= 0.5) {\r\n ds_viewPosition = uniforms.ds_viewRight * vec4f(fragmentInputs.vPositionW, 1.0);\r\n }\r\n #endif\r\n let ds_assetDepth: f32 = (ds_viewPosition.z * uniforms.ds_viewDepthSign) / uniforms.ds_worldScale;\r\n #ifdef DEPTH_SENSING_DISCARD\r\n if (ds_depthAvailable > 0.5 && ds_cameraDepth > 0.0 && 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 if (ds_depthAvailable > 0.5 && ds_cameraDepth > 0.0) {\r\n let ds_depthTolerancePerM: f32 = 0.005;\r\n let ds_occlusion: f32 = 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 }\r\n #endif\r\n#endif\r\n `,\r\n };\r\n }\r\n\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 _cachedDepthImageTextureWrapsExternalTexture = false;\r\n private _cpuDepthViewStates: IWebXRCPUDepthViewState[] = [];\r\n private _disableAutoAttachBeforeWebGPUGPUDepth = false;\r\n private _disabledForWebGPUGPUDepth = false;\r\n private _onCameraObserver: Nullable<Observer<Camera>> = null;\r\n private _onSessionEndedObserver: Nullable<Observer<any>> = 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 if (!this._xrSessionManager.scene.getEngine().isWebGPU) {\r\n Logger.Warn(\"depth-sensing is an experimental and unstable feature.\");\r\n }\r\n EnableDiscard = !options.useToleranceFactorForDepthSensing;\r\n\r\n RegisterMaterialPlugin(\"WebXRDepthSensingMaterialPlugin\", (material) => new WebXRDepthSensingMaterialPlugin(material));\r\n this._onSessionEndedObserver = this._xrSessionManager.onXRSessionEnded.add(() => {\r\n if (this._disabledForWebGPUGPUDepth) {\r\n this._disabledForWebGPUGPUDepth = false;\r\n this.disableAutoAttach = this._disableAutoAttachBeforeWebGPUGPUDepth;\r\n }\r\n });\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): boolean {\r\n const engine = this._xrSessionManager.scene.getEngine();\r\n const depthUsage = this._xrSessionManager.session.depthUsage;\r\n const depthDataFormat = this._xrSessionManager.session.depthDataFormat;\r\n\r\n if (engine.isWebGPU && depthUsage === \"gpu-optimized\") {\r\n if (this._disabledForWebGPUGPUDepth) {\r\n this.disableAutoAttach = true;\r\n return false;\r\n }\r\n this._disableAutoAttachBeforeWebGPUGPUDepth = this._autoAttachPolicyBeforeAttach ?? this.disableAutoAttach;\r\n this._disabledForWebGPUGPUDepth = true;\r\n return this._disableAutoAttach(WebGPUGPUDepthWarning);\r\n }\r\n\r\n if (depthUsage == null || depthDataFormat == null) {\r\n return false;\r\n }\r\n\r\n if (!super.attach(force)) {\r\n return false;\r\n }\r\n\r\n if (!engine.isWebGPU) {\r\n const graphicsBinding = this._xrSessionManager._getGraphicsBinding();\r\n if (graphicsBinding.bindingType !== WebXRGraphicsBindingType.WebGL) {\r\n throw new Error(\"Expected a WebGL graphics binding for WebXR Depth Sensing.\");\r\n }\r\n this._glBinding = graphicsBinding.binding;\r\n }\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() / (!engine.isWebGPU && 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 GlobalWorldScale = this._xrSessionManager.worldScalingFactor;\r\n\r\n // find the viewIndex\r\n if (camera.rigParent) {\r\n const viewIndex = camera.rigParent.rigCameras.indexOf(camera);\r\n ViewIndex = viewIndex === -1 ? 0 : viewIndex;\r\n if (engine.isWebGPU && this.depthUsage === \"cpu\") {\r\n this._bindCPUDepthView(ViewIndex, false);\r\n }\r\n } else if (camera._renderingMultiview && engine.isWebGPU && this.depthUsage === \"cpu\") {\r\n ViewIndex = 0;\r\n const rightCamera = camera.rigCameras[1];\r\n if (rightCamera) {\r\n RightView.copyFrom(rightCamera.getViewMatrix());\r\n }\r\n this._bindCPUDepthView(0, true);\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 DepthTextureRight = null;\r\n this._cachedWebGLTexture = null;\r\n this._cachedDepthBuffer = null;\r\n this._width = null;\r\n this._height = null;\r\n this._rawValueToMeters = null;\r\n this._textureType = null;\r\n this._normDepthBufferFromNormView = null;\r\n let cachedTextureDisposed = false;\r\n for (const viewState of this._cpuDepthViewStates) {\r\n viewState.texture?.dispose();\r\n cachedTextureDisposed ||= viewState.texture === this._cachedDepthImageTexture;\r\n }\r\n this._cpuDepthViewStates.length = 0;\r\n if (!cachedTextureDisposed) {\r\n if (this._cachedDepthImageTextureWrapsExternalTexture && this._cachedDepthImageTexture?._texture) {\r\n this._cachedDepthImageTexture._texture._hardwareTexture = null;\r\n }\r\n this._cachedDepthImageTexture?.dispose();\r\n }\r\n this._cachedDepthImageTexture = null;\r\n this._cachedDepthImageTextureWrapsExternalTexture = false;\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 this._onCameraObserver = null;\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 if (this._onSessionEndedObserver) {\r\n this._xrSessionManager.onXRSessionEnded.remove(this._onSessionEndedObserver);\r\n this._onSessionEndedObserver = null;\r\n }\r\n super.dispose();\r\n UnregisterMaterialPlugin(\"WebXRDepthSensingMaterialPlugin\");\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 depthUsage = this.depthUsage;\r\n if (depthUsage === \"cpu\") {\r\n for (const viewState of this._cpuDepthViewStates) {\r\n viewState.available = false;\r\n }\r\n }\r\n const pose = _xrFrame.getViewerPose(referenceSPace);\r\n if (pose == null) {\r\n if (depthUsage === \"cpu\") {\r\n this._clearCPUDepthBinding();\r\n }\r\n return;\r\n }\r\n for (let viewIndex = 0; viewIndex < pose.views.length; viewIndex++) {\r\n const view = pose.views[viewIndex];\r\n switch (depthUsage) {\r\n case \"cpu\":\r\n this._updateDepthInformationAndTextureCPUDepthUsage(_xrFrame, view, viewIndex, 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 Logger.Error(\"Unknown depth usage\");\r\n this.detach();\r\n break;\r\n }\r\n }\r\n if (depthUsage === \"cpu\" && !this._cpuDepthViewStates.some((viewState) => viewState.available)) {\r\n this._clearCPUDepthBinding();\r\n }\r\n }\r\n\r\n private _updateDepthInformationAndTextureCPUDepthUsage(frame: XRFrame, view: XRView, viewIndex: number, 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 let viewState = this._cpuDepthViewStates[viewIndex];\r\n if (!viewState) {\r\n viewState = {\r\n available: true,\r\n height,\r\n rawValueToMeters,\r\n texture: null,\r\n uvTransform: Matrix.Identity(),\r\n visualizationDepthBuffer: null,\r\n width,\r\n };\r\n this._cpuDepthViewStates[viewIndex] = viewState;\r\n }\r\n\r\n const textureSizeChanged = viewState.width !== width || viewState.height !== height;\r\n this._width = width;\r\n this._height = height;\r\n this._rawValueToMeters = rawValueToMeters;\r\n this._normDepthBufferFromNormView = normDepthBufferFromNormView;\r\n this._cachedDepthBuffer = data;\r\n AlphaLuminanceTexture = dataFormat === \"luminance-alpha\";\r\n viewState.height = height;\r\n viewState.available = true;\r\n viewState.rawValueToMeters = rawValueToMeters;\r\n viewState.uvTransform.fromArray(normDepthBufferFromNormView.matrix);\r\n viewState.width = width;\r\n\r\n // to avoid Illegal Invocation error, bind `this`\r\n this.onGetDepthInMetersAvailable.notifyObservers(getDepthInMeters.bind(depthInfo));\r\n\r\n if (!viewState.texture || textureSizeChanged) {\r\n viewState.texture?.dispose();\r\n viewState.texture = 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 }\r\n this._cachedDepthImageTextureWrapsExternalTexture = false;\r\n this._cachedDepthImageTexture = viewState.texture;\r\n\r\n let depthValues: Float32Array | Uint16Array | null = null;\r\n switch (dataFormat) {\r\n case \"ushort\":\r\n case \"luminance-alpha\":\r\n depthValues = new Uint16Array(data);\r\n break;\r\n case \"float\":\r\n depthValues = new Float32Array(data);\r\n break;\r\n default:\r\n break;\r\n }\r\n if (depthValues) {\r\n let uploadData: Float32Array;\r\n if (this.options.prepareTextureForVisualization) {\r\n if (!viewState.visualizationDepthBuffer || viewState.visualizationDepthBuffer.length !== depthValues.length) {\r\n viewState.visualizationDepthBuffer = new Float32Array(depthValues.length);\r\n }\r\n uploadData = viewState.visualizationDepthBuffer;\r\n for (let index = 0; index < depthValues.length; index++) {\r\n uploadData[index] = depthValues[index] * rawValueToMeters;\r\n }\r\n } else {\r\n uploadData = depthValues instanceof Float32Array ? depthValues : Float32Array.from(depthValues);\r\n }\r\n viewState.texture.update(uploadData);\r\n }\r\n\r\n if (!this._xrSessionManager.scene.getEngine().isWebGPU) {\r\n const hadDepthTexture = !!DepthTexture;\r\n DepthTexture = viewState.texture;\r\n DepthTextureRight = null;\r\n GlobalDepthAvailableLeft = 1;\r\n GlobalDepthAvailableRight = 0;\r\n GlobalRawValueToMeters = viewState.rawValueToMeters;\r\n UvTransform.copyFrom(viewState.uvTransform);\r\n if (!hadDepthTexture) {\r\n this._xrSessionManager.scene.markAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n }\r\n }\r\n\r\n private _clearCPUDepthBinding(): void {\r\n if (DepthTexture) {\r\n DepthTexture = null;\r\n DepthTextureRight = null;\r\n this._xrSessionManager.scene.markAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\r\n }\r\n }\r\n\r\n private _bindCPUDepthView(viewIndex: number, multiview: boolean): void {\r\n const leftViewState = this._cpuDepthViewStates[0];\r\n const rightViewState = multiview ? this._cpuDepthViewStates[1] : null;\r\n const viewState = multiview\r\n ? leftViewState?.available && leftViewState.texture\r\n ? leftViewState\r\n : rightViewState?.available && rightViewState.texture\r\n ? rightViewState\r\n : null\r\n : this._cpuDepthViewStates[viewIndex];\r\n if (!viewState?.available || !viewState.texture) {\r\n this._clearCPUDepthBinding();\r\n return;\r\n }\r\n\r\n const hadDepthTexture = !!DepthTexture;\r\n if (multiview && leftViewState?.available && leftViewState.texture) {\r\n GlobalDepthAvailableLeft = 1;\r\n DepthTexture = leftViewState.texture;\r\n GlobalRawValueToMeters = leftViewState.rawValueToMeters;\r\n UvTransform.copyFrom(leftViewState.uvTransform);\r\n } else {\r\n GlobalDepthAvailableLeft = multiview ? 0 : 1;\r\n DepthTexture = viewState.texture;\r\n GlobalRawValueToMeters = viewState.rawValueToMeters;\r\n UvTransform.copyFrom(viewState.uvTransform);\r\n }\r\n if (multiview && rightViewState?.available && rightViewState.texture) {\r\n GlobalDepthAvailableRight = 1;\r\n DepthTextureRight = rightViewState.texture;\r\n GlobalRawValueToMetersRight = rightViewState.rawValueToMeters;\r\n UvTransformRight.copyFrom(rightViewState.uvTransform);\r\n } else {\r\n GlobalDepthAvailableRight = 0;\r\n DepthTextureRight = viewState.texture;\r\n GlobalRawValueToMetersRight = viewState.rawValueToMeters;\r\n UvTransformRight.copyFrom(viewState.uvTransform);\r\n }\r\n\r\n if (!hadDepthTexture) {\r\n this._xrSessionManager.scene.markAllMaterialsAsDirty(Constants.MATERIAL_TextureDirtyFlag);\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 this._cachedDepthImageTexture._texture?.dispose();\r\n }\r\n\r\n this._cachedDepthImageTexture._texture = internalTexture;\r\n this._cachedDepthImageTextureWrapsExternalTexture = true;\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 async 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 await 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\nlet _Registered = false;\r\n/**\r\n * Register side effects for webXRDepthSensing.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\nexport function RegisterWebXRDepthSensing(): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n RegisterClass(`BABYLON.DepthSensingMaterialPlugin`, WebXRDepthSensingMaterialPlugin);\r\n\r\n WebXRFeaturesManager.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\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebXRImageTracking.pure.js","sourceRoot":"","sources":["../../../../../dev/core/src/XR/features/WebXRImageTracking.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 { WebXRAbstractFeature } from \"./WebXRAbstractFeature\";\r\nimport { Matrix } from \"../../Maths/math.vector.pure\";\r\nimport { type Nullable } from \"../../types\";\r\nimport { Logger } from \"../../Misc/logger\";\r\nimport { type Engine } from \"../../Engines/engine.pure\";\r\n\r\n/**\r\n * Options interface for the background remover plugin\r\n */\r\nexport interface IWebXRImageTrackingOptions {\r\n /**\r\n * A required array with images to track\r\n */\r\n images: {\r\n /**\r\n * The source of the image. can be a URL or an image bitmap\r\n */\r\n src: string | ImageBitmap;\r\n /**\r\n * The estimated width in the real world (in meters)\r\n */\r\n estimatedRealWorldWidth: number; // In meters!\r\n }[];\r\n}\r\n\r\n/**\r\n * An object representing an image tracked by the system\r\n */\r\nexport interface IWebXRTrackedImage {\r\n /**\r\n * The ID of this image (which is the same as the position in the array that was used to initialize the feature)\r\n */\r\n id: number;\r\n /**\r\n * Is the transformation provided emulated. If it is, the system \"guesses\" its real position. Otherwise it can be considered as exact position.\r\n */\r\n emulated?: boolean;\r\n /**\r\n * Just in case it is needed - the image bitmap that is being tracked\r\n */\r\n originalBitmap: ImageBitmap;\r\n /**\r\n * The native XR result image tracking result, untouched\r\n */\r\n xrTrackingResult?: XRImageTrackingResult;\r\n /**\r\n * Width in real world (meters)\r\n */\r\n realWorldWidth?: number;\r\n /**\r\n * A transformation matrix of this current image in the current reference space.\r\n */\r\n transformationMatrix: Matrix;\r\n /**\r\n * The width/height ratio of this image. can be used to calculate the size of the detected object/image\r\n */\r\n ratio?: number;\r\n}\r\n\r\n/**\r\n * Enum that describes the state of the image trackability score status for this session.\r\n */\r\nenum ImageTrackingScoreStatus {\r\n // AR Session has not yet assessed image trackability scores.\r\n NotReceived,\r\n // A request to retrieve trackability scores has been sent, but no response has been received.\r\n Waiting,\r\n // Image trackability scores have been received for this session\r\n Received,\r\n}\r\n\r\n/**\r\n * Image tracking for immersive AR sessions.\r\n * Providing a list of images and their estimated widths will enable tracking those images in the real world.\r\n */\r\nexport class WebXRImageTracking extends WebXRAbstractFeature {\r\n /**\r\n * The module's name\r\n */\r\n public static readonly Name = WebXRFeatureName.IMAGE_TRACKING;\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 * This will be triggered if the underlying system deems an image untrackable.\r\n * The index is the index of the image from the array used to initialize the feature.\r\n */\r\n public onUntrackableImageFoundObservable: Observable<number> = new Observable();\r\n /**\r\n * An image was deemed trackable, and the system will start tracking it.\r\n */\r\n public onTrackableImageFoundObservable: Observable<IWebXRTrackedImage> = new Observable();\r\n /**\r\n * The image was found and its state was updated.\r\n */\r\n public onTrackedImageUpdatedObservable: Observable<IWebXRTrackedImage> = new Observable();\r\n\r\n private _trackableScoreStatus: ImageTrackingScoreStatus = ImageTrackingScoreStatus.NotReceived;\r\n private _trackedImages: IWebXRTrackedImage[] = [];\r\n\r\n private _originalTrackingRequest: XRTrackedImageInit[];\r\n\r\n /**\r\n * constructs the image tracking feature\r\n * @param _xrSessionManager the session manager for this module\r\n * @param options read-only options to be used in this module\r\n */\r\n constructor(\r\n _xrSessionManager: WebXRSessionManager,\r\n /**\r\n * read-only options to be used in this module\r\n */\r\n public readonly options: IWebXRImageTrackingOptions\r\n ) {\r\n super(_xrSessionManager);\r\n this.xrNativeFeatureName = \"image-tracking\";\r\n }\r\n\r\n /**\r\n * attach 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 attach(): boolean {\r\n return super.attach();\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 return super.detach();\r\n }\r\n\r\n /**\r\n * Get a tracked image by its ID.\r\n *\r\n * @param id the id of the image to load (position in the init array)\r\n * @returns a trackable image, if exists in this location\r\n */\r\n public getTrackedImageById(id: number): Nullable<IWebXRTrackedImage> {\r\n return this._trackedImages[id] || null;\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 for (const trackedImage of this._trackedImages) {\r\n trackedImage.originalBitmap.close();\r\n }\r\n this._trackedImages.length = 0;\r\n this.onTrackableImageFoundObservable.clear();\r\n this.onUntrackableImageFoundObservable.clear();\r\n this.onTrackedImageUpdatedObservable.clear();\r\n }\r\n\r\n /**\r\n * Extends the session init object if needed\r\n * @returns augmentation object fo the xr session init object.\r\n */\r\n public async getXRSessionInitExtension(): Promise<Partial<XRSessionInit>> {\r\n if (!this.options.images || !this.options.images.length) {\r\n return {};\r\n }\r\n const promises = this.options.images.map(async (image) => {\r\n if (typeof image.src === \"string\") {\r\n return await (this._xrSessionManager.scene.getEngine() as Engine)._createImageBitmapFromSource(image.src);\r\n } else {\r\n return image.src;\r\n }\r\n });\r\n\r\n try {\r\n const images = await Promise.all(promises);\r\n\r\n this._originalTrackingRequest = images.map((image, idx) => {\r\n return {\r\n image,\r\n widthInMeters: this.options.images[idx].estimatedRealWorldWidth,\r\n };\r\n });\r\n\r\n return {\r\n trackedImages: this._originalTrackingRequest,\r\n };\r\n } catch (ex) {\r\n Logger.Error(\"Error loading images for tracking, WebXRImageTracking disabled for this session.\");\r\n return {};\r\n }\r\n }\r\n\r\n protected _onXRFrame(_xrFrame: XRFrame) {\r\n if (!_xrFrame.getImageTrackingResults || this._trackableScoreStatus === ImageTrackingScoreStatus.Waiting) {\r\n return;\r\n }\r\n\r\n // Image tracking scores may be generated a few frames after the XR Session initializes.\r\n // If we haven't received scores yet, then kick off the task to check scores and return immediately.\r\n if (this._trackableScoreStatus === ImageTrackingScoreStatus.NotReceived) {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this._checkScoresAsync();\r\n return;\r\n }\r\n\r\n const imageTrackedResults = _xrFrame.getImageTrackingResults();\r\n for (const result of imageTrackedResults) {\r\n let changed = false;\r\n const imageIndex = result.index;\r\n\r\n const imageObject = this._trackedImages[imageIndex];\r\n if (!imageObject) {\r\n // something went wrong!\r\n continue;\r\n }\r\n\r\n imageObject.xrTrackingResult = result;\r\n if (imageObject.realWorldWidth !== result.measuredWidthInMeters) {\r\n imageObject.realWorldWidth = result.measuredWidthInMeters;\r\n changed = true;\r\n }\r\n\r\n // Get the pose of the image relative to a reference space.\r\n const pose = _xrFrame.getPose(result.imageSpace, this._xrSessionManager.referenceSpace);\r\n\r\n if (pose) {\r\n const mat = imageObject.transformationMatrix;\r\n Matrix.FromArrayToRef(pose.transform.matrix, 0, mat);\r\n if (!this._xrSessionManager.scene.useRightHandedSystem) {\r\n mat.toggleModelMatrixHandInPlace();\r\n }\r\n changed = true;\r\n }\r\n\r\n const state = result.trackingState;\r\n const emulated = state === \"emulated\";\r\n\r\n if (imageObject.emulated !== emulated) {\r\n imageObject.emulated = emulated;\r\n changed = true;\r\n }\r\n if (changed) {\r\n this.onTrackedImageUpdatedObservable.notifyObservers(imageObject);\r\n }\r\n }\r\n }\r\n\r\n private async _checkScoresAsync(): Promise<void> {\r\n if (!this._xrSessionManager.session.getTrackedImageScores || this._trackableScoreStatus !== ImageTrackingScoreStatus.NotReceived) {\r\n return;\r\n }\r\n\r\n this._trackableScoreStatus = ImageTrackingScoreStatus.Waiting;\r\n const imageScores = await this._xrSessionManager.session.getTrackedImageScores();\r\n if (!imageScores || imageScores.length === 0) {\r\n this._trackableScoreStatus = ImageTrackingScoreStatus.NotReceived;\r\n return;\r\n }\r\n\r\n // check the scores for all\r\n for (let idx = 0; idx < imageScores.length; ++idx) {\r\n if (imageScores[idx] == \"untrackable\") {\r\n this.onUntrackableImageFoundObservable.notifyObservers(idx);\r\n } else {\r\n const originalBitmap = this._originalTrackingRequest[idx].image;\r\n const imageObject: IWebXRTrackedImage = {\r\n id: idx,\r\n originalBitmap,\r\n transformationMatrix: new Matrix(),\r\n ratio: originalBitmap.width / originalBitmap.height,\r\n };\r\n this._trackedImages[idx] = imageObject;\r\n this.onTrackableImageFoundObservable.notifyObservers(imageObject);\r\n }\r\n }\r\n\r\n this._trackableScoreStatus = imageScores.length > 0 ? ImageTrackingScoreStatus.Received : ImageTrackingScoreStatus.NotReceived;\r\n }\r\n}\r\n\r\nlet _Registered = false;\r\n/**\r\n * Register side effects for webXRImageTracking.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\nexport function RegisterWebXRImageTracking(): 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 WebXRImageTracking.Name,\r\n (xrSessionManager, options) => {\r\n return () => new WebXRImageTracking(xrSessionManager, options);\r\n },\r\n WebXRImageTracking.Version,\r\n false\r\n );\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"WebXRImageTracking.pure.js","sourceRoot":"","sources":["../../../../../dev/core/src/XR/features/WebXRImageTracking.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 { WebXRAbstractFeature } from \"./WebXRAbstractFeature\";\r\nimport { Matrix } from \"../../Maths/math.vector.pure\";\r\nimport { type Nullable } from \"../../types\";\r\nimport { Logger } from \"../../Misc/logger\";\r\n\r\n/**\r\n * Options interface for the background remover plugin\r\n */\r\nexport interface IWebXRImageTrackingOptions {\r\n /**\r\n * A required array with images to track\r\n */\r\n images: {\r\n /**\r\n * The source of the image. can be a URL or an image bitmap\r\n */\r\n src: string | ImageBitmap;\r\n /**\r\n * The estimated width in the real world (in meters)\r\n */\r\n estimatedRealWorldWidth: number; // In meters!\r\n }[];\r\n}\r\n\r\n/**\r\n * An object representing an image tracked by the system\r\n */\r\nexport interface IWebXRTrackedImage {\r\n /**\r\n * The ID of this image (which is the same as the position in the array that was used to initialize the feature)\r\n */\r\n id: number;\r\n /**\r\n * Is the transformation provided emulated. If it is, the system \"guesses\" its real position. Otherwise it can be considered as exact position.\r\n */\r\n emulated?: boolean;\r\n /**\r\n * Just in case it is needed - the image bitmap that is being tracked\r\n */\r\n originalBitmap: ImageBitmap;\r\n /**\r\n * The native XR result image tracking result, untouched\r\n */\r\n xrTrackingResult?: XRImageTrackingResult;\r\n /**\r\n * Width in real world (meters)\r\n */\r\n realWorldWidth?: number;\r\n /**\r\n * A transformation matrix of this current image in the current reference space.\r\n */\r\n transformationMatrix: Matrix;\r\n /**\r\n * The width/height ratio of this image. can be used to calculate the size of the detected object/image\r\n */\r\n ratio?: number;\r\n}\r\n\r\n/**\r\n * Enum that describes the state of the image trackability score status for this session.\r\n */\r\nenum ImageTrackingScoreStatus {\r\n // AR Session has not yet assessed image trackability scores.\r\n NotReceived,\r\n // A request to retrieve trackability scores has been sent, but no response has been received.\r\n Waiting,\r\n // Image trackability scores have been received for this session\r\n Received,\r\n}\r\n\r\n/**\r\n * Image tracking for immersive AR sessions.\r\n * Providing a list of images and their estimated widths will enable tracking those images in the real world.\r\n */\r\nexport class WebXRImageTracking extends WebXRAbstractFeature {\r\n /**\r\n * The module's name\r\n */\r\n public static readonly Name = WebXRFeatureName.IMAGE_TRACKING;\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 * This will be triggered if the underlying system deems an image untrackable.\r\n * The index is the index of the image from the array used to initialize the feature.\r\n */\r\n public onUntrackableImageFoundObservable: Observable<number> = new Observable();\r\n /**\r\n * An image was deemed trackable, and the system will start tracking it.\r\n */\r\n public onTrackableImageFoundObservable: Observable<IWebXRTrackedImage> = new Observable();\r\n /**\r\n * The image was found and its state was updated.\r\n */\r\n public onTrackedImageUpdatedObservable: Observable<IWebXRTrackedImage> = new Observable();\r\n\r\n private _trackableScoreStatus: ImageTrackingScoreStatus = ImageTrackingScoreStatus.NotReceived;\r\n private _trackedImages: IWebXRTrackedImage[] = [];\r\n\r\n private _originalTrackingRequest: XRTrackedImageInit[];\r\n\r\n /**\r\n * constructs the image tracking feature\r\n * @param _xrSessionManager the session manager for this module\r\n * @param options read-only options to be used in this module\r\n */\r\n constructor(\r\n _xrSessionManager: WebXRSessionManager,\r\n /**\r\n * read-only options to be used in this module\r\n */\r\n public readonly options: IWebXRImageTrackingOptions\r\n ) {\r\n super(_xrSessionManager);\r\n this.xrNativeFeatureName = \"image-tracking\";\r\n }\r\n\r\n /**\r\n * attach 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 attach(): boolean {\r\n return super.attach();\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 return super.detach();\r\n }\r\n\r\n /**\r\n * Get a tracked image by its ID.\r\n *\r\n * @param id the id of the image to load (position in the init array)\r\n * @returns a trackable image, if exists in this location\r\n */\r\n public getTrackedImageById(id: number): Nullable<IWebXRTrackedImage> {\r\n return this._trackedImages[id] || null;\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 for (const trackedImage of this._trackedImages) {\r\n trackedImage.originalBitmap.close();\r\n }\r\n this._trackedImages.length = 0;\r\n this.onTrackableImageFoundObservable.clear();\r\n this.onUntrackableImageFoundObservable.clear();\r\n this.onTrackedImageUpdatedObservable.clear();\r\n }\r\n\r\n /**\r\n * Extends the session init object if needed\r\n * @returns augmentation object fo the xr session init object.\r\n */\r\n public async getXRSessionInitExtension(): Promise<Partial<XRSessionInit>> {\r\n if (!this.options.images || !this.options.images.length) {\r\n return {};\r\n }\r\n const promises = this.options.images.map(async (image) => {\r\n if (typeof image.src === \"string\") {\r\n return await this._xrSessionManager.scene.getEngine()._createImageBitmapFromSource(image.src);\r\n } else {\r\n return image.src;\r\n }\r\n });\r\n\r\n try {\r\n const images = await Promise.all(promises);\r\n\r\n this._originalTrackingRequest = images.map((image, idx) => {\r\n return {\r\n image,\r\n widthInMeters: this.options.images[idx].estimatedRealWorldWidth,\r\n };\r\n });\r\n\r\n return {\r\n trackedImages: this._originalTrackingRequest,\r\n };\r\n } catch (ex) {\r\n Logger.Error(\"Error loading images for tracking, WebXRImageTracking disabled for this session.\");\r\n return {};\r\n }\r\n }\r\n\r\n protected _onXRFrame(_xrFrame: XRFrame) {\r\n if (!_xrFrame.getImageTrackingResults || this._trackableScoreStatus === ImageTrackingScoreStatus.Waiting) {\r\n return;\r\n }\r\n\r\n // Image tracking scores may be generated a few frames after the XR Session initializes.\r\n // If we haven't received scores yet, then kick off the task to check scores and return immediately.\r\n if (this._trackableScoreStatus === ImageTrackingScoreStatus.NotReceived) {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this._checkScoresAsync();\r\n return;\r\n }\r\n\r\n const imageTrackedResults = _xrFrame.getImageTrackingResults();\r\n for (const result of imageTrackedResults) {\r\n let changed = false;\r\n const imageIndex = result.index;\r\n\r\n const imageObject = this._trackedImages[imageIndex];\r\n if (!imageObject) {\r\n // something went wrong!\r\n continue;\r\n }\r\n\r\n imageObject.xrTrackingResult = result;\r\n if (imageObject.realWorldWidth !== result.measuredWidthInMeters) {\r\n imageObject.realWorldWidth = result.measuredWidthInMeters;\r\n changed = true;\r\n }\r\n\r\n // Get the pose of the image relative to a reference space.\r\n const pose = _xrFrame.getPose(result.imageSpace, this._xrSessionManager.referenceSpace);\r\n\r\n if (pose) {\r\n const mat = imageObject.transformationMatrix;\r\n Matrix.FromArrayToRef(pose.transform.matrix, 0, mat);\r\n if (!this._xrSessionManager.scene.useRightHandedSystem) {\r\n mat.toggleModelMatrixHandInPlace();\r\n }\r\n changed = true;\r\n }\r\n\r\n const state = result.trackingState;\r\n const emulated = state === \"emulated\";\r\n\r\n if (imageObject.emulated !== emulated) {\r\n imageObject.emulated = emulated;\r\n changed = true;\r\n }\r\n if (changed) {\r\n this.onTrackedImageUpdatedObservable.notifyObservers(imageObject);\r\n }\r\n }\r\n }\r\n\r\n private async _checkScoresAsync(): Promise<void> {\r\n if (!this._xrSessionManager.session.getTrackedImageScores || this._trackableScoreStatus !== ImageTrackingScoreStatus.NotReceived) {\r\n return;\r\n }\r\n\r\n this._trackableScoreStatus = ImageTrackingScoreStatus.Waiting;\r\n const imageScores = await this._xrSessionManager.session.getTrackedImageScores();\r\n if (!imageScores || imageScores.length === 0) {\r\n this._trackableScoreStatus = ImageTrackingScoreStatus.NotReceived;\r\n return;\r\n }\r\n\r\n // check the scores for all\r\n for (let idx = 0; idx < imageScores.length; ++idx) {\r\n if (imageScores[idx] == \"untrackable\") {\r\n this.onUntrackableImageFoundObservable.notifyObservers(idx);\r\n } else {\r\n const originalBitmap = this._originalTrackingRequest[idx].image;\r\n const imageObject: IWebXRTrackedImage = {\r\n id: idx,\r\n originalBitmap,\r\n transformationMatrix: new Matrix(),\r\n ratio: originalBitmap.width / originalBitmap.height,\r\n };\r\n this._trackedImages[idx] = imageObject;\r\n this.onTrackableImageFoundObservable.notifyObservers(imageObject);\r\n }\r\n }\r\n\r\n this._trackableScoreStatus = imageScores.length > 0 ? ImageTrackingScoreStatus.Received : ImageTrackingScoreStatus.NotReceived;\r\n }\r\n}\r\n\r\nlet _Registered = false;\r\n/**\r\n * Register side effects for webXRImageTracking.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\nexport function RegisterWebXRImageTracking(): 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 WebXRImageTracking.Name,\r\n (xrSessionManager, options) => {\r\n return () => new WebXRImageTracking(xrSessionManager, options);\r\n },\r\n WebXRImageTracking.Version,\r\n false\r\n );\r\n}\r\n"]}
|
|
@@ -7,6 +7,7 @@ import { WebXRProjectionLayerWrapper } from "./Layers/WebXRProjectionLayer.js";
|
|
|
7
7
|
import { WebXRCompositionLayerWrapper } from "./Layers/WebXRCompositionLayer.js";
|
|
8
8
|
import { type DynamicTexture } from "../../Materials/Textures/dynamicTexture.pure.js";
|
|
9
9
|
import { type LensFlareSystem } from "../../LensFlares/lensFlareSystem.js";
|
|
10
|
+
import { type Nullable } from "../../types.js";
|
|
10
11
|
/**
|
|
11
12
|
* Configuration options of the layers feature
|
|
12
13
|
*/
|
|
@@ -82,7 +83,7 @@ export declare class WebXRLayers extends WebXRAbstractFeature {
|
|
|
82
83
|
* Note about making it private - this function will be exposed once I decide on a proper API to support all of the XR layers' options
|
|
83
84
|
* @param options an object providing configuration options for the new XRQuadLayer.
|
|
84
85
|
* @param babylonTexture the texture to display in the layer
|
|
85
|
-
* @returns the quad layer
|
|
86
|
+
* @returns the quad layer, or null when the WebGPU binding lacks quad-layer support
|
|
86
87
|
*/
|
|
87
88
|
private _createQuadLayer;
|
|
88
89
|
/**
|
|
@@ -91,20 +92,20 @@ export declare class WebXRLayers extends WebXRAbstractFeature {
|
|
|
91
92
|
* Note that no interaction will be available with the ADT when using this method
|
|
92
93
|
* @param texture the texture to display in the layer
|
|
93
94
|
* @param options optional parameters for the layer
|
|
94
|
-
* @returns a composition layer containing the texture
|
|
95
|
+
* @returns a composition layer containing the texture, or null when WebGPU quad layers are unavailable
|
|
95
96
|
*/
|
|
96
97
|
addFullscreenAdvancedDynamicTexture(texture: DynamicTexture, options?: {
|
|
97
98
|
distanceFromHeadset: number;
|
|
98
|
-
}): WebXRCompositionLayerWrapper
|
|
99
|
+
}): Nullable<WebXRCompositionLayerWrapper>;
|
|
99
100
|
/**
|
|
100
101
|
* @experimental
|
|
101
102
|
* This functions allows you to add a lens flare system to the XR scene.
|
|
102
103
|
* Note - this will remove the lens flare system from the scene and add it to the XR scene.
|
|
103
104
|
* This feature is experimental and might change in the future.
|
|
104
105
|
* @param flareSystem the flare system to add
|
|
105
|
-
* @returns a composition layer containing the flare system
|
|
106
|
+
* @returns a composition layer containing the flare system, or null when WebGPU quad layers are unavailable
|
|
106
107
|
*/
|
|
107
|
-
protected _addLensFlareSystem(flareSystem: LensFlareSystem): WebXRCompositionLayerWrapper
|
|
108
|
+
protected _addLensFlareSystem(flareSystem: LensFlareSystem): Nullable<WebXRCompositionLayerWrapper>;
|
|
108
109
|
/**
|
|
109
110
|
* Add a new layer to the already-existing list of layers
|
|
110
111
|
* @param wrappedLayer the new layer to add to the existing ones
|
|
@@ -5,8 +5,12 @@ import { WebXRWebGLLayerWrapper } from "../webXRWebGLLayer.js";
|
|
|
5
5
|
import { WebXRProjectionLayerWrapper, DefaultXRProjectionLayerInit } from "./Layers/WebXRProjectionLayer.js";
|
|
6
6
|
import { WebXRCompositionLayerRenderTargetTextureProvider, WebXRCompositionLayerWrapper } from "./Layers/WebXRCompositionLayer.js";
|
|
7
7
|
import { WebXRWebGPUProjectionLayerWrapper, CreateDefaultXRGPUProjectionLayerInit } from "./Layers/WebXRWebGPUProjectionLayer.js";
|
|
8
|
+
import { WebXRWebGPUCompositionLayerRenderTargetTextureProvider, WebXRWebGPUCompositionLayerWrapper } from "./Layers/WebXRWebGPUCompositionLayer.js";
|
|
8
9
|
import { Color4 } from "../../Maths/math.color.pure.js";
|
|
10
|
+
import { Logger } from "../../Misc/logger.js";
|
|
9
11
|
const DefaultXRWebGLLayerInit = {};
|
|
12
|
+
const WebGPUQuadLayerCreateWarning = "WebGPU XR quad layers are unavailable because XRGPUBinding.createQuadLayer is not supported; the requested quad layer was skipped and projection rendering remains active.";
|
|
13
|
+
const WebGPUQuadLayerSubImageWarning = "WebGPU XR quad layers are unavailable because XRGPUBinding.getSubImage is not supported; the requested quad layer was skipped and projection rendering remains active.";
|
|
10
14
|
/**
|
|
11
15
|
* Exposes the WebXR Layers API.
|
|
12
16
|
*/
|
|
@@ -49,8 +53,12 @@ export class WebXRLayers extends WebXRAbstractFeature {
|
|
|
49
53
|
this._createWebGPUProjectionLayer();
|
|
50
54
|
}
|
|
51
55
|
else {
|
|
52
|
-
|
|
53
|
-
|
|
56
|
+
const binding = this._xrSessionManager._getGraphicsBinding();
|
|
57
|
+
if (binding.bindingType !== 0 /* WebXRGraphicsBindingType.WebGL */) {
|
|
58
|
+
throw new Error("Expected a WebGL graphics binding for a WebGL engine.");
|
|
59
|
+
}
|
|
60
|
+
this._glContext = binding.context;
|
|
61
|
+
this._xrWebGLBinding = binding.binding;
|
|
54
62
|
const projectionLayerInit = { ...DefaultXRProjectionLayerInit, ...this._options.projectionLayerInit };
|
|
55
63
|
this._isMultiviewEnabled = this._options.preferMultiviewOnInit && engine.getCaps().multiview;
|
|
56
64
|
this.createProjectionLayer(projectionLayerInit /*, projectionLayerMultiview*/);
|
|
@@ -131,7 +139,7 @@ export class WebXRLayers extends WebXRAbstractFeature {
|
|
|
131
139
|
* Note about making it private - this function will be exposed once I decide on a proper API to support all of the XR layers' options
|
|
132
140
|
* @param options an object providing configuration options for the new XRQuadLayer.
|
|
133
141
|
* @param babylonTexture the texture to display in the layer
|
|
134
|
-
* @returns the quad layer
|
|
142
|
+
* @returns the quad layer, or null when the WebGPU binding lacks quad-layer support
|
|
135
143
|
*/
|
|
136
144
|
_createQuadLayer(options = { params: {} }, babylonTexture) {
|
|
137
145
|
this._extendXRLayerInit(options.params, false);
|
|
@@ -145,11 +153,54 @@ export class WebXRLayers extends WebXRAbstractFeature {
|
|
|
145
153
|
...options.params,
|
|
146
154
|
};
|
|
147
155
|
this._validateLayerInit(populatedParams, false);
|
|
148
|
-
|
|
156
|
+
let quadLayer;
|
|
157
|
+
let wrapper;
|
|
158
|
+
if (this._isWebGPU) {
|
|
159
|
+
const binding = this._xrGPUBinding;
|
|
160
|
+
if (typeof binding.createQuadLayer !== "function") {
|
|
161
|
+
Logger.Warn(WebGPUQuadLayerCreateWarning);
|
|
162
|
+
return null;
|
|
163
|
+
}
|
|
164
|
+
if (typeof binding.getSubImage !== "function") {
|
|
165
|
+
Logger.Warn(WebGPUQuadLayerSubImageWarning);
|
|
166
|
+
return null;
|
|
167
|
+
}
|
|
168
|
+
const gpuParams = {
|
|
169
|
+
colorFormat: binding.getPreferredColorFormat(),
|
|
170
|
+
// GPUTextureUsage.RENDER_ATTACHMENT (0x10) is requested explicitly. The usage of a
|
|
171
|
+
// compositor-owned sub-image texture is not a valid source for layer creation flags.
|
|
172
|
+
textureUsage: 0x10,
|
|
173
|
+
space: populatedParams.space,
|
|
174
|
+
viewPixelWidth: populatedParams.viewPixelWidth,
|
|
175
|
+
viewPixelHeight: populatedParams.viewPixelHeight,
|
|
176
|
+
};
|
|
177
|
+
if (populatedParams.layout !== undefined) {
|
|
178
|
+
gpuParams.layout = populatedParams.layout;
|
|
179
|
+
}
|
|
180
|
+
if (populatedParams.mipLevels !== undefined) {
|
|
181
|
+
gpuParams.mipLevels = populatedParams.mipLevels;
|
|
182
|
+
}
|
|
183
|
+
if (populatedParams.isStatic !== undefined) {
|
|
184
|
+
gpuParams.isStatic = populatedParams.isStatic;
|
|
185
|
+
}
|
|
186
|
+
if (populatedParams.transform !== undefined) {
|
|
187
|
+
gpuParams.transform = populatedParams.transform;
|
|
188
|
+
}
|
|
189
|
+
if (populatedParams.width !== undefined) {
|
|
190
|
+
gpuParams.width = populatedParams.width;
|
|
191
|
+
}
|
|
192
|
+
if (populatedParams.height !== undefined) {
|
|
193
|
+
gpuParams.height = populatedParams.height;
|
|
194
|
+
}
|
|
195
|
+
quadLayer = binding.createQuadLayer(gpuParams);
|
|
196
|
+
wrapper = new WebXRWebGPUCompositionLayerWrapper(() => quadLayer.width, () => quadLayer.height, quadLayer, "XRQuadLayer", false, (sessionManager) => new WebXRWebGPUCompositionLayerRenderTargetTextureProvider(sessionManager, binding, wrapper));
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
quadLayer = this._xrWebGLBinding.createQuadLayer(populatedParams);
|
|
200
|
+
wrapper = new WebXRCompositionLayerWrapper(() => quadLayer.width, () => quadLayer.height, quadLayer, "XRQuadLayer", false, (sessionManager) => new WebXRCompositionLayerRenderTargetTextureProvider(sessionManager, this._xrWebGLBinding, wrapper));
|
|
201
|
+
}
|
|
149
202
|
quadLayer.width = this._isMultiviewEnabled ? 1 : 2;
|
|
150
203
|
quadLayer.height = 1;
|
|
151
|
-
// this wrapper is not really needed, but it's here for consistency
|
|
152
|
-
const wrapper = new WebXRCompositionLayerWrapper(() => quadLayer.width, () => quadLayer.height, quadLayer, "XRQuadLayer", false, (sessionManager) => new WebXRCompositionLayerRenderTargetTextureProvider(sessionManager, this._xrWebGLBinding, wrapper));
|
|
153
204
|
if (babylonTexture) {
|
|
154
205
|
this._compositionLayerTextureMapping.set(quadLayer, babylonTexture);
|
|
155
206
|
}
|
|
@@ -164,7 +215,7 @@ export class WebXRLayers extends WebXRAbstractFeature {
|
|
|
164
215
|
* Note that no interaction will be available with the ADT when using this method
|
|
165
216
|
* @param texture the texture to display in the layer
|
|
166
217
|
* @param options optional parameters for the layer
|
|
167
|
-
* @returns a composition layer containing the texture
|
|
218
|
+
* @returns a composition layer containing the texture, or null when WebGPU quad layers are unavailable
|
|
168
219
|
*/
|
|
169
220
|
addFullscreenAdvancedDynamicTexture(texture, options = { distanceFromHeadset: 1.5 }) {
|
|
170
221
|
const wrapper = this._createQuadLayer({
|
|
@@ -174,6 +225,9 @@ export class WebXRLayers extends WebXRAbstractFeature {
|
|
|
174
225
|
layout: "mono",
|
|
175
226
|
},
|
|
176
227
|
}, texture);
|
|
228
|
+
if (!wrapper) {
|
|
229
|
+
return null;
|
|
230
|
+
}
|
|
177
231
|
const layer = wrapper.layer;
|
|
178
232
|
const distance = Math.max(0.1, options.distanceFromHeadset);
|
|
179
233
|
const pos = { x: 0, y: 0, z: -distance };
|
|
@@ -216,7 +270,7 @@ export class WebXRLayers extends WebXRAbstractFeature {
|
|
|
216
270
|
* Note - this will remove the lens flare system from the scene and add it to the XR scene.
|
|
217
271
|
* This feature is experimental and might change in the future.
|
|
218
272
|
* @param flareSystem the flare system to add
|
|
219
|
-
* @returns a composition layer containing the flare system
|
|
273
|
+
* @returns a composition layer containing the flare system, or null when WebGPU quad layers are unavailable
|
|
220
274
|
*/
|
|
221
275
|
_addLensFlareSystem(flareSystem) {
|
|
222
276
|
const wrapper = this._createQuadLayer({
|
|
@@ -226,6 +280,9 @@ export class WebXRLayers extends WebXRAbstractFeature {
|
|
|
226
280
|
layout: "mono",
|
|
227
281
|
},
|
|
228
282
|
});
|
|
283
|
+
if (!wrapper) {
|
|
284
|
+
return null;
|
|
285
|
+
}
|
|
229
286
|
const layer = wrapper.layer;
|
|
230
287
|
layer.width = 2;
|
|
231
288
|
layer.height = 1;
|