Code Example
<strong>Code Example 1</strong>
Khởi tạo và kiểm tra các khung liên tục giống nhau
Input: Chuỗi frames [1, 2, 3, 4, 5] với các khung có giá trị không thay đổi. Output: Xóa các khung không quan trọng từ frames.
Functionality
- Check All No Change Frames: Kiểm tra và lưu trữ các đoạn frames không thay đổi.
- Clear All No Change: Xóa các đoạn frames không quan trọng từ curves.
- Update Curve Binding: Cập nhật curves tương ứng với các khung được giữ nguyên.
Code Example 2
<strong>Code Example 2</strong>
Xử lý curves và khung với các tham số mới
Input: Chuỗi frames [A, B, C, D, E] với các khung có giá trị thay đổi. Output: Giữ nguyên các khung thay đổi và xóa các khung không thay đổi.
Codes
<strong>Codes</strong>
Utility Class
<strong>Utility Class</strong>
TrimFloat2:
public static float TrimFloat2(float f1)
{
int i = (int)(f1 * 100);
float result = i / 100.0f;
return result;
}
TrimFloat4:
public static float TrimFloat4(float f1)
{
int i = (int)(f1 * 10000);
float result = i / 10000.0f;
return result;
}
IsFrameNoChange:
public static bool IsFrameNoChange(Keyframe kf1, Keyframe kf2)
{
if (Utils.IsFloatEquals(kf1.value, kf2.value))
{
if (kf1.outTangent == 0 && kf2.inTangent == 0)
{
return true;
}
if (float.IsInfinity(kf1.outTangent) || float.IsInfinity(kf2.inTangent))
{
return true;
}
}
return false;
}
CheckNoChangeFrames:
public static void CheckNoChangeFrames(AnimationCurve curve, EditorCurveBinding binding, List<int> outList)
{
int index1 = -1;
var keys = curve.keys;
for (int i = 0; i < keys.Length - 1; ++i)
{
var kf1 = keys[i];
var kf2 = keys[i + 1];
if (-1 == index1)
{
if (IsFrameNoChange(kf1, kf2))
{
index1 = i;
}
}
else
{
if (!IsFrameNoChange(kf1, kf2))
{
int deltaFrame = i - index1;
if (deltaFrame <= 1)
{
// adjacent frames are ignored
}
else
{
outList.Add(index1);
outList.Add(i);
}
index1 = -1;
}
}
}
if (-1 != index1)
{
outList.Add(index1);
outList.Add(keys.Length - 1);
}
}