csgo-2018-source/public/tier2/resourceprecacher.h
2021-07-24 21:11:47 -07:00

196 lines
7.3 KiB
C++

//===== Copyright © 1996-2005, Valve Corporation, All rights reserved. ======//
//
// Purpose: Utilities for setting vproject settings
//
//===========================================================================//
#ifndef _RESOURCEPRECACHER_H
#define _RESOURCEPRECACHER_H
#ifdef _WIN32
#pragma once
#endif
//-----------------------------------------------------------------------------
// Resource list
//-----------------------------------------------------------------------------
FORWARD_DECLARE_HANDLE( ResourceList_t );
#define RESOURCE_LIST_INVALID ( (ResourceList_t)-1 )
//-----------------------------------------------------------------------------
// Resource 'systems', which use other resources
// NOTE: If you add types here, be sure to fix s_pResourceSystemName
//-----------------------------------------------------------------------------
enum PrecacheSystem_t
{
CLIENTGLOBAL = 0, // Always precache these
SERVERGLOBAL,
VGUI_PANEL, // What to precache when using a vgui panel
DISPATCH_EFFECT, // What to precache when using a dispatch effect
SHARED_SYSTEM, // Precache lists which are reused and can be referenced as a resource type
PRECACHE_SYSTEM_COUNT,
#if defined( GAME_DLL )
GLOBAL = SERVERGLOBAL,
#elif defined( CLIENT_DLL ) || defined( GAMEUI_EXPORTS )
GLOBAL = CLIENTGLOBAL,
#endif
};
//-----------------------------------------------------------------------------
// Resource types
// NOTE: If you add a type here, modify s_pResourceTypeName in resourceaccesscontrol.cpp
//-----------------------------------------------------------------------------
enum ResourceTypeOld_t // called 'Old' to disambiguate with ResourceSystem
{
RESOURCE_VGUI_PANEL = 0, // .res file
RESOURCE_MATERIAL, // .vmt file
RESOURCE_MODEL, // .mdl file
RESOURCE_PARTICLE_SYSTEM, // particle system
RESOURCE_GAMESOUND, // game sound
RESOURCE_TYPE_OLD_COUNT,
};
//-----------------------------------------------------------------------------
// Resource types
// NOTE: If you add types here, be sure to fix s_pPrecacheResourceTypeName
// A compile-time assert will trigger if you don't.
//-----------------------------------------------------------------------------
enum PrecacheResourceType_t
{
VGUI_RESOURCE = 0, // .res file
MATERIAL, // .vmt file
MODEL, // .mdl file
GAMESOUND, // sound
PARTICLE_SYSTEM, // particle system
ENTITY, // Other entity
DECAL, // A decal
PARTICLE_MATERIAL, // A particle system material (old-style, obsolete)
KV_DEP_FILE, // keyvalues file containing a resource dependency list
GAME_MATERIAL_DECALS, // All decals related to game materials ( resource name is ignored )
PHYSICS_GAMESOUNDS, // Resource names are either "BulletSounds", "StepSounds", or "PhysicsImpactSounds"
SHARED, // a shared precache group (see PrecacheSystem_t SHARED)
PRECACHE_RESOURCE_TYPE_COUNT,
};
//-----------------------------------------------------------------------------
// Callback interface for handler who knows how to precache particular kinds of resources
//-----------------------------------------------------------------------------
abstract_class IPrecacheHandler
{
public:
virtual void CacheResource( PrecacheResourceType_t nType, const char *pName,
bool bPrecache, ResourceList_t hResourceList, int *pIndex = NULL ) = 0;
};
//-----------------------------------------------------------------------------
// Interface to automated system for precaching resources
//-----------------------------------------------------------------------------
abstract_class IResourcePrecacher
{
public:
virtual void Cache( IPrecacheHandler *pPrecacheHandler, bool bPrecache, ResourceList_t hResourceList, bool bIgnoreConditionals ) = 0;
virtual PrecacheSystem_t GetSystem() = 0;
virtual const char *GetName() = 0;
virtual IResourcePrecacher *GetNext() = 0;
virtual void SetNext( IResourcePrecacher * pNext ) = 0;
};
//-----------------------------------------------------------------------------
// Actually does the precaching
//-----------------------------------------------------------------------------
class CBaseResourcePrecacher : public IResourcePrecacher
{
// Other public methods
public:
CBaseResourcePrecacher( PrecacheSystem_t nSystem, const char *pName )
{
m_nSystem = nSystem;
m_pName = pName;
m_pNext = sm_pFirst[nSystem];
sm_pFirst[nSystem] = this;
}
static void RegisterAll();
PrecacheSystem_t GetSystem() { return m_nSystem; }
const char *GetName() { return m_pName; }
IResourcePrecacher *GetNext() { return m_pNext; }
void SetNext( IResourcePrecacher * pNext ) { m_pNext = pNext; }
static CBaseResourcePrecacher *sm_pFirst[PRECACHE_SYSTEM_COUNT];
PrecacheSystem_t m_nSystem;
const char *m_pName;
IResourcePrecacher *m_pNext;
friend class CPrecacheRegister;
};
//-----------------------------------------------------------------------------
// Automatic precache macros
//-----------------------------------------------------------------------------
// Beginning
#define PRECACHE_REGISTER_BEGIN_CONDITIONAL( _system, _className, _condition ) \
namespace _className ## Precache \
{ \
class CResourcePrecacher : public CBaseResourcePrecacher\
{ \
public: \
CResourcePrecacher() : CBaseResourcePrecacher( _system, #_className ) {} \
public: \
virtual void Cache( IPrecacheHandler *pPrecacheHandler, bool bPrecache, ResourceList_t hResourceList, bool bIgnoreConditionals ); \
}; \
void CResourcePrecacher::Cache( IPrecacheHandler *pPrecacheHandler, bool bPrecache, ResourceList_t hResourceList, bool bIgnoreConditionals ) \
{ \
if ( !bIgnoreConditionals && !( _condition ) ) \
return;
#define PRECACHE_REGISTER_BEGIN( _system, _className ) \
PRECACHE_REGISTER_BEGIN_CONDITIONAL( _system, _className, true )
// Resource precache definitions
#define PRECACHE( _type, _name ) pPrecacheHandler->CacheResource( _type, _name, bPrecache, hResourceList, NULL );
// NOTE: PRECACHE_INDEX_CONDITIONAL doesn't initialize the index to 0
// on the assumption that some other conditional will
//MCCLEANUP //NOTE: PRECACHE_INDEX and PRECACHE_INDEX_CONDITIONAL won't work in 64 bit because the old-school particle mgr is sending ptr data types into here. Hopefully the old-school particle mgr will die before this is an issue.
#define PRECACHE_INDEX( _type, _name, _index ) pPrecacheHandler->CacheResource( _type, _name, bPrecache, hResourceList, (int*)( &(_index) ) );
#define PRECACHE_CONDITIONAL( _type, _name, _condition ) \
if ( !bIgnoreConditionals && ( _condition ) ) \
pPrecacheHandler->CacheResource( _type, _name, bPrecache, hResourceList, NULL );
#define PRECACHE_INDEX_CONDITIONAL( _type, _name, _index, _func ) \
if ( bIgnoreConditionals || ( _condition ) ) \
{ \
pPrecacheHandler->CacheResource( _type, _name, bPrecache, hResourceList, (int*)( &(_index) ) ); \
}
//End
#define PRECACHE_REGISTER_END( ) \
} \
CResourcePrecacher s_ResourcePrecacher; \
}
// FIXME: Remove! Backward compat
#define PRECACHE_WEAPON_REGISTER( _className ) \
PRECACHE_REGISTER_BEGIN( GLOBAL, _className ) \
PRECACHE( ENTITY, #_className ) \
PRECACHE_REGISTER_END()
#define PRECACHE_REGISTER( _className ) \
PRECACHE_REGISTER_BEGIN( GLOBAL, _className ) \
PRECACHE( ENTITY, #_className ) \
PRECACHE_REGISTER_END()
#endif // _RESOURCEPRECACHER_H