www.pudn.com > DZY_Game.rar > Game_SkinMesh.h


#pragma once 
#include "stdafx.h" 
#include "Game_Terrain.h" 
 
#define	D3DFVF_CUSTOM_BOUNDINGBOX D3DFVF_XYZ|D3DFVF_DIFFUSE 
 
struct D3DXFRAME_DERIVED: public D3DXFRAME{ 
    D3DXMATRIXA16        CombinedTransformationMatrix;//组合变换矩阵 
}; 
 
struct D3DXMESHCONTAINER_DERIVED: public D3DXMESHCONTAINER{ 
    LPDIRECT3DTEXTURE9*  ppTextures;               
    LPD3DXMESH           pOrigMesh; 
    LPD3DXATTRIBUTERANGE pAttributeTable; 
    DWORD                NumAttributeGroups;  
    DWORD                NumInfl; 
    LPD3DXBUFFER         pBoneCombinationBuf; 
    D3DXMATRIX**         ppBoneMatrixPtrs; 
    D3DXMATRIX*          pBoneOffsetMatrices; 
    DWORD                NumPaletteEntries; 
    bool                 UseSoftwareVP; 
    DWORD                iAttributeSW;  
}; 
 
enum METHOD { 
    D3DNONINDEXED, 
    D3DINDEXED, 
    SOFTWARE, 
    NONE 
}; 
 
class Game_SkinMesh; 
 
class CAllocateHierarchy: public ID3DXAllocateHierarchy{ 
	public: 
		STDMETHOD(CreateFrame)(THIS_ LPCSTR Name, LPD3DXFRAME *ppNewFrame); 
		STDMETHOD(CreateMeshContainer)(THIS_  
			LPCSTR Name,  
			CONST D3DXMESHDATA *pMeshData, 
			CONST D3DXMATERIAL *pMaterials,  
			CONST D3DXEFFECTINSTANCE *pEffectInstances,  
			DWORD NumMaterials,  
			CONST DWORD *pAdjacency,  
			LPD3DXSKININFO pSkinInfo,  
			LPD3DXMESHCONTAINER *ppNewMeshContainer); 
		STDMETHOD(DestroyFrame)(THIS_ LPD3DXFRAME pFrameToFree); 
		STDMETHOD(DestroyMeshContainer)(THIS_ LPD3DXMESHCONTAINER pMeshContainerBase); 
		CAllocateHierarchy(Game_SkinMesh *pSkinMesh) :m_pSkinMesh(pSkinMesh) {} 
 
		Game_SkinMesh*		m_pSkinMesh; 
}; 
 
//蒙皮动画 
class Game_SkinMesh  { 
	public: 
		char m_strAnim[256]; 
		BOOL m_bnextAnim; 
		//LPD3DXMESH  m_pAABBMesh; 
		BOOL m_MouseMove; 
		BOOL m_KeyMove; 
		D3DXVECTOR3 m_destpoint; 
 
		BOOL						m_isClone; 
		float						m_fDeathTime; 
		float						m_flotFrameTime; 
		FLOAT						m_floattimeNow; 
		FLOAT						m_fAngle; 
		FLOAT						m_fScale; 
		D3DXVECTOR3					m_vPos; 
		D3DXVECTOR3					m_vbornPos; 
		D3DXVECTOR3					m_vPosOld; 
		D3DXVECTOR3					m_vTarget; 
		bool						m_isMoving; 
		float						m_speed1;		//跑步速度 
		float						m_speed2;		//旋转速度 
		BOOL						m_bLoop;		// 是否循环播放 
		LPD3DXANIMATIONSET			m_pCurAnimSet;	// 当前动画 
		float					m_CurTime; 
		BOOL						m_bMoving; 
		BOOL						m_isAttacking; 
		BOOL						m_isdead; 
		BOOL						m_BoundingBox; 
		FLOAT						m_EXP; 
		FLOAT						m_MAXHP; 
		FLOAT						m_MAXMP; 
		FLOAT						m_MAXEXP; 
		FLOAT						m_CURHP; 
		FLOAT						m_CURMP; 
		FLOAT						m_CUREXP; 
		LPD3DXANIMATIONCONTROLLER					m_pAnimControllerSRC; 
 
