Просмотр исходного кода

Various minor animation editor fixes and tweaks

BearishSun 9 лет назад
Родитель
Сommit
21c0c6c6ea

+ 11 - 4
Source/MBansheeEditor/Windows/Animation/GUIAnimFieldDisplay.cs

@@ -70,6 +70,9 @@ namespace BansheeEditor
 
         public void SetDisplayValues(GUIAnimFieldPathValue[] values)
         {
+            for(int i = 0; i < values.Length; i++)
+                Debug.Log(i + ". " + values[i].value);
+
             for (int i = 0; i < fields.Length; i++)
             {
                 string path = fields[i].Path;
@@ -144,7 +147,7 @@ namespace BansheeEditor
             layouts.main.AddSpace(5);
             layouts.underlay.AddSpace(5);
             layouts.overlay.AddSpace(5);
-            layouts.background.AddSpace(5);
+            layouts.background.AddSpace(3); // Minor hack: Background starts heigher to get it to center better
 
             fields = new GUIAnimFieldEntry[fieldInfos.Count];
             for (int i = 0; i < fieldInfos.Count; i++)
@@ -235,14 +238,14 @@ namespace BansheeEditor
 
         public string Path { get { return path; } }
 
-        public GUIAnimFieldEntry(GUIAnimFieldLayouts layouts, string path, bool shortName)
+        public GUIAnimFieldEntry(GUIAnimFieldLayouts layouts, string path, bool child)
         {
             this.path = path;
 
             GUILayoutX toggleLayout = layouts.main.AddLayoutX();
-            toggleLayout.AddSpace(15);
+            toggleLayout.AddSpace(child ? 30 : 15);
 
-            selectionBtn = new GUIButton(GetDisplayName(path, shortName), EditorStyles.Label, GUIOption.FlexibleWidth());
+            selectionBtn = new GUIButton(GetDisplayName(path, child), EditorStyles.Label, GUIOption.FlexibleWidth());
             selectionBtn.OnClick += () =>
             {
                 OnEntrySelected?.Invoke(path);
@@ -453,9 +456,13 @@ namespace BansheeEditor
         {
             foldout = new GUIToggle("", EditorStyles.Expand);
             foldout.OnToggled += Toggle;
+
+            GUILabel spacer = new GUILabel("", GUIOption.FixedHeight(GetEntryHeight()));
+
             foldoutLayout = layouts.overlay.AddLayoutX();
 
             foldoutLayout.AddElement(foldout);
+            foldoutLayout.AddElement(spacer);
             foldoutLayout.AddFlexibleSpace();
 
             underlaySpacing = new GUILabel("", GUIOption.FixedHeight(GetEntryHeight()));

+ 26 - 1
Source/MBansheeEditor/Windows/Animation/GUICurveEditor.cs

@@ -248,7 +248,7 @@ namespace BansheeEditor
 
             keyframeContextMenu = new ContextMenu();
             keyframeContextMenu.AddItem("Delete", DeleteSelectedKeyframes);
-            keyframeContextMenu.AddItem("Delete", EditSelectedKeyframe);
+            keyframeContextMenu.AddItem("Edit", EditSelectedKeyframe);
             keyframeContextMenu.AddItem("Tangents/Auto", () => { ChangeSelectionTangentMode(TangentMode.Auto); });
             keyframeContextMenu.AddItem("Tangents/Free", () => { ChangeSelectionTangentMode(TangentMode.Free); });
             keyframeContextMenu.AddItem("Tangents/In/Auto", () => { ChangeSelectionTangentMode(TangentMode.InAuto); });
@@ -731,6 +731,8 @@ namespace BansheeEditor
                     curve.Apply();
                 }
             }
+            else
+                ShowReadOnlyMessage();
 
             // TODO - UNDOREDO
 
@@ -796,7 +798,10 @@ namespace BansheeEditor
         private void ChangeSelectionTangentMode(TangentMode mode)
         {
             if (disableCurveEdit)
+            {
+                ShowReadOnlyMessage();
                 return;
+            }
 
             foreach (var selectedEntry in selectedKeyframes)
             {
@@ -863,6 +868,8 @@ namespace BansheeEditor
                         curve.Apply();
                     }
                 }
+                else
+                    ShowReadOnlyMessage();
 
                 // TODO - UNDOREDO
 
@@ -920,6 +927,8 @@ namespace BansheeEditor
                     curve.Apply();
                 }
             }
+            else
+                ShowReadOnlyMessage();
 
             // TODO - UNDOREDO
 
@@ -1021,7 +1030,10 @@ namespace BansheeEditor
         private void EditSelectedKeyframe()
         {
             if (disableCurveEdit)
+            {
+                ShowReadOnlyMessage();
                 return;
+            }
 
             if (selectedKeyframes.Count == 0)
                 return;
@@ -1094,6 +1106,19 @@ namespace BansheeEditor
                 OnEventModified?.Invoke();
             });
         }
