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

📄 allocatehierarchy.h

📁 骨骼动画 此程序演示了如何在你的游戏中使用骨骼动画技术。
💻 H
字号:
// 注释:天兵 zzprogram@126.com
/*
	当一个 CA1类继承自接口 IA1时,实现 IA1中的方法时,必须使用 STDMETHOD来修饰。

	相当于virtual   HRESULT   __stdcall 的宏。 因为这种类要与D3D的COM接口打交道,不仅仅在C++内部使用,
	所以,所有类方法必须做成stdcall的,可对外开放的。
	#define   STDMETHOD(method)               virtual   HRESULT   STDMETHODCALLTYPE   method   
	#define   STDMETHODCALLTYPE               __stdcall   

	这样当写一个函数:	STDMETHOD				 (op1)(int i);       
	展开后成为:		virtual HRESULT __stdcall op1 (int i);

	被这些修饰关键字修饰的函数,其参数都是从右向左通过堆栈传递的(__fastcall的前面部分由ecx,edx传),
	函数调用在返回前要清理堆栈,但由调用者还是被调用者清理不一定。
	stdcall是Pascal程序的缺省调用方式,通常用于Win32 Api中,函数采用从右到左的压栈方式,
	自己在退出时清空堆栈。VC将函数编译后会在函数名前面加上 下划线 前缀,在函数名后加上"@"和参数的字节数。 
	int f(void *p)  -->>   _f@4(在外部汇编语言里可以用这个名字引用这个函数)
*/

#ifndef __AllocateHierarchy_H__
#define __AllocateHierarchy_H__

#include <d3dx9.h>
#include <d3dx9mesh.h>
#include "SkinMesh.h"



class CSkinMesh;

//-----------------------------------------------------------------------------
// Name: class CAllocateHierarchy
// Desc: 该类继承自ID3DXAllocateHierarchy接口,重新封装了一些方法(创建框架、网格容器)
//-----------------------------------------------------------------------------

// 自定义数据容器CAllocateHierarchy,该类在X文件的加载过程中,自行分配层次数据空间。
// 它有4个成员函数,都是D3D接口提供的函数,并且都是虚函数。
// 记住,这个类的所有函数(除了构造函数)都是由D3D自动调用的(D3DXLoadMeshHierarchyFromX函数),
// D3D是怎么调用的?因为你提供了该对象指针给D3D的某个函数了,面向对象的概念再不懂,请坐时光器回到从前(啊哈哈哈~~~)
class CAllocateHierarchy: public ID3DXAllocateHierarchy
{
public:
	CAllocateHierarchy( CSkinMesh *pSkinMesh ) :m_pSkinMesh(pSkinMesh) {};				// 构造函数
    STDMETHOD(CreateFrame)( THIS_ LPCTSTR Name, LPD3DXFRAME *ppNewFrame );				// 创建网格模型的框架层次

//这里是Directx9.0b的创建网格容器方法
#if ((D3D_SDK_VERSION & 0xFF)==31)
    STDMETHOD(CreateMeshContainer)(THIS_ LPCTSTR Name, 
							LPD3DXMESHDATA pMeshData,
                            LPD3DXMATERIAL pMaterials, 
							LPD3DXEFFECTINSTANCE pEffectInstances, 
							DWORD NumMaterials, 
                            DWORD *pAdjacency, 
							LPD3DXSKININFO pSkinInfo, 
                            LPD3DXMESHCONTAINER *ppNewMeshContainer);
#else //这里是Directx9.0c的创建网格容器方法
    STDMETHOD(CreateMeshContainer)(THIS_ LPCSTR Name, 
							CONST D3DXMESHDATA *pMeshData,
							CONST D3DXMATERIAL *pMaterials, 
							CONST D3DXEFFECTINSTANCE *pEffectInstances, 
							DWORD NumMaterials, 
							CONST DWORD *pAdjacency, 
							LPD3DXSKININFO pSkinInfo, 
							LPD3DXMESHCONTAINER *ppNewMeshContainer);
#endif
    STDMETHOD(DestroyFrame)( THIS_ LPD3DXFRAME pFrameToFree );							// 释放框架
    STDMETHOD(DestroyMeshContainer)( THIS_ LPD3DXMESHCONTAINER pMeshContainerBase );	// 释放网格容器    

public:
	CSkinMesh*		m_pSkinMesh;
};


#endif

⌨️ 快捷键说明

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