khanat-opennel-code/code/ryzom/client/src/animated_scene_object.h

179 lines
6.5 KiB
C++

// Ryzom - MMORPG Framework <http://dev.ryzom.com/projects/ryzom/>
// 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 <http://www.gnu.org/licenses/>.
#ifndef CL_ANIMATED_SCENE_OBJECT_H
#define CL_ANIMATED_SCENE_OBJECT_H
#include <string>
#include <map>
#include <list>
#include <vector>
#include "nel/misc/types_nl.h"
#include "nel/misc/vector.h"
#include "nel/misc/vectord.h"
#include "nel/misc/quat.h"
#include "nel/misc/time_nl.h"
#include "nel/3d/u_scene.h"
#include "nel/3d/u_animation_set.h"
#include "nel/3d/u_play_list_manager.h"
#include "nel/3d/u_play_list.h"
#include "nel/3d/u_animation.h"
#include "nel/net/unitime.h"
#include "ig_client.h"
//#include "game_share/cst_loader.h"
/**
* CAnimatedSceneObject manage no move animated scene object
* \author Alain Saffray
* \author Nevrax France
* \date 2001
*/
class CAnimatedSceneObject
{
public:
struct SAnimationStatus
{
uint32 LoopAnim : 1;
uint32 CodeAnim : 1;
uint32 RandomAnim : 1;
uint32 SequenceAnim : 1;
uint32 ApplyDisplacement : 1;
uint32 AnimPlayed : 1;
SAnimationStatus( void )
{
LoopAnim = false;
CodeAnim = false;
RandomAnim = false;
SequenceAnim = false;
AnimPlayed = false;
ApplyDisplacement = false;
}
};
/// Constructor for random anim
CAnimatedSceneObject( const std::string& ObjectName, const string& ClusterIG, const std::string& MeshName, const std::string& SkeletonName, const std::list < std::string >& Animations, const NLMISC::CVector& Position, const NLMISC::CQuat& Rotation, float Distance );
/// Constructor for moving object, it not create entity (mesh, skeleton) but build animation on pre-exist entity
CAnimatedSceneObject( const NLMISC::CEntityId& Id, const std::list < std::string >& Animations );
// Constructor for moving object, init by UTransform
CAnimatedSceneObject( const NLMISC::CEntityId& Id, NL3D::UTransform *Transform, const std::list < std::string >& Animations, bool displacement = true );
/// Destructor
~CAnimatedSceneObject();
// Start animation
void InitApplyDisplacement ( void );
void EndApplyDisplacement ( void );
void StartRandomAnimation( double time, float speedFactor = 1.0f );
void StartNextAnimation( double time, float speedFactor = 1.0f );
void StartAnimation( string& nameAnim, double time, float speedFactor = 1.0f );
void removeOffsetAnimation ();
// Add an animation to sequence
void AddAnimationToSequence( const std::string& AnimName );
// Process logic and displacement and setup visual animation
void applyObjectAnimationTimeslice( double time );
// manage animation start, if they are many animation, we choose one randomly (TODO: add control to animation launched and manage some mode (loop, repeat number, sequences..)
void manageObjectAnimation( double Time, NLMISC::CVector userPos );
// update (add to end list) Animation sequence with sequence
void updateAnimationSequence( const std::list< std::string >& sequence );
// return Id of object
inline const NLMISC::CEntityId& getId( void ) { return _Id; }
// Return or Set Id of animation sequence
inline void idSequence( uint32 id) { _IdSequence = id; }
inline uint32 idSequence( void ) { return _IdSequence; }
inline void idAnimation( sint32 i ) { _IdAnimationPlayed = i; }
// return a reference on status
inline SAnimationStatus& getStatus( void) { return _Status; }
// Apply rotation with compute delta rotion since last call
void applyDeltaRotationAndPosition( NLMISC::CQuat& rot, NLMISC::CVector& trans );
// Reset list animation
inline void resetSequence( void ) { _SequenceAnimation.clear(); }
// break current animation
inline void breakCurrentAnimation ( void ) { _IdAnimationPlayed = -1; }
// Reset intial pos and rot matrix
void resetInitialPos( void );
// Process sound logic temporary
void processLogicTemp( double startOffset, double endOffset );
private:
NLMISC::CEntityId _Id;
uint32 _IdSequence;
std::string _ObjectName;
std::string _ClusterIG;
std::string _MeshName;
std::string _SkeletonName;
std::map< std::string, uint > _MapAnimation;
std::list< std::string > _SequenceAnimation;
NLMISC::CVectorD _Position;
NLMISC::CQuat _Rotation;
float _Distance;
SAnimationStatus _Status;
double _StartAnimationTime;
sint _IdAnimationPlayed;
NLMISC::CVector _PreviousTranslation;
NLMISC::CQuat _PreviousRotation;
double _OldAnimationTime;
// Only used in applydisplacement mode
NLMISC::CMatrix _AnimTransformation; // Only used in applydisplacement mode
NL3D::UPlayListManager *_PlayListManager;
NL3D::UAnimationSet *_AnimationSet;
NL3D::UPlayList *_PlayList;
NL3D::UInstance _Instance;
NL3D::USkeleton _Skeleton;
NL3D::UTransform _Transform;
};
typedef std::map< std::string, CAnimatedSceneObject * > TMapCAnimatedSceneObject;
extern TMapCAnimatedSceneObject AnimatedSceneObject;
void addAnimatedSceneObject( const std::string& AnimatedSceneObjectName, const string& ClusterIG, const std::string& MeshName, const std::string& SkeletonName, const std::list <std::string>& Animations, const NLMISC::CVector& Position, const NLMISC::CQuat& Rotation, float Distance );
void addEntityClAnimatedSceneObject( const NLMISC::CEntityId& Id, const std::list < std::string >& Animations );
void addUknowTypeSceneObject( const NLMISC::CEntityId& id, NL3D::UTransform *Transform, const std::list < std::string >& Animations, bool displacement = true );
void updateAnimationSequence( const NLMISC::CEntityId& id, const std::list< std::string >& sequence, uint32 idSequence );
void deleteAnimatedSceneObject( const std::string& AnimatedSceneObjectName );
void manageAnimatedSceneObject( double Time );
void sendEndSequenceMessage( const NLMISC::CEntityId& id, uint32 idSequence );
// Reset animation for the entity and break the current one.
void resetAnimatedSceneObject(const NLMISC::CEntityId& id);
#endif // CL_ANIMATED_SCENE_OBJECT_H
/* End of animated_scene_object.h */