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.
150 lines
4.2 KiB
150 lines
4.2 KiB
//========= 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
|
|
|