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.
219 lines
5.9 KiB
219 lines
5.9 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
|
|
#include "cbase.h" |
|
#include "fx.h" |
|
#include "particlemgr.h" |
|
#include "particle_prototype.h" |
|
#include "particle_util.h" |
|
#include "c_te_particlesystem.h" |
|
#include "particles_ez.h" |
|
|
|
// memdbgon must be the last include file in a .cpp file!!! |
|
#include "tier0/memdbgon.h" |
|
|
|
#define DUST_STARTSIZE 16 |
|
#define DUST_ENDSIZE 48 |
|
#define DUST_RADIUS 32.0f |
|
#define DUST_STARTALPHA 0.3f |
|
#define DUST_ENDALPHA 0.0f |
|
#define DUST_LIFETIME 2.0f |
|
|
|
static Vector g_AntlionDustColor( 0.3f, 0.25f, 0.2f ); |
|
|
|
extern IPhysicsSurfaceProps *physprops; |
|
|
|
class CAntlionDustEmitter : public CSimpleEmitter |
|
{ |
|
public: |
|
static CAntlionDustEmitter *Create( const char *debugname ) |
|
{ |
|
return new CAntlionDustEmitter( debugname ); |
|
} |
|
|
|
void UpdateVelocity( SimpleParticle *pParticle, float timeDelta ) |
|
{ |
|
//FIXME: Incorrect |
|
pParticle->m_vecVelocity *= 0.9f; |
|
} |
|
|
|
private: |
|
CAntlionDustEmitter( const char *pDebugName ) : CSimpleEmitter( pDebugName ) {} |
|
CAntlionDustEmitter( const CAntlionDustEmitter & ); // not defined, not accessible |
|
}; |
|
|
|
//================================================== |
|
// C_TEAntlionDust |
|
//================================================== |
|
|
|
class C_TEAntlionDust: public C_TEParticleSystem |
|
{ |
|
public: |
|
|
|
DECLARE_CLASS( C_TEAntlionDust, C_TEParticleSystem ); |
|
DECLARE_CLIENTCLASS(); |
|
|
|
C_TEAntlionDust(); |
|
virtual ~C_TEAntlionDust(); |
|
|
|
//C_BaseEntity |
|
public: |
|
virtual void PostDataUpdate( DataUpdateType_t updateType ); |
|
virtual bool ShouldDraw() { return true; } |
|
|
|
|
|
//IParticleEffect |
|
public: |
|
virtual void RenderParticles( CParticleRenderIterator *pIterator ); |
|
virtual void SimulateParticles( CParticleSimulateIterator *pIterator ); |
|
|
|
public: |
|
PMaterialHandle m_MaterialHandle; |
|
|
|
Vector m_vecOrigin; |
|
QAngle m_vecAngles; |
|
bool m_bBlockedSpawner; |
|
|
|
protected: |
|
void GetDustColor( Vector &color ); |
|
}; |
|
|
|
// Expose to the particle app. |
|
EXPOSE_PROTOTYPE_EFFECT( AntlionDust, C_TEAntlionDust ); |
|
|
|
IMPLEMENT_CLIENTCLASS_EVENT_DT( C_TEAntlionDust, DT_TEAntlionDust, CTEAntlionDust ) |
|
RecvPropVector(RECVINFO( m_vecOrigin )), |
|
RecvPropVector(RECVINFO( m_vecAngles )), |
|
RecvPropBool(RECVINFO( m_bBlockedSpawner )), |
|
END_RECV_TABLE() |
|
|
|
//================================================== |
|
// C_TEAntlionDust |
|
//================================================== |
|
|
|
C_TEAntlionDust::C_TEAntlionDust() |
|
{ |
|
m_MaterialHandle = INVALID_MATERIAL_HANDLE; |
|
m_vecOrigin.Init(); |
|
m_vecAngles.Init(); |
|
m_bBlockedSpawner = false; |
|
} |
|
|
|
C_TEAntlionDust::~C_TEAntlionDust() |
|
{ |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
// Input : bNewEntity - whether or not to start a new entity |
|
//----------------------------------------------------------------------------- |
|
|
|
void C_TEAntlionDust::PostDataUpdate( DataUpdateType_t updateType ) |
|
{ |
|
// This style of creating dust emitters is now deprecated; we use the simple particle singleton exclusively. |
|
/* |
|
CSmartPtr<CAntlionDustEmitter> pDustEmitter = CAntlionDustEmitter::Create( "TEAntlionDust" ); |
|
Assert( pDustEmitter ); |
|
if ( pDustEmitter == NULL ) |
|
return; |
|
|
|
pDustEmitter->SetSortOrigin( m_vecOrigin ); |
|
pDustEmitter->SetNearClip( 32, 64 ); |
|
pDustEmitter->GetBinding().SetBBox( m_vecOrigin - Vector( 32, 32, 32 ), m_vecOrigin + Vector( 32, 32, 32 ) ); |
|
*/ |
|
|
|
Vector offset; |
|
Vector vecColor; |
|
GetDustColor( vecColor ); |
|
|
|
int iParticleCount = 16; |
|
|
|
if ( m_bBlockedSpawner == true ) |
|
{ |
|
iParticleCount = 8; |
|
} |
|
|
|
//Spawn the dust |
|
SimpleParticle particle; |
|
for ( int i = 0; i < iParticleCount; i++ ) |
|
{ |
|
//Offset this dust puff's origin |
|
offset[0] = random->RandomFloat( -DUST_RADIUS, DUST_RADIUS ); |
|
offset[1] = random->RandomFloat( -DUST_RADIUS, DUST_RADIUS ); |
|
offset[2] = random->RandomFloat( -16, 8 ); |
|
|
|
offset += m_vecOrigin; |
|
|
|
particle.m_Pos = offset; |
|
particle.m_flDieTime = random->RandomFloat( 0.75f, 1.25f ); |
|
particle.m_flLifetime = 0.0f; |
|
|
|
Vector dir = particle.m_Pos - m_vecOrigin; |
|
particle.m_vecVelocity = dir * random->RandomFloat( 0.5f, 1.0f ); |
|
dir.z = fabs(dir.z); |
|
|
|
float colorRamp = random->RandomFloat( 0.5f, 1.0f ); |
|
Vector color = vecColor*colorRamp; |
|
|
|
color[0] = clamp( color[0], 0.0f, 1.0f ); |
|
color[1] = clamp( color[1], 0.0f, 1.0f ); |
|
color[2] = clamp( color[2], 0.0f, 1.0f ); |
|
|
|
color *= 255; |
|
|
|
particle.m_uchColor[0] = color[0]; |
|
particle.m_uchColor[1] = color[1]; |
|
particle.m_uchColor[2] = color[2]; |
|
|
|
particle.m_uchStartAlpha= random->RandomFloat( 64, 128 ); |
|
particle.m_uchEndAlpha = 0; |
|
|
|
particle.m_uchStartSize = random->RandomInt( 16, 32 ); |
|
particle.m_uchEndSize = particle.m_uchStartSize * 3; |
|
particle.m_flRoll = random->RandomInt( 0, 360 ); |
|
particle.m_flRollDelta = random->RandomFloat( -0.2f, 0.2f ); |
|
|
|
// Though it appears there are two particle handle entries in g_Mat_DustPuff, in fact |
|
// only the one present at index 0 actually draws. Trying to spawn a particle with |
|
// the other material will give you no particle at all. Therefore while instead of this: |
|
// AddSimpleParticle( &particle, g_Mat_DustPuff[random->RandomInt(0,1) ); |
|
// we have to do this: |
|
AddSimpleParticle( &particle, g_Mat_DustPuff[0] ); |
|
} |
|
} |
|
|
|
void GetColorForSurface( trace_t *trace, Vector *color ); |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
// Input : &color - |
|
//----------------------------------------------------------------------------- |
|
void C_TEAntlionDust::GetDustColor( Vector &color ) |
|
{ |
|
trace_t tr; |
|
UTIL_TraceLine( m_vecOrigin+Vector(0,0,1), m_vecOrigin+Vector(0,0,-32), |
|
MASK_SOLID_BRUSHONLY, NULL, COLLISION_GROUP_NONE, &tr ); |
|
|
|
if ( tr.fraction < 1.0f ) |
|
{ |
|
GetColorForSurface( &tr, &color ); |
|
} |
|
else |
|
{ |
|
//Fill in a fallback |
|
color = g_AntlionDustColor; |
|
} |
|
} |
|
|
|
void C_TEAntlionDust::RenderParticles( CParticleRenderIterator *pIterator ) |
|
{ |
|
} |
|
|
|
void C_TEAntlionDust::SimulateParticles( CParticleSimulateIterator *pIterator ) |
|
{ |
|
} |
|
|
|
|