summaryrefslogtreecommitdiff
path: root/game/client/particle_litsmokeemitter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'game/client/particle_litsmokeemitter.cpp')
-rw-r--r--game/client/particle_litsmokeemitter.cpp139
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();
+ }
+}
+
+