@onerjs/core 8.54.3 → 8.54.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (211) hide show
  1. package/DeviceInput/webDeviceInputSystem.js +4 -0
  2. package/DeviceInput/webDeviceInputSystem.js.map +1 -1
  3. package/Engines/WebGPU/Extensions/engine.cubeTexture.pure.js +1 -1
  4. package/Engines/WebGPU/Extensions/engine.cubeTexture.pure.js.map +1 -1
  5. package/Engines/WebGPU/Extensions/engine.rawTexture.pure.js +2 -2
  6. package/Engines/WebGPU/Extensions/engine.rawTexture.pure.js.map +1 -1
  7. package/Engines/WebGPU/webgpuCacheRenderPipeline.d.ts +1 -0
  8. package/Engines/WebGPU/webgpuCacheRenderPipeline.js +18 -4
  9. package/Engines/WebGPU/webgpuCacheRenderPipeline.js.map +1 -1
  10. package/Engines/WebGPU/webgpuCacheTextureView.d.ts +13 -0
  11. package/Engines/WebGPU/webgpuCacheTextureView.js +32 -0
  12. package/Engines/WebGPU/webgpuCacheTextureView.js.map +1 -0
  13. package/Engines/WebGPU/webgpuRenderTargetWrapper.d.ts +10 -0
  14. package/Engines/WebGPU/webgpuRenderTargetWrapper.js +10 -0
  15. package/Engines/WebGPU/webgpuRenderTargetWrapper.js.map +1 -1
  16. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.pure.js +57 -4
  17. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.pure.js.map +1 -1
  18. package/Engines/WebGPU/webgpuTextureManager.d.ts +1 -1
  19. package/Engines/WebGPU/webgpuTextureManager.js +4 -2
  20. package/Engines/WebGPU/webgpuTextureManager.js.map +1 -1
  21. package/Engines/abstractEngine.pure.js +2 -2
  22. package/Engines/abstractEngine.pure.js.map +1 -1
  23. package/Engines/thinNativeEngine.pure.d.ts +5 -0
  24. package/Engines/thinNativeEngine.pure.js +29 -6
  25. package/Engines/thinNativeEngine.pure.js.map +1 -1
  26. package/Engines/webgpuEngine.pure.d.ts +1 -0
  27. package/Engines/webgpuEngine.pure.js +21 -8
  28. package/Engines/webgpuEngine.pure.js.map +1 -1
  29. package/FlowGraph/Blocks/Data/Math/flowGraphMathBlocks.pure.d.ts +95 -1
  30. package/FlowGraph/Blocks/Data/Math/flowGraphMathBlocks.pure.js +169 -4
  31. package/FlowGraph/Blocks/Data/Math/flowGraphMathBlocks.pure.js.map +1 -1
  32. package/FlowGraph/Blocks/Data/Math/flowGraphMathCombineExtractBlocks.pure.d.ts +21 -6
  33. package/FlowGraph/Blocks/Data/Math/flowGraphMathCombineExtractBlocks.pure.js +28 -26
  34. package/FlowGraph/Blocks/Data/Math/flowGraphMathCombineExtractBlocks.pure.js.map +1 -1
  35. package/FlowGraph/Blocks/Data/Math/flowGraphMatrixMathBlocks.pure.d.ts +30 -2
  36. package/FlowGraph/Blocks/Data/Math/flowGraphMatrixMathBlocks.pure.js +111 -29
  37. package/FlowGraph/Blocks/Data/Math/flowGraphMatrixMathBlocks.pure.js.map +1 -1
  38. package/FlowGraph/Blocks/Data/Math/flowGraphVectorMathBlocks.pure.d.ts +56 -2
  39. package/FlowGraph/Blocks/Data/Math/flowGraphVectorMathBlocks.pure.js +99 -14
  40. package/FlowGraph/Blocks/Data/Math/flowGraphVectorMathBlocks.pure.js.map +1 -1
  41. package/FlowGraph/Blocks/Data/Transformers/flowGraphJsonPointerParserBlock.pure.js +10 -2
  42. package/FlowGraph/Blocks/Data/Transformers/flowGraphJsonPointerParserBlock.pure.js.map +1 -1
  43. package/FlowGraph/Blocks/Data/Utils/flowGraphArrayIndexBlock.pure.js +21 -1
  44. package/FlowGraph/Blocks/Data/Utils/flowGraphArrayIndexBlock.pure.js.map +1 -1
  45. package/FlowGraph/Blocks/Data/flowGraphCachedOperationBlock.d.ts +18 -0
  46. package/FlowGraph/Blocks/Data/flowGraphCachedOperationBlock.js +29 -2
  47. package/FlowGraph/Blocks/Data/flowGraphCachedOperationBlock.js.map +1 -1
  48. package/FlowGraph/Blocks/Event/flowGraphReceiveCustomEventBlock.pure.d.ts +15 -0
  49. package/FlowGraph/Blocks/Event/flowGraphReceiveCustomEventBlock.pure.js +44 -7
  50. package/FlowGraph/Blocks/Event/flowGraphReceiveCustomEventBlock.pure.js.map +1 -1
  51. package/FlowGraph/Blocks/Event/flowGraphSceneReadyEventBlock.pure.d.ts +9 -0
  52. package/FlowGraph/Blocks/Event/flowGraphSceneReadyEventBlock.pure.js +9 -1
  53. package/FlowGraph/Blocks/Event/flowGraphSceneReadyEventBlock.pure.js.map +1 -1
  54. package/FlowGraph/Blocks/Event/flowGraphSceneTickEventBlock.pure.d.ts +7 -0
  55. package/FlowGraph/Blocks/Event/flowGraphSceneTickEventBlock.pure.js +8 -1
  56. package/FlowGraph/Blocks/Event/flowGraphSceneTickEventBlock.pure.js.map +1 -1
  57. package/FlowGraph/Blocks/Event/flowGraphStopEventPropagationBlock.d.ts +5 -0
  58. package/FlowGraph/Blocks/Event/flowGraphStopEventPropagationBlock.js +8 -0
  59. package/FlowGraph/Blocks/Event/flowGraphStopEventPropagationBlock.js.map +1 -0
  60. package/FlowGraph/Blocks/Event/flowGraphStopEventPropagationBlock.pure.d.ts +37 -0
  61. package/FlowGraph/Blocks/Event/flowGraphStopEventPropagationBlock.pure.js +44 -0
  62. package/FlowGraph/Blocks/Event/flowGraphStopEventPropagationBlock.pure.js.map +1 -0
  63. package/FlowGraph/Blocks/Event/index.d.ts +1 -0
  64. package/FlowGraph/Blocks/Event/index.js +1 -0
  65. package/FlowGraph/Blocks/Event/index.js.map +1 -1
  66. package/FlowGraph/Blocks/Event/pure.d.ts +1 -0
  67. package/FlowGraph/Blocks/Event/pure.js +1 -0
  68. package/FlowGraph/Blocks/Event/pure.js.map +1 -1
  69. package/FlowGraph/Blocks/Execution/Animation/flowGraphBezierCurveEasingBlock.pure.d.ts +4 -1
  70. package/FlowGraph/Blocks/Execution/Animation/flowGraphBezierCurveEasingBlock.pure.js +67 -2
  71. package/FlowGraph/Blocks/Execution/Animation/flowGraphBezierCurveEasingBlock.pure.js.map +1 -1
  72. package/FlowGraph/Blocks/Execution/Animation/flowGraphPlayAnimationBlock.pure.d.ts +13 -0
  73. package/FlowGraph/Blocks/Execution/Animation/flowGraphPlayAnimationBlock.pure.js +102 -7
  74. package/FlowGraph/Blocks/Execution/Animation/flowGraphPlayAnimationBlock.pure.js.map +1 -1
  75. package/FlowGraph/Blocks/Execution/Animation/flowGraphStopAnimationBlock.pure.js +5 -1
  76. package/FlowGraph/Blocks/Execution/Animation/flowGraphStopAnimationBlock.pure.js.map +1 -1
  77. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphCancelDelayBlock.pure.js +5 -1
  78. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphCancelDelayBlock.pure.js.map +1 -1
  79. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphForLoopBlock.pure.d.ts +11 -2
  80. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphForLoopBlock.pure.js +21 -3
  81. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphForLoopBlock.pure.js.map +1 -1
  82. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphSetDelayBlock.pure.js +25 -4
  83. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphSetDelayBlock.pure.js.map +1 -1
  84. package/FlowGraph/Blocks/flowGraphBlockFactory.js +18 -0
  85. package/FlowGraph/Blocks/flowGraphBlockFactory.js.map +1 -1
  86. package/FlowGraph/Blocks/flowGraphBlockNames.d.ts +9 -0
  87. package/FlowGraph/Blocks/flowGraphBlockNames.js +9 -0
  88. package/FlowGraph/Blocks/flowGraphBlockNames.js.map +1 -1
  89. package/FlowGraph/CustomTypes/flowGraphMatrix.d.ts +17 -3
  90. package/FlowGraph/CustomTypes/flowGraphMatrix.js +27 -21
  91. package/FlowGraph/CustomTypes/flowGraphMatrix.js.map +1 -1
  92. package/FlowGraph/flowGraphContext.d.ts +23 -0
  93. package/FlowGraph/flowGraphContext.js +29 -0
  94. package/FlowGraph/flowGraphContext.js.map +1 -1
  95. package/FlowGraph/flowGraphCoordinator.d.ts +58 -1
  96. package/FlowGraph/flowGraphCoordinator.js +72 -0
  97. package/FlowGraph/flowGraphCoordinator.js.map +1 -1
  98. package/FlowGraph/flowGraphDelayRegistry.d.ts +31 -0
  99. package/FlowGraph/flowGraphDelayRegistry.js +50 -0
  100. package/FlowGraph/flowGraphDelayRegistry.js.map +1 -0
  101. package/FlowGraph/flowGraphHostResolver.d.ts +69 -0
  102. package/FlowGraph/flowGraphHostResolver.js +25 -0
  103. package/FlowGraph/flowGraphHostResolver.js.map +1 -0
  104. package/FlowGraph/flowGraphMath.d.ts +48 -1
  105. package/FlowGraph/flowGraphMath.js +169 -4
  106. package/FlowGraph/flowGraphMath.js.map +1 -1
  107. package/FlowGraph/flowGraphPathConverterComponent.d.ts +14 -3
  108. package/FlowGraph/flowGraphPathConverterComponent.js +110 -18
  109. package/FlowGraph/flowGraphPathConverterComponent.js.map +1 -1
  110. package/FlowGraph/flowGraphSignalConnection.pure.js +7 -1
  111. package/FlowGraph/flowGraphSignalConnection.pure.js.map +1 -1
  112. package/FlowGraph/index.d.ts +2 -0
  113. package/FlowGraph/index.js +2 -0
  114. package/FlowGraph/index.js.map +1 -1
  115. package/FlowGraph/pure.d.ts +2 -0
  116. package/FlowGraph/pure.js +2 -0
  117. package/FlowGraph/pure.js.map +1 -1
  118. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.pure.js +3 -1
  119. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.pure.js.map +1 -1
  120. package/Maths/math.vector.pure.d.ts +10 -0
  121. package/Maths/math.vector.pure.js +13 -0
  122. package/Maths/math.vector.pure.js.map +1 -1
  123. package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.d.ts +216 -1
  124. package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.js +714 -67
  125. package/Meshes/GaussianSplatting/gaussianSplattingMesh.pure.js.map +1 -1
  126. package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.d.ts +81 -4
  127. package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js +487 -54
  128. package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js.map +1 -1
  129. package/Meshes/GaussianSplatting/gaussianSplattingPartProxyMesh.pure.d.ts +19 -0
  130. package/Meshes/GaussianSplatting/gaussianSplattingPartProxyMesh.pure.js +24 -0
  131. package/Meshes/GaussianSplatting/gaussianSplattingPartProxyMesh.pure.js.map +1 -1
  132. package/Meshes/GaussianSplatting/gaussianSplattingSortWorker.js +48 -10
  133. package/Meshes/GaussianSplatting/gaussianSplattingSortWorker.js.map +1 -1
  134. package/Meshes/GreasedLine/greasedLineRibbonMesh.pure.js +5 -1
  135. package/Meshes/GreasedLine/greasedLineRibbonMesh.pure.js.map +1 -1
  136. package/Meshes/abstractMesh.pure.js +5 -3
  137. package/Meshes/abstractMesh.pure.js.map +1 -1
  138. package/Misc/greasedLineTools.js +1 -1
  139. package/Misc/greasedLineTools.js.map +1 -1
  140. package/Misc/tools.pure.js +14 -2
  141. package/Misc/tools.pure.js.map +1 -1
  142. package/Particles/gpuParticleSystem.pure.d.ts +66 -1
  143. package/Particles/gpuParticleSystem.pure.js +189 -49
  144. package/Particles/gpuParticleSystem.pure.js.map +1 -1
  145. package/Physics/v2/Plugins/havokPlugin.d.ts +15 -0
  146. package/Physics/v2/Plugins/havokPlugin.js +16 -6
  147. package/Physics/v2/Plugins/havokPlugin.js.map +1 -1
  148. package/Physics/v2/characterController.js +71 -19
  149. package/Physics/v2/characterController.js.map +1 -1
  150. package/ShadersWGSL/ShadersInclude/clusteredLightingCompute.d.ts +5 -0
  151. package/ShadersWGSL/ShadersInclude/clusteredLightingCompute.js +29 -0
  152. package/ShadersWGSL/ShadersInclude/clusteredLightingCompute.js.map +1 -0
  153. package/ShadersWGSL/ShadersInclude/lightFragment.js +2 -3
  154. package/ShadersWGSL/ShadersInclude/lightFragment.js.map +1 -1
  155. package/ShadersWGSL/ShadersInclude/lightsFragmentFunctions.d.ts +1 -0
  156. package/ShadersWGSL/ShadersInclude/lightsFragmentFunctions.js +2 -17
  157. package/ShadersWGSL/ShadersInclude/lightsFragmentFunctions.js.map +1 -1
  158. package/ShadersWGSL/ShadersInclude/pbrClusteredLightingFunctions.d.ts +6 -0
  159. package/ShadersWGSL/ShadersInclude/pbrClusteredLightingFunctions.js +123 -0
  160. package/ShadersWGSL/ShadersInclude/pbrClusteredLightingFunctions.js.map +1 -0
  161. package/ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions.d.ts +1 -1
  162. package/ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions.js +2 -111
  163. package/ShadersWGSL/ShadersInclude/pbrDirectLightingFunctions.js.map +1 -1
  164. package/ShadersWGSL/background.fragment.js +2 -1
  165. package/ShadersWGSL/background.fragment.js.map +1 -1
  166. package/ShadersWGSL/default.fragment.js +2 -1
  167. package/ShadersWGSL/default.fragment.js.map +1 -1
  168. package/ShadersWGSL/openpbr.fragment.js +2 -1
  169. package/ShadersWGSL/openpbr.fragment.js.map +1 -1
  170. package/ShadersWGSL/pbr.fragment.js +2 -1
  171. package/ShadersWGSL/pbr.fragment.js.map +1 -1
  172. package/XR/features/Layers/WebXRWebGPUCompositionLayer.d.ts +3 -9
  173. package/XR/features/Layers/WebXRWebGPUCompositionLayer.js +4 -11
  174. package/XR/features/Layers/WebXRWebGPUCompositionLayer.js.map +1 -1
  175. package/XR/features/WebXRAbstractFeature.d.ts +9 -0
  176. package/XR/features/WebXRAbstractFeature.js +16 -0
  177. package/XR/features/WebXRAbstractFeature.js.map +1 -1
  178. package/XR/features/WebXRDepthSensing.pure.d.ts +7 -0
  179. package/XR/features/WebXRDepthSensing.pure.js +350 -39
  180. package/XR/features/WebXRDepthSensing.pure.js.map +1 -1
  181. package/XR/features/WebXRImageTracking.pure.js.map +1 -1
  182. package/XR/features/WebXRLayers.pure.d.ts +6 -5
  183. package/XR/features/WebXRLayers.pure.js +65 -8
  184. package/XR/features/WebXRLayers.pure.js.map +1 -1
  185. package/XR/features/WebXRRawCameraAccess.pure.js +9 -2
  186. package/XR/features/WebXRRawCameraAccess.pure.js.map +1 -1
  187. package/XR/features/WebXRSpaceWarp.pure.d.ts +0 -1
  188. package/XR/features/WebXRSpaceWarp.pure.js +13 -4
  189. package/XR/features/WebXRSpaceWarp.pure.js.map +1 -1
  190. package/XR/features/WebXRWalkingLocomotion.pure.js.map +1 -1
  191. package/XR/webXRCamera.js +27 -0
  192. package/XR/webXRCamera.js.map +1 -1
  193. package/XR/webXRFeatureWarningRegistry.d.ts +14 -0
  194. package/XR/webXRFeatureWarningRegistry.js +19 -0
  195. package/XR/webXRFeatureWarningRegistry.js.map +1 -0
  196. package/XR/webXRFeaturesManager.d.ts +5 -0
  197. package/XR/webXRFeaturesManager.js +23 -4
  198. package/XR/webXRFeaturesManager.js.map +1 -1
  199. package/XR/webXRGraphicsBinding.d.ts +17 -10
  200. package/XR/webXRGraphicsBinding.js +8 -5
  201. package/XR/webXRGraphicsBinding.js.map +1 -1
  202. package/XR/webXRSessionManager.d.ts +3 -5
  203. package/XR/webXRSessionManager.js +1 -3
  204. package/XR/webXRSessionManager.js.map +1 -1
  205. package/XR/webXRWebGPURenderTargetTextureProvider.d.ts +21 -5
  206. package/XR/webXRWebGPURenderTargetTextureProvider.js +38 -10
  207. package/XR/webXRWebGPURenderTargetTextureProvider.js.map +1 -1
  208. package/package.json +1 -1
  209. package/scene.pure.d.ts +7 -0
  210. package/scene.pure.js +8 -0
  211. package/scene.pure.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"WebXRLayers.pure.js","sourceRoot":"","sources":["../../../../../dev/core/src/XR/features/WebXRLayers.pure.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAE7D,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAEjF,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,2BAA2B,EAAE,4BAA4B,EAAE,MAAM,+BAA+B,CAAC;AAC1G,OAAO,EAAE,gDAAgD,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAChI,OAAO,EAAE,iCAAiC,EAAE,qCAAqC,EAAE,MAAM,qCAAqC,CAAC;AAI/H,OAAO,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AAIrD,MAAM,uBAAuB,GAAqB,EAAE,CAAC;AAkBrD;;GAEG;AACH,MAAM,OAAO,WAAY,SAAQ,oBAAoB;IA0BjD,YACI,iBAAsC,EACrB,WAAgC,EAAE;QAEnD,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAFR,aAAQ,GAAR,QAAQ,CAA0B;QAjBvD;;WAEG;QACK,oBAAe,GAAwB,EAAE,CAAC;QAI1C,cAAS,GAAG,KAAK,CAAC;QAElB,wBAAmB,GAAG,KAAK,CAAC;QAC5B,gCAA2B,GAAG,KAAK,CAAC;QAEpC,oCAA+B,GAA6C,IAAI,OAAO,EAAE,CAAC;QAC1F,+BAA0B,GAAkF,IAAI,OAAO,EAAE,CAAC;QAO9H,IAAI,CAAC,mBAAmB,GAAG,QAAQ,CAAC;IACxC,CAAC;IAED;;;;;OAKG;IACa,MAAM;QAClB,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YAClB,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QACxD,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC;QAChC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC;QAEjC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,mBAAmB,EAAE,CAAC;YAC7D,IAAI,OAAO,CAAC,WAAW,4CAAoC,EAAE,CAAC;gBAC1D,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;YAC/E,CAAC;YACD,IAAI,CAAC,aAAa,GAAI,OAAsC,CAAC,OAAO,CAAC;YACrE,4FAA4F;YAC5F,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;YACjC,IAAI,CAAC,4BAA4B,EAAE,CAAC;QACxC,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,UAAU,GAAI,MAAqB,CAAC,GAAG,CAAC;YAC7C,IAAI,CAAC,eAAe,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YAE3F,MAAM,mBAAmB,GAAG,EAAE,GAAG,4BAA4B,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,mBAAmB,EAAE,CAAC;YACtG,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,QAAQ,CAAC,qBAAqB,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC;YAC7F,IAAI,CAAC,qBAAqB,CAAC,mBAAmB,CAAC,8BAA8B,CAAC,CAAC;QACnF,CAAC;QACD,IAAI,CAAC,2BAA2B,GAAG,IAAI,CAAC;QAExC,OAAO,IAAI,CAAC;IAChB,CAAC;IAEe,MAAM;QAClB,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YAClB,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACvC,KAAK,CAAC,OAAO,EAAE,CAAC;QACpB,CAAC;QACD,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC;QAChC,IAAI,CAAC,2BAA2B,GAAG,KAAK,CAAC;QACzC,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACI,kBAAkB,CAAC,MAAM,GAAG,uBAAuB;QACtD,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACxF,OAAO,IAAI,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC;IAEO,kBAAkB,CAAC,MAA+C,EAAE,SAAS,GAAG,IAAI,CAAC,mBAAmB;QAC5G,6BAA6B;QAC7B,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,6GAA6G,CAAC,CAAC;QACnI,CAAC;QACD,IAAI,SAAS,IAAI,MAAM,CAAC,WAAW,KAAK,eAAe,EAAE,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,4HAA4H,CAAC,CAAC;QAClJ,CAAC;QAED,iFAAiF;QACjF,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,WAAW,KAAK,eAAe,EAAE,CAAC;YACvD,MAAM,IAAI,KAAK,CAAC,yGAAyG,CAAC,CAAC;QAC/H,CAAC;IACL,CAAC;IAEO,kBAAkB,CAAC,MAA+C,EAAE,SAAS,GAAG,IAAI,CAAC,mBAAmB;QAC5G,IAAI,SAAS,EAAE,CAAC;YACZ,MAAM,CAAC,WAAW,GAAG,eAAe,CAAC;QACzC,CAAC;QACD,OAAO,MAAM,CAAC;IAClB,CAAC;IAED;;;;;OAKG;IACI,qBAAqB,CAAC,MAAM,GAAG,4BAA4B,EAAE,SAAS,GAAG,IAAI,CAAC,mBAAmB;QACpG,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAC3C,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAE3C,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;QACrE,MAAM,KAAK,GAAG,IAAI,2BAA2B,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QAC1F,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC9B,OAAO,KAAK,CAAC;IACjB,CAAC;IAED;;;;OAIG;IACK,4BAA4B;QAChC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,6GAA6G,CAAC,CAAC;QACnI,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,aAAc,CAAC;QACpC,MAAM,IAAI,GAAG,qCAAqC,CAAC,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAAC;QACtF,MAAM,SAAS,GAAG,OAAO,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,IAAI,iCAAiC,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACxG,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC9B,OAAO,KAAK,CAAC;IACjB,CAAC;IAED;;;;;OAKG;IACK,gBAAgB,CAAC,UAAgD,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,cAA4B;QACjH,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAI,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,KAA2B,CAAC,YAAY,CAAC;QAChF,MAAM,MAAM,GAAI,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,KAA2B,CAAC,aAAa,CAAC;QAClF,MAAM,eAAe,GAAoB;YACrC,KAAK,EAAE,IAAI,CAAC,iBAAiB,CAAC,cAAc;YAC5C,cAAc,EAAE,KAAK;YACrB,eAAe,EAAE,MAAM;YACvB,aAAa,EAAE,IAAI;YACnB,GAAG,OAAO,CAAC,MAAM;SACpB,CAAC;QACF,IAAI,CAAC,kBAAkB,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;QAChD,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC;QAExE,SAAS,CAAC,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnD,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;QACrB,mEAAmE;QACnE,MAAM,OAAO,GAAiC,IAAI,4BAA4B,CAC1E,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,EACrB,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,EACtB,SAAS,EACT,aAAa,EACb,KAAK,EACL,CAAC,cAAc,EAAE,EAAE,CAAC,IAAI,gDAAgD,CAAC,cAAc,EAAE,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,CAC1H,CAAC;QAEF,IAAI,cAAc,EAAE,CAAC;YACjB,IAAI,CAAC,+BAA+B,CAAC,GAAG,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;QACxE,CAAC;QACD,MAAM,GAAG,GAAG,OAAO,CAAC,iCAAiC,CAAC,IAAI,CAAC,iBAAiB,CAAqD,CAAC;QAClI,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QACpD,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAChC,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;;;;;OAOG;IACI,mCAAmC,CAAC,OAAuB,EAAE,UAA2C,EAAE,mBAAmB,EAAE,GAAG,EAAE;QACvI,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CACjC;YACI,MAAM,EAAE;gBACJ,KAAK,EAAE,IAAI,CAAC,iBAAiB,CAAC,oBAAoB;gBAClD,WAAW,EAAE,SAAS;gBACtB,MAAM,EAAE,MAAM;aACjB;SACJ,EACD,OAAO,CACV,CAAC;QAEF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAoB,CAAC;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;QAC5D,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QAC1C,KAAK,CAAC,SAAS,GAAG,IAAI,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAEpD,MAAM,WAAW,GAAG,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC/D,IAAI,CAAC,WAAW,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACrE,CAAC;QACD,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,EAAE;YAC3E,OAAO,YAAY,CAAC,OAAO,KAAK,OAAO,CAAC;QAC5C,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,YAAY,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACxE,CAAC;QACD,WAAW,CAAC,sCAAsC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YAC5D,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC;gBACnC,OAAO;YACX,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,UAAU,GAAG,IAAI,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACjD,YAAY,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACrD,YAAY,CAAC,gCAAgC,GAAG,IAAI,CAAC;YACrD,uEAAuE;YACvE,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,wBAAwB,CAAC,GAAG,CAAC,GAAG,EAAE;gBAC3D,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAC1B,CAAC,CAAC,CAAC;YACH,YAAY,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACrD,YAAY,CAAC,gCAAgC,GAAG,IAAI,CAAC;YACrD,oCAAoC;YACpC,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,OAAO,CAAC,GAAG,EAAE;gBACjD,YAAY,CAAC,oBAAoB,CAAC,MAAM,CAAC,YAAY,CAAC,oBAAoB,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;gBACrG,YAAY,CAAC,gCAAgC,GAAG,KAAK,CAAC;YAC1D,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;QACH,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;;;;;OAOG;IACO,mBAAmB,CAAC,WAA4B;QACtD,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC;YAClC,MAAM,EAAE;gBACJ,KAAK,EAAE,IAAI,CAAC,iBAAiB,CAAC,oBAAoB;gBAClD,WAAW,EAAE,SAAS;gBACtB,MAAM,EAAE,MAAM;aACjB;SACJ,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,OAAO,CAAC,KAAoB,CAAC;QAC3C,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;QAChB,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QACjB,MAAM,QAAQ,GAAG,EAAE,CAAC;QACpB,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QAC1C,KAAK,CAAC,SAAS,GAAG,IAAI,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAEpD,sBAAsB;QACtB,MAAM,WAAW,GAAG,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC/D,IAAI,CAAC,WAAW,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACrE,CAAC;QACD,qCAAqC;QACrC,WAAW,CAAC,sCAAsC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YAC5D,IAAI,CAAC,OAAO,CAAC,UAAU,GAAG,IAAI,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACjD,IAAI,CAAC,OAAO,CAAC,oBAAoB,GAAG,GAAG,EAAE;gBACrC,WAAW,CAAC,MAAM,EAAE,CAAC;YACzB,CAAC,CAAC;YAEF,oCAAoC;YACpC,0EAA0E;YAC1E,6BAA6B;YAC7B,MAAM;QACV,CAAC,CAAC,CAAC;QACH,8CAA8C;QAC9C,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,EAAE;YAC5C,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;QAChI,CAAC,CAAC,CAAC;QACH,oCAAoC;QACpC,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE;YAC7C,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;OAGG;IACI,iBAAiB,CAAC,YAA+B;QACpD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACxC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAClD,CAAC;IAED;;;;;;;;OAQG;IACI,kBAAkB,CAAC,gBAA0C,IAAI,CAAC,eAAe;QACpF,wCAAwC;QACxC,MAAM,eAAe,GAAsB,EAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QAC7F,sCAAsC;QACtC,eAAe,CAAC,SAAS,GAAG,SAAS,CAAC;QACtC,eAAe,CAAC,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QACjF,IAAI,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAC;QAC1D,IAAI,CAAC,IAAI,CAAC,2BAA2B,EAAE,CAAC;YACpC,IAAI,CAAC,iBAAiB,CAAC,oBAAoB,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACxG,CAAC;IACL,CAAC;IAEe,YAAY;QACxB,IAAI,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,QAAQ,EAAE,CAAC;YACpD,OAAO,OAAO,YAAY,KAAK,WAAW,IAAI,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,qBAAqB,CAAC;QACjG,CAAC;QACD,8EAA8E;QAC9E,IAAI,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,CAAC;YAClC,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,OAAO,OAAO,cAAc,KAAK,WAAW,IAAI,CAAC,CAAC,cAAc,CAAC,SAAS,CAAC,qBAAqB,CAAC;IACrG,CAAC;IAED;;OAEG;IACa,OAAO;QACnB,KAAK,CAAC,OAAO,EAAE,CAAC;IACpB,CAAC;IAES,UAAU,CAAC,QAAiB;QAClC,yJAAyJ;QACzJ,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC;QACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;YACrC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACxB,IAAI,KAAK,CAAC,SAAS,KAAK,mBAAmB,EAAE,CAAC;gBAC1C,uBAAuB;gBACvB,MAAM,WAAW,GAAG,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC,KAAK,CAAC,KAA2B,CAAC,CAAC;gBAC3F,IAAI,CAAC,WAAW,EAAE,CAAC;oBACf,SAAS;gBACb,CAAC;gBAED,IAAI,WAAW,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC;oBACvC,wCAAwC;oBACxC,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;oBAC3E,IAAI,IAAI,EAAE,CAAC;wBACP,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;wBACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;4BACpC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;4BACtB,WAAW,CAAC,6BAA6B,CAAC,IAAI,CAAC,CAAC;wBACpD,CAAC;oBACL,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACJ,WAAW,CAAC,6BAA6B,EAAE,CAAC;gBAChD,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;;AAvXD;;GAEG;AACoB,gBAAI,GAAG,gBAAgB,CAAC,MAAM,AAA1B,CAA2B;AACtD;;;;GAIG;AACoB,mBAAO,GAAG,CAAC,AAAJ,CAAK;AAiXvC,IAAI,WAAW,GAAG,KAAK,CAAC;AACxB;;;GAGG;AACH,MAAM,UAAU,mBAAmB;IAC/B,IAAI,WAAW,EAAE,CAAC;QACd,OAAO;IACX,CAAC;IACD,WAAW,GAAG,IAAI,CAAC;IAEnB,qBAAqB;IACrB,oBAAoB,CAAC,eAAe,CAChC,WAAW,CAAC,IAAI,EAChB,CAAC,gBAAgB,EAAE,OAAO,EAAE,EAAE;QAC1B,OAAO,GAAG,EAAE,CAAC,IAAI,WAAW,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;IAC5D,CAAC,EACD,WAAW,CAAC,OAAO,EACnB,KAAK,CACR,CAAC;AACN,CAAC","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 } from \"../webXRLayerWrapper\";\r\nimport { WebXRWebGLLayerWrapper } from \"../webXRWebGLLayer\";\r\nimport { WebXRProjectionLayerWrapper, DefaultXRProjectionLayerInit } from \"./Layers/WebXRProjectionLayer\";\r\nimport { WebXRCompositionLayerRenderTargetTextureProvider, WebXRCompositionLayerWrapper } from \"./Layers/WebXRCompositionLayer\";\r\nimport { WebXRWebGPUProjectionLayerWrapper, CreateDefaultXRGPUProjectionLayerInit } from \"./Layers/WebXRWebGPUProjectionLayer\";\r\nimport { WebXRGraphicsBindingType, type WebXRWebGPUGraphicsBinding } from \"../webXRGraphicsBinding\";\r\nimport { type ThinTexture } from \"../../Materials/Textures/thinTexture\";\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 { type ThinEngine } from \"../../Engines\";\r\n\r\nconst DefaultXRWebGLLayerInit: XRWebGLLayerInit = {};\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 * 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[] = [];\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 _isMultiviewEnabled = false;\r\n private _projectionLayerInitialized = false;\r\n\r\n private _compositionLayerTextureMapping: WeakMap<XRCompositionLayer, ThinTexture> = new WeakMap();\r\n private _layerToRTTProviderMapping: WeakMap<XRCompositionLayer, WebXRCompositionLayerRenderTargetTextureProvider> = new WeakMap();\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 as WebXRWebGPUGraphicsBinding).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 this._glContext = (engine as ThinEngine)._gl;\r\n this._xrWebGLBinding = new XRWebGLBinding(this._xrSessionManager.session, this._glContext);\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\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 layer.dispose();\r\n }\r\n this._existingLayers.length = 0;\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 | XRQuadLayerInit, multiview = this._isMultiviewEnabled): 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\") {\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(params: XRProjectionLayerInit | XRQuadLayerInit, multiview = this._isMultiviewEnabled): XRProjectionLayerInit | XRQuadLayerInit {\r\n if (multiview) {\r\n params.textureType = \"texture-array\";\r\n }\r\n return params;\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 this._extendXRLayerInit(params, multiview);\r\n this._validateLayerInit(params, multiview);\r\n\r\n const projLayer = this._xrWebGLBinding.createProjectionLayer(params);\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 * Note about making it private - this function will be exposed once I decide on a proper API to support all of the XR layers' options\r\n * @param options an object providing configuration options for the new XRQuadLayer.\r\n * @param babylonTexture the texture to display in the layer\r\n * @returns the quad layer\r\n */\r\n private _createQuadLayer(options: { params: Partial<XRQuadLayerInit> } = { params: {} }, babylonTexture?: ThinTexture): WebXRCompositionLayerWrapper {\r\n this._extendXRLayerInit(options.params, false);\r\n const width = (this._existingLayers[0].layer as XRProjectionLayer).textureWidth;\r\n const height = (this._existingLayers[0].layer as XRProjectionLayer).textureHeight;\r\n const populatedParams: XRQuadLayerInit = {\r\n space: this._xrSessionManager.referenceSpace,\r\n viewPixelWidth: width,\r\n viewPixelHeight: height,\r\n clearOnAccess: true,\r\n ...options.params,\r\n };\r\n this._validateLayerInit(populatedParams, false);\r\n const quadLayer = this._xrWebGLBinding.createQuadLayer(populatedParams);\r\n\r\n quadLayer.width = this._isMultiviewEnabled ? 1 : 2;\r\n quadLayer.height = 1;\r\n // this wrapper is not really needed, but it's here for consistency\r\n const wrapper: WebXRCompositionLayerWrapper = new WebXRCompositionLayerWrapper(\r\n () => quadLayer.width,\r\n () => quadLayer.height,\r\n quadLayer,\r\n \"XRQuadLayer\",\r\n false,\r\n (sessionManager) => new WebXRCompositionLayerRenderTargetTextureProvider(sessionManager, this._xrWebGLBinding, wrapper)\r\n );\r\n\r\n if (babylonTexture) {\r\n this._compositionLayerTextureMapping.set(quadLayer, babylonTexture);\r\n }\r\n const rtt = wrapper.createRenderTargetTextureProvider(this._xrSessionManager) as WebXRCompositionLayerRenderTargetTextureProvider;\r\n this._layerToRTTProviderMapping.set(quadLayer, rtt);\r\n this.addXRSessionLayer(wrapper);\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\r\n */\r\n public addFullscreenAdvancedDynamicTexture(texture: DynamicTexture, options: { distanceFromHeadset: number } = { distanceFromHeadset: 1.5 }): 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\r\n const layer = wrapper.layer as XRQuadLayer;\r\n const distance = Math.max(0.1, options.distanceFromHeadset);\r\n const pos = { x: 0, y: 0, z: -distance };\r\n const orient = { x: 0, y: 0, z: 0, w: 1 };\r\n layer.transform = new XRRigidTransform(pos, orient);\r\n\r\n const rttProvider = this._layerToRTTProviderMapping.get(layer);\r\n if (!rttProvider) {\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 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 babylonLayer.renderOnlyInRenderTargetTextures = true;\r\n // for stereo (not for gui) it should be onBeforeCameraRenderObservable\r\n this._xrSessionManager.scene.onBeforeRenderObservable.add(() => {\r\n data.texture.render();\r\n });\r\n babylonLayer.renderTargetTextures.push(data.texture);\r\n babylonLayer.renderOnlyInRenderTargetTextures = true;\r\n // add it back when the session ends\r\n this._xrSessionManager.onXRSessionEnded.addOnce(() => {\r\n babylonLayer.renderTargetTextures.splice(babylonLayer.renderTargetTextures.indexOf(data.texture), 1);\r\n babylonLayer.renderOnlyInRenderTargetTextures = false;\r\n });\r\n });\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\r\n */\r\n protected _addLensFlareSystem(flareSystem: LensFlareSystem): 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\r\n const layer = wrapper.layer as XRQuadLayer;\r\n layer.width = 2;\r\n layer.height = 1;\r\n const distance = 10;\r\n const pos = { x: 0, y: 0, z: -distance };\r\n const orient = { x: 0, y: 0, z: 0, w: 1 };\r\n layer.transform = new XRRigidTransform(pos, orient);\r\n\r\n // get the rtt wrapper\r\n const rttProvider = this._layerToRTTProviderMapping.get(layer);\r\n if (!rttProvider) {\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) {\r\n this._existingLayers.push(wrappedLayer);\r\n this.setXRSessionLayers(this._existingLayers);\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> = 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)! : null);\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 // Replace once the mapped internal texture of each available composition layer, apart from the last one, which is the projection layer that needs an RTT\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.layerType !== \"XRProjectionLayer\") {\r\n // get the rtt provider\r\n const rttProvider = this._layerToRTTProviderMapping.get(layer.layer as XRCompositionLayer);\r\n if (!rttProvider) {\r\n continue;\r\n }\r\n\r\n if (rttProvider.layerWrapper.isMultiview) {\r\n // get the views, if we are in multiview\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 const view = views[j];\r\n rttProvider.getRenderTargetTextureForView(view);\r\n }\r\n }\r\n } else {\r\n rttProvider.getRenderTargetTextureForView();\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":"AAAA,6DAA6D;AAE7D,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAEjF,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,2BAA2B,EAAE,4BAA4B,EAAE,MAAM,+BAA+B,CAAC;AAC1G,OAAO,EAAE,gDAAgD,EAAE,4BAA4B,EAAE,MAAM,gCAAgC,CAAC;AAChI,OAAO,EAAE,iCAAiC,EAAE,qCAAqC,EAAE,MAAM,qCAAqC,CAAC;AAC/H,OAAO,EAAE,sDAAsD,EAAE,kCAAkC,EAAE,MAAM,sCAAsC,CAAC;AAIlJ,OAAO,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AAErD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAG3C,MAAM,uBAAuB,GAAqB,EAAE,CAAC;AACrD,MAAM,4BAA4B,GAC9B,4KAA4K,CAAC;AACjL,MAAM,8BAA8B,GAChC,wKAAwK,CAAC;AAkB7K;;GAEG;AACH,MAAM,OAAO,WAAY,SAAQ,oBAAoB;IA2BjD,YACI,iBAAsC,EACrB,WAAgC,EAAE;QAEnD,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAFR,aAAQ,GAAR,QAAQ,CAA0B;QAlBvD;;WAEG;QACK,oBAAe,GAAwB,EAAE,CAAC;QAI1C,cAAS,GAAG,KAAK,CAAC;QAElB,wBAAmB,GAAG,KAAK,CAAC;QAC5B,gCAA2B,GAAG,KAAK,CAAC;QAEpC,oCAA+B,GAA6C,IAAI,OAAO,EAAE,CAAC;QAC1F,+BAA0B,GAC9B,IAAI,OAAO,EAAE,CAAC;QAOd,IAAI,CAAC,mBAAmB,GAAG,QAAQ,CAAC;IACxC,CAAC;IAED;;;;;OAKG;IACa,MAAM;QAClB,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YAClB,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QACxD,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC;QAChC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC;QAEjC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,mBAAmB,EAAE,CAAC;YAC7D,IAAI,OAAO,CAAC,WAAW,4CAAoC,EAAE,CAAC;gBAC1D,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;YAC/E,CAAC;YACD,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;YACrC,4FAA4F;YAC5F,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC;YACjC,IAAI,CAAC,4BAA4B,EAAE,CAAC;QACxC,CAAC;aAAM,CAAC;YACJ,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC,mBAAmB,EAAE,CAAC;YAC7D,IAAI,OAAO,CAAC,WAAW,2CAAmC,EAAE,CAAC;gBACzD,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;YAC7E,CAAC;YACD,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC;YAClC,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC;YAEvC,MAAM,mBAAmB,GAAG,EAAE,GAAG,4BAA4B,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,mBAAmB,EAAE,CAAC;YACtG,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,QAAQ,CAAC,qBAAqB,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC;YAC7F,IAAI,CAAC,qBAAqB,CAAC,mBAAmB,CAAC,8BAA8B,CAAC,CAAC;QACnF,CAAC;QACD,IAAI,CAAC,2BAA2B,GAAG,IAAI,CAAC;QAExC,OAAO,IAAI,CAAC;IAChB,CAAC;IAEe,MAAM;QAClB,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YAClB,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACvC,KAAK,CAAC,OAAO,EAAE,CAAC;QACpB,CAAC;QACD,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC;QAChC,IAAI,CAAC,2BAA2B,GAAG,KAAK,CAAC;QACzC,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;;;OAIG;IACI,kBAAkB,CAAC,MAAM,GAAG,uBAAuB;QACtD,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACxF,OAAO,IAAI,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC;IAEO,kBAAkB,CAAC,MAA+C,EAAE,SAAS,GAAG,IAAI,CAAC,mBAAmB;QAC5G,6BAA6B;QAC7B,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,6GAA6G,CAAC,CAAC;QACnI,CAAC;QACD,IAAI,SAAS,IAAI,MAAM,CAAC,WAAW,KAAK,eAAe,EAAE,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,4HAA4H,CAAC,CAAC;QAClJ,CAAC;QAED,iFAAiF;QACjF,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,WAAW,KAAK,eAAe,EAAE,CAAC;YACvD,MAAM,IAAI,KAAK,CAAC,yGAAyG,CAAC,CAAC;QAC/H,CAAC;IACL,CAAC;IAEO,kBAAkB,CAAC,MAA+C,EAAE,SAAS,GAAG,IAAI,CAAC,mBAAmB;QAC5G,IAAI,SAAS,EAAE,CAAC;YACZ,MAAM,CAAC,WAAW,GAAG,eAAe,CAAC;QACzC,CAAC;QACD,OAAO,MAAM,CAAC;IAClB,CAAC;IAED;;;;;OAKG;IACI,qBAAqB,CAAC,MAAM,GAAG,4BAA4B,EAAE,SAAS,GAAG,IAAI,CAAC,mBAAmB;QACpG,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAC3C,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAE3C,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC;QACrE,MAAM,KAAK,GAAG,IAAI,2BAA2B,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QAC1F,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC9B,OAAO,KAAK,CAAC;IACjB,CAAC;IAED;;;;OAIG;IACK,4BAA4B;QAChC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,6GAA6G,CAAC,CAAC;QACnI,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,aAAc,CAAC;QACpC,MAAM,IAAI,GAAG,qCAAqC,CAAC,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAAC;QACtF,MAAM,SAAS,GAAG,OAAO,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;QACtD,MAAM,KAAK,GAAG,IAAI,iCAAiC,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACxG,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAC9B,OAAO,KAAK,CAAC;IACjB,CAAC;IAED;;;;;OAKG;IACK,gBAAgB,CAAC,UAAgD,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,cAA4B;QACjH,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAI,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,KAA2B,CAAC,YAAY,CAAC;QAChF,MAAM,MAAM,GAAI,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,KAA2B,CAAC,aAAa,CAAC;QAClF,MAAM,eAAe,GAAoB;YACrC,KAAK,EAAE,IAAI,CAAC,iBAAiB,CAAC,cAAc;YAC5C,cAAc,EAAE,KAAK;YACrB,eAAe,EAAE,MAAM;YACvB,aAAa,EAAE,IAAI;YACnB,GAAG,OAAO,CAAC,MAAM;SACpB,CAAC;QACF,IAAI,CAAC,kBAAkB,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;QAChD,IAAI,SAAsB,CAAC;QAC3B,IAAI,OAAqC,CAAC;QAE1C,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,MAAM,OAAO,GAAG,IAAI,CAAC,aAAc,CAAC;YACpC,IAAI,OAAO,OAAO,CAAC,eAAe,KAAK,UAAU,EAAE,CAAC;gBAChD,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;gBAC1C,OAAO,IAAI,CAAC;YAChB,CAAC;YACD,IAAI,OAAO,OAAO,CAAC,WAAW,KAAK,UAAU,EAAE,CAAC;gBAC5C,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;gBAC5C,OAAO,IAAI,CAAC;YAChB,CAAC;YAED,MAAM,SAAS,GAAuB;gBAClC,WAAW,EAAE,OAAO,CAAC,uBAAuB,EAAE;gBAC9C,mFAAmF;gBACnF,qFAAqF;gBACrF,YAAY,EAAE,IAAI;gBAClB,KAAK,EAAE,eAAe,CAAC,KAAK;gBAC5B,cAAc,EAAE,eAAe,CAAC,cAAc;gBAC9C,eAAe,EAAE,eAAe,CAAC,eAAe;aACnD,CAAC;YACF,IAAI,eAAe,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBACvC,SAAS,CAAC,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC;YAC9C,CAAC;YACD,IAAI,eAAe,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;gBAC1C,SAAS,CAAC,SAAS,GAAG,eAAe,CAAC,SAAS,CAAC;YACpD,CAAC;YACD,IAAI,eAAe,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;gBACzC,SAAS,CAAC,QAAQ,GAAG,eAAe,CAAC,QAAQ,CAAC;YAClD,CAAC;YACD,IAAI,eAAe,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;gBAC1C,SAAS,CAAC,SAAS,GAAG,eAAe,CAAC,SAAS,CAAC;YACpD,CAAC;YACD,IAAI,eAAe,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBACtC,SAAS,CAAC,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC;YAC5C,CAAC;YACD,IAAI,eAAe,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBACvC,SAAS,CAAC,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC;YAC9C,CAAC;YACD,SAAS,GAAG,OAAO,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;YAC/C,OAAO,GAAG,IAAI,kCAAkC,CAC5C,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,EACrB,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,EACtB,SAAS,EACT,aAAa,EACb,KAAK,EACL,CAAC,cAAc,EAAE,EAAE,CAAC,IAAI,sDAAsD,CAAC,cAAc,EAAE,OAAO,EAAE,OAAO,CAAC,CACnH,CAAC;QACN,CAAC;aAAM,CAAC;YACJ,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC;YAClE,OAAO,GAAG,IAAI,4BAA4B,CACtC,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,EACrB,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,EACtB,SAAS,EACT,aAAa,EACb,KAAK,EACL,CAAC,cAAc,EAAE,EAAE,CAAC,IAAI,gDAAgD,CAAC,cAAc,EAAE,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,CAC1H,CAAC;QACN,CAAC;QAED,SAAS,CAAC,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnD,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;QAErB,IAAI,cAAc,EAAE,CAAC;YACjB,IAAI,CAAC,+BAA+B,CAAC,GAAG,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;QACxE,CAAC;QACD,MAAM,GAAG,GAAG,OAAO,CAAC,iCAAiC,CAAC,IAAI,CAAC,iBAAiB,CACiC,CAAC;QAC9G,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QACpD,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAChC,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;;;;;OAOG;IACI,mCAAmC,CACtC,OAAuB,EACvB,UAA2C,EAAE,mBAAmB,EAAE,GAAG,EAAE;QAEvE,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CACjC;YACI,MAAM,EAAE;gBACJ,KAAK,EAAE,IAAI,CAAC,iBAAiB,CAAC,oBAAoB;gBAClD,WAAW,EAAE,SAAS;gBACtB,MAAM,EAAE,MAAM;aACjB;SACJ,EACD,OAAO,CACV,CAAC;QACF,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAoB,CAAC;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;QAC5D,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QAC1C,KAAK,CAAC,SAAS,GAAG,IAAI,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAEpD,MAAM,WAAW,GAAG,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC/D,IAAI,CAAC,WAAW,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACrE,CAAC;QACD,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,EAAE;YAC3E,OAAO,YAAY,CAAC,OAAO,KAAK,OAAO,CAAC;QAC5C,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,YAAY,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACxE,CAAC;QACD,WAAW,CAAC,sCAAsC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YAC5D,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC;gBACnC,OAAO;YACX,CAAC;YACD,IAAI,CAAC,OAAO,CAAC,UAAU,GAAG,IAAI,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACjD,YAAY,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACrD,YAAY,CAAC,gCAAgC,GAAG,IAAI,CAAC;YACrD,uEAAuE;YACvE,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,wBAAwB,CAAC,GAAG,CAAC,GAAG,EAAE;gBAC3D,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAC1B,CAAC,CAAC,CAAC;YACH,YAAY,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACrD,YAAY,CAAC,gCAAgC,GAAG,IAAI,CAAC;YACrD,oCAAoC;YACpC,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,OAAO,CAAC,GAAG,EAAE;gBACjD,YAAY,CAAC,oBAAoB,CAAC,MAAM,CAAC,YAAY,CAAC,oBAAoB,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;gBACrG,YAAY,CAAC,gCAAgC,GAAG,KAAK,CAAC;YAC1D,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;QACH,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;;;;;OAOG;IACO,mBAAmB,CAAC,WAA4B;QACtD,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC;YAClC,MAAM,EAAE;gBACJ,KAAK,EAAE,IAAI,CAAC,iBAAiB,CAAC,oBAAoB;gBAClD,WAAW,EAAE,SAAS;gBACtB,MAAM,EAAE,MAAM;aACjB;SACJ,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAoB,CAAC;QAC3C,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;QAChB,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QACjB,MAAM,QAAQ,GAAG,EAAE,CAAC;QACpB,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;QAC1C,KAAK,CAAC,SAAS,GAAG,IAAI,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAEpD,sBAAsB;QACtB,MAAM,WAAW,GAAG,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC/D,IAAI,CAAC,WAAW,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACrE,CAAC;QACD,qCAAqC;QACrC,WAAW,CAAC,sCAAsC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YAC5D,IAAI,CAAC,OAAO,CAAC,UAAU,GAAG,IAAI,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACjD,IAAI,CAAC,OAAO,CAAC,oBAAoB,GAAG,GAAG,EAAE;gBACrC,WAAW,CAAC,MAAM,EAAE,CAAC;YACzB,CAAC,CAAC;YAEF,oCAAoC;YACpC,0EAA0E;YAC1E,6BAA6B;YAC7B,MAAM;QACV,CAAC,CAAC,CAAC;QACH,8CAA8C;QAC9C,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,EAAE;YAC5C,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;QAChI,CAAC,CAAC,CAAC;QACH,oCAAoC;QACpC,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,GAAG,CAAC,GAAG,EAAE;YAC7C,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC;IACnB,CAAC;IAED;;;OAGG;IACI,iBAAiB,CAAC,YAA+B;QACpD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACxC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAClD,CAAC;IAED;;;;;;;;OAQG;IACI,kBAAkB,CAAC,gBAA0C,IAAI,CAAC,eAAe;QACpF,wCAAwC;QACxC,MAAM,eAAe,GAAsB,EAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QAC7F,sCAAsC;QACtC,eAAe,CAAC,SAAS,GAAG,SAAS,CAAC;QACtC,eAAe,CAAC,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QACjF,IAAI,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAC;QAC1D,IAAI,CAAC,IAAI,CAAC,2BAA2B,EAAE,CAAC;YACpC,IAAI,CAAC,iBAAiB,CAAC,oBAAoB,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACxG,CAAC;IACL,CAAC;IAEe,YAAY;QACxB,IAAI,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,QAAQ,EAAE,CAAC;YACpD,OAAO,OAAO,YAAY,KAAK,WAAW,IAAI,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,qBAAqB,CAAC;QACjG,CAAC;QACD,8EAA8E;QAC9E,IAAI,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,CAAC;YAClC,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,OAAO,OAAO,cAAc,KAAK,WAAW,IAAI,CAAC,CAAC,cAAc,CAAC,SAAS,CAAC,qBAAqB,CAAC;IACrG,CAAC;IAED;;OAEG;IACa,OAAO;QACnB,KAAK,CAAC,OAAO,EAAE,CAAC;IACpB,CAAC;IAES,UAAU,CAAC,QAAiB;QAClC,yJAAyJ;QACzJ,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC;QACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;YACrC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACxB,IAAI,KAAK,CAAC,SAAS,KAAK,mBAAmB,EAAE,CAAC;gBAC1C,uBAAuB;gBACvB,MAAM,WAAW,GAAG,IAAI,CAAC,0BAA0B,CAAC,GAAG,CAAC,KAAK,CAAC,KAA2B,CAAC,CAAC;gBAC3F,IAAI,CAAC,WAAW,EAAE,CAAC;oBACf,SAAS;gBACb,CAAC;gBAED,IAAI,WAAW,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC;oBACvC,wCAAwC;oBACxC,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;oBAC3E,IAAI,IAAI,EAAE,CAAC;wBACP,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;wBACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;4BACpC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;4BACtB,WAAW,CAAC,6BAA6B,CAAC,IAAI,CAAC,CAAC;wBACpD,CAAC;oBACL,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACJ,WAAW,CAAC,6BAA6B,EAAE,CAAC;gBAChD,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;;AAzbD;;GAEG;AACoB,gBAAI,GAAG,gBAAgB,CAAC,MAAM,AAA1B,CAA2B;AACtD;;;;GAIG;AACoB,mBAAO,GAAG,CAAC,AAAJ,CAAK;AAmbvC,IAAI,WAAW,GAAG,KAAK,CAAC;AACxB;;;GAGG;AACH,MAAM,UAAU,mBAAmB;IAC/B,IAAI,WAAW,EAAE,CAAC;QACd,OAAO;IACX,CAAC;IACD,WAAW,GAAG,IAAI,CAAC;IAEnB,qBAAqB;IACrB,oBAAoB,CAAC,eAAe,CAChC,WAAW,CAAC,IAAI,EAChB,CAAC,gBAAgB,EAAE,OAAO,EAAE,EAAE;QAC1B,OAAO,GAAG,EAAE,CAAC,IAAI,WAAW,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;IAC5D,CAAC,EACD,WAAW,CAAC,OAAO,EACnB,KAAK,CACR,CAAC;AACN,CAAC","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 } from \"../webXRLayerWrapper\";\r\nimport { WebXRWebGLLayerWrapper } from \"../webXRWebGLLayer\";\r\nimport { WebXRProjectionLayerWrapper, DefaultXRProjectionLayerInit } from \"./Layers/WebXRProjectionLayer\";\r\nimport { WebXRCompositionLayerRenderTargetTextureProvider, WebXRCompositionLayerWrapper } from \"./Layers/WebXRCompositionLayer\";\r\nimport { WebXRWebGPUProjectionLayerWrapper, CreateDefaultXRGPUProjectionLayerInit } from \"./Layers/WebXRWebGPUProjectionLayer\";\r\nimport { WebXRWebGPUCompositionLayerRenderTargetTextureProvider, WebXRWebGPUCompositionLayerWrapper } from \"./Layers/WebXRWebGPUCompositionLayer\";\r\nimport { WebXRGraphicsBindingType } from \"../webXRGraphicsBinding\";\r\nimport { type ThinTexture } from \"../../Materials/Textures/thinTexture\";\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\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\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 * 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[] = [];\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 _isMultiviewEnabled = false;\r\n private _projectionLayerInitialized = false;\r\n\r\n private _compositionLayerTextureMapping: WeakMap<XRCompositionLayer, ThinTexture> = new WeakMap();\r\n private _layerToRTTProviderMapping: WeakMap<XRCompositionLayer, WebXRCompositionLayerRenderTargetTextureProvider | WebXRWebGPUCompositionLayerRenderTargetTextureProvider> =\r\n new WeakMap();\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\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 layer.dispose();\r\n }\r\n this._existingLayers.length = 0;\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 | XRQuadLayerInit, multiview = this._isMultiviewEnabled): 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\") {\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(params: XRProjectionLayerInit | XRQuadLayerInit, multiview = this._isMultiviewEnabled): XRProjectionLayerInit | XRQuadLayerInit {\r\n if (multiview) {\r\n params.textureType = \"texture-array\";\r\n }\r\n return params;\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 this._extendXRLayerInit(params, multiview);\r\n this._validateLayerInit(params, multiview);\r\n\r\n const projLayer = this._xrWebGLBinding.createProjectionLayer(params);\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 * Note about making it private - this function will be exposed once I decide on a proper API to support all of the XR layers' options\r\n * @param options an object providing configuration options for the new XRQuadLayer.\r\n * @param babylonTexture the texture to display in the layer\r\n * @returns the quad layer, or null when the WebGPU binding lacks quad-layer support\r\n */\r\n private _createQuadLayer(options: { params: Partial<XRQuadLayerInit> } = { params: {} }, babylonTexture?: ThinTexture): Nullable<WebXRCompositionLayerWrapper> {\r\n this._extendXRLayerInit(options.params, false);\r\n const width = (this._existingLayers[0].layer as XRProjectionLayer).textureWidth;\r\n const height = (this._existingLayers[0].layer as XRProjectionLayer).textureHeight;\r\n const populatedParams: XRQuadLayerInit = {\r\n space: this._xrSessionManager.referenceSpace,\r\n viewPixelWidth: width,\r\n viewPixelHeight: height,\r\n clearOnAccess: true,\r\n ...options.params,\r\n };\r\n this._validateLayerInit(populatedParams, false);\r\n let quadLayer: XRQuadLayer;\r\n let wrapper: WebXRCompositionLayerWrapper;\r\n\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 const gpuParams: XRGPUQuadLayerInit = {\r\n colorFormat: binding.getPreferredColorFormat(),\r\n // GPUTextureUsage.RENDER_ATTACHMENT (0x10) is requested explicitly. The usage of a\r\n // compositor-owned sub-image texture is not a valid source for layer creation flags.\r\n textureUsage: 0x10,\r\n space: populatedParams.space,\r\n viewPixelWidth: populatedParams.viewPixelWidth,\r\n viewPixelHeight: populatedParams.viewPixelHeight,\r\n };\r\n if (populatedParams.layout !== undefined) {\r\n gpuParams.layout = populatedParams.layout;\r\n }\r\n if (populatedParams.mipLevels !== undefined) {\r\n gpuParams.mipLevels = populatedParams.mipLevels;\r\n }\r\n if (populatedParams.isStatic !== undefined) {\r\n gpuParams.isStatic = populatedParams.isStatic;\r\n }\r\n if (populatedParams.transform !== undefined) {\r\n gpuParams.transform = populatedParams.transform;\r\n }\r\n if (populatedParams.width !== undefined) {\r\n gpuParams.width = populatedParams.width;\r\n }\r\n if (populatedParams.height !== undefined) {\r\n gpuParams.height = populatedParams.height;\r\n }\r\n quadLayer = binding.createQuadLayer(gpuParams);\r\n wrapper = new WebXRWebGPUCompositionLayerWrapper(\r\n () => quadLayer.width,\r\n () => quadLayer.height,\r\n quadLayer,\r\n \"XRQuadLayer\",\r\n false,\r\n (sessionManager) => new WebXRWebGPUCompositionLayerRenderTargetTextureProvider(sessionManager, binding, wrapper)\r\n );\r\n } else {\r\n quadLayer = this._xrWebGLBinding.createQuadLayer(populatedParams);\r\n wrapper = new WebXRCompositionLayerWrapper(\r\n () => quadLayer.width,\r\n () => quadLayer.height,\r\n quadLayer,\r\n \"XRQuadLayer\",\r\n false,\r\n (sessionManager) => new WebXRCompositionLayerRenderTargetTextureProvider(sessionManager, this._xrWebGLBinding, wrapper)\r\n );\r\n }\r\n\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 const rtt = wrapper.createRenderTargetTextureProvider(this._xrSessionManager) as\r\n WebXRCompositionLayerRenderTargetTextureProvider | WebXRWebGPUCompositionLayerRenderTargetTextureProvider;\r\n this._layerToRTTProviderMapping.set(quadLayer, rtt);\r\n this.addXRSessionLayer(wrapper);\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 layer = wrapper.layer as XRQuadLayer;\r\n const distance = Math.max(0.1, options.distanceFromHeadset);\r\n const pos = { x: 0, y: 0, z: -distance };\r\n const orient = { x: 0, y: 0, z: 0, w: 1 };\r\n layer.transform = new XRRigidTransform(pos, orient);\r\n\r\n const rttProvider = this._layerToRTTProviderMapping.get(layer);\r\n if (!rttProvider) {\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 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 babylonLayer.renderOnlyInRenderTargetTextures = true;\r\n // for stereo (not for gui) it should be onBeforeCameraRenderObservable\r\n this._xrSessionManager.scene.onBeforeRenderObservable.add(() => {\r\n data.texture.render();\r\n });\r\n babylonLayer.renderTargetTextures.push(data.texture);\r\n babylonLayer.renderOnlyInRenderTargetTextures = true;\r\n // add it back when the session ends\r\n this._xrSessionManager.onXRSessionEnded.addOnce(() => {\r\n babylonLayer.renderTargetTextures.splice(babylonLayer.renderTargetTextures.indexOf(data.texture), 1);\r\n babylonLayer.renderOnlyInRenderTargetTextures = false;\r\n });\r\n });\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 as XRQuadLayer;\r\n layer.width = 2;\r\n layer.height = 1;\r\n const distance = 10;\r\n const pos = { x: 0, y: 0, z: -distance };\r\n const orient = { x: 0, y: 0, z: 0, w: 1 };\r\n layer.transform = new XRRigidTransform(pos, orient);\r\n\r\n // get the rtt wrapper\r\n const rttProvider = this._layerToRTTProviderMapping.get(layer);\r\n if (!rttProvider) {\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) {\r\n this._existingLayers.push(wrappedLayer);\r\n this.setXRSessionLayers(this._existingLayers);\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> = 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)! : null);\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 // Replace once the mapped internal texture of each available composition layer, apart from the last one, which is the projection layer that needs an RTT\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.layerType !== \"XRProjectionLayer\") {\r\n // get the rtt provider\r\n const rttProvider = this._layerToRTTProviderMapping.get(layer.layer as XRCompositionLayer);\r\n if (!rttProvider) {\r\n continue;\r\n }\r\n\r\n if (rttProvider.layerWrapper.isMultiview) {\r\n // get the views, if we are in multiview\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 const view = views[j];\r\n rttProvider.getRenderTargetTextureForView(view);\r\n }\r\n }\r\n } else {\r\n rttProvider.getRenderTargetTextureForView();\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"]}
