|
|
最近遇上一些.X文件相关的问题,希望大家能帮我解答下,先谢谢了。
《DirectX 角色扮演游戏编程》中p104:
“整个.X文件格式是基于模板的”
什么是.X文件中的模板?
什么是.X文件中的框架模板?
---------------------------------------------------------
解析.X文件的函数:
BOOL ParseXFile(char *Filename)
{
IDirectXFile *pDXFile = NULL;
IDirectXFileEnumObject *pDXEnum = NULL;
IDirectXFileData *pDXData = NULL;
// 建立DirectXFile对象
if(FAILED(DirectXFileCreate(&pDXFile)))
return FALSE;
// 注册使用的模版
// 使用标准的Direct3D保留模式模版
if(FAILED(pDXFile->RegisterTemplates((LPVOID)D3DRM_XTEMPLATES, D3DRM_XTEMPLATE_BYTES))) {
pDXFile->Release();
return FALSE;
}
// 建立列举器对象
if(FAILED(pDXFile->CreateEnumObject((LPVOID)Filename, DXFILELOAD_FROMFILE, &pDXEnum))) {
pDXFile->Release();
return FALSE;
}
// 列举所有最高层模版
while(SUCCEEDED(pDXEnum->GetNextDataObject(&pDXData))) {
ParseXFileData(pDXData);
ReleaseCOM(pDXData);
}
// 释放对象
ReleaseCOM(pDXEnum);
ReleaseCOM(pDXFile);
// 返回
return TRUE;
}
void ParseXFileData(IDirectXFileData *pData)
{
IDirectXFileObject *pSubObj = NULL;
IDirectXFileData *pSubData = NULL;
IDirectXFileDataReference *pDataRef = NULL;
const GUID *pType = NULL;
char *pName = NULL;
DWORD dwSize;
char *pBuffer;
// 取得模版类型
if(FAILED(pData->GetType(&pType)))
return;
// 取得模版名称(如果有)
if(FAILED(pData->GetName(NULL, &dwSize)))
return;
if(dwSize) {
if((pName = new char[dwSize]) != NULL)
pData->GetName(pName, &dwSize);
}
// 如果模版没有名称,给他一个默认的名称
if(pName == NULL) {
if((pName = new char[9]) == NULL)
return;
strcpy(pName, "Template");
}
// 判断模版的类型,并且对其进行操作
// 在这部分可以加入你自己的代码
if(*pType == TID_D3DRMFrame) {
MessageBox(NULL, pName, "Frame template found", MB_OK);
}
if(*pType == TID_D3DRMMesh) {
MessageBox(NULL, pName, "Mesh template found", MB_OK);
}
if(*pType == TID_D3DRMMaterial) {
MessageBox(NULL, pName, "Material template found", MB_OK);
}
if(*pType == TID_D3DRMFrameTransformMatrix) {
MessageBox(NULL, pName, "Frame transformation matrix template found", MB_OK);
// 获得模版中的数据Get the template data
if(FAILED(pData->GetData(NULL, &dwSize, (PVOID*)&pBuffer)))
return;
// 可以对数据进行任何操作。
// 注意在进行操作之前要把数据从缓冲中复制出来
}
// 扫描以得到内层模版
while(SUCCEEDED(pData->GetNextObject(&pSubObj))) {
// 递归处理内层模版数据
if(SUCCEEDED(pSubObj->QueryInterface(IID_IDirectXFileDataReference, (void**)&pDataRef))) {
if(SUCCEEDED(pDataRef->Resolve(&pSubData))) {
ParseXFileData(pSubData);
ReleaseCOM(pSubData);
}
ReleaseCOM(pDataRef);
}
// Process non-referenced embedded templates
if(SUCCEEDED(pSubObj->QueryInterface(IID_IDirectXFileData, (void**)&pSubData))) {
ParseXFileData(pSubData);
ReleaseCOM(pSubData);
}
ReleaseCOM(pSubObj);
}
// 释放名称缓冲
delete pName;
}
(原文:http://unfadinglove.bokee.com/1484772.html)
-------------------------------------------------------------
“函数ParseXFile完成初始化IDirectXFile对象的工作,这项工作在打开.X 文件的同时完成。然后,你需要注册(Register)一个你要在.X文件中寻找的模版的列表。”
为什么要注册一个模板列表?这个列表是什么?
代码中
// 列举所有最高层模版
while(SUCCEEDED(pDXEnum->GetNextDataObject(&pDXData))) {
ParseXFileData(pDXData);
ReleaseCOM(pDXData);
}
这里“最高层模版”是什么?
|->头部
跟框架-胸部 |->上臂
| |->前臂
| |->手
|
|->大腿
|->小腿
|->脚
在这样的“框架层次中”,最高层模板是指“头、上臂、大腿”?
------
const GUID *pType = NULL;
// 取得模版类型
if(FAILED(pData->GetType(&pType)))
return;
// 判断模版的类型,并且对其进行操作
// 在这部分可以加入你自己的代码
if(*pType == TID_D3DRMFrame) {
MessageBox(NULL, pName, "Frame template found", MB_OK);
}
if(*pType == TID_D3DRMMesh) {
MessageBox(NULL, pName, "Mesh template found", MB_OK);
}
if(*pType == TID_D3DRMMaterial) {
MessageBox(NULL, pName, "Material template found", MB_OK);
}
if(*pType == TID_D3DRMFrameTransformMatrix) {
MessageBox(NULL, pName, "Frame transformation matrix template found", MB_OK);
globally unique identifier (GUID)这个东西怎么能判断类型的?
----------------------------------------------------------------
《DirectX 角色扮演游戏编程》中p106:
“(解析一个.X文件时)搜索整个对象的层次,查找想要使用的数据对象(网格模型和框架的对象)。最困难的部分是要记住那些嵌入到其他对象中的对象,因而可能会遇到对象的引用,而不是对象。”
if(SUCCEEDED(pSubObj->QueryInterface(IID_IDirectXFileDataReference, (void**)&pDataRef))) {
if(SUCCEEDED(pDataRef->Resolve(&pSubData))) {
ParseXFileData(pSubData);
ReleaseCOM(pSubData);
}
ReleaseCOM(pDataRef);
}
// Process non-referenced embedded templates
if(SUCCEEDED(pSubObj->QueryInterface(IID_IDirectXFileData, (void**)&pSubData))) {
ParseXFileData(pSubData);
ReleaseCOM(pSubData);
}
ReleaseCOM(pSubObj);
}
.X文件中“对象的引用”与“对象”是什么区别?
pDataRef->Resolve(&pSubData)是什么意思?
|
|