@onerjs/core 8.55.9 → 8.56.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (187) hide show
  1. package/AudioV2/webAudio/webAudioEngine.d.ts +7 -0
  2. package/AudioV2/webAudio/webAudioEngine.js +6 -5
  3. package/AudioV2/webAudio/webAudioEngine.js.map +1 -1
  4. package/Culling/Helper/boundingInfoHelper.js +8 -4
  5. package/Culling/Helper/boundingInfoHelper.js.map +1 -1
  6. package/Engines/AbstractEngine/abstractEngine.textureLoaders.d.ts +5 -1
  7. package/Engines/AbstractEngine/abstractEngine.textureLoaders.js +7 -3
  8. package/Engines/AbstractEngine/abstractEngine.textureLoaders.js.map +1 -1
  9. package/Engines/AbstractEngine/abstractEngine.textureLoaders.pure.d.ts +6 -0
  10. package/Engines/AbstractEngine/abstractEngine.textureLoaders.pure.js +16 -0
  11. package/Engines/AbstractEngine/abstractEngine.textureLoaders.pure.js.map +1 -0
  12. package/Engines/AbstractEngine/pure.d.ts +1 -0
  13. package/Engines/AbstractEngine/pure.js +1 -0
  14. package/Engines/AbstractEngine/pure.js.map +1 -1
  15. package/Engines/IDrawContext.d.ts +2 -0
  16. package/Engines/IDrawContext.js.map +1 -1
  17. package/Engines/WebGPU/webgpuDrawContext.d.ts +8 -0
  18. package/Engines/WebGPU/webgpuDrawContext.js +15 -0
  19. package/Engines/WebGPU/webgpuDrawContext.js.map +1 -1
  20. package/Engines/abstractEngine.pure.js +2 -2
  21. package/Engines/abstractEngine.pure.js.map +1 -1
  22. package/Engines/engine.d.ts +11 -3
  23. package/Engines/webgpuEngine.d.ts +1 -0
  24. package/Engines/webgpuEngine.js +1 -0
  25. package/Engines/webgpuEngine.js.map +1 -1
  26. package/Engines/webgpuEngine.pure.d.ts +10 -0
  27. package/Engines/webgpuEngine.pure.js +15 -1
  28. package/Engines/webgpuEngine.pure.js.map +1 -1
  29. package/FrameGraph/Tasks/Rendering/iblShadowsRendererTask.pure.js +2 -5
  30. package/FrameGraph/Tasks/Rendering/iblShadowsRendererTask.pure.js.map +1 -1
  31. package/Materials/Node/Blocks/Fragment/imageProcessingBlock.pure.js +2 -0
  32. package/Materials/Node/Blocks/Fragment/imageProcessingBlock.pure.js.map +1 -1
  33. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.pure.js +1 -0
  34. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.pure.js.map +1 -1
  35. package/Materials/Node/Blocks/powBlock.pure.js +2 -1
  36. package/Materials/Node/Blocks/powBlock.pure.js.map +1 -1
  37. package/Materials/Node/Blocks/triPlanarBlock.pure.js +14 -12
  38. package/Materials/Node/Blocks/triPlanarBlock.pure.js.map +1 -1
  39. package/Materials/Node/nodeMaterial.pure.d.ts +1 -0
  40. package/Materials/Node/nodeMaterialBuildState.d.ts +3 -3
  41. package/Materials/PBR/openpbrMaterial.pure.d.ts +1 -0
  42. package/Materials/PBR/pbrBaseMaterial.pure.d.ts +1 -0
  43. package/Materials/Textures/index.d.ts +1 -0
  44. package/Materials/Textures/index.js +1 -0
  45. package/Materials/Textures/index.js.map +1 -1
  46. package/Materials/drawWrapper.js +3 -0
  47. package/Materials/drawWrapper.js.map +1 -1
  48. package/Materials/imageProcessingConfiguration.defines.d.ts +3 -0
  49. package/Materials/imageProcessingConfiguration.defines.js +2 -0
  50. package/Materials/imageProcessingConfiguration.defines.js.map +1 -1
  51. package/Materials/imageProcessingConfiguration.functions.js +3 -0
  52. package/Materials/imageProcessingConfiguration.functions.js.map +1 -1
  53. package/Materials/imageProcessingConfiguration.pure.d.ts +58 -0
  54. package/Materials/imageProcessingConfiguration.pure.js +123 -2
  55. package/Materials/imageProcessingConfiguration.pure.js.map +1 -1
  56. package/Materials/standardMaterial.pure.d.ts +1 -0
  57. package/Materials/uniformBuffer.d.ts +29 -0
  58. package/Materials/uniformBuffer.js +146 -0
  59. package/Materials/uniformBuffer.js.map +1 -1
  60. package/Maths/colorTemperature.functions.d.ts +29 -0
  61. package/Maths/colorTemperature.functions.js +196 -0
  62. package/Maths/colorTemperature.functions.js.map +1 -0
  63. package/Maths/index.d.ts +1 -0
  64. package/Maths/index.js +1 -0
  65. package/Maths/index.js.map +1 -1
  66. package/Maths/pure.d.ts +1 -0
  67. package/Maths/pure.js +1 -0
  68. package/Maths/pure.js.map +1 -1
  69. package/Misc/observable.pure.js +1 -3
  70. package/Misc/observable.pure.js.map +1 -1
  71. package/Misc/tools.pure.js +1 -1
  72. package/Misc/tools.pure.js.map +1 -1
  73. package/PostProcesses/imageProcessingPostProcess.d.ts +41 -1
  74. package/PostProcesses/imageProcessingPostProcess.js +41 -1
  75. package/PostProcesses/imageProcessingPostProcess.js.map +1 -1
  76. package/PostProcesses/thinImageProcessingPostProcess.d.ts +50 -0
  77. package/PostProcesses/thinImageProcessingPostProcess.js +65 -0
  78. package/PostProcesses/thinImageProcessingPostProcess.js.map +1 -1
  79. package/Rendering/IBLShadows/iblShadowsMaterialCompatibility.pure.d.ts +12 -0
  80. package/Rendering/IBLShadows/iblShadowsMaterialCompatibility.pure.js +22 -0
  81. package/Rendering/IBLShadows/iblShadowsMaterialCompatibility.pure.js.map +1 -0
  82. package/Rendering/IBLShadows/iblShadowsPluginMaterial.pure.d.ts +1 -0
  83. package/Rendering/IBLShadows/iblShadowsPluginMaterial.pure.js +39 -0
  84. package/Rendering/IBLShadows/iblShadowsPluginMaterial.pure.js.map +1 -1
  85. package/Rendering/IBLShadows/iblShadowsRenderPipeline.pure.js +2 -4
  86. package/Rendering/IBLShadows/iblShadowsRenderPipeline.pure.js.map +1 -1
  87. package/Rendering/IBLShadows/pure.d.ts +1 -0
  88. package/Rendering/IBLShadows/pure.js +1 -0
  89. package/Rendering/IBLShadows/pure.js.map +1 -1
  90. package/Rendering/fluidRenderer/fluidRenderingObject.d.ts +11 -0
  91. package/Rendering/fluidRenderer/fluidRenderingObject.js +36 -14
  92. package/Rendering/fluidRenderer/fluidRenderingObject.js.map +1 -1
  93. package/Rendering/fluidRenderer/fluidRenderingObjectCustomParticles.d.ts +5 -0
  94. package/Rendering/fluidRenderer/fluidRenderingObjectCustomParticles.js +16 -3
  95. package/Rendering/fluidRenderer/fluidRenderingObjectCustomParticles.js.map +1 -1
  96. package/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.d.ts +5 -0
  97. package/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.js +12 -0
  98. package/Rendering/fluidRenderer/fluidRenderingObjectParticleSystem.js.map +1 -1
  99. package/Rendering/iblCdfGenerator.js +10 -1
  100. package/Rendering/iblCdfGenerator.js.map +1 -1
  101. package/Shaders/ShadersInclude/hdrFilteringFunctions.js +1 -1
  102. package/Shaders/ShadersInclude/hdrFilteringFunctions.js.map +1 -1
  103. package/Shaders/ShadersInclude/helperFunctions.js +2 -2
  104. package/Shaders/ShadersInclude/helperFunctions.js.map +1 -1
  105. package/Shaders/ShadersInclude/imageProcessingDeclaration.js +3 -0
  106. package/Shaders/ShadersInclude/imageProcessingDeclaration.js.map +1 -1
  107. package/Shaders/ShadersInclude/imageProcessingFunctions.js +3 -0
  108. package/Shaders/ShadersInclude/imageProcessingFunctions.js.map +1 -1
  109. package/Shaders/ShadersInclude/openpbrDirectLighting.js +34 -4
  110. package/Shaders/ShadersInclude/openpbrDirectLighting.js.map +1 -1
  111. package/Shaders/ShadersInclude/openpbrIblFunctions.js +8 -2
  112. package/Shaders/ShadersInclude/openpbrIblFunctions.js.map +1 -1
  113. package/Shaders/ShadersInclude/pbrDirectLightingFunctions.js +5 -0
  114. package/Shaders/ShadersInclude/pbrDirectLightingFunctions.js.map +1 -1
  115. package/Shaders/fluidRenderingParticleDepth.vertex.js +7 -1
  116. package/Shaders/fluidRenderingParticleDepth.vertex.js.map +1 -1
  117. package/Shaders/fluidRenderingParticleDiffuse.vertex.js +7 -1
  118. package/Shaders/fluidRenderingParticleDiffuse.vertex.js.map +1 -1
  119. package/Shaders/fluidRenderingParticleThickness.vertex.js +7 -1
  120. package/Shaders/fluidRenderingParticleThickness.vertex.js.map +1 -1
  121. package/ShadersWGSL/ShadersInclude/imageProcessingDeclaration.js +3 -0
  122. package/ShadersWGSL/ShadersInclude/imageProcessingDeclaration.js.map +1 -1
  123. package/ShadersWGSL/ShadersInclude/imageProcessingFunctions.js +3 -0
  124. package/ShadersWGSL/ShadersInclude/imageProcessingFunctions.js.map +1 -1
  125. package/ShadersWGSL/ShadersInclude/openpbrDirectLighting.js +35 -5
  126. package/ShadersWGSL/ShadersInclude/openpbrDirectLighting.js.map +1 -1
  127. package/ShadersWGSL/ShadersInclude/openpbrDirectLightingInit.js +1 -1
  128. package/ShadersWGSL/ShadersInclude/openpbrDirectLightingInit.js.map +1 -1
  129. package/ShadersWGSL/ShadersInclude/openpbrIblFunctions.js +8 -2
  130. package/ShadersWGSL/ShadersInclude/openpbrIblFunctions.js.map +1 -1
  131. package/ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions.js +5 -0
  132. package/ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions.js.map +1 -1
  133. package/ShadersWGSL/fluidRenderingParticleDepth.vertex.js +16 -4
  134. package/ShadersWGSL/fluidRenderingParticleDepth.vertex.js.map +1 -1
  135. package/ShadersWGSL/fluidRenderingParticleDiffuse.vertex.js +15 -3
  136. package/ShadersWGSL/fluidRenderingParticleDiffuse.vertex.js.map +1 -1
  137. package/ShadersWGSL/fluidRenderingParticleThickness.vertex.js +15 -3
  138. package/ShadersWGSL/fluidRenderingParticleThickness.vertex.js.map +1 -1
  139. package/XR/features/Layers/WebXRCompositionLayer.d.ts +52 -0
  140. package/XR/features/Layers/WebXRCompositionLayer.js +80 -0
  141. package/XR/features/Layers/WebXRCompositionLayer.js.map +1 -1
  142. package/XR/features/WebXRControllerPointerSelection.pure.js +2 -1
  143. package/XR/features/WebXRControllerPointerSelection.pure.js.map +1 -1
  144. package/XR/features/WebXRControllerTeleportation.pure.js +2 -1
  145. package/XR/features/WebXRControllerTeleportation.pure.js.map +1 -1
  146. package/XR/features/WebXRDepthSensing.pure.d.ts +21 -0
  147. package/XR/features/WebXRDepthSensing.pure.js +42 -0
  148. package/XR/features/WebXRDepthSensing.pure.js.map +1 -1
  149. package/XR/features/WebXRHandTracking.pure.js +2 -0
  150. package/XR/features/WebXRHandTracking.pure.js.map +1 -1
  151. package/XR/features/WebXRLayers.pure.d.ts +12 -0
  152. package/XR/features/WebXRLayers.pure.js +31 -1
  153. package/XR/features/WebXRLayers.pure.js.map +1 -1
  154. package/XR/features/WebXRTrackedSources.d.ts +5 -0
  155. package/XR/features/WebXRTrackedSources.js +8 -0
  156. package/XR/features/WebXRTrackedSources.js.map +1 -0
  157. package/XR/features/WebXRTrackedSources.pure.d.ts +70 -0
  158. package/XR/features/WebXRTrackedSources.pure.js +153 -0
  159. package/XR/features/WebXRTrackedSources.pure.js.map +1 -0
  160. package/XR/features/index.d.ts +1 -0
  161. package/XR/features/index.js +1 -0
  162. package/XR/features/index.js.map +1 -1
  163. package/XR/features/pure.d.ts +1 -0
  164. package/XR/features/pure.js +1 -0
  165. package/XR/features/pure.js.map +1 -1
  166. package/XR/motionController/webXRAbstractMotionController.d.ts +53 -1
  167. package/XR/motionController/webXRAbstractMotionController.js +61 -0
  168. package/XR/motionController/webXRAbstractMotionController.js.map +1 -1
  169. package/XR/webXRDefaultExperience.js +8 -4
  170. package/XR/webXRDefaultExperience.js.map +1 -1
  171. package/XR/webXRExperienceHelper.js +86 -44
  172. package/XR/webXRExperienceHelper.js.map +1 -1
  173. package/XR/webXRFeaturesManager.d.ts +9 -0
  174. package/XR/webXRFeaturesManager.js +4 -0
  175. package/XR/webXRFeaturesManager.js.map +1 -1
  176. package/XR/webXRGraphicsBinding.d.ts +29 -0
  177. package/XR/webXRGraphicsBinding.js +40 -0
  178. package/XR/webXRGraphicsBinding.js.map +1 -1
  179. package/XR/webXRInputSource.js +1 -1
  180. package/XR/webXRInputSource.js.map +1 -1
  181. package/XR/webXRLayerWrapper.d.ts +7 -5
  182. package/XR/webXRLayerWrapper.js +10 -7
  183. package/XR/webXRLayerWrapper.js.map +1 -1
  184. package/XR/webXRSessionManager.d.ts +45 -0
  185. package/XR/webXRSessionManager.js +174 -29
  186. package/XR/webXRSessionManager.js.map +1 -1
  187. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"WebXRLayers.pure.js","sourceRoot":"","sources":["../../../../../dev/core/src/XR/features/WebXRLayers.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 { WebXRAbstractFeature } from \"./WebXRAbstractFeature\";\r\nimport { type WebXRLayerWrapper, type WebXRSupportedLayerType } from \"../webXRLayerWrapper\";\r\nimport { type WebXRLayerRenderTargetTextureProvider } from \"../webXRRenderTargetTextureProvider\";\r\nimport { WebXRWebGLLayerWrapper } from \"../webXRWebGLLayer\";\r\nimport { WebXRProjectionLayerWrapper, DefaultXRProjectionLayerInit } from \"./Layers/WebXRProjectionLayer\";\r\nimport {\r\n WebXRCompositionLayerRenderTargetTextureProvider,\r\n WebXRCompositionLayerWrapper,\r\n WebXRCubeLayerWrapper,\r\n WebXRMediaLayerWrapper,\r\n WebXRSpatialLayerWrapper,\r\n type WebXRSpatialLayer,\r\n type WebXRSpatialLayerType,\r\n} from \"./Layers/WebXRCompositionLayer\";\r\nimport { WebXRWebGPUProjectionLayerWrapper, CreateDefaultXRGPUProjectionLayerInit } from \"./Layers/WebXRWebGPUProjectionLayer\";\r\nimport { WebXRWebGPUCompositionLayerRenderTargetTextureProvider } from \"./Layers/WebXRWebGPUCompositionLayer\";\r\nimport { WebXRGraphicsBindingType } from \"../webXRGraphicsBinding\";\r\nimport { type ThinTexture } from \"../../Materials/Textures/thinTexture\";\r\nimport { type RenderTargetTexture } from \"../../Materials/Textures/renderTargetTexture.pure\";\r\nimport { type DynamicTexture } from \"../../Materials/Textures/dynamicTexture.pure\";\r\nimport { Color4 } from \"../../Maths/math.color.pure\";\r\nimport { type LensFlareSystem } from \"../../LensFlares/lensFlareSystem\";\r\nimport { Logger } from \"../../Misc/logger\";\r\nimport { type Nullable } from \"../../types\";\r\nimport { type Observer } from \"../../Misc/observable.pure\";\r\nimport { type Scene } from \"../../scene.pure\";\r\nimport { TransformNode } from \"../../Meshes/transformNode.pure\";\r\nimport { Quaternion } from \"../../Maths/math.vector.pure\";\r\nimport { type BaseTexture } from \"../../Materials/Textures/baseTexture\";\r\nimport { type WebXRFallbackLayerWrapper, type IWebXRFallbackLayerDimensions } from \"./Layers/WebXRFallbackLayer\";\r\n\r\nexport { WebXRCompositionLayerWrapper, WebXRCubeLayerWrapper, WebXRMediaLayerWrapper, WebXRSpatialLayerWrapper } from \"./Layers/WebXRCompositionLayer\";\r\nexport type { WebXRSpatialLayer, WebXRSpatialLayerType } from \"./Layers/WebXRCompositionLayer\";\r\nexport type { IWebXRFallbackLayerDimensions, WebXRFallbackLayerWrapper } from \"./Layers/WebXRFallbackLayer\";\r\n\r\nconst DefaultXRWebGLLayerInit: XRWebGLLayerInit = {};\r\nconst WebGPUQuadLayerCreateWarning =\r\n \"WebGPU XR quad layers are unavailable because XRGPUBinding.createQuadLayer is not supported; the requested quad layer was skipped and projection rendering remains active.\";\r\nconst WebGPUQuadLayerSubImageWarning =\r\n \"WebGPU XR quad layers are unavailable because XRGPUBinding.getSubImage is not supported; the requested quad layer was skipped and projection rendering remains active.\";\r\n\r\ntype WebXRGraphicsLayerInit = XRLayerInit & { textureType?: XRTextureType };\r\ntype WebXRGPUGraphicsLayerInit = XRGPULayerInit;\r\n\r\n/**\r\n * Configuration options of the layers feature\r\n */\r\nexport interface IWebXRLayersOptions {\r\n /**\r\n * Whether to try initializing the base projection layer as a multiview render target, if multiview is supported.\r\n * Defaults to false.\r\n */\r\n preferMultiviewOnInit?: boolean;\r\n\r\n /**\r\n * Optional configuration for the base projection layer.\r\n */\r\n projectionLayerInit?: Partial<XRProjectionLayerInit>;\r\n}\r\n\r\n/**\r\n * Common options for creating a graphics-backed WebXR composition layer.\r\n * @typeParam TWebGLInit the WebGL layer initialization dictionary\r\n * @typeParam TWebGPUInit the WebGPU layer initialization dictionary\r\n */\r\nexport interface IWebXRCompositionLayerCreationOptions<TWebGLInit, TWebGPUInit> {\r\n /**\r\n * Initialization values shared with the WebGL Layers API.\r\n * Babylon supplies the current reference space and projection-layer pixel dimensions when omitted.\r\n */\r\n layerInit?: Partial<TWebGLInit>;\r\n /**\r\n * WebGPU-specific initialization overrides.\r\n * Shared spatial and layout values are copied from `layerInit` before these overrides are applied.\r\n */\r\n gpuLayerInit?: Partial<TWebGPUInit>;\r\n /**\r\n * A Babylon node whose world position and rotation will be synchronized with the layer.\r\n * Babylon creates and owns a node when this is omitted.\r\n */\r\n transformNode?: TransformNode;\r\n /**\r\n * Uses a Babylon mesh when the requested native layer factory is unavailable.\r\n * Import `@babylonjs/core/XR/features/WebXRLayersFallback` to enable this optional fallback.\r\n * Fallback is disabled by default.\r\n */\r\n fallbackMode?: \"none\" | \"mesh\";\r\n /**\r\n * A texture to display on the fallback mesh.\r\n * Required when `fallbackMode` is `\"mesh\"`.\r\n */\r\n fallbackTexture?: BaseTexture;\r\n}\r\n\r\n/**\r\n * Common options for creating an XRMediaBinding layer.\r\n * @typeParam InitT the media layer initialization dictionary\r\n */\r\nexport interface IWebXRMediaLayerCreationOptions<InitT> {\r\n /**\r\n * Initialization values for the media layer.\r\n * Babylon supplies the current reference space when omitted.\r\n */\r\n layerInit?: Partial<InitT>;\r\n /**\r\n * A Babylon node whose world position and rotation will be synchronized with the layer.\r\n * Babylon creates and owns a node when this is omitted.\r\n */\r\n transformNode?: TransformNode;\r\n /**\r\n * Uses a Babylon mesh and VideoTexture when XRMediaBinding is unavailable.\r\n * Import `@babylonjs/core/XR/features/WebXRLayersFallback` to enable this optional fallback.\r\n * Fallback is disabled by default.\r\n */\r\n fallbackMode?: \"none\" | \"mesh\";\r\n}\r\n\r\n/**\r\n * Selects whether a layer is created from a graphics binding or directly from a media element.\r\n */\r\nexport type WebXRLayerSource = \"graphics\" | \"media\";\r\n\r\n/**\r\n * The result of creating a spatial WebXR layer.\r\n * Native wrappers expose an XR composition layer, while fallback wrappers expose a Babylon mesh.\r\n * @typeParam LayerT the native layer type\r\n */\r\nexport type WebXRLayerCreationResult<LayerT extends WebXRSpatialLayer, LayerTypeT extends WebXRSpatialLayerType = WebXRSpatialLayerType> =\r\n WebXRSpatialLayerWrapper<LayerT, LayerTypeT> | WebXRFallbackLayerWrapper;\r\n\r\n/**\r\n * Data supplied to an optional WebXR mesh-fallback implementation.\r\n * @internal\r\n */\r\nexport interface IWebXRFallbackLayerCreationContext {\r\n scene: WebXRSessionManager[\"scene\"];\r\n isWebGPU: boolean;\r\n layerType: WebXRSpatialLayerType;\r\n transformNode: TransformNode;\r\n ownsTransformNode: boolean;\r\n dimensions: IWebXRFallbackLayerDimensions;\r\n worldScalingFactor: number;\r\n texture?: BaseTexture;\r\n video?: HTMLVideoElement;\r\n}\r\n\r\nlet _FallbackLayerFactory: Nullable<(context: IWebXRFallbackLayerCreationContext) => Nullable<WebXRFallbackLayerWrapper>> = null;\r\n\r\n/**\r\n * Registers the optional mesh-fallback implementation without making its rendering dependencies part of projection-only bundles.\r\n * @param factory creates a fallback wrapper\r\n * @internal\r\n */\r\nexport function _RegisterWebXRFallbackLayerFactory(factory: (context: IWebXRFallbackLayerCreationContext) => Nullable<WebXRFallbackLayerWrapper>): void {\r\n _FallbackLayerFactory = factory;\r\n}\r\n\r\n/**\r\n * Exposes the WebXR Layers API.\r\n */\r\nexport class WebXRLayers extends WebXRAbstractFeature {\r\n /**\r\n * The module's name\r\n */\r\n public static readonly Name = WebXRFeatureName.LAYERS;\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 * Already-created layers\r\n */\r\n private _existingLayers: WebXRLayerWrapper<WebXRSupportedLayerType>[] = [];\r\n private _fallbackLayers: WebXRFallbackLayerWrapper[] = [];\r\n\r\n private _glContext: WebGLRenderingContext | WebGL2RenderingContext;\r\n private _xrWebGLBinding: XRWebGLBinding;\r\n private _isWebGPU = false;\r\n private _xrGPUBinding?: XRGPUBinding;\r\n private _xrMediaBinding?: XRMediaBinding;\r\n private _isMultiviewEnabled = false;\r\n private _projectionLayerInitialized = false;\r\n\r\n private _compositionLayerTextureMapping: WeakMap<XRCompositionLayer, ThinTexture> = new WeakMap();\r\n private _layerToRTTProviderMapping: WeakMap<XRCompositionLayer, WebXRLayerRenderTargetTextureProvider<WebXRSupportedLayerType>> = new WeakMap();\r\n private _layerCleanupFunctions = new WeakMap<WebXRLayerWrapper<WebXRSupportedLayerType>, () => void>();\r\n\r\n constructor(\r\n _xrSessionManager: WebXRSessionManager,\r\n private readonly _options: IWebXRLayersOptions = {}\r\n ) {\r\n super(_xrSessionManager);\r\n this.xrNativeFeatureName = \"layers\";\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 if (!super.attach()) {\r\n return false;\r\n }\r\n\r\n const engine = this._xrSessionManager.scene.getEngine();\r\n this._existingLayers.length = 0;\r\n this._isWebGPU = engine.isWebGPU;\r\n\r\n if (this._isWebGPU) {\r\n const binding = this._xrSessionManager._getGraphicsBinding();\r\n if (binding.bindingType !== WebXRGraphicsBindingType.WebGPU) {\r\n throw new Error(\"Expected a WebGPU graphics binding for a WebGPU engine.\");\r\n }\r\n this._xrGPUBinding = binding.binding;\r\n // Multiview is not yet supported on the WebGPU XR path; force single-view (two sub-images).\r\n this._isMultiviewEnabled = false;\r\n this._createWebGPUProjectionLayer();\r\n } else {\r\n const binding = this._xrSessionManager._getGraphicsBinding();\r\n if (binding.bindingType !== WebXRGraphicsBindingType.WebGL) {\r\n throw new Error(\"Expected a WebGL graphics binding for a WebGL engine.\");\r\n }\r\n this._glContext = binding.context;\r\n this._xrWebGLBinding = binding.binding;\r\n\r\n const projectionLayerInit = { ...DefaultXRProjectionLayerInit, ...this._options.projectionLayerInit };\r\n this._isMultiviewEnabled = this._options.preferMultiviewOnInit && engine.getCaps().multiview;\r\n this.createProjectionLayer(projectionLayerInit /*, projectionLayerMultiview*/);\r\n }\r\n this._projectionLayerInitialized = true;\r\n this._addNewAttachObserver(this._xrSessionManager.onXRReferenceSpaceChanged, (referenceSpace) => {\r\n for (const layer of this._existingLayers) {\r\n if (layer instanceof WebXRSpatialLayerWrapper && layer.usesSessionReferenceSpace) {\r\n layer.layer.space = referenceSpace;\r\n }\r\n }\r\n });\r\n\r\n return true;\r\n }\r\n\r\n public override detach(): boolean {\r\n if (!super.detach()) {\r\n return false;\r\n }\r\n for (const layer of this._existingLayers) {\r\n this._layerCleanupFunctions.get(layer)?.();\r\n layer.dispose();\r\n }\r\n this._existingLayers.length = 0;\r\n for (const layer of this._fallbackLayers) {\r\n layer.dispose();\r\n }\r\n this._fallbackLayers.length = 0;\r\n this._xrMediaBinding = undefined;\r\n this._projectionLayerInitialized = false;\r\n return true;\r\n }\r\n\r\n /**\r\n * Creates a new XRWebGLLayer.\r\n * @param params an object providing configuration options for the new XRWebGLLayer\r\n * @returns the XRWebGLLayer\r\n */\r\n public createXRWebGLLayer(params = DefaultXRWebGLLayerInit): WebXRWebGLLayerWrapper {\r\n const layer = new XRWebGLLayer(this._xrSessionManager.session, this._glContext, params);\r\n return new WebXRWebGLLayerWrapper(layer);\r\n }\r\n\r\n private _validateLayerInit(params: XRProjectionLayerInit | WebXRGraphicsLayerInit, multiview = this._isMultiviewEnabled, allowTextureArrayWithoutMultiview = false): void {\r\n // check if we are in session\r\n if (!this._xrSessionManager.inXRSession) {\r\n throw new Error(\"Cannot create a layer outside of a WebXR session. Make sure the session has started before creating layers.\");\r\n }\r\n if (multiview && params.textureType !== \"texture-array\") {\r\n throw new Error(\"Projection layers can only be made multiview if they use texture arrays. Set the textureType parameter to 'texture-array'.\");\r\n }\r\n\r\n // TODO (rgerd): Support RTT's that are bound to sub-images in the texture array.\r\n if (!multiview && params.textureType === \"texture-array\" && !allowTextureArrayWithoutMultiview) {\r\n throw new Error(\"We currently only support multiview rendering when the textureType parameter is set to 'texture-array'.\");\r\n }\r\n }\r\n\r\n private _extendXRLayerInit<T extends XRProjectionLayerInit | WebXRGraphicsLayerInit>(params: T, multiview = this._isMultiviewEnabled): T {\r\n if (multiview) {\r\n params.textureType = \"texture-array\";\r\n }\r\n return params;\r\n }\r\n\r\n private _getProjectionLayerDimensions(): { width: number; height: number } {\r\n const projectionLayer = this._existingLayers.find((layer) => layer.layerType === \"XRProjectionLayer\");\r\n if (!projectionLayer) {\r\n throw new Error(\"A projection layer must be created before adding WebXR composition layers.\");\r\n }\r\n return {\r\n width: projectionLayer.getWidth(),\r\n height: projectionLayer.getHeight(),\r\n };\r\n }\r\n\r\n private _createTransformNode(\r\n layerType: WebXRSpatialLayerType,\r\n transformNode: TransformNode | undefined,\r\n transform?: XRRigidTransform,\r\n orientation?: DOMPointReadOnly\r\n ): { node: TransformNode; ownsNode: boolean } {\r\n if (transformNode) {\r\n return { node: transformNode, ownsNode: false };\r\n }\r\n\r\n const node = new TransformNode(`WebXR ${layerType}`, this._xrSessionManager.scene);\r\n node.rotationQuaternion = new Quaternion();\r\n const sourcePosition = transform?.position;\r\n const sourceOrientation = transform?.orientation ?? orientation;\r\n if (sourcePosition) {\r\n const worldScalingFactor = this._xrSessionManager.worldScalingFactor;\r\n node.position.set(sourcePosition.x * worldScalingFactor, sourcePosition.y * worldScalingFactor, sourcePosition.z * worldScalingFactor);\r\n }\r\n if (sourceOrientation) {\r\n node.rotationQuaternion.set(sourceOrientation.x, sourceOrientation.y, sourceOrientation.z, sourceOrientation.w);\r\n }\r\n if (!this._xrSessionManager.scene.useRightHandedSystem) {\r\n node.position.z *= -1;\r\n node.rotationQuaternion.z *= -1;\r\n node.rotationQuaternion.w *= -1;\r\n }\r\n return { node, ownsNode: true };\r\n }\r\n\r\n private _createFallbackLayer(\r\n layerType: WebXRSpatialLayerType,\r\n transformNode: TransformNode | undefined,\r\n transform: XRRigidTransform | undefined,\r\n orientation: DOMPointReadOnly | undefined,\r\n dimensions: IWebXRFallbackLayerDimensions,\r\n texture?: BaseTexture,\r\n video?: HTMLVideoElement\r\n ): Nullable<WebXRFallbackLayerWrapper> {\r\n if (!_FallbackLayerFactory) {\r\n Logger.Warn(\"WebXR mesh fallbacks require importing `@babylonjs/core/XR/features/WebXRLayersFallback`.\");\r\n return null;\r\n }\r\n\r\n const transformInfo = this._createTransformNode(layerType, transformNode, transform, orientation);\r\n const wrapper = _FallbackLayerFactory({\r\n scene: this._xrSessionManager.scene,\r\n isWebGPU: this._isWebGPU,\r\n layerType,\r\n transformNode: transformInfo.node,\r\n ownsTransformNode: transformInfo.ownsNode,\r\n dimensions,\r\n worldScalingFactor: this._xrSessionManager.worldScalingFactor,\r\n texture,\r\n video,\r\n });\r\n if (wrapper) {\r\n this._fallbackLayers.push(wrapper);\r\n } else if (transformInfo.ownsNode) {\r\n transformInfo.node.dispose();\r\n }\r\n return wrapper;\r\n }\r\n\r\n private _createGraphicsLayer<\r\n LayerT extends WebXRSpatialLayer,\r\n LayerTypeT extends WebXRSpatialLayerType,\r\n TWebGLInit extends WebXRGraphicsLayerInit,\r\n TWebGPUInit extends WebXRGPUGraphicsLayerInit,\r\n >(\r\n layerType: LayerTypeT,\r\n factoryName: string,\r\n factorySupported: boolean,\r\n options: IWebXRCompositionLayerCreationOptions<TWebGLInit, TWebGPUInit>,\r\n createWebGLLayer: (binding: XRWebGLBinding, init: TWebGLInit) => LayerT,\r\n createWebGPULayer: (binding: XRGPUBinding, init: TWebGPUInit) => LayerT,\r\n copyWebGPUSpecificInit: (webGLInit: TWebGLInit, webGPUInit: TWebGPUInit) => void\r\n ): Nullable<WebXRSpatialLayerWrapper<LayerT, LayerTypeT>> {\r\n if (!this._xrSessionManager.inXRSession) {\r\n throw new Error(\"Cannot create a layer outside of a WebXR session. Make sure the session has started before creating layers.\");\r\n }\r\n if (!factorySupported) {\r\n if (options.fallbackMode !== \"mesh\") {\r\n Logger.Warn(`${layerType} is unavailable because ${factoryName} is not supported; the requested layer was skipped and projection rendering remains active.`);\r\n }\r\n return null;\r\n }\r\n if (this._isWebGPU && typeof this._xrGPUBinding?.getSubImage !== \"function\") {\r\n if (options.fallbackMode !== \"mesh\") {\r\n Logger.Warn(\r\n `${layerType} is unavailable because XRGPUBinding.getSubImage is not supported; the requested layer was skipped and projection rendering remains active.`\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n const dimensions = this._getProjectionLayerDimensions();\r\n const defaultViewPixelWidth = layerType === \"XRCubeLayer\" ? Math.min(dimensions.width, dimensions.height) : dimensions.width;\r\n const defaultViewPixelHeight = layerType === \"XRCubeLayer\" ? defaultViewPixelWidth : dimensions.height;\r\n const populatedParams = {\r\n space: this._xrSessionManager.referenceSpace,\r\n viewPixelWidth: defaultViewPixelWidth,\r\n viewPixelHeight: defaultViewPixelHeight,\r\n clearOnAccess: true,\r\n textureType: \"texture\",\r\n layout: \"mono\",\r\n ...options.layerInit,\r\n } as TWebGLInit;\r\n if (layerType === \"XRCubeLayer\" && populatedParams.viewPixelWidth !== populatedParams.viewPixelHeight) {\r\n throw new Error(\"WebXR cube layer faces must have equal pixel width and height.\");\r\n }\r\n this._validateLayerInit(populatedParams, false, layerType === \"XRCubeLayer\");\r\n\r\n let layer: LayerT;\r\n let effectiveParams: TWebGLInit | TWebGPUInit = populatedParams;\r\n let depthStencilFormat: GPUTextureFormat | undefined;\r\n if (this._isWebGPU) {\r\n const binding = this._xrGPUBinding!;\r\n const gpuParams = {\r\n colorFormat: binding.getPreferredColorFormat(),\r\n textureUsage: 0x10,\r\n space: populatedParams.space,\r\n viewPixelWidth: populatedParams.viewPixelWidth,\r\n viewPixelHeight: populatedParams.viewPixelHeight,\r\n layout: populatedParams.layout,\r\n mipLevels: populatedParams.mipLevels,\r\n isStatic: populatedParams.isStatic,\r\n } as TWebGPUInit;\r\n copyWebGPUSpecificInit(populatedParams, gpuParams);\r\n Object.assign(gpuParams, options.gpuLayerInit);\r\n if (layerType === \"XRCubeLayer\" && gpuParams.viewPixelWidth !== gpuParams.viewPixelHeight) {\r\n throw new Error(\"WebXR cube layer faces must have equal pixel width and height.\");\r\n }\r\n effectiveParams = gpuParams;\r\n depthStencilFormat = gpuParams.depthStencilFormat;\r\n layer = createWebGPULayer(binding, gpuParams);\r\n } else {\r\n layer = createWebGLLayer(this._xrWebGLBinding, populatedParams);\r\n }\r\n\r\n const transform = \"transform\" in effectiveParams ? (effectiveParams.transform as XRRigidTransform | undefined) : undefined;\r\n const orientation = \"orientation\" in effectiveParams ? (effectiveParams.orientation as DOMPointReadOnly | undefined) : undefined;\r\n const usesSessionReferenceSpace = options.layerInit?.space === undefined && (!this._isWebGPU || options.gpuLayerInit?.space === undefined);\r\n const transformInfo = this._createTransformNode(layerType, options.transformNode, transform, orientation);\r\n let wrapper: WebXRSpatialLayerWrapper<LayerT, LayerTypeT>;\r\n if (layerType === \"XRCubeLayer\") {\r\n wrapper = new WebXRCubeLayerWrapper(\r\n () => effectiveParams.viewPixelWidth,\r\n () => effectiveParams.viewPixelHeight,\r\n layer as XRCubeLayer,\r\n !!effectiveParams.isStatic,\r\n usesSessionReferenceSpace,\r\n this._isWebGPU ? this._xrGPUBinding! : this._xrWebGLBinding,\r\n transformInfo.node,\r\n transformInfo.ownsNode\r\n ) as unknown as WebXRSpatialLayerWrapper<LayerT, LayerTypeT>;\r\n } else if (this._isWebGPU) {\r\n const binding = this._xrGPUBinding!;\r\n wrapper = new WebXRSpatialLayerWrapper(\r\n () => effectiveParams.viewPixelWidth,\r\n () => effectiveParams.viewPixelHeight,\r\n layer,\r\n layerType,\r\n false,\r\n !!effectiveParams.isStatic,\r\n usesSessionReferenceSpace,\r\n (sessionManager) => new WebXRWebGPUCompositionLayerRenderTargetTextureProvider(sessionManager, binding, wrapper, depthStencilFormat),\r\n transformInfo.node,\r\n transformInfo.ownsNode\r\n );\r\n } else {\r\n wrapper = new WebXRSpatialLayerWrapper(\r\n () => effectiveParams.viewPixelWidth,\r\n () => effectiveParams.viewPixelHeight,\r\n layer,\r\n layerType,\r\n false,\r\n !!effectiveParams.isStatic,\r\n usesSessionReferenceSpace,\r\n (sessionManager) => new WebXRCompositionLayerRenderTargetTextureProvider(sessionManager, this._xrWebGLBinding, wrapper),\r\n transformInfo.node,\r\n transformInfo.ownsNode\r\n );\r\n }\r\n\r\n if (wrapper.usesRenderTargetProvider) {\r\n const rttProvider = wrapper.createRenderTargetTextureProvider(this._xrSessionManager);\r\n this._layerToRTTProviderMapping.set(layer, rttProvider);\r\n }\r\n this.addXRSessionLayer(wrapper);\r\n return wrapper;\r\n }\r\n\r\n private _createMediaLayer<\r\n LayerT extends XRQuadLayer | XRCylinderLayer | XREquirectLayer,\r\n LayerTypeT extends Exclude<WebXRSpatialLayerType, \"XRCubeLayer\">,\r\n InitT extends XRMediaLayerInit & { transform?: XRRigidTransform },\r\n >(\r\n layerType: LayerTypeT,\r\n factoryName: string,\r\n video: HTMLVideoElement,\r\n options: IWebXRMediaLayerCreationOptions<InitT>,\r\n createLayer: (binding: XRMediaBinding, video: HTMLVideoElement, init: InitT) => LayerT\r\n ): Nullable<WebXRMediaLayerWrapper<LayerT, LayerTypeT>> {\r\n if (!this._xrSessionManager.inXRSession) {\r\n throw new Error(\"Cannot create a layer outside of a WebXR session. Make sure the session has started before creating layers.\");\r\n }\r\n if (typeof XRMediaBinding === \"undefined\") {\r\n if (options.fallbackMode !== \"mesh\") {\r\n Logger.Warn(`${layerType} media layers are unavailable because XRMediaBinding is not supported; the requested layer was skipped.`);\r\n }\r\n return null;\r\n }\r\n\r\n this._xrMediaBinding ??= new XRMediaBinding(this._xrSessionManager.session);\r\n const mediaBinding = this._xrMediaBinding;\r\n const factory = mediaBinding[factoryName as \"createQuadLayer\" | \"createCylinderLayer\" | \"createEquirectLayer\"];\r\n if (typeof factory !== \"function\") {\r\n if (options.fallbackMode !== \"mesh\") {\r\n Logger.Warn(`${layerType} media layers are unavailable because XRMediaBinding.${factoryName} is not supported; the requested layer was skipped.`);\r\n }\r\n return null;\r\n }\r\n\r\n const populatedParams = {\r\n space: this._xrSessionManager.referenceSpace,\r\n layout: \"mono\",\r\n ...options.layerInit,\r\n } as InitT;\r\n const layer = createLayer(mediaBinding, video, populatedParams);\r\n const transform = \"transform\" in populatedParams ? populatedParams.transform : undefined;\r\n const transformInfo = this._createTransformNode(layerType, options.transformNode, transform);\r\n const wrapper = new WebXRMediaLayerWrapper(\r\n () => video.videoWidth,\r\n () => video.videoHeight,\r\n layer,\r\n layerType,\r\n transformInfo.node,\r\n transformInfo.ownsNode,\r\n options.layerInit?.space === undefined\r\n );\r\n this.addXRSessionLayer(wrapper);\r\n return wrapper;\r\n }\r\n\r\n /**\r\n * Creates a new XRProjectionLayer.\r\n * @param params an object providing configuration options for the new XRProjectionLayer.\r\n * @param multiview whether the projection layer should render with multiview. Will be tru automatically if the extension initialized with multiview.\r\n * @returns the projection layer\r\n */\r\n public createProjectionLayer(params = DefaultXRProjectionLayerInit, multiview = this._isMultiviewEnabled): WebXRProjectionLayerWrapper {\r\n const extendedParams = this._extendXRLayerInit(params, multiview);\r\n this._validateLayerInit(extendedParams, multiview);\r\n\r\n const projLayer = this._xrWebGLBinding.createProjectionLayer(extendedParams);\r\n const layer = new WebXRProjectionLayerWrapper(projLayer, multiview, this._xrWebGLBinding);\r\n this.addXRSessionLayer(layer);\r\n return layer;\r\n }\r\n\r\n /**\r\n * Creates the base projection layer for the WebGPU (XRGPUBinding) backend.\r\n * Single-view only for now (multiview is deferred); the color format is the binding's preferred format.\r\n * @returns the WebGPU projection layer wrapper\r\n */\r\n private _createWebGPUProjectionLayer(): WebXRWebGPUProjectionLayerWrapper {\r\n if (!this._xrSessionManager.inXRSession) {\r\n throw new Error(\"Cannot create a layer outside of a WebXR session. Make sure the session has started before creating layers.\");\r\n }\r\n const binding = this._xrGPUBinding!;\r\n const init = CreateDefaultXRGPUProjectionLayerInit(binding.getPreferredColorFormat());\r\n const projLayer = binding.createProjectionLayer(init);\r\n const layer = new WebXRWebGPUProjectionLayerWrapper(projLayer, false, binding, init.depthStencilFormat);\r\n this.addXRSessionLayer(layer);\r\n return layer;\r\n }\r\n\r\n /**\r\n * Creates a graphics-backed quad layer and adds it to the current XR session.\r\n * @param options initialization and transform-node options for the layer\r\n * @returns the created layer wrapper, or `null` when the active graphics binding does not support quad layers\r\n */\r\n public createQuadLayer(\r\n options: IWebXRCompositionLayerCreationOptions<XRQuadLayerInit, XRGPUQuadLayerInit> = {}\r\n ): Nullable<WebXRLayerCreationResult<XRQuadLayer, \"XRQuadLayer\">> {\r\n const factorySupported = this._isWebGPU ? typeof this._xrGPUBinding?.createQuadLayer === \"function\" : typeof this._xrWebGLBinding.createQuadLayer === \"function\";\r\n const factoryName = this._isWebGPU ? \"XRGPUBinding.createQuadLayer\" : \"XRWebGLBinding.createQuadLayer\";\r\n const nativeLayer = this._createGraphicsLayer(\r\n \"XRQuadLayer\",\r\n factoryName,\r\n factorySupported,\r\n options,\r\n (binding, init) => binding.createQuadLayer(init),\r\n (binding, init) => binding.createQuadLayer(init),\r\n (webGLInit, webGPUInit) => {\r\n webGPUInit.transform = webGLInit.transform;\r\n webGPUInit.width = webGLInit.width;\r\n webGPUInit.height = webGLInit.height;\r\n }\r\n );\r\n if (nativeLayer || options.fallbackMode !== \"mesh\") {\r\n return nativeLayer;\r\n }\r\n return this._createFallbackLayer(\r\n \"XRQuadLayer\",\r\n options.transformNode,\r\n options.layerInit?.transform,\r\n undefined,\r\n { width: options.layerInit?.width, height: options.layerInit?.height },\r\n options.fallbackTexture\r\n );\r\n }\r\n\r\n /**\r\n * Creates a graphics-backed cylinder layer and adds it to the current XR session.\r\n * @param options initialization and transform-node options for the layer\r\n * @returns the created layer wrapper, or `null` when the active graphics binding does not support cylinder layers\r\n */\r\n public createCylinderLayer(\r\n options: IWebXRCompositionLayerCreationOptions<XRCylinderLayerInit, XRGPUCylinderLayerInit> = {}\r\n ): Nullable<WebXRLayerCreationResult<XRCylinderLayer, \"XRCylinderLayer\">> {\r\n const factorySupported = this._isWebGPU ? typeof this._xrGPUBinding?.createCylinderLayer === \"function\" : typeof this._xrWebGLBinding.createCylinderLayer === \"function\";\r\n const factoryName = this._isWebGPU ? \"XRGPUBinding.createCylinderLayer\" : \"XRWebGLBinding.createCylinderLayer\";\r\n const nativeLayer = this._createGraphicsLayer(\r\n \"XRCylinderLayer\",\r\n factoryName,\r\n factorySupported,\r\n options,\r\n (binding, init) => binding.createCylinderLayer(init),\r\n (binding, init) => binding.createCylinderLayer(init),\r\n (webGLInit, webGPUInit) => {\r\n webGPUInit.transform = webGLInit.transform;\r\n webGPUInit.radius = webGLInit.radius;\r\n webGPUInit.centralAngle = webGLInit.centralAngle;\r\n webGPUInit.aspectRatio = webGLInit.aspectRatio;\r\n }\r\n );\r\n if (nativeLayer || options.fallbackMode !== \"mesh\") {\r\n return nativeLayer;\r\n }\r\n return this._createFallbackLayer(\r\n \"XRCylinderLayer\",\r\n options.transformNode,\r\n options.layerInit?.transform,\r\n undefined,\r\n {\r\n radius: options.layerInit?.radius,\r\n centralAngle: options.layerInit?.centralAngle,\r\n aspectRatio: options.layerInit?.aspectRatio,\r\n },\r\n options.fallbackTexture\r\n );\r\n }\r\n\r\n /**\r\n * Creates a graphics-backed equirectangular layer and adds it to the current XR session.\r\n * @param options initialization and transform-node options for the layer\r\n * @returns the created layer wrapper, or `null` when the active graphics binding does not support equirectangular layers\r\n */\r\n public createEquirectLayer(\r\n options: IWebXRCompositionLayerCreationOptions<XREquirectLayerInit, XRGPUEquirectLayerInit> = {}\r\n ): Nullable<WebXRLayerCreationResult<XREquirectLayer, \"XREquirectLayer\">> {\r\n const factorySupported = this._isWebGPU ? typeof this._xrGPUBinding?.createEquirectLayer === \"function\" : typeof this._xrWebGLBinding.createEquirectLayer === \"function\";\r\n const factoryName = this._isWebGPU ? \"XRGPUBinding.createEquirectLayer\" : \"XRWebGLBinding.createEquirectLayer\";\r\n const nativeLayer = this._createGraphicsLayer(\r\n \"XREquirectLayer\",\r\n factoryName,\r\n factorySupported,\r\n options,\r\n (binding, init) => binding.createEquirectLayer(init),\r\n (binding, init) => binding.createEquirectLayer(init),\r\n (webGLInit, webGPUInit) => {\r\n webGPUInit.transform = webGLInit.transform;\r\n webGPUInit.radius = webGLInit.radius;\r\n webGPUInit.centralHorizontalAngle = webGLInit.centralHorizontalAngle;\r\n webGPUInit.upperVerticalAngle = webGLInit.upperVerticalAngle;\r\n webGPUInit.lowerVerticalAngle = webGLInit.lowerVerticalAngle;\r\n }\r\n );\r\n if (nativeLayer || options.fallbackMode !== \"mesh\") {\r\n return nativeLayer;\r\n }\r\n return this._createFallbackLayer(\r\n \"XREquirectLayer\",\r\n options.transformNode,\r\n options.layerInit?.transform,\r\n undefined,\r\n {\r\n radius: options.layerInit?.radius,\r\n centralHorizontalAngle: options.layerInit?.centralHorizontalAngle,\r\n upperVerticalAngle: options.layerInit?.upperVerticalAngle,\r\n lowerVerticalAngle: options.layerInit?.lowerVerticalAngle,\r\n },\r\n options.fallbackTexture\r\n );\r\n }\r\n\r\n /**\r\n * Creates a graphics-backed cube layer and adds it to the current XR session.\r\n * Cube layers synchronize only the rotation of their transform node because the WebXR API does not support cube-layer translation.\r\n * @param options initialization and transform-node options for the layer\r\n * @returns the created layer wrapper, or `null` when the active graphics binding does not support cube layers\r\n */\r\n public createCubeLayer(options: IWebXRCompositionLayerCreationOptions<XRCubeLayerInit, XRGPUCubeLayerInit> = {}): Nullable<WebXRCubeLayerWrapper | WebXRFallbackLayerWrapper> {\r\n const factorySupported = this._isWebGPU ? typeof this._xrGPUBinding?.createCubeLayer === \"function\" : typeof this._xrWebGLBinding.createCubeLayer === \"function\";\r\n const factoryName = this._isWebGPU ? \"XRGPUBinding.createCubeLayer\" : \"XRWebGLBinding.createCubeLayer\";\r\n const nativeLayer = this._createGraphicsLayer(\r\n \"XRCubeLayer\",\r\n factoryName,\r\n factorySupported,\r\n options,\r\n (binding, init) => binding.createCubeLayer(init),\r\n (binding, init) => binding.createCubeLayer(init),\r\n (webGLInit, webGPUInit) => {\r\n webGPUInit.orientation = webGLInit.orientation;\r\n }\r\n ) as Nullable<WebXRCubeLayerWrapper>;\r\n if (nativeLayer || options.fallbackMode !== \"mesh\") {\r\n return nativeLayer;\r\n }\r\n return this._createFallbackLayer(\"XRCubeLayer\", options.transformNode, undefined, options.layerInit?.orientation, {}, options.fallbackTexture);\r\n }\r\n\r\n /**\r\n * Creates a video-backed quad layer and adds it to the current XR session.\r\n * @see https://playground.babylonjs.com/#D35HOL#0\r\n * @param video the video element presented by the XR compositor\r\n * @param options initialization and transform-node options for the layer\r\n * @returns the created media layer wrapper, or `null` when XRMediaBinding is unavailable\r\n */\r\n public createMediaQuadLayer(\r\n video: HTMLVideoElement,\r\n options: IWebXRMediaLayerCreationOptions<XRMediaQuadLayerInit> = {}\r\n ): Nullable<WebXRLayerCreationResult<XRQuadLayer, \"XRQuadLayer\">> {\r\n const nativeLayer = this._createMediaLayer(\"XRQuadLayer\", \"createQuadLayer\", video, options, (binding, media, init) => binding.createQuadLayer(media, init));\r\n if (nativeLayer || options.fallbackMode !== \"mesh\") {\r\n return nativeLayer;\r\n }\r\n return this._createFallbackLayer(\r\n \"XRQuadLayer\",\r\n options.transformNode,\r\n options.layerInit?.transform,\r\n undefined,\r\n { width: options.layerInit?.width, height: options.layerInit?.height },\r\n undefined,\r\n video\r\n );\r\n }\r\n\r\n /**\r\n * Creates a video-backed cylinder layer and adds it to the current XR session.\r\n * @param video the video element presented by the XR compositor\r\n * @param options initialization and transform-node options for the layer\r\n * @returns the created media layer wrapper, or `null` when XRMediaBinding is unavailable\r\n */\r\n public createMediaCylinderLayer(\r\n video: HTMLVideoElement,\r\n options: IWebXRMediaLayerCreationOptions<XRMediaCylinderLayerInit> = {}\r\n ): Nullable<WebXRLayerCreationResult<XRCylinderLayer, \"XRCylinderLayer\">> {\r\n const nativeLayer = this._createMediaLayer(\"XRCylinderLayer\", \"createCylinderLayer\", video, options, (binding, media, init) => binding.createCylinderLayer(media, init));\r\n if (nativeLayer || options.fallbackMode !== \"mesh\") {\r\n return nativeLayer;\r\n }\r\n return this._createFallbackLayer(\r\n \"XRCylinderLayer\",\r\n options.transformNode,\r\n options.layerInit?.transform,\r\n undefined,\r\n {\r\n radius: options.layerInit?.radius,\r\n centralAngle: options.layerInit?.centralAngle,\r\n aspectRatio: options.layerInit?.aspectRatio,\r\n },\r\n undefined,\r\n video\r\n );\r\n }\r\n\r\n /**\r\n * Creates a video-backed equirectangular layer and adds it to the current XR session.\r\n * @param video the video element presented by the XR compositor\r\n * @param options initialization and transform-node options for the layer\r\n * @returns the created media layer wrapper, or `null` when XRMediaBinding is unavailable\r\n */\r\n public createMediaEquirectLayer(\r\n video: HTMLVideoElement,\r\n options: IWebXRMediaLayerCreationOptions<XRMediaEquirectLayerInit> = {}\r\n ): Nullable<WebXRLayerCreationResult<XREquirectLayer, \"XREquirectLayer\">> {\r\n const nativeLayer = this._createMediaLayer(\"XREquirectLayer\", \"createEquirectLayer\", video, options, (binding, media, init) => binding.createEquirectLayer(media, init));\r\n if (nativeLayer || options.fallbackMode !== \"mesh\") {\r\n return nativeLayer;\r\n }\r\n return this._createFallbackLayer(\r\n \"XREquirectLayer\",\r\n options.transformNode,\r\n options.layerInit?.transform,\r\n undefined,\r\n {\r\n radius: options.layerInit?.radius,\r\n centralHorizontalAngle: options.layerInit?.centralHorizontalAngle,\r\n upperVerticalAngle: options.layerInit?.upperVerticalAngle,\r\n lowerVerticalAngle: options.layerInit?.lowerVerticalAngle,\r\n },\r\n undefined,\r\n video\r\n );\r\n }\r\n\r\n private _createQuadLayer(\r\n options: { params: Partial<XRQuadLayerInit> } = { params: {} },\r\n babylonTexture?: ThinTexture\r\n ): Nullable<WebXRSpatialLayerWrapper<XRQuadLayer, \"XRQuadLayer\">> {\r\n if (this._isWebGPU) {\r\n const binding = this._xrGPUBinding!;\r\n if (typeof binding.createQuadLayer !== \"function\") {\r\n Logger.Warn(WebGPUQuadLayerCreateWarning);\r\n return null;\r\n }\r\n if (typeof binding.getSubImage !== \"function\") {\r\n Logger.Warn(WebGPUQuadLayerSubImageWarning);\r\n return null;\r\n }\r\n }\r\n\r\n const wrapper = this.createQuadLayer({ layerInit: options.params });\r\n if (!wrapper || wrapper.layer === null) {\r\n return null;\r\n }\r\n const quadLayer = wrapper.layer;\r\n quadLayer.width = this._isMultiviewEnabled ? 1 : 2;\r\n quadLayer.height = 1;\r\n\r\n if (babylonTexture) {\r\n this._compositionLayerTextureMapping.set(quadLayer, babylonTexture);\r\n }\r\n return wrapper;\r\n }\r\n\r\n /**\r\n * @experimental\r\n * This will support full screen ADT when used with WebXR Layers. This API might change in the future.\r\n * Note that no interaction will be available with the ADT when using this method\r\n * @param texture the texture to display in the layer\r\n * @param options optional parameters for the layer\r\n * @returns a composition layer containing the texture, or null when WebGPU quad layers are unavailable\r\n */\r\n public addFullscreenAdvancedDynamicTexture(\r\n texture: DynamicTexture,\r\n options: { distanceFromHeadset: number } = { distanceFromHeadset: 1.5 }\r\n ): Nullable<WebXRCompositionLayerWrapper> {\r\n const wrapper = this._createQuadLayer(\r\n {\r\n params: {\r\n space: this._xrSessionManager.viewerReferenceSpace,\r\n textureType: \"texture\",\r\n layout: \"mono\",\r\n },\r\n },\r\n texture\r\n );\r\n if (!wrapper) {\r\n return null;\r\n }\r\n\r\n const distance = Math.max(0.1, options.distanceFromHeadset);\r\n const z = this._xrSessionManager.scene.useRightHandedSystem ? -distance : distance;\r\n wrapper.transformNode.position.set(0, 0, z * this._xrSessionManager.worldScalingFactor);\r\n\r\n const rttProvider = this._layerToRTTProviderMapping.get(wrapper.layer);\r\n if (\r\n !rttProvider ||\r\n (!(rttProvider instanceof WebXRCompositionLayerRenderTargetTextureProvider) && !(rttProvider instanceof WebXRWebGPUCompositionLayerRenderTargetTextureProvider))\r\n ) {\r\n throw new Error(\"Could not find the RTT provider for the layer\");\r\n }\r\n const babylonLayer = this._xrSessionManager.scene.layers.find((babylonLayer) => {\r\n return babylonLayer.texture === texture;\r\n });\r\n if (!babylonLayer) {\r\n throw new Error(\"Could not find the babylon layer for the texture\");\r\n }\r\n const renderTargetTextures = new Set<RenderTargetTexture>();\r\n const beforeRenderObservers: Observer<Scene>[] = [];\r\n const previousRenderOnlyInRenderTargetTextures = babylonLayer.renderOnlyInRenderTargetTextures;\r\n let cleanedUp = false;\r\n const renderTargetCreatedObserver = rttProvider.onRenderTargetTextureCreatedObservable.add((data) => {\r\n if (data.eye && data.eye === \"right\") {\r\n return;\r\n }\r\n data.texture.clearColor = new Color4(0, 0, 0, 0);\r\n babylonLayer.renderTargetTextures.push(data.texture);\r\n renderTargetTextures.add(data.texture);\r\n babylonLayer.renderOnlyInRenderTargetTextures = true;\r\n // for stereo (not for gui) it should be onBeforeCameraRenderObservable\r\n beforeRenderObservers.push(\r\n this._xrSessionManager.scene.onBeforeRenderObservable.add(() => {\r\n data.texture.render();\r\n })\r\n );\r\n });\r\n const cleanup = () => {\r\n if (cleanedUp) {\r\n return;\r\n }\r\n cleanedUp = true;\r\n rttProvider.onRenderTargetTextureCreatedObservable.remove(renderTargetCreatedObserver);\r\n for (const observer of beforeRenderObservers) {\r\n this._xrSessionManager.scene.onBeforeRenderObservable.remove(observer);\r\n }\r\n for (const renderTargetTexture of renderTargetTextures) {\r\n const index = babylonLayer.renderTargetTextures.indexOf(renderTargetTexture);\r\n if (index !== -1) {\r\n babylonLayer.renderTargetTextures.splice(index, 1);\r\n }\r\n }\r\n babylonLayer.renderOnlyInRenderTargetTextures = previousRenderOnlyInRenderTargetTextures;\r\n this._layerCleanupFunctions.delete(wrapper);\r\n };\r\n this._layerCleanupFunctions.set(wrapper, cleanup);\r\n this._xrSessionManager.onXRSessionEnded.addOnce(cleanup);\r\n return wrapper;\r\n }\r\n\r\n /**\r\n * @experimental\r\n * This functions allows you to add a lens flare system to the XR scene.\r\n * Note - this will remove the lens flare system from the scene and add it to the XR scene.\r\n * This feature is experimental and might change in the future.\r\n * @param flareSystem the flare system to add\r\n * @returns a composition layer containing the flare system, or null when WebGPU quad layers are unavailable\r\n */\r\n protected _addLensFlareSystem(flareSystem: LensFlareSystem): Nullable<WebXRCompositionLayerWrapper> {\r\n const wrapper = this._createQuadLayer({\r\n params: {\r\n space: this._xrSessionManager.viewerReferenceSpace,\r\n textureType: \"texture\",\r\n layout: \"mono\",\r\n },\r\n });\r\n if (!wrapper) {\r\n return null;\r\n }\r\n\r\n const layer = wrapper.layer;\r\n layer.width = 2;\r\n layer.height = 1;\r\n const distance = 10;\r\n const z = this._xrSessionManager.scene.useRightHandedSystem ? -distance : distance;\r\n wrapper.transformNode.position.set(0, 0, z * this._xrSessionManager.worldScalingFactor);\r\n\r\n // get the rtt wrapper\r\n const rttProvider = this._layerToRTTProviderMapping.get(layer);\r\n if (\r\n !rttProvider ||\r\n (!(rttProvider instanceof WebXRCompositionLayerRenderTargetTextureProvider) && !(rttProvider instanceof WebXRWebGPUCompositionLayerRenderTargetTextureProvider))\r\n ) {\r\n throw new Error(\"Could not find the RTT provider for the layer\");\r\n }\r\n // render the flare system to the rtt\r\n rttProvider.onRenderTargetTextureCreatedObservable.add((data) => {\r\n data.texture.clearColor = new Color4(0, 0, 0, 0);\r\n data.texture.customRenderFunction = () => {\r\n flareSystem.render();\r\n };\r\n\r\n // add to the scene's render targets\r\n // this._xrSessionManager.scene.onBeforeCameraRenderObservable.add(() => {\r\n // data.texture.render();\r\n // });\r\n });\r\n // remove the lens flare system from the scene\r\n this._xrSessionManager.onXRSessionInit.add(() => {\r\n this._xrSessionManager.scene.lensFlareSystems.splice(this._xrSessionManager.scene.lensFlareSystems.indexOf(flareSystem), 1);\r\n });\r\n // add it back when the session ends\r\n this._xrSessionManager.onXRSessionEnded.add(() => {\r\n this._xrSessionManager.scene.lensFlareSystems.push(flareSystem);\r\n });\r\n\r\n return wrapper;\r\n }\r\n\r\n /**\r\n * Add a new layer to the already-existing list of layers\r\n * @param wrappedLayer the new layer to add to the existing ones\r\n */\r\n public addXRSessionLayer(wrappedLayer: WebXRLayerWrapper<WebXRSupportedLayerType>) {\r\n this._existingLayers.push(wrappedLayer);\r\n this.setXRSessionLayers(this._existingLayers);\r\n }\r\n\r\n /**\r\n * Removes a non-projection layer from the current XR session.\r\n * @param wrappedLayer the layer wrapper to remove\r\n * @param dispose whether to dispose the wrapper and destroy its native composition layer\r\n * @returns whether the layer was present and removed\r\n */\r\n public removeXRSessionLayer(wrappedLayer: WebXRLayerWrapper<WebXRSupportedLayerType>, dispose = true): boolean {\r\n const index = this._existingLayers.indexOf(wrappedLayer);\r\n if (index === -1) {\r\n return false;\r\n }\r\n if (wrappedLayer.layerType === \"XRProjectionLayer\") {\r\n Logger.Warn(\"The active projection layer cannot be removed from WebXRLayers.\");\r\n return false;\r\n }\r\n\r\n this._existingLayers.splice(index, 1);\r\n this._layerCleanupFunctions.get(wrappedLayer)?.();\r\n if (wrappedLayer instanceof WebXRCompositionLayerWrapper) {\r\n this._layerToRTTProviderMapping.delete(wrappedLayer.layer);\r\n this._compositionLayerTextureMapping.delete(wrappedLayer.layer);\r\n }\r\n this.setXRSessionLayers(this._existingLayers);\r\n if (dispose) {\r\n wrappedLayer.dispose();\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Removes either a native spatial layer or a fallback layer created by this feature.\r\n * @param wrappedLayer the native or fallback layer wrapper to remove\r\n * @param dispose whether to dispose resources owned by the wrapper\r\n * @returns whether the wrapper was present and removed\r\n */\r\n public removeLayer(wrappedLayer: WebXRLayerCreationResult<WebXRSpatialLayer>, dispose = true): boolean {\r\n if (wrappedLayer.layer === null) {\r\n const index = this._fallbackLayers.indexOf(wrappedLayer);\r\n if (index === -1) {\r\n return false;\r\n }\r\n this._fallbackLayers.splice(index, 1);\r\n if (dispose) {\r\n wrappedLayer.dispose();\r\n }\r\n return true;\r\n }\r\n return this.removeXRSessionLayer(wrappedLayer, dispose);\r\n }\r\n\r\n /**\r\n * Sets the layers to be used by the XR session.\r\n * Note that you must call this function with any layers you wish to render to\r\n * since it adds them to the XR session's render state\r\n * (replacing any layers that were added in a previous call to setXRSessionLayers or updateRenderState).\r\n * This method also sets up the session manager's render target texture provider\r\n * as the first layer in the array, which feeds the WebXR camera(s) attached to the session.\r\n * @param wrappedLayers An array of WebXRLayerWrapper, usually returned from the WebXRLayers createLayer functions.\r\n */\r\n public setXRSessionLayers(wrappedLayers: Array<WebXRLayerWrapper<WebXRSupportedLayerType>> = this._existingLayers): void {\r\n // this._existingLayers = wrappedLayers;\r\n const renderStateInit: XRRenderStateInit = { ...this._xrSessionManager.session.renderState };\r\n // Clear out the layer-related fields.\r\n renderStateInit.baseLayer = undefined;\r\n renderStateInit.layers = wrappedLayers.map((wrappedLayer) => wrappedLayer.layer);\r\n this._xrSessionManager.updateRenderState(renderStateInit);\r\n if (!this._projectionLayerInitialized) {\r\n this._xrSessionManager._setBaseLayerWrapper(wrappedLayers.length > 0 ? (wrappedLayers.at(0)! as WebXRLayerWrapper) : null);\r\n }\r\n }\r\n\r\n /**\r\n * Checks whether the active runtime exposes the factory needed for a layer type.\r\n * This is a capability check only; creation can still fail when an initialization dictionary is invalid.\r\n * @param layerType the concrete WebXR layer type\r\n * @param source whether to check a graphics-backed or media-backed layer\r\n * @returns whether the requested factory is available\r\n */\r\n public isLayerTypeSupported(layerType: WebXRSpatialLayerType | \"XRProjectionLayer\", source: WebXRLayerSource = \"graphics\"): boolean {\r\n if (source === \"media\") {\r\n if (layerType === \"XRProjectionLayer\" || layerType === \"XRCubeLayer\" || typeof XRMediaBinding === \"undefined\") {\r\n return false;\r\n }\r\n switch (layerType) {\r\n case \"XRQuadLayer\":\r\n return typeof XRMediaBinding.prototype.createQuadLayer === \"function\";\r\n case \"XRCylinderLayer\":\r\n return typeof XRMediaBinding.prototype.createCylinderLayer === \"function\";\r\n case \"XREquirectLayer\":\r\n return typeof XRMediaBinding.prototype.createEquirectLayer === \"function\";\r\n }\r\n }\r\n\r\n if (this._xrSessionManager.scene.getEngine().isWebGPU) {\r\n if (typeof XRGPUBinding === \"undefined\") {\r\n return false;\r\n }\r\n switch (layerType) {\r\n case \"XRProjectionLayer\":\r\n return typeof XRGPUBinding.prototype.createProjectionLayer === \"function\";\r\n case \"XRQuadLayer\":\r\n return typeof XRGPUBinding.prototype.createQuadLayer === \"function\";\r\n case \"XRCylinderLayer\":\r\n return typeof XRGPUBinding.prototype.createCylinderLayer === \"function\";\r\n case \"XREquirectLayer\":\r\n return typeof XRGPUBinding.prototype.createEquirectLayer === \"function\";\r\n case \"XRCubeLayer\":\r\n return typeof XRGPUBinding.prototype.createCubeLayer === \"function\";\r\n }\r\n }\r\n\r\n if (typeof XRWebGLBinding === \"undefined\") {\r\n return false;\r\n }\r\n switch (layerType) {\r\n case \"XRProjectionLayer\":\r\n return typeof XRWebGLBinding.prototype.createProjectionLayer === \"function\";\r\n case \"XRQuadLayer\":\r\n return typeof XRWebGLBinding.prototype.createQuadLayer === \"function\";\r\n case \"XRCylinderLayer\":\r\n return typeof XRWebGLBinding.prototype.createCylinderLayer === \"function\";\r\n case \"XREquirectLayer\":\r\n return typeof XRWebGLBinding.prototype.createEquirectLayer === \"function\";\r\n case \"XRCubeLayer\":\r\n return typeof XRWebGLBinding.prototype.createCubeLayer === \"function\";\r\n }\r\n }\r\n\r\n public override isCompatible(): boolean {\r\n if (this._xrSessionManager.scene.getEngine().isWebGPU) {\r\n return typeof XRGPUBinding !== \"undefined\" && !!XRGPUBinding.prototype.createProjectionLayer;\r\n }\r\n // Native WebGL continues to use NativeXRRenderTarget instead of WebXR Layers.\r\n if (this._xrSessionManager.isNative) {\r\n return false;\r\n }\r\n return typeof XRWebGLBinding !== \"undefined\" && !!XRWebGLBinding.prototype.createProjectionLayer;\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 }\r\n\r\n protected _onXRFrame(_xrFrame: XRFrame): void {\r\n for (let i = 0; i < this._fallbackLayers.length; ++i) {\r\n this._fallbackLayers[i].updateFromTransformNode(this._xrSessionManager.worldScalingFactor);\r\n }\r\n\r\n const layers = this._existingLayers;\r\n for (let i = 0; i < layers.length; ++i) {\r\n const layer = layers[i];\r\n if (layer instanceof WebXRSpatialLayerWrapper) {\r\n layer.updateFromTransformNode(this._xrSessionManager.scene.useRightHandedSystem, this._xrSessionManager.worldScalingFactor);\r\n }\r\n if (layer.layerType === \"XRProjectionLayer\" || !(layer instanceof WebXRCompositionLayerWrapper) || !layer.usesRenderTargetProvider) {\r\n continue;\r\n }\r\n if (layer.isStatic && !layer.layer.needsRedraw) {\r\n continue;\r\n }\r\n\r\n const rttProvider = this._layerToRTTProviderMapping.get(layer.layer);\r\n if (!rttProvider) {\r\n continue;\r\n }\r\n if (layer.layer.layout === \"mono\") {\r\n rttProvider.getRenderTargetTextureForEye(\"none\");\r\n } else {\r\n const pose = _xrFrame.getViewerPose(this._xrSessionManager.referenceSpace);\r\n if (pose) {\r\n const views = pose.views;\r\n for (let j = 0; j < views.length; ++j) {\r\n rttProvider.getRenderTargetTextureForView(views[j]);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nlet _Registered = false;\r\n/**\r\n * Register side effects for webXRLayers.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\nexport function RegisterWebXRLayers(): 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 WebXRLayers.Name,\r\n (xrSessionManager, options) => {\r\n return () => new WebXRLayers(xrSessionManager, options);\r\n },\r\n WebXRLayers.Version,\r\n false\r\n );\r\n}\r\n"]}
