Counter Strike : Global Offensive Source Code
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

145 lines
5.7 KiB

//===== Copyright c 1996-2008, Valve Corporation, All rights reserved. ======//
//
// Purpose: Describes our resource format. All resource files have a simplistic
// dictionary of resource "blocks", which can be looked up using a block type id.
// Each resource block type is expected to be associated with a well defined
// structure. The macro DEFINE_RESOURCE_BLOCK_TYPE is used to create this
// association.
//
// The current design choice is that we expect files using this resource format
// to be small. Large-scale files, like sound or texture bits, are expected to
// exist in a file parallel to the file containing these resource blocks owing
// to issues of alignment or streaming. We therefore expect users of files
// containing the data described in this header to load the entire file in
// so that all blocks are in memory.
//
// $NoKeywords: $
//===========================================================================//
#ifndef RESOURCEFILE_H
#define RESOURCEFILE_H
#pragma once
#include "resourcefile/schema.h"
#include "tier0/platform.h"
#include "resourcefile/resourcestream.h"
#include "datamap.h"
//-----------------------------------------------------------------------------
//
// On-disk structures related to the resource file format
//
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Resource block types
//-----------------------------------------------------------------------------
typedef uint32 ResourceBlockId_t;
//-----------------------------------------------------------------------------
// A block of resource data
//-----------------------------------------------------------------------------
struct ResourceBlockEntry_t
{
DECLARE_BYTESWAP_DATADESC();
ResourceBlockId_t m_nBlockType;
CResourcePointer<void> m_pBlockData;
};
//-----------------------------------------------------------------------------
// Structure of resource file header
//-----------------------------------------------------------------------------
enum ResourceFileHeaderVersion_t
{
RESOURCE_FILE_HEADER_VERSION = 1,
};
struct ResourceFileHeader_t
{
DECLARE_BYTESWAP_DATADESC();
uint32 m_nVersion; // see ResourceFileHeaderVersion_t
uint32 m_nSizeInBytes; // Size in bytes of entire file
CResourceArray< ResourceBlockEntry_t > m_ResourceBlocks;
};
//-----------------------------------------------------------------------------
//
// Methods used to define resource blocks/read them from files
//
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Resource block IDs
//-----------------------------------------------------------------------------
#define RSRC_BYTE_POS( byteVal, shft ) ResourceBlockId_t( uint32(uint8(byteVal)) << uint8(shft * 8) )
#if !defined( PLATFORM_X360 )
#define MK_RSRC_BLOCK_ID(a, b, c, d) ResourceBlockId_t( RSRC_BYTE_POS(a, 0) | RSRC_BYTE_POS(b, 1) | RSRC_BYTE_POS(c, 2) | RSRC_BYTE_POS(d, 3) )
#else
#define MK_RSRC_BLOCK_ID(a, b, c, d) ResourceBlockId_t( RSRC_BYTE_POS(a, 3) | RSRC_BYTE_POS(b, 2) | RSRC_BYTE_POS(c, 1) | RSRC_BYTE_POS(d, 0) )
#endif
#define RESOURCE_BLOCK_ID_INVALID 0xFFFFFFFF
//-----------------------------------------------------------------------------
// Helpers used to define resource block IDs + associated structs
//-----------------------------------------------------------------------------
template< class T >
struct ResourceBlockIdSelector_t
{
enum { RESOURCE_BLOCK_ID = RESOURCE_BLOCK_ID_INVALID };
};
#define DEFINE_RESOURCE_BLOCK_TYPE( _class, _ida, _idb, _idc, _idd ) \
template <> struct ResourceBlockIdSelector_t< _class > { enum { RESOURCE_BLOCK_ID = MK_RSRC_BLOCK_ID( _ida, _idb, _idc, _idd ) }; };
//-----------------------------------------------------------------------------
// Does this resource file contain a particular block?
//-----------------------------------------------------------------------------
bool Resource_IsBlockDefined( const ResourceFileHeader_t *pHeader, ResourceBlockId_t id );
//-----------------------------------------------------------------------------
// Gets the data associated with a particular data block
//-----------------------------------------------------------------------------
const void *Resource_GetBlock( const ResourceFileHeader_t *pHeader, ResourceBlockId_t id );
template< class T > inline const T* Resource_GetBlock( const ResourceFileHeader_t *pHeader )
{
return (const T*)Resource_GetBlock( pHeader, ResourceBlockIdSelector_t< T >::RESOURCE_BLOCK_ID );
}
//-----------------------------------------------------------------------------
// Helper methods to write block information
//-----------------------------------------------------------------------------
inline ResourceFileHeader_t *Resource_AllocateHeader( CResourceStream *pStream, int nBlockCount )
{
ResourceFileHeader_t *pHeader = pStream->Allocate< ResourceFileHeader_t >();
pHeader->m_nVersion = RESOURCE_FILE_HEADER_VERSION;
pHeader->m_ResourceBlocks = pStream->Allocate< ResourceBlockEntry_t >( nBlockCount );
return pHeader;
}
//-----------------------------------------------------------------------------
// Helper methods to write block information
//-----------------------------------------------------------------------------
template< class T > inline T* Resource_AllocateBlock( CResourceStream *pStream, ResourceFileHeader_t *pHeader, int nBlockIndex )
{
pHeader->m_ResourceBlocks[nBlockIndex].m_nBlockType = ResourceBlockIdSelector_t< T >::RESOURCE_BLOCK_ID;
T *pBlockData = pStream->Allocate< T >( 1 );
pHeader->m_ResourceBlocks[nBlockIndex].m_pBlockData = pBlockData;
return pBlockData;
}
#endif // RESOURCEFILE_H