/////////////////////////////////////////////////////////////////////////////// // // Name: SkeletonAnim.h // Author: Rich Cross // Contact: rich@wildfiregames.com // /////////////////////////////////////////////////////////////////////////////// #ifndef _SKELETONANIM_H #define _SKELETONANIM_H #include "res/res.h" #include "Vector3D.h" #include "Quaternion.h" #ifndef MAX_NAME_LENGTH #define MAX_NAME_LENGTH 128 #endif //////////////////////////////////////////////////////////////////////////////////////// // CBoneState: structure describing state of a bone at some point class CBoneState { public: // translation of bone relative to root CVector3D m_Translation; // rotation of bone relative to root CQuaternion m_Rotation; }; //////////////////////////////////////////////////////////////////////////////////////// // CSkeletonAnim: description of an animation that plays upon a skeleton class CSkeletonAnim { public: // current file version given to saved animations enum { FILE_VERSION = 1 }; // supported file read version - files with a version less than this will be rejected enum { FILE_READ_VERSION = 1 }; public: // Key: description of a single key in a skeleton animation typedef CBoneState Key; public: // CSkeletonAnim constructor + destructor CSkeletonAnim(); ~CSkeletonAnim(); // return the number of keys in this animation u32 GetNumKeys() const { return m_NumKeys; } // accessors: get a key for given bone at given time Key& GetKey(u32 frame,u32 bone) { return m_Keys[frame*m_NumKeys+bone]; } const Key& GetKey(u32 frame,u32 bone) const { return m_Keys[frame*m_NumKeys+bone]; } // get duration of this anim, in ms float GetDuration() const { return m_NumFrames*m_FrameTime; } // build matrices for all bones at the given time (in MS) in this animation void BuildBoneMatrices(float time,CMatrix3D* matrices) const; // anim I/O functions static CSkeletonAnim* Load(const char* filename); static void Save(const char* filename,const CSkeletonAnim* anim); public: // name of the animation char m_Name[MAX_NAME_LENGTH]; // frame time - time between successive frames, in ms float m_FrameTime; // number of keys in each frame - should match number of bones in the skeleton u32 m_NumKeys; // number of frames in the animation u32 m_NumFrames; // animation data - m_NumKeys*m_NumFrames total keys Key* m_Keys; }; #endif