Counter Strike : Global Offensive Source Code
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.
|
|
//========= Copyright � 1996-2005, Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//=============================================================================//
#include "cbase.h"
#include "particle_litsmokeemitter.h"
// NOTE: This has to be the last file included!
#include "tier0/memdbgon.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(); } }
|