mirror of
https://github.com/tym1116/BH3.git
synced 2025-12-16 08:25:20 +01:00
198 lines
4.7 KiB
C#
198 lines
4.7 KiB
C#
using UnityEngine;
|
|
|
|
namespace CinemaDirector
|
|
{
|
|
public static class AnimationCurveHelper
|
|
{
|
|
public static int AddKey(AnimationCurve curve, Keyframe keyframe)
|
|
{
|
|
if (curve.length == 0)
|
|
{
|
|
return curve.AddKey(keyframe);
|
|
}
|
|
if (curve.length == 1)
|
|
{
|
|
Keyframe key = curve[0];
|
|
int num = curve.AddKey(keyframe);
|
|
switch (num)
|
|
{
|
|
case -1:
|
|
return 0;
|
|
case 0:
|
|
curve.MoveKey(1, key);
|
|
break;
|
|
default:
|
|
curve.MoveKey(0, key);
|
|
break;
|
|
}
|
|
return num;
|
|
}
|
|
Keyframe key2 = default(Keyframe);
|
|
Keyframe key3 = default(Keyframe);
|
|
for (int i = 0; i < curve.length - 1; i++)
|
|
{
|
|
Keyframe keyframe2 = curve[i];
|
|
Keyframe keyframe3 = curve[i + 1];
|
|
if (keyframe2.time < keyframe.time && keyframe.time < keyframe3.time)
|
|
{
|
|
key2 = keyframe2;
|
|
key3 = keyframe3;
|
|
}
|
|
}
|
|
int num2 = curve.AddKey(keyframe);
|
|
if (num2 > 0)
|
|
{
|
|
curve.MoveKey(num2 - 1, key2);
|
|
int tangentMode = curve[num2 - 1].tangentMode;
|
|
if (IsAuto(tangentMode))
|
|
{
|
|
curve.SmoothTangents(num2 - 1, 0f);
|
|
}
|
|
if (IsBroken(tangentMode) && IsRightLinear(tangentMode))
|
|
{
|
|
SetKeyRightLinear(curve, num2 - 1);
|
|
}
|
|
}
|
|
if (num2 < curve.length - 1)
|
|
{
|
|
curve.MoveKey(num2 + 1, key3);
|
|
int tangentMode2 = curve[num2 + 1].tangentMode;
|
|
if (IsAuto(tangentMode2))
|
|
{
|
|
curve.SmoothTangents(num2 + 1, 0f);
|
|
}
|
|
if (IsBroken(tangentMode2) && IsLeftLinear(tangentMode2))
|
|
{
|
|
SetKeyLeftLinear(curve, num2 + 1);
|
|
}
|
|
}
|
|
return num2;
|
|
}
|
|
|
|
public static int MoveKey(AnimationCurve curve, int index, Keyframe keyframe)
|
|
{
|
|
keyframe.tangentMode = curve[index].tangentMode;
|
|
int num = curve.MoveKey(index, keyframe);
|
|
if (IsAuto(keyframe.tangentMode))
|
|
{
|
|
curve.SmoothTangents(num, 0f);
|
|
}
|
|
else if (IsBroken(keyframe.tangentMode))
|
|
{
|
|
if (IsLeftLinear(keyframe.tangentMode))
|
|
{
|
|
SetKeyLeftLinear(curve, num);
|
|
}
|
|
if (IsRightLinear(keyframe.tangentMode))
|
|
{
|
|
SetKeyRightLinear(curve, num);
|
|
}
|
|
}
|
|
if (num > 0)
|
|
{
|
|
int tangentMode = curve[num - 1].tangentMode;
|
|
if (IsAuto(tangentMode))
|
|
{
|
|
curve.SmoothTangents(num - 1, 0f);
|
|
}
|
|
if (IsBroken(tangentMode) && IsRightLinear(tangentMode))
|
|
{
|
|
SetKeyRightLinear(curve, num - 1);
|
|
}
|
|
}
|
|
if (num < curve.length - 1)
|
|
{
|
|
int tangentMode2 = curve[num + 1].tangentMode;
|
|
if (IsAuto(tangentMode2))
|
|
{
|
|
curve.SmoothTangents(num + 1, 0f);
|
|
}
|
|
if (IsBroken(tangentMode2) && IsLeftLinear(tangentMode2))
|
|
{
|
|
SetKeyLeftLinear(curve, num + 1);
|
|
}
|
|
}
|
|
return num;
|
|
}
|
|
|
|
public static void RemoveKey(AnimationCurve curve, int index)
|
|
{
|
|
curve.RemoveKey(index);
|
|
if (index > 0)
|
|
{
|
|
int tangentMode = curve[index - 1].tangentMode;
|
|
if (IsAuto(tangentMode))
|
|
{
|
|
curve.SmoothTangents(index - 1, 0f);
|
|
}
|
|
if (IsBroken(tangentMode) && IsRightLinear(tangentMode))
|
|
{
|
|
SetKeyRightLinear(curve, index - 1);
|
|
}
|
|
}
|
|
if (index < curve.length)
|
|
{
|
|
int tangentMode2 = curve[index].tangentMode;
|
|
if (IsAuto(tangentMode2))
|
|
{
|
|
curve.SmoothTangents(index, 0f);
|
|
}
|
|
if (IsBroken(tangentMode2) && IsLeftLinear(tangentMode2))
|
|
{
|
|
SetKeyLeftLinear(curve, index);
|
|
}
|
|
}
|
|
}
|
|
|
|
public static void SetKeyRightLinear(AnimationCurve curve, int index)
|
|
{
|
|
Keyframe keyframe = curve[index];
|
|
float outTangent = keyframe.outTangent;
|
|
if (index < curve.length - 1)
|
|
{
|
|
Keyframe keyframe2 = curve[index + 1];
|
|
outTangent = (keyframe2.value - keyframe.value) / (keyframe2.time - keyframe.time);
|
|
}
|
|
Keyframe key = new Keyframe(keyframe.time, keyframe.value, keyframe.inTangent, outTangent);
|
|
int num = ((!IsAuto(keyframe.tangentMode) && keyframe.tangentMode != 0) ? (keyframe.tangentMode % 8 - 1) : 0);
|
|
key.tangentMode = num + 16 + 1;
|
|
curve.MoveKey(index, key);
|
|
}
|
|
|
|
public static void SetKeyLeftLinear(AnimationCurve curve, int index)
|
|
{
|
|
Keyframe keyframe = curve[index];
|
|
float inTangent = keyframe.inTangent;
|
|
if (index > 0)
|
|
{
|
|
Keyframe keyframe2 = curve[index - 1];
|
|
inTangent = (keyframe.value - keyframe2.value) / (keyframe.time - keyframe2.time);
|
|
}
|
|
Keyframe key = new Keyframe(keyframe.time, keyframe.value, inTangent, keyframe.outTangent);
|
|
int num = ((keyframe.tangentMode > 16) ? (keyframe.tangentMode / 8 * 8) : 0);
|
|
key.tangentMode = num + 1 + 4;
|
|
curve.MoveKey(index, key);
|
|
}
|
|
|
|
public static bool IsAuto(int tangentMode)
|
|
{
|
|
return tangentMode == 10;
|
|
}
|
|
|
|
public static bool IsBroken(int tangentMode)
|
|
{
|
|
return tangentMode % 2 == 1;
|
|
}
|
|
|
|
public static bool IsRightLinear(int tangentMode)
|
|
{
|
|
return tangentMode / 8 == 2;
|
|
}
|
|
|
|
public static bool IsLeftLinear(int tangentMode)
|
|
{
|
|
return IsBroken(tangentMode) && tangentMode % 8 == 5;
|
|
}
|
|
}
|
|
}
|