@@ -43,11 +43,18 @@ export class WebXRRawCameraAccess extends WebXRAbstractFeature {
43
43
  this.xrNativeFeatureName = "camera-access";
44
44
  }
45
45
  attach(force) {
46
+ if (this._xrSessionManager.scene.getEngine().isWebGPU) {
47
+ return this._disableAutoAttach("WebXR Raw Camera Access is unavailable with WebGPU XR because camera images are exposed only by XRWebGLBinding; the feature was disabled.");
48
+ }
46
49
  if (!super.attach(force)) {
47
50
  return false;
48
51
  }
49
- this._glContext = this._xrSessionManager.scene.getEngine()._gl;
50
- this._glBinding = new XRWebGLBinding(this._xrSessionManager.session, this._glContext);
52
+ const graphicsBinding = this._xrSessionManager._getGraphicsBinding();
53
+ if (graphicsBinding.bindingType !== 0 /* WebXRGraphicsBindingType.WebGL */) {
54
+ throw new Error("Expected a WebGL graphics binding for WebXR Raw Camera Access.");
55
+ }
56
+ this._glContext = graphicsBinding.context;
57
+ this._glBinding = graphicsBinding.binding;
51
58
  return true;
52
59
  }
53
60
  detach() {
@@ -1 +1 @@
1
- {"version":3,"file":"WebXRRawCameraAccess.pure.js","sourceRoot":"","sources":["../../../../../dev/core/src/XR/features/WebXRRawCameraAccess.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 { Observable } from \"../../Misc/observable.pure\";\r\nimport { Constants } from \"../../Engines/constants\";\r\nimport { WebGLHardwareTexture } from \"../../Engines/WebGL/webGLHardwareTexture\";\r\nimport { InternalTexture, InternalTextureSource } from \"../../Materials/Textures/internalTexture\";\r\nimport { BaseTexture } from \"../../Materials/Textures/baseTexture.pure\";\r\nimport { type ThinEngine } from \"../../Engines\";\r\n\r\n/**\r\n * Options for raw camera access\r\n */\r\nexport interface IWebXRRawCameraAccessOptions {\r\n /**\r\n * Keep the created textures and metadata when detaching the feature.\r\n */\r\n doNotDisposeOnDetach?: boolean;\r\n}\r\n\r\n/**\r\n * WebXR Feature for WebXR raw camera access\r\n * @since 6.31.0\r\n * @see https://immersive-web.github.io/raw-camera-access/\r\n */\r\nexport class WebXRRawCameraAccess extends WebXRAbstractFeature {\r\n private _cachedInternalTextures: InternalTexture[] = [];\r\n /**\r\n * This is an array of camera views\r\n * Note that mostly the array will contain a single view\r\n * If you want to know the order of the views, use the `viewIndex` array\r\n */\r\n public texturesData: BaseTexture[] = [];\r\n /**\r\n * If needed, this array will contain the eye definition of each texture in `texturesArray`\r\n */\r\n public viewIndex: string[] = [];\r\n\r\n /**\r\n * If needed, this array will contain the camera's intrinsics\r\n * You can use this data to convert from camera space to screen space and vice versa\r\n */\r\n public cameraIntrinsics: {\r\n u0: number;\r\n v0: number;\r\n ax: number;\r\n ay: number;\r\n gamma: number;\r\n width: number;\r\n height: number;\r\n viewportX: number;\r\n viewportY: number;\r\n }[] = [];\r\n\r\n /**\r\n * An observable that will notify when the camera's textures are updated\r\n */\r\n public onTexturesUpdatedObservable: Observable<BaseTexture[]> = new Observable();\r\n\r\n private _glBinding?: XRWebGLBinding;\r\n private _glContext: WebGLRenderingContext;\r\n\r\n /**\r\n * The module's name\r\n */\r\n public static readonly Name = WebXRFeatureName.RAW_CAMERA_ACCESS;\r\n\r\n /**\r\n * The (Babylon) version of this module.\r\n * This is an integer representing the implementation version.\r\n * This number does not correspond to the WebXR specs version\r\n */\r\n public static readonly Version = 1;\r\n\r\n /**\r\n * Creates a new instance of the feature\r\n * @param _xrSessionManager the WebXRSessionManager\r\n * @param options options for the Feature\r\n */\r\n constructor(\r\n _xrSessionManager: WebXRSessionManager,\r\n public readonly options: IWebXRRawCameraAccessOptions = {}\r\n ) {\r\n super(_xrSessionManager);\r\n this.xrNativeFeatureName = \"camera-access\";\r\n }\r\n\r\n public override attach(force?: boolean): boolean {\r\n if (!super.attach(force)) {\r\n return false;\r\n }\r\n\r\n this._glContext = (this._xrSessionManager.scene.getEngine() as ThinEngine)._gl;\r\n this._glBinding = new XRWebGLBinding(this._xrSessionManager.session, this._glContext);\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 this._glBinding = undefined;\r\n if (!this.options.doNotDisposeOnDetach) {\r\n for (const t of this._cachedInternalTextures) {\r\n t.dispose();\r\n }\r\n for (const t of this.texturesData) {\r\n t.dispose();\r\n }\r\n this._cachedInternalTextures.length = 0;\r\n this.texturesData.length = 0;\r\n this.cameraIntrinsics.length = 0;\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Dispose this feature and all of the resources attached\r\n */\r\n public override dispose(): void {\r\n super.dispose();\r\n this.onTexturesUpdatedObservable.clear();\r\n }\r\n\r\n /**\r\n * @see https://github.com/immersive-web/raw-camera-access/blob/main/explainer.md\r\n * @param view the XRView to update\r\n * @param index the index of the view in the views array\r\n */\r\n private _updateCameraIntrinsics(view: XRView, index: number): void {\r\n const cameraViewport = {\r\n width: view.camera!.width,\r\n height: view.camera!.height,\r\n x: 0,\r\n y: 0,\r\n };\r\n const p = view.projectionMatrix;\r\n\r\n // Principal point in pixels (typically at or near the center of the viewport)\r\n const u0 = ((1 - p[8]) * cameraViewport.width) / 2 + cameraViewport.x;\r\n const v0 = ((1 - p[9]) * cameraViewport.height) / 2 + cameraViewport.y;\r\n\r\n // Focal lengths in pixels (these are equal for square pixels)\r\n const ax = (cameraViewport.width / 2) * p[0];\r\n const ay = (cameraViewport.height / 2) * p[5];\r\n\r\n // Skew factor in pixels (nonzero for rhomboid pixels)\r\n const gamma = (cameraViewport.width / 2) * p[4];\r\n this.cameraIntrinsics[index] = {\r\n u0,\r\n v0,\r\n ax,\r\n ay,\r\n gamma,\r\n width: cameraViewport.width,\r\n height: cameraViewport.height,\r\n viewportX: cameraViewport.x,\r\n viewportY: cameraViewport.y,\r\n };\r\n }\r\n\r\n private _updateInternalTextures(view: XRView, index = 0): boolean {\r\n if (!view.camera) {\r\n return false;\r\n }\r\n this.viewIndex[index] = view.eye;\r\n const lp = this._glBinding?.getCameraImage(view.camera);\r\n\r\n if (!this._cachedInternalTextures[index]) {\r\n const internalTexture = new InternalTexture(this._xrSessionManager.scene.getEngine(), InternalTextureSource.Unknown, true);\r\n internalTexture.invertY = false;\r\n internalTexture.format = Constants.TEXTUREFORMAT_RGBA;\r\n internalTexture.generateMipMaps = true;\r\n internalTexture.type = Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n internalTexture.samplingMode = Constants.TEXTURE_LINEAR_LINEAR_MIPLINEAR;\r\n internalTexture.width = view.camera.width;\r\n internalTexture.height = view.camera.height;\r\n internalTexture._cachedWrapU = Constants.TEXTURE_WRAP_ADDRESSMODE;\r\n internalTexture._cachedWrapV = Constants.TEXTURE_WRAP_ADDRESSMODE;\r\n internalTexture._hardwareTexture = new WebGLHardwareTexture(lp, this._glContext);\r\n this._cachedInternalTextures[index] = internalTexture;\r\n // create the base texture\r\n const texture = new BaseTexture(this._xrSessionManager.scene);\r\n texture.name = `WebXR Raw Camera Access (${index})`;\r\n texture._texture = this._cachedInternalTextures[index];\r\n this.texturesData[index] = texture;\r\n // get the camera intrinsics\r\n this._updateCameraIntrinsics(view, index);\r\n } else {\r\n // make sure the webgl texture is updated. Should happen automatically\r\n this._cachedInternalTextures[index]._hardwareTexture?.set(lp);\r\n }\r\n this._cachedInternalTextures[index].isReady = true;\r\n return true;\r\n }\r\n\r\n protected _onXRFrame(_xrFrame: XRFrame): void {\r\n const referenceSPace = this._xrSessionManager.referenceSpace;\r\n\r\n const pose = _xrFrame.getViewerPose(referenceSPace);\r\n if (!pose || !pose.views) {\r\n return;\r\n }\r\n let updated = true;\r\n for (let index = 0; index < pose.views.length; index++) {\r\n const view = pose.views[index];\r\n updated = updated && this._updateInternalTextures(view, index);\r\n }\r\n if (updated) {\r\n this.onTexturesUpdatedObservable.notifyObservers(this.texturesData);\r\n }\r\n }\r\n}\r\n\r\nlet _Registered = false;\r\n/**\r\n * Register side effects for webXRRawCameraAccess.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\nexport function RegisterWebXRRawCameraAccess(): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n WebXRFeaturesManager.AddWebXRFeature(\r\n WebXRRawCameraAccess.Name,\r\n (xrSessionManager, options) => {\r\n return () => new WebXRRawCameraAccess(xrSessionManager, options);\r\n },\r\n WebXRRawCameraAccess.Version,\r\n false\r\n );\r\n}\r\n"]}
1
+ {"version":3,"file":"WebXRRawCameraAccess.pure.js","sourceRoot":"","sources":["../../../../../dev/core/src/XR/features/WebXRRawCameraAccess.pure.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAE7D,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAEjF,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,0CAA0C,CAAC;AAChF,OAAO,EAAE,eAAe,EAAyB,MAAM,0CAA0C,CAAC;AAClG,OAAO,EAAE,WAAW,EAAE,MAAM,2CAA2C,CAAC;AAaxE;;;;GAIG;AACH,MAAM,OAAO,oBAAqB,SAAQ,oBAAoB;IAiD1D;;;;OAIG;IACH,YACI,iBAAsC,EACtB,UAAwC,EAAE;QAE1D,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAFT,YAAO,GAAP,OAAO,CAAmC;QAvDtD,4BAAuB,GAAsB,EAAE,CAAC;QACxD;;;;WAIG;QACI,iBAAY,GAAkB,EAAE,CAAC;QACxC;;WAEG;QACI,cAAS,GAAa,EAAE,CAAC;QAEhC;;;WAGG;QACI,qBAAgB,GAUjB,EAAE,CAAC;QAET;;WAEG;QACI,gCAA2B,GAA8B,IAAI,UAAU,EAAE,CAAC;QA2B7E,IAAI,CAAC,mBAAmB,GAAG,eAAe,CAAC;IAC/C,CAAC;IAEe,MAAM,CAAC,KAAe;QAClC,IAAI,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,QAAQ,EAAE,CAAC;YACpD,OAAO,IAAI,CAAC,kBAAkB,CAC1B,2IAA2I,CAC9I,CAAC;QACN,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,KAAK,CAAC;QACjB,CAAC;QAED,MAAM,eAAe,GAAG,IAAI,CAAC,iBAAiB,CAAC,mBAAmB,EAAE,CAAC;QACrE,IAAI,eAAe,CAAC,WAAW,2CAAmC,EAAE,CAAC;YACjE,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;QACtF,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,eAAe,CAAC,OAAO,CAAC;QAC1C,IAAI,CAAC,UAAU,GAAG,eAAe,CAAC,OAAO,CAAC;QAE1C,OAAO,IAAI,CAAC;IAChB,CAAC;IAEe,MAAM;QAClB,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YAClB,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE,CAAC;YACrC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;gBAC3C,CAAC,CAAC,OAAO,EAAE,CAAC;YAChB,CAAC;YACD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBAChC,CAAC,CAAC,OAAO,EAAE,CAAC;YAChB,CAAC;YACD,IAAI,CAAC,uBAAuB,CAAC,MAAM,GAAG,CAAC,CAAC;YACxC,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;YAC7B,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,CAAC;QACrC,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED;;OAEG;IACa,OAAO;QACnB,KAAK,CAAC,OAAO,EAAE,CAAC;QAChB,IAAI,CAAC,2BAA2B,CAAC,KAAK,EAAE,CAAC;IAC7C,CAAC;IAED;;;;OAIG;IACK,uBAAuB,CAAC,IAAY,EAAE,KAAa;QACvD,MAAM,cAAc,GAAG;YACnB,KAAK,EAAE,IAAI,CAAC,MAAO,CAAC,KAAK;YACzB,MAAM,EAAE,IAAI,CAAC,MAAO,CAAC,MAAM;YAC3B,CAAC,EAAE,CAAC;YACJ,CAAC,EAAE,CAAC;SACP,CAAC;QACF,MAAM,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC;QAEhC,8EAA8E;QAC9E,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC;QACtE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC;QAEvE,8DAA8D;QAC9D,MAAM,EAAE,GAAG,CAAC,cAAc,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,EAAE,GAAG,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAE9C,sDAAsD;QACtD,MAAM,KAAK,GAAG,CAAC,cAAc,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAChD,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,GAAG;YAC3B,EAAE;YACF,EAAE;YACF,EAAE;YACF,EAAE;YACF,KAAK;YACL,KAAK,EAAE,cAAc,CAAC,KAAK;YAC3B,MAAM,EAAE,cAAc,CAAC,MAAM;YAC7B,SAAS,EAAE,cAAc,CAAC,CAAC;YAC3B,SAAS,EAAE,cAAc,CAAC,CAAC;SAC9B,CAAC;IACN,CAAC;IAEO,uBAAuB,CAAC,IAAY,EAAE,KAAK,GAAG,CAAC;QACnD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACf,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC;QACjC,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAExD,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,EAAE,CAAC;YACvC,MAAM,eAAe,GAAG,IAAI,eAAe,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,SAAS,EAAE,yCAAiC,IAAI,CAAC,CAAC;YAC3H,eAAe,CAAC,OAAO,GAAG,KAAK,CAAC;YAChC,eAAe,CAAC,MAAM,GAAG,SAAS,CAAC,kBAAkB,CAAC;YACtD,eAAe,CAAC,eAAe,GAAG,IAAI,CAAC;YACvC,eAAe,CAAC,IAAI,GAAG,SAAS,CAAC,yBAAyB,CAAC;YAC3D,eAAe,CAAC,YAAY,GAAG,SAAS,CAAC,+BAA+B,CAAC;YACzE,eAAe,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;YAC1C,eAAe,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;YAC5C,eAAe,CAAC,YAAY,GAAG,SAAS,CAAC,wBAAwB,CAAC;YAClE,eAAe,CAAC,YAAY,GAAG,SAAS,CAAC,wBAAwB,CAAC;YAClE,eAAe,CAAC,gBAAgB,GAAG,IAAI,oBAAoB,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YACjF,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,GAAG,eAAe,CAAC;YACtD,0BAA0B;YAC1B,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAC9D,OAAO,CAAC,IAAI,GAAG,4BAA4B,KAAK,GAAG,CAAC;YACpD,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC;YACvD,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC;YACnC,4BAA4B;YAC5B,IAAI,CAAC,uBAAuB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC9C,CAAC;aAAM,CAAC;YACJ,sEAAsE;YACtE,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC,gBAAgB,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAClE,CAAC;QACD,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC;QACnD,OAAO,IAAI,CAAC;IAChB,CAAC;IAES,UAAU,CAAC,QAAiB;QAClC,MAAM,cAAc,GAAG,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC;QAE7D,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC;QACpD,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACvB,OAAO;QACX,CAAC;QACD,IAAI,OAAO,GAAG,IAAI,CAAC;QACnB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;YACrD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC/B,OAAO,GAAG,OAAO,IAAI,IAAI,CAAC,uBAAuB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACnE,CAAC;QACD,IAAI,OAAO,EAAE,CAAC;YACV,IAAI,CAAC,2BAA2B,CAAC,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACxE,CAAC;IACL,CAAC;;AAhKD;;GAEG;AACoB,yBAAI,GAAG,gBAAgB,CAAC,iBAAiB,AAArC,CAAsC;AAEjE;;;;GAIG;AACoB,4BAAO,GAAG,CAAC,AAAJ,CAAK;AAyJvC,IAAI,WAAW,GAAG,KAAK,CAAC;AACxB;;;GAGG;AACH,MAAM,UAAU,4BAA4B;IACxC,IAAI,WAAW,EAAE,CAAC;QACd,OAAO;IACX,CAAC;IACD,WAAW,GAAG,IAAI,CAAC;IAEnB,oBAAoB,CAAC,eAAe,CAChC,oBAAoB,CAAC,IAAI,EACzB,CAAC,gBAAgB,EAAE,OAAO,EAAE,EAAE;QAC1B,OAAO,GAAG,EAAE,CAAC,IAAI,oBAAoB,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;IACrE,CAAC,EACD,oBAAoB,CAAC,OAAO,EAC5B,KAAK,CACR,CAAC;AACN,CAAC","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 { Observable } from \"../../Misc/observable.pure\";\r\nimport { Constants } from \"../../Engines/constants\";\r\nimport { WebGLHardwareTexture } from \"../../Engines/WebGL/webGLHardwareTexture\";\r\nimport { InternalTexture, InternalTextureSource } from \"../../Materials/Textures/internalTexture\";\r\nimport { BaseTexture } from \"../../Materials/Textures/baseTexture.pure\";\r\nimport { WebXRGraphicsBindingType } from \"../webXRGraphicsBinding\";\r\n\r\n/**\r\n * Options for raw camera access\r\n */\r\nexport interface IWebXRRawCameraAccessOptions {\r\n /**\r\n * Keep the created textures and metadata when detaching the feature.\r\n */\r\n doNotDisposeOnDetach?: boolean;\r\n}\r\n\r\n/**\r\n * WebXR Feature for WebXR raw camera access\r\n * @since 6.31.0\r\n * @see https://immersive-web.github.io/raw-camera-access/\r\n */\r\nexport class WebXRRawCameraAccess extends WebXRAbstractFeature {\r\n private _cachedInternalTextures: InternalTexture[] = [];\r\n /**\r\n * This is an array of camera views\r\n * Note that mostly the array will contain a single view\r\n * If you want to know the order of the views, use the `viewIndex` array\r\n */\r\n public texturesData: BaseTexture[] = [];\r\n /**\r\n * If needed, this array will contain the eye definition of each texture in `texturesArray`\r\n */\r\n public viewIndex: string[] = [];\r\n\r\n /**\r\n * If needed, this array will contain the camera's intrinsics\r\n * You can use this data to convert from camera space to screen space and vice versa\r\n */\r\n public cameraIntrinsics: {\r\n u0: number;\r\n v0: number;\r\n ax: number;\r\n ay: number;\r\n gamma: number;\r\n width: number;\r\n height: number;\r\n viewportX: number;\r\n viewportY: number;\r\n }[] = [];\r\n\r\n /**\r\n * An observable that will notify when the camera's textures are updated\r\n */\r\n public onTexturesUpdatedObservable: Observable<BaseTexture[]> = new Observable();\r\n\r\n private _glBinding?: XRWebGLBinding;\r\n private _glContext: WebGLRenderingContext;\r\n\r\n /**\r\n * The module's name\r\n */\r\n public static readonly Name = WebXRFeatureName.RAW_CAMERA_ACCESS;\r\n\r\n /**\r\n * The (Babylon) version of this module.\r\n * This is an integer representing the implementation version.\r\n * This number does not correspond to the WebXR specs version\r\n */\r\n public static readonly Version = 1;\r\n\r\n /**\r\n * Creates a new instance of the feature\r\n * @param _xrSessionManager the WebXRSessionManager\r\n * @param options options for the Feature\r\n */\r\n constructor(\r\n _xrSessionManager: WebXRSessionManager,\r\n public readonly options: IWebXRRawCameraAccessOptions = {}\r\n ) {\r\n super(_xrSessionManager);\r\n this.xrNativeFeatureName = \"camera-access\";\r\n }\r\n\r\n public override attach(force?: boolean): boolean {\r\n if (this._xrSessionManager.scene.getEngine().isWebGPU) {\r\n return this._disableAutoAttach(\r\n \"WebXR Raw Camera Access is unavailable with WebGPU XR because camera images are exposed only by XRWebGLBinding; the feature was disabled.\"\r\n );\r\n }\r\n\r\n if (!super.attach(force)) {\r\n return false;\r\n }\r\n\r\n const graphicsBinding = this._xrSessionManager._getGraphicsBinding();\r\n if (graphicsBinding.bindingType !== WebXRGraphicsBindingType.WebGL) {\r\n throw new Error(\"Expected a WebGL graphics binding for WebXR Raw Camera Access.\");\r\n }\r\n this._glContext = graphicsBinding.context;\r\n this._glBinding = graphicsBinding.binding;\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 this._glBinding = undefined;\r\n if (!this.options.doNotDisposeOnDetach) {\r\n for (const t of this._cachedInternalTextures) {\r\n t.dispose();\r\n }\r\n for (const t of this.texturesData) {\r\n t.dispose();\r\n }\r\n this._cachedInternalTextures.length = 0;\r\n this.texturesData.length = 0;\r\n this.cameraIntrinsics.length = 0;\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * Dispose this feature and all of the resources attached\r\n */\r\n public override dispose(): void {\r\n super.dispose();\r\n this.onTexturesUpdatedObservable.clear();\r\n }\r\n\r\n /**\r\n * @see https://github.com/immersive-web/raw-camera-access/blob/main/explainer.md\r\n * @param view the XRView to update\r\n * @param index the index of the view in the views array\r\n */\r\n private _updateCameraIntrinsics(view: XRView, index: number): void {\r\n const cameraViewport = {\r\n width: view.camera!.width,\r\n height: view.camera!.height,\r\n x: 0,\r\n y: 0,\r\n };\r\n const p = view.projectionMatrix;\r\n\r\n // Principal point in pixels (typically at or near the center of the viewport)\r\n const u0 = ((1 - p[8]) * cameraViewport.width) / 2 + cameraViewport.x;\r\n const v0 = ((1 - p[9]) * cameraViewport.height) / 2 + cameraViewport.y;\r\n\r\n // Focal lengths in pixels (these are equal for square pixels)\r\n const ax = (cameraViewport.width / 2) * p[0];\r\n const ay = (cameraViewport.height / 2) * p[5];\r\n\r\n // Skew factor in pixels (nonzero for rhomboid pixels)\r\n const gamma = (cameraViewport.width / 2) * p[4];\r\n this.cameraIntrinsics[index] = {\r\n u0,\r\n v0,\r\n ax,\r\n ay,\r\n gamma,\r\n width: cameraViewport.width,\r\n height: cameraViewport.height,\r\n viewportX: cameraViewport.x,\r\n viewportY: cameraViewport.y,\r\n };\r\n }\r\n\r\n private _updateInternalTextures(view: XRView, index = 0): boolean {\r\n if (!view.camera) {\r\n return false;\r\n }\r\n this.viewIndex[index] = view.eye;\r\n const lp = this._glBinding?.getCameraImage(view.camera);\r\n\r\n if (!this._cachedInternalTextures[index]) {\r\n const internalTexture = new InternalTexture(this._xrSessionManager.scene.getEngine(), InternalTextureSource.Unknown, true);\r\n internalTexture.invertY = false;\r\n internalTexture.format = Constants.TEXTUREFORMAT_RGBA;\r\n internalTexture.generateMipMaps = true;\r\n internalTexture.type = Constants.TEXTURETYPE_UNSIGNED_BYTE;\r\n internalTexture.samplingMode = Constants.TEXTURE_LINEAR_LINEAR_MIPLINEAR;\r\n internalTexture.width = view.camera.width;\r\n internalTexture.height = view.camera.height;\r\n internalTexture._cachedWrapU = Constants.TEXTURE_WRAP_ADDRESSMODE;\r\n internalTexture._cachedWrapV = Constants.TEXTURE_WRAP_ADDRESSMODE;\r\n internalTexture._hardwareTexture = new WebGLHardwareTexture(lp, this._glContext);\r\n this._cachedInternalTextures[index] = internalTexture;\r\n // create the base texture\r\n const texture = new BaseTexture(this._xrSessionManager.scene);\r\n texture.name = `WebXR Raw Camera Access (${index})`;\r\n texture._texture = this._cachedInternalTextures[index];\r\n this.texturesData[index] = texture;\r\n // get the camera intrinsics\r\n this._updateCameraIntrinsics(view, index);\r\n } else {\r\n // make sure the webgl texture is updated. Should happen automatically\r\n this._cachedInternalTextures[index]._hardwareTexture?.set(lp);\r\n }\r\n this._cachedInternalTextures[index].isReady = true;\r\n return true;\r\n }\r\n\r\n protected _onXRFrame(_xrFrame: XRFrame): void {\r\n const referenceSPace = this._xrSessionManager.referenceSpace;\r\n\r\n const pose = _xrFrame.getViewerPose(referenceSPace);\r\n if (!pose || !pose.views) {\r\n return;\r\n }\r\n let updated = true;\r\n for (let index = 0; index < pose.views.length; index++) {\r\n const view = pose.views[index];\r\n updated = updated && this._updateInternalTextures(view, index);\r\n }\r\n if (updated) {\r\n this.onTexturesUpdatedObservable.notifyObservers(this.texturesData);\r\n }\r\n }\r\n}\r\n\r\nlet _Registered = false;\r\n/**\r\n * Register side effects for webXRRawCameraAccess.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\nexport function RegisterWebXRRawCameraAccess(): void {\r\n if (_Registered) {\r\n return;\r\n }\r\n _Registered = true;\r\n\r\n WebXRFeaturesManager.AddWebXRFeature(\r\n WebXRRawCameraAccess.Name,\r\n (xrSessionManager, options) => {\r\n return () => new WebXRRawCameraAccess(xrSessionManager, options);\r\n },\r\n WebXRRawCameraAccess.Version,\r\n false\r\n );\r\n}\r\n"]}
@@ -92,7 +92,6 @@ export declare class WebXRSpaceWarp extends WebXRAbstractFeature {
92
92
  * The space warp provider
93
93
  */
94
94
  spaceWarpRTTProvider: Nullable<WebXRSpaceWarpRenderTargetTextureProvider>;
95
- private _glContext;
96
95
  private _xrWebGLBinding;
97
96
  private _renderTargetTexture;
98
97
  private _onAfterRenderObserver;
@@ -5,6 +5,7 @@ import { Matrix } from "../../Maths/math.vector.pure.js";
5
5
  import { RenderTargetTexture } from "../../Materials/Textures/renderTargetTexture.pure.js";
6
6
 
7
7
  import { ShaderMaterial } from "../../Materials/shaderMaterial.pure.js";
8
+ const _WebGPUUnavailableWarning = "WebXR Space Warp is unavailable with WebGPU XR because this runtime does not expose usable motion-vector/depth sub-images; the feature was disabled.";
8
9
  /**
9
10
  * Used for Space Warp render process
10
11
  */
@@ -208,7 +209,6 @@ export class WebXRSpaceWarp extends WebXRAbstractFeature {
208
209
  this._onAfterRenderObserver = null;
209
210
  this.dependsOn = [WebXRFeatureName.LAYERS];
210
211
  this.xrNativeFeatureName = "space-warp";
211
- this._xrSessionManager.scene.needsPreviousWorldMatrices = true;
212
212
  }
213
213
  /**
214
214
  * Attach this feature.
@@ -217,12 +217,18 @@ export class WebXRSpaceWarp extends WebXRAbstractFeature {
217
217
  * @returns true if successful.
218
218
  */
219
219
  attach() {
220
+ if (this._xrSessionManager.scene.getEngine().isWebGPU) {
221
+ return this._disableAutoAttach(_WebGPUUnavailableWarning);
222
+ }
220
223
  if (!super.attach()) {
221
224
  return false;
222
225
  }
223
- const engine = this._xrSessionManager.scene.getEngine();
224
- this._glContext = engine._gl;
225
- this._xrWebGLBinding = new XRWebGLBinding(this._xrSessionManager.session, this._glContext);
226
+ this._xrSessionManager.scene.needsPreviousWorldMatrices = true;
227
+ const graphicsBinding = this._xrSessionManager._getGraphicsBinding();
228
+ if (graphicsBinding.bindingType !== 0 /* WebXRGraphicsBindingType.WebGL */) {
229
+ throw new Error("Expected a WebGL graphics binding for WebXR Space Warp.");
230
+ }
231
+ this._xrWebGLBinding = graphicsBinding.binding;
226
232
  this.spaceWarpRTTProvider = new WebXRSpaceWarpRenderTargetTextureProvider(this._xrSessionManager.scene, this._xrSessionManager, this._xrWebGLBinding);
227
233
  this._onAfterRenderObserver = this._xrSessionManager.scene.onAfterRenderObservable.add(() => this._onAfterRender());
228
234
  return true;
@@ -237,6 +243,9 @@ export class WebXRSpaceWarp extends WebXRAbstractFeature {
237
243
  }
238
244
  }
239
245
  isCompatible() {
246
+ if (this._xrSessionManager.scene.getEngine().isWebGPU) {
247
+ return this._disableAutoAttach(_WebGPUUnavailableWarning);
248
+ }
240
249
  return this._xrSessionManager.scene.getEngine().getCaps().colorBufferHalfFloat || false;
241
250
  }
242
251
  dispose() {
@@ -1 +1 @@
1
- {"version":3,"file":"WebXRSpaceWarp.pure.js","sourceRoot":"","sources":["../../../../../dev/core/src/XR/features/WebXRSpaceWarp.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/** This file must only contain pure code and pure imports */\r\n\r\nimport { type Engine } from \"../../Engines/engine.pure\";\r\nimport { type WebGLRenderTargetWrapper } from \"../../Engines/WebGL/webGLRenderTargetWrapper\";\r\nimport { WebXRFeatureName, WebXRFeaturesManager } from \"../webXRFeaturesManager\";\r\nimport { type WebXRSessionManager } from \"../webXRSessionManager\";\r\nimport { WebXRAbstractFeature } from \"./WebXRAbstractFeature\";\r\nimport { type Nullable } from \"../../types\";\r\nimport { type IWebXRRenderTargetTextureProvider } from \"../webXRRenderTargetTextureProvider\";\r\nimport { type Viewport } from \"../../Maths/math.viewport\";\r\nimport { type Scene } from \"../../scene.pure\";\r\nimport { Matrix } from \"../../Maths/math.vector.pure\";\r\nimport { RenderTargetTexture } from \"../../Materials/Textures/renderTargetTexture.pure\";\r\nimport { Constants } from \"../../Engines/constants\";\r\nimport { ShaderMaterial } from \"../../Materials/shaderMaterial.pure\";\r\nimport { type AbstractMesh } from \"../../Meshes/abstractMesh.pure\";\r\nimport { type Material } from \"../../Materials/material.pure\";\r\nimport { type Observer } from \"../../Misc/observable.pure\";\r\nimport { type ThinEngine } from \"../../Engines/thinEngine.pure\";\r\n\r\n/**\r\n * Used for Space Warp render process\r\n */\r\nexport class XRSpaceWarpRenderTarget extends RenderTargetTexture {\r\n private _velocityMaterial: ShaderMaterial;\r\n private _originalPairing: Array<[AbstractMesh, Nullable<Material>]> = [];\r\n private _previousWorldMatrices: Array<Matrix> = [];\r\n private _previousTransforms: Matrix[] = [Matrix.Identity(), Matrix.Identity()];\r\n\r\n /**\r\n * Creates a Space Warp render target\r\n * @param motionVectorTexture WebGLTexture provided by WebGLSubImage\r\n * @param depthStencilTexture WebGLTexture provided by WebGLSubImage\r\n * @param scene scene used with the render target\r\n * @param size the size of the render target (used for each view)\r\n */\r\n constructor(motionVectorTexture: WebGLTexture, depthStencilTexture: WebGLTexture, scene?: Scene, size: number | { width: number; height: number } | { ratio: number } = 512) {\r\n super(\"spacewarp rtt\", size, scene, false, true, Constants.TEXTURETYPE_HALF_FLOAT, false, undefined, false, false, true, undefined, true);\r\n this._renderTarget = (this.getScene()!.getEngine() as Engine).createMultiviewRenderTargetTexture(\r\n this.getRenderWidth(),\r\n this.getRenderHeight(),\r\n motionVectorTexture,\r\n depthStencilTexture\r\n );\r\n (this._renderTarget as WebGLRenderTargetWrapper)._disposeOnlyFramebuffers = true;\r\n this._texture = this._renderTarget.texture!;\r\n this._texture.isMultiview = true;\r\n this._texture.format = Constants.TEXTUREFORMAT_RGBA;\r\n\r\n if (scene) {\r\n this._velocityMaterial = new ShaderMaterial(\r\n \"velocity shader material\",\r\n scene,\r\n {\r\n vertex: \"velocity\",\r\n fragment: \"velocity\",\r\n },\r\n {\r\n uniforms: [\"world\", \"previousWorld\", \"viewProjection\", \"viewProjectionR\", \"previousViewProjection\", \"previousViewProjectionR\"],\r\n }\r\n );\r\n this._velocityMaterial._materialHelperNeedsPreviousMatrices = true;\r\n this._velocityMaterial.onBindObservable.add((mesh) => {\r\n // mesh. getWorldMatrix can be incorrect under rare conditions (e.g. when using a effective mesh in the render function).\r\n // If the case arise that will require changing it we will need to change the bind process in the material class to also provide the world matrix as a parameter\r\n this._previousWorldMatrices[mesh.uniqueId] = this._previousWorldMatrices[mesh.uniqueId] || mesh.getWorldMatrix();\r\n this._velocityMaterial.getEffect().setMatrix(\"previousWorld\", this._previousWorldMatrices[mesh.uniqueId]);\r\n this._previousWorldMatrices[mesh.uniqueId] = mesh.getWorldMatrix();\r\n // now set the scene's previous matrix\r\n this._velocityMaterial.getEffect().setMatrix(\"previousViewProjection\", this._previousTransforms[0]);\r\n // multiview for sure\r\n this._velocityMaterial.getEffect().setMatrix(\"previousViewProjectionR\", this._previousTransforms[1]);\r\n\r\n // store the previous (current, to be exact) transforms\r\n this._previousTransforms[0].copyFrom(scene.getTransformMatrix());\r\n this._previousTransforms[1].copyFrom(scene._transformMatrixR);\r\n });\r\n this._velocityMaterial.freeze();\r\n }\r\n }\r\n\r\n public override render(useCameraPostProcess: boolean = false, dumpForDebug: boolean = false): void {\r\n // Swap to use velocity material\r\n this._originalPairing.length = 0;\r\n const scene = this.getScene();\r\n // set the velocity material to render the velocity RTT\r\n if (scene && this._velocityMaterial) {\r\n scene.getActiveMeshes().forEach((mesh) => {\r\n this._originalPairing.push([mesh, mesh.material]);\r\n mesh.material = this._velocityMaterial;\r\n });\r\n }\r\n\r\n super.render(useCameraPostProcess, dumpForDebug);\r\n\r\n // Restore original materials\r\n for (const tuple of this._originalPairing) {\r\n tuple[0].material = tuple[1];\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _bindFrameBuffer() {\r\n if (!this._renderTarget) {\r\n return;\r\n }\r\n (this.getScene()!.getEngine() as Engine).bindSpaceWarpFramebuffer(this._renderTarget);\r\n }\r\n\r\n /**\r\n * Gets the number of views the corresponding to the texture (eg. a SpaceWarpRenderTarget will have > 1)\r\n * @returns the view count\r\n */\r\n public override getViewCount() {\r\n return 2;\r\n }\r\n\r\n public override dispose(): void {\r\n super.dispose();\r\n this._velocityMaterial.dispose();\r\n this._previousTransforms.length = 0;\r\n this._previousWorldMatrices.length = 0;\r\n this._originalPairing.length = 0;\r\n }\r\n}\r\n\r\n/**\r\n * WebXR Space Warp Render Target Texture Provider\r\n */\r\nexport class WebXRSpaceWarpRenderTargetTextureProvider implements IWebXRRenderTargetTextureProvider {\r\n protected _lastSubImages = new Map<XRView, XRWebGLSubImage>();\r\n protected _renderTargetTextures = new Map<XREye, RenderTargetTexture>();\r\n protected _framebufferDimensions: Nullable<{ framebufferWidth: number; framebufferHeight: number }>;\r\n protected _engine: Engine;\r\n\r\n constructor(\r\n protected readonly _scene: Scene,\r\n protected readonly _xrSessionManager: WebXRSessionManager,\r\n protected readonly _xrWebGLBinding: XRWebGLBinding\r\n ) {\r\n this._engine = _scene.getEngine() as Engine;\r\n }\r\n\r\n private _getSubImageForView(view: XRView): XRWebGLSubImage {\r\n const layerWrapper = this._xrSessionManager._getBaseLayerWrapper();\r\n if (!layerWrapper) {\r\n throw new Error(\"For Space Warp, the base layer should be a WebXR Projection Layer.\");\r\n }\r\n if (layerWrapper.layerType !== \"XRProjectionLayer\") {\r\n throw new Error('For Space Warp, the base layer type should \"XRProjectionLayer\".');\r\n }\r\n const layer = layerWrapper.layer as XRProjectionLayer;\r\n return this._xrWebGLBinding.getViewSubImage(layer, view);\r\n }\r\n\r\n protected _setViewportForSubImage(viewport: Viewport, subImage: XRWebGLSubImage) {\r\n viewport.x = 0;\r\n viewport.y = 0;\r\n viewport.width = subImage.motionVectorTextureWidth!;\r\n viewport.height = subImage.motionVectorTextureHeight!;\r\n }\r\n\r\n protected _createRenderTargetTexture(\r\n width: number,\r\n height: number,\r\n framebuffer: Nullable<WebGLFramebuffer>,\r\n motionVectorTexture: WebGLTexture,\r\n depthStencilTexture: WebGLTexture\r\n ): RenderTargetTexture {\r\n if (!this._engine) {\r\n throw new Error(\"Engine is disposed\");\r\n }\r\n\r\n const textureSize = { width, height };\r\n\r\n // Create render target texture from the internal texture\r\n const renderTargetTexture = new XRSpaceWarpRenderTarget(motionVectorTexture, depthStencilTexture, this._scene, textureSize);\r\n const renderTargetWrapper = renderTargetTexture.renderTarget as WebGLRenderTargetWrapper;\r\n if (framebuffer) {\r\n renderTargetWrapper._framebuffer = framebuffer;\r\n }\r\n\r\n // Create internal texture\r\n renderTargetWrapper._colorTextureArray = motionVectorTexture;\r\n renderTargetWrapper._depthStencilTextureArray = depthStencilTexture;\r\n\r\n renderTargetTexture.disableRescaling();\r\n renderTargetTexture.renderListPredicate = () => true;\r\n\r\n return renderTargetTexture;\r\n }\r\n\r\n protected _getRenderTargetForSubImage(subImage: XRWebGLSubImage, view: XRView) {\r\n const lastSubImage = this._lastSubImages.get(view);\r\n let renderTargetTexture = this._renderTargetTextures.get(view.eye);\r\n\r\n const width = subImage.motionVectorTextureWidth!;\r\n const height = subImage.motionVectorTextureHeight!;\r\n\r\n if (!renderTargetTexture || lastSubImage?.textureWidth !== width || lastSubImage?.textureHeight != height) {\r\n renderTargetTexture = this._createRenderTargetTexture(width, height, null, subImage.motionVectorTexture!, subImage.depthStencilTexture!);\r\n this._renderTargetTextures.set(view.eye, renderTargetTexture);\r\n\r\n this._framebufferDimensions = {\r\n framebufferWidth: width,\r\n framebufferHeight: height,\r\n };\r\n }\r\n\r\n this._lastSubImages.set(view, subImage);\r\n\r\n return renderTargetTexture;\r\n }\r\n\r\n public trySetViewportForView(viewport: Viewport, view: XRView): boolean {\r\n const subImage = this._lastSubImages.get(view) || this._getSubImageForView(view);\r\n if (subImage) {\r\n this._setViewportForSubImage(viewport, subImage);\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Access the motion vector (which will turn on Space Warp)\r\n * @param view the view to access the motion vector texture for\r\n */\r\n public accessMotionVector(view: XRView): void {\r\n const subImage = this._getSubImageForView(view);\r\n if (subImage) {\r\n // Meta Quest Browser uses accessing these textures as a sign for turning on Space Warp\r\n subImage.motionVectorTexture;\r\n subImage.depthStencilTexture;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the render target texture for the specified eye\r\n * @param _eye the eye to get the render target texture for\r\n * @returns the render target texture or null\r\n */\r\n public getRenderTargetTextureForEye(_eye: XREye): Nullable<RenderTargetTexture> {\r\n return null;\r\n }\r\n\r\n public getRenderTargetTextureForView(view: XRView): Nullable<RenderTargetTexture> {\r\n const subImage = this._getSubImageForView(view);\r\n if (subImage) {\r\n return this._getRenderTargetForSubImage(subImage, view);\r\n }\r\n return null;\r\n }\r\n\r\n public dispose() {\r\n this._renderTargetTextures.forEach((rtt) => rtt.dispose());\r\n this._renderTargetTextures.clear();\r\n }\r\n}\r\n\r\n/**\r\n * the WebXR Space Warp feature.\r\n */\r\nexport class WebXRSpaceWarp extends WebXRAbstractFeature {\r\n /**\r\n * The module's name\r\n */\r\n public static readonly Name = WebXRFeatureName.SPACE_WARP;\r\n /**\r\n * The (Babylon) version of this module.\r\n * This is an integer representing the implementation version.\r\n * This number does not correspond to the WebXR specs version\r\n */\r\n public static readonly Version = 1;\r\n\r\n /**\r\n * The space warp provider\r\n */\r\n public spaceWarpRTTProvider: Nullable<WebXRSpaceWarpRenderTargetTextureProvider>;\r\n private _glContext: WebGLRenderingContext | WebGL2RenderingContext;\r\n private _xrWebGLBinding: XRWebGLBinding;\r\n private _renderTargetTexture: Nullable<RenderTargetTexture>;\r\n private _onAfterRenderObserver: Nullable<Observer<Scene>> = null;\r\n\r\n /**\r\n * constructor for the space warp feature\r\n * @param _xrSessionManager the xr session manager for this feature\r\n */\r\n constructor(_xrSessionManager: WebXRSessionManager) {\r\n super(_xrSessionManager);\r\n this.xrNativeFeatureName = \"space-warp\";\r\n this._xrSessionManager.scene.needsPreviousWorldMatrices = true;\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._glContext = (engine as ThinEngine)._gl;\r\n this._xrWebGLBinding = new XRWebGLBinding(this._xrSessionManager.session, this._glContext);\r\n\r\n this.spaceWarpRTTProvider = new WebXRSpaceWarpRenderTargetTextureProvider(this._xrSessionManager.scene, this._xrSessionManager, this._xrWebGLBinding);\r\n\r\n this._onAfterRenderObserver = this._xrSessionManager.scene.onAfterRenderObservable.add(() => this._onAfterRender());\r\n\r\n return true;\r\n }\r\n\r\n public override detach(): boolean {\r\n this._xrSessionManager.scene.onAfterRenderObservable.remove(this._onAfterRenderObserver);\r\n return super.detach();\r\n }\r\n\r\n private _onAfterRender(): void {\r\n if (this.attached && this._renderTargetTexture) {\r\n this._renderTargetTexture.render(false, false);\r\n }\r\n }\r\n\r\n public override dependsOn: string[] = [WebXRFeatureName.LAYERS];\r\n\r\n public override isCompatible(): boolean {\r\n return this._xrSessionManager.scene.getEngine().getCaps().colorBufferHalfFloat || false;\r\n }\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 const pose = _xrFrame.getViewerPose(this._xrSessionManager.referenceSpace);\r\n if (!pose) {\r\n return;\r\n }\r\n\r\n // get the first view to which we will create a texture (or update it)\r\n const view = pose.views[0];\r\n this._renderTargetTexture = this._renderTargetTexture || this.spaceWarpRTTProvider!.getRenderTargetTextureForView(view);\r\n this.spaceWarpRTTProvider!.accessMotionVector(view);\r\n }\r\n}\r\n\r\nlet _Registered = false;\r\n/**\r\n * Register side effects for webXRSpaceWarp.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\nexport function RegisterWebXRSpaceWarp(): 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 WebXRSpaceWarp.Name,\r\n (xrSessionManager) => {\r\n return () => new WebXRSpaceWarp(xrSessionManager);\r\n },\r\n WebXRSpaceWarp.Version,\r\n false\r\n );\r\n}\r\n"]}
1
+ {"version":3,"file":"WebXRSpaceWarp.pure.js","sourceRoot":"","sources":["../../../../../dev/core/src/XR/features/WebXRSpaceWarp.pure.ts"],"names":[],"mappings":"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","sourcesContent":["/** This file must only contain pure code and pure imports */\r\n\r\nimport { type Engine } from \"../../Engines/engine.pure\";\r\nimport { type WebGLRenderTargetWrapper } from \"../../Engines/WebGL/webGLRenderTargetWrapper\";\r\nimport { WebXRFeatureName, WebXRFeaturesManager } from \"../webXRFeaturesManager\";\r\nimport { type WebXRSessionManager } from \"../webXRSessionManager\";\r\nimport { WebXRAbstractFeature } from \"./WebXRAbstractFeature\";\r\nimport { type Nullable } from \"../../types\";\r\nimport { type IWebXRRenderTargetTextureProvider } from \"../webXRRenderTargetTextureProvider\";\r\nimport { type Viewport } from \"../../Maths/math.viewport\";\r\nimport { type Scene } from \"../../scene.pure\";\r\nimport { Matrix } from \"../../Maths/math.vector.pure\";\r\nimport { RenderTargetTexture } from \"../../Materials/Textures/renderTargetTexture.pure\";\r\nimport { Constants } from \"../../Engines/constants\";\r\nimport { ShaderMaterial } from \"../../Materials/shaderMaterial.pure\";\r\nimport { type AbstractMesh } from \"../../Meshes/abstractMesh.pure\";\r\nimport { type Material } from \"../../Materials/material.pure\";\r\nimport { type Observer } from \"../../Misc/observable.pure\";\r\nimport { WebXRGraphicsBindingType } from \"../webXRGraphicsBinding\";\r\n\r\nconst _WebGPUUnavailableWarning =\r\n \"WebXR Space Warp is unavailable with WebGPU XR because this runtime does not expose usable motion-vector/depth sub-images; the feature was disabled.\";\r\n\r\n/**\r\n * Used for Space Warp render process\r\n */\r\nexport class XRSpaceWarpRenderTarget extends RenderTargetTexture {\r\n private _velocityMaterial: ShaderMaterial;\r\n private _originalPairing: Array<[AbstractMesh, Nullable<Material>]> = [];\r\n private _previousWorldMatrices: Array<Matrix> = [];\r\n private _previousTransforms: Matrix[] = [Matrix.Identity(), Matrix.Identity()];\r\n\r\n /**\r\n * Creates a Space Warp render target\r\n * @param motionVectorTexture WebGLTexture provided by WebGLSubImage\r\n * @param depthStencilTexture WebGLTexture provided by WebGLSubImage\r\n * @param scene scene used with the render target\r\n * @param size the size of the render target (used for each view)\r\n */\r\n constructor(motionVectorTexture: WebGLTexture, depthStencilTexture: WebGLTexture, scene?: Scene, size: number | { width: number; height: number } | { ratio: number } = 512) {\r\n super(\"spacewarp rtt\", size, scene, false, true, Constants.TEXTURETYPE_HALF_FLOAT, false, undefined, false, false, true, undefined, true);\r\n this._renderTarget = (this.getScene()!.getEngine() as Engine).createMultiviewRenderTargetTexture(\r\n this.getRenderWidth(),\r\n this.getRenderHeight(),\r\n motionVectorTexture,\r\n depthStencilTexture\r\n );\r\n (this._renderTarget as WebGLRenderTargetWrapper)._disposeOnlyFramebuffers = true;\r\n this._texture = this._renderTarget.texture!;\r\n this._texture.isMultiview = true;\r\n this._texture.format = Constants.TEXTUREFORMAT_RGBA;\r\n\r\n if (scene) {\r\n this._velocityMaterial = new ShaderMaterial(\r\n \"velocity shader material\",\r\n scene,\r\n {\r\n vertex: \"velocity\",\r\n fragment: \"velocity\",\r\n },\r\n {\r\n uniforms: [\"world\", \"previousWorld\", \"viewProjection\", \"viewProjectionR\", \"previousViewProjection\", \"previousViewProjectionR\"],\r\n }\r\n );\r\n this._velocityMaterial._materialHelperNeedsPreviousMatrices = true;\r\n this._velocityMaterial.onBindObservable.add((mesh) => {\r\n // mesh. getWorldMatrix can be incorrect under rare conditions (e.g. when using a effective mesh in the render function).\r\n // If the case arise that will require changing it we will need to change the bind process in the material class to also provide the world matrix as a parameter\r\n this._previousWorldMatrices[mesh.uniqueId] = this._previousWorldMatrices[mesh.uniqueId] || mesh.getWorldMatrix();\r\n this._velocityMaterial.getEffect().setMatrix(\"previousWorld\", this._previousWorldMatrices[mesh.uniqueId]);\r\n this._previousWorldMatrices[mesh.uniqueId] = mesh.getWorldMatrix();\r\n // now set the scene's previous matrix\r\n this._velocityMaterial.getEffect().setMatrix(\"previousViewProjection\", this._previousTransforms[0]);\r\n // multiview for sure\r\n this._velocityMaterial.getEffect().setMatrix(\"previousViewProjectionR\", this._previousTransforms[1]);\r\n\r\n // store the previous (current, to be exact) transforms\r\n this._previousTransforms[0].copyFrom(scene.getTransformMatrix());\r\n this._previousTransforms[1].copyFrom(scene._transformMatrixR);\r\n });\r\n this._velocityMaterial.freeze();\r\n }\r\n }\r\n\r\n public override render(useCameraPostProcess: boolean = false, dumpForDebug: boolean = false): void {\r\n // Swap to use velocity material\r\n this._originalPairing.length = 0;\r\n const scene = this.getScene();\r\n // set the velocity material to render the velocity RTT\r\n if (scene && this._velocityMaterial) {\r\n scene.getActiveMeshes().forEach((mesh) => {\r\n this._originalPairing.push([mesh, mesh.material]);\r\n mesh.material = this._velocityMaterial;\r\n });\r\n }\r\n\r\n super.render(useCameraPostProcess, dumpForDebug);\r\n\r\n // Restore original materials\r\n for (const tuple of this._originalPairing) {\r\n tuple[0].material = tuple[1];\r\n }\r\n }\r\n\r\n /**\r\n * @internal\r\n */\r\n public override _bindFrameBuffer() {\r\n if (!this._renderTarget) {\r\n return;\r\n }\r\n (this.getScene()!.getEngine() as Engine).bindSpaceWarpFramebuffer(this._renderTarget);\r\n }\r\n\r\n /**\r\n * Gets the number of views the corresponding to the texture (eg. a SpaceWarpRenderTarget will have > 1)\r\n * @returns the view count\r\n */\r\n public override getViewCount() {\r\n return 2;\r\n }\r\n\r\n public override dispose(): void {\r\n super.dispose();\r\n this._velocityMaterial.dispose();\r\n this._previousTransforms.length = 0;\r\n this._previousWorldMatrices.length = 0;\r\n this._originalPairing.length = 0;\r\n }\r\n}\r\n\r\n/**\r\n * WebXR Space Warp Render Target Texture Provider\r\n */\r\nexport class WebXRSpaceWarpRenderTargetTextureProvider implements IWebXRRenderTargetTextureProvider {\r\n protected _lastSubImages = new Map<XRView, XRWebGLSubImage>();\r\n protected _renderTargetTextures = new Map<XREye, RenderTargetTexture>();\r\n protected _framebufferDimensions: Nullable<{ framebufferWidth: number; framebufferHeight: number }>;\r\n protected _engine: Engine;\r\n\r\n constructor(\r\n protected readonly _scene: Scene,\r\n protected readonly _xrSessionManager: WebXRSessionManager,\r\n protected readonly _xrWebGLBinding: XRWebGLBinding\r\n ) {\r\n this._engine = _scene.getEngine() as Engine;\r\n }\r\n\r\n private _getSubImageForView(view: XRView): XRWebGLSubImage {\r\n const layerWrapper = this._xrSessionManager._getBaseLayerWrapper();\r\n if (!layerWrapper) {\r\n throw new Error(\"For Space Warp, the base layer should be a WebXR Projection Layer.\");\r\n }\r\n if (layerWrapper.layerType !== \"XRProjectionLayer\") {\r\n throw new Error('For Space Warp, the base layer type should \"XRProjectionLayer\".');\r\n }\r\n const layer = layerWrapper.layer as XRProjectionLayer;\r\n return this._xrWebGLBinding.getViewSubImage(layer, view);\r\n }\r\n\r\n protected _setViewportForSubImage(viewport: Viewport, subImage: XRWebGLSubImage) {\r\n viewport.x = 0;\r\n viewport.y = 0;\r\n viewport.width = subImage.motionVectorTextureWidth!;\r\n viewport.height = subImage.motionVectorTextureHeight!;\r\n }\r\n\r\n protected _createRenderTargetTexture(\r\n width: number,\r\n height: number,\r\n framebuffer: Nullable<WebGLFramebuffer>,\r\n motionVectorTexture: WebGLTexture,\r\n depthStencilTexture: WebGLTexture\r\n ): RenderTargetTexture {\r\n if (!this._engine) {\r\n throw new Error(\"Engine is disposed\");\r\n }\r\n\r\n const textureSize = { width, height };\r\n\r\n // Create render target texture from the internal texture\r\n const renderTargetTexture = new XRSpaceWarpRenderTarget(motionVectorTexture, depthStencilTexture, this._scene, textureSize);\r\n const renderTargetWrapper = renderTargetTexture.renderTarget as WebGLRenderTargetWrapper;\r\n if (framebuffer) {\r\n renderTargetWrapper._framebuffer = framebuffer;\r\n }\r\n\r\n // Create internal texture\r\n renderTargetWrapper._colorTextureArray = motionVectorTexture;\r\n renderTargetWrapper._depthStencilTextureArray = depthStencilTexture;\r\n\r\n renderTargetTexture.disableRescaling();\r\n renderTargetTexture.renderListPredicate = () => true;\r\n\r\n return renderTargetTexture;\r\n }\r\n\r\n protected _getRenderTargetForSubImage(subImage: XRWebGLSubImage, view: XRView) {\r\n const lastSubImage = this._lastSubImages.get(view);\r\n let renderTargetTexture = this._renderTargetTextures.get(view.eye);\r\n\r\n const width = subImage.motionVectorTextureWidth!;\r\n const height = subImage.motionVectorTextureHeight!;\r\n\r\n if (!renderTargetTexture || lastSubImage?.textureWidth !== width || lastSubImage?.textureHeight != height) {\r\n renderTargetTexture = this._createRenderTargetTexture(width, height, null, subImage.motionVectorTexture!, subImage.depthStencilTexture!);\r\n this._renderTargetTextures.set(view.eye, renderTargetTexture);\r\n\r\n this._framebufferDimensions = {\r\n framebufferWidth: width,\r\n framebufferHeight: height,\r\n };\r\n }\r\n\r\n this._lastSubImages.set(view, subImage);\r\n\r\n return renderTargetTexture;\r\n }\r\n\r\n public trySetViewportForView(viewport: Viewport, view: XRView): boolean {\r\n const subImage = this._lastSubImages.get(view) || this._getSubImageForView(view);\r\n if (subImage) {\r\n this._setViewportForSubImage(viewport, subImage);\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * Access the motion vector (which will turn on Space Warp)\r\n * @param view the view to access the motion vector texture for\r\n */\r\n public accessMotionVector(view: XRView): void {\r\n const subImage = this._getSubImageForView(view);\r\n if (subImage) {\r\n // Meta Quest Browser uses accessing these textures as a sign for turning on Space Warp\r\n subImage.motionVectorTexture;\r\n subImage.depthStencilTexture;\r\n }\r\n }\r\n\r\n /**\r\n * Gets the render target texture for the specified eye\r\n * @param _eye the eye to get the render target texture for\r\n * @returns the render target texture or null\r\n */\r\n public getRenderTargetTextureForEye(_eye: XREye): Nullable<RenderTargetTexture> {\r\n return null;\r\n }\r\n\r\n public getRenderTargetTextureForView(view: XRView): Nullable<RenderTargetTexture> {\r\n const subImage = this._getSubImageForView(view);\r\n if (subImage) {\r\n return this._getRenderTargetForSubImage(subImage, view);\r\n }\r\n return null;\r\n }\r\n\r\n public dispose() {\r\n this._renderTargetTextures.forEach((rtt) => rtt.dispose());\r\n this._renderTargetTextures.clear();\r\n }\r\n}\r\n\r\n/**\r\n * the WebXR Space Warp feature.\r\n */\r\nexport class WebXRSpaceWarp extends WebXRAbstractFeature {\r\n /**\r\n * The module's name\r\n */\r\n public static readonly Name = WebXRFeatureName.SPACE_WARP;\r\n /**\r\n * The (Babylon) version of this module.\r\n * This is an integer representing the implementation version.\r\n * This number does not correspond to the WebXR specs version\r\n */\r\n public static readonly Version = 1;\r\n\r\n /**\r\n * The space warp provider\r\n */\r\n public spaceWarpRTTProvider: Nullable<WebXRSpaceWarpRenderTargetTextureProvider>;\r\n private _xrWebGLBinding: XRWebGLBinding;\r\n private _renderTargetTexture: Nullable<RenderTargetTexture>;\r\n private _onAfterRenderObserver: Nullable<Observer<Scene>> = null;\r\n\r\n /**\r\n * constructor for the space warp feature\r\n * @param _xrSessionManager the xr session manager for this feature\r\n */\r\n constructor(_xrSessionManager: WebXRSessionManager) {\r\n super(_xrSessionManager);\r\n this.xrNativeFeatureName = \"space-warp\";\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 (this._xrSessionManager.scene.getEngine().isWebGPU) {\r\n return this._disableAutoAttach(_WebGPUUnavailableWarning);\r\n }\r\n\r\n if (!super.attach()) {\r\n return false;\r\n }\r\n this._xrSessionManager.scene.needsPreviousWorldMatrices = true;\r\n\r\n const graphicsBinding = this._xrSessionManager._getGraphicsBinding();\r\n if (graphicsBinding.bindingType !== WebXRGraphicsBindingType.WebGL) {\r\n throw new Error(\"Expected a WebGL graphics binding for WebXR Space Warp.\");\r\n }\r\n this._xrWebGLBinding = graphicsBinding.binding;\r\n\r\n this.spaceWarpRTTProvider = new WebXRSpaceWarpRenderTargetTextureProvider(this._xrSessionManager.scene, this._xrSessionManager, this._xrWebGLBinding);\r\n\r\n this._onAfterRenderObserver = this._xrSessionManager.scene.onAfterRenderObservable.add(() => this._onAfterRender());\r\n\r\n return true;\r\n }\r\n\r\n public override detach(): boolean {\r\n this._xrSessionManager.scene.onAfterRenderObservable.remove(this._onAfterRenderObserver);\r\n return super.detach();\r\n }\r\n\r\n private _onAfterRender(): void {\r\n if (this.attached && this._renderTargetTexture) {\r\n this._renderTargetTexture.render(false, false);\r\n }\r\n }\r\n\r\n public override dependsOn: string[] = [WebXRFeatureName.LAYERS];\r\n\r\n public override isCompatible(): boolean {\r\n if (this._xrSessionManager.scene.getEngine().isWebGPU) {\r\n return this._disableAutoAttach(_WebGPUUnavailableWarning);\r\n }\r\n return this._xrSessionManager.scene.getEngine().getCaps().colorBufferHalfFloat || false;\r\n }\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 const pose = _xrFrame.getViewerPose(this._xrSessionManager.referenceSpace);\r\n if (!pose) {\r\n return;\r\n }\r\n\r\n // get the first view to which we will create a texture (or update it)\r\n const view = pose.views[0];\r\n this._renderTargetTexture = this._renderTargetTexture || this.spaceWarpRTTProvider!.getRenderTargetTextureForView(view);\r\n this.spaceWarpRTTProvider!.accessMotionVector(view);\r\n }\r\n}\r\n\r\nlet _Registered = false;\r\n/**\r\n * Register side effects for webXRSpaceWarp.\r\n * Safe to call multiple times; only the first call has an effect.\r\n */\r\nexport function RegisterWebXRSpaceWarp(): 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 WebXRSpaceWarp.Name,\r\n (xrSessionManager) => {\r\n return () => new WebXRSpaceWarp(xrSessionManager);\r\n },\r\n WebXRSpaceWarp.Version,\r\n false\r\n );\r\n}\r\n"]}