//----------------------------------------------------------------------------- // Name: XBResource_SizeOf() // Desc: Determines the byte size of a D3DResource //----------------------------------------------------------------------------- DWORD XBResource_SizeOf( LPDIRECT3DRESOURCE8 pResource ) { switch( pResource->GetType() ) { case D3DRTYPE_TEXTURE: return sizeof(D3DTexture); case D3DRTYPE_VOLUMETEXTURE: return sizeof(D3DVolumeTexture); case D3DRTYPE_CUBETEXTURE: return sizeof(D3DCubeTexture); case D3DRTYPE_VERTEXBUFFER: return sizeof(D3DVertexBuffer); case D3DRTYPE_INDEXBUFFER: return sizeof(D3DIndexBuffer); case D3DRTYPE_PALETTE: return sizeof(D3DPalette); } return 0; }
//----------------------------------------------------------------------------- // Name: LoadPackedResource() // Desc: Loads all the texture resources from the given XPR. //----------------------------------------------------------------------------- HRESULT RenderingManagerC::LoadPackedResource() { // Open the file to read the XPR headers FILE* file = fopen( "D:\\Media\\Resource.xpr", "rb" ); if( NULL == file ) return E_FAIL; // Read in and verify the XPR magic header XPR_HEADER xprh; if( fread( &xprh, sizeof(XPR_HEADER), 1, file ) != 1 ) { fclose(file); return E_FAIL; } if( xprh.dwMagic != XPR_MAGIC_VALUE ) { OutputDebugStringA( "ERROR: Invalid Xbox Packed Resource (.xpr) file" ); fclose( file ); return E_INVALIDARG; } // Compute memory requirements DWORD dwSysMemDataSize = xprh.dwHeaderSize - sizeof(XPR_HEADER); DWORD dwVidMemDataSize = xprh.dwTotalSize - xprh.dwHeaderSize; // Allocate memory g_pResourceSysMemData = new BYTE[dwSysMemDataSize]; g_pResourceVidMemData = (BYTE*)D3D_AllocContiguousMemory( dwVidMemDataSize, D3DTEXTURE_ALIGNMENT ); // Read in the data from the file if( fread( g_pResourceSysMemData, dwSysMemDataSize, 1, file ) != 1 || fread( g_pResourceVidMemData, dwVidMemDataSize, 1, file ) != 1 ) { delete[] g_pResourceSysMemData; D3D_FreeContiguousMemory( g_pResourceVidMemData ); fclose( file ); return E_FAIL; } // Done with the file fclose( file ); // Loop over resources, calling Register() BYTE* pData = g_pResourceSysMemData; for( DWORD i = 0; i < resource_NUM_RESOURCES; i++ ) { // Get the resource LPDIRECT3DRESOURCE8 pResource = (LPDIRECT3DRESOURCE8)pData; // Register the resource pResource->Register( g_pResourceVidMemData ); // Advance the pointer switch( pResource->GetType() ) { case D3DRTYPE_TEXTURE: pData += sizeof(D3DTexture); break; case D3DRTYPE_VOLUMETEXTURE: pData += sizeof(D3DVolumeTexture); break; case D3DRTYPE_CUBETEXTURE: pData += sizeof(D3DCubeTexture); break; case D3DRTYPE_VERTEXBUFFER: pData += sizeof(D3DVertexBuffer); break; case D3DRTYPE_INDEXBUFFER: pData += sizeof(D3DIndexBuffer); break; case D3DRTYPE_PALETTE: pData += sizeof(D3DPalette); break; default: return E_FAIL; } } return S_OK; }
//----------------------------------------------------------------------------- // Name: Create() // Desc: Loads all the texture resources from the given XPR. //----------------------------------------------------------------------------- HRESULT CXBPackedResource::Create( LPDIRECT3DDEVICE8 pd3dDevice, const CHAR* strFilename, DWORD dwNumResources, XBRESOURCE* pResourceTags ) { // Find the media file CHAR strResourcePath[512]; if( FAILED( XBUtil_FindMediaFile( strResourcePath, strFilename ) ) ) return E_FAIL; // Open the file HANDLE hFile; DWORD dwNumBytesRead; hFile = CreateFile(strResourcePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL); if(hFile == INVALID_HANDLE_VALUE) { OUTPUT_DEBUG_STRING( "CXBPackedResource::Create(): ERROR: File not found!\n" ); return E_FAIL; } // Read in and verify the XPR magic header XPR_HEADER xprh; ReadFile(hFile, &xprh, sizeof(XPR_HEADER), &dwNumBytesRead, NULL); if( xprh.dwMagic != XPR_MAGIC_VALUE ) { OUTPUT_DEBUG_STRING( "Invalid Xbox Packed Resource (.xpr) file" ); return E_INVALIDARG; } // Compute memory requirements DWORD dwSysMemDataSize = xprh.dwHeaderSize - sizeof(XPR_HEADER); DWORD dwVidMemDataSize = xprh.dwTotalSize - xprh.dwHeaderSize; // Allocate memory m_pSysMemData = new BYTE[dwSysMemDataSize]; m_pVidMemData = (BYTE*)D3D_AllocContiguousMemory( dwVidMemDataSize, D3DTEXTURE_ALIGNMENT ); // Read in the data from the file ReadFile(hFile, m_pSysMemData, dwSysMemDataSize, &dwNumBytesRead, NULL); ReadFile(hFile, m_pVidMemData, dwVidMemDataSize, &dwNumBytesRead, NULL); // Done with the file CloseHandle(hFile); // Loop over resources, calling Register() BYTE* pData = m_pSysMemData; for( DWORD i = 0; i < dwNumResources; i++ ) { // Check for user data if( *((DWORD*)pData) & 0x80000000 ) { DWORD dwType = ((DWORD*)pData)[0]; DWORD dwSize = ((DWORD*)pData)[1]; pData += sizeof(DWORD) * 2; (VOID)dwType; // not used pData += dwSize; } else { // Get the resource LPDIRECT3DRESOURCE8 pResource = (LPDIRECT3DRESOURCE8)pData; // Register the resource pResource->Register( m_pVidMemData ); // Advance the pointer pData += XBResource_SizeOf( pResource ); } } // Finally, store number of resources and the resource tags m_dwNumResources = dwNumResources; m_pResourceTags = pResourceTags; return S_OK; }