@babylonjs/core 7.12.0 → 7.13.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (526) hide show
  1. package/Animations/animation.js +1 -2
  2. package/Animations/animation.js.map +1 -1
  3. package/Animations/animationGroupMask.d.ts +1 -1
  4. package/Animations/animationGroupMask.js +2 -2
  5. package/Animations/animationGroupMask.js.map +1 -1
  6. package/Animations/animationKey.d.ts +1 -1
  7. package/Animations/animationKey.js.map +1 -1
  8. package/Behaviors/Meshes/handConstraintBehavior.d.ts +3 -3
  9. package/Behaviors/Meshes/handConstraintBehavior.js +16 -17
  10. package/Behaviors/Meshes/handConstraintBehavior.js.map +1 -1
  11. package/Behaviors/Meshes/sixDofDragBehavior.js +2 -3
  12. package/Behaviors/Meshes/sixDofDragBehavior.js.map +1 -1
  13. package/Bones/bone.js +31 -32
  14. package/Bones/bone.js.map +1 -1
  15. package/Bones/boneIKController.js +5 -6
  16. package/Bones/boneIKController.js.map +1 -1
  17. package/Bones/boneLookController.js +13 -13
  18. package/Bones/boneLookController.js.map +1 -1
  19. package/Buffers/bufferUtils.d.ts +13 -0
  20. package/Buffers/bufferUtils.js +42 -0
  21. package/Buffers/bufferUtils.js.map +1 -0
  22. package/Buffers/index.d.ts +1 -0
  23. package/Buffers/index.js +1 -0
  24. package/Buffers/index.js.map +1 -1
  25. package/Cameras/Inputs/freeCameraMouseWheelInput.js +5 -6
  26. package/Cameras/Inputs/freeCameraMouseWheelInput.js.map +1 -1
  27. package/Cameras/Inputs/freeCameraVirtualJoystickInput.js +5 -5
  28. package/Cameras/Inputs/freeCameraVirtualJoystickInput.js.map +1 -1
  29. package/Cameras/VR/vrExperienceHelper.js +8 -10
  30. package/Cameras/VR/vrExperienceHelper.js.map +1 -1
  31. package/Compute/computeEffect.js +2 -3
  32. package/Compute/computeEffect.js.map +1 -1
  33. package/Compute/computeShader.js +19 -20
  34. package/Compute/computeShader.js.map +1 -1
  35. package/Culling/Helper/IBoundingInfoHelperPlatform.d.ts +4 -0
  36. package/Culling/Helper/IBoundingInfoHelperPlatform.js.map +1 -1
  37. package/Culling/Helper/boundingInfoHelper.d.ts +26 -4
  38. package/Culling/Helper/boundingInfoHelper.js +41 -10
  39. package/Culling/Helper/boundingInfoHelper.js.map +1 -1
  40. package/Culling/Helper/computeShaderBoundingHelper.d.ts +12 -3
  41. package/Culling/Helper/computeShaderBoundingHelper.js +164 -76
  42. package/Culling/Helper/computeShaderBoundingHelper.js.map +1 -1
  43. package/Culling/Helper/transformFeedbackBoundingHelper.d.ts +11 -0
  44. package/Culling/Helper/transformFeedbackBoundingHelper.js +46 -14
  45. package/Culling/Helper/transformFeedbackBoundingHelper.js.map +1 -1
  46. package/Debug/debugLayer.d.ts +1 -1
  47. package/Debug/debugLayer.js.map +1 -1
  48. package/Decorators/nodeDecorator.d.ts +1 -1
  49. package/Decorators/nodeDecorator.js +1 -1
  50. package/Decorators/nodeDecorator.js.map +1 -1
  51. package/DeviceInput/InputDevices/deviceEnums.d.ts +5 -5
  52. package/DeviceInput/InputDevices/deviceEnums.js.map +1 -1
  53. package/DeviceInput/eventFactory.js +3 -3
  54. package/DeviceInput/eventFactory.js.map +1 -1
  55. package/Engines/AbstractEngine/abstractEngine.cubeTexture.js +2 -2
  56. package/Engines/AbstractEngine/abstractEngine.cubeTexture.js.map +1 -1
  57. package/Engines/Extensions/engine.computeShader.d.ts +1 -1
  58. package/Engines/Extensions/engine.computeShader.js.map +1 -1
  59. package/Engines/Extensions/engine.cubeTexture.js +2 -2
  60. package/Engines/Extensions/engine.cubeTexture.js.map +1 -1
  61. package/Engines/Extensions/engine.dynamicTexture.js +2 -2
  62. package/Engines/Extensions/engine.dynamicTexture.js.map +1 -1
  63. package/Engines/Extensions/engine.multiRender.js +3 -3
  64. package/Engines/Extensions/engine.multiRender.js.map +1 -1
  65. package/Engines/Extensions/engine.multiview.js +2 -2
  66. package/Engines/Extensions/engine.multiview.js.map +1 -1
  67. package/Engines/Extensions/engine.prefilteredCubeTexture.js +3 -3
  68. package/Engines/Extensions/engine.prefilteredCubeTexture.js.map +1 -1
  69. package/Engines/Extensions/engine.rawTexture.js +4 -4
  70. package/Engines/Extensions/engine.rawTexture.js.map +1 -1
  71. package/Engines/Extensions/engine.renderTarget.js +3 -3
  72. package/Engines/Extensions/engine.renderTarget.js.map +1 -1
  73. package/Engines/Extensions/engine.renderTargetCube.js +2 -2
  74. package/Engines/Extensions/engine.renderTargetCube.js.map +1 -1
  75. package/Engines/Native/nativeShaderProcessors.js +1 -2
  76. package/Engines/Native/nativeShaderProcessors.js.map +1 -1
  77. package/Engines/Processors/shaderProcessor.js +2 -3
  78. package/Engines/Processors/shaderProcessor.js.map +1 -1
  79. package/Engines/WebGL/webGL2ShaderProcessors.js +1 -2
  80. package/Engines/WebGL/webGL2ShaderProcessors.js.map +1 -1
  81. package/Engines/WebGL/webGLShaderProcessors.js +1 -2
  82. package/Engines/WebGL/webGLShaderProcessors.js.map +1 -1
  83. package/Engines/WebGPU/Extensions/engine.computeShader.js +1 -2
  84. package/Engines/WebGPU/Extensions/engine.computeShader.js.map +1 -1
  85. package/Engines/WebGPU/Extensions/engine.cubeTexture.js +2 -2
  86. package/Engines/WebGPU/Extensions/engine.cubeTexture.js.map +1 -1
  87. package/Engines/WebGPU/Extensions/engine.dynamicTexture.js +2 -2
  88. package/Engines/WebGPU/Extensions/engine.dynamicTexture.js.map +1 -1
  89. package/Engines/WebGPU/Extensions/engine.multiRender.js +2 -2
  90. package/Engines/WebGPU/Extensions/engine.multiRender.js.map +1 -1
  91. package/Engines/WebGPU/Extensions/engine.rawTexture.js +5 -5
  92. package/Engines/WebGPU/Extensions/engine.rawTexture.js.map +1 -1
  93. package/Engines/WebGPU/Extensions/engine.renderTarget.js +3 -3
  94. package/Engines/WebGPU/Extensions/engine.renderTarget.js.map +1 -1
  95. package/Engines/WebGPU/Extensions/engine.renderTargetCube.js +2 -2
  96. package/Engines/WebGPU/Extensions/engine.renderTargetCube.js.map +1 -1
  97. package/Engines/WebGPU/webgpuBufferManager.js +1 -1
  98. package/Engines/WebGPU/webgpuBufferManager.js.map +1 -1
  99. package/Engines/WebGPU/webgpuCacheRenderPipeline.js +81 -82
  100. package/Engines/WebGPU/webgpuCacheRenderPipeline.js.map +1 -1
  101. package/Engines/WebGPU/webgpuCacheSampler.js +60 -64
  102. package/Engines/WebGPU/webgpuCacheSampler.js.map +1 -1
  103. package/Engines/WebGPU/webgpuClearQuad.js +1 -2
  104. package/Engines/WebGPU/webgpuClearQuad.js.map +1 -1
  105. package/Engines/WebGPU/webgpuComputeContext.js +13 -15
  106. package/Engines/WebGPU/webgpuComputeContext.js.map +1 -1
  107. package/Engines/WebGPU/webgpuConstants.d.ts +39 -39
  108. package/Engines/WebGPU/webgpuConstants.js.map +1 -1
  109. package/Engines/WebGPU/webgpuHardwareTexture.js +6 -8
  110. package/Engines/WebGPU/webgpuHardwareTexture.js.map +1 -1
  111. package/Engines/WebGPU/webgpuOcclusionQuery.js +1 -2
  112. package/Engines/WebGPU/webgpuOcclusionQuery.js.map +1 -1
  113. package/Engines/WebGPU/webgpuQuerySet.js +3 -3
  114. package/Engines/WebGPU/webgpuQuerySet.js.map +1 -1
  115. package/Engines/WebGPU/webgpuShaderProcessor.js +15 -19
  116. package/Engines/WebGPU/webgpuShaderProcessor.js.map +1 -1
  117. package/Engines/WebGPU/webgpuShaderProcessorsGLSL.js +8 -10
  118. package/Engines/WebGPU/webgpuShaderProcessorsGLSL.js.map +1 -1
  119. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js +26 -28
  120. package/Engines/WebGPU/webgpuShaderProcessorsWGSL.js.map +1 -1
  121. package/Engines/WebGPU/webgpuTextureHelper.js +413 -416
  122. package/Engines/WebGPU/webgpuTextureHelper.js.map +1 -1
  123. package/Engines/WebGPU/webgpuTextureManager.js +50 -51
  124. package/Engines/WebGPU/webgpuTextureManager.js.map +1 -1
  125. package/Engines/WebGPU/webgpuTimestampQuery.js +1 -2
  126. package/Engines/WebGPU/webgpuTimestampQuery.js.map +1 -1
  127. package/Engines/abstractEngine.js +4 -4
  128. package/Engines/abstractEngine.js.map +1 -1
  129. package/Engines/engine.js +2 -2
  130. package/Engines/engine.js.map +1 -1
  131. package/Engines/nativeEngine.js +9 -9
  132. package/Engines/nativeEngine.js.map +1 -1
  133. package/Engines/nullEngine.js +5 -5
  134. package/Engines/nullEngine.js.map +1 -1
  135. package/Engines/renderTargetWrapper.js +1 -2
  136. package/Engines/renderTargetWrapper.js.map +1 -1
  137. package/Engines/shaderStore.js +6 -7
  138. package/Engines/shaderStore.js.map +1 -1
  139. package/Engines/thinEngine.js +4 -5
  140. package/Engines/thinEngine.js.map +1 -1
  141. package/Engines/webgpuEngine.d.ts +11 -0
  142. package/Engines/webgpuEngine.js +91 -72
  143. package/Engines/webgpuEngine.js.map +1 -1
  144. package/Events/deviceInputEvents.d.ts +1 -1
  145. package/Events/deviceInputEvents.js.map +1 -1
  146. package/FlowGraph/flowGraph.d.ts +1 -1
  147. package/FlowGraph/flowGraph.js +5 -5
  148. package/FlowGraph/flowGraph.js.map +1 -1
  149. package/FlowGraph/flowGraphBlock.js +2 -3
  150. package/FlowGraph/flowGraphBlock.js.map +1 -1
  151. package/FlowGraph/flowGraphConnection.d.ts +1 -1
  152. package/FlowGraph/flowGraphConnection.js.map +1 -1
  153. package/FlowGraph/flowGraphDataConnection.js +3 -3
  154. package/FlowGraph/flowGraphDataConnection.js.map +1 -1
  155. package/FlowGraph/flowGraphExecutionBlock.js +2 -3
  156. package/FlowGraph/flowGraphExecutionBlock.js.map +1 -1
  157. package/FlowGraph/flowGraphSignalConnection.js +3 -3
  158. package/FlowGraph/flowGraphSignalConnection.js.map +1 -1
  159. package/Gamepads/dualShockGamepad.d.ts +2 -2
  160. package/Gamepads/dualShockGamepad.js +14 -14
  161. package/Gamepads/dualShockGamepad.js.map +1 -1
  162. package/Gamepads/xboxGamepad.d.ts +2 -2
  163. package/Gamepads/xboxGamepad.js +14 -14
  164. package/Gamepads/xboxGamepad.js.map +1 -1
  165. package/Gizmos/gizmo.d.ts +2 -2
  166. package/Gizmos/gizmo.js +4 -4
  167. package/Gizmos/gizmo.js.map +1 -1
  168. package/Gizmos/gizmoManager.js +2 -2
  169. package/Gizmos/gizmoManager.js.map +1 -1
  170. package/Gizmos/scaleGizmo.js +3 -3
  171. package/Gizmos/scaleGizmo.js.map +1 -1
  172. package/Loading/sceneLoader.d.ts +1 -1
  173. package/Loading/sceneLoader.js +6 -6
  174. package/Loading/sceneLoader.js.map +1 -1
  175. package/Materials/GreasedLine/greasedLineMaterialInterfaces.d.ts +3 -3
  176. package/Materials/GreasedLine/greasedLineMaterialInterfaces.js.map +1 -1
  177. package/Materials/GreasedLine/greasedLinePluginMaterial.js +10 -11
  178. package/Materials/GreasedLine/greasedLinePluginMaterial.js.map +1 -1
  179. package/Materials/GreasedLine/greasedLineSimpleMaterial.js +8 -9
  180. package/Materials/GreasedLine/greasedLineSimpleMaterial.js.map +1 -1
  181. package/Materials/Node/Blocks/Dual/currentScreenBlock.js +3 -4
  182. package/Materials/Node/Blocks/Dual/currentScreenBlock.js.map +1 -1
  183. package/Materials/Node/Blocks/Dual/fogBlock.js +2 -3
  184. package/Materials/Node/Blocks/Dual/fogBlock.js.map +1 -1
  185. package/Materials/Node/Blocks/Dual/imageSourceBlock.js +1 -2
  186. package/Materials/Node/Blocks/Dual/imageSourceBlock.js.map +1 -1
  187. package/Materials/Node/Blocks/Dual/lightBlock.js +5 -6
  188. package/Materials/Node/Blocks/Dual/lightBlock.js.map +1 -1
  189. package/Materials/Node/Blocks/Dual/reflectionTextureBaseBlock.js +4 -5
  190. package/Materials/Node/Blocks/Dual/reflectionTextureBaseBlock.js.map +1 -1
  191. package/Materials/Node/Blocks/Dual/sceneDepthBlock.js +7 -8
  192. package/Materials/Node/Blocks/Dual/sceneDepthBlock.js.map +1 -1
  193. package/Materials/Node/Blocks/Dual/textureBlock.js +4 -6
  194. package/Materials/Node/Blocks/Dual/textureBlock.js.map +1 -1
  195. package/Materials/Node/Blocks/Fragment/TBNBlock.js +2 -4
  196. package/Materials/Node/Blocks/Fragment/TBNBlock.js.map +1 -1
  197. package/Materials/Node/Blocks/Fragment/derivativeBlock.js +1 -2
  198. package/Materials/Node/Blocks/Fragment/derivativeBlock.js.map +1 -1
  199. package/Materials/Node/Blocks/Fragment/fragCoordBlock.js +1 -2
  200. package/Materials/Node/Blocks/Fragment/fragCoordBlock.js.map +1 -1
  201. package/Materials/Node/Blocks/Fragment/fragDepthBlock.js +1 -2
  202. package/Materials/Node/Blocks/Fragment/fragDepthBlock.js.map +1 -1
  203. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js +5 -6
  204. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js.map +1 -1
  205. package/Materials/Node/Blocks/Fragment/frontFacingBlock.js +1 -2
  206. package/Materials/Node/Blocks/Fragment/frontFacingBlock.js.map +1 -1
  207. package/Materials/Node/Blocks/Fragment/heightToNormalBlock.js +5 -6
  208. package/Materials/Node/Blocks/Fragment/heightToNormalBlock.js.map +1 -1
  209. package/Materials/Node/Blocks/Fragment/imageProcessingBlock.js +3 -4
  210. package/Materials/Node/Blocks/Fragment/imageProcessingBlock.js.map +1 -1
  211. package/Materials/Node/Blocks/Fragment/perturbNormalBlock.js +7 -9
  212. package/Materials/Node/Blocks/Fragment/perturbNormalBlock.js.map +1 -1
  213. package/Materials/Node/Blocks/Fragment/screenSizeBlock.js +1 -2
  214. package/Materials/Node/Blocks/Fragment/screenSizeBlock.js.map +1 -1
  215. package/Materials/Node/Blocks/Input/inputBlock.js +19 -21
  216. package/Materials/Node/Blocks/Input/inputBlock.js.map +1 -1
  217. package/Materials/Node/Blocks/Input/prePassTextureBlock.js +3 -4
  218. package/Materials/Node/Blocks/Input/prePassTextureBlock.js.map +1 -1
  219. package/Materials/Node/Blocks/PBR/anisotropyBlock.js +2 -3
  220. package/Materials/Node/Blocks/PBR/anisotropyBlock.js.map +1 -1
  221. package/Materials/Node/Blocks/PBR/clearCoatBlock.js +4 -5
  222. package/Materials/Node/Blocks/PBR/clearCoatBlock.js.map +1 -1
  223. package/Materials/Node/Blocks/PBR/iridescenceBlock.js +1 -2
  224. package/Materials/Node/Blocks/PBR/iridescenceBlock.js.map +1 -1
  225. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js +28 -29
  226. package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js.map +1 -1
  227. package/Materials/Node/Blocks/PBR/reflectionBlock.js +4 -5
  228. package/Materials/Node/Blocks/PBR/reflectionBlock.js.map +1 -1
  229. package/Materials/Node/Blocks/PBR/refractionBlock.js +5 -6
  230. package/Materials/Node/Blocks/PBR/refractionBlock.js.map +1 -1
  231. package/Materials/Node/Blocks/PBR/sheenBlock.js +4 -5
  232. package/Materials/Node/Blocks/PBR/sheenBlock.js.map +1 -1
  233. package/Materials/Node/Blocks/PBR/subSurfaceBlock.js +2 -3
  234. package/Materials/Node/Blocks/PBR/subSurfaceBlock.js.map +1 -1
  235. package/Materials/Node/Blocks/Vertex/instancesBlock.js +1 -2
  236. package/Materials/Node/Blocks/Vertex/instancesBlock.js.map +1 -1
  237. package/Materials/Node/Blocks/Vertex/lightInformationBlock.js +1 -2
  238. package/Materials/Node/Blocks/Vertex/lightInformationBlock.js.map +1 -1
  239. package/Materials/Node/Blocks/Vertex/morphTargetsBlock.js +1 -2
  240. package/Materials/Node/Blocks/Vertex/morphTargetsBlock.js.map +1 -1
  241. package/Materials/Node/Blocks/Vertex/vertexOutputBlock.js +1 -2
  242. package/Materials/Node/Blocks/Vertex/vertexOutputBlock.js.map +1 -1
  243. package/Materials/Node/Blocks/arcTan2Block.js +1 -2
  244. package/Materials/Node/Blocks/arcTan2Block.js.map +1 -1
  245. package/Materials/Node/Blocks/biPlanarBlock.js +3 -4
  246. package/Materials/Node/Blocks/biPlanarBlock.js.map +1 -1
  247. package/Materials/Node/Blocks/clampBlock.js +4 -5
  248. package/Materials/Node/Blocks/clampBlock.js.map +1 -1
  249. package/Materials/Node/Blocks/cloudBlock.js +3 -4
  250. package/Materials/Node/Blocks/cloudBlock.js.map +1 -1
  251. package/Materials/Node/Blocks/curveBlock.js +1 -2
  252. package/Materials/Node/Blocks/curveBlock.js.map +1 -1
  253. package/Materials/Node/Blocks/customBlock.js +1 -2
  254. package/Materials/Node/Blocks/customBlock.js.map +1 -1
  255. package/Materials/Node/Blocks/matrixBuilderBlock.js +1 -2
  256. package/Materials/Node/Blocks/matrixBuilderBlock.js.map +1 -1
  257. package/Materials/Node/Blocks/meshAttributeExistsBlock.d.ts +1 -1
  258. package/Materials/Node/Blocks/meshAttributeExistsBlock.js +35 -35
  259. package/Materials/Node/Blocks/meshAttributeExistsBlock.js.map +1 -1
  260. package/Materials/Node/Blocks/modBlock.js +1 -2
  261. package/Materials/Node/Blocks/modBlock.js.map +1 -1
  262. package/Materials/Node/Blocks/remapBlock.js +3 -3
  263. package/Materials/Node/Blocks/remapBlock.js.map +1 -1
  264. package/Materials/Node/Blocks/simplexPerlin3DBlock.js +1 -2
  265. package/Materials/Node/Blocks/simplexPerlin3DBlock.js.map +1 -1
  266. package/Materials/Node/Blocks/transformBlock.js +1 -2
  267. package/Materials/Node/Blocks/transformBlock.js.map +1 -1
  268. package/Materials/Node/Blocks/triPlanarBlock.js +10 -12
  269. package/Materials/Node/Blocks/triPlanarBlock.js.map +1 -1
  270. package/Materials/Node/Blocks/voronoiNoiseBlock.js +3 -4
  271. package/Materials/Node/Blocks/voronoiNoiseBlock.js.map +1 -1
  272. package/Materials/Node/Blocks/waveBlock.d.ts +1 -1
  273. package/Materials/Node/Blocks/waveBlock.js +4 -4
  274. package/Materials/Node/Blocks/waveBlock.js.map +1 -1
  275. package/Materials/Node/Blocks/worleyNoise3DBlock.js +3 -4
  276. package/Materials/Node/Blocks/worleyNoise3DBlock.js.map +1 -1
  277. package/Materials/Node/Enums/nodeMaterialBlockConnectionPointMode.d.ts +1 -1
  278. package/Materials/Node/Enums/nodeMaterialBlockConnectionPointMode.js.map +1 -1
  279. package/Materials/Node/nodeMaterial.js +3 -4
  280. package/Materials/Node/nodeMaterial.js.map +1 -1
  281. package/Materials/Node/nodeMaterialBlock.js +5 -6
  282. package/Materials/Node/nodeMaterialBlock.js.map +1 -1
  283. package/Materials/Node/nodeMaterialBlockConnectionPoint.d.ts +2 -2
  284. package/Materials/Node/nodeMaterialBlockConnectionPoint.js +10 -10
  285. package/Materials/Node/nodeMaterialBlockConnectionPoint.js.map +1 -1
  286. package/Materials/Node/nodeMaterialBuildState.js +18 -19
  287. package/Materials/Node/nodeMaterialBuildState.js.map +1 -1
  288. package/Materials/Node/nodeMaterialConnectionPointCustomObject.js +3 -3
  289. package/Materials/Node/nodeMaterialConnectionPointCustomObject.js.map +1 -1
  290. package/Materials/PBR/pbrBaseMaterial.js +3 -4
  291. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  292. package/Materials/Textures/internalTexture.d.ts +1 -1
  293. package/Materials/Textures/internalTexture.js +13 -13
  294. package/Materials/Textures/internalTexture.js.map +1 -1
  295. package/Materials/Textures/ktx2decoderTypes.d.ts +1 -1
  296. package/Materials/Textures/ktx2decoderTypes.js.map +1 -1
  297. package/Materials/Textures/rawCubeTexture.js +1 -2
  298. package/Materials/Textures/rawCubeTexture.js.map +1 -1
  299. package/Materials/effect.functions.js +2 -3
  300. package/Materials/effect.functions.js.map +1 -1
  301. package/Materials/effect.js +3 -4
  302. package/Materials/effect.js.map +1 -1
  303. package/Materials/effect.webgl.functions.js +1 -2
  304. package/Materials/effect.webgl.functions.js.map +1 -1
  305. package/Materials/material.js +7 -9
  306. package/Materials/material.js.map +1 -1
  307. package/Materials/materialPluginEvent.d.ts +1 -1
  308. package/Materials/materialPluginEvent.js.map +1 -1
  309. package/Materials/materialPluginManager.js +9 -11
  310. package/Materials/materialPluginManager.js.map +1 -1
  311. package/Materials/meshDebugPluginMaterial.d.ts +1 -1
  312. package/Materials/meshDebugPluginMaterial.js +2 -2
  313. package/Materials/meshDebugPluginMaterial.js.map +1 -1
  314. package/Materials/shaderLanguage.d.ts +1 -1
  315. package/Materials/shaderLanguage.js.map +1 -1
  316. package/Materials/shadowDepthWrapper.js +1 -2
  317. package/Materials/shadowDepthWrapper.js.map +1 -1
  318. package/Materials/standardMaterial.js +2 -3
  319. package/Materials/standardMaterial.js.map +1 -1
  320. package/Maths/math.axis.d.ts +2 -2
  321. package/Maths/math.axis.js.map +1 -1
  322. package/Maths/math.path.d.ts +1 -1
  323. package/Maths/math.path.js +3 -3
  324. package/Maths/math.path.js.map +1 -1
  325. package/Maths/math.vector.js +32 -6
  326. package/Maths/math.vector.js.map +1 -1
  327. package/Meshes/Builders/greasedLineBuilder.d.ts +2 -2
  328. package/Meshes/Builders/greasedLineBuilder.js +21 -23
  329. package/Meshes/Builders/greasedLineBuilder.js.map +1 -1
  330. package/Meshes/GreasedLine/greasedLineBaseMesh.d.ts +3 -3
  331. package/Meshes/GreasedLine/greasedLineBaseMesh.js.map +1 -1
  332. package/Meshes/GreasedLine/greasedLineRibbonMesh.js +14 -14
  333. package/Meshes/GreasedLine/greasedLineRibbonMesh.js.map +1 -1
  334. package/Meshes/Node/Blocks/Instances/instantiateBaseBlock.js +2 -2
  335. package/Meshes/Node/Blocks/Instances/instantiateBaseBlock.js.map +1 -1
  336. package/Meshes/Node/Blocks/Instances/instantiateOnFacesBlock.js +2 -2
  337. package/Meshes/Node/Blocks/Instances/instantiateOnFacesBlock.js.map +1 -1
  338. package/Meshes/Node/Blocks/Instances/instantiateOnVerticesBlock.js +3 -3
  339. package/Meshes/Node/Blocks/Instances/instantiateOnVerticesBlock.js.map +1 -1
  340. package/Meshes/Node/Blocks/Instances/instantiateOnVolumeBlock.js +3 -3
  341. package/Meshes/Node/Blocks/Instances/instantiateOnVolumeBlock.js.map +1 -1
  342. package/Meshes/Node/Blocks/Set/setColorsBlock.js +2 -2
  343. package/Meshes/Node/Blocks/Set/setColorsBlock.js.map +1 -1
  344. package/Meshes/Node/Blocks/Set/setMaterialIDBlock.js +2 -2
  345. package/Meshes/Node/Blocks/Set/setMaterialIDBlock.js.map +1 -1
  346. package/Meshes/Node/Blocks/Set/setNormalsBlock.js +2 -2
  347. package/Meshes/Node/Blocks/Set/setNormalsBlock.js.map +1 -1
  348. package/Meshes/Node/Blocks/Set/setPositionsBlock.js +2 -2
  349. package/Meshes/Node/Blocks/Set/setPositionsBlock.js.map +1 -1
  350. package/Meshes/Node/Blocks/Set/setTangentsBlock.js +2 -2
  351. package/Meshes/Node/Blocks/Set/setTangentsBlock.js.map +1 -1
  352. package/Meshes/Node/Blocks/Set/setUVsBlock.js +3 -3
  353. package/Meshes/Node/Blocks/Set/setUVsBlock.js.map +1 -1
  354. package/Meshes/Node/Blocks/Sources/boxBlock.js +2 -2
  355. package/Meshes/Node/Blocks/Sources/boxBlock.js.map +1 -1
  356. package/Meshes/Node/Blocks/Sources/capsuleBlock.js +2 -2
  357. package/Meshes/Node/Blocks/Sources/capsuleBlock.js.map +1 -1
  358. package/Meshes/Node/Blocks/Sources/cylinderBlock.js +2 -2
  359. package/Meshes/Node/Blocks/Sources/cylinderBlock.js.map +1 -1
  360. package/Meshes/Node/Blocks/Sources/discBlock.js +2 -2
  361. package/Meshes/Node/Blocks/Sources/discBlock.js.map +1 -1
  362. package/Meshes/Node/Blocks/Sources/gridBlock.js +2 -2
  363. package/Meshes/Node/Blocks/Sources/gridBlock.js.map +1 -1
  364. package/Meshes/Node/Blocks/Sources/icoSphereBlock.js +2 -2
  365. package/Meshes/Node/Blocks/Sources/icoSphereBlock.js.map +1 -1
  366. package/Meshes/Node/Blocks/Sources/meshBlock.js +2 -2
  367. package/Meshes/Node/Blocks/Sources/meshBlock.js.map +1 -1
  368. package/Meshes/Node/Blocks/Sources/planeBlock.js +2 -2
  369. package/Meshes/Node/Blocks/Sources/planeBlock.js.map +1 -1
  370. package/Meshes/Node/Blocks/Sources/sphereBlock.js +2 -2
  371. package/Meshes/Node/Blocks/Sources/sphereBlock.js.map +1 -1
  372. package/Meshes/Node/Blocks/Sources/torusBlock.js +2 -2
  373. package/Meshes/Node/Blocks/Sources/torusBlock.js.map +1 -1
  374. package/Meshes/Node/Blocks/Textures/geometryTextureBlock.js +2 -2
  375. package/Meshes/Node/Blocks/Textures/geometryTextureBlock.js.map +1 -1
  376. package/Meshes/Node/Blocks/Textures/geometryTextureFetchBlock.js +2 -2
  377. package/Meshes/Node/Blocks/Textures/geometryTextureFetchBlock.js.map +1 -1
  378. package/Meshes/Node/Blocks/booleanGeometryBlock.js +3 -3
  379. package/Meshes/Node/Blocks/booleanGeometryBlock.js.map +1 -1
  380. package/Meshes/Node/Blocks/conditionBlock.js +2 -2
  381. package/Meshes/Node/Blocks/conditionBlock.js.map +1 -1
  382. package/Meshes/Node/Blocks/geometryClampBlock.js +3 -3
  383. package/Meshes/Node/Blocks/geometryClampBlock.js.map +1 -1
  384. package/Meshes/Node/Blocks/geometryCollectionBlock.js +2 -2
  385. package/Meshes/Node/Blocks/geometryCollectionBlock.js.map +1 -1
  386. package/Meshes/Node/Blocks/geometryCurveBlock.js +2 -2
  387. package/Meshes/Node/Blocks/geometryCurveBlock.js.map +1 -1
  388. package/Meshes/Node/Blocks/geometryOptimizeBlock.js +3 -3
  389. package/Meshes/Node/Blocks/geometryOptimizeBlock.js.map +1 -1
  390. package/Meshes/Node/Blocks/geometryTransformBlock.js +2 -2
  391. package/Meshes/Node/Blocks/geometryTransformBlock.js.map +1 -1
  392. package/Meshes/Node/Blocks/geometryTrigonometryBlock.js +2 -2
  393. package/Meshes/Node/Blocks/geometryTrigonometryBlock.js.map +1 -1
  394. package/Meshes/Node/Blocks/mappingBlock.js +2 -2
  395. package/Meshes/Node/Blocks/mappingBlock.js.map +1 -1
  396. package/Meshes/Node/Blocks/mathBlock.js +2 -2
  397. package/Meshes/Node/Blocks/mathBlock.js.map +1 -1
  398. package/Meshes/Node/Blocks/mergeGeometryBlock.js +2 -2
  399. package/Meshes/Node/Blocks/mergeGeometryBlock.js.map +1 -1
  400. package/Meshes/Node/Blocks/randomBlock.js +2 -2
  401. package/Meshes/Node/Blocks/randomBlock.js.map +1 -1
  402. package/Meshes/Node/nodeGeometryBlock.js +3 -3
  403. package/Meshes/Node/nodeGeometryBlock.js.map +1 -1
  404. package/Meshes/Node/nodeGeometryBlockConnectionPoint.d.ts +2 -2
  405. package/Meshes/Node/nodeGeometryBlockConnectionPoint.js +7 -7
  406. package/Meshes/Node/nodeGeometryBlockConnectionPoint.js.map +1 -1
  407. package/Meshes/abstractMesh.d.ts +49 -17
  408. package/Meshes/abstractMesh.js +128 -133
  409. package/Meshes/abstractMesh.js.map +1 -1
  410. package/Meshes/geometry.d.ts +8 -0
  411. package/Meshes/geometry.js +17 -0
  412. package/Meshes/geometry.js.map +1 -1
  413. package/Meshes/instancedMesh.d.ts +5 -8
  414. package/Meshes/instancedMesh.js +15 -9
  415. package/Meshes/instancedMesh.js.map +1 -1
  416. package/Meshes/mesh.d.ts +7 -3
  417. package/Meshes/mesh.js +21 -13
  418. package/Meshes/mesh.js.map +1 -1
  419. package/Meshes/meshSimplification.d.ts +1 -1
  420. package/Meshes/meshSimplification.js +1 -1
  421. package/Meshes/meshSimplification.js.map +1 -1
  422. package/Meshes/meshSimplificationSceneComponent.js +2 -2
  423. package/Meshes/meshSimplificationSceneComponent.js.map +1 -1
  424. package/Meshes/transformNode.js +7 -8
  425. package/Meshes/transformNode.js.map +1 -1
  426. package/Misc/assetsManager.d.ts +1 -1
  427. package/Misc/assetsManager.js +9 -9
  428. package/Misc/assetsManager.js.map +1 -1
  429. package/Misc/basis.js +2 -2
  430. package/Misc/basis.js.map +1 -1
  431. package/Misc/copyTextureToTexture.d.ts +1 -1
  432. package/Misc/copyTextureToTexture.js +1 -1
  433. package/Misc/copyTextureToTexture.js.map +1 -1
  434. package/Misc/environmentTextureTools.js +3 -3
  435. package/Misc/environmentTextureTools.js.map +1 -1
  436. package/Misc/iInspectable.d.ts +1 -1
  437. package/Misc/iInspectable.js.map +1 -1
  438. package/Misc/khronosTextureContainer2.js +2 -2
  439. package/Misc/khronosTextureContainer2.js.map +1 -1
  440. package/Misc/timer.d.ts +1 -1
  441. package/Misc/timer.js +5 -5
  442. package/Misc/timer.js.map +1 -1
  443. package/Misc/virtualJoystick.d.ts +1 -1
  444. package/Misc/virtualJoystick.js +16 -16
  445. package/Misc/virtualJoystick.js.map +1 -1
  446. package/Particles/particleSystem.js +3 -3
  447. package/Particles/particleSystem.js.map +1 -1
  448. package/Particles/particleSystemComponent.js +1 -2
  449. package/Particles/particleSystemComponent.js.map +1 -1
  450. package/Particles/pointsCloudSystem.d.ts +1 -1
  451. package/Particles/pointsCloudSystem.js +14 -14
  452. package/Particles/pointsCloudSystem.js.map +1 -1
  453. package/Particles/subEmitter.d.ts +1 -1
  454. package/Particles/subEmitter.js +1 -1
  455. package/Particles/subEmitter.js.map +1 -1
  456. package/Physics/physicsHelper.d.ts +2 -2
  457. package/Physics/physicsHelper.js +6 -7
  458. package/Physics/physicsHelper.js.map +1 -1
  459. package/Physics/v1/physicsImpostor.js +4 -5
  460. package/Physics/v1/physicsImpostor.js.map +1 -1
  461. package/Physics/v2/IPhysicsEnginePlugin.d.ts +16 -8
  462. package/Physics/v2/IPhysicsEnginePlugin.js +9 -0
  463. package/Physics/v2/IPhysicsEnginePlugin.js.map +1 -1
  464. package/Physics/v2/Plugins/havokPlugin.js +96 -79
  465. package/Physics/v2/Plugins/havokPlugin.js.map +1 -1
  466. package/Physics/v2/physicsAggregate.js +8 -9
  467. package/Physics/v2/physicsAggregate.js.map +1 -1
  468. package/Physics/v2/physicsBody.d.ts +14 -2
  469. package/Physics/v2/physicsBody.js +30 -11
  470. package/Physics/v2/physicsBody.js.map +1 -1
  471. package/Physics/v2/physicsConstraint.js +8 -9
  472. package/Physics/v2/physicsConstraint.js.map +1 -1
  473. package/Physics/v2/physicsMaterial.d.ts +1 -1
  474. package/Physics/v2/physicsMaterial.js.map +1 -1
  475. package/Physics/v2/physicsShape.js +9 -10
  476. package/Physics/v2/physicsShape.js.map +1 -1
  477. package/Physics/v2/ragdoll.js +11 -12
  478. package/Physics/v2/ragdoll.js.map +1 -1
  479. package/PostProcesses/RenderPipeline/Pipelines/defaultRenderingPipeline.js +2 -2
  480. package/PostProcesses/RenderPipeline/Pipelines/defaultRenderingPipeline.js.map +1 -1
  481. package/PostProcesses/depthOfFieldEffect.d.ts +1 -1
  482. package/PostProcesses/depthOfFieldEffect.js +3 -3
  483. package/PostProcesses/depthOfFieldEffect.js.map +1 -1
  484. package/PostProcesses/postProcess.js +2 -3
  485. package/PostProcesses/postProcess.js.map +1 -1
  486. package/PostProcesses/tonemapPostProcess.d.ts +1 -1
  487. package/PostProcesses/tonemapPostProcess.js +4 -4
  488. package/PostProcesses/tonemapPostProcess.js.map +1 -1
  489. package/Rendering/fluidRenderer/fluidRenderingTargetRenderer.d.ts +1 -1
  490. package/Rendering/fluidRenderer/fluidRenderingTargetRenderer.js +10 -10
  491. package/Rendering/fluidRenderer/fluidRenderingTargetRenderer.js.map +1 -1
  492. package/Shaders/spriteMap.fragment.js +3 -2
  493. package/Shaders/spriteMap.fragment.js.map +1 -1
  494. package/ShadersWGSL/boundingInfo.compute.js +8 -8
  495. package/ShadersWGSL/boundingInfo.compute.js.map +1 -1
  496. package/XR/features/WebXRDepthSensing.js +2 -2
  497. package/XR/features/WebXRDepthSensing.js.map +1 -1
  498. package/XR/features/WebXRHandTracking.d.ts +2 -2
  499. package/XR/features/WebXRHandTracking.js +76 -76
  500. package/XR/features/WebXRHandTracking.js.map +1 -1
  501. package/XR/features/WebXRLightEstimation.js +2 -2
  502. package/XR/features/WebXRLightEstimation.js.map +1 -1
  503. package/XR/features/WebXRNearInteraction.d.ts +1 -1
  504. package/XR/features/WebXRNearInteraction.js +5 -5
  505. package/XR/features/WebXRNearInteraction.js.map +1 -1
  506. package/XR/features/WebXRRawCameraAccess.js +2 -2
  507. package/XR/features/WebXRRawCameraAccess.js.map +1 -1
  508. package/XR/motionController/webXRProfiledMotionController.js +2 -2
  509. package/XR/motionController/webXRProfiledMotionController.js.map +1 -1
  510. package/XR/webXRCamera.js +3 -4
  511. package/XR/webXRCamera.js.map +1 -1
  512. package/XR/webXREnterExitUI.js +3 -4
  513. package/XR/webXREnterExitUI.js.map +1 -1
  514. package/XR/webXRExperienceHelper.js +12 -13
  515. package/XR/webXRExperienceHelper.js.map +1 -1
  516. package/XR/webXRManagedOutputCanvas.d.ts +1 -1
  517. package/XR/webXRManagedOutputCanvas.js +15 -6
  518. package/XR/webXRManagedOutputCanvas.js.map +1 -1
  519. package/XR/webXRRenderTargetTextureProvider.js +2 -2
  520. package/XR/webXRRenderTargetTextureProvider.js.map +1 -1
  521. package/XR/webXRTypes.d.ts +2 -2
  522. package/XR/webXRTypes.js.map +1 -1
  523. package/package.json +1 -1
  524. package/scene.d.ts +1 -1
  525. package/scene.js +4 -4
  526. package/scene.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"animationKey.js","sourceRoot":"","sources":["../../../../dev/core/src/Animations/animationKey.ts"],"names":[],"mappings":"AAoCA;;GAEG;AACH,MAAM,CAAN,IAAY,yBASX;AATD,WAAY,yBAAyB;IACjC;;OAEG;IACH,yEAAQ,CAAA;IACR;;OAEG;IACH,yEAAQ,CAAA;AACZ,CAAC,EATW,yBAAyB,KAAzB,yBAAyB,QASpC","sourcesContent":["import type { IEasingFunction } from \"./easing\";\r\n\r\n/**\r\n * Defines an interface which represents an animation key frame\r\n */\r\nexport interface IAnimationKey {\r\n /**\r\n * Frame of the key frame\r\n */\r\n frame: number;\r\n /**\r\n * Value at the specifies key frame\r\n */\r\n value: any;\r\n /**\r\n * The input tangent for the cubic hermite spline\r\n */\r\n inTangent?: any;\r\n /**\r\n * The output tangent for the cubic hermite spline\r\n */\r\n outTangent?: any;\r\n /**\r\n * The animation interpolation type\r\n */\r\n interpolation?: AnimationKeyInterpolation;\r\n /**\r\n * Property defined by UI tools to link (or not ) the tangents\r\n */\r\n lockedTangent?: boolean;\r\n /**\r\n * The easing function associated with the key frame (optional). If not defined, the easing function defined at the animation level (if any) will be used instead\r\n */\r\n easingFunction?: IEasingFunction;\r\n}\r\n\r\n/**\r\n * Enum for the animation key frame interpolation type\r\n */\r\nexport enum AnimationKeyInterpolation {\r\n /**\r\n * Use tangents to interpolate between start and end values.\r\n */\r\n NONE = 0,\r\n /**\r\n * Do not interpolate between keys and use the start key value only. Tangents are ignored\r\n */\r\n STEP = 1,\r\n}\r\n"]}
