@babylonjs/core 5.1.0 → 5.2.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.
- package/Audio/audioSceneComponent.d.ts +2 -0
- package/Audio/audioSceneComponent.js +9 -7
- package/Audio/audioSceneComponent.js.map +1 -1
- package/Cameras/arcRotateCamera.d.ts +5 -0
- package/Cameras/arcRotateCamera.js +5 -0
- package/Cameras/arcRotateCamera.js.map +1 -1
- package/Cameras/camera.d.ts +5 -1
- package/Cameras/camera.js +7 -7
- package/Cameras/camera.js.map +1 -1
- package/Debug/debugLayer.d.ts +5 -0
- package/Debug/debugLayer.js +24 -0
- package/Debug/debugLayer.js.map +1 -1
- package/Engines/Processors/shaderCodeCursor.js +5 -0
- package/Engines/Processors/shaderCodeCursor.js.map +1 -1
- package/Engines/constants.d.ts +25 -1
- package/Engines/constants.js +25 -1
- package/Engines/constants.js.map +1 -1
- package/Engines/engine.d.ts +1 -1
- package/Engines/engine.js +1 -1
- package/Engines/engine.js.map +1 -1
- package/Engines/nativeEngine.d.ts +1 -1
- package/Engines/nativeEngine.js +7 -8
- package/Engines/nativeEngine.js.map +1 -1
- package/Engines/thinEngine.js +2 -2
- package/Engines/thinEngine.js.map +1 -1
- package/Engines/webgpuEngine.d.ts +4 -0
- package/Engines/webgpuEngine.js +2 -0
- package/Engines/webgpuEngine.js.map +1 -1
- package/Gizmos/boundingBoxGizmo.js +6 -6
- package/Gizmos/boundingBoxGizmo.js.map +1 -1
- package/Gizmos/gizmo.d.ts +5 -0
- package/Gizmos/gizmo.js +8 -2
- package/Gizmos/gizmo.js.map +1 -1
- package/Inputs/scene.inputManager.js +7 -1
- package/Inputs/scene.inputManager.js.map +1 -1
- package/Lights/Shadows/shadowGenerator.d.ts +5 -0
- package/Lights/Shadows/shadowGenerator.js +20 -2
- package/Lights/Shadows/shadowGenerator.js.map +1 -1
- package/Loading/Plugins/babylonFileLoader.js +8 -6
- package/Loading/Plugins/babylonFileLoader.js.map +1 -1
- package/Materials/Node/Blocks/PBR/clearCoatBlock.d.ts +4 -0
- package/Materials/Node/Blocks/PBR/clearCoatBlock.js +19 -1
- package/Materials/Node/Blocks/PBR/clearCoatBlock.js.map +1 -1
- package/Materials/Node/Blocks/PBR/iridescenceBlock.d.ts +54 -0
- package/Materials/Node/Blocks/PBR/iridescenceBlock.js +135 -0
- package/Materials/Node/Blocks/PBR/iridescenceBlock.js.map +1 -0
- package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.d.ts +4 -0
- package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js +42 -24
- package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js.map +1 -1
- package/Materials/PBR/index.d.ts +1 -0
- package/Materials/PBR/index.js +1 -0
- package/Materials/PBR/index.js.map +1 -1
- package/Materials/PBR/pbrBaseMaterial.d.ts +5 -0
- package/Materials/PBR/pbrBaseMaterial.js +2 -0
- package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
- package/Materials/PBR/pbrIridescenceConfiguration.d.ts +102 -0
- package/Materials/PBR/pbrIridescenceConfiguration.js +257 -0
- package/Materials/PBR/pbrIridescenceConfiguration.js.map +1 -0
- package/Materials/Textures/Loaders/ktxTextureLoader.js +31 -0
- package/Materials/Textures/Loaders/ktxTextureLoader.js.map +1 -1
- package/Materials/Textures/videoTexture.js +12 -12
- package/Materials/Textures/videoTexture.js.map +1 -1
- package/Materials/materialFlags.d.ts +6 -0
- package/Materials/materialFlags.js +18 -0
- package/Materials/materialFlags.js.map +1 -1
- package/Materials/materialPluginFactoryExport.d.ts +6 -0
- package/Materials/materialPluginFactoryExport.js +12 -0
- package/Materials/materialPluginFactoryExport.js.map +1 -1
- package/Meshes/abstractMesh.d.ts +1 -1
- package/Meshes/abstractMesh.js +5 -2
- package/Meshes/abstractMesh.js.map +1 -1
- package/Meshes/mesh.d.ts +2 -2
- package/Meshes/mesh.js +11 -3
- package/Meshes/mesh.js.map +1 -1
- package/Misc/khronosTextureContainer.js +1 -1
- package/Misc/khronosTextureContainer.js.map +1 -1
- package/Physics/physicsImpostor.js +1 -1
- package/Physics/physicsImpostor.js.map +1 -1
- package/Rendering/boundingBoxRenderer.js +4 -4
- package/Rendering/boundingBoxRenderer.js.map +1 -1
- package/Shaders/ShadersInclude/boundingBoxRendererUboDeclaration.js +1 -1
- package/Shaders/ShadersInclude/boundingBoxRendererUboDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/helperFunctions.js +1 -1
- package/Shaders/ShadersInclude/helperFunctions.js.map +1 -1
- package/Shaders/ShadersInclude/lightFragment.js +1 -1
- package/Shaders/ShadersInclude/lightFragment.js.map +1 -1
- package/Shaders/ShadersInclude/pbrBRDFFunctions.js +1 -1
- package/Shaders/ShadersInclude/pbrBRDFFunctions.js.map +1 -1
- package/Shaders/ShadersInclude/pbrBlockIridescence.d.ts +5 -0
- package/Shaders/ShadersInclude/pbrBlockIridescence.js +9 -0
- package/Shaders/ShadersInclude/pbrBlockIridescence.js.map +1 -0
- package/Shaders/ShadersInclude/pbrDirectLightingFunctions.js +1 -1
- package/Shaders/ShadersInclude/pbrDirectLightingFunctions.js.map +1 -1
- package/Shaders/ShadersInclude/pbrDirectLightingSetupFunctions.js +1 -1
- package/Shaders/ShadersInclude/pbrDirectLightingSetupFunctions.js.map +1 -1
- package/Shaders/ShadersInclude/pbrFragmentDeclaration.js +1 -1
- package/Shaders/ShadersInclude/pbrFragmentDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/pbrFragmentSamplersDeclaration.js +1 -1
- package/Shaders/ShadersInclude/pbrFragmentSamplersDeclaration.js.map +1 -1
- package/Shaders/ShadersInclude/pbrVertexDeclaration.js +1 -1
- package/Shaders/ShadersInclude/pbrVertexDeclaration.js.map +1 -1
- package/Shaders/pbr.fragment.d.ts +1 -0
- package/Shaders/pbr.fragment.js +2 -1
- package/Shaders/pbr.fragment.js.map +1 -1
- package/Shaders/pbr.vertex.js +1 -1
- package/Shaders/pbr.vertex.js.map +1 -1
- package/XR/features/WebXRImageTracking.d.ts +0 -5
- package/XR/features/WebXRImageTracking.js +5 -8
- package/XR/features/WebXRImageTracking.js.map +1 -1
- package/XR/native/nativeXRFrame.d.ts +2 -1
- package/XR/native/nativeXRFrame.js +5 -1
- package/XR/native/nativeXRFrame.js.map +1 -1
- package/package.json +1 -1
- package/scene.d.ts +4 -0
- package/scene.js +4 -0
- package/scene.js.map +1 -1
|
@@ -199,9 +199,9 @@ var BoundingBoxGizmo = /** @class */ (function (_super) {
|
|
|
199
199
|
Quaternion.RotationYawPitchRollToRef(0, projectDist, 0, _this._tmpQuaternion);
|
|
200
200
|
}
|
|
201
201
|
// Rotate around center of bounding box
|
|
202
|
-
_this._anchorMesh.addChild(_this.attachedMesh);
|
|
202
|
+
_this._anchorMesh.addChild(_this.attachedMesh, Gizmo.PreserveScaling);
|
|
203
203
|
_this._anchorMesh.rotationQuaternion.multiplyToRef(_this._tmpQuaternion, _this._anchorMesh.rotationQuaternion);
|
|
204
|
-
_this._anchorMesh.removeChild(_this.attachedMesh);
|
|
204
|
+
_this._anchorMesh.removeChild(_this.attachedMesh, Gizmo.PreserveScaling);
|
|
205
205
|
_this.attachedMesh.setParent(originalParent);
|
|
206
206
|
}
|
|
207
207
|
_this.updateBoundingBox();
|
|
@@ -282,12 +282,12 @@ var BoundingBoxGizmo = /** @class */ (function (_super) {
|
|
|
282
282
|
box.absolutePosition.subtractToRef(_this._anchorMesh.position, _this._tmpVector);
|
|
283
283
|
_this._anchorMesh.position.subtractInPlace(_this._tmpVector);
|
|
284
284
|
}
|
|
285
|
-
_this._anchorMesh.addChild(_this.attachedMesh);
|
|
285
|
+
_this._anchorMesh.addChild(_this.attachedMesh, Gizmo.PreserveScaling);
|
|
286
286
|
_this._anchorMesh.scaling.addInPlace(deltaScale);
|
|
287
287
|
if (_this._anchorMesh.scaling.x < 0 || _this._anchorMesh.scaling.y < 0 || _this._anchorMesh.scaling.z < 0) {
|
|
288
288
|
_this._anchorMesh.scaling.subtractInPlace(deltaScale);
|
|
289
289
|
}
|
|
290
|
-
_this._anchorMesh.removeChild(_this.attachedMesh);
|
|
290
|
+
_this._anchorMesh.removeChild(_this.attachedMesh, Gizmo.PreserveScaling);
|
|
291
291
|
_this.attachedMesh.setParent(originalParent);
|
|
292
292
|
PivotTools._RestorePivotPoint(_this.attachedMesh);
|
|
293
293
|
}
|
|
@@ -428,8 +428,8 @@ var BoundingBoxGizmo = /** @class */ (function (_super) {
|
|
|
428
428
|
this._anchorMesh.scaling.setAll(1);
|
|
429
429
|
PivotTools._RemoveAndStorePivotPoint(value);
|
|
430
430
|
var originalParent = value.parent;
|
|
431
|
-
this._anchorMesh.addChild(value);
|
|
432
|
-
this._anchorMesh.removeChild(value);
|
|
431
|
+
this._anchorMesh.addChild(value, Gizmo.PreserveScaling);
|
|
432
|
+
this._anchorMesh.removeChild(value, Gizmo.PreserveScaling);
|
|
433
433
|
value.setParent(originalParent);
|
|
434
434
|
PivotTools._RestorePivotPoint(value);
|
|
435
435
|
this.updateBoundingBox();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"boundingBoxGizmo.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Gizmos/boundingBoxGizmo.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Observer } from \"../Misc/observable\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { PointerInfo } from \"../Events/pointerEvents\";\r\nimport type { Scene } from \"../scene\";\r\nimport { Quaternion, Matrix, Vector3 } from \"../Maths/math.vector\";\r\nimport { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { Mesh } from \"../Meshes/mesh\";\r\nimport { CreateSphere } from \"../Meshes/Builders/sphereBuilder\";\r\nimport { CreateBox } from \"../Meshes/Builders/boxBuilder\";\r\nimport { CreateLines } from \"../Meshes/Builders/linesBuilder\";\r\nimport { PointerDragBehavior } from \"../Behaviors/Meshes/pointerDragBehavior\";\r\nimport { Gizmo } from \"./gizmo\";\r\nimport { UtilityLayerRenderer } from \"../Rendering/utilityLayerRenderer\";\r\nimport { StandardMaterial } from \"../Materials/standardMaterial\";\r\nimport { PivotTools } from \"../Misc/pivotTools\";\r\nimport { Color3 } from \"../Maths/math.color\";\r\n\r\nimport type { LinesMesh } from \"../Meshes/linesMesh\";\r\nimport { Epsilon } from \"../Maths/math.constants\";\r\nimport type { IPointerEvent } from \"../Events/deviceInputEvents\";\r\n\r\n/**\r\n * Bounding box gizmo\r\n */\r\nexport class BoundingBoxGizmo extends Gizmo {\r\n private _lineBoundingBox: AbstractMesh;\r\n private _rotateSpheresParent: AbstractMesh;\r\n private _scaleBoxesParent: AbstractMesh;\r\n private _boundingDimensions = new Vector3(1, 1, 1);\r\n private _renderObserver: Nullable<Observer<Scene>> = null;\r\n private _pointerObserver: Nullable<Observer<PointerInfo>> = null;\r\n private _scaleDragSpeed = 0.2;\r\n\r\n private _tmpQuaternion = new Quaternion();\r\n private _tmpVector = new Vector3(0, 0, 0);\r\n private _tmpRotationMatrix = new Matrix();\r\n /**\r\n * If child meshes should be ignored when calculating the bounding box. This should be set to true to avoid perf hits with heavily nested meshes (Default: false)\r\n */\r\n public ignoreChildren = false;\r\n /**\r\n * Returns true if a descendant should be included when computing the bounding box. When null, all descendants are included. If ignoreChildren is set this will be ignored. (Default: null)\r\n */\r\n public includeChildPredicate: Nullable<(abstractMesh: AbstractMesh) => boolean> = null;\r\n\r\n /**\r\n * The size of the rotation spheres attached to the bounding box (Default: 0.1)\r\n */\r\n public rotationSphereSize = 0.1;\r\n /**\r\n * The size of the scale boxes attached to the bounding box (Default: 0.1)\r\n */\r\n public scaleBoxSize = 0.1;\r\n /**\r\n * If set, the rotation spheres and scale boxes will increase in size based on the distance away from the camera to have a consistent screen size (Default: false)\r\n * Note : fixedDragMeshScreenSize takes precedence over fixedDragMeshBoundsSize if both are true\r\n */\r\n public fixedDragMeshScreenSize = false;\r\n /**\r\n * If set, the rotation spheres and scale boxes will increase in size based on the size of the bounding box\r\n * Note : fixedDragMeshScreenSize takes precedence over fixedDragMeshBoundsSize if both are true\r\n */\r\n public fixedDragMeshBoundsSize = false;\r\n /**\r\n * The distance away from the object which the draggable meshes should appear world sized when fixedDragMeshScreenSize is set to true (default: 10)\r\n */\r\n public fixedDragMeshScreenSizeDistanceFactor = 10;\r\n /**\r\n * Fired when a rotation sphere or scale box is dragged\r\n */\r\n public onDragStartObservable = new Observable<{}>();\r\n /**\r\n * Fired when a scale box is dragged\r\n */\r\n public onScaleBoxDragObservable = new Observable<{}>();\r\n /**\r\n * Fired when a scale box drag is ended\r\n */\r\n public onScaleBoxDragEndObservable = new Observable<{}>();\r\n /**\r\n * Fired when a rotation sphere is dragged\r\n */\r\n public onRotationSphereDragObservable = new Observable<{}>();\r\n /**\r\n * Fired when a rotation sphere drag is ended\r\n */\r\n public onRotationSphereDragEndObservable = new Observable<{}>();\r\n /**\r\n * Relative bounding box pivot used when scaling the attached node. When null object with scale from the opposite corner. 0.5,0.5,0.5 for center and 0.5,0,0.5 for bottom (Default: null)\r\n */\r\n public scalePivot: Nullable<Vector3> = null;\r\n /**\r\n * Scale factor used for masking some axis\r\n */\r\n private _axisFactor = new Vector3(1, 1, 1);\r\n\r\n /**\r\n * Sets the axis factor\r\n * @param factor the Vector3 value\r\n */\r\n public set axisFactor(factor: Vector3) {\r\n this._axisFactor = factor;\r\n // update scale cube visibility\r\n const scaleBoxes = this._scaleBoxesParent.getChildMeshes();\r\n let index = 0;\r\n for (let i = 0; i < 3; i++) {\r\n for (let j = 0; j < 3; j++) {\r\n for (let k = 0; k < 3; k++) {\r\n const zeroAxisCount = (i === 1 ? 1 : 0) + (j === 1 ? 1 : 0) + (k === 1 ? 1 : 0);\r\n if (zeroAxisCount === 1 || zeroAxisCount === 3) {\r\n continue;\r\n }\r\n if (scaleBoxes[index]) {\r\n const dragAxis = new Vector3(i - 1, j - 1, k - 1);\r\n dragAxis.multiplyInPlace(this._axisFactor);\r\n scaleBoxes[index].setEnabled(dragAxis.lengthSquared() > Epsilon);\r\n }\r\n index++;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets the axis factor\r\n * @returns the Vector3 factor value\r\n */\r\n public get axisFactor(): Vector3 {\r\n return this._axisFactor;\r\n }\r\n\r\n /**\r\n * Sets scale drag speed value\r\n * @param value the new speed value\r\n */\r\n public set scaleDragSpeed(value: number) {\r\n this._scaleDragSpeed = value;\r\n }\r\n\r\n /**\r\n * Gets scale drag speed\r\n * @returns the scale speed number\r\n */\r\n public get scaleDragSpeed(): number {\r\n return this._scaleDragSpeed;\r\n }\r\n\r\n /**\r\n * Mesh used as a pivot to rotate the attached node\r\n */\r\n private _anchorMesh: AbstractMesh;\r\n\r\n private _existingMeshScale = new Vector3();\r\n\r\n // Dragging\r\n private _dragMesh: Nullable<Mesh> = null;\r\n private _pointerDragBehavior = new PointerDragBehavior();\r\n\r\n private _coloredMaterial: StandardMaterial;\r\n private _hoverColoredMaterial: StandardMaterial;\r\n\r\n /**\r\n * Sets the color of the bounding box gizmo\r\n * @param color the color to set\r\n */\r\n public setColor(color: Color3) {\r\n this._coloredMaterial.emissiveColor = color;\r\n this._hoverColoredMaterial.emissiveColor = color.clone().add(new Color3(0.3, 0.3, 0.3));\r\n this._lineBoundingBox.getChildren().forEach((l) => {\r\n if ((l as LinesMesh).color) {\r\n (l as LinesMesh).color = color;\r\n }\r\n });\r\n }\r\n /**\r\n * Creates an BoundingBoxGizmo\r\n * @param color The color of the gizmo\r\n * @param gizmoLayer The utility layer the gizmo will be added to\r\n */\r\n constructor(color: Color3 = Color3.Gray(), gizmoLayer: UtilityLayerRenderer = UtilityLayerRenderer.DefaultKeepDepthUtilityLayer) {\r\n super(gizmoLayer);\r\n\r\n // Do not update the gizmo's scale so it has a fixed size to the object its attached to\r\n this.updateScale = false;\r\n\r\n this._anchorMesh = new AbstractMesh(\"anchor\", gizmoLayer.utilityLayerScene);\r\n // Create Materials\r\n this._coloredMaterial = new StandardMaterial(\"\", gizmoLayer.utilityLayerScene);\r\n this._coloredMaterial.disableLighting = true;\r\n this._hoverColoredMaterial = new StandardMaterial(\"\", gizmoLayer.utilityLayerScene);\r\n this._hoverColoredMaterial.disableLighting = true;\r\n\r\n // Build bounding box out of lines\r\n this._lineBoundingBox = new AbstractMesh(\"\", gizmoLayer.utilityLayerScene);\r\n this._lineBoundingBox.rotationQuaternion = new Quaternion();\r\n const lines = [];\r\n lines.push(CreateLines(\"lines\", { points: [new Vector3(0, 0, 0), new Vector3(this._boundingDimensions.x, 0, 0)] }, gizmoLayer.utilityLayerScene));\r\n lines.push(CreateLines(\"lines\", { points: [new Vector3(0, 0, 0), new Vector3(0, this._boundingDimensions.y, 0)] }, gizmoLayer.utilityLayerScene));\r\n lines.push(CreateLines(\"lines\", { points: [new Vector3(0, 0, 0), new Vector3(0, 0, this._boundingDimensions.z)] }, gizmoLayer.utilityLayerScene));\r\n lines.push(\r\n CreateLines(\r\n \"lines\",\r\n { points: [new Vector3(this._boundingDimensions.x, 0, 0), new Vector3(this._boundingDimensions.x, this._boundingDimensions.y, 0)] },\r\n gizmoLayer.utilityLayerScene\r\n )\r\n );\r\n lines.push(\r\n CreateLines(\r\n \"lines\",\r\n { points: [new Vector3(this._boundingDimensions.x, 0, 0), new Vector3(this._boundingDimensions.x, 0, this._boundingDimensions.z)] },\r\n gizmoLayer.utilityLayerScene\r\n )\r\n );\r\n lines.push(\r\n CreateLines(\r\n \"lines\",\r\n { points: [new Vector3(0, this._boundingDimensions.y, 0), new Vector3(this._boundingDimensions.x, this._boundingDimensions.y, 0)] },\r\n gizmoLayer.utilityLayerScene\r\n )\r\n );\r\n lines.push(\r\n CreateLines(\r\n \"lines\",\r\n { points: [new Vector3(0, this._boundingDimensions.y, 0), new Vector3(0, this._boundingDimensions.y, this._boundingDimensions.z)] },\r\n gizmoLayer.utilityLayerScene\r\n )\r\n );\r\n lines.push(\r\n CreateLines(\r\n \"lines\",\r\n { points: [new Vector3(0, 0, this._boundingDimensions.z), new Vector3(this._boundingDimensions.x, 0, this._boundingDimensions.z)] },\r\n gizmoLayer.utilityLayerScene\r\n )\r\n );\r\n lines.push(\r\n CreateLines(\r\n \"lines\",\r\n { points: [new Vector3(0, 0, this._boundingDimensions.z), new Vector3(0, this._boundingDimensions.y, this._boundingDimensions.z)] },\r\n gizmoLayer.utilityLayerScene\r\n )\r\n );\r\n lines.push(\r\n CreateLines(\r\n \"lines\",\r\n {\r\n points: [\r\n new Vector3(this._boundingDimensions.x, this._boundingDimensions.y, this._boundingDimensions.z),\r\n new Vector3(0, this._boundingDimensions.y, this._boundingDimensions.z),\r\n ],\r\n },\r\n gizmoLayer.utilityLayerScene\r\n )\r\n );\r\n lines.push(\r\n CreateLines(\r\n \"lines\",\r\n {\r\n points: [\r\n new Vector3(this._boundingDimensions.x, this._boundingDimensions.y, this._boundingDimensions.z),\r\n new Vector3(this._boundingDimensions.x, 0, this._boundingDimensions.z),\r\n ],\r\n },\r\n gizmoLayer.utilityLayerScene\r\n )\r\n );\r\n lines.push(\r\n CreateLines(\r\n \"lines\",\r\n {\r\n points: [\r\n new Vector3(this._boundingDimensions.x, this._boundingDimensions.y, this._boundingDimensions.z),\r\n new Vector3(this._boundingDimensions.x, this._boundingDimensions.y, 0),\r\n ],\r\n },\r\n gizmoLayer.utilityLayerScene\r\n )\r\n );\r\n lines.forEach((l) => {\r\n l.color = color;\r\n l.position.addInPlace(new Vector3(-this._boundingDimensions.x / 2, -this._boundingDimensions.y / 2, -this._boundingDimensions.z / 2));\r\n l.isPickable = false;\r\n this._lineBoundingBox.addChild(l);\r\n });\r\n this._rootMesh.addChild(this._lineBoundingBox);\r\n\r\n this.setColor(color);\r\n\r\n // Create rotation spheres\r\n this._rotateSpheresParent = new AbstractMesh(\"\", gizmoLayer.utilityLayerScene);\r\n this._rotateSpheresParent.rotationQuaternion = new Quaternion();\r\n for (let i = 0; i < 12; i++) {\r\n const sphere = CreateSphere(\"\", { diameter: 1 }, gizmoLayer.utilityLayerScene);\r\n sphere.rotationQuaternion = new Quaternion();\r\n sphere.material = this._coloredMaterial;\r\n sphere.isNearGrabbable = true;\r\n\r\n // Drag behavior\r\n const _dragBehavior = new PointerDragBehavior({});\r\n _dragBehavior.moveAttached = false;\r\n _dragBehavior.updateDragPlane = false;\r\n sphere.addBehavior(_dragBehavior);\r\n const startingTurnDirection = new Vector3(1, 0, 0);\r\n let totalTurnAmountOfDrag = 0;\r\n _dragBehavior.onDragStartObservable.add(() => {\r\n startingTurnDirection.copyFrom(sphere.forward);\r\n totalTurnAmountOfDrag = 0;\r\n });\r\n _dragBehavior.onDragObservable.add((event) => {\r\n this.onRotationSphereDragObservable.notifyObservers({});\r\n if (this.attachedMesh) {\r\n const originalParent = this.attachedMesh.parent;\r\n if (originalParent && (originalParent as Mesh).scaling && (originalParent as Mesh).scaling.isNonUniformWithinEpsilon(0.001)) {\r\n Logger.Warn(\"BoundingBoxGizmo controls are not supported on child meshes with non-uniform parent scaling\");\r\n return;\r\n }\r\n PivotTools._RemoveAndStorePivotPoint(this.attachedMesh);\r\n\r\n const worldDragDirection = startingTurnDirection;\r\n\r\n // Project the world right on to the drag plane\r\n const toSub = event.dragPlaneNormal.scale(Vector3.Dot(event.dragPlaneNormal, worldDragDirection));\r\n const dragAxis = worldDragDirection.subtract(toSub).normalizeToNew();\r\n\r\n // project drag delta on to the resulting drag axis and rotate based on that\r\n let projectDist = Vector3.Dot(dragAxis, event.delta) < 0 ? Math.abs(event.delta.length()) : -Math.abs(event.delta.length());\r\n\r\n // Make rotation relative to size of mesh.\r\n projectDist = (projectDist / this._boundingDimensions.length()) * this._anchorMesh.scaling.length();\r\n\r\n // Rotate based on axis\r\n if (!this.attachedMesh.rotationQuaternion) {\r\n this.attachedMesh.rotationQuaternion = Quaternion.RotationYawPitchRoll(\r\n this.attachedMesh.rotation.y,\r\n this.attachedMesh.rotation.x,\r\n this.attachedMesh.rotation.z\r\n );\r\n }\r\n if (!this._anchorMesh.rotationQuaternion) {\r\n this._anchorMesh.rotationQuaternion = Quaternion.RotationYawPitchRoll(\r\n this._anchorMesh.rotation.y,\r\n this._anchorMesh.rotation.x,\r\n this._anchorMesh.rotation.z\r\n );\r\n }\r\n\r\n // Do not allow the object to turn more than a full circle\r\n totalTurnAmountOfDrag += projectDist;\r\n if (Math.abs(totalTurnAmountOfDrag) <= 2 * Math.PI) {\r\n if (i >= 8) {\r\n Quaternion.RotationYawPitchRollToRef(0, 0, projectDist, this._tmpQuaternion);\r\n } else if (i >= 4) {\r\n Quaternion.RotationYawPitchRollToRef(projectDist, 0, 0, this._tmpQuaternion);\r\n } else {\r\n Quaternion.RotationYawPitchRollToRef(0, projectDist, 0, this._tmpQuaternion);\r\n }\r\n\r\n // Rotate around center of bounding box\r\n this._anchorMesh.addChild(this.attachedMesh);\r\n this._anchorMesh.rotationQuaternion!.multiplyToRef(this._tmpQuaternion, this._anchorMesh.rotationQuaternion!);\r\n this._anchorMesh.removeChild(this.attachedMesh);\r\n this.attachedMesh.setParent(originalParent);\r\n }\r\n this.updateBoundingBox();\r\n\r\n PivotTools._RestorePivotPoint(this.attachedMesh);\r\n }\r\n this._updateDummy();\r\n });\r\n\r\n // Selection/deselection\r\n _dragBehavior.onDragStartObservable.add(() => {\r\n this.onDragStartObservable.notifyObservers({});\r\n this._selectNode(sphere);\r\n });\r\n _dragBehavior.onDragEndObservable.add(() => {\r\n this.onRotationSphereDragEndObservable.notifyObservers({});\r\n this._selectNode(null);\r\n this._updateDummy();\r\n });\r\n\r\n this._rotateSpheresParent.addChild(sphere);\r\n }\r\n this._rootMesh.addChild(this._rotateSpheresParent);\r\n\r\n // Create scale cubes\r\n this._scaleBoxesParent = new AbstractMesh(\"\", gizmoLayer.utilityLayerScene);\r\n this._scaleBoxesParent.rotationQuaternion = new Quaternion();\r\n for (let i = 0; i < 3; i++) {\r\n for (let j = 0; j < 3; j++) {\r\n for (let k = 0; k < 3; k++) {\r\n // create box for relevant axis\r\n const zeroAxisCount = (i === 1 ? 1 : 0) + (j === 1 ? 1 : 0) + (k === 1 ? 1 : 0);\r\n if (zeroAxisCount === 1 || zeroAxisCount === 3) {\r\n continue;\r\n }\r\n\r\n const box = CreateBox(\"\", { size: 1 }, gizmoLayer.utilityLayerScene);\r\n box.material = this._coloredMaterial;\r\n box.metadata = zeroAxisCount === 2; // None homogenous scale handle\r\n box.isNearGrabbable = true;\r\n\r\n // Dragging logic\r\n const dragAxis = new Vector3(i - 1, j - 1, k - 1).normalize();\r\n const _dragBehavior = new PointerDragBehavior({ dragAxis: dragAxis });\r\n _dragBehavior.updateDragPlane = false;\r\n _dragBehavior.moveAttached = false;\r\n box.addBehavior(_dragBehavior);\r\n _dragBehavior.onDragObservable.add((event) => {\r\n this.onScaleBoxDragObservable.notifyObservers({});\r\n if (this.attachedMesh) {\r\n const originalParent = this.attachedMesh.parent;\r\n if (originalParent && (originalParent as Mesh).scaling && (originalParent as Mesh).scaling.isNonUniformWithinEpsilon(0.001)) {\r\n Logger.Warn(\"BoundingBoxGizmo controls are not supported on child meshes with non-uniform parent scaling\");\r\n return;\r\n }\r\n PivotTools._RemoveAndStorePivotPoint(this.attachedMesh);\r\n const relativeDragDistance = (event.dragDistance / this._boundingDimensions.length()) * this._anchorMesh.scaling.length();\r\n const deltaScale = new Vector3(relativeDragDistance, relativeDragDistance, relativeDragDistance);\r\n if (zeroAxisCount === 2) {\r\n // scale on 1 axis when using the anchor box in the face middle\r\n deltaScale.x *= Math.abs(dragAxis.x);\r\n deltaScale.y *= Math.abs(dragAxis.y);\r\n deltaScale.z *= Math.abs(dragAxis.z);\r\n }\r\n deltaScale.scaleInPlace(this._scaleDragSpeed);\r\n deltaScale.multiplyInPlace(this._axisFactor);\r\n this.updateBoundingBox();\r\n if (this.scalePivot) {\r\n this.attachedMesh.getWorldMatrix().getRotationMatrixToRef(this._tmpRotationMatrix);\r\n // Move anchor to desired pivot point (Bottom left corner + dimension/2)\r\n this._boundingDimensions.scaleToRef(0.5, this._tmpVector);\r\n Vector3.TransformCoordinatesToRef(this._tmpVector, this._tmpRotationMatrix, this._tmpVector);\r\n this._anchorMesh.position.subtractInPlace(this._tmpVector);\r\n this._boundingDimensions.multiplyToRef(this.scalePivot, this._tmpVector);\r\n Vector3.TransformCoordinatesToRef(this._tmpVector, this._tmpRotationMatrix, this._tmpVector);\r\n this._anchorMesh.position.addInPlace(this._tmpVector);\r\n } else {\r\n // Scale from the position of the opposite corner\r\n box.absolutePosition.subtractToRef(this._anchorMesh.position, this._tmpVector);\r\n this._anchorMesh.position.subtractInPlace(this._tmpVector);\r\n }\r\n\r\n this._anchorMesh.addChild(this.attachedMesh);\r\n this._anchorMesh.scaling.addInPlace(deltaScale);\r\n if (this._anchorMesh.scaling.x < 0 || this._anchorMesh.scaling.y < 0 || this._anchorMesh.scaling.z < 0) {\r\n this._anchorMesh.scaling.subtractInPlace(deltaScale);\r\n }\r\n this._anchorMesh.removeChild(this.attachedMesh);\r\n this.attachedMesh.setParent(originalParent);\r\n PivotTools._RestorePivotPoint(this.attachedMesh);\r\n }\r\n this._updateDummy();\r\n });\r\n\r\n // Selection/deselection\r\n _dragBehavior.onDragStartObservable.add(() => {\r\n this.onDragStartObservable.notifyObservers({});\r\n this._selectNode(box);\r\n });\r\n _dragBehavior.onDragEndObservable.add(() => {\r\n this.onScaleBoxDragEndObservable.notifyObservers({});\r\n this._selectNode(null);\r\n this._updateDummy();\r\n });\r\n\r\n this._scaleBoxesParent.addChild(box);\r\n }\r\n }\r\n }\r\n this._rootMesh.addChild(this._scaleBoxesParent);\r\n\r\n // Hover color change\r\n const pointerIds = new Array<AbstractMesh>();\r\n this._pointerObserver = gizmoLayer.utilityLayerScene.onPointerObservable.add((pointerInfo) => {\r\n if (!pointerIds[(<IPointerEvent>pointerInfo.event).pointerId]) {\r\n this._rotateSpheresParent\r\n .getChildMeshes()\r\n .concat(this._scaleBoxesParent.getChildMeshes())\r\n .forEach((mesh) => {\r\n if (pointerInfo.pickInfo && pointerInfo.pickInfo.pickedMesh == mesh) {\r\n pointerIds[(<IPointerEvent>pointerInfo.event).pointerId] = mesh;\r\n mesh.material = this._hoverColoredMaterial;\r\n }\r\n });\r\n } else {\r\n if (pointerInfo.pickInfo && pointerInfo.pickInfo.pickedMesh != pointerIds[(<IPointerEvent>pointerInfo.event).pointerId]) {\r\n pointerIds[(<IPointerEvent>pointerInfo.event).pointerId].material = this._coloredMaterial;\r\n delete pointerIds[(<IPointerEvent>pointerInfo.event).pointerId];\r\n }\r\n }\r\n });\r\n\r\n // Update bounding box positions\r\n this._renderObserver = this.gizmoLayer.originalScene.onBeforeRenderObservable.add(() => {\r\n // Only update the bounding box if scaling has changed\r\n if (this.attachedMesh && !this._existingMeshScale.equals(this.attachedMesh.scaling)) {\r\n this.updateBoundingBox();\r\n } else if (this.fixedDragMeshScreenSize || this.fixedDragMeshBoundsSize) {\r\n this._updateRotationSpheres();\r\n this._updateScaleBoxes();\r\n }\r\n\r\n // If drag mesh is enabled and dragging, update the attached mesh pose to match the drag mesh\r\n if (this._dragMesh && this.attachedMesh && this._pointerDragBehavior.dragging) {\r\n this._lineBoundingBox.position.rotateByQuaternionToRef(this._rootMesh.rotationQuaternion!, this._tmpVector);\r\n this.attachedMesh.setAbsolutePosition(this._dragMesh.position.add(this._tmpVector.scale(-1)));\r\n }\r\n });\r\n this.updateBoundingBox();\r\n }\r\n\r\n protected _attachedNodeChanged(value: Nullable<AbstractMesh>) {\r\n if (value) {\r\n // Reset anchor mesh to match attached mesh's scale\r\n // This is needed to avoid invalid box/sphere position on first drag\r\n this._anchorMesh.scaling.setAll(1);\r\n PivotTools._RemoveAndStorePivotPoint(value);\r\n const originalParent = value.parent;\r\n this._anchorMesh.addChild(value);\r\n this._anchorMesh.removeChild(value);\r\n value.setParent(originalParent);\r\n PivotTools._RestorePivotPoint(value);\r\n this.updateBoundingBox();\r\n value.getChildMeshes(false).forEach((m) => {\r\n m.markAsDirty(\"scaling\");\r\n });\r\n\r\n this.gizmoLayer.utilityLayerScene.onAfterRenderObservable.addOnce(() => {\r\n this._updateDummy();\r\n });\r\n }\r\n }\r\n\r\n private _selectNode(selectedMesh: Nullable<Mesh>) {\r\n this._rotateSpheresParent\r\n .getChildMeshes()\r\n .concat(this._scaleBoxesParent.getChildMeshes())\r\n .forEach((m) => {\r\n m.isVisible = !selectedMesh || m == selectedMesh;\r\n });\r\n }\r\n\r\n /**\r\n * Updates the bounding box information for the Gizmo\r\n */\r\n public updateBoundingBox() {\r\n if (this.attachedMesh) {\r\n PivotTools._RemoveAndStorePivotPoint(this.attachedMesh);\r\n\r\n // Store original parent\r\n const originalParent = this.attachedMesh.parent;\r\n this.attachedMesh.setParent(null);\r\n\r\n this._update();\r\n\r\n // Rotate based on axis\r\n if (!this.attachedMesh.rotationQuaternion) {\r\n this.attachedMesh.rotationQuaternion = Quaternion.RotationYawPitchRoll(this.attachedMesh.rotation.y, this.attachedMesh.rotation.x, this.attachedMesh.rotation.z);\r\n }\r\n if (!this._anchorMesh.rotationQuaternion) {\r\n this._anchorMesh.rotationQuaternion = Quaternion.RotationYawPitchRoll(this._anchorMesh.rotation.y, this._anchorMesh.rotation.x, this._anchorMesh.rotation.z);\r\n }\r\n this._anchorMesh.rotationQuaternion.copyFrom(this.attachedMesh.rotationQuaternion);\r\n\r\n // Store original position and reset mesh to origin before computing the bounding box\r\n this._tmpQuaternion.copyFrom(this.attachedMesh.rotationQuaternion);\r\n this._tmpVector.copyFrom(this.attachedMesh.position);\r\n this.attachedMesh.rotationQuaternion.set(0, 0, 0, 1);\r\n this.attachedMesh.position.set(0, 0, 0);\r\n\r\n // Update bounding dimensions/positions\r\n const boundingMinMax = this.attachedMesh.getHierarchyBoundingVectors(!this.ignoreChildren, this.includeChildPredicate);\r\n boundingMinMax.max.subtractToRef(boundingMinMax.min, this._boundingDimensions);\r\n\r\n // Update gizmo to match bounding box scaling and rotation\r\n // The position set here is the offset from the origin for the boundingbox when the attached mesh is at the origin\r\n // The position of the gizmo is then set to the attachedMesh in gizmo._update\r\n this._lineBoundingBox.scaling.copyFrom(this._boundingDimensions);\r\n this._lineBoundingBox.position.set(\r\n (boundingMinMax.max.x + boundingMinMax.min.x) / 2,\r\n (boundingMinMax.max.y + boundingMinMax.min.y) / 2,\r\n (boundingMinMax.max.z + boundingMinMax.min.z) / 2\r\n );\r\n this._rotateSpheresParent.position.copyFrom(this._lineBoundingBox.position);\r\n this._scaleBoxesParent.position.copyFrom(this._lineBoundingBox.position);\r\n this._lineBoundingBox.computeWorldMatrix();\r\n this._anchorMesh.position.copyFrom(this._lineBoundingBox.absolutePosition);\r\n\r\n // Restore position/rotation values\r\n this.attachedMesh.rotationQuaternion.copyFrom(this._tmpQuaternion);\r\n this.attachedMesh.position.copyFrom(this._tmpVector);\r\n\r\n // Restore original parent\r\n this.attachedMesh.setParent(originalParent);\r\n }\r\n\r\n this._updateRotationSpheres();\r\n this._updateScaleBoxes();\r\n\r\n if (this.attachedMesh) {\r\n this._existingMeshScale.copyFrom(this.attachedMesh.scaling);\r\n PivotTools._RestorePivotPoint(this.attachedMesh);\r\n }\r\n }\r\n\r\n private _updateRotationSpheres() {\r\n const rotateSpheres = this._rotateSpheresParent.getChildMeshes();\r\n for (let i = 0; i < 3; i++) {\r\n for (let j = 0; j < 2; j++) {\r\n for (let k = 0; k < 2; k++) {\r\n const index = i * 4 + j * 2 + k;\r\n if (i == 0) {\r\n rotateSpheres[index].position.set(this._boundingDimensions.x / 2, this._boundingDimensions.y * j, this._boundingDimensions.z * k);\r\n rotateSpheres[index].position.addInPlace(new Vector3(-this._boundingDimensions.x / 2, -this._boundingDimensions.y / 2, -this._boundingDimensions.z / 2));\r\n rotateSpheres[index].lookAt(\r\n Vector3.Cross(rotateSpheres[index].position.normalizeToNew(), Vector3.Right()).normalizeToNew().add(rotateSpheres[index].position)\r\n );\r\n }\r\n if (i == 1) {\r\n rotateSpheres[index].position.set(this._boundingDimensions.x * j, this._boundingDimensions.y / 2, this._boundingDimensions.z * k);\r\n rotateSpheres[index].position.addInPlace(new Vector3(-this._boundingDimensions.x / 2, -this._boundingDimensions.y / 2, -this._boundingDimensions.z / 2));\r\n rotateSpheres[index].lookAt(\r\n Vector3.Cross(rotateSpheres[index].position.normalizeToNew(), Vector3.Up()).normalizeToNew().add(rotateSpheres[index].position)\r\n );\r\n }\r\n if (i == 2) {\r\n rotateSpheres[index].position.set(this._boundingDimensions.x * j, this._boundingDimensions.y * k, this._boundingDimensions.z / 2);\r\n rotateSpheres[index].position.addInPlace(new Vector3(-this._boundingDimensions.x / 2, -this._boundingDimensions.y / 2, -this._boundingDimensions.z / 2));\r\n rotateSpheres[index].lookAt(\r\n Vector3.Cross(rotateSpheres[index].position.normalizeToNew(), Vector3.Forward()).normalizeToNew().add(rotateSpheres[index].position)\r\n );\r\n }\r\n if (this.fixedDragMeshScreenSize && this.gizmoLayer.utilityLayerScene.activeCamera) {\r\n rotateSpheres[index].absolutePosition.subtractToRef(this.gizmoLayer.utilityLayerScene.activeCamera.position, this._tmpVector);\r\n const distanceFromCamera = (this.rotationSphereSize * this._tmpVector.length()) / this.fixedDragMeshScreenSizeDistanceFactor;\r\n rotateSpheres[index].scaling.set(distanceFromCamera, distanceFromCamera, distanceFromCamera);\r\n } else if (this.fixedDragMeshBoundsSize) {\r\n rotateSpheres[index].scaling.set(\r\n this.rotationSphereSize * this._boundingDimensions.x,\r\n this.rotationSphereSize * this._boundingDimensions.y,\r\n this.rotationSphereSize * this._boundingDimensions.z\r\n );\r\n } else {\r\n rotateSpheres[index].scaling.set(this.rotationSphereSize, this.rotationSphereSize, this.rotationSphereSize);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _updateScaleBoxes() {\r\n const scaleBoxes = this._scaleBoxesParent.getChildMeshes();\r\n let index = 0;\r\n for (let i = 0; i < 3; i++) {\r\n for (let j = 0; j < 3; j++) {\r\n for (let k = 0; k < 3; k++) {\r\n const zeroAxisCount = (i === 1 ? 1 : 0) + (j === 1 ? 1 : 0) + (k === 1 ? 1 : 0);\r\n if (zeroAxisCount === 1 || zeroAxisCount === 3) {\r\n continue;\r\n }\r\n if (scaleBoxes[index]) {\r\n scaleBoxes[index].position.set(this._boundingDimensions.x * (i / 2), this._boundingDimensions.y * (j / 2), this._boundingDimensions.z * (k / 2));\r\n scaleBoxes[index].position.addInPlace(new Vector3(-this._boundingDimensions.x / 2, -this._boundingDimensions.y / 2, -this._boundingDimensions.z / 2));\r\n if (this.fixedDragMeshScreenSize && this.gizmoLayer.utilityLayerScene.activeCamera) {\r\n scaleBoxes[index].absolutePosition.subtractToRef(this.gizmoLayer.utilityLayerScene.activeCamera.position, this._tmpVector);\r\n const distanceFromCamera = (this.scaleBoxSize * this._tmpVector.length()) / this.fixedDragMeshScreenSizeDistanceFactor;\r\n scaleBoxes[index].scaling.set(distanceFromCamera, distanceFromCamera, distanceFromCamera);\r\n } else if (this.fixedDragMeshBoundsSize) {\r\n scaleBoxes[index].scaling.set(\r\n this.scaleBoxSize * this._boundingDimensions.x,\r\n this.scaleBoxSize * this._boundingDimensions.y,\r\n this.scaleBoxSize * this._boundingDimensions.z\r\n );\r\n } else {\r\n scaleBoxes[index].scaling.set(this.scaleBoxSize, this.scaleBoxSize, this.scaleBoxSize);\r\n }\r\n }\r\n index++;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Enables rotation on the specified axis and disables rotation on the others\r\n * @param axis The list of axis that should be enabled (eg. \"xy\" or \"xyz\")\r\n */\r\n public setEnabledRotationAxis(axis: string) {\r\n this._rotateSpheresParent.getChildMeshes().forEach((m, i) => {\r\n if (i < 4) {\r\n m.setEnabled(axis.indexOf(\"x\") != -1);\r\n } else if (i < 8) {\r\n m.setEnabled(axis.indexOf(\"y\") != -1);\r\n } else {\r\n m.setEnabled(axis.indexOf(\"z\") != -1);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Enables/disables scaling\r\n * @param enable if scaling should be enabled\r\n * @param homogeneousScaling defines if scaling should only be homogeneous\r\n */\r\n public setEnabledScaling(enable: boolean, homogeneousScaling = false) {\r\n this._scaleBoxesParent.getChildMeshes().forEach((m) => {\r\n let enableMesh = enable;\r\n // Disable heterogeneous scale handles if requested.\r\n if (homogeneousScaling && m.metadata === true) {\r\n enableMesh = false;\r\n }\r\n m.setEnabled(enableMesh);\r\n });\r\n }\r\n\r\n private _updateDummy() {\r\n if (this._dragMesh) {\r\n this._dragMesh.position.copyFrom(this._lineBoundingBox.getAbsolutePosition());\r\n this._dragMesh.scaling.copyFrom(this._lineBoundingBox.scaling);\r\n this._dragMesh.rotationQuaternion!.copyFrom(this._rootMesh.rotationQuaternion!);\r\n }\r\n }\r\n\r\n /**\r\n * Enables a pointer drag behavior on the bounding box of the gizmo\r\n */\r\n public enableDragBehavior() {\r\n this._dragMesh = CreateBox(\"dummy\", { size: 1 }, this.gizmoLayer.utilityLayerScene);\r\n this._dragMesh.visibility = 0;\r\n this._dragMesh.rotationQuaternion = new Quaternion();\r\n this._pointerDragBehavior.useObjectOrientationForDragging = false;\r\n this._dragMesh.addBehavior(this._pointerDragBehavior);\r\n }\r\n\r\n /**\r\n * Disposes of the gizmo\r\n */\r\n public dispose() {\r\n this.gizmoLayer.utilityLayerScene.onPointerObservable.remove(this._pointerObserver);\r\n this.gizmoLayer.originalScene.onBeforeRenderObservable.remove(this._renderObserver);\r\n this._lineBoundingBox.dispose();\r\n this._rotateSpheresParent.dispose();\r\n this._scaleBoxesParent.dispose();\r\n if (this._dragMesh) {\r\n this._dragMesh.dispose();\r\n }\r\n super.dispose();\r\n }\r\n\r\n /**\r\n * Makes a mesh not pickable and wraps the mesh inside of a bounding box mesh that is pickable. (This is useful to avoid picking within complex geometry)\r\n * @param mesh the mesh to wrap in the bounding box mesh and make not pickable\r\n * @returns the bounding box mesh with the passed in mesh as a child\r\n */\r\n public static MakeNotPickableAndWrapInBoundingBox(mesh: Mesh): Mesh {\r\n const makeNotPickable = (root: AbstractMesh) => {\r\n root.isPickable = false;\r\n root.getChildMeshes().forEach((c) => {\r\n makeNotPickable(c);\r\n });\r\n };\r\n makeNotPickable(mesh);\r\n\r\n // Reset position to get bounding box from origin with no rotation\r\n if (!mesh.rotationQuaternion) {\r\n mesh.rotationQuaternion = Quaternion.RotationYawPitchRoll(mesh.rotation.y, mesh.rotation.x, mesh.rotation.z);\r\n }\r\n const oldPos = mesh.position.clone();\r\n const oldRot = mesh.rotationQuaternion.clone();\r\n mesh.rotationQuaternion.set(0, 0, 0, 1);\r\n mesh.position.set(0, 0, 0);\r\n\r\n // Update bounding dimensions/positions\r\n const box = CreateBox(\"box\", { size: 1 }, mesh.getScene());\r\n const boundingMinMax = mesh.getHierarchyBoundingVectors();\r\n boundingMinMax.max.subtractToRef(boundingMinMax.min, box.scaling);\r\n\r\n // Adjust scale to avoid undefined behavior when adding child\r\n if (box.scaling.y === 0) {\r\n box.scaling.y = Epsilon;\r\n }\r\n if (box.scaling.x === 0) {\r\n box.scaling.x = Epsilon;\r\n }\r\n if (box.scaling.z === 0) {\r\n box.scaling.z = Epsilon;\r\n }\r\n\r\n box.position.set((boundingMinMax.max.x + boundingMinMax.min.x) / 2, (boundingMinMax.max.y + boundingMinMax.min.y) / 2, (boundingMinMax.max.z + boundingMinMax.min.z) / 2);\r\n\r\n // Restore original positions\r\n mesh.addChild(box);\r\n mesh.rotationQuaternion.copyFrom(oldRot);\r\n mesh.position.copyFrom(oldPos);\r\n\r\n // Reverse parenting\r\n mesh.removeChild(box);\r\n\r\n box.addChild(mesh);\r\n box.visibility = 0;\r\n return box;\r\n }\r\n /**\r\n * CustomMeshes are not supported by this gizmo\r\n */\r\n public setCustomMesh() {\r\n Logger.Error(\"Custom meshes are not supported on this gizmo\");\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"boundingBoxGizmo.js","sourceRoot":"","sources":["../../../../../lts/core/generated/Gizmos/boundingBoxGizmo.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Observer } from \"../Misc/observable\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport { Logger } from \"../Misc/logger\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { PointerInfo } from \"../Events/pointerEvents\";\r\nimport type { Scene } from \"../scene\";\r\nimport { Quaternion, Matrix, Vector3 } from \"../Maths/math.vector\";\r\nimport { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { Mesh } from \"../Meshes/mesh\";\r\nimport { CreateSphere } from \"../Meshes/Builders/sphereBuilder\";\r\nimport { CreateBox } from \"../Meshes/Builders/boxBuilder\";\r\nimport { CreateLines } from \"../Meshes/Builders/linesBuilder\";\r\nimport { PointerDragBehavior } from \"../Behaviors/Meshes/pointerDragBehavior\";\r\nimport { Gizmo } from \"./gizmo\";\r\nimport { UtilityLayerRenderer } from \"../Rendering/utilityLayerRenderer\";\r\nimport { StandardMaterial } from \"../Materials/standardMaterial\";\r\nimport { PivotTools } from \"../Misc/pivotTools\";\r\nimport { Color3 } from \"../Maths/math.color\";\r\n\r\nimport type { LinesMesh } from \"../Meshes/linesMesh\";\r\nimport { Epsilon } from \"../Maths/math.constants\";\r\nimport type { IPointerEvent } from \"../Events/deviceInputEvents\";\r\n\r\n/**\r\n * Bounding box gizmo\r\n */\r\nexport class BoundingBoxGizmo extends Gizmo {\r\n private _lineBoundingBox: AbstractMesh;\r\n private _rotateSpheresParent: AbstractMesh;\r\n private _scaleBoxesParent: AbstractMesh;\r\n private _boundingDimensions = new Vector3(1, 1, 1);\r\n private _renderObserver: Nullable<Observer<Scene>> = null;\r\n private _pointerObserver: Nullable<Observer<PointerInfo>> = null;\r\n private _scaleDragSpeed = 0.2;\r\n\r\n private _tmpQuaternion = new Quaternion();\r\n private _tmpVector = new Vector3(0, 0, 0);\r\n private _tmpRotationMatrix = new Matrix();\r\n /**\r\n * If child meshes should be ignored when calculating the bounding box. This should be set to true to avoid perf hits with heavily nested meshes (Default: false)\r\n */\r\n public ignoreChildren = false;\r\n /**\r\n * Returns true if a descendant should be included when computing the bounding box. When null, all descendants are included. If ignoreChildren is set this will be ignored. (Default: null)\r\n */\r\n public includeChildPredicate: Nullable<(abstractMesh: AbstractMesh) => boolean> = null;\r\n\r\n /**\r\n * The size of the rotation spheres attached to the bounding box (Default: 0.1)\r\n */\r\n public rotationSphereSize = 0.1;\r\n /**\r\n * The size of the scale boxes attached to the bounding box (Default: 0.1)\r\n */\r\n public scaleBoxSize = 0.1;\r\n /**\r\n * If set, the rotation spheres and scale boxes will increase in size based on the distance away from the camera to have a consistent screen size (Default: false)\r\n * Note : fixedDragMeshScreenSize takes precedence over fixedDragMeshBoundsSize if both are true\r\n */\r\n public fixedDragMeshScreenSize = false;\r\n /**\r\n * If set, the rotation spheres and scale boxes will increase in size based on the size of the bounding box\r\n * Note : fixedDragMeshScreenSize takes precedence over fixedDragMeshBoundsSize if both are true\r\n */\r\n public fixedDragMeshBoundsSize = false;\r\n /**\r\n * The distance away from the object which the draggable meshes should appear world sized when fixedDragMeshScreenSize is set to true (default: 10)\r\n */\r\n public fixedDragMeshScreenSizeDistanceFactor = 10;\r\n /**\r\n * Fired when a rotation sphere or scale box is dragged\r\n */\r\n public onDragStartObservable = new Observable<{}>();\r\n /**\r\n * Fired when a scale box is dragged\r\n */\r\n public onScaleBoxDragObservable = new Observable<{}>();\r\n /**\r\n * Fired when a scale box drag is ended\r\n */\r\n public onScaleBoxDragEndObservable = new Observable<{}>();\r\n /**\r\n * Fired when a rotation sphere is dragged\r\n */\r\n public onRotationSphereDragObservable = new Observable<{}>();\r\n /**\r\n * Fired when a rotation sphere drag is ended\r\n */\r\n public onRotationSphereDragEndObservable = new Observable<{}>();\r\n /**\r\n * Relative bounding box pivot used when scaling the attached node. When null object with scale from the opposite corner. 0.5,0.5,0.5 for center and 0.5,0,0.5 for bottom (Default: null)\r\n */\r\n public scalePivot: Nullable<Vector3> = null;\r\n /**\r\n * Scale factor used for masking some axis\r\n */\r\n private _axisFactor = new Vector3(1, 1, 1);\r\n\r\n /**\r\n * Sets the axis factor\r\n * @param factor the Vector3 value\r\n */\r\n public set axisFactor(factor: Vector3) {\r\n this._axisFactor = factor;\r\n // update scale cube visibility\r\n const scaleBoxes = this._scaleBoxesParent.getChildMeshes();\r\n let index = 0;\r\n for (let i = 0; i < 3; i++) {\r\n for (let j = 0; j < 3; j++) {\r\n for (let k = 0; k < 3; k++) {\r\n const zeroAxisCount = (i === 1 ? 1 : 0) + (j === 1 ? 1 : 0) + (k === 1 ? 1 : 0);\r\n if (zeroAxisCount === 1 || zeroAxisCount === 3) {\r\n continue;\r\n }\r\n if (scaleBoxes[index]) {\r\n const dragAxis = new Vector3(i - 1, j - 1, k - 1);\r\n dragAxis.multiplyInPlace(this._axisFactor);\r\n scaleBoxes[index].setEnabled(dragAxis.lengthSquared() > Epsilon);\r\n }\r\n index++;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets the axis factor\r\n * @returns the Vector3 factor value\r\n */\r\n public get axisFactor(): Vector3 {\r\n return this._axisFactor;\r\n }\r\n\r\n /**\r\n * Sets scale drag speed value\r\n * @param value the new speed value\r\n */\r\n public set scaleDragSpeed(value: number) {\r\n this._scaleDragSpeed = value;\r\n }\r\n\r\n /**\r\n * Gets scale drag speed\r\n * @returns the scale speed number\r\n */\r\n public get scaleDragSpeed(): number {\r\n return this._scaleDragSpeed;\r\n }\r\n\r\n /**\r\n * Mesh used as a pivot to rotate the attached node\r\n */\r\n private _anchorMesh: AbstractMesh;\r\n\r\n private _existingMeshScale = new Vector3();\r\n\r\n // Dragging\r\n private _dragMesh: Nullable<Mesh> = null;\r\n private _pointerDragBehavior = new PointerDragBehavior();\r\n\r\n private _coloredMaterial: StandardMaterial;\r\n private _hoverColoredMaterial: StandardMaterial;\r\n\r\n /**\r\n * Sets the color of the bounding box gizmo\r\n * @param color the color to set\r\n */\r\n public setColor(color: Color3) {\r\n this._coloredMaterial.emissiveColor = color;\r\n this._hoverColoredMaterial.emissiveColor = color.clone().add(new Color3(0.3, 0.3, 0.3));\r\n this._lineBoundingBox.getChildren().forEach((l) => {\r\n if ((l as LinesMesh).color) {\r\n (l as LinesMesh).color = color;\r\n }\r\n });\r\n }\r\n /**\r\n * Creates an BoundingBoxGizmo\r\n * @param color The color of the gizmo\r\n * @param gizmoLayer The utility layer the gizmo will be added to\r\n */\r\n constructor(color: Color3 = Color3.Gray(), gizmoLayer: UtilityLayerRenderer = UtilityLayerRenderer.DefaultKeepDepthUtilityLayer) {\r\n super(gizmoLayer);\r\n\r\n // Do not update the gizmo's scale so it has a fixed size to the object its attached to\r\n this.updateScale = false;\r\n\r\n this._anchorMesh = new AbstractMesh(\"anchor\", gizmoLayer.utilityLayerScene);\r\n // Create Materials\r\n this._coloredMaterial = new StandardMaterial(\"\", gizmoLayer.utilityLayerScene);\r\n this._coloredMaterial.disableLighting = true;\r\n this._hoverColoredMaterial = new StandardMaterial(\"\", gizmoLayer.utilityLayerScene);\r\n this._hoverColoredMaterial.disableLighting = true;\r\n\r\n // Build bounding box out of lines\r\n this._lineBoundingBox = new AbstractMesh(\"\", gizmoLayer.utilityLayerScene);\r\n this._lineBoundingBox.rotationQuaternion = new Quaternion();\r\n const lines = [];\r\n lines.push(CreateLines(\"lines\", { points: [new Vector3(0, 0, 0), new Vector3(this._boundingDimensions.x, 0, 0)] }, gizmoLayer.utilityLayerScene));\r\n lines.push(CreateLines(\"lines\", { points: [new Vector3(0, 0, 0), new Vector3(0, this._boundingDimensions.y, 0)] }, gizmoLayer.utilityLayerScene));\r\n lines.push(CreateLines(\"lines\", { points: [new Vector3(0, 0, 0), new Vector3(0, 0, this._boundingDimensions.z)] }, gizmoLayer.utilityLayerScene));\r\n lines.push(\r\n CreateLines(\r\n \"lines\",\r\n { points: [new Vector3(this._boundingDimensions.x, 0, 0), new Vector3(this._boundingDimensions.x, this._boundingDimensions.y, 0)] },\r\n gizmoLayer.utilityLayerScene\r\n )\r\n );\r\n lines.push(\r\n CreateLines(\r\n \"lines\",\r\n { points: [new Vector3(this._boundingDimensions.x, 0, 0), new Vector3(this._boundingDimensions.x, 0, this._boundingDimensions.z)] },\r\n gizmoLayer.utilityLayerScene\r\n )\r\n );\r\n lines.push(\r\n CreateLines(\r\n \"lines\",\r\n { points: [new Vector3(0, this._boundingDimensions.y, 0), new Vector3(this._boundingDimensions.x, this._boundingDimensions.y, 0)] },\r\n gizmoLayer.utilityLayerScene\r\n )\r\n );\r\n lines.push(\r\n CreateLines(\r\n \"lines\",\r\n { points: [new Vector3(0, this._boundingDimensions.y, 0), new Vector3(0, this._boundingDimensions.y, this._boundingDimensions.z)] },\r\n gizmoLayer.utilityLayerScene\r\n )\r\n );\r\n lines.push(\r\n CreateLines(\r\n \"lines\",\r\n { points: [new Vector3(0, 0, this._boundingDimensions.z), new Vector3(this._boundingDimensions.x, 0, this._boundingDimensions.z)] },\r\n gizmoLayer.utilityLayerScene\r\n )\r\n );\r\n lines.push(\r\n CreateLines(\r\n \"lines\",\r\n { points: [new Vector3(0, 0, this._boundingDimensions.z), new Vector3(0, this._boundingDimensions.y, this._boundingDimensions.z)] },\r\n gizmoLayer.utilityLayerScene\r\n )\r\n );\r\n lines.push(\r\n CreateLines(\r\n \"lines\",\r\n {\r\n points: [\r\n new Vector3(this._boundingDimensions.x, this._boundingDimensions.y, this._boundingDimensions.z),\r\n new Vector3(0, this._boundingDimensions.y, this._boundingDimensions.z),\r\n ],\r\n },\r\n gizmoLayer.utilityLayerScene\r\n )\r\n );\r\n lines.push(\r\n CreateLines(\r\n \"lines\",\r\n {\r\n points: [\r\n new Vector3(this._boundingDimensions.x, this._boundingDimensions.y, this._boundingDimensions.z),\r\n new Vector3(this._boundingDimensions.x, 0, this._boundingDimensions.z),\r\n ],\r\n },\r\n gizmoLayer.utilityLayerScene\r\n )\r\n );\r\n lines.push(\r\n CreateLines(\r\n \"lines\",\r\n {\r\n points: [\r\n new Vector3(this._boundingDimensions.x, this._boundingDimensions.y, this._boundingDimensions.z),\r\n new Vector3(this._boundingDimensions.x, this._boundingDimensions.y, 0),\r\n ],\r\n },\r\n gizmoLayer.utilityLayerScene\r\n )\r\n );\r\n lines.forEach((l) => {\r\n l.color = color;\r\n l.position.addInPlace(new Vector3(-this._boundingDimensions.x / 2, -this._boundingDimensions.y / 2, -this._boundingDimensions.z / 2));\r\n l.isPickable = false;\r\n this._lineBoundingBox.addChild(l);\r\n });\r\n this._rootMesh.addChild(this._lineBoundingBox);\r\n\r\n this.setColor(color);\r\n\r\n // Create rotation spheres\r\n this._rotateSpheresParent = new AbstractMesh(\"\", gizmoLayer.utilityLayerScene);\r\n this._rotateSpheresParent.rotationQuaternion = new Quaternion();\r\n for (let i = 0; i < 12; i++) {\r\n const sphere = CreateSphere(\"\", { diameter: 1 }, gizmoLayer.utilityLayerScene);\r\n sphere.rotationQuaternion = new Quaternion();\r\n sphere.material = this._coloredMaterial;\r\n sphere.isNearGrabbable = true;\r\n\r\n // Drag behavior\r\n const _dragBehavior = new PointerDragBehavior({});\r\n _dragBehavior.moveAttached = false;\r\n _dragBehavior.updateDragPlane = false;\r\n sphere.addBehavior(_dragBehavior);\r\n const startingTurnDirection = new Vector3(1, 0, 0);\r\n let totalTurnAmountOfDrag = 0;\r\n _dragBehavior.onDragStartObservable.add(() => {\r\n startingTurnDirection.copyFrom(sphere.forward);\r\n totalTurnAmountOfDrag = 0;\r\n });\r\n _dragBehavior.onDragObservable.add((event) => {\r\n this.onRotationSphereDragObservable.notifyObservers({});\r\n if (this.attachedMesh) {\r\n const originalParent = this.attachedMesh.parent;\r\n if (originalParent && (originalParent as Mesh).scaling && (originalParent as Mesh).scaling.isNonUniformWithinEpsilon(0.001)) {\r\n Logger.Warn(\"BoundingBoxGizmo controls are not supported on child meshes with non-uniform parent scaling\");\r\n return;\r\n }\r\n PivotTools._RemoveAndStorePivotPoint(this.attachedMesh);\r\n\r\n const worldDragDirection = startingTurnDirection;\r\n\r\n // Project the world right on to the drag plane\r\n const toSub = event.dragPlaneNormal.scale(Vector3.Dot(event.dragPlaneNormal, worldDragDirection));\r\n const dragAxis = worldDragDirection.subtract(toSub).normalizeToNew();\r\n\r\n // project drag delta on to the resulting drag axis and rotate based on that\r\n let projectDist = Vector3.Dot(dragAxis, event.delta) < 0 ? Math.abs(event.delta.length()) : -Math.abs(event.delta.length());\r\n\r\n // Make rotation relative to size of mesh.\r\n projectDist = (projectDist / this._boundingDimensions.length()) * this._anchorMesh.scaling.length();\r\n\r\n // Rotate based on axis\r\n if (!this.attachedMesh.rotationQuaternion) {\r\n this.attachedMesh.rotationQuaternion = Quaternion.RotationYawPitchRoll(\r\n this.attachedMesh.rotation.y,\r\n this.attachedMesh.rotation.x,\r\n this.attachedMesh.rotation.z\r\n );\r\n }\r\n if (!this._anchorMesh.rotationQuaternion) {\r\n this._anchorMesh.rotationQuaternion = Quaternion.RotationYawPitchRoll(\r\n this._anchorMesh.rotation.y,\r\n this._anchorMesh.rotation.x,\r\n this._anchorMesh.rotation.z\r\n );\r\n }\r\n\r\n // Do not allow the object to turn more than a full circle\r\n totalTurnAmountOfDrag += projectDist;\r\n if (Math.abs(totalTurnAmountOfDrag) <= 2 * Math.PI) {\r\n if (i >= 8) {\r\n Quaternion.RotationYawPitchRollToRef(0, 0, projectDist, this._tmpQuaternion);\r\n } else if (i >= 4) {\r\n Quaternion.RotationYawPitchRollToRef(projectDist, 0, 0, this._tmpQuaternion);\r\n } else {\r\n Quaternion.RotationYawPitchRollToRef(0, projectDist, 0, this._tmpQuaternion);\r\n }\r\n\r\n // Rotate around center of bounding box\r\n this._anchorMesh.addChild(this.attachedMesh, Gizmo.PreserveScaling);\r\n this._anchorMesh.rotationQuaternion!.multiplyToRef(this._tmpQuaternion, this._anchorMesh.rotationQuaternion!);\r\n this._anchorMesh.removeChild(this.attachedMesh, Gizmo.PreserveScaling);\r\n this.attachedMesh.setParent(originalParent);\r\n }\r\n this.updateBoundingBox();\r\n\r\n PivotTools._RestorePivotPoint(this.attachedMesh);\r\n }\r\n this._updateDummy();\r\n });\r\n\r\n // Selection/deselection\r\n _dragBehavior.onDragStartObservable.add(() => {\r\n this.onDragStartObservable.notifyObservers({});\r\n this._selectNode(sphere);\r\n });\r\n _dragBehavior.onDragEndObservable.add(() => {\r\n this.onRotationSphereDragEndObservable.notifyObservers({});\r\n this._selectNode(null);\r\n this._updateDummy();\r\n });\r\n\r\n this._rotateSpheresParent.addChild(sphere);\r\n }\r\n this._rootMesh.addChild(this._rotateSpheresParent);\r\n\r\n // Create scale cubes\r\n this._scaleBoxesParent = new AbstractMesh(\"\", gizmoLayer.utilityLayerScene);\r\n this._scaleBoxesParent.rotationQuaternion = new Quaternion();\r\n for (let i = 0; i < 3; i++) {\r\n for (let j = 0; j < 3; j++) {\r\n for (let k = 0; k < 3; k++) {\r\n // create box for relevant axis\r\n const zeroAxisCount = (i === 1 ? 1 : 0) + (j === 1 ? 1 : 0) + (k === 1 ? 1 : 0);\r\n if (zeroAxisCount === 1 || zeroAxisCount === 3) {\r\n continue;\r\n }\r\n\r\n const box = CreateBox(\"\", { size: 1 }, gizmoLayer.utilityLayerScene);\r\n box.material = this._coloredMaterial;\r\n box.metadata = zeroAxisCount === 2; // None homogenous scale handle\r\n box.isNearGrabbable = true;\r\n\r\n // Dragging logic\r\n const dragAxis = new Vector3(i - 1, j - 1, k - 1).normalize();\r\n const _dragBehavior = new PointerDragBehavior({ dragAxis: dragAxis });\r\n _dragBehavior.updateDragPlane = false;\r\n _dragBehavior.moveAttached = false;\r\n box.addBehavior(_dragBehavior);\r\n _dragBehavior.onDragObservable.add((event) => {\r\n this.onScaleBoxDragObservable.notifyObservers({});\r\n if (this.attachedMesh) {\r\n const originalParent = this.attachedMesh.parent;\r\n if (originalParent && (originalParent as Mesh).scaling && (originalParent as Mesh).scaling.isNonUniformWithinEpsilon(0.001)) {\r\n Logger.Warn(\"BoundingBoxGizmo controls are not supported on child meshes with non-uniform parent scaling\");\r\n return;\r\n }\r\n PivotTools._RemoveAndStorePivotPoint(this.attachedMesh);\r\n const relativeDragDistance = (event.dragDistance / this._boundingDimensions.length()) * this._anchorMesh.scaling.length();\r\n const deltaScale = new Vector3(relativeDragDistance, relativeDragDistance, relativeDragDistance);\r\n if (zeroAxisCount === 2) {\r\n // scale on 1 axis when using the anchor box in the face middle\r\n deltaScale.x *= Math.abs(dragAxis.x);\r\n deltaScale.y *= Math.abs(dragAxis.y);\r\n deltaScale.z *= Math.abs(dragAxis.z);\r\n }\r\n deltaScale.scaleInPlace(this._scaleDragSpeed);\r\n deltaScale.multiplyInPlace(this._axisFactor);\r\n this.updateBoundingBox();\r\n if (this.scalePivot) {\r\n this.attachedMesh.getWorldMatrix().getRotationMatrixToRef(this._tmpRotationMatrix);\r\n // Move anchor to desired pivot point (Bottom left corner + dimension/2)\r\n this._boundingDimensions.scaleToRef(0.5, this._tmpVector);\r\n Vector3.TransformCoordinatesToRef(this._tmpVector, this._tmpRotationMatrix, this._tmpVector);\r\n this._anchorMesh.position.subtractInPlace(this._tmpVector);\r\n this._boundingDimensions.multiplyToRef(this.scalePivot, this._tmpVector);\r\n Vector3.TransformCoordinatesToRef(this._tmpVector, this._tmpRotationMatrix, this._tmpVector);\r\n this._anchorMesh.position.addInPlace(this._tmpVector);\r\n } else {\r\n // Scale from the position of the opposite corner\r\n box.absolutePosition.subtractToRef(this._anchorMesh.position, this._tmpVector);\r\n this._anchorMesh.position.subtractInPlace(this._tmpVector);\r\n }\r\n\r\n this._anchorMesh.addChild(this.attachedMesh, Gizmo.PreserveScaling);\r\n this._anchorMesh.scaling.addInPlace(deltaScale);\r\n if (this._anchorMesh.scaling.x < 0 || this._anchorMesh.scaling.y < 0 || this._anchorMesh.scaling.z < 0) {\r\n this._anchorMesh.scaling.subtractInPlace(deltaScale);\r\n }\r\n this._anchorMesh.removeChild(this.attachedMesh, Gizmo.PreserveScaling);\r\n this.attachedMesh.setParent(originalParent);\r\n PivotTools._RestorePivotPoint(this.attachedMesh);\r\n }\r\n this._updateDummy();\r\n });\r\n\r\n // Selection/deselection\r\n _dragBehavior.onDragStartObservable.add(() => {\r\n this.onDragStartObservable.notifyObservers({});\r\n this._selectNode(box);\r\n });\r\n _dragBehavior.onDragEndObservable.add(() => {\r\n this.onScaleBoxDragEndObservable.notifyObservers({});\r\n this._selectNode(null);\r\n this._updateDummy();\r\n });\r\n\r\n this._scaleBoxesParent.addChild(box);\r\n }\r\n }\r\n }\r\n this._rootMesh.addChild(this._scaleBoxesParent);\r\n\r\n // Hover color change\r\n const pointerIds = new Array<AbstractMesh>();\r\n this._pointerObserver = gizmoLayer.utilityLayerScene.onPointerObservable.add((pointerInfo) => {\r\n if (!pointerIds[(<IPointerEvent>pointerInfo.event).pointerId]) {\r\n this._rotateSpheresParent\r\n .getChildMeshes()\r\n .concat(this._scaleBoxesParent.getChildMeshes())\r\n .forEach((mesh) => {\r\n if (pointerInfo.pickInfo && pointerInfo.pickInfo.pickedMesh == mesh) {\r\n pointerIds[(<IPointerEvent>pointerInfo.event).pointerId] = mesh;\r\n mesh.material = this._hoverColoredMaterial;\r\n }\r\n });\r\n } else {\r\n if (pointerInfo.pickInfo && pointerInfo.pickInfo.pickedMesh != pointerIds[(<IPointerEvent>pointerInfo.event).pointerId]) {\r\n pointerIds[(<IPointerEvent>pointerInfo.event).pointerId].material = this._coloredMaterial;\r\n delete pointerIds[(<IPointerEvent>pointerInfo.event).pointerId];\r\n }\r\n }\r\n });\r\n\r\n // Update bounding box positions\r\n this._renderObserver = this.gizmoLayer.originalScene.onBeforeRenderObservable.add(() => {\r\n // Only update the bounding box if scaling has changed\r\n if (this.attachedMesh && !this._existingMeshScale.equals(this.attachedMesh.scaling)) {\r\n this.updateBoundingBox();\r\n } else if (this.fixedDragMeshScreenSize || this.fixedDragMeshBoundsSize) {\r\n this._updateRotationSpheres();\r\n this._updateScaleBoxes();\r\n }\r\n\r\n // If drag mesh is enabled and dragging, update the attached mesh pose to match the drag mesh\r\n if (this._dragMesh && this.attachedMesh && this._pointerDragBehavior.dragging) {\r\n this._lineBoundingBox.position.rotateByQuaternionToRef(this._rootMesh.rotationQuaternion!, this._tmpVector);\r\n this.attachedMesh.setAbsolutePosition(this._dragMesh.position.add(this._tmpVector.scale(-1)));\r\n }\r\n });\r\n this.updateBoundingBox();\r\n }\r\n\r\n protected _attachedNodeChanged(value: Nullable<AbstractMesh>) {\r\n if (value) {\r\n // Reset anchor mesh to match attached mesh's scale\r\n // This is needed to avoid invalid box/sphere position on first drag\r\n this._anchorMesh.scaling.setAll(1);\r\n PivotTools._RemoveAndStorePivotPoint(value);\r\n const originalParent = value.parent;\r\n this._anchorMesh.addChild(value, Gizmo.PreserveScaling);\r\n this._anchorMesh.removeChild(value, Gizmo.PreserveScaling);\r\n value.setParent(originalParent);\r\n PivotTools._RestorePivotPoint(value);\r\n this.updateBoundingBox();\r\n value.getChildMeshes(false).forEach((m) => {\r\n m.markAsDirty(\"scaling\");\r\n });\r\n\r\n this.gizmoLayer.utilityLayerScene.onAfterRenderObservable.addOnce(() => {\r\n this._updateDummy();\r\n });\r\n }\r\n }\r\n\r\n private _selectNode(selectedMesh: Nullable<Mesh>) {\r\n this._rotateSpheresParent\r\n .getChildMeshes()\r\n .concat(this._scaleBoxesParent.getChildMeshes())\r\n .forEach((m) => {\r\n m.isVisible = !selectedMesh || m == selectedMesh;\r\n });\r\n }\r\n\r\n /**\r\n * Updates the bounding box information for the Gizmo\r\n */\r\n public updateBoundingBox() {\r\n if (this.attachedMesh) {\r\n PivotTools._RemoveAndStorePivotPoint(this.attachedMesh);\r\n\r\n // Store original parent\r\n const originalParent = this.attachedMesh.parent;\r\n this.attachedMesh.setParent(null);\r\n\r\n this._update();\r\n\r\n // Rotate based on axis\r\n if (!this.attachedMesh.rotationQuaternion) {\r\n this.attachedMesh.rotationQuaternion = Quaternion.RotationYawPitchRoll(this.attachedMesh.rotation.y, this.attachedMesh.rotation.x, this.attachedMesh.rotation.z);\r\n }\r\n if (!this._anchorMesh.rotationQuaternion) {\r\n this._anchorMesh.rotationQuaternion = Quaternion.RotationYawPitchRoll(this._anchorMesh.rotation.y, this._anchorMesh.rotation.x, this._anchorMesh.rotation.z);\r\n }\r\n this._anchorMesh.rotationQuaternion.copyFrom(this.attachedMesh.rotationQuaternion);\r\n\r\n // Store original position and reset mesh to origin before computing the bounding box\r\n this._tmpQuaternion.copyFrom(this.attachedMesh.rotationQuaternion);\r\n this._tmpVector.copyFrom(this.attachedMesh.position);\r\n this.attachedMesh.rotationQuaternion.set(0, 0, 0, 1);\r\n this.attachedMesh.position.set(0, 0, 0);\r\n\r\n // Update bounding dimensions/positions\r\n const boundingMinMax = this.attachedMesh.getHierarchyBoundingVectors(!this.ignoreChildren, this.includeChildPredicate);\r\n boundingMinMax.max.subtractToRef(boundingMinMax.min, this._boundingDimensions);\r\n\r\n // Update gizmo to match bounding box scaling and rotation\r\n // The position set here is the offset from the origin for the boundingbox when the attached mesh is at the origin\r\n // The position of the gizmo is then set to the attachedMesh in gizmo._update\r\n this._lineBoundingBox.scaling.copyFrom(this._boundingDimensions);\r\n this._lineBoundingBox.position.set(\r\n (boundingMinMax.max.x + boundingMinMax.min.x) / 2,\r\n (boundingMinMax.max.y + boundingMinMax.min.y) / 2,\r\n (boundingMinMax.max.z + boundingMinMax.min.z) / 2\r\n );\r\n this._rotateSpheresParent.position.copyFrom(this._lineBoundingBox.position);\r\n this._scaleBoxesParent.position.copyFrom(this._lineBoundingBox.position);\r\n this._lineBoundingBox.computeWorldMatrix();\r\n this._anchorMesh.position.copyFrom(this._lineBoundingBox.absolutePosition);\r\n\r\n // Restore position/rotation values\r\n this.attachedMesh.rotationQuaternion.copyFrom(this._tmpQuaternion);\r\n this.attachedMesh.position.copyFrom(this._tmpVector);\r\n\r\n // Restore original parent\r\n this.attachedMesh.setParent(originalParent);\r\n }\r\n\r\n this._updateRotationSpheres();\r\n this._updateScaleBoxes();\r\n\r\n if (this.attachedMesh) {\r\n this._existingMeshScale.copyFrom(this.attachedMesh.scaling);\r\n PivotTools._RestorePivotPoint(this.attachedMesh);\r\n }\r\n }\r\n\r\n private _updateRotationSpheres() {\r\n const rotateSpheres = this._rotateSpheresParent.getChildMeshes();\r\n for (let i = 0; i < 3; i++) {\r\n for (let j = 0; j < 2; j++) {\r\n for (let k = 0; k < 2; k++) {\r\n const index = i * 4 + j * 2 + k;\r\n if (i == 0) {\r\n rotateSpheres[index].position.set(this._boundingDimensions.x / 2, this._boundingDimensions.y * j, this._boundingDimensions.z * k);\r\n rotateSpheres[index].position.addInPlace(new Vector3(-this._boundingDimensions.x / 2, -this._boundingDimensions.y / 2, -this._boundingDimensions.z / 2));\r\n rotateSpheres[index].lookAt(\r\n Vector3.Cross(rotateSpheres[index].position.normalizeToNew(), Vector3.Right()).normalizeToNew().add(rotateSpheres[index].position)\r\n );\r\n }\r\n if (i == 1) {\r\n rotateSpheres[index].position.set(this._boundingDimensions.x * j, this._boundingDimensions.y / 2, this._boundingDimensions.z * k);\r\n rotateSpheres[index].position.addInPlace(new Vector3(-this._boundingDimensions.x / 2, -this._boundingDimensions.y / 2, -this._boundingDimensions.z / 2));\r\n rotateSpheres[index].lookAt(\r\n Vector3.Cross(rotateSpheres[index].position.normalizeToNew(), Vector3.Up()).normalizeToNew().add(rotateSpheres[index].position)\r\n );\r\n }\r\n if (i == 2) {\r\n rotateSpheres[index].position.set(this._boundingDimensions.x * j, this._boundingDimensions.y * k, this._boundingDimensions.z / 2);\r\n rotateSpheres[index].position.addInPlace(new Vector3(-this._boundingDimensions.x / 2, -this._boundingDimensions.y / 2, -this._boundingDimensions.z / 2));\r\n rotateSpheres[index].lookAt(\r\n Vector3.Cross(rotateSpheres[index].position.normalizeToNew(), Vector3.Forward()).normalizeToNew().add(rotateSpheres[index].position)\r\n );\r\n }\r\n if (this.fixedDragMeshScreenSize && this.gizmoLayer.utilityLayerScene.activeCamera) {\r\n rotateSpheres[index].absolutePosition.subtractToRef(this.gizmoLayer.utilityLayerScene.activeCamera.position, this._tmpVector);\r\n const distanceFromCamera = (this.rotationSphereSize * this._tmpVector.length()) / this.fixedDragMeshScreenSizeDistanceFactor;\r\n rotateSpheres[index].scaling.set(distanceFromCamera, distanceFromCamera, distanceFromCamera);\r\n } else if (this.fixedDragMeshBoundsSize) {\r\n rotateSpheres[index].scaling.set(\r\n this.rotationSphereSize * this._boundingDimensions.x,\r\n this.rotationSphereSize * this._boundingDimensions.y,\r\n this.rotationSphereSize * this._boundingDimensions.z\r\n );\r\n } else {\r\n rotateSpheres[index].scaling.set(this.rotationSphereSize, this.rotationSphereSize, this.rotationSphereSize);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n private _updateScaleBoxes() {\r\n const scaleBoxes = this._scaleBoxesParent.getChildMeshes();\r\n let index = 0;\r\n for (let i = 0; i < 3; i++) {\r\n for (let j = 0; j < 3; j++) {\r\n for (let k = 0; k < 3; k++) {\r\n const zeroAxisCount = (i === 1 ? 1 : 0) + (j === 1 ? 1 : 0) + (k === 1 ? 1 : 0);\r\n if (zeroAxisCount === 1 || zeroAxisCount === 3) {\r\n continue;\r\n }\r\n if (scaleBoxes[index]) {\r\n scaleBoxes[index].position.set(this._boundingDimensions.x * (i / 2), this._boundingDimensions.y * (j / 2), this._boundingDimensions.z * (k / 2));\r\n scaleBoxes[index].position.addInPlace(new Vector3(-this._boundingDimensions.x / 2, -this._boundingDimensions.y / 2, -this._boundingDimensions.z / 2));\r\n if (this.fixedDragMeshScreenSize && this.gizmoLayer.utilityLayerScene.activeCamera) {\r\n scaleBoxes[index].absolutePosition.subtractToRef(this.gizmoLayer.utilityLayerScene.activeCamera.position, this._tmpVector);\r\n const distanceFromCamera = (this.scaleBoxSize * this._tmpVector.length()) / this.fixedDragMeshScreenSizeDistanceFactor;\r\n scaleBoxes[index].scaling.set(distanceFromCamera, distanceFromCamera, distanceFromCamera);\r\n } else if (this.fixedDragMeshBoundsSize) {\r\n scaleBoxes[index].scaling.set(\r\n this.scaleBoxSize * this._boundingDimensions.x,\r\n this.scaleBoxSize * this._boundingDimensions.y,\r\n this.scaleBoxSize * this._boundingDimensions.z\r\n );\r\n } else {\r\n scaleBoxes[index].scaling.set(this.scaleBoxSize, this.scaleBoxSize, this.scaleBoxSize);\r\n }\r\n }\r\n index++;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Enables rotation on the specified axis and disables rotation on the others\r\n * @param axis The list of axis that should be enabled (eg. \"xy\" or \"xyz\")\r\n */\r\n public setEnabledRotationAxis(axis: string) {\r\n this._rotateSpheresParent.getChildMeshes().forEach((m, i) => {\r\n if (i < 4) {\r\n m.setEnabled(axis.indexOf(\"x\") != -1);\r\n } else if (i < 8) {\r\n m.setEnabled(axis.indexOf(\"y\") != -1);\r\n } else {\r\n m.setEnabled(axis.indexOf(\"z\") != -1);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Enables/disables scaling\r\n * @param enable if scaling should be enabled\r\n * @param homogeneousScaling defines if scaling should only be homogeneous\r\n */\r\n public setEnabledScaling(enable: boolean, homogeneousScaling = false) {\r\n this._scaleBoxesParent.getChildMeshes().forEach((m) => {\r\n let enableMesh = enable;\r\n // Disable heterogeneous scale handles if requested.\r\n if (homogeneousScaling && m.metadata === true) {\r\n enableMesh = false;\r\n }\r\n m.setEnabled(enableMesh);\r\n });\r\n }\r\n\r\n private _updateDummy() {\r\n if (this._dragMesh) {\r\n this._dragMesh.position.copyFrom(this._lineBoundingBox.getAbsolutePosition());\r\n this._dragMesh.scaling.copyFrom(this._lineBoundingBox.scaling);\r\n this._dragMesh.rotationQuaternion!.copyFrom(this._rootMesh.rotationQuaternion!);\r\n }\r\n }\r\n\r\n /**\r\n * Enables a pointer drag behavior on the bounding box of the gizmo\r\n */\r\n public enableDragBehavior() {\r\n this._dragMesh = CreateBox(\"dummy\", { size: 1 }, this.gizmoLayer.utilityLayerScene);\r\n this._dragMesh.visibility = 0;\r\n this._dragMesh.rotationQuaternion = new Quaternion();\r\n this._pointerDragBehavior.useObjectOrientationForDragging = false;\r\n this._dragMesh.addBehavior(this._pointerDragBehavior);\r\n }\r\n\r\n /**\r\n * Disposes of the gizmo\r\n */\r\n public dispose() {\r\n this.gizmoLayer.utilityLayerScene.onPointerObservable.remove(this._pointerObserver);\r\n this.gizmoLayer.originalScene.onBeforeRenderObservable.remove(this._renderObserver);\r\n this._lineBoundingBox.dispose();\r\n this._rotateSpheresParent.dispose();\r\n this._scaleBoxesParent.dispose();\r\n if (this._dragMesh) {\r\n this._dragMesh.dispose();\r\n }\r\n super.dispose();\r\n }\r\n\r\n /**\r\n * Makes a mesh not pickable and wraps the mesh inside of a bounding box mesh that is pickable. (This is useful to avoid picking within complex geometry)\r\n * @param mesh the mesh to wrap in the bounding box mesh and make not pickable\r\n * @returns the bounding box mesh with the passed in mesh as a child\r\n */\r\n public static MakeNotPickableAndWrapInBoundingBox(mesh: Mesh): Mesh {\r\n const makeNotPickable = (root: AbstractMesh) => {\r\n root.isPickable = false;\r\n root.getChildMeshes().forEach((c) => {\r\n makeNotPickable(c);\r\n });\r\n };\r\n makeNotPickable(mesh);\r\n\r\n // Reset position to get bounding box from origin with no rotation\r\n if (!mesh.rotationQuaternion) {\r\n mesh.rotationQuaternion = Quaternion.RotationYawPitchRoll(mesh.rotation.y, mesh.rotation.x, mesh.rotation.z);\r\n }\r\n const oldPos = mesh.position.clone();\r\n const oldRot = mesh.rotationQuaternion.clone();\r\n mesh.rotationQuaternion.set(0, 0, 0, 1);\r\n mesh.position.set(0, 0, 0);\r\n\r\n // Update bounding dimensions/positions\r\n const box = CreateBox(\"box\", { size: 1 }, mesh.getScene());\r\n const boundingMinMax = mesh.getHierarchyBoundingVectors();\r\n boundingMinMax.max.subtractToRef(boundingMinMax.min, box.scaling);\r\n\r\n // Adjust scale to avoid undefined behavior when adding child\r\n if (box.scaling.y === 0) {\r\n box.scaling.y = Epsilon;\r\n }\r\n if (box.scaling.x === 0) {\r\n box.scaling.x = Epsilon;\r\n }\r\n if (box.scaling.z === 0) {\r\n box.scaling.z = Epsilon;\r\n }\r\n\r\n box.position.set((boundingMinMax.max.x + boundingMinMax.min.x) / 2, (boundingMinMax.max.y + boundingMinMax.min.y) / 2, (boundingMinMax.max.z + boundingMinMax.min.z) / 2);\r\n\r\n // Restore original positions\r\n mesh.addChild(box);\r\n mesh.rotationQuaternion.copyFrom(oldRot);\r\n mesh.position.copyFrom(oldPos);\r\n\r\n // Reverse parenting\r\n mesh.removeChild(box);\r\n\r\n box.addChild(mesh);\r\n box.visibility = 0;\r\n return box;\r\n }\r\n /**\r\n * CustomMeshes are not supported by this gizmo\r\n */\r\n public setCustomMesh() {\r\n Logger.Error(\"Custom meshes are not supported on this gizmo\");\r\n }\r\n}\r\n"]}
|
package/Gizmos/gizmo.d.ts
CHANGED
|
@@ -49,6 +49,11 @@ export declare class Gizmo implements IDisposable {
|
|
|
49
49
|
* boolean updated by pointermove when a gizmo mesh is hovered
|
|
50
50
|
*/
|
|
51
51
|
protected _isHovered: boolean;
|
|
52
|
+
/**
|
|
53
|
+
* When enabled, any gizmo operation will perserve scaling sign. Default is off.
|
|
54
|
+
* Only valid for TransformNode derived classes (Mesh, AbstractMesh, ...)
|
|
55
|
+
*/
|
|
56
|
+
static PreserveScaling: boolean;
|
|
52
57
|
/**
|
|
53
58
|
* Ratio for the scale of the gizmo (Default: 1)
|
|
54
59
|
*/
|
package/Gizmos/gizmo.js
CHANGED
|
@@ -273,11 +273,12 @@ var Gizmo = /** @class */ (function () {
|
|
|
273
273
|
var localMat = this._tempMatrix2;
|
|
274
274
|
transform.parent.getWorldMatrix().invertToRef(parentInv);
|
|
275
275
|
this._attachedNode.getWorldMatrix().multiplyToRef(parentInv, localMat);
|
|
276
|
-
localMat.decompose(
|
|
276
|
+
localMat.decompose(this._tempVector, this._tempQuaternion, transform.position, Gizmo.PreserveScaling ? transform : undefined);
|
|
277
277
|
}
|
|
278
278
|
else {
|
|
279
|
-
this._attachedNode._worldMatrix.decompose(
|
|
279
|
+
this._attachedNode._worldMatrix.decompose(this._tempVector, this._tempQuaternion, transform.position, Gizmo.PreserveScaling ? transform : undefined);
|
|
280
280
|
}
|
|
281
|
+
transform.scaling.copyFrom(this._tempVector);
|
|
281
282
|
if (!transform.billboardMode) {
|
|
282
283
|
if (transform.rotationQuaternion) {
|
|
283
284
|
transform.rotationQuaternion.copyFrom(this._tempQuaternion);
|
|
@@ -419,6 +420,11 @@ var Gizmo = /** @class */ (function () {
|
|
|
419
420
|
this.gizmoLayer.utilityLayerScene.onBeforeRenderObservable.remove(this._beforeRenderObserver);
|
|
420
421
|
}
|
|
421
422
|
};
|
|
423
|
+
/**
|
|
424
|
+
* When enabled, any gizmo operation will perserve scaling sign. Default is off.
|
|
425
|
+
* Only valid for TransformNode derived classes (Mesh, AbstractMesh, ...)
|
|
426
|
+
*/
|
|
427
|
+
Gizmo.PreserveScaling = false;
|
|
422
428
|
return Gizmo;
|
|
423
429
|
}());
|
|
424
430
|
export { Gizmo };
|
package/Gizmos/gizmo.js.map
CHANGED
|
@@ -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 * 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 effectiveNode.getWorldMatrix().decompose(undefined, this._rootMesh.rotationQuaternion!);\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) {\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(transform.scaling, this._tempQuaternion, transform.position);\r\n } else {\r\n this._attachedNode._worldMatrix.decompose(transform.scaling, this._tempQuaternion, transform.position);\r\n }\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 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 * 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 * 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 effectiveNode.getWorldMatrix().decompose(undefined, this._rootMesh.rotationQuaternion!);\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) {\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 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 * 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"]}
|
|
@@ -633,7 +633,13 @@ var InputManager = /** @class */ (function () {
|
|
|
633
633
|
}
|
|
634
634
|
// Meshes
|
|
635
635
|
_this._pickedDownMesh = null;
|
|
636
|
-
var pickResult
|
|
636
|
+
var pickResult;
|
|
637
|
+
if (scene.skipPointerDownPicking) {
|
|
638
|
+
pickResult = new PickingInfo();
|
|
639
|
+
}
|
|
640
|
+
else {
|
|
641
|
+
pickResult = scene.pick(_this._unTranslatedPointerX, _this._unTranslatedPointerY, scene.pointerDownPredicate, false, scene.cameraToUseForPointers);
|
|
642
|
+
}
|
|
637
643
|
_this._processPointerDown(pickResult, evt);
|
|
638
644
|
};
|
|
639
645
|
this._onPointerUp = function (evt) {
|