mirror of
https://github.com/nillerusr/source-engine.git
synced 2024-12-23 06:36:54 +00:00
151 lines
4.2 KiB
C
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
|