@babylonjs/core 5.0.0-alpha.61 → 5.0.0-alpha.65

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 (519) hide show
  1. package/Animations/animation.js +42 -2
  2. package/Animations/animation.js.map +1 -1
  3. package/Animations/animationGroup.d.ts +5 -1
  4. package/Animations/animationGroup.js +19 -1
  5. package/Animations/animationGroup.js.map +1 -1
  6. package/Audio/sound.js +15 -1
  7. package/Audio/sound.js.map +1 -1
  8. package/Behaviors/Cameras/autoRotationBehavior.d.ts +5 -0
  9. package/Behaviors/Cameras/autoRotationBehavior.js +7 -0
  10. package/Behaviors/Cameras/autoRotationBehavior.js.map +1 -1
  11. package/Behaviors/Meshes/followBehavior.js +1 -1
  12. package/Behaviors/Meshes/followBehavior.js.map +1 -1
  13. package/Behaviors/Meshes/handConstraintBehavior.js +16 -12
  14. package/Behaviors/Meshes/handConstraintBehavior.js.map +1 -1
  15. package/Cameras/VR/vrDeviceOrientationArcRotateCamera.js +1 -1
  16. package/Cameras/VR/vrDeviceOrientationArcRotateCamera.js.map +1 -1
  17. package/Cameras/VR/vrExperienceHelper.d.ts +1 -1
  18. package/Cameras/VR/vrExperienceHelper.js +1 -1
  19. package/Cameras/VR/vrExperienceHelper.js.map +1 -1
  20. package/Cameras/camera.js +2 -2
  21. package/Cameras/camera.js.map +1 -1
  22. package/DeviceInput/Implementations/{nativeDeviceInputWrapper.d.ts → nativeDeviceInputSystem.d.ts} +5 -21
  23. package/DeviceInput/Implementations/{nativeDeviceInputWrapper.js → nativeDeviceInputSystem.js} +19 -20
  24. package/DeviceInput/Implementations/nativeDeviceInputSystem.js.map +1 -0
  25. package/DeviceInput/Implementations/webDeviceInputSystem.d.ts +7 -20
  26. package/DeviceInput/Implementations/webDeviceInputSystem.js +79 -71
  27. package/DeviceInput/Implementations/webDeviceInputSystem.js.map +1 -1
  28. package/DeviceInput/InputDevices/deviceSourceManager.d.ts +3 -2
  29. package/DeviceInput/InputDevices/deviceSourceManager.js +5 -1
  30. package/DeviceInput/InputDevices/deviceSourceManager.js.map +1 -1
  31. package/DeviceInput/Interfaces/inputInterfaces.d.ts +6 -13
  32. package/DeviceInput/Interfaces/inputInterfaces.js.map +1 -1
  33. package/DeviceInput/deviceInputSystem.d.ts +49 -5
  34. package/DeviceInput/deviceInputSystem.js +62 -10
  35. package/DeviceInput/deviceInputSystem.js.map +1 -1
  36. package/DeviceInput/index.d.ts +1 -1
  37. package/DeviceInput/index.js +1 -1
  38. package/DeviceInput/index.js.map +1 -1
  39. package/Engines/Extensions/engine.dynamicTexture.d.ts +2 -1
  40. package/Engines/Extensions/engine.dynamicTexture.js +2 -1
  41. package/Engines/Extensions/engine.dynamicTexture.js.map +1 -1
  42. package/Engines/Extensions/engine.views.d.ts +1 -1
  43. package/Engines/Extensions/engine.views.js +1 -1
  44. package/Engines/Extensions/engine.views.js.map +1 -1
  45. package/Engines/Processors/iShaderProcessor.d.ts +1 -1
  46. package/Engines/Processors/iShaderProcessor.js.map +1 -1
  47. package/Engines/Processors/shaderProcessingOptions.d.ts +5 -0
  48. package/Engines/Processors/shaderProcessingOptions.js.map +1 -1
  49. package/Engines/Processors/shaderProcessor.js +8 -2
  50. package/Engines/Processors/shaderProcessor.js.map +1 -1
  51. package/Engines/WebGPU/Extensions/engine.dynamicTexture.js +3 -11
  52. package/Engines/WebGPU/Extensions/engine.dynamicTexture.js.map +1 -1
  53. package/Engines/WebGPU/Extensions/engine.multiRender.js +19 -9
  54. package/Engines/WebGPU/Extensions/engine.multiRender.js.map +1 -1
  55. package/Engines/WebGPU/Extensions/engine.renderTarget.js +9 -6
  56. package/Engines/WebGPU/Extensions/engine.renderTarget.js.map +1 -1
  57. package/Engines/WebGPU/webgpuBufferManager.d.ts +1 -1
  58. package/Engines/WebGPU/webgpuBufferManager.js.map +1 -1
  59. package/Engines/WebGPU/webgpuCacheBindGroups.js +3 -3
  60. package/Engines/WebGPU/webgpuCacheBindGroups.js.map +1 -1
  61. package/Engines/WebGPU/webgpuCacheRenderPipeline.d.ts +4 -1
  62. package/Engines/WebGPU/webgpuCacheRenderPipeline.js +37 -83
  63. package/Engines/WebGPU/webgpuCacheRenderPipeline.js.map +1 -1
  64. package/Engines/WebGPU/webgpuCacheSampler.js +6 -4
  65. package/Engines/WebGPU/webgpuCacheSampler.js.map +1 -1
  66. package/Engines/WebGPU/webgpuClearQuad.d.ts +1 -1
  67. package/Engines/WebGPU/webgpuClearQuad.js +29 -11
  68. package/Engines/WebGPU/webgpuClearQuad.js.map +1 -1
  69. package/Engines/WebGPU/webgpuComputeContext.js +2 -2
  70. package/Engines/WebGPU/webgpuComputeContext.js.map +1 -1
  71. package/Engines/WebGPU/webgpuConstants.d.ts +57 -13
  72. package/Engines/WebGPU/webgpuConstants.js +62 -13
  73. package/Engines/WebGPU/webgpuConstants.js.map +1 -1
  74. package/Engines/WebGPU/webgpuHardwareTexture.d.ts +24 -4
  75. package/Engines/WebGPU/webgpuHardwareTexture.js +12 -2
  76. package/Engines/WebGPU/webgpuHardwareTexture.js.map +1 -1
  77. package/Engines/WebGPU/webgpuRenderTargetWrapper.d.ts +6 -0
  78. package/Engines/WebGPU/webgpuRenderTargetWrapper.js +12 -0
  79. package/Engines/WebGPU/webgpuRenderTargetWrapper.js.map +1 -0
  80. package/Engines/WebGPU/webgpuShaderProcessingContext.js +2 -0
  81. package/Engines/WebGPU/webgpuShaderProcessingContext.js.map +1 -1
  82. package/Engines/WebGPU/webgpuShaderProcessor.d.ts +2 -0
  83. package/Engines/WebGPU/webgpuShaderProcessor.js +23 -0
  84. package/Engines/WebGPU/webgpuShaderProcessor.js.map +1 -1
  85. package/Engines/WebGPU/webgpuShaderProcessorsGLSL.d.ts +1 -0
  86. package/Engines/WebGPU/webgpuShaderProcessorsGLSL.js +17 -1
  87. package/Engines/WebGPU/webgpuShaderProcessorsGLSL.js.map +1 -1
  88. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.d.ts +1 -2
  89. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js +11 -30
  90. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js.map +1 -1
  91. package/Engines/WebGPU/webgpuTextureHelper.d.ts +9 -2
  92. package/Engines/WebGPU/webgpuTextureHelper.js +291 -66
  93. package/Engines/WebGPU/webgpuTextureHelper.js.map +1 -1
  94. package/Engines/engine.d.ts +145 -45
  95. package/Engines/engine.js +5 -1
  96. package/Engines/engine.js.map +1 -1
  97. package/Engines/nativeEngine.d.ts +11 -0
  98. package/Engines/nativeEngine.js +78 -18
  99. package/Engines/nativeEngine.js.map +1 -1
  100. package/Engines/renderTargetWrapper.d.ts +1 -1
  101. package/Engines/renderTargetWrapper.js +1 -1
  102. package/Engines/renderTargetWrapper.js.map +1 -1
  103. package/Engines/thinEngine.js +2 -2
  104. package/Engines/thinEngine.js.map +1 -1
  105. package/Engines/webgpuEngine.d.ts +5 -13
  106. package/Engines/webgpuEngine.js +37 -75
  107. package/Engines/webgpuEngine.js.map +1 -1
  108. package/Gizmos/positionGizmo.js +1 -1
  109. package/Gizmos/positionGizmo.js.map +1 -1
  110. package/Inputs/scene.inputManager.js +6 -1
  111. package/Inputs/scene.inputManager.js.map +1 -1
  112. package/Layers/effectLayer.d.ts +4 -0
  113. package/Layers/effectLayer.js +10 -0
  114. package/Layers/effectLayer.js.map +1 -1
  115. package/Layers/glowLayer.d.ts +8 -0
  116. package/Layers/glowLayer.js +7 -3
  117. package/Layers/glowLayer.js.map +1 -1
  118. package/Layers/highlightLayer.js +2 -0
  119. package/Layers/highlightLayer.js.map +1 -1
  120. package/Lights/Shadows/shadowGenerator.js +1 -1
  121. package/Lights/Shadows/shadowGenerator.js.map +1 -1
  122. package/Lights/light.js +4 -1
  123. package/Lights/light.js.map +1 -1
  124. package/Lights/pointLight.js +1 -1
  125. package/Lights/pointLight.js.map +1 -1
  126. package/Lights/spotLight.js +1 -1
  127. package/Lights/spotLight.js.map +1 -1
  128. package/Loading/Plugins/babylonFileLoader.js +10 -7
  129. package/Loading/Plugins/babylonFileLoader.js.map +1 -1
  130. package/Materials/Node/Blocks/Fragment/index.d.ts +1 -0
  131. package/Materials/Node/Blocks/Fragment/index.js +1 -0
  132. package/Materials/Node/Blocks/Fragment/index.js.map +1 -1
  133. package/Materials/Node/Blocks/Fragment/screenSpaceBlock.js +1 -3
  134. package/Materials/Node/Blocks/Fragment/screenSpaceBlock.js.map +1 -1
  135. package/Materials/Node/Blocks/Fragment/twirlBlock.d.ts +49 -0
  136. package/Materials/Node/Blocks/Fragment/twirlBlock.js +145 -0
  137. package/Materials/Node/Blocks/Fragment/twirlBlock.js.map +1 -0
  138. package/Materials/Node/Blocks/customBlock.d.ts +31 -0
  139. package/Materials/Node/Blocks/customBlock.js +144 -0
  140. package/Materials/Node/Blocks/customBlock.js.map +1 -0
  141. package/Materials/Node/Blocks/index.d.ts +1 -0
  142. package/Materials/Node/Blocks/index.js +1 -0
  143. package/Materials/Node/Blocks/index.js.map +1 -1
  144. package/Materials/Node/nodeMaterial.js +8 -0
  145. package/Materials/Node/nodeMaterial.js.map +1 -1
  146. package/Materials/Node/nodeMaterialBlock.js +1 -1
  147. package/Materials/Node/nodeMaterialBlock.js.map +1 -1
  148. package/Materials/PBR/index.d.ts +4 -0
  149. package/Materials/PBR/index.js +4 -0
  150. package/Materials/PBR/index.js.map +1 -1
  151. package/Materials/PBR/pbrAnisotropicConfiguration.d.ts +28 -96
  152. package/Materials/PBR/pbrAnisotropicConfiguration.js +50 -111
  153. package/Materials/PBR/pbrAnisotropicConfiguration.js.map +1 -1
  154. package/Materials/PBR/pbrBRDFConfiguration.d.ts +11 -37
  155. package/Materials/PBR/pbrBRDFConfiguration.js +39 -52
  156. package/Materials/PBR/pbrBRDFConfiguration.js.map +1 -1
  157. package/Materials/PBR/pbrBaseMaterial.d.ts +15 -74
  158. package/Materials/PBR/pbrBaseMaterial.js +67 -182
  159. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  160. package/Materials/PBR/pbrBaseSimpleMaterial.js.map +1 -1
  161. package/Materials/PBR/pbrClearCoatConfiguration.d.ts +23 -98
  162. package/Materials/PBR/pbrClearCoatConfiguration.js +91 -143
  163. package/Materials/PBR/pbrClearCoatConfiguration.js.map +1 -1
  164. package/Materials/PBR/pbrSheenConfiguration.d.ts +25 -93
  165. package/Materials/PBR/pbrSheenConfiguration.js +71 -126
  166. package/Materials/PBR/pbrSheenConfiguration.js.map +1 -1
  167. package/Materials/PBR/pbrSubSurfaceConfiguration.d.ts +28 -114
  168. package/Materials/PBR/pbrSubSurfaceConfiguration.js +150 -211
  169. package/Materials/PBR/pbrSubSurfaceConfiguration.js.map +1 -1
  170. package/Materials/Textures/dynamicTexture.d.ts +3 -2
  171. package/Materials/Textures/dynamicTexture.js +5 -3
  172. package/Materials/Textures/dynamicTexture.js.map +1 -1
  173. package/Materials/Textures/multiRenderTarget.js +3 -0
  174. package/Materials/Textures/multiRenderTarget.js.map +1 -1
  175. package/Materials/Textures/renderTargetTexture.js +1 -1
  176. package/Materials/Textures/renderTargetTexture.js.map +1 -1
  177. package/Materials/Textures/thinRenderTargetTexture.js +1 -1
  178. package/Materials/Textures/thinRenderTargetTexture.js.map +1 -1
  179. package/Materials/Textures/thinTexture.d.ts +1 -2
  180. package/Materials/Textures/thinTexture.js +2 -4
  181. package/Materials/Textures/thinTexture.js.map +1 -1
  182. package/Materials/Textures/videoTexture.d.ts +1 -1
  183. package/Materials/Textures/videoTexture.js +1 -1
  184. package/Materials/Textures/videoTexture.js.map +1 -1
  185. package/Materials/effect.d.ts +6 -1
  186. package/Materials/effect.js +4 -1
  187. package/Materials/effect.js.map +1 -1
  188. package/Materials/fresnelParameters.d.ts +1 -1
  189. package/Materials/fresnelParameters.js +1 -1
  190. package/Materials/fresnelParameters.js.map +1 -1
  191. package/Materials/index.d.ts +4 -0
  192. package/Materials/index.js +4 -0
  193. package/Materials/index.js.map +1 -1
  194. package/Materials/material.d.ts +43 -2
  195. package/Materials/material.detailMapConfiguration.d.ts +29 -87
  196. package/Materials/material.detailMapConfiguration.js +50 -106
  197. package/Materials/material.detailMapConfiguration.js.map +1 -1
  198. package/Materials/material.js +99 -8
  199. package/Materials/material.js.map +1 -1
  200. package/Materials/materialDefines.d.ts +16 -0
  201. package/Materials/materialDefines.js +17 -5
  202. package/Materials/materialDefines.js.map +1 -1
  203. package/Materials/materialPluginBase.d.ts +182 -0
  204. package/Materials/materialPluginBase.js +209 -0
  205. package/Materials/materialPluginBase.js.map +1 -0
  206. package/Materials/materialPluginEvent.d.ts +98 -0
  207. package/Materials/materialPluginEvent.js +21 -0
  208. package/Materials/materialPluginEvent.js.map +1 -0
  209. package/Materials/materialPluginFactoryExport.d.ts +40 -0
  210. package/Materials/materialPluginFactoryExport.js +75 -0
  211. package/Materials/materialPluginFactoryExport.js.map +1 -0
  212. package/Materials/materialPluginManager.d.ts +90 -0
  213. package/Materials/materialPluginManager.js +323 -0
  214. package/Materials/materialPluginManager.js.map +1 -0
  215. package/Materials/shaderMaterial.d.ts +1 -1
  216. package/Materials/shaderMaterial.js +13 -1
  217. package/Materials/shaderMaterial.js.map +1 -1
  218. package/Materials/standardMaterial.d.ts +13 -10
  219. package/Materials/standardMaterial.js +45 -51
  220. package/Materials/standardMaterial.js.map +1 -1
  221. package/Materials/uniformBuffer.d.ts +7 -0
  222. package/Materials/uniformBuffer.js +22 -0
  223. package/Materials/uniformBuffer.js.map +1 -1
  224. package/Maths/math.vector.d.ts +12 -8
  225. package/Maths/math.vector.js +22 -14
  226. package/Maths/math.vector.js.map +1 -1
  227. package/Meshes/Builders/capsuleBuilder.d.ts +1 -1
  228. package/Meshes/Builders/capsuleBuilder.js +1 -1
  229. package/Meshes/Builders/capsuleBuilder.js.map +1 -1
  230. package/Meshes/abstractMesh.d.ts +1 -1
  231. package/Meshes/abstractMesh.js +24 -23
  232. package/Meshes/abstractMesh.js.map +1 -1
  233. package/Meshes/geometry.js +2 -2
  234. package/Meshes/geometry.js.map +1 -1
  235. package/Meshes/linesMesh.d.ts +1 -1
  236. package/Meshes/linesMesh.js +3 -2
  237. package/Meshes/linesMesh.js.map +1 -1
  238. package/Meshes/mesh.d.ts +12 -0
  239. package/Meshes/mesh.js +184 -115
  240. package/Meshes/mesh.js.map +1 -1
  241. package/Meshes/mesh.lts.d.ts +8 -8
  242. package/Meshes/mesh.lts.js.map +1 -1
  243. package/Meshes/mesh.vertexData.d.ts +6 -1
  244. package/Meshes/mesh.vertexData.js +295 -114
  245. package/Meshes/mesh.vertexData.js.map +1 -1
  246. package/Meshes/transformNode.js +20 -13
  247. package/Meshes/transformNode.js.map +1 -1
  248. package/Misc/PerformanceViewer/performanceViewerCollectionStrategies.d.ts +2 -1
  249. package/Misc/PerformanceViewer/performanceViewerCollectionStrategies.js +38 -33
  250. package/Misc/PerformanceViewer/performanceViewerCollectionStrategies.js.map +1 -1
  251. package/Misc/PerformanceViewer/performanceViewerCollector.d.ts +29 -4
  252. package/Misc/PerformanceViewer/performanceViewerCollector.js +36 -12
  253. package/Misc/PerformanceViewer/performanceViewerCollector.js.map +1 -1
  254. package/Misc/assetsManager.d.ts +4 -4
  255. package/Misc/assetsManager.js +2 -2
  256. package/Misc/assetsManager.js.map +1 -1
  257. package/Misc/basis.js +1 -0
  258. package/Misc/basis.js.map +1 -1
  259. package/Misc/coroutine.d.ts +41 -0
  260. package/Misc/coroutine.js +136 -0
  261. package/Misc/coroutine.js.map +1 -0
  262. package/Misc/index.d.ts +1 -0
  263. package/Misc/index.js +1 -0
  264. package/Misc/index.js.map +1 -1
  265. package/Misc/interfaces/iPerfViewer.d.ts +4 -0
  266. package/Misc/interfaces/iPerfViewer.js.map +1 -1
  267. package/Misc/observableCoroutine.d.ts +9 -10
  268. package/Misc/observableCoroutine.js +34 -39
  269. package/Misc/observableCoroutine.js.map +1 -1
  270. package/Misc/sceneSerializer.js +1 -0
  271. package/Misc/sceneSerializer.js.map +1 -1
  272. package/Particles/particleSystem.js +3 -0
  273. package/Particles/particleSystem.js.map +1 -1
  274. package/Particles/subEmitter.js +1 -0
  275. package/Particles/subEmitter.js.map +1 -1
  276. package/PostProcesses/screenSpaceReflectionPostProcess.d.ts +1 -0
  277. package/PostProcesses/screenSpaceReflectionPostProcess.js +4 -0
  278. package/PostProcesses/screenSpaceReflectionPostProcess.js.map +1 -1
  279. package/Rendering/depthPeelingRenderer.d.ts +4 -1
  280. package/Rendering/depthPeelingRenderer.js +34 -9
  281. package/Rendering/depthPeelingRenderer.js.map +1 -1
  282. package/Rendering/depthRenderer.js +1 -1
  283. package/Rendering/depthRenderer.js.map +1 -1
  284. package/Rendering/outlineRenderer.js +24 -1
  285. package/Rendering/outlineRenderer.js.map +1 -1
  286. package/Rendering/prePassRenderer.js +7 -7
  287. package/Rendering/prePassRenderer.js.map +1 -1
  288. package/Rendering/renderingGroup.js +5 -1
  289. package/Rendering/renderingGroup.js.map +1 -1
  290. package/Shaders/ShadersInclude/defaultFragmentDeclaration.js +1 -1
  291. package/Shaders/ShadersInclude/defaultFragmentDeclaration.js.map +1 -1
  292. package/Shaders/ShadersInclude/defaultUboDeclaration.js +1 -1
  293. package/Shaders/ShadersInclude/defaultUboDeclaration.js.map +1 -1
  294. package/Shaders/ShadersInclude/defaultVertexDeclaration.js +1 -1
  295. package/Shaders/ShadersInclude/defaultVertexDeclaration.js.map +1 -1
  296. package/Shaders/ShadersInclude/pbrFragmentDeclaration.js +1 -1
  297. package/Shaders/ShadersInclude/pbrFragmentDeclaration.js.map +1 -1
  298. package/Shaders/ShadersInclude/pbrUboDeclaration.js +1 -1
  299. package/Shaders/ShadersInclude/pbrUboDeclaration.js.map +1 -1
  300. package/Shaders/ShadersInclude/pbrVertexDeclaration.js +1 -1
  301. package/Shaders/ShadersInclude/pbrVertexDeclaration.js.map +1 -1
  302. package/Shaders/anaglyph.fragment.js +1 -1
  303. package/Shaders/anaglyph.fragment.js.map +1 -1
  304. package/Shaders/background.fragment.js +1 -1
  305. package/Shaders/background.fragment.js.map +1 -1
  306. package/Shaders/background.vertex.js +1 -1
  307. package/Shaders/background.vertex.js.map +1 -1
  308. package/Shaders/blackAndWhite.fragment.js +1 -1
  309. package/Shaders/blackAndWhite.fragment.js.map +1 -1
  310. package/Shaders/bloomMerge.fragment.js +1 -1
  311. package/Shaders/bloomMerge.fragment.js.map +1 -1
  312. package/Shaders/blur.fragment.js +1 -1
  313. package/Shaders/blur.fragment.js.map +1 -1
  314. package/Shaders/boundingBoxRenderer.fragment.js +1 -1
  315. package/Shaders/boundingBoxRenderer.fragment.js.map +1 -1
  316. package/Shaders/boundingBoxRenderer.vertex.js +1 -1
  317. package/Shaders/boundingBoxRenderer.vertex.js.map +1 -1
  318. package/Shaders/chromaticAberration.fragment.js +1 -1
  319. package/Shaders/chromaticAberration.fragment.js.map +1 -1
  320. package/Shaders/circleOfConfusion.fragment.js +1 -1
  321. package/Shaders/circleOfConfusion.fragment.js.map +1 -1
  322. package/Shaders/clearQuad.vertex.js +1 -1
  323. package/Shaders/clearQuad.vertex.js.map +1 -1
  324. package/Shaders/color.fragment.js +1 -1
  325. package/Shaders/color.fragment.js.map +1 -1
  326. package/Shaders/color.vertex.js +1 -1
  327. package/Shaders/color.vertex.js.map +1 -1
  328. package/Shaders/colorCorrection.fragment.js +1 -1
  329. package/Shaders/colorCorrection.fragment.js.map +1 -1
  330. package/Shaders/convolution.fragment.js +1 -1
  331. package/Shaders/convolution.fragment.js.map +1 -1
  332. package/Shaders/default.fragment.js +1 -1
  333. package/Shaders/default.fragment.js.map +1 -1
  334. package/Shaders/depth.fragment.js +1 -1
  335. package/Shaders/depth.fragment.js.map +1 -1
  336. package/Shaders/depth.vertex.js +1 -1
  337. package/Shaders/depth.vertex.js.map +1 -1
  338. package/Shaders/depthBoxBlur.fragment.js +1 -1
  339. package/Shaders/depthBoxBlur.fragment.js.map +1 -1
  340. package/Shaders/depthOfField.fragment.js +1 -1
  341. package/Shaders/depthOfField.fragment.js.map +1 -1
  342. package/Shaders/depthOfFieldMerge.fragment.js +1 -1
  343. package/Shaders/depthOfFieldMerge.fragment.js.map +1 -1
  344. package/Shaders/displayPass.fragment.js +1 -1
  345. package/Shaders/displayPass.fragment.js.map +1 -1
  346. package/Shaders/extractHighlights.fragment.js +1 -1
  347. package/Shaders/extractHighlights.fragment.js.map +1 -1
  348. package/Shaders/filter.fragment.js +1 -1
  349. package/Shaders/filter.fragment.js.map +1 -1
  350. package/Shaders/fxaa.vertex.js +1 -1
  351. package/Shaders/fxaa.vertex.js.map +1 -1
  352. package/Shaders/geometry.vertex.js +1 -1
  353. package/Shaders/geometry.vertex.js.map +1 -1
  354. package/Shaders/glowBlurPostProcess.fragment.js +1 -1
  355. package/Shaders/glowBlurPostProcess.fragment.js.map +1 -1
  356. package/Shaders/glowMapGeneration.fragment.js +1 -1
  357. package/Shaders/glowMapGeneration.fragment.js.map +1 -1
  358. package/Shaders/glowMapGeneration.vertex.js +1 -1
  359. package/Shaders/glowMapGeneration.vertex.js.map +1 -1
  360. package/Shaders/glowMapMerge.fragment.js +1 -1
  361. package/Shaders/glowMapMerge.fragment.js.map +1 -1
  362. package/Shaders/glowMapMerge.vertex.js +1 -1
  363. package/Shaders/glowMapMerge.vertex.js.map +1 -1
  364. package/Shaders/grain.fragment.js +1 -1
  365. package/Shaders/grain.fragment.js.map +1 -1
  366. package/Shaders/hdrFiltering.vertex.js +1 -1
  367. package/Shaders/hdrFiltering.vertex.js.map +1 -1
  368. package/Shaders/highlights.fragment.js +1 -1
  369. package/Shaders/highlights.fragment.js.map +1 -1
  370. package/Shaders/imageProcessing.fragment.js +1 -1
  371. package/Shaders/imageProcessing.fragment.js.map +1 -1
  372. package/Shaders/kernelBlur.fragment.js +1 -1
  373. package/Shaders/kernelBlur.fragment.js.map +1 -1
  374. package/Shaders/kernelBlur.vertex.js +1 -1
  375. package/Shaders/kernelBlur.vertex.js.map +1 -1
  376. package/Shaders/layer.fragment.js +1 -1
  377. package/Shaders/layer.fragment.js.map +1 -1
  378. package/Shaders/layer.vertex.js +1 -1
  379. package/Shaders/layer.vertex.js.map +1 -1
  380. package/Shaders/lensFlare.fragment.js +1 -1
  381. package/Shaders/lensFlare.fragment.js.map +1 -1
  382. package/Shaders/lensFlare.vertex.js +1 -1
  383. package/Shaders/lensFlare.vertex.js.map +1 -1
  384. package/Shaders/lensHighlights.fragment.js +1 -1
  385. package/Shaders/lensHighlights.fragment.js.map +1 -1
  386. package/Shaders/line.fragment.js +1 -1
  387. package/Shaders/line.fragment.js.map +1 -1
  388. package/Shaders/line.vertex.js +1 -1
  389. package/Shaders/line.vertex.js.map +1 -1
  390. package/Shaders/minmaxRedux.fragment.js +1 -1
  391. package/Shaders/minmaxRedux.fragment.js.map +1 -1
  392. package/Shaders/motionBlur.fragment.js +1 -1
  393. package/Shaders/motionBlur.fragment.js.map +1 -1
  394. package/Shaders/noise.fragment.js +1 -1
  395. package/Shaders/noise.fragment.js.map +1 -1
  396. package/Shaders/outline.fragment.d.ts +2 -0
  397. package/Shaders/outline.fragment.js +3 -1
  398. package/Shaders/outline.fragment.js.map +1 -1
  399. package/Shaders/outline.vertex.d.ts +2 -0
  400. package/Shaders/outline.vertex.js +3 -1
  401. package/Shaders/outline.vertex.js.map +1 -1
  402. package/Shaders/particles.fragment.js +1 -1
  403. package/Shaders/particles.fragment.js.map +1 -1
  404. package/Shaders/particles.vertex.js +1 -1
  405. package/Shaders/particles.vertex.js.map +1 -1
  406. package/Shaders/pass.fragment.js +1 -1
  407. package/Shaders/pass.fragment.js.map +1 -1
  408. package/Shaders/passCube.fragment.js +1 -1
  409. package/Shaders/passCube.fragment.js.map +1 -1
  410. package/Shaders/pbr.fragment.js +1 -1
  411. package/Shaders/pbr.fragment.js.map +1 -1
  412. package/Shaders/postprocess.vertex.js +1 -1
  413. package/Shaders/postprocess.vertex.js.map +1 -1
  414. package/Shaders/procedural.vertex.js +1 -1
  415. package/Shaders/procedural.vertex.js.map +1 -1
  416. package/Shaders/rgbdDecode.fragment.js +1 -1
  417. package/Shaders/rgbdDecode.fragment.js.map +1 -1
  418. package/Shaders/rgbdEncode.fragment.js +1 -1
  419. package/Shaders/rgbdEncode.fragment.js.map +1 -1
  420. package/Shaders/screenSpaceCurvature.fragment.js +1 -1
  421. package/Shaders/screenSpaceCurvature.fragment.js.map +1 -1
  422. package/Shaders/screenSpaceReflection.fragment.js +1 -1
  423. package/Shaders/screenSpaceReflection.fragment.js.map +1 -1
  424. package/Shaders/shadowMap.fragment.js +1 -1
  425. package/Shaders/shadowMap.fragment.js.map +1 -1
  426. package/Shaders/shadowMap.vertex.js +1 -1
  427. package/Shaders/shadowMap.vertex.js.map +1 -1
  428. package/Shaders/sharpen.fragment.js +1 -1
  429. package/Shaders/sharpen.fragment.js.map +1 -1
  430. package/Shaders/sprites.fragment.js +1 -1
  431. package/Shaders/sprites.fragment.js.map +1 -1
  432. package/Shaders/sprites.vertex.js +1 -1
  433. package/Shaders/sprites.vertex.js.map +1 -1
  434. package/Shaders/ssaoCombine.fragment.js +1 -1
  435. package/Shaders/ssaoCombine.fragment.js.map +1 -1
  436. package/Shaders/standard.fragment.js +1 -1
  437. package/Shaders/standard.fragment.js.map +1 -1
  438. package/Shaders/stereoscopicInterlace.fragment.js +1 -1
  439. package/Shaders/stereoscopicInterlace.fragment.js.map +1 -1
  440. package/Shaders/subSurfaceScattering.fragment.js +1 -1
  441. package/Shaders/subSurfaceScattering.fragment.js.map +1 -1
  442. package/Shaders/tonemap.fragment.js +1 -1
  443. package/Shaders/tonemap.fragment.js.map +1 -1
  444. package/Shaders/volumetricLightScattering.fragment.js +1 -1
  445. package/Shaders/volumetricLightScattering.fragment.js.map +1 -1
  446. package/Shaders/volumetricLightScatteringPass.fragment.js +1 -1
  447. package/Shaders/volumetricLightScatteringPass.fragment.js.map +1 -1
  448. package/Shaders/volumetricLightScatteringPass.vertex.js +1 -1
  449. package/Shaders/volumetricLightScatteringPass.vertex.js.map +1 -1
  450. package/Shaders/vrDistortionCorrection.fragment.js +1 -1
  451. package/Shaders/vrDistortionCorrection.fragment.js.map +1 -1
  452. package/Shaders/vrMultiviewToSingleview.fragment.js +1 -1
  453. package/Shaders/vrMultiviewToSingleview.fragment.js.map +1 -1
  454. package/ShadersWGSL/ShadersInclude/meshUboDeclaration.js +1 -1
  455. package/ShadersWGSL/ShadersInclude/meshUboDeclaration.js.map +1 -1
  456. package/ShadersWGSL/ShadersInclude/sceneUboDeclaration.js +1 -1
  457. package/ShadersWGSL/ShadersInclude/sceneUboDeclaration.js.map +1 -1
  458. package/ShadersWGSL/gpuUpdateParticles.compute.js +1 -1
  459. package/ShadersWGSL/gpuUpdateParticles.compute.js.map +1 -1
  460. package/XR/features/WebXRControllerPointerSelection.d.ts +14 -0
  461. package/XR/features/WebXRControllerPointerSelection.js +55 -21
  462. package/XR/features/WebXRControllerPointerSelection.js.map +1 -1
  463. package/XR/features/WebXRHandTracking.d.ts +2 -0
  464. package/XR/features/WebXRHandTracking.js +34 -14
  465. package/XR/features/WebXRHandTracking.js.map +1 -1
  466. package/XR/features/WebXRLayers.d.ts +78 -0
  467. package/XR/features/WebXRLayers.js +243 -0
  468. package/XR/features/WebXRLayers.js.map +1 -0
  469. package/XR/features/WebXRPlaneDetector.js +8 -12
  470. package/XR/features/WebXRPlaneDetector.js.map +1 -1
  471. package/XR/features/index.d.ts +1 -0
  472. package/XR/features/index.js +1 -0
  473. package/XR/features/index.js.map +1 -1
  474. package/XR/index.d.ts +1 -0
  475. package/XR/index.js +1 -0
  476. package/XR/index.js.map +1 -1
  477. package/XR/native/index.d.ts +2 -0
  478. package/XR/native/index.js +3 -0
  479. package/XR/native/index.js.map +1 -0
  480. package/XR/native/nativeXRFrame.d.ts +27 -0
  481. package/XR/native/nativeXRFrame.js +81 -0
  482. package/XR/native/nativeXRFrame.js.map +1 -0
  483. package/XR/native/nativeXRRenderTarget.d.ts +44 -0
  484. package/XR/native/nativeXRRenderTarget.js +81 -0
  485. package/XR/native/nativeXRRenderTarget.js.map +1 -0
  486. package/XR/webXRCamera.js +2 -10
  487. package/XR/webXRCamera.js.map +1 -1
  488. package/XR/webXRExperienceHelper.js +15 -13
  489. package/XR/webXRExperienceHelper.js.map +1 -1
  490. package/XR/webXRFeaturesManager.d.ts +4 -0
  491. package/XR/webXRFeaturesManager.js +5 -1
  492. package/XR/webXRFeaturesManager.js.map +1 -1
  493. package/XR/webXRLayerWrapper.d.ts +48 -0
  494. package/XR/webXRLayerWrapper.js +60 -0
  495. package/XR/webXRLayerWrapper.js.map +1 -0
  496. package/XR/webXRManagedOutputCanvas.d.ts +2 -1
  497. package/XR/webXRManagedOutputCanvas.js +36 -29
  498. package/XR/webXRManagedOutputCanvas.js.map +1 -1
  499. package/XR/webXRRenderTargetTextureProvider.d.ts +55 -0
  500. package/XR/webXRRenderTargetTextureProvider.js +63 -0
  501. package/XR/webXRRenderTargetTextureProvider.js.map +1 -0
  502. package/XR/webXRSessionManager.d.ts +30 -7
  503. package/XR/webXRSessionManager.js +62 -64
  504. package/XR/webXRSessionManager.js.map +1 -1
  505. package/XR/webXRTypes.d.ts +1 -1
  506. package/XR/webXRTypes.js.map +1 -1
  507. package/XR/webXRWebGLLayer.d.ts +36 -0
  508. package/XR/webXRWebGLLayer.js +69 -0
  509. package/XR/webXRWebGLLayer.js.map +1 -0
  510. package/abstractScene.d.ts +1 -1
  511. package/abstractScene.js +1 -1
  512. package/abstractScene.js.map +1 -1
  513. package/assetContainer.js +3 -0
  514. package/assetContainer.js.map +1 -1
  515. package/package.json +51 -6
  516. package/scene.d.ts +4 -0
  517. package/scene.js +4 -0
  518. package/scene.js.map +1 -1
  519. package/DeviceInput/Implementations/nativeDeviceInputWrapper.js.map +0 -1
