//===== 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