@babylonjs/core 8.7.1 → 8.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (342) hide show
  1. package/Actions/actionManager.js +2 -0
  2. package/Actions/actionManager.js.map +1 -1
  3. package/Animations/animatable.core.js +1 -1
  4. package/Animations/animatable.core.js.map +1 -1
  5. package/Animations/animation.js +4 -2
  6. package/Animations/animation.js.map +1 -1
  7. package/Audio/audioEngine.d.ts +1 -1
  8. package/Audio/audioEngine.js +20 -10
  9. package/Audio/audioEngine.js.map +1 -1
  10. package/Audio/audioSceneComponent.js +2 -0
  11. package/Audio/audioSceneComponent.js.map +1 -1
  12. package/Audio/sound.js +2 -0
  13. package/Audio/sound.js.map +1 -1
  14. package/AudioV2/abstractAudio/audioEngineV2.js +8 -1
  15. package/AudioV2/abstractAudio/audioEngineV2.js.map +1 -1
  16. package/AudioV2/abstractAudio/streamingSound.js +3 -1
  17. package/AudioV2/abstractAudio/streamingSound.js.map +1 -1
  18. package/AudioV2/abstractAudio/subNodes/abstractAudioSubGraph.js +6 -2
  19. package/AudioV2/abstractAudio/subNodes/abstractAudioSubGraph.js.map +1 -1
  20. package/AudioV2/abstractAudio/subProperties/audioAnalyzer.js +3 -0
  21. package/AudioV2/abstractAudio/subProperties/audioAnalyzer.js.map +1 -1
  22. package/AudioV2/abstractAudio/subProperties/spatialAudio.js +1 -0
  23. package/AudioV2/abstractAudio/subProperties/spatialAudio.js.map +1 -1
  24. package/AudioV2/webAudio/webAudioEngine.js +5 -1
  25. package/AudioV2/webAudio/webAudioEngine.js.map +1 -1
  26. package/AudioV2/webAudio/webAudioStaticSound.js +2 -0
  27. package/AudioV2/webAudio/webAudioStaticSound.js.map +1 -1
  28. package/AudioV2/webAudio/webAudioStreamingSound.js +3 -0
  29. package/AudioV2/webAudio/webAudioStreamingSound.js.map +1 -1
  30. package/AudioV2/webAudio/webAudioUnmuteUI.js +1 -0
  31. package/AudioV2/webAudio/webAudioUnmuteUI.js.map +1 -1
  32. package/BakedVertexAnimation/vertexAnimationBaker.d.ts +1 -0
  33. package/BakedVertexAnimation/vertexAnimationBaker.js +3 -1
  34. package/BakedVertexAnimation/vertexAnimationBaker.js.map +1 -1
  35. package/Buffers/buffer.nonFloatVertexBuffers.js +1 -0
  36. package/Buffers/buffer.nonFloatVertexBuffers.js.map +1 -1
  37. package/Buffers/storageBuffer.js +1 -1
  38. package/Buffers/storageBuffer.js.map +1 -1
  39. package/Cameras/Inputs/arcRotateCameraVRDeviceOrientationInput.js +2 -0
  40. package/Cameras/Inputs/arcRotateCameraVRDeviceOrientationInput.js.map +1 -1
  41. package/Cameras/Inputs/freeCameraDeviceOrientationInput.js +6 -1
  42. package/Cameras/Inputs/freeCameraDeviceOrientationInput.js.map +1 -1
  43. package/Cameras/VR/vrExperienceHelper.js +2 -0
  44. package/Cameras/VR/vrExperienceHelper.js.map +1 -1
  45. package/Collisions/gpuPicker.js +9 -6
  46. package/Collisions/gpuPicker.js.map +1 -1
  47. package/Compute/computeShader.js +1 -1
  48. package/Compute/computeShader.js.map +1 -1
  49. package/Culling/Helper/boundingInfoHelper.js +3 -3
  50. package/Culling/Helper/boundingInfoHelper.js.map +1 -1
  51. package/Culling/Helper/computeShaderBoundingHelper.js +3 -1
  52. package/Culling/Helper/computeShaderBoundingHelper.js.map +1 -1
  53. package/Culling/Helper/transformFeedbackBoundingHelper.js +3 -0
  54. package/Culling/Helper/transformFeedbackBoundingHelper.js.map +1 -1
  55. package/Debug/debugLayer.js +1 -1
  56. package/Debug/debugLayer.js.map +1 -1
  57. package/Engines/AbstractEngine/abstractEngine.cubeTexture.js +1 -0
  58. package/Engines/AbstractEngine/abstractEngine.cubeTexture.js.map +1 -1
  59. package/Engines/Extensions/engine.prefilteredCubeTexture.js +1 -0
  60. package/Engines/Extensions/engine.prefilteredCubeTexture.js.map +1 -1
  61. package/Engines/Extensions/engine.readTexture.js +1 -0
  62. package/Engines/Extensions/engine.readTexture.js.map +1 -1
  63. package/Engines/WebGPU/Extensions/engine.computeShader.js +1 -0
  64. package/Engines/WebGPU/Extensions/engine.computeShader.js.map +1 -1
  65. package/Engines/WebGPU/Extensions/engine.readTexture.js +1 -0
  66. package/Engines/WebGPU/Extensions/engine.readTexture.js.map +1 -1
  67. package/Engines/WebGPU/Extensions/engine.videoTexture.js +2 -0
  68. package/Engines/WebGPU/Extensions/engine.videoTexture.js.map +1 -1
  69. package/Engines/WebGPU/webgpuBufferManager.js +3 -1
  70. package/Engines/WebGPU/webgpuBufferManager.js.map +1 -1
  71. package/Engines/WebGPU/webgpuOcclusionQuery.js +1 -0
  72. package/Engines/WebGPU/webgpuOcclusionQuery.js.map +1 -1
  73. package/Engines/WebGPU/webgpuQuerySet.js +15 -9
  74. package/Engines/WebGPU/webgpuQuerySet.js.map +1 -1
  75. package/Engines/WebGPU/webgpuTextureManager.js +1 -0
  76. package/Engines/WebGPU/webgpuTextureManager.js.map +1 -1
  77. package/Engines/WebGPU/webgpuTimestampQuery.js +4 -2
  78. package/Engines/WebGPU/webgpuTimestampQuery.js.map +1 -1
  79. package/Engines/WebGPU/webgpuTintWASM.js +1 -0
  80. package/Engines/WebGPU/webgpuTintWASM.js.map +1 -1
  81. package/Engines/abstractEngine.js +5 -2
  82. package/Engines/abstractEngine.js.map +1 -1
  83. package/Engines/engine.common.js +7 -1
  84. package/Engines/engine.common.js.map +1 -1
  85. package/Engines/engine.js +5 -3
  86. package/Engines/engine.js.map +1 -1
  87. package/Engines/engineFactory.js +1 -1
  88. package/Engines/engineFactory.js.map +1 -1
  89. package/Engines/nativeEngine.js +19 -11
  90. package/Engines/nativeEngine.js.map +1 -1
  91. package/Engines/webgpuEngine.js +30 -11
  92. package/Engines/webgpuEngine.js.map +1 -1
  93. package/FlowGraph/flowGraphParser.js +2 -2
  94. package/FlowGraph/flowGraphParser.js.map +1 -1
  95. package/FrameGraph/Node/nodeRenderGraph.js +5 -1
  96. package/FrameGraph/Node/nodeRenderGraph.js.map +1 -1
  97. package/FrameGraph/Node/nodeRenderGraphBlock.js +1 -1
  98. package/FrameGraph/Node/nodeRenderGraphBlock.js.map +1 -1
  99. package/FrameGraph/frameGraph.js +1 -1
  100. package/FrameGraph/frameGraph.js.map +1 -1
  101. package/Helpers/sceneHelpers.js +1 -3
  102. package/Helpers/sceneHelpers.js.map +1 -1
  103. package/Helpers/videoDome.js +1 -0
  104. package/Helpers/videoDome.js.map +1 -1
  105. package/Layers/thinEffectLayer.js +1 -0
  106. package/Layers/thinEffectLayer.js.map +1 -1
  107. package/LensFlares/lensFlareSystem.js +1 -0
  108. package/LensFlares/lensFlareSystem.js.map +1 -1
  109. package/Lights/Shadows/shadowGenerator.js +3 -2
  110. package/Lights/Shadows/shadowGenerator.js.map +1 -1
  111. package/Lights/areaLight.js +2 -0
  112. package/Lights/areaLight.js.map +1 -1
  113. package/Loading/sceneLoader.js +56 -22
  114. package/Loading/sceneLoader.js.map +1 -1
  115. package/Materials/GaussianSplatting/gaussianSplattingMaterial.d.ts +15 -1
  116. package/Materials/GaussianSplatting/gaussianSplattingMaterial.js +34 -7
  117. package/Materials/GaussianSplatting/gaussianSplattingMaterial.js.map +1 -1
  118. package/Materials/Node/Blocks/Dual/clipPlanesBlock.js +1 -0
  119. package/Materials/Node/Blocks/Dual/clipPlanesBlock.js.map +1 -1
  120. package/Materials/Node/Blocks/Dual/fogBlock.js +1 -0
  121. package/Materials/Node/Blocks/Dual/fogBlock.js.map +1 -1
  122. package/Materials/Node/Blocks/Dual/lightBlock.js +1 -0
  123. package/Materials/Node/Blocks/Dual/lightBlock.js.map +1 -1
  124. package/Materials/Node/Blocks/Dual/reflectionTextureBaseBlock.js +1 -0
  125. package/Materials/Node/Blocks/Dual/reflectionTextureBaseBlock.js.map +1 -1
  126. package/Materials/Node/Blocks/Fragment/imageProcessingBlock.js +1 -0
  127. package/Materials/Node/Blocks/Fragment/imageProcessingBlock.js.map +1 -1
  128. package/Materials/Node/Blocks/Fragment/perturbNormalBlock.js +1 -0
  129. package/Materials/Node/Blocks/Fragment/perturbNormalBlock.js.map +1 -1
  130. package/Materials/Node/Blocks/Fragment/shadowMapBlock.js +1 -0
  131. package/Materials/Node/Blocks/Fragment/shadowMapBlock.js.map +1 -1
  132. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js +1 -0
  133. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js.map +1 -1
  134. package/Materials/Node/Blocks/Vertex/bonesBlock.js +1 -0
  135. package/Materials/Node/Blocks/Vertex/bonesBlock.js.map +1 -1
  136. package/Materials/Node/Blocks/Vertex/morphTargetsBlock.js +1 -0
  137. package/Materials/Node/Blocks/Vertex/morphTargetsBlock.js.map +1 -1
  138. package/Materials/Node/nodeMaterial.js +11 -3
  139. package/Materials/Node/nodeMaterial.js.map +1 -1
  140. package/Materials/Node/nodeMaterialBuildState.js +1 -0
  141. package/Materials/Node/nodeMaterialBuildState.js.map +1 -1
  142. package/Materials/Textures/Filtering/hdrIrradianceFiltering.js +1 -0
  143. package/Materials/Textures/Filtering/hdrIrradianceFiltering.js.map +1 -1
  144. package/Materials/Textures/Loaders/basisTextureLoader.js +4 -0
  145. package/Materials/Textures/Loaders/basisTextureLoader.js.map +1 -1
  146. package/Materials/Textures/Loaders/envTextureLoader.js +1 -0
  147. package/Materials/Textures/Loaders/envTextureLoader.js.map +1 -1
  148. package/Materials/Textures/Loaders/exrTextureLoader.js +2 -0
  149. package/Materials/Textures/Loaders/exrTextureLoader.js.map +1 -1
  150. package/Materials/Textures/Loaders/ktxTextureLoader.js +1 -0
  151. package/Materials/Textures/Loaders/ktxTextureLoader.js.map +1 -1
  152. package/Materials/Textures/Loaders/textureLoaderManager.js +9 -9
  153. package/Materials/Textures/Loaders/textureLoaderManager.js.map +1 -1
  154. package/Materials/Textures/Packer/packer.js +3 -1
  155. package/Materials/Textures/Packer/packer.js.map +1 -1
  156. package/Materials/Textures/Procedurals/proceduralTexture.js +1 -0
  157. package/Materials/Textures/Procedurals/proceduralTexture.js.map +1 -1
  158. package/Materials/Textures/baseTexture.polynomial.js +1 -0
  159. package/Materials/Textures/baseTexture.polynomial.js.map +1 -1
  160. package/Materials/Textures/hdrCubeTexture.js +1 -0
  161. package/Materials/Textures/hdrCubeTexture.js.map +1 -1
  162. package/Materials/Textures/internalTexture.js +1 -0
  163. package/Materials/Textures/internalTexture.js.map +1 -1
  164. package/Materials/Textures/rawCubeTexture.js +3 -0
  165. package/Materials/Textures/rawCubeTexture.js.map +1 -1
  166. package/Materials/Textures/renderTargetTexture.js +2 -0
  167. package/Materials/Textures/renderTargetTexture.js.map +1 -1
  168. package/Materials/Textures/videoTexture.js +6 -0
  169. package/Materials/Textures/videoTexture.js.map +1 -1
  170. package/Materials/effect.js +2 -1
  171. package/Materials/effect.js.map +1 -1
  172. package/Materials/effect.webgl.functions.js +3 -1
  173. package/Materials/effect.webgl.functions.js.map +1 -1
  174. package/Materials/effectRenderer.js +1 -0
  175. package/Materials/effectRenderer.js.map +1 -1
  176. package/Materials/material.js +2 -1
  177. package/Materials/material.js.map +1 -1
  178. package/Materials/shaderMaterial.js +4 -2
  179. package/Materials/shaderMaterial.js.map +1 -1
  180. package/Meshes/Compression/dracoCodec.js +5 -1
  181. package/Meshes/Compression/dracoCodec.js.map +1 -1
  182. package/Meshes/Compression/dracoCompression.js +4 -3
  183. package/Meshes/Compression/dracoCompression.js.map +1 -1
  184. package/Meshes/Compression/dracoCompressionWorker.js +5 -2
  185. package/Meshes/Compression/dracoCompressionWorker.js.map +1 -1
  186. package/Meshes/Compression/dracoDecoder.js +5 -1
  187. package/Meshes/Compression/dracoDecoder.js.map +1 -1
  188. package/Meshes/Compression/dracoEncoder.js +3 -2
  189. package/Meshes/Compression/dracoEncoder.js.map +1 -1
  190. package/Meshes/Compression/meshoptCompression.js +18 -18
  191. package/Meshes/Compression/meshoptCompression.js.map +1 -1
  192. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js +14 -15
  193. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js.map +1 -1
  194. package/Meshes/Node/Blocks/Textures/geometryTextureBlock.js +20 -10
  195. package/Meshes/Node/Blocks/Textures/geometryTextureBlock.js.map +1 -1
  196. package/Meshes/Node/Blocks/booleanGeometryBlock.js +1 -0
  197. package/Meshes/Node/Blocks/booleanGeometryBlock.js.map +1 -1
  198. package/Meshes/Node/nodeGeometry.js +5 -1
  199. package/Meshes/Node/nodeGeometry.js.map +1 -1
  200. package/Meshes/mesh.js +2 -2
  201. package/Meshes/mesh.js.map +1 -1
  202. package/Meshes/meshUVSpaceRenderer.js +1 -0
  203. package/Meshes/meshUVSpaceRenderer.js.map +1 -1
  204. package/Misc/HighDynamicRange/cubemapToSphericalPolynomial.js +1 -0
  205. package/Misc/HighDynamicRange/cubemapToSphericalPolynomial.js.map +1 -1
  206. package/Misc/assetsManager.js +2 -1
  207. package/Misc/assetsManager.js.map +1 -1
  208. package/Misc/asyncLock.js +5 -2
  209. package/Misc/asyncLock.js.map +1 -1
  210. package/Misc/basis.js +9 -2
  211. package/Misc/basis.js.map +1 -1
  212. package/Misc/basisWorker.js +3 -1
  213. package/Misc/basisWorker.js.map +1 -1
  214. package/Misc/copyTextureToTexture.js +1 -0
  215. package/Misc/copyTextureToTexture.js.map +1 -1
  216. package/Misc/coroutine.js +2 -1
  217. package/Misc/coroutine.js.map +1 -1
  218. package/Misc/dataReader.js +3 -4
  219. package/Misc/dataReader.js.map +1 -1
  220. package/Misc/dumpTools.js +7 -1
  221. package/Misc/dumpTools.js.map +1 -1
  222. package/Misc/environmentTextureTools.d.ts +0 -2
  223. package/Misc/environmentTextureTools.js +20 -7
  224. package/Misc/environmentTextureTools.js.map +1 -1
  225. package/Misc/equirectangularCapture.js +2 -1
  226. package/Misc/equirectangularCapture.js.map +1 -1
  227. package/Misc/fileTools.js +2 -0
  228. package/Misc/fileTools.js.map +1 -1
  229. package/Misc/filesInput.js +5 -1
  230. package/Misc/filesInput.js.map +1 -1
  231. package/Misc/khronosTextureContainer2.js +10 -3
  232. package/Misc/khronosTextureContainer2.js.map +1 -1
  233. package/Misc/khronosTextureContainer2Worker.js +4 -1
  234. package/Misc/khronosTextureContainer2Worker.js.map +1 -1
  235. package/Misc/minMaxReducer.js +1 -0
  236. package/Misc/minMaxReducer.js.map +1 -1
  237. package/Misc/observable.extensions.js +3 -1
  238. package/Misc/observable.extensions.js.map +1 -1
  239. package/Misc/observable.js +2 -0
  240. package/Misc/observable.js.map +1 -1
  241. package/Misc/observableCoroutine.js +1 -0
  242. package/Misc/observableCoroutine.js.map +1 -1
  243. package/Misc/reflector.js +1 -0
  244. package/Misc/reflector.js.map +1 -1
  245. package/Misc/rgbdTextureTools.js +2 -1
  246. package/Misc/rgbdTextureTools.js.map +1 -1
  247. package/Misc/sceneSerializer.js +2 -2
  248. package/Misc/sceneSerializer.js.map +1 -1
  249. package/Misc/screenshotTools.js +9 -4
  250. package/Misc/screenshotTools.js.map +1 -1
  251. package/Misc/textureTools.js +2 -0
  252. package/Misc/textureTools.js.map +1 -1
  253. package/Misc/tools.internals.js +2 -1
  254. package/Misc/tools.internals.js.map +1 -1
  255. package/Misc/tools.js +9 -3
  256. package/Misc/tools.js.map +1 -1
  257. package/Misc/videoRecorder.js +1 -0
  258. package/Misc/videoRecorder.js.map +1 -1
  259. package/Misc/webRequest.fetch.js +2 -1
  260. package/Misc/webRequest.fetch.js.map +1 -1
  261. package/Misc/workerPool.js +3 -0
  262. package/Misc/workerPool.js.map +1 -1
  263. package/Particles/flowMap.js +1 -1
  264. package/Particles/flowMap.js.map +1 -1
  265. package/Particles/particleHelper.js +7 -0
  266. package/Particles/particleHelper.js.map +1 -1
  267. package/Particles/pointsCloudSystem.js +7 -7
  268. package/Particles/pointsCloudSystem.js.map +1 -1
  269. package/Particles/thinParticleSystem.js +2 -0
  270. package/Particles/thinParticleSystem.js.map +1 -1
  271. package/Physics/physicsHelper.js +2 -2
  272. package/Physics/physicsHelper.js.map +1 -1
  273. package/Physics/v1/Plugins/oimoJSPlugin.js +1 -1
  274. package/Physics/v1/Plugins/oimoJSPlugin.js.map +1 -1
  275. package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.js +1 -0
  276. package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.js.map +1 -1
  277. package/Rendering/GlobalIllumination/giRSMManager.js +1 -0
  278. package/Rendering/GlobalIllumination/giRSMManager.js.map +1 -1
  279. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js +1 -0
  280. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js.map +1 -1
  281. package/Rendering/depthRenderer.js +1 -0
  282. package/Rendering/depthRenderer.js.map +1 -1
  283. package/Rendering/fluidRenderer/fluidRenderingTargetRenderer.js +3 -1
  284. package/Rendering/fluidRenderer/fluidRenderingTargetRenderer.js.map +1 -1
  285. package/Rendering/fluidRenderer/fluidRenderingTextures.js.map +1 -1
  286. package/Rendering/geometryBufferRenderer.js +1 -0
  287. package/Rendering/geometryBufferRenderer.js.map +1 -1
  288. package/Rendering/iblCdfGenerator.js +4 -1
  289. package/Rendering/iblCdfGenerator.js.map +1 -1
  290. package/Sprites/spriteManager.js +5 -1
  291. package/Sprites/spriteManager.js.map +1 -1
  292. package/Sprites/spriteRenderer.js +1 -0
  293. package/Sprites/spriteRenderer.js.map +1 -1
  294. package/XR/features/WebXRAnchorSystem.js +4 -3
  295. package/XR/features/WebXRAnchorSystem.js.map +1 -1
  296. package/XR/features/WebXRDepthSensing.js +1 -1
  297. package/XR/features/WebXRDepthSensing.js.map +1 -1
  298. package/XR/features/WebXRHandTracking.js +4 -1
  299. package/XR/features/WebXRHandTracking.js.map +1 -1
  300. package/XR/features/WebXRHitTest.js +4 -1
  301. package/XR/features/WebXRHitTest.js.map +1 -1
  302. package/XR/features/WebXRHitTestLegacy.js +6 -5
  303. package/XR/features/WebXRHitTestLegacy.js.map +1 -1
  304. package/XR/features/WebXRImageTracking.js +2 -1
  305. package/XR/features/WebXRImageTracking.js.map +1 -1
  306. package/XR/features/WebXRLightEstimation.js +3 -0
  307. package/XR/features/WebXRLightEstimation.js.map +1 -1
  308. package/XR/features/WebXRNearInteraction.js +2 -0
  309. package/XR/features/WebXRNearInteraction.js.map +1 -1
  310. package/XR/features/WebXRPlaneDetector.js +2 -2
  311. package/XR/features/WebXRPlaneDetector.js.map +1 -1
  312. package/XR/motionController/webXRAbstractMotionController.js +3 -2
  313. package/XR/motionController/webXRAbstractMotionController.js.map +1 -1
  314. package/XR/motionController/webXRMicrosoftMixedRealityController.js +6 -6
  315. package/XR/motionController/webXRMicrosoftMixedRealityController.js.map +1 -1
  316. package/XR/motionController/webXRMotionControllerManager.js +15 -9
  317. package/XR/motionController/webXRMotionControllerManager.js.map +1 -1
  318. package/XR/motionController/webXRProfiledMotionController.js +1 -1
  319. package/XR/motionController/webXRProfiledMotionController.js.map +1 -1
  320. package/XR/native/nativeXRFrame.js +1 -0
  321. package/XR/native/nativeXRFrame.js.map +1 -1
  322. package/XR/webXRDefaultExperience.js +10 -12
  323. package/XR/webXRDefaultExperience.js.map +1 -1
  324. package/XR/webXREnterExitUI.js +2 -1
  325. package/XR/webXREnterExitUI.js.map +1 -1
  326. package/XR/webXRExperienceHelper.js +5 -2
  327. package/XR/webXRExperienceHelper.js.map +1 -1
  328. package/XR/webXRFeaturesManager.js +1 -0
  329. package/XR/webXRFeaturesManager.js.map +1 -1
  330. package/XR/webXRInput.js +1 -0
  331. package/XR/webXRInput.js.map +1 -1
  332. package/XR/webXRInputSource.js +2 -0
  333. package/XR/webXRInputSource.js.map +1 -1
  334. package/XR/webXRManagedOutputCanvas.js +5 -1
  335. package/XR/webXRManagedOutputCanvas.js.map +1 -1
  336. package/XR/webXRSessionManager.js +56 -60
  337. package/XR/webXRSessionManager.js.map +1 -1
  338. package/assetContainer.js +28 -28
  339. package/assetContainer.js.map +1 -1
  340. package/package.json +1 -1
  341. package/scene.js +5 -4
  342. package/scene.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"WebXRNearInteraction.js","sourceRoot":"","sources":["../../../../../dev/core/src/XR/features/WebXRNearInteraction.ts"],"names":[],"mappings":"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","sourcesContent":["import { WebXRFeaturesManager, WebXRFeatureName } from \"../webXRFeaturesManager\";\r\nimport type { WebXRControllerPointerSelection } from \"./WebXRControllerPointerSelection\";\r\nimport type { WebXRSessionManager } from \"../webXRSessionManager\";\r\nimport type { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport { CreateSphere } from \"../../Meshes/Builders/sphereBuilder\";\r\nimport type { Observer } from \"../../Misc/observable\";\r\nimport type { WebXRInput } from \"../webXRInput\";\r\nimport type { WebXRInputSource } from \"../webXRInputSource\";\r\nimport type { Scene } from \"../../scene\";\r\nimport type { WebXRControllerComponent } from \"../motionController/webXRControllerComponent\";\r\nimport type { IndicesArray, Nullable } from \"../../types\";\r\nimport { Vector3, Quaternion, TmpVectors } from \"../../Maths/math.vector\";\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 type { WebXRAbstractMotionController } from \"../motionController/webXRAbstractMotionController\";\r\nimport { BoundingSphere } from \"../../Culling/boundingSphere\";\r\nimport type { TransformNode } from \"../../Meshes/transformNode\";\r\nimport { StandardMaterial } from \"../../Materials/standardMaterial\";\r\nimport { Color3 } from \"../../Maths/math.color\";\r\nimport { NodeMaterial } from \"../../Materials/Node/nodeMaterial\";\r\nimport type { Material } from \"../../Materials/material\";\r\nimport { Animation } from \"../../Animations/animation\";\r\nimport { QuadraticEase, EasingFunction } from \"../../Animations/easing\";\r\n// side effects\r\nimport \"../../Meshes/subMesh.project\";\r\nimport { Logger } from \"core/Misc/logger\";\r\n\r\ntype ControllerData = {\r\n xrController?: WebXRInputSource;\r\n squeezeComponent?: WebXRControllerComponent;\r\n selectionComponent?: WebXRControllerComponent;\r\n onButtonChangedObserver?: Nullable<Observer<WebXRControllerComponent>>;\r\n onSqueezeButtonChangedObserver?: Nullable<Observer<WebXRControllerComponent>>;\r\n onFrameObserver?: Nullable<Observer<XRFrame>>;\r\n meshUnderPointer: Nullable<AbstractMesh>;\r\n nearInteractionTargetMesh: Nullable<AbstractMesh>;\r\n pick: Nullable<PickingInfo>;\r\n stalePick: Nullable<PickingInfo>;\r\n id: number;\r\n touchCollisionMesh: AbstractMesh;\r\n touchCollisionMeshFunction: (isTouch: boolean) => void;\r\n hydrateCollisionMeshFunction: (isHydration: boolean) => void;\r\n currentAnimationState: ControllerOrbAnimationState;\r\n grabRay: Ray;\r\n nearInteraction: boolean;\r\n hoverInteraction: boolean;\r\n grabInteraction: boolean;\r\n downTriggered: boolean;\r\n // event support\r\n eventListeners?: { [event in XREventType]?: (event: XRInputSourceEvent) => void };\r\n pickedPointVisualCue: AbstractMesh;\r\n _worldScaleObserver?: Nullable<Observer<{ previousScaleFactor: number; newScaleFactor: number }>>;\r\n};\r\n\r\n// Tracks the interaction animation state when using a motion controller with a near interaction orb\r\nenum ControllerOrbAnimationState {\r\n /**\r\n * Orb is invisible\r\n */\r\n DEHYDRATED,\r\n /**\r\n * Orb is visible and inside the hover range\r\n */\r\n HOVER,\r\n /**\r\n * Orb is visible and touching a near interaction target\r\n */\r\n TOUCH,\r\n}\r\n\r\n/**\r\n * Where should the near interaction mesh be attached to when using a motion controller for near interaction\r\n */\r\nexport const enum WebXRNearControllerMode {\r\n /**\r\n * Motion controllers will not support near interaction\r\n */\r\n DISABLED = 0,\r\n /**\r\n * The interaction point for motion controllers will be inside of them\r\n */\r\n CENTERED_ON_CONTROLLER = 1,\r\n /**\r\n * The interaction point for motion controllers will be in front of the controller\r\n */\r\n CENTERED_IN_FRONT = 2,\r\n}\r\n\r\n/**\r\n * Options interface for the near interaction module\r\n */\r\nexport interface IWebXRNearInteractionOptions {\r\n /**\r\n * If provided, this scene will be used to render meshes.\r\n */\r\n customUtilityLayerScene?: Scene;\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 * The xr input to use with this near interaction\r\n */\r\n xrInput: WebXRInput;\r\n /**\r\n * Enable near interaction on all controllers instead of switching between them\r\n */\r\n enableNearInteractionOnAllControllers?: boolean;\r\n /**\r\n * The preferred hand to give the near interaction 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 * Disable switching the near interaction 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 * Far interaction feature to toggle when near interaction takes precedence\r\n */\r\n farInteractionFeature?: WebXRControllerPointerSelection;\r\n\r\n /**\r\n * Near interaction mode for motion controllers\r\n */\r\n nearInteractionControllerMode?: WebXRNearControllerMode;\r\n\r\n /**\r\n * Optional material for the motion controller orb, if enabled\r\n */\r\n motionControllerOrbMaterial?: Material;\r\n\r\n /**\r\n * If provided, this URL will be used by Node Material to generate the material for the motion controller orb\r\n * If not provided, a snippet will be downloaded from the Babylon.js snippet server CDN.\r\n * The NME JSON file can be found here - https://github.com/BabylonJS/Assets/blob/master/nme/nearInteractionTouchMaterial.json\r\n */\r\n motionControllerTouchMaterialSnippetUrl?: string;\r\n}\r\n\r\nconst LocalTempVectors = [new Vector3(), new Vector3(), new Vector3(), new Vector3()];\r\n\r\n/**\r\n * A module that will enable near interaction near interaction for hands and motion controllers of XR Input Sources\r\n */\r\nexport class WebXRNearInteraction extends WebXRAbstractFeature {\r\n private static _IdCounter = 200;\r\n\r\n private _tmpRay: Ray = new Ray(new Vector3(), new Vector3());\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 // get two new meshes\r\n const { touchCollisionMesh, touchCollisionMeshFunction, hydrateCollisionMeshFunction } = this._generateNewTouchPointMesh();\r\n const selectionMesh = this._generateVisualCue();\r\n\r\n this._controllers[xrController.uniqueId] = {\r\n xrController,\r\n meshUnderPointer: null,\r\n nearInteractionTargetMesh: null,\r\n pick: null,\r\n stalePick: null,\r\n touchCollisionMesh,\r\n touchCollisionMeshFunction: touchCollisionMeshFunction,\r\n hydrateCollisionMeshFunction: hydrateCollisionMeshFunction,\r\n currentAnimationState: ControllerOrbAnimationState.DEHYDRATED,\r\n grabRay: new Ray(new Vector3(), new Vector3()),\r\n hoverInteraction: false,\r\n nearInteraction: false,\r\n grabInteraction: false,\r\n downTriggered: false,\r\n id: WebXRNearInteraction._IdCounter++,\r\n pickedPointVisualCue: selectionMesh,\r\n };\r\n\r\n this._controllers[xrController.uniqueId]._worldScaleObserver =\r\n this._controllers[xrController.uniqueId]._worldScaleObserver ||\r\n this._xrSessionManager.onWorldScaleFactorChangedObservable.add((values) => {\r\n if (values.newScaleFactor !== values.previousScaleFactor) {\r\n this._controllers[xrController.uniqueId].touchCollisionMesh.dispose();\r\n this._controllers[xrController.uniqueId].pickedPointVisualCue.dispose();\r\n\r\n const { touchCollisionMesh, touchCollisionMeshFunction, hydrateCollisionMeshFunction } = this._generateNewTouchPointMesh();\r\n this._controllers[xrController.uniqueId].touchCollisionMesh = touchCollisionMesh;\r\n this._controllers[xrController.uniqueId].touchCollisionMeshFunction = touchCollisionMeshFunction;\r\n this._controllers[xrController.uniqueId].hydrateCollisionMeshFunction = hydrateCollisionMeshFunction;\r\n this._controllers[xrController.uniqueId].pickedPointVisualCue = this._generateVisualCue();\r\n }\r\n });\r\n\r\n if (this._attachedController) {\r\n if (\r\n !this._options.enableNearInteractionOnAllControllers &&\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.enableNearInteractionOnAllControllers) {\r\n this._attachedController = xrController.uniqueId;\r\n }\r\n }\r\n switch (xrController.inputSource.targetRayMode) {\r\n case \"tracked-pointer\":\r\n return this._attachNearInteractionMode(xrController);\r\n case \"gaze\":\r\n return null;\r\n case \"screen\":\r\n return null;\r\n }\r\n };\r\n\r\n private _controllers: {\r\n [controllerUniqueId: string]: ControllerData;\r\n } = {};\r\n private _scene: Scene;\r\n\r\n private _attachedController: string;\r\n\r\n private _farInteractionFeature: Nullable<WebXRControllerPointerSelection> = null;\r\n\r\n /**\r\n * The module's name\r\n */\r\n public static readonly Name = WebXRFeatureName.NEAR_INTERACTION;\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 * 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 * If set to true, the selection mesh will always be hidden. Otherwise it will be shown only when needed\r\n */\r\n public alwaysHideSelectionMesh: boolean = false;\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(\r\n _xrSessionManager: WebXRSessionManager,\r\n private readonly _options: IWebXRNearInteractionOptions\r\n ) {\r\n super(_xrSessionManager);\r\n this._scene = this._xrSessionManager.scene;\r\n if (this._options.nearInteractionControllerMode === undefined) {\r\n this._options.nearInteractionControllerMode = WebXRNearControllerMode.CENTERED_IN_FRONT;\r\n }\r\n\r\n if (this._options.farInteractionFeature) {\r\n this._farInteractionFeature = this._options.farInteractionFeature;\r\n }\r\n }\r\n\r\n /**\r\n * Attach this feature\r\n * Will usually be called by the features manager\r\n *\r\n * @returns true if successful.\r\n */\r\n public override attach(): boolean {\r\n if (!super.attach()) {\r\n return false;\r\n }\r\n\r\n for (const controller of this._options.xrInput.controllers) {\r\n this._attachController(controller);\r\n }\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 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 override detach(): boolean {\r\n if (!super.detach()) {\r\n return false;\r\n }\r\n\r\n const keys = Object.keys(this._controllers);\r\n for (const controllerId of keys) {\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 /**\r\n * This function sets webXRControllerPointerSelection feature that will be disabled when\r\n * the hover range is reached for a mesh and will be reattached when not in hover range.\r\n * This is used to remove the selection rays when moving.\r\n * @param farInteractionFeature the feature to disable when finger is in hover range for a mesh\r\n */\r\n public setFarInteractionFeature(farInteractionFeature: Nullable<WebXRControllerPointerSelection>) {\r\n this._farInteractionFeature = farInteractionFeature;\r\n }\r\n\r\n /**\r\n * Filter used for near interaction pick and hover\r\n * @param mesh the mesh candidate to be pick-filtered\r\n * @returns if the mesh should be included in the list of candidate meshes for near interaction\r\n */\r\n private _nearPickPredicate(mesh: AbstractMesh): boolean {\r\n return mesh.isEnabled() && mesh.isVisible && mesh.isPickable && mesh.isNearPickable;\r\n }\r\n\r\n /**\r\n * Filter used for near interaction grab\r\n * @param mesh the mesh candidate to be pick-filtered\r\n * @returns if the mesh should be included in the list of candidate meshes for near interaction\r\n */\r\n private _nearGrabPredicate(mesh: AbstractMesh): boolean {\r\n return mesh.isEnabled() && mesh.isVisible && mesh.isPickable && mesh.isNearGrabbable;\r\n }\r\n\r\n /**\r\n * Filter used for any near interaction\r\n * @param mesh the mesh candidate to be pick-filtered\r\n * @returns if the mesh should be included in the list of candidate meshes for near interaction\r\n */\r\n private _nearInteractionPredicate(mesh: AbstractMesh): boolean {\r\n return mesh.isEnabled() && mesh.isVisible && mesh.isPickable && (mesh.isNearPickable || mesh.isNearGrabbable);\r\n }\r\n\r\n private _controllerAvailablePredicate(mesh: AbstractMesh, controllerId: string): boolean {\r\n let parent: TransformNode = mesh;\r\n\r\n while (parent) {\r\n if (parent.reservedDataStore && parent.reservedDataStore.nearInteraction && parent.reservedDataStore.nearInteraction.excludedControllerId === controllerId) {\r\n return false;\r\n }\r\n parent = parent.parent as TransformNode;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private _handleTransitionAnimation(controllerData: ControllerData, newState: ControllerOrbAnimationState) {\r\n if (\r\n controllerData.currentAnimationState === newState ||\r\n this._options.nearInteractionControllerMode !== WebXRNearControllerMode.CENTERED_IN_FRONT ||\r\n !!controllerData.xrController?.inputSource.hand\r\n ) {\r\n return;\r\n }\r\n\r\n // Don't always break to allow for animation fallthrough on rare cases of multi-transitions\r\n if (newState > controllerData.currentAnimationState) {\r\n switch (controllerData.currentAnimationState) {\r\n case ControllerOrbAnimationState.DEHYDRATED: {\r\n controllerData.hydrateCollisionMeshFunction(true);\r\n if (newState === ControllerOrbAnimationState.HOVER) {\r\n break;\r\n }\r\n }\r\n // eslint-disable-next-line no-fallthrough\r\n case ControllerOrbAnimationState.HOVER: {\r\n controllerData.touchCollisionMeshFunction(true);\r\n if (newState === ControllerOrbAnimationState.TOUCH) {\r\n break;\r\n }\r\n }\r\n }\r\n } else {\r\n switch (controllerData.currentAnimationState) {\r\n case ControllerOrbAnimationState.TOUCH: {\r\n controllerData.touchCollisionMeshFunction(false);\r\n if (newState === ControllerOrbAnimationState.HOVER) {\r\n break;\r\n }\r\n }\r\n // eslint-disable-next-line no-fallthrough\r\n case ControllerOrbAnimationState.HOVER: {\r\n controllerData.hydrateCollisionMeshFunction(false);\r\n if (newState === ControllerOrbAnimationState.DEHYDRATED) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n controllerData.currentAnimationState = newState;\r\n }\r\n\r\n private readonly _hoverRadius = 0.1;\r\n private readonly _pickRadius = 0.02;\r\n private readonly _controllerPickRadius = 0.03; // The radius is slightly larger here to make it easier to manipulate since it's not tied to the hand position\r\n private readonly _nearGrabLengthScale = 5;\r\n\r\n private _processTouchPoint(id: string, position: Vector3, orientation: Quaternion) {\r\n const controllerData = this._controllers[id];\r\n\r\n // Position and orientation could be temporary values, se we take care of them before calling any functions that use temporary vectors/quaternions\r\n controllerData.grabRay.origin.copyFrom(position);\r\n orientation.toEulerAnglesToRef(TmpVectors.Vector3[0]);\r\n controllerData.grabRay.direction.copyFrom(TmpVectors.Vector3[0]);\r\n\r\n if (this._options.nearInteractionControllerMode === WebXRNearControllerMode.CENTERED_IN_FRONT && !controllerData.xrController?.inputSource.hand) {\r\n // offset the touch point in the direction the transform is facing\r\n controllerData.xrController!.getWorldPointerRayToRef(this._tmpRay);\r\n controllerData.grabRay.origin.addInPlace(this._tmpRay.direction.scale(0.05));\r\n }\r\n\r\n controllerData.grabRay.length = this._nearGrabLengthScale * this._hoverRadius * this._xrSessionManager.worldScalingFactor;\r\n controllerData.touchCollisionMesh.position.copyFrom(controllerData.grabRay.origin).scaleInPlace(this._xrSessionManager.worldScalingFactor);\r\n }\r\n\r\n protected _onXRFrame(_xrFrame: XRFrame) {\r\n const keys = Object.keys(this._controllers);\r\n for (const id of keys) {\r\n // only do this for the selected pointer\r\n const controllerData = this._controllers[id];\r\n const handData = controllerData.xrController?.inputSource.hand;\r\n // If near interaction is not enabled/available for this controller, return early\r\n if (\r\n (!this._options.enableNearInteractionOnAllControllers && id !== this._attachedController) ||\r\n !controllerData.xrController ||\r\n (!handData && (!this._options.nearInteractionControllerMode || !controllerData.xrController.inputSource.gamepad))\r\n ) {\r\n controllerData.pick = null;\r\n return;\r\n }\r\n controllerData.hoverInteraction = false;\r\n controllerData.nearInteraction = false;\r\n\r\n // Every frame check collisions/input\r\n if (controllerData.xrController) {\r\n if (handData) {\r\n const xrIndexTip = handData.get(\"index-finger-tip\");\r\n if (xrIndexTip) {\r\n const indexTipPose = _xrFrame.getJointPose!(xrIndexTip, this._xrSessionManager.referenceSpace);\r\n if (indexTipPose && indexTipPose.transform) {\r\n const axisRHSMultiplier = this._scene.useRightHandedSystem ? 1 : -1;\r\n TmpVectors.Vector3[0].set(indexTipPose.transform.position.x, indexTipPose.transform.position.y, indexTipPose.transform.position.z * axisRHSMultiplier);\r\n TmpVectors.Quaternion[0].set(\r\n indexTipPose.transform.orientation.x,\r\n indexTipPose.transform.orientation.y,\r\n indexTipPose.transform.orientation.z * axisRHSMultiplier,\r\n indexTipPose.transform.orientation.w * axisRHSMultiplier\r\n );\r\n\r\n this._processTouchPoint(id, TmpVectors.Vector3[0], TmpVectors.Quaternion[0]);\r\n }\r\n }\r\n } else if (controllerData.xrController.inputSource.gamepad && this._options.nearInteractionControllerMode !== WebXRNearControllerMode.DISABLED) {\r\n let controllerPose = controllerData.xrController.pointer;\r\n if (controllerData.xrController.grip && this._options.nearInteractionControllerMode === WebXRNearControllerMode.CENTERED_ON_CONTROLLER) {\r\n controllerPose = controllerData.xrController.grip;\r\n }\r\n\r\n this._processTouchPoint(id, controllerPose.position, controllerPose.rotationQuaternion!);\r\n }\r\n } else {\r\n return;\r\n }\r\n\r\n const accuratePickInfo = (originalScenePick: Nullable<PickingInfo>, utilityScenePick: Nullable<PickingInfo>): Nullable<PickingInfo> => {\r\n let pick = null;\r\n if (!utilityScenePick || !utilityScenePick.hit) {\r\n // No hit in utility scene\r\n pick = originalScenePick;\r\n } else if (!originalScenePick || !originalScenePick.hit) {\r\n // No hit in original scene\r\n pick = utilityScenePick;\r\n } else if (utilityScenePick.distance < originalScenePick.distance) {\r\n // Hit is closer in utility scene\r\n pick = utilityScenePick;\r\n } else {\r\n // Hit is closer in original scene\r\n pick = originalScenePick;\r\n }\r\n return pick;\r\n };\r\n const populateNearInteractionInfo = (nearInteractionInfo: Nullable<PickingInfo>): PickingInfo => {\r\n let result = new PickingInfo();\r\n\r\n let nearInteractionAtOrigin = false;\r\n const nearInteraction = nearInteractionInfo && nearInteractionInfo.pickedPoint && nearInteractionInfo.hit;\r\n if (nearInteractionInfo?.pickedPoint) {\r\n nearInteractionAtOrigin = nearInteractionInfo.pickedPoint.x === 0 && nearInteractionInfo.pickedPoint.y === 0 && nearInteractionInfo.pickedPoint.z === 0;\r\n }\r\n if (nearInteraction && !nearInteractionAtOrigin) {\r\n result = nearInteractionInfo!;\r\n }\r\n return result;\r\n };\r\n\r\n // Don't perform touch logic while grabbing, to prevent triggering touch interactions while in the middle of a grab interaction\r\n // Dont update cursor logic either - the cursor should already be visible for the grab to be in range,\r\n // and in order to maintain its position on the target mesh it is parented for the duration of the grab.\r\n if (!controllerData.grabInteraction) {\r\n let pick = null;\r\n\r\n // near interaction hover\r\n let utilitySceneHoverPick = null;\r\n if (this._options.useUtilityLayer && this._utilityLayerScene) {\r\n utilitySceneHoverPick = this._pickWithSphere(\r\n controllerData,\r\n this._hoverRadius * this._xrSessionManager.worldScalingFactor,\r\n this._utilityLayerScene,\r\n (mesh: AbstractMesh) => this._nearInteractionPredicate(mesh)\r\n );\r\n }\r\n const originalSceneHoverPick = this._pickWithSphere(\r\n controllerData,\r\n this._hoverRadius * this._xrSessionManager.worldScalingFactor,\r\n this._scene,\r\n (mesh: AbstractMesh) => this._nearInteractionPredicate(mesh)\r\n );\r\n\r\n const hoverPickInfo = accuratePickInfo(originalSceneHoverPick, utilitySceneHoverPick);\r\n if (hoverPickInfo && hoverPickInfo.hit) {\r\n pick = populateNearInteractionInfo(hoverPickInfo);\r\n if (pick.hit) {\r\n controllerData.hoverInteraction = true;\r\n }\r\n }\r\n\r\n // near interaction pick\r\n if (controllerData.hoverInteraction) {\r\n let utilitySceneNearPick = null;\r\n const radius = (handData ? this._pickRadius : this._controllerPickRadius) * this._xrSessionManager.worldScalingFactor;\r\n if (this._options.useUtilityLayer && this._utilityLayerScene) {\r\n utilitySceneNearPick = this._pickWithSphere(controllerData, radius, this._utilityLayerScene, (mesh: AbstractMesh) => this._nearPickPredicate(mesh));\r\n }\r\n const originalSceneNearPick = this._pickWithSphere(controllerData, radius, this._scene, (mesh: AbstractMesh) => this._nearPickPredicate(mesh));\r\n const pickInfo = accuratePickInfo(originalSceneNearPick, utilitySceneNearPick);\r\n const nearPick = populateNearInteractionInfo(pickInfo);\r\n if (nearPick.hit) {\r\n // Near pick takes precedence over hover interaction\r\n pick = nearPick;\r\n controllerData.nearInteraction = true;\r\n }\r\n }\r\n\r\n controllerData.stalePick = controllerData.pick;\r\n controllerData.pick = pick;\r\n\r\n // Update mesh under pointer\r\n if (controllerData.pick && controllerData.pick.pickedPoint && controllerData.pick.hit) {\r\n controllerData.meshUnderPointer = controllerData.pick.pickedMesh;\r\n controllerData.pickedPointVisualCue.position.copyFrom(controllerData.pick.pickedPoint);\r\n controllerData.pickedPointVisualCue.isVisible = !this.alwaysHideSelectionMesh;\r\n\r\n if (this._farInteractionFeature && this._farInteractionFeature.attached) {\r\n this._farInteractionFeature._setPointerSelectionDisabledByPointerId(controllerData.id, true);\r\n }\r\n } else {\r\n controllerData.meshUnderPointer = null;\r\n controllerData.pickedPointVisualCue.isVisible = false;\r\n\r\n if (this._farInteractionFeature && this._farInteractionFeature.attached) {\r\n this._farInteractionFeature._setPointerSelectionDisabledByPointerId(controllerData.id, false);\r\n }\r\n }\r\n }\r\n\r\n // Update the interaction animation. Only updates if the visible touch mesh is active\r\n let state = ControllerOrbAnimationState.DEHYDRATED;\r\n if (controllerData.grabInteraction || controllerData.nearInteraction) {\r\n state = ControllerOrbAnimationState.TOUCH;\r\n } else if (controllerData.hoverInteraction) {\r\n state = ControllerOrbAnimationState.HOVER;\r\n }\r\n this._handleTransitionAnimation(controllerData, state);\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 _generateVisualCue() {\r\n const sceneToRenderTo = this._options.useUtilityLayer ? this._options.customUtilityLayerScene || UtilityLayerRenderer.DefaultUtilityLayer.utilityLayerScene : this._scene;\r\n const selectionMesh = CreateSphere(\r\n \"nearInteraction\",\r\n {\r\n diameter: 0.0035 * 3 * this._xrSessionManager.worldScalingFactor,\r\n },\r\n sceneToRenderTo\r\n );\r\n selectionMesh.bakeCurrentTransformIntoVertices();\r\n selectionMesh.isPickable = false;\r\n selectionMesh.isVisible = false;\r\n selectionMesh.rotationQuaternion = Quaternion.Identity();\r\n const 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 return selectionMesh;\r\n }\r\n\r\n private _isControllerReadyForNearInteraction(id: number) {\r\n if (this._farInteractionFeature) {\r\n return this._farInteractionFeature._getPointerSelectionDisabledByPointerId(id);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private _attachNearInteractionMode(xrController: WebXRInputSource) {\r\n const controllerData = this._controllers[xrController.uniqueId];\r\n const pointerEventInit: PointerEventInit = {\r\n pointerId: controllerData.id,\r\n pointerType: \"xr-near\",\r\n };\r\n controllerData.onFrameObserver = this._xrSessionManager.onXRFrameObservable.add(() => {\r\n if (\r\n (!this._options.enableNearInteractionOnAllControllers && xrController.uniqueId !== this._attachedController) ||\r\n !controllerData.xrController ||\r\n (!controllerData.xrController.inputSource.hand && (!this._options.nearInteractionControllerMode || !controllerData.xrController.inputSource.gamepad))\r\n ) {\r\n return;\r\n }\r\n if (controllerData.pick) {\r\n controllerData.pick.ray = controllerData.grabRay;\r\n }\r\n\r\n if (controllerData.pick && this._isControllerReadyForNearInteraction(controllerData.id)) {\r\n this._scene.simulatePointerMove(controllerData.pick, pointerEventInit);\r\n }\r\n\r\n // Near pick pointer event\r\n if (controllerData.nearInteraction && controllerData.pick && controllerData.pick.hit) {\r\n if (!controllerData.nearInteractionTargetMesh) {\r\n this._scene.simulatePointerDown(controllerData.pick, pointerEventInit);\r\n controllerData.nearInteractionTargetMesh = controllerData.meshUnderPointer;\r\n controllerData.downTriggered = true;\r\n }\r\n } else if (controllerData.nearInteractionTargetMesh && controllerData.stalePick) {\r\n this._scene.simulatePointerUp(controllerData.stalePick, pointerEventInit);\r\n controllerData.downTriggered = false;\r\n controllerData.nearInteractionTargetMesh = null;\r\n }\r\n });\r\n\r\n const grabCheck = (pressed: boolean) => {\r\n if (\r\n this._options.enableNearInteractionOnAllControllers ||\r\n (xrController.uniqueId === this._attachedController && this._isControllerReadyForNearInteraction(controllerData.id))\r\n ) {\r\n if (controllerData.pick) {\r\n controllerData.pick.ray = controllerData.grabRay;\r\n }\r\n if (pressed && controllerData.pick && controllerData.meshUnderPointer && this._nearGrabPredicate(controllerData.meshUnderPointer)) {\r\n controllerData.grabInteraction = true;\r\n controllerData.pickedPointVisualCue.isVisible = false;\r\n this._scene.simulatePointerDown(controllerData.pick, pointerEventInit);\r\n controllerData.downTriggered = true;\r\n } else if (!pressed && controllerData.pick && controllerData.grabInteraction) {\r\n this._scene.simulatePointerUp(controllerData.pick, pointerEventInit);\r\n controllerData.downTriggered = false;\r\n controllerData.grabInteraction = false;\r\n controllerData.pickedPointVisualCue.isVisible = !this.alwaysHideSelectionMesh;\r\n }\r\n } else {\r\n if (pressed && !this._options.enableNearInteractionOnAllControllers && !this._options.disableSwitchOnClick) {\r\n this._attachedController = xrController.uniqueId;\r\n }\r\n }\r\n };\r\n\r\n if (xrController.inputSource.gamepad) {\r\n const init = (motionController: WebXRAbstractMotionController) => {\r\n controllerData.squeezeComponent = motionController.getComponent(\"grasp\");\r\n if (controllerData.squeezeComponent) {\r\n controllerData.onSqueezeButtonChangedObserver = controllerData.squeezeComponent.onButtonStateChangedObservable.add((component) => {\r\n if (component.changes.pressed) {\r\n const pressed = component.changes.pressed.current;\r\n grabCheck(pressed);\r\n }\r\n });\r\n } else {\r\n controllerData.selectionComponent = motionController.getMainComponent();\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 grabCheck(pressed);\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 (\r\n controllerData.xrController &&\r\n event.inputSource === controllerData.xrController.inputSource &&\r\n controllerData.pick &&\r\n this._isControllerReadyForNearInteraction(controllerData.id) &&\r\n controllerData.meshUnderPointer &&\r\n this._nearGrabPredicate(controllerData.meshUnderPointer)\r\n ) {\r\n controllerData.grabInteraction = true;\r\n controllerData.pickedPointVisualCue.isVisible = false;\r\n this._scene.simulatePointerDown(controllerData.pick, pointerEventInit);\r\n controllerData.downTriggered = true;\r\n }\r\n };\r\n\r\n const selectEndListener = (event: XRInputSourceEvent) => {\r\n if (\r\n controllerData.xrController &&\r\n event.inputSource === controllerData.xrController.inputSource &&\r\n controllerData.pick &&\r\n this._isControllerReadyForNearInteraction(controllerData.id)\r\n ) {\r\n this._scene.simulatePointerUp(controllerData.pick, pointerEventInit);\r\n controllerData.grabInteraction = false;\r\n controllerData.pickedPointVisualCue.isVisible = !this.alwaysHideSelectionMesh;\r\n controllerData.downTriggered = false;\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 _detachController(xrControllerUniqueId: string) {\r\n const controllerData = this._controllers[xrControllerUniqueId];\r\n if (!controllerData) {\r\n return;\r\n }\r\n if (controllerData.squeezeComponent) {\r\n if (controllerData.onSqueezeButtonChangedObserver) {\r\n controllerData.squeezeComponent.onButtonStateChangedObservable.remove(controllerData.onSqueezeButtonChangedObserver);\r\n }\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 const keys = Object.keys(controllerData.eventListeners);\r\n for (const eventName of keys) {\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 as any);\r\n }\r\n }\r\n }\r\n controllerData.touchCollisionMesh.dispose();\r\n controllerData.pickedPointVisualCue.dispose();\r\n\r\n this._xrSessionManager.runInXRFrame(() => {\r\n if (!controllerData.downTriggered) {\r\n return;\r\n }\r\n // Fire a pointerup in case controller was detached before a pointerup event was fired\r\n const pointerEventInit: PointerEventInit = {\r\n pointerId: controllerData.id,\r\n pointerType: \"xr-near\",\r\n };\r\n this._scene.simulatePointerUp(new PickingInfo(), pointerEventInit);\r\n });\r\n\r\n // remove world scale observer\r\n if (controllerData._worldScaleObserver) {\r\n this._xrSessionManager.onWorldScaleFactorChangedObservable.remove(controllerData._worldScaleObserver);\r\n }\r\n\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 private _generateNewTouchPointMesh() {\r\n const worldScale = this._xrSessionManager.worldScalingFactor;\r\n // populate information for near hover, pick and pinch\r\n const meshCreationScene = this._options.useUtilityLayer ? this._options.customUtilityLayerScene || UtilityLayerRenderer.DefaultUtilityLayer.utilityLayerScene : this._scene;\r\n\r\n const touchCollisionMesh = CreateSphere(\"PickSphere\", { diameter: 1 * worldScale }, meshCreationScene);\r\n touchCollisionMesh.isVisible = false;\r\n\r\n // Generate the material for the touch mesh visuals\r\n if (this._options.motionControllerOrbMaterial) {\r\n touchCollisionMesh.material = this._options.motionControllerOrbMaterial;\r\n } else {\r\n let parsePromise: Promise<NodeMaterial>;\r\n if (this._options.motionControllerTouchMaterialSnippetUrl) {\r\n parsePromise = NodeMaterial.ParseFromFileAsync(\"motionControllerTouchMaterial\", this._options.motionControllerTouchMaterialSnippetUrl, meshCreationScene);\r\n } else {\r\n parsePromise = NodeMaterial.ParseFromSnippetAsync(\"8RUNKL#3\", meshCreationScene);\r\n }\r\n parsePromise\r\n .then((mat) => {\r\n touchCollisionMesh.material = mat;\r\n })\r\n .catch((err) => {\r\n Logger.Warn(`Error creating touch material in WebXRNearInteraction: ${err}`);\r\n });\r\n }\r\n\r\n const easingFunction = new QuadraticEase();\r\n easingFunction.setEasingMode(EasingFunction.EASINGMODE_EASEINOUT);\r\n\r\n // Adjust the visual size based off of the size of the touch collision orb.\r\n // Having the size perfectly match for hover gives a more accurate tell for when the user will start interacting with the target\r\n // Sizes for other states are somewhat arbitrary, as they are based on what feels nice during an interaction\r\n const hoverSizeVec = new Vector3(this._controllerPickRadius, this._controllerPickRadius, this._controllerPickRadius).scaleInPlace(worldScale);\r\n const touchSize = this._controllerPickRadius * (4 / 3);\r\n const touchSizeVec = new Vector3(touchSize, touchSize, touchSize).scaleInPlace(worldScale);\r\n const hydrateTransitionSize = this._controllerPickRadius * (7 / 6);\r\n const hydrateTransitionSizeVec = new Vector3(hydrateTransitionSize, hydrateTransitionSize, hydrateTransitionSize).scaleInPlace(worldScale);\r\n const touchHoverTransitionSize = this._controllerPickRadius * (4 / 5);\r\n const touchHoverTransitionSizeVec = new Vector3(touchHoverTransitionSize, touchHoverTransitionSize, touchHoverTransitionSize).scaleInPlace(worldScale);\r\n const hoverTouchTransitionSize = this._controllerPickRadius * (3 / 2);\r\n const hoverTouchTransitionSizeVec = new Vector3(hoverTouchTransitionSize, hoverTouchTransitionSize, hoverTouchTransitionSize).scaleInPlace(worldScale);\r\n\r\n const touchKeys = [\r\n { frame: 0, value: hoverSizeVec },\r\n { frame: 10, value: hoverTouchTransitionSizeVec },\r\n { frame: 18, value: touchSizeVec },\r\n ];\r\n const releaseKeys = [\r\n { frame: 0, value: touchSizeVec },\r\n { frame: 10, value: touchHoverTransitionSizeVec },\r\n { frame: 18, value: hoverSizeVec },\r\n ];\r\n const hydrateKeys = [\r\n { frame: 0, value: Vector3.ZeroReadOnly },\r\n { frame: 12, value: hydrateTransitionSizeVec },\r\n { frame: 15, value: hoverSizeVec },\r\n ];\r\n const dehydrateKeys = [\r\n { frame: 0, value: hoverSizeVec },\r\n { frame: 10, value: Vector3.ZeroReadOnly },\r\n { frame: 15, value: Vector3.ZeroReadOnly },\r\n ];\r\n\r\n const touchAction = new Animation(\"touch\", \"scaling\", 60, Animation.ANIMATIONTYPE_VECTOR3, Animation.ANIMATIONLOOPMODE_CONSTANT);\r\n const releaseAction = new Animation(\"release\", \"scaling\", 60, Animation.ANIMATIONTYPE_VECTOR3, Animation.ANIMATIONLOOPMODE_CONSTANT);\r\n const hydrateAction = new Animation(\"hydrate\", \"scaling\", 60, Animation.ANIMATIONTYPE_VECTOR3, Animation.ANIMATIONLOOPMODE_CONSTANT);\r\n const dehydrateAction = new Animation(\"dehydrate\", \"scaling\", 60, Animation.ANIMATIONTYPE_VECTOR3, Animation.ANIMATIONLOOPMODE_CONSTANT);\r\n\r\n touchAction.setEasingFunction(easingFunction);\r\n releaseAction.setEasingFunction(easingFunction);\r\n hydrateAction.setEasingFunction(easingFunction);\r\n dehydrateAction.setEasingFunction(easingFunction);\r\n\r\n touchAction.setKeys(touchKeys);\r\n releaseAction.setKeys(releaseKeys);\r\n hydrateAction.setKeys(hydrateKeys);\r\n dehydrateAction.setKeys(dehydrateKeys);\r\n\r\n const touchCollisionMeshFunction = (isTouch: boolean) => {\r\n const action = isTouch ? touchAction : releaseAction;\r\n meshCreationScene.beginDirectAnimation(touchCollisionMesh, [action], 0, 18, false, 1);\r\n };\r\n\r\n const hydrateCollisionMeshFunction = (isHydration: boolean) => {\r\n const action = isHydration ? hydrateAction : dehydrateAction;\r\n if (isHydration) {\r\n touchCollisionMesh.isVisible = true;\r\n }\r\n meshCreationScene.beginDirectAnimation(touchCollisionMesh, [action], 0, 15, false, 1, () => {\r\n if (!isHydration) {\r\n touchCollisionMesh.isVisible = false;\r\n }\r\n });\r\n };\r\n\r\n return { touchCollisionMesh, touchCollisionMeshFunction, hydrateCollisionMeshFunction };\r\n }\r\n\r\n private _pickWithSphere(controllerData: ControllerData, radius: number, sceneToUse: Scene, predicate: (mesh: AbstractMesh) => boolean): Nullable<PickingInfo> {\r\n const pickingInfo = new PickingInfo();\r\n pickingInfo.distance = +Infinity;\r\n\r\n if (controllerData.touchCollisionMesh && controllerData.xrController) {\r\n const position = controllerData.touchCollisionMesh.position;\r\n const sphere = BoundingSphere.CreateFromCenterAndRadius(position, radius);\r\n\r\n for (let meshIndex = 0; meshIndex < sceneToUse.meshes.length; meshIndex++) {\r\n const mesh = sceneToUse.meshes[meshIndex];\r\n if (!predicate(mesh) || !this._controllerAvailablePredicate(mesh, controllerData.xrController.uniqueId)) {\r\n continue;\r\n }\r\n const result = WebXRNearInteraction.PickMeshWithSphere(mesh, sphere);\r\n\r\n if (result && result.hit && result.distance < pickingInfo.distance) {\r\n pickingInfo.hit = result.hit;\r\n pickingInfo.pickedMesh = mesh;\r\n pickingInfo.pickedPoint = result.pickedPoint;\r\n pickingInfo.aimTransform = controllerData.xrController.pointer;\r\n pickingInfo.gripTransform = controllerData.xrController.grip || null;\r\n pickingInfo.originMesh = controllerData.touchCollisionMesh;\r\n pickingInfo.distance = result.distance;\r\n pickingInfo.bu = result.bu;\r\n pickingInfo.bv = result.bv;\r\n pickingInfo.faceId = result.faceId;\r\n pickingInfo.subMeshId = result.subMeshId;\r\n }\r\n }\r\n }\r\n return pickingInfo;\r\n }\r\n\r\n /**\r\n * Picks a mesh with a sphere\r\n * @param mesh the mesh to pick\r\n * @param sphere picking sphere in world coordinates\r\n * @param skipBoundingInfo a boolean indicating if we should skip the bounding info check\r\n * @returns the picking info\r\n */\r\n public static PickMeshWithSphere(mesh: AbstractMesh, sphere: BoundingSphere, skipBoundingInfo = false): PickingInfo {\r\n const subMeshes = mesh.subMeshes;\r\n const pi = new PickingInfo();\r\n const boundingInfo = mesh.getBoundingInfo();\r\n\r\n if (!mesh._generatePointsArray()) {\r\n return pi;\r\n }\r\n\r\n if (!mesh.subMeshes || !boundingInfo) {\r\n return pi;\r\n }\r\n\r\n if (!skipBoundingInfo && !BoundingSphere.Intersects(boundingInfo.boundingSphere, sphere)) {\r\n return pi;\r\n }\r\n\r\n const result = LocalTempVectors[0];\r\n const tmpVec = LocalTempVectors[1];\r\n LocalTempVectors[2].setAll(0);\r\n LocalTempVectors[3].setAll(0);\r\n\r\n const tmpRay = new Ray(LocalTempVectors[2], LocalTempVectors[3], 1);\r\n\r\n let distance = +Infinity;\r\n let tmp, tmpDistanceSphereToCenter, tmpDistanceSurfaceToCenter, intersectionInfo;\r\n const center = TmpVectors.Vector3[2];\r\n const worldToMesh = TmpVectors.Matrix[0];\r\n worldToMesh.copyFrom(mesh.getWorldMatrix());\r\n worldToMesh.invert();\r\n Vector3.TransformCoordinatesToRef(sphere.center, worldToMesh, center);\r\n\r\n for (let index = 0; index < subMeshes.length; index++) {\r\n const subMesh = subMeshes[index];\r\n\r\n subMesh.projectToRef(center, <Vector3[]>mesh._positions, <IndicesArray>mesh.getIndices(), tmpVec);\r\n\r\n Vector3.TransformCoordinatesToRef(tmpVec, mesh.getWorldMatrix(), tmpVec);\r\n tmp = Vector3.Distance(tmpVec, sphere.center);\r\n\r\n // Check for finger inside of mesh\r\n tmpDistanceSurfaceToCenter = Vector3.DistanceSquared(tmpVec, mesh.getAbsolutePosition());\r\n tmpDistanceSphereToCenter = Vector3.DistanceSquared(sphere.center, mesh.getAbsolutePosition());\r\n if (tmpDistanceSphereToCenter !== -1 && tmpDistanceSurfaceToCenter !== -1 && tmpDistanceSurfaceToCenter > tmpDistanceSphereToCenter) {\r\n tmp = 0;\r\n tmpVec.copyFrom(sphere.center);\r\n }\r\n\r\n if (tmp !== -1 && tmp < distance) {\r\n distance = tmp;\r\n\r\n // ray between the sphere center and the point on the mesh\r\n Ray.CreateFromToToRef(sphere.center, tmpVec, tmpRay);\r\n tmpRay.length = distance * 2;\r\n intersectionInfo = tmpRay.intersectsMesh(mesh);\r\n\r\n result.copyFrom(tmpVec);\r\n }\r\n }\r\n\r\n if (distance < sphere.radius) {\r\n pi.hit = true;\r\n pi.distance = distance;\r\n pi.pickedMesh = mesh;\r\n pi.pickedPoint = result.clone();\r\n if (intersectionInfo && intersectionInfo.bu !== null && intersectionInfo.bv !== null) {\r\n pi.faceId = intersectionInfo.faceId;\r\n pi.subMeshId = intersectionInfo.subMeshId;\r\n pi.bu = intersectionInfo.bu;\r\n pi.bv = intersectionInfo.bv;\r\n }\r\n }\r\n\r\n return pi;\r\n }\r\n}\r\n\r\n//Register the plugin\r\nWebXRFeaturesManager.AddWebXRFeature(\r\n WebXRNearInteraction.Name,\r\n (xrSessionManager, options) => {\r\n return () => new WebXRNearInteraction(xrSessionManager, options);\r\n },\r\n WebXRNearInteraction.Version,\r\n true\r\n);\r\n"]}