@@ -3,7 +3,7 @@ import { Observable } from "../Misc/observable.js";
3
3
  import { WebXRSessionManager } from "./webXRSessionManager.js";
4
4
  import { WebXRCamera } from "./webXRCamera.js";
5
5
  import { WebXRState } from "./webXRTypes.js";
6
- import { WebXRFeaturesManager } from "./webXRFeaturesManager.js";
6
+ import { WebXRFeatureName, WebXRFeaturesManager } from "./webXRFeaturesManager.js";
7
7
  import { Logger } from "../Misc/logger.js";
8
8
  import { UniversalCamera } from "../Cameras/universalCamera.js";
9
9
  import { Quaternion, Vector3 } from "../Maths/math.vector.js";
@@ -94,7 +94,7 @@ var WebXRExperienceHelper = /** @class */ (function () {
94
94
  if (renderTarget === void 0) { renderTarget = this.sessionManager.getWebXRRenderTarget(); }
95
95
  if (sessionCreationOptions === void 0) { sessionCreationOptions = {}; }
96
96
  return __awaiter(this, void 0, void 0, function () {
97
- var e_1;
97
+ var baseLayer, xrRenderState, e_1;
98
98
  var _this = this;
99
99
  return __generator(this, function (_c) {
100
100
  switch (_c.label) {
@@ -116,7 +116,7 @@ var WebXRExperienceHelper = /** @class */ (function () {
116
116
  }
117
117
  _c.label = 2;
118
118
  case 2:
119
- _c.trys.push([2, 7, , 8]);
119
+ _c.trys.push([2, 6, , 7]);
120
120
  return [4 /*yield*/, this.sessionManager.initializeSessionAsync(sessionMode, sessionCreationOptions)];
121
121
  case 3:
122
122
  _c.sent();
@@ -125,14 +125,16 @@ var WebXRExperienceHelper = /** @class */ (function () {
125
125
  _c.sent();
126
126
  return [4 /*yield*/, renderTarget.initializeXRLayerAsync(this.sessionManager.session)];
127
127
  case 5:
128
- _c.sent();
129
- return [4 /*yield*/, this.sessionManager.updateRenderStateAsync({
130
- depthFar: this.camera.maxZ,
131
- depthNear: this.camera.minZ,
132
- baseLayer: renderTarget.xrLayer,
133
- })];
134
- case 6:
135
- _c.sent();
128
+ baseLayer = _c.sent();
129
+ xrRenderState = {
130
+ depthFar: this.camera.maxZ,
131
+ depthNear: this.camera.minZ,
132
+ };
133
+ // The layers feature will have already initialized the xr session's layers on session init.
134
+ if (!this.featuresManager.getEnabledFeature(WebXRFeatureName.LAYERS)) {
135
+ xrRenderState.baseLayer = baseLayer;
136
+ }
137
+ this.sessionManager.updateRenderState(xrRenderState);
136
138
  // run the render loop
137
139
  this.sessionManager.runXRRenderLoop();
138
140
  // Cache pre xr scene settings
@@ -176,13 +178,13 @@ var WebXRExperienceHelper = /** @class */ (function () {
176
178
  _this._setState(WebXRState.IN_XR);
177
179
  });
178
180
  return [2 /*return*/, this.sessionManager];
179
- case 7:
181
+ case 6:
180
182
  e_1 = _c.sent();
181
183
  console.log(e_1);
182
184
  console.log(e_1.message);
183
185
  this._setState(WebXRState.NOT_IN_XR);
184
186
  throw e_1;
185
- case 8: return [2 /*return*/];
187
+ case 7: return [2 /*return*/];
186
188
  }
187
189
  });
188
190
  });
@@ -1 +1 @@
1
- {"version":3,"file":"webXRExperienceHelper.js","sourceRoot":"","sources":["../../../sourceES6/core/XR/webXRExperienceHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import { Nullable } from \"../types\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport { IDisposable, Scene } from \"../scene\";\r\nimport { Camera } from \"../Cameras/camera\";\r\nimport { WebXRSessionManager } from \"./webXRSessionManager\";\r\nimport { WebXRCamera } from \"./webXRCamera\";\r\nimport { WebXRState, WebXRRenderTarget } from \"./webXRTypes\";\r\nimport { WebXRFeaturesManager } from \"./webXRFeaturesManager\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport { UniversalCamera } from \"../Cameras/universalCamera\";\r\nimport { Quaternion, Vector3 } from \"../Maths/math.vector\";\r\n\r\n/**\r\n * Base set of functionality needed to create an XR experience (WebXRSessionManager, Camera, StateManagement, etc.)\r\n * @see https://doc.babylonjs.com/how_to/webxr_experience_helpers\r\n */\r\nexport class WebXRExperienceHelper implements IDisposable {\r\n private _nonVRCamera: Nullable<Camera> = null;\r\n private _attachedToElement: boolean = false;\r\n private _spectatorCamera: Nullable<UniversalCamera> = null;\r\n private _originalSceneAutoClear = true;\r\n private _supported = false;\r\n private _spectatorMode = false;\r\n\r\n /**\r\n * Camera used to render xr content\r\n */\r\n public camera: WebXRCamera;\r\n /** A features manager for this xr session */\r\n public featuresManager: WebXRFeaturesManager;\r\n /**\r\n * Observers registered here will be triggered after the camera's initial transformation is set\r\n * This can be used to set a different ground level or an extra rotation.\r\n *\r\n * Note that ground level is considered to be at 0. The height defined by the XR camera will be added\r\n * to the position set after this observable is done executing.\r\n */\r\n public onInitialXRPoseSetObservable = new Observable<WebXRCamera>();\r\n /**\r\n * Fires when the state of the experience helper has changed\r\n */\r\n public onStateChangedObservable = new Observable<WebXRState>();\r\n /** Session manager used to keep track of xr session */\r\n public sessionManager: WebXRSessionManager;\r\n /**\r\n * The current state of the XR experience (eg. transitioning, in XR or not in XR)\r\n */\r\n public state: WebXRState = WebXRState.NOT_IN_XR;\r\n\r\n /**\r\n * Creates a WebXRExperienceHelper\r\n * @param scene The scene the helper should be created in\r\n */\r\n private constructor(private scene: Scene) {\r\n this.sessionManager = new WebXRSessionManager(scene);\r\n this.camera = new WebXRCamera(\"webxr\", scene, this.sessionManager);\r\n this.featuresManager = new WebXRFeaturesManager(this.sessionManager);\r\n\r\n scene.onDisposeObservable.add(() => {\r\n this.exitXRAsync();\r\n });\r\n }\r\n\r\n /**\r\n * Creates the experience helper\r\n * @param scene the scene to attach the experience helper to\r\n * @returns a promise for the experience helper\r\n */\r\n public static CreateAsync(scene: Scene): Promise<WebXRExperienceHelper> {\r\n var helper = new WebXRExperienceHelper(scene);\r\n return helper.sessionManager\r\n .initializeAsync()\r\n .then(() => {\r\n helper._supported = true;\r\n return helper;\r\n })\r\n .catch((e) => {\r\n helper._setState(WebXRState.NOT_IN_XR);\r\n helper.dispose();\r\n throw e;\r\n });\r\n }\r\n\r\n /**\r\n * Disposes of the experience helper\r\n */\r\n public dispose() {\r\n this.camera.dispose();\r\n this.onStateChangedObservable.clear();\r\n this.onInitialXRPoseSetObservable.clear();\r\n this.sessionManager.dispose();\r\n this._spectatorCamera?.dispose();\r\n if (this._nonVRCamera) {\r\n this.scene.activeCamera = this._nonVRCamera;\r\n }\r\n }\r\n\r\n /**\r\n * Enters XR mode (This must be done within a user interaction in most browsers eg. button click)\r\n * @param sessionMode options for the XR session\r\n * @param referenceSpaceType frame of reference of the XR session\r\n * @param renderTarget the output canvas that will be used to enter XR mode\r\n * @param sessionCreationOptions optional XRSessionInit object to init the session with\r\n * @returns promise that resolves after xr mode has entered\r\n */\r\n public async enterXRAsync(sessionMode: XRSessionMode, referenceSpaceType: XRReferenceSpaceType, renderTarget: WebXRRenderTarget = this.sessionManager.getWebXRRenderTarget(), sessionCreationOptions: XRSessionInit = {}): Promise<WebXRSessionManager> {\r\n if (!this._supported) {\r\n throw \"WebXR not supported in this browser or environment\";\r\n }\r\n this._setState(WebXRState.ENTERING_XR);\r\n if (referenceSpaceType !== \"viewer\" && referenceSpaceType !== \"local\") {\r\n sessionCreationOptions.optionalFeatures = sessionCreationOptions.optionalFeatures || [];\r\n sessionCreationOptions.optionalFeatures.push(referenceSpaceType);\r\n }\r\n sessionCreationOptions = await this.featuresManager._extendXRSessionInitObject(sessionCreationOptions);\r\n // we currently recommend \"unbounded\" space in AR (#7959)\r\n if (sessionMode === \"immersive-ar\" && referenceSpaceType !== \"unbounded\") {\r\n Logger.Warn(\"We recommend using 'unbounded' reference space type when using 'immersive-ar' session mode\");\r\n }\r\n // make sure that the session mode is supported\r\n try {\r\n await this.sessionManager.initializeSessionAsync(sessionMode, sessionCreationOptions);\r\n await this.sessionManager.setReferenceSpaceTypeAsync(referenceSpaceType);\r\n await renderTarget.initializeXRLayerAsync(this.sessionManager.session);\r\n await this.sessionManager.updateRenderStateAsync({\r\n depthFar: this.camera.maxZ,\r\n depthNear: this.camera.minZ,\r\n baseLayer: renderTarget.xrLayer!,\r\n });\r\n // run the render loop\r\n this.sessionManager.runXRRenderLoop();\r\n // Cache pre xr scene settings\r\n this._originalSceneAutoClear = this.scene.autoClear;\r\n this._nonVRCamera = this.scene.activeCamera;\r\n this._attachedToElement = !!(this._nonVRCamera?.inputs.attachedToElement);\r\n this._nonVRCamera?.detachControl();\r\n\r\n this.scene.activeCamera = this.camera;\r\n // do not compensate when AR session is used\r\n if (sessionMode !== \"immersive-ar\") {\r\n this._nonXRToXRCamera();\r\n } else {\r\n // Kept here, TODO - check if needed\r\n this.scene.autoClear = false;\r\n this.camera.compensateOnFirstFrame = false;\r\n }\r\n\r\n this.sessionManager.onXRSessionEnded.addOnce(() => {\r\n // Reset camera rigs output render target to ensure sessions render target is not drawn after it ends\r\n this.camera.rigCameras.forEach((c) => {\r\n c.outputRenderTarget = null;\r\n });\r\n\r\n // Restore scene settings\r\n this.scene.autoClear = this._originalSceneAutoClear;\r\n this.scene.activeCamera = this._nonVRCamera;\r\n if (this._attachedToElement && this._nonVRCamera) {\r\n this._nonVRCamera.attachControl(!!(this._nonVRCamera.inputs.noPreventDefault));\r\n }\r\n if (sessionMode !== \"immersive-ar\" && this.camera.compensateOnFirstFrame) {\r\n if ((<any>this._nonVRCamera).setPosition) {\r\n (<any>this._nonVRCamera).setPosition(this.camera.position);\r\n } else {\r\n this._nonVRCamera!.position.copyFrom(this.camera.position);\r\n }\r\n }\r\n\r\n this._setState(WebXRState.NOT_IN_XR);\r\n });\r\n\r\n // Wait until the first frame arrives before setting state to in xr\r\n this.sessionManager.onXRFrameObservable.addOnce(() => {\r\n this._setState(WebXRState.IN_XR);\r\n });\r\n return this.sessionManager;\r\n } catch (e) {\r\n console.log(e);\r\n console.log(e.message);\r\n this._setState(WebXRState.NOT_IN_XR);\r\n throw e;\r\n }\r\n }\r\n\r\n /**\r\n * Exits XR mode and returns the scene to its original state\r\n * @returns promise that resolves after xr mode has exited\r\n */\r\n public exitXRAsync() {\r\n // only exit if state is IN_XR\r\n if (this.state !== WebXRState.IN_XR) {\r\n return Promise.resolve();\r\n }\r\n this._setState(WebXRState.EXITING_XR);\r\n return this.sessionManager.exitXRAsync();\r\n }\r\n\r\n /**\r\n * Enable spectator mode for desktop VR experiences.\r\n * When spectator mode is enabled a camera will be attached to the desktop canvas and will\r\n * display the first rig camera's view on the desktop canvas.\r\n * Please note that this will degrade performance, as it requires another camera render.\r\n * It is also not recommended to enable this in devices like the quest, as it brings no benefit there.\r\n */\r\n public enableSpectatorMode(): void {\r\n if (!this._spectatorMode) {\r\n const updateSpectatorCamera = () => {\r\n if (this._spectatorCamera) {\r\n this._spectatorCamera.position.copyFrom(this.camera.rigCameras[0].globalPosition);\r\n this._spectatorCamera.rotationQuaternion.copyFrom(this.camera.rigCameras[0].absoluteRotation);\r\n }\r\n };\r\n const onStateChanged = () => {\r\n if (this.state === WebXRState.IN_XR) {\r\n this._spectatorCamera = new UniversalCamera('webxr-spectator', Vector3.Zero(), this.scene);\r\n this._spectatorCamera.rotationQuaternion = new Quaternion();\r\n this.scene.activeCameras = [this.camera, this._spectatorCamera];\r\n this.sessionManager.onXRFrameObservable.add(updateSpectatorCamera);\r\n this.scene.onAfterRenderCameraObservable.add((camera) => {\r\n if (camera === this.camera) {\r\n // reset the dimensions object for correct resizing\r\n this.scene.getEngine().framebufferDimensionsObject = null;\r\n }\r\n });\r\n } else if (this.state === WebXRState.EXITING_XR) {\r\n this.sessionManager.onXRFrameObservable.removeCallback(updateSpectatorCamera);\r\n this.scene.activeCameras = null;\r\n }\r\n };\r\n this._spectatorMode = true;\r\n this.onStateChangedObservable.add(onStateChanged);\r\n onStateChanged();\r\n }\r\n }\r\n\r\n private _nonXRToXRCamera() {\r\n this.camera.setTransformationFromNonVRCamera(this._nonVRCamera!);\r\n this.onInitialXRPoseSetObservable.notifyObservers(this.camera);\r\n }\r\n\r\n private _setState(val: WebXRState) {\r\n if (this.state === val) {\r\n return;\r\n }\r\n this.state = val;\r\n this.onStateChangedObservable.notifyObservers(this.state);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"webXRExperienceHelper.js","sourceRoot":"","sources":["../../../sourceES6/core/XR/webXRExperienceHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import { Nullable } from \"../types\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport { IDisposable, Scene } from \"../scene\";\r\nimport { Camera } from \"../Cameras/camera\";\r\nimport { WebXRSessionManager } from \"./webXRSessionManager\";\r\nimport { WebXRCamera } from \"./webXRCamera\";\r\nimport { WebXRState, WebXRRenderTarget } from \"./webXRTypes\";\r\nimport { WebXRFeatureName, WebXRFeaturesManager } from \"./webXRFeaturesManager\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport { UniversalCamera } from \"../Cameras/universalCamera\";\r\nimport { Quaternion, Vector3 } from \"../Maths/math.vector\";\r\n\r\n/**\r\n * Base set of functionality needed to create an XR experience (WebXRSessionManager, Camera, StateManagement, etc.)\r\n * @see https://doc.babylonjs.com/how_to/webxr_experience_helpers\r\n */\r\nexport class WebXRExperienceHelper implements IDisposable {\r\n private _nonVRCamera: Nullable<Camera> = null;\r\n private _attachedToElement: boolean = false;\r\n private _spectatorCamera: Nullable<UniversalCamera> = null;\r\n private _originalSceneAutoClear = true;\r\n private _supported = false;\r\n private _spectatorMode = false;\r\n\r\n /**\r\n * Camera used to render xr content\r\n */\r\n public camera: WebXRCamera;\r\n /** A features manager for this xr session */\r\n public featuresManager: WebXRFeaturesManager;\r\n /**\r\n * Observers registered here will be triggered after the camera's initial transformation is set\r\n * This can be used to set a different ground level or an extra rotation.\r\n *\r\n * Note that ground level is considered to be at 0. The height defined by the XR camera will be added\r\n * to the position set after this observable is done executing.\r\n */\r\n public onInitialXRPoseSetObservable = new Observable<WebXRCamera>();\r\n /**\r\n * Fires when the state of the experience helper has changed\r\n */\r\n public onStateChangedObservable = new Observable<WebXRState>();\r\n /** Session manager used to keep track of xr session */\r\n public sessionManager: WebXRSessionManager;\r\n /**\r\n * The current state of the XR experience (eg. transitioning, in XR or not in XR)\r\n */\r\n public state: WebXRState = WebXRState.NOT_IN_XR;\r\n\r\n /**\r\n * Creates a WebXRExperienceHelper\r\n * @param scene The scene the helper should be created in\r\n */\r\n private constructor(private scene: Scene) {\r\n this.sessionManager = new WebXRSessionManager(scene);\r\n this.camera = new WebXRCamera(\"webxr\", scene, this.sessionManager);\r\n this.featuresManager = new WebXRFeaturesManager(this.sessionManager);\r\n\r\n scene.onDisposeObservable.add(() => {\r\n this.exitXRAsync();\r\n });\r\n }\r\n\r\n /**\r\n * Creates the experience helper\r\n * @param scene the scene to attach the experience helper to\r\n * @returns a promise for the experience helper\r\n */\r\n public static CreateAsync(scene: Scene): Promise<WebXRExperienceHelper> {\r\n var helper = new WebXRExperienceHelper(scene);\r\n return helper.sessionManager\r\n .initializeAsync()\r\n .then(() => {\r\n helper._supported = true;\r\n return helper;\r\n })\r\n .catch((e) => {\r\n helper._setState(WebXRState.NOT_IN_XR);\r\n helper.dispose();\r\n throw e;\r\n });\r\n }\r\n\r\n /**\r\n * Disposes of the experience helper\r\n */\r\n public dispose() {\r\n this.camera.dispose();\r\n this.onStateChangedObservable.clear();\r\n this.onInitialXRPoseSetObservable.clear();\r\n this.sessionManager.dispose();\r\n this._spectatorCamera?.dispose();\r\n if (this._nonVRCamera) {\r\n this.scene.activeCamera = this._nonVRCamera;\r\n }\r\n }\r\n\r\n /**\r\n * Enters XR mode (This must be done within a user interaction in most browsers eg. button click)\r\n * @param sessionMode options for the XR session\r\n * @param referenceSpaceType frame of reference of the XR session\r\n * @param renderTarget the output canvas that will be used to enter XR mode\r\n * @param sessionCreationOptions optional XRSessionInit object to init the session with\r\n * @returns promise that resolves after xr mode has entered\r\n */\r\n public async enterXRAsync(sessionMode: XRSessionMode, referenceSpaceType: XRReferenceSpaceType, renderTarget: WebXRRenderTarget = this.sessionManager.getWebXRRenderTarget(), sessionCreationOptions: XRSessionInit = {}): Promise<WebXRSessionManager> {\r\n if (!this._supported) {\r\n throw \"WebXR not supported in this browser or environment\";\r\n }\r\n this._setState(WebXRState.ENTERING_XR);\r\n if (referenceSpaceType !== \"viewer\" && referenceSpaceType !== \"local\") {\r\n sessionCreationOptions.optionalFeatures = sessionCreationOptions.optionalFeatures || [];\r\n sessionCreationOptions.optionalFeatures.push(referenceSpaceType);\r\n }\r\n sessionCreationOptions = await this.featuresManager._extendXRSessionInitObject(sessionCreationOptions);\r\n // we currently recommend \"unbounded\" space in AR (#7959)\r\n if (sessionMode === \"immersive-ar\" && referenceSpaceType !== \"unbounded\") {\r\n Logger.Warn(\"We recommend using 'unbounded' reference space type when using 'immersive-ar' session mode\");\r\n }\r\n // make sure that the session mode is supported\r\n try {\r\n await this.sessionManager.initializeSessionAsync(sessionMode, sessionCreationOptions);\r\n await this.sessionManager.setReferenceSpaceTypeAsync(referenceSpaceType);\r\n const baseLayer = await renderTarget.initializeXRLayerAsync(this.sessionManager.session);\r\n\r\n const xrRenderState: XRRenderStateInit = {\r\n depthFar: this.camera.maxZ,\r\n depthNear: this.camera.minZ,\r\n };\r\n\r\n // The layers feature will have already initialized the xr session's layers on session init.\r\n if (!this.featuresManager.getEnabledFeature(WebXRFeatureName.LAYERS)) {\r\n xrRenderState.baseLayer = baseLayer;\r\n }\r\n\r\n this.sessionManager.updateRenderState(xrRenderState);\r\n // run the render loop\r\n this.sessionManager.runXRRenderLoop();\r\n // Cache pre xr scene settings\r\n this._originalSceneAutoClear = this.scene.autoClear;\r\n this._nonVRCamera = this.scene.activeCamera;\r\n this._attachedToElement = !!(this._nonVRCamera?.inputs.attachedToElement);\r\n this._nonVRCamera?.detachControl();\r\n\r\n this.scene.activeCamera = this.camera;\r\n // do not compensate when AR session is used\r\n if (sessionMode !== \"immersive-ar\") {\r\n this._nonXRToXRCamera();\r\n } else {\r\n // Kept here, TODO - check if needed\r\n this.scene.autoClear = false;\r\n this.camera.compensateOnFirstFrame = false;\r\n }\r\n\r\n this.sessionManager.onXRSessionEnded.addOnce(() => {\r\n // Reset camera rigs output render target to ensure sessions render target is not drawn after it ends\r\n this.camera.rigCameras.forEach((c) => {\r\n c.outputRenderTarget = null;\r\n });\r\n\r\n // Restore scene settings\r\n this.scene.autoClear = this._originalSceneAutoClear;\r\n this.scene.activeCamera = this._nonVRCamera;\r\n if (this._attachedToElement && this._nonVRCamera) {\r\n this._nonVRCamera.attachControl(!!(this._nonVRCamera.inputs.noPreventDefault));\r\n }\r\n if (sessionMode !== \"immersive-ar\" && this.camera.compensateOnFirstFrame) {\r\n if ((<any>this._nonVRCamera).setPosition) {\r\n (<any>this._nonVRCamera).setPosition(this.camera.position);\r\n } else {\r\n this._nonVRCamera!.position.copyFrom(this.camera.position);\r\n }\r\n }\r\n\r\n this._setState(WebXRState.NOT_IN_XR);\r\n });\r\n\r\n // Wait until the first frame arrives before setting state to in xr\r\n this.sessionManager.onXRFrameObservable.addOnce(() => {\r\n this._setState(WebXRState.IN_XR);\r\n });\r\n return this.sessionManager;\r\n } catch (e) {\r\n console.log(e);\r\n console.log(e.message);\r\n this._setState(WebXRState.NOT_IN_XR);\r\n throw e;\r\n }\r\n }\r\n\r\n /**\r\n * Exits XR mode and returns the scene to its original state\r\n * @returns promise that resolves after xr mode has exited\r\n */\r\n public exitXRAsync() {\r\n // only exit if state is IN_XR\r\n if (this.state !== WebXRState.IN_XR) {\r\n return Promise.resolve();\r\n }\r\n this._setState(WebXRState.EXITING_XR);\r\n return this.sessionManager.exitXRAsync();\r\n }\r\n\r\n /**\r\n * Enable spectator mode for desktop VR experiences.\r\n * When spectator mode is enabled a camera will be attached to the desktop canvas and will\r\n * display the first rig camera's view on the desktop canvas.\r\n * Please note that this will degrade performance, as it requires another camera render.\r\n * It is also not recommended to enable this in devices like the quest, as it brings no benefit there.\r\n */\r\n public enableSpectatorMode(): void {\r\n if (!this._spectatorMode) {\r\n const updateSpectatorCamera = () => {\r\n if (this._spectatorCamera) {\r\n this._spectatorCamera.position.copyFrom(this.camera.rigCameras[0].globalPosition);\r\n this._spectatorCamera.rotationQuaternion.copyFrom(this.camera.rigCameras[0].absoluteRotation);\r\n }\r\n };\r\n const onStateChanged = () => {\r\n if (this.state === WebXRState.IN_XR) {\r\n this._spectatorCamera = new UniversalCamera('webxr-spectator', Vector3.Zero(), this.scene);\r\n this._spectatorCamera.rotationQuaternion = new Quaternion();\r\n this.scene.activeCameras = [this.camera, this._spectatorCamera];\r\n this.sessionManager.onXRFrameObservable.add(updateSpectatorCamera);\r\n this.scene.onAfterRenderCameraObservable.add((camera) => {\r\n if (camera === this.camera) {\r\n // reset the dimensions object for correct resizing\r\n this.scene.getEngine().framebufferDimensionsObject = null;\r\n }\r\n });\r\n } else if (this.state === WebXRState.EXITING_XR) {\r\n this.sessionManager.onXRFrameObservable.removeCallback(updateSpectatorCamera);\r\n this.scene.activeCameras = null;\r\n }\r\n };\r\n this._spectatorMode = true;\r\n this.onStateChangedObservable.add(onStateChanged);\r\n onStateChanged();\r\n }\r\n }\r\n\r\n private _nonXRToXRCamera() {\r\n this.camera.setTransformationFromNonVRCamera(this._nonVRCamera!);\r\n this.onInitialXRPoseSetObservable.notifyObservers(this.camera);\r\n }\r\n\r\n private _setState(val: WebXRState) {\r\n if (this.state === val) {\r\n return;\r\n }\r\n this.state = val;\r\n this.onStateChangedObservable.notifyObservers(this.state);\r\n }\r\n}\r\n"]}
@@ -123,6 +123,10 @@ export declare class WebXRFeatureName {
123
123
  * The name of the walking locomotion feature
124
124
  */
125
125
  static readonly WALKING_LOCOMOTION = "xr-walking-locomotion";
126
+ /**
127
+ * The name of the composition layers feature
128
+ */
129
+ static readonly LAYERS = "xr-layers";
126
130
  }
127
131
  /**
128
132
  * Defining the constructor of a feature. Used to register the modules.
@@ -75,6 +75,10 @@ var WebXRFeatureName = /** @class */ (function () {
75
75
  * The name of the walking locomotion feature
76
76
  */
77
77
  WebXRFeatureName.WALKING_LOCOMOTION = "xr-walking-locomotion";
78
+ /**
79
+ * The name of the composition layers feature
80
+ */
81
+ WebXRFeatureName.LAYERS = "xr-layers";
78
82
  return WebXRFeatureName;
79
83
  }());
80
84
  export { WebXRFeatureName };
@@ -219,6 +223,7 @@ var WebXRFeaturesManager = /** @class */ (function () {
219
223
  feature.enabled = false;
220
224
  this.detachFeature(name);
221
225
  feature.featureImplementation.dispose();
226
+ delete this._features[name];
222
227
  return true;
223
228
  }
224
229
  return false;
@@ -230,7 +235,6 @@ var WebXRFeaturesManager = /** @class */ (function () {
230
235
  var _this = this;
231
236
  this.getEnabledFeatures().forEach(function (feature) {
232
237
  _this.disableFeature(feature);
233
- _this._features[feature].featureImplementation.dispose();
234
238
  });
235
239
  };
236
240
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"webXRFeaturesManager.js","sourceRoot":"","sources":["../../../sourceES6/core/XR/webXRFeaturesManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { WebXRSessionManager } from \"./webXRSessionManager\";\r\nimport { IDisposable } from \"../scene\";\r\nimport { Tools } from \"../Misc/tools\";\r\n\r\n/**\r\n * Defining the interface required for a (webxr) feature\r\n */\r\nexport interface IWebXRFeature extends IDisposable {\r\n /**\r\n * Is this feature attached\r\n */\r\n attached: boolean;\r\n /**\r\n * Should auto-attach be disabled?\r\n */\r\n disableAutoAttach: boolean;\r\n\r\n /**\r\n * Attach the feature to the session\r\n * Will usually be called by the features manager\r\n *\r\n * @param force should attachment be forced (even when already attached)\r\n * @returns true if successful.\r\n */\r\n attach(force?: boolean): boolean;\r\n /**\r\n * Detach the feature from the session\r\n * Will usually be called by the features manager\r\n *\r\n * @returns true if successful.\r\n */\r\n detach(): boolean;\r\n\r\n /**\r\n * This function will be executed during before enabling the feature and can be used to not-allow enabling it.\r\n * Note that at this point the session has NOT started, so this is purely checking if the browser supports it\r\n *\r\n * @returns whether or not the feature is compatible in this environment\r\n */\r\n isCompatible(): boolean;\r\n\r\n /**\r\n * Was this feature disposed;\r\n */\r\n isDisposed: boolean;\r\n\r\n /**\r\n * The name of the native xr feature name, if applicable (like anchor, hit-test, or hand-tracking)\r\n */\r\n xrNativeFeatureName?: string;\r\n\r\n /**\r\n * A list of (Babylon WebXR) features this feature depends on\r\n */\r\n dependsOn?: string[];\r\n\r\n /**\r\n * If this feature requires to extend the XRSessionInit object, this function will return the partial XR session init object\r\n */\r\n getXRSessionInitExtension?: () => Promise<Partial<XRSessionInit>>;\r\n}\r\n\r\n/**\r\n * A list of the currently available features without referencing them\r\n */\r\nexport class WebXRFeatureName {\r\n /**\r\n * The name of the anchor system feature\r\n */\r\n public static readonly ANCHOR_SYSTEM = \"xr-anchor-system\";\r\n /**\r\n * The name of the background remover feature\r\n */\r\n public static readonly BACKGROUND_REMOVER = \"xr-background-remover\";\r\n /**\r\n * The name of the hit test feature\r\n */\r\n public static readonly HIT_TEST = \"xr-hit-test\";\r\n /**\r\n * The name of the mesh detection feature\r\n */\r\n public static readonly MESH_DETECTION = \"xr-mesh-detection\";\r\n /**\r\n * physics impostors for xr controllers feature\r\n */\r\n public static readonly PHYSICS_CONTROLLERS = \"xr-physics-controller\";\r\n /**\r\n * The name of the plane detection feature\r\n */\r\n public static readonly PLANE_DETECTION = \"xr-plane-detection\";\r\n /**\r\n * The name of the pointer selection feature\r\n */\r\n public static readonly POINTER_SELECTION = \"xr-controller-pointer-selection\";\r\n /**\r\n * The name of the teleportation feature\r\n */\r\n public static readonly TELEPORTATION = \"xr-controller-teleportation\";\r\n /**\r\n * The name of the feature points feature.\r\n */\r\n public static readonly FEATURE_POINTS = \"xr-feature-points\";\r\n /**\r\n * The name of the hand tracking feature.\r\n */\r\n public static readonly HAND_TRACKING = \"xr-hand-tracking\";\r\n /**\r\n * The name of the image tracking feature\r\n */\r\n public static readonly IMAGE_TRACKING = \"xr-image-tracking\";\r\n /**\r\n * The name of the near interaction feature\r\n */\r\n public static readonly NEAR_INTERACTION = \"xr-near-interaction\";\r\n /**\r\n * The name of the DOM overlay feature\r\n */\r\n public static readonly DOM_OVERLAY = \"xr-dom-overlay\";\r\n /**\r\n * The name of the movement feature\r\n */\r\n public static readonly MOVEMENT = \"xr-controller-movement\";\r\n /**\r\n * The name of the light estimation feature\r\n */\r\n public static readonly LIGHT_ESTIMATION = \"xr-light-estimation\";\r\n /**\r\n * The name of the eye tracking feature\r\n */\r\n public static readonly EYE_TRACKING = \"xr-eye-tracking\";\r\n /**\r\n * The name of the walking locomotion feature\r\n */\r\n public static readonly WALKING_LOCOMOTION = \"xr-walking-locomotion\";\r\n}\r\n\r\n/**\r\n * Defining the constructor of a feature. Used to register the modules.\r\n */\r\nexport type WebXRFeatureConstructor = (xrSessionManager: WebXRSessionManager, options?: any) => () => IWebXRFeature;\r\n\r\n/**\r\n * The WebXR features manager is responsible of enabling or disabling features required for the current XR session.\r\n * It is mainly used in AR sessions.\r\n *\r\n * A feature can have a version that is defined by Babylon (and does not correspond with the webxr version).\r\n */\r\nexport class WebXRFeaturesManager implements IDisposable {\r\n private static readonly _AvailableFeatures: {\r\n [name: string]: {\r\n stable: number;\r\n latest: number;\r\n [version: number]: WebXRFeatureConstructor;\r\n };\r\n } = {};\r\n\r\n private _features: {\r\n [name: string]: {\r\n featureImplementation: IWebXRFeature;\r\n version: number;\r\n enabled: boolean;\r\n required: boolean;\r\n };\r\n } = {};\r\n\r\n /**\r\n * The key is the feature to check and the value is the feature that conflicts.\r\n */\r\n private static readonly _ConflictingFeatures: { [key: string]: string } = {\r\n [WebXRFeatureName.TELEPORTATION]: WebXRFeatureName.MOVEMENT,\r\n [WebXRFeatureName.MOVEMENT]: WebXRFeatureName.TELEPORTATION,\r\n };\r\n\r\n /**\r\n * constructs a new features manages.\r\n *\r\n * @param _xrSessionManager an instance of WebXRSessionManager\r\n */\r\n constructor(private _xrSessionManager: WebXRSessionManager) {\r\n // when session starts / initialized - attach\r\n this._xrSessionManager.onXRSessionInit.add(() => {\r\n this.getEnabledFeatures().forEach((featureName) => {\r\n const feature = this._features[featureName];\r\n if (feature.enabled && !feature.featureImplementation.attached && !feature.featureImplementation.disableAutoAttach) {\r\n this.attachFeature(featureName);\r\n }\r\n });\r\n });\r\n\r\n // when session ends - detach\r\n this._xrSessionManager.onXRSessionEnded.add(() => {\r\n this.getEnabledFeatures().forEach((featureName) => {\r\n const feature = this._features[featureName];\r\n if (feature.enabled && feature.featureImplementation.attached) {\r\n // detach, but don't disable!\r\n this.detachFeature(featureName);\r\n }\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Used to register a module. After calling this function a developer can use this feature in the scene.\r\n * Mainly used internally.\r\n *\r\n * @param featureName the name of the feature to register\r\n * @param constructorFunction the function used to construct the module\r\n * @param version the (babylon) version of the module\r\n * @param stable is that a stable version of this module\r\n */\r\n public static AddWebXRFeature(featureName: string, constructorFunction: WebXRFeatureConstructor, version: number = 1, stable: boolean = false) {\r\n this._AvailableFeatures[featureName] = this._AvailableFeatures[featureName] || { latest: version };\r\n if (version > this._AvailableFeatures[featureName].latest) {\r\n this._AvailableFeatures[featureName].latest = version;\r\n }\r\n if (stable) {\r\n this._AvailableFeatures[featureName].stable = version;\r\n }\r\n this._AvailableFeatures[featureName][version] = constructorFunction;\r\n }\r\n\r\n /**\r\n * Returns a constructor of a specific feature.\r\n *\r\n * @param featureName the name of the feature to construct\r\n * @param version the version of the feature to load\r\n * @param xrSessionManager the xrSessionManager. Used to construct the module\r\n * @param options optional options provided to the module.\r\n * @returns a function that, when called, will return a new instance of this feature\r\n */\r\n public static ConstructFeature(featureName: string, version: number = 1, xrSessionManager: WebXRSessionManager, options?: any): () => IWebXRFeature {\r\n const constructorFunction = this._AvailableFeatures[featureName][version];\r\n if (!constructorFunction) {\r\n // throw an error? return nothing?\r\n throw new Error(\"feature not found\");\r\n }\r\n\r\n return constructorFunction(xrSessionManager, options);\r\n }\r\n\r\n /**\r\n * Can be used to return the list of features currently registered\r\n *\r\n * @returns an Array of available features\r\n */\r\n public static GetAvailableFeatures() {\r\n return Object.keys(this._AvailableFeatures);\r\n }\r\n\r\n /**\r\n * Gets the versions available for a specific feature\r\n * @param featureName the name of the feature\r\n * @returns an array with the available versions\r\n */\r\n public static GetAvailableVersions(featureName: string) {\r\n return Object.keys(this._AvailableFeatures[featureName]);\r\n }\r\n\r\n /**\r\n * Return the latest unstable version of this feature\r\n * @param featureName the name of the feature to search\r\n * @returns the version number. if not found will return -1\r\n */\r\n public static GetLatestVersionOfFeature(featureName: string): number {\r\n return (this._AvailableFeatures[featureName] && this._AvailableFeatures[featureName].latest) || -1;\r\n }\r\n\r\n /**\r\n * Return the latest stable version of this feature\r\n * @param featureName the name of the feature to search\r\n * @returns the version number. if not found will return -1\r\n */\r\n public static GetStableVersionOfFeature(featureName: string): number {\r\n return (this._AvailableFeatures[featureName] && this._AvailableFeatures[featureName].stable) || -1;\r\n }\r\n\r\n /**\r\n * Attach a feature to the current session. Mainly used when session started to start the feature effect.\r\n * Can be used during a session to start a feature\r\n * @param featureName the name of feature to attach\r\n */\r\n public attachFeature(featureName: string) {\r\n const feature = this._features[featureName];\r\n if (feature && feature.enabled && !feature.featureImplementation.attached) {\r\n feature.featureImplementation.attach();\r\n }\r\n }\r\n\r\n /**\r\n * Can be used inside a session or when the session ends to detach a specific feature\r\n * @param featureName the name of the feature to detach\r\n */\r\n public detachFeature(featureName: string) {\r\n const feature = this._features[featureName];\r\n if (feature && feature.featureImplementation.attached) {\r\n feature.featureImplementation.detach();\r\n }\r\n }\r\n\r\n /**\r\n * Used to disable an already-enabled feature\r\n * The feature will be disposed and will be recreated once enabled.\r\n * @param featureName the feature to disable\r\n * @returns true if disable was successful\r\n */\r\n public disableFeature(featureName: string | { Name: string }): boolean {\r\n const name = typeof featureName === \"string\" ? featureName : featureName.Name;\r\n const feature = this._features[name];\r\n if (feature && feature.enabled) {\r\n feature.enabled = false;\r\n this.detachFeature(name);\r\n feature.featureImplementation.dispose();\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * dispose this features manager\r\n */\r\n public dispose(): void {\r\n this.getEnabledFeatures().forEach((feature) => {\r\n this.disableFeature(feature);\r\n this._features[feature].featureImplementation.dispose();\r\n });\r\n }\r\n\r\n /**\r\n * Enable a feature using its name and a version. This will enable it in the scene, and will be responsible to attach it when the session starts.\r\n * If used twice, the old version will be disposed and a new one will be constructed. This way you can re-enable with different configuration.\r\n *\r\n * @param featureName the name of the feature to load or the class of the feature\r\n * @param version optional version to load. if not provided the latest version will be enabled\r\n * @param moduleOptions options provided to the module. Ses the module documentation / constructor\r\n * @param attachIfPossible if set to true (default) the feature will be automatically attached, if it is currently possible\r\n * @param required is this feature required to the app. If set to true the session init will fail if the feature is not available.\r\n * @returns a new constructed feature or throws an error if feature not found or conflicts with another enabled feature.\r\n */\r\n public enableFeature(featureName: string | { Name: string }, version: number | string = \"latest\", moduleOptions: any = {}, attachIfPossible: boolean = true, required: boolean = true): IWebXRFeature {\r\n const name = typeof featureName === \"string\" ? featureName : featureName.Name;\r\n let versionToLoad = 0;\r\n if (typeof version === \"string\") {\r\n if (!version) {\r\n throw new Error(`Error in provided version - ${name} (${version})`);\r\n }\r\n if (version === \"stable\") {\r\n versionToLoad = WebXRFeaturesManager.GetStableVersionOfFeature(name);\r\n } else if (version === \"latest\") {\r\n versionToLoad = WebXRFeaturesManager.GetLatestVersionOfFeature(name);\r\n } else {\r\n // try loading the number the string represents\r\n versionToLoad = +version;\r\n }\r\n if (versionToLoad === -1 || isNaN(versionToLoad)) {\r\n throw new Error(`feature not found - ${name} (${version})`);\r\n }\r\n } else {\r\n versionToLoad = version;\r\n }\r\n\r\n // check if there is a feature conflict\r\n const conflictingFeature = WebXRFeaturesManager._ConflictingFeatures[name];\r\n if (conflictingFeature !== undefined && this.getEnabledFeatures().indexOf(conflictingFeature) !== -1) {\r\n throw new Error(`Feature ${name} cannot be enabled while ${conflictingFeature} is enabled.`);\r\n }\r\n\r\n // check if already initialized\r\n const feature = this._features[name];\r\n const constructFunction = WebXRFeaturesManager.ConstructFeature(name, versionToLoad, this._xrSessionManager, moduleOptions);\r\n if (!constructFunction) {\r\n // report error?\r\n throw new Error(`feature not found - ${name}`);\r\n }\r\n\r\n /* If the feature is already enabled, detach and dispose it, and create a new one */\r\n if (feature) {\r\n this.disableFeature(name);\r\n }\r\n\r\n const constructed = constructFunction();\r\n if (constructed.dependsOn) {\r\n const dependentsFound = constructed.dependsOn.every((featureName) => !!this._features[featureName]);\r\n if (!dependentsFound) {\r\n throw new Error(`Dependant features missing. Make sure the following features are enabled - ${constructed.dependsOn.join(\", \")}`);\r\n }\r\n }\r\n if (constructed.isCompatible()) {\r\n this._features[name] = {\r\n featureImplementation: constructed,\r\n enabled: true,\r\n version: versionToLoad,\r\n required,\r\n };\r\n\r\n if (attachIfPossible) {\r\n // if session started already, request and enable\r\n if (this._xrSessionManager.session && !this._features[name].featureImplementation.attached) {\r\n // enable feature\r\n this.attachFeature(name);\r\n }\r\n } else {\r\n // disable auto-attach when session starts\r\n this._features[name].featureImplementation.disableAutoAttach = true;\r\n }\r\n\r\n return this._features[name].featureImplementation;\r\n } else {\r\n if (required) {\r\n throw new Error(\"required feature not compatible\");\r\n } else {\r\n Tools.Warn(`Feature ${name} not compatible with the current environment/browser and was not enabled.`);\r\n return constructed;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * get the implementation of an enabled feature.\r\n * @param featureName the name of the feature to load\r\n * @returns the feature class, if found\r\n */\r\n public getEnabledFeature(featureName: string): IWebXRFeature {\r\n return this._features[featureName] && this._features[featureName].featureImplementation;\r\n }\r\n\r\n /**\r\n * Get the list of enabled features\r\n * @returns an array of enabled features\r\n */\r\n public getEnabledFeatures() {\r\n return Object.keys(this._features);\r\n }\r\n\r\n /**\r\n * This function will extend the session creation configuration object with enabled features.\r\n * If, for example, the anchors feature is enabled, it will be automatically added to the optional or required features list,\r\n * according to the defined \"required\" variable, provided during enableFeature call\r\n * @param xrSessionInit the xr Session init object to extend\r\n *\r\n * @returns an extended XRSessionInit object\r\n */\r\n public async _extendXRSessionInitObject(xrSessionInit: XRSessionInit): Promise<XRSessionInit> {\r\n const enabledFeatures = this.getEnabledFeatures();\r\n for (const featureName of enabledFeatures) {\r\n const feature = this._features[featureName];\r\n const nativeName = feature.featureImplementation.xrNativeFeatureName;\r\n if (nativeName) {\r\n if (feature.required) {\r\n xrSessionInit.requiredFeatures = xrSessionInit.requiredFeatures || [];\r\n if (xrSessionInit.requiredFeatures.indexOf(nativeName) === -1) {\r\n xrSessionInit.requiredFeatures.push(nativeName);\r\n }\r\n } else {\r\n xrSessionInit.optionalFeatures = xrSessionInit.optionalFeatures || [];\r\n if (xrSessionInit.optionalFeatures.indexOf(nativeName) === -1) {\r\n xrSessionInit.optionalFeatures.push(nativeName);\r\n }\r\n }\r\n }\r\n if (feature.featureImplementation.getXRSessionInitExtension) {\r\n const extended = await feature.featureImplementation.getXRSessionInitExtension();\r\n xrSessionInit = {\r\n ...xrSessionInit,\r\n ...extended,\r\n };\r\n }\r\n }\r\n return xrSessionInit;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"webXRFeaturesManager.js","sourceRoot":"","sources":["../../../sourceES6/core/XR/webXRFeaturesManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { WebXRSessionManager } from \"./webXRSessionManager\";\r\nimport { IDisposable } from \"../scene\";\r\nimport { Tools } from \"../Misc/tools\";\r\n\r\n/**\r\n * Defining the interface required for a (webxr) feature\r\n */\r\nexport interface IWebXRFeature extends IDisposable {\r\n /**\r\n * Is this feature attached\r\n */\r\n attached: boolean;\r\n /**\r\n * Should auto-attach be disabled?\r\n */\r\n disableAutoAttach: boolean;\r\n\r\n /**\r\n * Attach the feature to the session\r\n * Will usually be called by the features manager\r\n *\r\n * @param force should attachment be forced (even when already attached)\r\n * @returns true if successful.\r\n */\r\n attach(force?: boolean): boolean;\r\n /**\r\n * Detach the feature from the session\r\n * Will usually be called by the features manager\r\n *\r\n * @returns true if successful.\r\n */\r\n detach(): boolean;\r\n\r\n /**\r\n * This function will be executed during before enabling the feature and can be used to not-allow enabling it.\r\n * Note that at this point the session has NOT started, so this is purely checking if the browser supports it\r\n *\r\n * @returns whether or not the feature is compatible in this environment\r\n */\r\n isCompatible(): boolean;\r\n\r\n /**\r\n * Was this feature disposed;\r\n */\r\n isDisposed: boolean;\r\n\r\n /**\r\n * The name of the native xr feature name, if applicable (like anchor, hit-test, or hand-tracking)\r\n */\r\n xrNativeFeatureName?: string;\r\n\r\n /**\r\n * A list of (Babylon WebXR) features this feature depends on\r\n */\r\n dependsOn?: string[];\r\n\r\n /**\r\n * If this feature requires to extend the XRSessionInit object, this function will return the partial XR session init object\r\n */\r\n getXRSessionInitExtension?: () => Promise<Partial<XRSessionInit>>;\r\n}\r\n\r\n/**\r\n * A list of the currently available features without referencing them\r\n */\r\nexport class WebXRFeatureName {\r\n /**\r\n * The name of the anchor system feature\r\n */\r\n public static readonly ANCHOR_SYSTEM = \"xr-anchor-system\";\r\n /**\r\n * The name of the background remover feature\r\n */\r\n public static readonly BACKGROUND_REMOVER = \"xr-background-remover\";\r\n /**\r\n * The name of the hit test feature\r\n */\r\n public static readonly HIT_TEST = \"xr-hit-test\";\r\n /**\r\n * The name of the mesh detection feature\r\n */\r\n public static readonly MESH_DETECTION = \"xr-mesh-detection\";\r\n /**\r\n * physics impostors for xr controllers feature\r\n */\r\n public static readonly PHYSICS_CONTROLLERS = \"xr-physics-controller\";\r\n /**\r\n * The name of the plane detection feature\r\n */\r\n public static readonly PLANE_DETECTION = \"xr-plane-detection\";\r\n /**\r\n * The name of the pointer selection feature\r\n */\r\n public static readonly POINTER_SELECTION = \"xr-controller-pointer-selection\";\r\n /**\r\n * The name of the teleportation feature\r\n */\r\n public static readonly TELEPORTATION = \"xr-controller-teleportation\";\r\n /**\r\n * The name of the feature points feature.\r\n */\r\n public static readonly FEATURE_POINTS = \"xr-feature-points\";\r\n /**\r\n * The name of the hand tracking feature.\r\n */\r\n public static readonly HAND_TRACKING = \"xr-hand-tracking\";\r\n /**\r\n * The name of the image tracking feature\r\n */\r\n public static readonly IMAGE_TRACKING = \"xr-image-tracking\";\r\n /**\r\n * The name of the near interaction feature\r\n */\r\n public static readonly NEAR_INTERACTION = \"xr-near-interaction\";\r\n /**\r\n * The name of the DOM overlay feature\r\n */\r\n public static readonly DOM_OVERLAY = \"xr-dom-overlay\";\r\n /**\r\n * The name of the movement feature\r\n */\r\n public static readonly MOVEMENT = \"xr-controller-movement\";\r\n /**\r\n * The name of the light estimation feature\r\n */\r\n public static readonly LIGHT_ESTIMATION = \"xr-light-estimation\";\r\n /**\r\n * The name of the eye tracking feature\r\n */\r\n public static readonly EYE_TRACKING = \"xr-eye-tracking\";\r\n /**\r\n * The name of the walking locomotion feature\r\n */\r\n public static readonly WALKING_LOCOMOTION = \"xr-walking-locomotion\";\r\n /**\r\n * The name of the composition layers feature\r\n */\r\n public static readonly LAYERS = \"xr-layers\";\r\n}\r\n\r\n/**\r\n * Defining the constructor of a feature. Used to register the modules.\r\n */\r\nexport type WebXRFeatureConstructor = (xrSessionManager: WebXRSessionManager, options?: any) => () => IWebXRFeature;\r\n\r\n/**\r\n * The WebXR features manager is responsible of enabling or disabling features required for the current XR session.\r\n * It is mainly used in AR sessions.\r\n *\r\n * A feature can have a version that is defined by Babylon (and does not correspond with the webxr version).\r\n */\r\nexport class WebXRFeaturesManager implements IDisposable {\r\n private static readonly _AvailableFeatures: {\r\n [name: string]: {\r\n stable: number;\r\n latest: number;\r\n [version: number]: WebXRFeatureConstructor;\r\n };\r\n } = {};\r\n\r\n private _features: {\r\n [name: string]: {\r\n featureImplementation: IWebXRFeature;\r\n version: number;\r\n enabled: boolean;\r\n required: boolean;\r\n };\r\n } = {};\r\n\r\n /**\r\n * The key is the feature to check and the value is the feature that conflicts.\r\n */\r\n private static readonly _ConflictingFeatures: { [key: string]: string } = {\r\n [WebXRFeatureName.TELEPORTATION]: WebXRFeatureName.MOVEMENT,\r\n [WebXRFeatureName.MOVEMENT]: WebXRFeatureName.TELEPORTATION,\r\n };\r\n\r\n /**\r\n * constructs a new features manages.\r\n *\r\n * @param _xrSessionManager an instance of WebXRSessionManager\r\n */\r\n constructor(private _xrSessionManager: WebXRSessionManager) {\r\n // when session starts / initialized - attach\r\n this._xrSessionManager.onXRSessionInit.add(() => {\r\n this.getEnabledFeatures().forEach((featureName) => {\r\n const feature = this._features[featureName];\r\n if (feature.enabled && !feature.featureImplementation.attached && !feature.featureImplementation.disableAutoAttach) {\r\n this.attachFeature(featureName);\r\n }\r\n });\r\n });\r\n\r\n // when session ends - detach\r\n this._xrSessionManager.onXRSessionEnded.add(() => {\r\n this.getEnabledFeatures().forEach((featureName) => {\r\n const feature = this._features[featureName];\r\n if (feature.enabled && feature.featureImplementation.attached) {\r\n // detach, but don't disable!\r\n this.detachFeature(featureName);\r\n }\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Used to register a module. After calling this function a developer can use this feature in the scene.\r\n * Mainly used internally.\r\n *\r\n * @param featureName the name of the feature to register\r\n * @param constructorFunction the function used to construct the module\r\n * @param version the (babylon) version of the module\r\n * @param stable is that a stable version of this module\r\n */\r\n public static AddWebXRFeature(featureName: string, constructorFunction: WebXRFeatureConstructor, version: number = 1, stable: boolean = false) {\r\n this._AvailableFeatures[featureName] = this._AvailableFeatures[featureName] || { latest: version };\r\n if (version > this._AvailableFeatures[featureName].latest) {\r\n this._AvailableFeatures[featureName].latest = version;\r\n }\r\n if (stable) {\r\n this._AvailableFeatures[featureName].stable = version;\r\n }\r\n this._AvailableFeatures[featureName][version] = constructorFunction;\r\n }\r\n\r\n /**\r\n * Returns a constructor of a specific feature.\r\n *\r\n * @param featureName the name of the feature to construct\r\n * @param version the version of the feature to load\r\n * @param xrSessionManager the xrSessionManager. Used to construct the module\r\n * @param options optional options provided to the module.\r\n * @returns a function that, when called, will return a new instance of this feature\r\n */\r\n public static ConstructFeature(featureName: string, version: number = 1, xrSessionManager: WebXRSessionManager, options?: any): () => IWebXRFeature {\r\n const constructorFunction = this._AvailableFeatures[featureName][version];\r\n if (!constructorFunction) {\r\n // throw an error? return nothing?\r\n throw new Error(\"feature not found\");\r\n }\r\n\r\n return constructorFunction(xrSessionManager, options);\r\n }\r\n\r\n /**\r\n * Can be used to return the list of features currently registered\r\n *\r\n * @returns an Array of available features\r\n */\r\n public static GetAvailableFeatures() {\r\n return Object.keys(this._AvailableFeatures);\r\n }\r\n\r\n /**\r\n * Gets the versions available for a specific feature\r\n * @param featureName the name of the feature\r\n * @returns an array with the available versions\r\n */\r\n public static GetAvailableVersions(featureName: string) {\r\n return Object.keys(this._AvailableFeatures[featureName]);\r\n }\r\n\r\n /**\r\n * Return the latest unstable version of this feature\r\n * @param featureName the name of the feature to search\r\n * @returns the version number. if not found will return -1\r\n */\r\n public static GetLatestVersionOfFeature(featureName: string): number {\r\n return (this._AvailableFeatures[featureName] && this._AvailableFeatures[featureName].latest) || -1;\r\n }\r\n\r\n /**\r\n * Return the latest stable version of this feature\r\n * @param featureName the name of the feature to search\r\n * @returns the version number. if not found will return -1\r\n */\r\n public static GetStableVersionOfFeature(featureName: string): number {\r\n return (this._AvailableFeatures[featureName] && this._AvailableFeatures[featureName].stable) || -1;\r\n }\r\n\r\n /**\r\n * Attach a feature to the current session. Mainly used when session started to start the feature effect.\r\n * Can be used during a session to start a feature\r\n * @param featureName the name of feature to attach\r\n */\r\n public attachFeature(featureName: string) {\r\n const feature = this._features[featureName];\r\n if (feature && feature.enabled && !feature.featureImplementation.attached) {\r\n feature.featureImplementation.attach();\r\n }\r\n }\r\n\r\n /**\r\n * Can be used inside a session or when the session ends to detach a specific feature\r\n * @param featureName the name of the feature to detach\r\n */\r\n public detachFeature(featureName: string) {\r\n const feature = this._features[featureName];\r\n if (feature && feature.featureImplementation.attached) {\r\n feature.featureImplementation.detach();\r\n }\r\n }\r\n\r\n /**\r\n * Used to disable an already-enabled feature\r\n * The feature will be disposed and will be recreated once enabled.\r\n * @param featureName the feature to disable\r\n * @returns true if disable was successful\r\n */\r\n public disableFeature(featureName: string | { Name: string }): boolean {\r\n const name = typeof featureName === \"string\" ? featureName : featureName.Name;\r\n const feature = this._features[name];\r\n if (feature && feature.enabled) {\r\n feature.enabled = false;\r\n this.detachFeature(name);\r\n feature.featureImplementation.dispose();\r\n delete this._features[name];\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * dispose this features manager\r\n */\r\n public dispose(): void {\r\n this.getEnabledFeatures().forEach((feature) => {\r\n this.disableFeature(feature);\r\n });\r\n }\r\n\r\n /**\r\n * Enable a feature using its name and a version. This will enable it in the scene, and will be responsible to attach it when the session starts.\r\n * If used twice, the old version will be disposed and a new one will be constructed. This way you can re-enable with different configuration.\r\n *\r\n * @param featureName the name of the feature to load or the class of the feature\r\n * @param version optional version to load. if not provided the latest version will be enabled\r\n * @param moduleOptions options provided to the module. Ses the module documentation / constructor\r\n * @param attachIfPossible if set to true (default) the feature will be automatically attached, if it is currently possible\r\n * @param required is this feature required to the app. If set to true the session init will fail if the feature is not available.\r\n * @returns a new constructed feature or throws an error if feature not found or conflicts with another enabled feature.\r\n */\r\n public enableFeature(featureName: string | { Name: string }, version: number | string = \"latest\", moduleOptions: any = {}, attachIfPossible: boolean = true, required: boolean = true): IWebXRFeature {\r\n const name = typeof featureName === \"string\" ? featureName : featureName.Name;\r\n let versionToLoad = 0;\r\n if (typeof version === \"string\") {\r\n if (!version) {\r\n throw new Error(`Error in provided version - ${name} (${version})`);\r\n }\r\n if (version === \"stable\") {\r\n versionToLoad = WebXRFeaturesManager.GetStableVersionOfFeature(name);\r\n } else if (version === \"latest\") {\r\n versionToLoad = WebXRFeaturesManager.GetLatestVersionOfFeature(name);\r\n } else {\r\n // try loading the number the string represents\r\n versionToLoad = +version;\r\n }\r\n if (versionToLoad === -1 || isNaN(versionToLoad)) {\r\n throw new Error(`feature not found - ${name} (${version})`);\r\n }\r\n } else {\r\n versionToLoad = version;\r\n }\r\n\r\n // check if there is a feature conflict\r\n const conflictingFeature = WebXRFeaturesManager._ConflictingFeatures[name];\r\n if (conflictingFeature !== undefined && this.getEnabledFeatures().indexOf(conflictingFeature) !== -1) {\r\n throw new Error(`Feature ${name} cannot be enabled while ${conflictingFeature} is enabled.`);\r\n }\r\n\r\n // check if already initialized\r\n const feature = this._features[name];\r\n const constructFunction = WebXRFeaturesManager.ConstructFeature(name, versionToLoad, this._xrSessionManager, moduleOptions);\r\n if (!constructFunction) {\r\n // report error?\r\n throw new Error(`feature not found - ${name}`);\r\n }\r\n\r\n /* If the feature is already enabled, detach and dispose it, and create a new one */\r\n if (feature) {\r\n this.disableFeature(name);\r\n }\r\n\r\n const constructed = constructFunction();\r\n if (constructed.dependsOn) {\r\n const dependentsFound = constructed.dependsOn.every((featureName) => !!this._features[featureName]);\r\n if (!dependentsFound) {\r\n throw new Error(`Dependant features missing. Make sure the following features are enabled - ${constructed.dependsOn.join(\", \")}`);\r\n }\r\n }\r\n if (constructed.isCompatible()) {\r\n this._features[name] = {\r\n featureImplementation: constructed,\r\n enabled: true,\r\n version: versionToLoad,\r\n required,\r\n };\r\n\r\n if (attachIfPossible) {\r\n // if session started already, request and enable\r\n if (this._xrSessionManager.session && !this._features[name].featureImplementation.attached) {\r\n // enable feature\r\n this.attachFeature(name);\r\n }\r\n } else {\r\n // disable auto-attach when session starts\r\n this._features[name].featureImplementation.disableAutoAttach = true;\r\n }\r\n\r\n return this._features[name].featureImplementation;\r\n } else {\r\n if (required) {\r\n throw new Error(\"required feature not compatible\");\r\n } else {\r\n Tools.Warn(`Feature ${name} not compatible with the current environment/browser and was not enabled.`);\r\n return constructed;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * get the implementation of an enabled feature.\r\n * @param featureName the name of the feature to load\r\n * @returns the feature class, if found\r\n */\r\n public getEnabledFeature(featureName: string): IWebXRFeature {\r\n return this._features[featureName] && this._features[featureName].featureImplementation;\r\n }\r\n\r\n /**\r\n * Get the list of enabled features\r\n * @returns an array of enabled features\r\n */\r\n public getEnabledFeatures() {\r\n return Object.keys(this._features);\r\n }\r\n\r\n /**\r\n * This function will extend the session creation configuration object with enabled features.\r\n * If, for example, the anchors feature is enabled, it will be automatically added to the optional or required features list,\r\n * according to the defined \"required\" variable, provided during enableFeature call\r\n * @param xrSessionInit the xr Session init object to extend\r\n *\r\n * @returns an extended XRSessionInit object\r\n */\r\n public async _extendXRSessionInitObject(xrSessionInit: XRSessionInit): Promise<XRSessionInit> {\r\n const enabledFeatures = this.getEnabledFeatures();\r\n for (const featureName of enabledFeatures) {\r\n const feature = this._features[featureName];\r\n const nativeName = feature.featureImplementation.xrNativeFeatureName;\r\n if (nativeName) {\r\n if (feature.required) {\r\n xrSessionInit.requiredFeatures = xrSessionInit.requiredFeatures || [];\r\n if (xrSessionInit.requiredFeatures.indexOf(nativeName) === -1) {\r\n xrSessionInit.requiredFeatures.push(nativeName);\r\n }\r\n } else {\r\n xrSessionInit.optionalFeatures = xrSessionInit.optionalFeatures || [];\r\n if (xrSessionInit.optionalFeatures.indexOf(nativeName) === -1) {\r\n xrSessionInit.optionalFeatures.push(nativeName);\r\n }\r\n }\r\n }\r\n if (feature.featureImplementation.getXRSessionInitExtension) {\r\n const extended = await feature.featureImplementation.getXRSessionInitExtension();\r\n xrSessionInit = {\r\n ...xrSessionInit,\r\n ...extended,\r\n };\r\n }\r\n }\r\n return xrSessionInit;\r\n }\r\n}\r\n"]}
@@ -0,0 +1,48 @@
1
+ import { Nullable } from "../types";
2
+ import { WebXRLayerRenderTargetTextureProvider } from "./webXRRenderTargetTextureProvider";
3
+ import { WebXRSessionManager } from "./webXRSessionManager";
4
+ /** Covers all supported subclasses of WebXR's XRCompositionLayer */
5
+ export declare type WebXRCompositionLayerType = 'XRProjectionLayer';
6
+ /** Covers all supported subclasses of WebXR's XRLayer */
7
+ export declare type WebXRLayerType = 'XRWebGLLayer' | WebXRCompositionLayerType;
8
+ /**
9
+ * Wrapper over subclasses of XRLayer.
10
+ * @hidden
11
+ */
12
+ export declare class WebXRLayerWrapper {
13
+ /** The width of the layer's framebuffer. */
14
+ getWidth: () => number;
15
+ /** The height of the layer's framebuffer. */
16
+ getHeight: () => number;
17
+ /** The XR layer that this WebXRLayerWrapper wraps. */
18
+ readonly layer: XRLayer;
19
+ /** The type of XR layer that is being wrapped. */
20
+ readonly layerType: WebXRLayerType;
21
+ /** Create a render target provider for the wrapped layer. */
22
+ createRenderTargetTextureProvider: (xrSessionManager: WebXRSessionManager) => WebXRLayerRenderTargetTextureProvider;
23
+ /**
24
+ * Check if fixed foveation is supported on this device
25
+ */
26
+ get isFixedFoveationSupported(): boolean;
27
+ /**
28
+ * Get the fixed foveation currently set, as specified by the webxr specs
29
+ * If this returns null, then fixed foveation is not supported
30
+ */
31
+ get fixedFoveation(): Nullable<number>;
32
+ /**
33
+ * Set the fixed foveation to the specified value, as specified by the webxr specs
34
+ * This value will be normalized to be between 0 and 1, 1 being max foveation, 0 being no foveation
35
+ */
36
+ set fixedFoveation(value: Nullable<number>);
37
+ protected constructor(
38
+ /** The width of the layer's framebuffer. */
39
+ getWidth: () => number,
40
+ /** The height of the layer's framebuffer. */
41
+ getHeight: () => number,
42
+ /** The XR layer that this WebXRLayerWrapper wraps. */
43
+ layer: XRLayer,
44
+ /** The type of XR layer that is being wrapped. */
45
+ layerType: WebXRLayerType,
46
+ /** Create a render target provider for the wrapped layer. */
47
+ createRenderTargetTextureProvider: (xrSessionManager: WebXRSessionManager) => WebXRLayerRenderTargetTextureProvider);
48
+ }
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Wrapper over subclasses of XRLayer.
3
+ * @hidden
4
+ */
5
+ var WebXRLayerWrapper = /** @class */ (function () {
6
+ function WebXRLayerWrapper(
7
+ /** The width of the layer's framebuffer. */
8
+ getWidth,
9
+ /** The height of the layer's framebuffer. */
10
+ getHeight,
11
+ /** The XR layer that this WebXRLayerWrapper wraps. */
12
+ layer,
13
+ /** The type of XR layer that is being wrapped. */
14
+ layerType,
15
+ /** Create a render target provider for the wrapped layer. */
16
+ createRenderTargetTextureProvider) {
17
+ this.getWidth = getWidth;
18
+ this.getHeight = getHeight;
19
+ this.layer = layer;
20
+ this.layerType = layerType;
21
+ this.createRenderTargetTextureProvider = createRenderTargetTextureProvider;
22
+ }
23
+ Object.defineProperty(WebXRLayerWrapper.prototype, "isFixedFoveationSupported", {
24
+ /**
25
+ * Check if fixed foveation is supported on this device
26
+ */
27
+ get: function () {
28
+ return this.layerType == 'XRWebGLLayer' && (typeof this.layer.fixedFoveation == 'number');
29
+ },
30
+ enumerable: false,
31
+ configurable: true
32
+ });
33
+ Object.defineProperty(WebXRLayerWrapper.prototype, "fixedFoveation", {
34
+ /**
35
+ * Get the fixed foveation currently set, as specified by the webxr specs
36
+ * If this returns null, then fixed foveation is not supported
37
+ */
38
+ get: function () {
39
+ if (this.isFixedFoveationSupported) {
40
+ return this.layer.fixedFoveation;
41
+ }
42
+ return null;
43
+ },
44
+ /**
45
+ * Set the fixed foveation to the specified value, as specified by the webxr specs
46
+ * This value will be normalized to be between 0 and 1, 1 being max foveation, 0 being no foveation
47
+ */
48
+ set: function (value) {
49
+ if (this.isFixedFoveationSupported) {
50
+ var val = Math.max(0, Math.min(1, value || 0));
51
+ this.layer.fixedFoveation = val;
52
+ }
53
+ },
54
+ enumerable: false,
55
+ configurable: true
56
+ });
57
+ return WebXRLayerWrapper;
58
+ }());
59
+ export { WebXRLayerWrapper };
60
+ //# sourceMappingURL=webXRLayerWrapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webXRLayerWrapper.js","sourceRoot":"","sources":["../../../sourceES6/core/XR/webXRLayerWrapper.ts"],"names":[],"mappings":"AAWA;;;GAGG;AACF;IA8BG;IACI,4CAA4C;IACrC,QAAsB;IAC7B,6CAA6C;IACtC,SAAuB;IAC9B,sDAAsD;IACtC,KAAc;IAC9B,kDAAkD;IAClC,SAAyB;IACzC,6DAA6D;IACtD,iCAAmH;QARnH,aAAQ,GAAR,QAAQ,CAAc;QAEtB,cAAS,GAAT,SAAS,CAAc;QAEd,UAAK,GAAL,KAAK,CAAS;QAEd,cAAS,GAAT,SAAS,CAAgB;QAElC,sCAAiC,GAAjC,iCAAiC,CAAkF;IAAG,CAAC;IApClI,sBAAW,wDAAyB;QAHpC;;WAEG;aACH;YACI,OAAO,IAAI,CAAC,SAAS,IAAI,cAAc,IAAI,CAAC,OAAQ,IAAI,CAAC,KAAsB,CAAC,cAAc,IAAI,QAAQ,CAAC,CAAC;QAChH,CAAC;;;OAAA;IAMD,sBAAW,6CAAc;QAJzB;;;WAGG;aACH;YACI,IAAI,IAAI,CAAC,yBAAyB,EAAE;gBAChC,OAAQ,IAAI,CAAC,KAAsB,CAAC,cAAe,CAAC;aACvD;YACD,OAAO,IAAI,CAAC;QAChB,CAAC;QAED;;;WAGG;aACH,UAA0B,KAAuB;YAC7C,IAAI,IAAI,CAAC,yBAAyB,EAAE;gBAChC,IAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC;gBAChD,IAAI,CAAC,KAAsB,CAAC,cAAc,GAAG,GAAG,CAAC;aACrD;QACL,CAAC;;;OAXA;IAwBL,wBAAC;AAAD,CAAC,AAzCA,IAyCA","sourcesContent":["import { Nullable } from \"../types\";\r\nimport { WebXRLayerRenderTargetTextureProvider } from \"./webXRRenderTargetTextureProvider\";\r\nimport { WebXRSessionManager } from \"./webXRSessionManager\";\r\n\r\n/** Covers all supported subclasses of WebXR's XRCompositionLayer */\r\n// TODO (rgerd): Extend for all other subclasses of XRCompositionLayer.\r\nexport type WebXRCompositionLayerType = 'XRProjectionLayer';\r\n\r\n/** Covers all supported subclasses of WebXR's XRLayer */\r\nexport type WebXRLayerType = 'XRWebGLLayer' | WebXRCompositionLayerType;\r\n\r\n/**\r\n * Wrapper over subclasses of XRLayer.\r\n * @hidden\r\n */\r\n export class WebXRLayerWrapper {\r\n /**\r\n * Check if fixed foveation is supported on this device\r\n */\r\n public get isFixedFoveationSupported(): boolean {\r\n return this.layerType == 'XRWebGLLayer' && (typeof (this.layer as XRWebGLLayer).fixedFoveation == 'number');\r\n }\r\n\r\n /**\r\n * Get the fixed foveation currently set, as specified by the webxr specs\r\n * If this returns null, then fixed foveation is not supported\r\n */\r\n public get fixedFoveation(): Nullable<number> {\r\n if (this.isFixedFoveationSupported) {\r\n return (this.layer as XRWebGLLayer).fixedFoveation!;\r\n }\r\n return null;\r\n }\r\n\r\n /**\r\n * Set the fixed foveation to the specified value, as specified by the webxr specs\r\n * This value will be normalized to be between 0 and 1, 1 being max foveation, 0 being no foveation\r\n */\r\n public set fixedFoveation(value: Nullable<number>) {\r\n if (this.isFixedFoveationSupported) {\r\n const val = Math.max(0, Math.min(1, value || 0));\r\n (this.layer as XRWebGLLayer).fixedFoveation = val;\r\n }\r\n }\r\n\r\n protected constructor(\r\n /** The width of the layer's framebuffer. */\r\n public getWidth: () => number,\r\n /** The height of the layer's framebuffer. */\r\n public getHeight: () => number,\r\n /** The XR layer that this WebXRLayerWrapper wraps. */\r\n public readonly layer: XRLayer,\r\n /** The type of XR layer that is being wrapped. */\r\n public readonly layerType: WebXRLayerType,\r\n /** Create a render target provider for the wrapped layer. */\r\n public createRenderTargetTextureProvider: (xrSessionManager: WebXRSessionManager) => WebXRLayerRenderTargetTextureProvider) {}\r\n}"]}
@@ -43,6 +43,7 @@ export declare class WebXRManagedOutputCanvas implements WebXRRenderTarget {
43
43
  * xr layer for the canvas
44
44
  */
45
45
  xrLayer: Nullable<XRWebGLLayer>;
46
+ private _xrLayerWrapper;
46
47
  /**
47
48
  * Observers registered here will be triggered when the xr layer was initialized
48
49
  */
@@ -58,7 +59,7 @@ export declare class WebXRManagedOutputCanvas implements WebXRRenderTarget {
58
59
  */
59
60
  dispose(): void;
60
61
  /**
61
- * Initializes the xr layer for the session
62
+ * Initializes a XRWebGLLayer to be used as the session's baseLayer.
62
63
  * @param xrSession xr session
63
64
  * @returns a promise that will resolve once the XR Layer has been created
64
65
  */
@@ -1,5 +1,7 @@
1
+ import { __awaiter, __generator } from "tslib";
1
2
  import { Observable } from "../Misc/observable.js";
2
3
  import { Tools } from "../Misc/tools.js";
4
+ import { WebXRWebGLLayerWrapper } from "./webXRWebGLLayer.js";
3
5
  /**
4
6
  * Configuration object for WebXR output canvas
5
7
  */
@@ -46,6 +48,7 @@ var WebXRManagedOutputCanvas = /** @class */ (function () {
46
48
  * xr layer for the canvas
47
49
  */
48
50
  this.xrLayer = null;
51
+ this._xrLayerWrapper = null;
49
52
  /**
50
53
  * Observers registered here will be triggered when the xr layer was initialized
51
54
  */
@@ -77,33 +80,37 @@ var WebXRManagedOutputCanvas = /** @class */ (function () {
77
80
  this._setManagedOutputCanvas(null);
78
81
  };
79
82
  /**
80
- * Initializes the xr layer for the session
83
+ * Initializes a XRWebGLLayer to be used as the session's baseLayer.
81
84
  * @param xrSession xr session
82
85
  * @returns a promise that will resolve once the XR Layer has been created
83
86
  */
84
87
  WebXRManagedOutputCanvas.prototype.initializeXRLayerAsync = function (xrSession) {
85
- var _this = this;
86
- var createLayer = function () {
87
- var layer = new XRWebGLLayer(xrSession, _this.canvasContext, _this._options.canvasOptions);
88
- _this.onXRLayerInitObservable.notifyObservers(layer);
89
- return layer;
90
- };
91
- // support canvases without makeXRCompatible
92
- if (!this.canvasContext.makeXRCompatible) {
93
- this.xrLayer = createLayer();
94
- return Promise.resolve(this.xrLayer);
95
- }
96
- return this.canvasContext
97
- .makeXRCompatible()
98
- .then(
99
- // catch any error and continue. When using the emulator is throws this error for no apparent reason.
100
- function () { }, function () {
101
- // log the error, continue nonetheless!
102
- Tools.Warn("Error executing makeXRCompatible. This does not mean that the session will work incorrectly.");
103
- })
104
- .then(function () {
105
- _this.xrLayer = createLayer();
106
- return _this.xrLayer;
88
+ return __awaiter(this, void 0, void 0, function () {
89
+ var createLayer;
90
+ var _this = this;
91
+ return __generator(this, function (_a) {
92
+ createLayer = function () {
93
+ _this.xrLayer = new XRWebGLLayer(xrSession, _this.canvasContext, _this._options.canvasOptions);
94
+ _this._xrLayerWrapper = new WebXRWebGLLayerWrapper(_this.xrLayer);
95
+ _this.onXRLayerInitObservable.notifyObservers(_this.xrLayer);
96
+ return _this.xrLayer;
97
+ };
98
+ // support canvases without makeXRCompatible
99
+ if (!this.canvasContext.makeXRCompatible) {
100
+ return [2 /*return*/, Promise.resolve(createLayer())];
101
+ }
102
+ return [2 /*return*/, this.canvasContext
103
+ .makeXRCompatible()
104
+ .then(
105
+ // catch any error and continue. When using the emulator is throws this error for no apparent reason.
106
+ function () { }, function () {
107
+ // log the error, continue nonetheless!
108
+ Tools.Warn("Error executing makeXRCompatible. This does not mean that the session will work incorrectly.");
109
+ })
110
+ .then(function () {
111
+ return createLayer();
112
+ })];
113
+ });
107
114
  });
108
115
  };
109
116
  WebXRManagedOutputCanvas.prototype._addCanvas = function () {
@@ -115,8 +122,8 @@ var WebXRManagedOutputCanvas = /** @class */ (function () {
115
122
  this._setCanvasSize(true);
116
123
  }
117
124
  else {
118
- this.onXRLayerInitObservable.addOnce(function (layer) {
119
- _this._setCanvasSize(true, layer);
125
+ this.onXRLayerInitObservable.addOnce(function () {
126
+ _this._setCanvasSize(true);
120
127
  });
121
128
  }
122
129
  };
@@ -128,18 +135,18 @@ var WebXRManagedOutputCanvas = /** @class */ (function () {
128
135
  };
129
136
  WebXRManagedOutputCanvas.prototype._setCanvasSize = function (init, xrLayer) {
130
137
  if (init === void 0) { init = true; }
131
- if (xrLayer === void 0) { xrLayer = this.xrLayer; }
138
+ if (xrLayer === void 0) { xrLayer = this._xrLayerWrapper; }
132
139
  if (!this._canvas || !this._engine) {
133
140
  return;
134
141
  }
135
142
  if (init) {
136
143
  if (xrLayer) {
137
144
  if (this._canvas !== this._engine.getRenderingCanvas()) {
138
- this._canvas.style.width = xrLayer.framebufferWidth + "px";
139
- this._canvas.style.height = xrLayer.framebufferHeight + "px";
145
+ this._canvas.style.width = xrLayer.getWidth() + "px";
146
+ this._canvas.style.height = xrLayer.getHeight() + "px";
140
147
  }
141
148
  else {
142
- this._engine.setSize(xrLayer.framebufferWidth, xrLayer.framebufferHeight);
149
+ this._engine.setSize(xrLayer.getWidth(), xrLayer.getHeight());
143
150
  }
144
151
  }
145
152
  }