diff options
Diffstat (limited to 'game/client/particle_proxies.cpp')
| -rw-r--r-- | game/client/particle_proxies.cpp | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/game/client/particle_proxies.cpp b/game/client/particle_proxies.cpp new file mode 100644 index 0000000..0e98330 --- /dev/null +++ b/game/client/particle_proxies.cpp @@ -0,0 +1,77 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: This module implements all the proxies used by the particle systems. +// +// $NoKeywords: $ +//=============================================================================// +#include "cbase.h" +#include "particlemgr.h" +#include "materialsystem/imaterialproxy.h" +#include "materialsystem/imaterialvar.h" + +// memdbgon must be the last include file in a .cpp file!!! +#include "tier0/memdbgon.h" + + +// ------------------------------------------------------------------------ // +// ParticleSphereProxy +// ------------------------------------------------------------------------ // + +class ParticleSphereProxy : public IMaterialProxy +{ +// IMaterialProxy overrides. +public: + ParticleSphereProxy() + { + } + + virtual ~ParticleSphereProxy() + { + } + + virtual bool Init( IMaterial *pMaterial, KeyValues *pKeyValues ) + { + m_pLightPosition = pMaterial->FindVar( "$light_position", NULL, false ); + m_pLightColor = pMaterial->FindVar( "$light_color", NULL, false ); + return true; + } + + virtual void OnBind( void *pvParticleMgr ) + { + if( !pvParticleMgr ) + return; + + CParticleMgr *pMgr = (CParticleMgr*)pvParticleMgr; + CParticleLightInfo info; + pMgr->GetDirectionalLightInfo( info ); + + // Transform the light into camera space. + Vector vTransformedPos = pMgr->GetModelView() * info.m_vPos; + if ( m_pLightPosition ) + m_pLightPosition->SetVecValue( vTransformedPos.Base(), 3 ); + + if ( m_pLightColor ) + { + Vector vTotalColor = info.m_vColor * info.m_flIntensity; + m_pLightColor->SetVecValue( vTotalColor.Base(), 3 ); + } + } + + virtual void Release( void ) { delete this; } + + virtual IMaterial *GetMaterial() + { + IMaterialVar *pVar = m_pLightPosition ? m_pLightPosition : m_pLightColor; + if ( !pVar ) + return NULL; + return pVar->GetOwningMaterial(); + } + +private: + + IMaterialVar *m_pLightPosition; + IMaterialVar *m_pLightColor; +}; + +EXPOSE_INTERFACE( ParticleSphereProxy, IMaterialProxy, "ParticleSphereProxy" IMATERIAL_PROXY_INTERFACE_VERSION ); + |