1
+ {"version":3,"file":"WebXRNearInteraction.js","sourceRoot":"","sources":["../../../../../dev/core/src/XR/features/WebXRNearInteraction.ts"],"names":[],"mappings":"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","sourcesContent":["import { WebXRFeaturesManager, WebXRFeatureName } from \"../webXRFeaturesManager\";\r\nimport type { WebXRControllerPointerSelection } from \"./WebXRControllerPointerSelection\";\r\nimport type { WebXRSessionManager } from \"../webXRSessionManager\";\r\nimport type { AbstractMesh } from \"../../Meshes/abstractMesh\";\r\nimport { CreateSphere } from \"../../Meshes/Builders/sphereBuilder\";\r\nimport type { Observer } from \"../../Misc/observable\";\r\nimport type { WebXRInput } from \"../webXRInput\";\r\nimport type { WebXRInputSource } from \"../webXRInputSource\";\r\nimport type { Scene } from \"../../scene\";\r\nimport type { WebXRControllerComponent } from \"../motionController/webXRControllerComponent\";\r\nimport type { IndicesArray, Nullable } from \"../../types\";\r\nimport { Vector3, Quaternion, TmpVectors } from \"../../Maths/math.vector\";\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 type { WebXRAbstractMotionController } from \"../motionController/webXRAbstractMotionController\";\r\nimport { BoundingSphere } from \"../../Culling/boundingSphere\";\r\nimport type { TransformNode } from \"../../Meshes/transformNode\";\r\nimport { StandardMaterial } from \"../../Materials/standardMaterial\";\r\nimport { Color3 } from \"../../Maths/math.color\";\r\nimport { NodeMaterial } from \"../../Materials/Node/nodeMaterial\";\r\nimport type { Material } from \"../../Materials/material\";\r\nimport { Animation } from \"../../Animations/animation\";\r\nimport { QuadraticEase, EasingFunction } from \"../../Animations/easing\";\r\n// side effects\r\nimport \"../../Meshes/subMesh.project\";\r\nimport { Logger } from \"core/Misc/logger\";\r\n\r\ntype ControllerData = {\r\n xrController?: WebXRInputSource;\r\n squeezeComponent?: WebXRControllerComponent;\r\n selectionComponent?: WebXRControllerComponent;\r\n onButtonChangedObserver?: Nullable<Observer<WebXRControllerComponent>>;\r\n onSqueezeButtonChangedObserver?: Nullable<Observer<WebXRControllerComponent>>;\r\n onFrameObserver?: Nullable<Observer<XRFrame>>;\r\n meshUnderPointer: Nullable<AbstractMesh>;\r\n nearInteractionTargetMesh: Nullable<AbstractMesh>;\r\n pick: Nullable<PickingInfo>;\r\n stalePick: Nullable<PickingInfo>;\r\n id: number;\r\n touchCollisionMesh: AbstractMesh;\r\n touchCollisionMeshFunction: (isTouch: boolean) => void;\r\n hydrateCollisionMeshFunction: (isHydration: boolean) => void;\r\n currentAnimationState: ControllerOrbAnimationState;\r\n grabRay: Ray;\r\n nearInteraction: boolean;\r\n hoverInteraction: boolean;\r\n grabInteraction: boolean;\r\n downTriggered: boolean;\r\n // event support\r\n eventListeners?: { [event in XREventType]?: (event: XRInputSourceEvent) => void };\r\n pickedPointVisualCue: AbstractMesh;\r\n _worldScaleObserver?: Nullable<Observer<{ previousScaleFactor: number; newScaleFactor: number }>>;\r\n};\r\n\r\n// Tracks the interaction animation state when using a motion controller with a near interaction orb\r\nenum ControllerOrbAnimationState {\r\n /**\r\n * Orb is invisible\r\n */\r\n DEHYDRATED,\r\n /**\r\n * Orb is visible and inside the hover range\r\n */\r\n HOVER,\r\n /**\r\n * Orb is visible and touching a near interaction target\r\n */\r\n TOUCH,\r\n}\r\n\r\n/**\r\n * Where should the near interaction mesh be attached to when using a motion controller for near interaction\r\n */\r\nexport const enum WebXRNearControllerMode {\r\n /**\r\n * Motion controllers will not support near interaction\r\n */\r\n DISABLED = 0,\r\n /**\r\n * The interaction point for motion controllers will be inside of them\r\n */\r\n CENTERED_ON_CONTROLLER = 1,\r\n /**\r\n * The interaction point for motion controllers will be in front of the controller\r\n */\r\n CENTERED_IN_FRONT = 2,\r\n}\r\n\r\n/**\r\n * Options interface for the near interaction module\r\n */\r\nexport interface IWebXRNearInteractionOptions {\r\n /**\r\n * If provided, this scene will be used to render meshes.\r\n */\r\n customUtilityLayerScene?: Scene;\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 * The xr input to use with this near interaction\r\n */\r\n xrInput: WebXRInput;\r\n /**\r\n * Enable near interaction on all controllers instead of switching between them\r\n */\r\n enableNearInteractionOnAllControllers?: boolean;\r\n /**\r\n * The preferred hand to give the near interaction 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 * Disable switching the near interaction 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 * Far interaction feature to toggle when near interaction takes precedence\r\n */\r\n farInteractionFeature?: WebXRControllerPointerSelection;\r\n\r\n /**\r\n * Near interaction mode for motion controllers\r\n */\r\n nearInteractionControllerMode?: WebXRNearControllerMode;\r\n\r\n /**\r\n * Optional material for the motion controller orb, if enabled\r\n */\r\n motionControllerOrbMaterial?: Material;\r\n\r\n /**\r\n * If provided, this URL will be used by Node Material to generate the material for the motion controller orb\r\n * If not provided, a snippet will be downloaded from the Babylon.js snippet server CDN.\r\n * The NME JSON file can be found here - https://github.com/BabylonJS/Assets/blob/master/nme/nearInteractionTouchMaterial.json\r\n */\r\n motionControllerTouchMaterialSnippetUrl?: string;\r\n}\r\n\r\nconst LocalTempVectors = [new Vector3(), new Vector3(), new Vector3(), new Vector3()];\r\n\r\n/**\r\n * A module that will enable near interaction near interaction for hands and motion controllers of XR Input Sources\r\n */\r\nexport class WebXRNearInteraction extends WebXRAbstractFeature {\r\n private static _IdCounter = 200;\r\n\r\n private _tmpRay: Ray = new Ray(new Vector3(), new Vector3());\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 // get two new meshes\r\n const { touchCollisionMesh, touchCollisionMeshFunction, hydrateCollisionMeshFunction } = this._generateNewTouchPointMesh();\r\n const selectionMesh = this._generateVisualCue();\r\n\r\n this._controllers[xrController.uniqueId] = {\r\n xrController,\r\n meshUnderPointer: null,\r\n nearInteractionTargetMesh: null,\r\n pick: null,\r\n stalePick: null,\r\n touchCollisionMesh,\r\n touchCollisionMeshFunction: touchCollisionMeshFunction,\r\n hydrateCollisionMeshFunction: hydrateCollisionMeshFunction,\r\n currentAnimationState: ControllerOrbAnimationState.DEHYDRATED,\r\n grabRay: new Ray(new Vector3(), new Vector3()),\r\n hoverInteraction: false,\r\n nearInteraction: false,\r\n grabInteraction: false,\r\n downTriggered: false,\r\n id: WebXRNearInteraction._IdCounter++,\r\n pickedPointVisualCue: selectionMesh,\r\n };\r\n\r\n this._controllers[xrController.uniqueId]._worldScaleObserver =\r\n this._controllers[xrController.uniqueId]._worldScaleObserver ||\r\n this._xrSessionManager.onWorldScaleFactorChangedObservable.add((values) => {\r\n if (values.newScaleFactor !== values.previousScaleFactor) {\r\n this._controllers[xrController.uniqueId].touchCollisionMesh.dispose();\r\n this._controllers[xrController.uniqueId].pickedPointVisualCue.dispose();\r\n\r\n const { touchCollisionMesh, touchCollisionMeshFunction, hydrateCollisionMeshFunction } = this._generateNewTouchPointMesh();\r\n this._controllers[xrController.uniqueId].touchCollisionMesh = touchCollisionMesh;\r\n this._controllers[xrController.uniqueId].touchCollisionMeshFunction = touchCollisionMeshFunction;\r\n this._controllers[xrController.uniqueId].hydrateCollisionMeshFunction = hydrateCollisionMeshFunction;\r\n this._controllers[xrController.uniqueId].pickedPointVisualCue = this._generateVisualCue();\r\n }\r\n });\r\n\r\n if (this._attachedController) {\r\n if (\r\n !this._options.enableNearInteractionOnAllControllers &&\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.enableNearInteractionOnAllControllers) {\r\n this._attachedController = xrController.uniqueId;\r\n }\r\n }\r\n switch (xrController.inputSource.targetRayMode) {\r\n case \"tracked-pointer\":\r\n return this._attachNearInteractionMode(xrController);\r\n case \"gaze\":\r\n return null;\r\n case \"screen\":\r\n return null;\r\n }\r\n };\r\n\r\n private _controllers: {\r\n [controllerUniqueId: string]: ControllerData;\r\n } = {};\r\n private _scene: Scene;\r\n\r\n private _attachedController: string;\r\n\r\n private _farInteractionFeature: Nullable<WebXRControllerPointerSelection> = null;\r\n\r\n /**\r\n * The module's name\r\n */\r\n public static readonly Name = WebXRFeatureName.NEAR_INTERACTION;\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 * 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 * If set to true, the selection mesh will always be hidden. Otherwise it will be shown only when needed\r\n */\r\n public alwaysHideSelectionMesh: boolean = false;\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(\r\n _xrSessionManager: WebXRSessionManager,\r\n private readonly _options: IWebXRNearInteractionOptions\r\n ) {\r\n super(_xrSessionManager);\r\n this._scene = this._xrSessionManager.scene;\r\n if (this._options.nearInteractionControllerMode === undefined) {\r\n this._options.nearInteractionControllerMode = WebXRNearControllerMode.CENTERED_IN_FRONT;\r\n }\r\n\r\n if (this._options.farInteractionFeature) {\r\n this._farInteractionFeature = this._options.farInteractionFeature;\r\n }\r\n }\r\n\r\n /**\r\n * Attach this feature\r\n * Will usually be called by the features manager\r\n *\r\n * @returns true if successful.\r\n */\r\n public override attach(): boolean {\r\n if (!super.attach()) {\r\n return false;\r\n }\r\n\r\n for (const controller of this._options.xrInput.controllers) {\r\n this._attachController(controller);\r\n }\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 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 override detach(): boolean {\r\n if (!super.detach()) {\r\n return false;\r\n }\r\n\r\n const keys = Object.keys(this._controllers);\r\n for (const controllerId of keys) {\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 /**\r\n * This function sets webXRControllerPointerSelection feature that will be disabled when\r\n * the hover range is reached for a mesh and will be reattached when not in hover range.\r\n * This is used to remove the selection rays when moving.\r\n * @param farInteractionFeature the feature to disable when finger is in hover range for a mesh\r\n */\r\n public setFarInteractionFeature(farInteractionFeature: Nullable<WebXRControllerPointerSelection>) {\r\n this._farInteractionFeature = farInteractionFeature;\r\n }\r\n\r\n /**\r\n * Filter used for near interaction pick and hover\r\n * @param mesh the mesh candidate to be pick-filtered\r\n * @returns if the mesh should be included in the list of candidate meshes for near interaction\r\n */\r\n private _nearPickPredicate(mesh: AbstractMesh): boolean {\r\n return mesh.isEnabled() && mesh.isVisible && mesh.isPickable && mesh.isNearPickable;\r\n }\r\n\r\n /**\r\n * Filter used for near interaction grab\r\n * @param mesh the mesh candidate to be pick-filtered\r\n * @returns if the mesh should be included in the list of candidate meshes for near interaction\r\n */\r\n private _nearGrabPredicate(mesh: AbstractMesh): boolean {\r\n return mesh.isEnabled() && mesh.isVisible && mesh.isPickable && mesh.isNearGrabbable;\r\n }\r\n\r\n /**\r\n * Filter used for any near interaction\r\n * @param mesh the mesh candidate to be pick-filtered\r\n * @returns if the mesh should be included in the list of candidate meshes for near interaction\r\n */\r\n private _nearInteractionPredicate(mesh: AbstractMesh): boolean {\r\n return mesh.isEnabled() && mesh.isVisible && mesh.isPickable && (mesh.isNearPickable || mesh.isNearGrabbable);\r\n }\r\n\r\n private _controllerAvailablePredicate(mesh: AbstractMesh, controllerId: string): boolean {\r\n let parent: TransformNode = mesh;\r\n\r\n while (parent) {\r\n if (parent.reservedDataStore && parent.reservedDataStore.nearInteraction && parent.reservedDataStore.nearInteraction.excludedControllerId === controllerId) {\r\n return false;\r\n }\r\n parent = parent.parent as TransformNode;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private _handleTransitionAnimation(controllerData: ControllerData, newState: ControllerOrbAnimationState) {\r\n if (\r\n controllerData.currentAnimationState === newState ||\r\n this._options.nearInteractionControllerMode !== WebXRNearControllerMode.CENTERED_IN_FRONT ||\r\n !!controllerData.xrController?.inputSource.hand\r\n ) {\r\n return;\r\n }\r\n\r\n // Don't always break to allow for animation fallthrough on rare cases of multi-transitions\r\n if (newState > controllerData.currentAnimationState) {\r\n switch (controllerData.currentAnimationState) {\r\n case ControllerOrbAnimationState.DEHYDRATED: {\r\n controllerData.hydrateCollisionMeshFunction(true);\r\n if (newState === ControllerOrbAnimationState.HOVER) {\r\n break;\r\n }\r\n }\r\n // eslint-disable-next-line no-fallthrough\r\n case ControllerOrbAnimationState.HOVER: {\r\n controllerData.touchCollisionMeshFunction(true);\r\n if (newState === ControllerOrbAnimationState.TOUCH) {\r\n break;\r\n }\r\n }\r\n }\r\n } else {\r\n switch (controllerData.currentAnimationState) {\r\n case ControllerOrbAnimationState.TOUCH: {\r\n controllerData.touchCollisionMeshFunction(false);\r\n if (newState === ControllerOrbAnimationState.HOVER) {\r\n break;\r\n }\r\n }\r\n // eslint-disable-next-line no-fallthrough\r\n case ControllerOrbAnimationState.HOVER: {\r\n controllerData.hydrateCollisionMeshFunction(false);\r\n if (newState === ControllerOrbAnimationState.DEHYDRATED) {\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n controllerData.currentAnimationState = newState;\r\n }\r\n\r\n private readonly _hoverRadius = 0.1;\r\n private readonly _pickRadius = 0.02;\r\n private readonly _controllerPickRadius = 0.03; // The radius is slightly larger here to make it easier to manipulate since it's not tied to the hand position\r\n private readonly _nearGrabLengthScale = 5;\r\n\r\n private _processTouchPoint(id: string, position: Vector3, orientation: Quaternion) {\r\n const controllerData = this._controllers[id];\r\n\r\n // Position and orientation could be temporary values, se we take care of them before calling any functions that use temporary vectors/quaternions\r\n controllerData.grabRay.origin.copyFrom(position);\r\n orientation.toEulerAnglesToRef(TmpVectors.Vector3[0]);\r\n controllerData.grabRay.direction.copyFrom(TmpVectors.Vector3[0]);\r\n\r\n if (this._options.nearInteractionControllerMode === WebXRNearControllerMode.CENTERED_IN_FRONT && !controllerData.xrController?.inputSource.hand) {\r\n // offset the touch point in the direction the transform is facing\r\n controllerData.xrController!.getWorldPointerRayToRef(this._tmpRay);\r\n controllerData.grabRay.origin.addInPlace(this._tmpRay.direction.scale(0.05));\r\n }\r\n\r\n controllerData.grabRay.length = this._nearGrabLengthScale * this._hoverRadius * this._xrSessionManager.worldScalingFactor;\r\n controllerData.touchCollisionMesh.position.copyFrom(controllerData.grabRay.origin).scaleInPlace(this._xrSessionManager.worldScalingFactor);\r\n }\r\n\r\n protected _onXRFrame(_xrFrame: XRFrame) {\r\n const keys = Object.keys(this._controllers);\r\n for (const id of keys) {\r\n // only do this for the selected pointer\r\n const controllerData = this._controllers[id];\r\n const handData = controllerData.xrController?.inputSource.hand;\r\n // If near interaction is not enabled/available for this controller, return early\r\n if (\r\n (!this._options.enableNearInteractionOnAllControllers && id !== this._attachedController) ||\r\n !controllerData.xrController ||\r\n (!handData && (!this._options.nearInteractionControllerMode || !controllerData.xrController.inputSource.gamepad))\r\n ) {\r\n controllerData.pick = null;\r\n return;\r\n }\r\n controllerData.hoverInteraction = false;\r\n controllerData.nearInteraction = false;\r\n\r\n // Every frame check collisions/input\r\n if (controllerData.xrController) {\r\n if (handData) {\r\n const xrIndexTip = handData.get(\"index-finger-tip\");\r\n if (xrIndexTip) {\r\n const indexTipPose = _xrFrame.getJointPose!(xrIndexTip, this._xrSessionManager.referenceSpace);\r\n if (indexTipPose && indexTipPose.transform) {\r\n const axisRHSMultiplier = this._scene.useRightHandedSystem ? 1 : -1;\r\n TmpVectors.Vector3[0].set(indexTipPose.transform.position.x, indexTipPose.transform.position.y, indexTipPose.transform.position.z * axisRHSMultiplier);\r\n TmpVectors.Quaternion[0].set(\r\n indexTipPose.transform.orientation.x,\r\n indexTipPose.transform.orientation.y,\r\n indexTipPose.transform.orientation.z * axisRHSMultiplier,\r\n indexTipPose.transform.orientation.w * axisRHSMultiplier\r\n );\r\n\r\n this._processTouchPoint(id, TmpVectors.Vector3[0], TmpVectors.Quaternion[0]);\r\n }\r\n }\r\n } else if (controllerData.xrController.inputSource.gamepad && this._options.nearInteractionControllerMode !== WebXRNearControllerMode.DISABLED) {\r\n let controllerPose = controllerData.xrController.pointer;\r\n if (controllerData.xrController.grip && this._options.nearInteractionControllerMode === WebXRNearControllerMode.CENTERED_ON_CONTROLLER) {\r\n controllerPose = controllerData.xrController.grip;\r\n }\r\n\r\n this._processTouchPoint(id, controllerPose.position, controllerPose.rotationQuaternion!);\r\n }\r\n } else {\r\n return;\r\n }\r\n\r\n const accuratePickInfo = (originalScenePick: Nullable<PickingInfo>, utilityScenePick: Nullable<PickingInfo>): Nullable<PickingInfo> => {\r\n let pick = null;\r\n if (!utilityScenePick || !utilityScenePick.hit) {\r\n // No hit in utility scene\r\n pick = originalScenePick;\r\n } else if (!originalScenePick || !originalScenePick.hit) {\r\n // No hit in original scene\r\n pick = utilityScenePick;\r\n } else if (utilityScenePick.distance < originalScenePick.distance) {\r\n // Hit is closer in utility scene\r\n pick = utilityScenePick;\r\n } else {\r\n // Hit is closer in original scene\r\n pick = originalScenePick;\r\n }\r\n return pick;\r\n };\r\n const populateNearInteractionInfo = (nearInteractionInfo: Nullable<PickingInfo>): PickingInfo => {\r\n let result = new PickingInfo();\r\n\r\n let nearInteractionAtOrigin = false;\r\n const nearInteraction = nearInteractionInfo && nearInteractionInfo.pickedPoint && nearInteractionInfo.hit;\r\n if (nearInteractionInfo?.pickedPoint) {\r\n nearInteractionAtOrigin = nearInteractionInfo.pickedPoint.x === 0 && nearInteractionInfo.pickedPoint.y === 0 && nearInteractionInfo.pickedPoint.z === 0;\r\n }\r\n if (nearInteraction && !nearInteractionAtOrigin) {\r\n result = nearInteractionInfo!;\r\n }\r\n return result;\r\n };\r\n\r\n // Don't perform touch logic while grabbing, to prevent triggering touch interactions while in the middle of a grab interaction\r\n // Dont update cursor logic either - the cursor should already be visible for the grab to be in range,\r\n // and in order to maintain its position on the target mesh it is parented for the duration of the grab.\r\n if (!controllerData.grabInteraction) {\r\n let pick = null;\r\n\r\n // near interaction hover\r\n let utilitySceneHoverPick = null;\r\n if (this._options.useUtilityLayer && this._utilityLayerScene) {\r\n utilitySceneHoverPick = this._pickWithSphere(\r\n controllerData,\r\n this._hoverRadius * this._xrSessionManager.worldScalingFactor,\r\n this._utilityLayerScene,\r\n (mesh: AbstractMesh) => this._nearInteractionPredicate(mesh)\r\n );\r\n }\r\n const originalSceneHoverPick = this._pickWithSphere(\r\n controllerData,\r\n this._hoverRadius * this._xrSessionManager.worldScalingFactor,\r\n this._scene,\r\n (mesh: AbstractMesh) => this._nearInteractionPredicate(mesh)\r\n );\r\n\r\n const hoverPickInfo = accuratePickInfo(originalSceneHoverPick, utilitySceneHoverPick);\r\n if (hoverPickInfo && hoverPickInfo.hit) {\r\n pick = populateNearInteractionInfo(hoverPickInfo);\r\n if (pick.hit) {\r\n controllerData.hoverInteraction = true;\r\n }\r\n }\r\n\r\n // near interaction pick\r\n if (controllerData.hoverInteraction) {\r\n let utilitySceneNearPick = null;\r\n const radius = (handData ? this._pickRadius : this._controllerPickRadius) * this._xrSessionManager.worldScalingFactor;\r\n if (this._options.useUtilityLayer && this._utilityLayerScene) {\r\n utilitySceneNearPick = this._pickWithSphere(controllerData, radius, this._utilityLayerScene, (mesh: AbstractMesh) => this._nearPickPredicate(mesh));\r\n }\r\n const originalSceneNearPick = this._pickWithSphere(controllerData, radius, this._scene, (mesh: AbstractMesh) => this._nearPickPredicate(mesh));\r\n const pickInfo = accuratePickInfo(originalSceneNearPick, utilitySceneNearPick);\r\n const nearPick = populateNearInteractionInfo(pickInfo);\r\n if (nearPick.hit) {\r\n // Near pick takes precedence over hover interaction\r\n pick = nearPick;\r\n controllerData.nearInteraction = true;\r\n }\r\n }\r\n\r\n controllerData.stalePick = controllerData.pick;\r\n controllerData.pick = pick;\r\n\r\n // Update mesh under pointer\r\n if (controllerData.pick && controllerData.pick.pickedPoint && controllerData.pick.hit) {\r\n controllerData.meshUnderPointer = controllerData.pick.pickedMesh;\r\n controllerData.pickedPointVisualCue.position.copyFrom(controllerData.pick.pickedPoint);\r\n controllerData.pickedPointVisualCue.isVisible = !this.alwaysHideSelectionMesh;\r\n\r\n if (this._farInteractionFeature && this._farInteractionFeature.attached) {\r\n this._farInteractionFeature._setPointerSelectionDisabledByPointerId(controllerData.id, true);\r\n }\r\n } else {\r\n controllerData.meshUnderPointer = null;\r\n controllerData.pickedPointVisualCue.isVisible = false;\r\n\r\n if (this._farInteractionFeature && this._farInteractionFeature.attached) {\r\n this._farInteractionFeature._setPointerSelectionDisabledByPointerId(controllerData.id, false);\r\n }\r\n }\r\n }\r\n\r\n // Update the interaction animation. Only updates if the visible touch mesh is active\r\n let state = ControllerOrbAnimationState.DEHYDRATED;\r\n if (controllerData.grabInteraction || controllerData.nearInteraction) {\r\n state = ControllerOrbAnimationState.TOUCH;\r\n } else if (controllerData.hoverInteraction) {\r\n state = ControllerOrbAnimationState.HOVER;\r\n }\r\n this._handleTransitionAnimation(controllerData, state);\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 _generateVisualCue() {\r\n const sceneToRenderTo = this._options.useUtilityLayer ? this._options.customUtilityLayerScene || UtilityLayerRenderer.DefaultUtilityLayer.utilityLayerScene : this._scene;\r\n const selectionMesh = CreateSphere(\r\n \"nearInteraction\",\r\n {\r\n diameter: 0.0035 * 3 * this._xrSessionManager.worldScalingFactor,\r\n },\r\n sceneToRenderTo\r\n );\r\n selectionMesh.bakeCurrentTransformIntoVertices();\r\n selectionMesh.isPickable = false;\r\n selectionMesh.isVisible = false;\r\n selectionMesh.rotationQuaternion = Quaternion.Identity();\r\n const 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 return selectionMesh;\r\n }\r\n\r\n private _isControllerReadyForNearInteraction(id: number) {\r\n if (this._farInteractionFeature) {\r\n return this._farInteractionFeature._getPointerSelectionDisabledByPointerId(id);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private _attachNearInteractionMode(xrController: WebXRInputSource) {\r\n const controllerData = this._controllers[xrController.uniqueId];\r\n const pointerEventInit: PointerEventInit = {\r\n pointerId: controllerData.id,\r\n pointerType: \"xr-near\",\r\n };\r\n controllerData.onFrameObserver = this._xrSessionManager.onXRFrameObservable.add(() => {\r\n if (\r\n (!this._options.enableNearInteractionOnAllControllers && xrController.uniqueId !== this._attachedController) ||\r\n !controllerData.xrController ||\r\n (!controllerData.xrController.inputSource.hand && (!this._options.nearInteractionControllerMode || !controllerData.xrController.inputSource.gamepad))\r\n ) {\r\n return;\r\n }\r\n if (controllerData.pick) {\r\n controllerData.pick.ray = controllerData.grabRay;\r\n }\r\n\r\n if (controllerData.pick && this._isControllerReadyForNearInteraction(controllerData.id)) {\r\n this._scene.simulatePointerMove(controllerData.pick, pointerEventInit);\r\n }\r\n\r\n // Near pick pointer event\r\n if (controllerData.nearInteraction && controllerData.pick && controllerData.pick.hit) {\r\n if (!controllerData.nearInteractionTargetMesh) {\r\n this._scene.simulatePointerDown(controllerData.pick, pointerEventInit);\r\n controllerData.nearInteractionTargetMesh = controllerData.meshUnderPointer;\r\n controllerData.downTriggered = true;\r\n }\r\n } else if (controllerData.nearInteractionTargetMesh && controllerData.stalePick) {\r\n this._scene.simulatePointerUp(controllerData.stalePick, pointerEventInit);\r\n controllerData.downTriggered = false;\r\n controllerData.nearInteractionTargetMesh = null;\r\n }\r\n });\r\n\r\n const grabCheck = (pressed: boolean) => {\r\n if (\r\n this._options.enableNearInteractionOnAllControllers ||\r\n (xrController.uniqueId === this._attachedController && this._isControllerReadyForNearInteraction(controllerData.id))\r\n ) {\r\n if (controllerData.pick) {\r\n controllerData.pick.ray = controllerData.grabRay;\r\n }\r\n if (pressed && controllerData.pick && controllerData.meshUnderPointer && this._nearGrabPredicate(controllerData.meshUnderPointer)) {\r\n controllerData.grabInteraction = true;\r\n controllerData.pickedPointVisualCue.isVisible = false;\r\n this._scene.simulatePointerDown(controllerData.pick, pointerEventInit);\r\n controllerData.downTriggered = true;\r\n } else if (!pressed && controllerData.pick && controllerData.grabInteraction) {\r\n this._scene.simulatePointerUp(controllerData.pick, pointerEventInit);\r\n controllerData.downTriggered = false;\r\n controllerData.grabInteraction = false;\r\n controllerData.pickedPointVisualCue.isVisible = !this.alwaysHideSelectionMesh;\r\n }\r\n } else {\r\n if (pressed && !this._options.enableNearInteractionOnAllControllers && !this._options.disableSwitchOnClick) {\r\n this._attachedController = xrController.uniqueId;\r\n }\r\n }\r\n };\r\n\r\n if (xrController.inputSource.gamepad) {\r\n const init = (motionController: WebXRAbstractMotionController) => {\r\n controllerData.squeezeComponent = motionController.getComponent(\"grasp\");\r\n if (controllerData.squeezeComponent) {\r\n controllerData.onSqueezeButtonChangedObserver = controllerData.squeezeComponent.onButtonStateChangedObservable.add((component) => {\r\n if (component.changes.pressed) {\r\n const pressed = component.changes.pressed.current;\r\n grabCheck(pressed);\r\n }\r\n });\r\n } else {\r\n controllerData.selectionComponent = motionController.getMainComponent();\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 grabCheck(pressed);\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 (\r\n controllerData.xrController &&\r\n event.inputSource === controllerData.xrController.inputSource &&\r\n controllerData.pick &&\r\n this._isControllerReadyForNearInteraction(controllerData.id) &&\r\n controllerData.meshUnderPointer &&\r\n this._nearGrabPredicate(controllerData.meshUnderPointer)\r\n ) {\r\n controllerData.grabInteraction = true;\r\n controllerData.pickedPointVisualCue.isVisible = false;\r\n this._scene.simulatePointerDown(controllerData.pick, pointerEventInit);\r\n controllerData.downTriggered = true;\r\n }\r\n };\r\n\r\n const selectEndListener = (event: XRInputSourceEvent) => {\r\n if (\r\n controllerData.xrController &&\r\n event.inputSource === controllerData.xrController.inputSource &&\r\n controllerData.pick &&\r\n this._isControllerReadyForNearInteraction(controllerData.id)\r\n ) {\r\n this._scene.simulatePointerUp(controllerData.pick, pointerEventInit);\r\n controllerData.grabInteraction = false;\r\n controllerData.pickedPointVisualCue.isVisible = !this.alwaysHideSelectionMesh;\r\n controllerData.downTriggered = false;\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 _detachController(xrControllerUniqueId: string) {\r\n const controllerData = this._controllers[xrControllerUniqueId];\r\n if (!controllerData) {\r\n return;\r\n }\r\n if (controllerData.squeezeComponent) {\r\n if (controllerData.onSqueezeButtonChangedObserver) {\r\n controllerData.squeezeComponent.onButtonStateChangedObservable.remove(controllerData.onSqueezeButtonChangedObserver);\r\n }\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 const keys = Object.keys(controllerData.eventListeners);\r\n for (const eventName of keys) {\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 as any);\r\n }\r\n }\r\n }\r\n controllerData.touchCollisionMesh.dispose();\r\n controllerData.pickedPointVisualCue.dispose();\r\n\r\n this._xrSessionManager.runInXRFrame(() => {\r\n if (!controllerData.downTriggered) {\r\n return;\r\n }\r\n // Fire a pointerup in case controller was detached before a pointerup event was fired\r\n const pointerEventInit: PointerEventInit = {\r\n pointerId: controllerData.id,\r\n pointerType: \"xr-near\",\r\n };\r\n this._scene.simulatePointerUp(new PickingInfo(), pointerEventInit);\r\n });\r\n\r\n // remove world scale observer\r\n if (controllerData._worldScaleObserver) {\r\n this._xrSessionManager.onWorldScaleFactorChangedObservable.remove(controllerData._worldScaleObserver);\r\n }\r\n\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 private _generateNewTouchPointMesh() {\r\n const worldScale = this._xrSessionManager.worldScalingFactor;\r\n // populate information for near hover, pick and pinch\r\n const meshCreationScene = this._options.useUtilityLayer ? this._options.customUtilityLayerScene || UtilityLayerRenderer.DefaultUtilityLayer.utilityLayerScene : this._scene;\r\n\r\n const touchCollisionMesh = CreateSphere(\"PickSphere\", { diameter: 1 * worldScale }, meshCreationScene);\r\n touchCollisionMesh.isVisible = false;\r\n\r\n // Generate the material for the touch mesh visuals\r\n if (this._options.motionControllerOrbMaterial) {\r\n touchCollisionMesh.material = this._options.motionControllerOrbMaterial;\r\n } else {\r\n let parsePromise: Promise<NodeMaterial>;\r\n if (this._options.motionControllerTouchMaterialSnippetUrl) {\r\n parsePromise = NodeMaterial.ParseFromFileAsync(\"motionControllerTouchMaterial\", this._options.motionControllerTouchMaterialSnippetUrl, meshCreationScene);\r\n } else {\r\n parsePromise = NodeMaterial.ParseFromSnippetAsync(\"8RUNKL#3\", meshCreationScene);\r\n }\r\n parsePromise\r\n // eslint-disable-next-line github/no-then\r\n .then((mat) => {\r\n touchCollisionMesh.material = mat;\r\n })\r\n // eslint-disable-next-line github/no-then\r\n .catch((err) => {\r\n Logger.Warn(`Error creating touch material in WebXRNearInteraction: ${err}`);\r\n });\r\n }\r\n\r\n const easingFunction = new QuadraticEase();\r\n easingFunction.setEasingMode(EasingFunction.EASINGMODE_EASEINOUT);\r\n\r\n // Adjust the visual size based off of the size of the touch collision orb.\r\n // Having the size perfectly match for hover gives a more accurate tell for when the user will start interacting with the target\r\n // Sizes for other states are somewhat arbitrary, as they are based on what feels nice during an interaction\r\n const hoverSizeVec = new Vector3(this._controllerPickRadius, this._controllerPickRadius, this._controllerPickRadius).scaleInPlace(worldScale);\r\n const touchSize = this._controllerPickRadius * (4 / 3);\r\n const touchSizeVec = new Vector3(touchSize, touchSize, touchSize).scaleInPlace(worldScale);\r\n const hydrateTransitionSize = this._controllerPickRadius * (7 / 6);\r\n const hydrateTransitionSizeVec = new Vector3(hydrateTransitionSize, hydrateTransitionSize, hydrateTransitionSize).scaleInPlace(worldScale);\r\n const touchHoverTransitionSize = this._controllerPickRadius * (4 / 5);\r\n const touchHoverTransitionSizeVec = new Vector3(touchHoverTransitionSize, touchHoverTransitionSize, touchHoverTransitionSize).scaleInPlace(worldScale);\r\n const hoverTouchTransitionSize = this._controllerPickRadius * (3 / 2);\r\n const hoverTouchTransitionSizeVec = new Vector3(hoverTouchTransitionSize, hoverTouchTransitionSize, hoverTouchTransitionSize).scaleInPlace(worldScale);\r\n\r\n const touchKeys = [\r\n { frame: 0, value: hoverSizeVec },\r\n { frame: 10, value: hoverTouchTransitionSizeVec },\r\n { frame: 18, value: touchSizeVec },\r\n ];\r\n const releaseKeys = [\r\n { frame: 0, value: touchSizeVec },\r\n { frame: 10, value: touchHoverTransitionSizeVec },\r\n { frame: 18, value: hoverSizeVec },\r\n ];\r\n const hydrateKeys = [\r\n { frame: 0, value: Vector3.ZeroReadOnly },\r\n { frame: 12, value: hydrateTransitionSizeVec },\r\n { frame: 15, value: hoverSizeVec },\r\n ];\r\n const dehydrateKeys = [\r\n { frame: 0, value: hoverSizeVec },\r\n { frame: 10, value: Vector3.ZeroReadOnly },\r\n { frame: 15, value: Vector3.ZeroReadOnly },\r\n ];\r\n\r\n const touchAction = new Animation(\"touch\", \"scaling\", 60, Animation.ANIMATIONTYPE_VECTOR3, Animation.ANIMATIONLOOPMODE_CONSTANT);\r\n const releaseAction = new Animation(\"release\", \"scaling\", 60, Animation.ANIMATIONTYPE_VECTOR3, Animation.ANIMATIONLOOPMODE_CONSTANT);\r\n const hydrateAction = new Animation(\"hydrate\", \"scaling\", 60, Animation.ANIMATIONTYPE_VECTOR3, Animation.ANIMATIONLOOPMODE_CONSTANT);\r\n const dehydrateAction = new Animation(\"dehydrate\", \"scaling\", 60, Animation.ANIMATIONTYPE_VECTOR3, Animation.ANIMATIONLOOPMODE_CONSTANT);\r\n\r\n touchAction.setEasingFunction(easingFunction);\r\n releaseAction.setEasingFunction(easingFunction);\r\n hydrateAction.setEasingFunction(easingFunction);\r\n dehydrateAction.setEasingFunction(easingFunction);\r\n\r\n touchAction.setKeys(touchKeys);\r\n releaseAction.setKeys(releaseKeys);\r\n hydrateAction.setKeys(hydrateKeys);\r\n dehydrateAction.setKeys(dehydrateKeys);\r\n\r\n const touchCollisionMeshFunction = (isTouch: boolean) => {\r\n const action = isTouch ? touchAction : releaseAction;\r\n meshCreationScene.beginDirectAnimation(touchCollisionMesh, [action], 0, 18, false, 1);\r\n };\r\n\r\n const hydrateCollisionMeshFunction = (isHydration: boolean) => {\r\n const action = isHydration ? hydrateAction : dehydrateAction;\r\n if (isHydration) {\r\n touchCollisionMesh.isVisible = true;\r\n }\r\n meshCreationScene.beginDirectAnimation(touchCollisionMesh, [action], 0, 15, false, 1, () => {\r\n if (!isHydration) {\r\n touchCollisionMesh.isVisible = false;\r\n }\r\n });\r\n };\r\n\r\n return { touchCollisionMesh, touchCollisionMeshFunction, hydrateCollisionMeshFunction };\r\n }\r\n\r\n private _pickWithSphere(controllerData: ControllerData, radius: number, sceneToUse: Scene, predicate: (mesh: AbstractMesh) => boolean): Nullable<PickingInfo> {\r\n const pickingInfo = new PickingInfo();\r\n pickingInfo.distance = +Infinity;\r\n\r\n if (controllerData.touchCollisionMesh && controllerData.xrController) {\r\n const position = controllerData.touchCollisionMesh.position;\r\n const sphere = BoundingSphere.CreateFromCenterAndRadius(position, radius);\r\n\r\n for (let meshIndex = 0; meshIndex < sceneToUse.meshes.length; meshIndex++) {\r\n const mesh = sceneToUse.meshes[meshIndex];\r\n if (!predicate(mesh) || !this._controllerAvailablePredicate(mesh, controllerData.xrController.uniqueId)) {\r\n continue;\r\n }\r\n const result = WebXRNearInteraction.PickMeshWithSphere(mesh, sphere);\r\n\r\n if (result && result.hit && result.distance < pickingInfo.distance) {\r\n pickingInfo.hit = result.hit;\r\n pickingInfo.pickedMesh = mesh;\r\n pickingInfo.pickedPoint = result.pickedPoint;\r\n pickingInfo.aimTransform = controllerData.xrController.pointer;\r\n pickingInfo.gripTransform = controllerData.xrController.grip || null;\r\n pickingInfo.originMesh = controllerData.touchCollisionMesh;\r\n pickingInfo.distance = result.distance;\r\n pickingInfo.bu = result.bu;\r\n pickingInfo.bv = result.bv;\r\n pickingInfo.faceId = result.faceId;\r\n pickingInfo.subMeshId = result.subMeshId;\r\n }\r\n }\r\n }\r\n return pickingInfo;\r\n }\r\n\r\n /**\r\n * Picks a mesh with a sphere\r\n * @param mesh the mesh to pick\r\n * @param sphere picking sphere in world coordinates\r\n * @param skipBoundingInfo a boolean indicating if we should skip the bounding info check\r\n * @returns the picking info\r\n */\r\n public static PickMeshWithSphere(mesh: AbstractMesh, sphere: BoundingSphere, skipBoundingInfo = false): PickingInfo {\r\n const subMeshes = mesh.subMeshes;\r\n const pi = new PickingInfo();\r\n const boundingInfo = mesh.getBoundingInfo();\r\n\r\n if (!mesh._generatePointsArray()) {\r\n return pi;\r\n }\r\n\r\n if (!mesh.subMeshes || !boundingInfo) {\r\n return pi;\r\n }\r\n\r\n if (!skipBoundingInfo && !BoundingSphere.Intersects(boundingInfo.boundingSphere, sphere)) {\r\n return pi;\r\n }\r\n\r\n const result = LocalTempVectors[0];\r\n const tmpVec = LocalTempVectors[1];\r\n LocalTempVectors[2].setAll(0);\r\n LocalTempVectors[3].setAll(0);\r\n\r\n const tmpRay = new Ray(LocalTempVectors[2], LocalTempVectors[3], 1);\r\n\r\n let distance = +Infinity;\r\n let tmp, tmpDistanceSphereToCenter, tmpDistanceSurfaceToCenter, intersectionInfo;\r\n const center = TmpVectors.Vector3[2];\r\n const worldToMesh = TmpVectors.Matrix[0];\r\n worldToMesh.copyFrom(mesh.getWorldMatrix());\r\n worldToMesh.invert();\r\n Vector3.TransformCoordinatesToRef(sphere.center, worldToMesh, center);\r\n\r\n for (let index = 0; index < subMeshes.length; index++) {\r\n const subMesh = subMeshes[index];\r\n\r\n subMesh.projectToRef(center, <Vector3[]>mesh._positions, <IndicesArray>mesh.getIndices(), tmpVec);\r\n\r\n Vector3.TransformCoordinatesToRef(tmpVec, mesh.getWorldMatrix(), tmpVec);\r\n tmp = Vector3.Distance(tmpVec, sphere.center);\r\n\r\n // Check for finger inside of mesh\r\n tmpDistanceSurfaceToCenter = Vector3.DistanceSquared(tmpVec, mesh.getAbsolutePosition());\r\n tmpDistanceSphereToCenter = Vector3.DistanceSquared(sphere.center, mesh.getAbsolutePosition());\r\n if (tmpDistanceSphereToCenter !== -1 && tmpDistanceSurfaceToCenter !== -1 && tmpDistanceSurfaceToCenter > tmpDistanceSphereToCenter) {\r\n tmp = 0;\r\n tmpVec.copyFrom(sphere.center);\r\n }\r\n\r\n if (tmp !== -1 && tmp < distance) {\r\n distance = tmp;\r\n\r\n // ray between the sphere center and the point on the mesh\r\n Ray.CreateFromToToRef(sphere.center, tmpVec, tmpRay);\r\n tmpRay.length = distance * 2;\r\n intersectionInfo = tmpRay.intersectsMesh(mesh);\r\n\r\n result.copyFrom(tmpVec);\r\n }\r\n }\r\n\r\n if (distance < sphere.radius) {\r\n pi.hit = true;\r\n pi.distance = distance;\r\n pi.pickedMesh = mesh;\r\n pi.pickedPoint = result.clone();\r\n if (intersectionInfo && intersectionInfo.bu !== null && intersectionInfo.bv !== null) {\r\n pi.faceId = intersectionInfo.faceId;\r\n pi.subMeshId = intersectionInfo.subMeshId;\r\n pi.bu = intersectionInfo.bu;\r\n pi.bv = intersectionInfo.bv;\r\n }\r\n }\r\n\r\n return pi;\r\n }\r\n}\r\n\r\n//Register the plugin\r\nWebXRFeaturesManager.AddWebXRFeature(\r\n WebXRNearInteraction.Name,\r\n (xrSessionManager, options) => {\r\n return () => new WebXRNearInteraction(xrSessionManager, options);\r\n },\r\n WebXRNearInteraction.Version,\r\n true\r\n);\r\n"]}
@@ -89,9 +89,9 @@ export class WebXRPlaneDetector extends WebXRAbstractFeature {
89
89
  // eslint-disable-next-line @typescript-eslint/naming-convention
90
90
  async initiateRoomCapture() {
91
91
  if (this._xrSessionManager.session.initiateRoomCapture) {
92
- return this._xrSessionManager.session.initiateRoomCapture();
92
+ return await this._xrSessionManager.session.initiateRoomCapture();
93
93
  }
94
- return Promise.reject("initiateRoomCapture is not supported on this session");
94
+ throw "initiateRoomCapture is not supported on this session";
95
95
  }
96
96
  _onXRFrame(frame) {
97
97
  if (!this.attached || !this._enabled || !frame) {
@@ -1 +1 @@
1
- {"version":3,"file":"WebXRPlaneDetector.js","sourceRoot":"","sources":["../../../../../dev/core/src/XR/features/WebXRPlaneDetector.ts"],"names":[],"mappings":"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","sourcesContent":["import { WebXRFeaturesManager, WebXRFeatureName } from \"../webXRFeaturesManager\";\r\nimport type { TransformNode } from \"../../Meshes/transformNode\";\r\nimport type { WebXRSessionManager } from \"../webXRSessionManager\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport { Vector3, Matrix } from \"../../Maths/math.vector\";\r\nimport { WebXRAbstractFeature } from \"./WebXRAbstractFeature\";\r\n\r\ndeclare const XRPlane: XRPlane;\r\n\r\n/**\r\n * Options used in the plane detector module\r\n */\r\nexport interface IWebXRPlaneDetectorOptions {\r\n /**\r\n * The node to use to transform the local results to world coordinates\r\n */\r\n worldParentNode?: TransformNode;\r\n /**\r\n * If set to true a reference of the created planes will be kept until the next session starts\r\n * If not defined, planes will be removed from the array when the feature is detached or the session ended.\r\n */\r\n doNotRemovePlanesOnSessionEnded?: boolean;\r\n /**\r\n * Preferred detector configuration, not all preferred options will be supported by all platforms.\r\n */\r\n preferredDetectorOptions?: XRGeometryDetectorOptions;\r\n}\r\n\r\n/**\r\n * A babylon interface for a WebXR plane.\r\n * A Plane is actually a polygon, built from N points in space\r\n *\r\n * Supported in chrome 79, not supported in canary 81 ATM\r\n */\r\nexport interface IWebXRPlane {\r\n /**\r\n * a babylon-assigned ID for this polygon\r\n */\r\n id: number;\r\n /**\r\n * an array of vector3 points in babylon space. right/left hand system is taken into account.\r\n */\r\n polygonDefinition: Array<Vector3>;\r\n /**\r\n * A transformation matrix to apply on the mesh that will be built using the polygonDefinition\r\n * Local vs. World are decided if worldParentNode was provided or not in the options when constructing the module\r\n */\r\n transformationMatrix: Matrix;\r\n /**\r\n * the native xr-plane object\r\n */\r\n xrPlane: XRPlane;\r\n}\r\n\r\nlet PlaneIdProvider = 0;\r\n\r\n/**\r\n * The plane detector is used to detect planes in the real world when in AR\r\n * For more information see https://github.com/immersive-web/real-world-geometry/\r\n */\r\nexport class WebXRPlaneDetector extends WebXRAbstractFeature {\r\n private _detectedPlanes: Array<IWebXRPlane> = [];\r\n private _enabled: boolean = false;\r\n private _lastFrameDetected: XRPlaneSet = new Set();\r\n\r\n /**\r\n * The module's name\r\n */\r\n public static readonly Name = WebXRFeatureName.PLANE_DETECTION;\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 * Observers registered here will be executed when a new plane was added to the session\r\n */\r\n public onPlaneAddedObservable: Observable<IWebXRPlane> = new Observable();\r\n /**\r\n * Observers registered here will be executed when a plane is no longer detected in the session\r\n */\r\n public onPlaneRemovedObservable: Observable<IWebXRPlane> = new Observable();\r\n /**\r\n * Observers registered here will be executed when an existing plane updates (for example - expanded)\r\n * This can execute N times every frame\r\n */\r\n public onPlaneUpdatedObservable: Observable<IWebXRPlane> = new Observable();\r\n\r\n /**\r\n * construct a new Plane Detector\r\n * @param _xrSessionManager an instance of xr Session manager\r\n * @param _options configuration to use when constructing this feature\r\n */\r\n constructor(\r\n _xrSessionManager: WebXRSessionManager,\r\n private _options: IWebXRPlaneDetectorOptions = {}\r\n ) {\r\n super(_xrSessionManager);\r\n this.xrNativeFeatureName = \"plane-detection\";\r\n if (this._xrSessionManager.session) {\r\n this._init();\r\n } else {\r\n this._xrSessionManager.onXRSessionInit.addOnce(() => {\r\n this._init();\r\n });\r\n }\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 override detach(): boolean {\r\n if (!super.detach()) {\r\n return false;\r\n }\r\n\r\n if (!this._options.doNotRemovePlanesOnSessionEnded) {\r\n while (this._detectedPlanes.length) {\r\n const toRemove = this._detectedPlanes.pop();\r\n if (toRemove) {\r\n this.onPlaneRemovedObservable.notifyObservers(toRemove);\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Dispose this feature and all of the resources attached\r\n */\r\n public override dispose(): void {\r\n super.dispose();\r\n this.onPlaneAddedObservable.clear();\r\n this.onPlaneRemovedObservable.clear();\r\n this.onPlaneUpdatedObservable.clear();\r\n }\r\n\r\n /**\r\n * Check if the needed objects are defined.\r\n * This does not mean that the feature is enabled, but that the objects needed are well defined.\r\n * @returns true if the initial compatibility test passed\r\n */\r\n public override isCompatible(): boolean {\r\n return typeof XRPlane !== \"undefined\";\r\n }\r\n\r\n /**\r\n * Enable room capture mode.\r\n * When enabled and supported by the system,\r\n * the detectedPlanes array will be populated with the detected room boundaries\r\n * @see https://immersive-web.github.io/real-world-geometry/plane-detection.html#dom-xrsession-initiateroomcapture\r\n * @returns true if plane detection is enabled and supported. Will reject if not supported.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public async initiateRoomCapture(): Promise<void> {\r\n if (this._xrSessionManager.session.initiateRoomCapture) {\r\n return this._xrSessionManager.session.initiateRoomCapture();\r\n }\r\n return Promise.reject(\"initiateRoomCapture is not supported on this session\");\r\n }\r\n\r\n protected _onXRFrame(frame: XRFrame) {\r\n if (!this.attached || !this._enabled || !frame) {\r\n return;\r\n }\r\n\r\n const detectedPlanes = frame.detectedPlanes || frame.worldInformation?.detectedPlanes;\r\n if (detectedPlanes) {\r\n // remove all planes that are not currently detected in the frame\r\n for (let planeIdx = 0; planeIdx < this._detectedPlanes.length; planeIdx++) {\r\n const plane = this._detectedPlanes[planeIdx];\r\n if (!detectedPlanes.has(plane.xrPlane)) {\r\n this._detectedPlanes.splice(planeIdx--, 1);\r\n this.onPlaneRemovedObservable.notifyObservers(plane);\r\n }\r\n }\r\n\r\n // now check for new ones\r\n detectedPlanes.forEach((xrPlane) => {\r\n if (!this._lastFrameDetected.has(xrPlane)) {\r\n const newPlane: Partial<IWebXRPlane> = {\r\n id: PlaneIdProvider++,\r\n xrPlane: xrPlane,\r\n polygonDefinition: [],\r\n };\r\n const plane = this._updatePlaneWithXRPlane(xrPlane, newPlane, frame);\r\n this._detectedPlanes.push(plane);\r\n this.onPlaneAddedObservable.notifyObservers(plane);\r\n } else {\r\n // updated?\r\n if (xrPlane.lastChangedTime === this._xrSessionManager.currentTimestamp) {\r\n const index = this._findIndexInPlaneArray(xrPlane);\r\n const plane = this._detectedPlanes[index];\r\n this._updatePlaneWithXRPlane(xrPlane, plane, frame);\r\n this.onPlaneUpdatedObservable.notifyObservers(plane);\r\n }\r\n }\r\n });\r\n this._lastFrameDetected = detectedPlanes;\r\n }\r\n }\r\n\r\n private _init() {\r\n const internalInit = () => {\r\n this._enabled = true;\r\n if (this._detectedPlanes.length) {\r\n this._detectedPlanes.length = 0;\r\n }\r\n };\r\n\r\n // Only supported by BabylonNative\r\n if (!!this._xrSessionManager.isNative && !!this._options.preferredDetectorOptions && !!this._xrSessionManager.session.trySetPreferredPlaneDetectorOptions) {\r\n this._xrSessionManager.session.trySetPreferredPlaneDetectorOptions(this._options.preferredDetectorOptions);\r\n }\r\n\r\n if (!this._xrSessionManager.session.updateWorldTrackingState) {\r\n internalInit();\r\n return;\r\n }\r\n this._xrSessionManager.session.updateWorldTrackingState({ planeDetectionState: { enabled: true } });\r\n internalInit();\r\n }\r\n\r\n private _updatePlaneWithXRPlane(xrPlane: XRPlane, plane: Partial<IWebXRPlane>, xrFrame: XRFrame): IWebXRPlane {\r\n plane.polygonDefinition = xrPlane.polygon.map((xrPoint) => {\r\n const rightHandedSystem = this._xrSessionManager.scene.useRightHandedSystem ? 1 : -1;\r\n return new Vector3(xrPoint.x, xrPoint.y, xrPoint.z * rightHandedSystem);\r\n });\r\n // matrix\r\n const pose = xrFrame.getPose(xrPlane.planeSpace, this._xrSessionManager.referenceSpace);\r\n if (pose) {\r\n const mat = plane.transformationMatrix || new Matrix();\r\n Matrix.FromArrayToRef(pose.transform.matrix, 0, mat);\r\n if (!this._xrSessionManager.scene.useRightHandedSystem) {\r\n mat.toggleModelMatrixHandInPlace();\r\n }\r\n plane.transformationMatrix = mat;\r\n if (this._options.worldParentNode) {\r\n mat.multiplyToRef(this._options.worldParentNode.getWorldMatrix(), mat);\r\n }\r\n }\r\n\r\n return <IWebXRPlane>plane;\r\n }\r\n\r\n /**\r\n * avoiding using Array.find for global support.\r\n * @param xrPlane the plane to find in the array\r\n * @returns the index of the plane in the array or -1 if not found\r\n */\r\n private _findIndexInPlaneArray(xrPlane: XRPlane) {\r\n for (let i = 0; i < this._detectedPlanes.length; ++i) {\r\n if (this._detectedPlanes[i].xrPlane === xrPlane) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n }\r\n}\r\n\r\n//register the plugin\r\nWebXRFeaturesManager.AddWebXRFeature(\r\n WebXRPlaneDetector.Name,\r\n (xrSessionManager, options) => {\r\n return () => new WebXRPlaneDetector(xrSessionManager, options);\r\n },\r\n WebXRPlaneDetector.Version\r\n);\r\n"]}
1
+ {"version":3,"file":"WebXRPlaneDetector.js","sourceRoot":"","sources":["../../../../../dev/core/src/XR/features/WebXRPlaneDetector.ts"],"names":[],"mappings":"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","sourcesContent":["import { WebXRFeaturesManager, WebXRFeatureName } from \"../webXRFeaturesManager\";\r\nimport type { TransformNode } from \"../../Meshes/transformNode\";\r\nimport type { WebXRSessionManager } from \"../webXRSessionManager\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport { Vector3, Matrix } from \"../../Maths/math.vector\";\r\nimport { WebXRAbstractFeature } from \"./WebXRAbstractFeature\";\r\n\r\ndeclare const XRPlane: XRPlane;\r\n\r\n/**\r\n * Options used in the plane detector module\r\n */\r\nexport interface IWebXRPlaneDetectorOptions {\r\n /**\r\n * The node to use to transform the local results to world coordinates\r\n */\r\n worldParentNode?: TransformNode;\r\n /**\r\n * If set to true a reference of the created planes will be kept until the next session starts\r\n * If not defined, planes will be removed from the array when the feature is detached or the session ended.\r\n */\r\n doNotRemovePlanesOnSessionEnded?: boolean;\r\n /**\r\n * Preferred detector configuration, not all preferred options will be supported by all platforms.\r\n */\r\n preferredDetectorOptions?: XRGeometryDetectorOptions;\r\n}\r\n\r\n/**\r\n * A babylon interface for a WebXR plane.\r\n * A Plane is actually a polygon, built from N points in space\r\n *\r\n * Supported in chrome 79, not supported in canary 81 ATM\r\n */\r\nexport interface IWebXRPlane {\r\n /**\r\n * a babylon-assigned ID for this polygon\r\n */\r\n id: number;\r\n /**\r\n * an array of vector3 points in babylon space. right/left hand system is taken into account.\r\n */\r\n polygonDefinition: Array<Vector3>;\r\n /**\r\n * A transformation matrix to apply on the mesh that will be built using the polygonDefinition\r\n * Local vs. World are decided if worldParentNode was provided or not in the options when constructing the module\r\n */\r\n transformationMatrix: Matrix;\r\n /**\r\n * the native xr-plane object\r\n */\r\n xrPlane: XRPlane;\r\n}\r\n\r\nlet PlaneIdProvider = 0;\r\n\r\n/**\r\n * The plane detector is used to detect planes in the real world when in AR\r\n * For more information see https://github.com/immersive-web/real-world-geometry/\r\n */\r\nexport class WebXRPlaneDetector extends WebXRAbstractFeature {\r\n private _detectedPlanes: Array<IWebXRPlane> = [];\r\n private _enabled: boolean = false;\r\n private _lastFrameDetected: XRPlaneSet = new Set();\r\n\r\n /**\r\n * The module's name\r\n */\r\n public static readonly Name = WebXRFeatureName.PLANE_DETECTION;\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 * Observers registered here will be executed when a new plane was added to the session\r\n */\r\n public onPlaneAddedObservable: Observable<IWebXRPlane> = new Observable();\r\n /**\r\n * Observers registered here will be executed when a plane is no longer detected in the session\r\n */\r\n public onPlaneRemovedObservable: Observable<IWebXRPlane> = new Observable();\r\n /**\r\n * Observers registered here will be executed when an existing plane updates (for example - expanded)\r\n * This can execute N times every frame\r\n */\r\n public onPlaneUpdatedObservable: Observable<IWebXRPlane> = new Observable();\r\n\r\n /**\r\n * construct a new Plane Detector\r\n * @param _xrSessionManager an instance of xr Session manager\r\n * @param _options configuration to use when constructing this feature\r\n */\r\n constructor(\r\n _xrSessionManager: WebXRSessionManager,\r\n private _options: IWebXRPlaneDetectorOptions = {}\r\n ) {\r\n super(_xrSessionManager);\r\n this.xrNativeFeatureName = \"plane-detection\";\r\n if (this._xrSessionManager.session) {\r\n this._init();\r\n } else {\r\n this._xrSessionManager.onXRSessionInit.addOnce(() => {\r\n this._init();\r\n });\r\n }\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 override detach(): boolean {\r\n if (!super.detach()) {\r\n return false;\r\n }\r\n\r\n if (!this._options.doNotRemovePlanesOnSessionEnded) {\r\n while (this._detectedPlanes.length) {\r\n const toRemove = this._detectedPlanes.pop();\r\n if (toRemove) {\r\n this.onPlaneRemovedObservable.notifyObservers(toRemove);\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Dispose this feature and all of the resources attached\r\n */\r\n public override dispose(): void {\r\n super.dispose();\r\n this.onPlaneAddedObservable.clear();\r\n this.onPlaneRemovedObservable.clear();\r\n this.onPlaneUpdatedObservable.clear();\r\n }\r\n\r\n /**\r\n * Check if the needed objects are defined.\r\n * This does not mean that the feature is enabled, but that the objects needed are well defined.\r\n * @returns true if the initial compatibility test passed\r\n */\r\n public override isCompatible(): boolean {\r\n return typeof XRPlane !== \"undefined\";\r\n }\r\n\r\n /**\r\n * Enable room capture mode.\r\n * When enabled and supported by the system,\r\n * the detectedPlanes array will be populated with the detected room boundaries\r\n * @see https://immersive-web.github.io/real-world-geometry/plane-detection.html#dom-xrsession-initiateroomcapture\r\n * @returns true if plane detection is enabled and supported. Will reject if not supported.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public async initiateRoomCapture(): Promise<void> {\r\n if (this._xrSessionManager.session.initiateRoomCapture) {\r\n return await this._xrSessionManager.session.initiateRoomCapture();\r\n }\r\n throw \"initiateRoomCapture is not supported on this session\";\r\n }\r\n\r\n protected _onXRFrame(frame: XRFrame) {\r\n if (!this.attached || !this._enabled || !frame) {\r\n return;\r\n }\r\n\r\n const detectedPlanes = frame.detectedPlanes || frame.worldInformation?.detectedPlanes;\r\n if (detectedPlanes) {\r\n // remove all planes that are not currently detected in the frame\r\n for (let planeIdx = 0; planeIdx < this._detectedPlanes.length; planeIdx++) {\r\n const plane = this._detectedPlanes[planeIdx];\r\n if (!detectedPlanes.has(plane.xrPlane)) {\r\n this._detectedPlanes.splice(planeIdx--, 1);\r\n this.onPlaneRemovedObservable.notifyObservers(plane);\r\n }\r\n }\r\n\r\n // now check for new ones\r\n detectedPlanes.forEach((xrPlane) => {\r\n if (!this._lastFrameDetected.has(xrPlane)) {\r\n const newPlane: Partial<IWebXRPlane> = {\r\n id: PlaneIdProvider++,\r\n xrPlane: xrPlane,\r\n polygonDefinition: [],\r\n };\r\n const plane = this._updatePlaneWithXRPlane(xrPlane, newPlane, frame);\r\n this._detectedPlanes.push(plane);\r\n this.onPlaneAddedObservable.notifyObservers(plane);\r\n } else {\r\n // updated?\r\n if (xrPlane.lastChangedTime === this._xrSessionManager.currentTimestamp) {\r\n const index = this._findIndexInPlaneArray(xrPlane);\r\n const plane = this._detectedPlanes[index];\r\n this._updatePlaneWithXRPlane(xrPlane, plane, frame);\r\n this.onPlaneUpdatedObservable.notifyObservers(plane);\r\n }\r\n }\r\n });\r\n this._lastFrameDetected = detectedPlanes;\r\n }\r\n }\r\n\r\n private _init() {\r\n const internalInit = () => {\r\n this._enabled = true;\r\n if (this._detectedPlanes.length) {\r\n this._detectedPlanes.length = 0;\r\n }\r\n };\r\n\r\n // Only supported by BabylonNative\r\n if (!!this._xrSessionManager.isNative && !!this._options.preferredDetectorOptions && !!this._xrSessionManager.session.trySetPreferredPlaneDetectorOptions) {\r\n this._xrSessionManager.session.trySetPreferredPlaneDetectorOptions(this._options.preferredDetectorOptions);\r\n }\r\n\r\n if (!this._xrSessionManager.session.updateWorldTrackingState) {\r\n internalInit();\r\n return;\r\n }\r\n this._xrSessionManager.session.updateWorldTrackingState({ planeDetectionState: { enabled: true } });\r\n internalInit();\r\n }\r\n\r\n private _updatePlaneWithXRPlane(xrPlane: XRPlane, plane: Partial<IWebXRPlane>, xrFrame: XRFrame): IWebXRPlane {\r\n plane.polygonDefinition = xrPlane.polygon.map((xrPoint) => {\r\n const rightHandedSystem = this._xrSessionManager.scene.useRightHandedSystem ? 1 : -1;\r\n return new Vector3(xrPoint.x, xrPoint.y, xrPoint.z * rightHandedSystem);\r\n });\r\n // matrix\r\n const pose = xrFrame.getPose(xrPlane.planeSpace, this._xrSessionManager.referenceSpace);\r\n if (pose) {\r\n const mat = plane.transformationMatrix || new Matrix();\r\n Matrix.FromArrayToRef(pose.transform.matrix, 0, mat);\r\n if (!this._xrSessionManager.scene.useRightHandedSystem) {\r\n mat.toggleModelMatrixHandInPlace();\r\n }\r\n plane.transformationMatrix = mat;\r\n if (this._options.worldParentNode) {\r\n mat.multiplyToRef(this._options.worldParentNode.getWorldMatrix(), mat);\r\n }\r\n }\r\n\r\n return <IWebXRPlane>plane;\r\n }\r\n\r\n /**\r\n * avoiding using Array.find for global support.\r\n * @param xrPlane the plane to find in the array\r\n * @returns the index of the plane in the array or -1 if not found\r\n */\r\n private _findIndexInPlaneArray(xrPlane: XRPlane) {\r\n for (let i = 0; i < this._detectedPlanes.length; ++i) {\r\n if (this._detectedPlanes[i].xrPlane === xrPlane) {\r\n return i;\r\n }\r\n }\r\n return -1;\r\n }\r\n}\r\n\r\n//register the plugin\r\nWebXRFeaturesManager.AddWebXRFeature(\r\n WebXRPlaneDetector.Name,\r\n (xrSessionManager, options) => {\r\n return () => new WebXRPlaneDetector(xrSessionManager, options);\r\n },\r\n WebXRPlaneDetector.Version\r\n);\r\n"]}
@@ -153,7 +153,7 @@ export class WebXRAbstractMotionController {
153
153
  else {
154
154
  loadingParams = this._getFilenameAndPath();
155
155
  }
156
- return new Promise((resolve, reject) => {
156
+ return await new Promise((resolve, reject) => {
157
157
  const meshesLoaded = (meshes) => {
158
158
  if (useGeneric) {
159
159
  this._getGenericParentMesh(meshes);
@@ -191,6 +191,7 @@ export class WebXRAbstractMotionController {
191
191
  }, null, (_scene, message) => {
192
192
  Logger.Log(message);
193
193
  Logger.Warn(`Failed to retrieve controller model of type ${this.profileId} from the remote server: ${loadingParams.path}${loadingParams.filename}`);
194
+ // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors
194
195
  reject(message);
195
196
  });
196
197
  });
@@ -224,7 +225,7 @@ export class WebXRAbstractMotionController {
224
225
  // eslint-disable-next-line @typescript-eslint/naming-convention
225
226
  async pulse(value, duration, hapticActuatorIndex = 0) {
226
227
  if (this.gamepadObject.hapticActuators && this.gamepadObject.hapticActuators[hapticActuatorIndex]) {
227
- return this.gamepadObject.hapticActuators[hapticActuatorIndex].pulse(value, duration);
228
+ return await this.gamepadObject.hapticActuators[hapticActuatorIndex].pulse(value, duration);
228
229
  }
229
230
  else {
230
231
  return false;