#ifndef SALMON_ANIMATION_H_INCLUDED #define SALMON_ANIMATION_H_INCLUDED /* This code contains Model Animation Manager and code to operate Animation */ #include "include/ModelManager/ModelManager.h" namespace SE { //We have to declare it in advance class TAnimModel; //This struct contains bone information struct TBoneStruct { vec3 Pos; vec4 Quat; float Len; int Ancient; }; struct TBoneWeightStruct { int BoneNum; float BoneWeight; }; //This struct contains additional info for every model vertex - weight of 3 bones per vertex struct TVertexWeightStruct { int WeightCount; std::vector VertexBoneInfo; }; //One animation sequence (i.e. one move for one model) class TAnimSequence { protected: std::vector > BoneInfoMatrix; int BoneCount; int FrameCount; public: TAnimSequence() : BoneCount(0), FrameCount(0) { } //copy constructor TAnimSequence(const TAnimSequence& animSeq); ~TAnimSequence(); TAnimSequence& operator=(const TAnimSequence& animSeq); bool LoadFromFileAn1(const std::string& fileName); //not safe void Clear(); void ScaleAnimSequence(float s); void MoveAnimSequence(const vec3& v); void RotateAnimSequence(const mat3& m); friend class TAnimModel; }; typedef std::vector TBoneList; typedef std::vector TVertexWeightList; typedef std::map > TAnimSequenceMap; /* Class for list of animations List of animations contains bone system + vertex weight table + a list of avaiable animations */ class TAnimList { protected: TBoneList BoneList; TBoneList PrevBoneList; TVertexWeightList VertexWeightList; TAnimSequenceMap AnimSequenceMap; //Means bonelist and vertex weight list are loaded (AnimSequence may remain empty) bool Ready; public: TAnimList() : Ready(false) { } ~TAnimList() { Clear(); } //Load bone system + vertex weight from file bool LoadBoneSystemFromFileBn1(const std::string& fileName); bool LoadBoneSystemFromFileBn2(const std::string& fileName); //Add one more anim sequence to sequence map bool LoadAnimSequenceFromFileAn1(const std::string& fileName); //Process animations. Must be processed after you process model void ScaleAnimList(float s); void MoveAnimList(const vec3& v); void RotateAnimList(const mat3& m); void Clear(); void DrawBoneSystem(); //this method copies bone system to reserved memory void SaveBoneSystemToBuf(); //this method reloads bone system form reserved memory void LoadBoneSystemFromBuf(); friend class TAnimModel; }; typedef std::map > TAnimListMap; //Class that contains list of animations for each model class TModelAnimManager { protected: TAnimListMap AnimListMap; public: TModelAnimManager() { }; ~TModelAnimManager() { Clear(); }; TAnimList* operator [] (const std::string& s); //NOT SAFE!!! bool AddAnimationToModel(const std::string& modelName, const std::string& boneListFileName); void Clear(); }; class TAnimModel { protected: TLiteModel LiteModel; std::vector CopyVertexArr; TAnimList* AnimList; bool Ready; void RecalcVertexPos(); //This is used for animation only - to save original t=0 position void SaveVertexInfoToBuf(); void LoadVertexInfoFromBuf(); public: TAnimModel() : Ready(false), AnimList(NULL) {} ~TAnimModel() { Clear(); } bool LoadModel(const std::string& modelName); void Clear(); void ScaleModel(float s); void MoveModel(const vec3& v); void RotateModel(const mat3& r); inline void SetShaderTranslateVector(const vec3& v) { LiteModel.SetShaderTranslateVector(v); } inline void SetShaderRotateMatrix(const mat3& m) { LiteModel.SetShaderRotateMatrix(m); } void DrawImmediate(); void DrawVBO() { LiteModel.DrawVBO(); } void UpdateVBO() { LiteModel.UpdateVBO(); } //n must be in 0..99; ??? void ApplySequence(const std::string& seq, int n); }; } //namespace SE #endif