109 lines
2.5 KiB
C++
109 lines
2.5 KiB
C++
//========= Copyright Valve Corporation, All rights reserved. ============//
|
|
//
|
|
// Purpose:
|
|
//
|
|
//=============================================================================//
|
|
|
|
#ifndef C_IMPACT_EFFECTS_H
|
|
#define C_IMPACT_EFFECTS_H
|
|
#ifdef _WIN32
|
|
#pragma once
|
|
#endif
|
|
|
|
#include "tier0/memdbgon.h"
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Purpose: DustParticle emitter
|
|
//-----------------------------------------------------------------------------
|
|
class CDustParticle : public CSimpleEmitter
|
|
{
|
|
public:
|
|
|
|
CDustParticle( const char *pDebugName ) : CSimpleEmitter( pDebugName ) {}
|
|
|
|
//Create
|
|
static CDustParticle *Create( const char *pDebugName="dust" )
|
|
{
|
|
return new CDustParticle( pDebugName );
|
|
}
|
|
|
|
//Roll
|
|
virtual float UpdateRoll( SimpleParticle *pParticle, float timeDelta )
|
|
{
|
|
pParticle->m_flRoll += pParticle->m_flRollDelta * timeDelta;
|
|
|
|
pParticle->m_flRollDelta += pParticle->m_flRollDelta * ( timeDelta * -8.0f );
|
|
|
|
#ifdef _XBOX
|
|
//Cap the minimum roll
|
|
if ( fabs( pParticle->m_flRollDelta ) < 0.1f )
|
|
{
|
|
pParticle->m_flRollDelta = ( pParticle->m_flRollDelta > 0.0f ) ? 0.1f : -0.1f;
|
|
}
|
|
#else
|
|
if ( fabs( pParticle->m_flRollDelta ) < 0.5f )
|
|
{
|
|
pParticle->m_flRollDelta = ( pParticle->m_flRollDelta > 0.0f ) ? 0.5f : -0.5f;
|
|
}
|
|
#endif // _XBOX
|
|
|
|
return pParticle->m_flRoll;
|
|
}
|
|
|
|
//Velocity
|
|
virtual void UpdateVelocity( SimpleParticle *pParticle, float timeDelta )
|
|
{
|
|
Vector saveVelocity = pParticle->m_vecVelocity;
|
|
|
|
//Decellerate
|
|
static float dtime;
|
|
static float decay;
|
|
|
|
if ( dtime != timeDelta )
|
|
{
|
|
dtime = timeDelta;
|
|
float expected = 0.5;
|
|
decay = exp( log( 0.0001f ) * dtime / expected );
|
|
}
|
|
|
|
pParticle->m_vecVelocity = pParticle->m_vecVelocity * decay;
|
|
|
|
#ifdef _XBOX
|
|
//Cap the minimum speed
|
|
if ( pParticle->m_vecVelocity.LengthSqr() < (8.0f*8.0f) )
|
|
{
|
|
VectorNormalize( saveVelocity );
|
|
pParticle->m_vecVelocity = saveVelocity * 8.0f;
|
|
}
|
|
#else
|
|
if ( pParticle->m_vecVelocity.LengthSqr() < (32.0f*32.0f) )
|
|
{
|
|
VectorNormalize( saveVelocity );
|
|
pParticle->m_vecVelocity = saveVelocity * 32.0f;
|
|
}
|
|
#endif // _XBOX
|
|
}
|
|
|
|
//Alpha
|
|
virtual float UpdateAlpha( const SimpleParticle *pParticle )
|
|
{
|
|
float tLifetime = pParticle->m_flLifetime / pParticle->m_flDieTime;
|
|
float ramp = 1.0f - tLifetime;
|
|
|
|
//Non-linear fade
|
|
if ( ramp < 0.75f )
|
|
ramp *= ramp;
|
|
|
|
return ramp;
|
|
}
|
|
|
|
private:
|
|
CDustParticle( const CDustParticle & ); // not defined, not accessible
|
|
};
|
|
|
|
void GetColorForSurface( trace_t *trace, Vector *color );
|
|
|
|
#include "tier0/memdbgoff.h"
|
|
|
|
#endif // C_IMPACT_EFFECTS_H
|