Team Fortress 2 Source Code as on 22/4/2020
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.
|
|
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: Deals with singleton
//
// $Revision: $
// $NoKeywords: $
//=============================================================================//
#if !defined( CLIENTEFFECTPRECACHESYSTEM_H )
#define CLIENTEFFECTPRECACHESYSTEM_H
#ifdef _WIN32
#pragma once
#endif
#include "igamesystem.h"
#include "commonmacros.h"
#include "utlvector.h"
#include "materialsystem/imaterialsystem.h"
#include "materialsystem/imaterial.h"
//-----------------------------------------------------------------------------
// Interface to automated system for precaching materials
//-----------------------------------------------------------------------------
class IClientEffect { public: virtual void Cache( bool precache = true ) = 0; };
//-----------------------------------------------------------------------------
// Responsible for managing precaching of particles
//-----------------------------------------------------------------------------
class CClientEffectPrecacheSystem : public IGameSystem { public: virtual char const *Name() { return "CCLientEffectPrecacheSystem"; }
virtual bool IsPerFrame() { return false; }
// constructor, destructor
CClientEffectPrecacheSystem() {} virtual ~CClientEffectPrecacheSystem() {}
// Init, shutdown
virtual bool Init() { return true; } virtual void PostInit() {} virtual void Shutdown();
// Level init, shutdown
virtual void LevelInitPreEntity(); virtual void LevelInitPostEntity() {} virtual void LevelShutdownPreEntity(); virtual void LevelShutdownPostEntity();
virtual void OnSave() {} virtual void OnRestore() {} virtual void SafeRemoveIfDesired() {}
void Register( IClientEffect *effect );
protected:
CUtlVector< IClientEffect * > m_Effects; };
//Singleton accessor
extern CClientEffectPrecacheSystem *ClientEffectPrecacheSystem();
//-----------------------------------------------------------------------------
// Deals with automated registering and precaching of materials for effects
//-----------------------------------------------------------------------------
class CClientEffect : public IClientEffect { public:
CClientEffect( void ) { //Register with the main effect system
ClientEffectPrecacheSystem()->Register( this ); }
//-----------------------------------------------------------------------------
// Purpose: Precache a material by artificially incrementing its reference counter
// Input : *materialName - name of the material
// : increment - whether to increment or decrement the reference counter
//-----------------------------------------------------------------------------
inline void ReferenceMaterial( const char *materialName, bool increment = true ) { IMaterial *material = materials->FindMaterial( materialName, TEXTURE_GROUP_CLIENT_EFFECTS ); if ( !IsErrorMaterial( material ) ) { if ( increment ) { material->IncrementReferenceCount(); } else { material->DecrementReferenceCount(); } } } };
//Automatic precache macros
//Beginning
#define CLIENTEFFECT_REGISTER_BEGIN( className ) \
namespace className { \ class ClientEffectRegister : public CClientEffect \ { \ private: \ static const char *m_pszMaterials[]; \ public: \ void Cache( bool precache = true ); \ }; \ const char *ClientEffectRegister::m_pszMaterials[] = {
//Material definitions
#define CLIENTEFFECT_MATERIAL( materialName ) materialName,
//End
#define CLIENTEFFECT_REGISTER_END( ) }; \
void ClientEffectRegister::Cache( bool precache ) \ { \ for ( int i = 0; i < ARRAYSIZE( m_pszMaterials ); i++ ) \ { \ ReferenceMaterial( m_pszMaterials[i], precache ); \ } \ } \ ClientEffectRegister register_ClientEffectRegister; \ }
#define CLIENTEFFECT_REGISTER_END_CONDITIONAL(condition ) }; \
void ClientEffectRegister::Cache( bool precache ) \ { \ if ( condition) \ { \ for ( int i = 0; i < ARRAYSIZE( m_pszMaterials ); i++ ) \ { \ ReferenceMaterial( m_pszMaterials[i], precache ); \ } \ } \ } \ ClientEffectRegister register_ClientEffectRegister; \ }
#endif //CLIENTEFFECTPRECACHESYSTEM_H
|