📄 allocatehierarchy.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 + -