mirror of
https://github.com/ptitSeb/Serious-Engine
synced 2024-11-23 02:40:26 +01:00
212 lines
7.4 KiB
C++
212 lines
7.4 KiB
C++
/* Copyright (c) 2002-2012 Croteam Ltd. All rights reserved. */
|
|
|
|
#ifndef SE_INCL_ANIM_H
|
|
#define SE_INCL_ANIM_H
|
|
#ifdef PRAGMA_ONCE
|
|
#pragma once
|
|
#endif
|
|
|
|
#include <Engine/Base/Serial.h>
|
|
|
|
#include <Engine/Base/Lists.h>
|
|
|
|
#define NAME_SIZE 32
|
|
typedef char NAME[NAME_SIZE];
|
|
#define PATH_MAX 260
|
|
typedef char FILE_NAME[PATH_MAX];
|
|
|
|
/*
|
|
* An object used for obtaining animation's information
|
|
*/
|
|
class CAnimInfo {
|
|
public:
|
|
NAME ai_AnimName;
|
|
TIME ai_SecsPerFrame; // speed of this animation
|
|
INDEX ai_NumberOfFrames;
|
|
};
|
|
|
|
/*
|
|
* Node used for linking file names representing frames.
|
|
* Nodes of this kind are returned result of LoadFromScript function.
|
|
*/
|
|
class ENGINE_API CFileNameNode {
|
|
public:
|
|
FILE_NAME cfnn_FileName;
|
|
CListNode cfnn_Node;
|
|
CFileNameNode(const char *NewFileName, CListHead *LH);
|
|
};
|
|
|
|
/*
|
|
* Animation data for a class of animateable objects
|
|
*/
|
|
class CAnimData : public CSerial {
|
|
public:
|
|
INDEX ad_NumberOfAnims;
|
|
class COneAnim *ad_Anims; // array of animations
|
|
|
|
public:
|
|
|
|
// fill member variables with invalid data
|
|
ENGINE_API CAnimData();
|
|
// Free allocated data (ad_Anims array), check invalid data
|
|
ENGINE_API ~CAnimData();
|
|
// clears animation data object
|
|
ENGINE_API void Clear();
|
|
// check if this kind of objects is auto-freed
|
|
virtual BOOL IsAutoFreed(void);
|
|
// reference counting functions
|
|
virtual void RemReference_internal(void);
|
|
|
|
// get amount of memory used by this object
|
|
SLONG GetUsedMemory(void);
|
|
|
|
// reference counting functions
|
|
void AddReference(void);
|
|
void RemReference(void);
|
|
|
|
// creates given number of default animations (1 frame, given name and apeed)
|
|
ENGINE_API void CreateAnimations( INDEX ctAnimations, CTString strName="None",
|
|
INDEX iDefaultFrame=0,TIME tmSpeed=0.02f);
|
|
// replaces frames array with given one
|
|
ENGINE_API void SetFrames( INDEX iAnimation, INDEX ctFrames, INDEX *pNewFrames);
|
|
// replaces requested animation's name with given one
|
|
ENGINE_API void SetName( INDEX iAnimation, CTString strNewName);
|
|
// replaces requested animation's speed with given one
|
|
ENGINE_API void SetSpeed( INDEX iAnimation, TIME tmSpeed);
|
|
// obtains frame index for given place in array representing given animation
|
|
ENGINE_API INDEX GetFrame( INDEX iAnimation, INDEX iFramePlace);
|
|
// sets frame index for given place in array representing given animation
|
|
ENGINE_API void SetFrame( INDEX iAnimation, INDEX iFramePlace, INDEX iNewFrame);
|
|
// fill animation data object vith valid data containing one animation, one frame
|
|
ENGINE_API void DefaultAnimation();
|
|
/* Get animation's info. */
|
|
ENGINE_API void GetAnimInfo(INDEX iAnimNo, CAnimInfo &aiInfo) const;
|
|
/* Add animation */
|
|
ENGINE_API void AddAnimation(void);
|
|
/* Delete animation */
|
|
ENGINE_API void DeleteAnimation(INDEX iAnim);
|
|
/* Get number of animations. */
|
|
ENGINE_API INDEX GetAnimsCt(void) const;
|
|
// load list of frames from script file
|
|
ENGINE_API void LoadFromScript_t( CTStream *File, CListHead *FrameFileList); // throw char *
|
|
// print #define <animation name> lines for all animations into given file
|
|
void ExportAnimationNames_t( CTStream *ostrFile, CTString strAnimationPrefix); // throw char *
|
|
void Read_t( CTStream *istrFile); // throw char *
|
|
void Write_t( CTStream *ostrFile); // throw char *
|
|
};
|
|
|
|
|
|
/*
|
|
* An instance of animateable object
|
|
*/
|
|
#define AOF_PAUSED (1L<<0) // current animation is paused
|
|
#define AOF_LOOPING (1L<<1) // anim object is playing a looping animation
|
|
#define AOF_NORESTART (1L<<2) // don't restart anim (used for PlayAnim())
|
|
#define AOF_SMOOTHCHANGE (1L<<3) // smoothly change between anims
|
|
|
|
class CAnimObject : public CChangeable {
|
|
public:
|
|
TIME ao_tmAnimStart; // time when current anim was started
|
|
INDEX ao_iCurrentAnim; // index of active animation
|
|
ULONG ao_ulFlags; // flags
|
|
INDEX ao_iLastAnim; // index of last animation (for smooth transition)
|
|
|
|
/* Calculate frame that coresponds to given time. */
|
|
INDEX FrameInTime(TIME time) const;
|
|
|
|
public:
|
|
CAnimData *ao_AnimData;
|
|
|
|
public:
|
|
|
|
// some of usual smart pointer functions are implemented, because AnimObjects
|
|
// behave as smart pointers to AnimData objects
|
|
/* Default constructor. */
|
|
ENGINE_API CAnimObject(void);
|
|
/* Destructor. */
|
|
ENGINE_API ~CAnimObject(void);
|
|
// copy from another object of same class
|
|
ENGINE_API void Copy(CAnimObject &aoOther);
|
|
// synchronize with another animation object (set same anim and frames)
|
|
ENGINE_API void Synchronize(CAnimObject &aoOther);
|
|
|
|
// copying of AnimObjects is not allowed
|
|
inline CAnimObject(const CAnimObject &aoOther) {
|
|
ASSERT(FALSE); };
|
|
inline const CAnimObject &operator=(const CAnimObject &aoOther) {
|
|
ASSERT(FALSE); return *this;};
|
|
|
|
// clip frame index to be inside valid range (wrap around for looping anims)
|
|
INDEX ClipFrame(INDEX iFrame) const;
|
|
/* Loop anims forward */
|
|
ENGINE_API void NextAnim(void);
|
|
/* Loop anims backward */
|
|
ENGINE_API void PrevAnim(void);
|
|
/* Loop frames forward */
|
|
ENGINE_API void NextFrame(void);
|
|
/* Loop frames backward */
|
|
ENGINE_API void PrevFrame(void);
|
|
/* Select frame in given time offset */
|
|
ENGINE_API void SelectFrameInTime(TIME tmOffset);
|
|
/* Select first frame */
|
|
ENGINE_API void FirstFrame(void);
|
|
/* Select last frame */
|
|
ENGINE_API void LastFrame(void);
|
|
/* Test if some updateable object is up to date with this anim object. */
|
|
ENGINE_API BOOL IsUpToDate(const CUpdateable &ud) const;
|
|
void Read_t( CTStream *istrFile); // throw char *
|
|
void Write_t( CTStream *ostrFile); // throw char *
|
|
|
|
/* Get animation's info. */
|
|
ENGINE_API void GetAnimInfo(INDEX iAnimNo, CAnimInfo &aiInfo) const;
|
|
|
|
/* Attach data to this object. */
|
|
ENGINE_API void SetData(CAnimData *pAD);
|
|
// obtain animation and set it for this object
|
|
ENGINE_API void SetData_t(const CTFileName &fnmAnim); // throw char *
|
|
|
|
/* Get current anim data ptr. */
|
|
__forceinline CAnimData *GetData() { return ao_AnimData; };
|
|
|
|
/* Get animation's length. */
|
|
ENGINE_API FLOAT GetCurrentAnimLength(void) const;
|
|
ENGINE_API FLOAT GetAnimLength(INDEX iAnim) const;
|
|
/* Get number of animations in current anim data */
|
|
ENGINE_API INDEX GetAnimsCt() const;
|
|
/* If animation has finished */
|
|
ENGINE_API BOOL IsAnimFinished(void) const;
|
|
/* Get passed time from start of animation */
|
|
ENGINE_API TIME GetPassedTime(void) const;
|
|
|
|
/* Start new animation -- obsolete. */
|
|
ENGINE_API void StartAnim(INDEX iNew);
|
|
/* Start playing an animation. */
|
|
ENGINE_API void PlayAnim(INDEX iNew, ULONG ulFlags);
|
|
/* Seamlessly continue playing another animation from same point. */
|
|
ENGINE_API void SwitchToAnim(INDEX iNew);
|
|
/* Set new animation but doesn't starts it. */
|
|
ENGINE_API void SetAnim(INDEX iNew);
|
|
/* Reset anim (restart) */
|
|
ENGINE_API void ResetAnim();
|
|
/* Pauses current animation. */
|
|
ENGINE_API void PauseAnim();
|
|
/* Continues paused animation. */
|
|
ENGINE_API void ContinueAnim();
|
|
/* Offsets the animation phase */
|
|
ENGINE_API void OffsetPhase(TIME tm);
|
|
/* Retrieves paused flag */
|
|
ENGINE_API BOOL IsPaused(void);
|
|
/* Gets the number of current animation */
|
|
ENGINE_API INDEX GetAnim(void) const;
|
|
/* Gets the number of current frame. */
|
|
ENGINE_API INDEX GetFrame(void) const;
|
|
/* Gets number of frames in current anim. */
|
|
ENGINE_API INDEX GetFramesInCurrentAnim(void) const;
|
|
/* Get information for linear interpolation beetween frames. */
|
|
ENGINE_API void GetFrame( INDEX &iFrame0, INDEX &iFrame1, FLOAT &fRatio) const;
|
|
};
|
|
|
|
|
|
#endif /* include-once check. */
|
|
|