// wzunit.h #ifndef _3DFILEACCESS_WZUNIT_H_ #define _3DFILEACCESS_WZUNIT_H_ #include "wzunitsubtype.h" class WzAnimationInfo; class CWzArchive; class CWzdBase; //------------------------------------------------------------------------------ /** @class CWzUnit */ class CWzUnit { public: // »ý¼ºÀÚ/¼Ò¸êÀÚ CWzUnit(); virtual ~CWzUnit(); // ÀúÀå/·Îµå virtual BOOL Save( const char* lpszFilePath ); virtual BOOL Load( const char* lpszFilePath ); // Serialize virtual BOOL Serialize( CWzArchive* pArchive ); // »ý¼º/ÆÄ±« virtual BOOL Create(); virtual void Destroy(); // ÅëÁö virtual void OnNotify( int iCode, DWORD dwParam1, DWORD dwParam2 ); // ŸÀÔ ¼³Á¤/¾ò±â void SetType( WzID wiType ); WzID GetType() const; // Wzd ¼ö ¾ò±â int GetNumWzd() const; // ÃÖ°í ·¹º§(ÃÖ°í ³·Àº ǰÁú) ¾ò±â int GetMaxWzdLOD() const; // LOD ¸Þ½Ã ÆÄÀϸí Ãß°¡/¾ò±â WZ3DA_API void AddWzdFileName( const char* lpszFileName ); WZ3DA_API void GetWzdFileName( char* lpszDst, int iLOD = 0 ); // LOD ¸Þ½Ã ÇÚµé ¼³Á¤/¾ò±â void SetWzdHandle( HANDLE hWzd, int iLOD = 0 ); HANDLE GetWzdHandle( int iLOD = 0 ) const; // LOD ¸Þ½Ã Æ÷ÀÎÅÍ ¾ò±â CWzdBase* GetWzdPtr( int iLOD ); CWzdBase* GetValidWzdPtr(); // ¾Ö´Ï¸ÞÀÌ¼Ç ½ºÇÇµå ¼³Á¤/¾ò±â void SetAnimationSpeed( float fAnimationSpeed ); float GetAnimationSpeed() const; // ¾Ö´Ï¸ÞÀÌ¼Ç Á¤º¸ ¼ö ¾ò±â int GetCountAnimationInfo() const; // ¾Ö´Ï¸ÞÀÌ¼Ç Á¤º¸ Ãß°¡ WZ3DA_API void AddAnimationInfo( const WzAnimationInfo& ai ); // À妽º·Î ¾Ö´Ï¸ÞÀÌ¼Ç Á¤º¸ ¾ò±â WzAnimationInfo* GetAnimationInfoByIndex( int iIndex ); // ID·Î ¾Ö´Ï¸ÞÀÌ¼Ç Á¤º¸ ¾ò±â WZ3DA_API WzAnimationInfo* GetAnimationInfo( WzID wiAni ); // º» Á¤º¸ ¼ö ¾ò±â int GetCountBoneInfo() const; // º» Á¤º¸ Ãß°¡ WZ3DA_API void AddBoneInfo( const WzBoneInfo& bi ); // À妽º·Î º» Á¤º¸ ¾ò±â WzBoneInfo* GetBoneInfoByIndex( int iIndex ); // ID·Î º» Á¤º¸ ¾ò±â WZ3DA_API WzBoneInfo* GetBoneInfo( WzID wiBone ); // ¼­ºê ŸÀÔ ¼ö ¾ò±â int GetNumSubType() const; // ¼­ºê ŸÀÔ »ý¼º WZ3DA_API CWzUnitSubType* CreateSubType(); // ¼­ºê ŸÀÔ ¾ò±â CWzUnitSubType* GetSubType( int iSubType ); // ¸Þ½Ã ±×·ì À̸§ Á¤º¸ Ãß°¡ WZ3DA_API void AddMeshGroupNameInfo( const MeshGroupNameInfo& info ); // ¸Þ½Ã ±×·ì À̸§ Á¤º¸ ¾ò±â MeshGroupNameInfo* GetMeshGroupNameInfo( int iIndex ); // À̸§À¸·Î ¸Þ½Ã ±×·ì À妽º ¾ò±â WZ3DA_API int GetMeshGroupIndexByName( const char* pszMeshGroupName ); // µðÇ»Áî¸Ê Á¤º¸ ¼ö int GetDiffuseMapInfoCount() const; // µðÇ»Áî¸Ê Á¤º¸ Ãß°¡ WZ3DA_API void AddDiffuseMapInfo( int iIndex, const WzMappingInfo& mi ); // µðÇ»Áî¸Ê Á¤º¸ ¾ò±â WzMappingInfo* GetDiffuseMapInfo( int iIndex ); // ½ºÇÇŧ·¯¸Ê Á¤º¸ ¼ö ¾ò±â int GetSpecularMapInfoCount() const; // ½ºÇÇŧ·¯¸Ê Á¤º¸ Ãß°¡ WZ3DA_API void AddSpecularMapInfo( int iIndex, const WzMappingInfo& mi ); // ½ºÇÁŧ·¯¸Ê Á¤º¸ ¾ò±â WzMappingInfo* GetSpecularMapInfo( int iIndex ); // ³ë¸»¸Ê Á¤º¸ ¼ö ¾ò±â int GetNormalMapInfoCount() const; // ³ë¸»¸Ê Á¤º¸ Ãß°¡ WZ3DA_API void AddNormalMapInfo( int iIndex, const WzMappingInfo& mi ); // ³ë¸»¸Ê Á¤º¸ ¾ò±â WzMappingInfo* GetNormalMapInfo( int iIndex ); // ±Û·Î¿ì¸Ê Á¤º¸ ¼ö ¾ò±â int GetGlowMapInfoCount() const; // ±Û·Î¿ì¸Ê Á¤º¸ Ãß°¡ WZ3DA_API void AddGlowMapInfo( int iIndex, const WzMappingInfo& mi ); // ±Û·Î¿ì¸Ê Á¤º¸ ¾ò±â WzMappingInfo* GetGlowMapInfo( int iIndex ); // ³»ºÎ¸Ê Á¤º¸ ¼ö int GetInternalMapInfoCount() const; // ³»ºÎ¸Ê Á¤º¸ Ãß°¡ WZ3DA_API void AddInternalMapInfo( int iIndex, const WzMappingInfo& mi ); // ³»ºÎ¸Ê Á¤º¸ ¾ò±â WzMappingInfo* GetInternalMapInfo( int iIndex ); // ÇÊÅÍ Á¤º¸ Ãß°¡ WZ3DA_API void AddFilterInfo( int iIndex, const WzMappingInfo& fi ); // ÇÊÅÍ Á¤º¸ ¾ò±â WzMappingInfo* GetFilterInfo( int iIndex ); // ÅØ½ºÃ³ ¾Ö´Ï¸ÞÀÌ¼Ç¸Ê Á¤º¸ ¼ö int GetTexAniMapInfoCount() const; // ÅØ½ºÃ³ ¾Ö´Ï¸ÞÀÌ¼Ç¸Ê Á¤º¸ Ãß°¡ WZ3DA_API void AddTexAniMapInfo( int iIndex, const WzTexAniMappingInfo& tami ); // ÅØ½ºÃ³ ¾Ö´Ï¸ÞÀÌ¼Ç¸Ê Á¤º¸ ¾ò±â WzTexAniMappingInfo* GetTexAniMapInfo( int iIndex ); // ÅØ½ºÃ³ ¾Ö´Ï¸ÞÀ̼Ǽ Á¤º¸ ¼ö int GetCountTexAniSetInfo() const; // ÅØ½ºÃ³ ¾Ö´Ï¸ÞÀ̼Ǽ Á¤º¸ Ãß°¡ WZ3DA_API void AddTexAniSetInfo( const WzTexAniSetInfo& tasi ); // À妽º·Î ÅØ½ºÃ³ ¾Ö´Ï¸ÞÀ̼Ǽ Á¤º¸ ¾ò±â WzTexAniSetInfo* GetTexAniSetInfoByIndex( int iIndex ); // ID·Î ÅØ½ºÃ³ ¾Ö´Ï¸ÞÀ̼Ǽ Á¤º¸ ¾ò±â WZ3DA_API WzTexAniSetInfo* GetTexAniSetInfo( WzID wiID ); // ¹Ù¿îµù º¼·ý ¼³Á¤ void SetBoundingVolume( const BvAABB& bvAABB, const BvSphere& bvSphere ); // ¹Ù¿îµù ¹Ú½º ¾ò±â const BvAABB& GetBvAABB() const; // ¹Ù¿îµù ±¸ ¾ò±â const BvSphere& GetBvSphere() const; // ¹Ù¿îµù º¼·ýÀ» À§ÇÑ ±âÁØ º» ¼³Á¤ void SetBaseBoneIndexForBV( int iBoneIndex ); // ¹Ù¿îµù º¼·ýÀ» À§ÇÑ ±âÁØ º» ¾ò±â int GetBaseBoneIndexForBV() const; // ÀÚµ¿ ¹Ù¿îµùº¼·ý°»½Å »óÅ ¾ò±â BOOL GetAutoBvUpdate() const; // ÀÚµ¿ ¹Ù¿îµùº¼·ý°»½Å »óÅ ¼ÂÆÃ void SetAutoBvUpdate( BOOL bFlag ); // ÀÚµ¿ ¹Ù¿îµùº¼·ýº»¹øÈ£ ¾ò±â int GetAutoBvBone() const; // ÀÚµ¿ ¹Ù¿îµùº¼·ýº»¹øÈ£ ¼ÂÆÃ void SetAutoBvBone( int iBone ); // Ãß°¡ ¹Ù¿îµù º¼·ý ¼ö ¾ò±â int GetCountBVExtraInfo() const; // Ãß°¡ ¹Ù¿îµù º¼·ý Ãß°¡ WZ3DA_API void AddBVExtraInfo( const WzBVExtraInfo& bei ); // À妽º·Î Ãß°¡ ¹Ù¿îµù º¼·ý ¾ò±â WzBVExtraInfo* GetBVExtraInfoByIndex( int iIndex ); // À§Ä¡/ȸÀü ¿ÀÇÁ¼Â Á¤º¸ WzUnitTransformOffset* GetTransFormOffset(); // À¯´Ö ·Îµù »óÅ ¾ò±â ENUM_LOAD_STATE GetLoadState(); // °­Á¦ LOD Àû¿ë? bool IsLodByForce() const; private: // º¯¼ö ÃʱâÈ­ void InitVariables(); // ÇØÁ¦ void Release(); // WzdBase ã±â WZ3DA_API void FindWzdPtr( int iLOD ); // Wzd ·Îµù »óÅ Á¶»ç WZ3DA_API void CheckLoadState(); // Serialize Header BOOL SerializeHeader( CWzArchive* pArchive ); // Serialize Default Info BOOL SerializeDefaultInfo( CWzArchive* pArchive ); // Serialize LOD info BOOL SerializeLODInfo( CWzArchive* pArchive ); // xxx: ±âÁ¸ ȣȯ (Morph Mesh Info) BOOL SerializeMorphMeshInfo( CWzArchive* pArchive ); // Serialize Animation Info BOOL SerializeAnimInfo( CWzArchive* pArchive ); // Serialize Bone Info BOOL SerializeBoneInfo( CWzArchive* pArchive ); // Serialize Mapping Info BOOL SerializeMappingInfo( CWzArchive* pArchive ); // Serialize Combo Info BOOL SerializeComboInfo( CWzArchive* pArchive ); // Serialize Force LOD Info BOOL SerializeForceLODInfo( CWzArchive* pArchive ); // xxx: ±âÁ¸ ȣȯ (IK Info) BOOL SerializeIKInfo( CWzArchive* pArchive ); // Serialize BV Info BOOL SerializeBVInfo( CWzArchive* pArchive ); // Serialize SubType BOOL SerializeSubType( CWzArchive* pArchive ); // Serialize Mesh Group BOOL SerializeMeshGroup( CWzArchive* pArchive ); // Serialize UnitOffset BOOL SerializeUnitOffset( CWzArchive* pArchive ); protected: WzID m_wiType; int m_iNumWzd; char* m_pszWzdFile[WZ_MAX_LOD + 1]; HANDLE m_hWzd[WZ_MAX_LOD + 1]; CWzdBase* m_wzdPtr[WZ_MAX_LOD + 1]; float m_fAnimationSpeed; CWzArray m_arAniInfo; CWzArray m_arBoneInfo; CWzArray m_arSubType; CWzArray m_arMeshGroupName; CWzArray m_arDiffuseMapInfo; CWzArray m_arSpecularMapInfo; CWzArray m_arNormalMapInfo; CWzArray m_arGlowMapInfo; CWzArray m_arInternalMapInfo; CWzArray m_arFilterInfo; CWzArray m_arTexAniMapInfo; CWzArray m_arTexAniSetInfo; BOOL m_bHasBVInfo; BvAABB m_bvAABB; BvSphere m_bvSphere; WzUnitTransformOffset m_transformOffset; int m_iBaseBoneIndex; BOOL m_bAutoBvUpdate; int m_nAutoBvBone; CWzArray m_arBVExtraInfo; bool m_bLodByForce; ENUM_LOAD_STATE m_eLoadState; }; //------------------------------------------------------------------------------ /** */ inline void CWzUnit::SetType( WzID wiType ) { m_wiType = wiType; } //------------------------------------------------------------------------------ /** */ inline WzID CWzUnit::GetType() const { return m_wiType; } //------------------------------------------------------------------------------ /** */ inline int CWzUnit::GetNumWzd() const { return m_iNumWzd; } //------------------------------------------------------------------------------ /** */ inline int CWzUnit::GetMaxWzdLOD() const { return max( 0, m_iNumWzd - 1 ); } //------------------------------------------------------------------------------ /** */ inline void CWzUnit::SetWzdHandle( HANDLE hWzd, int iLOD ) { WzAssert( iLOD >= 0 && iLOD <= WZ_MAX_LOD ); m_hWzd[iLOD] = hWzd; FindWzdPtr( iLOD ); } //------------------------------------------------------------------------------ /** */ inline HANDLE CWzUnit::GetWzdHandle( int iLOD ) const { if( iLOD >= 0 && iLOD <= WZ_MAX_LOD ) { return m_hWzd[iLOD]; } return INVALID_HANDLE_VALUE; } //------------------------------------------------------------------------------ /** */ inline CWzdBase* CWzUnit::GetWzdPtr( int iLOD ) { if( iLOD >= 0 && iLOD < m_iNumWzd ) { if( !m_wzdPtr[iLOD] ) { FindWzdPtr( iLOD ); } return m_wzdPtr[iLOD]; } return NULL; } //------------------------------------------------------------------------------ /** */ inline CWzdBase* CWzUnit::GetValidWzdPtr() { // ÀÏ´Ü °¡Àå Ä÷¸®Æ¼ ÁÁÀº ³ÑÀ» º¸°í CWzdBase* pWzd = GetWzdPtr( 0 ); if( !pWzd && m_iNumWzd > 1 ) { // ¾øÀ¸¸é °¡Àå Ä÷¸®Æ¼ ³ª»Û ³ÑÀ¸·Î pWzd = GetWzdPtr( m_iNumWzd - 1 ); } return pWzd; } //------------------------------------------------------------------------------ /** */ inline void CWzUnit::SetAnimationSpeed( float fAnimationSpeed ) { WzAssert( fAnimationSpeed > 0.0f ); m_fAnimationSpeed = fAnimationSpeed; } //------------------------------------------------------------------------------ /** */ inline float CWzUnit::GetAnimationSpeed() const { return m_fAnimationSpeed; } //------------------------------------------------------------------------------ /** */ inline BOOL CWzUnit::GetAutoBvUpdate() const { return m_bAutoBvUpdate; } //------------------------------------------------------------------------------ /** */ inline void CWzUnit::SetAutoBvUpdate( BOOL bFlag ) { m_bAutoBvUpdate = bFlag; } //------------------------------------------------------------------------------ /** */ inline int CWzUnit::GetAutoBvBone() const { return m_nAutoBvBone; } //------------------------------------------------------------------------------ /** */ inline void CWzUnit::SetAutoBvBone( int iBone ) { m_nAutoBvBone = iBone; } //------------------------------------------------------------------------------ /** */ inline int CWzUnit::GetCountAnimationInfo() const { return m_arAniInfo.GetCount(); } //------------------------------------------------------------------------------ /** */ inline WzAnimationInfo* CWzUnit::GetAnimationInfoByIndex( int iIndex ) { if( iIndex >= 0 && iIndex < m_arAniInfo.GetCount() ) { return m_arAniInfo.Get( iIndex ); } return NULL; } //------------------------------------------------------------------------------ /** */ inline int CWzUnit::GetCountBoneInfo() const { return m_arBoneInfo.GetCount(); } //------------------------------------------------------------------------------ /** */ inline WzBoneInfo* CWzUnit::GetBoneInfoByIndex( int iIndex ) { if( iIndex >= 0 && iIndex < m_arBoneInfo.GetCount() ) { return m_arBoneInfo.Get( iIndex ); } return NULL; } //------------------------------------------------------------------------------ /** */ inline int CWzUnit::GetNumSubType() const { return m_arSubType.GetCount(); } //------------------------------------------------------------------------------ /** */ inline CWzUnitSubType* CWzUnit::GetSubType( int iSubType ) { if( iSubType >= 0 && iSubType < m_arSubType.GetCount() ) { return m_arSubType.Get( iSubType ); } return NULL; } //------------------------------------------------------------------------------ /** */ inline MeshGroupNameInfo* CWzUnit::GetMeshGroupNameInfo( int iIndex ) { if( iIndex >= 0 && iIndex < m_arMeshGroupName.GetCount() ) { return m_arMeshGroupName.Get( iIndex ); } return NULL; } //------------------------------------------------------------------------------ /** */ inline int CWzUnit::GetDiffuseMapInfoCount() const { return m_arDiffuseMapInfo.GetCount(); } //------------------------------------------------------------------------------ /** */ inline WzMappingInfo* CWzUnit::GetDiffuseMapInfo( int iIndex ) { if( iIndex >= 0 && iIndex < m_arDiffuseMapInfo.GetCount() ) { return m_arDiffuseMapInfo.Get( iIndex ); } return NULL; } //------------------------------------------------------------------------------ /** */ inline int CWzUnit::GetSpecularMapInfoCount() const { return m_arSpecularMapInfo.GetCount(); } //------------------------------------------------------------------------------ /** */ inline WzMappingInfo* CWzUnit::GetSpecularMapInfo( int iIndex ) { if( iIndex >= 0 && iIndex < m_arSpecularMapInfo.GetCount() ) { return m_arSpecularMapInfo.Get( iIndex ); } return NULL; } //------------------------------------------------------------------------------ /** */ inline int CWzUnit::GetNormalMapInfoCount() const { return m_arNormalMapInfo.GetCount(); } //------------------------------------------------------------------------------ /** */ inline WzMappingInfo* CWzUnit::GetNormalMapInfo( int iIndex ) { if( iIndex >= 0 && iIndex < m_arNormalMapInfo.GetCount() ) { return m_arNormalMapInfo.Get( iIndex ); } return NULL; } //------------------------------------------------------------------------------ /** */ inline int CWzUnit::GetGlowMapInfoCount() const { return m_arGlowMapInfo.GetCount(); } //------------------------------------------------------------------------------ /** */ inline WzMappingInfo* CWzUnit::GetGlowMapInfo( int iIndex ) { if( iIndex >= 0 && iIndex < m_arGlowMapInfo.GetCount() ) { return m_arGlowMapInfo.Get( iIndex ); } return NULL; } //------------------------------------------------------------------------------ /** */ inline int CWzUnit::GetInternalMapInfoCount() const { return m_arInternalMapInfo.GetCount(); } //------------------------------------------------------------------------------ /** */ inline WzMappingInfo* CWzUnit::GetInternalMapInfo( int iIndex ) { if( iIndex >= 0 && iIndex < m_arInternalMapInfo.GetCount() ) { return m_arInternalMapInfo.Get( iIndex ); } return NULL; } //------------------------------------------------------------------------------ /** */ inline WzMappingInfo* CWzUnit::GetFilterInfo( int iIndex ) { if( iIndex >= 0 && iIndex < m_arFilterInfo.GetCount() ) { return m_arFilterInfo.Get( iIndex ); } return NULL; } //------------------------------------------------------------------------------ /** */ inline int CWzUnit::GetTexAniMapInfoCount() const { return m_arTexAniMapInfo.GetCount(); } //------------------------------------------------------------------------------ /** */ inline WzTexAniMappingInfo* CWzUnit::GetTexAniMapInfo( int iIndex ) { if( iIndex >= 0 && iIndex < m_arTexAniMapInfo.GetCount() ) { return m_arTexAniMapInfo.Get( iIndex ); } return NULL; } //------------------------------------------------------------------------------ /** */ inline int CWzUnit::GetCountTexAniSetInfo() const { return m_arTexAniSetInfo.GetCount(); } //------------------------------------------------------------------------------ /** */ inline WzTexAniSetInfo* CWzUnit::GetTexAniSetInfoByIndex( int iIndex ) { if( iIndex >= 0 && iIndex < m_arTexAniSetInfo.GetCount() ) { return m_arTexAniSetInfo.Get( iIndex ); } return NULL; } //------------------------------------------------------------------------------ /** */ inline void CWzUnit::SetBoundingVolume( const BvAABB& bvAABB, const BvSphere& bvSphere ) { m_bvAABB = bvAABB; m_bvSphere = bvSphere; } //------------------------------------------------------------------------------ /** */ inline const BvAABB& CWzUnit::GetBvAABB() const { return m_bvAABB; } //------------------------------------------------------------------------------ /** */ inline const BvSphere& CWzUnit::GetBvSphere() const { return m_bvSphere; } //------------------------------------------------------------------------------ /** */ inline void CWzUnit::SetBaseBoneIndexForBV( int iBoneIndex ) { m_iBaseBoneIndex = iBoneIndex; } //------------------------------------------------------------------------------ /** */ inline int CWzUnit::GetBaseBoneIndexForBV() const { return m_iBaseBoneIndex; } //------------------------------------------------------------------------------ /** */ inline int CWzUnit::GetCountBVExtraInfo() const { return m_arBVExtraInfo.GetCount(); } //------------------------------------------------------------------------------ /** */ inline WzBVExtraInfo* CWzUnit::GetBVExtraInfoByIndex( int iIndex ) { if( iIndex >= 0 && iIndex < m_arBVExtraInfo.GetCount() ) { return m_arBVExtraInfo.Get( iIndex ); } return NULL; } //------------------------------------------------------------------------------ /** */ inline WzUnitTransformOffset* CWzUnit::GetTransFormOffset() { return &m_transformOffset; } //------------------------------------------------------------------------------ /** */ inline ENUM_LOAD_STATE CWzUnit::GetLoadState() { if( m_eLoadState != eLOAD_FULL ) { CheckLoadState(); } return m_eLoadState; } //------------------------------------------------------------------------------ /** */ inline bool CWzUnit::IsLodByForce() const { return m_bLodByForce; } #endif // _3DFILEACCESS_WZUNIT_H_