mirror of
https://github.com/nillerusr/source-engine.git
synced 2026-08-08 09:49:36 +00:00
1
This commit is contained in:
@@ -0,0 +1,137 @@
|
||||
//========= 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 );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user