@babylonjs/core 5.0.0-alpha.55 → 5.0.0-alpha.59

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 (377) hide show
  1. package/Bones/boneIKController.d.ts +1 -2
  2. package/Bones/boneIKController.js +12 -37
  3. package/Bones/boneIKController.js.map +1 -1
  4. package/Buffers/buffer.js +3 -2
  5. package/Buffers/buffer.js.map +1 -1
  6. package/Cameras/Inputs/BaseCameraPointersInput.d.ts +0 -1
  7. package/Cameras/Inputs/BaseCameraPointersInput.js +5 -5
  8. package/Cameras/Inputs/BaseCameraPointersInput.js.map +1 -1
  9. package/Cameras/Inputs/freeCameraMouseInput.d.ts +0 -1
  10. package/Cameras/Inputs/freeCameraMouseInput.js +27 -28
  11. package/Cameras/Inputs/freeCameraMouseInput.js.map +1 -1
  12. package/Cameras/camera.d.ts +4 -0
  13. package/Cameras/camera.js +2 -0
  14. package/Cameras/camera.js.map +1 -1
  15. package/Culling/boundingBox.d.ts +7 -1
  16. package/Culling/boundingBox.js +4 -0
  17. package/Culling/boundingBox.js.map +1 -1
  18. package/DeviceInput/Helpers/eventFactory.js +1 -2
  19. package/DeviceInput/Helpers/eventFactory.js.map +1 -1
  20. package/DeviceInput/Implementations/webDeviceInputSystem.d.ts +1 -0
  21. package/DeviceInput/Implementations/webDeviceInputSystem.js +5 -12
  22. package/DeviceInput/Implementations/webDeviceInputSystem.js.map +1 -1
  23. package/DeviceInput/InputDevices/deviceEnums.d.ts +1 -3
  24. package/DeviceInput/InputDevices/deviceEnums.js +0 -2
  25. package/DeviceInput/InputDevices/deviceEnums.js.map +1 -1
  26. package/Engines/Extensions/engine.alpha.js +11 -6
  27. package/Engines/Extensions/engine.alpha.js.map +1 -1
  28. package/Engines/Extensions/engine.cubeTexture.d.ts +1 -1
  29. package/Engines/Extensions/engine.cubeTexture.js.map +1 -1
  30. package/Engines/Extensions/engine.multiRender.d.ts +2 -2
  31. package/Engines/Extensions/engine.multiRender.js.map +1 -1
  32. package/Engines/Extensions/engine.renderTarget.d.ts +7 -15
  33. package/Engines/Extensions/engine.renderTarget.js +6 -63
  34. package/Engines/Extensions/engine.renderTarget.js.map +1 -1
  35. package/Engines/Extensions/engine.renderTargetCube.d.ts +1 -1
  36. package/Engines/Extensions/engine.renderTargetCube.js.map +1 -1
  37. package/Engines/IDrawContext.d.ts +4 -0
  38. package/Engines/IDrawContext.js.map +1 -1
  39. package/Engines/IMaterialContext.d.ts +1 -0
  40. package/Engines/IMaterialContext.js.map +1 -1
  41. package/Engines/WebGL/webGLRenderTargetWrapper.d.ts +24 -2
  42. package/Engines/WebGL/webGLRenderTargetWrapper.js +53 -0
  43. package/Engines/WebGL/webGLRenderTargetWrapper.js.map +1 -1
  44. package/Engines/WebGPU/Extensions/engine.alpha.js +20 -31
  45. package/Engines/WebGPU/Extensions/engine.alpha.js.map +1 -1
  46. package/Engines/WebGPU/Extensions/engine.cubeTexture.js.map +1 -1
  47. package/Engines/WebGPU/Extensions/engine.multiRender.js.map +1 -1
  48. package/Engines/WebGPU/Extensions/engine.renderTarget.js +2 -40
  49. package/Engines/WebGPU/Extensions/engine.renderTarget.js.map +1 -1
  50. package/Engines/WebGPU/Extensions/engine.renderTargetCube.js.map +1 -1
  51. package/Engines/WebGPU/Extensions/engine.storageBuffer.js +1 -1
  52. package/Engines/WebGPU/Extensions/engine.storageBuffer.js.map +1 -1
  53. package/Engines/WebGPU/Extensions/engine.uniformBuffer.js +1 -1
  54. package/Engines/WebGPU/Extensions/engine.uniformBuffer.js.map +1 -1
  55. package/Engines/WebGPU/webgpuBufferManager.d.ts +1 -0
  56. package/Engines/WebGPU/webgpuBufferManager.js +3 -0
  57. package/Engines/WebGPU/webgpuBufferManager.js.map +1 -1
  58. package/Engines/WebGPU/webgpuCacheBindGroups.d.ts +3 -2
  59. package/Engines/WebGPU/webgpuCacheBindGroups.js +15 -14
  60. package/Engines/WebGPU/webgpuCacheBindGroups.js.map +1 -1
  61. package/Engines/WebGPU/webgpuCacheRenderPipeline.js +18 -18
  62. package/Engines/WebGPU/webgpuCacheRenderPipeline.js.map +1 -1
  63. package/Engines/WebGPU/webgpuCacheRenderPipelineTree.d.ts +2 -0
  64. package/Engines/WebGPU/webgpuCacheRenderPipelineTree.js +17 -0
  65. package/Engines/WebGPU/webgpuCacheRenderPipelineTree.js.map +1 -1
  66. package/Engines/WebGPU/webgpuDrawContext.d.ts +24 -2
  67. package/Engines/WebGPU/webgpuDrawContext.js +75 -1
  68. package/Engines/WebGPU/webgpuDrawContext.js.map +1 -1
  69. package/Engines/WebGPU/webgpuMaterialContext.d.ts +1 -6
  70. package/Engines/WebGPU/webgpuMaterialContext.js +11 -8
  71. package/Engines/WebGPU/webgpuMaterialContext.js.map +1 -1
  72. package/Engines/WebGPU/webgpuShaderProcessor.d.ts +1 -0
  73. package/Engines/WebGPU/webgpuShaderProcessor.js +2 -1
  74. package/Engines/WebGPU/webgpuShaderProcessor.js.map +1 -1
  75. package/Engines/WebGPU/webgpuTextureHelper.d.ts +1 -0
  76. package/Engines/WebGPU/webgpuTextureHelper.js +67 -1
  77. package/Engines/WebGPU/webgpuTextureHelper.js.map +1 -1
  78. package/Engines/constants.d.ts +46 -8
  79. package/Engines/constants.js +46 -8
  80. package/Engines/constants.js.map +1 -1
  81. package/Engines/engine.d.ts +37 -2
  82. package/Engines/engine.js +68 -0
  83. package/Engines/engine.js.map +1 -1
  84. package/Engines/engineFeatures.d.ts +2 -0
  85. package/Engines/engineFeatures.js.map +1 -1
  86. package/Engines/nativeEngine.d.ts +3 -5
  87. package/Engines/nativeEngine.js +2 -2
  88. package/Engines/nativeEngine.js.map +1 -1
  89. package/Engines/nullEngine.d.ts +1 -1
  90. package/Engines/nullEngine.js +2 -2
  91. package/Engines/nullEngine.js.map +1 -1
  92. package/Engines/renderTargetWrapper.d.ts +10 -3
  93. package/Engines/renderTargetWrapper.js +29 -10
  94. package/Engines/renderTargetWrapper.js.map +1 -1
  95. package/Engines/thinEngine.d.ts +16 -1
  96. package/Engines/thinEngine.js +82 -2
  97. package/Engines/thinEngine.js.map +1 -1
  98. package/Engines/webgpuEngine.d.ts +28 -7
  99. package/Engines/webgpuEngine.js +177 -58
  100. package/Engines/webgpuEngine.js.map +1 -1
  101. package/Inputs/scene.inputManager.js +2 -3
  102. package/Inputs/scene.inputManager.js.map +1 -1
  103. package/Layers/effectLayer.d.ts +0 -2
  104. package/Layers/effectLayer.js +12 -11
  105. package/Layers/effectLayer.js.map +1 -1
  106. package/Layers/effectLayerSceneComponent.js +5 -0
  107. package/Layers/effectLayerSceneComponent.js.map +1 -1
  108. package/Layers/glowLayer.js +2 -0
  109. package/Layers/glowLayer.js.map +1 -1
  110. package/Layers/highlightLayer.js +2 -0
  111. package/Layers/highlightLayer.js.map +1 -1
  112. package/LensFlares/lensFlare.d.ts +3 -0
  113. package/LensFlares/lensFlare.js +5 -0
  114. package/LensFlares/lensFlare.js.map +1 -1
  115. package/LensFlares/lensFlareSystem.d.ts +2 -1
  116. package/LensFlares/lensFlareSystem.js +15 -12
  117. package/LensFlares/lensFlareSystem.js.map +1 -1
  118. package/Lights/Shadows/cascadedShadowGenerator.d.ts +0 -2
  119. package/Lights/Shadows/cascadedShadowGenerator.js +3 -12
  120. package/Lights/Shadows/cascadedShadowGenerator.js.map +1 -1
  121. package/Lights/Shadows/shadowGenerator.d.ts +0 -3
  122. package/Lights/Shadows/shadowGenerator.js +8 -14
  123. package/Lights/Shadows/shadowGenerator.js.map +1 -1
  124. package/Lights/light.js +3 -0
  125. package/Lights/light.js.map +1 -1
  126. package/Loading/Plugins/babylonFileLoader.js +3 -0
  127. package/Loading/Plugins/babylonFileLoader.js.map +1 -1
  128. package/Materials/Background/backgroundMaterial.js +8 -11
  129. package/Materials/Background/backgroundMaterial.js.map +1 -1
  130. package/Materials/Node/Blocks/Dual/lightBlock.js +1 -1
  131. package/Materials/Node/Blocks/Dual/lightBlock.js.map +1 -1
  132. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js +1 -1
  133. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js.map +1 -1
  134. package/Materials/Node/Blocks/PBR/reflectionBlock.js +1 -1
  135. package/Materials/Node/Blocks/PBR/reflectionBlock.js.map +1 -1
  136. package/Materials/Node/Blocks/cloudBlock.d.ts +49 -0
  137. package/Materials/Node/Blocks/cloudBlock.js +154 -0
  138. package/Materials/Node/Blocks/cloudBlock.js.map +1 -0
  139. package/Materials/Node/Blocks/colorMergerBlock.d.ts +21 -0
  140. package/Materials/Node/Blocks/colorMergerBlock.js +48 -4
  141. package/Materials/Node/Blocks/colorMergerBlock.js.map +1 -1
  142. package/Materials/Node/Blocks/index.d.ts +1 -0
  143. package/Materials/Node/Blocks/index.js +1 -0
  144. package/Materials/Node/Blocks/index.js.map +1 -1
  145. package/Materials/Node/Blocks/vectorMergerBlock.d.ts +25 -0
  146. package/Materials/Node/Blocks/vectorMergerBlock.js +93 -23
  147. package/Materials/Node/Blocks/vectorMergerBlock.js.map +1 -1
  148. package/Materials/Node/nodeMaterial.js +17 -7
  149. package/Materials/Node/nodeMaterial.js.map +1 -1
  150. package/Materials/Node/nodeMaterialBuildStateSharedData.d.ts +5 -1
  151. package/Materials/Node/nodeMaterialBuildStateSharedData.js +5 -1
  152. package/Materials/Node/nodeMaterialBuildStateSharedData.js.map +1 -1
  153. package/Materials/Node/nodeMaterialDecorator.d.ts +4 -2
  154. package/Materials/Node/nodeMaterialDecorator.js +4 -2
  155. package/Materials/Node/nodeMaterialDecorator.js.map +1 -1
  156. package/Materials/PBR/pbrBaseMaterial.d.ts +4 -2
  157. package/Materials/PBR/pbrBaseMaterial.js +23 -9
  158. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  159. package/Materials/PBR/pbrClearCoatConfiguration.js +1 -1
  160. package/Materials/PBR/pbrClearCoatConfiguration.js.map +1 -1
  161. package/Materials/PBR/pbrSheenConfiguration.js +1 -1
  162. package/Materials/PBR/pbrSheenConfiguration.js.map +1 -1
  163. package/Materials/PBR/pbrSubSurfaceConfiguration.js +1 -1
  164. package/Materials/PBR/pbrSubSurfaceConfiguration.js.map +1 -1
  165. package/Materials/Textures/Procedurals/proceduralTexture.d.ts +3 -3
  166. package/Materials/Textures/Procedurals/proceduralTexture.js.map +1 -1
  167. package/Materials/Textures/baseTexture.d.ts +2 -0
  168. package/Materials/Textures/baseTexture.js +2 -0
  169. package/Materials/Textures/baseTexture.js.map +1 -1
  170. package/Materials/Textures/multiRenderTarget.d.ts +6 -4
  171. package/Materials/Textures/multiRenderTarget.js +28 -12
  172. package/Materials/Textures/multiRenderTarget.js.map +1 -1
  173. package/Materials/Textures/renderTargetTexture.d.ts +29 -3
  174. package/Materials/Textures/renderTargetTexture.js +127 -14
  175. package/Materials/Textures/renderTargetTexture.js.map +1 -1
  176. package/Materials/Textures/texture.js +11 -4
  177. package/Materials/Textures/texture.js.map +1 -1
  178. package/Materials/Textures/textureCreationOptions.d.ts +57 -0
  179. package/Materials/Textures/textureCreationOptions.js +2 -0
  180. package/Materials/Textures/textureCreationOptions.js.map +1 -0
  181. package/Materials/Textures/thinRenderTargetTexture.d.ts +3 -4
  182. package/Materials/Textures/thinRenderTargetTexture.js.map +1 -1
  183. package/Materials/Textures/videoTexture.d.ts +10 -7
  184. package/Materials/Textures/videoTexture.js +17 -11
  185. package/Materials/Textures/videoTexture.js.map +1 -1
  186. package/Materials/drawWrapper.d.ts +2 -1
  187. package/Materials/drawWrapper.js +10 -1
  188. package/Materials/drawWrapper.js.map +1 -1
  189. package/Materials/effectRenderer.js +1 -1
  190. package/Materials/effectRenderer.js.map +1 -1
  191. package/Materials/material.d.ts +3 -1
  192. package/Materials/material.detailMapConfiguration.d.ts +1 -1
  193. package/Materials/material.detailMapConfiguration.js +2 -2
  194. package/Materials/material.detailMapConfiguration.js.map +1 -1
  195. package/Materials/material.js +18 -9
  196. package/Materials/material.js.map +1 -1
  197. package/Materials/materialHelper.d.ts +7 -0
  198. package/Materials/materialHelper.js +17 -2
  199. package/Materials/materialHelper.js.map +1 -1
  200. package/Materials/pushMaterial.js +1 -1
  201. package/Materials/pushMaterial.js.map +1 -1
  202. package/Materials/shaderMaterial.d.ts +1 -1
  203. package/Materials/shaderMaterial.js +5 -5
  204. package/Materials/shaderMaterial.js.map +1 -1
  205. package/Materials/shadowDepthWrapper.d.ts +4 -4
  206. package/Materials/shadowDepthWrapper.js +16 -15
  207. package/Materials/shadowDepthWrapper.js.map +1 -1
  208. package/Materials/standardMaterial.d.ts +4 -2
  209. package/Materials/standardMaterial.js +23 -9
  210. package/Materials/standardMaterial.js.map +1 -1
  211. package/Materials/uniformBuffer.d.ts +10 -2
  212. package/Materials/uniformBuffer.js +17 -11
  213. package/Materials/uniformBuffer.js.map +1 -1
  214. package/Meshes/Builders/capsuleBuilder.d.ts +5 -5
  215. package/Meshes/Builders/capsuleBuilder.js.map +1 -1
  216. package/Meshes/abstractMesh.d.ts +13 -0
  217. package/Meshes/abstractMesh.js +22 -2
  218. package/Meshes/abstractMesh.js.map +1 -1
  219. package/Meshes/buffer.d.ts +5 -0
  220. package/Meshes/buffer.js +6 -0
  221. package/Meshes/buffer.js.map +1 -0
  222. package/Meshes/geometry.d.ts +7 -0
  223. package/Meshes/geometry.js +16 -0
  224. package/Meshes/geometry.js.map +1 -1
  225. package/Meshes/linesMesh.js +1 -1
  226. package/Meshes/linesMesh.js.map +1 -1
  227. package/Meshes/mesh.js +16 -1
  228. package/Meshes/mesh.js.map +1 -1
  229. package/Meshes/mesh.lts.d.ts +5 -1
  230. package/Meshes/mesh.lts.js +1 -2
  231. package/Meshes/mesh.lts.js.map +1 -1
  232. package/Meshes/subMesh.d.ts +10 -9
  233. package/Meshes/subMesh.js +44 -43
  234. package/Meshes/subMesh.js.map +1 -1
  235. package/Misc/environmentTextureTools.js +1 -0
  236. package/Misc/environmentTextureTools.js.map +1 -1
  237. package/Misc/fileTools.d.ts +1 -3
  238. package/Misc/fileTools.js +12 -13
  239. package/Misc/fileTools.js.map +1 -1
  240. package/Misc/fileTools.lts.d.ts +16 -1
  241. package/Misc/fileTools.lts.js +1 -2
  242. package/Misc/fileTools.lts.js.map +1 -1
  243. package/Misc/rgbdTextureTools.js +1 -0
  244. package/Misc/rgbdTextureTools.js.map +1 -1
  245. package/Misc/sceneSerializer.js +17 -17
  246. package/Misc/sceneSerializer.js.map +1 -1
  247. package/Misc/textureTools.js +2 -0
  248. package/Misc/textureTools.js.map +1 -1
  249. package/Particles/gpuParticleSystem.d.ts +5 -1
  250. package/Particles/gpuParticleSystem.js +31 -5
  251. package/Particles/gpuParticleSystem.js.map +1 -1
  252. package/Particles/particleSystem.d.ts +5 -1
  253. package/Particles/particleSystem.js +35 -5
  254. package/Particles/particleSystem.js.map +1 -1
  255. package/Physics/Plugins/ammoJSPlugin.d.ts +1 -0
  256. package/Physics/Plugins/ammoJSPlugin.js +10 -0
  257. package/Physics/Plugins/ammoJSPlugin.js.map +1 -1
  258. package/PostProcesses/RenderPipeline/Pipelines/lensRenderingPipeline.js +2 -0
  259. package/PostProcesses/RenderPipeline/Pipelines/lensRenderingPipeline.js.map +1 -1
  260. package/PostProcesses/RenderPipeline/Pipelines/ssaoRenderingPipeline.js +1 -0
  261. package/PostProcesses/RenderPipeline/Pipelines/ssaoRenderingPipeline.js.map +1 -1
  262. package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.js +1 -0
  263. package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.js.map +1 -1
  264. package/PostProcesses/bloomMergePostProcess.js +1 -0
  265. package/PostProcesses/bloomMergePostProcess.js.map +1 -1
  266. package/PostProcesses/depthOfFieldBlurPostProcess.js +1 -0
  267. package/PostProcesses/depthOfFieldBlurPostProcess.js.map +1 -1
  268. package/PostProcesses/depthOfFieldMergePostProcess.js +1 -0
  269. package/PostProcesses/depthOfFieldMergePostProcess.js.map +1 -1
  270. package/PostProcesses/extractHighlightsPostProcess.js +1 -0
  271. package/PostProcesses/extractHighlightsPostProcess.js.map +1 -1
  272. package/PostProcesses/postProcess.d.ts +6 -0
  273. package/PostProcesses/postProcess.js +9 -1
  274. package/PostProcesses/postProcess.js.map +1 -1
  275. package/PostProcesses/screenSpaceReflectionPostProcess.js +2 -2
  276. package/PostProcesses/screenSpaceReflectionPostProcess.js.map +1 -1
  277. package/PostProcesses/tonemapPostProcess.d.ts +2 -1
  278. package/PostProcesses/tonemapPostProcess.js +3 -2
  279. package/PostProcesses/tonemapPostProcess.js.map +1 -1
  280. package/Rendering/boundingBoxRenderer.d.ts +5 -3
  281. package/Rendering/boundingBoxRenderer.js +46 -14
  282. package/Rendering/boundingBoxRenderer.js.map +1 -1
  283. package/Rendering/depthPeelingRenderer.d.ts +85 -0
  284. package/Rendering/depthPeelingRenderer.js +390 -0
  285. package/Rendering/depthPeelingRenderer.js.map +1 -0
  286. package/Rendering/depthPeelingSceneComponent.d.ts +51 -0
  287. package/Rendering/depthPeelingSceneComponent.js +73 -0
  288. package/Rendering/depthPeelingSceneComponent.js.map +1 -0
  289. package/Rendering/depthRenderer.d.ts +9 -2
  290. package/Rendering/depthRenderer.js +77 -43
  291. package/Rendering/depthRenderer.js.map +1 -1
  292. package/Rendering/depthRendererSceneComponent.js +0 -1
  293. package/Rendering/depthRendererSceneComponent.js.map +1 -1
  294. package/Rendering/edgesRenderer.d.ts +2 -0
  295. package/Rendering/edgesRenderer.js +11 -0
  296. package/Rendering/edgesRenderer.js.map +1 -1
  297. package/Rendering/geometryBufferRenderer.js +4 -4
  298. package/Rendering/geometryBufferRenderer.js.map +1 -1
  299. package/Rendering/index.d.ts +2 -0
  300. package/Rendering/index.js +2 -0
  301. package/Rendering/index.js.map +1 -1
  302. package/Rendering/outlineRenderer.d.ts +5 -4
  303. package/Rendering/outlineRenderer.js +24 -19
  304. package/Rendering/outlineRenderer.js.map +1 -1
  305. package/Rendering/prePassRenderer.js +7 -2
  306. package/Rendering/prePassRenderer.js.map +1 -1
  307. package/Rendering/renderingGroup.js +7 -2
  308. package/Rendering/renderingGroup.js.map +1 -1
  309. package/Shaders/ShadersInclude/boundingBoxRendererFragmentDeclaration.d.ts +5 -0
  310. package/Shaders/ShadersInclude/boundingBoxRendererFragmentDeclaration.js +7 -0
  311. package/Shaders/ShadersInclude/boundingBoxRendererFragmentDeclaration.js.map +1 -0
  312. package/Shaders/ShadersInclude/boundingBoxRendererUboDeclaration.d.ts +5 -0
  313. package/Shaders/ShadersInclude/boundingBoxRendererUboDeclaration.js +7 -0
  314. package/Shaders/ShadersInclude/boundingBoxRendererUboDeclaration.js.map +1 -0
  315. package/Shaders/ShadersInclude/boundingBoxRendererVertexDeclaration.d.ts +5 -0
  316. package/Shaders/ShadersInclude/boundingBoxRendererVertexDeclaration.js +7 -0
  317. package/Shaders/ShadersInclude/boundingBoxRendererVertexDeclaration.js.map +1 -0
  318. package/Shaders/ShadersInclude/oitDeclaration.d.ts +5 -0
  319. package/Shaders/ShadersInclude/oitDeclaration.js +7 -0
  320. package/Shaders/ShadersInclude/oitDeclaration.js.map +1 -0
  321. package/Shaders/ShadersInclude/oitFragment.d.ts +5 -0
  322. package/Shaders/ShadersInclude/oitFragment.js +7 -0
  323. package/Shaders/ShadersInclude/oitFragment.js.map +1 -0
  324. package/Shaders/boundingBoxRenderer.fragment.d.ts +7 -0
  325. package/Shaders/boundingBoxRenderer.fragment.js +9 -0
  326. package/Shaders/boundingBoxRenderer.fragment.js.map +1 -0
  327. package/Shaders/boundingBoxRenderer.vertex.d.ts +7 -0
  328. package/Shaders/boundingBoxRenderer.vertex.js +9 -0
  329. package/Shaders/boundingBoxRenderer.vertex.js.map +1 -0
  330. package/Shaders/default.fragment.d.ts +2 -0
  331. package/Shaders/default.fragment.js +3 -1
  332. package/Shaders/default.fragment.js.map +1 -1
  333. package/Shaders/oitBackBlend.fragment.d.ts +5 -0
  334. package/Shaders/oitBackBlend.fragment.js +7 -0
  335. package/Shaders/oitBackBlend.fragment.js.map +1 -0
  336. package/Shaders/oitFinal.fragment.d.ts +5 -0
  337. package/Shaders/oitFinal.fragment.js +7 -0
  338. package/Shaders/oitFinal.fragment.js.map +1 -0
  339. package/Shaders/pbr.fragment.d.ts +2 -0
  340. package/Shaders/pbr.fragment.js +3 -1
  341. package/Shaders/pbr.fragment.js.map +1 -1
  342. package/Shaders/screenSpaceReflection.fragment.js +1 -1
  343. package/Shaders/screenSpaceReflection.fragment.js.map +1 -1
  344. package/Sprites/spriteManager.d.ts +3 -1
  345. package/Sprites/spriteManager.js +16 -5
  346. package/Sprites/spriteManager.js.map +1 -1
  347. package/Sprites/spriteRenderer.d.ts +1 -0
  348. package/Sprites/spriteRenderer.js +14 -0
  349. package/Sprites/spriteRenderer.js.map +1 -1
  350. package/States/alphaCullingState.js +1 -1
  351. package/States/alphaCullingState.js.map +1 -1
  352. package/XR/features/WebXRControllerPointerSelection.d.ts +4 -0
  353. package/XR/features/WebXRControllerPointerSelection.js +23 -1
  354. package/XR/features/WebXRControllerPointerSelection.js.map +1 -1
  355. package/XR/features/WebXRNearInteraction.d.ts +5 -4
  356. package/XR/features/WebXRNearInteraction.js +15 -13
  357. package/XR/features/WebXRNearInteraction.js.map +1 -1
  358. package/XR/features/WebXRWalkingLocomotion.js +28 -13
  359. package/XR/features/WebXRWalkingLocomotion.js.map +1 -1
  360. package/XR/webXRSessionManager.js +1 -3
  361. package/XR/webXRSessionManager.js.map +1 -1
  362. package/package.json +43 -7
  363. package/scene.d.ts +18 -4
  364. package/scene.js +101 -42
  365. package/scene.js.map +1 -1
  366. package/scene.lts.d.ts +6 -1
  367. package/scene.lts.js +1 -2
  368. package/scene.lts.js.map +1 -1
  369. package/sceneComponent.d.ts +1 -0
  370. package/sceneComponent.js +1 -0
  371. package/sceneComponent.js.map +1 -1
  372. package/Engines/depthTextureCreationOptions.d.ts +0 -17
  373. package/Engines/depthTextureCreationOptions.js +0 -10
  374. package/Engines/depthTextureCreationOptions.js.map +0 -1
  375. package/Materials/Textures/renderTargetCreationOptions.d.ts +0 -27
  376. package/Materials/Textures/renderTargetCreationOptions.js +0 -10
  377. package/Materials/Textures/renderTargetCreationOptions.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"WebXRControllerPointerSelection.js","sourceRoot":"","sources":["../../../../sourceES6/core/XR/features/WebXRControllerPointerSelection.ts"],"names":[],"mappings":"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","sourcesContent":["import { WebXRFeaturesManager, WebXRFeatureName } from \"../webXRFeaturesManager\";\r\nimport { WebXRSessionManager } from \"../webXRSessionManager\";\r\nimport { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport { Observer } from \"../../Misc/observable\";\r\nimport { WebXRInput } from \"../webXRInput\";\r\nimport { WebXRInputSource } from \"../webXRInputSource\";\r\nimport { Scene } from \"../../scene\";\r\nimport { WebXRControllerComponent } from \"../motionController/webXRControllerComponent\";\r\nimport { Nullable } from \"../../types\";\r\nimport { Matrix, Vector3 } from \"../../Maths/math.vector\";\r\nimport { Color3 } from \"../../Maths/math.color\";\r\nimport { Axis } from \"../../Maths/math.axis\";\r\nimport { StandardMaterial } from \"../../Materials/standardMaterial\";\r\nimport { CreateCylinder } from \"../../Meshes/Builders/cylinderBuilder\";\r\nimport { CreateTorus } from \"../../Meshes/Builders/torusBuilder\";\r\nimport { Ray } from \"../../Culling/ray\";\r\nimport { PickingInfo } from \"../../Collisions/pickingInfo\";\r\nimport { WebXRAbstractFeature } from \"./WebXRAbstractFeature\";\r\nimport { UtilityLayerRenderer } from \"../../Rendering/utilityLayerRenderer\";\r\nimport { WebXRAbstractMotionController } from \"../motionController/webXRAbstractMotionController\";\r\nimport { WebXRCamera } from \"../webXRCamera\";\r\nimport { Node } from \"../../node\";\r\nimport { Viewport } from \"../../Maths/math.viewport\";\r\n\r\n/**\r\n * Options interface for the pointer selection module\r\n */\r\nexport interface IWebXRControllerPointerSelectionOptions {\r\n /**\r\n * if provided, this scene will be used to render meshes.\r\n */\r\n customUtilityLayerScene?: Scene;\r\n /**\r\n * Disable the pointer up event when the xr controller in screen and gaze mode is disposed (meaning - when the user removed the finger from the screen)\r\n * If not disabled, the last picked point will be used to execute a pointer up event\r\n * If disabled, pointer up event will be triggered right after the pointer down event.\r\n * Used in screen and gaze target ray mode only\r\n */\r\n disablePointerUpOnTouchOut: boolean;\r\n /**\r\n * For gaze mode for tracked-pointer / controllers (time to select instead of button press)\r\n */\r\n forceGazeMode: boolean;\r\n /**\r\n * Factor to be applied to the pointer-moved function in the gaze mode. How sensitive should the gaze mode be when checking if the pointer moved\r\n * to start a new countdown to the pointer down event.\r\n * Defaults to 1.\r\n */\r\n gazeModePointerMovedFactor?: number;\r\n /**\r\n * Different button type to use instead of the main component\r\n */\r\n overrideButtonId?: string;\r\n /**\r\n * use this rendering group id for the meshes (optional)\r\n */\r\n renderingGroupId?: number;\r\n /**\r\n * The amount of time in milliseconds it takes between pick found something to a pointer down event.\r\n * Used in gaze modes. Tracked pointer uses the trigger, screen uses touch events\r\n * 3000 means 3 seconds between pointing at something and selecting it\r\n */\r\n timeToSelect?: number;\r\n /**\r\n * Should meshes created here be added to a utility layer or the main scene\r\n */\r\n useUtilityLayer?: boolean;\r\n /**\r\n * Optional WebXR camera to be used for gaze selection\r\n */\r\n gazeCamera?: WebXRCamera;\r\n /**\r\n * the xr input to use with this pointer selection\r\n */\r\n xrInput: WebXRInput;\r\n\r\n /**\r\n * Should the scene pointerX and pointerY update be disabled\r\n * This is required for fullscreen AR GUI, but might slow down other experiences.\r\n * Disable in VR, if not needed.\r\n * The first rig camera (left eye) will be used to calculate the projection\r\n */\r\n disableScenePointerVectorUpdate: boolean;\r\n\r\n /**\r\n * Enable pointer selection on all controllers instead of switching between them\r\n */\r\n enablePointerSelectionOnAllControllers?: boolean;\r\n\r\n /**\r\n * The preferred hand to give the pointer selection to. This will be prioritized when the controller initialize.\r\n * If switch is enabled, it will still allow the user to switch between the different controllers\r\n */\r\n preferredHandedness?: XRHandedness;\r\n\r\n /**\r\n * Disable switching the pointer selection from one controller to the other.\r\n * If the preferred hand is set it will be fixed on this hand, and if not it will be fixed on the first controller added to the scene\r\n */\r\n disableSwitchOnClick?: boolean;\r\n\r\n /**\r\n * The maximum distance of the pointer selection feature. Defaults to 100.\r\n */\r\n maxPointerDistance?: number;\r\n}\r\n\r\n/**\r\n * A module that will enable pointer selection for motion controllers of XR Input Sources\r\n */\r\nexport class WebXRControllerPointerSelection extends WebXRAbstractFeature {\r\n private static _idCounter = 200;\r\n\r\n private _attachController = (xrController: WebXRInputSource) => {\r\n if (this._controllers[xrController.uniqueId]) {\r\n // already attached\r\n return;\r\n }\r\n\r\n const { laserPointer, selectionMesh } = this._generateNewMeshPair(xrController.pointer);\r\n\r\n // get two new meshes\r\n this._controllers[xrController.uniqueId] = {\r\n xrController,\r\n laserPointer,\r\n selectionMesh,\r\n meshUnderPointer: null,\r\n pick: null,\r\n tmpRay: new Ray(new Vector3(), new Vector3()),\r\n id: WebXRControllerPointerSelection._idCounter++,\r\n };\r\n\r\n if (this._attachedController) {\r\n if (\r\n !this._options.enablePointerSelectionOnAllControllers &&\r\n this._options.preferredHandedness &&\r\n xrController.inputSource.handedness === this._options.preferredHandedness\r\n ) {\r\n this._attachedController = xrController.uniqueId;\r\n }\r\n } else {\r\n if (!this._options.enablePointerSelectionOnAllControllers) {\r\n this._attachedController = xrController.uniqueId;\r\n }\r\n }\r\n\r\n switch (xrController.inputSource.targetRayMode) {\r\n case \"tracked-pointer\":\r\n return this._attachTrackedPointerRayMode(xrController);\r\n case \"gaze\":\r\n return this._attachGazeMode(xrController);\r\n case \"screen\":\r\n return this._attachScreenRayMode(xrController);\r\n }\r\n };\r\n\r\n private _controllers: {\r\n [controllerUniqueId: string]: {\r\n xrController?: WebXRInputSource;\r\n webXRCamera?: WebXRCamera;\r\n selectionComponent?: WebXRControllerComponent;\r\n onButtonChangedObserver?: Nullable<Observer<WebXRControllerComponent>>;\r\n onFrameObserver?: Nullable<Observer<XRFrame>>;\r\n laserPointer: AbstractMesh;\r\n selectionMesh: AbstractMesh;\r\n meshUnderPointer: Nullable<AbstractMesh>;\r\n pick: Nullable<PickingInfo>;\r\n id: number;\r\n tmpRay: Ray;\r\n // event support\r\n eventListeners?: { [event in XREventType]?: (event: XRInputSourceEvent) => void };\r\n };\r\n } = {};\r\n private _scene: Scene;\r\n private _tmpVectorForPickCompare = new Vector3();\r\n\r\n private _attachedController: string;\r\n\r\n /**\r\n * The module's name\r\n */\r\n public static readonly Name = WebXRFeatureName.POINTER_SELECTION;\r\n /**\r\n * The (Babylon) version of this module.\r\n * This is an integer representing the implementation version.\r\n * This number does not correspond to the WebXR specs version\r\n */\r\n public static readonly Version = 1;\r\n\r\n /**\r\n * Disable lighting on the laser pointer (so it will always be visible)\r\n */\r\n public disablePointerLighting: boolean = true;\r\n /**\r\n * Disable lighting on the selection mesh (so it will always be visible)\r\n */\r\n public disableSelectionMeshLighting: boolean = true;\r\n /**\r\n * Should the laser pointer be displayed\r\n */\r\n public displayLaserPointer: boolean = true;\r\n /**\r\n * Should the selection mesh be displayed (The ring at the end of the laser pointer)\r\n */\r\n public displaySelectionMesh: boolean = true;\r\n /**\r\n * This color will be set to the laser pointer when selection is triggered\r\n */\r\n public laserPointerPickedColor: Color3 = new Color3(0.9, 0.9, 0.9);\r\n /**\r\n * Default color of the laser pointer\r\n */\r\n public laserPointerDefaultColor: Color3 = new Color3(0.7, 0.7, 0.7);\r\n /**\r\n * default color of the selection ring\r\n */\r\n public selectionMeshDefaultColor: Color3 = new Color3(0.8, 0.8, 0.8);\r\n /**\r\n * This color will be applied to the selection ring when selection is triggered\r\n */\r\n public selectionMeshPickedColor: Color3 = new Color3(0.3, 0.3, 1.0);\r\n\r\n /**\r\n * Optional filter to be used for ray selection. This predicate shares behavior with\r\n * scene.pointerMovePredicate which takes priority if it is also assigned.\r\n */\r\n public raySelectionPredicate: (mesh: AbstractMesh) => boolean;\r\n\r\n /**\r\n * constructs a new background remover module\r\n * @param _xrSessionManager the session manager for this module\r\n * @param _options read-only options to be used in this module\r\n */\r\n constructor(_xrSessionManager: WebXRSessionManager, private readonly _options: IWebXRControllerPointerSelectionOptions) {\r\n super(_xrSessionManager);\r\n this._scene = this._xrSessionManager.scene;\r\n }\r\n\r\n /**\r\n * attach this feature\r\n * Will usually be called by the features manager\r\n *\r\n * @returns true if successful.\r\n */\r\n public attach(): boolean {\r\n if (!super.attach()) {\r\n return false;\r\n }\r\n\r\n this._options.xrInput.controllers.forEach(this._attachController);\r\n this._addNewAttachObserver(this._options.xrInput.onControllerAddedObservable, this._attachController);\r\n this._addNewAttachObserver(this._options.xrInput.onControllerRemovedObservable, (controller) => {\r\n // REMOVE the controller\r\n this._detachController(controller.uniqueId);\r\n });\r\n\r\n this._scene.constantlyUpdateMeshUnderPointer = true;\r\n\r\n if (this._options.gazeCamera) {\r\n const webXRCamera = this._options.gazeCamera;\r\n\r\n const { laserPointer, selectionMesh } = this._generateNewMeshPair(webXRCamera);\r\n\r\n this._controllers[\"camera\"] = {\r\n webXRCamera,\r\n laserPointer,\r\n selectionMesh,\r\n meshUnderPointer: null,\r\n pick: null,\r\n tmpRay: new Ray(new Vector3(), new Vector3()),\r\n id: WebXRControllerPointerSelection._idCounter++,\r\n };\r\n this._attachGazeMode();\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * detach this feature.\r\n * Will usually be called by the features manager\r\n *\r\n * @returns true if successful.\r\n */\r\n public detach(): boolean {\r\n if (!super.detach()) {\r\n return false;\r\n }\r\n\r\n Object.keys(this._controllers).forEach((controllerId) => {\r\n this._detachController(controllerId);\r\n });\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Will get the mesh under a specific pointer.\r\n * `scene.meshUnderPointer` will only return one mesh - either left or right.\r\n * @param controllerId the controllerId to check\r\n * @returns The mesh under pointer or null if no mesh is under the pointer\r\n */\r\n public getMeshUnderPointer(controllerId: string): Nullable<AbstractMesh> {\r\n if (this._controllers[controllerId]) {\r\n return this._controllers[controllerId].meshUnderPointer;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Get the xr controller that correlates to the pointer id in the pointer event\r\n *\r\n * @param id the pointer id to search for\r\n * @returns the controller that correlates to this id or null if not found\r\n */\r\n public getXRControllerByPointerId(id: number): Nullable<WebXRInputSource> {\r\n const keys = Object.keys(this._controllers);\r\n\r\n for (let i = 0; i < keys.length; ++i) {\r\n if (this._controllers[keys[i]].id === id) {\r\n return this._controllers[keys[i]].xrController || null;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n private _identityMatrix = Matrix.Identity();\r\n private _screenCoordinatesRef = Vector3.Zero();\r\n private _viewportRef = new Viewport(0, 0, 0, 0);\r\n\r\n protected _onXRFrame(_xrFrame: XRFrame) {\r\n Object.keys(this._controllers).forEach((id) => {\r\n // only do this for the selected pointer\r\n const controllerData = this._controllers[id];\r\n if (!this._options.enablePointerSelectionOnAllControllers && id !== this._attachedController) {\r\n controllerData.selectionMesh.isVisible = false;\r\n controllerData.laserPointer.isVisible = false;\r\n controllerData.pick = null;\r\n return;\r\n }\r\n\r\n controllerData.laserPointer.isVisible = this.displayLaserPointer;\r\n\r\n let controllerGlobalPosition: Vector3;\r\n\r\n // Every frame check collisions/input\r\n if (controllerData.xrController) {\r\n controllerGlobalPosition = controllerData.xrController.pointer.position;\r\n controllerData.xrController.getWorldPointerRayToRef(controllerData.tmpRay);\r\n } else if (controllerData.webXRCamera) {\r\n controllerGlobalPosition = controllerData.webXRCamera.position;\r\n controllerData.webXRCamera.getForwardRayToRef(controllerData.tmpRay);\r\n } else {\r\n return;\r\n }\r\n\r\n if (this._options.maxPointerDistance) {\r\n controllerData.tmpRay.length = this._options.maxPointerDistance;\r\n }\r\n // update pointerX and pointerY of the scene. Only if the flag is set to true!\r\n if (!this._options.disableScenePointerVectorUpdate && controllerGlobalPosition) {\r\n const scene = this._xrSessionManager.scene;\r\n const camera = this._options.xrInput.xrCamera;\r\n if (camera) {\r\n camera.viewport.toGlobalToRef(scene.getEngine().getRenderWidth(), scene.getEngine().getRenderHeight(), this._viewportRef);\r\n Vector3.ProjectToRef(controllerGlobalPosition, this._identityMatrix, scene.getTransformMatrix(), this._viewportRef, this._screenCoordinatesRef);\r\n\r\n scene.pointerX = this._screenCoordinatesRef.x;\r\n scene.pointerY = this._screenCoordinatesRef.y;\r\n }\r\n }\r\n\r\n let utilityScenePick = null;\r\n if (this._utilityLayerScene) {\r\n utilityScenePick = this._utilityLayerScene.pickWithRay(controllerData.tmpRay, this._utilityLayerScene.pointerMovePredicate || this.raySelectionPredicate);\r\n }\r\n\r\n let originalScenePick = this._scene.pickWithRay(controllerData.tmpRay, this._scene.pointerMovePredicate || this.raySelectionPredicate);\r\n if (!utilityScenePick || !utilityScenePick.hit) {\r\n // No hit in utility scene\r\n controllerData.pick = originalScenePick;\r\n } else if (!originalScenePick || !originalScenePick.hit) {\r\n // No hit in original scene\r\n controllerData.pick = utilityScenePick;\r\n } else if (utilityScenePick.distance < originalScenePick.distance) {\r\n // Hit is closer in utility scene\r\n controllerData.pick = utilityScenePick;\r\n } else {\r\n // Hit is closer in original scene\r\n controllerData.pick = originalScenePick;\r\n }\r\n\r\n if (controllerData.pick && controllerData.xrController) {\r\n controllerData.pick.aimTransform = controllerData.xrController.pointer;\r\n controllerData.pick.gripTransform = controllerData.xrController.grip || null;\r\n }\r\n\r\n const pick = controllerData.pick;\r\n\r\n if (pick && pick.pickedPoint && pick.hit) {\r\n // Update laser state\r\n this._updatePointerDistance(controllerData.laserPointer, pick.distance);\r\n\r\n // Update cursor state\r\n controllerData.selectionMesh.position.copyFrom(pick.pickedPoint);\r\n controllerData.selectionMesh.scaling.x = Math.sqrt(pick.distance);\r\n controllerData.selectionMesh.scaling.y = Math.sqrt(pick.distance);\r\n controllerData.selectionMesh.scaling.z = Math.sqrt(pick.distance);\r\n\r\n // To avoid z-fighting\r\n let pickNormal = this._convertNormalToDirectionOfRay(pick.getNormal(true), controllerData.tmpRay);\r\n let deltaFighting = 0.001;\r\n controllerData.selectionMesh.position.copyFrom(pick.pickedPoint);\r\n if (pickNormal) {\r\n let axis1 = Vector3.Cross(Axis.Y, pickNormal);\r\n let axis2 = Vector3.Cross(pickNormal, axis1);\r\n Vector3.RotationFromAxisToRef(axis2, pickNormal, axis1, controllerData.selectionMesh.rotation);\r\n controllerData.selectionMesh.position.addInPlace(pickNormal.scale(deltaFighting));\r\n }\r\n controllerData.selectionMesh.isVisible = true && this.displaySelectionMesh;\r\n controllerData.meshUnderPointer = pick.pickedMesh;\r\n } else {\r\n controllerData.selectionMesh.isVisible = false;\r\n this._updatePointerDistance(controllerData.laserPointer, 1);\r\n controllerData.meshUnderPointer = null;\r\n }\r\n });\r\n }\r\n\r\n private get _utilityLayerScene() {\r\n return this._options.customUtilityLayerScene || UtilityLayerRenderer.DefaultUtilityLayer.utilityLayerScene;\r\n }\r\n\r\n private _attachGazeMode(xrController?: WebXRInputSource) {\r\n const controllerData = this._controllers[(xrController && xrController.uniqueId) || \"camera\"];\r\n // attached when touched, detaches when raised\r\n const timeToSelect = this._options.timeToSelect || 3000;\r\n const sceneToRenderTo = this._options.useUtilityLayer ? this._utilityLayerScene : this._scene;\r\n let oldPick = new PickingInfo();\r\n let discMesh = CreateTorus(\r\n \"selection\",\r\n {\r\n diameter: 0.0035 * 15,\r\n thickness: 0.0025 * 6,\r\n tessellation: 20,\r\n },\r\n sceneToRenderTo\r\n );\r\n discMesh.isVisible = false;\r\n discMesh.isPickable = false;\r\n discMesh.parent = controllerData.selectionMesh;\r\n let timer = 0;\r\n let downTriggered = false;\r\n const pointerEventInit: PointerEventInit = {\r\n pointerId: controllerData.id,\r\n pointerType: \"xr\",\r\n };\r\n controllerData.onFrameObserver = this._xrSessionManager.onXRFrameObservable.add(() => {\r\n if (!controllerData.pick) {\r\n return;\r\n }\r\n controllerData.laserPointer.material!.alpha = 0;\r\n discMesh.isVisible = false;\r\n if (controllerData.pick.hit) {\r\n if (!this._pickingMoved(oldPick, controllerData.pick)) {\r\n if (timer > timeToSelect / 10) {\r\n discMesh.isVisible = true;\r\n }\r\n\r\n timer += this._scene.getEngine().getDeltaTime();\r\n if (timer >= timeToSelect) {\r\n this._scene.simulatePointerDown(controllerData.pick, pointerEventInit);\r\n downTriggered = true;\r\n // pointer up right after down, if disable on touch out\r\n if (this._options.disablePointerUpOnTouchOut) {\r\n this._scene.simulatePointerUp(controllerData.pick, pointerEventInit);\r\n }\r\n discMesh.isVisible = false;\r\n } else {\r\n const scaleFactor = 1 - timer / timeToSelect;\r\n discMesh.scaling.set(scaleFactor, scaleFactor, scaleFactor);\r\n }\r\n } else {\r\n if (downTriggered) {\r\n if (!this._options.disablePointerUpOnTouchOut) {\r\n this._scene.simulatePointerUp(controllerData.pick, pointerEventInit);\r\n }\r\n }\r\n downTriggered = false;\r\n timer = 0;\r\n }\r\n } else {\r\n downTriggered = false;\r\n timer = 0;\r\n }\r\n\r\n this._scene.simulatePointerMove(controllerData.pick, pointerEventInit);\r\n\r\n oldPick = controllerData.pick;\r\n });\r\n\r\n if (this._options.renderingGroupId !== undefined) {\r\n discMesh.renderingGroupId = this._options.renderingGroupId;\r\n }\r\n if (xrController) {\r\n xrController.onDisposeObservable.addOnce(() => {\r\n if (controllerData.pick && !this._options.disablePointerUpOnTouchOut && downTriggered) {\r\n this._scene.simulatePointerUp(controllerData.pick, pointerEventInit);\r\n }\r\n discMesh.dispose();\r\n });\r\n }\r\n }\r\n\r\n private _attachScreenRayMode(xrController: WebXRInputSource) {\r\n const controllerData = this._controllers[xrController.uniqueId];\r\n let downTriggered = false;\r\n const pointerEventInit: PointerEventInit = {\r\n pointerId: controllerData.id,\r\n pointerType: \"xr\",\r\n };\r\n controllerData.onFrameObserver = this._xrSessionManager.onXRFrameObservable.add(() => {\r\n if (!controllerData.pick || (this._options.disablePointerUpOnTouchOut && downTriggered)) {\r\n return;\r\n }\r\n if (!downTriggered) {\r\n this._scene.simulatePointerDown(controllerData.pick, pointerEventInit);\r\n downTriggered = true;\r\n if (this._options.disablePointerUpOnTouchOut) {\r\n this._scene.simulatePointerUp(controllerData.pick, pointerEventInit);\r\n }\r\n } else {\r\n this._scene.simulatePointerMove(controllerData.pick, pointerEventInit);\r\n }\r\n });\r\n xrController.onDisposeObservable.addOnce(() => {\r\n if (controllerData.pick && downTriggered && !this._options.disablePointerUpOnTouchOut) {\r\n this._scene.simulatePointerUp(controllerData.pick, pointerEventInit);\r\n }\r\n });\r\n }\r\n\r\n private _attachTrackedPointerRayMode(xrController: WebXRInputSource) {\r\n const controllerData = this._controllers[xrController.uniqueId];\r\n if (this._options.forceGazeMode) {\r\n return this._attachGazeMode(xrController);\r\n }\r\n const pointerEventInit: PointerEventInit = {\r\n pointerId: controllerData.id,\r\n pointerType: \"xr\",\r\n };\r\n controllerData.onFrameObserver = this._xrSessionManager.onXRFrameObservable.add(() => {\r\n (<StandardMaterial>controllerData.laserPointer.material).disableLighting = this.disablePointerLighting;\r\n (<StandardMaterial>controllerData.selectionMesh.material).disableLighting = this.disableSelectionMeshLighting;\r\n\r\n if (controllerData.pick) {\r\n this._scene.simulatePointerMove(controllerData.pick, pointerEventInit);\r\n }\r\n });\r\n if (xrController.inputSource.gamepad) {\r\n const init = (motionController: WebXRAbstractMotionController) => {\r\n if (this._options.overrideButtonId) {\r\n controllerData.selectionComponent = motionController.getComponent(this._options.overrideButtonId);\r\n }\r\n if (!controllerData.selectionComponent) {\r\n controllerData.selectionComponent = motionController.getMainComponent();\r\n }\r\n\r\n controllerData.onButtonChangedObserver = controllerData.selectionComponent.onButtonStateChangedObservable.add((component) => {\r\n if (component.changes.pressed) {\r\n const pressed = component.changes.pressed.current;\r\n if (controllerData.pick) {\r\n if (this._options.enablePointerSelectionOnAllControllers || xrController.uniqueId === this._attachedController) {\r\n if (pressed) {\r\n this._scene.simulatePointerDown(controllerData.pick, pointerEventInit);\r\n (<StandardMaterial>controllerData.selectionMesh.material).emissiveColor = this.selectionMeshPickedColor;\r\n (<StandardMaterial>controllerData.laserPointer.material).emissiveColor = this.laserPointerPickedColor;\r\n } else {\r\n this._scene.simulatePointerUp(controllerData.pick, pointerEventInit);\r\n (<StandardMaterial>controllerData.selectionMesh.material).emissiveColor = this.selectionMeshDefaultColor;\r\n (<StandardMaterial>controllerData.laserPointer.material).emissiveColor = this.laserPointerDefaultColor;\r\n }\r\n } else {\r\n }\r\n } else {\r\n if (pressed && !this._options.enablePointerSelectionOnAllControllers && !this._options.disableSwitchOnClick) {\r\n this._attachedController = xrController.uniqueId;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n if (xrController.motionController) {\r\n init(xrController.motionController);\r\n } else {\r\n xrController.onMotionControllerInitObservable.add(init);\r\n }\r\n } else {\r\n // use the select and squeeze events\r\n const selectStartListener = (event: XRInputSourceEvent) => {\r\n if (controllerData.xrController && event.inputSource === controllerData.xrController.inputSource && controllerData.pick) {\r\n this._scene.simulatePointerDown(controllerData.pick, pointerEventInit);\r\n (<StandardMaterial>controllerData.selectionMesh.material).emissiveColor = this.selectionMeshPickedColor;\r\n (<StandardMaterial>controllerData.laserPointer.material).emissiveColor = this.laserPointerPickedColor;\r\n }\r\n };\r\n\r\n const selectEndListener = (event: XRInputSourceEvent) => {\r\n if (controllerData.xrController && event.inputSource === controllerData.xrController.inputSource && controllerData.pick) {\r\n this._scene.simulatePointerUp(controllerData.pick, pointerEventInit);\r\n (<StandardMaterial>controllerData.selectionMesh.material).emissiveColor = this.selectionMeshDefaultColor;\r\n (<StandardMaterial>controllerData.laserPointer.material).emissiveColor = this.laserPointerDefaultColor;\r\n }\r\n };\r\n\r\n controllerData.eventListeners = {\r\n selectend: selectEndListener,\r\n selectstart: selectStartListener,\r\n };\r\n\r\n this._xrSessionManager.session.addEventListener(\"selectstart\", selectStartListener);\r\n this._xrSessionManager.session.addEventListener(\"selectend\", selectEndListener);\r\n }\r\n }\r\n\r\n private _convertNormalToDirectionOfRay(normal: Nullable<Vector3>, ray: Ray) {\r\n if (normal) {\r\n let angle = Math.acos(Vector3.Dot(normal, ray.direction));\r\n if (angle < Math.PI / 2) {\r\n normal.scaleInPlace(-1);\r\n }\r\n }\r\n return normal;\r\n }\r\n\r\n private _detachController(xrControllerUniqueId: string) {\r\n const controllerData = this._controllers[xrControllerUniqueId];\r\n if (!controllerData) {\r\n return;\r\n }\r\n if (controllerData.selectionComponent) {\r\n if (controllerData.onButtonChangedObserver) {\r\n controllerData.selectionComponent.onButtonStateChangedObservable.remove(controllerData.onButtonChangedObserver);\r\n }\r\n }\r\n if (controllerData.onFrameObserver) {\r\n this._xrSessionManager.onXRFrameObservable.remove(controllerData.onFrameObserver);\r\n }\r\n if (controllerData.eventListeners) {\r\n Object.keys(controllerData.eventListeners).forEach((eventName: string) => {\r\n const func = controllerData.eventListeners && controllerData.eventListeners[eventName as XREventType];\r\n if (func) {\r\n this._xrSessionManager.session.removeEventListener(eventName as XREventType, func);\r\n }\r\n });\r\n }\r\n\r\n this._xrSessionManager.scene.onBeforeRenderObservable.addOnce(() => {\r\n // Fire a pointerup\r\n const pointerEventInit: PointerEventInit = {\r\n pointerId: controllerData.id,\r\n pointerType: \"xr\",\r\n };\r\n this._scene.simulatePointerUp(new PickingInfo(), pointerEventInit);\r\n\r\n controllerData.selectionMesh.dispose();\r\n controllerData.laserPointer.dispose();\r\n // remove from the map\r\n delete this._controllers[xrControllerUniqueId];\r\n if (this._attachedController === xrControllerUniqueId) {\r\n // check for other controllers\r\n const keys = Object.keys(this._controllers);\r\n if (keys.length) {\r\n this._attachedController = keys[0];\r\n } else {\r\n this._attachedController = \"\";\r\n }\r\n }\r\n });\r\n }\r\n\r\n private _generateNewMeshPair(meshParent: Node) {\r\n const sceneToRenderTo = this._options.useUtilityLayer ? this._options.customUtilityLayerScene || UtilityLayerRenderer.DefaultUtilityLayer.utilityLayerScene : this._scene;\r\n const laserPointer = CreateCylinder(\r\n \"laserPointer\",\r\n {\r\n height: 1,\r\n diameterTop: 0.0002,\r\n diameterBottom: 0.004,\r\n tessellation: 20,\r\n subdivisions: 1,\r\n },\r\n sceneToRenderTo\r\n );\r\n laserPointer.parent = meshParent;\r\n let laserPointerMaterial = new StandardMaterial(\"laserPointerMat\", sceneToRenderTo);\r\n laserPointerMaterial.emissiveColor = this.laserPointerDefaultColor;\r\n laserPointerMaterial.alpha = 0.7;\r\n laserPointer.material = laserPointerMaterial;\r\n laserPointer.rotation.x = Math.PI / 2;\r\n this._updatePointerDistance(laserPointer, 1);\r\n laserPointer.isPickable = false;\r\n\r\n // Create a gaze tracker for the XR controller\r\n const selectionMesh = CreateTorus(\r\n \"gazeTracker\",\r\n {\r\n diameter: 0.0035 * 3,\r\n thickness: 0.0025 * 3,\r\n tessellation: 20,\r\n },\r\n sceneToRenderTo\r\n );\r\n selectionMesh.bakeCurrentTransformIntoVertices();\r\n selectionMesh.isPickable = false;\r\n selectionMesh.isVisible = false;\r\n let targetMat = new StandardMaterial(\"targetMat\", sceneToRenderTo);\r\n targetMat.specularColor = Color3.Black();\r\n targetMat.emissiveColor = this.selectionMeshDefaultColor;\r\n targetMat.backFaceCulling = false;\r\n selectionMesh.material = targetMat;\r\n\r\n if (this._options.renderingGroupId !== undefined) {\r\n laserPointer.renderingGroupId = this._options.renderingGroupId;\r\n selectionMesh.renderingGroupId = this._options.renderingGroupId;\r\n }\r\n\r\n return {\r\n laserPointer,\r\n selectionMesh,\r\n };\r\n }\r\n\r\n private _pickingMoved(oldPick: PickingInfo, newPick: PickingInfo) {\r\n if (!oldPick.hit || !newPick.hit) {\r\n return true;\r\n }\r\n if (!oldPick.pickedMesh || !oldPick.pickedPoint || !newPick.pickedMesh || !newPick.pickedPoint) {\r\n return true;\r\n }\r\n if (oldPick.pickedMesh !== newPick.pickedMesh) {\r\n return true;\r\n }\r\n oldPick.pickedPoint?.subtractToRef(newPick.pickedPoint, this._tmpVectorForPickCompare);\r\n this._tmpVectorForPickCompare.set(Math.abs(this._tmpVectorForPickCompare.x), Math.abs(this._tmpVectorForPickCompare.y), Math.abs(this._tmpVectorForPickCompare.z));\r\n const delta = (this._options.gazeModePointerMovedFactor || 1) * 0.01 * newPick.distance;\r\n const length = this._tmpVectorForPickCompare.length();\r\n if (length > delta) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n private _updatePointerDistance(_laserPointer: AbstractMesh, distance: number = 100) {\r\n _laserPointer.scaling.y = distance;\r\n // a bit of distance from the controller\r\n if (this._scene.useRightHandedSystem) {\r\n distance *= -1;\r\n }\r\n _laserPointer.position.z = distance / 2 + 0.05;\r\n }\r\n\r\n /** @hidden */\r\n public get lasterPointerDefaultColor(): Color3 {\r\n // here due to a typo\r\n return this.laserPointerDefaultColor;\r\n }\r\n}\r\n\r\n//register the plugin\r\nWebXRFeaturesManager.AddWebXRFeature(\r\n WebXRControllerPointerSelection.Name,\r\n (xrSessionManager, options) => {\r\n return () => new WebXRControllerPointerSelection(xrSessionManager, options);\r\n },\r\n WebXRControllerPointerSelection.Version,\r\n true\r\n);\r\n"]}
