|
发表于 2011-8-29 16:23:00
|
显示全部楼层
Re: 如何查看x文件和md2文件的内容呀?用记事本打开全是
那么好了,我们再来看看这如何载入一个数据块的数据,比如MESH啊,首先找到D3D文档中MESH模板的定义,不要告诉我这个你都不会找啊,MESH的定义是
template Mesh
{
<3D82AB44-62DA-11CF-AB39-0020AF71E433>
DWORD nVertices;
array Vector vertices[nVertices];
DWORD nFaces;
array MeshFace faces[nFaces];
[...]
}
有的人看到这里就傻了,他就说啊,这是啥意思呢,看不懂啊.其实你要是认真的看文档,里面啊讲得是一清二楚,所以我早就说过现在的人懒得像猪一样,什么都要送到嘴边才肯吃,自己不会找吃的啊,我觉得这真的是不知所谓啊.
那么这个 template Mesh 到底是什么意思呢?首先我们来看ID3DXFileData有Lock, Unlock两个方法,Lock方法返回了一个buffer,就是一块内存啊,这块内存呢它里面就存放了MESH的数据,怎么存放的,就按MESH的模板的定义来存放的,明白不明白?
我们来看看这个MESH模板的定义,首先呢,他是一个<3D82AB44-62DA-11CF-AB39-0020AF71E433>,这其实是一个GUID,我说你不用管这个,直接跳过它.下来呢,是一个 DWORD nVertices;这个意思就是说,有一个DWORD的变量,这个变量保存了顶点的数量.再下来啊,是一个array Vector vertices[nVertices];这其实就是一系列的顶点的数据,那么这个Vector又是什么呢?同样的道理,查文档,既然有MESH的模板定义,那它就有Vector的模板定义,对不对?啊,说到这里,聪明的人已经知道怎么加载了,啊,傻的人还是稀里糊涂啊,那么直接看一些代码吧
- bool LoadMesh( ID3DXFileData *pFileData )
- {
- const char * pBuf = NULL;
- SIZE_T totalSize = 0;
- SIZE_T readedSize = 0;
- HRESULT hr = pFileData->Lock( &totalSize, (LPCVOID*)&pBuf ); // 先获得这个数据块的buffer
- if ( FAILED(hr) )
- {
- return false;
- }
- else if ( totalSize == 0 || pBuf == NULL )
- {
- pFileData->Unlock();
- return false;
- }
- DWORD dwData = 0;
- dwData = *((DWORD*)pBuf); // 得到有多少个顶点
- pBuf += sizeof(DWORD);
- for ( DWORD i = 0; i < dwData; ++i ) // 逐个的载入顶点
- {
- XVERTEX ver;
- ::memcpy( &ver, pBuf, sizeof(XVERTEX) );
- pBuf += sizeof(XVERTEX);
- pMesh->vertexArray.push_back( ver );
- }
- // ..............
- // 下面还有很多代码,啊,我这里不写出来了,要不然让你养成这种抄代码的习惯
- }
复制代码 |
|