1
+ {"version":3,"file":"WebXRLayers.pure.js","sourceRoot":"","sources":["../../../../../dev/core/src/XR/features/WebXRLayers.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 { WebXRAbstractFeature } from \"./WebXRAbstractFeature\";\r\nimport { type WebXRLayerWrapper, type WebXRSupportedLayerType } from \"../webXRLayerWrapper\";\r\nimport { type WebXRLayerRenderTargetTextureProvider } from \"../webXRRenderTargetTextureProvider\";\r\nimport { WebXRWebGLLayerWrapper } from \"../webXRWebGLLayer\";\r\nimport { WebXRProjectionLayerWrapper, DefaultXRProjectionLayerInit } from \"./Layers/WebXRProjectionLayer\";\r\nimport {\r\n WebXRCompositionLayerRenderTargetTextureProvider,\r\n WebXRCompositionLayerWrapper,\r\n WebXRCubeLayerWrapper,\r\n WebXRMediaLayerWrapper,\r\n WebXRSpatialLayerWrapper,\r\n type WebXRSpatialLayer,\r\n type WebXRSpatialLayerType,\r\n} from \"./Layers/WebXRCompositionLayer\";\r\nimport { WebXRWebGPUProjectionLayerWrapper, CreateDefaultXRGPUProjectionLayerInit } from \"./Layers/WebXRWebGPUProjectionLayer\";\r\nimport { WebXRWebGPUCompositionLayerRenderTargetTextureProvider } from \"./Layers/WebXRWebGPUCompositionLayer\";\r\nimport { IsWebGPUXRSupported, WebXRGraphicsBindingType } from \"../webXRGraphicsBinding\";\r\nimport { type ThinTexture } from \"../../Materials/Textures/thinTexture\";\r\nimport { type RenderTargetTexture } from \"../../Materials/Textures/renderTargetTexture.pure\";\r\nimport { type DynamicTexture } from \"../../Materials/Textures/dynamicTexture.pure\";\r\nimport { Color4 } from \"../../Maths/math.color.pure\";\r\nimport { type LensFlareSystem } from \"../../LensFlares/lensFlareSystem\";\r\nimport { Logger } from \"../../Misc/logger\";\r\nimport { type Nullable } from \"../../types\";\r\nimport { type Observer } from \"../../Misc/observable.pure\";\r\nimport { type Scene } from \"../../scene.pure\";\r\nimport { TransformNode } from \"../../Meshes/transformNode.pure\";\r\nimport { Quaternion } from \"../../Maths/math.vector.pure\";\r\nimport { type BaseTexture } from \"../../Materials/Textures/baseTexture\";\r\nimport { type WebXRFallbackLayerWrapper, type IWebXRFallbackLayerDimensions } from \"./Layers/WebXRFallbackLayer\";\r\n\r\nexport { WebXRCompositionLayerWrapper, WebXRCubeLayerWrapper, WebXRMediaLayerWrapper, WebXRSpatialLayerWrapper } from \"./Layers/WebXRCompositionLayer\";\r\nexport type { WebXRSpatialLayer, WebXRSpatialLayerType } from \"./Layers/WebXRCompositionLayer\";\r\nexport type { IWebXRFallbackLayerDimensions, WebXRFallbackLayerWrapper } from \"./Layers/WebXRFallbackLayer\";\r\n\r\nconst DefaultXRWebGLLayerInit: XRWebGLLayerInit = {};\r\nconst WebGPUQuadLayerCreateWarning =\r\n \"WebGPU XR quad layers are unavailable because XRGPUBinding.createQuadLayer is not supported; the requested quad layer was skipped and projection rendering remains active.\";\r\nconst WebGPUQuadLayerSubImageWarning =\r\n \"WebGPU XR quad layers are unavailable because XRGPUBinding.getSubImage is not supported; the requested quad layer was skipped and projection rendering remains active.\";\r\n\r\ntype WebXRGraphicsLayerInit = XRLayerInit & { textureType?: XRTextureType };\r\ntype WebXRGPUGraphicsLayerInit = XRGPULayerInit;\r\n\r\n/**\r\n * Configuration options of the layers feature\r\n */\r\nexport interface IWebXRLayersOptions {\r\n /**\r\n * Whether to try initializing the base projection layer as a multiview render target, if multiview is supported.\r\n * Defaults to false.\r\n */\r\n preferMultiviewOnInit?: boolean;\r\n\r\n /**\r\n * Optional configuration for the base projection layer.\r\n */\r\n projectionLayerInit?: Partial<XRProjectionLayerInit>;\r\n}\r\n\r\n/**\r\n * Common options for creating a graphics-backed WebXR composition layer.\r\n * @typeParam TWebGLInit the WebGL layer initialization dictionary\r\n * @typeParam TWebGPUInit the WebGPU layer initialization dictionary\r\n */\r\nexport interface IWebXRCompositionLayerCreationOptions<TWebGLInit, TWebGPUInit> {\r\n /**\r\n * Initialization values shared with the WebGL Layers API.\r\n * Babylon supplies the current reference space and projection-layer pixel dimensions when omitted.\r\n */\r\n layerInit?: Partial<TWebGLInit>;\r\n /**\r\n * WebGPU-specific initialization overrides.\r\n * Shared spatial and layout values are copied from `layerInit` before these overrides are applied.\r\n */\r\n gpuLayerInit?: Partial<TWebGPUInit>;\r\n /**\r\n * A Babylon node whose world position and rotation will be synchronized with the layer.\r\n * Babylon creates and owns a node when this is omitted.\r\n */\r\n transformNode?: TransformNode;\r\n /**\r\n * Uses a Babylon mesh when the requested native layer factory is unavailable.\r\n * Import `@babylonjs/core/XR/features/WebXRLayersFallback` to enable this optional fallback.\r\n * Fallback is disabled by default.\r\n */\r\n fallbackMode?: \"none\" | \"mesh\";\r\n /**\r\n * A texture to display on the fallback mesh.\r\n * Required when `fallbackMode` is `\"mesh\"`.\r\n */\r\n fallbackTexture?: BaseTexture;\r\n}\r\n\r\n/**\r\n * Common options for creating an XRMediaBinding layer.\r\n * @typeParam InitT the media layer initialization dictionary\r\n */\r\nexport interface IWebXRMediaLayerCreationOptions<InitT> {\r\n /**\r\n * Initialization values for the media layer.\r\n * Babylon supplies the current reference space when omitted.\r\n */\r\n layerInit?: Partial<InitT>;\r\n /**\r\n * A Babylon node whose world position and rotation will be synchronized with the layer.\r\n * Babylon creates and owns a node when this is omitted.\r\n */\r\n transformNode?: TransformNode;\r\n /**\r\n * Uses a Babylon mesh and VideoTexture when XRMediaBinding is unavailable.\r\n * Import `@babylonjs/core/XR/features/WebXRLayersFallback` to enable this optional fallback.\r\n * Fallback is disabled by default.\r\n */\r\n fallbackMode?: \"none\" | \"mesh\";\r\n}\r\n\r\n/**\r\n * Selects whether a layer is created from a graphics binding or directly from a media element.\r\n */\r\nexport type WebXRLayerSource = \"graphics\" | \"media\";\r\n\r\n/**\r\n * The result of creating a spatial WebXR layer.\r\n * Native wrappers expose an XR composition layer, while fallback wrappers expose a Babylon mesh.\r\n * @typeParam LayerT the native layer type\r\n */\r\nexport type WebXRLayerCreationResult<LayerT extends WebXRSpatialLayer, LayerTypeT extends WebXRSpatialLayerType = WebXRSpatialLayerType> =\r\n WebXRSpatialLayerWrapper<LayerT, LayerTypeT> | WebXRFallbackLayerWrapper;\r\n\r\n/**\r\n * Data supplied to an optional WebXR mesh-fallback implementation.\r\n * @internal\r\n */\r\nexport interface IWebXRFallbackLayerCreationContext {\r\n scene: WebXRSessionManager[\"scene\"];\r\n isWebGPU: boolean;\r\n layerType: WebXRSpatialLayerType;\r\n transformNode: TransformNode;\r\n ownsTransformNode: boolean;\r\n dimensions: IWebXRFallbackLayerDimensions;\r\n worldScalingFactor: number;\r\n texture?: BaseTexture;\r\n video?: HTMLVideoElement;\r\n}\r\n\r\nlet _FallbackLayerFactory: Nullable<(context: IWebXRFallbackLayerCreationContext) => Nullable<WebXRFallbackLayerWrapper>> = null;\r\n\r\n/**\r\n * Registers the optional mesh-fallback implementation without making its rendering dependencies part of projection-only bundles.\r\n * @param factory creates a fallback wrapper\r\n * @internal\r\n */\r\nexport function _RegisterWebXRFallbackLayerFactory(factory: (context: IWebXRFallbackLayerCreationContext) => Nullable<WebXRFallbackLayerWrapper>): void {\r\n _FallbackLayerFactory = factory;\r\n}\r\n\r\n/**\r\n * Exposes the WebXR Layers API.\r\n */\r\nexport class WebXRLayers extends WebXRAbstractFeature {\r\n /**\r\n * The module's name\r\n */\r\n public static readonly Name = WebXRFeatureName.LAYERS;\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 * Already-created layers\r\n */\r\n private _existingLayers: WebXRLayerWrapper<WebXRSupportedLayerType>[] = [];\r\n private _fallbackLayers: WebXRFallbackLayerWrapper[] = [];\r\n\r\n private _glContext: WebGLRenderingContext | WebGL2RenderingContext;\r\n private _xrWebGLBinding: XRWebGLBinding;\r\n private _isWebGPU = false;\r\n private _xrGPUBinding?: XRGPUBinding;\r\n private _xrMediaBinding?: XRMediaBinding;\r\n private _isMultiviewEnabled = false;\r\n private _projectionLayerInitialized = false;\r\n\r\n private _compositionLayerTextureMapping: WeakMap<XRCompositionLayer, ThinTexture> = new WeakMap();\r\n private _layerToRTTProviderMapping: WeakMap<XRCompositionLayer, WebXRLayerRenderTargetTextureProvider<WebXRSupportedLayerType>> = new WeakMap();\r\n private _layerCleanupFunctions = new WeakMap<WebXRLayerWrapper<WebXRSupportedLayerType>, () => void>();\r\n\r\n constructor(\r\n _xrSessionManager: WebXRSessionManager,\r\n private readonly _options: IWebXRLayersOptions = {}\r\n ) {\r\n super(_xrSessionManager);\r\n this.xrNativeFeatureName = \"layers\";\r\n }\r\n\r\n /**\r\n * Whether the active XR session exposes its compositor layer limit.\r\n */\r\n public get isMaxRenderLayersSupported(): boolean {\r\n return this.maxRenderLayers !== null;\r\n }\r\n\r\n /**\r\n * Gets the maximum number of native layers accepted in the active session's render-state `layers` array.\r\n * The projection layer counts toward this limit. Fallback mesh layers do not.\r\n * @returns The native layer limit, or `null` when the runtime does not expose it.\r\n * @see https://playground.babylonjs.com/#TODARD#0\r\n */\r\n public get maxRenderLayers(): Nullable<number> {\r\n const maxRenderLayers = this._xrSessionManager.session?.maxRenderLayers;\r\n return typeof maxRenderLayers === \"number\" ? maxRenderLayers : null;\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 if (!super.attach()) {\r\n return false;\r\n }\r\n\r\n const engine = this._xrSessionManager.scene.getEngine();\r\n this._existingLayers.length = 0;\r\n this._isWebGPU = engine.isWebGPU;\r\n\r\n if (this._isWebGPU) {\r\n const binding = this._xrSessionManager._getGraphicsBinding();\r\n if (binding.bindingType !== WebXRGraphicsBindingType.WebGPU) {\r\n throw new Error(\"Expected a WebGPU graphics binding for a WebGPU engine.\");\r\n }\r\n this._xrGPUBinding = binding.binding;\r\n // Multiview is not yet supported on the WebGPU XR path; force single-view (two sub-images).\r\n this._isMultiviewEnabled = false;\r\n this._createWebGPUProjectionLayer();\r\n } else {\r\n const binding = this._xrSessionManager._getGraphicsBinding();\r\n if (binding.bindingType !== WebXRGraphicsBindingType.WebGL) {\r\n throw new Error(\"Expected a WebGL graphics binding for a WebGL engine.\");\r\n }\r\n this._glContext = binding.context;\r\n this._xrWebGLBinding = binding.binding;\r\n\r\n const projectionLayerInit = { ...DefaultXRProjectionLayerInit, ...this._options.projectionLayerInit };\r\n this._isMultiviewEnabled = this._options.preferMultiviewOnInit && engine.getCaps().multiview;\r\n this.createProjectionLayer(projectionLayerInit /*, projectionLayerMultiview*/);\r\n }\r\n this._projectionLayerInitialized = true;\r\n this._addNewAttachObserver(this._xrSessionManager.onXRReferenceSpaceChanged, (referenceSpace) => {\r\n for (const layer of this._existingLayers) {\r\n if (layer instanceof WebXRSpatialLayerWrapper && layer.usesSessionReferenceSpace) {\r\n layer.layer.space = referenceSpace;\r\n }\r\n }\r\n });\r\n\r\n return true;\r\n }\r\n\r\n public override detach(): boolean {\r\n if (!super.detach()) {\r\n return false;\r\n }\r\n for (const layer of this._existingLayers) {\r\n this._layerCleanupFunctions.get(layer)?.();\r\n layer.dispose();\r\n }\r\n this._existingLayers.length = 0;\r\n for (const layer of this._fallbackLayers) {\r\n layer.dispose();\r\n }\r\n this._fallbackLayers.length = 0;\r\n this._xrMediaBinding = undefined;\r\n this._projectionLayerInitialized = false;\r\n return true;\r\n }\r\n\r\n /**\r\n * Creates a new XRWebGLLayer.\r\n * @param params an object providing configuration options for the new XRWebGLLayer\r\n * @returns the XRWebGLLayer\r\n */\r\n public createXRWebGLLayer(params = DefaultXRWebGLLayerInit): WebXRWebGLLayerWrapper {\r\n const layer = new XRWebGLLayer(this._xrSessionManager.session, this._glContext, params);\r\n return new WebXRWebGLLayerWrapper(layer);\r\n }\r\n\r\n private _validateLayerInit(params: XRProjectionLayerInit | WebXRGraphicsLayerInit, multiview = this._isMultiviewEnabled, allowTextureArrayWithoutMultiview = false): void {\r\n // check if we are in session\r\n if (!this._xrSessionManager.inXRSession) {\r\n throw new Error(\"Cannot create a layer outside of a WebXR session. Make sure the session has started before creating layers.\");\r\n }\r\n if (multiview && params.textureType !== \"texture-array\") {\r\n throw new Error(\"Projection layers can only be made multiview if they use texture arrays. Set the textureType parameter to 'texture-array'.\");\r\n }\r\n\r\n // TODO (rgerd): Support RTT's that are bound to sub-images in the texture array.\r\n if (!multiview && params.textureType === \"texture-array\" && !allowTextureArrayWithoutMultiview) {\r\n throw new Error(\"We currently only support multiview rendering when the textureType parameter is set to 'texture-array'.\");\r\n }\r\n }\r\n\r\n private _extendXRLayerInit<T extends XRProjectionLayerInit | WebXRGraphicsLayerInit>(params: T, multiview = this._isMultiviewEnabled): T {\r\n if (multiview) {\r\n params.textureType = \"texture-array\";\r\n }\r\n return params;\r\n }\r\n\r\n private _getProjectionLayerDimensions(): { width: number; height: number } {\r\n const projectionLayer = this._existingLayers.find((layer) => layer.layerType === \"XRProjectionLayer\");\r\n if (!projectionLayer) {\r\n throw new Error(\"A projection layer must be created before adding WebXR composition layers.\");\r\n }\r\n return {\r\n width: projectionLayer.getWidth(),\r\n height: projectionLayer.getHeight(),\r\n };\r\n }\r\n\r\n private _createTransformNode(\r\n layerType: WebXRSpatialLayerType,\r\n transformNode: TransformNode | undefined,\r\n transform?: XRRigidTransform,\r\n orientation?: DOMPointReadOnly\r\n ): { node: TransformNode; ownsNode: boolean } {\r\n if (transformNode) {\r\n return { node: transformNode, ownsNode: false };\r\n }\r\n\r\n const node = new TransformNode(`WebXR ${layerType}`, this._xrSessionManager.scene);\r\n node.rotationQuaternion = new Quaternion();\r\n const sourcePosition = transform?.position;\r\n const sourceOrientation = transform?.orientation ?? orientation;\r\n if (sourcePosition) {\r\n const worldScalingFactor = this._xrSessionManager.worldScalingFactor;\r\n node.position.set(sourcePosition.x * worldScalingFactor, sourcePosition.y * worldScalingFactor, sourcePosition.z * worldScalingFactor);\r\n }\r\n if (sourceOrientation) {\r\n node.rotationQuaternion.set(sourceOrientation.x, sourceOrientation.y, sourceOrientation.z, sourceOrientation.w);\r\n }\r\n if (!this._xrSessionManager.scene.useRightHandedSystem) {\r\n node.position.z *= -1;\r\n node.rotationQuaternion.z *= -1;\r\n node.rotationQuaternion.w *= -1;\r\n }\r\n return { node, ownsNode: true };\r\n }\r\n\r\n private _createFallbackLayer(\r\n layerType: WebXRSpatialLayerType,\r\n transformNode: TransformNode | undefined,\r\n transform: XRRigidTransform | undefined,\r\n orientation: DOMPointReadOnly | undefined,\r\n dimensions: IWebXRFallbackLayerDimensions,\r\n texture?: BaseTexture,\r\n video?: HTMLVideoElement\r\n ): Nullable<WebXRFallbackLayerWrapper> {\r\n if (!_FallbackLayerFactory) {\r\n Logger.Warn(\"WebXR mesh fallbacks require importing `@babylonjs/core/XR/features/WebXRLayersFallback`.\");\r\n return null;\r\n }\r\n\r\n const transformInfo = this._createTransformNode(layerType, transformNode, transform, orientation);\r\n const wrapper = _FallbackLayerFactory({\r\n scene: this._xrSessionManager.scene,\r\n isWebGPU: this._isWebGPU,\r\n layerType,\r\n transformNode: transformInfo.node,\r\n ownsTransformNode: transformInfo.ownsNode,\r\n dimensions,\r\n worldScalingFactor: this._xrSessionManager.worldScalingFactor,\r\n texture,\r\n video,\r\n });\r\n if (wrapper) {\r\n this._fallbackLayers.push(wrapper);\r\n } else if (transformInfo.ownsNode) {\r\n transformInfo.node.dispose();\r\n }\r\n return wrapper;\r\n }\r\n\r\n private _createGraphicsLayer<\r\n LayerT extends WebXRSpatialLayer,\r\n LayerTypeT extends WebXRSpatialLayerType,\r\n TWebGLInit extends WebXRGraphicsLayerInit,\r\n TWebGPUInit extends WebXRGPUGraphicsLayerInit,\r\n >(\r\n layerType: LayerTypeT,\r\n factoryName: string,\r\n factorySupported: boolean,\r\n options: IWebXRCompositionLayerCreationOptions<TWebGLInit, TWebGPUInit>,\r\n createWebGLLayer: (binding: XRWebGLBinding, init: TWebGLInit) => LayerT,\r\n createWebGPULayer: (binding: XRGPUBinding, init: TWebGPUInit) => LayerT,\r\n copyWebGPUSpecificInit: (webGLInit: TWebGLInit, webGPUInit: TWebGPUInit) => void\r\n ): Nullable<WebXRSpatialLayerWrapper<LayerT, LayerTypeT>> {\r\n if (!this._xrSessionManager.inXRSession) {\r\n throw new Error(\"Cannot create a layer outside of a WebXR session. Make sure the session has started before creating layers.\");\r\n }\r\n if (!factorySupported) {\r\n if (options.fallbackMode !== \"mesh\") {\r\n Logger.Warn(`${layerType} is unavailable because ${factoryName} is not supported; the requested layer was skipped and projection rendering remains active.`);\r\n }\r\n return null;\r\n }\r\n if (this._isWebGPU && typeof this._xrGPUBinding?.getSubImage !== \"function\") {\r\n if (options.fallbackMode !== \"mesh\") {\r\n Logger.Warn(\r\n `${layerType} is unavailable because XRGPUBinding.getSubImage is not supported; the requested layer was skipped and projection rendering remains active.`\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n this._validateLayerCount(this._existingLayers.length + 1);\r\n const dimensions = this._getProjectionLayerDimensions();\r\n const defaultViewPixelWidth = layerType === \"XRCubeLayer\" ? Math.min(dimensions.width, dimensions.height) : dimensions.width;\r\n const defaultViewPixelHeight = layerType === \"XRCubeLayer\" ? defaultViewPixelWidth : dimensions.height;\r\n const populatedParams = {\r\n space: this._xrSessionManager.referenceSpace,\r\n viewPixelWidth: defaultViewPixelWidth,\r\n viewPixelHeight: defaultViewPixelHeight,\r\n clearOnAccess: true,\r\n textureType: \"texture\",\r\n layout: \"mono\",\r\n ...options.layerInit,\r\n } as TWebGLInit;\r\n if (layerType === \"XRCubeLayer\" && populatedParams.viewPixelWidth !== populatedParams.viewPixelHeight) {\r\n throw new Error(\"WebXR cube layer faces must have equal pixel width and height.\");\r\n }\r\n this._validateLayerInit(populatedParams, false, layerType === \"XRCubeLayer\");\r\n\r\n let layer: LayerT;\r\n let effectiveParams: TWebGLInit | TWebGPUInit = populatedParams;\r\n let depthStencilFormat: GPUTextureFormat | undefined;\r\n if (this._isWebGPU) {\r\n const binding = this._xrGPUBinding!;\r\n const gpuParams = {\r\n colorFormat: binding.getPreferredColorFormat(),\r\n textureUsage: 0x10,\r\n space: populatedParams.space,\r\n viewPixelWidth: populatedParams.viewPixelWidth,\r\n viewPixelHeight: populatedParams.viewPixelHeight,\r\n layout: populatedParams.layout,\r\n mipLevels: populatedParams.mipLevels,\r\n isStatic: populatedParams.isStatic,\r\n } as TWebGPUInit;\r\n copyWebGPUSpecificInit(populatedParams, gpuParams);\r\n Object.assign(gpuParams, options.gpuLayerInit);\r\n if (layerType === \"XRCubeLayer\" && gpuParams.viewPixelWidth !== gpuParams.viewPixelHeight) {\r\n throw new Error(\"WebXR cube layer faces must have equal pixel width and height.\");\r\n }\r\n effectiveParams = gpuParams;\r\n depthStencilFormat = gpuParams.depthStencilFormat;\r\n layer = createWebGPULayer(binding, gpuParams);\r\n } else {\r\n layer = createWebGLLayer(this._xrWebGLBinding, populatedParams);\r\n }\r\n\r\n const transform = \"transform\" in effectiveParams ? (effectiveParams.transform as XRRigidTransform | undefined) : undefined;\r\n const orientation = \"orientation\" in effectiveParams ? (effectiveParams.orientation as DOMPointReadOnly | undefined) : undefined;\r\n const usesSessionReferenceSpace = options.layerInit?.space === undefined && (!this._isWebGPU || options.gpuLayerInit?.space === undefined);\r\n const transformInfo = this._createTransformNode(layerType, options.transformNode, transform, orientation);\r\n let wrapper: WebXRSpatialLayerWrapper<LayerT, LayerTypeT>;\r\n if (layerType === \"XRCubeLayer\") {\r\n wrapper = new WebXRCubeLayerWrapper(\r\n () => effectiveParams.viewPixelWidth,\r\n () => effectiveParams.viewPixelHeight,\r\n layer as XRCubeLayer,\r\n !!effectiveParams.isStatic,\r\n usesSessionReferenceSpace,\r\n this._isWebGPU ? this._xrGPUBinding! : this._xrWebGLBinding,\r\n transformInfo.node,\r\n transformInfo.ownsNode\r\n ) as unknown as WebXRSpatialLayerWrapper<LayerT, LayerTypeT>;\r\n } else if (this._isWebGPU) {\r\n const binding = this._xrGPUBinding!;\r\n wrapper = new WebXRSpatialLayerWrapper(\r\n () => effectiveParams.viewPixelWidth,\r\n () => effectiveParams.viewPixelHeight,\r\n layer,\r\n layerType,\r\n false,\r\n !!effectiveParams.isStatic,\r\n usesSessionReferenceSpace,\r\n (sessionManager) => new WebXRWebGPUCompositionLayerRenderTargetTextureProvider(sessionManager, binding, wrapper, depthStencilFormat),\r\n transformInfo.node,\r\n transformInfo.ownsNode\r\n );\r\n } else {\r\n wrapper = new WebXRSpatialLayerWrapper(\r\n () => effectiveParams.viewPixelWidth,\r\n () => effectiveParams.viewPixelHeight,\r\n layer,\r\n layerType,\r\n false,\r\n !!effectiveParams.isStatic,\r\n usesSessionReferenceSpace,\r\n (sessionManager) => new WebXRCompositionLayerRenderTargetTextureProvider(sessionManager, this._xrWebGLBinding, wrapper),\r\n transformInfo.node,\r\n transformInfo.ownsNode\r\n );\r\n }\r\n\r\n if (wrapper.usesRenderTargetProvider) {\r\n const rttProvider = wrapper.createRenderTargetTextureProvider(this._xrSessionManager);\r\n this._layerToRTTProviderMapping.set(layer, rttProvider);\r\n }\r\n this.addXRSessionLayer(wrapper);\r\n return wrapper;\r\n }\r\n\r\n private _createMediaLayer<\r\n LayerT extends XRQuadLayer | XRCylinderLayer | XREquirectLayer,\r\n LayerTypeT extends Exclude<WebXRSpatialLayerType, \"XRCubeLayer\">,\r\n InitT extends XRMediaLayerInit & { transform?: XRRigidTransform },\r\n >(\r\n layerType: LayerTypeT,\r\n factoryName: string,\r\n video: HTMLVideoElement,\r\n options: IWebXRMediaLayerCreationOptions<InitT>,\r\n createLayer: (binding: XRMediaBinding, video: HTMLVideoElement, init: InitT) => LayerT\r\n ): Nullable<WebXRMediaLayerWrapper<LayerT, LayerTypeT>> {\r\n if (!this._xrSessionManager.inXRSession) {\r\n throw new Error(\"Cannot create a layer outside of a WebXR session. Make sure the session has started before creating layers.\");\r\n }\r\n if (typeof XRMediaBinding === \"undefined\") {\r\n if (options.fallbackMode !== \"mesh\") {\r\n Logger.Warn(`${layerType} media layers are unavailable because XRMediaBinding is not supported; the requested layer was skipped.`);\r\n }\r\n return null;\r\n }\r\n\r\n this._xrMediaBinding ??= new XRMediaBinding(this._xrSessionManager.session);\r\n const mediaBinding = this._xrMediaBinding;\r\n const factory = mediaBinding[factoryName as \"createQuadLayer\" | \"createCylinderLayer\" | \"createEquirectLayer\"];\r\n if (typeof factory !== \"function\") {\r\n if (options.fallbackMode !== \"mesh\") {\r\n Logger.Warn(`${layerType} media layers are unavailable because XRMediaBinding.${factoryName} is not supported; the requested layer was skipped.`);\r\n }\r\n return null;\r\n }\r\n\r\n this._validateLayerCount(this._existingLayers.length + 1);\r\n const populatedParams = {\r\n space: this._xrSessionManager.referenceSpace,\r\n layout: \"mono\",\r\n ...options.layerInit,\r\n } as InitT;\r\n const layer = createLayer(mediaBinding, video, populatedParams);\r\n const transform = \"transform\" in populatedParams ? populatedParams.transform : undefined;\r\n const transformInfo = this._createTransformNode(layerType, options.transformNode, transform);\r\n const wrapper = new WebXRMediaLayerWrapper(\r\n () => video.videoWidth,\r\n () => video.videoHeight,\r\n layer,\r\n layerType,\r\n transformInfo.node,\r\n transformInfo.ownsNode,\r\n options.layerInit?.space === undefined\r\n );\r\n this.addXRSessionLayer(wrapper);\r\n return wrapper;\r\n }\r\n\r\n /**\r\n * Creates a new XRProjectionLayer.\r\n * @param params an object providing configuration options for the new XRProjectionLayer.\r\n * @param multiview whether the projection layer should render with multiview. Will be tru automatically if the extension initialized with multiview.\r\n * @returns the projection layer\r\n */\r\n public createProjectionLayer(params = DefaultXRProjectionLayerInit, multiview = this._isMultiviewEnabled): WebXRProjectionLayerWrapper {\r\n const extendedParams = this._extendXRLayerInit(params, multiview);\r\n this._validateLayerInit(extendedParams, multiview);\r\n this._validateLayerCount(this._existingLayers.length + 1);\r\n\r\n const projLayer = this._xrWebGLBinding.createProjectionLayer(extendedParams);\r\n const layer = new WebXRProjectionLayerWrapper(projLayer, multiview, this._xrWebGLBinding);\r\n this.addXRSessionLayer(layer);\r\n return layer;\r\n }\r\n\r\n /**\r\n * Creates the base projection layer for the WebGPU (XRGPUBinding) backend.\r\n * Single-view only for now (multiview is deferred); the color format is the binding's preferred format.\r\n * @returns the WebGPU projection layer wrapper\r\n */\r\n private _createWebGPUProjectionLayer(): WebXRWebGPUProjectionLayerWrapper {\r\n if (!this._xrSessionManager.inXRSession) {\r\n throw new Error(\"Cannot create a layer outside of a WebXR session. Make sure the session has started before creating layers.\");\r\n }\r\n this._validateLayerCount(this._existingLayers.length + 1);\r\n const binding = this._xrGPUBinding!;\r\n const init = CreateDefaultXRGPUProjectionLayerInit(binding.getPreferredColorFormat());\r\n const projLayer = binding.createProjectionLayer(init);\r\n const layer = new WebXRWebGPUProjectionLayerWrapper(projLayer, false, binding, init.depthStencilFormat);\r\n this.addXRSessionLayer(layer);\r\n return layer;\r\n }\r\n\r\n /**\r\n * Creates a graphics-backed quad layer and adds it to the current XR session.\r\n * @param options initialization and transform-node options for the layer\r\n * @returns the created layer wrapper, or `null` when the active graphics binding does not support quad layers\r\n */\r\n public createQuadLayer(\r\n options: IWebXRCompositionLayerCreationOptions<XRQuadLayerInit, XRGPUQuadLayerInit> = {}\r\n ): Nullable<WebXRLayerCreationResult<XRQuadLayer, \"XRQuadLayer\">> {\r\n const factorySupported = this._isWebGPU ? typeof this._xrGPUBinding?.createQuadLayer === \"function\" : typeof this._xrWebGLBinding.createQuadLayer === \"function\";\r\n const factoryName = this._isWebGPU ? \"XRGPUBinding.createQuadLayer\" : \"XRWebGLBinding.createQuadLayer\";\r\n const nativeLayer = this._createGraphicsLayer(\r\n \"XRQuadLayer\",\r\n factoryName,\r\n factorySupported,\r\n options,\r\n (binding, init) => binding.createQuadLayer(init),\r\n (binding, init) => binding.createQuadLayer(init),\r\n (webGLInit, webGPUInit) => {\r\n webGPUInit.transform = webGLInit.transform;\r\n webGPUInit.width = webGLInit.width;\r\n webGPUInit.height = webGLInit.height;\r\n }\r\n );\r\n if (nativeLayer || options.fallbackMode !== \"mesh\") {\r\n return nativeLayer;\r\n }\r\n return this._createFallbackLayer(\r\n \"XRQuadLayer\",\r\n options.transformNode,\r\n options.layerInit?.transform,\r\n undefined,\r\n { width: options.layerInit?.width, height: options.layerInit?.height },\r\n options.fallbackTexture\r\n );\r\n }\r\n\r\n /**\r\n * Creates a graphics-backed cylinder layer and adds it to the current XR session.\r\n * @param options initialization and transform-node options for the layer\r\n * @returns the created layer wrapper, or `null` when the active graphics binding does not support cylinder layers\r\n */\r\n public createCylinderLayer(\r\n options: IWebXRCompositionLayerCreationOptions<XRCylinderLayerInit, XRGPUCylinderLayerInit> = {}\r\n ): Nullable<WebXRLayerCreationResult<XRCylinderLayer, \"XRCylinderLayer\">> {\r\n const factorySupported = this._isWebGPU ? typeof this._xrGPUBinding?.createCylinderLayer === \"function\" : typeof this._xrWebGLBinding.createCylinderLayer === \"function\";\r\n const factoryName = this._isWebGPU ? \"XRGPUBinding.createCylinderLayer\" : \"XRWebGLBinding.createCylinderLayer\";\r\n const nativeLayer = this._createGraphicsLayer(\r\n \"XRCylinderLayer\",\r\n factoryName,\r\n factorySupported,\r\n options,\r\n (binding, init) => binding.createCylinderLayer(init),\r\n (binding, init) => binding.createCylinderLayer(init),\r\n (webGLInit, webGPUInit) => {\r\n webGPUInit.transform = webGLInit.transform;\r\n webGPUInit.radius = webGLInit.radius;\r\n webGPUInit.centralAngle = webGLInit.centralAngle;\r\n webGPUInit.aspectRatio = webGLInit.aspectRatio;\r\n }\r\n );\r\n if (nativeLayer || options.fallbackMode !== \"mesh\") {\r\n return nativeLayer;\r\n }\r\n return this._createFallbackLayer(\r\n \"XRCylinderLayer\",\r\n options.transformNode,\r\n options.layerInit?.transform,\r\n undefined,\r\n {\r\n radius: options.layerInit?.radius,\r\n centralAngle: options.layerInit?.centralAngle,\r\n aspectRatio: options.layerInit?.aspectRatio,\r\n },\r\n options.fallbackTexture\r\n );\r\n }\r\n\r\n /**\r\n * Creates a graphics-backed equirectangular layer and adds it to the current XR session.\r\n * @param options initialization and transform-node options for the layer\r\n * @returns the created layer wrapper, or `null` when the active graphics binding does not support equirectangular layers\r\n */\r\n public createEquirectLayer(\r\n options: IWebXRCompositionLayerCreationOptions<XREquirectLayerInit, XRGPUEquirectLayerInit> = {}\r\n ): Nullable<WebXRLayerCreationResult<XREquirectLayer, \"XREquirectLayer\">> {\r\n const factorySupported = this._isWebGPU ? typeof this._xrGPUBinding?.createEquirectLayer === \"function\" : typeof this._xrWebGLBinding.createEquirectLayer === \"function\";\r\n const factoryName = this._isWebGPU ? \"XRGPUBinding.createEquirectLayer\" : \"XRWebGLBinding.createEquirectLayer\";\r\n const nativeLayer = this._createGraphicsLayer(\r\n \"XREquirectLayer\",\r\n factoryName,\r\n factorySupported,\r\n options,\r\n (binding, init) => binding.createEquirectLayer(init),\r\n (binding, init) => binding.createEquirectLayer(init),\r\n (webGLInit, webGPUInit) => {\r\n webGPUInit.transform = webGLInit.transform;\r\n webGPUInit.radius = webGLInit.radius;\r\n webGPUInit.centralHorizontalAngle = webGLInit.centralHorizontalAngle;\r\n webGPUInit.upperVerticalAngle = webGLInit.upperVerticalAngle;\r\n webGPUInit.lowerVerticalAngle = webGLInit.lowerVerticalAngle;\r\n }\r\n );\r\n if (nativeLayer || options.fallbackMode !== \"mesh\") {\r\n return nativeLayer;\r\n }\r\n return this._createFallbackLayer(\r\n \"XREquirectLayer\",\r\n options.transformNode,\r\n options.layerInit?.transform,\r\n undefined,\r\n {\r\n radius: options.layerInit?.radius,\r\n centralHorizontalAngle: options.layerInit?.centralHorizontalAngle,\r\n upperVerticalAngle: options.layerInit?.upperVerticalAngle,\r\n lowerVerticalAngle: options.layerInit?.lowerVerticalAngle,\r\n },\r\n options.fallbackTexture\r\n );\r\n }\r\n\r\n /**\r\n * Creates a graphics-backed cube layer and adds it to the current XR session.\r\n * Cube layers synchronize only the rotation of their transform node because the WebXR API does not support cube-layer translation.\r\n * @param options initialization and transform-node options for the layer\r\n * @returns the created layer wrapper, or `null` when the active graphics binding does not support cube layers\r\n */\r\n public createCubeLayer(options: IWebXRCompositionLayerCreationOptions<XRCubeLayerInit, XRGPUCubeLayerInit> = {}): Nullable<WebXRCubeLayerWrapper | WebXRFallbackLayerWrapper> {\r\n const factorySupported = this._isWebGPU ? typeof this._xrGPUBinding?.createCubeLayer === \"function\" : typeof this._xrWebGLBinding.createCubeLayer === \"function\";\r\n const factoryName = this._isWebGPU ? \"XRGPUBinding.createCubeLayer\" : \"XRWebGLBinding.createCubeLayer\";\r\n const nativeLayer = this._createGraphicsLayer(\r\n \"XRCubeLayer\",\r\n factoryName,\r\n factorySupported,\r\n options,\r\n (binding, init) => binding.createCubeLayer(init),\r\n (binding, init) => binding.createCubeLayer(init),\r\n (webGLInit, webGPUInit) => {\r\n webGPUInit.orientation = webGLInit.orientation;\r\n }\r\n ) as Nullable<WebXRCubeLayerWrapper>;\r\n if (nativeLayer || options.fallbackMode !== \"mesh\") {\r\n return nativeLayer;\r\n }\r\n return this._createFallbackLayer(\"XRCubeLayer\", options.transformNode, undefined, options.layerInit?.orientation, {}, options.fallbackTexture);\r\n }\r\n\r\n /**\r\n * Creates a video-backed quad layer and adds it to the current XR session.\r\n * @see https://playground.babylonjs.com/#D35HOL#0\r\n * @param video the video element presented by the XR compositor\r\n * @param options initialization and transform-node options for the layer\r\n * @returns the created media layer wrapper, or `null` when XRMediaBinding is unavailable\r\n */\r\n public createMediaQuadLayer(\r\n video: HTMLVideoElement,\r\n options: IWebXRMediaLayerCreationOptions<XRMediaQuadLayerInit> = {}\r\n ): Nullable<WebXRLayerCreationResult<XRQuadLayer, \"XRQuadLayer\">> {\r\n const nativeLayer = this._createMediaLayer(\"XRQuadLayer\", \"createQuadLayer\", video, options, (binding, media, init) => binding.createQuadLayer(media, init));\r\n if (nativeLayer || options.fallbackMode !== \"mesh\") {\r\n return nativeLayer;\r\n }\r\n return this._createFallbackLayer(\r\n \"XRQuadLayer\",\r\n options.transformNode,\r\n options.layerInit?.transform,\r\n undefined,\r\n { width: options.layerInit?.width, height: options.layerInit?.height },\r\n undefined,\r\n video\r\n );\r\n }\r\n\r\n /**\r\n * Creates a video-backed cylinder layer and adds it to the current XR session.\r\n * @param video the video element presented by the XR compositor\r\n * @param options initialization and transform-node options for the layer\r\n * @returns the created media layer wrapper, or `null` when XRMediaBinding is unavailable\r\n */\r\n public createMediaCylinderLayer(\r\n video: HTMLVideoElement,\r\n options: IWebXRMediaLayerCreationOptions<XRMediaCylinderLayerInit> = {}\r\n ): Nullable<WebXRLayerCreationResult<XRCylinderLayer, \"XRCylinderLayer\">> {\r\n const nativeLayer = this._createMediaLayer(\"XRCylinderLayer\", \"createCylinderLayer\", video, options, (binding, media, init) => binding.createCylinderLayer(media, init));\r\n if (nativeLayer || options.fallbackMode !== \"mesh\") {\r\n return nativeLayer;\r\n }\r\n return this._createFallbackLayer(\r\n \"XRCylinderLayer\",\r\n options.transformNode,\r\n options.layerInit?.transform,\r\n undefined,\r\n {\r\n radius: options.layerInit?.radius,\r\n centralAngle: options.layerInit?.centralAngle,\r\n aspectRatio: options.layerInit?.aspectRatio,\r\n },\r\n undefined,\r\n video\r\n );\r\n }\r\n\r\n /**\r\n * Creates a video-backed equirectangular layer and adds it to the current XR session.\r\n * @param video the video element presented by the XR compositor\r\n * @param options initialization and transform-node options for the layer\r\n * @returns the created media layer wrapper, or `null` when XRMediaBinding is unavailable\r\n */\r\n public createMediaEquirectLayer(\r\n video: HTMLVideoElement,\r\n options: IWebXRMediaLayerCreationOptions<XRMediaEquirectLayerInit> = {}\r\n ): Nullable<WebXRLayerCreationResult<XREquirectLayer, \"XREquirectLayer\">> {\r\n const nativeLayer = this._createMediaLayer(\"XREquirectLayer\", \"createEquirectLayer\", video, options, (binding, media, init) => binding.createEquirectLayer(media, init));\r\n if (nativeLayer || options.fallbackMode !== \"mesh\") {\r\n return nativeLayer;\r\n }\r\n return this._createFallbackLayer(\r\n \"XREquirectLayer\",\r\n options.transformNode,\r\n options.layerInit?.transform,\r\n undefined,\r\n {\r\n radius: options.layerInit?.radius,\r\n centralHorizontalAngle: options.layerInit?.centralHorizontalAngle,\r\n upperVerticalAngle: options.layerInit?.upperVerticalAngle,\r\n lowerVerticalAngle: options.layerInit?.lowerVerticalAngle,\r\n },\r\n undefined,\r\n video\r\n );\r\n }\r\n\r\n private _createQuadLayer(\r\n options: { params: Partial<XRQuadLayerInit> } = { params: {} },\r\n babylonTexture?: ThinTexture\r\n ): Nullable<WebXRSpatialLayerWrapper<XRQuadLayer, \"XRQuadLayer\">> {\r\n if (this._isWebGPU) {\r\n const binding = this._xrGPUBinding!;\r\n if (typeof binding.createQuadLayer !== \"function\") {\r\n Logger.Warn(WebGPUQuadLayerCreateWarning);\r\n return null;\r\n }\r\n if (typeof binding.getSubImage !== \"function\") {\r\n Logger.Warn(WebGPUQuadLayerSubImageWarning);\r\n return null;\r\n }\r\n }\r\n\r\n const wrapper = this.createQuadLayer({ layerInit: options.params });\r\n if (!wrapper || wrapper.layer === null) {\r\n return null;\r\n }\r\n const quadLayer = wrapper.layer;\r\n quadLayer.width = this._isMultiviewEnabled ? 1 : 2;\r\n quadLayer.height = 1;\r\n\r\n if (babylonTexture) {\r\n this._compositionLayerTextureMapping.set(quadLayer, babylonTexture);\r\n }\r\n return wrapper;\r\n }\r\n\r\n /**\r\n * @experimental\r\n * This will support full screen ADT when used with WebXR Layers. This API might change in the future.\r\n * Note that no interaction will be available with the ADT when using this method\r\n * @param texture the texture to display in the layer\r\n * @param options optional parameters for the layer\r\n * @returns a composition layer containing the texture, or null when WebGPU quad layers are unavailable\r\n */\r\n public addFullscreenAdvancedDynamicTexture(\r\n texture: DynamicTexture,\r\n options: { distanceFromHeadset: number } = { distanceFromHeadset: 1.5 }\r\n ): Nullable<WebXRCompositionLayerWrapper> {\r\n const wrapper = this._createQuadLayer(\r\n {\r\n params: {\r\n space: this._xrSessionManager.viewerReferenceSpace,\r\n textureType: \"texture\",\r\n layout: \"mono\",\r\n },\r\n },\r\n texture\r\n );\r\n if (!wrapper) {\r\n return null;\r\n }\r\n\r\n const distance = Math.max(0.1, options.distanceFromHeadset);\r\n const z = this._xrSessionManager.scene.useRightHandedSystem ? -distance : distance;\r\n wrapper.transformNode.position.set(0, 0, z * this._xrSessionManager.worldScalingFactor);\r\n\r\n const rttProvider = this._layerToRTTProviderMapping.get(wrapper.layer);\r\n if (\r\n !rttProvider ||\r\n (!(rttProvider instanceof WebXRCompositionLayerRenderTargetTextureProvider) && !(rttProvider instanceof WebXRWebGPUCompositionLayerRenderTargetTextureProvider))\r\n ) {\r\n throw new Error(\"Could not find the RTT provider for the layer\");\r\n }\r\n const babylonLayer = this._xrSessionManager.scene.layers.find((babylonLayer) => {\r\n return babylonLayer.texture === texture;\r\n });\r\n if (!babylonLayer) {\r\n throw new Error(\"Could not find the babylon layer for the texture\");\r\n }\r\n const renderTargetTextures = new Set<RenderTargetTexture>();\r\n const beforeRenderObservers: Observer<Scene>[] = [];\r\n const previousRenderOnlyInRenderTargetTextures = babylonLayer.renderOnlyInRenderTargetTextures;\r\n let cleanedUp = false;\r\n const renderTargetCreatedObserver = rttProvider.onRenderTargetTextureCreatedObservable.add((data) => {\r\n if (data.eye && data.eye === \"right\") {\r\n return;\r\n }\r\n data.texture.clearColor = new Color4(0, 0, 0, 0);\r\n babylonLayer.renderTargetTextures.push(data.texture);\r\n renderTargetTextures.add(data.texture);\r\n babylonLayer.renderOnlyInRenderTargetTextures = true;\r\n // for stereo (not for gui) it should be onBeforeCameraRenderObservable\r\n beforeRenderObservers.push(\r\n this._xrSessionManager.scene.onBeforeRenderObservable.add(() => {\r\n data.texture.render();\r\n })\r\n );\r\n });\r\n const cleanup = () => {\r\n if (cleanedUp) {\r\n return;\r\n }\r\n cleanedUp = true;\r\n rttProvider.onRenderTargetTextureCreatedObservable.remove(renderTargetCreatedObserver);\r\n for (const observer of beforeRenderObservers) {\r\n this._xrSessionManager.scene.onBeforeRenderObservable.remove(observer);\r\n }\r\n for (const renderTargetTexture of renderTargetTextures) {\r\n const index = babylonLayer.renderTargetTextures.indexOf(renderTargetTexture);\r\n if (index !== -1) {\r\n babylonLayer.renderTargetTextures.splice(index, 1);\r\n }\r\n }\r\n babylonLayer.renderOnlyInRenderTargetTextures = previousRenderOnlyInRenderTargetTextures;\r\n this._layerCleanupFunctions.delete(wrapper);\r\n };\r\n this._layerCleanupFunctions.set(wrapper, cleanup);\r\n this._xrSessionManager.onXRSessionEnded.addOnce(cleanup);\r\n return wrapper;\r\n }\r\n\r\n /**\r\n * @experimental\r\n * This functions allows you to add a lens flare system to the XR scene.\r\n * Note - this will remove the lens flare system from the scene and add it to the XR scene.\r\n * This feature is experimental and might change in the future.\r\n * @param flareSystem the flare system to add\r\n * @returns a composition layer containing the flare system, or null when WebGPU quad layers are unavailable\r\n */\r\n protected _addLensFlareSystem(flareSystem: LensFlareSystem): Nullable<WebXRCompositionLayerWrapper> {\r\n const wrapper = this._createQuadLayer({\r\n params: {\r\n space: this._xrSessionManager.viewerReferenceSpace,\r\n textureType: \"texture\",\r\n layout: \"mono\",\r\n },\r\n });\r\n if (!wrapper) {\r\n return null;\r\n }\r\n\r\n const layer = wrapper.layer;\r\n layer.width = 2;\r\n layer.height = 1;\r\n const distance = 10;\r\n const z = this._xrSessionManager.scene.useRightHandedSystem ? -distance : distance;\r\n wrapper.transformNode.position.set(0, 0, z * this._xrSessionManager.worldScalingFactor);\r\n\r\n // get the rtt wrapper\r\n const rttProvider = this._layerToRTTProviderMapping.get(layer);\r\n if (\r\n !rttProvider ||\r\n (!(rttProvider instanceof WebXRCompositionLayerRenderTargetTextureProvider) && !(rttProvider instanceof WebXRWebGPUCompositionLayerRenderTargetTextureProvider))\r\n ) {\r\n throw new Error(\"Could not find the RTT provider for the layer\");\r\n }\r\n // render the flare system to the rtt\r\n rttProvider.onRenderTargetTextureCreatedObservable.add((data) => {\r\n data.texture.clearColor = new Color4(0, 0, 0, 0);\r\n data.texture.customRenderFunction = () => {\r\n flareSystem.render();\r\n };\r\n\r\n // add to the scene's render targets\r\n // this._xrSessionManager.scene.onBeforeCameraRenderObservable.add(() => {\r\n // data.texture.render();\r\n // });\r\n });\r\n // remove the lens flare system from the scene\r\n this._xrSessionManager.onXRSessionInit.add(() => {\r\n this._xrSessionManager.scene.lensFlareSystems.splice(this._xrSessionManager.scene.lensFlareSystems.indexOf(flareSystem), 1);\r\n });\r\n // add it back when the session ends\r\n this._xrSessionManager.onXRSessionEnded.add(() => {\r\n this._xrSessionManager.scene.lensFlareSystems.push(flareSystem);\r\n });\r\n\r\n return wrapper;\r\n }\r\n\r\n /**\r\n * Add a new layer to the already-existing list of layers\r\n * @param wrappedLayer the new layer to add to the existing ones\r\n */\r\n public addXRSessionLayer(wrappedLayer: WebXRLayerWrapper<WebXRSupportedLayerType>) {\r\n this._validateLayerCount(this._existingLayers.length + 1);\r\n this._existingLayers.push(wrappedLayer);\r\n this.setXRSessionLayers(this._existingLayers);\r\n }\r\n\r\n /**\r\n * Removes a non-projection layer from the current XR session.\r\n * @param wrappedLayer the layer wrapper to remove\r\n * @param dispose whether to dispose the wrapper and destroy its native composition layer\r\n * @returns whether the layer was present and removed\r\n */\r\n public removeXRSessionLayer(wrappedLayer: WebXRLayerWrapper<WebXRSupportedLayerType>, dispose = true): boolean {\r\n const index = this._existingLayers.indexOf(wrappedLayer);\r\n if (index === -1) {\r\n return false;\r\n }\r\n if (wrappedLayer.layerType === \"XRProjectionLayer\") {\r\n Logger.Warn(\"The active projection layer cannot be removed from WebXRLayers.\");\r\n return false;\r\n }\r\n\r\n this._existingLayers.splice(index, 1);\r\n this._layerCleanupFunctions.get(wrappedLayer)?.();\r\n if (wrappedLayer instanceof WebXRCompositionLayerWrapper) {\r\n this._layerToRTTProviderMapping.delete(wrappedLayer.layer);\r\n this._compositionLayerTextureMapping.delete(wrappedLayer.layer);\r\n }\r\n this.setXRSessionLayers(this._existingLayers);\r\n if (dispose) {\r\n wrappedLayer.dispose();\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Removes either a native spatial layer or a fallback layer created by this feature.\r\n * @param wrappedLayer the native or fallback layer wrapper to remove\r\n * @param dispose whether to dispose resources owned by the wrapper\r\n * @returns whether the wrapper was present and removed\r\n */\r\n public removeLayer(wrappedLayer: WebXRLayerCreationResult<WebXRSpatialLayer>, dispose = true): boolean {\r\n if (wrappedLayer.layer === null) {\r\n const index = this._fallbackLayers.indexOf(wrappedLayer);\r\n if (index === -1) {\r\n return false;\r\n }\r\n this._fallbackLayers.splice(index, 1);\r\n if (dispose) {\r\n wrappedLayer.dispose();\r\n }\r\n return true;\r\n }\r\n return this.removeXRSessionLayer(wrappedLayer, dispose);\r\n }\r\n\r\n /**\r\n * Sets the layers to be used by the XR session.\r\n * Note that you must call this function with any layers you wish to render to\r\n * since it adds them to the XR session's render state\r\n * (replacing any layers that were added in a previous call to setXRSessionLayers or updateRenderState).\r\n * This method also sets up the session manager's render target texture provider\r\n * as the first layer in the array, which feeds the WebXR camera(s) attached to the session.\r\n * @param wrappedLayers An array of WebXRLayerWrapper, usually returned from the WebXRLayers createLayer functions.\r\n */\r\n public setXRSessionLayers(wrappedLayers: Array<WebXRLayerWrapper<WebXRSupportedLayerType>> = this._existingLayers): void {\r\n this._validateLayerCount(wrappedLayers.length);\r\n // this._existingLayers = wrappedLayers;\r\n const renderStateInit: XRRenderStateInit = { ...this._xrSessionManager.session.renderState };\r\n // Clear out the layer-related fields.\r\n renderStateInit.baseLayer = undefined;\r\n renderStateInit.layers = wrappedLayers.map((wrappedLayer) => wrappedLayer.layer);\r\n this._xrSessionManager.updateRenderState(renderStateInit);\r\n if (!this._projectionLayerInitialized) {\r\n this._xrSessionManager._setBaseLayerWrapper(wrappedLayers.length > 0 ? (wrappedLayers.at(0)! as WebXRLayerWrapper) : null);\r\n }\r\n }\r\n\r\n private _validateLayerCount(layerCount: number): void {\r\n const maxRenderLayers = this.maxRenderLayers;\r\n if (maxRenderLayers !== null && layerCount > maxRenderLayers) {\r\n const layerLabel = maxRenderLayers === 1 ? \"layer\" : \"layers\";\r\n throw new Error(`The XR session supports at most ${maxRenderLayers} render ${layerLabel}, but ${layerCount} were provided.`);\r\n }\r\n }\r\n\r\n /**\r\n * Checks whether the active runtime exposes the factory needed for a layer type.\r\n * This is a capability check only; creation can still fail when an initialization dictionary is invalid.\r\n * @param layerType the concrete WebXR layer type\r\n * @param source whether to check a graphics-backed or media-backed layer\r\n * @returns whether the requested factory is available\r\n */\r\n public isLayerTypeSupported(layerType: WebXRSpatialLayerType | \"XRProjectionLayer\", source: WebXRLayerSource = \"graphics\"): boolean {\r\n if (source === \"media\") {\r\n if (layerType === \"XRProjectionLayer\" || layerType === \"XRCubeLayer\" || typeof XRMediaBinding === \"undefined\") {\r\n return false;\r\n }\r\n switch (layerType) {\r\n case \"XRQuadLayer\":\r\n return typeof XRMediaBinding.prototype.createQuadLayer === \"function\";\r\n case \"XRCylinderLayer\":\r\n return typeof XRMediaBinding.prototype.createCylinderLayer === \"function\";\r\n case \"XREquirectLayer\":\r\n return typeof XRMediaBinding.prototype.createEquirectLayer === \"function\";\r\n }\r\n }\r\n\r\n if (this._xrSessionManager.scene.getEngine().isWebGPU) {\r\n if (typeof XRGPUBinding === \"undefined\") {\r\n return false;\r\n }\r\n switch (layerType) {\r\n case \"XRProjectionLayer\":\r\n return typeof XRGPUBinding.prototype.createProjectionLayer === \"function\";\r\n case \"XRQuadLayer\":\r\n return typeof XRGPUBinding.prototype.createQuadLayer === \"function\";\r\n case \"XRCylinderLayer\":\r\n return typeof XRGPUBinding.prototype.createCylinderLayer === \"function\";\r\n case \"XREquirectLayer\":\r\n return typeof XRGPUBinding.prototype.createEquirectLayer === \"function\";\r\n case \"XRCubeLayer\":\r\n return typeof XRGPUBinding.prototype.createCubeLayer === \"function\";\r\n }\r\n }\r\n\r\n if (typeof XRWebGLBinding === \"undefined\") {\r\n return false;\r\n }\r\n switch (layerType) {\r\n case \"XRProjectionLayer\":\r\n return typeof XRWebGLBinding.prototype.createProjectionLayer === \"function\";\r\n case \"XRQuadLayer\":\r\n return typeof XRWebGLBinding.prototype.createQuadLayer === \"function\";\r\n case \"XRCylinderLayer\":\r\n return typeof XRWebGLBinding.prototype.createCylinderLayer === \"function\";\r\n case \"XREquirectLayer\":\r\n return typeof XRWebGLBinding.prototype.createEquirectLayer === \"function\";\r\n case \"XRCubeLayer\":\r\n return typeof XRWebGLBinding.prototype.createCubeLayer === \"function\";\r\n }\r\n }\r\n\r\n public override isCompatible(): boolean {\r\n if (this._xrSessionManager.scene.getEngine().isWebGPU) {\r\n return IsWebGPUXRSupported();\r\n }\r\n // Native WebGL continues to use NativeXRRenderTarget instead of WebXR Layers.\r\n if (this._xrSessionManager.isNative) {\r\n return false;\r\n }\r\n return typeof XRWebGLBinding !== \"undefined\" && !!XRWebGLBinding.prototype.createProjectionLayer;\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 }\r\n\r\n protected _onXRFrame(_xrFrame: XRFrame): void {\r\n for (let i = 0; i < this._fallbackLayers.length; ++i) {\r\n this._fallbackLayers[i].updateFromTransformNode(this._xrSessionManager.worldScalingFactor);\r\n }\r\n\r\n const layers = this._existingLayers;\r\n for (let i = 0; i < layers.length; ++i) {\r\n const layer = layers[i];\r\n if (layer instanceof WebXRSpatialLayerWrapper) {\r\n layer.updateFromTransformNode(this._xrSessionManager.scene.useRightHandedSystem, this._xrSessionManager.worldScalingFactor);\r\n }\r\n if (layer.layerType === \"XRProjectionLayer\" || !(layer instanceof WebXRCompositionLayerWrapper) || !layer.usesRenderTargetProvider) {\r\n continue;\r\n }\r\n if (layer.isStatic && !layer.layer.needsRedraw) {\r\n continue;\r\n }\r\n\r\n const rttProvider = this._layerToRTTProviderMapping.get(layer.layer);\r\n if (!rttProvider) {\r\n continue;\r\n }\r\n if (layer.layer.layout === \"mono\") {\r\n rttProvider.getRenderTargetTextureForEye(\"none\");\r\n } else {\r\n const pose = _xrFrame.getViewerPose(this._xrSessionManager.referenceSpace);\r\n if (pose) {\r\n const views = pose.views;\r\n for (let j = 0; j < views.length; ++j) {\r\n rttProvider.getRenderTargetTextureForView(views[j]);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nlet _Registered = false;\r\n/**\r\n * Register side effects for webXRLayers.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\nexport function RegisterWebXRLayers(): 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 WebXRLayers.Name,\r\n (xrSessionManager, options) => {\r\n return () => new WebXRLayers(xrSessionManager, options);\r\n },\r\n WebXRLayers.Version,\r\n false\r\n );\r\n}\r\n"]}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Re-exports the pure implementation and applies runtime side effects.
3
+ * Import WebXRTrackedSources.pure for tree-shakeable, side-effect-free usage.
4
+ */
5
+ export * from "./WebXRTrackedSources.pure.js";
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Re-exports the pure implementation and applies runtime side effects.
3
+ * Import WebXRTrackedSources.pure for tree-shakeable, side-effect-free usage.
4
+ */
5
+ export * from "./WebXRTrackedSources.pure.js";
6
+ import { RegisterWebXRTrackedSources } from "./WebXRTrackedSources.pure.js";
7
+ RegisterWebXRTrackedSources();
8
+ //# sourceMappingURL=WebXRTrackedSources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebXRTrackedSources.js","sourceRoot":"","sources":["../../../../../dev/core/src/XR/features/WebXRTrackedSources.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,cAAc,4BAA4B,CAAC;AAE3C,OAAO,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AACzE,2BAA2B,EAAE,CAAC","sourcesContent":["/**\n * Re-exports the pure implementation and applies runtime side effects.\n * Import WebXRTrackedSources.pure for tree-shakeable, side-effect-free usage.\n */\nexport * from \"./WebXRTrackedSources.pure\";\n\nimport { RegisterWebXRTrackedSources } from \"./WebXRTrackedSources.pure\";\nRegisterWebXRTrackedSources();\n"]}
@@ -0,0 +1,70 @@
1
+ /** This file must only contain pure code and pure imports */
2
+ import { Observable } from "../../Misc/observable.pure.js";
3
+ import { type WebXRSessionManager } from "../webXRSessionManager.js";
4
+ import { WebXRAbstractFeature } from "./WebXRAbstractFeature.js";
5
+ /**
6
+ * Exposes input sources that the XR runtime continues tracking while they are not active input sources.
7
+ *
8
+ * Tracked sources are intentionally kept separate from `XRSession.inputSources` and Babylon's normal
9
+ * WebXR input/controller pipeline.
10
+ * @see https://immersive-web.github.io/webxr/#dom-xrsession-trackedsources
11
+ * @see https://playground.babylonjs.com/#JRBQVL#0
12
+ */
13
+ export declare class WebXRTrackedSources extends WebXRAbstractFeature {
14
+ private readonly _trackedSources;
15
+ private _trackedSourcesSession;
16
+ /**
17
+ * The module's name.
18
+ */
19
+ static readonly Name: "xr-tracked-sources";
20
+ /**
21
+ * The Babylon version of this module.
22
+ *
23
+ * This number does not correspond to the WebXR specification version.
24
+ */
25
+ static readonly Version = 1;
26
+ /**
27
+ * Notifies observers when a source enters the feature's current tracked source set.
28
+ */
29
+ readonly onTrackedSourceAddedObservable: Observable<XRInputSource>;
30
+ /**
31
+ * Notifies observers when a source leaves the feature's current tracked source set, including on detach.
32
+ */
33
+ readonly onTrackedSourceRemovedObservable: Observable<XRInputSource>;
34
+ /**
35
+ * Creates a WebXR tracked sources feature.
36
+ * @param _xrSessionManager The WebXR session manager.
37
+ */
38
+ constructor(_xrSessionManager: WebXRSessionManager);
39
+ /**
40
+ * Gets a copy of the sources currently reported by `XRSession.trackedSources`.
41
+ *
42
+ * These sources are not added to `XRSession.inputSources` or Babylon's controller collection.
43
+ */
44
+ get trackedSources(): ReadonlyArray<XRInputSource>;
45
+ /**
46
+ * Attaches the feature to the active XR session.
47
+ * @param force Whether to reattach when the feature is already attached.
48
+ * @returns `true` when attachment succeeds; otherwise `false`.
49
+ */
50
+ attach(force?: boolean): boolean;
51
+ /**
52
+ * Detaches the feature and clears its tracked source state.
53
+ * @returns `true` when detachment succeeds; otherwise `false`.
54
+ */
55
+ detach(): boolean;
56
+ /**
57
+ * Disposes the feature and clears its observables.
58
+ */
59
+ dispose(): void;
60
+ protected _onXRFrame(): void;
61
+ private _onTrackedSourcesChanged;
62
+ private _synchronizeTrackedSources;
63
+ private _clearTrackedSources;
64
+ }
65
+ /**
66
+ * Registers the WebXR tracked sources feature.
67
+ *
68
+ * Safe to call multiple times; only the first call has an effect.
69
+ */
70
+ export declare function RegisterWebXRTrackedSources(): void;