mirror of
https://github.com/nillerusr/source-engine.git
synced 2026-08-12 03:39:10 +00:00
1
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user