Răsfoiți Sursa

Handles now properly transform multiple objects

BearishSun 10 ani în urmă
părinte
comite
8235b055db
1 a modificat fișierele cu 223 adăugiri și 223 ștergeri
  1. 223 223
      MBansheeEditor/Scene/DefaultHandleManager.cs

+ 223 - 223
MBansheeEditor/Scene/DefaultHandleManager.cs

@@ -1,223 +1,223 @@
-using System.Collections.Generic;
-using BansheeEngine;
-
-namespace BansheeEditor
-{
-    /// <summary>
-    /// Manages the default set of built-in handles like move, rotate and scale. Handles switching between the three handle
-    /// types, as well as switching between coordinate and pivot modes, while tracking and updating active scene object
-    /// selection. Essentially it detects which handles need to be displayed and where, and then forwards the data
-    /// to the specific handle for processing.
-    /// </summary>
-    internal sealed class DefaultHandleManager : Handle
-    {
-        /// <summary>
-        /// Representation of a scene object currently being modified by a handle.
-        /// </summary>
-        private struct HandledObject
-        {
-            /// <summary>
-            /// Creates a new scene object representation by recording the current object transform.
-            /// </summary>
-            /// <param name="so">Scene object that is being modified by a handle.</param>
-            public HandledObject(SceneObject so)
-            {
-                this.so = so;
-                initialPosition = so.LocalPosition;
-                initialRotation = so.LocalRotation;
-                initialScale = so.LocalScale;
-            }
-
-            public SceneObject so;
-            public Vector3 initialPosition;
-            public Quaternion initialRotation;
-            public Vector3 initialScale;
-        }
-
-        private SceneViewTool activeHandleType = SceneViewTool.View;
-        private DefaultHandle activeHandle;
-
-        private HandledObject[] activeSelection;
-        private bool isDragged;
-        private Vector3 initialHandlePosition;
-        private Quaternion initialHandleRotation;
-
-        /// <inheritdoc/>
-        protected internal override void PreInput()
-        {
-            SceneObject[] selectedSceneObjects = Selection.SceneObjects;
-
-            if (selectedSceneObjects.Length == 0)
-            {
-                if (activeHandle != null)
-                {
-                    activeHandle.Destroy();
-                    activeHandle = null;
-                }
-            }
-            else
-            {
-                if (activeHandleType != EditorApplication.ActiveSceneTool || activeHandle == null)
-                {
-                    if (activeHandle != null)
-                    {
-                        activeHandle.Destroy();
-                        activeHandle = null;
-                    }
-
-                    switch (EditorApplication.ActiveSceneTool)
-                    {
-                        case SceneViewTool.Move:
-                            activeHandle = new MoveHandle();
-                            break;
-                        case SceneViewTool.Rotate:
-                            activeHandle = new RotateHandle();
-                            break;
-                        case SceneViewTool.Scale:
-                            activeHandle = new ScaleHandle();
-                            break;
-                    }
-
-                    activeHandleType = EditorApplication.ActiveSceneTool;
-                }
-            }
-
-            if (activeHandle != null)
-            {
-                Quaternion rotation;
-                if (EditorApplication.ActiveCoordinateMode == HandleCoordinateMode.World)
-                    rotation = Quaternion.Identity;
-                else
-                    rotation = selectedSceneObjects[0].Rotation; // We don't average rotation in case of multi-selection
-
-                Vector3 position;
-                if (EditorApplication.ActivePivotMode == HandlePivotMode.Pivot)
-                    position = selectedSceneObjects[0].Position; // Just take pivot from the first one, no averaging
-                else
-                {
-                    List<SceneObject> flatenedHierarchy = new List<SceneObject>();
-                    foreach (var so in selectedSceneObjects)
-                        flatenedHierarchy.AddRange(EditorUtility.FlattenHierarchy(so));
-
-                    AABox selectionBounds = EditorUtility.CalculateBounds(flatenedHierarchy.ToArray());
-                    position = selectionBounds.Center;
-                }
-
-                activeHandle.Position = position;
-                activeHandle.Rotation = rotation;
-
-                activeHandle.PreInput();
-            }
-        }
-
-        /// <inheritdoc/>
-        protected internal override void PostInput()
-        {
-            if (activeHandle != null)
-            {
-                if (activeHandle.IsDragged())
-                {
-                    if (!isDragged)
-                    {
-                        isDragged = true;
-
-                        SceneObject[] selectedSceneObjects = Selection.SceneObjects;
-                        activeSelection = new HandledObject[selectedSceneObjects.Length];
-                        for (int i = 0; i < selectedSceneObjects.Length; i++)
-                            activeSelection[i] = new HandledObject(selectedSceneObjects[0]);
-
-                        initialHandlePosition = activeHandle.Position;
-                        initialHandleRotation = activeHandle.Rotation;
-                    }
-                }
-                else
-                {
-                    isDragged = false;
-                    activeSelection = null;
-                }
-
-                activeHandle.PostInput();
-
-                if (activeHandle.IsDragged())
-                {
-                    switch (activeHandleType)
-                    {
-                        case SceneViewTool.Move:
-                            MoveHandle moveHandle = (MoveHandle) activeHandle;
-
-                            foreach (var selectedObj in activeSelection)
-                                selectedObj.so.LocalPosition = selectedObj.initialPosition + moveHandle.Delta;
-
-                            break;
-                        case SceneViewTool.Rotate:
-                        {
-                            RotateHandle rotateHandle = (RotateHandle) activeHandle;
-
-                            // Make sure we transform relative to the handle position
-                            SceneObject temporarySO = new SceneObject("Temp");
-                            temporarySO.Position = initialHandlePosition;
-                            temporarySO.LocalRotation = initialHandleRotation;
-
-                            SceneObject[] originalParents = new SceneObject[activeSelection.Length];
-                            for (int i = 0; i < activeSelection.Length; i++)
-                            {
-                                originalParents[i] = activeSelection[i].so.Parent;
-                                activeSelection[i].so.LocalPosition = activeSelection[i].initialPosition;
-                                activeSelection[i].so.LocalRotation = activeSelection[i].initialRotation;
-                                activeSelection[i].so.Parent = temporarySO;
-                            }
-
-                            temporarySO.LocalRotation *= rotateHandle.Delta;
-
-                            for (int i = 0; i < activeSelection.Length; i++)
-                                activeSelection[i].so.Parent = originalParents[i];
-
-                            temporarySO.Destroy();
-                        }
-                            break;
-                        case SceneViewTool.Scale:
-                        {
-                            ScaleHandle scaleHandle = (ScaleHandle) activeHandle;
-
-                            // Make sure we transform relative to the handle position
-                            SceneObject temporarySO = new SceneObject("Temp");
-                            temporarySO.Position = activeHandle.Position;
-
-                            SceneObject[] originalParents = new SceneObject[activeSelection.Length];
-                            for (int i = 0; i < activeSelection.Length; i++)
-                            {
-                                originalParents[i] = activeSelection[i].so.Parent;
-                                activeSelection[i].so.LocalPosition = activeSelection[i].initialPosition;
-                                activeSelection[i].so.LocalRotation = activeSelection[i].initialRotation;
-                                activeSelection[i].so.LocalScale = activeSelection[i].initialScale;
-                                activeSelection[i].so.Parent = temporarySO;
-                            }
-
-                            temporarySO.LocalScale += scaleHandle.Delta;
-
-                            for (int i = 0; i < activeSelection.Length; i++)
-                                activeSelection[i].so.Parent = originalParents[i];
-
-                            temporarySO.Destroy();
-                        }
-                            break;
-                    }
-
-                    EditorApplication.SetSceneDirty();
-                }
-            }
-            else
-            {
-                isDragged = false;
-                activeSelection = null;
-            }
-        }
-
-        /// <inheritdoc/>
-        protected internal override void Draw()
-        {
-            if (activeHandle != null)
-                activeHandle.Draw();
-        }
-    }
-}
+using System.Collections.Generic;
+using BansheeEngine;
+
+namespace BansheeEditor
+{
+    /// <summary>
+    /// Manages the default set of built-in handles like move, rotate and scale. Handles switching between the three handle
+    /// types, as well as switching between coordinate and pivot modes, while tracking and updating active scene object
+    /// selection. Essentially it detects which handles need to be displayed and where, and then forwards the data
+    /// to the specific handle for processing.
+    /// </summary>
+    internal sealed class DefaultHandleManager : Handle
+    {
+        /// <summary>
+        /// Representation of a scene object currently being modified by a handle.
+        /// </summary>
+        private struct HandledObject
+        {
+            /// <summary>
+            /// Creates a new scene object representation by recording the current object transform.
+            /// </summary>
+            /// <param name="so">Scene object that is being modified by a handle.</param>
+            public HandledObject(SceneObject so)
+            {
+                this.so = so;
+                initialPosition = so.LocalPosition;
+                initialRotation = so.LocalRotation;
+                initialScale = so.LocalScale;
+            }
+
+            public SceneObject so;
+            public Vector3 initialPosition;
+            public Quaternion initialRotation;
+            public Vector3 initialScale;
+        }
+
+        private SceneViewTool activeHandleType = SceneViewTool.View;
+        private DefaultHandle activeHandle;
+
+        private HandledObject[] activeSelection;
+        private bool isDragged;
+        private Vector3 initialHandlePosition;
+        private Quaternion initialHandleRotation;
+
+        /// <inheritdoc/>
+        protected internal override void PreInput()
+        {
+            SceneObject[] selectedSceneObjects = Selection.SceneObjects;
+
+            if (selectedSceneObjects.Length == 0)
+            {
+                if (activeHandle != null)
+                {
+                    activeHandle.Destroy();
+                    activeHandle = null;
+                }
+            }
+            else
+            {
+                if (activeHandleType != EditorApplication.ActiveSceneTool || activeHandle == null)
+                {
+                    if (activeHandle != null)
+                    {
+                        activeHandle.Destroy();
+                        activeHandle = null;
+                    }
+
+                    switch (EditorApplication.ActiveSceneTool)
+                    {
+                        case SceneViewTool.Move:
+                            activeHandle = new MoveHandle();
+                            break;
+                        case SceneViewTool.Rotate:
+                            activeHandle = new RotateHandle();
+                            break;
+                        case SceneViewTool.Scale:
+                            activeHandle = new ScaleHandle();
+                            break;
+                    }
+
+                    activeHandleType = EditorApplication.ActiveSceneTool;
+                }
+            }
+
+            if (activeHandle != null)
+            {
+                Quaternion rotation;
+                if (EditorApplication.ActiveCoordinateMode == HandleCoordinateMode.World)
+                    rotation = Quaternion.Identity;
+                else
+                    rotation = selectedSceneObjects[0].Rotation; // We don't average rotation in case of multi-selection
+
+                Vector3 position;
+                if (EditorApplication.ActivePivotMode == HandlePivotMode.Pivot)
+                    position = selectedSceneObjects[0].Position; // Just take pivot from the first one, no averaging
+                else
+                {
+                    List<SceneObject> flatenedHierarchy = new List<SceneObject>();
+                    foreach (var so in selectedSceneObjects)
+                        flatenedHierarchy.AddRange(EditorUtility.FlattenHierarchy(so));
+
+                    AABox selectionBounds = EditorUtility.CalculateBounds(flatenedHierarchy.ToArray());
+                    position = selectionBounds.Center;
+                }
+
+                activeHandle.Position = position;
+                activeHandle.Rotation = rotation;
+
+                activeHandle.PreInput();
+            }
+        }
+
+        /// <inheritdoc/>
+        protected internal override void PostInput()
+        {
+            if (activeHandle != null)
+            {
+                if (activeHandle.IsDragged())
+                {
+                    if (!isDragged)
+                    {
+                        isDragged = true;
+
+                        SceneObject[] selectedSceneObjects = Selection.SceneObjects;
+                        activeSelection = new HandledObject[selectedSceneObjects.Length];
+                        for (int i = 0; i < selectedSceneObjects.Length; i++)
+                            activeSelection[i] = new HandledObject(selectedSceneObjects[i]);
+
+                        initialHandlePosition = activeHandle.Position;
+                        initialHandleRotation = activeHandle.Rotation;
+                    }
+                }
+                else
+                {
+                    isDragged = false;
+                    activeSelection = null;
+                }
+
+                activeHandle.PostInput();
+
+                if (activeHandle.IsDragged())
+                {
+                    switch (activeHandleType)
+                    {
+                        case SceneViewTool.Move:
+                            MoveHandle moveHandle = (MoveHandle) activeHandle;
+
+                            foreach (var selectedObj in activeSelection)
+                                selectedObj.so.LocalPosition = selectedObj.initialPosition + moveHandle.Delta;
+
+                            break;
+                        case SceneViewTool.Rotate:
+                        {
+                            RotateHandle rotateHandle = (RotateHandle) activeHandle;
+
+                            // Make sure we transform relative to the handle position
+                            SceneObject temporarySO = new SceneObject("Temp");
+                            temporarySO.Position = initialHandlePosition;
+                            temporarySO.LocalRotation = initialHandleRotation;
+
+                            SceneObject[] originalParents = new SceneObject[activeSelection.Length];
+                            for (int i = 0; i < activeSelection.Length; i++)
+                            {
+                                originalParents[i] = activeSelection[i].so.Parent;
+                                activeSelection[i].so.LocalPosition = activeSelection[i].initialPosition;
+                                activeSelection[i].so.LocalRotation = activeSelection[i].initialRotation;
+                                activeSelection[i].so.Parent = temporarySO;
+                            }
+
+                            temporarySO.LocalRotation *= rotateHandle.Delta;
+
+                            for (int i = 0; i < activeSelection.Length; i++)
+                                activeSelection[i].so.Parent = originalParents[i];
+
+                            temporarySO.Destroy();
+                        }
+                            break;
+                        case SceneViewTool.Scale:
+                        {
+                            ScaleHandle scaleHandle = (ScaleHandle) activeHandle;
+
+                            // Make sure we transform relative to the handle position
+                            SceneObject temporarySO = new SceneObject("Temp");
+                            temporarySO.Position = activeHandle.Position;
+
+                            SceneObject[] originalParents = new SceneObject[activeSelection.Length];
+                            for (int i = 0; i < activeSelection.Length; i++)
+                            {
+                                originalParents[i] = activeSelection[i].so.Parent;
+                                activeSelection[i].so.LocalPosition = activeSelection[i].initialPosition;
+                                activeSelection[i].so.LocalRotation = activeSelection[i].initialRotation;
+                                activeSelection[i].so.LocalScale = activeSelection[i].initialScale;
+                                activeSelection[i].so.Parent = temporarySO;
+                            }
+
+                            temporarySO.LocalScale += scaleHandle.Delta;
+
+                            for (int i = 0; i < activeSelection.Length; i++)
+                                activeSelection[i].so.Parent = originalParents[i];
+
+                            temporarySO.Destroy();
+                        }
+                            break;
+                    }
+
+                    EditorApplication.SetSceneDirty();
+                }
+            }
+            else
+            {
+                isDragged = false;
+                activeSelection = null;
+            }
+        }
+
+        /// <inheritdoc/>
+        protected internal override void Draw()
+        {
+            if (activeHandle != null)
+                activeHandle.Draw();
+        }
+    }
+}