@babylonjs/core 8.3.1 → 8.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (327) hide show
  1. package/Animations/animation.d.ts +4 -0
  2. package/Animations/animation.js +22 -13
  3. package/Animations/animation.js.map +1 -1
  4. package/Animations/animation.optimizations.d.ts +31 -0
  5. package/Animations/animation.optimizations.js +41 -0
  6. package/Animations/animation.optimizations.js.map +1 -0
  7. package/Animations/index.d.ts +1 -0
  8. package/Animations/index.js +1 -0
  9. package/Animations/index.js.map +1 -1
  10. package/Animations/pathCursor.js +3 -1
  11. package/Animations/pathCursor.js.map +1 -1
  12. package/Animations/runtimeAnimation.d.ts +3 -1
  13. package/Animations/runtimeAnimation.js +127 -116
  14. package/Animations/runtimeAnimation.js.map +1 -1
  15. package/Audio/audioSceneComponent.js +4 -4
  16. package/Audio/audioSceneComponent.js.map +1 -1
  17. package/Behaviors/Meshes/attachToBoxBehavior.js +6 -6
  18. package/Behaviors/Meshes/attachToBoxBehavior.js.map +1 -1
  19. package/Behaviors/Meshes/fadeInOutBehavior.js +3 -2
  20. package/Behaviors/Meshes/fadeInOutBehavior.js.map +1 -1
  21. package/Behaviors/Meshes/multiPointerScaleBehavior.js +6 -4
  22. package/Behaviors/Meshes/multiPointerScaleBehavior.js.map +1 -1
  23. package/Behaviors/Meshes/sixDofDragBehavior.js +3 -2
  24. package/Behaviors/Meshes/sixDofDragBehavior.js.map +1 -1
  25. package/Bones/skeleton.js +6 -6
  26. package/Bones/skeleton.js.map +1 -1
  27. package/Cameras/Inputs/followCameraKeyboardMoveInput.js +2 -2
  28. package/Cameras/Inputs/followCameraKeyboardMoveInput.js.map +1 -1
  29. package/Cameras/VR/vrExperienceHelper.js +2 -2
  30. package/Cameras/VR/vrExperienceHelper.js.map +1 -1
  31. package/Cameras/arcRotateCamera.js +6 -2
  32. package/Cameras/arcRotateCamera.js.map +1 -1
  33. package/Cameras/camera.js +2 -2
  34. package/Cameras/camera.js.map +1 -1
  35. package/Cameras/deviceOrientationCamera.js +3 -2
  36. package/Cameras/deviceOrientationCamera.js.map +1 -1
  37. package/Collisions/gpuPicker.d.ts +1 -0
  38. package/Collisions/gpuPicker.js +9 -0
  39. package/Collisions/gpuPicker.js.map +1 -1
  40. package/Debug/axesViewer.js +3 -2
  41. package/Debug/axesViewer.js.map +1 -1
  42. package/Debug/directionalLightFrustumViewer.js +4 -4
  43. package/Debug/directionalLightFrustumViewer.js.map +1 -1
  44. package/Debug/physicsViewer.js +7 -6
  45. package/Debug/physicsViewer.js.map +1 -1
  46. package/Debug/skeletonViewer.js +4 -4
  47. package/Debug/skeletonViewer.js.map +1 -1
  48. package/Engines/Processors/shaderCodeNode.js +2 -2
  49. package/Engines/Processors/shaderCodeNode.js.map +1 -1
  50. package/Engines/abstractEngine.d.ts +1 -0
  51. package/Engines/abstractEngine.js +14 -8
  52. package/Engines/abstractEngine.js.map +1 -1
  53. package/Engines/constants.d.ts +27 -5
  54. package/Engines/constants.js +27 -5
  55. package/Engines/constants.js.map +1 -1
  56. package/Engines/engine.js +8 -8
  57. package/Engines/engine.js.map +1 -1
  58. package/Engines/webgpuEngine.js +6 -2
  59. package/Engines/webgpuEngine.js.map +1 -1
  60. package/FlowGraph/Blocks/Data/Transformers/flowGraphJsonPointerParserBlock.js +2 -2
  61. package/FlowGraph/Blocks/Data/Transformers/flowGraphJsonPointerParserBlock.js.map +1 -1
  62. package/FlowGraph/Blocks/Data/flowGraphDataSwitchBlock.js +3 -2
  63. package/FlowGraph/Blocks/Data/flowGraphDataSwitchBlock.js.map +1 -1
  64. package/FlowGraph/Blocks/Event/flowGraphReceiveCustomEventBlock.js +3 -2
  65. package/FlowGraph/Blocks/Event/flowGraphReceiveCustomEventBlock.js.map +1 -1
  66. package/FlowGraph/Blocks/Event/flowGraphSendCustomEventBlock.js +2 -2
  67. package/FlowGraph/Blocks/Event/flowGraphSendCustomEventBlock.js.map +1 -1
  68. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphSwitchBlock.js +3 -2
  69. package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphSwitchBlock.js.map +1 -1
  70. package/FlowGraph/flowGraphAsyncExecutionBlock.js +5 -3
  71. package/FlowGraph/flowGraphAsyncExecutionBlock.js.map +1 -1
  72. package/FlowGraph/flowGraphBlock.js +3 -2
  73. package/FlowGraph/flowGraphBlock.js.map +1 -1
  74. package/FlowGraph/flowGraphCoordinator.js +10 -6
  75. package/FlowGraph/flowGraphCoordinator.js.map +1 -1
  76. package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.js +2 -2
  77. package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.js.map +1 -1
  78. package/FrameGraph/Node/nodeRenderGraphBlock.js +5 -4
  79. package/FrameGraph/Node/nodeRenderGraphBlock.js.map +1 -1
  80. package/FrameGraph/Tasks/PostProcesses/depthOfFieldMergeTask.js +4 -3
  81. package/FrameGraph/Tasks/PostProcesses/depthOfFieldMergeTask.js.map +1 -1
  82. package/Gamepads/gamepadManager.js +2 -2
  83. package/Gamepads/gamepadManager.js.map +1 -1
  84. package/Gizmos/axisDragGizmo.js +3 -2
  85. package/Gizmos/axisDragGizmo.js.map +1 -1
  86. package/Gizmos/axisScaleGizmo.js +6 -4
  87. package/Gizmos/axisScaleGizmo.js.map +1 -1
  88. package/Gizmos/boundingBoxGizmo.js +28 -26
  89. package/Gizmos/boundingBoxGizmo.js.map +1 -1
  90. package/Gizmos/cameraGizmo.js +6 -3
  91. package/Gizmos/cameraGizmo.js.map +1 -1
  92. package/Gizmos/gizmo.js +11 -10
  93. package/Gizmos/gizmo.js.map +1 -1
  94. package/Gizmos/gizmoManager.js +16 -12
  95. package/Gizmos/gizmoManager.js.map +1 -1
  96. package/Gizmos/lightGizmo.js +3 -2
  97. package/Gizmos/lightGizmo.js.map +1 -1
  98. package/Gizmos/planeDragGizmo.js +3 -2
  99. package/Gizmos/planeDragGizmo.js.map +1 -1
  100. package/Gizmos/planeRotationGizmo.js +3 -2
  101. package/Gizmos/planeRotationGizmo.js.map +1 -1
  102. package/Gizmos/positionGizmo.js +41 -28
  103. package/Gizmos/positionGizmo.js.map +1 -1
  104. package/Gizmos/rotationGizmo.js +26 -18
  105. package/Gizmos/rotationGizmo.js.map +1 -1
  106. package/Gizmos/scaleGizmo.js +47 -32
  107. package/Gizmos/scaleGizmo.js.map +1 -1
  108. package/Layers/effectLayerSceneComponent.js +4 -4
  109. package/Layers/effectLayerSceneComponent.js.map +1 -1
  110. package/Layers/layerSceneComponent.js +4 -4
  111. package/Layers/layerSceneComponent.js.map +1 -1
  112. package/LensFlares/lensFlareSystemSceneComponent.js +4 -4
  113. package/LensFlares/lensFlareSystemSceneComponent.js.map +1 -1
  114. package/Lights/Shadows/shadowGenerator.js +3 -3
  115. package/Lights/Shadows/shadowGenerator.js.map +1 -1
  116. package/Lights/light.js +4 -4
  117. package/Lights/light.js.map +1 -1
  118. package/Loading/Plugins/babylonFileLoader.js +54 -46
  119. package/Loading/Plugins/babylonFileLoader.js.map +1 -1
  120. package/Loading/loadingScreen.js +4 -3
  121. package/Loading/loadingScreen.js.map +1 -1
  122. package/Loading/sceneLoader.js +15 -12
  123. package/Loading/sceneLoader.js.map +1 -1
  124. package/Materials/Node/Blocks/Dual/currentScreenBlock.js +9 -3
  125. package/Materials/Node/Blocks/Dual/currentScreenBlock.js.map +1 -1
  126. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js +11 -0
  127. package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js.map +1 -1
  128. package/Materials/Node/Blocks/Input/inputBlock.js +18 -31
  129. package/Materials/Node/Blocks/Input/inputBlock.js.map +1 -1
  130. package/Materials/Node/Blocks/baseMathBlock.js +3 -1
  131. package/Materials/Node/Blocks/baseMathBlock.js.map +1 -1
  132. package/Materials/Node/Blocks/customBlock.js +53 -43
  133. package/Materials/Node/Blocks/customBlock.js.map +1 -1
  134. package/Materials/Node/Enums/nodeMaterialModes.d.ts +3 -1
  135. package/Materials/Node/Enums/nodeMaterialModes.js +2 -0
  136. package/Materials/Node/Enums/nodeMaterialModes.js.map +1 -1
  137. package/Materials/Node/nodeMaterial.d.ts +5 -0
  138. package/Materials/Node/nodeMaterial.js +33 -20
  139. package/Materials/Node/nodeMaterial.js.map +1 -1
  140. package/Materials/Node/nodeMaterialBlock.js +7 -4
  141. package/Materials/Node/nodeMaterialBlock.js.map +1 -1
  142. package/Materials/Node/nodeMaterialBuildState.d.ts +13 -2
  143. package/Materials/Node/nodeMaterialBuildState.js +72 -7
  144. package/Materials/Node/nodeMaterialBuildState.js.map +1 -1
  145. package/Materials/Node/nodeMaterialDefault.d.ts +5 -0
  146. package/Materials/Node/nodeMaterialDefault.js +28 -0
  147. package/Materials/Node/nodeMaterialDefault.js.map +1 -1
  148. package/Materials/Textures/cubeTexture.js +3 -1
  149. package/Materials/Textures/cubeTexture.js.map +1 -1
  150. package/Materials/Textures/videoTexture.js +5 -4
  151. package/Materials/Textures/videoTexture.js.map +1 -1
  152. package/Materials/materialDefines.js +3 -1
  153. package/Materials/materialDefines.js.map +1 -1
  154. package/Materials/multiMaterial.js +3 -1
  155. package/Materials/multiMaterial.js.map +1 -1
  156. package/Materials/shaderMaterial.js +3 -2
  157. package/Materials/shaderMaterial.js.map +1 -1
  158. package/Meshes/Compression/dracoEncoder.js +2 -2
  159. package/Meshes/Compression/dracoEncoder.js.map +1 -1
  160. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js +8 -8
  161. package/Meshes/GaussianSplatting/gaussianSplattingMesh.js.map +1 -1
  162. package/Meshes/GreasedLine/greasedLineMesh.js +6 -6
  163. package/Meshes/GreasedLine/greasedLineMesh.js.map +1 -1
  164. package/Meshes/GreasedLine/greasedLineRibbonMesh.js +4 -3
  165. package/Meshes/GreasedLine/greasedLineRibbonMesh.js.map +1 -1
  166. package/Meshes/Node/Blocks/mathBlock.js +3 -1
  167. package/Meshes/Node/Blocks/mathBlock.js.map +1 -1
  168. package/Meshes/Node/nodeGeometryBlock.js +8 -5
  169. package/Meshes/Node/nodeGeometryBlock.js.map +1 -1
  170. package/Meshes/abstractMesh.js +2 -2
  171. package/Meshes/abstractMesh.js.map +1 -1
  172. package/Meshes/geodesicMesh.js +2 -2
  173. package/Meshes/geodesicMesh.js.map +1 -1
  174. package/Meshes/mesh.js +6 -6
  175. package/Meshes/mesh.js.map +1 -1
  176. package/Meshes/mesh.vertexData.functions.js +11 -10
  177. package/Meshes/mesh.vertexData.functions.js.map +1 -1
  178. package/Meshes/mesh.vertexData.subdivide.js +10 -10
  179. package/Meshes/mesh.vertexData.subdivide.js.map +1 -1
  180. package/Meshes/meshSimplification.js +10 -10
  181. package/Meshes/meshSimplification.js.map +1 -1
  182. package/Meshes/meshUtils.js +6 -3
  183. package/Meshes/meshUtils.js.map +1 -1
  184. package/Meshes/polygonMesh.js +10 -10
  185. package/Meshes/polygonMesh.js.map +1 -1
  186. package/Misc/PerformanceViewer/performanceViewerCollector.js +4 -4
  187. package/Misc/PerformanceViewer/performanceViewerCollector.js.map +1 -1
  188. package/Misc/arrayTools.js +2 -2
  189. package/Misc/arrayTools.js.map +1 -1
  190. package/Misc/asyncLock.js +9 -9
  191. package/Misc/asyncLock.js.map +1 -1
  192. package/Misc/basis.js +4 -2
  193. package/Misc/basis.js.map +1 -1
  194. package/Misc/deepCopier.js +3 -2
  195. package/Misc/deepCopier.js.map +1 -1
  196. package/Misc/deepMerger.js +3 -2
  197. package/Misc/deepMerger.js.map +1 -1
  198. package/Misc/fileTools.js +4 -4
  199. package/Misc/fileTools.js.map +1 -1
  200. package/Misc/greasedLineTools.js +14 -13
  201. package/Misc/greasedLineTools.js.map +1 -1
  202. package/Misc/logger.js +3 -2
  203. package/Misc/logger.js.map +1 -1
  204. package/Misc/observable.extensions.js +4 -4
  205. package/Misc/observable.extensions.js.map +1 -1
  206. package/Misc/sceneSerializer.js +5 -4
  207. package/Misc/sceneSerializer.js.map +1 -1
  208. package/Misc/snapshotRenderingHelper.js +3 -1
  209. package/Misc/snapshotRenderingHelper.js.map +1 -1
  210. package/Misc/tags.js +2 -2
  211. package/Misc/tags.js.map +1 -1
  212. package/Misc/trajectoryClassifier.js +8 -8
  213. package/Misc/trajectoryClassifier.js.map +1 -1
  214. package/Particles/IParticleSystem.d.ts +1 -1
  215. package/Particles/IParticleSystem.js.map +1 -1
  216. package/Particles/baseParticleSystem.d.ts +11 -3
  217. package/Particles/baseParticleSystem.js +37 -3
  218. package/Particles/baseParticleSystem.js.map +1 -1
  219. package/Particles/gpuParticleSystem.js +1 -14
  220. package/Particles/gpuParticleSystem.js.map +1 -1
  221. package/Particles/particle.js +2 -2
  222. package/Particles/particle.js.map +1 -1
  223. package/Particles/particleSystem.js +15 -13
  224. package/Particles/particleSystem.js.map +1 -1
  225. package/Particles/thinParticleSystem.js +3 -16
  226. package/Particles/thinParticleSystem.js.map +1 -1
  227. package/Physics/physicsHelper.js +18 -14
  228. package/Physics/physicsHelper.js.map +1 -1
  229. package/Physics/v1/Plugins/ammoJSPlugin.js +10 -8
  230. package/Physics/v1/Plugins/ammoJSPlugin.js.map +1 -1
  231. package/Physics/v1/Plugins/cannonJSPlugin.js +13 -8
  232. package/Physics/v1/Plugins/cannonJSPlugin.js.map +1 -1
  233. package/Physics/v1/Plugins/oimoJSPlugin.js +9 -8
  234. package/Physics/v1/Plugins/oimoJSPlugin.js.map +1 -1
  235. package/Physics/v1/physicsEngine.js +4 -4
  236. package/Physics/v1/physicsEngine.js.map +1 -1
  237. package/Physics/v1/physicsImpostor.js +10 -21
  238. package/Physics/v1/physicsImpostor.js.map +1 -1
  239. package/Physics/v2/Plugins/havokPlugin.js +12 -10
  240. package/Physics/v2/Plugins/havokPlugin.js.map +1 -1
  241. package/Physics/v2/ragdoll.js +4 -4
  242. package/Physics/v2/ragdoll.js.map +1 -1
  243. package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.js +3 -2
  244. package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.js.map +1 -1
  245. package/PostProcesses/RenderPipeline/postProcessRenderEffect.js +8 -6
  246. package/PostProcesses/RenderPipeline/postProcessRenderEffect.js.map +1 -1
  247. package/PostProcesses/depthOfFieldMergePostProcess.js +4 -3
  248. package/PostProcesses/depthOfFieldMergePostProcess.js.map +1 -1
  249. package/Rendering/GlobalIllumination/giRSMManager.js +6 -6
  250. package/Rendering/GlobalIllumination/giRSMManager.js.map +1 -1
  251. package/Rendering/IBLShadows/iblShadowsRenderPipeline.js +14 -14
  252. package/Rendering/IBLShadows/iblShadowsRenderPipeline.js.map +1 -1
  253. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js +14 -12
  254. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js.map +1 -1
  255. package/Rendering/iblCdfGenerator.js +4 -4
  256. package/Rendering/iblCdfGenerator.js.map +1 -1
  257. package/Rendering/objectRenderer.js +2 -2
  258. package/Rendering/objectRenderer.js.map +1 -1
  259. package/Rendering/reflectiveShadowMap.js +7 -5
  260. package/Rendering/reflectiveShadowMap.js.map +1 -1
  261. package/Sprites/spriteMap.js +2 -2
  262. package/Sprites/spriteMap.js.map +1 -1
  263. package/XR/features/WebXRAbstractFeature.js +2 -2
  264. package/XR/features/WebXRAbstractFeature.js.map +1 -1
  265. package/XR/features/WebXRAnchorSystem.js +4 -4
  266. package/XR/features/WebXRAnchorSystem.js.map +1 -1
  267. package/XR/features/WebXRBackgroundRemover.js +3 -1
  268. package/XR/features/WebXRBackgroundRemover.js.map +1 -1
  269. package/XR/features/WebXRControllerMovement.js +6 -3
  270. package/XR/features/WebXRControllerMovement.js.map +1 -1
  271. package/XR/features/WebXRControllerPhysics.js +12 -7
  272. package/XR/features/WebXRControllerPhysics.js.map +1 -1
  273. package/XR/features/WebXRControllerPointerSelection.js +12 -7
  274. package/XR/features/WebXRControllerPointerSelection.js.map +1 -1
  275. package/XR/features/WebXRControllerTeleportation.js +11 -7
  276. package/XR/features/WebXRControllerTeleportation.js.map +1 -1
  277. package/XR/features/WebXRDepthSensing.js +6 -6
  278. package/XR/features/WebXRDepthSensing.js.map +1 -1
  279. package/XR/features/WebXRHandTracking.js +60 -24
  280. package/XR/features/WebXRHandTracking.js.map +1 -1
  281. package/XR/features/WebXRHitTest.js +4 -4
  282. package/XR/features/WebXRHitTest.js.map +1 -1
  283. package/XR/features/WebXRImageTracking.js +2 -2
  284. package/XR/features/WebXRImageTracking.js.map +1 -1
  285. package/XR/features/WebXRLayers.js +2 -2
  286. package/XR/features/WebXRLayers.js.map +1 -1
  287. package/XR/features/WebXRNearInteraction.js +12 -7
  288. package/XR/features/WebXRNearInteraction.js.map +1 -1
  289. package/XR/features/WebXRRawCameraAccess.js +9 -4
  290. package/XR/features/WebXRRawCameraAccess.js.map +1 -1
  291. package/XR/features/WebXRSpaceWarp.js +2 -2
  292. package/XR/features/WebXRSpaceWarp.js.map +1 -1
  293. package/XR/motionController/webXRAbstractMotionController.js +19 -8
  294. package/XR/motionController/webXRAbstractMotionController.js.map +1 -1
  295. package/XR/motionController/webXRGenericMotionController.js +2 -2
  296. package/XR/motionController/webXRGenericMotionController.js.map +1 -1
  297. package/XR/motionController/webXRHTCViveMotionController.js +5 -4
  298. package/XR/motionController/webXRHTCViveMotionController.js.map +1 -1
  299. package/XR/motionController/webXRMicrosoftMixedRealityController.js +9 -6
  300. package/XR/motionController/webXRMicrosoftMixedRealityController.js.map +1 -1
  301. package/XR/motionController/webXRMotionControllerManager.js +4 -4
  302. package/XR/motionController/webXRMotionControllerManager.js.map +1 -1
  303. package/XR/motionController/webXROculusTouchMotionController.js +5 -4
  304. package/XR/motionController/webXROculusTouchMotionController.js.map +1 -1
  305. package/XR/motionController/webXRProfiledMotionController.js +15 -10
  306. package/XR/motionController/webXRProfiledMotionController.js.map +1 -1
  307. package/XR/webXRCamera.js +3 -2
  308. package/XR/webXRCamera.js.map +1 -1
  309. package/XR/webXREnterExitUI.js +5 -4
  310. package/XR/webXREnterExitUI.js.map +1 -1
  311. package/XR/webXRExperienceHelper.js +2 -2
  312. package/XR/webXRExperienceHelper.js.map +1 -1
  313. package/XR/webXRFeaturesManager.js +10 -7
  314. package/XR/webXRFeaturesManager.js.map +1 -1
  315. package/XR/webXRInput.js +8 -8
  316. package/XR/webXRInput.js.map +1 -1
  317. package/XR/webXRInputSource.js +4 -1
  318. package/XR/webXRInputSource.js.map +1 -1
  319. package/XR/webXRRenderTargetTextureProvider.js +3 -1
  320. package/XR/webXRRenderTargetTextureProvider.js.map +1 -1
  321. package/assetContainer.js +156 -135
  322. package/assetContainer.js.map +1 -1
  323. package/node.js +2 -2
  324. package/node.js.map +1 -1
  325. package/package.json +1 -1
  326. package/scene.js +18 -11
  327. package/scene.js.map +1 -1
