@babylonjs/core 8.3.0 → 8.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (331) hide show
  1. package/Animations/animation.d.ts +4 -0
  2. package/Animations/animation.js +22 -13
  3. package/Animations/animation.js.map +1 -1
  4. package/Animations/animation.optimizations.d.ts +31 -0
  5. package/Animations/animation.optimizations.js +41 -0
  6. package/Animations/animation.optimizations.js.map +1 -0
  7. package/Animations/index.d.ts +1 -0
  8. package/Animations/index.js +1 -0
  9. package/Animations/index.js.map +1 -1
  10. package/Animations/pathCursor.js +3 -1
  11. package/Animations/pathCursor.js.map +1 -1
  12. package/Animations/runtimeAnimation.d.ts +3 -1
  13. package/Animations/runtimeAnimation.js +127 -116
  14. package/Animations/runtimeAnimation.js.map +1 -1
  15. package/Audio/audioSceneComponent.js +4 -4
  16. package/Audio/audioSceneComponent.js.map +1 -1
  17. package/Behaviors/Meshes/attachToBoxBehavior.js +6 -6
  18. package/Behaviors/Meshes/attachToBoxBehavior.js.map +1 -1
  19. package/Behaviors/Meshes/fadeInOutBehavior.js +3 -2
  20. package/Behaviors/Meshes/fadeInOutBehavior.js.map +1 -1
  21. package/Behaviors/Meshes/multiPointerScaleBehavior.js +6 -4
  22. package/Behaviors/Meshes/multiPointerScaleBehavior.js.map +1 -1
  23. package/Behaviors/Meshes/sixDofDragBehavior.js +3 -2
  24. package/Behaviors/Meshes/sixDofDragBehavior.js.map +1 -1
  25. package/Bones/skeleton.js +6 -6
  26. package/Bones/skeleton.js.map +1 -1
  27. package/Cameras/Inputs/followCameraKeyboardMoveInput.js +2 -2
  28. package/Cameras/Inputs/followCameraKeyboardMoveInput.js.map +1 -1
  29. package/Cameras/VR/vrExperienceHelper.js +2 -2
  30. package/Cameras/VR/vrExperienceHelper.js.map +1 -1
  31. package/Cameras/arcRotateCamera.js +6 -2
  32. package/Cameras/arcRotateCamera.js.map +1 -1
  33. package/Cameras/camera.js +2 -2
  34. package/Cameras/camera.js.map +1 -1
  35. package/Cameras/deviceOrientationCamera.js +3 -2
  36. package/Cameras/deviceOrientationCamera.js.map +1 -1
  37. package/Collisions/gpuPicker.d.ts +1 -0
  38. package/Collisions/gpuPicker.js +9 -0
  39. package/Collisions/gpuPicker.js.map +1 -1
  40. package/Debug/axesViewer.js +3 -2
  41. package/Debug/axesViewer.js.map +1 -1
  42. package/Debug/directionalLightFrustumViewer.js +4 -4
  43. package/Debug/directionalLightFrustumViewer.js.map +1 -1
  44. package/Debug/physicsViewer.js +7 -6
  45. package/Debug/physicsViewer.js.map +1 -1
  46. package/Debug/skeletonViewer.js +4 -4
  47. package/Debug/skeletonViewer.js.map +1 -1
  48. package/Engines/Native/nativeInterfaces.d.ts +6 -7
  49. package/Engines/Native/nativeInterfaces.js.map +1 -1
  50. package/Engines/Processors/shaderCodeNode.js +2 -2
  51. package/Engines/Processors/shaderCodeNode.js.map +1 -1
  52. package/Engines/abstractEngine.d.ts +1 -0
  53. package/Engines/abstractEngine.js +14 -8
  54. package/Engines/abstractEngine.js.map +1 -1
  55. package/Engines/constants.d.ts +27 -5
  56. package/Engines/constants.js +27 -5
  57. package/Engines/constants.js.map +1 -1
  58. package/Engines/engine.js +8 -8
  59. package/Engines/engine.js.map +1 -1
  60. package/Engines/nativeEngine.js +13 -27
  61. package/Engines/nativeEngine.js.map +1 -1
  62. package/Engines/webgpuEngine.js +6 -2
  63. package/Engines/webgpuEngine.js.map +1 -1
  64. package/FlowGraph/Blocks/Data/Transformers/flowGraphJsonPointerParserBlock.js +2 -2
  65. package/FlowGraph/Blocks/Data/Transformers/flowGraphJsonPointerParserBlock.js.map +1 -1
  66. package/FlowGraph/Blocks/Data/flowGraphDataSwitchBlock.js +3 -2
  67. package/FlowGraph/Blocks/Data/flowGraphDataSwitchBlock.js.map +1 -1
  68. package/FlowGraph/Blocks/Event/flowGraphReceiveCustomEventBlock.js +3 -2
  69. package/FlowGraph/Blocks/Event/flowGraphReceiveCustomEventBlock.js.map +1 -1
  70. package/FlowGraph/Blocks/Event/flowGraphSendCustomEventBlock.js +2 -2
  71. package/FlowGraph/Blocks/Event/flowGraphSendCustomEventBlock.js.map +1 -1
  72. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphSwitchBlock.js +3 -2
  73. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphSwitchBlock.js.map +1 -1
  74. package/FlowGraph/flowGraphAsyncExecutionBlock.js +5 -3
  75. package/FlowGraph/flowGraphAsyncExecutionBlock.js.map +1 -1
  76. package/FlowGraph/flowGraphBlock.js +3 -2
  77. package/FlowGraph/flowGraphBlock.js.map +1 -1
  78. package/FlowGraph/flowGraphCoordinator.js +10 -6
  79. package/FlowGraph/flowGraphCoordinator.js.map +1 -1
  80. package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.js +2 -2
  81. package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.js.map +1 -1
  82. package/FrameGraph/Node/nodeRenderGraphBlock.js +5 -4
  83. package/FrameGraph/Node/nodeRenderGraphBlock.js.map +1 -1
  84. package/FrameGraph/Tasks/PostProcesses/depthOfFieldMergeTask.js +4 -3
  85. package/FrameGraph/Tasks/PostProcesses/depthOfFieldMergeTask.js.map +1 -1
  86. package/Gamepads/gamepadManager.js +2 -2
  87. package/Gamepads/gamepadManager.js.map +1 -1
  88. package/Gizmos/axisDragGizmo.js +3 -2
  89. package/Gizmos/axisDragGizmo.js.map +1 -1
  90. package/Gizmos/axisScaleGizmo.js +6 -4
  91. package/Gizmos/axisScaleGizmo.js.map +1 -1
  92. package/Gizmos/boundingBoxGizmo.js +28 -26
  93. package/Gizmos/boundingBoxGizmo.js.map +1 -1
  94. package/Gizmos/cameraGizmo.js +6 -3
  95. package/Gizmos/cameraGizmo.js.map +1 -1
  96. package/Gizmos/gizmo.js +11 -10
  97. package/Gizmos/gizmo.js.map +1 -1
  98. package/Gizmos/gizmoManager.js +16 -12
  99. package/Gizmos/gizmoManager.js.map +1 -1
  100. package/Gizmos/lightGizmo.js +3 -2
  101. package/Gizmos/lightGizmo.js.map +1 -1
  102. package/Gizmos/planeDragGizmo.js +3 -2
  103. package/Gizmos/planeDragGizmo.js.map +1 -1
  104. package/Gizmos/planeRotationGizmo.js +3 -2
  105. package/Gizmos/planeRotationGizmo.js.map +1 -1
  106. package/Gizmos/positionGizmo.js +41 -28
  107. package/Gizmos/positionGizmo.js.map +1 -1
  108. package/Gizmos/rotationGizmo.js +26 -18
  109. package/Gizmos/rotationGizmo.js.map +1 -1
  110. package/Gizmos/scaleGizmo.js +47 -32
  111. package/Gizmos/scaleGizmo.js.map +1 -1
  112. package/Layers/effectLayerSceneComponent.js +4 -4
  113. package/Layers/effectLayerSceneComponent.js.map +1 -1
  114. package/Layers/layerSceneComponent.js +4 -4
  115. package/Layers/layerSceneComponent.js.map +1 -1
  116. package/LensFlares/lensFlareSystemSceneComponent.js +4 -4
  117. package/LensFlares/lensFlareSystemSceneComponent.js.map +1 -1
  118. package/Lights/Shadows/shadowGenerator.js +3 -3
  119. package/Lights/Shadows/shadowGenerator.js.map +1 -1
  120. package/Lights/light.js +4 -4
  121. package/Lights/light.js.map +1 -1
  122. package/Loading/Plugins/babylonFileLoader.js +54 -46
  123. package/Loading/Plugins/babylonFileLoader.js.map +1 -1
  124. package/Loading/loadingScreen.js +4 -3
  125. package/Loading/loadingScreen.js.map +1 -1
  126. package/Loading/sceneLoader.js +15 -12
  127. package/Loading/sceneLoader.js.map +1 -1
  128. package/Materials/Node/Blocks/Dual/currentScreenBlock.js +9 -3
  129. package/Materials/Node/Blocks/Dual/currentScreenBlock.js.map +1 -1
  130. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js +11 -0
  131. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js.map +1 -1
  132. package/Materials/Node/Blocks/Input/inputBlock.js +18 -31
  133. package/Materials/Node/Blocks/Input/inputBlock.js.map +1 -1
  134. package/Materials/Node/Blocks/baseMathBlock.js +3 -1
  135. package/Materials/Node/Blocks/baseMathBlock.js.map +1 -1
  136. package/Materials/Node/Blocks/customBlock.js +53 -43
  137. package/Materials/Node/Blocks/customBlock.js.map +1 -1
  138. package/Materials/Node/Enums/nodeMaterialModes.d.ts +3 -1
  139. package/Materials/Node/Enums/nodeMaterialModes.js +2 -0
  140. package/Materials/Node/Enums/nodeMaterialModes.js.map +1 -1
  141. package/Materials/Node/nodeMaterial.d.ts +5 -0
  142. package/Materials/Node/nodeMaterial.js +33 -20
  143. package/Materials/Node/nodeMaterial.js.map +1 -1
  144. package/Materials/Node/nodeMaterialBlock.js +7 -4
  145. package/Materials/Node/nodeMaterialBlock.js.map +1 -1
  146. package/Materials/Node/nodeMaterialBuildState.d.ts +13 -2
  147. package/Materials/Node/nodeMaterialBuildState.js +72 -7
  148. package/Materials/Node/nodeMaterialBuildState.js.map +1 -1
  149. package/Materials/Node/nodeMaterialDefault.d.ts +5 -0
  150. package/Materials/Node/nodeMaterialDefault.js +28 -0
  151. package/Materials/Node/nodeMaterialDefault.js.map +1 -1
  152. package/Materials/Textures/cubeTexture.js +3 -1
  153. package/Materials/Textures/cubeTexture.js.map +1 -1
  154. package/Materials/Textures/videoTexture.js +5 -4
  155. package/Materials/Textures/videoTexture.js.map +1 -1
  156. package/Materials/materialDefines.js +3 -1
  157. package/Materials/materialDefines.js.map +1 -1
  158. package/Materials/multiMaterial.js +3 -1
  159. package/Materials/multiMaterial.js.map +1 -1
  160. package/Materials/shaderMaterial.js +3 -2
  161. package/Materials/shaderMaterial.js.map +1 -1
  162. package/Meshes/Compression/dracoEncoder.js +2 -2
  163. package/Meshes/Compression/dracoEncoder.js.map +1 -1
  164. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js +8 -8
  165. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js.map +1 -1
  166. package/Meshes/GreasedLine/greasedLineMesh.js +6 -6
  167. package/Meshes/GreasedLine/greasedLineMesh.js.map +1 -1
  168. package/Meshes/GreasedLine/greasedLineRibbonMesh.js +4 -3
  169. package/Meshes/GreasedLine/greasedLineRibbonMesh.js.map +1 -1
  170. package/Meshes/Node/Blocks/mathBlock.js +3 -1
  171. package/Meshes/Node/Blocks/mathBlock.js.map +1 -1
  172. package/Meshes/Node/nodeGeometryBlock.js +8 -5
  173. package/Meshes/Node/nodeGeometryBlock.js.map +1 -1
  174. package/Meshes/abstractMesh.js +2 -2
  175. package/Meshes/abstractMesh.js.map +1 -1
  176. package/Meshes/geodesicMesh.js +2 -2
  177. package/Meshes/geodesicMesh.js.map +1 -1
  178. package/Meshes/mesh.js +6 -6
  179. package/Meshes/mesh.js.map +1 -1
  180. package/Meshes/mesh.vertexData.functions.js +11 -10
  181. package/Meshes/mesh.vertexData.functions.js.map +1 -1
  182. package/Meshes/mesh.vertexData.subdivide.js +10 -10
  183. package/Meshes/mesh.vertexData.subdivide.js.map +1 -1
  184. package/Meshes/meshSimplification.js +10 -10
  185. package/Meshes/meshSimplification.js.map +1 -1
  186. package/Meshes/meshUtils.js +6 -3
  187. package/Meshes/meshUtils.js.map +1 -1
  188. package/Meshes/polygonMesh.js +10 -10
  189. package/Meshes/polygonMesh.js.map +1 -1
  190. package/Misc/PerformanceViewer/performanceViewerCollector.js +4 -4
  191. package/Misc/PerformanceViewer/performanceViewerCollector.js.map +1 -1
  192. package/Misc/arrayTools.js +2 -2
  193. package/Misc/arrayTools.js.map +1 -1
  194. package/Misc/asyncLock.js +9 -9
  195. package/Misc/asyncLock.js.map +1 -1
  196. package/Misc/basis.js +4 -2
  197. package/Misc/basis.js.map +1 -1
  198. package/Misc/deepCopier.js +3 -2
  199. package/Misc/deepCopier.js.map +1 -1
  200. package/Misc/deepMerger.js +3 -2
  201. package/Misc/deepMerger.js.map +1 -1
  202. package/Misc/fileTools.js +4 -4
  203. package/Misc/fileTools.js.map +1 -1
  204. package/Misc/greasedLineTools.js +14 -13
  205. package/Misc/greasedLineTools.js.map +1 -1
  206. package/Misc/logger.js +3 -2
  207. package/Misc/logger.js.map +1 -1
  208. package/Misc/observable.extensions.js +4 -4
  209. package/Misc/observable.extensions.js.map +1 -1
  210. package/Misc/sceneSerializer.js +5 -4
  211. package/Misc/sceneSerializer.js.map +1 -1
  212. package/Misc/snapshotRenderingHelper.js +3 -1
  213. package/Misc/snapshotRenderingHelper.js.map +1 -1
  214. package/Misc/tags.js +2 -2
  215. package/Misc/tags.js.map +1 -1
  216. package/Misc/trajectoryClassifier.js +8 -8
  217. package/Misc/trajectoryClassifier.js.map +1 -1
  218. package/Particles/IParticleSystem.d.ts +1 -1
  219. package/Particles/IParticleSystem.js.map +1 -1
  220. package/Particles/baseParticleSystem.d.ts +11 -3
  221. package/Particles/baseParticleSystem.js +37 -3
  222. package/Particles/baseParticleSystem.js.map +1 -1
  223. package/Particles/gpuParticleSystem.js +1 -14
  224. package/Particles/gpuParticleSystem.js.map +1 -1
  225. package/Particles/particle.js +2 -2
  226. package/Particles/particle.js.map +1 -1
  227. package/Particles/particleSystem.js +15 -13
  228. package/Particles/particleSystem.js.map +1 -1
  229. package/Particles/thinParticleSystem.js +3 -16
  230. package/Particles/thinParticleSystem.js.map +1 -1
  231. package/Physics/physicsHelper.js +18 -14
  232. package/Physics/physicsHelper.js.map +1 -1
  233. package/Physics/v1/Plugins/ammoJSPlugin.js +10 -8
  234. package/Physics/v1/Plugins/ammoJSPlugin.js.map +1 -1
  235. package/Physics/v1/Plugins/cannonJSPlugin.js +13 -8
  236. package/Physics/v1/Plugins/cannonJSPlugin.js.map +1 -1
  237. package/Physics/v1/Plugins/oimoJSPlugin.js +9 -8
  238. package/Physics/v1/Plugins/oimoJSPlugin.js.map +1 -1
  239. package/Physics/v1/physicsEngine.js +4 -4
  240. package/Physics/v1/physicsEngine.js.map +1 -1
  241. package/Physics/v1/physicsImpostor.js +10 -21
  242. package/Physics/v1/physicsImpostor.js.map +1 -1
  243. package/Physics/v2/Plugins/havokPlugin.js +12 -10
  244. package/Physics/v2/Plugins/havokPlugin.js.map +1 -1
  245. package/Physics/v2/ragdoll.js +4 -4
  246. package/Physics/v2/ragdoll.js.map +1 -1
  247. package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.js +3 -2
  248. package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.js.map +1 -1
  249. package/PostProcesses/RenderPipeline/postProcessRenderEffect.js +8 -6
  250. package/PostProcesses/RenderPipeline/postProcessRenderEffect.js.map +1 -1
  251. package/PostProcesses/depthOfFieldMergePostProcess.js +4 -3
  252. package/PostProcesses/depthOfFieldMergePostProcess.js.map +1 -1
  253. package/Rendering/GlobalIllumination/giRSMManager.js +6 -6
  254. package/Rendering/GlobalIllumination/giRSMManager.js.map +1 -1
  255. package/Rendering/IBLShadows/iblShadowsRenderPipeline.js +14 -14
  256. package/Rendering/IBLShadows/iblShadowsRenderPipeline.js.map +1 -1
  257. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js +14 -12
  258. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js.map +1 -1
  259. package/Rendering/iblCdfGenerator.js +4 -4
  260. package/Rendering/iblCdfGenerator.js.map +1 -1
  261. package/Rendering/objectRenderer.js +2 -2
  262. package/Rendering/objectRenderer.js.map +1 -1
  263. package/Rendering/reflectiveShadowMap.js +7 -5
  264. package/Rendering/reflectiveShadowMap.js.map +1 -1
  265. package/Sprites/spriteMap.js +2 -2
  266. package/Sprites/spriteMap.js.map +1 -1
  267. package/XR/features/WebXRAbstractFeature.js +2 -2
  268. package/XR/features/WebXRAbstractFeature.js.map +1 -1
  269. package/XR/features/WebXRAnchorSystem.js +4 -4
  270. package/XR/features/WebXRAnchorSystem.js.map +1 -1
  271. package/XR/features/WebXRBackgroundRemover.js +3 -1
  272. package/XR/features/WebXRBackgroundRemover.js.map +1 -1
  273. package/XR/features/WebXRControllerMovement.js +6 -3
  274. package/XR/features/WebXRControllerMovement.js.map +1 -1
  275. package/XR/features/WebXRControllerPhysics.js +12 -7
  276. package/XR/features/WebXRControllerPhysics.js.map +1 -1
  277. package/XR/features/WebXRControllerPointerSelection.js +12 -7
  278. package/XR/features/WebXRControllerPointerSelection.js.map +1 -1
  279. package/XR/features/WebXRControllerTeleportation.js +11 -7
  280. package/XR/features/WebXRControllerTeleportation.js.map +1 -1
  281. package/XR/features/WebXRDepthSensing.js +6 -6
  282. package/XR/features/WebXRDepthSensing.js.map +1 -1
  283. package/XR/features/WebXRHandTracking.js +60 -24
  284. package/XR/features/WebXRHandTracking.js.map +1 -1
  285. package/XR/features/WebXRHitTest.js +4 -4
  286. package/XR/features/WebXRHitTest.js.map +1 -1
  287. package/XR/features/WebXRImageTracking.js +2 -2
  288. package/XR/features/WebXRImageTracking.js.map +1 -1
  289. package/XR/features/WebXRLayers.js +2 -2
  290. package/XR/features/WebXRLayers.js.map +1 -1
  291. package/XR/features/WebXRNearInteraction.js +12 -7
  292. package/XR/features/WebXRNearInteraction.js.map +1 -1
  293. package/XR/features/WebXRRawCameraAccess.js +9 -4
  294. package/XR/features/WebXRRawCameraAccess.js.map +1 -1
  295. package/XR/features/WebXRSpaceWarp.js +2 -2
  296. package/XR/features/WebXRSpaceWarp.js.map +1 -1
  297. package/XR/motionController/webXRAbstractMotionController.js +19 -8
  298. package/XR/motionController/webXRAbstractMotionController.js.map +1 -1
  299. package/XR/motionController/webXRGenericMotionController.js +2 -2
  300. package/XR/motionController/webXRGenericMotionController.js.map +1 -1
  301. package/XR/motionController/webXRHTCViveMotionController.js +5 -4
  302. package/XR/motionController/webXRHTCViveMotionController.js.map +1 -1
  303. package/XR/motionController/webXRMicrosoftMixedRealityController.js +9 -6
  304. package/XR/motionController/webXRMicrosoftMixedRealityController.js.map +1 -1
  305. package/XR/motionController/webXRMotionControllerManager.js +4 -4
  306. package/XR/motionController/webXRMotionControllerManager.js.map +1 -1
  307. package/XR/motionController/webXROculusTouchMotionController.js +5 -4
  308. package/XR/motionController/webXROculusTouchMotionController.js.map +1 -1
  309. package/XR/motionController/webXRProfiledMotionController.js +15 -10
  310. package/XR/motionController/webXRProfiledMotionController.js.map +1 -1
  311. package/XR/webXRCamera.js +3 -2
  312. package/XR/webXRCamera.js.map +1 -1
  313. package/XR/webXREnterExitUI.js +5 -4
  314. package/XR/webXREnterExitUI.js.map +1 -1
  315. package/XR/webXRExperienceHelper.js +2 -2
  316. package/XR/webXRExperienceHelper.js.map +1 -1
  317. package/XR/webXRFeaturesManager.js +10 -7
  318. package/XR/webXRFeaturesManager.js.map +1 -1
  319. package/XR/webXRInput.js +8 -8
  320. package/XR/webXRInput.js.map +1 -1
  321. package/XR/webXRInputSource.js +4 -1
  322. package/XR/webXRInputSource.js.map +1 -1
  323. package/XR/webXRRenderTargetTextureProvider.js +3 -1
  324. package/XR/webXRRenderTargetTextureProvider.js.map +1 -1
  325. package/assetContainer.js +156 -135
  326. package/assetContainer.js.map +1 -1
  327. package/node.js +2 -2
  328. package/node.js.map +1 -1
  329. package/package.json +1 -1
  330. package/scene.js +18 -11
  331. package/scene.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"WebXRLayers.js","sourceRoot":"","sources":["../../../../../dev/core/src/XR/features/WebXRLayers.ts"],"names":[],"mappings":"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","sourcesContent":["import { WebXRFeatureName, WebXRFeaturesManager } from \"../webXRFeaturesManager\";\r\nimport type { WebXRSessionManager } from \"../webXRSessionManager\";\r\nimport { WebXRAbstractFeature } from \"./WebXRAbstractFeature\";\r\nimport type { WebXRLayerWrapper } from \"../webXRLayerWrapper\";\r\nimport { WebXRWebGLLayerWrapper } from \"../webXRWebGLLayer\";\r\nimport { WebXRProjectionLayerWrapper, defaultXRProjectionLayerInit } from \"./Layers/WebXRProjectionLayer\";\r\nimport { WebXRCompositionLayerRenderTargetTextureProvider, WebXRCompositionLayerWrapper } from \"./Layers/WebXRCompositionLayer\";\r\nimport type { ThinTexture } from \"../../Materials/Textures/thinTexture\";\r\nimport type { DynamicTexture } from \"../../Materials/Textures/dynamicTexture\";\r\nimport { Color4 } from \"../../Maths/math.color\";\r\nimport type { LensFlareSystem } from \"../../LensFlares/lensFlareSystem\";\r\nimport type { ThinEngine } from \"../../Engines\";\r\n\r\nconst defaultXRWebGLLayerInit: XRWebGLLayerInit = {};\r\n\r\n/**\r\n * Configuration options of the layers feature\r\n */\r\nexport interface IWebXRLayersOptions {\r\n /**\r\n * Whether to try initializing the base projection layer as a multiview render target, if multiview is supported.\r\n * Defaults to false.\r\n */\r\n preferMultiviewOnInit?: boolean;\r\n\r\n /**\r\n * Optional configuration for the base projection layer.\r\n */\r\n projectionLayerInit?: Partial<XRProjectionLayerInit>;\r\n}\r\n\r\n/**\r\n * Exposes the WebXR Layers API.\r\n */\r\nexport class WebXRLayers extends WebXRAbstractFeature {\r\n /**\r\n * The module's name\r\n */\r\n public static readonly Name = WebXRFeatureName.LAYERS;\r\n /**\r\n * The (Babylon) version of this module.\r\n * This is an integer representing the implementation version.\r\n * This number does not correspond to the WebXR specs version\r\n */\r\n public static readonly Version = 1;\r\n /**\r\n * Already-created layers\r\n */\r\n private _existingLayers: WebXRLayerWrapper[] = [];\r\n\r\n private _glContext: WebGLRenderingContext | WebGL2RenderingContext;\r\n private _xrWebGLBinding: XRWebGLBinding;\r\n private _isMultiviewEnabled = false;\r\n private _projectionLayerInitialized = false;\r\n\r\n private _compositionLayerTextureMapping: WeakMap<XRCompositionLayer, ThinTexture> = new WeakMap();\r\n private _layerToRTTProviderMapping: WeakMap<XRCompositionLayer, WebXRCompositionLayerRenderTargetTextureProvider> = new WeakMap();\r\n\r\n constructor(\r\n _xrSessionManager: WebXRSessionManager,\r\n private readonly _options: IWebXRLayersOptions = {}\r\n ) {\r\n super(_xrSessionManager);\r\n this.xrNativeFeatureName = \"layers\";\r\n }\r\n\r\n /**\r\n * Attach this feature.\r\n * Will usually be called by the features manager.\r\n *\r\n * @returns true if successful.\r\n */\r\n public override attach(): boolean {\r\n if (!super.attach()) {\r\n return false;\r\n }\r\n\r\n const engine = this._xrSessionManager.scene.getEngine();\r\n this._glContext = (engine as ThinEngine)._gl;\r\n this._xrWebGLBinding = new XRWebGLBinding(this._xrSessionManager.session, this._glContext);\r\n this._existingLayers.length = 0;\r\n\r\n const projectionLayerInit = { ...defaultXRProjectionLayerInit, ...this._options.projectionLayerInit };\r\n this._isMultiviewEnabled = this._options.preferMultiviewOnInit && engine.getCaps().multiview;\r\n this.createProjectionLayer(projectionLayerInit /*, projectionLayerMultiview*/);\r\n this._projectionLayerInitialized = true;\r\n\r\n return true;\r\n }\r\n\r\n public override detach(): boolean {\r\n if (!super.detach()) {\r\n return false;\r\n }\r\n this._existingLayers.forEach((layer) => {\r\n layer.dispose();\r\n });\r\n this._existingLayers.length = 0;\r\n this._projectionLayerInitialized = false;\r\n return true;\r\n }\r\n\r\n /**\r\n * Creates a new XRWebGLLayer.\r\n * @param params an object providing configuration options for the new XRWebGLLayer\r\n * @returns the XRWebGLLayer\r\n */\r\n public createXRWebGLLayer(params = defaultXRWebGLLayerInit): WebXRWebGLLayerWrapper {\r\n const layer = new XRWebGLLayer(this._xrSessionManager.session, this._glContext, params);\r\n return new WebXRWebGLLayerWrapper(layer);\r\n }\r\n\r\n private _validateLayerInit(params: XRProjectionLayerInit | XRQuadLayerInit, multiview = this._isMultiviewEnabled): void {\r\n // check if we are in session\r\n if (!this._xrSessionManager.inXRSession) {\r\n throw new Error(\"Cannot create a layer outside of a WebXR session. Make sure the session has started before creating layers.\");\r\n }\r\n if (multiview && params.textureType !== \"texture-array\") {\r\n throw new Error(\"Projection layers can only be made multiview if they use texture arrays. Set the textureType parameter to 'texture-array'.\");\r\n }\r\n\r\n // TODO (rgerd): Support RTT's that are bound to sub-images in the texture array.\r\n if (!multiview && params.textureType === \"texture-array\") {\r\n throw new Error(\"We currently only support multiview rendering when the textureType parameter is set to 'texture-array'.\");\r\n }\r\n }\r\n\r\n private _extendXRLayerInit(params: XRProjectionLayerInit | XRQuadLayerInit, multiview = this._isMultiviewEnabled): XRProjectionLayerInit | XRQuadLayerInit {\r\n if (multiview) {\r\n params.textureType = \"texture-array\";\r\n }\r\n return params;\r\n }\r\n\r\n /**\r\n * Creates a new XRProjectionLayer.\r\n * @param params an object providing configuration options for the new XRProjectionLayer.\r\n * @param multiview whether the projection layer should render with multiview. Will be tru automatically if the extension initialized with multiview.\r\n * @returns the projection layer\r\n */\r\n public createProjectionLayer(params = defaultXRProjectionLayerInit, multiview = this._isMultiviewEnabled): WebXRProjectionLayerWrapper {\r\n this._extendXRLayerInit(params, multiview);\r\n this._validateLayerInit(params, multiview);\r\n\r\n const projLayer = this._xrWebGLBinding.createProjectionLayer(params);\r\n const layer = new WebXRProjectionLayerWrapper(projLayer, multiview, this._xrWebGLBinding);\r\n this.addXRSessionLayer(layer);\r\n return layer;\r\n }\r\n\r\n /**\r\n * Note about making it private - this function will be exposed once I decide on a proper API to support all of the XR layers' options\r\n * @param options an object providing configuration options for the new XRQuadLayer.\r\n * @param babylonTexture the texture to display in the layer\r\n * @returns the quad layer\r\n */\r\n private _createQuadLayer(options: { params: Partial<XRQuadLayerInit> } = { params: {} }, babylonTexture?: ThinTexture): WebXRCompositionLayerWrapper {\r\n this._extendXRLayerInit(options.params, false);\r\n const width = (this._existingLayers[0].layer as XRProjectionLayer).textureWidth;\r\n const height = (this._existingLayers[0].layer as XRProjectionLayer).textureHeight;\r\n const populatedParams: XRQuadLayerInit = {\r\n space: this._xrSessionManager.referenceSpace,\r\n viewPixelWidth: width,\r\n viewPixelHeight: height,\r\n clearOnAccess: true,\r\n ...options.params,\r\n };\r\n this._validateLayerInit(populatedParams, false);\r\n const quadLayer = this._xrWebGLBinding.createQuadLayer(populatedParams);\r\n\r\n quadLayer.width = this._isMultiviewEnabled ? 1 : 2;\r\n quadLayer.height = 1;\r\n // this wrapper is not really needed, but it's here for consistency\r\n const wrapper: WebXRCompositionLayerWrapper = new WebXRCompositionLayerWrapper(\r\n () => quadLayer.width,\r\n () => quadLayer.height,\r\n quadLayer,\r\n \"XRQuadLayer\",\r\n false,\r\n (sessionManager) => new WebXRCompositionLayerRenderTargetTextureProvider(sessionManager, this._xrWebGLBinding, wrapper)\r\n );\r\n\r\n if (babylonTexture) {\r\n this._compositionLayerTextureMapping.set(quadLayer, babylonTexture);\r\n }\r\n const rtt = wrapper.createRenderTargetTextureProvider(this._xrSessionManager) as WebXRCompositionLayerRenderTargetTextureProvider;\r\n this._layerToRTTProviderMapping.set(quadLayer, rtt);\r\n this.addXRSessionLayer(wrapper);\r\n return wrapper;\r\n }\r\n\r\n /**\r\n * @experimental\r\n * This will support full screen ADT when used with WebXR Layers. This API might change in the future.\r\n * Note that no interaction will be available with the ADT when using this method\r\n * @param texture the texture to display in the layer\r\n * @param options optional parameters for the layer\r\n * @returns a composition layer containing the texture\r\n */\r\n public addFullscreenAdvancedDynamicTexture(texture: DynamicTexture, options: { distanceFromHeadset: number } = { distanceFromHeadset: 1.5 }): WebXRCompositionLayerWrapper {\r\n const wrapper = this._createQuadLayer(\r\n {\r\n params: {\r\n space: this._xrSessionManager.viewerReferenceSpace,\r\n textureType: \"texture\",\r\n layout: \"mono\",\r\n },\r\n },\r\n texture\r\n );\r\n\r\n const layer = wrapper.layer as XRQuadLayer;\r\n const distance = Math.max(0.1, options.distanceFromHeadset);\r\n const pos = { x: 0, y: 0, z: -distance };\r\n const orient = { x: 0, y: 0, z: 0, w: 1 };\r\n layer.transform = new XRRigidTransform(pos, orient);\r\n\r\n const rttProvider = this._layerToRTTProviderMapping.get(layer);\r\n if (!rttProvider) {\r\n throw new Error(\"Could not find the RTT provider for the layer\");\r\n }\r\n const babylonLayer = this._xrSessionManager.scene.layers.find((babylonLayer) => {\r\n return babylonLayer.texture === texture;\r\n });\r\n if (!babylonLayer) {\r\n throw new Error(\"Could not find the babylon layer for the texture\");\r\n }\r\n rttProvider.onRenderTargetTextureCreatedObservable.add((data) => {\r\n if (data.eye && data.eye === \"right\") {\r\n return;\r\n }\r\n data.texture.clearColor = new Color4(0, 0, 0, 0);\r\n babylonLayer.renderTargetTextures.push(data.texture);\r\n babylonLayer.renderOnlyInRenderTargetTextures = true;\r\n // for stereo (not for gui) it should be onBeforeCameraRenderObservable\r\n this._xrSessionManager.scene.onBeforeRenderObservable.add(() => {\r\n data.texture.render();\r\n });\r\n babylonLayer.renderTargetTextures.push(data.texture);\r\n babylonLayer.renderOnlyInRenderTargetTextures = true;\r\n // add it back when the session ends\r\n this._xrSessionManager.onXRSessionEnded.addOnce(() => {\r\n babylonLayer.renderTargetTextures.splice(babylonLayer.renderTargetTextures.indexOf(data.texture), 1);\r\n babylonLayer.renderOnlyInRenderTargetTextures = false;\r\n });\r\n });\r\n return wrapper;\r\n }\r\n\r\n /**\r\n * @experimental\r\n * This functions allows you to add a lens flare system to the XR scene.\r\n * Note - this will remove the lens flare system from the scene and add it to the XR scene.\r\n * This feature is experimental and might change in the future.\r\n * @param flareSystem the flare system to add\r\n * @returns a composition layer containing the flare system\r\n */\r\n protected _addLensFlareSystem(flareSystem: LensFlareSystem): WebXRCompositionLayerWrapper {\r\n const wrapper = this._createQuadLayer({\r\n params: {\r\n space: this._xrSessionManager.viewerReferenceSpace,\r\n textureType: \"texture\",\r\n layout: \"mono\",\r\n },\r\n });\r\n\r\n const layer = wrapper.layer as XRQuadLayer;\r\n layer.width = 2;\r\n layer.height = 1;\r\n const distance = 10;\r\n const pos = { x: 0, y: 0, z: -distance };\r\n const orient = { x: 0, y: 0, z: 0, w: 1 };\r\n layer.transform = new XRRigidTransform(pos, orient);\r\n\r\n // get the rtt wrapper\r\n const rttProvider = this._layerToRTTProviderMapping.get(layer);\r\n if (!rttProvider) {\r\n throw new Error(\"Could not find the RTT provider for the layer\");\r\n }\r\n // render the flare system to the rtt\r\n rttProvider.onRenderTargetTextureCreatedObservable.add((data) => {\r\n data.texture.clearColor = new Color4(0, 0, 0, 0);\r\n data.texture.customRenderFunction = () => {\r\n flareSystem.render();\r\n };\r\n\r\n // add to the scene's render targets\r\n // this._xrSessionManager.scene.onBeforeCameraRenderObservable.add(() => {\r\n // data.texture.render();\r\n // });\r\n });\r\n // remove the lens flare system from the scene\r\n this._xrSessionManager.onXRSessionInit.add(() => {\r\n this._xrSessionManager.scene.lensFlareSystems.splice(this._xrSessionManager.scene.lensFlareSystems.indexOf(flareSystem), 1);\r\n });\r\n // add it back when the session ends\r\n this._xrSessionManager.onXRSessionEnded.add(() => {\r\n this._xrSessionManager.scene.lensFlareSystems.push(flareSystem);\r\n });\r\n\r\n return wrapper;\r\n }\r\n\r\n /**\r\n * Add a new layer to the already-existing list of layers\r\n * @param wrappedLayer the new layer to add to the existing ones\r\n */\r\n public addXRSessionLayer(wrappedLayer: WebXRLayerWrapper) {\r\n this._existingLayers.push(wrappedLayer);\r\n this.setXRSessionLayers(this._existingLayers);\r\n }\r\n\r\n /**\r\n * Sets the layers to be used by the XR session.\r\n * Note that you must call this function with any layers you wish to render to\r\n * since it adds them to the XR session's render state\r\n * (replacing any layers that were added in a previous call to setXRSessionLayers or updateRenderState).\r\n * This method also sets up the session manager's render target texture provider\r\n * as the first layer in the array, which feeds the WebXR camera(s) attached to the session.\r\n * @param wrappedLayers An array of WebXRLayerWrapper, usually returned from the WebXRLayers createLayer functions.\r\n */\r\n public setXRSessionLayers(wrappedLayers: Array<WebXRLayerWrapper> = this._existingLayers): void {\r\n // this._existingLayers = wrappedLayers;\r\n const renderStateInit: XRRenderStateInit = { ...this._xrSessionManager.session.renderState };\r\n // Clear out the layer-related fields.\r\n renderStateInit.baseLayer = undefined;\r\n renderStateInit.layers = wrappedLayers.map((wrappedLayer) => wrappedLayer.layer);\r\n this._xrSessionManager.updateRenderState(renderStateInit);\r\n if (!this._projectionLayerInitialized) {\r\n this._xrSessionManager._setBaseLayerWrapper(wrappedLayers.length > 0 ? wrappedLayers.at(0)! : null);\r\n }\r\n }\r\n\r\n public override isCompatible(): boolean {\r\n // TODO (rgerd): Add native support.\r\n return !this._xrSessionManager.isNative && typeof XRWebGLBinding !== \"undefined\" && !!XRWebGLBinding.prototype.createProjectionLayer;\r\n }\r\n\r\n /**\r\n * Dispose this feature and all of the resources attached.\r\n */\r\n public override dispose(): void {\r\n super.dispose();\r\n }\r\n\r\n protected _onXRFrame(_xrFrame: XRFrame): void {\r\n // Replace once the mapped internal texture of each available composition layer, apart from the last one, which is the projection layer that needs an RTT\r\n const layers = this._existingLayers;\r\n for (let i = 0; i < layers.length; ++i) {\r\n const layer = layers[i];\r\n if (layer.layerType !== \"XRProjectionLayer\") {\r\n // get the rtt provider\r\n const rttProvider = this._layerToRTTProviderMapping.get(layer.layer as XRCompositionLayer);\r\n if (!rttProvider) {\r\n continue;\r\n }\r\n\r\n if (rttProvider.layerWrapper.isMultiview) {\r\n // get the views, if we are in multiview\r\n const pose = _xrFrame.getViewerPose(this._xrSessionManager.referenceSpace);\r\n if (pose) {\r\n const views = pose.views;\r\n for (let j = 0; j < views.length; ++j) {\r\n const view = views[j];\r\n rttProvider.getRenderTargetTextureForView(view);\r\n }\r\n }\r\n } else {\r\n rttProvider.getRenderTargetTextureForView();\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n//register the plugin\r\nWebXRFeaturesManager.AddWebXRFeature(\r\n WebXRLayers.Name,\r\n (xrSessionManager, options) => {\r\n return () => new WebXRLayers(xrSessionManager, options);\r\n },\r\n WebXRLayers.Version,\r\n false\r\n);\r\n"]}