1
+ {"version":3,"file":"WebXRControllerPointerSelection.js","sourceRoot":"","sources":["../../../../sourceES6/core/XR/features/WebXRControllerPointerSelection.ts"],"names":[],"mappings":"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","sourcesContent":["import { WebXRFeaturesManager, WebXRFeatureName } from \"../webXRFeaturesManager\";\r\nimport { WebXRSessionManager } from \"../webXRSessionManager\";\r\nimport { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport { Observer } from \"../../Misc/observable\";\r\nimport { WebXRInput } from \"../webXRInput\";\r\nimport { WebXRInputSource } from \"../webXRInputSource\";\r\nimport { Scene } from \"../../scene\";\r\nimport { WebXRControllerComponent } from \"../motionController/webXRControllerComponent\";\r\nimport { Nullable } from \"../../types\";\r\nimport { Matrix, Vector3 } from \"../../Maths/math.vector\";\r\nimport { Color3 } from \"../../Maths/math.color\";\r\nimport { Axis } from \"../../Maths/math.axis\";\r\nimport { StandardMaterial } from \"../../Materials/standardMaterial\";\r\nimport { CreateCylinder } from \"../../Meshes/Builders/cylinderBuilder\";\r\nimport { CreateTorus } from \"../../Meshes/Builders/torusBuilder\";\r\nimport { Ray } from \"../../Culling/ray\";\r\nimport { PickingInfo } from \"../../Collisions/pickingInfo\";\r\nimport { WebXRAbstractFeature } from \"./WebXRAbstractFeature\";\r\nimport { UtilityLayerRenderer } from \"../../Rendering/utilityLayerRenderer\";\r\nimport { WebXRAbstractMotionController } from \"../motionController/webXRAbstractMotionController\";\r\nimport { WebXRCamera } from \"../webXRCamera\";\r\nimport { Node } from \"../../node\";\r\nimport { Viewport } from \"../../Maths/math.viewport\";\r\n\r\n/**\r\n * Options interface for the pointer selection module\r\n */\r\nexport interface IWebXRControllerPointerSelectionOptions {\r\n /**\r\n * if provided, this scene will be used to render meshes.\r\n */\r\n customUtilityLayerScene?: Scene;\r\n /**\r\n * Disable the pointer up event when the xr controller in screen and gaze mode is disposed (meaning - when the user removed the finger from the screen)\r\n * If not disabled, the last picked point will be used to execute a pointer up event\r\n * If disabled, pointer up event will be triggered right after the pointer down event.\r\n * Used in screen and gaze target ray mode only\r\n */\r\n disablePointerUpOnTouchOut: boolean;\r\n /**\r\n * For gaze mode for tracked-pointer / controllers (time to select instead of button press)\r\n */\r\n forceGazeMode: boolean;\r\n /**\r\n * Factor to be applied to the pointer-moved function in the gaze mode. How sensitive should the gaze mode be when checking if the pointer moved\r\n * to start a new countdown to the pointer down event.\r\n * Defaults to 1.\r\n */\r\n gazeModePointerMovedFactor?: number;\r\n /**\r\n * Different button type to use instead of the main component\r\n */\r\n overrideButtonId?: string;\r\n /**\r\n * use this rendering group id for the meshes (optional)\r\n */\r\n renderingGroupId?: number;\r\n /**\r\n * The amount of time in milliseconds it takes between pick found something to a pointer down event.\r\n * Used in gaze modes. Tracked pointer uses the trigger, screen uses touch events\r\n * 3000 means 3 seconds between pointing at something and selecting it\r\n */\r\n timeToSelect?: number;\r\n /**\r\n * Should meshes created here be added to a utility layer or the main scene\r\n */\r\n useUtilityLayer?: boolean;\r\n /**\r\n * Optional WebXR camera to be used for gaze selection\r\n */\r\n gazeCamera?: WebXRCamera;\r\n /**\r\n * the xr input to use with this pointer selection\r\n */\r\n xrInput: WebXRInput;\r\n\r\n /**\r\n * Should the scene pointerX and pointerY update be disabled\r\n * This is required for fullscreen AR GUI, but might slow down other experiences.\r\n * Disable in VR, if not needed.\r\n * The first rig camera (left eye) will be used to calculate the projection\r\n */\r\n disableScenePointerVectorUpdate: boolean;\r\n\r\n /**\r\n * Enable pointer selection on all controllers instead of switching between them\r\n */\r\n enablePointerSelectionOnAllControllers?: boolean;\r\n\r\n /**\r\n * The preferred hand to give the pointer selection to. This will be prioritized when the controller initialize.\r\n * If switch is enabled, it will still allow the user to switch between the different controllers\r\n */\r\n preferredHandedness?: XRHandedness;\r\n\r\n /**\r\n * Disable switching the pointer selection from one controller to the other.\r\n * If the preferred hand is set it will be fixed on this hand, and if not it will be fixed on the first controller added to the scene\r\n */\r\n disableSwitchOnClick?: boolean;\r\n\r\n /**\r\n * The maximum distance of the pointer selection feature. Defaults to 100.\r\n */\r\n maxPointerDistance?: number;\r\n}\r\n\r\n/**\r\n * A module that will enable pointer selection for motion controllers of XR Input Sources\r\n */\r\nexport class WebXRControllerPointerSelection extends WebXRAbstractFeature {\r\n private static _idCounter = 200;\r\n\r\n private _attachController = (xrController: WebXRInputSource) => {\r\n if (this._controllers[xrController.uniqueId]) {\r\n // already attached\r\n return;\r\n }\r\n\r\n const { laserPointer, selectionMesh } = this._generateNewMeshPair(xrController.pointer);\r\n\r\n // get two new meshes\r\n this._controllers[xrController.uniqueId] = {\r\n xrController,\r\n laserPointer,\r\n selectionMesh,\r\n meshUnderPointer: null,\r\n pick: null,\r\n tmpRay: new Ray(new Vector3(), new Vector3()),\r\n disabledByNearInteraction: false,\r\n id: WebXRControllerPointerSelection._idCounter++,\r\n };\r\n\r\n if (this._attachedController) {\r\n if (\r\n !this._options.enablePointerSelectionOnAllControllers &&\r\n this._options.preferredHandedness &&\r\n xrController.inputSource.handedness === this._options.preferredHandedness\r\n ) {\r\n this._attachedController = xrController.uniqueId;\r\n }\r\n } else {\r\n if (!this._options.enablePointerSelectionOnAllControllers) {\r\n this._attachedController = xrController.uniqueId;\r\n }\r\n }\r\n\r\n switch (xrController.inputSource.targetRayMode) {\r\n case \"tracked-pointer\":\r\n return this._attachTrackedPointerRayMode(xrController);\r\n case \"gaze\":\r\n return this._attachGazeMode(xrController);\r\n case \"screen\":\r\n return this._attachScreenRayMode(xrController);\r\n }\r\n };\r\n\r\n private _controllers: {\r\n [controllerUniqueId: string]: {\r\n xrController?: WebXRInputSource;\r\n webXRCamera?: WebXRCamera;\r\n selectionComponent?: WebXRControllerComponent;\r\n onButtonChangedObserver?: Nullable<Observer<WebXRControllerComponent>>;\r\n onFrameObserver?: Nullable<Observer<XRFrame>>;\r\n laserPointer: AbstractMesh;\r\n selectionMesh: AbstractMesh;\r\n meshUnderPointer: Nullable<AbstractMesh>;\r\n pick: Nullable<PickingInfo>;\r\n id: number;\r\n tmpRay: Ray;\r\n disabledByNearInteraction: boolean;\r\n // event support\r\n eventListeners?: { [event in XREventType]?: (event: XRInputSourceEvent) => void };\r\n };\r\n } = {};\r\n private _scene: Scene;\r\n private _tmpVectorForPickCompare = new Vector3();\r\n\r\n private _attachedController: string;\r\n\r\n /**\r\n * The module's name\r\n */\r\n public static readonly Name = WebXRFeatureName.POINTER_SELECTION;\r\n /**\r\n * The (Babylon) version of this module.\r\n * This is an integer representing the implementation version.\r\n * This number does not correspond to the WebXR specs version\r\n */\r\n public static readonly Version = 1;\r\n\r\n /**\r\n * Disable lighting on the laser pointer (so it will always be visible)\r\n */\r\n public disablePointerLighting: boolean = true;\r\n /**\r\n * Disable lighting on the selection mesh (so it will always be visible)\r\n */\r\n public disableSelectionMeshLighting: boolean = true;\r\n /**\r\n * Should the laser pointer be displayed\r\n */\r\n public displayLaserPointer: boolean = true;\r\n /**\r\n * Should the selection mesh be displayed (The ring at the end of the laser pointer)\r\n */\r\n public displaySelectionMesh: boolean = true;\r\n /**\r\n * This color will be set to the laser pointer when selection is triggered\r\n */\r\n public laserPointerPickedColor: Color3 = new Color3(0.9, 0.9, 0.9);\r\n /**\r\n * Default color of the laser pointer\r\n */\r\n public laserPointerDefaultColor: Color3 = new Color3(0.7, 0.7, 0.7);\r\n /**\r\n * default color of the selection ring\r\n */\r\n public selectionMeshDefaultColor: Color3 = new Color3(0.8, 0.8, 0.8);\r\n /**\r\n * This color will be applied to the selection ring when selection is triggered\r\n */\r\n public selectionMeshPickedColor: Color3 = new Color3(0.3, 0.3, 1.0);\r\n\r\n /**\r\n * Optional filter to be used for ray selection. This predicate shares behavior with\r\n * scene.pointerMovePredicate which takes priority if it is also assigned.\r\n */\r\n public raySelectionPredicate: (mesh: AbstractMesh) => boolean;\r\n\r\n /**\r\n * constructs a new background remover module\r\n * @param _xrSessionManager the session manager for this module\r\n * @param _options read-only options to be used in this module\r\n */\r\n constructor(_xrSessionManager: WebXRSessionManager, private readonly _options: IWebXRControllerPointerSelectionOptions) {\r\n super(_xrSessionManager);\r\n this._scene = this._xrSessionManager.scene;\r\n }\r\n\r\n /**\r\n * attach this feature\r\n * Will usually be called by the features manager\r\n *\r\n * @returns true if successful.\r\n */\r\n public attach(): boolean {\r\n if (!super.attach()) {\r\n return false;\r\n }\r\n\r\n this._options.xrInput.controllers.forEach(this._attachController);\r\n this._addNewAttachObserver(this._options.xrInput.onControllerAddedObservable, this._attachController);\r\n this._addNewAttachObserver(this._options.xrInput.onControllerRemovedObservable, (controller) => {\r\n // REMOVE the controller\r\n this._detachController(controller.uniqueId);\r\n });\r\n\r\n this._scene.constantlyUpdateMeshUnderPointer = true;\r\n\r\n if (this._options.gazeCamera) {\r\n const webXRCamera = this._options.gazeCamera;\r\n\r\n const { laserPointer, selectionMesh } = this._generateNewMeshPair(webXRCamera);\r\n\r\n this._controllers[\"camera\"] = {\r\n webXRCamera,\r\n laserPointer,\r\n selectionMesh,\r\n meshUnderPointer: null,\r\n pick: null,\r\n tmpRay: new Ray(new Vector3(), new Vector3()),\r\n disabledByNearInteraction: false,\r\n id: WebXRControllerPointerSelection._idCounter++,\r\n };\r\n this._attachGazeMode();\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * detach this feature.\r\n * Will usually be called by the features manager\r\n *\r\n * @returns true if successful.\r\n */\r\n public detach(): boolean {\r\n if (!super.detach()) {\r\n return false;\r\n }\r\n\r\n Object.keys(this._controllers).forEach((controllerId) => {\r\n this._detachController(controllerId);\r\n });\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Will get the mesh under a specific pointer.\r\n * `scene.meshUnderPointer` will only return one mesh - either left or right.\r\n * @param controllerId the controllerId to check\r\n * @returns The mesh under pointer or null if no mesh is under the pointer\r\n */\r\n public getMeshUnderPointer(controllerId: string): Nullable<AbstractMesh> {\r\n if (this._controllers[controllerId]) {\r\n return this._controllers[controllerId].meshUnderPointer;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Get the xr controller that correlates to the pointer id in the pointer event\r\n *\r\n * @param id the pointer id to search for\r\n * @returns the controller that correlates to this id or null if not found\r\n */\r\n public getXRControllerByPointerId(id: number): Nullable<WebXRInputSource> {\r\n const keys = Object.keys(this._controllers);\r\n\r\n for (let i = 0; i < keys.length; ++i) {\r\n if (this._controllers[keys[i]].id === id) {\r\n return this._controllers[keys[i]].xrController || null;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /** @hidden */\r\n public _getPointerSelectionDisabledByPointerId(id: number): boolean {\r\n const keys = Object.keys(this._controllers);\r\n\r\n for (let i = 0; i < keys.length; ++i) {\r\n if (this._controllers[keys[i]].id === id) {\r\n return this._controllers[keys[i]].disabledByNearInteraction;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /** @hidden */\r\n public _setPointerSelectionDisabledByPointerId(id: number, state: boolean) {\r\n const keys = Object.keys(this._controllers);\r\n\r\n for (let i = 0; i < keys.length; ++i) {\r\n if (this._controllers[keys[i]].id === id) {\r\n this._controllers[keys[i]].disabledByNearInteraction = state;\r\n return;\r\n }\r\n }\r\n }\r\n\r\n private _identityMatrix = Matrix.Identity();\r\n private _screenCoordinatesRef = Vector3.Zero();\r\n private _viewportRef = new Viewport(0, 0, 0, 0);\r\n\r\n protected _onXRFrame(_xrFrame: XRFrame) {\r\n Object.keys(this._controllers).forEach((id) => {\r\n // only do this for the selected pointer\r\n const controllerData = this._controllers[id];\r\n if ((!this._options.enablePointerSelectionOnAllControllers && id !== this._attachedController) || controllerData.disabledByNearInteraction) {\r\n controllerData.selectionMesh.isVisible = false;\r\n controllerData.laserPointer.isVisible = false;\r\n controllerData.pick = null;\r\n return;\r\n }\r\n\r\n controllerData.laserPointer.isVisible = this.displayLaserPointer;\r\n\r\n let controllerGlobalPosition: Vector3;\r\n\r\n // Every frame check collisions/input\r\n if (controllerData.xrController) {\r\n controllerGlobalPosition = controllerData.xrController.pointer.position;\r\n controllerData.xrController.getWorldPointerRayToRef(controllerData.tmpRay);\r\n } else if (controllerData.webXRCamera) {\r\n controllerGlobalPosition = controllerData.webXRCamera.position;\r\n controllerData.webXRCamera.getForwardRayToRef(controllerData.tmpRay);\r\n } else {\r\n return;\r\n }\r\n\r\n if (this._options.maxPointerDistance) {\r\n controllerData.tmpRay.length = this._options.maxPointerDistance;\r\n }\r\n // update pointerX and pointerY of the scene. Only if the flag is set to true!\r\n if (!this._options.disableScenePointerVectorUpdate && controllerGlobalPosition) {\r\n const scene = this._xrSessionManager.scene;\r\n const camera = this._options.xrInput.xrCamera;\r\n if (camera) {\r\n camera.viewport.toGlobalToRef(scene.getEngine().getRenderWidth(), scene.getEngine().getRenderHeight(), this._viewportRef);\r\n Vector3.ProjectToRef(controllerGlobalPosition, this._identityMatrix, scene.getTransformMatrix(), this._viewportRef, this._screenCoordinatesRef);\r\n\r\n scene.pointerX = this._screenCoordinatesRef.x;\r\n scene.pointerY = this._screenCoordinatesRef.y;\r\n }\r\n }\r\n\r\n let utilityScenePick = null;\r\n if (this._utilityLayerScene) {\r\n utilityScenePick = this._utilityLayerScene.pickWithRay(controllerData.tmpRay, this._utilityLayerScene.pointerMovePredicate || this.raySelectionPredicate);\r\n }\r\n\r\n let originalScenePick = this._scene.pickWithRay(controllerData.tmpRay, this._scene.pointerMovePredicate || this.raySelectionPredicate);\r\n if (!utilityScenePick || !utilityScenePick.hit) {\r\n // No hit in utility scene\r\n controllerData.pick = originalScenePick;\r\n } else if (!originalScenePick || !originalScenePick.hit) {\r\n // No hit in original scene\r\n controllerData.pick = utilityScenePick;\r\n } else if (utilityScenePick.distance < originalScenePick.distance) {\r\n // Hit is closer in utility scene\r\n controllerData.pick = utilityScenePick;\r\n } else {\r\n // Hit is closer in original scene\r\n controllerData.pick = originalScenePick;\r\n }\r\n\r\n if (controllerData.pick && controllerData.xrController) {\r\n controllerData.pick.aimTransform = controllerData.xrController.pointer;\r\n controllerData.pick.gripTransform = controllerData.xrController.grip || null;\r\n }\r\n\r\n const pick = controllerData.pick;\r\n\r\n if (pick && pick.pickedPoint && pick.hit) {\r\n // Update laser state\r\n this._updatePointerDistance(controllerData.laserPointer, pick.distance);\r\n\r\n // Update cursor state\r\n controllerData.selectionMesh.position.copyFrom(pick.pickedPoint);\r\n controllerData.selectionMesh.scaling.x = Math.sqrt(pick.distance);\r\n controllerData.selectionMesh.scaling.y = Math.sqrt(pick.distance);\r\n controllerData.selectionMesh.scaling.z = Math.sqrt(pick.distance);\r\n\r\n // To avoid z-fighting\r\n let pickNormal = this._convertNormalToDirectionOfRay(pick.getNormal(true), controllerData.tmpRay);\r\n let deltaFighting = 0.001;\r\n controllerData.selectionMesh.position.copyFrom(pick.pickedPoint);\r\n if (pickNormal) {\r\n let axis1 = Vector3.Cross(Axis.Y, pickNormal);\r\n let axis2 = Vector3.Cross(pickNormal, axis1);\r\n Vector3.RotationFromAxisToRef(axis2, pickNormal, axis1, controllerData.selectionMesh.rotation);\r\n controllerData.selectionMesh.position.addInPlace(pickNormal.scale(deltaFighting));\r\n }\r\n controllerData.selectionMesh.isVisible = true && this.displaySelectionMesh;\r\n controllerData.meshUnderPointer = pick.pickedMesh;\r\n } else {\r\n controllerData.selectionMesh.isVisible = false;\r\n this._updatePointerDistance(controllerData.laserPointer, 1);\r\n controllerData.meshUnderPointer = null;\r\n }\r\n });\r\n }\r\n\r\n private get _utilityLayerScene() {\r\n return this._options.customUtilityLayerScene || UtilityLayerRenderer.DefaultUtilityLayer.utilityLayerScene;\r\n }\r\n\r\n private _attachGazeMode(xrController?: WebXRInputSource) {\r\n const controllerData = this._controllers[(xrController && xrController.uniqueId) || \"camera\"];\r\n // attached when touched, detaches when raised\r\n const timeToSelect = this._options.timeToSelect || 3000;\r\n const sceneToRenderTo = this._options.useUtilityLayer ? this._utilityLayerScene : this._scene;\r\n let oldPick = new PickingInfo();\r\n let discMesh = CreateTorus(\r\n \"selection\",\r\n {\r\n diameter: 0.0035 * 15,\r\n thickness: 0.0025 * 6,\r\n tessellation: 20,\r\n },\r\n sceneToRenderTo\r\n );\r\n discMesh.isVisible = false;\r\n discMesh.isPickable = false;\r\n discMesh.parent = controllerData.selectionMesh;\r\n let timer = 0;\r\n let downTriggered = false;\r\n const pointerEventInit: PointerEventInit = {\r\n pointerId: controllerData.id,\r\n pointerType: \"xr\",\r\n };\r\n controllerData.onFrameObserver = this._xrSessionManager.onXRFrameObservable.add(() => {\r\n if (!controllerData.pick) {\r\n return;\r\n }\r\n controllerData.laserPointer.material!.alpha = 0;\r\n discMesh.isVisible = false;\r\n if (controllerData.pick.hit) {\r\n if (!this._pickingMoved(oldPick, controllerData.pick)) {\r\n if (timer > timeToSelect / 10) {\r\n discMesh.isVisible = true;\r\n }\r\n\r\n timer += this._scene.getEngine().getDeltaTime();\r\n if (timer >= timeToSelect) {\r\n this._scene.simulatePointerDown(controllerData.pick, pointerEventInit);\r\n downTriggered = true;\r\n // pointer up right after down, if disable on touch out\r\n if (this._options.disablePointerUpOnTouchOut) {\r\n this._scene.simulatePointerUp(controllerData.pick, pointerEventInit);\r\n }\r\n discMesh.isVisible = false;\r\n } else {\r\n const scaleFactor = 1 - timer / timeToSelect;\r\n discMesh.scaling.set(scaleFactor, scaleFactor, scaleFactor);\r\n }\r\n } else {\r\n if (downTriggered) {\r\n if (!this._options.disablePointerUpOnTouchOut) {\r\n this._scene.simulatePointerUp(controllerData.pick, pointerEventInit);\r\n }\r\n }\r\n downTriggered = false;\r\n timer = 0;\r\n }\r\n } else {\r\n downTriggered = false;\r\n timer = 0;\r\n }\r\n\r\n this._scene.simulatePointerMove(controllerData.pick, pointerEventInit);\r\n\r\n oldPick = controllerData.pick;\r\n });\r\n\r\n if (this._options.renderingGroupId !== undefined) {\r\n discMesh.renderingGroupId = this._options.renderingGroupId;\r\n }\r\n if (xrController) {\r\n xrController.onDisposeObservable.addOnce(() => {\r\n if (controllerData.pick && !this._options.disablePointerUpOnTouchOut && downTriggered) {\r\n this._scene.simulatePointerUp(controllerData.pick, pointerEventInit);\r\n }\r\n discMesh.dispose();\r\n });\r\n }\r\n }\r\n\r\n private _attachScreenRayMode(xrController: WebXRInputSource) {\r\n const controllerData = this._controllers[xrController.uniqueId];\r\n let downTriggered = false;\r\n const pointerEventInit: PointerEventInit = {\r\n pointerId: controllerData.id,\r\n pointerType: \"xr\",\r\n };\r\n controllerData.onFrameObserver = this._xrSessionManager.onXRFrameObservable.add(() => {\r\n if (!controllerData.pick || (this._options.disablePointerUpOnTouchOut && downTriggered)) {\r\n return;\r\n }\r\n if (!downTriggered) {\r\n this._scene.simulatePointerDown(controllerData.pick, pointerEventInit);\r\n downTriggered = true;\r\n if (this._options.disablePointerUpOnTouchOut) {\r\n this._scene.simulatePointerUp(controllerData.pick, pointerEventInit);\r\n }\r\n } else {\r\n this._scene.simulatePointerMove(controllerData.pick, pointerEventInit);\r\n }\r\n });\r\n xrController.onDisposeObservable.addOnce(() => {\r\n if (controllerData.pick && downTriggered && !this._options.disablePointerUpOnTouchOut) {\r\n this._scene.simulatePointerUp(controllerData.pick, pointerEventInit);\r\n }\r\n });\r\n }\r\n\r\n private _attachTrackedPointerRayMode(xrController: WebXRInputSource) {\r\n const controllerData = this._controllers[xrController.uniqueId];\r\n if (this._options.forceGazeMode) {\r\n return this._attachGazeMode(xrController);\r\n }\r\n const pointerEventInit: PointerEventInit = {\r\n pointerId: controllerData.id,\r\n pointerType: \"xr\",\r\n };\r\n controllerData.onFrameObserver = this._xrSessionManager.onXRFrameObservable.add(() => {\r\n (<StandardMaterial>controllerData.laserPointer.material).disableLighting = this.disablePointerLighting;\r\n (<StandardMaterial>controllerData.selectionMesh.material).disableLighting = this.disableSelectionMeshLighting;\r\n\r\n if (controllerData.pick) {\r\n this._scene.simulatePointerMove(controllerData.pick, pointerEventInit);\r\n }\r\n });\r\n if (xrController.inputSource.gamepad) {\r\n const init = (motionController: WebXRAbstractMotionController) => {\r\n if (this._options.overrideButtonId) {\r\n controllerData.selectionComponent = motionController.getComponent(this._options.overrideButtonId);\r\n }\r\n if (!controllerData.selectionComponent) {\r\n controllerData.selectionComponent = motionController.getMainComponent();\r\n }\r\n\r\n controllerData.onButtonChangedObserver = controllerData.selectionComponent.onButtonStateChangedObservable.add((component) => {\r\n if (component.changes.pressed) {\r\n const pressed = component.changes.pressed.current;\r\n if (controllerData.pick) {\r\n if (this._options.enablePointerSelectionOnAllControllers || xrController.uniqueId === this._attachedController) {\r\n if (pressed) {\r\n this._scene.simulatePointerDown(controllerData.pick, pointerEventInit);\r\n (<StandardMaterial>controllerData.selectionMesh.material).emissiveColor = this.selectionMeshPickedColor;\r\n (<StandardMaterial>controllerData.laserPointer.material).emissiveColor = this.laserPointerPickedColor;\r\n } else {\r\n this._scene.simulatePointerUp(controllerData.pick, pointerEventInit);\r\n (<StandardMaterial>controllerData.selectionMesh.material).emissiveColor = this.selectionMeshDefaultColor;\r\n (<StandardMaterial>controllerData.laserPointer.material).emissiveColor = this.laserPointerDefaultColor;\r\n }\r\n } else {\r\n }\r\n } else {\r\n if (pressed && !this._options.enablePointerSelectionOnAllControllers && !this._options.disableSwitchOnClick) {\r\n this._attachedController = xrController.uniqueId;\r\n }\r\n }\r\n }\r\n });\r\n };\r\n if (xrController.motionController) {\r\n init(xrController.motionController);\r\n } else {\r\n xrController.onMotionControllerInitObservable.add(init);\r\n }\r\n } else {\r\n // use the select and squeeze events\r\n const selectStartListener = (event: XRInputSourceEvent) => {\r\n if (controllerData.xrController && event.inputSource === controllerData.xrController.inputSource && controllerData.pick) {\r\n this._scene.simulatePointerDown(controllerData.pick, pointerEventInit);\r\n (<StandardMaterial>controllerData.selectionMesh.material).emissiveColor = this.selectionMeshPickedColor;\r\n (<StandardMaterial>controllerData.laserPointer.material).emissiveColor = this.laserPointerPickedColor;\r\n }\r\n };\r\n\r\n const selectEndListener = (event: XRInputSourceEvent) => {\r\n if (controllerData.xrController && event.inputSource === controllerData.xrController.inputSource && controllerData.pick) {\r\n this._scene.simulatePointerUp(controllerData.pick, pointerEventInit);\r\n (<StandardMaterial>controllerData.selectionMesh.material).emissiveColor = this.selectionMeshDefaultColor;\r\n (<StandardMaterial>controllerData.laserPointer.material).emissiveColor = this.laserPointerDefaultColor;\r\n }\r\n };\r\n\r\n controllerData.eventListeners = {\r\n selectend: selectEndListener,\r\n selectstart: selectStartListener,\r\n };\r\n\r\n this._xrSessionManager.session.addEventListener(\"selectstart\", selectStartListener);\r\n this._xrSessionManager.session.addEventListener(\"selectend\", selectEndListener);\r\n }\r\n }\r\n\r\n private _convertNormalToDirectionOfRay(normal: Nullable<Vector3>, ray: Ray) {\r\n if (normal) {\r\n let angle = Math.acos(Vector3.Dot(normal, ray.direction));\r\n if (angle < Math.PI / 2) {\r\n normal.scaleInPlace(-1);\r\n }\r\n }\r\n return normal;\r\n }\r\n\r\n private _detachController(xrControllerUniqueId: string) {\r\n const controllerData = this._controllers[xrControllerUniqueId];\r\n if (!controllerData) {\r\n return;\r\n }\r\n if (controllerData.selectionComponent) {\r\n if (controllerData.onButtonChangedObserver) {\r\n controllerData.selectionComponent.onButtonStateChangedObservable.remove(controllerData.onButtonChangedObserver);\r\n }\r\n }\r\n if (controllerData.onFrameObserver) {\r\n this._xrSessionManager.onXRFrameObservable.remove(controllerData.onFrameObserver);\r\n }\r\n if (controllerData.eventListeners) {\r\n Object.keys(controllerData.eventListeners).forEach((eventName: string) => {\r\n const func = controllerData.eventListeners && controllerData.eventListeners[eventName as XREventType];\r\n if (func) {\r\n this._xrSessionManager.session.removeEventListener(eventName as XREventType, func);\r\n }\r\n });\r\n }\r\n\r\n this._xrSessionManager.scene.onBeforeRenderObservable.addOnce(() => {\r\n // Fire a pointerup\r\n const pointerEventInit: PointerEventInit = {\r\n pointerId: controllerData.id,\r\n pointerType: \"xr\",\r\n };\r\n this._scene.simulatePointerUp(new PickingInfo(), pointerEventInit);\r\n\r\n controllerData.selectionMesh.dispose();\r\n controllerData.laserPointer.dispose();\r\n // remove from the map\r\n delete this._controllers[xrControllerUniqueId];\r\n if (this._attachedController === xrControllerUniqueId) {\r\n // check for other controllers\r\n const keys = Object.keys(this._controllers);\r\n if (keys.length) {\r\n this._attachedController = keys[0];\r\n } else {\r\n this._attachedController = \"\";\r\n }\r\n }\r\n });\r\n }\r\n\r\n private _generateNewMeshPair(meshParent: Node) {\r\n const sceneToRenderTo = this._options.useUtilityLayer ? this._options.customUtilityLayerScene || UtilityLayerRenderer.DefaultUtilityLayer.utilityLayerScene : this._scene;\r\n const laserPointer = CreateCylinder(\r\n \"laserPointer\",\r\n {\r\n height: 1,\r\n diameterTop: 0.0002,\r\n diameterBottom: 0.004,\r\n tessellation: 20,\r\n subdivisions: 1,\r\n },\r\n sceneToRenderTo\r\n );\r\n laserPointer.parent = meshParent;\r\n let laserPointerMaterial = new StandardMaterial(\"laserPointerMat\", sceneToRenderTo);\r\n laserPointerMaterial.emissiveColor = this.laserPointerDefaultColor;\r\n laserPointerMaterial.alpha = 0.7;\r\n laserPointer.material = laserPointerMaterial;\r\n laserPointer.rotation.x = Math.PI / 2;\r\n this._updatePointerDistance(laserPointer, 1);\r\n laserPointer.isPickable = false;\r\n\r\n // Create a gaze tracker for the XR controller\r\n const selectionMesh = CreateTorus(\r\n \"gazeTracker\",\r\n {\r\n diameter: 0.0035 * 3,\r\n thickness: 0.0025 * 3,\r\n tessellation: 20,\r\n },\r\n sceneToRenderTo\r\n );\r\n selectionMesh.bakeCurrentTransformIntoVertices();\r\n selectionMesh.isPickable = false;\r\n selectionMesh.isVisible = false;\r\n let targetMat = new StandardMaterial(\"targetMat\", sceneToRenderTo);\r\n targetMat.specularColor = Color3.Black();\r\n targetMat.emissiveColor = this.selectionMeshDefaultColor;\r\n targetMat.backFaceCulling = false;\r\n selectionMesh.material = targetMat;\r\n\r\n if (this._options.renderingGroupId !== undefined) {\r\n laserPointer.renderingGroupId = this._options.renderingGroupId;\r\n selectionMesh.renderingGroupId = this._options.renderingGroupId;\r\n }\r\n\r\n return {\r\n laserPointer,\r\n selectionMesh,\r\n };\r\n }\r\n\r\n private _pickingMoved(oldPick: PickingInfo, newPick: PickingInfo) {\r\n if (!oldPick.hit || !newPick.hit) {\r\n return true;\r\n }\r\n if (!oldPick.pickedMesh || !oldPick.pickedPoint || !newPick.pickedMesh || !newPick.pickedPoint) {\r\n return true;\r\n }\r\n if (oldPick.pickedMesh !== newPick.pickedMesh) {\r\n return true;\r\n }\r\n oldPick.pickedPoint?.subtractToRef(newPick.pickedPoint, this._tmpVectorForPickCompare);\r\n this._tmpVectorForPickCompare.set(Math.abs(this._tmpVectorForPickCompare.x), Math.abs(this._tmpVectorForPickCompare.y), Math.abs(this._tmpVectorForPickCompare.z));\r\n const delta = (this._options.gazeModePointerMovedFactor || 1) * 0.01 * newPick.distance;\r\n const length = this._tmpVectorForPickCompare.length();\r\n if (length > delta) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n private _updatePointerDistance(_laserPointer: AbstractMesh, distance: number = 100) {\r\n _laserPointer.scaling.y = distance;\r\n // a bit of distance from the controller\r\n if (this._scene.useRightHandedSystem) {\r\n distance *= -1;\r\n }\r\n _laserPointer.position.z = distance / 2 + 0.05;\r\n }\r\n\r\n /** @hidden */\r\n public get lasterPointerDefaultColor(): Color3 {\r\n // here due to a typo\r\n return this.laserPointerDefaultColor;\r\n }\r\n}\r\n\r\n//register the plugin\r\nWebXRFeaturesManager.AddWebXRFeature(\r\n WebXRControllerPointerSelection.Name,\r\n (xrSessionManager, options) => {\r\n return () => new WebXRControllerPointerSelection(xrSessionManager, options);\r\n },\r\n WebXRControllerPointerSelection.Version,\r\n true\r\n);\r\n"]}
@@ -1,4 +1,4 @@
1
- import { IWebXRFeature } from "../webXRFeaturesManager";
1
+ import { WebXRControllerPointerSelection } from "./WebXRControllerPointerSelection";
2
2
  import { WebXRSessionManager } from "../webXRSessionManager";