package/Gizmos/gizmo.js CHANGED
@@ -78,9 +78,10 @@ export class Gizmo {
78
78
  // eslint-disable-next-line no-throw-literal
79
79
  throw "When setting a custom mesh on a gizmo, the custom meshes scene must be the same as the gizmos (eg. gizmo.gizmoLayer.utilityLayerScene)";
80
80
  }
81
- this._rootMesh.getChildMeshes().forEach((c) => {
81
+ const children = this._rootMesh.getChildMeshes();
82
+ for (const c of children) {
82
83
  c.dispose();
83
- });
84
+ }
84
85
  mesh.parent = this._rootMesh;
85
86
  this._customMeshSet = true;
86
87
  }
@@ -427,12 +428,12 @@ export class Gizmo {
427
428
  */
428
429
  _setGizmoMeshMaterial(gizmoMeshes, material) {
429
430
  if (gizmoMeshes) {
430
- gizmoMeshes.forEach((m) => {
431
+ for (const m of gizmoMeshes) {
431
432
  m.material = material;
432
433
  if (m.color) {
433
434
  m.color = material.diffuseColor;
434
435
  }
435
- });
436
+ }
436
437
  }
437
438
  }
438
439
  /**
@@ -457,12 +458,12 @@ export class Gizmo {
457
458
  cache.active = false;
458
459
  dragging = false;
459
460
  activeDragButton = -1;
460
- cache.gizmoMeshes.forEach((m) => {
461
+ for (const m of cache.gizmoMeshes) {
461
462
  m.material = cache.dragBehavior.enabled ? cache.material : cache.disableMaterial;
462
463
  if (m.color) {
463
464
  m.color = cache.material.diffuseColor;
464
465
  }
465
- });
466
+ }
466
467
  });
467
468
  }
468
469
  else if (pointerInfo.type === PointerEventTypes.POINTERMOVE) {
@@ -474,12 +475,12 @@ export class Gizmo {
474
475
  if (cache.colliderMeshes && cache.gizmoMeshes) {
475
476
  const isHovered = cache.colliderMeshes?.indexOf(pointerInfo?.pickInfo?.pickedMesh) != -1;
476
477
  const material = cache.dragBehavior.enabled ? (isHovered || cache.active ? cache.hoverMaterial : cache.material) : cache.disableMaterial;
477
- cache.gizmoMeshes.forEach((m) => {
478
+ for (const m of cache.gizmoMeshes) {
478
479
  m.material = material;
479
480
  if (m.color) {
480
481
  m.color = material.diffuseColor;
481
482
  }
482
- });
483
+ }
483
484
  }
484
485
  });
485
486
  }
@@ -494,12 +495,12 @@ export class Gizmo {
494
495
  gizmoAxisCache.forEach((cache) => {
495
496
  const isHovered = cache.colliderMeshes?.indexOf(pointerInfo?.pickInfo?.pickedMesh) != -1;
496
497
  const material = (isHovered || cache.active) && cache.dragBehavior.enabled ? cache.hoverMaterial : cache.disableMaterial;
497
- cache.gizmoMeshes.forEach((m) => {
498
+ for (const m of cache.gizmoMeshes) {
498
499
  m.material = material;
499
500
  if (m.color) {
500
501
  m.color = material.diffuseColor;
501
502
  }
502
- });
503
+ }
503
504
  });
504
505
  }
505
506
  }
@@ -1 +1 @@
1
- {"version":3,"file":"gizmo.js","sourceRoot":"","sources":["../../../../dev/core/src/Gizmos/gizmo.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Observer } from \"../Misc/observable\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { Scene, IDisposable } from \"../scene\";\r\nimport { Quaternion, Vector3, Matrix, TmpVectors } from \"../Maths/math.vector\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\nimport { Camera } from \"../Cameras/camera\";\r\nimport type { TargetCamera } from \"../Cameras/targetCamera\";\r\nimport type { Node } from \"../node\";\r\nimport type { Bone } from \"../Bones/bone\";\r\nimport { UtilityLayerRenderer } from \"../Rendering/utilityLayerRenderer\";\r\nimport type { TransformNode } from \"../Meshes/transformNode\";\r\nimport type { StandardMaterial } from \"../Materials/standardMaterial\";\r\nimport type { PointerInfo } from \"../Events/pointerEvents\";\r\nimport { PointerEventTypes } from \"../Events/pointerEvents\";\r\nimport type { LinesMesh } from \"../Meshes/linesMesh\";\r\nimport type { PointerDragBehavior } from \"../Behaviors/Meshes/pointerDragBehavior\";\r\nimport type { ShadowLight } from \"../Lights/shadowLight\";\r\nimport { Light } from \"../Lights/light\";\r\n\r\n/**\r\n * Cache built by each axis. Used for managing state between all elements of gizmo for enhanced UI\r\n */\r\nexport interface GizmoAxisCache {\r\n /** Mesh used to render the Gizmo */\r\n gizmoMeshes: Mesh[];\r\n /** Mesh used to detect user interaction with Gizmo */\r\n colliderMeshes: Mesh[];\r\n /** Material used to indicate color of gizmo mesh */\r\n material: StandardMaterial;\r\n /** Material used to indicate hover state of the Gizmo */\r\n hoverMaterial: StandardMaterial;\r\n /** Material used to indicate disabled state of the Gizmo */\r\n disableMaterial: StandardMaterial;\r\n /** Used to indicate Active state of the Gizmo */\r\n active: boolean;\r\n /** DragBehavior */\r\n dragBehavior: PointerDragBehavior;\r\n}\r\n\r\n/**\r\n * Anchor options where the Gizmo can be positioned in relation to its anchored node\r\n */\r\nexport const enum GizmoAnchorPoint {\r\n /** The origin of the attached node */\r\n Origin,\r\n /** The pivot point of the attached node*/\r\n Pivot,\r\n}\r\n\r\n/**\r\n * Coordinates mode: Local or World. Defines how axis is aligned: either on world axis or transform local axis\r\n */\r\nexport const enum GizmoCoordinatesMode {\r\n World,\r\n Local,\r\n}\r\n\r\n/**\r\n * Interface for basic gizmo\r\n */\r\nexport interface IGizmo extends IDisposable {\r\n /** True when the mouse pointer is hovered a gizmo mesh */\r\n readonly isHovered: boolean;\r\n /** The root mesh of the gizmo */\r\n _rootMesh: Mesh;\r\n /** Ratio for the scale of the gizmo */\r\n scaleRatio: number;\r\n /**\r\n * Mesh that the gizmo will be attached to. (eg. on a drag gizmo the mesh that will be dragged)\r\n * * When set, interactions will be enabled\r\n */\r\n attachedMesh: Nullable<AbstractMesh>;\r\n /**\r\n * Node that the gizmo will be attached to. (eg. on a drag gizmo the mesh, bone or NodeTransform that will be dragged)\r\n * * When set, interactions will be enabled\r\n */\r\n attachedNode: Nullable<Node>;\r\n /**\r\n * If set the gizmo's rotation will be updated to match the attached mesh each frame (Default: true)\r\n */\r\n updateGizmoRotationToMatchAttachedMesh: boolean;\r\n /** The utility layer the gizmo will be added to */\r\n gizmoLayer: UtilityLayerRenderer;\r\n /**\r\n * If set the gizmo's position will be updated to match the attached mesh each frame (Default: true)\r\n */\r\n updateGizmoPositionToMatchAttachedMesh: boolean;\r\n /**\r\n * Defines where the gizmo will be positioned if `updateGizmoPositionToMatchAttachedMesh` is enabled.\r\n * (Default: GizmoAnchorPoint.Origin)\r\n */\r\n anchorPoint: GizmoAnchorPoint;\r\n\r\n /**\r\n * Set the coordinate mode to use. By default it's local.\r\n */\r\n coordinatesMode: GizmoCoordinatesMode;\r\n\r\n /**\r\n * When set, the gizmo will always appear the same size no matter where the camera is (default: true)\r\n */\r\n updateScale: boolean;\r\n /**\r\n * posture that the gizmo will be display\r\n * When set null, default value will be used (Quaternion(0, 0, 0, 1))\r\n */\r\n customRotationQuaternion: Nullable<Quaternion>;\r\n /**\r\n * Disposes and replaces the current meshes in the gizmo with the specified mesh\r\n * @param mesh The mesh to replace the default mesh of the gizmo\r\n */\r\n setCustomMesh(mesh: Mesh): void;\r\n\r\n /**\r\n * Additional transform applied to the gizmo.\r\n * It's useful when the gizmo is attached to a bone: if the bone is part of a skeleton attached to a mesh, you should define the mesh as additionalTransformNode if you want the gizmo to be displayed at the bone's correct location.\r\n * Otherwise, as the gizmo is relative to the skeleton root, the mesh transformation will not be taken into account.\r\n */\r\n additionalTransformNode?: TransformNode | undefined;\r\n}\r\n/**\r\n * Renders gizmos on top of an existing scene which provide controls for position, rotation, etc.\r\n */\r\nexport class Gizmo implements IGizmo {\r\n /**\r\n * The root mesh of the gizmo\r\n */\r\n public _rootMesh: Mesh;\r\n protected _attachedMesh: Nullable<AbstractMesh> = null;\r\n protected _attachedNode: Nullable<Node> = null;\r\n protected _customRotationQuaternion: Nullable<Quaternion> = null;\r\n protected _additionalTransformNode?: TransformNode;\r\n /**\r\n * Ratio for the scale of the gizmo (Default: 1)\r\n */\r\n protected _scaleRatio = 1;\r\n\r\n /**\r\n * boolean updated by pointermove when a gizmo mesh is hovered\r\n */\r\n protected _isHovered = false;\r\n\r\n /**\r\n * When enabled, any gizmo operation will perserve scaling sign. Default is off.\r\n * Only valid for TransformNode derived classes (Mesh, AbstractMesh, ...)\r\n */\r\n public static PreserveScaling = false;\r\n\r\n /**\r\n * There are 2 ways to preserve scaling: using mesh scaling or absolute scaling. Depending of hierarchy, non uniform scaling and LH or RH coordinates. One is preferable than the other.\r\n * If the scaling to be preserved is the local scaling, then set this value to false.\r\n * Default is true which means scaling to be preserved is absolute one (with hierarchy applied)\r\n */\r\n public static UseAbsoluteScaling = true;\r\n\r\n /**\r\n * Ratio for the scale of the gizmo (Default: 1)\r\n */\r\n public set scaleRatio(value: number) {\r\n this._scaleRatio = value;\r\n }\r\n\r\n public get scaleRatio() {\r\n return this._scaleRatio;\r\n }\r\n\r\n /**\r\n * True when the mouse pointer is hovered a gizmo mesh\r\n */\r\n public get isHovered() {\r\n return this._isHovered;\r\n }\r\n\r\n /**\r\n * If a custom mesh has been set (Default: false)\r\n */\r\n protected _customMeshSet = false;\r\n /**\r\n * Mesh that the gizmo will be attached to. (eg. on a drag gizmo the mesh that will be dragged)\r\n * * When set, interactions will be enabled\r\n */\r\n public get attachedMesh() {\r\n return this._attachedMesh;\r\n }\r\n public set attachedMesh(value) {\r\n this._attachedMesh = value;\r\n if (value) {\r\n this._attachedNode = value;\r\n }\r\n this._rootMesh.setEnabled(value ? true : false);\r\n this._attachedNodeChanged(value);\r\n }\r\n /**\r\n * Node that the gizmo will be attached to. (eg. on a drag gizmo the mesh, bone or NodeTransform that will be dragged)\r\n * * When set, interactions will be enabled\r\n */\r\n public get attachedNode() {\r\n return this._attachedNode;\r\n }\r\n public set attachedNode(value) {\r\n this._attachedNode = value;\r\n this._attachedMesh = null;\r\n this._rootMesh.setEnabled(value ? true : false);\r\n this._attachedNodeChanged(value);\r\n }\r\n\r\n /**\r\n * Disposes and replaces the current meshes in the gizmo with the specified mesh\r\n * @param mesh The mesh to replace the default mesh of the gizmo\r\n */\r\n public setCustomMesh(mesh: Mesh) {\r\n if (mesh.getScene() != this.gizmoLayer.utilityLayerScene) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"When setting a custom mesh on a gizmo, the custom meshes scene must be the same as the gizmos (eg. gizmo.gizmoLayer.utilityLayerScene)\";\r\n }\r\n this._rootMesh.getChildMeshes().forEach((c) => {\r\n c.dispose();\r\n });\r\n mesh.parent = this._rootMesh;\r\n this._customMeshSet = true;\r\n }\r\n\r\n /**\r\n * Additional transform applied to the gizmo.\r\n * It's useful when the gizmo is attached to a bone: if the bone is part of a skeleton attached to a mesh, you should define the mesh as additionalTransformNode if you want the gizmo to be displayed at the bone's correct location.\r\n * Otherwise, as the gizmo is relative to the skeleton root, the mesh transformation will not be taken into account.\r\n */\r\n public get additionalTransformNode() {\r\n return this._additionalTransformNode;\r\n }\r\n\r\n public set additionalTransformNode(value: TransformNode | undefined) {\r\n this._additionalTransformNode = value;\r\n }\r\n\r\n protected _updateGizmoRotationToMatchAttachedMesh = true;\r\n protected _updateGizmoPositionToMatchAttachedMesh = true;\r\n protected _anchorPoint = GizmoAnchorPoint.Origin;\r\n protected _updateScale = true;\r\n protected _coordinatesMode = GizmoCoordinatesMode.Local;\r\n\r\n /**\r\n * If set the gizmo's rotation will be updated to match the attached mesh each frame (Default: true)\r\n * NOTE: This is only possible for meshes with uniform scaling, as otherwise it's not possible to decompose the rotation\r\n */\r\n public set updateGizmoRotationToMatchAttachedMesh(value: boolean) {\r\n this._updateGizmoRotationToMatchAttachedMesh = value;\r\n }\r\n public get updateGizmoRotationToMatchAttachedMesh() {\r\n return this._updateGizmoRotationToMatchAttachedMesh;\r\n }\r\n /**\r\n * If set the gizmo's position will be updated to match the attached mesh each frame (Default: true)\r\n */\r\n public set updateGizmoPositionToMatchAttachedMesh(value: boolean) {\r\n this._updateGizmoPositionToMatchAttachedMesh = value;\r\n }\r\n public get updateGizmoPositionToMatchAttachedMesh() {\r\n return this._updateGizmoPositionToMatchAttachedMesh;\r\n }\r\n\r\n /**\r\n * Defines where the gizmo will be positioned if `updateGizmoPositionToMatchAttachedMesh` is enabled.\r\n * (Default: GizmoAnchorPoint.Origin)\r\n */\r\n public set anchorPoint(value: GizmoAnchorPoint) {\r\n this._anchorPoint = value;\r\n }\r\n public get anchorPoint() {\r\n return this._anchorPoint;\r\n }\r\n\r\n /**\r\n * Set the coordinate system to use. By default it's local.\r\n * But it's possible for a user to tweak so its local for translation and world for rotation.\r\n * In that case, setting the coordinate system will change `updateGizmoRotationToMatchAttachedMesh` and `updateGizmoPositionToMatchAttachedMesh`\r\n */\r\n public set coordinatesMode(coordinatesMode: GizmoCoordinatesMode) {\r\n this._coordinatesMode = coordinatesMode;\r\n const local = coordinatesMode == GizmoCoordinatesMode.Local;\r\n this.updateGizmoRotationToMatchAttachedMesh = local;\r\n this.updateGizmoPositionToMatchAttachedMesh = true;\r\n }\r\n\r\n public get coordinatesMode() {\r\n return this._coordinatesMode;\r\n }\r\n\r\n /**\r\n * When set, the gizmo will always appear the same size no matter where the camera is (default: true)\r\n */\r\n\r\n public set updateScale(value: boolean) {\r\n this._updateScale = value;\r\n }\r\n public get updateScale() {\r\n return this._updateScale;\r\n }\r\n protected _interactionsEnabled = true;\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n protected _attachedNodeChanged(value: Nullable<Node>) {}\r\n\r\n protected _beforeRenderObserver: Nullable<Observer<Scene>>;\r\n private _rightHandtoLeftHandMatrix = Matrix.RotationY(Math.PI);\r\n\r\n /**\r\n * Creates a gizmo\r\n * @param gizmoLayer The utility layer the gizmo will be added to\r\n */\r\n constructor(\r\n /** [Object] The utility layer the gizmo will be added to */\r\n public gizmoLayer: UtilityLayerRenderer = UtilityLayerRenderer.DefaultUtilityLayer\r\n ) {\r\n this._rootMesh = new Mesh(\"gizmoRootNode\", gizmoLayer.utilityLayerScene);\r\n this._rootMesh.rotationQuaternion = Quaternion.Identity();\r\n\r\n this._beforeRenderObserver = this.gizmoLayer.utilityLayerScene.onBeforeRenderObservable.add(() => {\r\n this._update();\r\n });\r\n }\r\n\r\n /**\r\n * posture that the gizmo will be display\r\n * When set null, default value will be used (Quaternion(0, 0, 0, 1))\r\n */\r\n public get customRotationQuaternion(): Nullable<Quaternion> {\r\n return this._customRotationQuaternion;\r\n }\r\n\r\n public set customRotationQuaternion(customRotationQuaternion: Nullable<Quaternion>) {\r\n this._customRotationQuaternion = customRotationQuaternion;\r\n }\r\n\r\n /**\r\n * Updates the gizmo to match the attached mesh's position/rotation\r\n */\r\n protected _update() {\r\n if (this.attachedNode) {\r\n let effectiveNode = this.attachedNode;\r\n if (this.attachedMesh) {\r\n effectiveNode = this.attachedMesh || this.attachedNode;\r\n }\r\n\r\n // Position\r\n if (this.updateGizmoPositionToMatchAttachedMesh) {\r\n if (this.anchorPoint == GizmoAnchorPoint.Pivot && (<TransformNode>effectiveNode).getAbsolutePivotPoint) {\r\n const position = (<TransformNode>effectiveNode).getAbsolutePivotPoint();\r\n this._rootMesh.position.copyFrom(position);\r\n } else {\r\n const row = effectiveNode.getWorldMatrix().getRow(3);\r\n const position = row ? row.toVector3() : new Vector3(0, 0, 0);\r\n this._rootMesh.position.copyFrom(position);\r\n }\r\n }\r\n\r\n // Rotation\r\n if (this.updateGizmoRotationToMatchAttachedMesh) {\r\n const supportedNode =\r\n (<Mesh>effectiveNode)._isMesh ||\r\n effectiveNode.getClassName() === \"AbstractMesh\" ||\r\n effectiveNode.getClassName() === \"TransformNode\" ||\r\n effectiveNode.getClassName() === \"InstancedMesh\";\r\n const transformNode = supportedNode ? (effectiveNode as TransformNode) : undefined;\r\n effectiveNode.getWorldMatrix().decompose(undefined, this._rootMesh.rotationQuaternion!, undefined, Gizmo.PreserveScaling ? transformNode : undefined);\r\n this._rootMesh.rotationQuaternion!.normalize();\r\n } else {\r\n if (this._customRotationQuaternion) {\r\n this._rootMesh.rotationQuaternion!.copyFrom(this._customRotationQuaternion);\r\n } else {\r\n this._rootMesh.rotationQuaternion!.set(0, 0, 0, 1);\r\n }\r\n }\r\n\r\n // Scale\r\n if (this.updateScale) {\r\n const activeCamera = this.gizmoLayer.utilityLayerScene.activeCamera!;\r\n const cameraPosition = activeCamera.globalPosition;\r\n this._rootMesh.position.subtractToRef(cameraPosition, TmpVectors.Vector3[0]);\r\n let scale = this.scaleRatio;\r\n if (activeCamera.mode == Camera.ORTHOGRAPHIC_CAMERA) {\r\n if (activeCamera.orthoTop && activeCamera.orthoBottom) {\r\n const orthoHeight = activeCamera.orthoTop - activeCamera.orthoBottom;\r\n scale *= orthoHeight;\r\n }\r\n } else {\r\n const camForward = activeCamera.getScene().useRightHandedSystem ? Vector3.RightHandedForwardReadOnly : Vector3.LeftHandedForwardReadOnly;\r\n const direction = activeCamera.getDirection(camForward);\r\n scale *= Vector3.Dot(TmpVectors.Vector3[0], direction);\r\n }\r\n this._rootMesh.scaling.setAll(scale);\r\n\r\n // Account for handedness, similar to Matrix.decompose\r\n if (effectiveNode._getWorldMatrixDeterminant() < 0 && !Gizmo.PreserveScaling) {\r\n this._rootMesh.scaling.y *= -1;\r\n }\r\n } else {\r\n this._rootMesh.scaling.setAll(this.scaleRatio);\r\n }\r\n }\r\n\r\n if (this.additionalTransformNode) {\r\n this._rootMesh.computeWorldMatrix(true);\r\n this._rootMesh.getWorldMatrix().multiplyToRef(this.additionalTransformNode.getWorldMatrix(), TmpVectors.Matrix[0]);\r\n TmpVectors.Matrix[0].decompose(this._rootMesh.scaling, this._rootMesh.rotationQuaternion!, this._rootMesh.position);\r\n }\r\n }\r\n\r\n /**\r\n * if transform has a pivot and is not using PostMultiplyPivotMatrix, then the worldMatrix contains the pivot matrix (it's not cancelled at the end)\r\n * so, when extracting the world matrix component, the translation (and other components) is containing the pivot translation.\r\n * And the pivot is applied each frame. Removing it anyway here makes it applied only in computeWorldMatrix.\r\n * @param transform local transform that needs to be transform by the pivot inverse matrix\r\n * @param localMatrix local matrix that needs to be transform by the pivot inverse matrix\r\n * @param result resulting matrix transformed by pivot inverse if the transform node is using pivot without using post Multiply Pivot Matrix\r\n */\r\n protected _handlePivotMatrixInverse(transform: TransformNode, localMatrix: Matrix, result: Matrix): void {\r\n if (transform.isUsingPivotMatrix() && !transform.isUsingPostMultiplyPivotMatrix()) {\r\n transform.getPivotMatrix().invertToRef(TmpVectors.Matrix[5]);\r\n TmpVectors.Matrix[5].multiplyToRef(localMatrix, result);\r\n return;\r\n }\r\n result.copyFrom(localMatrix);\r\n }\r\n /**\r\n * computes the rotation/scaling/position of the transform once the Node world matrix has changed.\r\n */\r\n protected _matrixChanged() {\r\n if (!this._attachedNode) {\r\n return;\r\n }\r\n\r\n if ((<Camera>this._attachedNode)._isCamera) {\r\n const camera = this._attachedNode as Camera;\r\n let worldMatrix;\r\n let worldMatrixUC;\r\n if (camera.parent) {\r\n const parentInv = TmpVectors.Matrix[1];\r\n camera.parent._worldMatrix.invertToRef(parentInv);\r\n this._attachedNode._worldMatrix.multiplyToRef(parentInv, TmpVectors.Matrix[0]);\r\n worldMatrix = TmpVectors.Matrix[0];\r\n } else {\r\n worldMatrix = this._attachedNode._worldMatrix;\r\n }\r\n\r\n if (camera.getScene().useRightHandedSystem) {\r\n // avoid desync with RH matrix computation. Otherwise, rotation of PI around Y axis happens each frame resulting in axis flipped because worldMatrix is computed as inverse of viewMatrix.\r\n this._rightHandtoLeftHandMatrix.multiplyToRef(worldMatrix, TmpVectors.Matrix[1]);\r\n worldMatrixUC = TmpVectors.Matrix[1];\r\n } else {\r\n worldMatrixUC = worldMatrix;\r\n }\r\n\r\n worldMatrixUC.decompose(TmpVectors.Vector3[1], TmpVectors.Quaternion[0], TmpVectors.Vector3[0]);\r\n\r\n const inheritsTargetCamera =\r\n this._attachedNode.getClassName() === \"FreeCamera\" ||\r\n this._attachedNode.getClassName() === \"FlyCamera\" ||\r\n this._attachedNode.getClassName() === \"ArcFollowCamera\" ||\r\n this._attachedNode.getClassName() === \"TargetCamera\" ||\r\n this._attachedNode.getClassName() === \"TouchCamera\" ||\r\n this._attachedNode.getClassName() === \"UniversalCamera\";\r\n\r\n if (inheritsTargetCamera) {\r\n const targetCamera = this._attachedNode as TargetCamera;\r\n targetCamera.rotation = TmpVectors.Quaternion[0].toEulerAngles();\r\n\r\n if (targetCamera.rotationQuaternion) {\r\n targetCamera.rotationQuaternion.copyFrom(TmpVectors.Quaternion[0]);\r\n targetCamera.rotationQuaternion.normalize();\r\n }\r\n }\r\n\r\n camera.position.copyFrom(TmpVectors.Vector3[0]);\r\n } else if (\r\n (<Mesh>this._attachedNode)._isMesh ||\r\n this._attachedNode.getClassName() === \"AbstractMesh\" ||\r\n this._attachedNode.getClassName() === \"TransformNode\" ||\r\n this._attachedNode.getClassName() === \"InstancedMesh\"\r\n ) {\r\n const transform = this._attachedNode as TransformNode;\r\n if (transform.parent) {\r\n const parentInv = TmpVectors.Matrix[0];\r\n const localMat = TmpVectors.Matrix[1];\r\n transform.parent.getWorldMatrix().invertToRef(parentInv);\r\n this._attachedNode.getWorldMatrix().multiplyToRef(parentInv, localMat);\r\n const matrixToDecompose = TmpVectors.Matrix[4];\r\n this._handlePivotMatrixInverse(transform, localMat, matrixToDecompose);\r\n matrixToDecompose.decompose(\r\n TmpVectors.Vector3[0],\r\n TmpVectors.Quaternion[0],\r\n transform.position,\r\n Gizmo.PreserveScaling ? transform : undefined,\r\n Gizmo.UseAbsoluteScaling\r\n );\r\n TmpVectors.Quaternion[0].normalize();\r\n if (transform.isUsingPivotMatrix()) {\r\n // Calculate the local matrix without the translation.\r\n // Copied from TranslateNode.computeWorldMatrix\r\n const r = TmpVectors.Quaternion[1];\r\n Quaternion.RotationYawPitchRollToRef(transform.rotation.y, transform.rotation.x, transform.rotation.z, r);\r\n\r\n const scaleMatrix = TmpVectors.Matrix[2];\r\n Matrix.ScalingToRef(transform.scaling.x, transform.scaling.y, transform.scaling.z, scaleMatrix);\r\n\r\n const rotationMatrix = TmpVectors.Matrix[2];\r\n r.toRotationMatrix(rotationMatrix);\r\n\r\n const pivotMatrix = transform.getPivotMatrix();\r\n const invPivotMatrix = TmpVectors.Matrix[3];\r\n pivotMatrix.invertToRef(invPivotMatrix);\r\n\r\n pivotMatrix.multiplyToRef(scaleMatrix, TmpVectors.Matrix[4]);\r\n TmpVectors.Matrix[4].multiplyToRef(rotationMatrix, TmpVectors.Matrix[5]);\r\n TmpVectors.Matrix[5].multiplyToRef(invPivotMatrix, TmpVectors.Matrix[6]);\r\n\r\n TmpVectors.Matrix[6].getTranslationToRef(TmpVectors.Vector3[1]);\r\n\r\n transform.position.subtractInPlace(TmpVectors.Vector3[1]);\r\n }\r\n } else {\r\n const matrixToDecompose = TmpVectors.Matrix[4];\r\n this._handlePivotMatrixInverse(transform, this._attachedNode._worldMatrix, matrixToDecompose);\r\n matrixToDecompose.decompose(\r\n TmpVectors.Vector3[0],\r\n TmpVectors.Quaternion[0],\r\n transform.position,\r\n Gizmo.PreserveScaling ? transform : undefined,\r\n Gizmo.UseAbsoluteScaling\r\n );\r\n }\r\n TmpVectors.Vector3[0].scaleInPlace(1.0 / transform.scalingDeterminant);\r\n transform.scaling.copyFrom(TmpVectors.Vector3[0]);\r\n if (!transform.billboardMode) {\r\n if (transform.rotationQuaternion) {\r\n transform.rotationQuaternion.copyFrom(TmpVectors.Quaternion[0]);\r\n transform.rotationQuaternion.normalize();\r\n } else {\r\n transform.rotation = TmpVectors.Quaternion[0].toEulerAngles();\r\n }\r\n }\r\n } else if (this._attachedNode.getClassName() === \"Bone\") {\r\n const bone = this._attachedNode as Bone;\r\n const parent = bone.getParent();\r\n\r\n if (parent) {\r\n const invParent = TmpVectors.Matrix[0];\r\n const boneLocalMatrix = TmpVectors.Matrix[1];\r\n parent.getFinalMatrix().invertToRef(invParent);\r\n bone.getFinalMatrix().multiplyToRef(invParent, boneLocalMatrix);\r\n const lmat = bone.getLocalMatrix();\r\n lmat.copyFrom(boneLocalMatrix);\r\n } else {\r\n const lmat = bone.getLocalMatrix();\r\n lmat.copyFrom(bone.getFinalMatrix());\r\n }\r\n bone.markAsDirty();\r\n } else {\r\n const light = this._attachedNode as ShadowLight;\r\n if (light.getTypeID) {\r\n const type = light.getTypeID();\r\n if (type === Light.LIGHTTYPEID_DIRECTIONALLIGHT || type === Light.LIGHTTYPEID_SPOTLIGHT || type === Light.LIGHTTYPEID_POINTLIGHT) {\r\n const parent = light.parent;\r\n\r\n if (parent) {\r\n const invParent = TmpVectors.Matrix[0];\r\n const nodeLocalMatrix = TmpVectors.Matrix[1];\r\n parent.getWorldMatrix().invertToRef(invParent);\r\n light.getWorldMatrix().multiplyToRef(invParent, nodeLocalMatrix);\r\n nodeLocalMatrix.decompose(undefined, TmpVectors.Quaternion[0], TmpVectors.Vector3[0]);\r\n } else {\r\n this._attachedNode._worldMatrix.decompose(undefined, TmpVectors.Quaternion[0], TmpVectors.Vector3[0]);\r\n }\r\n // setter doesn't copy values. Need a new Vector3\r\n light.position = new Vector3(TmpVectors.Vector3[0].x, TmpVectors.Vector3[0].y, TmpVectors.Vector3[0].z);\r\n if (light.direction) {\r\n light.direction = new Vector3(light.direction.x, light.direction.y, light.direction.z);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * refresh gizmo mesh material\r\n * @param gizmoMeshes\r\n * @param material material to apply\r\n */\r\n protected _setGizmoMeshMaterial(gizmoMeshes: Mesh[], material: StandardMaterial) {\r\n if (gizmoMeshes) {\r\n gizmoMeshes.forEach((m: Mesh) => {\r\n m.material = material;\r\n if ((<LinesMesh>m).color) {\r\n (<LinesMesh>m).color = material.diffuseColor;\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Subscribes to pointer up, down, and hover events. Used for responsive gizmos.\r\n * @param gizmoLayer The utility layer the gizmo will be added to\r\n * @param gizmoAxisCache Gizmo axis definition used for reactive gizmo UI\r\n * @returns {Observer<PointerInfo>} pointerObserver\r\n */\r\n public static GizmoAxisPointerObserver(gizmoLayer: UtilityLayerRenderer, gizmoAxisCache: Map<Mesh, GizmoAxisCache>): Observer<PointerInfo> {\r\n let dragging = false;\r\n let activeDragButton = -1;\r\n let forcePointerUp = false;\r\n\r\n const pointerObserver = gizmoLayer.utilityLayerScene.onPointerObservable.add((pointerInfo) => {\r\n if (pointerInfo.pickInfo) {\r\n // If we are dragging and the user presses another button, end the drag.\r\n // Otherwise, tracking when the drag should end becomes very complex.\r\n // pointerDragBehavior.ts has similar logic.\r\n forcePointerUp = dragging && pointerInfo.event.button !== -1 && pointerInfo.event.button !== activeDragButton;\r\n\r\n if (forcePointerUp || pointerInfo.type === PointerEventTypes.POINTERUP) {\r\n // On Mouse Up\r\n\r\n gizmoAxisCache.forEach((cache) => {\r\n cache.active = false;\r\n dragging = false;\r\n activeDragButton = -1;\r\n cache.gizmoMeshes.forEach((m: Mesh) => {\r\n m.material = cache.dragBehavior.enabled ? cache.material : cache.disableMaterial;\r\n if ((m as LinesMesh).color) {\r\n (m as LinesMesh).color = cache.material.diffuseColor;\r\n }\r\n });\r\n });\r\n } else if (pointerInfo.type === PointerEventTypes.POINTERMOVE) {\r\n // On Hover Logic\r\n if (dragging) {\r\n return;\r\n }\r\n gizmoAxisCache.forEach((cache) => {\r\n if (cache.colliderMeshes && cache.gizmoMeshes) {\r\n const isHovered = cache.colliderMeshes?.indexOf(pointerInfo?.pickInfo?.pickedMesh as Mesh) != -1;\r\n const material = cache.dragBehavior.enabled ? (isHovered || cache.active ? cache.hoverMaterial : cache.material) : cache.disableMaterial;\r\n cache.gizmoMeshes.forEach((m: Mesh) => {\r\n m.material = material;\r\n if ((m as LinesMesh).color) {\r\n (m as LinesMesh).color = material.diffuseColor;\r\n }\r\n });\r\n }\r\n });\r\n } else if (pointerInfo.type === PointerEventTypes.POINTERDOWN) {\r\n // On Mouse Down\r\n // If user Clicked Gizmo\r\n if (gizmoAxisCache.has(pointerInfo.pickInfo.pickedMesh?.parent as Mesh)) {\r\n dragging = true;\r\n activeDragButton = pointerInfo.event.button;\r\n const statusMap = gizmoAxisCache.get(pointerInfo.pickInfo.pickedMesh?.parent as Mesh);\r\n statusMap!.active = true;\r\n gizmoAxisCache.forEach((cache) => {\r\n const isHovered = cache.colliderMeshes?.indexOf(pointerInfo?.pickInfo?.pickedMesh as Mesh) != -1;\r\n const material = (isHovered || cache.active) && cache.dragBehavior.enabled ? cache.hoverMaterial : cache.disableMaterial;\r\n cache.gizmoMeshes.forEach((m: Mesh) => {\r\n m.material = material;\r\n if ((m as LinesMesh).color) {\r\n (m as LinesMesh).color = material.diffuseColor;\r\n }\r\n });\r\n });\r\n }\r\n }\r\n }\r\n });\r\n\r\n return pointerObserver!;\r\n }\r\n\r\n /**\r\n * Disposes of the gizmo\r\n */\r\n public dispose() {\r\n this._rootMesh.dispose();\r\n if (this._beforeRenderObserver) {\r\n this.gizmoLayer.utilityLayerScene.onBeforeRenderObservable.remove(this._beforeRenderObserver);\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"gizmo.js","sourceRoot":"","sources":["../../../../dev/core/src/Gizmos/gizmo.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Observer } from \"../Misc/observable\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { Scene, IDisposable } from \"../scene\";\r\nimport { Quaternion, Vector3, Matrix, TmpVectors } from \"../Maths/math.vector\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\nimport { Camera } from \"../Cameras/camera\";\r\nimport type { TargetCamera } from \"../Cameras/targetCamera\";\r\nimport type { Node } from \"../node\";\r\nimport type { Bone } from \"../Bones/bone\";\r\nimport { UtilityLayerRenderer } from \"../Rendering/utilityLayerRenderer\";\r\nimport type { TransformNode } from \"../Meshes/transformNode\";\r\nimport type { StandardMaterial } from \"../Materials/standardMaterial\";\r\nimport type { PointerInfo } from \"../Events/pointerEvents\";\r\nimport { PointerEventTypes } from \"../Events/pointerEvents\";\r\nimport type { LinesMesh } from \"../Meshes/linesMesh\";\r\nimport type { PointerDragBehavior } from \"../Behaviors/Meshes/pointerDragBehavior\";\r\nimport type { ShadowLight } from \"../Lights/shadowLight\";\r\nimport { Light } from \"../Lights/light\";\r\n\r\n/**\r\n * Cache built by each axis. Used for managing state between all elements of gizmo for enhanced UI\r\n */\r\nexport interface GizmoAxisCache {\r\n /** Mesh used to render the Gizmo */\r\n gizmoMeshes: Mesh[];\r\n /** Mesh used to detect user interaction with Gizmo */\r\n colliderMeshes: Mesh[];\r\n /** Material used to indicate color of gizmo mesh */\r\n material: StandardMaterial;\r\n /** Material used to indicate hover state of the Gizmo */\r\n hoverMaterial: StandardMaterial;\r\n /** Material used to indicate disabled state of the Gizmo */\r\n disableMaterial: StandardMaterial;\r\n /** Used to indicate Active state of the Gizmo */\r\n active: boolean;\r\n /** DragBehavior */\r\n dragBehavior: PointerDragBehavior;\r\n}\r\n\r\n/**\r\n * Anchor options where the Gizmo can be positioned in relation to its anchored node\r\n */\r\nexport const enum GizmoAnchorPoint {\r\n /** The origin of the attached node */\r\n Origin,\r\n /** The pivot point of the attached node*/\r\n Pivot,\r\n}\r\n\r\n/**\r\n * Coordinates mode: Local or World. Defines how axis is aligned: either on world axis or transform local axis\r\n */\r\nexport const enum GizmoCoordinatesMode {\r\n World,\r\n Local,\r\n}\r\n\r\n/**\r\n * Interface for basic gizmo\r\n */\r\nexport interface IGizmo extends IDisposable {\r\n /** True when the mouse pointer is hovered a gizmo mesh */\r\n readonly isHovered: boolean;\r\n /** The root mesh of the gizmo */\r\n _rootMesh: Mesh;\r\n /** Ratio for the scale of the gizmo */\r\n scaleRatio: number;\r\n /**\r\n * Mesh that the gizmo will be attached to. (eg. on a drag gizmo the mesh that will be dragged)\r\n * * When set, interactions will be enabled\r\n */\r\n attachedMesh: Nullable<AbstractMesh>;\r\n /**\r\n * Node that the gizmo will be attached to. (eg. on a drag gizmo the mesh, bone or NodeTransform that will be dragged)\r\n * * When set, interactions will be enabled\r\n */\r\n attachedNode: Nullable<Node>;\r\n /**\r\n * If set the gizmo's rotation will be updated to match the attached mesh each frame (Default: true)\r\n */\r\n updateGizmoRotationToMatchAttachedMesh: boolean;\r\n /** The utility layer the gizmo will be added to */\r\n gizmoLayer: UtilityLayerRenderer;\r\n /**\r\n * If set the gizmo's position will be updated to match the attached mesh each frame (Default: true)\r\n */\r\n updateGizmoPositionToMatchAttachedMesh: boolean;\r\n /**\r\n * Defines where the gizmo will be positioned if `updateGizmoPositionToMatchAttachedMesh` is enabled.\r\n * (Default: GizmoAnchorPoint.Origin)\r\n */\r\n anchorPoint: GizmoAnchorPoint;\r\n\r\n /**\r\n * Set the coordinate mode to use. By default it's local.\r\n */\r\n coordinatesMode: GizmoCoordinatesMode;\r\n\r\n /**\r\n * When set, the gizmo will always appear the same size no matter where the camera is (default: true)\r\n */\r\n updateScale: boolean;\r\n /**\r\n * posture that the gizmo will be display\r\n * When set null, default value will be used (Quaternion(0, 0, 0, 1))\r\n */\r\n customRotationQuaternion: Nullable<Quaternion>;\r\n /**\r\n * Disposes and replaces the current meshes in the gizmo with the specified mesh\r\n * @param mesh The mesh to replace the default mesh of the gizmo\r\n */\r\n setCustomMesh(mesh: Mesh): void;\r\n\r\n /**\r\n * Additional transform applied to the gizmo.\r\n * It's useful when the gizmo is attached to a bone: if the bone is part of a skeleton attached to a mesh, you should define the mesh as additionalTransformNode if you want the gizmo to be displayed at the bone's correct location.\r\n * Otherwise, as the gizmo is relative to the skeleton root, the mesh transformation will not be taken into account.\r\n */\r\n additionalTransformNode?: TransformNode | undefined;\r\n}\r\n/**\r\n * Renders gizmos on top of an existing scene which provide controls for position, rotation, etc.\r\n */\r\nexport class Gizmo implements IGizmo {\r\n /**\r\n * The root mesh of the gizmo\r\n */\r\n public _rootMesh: Mesh;\r\n protected _attachedMesh: Nullable<AbstractMesh> = null;\r\n protected _attachedNode: Nullable<Node> = null;\r\n protected _customRotationQuaternion: Nullable<Quaternion> = null;\r\n protected _additionalTransformNode?: TransformNode;\r\n /**\r\n * Ratio for the scale of the gizmo (Default: 1)\r\n */\r\n protected _scaleRatio = 1;\r\n\r\n /**\r\n * boolean updated by pointermove when a gizmo mesh is hovered\r\n */\r\n protected _isHovered = false;\r\n\r\n /**\r\n * When enabled, any gizmo operation will perserve scaling sign. Default is off.\r\n * Only valid for TransformNode derived classes (Mesh, AbstractMesh, ...)\r\n */\r\n public static PreserveScaling = false;\r\n\r\n /**\r\n * There are 2 ways to preserve scaling: using mesh scaling or absolute scaling. Depending of hierarchy, non uniform scaling and LH or RH coordinates. One is preferable than the other.\r\n * If the scaling to be preserved is the local scaling, then set this value to false.\r\n * Default is true which means scaling to be preserved is absolute one (with hierarchy applied)\r\n */\r\n public static UseAbsoluteScaling = true;\r\n\r\n /**\r\n * Ratio for the scale of the gizmo (Default: 1)\r\n */\r\n public set scaleRatio(value: number) {\r\n this._scaleRatio = value;\r\n }\r\n\r\n public get scaleRatio() {\r\n return this._scaleRatio;\r\n }\r\n\r\n /**\r\n * True when the mouse pointer is hovered a gizmo mesh\r\n */\r\n public get isHovered() {\r\n return this._isHovered;\r\n }\r\n\r\n /**\r\n * If a custom mesh has been set (Default: false)\r\n */\r\n protected _customMeshSet = false;\r\n /**\r\n * Mesh that the gizmo will be attached to. (eg. on a drag gizmo the mesh that will be dragged)\r\n * * When set, interactions will be enabled\r\n */\r\n public get attachedMesh() {\r\n return this._attachedMesh;\r\n }\r\n public set attachedMesh(value) {\r\n this._attachedMesh = value;\r\n if (value) {\r\n this._attachedNode = value;\r\n }\r\n this._rootMesh.setEnabled(value ? true : false);\r\n this._attachedNodeChanged(value);\r\n }\r\n /**\r\n * Node that the gizmo will be attached to. (eg. on a drag gizmo the mesh, bone or NodeTransform that will be dragged)\r\n * * When set, interactions will be enabled\r\n */\r\n public get attachedNode() {\r\n return this._attachedNode;\r\n }\r\n public set attachedNode(value) {\r\n this._attachedNode = value;\r\n this._attachedMesh = null;\r\n this._rootMesh.setEnabled(value ? true : false);\r\n this._attachedNodeChanged(value);\r\n }\r\n\r\n /**\r\n * Disposes and replaces the current meshes in the gizmo with the specified mesh\r\n * @param mesh The mesh to replace the default mesh of the gizmo\r\n */\r\n public setCustomMesh(mesh: Mesh) {\r\n if (mesh.getScene() != this.gizmoLayer.utilityLayerScene) {\r\n // eslint-disable-next-line no-throw-literal\r\n throw \"When setting a custom mesh on a gizmo, the custom meshes scene must be the same as the gizmos (eg. gizmo.gizmoLayer.utilityLayerScene)\";\r\n }\r\n const children = this._rootMesh.getChildMeshes();\r\n for (const c of children) {\r\n c.dispose();\r\n }\r\n mesh.parent = this._rootMesh;\r\n this._customMeshSet = true;\r\n }\r\n\r\n /**\r\n * Additional transform applied to the gizmo.\r\n * It's useful when the gizmo is attached to a bone: if the bone is part of a skeleton attached to a mesh, you should define the mesh as additionalTransformNode if you want the gizmo to be displayed at the bone's correct location.\r\n * Otherwise, as the gizmo is relative to the skeleton root, the mesh transformation will not be taken into account.\r\n */\r\n public get additionalTransformNode() {\r\n return this._additionalTransformNode;\r\n }\r\n\r\n public set additionalTransformNode(value: TransformNode | undefined) {\r\n this._additionalTransformNode = value;\r\n }\r\n\r\n protected _updateGizmoRotationToMatchAttachedMesh = true;\r\n protected _updateGizmoPositionToMatchAttachedMesh = true;\r\n protected _anchorPoint = GizmoAnchorPoint.Origin;\r\n protected _updateScale = true;\r\n protected _coordinatesMode = GizmoCoordinatesMode.Local;\r\n\r\n /**\r\n * If set the gizmo's rotation will be updated to match the attached mesh each frame (Default: true)\r\n * NOTE: This is only possible for meshes with uniform scaling, as otherwise it's not possible to decompose the rotation\r\n */\r\n public set updateGizmoRotationToMatchAttachedMesh(value: boolean) {\r\n this._updateGizmoRotationToMatchAttachedMesh = value;\r\n }\r\n public get updateGizmoRotationToMatchAttachedMesh() {\r\n return this._updateGizmoRotationToMatchAttachedMesh;\r\n }\r\n /**\r\n * If set the gizmo's position will be updated to match the attached mesh each frame (Default: true)\r\n */\r\n public set updateGizmoPositionToMatchAttachedMesh(value: boolean) {\r\n this._updateGizmoPositionToMatchAttachedMesh = value;\r\n }\r\n public get updateGizmoPositionToMatchAttachedMesh() {\r\n return this._updateGizmoPositionToMatchAttachedMesh;\r\n }\r\n\r\n /**\r\n * Defines where the gizmo will be positioned if `updateGizmoPositionToMatchAttachedMesh` is enabled.\r\n * (Default: GizmoAnchorPoint.Origin)\r\n */\r\n public set anchorPoint(value: GizmoAnchorPoint) {\r\n this._anchorPoint = value;\r\n }\r\n public get anchorPoint() {\r\n return this._anchorPoint;\r\n }\r\n\r\n /**\r\n * Set the coordinate system to use. By default it's local.\r\n * But it's possible for a user to tweak so its local for translation and world for rotation.\r\n * In that case, setting the coordinate system will change `updateGizmoRotationToMatchAttachedMesh` and `updateGizmoPositionToMatchAttachedMesh`\r\n */\r\n public set coordinatesMode(coordinatesMode: GizmoCoordinatesMode) {\r\n this._coordinatesMode = coordinatesMode;\r\n const local = coordinatesMode == GizmoCoordinatesMode.Local;\r\n this.updateGizmoRotationToMatchAttachedMesh = local;\r\n this.updateGizmoPositionToMatchAttachedMesh = true;\r\n }\r\n\r\n public get coordinatesMode() {\r\n return this._coordinatesMode;\r\n }\r\n\r\n /**\r\n * When set, the gizmo will always appear the same size no matter where the camera is (default: true)\r\n */\r\n\r\n public set updateScale(value: boolean) {\r\n this._updateScale = value;\r\n }\r\n public get updateScale() {\r\n return this._updateScale;\r\n }\r\n protected _interactionsEnabled = true;\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n protected _attachedNodeChanged(value: Nullable<Node>) {}\r\n\r\n protected _beforeRenderObserver: Nullable<Observer<Scene>>;\r\n private _rightHandtoLeftHandMatrix = Matrix.RotationY(Math.PI);\r\n\r\n /**\r\n * Creates a gizmo\r\n * @param gizmoLayer The utility layer the gizmo will be added to\r\n */\r\n constructor(\r\n /** [Object] The utility layer the gizmo will be added to */\r\n public gizmoLayer: UtilityLayerRenderer = UtilityLayerRenderer.DefaultUtilityLayer\r\n ) {\r\n this._rootMesh = new Mesh(\"gizmoRootNode\", gizmoLayer.utilityLayerScene);\r\n this._rootMesh.rotationQuaternion = Quaternion.Identity();\r\n\r\n this._beforeRenderObserver = this.gizmoLayer.utilityLayerScene.onBeforeRenderObservable.add(() => {\r\n this._update();\r\n });\r\n }\r\n\r\n /**\r\n * posture that the gizmo will be display\r\n * When set null, default value will be used (Quaternion(0, 0, 0, 1))\r\n */\r\n public get customRotationQuaternion(): Nullable<Quaternion> {\r\n return this._customRotationQuaternion;\r\n }\r\n\r\n public set customRotationQuaternion(customRotationQuaternion: Nullable<Quaternion>) {\r\n this._customRotationQuaternion = customRotationQuaternion;\r\n }\r\n\r\n /**\r\n * Updates the gizmo to match the attached mesh's position/rotation\r\n */\r\n protected _update() {\r\n if (this.attachedNode) {\r\n let effectiveNode = this.attachedNode;\r\n if (this.attachedMesh) {\r\n effectiveNode = this.attachedMesh || this.attachedNode;\r\n }\r\n\r\n // Position\r\n if (this.updateGizmoPositionToMatchAttachedMesh) {\r\n if (this.anchorPoint == GizmoAnchorPoint.Pivot && (<TransformNode>effectiveNode).getAbsolutePivotPoint) {\r\n const position = (<TransformNode>effectiveNode).getAbsolutePivotPoint();\r\n this._rootMesh.position.copyFrom(position);\r\n } else {\r\n const row = effectiveNode.getWorldMatrix().getRow(3);\r\n const position = row ? row.toVector3() : new Vector3(0, 0, 0);\r\n this._rootMesh.position.copyFrom(position);\r\n }\r\n }\r\n\r\n // Rotation\r\n if (this.updateGizmoRotationToMatchAttachedMesh) {\r\n const supportedNode =\r\n (<Mesh>effectiveNode)._isMesh ||\r\n effectiveNode.getClassName() === \"AbstractMesh\" ||\r\n effectiveNode.getClassName() === \"TransformNode\" ||\r\n effectiveNode.getClassName() === \"InstancedMesh\";\r\n const transformNode = supportedNode ? (effectiveNode as TransformNode) : undefined;\r\n effectiveNode.getWorldMatrix().decompose(undefined, this._rootMesh.rotationQuaternion!, undefined, Gizmo.PreserveScaling ? transformNode : undefined);\r\n this._rootMesh.rotationQuaternion!.normalize();\r\n } else {\r\n if (this._customRotationQuaternion) {\r\n this._rootMesh.rotationQuaternion!.copyFrom(this._customRotationQuaternion);\r\n } else {\r\n this._rootMesh.rotationQuaternion!.set(0, 0, 0, 1);\r\n }\r\n }\r\n\r\n // Scale\r\n if (this.updateScale) {\r\n const activeCamera = this.gizmoLayer.utilityLayerScene.activeCamera!;\r\n const cameraPosition = activeCamera.globalPosition;\r\n this._rootMesh.position.subtractToRef(cameraPosition, TmpVectors.Vector3[0]);\r\n let scale = this.scaleRatio;\r\n if (activeCamera.mode == Camera.ORTHOGRAPHIC_CAMERA) {\r\n if (activeCamera.orthoTop && activeCamera.orthoBottom) {\r\n const orthoHeight = activeCamera.orthoTop - activeCamera.orthoBottom;\r\n scale *= orthoHeight;\r\n }\r\n } else {\r\n const camForward = activeCamera.getScene().useRightHandedSystem ? Vector3.RightHandedForwardReadOnly : Vector3.LeftHandedForwardReadOnly;\r\n const direction = activeCamera.getDirection(camForward);\r\n scale *= Vector3.Dot(TmpVectors.Vector3[0], direction);\r\n }\r\n this._rootMesh.scaling.setAll(scale);\r\n\r\n // Account for handedness, similar to Matrix.decompose\r\n if (effectiveNode._getWorldMatrixDeterminant() < 0 && !Gizmo.PreserveScaling) {\r\n this._rootMesh.scaling.y *= -1;\r\n }\r\n } else {\r\n this._rootMesh.scaling.setAll(this.scaleRatio);\r\n }\r\n }\r\n\r\n if (this.additionalTransformNode) {\r\n this._rootMesh.computeWorldMatrix(true);\r\n this._rootMesh.getWorldMatrix().multiplyToRef(this.additionalTransformNode.getWorldMatrix(), TmpVectors.Matrix[0]);\r\n TmpVectors.Matrix[0].decompose(this._rootMesh.scaling, this._rootMesh.rotationQuaternion!, this._rootMesh.position);\r\n }\r\n }\r\n\r\n /**\r\n * if transform has a pivot and is not using PostMultiplyPivotMatrix, then the worldMatrix contains the pivot matrix (it's not cancelled at the end)\r\n * so, when extracting the world matrix component, the translation (and other components) is containing the pivot translation.\r\n * And the pivot is applied each frame. Removing it anyway here makes it applied only in computeWorldMatrix.\r\n * @param transform local transform that needs to be transform by the pivot inverse matrix\r\n * @param localMatrix local matrix that needs to be transform by the pivot inverse matrix\r\n * @param result resulting matrix transformed by pivot inverse if the transform node is using pivot without using post Multiply Pivot Matrix\r\n */\r\n protected _handlePivotMatrixInverse(transform: TransformNode, localMatrix: Matrix, result: Matrix): void {\r\n if (transform.isUsingPivotMatrix() && !transform.isUsingPostMultiplyPivotMatrix()) {\r\n transform.getPivotMatrix().invertToRef(TmpVectors.Matrix[5]);\r\n TmpVectors.Matrix[5].multiplyToRef(localMatrix, result);\r\n return;\r\n }\r\n result.copyFrom(localMatrix);\r\n }\r\n /**\r\n * computes the rotation/scaling/position of the transform once the Node world matrix has changed.\r\n */\r\n protected _matrixChanged() {\r\n if (!this._attachedNode) {\r\n return;\r\n }\r\n\r\n if ((<Camera>this._attachedNode)._isCamera) {\r\n const camera = this._attachedNode as Camera;\r\n let worldMatrix;\r\n let worldMatrixUC;\r\n if (camera.parent) {\r\n const parentInv = TmpVectors.Matrix[1];\r\n camera.parent._worldMatrix.invertToRef(parentInv);\r\n this._attachedNode._worldMatrix.multiplyToRef(parentInv, TmpVectors.Matrix[0]);\r\n worldMatrix = TmpVectors.Matrix[0];\r\n } else {\r\n worldMatrix = this._attachedNode._worldMatrix;\r\n }\r\n\r\n if (camera.getScene().useRightHandedSystem) {\r\n // avoid desync with RH matrix computation. Otherwise, rotation of PI around Y axis happens each frame resulting in axis flipped because worldMatrix is computed as inverse of viewMatrix.\r\n this._rightHandtoLeftHandMatrix.multiplyToRef(worldMatrix, TmpVectors.Matrix[1]);\r\n worldMatrixUC = TmpVectors.Matrix[1];\r\n } else {\r\n worldMatrixUC = worldMatrix;\r\n }\r\n\r\n worldMatrixUC.decompose(TmpVectors.Vector3[1], TmpVectors.Quaternion[0], TmpVectors.Vector3[0]);\r\n\r\n const inheritsTargetCamera =\r\n this._attachedNode.getClassName() === \"FreeCamera\" ||\r\n this._attachedNode.getClassName() === \"FlyCamera\" ||\r\n this._attachedNode.getClassName() === \"ArcFollowCamera\" ||\r\n this._attachedNode.getClassName() === \"TargetCamera\" ||\r\n this._attachedNode.getClassName() === \"TouchCamera\" ||\r\n this._attachedNode.getClassName() === \"UniversalCamera\";\r\n\r\n if (inheritsTargetCamera) {\r\n const targetCamera = this._attachedNode as TargetCamera;\r\n targetCamera.rotation = TmpVectors.Quaternion[0].toEulerAngles();\r\n\r\n if (targetCamera.rotationQuaternion) {\r\n targetCamera.rotationQuaternion.copyFrom(TmpVectors.Quaternion[0]);\r\n targetCamera.rotationQuaternion.normalize();\r\n }\r\n }\r\n\r\n camera.position.copyFrom(TmpVectors.Vector3[0]);\r\n } else if (\r\n (<Mesh>this._attachedNode)._isMesh ||\r\n this._attachedNode.getClassName() === \"AbstractMesh\" ||\r\n this._attachedNode.getClassName() === \"TransformNode\" ||\r\n this._attachedNode.getClassName() === \"InstancedMesh\"\r\n ) {\r\n const transform = this._attachedNode as TransformNode;\r\n if (transform.parent) {\r\n const parentInv = TmpVectors.Matrix[0];\r\n const localMat = TmpVectors.Matrix[1];\r\n transform.parent.getWorldMatrix().invertToRef(parentInv);\r\n this._attachedNode.getWorldMatrix().multiplyToRef(parentInv, localMat);\r\n const matrixToDecompose = TmpVectors.Matrix[4];\r\n this._handlePivotMatrixInverse(transform, localMat, matrixToDecompose);\r\n matrixToDecompose.decompose(\r\n TmpVectors.Vector3[0],\r\n TmpVectors.Quaternion[0],\r\n transform.position,\r\n Gizmo.PreserveScaling ? transform : undefined,\r\n Gizmo.UseAbsoluteScaling\r\n );\r\n TmpVectors.Quaternion[0].normalize();\r\n if (transform.isUsingPivotMatrix()) {\r\n // Calculate the local matrix without the translation.\r\n // Copied from TranslateNode.computeWorldMatrix\r\n const r = TmpVectors.Quaternion[1];\r\n Quaternion.RotationYawPitchRollToRef(transform.rotation.y, transform.rotation.x, transform.rotation.z, r);\r\n\r\n const scaleMatrix = TmpVectors.Matrix[2];\r\n Matrix.ScalingToRef(transform.scaling.x, transform.scaling.y, transform.scaling.z, scaleMatrix);\r\n\r\n const rotationMatrix = TmpVectors.Matrix[2];\r\n r.toRotationMatrix(rotationMatrix);\r\n\r\n const pivotMatrix = transform.getPivotMatrix();\r\n const invPivotMatrix = TmpVectors.Matrix[3];\r\n pivotMatrix.invertToRef(invPivotMatrix);\r\n\r\n pivotMatrix.multiplyToRef(scaleMatrix, TmpVectors.Matrix[4]);\r\n TmpVectors.Matrix[4].multiplyToRef(rotationMatrix, TmpVectors.Matrix[5]);\r\n TmpVectors.Matrix[5].multiplyToRef(invPivotMatrix, TmpVectors.Matrix[6]);\r\n\r\n TmpVectors.Matrix[6].getTranslationToRef(TmpVectors.Vector3[1]);\r\n\r\n transform.position.subtractInPlace(TmpVectors.Vector3[1]);\r\n }\r\n } else {\r\n const matrixToDecompose = TmpVectors.Matrix[4];\r\n this._handlePivotMatrixInverse(transform, this._attachedNode._worldMatrix, matrixToDecompose);\r\n matrixToDecompose.decompose(\r\n TmpVectors.Vector3[0],\r\n TmpVectors.Quaternion[0],\r\n transform.position,\r\n Gizmo.PreserveScaling ? transform : undefined,\r\n Gizmo.UseAbsoluteScaling\r\n );\r\n }\r\n TmpVectors.Vector3[0].scaleInPlace(1.0 / transform.scalingDeterminant);\r\n transform.scaling.copyFrom(TmpVectors.Vector3[0]);\r\n if (!transform.billboardMode) {\r\n if (transform.rotationQuaternion) {\r\n transform.rotationQuaternion.copyFrom(TmpVectors.Quaternion[0]);\r\n transform.rotationQuaternion.normalize();\r\n } else {\r\n transform.rotation = TmpVectors.Quaternion[0].toEulerAngles();\r\n }\r\n }\r\n } else if (this._attachedNode.getClassName() === \"Bone\") {\r\n const bone = this._attachedNode as Bone;\r\n const parent = bone.getParent();\r\n\r\n if (parent) {\r\n const invParent = TmpVectors.Matrix[0];\r\n const boneLocalMatrix = TmpVectors.Matrix[1];\r\n parent.getFinalMatrix().invertToRef(invParent);\r\n bone.getFinalMatrix().multiplyToRef(invParent, boneLocalMatrix);\r\n const lmat = bone.getLocalMatrix();\r\n lmat.copyFrom(boneLocalMatrix);\r\n } else {\r\n const lmat = bone.getLocalMatrix();\r\n lmat.copyFrom(bone.getFinalMatrix());\r\n }\r\n bone.markAsDirty();\r\n } else {\r\n const light = this._attachedNode as ShadowLight;\r\n if (light.getTypeID) {\r\n const type = light.getTypeID();\r\n if (type === Light.LIGHTTYPEID_DIRECTIONALLIGHT || type === Light.LIGHTTYPEID_SPOTLIGHT || type === Light.LIGHTTYPEID_POINTLIGHT) {\r\n const parent = light.parent;\r\n\r\n if (parent) {\r\n const invParent = TmpVectors.Matrix[0];\r\n const nodeLocalMatrix = TmpVectors.Matrix[1];\r\n parent.getWorldMatrix().invertToRef(invParent);\r\n light.getWorldMatrix().multiplyToRef(invParent, nodeLocalMatrix);\r\n nodeLocalMatrix.decompose(undefined, TmpVectors.Quaternion[0], TmpVectors.Vector3[0]);\r\n } else {\r\n this._attachedNode._worldMatrix.decompose(undefined, TmpVectors.Quaternion[0], TmpVectors.Vector3[0]);\r\n }\r\n // setter doesn't copy values. Need a new Vector3\r\n light.position = new Vector3(TmpVectors.Vector3[0].x, TmpVectors.Vector3[0].y, TmpVectors.Vector3[0].z);\r\n if (light.direction) {\r\n light.direction = new Vector3(light.direction.x, light.direction.y, light.direction.z);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * refresh gizmo mesh material\r\n * @param gizmoMeshes\r\n * @param material material to apply\r\n */\r\n protected _setGizmoMeshMaterial(gizmoMeshes: Mesh[], material: StandardMaterial) {\r\n if (gizmoMeshes) {\r\n for (const m of gizmoMeshes) {\r\n m.material = material;\r\n if ((<LinesMesh>m).color) {\r\n (<LinesMesh>m).color = material.diffuseColor;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Subscribes to pointer up, down, and hover events. Used for responsive gizmos.\r\n * @param gizmoLayer The utility layer the gizmo will be added to\r\n * @param gizmoAxisCache Gizmo axis definition used for reactive gizmo UI\r\n * @returns {Observer<PointerInfo>} pointerObserver\r\n */\r\n public static GizmoAxisPointerObserver(gizmoLayer: UtilityLayerRenderer, gizmoAxisCache: Map<Mesh, GizmoAxisCache>): Observer<PointerInfo> {\r\n let dragging = false;\r\n let activeDragButton = -1;\r\n let forcePointerUp = false;\r\n\r\n const pointerObserver = gizmoLayer.utilityLayerScene.onPointerObservable.add((pointerInfo) => {\r\n if (pointerInfo.pickInfo) {\r\n // If we are dragging and the user presses another button, end the drag.\r\n // Otherwise, tracking when the drag should end becomes very complex.\r\n // pointerDragBehavior.ts has similar logic.\r\n forcePointerUp = dragging && pointerInfo.event.button !== -1 && pointerInfo.event.button !== activeDragButton;\r\n\r\n if (forcePointerUp || pointerInfo.type === PointerEventTypes.POINTERUP) {\r\n // On Mouse Up\r\n\r\n gizmoAxisCache.forEach((cache) => {\r\n cache.active = false;\r\n dragging = false;\r\n activeDragButton = -1;\r\n for (const m of cache.gizmoMeshes) {\r\n m.material = cache.dragBehavior.enabled ? cache.material : cache.disableMaterial;\r\n if ((m as LinesMesh).color) {\r\n (m as LinesMesh).color = cache.material.diffuseColor;\r\n }\r\n }\r\n });\r\n } else if (pointerInfo.type === PointerEventTypes.POINTERMOVE) {\r\n // On Hover Logic\r\n if (dragging) {\r\n return;\r\n }\r\n gizmoAxisCache.forEach((cache) => {\r\n if (cache.colliderMeshes && cache.gizmoMeshes) {\r\n const isHovered = cache.colliderMeshes?.indexOf(pointerInfo?.pickInfo?.pickedMesh as Mesh) != -1;\r\n const material = cache.dragBehavior.enabled ? (isHovered || cache.active ? cache.hoverMaterial : cache.material) : cache.disableMaterial;\r\n for (const m of cache.gizmoMeshes) {\r\n m.material = material;\r\n if ((m as LinesMesh).color) {\r\n (m as LinesMesh).color = material.diffuseColor;\r\n }\r\n }\r\n }\r\n });\r\n } else if (pointerInfo.type === PointerEventTypes.POINTERDOWN) {\r\n // On Mouse Down\r\n // If user Clicked Gizmo\r\n if (gizmoAxisCache.has(pointerInfo.pickInfo.pickedMesh?.parent as Mesh)) {\r\n dragging = true;\r\n activeDragButton = pointerInfo.event.button;\r\n const statusMap = gizmoAxisCache.get(pointerInfo.pickInfo.pickedMesh?.parent as Mesh);\r\n statusMap!.active = true;\r\n gizmoAxisCache.forEach((cache) => {\r\n const isHovered = cache.colliderMeshes?.indexOf(pointerInfo?.pickInfo?.pickedMesh as Mesh) != -1;\r\n const material = (isHovered || cache.active) && cache.dragBehavior.enabled ? cache.hoverMaterial : cache.disableMaterial;\r\n for (const m of cache.gizmoMeshes) {\r\n m.material = material;\r\n if ((m as LinesMesh).color) {\r\n (m as LinesMesh).color = material.diffuseColor;\r\n }\r\n }\r\n });\r\n }\r\n }\r\n }\r\n });\r\n\r\n return pointerObserver!;\r\n }\r\n\r\n /**\r\n * Disposes of the gizmo\r\n */\r\n public dispose() {\r\n this._rootMesh.dispose();\r\n if (this._beforeRenderObserver) {\r\n this.gizmoLayer.utilityLayerScene.onBeforeRenderObservable.remove(this._beforeRenderObserver);\r\n }\r\n }\r\n}\r\n"]}
@@ -44,11 +44,12 @@ export class GizmoManager {
44
44
  */
45
45
  get isDragging() {
46
46
  let dragging = false;
47
- [this.gizmos.positionGizmo, this.gizmos.rotationGizmo, this.gizmos.scaleGizmo, this.gizmos.boundingBoxGizmo].forEach((gizmo) => {
47
+ const gizmos = [this.gizmos.positionGizmo, this.gizmos.rotationGizmo, this.gizmos.scaleGizmo, this.gizmos.boundingBoxGizmo];
48
+ for (const gizmo of gizmos) {
48
49
  if (gizmo && gizmo.isDragging) {
49
50
  dragging = true;
50
51
  }
51
- });
52
+ }
52
53
  return dragging;
53
54
  }
54
55
  /**
@@ -56,11 +57,12 @@ export class GizmoManager {
56
57
  */
57
58
  set scaleRatio(value) {
58
59
  this._scaleRatio = value;
59
- [this.gizmos.positionGizmo, this.gizmos.rotationGizmo, this.gizmos.scaleGizmo].forEach((gizmo) => {
60
+ const gizmos = [this.gizmos.positionGizmo, this.gizmos.rotationGizmo, this.gizmos.scaleGizmo];
61
+ for (const gizmo of gizmos) {
60
62
  if (gizmo) {
61
63
  gizmo.scaleRatio = value;
62
64
  }
63
- });
65
+ }
64
66
  }
65
67
  get scaleRatio() {
66
68
  return this._scaleRatio;
@@ -72,11 +74,12 @@ export class GizmoManager {
72
74
  */
73
75
  set coordinatesMode(coordinatesMode) {
74
76
  this._coordinatesMode = coordinatesMode;
75
- [this.gizmos.positionGizmo, this.gizmos.rotationGizmo, this.gizmos.scaleGizmo].forEach((gizmo) => {
77
+ const gizmos = [this.gizmos.positionGizmo, this.gizmos.rotationGizmo, this.gizmos.scaleGizmo];
78
+ for (const gizmo of gizmos) {
76
79
  if (gizmo) {
77
80
  gizmo.coordinatesMode = coordinatesMode;
78
81
  }
79
- });
82
+ }
80
83
  }
81
84
  get coordinatesMode() {
82
85
  return this._coordinatesMode;
@@ -176,12 +179,12 @@ export class GizmoManager {
176
179
  else {
177
180
  // Attach to the parent node that is an attachableMesh
178
181
  let found = false;
179
- this.attachableMeshes.forEach((mesh) => {
182
+ for (const mesh of this.attachableMeshes) {
180
183
  if (node && (node == mesh || node.isDescendantOf(mesh))) {
181
184
  node = mesh;
182
185
  found = true;
183
186
  }
184
- });
187
+ }
185
188
  if (!found) {
186
189
  node = null;
187
190
  }
@@ -392,17 +395,18 @@ export class GizmoManager {
392
395
  * Force release the drag action by code
393
396
  */
394
397
  releaseDrag() {
395
- [this.gizmos.positionGizmo, this.gizmos.rotationGizmo, this.gizmos.scaleGizmo, this.gizmos.boundingBoxGizmo].forEach((gizmo) => {
398
+ const gizmos = [this.gizmos.positionGizmo, this.gizmos.rotationGizmo, this.gizmos.scaleGizmo, this.gizmos.boundingBoxGizmo];
399
+ for (const gizmo of gizmos) {
396
400
  gizmo?.releaseDrag();
397
- });
401
+ }
398
402
  }
399
403
  /**
400
404
  * Disposes of the gizmo manager
401
405
  */
402
406
  dispose() {
403
- this._pointerObservers.forEach((observer) => {
407
+ for (const observer of this._pointerObservers) {
404
408
  this._scene.onPointerObservable.remove(observer);
405
- });
409
+ }
406
410
  for (const key in this.gizmos) {
407
411
  const gizmo = this.gizmos[key];
408
412
  if (gizmo) {
@@ -1 +1 @@
1
- {"version":3,"file":"gizmoManager.js","sourceRoot":"","sources":["../../../../dev/core/src/Gizmos/gizmoManager.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Observer } from \"../Misc/observable\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { PointerInfo } from \"../Events/pointerEvents\";\r\nimport { PointerEventTypes } from \"../Events/pointerEvents\";\r\nimport type { Scene, IDisposable } from \"../scene\";\r\nimport type { Node } from \"../node\";\r\nimport { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { Mesh } from \"../Meshes/mesh\";\r\nimport { UtilityLayerRenderer } from \"../Rendering/utilityLayerRenderer\";\r\nimport { Color3 } from \"../Maths/math.color\";\r\nimport { SixDofDragBehavior } from \"../Behaviors/Meshes/sixDofDragBehavior\";\r\nimport type { GizmoAxisCache, IGizmo } from \"./gizmo\";\r\nimport { Gizmo, GizmoCoordinatesMode } from \"./gizmo\";\r\nimport type { IRotationGizmo } from \"./rotationGizmo\";\r\nimport { RotationGizmo } from \"./rotationGizmo\";\r\nimport type { IPositionGizmo } from \"./positionGizmo\";\r\nimport { PositionGizmo } from \"./positionGizmo\";\r\nimport type { IScaleGizmo } from \"./scaleGizmo\";\r\nimport { ScaleGizmo } from \"./scaleGizmo\";\r\nimport type { IBoundingBoxGizmo } from \"./boundingBoxGizmo\";\r\nimport { BoundingBoxGizmo } from \"./boundingBoxGizmo\";\r\nimport type { TransformNode } from \"../Meshes/transformNode\";\r\n\r\n/**\r\n * Helps setup gizmo's in the scene to rotate/scale/position nodes\r\n */\r\nexport class GizmoManager implements IDisposable {\r\n /**\r\n * Gizmo's created by the gizmo manager, gizmo will be null until gizmo has been enabled for the first time\r\n */\r\n public gizmos: {\r\n positionGizmo: Nullable<IPositionGizmo>;\r\n rotationGizmo: Nullable<IRotationGizmo>;\r\n scaleGizmo: Nullable<IScaleGizmo>;\r\n boundingBoxGizmo: Nullable<IBoundingBoxGizmo>;\r\n };\r\n\r\n /** When true, the gizmo will be detached from the current object when a pointer down occurs with an empty picked mesh */\r\n public clearGizmoOnEmptyPointerEvent = false;\r\n\r\n /** When true (default), picking to attach a new mesh is enabled. This works in sync with inspector autopicking. */\r\n public enableAutoPicking = true;\r\n\r\n /** Fires an event when the manager is attached to a mesh */\r\n public onAttachedToMeshObservable = new Observable<Nullable<AbstractMesh>>();\r\n\r\n /** Fires an event when the manager is attached to a node */\r\n public onAttachedToNodeObservable = new Observable<Nullable<Node>>();\r\n\r\n protected _gizmosEnabled = { positionGizmo: false, rotationGizmo: false, scaleGizmo: false, boundingBoxGizmo: false };\r\n protected _pointerObservers: Observer<PointerInfo>[] = [];\r\n protected _attachedMesh: Nullable<AbstractMesh> = null;\r\n protected _attachedNode: Nullable<Node> = null;\r\n protected _boundingBoxColor = Color3.FromHexString(\"#0984e3\");\r\n protected _defaultUtilityLayer: UtilityLayerRenderer;\r\n protected _defaultKeepDepthUtilityLayer: UtilityLayerRenderer;\r\n protected _thickness: number = 1;\r\n protected _scaleRatio: number = 1;\r\n protected _coordinatesMode = GizmoCoordinatesMode.Local;\r\n protected _additionalTransformNode?: TransformNode;\r\n\r\n /** Node Caching for quick lookup */\r\n private _gizmoAxisCache: Map<Mesh, GizmoAxisCache> = new Map();\r\n /**\r\n * When bounding box gizmo is enabled, this can be used to track drag/end events\r\n */\r\n public boundingBoxDragBehavior = new SixDofDragBehavior();\r\n /**\r\n * Array of meshes which will have the gizmo attached when a pointer selected them. If null, all meshes are attachable. (Default: null)\r\n */\r\n public attachableMeshes: Nullable<Array<AbstractMesh>> = null;\r\n /**\r\n * Array of nodes which will have the gizmo attached when a pointer selected them. If null, all nodes are attachable. (Default: null)\r\n */\r\n public attachableNodes: Nullable<Array<Node>> = null;\r\n /**\r\n * If pointer events should perform attaching/detaching a gizmo, if false this can be done manually via attachToMesh/attachToNode. (Default: true)\r\n */\r\n public usePointerToAttachGizmos = true;\r\n\r\n /**\r\n * Utility layer that the bounding box gizmo belongs to\r\n */\r\n public get keepDepthUtilityLayer() {\r\n return this._defaultKeepDepthUtilityLayer;\r\n }\r\n\r\n /**\r\n * Utility layer that all gizmos besides bounding box belong to\r\n */\r\n public get utilityLayer() {\r\n return this._defaultUtilityLayer;\r\n }\r\n\r\n /**\r\n * True when the mouse pointer is hovering a gizmo mesh\r\n */\r\n public get isHovered() {\r\n let hovered = false;\r\n for (const key in this.gizmos) {\r\n const gizmo = <Nullable<IGizmo>>(<any>this.gizmos)[key];\r\n if (gizmo && gizmo.isHovered) {\r\n hovered = true;\r\n break;\r\n }\r\n }\r\n return hovered;\r\n }\r\n\r\n /**\r\n * True when the mouse pointer is dragging a gizmo mesh\r\n */\r\n public get isDragging() {\r\n let dragging = false;\r\n\r\n [this.gizmos.positionGizmo, this.gizmos.rotationGizmo, this.gizmos.scaleGizmo, this.gizmos.boundingBoxGizmo].forEach((gizmo) => {\r\n if (gizmo && gizmo.isDragging) {\r\n dragging = true;\r\n }\r\n });\r\n\r\n return dragging;\r\n }\r\n\r\n /**\r\n * Ratio for the scale of the gizmo (Default: 1)\r\n */\r\n public set scaleRatio(value: number) {\r\n this._scaleRatio = value;\r\n [this.gizmos.positionGizmo, this.gizmos.rotationGizmo, this.gizmos.scaleGizmo].forEach((gizmo) => {\r\n if (gizmo) {\r\n gizmo.scaleRatio = value;\r\n }\r\n });\r\n }\r\n public get scaleRatio() {\r\n return this._scaleRatio;\r\n }\r\n\r\n /**\r\n * Set the coordinate system to use. By default it's local.\r\n * But it's possible for a user to tweak so its local for translation and world for rotation.\r\n * In that case, setting the coordinate system will change `updateGizmoRotationToMatchAttachedMesh` and `updateGizmoPositionToMatchAttachedMesh`\r\n */\r\n public set coordinatesMode(coordinatesMode: GizmoCoordinatesMode) {\r\n this._coordinatesMode = coordinatesMode;\r\n [this.gizmos.positionGizmo, this.gizmos.rotationGizmo, this.gizmos.scaleGizmo].forEach((gizmo) => {\r\n if (gizmo) {\r\n gizmo.coordinatesMode = coordinatesMode;\r\n }\r\n });\r\n }\r\n\r\n public get coordinatesMode(): GizmoCoordinatesMode {\r\n return this._coordinatesMode;\r\n }\r\n\r\n /**\r\n * The mesh the gizmo's is attached to\r\n */\r\n public get attachedMesh() {\r\n return this._attachedMesh;\r\n }\r\n\r\n /**\r\n * The node the gizmo's is attached to\r\n */\r\n public get attachedNode() {\r\n return this._attachedNode;\r\n }\r\n\r\n /**\r\n * Additional transform node that will be used to transform all the gizmos\r\n */\r\n public get additionalTransformNode() {\r\n return this._additionalTransformNode;\r\n }\r\n\r\n /**\r\n * Instantiates a gizmo manager\r\n * @param _scene the scene to overlay the gizmos on top of\r\n * @param thickness display gizmo axis thickness\r\n * @param utilityLayer the layer where gizmos are rendered\r\n * @param keepDepthUtilityLayer the layer where occluded gizmos are rendered\r\n */\r\n constructor(\r\n private _scene: Scene,\r\n thickness: number = 1,\r\n utilityLayer: UtilityLayerRenderer = UtilityLayerRenderer.DefaultUtilityLayer,\r\n keepDepthUtilityLayer: UtilityLayerRenderer = UtilityLayerRenderer.DefaultKeepDepthUtilityLayer\r\n ) {\r\n this._defaultUtilityLayer = utilityLayer;\r\n this._defaultKeepDepthUtilityLayer = keepDepthUtilityLayer;\r\n this._defaultKeepDepthUtilityLayer.utilityLayerScene.autoClearDepthAndStencil = false;\r\n this._thickness = thickness;\r\n this.gizmos = { positionGizmo: null, rotationGizmo: null, scaleGizmo: null, boundingBoxGizmo: null };\r\n\r\n const attachToMeshPointerObserver = this._attachToMeshPointerObserver(_scene);\r\n const gizmoAxisPointerObserver = Gizmo.GizmoAxisPointerObserver(this._defaultUtilityLayer, this._gizmoAxisCache);\r\n this._pointerObservers = [attachToMeshPointerObserver, gizmoAxisPointerObserver];\r\n }\r\n\r\n /**\r\n * @internal\r\n * Subscribes to pointer down events, for attaching and detaching mesh\r\n * @param scene The scene layer the observer will be added to\r\n * @returns the pointer observer\r\n */\r\n private _attachToMeshPointerObserver(scene: Scene): Observer<PointerInfo> {\r\n // Instantiate/dispose gizmos based on pointer actions\r\n const pointerObserver = scene.onPointerObservable.add((pointerInfo) => {\r\n if (!this.usePointerToAttachGizmos) {\r\n return;\r\n }\r\n if (pointerInfo.type == PointerEventTypes.POINTERDOWN) {\r\n if (pointerInfo.pickInfo && pointerInfo.pickInfo.pickedMesh) {\r\n if (this.enableAutoPicking) {\r\n let node: Nullable<Node> = pointerInfo.pickInfo.pickedMesh;\r\n if (this.attachableMeshes == null) {\r\n // Attach to the most parent node\r\n while (node && node.parent != null) {\r\n node = node.parent;\r\n }\r\n } else {\r\n // Attach to the parent node that is an attachableMesh\r\n let found = false;\r\n this.attachableMeshes.forEach((mesh) => {\r\n if (node && (node == mesh || node.isDescendantOf(mesh))) {\r\n node = mesh;\r\n found = true;\r\n }\r\n });\r\n if (!found) {\r\n node = null;\r\n }\r\n }\r\n if (node instanceof AbstractMesh) {\r\n if (this._attachedMesh != node) {\r\n this.attachToMesh(node);\r\n }\r\n } else {\r\n if (this.clearGizmoOnEmptyPointerEvent) {\r\n this.attachToMesh(null);\r\n }\r\n }\r\n }\r\n } else {\r\n if (this.clearGizmoOnEmptyPointerEvent) {\r\n this.attachToMesh(null);\r\n }\r\n }\r\n }\r\n });\r\n return pointerObserver!;\r\n }\r\n\r\n /**\r\n * Attaches a set of gizmos to the specified mesh\r\n * @param mesh The mesh the gizmo's should be attached to\r\n */\r\n public attachToMesh(mesh: Nullable<AbstractMesh>) {\r\n if (this._attachedMesh) {\r\n this._attachedMesh.removeBehavior(this.boundingBoxDragBehavior);\r\n }\r\n if (this._attachedNode) {\r\n this._attachedNode.removeBehavior(this.boundingBoxDragBehavior);\r\n }\r\n this._attachedMesh = mesh;\r\n this._attachedNode = null;\r\n for (const key in this.gizmos) {\r\n const gizmo = <Nullable<IGizmo>>(<any>this.gizmos)[key];\r\n if (gizmo && (<any>this._gizmosEnabled)[key]) {\r\n gizmo.attachedMesh = mesh;\r\n }\r\n }\r\n if (this.boundingBoxGizmoEnabled && this._attachedMesh) {\r\n this._attachedMesh.addBehavior(this.boundingBoxDragBehavior);\r\n }\r\n this.onAttachedToMeshObservable.notifyObservers(mesh);\r\n }\r\n\r\n /**\r\n * Attaches a set of gizmos to the specified node\r\n * @param node The node the gizmo's should be attached to\r\n */\r\n public attachToNode(node: Nullable<Node>) {\r\n if (this._attachedMesh) {\r\n this._attachedMesh.removeBehavior(this.boundingBoxDragBehavior);\r\n }\r\n if (this._attachedNode) {\r\n this._attachedNode.removeBehavior(this.boundingBoxDragBehavior);\r\n }\r\n this._attachedMesh = null;\r\n this._attachedNode = node;\r\n for (const key in this.gizmos) {\r\n const gizmo = <Nullable<IGizmo>>(<any>this.gizmos)[key];\r\n if (gizmo && (<any>this._gizmosEnabled)[key]) {\r\n gizmo.attachedNode = node;\r\n }\r\n }\r\n if (this.boundingBoxGizmoEnabled && this._attachedNode) {\r\n this._attachedNode.addBehavior(this.boundingBoxDragBehavior);\r\n }\r\n this.onAttachedToNodeObservable.notifyObservers(node);\r\n }\r\n\r\n /**\r\n * If the position gizmo is enabled\r\n */\r\n public set positionGizmoEnabled(value: boolean) {\r\n if (value) {\r\n if (!this.gizmos.positionGizmo) {\r\n this.gizmos.positionGizmo = new PositionGizmo(this._defaultUtilityLayer, this._thickness, this);\r\n }\r\n if (this._attachedNode) {\r\n this.gizmos.positionGizmo.attachedNode = this._attachedNode;\r\n } else {\r\n this.gizmos.positionGizmo.attachedMesh = this._attachedMesh;\r\n }\r\n } else if (this.gizmos.positionGizmo) {\r\n this.gizmos.positionGizmo.attachedNode = null;\r\n }\r\n this._gizmosEnabled.positionGizmo = value;\r\n this._setAdditionalTransformNode();\r\n }\r\n public get positionGizmoEnabled(): boolean {\r\n return this._gizmosEnabled.positionGizmo;\r\n }\r\n /**\r\n * If the rotation gizmo is enabled\r\n */\r\n public set rotationGizmoEnabled(value: boolean) {\r\n if (value) {\r\n if (!this.gizmos.rotationGizmo) {\r\n this.gizmos.rotationGizmo = new RotationGizmo(this._defaultUtilityLayer, 32, false, this._thickness, this);\r\n }\r\n if (this._attachedNode) {\r\n this.gizmos.rotationGizmo.attachedNode = this._attachedNode;\r\n } else {\r\n this.gizmos.rotationGizmo.attachedMesh = this._attachedMesh;\r\n }\r\n } else if (this.gizmos.rotationGizmo) {\r\n this.gizmos.rotationGizmo.attachedNode = null;\r\n }\r\n this._gizmosEnabled.rotationGizmo = value;\r\n this._setAdditionalTransformNode();\r\n }\r\n public get rotationGizmoEnabled(): boolean {\r\n return this._gizmosEnabled.rotationGizmo;\r\n }\r\n /**\r\n * If the scale gizmo is enabled\r\n */\r\n public set scaleGizmoEnabled(value: boolean) {\r\n if (value) {\r\n this.gizmos.scaleGizmo = this.gizmos.scaleGizmo || new ScaleGizmo(this._defaultUtilityLayer, this._thickness, this);\r\n if (this._attachedNode) {\r\n this.gizmos.scaleGizmo.attachedNode = this._attachedNode;\r\n } else {\r\n this.gizmos.scaleGizmo.attachedMesh = this._attachedMesh;\r\n }\r\n } else if (this.gizmos.scaleGizmo) {\r\n this.gizmos.scaleGizmo.attachedNode = null;\r\n }\r\n this._gizmosEnabled.scaleGizmo = value;\r\n this._setAdditionalTransformNode();\r\n }\r\n public get scaleGizmoEnabled(): boolean {\r\n return this._gizmosEnabled.scaleGizmo;\r\n }\r\n /**\r\n * If the boundingBox gizmo is enabled\r\n */\r\n public set boundingBoxGizmoEnabled(value: boolean) {\r\n if (value) {\r\n this.gizmos.boundingBoxGizmo = this.gizmos.boundingBoxGizmo || new BoundingBoxGizmo(this._boundingBoxColor, this._defaultKeepDepthUtilityLayer);\r\n if (this._attachedMesh) {\r\n this.gizmos.boundingBoxGizmo.attachedMesh = this._attachedMesh;\r\n } else {\r\n this.gizmos.boundingBoxGizmo.attachedNode = this._attachedNode;\r\n }\r\n\r\n if (this._attachedMesh) {\r\n this._attachedMesh.removeBehavior(this.boundingBoxDragBehavior);\r\n this._attachedMesh.addBehavior(this.boundingBoxDragBehavior);\r\n } else if (this._attachedNode) {\r\n this._attachedNode.removeBehavior(this.boundingBoxDragBehavior);\r\n this._attachedNode.addBehavior(this.boundingBoxDragBehavior);\r\n }\r\n } else if (this.gizmos.boundingBoxGizmo) {\r\n if (this._attachedMesh) {\r\n this._attachedMesh.removeBehavior(this.boundingBoxDragBehavior);\r\n } else if (this._attachedNode) {\r\n this._attachedNode.removeBehavior(this.boundingBoxDragBehavior);\r\n }\r\n this.gizmos.boundingBoxGizmo.attachedNode = null;\r\n }\r\n this._gizmosEnabled.boundingBoxGizmo = value;\r\n this._setAdditionalTransformNode();\r\n }\r\n public get boundingBoxGizmoEnabled(): boolean {\r\n return this._gizmosEnabled.boundingBoxGizmo;\r\n }\r\n\r\n /**\r\n * Sets the additional transform applied to all the gizmos.\r\n * @See Gizmo.additionalTransformNode for more detail\r\n */\r\n public set additionalTransformNode(node: TransformNode | undefined) {\r\n this._additionalTransformNode = node;\r\n this._setAdditionalTransformNode();\r\n }\r\n\r\n private _setAdditionalTransformNode() {\r\n for (const key in this.gizmos) {\r\n const gizmo = <Nullable<IGizmo>>(<any>this.gizmos)[key];\r\n if (gizmo && (<any>this._gizmosEnabled)[key]) {\r\n gizmo.additionalTransformNode = this._additionalTransformNode;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Builds Gizmo Axis Cache to enable features such as hover state preservation and graying out other axis during manipulation\r\n * @param gizmoAxisCache Gizmo axis definition used for reactive gizmo UI\r\n */\r\n public addToAxisCache(gizmoAxisCache: Map<Mesh, GizmoAxisCache>) {\r\n if (gizmoAxisCache.size > 0) {\r\n gizmoAxisCache.forEach((v, k) => {\r\n this._gizmoAxisCache.set(k, v);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Force release the drag action by code\r\n */\r\n public releaseDrag() {\r\n [this.gizmos.positionGizmo, this.gizmos.rotationGizmo, this.gizmos.scaleGizmo, this.gizmos.boundingBoxGizmo].forEach((gizmo) => {\r\n gizmo?.releaseDrag();\r\n });\r\n }\r\n\r\n /**\r\n * Disposes of the gizmo manager\r\n */\r\n public dispose() {\r\n this._pointerObservers.forEach((observer) => {\r\n this._scene.onPointerObservable.remove(observer);\r\n });\r\n for (const key in this.gizmos) {\r\n const gizmo = <Nullable<IGizmo>>(<any>this.gizmos)[key];\r\n if (gizmo) {\r\n gizmo.dispose();\r\n }\r\n }\r\n if (this._defaultKeepDepthUtilityLayer !== UtilityLayerRenderer._DefaultKeepDepthUtilityLayer) {\r\n this._defaultKeepDepthUtilityLayer?.dispose();\r\n }\r\n if (this._defaultUtilityLayer !== UtilityLayerRenderer._DefaultUtilityLayer) {\r\n this._defaultUtilityLayer?.dispose();\r\n }\r\n this.boundingBoxDragBehavior.detach();\r\n this.onAttachedToMeshObservable.clear();\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"gizmoManager.js","sourceRoot":"","sources":["../../../../dev/core/src/Gizmos/gizmoManager.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Observer } from \"../Misc/observable\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { PointerInfo } from \"../Events/pointerEvents\";\r\nimport { PointerEventTypes } from \"../Events/pointerEvents\";\r\nimport type { Scene, IDisposable } from \"../scene\";\r\nimport type { Node } from \"../node\";\r\nimport { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { Mesh } from \"../Meshes/mesh\";\r\nimport { UtilityLayerRenderer } from \"../Rendering/utilityLayerRenderer\";\r\nimport { Color3 } from \"../Maths/math.color\";\r\nimport { SixDofDragBehavior } from \"../Behaviors/Meshes/sixDofDragBehavior\";\r\nimport type { GizmoAxisCache, IGizmo } from \"./gizmo\";\r\nimport { Gizmo, GizmoCoordinatesMode } from \"./gizmo\";\r\nimport type { IRotationGizmo } from \"./rotationGizmo\";\r\nimport { RotationGizmo } from \"./rotationGizmo\";\r\nimport type { IPositionGizmo } from \"./positionGizmo\";\r\nimport { PositionGizmo } from \"./positionGizmo\";\r\nimport type { IScaleGizmo } from \"./scaleGizmo\";\r\nimport { ScaleGizmo } from \"./scaleGizmo\";\r\nimport type { IBoundingBoxGizmo } from \"./boundingBoxGizmo\";\r\nimport { BoundingBoxGizmo } from \"./boundingBoxGizmo\";\r\nimport type { TransformNode } from \"../Meshes/transformNode\";\r\n\r\n/**\r\n * Helps setup gizmo's in the scene to rotate/scale/position nodes\r\n */\r\nexport class GizmoManager implements IDisposable {\r\n /**\r\n * Gizmo's created by the gizmo manager, gizmo will be null until gizmo has been enabled for the first time\r\n */\r\n public gizmos: {\r\n positionGizmo: Nullable<IPositionGizmo>;\r\n rotationGizmo: Nullable<IRotationGizmo>;\r\n scaleGizmo: Nullable<IScaleGizmo>;\r\n boundingBoxGizmo: Nullable<IBoundingBoxGizmo>;\r\n };\r\n\r\n /** When true, the gizmo will be detached from the current object when a pointer down occurs with an empty picked mesh */\r\n public clearGizmoOnEmptyPointerEvent = false;\r\n\r\n /** When true (default), picking to attach a new mesh is enabled. This works in sync with inspector autopicking. */\r\n public enableAutoPicking = true;\r\n\r\n /** Fires an event when the manager is attached to a mesh */\r\n public onAttachedToMeshObservable = new Observable<Nullable<AbstractMesh>>();\r\n\r\n /** Fires an event when the manager is attached to a node */\r\n public onAttachedToNodeObservable = new Observable<Nullable<Node>>();\r\n\r\n protected _gizmosEnabled = { positionGizmo: false, rotationGizmo: false, scaleGizmo: false, boundingBoxGizmo: false };\r\n protected _pointerObservers: Observer<PointerInfo>[] = [];\r\n protected _attachedMesh: Nullable<AbstractMesh> = null;\r\n protected _attachedNode: Nullable<Node> = null;\r\n protected _boundingBoxColor = Color3.FromHexString(\"#0984e3\");\r\n protected _defaultUtilityLayer: UtilityLayerRenderer;\r\n protected _defaultKeepDepthUtilityLayer: UtilityLayerRenderer;\r\n protected _thickness: number = 1;\r\n protected _scaleRatio: number = 1;\r\n protected _coordinatesMode = GizmoCoordinatesMode.Local;\r\n protected _additionalTransformNode?: TransformNode;\r\n\r\n /** Node Caching for quick lookup */\r\n private _gizmoAxisCache: Map<Mesh, GizmoAxisCache> = new Map();\r\n /**\r\n * When bounding box gizmo is enabled, this can be used to track drag/end events\r\n */\r\n public boundingBoxDragBehavior = new SixDofDragBehavior();\r\n /**\r\n * Array of meshes which will have the gizmo attached when a pointer selected them. If null, all meshes are attachable. (Default: null)\r\n */\r\n public attachableMeshes: Nullable<Array<AbstractMesh>> = null;\r\n /**\r\n * Array of nodes which will have the gizmo attached when a pointer selected them. If null, all nodes are attachable. (Default: null)\r\n */\r\n public attachableNodes: Nullable<Array<Node>> = null;\r\n /**\r\n * If pointer events should perform attaching/detaching a gizmo, if false this can be done manually via attachToMesh/attachToNode. (Default: true)\r\n */\r\n public usePointerToAttachGizmos = true;\r\n\r\n /**\r\n * Utility layer that the bounding box gizmo belongs to\r\n */\r\n public get keepDepthUtilityLayer() {\r\n return this._defaultKeepDepthUtilityLayer;\r\n }\r\n\r\n /**\r\n * Utility layer that all gizmos besides bounding box belong to\r\n */\r\n public get utilityLayer() {\r\n return this._defaultUtilityLayer;\r\n }\r\n\r\n /**\r\n * True when the mouse pointer is hovering a gizmo mesh\r\n */\r\n public get isHovered() {\r\n let hovered = false;\r\n for (const key in this.gizmos) {\r\n const gizmo = <Nullable<IGizmo>>(<any>this.gizmos)[key];\r\n if (gizmo && gizmo.isHovered) {\r\n hovered = true;\r\n break;\r\n }\r\n }\r\n return hovered;\r\n }\r\n\r\n /**\r\n * True when the mouse pointer is dragging a gizmo mesh\r\n */\r\n public get isDragging() {\r\n let dragging = false;\r\n\r\n const gizmos = [this.gizmos.positionGizmo, this.gizmos.rotationGizmo, this.gizmos.scaleGizmo, this.gizmos.boundingBoxGizmo];\r\n for (const gizmo of gizmos) {\r\n if (gizmo && gizmo.isDragging) {\r\n dragging = true;\r\n }\r\n }\r\n\r\n return dragging;\r\n }\r\n\r\n /**\r\n * Ratio for the scale of the gizmo (Default: 1)\r\n */\r\n public set scaleRatio(value: number) {\r\n this._scaleRatio = value;\r\n const gizmos = [this.gizmos.positionGizmo, this.gizmos.rotationGizmo, this.gizmos.scaleGizmo];\r\n for (const gizmo of gizmos) {\r\n if (gizmo) {\r\n gizmo.scaleRatio = value;\r\n }\r\n }\r\n }\r\n public get scaleRatio() {\r\n return this._scaleRatio;\r\n }\r\n\r\n /**\r\n * Set the coordinate system to use. By default it's local.\r\n * But it's possible for a user to tweak so its local for translation and world for rotation.\r\n * In that case, setting the coordinate system will change `updateGizmoRotationToMatchAttachedMesh` and `updateGizmoPositionToMatchAttachedMesh`\r\n */\r\n public set coordinatesMode(coordinatesMode: GizmoCoordinatesMode) {\r\n this._coordinatesMode = coordinatesMode;\r\n const gizmos = [this.gizmos.positionGizmo, this.gizmos.rotationGizmo, this.gizmos.scaleGizmo];\r\n for (const gizmo of gizmos) {\r\n if (gizmo) {\r\n gizmo.coordinatesMode = coordinatesMode;\r\n }\r\n }\r\n }\r\n\r\n public get coordinatesMode(): GizmoCoordinatesMode {\r\n return this._coordinatesMode;\r\n }\r\n\r\n /**\r\n * The mesh the gizmo's is attached to\r\n */\r\n public get attachedMesh() {\r\n return this._attachedMesh;\r\n }\r\n\r\n /**\r\n * The node the gizmo's is attached to\r\n */\r\n public get attachedNode() {\r\n return this._attachedNode;\r\n }\r\n\r\n /**\r\n * Additional transform node that will be used to transform all the gizmos\r\n */\r\n public get additionalTransformNode() {\r\n return this._additionalTransformNode;\r\n }\r\n\r\n /**\r\n * Instantiates a gizmo manager\r\n * @param _scene the scene to overlay the gizmos on top of\r\n * @param thickness display gizmo axis thickness\r\n * @param utilityLayer the layer where gizmos are rendered\r\n * @param keepDepthUtilityLayer the layer where occluded gizmos are rendered\r\n */\r\n constructor(\r\n private _scene: Scene,\r\n thickness: number = 1,\r\n utilityLayer: UtilityLayerRenderer = UtilityLayerRenderer.DefaultUtilityLayer,\r\n keepDepthUtilityLayer: UtilityLayerRenderer = UtilityLayerRenderer.DefaultKeepDepthUtilityLayer\r\n ) {\r\n this._defaultUtilityLayer = utilityLayer;\r\n this._defaultKeepDepthUtilityLayer = keepDepthUtilityLayer;\r\n this._defaultKeepDepthUtilityLayer.utilityLayerScene.autoClearDepthAndStencil = false;\r\n this._thickness = thickness;\r\n this.gizmos = { positionGizmo: null, rotationGizmo: null, scaleGizmo: null, boundingBoxGizmo: null };\r\n\r\n const attachToMeshPointerObserver = this._attachToMeshPointerObserver(_scene);\r\n const gizmoAxisPointerObserver = Gizmo.GizmoAxisPointerObserver(this._defaultUtilityLayer, this._gizmoAxisCache);\r\n this._pointerObservers = [attachToMeshPointerObserver, gizmoAxisPointerObserver];\r\n }\r\n\r\n /**\r\n * @internal\r\n * Subscribes to pointer down events, for attaching and detaching mesh\r\n * @param scene The scene layer the observer will be added to\r\n * @returns the pointer observer\r\n */\r\n private _attachToMeshPointerObserver(scene: Scene): Observer<PointerInfo> {\r\n // Instantiate/dispose gizmos based on pointer actions\r\n const pointerObserver = scene.onPointerObservable.add((pointerInfo) => {\r\n if (!this.usePointerToAttachGizmos) {\r\n return;\r\n }\r\n if (pointerInfo.type == PointerEventTypes.POINTERDOWN) {\r\n if (pointerInfo.pickInfo && pointerInfo.pickInfo.pickedMesh) {\r\n if (this.enableAutoPicking) {\r\n let node: Nullable<Node> = pointerInfo.pickInfo.pickedMesh;\r\n if (this.attachableMeshes == null) {\r\n // Attach to the most parent node\r\n while (node && node.parent != null) {\r\n node = node.parent;\r\n }\r\n } else {\r\n // Attach to the parent node that is an attachableMesh\r\n let found = false;\r\n for (const mesh of this.attachableMeshes) {\r\n if (node && (node == mesh || node.isDescendantOf(mesh))) {\r\n node = mesh;\r\n found = true;\r\n }\r\n }\r\n if (!found) {\r\n node = null;\r\n }\r\n }\r\n if (node instanceof AbstractMesh) {\r\n if (this._attachedMesh != node) {\r\n this.attachToMesh(node);\r\n }\r\n } else {\r\n if (this.clearGizmoOnEmptyPointerEvent) {\r\n this.attachToMesh(null);\r\n }\r\n }\r\n }\r\n } else {\r\n if (this.clearGizmoOnEmptyPointerEvent) {\r\n this.attachToMesh(null);\r\n }\r\n }\r\n }\r\n });\r\n return pointerObserver!;\r\n }\r\n\r\n /**\r\n * Attaches a set of gizmos to the specified mesh\r\n * @param mesh The mesh the gizmo's should be attached to\r\n */\r\n public attachToMesh(mesh: Nullable<AbstractMesh>) {\r\n if (this._attachedMesh) {\r\n this._attachedMesh.removeBehavior(this.boundingBoxDragBehavior);\r\n }\r\n if (this._attachedNode) {\r\n this._attachedNode.removeBehavior(this.boundingBoxDragBehavior);\r\n }\r\n this._attachedMesh = mesh;\r\n this._attachedNode = null;\r\n for (const key in this.gizmos) {\r\n const gizmo = <Nullable<IGizmo>>(<any>this.gizmos)[key];\r\n if (gizmo && (<any>this._gizmosEnabled)[key]) {\r\n gizmo.attachedMesh = mesh;\r\n }\r\n }\r\n if (this.boundingBoxGizmoEnabled && this._attachedMesh) {\r\n this._attachedMesh.addBehavior(this.boundingBoxDragBehavior);\r\n }\r\n this.onAttachedToMeshObservable.notifyObservers(mesh);\r\n }\r\n\r\n /**\r\n * Attaches a set of gizmos to the specified node\r\n * @param node The node the gizmo's should be attached to\r\n */\r\n public attachToNode(node: Nullable<Node>) {\r\n if (this._attachedMesh) {\r\n this._attachedMesh.removeBehavior(this.boundingBoxDragBehavior);\r\n }\r\n if (this._attachedNode) {\r\n this._attachedNode.removeBehavior(this.boundingBoxDragBehavior);\r\n }\r\n this._attachedMesh = null;\r\n this._attachedNode = node;\r\n for (const key in this.gizmos) {\r\n const gizmo = <Nullable<IGizmo>>(<any>this.gizmos)[key];\r\n if (gizmo && (<any>this._gizmosEnabled)[key]) {\r\n gizmo.attachedNode = node;\r\n }\r\n }\r\n if (this.boundingBoxGizmoEnabled && this._attachedNode) {\r\n this._attachedNode.addBehavior(this.boundingBoxDragBehavior);\r\n }\r\n this.onAttachedToNodeObservable.notifyObservers(node);\r\n }\r\n\r\n /**\r\n * If the position gizmo is enabled\r\n */\r\n public set positionGizmoEnabled(value: boolean) {\r\n if (value) {\r\n if (!this.gizmos.positionGizmo) {\r\n this.gizmos.positionGizmo = new PositionGizmo(this._defaultUtilityLayer, this._thickness, this);\r\n }\r\n if (this._attachedNode) {\r\n this.gizmos.positionGizmo.attachedNode = this._attachedNode;\r\n } else {\r\n this.gizmos.positionGizmo.attachedMesh = this._attachedMesh;\r\n }\r\n } else if (this.gizmos.positionGizmo) {\r\n this.gizmos.positionGizmo.attachedNode = null;\r\n }\r\n this._gizmosEnabled.positionGizmo = value;\r\n this._setAdditionalTransformNode();\r\n }\r\n public get positionGizmoEnabled(): boolean {\r\n return this._gizmosEnabled.positionGizmo;\r\n }\r\n /**\r\n * If the rotation gizmo is enabled\r\n */\r\n public set rotationGizmoEnabled(value: boolean) {\r\n if (value) {\r\n if (!this.gizmos.rotationGizmo) {\r\n this.gizmos.rotationGizmo = new RotationGizmo(this._defaultUtilityLayer, 32, false, this._thickness, this);\r\n }\r\n if (this._attachedNode) {\r\n this.gizmos.rotationGizmo.attachedNode = this._attachedNode;\r\n } else {\r\n this.gizmos.rotationGizmo.attachedMesh = this._attachedMesh;\r\n }\r\n } else if (this.gizmos.rotationGizmo) {\r\n this.gizmos.rotationGizmo.attachedNode = null;\r\n }\r\n this._gizmosEnabled.rotationGizmo = value;\r\n this._setAdditionalTransformNode();\r\n }\r\n public get rotationGizmoEnabled(): boolean {\r\n return this._gizmosEnabled.rotationGizmo;\r\n }\r\n /**\r\n * If the scale gizmo is enabled\r\n */\r\n public set scaleGizmoEnabled(value: boolean) {\r\n if (value) {\r\n this.gizmos.scaleGizmo = this.gizmos.scaleGizmo || new ScaleGizmo(this._defaultUtilityLayer, this._thickness, this);\r\n if (this._attachedNode) {\r\n this.gizmos.scaleGizmo.attachedNode = this._attachedNode;\r\n } else {\r\n this.gizmos.scaleGizmo.attachedMesh = this._attachedMesh;\r\n }\r\n } else if (this.gizmos.scaleGizmo) {\r\n this.gizmos.scaleGizmo.attachedNode = null;\r\n }\r\n this._gizmosEnabled.scaleGizmo = value;\r\n this._setAdditionalTransformNode();\r\n }\r\n public get scaleGizmoEnabled(): boolean {\r\n return this._gizmosEnabled.scaleGizmo;\r\n }\r\n /**\r\n * If the boundingBox gizmo is enabled\r\n */\r\n public set boundingBoxGizmoEnabled(value: boolean) {\r\n if (value) {\r\n this.gizmos.boundingBoxGizmo = this.gizmos.boundingBoxGizmo || new BoundingBoxGizmo(this._boundingBoxColor, this._defaultKeepDepthUtilityLayer);\r\n if (this._attachedMesh) {\r\n this.gizmos.boundingBoxGizmo.attachedMesh = this._attachedMesh;\r\n } else {\r\n this.gizmos.boundingBoxGizmo.attachedNode = this._attachedNode;\r\n }\r\n\r\n if (this._attachedMesh) {\r\n this._attachedMesh.removeBehavior(this.boundingBoxDragBehavior);\r\n this._attachedMesh.addBehavior(this.boundingBoxDragBehavior);\r\n } else if (this._attachedNode) {\r\n this._attachedNode.removeBehavior(this.boundingBoxDragBehavior);\r\n this._attachedNode.addBehavior(this.boundingBoxDragBehavior);\r\n }\r\n } else if (this.gizmos.boundingBoxGizmo) {\r\n if (this._attachedMesh) {\r\n this._attachedMesh.removeBehavior(this.boundingBoxDragBehavior);\r\n } else if (this._attachedNode) {\r\n this._attachedNode.removeBehavior(this.boundingBoxDragBehavior);\r\n }\r\n this.gizmos.boundingBoxGizmo.attachedNode = null;\r\n }\r\n this._gizmosEnabled.boundingBoxGizmo = value;\r\n this._setAdditionalTransformNode();\r\n }\r\n public get boundingBoxGizmoEnabled(): boolean {\r\n return this._gizmosEnabled.boundingBoxGizmo;\r\n }\r\n\r\n /**\r\n * Sets the additional transform applied to all the gizmos.\r\n * @See Gizmo.additionalTransformNode for more detail\r\n */\r\n public set additionalTransformNode(node: TransformNode | undefined) {\r\n this._additionalTransformNode = node;\r\n this._setAdditionalTransformNode();\r\n }\r\n\r\n private _setAdditionalTransformNode() {\r\n for (const key in this.gizmos) {\r\n const gizmo = <Nullable<IGizmo>>(<any>this.gizmos)[key];\r\n if (gizmo && (<any>this._gizmosEnabled)[key]) {\r\n gizmo.additionalTransformNode = this._additionalTransformNode;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Builds Gizmo Axis Cache to enable features such as hover state preservation and graying out other axis during manipulation\r\n * @param gizmoAxisCache Gizmo axis definition used for reactive gizmo UI\r\n */\r\n public addToAxisCache(gizmoAxisCache: Map<Mesh, GizmoAxisCache>) {\r\n if (gizmoAxisCache.size > 0) {\r\n gizmoAxisCache.forEach((v, k) => {\r\n this._gizmoAxisCache.set(k, v);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Force release the drag action by code\r\n */\r\n public releaseDrag() {\r\n const gizmos = [this.gizmos.positionGizmo, this.gizmos.rotationGizmo, this.gizmos.scaleGizmo, this.gizmos.boundingBoxGizmo];\r\n for (const gizmo of gizmos) {\r\n gizmo?.releaseDrag();\r\n }\r\n }\r\n\r\n /**\r\n * Disposes of the gizmo manager\r\n */\r\n public dispose() {\r\n for (const observer of this._pointerObservers) {\r\n this._scene.onPointerObservable.remove(observer);\r\n }\r\n for (const key in this.gizmos) {\r\n const gizmo = <Nullable<IGizmo>>(<any>this.gizmos)[key];\r\n if (gizmo) {\r\n gizmo.dispose();\r\n }\r\n }\r\n if (this._defaultKeepDepthUtilityLayer !== UtilityLayerRenderer._DefaultKeepDepthUtilityLayer) {\r\n this._defaultKeepDepthUtilityLayer?.dispose();\r\n }\r\n if (this._defaultUtilityLayer !== UtilityLayerRenderer._DefaultUtilityLayer) {\r\n this._defaultUtilityLayer?.dispose();\r\n }\r\n this.boundingBoxDragBehavior.detach();\r\n this.onAttachedToMeshObservable.clear();\r\n }\r\n}\r\n"]}
@@ -81,9 +81,10 @@ export class LightGizmo extends Gizmo {
81
81
  else {
82
82
  this._lightMesh = LightGizmo._CreatePointLightMesh(this.gizmoLayer.utilityLayerScene);
83
83
  }
84
- this._lightMesh.getChildMeshes(false).forEach((m) => {
84
+ const children = this._lightMesh.getChildMeshes(false);
85
+ for (const m of children) {
85
86
  m.material = this._material;
86
- });
87
+ }
87
88
  this._lightMesh.parent = this._rootMesh;
88
89
  // Add lighting to the light gizmo
89
90
  const gizmoLight = this.gizmoLayer._getSharedGizmoLight();