📄 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 );
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -