summaryrefslogtreecommitdiff
path: root/Runtime/Animation/AnimationClipUtility.cpp
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2019-08-14 22:50:43 +0800
committerchai <chaifix@163.com>2019-08-14 22:50:43 +0800
commit15740faf9fe9fe4be08965098bbf2947e096aeeb (patch)
treea730ec236656cc8cab5b13f088adfaed6bb218fb /Runtime/Animation/AnimationClipUtility.cpp
+Unity Runtime codeHEADmaster
Diffstat (limited to 'Runtime/Animation/AnimationClipUtility.cpp')
-rw-r--r--Runtime/Animation/AnimationClipUtility.cpp73
1 files changed, 73 insertions, 0 deletions
diff --git a/Runtime/Animation/AnimationClipUtility.cpp b/Runtime/Animation/AnimationClipUtility.cpp
new file mode 100644
index 0000000..7ea1963
--- /dev/null
+++ b/Runtime/Animation/AnimationClipUtility.cpp
@@ -0,0 +1,73 @@
+#include "UnityPrefix.h"
+#include "AnimationClipUtility.h"
+#include "AnimationClip.h"
+#include "AnimationCurveUtility.h"
+
+template <class T>
+void EnsureLoopFrameContinuity (AnimationCurveTpl<T>& curve) {}
+
+template <>
+void EnsureLoopFrameContinuity<Quaternionf> (AnimationCurveTpl<Quaternionf>& curve)
+{
+ EnsureQuaternionContinuityLoopFrame(curve);
+}
+
+template <class U, class T, typename A>
+void ClipAnimations (const std::vector<T, A>& curves, float startTime, float endTime, float sampleRate, bool duplicateLastFrame, std::vector<T, A>& destinationCurves)
+{
+ for (typename std::vector<T, A>::const_iterator it = curves.begin(); it != curves.end(); ++it)
+ {
+ T newCurve;
+ AssertMsg(it->curve.GetKeyCount() >= 2, "Key count: %d on curve %s", it->curve.GetKeyCount(), it->path.c_str());
+
+ if (ClipAnimationCurve (it->curve, newCurve.curve, startTime, endTime))
+ {
+ it->CopyWithoutCurve(newCurve);
+
+ newCurve.curve.SetPostInfinity(kClamp);
+ newCurve.curve.SetPreInfinity(kClamp);
+
+ if (duplicateLastFrame)
+ {
+ AddLoopingFrame(newCurve.curve, endTime - startTime + 1.0f/sampleRate);
+ EnsureLoopFrameContinuity(newCurve.curve);
+ }
+
+ AssertMsg(newCurve.curve.GetKeyCount() >= 2, "Key count: %d on curve %s", newCurve.curve.GetKeyCount(), it->path.c_str());
+
+ destinationCurves.push_back(newCurve);
+ }
+ }
+}
+
+void ClipAnimation (AnimationClip& sourceClip, AnimationClip& destinationClip, float startTimeSeconds, float endTimeSeconds, bool duplicateLastFrame)
+{
+ if (startTimeSeconds > endTimeSeconds)
+ std::swap(endTimeSeconds, startTimeSeconds);
+
+ ClipAnimations<Quaternionf>(sourceClip.GetRotationCurves(), startTimeSeconds, endTimeSeconds, sourceClip.GetSampleRate(), duplicateLastFrame, destinationClip.GetRotationCurves());
+ ClipAnimations<Vector3f>(sourceClip.GetPositionCurves(), startTimeSeconds, endTimeSeconds, sourceClip.GetSampleRate(), duplicateLastFrame, destinationClip.GetPositionCurves());
+ ClipAnimations<Vector3f>(sourceClip.GetScaleCurves(), startTimeSeconds, endTimeSeconds, sourceClip.GetSampleRate(), duplicateLastFrame, destinationClip.GetScaleCurves());
+ ClipAnimations<float>(sourceClip.GetFloatCurves(), startTimeSeconds, endTimeSeconds, sourceClip.GetSampleRate(), duplicateLastFrame, destinationClip.GetFloatCurves());
+#if UNITY_EDITOR
+ ClipAnimations<float>(sourceClip.GetEditorCurvesNoConversion(), startTimeSeconds, endTimeSeconds, sourceClip.GetSampleRate(), duplicateLastFrame, destinationClip.GetEditorCurvesNoConversion());
+ AssertIf(sourceClip.GetEditorCurvesNoConversion().size() < destinationClip.GetEditorCurvesNoConversion().size());
+#endif // #if UNITY_EDITOR
+
+ AssertIf(sourceClip.GetRotationCurves().size() < destinationClip.GetRotationCurves().size());
+ AssertIf(sourceClip.GetPositionCurves().size() < destinationClip.GetPositionCurves().size());
+ AssertIf(sourceClip.GetScaleCurves().size() < destinationClip.GetScaleCurves().size());
+ AssertIf(sourceClip.GetFloatCurves().size() < destinationClip.GetFloatCurves().size());
+}
+
+
+void CopyAnimation (AnimationClip& sourceClip, AnimationClip& destinationClip)
+{
+ destinationClip.GetRotationCurves() = sourceClip.GetRotationCurves();
+ destinationClip.GetPositionCurves() = sourceClip.GetPositionCurves();
+ destinationClip.GetScaleCurves() = sourceClip.GetScaleCurves();
+ destinationClip.GetFloatCurves() = sourceClip.GetFloatCurves();
+#if UNITY_EDITOR
+ destinationClip.GetEditorCurvesNoConversion() = sourceClip.GetEditorCurvesNoConversion();
+#endif // #if UNITY_EDITOR
+}