HRESULT GetXFileDataName( tstring& name,LPD3DXFILEDATA pXofData ) { HRESULT hr = S_OK; DWORD cchName; hr = pXofData->GetName(NULL,&cchName); if( FAILED(hr) ) { return hr; } if( cchName > 0 ) { char* szName = NULL; if( NULL == (szName = new char[cchName]) ) { hr = E_OUTOFMEMORY; return hr; } hr = pXofData->GetName( szName,&cchName ); if( FAILED(hr) ) { delete[] szName; return hr; } name = to_tstring(szName); delete[] szName; } return hr; }
//----------------------------------------------------------------------------- HRESULT CDXUTMeshFile::LoadMesh( LPDIRECT3DDEVICE9 pd3dDevice, LPD3DXFILEDATA pFileData, CDXUTMeshFrame* pParentFrame ) { // Currently only allowing one mesh per frame if( pParentFrame->m_pMesh ) return E_FAIL; // Get the mesh name CHAR strAnsiName[512] = {0}; WCHAR strName[512]; SIZE_T dwNameLength = 512; HRESULT hr; if( FAILED( hr = pFileData->GetName( strAnsiName, &dwNameLength ) ) ) return hr; MultiByteToWideChar( CP_ACP, 0, strAnsiName, -1, strName, 512 ); strName[511] = 0; // Create the mesh pParentFrame->m_pMesh = new CDXUTMesh( strName ); if( pParentFrame->m_pMesh == NULL ) return E_OUTOFMEMORY; pParentFrame->m_pMesh->Create( pd3dDevice, pFileData ); return S_OK; }
//----------------------------------------------------------------------------- HRESULT CDXUTMeshFile::LoadFrame( LPDIRECT3DDEVICE9 pd3dDevice, LPD3DXFILEDATA pFileData, CDXUTMeshFrame* pParentFrame ) { LPD3DXFILEDATA pChildData = NULL; GUID Guid; SIZE_T cbSize; CDXUTMeshFrame* pCurrentFrame; HRESULT hr; // Get the type of the object if( FAILED( hr = pFileData->GetType( &Guid ) ) ) return hr; if( Guid == TID_D3DRMMesh ) { hr = LoadMesh( pd3dDevice, pFileData, pParentFrame ); if( FAILED(hr) ) return hr; } if( Guid == TID_D3DRMFrameTransformMatrix ) { D3DXMATRIX* pmatMatrix; hr = pFileData->Lock(&cbSize, (LPCVOID*)&pmatMatrix ); if( FAILED(hr) ) return hr; // Update the parent's matrix with the new one pParentFrame->SetMatrix( pmatMatrix ); } if( Guid == TID_D3DRMFrame ) { // Get the frame name CHAR strAnsiName[512] = ""; WCHAR strName[512]; SIZE_T dwNameLength = 512; SIZE_T cChildren; if( FAILED( hr = pFileData->GetName( strAnsiName, &dwNameLength ) ) ) return hr; WideCharToMultiByte( CP_ACP, 0, strName, -1, strAnsiName, 512, NULL, NULL ); strName[511] = 0; // Create the frame pCurrentFrame = new CDXUTMeshFrame( strName ); if( pCurrentFrame == NULL ) return E_OUTOFMEMORY; pCurrentFrame->m_pNext = pParentFrame->m_pChild; pParentFrame->m_pChild = pCurrentFrame; // Enumerate child objects pFileData->GetChildren(&cChildren); for (UINT iChild = 0; iChild < cChildren; iChild++) { // Query the child for its FileData hr = pFileData->GetChild(iChild, &pChildData ); if( SUCCEEDED(hr) ) { hr = LoadFrame( pd3dDevice, pChildData, pCurrentFrame ); SAFE_RELEASE( pChildData ); } if( FAILED(hr) ) return hr; } } return S_OK; }