@babylonjs/core 7.34.1 → 7.34.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/Animations/animationGroup.js +1 -1
  2. package/Animations/animationGroup.js.map +1 -1
  3. package/Collisions/gpuPicker.d.ts +1 -1
  4. package/Collisions/gpuPicker.js +1 -1
  5. package/Collisions/gpuPicker.js.map +1 -1
  6. package/Engines/WebGPU/Extensions/engine.query.js +9 -9
  7. package/Engines/WebGPU/Extensions/engine.query.js.map +1 -1
  8. package/Engines/abstractEngine.js +2 -2
  9. package/Engines/abstractEngine.js.map +1 -1
  10. package/Engines/thinWebGPUEngine.d.ts +3 -0
  11. package/Engines/thinWebGPUEngine.js.map +1 -1
  12. package/Engines/webgpuEngine.d.ts +1 -3
  13. package/Engines/webgpuEngine.js +1 -0
  14. package/Engines/webgpuEngine.js.map +1 -1
  15. package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.d.ts +1 -2
  16. package/FrameGraph/Node/Blocks/Rendering/baseObjectRendererBlock.js.map +1 -1
  17. package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.d.ts +9 -1
  18. package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.js +20 -2
  19. package/FrameGraph/Node/Blocks/Rendering/geometryRendererBlock.js.map +1 -1
  20. package/FrameGraph/Node/Blocks/Rendering/objectRendererBlock.d.ts +5 -1
  21. package/FrameGraph/Node/Blocks/Rendering/objectRendererBlock.js +18 -2
  22. package/FrameGraph/Node/Blocks/Rendering/objectRendererBlock.js.map +1 -1
  23. package/FrameGraph/Node/Blocks/Rendering/taaObjectRendererBlock.d.ts +5 -1
  24. package/FrameGraph/Node/Blocks/Rendering/taaObjectRendererBlock.js +16 -2
  25. package/FrameGraph/Node/Blocks/Rendering/taaObjectRendererBlock.js.map +1 -1
  26. package/FrameGraph/Tasks/Rendering/geometryRendererTask.d.ts +9 -6
  27. package/FrameGraph/Tasks/Rendering/geometryRendererTask.js +27 -25
  28. package/FrameGraph/Tasks/Rendering/geometryRendererTask.js.map +1 -1
  29. package/FrameGraph/Tasks/Rendering/objectRendererTask.d.ts +9 -6
  30. package/FrameGraph/Tasks/Rendering/objectRendererTask.js +25 -23
  31. package/FrameGraph/Tasks/Rendering/objectRendererTask.js.map +1 -1
  32. package/FrameGraph/Tasks/Rendering/taaObjectRendererTask.d.ts +3 -2
  33. package/FrameGraph/Tasks/Rendering/taaObjectRendererTask.js +8 -8
  34. package/FrameGraph/Tasks/Rendering/taaObjectRendererTask.js.map +1 -1
  35. package/FrameGraph/frameGraphRenderContext.d.ts +7 -3
  36. package/FrameGraph/frameGraphRenderContext.js +23 -4
  37. package/FrameGraph/frameGraphRenderContext.js.map +1 -1
  38. package/Gizmos/boundingBoxGizmo.d.ts +52 -10
  39. package/Gizmos/boundingBoxGizmo.js +17 -0
  40. package/Gizmos/boundingBoxGizmo.js.map +1 -1
  41. package/Gizmos/positionGizmo.js +1 -0
  42. package/Gizmos/positionGizmo.js.map +1 -1
  43. package/Gizmos/rotationGizmo.js +1 -0
  44. package/Gizmos/rotationGizmo.js.map +1 -1
  45. package/Materials/PBR/pbrSubSurfaceConfiguration.js +1 -0
  46. package/Materials/PBR/pbrSubSurfaceConfiguration.js.map +1 -1
  47. package/Materials/Textures/baseTexture.d.ts +4 -0
  48. package/Materials/Textures/baseTexture.js +3 -0
  49. package/Materials/Textures/baseTexture.js.map +1 -1
  50. package/Materials/Textures/multiRenderTarget.js +1 -1
  51. package/Materials/Textures/multiRenderTarget.js.map +1 -1
  52. package/Materials/Textures/renderTargetTexture.d.ts +46 -42
  53. package/Materials/Textures/renderTargetTexture.js +249 -435
  54. package/Materials/Textures/renderTargetTexture.js.map +1 -1
  55. package/Meshes/abstractMesh.hotSpot.d.ts +4 -2
  56. package/Meshes/abstractMesh.hotSpot.js +34 -7
  57. package/Meshes/abstractMesh.hotSpot.js.map +1 -1
  58. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.d.ts +1 -1
  59. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js +3 -9
  60. package/Rendering/IBLShadows/iblShadowsVoxelRenderer.js.map +1 -1
  61. package/Rendering/index.d.ts +1 -0
  62. package/Rendering/index.js +1 -0
  63. package/Rendering/index.js.map +1 -1
  64. package/Rendering/objectRenderer.d.ts +228 -0
  65. package/Rendering/objectRenderer.js +517 -0
  66. package/Rendering/objectRenderer.js.map +1 -0
  67. package/ShadersWGSL/ShadersInclude/pbrBlockPrePass.js +2 -3
  68. package/ShadersWGSL/ShadersInclude/pbrBlockPrePass.js.map +1 -1
  69. package/XR/features/WebXRControllerTeleportation.js +6 -0
  70. package/XR/features/WebXRControllerTeleportation.js.map +1 -1
  71. package/XR/features/WebXRDepthSensing.js +1 -0
  72. package/XR/features/WebXRDepthSensing.js.map +1 -1
  73. package/XR/features/WebXRHandTracking.js +1 -0
  74. package/XR/features/WebXRHandTracking.js.map +1 -1
  75. package/XR/motionController/webXRAbstractMotionController.js +1 -0
  76. package/XR/motionController/webXRAbstractMotionController.js.map +1 -1
  77. package/XR/webXRCamera.js +1 -0
  78. package/XR/webXRCamera.js.map +1 -1
  79. package/XR/webXRManagedOutputCanvas.js +1 -0
  80. package/XR/webXRManagedOutputCanvas.js.map +1 -1
  81. package/XR/webXRSessionManager.js +1 -0
  82. package/XR/webXRSessionManager.js.map +1 -1
  83. 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<{}>;\r\n /** Fired when a scale box is dragged */\r\n onScaleBoxDragObservable: Observable<{}>;\r\n /** Fired when a scale box drag is ended */\r\n onScaleBoxDragEndObservable: Observable<{}>;\r\n /** Fired when a rotation anchor is dragged */\r\n onRotationSphereDragObservable: Observable<{}>;\r\n /** Fired when a rotation anchor drag is ended */\r\n onRotationSphereDragEndObservable: Observable<{}>;\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<{}>();\r\n /**\r\n * Fired when a scale box is dragged\r\n */\r\n public onScaleBoxDragObservable = new Observable<{}>();\r\n /**\r\n * Fired when a scale box drag is ended\r\n */\r\n public onScaleBoxDragEndObservable = new Observable<{}>();\r\n /**\r\n * Fired when a rotation anchor is dragged\r\n */\r\n public onRotationSphereDragObservable = new Observable<{}>();\r\n /**\r\n * Fired when a rotation anchor drag is ended\r\n */\r\n public onRotationSphereDragEndObservable = new Observable<{}>();\r\n /**\r\n * Relative bounding box pivot used when scaling the attached node. When null object with scale from the opposite corner. 0.5,0.5,0.5 for center and 0.5,0,0.5 for bottom (Default: null)\r\n */\r\n public scalePivot: Nullable<Vector3> = null;\r\n /**\r\n * Scale factor used for masking some axis\r\n */\r\n 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 this._lineBoundingBox.getChildren().forEach((l) => {\r\n if ((l as LinesMesh).color) {\r\n (l as LinesMesh).color = color;\r\n }\r\n });\r\n }\r\n /**\r\n * Creates an BoundingBoxGizmo\r\n * @param color The color of the gizmo\r\n * @param gizmoLayer The utility layer the gizmo will be added to\r\n */\r\n constructor(color: Color3 = Color3.Gray(), gizmoLayer: UtilityLayerRenderer = UtilityLayerRenderer.DefaultKeepDepthUtilityLayer) {\r\n super(gizmoLayer);\r\n\r\n // Do not update the gizmo's scale so it has a fixed size to the object its attached to\r\n this.updateScale = false;\r\n\r\n this._anchorMesh = new 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 lines.forEach((l) => {\r\n l.color = color;\r\n l.position.addInPlace(new Vector3(-this._boundingDimensions.x / 2, -this._boundingDimensions.y / 2, -this._boundingDimensions.z / 2));\r\n l.isPickable = false;\r\n this._lineBoundingBox.addChild(l);\r\n });\r\n this._rootMesh.addChild(this._lineBoundingBox);\r\n\r\n this.setColor(color);\r\n\r\n // Create rotation 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 this._rotateAnchorsParent\r\n .getChildMeshes()\r\n .concat(this._scaleBoxesParent.getChildMeshes())\r\n .forEach((mesh) => {\r\n if (pointerInfo.pickInfo && pointerInfo.pickInfo.pickedMesh == mesh) {\r\n pointerIds[(<IPointerEvent>pointerInfo.event).pointerId] = mesh;\r\n mesh.material = this._hoverColoredMaterial;\r\n 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 delete pointerIds[(<IPointerEvent>pointerInfo.event).pointerId];\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 value.getChildMeshes(false).forEach((m) => {\r\n m.markAsDirty(\"scaling\");\r\n });\r\n\r\n this.gizmoLayer.utilityLayerScene.onAfterRenderObservable.addOnce(() => {\r\n this._updateDummy();\r\n });\r\n }\r\n }\r\n\r\n protected _selectNode(selectedMesh: Nullable<Mesh>) {\r\n this._rotateAnchorsParent\r\n .getChildMeshes()\r\n .concat(this._scaleBoxesParent.getChildMeshes())\r\n .forEach((m) => {\r\n m.isVisible = !selectedMesh || m == selectedMesh;\r\n });\r\n }\r\n\r\n 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 this._rotateAnchorsParent.getChildMeshes().forEach((m, i) => {\r\n if (i < 4) {\r\n m.setEnabled(axis.indexOf(\"x\") != -1);\r\n } else if (i < 8) {\r\n m.setEnabled(axis.indexOf(\"y\") != -1);\r\n } else {\r\n m.setEnabled(axis.indexOf(\"z\") != -1);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Enables/disables scaling\r\n * @param enable if scaling should be enabled\r\n * @param homogeneousScaling defines if scaling should only be homogeneous\r\n */\r\n public setEnabledScaling(enable: boolean, homogeneousScaling = false) {\r\n this._scaleBoxesParent.getChildMeshes().forEach((m) => {\r\n let enableMesh = enable;\r\n // Disable heterogeneous scale handles if requested.\r\n if (homogeneousScaling && m._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 this._scaleBoxesDragBehaviors.forEach((dragBehavior) => {\r\n dragBehavior.releaseDrag();\r\n });\r\n this._rotateAnchorsDragBehaviors.forEach((dragBehavior) => {\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 super.dispose();\r\n }\r\n\r\n /**\r\n * Makes a mesh not pickable and wraps the mesh inside of a bounding box mesh that is pickable. (This is useful to avoid picking within complex geometry)\r\n * @param mesh the mesh to wrap in the bounding box mesh and make not pickable\r\n * @returns the bounding box mesh with the passed in mesh as a child\r\n */\r\n public static MakeNotPickableAndWrapInBoundingBox(mesh: Mesh): Mesh {\r\n const makeNotPickable = (root: AbstractMesh) => {\r\n root.isPickable = false;\r\n root.getChildMeshes().forEach((c) => {\r\n makeNotPickable(c);\r\n });\r\n };\r\n makeNotPickable(mesh);\r\n\r\n // Reset position to get bounding box from origin with no rotation\r\n if (!mesh.rotationQuaternion) {\r\n mesh.rotationQuaternion = Quaternion.RotationYawPitchRoll(mesh.rotation.y, mesh.rotation.x, mesh.rotation.z);\r\n }\r\n const oldPos = mesh.position.clone();\r\n const oldRot = mesh.rotationQuaternion.clone();\r\n mesh.rotationQuaternion.set(0, 0, 0, 1);\r\n mesh.position.set(0, 0, 0);\r\n\r\n // Update bounding dimensions/positions\r\n const box = CreateBox(\"box\", { size: 1 }, mesh.getScene());\r\n const boundingMinMax = mesh.getHierarchyBoundingVectors();\r\n boundingMinMax.max.subtractToRef(boundingMinMax.min, box.scaling);\r\n\r\n // Adjust scale to avoid undefined behavior when adding child\r\n if (box.scaling.y === 0) {\r\n box.scaling.y = Epsilon;\r\n }\r\n if (box.scaling.x === 0) {\r\n box.scaling.x = Epsilon;\r\n }\r\n if (box.scaling.z === 0) {\r\n box.scaling.z = Epsilon;\r\n }\r\n\r\n box.position.set((boundingMinMax.max.x + boundingMinMax.min.x) / 2, (boundingMinMax.max.y + boundingMinMax.min.y) / 2, (boundingMinMax.max.z + boundingMinMax.min.z) / 2);\r\n\r\n // Restore original positions\r\n mesh.addChild(box);\r\n mesh.rotationQuaternion.copyFrom(oldRot);\r\n mesh.position.copyFrom(oldPos);\r\n\r\n // Reverse parenting\r\n mesh.removeChild(box);\r\n\r\n box.addChild(mesh);\r\n box.visibility = 0;\r\n return box;\r\n }\r\n /**\r\n * CustomMeshes are not supported by this gizmo\r\n */\r\n public 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":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAIxC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAE/E,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yCAAyC,CAAC;AAE9E,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE7C,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAElD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AA4FxD;;GAEG;AACH,MAAM,CAAN,IAAkB,aAGjB;AAHD,WAAkB,aAAa;IAC3B,yDAAQ,CAAA;IACR,uDAAO,CAAA;AACX,CAAC,EAHiB,aAAa,KAAb,aAAa,QAG9B;AAED;;GAEG;AACH,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IAsGvC;;;OAGG;IACH,IAAW,UAAU,CAAC,MAAe;QACjC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC;QAC1B,+BAA+B;QAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,cAAc,EAAE,CAAC;QAC3D,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;YACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;gBACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;oBACxB,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBAChF,IAAI,aAAa,KAAK,CAAC,IAAI,aAAa,KAAK,CAAC,EAAE;wBAC5C,SAAS;qBACZ;oBACD,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE;wBACnB,MAAM,QAAQ,GAAG,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;wBAClD,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;wBAC3C,UAAU,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,aAAa,EAAE,GAAG,OAAO,CAAC,CAAC;qBACpE;oBACD,KAAK,EAAE,CAAC;iBACX;aACJ;SACJ;IACL,CAAC;IAED;;;OAGG;IACH,IAAW,UAAU;QACjB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC5B,CAAC;IAED;;;OAGG;IACH,IAAW,cAAc,CAAC,KAAa;QACnC,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;IACjC,CAAC;IAED;;;OAGG;IACH,IAAW,cAAc;QACrB,OAAO,IAAI,CAAC,eAAe,CAAC;IAChC,CAAC;IAmBD,4EAA4E;IAC5E,IAAW,eAAe;QACtB,OAAO,IAAI,CAAC,gBAAgB,CAAC;IACjC,CAAC;IAED,8DAA8D;IAC9D,IAAW,aAAa;QACpB,OAAO,IAAI,CAAC,qBAAqB,CAAC;IACtC,CAAC;IACD;;OAEG;IACH,IAAW,mBAAmB;QAC1B,OAAO,IAAI,CAAC,oBAAoB,CAAC;IACrC,CAAC;IAED,6EAA6E;IAC7E,IAAW,UAAU;QACjB,OAAO,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC;IAChE,CAAC;IAED;;;OAGG;IACI,QAAQ,CAAC,KAAa;QACzB,IAAI,CAAC,gBAAgB,CAAC,aAAa,GAAG,KAAK,CAAC;QAC5C,IAAI,CAAC,qBAAqB,CAAC,aAAa,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;QACxF,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YAC9C,IAAK,CAAe,CAAC,KAAK,EAAE;gBACvB,CAAe,CAAC,KAAK,GAAG,KAAK,CAAC;aAClC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IACD;;;;OAIG;IACH,YAAY,QAAgB,MAAM,CAAC,IAAI,EAAE,EAAE,aAAmC,oBAAoB,CAAC,4BAA4B;QAC3H,KAAK,CAAC,UAAU,CAAC,CAAC;QA9MZ,wBAAmB,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3C,oBAAe,GAA8B,IAAI,CAAC;QAClD,qBAAgB,GAAoC,IAAI,CAAC;QACzD,oBAAe,GAAG,GAAG,CAAC;QACtB,gCAA2B,GAA+B,EAAE,CAAC;QAC7D,6BAAwB,GAA+B,EAAE,CAAC;QACpE;;WAEG;QACO,cAAS,GAAG,KAAK,CAAC;QAEpB,mBAAc,GAAG,IAAI,UAAU,EAAE,CAAC;QAClC,eAAU,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAClC,uBAAkB,GAAG,IAAI,MAAM,EAAE,CAAC;QAClC,6BAAwB,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC1C,mCAA8B,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAExD;;WAEG;QACI,mBAAc,GAAG,KAAK,CAAC;QAC9B;;WAEG;QACI,0BAAqB,GAAsD,IAAI,CAAC;QAEvF;;WAEG;QACI,uBAAkB,GAAG,GAAG,CAAC;QAChC;;WAEG;QACI,iBAAY,GAAG,GAAG,CAAC;QAC1B;;;WAGG;QACI,4BAAuB,GAAG,KAAK,CAAC;QACvC;;;WAGG;QACI,4BAAuB,GAAG,KAAK,CAAC;QACvC;;WAEG;QACI,0CAAqC,GAAG,EAAE,CAAC;QAClD;;WAEG;QACI,wBAAmB,GAAG,CAAC,CAAC;QAC/B;;WAEG;QACI,yBAAoB,GAAG,CAAC,CAAC;QAChC;;WAEG;QACI,0BAAqB,GAAG,IAAI,UAAU,EAAuD,CAAC;QACrG;;WAEG;QACI,2BAAsB,GAAG,IAAI,UAAU,EAAQ,CAAC;QACvD;;WAEG;QACI,yBAAoB,GAAG,IAAI,UAAU,EAAQ,CAAC;QACrD;;WAEG;QACI,6BAAwB,GAAG,IAAI,UAAU,EAAuD,CAAC;QACxG;;WAEG;QACI,gCAA2B,GAAG,IAAI,UAAU,EAAuD,CAAC;QAC3G;;WAEG;QACI,mCAA8B,GAAG,IAAI,UAAU,EAAuD,CAAC;QAC9G;;WAEG;QACI,sCAAiC,GAAG,IAAI,UAAU,EAAuD,CAAC;QACjH;;WAEG;QACI,eAAU,GAAsB,IAAI,CAAC;QAC5C;;WAEG;QACO,gBAAW,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAE7C;;WAEG;QACI,oBAAe,GAAG,KAAK,CAAC;QA0DrB,uBAAkB,GAAG,IAAI,OAAO,EAAE,CAAC;QAE7C,WAAW;QACD,cAAS,GAAmB,IAAI,CAAC;QACjC,yBAAoB,GAAG,IAAI,mBAAmB,EAAE,CAAC;QAK3D,wBAAwB;QACd,gBAAW,GAAmB,IAAI,CAAC;QA4CzC,uFAAuF;QACvF,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QAEzB,IAAI,CAAC,WAAW,GAAG,IAAI,aAAa,CAAC,QAAQ,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC;QAC7E,mBAAmB;QACnB,IAAI,CAAC,gBAAgB,GAAG,IAAI,gBAAgB,CAAC,EAAE,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC;QAC/E,IAAI,CAAC,gBAAgB,CAAC,eAAe,GAAG,IAAI,CAAC;QAC7C,IAAI,CAAC,qBAAqB,GAAG,IAAI,gBAAgB,CAAC,EAAE,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC;QACpF,IAAI,CAAC,qBAAqB,CAAC,eAAe,GAAG,IAAI,CAAC;QAElD,kCAAkC;QAClC,IAAI,CAAC,gBAAgB,GAAG,IAAI,aAAa,CAAC,EAAE,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC;QAC5E,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,GAAG,IAAI,UAAU,EAAE,CAAC;QAC5D,MAAM,KAAK,GAAG,EAAE,CAAC;QACjB,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAClJ,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAClJ,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAClJ,KAAK,CAAC,IAAI,CACN,WAAW,CACP,OAAO,EACP,EAAE,MAAM,EAAE,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EACnI,UAAU,CAAC,iBAAiB,CAC/B,CACJ,CAAC;QACF,KAAK,CAAC,IAAI,CACN,WAAW,CACP,OAAO,EACP,EAAE,MAAM,EAAE,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,EAAE,EACnI,UAAU,CAAC,iBAAiB,CAC/B,CACJ,CAAC;QACF,KAAK,CAAC,IAAI,CACN,WAAW,CACP,OAAO,EACP,EAAE,MAAM,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EACnI,UAAU,CAAC,iBAAiB,CAC/B,CACJ,CAAC;QACF,KAAK,CAAC,IAAI,CACN,WAAW,CACP,OAAO,EACP,EAAE,MAAM,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,EAAE,EACnI,UAAU,CAAC,iBAAiB,CAC/B,CACJ,CAAC;QACF,KAAK,CAAC,IAAI,CACN,WAAW,CACP,OAAO,EACP,EAAE,MAAM,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,IAAI,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,EAAE,EACnI,UAAU,CAAC,iBAAiB,CAC/B,CACJ,CAAC;QACF,KAAK,CAAC,IAAI,CACN,WAAW,CACP,OAAO,EACP,EAAE,MAAM,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,IAAI,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,EAAE,EACnI,UAAU,CAAC,iBAAiB,CAC/B,CACJ,CAAC;QACF,KAAK,CAAC,IAAI,CACN,WAAW,CACP,OAAO,EACP;YACI,MAAM,EAAE;gBACJ,IAAI,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;gBAC/F,IAAI,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;aACzE;SACJ,EACD,UAAU,CAAC,iBAAiB,CAC/B,CACJ,CAAC;QACF,KAAK,CAAC,IAAI,CACN,WAAW,CACP,OAAO,EACP;YACI,MAAM,EAAE;gBACJ,IAAI,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;gBAC/F,IAAI,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;aACzE;SACJ,EACD,UAAU,CAAC,iBAAiB,CAC/B,CACJ,CAAC;QACF,KAAK,CAAC,IAAI,CACN,WAAW,CACP,OAAO,EACP;YACI,MAAM,EAAE;gBACJ,IAAI,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;gBAC/F,IAAI,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC;aACzE;SACJ,EACD,UAAU,CAAC,iBAAiB,CAC/B,CACJ,CAAC;QACF,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YAChB,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC;YAChB,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACtI,CAAC,CAAC,UAAU,GAAG,KAAK,CAAC;YACrB,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAE/C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAErB,0BAA0B;QAC1B,IAAI,CAAC,oBAAoB,GAAG,IAAI,aAAa,CAAC,EAAE,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC;QAChF,IAAI,CAAC,oBAAoB,CAAC,kBAAkB,GAAG,IAAI,UAAU,EAAE,CAAC;QAChE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE;YACzB,MAAM,MAAM,GAAG,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC;YACpJ,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YACzD,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YACzD,MAAM,CAAC,yBAAyB,CAAC,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC;YAClE,MAAM,CAAC,kBAAkB,GAAG,IAAI,UAAU,EAAE,CAAC;YAC7C,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC;YACxC,MAAM,CAAC,eAAe,GAAG,IAAI,CAAC;YAE9B,gBAAgB;YAChB,MAAM,yBAAyB,GAAG,IAAI,mBAAmB,CAAC,EAAE,CAAC,CAAC;YAC9D,yBAAyB,CAAC,YAAY,GAAG,KAAK,CAAC;YAC/C,yBAAyB,CAAC,eAAe,GAAG,KAAK,CAAC;YAClD,MAAM,CAAC,WAAW,CAAC,yBAAyB,CAAC,CAAC;YAC9C,MAAM,qBAAqB,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACnD,IAAI,qBAAqB,GAAG,CAAC,CAAC;YAC9B,IAAI,mBAAmB,GAAG,CAAC,CAAC;YAC5B,yBAAyB,CAAC,qBAAqB,CAAC,GAAG,CAAC,GAAG,EAAE;gBACrD,qBAAqB,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBAC/C,qBAAqB,GAAG,CAAC,CAAC;gBAC1B,mBAAmB,GAAG,CAAC,CAAC;YAC5B,CAAC,CAAC,CAAC;YACH,MAAM,WAAW,GAAG;gBAChB,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBACxC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,aAAa,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,aAAa,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC9G,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YACjC,CAAC,CAAC;YACF,yBAAyB,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;gBACrD,IAAI,CAAC,8BAA8B,CAAC,eAAe,CAAC,EAAE,aAAa,gCAAwB,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBAChI,IAAI,IAAI,CAAC,YAAY,EAAE;oBACnB,MAAM,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;oBAChD,IAAI,cAAc,IAAK,cAAuB,CAAC,OAAO,IAAK,cAAuB,CAAC,OAAO,CAAC,yBAAyB,CAAC,KAAK,CAAC,EAAE;wBACzH,MAAM,CAAC,IAAI,CAAC,6FAA6F,CAAC,CAAC;wBAC3G,OAAO;qBACV;oBACD,UAAU,CAAC,yBAAyB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;oBAExD,MAAM,kBAAkB,GAAG,qBAAqB,CAAC;oBAEjD,+CAA+C;oBAC/C,MAAM,KAAK,GAAG,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,eAAe,EAAE,kBAAkB,CAAC,CAAC,CAAC;oBAClG,MAAM,QAAQ,GAAG,kBAAkB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,cAAc,EAAE,CAAC;oBAErE,4EAA4E;oBAC5E,IAAI,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;oBAE5H,0CAA0C;oBAC1C,WAAW,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;oBAEpG,uBAAuB;oBACvB,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,kBAAkB,EAAE;wBACvC,IAAI,CAAC,YAAY,CAAC,kBAAkB,GAAG,UAAU,CAAC,oBAAoB,CAClE,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,EAC5B,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,EAC5B,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAC/B,CAAC;qBACL;oBACD,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,kBAAkB,EAAE;wBACtC,IAAI,CAAC,WAAW,CAAC,kBAAkB,GAAG,UAAU,CAAC,oBAAoB,CACjE,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,EAC3B,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,EAC3B,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAC9B,CAAC;qBACL;oBAED,0DAA0D;oBAC1D,qBAAqB,IAAI,WAAW,CAAC;oBACrC,IAAI,IAAI,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE;wBAChD,IAAI,IAAI,CAAC,oBAAoB,GAAG,CAAC,EAAE;4BAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,qBAAqB,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,qBAAqB,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;4BACjI,MAAM,KAAK,GAAG,IAAI,CAAC,oBAAoB,GAAG,SAAS,CAAC;4BACpD,WAAW,GAAG,KAAK,GAAG,mBAAmB,CAAC;4BAC1C,mBAAmB,GAAG,KAAK,CAAC;yBAC/B;wBACD,IAAI,CAAC,IAAI,CAAC,EAAE;4BACR,UAAU,CAAC,yBAAyB,CAAC,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;yBAChF;6BAAM,IAAI,CAAC,IAAI,CAAC,EAAE;4BACf,UAAU,CAAC,yBAAyB,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;yBAChF;6BAAM;4BACH,UAAU,CAAC,yBAAyB,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;yBAChF;wBAED,gFAAgF;wBAChF,IAAI,IAAI,CAAC,YAAY,CAAC,kBAAkB,EAAE,EAAE;4BACxC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;yBAClE;wBACD,uCAAuC;wBACvC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;wBAC7C,IAAI,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC,oBAAoB,EAAE;4BAClD,IAAI,CAAC,cAAc,CAAC,gBAAgB,EAAE,CAAC;yBAC1C;wBACD,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC;wBAChC,IAAI,CAAC,WAAW,CAAC,kBAAmB,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,WAAW,CAAC,kBAAmB,CAAC,CAAC;wBAC9G,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC,SAAS,EAAE,CAAC;wBAChD,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;wBAChD,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;qBAC/C;oBACD,IAAI,CAAC,iBAAiB,EAAE,CAAC;oBAEzB,UAAU,CAAC,kBAAkB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;iBACpD;gBACD,IAAI,CAAC,YAAY,EAAE,CAAC;YACxB,CAAC,CAAC,CAAC;YAEH,wBAAwB;YACxB,yBAAyB,CAAC,qBAAqB,CAAC,GAAG,CAAC,GAAG,EAAE;gBACrD,IAAI,CAAC,qBAAqB,CAAC,eAAe,CAAC,EAAE,aAAa,gCAAwB,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACvH,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;gBACtB,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAC7B,CAAC,CAAC,CAAC;YACH,yBAAyB,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;gBACxD,IAAI,CAAC,iCAAiC,CAAC,eAAe,CAAC,EAAE,aAAa,gCAAwB,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACnI,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;gBACvB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;gBACvB,IAAI,CAAC,YAAY,EAAE,CAAC;gBACpB,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;YAC1D,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;YAEjE,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;SAC9C;QACD,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAEnD,qBAAqB;QACrB,IAAI,CAAC,iBAAiB,GAAG,IAAI,aAAa,CAAC,EAAE,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC;QAC7E,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;YACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;gBACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;oBACxB,+BAA+B;oBAC/B,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBAChF,IAAI,aAAa,KAAK,CAAC,IAAI,aAAa,KAAK,CAAC,EAAE;wBAC5C,SAAS;qBACZ;oBAED,MAAM,GAAG,GAAG,aAAa,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;oBAC7H,IAAI,aAAa,KAAK,CAAC,EAAE;wBACrB,GAAG,CAAC,kBAAkB,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;qBACpH;oBAED,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC;oBACrC,GAAG,CAAC,iBAAiB,GAAG,aAAa,KAAK,CAAC,CAAC,CAAC,+BAA+B;oBAC5E,GAAG,CAAC,eAAe,GAAG,IAAI,CAAC;oBAE3B,gEAAgE;oBAChE,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;oBAC/C,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;oBAClC,GAAG,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC/D,MAAM,QAAQ,GAAG,OAAO,CAAC,oBAAoB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC3F,QAAQ,CAAC,SAAS,EAAE,CAAC;oBAErB,iBAAiB;oBACjB,MAAM,sBAAsB,GAAG,IAAI,mBAAmB,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;oBAC/E,sBAAsB,CAAC,eAAe,GAAG,KAAK,CAAC;oBAC/C,sBAAsB,CAAC,YAAY,GAAG,KAAK,CAAC;oBAC5C,IAAI,yBAAyB,GAAG,CAAC,CAAC;oBAClC,IAAI,aAAa,GAAG,CAAC,CAAC;oBACtB,GAAG,CAAC,WAAW,CAAC,sBAAsB,CAAC,CAAC;oBACxC,sBAAsB,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;wBAClD,IAAI,CAAC,wBAAwB,CAAC,eAAe,CAAC,EAAE,aAAa,+BAAuB,EAAE,QAAQ,EAAE,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;wBACpI,IAAI,IAAI,CAAC,YAAY,EAAE;4BACnB,MAAM,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;4BAChD,IAAI,cAAc,IAAK,cAAuB,CAAC,OAAO,IAAK,cAAuB,CAAC,OAAO,CAAC,yBAAyB,CAAC,KAAK,CAAC,EAAE;gCACzH,MAAM,CAAC,IAAI,CAAC,6FAA6F,CAAC,CAAC;gCAC3G,OAAO;6BACV;4BACD,UAAU,CAAC,yBAAyB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;4BACxD,IAAI,oBAAoB,GAAG,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;4BACxH,yBAAyB,IAAI,oBAAoB,CAAC;4BAClD,IAAI,IAAI,CAAC,mBAAmB,GAAG,CAAC,EAAE;gCAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,yBAAyB,CAAC,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,yBAAyB,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gCACxI,MAAM,KAAK,GAAG,IAAI,CAAC,mBAAmB,GAAG,SAAS,CAAC;gCACnD,oBAAoB,GAAG,KAAK,GAAG,aAAa,CAAC;gCAC7C,aAAa,GAAG,KAAK,CAAC;6BACzB;4BAED,MAAM,UAAU,GAAG,IAAI,OAAO,CAAC,oBAAoB,EAAE,oBAAoB,EAAE,oBAAoB,CAAC,CAAC;4BACjG,MAAM,SAAS,GAAG,IAAI,OAAO,CAAC,aAAa,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC;4BAE3E,IAAI,aAAa,KAAK,CAAC,EAAE;gCACrB,+DAA+D;gCAC/D,UAAU,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gCACrC,UAAU,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gCACrC,UAAU,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;6BACxC;4BAED,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;4BAC9C,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;4BAE7C,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;4BAC7C,SAAS,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;4BAC5C,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;4BAEpD,IAAI,CAAC,iBAAiB,EAAE,CAAC;4BACzB,IAAI,IAAI,CAAC,UAAU,EAAE;gCACjB,IAAI,CAAC,YAAY,CAAC,cAAc,EAAE,CAAC,sBAAsB,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;gCACnF,wEAAwE;gCACxE,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;gCAC1D,OAAO,CAAC,yBAAyB,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;gCAC7F,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gCAC3D,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;gCACzE,OAAO,CAAC,yBAAyB,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;gCAC7F,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;6BACzD;iCAAM;gCACH,iDAAiD;gCACjD,GAAG,CAAC,gBAAgB,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;gCAC/E,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gCAC3D,IAAI,IAAI,CAAC,YAAY,CAAC,kBAAkB,EAAE,EAAE;oCACxC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE,CAAC,CAAC;iCAChF;6BACJ;4BAED,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;4BAC7C,IAAI,IAAI,CAAC,eAAe,EAAE;gCACtB,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;gCACzG,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;gCACzG,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;gCAEzG,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;gCACtG,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;gCACtG,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;gCAEtG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gCAChG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gCAChG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;6BACnG;iCAAM;gCACH,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;gCAChD,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,EAAE;oCACpG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;iCACxD;6BACJ;4BACD,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;4BAChD,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;4BAC5C,UAAU,CAAC,kBAAkB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;yBACpD;wBACD,IAAI,CAAC,YAAY,EAAE,CAAC;oBACxB,CAAC,CAAC,CAAC;oBAEH,wBAAwB;oBACxB,sBAAsB,CAAC,qBAAqB,CAAC,GAAG,CAAC,GAAG,EAAE;wBAClD,IAAI,CAAC,qBAAqB,CAAC,eAAe,CAAC,EAAE,aAAa,+BAAuB,EAAE,QAAQ,EAAE,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;wBACjI,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;wBACtB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;wBACtB,yBAAyB,GAAG,CAAC,CAAC;wBAC9B,aAAa,GAAG,CAAC,CAAC;wBAClB,IAAI,CAAC,wBAAwB,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAa,CAAC,OAAO,CAAC,CAAC;wBACnE,IAAI,CAAC,8BAA8B,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAY,CAAC,OAAO,CAAC,CAAC;oBAC5E,CAAC,CAAC,CAAC;oBACH,sBAAsB,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;wBACrD,IAAI,CAAC,2BAA2B,CAAC,eAAe,CAAC,EAAE,aAAa,+BAAuB,EAAE,QAAQ,EAAE,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;wBACvI,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;wBACvB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;wBACvB,IAAI,CAAC,YAAY,EAAE,CAAC;wBACpB,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;oBACvD,CAAC,CAAC,CAAC;oBAEH,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;oBACrC,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;iBAC9D;aACJ;SACJ;QACD,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAEhD,qBAAqB;QACrB,MAAM,UAAU,GAAmB,EAAE,CAAC;QACtC,IAAI,CAAC,gBAAgB,GAAG,UAAU,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE;YACzF,IAAI,CAAC,UAAU,CAAiB,WAAW,CAAC,KAAM,CAAC,SAAS,CAAC,EAAE;gBAC3D,IAAI,CAAC,oBAAoB;qBACpB,cAAc,EAAE;qBAChB,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,cAAc,EAAE,CAAC;qBAC/C,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;oBACd,IAAI,WAAW,CAAC,QAAQ,IAAI,WAAW,CAAC,QAAQ,CAAC,UAAU,IAAI,IAAI,EAAE;wBACjE,UAAU,CAAiB,WAAW,CAAC,KAAM,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;wBAChE,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,qBAAqB,CAAC;wBAC3C,IAAI,CAAC,sBAAsB,CAAC,eAAe,EAAE,CAAC;wBAC9C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;qBAC1B;gBACL,CAAC,CAAC,CAAC;aACV;iBAAM;gBACH,IAAI,WAAW,CAAC,QAAQ,IAAI,WAAW,CAAC,QAAQ,CAAC,UAAU,IAAI,UAAU,CAAiB,WAAW,CAAC,KAAM,CAAC,SAAS,CAAC,EAAE;oBACrH,UAAU,CAAiB,WAAW,CAAC,KAAM,CAAC,SAAS,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC;oBAC1F,OAAO,UAAU,CAAiB,WAAW,CAAC,KAAM,CAAC,SAAS,CAAC,CAAC;oBAChE,IAAI,CAAC,oBAAoB,CAAC,eAAe,EAAE,CAAC;oBAC5C,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;iBAC3B;aACJ;QACL,CAAC,CAAC,CAAC;QAEH,gCAAgC;QAChC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,wBAAwB,CAAC,GAAG,CAAC,GAAG,EAAE;YACnF,sDAAsD;YACtD,IAAI,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE;gBACjF,IAAI,CAAC,iBAAiB,EAAE,CAAC;aAC5B;iBAAM,IAAI,IAAI,CAAC,uBAAuB,IAAI,IAAI,CAAC,uBAAuB,EAAE;gBACrE,IAAI,CAAC,sBAAsB,EAAE,CAAC;gBAC9B,IAAI,CAAC,iBAAiB,EAAE,CAAC;aAC5B;YAED,6FAA6F;YAC7F,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE;gBAC3E,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,uBAAuB,CAAC,IAAI,CAAC,SAAS,CAAC,kBAAmB,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;gBAC5G,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aACjG;QACL,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAC7B,CAAC;IAES,cAAc,CAAC,UAAgC;QACrD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YACnB,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC;YAClG,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,GAAG,CAAC;YACtB,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC;YAClG,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,GAAG,CAAC;YACtB,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC;YAClG,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,GAAG,CAAC;YACtB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;YAC9D,OAAO,IAAI,CAAC,WAAY,CAAC;SAC5B;QAED,OAAO,IAAI,CAAC,WAAY,CAAC,KAAK,EAAE,CAAC;IACrC,CAAC;IACkB,oBAAoB,CAAC,KAA6B;QACjE,IAAI,KAAK,EAAE;YACP,mDAAmD;YACnD,oEAAoE;YACpE,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACnC,UAAU,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC;YAC5C,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,CAAC;YACpC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACjC,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YACpC,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;YAChC,UAAU,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;YACrC,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACzB,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;gBACtC,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;YAC7B,CAAC,CAAC,CAAC;YAEH,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,uBAAuB,CAAC,OAAO,CAAC,GAAG,EAAE;gBACnE,IAAI,CAAC,YAAY,EAAE,CAAC;YACxB,CAAC,CAAC,CAAC;SACN;IACL,CAAC;IAES,WAAW,CAAC,YAA4B;QAC9C,IAAI,CAAC,oBAAoB;aACpB,cAAc,EAAE;aAChB,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,cAAc,EAAE,CAAC;aAC/C,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACX,CAAC,CAAC,SAAS,GAAG,CAAC,YAAY,IAAI,CAAC,IAAI,YAAY,CAAC;QACrD,CAAC,CAAC,CAAC;IACX,CAAC;IAES,qBAAqB,CAAC,WAAkC,EAAE,YAA0B;QAC1F,0CAA0C;QAC1C,IAAI,WAAW,EAAE,KAAK,YAAY,YAAY,IAAI,WAAW,EAAE,KAAK,CAAC,WAAW,KAAK,OAAO,EAAE;YAC1F,YAAY,CAAC,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC;SACjD;IACL,CAAC;IAED;;;OAGG;IACI,aAAa;QAChB,OAAO,IAAI,CAAC,iBAAiB,CAAC,cAAc,EAAE,CAAC;IACnD,CAAC;IAED;;OAEG;IACI,iBAAiB;QACpB,IAAI,IAAI,CAAC,YAAY,EAAE;YACnB,UAAU,CAAC,yBAAyB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAExD,wBAAwB;YACxB,MAAM,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;YAChD,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAElC,IAAI,CAAC,OAAO,EAAE,CAAC;YAEf,uBAAuB;YACvB,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,kBAAkB,EAAE;gBACvC,IAAI,CAAC,YAAY,CAAC,kBAAkB,GAAG,UAAU,CAAC,oBAAoB,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;aACpK;YACD,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,kBAAkB,EAAE;gBACtC,IAAI,CAAC,WAAW,CAAC,kBAAkB,GAAG,UAAU,CAAC,oBAAoB,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;aAChK;YACD,IAAI,CAAC,WAAW,CAAC,kBAAkB,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC;YAEnF,qFAAqF;YACrF,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC;YACnE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YACrD,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACrD,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAExC,uCAAuC;YACvC,MAAM,cAAc,GAAG,IAAI,CAAC,YAAY,CAAC,2BAA2B,CAAC,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,qBAAqB,CAAC,CAAC;YACvH,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;YAE/E,0DAA0D;YAC1D,kHAAkH;YAClH,6EAA6E;YAC7E,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YACjE,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAC9B,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EACjD,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EACjD,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CACpD,CAAC;YACF,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;YAC5E,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;YACzE,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,CAAC;YAC3C,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;YAE3E,mCAAmC;YACnC,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACnE,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAErD,0BAA0B;YAC1B,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;SAC/C;QAED,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC9B,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAEzB,IAAI,IAAI,CAAC,YAAY,EAAE;YACnB,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YAC5D,UAAU,CAAC,kBAAkB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;SACpD;IACL,CAAC;IAES,sBAAsB;QAC5B,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC,cAAc,EAAE,CAAC;QACjE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;YACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;gBACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;oBACxB,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBAChC,aAAa,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;oBACpE,IAAI,CAAC,IAAI,CAAC,EAAE;wBACR,aAAa,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;wBACrH,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;qBACtC;oBACD,IAAI,CAAC,IAAI,CAAC,EAAE;wBACR,aAAa,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;wBACrH,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;qBACtC;oBACD,IAAI,CAAC,IAAI,CAAC,EAAE;wBACR,aAAa,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;wBACrH,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;qBACtC;oBACD,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;oBACrC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;oBACzE,MAAM,CAAC,SAAS,EAAE,CAAC;oBACnB,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC;oBACjD,aAAa,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;oBAEpC,IAAI,IAAI,CAAC,uBAAuB,IAAI,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,YAAY,EAAE;wBAChF,aAAa,CAAC,KAAK,CAAC,CAAC,gBAAgB,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;wBAC9H,MAAM,kBAAkB,GAAG,CAAC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,qCAAqC,CAAC;wBAC7H,aAAa,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,kBAAkB,EAAE,kBAAkB,CAAC,CAAC;qBAChG;yBAAM,IAAI,IAAI,CAAC,uBAAuB,EAAE;wBACrC,aAAa,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAC5B,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,mBAAmB,CAAC,CAAC,EACpD,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,mBAAmB,CAAC,CAAC,EACpD,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,mBAAmB,CAAC,CAAC,CACvD,CAAC;qBACL;yBAAM;wBACH,aAAa,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;qBAC/G;iBACJ;aACJ;SACJ;IACL,CAAC;IAES,iBAAiB;QACvB,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,cAAc,EAAE,CAAC;QAC3D,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;YACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;gBACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;oBACxB,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBAChF,IAAI,aAAa,KAAK,CAAC,IAAI,aAAa,KAAK,CAAC,EAAE;wBAC5C,SAAS;qBACZ;oBACD,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE;wBACnB,UAAU,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;wBACjJ,UAAU,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;wBACtJ,IAAI,IAAI,CAAC,uBAAuB,IAAI,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,YAAY,EAAE;4BAChF,UAAU,CAAC,KAAK,CAAC,CAAC,gBAAgB,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,YAAY,CAAC,cAAc,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;4BACjI,MAAM,kBAAkB,GAAG,CAAC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,qCAAqC,CAAC;4BACvH,UAAU,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,kBAAkB,EAAE,kBAAkB,CAAC,CAAC;yBAC7F;6BAAM,IAAI,IAAI,CAAC,uBAAuB,EAAE;4BACrC,UAAU,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CACzB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,CAAC,EAC9C,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,CAAC,EAC9C,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,CAAC,CACjD,CAAC;yBACL;6BAAM;4BACH,UAAU,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;yBAC1F;qBACJ;oBACD,KAAK,EAAE,CAAC;iBACX;aACJ;SACJ;IACL,CAAC;IAED;;;OAGG;IACI,sBAAsB,CAAC,IAAY;QACtC,IAAI,CAAC,oBAAoB,CAAC,cAAc,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACxD,IAAI,CAAC,GAAG,CAAC,EAAE;gBACP,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aACzC;iBAAM,IAAI,CAAC,GAAG,CAAC,EAAE;gBACd,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aACzC;iBAAM;gBACH,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aACzC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IAED;;;;OAIG;IACI,iBAAiB,CAAC,MAAe,EAAE,kBAAkB,GAAG,KAAK;QAChE,IAAI,CAAC,iBAAiB,CAAC,cAAc,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YAClD,IAAI,UAAU,GAAG,MAAM,CAAC;YACxB,oDAAoD;YACpD,IAAI,kBAAkB,IAAI,CAAC,CAAC,iBAAiB,KAAK,IAAI,EAAE;gBACpD,UAAU,GAAG,KAAK,CAAC;aACtB;YACD,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;IACP,CAAC;IAES,YAAY;QAClB,IAAI,IAAI,CAAC,SAAS,EAAE;YAChB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,mBAAmB,EAAE,CAAC,CAAC;YAC9E,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAC/D,IAAI,CAAC,SAAS,CAAC,kBAAmB,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,kBAAmB,CAAC,CAAC;SACnF;IACL,CAAC;IAED;;OAEG;IACI,kBAAkB;QACrB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;QACpF,IAAI,CAAC,SAAS,CAAC,UAAU,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,SAAS,CAAC,kBAAkB,GAAG,IAAI,UAAU,EAAE,CAAC;QACrD,IAAI,CAAC,oBAAoB,CAAC,+BAA+B,GAAG,KAAK,CAAC;QAClE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAC1D,CAAC;IAED;;OAEG;IACI,WAAW;QACd,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC,YAAY,EAAE,EAAE;YACnD,YAAY,CAAC,WAAW,EAAE,CAAC;QAC/B,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,2BAA2B,CAAC,OAAO,CAAC,CAAC,YAAY,EAAE,EAAE;YACtD,YAAY,CAAC,WAAW,EAAE,CAAC;QAC/B,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,oBAAoB,CAAC,WAAW,EAAE,CAAC;IAC5C,CAAC;IAED;;OAEG;IACa,OAAO;QACnB,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACpF,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,wBAAwB,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACpF,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC;QAChC,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE,CAAC;QACpC,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,CAAC;QACjC,IAAI,IAAI,CAAC,SAAS,EAAE;YAChB,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;SAC5B;QACD,IAAI,CAAC,wBAAwB,CAAC,MAAM,GAAG,CAAC,CAAC;QACzC,IAAI,CAAC,2BAA2B,CAAC,MAAM,GAAG,CAAC,CAAC;QAC5C,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,CAAC;QACnC,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,CAAC;QACpC,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,CAAC;QAClC,IAAI,CAAC,wBAAwB,CAAC,KAAK,EAAE,CAAC;QACtC,IAAI,CAAC,2BAA2B,CAAC,KAAK,EAAE,CAAC;QACzC,IAAI,CAAC,8BAA8B,CAAC,KAAK,EAAE,CAAC;QAC5C,IAAI,CAAC,iCAAiC,CAAC,KAAK,EAAE,CAAC;QAC/C,KAAK,CAAC,OAAO,EAAE,CAAC;IACpB,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,mCAAmC,CAAC,IAAU;QACxD,MAAM,eAAe,GAAG,CAAC,IAAkB,EAAE,EAAE;YAC3C,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;YACxB,IAAI,CAAC,cAAc,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;gBAChC,eAAe,CAAC,CAAC,CAAC,CAAC;YACvB,CAAC,CAAC,CAAC;QACP,CAAC,CAAC;QACF,eAAe,CAAC,IAAI,CAAC,CAAC;QAEtB,kEAAkE;QAClE,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE;YAC1B,IAAI,CAAC,kBAAkB,GAAG,UAAU,CAAC,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;SAChH;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC;QAC/C,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACxC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAE3B,uCAAuC;QACvC,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC3D,MAAM,cAAc,GAAG,IAAI,CAAC,2BAA2B,EAAE,CAAC;QAC1D,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QAElE,6DAA6D;QAC7D,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,EAAE;YACrB,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC;SAC3B;QACD,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,EAAE;YACrB,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC;SAC3B;QACD,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,EAAE;YACrB,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC;SAC3B;QAED,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAE1K,6BAA6B;QAC7B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACnB,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAE/B,oBAAoB;QACpB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAEtB,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACnB,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC;QACnB,OAAO,GAAG,CAAC;IACf,CAAC;IACD;;OAEG;IACa,aAAa;QACzB,MAAM,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;IAClE,CAAC;CACJ","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 this._lineBoundingBox.getChildren().forEach((l) => {\r\n if ((l as LinesMesh).color) {\r\n (l as LinesMesh).color = color;\r\n }\r\n });\r\n }\r\n /**\r\n * Creates an BoundingBoxGizmo\r\n * @param color The color of the gizmo\r\n * @param gizmoLayer The utility layer the gizmo will be added to\r\n */\r\n constructor(color: Color3 = Color3.Gray(), gizmoLayer: UtilityLayerRenderer = UtilityLayerRenderer.DefaultKeepDepthUtilityLayer) {\r\n super(gizmoLayer);\r\n\r\n // Do not update the gizmo's scale so it has a fixed size to the object its attached to\r\n this.updateScale = false;\r\n\r\n this._anchorMesh = new 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 lines.forEach((l) => {\r\n l.color = color;\r\n l.position.addInPlace(new Vector3(-this._boundingDimensions.x / 2, -this._boundingDimensions.y / 2, -this._boundingDimensions.z / 2));\r\n l.isPickable = false;\r\n this._lineBoundingBox.addChild(l);\r\n });\r\n this._rootMesh.addChild(this._lineBoundingBox);\r\n\r\n this.setColor(color);\r\n\r\n // Create rotation 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 this._rotateAnchorsParent\r\n .getChildMeshes()\r\n .concat(this._scaleBoxesParent.getChildMeshes())\r\n .forEach((mesh) => {\r\n if (pointerInfo.pickInfo && pointerInfo.pickInfo.pickedMesh == mesh) {\r\n pointerIds[(<IPointerEvent>pointerInfo.event).pointerId] = mesh;\r\n mesh.material = this._hoverColoredMaterial;\r\n 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 delete pointerIds[(<IPointerEvent>pointerInfo.event).pointerId];\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 value.getChildMeshes(false).forEach((m) => {\r\n m.markAsDirty(\"scaling\");\r\n });\r\n\r\n this.gizmoLayer.utilityLayerScene.onAfterRenderObservable.addOnce(() => {\r\n this._updateDummy();\r\n });\r\n }\r\n }\r\n\r\n protected _selectNode(selectedMesh: Nullable<Mesh>) {\r\n this._rotateAnchorsParent\r\n .getChildMeshes()\r\n .concat(this._scaleBoxesParent.getChildMeshes())\r\n .forEach((m) => {\r\n m.isVisible = !selectedMesh || m == selectedMesh;\r\n });\r\n }\r\n\r\n 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 this._rotateAnchorsParent.getChildMeshes().forEach((m, i) => {\r\n if (i < 4) {\r\n m.setEnabled(axis.indexOf(\"x\") != -1);\r\n } else if (i < 8) {\r\n m.setEnabled(axis.indexOf(\"y\") != -1);\r\n } else {\r\n m.setEnabled(axis.indexOf(\"z\") != -1);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Enables/disables scaling\r\n * @param enable if scaling should be enabled\r\n * @param homogeneousScaling defines if scaling should only be homogeneous\r\n */\r\n public setEnabledScaling(enable: boolean, homogeneousScaling = false) {\r\n this._scaleBoxesParent.getChildMeshes().forEach((m) => {\r\n let enableMesh = enable;\r\n // Disable heterogeneous scale handles if requested.\r\n if (homogeneousScaling && m._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 this._scaleBoxesDragBehaviors.forEach((dragBehavior) => {\r\n dragBehavior.releaseDrag();\r\n });\r\n this._rotateAnchorsDragBehaviors.forEach((dragBehavior) => {\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 root.getChildMeshes().forEach((c) => {\r\n makeNotPickable(c);\r\n });\r\n };\r\n makeNotPickable(mesh);\r\n\r\n // Reset position to get bounding box from origin with no rotation\r\n if (!mesh.rotationQuaternion) {\r\n mesh.rotationQuaternion = Quaternion.RotationYawPitchRoll(mesh.rotation.y, mesh.rotation.x, mesh.rotation.z);\r\n }\r\n const oldPos = mesh.position.clone();\r\n const oldRot = mesh.rotationQuaternion.clone();\r\n mesh.rotationQuaternion.set(0, 0, 0, 1);\r\n mesh.position.set(0, 0, 0);\r\n\r\n // Update bounding dimensions/positions\r\n const box = CreateBox(\"box\", { size: 1 }, mesh.getScene());\r\n const boundingMinMax = mesh.getHierarchyBoundingVectors();\r\n boundingMinMax.max.subtractToRef(boundingMinMax.min, box.scaling);\r\n\r\n // Adjust scale to avoid undefined behavior when adding child\r\n if (box.scaling.y === 0) {\r\n box.scaling.y = Epsilon;\r\n }\r\n if (box.scaling.x === 0) {\r\n box.scaling.x = Epsilon;\r\n }\r\n if (box.scaling.z === 0) {\r\n box.scaling.z = Epsilon;\r\n }\r\n\r\n box.position.set((boundingMinMax.max.x + boundingMinMax.min.x) / 2, (boundingMinMax.max.y + boundingMinMax.min.y) / 2, (boundingMinMax.max.z + boundingMinMax.min.z) / 2);\r\n\r\n // Restore original positions\r\n mesh.addChild(box);\r\n mesh.rotationQuaternion.copyFrom(oldRot);\r\n mesh.position.copyFrom(oldPos);\r\n\r\n // Reverse parenting\r\n mesh.removeChild(box);\r\n\r\n box.addChild(mesh);\r\n box.visibility = 0;\r\n return box;\r\n }\r\n /**\r\n * CustomMeshes are not supported by this gizmo\r\n */\r\n public override setCustomMesh() {\r\n Logger.Error(\"Custom meshes are not supported on this gizmo\");\r\n }\r\n}\r\n"]}
@@ -272,6 +272,7 @@ export class PositionGizmo extends Gizmo {
272
272
  this.onDragStartObservable.clear();
273
273
  this.onDragObservable.clear();
274
274
  this.onDragEndObservable.clear();
275
+ super.dispose();
275
276
  }
276
277
  /**
277
278
  * CustomMeshes are not supported by this gizmo
@@ -1 +1 @@
1
- {"version":3,"file":"positionGizmo.js","sourceRoot":"","sources":["../../../../dev/core/src/Gizmos/positionGizmo.ts"],"names":[],"mappings":"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","sourcesContent":["import { Logger } from \"../Misc/logger\";\r\nimport type { Observer } from \"../Misc/observable\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport type { Nullable } from \"../types\";\r\nimport { Vector3 } from \"../Maths/math.vector\";\r\nimport type { Quaternion } from \"../Maths/math.vector\";\r\nimport { Color3 } from \"../Maths/math.color\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { Node } from \"../node\";\r\nimport type { Mesh } from \"../Meshes/mesh\";\r\nimport type { GizmoAnchorPoint, GizmoCoordinatesMode, GizmoAxisCache, IGizmo } from \"./gizmo\";\r\nimport { Gizmo } from \"./gizmo\";\r\nimport type { IAxisDragGizmo } from \"./axisDragGizmo\";\r\nimport { AxisDragGizmo } from \"./axisDragGizmo\";\r\nimport type { IPlaneDragGizmo } from \"./planeDragGizmo\";\r\nimport { PlaneDragGizmo } from \"./planeDragGizmo\";\r\nimport { UtilityLayerRenderer } from \"../Rendering/utilityLayerRenderer\";\r\nimport type { PointerInfo } from \"../Events/pointerEvents\";\r\nimport type { GizmoManager } from \"./gizmoManager\";\r\nimport type { TransformNode } from \"../Meshes/transformNode\";\r\n\r\n/**\r\n * Interface for position gizmo\r\n */\r\nexport interface IPositionGizmo extends IGizmo {\r\n /** Internal gizmo used for interactions on the x axis */\r\n xGizmo: IAxisDragGizmo;\r\n /** Internal gizmo used for interactions on the y axis */\r\n yGizmo: IAxisDragGizmo;\r\n /** Internal gizmo used for interactions on the z axis */\r\n zGizmo: IAxisDragGizmo;\r\n /** Internal gizmo used for interactions on the yz plane */\r\n xPlaneGizmo: IPlaneDragGizmo;\r\n /** Internal gizmo used for interactions on the xz plane */\r\n yPlaneGizmo: IPlaneDragGizmo;\r\n /** Internal gizmo used for interactions on the xy plane */\r\n zPlaneGizmo: IPlaneDragGizmo;\r\n /** True when the mouse pointer is dragging a gizmo mesh */\r\n readonly isDragging: boolean;\r\n /** Fires an event when any of it's sub gizmos are dragged */\r\n onDragStartObservable: Observable<unknown>;\r\n /** Fires an event when any of it's sub gizmos are being dragged */\r\n onDragObservable: Observable<unknown>;\r\n /** Fires an event when any of it's sub gizmos are released from dragging */\r\n onDragEndObservable: Observable<unknown>;\r\n /**\r\n * If the planar drag gizmo is enabled\r\n * setting this will enable/disable XY, XZ and YZ planes regardless of individual gizmo settings.\r\n */\r\n planarGizmoEnabled: boolean;\r\n /** Drag distance in babylon units that the gizmo will snap to when dragged */\r\n snapDistance: number;\r\n /**\r\n * Builds Gizmo Axis Cache to enable features such as hover state preservation and graying out other axis during manipulation\r\n * @param mesh Axis gizmo mesh\r\n * @param cache Gizmo axis definition used for reactive gizmo UI\r\n */\r\n addToAxisCache(mesh: Mesh, cache: GizmoAxisCache): void;\r\n /**\r\n * Force release the drag action by code\r\n */\r\n releaseDrag(): void;\r\n}\r\n\r\n/**\r\n * Additional options for the position gizmo\r\n */\r\nexport interface PositionGizmoOptions {\r\n /**\r\n * Additional transform applied to the gizmo.\r\n * @See Gizmo.additionalTransformNode for more detail\r\n */\r\n additionalTransformNode?: TransformNode;\r\n}\r\n\r\n/**\r\n * Gizmo that enables dragging a mesh along 3 axis\r\n */\r\nexport class PositionGizmo extends Gizmo implements IPositionGizmo {\r\n /**\r\n * Internal gizmo used for interactions on the x axis\r\n */\r\n public xGizmo: IAxisDragGizmo;\r\n /**\r\n * Internal gizmo used for interactions on the y axis\r\n */\r\n public yGizmo: IAxisDragGizmo;\r\n /**\r\n * Internal gizmo used for interactions on the z axis\r\n */\r\n public zGizmo: IAxisDragGizmo;\r\n /**\r\n * Internal gizmo used for interactions on the yz plane\r\n */\r\n public xPlaneGizmo: IPlaneDragGizmo;\r\n /**\r\n * Internal gizmo used for interactions on the xz plane\r\n */\r\n public yPlaneGizmo: IPlaneDragGizmo;\r\n /**\r\n * Internal gizmo used for interactions on the xy plane\r\n */\r\n public zPlaneGizmo: IPlaneDragGizmo;\r\n\r\n /**\r\n * protected variables\r\n */\r\n protected _meshAttached: Nullable<AbstractMesh> = null;\r\n protected _nodeAttached: Nullable<Node> = null;\r\n protected _snapDistance: number;\r\n protected _observables: Observer<PointerInfo>[] = [];\r\n\r\n /** Node Caching for quick lookup */\r\n protected _gizmoAxisCache: Map<Mesh, GizmoAxisCache> = new Map();\r\n\r\n /** Fires an event when any of it's sub gizmos are dragged */\r\n public onDragStartObservable = new Observable();\r\n /** Fires an event when any of it's sub gizmos are being dragged */\r\n public onDragObservable = new Observable();\r\n /** Fires an event when any of it's sub gizmos are released from dragging */\r\n public onDragEndObservable = new Observable();\r\n\r\n /**\r\n * If set to true, planar drag is enabled\r\n */\r\n protected _planarGizmoEnabled = false;\r\n\r\n public override get attachedMesh() {\r\n return this._meshAttached;\r\n }\r\n public override set attachedMesh(mesh: Nullable<AbstractMesh>) {\r\n this._meshAttached = mesh;\r\n this._nodeAttached = mesh;\r\n [this.xGizmo, this.yGizmo, this.zGizmo, this.xPlaneGizmo, this.yPlaneGizmo, this.zPlaneGizmo].forEach((gizmo) => {\r\n if (gizmo.isEnabled) {\r\n gizmo.attachedMesh = mesh;\r\n } else {\r\n gizmo.attachedMesh = null;\r\n }\r\n });\r\n }\r\n\r\n public override get attachedNode() {\r\n return this._nodeAttached;\r\n }\r\n public override set attachedNode(node: Nullable<Node>) {\r\n this._meshAttached = null;\r\n this._nodeAttached = node;\r\n [this.xGizmo, this.yGizmo, this.zGizmo, this.xPlaneGizmo, this.yPlaneGizmo, this.zPlaneGizmo].forEach((gizmo) => {\r\n if (gizmo.isEnabled) {\r\n gizmo.attachedNode = node;\r\n } else {\r\n gizmo.attachedNode = null;\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * True when the mouse pointer is hovering a gizmo mesh\r\n */\r\n public override get isHovered() {\r\n return this.xGizmo.isHovered || this.yGizmo.isHovered || this.zGizmo.isHovered || this.xPlaneGizmo.isHovered || this.yPlaneGizmo.isHovered || this.zPlaneGizmo.isHovered;\r\n }\r\n\r\n public get isDragging() {\r\n return (\r\n this.xGizmo.dragBehavior.dragging ||\r\n this.yGizmo.dragBehavior.dragging ||\r\n this.zGizmo.dragBehavior.dragging ||\r\n this.xPlaneGizmo.dragBehavior.dragging ||\r\n this.yPlaneGizmo.dragBehavior.dragging ||\r\n this.zPlaneGizmo.dragBehavior.dragging\r\n );\r\n }\r\n\r\n public override get additionalTransformNode() {\r\n return this._additionalTransformNode;\r\n }\r\n\r\n public override set additionalTransformNode(transformNode: TransformNode | undefined) {\r\n [this.xGizmo, this.yGizmo, this.zGizmo, this.xPlaneGizmo, this.yPlaneGizmo, this.zPlaneGizmo].forEach((gizmo) => {\r\n gizmo.additionalTransformNode = transformNode;\r\n });\r\n }\r\n\r\n /**\r\n * Creates a PositionGizmo\r\n * @param gizmoLayer The utility layer the gizmo will be added to\r\n * @param thickness display gizmo axis thickness\r\n * @param gizmoManager\r\n * @param options More options\r\n */\r\n constructor(gizmoLayer: UtilityLayerRenderer = UtilityLayerRenderer.DefaultUtilityLayer, thickness: number = 1, gizmoManager?: GizmoManager, options?: PositionGizmoOptions) {\r\n super(gizmoLayer);\r\n this.xGizmo = new AxisDragGizmo(new Vector3(1, 0, 0), Color3.Red().scale(0.5), gizmoLayer, this, thickness);\r\n this.yGizmo = new AxisDragGizmo(new Vector3(0, 1, 0), Color3.Green().scale(0.5), gizmoLayer, this, thickness);\r\n this.zGizmo = new AxisDragGizmo(new Vector3(0, 0, 1), Color3.Blue().scale(0.5), gizmoLayer, this, thickness);\r\n\r\n this.xPlaneGizmo = new PlaneDragGizmo(new Vector3(1, 0, 0), Color3.Red().scale(0.5), this.gizmoLayer, this);\r\n this.yPlaneGizmo = new PlaneDragGizmo(new Vector3(0, 1, 0), Color3.Green().scale(0.5), this.gizmoLayer, this);\r\n this.zPlaneGizmo = new PlaneDragGizmo(new Vector3(0, 0, 1), Color3.Blue().scale(0.5), this.gizmoLayer, this);\r\n\r\n this.additionalTransformNode = options?.additionalTransformNode;\r\n\r\n // Relay drag events\r\n [this.xGizmo, this.yGizmo, this.zGizmo, this.xPlaneGizmo, this.yPlaneGizmo, this.zPlaneGizmo].forEach((gizmo) => {\r\n gizmo.dragBehavior.onDragStartObservable.add(() => {\r\n this.onDragStartObservable.notifyObservers({});\r\n });\r\n gizmo.dragBehavior.onDragObservable.add(() => {\r\n this.onDragObservable.notifyObservers({});\r\n });\r\n gizmo.dragBehavior.onDragEndObservable.add(() => {\r\n this.onDragEndObservable.notifyObservers({});\r\n });\r\n });\r\n\r\n this.attachedMesh = null;\r\n\r\n if (gizmoManager) {\r\n gizmoManager.addToAxisCache(this._gizmoAxisCache);\r\n } else {\r\n // Only subscribe to pointer event if gizmoManager isnt\r\n Gizmo.GizmoAxisPointerObserver(gizmoLayer, this._gizmoAxisCache);\r\n }\r\n }\r\n\r\n /**\r\n * If the planar drag gizmo is enabled\r\n * setting this will enable/disable XY, XZ and YZ planes regardless of individual gizmo settings.\r\n */\r\n public set planarGizmoEnabled(value: boolean) {\r\n this._planarGizmoEnabled = value;\r\n [this.xPlaneGizmo, this.yPlaneGizmo, this.zPlaneGizmo].forEach((gizmo) => {\r\n if (gizmo) {\r\n gizmo.isEnabled = value;\r\n if (value) {\r\n if (gizmo.attachedMesh) {\r\n gizmo.attachedMesh = this.attachedMesh;\r\n } else {\r\n gizmo.attachedNode = this.attachedNode;\r\n }\r\n }\r\n }\r\n }, this);\r\n }\r\n public get planarGizmoEnabled(): boolean {\r\n return this._planarGizmoEnabled;\r\n }\r\n\r\n /**\r\n * posture that the gizmo will be display\r\n * When set null, default value will be used (Quaternion(0, 0, 0, 1))\r\n */\r\n public override get customRotationQuaternion(): Nullable<Quaternion> {\r\n return this._customRotationQuaternion;\r\n }\r\n\r\n public override set customRotationQuaternion(customRotationQuaternion: Nullable<Quaternion>) {\r\n this._customRotationQuaternion = customRotationQuaternion;\r\n [this.xGizmo, this.yGizmo, this.zGizmo, this.xPlaneGizmo, this.yPlaneGizmo, this.zPlaneGizmo].forEach((gizmo) => {\r\n if (gizmo) {\r\n gizmo.customRotationQuaternion = customRotationQuaternion;\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * If set the gizmo's rotation will be updated to match the attached mesh each frame (Default: true)\r\n * NOTE: This is only possible for meshes with uniform scaling, as otherwise it's not possible to decompose the rotation\r\n */\r\n public override set updateGizmoRotationToMatchAttachedMesh(value: boolean) {\r\n this._updateGizmoRotationToMatchAttachedMesh = value;\r\n [this.xGizmo, this.yGizmo, this.zGizmo, this.xPlaneGizmo, this.yPlaneGizmo, this.zPlaneGizmo].forEach((gizmo) => {\r\n if (gizmo) {\r\n gizmo.updateGizmoRotationToMatchAttachedMesh = value;\r\n }\r\n });\r\n }\r\n public override get updateGizmoRotationToMatchAttachedMesh() {\r\n return this._updateGizmoRotationToMatchAttachedMesh;\r\n }\r\n\r\n public override set updateGizmoPositionToMatchAttachedMesh(value: boolean) {\r\n this._updateGizmoPositionToMatchAttachedMesh = value;\r\n [this.xGizmo, this.yGizmo, this.zGizmo, this.xPlaneGizmo, this.yPlaneGizmo, this.zPlaneGizmo].forEach((gizmo) => {\r\n if (gizmo) {\r\n gizmo.updateGizmoPositionToMatchAttachedMesh = value;\r\n }\r\n });\r\n }\r\n public override get updateGizmoPositionToMatchAttachedMesh() {\r\n return this._updateGizmoPositionToMatchAttachedMesh;\r\n }\r\n\r\n public override set anchorPoint(value: GizmoAnchorPoint) {\r\n this._anchorPoint = value;\r\n [this.xGizmo, this.yGizmo, this.zGizmo, this.xPlaneGizmo, this.yPlaneGizmo, this.zPlaneGizmo].forEach((gizmo) => {\r\n gizmo.anchorPoint = value;\r\n });\r\n }\r\n public override get anchorPoint() {\r\n return this._anchorPoint;\r\n }\r\n\r\n /**\r\n * Set the coordinate system to use. By default it's local.\r\n * But it's possible for a user to tweak so its local for translation and world for rotation.\r\n * In that case, setting the coordinate system will change `updateGizmoRotationToMatchAttachedMesh` and `updateGizmoPositionToMatchAttachedMesh`\r\n */\r\n public override set coordinatesMode(coordinatesMode: GizmoCoordinatesMode) {\r\n [this.xGizmo, this.yGizmo, this.zGizmo, this.xPlaneGizmo, this.yPlaneGizmo, this.zPlaneGizmo].forEach((gizmo) => {\r\n gizmo.coordinatesMode = coordinatesMode;\r\n });\r\n }\r\n\r\n public override set updateScale(value: boolean) {\r\n if (this.xGizmo) {\r\n this.xGizmo.updateScale = value;\r\n this.yGizmo.updateScale = value;\r\n this.zGizmo.updateScale = value;\r\n }\r\n }\r\n public override get updateScale() {\r\n return this.xGizmo.updateScale;\r\n }\r\n /**\r\n * Drag distance in babylon units that the gizmo will snap to when dragged (Default: 0)\r\n */\r\n public set snapDistance(value: number) {\r\n this._snapDistance = value;\r\n [this.xGizmo, this.yGizmo, this.zGizmo, this.xPlaneGizmo, this.yPlaneGizmo, this.zPlaneGizmo].forEach((gizmo) => {\r\n if (gizmo) {\r\n gizmo.snapDistance = value;\r\n }\r\n });\r\n }\r\n public get snapDistance() {\r\n return this._snapDistance;\r\n }\r\n\r\n /**\r\n * Ratio for the scale of the gizmo (Default: 1)\r\n */\r\n public override set scaleRatio(value: number) {\r\n this._scaleRatio = value;\r\n [this.xGizmo, this.yGizmo, this.zGizmo, this.xPlaneGizmo, this.yPlaneGizmo, this.zPlaneGizmo].forEach((gizmo) => {\r\n if (gizmo) {\r\n gizmo.scaleRatio = value;\r\n }\r\n });\r\n }\r\n public override get scaleRatio() {\r\n return this._scaleRatio;\r\n }\r\n\r\n /**\r\n * Builds Gizmo Axis Cache to enable features such as hover state preservation and graying out other axis during manipulation\r\n * @param mesh Axis gizmo mesh\r\n * @param cache Gizmo axis definition used for reactive gizmo UI\r\n */\r\n public addToAxisCache(mesh: Mesh, cache: GizmoAxisCache) {\r\n this._gizmoAxisCache.set(mesh, cache);\r\n }\r\n /**\r\n * Force release the drag action by code\r\n */\r\n public releaseDrag() {\r\n this.xGizmo.dragBehavior.releaseDrag();\r\n this.yGizmo.dragBehavior.releaseDrag();\r\n this.zGizmo.dragBehavior.releaseDrag();\r\n this.xPlaneGizmo.dragBehavior.releaseDrag();\r\n this.yPlaneGizmo.dragBehavior.releaseDrag();\r\n this.zPlaneGizmo.dragBehavior.releaseDrag();\r\n }\r\n\r\n /**\r\n * Disposes of the gizmo\r\n */\r\n public override dispose() {\r\n [this.xGizmo, this.yGizmo, this.zGizmo, this.xPlaneGizmo, this.yPlaneGizmo, this.zPlaneGizmo].forEach((gizmo) => {\r\n if (gizmo) {\r\n gizmo.dispose();\r\n }\r\n });\r\n this._observables.forEach((obs) => {\r\n this.gizmoLayer.utilityLayerScene.onPointerObservable.remove(obs);\r\n });\r\n this.onDragStartObservable.clear();\r\n this.onDragObservable.clear();\r\n this.onDragEndObservable.clear();\r\n }\r\n\r\n /**\r\n * CustomMeshes are not supported by this gizmo\r\n */\r\n public override setCustomMesh() {\r\n Logger.Error(\r\n \"Custom meshes are not supported on this gizmo, please set the custom meshes on the gizmos contained within this one (gizmo.xGizmo, gizmo.yGizmo, gizmo.zGizmo,gizmo.xPlaneGizmo, gizmo.yPlaneGizmo, gizmo.zPlaneGizmo)\"\r\n );\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"positionGizmo.js","sourceRoot":"","sources":["../../../../dev/core/src/Gizmos/positionGizmo.ts"],"names":[],"mappings":"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","sourcesContent":["import { Logger } from \"../Misc/logger\";\r\nimport type { Observer } from \"../Misc/observable\";\r\nimport { Observable } from \"../Misc/observable\";\r\nimport type { Nullable } from \"../types\";\r\nimport { Vector3 } from \"../Maths/math.vector\";\r\nimport type { Quaternion } from \"../Maths/math.vector\";\r\nimport { Color3 } from \"../Maths/math.color\";\r\nimport type { AbstractMesh } from \"../Meshes/abstractMesh\";\r\nimport type { Node } from \"../node\";\r\nimport type { Mesh } from \"../Meshes/mesh\";\r\nimport type { GizmoAnchorPoint, GizmoCoordinatesMode, GizmoAxisCache, IGizmo } from \"./gizmo\";\r\nimport { Gizmo } from \"./gizmo\";\r\nimport type { IAxisDragGizmo } from \"./axisDragGizmo\";\r\nimport { AxisDragGizmo } from \"./axisDragGizmo\";\r\nimport type { IPlaneDragGizmo } from \"./planeDragGizmo\";\r\nimport { PlaneDragGizmo } from \"./planeDragGizmo\";\r\nimport { UtilityLayerRenderer } from \"../Rendering/utilityLayerRenderer\";\r\nimport type { PointerInfo } from \"../Events/pointerEvents\";\r\nimport type { GizmoManager } from \"./gizmoManager\";\r\nimport type { TransformNode } from \"../Meshes/transformNode\";\r\n\r\n/**\r\n * Interface for position gizmo\r\n */\r\nexport interface IPositionGizmo extends IGizmo {\r\n /** Internal gizmo used for interactions on the x axis */\r\n xGizmo: IAxisDragGizmo;\r\n /** Internal gizmo used for interactions on the y axis */\r\n yGizmo: IAxisDragGizmo;\r\n /** Internal gizmo used for interactions on the z axis */\r\n zGizmo: IAxisDragGizmo;\r\n /** Internal gizmo used for interactions on the yz plane */\r\n xPlaneGizmo: IPlaneDragGizmo;\r\n /** Internal gizmo used for interactions on the xz plane */\r\n yPlaneGizmo: IPlaneDragGizmo;\r\n /** Internal gizmo used for interactions on the xy plane */\r\n zPlaneGizmo: IPlaneDragGizmo;\r\n /** True when the mouse pointer is dragging a gizmo mesh */\r\n readonly isDragging: boolean;\r\n /** Fires an event when any of it's sub gizmos are dragged */\r\n onDragStartObservable: Observable<unknown>;\r\n /** Fires an event when any of it's sub gizmos are being dragged */\r\n onDragObservable: Observable<unknown>;\r\n /** Fires an event when any of it's sub gizmos are released from dragging */\r\n onDragEndObservable: Observable<unknown>;\r\n /**\r\n * If the planar drag gizmo is enabled\r\n * setting this will enable/disable XY, XZ and YZ planes regardless of individual gizmo settings.\r\n */\r\n planarGizmoEnabled: boolean;\r\n /** Drag distance in babylon units that the gizmo will snap to when dragged */\r\n snapDistance: number;\r\n /**\r\n * Builds Gizmo Axis Cache to enable features such as hover state preservation and graying out other axis during manipulation\r\n * @param mesh Axis gizmo mesh\r\n * @param cache Gizmo axis definition used for reactive gizmo UI\r\n */\r\n addToAxisCache(mesh: Mesh, cache: GizmoAxisCache): void;\r\n /**\r\n * Force release the drag action by code\r\n */\r\n releaseDrag(): void;\r\n}\r\n\r\n/**\r\n * Additional options for the position gizmo\r\n */\r\nexport interface PositionGizmoOptions {\r\n /**\r\n * Additional transform applied to the gizmo.\r\n * @See Gizmo.additionalTransformNode for more detail\r\n */\r\n additionalTransformNode?: TransformNode;\r\n}\r\n\r\n/**\r\n * Gizmo that enables dragging a mesh along 3 axis\r\n */\r\nexport class PositionGizmo extends Gizmo implements IPositionGizmo {\r\n /**\r\n * Internal gizmo used for interactions on the x axis\r\n */\r\n public xGizmo: IAxisDragGizmo;\r\n /**\r\n * Internal gizmo used for interactions on the y axis\r\n */\r\n public yGizmo: IAxisDragGizmo;\r\n /**\r\n * Internal gizmo used for interactions on the z axis\r\n */\r\n public zGizmo: IAxisDragGizmo;\r\n /**\r\n * Internal gizmo used for interactions on the yz plane\r\n */\r\n public xPlaneGizmo: IPlaneDragGizmo;\r\n /**\r\n * Internal gizmo used for interactions on the xz plane\r\n */\r\n public yPlaneGizmo: IPlaneDragGizmo;\r\n /**\r\n * Internal gizmo used for interactions on the xy plane\r\n */\r\n public zPlaneGizmo: IPlaneDragGizmo;\r\n\r\n /**\r\n * protected variables\r\n */\r\n protected _meshAttached: Nullable<AbstractMesh> = null;\r\n protected _nodeAttached: Nullable<Node> = null;\r\n protected _snapDistance: number;\r\n protected _observables: Observer<PointerInfo>[] = [];\r\n\r\n /** Node Caching for quick lookup */\r\n protected _gizmoAxisCache: Map<Mesh, GizmoAxisCache> = new Map();\r\n\r\n /** Fires an event when any of it's sub gizmos are dragged */\r\n public onDragStartObservable = new Observable();\r\n /** Fires an event when any of it's sub gizmos are being dragged */\r\n public onDragObservable = new Observable();\r\n /** Fires an event when any of it's sub gizmos are released from dragging */\r\n public onDragEndObservable = new Observable();\r\n\r\n /**\r\n * If set to true, planar drag is enabled\r\n */\r\n protected _planarGizmoEnabled = false;\r\n\r\n public override get attachedMesh() {\r\n return this._meshAttached;\r\n }\r\n public override set attachedMesh(mesh: Nullable<AbstractMesh>) {\r\n this._meshAttached = mesh;\r\n this._nodeAttached = mesh;\r\n [this.xGizmo, this.yGizmo, this.zGizmo, this.xPlaneGizmo, this.yPlaneGizmo, this.zPlaneGizmo].forEach((gizmo) => {\r\n if (gizmo.isEnabled) {\r\n gizmo.attachedMesh = mesh;\r\n } else {\r\n gizmo.attachedMesh = null;\r\n }\r\n });\r\n }\r\n\r\n public override get attachedNode() {\r\n return this._nodeAttached;\r\n }\r\n public override set attachedNode(node: Nullable<Node>) {\r\n this._meshAttached = null;\r\n this._nodeAttached = node;\r\n [this.xGizmo, this.yGizmo, this.zGizmo, this.xPlaneGizmo, this.yPlaneGizmo, this.zPlaneGizmo].forEach((gizmo) => {\r\n if (gizmo.isEnabled) {\r\n gizmo.attachedNode = node;\r\n } else {\r\n gizmo.attachedNode = null;\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * True when the mouse pointer is hovering a gizmo mesh\r\n */\r\n public override get isHovered() {\r\n return this.xGizmo.isHovered || this.yGizmo.isHovered || this.zGizmo.isHovered || this.xPlaneGizmo.isHovered || this.yPlaneGizmo.isHovered || this.zPlaneGizmo.isHovered;\r\n }\r\n\r\n public get isDragging() {\r\n return (\r\n this.xGizmo.dragBehavior.dragging ||\r\n this.yGizmo.dragBehavior.dragging ||\r\n this.zGizmo.dragBehavior.dragging ||\r\n this.xPlaneGizmo.dragBehavior.dragging ||\r\n this.yPlaneGizmo.dragBehavior.dragging ||\r\n this.zPlaneGizmo.dragBehavior.dragging\r\n );\r\n }\r\n\r\n public override get additionalTransformNode() {\r\n return this._additionalTransformNode;\r\n }\r\n\r\n public override set additionalTransformNode(transformNode: TransformNode | undefined) {\r\n [this.xGizmo, this.yGizmo, this.zGizmo, this.xPlaneGizmo, this.yPlaneGizmo, this.zPlaneGizmo].forEach((gizmo) => {\r\n gizmo.additionalTransformNode = transformNode;\r\n });\r\n }\r\n\r\n /**\r\n * Creates a PositionGizmo\r\n * @param gizmoLayer The utility layer the gizmo will be added to\r\n * @param thickness display gizmo axis thickness\r\n * @param gizmoManager\r\n * @param options More options\r\n */\r\n constructor(gizmoLayer: UtilityLayerRenderer = UtilityLayerRenderer.DefaultUtilityLayer, thickness: number = 1, gizmoManager?: GizmoManager, options?: PositionGizmoOptions) {\r\n super(gizmoLayer);\r\n this.xGizmo = new AxisDragGizmo(new Vector3(1, 0, 0), Color3.Red().scale(0.5), gizmoLayer, this, thickness);\r\n this.yGizmo = new AxisDragGizmo(new Vector3(0, 1, 0), Color3.Green().scale(0.5), gizmoLayer, this, thickness);\r\n this.zGizmo = new AxisDragGizmo(new Vector3(0, 0, 1), Color3.Blue().scale(0.5), gizmoLayer, this, thickness);\r\n\r\n this.xPlaneGizmo = new PlaneDragGizmo(new Vector3(1, 0, 0), Color3.Red().scale(0.5), this.gizmoLayer, this);\r\n this.yPlaneGizmo = new PlaneDragGizmo(new Vector3(0, 1, 0), Color3.Green().scale(0.5), this.gizmoLayer, this);\r\n this.zPlaneGizmo = new PlaneDragGizmo(new Vector3(0, 0, 1), Color3.Blue().scale(0.5), this.gizmoLayer, this);\r\n\r\n this.additionalTransformNode = options?.additionalTransformNode;\r\n\r\n // Relay drag events\r\n [this.xGizmo, this.yGizmo, this.zGizmo, this.xPlaneGizmo, this.yPlaneGizmo, this.zPlaneGizmo].forEach((gizmo) => {\r\n gizmo.dragBehavior.onDragStartObservable.add(() => {\r\n this.onDragStartObservable.notifyObservers({});\r\n });\r\n gizmo.dragBehavior.onDragObservable.add(() => {\r\n this.onDragObservable.notifyObservers({});\r\n });\r\n gizmo.dragBehavior.onDragEndObservable.add(() => {\r\n this.onDragEndObservable.notifyObservers({});\r\n });\r\n });\r\n\r\n this.attachedMesh = null;\r\n\r\n if (gizmoManager) {\r\n gizmoManager.addToAxisCache(this._gizmoAxisCache);\r\n } else {\r\n // Only subscribe to pointer event if gizmoManager isnt\r\n Gizmo.GizmoAxisPointerObserver(gizmoLayer, this._gizmoAxisCache);\r\n }\r\n }\r\n\r\n /**\r\n * If the planar drag gizmo is enabled\r\n * setting this will enable/disable XY, XZ and YZ planes regardless of individual gizmo settings.\r\n */\r\n public set planarGizmoEnabled(value: boolean) {\r\n this._planarGizmoEnabled = value;\r\n [this.xPlaneGizmo, this.yPlaneGizmo, this.zPlaneGizmo].forEach((gizmo) => {\r\n if (gizmo) {\r\n gizmo.isEnabled = value;\r\n if (value) {\r\n if (gizmo.attachedMesh) {\r\n gizmo.attachedMesh = this.attachedMesh;\r\n } else {\r\n gizmo.attachedNode = this.attachedNode;\r\n }\r\n }\r\n }\r\n }, this);\r\n }\r\n public get planarGizmoEnabled(): boolean {\r\n return this._planarGizmoEnabled;\r\n }\r\n\r\n /**\r\n * posture that the gizmo will be display\r\n * When set null, default value will be used (Quaternion(0, 0, 0, 1))\r\n */\r\n public override get customRotationQuaternion(): Nullable<Quaternion> {\r\n return this._customRotationQuaternion;\r\n }\r\n\r\n public override set customRotationQuaternion(customRotationQuaternion: Nullable<Quaternion>) {\r\n this._customRotationQuaternion = customRotationQuaternion;\r\n [this.xGizmo, this.yGizmo, this.zGizmo, this.xPlaneGizmo, this.yPlaneGizmo, this.zPlaneGizmo].forEach((gizmo) => {\r\n if (gizmo) {\r\n gizmo.customRotationQuaternion = customRotationQuaternion;\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * If set the gizmo's rotation will be updated to match the attached mesh each frame (Default: true)\r\n * NOTE: This is only possible for meshes with uniform scaling, as otherwise it's not possible to decompose the rotation\r\n */\r\n public override set updateGizmoRotationToMatchAttachedMesh(value: boolean) {\r\n this._updateGizmoRotationToMatchAttachedMesh = value;\r\n [this.xGizmo, this.yGizmo, this.zGizmo, this.xPlaneGizmo, this.yPlaneGizmo, this.zPlaneGizmo].forEach((gizmo) => {\r\n if (gizmo) {\r\n gizmo.updateGizmoRotationToMatchAttachedMesh = value;\r\n }\r\n });\r\n }\r\n public override get updateGizmoRotationToMatchAttachedMesh() {\r\n return this._updateGizmoRotationToMatchAttachedMesh;\r\n }\r\n\r\n public override set updateGizmoPositionToMatchAttachedMesh(value: boolean) {\r\n this._updateGizmoPositionToMatchAttachedMesh = value;\r\n [this.xGizmo, this.yGizmo, this.zGizmo, this.xPlaneGizmo, this.yPlaneGizmo, this.zPlaneGizmo].forEach((gizmo) => {\r\n if (gizmo) {\r\n gizmo.updateGizmoPositionToMatchAttachedMesh = value;\r\n }\r\n });\r\n }\r\n public override get updateGizmoPositionToMatchAttachedMesh() {\r\n return this._updateGizmoPositionToMatchAttachedMesh;\r\n }\r\n\r\n public override set anchorPoint(value: GizmoAnchorPoint) {\r\n this._anchorPoint = value;\r\n [this.xGizmo, this.yGizmo, this.zGizmo, this.xPlaneGizmo, this.yPlaneGizmo, this.zPlaneGizmo].forEach((gizmo) => {\r\n gizmo.anchorPoint = value;\r\n });\r\n }\r\n public override get anchorPoint() {\r\n return this._anchorPoint;\r\n }\r\n\r\n /**\r\n * Set the coordinate system to use. By default it's local.\r\n * But it's possible for a user to tweak so its local for translation and world for rotation.\r\n * In that case, setting the coordinate system will change `updateGizmoRotationToMatchAttachedMesh` and `updateGizmoPositionToMatchAttachedMesh`\r\n */\r\n public override set coordinatesMode(coordinatesMode: GizmoCoordinatesMode) {\r\n [this.xGizmo, this.yGizmo, this.zGizmo, this.xPlaneGizmo, this.yPlaneGizmo, this.zPlaneGizmo].forEach((gizmo) => {\r\n gizmo.coordinatesMode = coordinatesMode;\r\n });\r\n }\r\n\r\n public override set updateScale(value: boolean) {\r\n if (this.xGizmo) {\r\n this.xGizmo.updateScale = value;\r\n this.yGizmo.updateScale = value;\r\n this.zGizmo.updateScale = value;\r\n }\r\n }\r\n public override get updateScale() {\r\n return this.xGizmo.updateScale;\r\n }\r\n /**\r\n * Drag distance in babylon units that the gizmo will snap to when dragged (Default: 0)\r\n */\r\n public set snapDistance(value: number) {\r\n this._snapDistance = value;\r\n [this.xGizmo, this.yGizmo, this.zGizmo, this.xPlaneGizmo, this.yPlaneGizmo, this.zPlaneGizmo].forEach((gizmo) => {\r\n if (gizmo) {\r\n gizmo.snapDistance = value;\r\n }\r\n });\r\n }\r\n public get snapDistance() {\r\n return this._snapDistance;\r\n }\r\n\r\n /**\r\n * Ratio for the scale of the gizmo (Default: 1)\r\n */\r\n public override set scaleRatio(value: number) {\r\n this._scaleRatio = value;\r\n [this.xGizmo, this.yGizmo, this.zGizmo, this.xPlaneGizmo, this.yPlaneGizmo, this.zPlaneGizmo].forEach((gizmo) => {\r\n if (gizmo) {\r\n gizmo.scaleRatio = value;\r\n }\r\n });\r\n }\r\n public override get scaleRatio() {\r\n return this._scaleRatio;\r\n }\r\n\r\n /**\r\n * Builds Gizmo Axis Cache to enable features such as hover state preservation and graying out other axis during manipulation\r\n * @param mesh Axis gizmo mesh\r\n * @param cache Gizmo axis definition used for reactive gizmo UI\r\n */\r\n public addToAxisCache(mesh: Mesh, cache: GizmoAxisCache) {\r\n this._gizmoAxisCache.set(mesh, cache);\r\n }\r\n /**\r\n * Force release the drag action by code\r\n */\r\n public releaseDrag() {\r\n this.xGizmo.dragBehavior.releaseDrag();\r\n this.yGizmo.dragBehavior.releaseDrag();\r\n this.zGizmo.dragBehavior.releaseDrag();\r\n this.xPlaneGizmo.dragBehavior.releaseDrag();\r\n this.yPlaneGizmo.dragBehavior.releaseDrag();\r\n this.zPlaneGizmo.dragBehavior.releaseDrag();\r\n }\r\n\r\n /**\r\n * Disposes of the gizmo\r\n */\r\n public override dispose() {\r\n [this.xGizmo, this.yGizmo, this.zGizmo, this.xPlaneGizmo, this.yPlaneGizmo, this.zPlaneGizmo].forEach((gizmo) => {\r\n if (gizmo) {\r\n gizmo.dispose();\r\n }\r\n });\r\n this._observables.forEach((obs) => {\r\n this.gizmoLayer.utilityLayerScene.onPointerObservable.remove(obs);\r\n });\r\n this.onDragStartObservable.clear();\r\n this.onDragObservable.clear();\r\n this.onDragEndObservable.clear();\r\n super.dispose();\r\n }\r\n\r\n /**\r\n * CustomMeshes are not supported by this gizmo\r\n */\r\n public override setCustomMesh() {\r\n Logger.Error(\r\n \"Custom meshes are not supported on this gizmo, please set the custom meshes on the gizmos contained within this one (gizmo.xGizmo, gizmo.yGizmo, gizmo.zGizmo,gizmo.xPlaneGizmo, gizmo.yPlaneGizmo, gizmo.zPlaneGizmo)\"\r\n );\r\n }\r\n}\r\n"]}
@@ -258,6 +258,7 @@ export class RotationGizmo extends Gizmo {
258
258
  this._observables.forEach((obs) => {
259
259
  this.gizmoLayer.utilityLayerScene.onPointerObservable.remove(obs);
260
260
  });
261
+ super.dispose();
261
262
  }
262
263
  /**
263
264
  * CustomMeshes are not supported by this gizmo