110 lines
4.3 KiB
C
110 lines
4.3 KiB
C
|
#if !defined(CTRL__Sequence_h__INCLUDED)
|
||
|
#define CTRL__Sequence_h__INCLUDED
|
||
|
#pragma once
|
||
|
|
||
|
#if ENABLE_MSGTABLE_API
|
||
|
|
||
|
//------------------------------------------------------------------------------
|
||
|
class DuSequence :
|
||
|
public SequenceImpl<DuSequence, SListener>
|
||
|
{
|
||
|
// Construction
|
||
|
public:
|
||
|
inline DuSequence();
|
||
|
inline ~DuSequence();
|
||
|
|
||
|
// Public API
|
||
|
public:
|
||
|
dapi HRESULT ApiOnEvent(EventMsg * pmsg);
|
||
|
|
||
|
dapi HRESULT ApiAddRef(Sequence::AddRefMsg *) { AddRef(); return S_OK; }
|
||
|
dapi HRESULT ApiRelease(Sequence::ReleaseMsg *) { Release(); return S_OK; }
|
||
|
|
||
|
dapi HRESULT ApiGetLength(Sequence::GetLengthMsg * pmsg);
|
||
|
dapi HRESULT ApiGetDelay(Sequence::GetDelayMsg * pmsg);
|
||
|
dapi HRESULT ApiSetDelay(Sequence::SetDelayMsg * pmsg);
|
||
|
dapi HRESULT ApiGetFlow(Sequence::GetFlowMsg * pmsg);
|
||
|
dapi HRESULT ApiSetFlow(Sequence::SetFlowMsg * pmsg);
|
||
|
dapi HRESULT ApiGetFramePause(Sequence::GetFramePauseMsg * pmsg);
|
||
|
dapi HRESULT ApiSetFramePause(Sequence::SetFramePauseMsg * pmsg);
|
||
|
|
||
|
dapi HRESULT ApiGetKeyFrameCount(Sequence::GetKeyFrameCountMsg * pmsg);
|
||
|
dapi HRESULT ApiAddKeyFrame(Sequence::AddKeyFrameMsg * pmsg);
|
||
|
dapi HRESULT ApiRemoveKeyFrame(Sequence::RemoveKeyFrameMsg * pmsg);
|
||
|
dapi HRESULT ApiRemoveAllKeyFrames(Sequence::RemoveAllKeyFramesMsg * pmsg);
|
||
|
dapi HRESULT ApiFindKeyFrame(Sequence::FindKeyFrameMsg * pmsg);
|
||
|
|
||
|
dapi HRESULT ApiGetTime(Sequence::GetTimeMsg * pmsg);
|
||
|
dapi HRESULT ApiSetTime(Sequence::SetTimeMsg * pmsg);
|
||
|
dapi HRESULT ApiGetKeyFrame(Sequence::GetKeyFrameMsg * pmsg);
|
||
|
dapi HRESULT ApiSetKeyFrame(Sequence::SetKeyFrameMsg * pmsg);
|
||
|
dapi HRESULT ApiGetInterpolation(Sequence::GetInterpolationMsg * pmsg);
|
||
|
dapi HRESULT ApiSetInterpolation(Sequence::SetInterpolationMsg * pmsg);
|
||
|
|
||
|
dapi HRESULT ApiPlay(Sequence::PlayMsg * pmsg);
|
||
|
dapi HRESULT ApiStop(Sequence::StopMsg * pmsg);
|
||
|
dapi HRESULT ApiReset(Sequence::ResetMsg * pmsg);
|
||
|
dapi HRESULT ApiGotoTime(Sequence::GotoTimeMsg * pmsg);
|
||
|
|
||
|
// Implementation
|
||
|
protected:
|
||
|
inline void AddRef();
|
||
|
inline void Release();
|
||
|
|
||
|
void RemoveAllKeyFrames();
|
||
|
|
||
|
inline void SortKeyFrames();
|
||
|
static int __cdecl CompareItems(const void * pva, const void * pvb);
|
||
|
void FindAtTime(float flTime, int * pidxKeyFrame) const;
|
||
|
void ResetSubject(Visual * pgvSubject, int idxFrame);
|
||
|
|
||
|
inline BOOL IsPlaying() const;
|
||
|
HRESULT QueueAnimation(int idxKeyFrame);
|
||
|
HRESULT BuildAnimation(int idxKeyFrame);
|
||
|
void Stop(BOOL fKillAnimations = TRUE);
|
||
|
static void CALLBACK
|
||
|
ActionProc(GMA_ACTIONINFO * pmai);
|
||
|
UINT CALLBACK
|
||
|
OnAnimationComplete(EventMsg * pmsg);
|
||
|
|
||
|
HRESULT CheckComplete() const;
|
||
|
#if DBG
|
||
|
BOOL DEBUG_IsProperTimeOrder() const;
|
||
|
#endif
|
||
|
|
||
|
// Data
|
||
|
protected:
|
||
|
struct SeqData
|
||
|
{
|
||
|
float flTime; // Time of current keyframe
|
||
|
DUser::KeyFrame *
|
||
|
pkf; // Information for this KeyFrame
|
||
|
Interpolation * pipol; // Interpolation to next KeyFrame
|
||
|
};
|
||
|
|
||
|
struct AniData
|
||
|
{
|
||
|
DuSequence * pseq; // Owning Sequence
|
||
|
int idxFrame; // 1st KeyFrame of specific Animation
|
||
|
HACTION hact; // Action of outstanding Animation
|
||
|
};
|
||
|
|
||
|
UINT m_cRef; // Reference count
|
||
|
float m_flDelay; // Delay before starting animation
|
||
|
Flow * m_pflow; // Flow used between keyframes
|
||
|
Visual * m_pgvSubject; // Visual being animated
|
||
|
int m_cQueuedAni; // Outstanding queued animations
|
||
|
DWORD m_dwFramePause; // Generic frame pause
|
||
|
|
||
|
GArrayF<SeqData>
|
||
|
m_arSeqData;
|
||
|
GArrayF<AniData>
|
||
|
m_arAniData;
|
||
|
};
|
||
|
|
||
|
#endif // ENABLE_MSGTABLE_API
|
||
|
|
||
|
#include "Sequence.inl"
|
||
|
|
||
|
#endif // CTRL__Sequence_h__INCLUDED
|