// 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_ANIMATION_H #define CL_ANIMATION_H ///////////// // INCLUDE // ///////////// // #include "game_share/magic_fx.h" #include "client_sheets/animation_set_list_sheet.h" // #include "animation_fx.h" /////////// // CLASS // /////////// namespace NLGEORGES { class UFormElm; } namespace NL3D { class UTrack; } class CAnimationFXSet; /** * Class to describe an animation. * \author Guillaume PUZIN (GUIGUI) * \author Nevrax France * \date 2002 * \todo GUIGUI : change the animation name to remove ".anim". */ class CAnimation { public: /// Type of an animation. enum TAnimId { UnknownAnim = 0xffffffff }; public: /// Constructor CAnimation(); // dtor ~CAnimation(); /// Build the structure from the georges file read in sheet manager void init(CAnimationSheet *sheet, NL3D::UAnimationSet *animationSet); /// Return the Animation Id or UnknownAnim. uint id() const {return _Animation;} /// Return the Animation Id or UnknownAnim. const NLSOUND::TSoundAnimId &soundId() const {return _SoundAnim;} /// Must apply the Character scale Pos factor to the "pos" channel" of this animation. bool applyCharacterScalePosFactor() const {return _Sheet->ApplyCharacterScalePosFactor;} /// Return the fx associated with the animation. std::string fx() const { return _Sheet->FxNames.get(_Sheet->IdFX); } /// Is the head controlable by the code. bool headControlable() const {return _Sheet->HeadControlable;} /// Is the head controlable by the code. bool isReverse() const {return _Sheet->Reverse;} /// Is the head controlable by the code. bool hideAtEndAnim() const {return _Sheet->HideAtEndAnim;} double getRot() const {return _Rot;} double virtualRot() const {return _Sheet->VirtualRot;} // get fx set CAnimationFXSet &getFXSet() { return _FXSet; } const CAnimationFXSet &getFXSet() const { return _FXSet; } /** Return the next animation to play or -1. * only filtered anim (in animFilterStates) are used. if none, return -1 */ sint8 getNextAnim(const std::vector &animFilterStates) const; static std::set MissingAnim; // static void memoryCompress() { _FxNames.memoryCompress(); } // static void memoryRelease() { _FxNames.clear(); } void resetSoundAnim(); void reloadSoundAnim(); // true if this animation can be played according to the character job/race bool filterOk(uint32 jobSpecialisation, EGSPD::CPeople::TPeople race) const { if(!_Sheet) return true; // Common case: No job restriction and no race restriction? => always ok if(_Sheet->JobRestriction==0 && _Sheet->RaceRestriction==EGSPD::CPeople::Unknown) return true; // if job restriction don't match if(_Sheet->JobRestriction!=0 && _Sheet->JobRestriction!=jobSpecialisation) return false; // if race restriction don't match if(_Sheet->RaceRestriction!=EGSPD::CPeople::Unknown && _Sheet->RaceRestriction!=race) return false; // else filter ok return true; } // return the list of Next Anim const std::vector &getNextAnimList() const; private: /// Id of the sound animation. NLSOUND::TSoundAnimId _SoundAnim; /// Name of the sound animation, for SoundAnimManager Reload std::string _SoundAnimName; /// Animation Id uint _Animation; /// Rotation in the animation. double _Rot; // FX set to launch with the animation CAnimationFXSet _FXSet; CAnimationSheet *_Sheet; private: void computeAnimation(NL3D::UAnimationSet *animationSet, const std::string &animName); }; #endif // CL_ANIMATION_H /* End of animation.h */