hl2_src-leak-2017/src/game/client/clienteffectprecachesystem.h

151 lines
4.2 KiB
C++

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