@babylonjs/core 5.17.1 → 5.20.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 (159) hide show
  1. package/Debug/debugLayer.d.ts +36 -0
  2. package/Debug/debugLayer.js.map +1 -1
  3. package/DeviceInput/InputDevices/deviceSource.d.ts +1 -1
  4. package/DeviceInput/InputDevices/deviceSource.js.map +1 -1
  5. package/DeviceInput/InputDevices/deviceSourceManager.d.ts +1 -1
  6. package/DeviceInput/InputDevices/deviceSourceManager.js +1 -1
  7. package/DeviceInput/InputDevices/deviceSourceManager.js.map +1 -1
  8. package/DeviceInput/{Helpers/eventFactory.d.ts → eventFactory.d.ts} +4 -4
  9. package/DeviceInput/{Helpers/eventFactory.js → eventFactory.js} +2 -2
  10. package/DeviceInput/eventFactory.js.map +1 -0
  11. package/DeviceInput/{InputDevices/inputInterfaces.d.ts → inputInterfaces.d.ts} +2 -2
  12. package/DeviceInput/{InputDevices/inputInterfaces.js → inputInterfaces.js} +0 -0
  13. package/DeviceInput/inputInterfaces.js.map +1 -0
  14. package/DeviceInput/{InputDevices/internalDeviceSourceManager.d.ts → internalDeviceSourceManager.d.ts} +7 -7
  15. package/DeviceInput/{InputDevices/internalDeviceSourceManager.js → internalDeviceSourceManager.js} +2 -2
  16. package/DeviceInput/internalDeviceSourceManager.js.map +1 -0
  17. package/DeviceInput/{InputDevices/nativeDeviceInputSystem.d.ts → nativeDeviceInputSystem.d.ts} +2 -2
  18. package/DeviceInput/{InputDevices/nativeDeviceInputSystem.js → nativeDeviceInputSystem.js} +2 -2
  19. package/DeviceInput/nativeDeviceInputSystem.js.map +1 -0
  20. package/DeviceInput/{InputDevices/webDeviceInputSystem.d.ts → webDeviceInputSystem.d.ts} +3 -3
  21. package/DeviceInput/{InputDevices/webDeviceInputSystem.js → webDeviceInputSystem.js} +4 -4
  22. package/DeviceInput/webDeviceInputSystem.js.map +1 -0
  23. package/Engines/Extensions/engine.query.js +5 -1
  24. package/Engines/Extensions/engine.query.js.map +1 -1
  25. package/Engines/Extensions/engine.transformFeedback.js +5 -1
  26. package/Engines/Extensions/engine.transformFeedback.js.map +1 -1
  27. package/Engines/Extensions/engine.views.d.ts +13 -0
  28. package/Engines/Extensions/engine.views.js +16 -1
  29. package/Engines/Extensions/engine.views.js.map +1 -1
  30. package/Engines/Native/nativeInterfaces.d.ts +1 -1
  31. package/Engines/Native/nativeInterfaces.js.map +1 -1
  32. package/Engines/engine.d.ts +15 -240
  33. package/Engines/engineFeatures.d.ts +2 -0
  34. package/Engines/engineFeatures.js.map +1 -1
  35. package/Engines/nativeEngine.js +1 -0
  36. package/Engines/nativeEngine.js.map +1 -1
  37. package/Engines/nullEngine.js +1 -0
  38. package/Engines/nullEngine.js.map +1 -1
  39. package/Engines/thinEngine.d.ts +1 -1
  40. package/Engines/thinEngine.js +14 -4
  41. package/Engines/thinEngine.js.map +1 -1
  42. package/Engines/webgpuEngine.js +1 -0
  43. package/Engines/webgpuEngine.js.map +1 -1
  44. package/Gizmos/axisDragGizmo.d.ts +31 -9
  45. package/Gizmos/axisDragGizmo.js.map +1 -1
  46. package/Gizmos/axisScaleGizmo.d.ts +46 -14
  47. package/Gizmos/axisScaleGizmo.js.map +1 -1
  48. package/Gizmos/boundingBoxGizmo.d.ts +94 -19
  49. package/Gizmos/boundingBoxGizmo.js.map +1 -1
  50. package/Gizmos/cameraGizmo.d.ts +23 -6
  51. package/Gizmos/cameraGizmo.js.map +1 -1
  52. package/Gizmos/gizmo.d.ts +48 -6
  53. package/Gizmos/gizmo.js.map +1 -1
  54. package/Gizmos/gizmoManager.d.ts +25 -17
  55. package/Gizmos/gizmoManager.js.map +1 -1
  56. package/Gizmos/lightGizmo.d.ts +25 -8
  57. package/Gizmos/lightGizmo.js.map +1 -1
  58. package/Gizmos/planeDragGizmo.d.ts +30 -9
  59. package/Gizmos/planeDragGizmo.js.map +1 -1
  60. package/Gizmos/planeRotationGizmo.d.ts +45 -15
  61. package/Gizmos/planeRotationGizmo.js.map +1 -1
  62. package/Gizmos/positionGizmo.d.ts +53 -17
  63. package/Gizmos/positionGizmo.js +1 -1
  64. package/Gizmos/positionGizmo.js.map +1 -1
  65. package/Gizmos/rotationGizmo.d.ts +35 -10
  66. package/Gizmos/rotationGizmo.js.map +1 -1
  67. package/Gizmos/scaleGizmo.d.ts +49 -18
  68. package/Gizmos/scaleGizmo.js.map +1 -1
  69. package/Loading/Plugins/babylonFileLoader.js +16 -4
  70. package/Loading/Plugins/babylonFileLoader.js.map +1 -1
  71. package/Materials/Node/Blocks/Fragment/heightToNormalBlock.d.ts +39 -0
  72. package/Materials/Node/Blocks/Fragment/heightToNormalBlock.js +97 -0
  73. package/Materials/Node/Blocks/Fragment/heightToNormalBlock.js.map +1 -0
  74. package/Materials/Node/Blocks/Fragment/index.d.ts +1 -0
  75. package/Materials/Node/Blocks/Fragment/index.js +1 -0
  76. package/Materials/Node/Blocks/Fragment/index.js.map +1 -1
  77. package/Materials/Node/Blocks/Vertex/lightInformationBlock.d.ts +18 -0
  78. package/Materials/Node/Blocks/Vertex/lightInformationBlock.js +85 -1
  79. package/Materials/Node/Blocks/Vertex/lightInformationBlock.js.map +1 -1
  80. package/Materials/Node/nodeMaterial.d.ts +6 -0
  81. package/Materials/Node/nodeMaterial.js +11 -0
  82. package/Materials/Node/nodeMaterial.js.map +1 -1
  83. package/Materials/Textures/Procedurals/proceduralTexture.js +5 -1
  84. package/Materials/Textures/Procedurals/proceduralTexture.js.map +1 -1
  85. package/Materials/Textures/renderTargetTexture.js +3 -0
  86. package/Materials/Textures/renderTargetTexture.js.map +1 -1
  87. package/Materials/Textures/texture.js +9 -5
  88. package/Materials/Textures/texture.js.map +1 -1
  89. package/Materials/index.d.ts +1 -0
  90. package/Materials/index.js +1 -0
  91. package/Materials/index.js.map +1 -1
  92. package/Maths/math.vector.d.ts +134 -8
  93. package/Maths/math.vector.js +168 -36
  94. package/Maths/math.vector.js.map +1 -1
  95. package/Meshes/Compression/dracoCompression.js +1 -1
  96. package/Meshes/Compression/dracoCompression.js.map +1 -1
  97. package/Meshes/groundMesh.js +1 -1
  98. package/Meshes/groundMesh.js.map +1 -1
  99. package/Meshes/mesh.js +1 -0
  100. package/Meshes/mesh.js.map +1 -1
  101. package/Meshes/transformNode.js +1 -0
  102. package/Meshes/transformNode.js.map +1 -1
  103. package/Misc/assetsManager.d.ts +9 -0
  104. package/Misc/assetsManager.js +3 -1
  105. package/Misc/assetsManager.js.map +1 -1
  106. package/Misc/basis.js +10 -4
  107. package/Misc/basis.js.map +1 -1
  108. package/Misc/computePressure.d.ts +9 -3
  109. package/Misc/computePressure.js +13 -5
  110. package/Misc/computePressure.js.map +1 -1
  111. package/Misc/fileTools.js +2 -2
  112. package/Misc/fileTools.js.map +1 -1
  113. package/Misc/iInspectable.d.ts +12 -2
  114. package/Misc/iInspectable.js +4 -0
  115. package/Misc/iInspectable.js.map +1 -1
  116. package/Misc/khronosTextureContainer2.js +1 -1
  117. package/Misc/khronosTextureContainer2.js.map +1 -1
  118. package/Misc/sceneSerializer.js +1 -1
  119. package/Misc/sceneSerializer.js.map +1 -1
  120. package/Misc/tools.d.ts +2 -2
  121. package/Misc/tools.js +4 -1
  122. package/Misc/tools.js.map +1 -1
  123. package/Offline/database.js +6 -8
  124. package/Offline/database.js.map +1 -1
  125. package/Particles/solidParticleSystem.d.ts +1 -0
  126. package/Particles/solidParticleSystem.js +4 -1
  127. package/Particles/solidParticleSystem.js.map +1 -1
  128. package/Physics/Plugins/ammoJSPlugin.d.ts +2 -2
  129. package/Physics/Plugins/ammoJSPlugin.js +29 -29
  130. package/Physics/Plugins/ammoJSPlugin.js.map +1 -1
  131. package/Physics/Plugins/cannonJSPlugin.d.ts +2 -2
  132. package/Physics/Plugins/cannonJSPlugin.js +26 -26
  133. package/Physics/Plugins/cannonJSPlugin.js.map +1 -1
  134. package/Physics/Plugins/oimoJSPlugin.js +9 -11
  135. package/Physics/Plugins/oimoJSPlugin.js.map +1 -1
  136. package/Physics/physicsImpostor.d.ts +6 -6
  137. package/Physics/physicsImpostor.js +15 -8
  138. package/Physics/physicsImpostor.js.map +1 -1
  139. package/Shaders/sprites.fragment.js +1 -1
  140. package/Shaders/sprites.fragment.js.map +1 -1
  141. package/Sprites/spriteRenderer.js +1 -1
  142. package/Sprites/spriteRenderer.js.map +1 -1
  143. package/XR/webXRDefaultExperience.d.ts +10 -0
  144. package/XR/webXRDefaultExperience.js +2 -12
  145. package/XR/webXRDefaultExperience.js.map +1 -1
  146. package/XR/webXRExperienceHelper.js +12 -12
  147. package/XR/webXRExperienceHelper.js.map +1 -1
  148. package/node.d.ts +2 -0
  149. package/node.js +2 -0
  150. package/node.js.map +1 -1
  151. package/package.json +1 -1
  152. package/scene.d.ts +1 -1
  153. package/scene.js +5 -3
  154. package/scene.js.map +1 -1
  155. package/DeviceInput/Helpers/eventFactory.js.map +0 -1
  156. package/DeviceInput/InputDevices/inputInterfaces.js.map +0 -1
  157. package/DeviceInput/InputDevices/internalDeviceSourceManager.js.map +0 -1
  158. package/DeviceInput/InputDevices/nativeDeviceInputSystem.js.map +0 -1
  159. package/DeviceInput/InputDevices/webDeviceInputSystem.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"gizmo.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Gizmos/gizmo.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Observer } from \"../Misc/observable\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { WebVRFreeCamera } from \"../Cameras/VR/webVRCamera\";\r\nimport type { Scene, IDisposable } from \"../scene\";\r\nimport { Quaternion, Vector3, Matrix } from \"../Maths/math.vector\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\nimport type { TargetCamera } from \"../Cameras/targetCamera\";\r\nimport type { Node } from \"../node\";\r\nimport type { Bone } from \"../Bones/bone\";\r\nimport { UtilityLayerRenderer } from \"../Rendering/utilityLayerRenderer\";\r\nimport type { TransformNode } from \"../Meshes/transformNode\";\r\nimport type { StandardMaterial } from \"../Materials/standardMaterial\";\r\nimport type { PointerInfo } from \"../Events/pointerEvents\";\r\nimport { PointerEventTypes } from \"../Events/pointerEvents\";\r\nimport type { LinesMesh } from \"../Meshes/linesMesh\";\r\nimport type { PointerDragBehavior } from \"../Behaviors/Meshes/pointerDragBehavior\";\r\nimport type { ShadowLight } from \"../Lights/shadowLight\";\r\nimport { Light } from \"../Lights/light\";\r\n\r\n/**\r\n * Cache built by each axis. Used for managing state between all elements of gizmo for enhanced UI\r\n */\r\nexport interface GizmoAxisCache {\r\n /** Mesh used to render the Gizmo */\r\n gizmoMeshes: Mesh[];\r\n /** Mesh used to detect user interaction with Gizmo */\r\n colliderMeshes: Mesh[];\r\n /** Material used to indicate color of gizmo mesh */\r\n material: StandardMaterial;\r\n /** Material used to indicate hover state of the Gizmo */\r\n hoverMaterial: StandardMaterial;\r\n /** Material used to indicate disabled state of the Gizmo */\r\n disableMaterial: StandardMaterial;\r\n /** Used to indicate Active state of the Gizmo */\r\n active: boolean;\r\n /** DragBehavior */\r\n dragBehavior: PointerDragBehavior;\r\n}\r\n/**\r\n * Renders gizmos on top of an existing scene which provide controls for position, rotation, etc.\r\n */\r\nexport class Gizmo implements IDisposable {\r\n /**\r\n * The root mesh of the gizmo\r\n */\r\n public _rootMesh: Mesh;\r\n private _attachedMesh: Nullable<AbstractMesh> = null;\r\n private _attachedNode: Nullable<Node> = null;\r\n private _customRotationQuaternion: Nullable<Quaternion> = null;\r\n /**\r\n * Ratio for the scale of the gizmo (Default: 1)\r\n */\r\n protected _scaleRatio = 1;\r\n\r\n /**\r\n * boolean updated by pointermove when a gizmo mesh is hovered\r\n */\r\n protected _isHovered = false;\r\n\r\n /**\r\n * When enabled, any gizmo operation will perserve scaling sign. Default is off.\r\n * Only valid for TransformNode derived classes (Mesh, AbstractMesh, ...)\r\n */\r\n public static PreserveScaling = false;\r\n\r\n /**\r\n * Ratio for the scale of the gizmo (Default: 1)\r\n */\r\n public set scaleRatio(value: number) {\r\n this._scaleRatio = value;\r\n }\r\n\r\n public get scaleRatio() {\r\n return this._scaleRatio;\r\n }\r\n\r\n /**\r\n * True when the mouse pointer is hovered a gizmo mesh\r\n */\r\n public get isHovered() {\r\n return this._isHovered;\r\n }\r\n\r\n /**\r\n * If a custom mesh has been set (Default: false)\r\n */\r\n protected _customMeshSet = false;\r\n /**\r\n * Mesh that the gizmo will be attached to. (eg. on a drag gizmo the mesh that will be dragged)\r\n * * When set, interactions will be enabled\r\n */\r\n public get attachedMesh() {\r\n return this._attachedMesh;\r\n }\r\n public set attachedMesh(value) {\r\n this._attachedMesh = value;\r\n if (value) {\r\n this._attachedNode = value;\r\n }\r\n this._rootMesh.setEnabled(value ? true : false);\r\n this._attachedNodeChanged(value);\r\n }\r\n /**\r\n * Node that the gizmo will be attached to. (eg. on a drag gizmo the mesh, bone or NodeTransform that will be dragged)\r\n * * When set, interactions will be enabled\r\n */\r\n public get attachedNode() {\r\n return this._attachedNode;\r\n }\r\n public set attachedNode(value) {\r\n this._attachedNode = value;\r\n this._attachedMesh = null;\r\n this._rootMesh.setEnabled(value ? true : false);\r\n this._attachedNodeChanged(value);\r\n }\r\n\r\n /**\r\n * Disposes and replaces the current meshes in the gizmo with the specified mesh\r\n * @param mesh The mesh to replace the default mesh of the gizmo\r\n */\r\n public setCustomMesh(mesh: Mesh) {\r\n if (mesh.getScene() != this.gizmoLayer.utilityLayerScene) {\r\n throw \"When setting a custom mesh on a gizmo, the custom meshes scene must be the same as the gizmos (eg. gizmo.gizmoLayer.utilityLayerScene)\";\r\n }\r\n this._rootMesh.getChildMeshes().forEach((c) => {\r\n c.dispose();\r\n });\r\n mesh.parent = this._rootMesh;\r\n this._customMeshSet = true;\r\n }\r\n\r\n protected _updateGizmoRotationToMatchAttachedMesh = true;\r\n\r\n /**\r\n * If set the gizmo's rotation will be updated to match the attached mesh each frame (Default: true)\r\n */\r\n public set updateGizmoRotationToMatchAttachedMesh(value: boolean) {\r\n this._updateGizmoRotationToMatchAttachedMesh = value;\r\n }\r\n public get updateGizmoRotationToMatchAttachedMesh() {\r\n return this._updateGizmoRotationToMatchAttachedMesh;\r\n }\r\n /**\r\n * If set the gizmo's position will be updated to match the attached mesh each frame (Default: true)\r\n */\r\n public updateGizmoPositionToMatchAttachedMesh = true;\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 public updateScale = true;\r\n protected _interactionsEnabled = true;\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n protected _attachedNodeChanged(value: Nullable<Node>) {}\r\n\r\n private _beforeRenderObserver: Nullable<Observer<Scene>>;\r\n private _tempQuaternion = new Quaternion(0, 0, 0, 1);\r\n private _tempVector = new Vector3();\r\n private _tempVector2 = new Vector3();\r\n private _tempMatrix1 = new Matrix();\r\n private _tempMatrix2 = new Matrix();\r\n private _rightHandtoLeftHandMatrix = Matrix.RotationY(Math.PI);\r\n\r\n /**\r\n * Creates a gizmo\r\n * @param gizmoLayer The utility layer the gizmo will be added to\r\n */\r\n constructor(\r\n /** The utility layer the gizmo will be added to */\r\n public gizmoLayer: UtilityLayerRenderer = UtilityLayerRenderer.DefaultUtilityLayer\r\n ) {\r\n this._rootMesh = new Mesh(\"gizmoRootNode\", gizmoLayer.utilityLayerScene);\r\n this._rootMesh.rotationQuaternion = Quaternion.Identity();\r\n\r\n this._beforeRenderObserver = this.gizmoLayer.utilityLayerScene.onBeforeRenderObservable.add(() => {\r\n this._update();\r\n });\r\n }\r\n\r\n /**\r\n * posture that the gizmo will be display\r\n * When set null, default value will be used (Quaternion(0, 0, 0, 1))\r\n */\r\n public get customRotationQuaternion(): Nullable<Quaternion> {\r\n return this._customRotationQuaternion;\r\n }\r\n\r\n public set customRotationQuaternion(customRotationQuaternion: Nullable<Quaternion>) {\r\n this._customRotationQuaternion = customRotationQuaternion;\r\n }\r\n\r\n /**\r\n * Updates the gizmo to match the attached mesh's position/rotation\r\n */\r\n protected _update() {\r\n if (this.attachedNode) {\r\n let effectiveNode = this.attachedNode;\r\n if (this.attachedMesh) {\r\n effectiveNode = this.attachedMesh || this.attachedNode;\r\n }\r\n\r\n // Position\r\n if (this.updateGizmoPositionToMatchAttachedMesh) {\r\n const row = effectiveNode.getWorldMatrix().getRow(3);\r\n const position = row ? row.toVector3() : new Vector3(0, 0, 0);\r\n this._rootMesh.position.copyFrom(position);\r\n }\r\n\r\n // Rotation\r\n if (this.updateGizmoRotationToMatchAttachedMesh) {\r\n const supportedNode =\r\n (<Mesh>effectiveNode)._isMesh ||\r\n effectiveNode.getClassName() === \"AbstractMesh\" ||\r\n effectiveNode.getClassName() === \"TransformNode\" ||\r\n effectiveNode.getClassName() === \"InstancedMesh\";\r\n const transformNode = supportedNode ? (effectiveNode as TransformNode) : undefined;\r\n effectiveNode.getWorldMatrix().decompose(undefined, this._rootMesh.rotationQuaternion!, undefined, Gizmo.PreserveScaling ? transformNode : undefined);\r\n } else {\r\n if (this._customRotationQuaternion) {\r\n this._rootMesh.rotationQuaternion!.copyFrom(this._customRotationQuaternion);\r\n } else {\r\n this._rootMesh.rotationQuaternion!.set(0, 0, 0, 1);\r\n }\r\n }\r\n\r\n // Scale\r\n if (this.updateScale) {\r\n const activeCamera = this.gizmoLayer.utilityLayerScene.activeCamera!;\r\n let cameraPosition = activeCamera.globalPosition;\r\n if ((<WebVRFreeCamera>activeCamera).devicePosition) {\r\n cameraPosition = (<WebVRFreeCamera>activeCamera).devicePosition;\r\n }\r\n this._rootMesh.position.subtractToRef(cameraPosition, this._tempVector);\r\n const dist = this._tempVector.length() * this.scaleRatio;\r\n this._rootMesh.scaling.set(dist, dist, dist);\r\n\r\n // Account for handedness, similar to Matrix.decompose\r\n if (effectiveNode._getWorldMatrixDeterminant() < 0 && !Gizmo.PreserveScaling) {\r\n this._rootMesh.scaling.y *= -1;\r\n }\r\n } else {\r\n this._rootMesh.scaling.setAll(this.scaleRatio);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Handle position/translation when using an attached node using pivot\r\n */\r\n protected _handlePivot() {\r\n const attachedNodeTransform = this._attachedNode as any;\r\n // check there is an active pivot for the TransformNode attached\r\n if (attachedNodeTransform.isUsingPivotMatrix && attachedNodeTransform.isUsingPivotMatrix() && attachedNodeTransform.position) {\r\n // When a TransformNode has an active pivot, even without parenting,\r\n // translation from the world matrix is different from TransformNode.position.\r\n // Pivot works like a virtual parent that's using the node orientation.\r\n // As the world matrix is transformed by the gizmo and then decomposed to TRS\r\n // its translation part must be set to the Node's position.\r\n attachedNodeTransform.getWorldMatrix().setTranslation(attachedNodeTransform.position);\r\n }\r\n }\r\n /**\r\n * computes the rotation/scaling/position of the transform once the Node world matrix has changed.\r\n */\r\n protected _matrixChanged() {\r\n if (!this._attachedNode) {\r\n return;\r\n }\r\n\r\n if ((<Camera>this._attachedNode)._isCamera) {\r\n const camera = this._attachedNode as Camera;\r\n let worldMatrix;\r\n let worldMatrixUC;\r\n if (camera.parent) {\r\n const parentInv = this._tempMatrix2;\r\n camera.parent._worldMatrix.invertToRef(parentInv);\r\n this._attachedNode._worldMatrix.multiplyToRef(parentInv, this._tempMatrix1);\r\n worldMatrix = this._tempMatrix1;\r\n } else {\r\n worldMatrix = this._attachedNode._worldMatrix;\r\n }\r\n\r\n if (camera.getScene().useRightHandedSystem) {\r\n // avoid desync with RH matrix computation. Otherwise, rotation of PI around Y axis happens each frame resulting in axis flipped because worldMatrix is computed as inverse of viewMatrix.\r\n this._rightHandtoLeftHandMatrix.multiplyToRef(worldMatrix, this._tempMatrix2);\r\n worldMatrixUC = this._tempMatrix2;\r\n } else {\r\n worldMatrixUC = worldMatrix;\r\n }\r\n\r\n worldMatrixUC.decompose(this._tempVector2, this._tempQuaternion, this._tempVector);\r\n\r\n const inheritsTargetCamera =\r\n this._attachedNode.getClassName() === \"FreeCamera\" ||\r\n this._attachedNode.getClassName() === \"FlyCamera\" ||\r\n this._attachedNode.getClassName() === \"ArcFollowCamera\" ||\r\n this._attachedNode.getClassName() === \"TargetCamera\" ||\r\n this._attachedNode.getClassName() === \"TouchCamera\" ||\r\n this._attachedNode.getClassName() === \"UniversalCamera\";\r\n\r\n if (inheritsTargetCamera) {\r\n const targetCamera = this._attachedNode as TargetCamera;\r\n targetCamera.rotation = this._tempQuaternion.toEulerAngles();\r\n\r\n if (targetCamera.rotationQuaternion) {\r\n targetCamera.rotationQuaternion.copyFrom(this._tempQuaternion);\r\n targetCamera.rotationQuaternion.normalize();\r\n }\r\n }\r\n\r\n camera.position.copyFrom(this._tempVector);\r\n } else if (\r\n (<Mesh>this._attachedNode)._isMesh ||\r\n this._attachedNode.getClassName() === \"AbstractMesh\" ||\r\n this._attachedNode.getClassName() === \"TransformNode\" ||\r\n this._attachedNode.getClassName() === \"InstancedMesh\"\r\n ) {\r\n const transform = this._attachedNode as TransformNode;\r\n if (transform.parent) {\r\n const parentInv = this._tempMatrix1;\r\n const localMat = this._tempMatrix2;\r\n transform.parent.getWorldMatrix().invertToRef(parentInv);\r\n this._attachedNode.getWorldMatrix().multiplyToRef(parentInv, localMat);\r\n localMat.decompose(this._tempVector, this._tempQuaternion, transform.position, Gizmo.PreserveScaling ? transform : undefined);\r\n } else {\r\n this._attachedNode._worldMatrix.decompose(this._tempVector, this._tempQuaternion, transform.position, Gizmo.PreserveScaling ? transform : undefined);\r\n }\r\n transform.scaling.copyFrom(this._tempVector);\r\n if (!transform.billboardMode) {\r\n if (transform.rotationQuaternion) {\r\n transform.rotationQuaternion.copyFrom(this._tempQuaternion);\r\n transform.rotationQuaternion.normalize();\r\n } else {\r\n transform.rotation = this._tempQuaternion.toEulerAngles();\r\n }\r\n }\r\n } else if (this._attachedNode.getClassName() === \"Bone\") {\r\n const bone = this._attachedNode as Bone;\r\n const parent = bone.getParent();\r\n\r\n if (parent) {\r\n const invParent = this._tempMatrix1;\r\n const boneLocalMatrix = this._tempMatrix2;\r\n parent.getWorldMatrix().invertToRef(invParent);\r\n bone.getWorldMatrix().multiplyToRef(invParent, boneLocalMatrix);\r\n const lmat = bone.getLocalMatrix();\r\n lmat.copyFrom(boneLocalMatrix);\r\n } else {\r\n const lmat = bone.getLocalMatrix();\r\n lmat.copyFrom(bone.getWorldMatrix());\r\n }\r\n bone.markAsDirty();\r\n } else {\r\n const light = this._attachedNode as ShadowLight;\r\n if (light.getTypeID) {\r\n const type = light.getTypeID();\r\n if (type === Light.LIGHTTYPEID_DIRECTIONALLIGHT || type === Light.LIGHTTYPEID_SPOTLIGHT || type === Light.LIGHTTYPEID_POINTLIGHT) {\r\n const parent = light.parent;\r\n\r\n if (parent) {\r\n const invParent = this._tempMatrix1;\r\n const nodeLocalMatrix = this._tempMatrix2;\r\n parent.getWorldMatrix().invertToRef(invParent);\r\n light.getWorldMatrix().multiplyToRef(invParent, nodeLocalMatrix);\r\n nodeLocalMatrix.decompose(undefined, this._tempQuaternion, this._tempVector);\r\n } else {\r\n this._attachedNode._worldMatrix.decompose(undefined, this._tempQuaternion, this._tempVector);\r\n }\r\n // setter doesn't copy values. Need a new Vector3\r\n light.position = new Vector3(this._tempVector.x, this._tempVector.y, this._tempVector.z);\r\n if (light.direction) {\r\n light.direction = new Vector3(light.direction.x, light.direction.y, light.direction.z);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * refresh gizmo mesh material\r\n * @param gizmoMeshes\r\n * @param material material to apply\r\n */\r\n protected _setGizmoMeshMaterial(gizmoMeshes: Mesh[], material: StandardMaterial) {\r\n if (gizmoMeshes) {\r\n gizmoMeshes.forEach((m: Mesh) => {\r\n m.material = material;\r\n if ((<LinesMesh>m).color) {\r\n (<LinesMesh>m).color = material.diffuseColor;\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Subscribes to pointer up, down, and hover events. Used for responsive gizmos.\r\n * @param gizmoLayer The utility layer the gizmo will be added to\r\n * @param gizmoAxisCache Gizmo axis definition used for reactive gizmo UI\r\n * @returns {Observer<PointerInfo>} pointerObserver\r\n */\r\n public static GizmoAxisPointerObserver(gizmoLayer: UtilityLayerRenderer, gizmoAxisCache: Map<Mesh, GizmoAxisCache>): Observer<PointerInfo> {\r\n let dragging = false;\r\n\r\n const pointerObserver = gizmoLayer.utilityLayerScene.onPointerObservable.add((pointerInfo) => {\r\n if (pointerInfo.pickInfo) {\r\n // On Hover Logic\r\n if (pointerInfo.type === PointerEventTypes.POINTERMOVE) {\r\n if (dragging) {\r\n return;\r\n }\r\n gizmoAxisCache.forEach((cache) => {\r\n if (cache.colliderMeshes && cache.gizmoMeshes) {\r\n const isHovered = cache.colliderMeshes?.indexOf(pointerInfo?.pickInfo?.pickedMesh as Mesh) != -1;\r\n const material = cache.dragBehavior.enabled ? (isHovered || cache.active ? cache.hoverMaterial : cache.material) : cache.disableMaterial;\r\n cache.gizmoMeshes.forEach((m: Mesh) => {\r\n m.material = material;\r\n if ((m as LinesMesh).color) {\r\n (m as LinesMesh).color = material.diffuseColor;\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n // On Mouse Down\r\n if (pointerInfo.type === PointerEventTypes.POINTERDOWN) {\r\n // If user Clicked Gizmo\r\n if (gizmoAxisCache.has(pointerInfo.pickInfo.pickedMesh?.parent as Mesh)) {\r\n dragging = true;\r\n const statusMap = gizmoAxisCache.get(pointerInfo.pickInfo.pickedMesh?.parent as Mesh);\r\n statusMap!.active = true;\r\n gizmoAxisCache.forEach((cache) => {\r\n const isHovered = cache.colliderMeshes?.indexOf(pointerInfo?.pickInfo?.pickedMesh as Mesh) != -1;\r\n const material = (isHovered || cache.active) && cache.dragBehavior.enabled ? cache.hoverMaterial : cache.disableMaterial;\r\n cache.gizmoMeshes.forEach((m: Mesh) => {\r\n m.material = material;\r\n if ((m as LinesMesh).color) {\r\n (m as LinesMesh).color = material.diffuseColor;\r\n }\r\n });\r\n });\r\n }\r\n }\r\n\r\n // On Mouse Up\r\n if (pointerInfo.type === PointerEventTypes.POINTERUP) {\r\n gizmoAxisCache.forEach((cache) => {\r\n cache.active = false;\r\n dragging = false;\r\n cache.gizmoMeshes.forEach((m: Mesh) => {\r\n m.material = cache.dragBehavior.enabled ? cache.material : cache.disableMaterial;\r\n if ((m as LinesMesh).color) {\r\n (m as LinesMesh).color = cache.material.diffuseColor;\r\n }\r\n });\r\n });\r\n }\r\n }\r\n });\r\n\r\n return pointerObserver!;\r\n }\r\n\r\n /**\r\n * Disposes of the gizmo\r\n */\r\n public dispose() {\r\n this._rootMesh.dispose();\r\n if (this._beforeRenderObserver) {\r\n this.gizmoLayer.utilityLayerScene.onBeforeRenderObservable.remove(this._beforeRenderObserver);\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"gizmo.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Gizmos/gizmo.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Observer } from \"../Misc/observable\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { WebVRFreeCamera } from \"../Cameras/VR/webVRCamera\";\r\nimport type { Scene, IDisposable } from \"../scene\";\r\nimport { Quaternion, Vector3, Matrix } from \"../Maths/math.vector\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\nimport type { Camera } from \"../Cameras/camera\";\r\nimport type { TargetCamera } from \"../Cameras/targetCamera\";\r\nimport type { Node } from \"../node\";\r\nimport type { Bone } from \"../Bones/bone\";\r\nimport { UtilityLayerRenderer } from \"../Rendering/utilityLayerRenderer\";\r\nimport type { TransformNode } from \"../Meshes/transformNode\";\r\nimport type { StandardMaterial } from \"../Materials/standardMaterial\";\r\nimport type { PointerInfo } from \"../Events/pointerEvents\";\r\nimport { PointerEventTypes } from \"../Events/pointerEvents\";\r\nimport type { LinesMesh } from \"../Meshes/linesMesh\";\r\nimport type { PointerDragBehavior } from \"../Behaviors/Meshes/pointerDragBehavior\";\r\nimport type { ShadowLight } from \"../Lights/shadowLight\";\r\nimport { Light } from \"../Lights/light\";\r\n\r\n/**\r\n * Cache built by each axis. Used for managing state between all elements of gizmo for enhanced UI\r\n */\r\nexport interface GizmoAxisCache {\r\n /** Mesh used to render the Gizmo */\r\n gizmoMeshes: Mesh[];\r\n /** Mesh used to detect user interaction with Gizmo */\r\n colliderMeshes: Mesh[];\r\n /** Material used to indicate color of gizmo mesh */\r\n material: StandardMaterial;\r\n /** Material used to indicate hover state of the Gizmo */\r\n hoverMaterial: StandardMaterial;\r\n /** Material used to indicate disabled state of the Gizmo */\r\n disableMaterial: StandardMaterial;\r\n /** Used to indicate Active state of the Gizmo */\r\n active: boolean;\r\n /** DragBehavior */\r\n dragBehavior: PointerDragBehavior;\r\n}\r\n\r\n/**\r\n * Interface for basic gizmo\r\n */\r\nexport interface IGizmo extends IDisposable {\r\n /** True when the mouse pointer is hovered a gizmo mesh */\r\n readonly isHovered: boolean;\r\n /** The root mesh of the gizmo */\r\n _rootMesh: Mesh;\r\n /** Ratio for the scale of the gizmo */\r\n scaleRatio: number;\r\n /**\r\n * Mesh that the gizmo will be attached to. (eg. on a drag gizmo the mesh that will be dragged)\r\n * * When set, interactions will be enabled\r\n */\r\n attachedMesh: Nullable<AbstractMesh>;\r\n /**\r\n * Node that the gizmo will be attached to. (eg. on a drag gizmo the mesh, bone or NodeTransform that will be dragged)\r\n * * When set, interactions will be enabled\r\n */\r\n attachedNode: Nullable<Node>;\r\n /**\r\n * If set the gizmo's rotation will be updated to match the attached mesh each frame (Default: true)\r\n */\r\n updateGizmoRotationToMatchAttachedMesh: boolean;\r\n /** The utility layer the gizmo will be added to */\r\n gizmoLayer: UtilityLayerRenderer;\r\n /**\r\n * If set the gizmo's position will be updated to match the attached mesh each frame (Default: true)\r\n */\r\n updateGizmoPositionToMatchAttachedMesh: boolean;\r\n /**\r\n * When set, the gizmo will always appear the same size no matter where the camera is (default: true)\r\n */\r\n updateScale: boolean;\r\n /**\r\n * posture that the gizmo will be display\r\n * When set null, default value will be used (Quaternion(0, 0, 0, 1))\r\n */\r\n customRotationQuaternion: Nullable<Quaternion>;\r\n /** Disposes and replaces the current meshes in the gizmo with the specified mesh */\r\n setCustomMesh(mesh: Mesh): void;\r\n}\r\n/**\r\n * Renders gizmos on top of an existing scene which provide controls for position, rotation, etc.\r\n */\r\nexport class Gizmo implements IGizmo {\r\n /**\r\n * The root mesh of the gizmo\r\n */\r\n public _rootMesh: Mesh;\r\n protected _attachedMesh: Nullable<AbstractMesh> = null;\r\n protected _attachedNode: Nullable<Node> = null;\r\n protected _customRotationQuaternion: Nullable<Quaternion> = null;\r\n /**\r\n * Ratio for the scale of the gizmo (Default: 1)\r\n */\r\n protected _scaleRatio = 1;\r\n\r\n /**\r\n * boolean updated by pointermove when a gizmo mesh is hovered\r\n */\r\n protected _isHovered = false;\r\n\r\n /**\r\n * When enabled, any gizmo operation will perserve scaling sign. Default is off.\r\n * Only valid for TransformNode derived classes (Mesh, AbstractMesh, ...)\r\n */\r\n public static PreserveScaling = false;\r\n\r\n /**\r\n * Ratio for the scale of the gizmo (Default: 1)\r\n */\r\n public set scaleRatio(value: number) {\r\n this._scaleRatio = value;\r\n }\r\n\r\n public get scaleRatio() {\r\n return this._scaleRatio;\r\n }\r\n\r\n /**\r\n * True when the mouse pointer is hovered a gizmo mesh\r\n */\r\n public get isHovered() {\r\n return this._isHovered;\r\n }\r\n\r\n /**\r\n * If a custom mesh has been set (Default: false)\r\n */\r\n protected _customMeshSet = false;\r\n /**\r\n * Mesh that the gizmo will be attached to. (eg. on a drag gizmo the mesh that will be dragged)\r\n * * When set, interactions will be enabled\r\n */\r\n public get attachedMesh() {\r\n return this._attachedMesh;\r\n }\r\n public set attachedMesh(value) {\r\n this._attachedMesh = value;\r\n if (value) {\r\n this._attachedNode = value;\r\n }\r\n this._rootMesh.setEnabled(value ? true : false);\r\n this._attachedNodeChanged(value);\r\n }\r\n /**\r\n * Node that the gizmo will be attached to. (eg. on a drag gizmo the mesh, bone or NodeTransform that will be dragged)\r\n * * When set, interactions will be enabled\r\n */\r\n public get attachedNode() {\r\n return this._attachedNode;\r\n }\r\n public set attachedNode(value) {\r\n this._attachedNode = value;\r\n this._attachedMesh = null;\r\n this._rootMesh.setEnabled(value ? true : false);\r\n this._attachedNodeChanged(value);\r\n }\r\n\r\n /**\r\n * Disposes and replaces the current meshes in the gizmo with the specified mesh\r\n * @param mesh The mesh to replace the default mesh of the gizmo\r\n */\r\n public setCustomMesh(mesh: Mesh) {\r\n if (mesh.getScene() != this.gizmoLayer.utilityLayerScene) {\r\n throw \"When setting a custom mesh on a gizmo, the custom meshes scene must be the same as the gizmos (eg. gizmo.gizmoLayer.utilityLayerScene)\";\r\n }\r\n this._rootMesh.getChildMeshes().forEach((c) => {\r\n c.dispose();\r\n });\r\n mesh.parent = this._rootMesh;\r\n this._customMeshSet = true;\r\n }\r\n\r\n protected _updateGizmoRotationToMatchAttachedMesh = true;\r\n\r\n /**\r\n * If set the gizmo's rotation will be updated to match the attached mesh each frame (Default: true)\r\n */\r\n public set updateGizmoRotationToMatchAttachedMesh(value: boolean) {\r\n this._updateGizmoRotationToMatchAttachedMesh = value;\r\n }\r\n public get updateGizmoRotationToMatchAttachedMesh() {\r\n return this._updateGizmoRotationToMatchAttachedMesh;\r\n }\r\n /**\r\n * If set the gizmo's position will be updated to match the attached mesh each frame (Default: true)\r\n */\r\n public updateGizmoPositionToMatchAttachedMesh = true;\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 public updateScale = true;\r\n protected _interactionsEnabled = true;\r\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\r\n protected _attachedNodeChanged(value: Nullable<Node>) {}\r\n\r\n protected _beforeRenderObserver: Nullable<Observer<Scene>>;\r\n private _tempQuaternion = new Quaternion(0, 0, 0, 1);\r\n private _tempVector = new Vector3();\r\n private _tempVector2 = new Vector3();\r\n private _tempMatrix1 = new Matrix();\r\n private _tempMatrix2 = new Matrix();\r\n private _rightHandtoLeftHandMatrix = Matrix.RotationY(Math.PI);\r\n\r\n /**\r\n * Creates a gizmo\r\n * @param gizmoLayer The utility layer the gizmo will be added to\r\n */\r\n constructor(\r\n /** The utility layer the gizmo will be added to */\r\n public gizmoLayer: UtilityLayerRenderer = UtilityLayerRenderer.DefaultUtilityLayer\r\n ) {\r\n this._rootMesh = new Mesh(\"gizmoRootNode\", gizmoLayer.utilityLayerScene);\r\n this._rootMesh.rotationQuaternion = Quaternion.Identity();\r\n\r\n this._beforeRenderObserver = this.gizmoLayer.utilityLayerScene.onBeforeRenderObservable.add(() => {\r\n this._update();\r\n });\r\n }\r\n\r\n /**\r\n * posture that the gizmo will be display\r\n * When set null, default value will be used (Quaternion(0, 0, 0, 1))\r\n */\r\n public get customRotationQuaternion(): Nullable<Quaternion> {\r\n return this._customRotationQuaternion;\r\n }\r\n\r\n public set customRotationQuaternion(customRotationQuaternion: Nullable<Quaternion>) {\r\n this._customRotationQuaternion = customRotationQuaternion;\r\n }\r\n\r\n /**\r\n * Updates the gizmo to match the attached mesh's position/rotation\r\n */\r\n protected _update() {\r\n if (this.attachedNode) {\r\n let effectiveNode = this.attachedNode;\r\n if (this.attachedMesh) {\r\n effectiveNode = this.attachedMesh || this.attachedNode;\r\n }\r\n\r\n // Position\r\n if (this.updateGizmoPositionToMatchAttachedMesh) {\r\n const row = effectiveNode.getWorldMatrix().getRow(3);\r\n const position = row ? row.toVector3() : new Vector3(0, 0, 0);\r\n this._rootMesh.position.copyFrom(position);\r\n }\r\n\r\n // Rotation\r\n if (this.updateGizmoRotationToMatchAttachedMesh) {\r\n const supportedNode =\r\n (<Mesh>effectiveNode)._isMesh ||\r\n effectiveNode.getClassName() === \"AbstractMesh\" ||\r\n effectiveNode.getClassName() === \"TransformNode\" ||\r\n effectiveNode.getClassName() === \"InstancedMesh\";\r\n const transformNode = supportedNode ? (effectiveNode as TransformNode) : undefined;\r\n effectiveNode.getWorldMatrix().decompose(undefined, this._rootMesh.rotationQuaternion!, undefined, Gizmo.PreserveScaling ? transformNode : undefined);\r\n } else {\r\n if (this._customRotationQuaternion) {\r\n this._rootMesh.rotationQuaternion!.copyFrom(this._customRotationQuaternion);\r\n } else {\r\n this._rootMesh.rotationQuaternion!.set(0, 0, 0, 1);\r\n }\r\n }\r\n\r\n // Scale\r\n if (this.updateScale) {\r\n const activeCamera = this.gizmoLayer.utilityLayerScene.activeCamera!;\r\n let cameraPosition = activeCamera.globalPosition;\r\n if ((<WebVRFreeCamera>activeCamera).devicePosition) {\r\n cameraPosition = (<WebVRFreeCamera>activeCamera).devicePosition;\r\n }\r\n this._rootMesh.position.subtractToRef(cameraPosition, this._tempVector);\r\n const dist = this._tempVector.length() * this.scaleRatio;\r\n this._rootMesh.scaling.set(dist, dist, dist);\r\n\r\n // Account for handedness, similar to Matrix.decompose\r\n if (effectiveNode._getWorldMatrixDeterminant() < 0 && !Gizmo.PreserveScaling) {\r\n this._rootMesh.scaling.y *= -1;\r\n }\r\n } else {\r\n this._rootMesh.scaling.setAll(this.scaleRatio);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Handle position/translation when using an attached node using pivot\r\n */\r\n protected _handlePivot() {\r\n const attachedNodeTransform = this._attachedNode as any;\r\n // check there is an active pivot for the TransformNode attached\r\n if (attachedNodeTransform.isUsingPivotMatrix && attachedNodeTransform.isUsingPivotMatrix() && attachedNodeTransform.position) {\r\n // When a TransformNode has an active pivot, even without parenting,\r\n // translation from the world matrix is different from TransformNode.position.\r\n // Pivot works like a virtual parent that's using the node orientation.\r\n // As the world matrix is transformed by the gizmo and then decomposed to TRS\r\n // its translation part must be set to the Node's position.\r\n attachedNodeTransform.getWorldMatrix().setTranslation(attachedNodeTransform.position);\r\n }\r\n }\r\n /**\r\n * computes the rotation/scaling/position of the transform once the Node world matrix has changed.\r\n */\r\n protected _matrixChanged() {\r\n if (!this._attachedNode) {\r\n return;\r\n }\r\n\r\n if ((<Camera>this._attachedNode)._isCamera) {\r\n const camera = this._attachedNode as Camera;\r\n let worldMatrix;\r\n let worldMatrixUC;\r\n if (camera.parent) {\r\n const parentInv = this._tempMatrix2;\r\n camera.parent._worldMatrix.invertToRef(parentInv);\r\n this._attachedNode._worldMatrix.multiplyToRef(parentInv, this._tempMatrix1);\r\n worldMatrix = this._tempMatrix1;\r\n } else {\r\n worldMatrix = this._attachedNode._worldMatrix;\r\n }\r\n\r\n if (camera.getScene().useRightHandedSystem) {\r\n // avoid desync with RH matrix computation. Otherwise, rotation of PI around Y axis happens each frame resulting in axis flipped because worldMatrix is computed as inverse of viewMatrix.\r\n this._rightHandtoLeftHandMatrix.multiplyToRef(worldMatrix, this._tempMatrix2);\r\n worldMatrixUC = this._tempMatrix2;\r\n } else {\r\n worldMatrixUC = worldMatrix;\r\n }\r\n\r\n worldMatrixUC.decompose(this._tempVector2, this._tempQuaternion, this._tempVector);\r\n\r\n const inheritsTargetCamera =\r\n this._attachedNode.getClassName() === \"FreeCamera\" ||\r\n this._attachedNode.getClassName() === \"FlyCamera\" ||\r\n this._attachedNode.getClassName() === \"ArcFollowCamera\" ||\r\n this._attachedNode.getClassName() === \"TargetCamera\" ||\r\n this._attachedNode.getClassName() === \"TouchCamera\" ||\r\n this._attachedNode.getClassName() === \"UniversalCamera\";\r\n\r\n if (inheritsTargetCamera) {\r\n const targetCamera = this._attachedNode as TargetCamera;\r\n targetCamera.rotation = this._tempQuaternion.toEulerAngles();\r\n\r\n if (targetCamera.rotationQuaternion) {\r\n targetCamera.rotationQuaternion.copyFrom(this._tempQuaternion);\r\n targetCamera.rotationQuaternion.normalize();\r\n }\r\n }\r\n\r\n camera.position.copyFrom(this._tempVector);\r\n } else if (\r\n (<Mesh>this._attachedNode)._isMesh ||\r\n this._attachedNode.getClassName() === \"AbstractMesh\" ||\r\n this._attachedNode.getClassName() === \"TransformNode\" ||\r\n this._attachedNode.getClassName() === \"InstancedMesh\"\r\n ) {\r\n const transform = this._attachedNode as TransformNode;\r\n if (transform.parent) {\r\n const parentInv = this._tempMatrix1;\r\n const localMat = this._tempMatrix2;\r\n transform.parent.getWorldMatrix().invertToRef(parentInv);\r\n this._attachedNode.getWorldMatrix().multiplyToRef(parentInv, localMat);\r\n localMat.decompose(this._tempVector, this._tempQuaternion, transform.position, Gizmo.PreserveScaling ? transform : undefined);\r\n } else {\r\n this._attachedNode._worldMatrix.decompose(this._tempVector, this._tempQuaternion, transform.position, Gizmo.PreserveScaling ? transform : undefined);\r\n }\r\n transform.scaling.copyFrom(this._tempVector);\r\n if (!transform.billboardMode) {\r\n if (transform.rotationQuaternion) {\r\n transform.rotationQuaternion.copyFrom(this._tempQuaternion);\r\n transform.rotationQuaternion.normalize();\r\n } else {\r\n transform.rotation = this._tempQuaternion.toEulerAngles();\r\n }\r\n }\r\n } else if (this._attachedNode.getClassName() === \"Bone\") {\r\n const bone = this._attachedNode as Bone;\r\n const parent = bone.getParent();\r\n\r\n if (parent) {\r\n const invParent = this._tempMatrix1;\r\n const boneLocalMatrix = this._tempMatrix2;\r\n parent.getWorldMatrix().invertToRef(invParent);\r\n bone.getWorldMatrix().multiplyToRef(invParent, boneLocalMatrix);\r\n const lmat = bone.getLocalMatrix();\r\n lmat.copyFrom(boneLocalMatrix);\r\n } else {\r\n const lmat = bone.getLocalMatrix();\r\n lmat.copyFrom(bone.getWorldMatrix());\r\n }\r\n bone.markAsDirty();\r\n } else {\r\n const light = this._attachedNode as ShadowLight;\r\n if (light.getTypeID) {\r\n const type = light.getTypeID();\r\n if (type === Light.LIGHTTYPEID_DIRECTIONALLIGHT || type === Light.LIGHTTYPEID_SPOTLIGHT || type === Light.LIGHTTYPEID_POINTLIGHT) {\r\n const parent = light.parent;\r\n\r\n if (parent) {\r\n const invParent = this._tempMatrix1;\r\n const nodeLocalMatrix = this._tempMatrix2;\r\n parent.getWorldMatrix().invertToRef(invParent);\r\n light.getWorldMatrix().multiplyToRef(invParent, nodeLocalMatrix);\r\n nodeLocalMatrix.decompose(undefined, this._tempQuaternion, this._tempVector);\r\n } else {\r\n this._attachedNode._worldMatrix.decompose(undefined, this._tempQuaternion, this._tempVector);\r\n }\r\n // setter doesn't copy values. Need a new Vector3\r\n light.position = new Vector3(this._tempVector.x, this._tempVector.y, this._tempVector.z);\r\n if (light.direction) {\r\n light.direction = new Vector3(light.direction.x, light.direction.y, light.direction.z);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * refresh gizmo mesh material\r\n * @param gizmoMeshes\r\n * @param material material to apply\r\n */\r\n protected _setGizmoMeshMaterial(gizmoMeshes: Mesh[], material: StandardMaterial) {\r\n if (gizmoMeshes) {\r\n gizmoMeshes.forEach((m: Mesh) => {\r\n m.material = material;\r\n if ((<LinesMesh>m).color) {\r\n (<LinesMesh>m).color = material.diffuseColor;\r\n }\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Subscribes to pointer up, down, and hover events. Used for responsive gizmos.\r\n * @param gizmoLayer The utility layer the gizmo will be added to\r\n * @param gizmoAxisCache Gizmo axis definition used for reactive gizmo UI\r\n * @returns {Observer<PointerInfo>} pointerObserver\r\n */\r\n public static GizmoAxisPointerObserver(gizmoLayer: UtilityLayerRenderer, gizmoAxisCache: Map<Mesh, GizmoAxisCache>): Observer<PointerInfo> {\r\n let dragging = false;\r\n\r\n const pointerObserver = gizmoLayer.utilityLayerScene.onPointerObservable.add((pointerInfo) => {\r\n if (pointerInfo.pickInfo) {\r\n // On Hover Logic\r\n if (pointerInfo.type === PointerEventTypes.POINTERMOVE) {\r\n if (dragging) {\r\n return;\r\n }\r\n gizmoAxisCache.forEach((cache) => {\r\n if (cache.colliderMeshes && cache.gizmoMeshes) {\r\n const isHovered = cache.colliderMeshes?.indexOf(pointerInfo?.pickInfo?.pickedMesh as Mesh) != -1;\r\n const material = cache.dragBehavior.enabled ? (isHovered || cache.active ? cache.hoverMaterial : cache.material) : cache.disableMaterial;\r\n cache.gizmoMeshes.forEach((m: Mesh) => {\r\n m.material = material;\r\n if ((m as LinesMesh).color) {\r\n (m as LinesMesh).color = material.diffuseColor;\r\n }\r\n });\r\n }\r\n });\r\n }\r\n\r\n // On Mouse Down\r\n if (pointerInfo.type === PointerEventTypes.POINTERDOWN) {\r\n // If user Clicked Gizmo\r\n if (gizmoAxisCache.has(pointerInfo.pickInfo.pickedMesh?.parent as Mesh)) {\r\n dragging = true;\r\n const statusMap = gizmoAxisCache.get(pointerInfo.pickInfo.pickedMesh?.parent as Mesh);\r\n statusMap!.active = true;\r\n gizmoAxisCache.forEach((cache) => {\r\n const isHovered = cache.colliderMeshes?.indexOf(pointerInfo?.pickInfo?.pickedMesh as Mesh) != -1;\r\n const material = (isHovered || cache.active) && cache.dragBehavior.enabled ? cache.hoverMaterial : cache.disableMaterial;\r\n cache.gizmoMeshes.forEach((m: Mesh) => {\r\n m.material = material;\r\n if ((m as LinesMesh).color) {\r\n (m as LinesMesh).color = material.diffuseColor;\r\n }\r\n });\r\n });\r\n }\r\n }\r\n\r\n // On Mouse Up\r\n if (pointerInfo.type === PointerEventTypes.POINTERUP) {\r\n gizmoAxisCache.forEach((cache) => {\r\n cache.active = false;\r\n dragging = false;\r\n cache.gizmoMeshes.forEach((m: Mesh) => {\r\n m.material = cache.dragBehavior.enabled ? cache.material : cache.disableMaterial;\r\n if ((m as LinesMesh).color) {\r\n (m as LinesMesh).color = cache.material.diffuseColor;\r\n }\r\n });\r\n });\r\n }\r\n }\r\n });\r\n\r\n return pointerObserver!;\r\n }\r\n\r\n /**\r\n * Disposes of the gizmo\r\n */\r\n public dispose() {\r\n this._rootMesh.dispose();\r\n if (this._beforeRenderObserver) {\r\n this.gizmoLayer.utilityLayerScene.onBeforeRenderObservable.remove(this._beforeRenderObserver);\r\n }\r\n }\r\n}\r\n"]}
@@ -1,16 +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 type { Scene, IDisposable } from "../scene";
4
6
  import type { Node } from "../node";
5
7
  import { AbstractMesh } from "../Meshes/abstractMesh";
6
8
  import type { Mesh } from "../Meshes/mesh";
7
9
  import { UtilityLayerRenderer } from "../Rendering/utilityLayerRenderer";
10
+ import { Color3 } from "../Maths/math.color";
8
11
  import { SixDofDragBehavior } from "../Behaviors/Meshes/sixDofDragBehavior";
9
12
  import type { GizmoAxisCache } from "./gizmo";
10
- import { RotationGizmo } from "./rotationGizmo";
11
- import { PositionGizmo } from "./positionGizmo";
12
- import { ScaleGizmo } from "./scaleGizmo";
13
- import { BoundingBoxGizmo } from "./boundingBoxGizmo";
13
+ import type { IRotationGizmo } from "./rotationGizmo";
14
+ import type { IPositionGizmo } from "./positionGizmo";
15
+ import type { IScaleGizmo } from "./scaleGizmo";
16
+ import type { IBoundingBoxGizmo } from "./boundingBoxGizmo";
14
17
  /**
15
18
  * Helps setup gizmo's in the scene to rotate/scale/position nodes
16
19
  */
@@ -20,10 +23,10 @@ export declare class GizmoManager implements IDisposable {
20
23
  * Gizmo's created by the gizmo manager, gizmo will be null until gizmo has been enabled for the first time
21
24
  */
22
25
  gizmos: {
23
- positionGizmo: Nullable<PositionGizmo>;
24
- rotationGizmo: Nullable<RotationGizmo>;
25
- scaleGizmo: Nullable<ScaleGizmo>;
26
- boundingBoxGizmo: Nullable<BoundingBoxGizmo>;
26
+ positionGizmo: Nullable<IPositionGizmo>;
27
+ rotationGizmo: Nullable<IRotationGizmo>;
28
+ scaleGizmo: Nullable<IScaleGizmo>;
29
+ boundingBoxGizmo: Nullable<IBoundingBoxGizmo>;
27
30
  };
28
31
  /** When true, the gizmo will be detached from the current object when a pointer down occurs with an empty picked mesh */
29
32
  clearGizmoOnEmptyPointerEvent: boolean;
@@ -33,15 +36,20 @@ export declare class GizmoManager implements IDisposable {
33
36
  onAttachedToMeshObservable: Observable<Nullable<AbstractMesh>>;
34
37
  /** Fires an event when the manager is attached to a node */
35
38
  onAttachedToNodeObservable: Observable<Nullable<Node>>;
36
- private _gizmosEnabled;
37
- private _pointerObservers;
38
- private _attachedMesh;
39
- private _attachedNode;
40
- private _boundingBoxColor;
41
- private _defaultUtilityLayer;
42
- private _defaultKeepDepthUtilityLayer;
43
- private _thickness;
44
- private _scaleRatio;
39
+ protected _gizmosEnabled: {
40
+ positionGizmo: boolean;
41
+ rotationGizmo: boolean;
42
+ scaleGizmo: boolean;
43
+ boundingBoxGizmo: boolean;
44
+ };
45
+ protected _pointerObservers: Observer<PointerInfo>[];
46
+ protected _attachedMesh: Nullable<AbstractMesh>;
47
+ protected _attachedNode: Nullable<Node>;
48
+ protected _boundingBoxColor: Color3;
49
+ protected _defaultUtilityLayer: UtilityLayerRenderer;
50
+ protected _defaultKeepDepthUtilityLayer: UtilityLayerRenderer;
51
+ protected _thickness: number;
52
+ protected _scaleRatio: number;
45
53
  /** Node Caching for quick lookup */
46
54
  private _gizmoAxisCache;
47
55
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"gizmoManager.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Gizmos/gizmoManager.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Observer } from \"../Misc/observable\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { PointerInfo } from \"../Events/pointerEvents\";\r\nimport { PointerEventTypes } from \"../Events/pointerEvents\";\r\nimport type { Scene, IDisposable } from \"../scene\";\r\nimport type { Node } from \"../node\";\r\nimport { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { Mesh } from \"../Meshes/mesh\";\r\nimport { UtilityLayerRenderer } from \"../Rendering/utilityLayerRenderer\";\r\nimport { Color3 } from \"../Maths/math.color\";\r\nimport { SixDofDragBehavior } from \"../Behaviors/Meshes/sixDofDragBehavior\";\r\nimport type { GizmoAxisCache } from \"./gizmo\";\r\nimport { Gizmo } from \"./gizmo\";\r\nimport { RotationGizmo } from \"./rotationGizmo\";\r\nimport { PositionGizmo } from \"./positionGizmo\";\r\nimport { ScaleGizmo } from \"./scaleGizmo\";\r\nimport { BoundingBoxGizmo } from \"./boundingBoxGizmo\";\r\n\r\n/**\r\n * Helps setup gizmo's in the scene to rotate/scale/position nodes\r\n */\r\nexport class GizmoManager implements IDisposable {\r\n /**\r\n * Gizmo's created by the gizmo manager, gizmo will be null until gizmo has been enabled for the first time\r\n */\r\n public gizmos: {\r\n positionGizmo: Nullable<PositionGizmo>;\r\n rotationGizmo: Nullable<RotationGizmo>;\r\n scaleGizmo: Nullable<ScaleGizmo>;\r\n boundingBoxGizmo: Nullable<BoundingBoxGizmo>;\r\n };\r\n\r\n /** When true, the gizmo will be detached from the current object when a pointer down occurs with an empty picked mesh */\r\n public clearGizmoOnEmptyPointerEvent = false;\r\n\r\n /** When true (default), picking to attach a new mesh is enabled. This works in sync with inspector autopicking. */\r\n public enableAutoPicking = true;\r\n\r\n /** Fires an event when the manager is attached to a mesh */\r\n public onAttachedToMeshObservable = new Observable<Nullable<AbstractMesh>>();\r\n\r\n /** Fires an event when the manager is attached to a node */\r\n public onAttachedToNodeObservable = new Observable<Nullable<Node>>();\r\n\r\n private _gizmosEnabled = { positionGizmo: false, rotationGizmo: false, scaleGizmo: false, boundingBoxGizmo: false };\r\n private _pointerObservers: Observer<PointerInfo>[] = [];\r\n private _attachedMesh: Nullable<AbstractMesh> = null;\r\n private _attachedNode: Nullable<Node> = null;\r\n private _boundingBoxColor = Color3.FromHexString(\"#0984e3\");\r\n private _defaultUtilityLayer: UtilityLayerRenderer;\r\n private _defaultKeepDepthUtilityLayer: UtilityLayerRenderer;\r\n private _thickness: number = 1;\r\n private _scaleRatio: number = 1;\r\n\r\n /** Node Caching for quick lookup */\r\n private _gizmoAxisCache: Map<Mesh, GizmoAxisCache> = new Map();\r\n /**\r\n * When bounding box gizmo is enabled, this can be used to track drag/end events\r\n */\r\n public boundingBoxDragBehavior = new SixDofDragBehavior();\r\n /**\r\n * Array of meshes which will have the gizmo attached when a pointer selected them. If null, all meshes are attachable. (Default: null)\r\n */\r\n public attachableMeshes: Nullable<Array<AbstractMesh>> = null;\r\n /**\r\n * Array of nodes which will have the gizmo attached when a pointer selected them. If null, all nodes are attachable. (Default: null)\r\n */\r\n public attachableNodes: Nullable<Array<Node>> = null;\r\n /**\r\n * If pointer events should perform attaching/detaching a gizmo, if false this can be done manually via attachToMesh/attachToNode. (Default: true)\r\n */\r\n public usePointerToAttachGizmos = true;\r\n\r\n /**\r\n * Utility layer that the bounding box gizmo belongs to\r\n */\r\n public get keepDepthUtilityLayer() {\r\n return this._defaultKeepDepthUtilityLayer;\r\n }\r\n\r\n /**\r\n * Utility layer that all gizmos besides bounding box belong to\r\n */\r\n public get utilityLayer() {\r\n return this._defaultUtilityLayer;\r\n }\r\n\r\n /**\r\n * True when the mouse pointer is hovering a gizmo mesh\r\n */\r\n public get isHovered() {\r\n let hovered = false;\r\n for (const key in this.gizmos) {\r\n const gizmo = <Nullable<Gizmo>>(<any>this.gizmos)[key];\r\n if (gizmo && gizmo.isHovered) {\r\n hovered = true;\r\n break;\r\n }\r\n }\r\n return hovered;\r\n }\r\n\r\n /**\r\n * Ratio for the scale of the gizmo (Default: 1)\r\n */\r\n public set scaleRatio(value: number) {\r\n this._scaleRatio = value;\r\n [this.gizmos.positionGizmo, this.gizmos.rotationGizmo, this.gizmos.scaleGizmo].forEach((gizmo) => {\r\n if (gizmo) {\r\n gizmo.scaleRatio = value;\r\n }\r\n });\r\n }\r\n public get scaleRatio() {\r\n return this._scaleRatio;\r\n }\r\n\r\n /**\r\n * Instantiates a gizmo manager\r\n * @param _scene the scene to overlay the gizmos on top of\r\n * @param thickness display gizmo axis thickness\r\n * @param utilityLayer the layer where gizmos are rendered\r\n * @param keepDepthUtilityLayer the layer where occluded gizmos are rendered\r\n */\r\n constructor(\r\n private _scene: Scene,\r\n thickness: number = 1,\r\n utilityLayer: UtilityLayerRenderer = UtilityLayerRenderer.DefaultUtilityLayer,\r\n keepDepthUtilityLayer: UtilityLayerRenderer = UtilityLayerRenderer.DefaultKeepDepthUtilityLayer\r\n ) {\r\n this._defaultUtilityLayer = utilityLayer;\r\n this._defaultKeepDepthUtilityLayer = keepDepthUtilityLayer;\r\n this._defaultKeepDepthUtilityLayer.utilityLayerScene.autoClearDepthAndStencil = false;\r\n this._thickness = thickness;\r\n this.gizmos = { positionGizmo: null, rotationGizmo: null, scaleGizmo: null, boundingBoxGizmo: null };\r\n\r\n const attachToMeshPointerObserver = this._attachToMeshPointerObserver(_scene);\r\n const gizmoAxisPointerObserver = Gizmo.GizmoAxisPointerObserver(this._defaultUtilityLayer, this._gizmoAxisCache);\r\n this._pointerObservers = [attachToMeshPointerObserver, gizmoAxisPointerObserver];\r\n }\r\n\r\n /**\r\n * Subscribes to pointer down events, for attaching and detaching mesh\r\n * @param scene The scene layer the observer will be added to\r\n */\r\n private _attachToMeshPointerObserver(scene: Scene): Observer<PointerInfo> {\r\n // Instantiate/dispose gizmos based on pointer actions\r\n const pointerObserver = scene.onPointerObservable.add((pointerInfo) => {\r\n if (!this.usePointerToAttachGizmos) {\r\n return;\r\n }\r\n if (pointerInfo.type == PointerEventTypes.POINTERDOWN) {\r\n if (pointerInfo.pickInfo && pointerInfo.pickInfo.pickedMesh) {\r\n if (this.enableAutoPicking) {\r\n let node: Nullable<Node> = pointerInfo.pickInfo.pickedMesh;\r\n if (this.attachableMeshes == null) {\r\n // Attach to the most parent node\r\n while (node && node.parent != null) {\r\n node = node.parent;\r\n }\r\n } else {\r\n // Attach to the parent node that is an attachableMesh\r\n let found = false;\r\n this.attachableMeshes.forEach((mesh) => {\r\n if (node && (node == mesh || node.isDescendantOf(mesh))) {\r\n node = mesh;\r\n found = true;\r\n }\r\n });\r\n if (!found) {\r\n node = null;\r\n }\r\n }\r\n if (node instanceof AbstractMesh) {\r\n if (this._attachedMesh != node) {\r\n this.attachToMesh(node);\r\n }\r\n } else {\r\n if (this.clearGizmoOnEmptyPointerEvent) {\r\n this.attachToMesh(null);\r\n }\r\n }\r\n }\r\n } else {\r\n if (this.clearGizmoOnEmptyPointerEvent) {\r\n this.attachToMesh(null);\r\n }\r\n }\r\n }\r\n });\r\n return pointerObserver!;\r\n }\r\n\r\n /**\r\n * Attaches a set of gizmos to the specified mesh\r\n * @param mesh The mesh the gizmo's should be attached to\r\n */\r\n public attachToMesh(mesh: Nullable<AbstractMesh>) {\r\n if (this._attachedMesh) {\r\n this._attachedMesh.removeBehavior(this.boundingBoxDragBehavior);\r\n }\r\n if (this._attachedNode) {\r\n this._attachedNode.removeBehavior(this.boundingBoxDragBehavior);\r\n }\r\n this._attachedMesh = mesh;\r\n this._attachedNode = null;\r\n for (const key in this.gizmos) {\r\n const gizmo = <Nullable<Gizmo>>(<any>this.gizmos)[key];\r\n if (gizmo && (<any>this._gizmosEnabled)[key]) {\r\n gizmo.attachedMesh = mesh;\r\n }\r\n }\r\n if (this.boundingBoxGizmoEnabled && this._attachedMesh) {\r\n this._attachedMesh.addBehavior(this.boundingBoxDragBehavior);\r\n }\r\n this.onAttachedToMeshObservable.notifyObservers(mesh);\r\n }\r\n\r\n /**\r\n * Attaches a set of gizmos to the specified node\r\n * @param node The node the gizmo's should be attached to\r\n */\r\n public attachToNode(node: Nullable<Node>) {\r\n if (this._attachedMesh) {\r\n this._attachedMesh.removeBehavior(this.boundingBoxDragBehavior);\r\n }\r\n if (this._attachedNode) {\r\n this._attachedNode.removeBehavior(this.boundingBoxDragBehavior);\r\n }\r\n this._attachedMesh = null;\r\n this._attachedNode = node;\r\n for (const key in this.gizmos) {\r\n const gizmo = <Nullable<Gizmo>>(<any>this.gizmos)[key];\r\n if (gizmo && (<any>this._gizmosEnabled)[key]) {\r\n gizmo.attachedNode = node;\r\n }\r\n }\r\n if (this.boundingBoxGizmoEnabled && this._attachedNode) {\r\n this._attachedNode.addBehavior(this.boundingBoxDragBehavior);\r\n }\r\n this.onAttachedToNodeObservable.notifyObservers(node);\r\n }\r\n\r\n /**\r\n * If the position gizmo is enabled\r\n */\r\n public set positionGizmoEnabled(value: boolean) {\r\n if (value) {\r\n if (!this.gizmos.positionGizmo) {\r\n this.gizmos.positionGizmo = new PositionGizmo(this._defaultUtilityLayer, this._thickness, this);\r\n }\r\n if (this._attachedNode) {\r\n this.gizmos.positionGizmo.attachedNode = this._attachedNode;\r\n } else {\r\n this.gizmos.positionGizmo.attachedMesh = this._attachedMesh;\r\n }\r\n } else if (this.gizmos.positionGizmo) {\r\n this.gizmos.positionGizmo.attachedNode = null;\r\n }\r\n this._gizmosEnabled.positionGizmo = value;\r\n }\r\n public get positionGizmoEnabled(): boolean {\r\n return this._gizmosEnabled.positionGizmo;\r\n }\r\n /**\r\n * If the rotation gizmo is enabled\r\n */\r\n public set rotationGizmoEnabled(value: boolean) {\r\n if (value) {\r\n if (!this.gizmos.rotationGizmo) {\r\n this.gizmos.rotationGizmo = new RotationGizmo(this._defaultUtilityLayer, 32, false, this._thickness, this);\r\n }\r\n if (this._attachedNode) {\r\n this.gizmos.rotationGizmo.attachedNode = this._attachedNode;\r\n } else {\r\n this.gizmos.rotationGizmo.attachedMesh = this._attachedMesh;\r\n }\r\n } else if (this.gizmos.rotationGizmo) {\r\n this.gizmos.rotationGizmo.attachedNode = null;\r\n }\r\n this._gizmosEnabled.rotationGizmo = value;\r\n }\r\n public get rotationGizmoEnabled(): boolean {\r\n return this._gizmosEnabled.rotationGizmo;\r\n }\r\n /**\r\n * If the scale gizmo is enabled\r\n */\r\n public set scaleGizmoEnabled(value: boolean) {\r\n if (value) {\r\n this.gizmos.scaleGizmo = this.gizmos.scaleGizmo || new ScaleGizmo(this._defaultUtilityLayer, this._thickness, this);\r\n if (this._attachedNode) {\r\n this.gizmos.scaleGizmo.attachedNode = this._attachedNode;\r\n } else {\r\n this.gizmos.scaleGizmo.attachedMesh = this._attachedMesh;\r\n }\r\n } else if (this.gizmos.scaleGizmo) {\r\n this.gizmos.scaleGizmo.attachedNode = null;\r\n }\r\n this._gizmosEnabled.scaleGizmo = value;\r\n }\r\n public get scaleGizmoEnabled(): boolean {\r\n return this._gizmosEnabled.scaleGizmo;\r\n }\r\n /**\r\n * If the boundingBox gizmo is enabled\r\n */\r\n public set boundingBoxGizmoEnabled(value: boolean) {\r\n if (value) {\r\n this.gizmos.boundingBoxGizmo = this.gizmos.boundingBoxGizmo || new BoundingBoxGizmo(this._boundingBoxColor, this._defaultKeepDepthUtilityLayer);\r\n if (this._attachedMesh) {\r\n this.gizmos.boundingBoxGizmo.attachedMesh = this._attachedMesh;\r\n } else {\r\n this.gizmos.boundingBoxGizmo.attachedNode = this._attachedNode;\r\n }\r\n\r\n if (this._attachedMesh) {\r\n this._attachedMesh.removeBehavior(this.boundingBoxDragBehavior);\r\n this._attachedMesh.addBehavior(this.boundingBoxDragBehavior);\r\n } else if (this._attachedNode) {\r\n this._attachedNode.removeBehavior(this.boundingBoxDragBehavior);\r\n this._attachedNode.addBehavior(this.boundingBoxDragBehavior);\r\n }\r\n } else if (this.gizmos.boundingBoxGizmo) {\r\n if (this._attachedMesh) {\r\n this._attachedMesh.removeBehavior(this.boundingBoxDragBehavior);\r\n } else if (this._attachedNode) {\r\n this._attachedNode.removeBehavior(this.boundingBoxDragBehavior);\r\n }\r\n this.gizmos.boundingBoxGizmo.attachedNode = null;\r\n }\r\n this._gizmosEnabled.boundingBoxGizmo = value;\r\n }\r\n public get boundingBoxGizmoEnabled(): boolean {\r\n return this._gizmosEnabled.boundingBoxGizmo;\r\n }\r\n\r\n /**\r\n * Builds Gizmo Axis Cache to enable features such as hover state preservation and graying out other axis during manipulation\r\n * @param gizmoAxisCache Gizmo axis definition used for reactive gizmo UI\r\n */\r\n public addToAxisCache(gizmoAxisCache: Map<Mesh, GizmoAxisCache>) {\r\n if (gizmoAxisCache.size > 0) {\r\n gizmoAxisCache.forEach((v, k) => {\r\n this._gizmoAxisCache.set(k, v);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Disposes of the gizmo manager\r\n */\r\n public dispose() {\r\n this._pointerObservers.forEach((observer) => {\r\n this._scene.onPointerObservable.remove(observer);\r\n });\r\n for (const key in this.gizmos) {\r\n const gizmo = <Nullable<Gizmo>>(<any>this.gizmos)[key];\r\n if (gizmo) {\r\n gizmo.dispose();\r\n }\r\n }\r\n if (this._defaultKeepDepthUtilityLayer !== UtilityLayerRenderer._DefaultKeepDepthUtilityLayer) {\r\n this._defaultKeepDepthUtilityLayer?.dispose();\r\n }\r\n if (this._defaultUtilityLayer !== UtilityLayerRenderer._DefaultUtilityLayer) {\r\n this._defaultUtilityLayer?.dispose();\r\n }\r\n this.boundingBoxDragBehavior.detach();\r\n this.onAttachedToMeshObservable.clear();\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"gizmoManager.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Gizmos/gizmoManager.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Observer } from \"../Misc/observable\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { PointerInfo } from \"../Events/pointerEvents\";\r\nimport { PointerEventTypes } from \"../Events/pointerEvents\";\r\nimport type { Scene, IDisposable } from \"../scene\";\r\nimport type { Node } from \"../node\";\r\nimport { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { Mesh } from \"../Meshes/mesh\";\r\nimport { UtilityLayerRenderer } from \"../Rendering/utilityLayerRenderer\";\r\nimport { Color3 } from \"../Maths/math.color\";\r\nimport { SixDofDragBehavior } from \"../Behaviors/Meshes/sixDofDragBehavior\";\r\nimport type { GizmoAxisCache, IGizmo } from \"./gizmo\";\r\nimport { Gizmo } from \"./gizmo\";\r\nimport type { IRotationGizmo } from \"./rotationGizmo\";\r\nimport { RotationGizmo } from \"./rotationGizmo\";\r\nimport type { IPositionGizmo } from \"./positionGizmo\";\r\nimport { PositionGizmo } from \"./positionGizmo\";\r\nimport type { IScaleGizmo } from \"./scaleGizmo\";\r\nimport { ScaleGizmo } from \"./scaleGizmo\";\r\nimport type { IBoundingBoxGizmo } from \"./boundingBoxGizmo\";\r\nimport { BoundingBoxGizmo } from \"./boundingBoxGizmo\";\r\n\r\n/**\r\n * Helps setup gizmo's in the scene to rotate/scale/position nodes\r\n */\r\nexport class GizmoManager implements IDisposable {\r\n /**\r\n * Gizmo's created by the gizmo manager, gizmo will be null until gizmo has been enabled for the first time\r\n */\r\n public gizmos: {\r\n positionGizmo: Nullable<IPositionGizmo>;\r\n rotationGizmo: Nullable<IRotationGizmo>;\r\n scaleGizmo: Nullable<IScaleGizmo>;\r\n boundingBoxGizmo: Nullable<IBoundingBoxGizmo>;\r\n };\r\n\r\n /** When true, the gizmo will be detached from the current object when a pointer down occurs with an empty picked mesh */\r\n public clearGizmoOnEmptyPointerEvent = false;\r\n\r\n /** When true (default), picking to attach a new mesh is enabled. This works in sync with inspector autopicking. */\r\n public enableAutoPicking = true;\r\n\r\n /** Fires an event when the manager is attached to a mesh */\r\n public onAttachedToMeshObservable = new Observable<Nullable<AbstractMesh>>();\r\n\r\n /** Fires an event when the manager is attached to a node */\r\n public onAttachedToNodeObservable = new Observable<Nullable<Node>>();\r\n\r\n protected _gizmosEnabled = { positionGizmo: false, rotationGizmo: false, scaleGizmo: false, boundingBoxGizmo: false };\r\n protected _pointerObservers: Observer<PointerInfo>[] = [];\r\n protected _attachedMesh: Nullable<AbstractMesh> = null;\r\n protected _attachedNode: Nullable<Node> = null;\r\n protected _boundingBoxColor = Color3.FromHexString(\"#0984e3\");\r\n protected _defaultUtilityLayer: UtilityLayerRenderer;\r\n protected _defaultKeepDepthUtilityLayer: UtilityLayerRenderer;\r\n protected _thickness: number = 1;\r\n protected _scaleRatio: number = 1;\r\n\r\n /** Node Caching for quick lookup */\r\n private _gizmoAxisCache: Map<Mesh, GizmoAxisCache> = new Map();\r\n /**\r\n * When bounding box gizmo is enabled, this can be used to track drag/end events\r\n */\r\n public boundingBoxDragBehavior = new SixDofDragBehavior();\r\n /**\r\n * Array of meshes which will have the gizmo attached when a pointer selected them. If null, all meshes are attachable. (Default: null)\r\n */\r\n public attachableMeshes: Nullable<Array<AbstractMesh>> = null;\r\n /**\r\n * Array of nodes which will have the gizmo attached when a pointer selected them. If null, all nodes are attachable. (Default: null)\r\n */\r\n public attachableNodes: Nullable<Array<Node>> = null;\r\n /**\r\n * If pointer events should perform attaching/detaching a gizmo, if false this can be done manually via attachToMesh/attachToNode. (Default: true)\r\n */\r\n public usePointerToAttachGizmos = true;\r\n\r\n /**\r\n * Utility layer that the bounding box gizmo belongs to\r\n */\r\n public get keepDepthUtilityLayer() {\r\n return this._defaultKeepDepthUtilityLayer;\r\n }\r\n\r\n /**\r\n * Utility layer that all gizmos besides bounding box belong to\r\n */\r\n public get utilityLayer() {\r\n return this._defaultUtilityLayer;\r\n }\r\n\r\n /**\r\n * True when the mouse pointer is hovering a gizmo mesh\r\n */\r\n public get isHovered() {\r\n let hovered = false;\r\n for (const key in this.gizmos) {\r\n const gizmo = <Nullable<IGizmo>>(<any>this.gizmos)[key];\r\n if (gizmo && gizmo.isHovered) {\r\n hovered = true;\r\n break;\r\n }\r\n }\r\n return hovered;\r\n }\r\n\r\n /**\r\n * Ratio for the scale of the gizmo (Default: 1)\r\n */\r\n public set scaleRatio(value: number) {\r\n this._scaleRatio = value;\r\n [this.gizmos.positionGizmo, this.gizmos.rotationGizmo, this.gizmos.scaleGizmo].forEach((gizmo) => {\r\n if (gizmo) {\r\n gizmo.scaleRatio = value;\r\n }\r\n });\r\n }\r\n public get scaleRatio() {\r\n return this._scaleRatio;\r\n }\r\n\r\n /**\r\n * Instantiates a gizmo manager\r\n * @param _scene the scene to overlay the gizmos on top of\r\n * @param thickness display gizmo axis thickness\r\n * @param utilityLayer the layer where gizmos are rendered\r\n * @param keepDepthUtilityLayer the layer where occluded gizmos are rendered\r\n */\r\n constructor(\r\n private _scene: Scene,\r\n thickness: number = 1,\r\n utilityLayer: UtilityLayerRenderer = UtilityLayerRenderer.DefaultUtilityLayer,\r\n keepDepthUtilityLayer: UtilityLayerRenderer = UtilityLayerRenderer.DefaultKeepDepthUtilityLayer\r\n ) {\r\n this._defaultUtilityLayer = utilityLayer;\r\n this._defaultKeepDepthUtilityLayer = keepDepthUtilityLayer;\r\n this._defaultKeepDepthUtilityLayer.utilityLayerScene.autoClearDepthAndStencil = false;\r\n this._thickness = thickness;\r\n this.gizmos = { positionGizmo: null, rotationGizmo: null, scaleGizmo: null, boundingBoxGizmo: null };\r\n\r\n const attachToMeshPointerObserver = this._attachToMeshPointerObserver(_scene);\r\n const gizmoAxisPointerObserver = Gizmo.GizmoAxisPointerObserver(this._defaultUtilityLayer, this._gizmoAxisCache);\r\n this._pointerObservers = [attachToMeshPointerObserver, gizmoAxisPointerObserver];\r\n }\r\n\r\n /**\r\n * Subscribes to pointer down events, for attaching and detaching mesh\r\n * @param scene The scene layer the observer will be added to\r\n */\r\n private _attachToMeshPointerObserver(scene: Scene): Observer<PointerInfo> {\r\n // Instantiate/dispose gizmos based on pointer actions\r\n const pointerObserver = scene.onPointerObservable.add((pointerInfo) => {\r\n if (!this.usePointerToAttachGizmos) {\r\n return;\r\n }\r\n if (pointerInfo.type == PointerEventTypes.POINTERDOWN) {\r\n if (pointerInfo.pickInfo && pointerInfo.pickInfo.pickedMesh) {\r\n if (this.enableAutoPicking) {\r\n let node: Nullable<Node> = pointerInfo.pickInfo.pickedMesh;\r\n if (this.attachableMeshes == null) {\r\n // Attach to the most parent node\r\n while (node && node.parent != null) {\r\n node = node.parent;\r\n }\r\n } else {\r\n // Attach to the parent node that is an attachableMesh\r\n let found = false;\r\n this.attachableMeshes.forEach((mesh) => {\r\n if (node && (node == mesh || node.isDescendantOf(mesh))) {\r\n node = mesh;\r\n found = true;\r\n }\r\n });\r\n if (!found) {\r\n node = null;\r\n }\r\n }\r\n if (node instanceof AbstractMesh) {\r\n if (this._attachedMesh != node) {\r\n this.attachToMesh(node);\r\n }\r\n } else {\r\n if (this.clearGizmoOnEmptyPointerEvent) {\r\n this.attachToMesh(null);\r\n }\r\n }\r\n }\r\n } else {\r\n if (this.clearGizmoOnEmptyPointerEvent) {\r\n this.attachToMesh(null);\r\n }\r\n }\r\n }\r\n });\r\n return pointerObserver!;\r\n }\r\n\r\n /**\r\n * Attaches a set of gizmos to the specified mesh\r\n * @param mesh The mesh the gizmo's should be attached to\r\n */\r\n public attachToMesh(mesh: Nullable<AbstractMesh>) {\r\n if (this._attachedMesh) {\r\n this._attachedMesh.removeBehavior(this.boundingBoxDragBehavior);\r\n }\r\n if (this._attachedNode) {\r\n this._attachedNode.removeBehavior(this.boundingBoxDragBehavior);\r\n }\r\n this._attachedMesh = mesh;\r\n this._attachedNode = null;\r\n for (const key in this.gizmos) {\r\n const gizmo = <Nullable<IGizmo>>(<any>this.gizmos)[key];\r\n if (gizmo && (<any>this._gizmosEnabled)[key]) {\r\n gizmo.attachedMesh = mesh;\r\n }\r\n }\r\n if (this.boundingBoxGizmoEnabled && this._attachedMesh) {\r\n this._attachedMesh.addBehavior(this.boundingBoxDragBehavior);\r\n }\r\n this.onAttachedToMeshObservable.notifyObservers(mesh);\r\n }\r\n\r\n /**\r\n * Attaches a set of gizmos to the specified node\r\n * @param node The node the gizmo's should be attached to\r\n */\r\n public attachToNode(node: Nullable<Node>) {\r\n if (this._attachedMesh) {\r\n this._attachedMesh.removeBehavior(this.boundingBoxDragBehavior);\r\n }\r\n if (this._attachedNode) {\r\n this._attachedNode.removeBehavior(this.boundingBoxDragBehavior);\r\n }\r\n this._attachedMesh = null;\r\n this._attachedNode = node;\r\n for (const key in this.gizmos) {\r\n const gizmo = <Nullable<IGizmo>>(<any>this.gizmos)[key];\r\n if (gizmo && (<any>this._gizmosEnabled)[key]) {\r\n gizmo.attachedNode = node;\r\n }\r\n }\r\n if (this.boundingBoxGizmoEnabled && this._attachedNode) {\r\n this._attachedNode.addBehavior(this.boundingBoxDragBehavior);\r\n }\r\n this.onAttachedToNodeObservable.notifyObservers(node);\r\n }\r\n\r\n /**\r\n * If the position gizmo is enabled\r\n */\r\n public set positionGizmoEnabled(value: boolean) {\r\n if (value) {\r\n if (!this.gizmos.positionGizmo) {\r\n this.gizmos.positionGizmo = new PositionGizmo(this._defaultUtilityLayer, this._thickness, this);\r\n }\r\n if (this._attachedNode) {\r\n this.gizmos.positionGizmo.attachedNode = this._attachedNode;\r\n } else {\r\n this.gizmos.positionGizmo.attachedMesh = this._attachedMesh;\r\n }\r\n } else if (this.gizmos.positionGizmo) {\r\n this.gizmos.positionGizmo.attachedNode = null;\r\n }\r\n this._gizmosEnabled.positionGizmo = value;\r\n }\r\n public get positionGizmoEnabled(): boolean {\r\n return this._gizmosEnabled.positionGizmo;\r\n }\r\n /**\r\n * If the rotation gizmo is enabled\r\n */\r\n public set rotationGizmoEnabled(value: boolean) {\r\n if (value) {\r\n if (!this.gizmos.rotationGizmo) {\r\n this.gizmos.rotationGizmo = new RotationGizmo(this._defaultUtilityLayer, 32, false, this._thickness, this);\r\n }\r\n if (this._attachedNode) {\r\n this.gizmos.rotationGizmo.attachedNode = this._attachedNode;\r\n } else {\r\n this.gizmos.rotationGizmo.attachedMesh = this._attachedMesh;\r\n }\r\n } else if (this.gizmos.rotationGizmo) {\r\n this.gizmos.rotationGizmo.attachedNode = null;\r\n }\r\n this._gizmosEnabled.rotationGizmo = value;\r\n }\r\n public get rotationGizmoEnabled(): boolean {\r\n return this._gizmosEnabled.rotationGizmo;\r\n }\r\n /**\r\n * If the scale gizmo is enabled\r\n */\r\n public set scaleGizmoEnabled(value: boolean) {\r\n if (value) {\r\n this.gizmos.scaleGizmo = this.gizmos.scaleGizmo || new ScaleGizmo(this._defaultUtilityLayer, this._thickness, this);\r\n if (this._attachedNode) {\r\n this.gizmos.scaleGizmo.attachedNode = this._attachedNode;\r\n } else {\r\n this.gizmos.scaleGizmo.attachedMesh = this._attachedMesh;\r\n }\r\n } else if (this.gizmos.scaleGizmo) {\r\n this.gizmos.scaleGizmo.attachedNode = null;\r\n }\r\n this._gizmosEnabled.scaleGizmo = value;\r\n }\r\n public get scaleGizmoEnabled(): boolean {\r\n return this._gizmosEnabled.scaleGizmo;\r\n }\r\n /**\r\n * If the boundingBox gizmo is enabled\r\n */\r\n public set boundingBoxGizmoEnabled(value: boolean) {\r\n if (value) {\r\n this.gizmos.boundingBoxGizmo = this.gizmos.boundingBoxGizmo || new BoundingBoxGizmo(this._boundingBoxColor, this._defaultKeepDepthUtilityLayer);\r\n if (this._attachedMesh) {\r\n this.gizmos.boundingBoxGizmo.attachedMesh = this._attachedMesh;\r\n } else {\r\n this.gizmos.boundingBoxGizmo.attachedNode = this._attachedNode;\r\n }\r\n\r\n if (this._attachedMesh) {\r\n this._attachedMesh.removeBehavior(this.boundingBoxDragBehavior);\r\n this._attachedMesh.addBehavior(this.boundingBoxDragBehavior);\r\n } else if (this._attachedNode) {\r\n this._attachedNode.removeBehavior(this.boundingBoxDragBehavior);\r\n this._attachedNode.addBehavior(this.boundingBoxDragBehavior);\r\n }\r\n } else if (this.gizmos.boundingBoxGizmo) {\r\n if (this._attachedMesh) {\r\n this._attachedMesh.removeBehavior(this.boundingBoxDragBehavior);\r\n } else if (this._attachedNode) {\r\n this._attachedNode.removeBehavior(this.boundingBoxDragBehavior);\r\n }\r\n this.gizmos.boundingBoxGizmo.attachedNode = null;\r\n }\r\n this._gizmosEnabled.boundingBoxGizmo = value;\r\n }\r\n public get boundingBoxGizmoEnabled(): boolean {\r\n return this._gizmosEnabled.boundingBoxGizmo;\r\n }\r\n\r\n /**\r\n * Builds Gizmo Axis Cache to enable features such as hover state preservation and graying out other axis during manipulation\r\n * @param gizmoAxisCache Gizmo axis definition used for reactive gizmo UI\r\n */\r\n public addToAxisCache(gizmoAxisCache: Map<Mesh, GizmoAxisCache>) {\r\n if (gizmoAxisCache.size > 0) {\r\n gizmoAxisCache.forEach((v, k) => {\r\n this._gizmoAxisCache.set(k, v);\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * Disposes of the gizmo manager\r\n */\r\n public dispose() {\r\n this._pointerObservers.forEach((observer) => {\r\n this._scene.onPointerObservable.remove(observer);\r\n });\r\n for (const key in this.gizmos) {\r\n const gizmo = <Nullable<IGizmo>>(<any>this.gizmos)[key];\r\n if (gizmo) {\r\n gizmo.dispose();\r\n }\r\n }\r\n if (this._defaultKeepDepthUtilityLayer !== UtilityLayerRenderer._DefaultKeepDepthUtilityLayer) {\r\n this._defaultKeepDepthUtilityLayer?.dispose();\r\n }\r\n if (this._defaultUtilityLayer !== UtilityLayerRenderer._DefaultUtilityLayer) {\r\n this._defaultUtilityLayer?.dispose();\r\n }\r\n this.boundingBoxDragBehavior.detach();\r\n this.onAttachedToMeshObservable.clear();\r\n }\r\n}\r\n"]}
@@ -1,20 +1,37 @@
1
1
  import type { Nullable } from "../types";
