//----------------------------------------------------------------------------- HRESULT CDXUTMeshFile::Create( LPDIRECT3DDEVICE9 pd3dDevice, LPCWSTR strFilename ) { LPD3DXFILE pDXFile = NULL; LPD3DXFILEENUMOBJECT pEnumObj = NULL; LPD3DXFILEDATA pFileData = NULL; HRESULT hr; SIZE_T cChildren; // Create a x file object if( FAILED( hr = D3DXFileCreate( &pDXFile ) ) ) return E_FAIL; // Register templates for d3drm and patch extensions. if( FAILED( hr = pDXFile->RegisterTemplates( (void*)D3DRM_XTEMPLATES, D3DRM_XTEMPLATE_BYTES ) ) ) { SAFE_RELEASE( pDXFile ); return E_FAIL; } // Find the path to the file, and convert it to ANSI (for the D3DXOF API) WCHAR strPath[MAX_PATH]; CHAR strPathANSI[MAX_PATH]; DXUTFindDXSDKMediaFileCch( strPath, sizeof(strPath) / sizeof(WCHAR), strFilename ); WideCharToMultiByte( CP_ACP, 0, strPath, -1, strPathANSI, MAX_PATH, NULL, NULL ); strPathANSI[MAX_PATH-1] = 0; // Create enum object hr = pDXFile->CreateEnumObject( (void*)strPathANSI, D3DXF_FILELOAD_FROMFILE, &pEnumObj ); if( FAILED(hr) ) { SAFE_RELEASE( pDXFile ); return hr; } // Enumerate top level objects (which are always frames) pEnumObj->GetChildren(&cChildren); for (UINT iChild = 0; iChild < cChildren; iChild++) { hr = pEnumObj->GetChild(iChild, &pFileData); if (FAILED(hr)) return hr; hr = LoadFrame( pd3dDevice, pFileData, this ); SAFE_RELEASE( pFileData ); if( FAILED(hr) ) { SAFE_RELEASE( pEnumObj ); SAFE_RELEASE( pDXFile ); return E_FAIL; } } SAFE_RELEASE( pFileData ); SAFE_RELEASE( pEnumObj ); SAFE_RELEASE( pDXFile ); return S_OK; }
//----------------------------------------------------------------------------- HRESULT CDXUTMeshFile::CreateFromResource( LPDIRECT3DDEVICE9 pd3dDevice, LPCWSTR strResource, LPCWSTR strType ) { LPD3DXFILE pDXFile = NULL; LPD3DXFILEENUMOBJECT pEnumObj = NULL; LPD3DXFILEDATA pFileData = NULL; HRESULT hr; SIZE_T cChildren; // Create a x file object if( FAILED( hr = D3DXFileCreate( &pDXFile ) ) ) return E_FAIL; // Register templates for d3drm and patch extensions. if( FAILED( hr = pDXFile->RegisterTemplates( (void*)D3DRM_XTEMPLATES, D3DRM_XTEMPLATE_BYTES ) ) ) { SAFE_RELEASE( pDXFile ); return E_FAIL; } CHAR strTypeAnsi[MAX_PATH]; CHAR strResourceAnsi[MAX_PATH]; WideCharToMultiByte( CP_ACP, 0, strType, -1, strTypeAnsi, MAX_PATH, NULL, NULL ); strTypeAnsi[MAX_PATH-1] = 0; WideCharToMultiByte( CP_ACP, 0, strResource, -1, strResourceAnsi, MAX_PATH, NULL, NULL ); strResourceAnsi[MAX_PATH-1] = 0; D3DXF_FILELOADRESOURCE dxlr; dxlr.hModule = NULL; dxlr.lpName = strResourceAnsi; dxlr.lpType = strTypeAnsi; // Create enum object hr = pDXFile->CreateEnumObject( (void*)&dxlr, D3DXF_FILELOAD_FROMRESOURCE, &pEnumObj ); if( FAILED(hr) ) { SAFE_RELEASE( pDXFile ); return hr; } // Enumerate top level objects (which are always frames) pEnumObj->GetChildren(&cChildren); for (UINT iChild = 0; iChild < cChildren; iChild++) { hr = pEnumObj->GetChild(iChild, &pFileData); if (FAILED(hr)) return hr; hr = LoadFrame( pd3dDevice, pFileData, this ); SAFE_RELEASE( pFileData ); if( FAILED(hr) ) { SAFE_RELEASE( pEnumObj ); SAFE_RELEASE( pDXFile ); return E_FAIL; } } SAFE_RELEASE( pFileData ); SAFE_RELEASE( pEnumObj ); SAFE_RELEASE( pDXFile ); return S_OK; }