//----------------------------------------------------------------------------- // 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; }