@babylonjs/core 9.10.1 → 9.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1065) hide show
  1. package/Actions/actionManager.d.ts +1 -1
  2. package/Actions/actionManager.js +8 -5
  3. package/Actions/actionManager.js.map +1 -1
  4. package/Animations/animatable.core.d.ts +1 -1
  5. package/Animations/animatable.core.js +2 -2
  6. package/Animations/animatable.core.js.map +1 -1
  7. package/Animations/animationPropertiesOverride.js +1 -1
  8. package/Animations/animationPropertiesOverride.js.map +1 -1
  9. package/Animations/animatorAvatar.d.ts +2 -2
  10. package/Animations/animatorAvatar.js +3 -3
  11. package/Animations/animatorAvatar.js.map +1 -1
  12. package/Animations/pathCursor.d.ts +1 -1
  13. package/Animations/pathCursor.js +1 -1
  14. package/Animations/pathCursor.js.map +1 -1
  15. package/Animations/runtimeAnimation.d.ts +1 -1
  16. package/Animations/runtimeAnimation.js +2 -2
  17. package/Animations/runtimeAnimation.js.map +1 -1
  18. package/Audio/analyser.js +1 -1
  19. package/Audio/analyser.js.map +1 -1
  20. package/AudioV2/abstractAudio/components/spatialAudioAttacherComponent.js +1 -1
  21. package/AudioV2/abstractAudio/components/spatialAudioAttacherComponent.js.map +1 -1
  22. package/AudioV2/abstractAudio/subNodes/audioAnalyzerSubNode.d.ts +2 -0
  23. package/AudioV2/abstractAudio/subNodes/audioAnalyzerSubNode.js.map +1 -1
  24. package/AudioV2/abstractAudio/subProperties/abstractAudioAnalyzer.d.ts +13 -3
  25. package/AudioV2/abstractAudio/subProperties/abstractAudioAnalyzer.js +16 -0
  26. package/AudioV2/abstractAudio/subProperties/abstractAudioAnalyzer.js.map +1 -1
  27. package/AudioV2/abstractAudio/subProperties/abstractSpatialAudio.d.ts +1 -1
  28. package/AudioV2/abstractAudio/subProperties/abstractSpatialAudio.js +1 -1
  29. package/AudioV2/abstractAudio/subProperties/abstractSpatialAudio.js.map +1 -1
  30. package/AudioV2/abstractAudio/subProperties/abstractSpatialAudioListener.d.ts +1 -1
  31. package/AudioV2/abstractAudio/subProperties/abstractSpatialAudioListener.js +1 -1
  32. package/AudioV2/abstractAudio/subProperties/abstractSpatialAudioListener.js.map +1 -1
  33. package/AudioV2/abstractAudio/subProperties/audioAnalyzer.d.ts +4 -0
  34. package/AudioV2/abstractAudio/subProperties/audioAnalyzer.js +22 -0
  35. package/AudioV2/abstractAudio/subProperties/audioAnalyzer.js.map +1 -1
  36. package/AudioV2/webAudio/subNodes/spatialWebAudioSubNode.d.ts +1 -1
  37. package/AudioV2/webAudio/subNodes/spatialWebAudioSubNode.js +1 -1
  38. package/AudioV2/webAudio/subNodes/spatialWebAudioSubNode.js.map +1 -1
  39. package/AudioV2/webAudio/subNodes/webAudioAnalyzerSubNode.d.ts +6 -0
  40. package/AudioV2/webAudio/subNodes/webAudioAnalyzerSubNode.js +22 -5
  41. package/AudioV2/webAudio/subNodes/webAudioAnalyzerSubNode.js.map +1 -1
  42. package/AudioV2/webAudio/subProperties/spatialWebAudioListener.js +1 -1
  43. package/AudioV2/webAudio/subProperties/spatialWebAudioListener.js.map +1 -1
  44. package/AudioV2/webAudio/webAudioStreamingSound.js +1 -1
  45. package/AudioV2/webAudio/webAudioStreamingSound.js.map +1 -1
  46. package/BakedVertexAnimation/bakedVertexAnimationManager.d.ts +1 -1
  47. package/BakedVertexAnimation/bakedVertexAnimationManager.js +1 -1
  48. package/BakedVertexAnimation/bakedVertexAnimationManager.js.map +1 -1
  49. package/BakedVertexAnimation/vertexAnimationBaker.js +1 -1
  50. package/BakedVertexAnimation/vertexAnimationBaker.js.map +1 -1
  51. package/Behaviors/Cameras/bouncingBehavior.js +1 -1
  52. package/Behaviors/Cameras/bouncingBehavior.js.map +1 -1
  53. package/Behaviors/Cameras/framingBehavior.d.ts +1 -1
  54. package/Behaviors/Cameras/framingBehavior.js +2 -2
  55. package/Behaviors/Cameras/framingBehavior.js.map +1 -1
  56. package/Behaviors/Cameras/interpolatingBehavior.d.ts +13 -1
  57. package/Behaviors/Cameras/interpolatingBehavior.js +13 -1
  58. package/Behaviors/Cameras/interpolatingBehavior.js.map +1 -1
  59. package/Behaviors/Meshes/attachToBoxBehavior.js +1 -1
  60. package/Behaviors/Meshes/attachToBoxBehavior.js.map +1 -1
  61. package/Behaviors/Meshes/baseSixDofDragBehavior.d.ts +3 -3
  62. package/Behaviors/Meshes/baseSixDofDragBehavior.js +4 -4
  63. package/Behaviors/Meshes/baseSixDofDragBehavior.js.map +1 -1
  64. package/Behaviors/Meshes/followBehavior.js +1 -1
  65. package/Behaviors/Meshes/followBehavior.js.map +1 -1
  66. package/Behaviors/Meshes/handConstraintBehavior.js +2 -2
  67. package/Behaviors/Meshes/handConstraintBehavior.js.map +1 -1
  68. package/Behaviors/Meshes/multiPointerScaleBehavior.js +1 -1
  69. package/Behaviors/Meshes/multiPointerScaleBehavior.js.map +1 -1
  70. package/Behaviors/Meshes/pointerDragBehavior.d.ts +3 -3
  71. package/Behaviors/Meshes/pointerDragBehavior.js +5 -5
  72. package/Behaviors/Meshes/pointerDragBehavior.js.map +1 -1
  73. package/Behaviors/Meshes/sixDofDragBehavior.d.ts +1 -1
  74. package/Behaviors/Meshes/sixDofDragBehavior.js +2 -2
  75. package/Behaviors/Meshes/sixDofDragBehavior.js.map +1 -1
  76. package/Behaviors/Meshes/surfaceMagnetismBehavior.js +1 -1
  77. package/Behaviors/Meshes/surfaceMagnetismBehavior.js.map +1 -1
  78. package/Bones/boneIKController.d.ts +1 -1
  79. package/Bones/boneIKController.js +1 -1
  80. package/Bones/boneIKController.js.map +1 -1
  81. package/Bones/boneLookController.d.ts +1 -1
  82. package/Bones/boneLookController.js +1 -1
  83. package/Bones/boneLookController.js.map +1 -1
  84. package/Bones/skeleton.d.ts +2 -2
  85. package/Bones/skeleton.functions.d.ts +1 -1
  86. package/Bones/skeleton.functions.js +3 -3
  87. package/Bones/skeleton.functions.js.map +1 -1
  88. package/Bones/skeleton.js +3 -4
  89. package/Bones/skeleton.js.map +1 -1
  90. package/Buffers/buffer.align.pure.js +6 -0
  91. package/Buffers/buffer.align.pure.js.map +1 -1
  92. package/Buffers/buffer.nonFloatVertexBuffers.js +2 -1
  93. package/Buffers/buffer.nonFloatVertexBuffers.js.map +1 -1
  94. package/Buffers/buffer.pure.d.ts +8 -0
  95. package/Buffers/buffer.pure.js +31 -2
  96. package/Buffers/buffer.pure.js.map +1 -1
  97. package/Buffers/bufferUtils.js +17 -5
  98. package/Buffers/bufferUtils.js.map +1 -1
  99. package/Cameras/Inputs/BaseCameraMouseWheelInput.js +1 -1
  100. package/Cameras/Inputs/BaseCameraMouseWheelInput.js.map +1 -1
  101. package/Cameras/Inputs/BaseCameraPointersInput.js +1 -1
  102. package/Cameras/Inputs/BaseCameraPointersInput.js.map +1 -1
  103. package/Cameras/Inputs/arcRotateCameraKeyboardMoveInput.js +1 -1
  104. package/Cameras/Inputs/arcRotateCameraKeyboardMoveInput.js.map +1 -1
  105. package/Cameras/Inputs/arcRotateCameraMouseWheelInput.js +2 -2
  106. package/Cameras/Inputs/arcRotateCameraMouseWheelInput.js.map +1 -1
  107. package/Cameras/Inputs/flyCameraKeyboardInput.js +2 -2
  108. package/Cameras/Inputs/flyCameraKeyboardInput.js.map +1 -1
  109. package/Cameras/Inputs/flyCameraMouseInput.js +2 -2
  110. package/Cameras/Inputs/flyCameraMouseInput.js.map +1 -1
  111. package/Cameras/Inputs/followCameraKeyboardMoveInput.js +1 -1
  112. package/Cameras/Inputs/followCameraKeyboardMoveInput.js.map +1 -1
  113. package/Cameras/Inputs/followCameraMouseWheelInput.js +1 -1
  114. package/Cameras/Inputs/followCameraMouseWheelInput.js.map +1 -1
  115. package/Cameras/Inputs/freeCameraGamepadInput.js +1 -1
  116. package/Cameras/Inputs/freeCameraGamepadInput.js.map +1 -1
  117. package/Cameras/Inputs/freeCameraKeyboardMoveInput.js +2 -2
  118. package/Cameras/Inputs/freeCameraKeyboardMoveInput.js.map +1 -1
  119. package/Cameras/Inputs/freeCameraMouseInput.js +1 -1
  120. package/Cameras/Inputs/freeCameraMouseInput.js.map +1 -1
  121. package/Cameras/Inputs/freeCameraMouseWheelInput.js +1 -1
  122. package/Cameras/Inputs/freeCameraMouseWheelInput.js.map +1 -1
  123. package/Cameras/Inputs/freeCameraTouchInput.js +2 -2
  124. package/Cameras/Inputs/freeCameraTouchInput.js.map +1 -1
  125. package/Cameras/Inputs/geospatialCameraKeyboardInput.js +1 -1
  126. package/Cameras/Inputs/geospatialCameraKeyboardInput.js.map +1 -1
  127. package/Cameras/Limits/geospatialLimits.d.ts +1 -1
  128. package/Cameras/Limits/geospatialLimits.js +1 -1
  129. package/Cameras/Limits/geospatialLimits.js.map +1 -1
  130. package/Cameras/RigModes/stereoscopicAnaglyphRigMode.js +2 -2
  131. package/Cameras/RigModes/stereoscopicAnaglyphRigMode.js.map +1 -1
  132. package/Cameras/RigModes/stereoscopicRigMode.d.ts +1 -1
  133. package/Cameras/RigModes/stereoscopicRigMode.js +3 -3
  134. package/Cameras/RigModes/stereoscopicRigMode.js.map +1 -1
  135. package/Cameras/RigModes/vrRigMode.js +2 -2
  136. package/Cameras/RigModes/vrRigMode.js.map +1 -1
  137. package/Cameras/Stereoscopic/stereoscopicScreenUniversalCamera.d.ts +3 -3
  138. package/Cameras/Stereoscopic/stereoscopicScreenUniversalCamera.js +5 -5
  139. package/Cameras/Stereoscopic/stereoscopicScreenUniversalCamera.js.map +1 -1
  140. package/Cameras/VR/vrCameraMetrics.d.ts +1 -1
  141. package/Cameras/VR/vrCameraMetrics.js +1 -1
  142. package/Cameras/VR/vrCameraMetrics.js.map +1 -1
  143. package/Cameras/cameraInputsManager.d.ts +1 -1
  144. package/Cameras/cameraInputsManager.js +1 -1
  145. package/Cameras/cameraInputsManager.js.map +1 -1
  146. package/Collisions/collider.d.ts +1 -1
  147. package/Collisions/collider.js +1 -1
  148. package/Collisions/collider.js.map +1 -1
  149. package/Collisions/gpuPicker.d.ts +1 -1
  150. package/Collisions/gpuPicker.js +5 -5
  151. package/Collisions/gpuPicker.js.map +1 -1
  152. package/Collisions/meshCollisionData.d.ts +1 -1
  153. package/Collisions/meshCollisionData.js +1 -1
  154. package/Collisions/meshCollisionData.js.map +1 -1
  155. package/Collisions/pickingInfo.d.ts +1 -1
  156. package/Collisions/pickingInfo.js +2 -2
  157. package/Collisions/pickingInfo.js.map +1 -1
  158. package/Compute/computeEffect.d.ts +6 -0
  159. package/Compute/computeEffect.js +3 -0
  160. package/Compute/computeEffect.js.map +1 -1
  161. package/Compute/computeShader.pure.d.ts +4 -0
  162. package/Compute/computeShader.pure.js +1 -0
  163. package/Compute/computeShader.pure.js.map +1 -1
  164. package/Culling/Octrees/octreeBlock.d.ts +1 -1
  165. package/Culling/Octrees/octreeBlock.js +1 -1
  166. package/Culling/Octrees/octreeBlock.js.map +1 -1
  167. package/Culling/boundingBox.d.ts +1 -1
  168. package/Culling/boundingBox.js +1 -1
  169. package/Culling/boundingBox.js.map +1 -1
  170. package/Culling/boundingInfo.d.ts +1 -1
  171. package/Culling/boundingInfo.js +1 -1
  172. package/Culling/boundingInfo.js.map +1 -1
  173. package/Culling/boundingSphere.d.ts +1 -1
  174. package/Culling/boundingSphere.js +1 -1
  175. package/Culling/boundingSphere.js.map +1 -1
  176. package/Culling/ray.core.d.ts +1 -1
  177. package/Culling/ray.core.js +1 -1
  178. package/Culling/ray.core.js.map +1 -1
  179. package/Debug/axesViewer.d.ts +1 -1
  180. package/Debug/axesViewer.js +3 -3
  181. package/Debug/axesViewer.js.map +1 -1
  182. package/Debug/boneAxesViewer.d.ts +1 -1
  183. package/Debug/boneAxesViewer.js +1 -1
  184. package/Debug/boneAxesViewer.js.map +1 -1
  185. package/Debug/directionalLightFrustumViewer.d.ts +1 -1
  186. package/Debug/directionalLightFrustumViewer.js +6 -6
  187. package/Debug/directionalLightFrustumViewer.js.map +1 -1
  188. package/Debug/rayHelper.d.ts +1 -1
  189. package/Debug/rayHelper.js +2 -2
  190. package/Debug/rayHelper.js.map +1 -1
  191. package/Debug/skeletonViewer.d.ts +2 -2
  192. package/Debug/skeletonViewer.js +10 -10
  193. package/Debug/skeletonViewer.js.map +1 -1
  194. package/DeviceInput/internalDeviceSourceManager.d.ts +1 -1
  195. package/DeviceInput/internalDeviceSourceManager.js +0 -1
  196. package/DeviceInput/internalDeviceSourceManager.js.map +1 -1
  197. package/DeviceInput/webDeviceInputSystem.js +1 -1
  198. package/DeviceInput/webDeviceInputSystem.js.map +1 -1
  199. package/Engines/Extensions/engine.views.d.ts +1 -1
  200. package/Engines/Extensions/engine.views.js +1 -1
  201. package/Engines/Extensions/engine.views.js.map +1 -1
  202. package/Engines/Native/nativeHelpers.js +4 -1
  203. package/Engines/Native/nativeHelpers.js.map +1 -1
  204. package/Engines/Native/nativeInterfaces.d.ts +10 -1
  205. package/Engines/Native/nativeInterfaces.js.map +1 -1
  206. package/Engines/WebGPU/Extensions/engine.computeShader.pure.js +154 -2
  207. package/Engines/WebGPU/Extensions/engine.computeShader.pure.js.map +1 -1
  208. package/Engines/WebGPU/webgpuCacheRenderPipeline.d.ts +1 -1
  209. package/Engines/WebGPU/webgpuCacheRenderPipeline.js +11 -1
  210. package/Engines/WebGPU/webgpuCacheRenderPipeline.js.map +1 -1
  211. package/Engines/WebGPU/webgpuComputeContext.d.ts +1 -1
  212. package/Engines/WebGPU/webgpuComputeContext.js.map +1 -1
  213. package/Engines/WebGPU/webgpuTintWASM.js +1 -1
  214. package/Engines/WebGPU/webgpuTintWASM.js.map +1 -1
  215. package/Engines/abstractEngine.pure.d.ts +7 -1
  216. package/Engines/abstractEngine.pure.js +34 -4
  217. package/Engines/abstractEngine.pure.js.map +1 -1
  218. package/Engines/constants.d.ts +4 -0
  219. package/Engines/constants.js +4 -0
  220. package/Engines/constants.js.map +1 -1
  221. package/Engines/engine.pure.d.ts +0 -7
  222. package/Engines/engine.pure.js +0 -34
  223. package/Engines/engine.pure.js.map +1 -1
  224. package/Engines/engineFactory.d.ts +2 -2
  225. package/Engines/engineFactory.js +3 -3
  226. package/Engines/engineFactory.js.map +1 -1
  227. package/Engines/thinNativeEngine.pure.js +15 -8
  228. package/Engines/thinNativeEngine.pure.js.map +1 -1
  229. package/Events/pointerEvents.d.ts +1 -1
  230. package/Events/pointerEvents.js +1 -1
  231. package/Events/pointerEvents.js.map +1 -1
  232. package/FlowGraph/Blocks/Data/Utils/flowGraphCodeExecutionBlock.js +1 -1
  233. package/FlowGraph/Blocks/Data/Utils/flowGraphCodeExecutionBlock.js.map +1 -1
  234. package/FlowGraph/Blocks/Data/flowGraphCachedOperationBlock.d.ts +1 -1
  235. package/FlowGraph/Blocks/Data/flowGraphCachedOperationBlock.js +1 -1
  236. package/FlowGraph/Blocks/Data/flowGraphCachedOperationBlock.js.map +1 -1
  237. package/FlowGraph/Blocks/Event/flowGraphKeyboardEventBlock.js +1 -1
  238. package/FlowGraph/Blocks/Event/flowGraphKeyboardEventBlock.js.map +1 -1
  239. package/FlowGraph/Blocks/Execution/Animation/flowGraphInterpolationBlock.pure.d.ts +1 -1
  240. package/FlowGraph/Blocks/Execution/Animation/flowGraphInterpolationBlock.pure.js +3 -3
  241. package/FlowGraph/Blocks/Execution/Animation/flowGraphInterpolationBlock.pure.js.map +1 -1
  242. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphCancelDelayBlock.pure.js +1 -1
  243. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphCancelDelayBlock.pure.js.map +1 -1
  244. package/FlowGraph/CustomTypes/flowGraphMatrix.d.ts +1 -1
  245. package/FlowGraph/CustomTypes/flowGraphMatrix.js +1 -1
  246. package/FlowGraph/CustomTypes/flowGraphMatrix.js.map +1 -1
  247. package/FlowGraph/flowGraphBlock.d.ts +1 -1
  248. package/FlowGraph/flowGraphBlock.js +1 -1
  249. package/FlowGraph/flowGraphBlock.js.map +1 -1
  250. package/FlowGraph/flowGraphExecutionBlock.d.ts +1 -1
  251. package/FlowGraph/flowGraphExecutionBlock.js +1 -1
  252. package/FlowGraph/flowGraphExecutionBlock.js.map +1 -1
  253. package/FlowGraph/flowGraphMath.d.ts +1 -1
  254. package/FlowGraph/flowGraphMath.js +1 -1
  255. package/FlowGraph/flowGraphMath.js.map +1 -1
  256. package/FlowGraph/flowGraphParser.js +1 -1
  257. package/FlowGraph/flowGraphParser.js.map +1 -1
  258. package/FlowGraph/flowGraphPathConverterComponent.d.ts +1 -1
  259. package/FlowGraph/flowGraphPathConverterComponent.js +2 -2
  260. package/FlowGraph/flowGraphPathConverterComponent.js.map +1 -1
  261. package/FlowGraph/flowGraphValidator.js.map +1 -1
  262. package/FlowGraph/serialization.js +4 -4
  263. package/FlowGraph/serialization.js.map +1 -1
  264. package/FlowGraph/utils.js.map +1 -1
  265. package/FrameGraph/Node/nodeRenderGraph.d.ts +2 -2
  266. package/FrameGraph/Node/nodeRenderGraph.js +7 -7
  267. package/FrameGraph/Node/nodeRenderGraph.js.map +1 -1
  268. package/FrameGraph/Tasks/Layers/baseLayerTask.d.ts +30 -0
  269. package/FrameGraph/Tasks/Layers/baseLayerTask.js +28 -1
  270. package/FrameGraph/Tasks/Layers/baseLayerTask.js.map +1 -1
  271. package/FrameGraph/Tasks/Misc/computeShaderTask.d.ts +2 -2
  272. package/FrameGraph/Tasks/Misc/computeShaderTask.js +2 -2
  273. package/FrameGraph/Tasks/Misc/computeShaderTask.js.map +1 -1
  274. package/FrameGraph/Tasks/Misc/lightingVolumeTask.d.ts +1 -1
  275. package/FrameGraph/Tasks/Misc/lightingVolumeTask.js +2 -2
  276. package/FrameGraph/Tasks/Misc/lightingVolumeTask.js.map +1 -1
  277. package/FrameGraph/Tasks/PostProcesses/blurTask.d.ts +7 -0
  278. package/FrameGraph/Tasks/PostProcesses/blurTask.js +8 -1
  279. package/FrameGraph/Tasks/PostProcesses/blurTask.js.map +1 -1
  280. package/FrameGraph/Tasks/PostProcesses/depthOfFieldBlurTask.js +1 -1
  281. package/FrameGraph/Tasks/PostProcesses/depthOfFieldBlurTask.js.map +1 -1
  282. package/FrameGraph/Tasks/PostProcesses/ssrBlurTask.js +1 -1
  283. package/FrameGraph/Tasks/PostProcesses/ssrBlurTask.js.map +1 -1
  284. package/FrameGraph/Tasks/PostProcesses/volumetricLightingBlendVolumeTask.d.ts +1 -1
  285. package/FrameGraph/Tasks/PostProcesses/volumetricLightingBlendVolumeTask.js +1 -1
  286. package/FrameGraph/Tasks/PostProcesses/volumetricLightingBlendVolumeTask.js.map +1 -1
  287. package/FrameGraph/Tasks/PostProcesses/volumetricLightingTask.d.ts +2 -2
  288. package/FrameGraph/Tasks/PostProcesses/volumetricLightingTask.js +3 -3
  289. package/FrameGraph/Tasks/PostProcesses/volumetricLightingTask.js.map +1 -1
  290. package/FrameGraph/Tasks/Rendering/csmShadowGeneratorTask.d.ts +1 -1
  291. package/FrameGraph/Tasks/Rendering/csmShadowGeneratorTask.js +2 -2
  292. package/FrameGraph/Tasks/Rendering/csmShadowGeneratorTask.js.map +1 -1
  293. package/FrameGraph/Tasks/Rendering/geometryRendererTask.d.ts +6 -0
  294. package/FrameGraph/Tasks/Rendering/geometryRendererTask.js +14 -5
  295. package/FrameGraph/Tasks/Rendering/geometryRendererTask.js.map +1 -1
  296. package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsAccumulationTask.d.ts +1 -1
  297. package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsAccumulationTask.js +1 -1
  298. package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsAccumulationTask.js.map +1 -1
  299. package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsSpatialBlurTask.d.ts +1 -1
  300. package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsSpatialBlurTask.js +1 -1
  301. package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsSpatialBlurTask.js.map +1 -1
  302. package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsTracingTask.d.ts +1 -1
  303. package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsTracingTask.js +2 -2
  304. package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsTracingTask.js.map +1 -1
  305. package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsVoxelizationTask.d.ts +1 -1
  306. package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsVoxelizationTask.js +2 -2
  307. package/FrameGraph/Tasks/Rendering/iblShadows/iblShadowsVoxelizationTask.js.map +1 -1
  308. package/FrameGraph/Tasks/Rendering/objectRendererTask.d.ts +7 -1
  309. package/FrameGraph/Tasks/Rendering/objectRendererTask.js +7 -1
  310. package/FrameGraph/Tasks/Rendering/objectRendererTask.js.map +1 -1
  311. package/FrameGraph/Tasks/Texture/clearTextureTask.d.ts +1 -1
  312. package/FrameGraph/Tasks/Texture/clearTextureTask.js +1 -1
  313. package/FrameGraph/Tasks/Texture/clearTextureTask.js.map +1 -1
  314. package/FrameGraph/frameGraphRenderContext.js +1 -1
  315. package/FrameGraph/frameGraphRenderContext.js.map +1 -1
  316. package/FrameGraph/frameGraphTextureManager.d.ts +1 -1
  317. package/FrameGraph/frameGraphTextureManager.js +1 -1
  318. package/FrameGraph/frameGraphTextureManager.js.map +1 -1
  319. package/Gamepads/gamepadManager.js +1 -1
  320. package/Gamepads/gamepadManager.js.map +1 -1
  321. package/Gizmos/axisDragGizmo.d.ts +5 -5
  322. package/Gizmos/axisDragGizmo.js +6 -6
  323. package/Gizmos/axisDragGizmo.js.map +1 -1
  324. package/Gizmos/axisScaleGizmo.d.ts +4 -4
  325. package/Gizmos/axisScaleGizmo.js +6 -6
  326. package/Gizmos/axisScaleGizmo.js.map +1 -1
  327. package/Gizmos/boundingBoxGizmo.d.ts +5 -5
  328. package/Gizmos/boundingBoxGizmo.js +7 -7
  329. package/Gizmos/boundingBoxGizmo.js.map +1 -1
  330. package/Gizmos/cameraGizmo.d.ts +3 -3
  331. package/Gizmos/cameraGizmo.js +7 -7
  332. package/Gizmos/cameraGizmo.js.map +1 -1
  333. package/Gizmos/gizmo.d.ts +2 -2
  334. package/Gizmos/gizmo.js +3 -3
  335. package/Gizmos/gizmo.js.map +1 -1
  336. package/Gizmos/gizmoManager.d.ts +2 -2
  337. package/Gizmos/gizmoManager.js +2 -2
  338. package/Gizmos/gizmoManager.js.map +1 -1
  339. package/Gizmos/lightGizmo.d.ts +4 -4
  340. package/Gizmos/lightGizmo.js +11 -11
  341. package/Gizmos/lightGizmo.js.map +1 -1
  342. package/Gizmos/planeDragGizmo.d.ts +4 -4
  343. package/Gizmos/planeDragGizmo.js +5 -5
  344. package/Gizmos/planeDragGizmo.js.map +1 -1
  345. package/Gizmos/positionGizmo.d.ts +1 -1
  346. package/Gizmos/positionGizmo.js +2 -2
  347. package/Gizmos/positionGizmo.js.map +1 -1
  348. package/Gizmos/rotationGizmo.d.ts +3 -3
  349. package/Gizmos/rotationGizmo.js +3 -3
  350. package/Gizmos/rotationGizmo.js.map +1 -1
  351. package/Gizmos/scaleGizmo.d.ts +2 -2
  352. package/Gizmos/scaleGizmo.js +4 -4
  353. package/Gizmos/scaleGizmo.js.map +1 -1
  354. package/Gizmos/spatialAudioGizmo.d.ts +2 -2
  355. package/Gizmos/spatialAudioGizmo.js +6 -6
  356. package/Gizmos/spatialAudioGizmo.js.map +1 -1
  357. package/Helpers/environmentHelper.d.ts +6 -6
  358. package/Helpers/environmentHelper.js +12 -12
  359. package/Helpers/environmentHelper.js.map +1 -1
  360. package/Helpers/materialConversionHelper.d.ts +1 -1
  361. package/Helpers/materialConversionHelper.js +1 -1
  362. package/Helpers/materialConversionHelper.js.map +1 -1
  363. package/Helpers/photoDome.d.ts +1 -1
  364. package/Helpers/photoDome.js +1 -1
  365. package/Helpers/photoDome.js.map +1 -1
  366. package/Helpers/textureDome.d.ts +4 -4
  367. package/Helpers/textureDome.js +6 -6
  368. package/Helpers/textureDome.js.map +1 -1
  369. package/Helpers/videoDome.d.ts +1 -1
  370. package/Helpers/videoDome.js +2 -2
  371. package/Helpers/videoDome.js.map +1 -1
  372. package/Inputs/scene.inputManager.d.ts +1 -1
  373. package/Inputs/scene.inputManager.js +1 -1
  374. package/Inputs/scene.inputManager.js.map +1 -1
  375. package/Instrumentation/sceneInstrumentation.js +1 -1
  376. package/Instrumentation/sceneInstrumentation.js.map +1 -1
  377. package/Layers/effectLayer.d.ts +1 -1
  378. package/Layers/effectLayer.js +3 -3
  379. package/Layers/effectLayer.js.map +1 -1
  380. package/Layers/layer.d.ts +2 -2
  381. package/Layers/layer.js +4 -4
  382. package/Layers/layer.js.map +1 -1
  383. package/Layers/thinEffectLayer.d.ts +2 -2
  384. package/Layers/thinEffectLayer.js +3 -3
  385. package/Layers/thinEffectLayer.js.map +1 -1
  386. package/Layers/thinGlowLayer.d.ts +1 -1
  387. package/Layers/thinGlowLayer.js +3 -3
  388. package/Layers/thinGlowLayer.js.map +1 -1
  389. package/Layers/thinHighlightLayer.d.ts +1 -1
  390. package/Layers/thinHighlightLayer.js +3 -3
  391. package/Layers/thinHighlightLayer.js.map +1 -1
  392. package/Layers/thinSelectionOutlineLayer.d.ts +1 -1
  393. package/Layers/thinSelectionOutlineLayer.js +3 -3
  394. package/Layers/thinSelectionOutlineLayer.js.map +1 -1
  395. package/Legacy/legacy.js +12 -1
  396. package/Legacy/legacy.js.map +1 -1
  397. package/LensFlares/lensFlare.d.ts +2 -2
  398. package/LensFlares/lensFlare.js +3 -3
  399. package/LensFlares/lensFlare.js.map +1 -1
  400. package/LensFlares/lensFlareSystem.d.ts +1 -1
  401. package/LensFlares/lensFlareSystem.js +6 -6
  402. package/LensFlares/lensFlareSystem.js.map +1 -1
  403. package/Lights/LTC/ltcTextureTool.js +1 -1
  404. package/Lights/LTC/ltcTextureTool.js.map +1 -1
  405. package/Lights/Shadows/cascadedShadowGenerator.d.ts +1 -285
  406. package/Lights/Shadows/cascadedShadowGenerator.js +3 -857
  407. package/Lights/Shadows/cascadedShadowGenerator.js.map +1 -1
  408. package/Lights/Shadows/cascadedShadowGenerator.pure.d.ts +290 -0
  409. package/Lights/Shadows/cascadedShadowGenerator.pure.js +868 -0
  410. package/Lights/Shadows/cascadedShadowGenerator.pure.js.map +1 -0
  411. package/Lights/Shadows/pure.d.ts +1 -0
  412. package/Lights/Shadows/pure.js +1 -0
  413. package/Lights/Shadows/pure.js.map +1 -1
  414. package/Lights/Shadows/shadowGenerator.d.ts +3 -3
  415. package/Lights/Shadows/shadowGenerator.js +7 -7
  416. package/Lights/Shadows/shadowGenerator.js.map +1 -1
  417. package/Lights/areaLight.d.ts +1 -1
  418. package/Lights/areaLight.js +0 -1
  419. package/Lights/areaLight.js.map +1 -1
  420. package/Lights/light.d.ts +2 -2
  421. package/Lights/light.js +2 -2
  422. package/Lights/light.js.map +1 -1
  423. package/Lights/shadowLight.d.ts +1 -1
  424. package/Lights/shadowLight.js +1 -1
  425. package/Lights/shadowLight.js.map +1 -1
  426. package/Loading/sceneLoader.d.ts +2 -2
  427. package/Loading/sceneLoader.js +3 -3
  428. package/Loading/sceneLoader.js.map +1 -1
  429. package/Materials/GreasedLine/greasedLineMaterialDefaults.d.ts +1 -1
  430. package/Materials/GreasedLine/greasedLineMaterialDefaults.js +1 -1
  431. package/Materials/GreasedLine/greasedLineMaterialDefaults.js.map +1 -1
  432. package/Materials/GreasedLine/greasedLineSimpleMaterial.d.ts +3 -3
  433. package/Materials/GreasedLine/greasedLineSimpleMaterial.js +3 -3
  434. package/Materials/GreasedLine/greasedLineSimpleMaterial.js.map +1 -1
  435. package/Materials/Node/Blocks/Fragment/prePassOutputBlock.pure.js +6 -6
  436. package/Materials/Node/Blocks/Fragment/prePassOutputBlock.pure.js.map +1 -1
  437. package/Materials/Node/nodeMaterial.pure.d.ts +12 -0
  438. package/Materials/Node/nodeMaterial.pure.js +68 -13
  439. package/Materials/Node/nodeMaterial.pure.js.map +1 -1
  440. package/Materials/Node/nodeMaterialDefault.js +14 -14
  441. package/Materials/Node/nodeMaterialDefault.js.map +1 -1
  442. package/Materials/PBR/openpbrMaterial.pure.js +19 -4
  443. package/Materials/PBR/openpbrMaterial.pure.js.map +1 -1
  444. package/Materials/PBR/pbrAnisotropicConfiguration.d.ts +40 -2
  445. package/Materials/PBR/pbrAnisotropicConfiguration.js +41 -3
  446. package/Materials/PBR/pbrAnisotropicConfiguration.js.map +1 -1
  447. package/Materials/PBR/pbrBRDFConfiguration.d.ts +5 -1
  448. package/Materials/PBR/pbrBRDFConfiguration.js +5 -1
  449. package/Materials/PBR/pbrBRDFConfiguration.js.map +1 -1
  450. package/Materials/PBR/pbrBaseSimpleMaterial.d.ts +2 -2
  451. package/Materials/PBR/pbrBaseSimpleMaterial.js +2 -2
  452. package/Materials/PBR/pbrBaseSimpleMaterial.js.map +1 -1
  453. package/Materials/PBR/pbrClearCoatConfiguration.d.ts +42 -2
  454. package/Materials/PBR/pbrClearCoatConfiguration.js +42 -2
  455. package/Materials/PBR/pbrClearCoatConfiguration.js.map +1 -1
  456. package/Materials/PBR/pbrIridescenceConfiguration.d.ts +38 -1
  457. package/Materials/PBR/pbrIridescenceConfiguration.js +38 -1
  458. package/Materials/PBR/pbrIridescenceConfiguration.js.map +1 -1
  459. package/Materials/PBR/pbrMaterial.pure.d.ts +6 -0
  460. package/Materials/PBR/pbrMaterial.pure.js +8 -0
  461. package/Materials/PBR/pbrMaterial.pure.js.map +1 -1
  462. package/Materials/PBR/pbrSheenConfiguration.d.ts +41 -2
  463. package/Materials/PBR/pbrSheenConfiguration.js +41 -2
  464. package/Materials/PBR/pbrSheenConfiguration.js.map +1 -1
  465. package/Materials/PBR/pbrSubSurfaceConfiguration.d.ts +41 -2
  466. package/Materials/PBR/pbrSubSurfaceConfiguration.js +42 -3
  467. package/Materials/PBR/pbrSubSurfaceConfiguration.js.map +1 -1
  468. package/Materials/Textures/Filtering/hdrFiltering.js +1 -1
  469. package/Materials/Textures/Filtering/hdrFiltering.js.map +1 -1
  470. package/Materials/Textures/Filtering/hdrIrradianceFiltering.d.ts +1 -1
  471. package/Materials/Textures/Filtering/hdrIrradianceFiltering.js +2 -2
  472. package/Materials/Textures/Filtering/hdrIrradianceFiltering.js.map +1 -1
  473. package/Materials/Textures/Loaders/EXR/exrLoader.core.d.ts +1 -1
  474. package/Materials/Textures/Loaders/EXR/exrLoader.core.js +5 -109
  475. package/Materials/Textures/Loaders/EXR/exrLoader.core.js.map +1 -1
  476. package/Materials/Textures/Loaders/EXR/exrLoader.decoder.js +1 -1
  477. package/Materials/Textures/Loaders/EXR/exrLoader.decoder.js.map +1 -1
  478. package/Materials/Textures/Loaders/basisTextureLoader.js +2 -2
  479. package/Materials/Textures/Loaders/basisTextureLoader.js.map +1 -1
  480. package/Materials/Textures/Loaders/ddsTextureLoader.js +1 -1
  481. package/Materials/Textures/Loaders/ddsTextureLoader.js.map +1 -1
  482. package/Materials/Textures/Loaders/envTextureLoader.js +3 -1
  483. package/Materials/Textures/Loaders/envTextureLoader.js.map +1 -1
  484. package/Materials/Textures/Loaders/ktxTextureLoader.js +11 -2
  485. package/Materials/Textures/Loaders/ktxTextureLoader.js.map +1 -1
  486. package/Materials/Textures/MultiviewRenderTarget.d.ts +1 -1
  487. package/Materials/Textures/MultiviewRenderTarget.js +1 -1
  488. package/Materials/Textures/MultiviewRenderTarget.js.map +1 -1
  489. package/Materials/Textures/Packer/packer.d.ts +1 -1
  490. package/Materials/Textures/Packer/packer.js +6 -6
  491. package/Materials/Textures/Packer/packer.js.map +1 -1
  492. package/Materials/Textures/Procedurals/customProceduralTexture.d.ts +2 -2
  493. package/Materials/Textures/Procedurals/customProceduralTexture.js +4 -4
  494. package/Materials/Textures/Procedurals/customProceduralTexture.js.map +1 -1
  495. package/Materials/Textures/Procedurals/noiseProceduralTexture.pure.js +17 -5
  496. package/Materials/Textures/Procedurals/noiseProceduralTexture.pure.js.map +1 -1
  497. package/Materials/Textures/Procedurals/proceduralTexture.pure.js +4 -1
  498. package/Materials/Textures/Procedurals/proceduralTexture.pure.js.map +1 -1
  499. package/Materials/Textures/Procedurals/proceduralTextureSceneComponent.js +1 -1
  500. package/Materials/Textures/Procedurals/proceduralTextureSceneComponent.js.map +1 -1
  501. package/Materials/Textures/prePassRenderTarget.d.ts +1 -1
  502. package/Materials/Textures/prePassRenderTarget.js +1 -1
  503. package/Materials/Textures/prePassRenderTarget.js.map +1 -1
  504. package/Materials/Textures/rawCubeTexture.d.ts +1 -1
  505. package/Materials/Textures/rawCubeTexture.js +2 -2
  506. package/Materials/Textures/rawCubeTexture.js.map +1 -1
  507. package/Materials/Textures/rawTexture.d.ts +1 -1
  508. package/Materials/Textures/rawTexture.js +1 -1
  509. package/Materials/Textures/rawTexture.js.map +1 -1
  510. package/Materials/Textures/rawTexture2DArray.d.ts +1 -1
  511. package/Materials/Textures/rawTexture2DArray.js +1 -1
  512. package/Materials/Textures/rawTexture2DArray.js.map +1 -1
  513. package/Materials/Textures/rawTexture3D.d.ts +1 -1
  514. package/Materials/Textures/rawTexture3D.js +1 -1
  515. package/Materials/Textures/rawTexture3D.js.map +1 -1
  516. package/Materials/Textures/refractionTexture.d.ts +1 -1
  517. package/Materials/Textures/refractionTexture.js +1 -1
  518. package/Materials/Textures/refractionTexture.js.map +1 -1
  519. package/Materials/Textures/textureMerger.d.ts +1 -1
  520. package/Materials/Textures/textureMerger.js +1 -1
  521. package/Materials/Textures/textureMerger.js.map +1 -1
  522. package/Materials/Textures/textureProcessor.d.ts +1 -1
  523. package/Materials/Textures/textureProcessor.js +2 -2
  524. package/Materials/Textures/textureProcessor.js.map +1 -1
  525. package/Materials/Textures/thinRenderTargetTexture.d.ts +4 -4
  526. package/Materials/Textures/thinRenderTargetTexture.js +2 -2
  527. package/Materials/Textures/thinRenderTargetTexture.js.map +1 -1
  528. package/Materials/clipPlaneMaterialHelper.js +1 -1
  529. package/Materials/clipPlaneMaterialHelper.js.map +1 -1
  530. package/Materials/effect.pure.d.ts +2 -2
  531. package/Materials/effect.pure.js +12 -6
  532. package/Materials/effect.pure.js.map +1 -1
  533. package/Materials/effectRenderer.pure.js +4 -2
  534. package/Materials/effectRenderer.pure.js.map +1 -1
  535. package/Materials/floatingOriginMatrixOverrides.d.ts +1 -1
  536. package/Materials/floatingOriginMatrixOverrides.js +1 -1
  537. package/Materials/floatingOriginMatrixOverrides.js.map +1 -1
  538. package/Materials/material.detailMapConfiguration.d.ts +39 -1
  539. package/Materials/material.detailMapConfiguration.js +39 -1
  540. package/Materials/material.detailMapConfiguration.js.map +1 -1
  541. package/Materials/materialHelper.functions.js +45 -1
  542. package/Materials/materialHelper.functions.js.map +1 -1
  543. package/Materials/materialHelper.geometryrendering.d.ts +1 -1
  544. package/Materials/materialHelper.geometryrendering.js +1 -1
  545. package/Materials/materialHelper.geometryrendering.js.map +1 -1
  546. package/Materials/materialPluginFactoryExport.js +2 -2
  547. package/Materials/materialPluginFactoryExport.js.map +1 -1
  548. package/Materials/meshDebugPluginMaterial.pure.js +15 -13
  549. package/Materials/meshDebugPluginMaterial.pure.js.map +1 -1
  550. package/Materials/pushMaterial.d.ts +7 -1
  551. package/Materials/pushMaterial.js +7 -1
  552. package/Materials/pushMaterial.js.map +1 -1
  553. package/Materials/uniformBuffer.js +1 -1
  554. package/Materials/uniformBuffer.js.map +1 -1
  555. package/Maths/math.axis.d.ts +1 -1
  556. package/Maths/math.axis.js +1 -1
  557. package/Maths/math.axis.js.map +1 -1
  558. package/Maths/math.d.ts +2 -2
  559. package/Maths/math.functions.d.ts +1 -1
  560. package/Maths/math.functions.js +1 -1
  561. package/Maths/math.functions.js.map +1 -1
  562. package/Maths/math.isovector.d.ts +1 -1
  563. package/Maths/math.isovector.js +1 -1
  564. package/Maths/math.isovector.js.map +1 -1
  565. package/Maths/math.js +2 -2
  566. package/Maths/math.js.map +1 -1
  567. package/Maths/math.path.d.ts +1 -1
  568. package/Maths/math.path.js +1 -1
  569. package/Maths/math.path.js.map +1 -1
  570. package/Maths/math.plane.d.ts +1 -1
  571. package/Maths/math.plane.js +1 -1
  572. package/Maths/math.plane.js.map +1 -1
  573. package/Maths/math.polar.d.ts +1 -1
  574. package/Maths/math.polar.js +1 -1
  575. package/Maths/math.polar.js.map +1 -1
  576. package/Maths/math.vertexFormat.d.ts +1 -1
  577. package/Maths/math.vertexFormat.js +1 -1
  578. package/Maths/math.vertexFormat.js.map +1 -1
  579. package/Maths/pure.d.ts +1 -0
  580. package/Maths/pure.js +1 -0
  581. package/Maths/pure.js.map +1 -1
  582. package/Meshes/Builders/geodesicBuilder.js +1 -1
  583. package/Meshes/Builders/geodesicBuilder.js.map +1 -1
  584. package/Meshes/Builders/goldbergBuilder.d.ts +1 -1
  585. package/Meshes/Builders/goldbergBuilder.js +4 -4
  586. package/Meshes/Builders/goldbergBuilder.js.map +1 -1
  587. package/Meshes/Builders/greasedLineBuilder.d.ts +4 -4
  588. package/Meshes/Builders/greasedLineBuilder.js +5 -5
  589. package/Meshes/Builders/greasedLineBuilder.js.map +1 -1
  590. package/Meshes/Builders/textBuilder.d.ts +2 -2
  591. package/Meshes/Builders/textBuilder.js +4 -4
  592. package/Meshes/Builders/textBuilder.js.map +1 -1
  593. package/Meshes/Builders/tiledBoxBuilder.d.ts +3 -3
  594. package/Meshes/Builders/tiledBoxBuilder.js +3 -3
  595. package/Meshes/Builders/tiledBoxBuilder.js.map +1 -1
  596. package/Meshes/Builders/tiledPlaneBuilder.d.ts +1 -1
  597. package/Meshes/Builders/tiledPlaneBuilder.js +1 -1
  598. package/Meshes/Builders/tiledPlaneBuilder.js.map +1 -1
  599. package/Meshes/Compression/dracoCodec.js +1 -1
  600. package/Meshes/Compression/dracoCodec.js.map +1 -1
  601. package/Meshes/Compression/dracoDecoder.js +1 -1
  602. package/Meshes/Compression/dracoDecoder.js.map +1 -1
  603. package/Meshes/Compression/dracoEncoder.d.ts +1 -1
  604. package/Meshes/Compression/dracoEncoder.js +2 -2
  605. package/Meshes/Compression/dracoEncoder.js.map +1 -1
  606. package/Meshes/Compression/meshoptCompression.js +1 -1
  607. package/Meshes/Compression/meshoptCompression.js.map +1 -1
  608. package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js +64 -3
  609. package/Meshes/GaussianSplatting/gaussianSplattingMeshBase.pure.js.map +1 -1
  610. package/Meshes/GreasedLine/greasedLineBaseMesh.d.ts +2 -2
  611. package/Meshes/GreasedLine/greasedLineBaseMesh.js +3 -3
  612. package/Meshes/GreasedLine/greasedLineBaseMesh.js.map +1 -1
  613. package/Meshes/Node/nodeGeometry.d.ts +2 -2
  614. package/Meshes/Node/nodeGeometry.js +4 -4
  615. package/Meshes/Node/nodeGeometry.js.map +1 -1
  616. package/Meshes/Node/nodeGeometryBuildState.d.ts +1 -1
  617. package/Meshes/Node/nodeGeometryBuildState.js +1 -1
  618. package/Meshes/Node/nodeGeometryBuildState.js.map +1 -1
  619. package/Meshes/abstractMesh.hotSpot.d.ts +1 -1
  620. package/Meshes/abstractMesh.hotSpot.js +2 -2
  621. package/Meshes/abstractMesh.hotSpot.js.map +1 -1
  622. package/Meshes/abstractMesh.pure.js +2 -13
  623. package/Meshes/abstractMesh.pure.js.map +1 -1
  624. package/Meshes/buffer.d.ts +1 -1
  625. package/Meshes/buffer.js +1 -1
  626. package/Meshes/buffer.js.map +1 -1
  627. package/Meshes/csg.d.ts +3 -3
  628. package/Meshes/csg.js +4 -4
  629. package/Meshes/csg.js.map +1 -1
  630. package/Meshes/csg2.d.ts +1 -1
  631. package/Meshes/csg2.js +38 -11
  632. package/Meshes/csg2.js.map +1 -1
  633. package/Meshes/geodesicMesh.d.ts +1 -1
  634. package/Meshes/geodesicMesh.js +1 -1
  635. package/Meshes/geodesicMesh.js.map +1 -1
  636. package/Meshes/geometry.d.ts +2 -2
  637. package/Meshes/geometry.js +4 -4
  638. package/Meshes/geometry.js.map +1 -1
  639. package/Meshes/lattice.d.ts +1 -1
  640. package/Meshes/lattice.js +1 -1
  641. package/Meshes/lattice.js.map +1 -1
  642. package/Meshes/lattice.material.d.ts +1 -1
  643. package/Meshes/lattice.material.js +1 -1
  644. package/Meshes/lattice.material.js.map +1 -1
  645. package/Meshes/mesh.vertexData.d.ts +2 -2
  646. package/Meshes/mesh.vertexData.js +3 -4
  647. package/Meshes/mesh.vertexData.js.map +1 -1
  648. package/Meshes/mesh.vertexData.subdivide.js +1 -1
  649. package/Meshes/mesh.vertexData.subdivide.js.map +1 -1
  650. package/Meshes/meshBuilder.d.ts +18 -18
  651. package/Meshes/meshBuilder.js +18 -18
  652. package/Meshes/meshBuilder.js.map +1 -1
  653. package/Meshes/meshSimplification.d.ts +1 -1
  654. package/Meshes/meshSimplification.js +4 -4
  655. package/Meshes/meshSimplification.js.map +1 -1
  656. package/Meshes/meshUVSpaceRenderer.d.ts +1 -1
  657. package/Meshes/meshUVSpaceRenderer.js +0 -1
  658. package/Meshes/meshUVSpaceRenderer.js.map +1 -1
  659. package/Meshes/meshUtils.d.ts +1 -1
  660. package/Meshes/meshUtils.js +2 -2
  661. package/Meshes/meshUtils.js.map +1 -1
  662. package/Meshes/polygonMesh.d.ts +2 -2
  663. package/Meshes/polygonMesh.js +3 -3
  664. package/Meshes/polygonMesh.js.map +1 -1
  665. package/Misc/HighDynamicRange/cubemapToSphericalPolynomial.js +2 -2
  666. package/Misc/HighDynamicRange/cubemapToSphericalPolynomial.js.map +1 -1
  667. package/Misc/HighDynamicRange/panoramaToCubemap.js +1 -1
  668. package/Misc/HighDynamicRange/panoramaToCubemap.js.map +1 -1
  669. package/Misc/PerformanceViewer/performanceViewerCollector.js +1 -1
  670. package/Misc/PerformanceViewer/performanceViewerCollector.js.map +1 -1
  671. package/Misc/areaLightsTextureTools.d.ts +1 -1
  672. package/Misc/areaLightsTextureTools.js +3 -3
  673. package/Misc/areaLightsTextureTools.js.map +1 -1
  674. package/Misc/assetsManager.d.ts +4 -4
  675. package/Misc/assetsManager.js +5 -5
  676. package/Misc/assetsManager.js.map +1 -1
  677. package/Misc/basisWorker.js +1 -1
  678. package/Misc/basisWorker.js.map +1 -1
  679. package/Misc/brdfTextureTools.js +1 -1
  680. package/Misc/brdfTextureTools.js.map +1 -1
  681. package/Misc/copyTextureToTexture.d.ts +1 -1
  682. package/Misc/copyTextureToTexture.js +1 -1
  683. package/Misc/copyTextureToTexture.js.map +1 -1
  684. package/Misc/decorators.serialization.js +2 -2
  685. package/Misc/decorators.serialization.js.map +1 -1
  686. package/Misc/depthReducer.d.ts +2 -2
  687. package/Misc/depthReducer.js +2 -2
  688. package/Misc/depthReducer.js.map +1 -1
  689. package/Misc/gradients.d.ts +1 -1
  690. package/Misc/gradients.js +1 -1
  691. package/Misc/gradients.js.map +1 -1
  692. package/Misc/greasedLineTools.d.ts +1 -1
  693. package/Misc/greasedLineTools.js +3 -3
  694. package/Misc/greasedLineTools.js.map +1 -1
  695. package/Misc/halfFloat.d.ts +17 -0
  696. package/Misc/halfFloat.js +131 -0
  697. package/Misc/halfFloat.js.map +1 -0
  698. package/Misc/khronosTextureContainer2.js +1 -1
  699. package/Misc/khronosTextureContainer2.js.map +1 -1
  700. package/Misc/meshExploder.js +1 -1
  701. package/Misc/meshExploder.js.map +1 -1
  702. package/Misc/pivotTools.js +1 -1
  703. package/Misc/pivotTools.js.map +1 -1
  704. package/Misc/rgbdTextureTools.js +1 -1
  705. package/Misc/rgbdTextureTools.js.map +1 -1
  706. package/Misc/sceneOptimizer.js +1 -1
  707. package/Misc/sceneOptimizer.js.map +1 -1
  708. package/Misc/sceneRecorder.js +7 -7
  709. package/Misc/sceneRecorder.js.map +1 -1
  710. package/Misc/sceneSerializer.js +3 -3
  711. package/Misc/sceneSerializer.js.map +1 -1
  712. package/Misc/snapshotRenderingHelper.js +1 -1
  713. package/Misc/snapshotRenderingHelper.js.map +1 -1
  714. package/Misc/textureTools.d.ts +3 -13
  715. package/Misc/textureTools.js +6 -64
  716. package/Misc/textureTools.js.map +1 -1
  717. package/Misc/thinMinMaxReducer.d.ts +1 -1
  718. package/Misc/thinMinMaxReducer.js +1 -1
  719. package/Misc/thinMinMaxReducer.js.map +1 -1
  720. package/Misc/tools.internals.js +1 -1
  721. package/Misc/tools.internals.js.map +1 -1
  722. package/Misc/tools.pure.js +11 -4
  723. package/Misc/tools.pure.js.map +1 -1
  724. package/Misc/trajectoryClassifier.d.ts +1 -1
  725. package/Misc/trajectoryClassifier.js +1 -1
  726. package/Misc/trajectoryClassifier.js.map +1 -1
  727. package/Misc/videoRecorder.js +1 -1
  728. package/Misc/videoRecorder.js.map +1 -1
  729. package/Misc/virtualJoystick.d.ts +1 -1
  730. package/Misc/virtualJoystick.js +1 -1
  731. package/Misc/virtualJoystick.js.map +1 -1
  732. package/Morph/morphTarget.js +1 -1
  733. package/Morph/morphTarget.js.map +1 -1
  734. package/Navigation/Plugins/recastJSPlugin.d.ts +1 -1
  735. package/Navigation/Plugins/recastJSPlugin.js +2 -2
  736. package/Navigation/Plugins/recastJSPlugin.js.map +1 -1
  737. package/Particles/EmitterTypes/boxParticleEmitter.d.ts +1 -1
  738. package/Particles/EmitterTypes/boxParticleEmitter.js +1 -1
  739. package/Particles/EmitterTypes/boxParticleEmitter.js.map +1 -1
  740. package/Particles/EmitterTypes/coneParticleEmitter.d.ts +1 -1
  741. package/Particles/EmitterTypes/coneParticleEmitter.js +1 -1
  742. package/Particles/EmitterTypes/coneParticleEmitter.js.map +1 -1
  743. package/Particles/EmitterTypes/customParticleEmitter.d.ts +1 -1
  744. package/Particles/EmitterTypes/customParticleEmitter.js +1 -1
  745. package/Particles/EmitterTypes/customParticleEmitter.js.map +1 -1
  746. package/Particles/EmitterTypes/cylinderParticleEmitter.d.ts +1 -1
  747. package/Particles/EmitterTypes/cylinderParticleEmitter.js +1 -1
  748. package/Particles/EmitterTypes/cylinderParticleEmitter.js.map +1 -1
  749. package/Particles/EmitterTypes/hemisphericParticleEmitter.d.ts +1 -1
  750. package/Particles/EmitterTypes/hemisphericParticleEmitter.js +1 -1
  751. package/Particles/EmitterTypes/hemisphericParticleEmitter.js.map +1 -1
  752. package/Particles/EmitterTypes/meshParticleEmitter.d.ts +1 -1
  753. package/Particles/EmitterTypes/meshParticleEmitter.js +2 -2
  754. package/Particles/EmitterTypes/meshParticleEmitter.js.map +1 -1
  755. package/Particles/EmitterTypes/pointParticleEmitter.d.ts +1 -1
  756. package/Particles/EmitterTypes/pointParticleEmitter.js +1 -1
  757. package/Particles/EmitterTypes/pointParticleEmitter.js.map +1 -1
  758. package/Particles/EmitterTypes/sphereParticleEmitter.d.ts +1 -1
  759. package/Particles/EmitterTypes/sphereParticleEmitter.js +1 -1
  760. package/Particles/EmitterTypes/sphereParticleEmitter.js.map +1 -1
  761. package/Particles/Node/nodeParticleBuildState.d.ts +4 -4
  762. package/Particles/Node/nodeParticleBuildState.js +2 -2
  763. package/Particles/Node/nodeParticleBuildState.js.map +1 -1
  764. package/Particles/Node/nodeParticleSystemSet.d.ts +2 -2
  765. package/Particles/Node/nodeParticleSystemSet.helper.js +31 -31
  766. package/Particles/Node/nodeParticleSystemSet.helper.js.map +1 -1
  767. package/Particles/Node/nodeParticleSystemSet.js +8 -8
  768. package/Particles/Node/nodeParticleSystemSet.js.map +1 -1
  769. package/Particles/attractor.d.ts +1 -1
  770. package/Particles/attractor.js +1 -1
  771. package/Particles/attractor.js.map +1 -1
  772. package/Particles/computeShaderParticleSystem.pure.js +5 -1
  773. package/Particles/computeShaderParticleSystem.pure.js.map +1 -1
  774. package/Particles/flowMap.d.ts +7 -1
  775. package/Particles/flowMap.js +7 -1
  776. package/Particles/flowMap.js.map +1 -1
  777. package/Particles/gpuParticleSystem.pure.d.ts +1 -0
  778. package/Particles/gpuParticleSystem.pure.js +17 -1
  779. package/Particles/gpuParticleSystem.pure.js.map +1 -1
  780. package/Particles/particle.d.ts +2 -2
  781. package/Particles/particle.js +2 -2
  782. package/Particles/particle.js.map +1 -1
  783. package/Particles/particleHelper.js +5 -5
  784. package/Particles/particleHelper.js.map +1 -1
  785. package/Particles/particleSystem.functions.d.ts +1 -1
  786. package/Particles/particleSystem.functions.js +1 -1
  787. package/Particles/particleSystem.functions.js.map +1 -1
  788. package/Particles/particleSystemSet.d.ts +1 -1
  789. package/Particles/particleSystemSet.js +5 -5
  790. package/Particles/particleSystemSet.js.map +1 -1
  791. package/Particles/pointsCloudSystem.d.ts +1 -1
  792. package/Particles/pointsCloudSystem.js +6 -6
  793. package/Particles/pointsCloudSystem.js.map +1 -1
  794. package/Particles/solidParticle.d.ts +2 -2
  795. package/Particles/solidParticle.js +3 -3
  796. package/Particles/solidParticle.js.map +1 -1
  797. package/Particles/solidParticleSystem.d.ts +4 -4
  798. package/Particles/solidParticleSystem.js +7 -7
  799. package/Particles/solidParticleSystem.js.map +1 -1
  800. package/Particles/subEmitter.js +1 -1
  801. package/Particles/subEmitter.js.map +1 -1
  802. package/Particles/thinParticleSystem.function.js +2 -2
  803. package/Particles/thinParticleSystem.function.js.map +1 -1
  804. package/Physics/Plugins/cannonJSPlugin.d.ts +1 -1
  805. package/Physics/Plugins/cannonJSPlugin.js +1 -1
  806. package/Physics/Plugins/cannonJSPlugin.js.map +1 -1
  807. package/Physics/castingResult.d.ts +1 -1
  808. package/Physics/castingResult.js +1 -1
  809. package/Physics/castingResult.js.map +1 -1
  810. package/Physics/physicsHelper.d.ts +1 -1
  811. package/Physics/physicsHelper.js +4 -4
  812. package/Physics/physicsHelper.js.map +1 -1
  813. package/Physics/physicsImpostor.d.ts +1 -1
  814. package/Physics/physicsImpostor.js +1 -1
  815. package/Physics/physicsImpostor.js.map +1 -1
  816. package/Physics/physicsRaycastResult.d.ts +1 -1
  817. package/Physics/physicsRaycastResult.js +1 -1
  818. package/Physics/physicsRaycastResult.js.map +1 -1
  819. package/Physics/v1/Plugins/ammoJSPlugin.d.ts +2 -2
  820. package/Physics/v1/Plugins/ammoJSPlugin.js +5 -5
  821. package/Physics/v1/Plugins/ammoJSPlugin.js.map +1 -1
  822. package/Physics/v1/Plugins/oimoJSPlugin.d.ts +2 -2
  823. package/Physics/v1/Plugins/oimoJSPlugin.js +2 -2
  824. package/Physics/v1/Plugins/oimoJSPlugin.js.map +1 -1
  825. package/Physics/v1/physicsEngine.d.ts +1 -1
  826. package/Physics/v1/physicsEngine.js +1 -1
  827. package/Physics/v1/physicsEngine.js.map +1 -1
  828. package/Physics/v2/Plugins/havokPlugin.d.ts +14 -2
  829. package/Physics/v2/Plugins/havokPlugin.js +45 -7
  830. package/Physics/v2/Plugins/havokPlugin.js.map +1 -1
  831. package/Physics/v2/characterController.d.ts +1 -1
  832. package/Physics/v2/characterController.js +2 -2
  833. package/Physics/v2/characterController.js.map +1 -1
  834. package/Physics/v2/physicsAggregate.d.ts +3 -3
  835. package/Physics/v2/physicsAggregate.js +10 -6
  836. package/Physics/v2/physicsAggregate.js.map +1 -1
  837. package/Physics/v2/physicsBody.d.ts +1 -1
  838. package/Physics/v2/physicsBody.js +1 -1
  839. package/Physics/v2/physicsBody.js.map +1 -1
  840. package/Physics/v2/physicsEngine.d.ts +1 -1
  841. package/Physics/v2/physicsEngine.js +1 -1
  842. package/Physics/v2/physicsEngine.js.map +1 -1
  843. package/Physics/v2/physicsShape.d.ts +1 -1
  844. package/Physics/v2/physicsShape.js +1 -1
  845. package/Physics/v2/physicsShape.js.map +1 -1
  846. package/Physics/v2/ragdoll.d.ts +2 -2
  847. package/Physics/v2/ragdoll.js +2 -2
  848. package/Physics/v2/ragdoll.js.map +1 -1
  849. package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.pure.d.ts +1 -0
  850. package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.pure.js +8 -6
  851. package/PostProcesses/RenderPipeline/Pipelines/ssao2RenderingPipeline.pure.js.map +1 -1
  852. package/PostProcesses/RenderPipeline/Pipelines/thinSSRRenderingPipeline.js +1 -1
  853. package/PostProcesses/RenderPipeline/Pipelines/thinSSRRenderingPipeline.js.map +1 -1
  854. package/PostProcesses/RenderPipeline/postProcessRenderEffect.js +1 -1
  855. package/PostProcesses/RenderPipeline/postProcessRenderEffect.js.map +1 -1
  856. package/PostProcesses/RenderPipeline/postProcessRenderPipeline.js +3 -2
  857. package/PostProcesses/RenderPipeline/postProcessRenderPipeline.js.map +1 -1
  858. package/PostProcesses/bloomEffect.d.ts +1 -1
  859. package/PostProcesses/bloomEffect.js +4 -4
  860. package/PostProcesses/bloomEffect.js.map +1 -1
  861. package/PostProcesses/depthOfFieldEffect.d.ts +1 -1
  862. package/PostProcesses/depthOfFieldEffect.js +3 -3
  863. package/PostProcesses/depthOfFieldEffect.js.map +1 -1
  864. package/PostProcesses/depthOfFieldMergePostProcess.d.ts +1 -1
  865. package/PostProcesses/depthOfFieldMergePostProcess.js +1 -1
  866. package/PostProcesses/depthOfFieldMergePostProcess.js.map +1 -1
  867. package/PostProcesses/highlightsPostProcess.d.ts +1 -1
  868. package/PostProcesses/highlightsPostProcess.js +1 -1
  869. package/PostProcesses/highlightsPostProcess.js.map +1 -1
  870. package/PostProcesses/imageProcessingPostProcess.d.ts +1 -1
  871. package/PostProcesses/imageProcessingPostProcess.js +1 -1
  872. package/PostProcesses/imageProcessingPostProcess.js.map +1 -1
  873. package/PostProcesses/postProcessManager.d.ts +3 -0
  874. package/PostProcesses/postProcessManager.js +4 -1
  875. package/PostProcesses/postProcessManager.js.map +1 -1
  876. package/PostProcesses/subSurfaceScatteringPostProcess.pure.d.ts +1 -0
  877. package/PostProcesses/subSurfaceScatteringPostProcess.pure.js +10 -0
  878. package/PostProcesses/subSurfaceScatteringPostProcess.pure.js.map +1 -1
  879. package/PostProcesses/thinAnaglyphPostProcess.d.ts +1 -1
  880. package/PostProcesses/thinAnaglyphPostProcess.js +1 -1
  881. package/PostProcesses/thinAnaglyphPostProcess.js.map +1 -1
  882. package/PostProcesses/thinBlackAndWhitePostProcess.d.ts +1 -1
  883. package/PostProcesses/thinBlackAndWhitePostProcess.js +1 -1
  884. package/PostProcesses/thinBlackAndWhitePostProcess.js.map +1 -1
  885. package/PostProcesses/thinBloomEffect.js +1 -1
  886. package/PostProcesses/thinBloomEffect.js.map +1 -1
  887. package/PostProcesses/thinBloomMergePostProcess.d.ts +1 -1
  888. package/PostProcesses/thinBloomMergePostProcess.js +1 -1
  889. package/PostProcesses/thinBloomMergePostProcess.js.map +1 -1
  890. package/PostProcesses/thinBlurPostProcess.d.ts +1 -1
  891. package/PostProcesses/thinBlurPostProcess.js +1 -1
  892. package/PostProcesses/thinBlurPostProcess.js.map +1 -1
  893. package/PostProcesses/thinChromaticAberrationPostProcess.d.ts +2 -2
  894. package/PostProcesses/thinChromaticAberrationPostProcess.js +2 -2
  895. package/PostProcesses/thinChromaticAberrationPostProcess.js.map +1 -1
  896. package/PostProcesses/thinCircleOfConfusionPostProcess.d.ts +1 -1
  897. package/PostProcesses/thinCircleOfConfusionPostProcess.js +1 -1
  898. package/PostProcesses/thinCircleOfConfusionPostProcess.js.map +1 -1
  899. package/PostProcesses/thinColorCorrectionPostProcess.d.ts +1 -1
  900. package/PostProcesses/thinColorCorrectionPostProcess.js +2 -2
  901. package/PostProcesses/thinColorCorrectionPostProcess.js.map +1 -1
  902. package/PostProcesses/thinConvolutionPostProcess.d.ts +1 -1
  903. package/PostProcesses/thinConvolutionPostProcess.js +1 -1
  904. package/PostProcesses/thinConvolutionPostProcess.js.map +1 -1
  905. package/PostProcesses/thinCustomPostProcess.d.ts +1 -1
  906. package/PostProcesses/thinCustomPostProcess.js +1 -1
  907. package/PostProcesses/thinCustomPostProcess.js.map +1 -1
  908. package/PostProcesses/thinDepthOfFieldEffect.d.ts +3 -0
  909. package/PostProcesses/thinDepthOfFieldEffect.js +4 -1
  910. package/PostProcesses/thinDepthOfFieldEffect.js.map +1 -1
  911. package/PostProcesses/thinDepthOfFieldMergePostProcess.d.ts +1 -1
  912. package/PostProcesses/thinDepthOfFieldMergePostProcess.js +1 -1
  913. package/PostProcesses/thinDepthOfFieldMergePostProcess.js.map +1 -1
  914. package/PostProcesses/thinExtractHighlightsPostProcess.d.ts +1 -1
  915. package/PostProcesses/thinExtractHighlightsPostProcess.js +1 -1
  916. package/PostProcesses/thinExtractHighlightsPostProcess.js.map +1 -1
  917. package/PostProcesses/thinFXAAPostProcess.d.ts +2 -2
  918. package/PostProcesses/thinFXAAPostProcess.js +2 -2
  919. package/PostProcesses/thinFXAAPostProcess.js.map +1 -1
  920. package/PostProcesses/thinFilterPostProcess.d.ts +2 -2
  921. package/PostProcesses/thinFilterPostProcess.js +2 -2
  922. package/PostProcesses/thinFilterPostProcess.js.map +1 -1
  923. package/PostProcesses/thinGrainPostProcess.d.ts +1 -1
  924. package/PostProcesses/thinGrainPostProcess.js +1 -1
  925. package/PostProcesses/thinGrainPostProcess.js.map +1 -1
  926. package/PostProcesses/thinImageProcessingPostProcess.d.ts +2 -2
  927. package/PostProcesses/thinImageProcessingPostProcess.js +2 -2
  928. package/PostProcesses/thinImageProcessingPostProcess.js.map +1 -1
  929. package/PostProcesses/thinMotionBlurPostProcess.d.ts +1 -1
  930. package/PostProcesses/thinMotionBlurPostProcess.js +2 -2
  931. package/PostProcesses/thinMotionBlurPostProcess.js.map +1 -1
  932. package/PostProcesses/thinPassPostProcess.d.ts +1 -1
  933. package/PostProcesses/thinPassPostProcess.js +1 -1
  934. package/PostProcesses/thinPassPostProcess.js.map +1 -1
  935. package/PostProcesses/thinSSAO2BlurPostProcess.d.ts +1 -1
  936. package/PostProcesses/thinSSAO2BlurPostProcess.js +1 -1
  937. package/PostProcesses/thinSSAO2BlurPostProcess.js.map +1 -1
  938. package/PostProcesses/thinSSAO2CombinePostProcess.d.ts +1 -1
  939. package/PostProcesses/thinSSAO2CombinePostProcess.js +2 -2
  940. package/PostProcesses/thinSSAO2CombinePostProcess.js.map +1 -1
  941. package/PostProcesses/thinSSAO2PostProcess.d.ts +7 -2
  942. package/PostProcesses/thinSSAO2PostProcess.js +36 -4
  943. package/PostProcesses/thinSSAO2PostProcess.js.map +1 -1
  944. package/PostProcesses/thinSSRBlurCombinerPostProcess.d.ts +1 -1
  945. package/PostProcesses/thinSSRBlurCombinerPostProcess.js +2 -2
  946. package/PostProcesses/thinSSRBlurCombinerPostProcess.js.map +1 -1
  947. package/PostProcesses/thinSSRBlurPostProcess.d.ts +2 -2
  948. package/PostProcesses/thinSSRBlurPostProcess.js +2 -2
  949. package/PostProcesses/thinSSRBlurPostProcess.js.map +1 -1
  950. package/PostProcesses/thinSSRPostProcess.d.ts +1 -1
  951. package/PostProcesses/thinSSRPostProcess.js +2 -2
  952. package/PostProcesses/thinSSRPostProcess.js.map +1 -1
  953. package/PostProcesses/thinScreenSpaceCurvaturePostProcess.d.ts +1 -1
  954. package/PostProcesses/thinScreenSpaceCurvaturePostProcess.js +1 -1
  955. package/PostProcesses/thinScreenSpaceCurvaturePostProcess.js.map +1 -1
  956. package/PostProcesses/thinSharpenPostProcess.d.ts +1 -1
  957. package/PostProcesses/thinSharpenPostProcess.js +1 -1
  958. package/PostProcesses/thinSharpenPostProcess.js.map +1 -1
  959. package/PostProcesses/thinTAAPostProcess.d.ts +3 -3
  960. package/PostProcesses/thinTAAPostProcess.js +4 -4
  961. package/PostProcesses/thinTAAPostProcess.js.map +1 -1
  962. package/PostProcesses/thinTonemapPostProcess.d.ts +1 -1
  963. package/PostProcesses/thinTonemapPostProcess.js +1 -1
  964. package/PostProcesses/thinTonemapPostProcess.js.map +1 -1
  965. package/PostProcesses/vrDistortionCorrectionPostProcess.d.ts +1 -1
  966. package/PostProcesses/vrDistortionCorrectionPostProcess.js +3 -3
  967. package/PostProcesses/vrDistortionCorrectionPostProcess.js.map +1 -1
  968. package/Rendering/IBLShadows/iblShadowsAccumulationPass.d.ts +2 -2
  969. package/Rendering/IBLShadows/iblShadowsAccumulationPass.js +4 -4
  970. package/Rendering/IBLShadows/iblShadowsAccumulationPass.js.map +1 -1
  971. package/Rendering/IBLShadows/iblShadowsSpatialBlurPass.d.ts +2 -2
  972. package/Rendering/IBLShadows/iblShadowsSpatialBlurPass.js +4 -4
  973. package/Rendering/IBLShadows/iblShadowsSpatialBlurPass.js.map +1 -1
  974. package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.d.ts +3 -3
  975. package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.js +4 -4
  976. package/Rendering/IBLShadows/iblShadowsVoxelTracingPass.js.map +1 -1
  977. package/Rendering/depthPeelingRenderer.d.ts +1 -1
  978. package/Rendering/depthPeelingRenderer.js +2 -2
  979. package/Rendering/depthPeelingRenderer.js.map +1 -1
  980. package/Rendering/fluidRenderer/fluidRenderingObject.d.ts +1 -1
  981. package/Rendering/fluidRenderer/fluidRenderingObject.js +1 -1
  982. package/Rendering/fluidRenderer/fluidRenderingObject.js.map +1 -1
  983. package/Rendering/fluidRenderer/fluidRenderingObjectCustomParticles.d.ts +1 -1
  984. package/Rendering/fluidRenderer/fluidRenderingObjectCustomParticles.js +2 -2
  985. package/Rendering/fluidRenderer/fluidRenderingObjectCustomParticles.js.map +1 -1
  986. package/Rendering/fluidRenderer/fluidRenderingTargetRenderer.d.ts +3 -3
  987. package/Rendering/fluidRenderer/fluidRenderingTargetRenderer.js +3 -3
  988. package/Rendering/fluidRenderer/fluidRenderingTargetRenderer.js.map +1 -1
  989. package/Rendering/fluidRenderer/fluidRenderingTextures.d.ts +2 -2
  990. package/Rendering/fluidRenderer/fluidRenderingTextures.js +3 -3
  991. package/Rendering/fluidRenderer/fluidRenderingTextures.js.map +1 -1
  992. package/Rendering/iblCdfGenerator.d.ts +3 -3
  993. package/Rendering/iblCdfGenerator.js +5 -5
  994. package/Rendering/iblCdfGenerator.js.map +1 -1
  995. package/Rendering/renderingGroup.js +1 -1
  996. package/Rendering/renderingGroup.js.map +1 -1
  997. package/Rendering/subSurfaceConfiguration.d.ts +2 -2
  998. package/Rendering/subSurfaceConfiguration.js +2 -2
  999. package/Rendering/subSurfaceConfiguration.js.map +1 -1
  1000. package/Rendering/utilityLayerRenderer.d.ts +2 -2
  1001. package/Rendering/utilityLayerRenderer.js +4 -4
  1002. package/Rendering/utilityLayerRenderer.js.map +1 -1
  1003. package/Shaders/ssao2.fragment.js +10 -2
  1004. package/Shaders/ssao2.fragment.js.map +1 -1
  1005. package/ShadersWGSL/gpuRenderParticles.fragment.d.ts +5 -0
  1006. package/ShadersWGSL/gpuRenderParticles.fragment.js +50 -0
  1007. package/ShadersWGSL/gpuRenderParticles.fragment.js.map +1 -0
  1008. package/ShadersWGSL/gpuRenderParticles.vertex.d.ts +5 -0
  1009. package/ShadersWGSL/gpuRenderParticles.vertex.js +120 -0
  1010. package/ShadersWGSL/gpuRenderParticles.vertex.js.map +1 -0
  1011. package/ShadersWGSL/noise.fragment.d.ts +5 -0
  1012. package/ShadersWGSL/noise.fragment.js +18 -0
  1013. package/ShadersWGSL/noise.fragment.js.map +1 -0
  1014. package/ShadersWGSL/ssao2.fragment.js +10 -2
  1015. package/ShadersWGSL/ssao2.fragment.js.map +1 -1
  1016. package/SmartAssets/smartAssetSerializer.js +1 -1
  1017. package/SmartAssets/smartAssetSerializer.js.map +1 -1
  1018. package/Sprites/sprite.d.ts +2 -2
  1019. package/Sprites/sprite.js +2 -2
  1020. package/Sprites/sprite.js.map +1 -1
  1021. package/Sprites/spriteManager.d.ts +2 -2
  1022. package/Sprites/spriteManager.js +4 -5
  1023. package/Sprites/spriteManager.js.map +1 -1
  1024. package/Sprites/spritePackedManager.js +1 -1
  1025. package/Sprites/spritePackedManager.js.map +1 -1
  1026. package/Sprites/spriteRenderer.js +2 -2
  1027. package/Sprites/spriteRenderer.js.map +1 -1
  1028. package/XR/features/WebXRHitTestLegacy.d.ts +1 -1
  1029. package/XR/features/WebXRHitTestLegacy.js +2 -2
  1030. package/XR/features/WebXRHitTestLegacy.js.map +1 -1
  1031. package/XR/motionController/webXRAbstractMotionController.js +2 -2
  1032. package/XR/motionController/webXRAbstractMotionController.js.map +1 -1
  1033. package/XR/motionController/webXRGenericMotionController.js +2 -2
  1034. package/XR/motionController/webXRGenericMotionController.js.map +1 -1
  1035. package/XR/motionController/webXRProfiledMotionController.js +4 -4
  1036. package/XR/motionController/webXRProfiledMotionController.js.map +1 -1
  1037. package/XR/webXRCamera.d.ts +3 -3
  1038. package/XR/webXRCamera.js +4 -4
  1039. package/XR/webXRCamera.js.map +1 -1
  1040. package/XR/webXRDefaultExperience.d.ts +4 -4
  1041. package/XR/webXRDefaultExperience.js +4 -4
  1042. package/XR/webXRDefaultExperience.js.map +1 -1
  1043. package/XR/webXREnterExitUI.js +1 -1
  1044. package/XR/webXREnterExitUI.js.map +1 -1
  1045. package/XR/webXRExperienceHelper.js +2 -2
  1046. package/XR/webXRExperienceHelper.js.map +1 -1
  1047. package/XR/webXRFeaturesManager.d.ts +47 -0
  1048. package/XR/webXRFeaturesManager.js +1 -1
  1049. package/XR/webXRFeaturesManager.js.map +1 -1
  1050. package/XR/webXRInput.js +1 -1
  1051. package/XR/webXRInput.js.map +1 -1
  1052. package/XR/webXRInputSource.js +4 -4
  1053. package/XR/webXRInputSource.js.map +1 -1
  1054. package/XR/webXRManagedOutputCanvas.js +1 -1
  1055. package/XR/webXRManagedOutputCanvas.js.map +1 -1
  1056. package/XR/webXRRenderTargetTextureProvider.d.ts +1 -1
  1057. package/XR/webXRRenderTargetTextureProvider.js +1 -1
  1058. package/XR/webXRRenderTargetTextureProvider.js.map +1 -1
  1059. package/assetContainer.d.ts +4 -4
  1060. package/assetContainer.js +6 -6
  1061. package/assetContainer.js.map +1 -1
  1062. package/node.d.ts +1 -1
  1063. package/node.js +6 -2
  1064. package/node.js.map +1 -1
  1065. package/package.json +44 -174
