【转】D3DXLoadSkinMeshFromXof函数及.x在不同dx..

原文:http://zengwu3915.blog.163.com/blog/static/2783489720097414132811/
在看到《DirectX 角色扮演游戏编程》这书第二章中的.x程序,运行光盘上的代码出错
error C2664: 'D3DXLoadSkinMeshFromXof' : cannot convert parameter 1 from 'IDirectXFileData *' to 'LPD3DXFILEDATA'
后来才发现,这书上的代码都是DirectX9b版本的,而我用的是DirectX9c,因为9c是9b的升级版,不想用回9b了,于是想在9c中解决这个问题。
从DirectX SUMMER2004(dx9c)之后才增加了ID3DXFileData,网上都说它是原来IDirect3DFileData的升级,具体性能上有什么提高我也是不清楚,但是因为这个改动导致一些函数调用产生了挺郁闷的错误,首先是我现在遇到的这个D3DXLoadSkinMeshFromXof()函数了,还有一些与.x有关的一些函数也出现了问题,像D3DXLoadPatchMeshFromXof(),D3DXLoadMeshFromXof()等函数的参数改变了DX9.0B的版本是IDirect3DFileData的参数现在改成了ID3DXFileData。再者就是以前版本的遍历.X文件中的骨骼的函数改变了原先是通过IDirect3DFileData的是通过IDirectXFileEnumObject::GetNextDataObject()来查看下一个对象,现在是通过ID3DXFileEnumObject::GetChildren(获取总体节点个数)和ID3DXFileEnumObject::GetChild()(与GetNextDataObject()的作用差不多,但由以前的一个变成了二个函数,参数也不对了)之后其他的基本上就差不多是把IDirectX*****改成ID3DX****,当然还有部分原来的类型被废除了。
再说下遍历.X文件中的骨骼的函数吧,以《DirectX 角色扮演游戏编程》这书第二章中的.x程序为例
在9b版本中(部分代码)

IDirectXFile *pDXFile = NULL;
  IDirectXFileEnumObject *pDXEnum = NULL;
  IDirectXFileData *pDXData = NULL;
  sFrame *Frame;
… …
// Allocate a frame that becomes root

  Frame = new sFrame();

  // Loop through all objects looking for the frames and meshes

 while(SUCCEEDED(pDXEnum->GetNextDataObject(&pDXData))) {
    ParseXFileData(pDXData, Frame);
    ReleaseCOM(pDXData);
}


到9c版本中则改成(以下为本人在网上收信集资料,自己改的,并不是最好的,但能正常编释运行)

ID3DXFile *pDXFile = NULL;
    ID3DXFileEnumObject *pDXEnum = NULL;
    ID3DXFileData *pDXData = NULL;
sFrame *Frame;
… …

// allocate a Frame that becomes root

Frame = new sFrame();
// Loop through all objects looking for the frames and meshes

SIZE_T num_child;

// retrieve the number of children in this file data object

pDXEnum->GetChildren(&num_child);

// loop through all objects looking for the frames and meshes

for(SIZE_T i = 0; i < num_child; i++)
{
    // retrieves a child object in this file data object

    if(FAILED(pDXEnum->GetChild(i, &pDXData)))
        return NULL;
    // parse pDXFile data

    ParseXFileData(pDXData, Frame);
ReleaseCOM(pDXData)
}


都不知道微软玩什么,看上去只有更复杂,本人还不是很明白升级后有什么优点。
经过在网上乱逛,本人也只是大致了解这个的一些基本用法,致于性能上的区别还是不懂。先学会用,以后时间长了,用多了,慢慢的就会了解一些的。下面附上《DirectX 角色扮演游戏编程》这书第二章中的.x程序书中的dx9b版及本人修改的dx9c版本,希望对遇到同样问题的朋友有帮助,本代码仅供参考,有错误还请指出…

作者: escarp   发布时间: 2010-11-25