1
+ {"version":3,"file":"WebXRLayers.js","sourceRoot":"","sources":["../../../../../dev/core/src/XR/features/WebXRLayers.ts"],"names":[],"mappings":"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","sourcesContent":["import { WebXRFeatureName, WebXRFeaturesManager } from \"../webXRFeaturesManager\";\r\nimport type { WebXRSessionManager } from \"../webXRSessionManager\";\r\nimport { WebXRAbstractFeature } from \"./WebXRAbstractFeature\";\r\nimport type { WebXRLayerWrapper } from \"../webXRLayerWrapper\";\r\nimport { WebXRWebGLLayerWrapper } from \"../webXRWebGLLayer\";\r\nimport { WebXRProjectionLayerWrapper, defaultXRProjectionLayerInit } from \"./Layers/WebXRProjectionLayer\";\r\nimport { WebXRCompositionLayerRenderTargetTextureProvider, WebXRCompositionLayerWrapper } from \"./Layers/WebXRCompositionLayer\";\r\nimport type { ThinTexture } from \"../../Materials/Textures/thinTexture\";\r\nimport type { DynamicTexture } from \"../../Materials/Textures/dynamicTexture\";\r\nimport { Color4 } from \"../../Maths/math.color\";\r\nimport type { LensFlareSystem } from \"../../LensFlares/lensFlareSystem\";\r\nimport type { ThinEngine } from \"../../Engines\";\r\n\r\nconst defaultXRWebGLLayerInit: XRWebGLLayerInit = {};\r\n\r\n/**\r\n * Configuration options of the layers feature\r\n */\r\nexport interface IWebXRLayersOptions {\r\n /**\r\n * Whether to try initializing the base projection layer as a multiview render target, if multiview is supported.\r\n * Defaults to false.\r\n */\r\n preferMultiviewOnInit?: boolean;\r\n\r\n /**\r\n * Optional configuration for the base projection layer.\r\n */\r\n projectionLayerInit?: Partial<XRProjectionLayerInit>;\r\n}\r\n\r\n/**\r\n * Exposes the WebXR Layers API.\r\n */\r\nexport class WebXRLayers extends WebXRAbstractFeature {\r\n /**\r\n * The module's name\r\n */\r\n public static readonly Name = WebXRFeatureName.LAYERS;\r\n /**\r\n * The (Babylon) version of this module.\r\n * This is an integer representing the implementation version.\r\n * This number does not correspond to the WebXR specs version\r\n */\r\n public static readonly Version = 1;\r\n /**\r\n * Already-created layers\r\n */\r\n private _existingLayers: WebXRLayerWrapper[] = [];\r\n\r\n private _glContext: WebGLRenderingContext | WebGL2RenderingContext;\r\n private _xrWebGLBinding: XRWebGLBinding;\r\n private _isMultiviewEnabled = false;\r\n private _projectionLayerInitialized = false;\r\n\r\n private _compositionLayerTextureMapping: WeakMap<XRCompositionLayer, ThinTexture> = new WeakMap();\r\n private _layerToRTTProviderMapping: WeakMap<XRCompositionLayer, WebXRCompositionLayerRenderTargetTextureProvider> = new WeakMap();\r\n\r\n constructor(\r\n _xrSessionManager: WebXRSessionManager,\r\n private readonly _options: IWebXRLayersOptions = {}\r\n ) {\r\n super(_xrSessionManager);\r\n this.xrNativeFeatureName = \"layers\";\r\n }\r\n\r\n /**\r\n * Attach this feature.\r\n * Will usually be called by the features manager.\r\n *\r\n * @returns true if successful.\r\n */\r\n public override attach(): boolean {\r\n if (!super.attach()) {\r\n return false;\r\n }\r\n\r\n const engine = this._xrSessionManager.scene.getEngine();\r\n this._glContext = (engine as ThinEngine)._gl;\r\n this._xrWebGLBinding = new XRWebGLBinding(this._xrSessionManager.session, this._glContext);\r\n this._existingLayers.length = 0;\r\n\r\n const projectionLayerInit = { ...defaultXRProjectionLayerInit, ...this._options.projectionLayerInit };\r\n this._isMultiviewEnabled = this._options.preferMultiviewOnInit && engine.getCaps().multiview;\r\n this.createProjectionLayer(projectionLayerInit /*, projectionLayerMultiview*/);\r\n this._projectionLayerInitialized = true;\r\n\r\n return true;\r\n }\r\n\r\n public override detach(): boolean {\r\n if (!super.detach()) {\r\n return false;\r\n }\r\n for (const layer of this._existingLayers) {\r\n layer.dispose();\r\n }\r\n this._existingLayers.length = 0;\r\n this._projectionLayerInitialized = false;\r\n return true;\r\n }\r\n\r\n /**\r\n * Creates a new XRWebGLLayer.\r\n * @param params an object providing configuration options for the new XRWebGLLayer\r\n * @returns the XRWebGLLayer\r\n */\r\n public createXRWebGLLayer(params = defaultXRWebGLLayerInit): WebXRWebGLLayerWrapper {\r\n const layer = new XRWebGLLayer(this._xrSessionManager.session, this._glContext, params);\r\n return new WebXRWebGLLayerWrapper(layer);\r\n }\r\n\r\n private _validateLayerInit(params: XRProjectionLayerInit | XRQuadLayerInit, multiview = this._isMultiviewEnabled): void {\r\n // check if we are in session\r\n if (!this._xrSessionManager.inXRSession) {\r\n throw new Error(\"Cannot create a layer outside of a WebXR session. Make sure the session has started before creating layers.\");\r\n }\r\n if (multiview && params.textureType !== \"texture-array\") {\r\n throw new Error(\"Projection layers can only be made multiview if they use texture arrays. Set the textureType parameter to 'texture-array'.\");\r\n }\r\n\r\n // TODO (rgerd): Support RTT's that are bound to sub-images in the texture array.\r\n if (!multiview && params.textureType === \"texture-array\") {\r\n throw new Error(\"We currently only support multiview rendering when the textureType parameter is set to 'texture-array'.\");\r\n }\r\n }\r\n\r\n private _extendXRLayerInit(params: XRProjectionLayerInit | XRQuadLayerInit, multiview = this._isMultiviewEnabled): XRProjectionLayerInit | XRQuadLayerInit {\r\n if (multiview) {\r\n params.textureType = \"texture-array\";\r\n }\r\n return params;\r\n }\r\n\r\n /**\r\n * Creates a new XRProjectionLayer.\r\n * @param params an object providing configuration options for the new XRProjectionLayer.\r\n * @param multiview whether the projection layer should render with multiview. Will be tru automatically if the extension initialized with multiview.\r\n * @returns the projection layer\r\n */\r\n public createProjectionLayer(params = defaultXRProjectionLayerInit, multiview = this._isMultiviewEnabled): WebXRProjectionLayerWrapper {\r\n this._extendXRLayerInit(params, multiview);\r\n this._validateLayerInit(params, multiview);\r\n\r\n const projLayer = this._xrWebGLBinding.createProjectionLayer(params);\r\n const layer = new WebXRProjectionLayerWrapper(projLayer, multiview, this._xrWebGLBinding);\r\n this.addXRSessionLayer(layer);\r\n return layer;\r\n }\r\n\r\n /**\r\n * Note about making it private - this function will be exposed once I decide on a proper API to support all of the XR layers' options\r\n * @param options an object providing configuration options for the new XRQuadLayer.\r\n * @param babylonTexture the texture to display in the layer\r\n * @returns the quad layer\r\n */\r\n private _createQuadLayer(options: { params: Partial<XRQuadLayerInit> } = { params: {} }, babylonTexture?: ThinTexture): WebXRCompositionLayerWrapper {\r\n this._extendXRLayerInit(options.params, false);\r\n const width = (this._existingLayers[0].layer as XRProjectionLayer).textureWidth;\r\n const height = (this._existingLayers[0].layer as XRProjectionLayer).textureHeight;\r\n const populatedParams: XRQuadLayerInit = {\r\n space: this._xrSessionManager.referenceSpace,\r\n viewPixelWidth: width,\r\n viewPixelHeight: height,\r\n clearOnAccess: true,\r\n ...options.params,\r\n };\r\n this._validateLayerInit(populatedParams, false);\r\n const quadLayer = this._xrWebGLBinding.createQuadLayer(populatedParams);\r\n\r\n quadLayer.width = this._isMultiviewEnabled ? 1 : 2;\r\n quadLayer.height = 1;\r\n // this wrapper is not really needed, but it's here for consistency\r\n const wrapper: WebXRCompositionLayerWrapper = new WebXRCompositionLayerWrapper(\r\n () => quadLayer.width,\r\n () => quadLayer.height,\r\n quadLayer,\r\n \"XRQuadLayer\",\r\n false,\r\n (sessionManager) => new WebXRCompositionLayerRenderTargetTextureProvider(sessionManager, this._xrWebGLBinding, wrapper)\r\n );\r\n\r\n if (babylonTexture) {\r\n this._compositionLayerTextureMapping.set(quadLayer, babylonTexture);\r\n }\r\n const rtt = wrapper.createRenderTargetTextureProvider(this._xrSessionManager) as WebXRCompositionLayerRenderTargetTextureProvider;\r\n this._layerToRTTProviderMapping.set(quadLayer, rtt);\r\n this.addXRSessionLayer(wrapper);\r\n return wrapper;\r\n }\r\n\r\n /**\r\n * @experimental\r\n * This will support full screen ADT when used with WebXR Layers. This API might change in the future.\r\n * Note that no interaction will be available with the ADT when using this method\r\n * @param texture the texture to display in the layer\r\n * @param options optional parameters for the layer\r\n * @returns a composition layer containing the texture\r\n */\r\n public addFullscreenAdvancedDynamicTexture(texture: DynamicTexture, options: { distanceFromHeadset: number } = { distanceFromHeadset: 1.5 }): WebXRCompositionLayerWrapper {\r\n const wrapper = this._createQuadLayer(\r\n {\r\n params: {\r\n space: this._xrSessionManager.viewerReferenceSpace,\r\n textureType: \"texture\",\r\n layout: \"mono\",\r\n },\r\n },\r\n texture\r\n );\r\n\r\n const layer = wrapper.layer as XRQuadLayer;\r\n const distance = Math.max(0.1, options.distanceFromHeadset);\r\n const pos = { x: 0, y: 0, z: -distance };\r\n const orient = { x: 0, y: 0, z: 0, w: 1 };\r\n layer.transform = new XRRigidTransform(pos, orient);\r\n\r\n const rttProvider = this._layerToRTTProviderMapping.get(layer);\r\n if (!rttProvider) {\r\n throw new Error(\"Could not find the RTT provider for the layer\");\r\n }\r\n const babylonLayer = this._xrSessionManager.scene.layers.find((babylonLayer) => {\r\n return babylonLayer.texture === texture;\r\n });\r\n if (!babylonLayer) {\r\n throw new Error(\"Could not find the babylon layer for the texture\");\r\n }\r\n rttProvider.onRenderTargetTextureCreatedObservable.add((data) => {\r\n if (data.eye && data.eye === \"right\") {\r\n return;\r\n }\r\n data.texture.clearColor = new Color4(0, 0, 0, 0);\r\n babylonLayer.renderTargetTextures.push(data.texture);\r\n babylonLayer.renderOnlyInRenderTargetTextures = true;\r\n // for stereo (not for gui) it should be onBeforeCameraRenderObservable\r\n this._xrSessionManager.scene.onBeforeRenderObservable.add(() => {\r\n data.texture.render();\r\n });\r\n babylonLayer.renderTargetTextures.push(data.texture);\r\n babylonLayer.renderOnlyInRenderTargetTextures = true;\r\n // add it back when the session ends\r\n this._xrSessionManager.onXRSessionEnded.addOnce(() => {\r\n babylonLayer.renderTargetTextures.splice(babylonLayer.renderTargetTextures.indexOf(data.texture), 1);\r\n babylonLayer.renderOnlyInRenderTargetTextures = false;\r\n });\r\n });\r\n return wrapper;\r\n }\r\n\r\n /**\r\n * @experimental\r\n * This functions allows you to add a lens flare system to the XR scene.\r\n * Note - this will remove the lens flare system from the scene and add it to the XR scene.\r\n * This feature is experimental and might change in the future.\r\n * @param flareSystem the flare system to add\r\n * @returns a composition layer containing the flare system\r\n */\r\n protected _addLensFlareSystem(flareSystem: LensFlareSystem): WebXRCompositionLayerWrapper {\r\n const wrapper = this._createQuadLayer({\r\n params: {\r\n space: this._xrSessionManager.viewerReferenceSpace,\r\n textureType: \"texture\",\r\n layout: \"mono\",\r\n },\r\n });\r\n\r\n const layer = wrapper.layer as XRQuadLayer;\r\n layer.width = 2;\r\n layer.height = 1;\r\n const distance = 10;\r\n const pos = { x: 0, y: 0, z: -distance };\r\n const orient = { x: 0, y: 0, z: 0, w: 1 };\r\n layer.transform = new XRRigidTransform(pos, orient);\r\n\r\n // get the rtt wrapper\r\n const rttProvider = this._layerToRTTProviderMapping.get(layer);\r\n if (!rttProvider) {\r\n throw new Error(\"Could not find the RTT provider for the layer\");\r\n }\r\n // render the flare system to the rtt\r\n rttProvider.onRenderTargetTextureCreatedObservable.add((data) => {\r\n data.texture.clearColor = new Color4(0, 0, 0, 0);\r\n data.texture.customRenderFunction = () => {\r\n flareSystem.render();\r\n };\r\n\r\n // add to the scene's render targets\r\n // this._xrSessionManager.scene.onBeforeCameraRenderObservable.add(() => {\r\n // data.texture.render();\r\n // });\r\n });\r\n // remove the lens flare system from the scene\r\n this._xrSessionManager.onXRSessionInit.add(() => {\r\n this._xrSessionManager.scene.lensFlareSystems.splice(this._xrSessionManager.scene.lensFlareSystems.indexOf(flareSystem), 1);\r\n });\r\n // add it back when the session ends\r\n this._xrSessionManager.onXRSessionEnded.add(() => {\r\n this._xrSessionManager.scene.lensFlareSystems.push(flareSystem);\r\n });\r\n\r\n return wrapper;\r\n }\r\n\r\n /**\r\n * Add a new layer to the already-existing list of layers\r\n * @param wrappedLayer the new layer to add to the existing ones\r\n */\r\n public addXRSessionLayer(wrappedLayer: WebXRLayerWrapper) {\r\n this._existingLayers.push(wrappedLayer);\r\n this.setXRSessionLayers(this._existingLayers);\r\n }\r\n\r\n /**\r\n * Sets the layers to be used by the XR session.\r\n * Note that you must call this function with any layers you wish to render to\r\n * since it adds them to the XR session's render state\r\n * (replacing any layers that were added in a previous call to setXRSessionLayers or updateRenderState).\r\n * This method also sets up the session manager's render target texture provider\r\n * as the first layer in the array, which feeds the WebXR camera(s) attached to the session.\r\n * @param wrappedLayers An array of WebXRLayerWrapper, usually returned from the WebXRLayers createLayer functions.\r\n */\r\n public setXRSessionLayers(wrappedLayers: Array<WebXRLayerWrapper> = this._existingLayers): void {\r\n // this._existingLayers = wrappedLayers;\r\n const renderStateInit: XRRenderStateInit = { ...this._xrSessionManager.session.renderState };\r\n // Clear out the layer-related fields.\r\n renderStateInit.baseLayer = undefined;\r\n renderStateInit.layers = wrappedLayers.map((wrappedLayer) => wrappedLayer.layer);\r\n this._xrSessionManager.updateRenderState(renderStateInit);\r\n if (!this._projectionLayerInitialized) {\r\n this._xrSessionManager._setBaseLayerWrapper(wrappedLayers.length > 0 ? wrappedLayers.at(0)! : null);\r\n }\r\n }\r\n\r\n public override isCompatible(): boolean {\r\n // TODO (rgerd): Add native support.\r\n return !this._xrSessionManager.isNative && typeof XRWebGLBinding !== \"undefined\" && !!XRWebGLBinding.prototype.createProjectionLayer;\r\n }\r\n\r\n /**\r\n * Dispose this feature and all of the resources attached.\r\n */\r\n public override dispose(): void {\r\n super.dispose();\r\n }\r\n\r\n protected _onXRFrame(_xrFrame: XRFrame): void {\r\n // Replace once the mapped internal texture of each available composition layer, apart from the last one, which is the projection layer that needs an RTT\r\n const layers = this._existingLayers;\r\n for (let i = 0; i < layers.length; ++i) {\r\n const layer = layers[i];\r\n if (layer.layerType !== \"XRProjectionLayer\") {\r\n // get the rtt provider\r\n const rttProvider = this._layerToRTTProviderMapping.get(layer.layer as XRCompositionLayer);\r\n if (!rttProvider) {\r\n continue;\r\n }\r\n\r\n if (rttProvider.layerWrapper.isMultiview) {\r\n // get the views, if we are in multiview\r\n const pose = _xrFrame.getViewerPose(this._xrSessionManager.referenceSpace);\r\n if (pose) {\r\n const views = pose.views;\r\n for (let j = 0; j < views.length; ++j) {\r\n const view = views[j];\r\n rttProvider.getRenderTargetTextureForView(view);\r\n }\r\n }\r\n } else {\r\n rttProvider.getRenderTargetTextureForView();\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n//register the plugin\r\nWebXRFeaturesManager.AddWebXRFeature(\r\n WebXRLayers.Name,\r\n (xrSessionManager, options) => {\r\n return () => new WebXRLayers(xrSessionManager, options);\r\n },\r\n WebXRLayers.Version,\r\n false\r\n);\r\n"]}
@@ -158,7 +158,9 @@ export class WebXRNearInteraction extends WebXRAbstractFeature {
158
158
  if (!super.attach()) {
159
159
  return false;
160
160
  }
161
- this._options.xrInput.controllers.forEach(this._attachController);
161
+ for (const controller of this._options.xrInput.controllers) {
162
+ this._attachController(controller);
163
+ }
162
164
  this._addNewAttachObserver(this._options.xrInput.onControllerAddedObservable, this._attachController);
163
165
  this._addNewAttachObserver(this._options.xrInput.onControllerRemovedObservable, (controller) => {
164
166
  // REMOVE the controller
@@ -177,9 +179,10 @@ export class WebXRNearInteraction extends WebXRAbstractFeature {
177
179
  if (!super.detach()) {
178
180
  return false;
179
181
  }
180
- Object.keys(this._controllers).forEach((controllerId) => {
182
+ const keys = Object.keys(this._controllers);
183
+ for (const controllerId of keys) {
181
184
  this._detachController(controllerId);
182
- });
185
+ }
183
186
  return true;
184
187
  }
185
188
  /**
@@ -312,7 +315,8 @@ export class WebXRNearInteraction extends WebXRAbstractFeature {
312
315
  controllerData.touchCollisionMesh.position.copyFrom(controllerData.grabRay.origin).scaleInPlace(this._xrSessionManager.worldScalingFactor);
313
316
  }
314
317
  _onXRFrame(_xrFrame) {
315
- Object.keys(this._controllers).forEach((id) => {
318
+ const keys = Object.keys(this._controllers);
319
+ for (const id of keys) {
316
320
  // only do this for the selected pointer
317
321
  const controllerData = this._controllers[id];
318
322
  const handData = controllerData.xrController?.inputSource.hand;
@@ -444,7 +448,7 @@ export class WebXRNearInteraction extends WebXRAbstractFeature {
444
448
  state = ControllerOrbAnimationState.HOVER;
445
449
  }
446
450
  this._handleTransitionAnimation(controllerData, state);
447
- });
451
+ }
448
452
  }
449
453
  get _utilityLayerScene() {
450
454
  return this._options.customUtilityLayerScene || UtilityLayerRenderer.DefaultUtilityLayer.utilityLayerScene;
@@ -609,12 +613,13 @@ export class WebXRNearInteraction extends WebXRAbstractFeature {
609
613
  this._xrSessionManager.onXRFrameObservable.remove(controllerData.onFrameObserver);
610
614
  }
611
615
  if (controllerData.eventListeners) {
612
- Object.keys(controllerData.eventListeners).forEach((eventName) => {
616
+ const keys = Object.keys(controllerData.eventListeners);
617
+ for (const eventName of keys) {
613
618
  const func = controllerData.eventListeners && controllerData.eventListeners[eventName];
614
619
  if (func) {
615
620
  this._xrSessionManager.session.removeEventListener(eventName, func);
616
621
  }
617
- });
622
+ }
618
623
  }
619
624
  controllerData.touchCollisionMesh.dispose();
620
625
  controllerData.pickedPointVisualCue.dispose();
@@ -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 _tmpVectors = [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 this._options.xrInput.controllers.forEach(this._attachController);\r\n this._addNewAttachObserver(this._options.xrInput.onControllerAddedObservable, this._attachController);\r\n this._addNewAttachObserver(this._options.xrInput.onControllerRemovedObservable, (controller) => {\r\n // REMOVE the controller\r\n this._detachController(controller.uniqueId);\r\n });\r\n\r\n this._scene.constantlyUpdateMeshUnderPointer = true;\r\n 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 Object.keys(this._controllers).forEach((controllerId) => {\r\n this._detachController(controllerId);\r\n });\r\n\r\n return true;\r\n }\r\n\r\n /**\r\n * Will get the mesh under a specific pointer.\r\n * `scene.meshUnderPointer` will only return one mesh - either left or right.\r\n * @param controllerId the controllerId to check\r\n * @returns The mesh under pointer or null if no mesh is under the pointer\r\n */\r\n public getMeshUnderPointer(controllerId: string): Nullable<AbstractMesh> {\r\n if (this._controllers[controllerId]) {\r\n return this._controllers[controllerId].meshUnderPointer;\r\n } else {\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Get the xr controller that correlates to the pointer id in the pointer event\r\n *\r\n * @param id the pointer id to search for\r\n * @returns the controller that correlates to this id or null if not found\r\n */\r\n public getXRControllerByPointerId(id: number): Nullable<WebXRInputSource> {\r\n const keys = Object.keys(this._controllers);\r\n\r\n for (let i = 0; i < keys.length; ++i) {\r\n if (this._controllers[keys[i]].id === id) {\r\n return this._controllers[keys[i]].xrController || null;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n /**\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 Object.keys(this._controllers).forEach((id) => {\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 Object.keys(controllerData.eventListeners).forEach((eventName: string) => {\r\n const func = controllerData.eventListeners && controllerData.eventListeners[eventName as XREventType];\r\n if (func) {\r\n this._xrSessionManager.session.removeEventListener(eventName as XREventType, func 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 = _tmpVectors[0];\r\n const tmpVec = _tmpVectors[1];\r\n _tmpVectors[2].setAll(0);\r\n _tmpVectors[3].setAll(0);\r\n\r\n const tmpRay = new Ray(_tmpVectors[2], _tmpVectors[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 _tmpVectors = [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 = _tmpVectors[0];\r\n const tmpVec = _tmpVectors[1];\r\n _tmpVectors[2].setAll(0);\r\n _tmpVectors[3].setAll(0);\r\n\r\n const tmpRay = new Ray(_tmpVectors[2], _tmpVectors[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"]}