package/XR/webXRCamera.js CHANGED
@@ -1,7 +1,7 @@
1
- import { Vector3, Matrix, Quaternion, TmpVectors } from "../Maths/math.vector.js";
2
- import { Camera } from "../Cameras/camera.js";
3
- import { FreeCamera } from "../Cameras/freeCamera.js";
4
- import { TargetCamera } from "../Cameras/targetCamera.js";
1
+ import { Vector3, Matrix, Quaternion, TmpVectors } from "../Maths/math.vector.pure.js";
2
+ import { Camera } from "../Cameras/camera.pure.js";
3
+ import { FreeCamera } from "../Cameras/freeCamera.pure.js";
4
+ import { TargetCamera } from "../Cameras/targetCamera.pure.js";
5
5
  import { Viewport } from "../Maths/math.viewport.js";
6
6
  import { Observable } from "../Misc/observable.js";
7
7
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"webXRCamera.js","sourceRoot":"","sources":["../../../../dev/core/src/XR/webXRCamera.ts"],"names":[],"mappings":"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","sourcesContent":["import { Vector3, Matrix, Quaternion, TmpVectors } from \"../Maths/math.vector\";\r\nimport { type Scene } from \"../scene\";\r\nimport { Camera } from \"../Cameras/camera\";\r\nimport { FreeCamera } from \"../Cameras/freeCamera\";\r\nimport { TargetCamera } from \"../Cameras/targetCamera\";\r\nimport { type WebXRSessionManager } from \"./webXRSessionManager\";\r\nimport { Viewport } from \"../Maths/math.viewport\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport { WebXRTrackingState } from \"./webXRTypes\";\r\n\r\n/**\r\n * WebXR Camera which holds the views for the xrSession\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/webXR/webXRCamera\r\n */\r\nexport class WebXRCamera extends FreeCamera {\r\n private static _ScaleReadOnly = Vector3.One();\r\n\r\n private _firstFrame = false;\r\n private _referenceQuaternion: Quaternion = Quaternion.Identity();\r\n private _referencedPosition: Vector3 = new Vector3();\r\n private _trackingState: WebXRTrackingState = WebXRTrackingState.NOT_TRACKING;\r\n\r\n private _onWorldScaleFactorChanged = () => {\r\n // only run if in session\r\n if (!this._xrSessionManager.currentFrame) {\r\n return;\r\n }\r\n this._updateDepthNearFar();\r\n };\r\n\r\n /**\r\n * This will be triggered after the first XR Frame initialized the camera,\r\n * including the right number of views and their rendering parameters\r\n */\r\n public onXRCameraInitializedObservable = new Observable<WebXRCamera>();\r\n\r\n /**\r\n * Observable raised before camera teleportation\r\n * @deprecated use onBeforeCameraTeleport of the teleportation feature instead\r\n */\r\n public onBeforeCameraTeleport = new Observable<Vector3>();\r\n\r\n /**\r\n * Observable raised after camera teleportation\r\n * @deprecated use onAfterCameraTeleport of the teleportation feature instead\r\n */\r\n public onAfterCameraTeleport = new Observable<Vector3>();\r\n\r\n /**\r\n * Notifies when the camera's tracking state has changed.\r\n * Notice - will also be triggered when tracking has started (at the beginning of the session)\r\n */\r\n public onTrackingStateChanged = new Observable<WebXRTrackingState>();\r\n\r\n /**\r\n * Should position compensation execute on first frame.\r\n * This is used when copying the position from a native (non XR) camera\r\n */\r\n public compensateOnFirstFrame: boolean = true;\r\n\r\n /**\r\n * The last XRViewerPose from the current XRFrame\r\n * @internal\r\n */\r\n public _lastXRViewerPose?: XRViewerPose;\r\n\r\n /**\r\n * webXRCamera relies on rotationQuaternion and doesn't use camera rotation property\r\n */\r\n public override rotationQuaternion: Quaternion;\r\n\r\n /**\r\n * Creates a new webXRCamera, this should only be set at the camera after it has been updated by the xrSessionManager\r\n * @param name the name of the camera\r\n * @param scene the scene to add the camera to\r\n * @param _xrSessionManager a constructed xr session manager\r\n */\r\n constructor(\r\n name: string,\r\n scene: Scene,\r\n private _xrSessionManager: WebXRSessionManager\r\n ) {\r\n super(name, Vector3.Zero(), scene);\r\n\r\n // Initial camera configuration\r\n this.minZ = 0.1;\r\n this.rotationQuaternion = new Quaternion();\r\n this.cameraRigMode = Camera.RIG_MODE_CUSTOM;\r\n this.updateUpVectorFromRotation = true;\r\n this._updateNumberOfRigCameras(1);\r\n // freeze projection matrix, which will be copied later\r\n this.freezeProjectionMatrix();\r\n this._deferOnly = true;\r\n\r\n this._xrSessionManager.onXRSessionInit.add(() => {\r\n this._referencedPosition.copyFromFloats(0, 0, 0);\r\n this._referenceQuaternion.copyFromFloats(0, 0, 0, 1);\r\n // first frame - camera's y position should be 0 for the correct offset\r\n this._firstFrame = this.compensateOnFirstFrame;\r\n });\r\n\r\n this._xrSessionManager.onWorldScaleFactorChangedObservable.add(this._onWorldScaleFactorChanged);\r\n\r\n // Check transformation changes on each frame. Callback is added to be first so that the transformation will be\r\n // applied to the rest of the elements using the referenceSpace object\r\n this._xrSessionManager.onXRFrameObservable.add(\r\n () => {\r\n if (this._firstFrame) {\r\n this._updateFromXRSession();\r\n }\r\n if (this.onXRCameraInitializedObservable.hasObservers()) {\r\n this.onXRCameraInitializedObservable.notifyObservers(this);\r\n this.onXRCameraInitializedObservable.clear();\r\n }\r\n\r\n if (this._deferredUpdated) {\r\n this.position.copyFrom(this._deferredPositionUpdate);\r\n this.rotationQuaternion.copyFrom(this._deferredRotationQuaternionUpdate);\r\n }\r\n\r\n this._updateReferenceSpace();\r\n this._updateFromXRSession();\r\n },\r\n undefined,\r\n true\r\n );\r\n }\r\n\r\n /**\r\n * Get the current XR tracking state of the camera\r\n */\r\n public get trackingState(): WebXRTrackingState {\r\n return this._trackingState;\r\n }\r\n\r\n private _setTrackingState(newState: WebXRTrackingState) {\r\n if (this._trackingState !== newState) {\r\n this._trackingState = newState;\r\n this.onTrackingStateChanged.notifyObservers(newState);\r\n }\r\n }\r\n\r\n /**\r\n * Return the user's height, unrelated to the current ground.\r\n * This will be the y position of this camera, when ground level is 0.\r\n *\r\n * Note - this value is multiplied by the worldScalingFactor (if set), so it will be in the same units as the scene.\r\n */\r\n public get realWorldHeight(): number {\r\n const basePose = this._xrSessionManager.currentFrame && this._xrSessionManager.currentFrame.getViewerPose(this._xrSessionManager.baseReferenceSpace);\r\n if (basePose && basePose.transform) {\r\n return basePose.transform.position.y * this._xrSessionManager.worldScalingFactor;\r\n } else {\r\n return 0;\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _updateForDualEyeDebugging(/*pupilDistance = 0.01*/) {\r\n // Create initial camera rigs\r\n this._updateNumberOfRigCameras(2);\r\n this.rigCameras[0].viewport = new Viewport(0, 0, 0.5, 1.0);\r\n // this.rigCameras[0].position.x = -pupilDistance / 2;\r\n this.rigCameras[0].outputRenderTarget = null;\r\n this.rigCameras[1].viewport = new Viewport(0.5, 0, 0.5, 1.0);\r\n // this.rigCameras[1].position.x = pupilDistance / 2;\r\n this.rigCameras[1].outputRenderTarget = null;\r\n }\r\n\r\n /**\r\n * Sets this camera's transformation based on a non-vr camera\r\n * @param otherCamera the non-vr camera to copy the transformation from\r\n * @param resetToBaseReferenceSpace should XR reset to the base reference space\r\n */\r\n public setTransformationFromNonVRCamera(otherCamera: Camera = this.getScene().activeCamera!, resetToBaseReferenceSpace: boolean = true) {\r\n if (!otherCamera || otherCamera === this) {\r\n return;\r\n }\r\n const mat = otherCamera.computeWorldMatrix();\r\n mat.decompose(undefined, this.rotationQuaternion, this.position);\r\n // set the ground level\r\n this.position.y = 0;\r\n Quaternion.FromEulerAnglesToRef(0, this.rotationQuaternion.toEulerAngles().y, 0, this.rotationQuaternion);\r\n this._firstFrame = true;\r\n if (resetToBaseReferenceSpace) {\r\n this._xrSessionManager.resetReferenceSpace();\r\n }\r\n }\r\n\r\n /**\r\n * Gets the current instance class name (\"WebXRCamera\").\r\n * @returns the class name\r\n */\r\n public override getClassName(): string {\r\n return \"WebXRCamera\";\r\n }\r\n\r\n /**\r\n * Set the target for the camera to look at.\r\n * Note that this only rotates around the Y axis, as opposed to the default behavior of other cameras\r\n * @param target the target to set the camera to look at\r\n */\r\n public override setTarget(target: Vector3): void {\r\n // only rotate around the y axis!\r\n const tmpVector = TmpVectors.Vector3[1];\r\n target.subtractToRef(this.position, tmpVector);\r\n tmpVector.y = 0;\r\n tmpVector.normalize();\r\n const yRotation = Math.atan2(tmpVector.x, tmpVector.z) + (this._scene.useRightHandedSystem ? Math.PI : 0);\r\n this.rotationQuaternion.toEulerAnglesToRef(tmpVector);\r\n Quaternion.FromEulerAnglesToRef(tmpVector.x, yRotation, tmpVector.z, this.rotationQuaternion);\r\n }\r\n\r\n public override dispose() {\r\n this._xrSessionManager.onWorldScaleFactorChangedObservable.removeCallback(this._onWorldScaleFactorChanged);\r\n super.dispose();\r\n this._lastXRViewerPose = undefined;\r\n this.onTrackingStateChanged.clear();\r\n }\r\n\r\n private _updateDepthNearFar() {\r\n const far = (this.maxZ || 10000) * this._xrSessionManager.worldScalingFactor;\r\n const xrRenderState: XRRenderStateInit = {\r\n // if maxZ is 0 it should be \"Infinity\", but it doesn't work with the WebXR API. Setting to a large number.\r\n depthFar: far,\r\n depthNear: this.minZ,\r\n };\r\n\r\n this._xrSessionManager.updateRenderState(xrRenderState);\r\n this._cache.minZ = this.minZ;\r\n this._cache.maxZ = far;\r\n }\r\n\r\n private _updateFromXRSession() {\r\n const pose = this._xrSessionManager.currentFrame && this._xrSessionManager.currentFrame.getViewerPose(this._xrSessionManager.referenceSpace);\r\n this._lastXRViewerPose = pose || undefined;\r\n if (!pose) {\r\n this._setTrackingState(WebXRTrackingState.NOT_TRACKING);\r\n return;\r\n }\r\n\r\n // Set the tracking state. if it didn't change it is a no-op\r\n const trackingState = pose.emulatedPosition ? WebXRTrackingState.TRACKING_LOST : WebXRTrackingState.TRACKING;\r\n this._setTrackingState(trackingState);\r\n\r\n // check min/max Z and update if not the same as in cache\r\n if (this.minZ !== this._cache.minZ || this.maxZ !== this._cache.maxZ) {\r\n this._updateDepthNearFar();\r\n }\r\n\r\n if (pose.transform) {\r\n const orientation = pose.transform.orientation;\r\n if (pose.transform.orientation.x === undefined) {\r\n // Babylon native polyfill can return an undefined orientation value\r\n // When not initialized\r\n return;\r\n }\r\n const pos = pose.transform.position;\r\n this._referencedPosition.set(pos.x, pos.y, pos.z).scaleInPlace(this._xrSessionManager.worldScalingFactor);\r\n\r\n this._referenceQuaternion.set(orientation.x, orientation.y, orientation.z, orientation.w);\r\n if (!this._scene.useRightHandedSystem) {\r\n this._referencedPosition.z *= -1;\r\n this._referenceQuaternion.z *= -1;\r\n this._referenceQuaternion.w *= -1;\r\n }\r\n\r\n if (this._firstFrame) {\r\n this._firstFrame = false;\r\n // we have the XR reference, now use this to find the offset to get the camera to be\r\n // in the right position\r\n\r\n // set the height to correlate to the current height\r\n this.position.y += this._referencedPosition.y;\r\n // avoid using the head rotation on the first frame.\r\n this._referenceQuaternion.copyFromFloats(0, 0, 0, 1);\r\n } else {\r\n // update position and rotation as reference\r\n this.rotationQuaternion.copyFrom(this._referenceQuaternion);\r\n this.position.copyFrom(this._referencedPosition);\r\n }\r\n }\r\n\r\n // Update camera rigs\r\n if (this.rigCameras.length !== pose.views.length) {\r\n this._updateNumberOfRigCameras(pose.views.length);\r\n }\r\n\r\n for (let i = 0; i < pose.views.length; i++) {\r\n const view = pose.views[i];\r\n const currentRig = <TargetCamera>this.rigCameras[i];\r\n // update right and left, where applicable\r\n if (!currentRig.isLeftCamera && !currentRig.isRightCamera) {\r\n if (view.eye === \"right\") {\r\n currentRig._isRightCamera = true;\r\n } else if (view.eye === \"left\") {\r\n currentRig._isLeftCamera = true;\r\n }\r\n }\r\n // add any custom render targets to this camera, if available in the scene\r\n const customRenderTargets = this.getScene().customRenderTargets;\r\n // use a for loop\r\n for (let i = 0; i < customRenderTargets.length; i++) {\r\n const rt = customRenderTargets[i];\r\n // make sure we don't add the same render target twice\r\n if (currentRig.customRenderTargets.indexOf(rt) === -1) {\r\n currentRig.customRenderTargets.push(rt);\r\n }\r\n }\r\n // Update view/projection matrix\r\n const pos = view.transform.position;\r\n const orientation = view.transform.orientation;\r\n\r\n currentRig.parent = this.parent;\r\n\r\n currentRig.position.set(pos.x, pos.y, pos.z).scaleInPlace(this._xrSessionManager.worldScalingFactor);\r\n currentRig.rotationQuaternion?.set(orientation.x, orientation.y, orientation.z, orientation.w);\r\n if (!this._scene.useRightHandedSystem && currentRig.rotationQuaternion) {\r\n currentRig.position.z *= -1;\r\n currentRig.rotationQuaternion.z *= -1;\r\n currentRig.rotationQuaternion.w *= -1;\r\n }\r\n Matrix.FromFloat32ArrayToRefScaled(view.projectionMatrix, 0, 1, currentRig._projectionMatrix);\r\n\r\n if (!this._scene.useRightHandedSystem) {\r\n currentRig._projectionMatrix.toggleProjectionMatrixHandInPlace();\r\n }\r\n\r\n // fov\r\n const fov = Math.atan2(1, view.projectionMatrix[5]) * 2;\r\n currentRig.fov = fov;\r\n // first camera?\r\n if (i === 0) {\r\n this.fov = fov;\r\n this._projectionMatrix.copyFrom(currentRig._projectionMatrix);\r\n }\r\n\r\n const renderTargetTexture = this._xrSessionManager.getRenderTargetTextureForView(view);\r\n this._renderingMultiview = renderTargetTexture?._texture?.isMultiview || false;\r\n if (this._renderingMultiview) {\r\n // For multiview, the render target texture is the same per-view (just the slice index is different),\r\n // so we only need to set the output render target once for the rig parent.\r\n if (i == 0) {\r\n this._xrSessionManager.trySetViewportForView(this.viewport, view);\r\n this.outputRenderTarget = renderTargetTexture;\r\n }\r\n } else {\r\n // Update viewport\r\n this._xrSessionManager.trySetViewportForView(currentRig.viewport, view);\r\n\r\n // Set cameras to render to the session's render target\r\n currentRig.outputRenderTarget = renderTargetTexture || this._xrSessionManager.getRenderTargetTextureForView(view);\r\n }\r\n\r\n // Replicate parent rig camera behavior\r\n currentRig.layerMask = this.layerMask;\r\n }\r\n }\r\n\r\n private _updateNumberOfRigCameras(viewCount = 1) {\r\n while (this.rigCameras.length < viewCount) {\r\n const newCamera = new TargetCamera(\"XR-RigCamera: \" + this.rigCameras.length, Vector3.Zero(), this.getScene());\r\n newCamera.minZ = 0.1;\r\n newCamera.rotationQuaternion = new Quaternion();\r\n newCamera.updateUpVectorFromRotation = true;\r\n newCamera.isRigCamera = true;\r\n newCamera.rigParent = this;\r\n // do not compute projection matrix, provided by XR\r\n newCamera.freezeProjectionMatrix();\r\n this.rigCameras.push(newCamera);\r\n }\r\n while (this.rigCameras.length > viewCount) {\r\n const removedCamera = this.rigCameras.pop();\r\n if (removedCamera) {\r\n removedCamera.dispose();\r\n }\r\n }\r\n }\r\n\r\n private _updateReferenceSpace() {\r\n // were position & rotation updated OUTSIDE of the xr update loop\r\n if (!this.position.equals(this._referencedPosition) || !this.rotationQuaternion.equals(this._referenceQuaternion)) {\r\n const referencedMat = TmpVectors.Matrix[0];\r\n const poseMat = TmpVectors.Matrix[1];\r\n const transformMat = TmpVectors.Matrix[2];\r\n\r\n Matrix.ComposeToRef(WebXRCamera._ScaleReadOnly, this._referenceQuaternion, this._referencedPosition, referencedMat);\r\n Matrix.ComposeToRef(WebXRCamera._ScaleReadOnly, this.rotationQuaternion, this.position, poseMat);\r\n referencedMat.invert().multiplyToRef(poseMat, transformMat);\r\n transformMat.invert();\r\n\r\n if (!this._scene.useRightHandedSystem) {\r\n transformMat.toggleModelMatrixHandInPlace();\r\n }\r\n\r\n transformMat.decompose(undefined, this._referenceQuaternion, this._referencedPosition);\r\n const transform = new XRRigidTransform(\r\n {\r\n x: this._referencedPosition.x / this._xrSessionManager.worldScalingFactor,\r\n y: this._referencedPosition.y / this._xrSessionManager.worldScalingFactor,\r\n z: this._referencedPosition.z / this._xrSessionManager.worldScalingFactor,\r\n w: 1,\r\n },\r\n {\r\n x: this._referenceQuaternion.x,\r\n y: this._referenceQuaternion.y,\r\n z: this._referenceQuaternion.z,\r\n w: this._referenceQuaternion.w,\r\n }\r\n );\r\n this._xrSessionManager.referenceSpace = this._xrSessionManager.referenceSpace.getOffsetReferenceSpace(transform);\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"webXRCamera.js","sourceRoot":"","sources":["../../../../dev/core/src/XR/webXRCamera.ts"],"names":[],"mappings":"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","sourcesContent":["import { Vector3, Matrix, Quaternion, TmpVectors } from \"../Maths/math.vector.pure\";\r\nimport { type Scene } from \"../scene\";\r\nimport { Camera } from \"../Cameras/camera.pure\";\r\nimport { FreeCamera } from \"../Cameras/freeCamera.pure\";\r\nimport { TargetCamera } from \"../Cameras/targetCamera.pure\";\r\nimport { type WebXRSessionManager } from \"./webXRSessionManager\";\r\nimport { Viewport } from \"../Maths/math.viewport\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport { WebXRTrackingState } from \"./webXRTypes\";\r\n\r\n/**\r\n * WebXR Camera which holds the views for the xrSession\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/webXR/webXRCamera\r\n */\r\nexport class WebXRCamera extends FreeCamera {\r\n private static _ScaleReadOnly = Vector3.One();\r\n\r\n private _firstFrame = false;\r\n private _referenceQuaternion: Quaternion = Quaternion.Identity();\r\n private _referencedPosition: Vector3 = new Vector3();\r\n private _trackingState: WebXRTrackingState = WebXRTrackingState.NOT_TRACKING;\r\n\r\n private _onWorldScaleFactorChanged = () => {\r\n // only run if in session\r\n if (!this._xrSessionManager.currentFrame) {\r\n return;\r\n }\r\n this._updateDepthNearFar();\r\n };\r\n\r\n /**\r\n * This will be triggered after the first XR Frame initialized the camera,\r\n * including the right number of views and their rendering parameters\r\n */\r\n public onXRCameraInitializedObservable = new Observable<WebXRCamera>();\r\n\r\n /**\r\n * Observable raised before camera teleportation\r\n * @deprecated use onBeforeCameraTeleport of the teleportation feature instead\r\n */\r\n public onBeforeCameraTeleport = new Observable<Vector3>();\r\n\r\n /**\r\n * Observable raised after camera teleportation\r\n * @deprecated use onAfterCameraTeleport of the teleportation feature instead\r\n */\r\n public onAfterCameraTeleport = new Observable<Vector3>();\r\n\r\n /**\r\n * Notifies when the camera's tracking state has changed.\r\n * Notice - will also be triggered when tracking has started (at the beginning of the session)\r\n */\r\n public onTrackingStateChanged = new Observable<WebXRTrackingState>();\r\n\r\n /**\r\n * Should position compensation execute on first frame.\r\n * This is used when copying the position from a native (non XR) camera\r\n */\r\n public compensateOnFirstFrame: boolean = true;\r\n\r\n /**\r\n * The last XRViewerPose from the current XRFrame\r\n * @internal\r\n */\r\n public _lastXRViewerPose?: XRViewerPose;\r\n\r\n /**\r\n * webXRCamera relies on rotationQuaternion and doesn't use camera rotation property\r\n */\r\n public override rotationQuaternion: Quaternion;\r\n\r\n /**\r\n * Creates a new webXRCamera, this should only be set at the camera after it has been updated by the xrSessionManager\r\n * @param name the name of the camera\r\n * @param scene the scene to add the camera to\r\n * @param _xrSessionManager a constructed xr session manager\r\n */\r\n constructor(\r\n name: string,\r\n scene: Scene,\r\n private _xrSessionManager: WebXRSessionManager\r\n ) {\r\n super(name, Vector3.Zero(), scene);\r\n\r\n // Initial camera configuration\r\n this.minZ = 0.1;\r\n this.rotationQuaternion = new Quaternion();\r\n this.cameraRigMode = Camera.RIG_MODE_CUSTOM;\r\n this.updateUpVectorFromRotation = true;\r\n this._updateNumberOfRigCameras(1);\r\n // freeze projection matrix, which will be copied later\r\n this.freezeProjectionMatrix();\r\n this._deferOnly = true;\r\n\r\n this._xrSessionManager.onXRSessionInit.add(() => {\r\n this._referencedPosition.copyFromFloats(0, 0, 0);\r\n this._referenceQuaternion.copyFromFloats(0, 0, 0, 1);\r\n // first frame - camera's y position should be 0 for the correct offset\r\n this._firstFrame = this.compensateOnFirstFrame;\r\n });\r\n\r\n this._xrSessionManager.onWorldScaleFactorChangedObservable.add(this._onWorldScaleFactorChanged);\r\n\r\n // Check transformation changes on each frame. Callback is added to be first so that the transformation will be\r\n // applied to the rest of the elements using the referenceSpace object\r\n this._xrSessionManager.onXRFrameObservable.add(\r\n () => {\r\n if (this._firstFrame) {\r\n this._updateFromXRSession();\r\n }\r\n if (this.onXRCameraInitializedObservable.hasObservers()) {\r\n this.onXRCameraInitializedObservable.notifyObservers(this);\r\n this.onXRCameraInitializedObservable.clear();\r\n }\r\n\r\n if (this._deferredUpdated) {\r\n this.position.copyFrom(this._deferredPositionUpdate);\r\n this.rotationQuaternion.copyFrom(this._deferredRotationQuaternionUpdate);\r\n }\r\n\r\n this._updateReferenceSpace();\r\n this._updateFromXRSession();\r\n },\r\n undefined,\r\n true\r\n );\r\n }\r\n\r\n /**\r\n * Get the current XR tracking state of the camera\r\n */\r\n public get trackingState(): WebXRTrackingState {\r\n return this._trackingState;\r\n }\r\n\r\n private _setTrackingState(newState: WebXRTrackingState) {\r\n if (this._trackingState !== newState) {\r\n this._trackingState = newState;\r\n this.onTrackingStateChanged.notifyObservers(newState);\r\n }\r\n }\r\n\r\n /**\r\n * Return the user's height, unrelated to the current ground.\r\n * This will be the y position of this camera, when ground level is 0.\r\n *\r\n * Note - this value is multiplied by the worldScalingFactor (if set), so it will be in the same units as the scene.\r\n */\r\n public get realWorldHeight(): number {\r\n const basePose = this._xrSessionManager.currentFrame && this._xrSessionManager.currentFrame.getViewerPose(this._xrSessionManager.baseReferenceSpace);\r\n if (basePose && basePose.transform) {\r\n return basePose.transform.position.y * this._xrSessionManager.worldScalingFactor;\r\n } else {\r\n return 0;\r\n }\r\n }\r\n\r\n /** @internal */\r\n public _updateForDualEyeDebugging(/*pupilDistance = 0.01*/) {\r\n // Create initial camera rigs\r\n this._updateNumberOfRigCameras(2);\r\n this.rigCameras[0].viewport = new Viewport(0, 0, 0.5, 1.0);\r\n // this.rigCameras[0].position.x = -pupilDistance / 2;\r\n this.rigCameras[0].outputRenderTarget = null;\r\n this.rigCameras[1].viewport = new Viewport(0.5, 0, 0.5, 1.0);\r\n // this.rigCameras[1].position.x = pupilDistance / 2;\r\n this.rigCameras[1].outputRenderTarget = null;\r\n }\r\n\r\n /**\r\n * Sets this camera's transformation based on a non-vr camera\r\n * @param otherCamera the non-vr camera to copy the transformation from\r\n * @param resetToBaseReferenceSpace should XR reset to the base reference space\r\n */\r\n public setTransformationFromNonVRCamera(otherCamera: Camera = this.getScene().activeCamera!, resetToBaseReferenceSpace: boolean = true) {\r\n if (!otherCamera || otherCamera === this) {\r\n return;\r\n }\r\n const mat = otherCamera.computeWorldMatrix();\r\n mat.decompose(undefined, this.rotationQuaternion, this.position);\r\n // set the ground level\r\n this.position.y = 0;\r\n Quaternion.FromEulerAnglesToRef(0, this.rotationQuaternion.toEulerAngles().y, 0, this.rotationQuaternion);\r\n this._firstFrame = true;\r\n if (resetToBaseReferenceSpace) {\r\n this._xrSessionManager.resetReferenceSpace();\r\n }\r\n }\r\n\r\n /**\r\n * Gets the current instance class name (\"WebXRCamera\").\r\n * @returns the class name\r\n */\r\n public override getClassName(): string {\r\n return \"WebXRCamera\";\r\n }\r\n\r\n /**\r\n * Set the target for the camera to look at.\r\n * Note that this only rotates around the Y axis, as opposed to the default behavior of other cameras\r\n * @param target the target to set the camera to look at\r\n */\r\n public override setTarget(target: Vector3): void {\r\n // only rotate around the y axis!\r\n const tmpVector = TmpVectors.Vector3[1];\r\n target.subtractToRef(this.position, tmpVector);\r\n tmpVector.y = 0;\r\n tmpVector.normalize();\r\n const yRotation = Math.atan2(tmpVector.x, tmpVector.z) + (this._scene.useRightHandedSystem ? Math.PI : 0);\r\n this.rotationQuaternion.toEulerAnglesToRef(tmpVector);\r\n Quaternion.FromEulerAnglesToRef(tmpVector.x, yRotation, tmpVector.z, this.rotationQuaternion);\r\n }\r\n\r\n public override dispose() {\r\n this._xrSessionManager.onWorldScaleFactorChangedObservable.removeCallback(this._onWorldScaleFactorChanged);\r\n super.dispose();\r\n this._lastXRViewerPose = undefined;\r\n this.onTrackingStateChanged.clear();\r\n }\r\n\r\n private _updateDepthNearFar() {\r\n const far = (this.maxZ || 10000) * this._xrSessionManager.worldScalingFactor;\r\n const xrRenderState: XRRenderStateInit = {\r\n // if maxZ is 0 it should be \"Infinity\", but it doesn't work with the WebXR API. Setting to a large number.\r\n depthFar: far,\r\n depthNear: this.minZ,\r\n };\r\n\r\n this._xrSessionManager.updateRenderState(xrRenderState);\r\n this._cache.minZ = this.minZ;\r\n this._cache.maxZ = far;\r\n }\r\n\r\n private _updateFromXRSession() {\r\n const pose = this._xrSessionManager.currentFrame && this._xrSessionManager.currentFrame.getViewerPose(this._xrSessionManager.referenceSpace);\r\n this._lastXRViewerPose = pose || undefined;\r\n if (!pose) {\r\n this._setTrackingState(WebXRTrackingState.NOT_TRACKING);\r\n return;\r\n }\r\n\r\n // Set the tracking state. if it didn't change it is a no-op\r\n const trackingState = pose.emulatedPosition ? WebXRTrackingState.TRACKING_LOST : WebXRTrackingState.TRACKING;\r\n this._setTrackingState(trackingState);\r\n\r\n // check min/max Z and update if not the same as in cache\r\n if (this.minZ !== this._cache.minZ || this.maxZ !== this._cache.maxZ) {\r\n this._updateDepthNearFar();\r\n }\r\n\r\n if (pose.transform) {\r\n const orientation = pose.transform.orientation;\r\n if (pose.transform.orientation.x === undefined) {\r\n // Babylon native polyfill can return an undefined orientation value\r\n // When not initialized\r\n return;\r\n }\r\n const pos = pose.transform.position;\r\n this._referencedPosition.set(pos.x, pos.y, pos.z).scaleInPlace(this._xrSessionManager.worldScalingFactor);\r\n\r\n this._referenceQuaternion.set(orientation.x, orientation.y, orientation.z, orientation.w);\r\n if (!this._scene.useRightHandedSystem) {\r\n this._referencedPosition.z *= -1;\r\n this._referenceQuaternion.z *= -1;\r\n this._referenceQuaternion.w *= -1;\r\n }\r\n\r\n if (this._firstFrame) {\r\n this._firstFrame = false;\r\n // we have the XR reference, now use this to find the offset to get the camera to be\r\n // in the right position\r\n\r\n // set the height to correlate to the current height\r\n this.position.y += this._referencedPosition.y;\r\n // avoid using the head rotation on the first frame.\r\n this._referenceQuaternion.copyFromFloats(0, 0, 0, 1);\r\n } else {\r\n // update position and rotation as reference\r\n this.rotationQuaternion.copyFrom(this._referenceQuaternion);\r\n this.position.copyFrom(this._referencedPosition);\r\n }\r\n }\r\n\r\n // Update camera rigs\r\n if (this.rigCameras.length !== pose.views.length) {\r\n this._updateNumberOfRigCameras(pose.views.length);\r\n }\r\n\r\n for (let i = 0; i < pose.views.length; i++) {\r\n const view = pose.views[i];\r\n const currentRig = <TargetCamera>this.rigCameras[i];\r\n // update right and left, where applicable\r\n if (!currentRig.isLeftCamera && !currentRig.isRightCamera) {\r\n if (view.eye === \"right\") {\r\n currentRig._isRightCamera = true;\r\n } else if (view.eye === \"left\") {\r\n currentRig._isLeftCamera = true;\r\n }\r\n }\r\n // add any custom render targets to this camera, if available in the scene\r\n const customRenderTargets = this.getScene().customRenderTargets;\r\n // use a for loop\r\n for (let i = 0; i < customRenderTargets.length; i++) {\r\n const rt = customRenderTargets[i];\r\n // make sure we don't add the same render target twice\r\n if (currentRig.customRenderTargets.indexOf(rt) === -1) {\r\n currentRig.customRenderTargets.push(rt);\r\n }\r\n }\r\n // Update view/projection matrix\r\n const pos = view.transform.position;\r\n const orientation = view.transform.orientation;\r\n\r\n currentRig.parent = this.parent;\r\n\r\n currentRig.position.set(pos.x, pos.y, pos.z).scaleInPlace(this._xrSessionManager.worldScalingFactor);\r\n currentRig.rotationQuaternion?.set(orientation.x, orientation.y, orientation.z, orientation.w);\r\n if (!this._scene.useRightHandedSystem && currentRig.rotationQuaternion) {\r\n currentRig.position.z *= -1;\r\n currentRig.rotationQuaternion.z *= -1;\r\n currentRig.rotationQuaternion.w *= -1;\r\n }\r\n Matrix.FromFloat32ArrayToRefScaled(view.projectionMatrix, 0, 1, currentRig._projectionMatrix);\r\n\r\n if (!this._scene.useRightHandedSystem) {\r\n currentRig._projectionMatrix.toggleProjectionMatrixHandInPlace();\r\n }\r\n\r\n // fov\r\n const fov = Math.atan2(1, view.projectionMatrix[5]) * 2;\r\n currentRig.fov = fov;\r\n // first camera?\r\n if (i === 0) {\r\n this.fov = fov;\r\n this._projectionMatrix.copyFrom(currentRig._projectionMatrix);\r\n }\r\n\r\n const renderTargetTexture = this._xrSessionManager.getRenderTargetTextureForView(view);\r\n this._renderingMultiview = renderTargetTexture?._texture?.isMultiview || false;\r\n if (this._renderingMultiview) {\r\n // For multiview, the render target texture is the same per-view (just the slice index is different),\r\n // so we only need to set the output render target once for the rig parent.\r\n if (i == 0) {\r\n this._xrSessionManager.trySetViewportForView(this.viewport, view);\r\n this.outputRenderTarget = renderTargetTexture;\r\n }\r\n } else {\r\n // Update viewport\r\n this._xrSessionManager.trySetViewportForView(currentRig.viewport, view);\r\n\r\n // Set cameras to render to the session's render target\r\n currentRig.outputRenderTarget = renderTargetTexture || this._xrSessionManager.getRenderTargetTextureForView(view);\r\n }\r\n\r\n // Replicate parent rig camera behavior\r\n currentRig.layerMask = this.layerMask;\r\n }\r\n }\r\n\r\n private _updateNumberOfRigCameras(viewCount = 1) {\r\n while (this.rigCameras.length < viewCount) {\r\n const newCamera = new TargetCamera(\"XR-RigCamera: \" + this.rigCameras.length, Vector3.Zero(), this.getScene());\r\n newCamera.minZ = 0.1;\r\n newCamera.rotationQuaternion = new Quaternion();\r\n newCamera.updateUpVectorFromRotation = true;\r\n newCamera.isRigCamera = true;\r\n newCamera.rigParent = this;\r\n // do not compute projection matrix, provided by XR\r\n newCamera.freezeProjectionMatrix();\r\n this.rigCameras.push(newCamera);\r\n }\r\n while (this.rigCameras.length > viewCount) {\r\n const removedCamera = this.rigCameras.pop();\r\n if (removedCamera) {\r\n removedCamera.dispose();\r\n }\r\n }\r\n }\r\n\r\n private _updateReferenceSpace() {\r\n // were position & rotation updated OUTSIDE of the xr update loop\r\n if (!this.position.equals(this._referencedPosition) || !this.rotationQuaternion.equals(this._referenceQuaternion)) {\r\n const referencedMat = TmpVectors.Matrix[0];\r\n const poseMat = TmpVectors.Matrix[1];\r\n const transformMat = TmpVectors.Matrix[2];\r\n\r\n Matrix.ComposeToRef(WebXRCamera._ScaleReadOnly, this._referenceQuaternion, this._referencedPosition, referencedMat);\r\n Matrix.ComposeToRef(WebXRCamera._ScaleReadOnly, this.rotationQuaternion, this.position, poseMat);\r\n referencedMat.invert().multiplyToRef(poseMat, transformMat);\r\n transformMat.invert();\r\n\r\n if (!this._scene.useRightHandedSystem) {\r\n transformMat.toggleModelMatrixHandInPlace();\r\n }\r\n\r\n transformMat.decompose(undefined, this._referenceQuaternion, this._referencedPosition);\r\n const transform = new XRRigidTransform(\r\n {\r\n x: this._referencedPosition.x / this._xrSessionManager.worldScalingFactor,\r\n y: this._referencedPosition.y / this._xrSessionManager.worldScalingFactor,\r\n z: this._referencedPosition.z / this._xrSessionManager.worldScalingFactor,\r\n w: 1,\r\n },\r\n {\r\n x: this._referenceQuaternion.x,\r\n y: this._referenceQuaternion.y,\r\n z: this._referenceQuaternion.z,\r\n w: this._referenceQuaternion.w,\r\n }\r\n );\r\n this._xrSessionManager.referenceSpace = this._xrSessionManager.referenceSpace.getOffsetReferenceSpace(transform);\r\n }\r\n }\r\n}\r\n"]}
@@ -1,14 +1,14 @@
1
1
  import { WebXRExperienceHelper } from "./webXRExperienceHelper.js";
