详解.X文件.doc_第1页
详解.X文件.doc_第2页
详解.X文件.doc_第3页
详解.X文件.doc_第4页
详解.X文件.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

X文件的使用(完整) 有很多朋友也许想更加了解X文件,正好,本文将全面的介绍X文件的使用。我想这是一篇纯技术性的文档,我就不加以诗篇歌颂润色了。相信读我的文章,就像啃牙签;)好了,我们板起面孔。首先给你一个完整的印象-传说中的X文件:xof 0302txt 0032 template Header DWORD major;DWORD minor;DWORD flags;template Frame FrameTransformMatrixMeshHeader 1;0;1;Frame Scene_Root FrameTransformMatrix 1.000000, 0.000000, 0.000000, 0.000000,0.000000, 1.000000, 0.000000, 0.000000,0.000000, 0.000000, 1.000000, 0.000000,0.000000, 0.000000, 0.000000, 1.000000; Frame Pyramid_Frame FrameTransformMatrix 1.000000, 0.000000, 0.000000, 0.000000,0.000000, 1.000000, 0.000000, 0.000000,0.000000, 0.000000, 1.000000, 0.000000,0.000000, 0.000000, 0.000000, 1.000000;Mesh PyramidMesh 5;0.00000;10.00000;0.00000;,-10.00000;0.00000;10.00000;,10.00000;0.00000;10.00000;,-10.00000;0.00000;-10.00000;,10.00000;0.00000;-10.00000;6;3;0,1,2;,3;0,2,3;,3;0,3,4;,3;0,4,1;,3;2,1,4;,3;2,4,3;MeshMaterialList 1;6;0,0,0,0,0,0;Material Material0 1.000000; 1.000000; 1.000000; 1.000000;0.000000;0.050000; 0.050000; 0.050000;0.000000; 0.000000; 0.000000; xof 0302txt 0032xof表示这是一个真正的X文件。0302txt表示通知程序使用Directx的X文件,版本为3.2的模版,其中txt表示此文件为文本文件,可读,并非是一个2进制文件。0032表示一个浮点数的位数为32,如果想要用64位的浮点数,可以写成0064。下面将分别介绍各个主题。声明一个模版:假设声明 template ContactEntry 首先需要用guidgen.exe产生一个GUID。产生的GUID如下:/ 4C9D055B-C64D-4bfe-A7D9-981F507E45FFDEFINE_GUID(,0x4c9d055b, 0xc64d, 0x4bfe, 0xa7, 0xd9, 0x98, 0x1f, 0x50, 0x7e, 0x45, 0xff);之后需要在程序代码中加入:#include initguid.h/ At beginning of source code file - add DEFINE_GUIDsDEFINE_GUID(ContactEntry, 0x4c9d055b, 0xc64d, 0x4bfe, 0xa7, 0xd9, 0x98, 0x1f, 0x50, 0x7e, 0x45, 0xff);还要在X文件中加入:template ContactEntry 声明模版用到的数据类型:关键字 描述WORD 16-bit value (short)DWORD32-bit value (32-bit int or long)FLOATIEEE float value (float)DOUBLE 64-bit floating-point value (double)CHAR 8-bit signed value (signed char)UCHAR8-bit unsigned value (unsigned char)BYTE 8-bit unsigned value (unsigned char)STRING A NULL-terminated string (char)arraySignifies an array of following data type to follow ()举例:DWORD value; array STRING Text20;/定义一个名为Text的数组,类型为STRING,大小为20。DWORD ArraySize; array STRING NamesArraySize; /可以将大小设置为变量。声明一个ContactEntry模版:template ContactEntry STRING Name; / The contacts nameSTRING PhoneNumber; / The contacts phone numberDWORD Age; / The contacts age实例化一个模版对象:ContactEntry JimsEntry Jim Adams;(800) 555-1212;30;JimsEntry 可以用这样的形式引用一个数据对象。例如,在一个animation sequence template中引用一个Frame data object做为其内嵌数据对象。也可以利用引用表示一个数据对象的副本,没有必要重复书写这个数据对象。内嵌数据对象和模版约束:template ClosedTemplate DWORD ClosedData;template OpenTemplate DWORD OpenData;.template RestrictedTemplate DWORD RestrictedData;ClosedTemplateOpenTemplateClosedTemplate是标准的模版声明。OpenTemplate中包含一个.,表示这是一个开放模版。开放模版允许在中内嵌任何数据对象。例如,你可以实例化OpenTemplate,在里面定义一个OpenData变量和内嵌一个ClosedTemplate的实例。RestrictedTemplate为约束模版。约束模版实例化时只允许包含它列出的数据对象,如,不能在RestrictedTemplate包含ClosedTemplate,OpenTemplate以外的数据对象。用DirectX .X Standard Templates工作:X文件广泛用于包含一个mesh信息。一个Standard Templates包含了过多的信息。Table 3.2: DirectX .X Standard TemplatesTemplate Name DescriptionAnimation:Defines animation data for a single frame.AnimationKey: Defines a single key frame for the parent animation template.AnimationOptions: Contains animation playback information.AnimationSet: Contains a collection of animation templates.Boolean:Holds a Boolean value.Boolean2d:Holds two Boolean values.ColorRGB: Contains red, green, and blue color values.ColorRGBA:Contains red, green, blue, and alpha color values.Coords2d: Defines two coordinate values.FloatKeys:Contains an array of floating-point values.FrameTransformMatrix: Holds the transformation matrix for a parent Frame template.Frame:A frame-of-reference template that defines a hierarchy.Header: The .X file header that contains version numbers.IndexedColor: Contains an indexed color value.Material: Contains material color values.Matrix4x4:Holds a 4x4 homogenous matrix container.Mesh: Contains a single meshs data.MeshFace: Holds a meshs face data.MeshFaceWraps:Contains the texture wrapping for mesh faces.MeshMaterialList: Contains the material for face-mapping values.MeshNormals:Holds normals used for mesh data.MeshTextureCoords:Holds texture coordinates used for mesh data.MeshVertexColors: Holds vertex color information used for mesh vertices.Patch:Defines a control patch.PatchMesh:Contains a patch mesh (much like the Mesh template).Quaternion: Holds a quaternion value.SkinWeights:Contains an array of weight values mapped to a meshs vertices. Used in skinned meshes.TextureFilename:Contains the texture file name to use for a material.TimedFloatKeys: Contains an array of FloatKeys templates.Vector: Holds a 3D coordinate value.VertexDuplicationIndices: Informs you which vertices are duplicates of other vertices.XSkinMeshHeader:Used by skinned meshes to define the number of bones contained in a mesh.在rmxfguid.h中定义了各个模版的宏,例如:/* 3D82AB44-62DA-11cf-AB39-0020AF71E433 */DEFINE_GUID(TID_D3DRMMesh,0x3d82ab44, 0x62da, 0x11cf, 0xab, 0x39, 0x0, 0x20, 0xaf, 0x71, 0xe4, 0x33);每个模版名加上前缀TID_D3DRM就是宏定义名。访问.X文件:访问任何X文件首先要调用DirectXFileCreate函数创建一个IDirectXFile接口。IDirectXFile *pDXFile = NULL;HRESULT Result = DirectXFileCreate(&pDXFile);/用&pDXFile返回指向接口的指针。用SUCCEEDED或者FAILED宏判断返回值是否有效。注册一个定制ro标准模版:你可以把X文件中的模版移除,直接在代码里定义那些模版。IDirectXFile接口支持这样的特性。需要调用IDirectXfile:RegisterTemplates函数。HRESULT IDirectXfile:RegisterTemplates(LPVOID pvData, / 一个定义模版数据的缓存,应该精确无误。DWORD cbSize); / pvData缓存的字节数。可以如下定义一个模版数据的缓存:char *Templates = xof 0303txt 0032 /标准X文件头。template CustomTemplate DWORD Length; array DWORD valuesLength; ;之后在用RegisterTemplates将其注册:pFile-RegisterTemplates(Templates, strlen(Templates);注册标准模版:首先需要在代码中包含rmxfguid.h和rmxftmpl.h。rmxfguid.h定义了各个标准模版的GUDI,rmxftmpl.h以2进制数据形式定义了标准模版数据的缓存和其字节数。然后调用RegisterTemplates将其注册:pFile-RegisterTemplates(D3DRM_XTEMPLATES, D3DRM_XTEMPLATE_BYTES);打开X文件:创建完IDirectXFile接口,注册模版之后需要打开X文件,枚举其数据对象。调用IDirectXfile:CreateEnumObject函数。HRESULT IDirectXfile:CreateEnumObject(LPVOID pvSource, / .X filenameDXFILELOADOPTIONS dwLoadOptions, / Load optionsLPDIRECTXFILEENUMOBJECT* ppEnumObj); / Enum interface当调用CreateEnumObject函数,用pvSource指定一个文件的名字,用ppEnumObj返回一个枚举对象接口指针。用dwLoadOptions指定load操作方式。当指定DXFILELOAD_FROMFILE值,告诉DirectX从磁盘载入一个文件。还有DXFILELOAD_FROMRESOURCE,DXFILELOAD_FROMMEMORY和DXFILELOAD_FROMURL分别表示从一个资源,内存缓冲和Internet上加载X文件。当从Internet加载文件时,需要为其指定完整的网址。下面代码从磁盘加载X文件:/ Filename = filename to load (test.x for example)IDirectXFileEnumObject *pEnum;pFile-CreateEnumObject(LPVOID)Filename, DXFILELOAD_FROMFILE, &pEnum);Filename指向一个有效的文件名,pEnum返回一个枚举对象接口指针。枚举数据对象:注册完模版,打开X文件并且得到一个枚举对象接口,下面需要从X文件读出数据。枚举对象接口指针指向文件的第一个数据对象,因为每一个数据对象可能包含内嵌数据对象或者引用的数据对象,所以与第一个数据对象同在一层级的其它数据对象为同层级数据对象。至于包含的子数据对象的类型,需要对其分别的行进询问。可以用 HRESULT IDirectXFileEnumObject:GetNextDataObject(LPDIRECTXFILEDATA*ppDataObj)得到一个IDirectXFileData接口。它只有一个参数,如下:IDirectXFileData *pData;HRESULT hr = pEnum-GetNextDataObject(&pData);利用此函数,可以不断地访问同一层级的数据对象接口,具体代码如下:while(SUCCEEDED(pEnum-GetNextDataObject(&pData) / 这里可以对pData数据对象进行操作。pData-Release();/释放接口。当返回值为FAILED,表示已经访问完所有的接口。当访问值为SUCCEEDED,你需要继续判断这个数据对象是否包含子对象。利用接口IDirectXFileObject,和HRESULT IDirectXFileData:GetNextObject( LPDIRECTXFILEOBJECT* ppChildObj)函数,代码如下:IDirectXFileObject *pObject;while(SUCCEEDED(pData-GetNextObject(&pObject) / 如果一个子对象存在,需要继续询问它,判断出它的类型为内嵌数据对象或者引用的数据对象。pObject-Release();/ 释放接口。接下来询问接口,看其是否为内嵌数据对象:IDirectXFileData *pSubData;if(SUCCEEDED(pObject-QueryInterface( IID_IDirectXFileData, (void*)&pSubData) / 如果询问内嵌数据对象成功,可以对pSubData数据对象进行操作pSubData-Release();/释放接口。看其是否为引用数据对象:IDirectXFileDataReference *pRef;IDirectXFileData *pSubData;if(SUCCEEDED(pSubObj-QueryInterface( IID_IDirectXFileDataReference, (void*)&pRef) / 如果询问引用的数据对象成功,解析出引用的原型。pRef-Resolve(&pSubData);/这里可以对pData数据对象进行操作。pRef-Release();pSubData-Release();/释放接口。现在整理下思路:大体的思路其实很简单,首先枚举最顶层的数据对象,然后判断其是否有子对象,这个子对象可能是内嵌对象或者引用对象二者之一,分别询问其接口,就可以判断出具体的类型。下面是完整的Parse模版的函数:BOOL Parse(char *Filename)IDirectXFile *pFile = NULL;IDirectXFileEnumObject *pEnum = NULL;IDirectXFileData *pData = NULL;if(FAILED(DirectXFileCreate(&pFile)return FALSE;/注册标准模版。if(FAILED(pFile-RegisterTemplates( (LPVOID)D3DRM_XTEMPLATES, D3DRM_XTEMPLATE_BYTES)return FALSE;/创建一个枚举对象接口。if(FAILED(pDXFile-CreateEnumObject(LPVOID)Filename, DXFILELOAD_FROMFILE, &pEnum) pFile-Release();return FALSE;/ 遍历所有的顶层数据对象。while(SUCCEEDED(pEnum-GetNextDataObject(&pData) / 用ParseObject解析其子数据对象。ParseObject(pData);pData-Release();pEnum-Release();pFile-Release();return TRUE;这个函数的主要部分在ParseObject(pData),它负责解析子数据对象:void ParseObject(IDirectXFileData *pData)IDirectXFileObject *pObject = NULL;IDirectXFileData *pSubData = NULL;IDirectXFileDataReference *pRef = NULL;while(SUCCEEDED(pData-GetNextObject(&pObject) if(SUCCEEDED(pObject-QueryInterface( IID_IDirectXFileDataReference, (void*)&pRef) pRef-Resolve(&pSubData);ParseObject(pSubData);pSubData-Release();pRef-Release(); if(SUCCEEDED(pObject-QueryInterface( IID_IDirectXFileData, (void*)&pSubData) ParseObject(pSubData);pSubData-Release();pObject-Release(); 这是个第归函数,调用函数自身。判断子对象的类别,对其继续解析,直到返回值为FAILED,表示已没有子对象。从上面可以看出,这个函数除了枚举所有的对象,并没有做任何事情,下面就要从这些数据对象检索数据。从数据对象检索数据:/当你用IDirectXFileData接口指针指向一个有效的数据对象,可以调用IDirectXFileData:GetName函数得到该数据对象的名字。函数原型为:HRESULT IDirectXFileData:GetName(LPSTR pstrNameBuf, / 名字缓冲LPDWORD pdwBufLen); / 名字缓冲的大小可以这样使用这个函数:DWORD Size;pData-GetName(NULL, &Size);char *Name = new charSize;pData-GetName(Name, &Size);首先声明一个DWORD Size变量,调用GetName函数时将第一个参数设为NULL,在Size返回名字缓冲的大小。之后利用这个Size值创建存放名字的缓冲,再调用GetName在Name中返回数据对象的名字。得到了数据对象的名字,你需要得到这个数据对象的模版GUID,去判断这个数据对象是否为你想使用的那个模版的数据对象。利用IDirectXFileData:GetType函数,其原型为:HRESULT IDirectXFileData:GetType(const GUID * ppguid);可以这样使用这个函数:const GUID *TemplateGUID = NULL;pData-GetType(&TemplateGUID);/在TemplateGUID中返回该数据对象对应模版的GUID。现在去匹配这个GUID,看它是否为你想使用的模版的数据对象。if(*TemplateGUID = TID_D3DRMMeshNormals) / 如果匹配成功,这里可以继续处理这个模版的数据对象。最后将介绍GetData函数,用它真正的得到了数据对象的数

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论