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

333 lines
10 KiB
Objective-C

// wzdbase.h
#ifndef _3DFILEACCESS_WZDBASE_H_
#define _3DFILEACCESS_WZDBASE_H_
#include "wzdtypedef.h"
#include "wzdshareinfo.h"
#include <programcommon/discaccess.h>
#include <client/3dengine/common/wzbvtype.h>
class CWzArchive;
class CWzSilhouette;
class CWzShadowVolume;
//------------------------------------------------------------------------------
/**
@class CWzdBase
xxx: 여기에 하위 클래스에서만 쓰이는 함수들도 전부 다 있다.
이게 과연 좋은 방법인지는 모르겠지만, 외부 코드에서
CWzdBase 포인터를 가지고 하위 클래스들(ex : CWzdAnimation)
함수를 호출하고 있기 때문에, 당장 뺄 수도 없다.
* 본(Bone)하고 노드(Node)하고 같은 의미
*/
class CWzdBase
{
public:
// 생성자/소멸자
CWzdBase();
virtual ~CWzdBase() = 0;
// 로드
virtual BOOL Create( const char* lpszFileName, BYTE* pbyBuffer, int iSize );
virtual BOOL Create( const char* lpszFileName, DA_FILE dfFile );
virtual BOOL Create( const char* lpszFileName );
// 저장
virtual BOOL Save( const char* lpszFileName, BOOL bSaveText = FALSE );
virtual BOOL Save( const char* lpszFileName, DA_FILE dfFile, BOOL bSaveText = FALSE );
// 파괴
virtual void Destroy();
// -------- CWzdAnimation 관련 --------
// 본 할당
virtual void AllocBones( WORD wNumNode ) {}
// 본 정보 설정
virtual void SetBoneInfo( WORD wNode, int iParent, const char* lpszName = NULL ) {}
// 본 수 얻기
virtual WORD GetNumNode() const { return 0; }
// 본 리스트 얻기
virtual WzNode* GetBonesList() const { return NULL; }
// 추가 본 정보 리스트 얻기
virtual WzNodeExtra* GetBoneExtraInfoList() const { return NULL; }
// 본 구조 비교 (완벽하게 일치해야 함)
virtual BOOL CompareBoneStructure( const CWzdBase* pDest ) { return FALSE; }
// 본 리스트 비교 (개수가 틀릴 수 있음)
virtual BOOL CompareBoneList( const CWzdBase* pDest ) { return FALSE; }
// 키 프레임 할당
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 { return NULL; }
// 총 프레임 수 얻기
virtual WORD GetNumFrame() const { return 0; }
// 해당 본 프레임 수 얻기
virtual WORD GetNumBoneFrame( WORD wNode ) const { return 0; }
// 해당 프레임에서 전체 본 변환 얻기
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 { return 1.0f; }
// -------- CWzdMeshConstructor 관련 --------
// 메시 할당
virtual BOOL AllocForMesh() { return FALSE; }
// 삼각형 추가
virtual void AddTriangle( const char* lpszTexture,
const WzSkinningInfo wsi[3],
const WzVector wvPosWorld[3],
const WzVector wvNormal[3],
const WzUVVert wuvVert[3],
const char* lpszSpecularTexture,
const DWORD dwColor[3],
const DWORD dwColor2[3] ) {}
// 버텍스 수 얻기
virtual int GetNumberOfVertex() const { return 0; }
// 버텍스 리스트 얻기
virtual WzMeshVertex* GetVertexList() const { return NULL; }
// 전체 메시 그룹 수 얻기
virtual int GetNumberOfMeshGroup() const { return 0; }
virtual int GetMaxMeshGroup() const { return 0; }
// 메시 그룹 정보 얻기
virtual WzMeshGroup* GetMeshGroupInfo( int iMeshGroup ) const { return NULL; }
// 전체 버텍스팩 수 얻기
virtual DWORD GetTotalVertPack() const { return 0; }
// 블랜딩 수 얻기
virtual int GetBlendedCount() const { return 0; }
// 스키닝 정보 얻기
virtual WzSkinningInfo* GetSkinningInfo() const { return NULL; }
// -------- CWzdMesh 관련 --------
// 기본 본 행렬로 최종 본 행렬 구하기
virtual void CalcTransformMatrixD( WzMatrix* pInOutMat,
const WzTransformParam* pwtp ) {}
// 스키닝 행렬 구하기
virtual void CalcSkinMatrix( WzMatrix* pOutMat, const WzMatrix* pInTformMat ) {}
// 기본 본 행렬의 역행렬 얻기 (스키닝 행렬 구할때 필요)
virtual const WzMatrix* GetInverseOfDefaultTransform() const { return NULL; }
// 실루엣 생성
virtual void CreateSilhouette( CWzSilhouette* pwsSilhouette,
const WzVector& wvRay,
const WzVector* pwvTransformedVertex ) {}
// 실루엣 파괴
virtual void DestroySilhouette( CWzSilhouette* pwsSilhouette ) {}
// 셰도우 볼륨 생성
virtual void CreateShadowVolume( CWzShadowVolume* pwsvShadowVolume,
const WzVector& wvRay,
const WzVector* pwvTransformedVertex,
DWORD dwOption = 0 ) {}
// 셰도우 볼륨 파괴
virtual void DestroyShadowVolume( CWzShadowVolume* pwsvShadowVolume ) {}
// 버텍스 셰이더 상수 정보 생성
virtual BOOL CreateVertexShaderConstantInfo( int iMeshGroup, int iNumGroup ) { return FALSE; }
// 버텍스 셰이더 상수 정보 채우기
virtual void FillVertexShaderConstantInfo( int iMeshGroup, int iGroup, int iCountBone, int* piBoneList ) {}
// 버텍스 버퍼 설정/얻기
virtual void SetOwnVertexBuffer( int iMeshGroup, HANDLE hOwnVertexBuffer ) {}
virtual HANDLE GetOwnVertexBuffer( int iMeshGroup ) const { return INVALID_HANDLE_VALUE; }
// 인덱스 버퍼 설정/얻기
virtual void SetOwnIndexBuffer( int iMeshGroup, HANDLE hOwnIndexBuffer ) {}
virtual HANDLE GetOwnIndexBuffer( int iMeshGroup ) const { return INVALID_HANDLE_VALUE; }
// 바운딩 박스 얻기
virtual const BvAABB& GetBvAABB() const { static BvAABB dummy; return dummy; }
// 바운딩 구 얻기
virtual const BvSphere& GetBvSphere() const { static BvSphere dummy; return dummy; }
// -------- 기타 --------
// ID 얻기/검사
virtual void GetIdentity( BYTE byIdentity[4] );
virtual BOOL CheckIdentity( const BYTE* byIdentity ) const;
// 파일명 얻기
const char* GetFileName() const;
// 버전 얻기
WORD GetVersion() const;
// 플래그 설정/해제/검사
void SetFlag( DWORD dwFlag );
void UnsetFlag( DWORD dwFlag );
BOOL CheckFlag( DWORD dwFlag ) const;
// DiscAccess 설정
static void SetDiscAccess( CDiscAccess* pDiscAccess );
// DiscAccess 존재 여부
static CDiscAccess* CheckDiscAccessExistence();
// 스키닝 인덱스 -> 본 인덱스
static int SkinningIndexToBoneIndex( int iIndex );
// 본 인덱스 -> 스키닝 인덱스
static int BoneIndexToSkinningIndex( int iIndex );
protected:
// Serialize
virtual BOOL Serialize( CWzArchive* pArchive );
private:
// 변수 초기화 (가상 함수로 선언하지 말 것)
void InitVariables();
// 메모리 해제
void Release();
protected:
static CDiscAccess* s_pDiscAccess;
char m_szFileName[MAX_PATH];
WORD m_wVersion;
DWORD m_dwFlags;
BOOL m_bSaveText;
};
//------------------------------------------------------------------------------
/**
*/
inline void CWzdBase::GetIdentity( BYTE byIdentity[4] )
{
// empty
}
//------------------------------------------------------------------------------
/**
*/
inline BOOL CWzdBase::CheckIdentity( const BYTE* byIdentity ) const
{
return FALSE;
}
//------------------------------------------------------------------------------
/**
*/
inline const char* CWzdBase::GetFileName() const
{
return &m_szFileName[0];
}
//------------------------------------------------------------------------------
/**
*/
inline WORD CWzdBase::GetVersion() const
{
return m_wVersion;
}
//------------------------------------------------------------------------------
/**
*/
inline void CWzdBase::SetFlag( DWORD dwFlag )
{
m_dwFlags |= dwFlag;
}
//------------------------------------------------------------------------------
/**
*/
inline void CWzdBase::UnsetFlag( DWORD dwFlag )
{
m_dwFlags &= ~dwFlag;
}
//------------------------------------------------------------------------------
/**
*/
inline BOOL CWzdBase::CheckFlag( DWORD dwFlag ) const
{
return ( ( m_dwFlags & dwFlag ) == dwFlag );
}
//------------------------------------------------------------------------------
/**
*/
inline void CWzdBase::SetDiscAccess( CDiscAccess* pDiscAccess )
{
s_pDiscAccess = pDiscAccess;
}
//------------------------------------------------------------------------------
/**
*/
inline CDiscAccess* CWzdBase::CheckDiscAccessExistence()
{
if( !s_pDiscAccess )
{
static CDiscAccess s_discAccess;
s_pDiscAccess = &s_discAccess;
}
return s_pDiscAccess;
}
//------------------------------------------------------------------------------
/**
*/
inline int CWzdBase::SkinningIndexToBoneIndex( int iIndex )
{
return ( -iIndex - 1 );
}
//------------------------------------------------------------------------------
/**
*/
inline int CWzdBase::BoneIndexToSkinningIndex( int iIndex )
{
return ( -iIndex - 1 );
}
#endif // _3DFILEACCESS_WZDBASE_H_