www.pudn.com > Game_11.rar > SkinMesh.h


// SkinMesh.h: interface for the CSkinMesh class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#if !defined(AFX_SKINMESH_H__AE3ADAAF_4BE2_4B23_9A1D_9379FA1BAFD9__INCLUDED_) 
#define AFX_SKINMESH_H__AE3ADAAF_4BE2_4B23_9A1D_9379FA1BAFD9__INCLUDED_ 
 
#if _MSC_VER > 1000 
#pragma once 
#endif // _MSC_VER > 1000 
 
#include  
//#include  
#include  
//#include "DXUtil.h" 
#define SAFE_DELETE(p)       { if(p) { delete (p);     (p)=NULL; } } 
#define SAFE_DELETE_ARRAY(p) { if(p) { delete[] (p);   (p)=NULL; } } 
#define SAFE_RELEASE(p)      { if(p) { (p)->Release(); (p)=NULL; } } 
 
//----------------------------------------------------------------------------- 
// Name: struct D3DXFRAME_DERIVED 
// Desc: Structure derived from D3DXFRAME so we can add some app-specific 
//       info that will be stored with each frame 
//----------------------------------------------------------------------------- 
struct D3DXFRAME_DERIVED: public D3DXFRAME 
{ 
    D3DXMATRIXA16        CombinedTransformationMatrix; 
}; 
 
//----------------------------------------------------------------------------- 
// Name: struct D3DXMESHCONTAINER_DERIVED 
// Desc: Structure derived from D3DXMESHCONTAINER so we can add some app-specific 
//       info that will be stored with each mesh 
//----------------------------------------------------------------------------- 
struct D3DXMESHCONTAINER_DERIVED: public D3DXMESHCONTAINER 
{ 
    LPDIRECT3DTEXTURE9*  ppTextures;       // array of textures, entries are NULL if no texture specified     
                                 
    // SkinMesh info              
    LPD3DXMESH           pOrigMesh; 
    LPD3DXATTRIBUTERANGE pAttributeTable; 
    DWORD                NumAttributeGroups;  
    DWORD                NumInfl; 
    LPD3DXBUFFER         pBoneCombinationBuf; 
    D3DXMATRIX**         ppBoneMatrixPtrs; 
    D3DXMATRIX*          pBoneOffsetMatrices; 
    DWORD                NumPaletteEntries; 
    bool                 UseSoftwareVP; 
    DWORD                iAttributeSW;     // used to denote the split between SW and HW if necessary for non-indexed skinning 
}; 
 
// enum for various skinning modes possible 
enum METHOD  
{ 
    D3DNONINDEXED, 
    D3DINDEXED, 
    SOFTWARE, 
    NONE 
}; 
 
class CSkinMesh; 
 
//----------------------------------------------------------------------------- 
// Name: class CAllocateHierarchy 
// Desc: Custom version of ID3DXAllocateHierarchy with custom methods to create 
//       frames and meshcontainers. 
//----------------------------------------------------------------------------- 
class CAllocateHierarchy: public ID3DXAllocateHierarchy 
{ 
public: 
    STDMETHOD(CreateFrame)(THIS_ LPCTSTR Name, LPD3DXFRAME *ppNewFrame); 
    STDMETHOD(CreateMeshContainer)(THIS_ LPCTSTR Name, LPD3DXMESHDATA pMeshData, 
                            LPD3DXMATERIAL pMaterials, LPD3DXEFFECTINSTANCE pEffectInstances, DWORD NumMaterials,  
                            DWORD *pAdjacency, LPD3DXSKININFO pSkinInfo,  
                            LPD3DXMESHCONTAINER *ppNewMeshContainer); 
    STDMETHOD(DestroyFrame)(THIS_ LPD3DXFRAME pFrameToFree); 
    STDMETHOD(DestroyMeshContainer)(THIS_ LPD3DXMESHCONTAINER pMeshContainerBase); 
    CAllocateHierarchy(CSkinMesh *pSkinMesh) :m_pSkinMesh(pSkinMesh) {} 
 
public: 
	CSkinMesh*		m_pSkinMesh; 
}; 
 
 
class CSkinMesh   
{ 
public: 
	VOID SetAnim(BOOL bAnim); 
 
	VOID UpdateFrameMatrices( LPD3DXFRAME pFrameBase, LPD3DXMATRIX pParentMatrix ); 
	LPDIRECT3DVERTEXSHADER9 m_pIndexedVertexShader[4]; 
	D3DXMATRIXA16* m_pBoneMatrices; 
	UINT m_NumBoneMatricesMax; 
	METHOD m_SkinningMethod; 
	D3DCAPS9 					m_d3dCaps; 
    D3DXVECTOR3                 m_vObjectCenter;    // Center of bounding sphere of object 
    FLOAT                       m_fObjectRadius;    // Radius of bounding sphere of object 
	D3DXVECTOR3	m_vPos; 
 
	LPD3DXANIMATIONCONTROLLER GetAnimController() 
		{return m_pAnimController;}; 
 
	BOOL SetAnimationName(char *strAnimName) 
	{ 
		DWORD nAnimSet; 
		char strTempName[256]; 
		nAnimSet=m_pAnimController->GetNumAnimationSets(); 
		LPD3DXANIMATIONSET pAnimSet; 
 
		for(DWORD i=0;iGetAnimationSet(i,&pAnimSet); 
			strcpy(strTempName,	pAnimSet->GetName()); 
			if(strcmp(strAnimName,strTempName)==0)  
			{ 
 
				//m_pAnimController->RegisterAnimationSet(pAnimSet); 
				m_pAnimController->SetTrackAnimationSet(0,pAnimSet); 
 
				return TRUE; 
			 
			} 
 
		} 
		return FALSE; 
	 
	}; 
	void SetPosition(D3DXVECTOR3 &vPos) 
	{ 
		m_vPos=vPos;  
	 
	}; 
	void SetPosition(float x,float y,float z) 
	{ 
		m_vPos.x=x; 
		m_vPos.y=y; 
		m_vPos.z=z; 
	}; 
 
	VOID Render(float fTimeFromLastFrame,D3DXVECTOR3 vPos,float angle,float scale=1.0f); 
	HRESULT LoadFromXFile(char* strFileName); 
	HRESULT GenerateSkinnedMesh(D3DXMESHCONTAINER_DERIVED *pMeshContainer); 
 
	CSkinMesh(LPDIRECT3DDEVICE9 pD3DDevice); 
	virtual ~CSkinMesh(); 
protected: 
//	FLOAT						m_fRotateAngle; 
	BOOL						m_bMoving; 
	LPDIRECT3DDEVICE9			m_pd3dDevice; 
	LPD3DXFRAME					m_pFrameRoot; 
	LPD3DXANIMATIONCONTROLLER	m_pAnimController; 
    FLOAT						m_fElapsedTime;      // Time elapsed since last frame 
//    D3DXMATRIXA16               m_matView; 
 
	VOID DrawMeshContainer(LPD3DXMESHCONTAINER pMeshContainerBase, LPD3DXFRAME pFrameBase); 
	VOID DrawFrame(LPD3DXFRAME pFrame); 
	HRESULT SetupBoneMatrixPointersOnMesh( LPD3DXMESHCONTAINER pMeshContainerBase ); 
	HRESULT SetupBoneMatrixPointers( LPD3DXFRAME pFrame ); 
}; 
 
#endif // !defined(AFX_SKINMESH_H__AE3ADAAF_4BE2_4B23_9A1D_9379FA1BAFD9__INCLUDED_)