// Ryzom - MMORPG Framework // Copyright (C) 2010 Winch Gate Property Limited // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as // published by the Free Software Foundation, either version 3 of the // License, or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . #ifndef CL_ENTITY_ANIMATION_MANAGER_H #define CL_ENTITY_ANIMATION_MANAGER_H ///////////// // INCLUDE // ///////////// // Misc #include "nel/misc/types_nl.h" #include "nel/misc/vector.h" #include "nel/misc/quat.h" // 3d #include "nel/3d/animation_time.h" #include "nel/3d/u_animation.h" #include "nel/3d/u_track.h" // Client Sheets #include "client_sheets/automaton_list_sheet.h" #include "client_sheets/animation_set_list_sheet.h" #include "client_sheets/emot_list_sheet.h" // Client #include "animation_set.h" #include "animation_misc.h" // STL #include /////////// // USING // /////////// using NL3D::CAnimationTime; /////////// // CLASS // /////////// namespace NL3D { class UAnimationSet; class UPlayListManager; class UPlayList; } namespace NLMISC { class IProgressCallback; } /** * Class with infos for each face emotions. * \author Guillaume PUZIN (GUIGUI) * \author Nevrax France * \date 2001 */ class CFaceEmotion { public: std::map _Anims; void addAnim(const std::string &filename, float percentage) { _Anims.insert(std::make_pair(filename, percentage)); } }; /** * Class to manage animation of entities displayed by the client * \author Guillaume PUZIN (GUIGUI) * \author Stephane Coutelas * \author Nevrax France * \date 2001 */ class CEntityAnimationManager { public: // Data tyype for Emotions for the face. typedef std::map TFaceEmotions; typedef std::map TAnimSet; private: /// the only one instance of the class static CEntityAnimationManager *_Instance; /// playlist manager static NL3D::UPlayListManager *_PlayListManager; /// The Animation Set with all character animations. NL3D::UAnimationSet *_AnimationSet; /// list of animation set. TAnimSet _AnimSet; /// Automaton used for animations CAutomatonListSheet *_AutomatonList; /// Emots List CEmotListSheet *_EmotList; //std::vector _Emots; /// Animation set cache std::vector _AnimationSetPosCache; std::vector _AnimationSetRotCache; /* /// Animation Sets for the face std::map _FaceAnimationSets; /// automaton for moving animations std::map _FaceEmotionsPerType; */ /** * Load table containing infos about face animations. * \param type : table is different according to the type. * \param fileName : the name of the file containing the animation infos. */ // void loadFaceAnimations(const CTypeEntity& type, const char * fileName); protected : /// Constructor CEntityAnimationManager(); /// Create an animation set for the Face. // void createFaceAnimationSet(const CTypeEntity& type); public : /** * Instanciate CEntityAnimationManager. There can be only one instance (singleton) * \return CEntityAnimationManager * : Pointer on CEntityAnimationManager. */ static CEntityAnimationManager * getInstance(); /// \warning If you the kept the pointer given by getInstance, it will be invalid. static void delInstance(); public : /// Destructor. ~CEntityAnimationManager(); /// Release void release(); /// (Re-)Initialize void load(NLMISC::IProgressCallback &progress, bool forceRepack = false); /** * Animate all the playlists. * \param double time : play time. */ void animate(double time); void setup(double time); /** * Return a ref on a state of the moving automaton defined by its key. * \param string automatonName : the automaton's name. * \param TAnimStateKey key : the key of the state. * \return CMovingAutomatonState * : pointer on the moving automaton state or 0. */ const CAutomatonStateSheet *mState(const std::string &automaton, TAnimStateKey key); /** * Delete a play list. * \param UPlayList * pl : pointer on the play list to delete. */ void deletePlayList(NL3D::UPlayList * pl); /** * Process all logical tracks(sound, etc..) which come along with the animation. * \param string animListName : the animation list in witch to search. * \param TAnimStateKey animationId : the id of the animation. * \param CAnimationTime startTimeOffset :the start time in the animation play. * \param CAnimationTime endTimeOffset : the end time in the animation play. */ void processLogic(const std::string &animListName, TAnimStateKey animationId, CAnimationTime startTimeOffset, CAnimationTime endTimeOffset, NL3D::UTrack *&soundTrack, std::vector& result); /** \name INFORMATION ABOUT ANIMATIONS * Methods to get information about an animation. */ //@{ /** * Function to get the position in animation at timeOffset. * \param idAnim : id of the animation. * \param timeOffset : time for the interpolation. * \param result : is the reference on the value to get the result (position). * \return bool : true if the parameter result is valid. */ bool interpolate(uint idAnim, double timeOffset, NLMISC::CVector &result) const { H_AUTO ( RZ_Client_Entity_Anim_Mngr_Interpolate ) // Check Params if(idAnim >= _AnimationSetPosCache.size()) { //nlwarning("EAM:interpolate(vect): idAnim(%d) invalid.", idAnim); return false; } NL3D::UTrack *track = _AnimationSetPosCache[idAnim]; if (track) return track->interpolate((CAnimationTime)timeOffset, result); return false; } /** * Function to get the rotation in animation at timeOffset. * \param idAnim : id of the animation. * \param timeOffset : time for the interpolation. * \param result : is the reference on the value to get the result (rotation). * \return bool : true if the parameter result is valid. */ bool interpolate(uint idAnim, double timeOffset, NLMISC::CQuat &result) const { H_AUTO ( RZ_Client_Entity_Anim_Mngr_Interpolate ) // Check Params if(idAnim >= _AnimationSetRotCache.size()) { //nlwarning("EAM:interpolate(quat): idAnim(%d) invalid.", idAnim); return false; } NL3D::UTrack *track = _AnimationSetRotCache[idAnim]; if (track) return track->interpolate((CAnimationTime)timeOffset, result); return false; } /** * Return an animation length (in sec). * \param string animName : Animation Name. * \return double : the length of the animation. * \warning This method never return a value <= 0.0 and so will return 1.0 instead. * \warning This Method is slower than the one with the animation Id instead of the animation Name. */ double getAnimationLength(const std::string &animName) const; /** * Return an animation length (in sec). * \param idAnim : id of the animation. * \return double : the length of the animation. * \warning This method never return a value <= 0.0 and so will return 1.0 instead. */ double getAnimationLength(uint idAnim)const; /** * Get the average speed of an animation (in meters/sec). * \param string animName : Animation Name. * \return double : the average speed (in m/s). */ double getAnimationAverageSpeed(const std::string &animName) const; /** * Get the average speed of an animation (in meters/sec). * \param idAnim : id of the animation. * \return double : the average speed (in m/s). */ double getAnimationAverageSpeed(uint idAnim) const; //@} /** * Get the minimum speed factor that can be used to play the animation. * \param animSet : Set of animations used. * \param animStateId : the animation State. * \param idAnim : the id of the animation. * \return double : the minimum speed factor or -1 if any pb. */ double getAnimMinSpeedFactor(const std::string &animSet, const TAnimStateId &animStateId, const CAnimation::TAnimId &idAnim) const; /** * Get the maximum speed factor that can be used to play the animation * \param animSet : Set of animations used. * \param animStateId : the animation State. * \param idAnim : the id of the animation. * \return double : the maximum speed factor or -1 if any pb. */ double getAnimMaxSpeedFactor(const std::string &animSet, const TAnimStateId &animStateId, const CAnimation::TAnimId &idAnim) const; /** * Return a pointer on the set according to the set name. * \param animSet : name of the set. * \return CAnimationSet * : pointer of the right Set or 0. */ const CAnimationSet *getAnimSet(const std::string &animSet) const; /** * Get the animation set. * \return UAnimationSet * : a pointer on the animation set or 0 if there is not animation set. */ NL3D::UAnimationSet * getAnimationSet() {return _AnimationSet;} /** * Create a playlist. * \return UPlayList * : a pointer on a play list or 0 if any pb. */ NL3D::UPlayList *createPlayList() const; /// Serialize a CEntityAnimationManager. void serial(class NLMISC::IStream &f) throw(NLMISC::EStream); /** Count the number of emot * \return uint : the number of emot already known. */ uint getNbEmots() {return (uint)_EmotList->Emots.size();} /** Method to get the emot associated to an index. * \param index : number of the emot asked. * \param result : will be filled with the name of the emot associated. * \return bool : true if the result has been filled, false if the index is invalid. */ bool getEmot(uint index, TAnimStateId &result) { if(index < _EmotList->Emots.size()) { result = _EmotList->Emots[index]; return true; } else return false; } /// For Reload Sound feature void resetAllSoundAnimId(); void reloadAllSoundAnim(); /** * Create an uninitialized playlist for the face animations. * \param type : type of the play list to create. * \return UPlayList * : a pointer on an initialized play list. */ // NL3D::UPlayList *CEntityAnimationManager::createFacePlayList(const CTypeEntity& type); /** * Get an animation set for face. * \param type : type of the animation set you want. * \return UAnimationSet * : a pointer on the animation set or 0 if there is not animation set for this type. */ // NL3D::UAnimationSet * getFaceAnimationSet(const CTypeEntity& type); /** * Choose an animation for the face according to the type and the emotion. * \param type : type of the face. * \param emotion : emotion to play. * \return uint : the index of the animation. */ // uint chooseFaceAnim(const CTypeEntity& type, const std::string &emotion); }; #endif // CL_ENTITY_ANIMATION_MANAGER_H /* End of entity_animation_manager.h */