コード例 #1
0
ファイル: xbresource.cpp プロジェクト: DCurrent/openbor
//-----------------------------------------------------------------------------
// 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;
}
コード例 #2
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;
}
コード例 #3
0
ファイル: xbresource.cpp プロジェクト: DCurrent/openbor
//-----------------------------------------------------------------------------
// 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;
}