@babylonjs/core 5.16.0 → 5.18.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 (175) hide show
  1. package/Animations/animatable.js +1 -1
  2. package/Animations/animatable.js.map +1 -1
  3. package/Animations/animation.d.ts +8 -1
  4. package/Animations/animation.js +8 -1
  5. package/Animations/animation.js.map +1 -1
  6. package/Animations/animationGroup.js +5 -4
  7. package/Animations/animationGroup.js.map +1 -1
  8. package/Bones/skeleton.js +1 -1
  9. package/Bones/skeleton.js.map +1 -1
  10. package/Cameras/Inputs/arcRotateCameraKeyboardMoveInput.js +2 -2
  11. package/Cameras/Inputs/arcRotateCameraKeyboardMoveInput.js.map +1 -1
  12. package/Cameras/Inputs/flyCameraKeyboardInput.js +3 -3
  13. package/Cameras/Inputs/flyCameraKeyboardInput.js.map +1 -1
  14. package/Cameras/Inputs/followCameraKeyboardMoveInput.js +2 -2
  15. package/Cameras/Inputs/followCameraKeyboardMoveInput.js.map +1 -1
  16. package/Cameras/Inputs/freeCameraKeyboardMoveInput.js +3 -3
  17. package/Cameras/Inputs/freeCameraKeyboardMoveInput.js.map +1 -1
  18. package/Cameras/Inputs/freeCameraTouchInput.js +1 -1
  19. package/Cameras/Inputs/freeCameraTouchInput.js.map +1 -1
  20. package/Cameras/VR/vrExperienceHelper.js +1 -1
  21. package/Cameras/VR/vrExperienceHelper.js.map +1 -1
  22. package/Cameras/VR/webVRCamera.js +1 -1
  23. package/Cameras/VR/webVRCamera.js.map +1 -1
  24. package/Cameras/camera.js +3 -3
  25. package/Cameras/camera.js.map +1 -1
  26. package/Engines/Extensions/engine.views.d.ts +13 -0
  27. package/Engines/Extensions/engine.views.js +16 -1
  28. package/Engines/Extensions/engine.views.js.map +1 -1
  29. package/Engines/Processors/shaderCodeCursor.js +2 -1
  30. package/Engines/Processors/shaderCodeCursor.js.map +1 -1
  31. package/Engines/WebGPU/webgpuOcclusionQuery.js +1 -1
  32. package/Engines/WebGPU/webgpuOcclusionQuery.js.map +1 -1
  33. package/Engines/engine.d.ts +2 -10
  34. package/Engines/engine.js +0 -14
  35. package/Engines/engine.js.map +1 -1
  36. package/Engines/engineFeatures.d.ts +2 -0
  37. package/Engines/engineFeatures.js.map +1 -1
  38. package/Engines/nativeEngine.d.ts +6 -2
  39. package/Engines/nativeEngine.js +13 -6
  40. package/Engines/nativeEngine.js.map +1 -1
  41. package/Engines/nullEngine.js +1 -0
  42. package/Engines/nullEngine.js.map +1 -1
  43. package/Engines/thinEngine.d.ts +10 -0
  44. package/Engines/thinEngine.js +26 -6
  45. package/Engines/thinEngine.js.map +1 -1
  46. package/Engines/webgpuEngine.js +1 -0
  47. package/Engines/webgpuEngine.js.map +1 -1
  48. package/Gizmos/axisDragGizmo.d.ts +11 -8
  49. package/Gizmos/axisDragGizmo.js.map +1 -1
  50. package/Gizmos/axisScaleGizmo.d.ts +20 -13
  51. package/Gizmos/axisScaleGizmo.js.map +1 -1
  52. package/Gizmos/boundingBoxGizmo.d.ts +27 -18
  53. package/Gizmos/boundingBoxGizmo.js +6 -0
  54. package/Gizmos/boundingBoxGizmo.js.map +1 -1
  55. package/Gizmos/cameraGizmo.d.ts +8 -5
  56. package/Gizmos/cameraGizmo.js.map +1 -1
  57. package/Gizmos/gizmo.d.ts +48 -6
  58. package/Gizmos/gizmo.js.map +1 -1
  59. package/Gizmos/gizmoManager.d.ts +17 -9
  60. package/Gizmos/gizmoManager.js.map +1 -1
  61. package/Gizmos/lightGizmo.d.ts +12 -7
  62. package/Gizmos/lightGizmo.js.map +1 -1
  63. package/Gizmos/planeDragGizmo.d.ts +10 -8
  64. package/Gizmos/planeDragGizmo.js.map +1 -1
  65. package/Gizmos/planeRotationGizmo.d.ts +23 -14
  66. package/Gizmos/planeRotationGizmo.js.map +1 -1
  67. package/Gizmos/positionGizmo.d.ts +9 -7
  68. package/Gizmos/positionGizmo.js +1 -1
  69. package/Gizmos/positionGizmo.js.map +1 -1
  70. package/Gizmos/rotationGizmo.d.ts +6 -4
  71. package/Gizmos/rotationGizmo.js.map +1 -1
  72. package/Gizmos/scaleGizmo.d.ts +15 -12
  73. package/Gizmos/scaleGizmo.js.map +1 -1
  74. package/Inputs/scene.inputManager.js +0 -3
  75. package/Inputs/scene.inputManager.js.map +1 -1
  76. package/Loading/sceneLoader.js +5 -5
  77. package/Loading/sceneLoader.js.map +1 -1
  78. package/Materials/Node/Blocks/Fragment/TBNBlock.d.ts +12 -0
  79. package/Materials/Node/Blocks/Fragment/TBNBlock.js +50 -0
  80. package/Materials/Node/Blocks/Fragment/TBNBlock.js.map +1 -1
  81. package/Materials/Node/Blocks/Vertex/lightInformationBlock.d.ts +18 -0
  82. package/Materials/Node/Blocks/Vertex/lightInformationBlock.js +85 -1
  83. package/Materials/Node/Blocks/Vertex/lightInformationBlock.js.map +1 -1
  84. package/Materials/Node/Blocks/gradientBlock.js +1 -1
  85. package/Materials/Node/Blocks/gradientBlock.js.map +1 -1
  86. package/Materials/Node/nodeMaterial.d.ts +18 -2
  87. package/Materials/Node/nodeMaterial.js +56 -27
  88. package/Materials/Node/nodeMaterial.js.map +1 -1
  89. package/Materials/Textures/baseTexture.d.ts +2 -1
  90. package/Materials/Textures/baseTexture.js +4 -1
  91. package/Materials/Textures/baseTexture.js.map +1 -1
  92. package/Materials/Textures/prePassRenderTarget.js +1 -1
  93. package/Materials/Textures/prePassRenderTarget.js.map +1 -1
  94. package/Materials/Textures/renderTargetTexture.js +11 -3
  95. package/Materials/Textures/renderTargetTexture.js.map +1 -1
  96. package/Materials/materialDefines.js +3 -1
  97. package/Materials/materialDefines.js.map +1 -1
  98. package/Materials/shaderMaterial.d.ts +10 -1
  99. package/Materials/shaderMaterial.js +10 -1
  100. package/Materials/shaderMaterial.js.map +1 -1
  101. package/Maths/math.color.d.ts +9 -1
  102. package/Maths/math.color.js +13 -1
  103. package/Maths/math.color.js.map +1 -1
  104. package/Maths/math.vector.d.ts +2 -2
  105. package/Maths/math.vector.js +18 -30
  106. package/Maths/math.vector.js.map +1 -1
  107. package/Meshes/Builders/icoSphereBuilder.js +2 -2
  108. package/Meshes/Builders/icoSphereBuilder.js.map +1 -1
  109. package/Meshes/Compression/dracoCompression.js +1 -1
  110. package/Meshes/Compression/dracoCompression.js.map +1 -1
  111. package/Meshes/abstractMesh.js +1 -1
  112. package/Meshes/abstractMesh.js.map +1 -1
  113. package/Meshes/geometry.js +1 -2
  114. package/Meshes/geometry.js.map +1 -1
  115. package/Meshes/thinInstanceMesh.js +5 -0
  116. package/Meshes/thinInstanceMesh.js.map +1 -1
  117. package/Misc/basis.js +3 -0
  118. package/Misc/basis.js.map +1 -1
  119. package/Misc/fileTools.js +2 -2
  120. package/Misc/fileTools.js.map +1 -1
  121. package/Misc/khronosTextureContainer2.js +1 -1
  122. package/Misc/khronosTextureContainer2.js.map +1 -1
  123. package/Misc/smartArray.js +0 -1
  124. package/Misc/smartArray.js.map +1 -1
  125. package/Misc/tools.d.ts +2 -2
  126. package/Misc/tools.js +4 -1
  127. package/Misc/tools.js.map +1 -1
  128. package/Offline/database.js +6 -8
  129. package/Offline/database.js.map +1 -1
  130. package/Particles/computeShaderParticleSystem.js +2 -2
  131. package/Particles/computeShaderParticleSystem.js.map +1 -1
  132. package/Particles/particleHelper.d.ts +12 -1
  133. package/Particles/particleHelper.js +12 -1
  134. package/Particles/particleHelper.js.map +1 -1
  135. package/Particles/particleSystem.js +2 -2
  136. package/Particles/particleSystem.js.map +1 -1
  137. package/Particles/particleSystemSet.js +1 -1
  138. package/Particles/particleSystemSet.js.map +1 -1
  139. package/Particles/solidParticleSystem.d.ts +3 -0
  140. package/Particles/solidParticleSystem.js +3 -0
  141. package/Particles/solidParticleSystem.js.map +1 -1
  142. package/Particles/webgl2ParticleSystem.js +2 -2
  143. package/Particles/webgl2ParticleSystem.js.map +1 -1
  144. package/Physics/Plugins/ammoJSPlugin.d.ts +2 -2
  145. package/Physics/Plugins/ammoJSPlugin.js +29 -29
  146. package/Physics/Plugins/ammoJSPlugin.js.map +1 -1
  147. package/Physics/Plugins/cannonJSPlugin.d.ts +2 -2
  148. package/Physics/Plugins/cannonJSPlugin.js +26 -26
  149. package/Physics/Plugins/cannonJSPlugin.js.map +1 -1
  150. package/Physics/Plugins/oimoJSPlugin.js +9 -11
  151. package/Physics/Plugins/oimoJSPlugin.js.map +1 -1
  152. package/Physics/physicsImpostor.d.ts +6 -6
  153. package/Physics/physicsImpostor.js +7 -6
  154. package/Physics/physicsImpostor.js.map +1 -1
  155. package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.js +3 -3
  156. package/PostProcesses/RenderPipeline/Pipelines/standardRenderingPipeline.js.map +1 -1
  157. package/Rendering/utilityLayerRenderer.js +1 -1
  158. package/Rendering/utilityLayerRenderer.js.map +1 -1
  159. package/Shaders/sprites.fragment.js +1 -1
  160. package/Shaders/sprites.fragment.js.map +1 -1
  161. package/Sprites/spriteManager.d.ts +10 -1
  162. package/Sprites/spriteManager.js +10 -1
  163. package/Sprites/spriteManager.js.map +1 -1
  164. package/Sprites/spriteRenderer.js +1 -1
  165. package/Sprites/spriteRenderer.js.map +1 -1
  166. package/XR/features/WebXRLayers.js +1 -1
  167. package/XR/features/WebXRLayers.js.map +1 -1
  168. package/assetContainer.js +12 -12
  169. package/assetContainer.js.map +1 -1
  170. package/node.js +1 -1
  171. package/node.js.map +1 -1
  172. package/package.json +1 -1
  173. package/scene.d.ts +2 -0
  174. package/scene.js +15 -8
  175. package/scene.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"planeDragGizmo.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Gizmos/planeDragGizmo.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 { Vector3 } from \"../Maths/math.vector\";\r\nimport { Color3 } from \"../Maths/math.color\";\r\nimport { TransformNode } from \"../Meshes/transformNode\";\r\nimport type { Node } from \"../node\";\r\nimport type { Mesh } from \"../Meshes/mesh\";\r\nimport { CreatePlane } from \"../Meshes/Builders/planeBuilder\";\r\nimport { PointerDragBehavior } from \"../Behaviors/Meshes/pointerDragBehavior\";\r\nimport type { GizmoAxisCache } from \"./gizmo\";\r\nimport { Gizmo } from \"./gizmo\";\r\nimport { UtilityLayerRenderer } from \"../Rendering/utilityLayerRenderer\";\r\nimport { StandardMaterial } from \"../Materials/standardMaterial\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { PositionGizmo } from \"./positionGizmo\";\r\n/**\r\n * Single plane drag gizmo\r\n */\r\nexport class PlaneDragGizmo extends Gizmo {\r\n /**\r\n * Drag behavior responsible for the gizmos dragging interactions\r\n */\r\n public dragBehavior: PointerDragBehavior;\r\n private _pointerObserver: Nullable<Observer<PointerInfo>> = null;\r\n /**\r\n * Drag distance in babylon units that the gizmo will snap to when dragged (Default: 0)\r\n */\r\n public snapDistance = 0;\r\n /**\r\n * Event that fires each time the gizmo snaps to a new location.\r\n * * snapDistance is the the change in distance\r\n */\r\n public onSnapObservable = new Observable<{ snapDistance: number }>();\r\n\r\n private _gizmoMesh: TransformNode;\r\n private _coloredMaterial: StandardMaterial;\r\n private _hoverMaterial: StandardMaterial;\r\n private _disableMaterial: StandardMaterial;\r\n\r\n private _isEnabled: boolean = false;\r\n private _parent: Nullable<PositionGizmo> = null;\r\n private _dragging: boolean = false;\r\n\r\n /**\r\n * @param scene\r\n * @param material\r\n * @hidden\r\n */\r\n public static _CreatePlane(scene: Scene, material: StandardMaterial): TransformNode {\r\n const plane = new TransformNode(\"plane\", scene);\r\n\r\n //make sure plane is double sided\r\n const dragPlane = CreatePlane(\"dragPlane\", { width: 0.1375, height: 0.1375, sideOrientation: 2 }, scene);\r\n dragPlane.material = material;\r\n dragPlane.parent = plane;\r\n return plane;\r\n }\r\n\r\n /**\r\n * Creates a PlaneDragGizmo\r\n * @param dragPlaneNormal The axis normal to which the gizmo will be able to drag on\r\n * @param color The color of the gizmo\r\n * @param gizmoLayer The utility layer the gizmo will be added to\r\n * @param parent\r\n */\r\n constructor(\r\n dragPlaneNormal: Vector3,\r\n color: Color3 = Color3.Gray(),\r\n gizmoLayer: UtilityLayerRenderer = UtilityLayerRenderer.DefaultUtilityLayer,\r\n parent: Nullable<PositionGizmo> = null\r\n ) {\r\n super(gizmoLayer);\r\n this._parent = parent;\r\n // Create Material\r\n this._coloredMaterial = new StandardMaterial(\"\", gizmoLayer.utilityLayerScene);\r\n this._coloredMaterial.diffuseColor = color;\r\n this._coloredMaterial.specularColor = color.subtract(new Color3(0.1, 0.1, 0.1));\r\n\r\n this._hoverMaterial = new StandardMaterial(\"\", gizmoLayer.utilityLayerScene);\r\n this._hoverMaterial.diffuseColor = Color3.Yellow();\r\n\r\n this._disableMaterial = new StandardMaterial(\"\", gizmoLayer.utilityLayerScene);\r\n this._disableMaterial.diffuseColor = Color3.Gray();\r\n this._disableMaterial.alpha = 0.4;\r\n\r\n // Build plane mesh on root node\r\n this._gizmoMesh = PlaneDragGizmo._CreatePlane(gizmoLayer.utilityLayerScene, this._coloredMaterial);\r\n\r\n this._gizmoMesh.lookAt(this._rootMesh.position.add(dragPlaneNormal));\r\n this._gizmoMesh.scaling.scaleInPlace(1 / 3);\r\n this._gizmoMesh.parent = this._rootMesh;\r\n\r\n let currentSnapDragDistance = 0;\r\n const tmpVector = new Vector3();\r\n const tmpSnapEvent = { snapDistance: 0 };\r\n // Add dragPlaneNormal drag behavior to handle events when the gizmo is dragged\r\n this.dragBehavior = new PointerDragBehavior({ dragPlaneNormal: dragPlaneNormal });\r\n this.dragBehavior.moveAttached = false;\r\n this._rootMesh.addBehavior(this.dragBehavior);\r\n\r\n this.dragBehavior.onDragObservable.add((event) => {\r\n if (this.attachedNode) {\r\n this._handlePivot();\r\n // Keep world translation and use it to update world transform\r\n // if the node has parent, the local transform properties (position, rotation, scale)\r\n // will be recomputed in _matrixChanged function\r\n\r\n // Snapping logic\r\n if (this.snapDistance == 0) {\r\n this.attachedNode.getWorldMatrix().addTranslationFromFloats(event.delta.x, event.delta.y, event.delta.z);\r\n } else {\r\n currentSnapDragDistance += event.dragDistance;\r\n if (Math.abs(currentSnapDragDistance) > this.snapDistance) {\r\n const dragSteps = Math.floor(Math.abs(currentSnapDragDistance) / this.snapDistance);\r\n currentSnapDragDistance = currentSnapDragDistance % this.snapDistance;\r\n event.delta.normalizeToRef(tmpVector);\r\n tmpVector.scaleInPlace(this.snapDistance * dragSteps);\r\n this.attachedNode.getWorldMatrix().addTranslationFromFloats(tmpVector.x, tmpVector.y, tmpVector.z);\r\n tmpSnapEvent.snapDistance = this.snapDistance * dragSteps;\r\n this.onSnapObservable.notifyObservers(tmpSnapEvent);\r\n }\r\n }\r\n this._matrixChanged();\r\n }\r\n });\r\n this.dragBehavior.onDragStartObservable.add(() => {\r\n this._dragging = true;\r\n });\r\n this.dragBehavior.onDragEndObservable.add(() => {\r\n this._dragging = false;\r\n });\r\n\r\n const light = gizmoLayer._getSharedGizmoLight();\r\n light.includedOnlyMeshes = light.includedOnlyMeshes.concat(this._rootMesh.getChildMeshes(false));\r\n\r\n const cache: GizmoAxisCache = {\r\n gizmoMeshes: this._gizmoMesh.getChildMeshes() as Mesh[],\r\n colliderMeshes: this._gizmoMesh.getChildMeshes() as Mesh[],\r\n material: this._coloredMaterial,\r\n hoverMaterial: this._hoverMaterial,\r\n disableMaterial: this._disableMaterial,\r\n active: false,\r\n dragBehavior: this.dragBehavior,\r\n };\r\n this._parent?.addToAxisCache(this._gizmoMesh as Mesh, cache);\r\n\r\n this._pointerObserver = gizmoLayer.utilityLayerScene.onPointerObservable.add((pointerInfo) => {\r\n if (this._customMeshSet) {\r\n return;\r\n }\r\n this._isHovered = !!(cache.colliderMeshes.indexOf(<Mesh>pointerInfo?.pickInfo?.pickedMesh) != -1);\r\n if (!this._parent) {\r\n const material = cache.dragBehavior.enabled ? (this._isHovered || this._dragging ? this._hoverMaterial : this._coloredMaterial) : this._disableMaterial;\r\n this._setGizmoMeshMaterial(cache.gizmoMeshes, material);\r\n }\r\n });\r\n\r\n this.dragBehavior.onEnabledObservable.add((newState) => {\r\n this._setGizmoMeshMaterial(cache.gizmoMeshes, newState ? this._coloredMaterial : this._disableMaterial);\r\n });\r\n }\r\n protected _attachedNodeChanged(value: Nullable<Node>) {\r\n if (this.dragBehavior) {\r\n this.dragBehavior.enabled = value ? true : false;\r\n }\r\n }\r\n\r\n /**\r\n * If the gizmo is enabled\r\n */\r\n public set isEnabled(value: boolean) {\r\n this._isEnabled = value;\r\n if (!value) {\r\n this.attachedNode = null;\r\n } else {\r\n if (this._parent) {\r\n this.attachedNode = this._parent.attachedNode;\r\n }\r\n }\r\n }\r\n public get isEnabled(): boolean {\r\n return this._isEnabled;\r\n }\r\n /**\r\n * Disposes of the gizmo\r\n */\r\n public dispose() {\r\n this.onSnapObservable.clear();\r\n this.gizmoLayer.utilityLayerScene.onPointerObservable.remove(this._pointerObserver);\r\n this.dragBehavior.detach();\r\n super.dispose();\r\n if (this._gizmoMesh) {\r\n this._gizmoMesh.dispose();\r\n }\r\n [this._coloredMaterial, this._hoverMaterial, this._disableMaterial].forEach((matl) => {\r\n if (matl) {\r\n matl.dispose();\r\n }\r\n });\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"planeDragGizmo.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Gizmos/planeDragGizmo.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 { Vector3 } from \"../Maths/math.vector\";\r\nimport { Color3 } from \"../Maths/math.color\";\r\nimport { TransformNode } from \"../Meshes/transformNode\";\r\nimport type { Node } from \"../node\";\r\nimport type { Mesh } from \"../Meshes/mesh\";\r\nimport { CreatePlane } from \"../Meshes/Builders/planeBuilder\";\r\nimport { PointerDragBehavior } from \"../Behaviors/Meshes/pointerDragBehavior\";\r\nimport type { GizmoAxisCache } from \"./gizmo\";\r\nimport { Gizmo } from \"./gizmo\";\r\nimport { UtilityLayerRenderer } from \"../Rendering/utilityLayerRenderer\";\r\nimport { StandardMaterial } from \"../Materials/standardMaterial\";\r\nimport type { Scene } from \"../scene\";\r\nimport type { PositionGizmo } from \"./positionGizmo\";\r\n/**\r\n * Single plane drag gizmo\r\n */\r\nexport class PlaneDragGizmo extends Gizmo {\r\n /**\r\n * Drag behavior responsible for the gizmos dragging interactions\r\n */\r\n public dragBehavior: PointerDragBehavior;\r\n protected _pointerObserver: Nullable<Observer<PointerInfo>> = null;\r\n /**\r\n * Drag distance in babylon units that the gizmo will snap to when dragged (Default: 0)\r\n */\r\n public snapDistance = 0;\r\n /**\r\n * Event that fires each time the gizmo snaps to a new location.\r\n * * snapDistance is the the change in distance\r\n */\r\n public onSnapObservable = new Observable<{ snapDistance: number }>();\r\n\r\n protected _gizmoMesh: TransformNode;\r\n protected _coloredMaterial: StandardMaterial;\r\n protected _hoverMaterial: StandardMaterial;\r\n protected _disableMaterial: StandardMaterial;\r\n\r\n protected _isEnabled: boolean = false;\r\n protected _parent: Nullable<PositionGizmo> = null;\r\n protected _dragging: boolean = false;\r\n\r\n /**\r\n * @param scene\r\n * @param material\r\n * @hidden\r\n */\r\n public static _CreatePlane(scene: Scene, material: StandardMaterial): TransformNode {\r\n const plane = new TransformNode(\"plane\", scene);\r\n\r\n //make sure plane is double sided\r\n const dragPlane = CreatePlane(\"dragPlane\", { width: 0.1375, height: 0.1375, sideOrientation: 2 }, scene);\r\n dragPlane.material = material;\r\n dragPlane.parent = plane;\r\n return plane;\r\n }\r\n\r\n /**\r\n * Creates a PlaneDragGizmo\r\n * @param dragPlaneNormal The axis normal to which the gizmo will be able to drag on\r\n * @param color The color of the gizmo\r\n * @param gizmoLayer The utility layer the gizmo will be added to\r\n * @param parent\r\n */\r\n constructor(\r\n dragPlaneNormal: Vector3,\r\n color: Color3 = Color3.Gray(),\r\n gizmoLayer: UtilityLayerRenderer = UtilityLayerRenderer.DefaultUtilityLayer,\r\n parent: Nullable<PositionGizmo> = null\r\n ) {\r\n super(gizmoLayer);\r\n this._parent = parent;\r\n // Create Material\r\n this._coloredMaterial = new StandardMaterial(\"\", gizmoLayer.utilityLayerScene);\r\n this._coloredMaterial.diffuseColor = color;\r\n this._coloredMaterial.specularColor = color.subtract(new Color3(0.1, 0.1, 0.1));\r\n\r\n this._hoverMaterial = new StandardMaterial(\"\", gizmoLayer.utilityLayerScene);\r\n this._hoverMaterial.diffuseColor = Color3.Yellow();\r\n\r\n this._disableMaterial = new StandardMaterial(\"\", gizmoLayer.utilityLayerScene);\r\n this._disableMaterial.diffuseColor = Color3.Gray();\r\n this._disableMaterial.alpha = 0.4;\r\n\r\n // Build plane mesh on root node\r\n this._gizmoMesh = PlaneDragGizmo._CreatePlane(gizmoLayer.utilityLayerScene, this._coloredMaterial);\r\n\r\n this._gizmoMesh.lookAt(this._rootMesh.position.add(dragPlaneNormal));\r\n this._gizmoMesh.scaling.scaleInPlace(1 / 3);\r\n this._gizmoMesh.parent = this._rootMesh;\r\n\r\n let currentSnapDragDistance = 0;\r\n const tmpVector = new Vector3();\r\n const tmpSnapEvent = { snapDistance: 0 };\r\n // Add dragPlaneNormal drag behavior to handle events when the gizmo is dragged\r\n this.dragBehavior = new PointerDragBehavior({ dragPlaneNormal: dragPlaneNormal });\r\n this.dragBehavior.moveAttached = false;\r\n this._rootMesh.addBehavior(this.dragBehavior);\r\n\r\n this.dragBehavior.onDragObservable.add((event) => {\r\n if (this.attachedNode) {\r\n this._handlePivot();\r\n // Keep world translation and use it to update world transform\r\n // if the node has parent, the local transform properties (position, rotation, scale)\r\n // will be recomputed in _matrixChanged function\r\n\r\n // Snapping logic\r\n if (this.snapDistance == 0) {\r\n this.attachedNode.getWorldMatrix().addTranslationFromFloats(event.delta.x, event.delta.y, event.delta.z);\r\n } else {\r\n currentSnapDragDistance += event.dragDistance;\r\n if (Math.abs(currentSnapDragDistance) > this.snapDistance) {\r\n const dragSteps = Math.floor(Math.abs(currentSnapDragDistance) / this.snapDistance);\r\n currentSnapDragDistance = currentSnapDragDistance % this.snapDistance;\r\n event.delta.normalizeToRef(tmpVector);\r\n tmpVector.scaleInPlace(this.snapDistance * dragSteps);\r\n this.attachedNode.getWorldMatrix().addTranslationFromFloats(tmpVector.x, tmpVector.y, tmpVector.z);\r\n tmpSnapEvent.snapDistance = this.snapDistance * dragSteps;\r\n this.onSnapObservable.notifyObservers(tmpSnapEvent);\r\n }\r\n }\r\n this._matrixChanged();\r\n }\r\n });\r\n this.dragBehavior.onDragStartObservable.add(() => {\r\n this._dragging = true;\r\n });\r\n this.dragBehavior.onDragEndObservable.add(() => {\r\n this._dragging = false;\r\n });\r\n\r\n const light = gizmoLayer._getSharedGizmoLight();\r\n light.includedOnlyMeshes = light.includedOnlyMeshes.concat(this._rootMesh.getChildMeshes(false));\r\n\r\n const cache: GizmoAxisCache = {\r\n gizmoMeshes: this._gizmoMesh.getChildMeshes() as Mesh[],\r\n colliderMeshes: this._gizmoMesh.getChildMeshes() as Mesh[],\r\n material: this._coloredMaterial,\r\n hoverMaterial: this._hoverMaterial,\r\n disableMaterial: this._disableMaterial,\r\n active: false,\r\n dragBehavior: this.dragBehavior,\r\n };\r\n this._parent?.addToAxisCache(this._gizmoMesh as Mesh, cache);\r\n\r\n this._pointerObserver = gizmoLayer.utilityLayerScene.onPointerObservable.add((pointerInfo) => {\r\n if (this._customMeshSet) {\r\n return;\r\n }\r\n this._isHovered = !!(cache.colliderMeshes.indexOf(<Mesh>pointerInfo?.pickInfo?.pickedMesh) != -1);\r\n if (!this._parent) {\r\n const material = cache.dragBehavior.enabled ? (this._isHovered || this._dragging ? this._hoverMaterial : this._coloredMaterial) : this._disableMaterial;\r\n this._setGizmoMeshMaterial(cache.gizmoMeshes, material);\r\n }\r\n });\r\n\r\n this.dragBehavior.onEnabledObservable.add((newState) => {\r\n this._setGizmoMeshMaterial(cache.gizmoMeshes, newState ? this._coloredMaterial : this._disableMaterial);\r\n });\r\n }\r\n protected _attachedNodeChanged(value: Nullable<Node>) {\r\n if (this.dragBehavior) {\r\n this.dragBehavior.enabled = value ? true : false;\r\n }\r\n }\r\n\r\n /**\r\n * If the gizmo is enabled\r\n */\r\n public set isEnabled(value: boolean) {\r\n this._isEnabled = value;\r\n if (!value) {\r\n this.attachedNode = null;\r\n } else {\r\n if (this._parent) {\r\n this.attachedNode = this._parent.attachedNode;\r\n }\r\n }\r\n }\r\n public get isEnabled(): boolean {\r\n return this._isEnabled;\r\n }\r\n /**\r\n * Disposes of the gizmo\r\n */\r\n public dispose() {\r\n this.onSnapObservable.clear();\r\n this.gizmoLayer.utilityLayerScene.onPointerObservable.remove(this._pointerObserver);\r\n this.dragBehavior.detach();\r\n super.dispose();\r\n if (this._gizmoMesh) {\r\n this._gizmoMesh.dispose();\r\n }\r\n [this._coloredMaterial, this._hoverMaterial, this._disableMaterial].forEach((matl) => {\r\n if (matl) {\r\n matl.dispose();\r\n }\r\n });\r\n }\r\n}\r\n"]}