2
+ import { Vector3 } from "../Maths/math.vector";
3
+ import { Mesh } from "../Meshes/mesh";
4
+ import type { IGizmo } from "./gizmo";
2
5
  import { Gizmo } from "./gizmo";
3
6
  import { UtilityLayerRenderer } from "../Rendering/utilityLayerRenderer";
4
7
  import type { Node } from "../node";
5
8
  import { StandardMaterial } from "../Materials/standardMaterial";
6
9
  import type { Light } from "../Lights/light";
10
+ import { TransformNode } from "../Meshes/transformNode";
11
+ import type { PointerInfo } from "../Events/pointerEvents";
12
+ import type { Observer } from "../Misc/observable";
7
13
  import { Observable } from "../Misc/observable";
14
+ /**
15
+ * Interface for light gizmo
16
+ */
17
+ export interface ILightGizmo extends IGizmo {
18
+ /** Event that fires each time the gizmo is clicked */
19
+ onClickedObservable: Observable<Light>;
20
+ /** The light that the gizmo is attached to */
21
+ light: Nullable<Light>;
22
+ /** The material used to render the light gizmo */
23
+ readonly material: StandardMaterial;
24
+ }
8
25
  /**
9
26
  * Gizmo that enables viewing a light
10
27
  */
11
- export declare class LightGizmo extends Gizmo {
12
- private _lightMesh;
13
- private _material;
14
- private _cachedPosition;
15
- private _cachedForward;
16
- private _attachedMeshParent;
17
- private _pointerObserver;
28
+ export declare class LightGizmo extends Gizmo implements ILightGizmo {
29
+ protected _lightMesh: Mesh;
30
+ protected _material: StandardMaterial;
31
+ protected _cachedPosition: Vector3;
32
+ protected _cachedForward: Vector3;
33
+ protected _attachedMeshParent: TransformNode;
34
+ protected _pointerObserver: Nullable<Observer<PointerInfo>>;
18
35
  /**
19
36
  * Event that fires each time the gizmo is clicked
20
37
  */
@@ -24,7 +41,7 @@ export declare class LightGizmo extends Gizmo {
24
41
  * @param gizmoLayer The utility layer the gizmo will be added to
25
42
  */
26
43
  constructor(gizmoLayer?: UtilityLayerRenderer);
27
- private _light;
44
+ protected _light: Nullable<Light>;
28
45
  /**
29
46
  * Override attachedNode because lightgizmo only support attached mesh
30
47
  * It will return the attached mesh (if any) and setting an attached node will log
@@ -1 +1 @@
1
- {"version":3,"file":"lightGizmo.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Gizmos/lightGizmo.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../types\";\r\nimport { Vector3, Quaternion } from \"../Maths/math.vector\";\r\nimport { Color3 } from \"../Maths/math.color\";\r\nimport { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\nimport { Gizmo } from \"./gizmo\";\r\nimport { UtilityLayerRenderer } from \"../Rendering/utilityLayerRenderer\";\r\nimport type { Node } from \"../node\";\r\nimport { StandardMaterial } from \"../Materials/standardMaterial\";\r\nimport type { Light } from \"../Lights/light\";\r\nimport type { Scene } from \"../scene\";\r\nimport { HemisphericLight } from \"../Lights/hemisphericLight\";\r\nimport { DirectionalLight } from \"../Lights/directionalLight\";\r\nimport { CreateSphere } from \"../Meshes/Builders/sphereBuilder\";\r\nimport { CreateHemisphere } from \"../Meshes/Builders/hemisphereBuilder\";\r\nimport { SpotLight } from \"../Lights/spotLight\";\r\nimport { TransformNode } from \"../Meshes/transformNode\";\r\nimport type { PointerInfo } from \"../Events/pointerEvents\";\r\nimport { PointerEventTypes } from \"../Events/pointerEvents\";\r\nimport type { Observer } from \"../Misc/observable\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport { CreateCylinder } from \"../Meshes/Builders/cylinderBuilder\";\r\n\r\n/**\r\n * Gizmo that enables viewing a light\r\n */\r\nexport class LightGizmo extends Gizmo {\r\n private _lightMesh: Mesh;\r\n private _material: StandardMaterial;\r\n private _cachedPosition = new Vector3();\r\n private _cachedForward = new Vector3(0, 0, 1);\r\n private _attachedMeshParent: TransformNode;\r\n private _pointerObserver: Nullable<Observer<PointerInfo>> = null;\r\n\r\n /**\r\n * Event that fires each time the gizmo is clicked\r\n */\r\n public onClickedObservable = new Observable<Light>();\r\n\r\n /**\r\n * Creates a LightGizmo\r\n * @param gizmoLayer The utility layer the gizmo will be added to\r\n */\r\n constructor(gizmoLayer: UtilityLayerRenderer = UtilityLayerRenderer.DefaultUtilityLayer) {\r\n super(gizmoLayer);\r\n this.attachedMesh = new AbstractMesh(\"\", this.gizmoLayer.utilityLayerScene);\r\n this._attachedMeshParent = new TransformNode(\"parent\", this.gizmoLayer.utilityLayerScene);\r\n\r\n this.attachedMesh.parent = this._attachedMeshParent;\r\n this._material = new StandardMaterial(\"light\", this.gizmoLayer.utilityLayerScene);\r\n this._material.diffuseColor = new Color3(0.5, 0.5, 0.5);\r\n this._material.specularColor = new Color3(0.1, 0.1, 0.1);\r\n\r\n this._pointerObserver = gizmoLayer.utilityLayerScene.onPointerObservable.add((pointerInfo) => {\r\n if (!this._light) {\r\n return;\r\n }\r\n\r\n this._isHovered = !!(pointerInfo.pickInfo && this._rootMesh.getChildMeshes().indexOf(<Mesh>pointerInfo.pickInfo.pickedMesh) != -1);\r\n if (this._isHovered && pointerInfo.event.button === 0) {\r\n this.onClickedObservable.notifyObservers(this._light);\r\n }\r\n }, PointerEventTypes.POINTERDOWN);\r\n }\r\n private _light: Nullable<Light> = null;\r\n\r\n /**\r\n * Override attachedNode because lightgizmo only support attached mesh\r\n * It will return the attached mesh (if any) and setting an attached node will log\r\n * a warning\r\n */\r\n public get attachedNode() {\r\n return this.attachedMesh;\r\n }\r\n public set attachedNode(value: Nullable<Node>) {\r\n console.warn(\"Nodes cannot be attached to LightGizmo. Attach to a mesh instead.\");\r\n }\r\n\r\n /**\r\n * The light that the gizmo is attached to\r\n */\r\n public set light(light: Nullable<Light>) {\r\n this._light = light;\r\n if (light) {\r\n // Create the mesh for the given light type\r\n if (this._lightMesh) {\r\n this._lightMesh.dispose();\r\n }\r\n\r\n if (light instanceof HemisphericLight) {\r\n this._lightMesh = LightGizmo._CreateHemisphericLightMesh(this.gizmoLayer.utilityLayerScene);\r\n } else if (light instanceof DirectionalLight) {\r\n this._lightMesh = LightGizmo._CreateDirectionalLightMesh(this.gizmoLayer.utilityLayerScene);\r\n } else if (light instanceof SpotLight) {\r\n this._lightMesh = LightGizmo._CreateSpotLightMesh(this.gizmoLayer.utilityLayerScene);\r\n } else {\r\n this._lightMesh = LightGizmo._CreatePointLightMesh(this.gizmoLayer.utilityLayerScene);\r\n }\r\n this._lightMesh.getChildMeshes(false).forEach((m) => {\r\n m.material = this._material;\r\n });\r\n this._lightMesh.parent = this._rootMesh;\r\n\r\n // Add lighting to the light gizmo\r\n const gizmoLight = this.gizmoLayer._getSharedGizmoLight();\r\n gizmoLight.includedOnlyMeshes = gizmoLight.includedOnlyMeshes.concat(this._lightMesh.getChildMeshes(false));\r\n\r\n this._lightMesh.rotationQuaternion = new Quaternion();\r\n\r\n if (!this.attachedMesh!.reservedDataStore) {\r\n this.attachedMesh!.reservedDataStore = {};\r\n }\r\n this.attachedMesh!.reservedDataStore.lightGizmo = this;\r\n\r\n if (light.parent) {\r\n this._attachedMeshParent.freezeWorldMatrix(light.parent.getWorldMatrix());\r\n }\r\n\r\n // Get update position and direction if the light has it\r\n if ((light as any).position) {\r\n this.attachedMesh!.position.copyFrom((light as any).position);\r\n this.attachedMesh!.computeWorldMatrix(true);\r\n this._cachedPosition.copyFrom(this.attachedMesh!.position);\r\n }\r\n if ((light as any).direction) {\r\n this.attachedMesh!.setDirection((light as any).direction);\r\n this.attachedMesh!.computeWorldMatrix(true);\r\n this._cachedForward.copyFrom(this.attachedMesh!.forward);\r\n }\r\n\r\n this._update();\r\n }\r\n }\r\n public get light() {\r\n return this._light;\r\n }\r\n\r\n /**\r\n * Gets the material used to render the light gizmo\r\n */\r\n public get material() {\r\n return this._material;\r\n }\r\n\r\n /**\r\n * @hidden\r\n * Updates the gizmo to match the attached mesh's position/rotation\r\n */\r\n protected _update() {\r\n super._update();\r\n if (!this._light) {\r\n return;\r\n }\r\n\r\n if (this._light.parent) {\r\n this._attachedMeshParent.freezeWorldMatrix(this._light.parent.getWorldMatrix());\r\n }\r\n\r\n // For light position and direction, a dirty flag is set to true in the setter\r\n // It means setting values individually or copying values will not call setter and\r\n // dirty flag will not be set to true. Hence creating a new Vector3.\r\n if ((this._light as any).position) {\r\n // If the gizmo is moved update the light otherwise update the gizmo to match the light\r\n if (!this.attachedMesh!.position.equals(this._cachedPosition)) {\r\n // update light to match gizmo\r\n const position = this.attachedMesh!.position;\r\n (this._light as any).position = new Vector3(position.x, position.y, position.z);\r\n this._cachedPosition.copyFrom(this.attachedMesh!.position);\r\n } else {\r\n // update gizmo to match light\r\n this.attachedMesh!.position.copyFrom((this._light as any).position);\r\n this.attachedMesh!.computeWorldMatrix(true);\r\n this._cachedPosition.copyFrom(this.attachedMesh!.position);\r\n }\r\n }\r\n if ((this._light as any).direction) {\r\n // If the gizmo is moved update the light otherwise update the gizmo to match the light\r\n if (Vector3.DistanceSquared(this.attachedMesh!.forward, this._cachedForward) > 0.0001) {\r\n // update light to match gizmo\r\n const direction = this.attachedMesh!.forward;\r\n (this._light as any).direction = new Vector3(direction.x, direction.y, direction.z);\r\n this._cachedForward.copyFrom(this.attachedMesh!.forward);\r\n } else if (Vector3.DistanceSquared(this.attachedMesh!.forward, (this._light as any).direction) > 0.0001) {\r\n // update gizmo to match light\r\n this.attachedMesh!.setDirection((this._light as any).direction);\r\n this.attachedMesh!.computeWorldMatrix(true);\r\n this._cachedForward.copyFrom(this.attachedMesh!.forward);\r\n }\r\n }\r\n }\r\n\r\n // Static helper methods\r\n private static _Scale = 0.007;\r\n\r\n /**\r\n * Creates the lines for a light mesh\r\n * @param levels\r\n * @param scene\r\n */\r\n private static _CreateLightLines = (levels: number, scene: Scene) => {\r\n const distFromSphere = 1.2;\r\n\r\n const root = new Mesh(\"root\", scene);\r\n root.rotation.x = Math.PI / 2;\r\n\r\n // Create the top line, this will be cloned for all other lines\r\n const linePivot = new Mesh(\"linePivot\", scene);\r\n linePivot.parent = root;\r\n const line = CreateCylinder(\r\n \"line\",\r\n {\r\n updatable: false,\r\n height: 2,\r\n diameterTop: 0.2,\r\n diameterBottom: 0.3,\r\n tessellation: 6,\r\n subdivisions: 1,\r\n },\r\n scene\r\n );\r\n line.position.y = line.scaling.y / 2 + distFromSphere;\r\n line.parent = linePivot;\r\n\r\n if (levels < 2) {\r\n return linePivot;\r\n }\r\n for (let i = 0; i < 4; i++) {\r\n const l = linePivot.clone(\"lineParentClone\")!;\r\n l.rotation.z = Math.PI / 4;\r\n l.rotation.y = Math.PI / 2 + (Math.PI / 2) * i;\r\n\r\n l.getChildMeshes()[0].scaling.y = 0.5;\r\n l.getChildMeshes()[0].scaling.x = l.getChildMeshes()[0].scaling.z = 0.8;\r\n l.getChildMeshes()[0].position.y = l.getChildMeshes()[0].scaling.y / 2 + distFromSphere;\r\n }\r\n\r\n if (levels < 3) {\r\n return root;\r\n }\r\n for (let i = 0; i < 4; i++) {\r\n const l = linePivot.clone(\"linePivotClone\");\r\n l.rotation.z = Math.PI / 2;\r\n l.rotation.y = (Math.PI / 2) * i;\r\n }\r\n\r\n if (levels < 4) {\r\n return root;\r\n }\r\n for (let i = 0; i < 4; i++) {\r\n const l = linePivot.clone(\"linePivotClone\");\r\n l.rotation.z = Math.PI + Math.PI / 4;\r\n l.rotation.y = Math.PI / 2 + (Math.PI / 2) * i;\r\n\r\n l.getChildMeshes()[0].scaling.y = 0.5;\r\n l.getChildMeshes()[0].scaling.x = l.getChildMeshes()[0].scaling.z = 0.8;\r\n l.getChildMeshes()[0].position.y = l.getChildMeshes()[0].scaling.y / 2 + distFromSphere;\r\n }\r\n\r\n if (levels < 5) {\r\n return root;\r\n }\r\n const l = linePivot.clone(\"linePivotClone\");\r\n l.rotation.z = Math.PI;\r\n\r\n return root;\r\n };\r\n\r\n /**\r\n * Disposes of the light gizmo\r\n */\r\n public dispose() {\r\n this.onClickedObservable.clear();\r\n this.gizmoLayer.utilityLayerScene.onPointerObservable.remove(this._pointerObserver);\r\n this._material.dispose();\r\n super.dispose();\r\n this._attachedMeshParent.dispose();\r\n }\r\n\r\n private static _CreateHemisphericLightMesh(scene: Scene) {\r\n const root = new Mesh(\"hemisphereLight\", scene);\r\n const hemisphere = CreateHemisphere(root.name, { segments: 10, diameter: 1 }, scene);\r\n hemisphere.position.z = -0.15;\r\n hemisphere.rotation.x = Math.PI / 2;\r\n hemisphere.parent = root;\r\n\r\n const lines = this._CreateLightLines(3, scene);\r\n lines.parent = root;\r\n\r\n root.scaling.scaleInPlace(LightGizmo._Scale);\r\n root.rotation.x = Math.PI / 2;\r\n\r\n return root;\r\n }\r\n\r\n private static _CreatePointLightMesh(scene: Scene) {\r\n const root = new Mesh(\"pointLight\", scene);\r\n const sphere = CreateSphere(root.name, { segments: 10, diameter: 1 }, scene);\r\n sphere.rotation.x = Math.PI / 2;\r\n sphere.parent = root;\r\n\r\n const lines = this._CreateLightLines(5, scene);\r\n lines.parent = root;\r\n root.scaling.scaleInPlace(LightGizmo._Scale);\r\n root.rotation.x = Math.PI / 2;\r\n\r\n return root;\r\n }\r\n\r\n private static _CreateSpotLightMesh(scene: Scene) {\r\n const root = new Mesh(\"spotLight\", scene);\r\n const sphere = CreateSphere(root.name, { segments: 10, diameter: 1 }, scene);\r\n sphere.parent = root;\r\n\r\n const hemisphere = CreateHemisphere(root.name, { segments: 10, diameter: 2 }, scene);\r\n hemisphere.parent = root;\r\n hemisphere.rotation.x = -Math.PI / 2;\r\n\r\n const lines = this._CreateLightLines(2, scene);\r\n lines.parent = root;\r\n root.scaling.scaleInPlace(LightGizmo._Scale);\r\n root.rotation.x = Math.PI / 2;\r\n\r\n return root;\r\n }\r\n\r\n private static _CreateDirectionalLightMesh(scene: Scene) {\r\n const root = new Mesh(\"directionalLight\", scene);\r\n\r\n const mesh = new Mesh(root.name, scene);\r\n mesh.parent = root;\r\n const sphere = CreateSphere(root.name, { diameter: 1.2, segments: 10 }, scene);\r\n sphere.parent = mesh;\r\n\r\n const line = CreateCylinder(\r\n root.name,\r\n {\r\n updatable: false,\r\n height: 6,\r\n diameterTop: 0.3,\r\n diameterBottom: 0.3,\r\n tessellation: 6,\r\n subdivisions: 1,\r\n },\r\n scene\r\n );\r\n line.parent = mesh;\r\n\r\n let left = line.clone(root.name)!;\r\n left.scaling.y = 0.5;\r\n left.position.x += 1.25;\r\n\r\n let right = line.clone(root.name)!;\r\n right.scaling.y = 0.5;\r\n right.position.x += -1.25;\r\n\r\n const arrowHead = CreateCylinder(\r\n root.name,\r\n {\r\n updatable: false,\r\n height: 1,\r\n diameterTop: 0,\r\n diameterBottom: 0.6,\r\n tessellation: 6,\r\n subdivisions: 1,\r\n },\r\n scene\r\n );\r\n arrowHead.position.y += 3;\r\n arrowHead.parent = mesh;\r\n\r\n left = arrowHead.clone(root.name);\r\n left.position.y = 1.5;\r\n left.position.x += 1.25;\r\n\r\n right = arrowHead.clone(root.name);\r\n right.position.y = 1.5;\r\n right.position.x += -1.25;\r\n\r\n mesh.scaling.scaleInPlace(LightGizmo._Scale);\r\n mesh.rotation.z = Math.PI / 2;\r\n mesh.rotation.y = Math.PI / 2;\r\n return root;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"lightGizmo.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Gizmos/lightGizmo.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Nullable } from \"../types\";\r\nimport { Vector3, Quaternion } from \"../Maths/math.vector\";\r\nimport { Color3 } from \"../Maths/math.color\";\r\nimport { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\nimport type { IGizmo } from \"./gizmo\";\r\nimport { Gizmo } from \"./gizmo\";\r\nimport { UtilityLayerRenderer } from \"../Rendering/utilityLayerRenderer\";\r\nimport type { Node } from \"../node\";\r\nimport { StandardMaterial } from \"../Materials/standardMaterial\";\r\nimport type { Light } from \"../Lights/light\";\r\nimport type { Scene } from \"../scene\";\r\nimport { HemisphericLight } from \"../Lights/hemisphericLight\";\r\nimport { DirectionalLight } from \"../Lights/directionalLight\";\r\nimport { CreateSphere } from \"../Meshes/Builders/sphereBuilder\";\r\nimport { CreateHemisphere } from \"../Meshes/Builders/hemisphereBuilder\";\r\nimport { SpotLight } from \"../Lights/spotLight\";\r\nimport { TransformNode } from \"../Meshes/transformNode\";\r\nimport type { PointerInfo } from \"../Events/pointerEvents\";\r\nimport { PointerEventTypes } from \"../Events/pointerEvents\";\r\nimport type { Observer } from \"../Misc/observable\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport { CreateCylinder } from \"../Meshes/Builders/cylinderBuilder\";\r\n\r\n/**\r\n * Interface for light gizmo\r\n */\r\nexport interface ILightGizmo extends IGizmo {\r\n /** Event that fires each time the gizmo is clicked */\r\n onClickedObservable: Observable<Light>;\r\n /** The light that the gizmo is attached to */\r\n light: Nullable<Light>;\r\n /** The material used to render the light gizmo */\r\n readonly material: StandardMaterial;\r\n}\r\n\r\n/**\r\n * Gizmo that enables viewing a light\r\n */\r\nexport class LightGizmo extends Gizmo implements ILightGizmo {\r\n protected _lightMesh: Mesh;\r\n protected _material: StandardMaterial;\r\n protected _cachedPosition = new Vector3();\r\n protected _cachedForward = new Vector3(0, 0, 1);\r\n protected _attachedMeshParent: TransformNode;\r\n protected _pointerObserver: Nullable<Observer<PointerInfo>> = null;\r\n\r\n /**\r\n * Event that fires each time the gizmo is clicked\r\n */\r\n public onClickedObservable = new Observable<Light>();\r\n\r\n /**\r\n * Creates a LightGizmo\r\n * @param gizmoLayer The utility layer the gizmo will be added to\r\n */\r\n constructor(gizmoLayer: UtilityLayerRenderer = UtilityLayerRenderer.DefaultUtilityLayer) {\r\n super(gizmoLayer);\r\n this.attachedMesh = new AbstractMesh(\"\", this.gizmoLayer.utilityLayerScene);\r\n this._attachedMeshParent = new TransformNode(\"parent\", this.gizmoLayer.utilityLayerScene);\r\n\r\n this.attachedMesh.parent = this._attachedMeshParent;\r\n this._material = new StandardMaterial(\"light\", this.gizmoLayer.utilityLayerScene);\r\n this._material.diffuseColor = new Color3(0.5, 0.5, 0.5);\r\n this._material.specularColor = new Color3(0.1, 0.1, 0.1);\r\n\r\n this._pointerObserver = gizmoLayer.utilityLayerScene.onPointerObservable.add((pointerInfo) => {\r\n if (!this._light) {\r\n return;\r\n }\r\n\r\n this._isHovered = !!(pointerInfo.pickInfo && this._rootMesh.getChildMeshes().indexOf(<Mesh>pointerInfo.pickInfo.pickedMesh) != -1);\r\n if (this._isHovered && pointerInfo.event.button === 0) {\r\n this.onClickedObservable.notifyObservers(this._light);\r\n }\r\n }, PointerEventTypes.POINTERDOWN);\r\n }\r\n protected _light: Nullable<Light> = null;\r\n\r\n /**\r\n * Override attachedNode because lightgizmo only support attached mesh\r\n * It will return the attached mesh (if any) and setting an attached node will log\r\n * a warning\r\n */\r\n public get attachedNode() {\r\n return this.attachedMesh;\r\n }\r\n public set attachedNode(value: Nullable<Node>) {\r\n console.warn(\"Nodes cannot be attached to LightGizmo. Attach to a mesh instead.\");\r\n }\r\n\r\n /**\r\n * The light that the gizmo is attached to\r\n */\r\n public set light(light: Nullable<Light>) {\r\n this._light = light;\r\n if (light) {\r\n // Create the mesh for the given light type\r\n if (this._lightMesh) {\r\n this._lightMesh.dispose();\r\n }\r\n\r\n if (light instanceof HemisphericLight) {\r\n this._lightMesh = LightGizmo._CreateHemisphericLightMesh(this.gizmoLayer.utilityLayerScene);\r\n } else if (light instanceof DirectionalLight) {\r\n this._lightMesh = LightGizmo._CreateDirectionalLightMesh(this.gizmoLayer.utilityLayerScene);\r\n } else if (light instanceof SpotLight) {\r\n this._lightMesh = LightGizmo._CreateSpotLightMesh(this.gizmoLayer.utilityLayerScene);\r\n } else {\r\n this._lightMesh = LightGizmo._CreatePointLightMesh(this.gizmoLayer.utilityLayerScene);\r\n }\r\n this._lightMesh.getChildMeshes(false).forEach((m) => {\r\n m.material = this._material;\r\n });\r\n this._lightMesh.parent = this._rootMesh;\r\n\r\n // Add lighting to the light gizmo\r\n const gizmoLight = this.gizmoLayer._getSharedGizmoLight();\r\n gizmoLight.includedOnlyMeshes = gizmoLight.includedOnlyMeshes.concat(this._lightMesh.getChildMeshes(false));\r\n\r\n this._lightMesh.rotationQuaternion = new Quaternion();\r\n\r\n if (!this.attachedMesh!.reservedDataStore) {\r\n this.attachedMesh!.reservedDataStore = {};\r\n }\r\n this.attachedMesh!.reservedDataStore.lightGizmo = this;\r\n\r\n if (light.parent) {\r\n this._attachedMeshParent.freezeWorldMatrix(light.parent.getWorldMatrix());\r\n }\r\n\r\n // Get update position and direction if the light has it\r\n if ((light as any).position) {\r\n this.attachedMesh!.position.copyFrom((light as any).position);\r\n this.attachedMesh!.computeWorldMatrix(true);\r\n this._cachedPosition.copyFrom(this.attachedMesh!.position);\r\n }\r\n if ((light as any).direction) {\r\n this.attachedMesh!.setDirection((light as any).direction);\r\n this.attachedMesh!.computeWorldMatrix(true);\r\n this._cachedForward.copyFrom(this.attachedMesh!.forward);\r\n }\r\n\r\n this._update();\r\n }\r\n }\r\n public get light() {\r\n return this._light;\r\n }\r\n\r\n /**\r\n * Gets the material used to render the light gizmo\r\n */\r\n public get material() {\r\n return this._material;\r\n }\r\n\r\n /**\r\n * @hidden\r\n * Updates the gizmo to match the attached mesh's position/rotation\r\n */\r\n protected _update() {\r\n super._update();\r\n if (!this._light) {\r\n return;\r\n }\r\n\r\n if (this._light.parent) {\r\n this._attachedMeshParent.freezeWorldMatrix(this._light.parent.getWorldMatrix());\r\n }\r\n\r\n // For light position and direction, a dirty flag is set to true in the setter\r\n // It means setting values individually or copying values will not call setter and\r\n // dirty flag will not be set to true. Hence creating a new Vector3.\r\n if ((this._light as any).position) {\r\n // If the gizmo is moved update the light otherwise update the gizmo to match the light\r\n if (!this.attachedMesh!.position.equals(this._cachedPosition)) {\r\n // update light to match gizmo\r\n const position = this.attachedMesh!.position;\r\n (this._light as any).position = new Vector3(position.x, position.y, position.z);\r\n this._cachedPosition.copyFrom(this.attachedMesh!.position);\r\n } else {\r\n // update gizmo to match light\r\n this.attachedMesh!.position.copyFrom((this._light as any).position);\r\n this.attachedMesh!.computeWorldMatrix(true);\r\n this._cachedPosition.copyFrom(this.attachedMesh!.position);\r\n }\r\n }\r\n if ((this._light as any).direction) {\r\n // If the gizmo is moved update the light otherwise update the gizmo to match the light\r\n if (Vector3.DistanceSquared(this.attachedMesh!.forward, this._cachedForward) > 0.0001) {\r\n // update light to match gizmo\r\n const direction = this.attachedMesh!.forward;\r\n (this._light as any).direction = new Vector3(direction.x, direction.y, direction.z);\r\n this._cachedForward.copyFrom(this.attachedMesh!.forward);\r\n } else if (Vector3.DistanceSquared(this.attachedMesh!.forward, (this._light as any).direction) > 0.0001) {\r\n // update gizmo to match light\r\n this.attachedMesh!.setDirection((this._light as any).direction);\r\n this.attachedMesh!.computeWorldMatrix(true);\r\n this._cachedForward.copyFrom(this.attachedMesh!.forward);\r\n }\r\n }\r\n }\r\n\r\n // Static helper methods\r\n private static _Scale = 0.007;\r\n\r\n /**\r\n * Creates the lines for a light mesh\r\n * @param levels\r\n * @param scene\r\n */\r\n private static _CreateLightLines = (levels: number, scene: Scene) => {\r\n const distFromSphere = 1.2;\r\n\r\n const root = new Mesh(\"root\", scene);\r\n root.rotation.x = Math.PI / 2;\r\n\r\n // Create the top line, this will be cloned for all other lines\r\n const linePivot = new Mesh(\"linePivot\", scene);\r\n linePivot.parent = root;\r\n const line = CreateCylinder(\r\n \"line\",\r\n {\r\n updatable: false,\r\n height: 2,\r\n diameterTop: 0.2,\r\n diameterBottom: 0.3,\r\n tessellation: 6,\r\n subdivisions: 1,\r\n },\r\n scene\r\n );\r\n line.position.y = line.scaling.y / 2 + distFromSphere;\r\n line.parent = linePivot;\r\n\r\n if (levels < 2) {\r\n return linePivot;\r\n }\r\n for (let i = 0; i < 4; i++) {\r\n const l = linePivot.clone(\"lineParentClone\")!;\r\n l.rotation.z = Math.PI / 4;\r\n l.rotation.y = Math.PI / 2 + (Math.PI / 2) * i;\r\n\r\n l.getChildMeshes()[0].scaling.y = 0.5;\r\n l.getChildMeshes()[0].scaling.x = l.getChildMeshes()[0].scaling.z = 0.8;\r\n l.getChildMeshes()[0].position.y = l.getChildMeshes()[0].scaling.y / 2 + distFromSphere;\r\n }\r\n\r\n if (levels < 3) {\r\n return root;\r\n }\r\n for (let i = 0; i < 4; i++) {\r\n const l = linePivot.clone(\"linePivotClone\");\r\n l.rotation.z = Math.PI / 2;\r\n l.rotation.y = (Math.PI / 2) * i;\r\n }\r\n\r\n if (levels < 4) {\r\n return root;\r\n }\r\n for (let i = 0; i < 4; i++) {\r\n const l = linePivot.clone(\"linePivotClone\");\r\n l.rotation.z = Math.PI + Math.PI / 4;\r\n l.rotation.y = Math.PI / 2 + (Math.PI / 2) * i;\r\n\r\n l.getChildMeshes()[0].scaling.y = 0.5;\r\n l.getChildMeshes()[0].scaling.x = l.getChildMeshes()[0].scaling.z = 0.8;\r\n l.getChildMeshes()[0].position.y = l.getChildMeshes()[0].scaling.y / 2 + distFromSphere;\r\n }\r\n\r\n if (levels < 5) {\r\n return root;\r\n }\r\n const l = linePivot.clone(\"linePivotClone\");\r\n l.rotation.z = Math.PI;\r\n\r\n return root;\r\n };\r\n\r\n /**\r\n * Disposes of the light gizmo\r\n */\r\n public dispose() {\r\n this.onClickedObservable.clear();\r\n this.gizmoLayer.utilityLayerScene.onPointerObservable.remove(this._pointerObserver);\r\n this._material.dispose();\r\n super.dispose();\r\n this._attachedMeshParent.dispose();\r\n }\r\n\r\n private static _CreateHemisphericLightMesh(scene: Scene) {\r\n const root = new Mesh(\"hemisphereLight\", scene);\r\n const hemisphere = CreateHemisphere(root.name, { segments: 10, diameter: 1 }, scene);\r\n hemisphere.position.z = -0.15;\r\n hemisphere.rotation.x = Math.PI / 2;\r\n hemisphere.parent = root;\r\n\r\n const lines = this._CreateLightLines(3, scene);\r\n lines.parent = root;\r\n\r\n root.scaling.scaleInPlace(LightGizmo._Scale);\r\n root.rotation.x = Math.PI / 2;\r\n\r\n return root;\r\n }\r\n\r\n private static _CreatePointLightMesh(scene: Scene) {\r\n const root = new Mesh(\"pointLight\", scene);\r\n const sphere = CreateSphere(root.name, { segments: 10, diameter: 1 }, scene);\r\n sphere.rotation.x = Math.PI / 2;\r\n sphere.parent = root;\r\n\r\n const lines = this._CreateLightLines(5, scene);\r\n lines.parent = root;\r\n root.scaling.scaleInPlace(LightGizmo._Scale);\r\n root.rotation.x = Math.PI / 2;\r\n\r\n return root;\r\n }\r\n\r\n private static _CreateSpotLightMesh(scene: Scene) {\r\n const root = new Mesh(\"spotLight\", scene);\r\n const sphere = CreateSphere(root.name, { segments: 10, diameter: 1 }, scene);\r\n sphere.parent = root;\r\n\r\n const hemisphere = CreateHemisphere(root.name, { segments: 10, diameter: 2 }, scene);\r\n hemisphere.parent = root;\r\n hemisphere.rotation.x = -Math.PI / 2;\r\n\r\n const lines = this._CreateLightLines(2, scene);\r\n lines.parent = root;\r\n root.scaling.scaleInPlace(LightGizmo._Scale);\r\n root.rotation.x = Math.PI / 2;\r\n\r\n return root;\r\n }\r\n\r\n private static _CreateDirectionalLightMesh(scene: Scene) {\r\n const root = new Mesh(\"directionalLight\", scene);\r\n\r\n const mesh = new Mesh(root.name, scene);\r\n mesh.parent = root;\r\n const sphere = CreateSphere(root.name, { diameter: 1.2, segments: 10 }, scene);\r\n sphere.parent = mesh;\r\n\r\n const line = CreateCylinder(\r\n root.name,\r\n {\r\n updatable: false,\r\n height: 6,\r\n diameterTop: 0.3,\r\n diameterBottom: 0.3,\r\n tessellation: 6,\r\n subdivisions: 1,\r\n },\r\n scene\r\n );\r\n line.parent = mesh;\r\n\r\n let left = line.clone(root.name)!;\r\n left.scaling.y = 0.5;\r\n left.position.x += 1.25;\r\n\r\n let right = line.clone(root.name)!;\r\n right.scaling.y = 0.5;\r\n right.position.x += -1.25;\r\n\r\n const arrowHead = CreateCylinder(\r\n root.name,\r\n {\r\n updatable: false,\r\n height: 1,\r\n diameterTop: 0,\r\n diameterBottom: 0.6,\r\n tessellation: 6,\r\n subdivisions: 1,\r\n },\r\n scene\r\n );\r\n arrowHead.position.y += 3;\r\n arrowHead.parent = mesh;\r\n\r\n left = arrowHead.clone(root.name);\r\n left.position.y = 1.5;\r\n left.position.x += 1.25;\r\n\r\n right = arrowHead.clone(root.name);\r\n right.position.y = 1.5;\r\n right.position.x += -1.25;\r\n\r\n mesh.scaling.scaleInPlace(LightGizmo._Scale);\r\n mesh.rotation.z = Math.PI / 2;\r\n mesh.rotation.y = Math.PI / 2;\r\n return root;\r\n }\r\n}\r\n"]}