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;i GetAnimationSet(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_)