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.
163 lines
4.1 KiB
163 lines
4.1 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $Workfile: $ |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
#include "cbase.h" |
|
#include "c_te_particlesystem.h" |
|
|
|
// memdbgon must be the last include file in a .cpp file!!! |
|
#include "tier0/memdbgon.h" |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Large Funnel TE |
|
//----------------------------------------------------------------------------- |
|
class C_TELargeFunnel : public C_TEParticleSystem |
|
{ |
|
public: |
|
DECLARE_CLASS( C_TELargeFunnel, C_TEParticleSystem ); |
|
DECLARE_CLIENTCLASS(); |
|
|
|
C_TELargeFunnel( void ); |
|
virtual ~C_TELargeFunnel( void ); |
|
|
|
virtual void PostDataUpdate( DataUpdateType_t updateType ); |
|
|
|
|
|
public: |
|
void CreateFunnel( void ); |
|
|
|
int m_nModelIndex; |
|
int m_nReversed; |
|
}; |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
C_TELargeFunnel::C_TELargeFunnel( void ) |
|
{ |
|
m_nModelIndex = 0; |
|
m_nReversed = 0; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
C_TELargeFunnel::~C_TELargeFunnel( void ) |
|
{ |
|
} |
|
|
|
|
|
void C_TELargeFunnel::CreateFunnel( void ) |
|
{ |
|
CSmartPtr<CSimpleEmitter> pSimple = CSimpleEmitter::Create( "TELargeFunnel" ); |
|
pSimple->SetSortOrigin( m_vecOrigin ); |
|
|
|
int i, j; |
|
SimpleParticle *pParticle; |
|
|
|
Vector vecDir; |
|
Vector vecDest; |
|
|
|
float ratio = 0.25; |
|
float invratio = 1 / ratio; |
|
|
|
PMaterialHandle hMaterial = pSimple->GetPMaterial( "sprites/flare6" ); |
|
|
|
for ( i = -256 ; i <= 256 ; i += 24 ) //24 from 32.. little more dense |
|
{ |
|
for ( j = -256 ; j <= 256 ; j += 24 ) |
|
{ |
|
pParticle = (SimpleParticle *) pSimple->AddParticle( sizeof( SimpleParticle ), hMaterial, m_vecOrigin ); |
|
if( pParticle ) |
|
{ |
|
if ( m_nReversed ) |
|
{ |
|
pParticle->m_Pos = m_vecOrigin; |
|
|
|
vecDir[0] = i; |
|
vecDir[1] = j; |
|
vecDir[2] = random->RandomFloat(100, 800); |
|
|
|
pParticle->m_uchStartAlpha = 255; |
|
pParticle->m_uchEndAlpha = 0; |
|
} |
|
else |
|
{ |
|
pParticle->m_Pos[0] = m_vecOrigin[0] + i; |
|
pParticle->m_Pos[1] = m_vecOrigin[1] + j; |
|
pParticle->m_Pos[2] = m_vecOrigin[2] + random->RandomFloat(100, 800); |
|
|
|
// send particle heading to org at a random speed |
|
vecDir = m_vecOrigin - pParticle->m_Pos; |
|
|
|
pParticle->m_uchStartAlpha = 0; |
|
pParticle->m_uchEndAlpha = 255; |
|
} |
|
|
|
vecDir *= ratio; |
|
|
|
pParticle->m_vecVelocity = vecDir; |
|
|
|
pParticle->m_flLifetime = 0; |
|
pParticle->m_flDieTime = invratio; |
|
|
|
if( random->RandomInt( 0, 10 ) < 5 ) |
|
{ |
|
// small green particle |
|
pParticle->m_uchColor[0] = 0; |
|
pParticle->m_uchColor[1] = 255; |
|
pParticle->m_uchColor[2] = 0; |
|
|
|
pParticle->m_uchStartSize = 4.0; |
|
} |
|
else |
|
{ |
|
// large white particle |
|
pParticle->m_uchColor[0] = 255; |
|
pParticle->m_uchColor[1] = 255; |
|
pParticle->m_uchColor[2] = 255; |
|
|
|
pParticle->m_uchStartSize = 15.0; |
|
} |
|
|
|
pParticle->m_uchEndSize = pParticle->m_uchStartSize; |
|
pParticle->m_flRoll = i; // pseudorandom |
|
pParticle->m_flRollDelta = 0; |
|
pParticle->m_iFlags = 0; |
|
} |
|
|
|
} |
|
} |
|
|
|
return; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
// Input : bool - |
|
//----------------------------------------------------------------------------- |
|
void C_TELargeFunnel::PostDataUpdate( DataUpdateType_t updateType ) |
|
{ |
|
CreateFunnel(); |
|
} |
|
|
|
IMPLEMENT_CLIENTCLASS_EVENT_DT(C_TELargeFunnel, DT_TELargeFunnel, CTELargeFunnel) |
|
RecvPropInt( RECVINFO(m_nModelIndex)), |
|
RecvPropInt( RECVINFO(m_nReversed)), |
|
END_RECV_TABLE() |
|
|
|
void TE_LargeFunnel( IRecipientFilter& filter, float delay, |
|
const Vector* pos, int modelindex, int reversed ) |
|
{ |
|
// Major hack to simulate receiving network message |
|
__g_C_TELargeFunnel.m_vecOrigin = *pos; |
|
__g_C_TELargeFunnel.m_nModelIndex = modelindex; |
|
__g_C_TELargeFunnel.m_nReversed = reversed; |
|
|
|
__g_C_TELargeFunnel.PostDataUpdate( DATA_UPDATE_CREATED ); |
|
} |
|
|
|
|
|
|