INT WINAPI WinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in LPSTR lpCmdLine, __in int nShowCmd ) { ID3DXFile* lpXFile; if(FAILED(D3DXFileCreate(&lpXFile))) { return 0; } if(FAILED(lpXFile->RegisterTemplates(D3DRM_XTEMPLATES, D3DRM_XTEMPLATE_BYTES))) { lpXFile->Release(); return 0; } parseXFile(lpXFile); lpXFile->Release(); return 0; }
BOOL cMesh::Load(cGraphics *Graphics, char *Filename, char *TexturePath) { ID3DXFile *pDXFile = NULL; ID3DXFileEnumObject *pDXEnum = NULL; ID3DXFileData *pDXData = NULL; sFrame *TempFrame, *FramePtr; sMesh *Mesh; // Free prior mesh object data Free(); // Error checking if((m_Graphics = Graphics) == NULL || Filename == NULL) return FALSE; // 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; } // Create a temporary frame TempFrame = new sFrame(); SIZE_T count; if (FAILED(pDXEnum->GetChildren(&count))) { return FALSE; } SIZE_T c = 0; // Loop through all objects looking for the frames and meshes while(c < count) { if (FAILED(pDXEnum->GetChild(c, &pDXData))) return FALSE; c++; ParseXFileData(pDXData, TempFrame, TexturePath); ReleaseCOM(pDXData); } // Release used COM objects ReleaseCOM(pDXEnum); ReleaseCOM(pDXFile); // See if we should keep the tempframe as root if(TempFrame->m_MeshList != NULL) { m_Frames = TempFrame; m_Frames->m_Name = new char[7]; strcpy(m_Frames->m_Name, "%ROOT%"); } else { // Assign the root frame and release temporary frame m_Frames = TempFrame->m_Child; FramePtr = m_Frames; while(FramePtr != NULL) { FramePtr->m_Parent = NULL; FramePtr = FramePtr->m_Sibling; } TempFrame->m_Child = NULL; delete TempFrame; } // Match frames to bones (for matrices) MapFramesToBones(m_Frames); // Calculate bounding box and sphere if((Mesh = m_Meshes) != NULL) { while(Mesh != NULL) { m_Min.x = min(m_Min.x, Mesh->m_Min.x); m_Min.y = min(m_Min.y, Mesh->m_Min.y); m_Min.z = min(m_Min.z, Mesh->m_Min.z); m_Max.x = max(m_Max.x, Mesh->m_Max.x); m_Max.y = max(m_Max.y, Mesh->m_Max.y); m_Max.z = max(m_Max.z, Mesh->m_Max.z); m_Radius = max(m_Radius, Mesh->m_Radius); Mesh = Mesh->m_Next; } } return TRUE; }