@babylonjs/core 8.12.1 → 8.13.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AudioV2/abstractAudio/abstractAudioBus.d.ts +4 -21
- package/AudioV2/abstractAudio/abstractAudioBus.js +2 -34
- package/AudioV2/abstractAudio/abstractAudioBus.js.map +1 -1
- package/AudioV2/abstractAudio/abstractAudioOutNode.d.ts +40 -0
- package/AudioV2/abstractAudio/abstractAudioOutNode.js +56 -0
- package/AudioV2/abstractAudio/abstractAudioOutNode.js.map +1 -0
- package/AudioV2/abstractAudio/abstractSoundSource.d.ts +5 -16
- package/AudioV2/abstractAudio/abstractSoundSource.js +2 -27
- package/AudioV2/abstractAudio/abstractSoundSource.js.map +1 -1
- package/AudioV2/abstractAudio/audioEngineV2.d.ts +13 -0
- package/AudioV2/abstractAudio/audioEngineV2.js +4 -0
- package/AudioV2/abstractAudio/audioEngineV2.js.map +1 -1
- package/AudioV2/abstractAudio/index.d.ts +1 -0
- package/AudioV2/abstractAudio/index.js +1 -0
- package/AudioV2/abstractAudio/index.js.map +1 -1
- package/AudioV2/abstractAudio/subNodes/volumeAudioSubNode.d.ts +3 -0
- package/AudioV2/abstractAudio/subNodes/volumeAudioSubNode.js.map +1 -1
- package/AudioV2/audioParameter.d.ts +31 -0
- package/AudioV2/audioParameter.js +19 -0
- package/AudioV2/audioParameter.js.map +1 -0
- package/AudioV2/audioUtils.d.ts +3 -0
- package/AudioV2/audioUtils.js +61 -0
- package/AudioV2/audioUtils.js.map +1 -1
- package/AudioV2/index.d.ts +1 -0
- package/AudioV2/index.js +1 -0
- package/AudioV2/index.js.map +1 -1
- package/AudioV2/webAudio/components/webAudioParameterComponent.d.ts +37 -0
- package/AudioV2/webAudio/components/webAudioParameterComponent.js +89 -0
- package/AudioV2/webAudio/components/webAudioParameterComponent.js.map +1 -0
- package/AudioV2/webAudio/subNodes/spatialWebAudioSubNode.d.ts +8 -0
- package/AudioV2/webAudio/subNodes/spatialWebAudioSubNode.js +24 -6
- package/AudioV2/webAudio/subNodes/spatialWebAudioSubNode.js.map +1 -1
- package/AudioV2/webAudio/subNodes/stereoWebAudioSubNode.d.ts +2 -0
- package/AudioV2/webAudio/subNodes/stereoWebAudioSubNode.js +9 -4
- package/AudioV2/webAudio/subNodes/stereoWebAudioSubNode.js.map +1 -1
- package/AudioV2/webAudio/subNodes/volumeWebAudioSubNode.d.ts +7 -1
- package/AudioV2/webAudio/subNodes/volumeWebAudioSubNode.js +14 -5
- package/AudioV2/webAudio/subNodes/volumeWebAudioSubNode.js.map +1 -1
- package/AudioV2/webAudio/subProperties/spatialWebAudioListener.js +92 -30
- package/AudioV2/webAudio/subProperties/spatialWebAudioListener.js.map +1 -1
- package/AudioV2/webAudio/webAudioEngine.d.ts +4 -2
- package/AudioV2/webAudio/webAudioEngine.js +9 -4
- package/AudioV2/webAudio/webAudioEngine.js.map +1 -1
- package/AudioV2/webAudio/webAudioMainOut.d.ts +6 -2
- package/AudioV2/webAudio/webAudioMainOut.js +15 -10
- package/AudioV2/webAudio/webAudioMainOut.js.map +1 -1
- package/AudioV2/webAudio/webAudioStaticSound.d.ts +4 -2
- package/AudioV2/webAudio/webAudioStaticSound.js +17 -14
- package/AudioV2/webAudio/webAudioStaticSound.js.map +1 -1
- package/BakedVertexAnimation/vertexAnimationBaker.d.ts +10 -2
- package/BakedVertexAnimation/vertexAnimationBaker.js +48 -2
- package/BakedVertexAnimation/vertexAnimationBaker.js.map +1 -1
- package/Behaviors/Meshes/pointerDragBehavior.d.ts +5 -0
- package/Behaviors/Meshes/pointerDragBehavior.js +7 -1
- package/Behaviors/Meshes/pointerDragBehavior.js.map +1 -1
- package/Cameras/camera.d.ts +6 -0
- package/Cameras/camera.js +8 -0
- package/Cameras/camera.js.map +1 -1
- package/Engines/abstractEngine.js +2 -2
- package/Engines/abstractEngine.js.map +1 -1
- package/FlowGraph/Blocks/Data/Math/flowGraphMathBlocks.d.ts +1 -1
- package/FlowGraph/Blocks/Data/Math/flowGraphMathBlocks.js +27 -18
- package/FlowGraph/Blocks/Data/Math/flowGraphMathBlocks.js.map +1 -1
- package/FlowGraph/Blocks/Data/Math/flowGraphVectorMathBlocks.d.ts +55 -3
- package/FlowGraph/Blocks/Data/Math/flowGraphVectorMathBlocks.js +83 -2
- package/FlowGraph/Blocks/Data/Math/flowGraphVectorMathBlocks.js.map +1 -1
- package/FlowGraph/Blocks/Event/flowGraphMeshPickEventBlock.js.map +1 -1
- package/FlowGraph/Blocks/Event/flowGraphReceiveCustomEventBlock.js.map +1 -1
- package/FlowGraph/Blocks/Event/flowGraphSceneTickEventBlock.js.map +1 -1
- package/FlowGraph/Blocks/Execution/Animation/flowGraphPlayAnimationBlock.js.map +1 -1
- package/FlowGraph/Blocks/Execution/ControlFlow/flowGraphSetDelayBlock.js.map +1 -1
- package/FlowGraph/Blocks/Execution/flowGraphSetPropertyBlock.d.ts +1 -0
- package/FlowGraph/Blocks/Execution/flowGraphSetPropertyBlock.js +23 -2
- package/FlowGraph/Blocks/Execution/flowGraphSetPropertyBlock.js.map +1 -1
- package/FlowGraph/Blocks/Execution/flowGraphSetVariableBlock.js +5 -5
- package/FlowGraph/Blocks/Execution/flowGraphSetVariableBlock.js.map +1 -1
- package/FlowGraph/Blocks/flowGraphBlockFactory.js +10 -0
- package/FlowGraph/Blocks/flowGraphBlockFactory.js.map +1 -1
- package/FlowGraph/Blocks/flowGraphBlockNames.d.ts +5 -0
- package/FlowGraph/Blocks/flowGraphBlockNames.js +5 -0
- package/FlowGraph/Blocks/flowGraphBlockNames.js.map +1 -1
- package/FlowGraph/flowGraphRichTypes.js +10 -8
- package/FlowGraph/flowGraphRichTypes.js.map +1 -1
- package/FlowGraph/utils.d.ts +3 -3
- package/FlowGraph/utils.js +5 -4
- package/FlowGraph/utils.js.map +1 -1
- package/Gizmos/boundingBoxGizmo.d.ts +6 -0
- package/Gizmos/boundingBoxGizmo.js +16 -1
- package/Gizmos/boundingBoxGizmo.js.map +1 -1
- package/Instrumentation/engineInstrumentation.d.ts +2 -2
- package/Instrumentation/engineInstrumentation.js +5 -0
- package/Instrumentation/engineInstrumentation.js.map +1 -1
- package/Instrumentation/sceneInstrumentation.d.ts +1 -0
- package/Instrumentation/sceneInstrumentation.js +5 -0
- package/Instrumentation/sceneInstrumentation.js.map +1 -1
- package/Materials/GaussianSplatting/gaussianSplattingMaterial.js +2 -0
- package/Materials/GaussianSplatting/gaussianSplattingMaterial.js.map +1 -1
- package/Materials/Node/Blocks/Dual/smartFilterTextureBlock.d.ts +2 -5
- package/Materials/Node/Blocks/Dual/smartFilterTextureBlock.js +8 -71
- package/Materials/Node/Blocks/Dual/smartFilterTextureBlock.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.d.ts +2 -0
- package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js +7 -8
- package/Materials/Node/Blocks/Fragment/fragmentOutputBlock.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/index.d.ts +1 -0
- package/Materials/Node/Blocks/Fragment/index.js +1 -0
- package/Materials/Node/Blocks/Fragment/index.js.map +1 -1
- package/Materials/Node/Blocks/Fragment/smartFilterFragmentOutputBlock.d.ts +29 -0
- package/Materials/Node/Blocks/Fragment/smartFilterFragmentOutputBlock.js +100 -0
- package/Materials/Node/Blocks/Fragment/smartFilterFragmentOutputBlock.js.map +1 -0
- package/Materials/Node/Blocks/GaussianSplatting/gaussianSplattingBlock.js +3 -1
- package/Materials/Node/Blocks/GaussianSplatting/gaussianSplattingBlock.js.map +1 -1
- package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js +1 -0
- package/Materials/Node/Blocks/PBR/pbrMetallicRoughnessBlock.js.map +1 -1
- package/Materials/Node/Blocks/PBR/subSurfaceBlock.js +5 -5
- package/Materials/Node/Blocks/PBR/subSurfaceBlock.js.map +1 -1
- package/Materials/Node/nodeMaterial.js +1 -1
- package/Materials/Node/nodeMaterial.js.map +1 -1
- package/Materials/Node/nodeMaterialBuildState.d.ts +0 -2
- package/Materials/Node/nodeMaterialBuildState.js +0 -2
- package/Materials/Node/nodeMaterialBuildState.js.map +1 -1
- package/Materials/Node/nodeMaterialDefault.js +2 -1
- package/Materials/Node/nodeMaterialDefault.js.map +1 -1
- package/Materials/PBR/pbrSubSurfaceConfiguration.d.ts +10 -3
- package/Materials/PBR/pbrSubSurfaceConfiguration.js +16 -5
- package/Materials/PBR/pbrSubSurfaceConfiguration.js.map +1 -1
- package/Maths/math.vector.d.ts +14 -0
- package/Maths/math.vector.functions.d.ts +25 -1
- package/Maths/math.vector.functions.js +35 -0
- package/Maths/math.vector.functions.js.map +1 -1
- package/Maths/math.vector.js +28 -0
- package/Maths/math.vector.js.map +1 -1
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.d.ts +6 -0
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.js +11 -4
- package/Meshes/GaussianSplatting/gaussianSplattingMesh.js.map +1 -1
- package/Meshes/csg2.js +1 -1
- package/Meshes/csg2.js.map +1 -1
- package/Meshes/linesMesh.d.ts +4 -12
- package/Meshes/linesMesh.js +15 -24
- package/Meshes/linesMesh.js.map +1 -1
- package/Misc/environmentTextureTools.d.ts +4 -1
- package/Misc/environmentTextureTools.js +9 -2
- package/Misc/environmentTextureTools.js.map +1 -1
- package/Morph/morphTargetManager.d.ts +5 -0
- package/Morph/morphTargetManager.js +8 -0
- package/Morph/morphTargetManager.js.map +1 -1
- package/Particles/Node/Blocks/particleDebugBlock.d.ts +6 -0
- package/Particles/Node/Blocks/particleDebugBlock.js +10 -0
- package/Particles/Node/Blocks/particleDebugBlock.js.map +1 -1
- package/Shaders/ShadersInclude/hdrFilteringFunctions.js +16 -2
- package/Shaders/ShadersInclude/hdrFilteringFunctions.js.map +1 -1
- package/Shaders/gaussianSplatting.vertex.js +2 -3
- package/Shaders/gaussianSplatting.vertex.js.map +1 -1
- package/ShadersWGSL/ShadersInclude/hdrFilteringFunctions.js +17 -2
- package/ShadersWGSL/ShadersInclude/hdrFilteringFunctions.js.map +1 -1
- package/ShadersWGSL/gaussianSplatting.vertex.js +2 -3
- package/ShadersWGSL/gaussianSplatting.vertex.js.map +1 -1
- package/XR/features/WebXRControllerPointerSelection.js +3 -3
- package/XR/features/WebXRControllerPointerSelection.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"boundingBoxGizmo.js","sourceRoot":"","sources":["../../../../dev/core/src/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, TmpVectors } from \"../Maths/math.vector\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\nimport { CreateBox } from \"../Meshes/Builders/boxBuilder\";\r\nimport { CreateLines } from \"../Meshes/Builders/linesBuilder\";\r\nimport { PointerDragBehavior } from \"../Behaviors/Meshes/pointerDragBehavior\";\r\nimport type { IGizmo } from \"./gizmo\";\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\nimport type { LinesMesh } from \"../Meshes/linesMesh\";\r\nimport { Epsilon } from \"../Maths/math.constants\";\r\nimport type { IPointerEvent } from \"../Events/deviceInputEvents\";\r\nimport { TransformNode } from \"../Meshes/transformNode\";\r\n\r\n/**\r\n * Interface for bounding box gizmo\r\n */\r\nexport interface IBoundingBoxGizmo extends IGizmo {\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.\r\n */\r\n ignoreChildren: boolean;\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.\r\n */\r\n includeChildPredicate: Nullable<(abstractMesh: AbstractMesh) => boolean>;\r\n /** The size of the rotation anchors attached to the bounding box */\r\n rotationSphereSize: number;\r\n /** The size of the scale boxes attached to the bounding box */\r\n scaleBoxSize: number;\r\n /**\r\n * If set, the rotation anchors and scale boxes will increase in size based on the distance away from the camera to have a consistent screen size\r\n * Note : fixedDragMeshScreenSize takes precedence over fixedDragMeshBoundsSize if both are true\r\n */\r\n fixedDragMeshScreenSize: boolean;\r\n /**\r\n * If set, the rotation anchors 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 fixedDragMeshBoundsSize: boolean;\r\n /**\r\n * The distance away from the object which the draggable meshes should appear world sized when fixedDragMeshScreenSize is set to true\r\n */\r\n fixedDragMeshScreenSizeDistanceFactor: number;\r\n /** True when a rotation anchor or scale box or a attached mesh is dragged */\r\n readonly isDragging: boolean;\r\n /** Fired when a rotation anchor or scale box is dragged */\r\n onDragStartObservable: Observable<{ dragOperation: DragOperation; dragAxis: Vector3 }>;\r\n /** Fired when the gizmo mesh hovering starts*/\r\n onHoverStartObservable: Observable<void>;\r\n /** Fired when the gizmo mesh hovering ends*/\r\n onHoverEndObservable: Observable<void>;\r\n /** Fired when a scale box is dragged */\r\n onScaleBoxDragObservable: Observable<{ dragOperation: DragOperation; dragAxis: Vector3 }>;\r\n /** Fired when a scale box drag is ended */\r\n onScaleBoxDragEndObservable: Observable<{ dragOperation: DragOperation; dragAxis: Vector3 }>;\r\n /** Fired when a rotation anchor is dragged */\r\n onRotationSphereDragObservable: Observable<{ dragOperation: DragOperation; dragAxis: Vector3 }>;\r\n /** Fired when a rotation anchor drag is ended */\r\n onRotationSphereDragEndObservable: Observable<{ dragOperation: DragOperation; dragAxis: Vector3 }>;\r\n /** Relative bounding box pivot used when scaling the attached node. */\r\n scalePivot: Nullable<Vector3>;\r\n /** Scale factor vector used for masking some axis */\r\n axisFactor: Vector3;\r\n /** Scale factor scalar affecting all axes' drag speed */\r\n scaleDragSpeed: number;\r\n /**\r\n * Sets the color of the bounding box gizmo\r\n * @param color the color to set\r\n */\r\n setColor(color: Color3): void;\r\n /** Returns an array containing all boxes used for scaling (in increasing x, y and z orders) */\r\n getScaleBoxes(): AbstractMesh[];\r\n /** Updates the bounding box information for the Gizmo */\r\n updateBoundingBox(): void;\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 setEnabledRotationAxis(axis: string): void;\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 setEnabledScaling(enable: boolean, homogeneousScaling?: boolean): void;\r\n /** Enables a pointer drag behavior on the bounding box of the gizmo */\r\n enableDragBehavior(): void;\r\n /**\r\n * Force release the drag action by code\r\n */\r\n releaseDrag(): void;\r\n\r\n /** Default material used to render when gizmo is not disabled or hovered */\r\n coloredMaterial: StandardMaterial;\r\n /** Material used to render when gizmo is hovered with mouse*/\r\n hoverMaterial: StandardMaterial;\r\n\r\n /** Drag distance in babylon units that the gizmo will snap scaling to when dragged */\r\n scalingSnapDistance: number;\r\n /** Drag distance in babylon units that the gizmo will snap rotation to when dragged */\r\n rotationSnapDistance: number;\r\n}\r\n\r\n/**\r\n * Dragging operation in observable\r\n */\r\nexport const enum DragOperation {\r\n Rotation,\r\n Scaling,\r\n}\r\n\r\n/**\r\n * Bounding box gizmo\r\n */\r\nexport class BoundingBoxGizmo extends Gizmo implements IBoundingBoxGizmo {\r\n protected _lineBoundingBox: TransformNode;\r\n protected _rotateAnchorsParent: TransformNode;\r\n protected _scaleBoxesParent: TransformNode;\r\n protected _boundingDimensions = new Vector3(1, 1, 1);\r\n protected _renderObserver: Nullable<Observer<Scene>> = null;\r\n protected _pointerObserver: Nullable<Observer<PointerInfo>> = null;\r\n protected _scaleDragSpeed = 0.2;\r\n protected _rotateAnchorsDragBehaviors: Array<PointerDragBehavior> = [];\r\n protected _scaleBoxesDragBehaviors: Array<PointerDragBehavior> = [];\r\n /**\r\n * boolean updated when a rotation anchor or scale box is dragged\r\n */\r\n protected _dragging = false;\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 private _incrementalStartupValue = Vector3.Zero();\r\n private _incrementalAnchorStartupValue = Vector3.Zero();\r\n\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 anchors 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 anchors 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 anchors 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 * Drag distance in babylon units that the gizmo will snap scaling to when dragged\r\n */\r\n public scalingSnapDistance = 0;\r\n /**\r\n * Drag distance in babylon units that the gizmo will snap rotation to when dragged\r\n */\r\n public rotationSnapDistance = 0;\r\n /**\r\n * Fired when a rotation anchor or scale box is dragged\r\n */\r\n public onDragStartObservable = new Observable<{ dragOperation: DragOperation; dragAxis: Vector3 }>();\r\n /**\r\n * Fired when the gizmo mesh hovering starts\r\n */\r\n public onHoverStartObservable = new Observable<void>();\r\n /**\r\n * Fired when the gizmo mesh hovering ends\r\n */\r\n public onHoverEndObservable = new Observable<void>();\r\n /**\r\n * Fired when a scale box is dragged\r\n */\r\n public onScaleBoxDragObservable = new Observable<{ dragOperation: DragOperation; dragAxis: Vector3 }>();\r\n /**\r\n * Fired when a scale box drag is ended\r\n */\r\n public onScaleBoxDragEndObservable = new Observable<{ dragOperation: DragOperation; dragAxis: Vector3 }>();\r\n /**\r\n * Fired when a rotation anchor is dragged\r\n */\r\n public onRotationSphereDragObservable = new Observable<{ dragOperation: DragOperation; dragAxis: Vector3 }>();\r\n /**\r\n * Fired when a rotation anchor drag is ended\r\n */\r\n public onRotationSphereDragEndObservable = new Observable<{ dragOperation: DragOperation; dragAxis: Vector3 }>();\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 protected _axisFactor = new Vector3(1, 1, 1);\r\n\r\n /**\r\n * Incremental snap scaling (default is false). When true, with a snapDistance of 0.1, scaling will be 1.1,1.2,1.3 instead of, when false: 1.1,1.21,1.33,...\r\n */\r\n public incrementalSnap = false;\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 protected _anchorMesh: TransformNode;\r\n\r\n protected _existingMeshScale = new Vector3();\r\n\r\n // Dragging\r\n protected _dragMesh: Nullable<Mesh> = null;\r\n protected _pointerDragBehavior = new PointerDragBehavior();\r\n\r\n protected _coloredMaterial: StandardMaterial;\r\n protected _hoverColoredMaterial: StandardMaterial;\r\n\r\n // HL2 style corner mesh\r\n protected _cornerMesh: Nullable<Mesh> = null;\r\n\r\n /** Default material used to render when gizmo is not disabled or hovered */\r\n public get coloredMaterial() {\r\n return this._coloredMaterial;\r\n }\r\n\r\n /** Material used to render when gizmo is hovered with mouse*/\r\n public get hoverMaterial() {\r\n return this._hoverColoredMaterial;\r\n }\r\n /**\r\n * Get the pointerDragBehavior\r\n */\r\n public get pointerDragBehavior(): PointerDragBehavior {\r\n return this._pointerDragBehavior;\r\n }\r\n\r\n /** True when a rotation anchor or scale box or a attached mesh is dragged */\r\n public get isDragging() {\r\n return this._dragging || this._pointerDragBehavior.dragging;\r\n }\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 const children = this._lineBoundingBox.getChildren();\r\n for (const l of children) {\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 TransformNode(\"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 TransformNode(\"\", 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 for (const l of lines) {\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 anchors\r\n this._rotateAnchorsParent = new TransformNode(\"\", gizmoLayer.utilityLayerScene);\r\n this._rotateAnchorsParent.rotationQuaternion = new Quaternion();\r\n for (let i = 0; i < 12; i++) {\r\n const anchor = CreateBox(\"\", { width: i < 4 || i >= 8 ? 1.6 : 0.4, height: i >= 4 && i < 8 ? 1.6 : 0.4, depth: 0.4 }, gizmoLayer.utilityLayerScene);\r\n anchor.rotation.x = i < 4 || i >= 8 ? Math.PI * 0.25 : 0;\r\n anchor.rotation.y = i >= 4 && i < 8 ? Math.PI * 0.25 : 0;\r\n anchor.bakeTransformIntoVertices(anchor.computeWorldMatrix(true));\r\n anchor.rotationQuaternion = new Quaternion();\r\n anchor.material = this._coloredMaterial;\r\n anchor.isNearGrabbable = true;\r\n\r\n // Drag behavior\r\n const rotateAnchorsDragBehavior = new PointerDragBehavior({});\r\n rotateAnchorsDragBehavior.moveAttached = false;\r\n rotateAnchorsDragBehavior.updateDragPlane = false;\r\n anchor.addBehavior(rotateAnchorsDragBehavior);\r\n const startingTurnDirection = new Vector3(1, 0, 0);\r\n let totalTurnAmountOfDrag = 0;\r\n let previousProjectDist = 0;\r\n rotateAnchorsDragBehavior.onDragStartObservable.add(() => {\r\n startingTurnDirection.copyFrom(anchor.forward);\r\n totalTurnAmountOfDrag = 0;\r\n previousProjectDist = 0;\r\n });\r\n const computeAxis = function () {\r\n const dragAxisIndex = Math.floor(i / 4);\r\n TmpVectors.Vector3[0].set(dragAxisIndex == 0 ? 1 : 0, dragAxisIndex == 1 ? 1 : 0, dragAxisIndex == 2 ? 1 : 0);\r\n return TmpVectors.Vector3[0];\r\n };\r\n rotateAnchorsDragBehavior.onDragObservable.add((event) => {\r\n this.onRotationSphereDragObservable.notifyObservers({ dragOperation: DragOperation.Rotation, dragAxis: computeAxis().clone() });\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 (this.rotationSnapDistance > 0) {\r\n const dragSteps = Math.floor(Math.abs(totalTurnAmountOfDrag) / this.rotationSnapDistance) * (totalTurnAmountOfDrag < 0 ? -1 : 1);\r\n const angle = this.rotationSnapDistance * dragSteps;\r\n projectDist = angle - previousProjectDist;\r\n previousProjectDist = angle;\r\n }\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 // if using pivot, move anchor so mesh will be at relative (0,0,0) when parented\r\n if (this.attachedMesh.isUsingPivotMatrix()) {\r\n this._anchorMesh.position.copyFrom(this.attachedMesh.position);\r\n }\r\n // Rotate around center of bounding box\r\n this._anchorMesh.addChild(this.attachedMesh);\r\n if (this._anchorMesh.getScene().useRightHandedSystem) {\r\n this._tmpQuaternion.conjugateInPlace();\r\n }\r\n this._tmpQuaternion.normalize();\r\n this._anchorMesh.rotationQuaternion.multiplyToRef(this._tmpQuaternion, this._anchorMesh.rotationQuaternion);\r\n this._anchorMesh.rotationQuaternion.normalize();\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 rotateAnchorsDragBehavior.onDragStartObservable.add(() => {\r\n this.onDragStartObservable.notifyObservers({ dragOperation: DragOperation.Rotation, dragAxis: computeAxis().clone() });\r\n this._dragging = true;\r\n this._selectNode(anchor);\r\n });\r\n rotateAnchorsDragBehavior.onDragEndObservable.add((event) => {\r\n this.onRotationSphereDragEndObservable.notifyObservers({ dragOperation: DragOperation.Rotation, dragAxis: computeAxis().clone() });\r\n this._dragging = false;\r\n this._selectNode(null);\r\n this._updateDummy();\r\n this._unhoverMeshOnTouchUp(event.pointerInfo, anchor);\r\n });\r\n\r\n this._rotateAnchorsDragBehaviors.push(rotateAnchorsDragBehavior);\r\n\r\n this._rotateAnchorsParent.addChild(anchor);\r\n }\r\n this._rootMesh.addChild(this._rotateAnchorsParent);\r\n\r\n // Create scale cubes\r\n this._scaleBoxesParent = new TransformNode(\"\", 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 = zeroAxisCount === 2 ? CreateBox(\"\", { size: 1 }, gizmoLayer.utilityLayerScene) : this._getCornerMesh(gizmoLayer);\r\n if (zeroAxisCount === 0) {\r\n box.rotationQuaternion = Quaternion.FromEulerAngles(j * 0.25 * Math.PI, (k + 3 * i - i * k) * 0.25 * Math.PI, 0);\r\n }\r\n\r\n box.material = this._coloredMaterial;\r\n box._internalMetadata = zeroAxisCount === 2; // None homogenous scale handle\r\n box.isNearGrabbable = true;\r\n\r\n // box is oriented so, transform world desired axis to local one\r\n TmpVectors.Vector3[0].set(i - 1, j - 1, k - 1);\r\n TmpVectors.Vector3[0].normalize();\r\n box.computeWorldMatrix(true).invertToRef(TmpVectors.Matrix[0]);\r\n const dragAxis = Vector3.TransformCoordinates(TmpVectors.Vector3[0], TmpVectors.Matrix[0]);\r\n dragAxis.normalize();\r\n\r\n // Dragging logic\r\n const scaleBoxesDragBehavior = new PointerDragBehavior({ dragAxis: dragAxis });\r\n scaleBoxesDragBehavior.updateDragPlane = false;\r\n scaleBoxesDragBehavior.moveAttached = false;\r\n let totalRelativeDragDistance = 0;\r\n let previousScale = 0;\r\n box.addBehavior(scaleBoxesDragBehavior);\r\n scaleBoxesDragBehavior.onDragObservable.add((event) => {\r\n this.onScaleBoxDragObservable.notifyObservers({ dragOperation: DragOperation.Scaling, dragAxis: new Vector3(i - 1, j - 1, k - 1) });\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 let relativeDragDistance = (event.dragDistance / this._boundingDimensions.length()) * this._anchorMesh.scaling.length();\r\n totalRelativeDragDistance += relativeDragDistance;\r\n if (this.scalingSnapDistance > 0) {\r\n const dragSteps = Math.floor(Math.abs(totalRelativeDragDistance) / this.scalingSnapDistance) * (totalRelativeDragDistance < 0 ? -1 : 1);\r\n const scale = this.scalingSnapDistance * dragSteps;\r\n relativeDragDistance = scale - previousScale;\r\n previousScale = scale;\r\n }\r\n\r\n const deltaScale = new Vector3(relativeDragDistance, relativeDragDistance, relativeDragDistance);\r\n const fullScale = new Vector3(previousScale, previousScale, previousScale);\r\n\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\r\n deltaScale.scaleInPlace(this._scaleDragSpeed);\r\n deltaScale.multiplyInPlace(this._axisFactor);\r\n\r\n fullScale.scaleInPlace(this._scaleDragSpeed);\r\n fullScale.multiplyInPlace(this._axisFactor);\r\n fullScale.addInPlace(this._incrementalStartupValue);\r\n\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 if (this.attachedMesh.isUsingPivotMatrix()) {\r\n this._anchorMesh.position.subtractInPlace(this.attachedMesh.getPivotPoint());\r\n }\r\n }\r\n\r\n this._anchorMesh.addChild(this.attachedMesh);\r\n if (this.incrementalSnap) {\r\n fullScale.x /= Math.abs(this._incrementalStartupValue.x) < Epsilon ? 1 : this._incrementalStartupValue.x;\r\n fullScale.y /= Math.abs(this._incrementalStartupValue.y) < Epsilon ? 1 : this._incrementalStartupValue.y;\r\n fullScale.z /= Math.abs(this._incrementalStartupValue.z) < Epsilon ? 1 : this._incrementalStartupValue.z;\r\n\r\n fullScale.x = Math.max(this._incrementalAnchorStartupValue.x * fullScale.x, this.scalingSnapDistance);\r\n fullScale.y = Math.max(this._incrementalAnchorStartupValue.y * fullScale.y, this.scalingSnapDistance);\r\n fullScale.z = Math.max(this._incrementalAnchorStartupValue.z * fullScale.z, this.scalingSnapDistance);\r\n\r\n this._anchorMesh.scaling.x += (fullScale.x - this._anchorMesh.scaling.x) * Math.abs(dragAxis.x);\r\n this._anchorMesh.scaling.y += (fullScale.y - this._anchorMesh.scaling.y) * Math.abs(dragAxis.y);\r\n this._anchorMesh.scaling.z += (fullScale.z - this._anchorMesh.scaling.z) * Math.abs(dragAxis.z);\r\n } else {\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 }\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 scaleBoxesDragBehavior.onDragStartObservable.add(() => {\r\n this.onDragStartObservable.notifyObservers({ dragOperation: DragOperation.Scaling, dragAxis: new Vector3(i - 1, j - 1, k - 1) });\r\n this._dragging = true;\r\n this._selectNode(box);\r\n totalRelativeDragDistance = 0;\r\n previousScale = 0;\r\n this._incrementalStartupValue.copyFrom(this.attachedMesh!.scaling);\r\n this._incrementalAnchorStartupValue.copyFrom(this._anchorMesh.scaling);\r\n });\r\n scaleBoxesDragBehavior.onDragEndObservable.add((event) => {\r\n this.onScaleBoxDragEndObservable.notifyObservers({ dragOperation: DragOperation.Scaling, dragAxis: new Vector3(i - 1, j - 1, k - 1) });\r\n this._dragging = false;\r\n this._selectNode(null);\r\n this._updateDummy();\r\n this._unhoverMeshOnTouchUp(event.pointerInfo, box);\r\n });\r\n\r\n this._scaleBoxesParent.addChild(box);\r\n this._scaleBoxesDragBehaviors.push(scaleBoxesDragBehavior);\r\n }\r\n }\r\n }\r\n this._rootMesh.addChild(this._scaleBoxesParent);\r\n\r\n // Hover color change\r\n const pointerIds: AbstractMesh[] = [];\r\n this._pointerObserver = gizmoLayer.utilityLayerScene.onPointerObservable.add((pointerInfo) => {\r\n if (!pointerIds[(<IPointerEvent>pointerInfo.event).pointerId]) {\r\n const meshes = this._rotateAnchorsParent.getChildMeshes().concat(this._scaleBoxesParent.getChildMeshes());\r\n\r\n for (const mesh of meshes) {\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 this.onHoverStartObservable.notifyObservers();\r\n this._isHovered = true;\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 pointerIds.splice((<IPointerEvent>pointerInfo.event).pointerId, 1);\r\n this.onHoverEndObservable.notifyObservers();\r\n this._isHovered = false;\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._updateRotationAnchors();\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 _getCornerMesh(gizmoLayer: UtilityLayerRenderer): Mesh {\r\n if (!this._cornerMesh) {\r\n const boxZ = CreateBox(\"\", { width: 0.4, height: 0.4, depth: 1.6 }, gizmoLayer.utilityLayerScene);\r\n boxZ.position.z = 0.6;\r\n const boxY = CreateBox(\"\", { width: 0.4, height: 1.6, depth: 0.4 }, gizmoLayer.utilityLayerScene);\r\n boxY.position.y = 0.6;\r\n const boxX = CreateBox(\"\", { width: 1.6, height: 0.4, depth: 0.4 }, gizmoLayer.utilityLayerScene);\r\n boxX.position.x = 0.6;\r\n this._cornerMesh = Mesh.MergeMeshes([boxX, boxY, boxZ], true);\r\n return this._cornerMesh!;\r\n }\r\n\r\n return this._cornerMesh.clone();\r\n }\r\n protected override _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/anchor 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 const children = value.getChildMeshes(false);\r\n for (const m of children) {\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 protected _selectNode(selectedMesh: Nullable<Mesh>) {\r\n const meshes = this._rotateAnchorsParent.getChildMeshes().concat(this._scaleBoxesParent.getChildMeshes());\r\n\r\n for (const m of meshes) {\r\n m.isVisible = !selectedMesh || m == selectedMesh;\r\n }\r\n }\r\n\r\n protected _unhoverMeshOnTouchUp(pointerInfo: Nullable<PointerInfo>, selectedMesh: AbstractMesh) {\r\n // force unhover mesh if not a mouse event\r\n if (pointerInfo?.event instanceof PointerEvent && pointerInfo?.event.pointerType === \"touch\") {\r\n selectedMesh.material = this._coloredMaterial;\r\n }\r\n }\r\n\r\n /**\r\n * returns an array containing all boxes used for scaling (in increasing x, y and z orders)\r\n * @returns array of scaling boxes\r\n */\r\n public getScaleBoxes() {\r\n return this._scaleBoxesParent.getChildMeshes();\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._rotateAnchorsParent.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._updateRotationAnchors();\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 protected _updateRotationAnchors() {\r\n const rotateAnchors = this._rotateAnchorsParent.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 rotateAnchors[index].position.normalizeToRef(TmpVectors.Vector3[0]);\r\n if (i == 0) {\r\n rotateAnchors[index].position.set(0, this._boundingDimensions.y * (j - 0.5), this._boundingDimensions.z * (k - 0.5));\r\n TmpVectors.Vector3[1].set(1, 0, 0);\r\n }\r\n if (i == 1) {\r\n rotateAnchors[index].position.set(this._boundingDimensions.x * (j - 0.5), 0, this._boundingDimensions.z * (k - 0.5));\r\n TmpVectors.Vector3[1].set(0, 1, 0);\r\n }\r\n if (i == 2) {\r\n rotateAnchors[index].position.set(this._boundingDimensions.x * (j - 0.5), this._boundingDimensions.y * (k - 0.5), 0);\r\n TmpVectors.Vector3[1].set(0, 0, 1);\r\n }\r\n const target = TmpVectors.Vector3[2];\r\n Vector3.CrossToRef(TmpVectors.Vector3[0], TmpVectors.Vector3[1], target);\r\n target.normalize();\r\n target.addInPlace(rotateAnchors[index].position);\r\n rotateAnchors[index].lookAt(target);\r\n\r\n if (this.fixedDragMeshScreenSize && this.gizmoLayer.utilityLayerScene.activeCamera) {\r\n rotateAnchors[index].absolutePosition.subtractToRef(this.gizmoLayer.utilityLayerScene.activeCamera.position, this._tmpVector);\r\n const distanceFromCamera = (this.rotationSphereSize * this._tmpVector.length()) / this.fixedDragMeshScreenSizeDistanceFactor;\r\n rotateAnchors[index].scaling.set(distanceFromCamera, distanceFromCamera, distanceFromCamera);\r\n } else if (this.fixedDragMeshBoundsSize) {\r\n rotateAnchors[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 rotateAnchors[index].scaling.set(this.rotationSphereSize, this.rotationSphereSize, this.rotationSphereSize);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n protected _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.globalPosition, 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 const meshes = this._rotateAnchorsParent.getChildMeshes();\r\n for (let i = 0; i < meshes.length; i++) {\r\n const m = meshes[i] as Mesh;\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 const meshes = this._scaleBoxesParent.getChildMeshes();\r\n for (const m of meshes) {\r\n let enableMesh = enable;\r\n // Disable heterogeneous scale handles if requested.\r\n if (homogeneousScaling && m._internalMetadata === true) {\r\n enableMesh = false;\r\n }\r\n m.setEnabled(enableMesh);\r\n }\r\n }\r\n\r\n protected _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 * Force release the drag action by code\r\n */\r\n public releaseDrag() {\r\n for (const dragBehavior of this._scaleBoxesDragBehaviors) {\r\n dragBehavior.releaseDrag();\r\n }\r\n for (const dragBehavior of this._rotateAnchorsDragBehaviors) {\r\n dragBehavior.releaseDrag();\r\n }\r\n this._pointerDragBehavior.releaseDrag();\r\n }\r\n\r\n /**\r\n * Disposes of the gizmo\r\n */\r\n public override 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._rotateAnchorsParent.dispose();\r\n this._scaleBoxesParent.dispose();\r\n if (this._dragMesh) {\r\n this._dragMesh.dispose();\r\n }\r\n this._scaleBoxesDragBehaviors.length = 0;\r\n this._rotateAnchorsDragBehaviors.length = 0;\r\n this.onDragStartObservable.clear();\r\n this.onHoverStartObservable.clear();\r\n this.onHoverEndObservable.clear();\r\n this.onScaleBoxDragObservable.clear();\r\n this.onScaleBoxDragEndObservable.clear();\r\n this.onRotationSphereDragObservable.clear();\r\n this.onRotationSphereDragEndObservable.clear();\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 const children = root.getChildMeshes();\r\n for (const c of children) {\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 override 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":["../../../../dev/core/src/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, TmpVectors } from \"../Maths/math.vector\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport { Mesh } from \"../Meshes/mesh\";\r\nimport { CreateBox } from \"../Meshes/Builders/boxBuilder\";\r\nimport { CreateLines } from \"../Meshes/Builders/linesBuilder\";\r\nimport { PointerDragBehavior } from \"../Behaviors/Meshes/pointerDragBehavior\";\r\nimport type { IGizmo } from \"./gizmo\";\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\nimport type { LinesMesh } from \"../Meshes/linesMesh\";\r\nimport { Epsilon } from \"../Maths/math.constants\";\r\nimport type { IPointerEvent } from \"../Events/deviceInputEvents\";\r\nimport { TransformNode } from \"../Meshes/transformNode\";\r\n\r\n/**\r\n * Interface for bounding box gizmo\r\n */\r\nexport interface IBoundingBoxGizmo extends IGizmo {\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.\r\n */\r\n ignoreChildren: boolean;\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.\r\n */\r\n includeChildPredicate: Nullable<(abstractMesh: AbstractMesh) => boolean>;\r\n /** The size of the rotation anchors attached to the bounding box */\r\n rotationSphereSize: number;\r\n /** The size of the scale boxes attached to the bounding box */\r\n scaleBoxSize: number;\r\n /**\r\n * If set, the rotation anchors and scale boxes will increase in size based on the distance away from the camera to have a consistent screen size\r\n * Note : fixedDragMeshScreenSize takes precedence over fixedDragMeshBoundsSize if both are true\r\n */\r\n fixedDragMeshScreenSize: boolean;\r\n /**\r\n * If set, the rotation anchors 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 fixedDragMeshBoundsSize: boolean;\r\n /**\r\n * The distance away from the object which the draggable meshes should appear world sized when fixedDragMeshScreenSize is set to true\r\n */\r\n fixedDragMeshScreenSizeDistanceFactor: number;\r\n /** True when a rotation anchor or scale box or a attached mesh is dragged */\r\n readonly isDragging: boolean;\r\n /** Fired when a rotation anchor or scale box is dragged */\r\n onDragStartObservable: Observable<{ dragOperation: DragOperation; dragAxis: Vector3 }>;\r\n /** Fired when the gizmo mesh hovering starts*/\r\n onHoverStartObservable: Observable<void>;\r\n /** Fired when the gizmo mesh hovering ends*/\r\n onHoverEndObservable: Observable<void>;\r\n /** Fired when a scale box is dragged */\r\n onScaleBoxDragObservable: Observable<{ dragOperation: DragOperation; dragAxis: Vector3 }>;\r\n /** Fired when a scale box drag is ended */\r\n onScaleBoxDragEndObservable: Observable<{ dragOperation: DragOperation; dragAxis: Vector3 }>;\r\n /** Fired when a rotation anchor is dragged */\r\n onRotationSphereDragObservable: Observable<{ dragOperation: DragOperation; dragAxis: Vector3 }>;\r\n /** Fired when a rotation anchor drag is ended */\r\n onRotationSphereDragEndObservable: Observable<{ dragOperation: DragOperation; dragAxis: Vector3 }>;\r\n /** Relative bounding box pivot used when scaling the attached node. */\r\n scalePivot: Nullable<Vector3>;\r\n /** Scale factor vector used for masking some axis */\r\n axisFactor: Vector3;\r\n /** Scale factor scalar affecting all axes' drag speed */\r\n scaleDragSpeed: number;\r\n /**\r\n * Sets the color of the bounding box gizmo\r\n * @param color the color to set\r\n */\r\n setColor(color: Color3): void;\r\n /** Returns an array containing all boxes used for scaling (in increasing x, y and z orders) */\r\n getScaleBoxes(): AbstractMesh[];\r\n /** Updates the bounding box information for the Gizmo */\r\n updateBoundingBox(): void;\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 setEnabledRotationAxis(axis: string): void;\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 setEnabledScaling(enable: boolean, homogeneousScaling?: boolean): void;\r\n /** Enables a pointer drag behavior on the bounding box of the gizmo */\r\n enableDragBehavior(): void;\r\n /**\r\n * Force release the drag action by code\r\n */\r\n releaseDrag(): void;\r\n\r\n /** Default material used to render when gizmo is not disabled or hovered */\r\n coloredMaterial: StandardMaterial;\r\n /** Material used to render when gizmo is hovered with mouse*/\r\n hoverMaterial: StandardMaterial;\r\n\r\n /** Drag distance in babylon units that the gizmo will snap scaling to when dragged */\r\n scalingSnapDistance: number;\r\n /** Drag distance in babylon units that the gizmo will snap rotation to when dragged */\r\n rotationSnapDistance: number;\r\n}\r\n\r\n/**\r\n * Dragging operation in observable\r\n */\r\nexport const enum DragOperation {\r\n Rotation,\r\n Scaling,\r\n}\r\n\r\n/**\r\n * Bounding box gizmo\r\n */\r\nexport class BoundingBoxGizmo extends Gizmo implements IBoundingBoxGizmo {\r\n protected _lineBoundingBox: TransformNode;\r\n protected _rotateAnchorsParent: TransformNode;\r\n protected _scaleBoxesParent: TransformNode;\r\n protected _boundingDimensions = new Vector3(1, 1, 1);\r\n protected _renderObserver: Nullable<Observer<Scene>> = null;\r\n protected _pointerObserver: Nullable<Observer<PointerInfo>> = null;\r\n protected _scaleDragSpeed = 0.2;\r\n protected _rotateAnchorsDragBehaviors: Array<PointerDragBehavior> = [];\r\n protected _scaleBoxesDragBehaviors: Array<PointerDragBehavior> = [];\r\n /**\r\n * boolean updated when a rotation anchor or scale box is dragged\r\n */\r\n protected _dragging = false;\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 private _incrementalStartupValue = Vector3.Zero();\r\n private _incrementalAnchorStartupValue = Vector3.Zero();\r\n\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 anchors 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 anchors 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 anchors 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 * Drag distance in babylon units that the gizmo will snap scaling to when dragged\r\n */\r\n public scalingSnapDistance = 0;\r\n /**\r\n * Drag distance in babylon units that the gizmo will snap rotation to when dragged\r\n */\r\n public rotationSnapDistance = 0;\r\n /**\r\n * Fired when a rotation anchor or scale box is dragged\r\n */\r\n public onDragStartObservable = new Observable<{ dragOperation: DragOperation; dragAxis: Vector3 }>();\r\n /**\r\n * Fired when the gizmo mesh hovering starts\r\n */\r\n public onHoverStartObservable = new Observable<void>();\r\n /**\r\n * Fired when the gizmo mesh hovering ends\r\n */\r\n public onHoverEndObservable = new Observable<void>();\r\n /**\r\n * Fired when a scale box is dragged\r\n */\r\n public onScaleBoxDragObservable = new Observable<{ dragOperation: DragOperation; dragAxis: Vector3 }>();\r\n /**\r\n * Fired when a scale box drag is ended\r\n */\r\n public onScaleBoxDragEndObservable = new Observable<{ dragOperation: DragOperation; dragAxis: Vector3 }>();\r\n /**\r\n * Fired when a rotation anchor is dragged\r\n */\r\n public onRotationSphereDragObservable = new Observable<{ dragOperation: DragOperation; dragAxis: Vector3 }>();\r\n /**\r\n * Fired when a rotation anchor drag is ended\r\n */\r\n public onRotationSphereDragEndObservable = new Observable<{ dragOperation: DragOperation; dragAxis: Vector3 }>();\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 protected _axisFactor = new Vector3(1, 1, 1);\r\n\r\n /**\r\n * Incremental snap scaling (default is false). When true, with a snapDistance of 0.1, scaling will be 1.1,1.2,1.3 instead of, when false: 1.1,1.21,1.33,...\r\n */\r\n public incrementalSnap = false;\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 protected _anchorMesh: TransformNode;\r\n\r\n protected _existingMeshScale = new Vector3();\r\n\r\n // Dragging\r\n protected _dragMesh: Nullable<Mesh> = null;\r\n protected _pointerDragBehavior = new PointerDragBehavior();\r\n\r\n protected _coloredMaterial: StandardMaterial;\r\n protected _hoverColoredMaterial: StandardMaterial;\r\n\r\n // HL2 style corner mesh\r\n protected _cornerMesh: Nullable<Mesh> = null;\r\n\r\n /** Default material used to render when gizmo is not disabled or hovered */\r\n public get coloredMaterial() {\r\n return this._coloredMaterial;\r\n }\r\n\r\n /** Material used to render when gizmo is hovered with mouse*/\r\n public get hoverMaterial() {\r\n return this._hoverColoredMaterial;\r\n }\r\n /**\r\n * Get the pointerDragBehavior\r\n */\r\n public get pointerDragBehavior(): PointerDragBehavior {\r\n return this._pointerDragBehavior;\r\n }\r\n\r\n /** True when a rotation anchor or scale box or a attached mesh is dragged */\r\n public get isDragging() {\r\n return this._dragging || this._pointerDragBehavior.dragging;\r\n }\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 const children = this._lineBoundingBox.getChildren();\r\n for (const l of children) {\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 TransformNode(\"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 TransformNode(\"\", 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 for (const l of lines) {\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 anchors\r\n this._rotateAnchorsParent = new TransformNode(\"\", gizmoLayer.utilityLayerScene);\r\n this._rotateAnchorsParent.rotationQuaternion = new Quaternion();\r\n for (let i = 0; i < 12; i++) {\r\n const anchor = CreateBox(\"\", { width: i < 4 || i >= 8 ? 1.6 : 0.4, height: i >= 4 && i < 8 ? 1.6 : 0.4, depth: 0.4 }, gizmoLayer.utilityLayerScene);\r\n anchor.rotation.x = i < 4 || i >= 8 ? Math.PI * 0.25 : 0;\r\n anchor.rotation.y = i >= 4 && i < 8 ? Math.PI * 0.25 : 0;\r\n anchor.bakeTransformIntoVertices(anchor.computeWorldMatrix(true));\r\n anchor.rotationQuaternion = new Quaternion();\r\n anchor.material = this._coloredMaterial;\r\n anchor.isNearGrabbable = true;\r\n\r\n // Drag behavior\r\n const rotateAnchorsDragBehavior = new PointerDragBehavior({});\r\n rotateAnchorsDragBehavior.moveAttached = false;\r\n rotateAnchorsDragBehavior.updateDragPlane = false;\r\n anchor.addBehavior(rotateAnchorsDragBehavior);\r\n const startingTurnDirection = new Vector3(1, 0, 0);\r\n let totalTurnAmountOfDrag = 0;\r\n let previousProjectDist = 0;\r\n rotateAnchorsDragBehavior.onDragStartObservable.add(() => {\r\n startingTurnDirection.copyFrom(anchor.forward);\r\n totalTurnAmountOfDrag = 0;\r\n previousProjectDist = 0;\r\n });\r\n const computeAxis = function () {\r\n const dragAxisIndex = Math.floor(i / 4);\r\n TmpVectors.Vector3[0].set(dragAxisIndex == 0 ? 1 : 0, dragAxisIndex == 1 ? 1 : 0, dragAxisIndex == 2 ? 1 : 0);\r\n return TmpVectors.Vector3[0];\r\n };\r\n rotateAnchorsDragBehavior.onDragObservable.add((event) => {\r\n this.onRotationSphereDragObservable.notifyObservers({ dragOperation: DragOperation.Rotation, dragAxis: computeAxis().clone() });\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 (this.rotationSnapDistance > 0) {\r\n const dragSteps = Math.floor(Math.abs(totalTurnAmountOfDrag) / this.rotationSnapDistance) * (totalTurnAmountOfDrag < 0 ? -1 : 1);\r\n const angle = this.rotationSnapDistance * dragSteps;\r\n projectDist = angle - previousProjectDist;\r\n previousProjectDist = angle;\r\n }\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 // if using pivot, move anchor so mesh will be at relative (0,0,0) when parented\r\n if (this.attachedMesh.isUsingPivotMatrix()) {\r\n this._anchorMesh.position.copyFrom(this.attachedMesh.position);\r\n }\r\n // Rotate around center of bounding box\r\n this._anchorMesh.addChild(this.attachedMesh);\r\n if (this._anchorMesh.getScene().useRightHandedSystem) {\r\n this._tmpQuaternion.conjugateInPlace();\r\n }\r\n this._tmpQuaternion.normalize();\r\n this._anchorMesh.rotationQuaternion.multiplyToRef(this._tmpQuaternion, this._anchorMesh.rotationQuaternion);\r\n this._anchorMesh.rotationQuaternion.normalize();\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 rotateAnchorsDragBehavior.onDragStartObservable.add(() => {\r\n this.onDragStartObservable.notifyObservers({ dragOperation: DragOperation.Rotation, dragAxis: computeAxis().clone() });\r\n this._dragging = true;\r\n this._selectNode(anchor);\r\n });\r\n rotateAnchorsDragBehavior.onDragEndObservable.add((event) => {\r\n this.onRotationSphereDragEndObservable.notifyObservers({ dragOperation: DragOperation.Rotation, dragAxis: computeAxis().clone() });\r\n this._dragging = false;\r\n this._selectNode(null);\r\n this._updateDummy();\r\n this._unhoverMeshOnTouchUp(event.pointerInfo, anchor);\r\n });\r\n\r\n this._rotateAnchorsDragBehaviors.push(rotateAnchorsDragBehavior);\r\n\r\n this._rotateAnchorsParent.addChild(anchor);\r\n }\r\n this._rootMesh.addChild(this._rotateAnchorsParent);\r\n\r\n // Create scale cubes\r\n this._scaleBoxesParent = new TransformNode(\"\", 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 = zeroAxisCount === 2 ? CreateBox(\"\", { size: 1 }, gizmoLayer.utilityLayerScene) : this._getCornerMesh(gizmoLayer);\r\n if (zeroAxisCount === 0) {\r\n box.rotationQuaternion = Quaternion.FromEulerAngles(j * 0.25 * Math.PI, (k + 3 * i - i * k) * 0.25 * Math.PI, 0);\r\n }\r\n\r\n box.material = this._coloredMaterial;\r\n box._internalMetadata = zeroAxisCount === 2; // None homogenous scale handle\r\n box.isNearGrabbable = true;\r\n\r\n // box is oriented so, transform world desired axis to local one\r\n TmpVectors.Vector3[0].set(i - 1, j - 1, k - 1);\r\n TmpVectors.Vector3[0].normalize();\r\n box.computeWorldMatrix(true).invertToRef(TmpVectors.Matrix[0]);\r\n const dragAxis = Vector3.TransformCoordinates(TmpVectors.Vector3[0], TmpVectors.Matrix[0]);\r\n dragAxis.normalize();\r\n\r\n // Dragging logic\r\n const scaleBoxesDragBehavior = new PointerDragBehavior({ dragAxis: dragAxis });\r\n scaleBoxesDragBehavior.updateDragPlane = false;\r\n scaleBoxesDragBehavior.moveAttached = false;\r\n let totalRelativeDragDistance = 0;\r\n let previousScale = 0;\r\n box.addBehavior(scaleBoxesDragBehavior);\r\n scaleBoxesDragBehavior.onDragObservable.add((event) => {\r\n this.onScaleBoxDragObservable.notifyObservers({ dragOperation: DragOperation.Scaling, dragAxis: new Vector3(i - 1, j - 1, k - 1) });\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 let relativeDragDistance = (event.dragDistance / this._boundingDimensions.length()) * this._anchorMesh.scaling.length();\r\n totalRelativeDragDistance += relativeDragDistance;\r\n if (this.scalingSnapDistance > 0) {\r\n const dragSteps = Math.floor(Math.abs(totalRelativeDragDistance) / this.scalingSnapDistance) * (totalRelativeDragDistance < 0 ? -1 : 1);\r\n const scale = this.scalingSnapDistance * dragSteps;\r\n relativeDragDistance = scale - previousScale;\r\n previousScale = scale;\r\n }\r\n\r\n const deltaScale = new Vector3(relativeDragDistance, relativeDragDistance, relativeDragDistance);\r\n const fullScale = new Vector3(previousScale, previousScale, previousScale);\r\n\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\r\n deltaScale.scaleInPlace(this._scaleDragSpeed);\r\n deltaScale.multiplyInPlace(this._axisFactor);\r\n\r\n fullScale.scaleInPlace(this._scaleDragSpeed);\r\n fullScale.multiplyInPlace(this._axisFactor);\r\n fullScale.addInPlace(this._incrementalStartupValue);\r\n\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 if (this.attachedMesh.isUsingPivotMatrix()) {\r\n this._anchorMesh.position.subtractInPlace(this.attachedMesh.getPivotPoint());\r\n }\r\n }\r\n\r\n this._anchorMesh.addChild(this.attachedMesh);\r\n if (this.incrementalSnap) {\r\n fullScale.x /= Math.abs(this._incrementalStartupValue.x) < Epsilon ? 1 : this._incrementalStartupValue.x;\r\n fullScale.y /= Math.abs(this._incrementalStartupValue.y) < Epsilon ? 1 : this._incrementalStartupValue.y;\r\n fullScale.z /= Math.abs(this._incrementalStartupValue.z) < Epsilon ? 1 : this._incrementalStartupValue.z;\r\n\r\n fullScale.x = Math.max(this._incrementalAnchorStartupValue.x * fullScale.x, this.scalingSnapDistance);\r\n fullScale.y = Math.max(this._incrementalAnchorStartupValue.y * fullScale.y, this.scalingSnapDistance);\r\n fullScale.z = Math.max(this._incrementalAnchorStartupValue.z * fullScale.z, this.scalingSnapDistance);\r\n\r\n this._anchorMesh.scaling.x += (fullScale.x - this._anchorMesh.scaling.x) * Math.abs(dragAxis.x);\r\n this._anchorMesh.scaling.y += (fullScale.y - this._anchorMesh.scaling.y) * Math.abs(dragAxis.y);\r\n this._anchorMesh.scaling.z += (fullScale.z - this._anchorMesh.scaling.z) * Math.abs(dragAxis.z);\r\n } else {\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 }\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 scaleBoxesDragBehavior.onDragStartObservable.add(() => {\r\n this.onDragStartObservable.notifyObservers({ dragOperation: DragOperation.Scaling, dragAxis: new Vector3(i - 1, j - 1, k - 1) });\r\n this._dragging = true;\r\n this._selectNode(box);\r\n totalRelativeDragDistance = 0;\r\n previousScale = 0;\r\n this._incrementalStartupValue.copyFrom(this.attachedMesh!.scaling);\r\n this._incrementalAnchorStartupValue.copyFrom(this._anchorMesh.scaling);\r\n });\r\n scaleBoxesDragBehavior.onDragEndObservable.add((event) => {\r\n this.onScaleBoxDragEndObservable.notifyObservers({ dragOperation: DragOperation.Scaling, dragAxis: new Vector3(i - 1, j - 1, k - 1) });\r\n this._dragging = false;\r\n this._selectNode(null);\r\n this._updateDummy();\r\n this._unhoverMeshOnTouchUp(event.pointerInfo, box);\r\n });\r\n\r\n this._scaleBoxesParent.addChild(box);\r\n this._scaleBoxesDragBehaviors.push(scaleBoxesDragBehavior);\r\n }\r\n }\r\n }\r\n this._rootMesh.addChild(this._scaleBoxesParent);\r\n\r\n // Hover color change\r\n const pointerIds: AbstractMesh[] = [];\r\n this._pointerObserver = gizmoLayer.utilityLayerScene.onPointerObservable.add((pointerInfo) => {\r\n if (!pointerIds[(<IPointerEvent>pointerInfo.event).pointerId]) {\r\n const meshes = this._rotateAnchorsParent.getChildMeshes().concat(this._scaleBoxesParent.getChildMeshes());\r\n\r\n for (const mesh of meshes) {\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 this.onHoverStartObservable.notifyObservers();\r\n this._isHovered = true;\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 pointerIds.splice((<IPointerEvent>pointerInfo.event).pointerId, 1);\r\n this.onHoverEndObservable.notifyObservers();\r\n this._isHovered = false;\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._updateRotationAnchors();\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 _getCornerMesh(gizmoLayer: UtilityLayerRenderer): Mesh {\r\n if (!this._cornerMesh) {\r\n const boxZ = CreateBox(\"\", { width: 0.4, height: 0.4, depth: 1.6 }, gizmoLayer.utilityLayerScene);\r\n boxZ.position.z = 0.6;\r\n const boxY = CreateBox(\"\", { width: 0.4, height: 1.6, depth: 0.4 }, gizmoLayer.utilityLayerScene);\r\n boxY.position.y = 0.6;\r\n const boxX = CreateBox(\"\", { width: 1.6, height: 0.4, depth: 0.4 }, gizmoLayer.utilityLayerScene);\r\n boxX.position.x = 0.6;\r\n this._cornerMesh = Mesh.MergeMeshes([boxX, boxY, boxZ], true);\r\n return this._cornerMesh!;\r\n }\r\n\r\n return this._cornerMesh.clone();\r\n }\r\n\r\n /**\r\n * returns true if the combination of non uniform scaling and rotation of the attached mesh is not supported\r\n * In that case, the matrix is skewed and the bounding box gizmo will not work correctly\r\n * @returns True if the combination is not supported, otherwise false.\r\n */\r\n protected _hasInvalidNonUniformScaling() {\r\n return (\r\n this._attachedMesh?.parent instanceof TransformNode &&\r\n this._attachedMesh?.parent.absoluteScaling.isNonUniformWithinEpsilon(0.001) &&\r\n ((this._attachedMesh?.rotationQuaternion && !this._attachedMesh?.rotationQuaternion.equalsWithEpsilon(Quaternion.Identity(), Epsilon)) ||\r\n this._attachedMesh?.rotation.equalsWithEpsilon(Vector3.Zero(), Epsilon) === false)\r\n );\r\n }\r\n protected override _attachedNodeChanged(value: Nullable<AbstractMesh>) {\r\n if (value) {\r\n if (this._hasInvalidNonUniformScaling()) {\r\n Logger.Warn(\"BoundingBoxGizmo controls are not supported on meshes with non-uniform scaling and rotation\");\r\n return;\r\n }\r\n // Reset anchor mesh to match attached mesh's scale\r\n // This is needed to avoid invalid box/anchor 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 const children = value.getChildMeshes(false);\r\n for (const m of children) {\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 protected _selectNode(selectedMesh: Nullable<Mesh>) {\r\n const meshes = this._rotateAnchorsParent.getChildMeshes().concat(this._scaleBoxesParent.getChildMeshes());\r\n\r\n for (const m of meshes) {\r\n m.isVisible = !selectedMesh || m == selectedMesh;\r\n }\r\n }\r\n\r\n protected _unhoverMeshOnTouchUp(pointerInfo: Nullable<PointerInfo>, selectedMesh: AbstractMesh) {\r\n // force unhover mesh if not a mouse event\r\n if (pointerInfo?.event instanceof PointerEvent && pointerInfo?.event.pointerType === \"touch\") {\r\n selectedMesh.material = this._coloredMaterial;\r\n }\r\n }\r\n\r\n /**\r\n * returns an array containing all boxes used for scaling (in increasing x, y and z orders)\r\n * @returns array of scaling boxes\r\n */\r\n public getScaleBoxes() {\r\n return this._scaleBoxesParent.getChildMeshes();\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 && !this._hasInvalidNonUniformScaling()) {\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._rotateAnchorsParent.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._updateRotationAnchors();\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 protected _updateRotationAnchors() {\r\n const rotateAnchors = this._rotateAnchorsParent.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 rotateAnchors[index].position.normalizeToRef(TmpVectors.Vector3[0]);\r\n if (i == 0) {\r\n rotateAnchors[index].position.set(0, this._boundingDimensions.y * (j - 0.5), this._boundingDimensions.z * (k - 0.5));\r\n TmpVectors.Vector3[1].set(1, 0, 0);\r\n }\r\n if (i == 1) {\r\n rotateAnchors[index].position.set(this._boundingDimensions.x * (j - 0.5), 0, this._boundingDimensions.z * (k - 0.5));\r\n TmpVectors.Vector3[1].set(0, 1, 0);\r\n }\r\n if (i == 2) {\r\n rotateAnchors[index].position.set(this._boundingDimensions.x * (j - 0.5), this._boundingDimensions.y * (k - 0.5), 0);\r\n TmpVectors.Vector3[1].set(0, 0, 1);\r\n }\r\n const target = TmpVectors.Vector3[2];\r\n Vector3.CrossToRef(TmpVectors.Vector3[0], TmpVectors.Vector3[1], target);\r\n target.normalize();\r\n target.addInPlace(rotateAnchors[index].position);\r\n rotateAnchors[index].lookAt(target);\r\n\r\n if (this.fixedDragMeshScreenSize && this.gizmoLayer.utilityLayerScene.activeCamera) {\r\n rotateAnchors[index].absolutePosition.subtractToRef(this.gizmoLayer.utilityLayerScene.activeCamera.position, this._tmpVector);\r\n const distanceFromCamera = (this.rotationSphereSize * this._tmpVector.length()) / this.fixedDragMeshScreenSizeDistanceFactor;\r\n rotateAnchors[index].scaling.set(distanceFromCamera, distanceFromCamera, distanceFromCamera);\r\n } else if (this.fixedDragMeshBoundsSize) {\r\n rotateAnchors[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 rotateAnchors[index].scaling.set(this.rotationSphereSize, this.rotationSphereSize, this.rotationSphereSize);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n protected _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.globalPosition, 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 const meshes = this._rotateAnchorsParent.getChildMeshes();\r\n for (let i = 0; i < meshes.length; i++) {\r\n const m = meshes[i] as Mesh;\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 const meshes = this._scaleBoxesParent.getChildMeshes();\r\n for (const m of meshes) {\r\n let enableMesh = enable;\r\n // Disable heterogeneous scale handles if requested.\r\n if (homogeneousScaling && m._internalMetadata === true) {\r\n enableMesh = false;\r\n }\r\n m.setEnabled(enableMesh);\r\n }\r\n }\r\n\r\n protected _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 * Force release the drag action by code\r\n */\r\n public releaseDrag() {\r\n for (const dragBehavior of this._scaleBoxesDragBehaviors) {\r\n dragBehavior.releaseDrag();\r\n }\r\n for (const dragBehavior of this._rotateAnchorsDragBehaviors) {\r\n dragBehavior.releaseDrag();\r\n }\r\n this._pointerDragBehavior.releaseDrag();\r\n }\r\n\r\n /**\r\n * Disposes of the gizmo\r\n */\r\n public override 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._rotateAnchorsParent.dispose();\r\n this._scaleBoxesParent.dispose();\r\n if (this._dragMesh) {\r\n this._dragMesh.dispose();\r\n }\r\n this._scaleBoxesDragBehaviors.length = 0;\r\n this._rotateAnchorsDragBehaviors.length = 0;\r\n this.onDragStartObservable.clear();\r\n this.onHoverStartObservable.clear();\r\n this.onHoverEndObservable.clear();\r\n this.onScaleBoxDragObservable.clear();\r\n this.onScaleBoxDragEndObservable.clear();\r\n this.onRotationSphereDragObservable.clear();\r\n this.onRotationSphereDragEndObservable.clear();\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 const children = root.getChildMeshes();\r\n for (const c of children) {\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 override setCustomMesh() {\r\n Logger.Error(\"Custom meshes are not supported on this gizmo\");\r\n }\r\n}\r\n"]}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { PerfCounter } from "../Misc/perfCounter.js";
|
|
2
|
-
import type { Nullable } from "../types.js";
|
|
3
2
|
import type { IDisposable } from "../scene.js";
|
|
4
3
|
import type { AbstractEngine } from "../Engines/abstractEngine.js";
|
|
5
4
|
/**
|
|
@@ -18,10 +17,11 @@ export declare class EngineInstrumentation implements IDisposable {
|
|
|
18
17
|
private _onEndFrameObserver;
|
|
19
18
|
private _onBeforeShaderCompilationObserver;
|
|
20
19
|
private _onAfterShaderCompilationObserver;
|
|
20
|
+
private _disposed;
|
|
21
21
|
/**
|
|
22
22
|
* Gets the perf counter used for GPU frame time
|
|
23
23
|
*/
|
|
24
|
-
get gpuFrameTimeCounter():
|
|
24
|
+
get gpuFrameTimeCounter(): PerfCounter;
|
|
25
25
|
/**
|
|
26
26
|
* Gets the GPU frame time capture status
|
|
27
27
|
*/
|
|
@@ -83,11 +83,15 @@ export class EngineInstrumentation {
|
|
|
83
83
|
this._onEndFrameObserver = null;
|
|
84
84
|
this._onBeforeShaderCompilationObserver = null;
|
|
85
85
|
this._onAfterShaderCompilationObserver = null;
|
|
86
|
+
this._disposed = false;
|
|
86
87
|
}
|
|
87
88
|
/**
|
|
88
89
|
* Dispose and release associated resources.
|
|
89
90
|
*/
|
|
90
91
|
dispose() {
|
|
92
|
+
if (this._disposed) {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
91
95
|
this.engine.onBeginFrameObservable.remove(this._onBeginFrameObserver);
|
|
92
96
|
this._onBeginFrameObserver = null;
|
|
93
97
|
this.engine.onEndFrameObservable.remove(this._onEndFrameObserver);
|
|
@@ -97,6 +101,7 @@ export class EngineInstrumentation {
|
|
|
97
101
|
this.engine.onAfterShaderCompilationObservable.remove(this._onAfterShaderCompilationObserver);
|
|
98
102
|
this._onAfterShaderCompilationObserver = null;
|
|
99
103
|
this.engine = null;
|
|
104
|
+
this._disposed = true;
|
|
100
105
|
}
|
|
101
106
|
}
|
|
102
107
|
//# sourceMappingURL=engineInstrumentation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engineInstrumentation.js","sourceRoot":"","sources":["../../../../dev/core/src/Instrumentation/engineInstrumentation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAIlD;;;GAGG;AACH,MAAM,OAAO,qBAAqB;
|
|
1
|
+
{"version":3,"file":"engineInstrumentation.js","sourceRoot":"","sources":["../../../../dev/core/src/Instrumentation/engineInstrumentation.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Observer } from \"../Misc/observable\";\r\nimport { PerfCounter } from \"../Misc/perfCounter\";\r\nimport type { Nullable } from \"../types\";\r\nimport type { IDisposable } from \"../scene\";\r\nimport type { AbstractEngine } from \"../Engines/abstractEngine\";\r\n/**\r\n * This class can be used to get instrumentation data from a Babylon engine\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#engineinstrumentation\r\n */\r\nexport class EngineInstrumentation implements IDisposable {\r\n private _captureGPUFrameTime = false;\r\n\r\n private _captureShaderCompilationTime = false;\r\n private _shaderCompilationTime = new PerfCounter();\r\n\r\n // Observers\r\n private _onBeginFrameObserver: Nullable<Observer<AbstractEngine>> = null;\r\n private _onEndFrameObserver: Nullable<Observer<AbstractEngine>> = null;\r\n private _onBeforeShaderCompilationObserver: Nullable<Observer<AbstractEngine>> = null;\r\n private _onAfterShaderCompilationObserver: Nullable<Observer<AbstractEngine>> = null;\r\n\r\n private _disposed = false;\r\n\r\n // Properties\r\n /**\r\n * Gets the perf counter used for GPU frame time\r\n */\r\n public get gpuFrameTimeCounter(): PerfCounter {\r\n return this.engine.getGPUFrameTimeCounter();\r\n }\r\n\r\n /**\r\n * Gets the GPU frame time capture status\r\n */\r\n public get captureGPUFrameTime(): boolean {\r\n return this._captureGPUFrameTime;\r\n }\r\n\r\n /**\r\n * Enable or disable the GPU frame time capture\r\n */\r\n public set captureGPUFrameTime(value: boolean) {\r\n if (value === this._captureGPUFrameTime) {\r\n return;\r\n }\r\n\r\n this._captureGPUFrameTime = value;\r\n this.engine.captureGPUFrameTime(value);\r\n }\r\n\r\n /**\r\n * Gets the perf counter used for shader compilation time\r\n */\r\n public get shaderCompilationTimeCounter(): PerfCounter {\r\n return this._shaderCompilationTime;\r\n }\r\n\r\n /**\r\n * Gets the shader compilation time capture status\r\n */\r\n public get captureShaderCompilationTime(): boolean {\r\n return this._captureShaderCompilationTime;\r\n }\r\n\r\n /**\r\n * Enable or disable the shader compilation time capture\r\n */\r\n public set captureShaderCompilationTime(value: boolean) {\r\n if (value === this._captureShaderCompilationTime) {\r\n return;\r\n }\r\n\r\n this._captureShaderCompilationTime = value;\r\n\r\n if (value) {\r\n this._onBeforeShaderCompilationObserver = this.engine.onBeforeShaderCompilationObservable.add(() => {\r\n this._shaderCompilationTime.fetchNewFrame();\r\n this._shaderCompilationTime.beginMonitoring();\r\n });\r\n\r\n this._onAfterShaderCompilationObserver = this.engine.onAfterShaderCompilationObservable.add(() => {\r\n this._shaderCompilationTime.endMonitoring();\r\n });\r\n } else {\r\n this.engine.onBeforeShaderCompilationObservable.remove(this._onBeforeShaderCompilationObserver);\r\n this._onBeforeShaderCompilationObserver = null;\r\n this.engine.onAfterShaderCompilationObservable.remove(this._onAfterShaderCompilationObserver);\r\n this._onAfterShaderCompilationObserver = null;\r\n }\r\n }\r\n\r\n /**\r\n * Instantiates a new engine instrumentation.\r\n * This class can be used to get instrumentation data from a Babylon engine\r\n * @see https://doc.babylonjs.com/features/featuresDeepDive/scene/optimize_your_scene#engineinstrumentation\r\n * @param engine Defines the engine to instrument\r\n */\r\n public constructor(\r\n /**\r\n * Define the instrumented engine.\r\n */\r\n public engine: AbstractEngine\r\n ) {}\r\n\r\n /**\r\n * Dispose and release associated resources.\r\n */\r\n public dispose() {\r\n if (this._disposed) {\r\n return;\r\n }\r\n\r\n this.engine.onBeginFrameObservable.remove(this._onBeginFrameObserver);\r\n this._onBeginFrameObserver = null;\r\n\r\n this.engine.onEndFrameObservable.remove(this._onEndFrameObserver);\r\n this._onEndFrameObserver = null;\r\n\r\n this.engine.onBeforeShaderCompilationObservable.remove(this._onBeforeShaderCompilationObserver);\r\n this._onBeforeShaderCompilationObserver = null;\r\n\r\n this.engine.onAfterShaderCompilationObservable.remove(this._onAfterShaderCompilationObserver);\r\n this._onAfterShaderCompilationObserver = null;\r\n\r\n (<any>this.engine) = null;\r\n this._disposed = true;\r\n }\r\n}\r\n"]}
|
|
@@ -46,6 +46,7 @@ export declare class SceneInstrumentation implements IDisposable {
|
|
|
46
46
|
private _onAfterAnimationsObserver;
|
|
47
47
|
private _onBeforeCameraRenderObserver;
|
|
48
48
|
private _onAfterCameraRenderObserver;
|
|
49
|
+
private _disposed;
|
|
49
50
|
/**
|
|
50
51
|
* Gets the perf counter used for active meshes evaluation time
|
|
51
52
|
*/
|
|
@@ -393,6 +393,7 @@ export class SceneInstrumentation {
|
|
|
393
393
|
this._onAfterAnimationsObserver = null;
|
|
394
394
|
this._onBeforeCameraRenderObserver = null;
|
|
395
395
|
this._onAfterCameraRenderObserver = null;
|
|
396
|
+
this._disposed = false;
|
|
396
397
|
// Before render
|
|
397
398
|
this._onBeforeAnimationsObserver = scene.onBeforeAnimationsObservable.add(() => {
|
|
398
399
|
if (this._captureActiveMeshesEvaluationTime) {
|
|
@@ -461,6 +462,9 @@ export class SceneInstrumentation {
|
|
|
461
462
|
* Dispose and release associated resources.
|
|
462
463
|
*/
|
|
463
464
|
dispose() {
|
|
465
|
+
if (this._disposed) {
|
|
466
|
+
return;
|
|
467
|
+
}
|
|
464
468
|
this.scene.onAfterRenderObservable.remove(this._onAfterRenderObserver);
|
|
465
469
|
this._onAfterRenderObserver = null;
|
|
466
470
|
this.scene.onBeforeActiveMeshesEvaluationObservable.remove(this._onBeforeActiveMeshesEvaluationObserver);
|
|
@@ -504,6 +508,7 @@ export class SceneInstrumentation {
|
|
|
504
508
|
this.scene.onAfterCameraRenderObservable.remove(this._onAfterCameraRenderObserver);
|
|
505
509
|
this._onAfterCameraRenderObserver = null;
|
|
506
510
|
this.scene = null;
|
|
511
|
+
this._disposed = true;
|
|
507
512
|
}
|
|
508
513
|
}
|
|
509
514
|
//# sourceMappingURL=sceneInstrumentation.js.map
|