Modified source engine (2017) developed by valve and leaked in 2020. Not for commercial purporses
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

5 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();
}
}