// wzanistate.h #ifndef _3DFILEACCESS_WZANISTATE_H_ #define _3DFILEACCESS_WZANISTATE_H_ #include "wzevent.h" #include "wzanimationinfo.h" #include class CWzAniStateCB; class CWzdBase; struct WzNode; struct WzTransform; struct WzKeyFrame; struct WzTransformParam; //------------------------------------------------------------------------------ /** @class CWzAniState */ class CWzAniState { public: // »ý¼ºÀÚ/¼Ò¸êÀÚ CWzAniState(); virtual ~CWzAniState(); // ÃʱâÈ­ void Initialize(); // ¾Ö´Ï¸ÞÀÌ¼Ç Á¤º¸ ¼³Á¤ void SetAnimationInfo( WzAnimationInfo* pAnimationInfo, bool bLoopAni, bool bBlendAni, int nInterpolationFrame, bool bReset ); // ¾Ö´Ï¸ÞÀÌ¼Ç Á¤º¸ ¾ò±â WzAnimationInfo* GetAnimationInfo() const; // ¾Ö´Ï¸ÞÀÌ¼Ç ÀÖ´ÂÁö ¿©ºÎ bool HasAnimation() const; // ¾Ö´Ï¸ÞÀÌ¼Ç µ¥ÀÌŸ ¾ò±â CWzdBase* GetAnimationData() const; // ÇÁ·¹ÀÓ ÁøÇà ENUM_ANI_FRAME_STATUS ProgressFrame( float fFrameAdd, WzEvent* pEvent, float fUnitAniSpeed, WzAnimationInfo* pPrevAni ); // ´Ü¼ø ¾Ö´Ï¸ÞÀÌ¼Ç bool AnimateSimple( WzTransform* pOutTform ); // ÀÏ¹Ý ¾Ö´Ï¸ÞÀÌ¼Ç bool Animate( WzTransform* pOutTform, const WzTransform* pInTform ); // ºí·£µù ¾Ö´Ï¸ÞÀÌ¼Ç bool AnimateBlend( WzTransform* pOutTform ); // º¯È¯ Çà·Ä °è»ê void CalcTransformMatrix( WzMatrix* pOutMat, const WzTransform* pInTform, const WzTransformParam* pwtp ); // ¹Ýº¹ ¿©ºÎ ¼³Á¤ void SetAniLoop( bool b ); bool GetAniLoop() const; // speed ºñÀ² ¼³Á¤ void SetSpeedRatio( float r ); float GetSpeedRatio() const; // ºí·£µù º» ¼³Á¤ void SetBlendBoneIndex( int idx ); int GetBlendBoneIndex() const; // µ¨Å¸ ºí·£µù ¿©ºÎ ¼³Á¤ void SetDeltaBlend( bool b ); bool GetDeltaBlend() const; // ÃÖ´ë ÇÁ·¹ÀÓ ¾ò±â float GetMaxFrame() const; // ÇöÀç ÇÁ·¹ÀÓ ¼³Á¤/¾ò±â void SetCurFrame( float fFrame ); float GetCurFrame() const; // º¸°£ ÇÁ·¹ÀÓ ¼³Á¤ void SetStartIpolFrame( int nFrame ); void SetEndIpolFrame( int nFrame ); // º¸°£ ÁßÀΰ¡? bool IsInterpolating() const; // Äݹé Ŭ·¡½º µî·Ï void SetCallback( CWzAniStateCB* pCB ); private: // º¯¼ö ÃʱâÈ­ void InitVariables(); // ÇØÁ¦ void Release(); // ¾Ö´Ï¸ÞÀÌ¼Ç µ¥ÀÌŸ °Ë»ç bool CheckAnimationData(); // À̺¥Æ® Àç»ý ¿©ºÎ ÃʱâÈ­ void InitEventPlayFlags(); // À̺¥Æ® ¼³Á¤ void SetEvents( WzEvent* pEvent ); // ºí·£µù º» ¸®½ºÆ® Àç¼³Á¤ void ResetBlendBoneList(); // ºí·£µù º» Ãß°¡ void AddBlendBone( const WzNode* pBoneList, int nBoneIdx ); // ÇØ´ç º» ºí·£µù º¯È¯ void BlendTransform_typeS( WzTransform* pOutTform, int iNode, float fWeight ); void BlendTransform_typeSD( WzTransform* pOutTform, int iNode, float fWeight ); void BlendTransform_typeE( WzTransform* pOutTform, int iNode, float fWeight ); void BlendTransform_typeED( WzTransform* pOutTform, int iNode, float fWeight ); void BlendTransform_typeN( WzTransform* pOutTform, int iNode ); void BlendTransform_typeND( WzTransform* pOutTform, int iNode ); private: typedef std::vector VECTOR_BLENDBONE; CWzAniStateCB* m_pCallback; WzAnimationInfo* m_pAnimationInfo; CWzdBase* m_pWzdAnimation; int m_nNumBone; WzKeyFrame* m_wzKeyFrameList; WzTransform* m_pTempTransformBuf; CWzFlag m_calcTempTformFlag; float m_fMaxFrame; // ÃÖ´ë ÇÁ·¹ÀÓ float m_fCurFrame; // ÇöÀç ÇÁ·¹ÀÓ int m_nIpolFrame; // ÁöÁ¤µÈ º¸°£ ÇÁ·¹ÀÓ ¼ö int m_nStartIpolFrame; // ¾Õ º¸°£ ÇÁ·¹ÀÓ ¼ö int m_nEndIpolFrame; // µÚ º¸°£ ÇÁ·¹ÀÓ ¼ö float m_fTotIpolTime; // ÃÑ º¸°£ ½Ã°£ (´ÜÀ§: ÃÊ) float m_fCurIpolTime; // ÇöÀç º¸°£ ½Ã°£ (´ÜÀ§: ÃÊ) ENUM_IPOL_STATE m_ipolState; float m_fSpeedRatio; // ¾Ö´Ï¸ÞÀÌ¼Ç ¼Óµµ ºñÀ² bool m_bLoopAni; // ¹Ýº¹ ¾Ö´Ï¸ÞÀ̼Ç? bool m_bBlendAni; // ºí·£µù ¾Ö´Ï¸ÞÀ̼Ç? bool m_bDeltaBlend; // µ¨Å¸ ºí·£µù? int m_nBlendBoneIdx; // ºí·£µù º» À妽º VECTOR_BLENDBONE m_blendBoneList; DWORD m_dwEventPlayFlag[3]; int m_nEventPlayNum[3]; }; //------------------------------------------------------------------------------ /** */ inline void CWzAniState::InitEventPlayFlags() { memset( m_dwEventPlayFlag, 0, sizeof( m_dwEventPlayFlag ) ); memset( m_nEventPlayNum, 0, sizeof( m_nEventPlayNum ) ); } //------------------------------------------------------------------------------ /** */ inline void CWzAniState::SetAniLoop( bool b ) { m_bLoopAni = b; } //------------------------------------------------------------------------------ /** */ inline void CWzAniState::SetSpeedRatio( float r ) { m_fSpeedRatio = r; } //------------------------------------------------------------------------------ /** */ inline WzAnimationInfo* CWzAniState::GetAnimationInfo() const { return m_pAnimationInfo; } //------------------------------------------------------------------------------ /** */ inline bool CWzAniState::HasAnimation() const { return ( m_pAnimationInfo != NULL ); } //------------------------------------------------------------------------------ /** */ inline CWzdBase* CWzAniState::GetAnimationData() const { return m_pWzdAnimation; } //------------------------------------------------------------------------------ /** */ inline void CWzAniState::SetDeltaBlend( bool b ) { m_bDeltaBlend = b; } //------------------------------------------------------------------------------ /** */ inline float CWzAniState::GetMaxFrame() const { return m_fMaxFrame; } //------------------------------------------------------------------------------ /** */ inline void CWzAniState::SetCurFrame( float fFrame ) { WzAssert( fFrame >= 0.0f ); m_fCurFrame = max( 0.0f, fFrame ); } //------------------------------------------------------------------------------ /** */ inline float CWzAniState::GetSpeedRatio() const { return m_fSpeedRatio; } //------------------------------------------------------------------------------ /** */ inline bool CWzAniState::GetAniLoop() const { return m_bLoopAni; } //------------------------------------------------------------------------------ /** */ inline float CWzAniState::GetCurFrame() const { return m_fCurFrame; } //------------------------------------------------------------------------------ /** */ inline int CWzAniState::GetBlendBoneIndex() const { return m_nBlendBoneIdx; } //------------------------------------------------------------------------------ /** */ inline bool CWzAniState::GetDeltaBlend() const { return m_bDeltaBlend; } //------------------------------------------------------------------------------ /** */ inline void CWzAniState::SetStartIpolFrame( int nFrame ) { // xxx: SetAnimationInfo() ÈÄ, ProgressFrame() Àü¿¡ È£ÃâµÇ¾î¾ß ÇÔ if( m_pAnimationInfo ) { m_nIpolFrame = nFrame; } } //------------------------------------------------------------------------------ /** */ inline void CWzAniState::SetEndIpolFrame( int nFrame ) { if( m_pAnimationInfo ) { m_nEndIpolFrame = max( 0, nFrame ); } } //------------------------------------------------------------------------------ /** */ inline bool CWzAniState::IsInterpolating() const { return (m_ipolState == IS_IPOL_ING); } //------------------------------------------------------------------------------ /** */ inline void CWzAniState::SetCallback( CWzAniStateCB* pCB ) { m_pCallback = pCB; } #endif // _3DFILEACCESS_WZANISTATE_H_