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.
140 lines
3.8 KiB
140 lines
3.8 KiB
![]()
4 years ago
|
//========= 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();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|