		VOID SetPosition(D3DXVECTOR3 *pPos){m_vPos=*pPos;}; 
		VOID SetPosition(float x,float y,float z){m_vPos.x=x;m_vPos.y=y;m_vPos.z=z;}; 
		VOID SetDirection(float fAngle){m_fAngle=fAngle;}; 
		VOID SetScale(float s){m_fScale=s;}; 
 
		VOID RenderAABB(D3DXVECTOR3 *pVmin,D3DXVECTOR3 *pVmax); 
		VOID GetPosition(D3DXVECTOR3 *vPos); 
 
		const LPD3DXVECTOR3 GetPosition(); 
		VOID MoveFront(D3DXVECTOR3 *vDir); 
		VOID WalkFoward(float fDistance,Game_Terrain *Terrain); 
		VOID GetDirection2(D3DXVECTOR3 *vDir); 
		//VOID Render(float fElapsedAppTime,Game_Terrain *Terrain); 
		VOID SetLoop(BOOL bLoop); 
		BOOL IsAnimEnd(float& passTime); 
		VOID GetBoundingBox(D3DXVECTOR3 *vMin,D3DXVECTOR3 *vMax); 
		VOID Turn(float fAngle); 
		VOID Back(); 
		VOID SetAltitude(float y); 
		FLOAT DistanceOfTwoVec3(const D3DXVECTOR3 v1, const D3DXVECTOR3 v2); 
		FLOAT GetYaw(const D3DXVECTOR3 v1, const D3DXVECTOR3 v2); 
	public: 
		VOID SetAnim(BOOL bAnim); 
		BOOL InterSect( D3DVECTOR *pRayOrig,D3DVECTOR *pRayDir,D3DVECTOR* pVRet); 
		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;    // 物体的范围中心 
		FLOAT                       m_fObjectRadius;    // 物体的范围半径 
		D3DXVECTOR3                 m_vMin;    // 物体的范围中心的半径的最小值 
		D3DXVECTOR3                 m_vMax;    //物体的范围中心的半径的最大值 
		LPD3DXMESH  m_pAABBMesh; 
 
		//控制变换的动作 
		LPD3DXANIMATIONCONTROLLER GetAnimController(){return m_pAnimController;}; 
 
		BOOL SetAnimationName(char *strAnimName);//设置动作的名字 
		VOID	Render(float fTimeFromLastFrame,D3DXVECTOR3 vPos,float angle,float scale=1.0f,bool change=true);//渲染 
		HRESULT LoadFromXFile(WCHAR * strFileName,float scalex=0.5f,float scalez=0.5f);											   //导入文件 
		HRESULT GenerateSkinnedMesh(D3DXMESHCONTAINER_DERIVED *pMeshContainer);				   //产生蒙皮动画 
 
		Game_SkinMesh(); 
 
		HRESULT CalculateStaticBondingBox(LPD3DXFRAME pFrameBase, const LPD3DXVECTOR3 pVmin,const LPD3DXVECTOR3 pVmax);//绑定盒子 
		virtual ~Game_SkinMesh(); 
 
		LPD3DXANIMATIONCONTROLLER	m_pAnimController;	 //动画收集器对象 
		D3DXMATRIX                m_matWorld; 
	protected: 
		 
		LPD3DXFRAME					m_pFrameRoot; 
 
		FLOAT						m_fElapsedTime;      // Time elapsed since last frame 
 
 
		VOID DrawMeshContainer(LPD3DXMESHCONTAINER pMeshContainerBase, LPD3DXFRAME pFrameBase);		//设置Mesh 容器 
		VOID DrawFrame(LPD3DXFRAME pFrame); 
		HRESULT SetupBoneMatrixPointersOnMesh( LPD3DXMESHCONTAINER pMeshContainerBase ); 
		HRESULT SetupBoneMatrixPointers( LPD3DXFRAME pFrame ); 
};