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.
135 lines
3.9 KiB
135 lines
3.9 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
//=============================================================================// |
|
|
|
#include "cbase.h" |
|
#include "particles_simple.h" |
|
#include "particles_localspace.h" |
|
#include "c_te_effect_dispatch.h" |
|
#include "clienteffectprecachesystem.h" |
|
|
|
#include "fx.h" |
|
#include "r_efx.h" |
|
#include "dlight.h" |
|
#include "dod_shareddefs.h" |
|
|
|
// Precache our effects |
|
CLIENTEFFECT_REGISTER_BEGIN( PrecacheEffect_DOD_MuzzleFlash ) |
|
CLIENTEFFECT_MATERIAL( "sprites/effects/muzzleflash1" ) |
|
CLIENTEFFECT_MATERIAL( "sprites/effects/muzzleflash2" ) |
|
CLIENTEFFECT_REGISTER_END() |
|
|
|
ConVar cl_muzzleflash_dlight_1st( "cl_muzzleflash_dlight_1st", "1" ); |
|
|
|
void TE_DynamicLight( IRecipientFilter& filter, float delay, |
|
const Vector* org, int r, int g, int b, int exponent, float radius, float time, float decay, int nLightIndex = LIGHT_INDEX_TE_DYNAMIC ); |
|
|
|
void DOD_MuzzleFlashCallback( const CEffectData &data ) |
|
{ |
|
CSmartPtr<CLocalSpaceEmitter> pEmitter = |
|
CLocalSpaceEmitter::Create( "DOD_MuzzleFlash", data.m_hEntity, data.m_nAttachmentIndex, 0 ); |
|
|
|
if ( !pEmitter ) |
|
return; |
|
|
|
// SetBBox() manually on the particle system so it doesn't have to be recalculated more than once. |
|
Vector vCenter( 0.0f, 0.0f, 0.0f ); |
|
C_BaseEntity *pEnt = data.GetEntity(); |
|
if ( pEnt ) |
|
{ |
|
vCenter = pEnt->WorldSpaceCenter(); |
|
} |
|
else |
|
{ |
|
IClientRenderable *pRenderable = data.GetRenderable( ); |
|
if ( pRenderable ) |
|
{ |
|
Vector vecMins, vecMaxs; |
|
pRenderable->GetRenderBoundsWorldspace( vecMins, vecMaxs ); |
|
VectorAdd( vecMins, vecMaxs, vCenter ); |
|
vCenter *= 0.5f; |
|
} |
|
} |
|
|
|
Assert( pEmitter ); |
|
pEmitter->GetBinding().SetBBox( vCenter - Vector( 10, 10, 10 ), vCenter + Vector( 10, 10, 10 ) ); |
|
|
|
// haxors - make the clip much shorter so the alpha is not |
|
// changed based on large clip distances |
|
pEmitter->SetNearClip( 0, 5 ); |
|
|
|
Vector vFlashOffset = vec3_origin; |
|
Vector vForward(1,0,0); |
|
int i; |
|
|
|
if( data.m_nHitBox == DOD_MUZZLEFLASH_MG ) //Machine gun |
|
{ |
|
SimpleParticle *pParticle = (SimpleParticle *)pEmitter->AddParticle( sizeof( SimpleParticle ), |
|
g_Mat_SMG_Muzzleflash[0], |
|
vFlashOffset ); |
|
Assert( pParticle ); |
|
if( pParticle ) |
|
{ |
|
pParticle->m_flLifetime = 0.0f; |
|
pParticle->m_flDieTime = 0.1f; |
|
|
|
pParticle->m_vecVelocity = Vector(0,0,0); |
|
|
|
pParticle->m_uchColor[0] = 255; |
|
pParticle->m_uchColor[1] = 255; |
|
pParticle->m_uchColor[2] = 255; |
|
|
|
pParticle->m_uchStartAlpha = 210.0f; |
|
pParticle->m_uchEndAlpha = 0; |
|
|
|
pParticle->m_uchStartSize = random->RandomFloat( 120, 130 ) * data.m_flMagnitude; |
|
pParticle->m_uchEndSize = pParticle->m_uchStartSize; |
|
pParticle->m_flRoll = 0; |
|
pParticle->m_flRollDelta = 0.0f; |
|
} |
|
} |
|
else |
|
{ |
|
for( i=0;i<3;i++ ) |
|
{ |
|
//move the three sprites around |
|
|
|
vFlashOffset = vForward * ( (2-i)*6 + 10 ); |
|
|
|
SimpleParticle *pParticle = (SimpleParticle *)pEmitter->AddParticle( sizeof( SimpleParticle ), |
|
g_Mat_SMG_Muzzleflash[1], |
|
vFlashOffset ); |
|
Assert( pParticle ); |
|
if( pParticle ) |
|
{ |
|
pParticle->m_flLifetime = 0.0f; |
|
pParticle->m_flDieTime = 0.1f; |
|
|
|
pParticle->m_vecVelocity = vec3_origin; |
|
|
|
pParticle->m_uchColor[0] = 255; |
|
pParticle->m_uchColor[1] = 255; |
|
pParticle->m_uchColor[2] = 255; |
|
|
|
pParticle->m_uchStartAlpha = 100.0f; |
|
pParticle->m_uchEndAlpha = 30; |
|
|
|
pParticle->m_uchStartSize = ( 15.0 + 20.0*i ) * data.m_flMagnitude; |
|
pParticle->m_uchEndSize = pParticle->m_uchStartSize; |
|
pParticle->m_flRoll = random->RandomInt( 0, 360 ); |
|
pParticle->m_flRollDelta = 0.0f; |
|
} |
|
} |
|
} |
|
|
|
// dynamic light temporary entity for the muzzle flash |
|
if ( cl_muzzleflash_dlight_1st.GetBool() ) |
|
{ |
|
CPVSFilter filter(pEmitter->GetSortOrigin()); |
|
TE_DynamicLight( filter, 0.0, &(pEmitter->GetSortOrigin()), 255, 192, 64, 5, 70, 0.05, 768 ); |
|
} |
|
} |
|
|
|
DECLARE_CLIENT_EFFECT( "DOD_MuzzleFlash", DOD_MuzzleFlashCallback ); |