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.
138 lines
4.0 KiB
138 lines
4.0 KiB
5 years ago
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
//
|
||
|
// Purpose:
|
||
|
//
|
||
|
//=============================================================================//
|
||
|
#include "cbase.h"
|
||
|
#include "particles_simple.h"
|
||
|
#include "particlemgr.h"
|
||
|
#include "particle_collision.h"
|
||
|
#include "env_objecteffects.h"
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CObjectSmokeParticles::Setup( const Vector &origin, const Vector *direction, float angularSpread, float minSpeed, float maxSpeed, float gravity, float dampen, int flags )
|
||
|
{
|
||
|
// See if we've specified a direction
|
||
|
m_ParticleCollision.Setup( origin, direction, angularSpread, minSpeed, maxSpeed, gravity, dampen );
|
||
|
}
|
||
|
|
||
|
void CObjectSmokeParticles::SimulateParticles( CParticleSimulateIterator *pIterator )
|
||
|
{
|
||
|
float timeDelta = pIterator->GetTimeDelta();
|
||
|
|
||
|
ObjectSmokeParticle *pParticle = (ObjectSmokeParticle*)pIterator->GetFirst();
|
||
|
while ( pParticle )
|
||
|
{
|
||
|
//Update velocity
|
||
|
UpdateVelocity( pParticle, timeDelta );
|
||
|
pParticle->m_Pos += (pParticle->m_vecVelocity * timeDelta);
|
||
|
pParticle->m_vecVelocity += pParticle->m_vecAcceleration * 2 * timeDelta;
|
||
|
|
||
|
//Should this particle die?
|
||
|
pParticle->m_flLifetime += timeDelta;
|
||
|
UpdateRoll( pParticle, timeDelta );
|
||
|
|
||
|
if ( pParticle->m_flLifetime >= pParticle->m_flDieTime )
|
||
|
pIterator->RemoveParticle( pParticle );
|
||
|
|
||
|
pParticle = (ObjectSmokeParticle*)pIterator->GetNext();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
void CObjectSmokeParticles::RenderParticles( CParticleRenderIterator *pIterator )
|
||
|
{
|
||
|
const ObjectSmokeParticle *pParticle = (const ObjectSmokeParticle *)pIterator->GetFirst();
|
||
|
while ( pParticle )
|
||
|
{
|
||
|
//Render
|
||
|
Vector tPos;
|
||
|
|
||
|
TransformParticle( ParticleMgr()->GetModelView(), pParticle->m_Pos, tPos );
|
||
|
float sortKey = (int) tPos.z;
|
||
|
|
||
|
//Render it
|
||
|
RenderParticle_ColorSizeAngle(
|
||
|
pIterator->GetParticleDraw(),
|
||
|
tPos,
|
||
|
UpdateColor( pParticle ),
|
||
|
UpdateAlpha( pParticle ) * GetAlphaDistanceFade( tPos, m_flNearClipMin, m_flNearClipMax ),
|
||
|
UpdateScale( pParticle ),
|
||
|
pParticle->m_flRoll );
|
||
|
|
||
|
pParticle = (const ObjectSmokeParticle *)pIterator->GetNext( sortKey );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CObjectFireParticles::Setup( const Vector &origin, const Vector *direction, float angularSpread, float minSpeed, float maxSpeed, float gravity, float dampen, int flags )
|
||
|
{
|
||
|
}
|
||
|
|
||
|
void CObjectFireParticles::SimulateParticles( CParticleSimulateIterator *pIterator )
|
||
|
{
|
||
|
float timeDelta = pIterator->GetTimeDelta();
|
||
|
|
||
|
ObjectFireParticle *pParticle = (ObjectFireParticle*)pIterator->GetFirst();
|
||
|
while ( pParticle )
|
||
|
{
|
||
|
// Lost our parent?
|
||
|
if ( !pParticle->m_hParent )
|
||
|
{
|
||
|
pIterator->RemoveParticle( pParticle );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// Update position to match our parent
|
||
|
Vector vecFire;
|
||
|
QAngle angFire;
|
||
|
if ( pParticle->m_hParent->GetAttachment( pParticle->m_iAttachmentPoint, vecFire, angFire ) )
|
||
|
{
|
||
|
pParticle->m_Pos = vecFire;
|
||
|
}
|
||
|
|
||
|
// Should this particle die?
|
||
|
pParticle->m_flLifetime += timeDelta;
|
||
|
|
||
|
UpdateRoll( pParticle, timeDelta );
|
||
|
|
||
|
if ( pParticle->m_flLifetime >= pParticle->m_flDieTime )
|
||
|
pIterator->RemoveParticle( pParticle );
|
||
|
}
|
||
|
|
||
|
pParticle = (ObjectFireParticle*)pIterator->GetNext();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
void CObjectFireParticles::RenderParticles( CParticleRenderIterator *pIterator )
|
||
|
{
|
||
|
const ObjectFireParticle *pParticle = (const ObjectFireParticle *)pIterator->GetFirst();
|
||
|
while ( pParticle )
|
||
|
{
|
||
|
// Render
|
||
|
Vector tPos;
|
||
|
TransformParticle( ParticleMgr()->GetModelView(), pParticle->m_Pos, tPos );
|
||
|
float sortKey = (int) tPos.z;
|
||
|
|
||
|
// Render it
|
||
|
RenderParticle_ColorSizeAngle(
|
||
|
pIterator->GetParticleDraw(),
|
||
|
tPos,
|
||
|
UpdateColor( pParticle ),
|
||
|
UpdateAlpha( pParticle ) * GetAlphaDistanceFade( tPos, m_flNearClipMin, m_flNearClipMax ),
|
||
|
UpdateScale( pParticle ),
|
||
|
pParticle->m_flRoll
|
||
|
);
|
||
|
|
||
|
pParticle = (const ObjectFireParticle *)pIterator->GetNext( sortKey );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|