فهرست منبع

Bugfix: Properly save euler rotation values with editor's animation curve data

BearishSun 6 سال پیش
والد
کامیت
86ac8bc509
1فایلهای تغییر یافته به همراه39 افزوده شده و 9 حذف شده
  1. 39 9
      Source/EditorManaged/Windows/Animation/EditorAnimInfo.cs

+ 39 - 9
Source/EditorManaged/Windows/Animation/EditorAnimInfo.cs

@@ -56,13 +56,29 @@ namespace bs.Editor
         public EditorFloatCurveTangents[] floatCurves;
     }
 
+    /// <summary>
+    /// Contains a version of <see cref="NamedVector3Curve"/> that can be serialized from the editor.
+    /// </summary>
+    [SerializeObject]
+    internal struct EditorNamedVector3Curve
+    {
+        /// <summary>Name of the curve.</summary>
+        public string name;
+
+        /// <summary>Flags that describe the animation curve.</summary>
+        public AnimationCurveFlags flags;
+
+        /// <summary> Curve keyframes. </summary>
+        public KeyFrameVec3[] keyFrames;
+    }
+
     /// <summary>
     /// Contains editor-only data for a specific <see cref="AnimationClip"/>.
     /// </summary>
     [SerializeObject]
     internal class EditorAnimClipData
     {
-        public NamedVector3Curve[] eulerCurves;
+        public EditorNamedVector3Curve[] eulerCurves;
         public EditorAnimClipTangents tangents;
     }
 
@@ -196,21 +212,31 @@ namespace bs.Editor
             };
 
             NamedQuaternionCurve[] rotationCurves = clipCurves.Rotation;
+            NamedVector3Curve[] eulerRotationCurves = new NamedVector3Curve[rotationCurves.Length];
             if (editorClipData.eulerCurves == null || editorClipData.eulerCurves.Length != rotationCurves.Length)
             {
                 // Convert rotation from quaternion to euler if we don't have original euler animation data stored. 
-                editorClipData.eulerCurves = new NamedVector3Curve[rotationCurves.Length];
                 for (int i = 0; i < rotationCurves.Length; i++)
                 {
-                    editorClipData.eulerCurves[i] = new NamedVector3Curve();
-                    editorClipData.eulerCurves[i].name = rotationCurves[i].name;
-                    editorClipData.eulerCurves[i].flags = rotationCurves[i].flags;
-                    editorClipData.eulerCurves[i].curve = AnimationUtility.QuaternionToEulerCurve(rotationCurves[i].curve);
+                    NamedQuaternionCurve quatCurve = rotationCurves[i];
+                    Vector3Curve eulerCurve = AnimationUtility.QuaternionToEulerCurve(quatCurve.curve);
+
+                    eulerRotationCurves[i] = new NamedVector3Curve(quatCurve.name, quatCurve.flags, eulerCurve);
+                }
+            }
+            else
+            {
+                for (int i = 0; i < editorClipData.eulerCurves.Length; i++)
+                {
+                    EditorNamedVector3Curve edCurve = editorClipData.eulerCurves[i];
+
+                    eulerRotationCurves[i] = new NamedVector3Curve(
+                        edCurve.name, edCurve.flags, new Vector3Curve(edCurve.keyFrames));
                 }
             }
 
             lLoadVector3Curve(clipCurves.Position, editorClipData.tangents.positionCurves, "/Position");
-            lLoadVector3Curve(editorClipData.eulerCurves, editorClipData.tangents.rotationCurves, "/Rotation");
+            lLoadVector3Curve(eulerRotationCurves, editorClipData.tangents.rotationCurves, "/Rotation");
             lLoadVector3Curve(clipCurves.Scale, editorClipData.tangents.scaleCurves, "/Scale");
 
             // Find which individual float curves belong to the same field
@@ -393,7 +419,7 @@ namespace bs.Editor
             List<EditorVector3CurveTangents> rotationTangents = new List<EditorVector3CurveTangents>();
             List<EditorVector3CurveTangents> scaleTangents = new List<EditorVector3CurveTangents>();
             List<EditorFloatCurveTangents> floatTangents = new List<EditorFloatCurveTangents>();
-            List<NamedVector3Curve> eulerRotationCurves = new List<NamedVector3Curve>();
+            List<EditorNamedVector3Curve> eulerRotationCurves = new List<EditorNamedVector3Curve>();
 
             foreach (var kvp in curves)
             {
@@ -440,8 +466,12 @@ namespace bs.Editor
                         quatCurve.name = curve.name;
                         quatCurve.curve = AnimationUtility.EulerToQuaternionCurve(curve.curve);
 
+                        EditorNamedVector3Curve edEulerCurve = new EditorNamedVector3Curve();
+                        edEulerCurve.name = curve.name;
+                        edEulerCurve.keyFrames = curve.curve.KeyFrames;
+
                         rotationCurves.Add(quatCurve);
-                        eulerRotationCurves.Add(curve);
+                        eulerRotationCurves.Add(edEulerCurve);
                         rotationTangents.Add(curveTangents);
                     }
                     else if (lastEntry == "Scale")