2
2
  import { type Scene } from "../scene.js";
3
3
  import { type IWebXRInputOptions, WebXRInput } from "./webXRInput.js";
4
- import { type IWebXRControllerPointerSelectionOptions, WebXRControllerPointerSelection } from "./features/WebXRControllerPointerSelection.js";
5
- import { type IWebXRNearInteractionOptions, WebXRNearInteraction } from "./features/WebXRNearInteraction.js";
4
+ import { type IWebXRControllerPointerSelectionOptions, WebXRControllerPointerSelection } from "./features/WebXRControllerPointerSelection.pure.js";
5
+ import { type IWebXRNearInteractionOptions, WebXRNearInteraction } from "./features/WebXRNearInteraction.pure.js";
6
6
  import { type WebXRRenderTarget } from "./webXRTypes.js";
7
7
  import { type WebXREnterExitUIOptions, WebXREnterExitUI } from "./webXREnterExitUI.js";
8
8
  import { type AbstractMesh } from "../Meshes/abstractMesh.js";
9
9
  import { type WebXRManagedOutputCanvasOptions } from "./webXRManagedOutputCanvas.js";
10
- import { type IWebXRTeleportationOptions, WebXRMotionControllerTeleportation } from "./features/WebXRControllerTeleportation.js";
11
- import { type IWebXRHandTrackingOptions } from "./features/WebXRHandTracking.js";
10
+ import { type IWebXRTeleportationOptions, WebXRMotionControllerTeleportation } from "./features/WebXRControllerTeleportation.pure.js";
11
+ import { type IWebXRHandTrackingOptions } from "./features/WebXRHandTracking.pure.js";
12
12
  /**
13
13
  * Options for the default xr helper
14
14
  */
