⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 skinmesh.h

📁 骨骼动画 此程序演示了如何在你的游戏中使用骨骼动画技术。
💻 H
字号:
//////////////////////////////////////////////////////////////////////
// SkinMesh.h: interface for the CSkinMesh class.
//
//////////////////////////////////////////////////////////////////////
#ifndef __SkinMesh_H__
#define __SkinMesh_H__

#if !defined(AFX_SKINMESH_H)
#define AFX_SKINMESH_H

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include <tchar.h>
#include <d3dx9.h>
#include <d3dx9mesh.h>

#include "AllocateHierarchy.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_EX
// Desc: 该结构体继承自D3DXFRAME,新加入一个框架的世界变换矩阵(框架的组合变换矩阵)
//-----------------------------------------------------------------------------
struct D3DXFRAME_EX: public D3DXFRAME
{
    D3DXMATRIXA16        CombinedTransformationMatrix;
};

//-----------------------------------------------------------------------------
// Name: struct D3DXMESHCONTAINER_EX
// Desc: 网格容器结构,该结构体继承自D3DXMESHCONTAINER,加入一些特定应用的信息
//-----------------------------------------------------------------------------
struct D3DXMESHCONTAINER_EX: public D3DXMESHCONTAINER
{
    LPDIRECT3DTEXTURE9*  ppTextures;			// 纹理数组指针,如果没有信息将指向NULL    
                                
    // 蒙皮信息             
    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;



//蒙皮动画
class CSkinMesh
{
public:
	CSkinMesh( LPDIRECT3DDEVICE9 pD3DDevice );														// 构造函数1
	//	CSkinMesh(LPDIRECT3DDEVICE9 pD3DDevice,char* strFileName);									// 构造函数2
	virtual ~CSkinMesh();																			// 析构函数

	VOID SetAnim( BOOL bAnim );																		// 设置动画
	BOOL CSkinMesh::InterSect( D3DVECTOR *pRayOrig, D3DVECTOR *pRayDir, D3DVECTOR* pVRet );			// 判断射线是否与...相交
	VOID UpdateFrameMatrices( LPD3DXFRAME pFrameBase, LPD3DXMATRIX pParentMatrix );					// 更新框架矩阵 @par1 框架指针,@par2父矩阵
	LPD3DXANIMATIONCONTROLLER GetAnimController() { return m_pIAnimController; };					// 取得动画控制器
	BOOL SetAnimationName( char *strAnimName );														// 设置动画名字
	//void SetPosition( D3DXVECTOR3 &vPos ) { m_vPos = vPos; };										// 设置模型位置

	VOID Render( float fTimeFromLastFrame, D3DXVECTOR3 vPos, float angle, float scale=1.0f );		// 渲染
	HRESULT LoadFromXFile( char* strFileName );														// 加载X文件
	HRESULT GenerateSkinnedMesh( D3DXMESHCONTAINER_EX *pMeshContainer );							// 生成蒙皮模型 @par1 网格容器
	HRESULT CalculateBondingBox( LPD3DXFRAME pFrameParent, D3DXVECTOR3 *pVmin, D3DXVECTOR3 *pVmax );// 计算模型的包围盒,通过参数返回包围盒数据

	// 以下为类数据成员
	//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_vMin;				// Center of bounding sphere of object
	D3DXVECTOR3				m_vMax;				// Center of bounding sphere of object
protected:
	VOID DrawMeshContainer(LPD3DXMESHCONTAINER pMeshContainerBase, LPD3DXFRAME pFrameBase);
	VOID DrawFrame(LPD3DXFRAME pFrame);
	HRESULT SetupBoneMatrixPointersOnMesh( LPD3DXMESHCONTAINER pMeshContainerBase );
	HRESULT SetupBoneMatrixPointers( LPD3DXFRAME pFrame );

	//	FLOAT						m_fRotateAngle;
	BOOL						m_bMoving;			// 是否正在移动
	LPDIRECT3DDEVICE9			m_pID3dDevice;		// 设备
	LPD3DXFRAME					m_pFrameRoot;		// 根框架
	LPD3DXANIMATIONCONTROLLER	m_pIAnimController;	// 动画控制器
	FLOAT						m_fElapsedTime;		// 单帧时间
};

#endif // !defined(AFX_SKINMESH_H__AE3ADAAF_4BE2_4B23_9A1D_9379FA1BAFD9__INCLUDED_)


#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -