Files
2022-10-26 12:25:11 +08:00

211 lines
5.7 KiB
Objective-C

// wzdanimation.h
#ifndef _3DFILEACCESS_WZDANIMATION_H_
#define _3DFILEACCESS_WZDANIMATION_H_
#include "wzdbase.h"
//------------------------------------------------------------------------------
/**
@class CWzdAnimation
* 본(Bone)하고 노드(Node)하고 같은 의미
*/
class CWzdAnimation : public CWzdBase
{
public:
// 생성자/소멸자
CWzdAnimation();
virtual ~CWzdAnimation();
// 파괴
virtual void Destroy();
// 본 할당
virtual void AllocBones( WORD wNumNode );
// 본 정보 설정
virtual void SetBoneInfo( WORD wNode, int iParent, const char* lpszName = NULL );
// 본 수 얻기
virtual WORD GetNumNode() const;
// 본 리스트 얻기
virtual WzNode* GetBonesList() const;
// 추가 본 정보 리스트 얻기
virtual WzNodeExtra* GetBoneExtraInfoList() const;
// 본 구조 비교 (완벽하게 일치해야 함)
virtual BOOL CompareBoneStructure( const CWzdBase* pDest );
// 본 리스트 비교 (개수가 틀릴 수 있음)
virtual BOOL CompareBoneList( const CWzdBase* pDest );
// 키 프레임 할당
virtual void AllocKeyFrames();
// 키 변환 할당
virtual void AllocKeyTransforms( WORD wNode, WORD wNumFrame );
// 실제 프레임 번호 설정
virtual void SetRealFrame( WORD wNode, WORD wKeyFrame, WORD wRealFrame );
// 키 변환 정보 설정
virtual void SetKeyTransformInfo( WORD wNode,
WORD wFrame,
const WzVector& wvPos,
const WzQuaternion& wqRot );
// 키 프레임 리스트 얻기
virtual WzKeyFrame* GetKeyFramesList() const;
// 총 프레임 수 얻기
virtual WORD GetNumFrame() const;
// 해당 본 프레임 수 얻기
virtual WORD GetNumBoneFrame( WORD wNode ) const;
// 해당 프레임에서 전체 본 변환 얻기
virtual void CreateTransformArrayByFrame( WzTransform* pOutTform, float fFrame );
// 해당 프레임에서 해당 본 변환 얻기
virtual void CreateTransformByFrame( WzTransform* pOutTform, WORD wNode, float fFrame );
// 주어진 본 변환으로 최종 본 행렬 구하기
virtual void CalcTransformMatrixT( WzMatrix* pInOutMat,
const WzTransform* pInTform,
const WzTransformParam* pwtp );
// 애니메이션 보간 (A -> B)
virtual void AnimationSlerp( WzTransform* pOutTform,
const WzTransform* pwtA,
const WzTransform* pwtB,
float fWeight );
// 애니메이션 스피드 설정/얻기
virtual void SetAnimationSpeedRate( float fRate );
virtual float GetAnimationSpeedRate() const;
// ID 얻기/검사
virtual void GetIdentity( BYTE byIdentity[4] );
virtual BOOL CheckIdentity( const BYTE* byIdentity ) const;
protected:
// Serialize
virtual BOOL Serialize( CWzArchive* pArchive );
// Save (텍스트 버전)
BOOL Save_Text( CWzArchive* pArchive );
private:
// 변수 초기화 (가상 함수로 선언하지 말 것)
void InitVariables();
// 메모리 해제
void Release();
// 주어진 본 변환으로 최종 본 행렬 구하기
void CalcBoneTransformMatrixT( WORD wNode,
WzMatrix* pInOutMat,
const WzTransform* pInTform,
const WzTransformParam* pwtp = NULL );
protected:
WORD m_wNumNode;
WzNode* m_pNodeList;
WzNodeExtra* m_pNodeExList;
WzKeyFrame* m_pKeyFrameList;
bool* m_pbNodeTMCalc;
float m_fAniSpeedRate;
};
//------------------------------------------------------------------------------
/**
*/
inline void CWzdAnimation::GetIdentity( BYTE byIdentity[4] )
{
WzAssert( byIdentity );
memcpy( byIdentity, IDSTR_WZDANI, 4 );
}
//------------------------------------------------------------------------------
/**
*/
inline BOOL CWzdAnimation::CheckIdentity( const BYTE* byIdentity ) const
{
WzAssert( byIdentity );
return ( memcmp( IDSTR_WZDANI, byIdentity, 4 ) == 0 );
}
//------------------------------------------------------------------------------
/**
*/
inline WORD CWzdAnimation::GetNumNode() const
{
return m_wNumNode;
}
//------------------------------------------------------------------------------
/**
*/
inline WzNode* CWzdAnimation::GetBonesList() const
{
return m_pNodeList;
}
//------------------------------------------------------------------------------
/**
*/
inline WzNodeExtra* CWzdAnimation::GetBoneExtraInfoList() const
{
return m_pNodeExList;
}
//------------------------------------------------------------------------------
/**
*/
inline WzKeyFrame* CWzdAnimation::GetKeyFramesList() const
{
return m_pKeyFrameList;
}
//------------------------------------------------------------------------------
/**
*/
inline WORD CWzdAnimation::GetNumFrame() const
{
WzAssert( m_pKeyFrameList );
// 0번 본의 마지막 프레임의 Key(실제 프레임 번호) + 1
// (모든 본의 마지막 실제 프레임 번호는 같다)
return m_pKeyFrameList[0].m_pKeyTransforms[m_pKeyFrameList[0].m_wNumKey - 1].m_wKey + 1;
}
//------------------------------------------------------------------------------
/**
*/
inline WORD CWzdAnimation::GetNumBoneFrame( WORD wNode ) const
{
WzAssert( wNode < m_wNumNode );
WzAssert( m_pKeyFrameList );
return m_pKeyFrameList[wNode].m_wNumKey;
}
//------------------------------------------------------------------------------
/**
*/
inline void CWzdAnimation::SetAnimationSpeedRate( float fRate )
{
m_fAniSpeedRate = fRate;
}
//------------------------------------------------------------------------------
/**
*/
inline float CWzdAnimation::GetAnimationSpeedRate() const
{
return m_fAniSpeedRate;
}
#endif // _3DFILEACCESS_WZDANIMATION_H_