3
3
  import { AbstractMesh } from "../../Meshes/abstractMesh";
4
4
  import { WebXRInput } from "../webXRInput";
@@ -42,7 +42,7 @@ export interface IWebXRNearInteractionOptions {
42
42
  /**
43
43
  * Far interaction feature to toggle when near interaction takes precedence
44
44
  */
45
- farInteractionFeature?: WebXRAbstractFeature;
45
+ farInteractionFeature?: WebXRControllerPointerSelection;
46
46
  }
47
47
  /**
48
48
  * A module that will enable near interaction near interaction for hands and motion controllers of XR Input Sources
@@ -108,12 +108,12 @@ export declare class WebXRNearInteraction extends WebXRAbstractFeature {
108
108
  */
109
109
  getXRControllerByPointerId(id: number): Nullable<WebXRInputSource>;
110
110
  /**
111
- * This function sets webXRControllerPointer Selection feature that will be disabled when
111
+ * This function sets webXRControllerPointerSelection feature that will be disabled when
112
112
  * the hover range is reached for a mesh and will be reattached when not in hover range.
113
113
  * This is used to remove the selection rays when moving.
114
114
  * @param farInteractionFeature the feature to disable when finger is in hover range for a mesh
115
115
  */
116
- setFarInteractionFeature(farInteractionFeature: Nullable<IWebXRFeature>): void;
116
+ setFarInteractionFeature(farInteractionFeature: Nullable<WebXRControllerPointerSelection>): void;
117
117
  /**
118
118
  * Filter used for near interaction pick and hover
119
119
  */
