//----------------------------------------------------------------------------- // Name: XBUtil_CreateTexture() // Desc: Helper function to create a texture. //----------------------------------------------------------------------------- HRESULT XBUtil_CreateTexture( LPDIRECT3DDEVICE8 pd3dDevice, const CHAR* strTexture, LPDIRECT3DTEXTURE8* ppTexture, D3DFORMAT d3dFormat ) { HRESULT hr; // Find the media file CHAR strTexturePath[512]; if( FAILED( hr = XBUtil_FindMediaFile( strTexturePath, strTexture ) ) ) return hr; // Create the texture using D3DX. Check the current directory return D3DXCreateTextureFromFileEx( pd3dDevice, strTexturePath, D3DX_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT, 0, d3dFormat, D3DPOOL_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT, 0, NULL, NULL, ppTexture ); }
//----------------------------------------------------------------------------- // Name: XBUtil_CreatePixelShader() // Desc: Creates a file-based pixel shader //----------------------------------------------------------------------------- HRESULT XBUtil_CreatePixelShader( LPDIRECT3DDEVICE8 pd3dDevice, const CHAR* strFilename, DWORD* pdwPixelShader ) { HRESULT hr; // Find the media file CHAR strShaderPath[512]; if( FAILED( hr = XBUtil_FindMediaFile( strShaderPath, strFilename ) ) ) return hr; // Open the pixel shader file HANDLE hFile; DWORD dwNumBytesRead; hFile = CreateFile(strShaderPath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL); if(hFile == INVALID_HANDLE_VALUE) return E_FAIL; // Load the pre-compiled pixel shader microcode D3DPIXELSHADERDEF_FILE psdf; ReadFile( hFile, &psdf, sizeof(D3DPIXELSHADERDEF_FILE), &dwNumBytesRead, NULL ); // Make sure the pixel shader is valid if( psdf.FileID != D3DPIXELSHADERDEF_FILE_ID ) { OUTPUT_DEBUG_STRING( "XBUtil_CreatePixelShader(): Invalid pixel shader file\n" ); return E_FAIL; } // Create the pixel shader if( FAILED( hr = pd3dDevice->CreatePixelShader( &(psdf.Psd), pdwPixelShader ) ) ) { OUTPUT_DEBUG_STRING( "XBUtil_CreatePixelShader(): Could not create pixel shader\n" ); return hr; } // cleanup CloseHandle( hFile ); return S_OK; }
//----------------------------------------------------------------------------- // Name: XBUtil_CreateVertexShader() // Desc: Creates a file-based vertex shader //----------------------------------------------------------------------------- HRESULT XBUtil_CreateVertexShader( LPDIRECT3DDEVICE8 pd3dDevice, const CHAR* strFilename, const DWORD* pdwVertexDecl, DWORD* pdwVertexShader ) { HRESULT hr; // Find the media file CHAR strShaderPath[512]; if( FAILED( hr = XBUtil_FindMediaFile( strShaderPath, strFilename ) ) ) return hr; // Open the vertex shader file HANDLE hFile; DWORD dwNumBytesRead; hFile = CreateFile(strShaderPath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL); if(hFile == INVALID_HANDLE_VALUE) return E_FAIL; // Allocate memory to read the vertex shader file DWORD dwSize = GetFileSize(hFile, NULL); BYTE* pData = new BYTE[dwSize+4]; if( NULL == pData ) return E_FAIL; ZeroMemory( pData, dwSize+4 ); // Read the pre-compiled vertex shader microcode ReadFile(hFile, pData, dwSize, &dwNumBytesRead, 0); // Create the vertex shader hr = pd3dDevice->CreateVertexShader( pdwVertexDecl, (const DWORD*)pData, pdwVertexShader, 0 ); // Cleanup and return CloseHandle(hFile); delete [] pData; return hr; }
//----------------------------------------------------------------------------- // 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; }