diff options
Diffstat (limited to 'game/client/particle_litsmokeemitter.cpp')
| -rw-r--r-- | game/client/particle_litsmokeemitter.cpp | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/game/client/particle_litsmokeemitter.cpp b/game/client/particle_litsmokeemitter.cpp new file mode 100644 index 0000000..4d6398c --- /dev/null +++ b/game/client/particle_litsmokeemitter.cpp @@ -0,0 +1,139 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//=============================================================================// + +#include "cbase.h" +#include "particle_litsmokeemitter.h" + + +// +// CLitSmokeEmitter +// + +CLitSmokeEmitter::CLitSmokeEmitter( const char *pDebugName ) : CSimpleEmitter( pDebugName ) +{ + m_bInitted = false; + m_hSmokeMaterial = INVALID_MATERIAL_HANDLE; +} + +//----------------------------------------------------------------------------- +// Purpose: +// Input : *materialName - +//----------------------------------------------------------------------------- +void CLitSmokeEmitter::Init( const char *materialName, Vector sortOrigin ) +{ + m_hSmokeMaterial = GetPMaterial( materialName ); + + IMaterial *pMaterial = ParticleMgr()->PMaterialToIMaterial( m_hSmokeMaterial ); + if ( pMaterial ) + { + m_Renderer.Init( ParticleMgr(), pMaterial ); + } + + SetSortOrigin( sortOrigin ); + m_bInitted = true; +} + +//----------------------------------------------------------------------------- +// Purpose: +// Input : position - +// color - +//----------------------------------------------------------------------------- +void CLitSmokeEmitter::SetDirectionalLight( Vector position, Vector color, float intensity ) +{ + CParticleLightInfo info; + info.m_flIntensity = intensity; + info.m_vColor = color; + info.m_vPos = position; + + m_Renderer.SetDirectionalLight( info ); +} + +//----------------------------------------------------------------------------- +// Purpose: +// Input : position - +// color - +// intensity - +//----------------------------------------------------------------------------- +void CLitSmokeEmitter::SetLight( Vector position, Vector color, float intensity ) +{ + CParticleLightInfo info; + info.m_flIntensity = intensity; + info.m_vColor = color; + info.m_vPos = position; + + m_Renderer.SetAmbientLight( info ); +} + +//----------------------------------------------------------------------------- +// Purpose: +// Input : flTimeDelta - +//----------------------------------------------------------------------------- +void CLitSmokeEmitter::Update( float flTimeDelta ) +{ + if ( flTimeDelta > 0.0f ) + { + //m_Renderer.DirectionalLight().m_vColor *= 0.9f; + } + + CSimpleEmitter::Update( flTimeDelta ); +} + +void CLitSmokeEmitter::StartRender( VMatrix &effectMatrix ) +{ + m_Renderer.StartRender( effectMatrix ); +} + +void CLitSmokeEmitter::RenderParticles( CParticleRenderIterator *pIterator ) +{ + const LitSmokeParticle *pParticle = (const LitSmokeParticle*)pIterator->GetFirst(); + while ( pParticle ) + { + float tLifetime = pParticle->m_flLifetime / pParticle->m_flDieTime; + + // Transform. + Vector tPos; + + TransformParticle( ParticleMgr()->GetModelView(), pParticle->m_Pos, tPos ); + float sortKey = tPos.z; + + float alpha255 = ( ( (float) pParticle->m_uchColor[3]/255.0f ) * sin( M_PI_F * tLifetime ) ) * 255.0f; + + Vector color01 = Vector( pParticle->m_uchColor[0], pParticle->m_uchColor[1], pParticle->m_uchColor[2] ) * (tLifetime / 255.0f); + + m_Renderer.RenderParticle_AddColor ( + pIterator->GetParticleDraw(), + pParticle->m_Pos, + tPos, + alpha255, + FLerp( pParticle->m_uchStartSize, pParticle->m_uchEndSize, tLifetime ), + color01 + ); + + pParticle = (const LitSmokeParticle*)pIterator->GetNext( sortKey ); + } +} + + +void CLitSmokeEmitter::SimulateParticles( CParticleSimulateIterator *pIterator ) +{ + // Make sure they've called Init(). + Assert( m_bInitted ); + + LitSmokeParticle *pParticle = (LitSmokeParticle*)pIterator->GetFirst(); + while ( pParticle ) + { + // Should this particle die? + pParticle->m_flLifetime += pIterator->GetTimeDelta(); + pParticle->m_Pos = pParticle->m_Pos + ( pParticle->m_vecVelocity * pIterator->GetTimeDelta() ); + + if ( pParticle->m_flLifetime >= pParticle->m_flDieTime ) + pIterator->RemoveParticle( pParticle ); + + pParticle = (LitSmokeParticle*)pIterator->GetNext(); + } +} + + |