internal static void UpdateTangentsFromMode(MovieCurve curve)
 {
     for (int i = 0; i < curve.curve.length; i++)
     {
         TangentUtility.Internal_UpdateTangents(curve, i);
     }
 }
 internal static void UpdateTangentsFromModeSurrounding(MovieCurve curve, int index)
 {
     TangentUtility.Internal_UpdateTangents(curve, index - 2);
     TangentUtility.Internal_UpdateTangents(curve, index - 1);
     TangentUtility.Internal_UpdateTangents(curve, index);
     TangentUtility.Internal_UpdateTangents(curve, index + 1);
     TangentUtility.Internal_UpdateTangents(curve, index + 2);
 }
 public static void SetKeyBroken(MovieCurve curve, int index, bool broken)
 {
     if (curve == null)
     {
         throw new ArgumentNullException("curve");
     }
     if (index < 0 || index >= curve.curve.length)
     {
         throw new ArgumentException("Index out of bounds.");
     }
     TangentUtility.SetKeyBroken(ref curve, index, broken);
     // curve.curve.MoveKey(index, key);
     TangentUtility.UpdateTangentsFromModeSurrounding(curve, index);
 }
        private static void Internal_UpdateTangents(MovieCurve movieCurve, int index)
        {
            AnimationCurve curve = movieCurve.curve;

            if (index >= 0 && index < curve.length)
            {
                Keyframe key = curve[index];

                var leftTang  = TangentUtility.GetKeyLeftTangentMode(movieCurve, index);
                var rightTang = TangentUtility.GetKeyRightTangentMode(movieCurve, index);

                if (leftTang == TangentUtility.TangentMode.Linear && index >= 1)
                {
                    key.inTangent = TangentUtility.Internal_CalculateLinearTangent(curve, index, index - 1);
                    curve.MoveKey(index, key);
                }
                if (rightTang == TangentUtility.TangentMode.Linear && index + 1 < curve.length)
                {
                    key.outTangent = TangentUtility.Internal_CalculateLinearTangent(curve, index, index + 1);
                    curve.MoveKey(index, key);
                }
                // if (TangentUtility.GetKeyLeftTangentMode(key) == TangentUtility.TangentMode.ClampedAuto || TangentUtility.GetKeyRightTangentMode(key) == TangentUtility.TangentMode.ClampedAuto)
                // {
                //     TangentUtility.Internal_CalculateAutoTangent(curve, index);
                // }
                if (leftTang == TangentUtility.TangentMode.Auto || rightTang == TangentUtility.TangentMode.Auto)
                {
                    curve.SmoothTangents(index, 0f);
                }
                if (leftTang == TangentUtility.TangentMode.Free && rightTang == TangentUtility.TangentMode.Free && !TangentUtility.GetKeyBroken(movieCurve, index))
                {
                    key.outTangent = key.inTangent;
                    curve.MoveKey(index, key);
                }
                if (leftTang == TangentUtility.TangentMode.Constant)
                {
                    key.inTangent = float.PositiveInfinity;
                    curve.MoveKey(index, key);
                }
                if (rightTang == TangentUtility.TangentMode.Constant)
                {
                    key.outTangent = float.PositiveInfinity;
                    curve.MoveKey(index, key);
                }
            }
        }
 public static void SetKeyRightTangentMode(MovieCurve curve, int index, TangentUtility.TangentMode tangentMode)
 {
     if (curve == null)
     {
         throw new ArgumentNullException("curve");
     }
     if (index < 0 || index >= curve.curve.length)
     {
         throw new ArgumentException("Index out of bounds.");
     }
     if (tangentMode != TangentUtility.TangentMode.Free)
     {
         TangentUtility.SetKeyBroken(curve, index, true);
     }
     TangentUtility.SetKeyRightTangentMode(ref curve, index, tangentMode);
     // curve.MoveKey(index, key);
     TangentUtility.UpdateTangentsFromModeSurrounding(curve, index);
 }