1
+ {"version":3,"file":"animationKey.js","sourceRoot":"","sources":["../../../../dev/core/src/Animations/animationKey.ts"],"names":[],"mappings":"AAoCA;;GAEG;AACH,MAAM,CAAN,IAAkB,yBASjB;AATD,WAAkB,yBAAyB;IACvC;;OAEG;IACH,yEAAQ,CAAA;IACR;;OAEG;IACH,yEAAQ,CAAA;AACZ,CAAC,EATiB,yBAAyB,KAAzB,yBAAyB,QAS1C","sourcesContent":["import type { IEasingFunction } from \"./easing\";\r\n\r\n/**\r\n * Defines an interface which represents an animation key frame\r\n */\r\nexport interface IAnimationKey {\r\n /**\r\n * Frame of the key frame\r\n */\r\n frame: number;\r\n /**\r\n * Value at the specifies key frame\r\n */\r\n value: any;\r\n /**\r\n * The input tangent for the cubic hermite spline\r\n */\r\n inTangent?: any;\r\n /**\r\n * The output tangent for the cubic hermite spline\r\n */\r\n outTangent?: any;\r\n /**\r\n * The animation interpolation type\r\n */\r\n interpolation?: AnimationKeyInterpolation;\r\n /**\r\n * Property defined by UI tools to link (or not ) the tangents\r\n */\r\n lockedTangent?: boolean;\r\n /**\r\n * The easing function associated with the key frame (optional). If not defined, the easing function defined at the animation level (if any) will be used instead\r\n */\r\n easingFunction?: IEasingFunction;\r\n}\r\n\r\n/**\r\n * Enum for the animation key frame interpolation type\r\n */\r\nexport const enum AnimationKeyInterpolation {\r\n /**\r\n * Use tangents to interpolate between start and end values.\r\n */\r\n NONE = 0,\r\n /**\r\n * Do not interpolate between keys and use the start key value only. Tangents are ignored\r\n */\r\n STEP = 1,\r\n}\r\n"]}
@@ -5,7 +5,7 @@ import type { Behavior } from "../behavior";
5
5
  /**
6
6
  * Zones around the hand
7
7
  */