@@ -135,6 +135,7 @@ export declare class WebXRNearInteraction extends WebXRAbstractFeature {
135
135
  protected _onXRFrame(_xrFrame: XRFrame): void;
136
136
  private get _utilityLayerScene();
137
137
  private _generateVisualCue;
138
+ private _isControllerReadyForNearInteraction;
138
139
  private _attachNearInteractionMode;
139
140
  private _detachController;
140
141
  private _generateNewHandTipMesh;
@@ -151,7 +151,7 @@ var WebXRNearInteraction = /** @class */ (function (_super) {
151
151
  return null;
152
152
  };
153
153
  /**
154
- * This function sets webXRControllerPointer Selection feature that will be disabled when
154
+ * This function sets webXRControllerPointerSelection feature that will be disabled when
155
155
  * the hover range is reached for a mesh and will be reattached when not in hover range.
156
156
  * This is used to remove the selection rays when moving.
157
157
  * @param farInteractionFeature the feature to disable when finger is in hover range for a mesh
@@ -303,15 +303,15 @@ var WebXRNearInteraction = /** @class */ (function (_super) {
303
303
  controllerData.meshUnderPointer = controllerData.pick.pickedMesh;
304
304
  controllerData.pickedPointVisualCue.position.copyFrom(controllerData.pick.pickedPoint);
305
305
  controllerData.pickedPointVisualCue.isVisible = true;
306
- if (_this._farInteractionFeature) {
307
- _this._farInteractionFeature.detach();
306
+ if (_this._farInteractionFeature && _this._farInteractionFeature.attached) {
307
+ _this._farInteractionFeature._setPointerSelectionDisabledByPointerId(controllerData.id, true);
308
308
  }
309
309
  }
310
310
  else {
311
311
  controllerData.meshUnderPointer = null;
312
312
  controllerData.pickedPointVisualCue.isVisible = false;
313
- if (_this._farInteractionFeature) {
314
- _this._farInteractionFeature.attach();
313
+ if (_this._farInteractionFeature && _this._farInteractionFeature.attached) {
314
+ _this._farInteractionFeature._setPointerSelectionDisabledByPointerId(controllerData.id, false);
315
315
  }
316
316
  }
317
317
  }
@@ -340,6 +340,12 @@ var WebXRNearInteraction = /** @class */ (function (_super) {
340
340
  selectionMesh.material = targetMat;
341
341
  return selectionMesh;
342
342
  };
343
+ WebXRNearInteraction.prototype._isControllerReadyForNearInteraction = function (id) {
344
+ if (this._farInteractionFeature) {
345
+ return this._farInteractionFeature._getPointerSelectionDisabledByPointerId(id);
346
+ }
347
+ return true;
348
+ };
343
349
  WebXRNearInteraction.prototype._attachNearInteractionMode = function (xrController) {
344
350
  var _this = this;
345
351
  var controllerData = this._controllers[xrController.uniqueId];
@@ -348,7 +354,6 @@ var WebXRNearInteraction = /** @class */ (function (_super) {
348
354
  pointerType: "xr",
349
355
  };
350
356
  controllerData.onFrameObserver = this._xrSessionManager.onXRFrameObservable.add(function () {
351
- var _a;
352
357
  if ((!_this._options.enableNearInteractionOnAllControllers && xrController.uniqueId !== _this._attachedController) ||
353
358
  !controllerData.xrController ||
354
359
  !controllerData.xrController.inputSource.hand) {
@@ -357,7 +362,7 @@ var WebXRNearInteraction = /** @class */ (function (_super) {
357
362
  if (controllerData.pick) {
358
363
  controllerData.pick.ray = controllerData.grabRay;
359
364
  }
360
- if (controllerData.pick && !((_a = _this._farInteractionFeature) === null || _a === void 0 ? void 0 : _a.attached)) {
365
+ if (controllerData.pick && _this._isControllerReadyForNearInteraction(controllerData.id)) {
361
366
  _this._scene.simulatePointerMove(controllerData.pick, pointerEventInit);
362
367
  }
363
368
  // Near pick pointer event
@@ -373,8 +378,7 @@ var WebXRNearInteraction = /** @class */ (function (_super) {
373
378
  }
374
379
  });
375
380
  var grabCheck = function (pressed) {
376
- var _a;
377
- if (_this._options.enableNearInteractionOnAllControllers || (xrController.uniqueId === _this._attachedController && !((_a = _this._farInteractionFeature) === null || _a === void 0 ? void 0 : _a.attached))) {
381
+ if (_this._options.enableNearInteractionOnAllControllers || (xrController.uniqueId === _this._attachedController && _this._isControllerReadyForNearInteraction(controllerData.id))) {
378
382
  if (controllerData.pick) {
379
383
  controllerData.pick.ray = controllerData.grabRay;
380
384
  }
@@ -426,11 +430,10 @@ var WebXRNearInteraction = /** @class */ (function (_super) {
426
430
  else {
427
431
  // use the select and squeeze events
428
432
  var selectStartListener = function (event) {
429
- var _a;
430
433
  if (controllerData.xrController &&
431
434
  event.inputSource === controllerData.xrController.inputSource &&
432
435
  controllerData.pick &&
433
- !((_a = _this._farInteractionFeature) === null || _a === void 0 ? void 0 : _a.attached) &&
436
+ _this._isControllerReadyForNearInteraction(controllerData.id) &&
434
437
  controllerData.meshUnderPointer &&
435
438
  _this._nearGrabPredicate(controllerData.meshUnderPointer)) {
436
439
  controllerData.grabInteraction = true;
@@ -439,8 +442,7 @@ var WebXRNearInteraction = /** @class */ (function (_super) {
439
442
  }
440
443
  };
441
444
  var selectEndListener = function (event) {
442
- var _a;
443
- if (controllerData.xrController && event.inputSource === controllerData.xrController.inputSource && controllerData.pick && !((_a = _this._farInteractionFeature) === null || _a === void 0 ? void 0 : _a.attached)) {
445
+ if (controllerData.xrController && event.inputSource === controllerData.xrController.inputSource && controllerData.pick && _this._isControllerReadyForNearInteraction(controllerData.id)) {
444
446
  _this._scene.simulatePointerUp(controllerData.pick, pointerEventInit);
445
447
  controllerData.grabInteraction = false;
446
448
  controllerData.pickedPointVisualCue.isVisible = true;