@@ -1,10 +1,10 @@
1
1
  import { WebXRExperienceHelper } from "./webXRExperienceHelper.js";
2
2
  import { WebXRInput } from "./webXRInput.js";
3
- import { WebXRControllerPointerSelection } from "./features/WebXRControllerPointerSelection.js";
4
- import { WebXRNearInteraction } from "./features/WebXRNearInteraction.js";
3
+ import { WebXRControllerPointerSelection } from "./features/WebXRControllerPointerSelection.pure.js";
4
+ import { WebXRNearInteraction } from "./features/WebXRNearInteraction.pure.js";
5
5
  import { WebXREnterExitUI } from "./webXREnterExitUI.js";
6
- import { WebXRMotionControllerTeleportation } from "./features/WebXRControllerTeleportation.js";
7
- import { WebXRHandTracking } from "./features/WebXRHandTracking.js";
6
+ import { WebXRMotionControllerTeleportation } from "./features/WebXRControllerTeleportation.pure.js";
7
+ import { WebXRHandTracking } from "./features/WebXRHandTracking.pure.js";
8
8
  import { Logger } from "../Misc/logger.js";
9
9
  /**
10
10
  * Options for the default xr helper
@@ -1 +1 @@
1
- {"version":3,"file":"webXRDefaultExperience.js","sourceRoot":"","sources":["../../../../dev/core/src/XR/webXRDefaultExperience.ts"],"names":[],"mappings":"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","sourcesContent":["import { WebXRExperienceHelper } from \"./webXRExperienceHelper\";\r\nimport { type Scene } from \"../scene\";\r\nimport { type IWebXRInputOptions, WebXRInput } from \"./webXRInput\";\r\nimport { type IWebXRControllerPointerSelectionOptions, WebXRControllerPointerSelection } from \"./features/WebXRControllerPointerSelection\";\r\nimport { type IWebXRNearInteractionOptions, WebXRNearInteraction } from \"./features/WebXRNearInteraction\";\r\nimport { type WebXRRenderTarget } from \"./webXRTypes\";\r\nimport { type WebXREnterExitUIOptions, WebXREnterExitUI } from \"./webXREnterExitUI\";\r\nimport { type AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { type WebXRManagedOutputCanvasOptions } from \"./webXRManagedOutputCanvas\";\r\nimport { type IWebXRTeleportationOptions, WebXRMotionControllerTeleportation } from \"./features/WebXRControllerTeleportation\";\r\nimport { WebXRHandTracking, type IWebXRHandTrackingOptions } from \"./features/WebXRHandTracking\";\r\nimport { Logger } from \"../Misc/logger\";\r\n\r\n/**\r\n * Options for the default xr helper\r\n */\r\nexport class WebXRDefaultExperienceOptions {\r\n /**\r\n * Enable or disable default UI to enter XR\r\n */\r\n public disableDefaultUI?: boolean;\r\n /**\r\n * Should pointer selection not initialize.\r\n * Note that disabling pointer selection also disables teleportation.\r\n * Defaults to false.\r\n */\r\n public disablePointerSelection?: boolean;\r\n /**\r\n * Should teleportation not initialize. Defaults to false.\r\n */\r\n public disableTeleportation?: boolean;\r\n /**\r\n * Should nearInteraction not initialize. Defaults to false.\r\n */\r\n public disableNearInteraction?: boolean;\r\n\r\n /**\r\n * Should hand tracking be disabled. Defaults to false.\r\n */\r\n public disableHandTracking?: boolean;\r\n /**\r\n * Floor meshes that will be used for teleport\r\n */\r\n public floorMeshes?: Array<AbstractMesh>;\r\n /**\r\n * If set to true, the first frame will not be used to reset position\r\n * The first frame is mainly used when copying transformation from the old camera\r\n * Mainly used in AR\r\n */\r\n public ignoreNativeCameraTransformation?: boolean;\r\n /**\r\n * Optional configuration for the XR input object\r\n */\r\n public inputOptions?: Partial<IWebXRInputOptions>;\r\n /**\r\n * optional configuration for pointer selection\r\n */\r\n public pointerSelectionOptions?: Partial<IWebXRControllerPointerSelectionOptions>;\r\n /**\r\n * optional configuration for near interaction\r\n */\r\n public nearInteractionOptions?: Partial<IWebXRNearInteractionOptions>;\r\n\r\n /**\r\n * optional configuration for hand tracking\r\n */\r\n public handSupportOptions?: Partial<IWebXRHandTrackingOptions>;\r\n /**\r\n * optional configuration for teleportation\r\n */\r\n public teleportationOptions?: Partial<IWebXRTeleportationOptions>;\r\n /**\r\n * optional configuration for the output canvas\r\n */\r\n public outputCanvasOptions?: WebXRManagedOutputCanvasOptions;\r\n /**\r\n * optional UI options. This can be used among other to change session mode and reference space type\r\n */\r\n public uiOptions?: Partial<WebXREnterExitUIOptions>;\r\n /**\r\n * When loading teleportation and pointer select, use stable versions instead of latest.\r\n */\r\n public useStablePlugins?: boolean;\r\n\r\n /**\r\n * An optional rendering group id that will be set globally for teleportation, pointer selection and default controller meshes\r\n */\r\n public renderingGroupId?: number;\r\n\r\n /**\r\n * A list of optional features to init the session with\r\n * If set to true, all features we support will be added\r\n */\r\n public optionalFeatures?: boolean | string[];\r\n}\r\n\r\n/**\r\n * Default experience for webxr\r\n */\r\nexport class WebXRDefaultExperience {\r\n /**\r\n * Base experience\r\n */\r\n public baseExperience: WebXRExperienceHelper;\r\n /**\r\n * Enables ui for entering/exiting xr\r\n */\r\n public enterExitUI: WebXREnterExitUI;\r\n /**\r\n * Input experience extension\r\n */\r\n public input: WebXRInput;\r\n /**\r\n * Enables laser pointer and selection\r\n */\r\n public pointerSelection: WebXRControllerPointerSelection;\r\n /**\r\n * Default target xr should render to\r\n */\r\n public renderTarget: WebXRRenderTarget;\r\n /**\r\n * Enables teleportation\r\n */\r\n public teleportation: WebXRMotionControllerTeleportation;\r\n\r\n /**\r\n * Enables near interaction for hands/controllers\r\n */\r\n public nearInteraction: WebXRNearInteraction;\r\n\r\n private constructor() {}\r\n\r\n /**\r\n * Creates the default xr experience\r\n * @param scene scene\r\n * @param options options for basic configuration\r\n * @returns resulting WebXRDefaultExperience\r\n */\r\n public static async CreateAsync(scene: Scene, options: WebXRDefaultExperienceOptions = {}) {\r\n const result = new WebXRDefaultExperience();\r\n scene.onDisposeObservable.addOnce(() => {\r\n result.dispose();\r\n });\r\n // init the UI right after construction\r\n if (!options.disableDefaultUI) {\r\n const uiOptions: WebXREnterExitUIOptions = {\r\n renderTarget: result.renderTarget,\r\n ...(options.uiOptions || {}),\r\n };\r\n if (options.optionalFeatures) {\r\n if (typeof options.optionalFeatures === \"boolean\") {\r\n uiOptions.optionalFeatures = [\"hit-test\", \"anchors\", \"plane-detection\", \"hand-tracking\"];\r\n } else {\r\n uiOptions.optionalFeatures = options.optionalFeatures;\r\n }\r\n }\r\n result.enterExitUI = new WebXREnterExitUI(scene, uiOptions);\r\n }\r\n\r\n try {\r\n // Create base experience\r\n const xrHelper = await WebXRExperienceHelper.CreateAsync(scene);\r\n // eslint-disable-next-line require-atomic-updates\r\n result.baseExperience = xrHelper;\r\n\r\n if (options.ignoreNativeCameraTransformation) {\r\n // eslint-disable-next-line require-atomic-updates\r\n result.baseExperience.camera.compensateOnFirstFrame = false;\r\n }\r\n\r\n // Add controller support\r\n // eslint-disable-next-line require-atomic-updates\r\n result.input = new WebXRInput(xrHelper.sessionManager, xrHelper.camera, {\r\n controllerOptions: {\r\n renderingGroupId: options.renderingGroupId,\r\n },\r\n ...(options.inputOptions || {}),\r\n });\r\n\r\n if (!options.disablePointerSelection) {\r\n // Add default pointer selection\r\n const pointerSelectionOptions = {\r\n ...options.pointerSelectionOptions,\r\n xrInput: result.input,\r\n renderingGroupId: options.renderingGroupId,\r\n };\r\n\r\n result.pointerSelection = result.baseExperience.featuresManager.enableFeature(\r\n WebXRControllerPointerSelection.Name,\r\n options.useStablePlugins ? \"stable\" : \"latest\",\r\n <IWebXRControllerPointerSelectionOptions>pointerSelectionOptions\r\n );\r\n\r\n if (!options.disableTeleportation) {\r\n // Add default teleportation, including rotation\r\n result.teleportation = result.baseExperience.featuresManager.enableFeature(\r\n WebXRMotionControllerTeleportation.Name,\r\n options.useStablePlugins ? \"stable\" : \"latest\",\r\n <IWebXRTeleportationOptions>{\r\n floorMeshes: options.floorMeshes,\r\n xrInput: result.input,\r\n renderingGroupId: options.renderingGroupId,\r\n ...options.teleportationOptions,\r\n }\r\n );\r\n result.teleportation.setSelectionFeature(result.pointerSelection);\r\n }\r\n }\r\n\r\n if (!options.disableNearInteraction) {\r\n // Add default pointer selection\r\n result.nearInteraction = result.baseExperience.featuresManager.enableFeature(WebXRNearInteraction.Name, options.useStablePlugins ? \"stable\" : \"latest\", <\r\n IWebXRNearInteractionOptions\r\n >{\r\n xrInput: result.input,\r\n farInteractionFeature: result.pointerSelection,\r\n renderingGroupId: options.renderingGroupId,\r\n useUtilityLayer: true,\r\n enableNearInteractionOnAllControllers: true,\r\n ...options.nearInteractionOptions,\r\n });\r\n }\r\n\r\n if (!options.disableHandTracking) {\r\n // Add default hand tracking\r\n result.baseExperience.featuresManager.enableFeature(\r\n WebXRHandTracking.Name,\r\n options.useStablePlugins ? \"stable\" : \"latest\",\r\n <IWebXRHandTrackingOptions>{\r\n xrInput: result.input,\r\n ...options.handSupportOptions,\r\n },\r\n undefined,\r\n false\r\n );\r\n }\r\n\r\n // Create the WebXR output target\r\n result.renderTarget = result.baseExperience.sessionManager.getWebXRRenderTarget(options.outputCanvasOptions);\r\n\r\n if (!options.disableDefaultUI) {\r\n // Create ui for entering/exiting xr\r\n await result.enterExitUI.setHelperAsync(result.baseExperience, result.renderTarget);\r\n }\r\n return result;\r\n } catch (error) {\r\n Logger.Error(\"Error initializing XR\");\r\n Logger.Error(error);\r\n return result;\r\n }\r\n }\r\n\r\n /**\r\n * Disposes of the experience helper\r\n */\r\n public dispose() {\r\n if (this.baseExperience) {\r\n this.baseExperience.dispose();\r\n }\r\n if (this.input) {\r\n this.input.dispose();\r\n }\r\n if (this.enterExitUI) {\r\n this.enterExitUI.dispose();\r\n }\r\n if (this.renderTarget) {\r\n this.renderTarget.dispose();\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"webXRDefaultExperience.js","sourceRoot":"","sources":["../../../../dev/core/src/XR/webXRDefaultExperience.ts"],"names":[],"mappings":"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","sourcesContent":["import { WebXRExperienceHelper } from \"./webXRExperienceHelper\";\r\nimport { type Scene } from \"../scene\";\r\nimport { type IWebXRInputOptions, WebXRInput } from \"./webXRInput\";\r\nimport { type IWebXRControllerPointerSelectionOptions, WebXRControllerPointerSelection } from \"./features/WebXRControllerPointerSelection.pure\";\r\nimport { type IWebXRNearInteractionOptions, WebXRNearInteraction } from \"./features/WebXRNearInteraction.pure\";\r\nimport { type WebXRRenderTarget } from \"./webXRTypes\";\r\nimport { type WebXREnterExitUIOptions, WebXREnterExitUI } from \"./webXREnterExitUI\";\r\nimport { type AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { type WebXRManagedOutputCanvasOptions } from \"./webXRManagedOutputCanvas\";\r\nimport { type IWebXRTeleportationOptions, WebXRMotionControllerTeleportation } from \"./features/WebXRControllerTeleportation.pure\";\r\nimport { WebXRHandTracking, type IWebXRHandTrackingOptions } from \"./features/WebXRHandTracking.pure\";\r\nimport { Logger } from \"../Misc/logger\";\r\n\r\n/**\r\n * Options for the default xr helper\r\n */\r\nexport class WebXRDefaultExperienceOptions {\r\n /**\r\n * Enable or disable default UI to enter XR\r\n */\r\n public disableDefaultUI?: boolean;\r\n /**\r\n * Should pointer selection not initialize.\r\n * Note that disabling pointer selection also disables teleportation.\r\n * Defaults to false.\r\n */\r\n public disablePointerSelection?: boolean;\r\n /**\r\n * Should teleportation not initialize. Defaults to false.\r\n */\r\n public disableTeleportation?: boolean;\r\n /**\r\n * Should nearInteraction not initialize. Defaults to false.\r\n */\r\n public disableNearInteraction?: boolean;\r\n\r\n /**\r\n * Should hand tracking be disabled. Defaults to false.\r\n */\r\n public disableHandTracking?: boolean;\r\n /**\r\n * Floor meshes that will be used for teleport\r\n */\r\n public floorMeshes?: Array<AbstractMesh>;\r\n /**\r\n * If set to true, the first frame will not be used to reset position\r\n * The first frame is mainly used when copying transformation from the old camera\r\n * Mainly used in AR\r\n */\r\n public ignoreNativeCameraTransformation?: boolean;\r\n /**\r\n * Optional configuration for the XR input object\r\n */\r\n public inputOptions?: Partial<IWebXRInputOptions>;\r\n /**\r\n * optional configuration for pointer selection\r\n */\r\n public pointerSelectionOptions?: Partial<IWebXRControllerPointerSelectionOptions>;\r\n /**\r\n * optional configuration for near interaction\r\n */\r\n public nearInteractionOptions?: Partial<IWebXRNearInteractionOptions>;\r\n\r\n /**\r\n * optional configuration for hand tracking\r\n */\r\n public handSupportOptions?: Partial<IWebXRHandTrackingOptions>;\r\n /**\r\n * optional configuration for teleportation\r\n */\r\n public teleportationOptions?: Partial<IWebXRTeleportationOptions>;\r\n /**\r\n * optional configuration for the output canvas\r\n */\r\n public outputCanvasOptions?: WebXRManagedOutputCanvasOptions;\r\n /**\r\n * optional UI options. This can be used among other to change session mode and reference space type\r\n */\r\n public uiOptions?: Partial<WebXREnterExitUIOptions>;\r\n /**\r\n * When loading teleportation and pointer select, use stable versions instead of latest.\r\n */\r\n public useStablePlugins?: boolean;\r\n\r\n /**\r\n * An optional rendering group id that will be set globally for teleportation, pointer selection and default controller meshes\r\n */\r\n public renderingGroupId?: number;\r\n\r\n /**\r\n * A list of optional features to init the session with\r\n * If set to true, all features we support will be added\r\n */\r\n public optionalFeatures?: boolean | string[];\r\n}\r\n\r\n/**\r\n * Default experience for webxr\r\n */\r\nexport class WebXRDefaultExperience {\r\n /**\r\n * Base experience\r\n */\r\n public baseExperience: WebXRExperienceHelper;\r\n /**\r\n * Enables ui for entering/exiting xr\r\n */\r\n public enterExitUI: WebXREnterExitUI;\r\n /**\r\n * Input experience extension\r\n */\r\n public input: WebXRInput;\r\n /**\r\n * Enables laser pointer and selection\r\n */\r\n public pointerSelection: WebXRControllerPointerSelection;\r\n /**\r\n * Default target xr should render to\r\n */\r\n public renderTarget: WebXRRenderTarget;\r\n /**\r\n * Enables teleportation\r\n */\r\n public teleportation: WebXRMotionControllerTeleportation;\r\n\r\n /**\r\n * Enables near interaction for hands/controllers\r\n */\r\n public nearInteraction: WebXRNearInteraction;\r\n\r\n private constructor() {}\r\n\r\n /**\r\n * Creates the default xr experience\r\n * @param scene scene\r\n * @param options options for basic configuration\r\n * @returns resulting WebXRDefaultExperience\r\n */\r\n public static async CreateAsync(scene: Scene, options: WebXRDefaultExperienceOptions = {}) {\r\n const result = new WebXRDefaultExperience();\r\n scene.onDisposeObservable.addOnce(() => {\r\n result.dispose();\r\n });\r\n // init the UI right after construction\r\n if (!options.disableDefaultUI) {\r\n const uiOptions: WebXREnterExitUIOptions = {\r\n renderTarget: result.renderTarget,\r\n ...(options.uiOptions || {}),\r\n };\r\n if (options.optionalFeatures) {\r\n if (typeof options.optionalFeatures === \"boolean\") {\r\n uiOptions.optionalFeatures = [\"hit-test\", \"anchors\", \"plane-detection\", \"hand-tracking\"];\r\n } else {\r\n uiOptions.optionalFeatures = options.optionalFeatures;\r\n }\r\n }\r\n result.enterExitUI = new WebXREnterExitUI(scene, uiOptions);\r\n }\r\n\r\n try {\r\n // Create base experience\r\n const xrHelper = await WebXRExperienceHelper.CreateAsync(scene);\r\n // eslint-disable-next-line require-atomic-updates\r\n result.baseExperience = xrHelper;\r\n\r\n if (options.ignoreNativeCameraTransformation) {\r\n // eslint-disable-next-line require-atomic-updates\r\n result.baseExperience.camera.compensateOnFirstFrame = false;\r\n }\r\n\r\n // Add controller support\r\n // eslint-disable-next-line require-atomic-updates\r\n result.input = new WebXRInput(xrHelper.sessionManager, xrHelper.camera, {\r\n controllerOptions: {\r\n renderingGroupId: options.renderingGroupId,\r\n },\r\n ...(options.inputOptions || {}),\r\n });\r\n\r\n if (!options.disablePointerSelection) {\r\n // Add default pointer selection\r\n const pointerSelectionOptions = {\r\n ...options.pointerSelectionOptions,\r\n xrInput: result.input,\r\n renderingGroupId: options.renderingGroupId,\r\n };\r\n\r\n result.pointerSelection = result.baseExperience.featuresManager.enableFeature(\r\n WebXRControllerPointerSelection.Name,\r\n options.useStablePlugins ? \"stable\" : \"latest\",\r\n <IWebXRControllerPointerSelectionOptions>pointerSelectionOptions\r\n );\r\n\r\n if (!options.disableTeleportation) {\r\n // Add default teleportation, including rotation\r\n result.teleportation = result.baseExperience.featuresManager.enableFeature(\r\n WebXRMotionControllerTeleportation.Name,\r\n options.useStablePlugins ? \"stable\" : \"latest\",\r\n <IWebXRTeleportationOptions>{\r\n floorMeshes: options.floorMeshes,\r\n xrInput: result.input,\r\n renderingGroupId: options.renderingGroupId,\r\n ...options.teleportationOptions,\r\n }\r\n );\r\n result.teleportation.setSelectionFeature(result.pointerSelection);\r\n }\r\n }\r\n\r\n if (!options.disableNearInteraction) {\r\n // Add default pointer selection\r\n result.nearInteraction = result.baseExperience.featuresManager.enableFeature(WebXRNearInteraction.Name, options.useStablePlugins ? \"stable\" : \"latest\", <\r\n IWebXRNearInteractionOptions\r\n >{\r\n xrInput: result.input,\r\n farInteractionFeature: result.pointerSelection,\r\n renderingGroupId: options.renderingGroupId,\r\n useUtilityLayer: true,\r\n enableNearInteractionOnAllControllers: true,\r\n ...options.nearInteractionOptions,\r\n });\r\n }\r\n\r\n if (!options.disableHandTracking) {\r\n // Add default hand tracking\r\n result.baseExperience.featuresManager.enableFeature(\r\n WebXRHandTracking.Name,\r\n options.useStablePlugins ? \"stable\" : \"latest\",\r\n <IWebXRHandTrackingOptions>{\r\n xrInput: result.input,\r\n ...options.handSupportOptions,\r\n },\r\n undefined,\r\n false\r\n );\r\n }\r\n\r\n // Create the WebXR output target\r\n result.renderTarget = result.baseExperience.sessionManager.getWebXRRenderTarget(options.outputCanvasOptions);\r\n\r\n if (!options.disableDefaultUI) {\r\n // Create ui for entering/exiting xr\r\n await result.enterExitUI.setHelperAsync(result.baseExperience, result.renderTarget);\r\n }\r\n return result;\r\n } catch (error) {\r\n Logger.Error(\"Error initializing XR\");\r\n Logger.Error(error);\r\n return result;\r\n }\r\n }\r\n\r\n /**\r\n * Disposes of the experience helper\r\n */\r\n public dispose() {\r\n if (this.baseExperience) {\r\n this.baseExperience.dispose();\r\n }\r\n if (this.input) {\r\n this.input.dispose();\r\n }\r\n if (this.enterExitUI) {\r\n this.enterExitUI.dispose();\r\n }\r\n if (this.renderTarget) {\r\n this.renderTarget.dispose();\r\n }\r\n }\r\n}\r\n"]}
@@ -1,5 +1,5 @@
1
1
  import { Observable } from "../Misc/observable.js";
2
- import { Tools } from "../Misc/tools.js";
2
+ import { Tools } from "../Misc/tools.pure.js";
3
3
  /**
4
4
  * Button which can be used to enter a different mode of XR
5
5
  */
@@ -1 +1 @@
1
- {"version":3,"file":"webXREnterExitUI.js","sourceRoot":"","sources":["../../../../dev/core/src/XR/webXREnterExitUI.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Nullable } from \"../types\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport { type IDisposable, type Scene } from \"../scene\";\r\nimport { type WebXRExperienceHelper } from \"./webXRExperienceHelper\";\r\nimport { type WebXRRenderTarget, WebXRState } from \"./webXRTypes\";\r\nimport { Tools } from \"../Misc/tools\";\r\n/**\r\n * Button which can be used to enter a different mode of XR\r\n */\r\nexport class WebXREnterExitUIButton {\r\n /**\r\n * Creates a WebXREnterExitUIButton\r\n * @param element button element\r\n * @param sessionMode XR initialization session mode\r\n * @param referenceSpaceType the type of reference space to be used\r\n */\r\n constructor(\r\n /** button element */\r\n public element: HTMLElement,\r\n /** XR initialization options for the button */\r\n public sessionMode: XRSessionMode,\r\n /** Reference space type */\r\n public referenceSpaceType: XRReferenceSpaceType\r\n ) {}\r\n\r\n /**\r\n * Extendable function which can be used to update the button's visuals when the state changes\r\n * @param activeButton the current active button in the UI\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public update(activeButton: Nullable<WebXREnterExitUIButton>) {}\r\n}\r\n\r\n/**\r\n * Options to create the webXR UI\r\n */\r\nexport class WebXREnterExitUIOptions {\r\n /**\r\n * User provided buttons to enable/disable WebXR. The system will provide default if not set\r\n */\r\n customButtons?: Array<WebXREnterExitUIButton>;\r\n /**\r\n * A reference space type to use when creating the default button.\r\n * Default is local-floor\r\n */\r\n referenceSpaceType?: XRReferenceSpaceType;\r\n /**\r\n * Context to enter xr with\r\n */\r\n renderTarget?: Nullable<WebXRRenderTarget>;\r\n /**\r\n * A session mode to use when creating the default button.\r\n * Default is immersive-vr\r\n */\r\n sessionMode?: XRSessionMode;\r\n\r\n /**\r\n * A list of optional features to init the session with\r\n */\r\n optionalFeatures?: string[];\r\n\r\n /**\r\n * A list of optional features to init the session with\r\n */\r\n requiredFeatures?: string[];\r\n\r\n /**\r\n * If set, the `sessiongranted` event will not be registered. `sessiongranted` is used to move seamlessly between WebXR experiences.\r\n * If set to true the user will be forced to press the \"enter XR\" button even if sessiongranted event was triggered.\r\n * If not set and a sessiongranted event was triggered, the XR session will start automatically.\r\n */\r\n ignoreSessionGrantedEvent?: boolean;\r\n\r\n /**\r\n * If defined, this function will be executed if the UI encounters an error when entering XR\r\n */\r\n onError?: (error: any) => void;\r\n}\r\n/**\r\n * UI to allow the user to enter/exit XR mode\r\n */\r\nexport class WebXREnterExitUI implements IDisposable {\r\n private _activeButton: Nullable<WebXREnterExitUIButton> = null;\r\n private _buttons: Array<WebXREnterExitUIButton> = [];\r\n private _helper: WebXRExperienceHelper;\r\n private _renderTarget?: WebXRRenderTarget;\r\n /**\r\n * The HTML Div Element to which buttons are added.\r\n */\r\n public readonly overlay: HTMLDivElement;\r\n\r\n /**\r\n * Fired every time the active button is changed.\r\n *\r\n * When xr is entered via a button that launches xr that button will be the callback parameter\r\n *\r\n * When exiting xr the callback parameter will be null)\r\n */\r\n public activeButtonChangedObservable = new Observable<Nullable<WebXREnterExitUIButton>>();\r\n\r\n /**\r\n * Construct a new EnterExit UI class\r\n *\r\n * @param _scene babylon scene object to use\r\n * @param options (read-only) version of the options passed to this UI\r\n */\r\n public constructor(\r\n private _scene: Scene,\r\n /** version of the options passed to this UI */\r\n public options: WebXREnterExitUIOptions\r\n ) {\r\n this.overlay = document.createElement(\"div\");\r\n this.overlay.classList.add(\"xr-button-overlay\");\r\n\r\n // prepare for session granted event\r\n if (!options.ignoreSessionGrantedEvent && (navigator as any).xr) {\r\n (navigator as any).xr.addEventListener(\"sessiongranted\", this._onSessionGranted);\r\n }\r\n\r\n // if served over HTTP, warn people.\r\n // Hopefully the browsers will catch up\r\n if (typeof window !== \"undefined\") {\r\n if (window.location && window.location.protocol === \"http:\" && window.location.hostname !== \"localhost\") {\r\n Tools.Warn(\"WebXR can only be served over HTTPS\");\r\n throw new Error(\"WebXR can only be served over HTTPS\");\r\n }\r\n }\r\n\r\n if (options.customButtons) {\r\n this._buttons = options.customButtons;\r\n } else {\r\n this.overlay.style.cssText = \"z-index:11;position: absolute; right: 20px;bottom: 50px;\";\r\n const sessionMode = options.sessionMode || \"immersive-vr\";\r\n const referenceSpaceType = options.referenceSpaceType || \"local-floor\";\r\n const url =\r\n typeof SVGSVGElement === \"undefined\"\r\n ? \"https://cdn.babylonjs.com/Assets/vrButton.png\"\r\n : \"data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%222048%22%20height%3D%221152%22%20viewBox%3D%220%200%202048%201152%22%20version%3D%221.1%22%3E%3Cpath%20transform%3D%22rotate%28180%201024%2C576.0000000000001%29%22%20d%3D%22m1109%2C896q17%2C0%2030%2C-12t13%2C-30t-12.5%2C-30.5t-30.5%2C-12.5l-170%2C0q-18%2C0%20-30.5%2C12.5t-12.5%2C30.5t13%2C30t30%2C12l170%2C0zm-85%2C256q59%2C0%20132.5%2C-1.5t154.5%2C-5.5t164.5%2C-11.5t163%2C-20t150%2C-30t124.5%2C-41.5q23%2C-11%2042%2C-24t38%2C-30q27%2C-25%2041%2C-61.5t14%2C-72.5l0%2C-257q0%2C-123%20-47%2C-232t-128%2C-190t-190%2C-128t-232%2C-47l-81%2C0q-37%2C0%20-68.5%2C14t-60.5%2C34.5t-55.5%2C45t-53%2C45t-53%2C34.5t-55.5%2C14t-55.5%2C-14t-53%2C-34.5t-53%2C-45t-55.5%2C-45t-60.5%2C-34.5t-68.5%2C-14l-81%2C0q-123%2C0%20-232%2C47t-190%2C128t-128%2C190t-47%2C232l0%2C257q0%2C68%2038%2C115t97%2C73q54%2C24%20124.5%2C41.5t150%2C30t163%2C20t164.5%2C11.5t154.5%2C5.5t132.5%2C1.5zm939%2C-298q0%2C39%20-24.5%2C67t-58.5%2C42q-54%2C23%20-122%2C39.5t-143.5%2C28t-155.5%2C19t-157%2C11t-148.5%2C5t-129.5%2C1.5q-59%2C0%20-130%2C-1.5t-148%2C-5t-157%2C-11t-155.5%2C-19t-143.5%2C-28t-122%2C-39.5q-34%2C-14%20-58.5%2C-42t-24.5%2C-67l0%2C-257q0%2C-106%2040.5%2C-199t110%2C-162.5t162.5%2C-109.5t199%2C-40l81%2C0q27%2C0%2052%2C14t50%2C34.5t51%2C44.5t55.5%2C44.5t63.5%2C34.5t74%2C14t74%2C-14t63.5%2C-34.5t55.5%2C-44.5t51%2C-44.5t50%2C-34.5t52%2C-14l14%2C0q37%2C0%2070%2C0.5t64.5%2C4.5t63.5%2C12t68%2C23q71%2C30%20128.5%2C78.5t98.5%2C110t63.5%2C133.5t22.5%2C149l0%2C257z%22%20fill%3D%22white%22%20/%3E%3C/svg%3E%0A\";\r\n let css =\r\n \".babylonVRicon { color: #868686; border-color: #868686; border-style: solid; margin-left: 10px; height: 50px; width: 80px; background-color: rgba(51,51,51,0.7); background-image: url(\" +\r\n url +\r\n \"); background-size: 80%; background-repeat:no-repeat; background-position: center; border: none; outline: none; transition: transform 0.125s ease-out } .babylonVRicon:hover { transform: scale(1.05) } .babylonVRicon:active {background-color: rgba(51,51,51,1) } .babylonVRicon:focus {background-color: rgba(51,51,51,1) }\";\r\n css += '.babylonVRicon.vrdisplaypresenting { background-image: none;} .vrdisplaypresenting::after { content: \"EXIT\"} .xr-error::after { content: \"ERROR\"}';\r\n\r\n const style = document.createElement(\"style\");\r\n style.appendChild(document.createTextNode(css));\r\n document.getElementsByTagName(\"head\")[0].appendChild(style);\r\n const hmdBtn = document.createElement(\"button\");\r\n hmdBtn.className = \"babylonVRicon\";\r\n hmdBtn.title = `${sessionMode} - ${referenceSpaceType}`;\r\n this._buttons.push(new WebXREnterExitUIButton(hmdBtn, sessionMode, referenceSpaceType));\r\n this._buttons[this._buttons.length - 1].update = function (activeButton: WebXREnterExitUIButton) {\r\n this.element.style.display = activeButton === null || activeButton === this ? \"\" : \"none\";\r\n hmdBtn.className = \"babylonVRicon\" + (activeButton === this ? \" vrdisplaypresenting\" : \"\");\r\n };\r\n this._updateButtons(null);\r\n }\r\n\r\n const renderCanvas = _scene.getEngine().getInputElement();\r\n if (renderCanvas && renderCanvas.parentNode) {\r\n renderCanvas.parentNode.appendChild(this.overlay);\r\n _scene.onDisposeObservable.addOnce(() => {\r\n this.dispose();\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Set the helper to be used with this UI component.\r\n * The UI is bound to an experience helper. If not provided the UI can still be used but the events should be registered by the developer.\r\n *\r\n * @param helper the experience helper to attach\r\n * @param renderTarget an optional render target (in case it is created outside of the helper scope)\r\n * @returns a promise that resolves when the ui is ready\r\n */\r\n public async setHelperAsync(helper: WebXRExperienceHelper, renderTarget?: WebXRRenderTarget): Promise<void> {\r\n this._helper = helper;\r\n this._renderTarget = renderTarget;\r\n const supportedPromises = this._buttons.map(async (btn) => {\r\n return await helper.sessionManager.isSessionSupportedAsync(btn.sessionMode);\r\n });\r\n helper.onStateChangedObservable.add((state) => {\r\n if (state == WebXRState.NOT_IN_XR) {\r\n this._updateButtons(null);\r\n }\r\n });\r\n const results = await Promise.all(supportedPromises);\r\n for (let i = 0; i < results.length; i++) {\r\n const supported = results[i];\r\n if (supported) {\r\n this.overlay.appendChild(this._buttons[i].element);\r\n this._buttons[i].element.onclick = this._enterXRWithButtonIndexAsync.bind(this, i);\r\n } else {\r\n Tools.Warn(`Session mode \"${this._buttons[i].sessionMode}\" not supported in browser`);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Creates UI to allow the user to enter/exit XR mode\r\n * @param scene the scene to add the ui to\r\n * @param helper the xr experience helper to enter/exit xr with\r\n * @param options options to configure the UI\r\n * @returns the created ui\r\n */\r\n public static async CreateAsync(scene: Scene, helper: WebXRExperienceHelper, options: WebXREnterExitUIOptions): Promise<WebXREnterExitUI> {\r\n const ui = new WebXREnterExitUI(scene, options);\r\n await ui.setHelperAsync(helper, options.renderTarget || undefined);\r\n return ui;\r\n }\r\n\r\n private async _enterXRWithButtonIndexAsync(idx: number = 0) {\r\n if (this._helper.state == WebXRState.IN_XR) {\r\n await this._helper.exitXRAsync();\r\n this._updateButtons(null);\r\n } else if (this._helper.state == WebXRState.NOT_IN_XR) {\r\n try {\r\n await this._helper.enterXRAsync(this._buttons[idx].sessionMode, this._buttons[idx].referenceSpaceType, this._renderTarget, {\r\n optionalFeatures: this.options.optionalFeatures,\r\n requiredFeatures: this.options.requiredFeatures,\r\n });\r\n this._updateButtons(this._buttons[idx]);\r\n } catch (e) {\r\n // make sure button is visible\r\n this._updateButtons(null);\r\n const element = this._buttons[idx].element;\r\n const prevTitle = element.title;\r\n element.title = \"Error entering XR session : \" + prevTitle;\r\n element.classList.add(\"xr-error\");\r\n if (this.options.onError) {\r\n this.options.onError(e);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Disposes of the XR UI component\r\n */\r\n public dispose() {\r\n const renderCanvas = this._scene.getEngine().getInputElement();\r\n if (renderCanvas && renderCanvas.parentNode && renderCanvas.parentNode.contains(this.overlay)) {\r\n renderCanvas.parentNode.removeChild(this.overlay);\r\n }\r\n this.activeButtonChangedObservable.clear();\r\n (navigator as any).xr.removeEventListener(\"sessiongranted\", this._onSessionGranted);\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _onSessionGranted = (evt: { session: XRSession }) => {\r\n // This section is for future reference.\r\n // As per specs, evt.session.mode should have the supported session mode, but no browser supports it for now.\r\n\r\n // // check if the session granted is the same as the one requested\r\n // const grantedMode = (evt.session as any).mode;\r\n // if (grantedMode) {\r\n // this._buttons.some((btn, idx) => {\r\n // if (btn.sessionMode === grantedMode) {\r\n // this._enterXRWithButtonIndex(idx);\r\n // return true;\r\n // }\r\n // return false;\r\n // });\r\n // } else\r\n\r\n if (this._helper) {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this._enterXRWithButtonIndexAsync(0);\r\n }\r\n };\r\n\r\n private _updateButtons(activeButton: Nullable<WebXREnterExitUIButton>) {\r\n this._activeButton = activeButton;\r\n for (const b of this._buttons) {\r\n b.update(this._activeButton);\r\n }\r\n this.activeButtonChangedObservable.notifyObservers(this._activeButton);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"webXREnterExitUI.js","sourceRoot":"","sources":["../../../../dev/core/src/XR/webXREnterExitUI.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Nullable } from \"../types\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport { type IDisposable, type Scene } from \"../scene\";\r\nimport { type WebXRExperienceHelper } from \"./webXRExperienceHelper\";\r\nimport { type WebXRRenderTarget, WebXRState } from \"./webXRTypes\";\r\nimport { Tools } from \"../Misc/tools.pure\";\r\n/**\r\n * Button which can be used to enter a different mode of XR\r\n */\r\nexport class WebXREnterExitUIButton {\r\n /**\r\n * Creates a WebXREnterExitUIButton\r\n * @param element button element\r\n * @param sessionMode XR initialization session mode\r\n * @param referenceSpaceType the type of reference space to be used\r\n */\r\n constructor(\r\n /** button element */\r\n public element: HTMLElement,\r\n /** XR initialization options for the button */\r\n public sessionMode: XRSessionMode,\r\n /** Reference space type */\r\n public referenceSpaceType: XRReferenceSpaceType\r\n ) {}\r\n\r\n /**\r\n * Extendable function which can be used to update the button's visuals when the state changes\r\n * @param activeButton the current active button in the UI\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n public update(activeButton: Nullable<WebXREnterExitUIButton>) {}\r\n}\r\n\r\n/**\r\n * Options to create the webXR UI\r\n */\r\nexport class WebXREnterExitUIOptions {\r\n /**\r\n * User provided buttons to enable/disable WebXR. The system will provide default if not set\r\n */\r\n customButtons?: Array<WebXREnterExitUIButton>;\r\n /**\r\n * A reference space type to use when creating the default button.\r\n * Default is local-floor\r\n */\r\n referenceSpaceType?: XRReferenceSpaceType;\r\n /**\r\n * Context to enter xr with\r\n */\r\n renderTarget?: Nullable<WebXRRenderTarget>;\r\n /**\r\n * A session mode to use when creating the default button.\r\n * Default is immersive-vr\r\n */\r\n sessionMode?: XRSessionMode;\r\n\r\n /**\r\n * A list of optional features to init the session with\r\n */\r\n optionalFeatures?: string[];\r\n\r\n /**\r\n * A list of optional features to init the session with\r\n */\r\n requiredFeatures?: string[];\r\n\r\n /**\r\n * If set, the `sessiongranted` event will not be registered. `sessiongranted` is used to move seamlessly between WebXR experiences.\r\n * If set to true the user will be forced to press the \"enter XR\" button even if sessiongranted event was triggered.\r\n * If not set and a sessiongranted event was triggered, the XR session will start automatically.\r\n */\r\n ignoreSessionGrantedEvent?: boolean;\r\n\r\n /**\r\n * If defined, this function will be executed if the UI encounters an error when entering XR\r\n */\r\n onError?: (error: any) => void;\r\n}\r\n/**\r\n * UI to allow the user to enter/exit XR mode\r\n */\r\nexport class WebXREnterExitUI implements IDisposable {\r\n private _activeButton: Nullable<WebXREnterExitUIButton> = null;\r\n private _buttons: Array<WebXREnterExitUIButton> = [];\r\n private _helper: WebXRExperienceHelper;\r\n private _renderTarget?: WebXRRenderTarget;\r\n /**\r\n * The HTML Div Element to which buttons are added.\r\n */\r\n public readonly overlay: HTMLDivElement;\r\n\r\n /**\r\n * Fired every time the active button is changed.\r\n *\r\n * When xr is entered via a button that launches xr that button will be the callback parameter\r\n *\r\n * When exiting xr the callback parameter will be null)\r\n */\r\n public activeButtonChangedObservable = new Observable<Nullable<WebXREnterExitUIButton>>();\r\n\r\n /**\r\n * Construct a new EnterExit UI class\r\n *\r\n * @param _scene babylon scene object to use\r\n * @param options (read-only) version of the options passed to this UI\r\n */\r\n public constructor(\r\n private _scene: Scene,\r\n /** version of the options passed to this UI */\r\n public options: WebXREnterExitUIOptions\r\n ) {\r\n this.overlay = document.createElement(\"div\");\r\n this.overlay.classList.add(\"xr-button-overlay\");\r\n\r\n // prepare for session granted event\r\n if (!options.ignoreSessionGrantedEvent && (navigator as any).xr) {\r\n (navigator as any).xr.addEventListener(\"sessiongranted\", this._onSessionGranted);\r\n }\r\n\r\n // if served over HTTP, warn people.\r\n // Hopefully the browsers will catch up\r\n if (typeof window !== \"undefined\") {\r\n if (window.location && window.location.protocol === \"http:\" && window.location.hostname !== \"localhost\") {\r\n Tools.Warn(\"WebXR can only be served over HTTPS\");\r\n throw new Error(\"WebXR can only be served over HTTPS\");\r\n }\r\n }\r\n\r\n if (options.customButtons) {\r\n this._buttons = options.customButtons;\r\n } else {\r\n this.overlay.style.cssText = \"z-index:11;position: absolute; right: 20px;bottom: 50px;\";\r\n const sessionMode = options.sessionMode || \"immersive-vr\";\r\n const referenceSpaceType = options.referenceSpaceType || \"local-floor\";\r\n const url =\r\n typeof SVGSVGElement === \"undefined\"\r\n ? \"https://cdn.babylonjs.com/Assets/vrButton.png\"\r\n : \"data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%222048%22%20height%3D%221152%22%20viewBox%3D%220%200%202048%201152%22%20version%3D%221.1%22%3E%3Cpath%20transform%3D%22rotate%28180%201024%2C576.0000000000001%29%22%20d%3D%22m1109%2C896q17%2C0%2030%2C-12t13%2C-30t-12.5%2C-30.5t-30.5%2C-12.5l-170%2C0q-18%2C0%20-30.5%2C12.5t-12.5%2C30.5t13%2C30t30%2C12l170%2C0zm-85%2C256q59%2C0%20132.5%2C-1.5t154.5%2C-5.5t164.5%2C-11.5t163%2C-20t150%2C-30t124.5%2C-41.5q23%2C-11%2042%2C-24t38%2C-30q27%2C-25%2041%2C-61.5t14%2C-72.5l0%2C-257q0%2C-123%20-47%2C-232t-128%2C-190t-190%2C-128t-232%2C-47l-81%2C0q-37%2C0%20-68.5%2C14t-60.5%2C34.5t-55.5%2C45t-53%2C45t-53%2C34.5t-55.5%2C14t-55.5%2C-14t-53%2C-34.5t-53%2C-45t-55.5%2C-45t-60.5%2C-34.5t-68.5%2C-14l-81%2C0q-123%2C0%20-232%2C47t-190%2C128t-128%2C190t-47%2C232l0%2C257q0%2C68%2038%2C115t97%2C73q54%2C24%20124.5%2C41.5t150%2C30t163%2C20t164.5%2C11.5t154.5%2C5.5t132.5%2C1.5zm939%2C-298q0%2C39%20-24.5%2C67t-58.5%2C42q-54%2C23%20-122%2C39.5t-143.5%2C28t-155.5%2C19t-157%2C11t-148.5%2C5t-129.5%2C1.5q-59%2C0%20-130%2C-1.5t-148%2C-5t-157%2C-11t-155.5%2C-19t-143.5%2C-28t-122%2C-39.5q-34%2C-14%20-58.5%2C-42t-24.5%2C-67l0%2C-257q0%2C-106%2040.5%2C-199t110%2C-162.5t162.5%2C-109.5t199%2C-40l81%2C0q27%2C0%2052%2C14t50%2C34.5t51%2C44.5t55.5%2C44.5t63.5%2C34.5t74%2C14t74%2C-14t63.5%2C-34.5t55.5%2C-44.5t51%2C-44.5t50%2C-34.5t52%2C-14l14%2C0q37%2C0%2070%2C0.5t64.5%2C4.5t63.5%2C12t68%2C23q71%2C30%20128.5%2C78.5t98.5%2C110t63.5%2C133.5t22.5%2C149l0%2C257z%22%20fill%3D%22white%22%20/%3E%3C/svg%3E%0A\";\r\n let css =\r\n \".babylonVRicon { color: #868686; border-color: #868686; border-style: solid; margin-left: 10px; height: 50px; width: 80px; background-color: rgba(51,51,51,0.7); background-image: url(\" +\r\n url +\r\n \"); background-size: 80%; background-repeat:no-repeat; background-position: center; border: none; outline: none; transition: transform 0.125s ease-out } .babylonVRicon:hover { transform: scale(1.05) } .babylonVRicon:active {background-color: rgba(51,51,51,1) } .babylonVRicon:focus {background-color: rgba(51,51,51,1) }\";\r\n css += '.babylonVRicon.vrdisplaypresenting { background-image: none;} .vrdisplaypresenting::after { content: \"EXIT\"} .xr-error::after { content: \"ERROR\"}';\r\n\r\n const style = document.createElement(\"style\");\r\n style.appendChild(document.createTextNode(css));\r\n document.getElementsByTagName(\"head\")[0].appendChild(style);\r\n const hmdBtn = document.createElement(\"button\");\r\n hmdBtn.className = \"babylonVRicon\";\r\n hmdBtn.title = `${sessionMode} - ${referenceSpaceType}`;\r\n this._buttons.push(new WebXREnterExitUIButton(hmdBtn, sessionMode, referenceSpaceType));\r\n this._buttons[this._buttons.length - 1].update = function (activeButton: WebXREnterExitUIButton) {\r\n this.element.style.display = activeButton === null || activeButton === this ? \"\" : \"none\";\r\n hmdBtn.className = \"babylonVRicon\" + (activeButton === this ? \" vrdisplaypresenting\" : \"\");\r\n };\r\n this._updateButtons(null);\r\n }\r\n\r\n const renderCanvas = _scene.getEngine().getInputElement();\r\n if (renderCanvas && renderCanvas.parentNode) {\r\n renderCanvas.parentNode.appendChild(this.overlay);\r\n _scene.onDisposeObservable.addOnce(() => {\r\n this.dispose();\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Set the helper to be used with this UI component.\r\n * The UI is bound to an experience helper. If not provided the UI can still be used but the events should be registered by the developer.\r\n *\r\n * @param helper the experience helper to attach\r\n * @param renderTarget an optional render target (in case it is created outside of the helper scope)\r\n * @returns a promise that resolves when the ui is ready\r\n */\r\n public async setHelperAsync(helper: WebXRExperienceHelper, renderTarget?: WebXRRenderTarget): Promise<void> {\r\n this._helper = helper;\r\n this._renderTarget = renderTarget;\r\n const supportedPromises = this._buttons.map(async (btn) => {\r\n return await helper.sessionManager.isSessionSupportedAsync(btn.sessionMode);\r\n });\r\n helper.onStateChangedObservable.add((state) => {\r\n if (state == WebXRState.NOT_IN_XR) {\r\n this._updateButtons(null);\r\n }\r\n });\r\n const results = await Promise.all(supportedPromises);\r\n for (let i = 0; i < results.length; i++) {\r\n const supported = results[i];\r\n if (supported) {\r\n this.overlay.appendChild(this._buttons[i].element);\r\n this._buttons[i].element.onclick = this._enterXRWithButtonIndexAsync.bind(this, i);\r\n } else {\r\n Tools.Warn(`Session mode \"${this._buttons[i].sessionMode}\" not supported in browser`);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Creates UI to allow the user to enter/exit XR mode\r\n * @param scene the scene to add the ui to\r\n * @param helper the xr experience helper to enter/exit xr with\r\n * @param options options to configure the UI\r\n * @returns the created ui\r\n */\r\n public static async CreateAsync(scene: Scene, helper: WebXRExperienceHelper, options: WebXREnterExitUIOptions): Promise<WebXREnterExitUI> {\r\n const ui = new WebXREnterExitUI(scene, options);\r\n await ui.setHelperAsync(helper, options.renderTarget || undefined);\r\n return ui;\r\n }\r\n\r\n private async _enterXRWithButtonIndexAsync(idx: number = 0) {\r\n if (this._helper.state == WebXRState.IN_XR) {\r\n await this._helper.exitXRAsync();\r\n this._updateButtons(null);\r\n } else if (this._helper.state == WebXRState.NOT_IN_XR) {\r\n try {\r\n await this._helper.enterXRAsync(this._buttons[idx].sessionMode, this._buttons[idx].referenceSpaceType, this._renderTarget, {\r\n optionalFeatures: this.options.optionalFeatures,\r\n requiredFeatures: this.options.requiredFeatures,\r\n });\r\n this._updateButtons(this._buttons[idx]);\r\n } catch (e) {\r\n // make sure button is visible\r\n this._updateButtons(null);\r\n const element = this._buttons[idx].element;\r\n const prevTitle = element.title;\r\n element.title = \"Error entering XR session : \" + prevTitle;\r\n element.classList.add(\"xr-error\");\r\n if (this.options.onError) {\r\n this.options.onError(e);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Disposes of the XR UI component\r\n */\r\n public dispose() {\r\n const renderCanvas = this._scene.getEngine().getInputElement();\r\n if (renderCanvas && renderCanvas.parentNode && renderCanvas.parentNode.contains(this.overlay)) {\r\n renderCanvas.parentNode.removeChild(this.overlay);\r\n }\r\n this.activeButtonChangedObservable.clear();\r\n (navigator as any).xr.removeEventListener(\"sessiongranted\", this._onSessionGranted);\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n private _onSessionGranted = (evt: { session: XRSession }) => {\r\n // This section is for future reference.\r\n // As per specs, evt.session.mode should have the supported session mode, but no browser supports it for now.\r\n\r\n // // check if the session granted is the same as the one requested\r\n // const grantedMode = (evt.session as any).mode;\r\n // if (grantedMode) {\r\n // this._buttons.some((btn, idx) => {\r\n // if (btn.sessionMode === grantedMode) {\r\n // this._enterXRWithButtonIndex(idx);\r\n // return true;\r\n // }\r\n // return false;\r\n // });\r\n // } else\r\n\r\n if (this._helper) {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this._enterXRWithButtonIndexAsync(0);\r\n }\r\n };\r\n\r\n private _updateButtons(activeButton: Nullable<WebXREnterExitUIButton>) {\r\n this._activeButton = activeButton;\r\n for (const b of this._buttons) {\r\n b.update(this._activeButton);\r\n }\r\n this.activeButtonChangedObservable.notifyObservers(this._activeButton);\r\n }\r\n}\r\n"]}
@@ -3,8 +3,8 @@ import { WebXRSessionManager } from "./webXRSessionManager.js";
3
3
  import { WebXRCamera } from "./webXRCamera.js";
4
4
  import { WebXRFeatureName, WebXRFeaturesManager } from "./webXRFeaturesManager.js";
5
5
  import { Logger } from "../Misc/logger.js";
6
- import { UniversalCamera } from "../Cameras/universalCamera.js";
7
- import { Quaternion, Vector3 } from "../Maths/math.vector.js";
6
+ import { UniversalCamera } from "../Cameras/universalCamera.pure.js";
7
+ import { Quaternion, Vector3 } from "../Maths/math.vector.pure.js";
8
8
  import { AbstractEngine } from "../Engines/abstractEngine.js";
9
9
  /**
10
10
  * Base set of functionality needed to create an XR experience (WebXRSessionManager, Camera, StateManagement, etc.)
@@ -1 +1 @@
1
- {"version":3,"file":"webXRExperienceHelper.js","sourceRoot":"","sources":["../../../../dev/core/src/XR/webXRExperienceHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Nullable } from \"../types\";\r\nimport { Observable, type Observer } from \"../Misc/observable\";\r\nimport { type IDisposable, type Scene } from \"../scene\";\r\nimport { type Camera } from \"../Cameras/camera\";\r\nimport { WebXRSessionManager } from \"./webXRSessionManager\";\r\nimport { WebXRCamera } from \"./webXRCamera\";\r\nimport { type WebXRRenderTarget, WebXRState } 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\nimport { type ThinEngine } from \"../Engines/thinEngine\";\r\nimport { AbstractEngine } from \"core/Engines/abstractEngine\";\r\n\r\n/**\r\n * Options for setting up XR spectator camera.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport interface WebXRSpectatorModeOption {\r\n /**\r\n * Expected refresh rate (frames per sec) for a spectator camera.\r\n */\r\n fps?: number;\r\n /**\r\n * The index of rigCameras array in a WebXR camera.\r\n */\r\n preferredCameraIndex?: number;\r\n}\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/features/featuresDeepDive/webXR/webXRExperienceHelpers\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 private _lastTimestamp = 0;\r\n private _spectatorStateChangedObserver: Nullable<Observer<WebXRState>> = null;\r\n private _spectatorXRFrameObserver: Nullable<Observer<XRFrame>> = null;\r\n private _spectatorAfterRenderObserver: Nullable<Observer<Camera>> = null;\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.addOnce(() => {\r\n this.dispose();\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 async CreateAsync(scene: Scene): Promise<WebXRExperienceHelper> {\r\n const helper = new WebXRExperienceHelper(scene);\r\n return await helper.sessionManager\r\n .initializeAsync()\r\n // eslint-disable-next-line github/no-then\r\n .then(() => {\r\n helper._supported = true;\r\n return helper;\r\n })\r\n // eslint-disable-next-line github/no-then\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 // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this.exitXRAsync();\r\n this._clearSpectatorObservers();\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(\r\n sessionMode: XRSessionMode,\r\n referenceSpaceType: XRReferenceSpaceType,\r\n renderTarget: WebXRRenderTarget = this.sessionManager.getWebXRRenderTarget(),\r\n sessionCreationOptions: XRSessionInit = {}\r\n ): Promise<WebXRSessionManager> {\r\n if (!this._supported) {\r\n // eslint-disable-next-line no-throw-literal\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\r\n const xrRenderState: XRRenderStateInit = {\r\n // if maxZ is 0 it should be \"Infinity\", but it doesn't work with the WebXR API. Setting to a large number.\r\n depthFar: this.camera.maxZ || 10000,\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 const baseLayer = await renderTarget.initializeXRLayerAsync(this.sessionManager.session);\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 // reset the camera's position to the origin\r\n this.camera.position.set(0, 0, 0);\r\n this.camera.rotationQuaternion.set(0, 0, 0, 1);\r\n this.onInitialXRPoseSetObservable.notifyObservers(this.camera);\r\n }\r\n\r\n // Vision Pro suspends the audio context when entering XR, so we resume it here if needed.\r\n AbstractEngine.audioEngine?._resumeAudioContextOnStateChange();\r\n\r\n this.sessionManager.onXRSessionEnded.addOnce(() => {\r\n // when using the back button and not the exit button (default on mobile), the session is ending but the EXITING state was not set\r\n if (this.state !== WebXRState.EXITING_XR) {\r\n this._setState(WebXRState.EXITING_XR);\r\n }\r\n // Reset camera rigs output render target to ensure sessions render target is not drawn after it ends\r\n for (const c of this.camera.rigCameras) {\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 Logger.Log(e);\r\n Logger.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 async exitXRAsync() {\r\n // only exit if state is IN_XR\r\n if (this.state !== WebXRState.IN_XR) {\r\n return;\r\n }\r\n this._setState(WebXRState.EXITING_XR);\r\n return await 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 * @param options giving WebXRSpectatorModeOption for specutator camera to setup when the spectator mode is enabled.\r\n */\r\n public enableSpectatorMode(options?: WebXRSpectatorModeOption): void {\r\n if (!this._spectatorMode) {\r\n this._spectatorMode = true;\r\n this._switchSpectatorMode(options);\r\n }\r\n }\r\n\r\n /**\r\n * Disable spectator mode for desktop VR experiences.\r\n */\r\n public disableSpecatatorMode(): void {\r\n if (this._spectatorMode) {\r\n this._spectatorMode = false;\r\n this._switchSpectatorMode();\r\n }\r\n }\r\n\r\n private _clearSpectatorObservers() {\r\n this.sessionManager.onXRFrameObservable.remove(this._spectatorXRFrameObserver);\r\n this._spectatorXRFrameObserver = null;\r\n this._scene.onAfterRenderCameraObservable.remove(this._spectatorAfterRenderObserver);\r\n this._spectatorAfterRenderObserver = null;\r\n this.onStateChangedObservable.remove(this._spectatorStateChangedObserver);\r\n this._spectatorStateChangedObserver = null;\r\n }\r\n\r\n private _switchSpectatorMode(options?: WebXRSpectatorModeOption): void {\r\n this._clearSpectatorObservers();\r\n\r\n const fps = options?.fps ? options.fps : 1000.0;\r\n const refreshRate = (1.0 / fps) * 1000.0;\r\n const cameraIndex = options?.preferredCameraIndex ? options?.preferredCameraIndex : 0;\r\n\r\n const updateSpectatorCamera = () => {\r\n if (this._spectatorCamera) {\r\n const delta = this.sessionManager.currentTimestamp - this._lastTimestamp;\r\n if (delta >= refreshRate) {\r\n this._lastTimestamp = this.sessionManager.currentTimestamp;\r\n this._spectatorCamera.position.copyFrom(this.camera.rigCameras[cameraIndex].globalPosition);\r\n this._spectatorCamera.rotationQuaternion?.copyFrom(this.camera.rigCameras[cameraIndex].absoluteRotation);\r\n }\r\n }\r\n };\r\n if (this._spectatorMode) {\r\n if (cameraIndex >= this.camera.rigCameras.length) {\r\n throw new Error(\"the preferred camera index is beyond the length of rig camera array.\");\r\n }\r\n const onStateChanged = () => {\r\n if (this.state === WebXRState.IN_XR) {\r\n this._spectatorCamera?.dispose();\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._spectatorXRFrameObserver = this.sessionManager.onXRFrameObservable.add(updateSpectatorCamera);\r\n this._spectatorAfterRenderObserver = 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() as ThinEngine).framebufferDimensionsObject = null;\r\n }\r\n });\r\n } else if (this.state === WebXRState.EXITING_XR) {\r\n this.sessionManager.onXRFrameObservable.remove(this._spectatorXRFrameObserver);\r\n this._spectatorXRFrameObserver = null;\r\n\r\n this._scene.onAfterRenderCameraObservable.remove(this._spectatorAfterRenderObserver);\r\n this._spectatorAfterRenderObserver = null;\r\n this._spectatorCamera?.dispose();\r\n this._spectatorCamera = null;\r\n this._scene.activeCameras = null;\r\n }\r\n };\r\n this._spectatorStateChangedObserver = this.onStateChangedObservable.add(onStateChanged);\r\n onStateChanged();\r\n } else {\r\n this._spectatorCamera?.dispose();\r\n this._spectatorCamera = null;\r\n this._scene.activeCameras = [this.camera];\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":["../../../../dev/core/src/XR/webXRExperienceHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Nullable } from \"../types\";\r\nimport { Observable, type Observer } from \"../Misc/observable\";\r\nimport { type IDisposable, type Scene } from \"../scene\";\r\nimport { type Camera } from \"../Cameras/camera\";\r\nimport { WebXRSessionManager } from \"./webXRSessionManager\";\r\nimport { WebXRCamera } from \"./webXRCamera\";\r\nimport { type WebXRRenderTarget, WebXRState } from \"./webXRTypes\";\r\nimport { WebXRFeatureName, WebXRFeaturesManager } from \"./webXRFeaturesManager\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport { UniversalCamera } from \"../Cameras/universalCamera.pure\";\r\nimport { Quaternion, Vector3 } from \"../Maths/math.vector.pure\";\r\nimport { type ThinEngine } from \"../Engines/thinEngine\";\r\nimport { AbstractEngine } from \"core/Engines/abstractEngine\";\r\n\r\n/**\r\n * Options for setting up XR spectator camera.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/naming-convention\r\nexport interface WebXRSpectatorModeOption {\r\n /**\r\n * Expected refresh rate (frames per sec) for a spectator camera.\r\n */\r\n fps?: number;\r\n /**\r\n * The index of rigCameras array in a WebXR camera.\r\n */\r\n preferredCameraIndex?: number;\r\n}\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/features/featuresDeepDive/webXR/webXRExperienceHelpers\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 private _lastTimestamp = 0;\r\n private _spectatorStateChangedObserver: Nullable<Observer<WebXRState>> = null;\r\n private _spectatorXRFrameObserver: Nullable<Observer<XRFrame>> = null;\r\n private _spectatorAfterRenderObserver: Nullable<Observer<Camera>> = null;\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.addOnce(() => {\r\n this.dispose();\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 async CreateAsync(scene: Scene): Promise<WebXRExperienceHelper> {\r\n const helper = new WebXRExperienceHelper(scene);\r\n return await helper.sessionManager\r\n .initializeAsync()\r\n // eslint-disable-next-line github/no-then\r\n .then(() => {\r\n helper._supported = true;\r\n return helper;\r\n })\r\n // eslint-disable-next-line github/no-then\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 // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this.exitXRAsync();\r\n this._clearSpectatorObservers();\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(\r\n sessionMode: XRSessionMode,\r\n referenceSpaceType: XRReferenceSpaceType,\r\n renderTarget: WebXRRenderTarget = this.sessionManager.getWebXRRenderTarget(),\r\n sessionCreationOptions: XRSessionInit = {}\r\n ): Promise<WebXRSessionManager> {\r\n if (!this._supported) {\r\n // eslint-disable-next-line no-throw-literal\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\r\n const xrRenderState: XRRenderStateInit = {\r\n // if maxZ is 0 it should be \"Infinity\", but it doesn't work with the WebXR API. Setting to a large number.\r\n depthFar: this.camera.maxZ || 10000,\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 const baseLayer = await renderTarget.initializeXRLayerAsync(this.sessionManager.session);\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 // reset the camera's position to the origin\r\n this.camera.position.set(0, 0, 0);\r\n this.camera.rotationQuaternion.set(0, 0, 0, 1);\r\n this.onInitialXRPoseSetObservable.notifyObservers(this.camera);\r\n }\r\n\r\n // Vision Pro suspends the audio context when entering XR, so we resume it here if needed.\r\n AbstractEngine.audioEngine?._resumeAudioContextOnStateChange();\r\n\r\n this.sessionManager.onXRSessionEnded.addOnce(() => {\r\n // when using the back button and not the exit button (default on mobile), the session is ending but the EXITING state was not set\r\n if (this.state !== WebXRState.EXITING_XR) {\r\n this._setState(WebXRState.EXITING_XR);\r\n }\r\n // Reset camera rigs output render target to ensure sessions render target is not drawn after it ends\r\n for (const c of this.camera.rigCameras) {\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 Logger.Log(e);\r\n Logger.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 async exitXRAsync() {\r\n // only exit if state is IN_XR\r\n if (this.state !== WebXRState.IN_XR) {\r\n return;\r\n }\r\n this._setState(WebXRState.EXITING_XR);\r\n return await 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 * @param options giving WebXRSpectatorModeOption for specutator camera to setup when the spectator mode is enabled.\r\n */\r\n public enableSpectatorMode(options?: WebXRSpectatorModeOption): void {\r\n if (!this._spectatorMode) {\r\n this._spectatorMode = true;\r\n this._switchSpectatorMode(options);\r\n }\r\n }\r\n\r\n /**\r\n * Disable spectator mode for desktop VR experiences.\r\n */\r\n public disableSpecatatorMode(): void {\r\n if (this._spectatorMode) {\r\n this._spectatorMode = false;\r\n this._switchSpectatorMode();\r\n }\r\n }\r\n\r\n private _clearSpectatorObservers() {\r\n this.sessionManager.onXRFrameObservable.remove(this._spectatorXRFrameObserver);\r\n this._spectatorXRFrameObserver = null;\r\n this._scene.onAfterRenderCameraObservable.remove(this._spectatorAfterRenderObserver);\r\n this._spectatorAfterRenderObserver = null;\r\n this.onStateChangedObservable.remove(this._spectatorStateChangedObserver);\r\n this._spectatorStateChangedObserver = null;\r\n }\r\n\r\n private _switchSpectatorMode(options?: WebXRSpectatorModeOption): void {\r\n this._clearSpectatorObservers();\r\n\r\n const fps = options?.fps ? options.fps : 1000.0;\r\n const refreshRate = (1.0 / fps) * 1000.0;\r\n const cameraIndex = options?.preferredCameraIndex ? options?.preferredCameraIndex : 0;\r\n\r\n const updateSpectatorCamera = () => {\r\n if (this._spectatorCamera) {\r\n const delta = this.sessionManager.currentTimestamp - this._lastTimestamp;\r\n if (delta >= refreshRate) {\r\n this._lastTimestamp = this.sessionManager.currentTimestamp;\r\n this._spectatorCamera.position.copyFrom(this.camera.rigCameras[cameraIndex].globalPosition);\r\n this._spectatorCamera.rotationQuaternion?.copyFrom(this.camera.rigCameras[cameraIndex].absoluteRotation);\r\n }\r\n }\r\n };\r\n if (this._spectatorMode) {\r\n if (cameraIndex >= this.camera.rigCameras.length) {\r\n throw new Error(\"the preferred camera index is beyond the length of rig camera array.\");\r\n }\r\n const onStateChanged = () => {\r\n if (this.state === WebXRState.IN_XR) {\r\n this._spectatorCamera?.dispose();\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._spectatorXRFrameObserver = this.sessionManager.onXRFrameObservable.add(updateSpectatorCamera);\r\n this._spectatorAfterRenderObserver = 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() as ThinEngine).framebufferDimensionsObject = null;\r\n }\r\n });\r\n } else if (this.state === WebXRState.EXITING_XR) {\r\n this.sessionManager.onXRFrameObservable.remove(this._spectatorXRFrameObserver);\r\n this._spectatorXRFrameObserver = null;\r\n\r\n this._scene.onAfterRenderCameraObservable.remove(this._spectatorAfterRenderObserver);\r\n this._spectatorAfterRenderObserver = null;\r\n this._spectatorCamera?.dispose();\r\n this._spectatorCamera = null;\r\n this._scene.activeCameras = null;\r\n }\r\n };\r\n this._spectatorStateChangedObserver = this.onStateChangedObservable.add(onStateChanged);\r\n onStateChanged();\r\n } else {\r\n this._spectatorCamera?.dispose();\r\n this._spectatorCamera = null;\r\n this._scene.activeCameras = [this.camera];\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"]}