+
+        /// <summary>
+        /// Shows a dialog box that notifies the user that the animation clip is read only.
+        /// </summary>
+        private void ShowReadOnlyMessage()
+        {
+            LocEdString title = new LocEdString("Warning");
+            LocEdString message =
+                new LocEdString("You cannot edit keyframes on animation clips that" +
+                                " are imported from an external file.");
+
+            DialogBox.Open(title, message, DialogBox.Type.OK);
+        }
     }
 
     /// <summary>

+ 2 - 2
Source/MBansheeEditor/Windows/Animation/GUITimelineBase.cs

@@ -81,7 +81,7 @@ namespace BansheeEditor
         public float GetTimeForFrame(int frameIdx)
         {
             float range = GetRange();
-            int numFrames = (int)range * fps;
+            int numFrames = (int)(range * fps);
             float timePerFrame = range / numFrames;
 
             return frameIdx * timePerFrame;
@@ -180,7 +180,7 @@ namespace BansheeEditor
             if (markedFrameIdx != -1)
             {
                 float range = GetRange();
-                int numFrames = (int)range * fps;
+                int numFrames = (int)(range * fps);
                 float timePerFrame = range / numFrames;
 
                 DrawFrameMarker(markedFrameIdx * timePerFrame);

+ 52 - 52
Source/MBansheeEditor/Windows/AnimationWindow.cs

@@ -19,7 +19,7 @@ namespace BansheeEditor
     {
         private const int FIELD_DISPLAY_WIDTH = 300;
         private const int DRAG_START_DISTANCE = 3;
-        private const float DRAG_SCALE = 1.0f;
+        private const float DRAG_SCALE = 3.0f;
         private const float ZOOM_SCALE = 0.1f/120.0f; // One scroll step is usually 120 units, we want 1/10 of that
 
         private SceneObject selectedSO;
@@ -393,13 +393,16 @@ namespace BansheeEditor
             // Handle middle mouse dragging
             if (isDragInProgress)
             {
-                float dragX = Input.GetAxisValue(InputAxis.MouseX) * DRAG_SCALE;
-                float dragY = Input.GetAxisValue(InputAxis.MouseY) * DRAG_SCALE;
+                float lengthPerPixel = guiCurveEditor.Range.x / guiCurveEditor.Width;
+                float heightPerPixel = guiCurveEditor.Range.y / guiCurveEditor.Height;
+
+                float dragX = Input.GetAxisValue(InputAxis.MouseX) * DRAG_SCALE * lengthPerPixel;
+                float dragY = Input.GetAxisValue(InputAxis.MouseY) * DRAG_SCALE * heightPerPixel;
 
                 Vector2 offset = guiCurveEditor.Offset;
                 offset.x = Math.Max(0.0f, offset.x + dragX);
                 offset.y -= dragY;
-                
+
                 guiCurveEditor.Offset = offset;
                 UpdateScrollBarSize();
                 UpdateScrollBarPosition();
@@ -633,67 +636,64 @@ namespace BansheeEditor
 
             float time = guiCurveEditor.GetTimeForFrame(currentFrameIdx);
 
+            Debug.Log(currentFrameIdx + " - " + time);
+
             List<GUIAnimFieldPathValue> values = new List<GUIAnimFieldPathValue>();
             foreach (var kvp in clipInfo.curves)
             {
-                string suffix;
-                SerializableProperty property = Animation.FindProperty(selectedSO, kvp.Key, out suffix);
-                if (property != null)
-                {
-                    GUIAnimFieldPathValue fieldValue = new GUIAnimFieldPathValue();
-                    fieldValue.path = kvp.Key;
+                GUIAnimFieldPathValue fieldValue = new GUIAnimFieldPathValue();
+                fieldValue.path = kvp.Key;
 
-                    switch (kvp.Value.type)
-                    {
-                        case SerializableProperty.FieldType.Vector2:
-                            {
-                                Vector2 value = new Vector2();
+                switch (kvp.Value.type)
+                {
+                    case SerializableProperty.FieldType.Vector2:
+                        {
+                            Vector2 value = new Vector2();
 
-                                for (int i = 0; i < 2; i++)
-                                    value[i] = kvp.Value.curves[i].Evaluate(time, false);
+                            for (int i = 0; i < 2; i++)
+                                value[i] = kvp.Value.curves[i].Evaluate(time, false);
 
-                                fieldValue.value = value;
-                            }
-                            break;
-                        case SerializableProperty.FieldType.Vector3:
-                            {
-                                Vector3 value = new Vector3();
+                            fieldValue.value = value;
+                        }
+                        break;
+                    case SerializableProperty.FieldType.Vector3:
+                        {
+                            Vector3 value = new Vector3();
 
-                                for (int i = 0; i < 3; i++)
-                                    value[i] = kvp.Value.curves[i].Evaluate(time, false);
+                            for (int i = 0; i < 3; i++)
+                                value[i] = kvp.Value.curves[i].Evaluate(time, false);
 
-                                fieldValue.value = value;
-                            }
-                            break;
-                        case SerializableProperty.FieldType.Vector4:
-                            {
-                                Vector4 value = new Vector4();
-
-                                for (int i = 0; i < 4; i++)
-                                    value[i] = kvp.Value.curves[i].Evaluate(time, false);
+                            fieldValue.value = value;
+                        }
+                        break;
+                    case SerializableProperty.FieldType.Vector4:
+                        {
+                            Vector4 value = new Vector4();
 
-                                fieldValue.value = value;
-                            }
-                            break;
-                        case SerializableProperty.FieldType.Color:
-                            {
-                                Color value = new Color();
+                            for (int i = 0; i < 4; i++)
+                                value[i] = kvp.Value.curves[i].Evaluate(time, false);
 
-                                for (int i = 0; i < 4; i++)
-                                    value[i] = kvp.Value.curves[i].Evaluate(time, false);
+                            fieldValue.value = value;
+                        }
+                        break;
+                    case SerializableProperty.FieldType.Color:
+                        {
+                            Color value = new Color();
 
-                                fieldValue.value = value;
-                            }
-                            break;
-                        case SerializableProperty.FieldType.Bool:
-                        case SerializableProperty.FieldType.Int:
-                        case SerializableProperty.FieldType.Float:
-                            fieldValue.value = kvp.Value.curves[0].Evaluate(time, false); ;
-                            break;
-                    }
+                            for (int i = 0; i < 4; i++)
+                                value[i] = kvp.Value.curves[i].Evaluate(time, false);
 
-                    values.Add(fieldValue);
+                            fieldValue.value = value;
+                        }
+                        break;
+                    case SerializableProperty.FieldType.Bool:
+                    case SerializableProperty.FieldType.Int:
+                    case SerializableProperty.FieldType.Float:
+                        fieldValue.value = kvp.Value.curves[0].Evaluate(time, false); ;
+                        break;
                 }
+
+                values.Add(fieldValue);
             }
 
             guiFieldDisplay.SetDisplayValues(values.ToArray());