@@ -1,13 +1,19 @@
1
+ import type { Observer } from "../Misc/observable";
1
2
  import { Observable } from "../Misc/observable";
2
3
  import type { Nullable } from "../types";
4
+ import type { PointerInfo } from "../Events/pointerEvents";
3
5
  import { Vector3 } from "../Maths/math.vector";
4
6
  import { Color3 } from "../Maths/math.color";
5
7
  import "../Meshes/Builders/linesBuilder";
8
+ import type { AbstractMesh } from "../Meshes/abstractMesh";
9
+ import { Mesh } from "../Meshes/mesh";
6
10
  import type { Node } from "../node";
7
11
  import { PointerDragBehavior } from "../Behaviors/Meshes/pointerDragBehavior";
8
12
  import { Gizmo } from "./gizmo";
9
13
  import { UtilityLayerRenderer } from "../Rendering/utilityLayerRenderer";
14
+ import { StandardMaterial } from "../Materials/standardMaterial";
10
15
  import type { RotationGizmo } from "./rotationGizmo";
16
+ import { ShaderMaterial } from "../Materials/shaderMaterial";
11
17
  /**
12
18
  * Single plane rotation gizmo
13
19
  */
@@ -16,7 +22,7 @@ export declare class PlaneRotationGizmo extends Gizmo {
16
22
  * Drag behavior responsible for the gizmos dragging interactions
17
23
  */
18
24
  dragBehavior: PointerDragBehavior;
19
- private _pointerObserver;
25
+ protected _pointerObserver: Nullable<Observer<PointerInfo>>;
20
26
  /**
21
27
  * Rotation distance in radians that the gizmo will snap to (Default: 0)
22
28
  */
@@ -37,18 +43,18 @@ export declare class PlaneRotationGizmo extends Gizmo {
37
43
  * Accumulated relative angle value for rotation on the axis. Reset to 0 when a dragStart occurs
38
44
  */
39
45
  angle: number;
40
- private _isEnabled;
41
- private _parent;
42
- private _coloredMaterial;
43
- private _hoverMaterial;
44
- private _disableMaterial;
45
- private _gizmoMesh;
46
- private _rotationDisplayPlane;
47
- private _dragging;
48
- private _angles;
49
- private static _RotationGizmoVertexShader;
50
- private static _RotationGizmoFragmentShader;
51
- private _rotationShaderMaterial;
46
+ protected _isEnabled: boolean;
47
+ protected _parent: Nullable<RotationGizmo>;
48
+ protected _coloredMaterial: StandardMaterial;
49
+ protected _hoverMaterial: StandardMaterial;
50
+ protected _disableMaterial: StandardMaterial;
51
+ protected _gizmoMesh: Mesh;
52
+ protected _rotationDisplayPlane: Mesh;
53
+ protected _dragging: boolean;
54
+ protected _angles: Vector3;
55
+ protected static _RotationGizmoVertexShader: string;
56
+ protected static _RotationGizmoFragmentShader: string;
57
+ protected _rotationShaderMaterial: ShaderMaterial;
52
58
  /**
53
59
  * Creates a PlaneRotationGizmo
54
60
  * @param planeNormal The normal of the plane which the gizmo will be able to rotate on
@@ -66,7 +72,10 @@ export declare class PlaneRotationGizmo extends Gizmo {
66
72
  * @param thickness
67
73
  * @param tessellation
68
74
  */
69
- private _createGizmoMesh;
75
+ protected _createGizmoMesh(parentMesh: AbstractMesh, thickness: number, tessellation: number): {
76
+ rotationMesh: Mesh;
77
+ collider: Mesh;
78
+ };
70
79
  protected _attachedNodeChanged(value: Nullable<Node>): void;
71
80
  /**
72
81
  * If the gizmo is enabled
@@ -1 +1 @@
1
- {"version":3,"file":"planeRotationGizmo.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Gizmos/planeRotationGizmo.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 { Quaternion, Matrix, Vector3 } from \"../Maths/math.vector\";\r\nimport { Color3 } from \"../Maths/math.color\";\r\nimport \"../Meshes/Builders/linesBuilder\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\nimport type { Node } from \"../node\";\r\nimport { PointerDragBehavior } from \"../Behaviors/Meshes/pointerDragBehavior\";\r\nimport type { GizmoAxisCache } from \"./gizmo\";\r\nimport { Gizmo } from \"./gizmo\";\r\nimport { UtilityLayerRenderer } from \"../Rendering/utilityLayerRenderer\";\r\nimport { StandardMaterial } from \"../Materials/standardMaterial\";\r\nimport type { RotationGizmo } from \"./rotationGizmo\";\r\nimport { ShaderMaterial } from \"../Materials/shaderMaterial\";\r\nimport { Effect } from \"../Materials/effect\";\r\nimport { CreatePlane } from \"../Meshes/Builders/planeBuilder\";\r\nimport { CreateTorus } from \"../Meshes/Builders/torusBuilder\";\r\n\r\n/**\r\n * Single plane rotation gizmo\r\n */\r\nexport class PlaneRotationGizmo extends Gizmo {\r\n /**\r\n * Drag behavior responsible for the gizmos dragging interactions\r\n */\r\n public dragBehavior: PointerDragBehavior;\r\n private _pointerObserver: Nullable<Observer<PointerInfo>> = null;\r\n\r\n /**\r\n * Rotation distance in radians that the gizmo will snap to (Default: 0)\r\n */\r\n public snapDistance = 0;\r\n /**\r\n * Event that fires each time the gizmo snaps to a new location.\r\n * * snapDistance is the the change in distance\r\n */\r\n public onSnapObservable = new Observable<{ snapDistance: number }>();\r\n\r\n /**\r\n * The maximum angle between the camera and the rotation allowed for interaction\r\n * If a rotation plane appears 'flat', a lower value allows interaction.\r\n */\r\n public static MaxDragAngle: number = (Math.PI * 9) / 20;\r\n\r\n /**\r\n * Accumulated relative angle value for rotation on the axis. Reset to 0 when a dragStart occurs\r\n */\r\n public angle: number = 0;\r\n\r\n private _isEnabled: boolean = true;\r\n private _parent: Nullable<RotationGizmo> = null;\r\n private _coloredMaterial: StandardMaterial;\r\n private _hoverMaterial: StandardMaterial;\r\n private _disableMaterial: StandardMaterial;\r\n private _gizmoMesh: Mesh;\r\n private _rotationDisplayPlane: Mesh;\r\n private _dragging: boolean = false;\r\n private _angles = new Vector3();\r\n\r\n private static _RotationGizmoVertexShader = `\r\n precision highp float;\r\n attribute vec3 position;\r\n attribute vec2 uv;\r\n uniform mat4 worldViewProjection;\r\n varying vec3 vPosition;\r\n varying vec2 vUV;\r\n void main(void) {\r\n gl_Position = worldViewProjection * vec4(position, 1.0);\r\n vUV = uv;\r\n }`;\r\n\r\n private static _RotationGizmoFragmentShader = `\r\n precision highp float;\r\n varying vec2 vUV;\r\n varying vec3 vPosition;\r\n uniform vec3 angles;\r\n #define twopi 6.283185307\r\n void main(void) {\r\n vec2 uv = vUV - vec2(0.5);\r\n float angle = atan(uv.y, uv.x) + 3.141592;\r\n float delta = gl_FrontFacing ? angles.y : -angles.y;\r\n float begin = angles.x - delta * angles.z;\r\n float start = (begin < (begin + delta)) ? begin : (begin + delta);\r\n float end = (begin > (begin + delta)) ? begin : (begin + delta);\r\n float len = sqrt(dot(uv,uv));\r\n float opacity = 1. - step(0.5, len);\r\n\r\n float base = abs(floor(start / twopi)) * twopi;\r\n start += base;\r\n end += base;\r\n\r\n float intensity = 0.;\r\n for (int i = 0; i < 5; i++)\r\n {\r\n intensity += max(step(start, angle) - step(end, angle), 0.);\r\n angle += twopi;\r\n }\r\n gl_FragColor = vec4(1.,1.,0., min(intensity * 0.25, 0.8)) * opacity;\r\n }`;\r\n\r\n private _rotationShaderMaterial: ShaderMaterial;\r\n\r\n /**\r\n * Creates a PlaneRotationGizmo\r\n * @param planeNormal The normal of the plane which the gizmo will be able to rotate on\r\n * @param color The color of the gizmo\r\n * @param gizmoLayer The utility layer the gizmo will be added to\r\n * @param tessellation Amount of tessellation to be used when creating rotation circles\r\n * @param parent\r\n * @param useEulerRotation Use and update Euler angle instead of quaternion\r\n * @param thickness display gizmo axis thickness\r\n */\r\n constructor(\r\n planeNormal: Vector3,\r\n color: Color3 = Color3.Gray(),\r\n gizmoLayer: UtilityLayerRenderer = UtilityLayerRenderer.DefaultUtilityLayer,\r\n tessellation = 32,\r\n parent: Nullable<RotationGizmo> = null,\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n useEulerRotation = false,\r\n thickness: number = 1\r\n ) {\r\n super(gizmoLayer);\r\n this._parent = parent;\r\n // Create Material\r\n this._coloredMaterial = new StandardMaterial(\"\", gizmoLayer.utilityLayerScene);\r\n this._coloredMaterial.diffuseColor = color;\r\n this._coloredMaterial.specularColor = color.subtract(new Color3(0.1, 0.1, 0.1));\r\n\r\n this._hoverMaterial = new StandardMaterial(\"\", gizmoLayer.utilityLayerScene);\r\n this._hoverMaterial.diffuseColor = Color3.Yellow();\r\n\r\n this._disableMaterial = new StandardMaterial(\"\", gizmoLayer.utilityLayerScene);\r\n this._disableMaterial.diffuseColor = Color3.Gray();\r\n this._disableMaterial.alpha = 0.4;\r\n\r\n // Build mesh on root node\r\n this._gizmoMesh = new Mesh(\"\", gizmoLayer.utilityLayerScene);\r\n const { rotationMesh, collider } = this._createGizmoMesh(this._gizmoMesh, thickness, tessellation);\r\n\r\n // Setup Rotation Circle\r\n this._rotationDisplayPlane = CreatePlane(\"rotationDisplay\", { size: 0.6, updatable: false }, this.gizmoLayer.utilityLayerScene);\r\n this._rotationDisplayPlane.rotation.z = Math.PI * 0.5;\r\n this._rotationDisplayPlane.parent = this._gizmoMesh;\r\n this._rotationDisplayPlane.setEnabled(false);\r\n\r\n Effect.ShadersStore[\"rotationGizmoVertexShader\"] = PlaneRotationGizmo._RotationGizmoVertexShader;\r\n Effect.ShadersStore[\"rotationGizmoFragmentShader\"] = PlaneRotationGizmo._RotationGizmoFragmentShader;\r\n this._rotationShaderMaterial = new ShaderMaterial(\r\n \"shader\",\r\n this.gizmoLayer.utilityLayerScene,\r\n {\r\n vertex: \"rotationGizmo\",\r\n fragment: \"rotationGizmo\",\r\n },\r\n {\r\n attributes: [\"position\", \"uv\"],\r\n uniforms: [\"worldViewProjection\", \"angles\"],\r\n }\r\n );\r\n this._rotationShaderMaterial.backFaceCulling = false;\r\n\r\n this._rotationDisplayPlane.material = this._rotationShaderMaterial;\r\n this._rotationDisplayPlane.visibility = 0.999;\r\n\r\n this._gizmoMesh.lookAt(this._rootMesh.position.add(planeNormal));\r\n this._rootMesh.addChild(this._gizmoMesh, Gizmo.PreserveScaling);\r\n this._gizmoMesh.scaling.scaleInPlace(1 / 3);\r\n // Add drag behavior to handle events when the gizmo is dragged\r\n this.dragBehavior = new PointerDragBehavior({ dragPlaneNormal: planeNormal });\r\n this.dragBehavior.moveAttached = false;\r\n this.dragBehavior.maxDragAngle = PlaneRotationGizmo.MaxDragAngle;\r\n this.dragBehavior._useAlternatePickedPointAboveMaxDragAngle = true;\r\n this._rootMesh.addBehavior(this.dragBehavior);\r\n\r\n // Closures for drag logic\r\n const lastDragPosition = new Vector3();\r\n\r\n const rotationMatrix = new Matrix();\r\n const planeNormalTowardsCamera = new Vector3();\r\n let localPlaneNormalTowardsCamera = new Vector3();\r\n\r\n this.dragBehavior.onDragStartObservable.add((e) => {\r\n if (this.attachedNode) {\r\n lastDragPosition.copyFrom(e.dragPlanePoint);\r\n this._rotationDisplayPlane.setEnabled(true);\r\n\r\n this._rotationDisplayPlane.getWorldMatrix().invertToRef(rotationMatrix);\r\n Vector3.TransformCoordinatesToRef(e.dragPlanePoint, rotationMatrix, lastDragPosition);\r\n\r\n this._angles.x = Math.atan2(lastDragPosition.y, lastDragPosition.x) + Math.PI;\r\n this._angles.y = 0;\r\n this._angles.z = this.updateGizmoRotationToMatchAttachedMesh ? 1 : 0;\r\n this._dragging = true;\r\n lastDragPosition.copyFrom(e.dragPlanePoint);\r\n this._rotationShaderMaterial.setVector3(\"angles\", this._angles);\r\n this.angle = 0;\r\n }\r\n });\r\n\r\n this.dragBehavior.onDragEndObservable.add(() => {\r\n this._dragging = false;\r\n this._rotationDisplayPlane.setEnabled(false);\r\n });\r\n\r\n const tmpSnapEvent = { snapDistance: 0 };\r\n let currentSnapDragDistance = 0;\r\n const tmpMatrix = new Matrix();\r\n const amountToRotate = new Quaternion();\r\n this.dragBehavior.onDragObservable.add((event) => {\r\n if (this.attachedNode) {\r\n // Calc angle over full 360 degree (https://stackoverflow.com/questions/43493711/the-angle-between-two-3d-vectors-with-a-result-range-0-360)\r\n const nodeScale = new Vector3(1, 1, 1);\r\n const nodeQuaternion = new Quaternion(0, 0, 0, 1);\r\n const nodeTranslation = new Vector3(0, 0, 0);\r\n this._handlePivot();\r\n this.attachedNode.getWorldMatrix().decompose(nodeScale, nodeQuaternion, nodeTranslation);\r\n\r\n const newVector = event.dragPlanePoint.subtract(nodeTranslation).normalize();\r\n const originalVector = lastDragPosition.subtract(nodeTranslation).normalize();\r\n const cross = Vector3.Cross(newVector, originalVector);\r\n const dot = Vector3.Dot(newVector, originalVector);\r\n let angle = Math.atan2(cross.length(), dot);\r\n planeNormalTowardsCamera.copyFrom(planeNormal);\r\n localPlaneNormalTowardsCamera.copyFrom(planeNormal);\r\n if (this.updateGizmoRotationToMatchAttachedMesh) {\r\n nodeQuaternion.toRotationMatrix(rotationMatrix);\r\n localPlaneNormalTowardsCamera = Vector3.TransformCoordinates(planeNormalTowardsCamera, rotationMatrix);\r\n }\r\n // Flip up vector depending on which side the camera is on\r\n let cameraFlipped = false;\r\n if (gizmoLayer.utilityLayerScene.activeCamera) {\r\n const camVec = gizmoLayer.utilityLayerScene.activeCamera.position.subtract(nodeTranslation).normalize();\r\n if (Vector3.Dot(camVec, localPlaneNormalTowardsCamera) > 0) {\r\n planeNormalTowardsCamera.scaleInPlace(-1);\r\n localPlaneNormalTowardsCamera.scaleInPlace(-1);\r\n cameraFlipped = true;\r\n }\r\n }\r\n const halfCircleSide = Vector3.Dot(localPlaneNormalTowardsCamera, cross) > 0.0;\r\n if (halfCircleSide) {\r\n angle = -angle;\r\n }\r\n\r\n // Snapping logic\r\n let snapped = false;\r\n if (this.snapDistance != 0) {\r\n currentSnapDragDistance += angle;\r\n if (Math.abs(currentSnapDragDistance) > this.snapDistance) {\r\n let dragSteps = Math.floor(Math.abs(currentSnapDragDistance) / this.snapDistance);\r\n if (currentSnapDragDistance < 0) {\r\n dragSteps *= -1;\r\n }\r\n currentSnapDragDistance = currentSnapDragDistance % this.snapDistance;\r\n angle = this.snapDistance * dragSteps;\r\n snapped = true;\r\n } else {\r\n angle = 0;\r\n }\r\n }\r\n\r\n // Convert angle and axis to quaternion (http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm)\r\n const quaternionCoefficient = Math.sin(angle / 2);\r\n amountToRotate.set(\r\n planeNormalTowardsCamera.x * quaternionCoefficient,\r\n planeNormalTowardsCamera.y * quaternionCoefficient,\r\n planeNormalTowardsCamera.z * quaternionCoefficient,\r\n Math.cos(angle / 2)\r\n );\r\n\r\n // If the meshes local scale is inverted (eg. loaded gltf file parent with z scale of -1) the rotation needs to be inverted on the y axis\r\n if (tmpMatrix.determinant() > 0) {\r\n const tmpVector = new Vector3();\r\n amountToRotate.toEulerAnglesToRef(tmpVector);\r\n Quaternion.RotationYawPitchRollToRef(tmpVector.y, -tmpVector.x, -tmpVector.z, amountToRotate);\r\n }\r\n\r\n if (this.updateGizmoRotationToMatchAttachedMesh) {\r\n // Rotate selected mesh quaternion over fixed axis\r\n nodeQuaternion.multiplyToRef(amountToRotate, nodeQuaternion);\r\n } else {\r\n // Rotate selected mesh quaternion over rotated axis\r\n amountToRotate.multiplyToRef(nodeQuaternion, nodeQuaternion);\r\n }\r\n\r\n // recompose matrix\r\n this.attachedNode.getWorldMatrix().copyFrom(Matrix.Compose(nodeScale, nodeQuaternion, nodeTranslation));\r\n\r\n lastDragPosition.copyFrom(event.dragPlanePoint);\r\n if (snapped) {\r\n tmpSnapEvent.snapDistance = angle;\r\n this.onSnapObservable.notifyObservers(tmpSnapEvent);\r\n }\r\n this._angles.y += angle;\r\n this.angle += cameraFlipped ? -angle : angle;\r\n this._rotationShaderMaterial.setVector3(\"angles\", this._angles);\r\n this._matrixChanged();\r\n }\r\n });\r\n\r\n const light = gizmoLayer._getSharedGizmoLight();\r\n light.includedOnlyMeshes = light.includedOnlyMeshes.concat(this._rootMesh.getChildMeshes(false));\r\n\r\n const cache: GizmoAxisCache = {\r\n colliderMeshes: [collider],\r\n gizmoMeshes: [rotationMesh],\r\n material: this._coloredMaterial,\r\n hoverMaterial: this._hoverMaterial,\r\n disableMaterial: this._disableMaterial,\r\n active: false,\r\n dragBehavior: this.dragBehavior,\r\n };\r\n this._parent?.addToAxisCache(this._gizmoMesh, cache);\r\n\r\n this._pointerObserver = gizmoLayer.utilityLayerScene.onPointerObservable.add((pointerInfo) => {\r\n if (this._customMeshSet) {\r\n return;\r\n }\r\n // updating here the maxangle because ondragstart is too late (value already used) and the updated value is not taken into account\r\n this.dragBehavior.maxDragAngle = PlaneRotationGizmo.MaxDragAngle;\r\n this._isHovered = !!(cache.colliderMeshes.indexOf(<Mesh>pointerInfo?.pickInfo?.pickedMesh) != -1);\r\n if (!this._parent) {\r\n const material = cache.dragBehavior.enabled ? (this._isHovered || this._dragging ? this._hoverMaterial : this._coloredMaterial) : this._disableMaterial;\r\n this._setGizmoMeshMaterial(cache.gizmoMeshes, material);\r\n }\r\n });\r\n\r\n this.dragBehavior.onEnabledObservable.add((newState) => {\r\n this._setGizmoMeshMaterial(cache.gizmoMeshes, newState ? this._coloredMaterial : this._disableMaterial);\r\n });\r\n }\r\n\r\n /**\r\n * Create Geometry for Gizmo\r\n * @param parentMesh\r\n * @param thickness\r\n * @param tessellation\r\n */\r\n private _createGizmoMesh(parentMesh: AbstractMesh, thickness: number, tessellation: number) {\r\n const collider = CreateTorus(\r\n \"ignore\",\r\n {\r\n diameter: 0.6,\r\n thickness: 0.03 * thickness,\r\n tessellation,\r\n },\r\n this.gizmoLayer.utilityLayerScene\r\n );\r\n collider.visibility = 0;\r\n const rotationMesh = CreateTorus(\r\n \"\",\r\n {\r\n diameter: 0.6,\r\n thickness: 0.005 * thickness,\r\n tessellation,\r\n },\r\n this.gizmoLayer.utilityLayerScene\r\n );\r\n rotationMesh.material = this._coloredMaterial;\r\n\r\n // Position arrow pointing in its drag axis\r\n rotationMesh.rotation.x = Math.PI / 2;\r\n collider.rotation.x = Math.PI / 2;\r\n\r\n parentMesh.addChild(rotationMesh, Gizmo.PreserveScaling);\r\n parentMesh.addChild(collider, Gizmo.PreserveScaling);\r\n return { rotationMesh, collider };\r\n }\r\n\r\n protected _attachedNodeChanged(value: Nullable<Node>) {\r\n if (this.dragBehavior) {\r\n this.dragBehavior.enabled = value ? true : false;\r\n }\r\n }\r\n\r\n /**\r\n * If the gizmo is enabled\r\n */\r\n public set isEnabled(value: boolean) {\r\n this._isEnabled = value;\r\n if (!value) {\r\n this.attachedMesh = null;\r\n } else {\r\n if (this._parent) {\r\n this.attachedMesh = this._parent.attachedMesh;\r\n }\r\n }\r\n }\r\n public get isEnabled(): boolean {\r\n return this._isEnabled;\r\n }\r\n /**\r\n * Disposes of the gizmo\r\n */\r\n public dispose() {\r\n this.onSnapObservable.clear();\r\n this.gizmoLayer.utilityLayerScene.onPointerObservable.remove(this._pointerObserver);\r\n this.dragBehavior.detach();\r\n if (this._gizmoMesh) {\r\n this._gizmoMesh.dispose();\r\n }\r\n if (this._rotationDisplayPlane) {\r\n this._rotationDisplayPlane.dispose();\r\n }\r\n if (this._rotationShaderMaterial) {\r\n this._rotationShaderMaterial.dispose();\r\n }\r\n [this._coloredMaterial, this._hoverMaterial, this._disableMaterial].forEach((matl) => {\r\n if (matl) {\r\n matl.dispose();\r\n }\r\n });\r\n super.dispose();\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"planeRotationGizmo.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Gizmos/planeRotationGizmo.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 { Quaternion, Matrix, Vector3 } from \"../Maths/math.vector\";\r\nimport { Color3 } from \"../Maths/math.color\";\r\nimport \"../Meshes/Builders/linesBuilder\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\nimport type { Node } from \"../node\";\r\nimport { PointerDragBehavior } from \"../Behaviors/Meshes/pointerDragBehavior\";\r\nimport type { GizmoAxisCache } from \"./gizmo\";\r\nimport { Gizmo } from \"./gizmo\";\r\nimport { UtilityLayerRenderer } from \"../Rendering/utilityLayerRenderer\";\r\nimport { StandardMaterial } from \"../Materials/standardMaterial\";\r\nimport type { RotationGizmo } from \"./rotationGizmo\";\r\nimport { ShaderMaterial } from \"../Materials/shaderMaterial\";\r\nimport { Effect } from \"../Materials/effect\";\r\nimport { CreatePlane } from \"../Meshes/Builders/planeBuilder\";\r\nimport { CreateTorus } from \"../Meshes/Builders/torusBuilder\";\r\n\r\n/**\r\n * Single plane rotation gizmo\r\n */\r\nexport class PlaneRotationGizmo extends Gizmo {\r\n /**\r\n * Drag behavior responsible for the gizmos dragging interactions\r\n */\r\n public dragBehavior: PointerDragBehavior;\r\n protected _pointerObserver: Nullable<Observer<PointerInfo>> = null;\r\n\r\n /**\r\n * Rotation distance in radians that the gizmo will snap to (Default: 0)\r\n */\r\n public snapDistance = 0;\r\n /**\r\n * Event that fires each time the gizmo snaps to a new location.\r\n * * snapDistance is the the change in distance\r\n */\r\n public onSnapObservable = new Observable<{ snapDistance: number }>();\r\n\r\n /**\r\n * The maximum angle between the camera and the rotation allowed for interaction\r\n * If a rotation plane appears 'flat', a lower value allows interaction.\r\n */\r\n public static MaxDragAngle: number = (Math.PI * 9) / 20;\r\n\r\n /**\r\n * Accumulated relative angle value for rotation on the axis. Reset to 0 when a dragStart occurs\r\n */\r\n public angle: number = 0;\r\n\r\n protected _isEnabled: boolean = true;\r\n protected _parent: Nullable<RotationGizmo> = null;\r\n protected _coloredMaterial: StandardMaterial;\r\n protected _hoverMaterial: StandardMaterial;\r\n protected _disableMaterial: StandardMaterial;\r\n protected _gizmoMesh: Mesh;\r\n protected _rotationDisplayPlane: Mesh;\r\n protected _dragging: boolean = false;\r\n protected _angles = new Vector3();\r\n\r\n protected static _RotationGizmoVertexShader = `\r\n precision highp float;\r\n attribute vec3 position;\r\n attribute vec2 uv;\r\n uniform mat4 worldViewProjection;\r\n varying vec3 vPosition;\r\n varying vec2 vUV;\r\n void main(void) {\r\n gl_Position = worldViewProjection * vec4(position, 1.0);\r\n vUV = uv;\r\n }`;\r\n\r\n protected static _RotationGizmoFragmentShader = `\r\n precision highp float;\r\n varying vec2 vUV;\r\n varying vec3 vPosition;\r\n uniform vec3 angles;\r\n #define twopi 6.283185307\r\n void main(void) {\r\n vec2 uv = vUV - vec2(0.5);\r\n float angle = atan(uv.y, uv.x) + 3.141592;\r\n float delta = gl_FrontFacing ? angles.y : -angles.y;\r\n float begin = angles.x - delta * angles.z;\r\n float start = (begin < (begin + delta)) ? begin : (begin + delta);\r\n float end = (begin > (begin + delta)) ? begin : (begin + delta);\r\n float len = sqrt(dot(uv,uv));\r\n float opacity = 1. - step(0.5, len);\r\n\r\n float base = abs(floor(start / twopi)) * twopi;\r\n start += base;\r\n end += base;\r\n\r\n float intensity = 0.;\r\n for (int i = 0; i < 5; i++)\r\n {\r\n intensity += max(step(start, angle) - step(end, angle), 0.);\r\n angle += twopi;\r\n }\r\n gl_FragColor = vec4(1.,1.,0., min(intensity * 0.25, 0.8)) * opacity;\r\n }`;\r\n\r\n protected _rotationShaderMaterial: ShaderMaterial;\r\n\r\n /**\r\n * Creates a PlaneRotationGizmo\r\n * @param planeNormal The normal of the plane which the gizmo will be able to rotate on\r\n * @param color The color of the gizmo\r\n * @param gizmoLayer The utility layer the gizmo will be added to\r\n * @param tessellation Amount of tessellation to be used when creating rotation circles\r\n * @param parent\r\n * @param useEulerRotation Use and update Euler angle instead of quaternion\r\n * @param thickness display gizmo axis thickness\r\n */\r\n constructor(\r\n planeNormal: Vector3,\r\n color: Color3 = Color3.Gray(),\r\n gizmoLayer: UtilityLayerRenderer = UtilityLayerRenderer.DefaultUtilityLayer,\r\n tessellation = 32,\r\n parent: Nullable<RotationGizmo> = null,\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n useEulerRotation = false,\r\n thickness: number = 1\r\n ) {\r\n super(gizmoLayer);\r\n this._parent = parent;\r\n // Create Material\r\n this._coloredMaterial = new StandardMaterial(\"\", gizmoLayer.utilityLayerScene);\r\n this._coloredMaterial.diffuseColor = color;\r\n this._coloredMaterial.specularColor = color.subtract(new Color3(0.1, 0.1, 0.1));\r\n\r\n this._hoverMaterial = new StandardMaterial(\"\", gizmoLayer.utilityLayerScene);\r\n this._hoverMaterial.diffuseColor = Color3.Yellow();\r\n\r\n this._disableMaterial = new StandardMaterial(\"\", gizmoLayer.utilityLayerScene);\r\n this._disableMaterial.diffuseColor = Color3.Gray();\r\n this._disableMaterial.alpha = 0.4;\r\n\r\n // Build mesh on root node\r\n this._gizmoMesh = new Mesh(\"\", gizmoLayer.utilityLayerScene);\r\n const { rotationMesh, collider } = this._createGizmoMesh(this._gizmoMesh, thickness, tessellation);\r\n\r\n // Setup Rotation Circle\r\n this._rotationDisplayPlane = CreatePlane(\"rotationDisplay\", { size: 0.6, updatable: false }, this.gizmoLayer.utilityLayerScene);\r\n this._rotationDisplayPlane.rotation.z = Math.PI * 0.5;\r\n this._rotationDisplayPlane.parent = this._gizmoMesh;\r\n this._rotationDisplayPlane.setEnabled(false);\r\n\r\n Effect.ShadersStore[\"rotationGizmoVertexShader\"] = PlaneRotationGizmo._RotationGizmoVertexShader;\r\n Effect.ShadersStore[\"rotationGizmoFragmentShader\"] = PlaneRotationGizmo._RotationGizmoFragmentShader;\r\n this._rotationShaderMaterial = new ShaderMaterial(\r\n \"shader\",\r\n this.gizmoLayer.utilityLayerScene,\r\n {\r\n vertex: \"rotationGizmo\",\r\n fragment: \"rotationGizmo\",\r\n },\r\n {\r\n attributes: [\"position\", \"uv\"],\r\n uniforms: [\"worldViewProjection\", \"angles\"],\r\n }\r\n );\r\n this._rotationShaderMaterial.backFaceCulling = false;\r\n\r\n this._rotationDisplayPlane.material = this._rotationShaderMaterial;\r\n this._rotationDisplayPlane.visibility = 0.999;\r\n\r\n this._gizmoMesh.lookAt(this._rootMesh.position.add(planeNormal));\r\n this._rootMesh.addChild(this._gizmoMesh, Gizmo.PreserveScaling);\r\n this._gizmoMesh.scaling.scaleInPlace(1 / 3);\r\n // Add drag behavior to handle events when the gizmo is dragged\r\n this.dragBehavior = new PointerDragBehavior({ dragPlaneNormal: planeNormal });\r\n this.dragBehavior.moveAttached = false;\r\n this.dragBehavior.maxDragAngle = PlaneRotationGizmo.MaxDragAngle;\r\n this.dragBehavior._useAlternatePickedPointAboveMaxDragAngle = true;\r\n this._rootMesh.addBehavior(this.dragBehavior);\r\n\r\n // Closures for drag logic\r\n const lastDragPosition = new Vector3();\r\n\r\n const rotationMatrix = new Matrix();\r\n const planeNormalTowardsCamera = new Vector3();\r\n let localPlaneNormalTowardsCamera = new Vector3();\r\n\r\n this.dragBehavior.onDragStartObservable.add((e) => {\r\n if (this.attachedNode) {\r\n lastDragPosition.copyFrom(e.dragPlanePoint);\r\n this._rotationDisplayPlane.setEnabled(true);\r\n\r\n this._rotationDisplayPlane.getWorldMatrix().invertToRef(rotationMatrix);\r\n Vector3.TransformCoordinatesToRef(e.dragPlanePoint, rotationMatrix, lastDragPosition);\r\n\r\n this._angles.x = Math.atan2(lastDragPosition.y, lastDragPosition.x) + Math.PI;\r\n this._angles.y = 0;\r\n this._angles.z = this.updateGizmoRotationToMatchAttachedMesh ? 1 : 0;\r\n this._dragging = true;\r\n lastDragPosition.copyFrom(e.dragPlanePoint);\r\n this._rotationShaderMaterial.setVector3(\"angles\", this._angles);\r\n this.angle = 0;\r\n }\r\n });\r\n\r\n this.dragBehavior.onDragEndObservable.add(() => {\r\n this._dragging = false;\r\n this._rotationDisplayPlane.setEnabled(false);\r\n });\r\n\r\n const tmpSnapEvent = { snapDistance: 0 };\r\n let currentSnapDragDistance = 0;\r\n const tmpMatrix = new Matrix();\r\n const amountToRotate = new Quaternion();\r\n this.dragBehavior.onDragObservable.add((event) => {\r\n if (this.attachedNode) {\r\n // Calc angle over full 360 degree (https://stackoverflow.com/questions/43493711/the-angle-between-two-3d-vectors-with-a-result-range-0-360)\r\n const nodeScale = new Vector3(1, 1, 1);\r\n const nodeQuaternion = new Quaternion(0, 0, 0, 1);\r\n const nodeTranslation = new Vector3(0, 0, 0);\r\n this._handlePivot();\r\n this.attachedNode.getWorldMatrix().decompose(nodeScale, nodeQuaternion, nodeTranslation);\r\n\r\n const newVector = event.dragPlanePoint.subtract(nodeTranslation).normalize();\r\n const originalVector = lastDragPosition.subtract(nodeTranslation).normalize();\r\n const cross = Vector3.Cross(newVector, originalVector);\r\n const dot = Vector3.Dot(newVector, originalVector);\r\n let angle = Math.atan2(cross.length(), dot);\r\n planeNormalTowardsCamera.copyFrom(planeNormal);\r\n localPlaneNormalTowardsCamera.copyFrom(planeNormal);\r\n if (this.updateGizmoRotationToMatchAttachedMesh) {\r\n nodeQuaternion.toRotationMatrix(rotationMatrix);\r\n localPlaneNormalTowardsCamera = Vector3.TransformCoordinates(planeNormalTowardsCamera, rotationMatrix);\r\n }\r\n // Flip up vector depending on which side the camera is on\r\n let cameraFlipped = false;\r\n if (gizmoLayer.utilityLayerScene.activeCamera) {\r\n const camVec = gizmoLayer.utilityLayerScene.activeCamera.position.subtract(nodeTranslation).normalize();\r\n if (Vector3.Dot(camVec, localPlaneNormalTowardsCamera) > 0) {\r\n planeNormalTowardsCamera.scaleInPlace(-1);\r\n localPlaneNormalTowardsCamera.scaleInPlace(-1);\r\n cameraFlipped = true;\r\n }\r\n }\r\n const halfCircleSide = Vector3.Dot(localPlaneNormalTowardsCamera, cross) > 0.0;\r\n if (halfCircleSide) {\r\n angle = -angle;\r\n }\r\n\r\n // Snapping logic\r\n let snapped = false;\r\n if (this.snapDistance != 0) {\r\n currentSnapDragDistance += angle;\r\n if (Math.abs(currentSnapDragDistance) > this.snapDistance) {\r\n let dragSteps = Math.floor(Math.abs(currentSnapDragDistance) / this.snapDistance);\r\n if (currentSnapDragDistance < 0) {\r\n dragSteps *= -1;\r\n }\r\n currentSnapDragDistance = currentSnapDragDistance % this.snapDistance;\r\n angle = this.snapDistance * dragSteps;\r\n snapped = true;\r\n } else {\r\n angle = 0;\r\n }\r\n }\r\n\r\n // Convert angle and axis to quaternion (http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm)\r\n const quaternionCoefficient = Math.sin(angle / 2);\r\n amountToRotate.set(\r\n planeNormalTowardsCamera.x * quaternionCoefficient,\r\n planeNormalTowardsCamera.y * quaternionCoefficient,\r\n planeNormalTowardsCamera.z * quaternionCoefficient,\r\n Math.cos(angle / 2)\r\n );\r\n\r\n // If the meshes local scale is inverted (eg. loaded gltf file parent with z scale of -1) the rotation needs to be inverted on the y axis\r\n if (tmpMatrix.determinant() > 0) {\r\n const tmpVector = new Vector3();\r\n amountToRotate.toEulerAnglesToRef(tmpVector);\r\n Quaternion.RotationYawPitchRollToRef(tmpVector.y, -tmpVector.x, -tmpVector.z, amountToRotate);\r\n }\r\n\r\n if (this.updateGizmoRotationToMatchAttachedMesh) {\r\n // Rotate selected mesh quaternion over fixed axis\r\n nodeQuaternion.multiplyToRef(amountToRotate, nodeQuaternion);\r\n } else {\r\n // Rotate selected mesh quaternion over rotated axis\r\n amountToRotate.multiplyToRef(nodeQuaternion, nodeQuaternion);\r\n }\r\n\r\n // recompose matrix\r\n this.attachedNode.getWorldMatrix().copyFrom(Matrix.Compose(nodeScale, nodeQuaternion, nodeTranslation));\r\n\r\n lastDragPosition.copyFrom(event.dragPlanePoint);\r\n if (snapped) {\r\n tmpSnapEvent.snapDistance = angle;\r\n this.onSnapObservable.notifyObservers(tmpSnapEvent);\r\n }\r\n this._angles.y += angle;\r\n this.angle += cameraFlipped ? -angle : angle;\r\n this._rotationShaderMaterial.setVector3(\"angles\", this._angles);\r\n this._matrixChanged();\r\n }\r\n });\r\n\r\n const light = gizmoLayer._getSharedGizmoLight();\r\n light.includedOnlyMeshes = light.includedOnlyMeshes.concat(this._rootMesh.getChildMeshes(false));\r\n\r\n const cache: GizmoAxisCache = {\r\n colliderMeshes: [collider],\r\n gizmoMeshes: [rotationMesh],\r\n material: this._coloredMaterial,\r\n hoverMaterial: this._hoverMaterial,\r\n disableMaterial: this._disableMaterial,\r\n active: false,\r\n dragBehavior: this.dragBehavior,\r\n };\r\n this._parent?.addToAxisCache(this._gizmoMesh, cache);\r\n\r\n this._pointerObserver = gizmoLayer.utilityLayerScene.onPointerObservable.add((pointerInfo) => {\r\n if (this._customMeshSet) {\r\n return;\r\n }\r\n // updating here the maxangle because ondragstart is too late (value already used) and the updated value is not taken into account\r\n this.dragBehavior.maxDragAngle = PlaneRotationGizmo.MaxDragAngle;\r\n this._isHovered = !!(cache.colliderMeshes.indexOf(<Mesh>pointerInfo?.pickInfo?.pickedMesh) != -1);\r\n if (!this._parent) {\r\n const material = cache.dragBehavior.enabled ? (this._isHovered || this._dragging ? this._hoverMaterial : this._coloredMaterial) : this._disableMaterial;\r\n this._setGizmoMeshMaterial(cache.gizmoMeshes, material);\r\n }\r\n });\r\n\r\n this.dragBehavior.onEnabledObservable.add((newState) => {\r\n this._setGizmoMeshMaterial(cache.gizmoMeshes, newState ? this._coloredMaterial : this._disableMaterial);\r\n });\r\n }\r\n\r\n /**\r\n * Create Geometry for Gizmo\r\n * @param parentMesh\r\n * @param thickness\r\n * @param tessellation\r\n */\r\n protected _createGizmoMesh(parentMesh: AbstractMesh, thickness: number, tessellation: number) {\r\n const collider = CreateTorus(\r\n \"ignore\",\r\n {\r\n diameter: 0.6,\r\n thickness: 0.03 * thickness,\r\n tessellation,\r\n },\r\n this.gizmoLayer.utilityLayerScene\r\n );\r\n collider.visibility = 0;\r\n const rotationMesh = CreateTorus(\r\n \"\",\r\n {\r\n diameter: 0.6,\r\n thickness: 0.005 * thickness,\r\n tessellation,\r\n },\r\n this.gizmoLayer.utilityLayerScene\r\n );\r\n rotationMesh.material = this._coloredMaterial;\r\n\r\n // Position arrow pointing in its drag axis\r\n rotationMesh.rotation.x = Math.PI / 2;\r\n collider.rotation.x = Math.PI / 2;\r\n\r\n parentMesh.addChild(rotationMesh, Gizmo.PreserveScaling);\r\n parentMesh.addChild(collider, Gizmo.PreserveScaling);\r\n return { rotationMesh, collider };\r\n }\r\n\r\n protected _attachedNodeChanged(value: Nullable<Node>) {\r\n if (this.dragBehavior) {\r\n this.dragBehavior.enabled = value ? true : false;\r\n }\r\n }\r\n\r\n /**\r\n * If the gizmo is enabled\r\n */\r\n public set isEnabled(value: boolean) {\r\n this._isEnabled = value;\r\n if (!value) {\r\n this.attachedMesh = null;\r\n } else {\r\n if (this._parent) {\r\n this.attachedMesh = this._parent.attachedMesh;\r\n }\r\n }\r\n }\r\n public get isEnabled(): boolean {\r\n return this._isEnabled;\r\n }\r\n /**\r\n * Disposes of the gizmo\r\n */\r\n public dispose() {\r\n this.onSnapObservable.clear();\r\n this.gizmoLayer.utilityLayerScene.onPointerObservable.remove(this._pointerObserver);\r\n this.dragBehavior.detach();\r\n if (this._gizmoMesh) {\r\n this._gizmoMesh.dispose();\r\n }\r\n if (this._rotationDisplayPlane) {\r\n this._rotationDisplayPlane.dispose();\r\n }\r\n if (this._rotationShaderMaterial) {\r\n this._rotationShaderMaterial.dispose();\r\n }\r\n [this._coloredMaterial, this._hoverMaterial, this._disableMaterial].forEach((matl) => {\r\n if (matl) {\r\n matl.dispose();\r\n }\r\n });\r\n super.dispose();\r\n }\r\n}\r\n"]}
@@ -1,3 +1,4 @@
1
+ import type { Observer } from "../Misc/observable";
1
2
  import { Observable } from "../Misc/observable";
2
3
  import type { Nullable } from "../types";
3
4
  import type { AbstractMesh } from "../Meshes/abstractMesh";
@@ -8,6 +9,7 @@ import { Gizmo } from "./gizmo";
8
9
  import { AxisDragGizmo } from "./axisDragGizmo";
9
10
  import { PlaneDragGizmo } from "./planeDragGizmo";
10
11
  import { UtilityLayerRenderer } from "../Rendering/utilityLayerRenderer";
12
+ import type { PointerInfo } from "../Events/pointerEvents";
11
13
  import type { GizmoManager } from "./gizmoManager";
12
14
  /**
13
15
  * Gizmo that enables dragging a mesh along 3 axis
@@ -38,14 +40,14 @@ export declare class PositionGizmo extends Gizmo {
38
40
  */
39
41
  zPlaneGizmo: PlaneDragGizmo;
40
42
  /**
41
- * private variables
43
+ * protected variables
42
44
  */
43
- private _meshAttached;
44
- private _nodeAttached;
45
- private _snapDistance;
46
- private _observables;
45
+ protected _meshAttached: Nullable<AbstractMesh>;
46
+ protected _nodeAttached: Nullable<Node>;
47
+ protected _snapDistance: number;
48
+ protected _observables: Observer<PointerInfo>[];
47
49
  /** Node Caching for quick lookup */
48
- private _gizmoAxisCache;
50
+ protected _gizmoAxisCache: Map<Mesh, GizmoAxisCache>;
49
51
  /** Fires an event when any of it's sub gizmos are dragged */
50
52
  onDragStartObservable: Observable<unknown>;
51
53
  /** Fires an event when any of it's sub gizmos are released from dragging */
@@ -53,7 +55,7 @@ export declare class PositionGizmo extends Gizmo {
53
55
  /**
54
56
  * If set to true, planar drag is enabled
55
57
  */
56
- private _planarGizmoEnabled;
58
+ protected _planarGizmoEnabled: boolean;
57
59
  get attachedMesh(): Nullable<AbstractMesh>;
58
60
  set attachedMesh(mesh: Nullable<AbstractMesh>);
59
61
  get attachedNode(): Nullable<Node>;
@@ -23,7 +23,7 @@ var PositionGizmo = /** @class */ (function (_super) {
23
23
  if (thickness === void 0) { thickness = 1; }
24
24
  var _this = _super.call(this, gizmoLayer) || this;
25
25
  /**
26
- * private variables
26
+ * protected variables
27
27
  */
28
28
  _this._meshAttached = null;
29
29
  _this._nodeAttached = null;
@@ -1 +1 @@
1
- {"version":3,"file":"positionGizmo.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Gizmos/positionGizmo.ts"],"names":[],"mappings":"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","sourcesContent":["import { Logger } from \"../Misc/logger\";\r\nimport type { Observer } from \"../Misc/observable\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport type { Nullable } from \"../types\";\r\nimport { Vector3 } from \"../Maths/math.vector\";\r\nimport { Color3 } from \"../Maths/math.color\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { Node } from \"../node\";\r\nimport type { Mesh } from \"../Meshes/mesh\";\r\nimport type { GizmoAxisCache } from \"./gizmo\";\r\nimport { Gizmo } from \"./gizmo\";\r\nimport { AxisDragGizmo } from \"./axisDragGizmo\";\r\nimport { PlaneDragGizmo } from \"./planeDragGizmo\";\r\nimport { UtilityLayerRenderer } from \"../Rendering/utilityLayerRenderer\";\r\nimport type { PointerInfo } from \"../Events/pointerEvents\";\r\nimport type { GizmoManager } from \"./gizmoManager\";\r\n/**\r\n * Gizmo that enables dragging a mesh along 3 axis\r\n */\r\nexport class PositionGizmo extends Gizmo {\r\n /**\r\n * Internal gizmo used for interactions on the x axis\r\n */\r\n public xGizmo: AxisDragGizmo;\r\n /**\r\n * Internal gizmo used for interactions on the y axis\r\n */\r\n public yGizmo: AxisDragGizmo;\r\n /**\r\n * Internal gizmo used for interactions on the z axis\r\n */\r\n public zGizmo: AxisDragGizmo;\r\n /**\r\n * Internal gizmo used for interactions on the yz plane\r\n */\r\n public xPlaneGizmo: PlaneDragGizmo;\r\n /**\r\n * Internal gizmo used for interactions on the xz plane\r\n */\r\n public yPlaneGizmo: PlaneDragGizmo;\r\n /**\r\n * Internal gizmo used for interactions on the xy plane\r\n */\r\n public zPlaneGizmo: PlaneDragGizmo;\r\n\r\n /**\r\n * private variables\r\n */\r\n private _meshAttached: Nullable<AbstractMesh> = null;\r\n private _nodeAttached: Nullable<Node> = null;\r\n private _snapDistance: number;\r\n private _observables: Observer<PointerInfo>[] = [];\r\n\r\n /** Node Caching for quick lookup */\r\n private _gizmoAxisCache: Map<Mesh, GizmoAxisCache> = new Map();\r\n\r\n /** Fires an event when any of it's sub gizmos are dragged */\r\n public onDragStartObservable = new Observable();\r\n /** Fires an event when any of it's sub gizmos are released from dragging */\r\n public onDragEndObservable = new Observable();\r\n\r\n /**\r\n * If set to true, planar drag is enabled\r\n */\r\n private _planarGizmoEnabled = false;\r\n\r\n public get attachedMesh() {\r\n return this._meshAttached;\r\n }\r\n public set attachedMesh(mesh: Nullable<AbstractMesh>) {\r\n this._meshAttached = mesh;\r\n this._nodeAttached = mesh;\r\n [this.xGizmo, this.yGizmo, this.zGizmo, this.xPlaneGizmo, this.yPlaneGizmo, this.zPlaneGizmo].forEach((gizmo) => {\r\n if (gizmo.isEnabled) {\r\n gizmo.attachedMesh = mesh;\r\n } else {\r\n gizmo.attachedMesh = null;\r\n }\r\n });\r\n }\r\n\r\n public get attachedNode() {\r\n return this._nodeAttached;\r\n }\r\n public set attachedNode(node: Nullable<Node>) {\r\n this._meshAttached = null;\r\n this._nodeAttached = node;\r\n [this.xGizmo, this.yGizmo, this.zGizmo, this.xPlaneGizmo, this.yPlaneGizmo, this.zPlaneGizmo].forEach((gizmo) => {\r\n if (gizmo.isEnabled) {\r\n gizmo.attachedNode = node;\r\n } else {\r\n gizmo.attachedNode = null;\r\n }\r\n });\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 [this.xGizmo, this.yGizmo, this.zGizmo, this.xPlaneGizmo, this.yPlaneGizmo, this.zPlaneGizmo].forEach((gizmo) => {\r\n hovered = hovered || gizmo.isHovered;\r\n });\r\n return hovered;\r\n }\r\n\r\n /**\r\n * Creates a PositionGizmo\r\n * @param gizmoLayer The utility layer the gizmo will be added to\r\n @param thickness display gizmo axis thickness\r\n * @param gizmoManager\r\n */\r\n constructor(gizmoLayer: UtilityLayerRenderer = UtilityLayerRenderer.DefaultUtilityLayer, thickness: number = 1, gizmoManager?: GizmoManager) {\r\n super(gizmoLayer);\r\n this.xGizmo = new AxisDragGizmo(new Vector3(1, 0, 0), Color3.Red().scale(0.5), gizmoLayer, this, thickness);\r\n this.yGizmo = new AxisDragGizmo(new Vector3(0, 1, 0), Color3.Green().scale(0.5), gizmoLayer, this, thickness);\r\n this.zGizmo = new AxisDragGizmo(new Vector3(0, 0, 1), Color3.Blue().scale(0.5), gizmoLayer, this, thickness);\r\n\r\n this.xPlaneGizmo = new PlaneDragGizmo(new Vector3(1, 0, 0), Color3.Red().scale(0.5), this.gizmoLayer, this);\r\n this.yPlaneGizmo = new PlaneDragGizmo(new Vector3(0, 1, 0), Color3.Green().scale(0.5), this.gizmoLayer, this);\r\n this.zPlaneGizmo = new PlaneDragGizmo(new Vector3(0, 0, 1), Color3.Blue().scale(0.5), this.gizmoLayer, this);\r\n // Relay drag events\r\n [this.xGizmo, this.yGizmo, this.zGizmo, this.xPlaneGizmo, this.yPlaneGizmo, this.zPlaneGizmo].forEach((gizmo) => {\r\n gizmo.dragBehavior.onDragStartObservable.add(() => {\r\n this.onDragStartObservable.notifyObservers({});\r\n });\r\n gizmo.dragBehavior.onDragEndObservable.add(() => {\r\n this.onDragEndObservable.notifyObservers({});\r\n });\r\n });\r\n\r\n this.attachedMesh = null;\r\n\r\n if (gizmoManager) {\r\n gizmoManager.addToAxisCache(this._gizmoAxisCache);\r\n } else {\r\n // Only subscribe to pointer event if gizmoManager isnt\r\n Gizmo.GizmoAxisPointerObserver(gizmoLayer, this._gizmoAxisCache);\r\n }\r\n }\r\n\r\n /**\r\n * If the planar drag gizmo is enabled\r\n * setting this will enable/disable XY, XZ and YZ planes regardless of individual gizmo settings.\r\n */\r\n public set planarGizmoEnabled(value: boolean) {\r\n this._planarGizmoEnabled = value;\r\n [this.xPlaneGizmo, this.yPlaneGizmo, this.zPlaneGizmo].forEach((gizmo) => {\r\n if (gizmo) {\r\n gizmo.isEnabled = value;\r\n if (value) {\r\n if (gizmo.attachedMesh) {\r\n gizmo.attachedMesh = this.attachedMesh;\r\n } else {\r\n gizmo.attachedNode = this.attachedNode;\r\n }\r\n }\r\n }\r\n }, this);\r\n }\r\n public get planarGizmoEnabled(): boolean {\r\n return this._planarGizmoEnabled;\r\n }\r\n\r\n public set updateGizmoRotationToMatchAttachedMesh(value: boolean) {\r\n this._updateGizmoRotationToMatchAttachedMesh = value;\r\n [this.xGizmo, this.yGizmo, this.zGizmo, this.xPlaneGizmo, this.yPlaneGizmo, this.zPlaneGizmo].forEach((gizmo) => {\r\n if (gizmo) {\r\n gizmo.updateGizmoRotationToMatchAttachedMesh = value;\r\n }\r\n });\r\n }\r\n public get updateGizmoRotationToMatchAttachedMesh() {\r\n return this._updateGizmoRotationToMatchAttachedMesh;\r\n }\r\n\r\n /**\r\n * Drag distance in babylon units that the gizmo will snap to when dragged (Default: 0)\r\n */\r\n public set snapDistance(value: number) {\r\n this._snapDistance = value;\r\n [this.xGizmo, this.yGizmo, this.zGizmo, this.xPlaneGizmo, this.yPlaneGizmo, this.zPlaneGizmo].forEach((gizmo) => {\r\n if (gizmo) {\r\n gizmo.snapDistance = value;\r\n }\r\n });\r\n }\r\n public get snapDistance() {\r\n return this._snapDistance;\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.xGizmo, this.yGizmo, this.zGizmo, this.xPlaneGizmo, this.yPlaneGizmo, this.zPlaneGizmo].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 * Builds Gizmo Axis Cache to enable features such as hover state preservation and graying out other axis during manipulation\r\n * @param mesh Axis gizmo mesh\r\n * @param cache Gizmo axis definition used for reactive gizmo UI\r\n */\r\n public addToAxisCache(mesh: Mesh, cache: GizmoAxisCache) {\r\n this._gizmoAxisCache.set(mesh, cache);\r\n }\r\n\r\n /**\r\n * Disposes of the gizmo\r\n */\r\n public dispose() {\r\n [this.xGizmo, this.yGizmo, this.zGizmo, this.xPlaneGizmo, this.yPlaneGizmo, this.zPlaneGizmo].forEach((gizmo) => {\r\n if (gizmo) {\r\n gizmo.dispose();\r\n }\r\n });\r\n this._observables.forEach((obs) => {\r\n this.gizmoLayer.utilityLayerScene.onPointerObservable.remove(obs);\r\n });\r\n this.onDragStartObservable.clear();\r\n this.onDragEndObservable.clear();\r\n }\r\n\r\n /**\r\n * CustomMeshes are not supported by this gizmo\r\n */\r\n public setCustomMesh() {\r\n Logger.Error(\r\n \"Custom meshes are not supported on this gizmo, please set the custom meshes on the gizmos contained within this one (gizmo.xGizmo, gizmo.yGizmo, gizmo.zGizmo,gizmo.xPlaneGizmo, gizmo.yPlaneGizmo, gizmo.zPlaneGizmo)\"\r\n );\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"positionGizmo.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Gizmos/positionGizmo.ts"],"names":[],"mappings":"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","sourcesContent":["import { Logger } from \"../Misc/logger\";\r\nimport type { Observer } from \"../Misc/observable\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport type { Nullable } from \"../types\";\r\nimport { Vector3 } from \"../Maths/math.vector\";\r\nimport { Color3 } from \"../Maths/math.color\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { Node } from \"../node\";\r\nimport type { Mesh } from \"../Meshes/mesh\";\r\nimport type { GizmoAxisCache } from \"./gizmo\";\r\nimport { Gizmo } from \"./gizmo\";\r\nimport { AxisDragGizmo } from \"./axisDragGizmo\";\r\nimport { PlaneDragGizmo } from \"./planeDragGizmo\";\r\nimport { UtilityLayerRenderer } from \"../Rendering/utilityLayerRenderer\";\r\nimport type { PointerInfo } from \"../Events/pointerEvents\";\r\nimport type { GizmoManager } from \"./gizmoManager\";\r\n/**\r\n * Gizmo that enables dragging a mesh along 3 axis\r\n */\r\nexport class PositionGizmo extends Gizmo {\r\n /**\r\n * Internal gizmo used for interactions on the x axis\r\n */\r\n public xGizmo: AxisDragGizmo;\r\n /**\r\n * Internal gizmo used for interactions on the y axis\r\n */\r\n public yGizmo: AxisDragGizmo;\r\n /**\r\n * Internal gizmo used for interactions on the z axis\r\n */\r\n public zGizmo: AxisDragGizmo;\r\n /**\r\n * Internal gizmo used for interactions on the yz plane\r\n */\r\n public xPlaneGizmo: PlaneDragGizmo;\r\n /**\r\n * Internal gizmo used for interactions on the xz plane\r\n */\r\n public yPlaneGizmo: PlaneDragGizmo;\r\n /**\r\n * Internal gizmo used for interactions on the xy plane\r\n */\r\n public zPlaneGizmo: PlaneDragGizmo;\r\n\r\n /**\r\n * protected variables\r\n */\r\n protected _meshAttached: Nullable<AbstractMesh> = null;\r\n protected _nodeAttached: Nullable<Node> = null;\r\n protected _snapDistance: number;\r\n protected _observables: Observer<PointerInfo>[] = [];\r\n\r\n /** Node Caching for quick lookup */\r\n protected _gizmoAxisCache: Map<Mesh, GizmoAxisCache> = new Map();\r\n\r\n /** Fires an event when any of it's sub gizmos are dragged */\r\n public onDragStartObservable = new Observable();\r\n /** Fires an event when any of it's sub gizmos are released from dragging */\r\n public onDragEndObservable = new Observable();\r\n\r\n /**\r\n * If set to true, planar drag is enabled\r\n */\r\n protected _planarGizmoEnabled = false;\r\n\r\n public get attachedMesh() {\r\n return this._meshAttached;\r\n }\r\n public set attachedMesh(mesh: Nullable<AbstractMesh>) {\r\n this._meshAttached = mesh;\r\n this._nodeAttached = mesh;\r\n [this.xGizmo, this.yGizmo, this.zGizmo, this.xPlaneGizmo, this.yPlaneGizmo, this.zPlaneGizmo].forEach((gizmo) => {\r\n if (gizmo.isEnabled) {\r\n gizmo.attachedMesh = mesh;\r\n } else {\r\n gizmo.attachedMesh = null;\r\n }\r\n });\r\n }\r\n\r\n public get attachedNode() {\r\n return this._nodeAttached;\r\n }\r\n public set attachedNode(node: Nullable<Node>) {\r\n this._meshAttached = null;\r\n this._nodeAttached = node;\r\n [this.xGizmo, this.yGizmo, this.zGizmo, this.xPlaneGizmo, this.yPlaneGizmo, this.zPlaneGizmo].forEach((gizmo) => {\r\n if (gizmo.isEnabled) {\r\n gizmo.attachedNode = node;\r\n } else {\r\n gizmo.attachedNode = null;\r\n }\r\n });\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 [this.xGizmo, this.yGizmo, this.zGizmo, this.xPlaneGizmo, this.yPlaneGizmo, this.zPlaneGizmo].forEach((gizmo) => {\r\n hovered = hovered || gizmo.isHovered;\r\n });\r\n return hovered;\r\n }\r\n\r\n /**\r\n * Creates a PositionGizmo\r\n * @param gizmoLayer The utility layer the gizmo will be added to\r\n @param thickness display gizmo axis thickness\r\n * @param gizmoManager\r\n */\r\n constructor(gizmoLayer: UtilityLayerRenderer = UtilityLayerRenderer.DefaultUtilityLayer, thickness: number = 1, gizmoManager?: GizmoManager) {\r\n super(gizmoLayer);\r\n this.xGizmo = new AxisDragGizmo(new Vector3(1, 0, 0), Color3.Red().scale(0.5), gizmoLayer, this, thickness);\r\n this.yGizmo = new AxisDragGizmo(new Vector3(0, 1, 0), Color3.Green().scale(0.5), gizmoLayer, this, thickness);\r\n this.zGizmo = new AxisDragGizmo(new Vector3(0, 0, 1), Color3.Blue().scale(0.5), gizmoLayer, this, thickness);\r\n\r\n this.xPlaneGizmo = new PlaneDragGizmo(new Vector3(1, 0, 0), Color3.Red().scale(0.5), this.gizmoLayer, this);\r\n this.yPlaneGizmo = new PlaneDragGizmo(new Vector3(0, 1, 0), Color3.Green().scale(0.5), this.gizmoLayer, this);\r\n this.zPlaneGizmo = new PlaneDragGizmo(new Vector3(0, 0, 1), Color3.Blue().scale(0.5), this.gizmoLayer, this);\r\n // Relay drag events\r\n [this.xGizmo, this.yGizmo, this.zGizmo, this.xPlaneGizmo, this.yPlaneGizmo, this.zPlaneGizmo].forEach((gizmo) => {\r\n gizmo.dragBehavior.onDragStartObservable.add(() => {\r\n this.onDragStartObservable.notifyObservers({});\r\n });\r\n gizmo.dragBehavior.onDragEndObservable.add(() => {\r\n this.onDragEndObservable.notifyObservers({});\r\n });\r\n });\r\n\r\n this.attachedMesh = null;\r\n\r\n if (gizmoManager) {\r\n gizmoManager.addToAxisCache(this._gizmoAxisCache);\r\n } else {\r\n // Only subscribe to pointer event if gizmoManager isnt\r\n Gizmo.GizmoAxisPointerObserver(gizmoLayer, this._gizmoAxisCache);\r\n }\r\n }\r\n\r\n /**\r\n * If the planar drag gizmo is enabled\r\n * setting this will enable/disable XY, XZ and YZ planes regardless of individual gizmo settings.\r\n */\r\n public set planarGizmoEnabled(value: boolean) {\r\n this._planarGizmoEnabled = value;\r\n [this.xPlaneGizmo, this.yPlaneGizmo, this.zPlaneGizmo].forEach((gizmo) => {\r\n if (gizmo) {\r\n gizmo.isEnabled = value;\r\n if (value) {\r\n if (gizmo.attachedMesh) {\r\n gizmo.attachedMesh = this.attachedMesh;\r\n } else {\r\n gizmo.attachedNode = this.attachedNode;\r\n }\r\n }\r\n }\r\n }, this);\r\n }\r\n public get planarGizmoEnabled(): boolean {\r\n return this._planarGizmoEnabled;\r\n }\r\n\r\n public set updateGizmoRotationToMatchAttachedMesh(value: boolean) {\r\n this._updateGizmoRotationToMatchAttachedMesh = value;\r\n [this.xGizmo, this.yGizmo, this.zGizmo, this.xPlaneGizmo, this.yPlaneGizmo, this.zPlaneGizmo].forEach((gizmo) => {\r\n if (gizmo) {\r\n gizmo.updateGizmoRotationToMatchAttachedMesh = value;\r\n }\r\n });\r\n }\r\n public get updateGizmoRotationToMatchAttachedMesh() {\r\n return this._updateGizmoRotationToMatchAttachedMesh;\r\n }\r\n\r\n /**\r\n * Drag distance in babylon units that the gizmo will snap to when dragged (Default: 0)\r\n */\r\n public set snapDistance(value: number) {\r\n this._snapDistance = value;\r\n [this.xGizmo, this.yGizmo, this.zGizmo, this.xPlaneGizmo, this.yPlaneGizmo, this.zPlaneGizmo].forEach((gizmo) => {\r\n if (gizmo) {\r\n gizmo.snapDistance = value;\r\n }\r\n });\r\n }\r\n public get snapDistance() {\r\n return this._snapDistance;\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.xGizmo, this.yGizmo, this.zGizmo, this.xPlaneGizmo, this.yPlaneGizmo, this.zPlaneGizmo].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 * Builds Gizmo Axis Cache to enable features such as hover state preservation and graying out other axis during manipulation\r\n * @param mesh Axis gizmo mesh\r\n * @param cache Gizmo axis definition used for reactive gizmo UI\r\n */\r\n public addToAxisCache(mesh: Mesh, cache: GizmoAxisCache) {\r\n this._gizmoAxisCache.set(mesh, cache);\r\n }\r\n\r\n /**\r\n * Disposes of the gizmo\r\n */\r\n public dispose() {\r\n [this.xGizmo, this.yGizmo, this.zGizmo, this.xPlaneGizmo, this.yPlaneGizmo, this.zPlaneGizmo].forEach((gizmo) => {\r\n if (gizmo) {\r\n gizmo.dispose();\r\n }\r\n });\r\n this._observables.forEach((obs) => {\r\n this.gizmoLayer.utilityLayerScene.onPointerObservable.remove(obs);\r\n });\r\n this.onDragStartObservable.clear();\r\n this.onDragEndObservable.clear();\r\n }\r\n\r\n /**\r\n * CustomMeshes are not supported by this gizmo\r\n */\r\n public setCustomMesh() {\r\n Logger.Error(\r\n \"Custom meshes are not supported on this gizmo, please set the custom meshes on the gizmos contained within this one (gizmo.xGizmo, gizmo.yGizmo, gizmo.zGizmo,gizmo.xPlaneGizmo, gizmo.yPlaneGizmo, gizmo.zPlaneGizmo)\"\r\n );\r\n }\r\n}\r\n"]}
@@ -1,3 +1,4 @@
1
+ import type { Observer } from "../Misc/observable";
1
2
  import { Observable } from "../Misc/observable";
2
3
  import type { Nullable } from "../types";
3
4
  import { Color3 } from "../Maths/math.color";
@@ -8,6 +9,7 @@ import { Gizmo } from "./gizmo";
8
9
  import { PlaneRotationGizmo } from "./planeRotationGizmo";
9
10
  import { UtilityLayerRenderer } from "../Rendering/utilityLayerRenderer";
10
11
  import type { Node } from "../node";
12
+ import type { PointerInfo } from "../Events/pointerEvents";
11
13
  import type { GizmoManager } from "./gizmoManager";
12
14
  /**
13
15
  * Options for each individual plane rotation gizmo contained within RotationGizmo
@@ -60,11 +62,11 @@ export declare class RotationGizmo extends Gizmo {
60
62
  onDragStartObservable: Observable<unknown>;
61
63
  /** Fires an event when any of it's sub gizmos are released from dragging */
62
64
  onDragEndObservable: Observable<unknown>;
63
- private _meshAttached;
64
- private _nodeAttached;
65
- private _observables;
65
+ protected _meshAttached: Nullable<AbstractMesh>;
66
+ protected _nodeAttached: Nullable<Node>;
67
+ protected _observables: Observer<PointerInfo>[];
66
68
  /** Node Caching for quick lookup */
67
- private _gizmoAxisCache;
69
+ protected _gizmoAxisCache: Map<Mesh, GizmoAxisCache>;
68
70
  get attachedMesh(): Nullable<AbstractMesh>;
69
71
  set attachedMesh(mesh: Nullable<AbstractMesh>);
70
72
  get attachedNode(): Nullable<Node>;
@@ -1 +1 @@
1
- {"version":3,"file":"rotationGizmo.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Gizmos/rotationGizmo.ts"],"names":[],"mappings":"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","sourcesContent":["import { Logger } from \"../Misc/logger\";\r\nimport type { Observer } from \"../Misc/observable\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport type { Nullable } from \"../types\";\r\nimport { Vector3 } from \"../Maths/math.vector\";\r\nimport { Color3 } from \"../Maths/math.color\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { Mesh } from \"../Meshes/mesh\";\r\nimport type { GizmoAxisCache } from \"./gizmo\";\r\nimport { Gizmo } from \"./gizmo\";\r\nimport { PlaneRotationGizmo } from \"./planeRotationGizmo\";\r\nimport { UtilityLayerRenderer } from \"../Rendering/utilityLayerRenderer\";\r\nimport type { Node } from \"../node\";\r\nimport type { PointerInfo } from \"../Events/pointerEvents\";\r\nimport type { TransformNode } from \"../Meshes/transformNode\";\r\nimport type { GizmoManager } from \"./gizmoManager\";\r\n\r\n/**\r\n * Options for each individual plane rotation gizmo contained within RotationGizmo\r\n * @since 5.0.0\r\n */\r\nexport interface PlaneRotationGizmoOptions {\r\n /**\r\n * Color to use for the plane rotation gizmo\r\n */\r\n color?: Color3;\r\n}\r\n\r\n/**\r\n * Additional options for each rotation gizmo\r\n */\r\nexport interface RotationGizmoOptions {\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 /**\r\n * Specific options for xGizmo\r\n */\r\n xOptions?: PlaneRotationGizmoOptions;\r\n\r\n /**\r\n * Specific options for yGizmo\r\n */\r\n yOptions?: PlaneRotationGizmoOptions;\r\n\r\n /**\r\n * Specific options for zGizmo\r\n */\r\n zOptions?: PlaneRotationGizmoOptions;\r\n}\r\n\r\n/**\r\n * Gizmo that enables rotating a mesh along 3 axis\r\n */\r\nexport class RotationGizmo extends Gizmo {\r\n /**\r\n * Internal gizmo used for interactions on the x axis\r\n */\r\n public xGizmo: PlaneRotationGizmo;\r\n /**\r\n * Internal gizmo used for interactions on the y axis\r\n */\r\n public yGizmo: PlaneRotationGizmo;\r\n /**\r\n * Internal gizmo used for interactions on the z axis\r\n */\r\n public zGizmo: PlaneRotationGizmo;\r\n\r\n /** Fires an event when any of it's sub gizmos are dragged */\r\n public onDragStartObservable = new Observable();\r\n /** Fires an event when any of it's sub gizmos are released from dragging */\r\n public onDragEndObservable = new Observable();\r\n\r\n private _meshAttached: Nullable<AbstractMesh>;\r\n private _nodeAttached: Nullable<Node>;\r\n private _observables: Observer<PointerInfo>[] = [];\r\n\r\n /** Node Caching for quick lookup */\r\n private _gizmoAxisCache: Map<Mesh, GizmoAxisCache> = new Map();\r\n\r\n public get attachedMesh() {\r\n return this._meshAttached;\r\n }\r\n public set attachedMesh(mesh: Nullable<AbstractMesh>) {\r\n this._meshAttached = mesh;\r\n this._nodeAttached = mesh;\r\n this._checkBillboardTransform();\r\n [this.xGizmo, this.yGizmo, this.zGizmo].forEach((gizmo) => {\r\n if (gizmo.isEnabled) {\r\n gizmo.attachedMesh = mesh;\r\n } else {\r\n gizmo.attachedMesh = null;\r\n }\r\n });\r\n }\r\n\r\n public get attachedNode() {\r\n return this._nodeAttached;\r\n }\r\n public set attachedNode(node: Nullable<Node>) {\r\n this._meshAttached = null;\r\n this._nodeAttached = node;\r\n this._checkBillboardTransform();\r\n [this.xGizmo, this.yGizmo, this.zGizmo].forEach((gizmo) => {\r\n if (gizmo.isEnabled) {\r\n gizmo.attachedNode = node;\r\n } else {\r\n gizmo.attachedNode = null;\r\n }\r\n });\r\n }\r\n\r\n protected _checkBillboardTransform() {\r\n if (this._nodeAttached && (<TransformNode>this._nodeAttached).billboardMode) {\r\n console.log(\"Rotation Gizmo will not work with transforms in billboard mode.\");\r\n }\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 [this.xGizmo, this.yGizmo, this.zGizmo].forEach((gizmo) => {\r\n hovered = hovered || gizmo.isHovered;\r\n });\r\n return hovered;\r\n }\r\n\r\n /**\r\n * Creates a RotationGizmo\r\n * @param gizmoLayer The utility layer the gizmo will be added to\r\n * @param tessellation Amount of tessellation to be used when creating rotation circles\r\n * @param useEulerRotation Use and update Euler angle instead of quaternion\r\n * @param thickness display gizmo axis thickness\r\n * @param gizmoManager Gizmo manager\r\n * @param options More options\r\n */\r\n constructor(\r\n gizmoLayer: UtilityLayerRenderer = UtilityLayerRenderer.DefaultUtilityLayer,\r\n tessellation = 32,\r\n useEulerRotation = false,\r\n thickness: number = 1,\r\n gizmoManager?: GizmoManager,\r\n options?: RotationGizmoOptions\r\n ) {\r\n super(gizmoLayer);\r\n const xColor = options && options.xOptions && options.xOptions.color ? options.xOptions.color : Color3.Red().scale(0.5);\r\n const yColor = options && options.yOptions && options.yOptions.color ? options.yOptions.color : Color3.Green().scale(0.5);\r\n const zColor = options && options.zOptions && options.zOptions.color ? options.zOptions.color : Color3.Blue().scale(0.5);\r\n this.xGizmo = new PlaneRotationGizmo(new Vector3(1, 0, 0), xColor, gizmoLayer, tessellation, this, useEulerRotation, thickness);\r\n this.yGizmo = new PlaneRotationGizmo(new Vector3(0, 1, 0), yColor, gizmoLayer, tessellation, this, useEulerRotation, thickness);\r\n this.zGizmo = new PlaneRotationGizmo(new Vector3(0, 0, 1), zColor, gizmoLayer, tessellation, this, useEulerRotation, thickness);\r\n // Relay drag events and set update scale\r\n [this.xGizmo, this.yGizmo, this.zGizmo].forEach((gizmo) => {\r\n //must set updateScale on each gizmo, as setting it on root RotationGizmo doesnt prevent individual gizmos from updating\r\n //currently updateScale is a property with no getter/setter, so no good way to override behavior at runtime, so we will at least set it on startup\r\n if (options && options.updateScale != undefined) {\r\n gizmo.updateScale = options.updateScale;\r\n }\r\n gizmo.dragBehavior.onDragStartObservable.add(() => {\r\n this.onDragStartObservable.notifyObservers({});\r\n });\r\n gizmo.dragBehavior.onDragEndObservable.add(() => {\r\n this.onDragEndObservable.notifyObservers({});\r\n });\r\n });\r\n\r\n this.attachedMesh = null;\r\n this.attachedNode = null;\r\n\r\n if (gizmoManager) {\r\n gizmoManager.addToAxisCache(this._gizmoAxisCache);\r\n } else {\r\n // Only subscribe to pointer event if gizmoManager isnt\r\n Gizmo.GizmoAxisPointerObserver(gizmoLayer, this._gizmoAxisCache);\r\n }\r\n }\r\n\r\n public set updateGizmoRotationToMatchAttachedMesh(value: boolean) {\r\n if (this.xGizmo) {\r\n this.xGizmo.updateGizmoRotationToMatchAttachedMesh = value;\r\n this.yGizmo.updateGizmoRotationToMatchAttachedMesh = value;\r\n this.zGizmo.updateGizmoRotationToMatchAttachedMesh = value;\r\n }\r\n }\r\n public get updateGizmoRotationToMatchAttachedMesh() {\r\n return this.xGizmo.updateGizmoRotationToMatchAttachedMesh;\r\n }\r\n\r\n /**\r\n * Drag distance in babylon units that the gizmo will snap to when dragged (Default: 0)\r\n */\r\n public set snapDistance(value: number) {\r\n if (this.xGizmo) {\r\n this.xGizmo.snapDistance = value;\r\n this.yGizmo.snapDistance = value;\r\n this.zGizmo.snapDistance = value;\r\n }\r\n }\r\n public get snapDistance() {\r\n return this.xGizmo.snapDistance;\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 if (this.xGizmo) {\r\n this.xGizmo.scaleRatio = value;\r\n this.yGizmo.scaleRatio = value;\r\n this.zGizmo.scaleRatio = value;\r\n }\r\n }\r\n public get scaleRatio() {\r\n return this.xGizmo.scaleRatio;\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 mesh Axis gizmo mesh\r\n * @param cache Gizmo axis definition used for reactive gizmo UI\r\n */\r\n public addToAxisCache(mesh: Mesh, cache: GizmoAxisCache) {\r\n this._gizmoAxisCache.set(mesh, cache);\r\n }\r\n\r\n /**\r\n * Disposes of the gizmo\r\n */\r\n public dispose() {\r\n this.xGizmo.dispose();\r\n this.yGizmo.dispose();\r\n this.zGizmo.dispose();\r\n this.onDragStartObservable.clear();\r\n this.onDragEndObservable.clear();\r\n this._observables.forEach((obs) => {\r\n this.gizmoLayer.utilityLayerScene.onPointerObservable.remove(obs);\r\n });\r\n }\r\n\r\n /**\r\n * CustomMeshes are not supported by this gizmo\r\n */\r\n public setCustomMesh() {\r\n Logger.Error(\r\n \"Custom meshes are not supported on this gizmo, please set the custom meshes on the gizmos contained within this one (gizmo.xGizmo, gizmo.yGizmo, gizmo.zGizmo)\"\r\n );\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"rotationGizmo.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Gizmos/rotationGizmo.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAExC,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAI7C,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AA0CzE;;GAEG;AACH;IAAmC,iCAAK;IA2EpC;;;;;;;;OAQG;IACH,uBACI,UAA2E,EAC3E,YAAiB,EACjB,gBAAwB,EACxB,SAAqB,EACrB,YAA2B,EAC3B,OAA8B;QAL9B,2BAAA,EAAA,aAAmC,oBAAoB,CAAC,mBAAmB;QAC3E,6BAAA,EAAA,iBAAiB;QACjB,iCAAA,EAAA,wBAAwB;QACxB,0BAAA,EAAA,aAAqB;QAJzB,YAQI,kBAAM,UAAU,CAAC,SA+BpB;QA7GD,6DAA6D;QACtD,2BAAqB,GAAG,IAAI,UAAU,EAAE,CAAC;QAChD,4EAA4E;QACrE,yBAAmB,GAAG,IAAI,UAAU,EAAE,CAAC;QAIpC,kBAAY,GAA4B,EAAE,CAAC;QAErD,oCAAoC;QAC1B,qBAAe,GAA8B,IAAI,GAAG,EAAE,CAAC;QAqE7D,IAAM,MAAM,GAAG,OAAO,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxH,IAAM,MAAM,GAAG,OAAO,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1H,IAAM,MAAM,GAAG,OAAO,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACzH,KAAI,CAAC,MAAM,GAAG,IAAI,kBAAkB,CAAC,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,KAAI,EAAE,gBAAgB,EAAE,SAAS,CAAC,CAAC;QAChI,KAAI,CAAC,MAAM,GAAG,IAAI,kBAAkB,CAAC,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,KAAI,EAAE,gBAAgB,EAAE,SAAS,CAAC,CAAC;QAChI,KAAI,CAAC,MAAM,GAAG,IAAI,kBAAkB,CAAC,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,KAAI,EAAE,gBAAgB,EAAE,SAAS,CAAC,CAAC;QAChI,yCAAyC;QACzC,CAAC,KAAI,CAAC,MAAM,EAAE,KAAI,CAAC,MAAM,EAAE,KAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,UAAC,KAAK;YAClD,wHAAwH;YACxH,kJAAkJ;YAClJ,IAAI,OAAO,IAAI,OAAO,CAAC,WAAW,IAAI,SAAS,EAAE;gBAC7C,KAAK,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;aAC3C;YACD,KAAK,CAAC,YAAY,CAAC,qBAAqB,CAAC,GAAG,CAAC;gBACzC,KAAI,CAAC,qBAAqB,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;YACnD,CAAC,CAAC,CAAC;YACH,KAAK,CAAC,YAAY,CAAC,mBAAmB,CAAC,GAAG,CAAC;gBACvC,KAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;YACjD,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;QAEH,KAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,KAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAEzB,IAAI,YAAY,EAAE;YACd,YAAY,CAAC,cAAc,CAAC,KAAI,CAAC,eAAe,CAAC,CAAC;SACrD;aAAM;YACH,uDAAuD;YACvD,KAAK,CAAC,wBAAwB,CAAC,UAAU,EAAE,KAAI,CAAC,eAAe,CAAC,CAAC;SACpE;;IACL,CAAC;IAjGD,sBAAW,uCAAY;aAAvB;YACI,OAAO,IAAI,CAAC,aAAa,CAAC;QAC9B,CAAC;aACD,UAAwB,IAA4B;YAChD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;YAC1B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;YAC1B,IAAI,CAAC,wBAAwB,EAAE,CAAC;YAChC,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,UAAC,KAAK;gBAClD,IAAI,KAAK,CAAC,SAAS,EAAE;oBACjB,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;iBAC7B;qBAAM;oBACH,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;iBAC7B;YACL,CAAC,CAAC,CAAC;QACP,CAAC;;;OAZA;IAcD,sBAAW,uCAAY;aAAvB;YACI,OAAO,IAAI,CAAC,aAAa,CAAC;QAC9B,CAAC;aACD,UAAwB,IAAoB;YACxC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;YAC1B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;YAC1B,IAAI,CAAC,wBAAwB,EAAE,CAAC;YAChC,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,UAAC,KAAK;gBAClD,IAAI,KAAK,CAAC,SAAS,EAAE;oBACjB,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;iBAC7B;qBAAM;oBACH,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;iBAC7B;YACL,CAAC,CAAC,CAAC;QACP,CAAC;;;OAZA;IAcS,gDAAwB,GAAlC;QACI,IAAI,IAAI,CAAC,aAAa,IAAoB,IAAI,CAAC,aAAc,CAAC,aAAa,EAAE;YACzE,OAAO,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC;SAClF;IACL,CAAC;IAKD,sBAAW,oCAAS;QAHpB;;WAEG;aACH;YACI,IAAI,OAAO,GAAG,KAAK,CAAC;YACpB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,UAAC,KAAK;gBAClD,OAAO,GAAG,OAAO,IAAI,KAAK,CAAC,SAAS,CAAC;YACzC,CAAC,CAAC,CAAC;YACH,OAAO,OAAO,CAAC;QACnB,CAAC;;;OAAA;IAoDD,sBAAW,iEAAsC;aAOjD;YACI,OAAO,IAAI,CAAC,MAAM,CAAC,sCAAsC,CAAC;QAC9D,CAAC;aATD,UAAkD,KAAc;YAC5D,IAAI,IAAI,CAAC,MAAM,EAAE;gBACb,IAAI,CAAC,MAAM,CAAC,sCAAsC,GAAG,KAAK,CAAC;gBAC3D,IAAI,CAAC,MAAM,CAAC,sCAAsC,GAAG,KAAK,CAAC;gBAC3D,IAAI,CAAC,MAAM,CAAC,sCAAsC,GAAG,KAAK,CAAC;aAC9D;QACL,CAAC;;;OAAA;IAQD,sBAAW,uCAAY;aAOvB;YACI,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;QACpC,CAAC;QAZD;;WAEG;aACH,UAAwB,KAAa;YACjC,IAAI,IAAI,CAAC,MAAM,EAAE;gBACb,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,KAAK,CAAC;gBACjC,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,KAAK,CAAC;gBACjC,IAAI,CAAC,MAAM,CAAC,YAAY,GAAG,KAAK,CAAC;aACpC;QACL,CAAC;;;OAAA;IAQD,sBAAW,qCAAU;aAOrB;YACI,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;QAClC,CAAC;QAZD;;WAEG;aACH,UAAsB,KAAa;YAC/B,IAAI,IAAI,CAAC,MAAM,EAAE;gBACb,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,KAAK,CAAC;gBAC/B,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,KAAK,CAAC;gBAC/B,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,KAAK,CAAC;aAClC;QACL,CAAC;;;OAAA;IAKD;;;;OAIG;IACI,sCAAc,GAArB,UAAsB,IAAU,EAAE,KAAqB;QACnD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC1C,CAAC;IAED;;OAEG;IACI,+BAAO,GAAd;QAAA,iBASC;QARG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACtB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACtB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACtB,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,CAAC;QACnC,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC;QACjC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,UAAC,GAAG;YAC1B,KAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;OAEG;IACI,qCAAa,GAApB;QACI,MAAM,CAAC,KAAK,CACR,gKAAgK,CACnK,CAAC;IACN,CAAC;IACL,oBAAC;AAAD,CAAC,AAnMD,CAAmC,KAAK,GAmMvC","sourcesContent":["import { Logger } from \"../Misc/logger\";\r\nimport type { Observer } from \"../Misc/observable\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport type { Nullable } from \"../types\";\r\nimport { Vector3 } from \"../Maths/math.vector\";\r\nimport { Color3 } from \"../Maths/math.color\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { Mesh } from \"../Meshes/mesh\";\r\nimport type { GizmoAxisCache } from \"./gizmo\";\r\nimport { Gizmo } from \"./gizmo\";\r\nimport { PlaneRotationGizmo } from \"./planeRotationGizmo\";\r\nimport { UtilityLayerRenderer } from \"../Rendering/utilityLayerRenderer\";\r\nimport type { Node } from \"../node\";\r\nimport type { PointerInfo } from \"../Events/pointerEvents\";\r\nimport type { TransformNode } from \"../Meshes/transformNode\";\r\nimport type { GizmoManager } from \"./gizmoManager\";\r\n\r\n/**\r\n * Options for each individual plane rotation gizmo contained within RotationGizmo\r\n * @since 5.0.0\r\n */\r\nexport interface PlaneRotationGizmoOptions {\r\n /**\r\n * Color to use for the plane rotation gizmo\r\n */\r\n color?: Color3;\r\n}\r\n\r\n/**\r\n * Additional options for each rotation gizmo\r\n */\r\nexport interface RotationGizmoOptions {\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 /**\r\n * Specific options for xGizmo\r\n */\r\n xOptions?: PlaneRotationGizmoOptions;\r\n\r\n /**\r\n * Specific options for yGizmo\r\n */\r\n yOptions?: PlaneRotationGizmoOptions;\r\n\r\n /**\r\n * Specific options for zGizmo\r\n */\r\n zOptions?: PlaneRotationGizmoOptions;\r\n}\r\n\r\n/**\r\n * Gizmo that enables rotating a mesh along 3 axis\r\n */\r\nexport class RotationGizmo extends Gizmo {\r\n /**\r\n * Internal gizmo used for interactions on the x axis\r\n */\r\n public xGizmo: PlaneRotationGizmo;\r\n /**\r\n * Internal gizmo used for interactions on the y axis\r\n */\r\n public yGizmo: PlaneRotationGizmo;\r\n /**\r\n * Internal gizmo used for interactions on the z axis\r\n */\r\n public zGizmo: PlaneRotationGizmo;\r\n\r\n /** Fires an event when any of it's sub gizmos are dragged */\r\n public onDragStartObservable = new Observable();\r\n /** Fires an event when any of it's sub gizmos are released from dragging */\r\n public onDragEndObservable = new Observable();\r\n\r\n protected _meshAttached: Nullable<AbstractMesh>;\r\n protected _nodeAttached: Nullable<Node>;\r\n protected _observables: Observer<PointerInfo>[] = [];\r\n\r\n /** Node Caching for quick lookup */\r\n protected _gizmoAxisCache: Map<Mesh, GizmoAxisCache> = new Map();\r\n\r\n public get attachedMesh() {\r\n return this._meshAttached;\r\n }\r\n public set attachedMesh(mesh: Nullable<AbstractMesh>) {\r\n this._meshAttached = mesh;\r\n this._nodeAttached = mesh;\r\n this._checkBillboardTransform();\r\n [this.xGizmo, this.yGizmo, this.zGizmo].forEach((gizmo) => {\r\n if (gizmo.isEnabled) {\r\n gizmo.attachedMesh = mesh;\r\n } else {\r\n gizmo.attachedMesh = null;\r\n }\r\n });\r\n }\r\n\r\n public get attachedNode() {\r\n return this._nodeAttached;\r\n }\r\n public set attachedNode(node: Nullable<Node>) {\r\n this._meshAttached = null;\r\n this._nodeAttached = node;\r\n this._checkBillboardTransform();\r\n [this.xGizmo, this.yGizmo, this.zGizmo].forEach((gizmo) => {\r\n if (gizmo.isEnabled) {\r\n gizmo.attachedNode = node;\r\n } else {\r\n gizmo.attachedNode = null;\r\n }\r\n });\r\n }\r\n\r\n protected _checkBillboardTransform() {\r\n if (this._nodeAttached && (<TransformNode>this._nodeAttached).billboardMode) {\r\n console.log(\"Rotation Gizmo will not work with transforms in billboard mode.\");\r\n }\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 [this.xGizmo, this.yGizmo, this.zGizmo].forEach((gizmo) => {\r\n hovered = hovered || gizmo.isHovered;\r\n });\r\n return hovered;\r\n }\r\n\r\n /**\r\n * Creates a RotationGizmo\r\n * @param gizmoLayer The utility layer the gizmo will be added to\r\n * @param tessellation Amount of tessellation to be used when creating rotation circles\r\n * @param useEulerRotation Use and update Euler angle instead of quaternion\r\n * @param thickness display gizmo axis thickness\r\n * @param gizmoManager Gizmo manager\r\n * @param options More options\r\n */\r\n constructor(\r\n gizmoLayer: UtilityLayerRenderer = UtilityLayerRenderer.DefaultUtilityLayer,\r\n tessellation = 32,\r\n useEulerRotation = false,\r\n thickness: number = 1,\r\n gizmoManager?: GizmoManager,\r\n options?: RotationGizmoOptions\r\n ) {\r\n super(gizmoLayer);\r\n const xColor = options && options.xOptions && options.xOptions.color ? options.xOptions.color : Color3.Red().scale(0.5);\r\n const yColor = options && options.yOptions && options.yOptions.color ? options.yOptions.color : Color3.Green().scale(0.5);\r\n const zColor = options && options.zOptions && options.zOptions.color ? options.zOptions.color : Color3.Blue().scale(0.5);\r\n this.xGizmo = new PlaneRotationGizmo(new Vector3(1, 0, 0), xColor, gizmoLayer, tessellation, this, useEulerRotation, thickness);\r\n this.yGizmo = new PlaneRotationGizmo(new Vector3(0, 1, 0), yColor, gizmoLayer, tessellation, this, useEulerRotation, thickness);\r\n this.zGizmo = new PlaneRotationGizmo(new Vector3(0, 0, 1), zColor, gizmoLayer, tessellation, this, useEulerRotation, thickness);\r\n // Relay drag events and set update scale\r\n [this.xGizmo, this.yGizmo, this.zGizmo].forEach((gizmo) => {\r\n //must set updateScale on each gizmo, as setting it on root RotationGizmo doesnt prevent individual gizmos from updating\r\n //currently updateScale is a property with no getter/setter, so no good way to override behavior at runtime, so we will at least set it on startup\r\n if (options && options.updateScale != undefined) {\r\n gizmo.updateScale = options.updateScale;\r\n }\r\n gizmo.dragBehavior.onDragStartObservable.add(() => {\r\n this.onDragStartObservable.notifyObservers({});\r\n });\r\n gizmo.dragBehavior.onDragEndObservable.add(() => {\r\n this.onDragEndObservable.notifyObservers({});\r\n });\r\n });\r\n\r\n this.attachedMesh = null;\r\n this.attachedNode = null;\r\n\r\n if (gizmoManager) {\r\n gizmoManager.addToAxisCache(this._gizmoAxisCache);\r\n } else {\r\n // Only subscribe to pointer event if gizmoManager isnt\r\n Gizmo.GizmoAxisPointerObserver(gizmoLayer, this._gizmoAxisCache);\r\n }\r\n }\r\n\r\n public set updateGizmoRotationToMatchAttachedMesh(value: boolean) {\r\n if (this.xGizmo) {\r\n this.xGizmo.updateGizmoRotationToMatchAttachedMesh = value;\r\n this.yGizmo.updateGizmoRotationToMatchAttachedMesh = value;\r\n this.zGizmo.updateGizmoRotationToMatchAttachedMesh = value;\r\n }\r\n }\r\n public get updateGizmoRotationToMatchAttachedMesh() {\r\n return this.xGizmo.updateGizmoRotationToMatchAttachedMesh;\r\n }\r\n\r\n /**\r\n * Drag distance in babylon units that the gizmo will snap to when dragged (Default: 0)\r\n */\r\n public set snapDistance(value: number) {\r\n if (this.xGizmo) {\r\n this.xGizmo.snapDistance = value;\r\n this.yGizmo.snapDistance = value;\r\n this.zGizmo.snapDistance = value;\r\n }\r\n }\r\n public get snapDistance() {\r\n return this.xGizmo.snapDistance;\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 if (this.xGizmo) {\r\n this.xGizmo.scaleRatio = value;\r\n this.yGizmo.scaleRatio = value;\r\n this.zGizmo.scaleRatio = value;\r\n }\r\n }\r\n public get scaleRatio() {\r\n return this.xGizmo.scaleRatio;\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 mesh Axis gizmo mesh\r\n * @param cache Gizmo axis definition used for reactive gizmo UI\r\n */\r\n public addToAxisCache(mesh: Mesh, cache: GizmoAxisCache) {\r\n this._gizmoAxisCache.set(mesh, cache);\r\n }\r\n\r\n /**\r\n * Disposes of the gizmo\r\n */\r\n public dispose() {\r\n this.xGizmo.dispose();\r\n this.yGizmo.dispose();\r\n this.zGizmo.dispose();\r\n this.onDragStartObservable.clear();\r\n this.onDragEndObservable.clear();\r\n this._observables.forEach((obs) => {\r\n this.gizmoLayer.utilityLayerScene.onPointerObservable.remove(obs);\r\n });\r\n }\r\n\r\n /**\r\n * CustomMeshes are not supported by this gizmo\r\n */\r\n public setCustomMesh() {\r\n Logger.Error(\r\n \"Custom meshes are not supported on this gizmo, please set the custom meshes on the gizmos contained within this one (gizmo.xGizmo, gizmo.yGizmo, gizmo.zGizmo)\"\r\n );\r\n }\r\n}\r\n"]}
@@ -1,3 +1,4 @@
1
+ import type { Observer } from "../Misc/observable";
1
2
  import { Observable } from "../Misc/observable";
2
3
  import type { Nullable } from "../types";
3
4
  import type { AbstractMesh } from "../Meshes/abstractMesh";
@@ -7,6 +8,8 @@ import { AxisScaleGizmo } from "./axisScaleGizmo";
7
8
  import { UtilityLayerRenderer } from "../Rendering/utilityLayerRenderer";
8
9
  import type { Mesh } from "../Meshes/mesh";
9
10
  import type { Node } from "../node";
11
+ import type { PointerInfo } from "../Events/pointerEvents";
12
+ import { StandardMaterial } from "../Materials/standardMaterial";
10
13
  import type { GizmoManager } from "./gizmoManager";
11
14
  /**
12
15
  * Gizmo that enables scaling a mesh along 3 axis
@@ -28,18 +31,18 @@ export declare class ScaleGizmo extends Gizmo {
28
31
  * Internal gizmo used to scale all axis equally
29
32
  */
30
33
  uniformScaleGizmo: AxisScaleGizmo;
31
- private _meshAttached;
32
- private _nodeAttached;
33
- private _snapDistance;
34
- private _uniformScalingMesh;
35
- private _octahedron;
36
- private _sensitivity;
37
- private _coloredMaterial;
38
- private _hoverMaterial;
39
- private _disableMaterial;
40
- private _observables;
34
+ protected _meshAttached: Nullable<AbstractMesh>;
35
+ protected _nodeAttached: Nullable<Node>;
36
+ protected _snapDistance: number;
37
+ protected _uniformScalingMesh: Mesh;
38
+ protected _octahedron: Mesh;
39
+ protected _sensitivity: number;
40
+ protected _coloredMaterial: StandardMaterial;
41
+ protected _hoverMaterial: StandardMaterial;
42
+ protected _disableMaterial: StandardMaterial;
43
+ protected _observables: Observer<PointerInfo>[];
41
44
  /** Node Caching for quick lookup */
42
- private _gizmoAxisCache;
45
+ protected _gizmoAxisCache: Map<Mesh, GizmoAxisCache>;
43
46
  /** Fires an event when any of it's sub gizmos are dragged */
44
47
  onDragStartObservable: Observable<unknown>;
45
48
  /** Fires an event when any of it's sub gizmos are released from dragging */
@@ -60,7 +63,7 @@ export declare class ScaleGizmo extends Gizmo {
60
63
  */
61
64
  constructor(gizmoLayer?: UtilityLayerRenderer, thickness?: number, gizmoManager?: GizmoManager);
62
65
  /** Create Geometry for Gizmo */
63
- private _createUniformScaleMesh;
66
+ protected _createUniformScaleMesh(): AxisScaleGizmo;
64
67
  set updateGizmoRotationToMatchAttachedMesh(value: boolean);
65
68
  get updateGizmoRotationToMatchAttachedMesh(): boolean;
66
69
  /**