diff options
Diffstat (limited to 'game/client/hl2/c_env_starfield.cpp')
| -rw-r--r-- | game/client/hl2/c_env_starfield.cpp | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/game/client/hl2/c_env_starfield.cpp b/game/client/hl2/c_env_starfield.cpp new file mode 100644 index 0000000..632c6f3 --- /dev/null +++ b/game/client/hl2/c_env_starfield.cpp @@ -0,0 +1,132 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// +#include "cbase.h" +#include "engine/IEngineTrace.h" +#include "fx_sparks.h" +#include "particles_ez.h" +#include "view.h" + +// memdbgon must be the last include file in a .cpp file!!! +#include "tier0/memdbgon.h" + +ConVar cl_starfield_diameter( "cl_starfield_diameter", "128.0", FCVAR_NONE ); +ConVar cl_starfield_distance( "cl_starfield_distance", "256.0", FCVAR_NONE ); + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +class C_EnvStarfield : public C_BaseEntity +{ + DECLARE_CLASS( C_EnvStarfield, C_BaseEntity ); +public: + DECLARE_CLIENTCLASS(); + + C_EnvStarfield(); + + virtual void OnDataChanged( DataUpdateType_t updateType ); + virtual void ClientThink( void ); + +private: + // Emitter + CSmartPtr<CTrailParticles> m_pEmitter; + bool m_bOn; + float m_flDensity; + float m_flNumParticles; + +private: + C_EnvStarfield( const C_EnvStarfield & ); +}; + +IMPLEMENT_CLIENTCLASS_DT( C_EnvStarfield, DT_EnvStarfield, CEnvStarfield ) + RecvPropInt( RECVINFO(m_bOn) ), + RecvPropFloat( RECVINFO(m_flDensity) ), +END_RECV_TABLE() + +// ------------------------------------------------------------------------- // +// C_EnvStarfield +// ------------------------------------------------------------------------- // +C_EnvStarfield::C_EnvStarfield() +{ + m_bOn = false; + m_flDensity = 1.0; + m_flNumParticles = 0; +} + +//----------------------------------------------------------------------------- +// Purpose: +// Input : updateType - +//----------------------------------------------------------------------------- +void C_EnvStarfield::OnDataChanged( DataUpdateType_t updateType ) +{ + if ( updateType == DATA_UPDATE_CREATED ) + { + m_pEmitter = CTrailParticles::Create( "EnvStarfield" ); + Vector vecCenter = MainViewOrigin() + (MainViewForward() * cl_starfield_distance.GetFloat() ); + m_pEmitter->Setup( (Vector &) vecCenter, + NULL, + 0.0, + 0, + 64, + 0, + 0, + bitsPARTICLE_TRAIL_VELOCITY_DAMPEN | bitsPARTICLE_TRAIL_FADE | bitsPARTICLE_TRAIL_FADE_IN ); + + // Start thinking + SetNextClientThink( CLIENT_THINK_ALWAYS ); + } + + BaseClass::OnDataChanged( updateType ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void C_EnvStarfield::ClientThink( void ) +{ + if ( !m_bOn || !m_flDensity ) + return; + + PMaterialHandle hParticleMaterial = m_pEmitter->GetPMaterial( "effects/spark_noz" ); + + // Find a start & end point for the particle + // Start particles straight ahead of the client + Vector vecViewOrigin = MainViewOrigin(); + + // Determine the number of particles + m_flNumParticles += 1.0 * (m_flDensity); + int iNumParticles = floor(m_flNumParticles); + m_flNumParticles -= iNumParticles; + + // Add particles + for ( int i = 0; i < iNumParticles; i++ ) + { + float flDiameter = cl_starfield_diameter.GetFloat(); + + Vector vecStart = vecViewOrigin + (MainViewForward() * cl_starfield_distance.GetFloat() ); + Vector vecEnd = vecViewOrigin + (MainViewRight() * RandomFloat(-flDiameter,flDiameter)) + (MainViewUp() * RandomFloat(-flDiameter,flDiameter)); + Vector vecDir = (vecEnd - vecStart); + float flDistance = VectorNormalize( vecDir ); + float flTravelTime = 2.0; + + // Start a random amount along the path + vecStart += vecDir * ( RandomFloat(0.1,0.3) * flDistance ); + + TrailParticle *pParticle = (TrailParticle *) m_pEmitter->AddParticle( sizeof(TrailParticle), hParticleMaterial, vecStart ); + if ( pParticle ) + { + pParticle->m_vecVelocity = vecDir * (flDistance / flTravelTime); + pParticle->m_flDieTime = flTravelTime; + pParticle->m_flLifetime = 0; + pParticle->m_flWidth = RandomFloat( 1, 3 ); + pParticle->m_flLength = RandomFloat( 0.05, 0.4 ); + pParticle->m_color.r = 255; + pParticle->m_color.g = 255; + pParticle->m_color.b = 255; + pParticle->m_color.a = 255; + } + } +}
\ No newline at end of file |