8
- export declare enum HandConstraintZone {
8
+ export declare const enum HandConstraintZone {
9
9
  /**
10
10
  * Above finger tips
11
11
  */
@@ -26,7 +26,7 @@ export declare enum HandConstraintZone {
26
26
  /**
27
27
  * Orientations for the hand zones and for the attached node
28
28
  */
29
- export declare enum HandConstraintOrientation {
29
+ export declare const enum HandConstraintOrientation {
30
30
  /**
31
31
  * Orientation is towards the camera
32
32
  */
@@ -39,7 +39,7 @@ export declare enum HandConstraintOrientation {
39
39
  /**
40
40
  * Orientations for the hand zones and for the attached node
41
41
  */
42
- export declare enum HandConstraintVisibility {
42
+ export declare const enum HandConstraintVisibility {
43
43
  /**
44
44
  * Constraint is always visible
45
45
  */
@@ -1,5 +1,4 @@
1
1
  import { WebXRFeatureName } from "../../XR/webXRFeaturesManager.js";
2
- import { WebXRHandJoint } from "../../XR/features/WebXRHandTracking.js";
3
2
  import { Quaternion, TmpVectors, Vector3 } from "../../Maths/math.vector.js";
4
3
  import { Tools } from "../../Misc/tools.js";
5
4
  /**
@@ -75,7 +74,7 @@ export class HandConstraintBehavior {
75
74
  /**
76
75
  * Sets the HandConstraintVisibility level for the hand constraint
77
76
  */
78
- this.handConstraintVisibility = HandConstraintVisibility.PALM_AND_GAZE;
77
+ this.handConstraintVisibility = 3 /* HandConstraintVisibility.PALM_AND_GAZE */;
79
78
  /**
80
79
  * A number from 0.0 to 1.0, marking how restricted the direction the palm faces is for the attached node to be enabled.
81
80
  * A 1 means the palm must be directly facing the user before the node is enabled, a 0 means it is always enabled.
@@ -94,15 +93,15 @@ export class HandConstraintBehavior {
94
93
  /**
95
94
  * Where to place the node regarding the center of the hand.
96
95
  */
97
- this.targetZone = HandConstraintZone.ULNAR_SIDE;
96
+ this.targetZone = 2 /* HandConstraintZone.ULNAR_SIDE */;
98
97
  /**
99
98
  * Orientation mode of the 4 zones around the hand
100
99
  */
101
- this.zoneOrientationMode = HandConstraintOrientation.HAND_ROTATION;
100
+ this.zoneOrientationMode = 1 /* HandConstraintOrientation.HAND_ROTATION */;
102
101
  /**
103
102
  * Orientation mode of the node attached to this behavior
104
103
  */
105
- this.nodeOrientationMode = HandConstraintOrientation.HAND_ROTATION;
104
+ this.nodeOrientationMode = 1 /* HandConstraintOrientation.HAND_ROTATION */;
106
105
  /**
107
106
  * Set the hand this behavior should follow. If set to "none", it will follow any visible hand (prioritising the left one).
108
107
  */
@@ -113,10 +112,10 @@ export class HandConstraintBehavior {
113
112
  */
114
113
  this.lerpTime = 100;
115
114
  // For a right hand
116
- this._zoneAxis[HandConstraintZone.ABOVE_FINGER_TIPS] = new Vector3(0, 1, 0);
117
- this._zoneAxis[HandConstraintZone.RADIAL_SIDE] = new Vector3(-1, 0, 0);
118
- this._zoneAxis[HandConstraintZone.ULNAR_SIDE] = new Vector3(1, 0, 0);
119
- this._zoneAxis[HandConstraintZone.BELOW_WRIST] = new Vector3(0, -1, 0);
115
+ this._zoneAxis[0 /* HandConstraintZone.ABOVE_FINGER_TIPS */] = new Vector3(0, 1, 0);
116
+ this._zoneAxis[1 /* HandConstraintZone.RADIAL_SIDE */] = new Vector3(-1, 0, 0);
117
+ this._zoneAxis[2 /* HandConstraintZone.ULNAR_SIDE */] = new Vector3(1, 0, 0);
118
+ this._zoneAxis[3 /* HandConstraintZone.BELOW_WRIST */] = new Vector3(0, -1, 0);
120
119
  }
121
120
  /** gets or sets behavior's name */
122
121
  get name() {
@@ -143,9 +142,9 @@ export class HandConstraintBehavior {
143
142
  hand = this._handTracking.getHandByHandedness(this.handedness);
144
143
  }
145
144
  if (hand) {
146
- const pinkyMetacarpal = hand.getJointMesh(WebXRHandJoint.PINKY_FINGER_METACARPAL);
147
- const middleMetacarpal = hand.getJointMesh(WebXRHandJoint.MIDDLE_FINGER_METACARPAL);
148
- const wrist = hand.getJointMesh(WebXRHandJoint.WRIST);
145
+ const pinkyMetacarpal = hand.getJointMesh("pinky-finger-metacarpal" /* WebXRHandJoint.PINKY_FINGER_METACARPAL */);
146
+ const middleMetacarpal = hand.getJointMesh("middle-finger-metacarpal" /* WebXRHandJoint.MIDDLE_FINGER_METACARPAL */);
147
+ const wrist = hand.getJointMesh("wrist" /* WebXRHandJoint.WRIST */);
149
148
  if (wrist && middleMetacarpal && pinkyMetacarpal) {
150
149
  const handPose = { position: middleMetacarpal.absolutePosition, quaternion: new Quaternion(), id: hand.xrController.uniqueId };
151
150
  // palm forward
@@ -188,7 +187,7 @@ export class HandConstraintBehavior {
188
187
  const camera = this._scene.activeCamera;
189
188
  zoneOffset.copyFrom(this._zoneAxis[this.targetZone]);
190
189
  const cameraLookAtQuaternion = TmpVectors.Quaternion[0];
191
- if (camera && (this.zoneOrientationMode === HandConstraintOrientation.LOOK_AT_CAMERA || this.nodeOrientationMode === HandConstraintOrientation.LOOK_AT_CAMERA)) {
190
+ if (camera && (this.zoneOrientationMode === 0 /* HandConstraintOrientation.LOOK_AT_CAMERA */ || this.nodeOrientationMode === 0 /* HandConstraintOrientation.LOOK_AT_CAMERA */)) {
192
191
  const toCamera = TmpVectors.Vector3[1];
193
192
  toCamera.copyFrom(camera.position).subtractInPlace(pose.position).normalize();
194
193
  if (this._scene.useRightHandedSystem) {
@@ -198,7 +197,7 @@ export class HandConstraintBehavior {
198
197
  Quaternion.FromLookDirectionLHToRef(toCamera, Vector3.UpReadOnly, cameraLookAtQuaternion);
199
198
  }
200
199
  }
201
- if (this.zoneOrientationMode === HandConstraintOrientation.HAND_ROTATION) {
200
+ if (this.zoneOrientationMode === 1 /* HandConstraintOrientation.HAND_ROTATION */) {
202
201
  pose.quaternion.toRotationMatrix(TmpVectors.Matrix[0]);
203
202
  }
204
203
  else {
@@ -209,7 +208,7 @@ export class HandConstraintBehavior {
209
208
  const targetPosition = TmpVectors.Vector3[2];
210
209
  const targetRotation = TmpVectors.Quaternion[1];
211
210
  targetPosition.copyFrom(pose.position).addInPlace(zoneOffset);
212
- if (this.nodeOrientationMode === HandConstraintOrientation.HAND_ROTATION) {
211
+ if (this.nodeOrientationMode === 1 /* HandConstraintOrientation.HAND_ROTATION */) {
213
212
  targetRotation.copyFrom(pose.quaternion);
214
213
  }
215
214
  else {
@@ -230,7 +229,7 @@ export class HandConstraintBehavior {
230
229
  const camera = this._scene.activeCamera;
231
230
  if (camera) {
232
231
  const cameraForward = camera.getForwardRay();
233
- if (this.handConstraintVisibility === HandConstraintVisibility.GAZE_FOCUS || this.handConstraintVisibility === HandConstraintVisibility.PALM_AND_GAZE) {
232
+ if (this.handConstraintVisibility === 2 /* HandConstraintVisibility.GAZE_FOCUS */ || this.handConstraintVisibility === 3 /* HandConstraintVisibility.PALM_AND_GAZE */) {
234
233
  gazeVisible = false;
235
234
  let gaze;
236
235
  if (this._eyeTracking) {
@@ -253,7 +252,7 @@ export class HandConstraintBehavior {
253
252
  }
254
253
  }
255
254
  }
256
- if (this.handConstraintVisibility === HandConstraintVisibility.PALM_UP || this.handConstraintVisibility === HandConstraintVisibility.PALM_AND_GAZE) {
255
+ if (this.handConstraintVisibility === 1 /* HandConstraintVisibility.PALM_UP */ || this.handConstraintVisibility === 3 /* HandConstraintVisibility.PALM_AND_GAZE */) {
257
256
  palmVisible = false;
258
257
  if (pose) {
259
258
  const palmDirection = TmpVectors.Vector3[0];
@@ -1 +1 @@
1
- {"version":3,"file":"handConstraintBehavior.js","sourceRoot":"","sources":["../../../../../dev/core/src/Behaviors/Meshes/handConstraintBehavior.ts"],"names":[],"mappings":"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","sourcesContent":["import type { TransformNode } from \"../../Meshes/transformNode\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { WebXRFeatureName } from \"../../XR/webXRFeaturesManager\";\r\nimport type { WebXRFeaturesManager } from \"../../XR/webXRFeaturesManager\";\r\nimport type { WebXREyeTracking } from \"../../XR/features/WebXREyeTracking\";\r\nimport type { WebXRHandTracking } from \"../../XR/features/WebXRHandTracking\";\r\nimport { WebXRHandJoint } from \"../../XR/features/WebXRHandTracking\";\r\nimport type { WebXRExperienceHelper } from \"../../XR/webXRExperienceHelper\";\r\nimport type { Behavior } from \"../behavior\";\r\nimport type { Observer } from \"../../Misc/observable\";\r\nimport type { Scene } from \"../../scene\";\r\nimport { Quaternion, TmpVectors, Vector3 } from \"../../Maths/math.vector\";\r\nimport type { Ray } from \"../../Culling/ray\";\r\nimport { Tools } from \"core/Misc/tools\";\r\n\r\n/**\r\n * Zones around the hand\r\n */\r\nexport enum HandConstraintZone {\r\n /**\r\n * Above finger tips\r\n */\r\n ABOVE_FINGER_TIPS,\r\n /**\r\n * Next to the thumb\r\n */\r\n RADIAL_SIDE,\r\n /**\r\n * Next to the pinky finger\r\n */\r\n ULNAR_SIDE,\r\n /**\r\n * Below the wrist\r\n */\r\n BELOW_WRIST,\r\n}\r\n\r\n/**\r\n * Orientations for the hand zones and for the attached node\r\n */\r\nexport enum HandConstraintOrientation {\r\n /**\r\n * Orientation is towards the camera\r\n */\r\n LOOK_AT_CAMERA,\r\n /**\r\n * Orientation is determined by the rotation of the palm\r\n */\r\n HAND_ROTATION,\r\n}\r\n\r\n/**\r\n * Orientations for the hand zones and for the attached node\r\n */\r\nexport enum HandConstraintVisibility {\r\n /**\r\n * Constraint is always visible\r\n */\r\n ALWAYS_VISIBLE,\r\n /**\r\n * Constraint is only visible when the palm is up\r\n */\r\n PALM_UP,\r\n /**\r\n * Constraint is only visible when the user is looking at the constraint.\r\n * Uses XR Eye Tracking if enabled/available, otherwise uses camera direction\r\n */\r\n GAZE_FOCUS,\r\n /**\r\n * Constraint is only visible when the palm is up and the user is looking at it\r\n */\r\n PALM_AND_GAZE,\r\n}\r\n\r\ntype HandPoseInfo = {\r\n position: Vector3;\r\n quaternion: Quaternion;\r\n id: string;\r\n};\r\n\r\n/**\r\n * Hand constraint behavior that makes the attached `TransformNode` follow hands in XR experiences.\r\n * @since 5.0.0\r\n */\r\nexport class HandConstraintBehavior implements Behavior<TransformNode> {\r\n private _scene: Scene;\r\n private _node: TransformNode;\r\n private _eyeTracking: Nullable<WebXREyeTracking>;\r\n private _handTracking: Nullable<WebXRHandTracking>;\r\n private _sceneRenderObserver: Nullable<Observer<Scene>> = null;\r\n private _zoneAxis: { [id: number]: Vector3 } = {};\r\n\r\n /**\r\n * Sets the HandConstraintVisibility level for the hand constraint\r\n */\r\n public handConstraintVisibility: HandConstraintVisibility = HandConstraintVisibility.PALM_AND_GAZE;\r\n\r\n /**\r\n * A number from 0.0 to 1.0, marking how restricted the direction the palm faces is for the attached node to be enabled.\r\n * A 1 means the palm must be directly facing the user before the node is enabled, a 0 means it is always enabled.\r\n * Used with HandConstraintVisibility.PALM_UP\r\n */\r\n public palmUpStrictness: number = 0.95;\r\n\r\n /**\r\n * The radius in meters around the center of the hand that the user must gaze inside for the attached node to be enabled and appear.\r\n * Used with HandConstraintVisibility.GAZE_FOCUS\r\n */\r\n public gazeProximityRadius: number = 0.15;\r\n\r\n /**\r\n * Offset distance from the hand in meters\r\n */\r\n public targetOffset: number = 0.1;\r\n\r\n /**\r\n * Where to place the node regarding the center of the hand.\r\n */\r\n public targetZone: HandConstraintZone = HandConstraintZone.ULNAR_SIDE;\r\n\r\n /**\r\n * Orientation mode of the 4 zones around the hand\r\n */\r\n public zoneOrientationMode: HandConstraintOrientation = HandConstraintOrientation.HAND_ROTATION;\r\n /**\r\n * Orientation mode of the node attached to this behavior\r\n */\r\n public nodeOrientationMode: HandConstraintOrientation = HandConstraintOrientation.HAND_ROTATION;\r\n\r\n /**\r\n * Set the hand this behavior should follow. If set to \"none\", it will follow any visible hand (prioritising the left one).\r\n */\r\n public handedness: XRHandedness = \"none\";\r\n\r\n /**\r\n * Rate of interpolation of position and rotation of the attached node.\r\n * Higher values will give a slower interpolation.\r\n */\r\n public lerpTime = 100;\r\n\r\n /**\r\n * Builds a hand constraint behavior\r\n */\r\n constructor() {\r\n // For a right hand\r\n this._zoneAxis[HandConstraintZone.ABOVE_FINGER_TIPS] = new Vector3(0, 1, 0);\r\n this._zoneAxis[HandConstraintZone.RADIAL_SIDE] = new Vector3(-1, 0, 0);\r\n this._zoneAxis[HandConstraintZone.ULNAR_SIDE] = new Vector3(1, 0, 0);\r\n this._zoneAxis[HandConstraintZone.BELOW_WRIST] = new Vector3(0, -1, 0);\r\n }\r\n\r\n /** gets or sets behavior's name */\r\n public get name() {\r\n return \"HandConstraint\";\r\n }\r\n\r\n /** Enable the behavior */\r\n public enable() {\r\n this._node.setEnabled(true);\r\n }\r\n\r\n /** Disable the behavior */\r\n public disable() {\r\n this._node.setEnabled(false);\r\n }\r\n\r\n private _getHandPose(): Nullable<HandPoseInfo> {\r\n if (!this._handTracking) {\r\n return null;\r\n }\r\n\r\n // Retrieve any available hand, starting by the left\r\n let hand;\r\n if (this.handedness === \"none\") {\r\n hand = this._handTracking.getHandByHandedness(\"left\") || this._handTracking.getHandByHandedness(\"right\");\r\n } else {\r\n hand = this._handTracking.getHandByHandedness(this.handedness);\r\n }\r\n\r\n if (hand) {\r\n const pinkyMetacarpal = hand.getJointMesh(WebXRHandJoint.PINKY_FINGER_METACARPAL);\r\n const middleMetacarpal = hand.getJointMesh(WebXRHandJoint.MIDDLE_FINGER_METACARPAL);\r\n const wrist = hand.getJointMesh(WebXRHandJoint.WRIST);\r\n\r\n if (wrist && middleMetacarpal && pinkyMetacarpal) {\r\n const handPose: HandPoseInfo = { position: middleMetacarpal.absolutePosition, quaternion: new Quaternion(), id: hand.xrController.uniqueId };\r\n\r\n // palm forward\r\n const up = TmpVectors.Vector3[0];\r\n const forward = TmpVectors.Vector3[1];\r\n const left = TmpVectors.Vector3[2];\r\n up.copyFrom(middleMetacarpal.absolutePosition).subtractInPlace(wrist.absolutePosition).normalize();\r\n forward.copyFrom(pinkyMetacarpal.absolutePosition).subtractInPlace(middleMetacarpal.absolutePosition).normalize();\r\n\r\n // Create vectors for a rotation quaternion, where forward points out from the palm\r\n Vector3.CrossToRef(up, forward, forward);\r\n Vector3.CrossToRef(forward, up, left);\r\n\r\n Quaternion.FromLookDirectionLHToRef(forward, up, handPose.quaternion);\r\n\r\n return handPose;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Initializes the hand constraint behavior\r\n */\r\n public init() {}\r\n\r\n /**\r\n * Attaches the hand constraint to a `TransformNode`\r\n * @param node defines the node to attach the behavior to\r\n */\r\n public attach(node: TransformNode): void {\r\n this._node = node;\r\n this._scene = node.getScene();\r\n\r\n if (!this._node.rotationQuaternion) {\r\n this._node.rotationQuaternion = Quaternion.RotationYawPitchRoll(this._node.rotation.y, this._node.rotation.x, this._node.rotation.z);\r\n }\r\n\r\n let lastTick = Date.now();\r\n this._sceneRenderObserver = this._scene.onBeforeRenderObservable.add(() => {\r\n const pose = this._getHandPose();\r\n\r\n this._node.reservedDataStore = this._node.reservedDataStore || {};\r\n this._node.reservedDataStore.nearInteraction = this._node.reservedDataStore.nearInteraction || {};\r\n this._node.reservedDataStore.nearInteraction.excludedControllerId = null;\r\n\r\n if (pose) {\r\n const zoneOffset = TmpVectors.Vector3[0];\r\n const camera = this._scene.activeCamera;\r\n\r\n zoneOffset.copyFrom(this._zoneAxis[this.targetZone]);\r\n\r\n const cameraLookAtQuaternion = TmpVectors.Quaternion[0];\r\n if (camera && (this.zoneOrientationMode === HandConstraintOrientation.LOOK_AT_CAMERA || this.nodeOrientationMode === HandConstraintOrientation.LOOK_AT_CAMERA)) {\r\n const toCamera = TmpVectors.Vector3[1];\r\n toCamera.copyFrom(camera.position).subtractInPlace(pose.position).normalize();\r\n if (this._scene.useRightHandedSystem) {\r\n Quaternion.FromLookDirectionRHToRef(toCamera, Vector3.UpReadOnly, cameraLookAtQuaternion);\r\n } else {\r\n Quaternion.FromLookDirectionLHToRef(toCamera, Vector3.UpReadOnly, cameraLookAtQuaternion);\r\n }\r\n }\r\n\r\n if (this.zoneOrientationMode === HandConstraintOrientation.HAND_ROTATION) {\r\n pose.quaternion.toRotationMatrix(TmpVectors.Matrix[0]);\r\n } else {\r\n cameraLookAtQuaternion.toRotationMatrix(TmpVectors.Matrix[0]);\r\n }\r\n\r\n Vector3.TransformNormalToRef(zoneOffset, TmpVectors.Matrix[0], zoneOffset);\r\n zoneOffset.scaleInPlace(this.targetOffset);\r\n\r\n const targetPosition = TmpVectors.Vector3[2];\r\n const targetRotation = TmpVectors.Quaternion[1];\r\n targetPosition.copyFrom(pose.position).addInPlace(zoneOffset);\r\n\r\n if (this.nodeOrientationMode === HandConstraintOrientation.HAND_ROTATION) {\r\n targetRotation.copyFrom(pose.quaternion);\r\n } else {\r\n targetRotation.copyFrom(cameraLookAtQuaternion);\r\n }\r\n\r\n const elapsed = Date.now() - lastTick;\r\n\r\n Vector3.SmoothToRef(this._node.position, targetPosition, elapsed, this.lerpTime, this._node.position);\r\n Quaternion.SmoothToRef(this._node.rotationQuaternion!, targetRotation, elapsed, this.lerpTime, this._node.rotationQuaternion!);\r\n\r\n this._node.reservedDataStore.nearInteraction.excludedControllerId = pose.id;\r\n }\r\n\r\n this._setVisibility(pose);\r\n\r\n lastTick = Date.now();\r\n });\r\n }\r\n\r\n private _setVisibility(pose: Nullable<HandPoseInfo>) {\r\n let palmVisible = true;\r\n let gazeVisible = true;\r\n const camera = this._scene.activeCamera;\r\n\r\n if (camera) {\r\n const cameraForward = camera.getForwardRay();\r\n\r\n if (this.handConstraintVisibility === HandConstraintVisibility.GAZE_FOCUS || this.handConstraintVisibility === HandConstraintVisibility.PALM_AND_GAZE) {\r\n gazeVisible = false;\r\n let gaze: Ray | undefined;\r\n if (this._eyeTracking) {\r\n gaze = this._eyeTracking.getEyeGaze()!;\r\n }\r\n\r\n gaze = gaze || cameraForward;\r\n\r\n const gazeToBehavior = TmpVectors.Vector3[0];\r\n if (pose) {\r\n pose.position.subtractToRef(gaze.origin, gazeToBehavior);\r\n } else {\r\n this._node.getAbsolutePosition().subtractToRef(gaze.origin, gazeToBehavior);\r\n }\r\n\r\n const projectedDistance = Vector3.Dot(gazeToBehavior, gaze.direction);\r\n const projectedSquared = projectedDistance * projectedDistance;\r\n\r\n if (projectedDistance > 0) {\r\n const radiusSquared = gazeToBehavior.lengthSquared() - projectedSquared;\r\n if (radiusSquared < this.gazeProximityRadius * this.gazeProximityRadius) {\r\n gazeVisible = true;\r\n }\r\n }\r\n }\r\n\r\n if (this.handConstraintVisibility === HandConstraintVisibility.PALM_UP || this.handConstraintVisibility === HandConstraintVisibility.PALM_AND_GAZE) {\r\n palmVisible = false;\r\n\r\n if (pose) {\r\n const palmDirection = TmpVectors.Vector3[0];\r\n Vector3.LeftHandedForwardReadOnly.rotateByQuaternionToRef(pose.quaternion, palmDirection);\r\n\r\n if (Vector3.Dot(palmDirection, cameraForward.direction) > this.palmUpStrictness * 2 - 1) {\r\n palmVisible = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n this._node.setEnabled(palmVisible && gazeVisible);\r\n }\r\n\r\n /**\r\n * Detaches the behavior from the `TransformNode`\r\n */\r\n public detach(): void {\r\n this._scene.onBeforeRenderObservable.remove(this._sceneRenderObserver);\r\n }\r\n\r\n /**\r\n * Links the behavior to the XR experience in which to retrieve hand transform information.\r\n * @param xr xr experience\r\n */\r\n public linkToXRExperience(xr: WebXRExperienceHelper | WebXRFeaturesManager) {\r\n const featuresManager: WebXRFeaturesManager = (xr as WebXRExperienceHelper).featuresManager ? (xr as WebXRExperienceHelper).featuresManager : (xr as WebXRFeaturesManager);\r\n if (!featuresManager) {\r\n Tools.Error(\"XR features manager must be available or provided directly for the Hand Menu to work\");\r\n } else {\r\n try {\r\n this._eyeTracking = featuresManager.getEnabledFeature(WebXRFeatureName.EYE_TRACKING) as WebXREyeTracking;\r\n } catch {}\r\n\r\n try {\r\n this._handTracking = featuresManager.getEnabledFeature(WebXRFeatureName.HAND_TRACKING) as WebXRHandTracking;\r\n } catch {\r\n Tools.Error(\"Hand tracking must be enabled for the Hand Menu to work\");\r\n }\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"handConstraintBehavior.js","sourceRoot":"","sources":["../../../../../dev/core/src/Behaviors/Meshes/handConstraintBehavior.ts"],"names":[],"mappings":"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","sourcesContent":["import type { TransformNode } from \"../../Meshes/transformNode\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { WebXRFeatureName } from \"../../XR/webXRFeaturesManager\";\r\nimport type { WebXRFeaturesManager } from \"../../XR/webXRFeaturesManager\";\r\nimport type { WebXREyeTracking } from \"../../XR/features/WebXREyeTracking\";\r\nimport type { WebXRHandTracking } from \"../../XR/features/WebXRHandTracking\";\r\nimport { WebXRHandJoint } from \"../../XR/features/WebXRHandTracking\";\r\nimport type { WebXRExperienceHelper } from \"../../XR/webXRExperienceHelper\";\r\nimport type { Behavior } from \"../behavior\";\r\nimport type { Observer } from \"../../Misc/observable\";\r\nimport type { Scene } from \"../../scene\";\r\nimport { Quaternion, TmpVectors, Vector3 } from \"../../Maths/math.vector\";\r\nimport type { Ray } from \"../../Culling/ray\";\r\nimport { Tools } from \"core/Misc/tools\";\r\n\r\n/**\r\n * Zones around the hand\r\n */\r\nexport const enum HandConstraintZone {\r\n /**\r\n * Above finger tips\r\n */\r\n ABOVE_FINGER_TIPS,\r\n /**\r\n * Next to the thumb\r\n */\r\n RADIAL_SIDE,\r\n /**\r\n * Next to the pinky finger\r\n */\r\n ULNAR_SIDE,\r\n /**\r\n * Below the wrist\r\n */\r\n BELOW_WRIST,\r\n}\r\n\r\n/**\r\n * Orientations for the hand zones and for the attached node\r\n */\r\nexport const enum HandConstraintOrientation {\r\n /**\r\n * Orientation is towards the camera\r\n */\r\n LOOK_AT_CAMERA,\r\n /**\r\n * Orientation is determined by the rotation of the palm\r\n */\r\n HAND_ROTATION,\r\n}\r\n\r\n/**\r\n * Orientations for the hand zones and for the attached node\r\n */\r\nexport const enum HandConstraintVisibility {\r\n /**\r\n * Constraint is always visible\r\n */\r\n ALWAYS_VISIBLE,\r\n /**\r\n * Constraint is only visible when the palm is up\r\n */\r\n PALM_UP,\r\n /**\r\n * Constraint is only visible when the user is looking at the constraint.\r\n * Uses XR Eye Tracking if enabled/available, otherwise uses camera direction\r\n */\r\n GAZE_FOCUS,\r\n /**\r\n * Constraint is only visible when the palm is up and the user is looking at it\r\n */\r\n PALM_AND_GAZE,\r\n}\r\n\r\ntype HandPoseInfo = {\r\n position: Vector3;\r\n quaternion: Quaternion;\r\n id: string;\r\n};\r\n\r\n/**\r\n * Hand constraint behavior that makes the attached `TransformNode` follow hands in XR experiences.\r\n * @since 5.0.0\r\n */\r\nexport class HandConstraintBehavior implements Behavior<TransformNode> {\r\n private _scene: Scene;\r\n private _node: TransformNode;\r\n private _eyeTracking: Nullable<WebXREyeTracking>;\r\n private _handTracking: Nullable<WebXRHandTracking>;\r\n private _sceneRenderObserver: Nullable<Observer<Scene>> = null;\r\n private _zoneAxis: { [id: number]: Vector3 } = {};\r\n\r\n /**\r\n * Sets the HandConstraintVisibility level for the hand constraint\r\n */\r\n public handConstraintVisibility: HandConstraintVisibility = HandConstraintVisibility.PALM_AND_GAZE;\r\n\r\n /**\r\n * A number from 0.0 to 1.0, marking how restricted the direction the palm faces is for the attached node to be enabled.\r\n * A 1 means the palm must be directly facing the user before the node is enabled, a 0 means it is always enabled.\r\n * Used with HandConstraintVisibility.PALM_UP\r\n */\r\n public palmUpStrictness: number = 0.95;\r\n\r\n /**\r\n * The radius in meters around the center of the hand that the user must gaze inside for the attached node to be enabled and appear.\r\n * Used with HandConstraintVisibility.GAZE_FOCUS\r\n */\r\n public gazeProximityRadius: number = 0.15;\r\n\r\n /**\r\n * Offset distance from the hand in meters\r\n */\r\n public targetOffset: number = 0.1;\r\n\r\n /**\r\n * Where to place the node regarding the center of the hand.\r\n */\r\n public targetZone: HandConstraintZone = HandConstraintZone.ULNAR_SIDE;\r\n\r\n /**\r\n * Orientation mode of the 4 zones around the hand\r\n */\r\n public zoneOrientationMode: HandConstraintOrientation = HandConstraintOrientation.HAND_ROTATION;\r\n /**\r\n * Orientation mode of the node attached to this behavior\r\n */\r\n public nodeOrientationMode: HandConstraintOrientation = HandConstraintOrientation.HAND_ROTATION;\r\n\r\n /**\r\n * Set the hand this behavior should follow. If set to \"none\", it will follow any visible hand (prioritising the left one).\r\n */\r\n public handedness: XRHandedness = \"none\";\r\n\r\n /**\r\n * Rate of interpolation of position and rotation of the attached node.\r\n * Higher values will give a slower interpolation.\r\n */\r\n public lerpTime = 100;\r\n\r\n /**\r\n * Builds a hand constraint behavior\r\n */\r\n constructor() {\r\n // For a right hand\r\n this._zoneAxis[HandConstraintZone.ABOVE_FINGER_TIPS] = new Vector3(0, 1, 0);\r\n this._zoneAxis[HandConstraintZone.RADIAL_SIDE] = new Vector3(-1, 0, 0);\r\n this._zoneAxis[HandConstraintZone.ULNAR_SIDE] = new Vector3(1, 0, 0);\r\n this._zoneAxis[HandConstraintZone.BELOW_WRIST] = new Vector3(0, -1, 0);\r\n }\r\n\r\n /** gets or sets behavior's name */\r\n public get name() {\r\n return \"HandConstraint\";\r\n }\r\n\r\n /** Enable the behavior */\r\n public enable() {\r\n this._node.setEnabled(true);\r\n }\r\n\r\n /** Disable the behavior */\r\n public disable() {\r\n this._node.setEnabled(false);\r\n }\r\n\r\n private _getHandPose(): Nullable<HandPoseInfo> {\r\n if (!this._handTracking) {\r\n return null;\r\n }\r\n\r\n // Retrieve any available hand, starting by the left\r\n let hand;\r\n if (this.handedness === \"none\") {\r\n hand = this._handTracking.getHandByHandedness(\"left\") || this._handTracking.getHandByHandedness(\"right\");\r\n } else {\r\n hand = this._handTracking.getHandByHandedness(this.handedness);\r\n }\r\n\r\n if (hand) {\r\n const pinkyMetacarpal = hand.getJointMesh(WebXRHandJoint.PINKY_FINGER_METACARPAL);\r\n const middleMetacarpal = hand.getJointMesh(WebXRHandJoint.MIDDLE_FINGER_METACARPAL);\r\n const wrist = hand.getJointMesh(WebXRHandJoint.WRIST);\r\n\r\n if (wrist && middleMetacarpal && pinkyMetacarpal) {\r\n const handPose: HandPoseInfo = { position: middleMetacarpal.absolutePosition, quaternion: new Quaternion(), id: hand.xrController.uniqueId };\r\n\r\n // palm forward\r\n const up = TmpVectors.Vector3[0];\r\n const forward = TmpVectors.Vector3[1];\r\n const left = TmpVectors.Vector3[2];\r\n up.copyFrom(middleMetacarpal.absolutePosition).subtractInPlace(wrist.absolutePosition).normalize();\r\n forward.copyFrom(pinkyMetacarpal.absolutePosition).subtractInPlace(middleMetacarpal.absolutePosition).normalize();\r\n\r\n // Create vectors for a rotation quaternion, where forward points out from the palm\r\n Vector3.CrossToRef(up, forward, forward);\r\n Vector3.CrossToRef(forward, up, left);\r\n\r\n Quaternion.FromLookDirectionLHToRef(forward, up, handPose.quaternion);\r\n\r\n return handPose;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Initializes the hand constraint behavior\r\n */\r\n public init() {}\r\n\r\n /**\r\n * Attaches the hand constraint to a `TransformNode`\r\n * @param node defines the node to attach the behavior to\r\n */\r\n public attach(node: TransformNode): void {\r\n this._node = node;\r\n this._scene = node.getScene();\r\n\r\n if (!this._node.rotationQuaternion) {\r\n this._node.rotationQuaternion = Quaternion.RotationYawPitchRoll(this._node.rotation.y, this._node.rotation.x, this._node.rotation.z);\r\n }\r\n\r\n let lastTick = Date.now();\r\n this._sceneRenderObserver = this._scene.onBeforeRenderObservable.add(() => {\r\n const pose = this._getHandPose();\r\n\r\n this._node.reservedDataStore = this._node.reservedDataStore || {};\r\n this._node.reservedDataStore.nearInteraction = this._node.reservedDataStore.nearInteraction || {};\r\n this._node.reservedDataStore.nearInteraction.excludedControllerId = null;\r\n\r\n if (pose) {\r\n const zoneOffset = TmpVectors.Vector3[0];\r\n const camera = this._scene.activeCamera;\r\n\r\n zoneOffset.copyFrom(this._zoneAxis[this.targetZone]);\r\n\r\n const cameraLookAtQuaternion = TmpVectors.Quaternion[0];\r\n if (camera && (this.zoneOrientationMode === HandConstraintOrientation.LOOK_AT_CAMERA || this.nodeOrientationMode === HandConstraintOrientation.LOOK_AT_CAMERA)) {\r\n const toCamera = TmpVectors.Vector3[1];\r\n toCamera.copyFrom(camera.position).subtractInPlace(pose.position).normalize();\r\n if (this._scene.useRightHandedSystem) {\r\n Quaternion.FromLookDirectionRHToRef(toCamera, Vector3.UpReadOnly, cameraLookAtQuaternion);\r\n } else {\r\n Quaternion.FromLookDirectionLHToRef(toCamera, Vector3.UpReadOnly, cameraLookAtQuaternion);\r\n }\r\n }\r\n\r\n if (this.zoneOrientationMode === HandConstraintOrientation.HAND_ROTATION) {\r\n pose.quaternion.toRotationMatrix(TmpVectors.Matrix[0]);\r\n } else {\r\n cameraLookAtQuaternion.toRotationMatrix(TmpVectors.Matrix[0]);\r\n }\r\n\r\n Vector3.TransformNormalToRef(zoneOffset, TmpVectors.Matrix[0], zoneOffset);\r\n zoneOffset.scaleInPlace(this.targetOffset);\r\n\r\n const targetPosition = TmpVectors.Vector3[2];\r\n const targetRotation = TmpVectors.Quaternion[1];\r\n targetPosition.copyFrom(pose.position).addInPlace(zoneOffset);\r\n\r\n if (this.nodeOrientationMode === HandConstraintOrientation.HAND_ROTATION) {\r\n targetRotation.copyFrom(pose.quaternion);\r\n } else {\r\n targetRotation.copyFrom(cameraLookAtQuaternion);\r\n }\r\n\r\n const elapsed = Date.now() - lastTick;\r\n\r\n Vector3.SmoothToRef(this._node.position, targetPosition, elapsed, this.lerpTime, this._node.position);\r\n Quaternion.SmoothToRef(this._node.rotationQuaternion!, targetRotation, elapsed, this.lerpTime, this._node.rotationQuaternion!);\r\n\r\n this._node.reservedDataStore.nearInteraction.excludedControllerId = pose.id;\r\n }\r\n\r\n this._setVisibility(pose);\r\n\r\n lastTick = Date.now();\r\n });\r\n }\r\n\r\n private _setVisibility(pose: Nullable<HandPoseInfo>) {\r\n let palmVisible = true;\r\n let gazeVisible = true;\r\n const camera = this._scene.activeCamera;\r\n\r\n if (camera) {\r\n const cameraForward = camera.getForwardRay();\r\n\r\n if (this.handConstraintVisibility === HandConstraintVisibility.GAZE_FOCUS || this.handConstraintVisibility === HandConstraintVisibility.PALM_AND_GAZE) {\r\n gazeVisible = false;\r\n let gaze: Ray | undefined;\r\n if (this._eyeTracking) {\r\n gaze = this._eyeTracking.getEyeGaze()!;\r\n }\r\n\r\n gaze = gaze || cameraForward;\r\n\r\n const gazeToBehavior = TmpVectors.Vector3[0];\r\n if (pose) {\r\n pose.position.subtractToRef(gaze.origin, gazeToBehavior);\r\n } else {\r\n this._node.getAbsolutePosition().subtractToRef(gaze.origin, gazeToBehavior);\r\n }\r\n\r\n const projectedDistance = Vector3.Dot(gazeToBehavior, gaze.direction);\r\n const projectedSquared = projectedDistance * projectedDistance;\r\n\r\n if (projectedDistance > 0) {\r\n const radiusSquared = gazeToBehavior.lengthSquared() - projectedSquared;\r\n if (radiusSquared < this.gazeProximityRadius * this.gazeProximityRadius) {\r\n gazeVisible = true;\r\n }\r\n }\r\n }\r\n\r\n if (this.handConstraintVisibility === HandConstraintVisibility.PALM_UP || this.handConstraintVisibility === HandConstraintVisibility.PALM_AND_GAZE) {\r\n palmVisible = false;\r\n\r\n if (pose) {\r\n const palmDirection = TmpVectors.Vector3[0];\r\n Vector3.LeftHandedForwardReadOnly.rotateByQuaternionToRef(pose.quaternion, palmDirection);\r\n\r\n if (Vector3.Dot(palmDirection, cameraForward.direction) > this.palmUpStrictness * 2 - 1) {\r\n palmVisible = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n this._node.setEnabled(palmVisible && gazeVisible);\r\n }\r\n\r\n /**\r\n * Detaches the behavior from the `TransformNode`\r\n */\r\n public detach(): void {\r\n this._scene.onBeforeRenderObservable.remove(this._sceneRenderObserver);\r\n }\r\n\r\n /**\r\n * Links the behavior to the XR experience in which to retrieve hand transform information.\r\n * @param xr xr experience\r\n */\r\n public linkToXRExperience(xr: WebXRExperienceHelper | WebXRFeaturesManager) {\r\n const featuresManager: WebXRFeaturesManager = (xr as WebXRExperienceHelper).featuresManager ? (xr as WebXRExperienceHelper).featuresManager : (xr as WebXRFeaturesManager);\r\n if (!featuresManager) {\r\n Tools.Error(\"XR features manager must be available or provided directly for the Hand Menu to work\");\r\n } else {\r\n try {\r\n this._eyeTracking = featuresManager.getEnabledFeature(WebXRFeatureName.EYE_TRACKING) as WebXREyeTracking;\r\n } catch {}\r\n\r\n try {\r\n this._handTracking = featuresManager.getEnabledFeature(WebXRFeatureName.HAND_TRACKING) as WebXRHandTracking;\r\n } catch {\r\n Tools.Error(\"Hand tracking must be enabled for the Hand Menu to work\");\r\n }\r\n }\r\n }\r\n}\r\n"]}
@@ -2,7 +2,6 @@ import { Vector3, Quaternion, Matrix, TmpVectors } from "../../Maths/math.vector
2
2
  import { Observable } from "../../Misc/observable.js";
3
3
  import { BaseSixDofDragBehavior } from "./baseSixDofDragBehavior.js";
4
4
  import { TransformNode } from "../../Meshes/transformNode.js";
5
- import { Space } from "../../Maths/math.axis.js";
6
5
  /**
7
6
  * A behavior that when attached to a mesh will allow the mesh to be dragged around based on directions and origin of the pointer's ray
8
7
  */
@@ -191,11 +190,11 @@ export class SixDofDragBehavior extends BaseSixDofDragBehavior {
191
190
  this._startingScaling.copyFrom(this._targetScaling);
192
191
  }
193
192
  else if (pointerCount === 2) {
194
- this._virtualTransformNode.setPivotPoint(new Vector3(0, 0, 0), Space.LOCAL);
193
+ this._virtualTransformNode.setPivotPoint(new Vector3(0, 0, 0), 0 /* Space.LOCAL */);
195
194
  this._virtualTransformNode.position.copyFrom(this._ownerNode.absolutePosition);
196
195
  this._virtualTransformNode.scaling.copyFrom(this._ownerNode.absoluteScaling);
197
196
  this._virtualTransformNode.rotationQuaternion.copyFrom(this._ownerNode.absoluteRotationQuaternion);
198
- this._virtualTransformNode.setPivotPoint(worldPivot, Space.WORLD);
197
+ this._virtualTransformNode.setPivotPoint(worldPivot, 1 /* Space.WORLD */);
199
198
  this._resetVirtualMeshesPosition();
200
199
  }
201
200
  }
@@ -1 +1 @@
1
- {"version":3,"file":"sixDofDragBehavior.js","sourceRoot":"","sources":["../../../../../dev/core/src/Behaviors/Meshes/sixDofDragBehavior.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Mesh } from \"../../Meshes/mesh\";\r\nimport type { Scene } from \"../../scene\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { Vector3, Quaternion, Matrix, TmpVectors } from \"../../Maths/math.vector\";\r\nimport type { Observer } from \"../../Misc/observable\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport { BaseSixDofDragBehavior } from \"./baseSixDofDragBehavior\";\r\nimport { TransformNode } from \"../../Meshes/transformNode\";\r\nimport { Space } from \"../../Maths/math.axis\";\r\n\r\n/**\r\n * A behavior that when attached to a mesh will allow the mesh to be dragged around based on directions and origin of the pointer's ray\r\n */\r\nexport class SixDofDragBehavior extends BaseSixDofDragBehavior {\r\n private _sceneRenderObserver: Nullable<Observer<Scene>> = null;\r\n private _virtualTransformNode: TransformNode;\r\n\r\n protected _targetPosition = new Vector3(0, 0, 0);\r\n protected _targetOrientation = new Quaternion();\r\n protected _targetScaling = new Vector3(1, 1, 1);\r\n protected _startingPosition = new Vector3(0, 0, 0);\r\n protected _startingOrientation = new Quaternion();\r\n protected _startingScaling = new Vector3(1, 1, 1);\r\n\r\n /**\r\n * Fires when position is updated\r\n */\r\n public onPositionChangedObservable = new Observable<{ position: Vector3 }>();\r\n\r\n /**\r\n * The distance towards the target drag position to move each frame. This can be useful to avoid jitter. Set this to 1 for no delay. (Default: 0.2)\r\n */\r\n public dragDeltaRatio = 0.2;\r\n\r\n /**\r\n * If the object should rotate to face the drag origin\r\n */\r\n public rotateDraggedObject = true;\r\n\r\n /**\r\n * If `rotateDraggedObject` is set to `true`, this parameter determines if we are only rotating around the y axis (yaw)\r\n */\r\n public rotateAroundYOnly = false;\r\n\r\n /**\r\n * Should the behavior rotate 1:1 with the motion controller, when one is used.\r\n */\r\n public rotateWithMotionController = true;\r\n\r\n /**\r\n * The name of the behavior\r\n */\r\n public override get name(): string {\r\n return \"SixDofDrag\";\r\n }\r\n\r\n /**\r\n * Use this flag to update the target but not move the owner node towards the target\r\n */\r\n public disableMovement: boolean = false;\r\n\r\n /**\r\n * Should the object rotate towards the camera when we start dragging it\r\n */\r\n public faceCameraOnDragStart = false;\r\n\r\n /**\r\n * Attaches the six DoF drag behavior\r\n * In XR mode the mesh and its children will have their isNearGrabbable property set to true\r\n * @param ownerNode The mesh that will be dragged around once attached\r\n */\r\n public override attach(ownerNode: Mesh): void {\r\n super.attach(ownerNode);\r\n\r\n ownerNode.isNearGrabbable = true;\r\n // if it has children, make sure they are grabbable too\r\n ownerNode.getChildMeshes().forEach((m) => {\r\n m.isNearGrabbable = true;\r\n });\r\n\r\n // Node that will save the owner's transform\r\n this._virtualTransformNode = new TransformNode(\"virtual_sixDof\", BaseSixDofDragBehavior._virtualScene);\r\n this._virtualTransformNode.rotationQuaternion = Quaternion.Identity();\r\n\r\n // On every frame move towards target scaling to avoid jitter caused by vr controllers\r\n this._sceneRenderObserver = ownerNode.getScene().onBeforeRenderObservable.add(() => {\r\n if (this.currentDraggingPointerIds.length === 1 && this._moving && !this.disableMovement) {\r\n // 1 pointer only drags mesh\r\n const deltaToAdd = TmpVectors.Vector3[0];\r\n deltaToAdd.copyFrom(this._targetPosition).subtractInPlace(ownerNode.absolutePosition).scaleInPlace(this.dragDeltaRatio);\r\n const deltaToAddTransformed = TmpVectors.Vector3[1];\r\n deltaToAddTransformed.copyFrom(deltaToAdd);\r\n // If the node has a parent, transform the delta to local space, so it can be added to the\r\n // position in local space\r\n if (ownerNode.parent) {\r\n const parentRotationMatrixInverse = TmpVectors.Matrix[0];\r\n (ownerNode.parent as TransformNode).absoluteRotationQuaternion.toRotationMatrix(parentRotationMatrixInverse);\r\n parentRotationMatrixInverse.invert();\r\n Vector3.TransformNormalToRef(deltaToAdd, parentRotationMatrixInverse, deltaToAddTransformed);\r\n }\r\n ownerNode.position.addInPlace(deltaToAddTransformed);\r\n\r\n this.onPositionChangedObservable.notifyObservers({ position: ownerNode.absolutePosition });\r\n\r\n // Only rotate the mesh if it's parent has uniform scaling\r\n if (!ownerNode.parent || ((ownerNode.parent as TransformNode).scaling && !(ownerNode.parent as TransformNode).scaling.isNonUniformWithinEpsilon(0.001))) {\r\n const rotationToApply = TmpVectors.Quaternion[0];\r\n rotationToApply.copyFrom(this._targetOrientation);\r\n if (ownerNode.parent) {\r\n const parentRotationInverse = TmpVectors.Quaternion[0];\r\n parentRotationInverse.copyFrom((ownerNode.parent as TransformNode).absoluteRotationQuaternion);\r\n parentRotationInverse.invertInPlace();\r\n parentRotationInverse.multiplyToRef(this._targetOrientation, rotationToApply);\r\n }\r\n Quaternion.SlerpToRef(ownerNode.rotationQuaternion!, rotationToApply, this.dragDeltaRatio, ownerNode.rotationQuaternion!);\r\n }\r\n }\r\n });\r\n }\r\n\r\n private _getPositionOffsetAround(transformationLocalOrigin: Vector3, scaling: number, rotation: Quaternion): Vector3 {\r\n const translationMatrix = TmpVectors.Matrix[0]; // T\r\n const translationMatrixInv = TmpVectors.Matrix[1]; // T'\r\n const rotationMatrix = TmpVectors.Matrix[2]; // R\r\n const scaleMatrix = TmpVectors.Matrix[3]; // S\r\n const finalMatrix = TmpVectors.Matrix[4]; // T' x R x S x T\r\n\r\n Matrix.TranslationToRef(transformationLocalOrigin.x, transformationLocalOrigin.y, transformationLocalOrigin.z, translationMatrix); // T\r\n Matrix.TranslationToRef(-transformationLocalOrigin.x, -transformationLocalOrigin.y, -transformationLocalOrigin.z, translationMatrixInv); // T'\r\n Matrix.FromQuaternionToRef(rotation, rotationMatrix); // R\r\n Matrix.ScalingToRef(scaling, scaling, scaling, scaleMatrix);\r\n translationMatrixInv.multiplyToRef(rotationMatrix, finalMatrix); // T' x R\r\n finalMatrix.multiplyToRef(scaleMatrix, finalMatrix); // T' x R x S\r\n finalMatrix.multiplyToRef(translationMatrix, finalMatrix); // T' x R x S x T\r\n\r\n return finalMatrix.getTranslation();\r\n }\r\n\r\n private _onePointerPositionUpdated(worldDeltaPosition: Vector3, worldDeltaRotation: Quaternion) {\r\n const pointerDelta = TmpVectors.Vector3[0];\r\n pointerDelta.setAll(0);\r\n\r\n if (this._dragging === this._dragType.DRAG) {\r\n if (this.rotateDraggedObject) {\r\n if (this.rotateAroundYOnly) {\r\n // Convert change in rotation to only y axis rotation\r\n Quaternion.RotationYawPitchRollToRef(worldDeltaRotation.toEulerAngles().y, 0, 0, TmpVectors.Quaternion[0]);\r\n } else {\r\n TmpVectors.Quaternion[0].copyFrom(worldDeltaRotation);\r\n }\r\n TmpVectors.Quaternion[0].multiplyToRef(this._startingOrientation, this._targetOrientation);\r\n }\r\n } else if (this._dragging === this._dragType.NEAR_DRAG || (this._dragging === this._dragType.DRAG_WITH_CONTROLLER && this.rotateWithMotionController)) {\r\n worldDeltaRotation.multiplyToRef(this._startingOrientation, this._targetOrientation);\r\n }\r\n\r\n this._targetPosition.copyFrom(this._startingPosition).addInPlace(worldDeltaPosition);\r\n }\r\n\r\n private _twoPointersPositionUpdated() {\r\n const startingPosition0 = this._virtualMeshesInfo[this.currentDraggingPointerIds[0]].startingPosition;\r\n const startingPosition1 = this._virtualMeshesInfo[this.currentDraggingPointerIds[1]].startingPosition;\r\n const startingCenter = TmpVectors.Vector3[0];\r\n startingPosition0.addToRef(startingPosition1, startingCenter);\r\n startingCenter.scaleInPlace(0.5);\r\n const startingVector = TmpVectors.Vector3[1];\r\n startingPosition1.subtractToRef(startingPosition0, startingVector);\r\n\r\n const currentPosition0 = this._virtualMeshesInfo[this.currentDraggingPointerIds[0]].dragMesh.absolutePosition;\r\n const currentPosition1 = this._virtualMeshesInfo[this.currentDraggingPointerIds[1]].dragMesh.absolutePosition;\r\n const currentCenter = TmpVectors.Vector3[2];\r\n currentPosition0.addToRef(currentPosition1, currentCenter);\r\n currentCenter.scaleInPlace(0.5);\r\n const currentVector = TmpVectors.Vector3[3];\r\n currentPosition1.subtractToRef(currentPosition0, currentVector);\r\n\r\n const scaling = currentVector.length() / startingVector.length();\r\n const translation = currentCenter.subtract(startingCenter);\r\n const rotationQuaternion = Quaternion.FromEulerAngles(\r\n 0,\r\n Vector3.GetAngleBetweenVectorsOnPlane(startingVector.normalize(), currentVector.normalize(), Vector3.UpReadOnly),\r\n 0\r\n );\r\n\r\n const oldParent = this._ownerNode.parent;\r\n this._ownerNode.setParent(null);\r\n\r\n const positionOffset = this._getPositionOffsetAround(startingCenter.subtract(this._virtualTransformNode.getAbsolutePivotPoint()), scaling, rotationQuaternion);\r\n this._virtualTransformNode.rotationQuaternion!.multiplyToRef(rotationQuaternion, this._ownerNode.rotationQuaternion!);\r\n this._virtualTransformNode.scaling.scaleToRef(scaling, this._ownerNode.scaling);\r\n this._virtualTransformNode.position.addToRef(translation.addInPlace(positionOffset), this._ownerNode.position);\r\n this.onPositionChangedObservable.notifyObservers({ position: this._ownerNode.position });\r\n\r\n this._ownerNode.setParent(oldParent);\r\n }\r\n\r\n protected override _targetDragStart() {\r\n const pointerCount = this.currentDraggingPointerIds.length;\r\n\r\n if (!this._ownerNode.rotationQuaternion) {\r\n this._ownerNode.rotationQuaternion = Quaternion.RotationYawPitchRoll(this._ownerNode.rotation.y, this._ownerNode.rotation.x, this._ownerNode.rotation.z);\r\n }\r\n const worldPivot = this._ownerNode.getAbsolutePivotPoint();\r\n\r\n if (pointerCount === 1) {\r\n this._targetPosition.copyFrom(this._ownerNode.absolutePosition);\r\n this._targetOrientation.copyFrom(this._ownerNode.rotationQuaternion);\r\n this._targetScaling.copyFrom(this._ownerNode.absoluteScaling);\r\n\r\n if (this.faceCameraOnDragStart && this._scene.activeCamera) {\r\n const toCamera = TmpVectors.Vector3[0];\r\n this._scene.activeCamera.position.subtractToRef(worldPivot, toCamera);\r\n toCamera.normalize();\r\n const quat = TmpVectors.Quaternion[0];\r\n if (this._scene.useRightHandedSystem) {\r\n Quaternion.FromLookDirectionRHToRef(toCamera, new Vector3(0, 1, 0), quat);\r\n } else {\r\n Quaternion.FromLookDirectionLHToRef(toCamera, new Vector3(0, 1, 0), quat);\r\n }\r\n quat.normalize();\r\n Quaternion.RotationYawPitchRollToRef(quat.toEulerAngles().y, 0, 0, TmpVectors.Quaternion[0]);\r\n this._targetOrientation.copyFrom(TmpVectors.Quaternion[0]);\r\n }\r\n this._startingPosition.copyFrom(this._targetPosition);\r\n this._startingOrientation.copyFrom(this._targetOrientation);\r\n this._startingScaling.copyFrom(this._targetScaling);\r\n } else if (pointerCount === 2) {\r\n this._virtualTransformNode.setPivotPoint(new Vector3(0, 0, 0), Space.LOCAL);\r\n this._virtualTransformNode.position.copyFrom(this._ownerNode.absolutePosition);\r\n this._virtualTransformNode.scaling.copyFrom(this._ownerNode.absoluteScaling);\r\n this._virtualTransformNode.rotationQuaternion!.copyFrom(this._ownerNode.absoluteRotationQuaternion);\r\n this._virtualTransformNode.setPivotPoint(worldPivot, Space.WORLD);\r\n this._resetVirtualMeshesPosition();\r\n }\r\n }\r\n\r\n protected override _targetDrag(worldDeltaPosition: Vector3, worldDeltaRotation: Quaternion) {\r\n if (this.currentDraggingPointerIds.length === 1) {\r\n this._onePointerPositionUpdated(worldDeltaPosition, worldDeltaRotation);\r\n } else if (this.currentDraggingPointerIds.length === 2) {\r\n this._twoPointersPositionUpdated();\r\n }\r\n }\r\n\r\n protected override _targetDragEnd() {\r\n if (this.currentDraggingPointerIds.length === 1) {\r\n // We still have 1 active pointer, we must simulate a dragstart with a reseted position/orientation\r\n this._resetVirtualMeshesPosition();\r\n const previousFaceCameraFlag = this.faceCameraOnDragStart;\r\n this.faceCameraOnDragStart = false;\r\n this._targetDragStart();\r\n this.faceCameraOnDragStart = previousFaceCameraFlag;\r\n }\r\n }\r\n\r\n /**\r\n * Detaches the behavior from the mesh\r\n */\r\n public override detach(): void {\r\n super.detach();\r\n\r\n if (this._ownerNode) {\r\n this._ownerNode.getScene().onBeforeRenderObservable.remove(this._sceneRenderObserver);\r\n }\r\n\r\n if (this._virtualTransformNode) {\r\n this._virtualTransformNode.dispose();\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"sixDofDragBehavior.js","sourceRoot":"","sources":["../../../../../dev/core/src/Behaviors/Meshes/sixDofDragBehavior.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Mesh } from \"../../Meshes/mesh\";\r\nimport type { Scene } from \"../../scene\";\r\nimport type { Nullable } from \"../../types\";\r\nimport { Vector3, Quaternion, Matrix, TmpVectors } from \"../../Maths/math.vector\";\r\nimport type { Observer } from \"../../Misc/observable\";\r\nimport { Observable } from \"../../Misc/observable\";\r\nimport { BaseSixDofDragBehavior } from \"./baseSixDofDragBehavior\";\r\nimport { TransformNode } from \"../../Meshes/transformNode\";\r\nimport { Space } from \"../../Maths/math.axis\";\r\n\r\n/**\r\n * A behavior that when attached to a mesh will allow the mesh to be dragged around based on directions and origin of the pointer's ray\r\n */\r\nexport class SixDofDragBehavior extends BaseSixDofDragBehavior {\r\n private _sceneRenderObserver: Nullable<Observer<Scene>> = null;\r\n private _virtualTransformNode: TransformNode;\r\n\r\n protected _targetPosition = new Vector3(0, 0, 0);\r\n protected _targetOrientation = new Quaternion();\r\n protected _targetScaling = new Vector3(1, 1, 1);\r\n protected _startingPosition = new Vector3(0, 0, 0);\r\n protected _startingOrientation = new Quaternion();\r\n protected _startingScaling = new Vector3(1, 1, 1);\r\n\r\n /**\r\n * Fires when position is updated\r\n */\r\n public onPositionChangedObservable = new Observable<{ position: Vector3 }>();\r\n\r\n /**\r\n * The distance towards the target drag position to move each frame. This can be useful to avoid jitter. Set this to 1 for no delay. (Default: 0.2)\r\n */\r\n public dragDeltaRatio = 0.2;\r\n\r\n /**\r\n * If the object should rotate to face the drag origin\r\n */\r\n public rotateDraggedObject = true;\r\n\r\n /**\r\n * If `rotateDraggedObject` is set to `true`, this parameter determines if we are only rotating around the y axis (yaw)\r\n */\r\n public rotateAroundYOnly = false;\r\n\r\n /**\r\n * Should the behavior rotate 1:1 with the motion controller, when one is used.\r\n */\r\n public rotateWithMotionController = true;\r\n\r\n /**\r\n * The name of the behavior\r\n */\r\n public override get name(): string {\r\n return \"SixDofDrag\";\r\n }\r\n\r\n /**\r\n * Use this flag to update the target but not move the owner node towards the target\r\n */\r\n public disableMovement: boolean = false;\r\n\r\n /**\r\n * Should the object rotate towards the camera when we start dragging it\r\n */\r\n public faceCameraOnDragStart = false;\r\n\r\n /**\r\n * Attaches the six DoF drag behavior\r\n * In XR mode the mesh and its children will have their isNearGrabbable property set to true\r\n * @param ownerNode The mesh that will be dragged around once attached\r\n */\r\n public override attach(ownerNode: Mesh): void {\r\n super.attach(ownerNode);\r\n\r\n ownerNode.isNearGrabbable = true;\r\n // if it has children, make sure they are grabbable too\r\n ownerNode.getChildMeshes().forEach((m) => {\r\n m.isNearGrabbable = true;\r\n });\r\n\r\n // Node that will save the owner's transform\r\n this._virtualTransformNode = new TransformNode(\"virtual_sixDof\", BaseSixDofDragBehavior._virtualScene);\r\n this._virtualTransformNode.rotationQuaternion = Quaternion.Identity();\r\n\r\n // On every frame move towards target scaling to avoid jitter caused by vr controllers\r\n this._sceneRenderObserver = ownerNode.getScene().onBeforeRenderObservable.add(() => {\r\n if (this.currentDraggingPointerIds.length === 1 && this._moving && !this.disableMovement) {\r\n // 1 pointer only drags mesh\r\n const deltaToAdd = TmpVectors.Vector3[0];\r\n deltaToAdd.copyFrom(this._targetPosition).subtractInPlace(ownerNode.absolutePosition).scaleInPlace(this.dragDeltaRatio);\r\n const deltaToAddTransformed = TmpVectors.Vector3[1];\r\n deltaToAddTransformed.copyFrom(deltaToAdd);\r\n // If the node has a parent, transform the delta to local space, so it can be added to the\r\n // position in local space\r\n if (ownerNode.parent) {\r\n const parentRotationMatrixInverse = TmpVectors.Matrix[0];\r\n (ownerNode.parent as TransformNode).absoluteRotationQuaternion.toRotationMatrix(parentRotationMatrixInverse);\r\n parentRotationMatrixInverse.invert();\r\n Vector3.TransformNormalToRef(deltaToAdd, parentRotationMatrixInverse, deltaToAddTransformed);\r\n }\r\n ownerNode.position.addInPlace(deltaToAddTransformed);\r\n\r\n this.onPositionChangedObservable.notifyObservers({ position: ownerNode.absolutePosition });\r\n\r\n // Only rotate the mesh if it's parent has uniform scaling\r\n if (!ownerNode.parent || ((ownerNode.parent as TransformNode).scaling && !(ownerNode.parent as TransformNode).scaling.isNonUniformWithinEpsilon(0.001))) {\r\n const rotationToApply = TmpVectors.Quaternion[0];\r\n rotationToApply.copyFrom(this._targetOrientation);\r\n if (ownerNode.parent) {\r\n const parentRotationInverse = TmpVectors.Quaternion[0];\r\n parentRotationInverse.copyFrom((ownerNode.parent as TransformNode).absoluteRotationQuaternion);\r\n parentRotationInverse.invertInPlace();\r\n parentRotationInverse.multiplyToRef(this._targetOrientation, rotationToApply);\r\n }\r\n Quaternion.SlerpToRef(ownerNode.rotationQuaternion!, rotationToApply, this.dragDeltaRatio, ownerNode.rotationQuaternion!);\r\n }\r\n }\r\n });\r\n }\r\n\r\n private _getPositionOffsetAround(transformationLocalOrigin: Vector3, scaling: number, rotation: Quaternion): Vector3 {\r\n const translationMatrix = TmpVectors.Matrix[0]; // T\r\n const translationMatrixInv = TmpVectors.Matrix[1]; // T'\r\n const rotationMatrix = TmpVectors.Matrix[2]; // R\r\n const scaleMatrix = TmpVectors.Matrix[3]; // S\r\n const finalMatrix = TmpVectors.Matrix[4]; // T' x R x S x T\r\n\r\n Matrix.TranslationToRef(transformationLocalOrigin.x, transformationLocalOrigin.y, transformationLocalOrigin.z, translationMatrix); // T\r\n Matrix.TranslationToRef(-transformationLocalOrigin.x, -transformationLocalOrigin.y, -transformationLocalOrigin.z, translationMatrixInv); // T'\r\n Matrix.FromQuaternionToRef(rotation, rotationMatrix); // R\r\n Matrix.ScalingToRef(scaling, scaling, scaling, scaleMatrix);\r\n translationMatrixInv.multiplyToRef(rotationMatrix, finalMatrix); // T' x R\r\n finalMatrix.multiplyToRef(scaleMatrix, finalMatrix); // T' x R x S\r\n finalMatrix.multiplyToRef(translationMatrix, finalMatrix); // T' x R x S x T\r\n\r\n return finalMatrix.getTranslation();\r\n }\r\n\r\n private _onePointerPositionUpdated(worldDeltaPosition: Vector3, worldDeltaRotation: Quaternion) {\r\n const pointerDelta = TmpVectors.Vector3[0];\r\n pointerDelta.setAll(0);\r\n\r\n if (this._dragging === this._dragType.DRAG) {\r\n if (this.rotateDraggedObject) {\r\n if (this.rotateAroundYOnly) {\r\n // Convert change in rotation to only y axis rotation\r\n Quaternion.RotationYawPitchRollToRef(worldDeltaRotation.toEulerAngles().y, 0, 0, TmpVectors.Quaternion[0]);\r\n } else {\r\n TmpVectors.Quaternion[0].copyFrom(worldDeltaRotation);\r\n }\r\n TmpVectors.Quaternion[0].multiplyToRef(this._startingOrientation, this._targetOrientation);\r\n }\r\n } else if (this._dragging === this._dragType.NEAR_DRAG || (this._dragging === this._dragType.DRAG_WITH_CONTROLLER && this.rotateWithMotionController)) {\r\n worldDeltaRotation.multiplyToRef(this._startingOrientation, this._targetOrientation);\r\n }\r\n\r\n this._targetPosition.copyFrom(this._startingPosition).addInPlace(worldDeltaPosition);\r\n }\r\n\r\n private _twoPointersPositionUpdated() {\r\n const startingPosition0 = this._virtualMeshesInfo[this.currentDraggingPointerIds[0]].startingPosition;\r\n const startingPosition1 = this._virtualMeshesInfo[this.currentDraggingPointerIds[1]].startingPosition;\r\n const startingCenter = TmpVectors.Vector3[0];\r\n startingPosition0.addToRef(startingPosition1, startingCenter);\r\n startingCenter.scaleInPlace(0.5);\r\n const startingVector = TmpVectors.Vector3[1];\r\n startingPosition1.subtractToRef(startingPosition0, startingVector);\r\n\r\n const currentPosition0 = this._virtualMeshesInfo[this.currentDraggingPointerIds[0]].dragMesh.absolutePosition;\r\n const currentPosition1 = this._virtualMeshesInfo[this.currentDraggingPointerIds[1]].dragMesh.absolutePosition;\r\n const currentCenter = TmpVectors.Vector3[2];\r\n currentPosition0.addToRef(currentPosition1, currentCenter);\r\n currentCenter.scaleInPlace(0.5);\r\n const currentVector = TmpVectors.Vector3[3];\r\n currentPosition1.subtractToRef(currentPosition0, currentVector);\r\n\r\n const scaling = currentVector.length() / startingVector.length();\r\n const translation = currentCenter.subtract(startingCenter);\r\n const rotationQuaternion = Quaternion.FromEulerAngles(\r\n 0,\r\n Vector3.GetAngleBetweenVectorsOnPlane(startingVector.normalize(), currentVector.normalize(), Vector3.UpReadOnly),\r\n 0\r\n );\r\n\r\n const oldParent = this._ownerNode.parent;\r\n this._ownerNode.setParent(null);\r\n\r\n const positionOffset = this._getPositionOffsetAround(startingCenter.subtract(this._virtualTransformNode.getAbsolutePivotPoint()), scaling, rotationQuaternion);\r\n this._virtualTransformNode.rotationQuaternion!.multiplyToRef(rotationQuaternion, this._ownerNode.rotationQuaternion!);\r\n this._virtualTransformNode.scaling.scaleToRef(scaling, this._ownerNode.scaling);\r\n this._virtualTransformNode.position.addToRef(translation.addInPlace(positionOffset), this._ownerNode.position);\r\n this.onPositionChangedObservable.notifyObservers({ position: this._ownerNode.position });\r\n\r\n this._ownerNode.setParent(oldParent);\r\n }\r\n\r\n protected override _targetDragStart() {\r\n const pointerCount = this.currentDraggingPointerIds.length;\r\n\r\n if (!this._ownerNode.rotationQuaternion) {\r\n this._ownerNode.rotationQuaternion = Quaternion.RotationYawPitchRoll(this._ownerNode.rotation.y, this._ownerNode.rotation.x, this._ownerNode.rotation.z);\r\n }\r\n const worldPivot = this._ownerNode.getAbsolutePivotPoint();\r\n\r\n if (pointerCount === 1) {\r\n this._targetPosition.copyFrom(this._ownerNode.absolutePosition);\r\n this._targetOrientation.copyFrom(this._ownerNode.rotationQuaternion);\r\n this._targetScaling.copyFrom(this._ownerNode.absoluteScaling);\r\n\r\n if (this.faceCameraOnDragStart && this._scene.activeCamera) {\r\n const toCamera = TmpVectors.Vector3[0];\r\n this._scene.activeCamera.position.subtractToRef(worldPivot, toCamera);\r\n toCamera.normalize();\r\n const quat = TmpVectors.Quaternion[0];\r\n if (this._scene.useRightHandedSystem) {\r\n Quaternion.FromLookDirectionRHToRef(toCamera, new Vector3(0, 1, 0), quat);\r\n } else {\r\n Quaternion.FromLookDirectionLHToRef(toCamera, new Vector3(0, 1, 0), quat);\r\n }\r\n quat.normalize();\r\n Quaternion.RotationYawPitchRollToRef(quat.toEulerAngles().y, 0, 0, TmpVectors.Quaternion[0]);\r\n this._targetOrientation.copyFrom(TmpVectors.Quaternion[0]);\r\n }\r\n this._startingPosition.copyFrom(this._targetPosition);\r\n this._startingOrientation.copyFrom(this._targetOrientation);\r\n this._startingScaling.copyFrom(this._targetScaling);\r\n } else if (pointerCount === 2) {\r\n this._virtualTransformNode.setPivotPoint(new Vector3(0, 0, 0), Space.LOCAL);\r\n this._virtualTransformNode.position.copyFrom(this._ownerNode.absolutePosition);\r\n this._virtualTransformNode.scaling.copyFrom(this._ownerNode.absoluteScaling);\r\n this._virtualTransformNode.rotationQuaternion!.copyFrom(this._ownerNode.absoluteRotationQuaternion);\r\n this._virtualTransformNode.setPivotPoint(worldPivot, Space.WORLD);\r\n this._resetVirtualMeshesPosition();\r\n }\r\n }\r\n\r\n protected override _targetDrag(worldDeltaPosition: Vector3, worldDeltaRotation: Quaternion) {\r\n if (this.currentDraggingPointerIds.length === 1) {\r\n this._onePointerPositionUpdated(worldDeltaPosition, worldDeltaRotation);\r\n } else if (this.currentDraggingPointerIds.length === 2) {\r\n this._twoPointersPositionUpdated();\r\n }\r\n }\r\n\r\n protected override _targetDragEnd() {\r\n if (this.currentDraggingPointerIds.length === 1) {\r\n // We still have 1 active pointer, we must simulate a dragstart with a reseted position/orientation\r\n this._resetVirtualMeshesPosition();\r\n const previousFaceCameraFlag = this.faceCameraOnDragStart;\r\n this.faceCameraOnDragStart = false;\r\n this._targetDragStart();\r\n this.faceCameraOnDragStart = previousFaceCameraFlag;\r\n }\r\n }\r\n\r\n /**\r\n * Detaches the behavior from the mesh\r\n */\r\n public override detach(): void {\r\n super.detach();\r\n\r\n if (this._ownerNode) {\r\n this._ownerNode.getScene().onBeforeRenderObservable.remove(this._sceneRenderObserver);\r\n }\r\n\r\n if (this._virtualTransformNode) {\r\n this._virtualTransformNode.dispose();\r\n }\r\n }\r\n}\r\n"]}