summaryrefslogtreecommitdiff
path: root/Runtime/Animation/AnimationClip.h
diff options
context:
space:
mode:
Diffstat (limited to 'Runtime/Animation/AnimationClip.h')
-rw-r--r--Runtime/Animation/AnimationClip.h346
1 files changed, 346 insertions, 0 deletions
diff --git a/Runtime/Animation/AnimationClip.h b/Runtime/Animation/AnimationClip.h
new file mode 100644
index 0000000..1c4c1c2
--- /dev/null
+++ b/Runtime/Animation/AnimationClip.h
@@ -0,0 +1,346 @@
+#ifndef ANIMATIONCLIP_H
+#define ANIMATIONCLIP_H
+
+#include "Runtime/BaseClasses/NamedObject.h"
+#include "Runtime/Serialize/SerializeTraits.h"
+#include "Runtime/Utilities/LinkedList.h"
+#include "Runtime/Math/Quaternion.h"
+#include "Runtime/Math/Vector2.h"
+#include "Runtime/Geometry/AABB.h"
+#include "Runtime/Math/AnimationCurve.h"
+#include "AnimationEvent.h"
+#include "Runtime/Mono/MonoScript.h"
+#include "Runtime/mecanim/memory.h"
+#include "AnimationClipBindings.h"
+#include "PPtrKeyframes.h"
+
+#include "Motion.h"
+
+#if UNITY_EDITOR
+#include "AnimationClipSettings.h"
+#endif
+
+namespace mecanim
+{
+ namespace animation
+ {
+ struct ClipMuscleConstant;
+ struct ClipMuscleInput;
+ }
+}
+
+struct AnimationClipStats;
+
+namespace Unity { class GameObject; }
+using namespace Unity;
+
+class BaseAnimationTrack;
+class NewAnimationTrack;
+class MonoScript;
+class Animation;
+class AnimationState;
+class CompressedAnimationCurve;
+
+/*
+ TODO:
+ * We currently don't handle double cover operator automatically for rotation curves
+ * We are not synchronizing animation state cached range correctly
+ * GetCurve is not implemented yet
+*/
+
+class AnimationClip : public Motion
+{
+public:
+ struct QuaternionCurve
+ {
+ UnityStr path;
+ AnimationCurveQuat curve;
+ int hash;
+
+ QuaternionCurve () { hash = 0; }
+ void CopyWithoutCurve(QuaternionCurve& other) const
+ {
+ other.path = path;
+ other.hash = hash;
+ }
+
+ DECLARE_SERIALIZE (QuaternionCurve)
+ };
+
+ struct Vector3Curve
+ {
+ UnityStr path;
+ AnimationCurveVec3 curve;
+ int hash;
+
+ Vector3Curve () { hash = 0; }
+ void CopyWithoutCurve(Vector3Curve& other) const
+ {
+ other.path = path;
+ other.hash = hash;
+ }
+
+ DECLARE_SERIALIZE (Vector3Curve)
+ };
+
+public:
+
+
+ struct PPtrCurve
+ {
+ UnityStr path;
+ UnityStr attribute;
+ int classID;
+ MonoScriptPPtr script;
+ PPtrKeyframes curve;
+
+ PPtrCurve () { }
+
+ DECLARE_SERIALIZE (PPtrCurve)
+ };
+
+ struct FloatCurve
+ {
+ UnityStr path;
+ UnityStr attribute;
+ int classID;
+ MonoScriptPPtr script;
+ AnimationCurve curve;
+ int hash;
+
+ FloatCurve () { hash = 0; }
+ void CopyWithoutCurve(FloatCurve& other) const
+ {
+ other.path = path;
+ other.attribute = attribute;
+ other.classID = classID;
+ other.script = script;
+ other.hash = hash;
+ }
+
+ DECLARE_SERIALIZE (FloatCurve)
+ };
+
+ typedef UNITY_VECTOR(kMemAnimation, QuaternionCurve) QuaternionCurves;
+ typedef UNITY_VECTOR(kMemAnimation, CompressedAnimationCurve) CompressedQuaternionCurves;
+ typedef UNITY_VECTOR(kMemAnimation, Vector3Curve) Vector3Curves;
+ typedef UNITY_VECTOR(kMemAnimation, FloatCurve) FloatCurves;
+ typedef UNITY_VECTOR(kMemAnimation, PPtrCurve) PPtrCurves;
+ typedef UNITY_VECTOR(kMemAnimation, AnimationEvent) Events;
+
+ enum AnimationType
+ {
+ kLegacy = 1,
+ kGeneric = 2,
+ kHumanoid = 3
+ };
+
+
+
+ REGISTER_DERIVED_CLASS (AnimationClip, Motion)
+ DECLARE_OBJECT_SERIALIZE (AnimationClip)
+
+ static void InitializeClass ();
+ static void CleanupClass () { }
+
+ AnimationClip (MemLabelId label, ObjectCreationMode mode);
+ // virtual ~AnimationClip(); declared-by-macro
+
+ virtual void AwakeFromLoad(AwakeFromLoadMode mode);
+ virtual void CheckConsistency();
+
+
+ /// Assigns curve to the curve defined by path, classID and attribute
+ /// If curve is null the exisiting curve will be removed.
+ void SetCurve (const std::string& path, int classID, MonoScriptPPtr script, const std::string& attribute, AnimationCurve* curve, bool syncEditorCurves);
+ bool GetCurve (const std::string& path, int classID, MonoScriptPPtr script, const std::string& attribute, AnimationCurve* outCurve);
+
+ void ClearCurves ();
+ void EnsureQuaternionContinuity ();
+
+ bool HasAnimationEvents ();
+ void FireAnimationEvents (float lastTime, float now, Unity::Component& source);
+
+ #if UNITY_EDITOR
+ void SetEditorCurve (const std::string& path, int classID, MonoScriptPPtr script, const std::string& attribute, const AnimationCurve* curve, bool syncEditorCurves = true);
+ bool GetEditorCurve (const std::string& path, int classID, MonoScriptPPtr script, const std::string& attribute, AnimationCurve* outCurve);
+ FloatCurves& GetEditorCurvesSync();
+
+ void SetEditorPPtrCurve (const std::string& path, int classID, MonoScriptPPtr script, const std::string& attribute, PPtrKeyframes* keyframes);
+ bool GetEditorPPtrCurve (const std::string& path, int classID, MonoScriptPPtr script, const std::string& attribute, PPtrKeyframes* outKeyframes);
+ PPtrCurves& GetEditorPPtrCurves() { return m_PPtrCurves; }
+
+ // Callback for telling animation window when an animclip got reloaded
+ typedef void OnAnimationClipAwake(AnimationClip* clip);
+ static void SetOnAnimationClipAwake (OnAnimationClipAwake *callback);
+
+ void SyncEditorCurves();
+ void SyncMuscleCurvesBackwardCompatibility();
+
+ void SetEvents (const AnimationEvent* events, int size, bool sort = false);
+ void ClearEvents ();
+ FloatCurves& GetEulerEditorCurves() { return m_EulerEditorCurves; }
+ virtual void CloneAdditionalEditorProperties (Object& src);
+ FloatCurves& GetEditorCurvesNoConversion () { return m_EditorCurves; }
+
+
+ const AnimationClipSettings& GetAnimationClipSettings() const { return m_AnimationClipSettings; }
+ void SetAnimationClipSettingsNoDirty (AnimationClipSettings &clipInfo);
+ void SetAnimationClipSettings (const AnimationClipSettings&clipInfo) { m_AnimationClipSettings = clipInfo; SetDirty(); }
+
+ void GenerateMuscleClip();
+
+ void SetAnimationType (AnimationType type);
+
+
+ // overloads from Motion
+ virtual float GetAverageDuration();
+ virtual float GetAverageAngularSpeed();
+ virtual Vector3f GetAverageSpeed();
+ virtual float GetApparentSpeed();
+
+ virtual bool ValidateIfRetargetable(bool showWarning = true);
+ virtual bool IsLooping();
+
+ #endif
+
+ virtual bool IsAnimatorMotion()const;
+
+ // Returns the smallest and largest keyframe time of any channel in the animation
+ // if no keyframes are contained make_pair (infinity, -infinity) is returned
+ std::pair<float, float> GetRange ();
+
+ // Animation State support
+ typedef List< ListNode<AnimationState> > AnimationStateList;
+ typedef void DidModifyClipCallback(AnimationClip* clip, AnimationStateList& states);
+
+ static void SetDidModifyClipCallback(DidModifyClipCallback* callback);
+ void AddAnimationState(ListNode<AnimationState>& node) { m_AnimationStates.push_back(node); }
+
+ void SetSampleRate (float s);
+ float GetSampleRate () { return m_SampleRate; }
+
+ void SetCompressionEnabled (bool s) { m_Compressed = s; }
+ bool GetCompressionEnabled () { return m_Compressed; }
+#if UNITY_EDITOR
+ void SetUseHighQualityCurve (bool s) { m_UseHighQualityCurve = s; }
+ bool GetUseHighQualityCurve ()const { return m_UseHighQualityCurve; }
+#endif
+ void SetWrapMode (int wrap) { m_WrapMode = wrap; SetDirty (); }
+ int GetWrapMode () { return m_WrapMode; }
+
+ Events& GetEvents () { return m_Events; }
+ void AddRuntimeEvent (AnimationEvent& event);
+
+ void AddRotationCurve (const AnimationCurveQuat& quat, const std::string& path);
+ void AddPositionCurve (const AnimationCurveVec3& quat, const std::string& path);
+ void AddScaleCurve (const AnimationCurveVec3& quat, const std::string& path);
+ void AddFloatCurve (const AnimationCurve& curve, const std::string& path, int classID, const std::string& attribute);
+
+ QuaternionCurves& GetRotationCurves() { return m_RotationCurves; }
+ Vector3Curves& GetPositionCurves() { return m_PositionCurves; }
+ Vector3Curves& GetScaleCurves() { return m_ScaleCurves; }
+ FloatCurves& GetFloatCurves() { return m_FloatCurves; }
+
+ const QuaternionCurves& GetRotationCurves() const { return m_RotationCurves; }
+ const Vector3Curves& GetPositionCurves() const { return m_PositionCurves; }
+ const Vector3Curves& GetScaleCurves() const { return m_ScaleCurves; }
+ const FloatCurves& GetFloatCurves() const { return m_FloatCurves; }
+
+ void SetBounds(const AABB& bounds) { m_Bounds = bounds; SetDirty(); }
+ const AABB& GetBounds() const { return m_Bounds; }
+
+ static void RevertAllPlaymodeAnimationEvents ();
+
+ bool IsHumanMotion();
+
+ AnimationType GetAnimationType () const { return m_AnimationType; }
+
+
+ UnityEngine::Animation::AnimationClipBindingConstant* GetBindingConstant () { return &m_ClipBindingConstant; }
+ mecanim::animation::ClipMuscleConstant* GetRuntimeAsset();
+
+ void GetStats(AnimationClipStats& stats);
+
+ void ClipWasModifiedAndUpdateMuscleRange ();
+ void UpdateMuscleClipRange ();
+
+
+private:
+ void CompressCurves (CompressedQuaternionCurves& compressedRotationCurves);
+ void DecompressCurves (CompressedQuaternionCurves& compressedRotationCurves);
+
+ void ClipWasModified (bool cleanupMecanimData = true);
+
+ void ReloadEditorEulerCurves (const string& path);
+ void ReloadEditorQuaternionCurves (const string& path);
+
+ void ConvertToNewCurveFormat (NewAnimationTrack& curves, int classID, const std::string& path);
+ void ConvertToNewCurveFormat ();
+
+ void CleanupMecanimData();
+
+ mecanim::memory::ChainedAllocator m_ClipAllocator;
+
+private:
+ AnimationStateList m_AnimationStates;
+
+ float m_SampleRate;
+ bool m_Compressed;
+ bool m_UseHighQualityCurve;
+ int m_WrapMode;///< enum { Default = 0, Once = 1, Loop = 2, PingPong = 4, ClampForever = 8 }
+
+ QuaternionCurves m_RotationCurves;
+ Vector3Curves m_PositionCurves;
+ Vector3Curves m_ScaleCurves;
+ FloatCurves m_FloatCurves;
+ PPtrCurves m_PPtrCurves;
+ Events m_Events;
+ AnimationType m_AnimationType;
+
+#if UNITY_EDITOR
+ AnimationClipSettings m_AnimationClipSettings;
+#endif//#if UNITY_EDITOR
+
+ mecanim::animation::ClipMuscleConstant* m_MuscleClip;
+ mecanim::uint32_t m_MuscleClipSize;
+ UnityEngine::Animation::AnimationClipBindingConstant m_ClipBindingConstant;
+
+ /// TODO: Serialiaze and do not compute it at all on startup
+ std::pair<float, float> m_CachedRange;
+
+ AABB m_Bounds;
+
+ #if UNITY_EDITOR
+
+ // Keep a copy of events setup from edit mode so we can safely revert events after playmode
+ Events m_EditModeEvents;
+ FloatCurves m_EditorCurves;
+ FloatCurves m_EulerEditorCurves;
+
+ struct ChildTrack
+ {
+ UnityStr path;
+ int classID;
+ PPtr<BaseAnimationTrack> track;
+ DECLARE_SERIALIZE (ChildTrack)
+ };
+
+ typedef vector_map<SInt32, PPtr<BaseAnimationTrack> > ClassIDToTrack;
+ typedef ClassIDToTrack::iterator iterator;
+ typedef std::vector<ChildTrack> ChildTracks;
+ typedef ChildTracks::iterator child_iterator;
+
+ ClassIDToTrack m_ClassIDToTrack;
+ ChildTracks m_ChildTracks;
+
+ friend class StripCurvesForMecanimClips;
+
+ #endif
+
+ friend class AnimationManager;
+};
+
+typedef std::vector<PPtr<AnimationClip> > AnimationClipVector;
+
+#endif