|
|

楼主 |
发表于 2008-8-19 20:55:00
|
显示全部楼层
Re:DirectX角色扮演游戏编程.x文件解析函数如何更改IDirectXF
问题已经解决!自己把代码贴上来!呵呵
sFrame *ParseXFile(char *Filename)
{
ID3DXFile *pDXFile = NULL;
ID3DXFileEnumObject *pDXEnum = NULL;
ID3DXFileData *pDXData = NULL;
sFrame *Frame;
// Create the file object
if(FAILED(D3DXFileCreate(&pDXFile)))
return FALSE;
// Register the templates
if(FAILED(pDXFile->RegisterTemplates((LPVOID)D3DRM_XTEMPLATES, D3DRM_XTEMPLATE_BYTES))) {
pDXFile->Release();
return FALSE;
}
// Create an enumeration object
if(FAILED(pDXFile->CreateEnumObject((LPVOID)Filename, DXFILELOAD_FROMFILE, &pDXEnum))) {
pDXFile->Release();
return FALSE;
}
// Allocate a frame that becomes root
Frame = new sFrame();
SIZE_T num_child;
pDXEnum->GetChildren(&num_child);
for(SIZE_T i=0;i<num_child;i++)
{
if(FAILED(pDXEnum->GetChild(i,&pDXData)))
return FALSE;
ParseXFileData(pDXData,Frame);
ReleaseCOM(pDXData);
}
//// Loop through all objects looking for the frames and meshes
//while(SUCCEEDED(pDXEnum->GetNextDataObject(&pDXData))) {
// ParseXFileData(pDXData, Frame);
// ReleaseCOM(pDXData);
//}
// Release used COM objects
ReleaseCOM(pDXEnum);
ReleaseCOM(pDXFile);
// Return root frame
return Frame;
}
void ParseXFileData(ID3DXFileData *pDataObj, sFrame *ParentFrame)
{
//IDirectXFileObject *pSubObj = NULL;
ID3DXFileData *pSubObj = NULL;
//IDirectXFileDataReference *pDataRef = NULL;
ID3DXBuffer *Adjacency = NULL;
//const GUID *Type = NULL;
GUID Type;
char *Name = NULL;
DWORD Size;
sFrame *Frame = NULL;
sFrame *SubFrame = NULL;
sMesh *Mesh = NULL;
ID3DXBuffer *MaterialBuffer = NULL;
D3DXMATERIAL *Materials = NULL;
DWORD i;
// Get the template type
if(FAILED(pDataObj->GetType(&Type)))
return;
// Get the template name (if any)
if(FAILED(pDataObj->GetName(NULL, &Size)))
return;
if(Size) {
if((Name = new char[Size]) != NULL)
pDataObj->GetName(Name, &Size);
}
// Give template a default name if none found
if(Name == NULL) {
if((Name = new char[9]) == NULL)
return;
strcpy_s(Name,sizeof("Template"), "Template");
}
// Set sub frame
SubFrame = ParentFrame;
// Process the templates
// Frame
if(Type == TID_D3DRMFrame) {
// Create a new frame structure
Frame = new sFrame();
// Store the name
Frame->m_Name = Name;
Name = NULL;
// Add to parent frame
Frame->m_Sibling = ParentFrame->m_Child;
ParentFrame->m_Child = Frame;
// Set sub frame parent
SubFrame = Frame;
}
// Load a mesh
if(Type == TID_D3DRMMesh) {
// Create a new mesh structure
Mesh = new sMesh();
// Store the name
Mesh->m_Name = Name;
Name = NULL;
// Load mesh data (as a skinned mesh)
if(FAILED(D3DXLoadSkinMeshFromXof(pDataObj, 0,
g_pD3DDevice,
&Adjacency, &MaterialBuffer, NULL, &Mesh->m_NumMaterials,
&Mesh->m_SkinInfo,
&Mesh->m_Mesh))) {
delete Mesh;
return;
}
ReleaseCOM(Adjacency);
// Clone skin mesh is bones exist
if(Mesh->m_SkinInfo != NULL && Mesh->m_SkinInfo->GetNumBones() != 0) {
if(FAILED(Mesh->m_Mesh->CloneMeshFVF(0, Mesh->m_Mesh->GetFVF(), g_pD3DDevice, &Mesh->m_SkinMesh))) {
Mesh->m_SkinInfo->Release();
Mesh->m_SkinInfo = NULL;
}
}
// Load materials or create a default one if none
if(!Mesh->m_NumMaterials) {
// Create a default one
Mesh->m_Materials = new D3DMATERIAL9[1];
Mesh->m_Textures = new LPDIRECT3DTEXTURE9[1];
ZeroMemory(Mesh->m_Materials, sizeof(D3DMATERIAL9));
Mesh->m_Materials[0].Diffuse.r = 1.0f;
Mesh->m_Materials[0].Diffuse.g = 1.0f;
Mesh->m_Materials[0].Diffuse.b = 1.0f;
Mesh->m_Materials[0].Diffuse.a = 1.0f;
Mesh->m_Materials[0].Ambient = Mesh->m_Materials[0].Diffuse;
Mesh->m_Materials[0].Specular = Mesh->m_Materials[0].Diffuse;
Mesh->m_Textures[0] = NULL;
Mesh->m_NumMaterials = 1;
} else {
// Load the materials
Materials = (D3DXMATERIAL*)MaterialBuffer->GetBufferPointer();
Mesh->m_Materials = new D3DMATERIAL9[Mesh->m_NumMaterials];
Mesh->m_Textures = new LPDIRECT3DTEXTURE9[Mesh->m_NumMaterials];
for(i=0;i<Mesh->m_NumMaterials;i++) {
Mesh->m_Materials = Materials.MatD3D;
Mesh->m_Materials.Ambient = Mesh->m_Materials.Diffuse;
// Build a texture path and load it
if(FAILED(D3DXCreateTextureFromFile(g_pD3DDevice,
Materials.pTextureFilename,
&Mesh->m_Textures))) {
Mesh->m_Textures = NULL;
}
}
}
ReleaseCOM(MaterialBuffer);
// Link in mesh
Mesh->m_Next = ParentFrame->m_Mesh;
ParentFrame->m_Mesh = Mesh;
}
// Skip animation sets and animations
if(Type == TID_D3DRMAnimationSet || Type == TID_D3DRMAnimation || Type == TID_D3DRMAnimationKey) {
delete [] Name;
return;
}
// Release name buffer
delete [] Name;
SIZE_T num_child;
pDataObj->GetChildren(&num_child);
for(SIZE_T i=0;i<num_child;i++)
{
pDataObj->GetChild(i,&pSubObj);
ParseXFileData(pSubObj,SubFrame);
ReleaseCOM(pSubObj);
}
//// Scan for embedded templates
//while(SUCCEEDED(pDataObj->GetNextObject(&pSubObj))) {
// // Process embedded references
// if(SUCCEEDED(pSubObj->QueryInterface(IID_IDirectXFileDataReference, (void**)&pDataRef))) {
// if(SUCCEEDED(pDataRef->Resolve(&pSubData))) {
// ParseXFileData(pSubData, SubFrame);
// ReleaseCOM(pSubData);
// }
// ReleaseCOM(pDataRef);
// }
// // Process non-referenced embedded templates
// if(SUCCEEDED(pSubObj->QueryInterface(IID_IDirectXFileData, (void**)&pSubData))) {
// ParseXFileData(pSubData, SubFrame);
// ReleaseCOM(pSubData);
// }
// ReleaseCOM(pSubObj);
//}
return;
} |
|