www.pudn.com > Chesssource.rar > 3DMesh.h


#if !defined( _3DMESH_H_) 
#define _3DMESH_H_ 
 
typedef struct sMesh 
{ 
	char			*m_strName; 
 
	ID3DXMesh		*m_pMesh; 
	ID3DXMesh		*m_pSkinMesh; 
	ID3DXSkinInfo	*m_pSkinInfo; 
 
	DWORD			m_dwNumMaterials; 
	D3DMATERIAL9	*m_pmatMaterials; 
	IDirect3DTexture9 **m_pTextures; 
 
	DWORD			m_dwNumBones; 
	D3DXMATRIX		*m_matMatrices; 
	D3DXMATRIX		**m_matFrameMatrices; 
 
	D3DXVECTOR3		m_vecMin, m_vecMax; 
	float			m_fRadius; 
 
	sMesh			*m_pNext; 
 
	sMesh() 
	{ 
		m_strName			= NULL; 
		m_pMesh				= NULL; 
		m_pSkinMesh			= NULL; 
		m_pSkinInfo			= NULL; 
		m_dwNumMaterials	= 0; 
		m_pmatMaterials		= NULL; 
		m_pTextures			= NULL; 
		m_dwNumBones		= 0; 
		m_matMatrices		= NULL; 
		m_matFrameMatrices		= NULL; 
		m_vecMin.x = m_vecMin.y = m_vecMin.z = m_vecMax.x = m_vecMax.y = m_vecMax.z = 0.0f; 
		m_fRadius			= 0.0f; 
		m_pNext				= NULL; 
	} 
 
	~sMesh() 
	{ 
		delete [] m_strName; 
		SAFE_RELEASE( m_pMesh ); 
		SAFE_RELEASE( m_pSkinMesh ); 
		SAFE_RELEASE( m_pSkinInfo ); 
		delete [] m_pmatMaterials; 
		if( m_pTextures != NULL ) 
		{ 
			for( DWORD i=0; iFindMesh( strName )) != NULL ) 
				return pMesh; 
		} 
 
		return NULL; 
	} 
 
	DWORD GetNumMaterials() 
	{ 
		return m_dwNumMaterials; 
	} 
 
	D3DMATERIAL9 *GetMaterial( DWORD dwNum ) 
	{ 
		if( dwNum >= m_dwNumMaterials || m_pmatMaterials == NULL ) 
			return NULL; 
		return &m_pmatMaterials[dwNum]; 
	} 
 
	IDirect3DTexture9 *GetTexture( DWORD dwNum ) 
	{ 
		if( dwNum >= m_dwNumMaterials || m_pTextures == NULL ) 
			return NULL; 
		return m_pTextures[dwNum]; 
	} 
 
	void CopyFrameToBoneMatrices() 
	{ 
		DWORD i; 
 
		if( m_dwNumBones && m_matMatrices != NULL && m_matFrameMatrices != NULL ) 
		{ 
			for( i=0; iGetBoneOffsetMatrix(i), m_matFrameMatrices[i]); 
				else 
					D3DXMatrixIdentity( &m_matMatrices[i] ); 
			} 
		} 
 
		if( m_pNext != NULL ) 
			m_pNext->CopyFrameToBoneMatrices(); 
	} 
 
} sMesh; 
 
 
typedef struct sFrameMeshList 
{ 
	sMesh			*m_pMesh; 
	sFrameMeshList	*m_pNext; 
 
	sFrameMeshList() 
	{ 
		m_pMesh = NULL; 
		m_pNext	= NULL; 
	} 
 
	~sFrameMeshList() 
	{ 
		delete m_pNext; 
	} 
} sFrameMeshList; 
 
typedef struct sFrame 
{ 
	char		*m_strName; 
 
	sFrameMeshList	*m_pMeshList; 
 
	D3DXMATRIX	m_matCombined; 
	D3DXMATRIX	m_matTransformed; 
	D3DXMATRIX	m_matOriginal; 
 
	sFrame		*m_pParent; 
	sFrame		*m_pChild; 
	sFrame		*m_pSibling; 
 
	sFrame() 
	{ 
		m_strName = NULL; 
		m_pMeshList = NULL; 
		D3DXMatrixIdentity( &m_matCombined ); 
		D3DXMatrixIdentity( &m_matTransformed ); 
		D3DXMatrixIdentity( &m_matOriginal ); 
		m_pParent = m_pSibling = m_pChild = NULL; 
	} 
 
	~sFrame() 
	{ 
		delete m_strName; 
		delete m_pMeshList; 
		delete m_pChild; 
		delete m_pSibling; 
	} 
 
	sFrame *FindFrame( char *strName ) 
	{ 
		sFrame *pFrame; 
 
		if( strName == NULL ) 
			return this; 
 
		if( m_strName != NULL && !strcmp( strName, m_strName )) 
			return this; 
 
		if( m_pChild != NULL ) 
		{ 
			if(( pFrame = m_pChild->FindFrame( strName )) != NULL ) 
				return pFrame; 
		} 
 
		if( m_pSibling != NULL ) 
		{ 
			if(( pFrame = m_pSibling->FindFrame( strName )) != NULL ) 
				return pFrame; 
		} 
 
		return NULL; 
	} 
 
	void ResetMatrices() 
	{ 
		m_matTransformed = m_matOriginal; 
 
		if( m_pChild != NULL ) 
			m_pChild->ResetMatrices(); 
		if( m_pSibling != NULL ) 
			m_pSibling->ResetMatrices(); 
	} 
 
	void AddMesh( sMesh *pMesh ) 
	{ 
		sFrameMeshList *pList; 
		pList = new sFrameMeshList(); 
		pList->m_pMesh = pMesh; 
		pList->m_pNext = m_pMeshList; 
		m_pMeshList = pList; 
	} 
} sFrame; 
 
 
class cMesh 
{ 
private: 
	cGraphics *m_pGraphics; 
 
	DWORD		m_dwNumMeshes; 
	sMesh		*m_pMeshes; 
 
	DWORD		m_dwNumFrames; 
	sFrame		*m_pFrames; 
 
	D3DXVECTOR3 m_vecMin, m_vecMax; 
	float		m_fRadius; 
 
	void	ParseXFileData( IDirectXFileData *pDataObj, sFrame *pParentFrame, char *strTexturePath ); 
	void	MapFramesToBones( sFrame *pFrame ); 
 
public: 
	cMesh(); 
	~cMesh(); 
 
	BOOL IsLoaded(); 
 
	DWORD	GetNumFrames(); 
	sFrame	*GetParentFrame(); 
	sFrame	*GetFrame( char *strName ); 
 
	DWORD	GetNumMeshes(); 
	sMesh	*GetParentMesh(); 
	sMesh	*GetMesh( char *strName ); 
 
	BOOL	GetBounds( D3DXVECTOR3 *vecMin, D3DXVECTOR3 *vecMax, float *fRadius ); 
	BOOL	Load( cGraphics *pGraphics, char *strFilename, char *strTexturePath = ".\\"); 
	void	Free(); 
}; 
 
#endif