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