//===== Copyright © 1996-2005, Valve Corporation, All rights reserved. ======// // // Purpose: // // $NoKeywords: $ // //===========================================================================// // This defines the client-side SmokeTrail entity. It can also be used without // an entity, in which case you must pass calls to it and set its position each frame. #ifndef PARTICLE_SMOKETRAIL_H #define PARTICLE_SMOKETRAIL_H #include "particlemgr.h" #include "particle_prototype.h" #include "particle_util.h" #include "particles_simple.h" #include "c_baseentity.h" #include "baseparticleentity.h" #include "fx_trail.h" // // Smoke Trail // class C_SmokeTrail : public C_BaseParticleEntity, public IPrototypeAppEffect { public: DECLARE_CLASS( C_SmokeTrail, C_BaseParticleEntity ); DECLARE_CLIENTCLASS(); C_SmokeTrail(); virtual ~C_SmokeTrail(); public: //For attachments void GetAimEntOrigin( IClientEntity *pAttachedTo, Vector *pAbsOrigin, QAngle *pAbsAngles ); // Enable/disable emission. void SetEmit(bool bEmit); // Change the spawn rate. void SetSpawnRate(float rate); // C_BaseEntity. public: virtual void OnDataChanged(DataUpdateType_t updateType); virtual void CleanupToolRecordingState( KeyValues *msg ); // IPrototypeAppEffect. public: virtual void Start(CParticleMgr *pParticleMgr, IPrototypeArgAccess *pArgs); // IParticleEffect. public: virtual void Update(float fTimeDelta); virtual void RenderParticles( CParticleRenderIterator *pIterator ); virtual void SimulateParticles( CParticleSimulateIterator *pIterator ); public: // Effect parameters. These will assume default values but you can change them. float m_SpawnRate; // How many particles per second. Vector m_StartColor; // Fade between these colors. Vector m_EndColor; float m_Opacity; float m_ParticleLifetime; // How long do the particles live? float m_StopEmitTime; // When do I stop emitting particles? (-1 = never) float m_MinSpeed; // Speed range. float m_MaxSpeed; float m_MinDirectedSpeed; // Directed speed range. float m_MaxDirectedSpeed; float m_StartSize; // Size ramp. float m_EndSize; float m_SpawnRadius; Vector m_VelocityOffset; // Emit the particles in a certain direction. bool m_bEmit; // Keep emitting particles? int m_nAttachment; private: C_SmokeTrail( const C_SmokeTrail & ); PMaterialHandle m_MaterialHandle[2]; TimedEvent m_ParticleSpawn; CParticleMgr *m_pParticleMgr; CSmartPtr m_pSmokeEmitter; }; //================================================== // C_RocketTrail //================================================== class C_RocketTrail : public C_BaseParticleEntity, public IPrototypeAppEffect { public: DECLARE_CLASS( C_RocketTrail, C_BaseParticleEntity ); DECLARE_CLIENTCLASS(); C_RocketTrail(); virtual ~C_RocketTrail(); public: //For attachments void GetAimEntOrigin( IClientEntity *pAttachedTo, Vector *pAbsOrigin, QAngle *pAbsAngles ); // Enable/disable emission. void SetEmit(bool bEmit); // Change the spawn rate. void SetSpawnRate(float rate); // C_BaseEntity. public: virtual void OnDataChanged(DataUpdateType_t updateType); // IPrototypeAppEffect. public: virtual void Start(CParticleMgr *pParticleMgr, IPrototypeArgAccess *pArgs); // IParticleEffect. public: virtual void Update(float fTimeDelta); virtual void RenderParticles( CParticleRenderIterator *pIterator ); virtual void SimulateParticles( CParticleSimulateIterator *pIterator ); public: // Effect parameters. These will assume default values but you can change them. float m_SpawnRate; // How many particles per second. Vector m_StartColor; // Fade between these colors. Vector m_EndColor; float m_Opacity; float m_ParticleLifetime; // How long do the particles live? float m_StopEmitTime; // When do I stop emitting particles? (-1 = never) float m_MinSpeed; // Speed range. float m_MaxSpeed; float m_StartSize; // Size ramp. float m_EndSize; float m_SpawnRadius; Vector m_VelocityOffset; // Emit the particles in a certain direction. bool m_bEmit; // Keep emitting particles? bool m_bDamaged; // Has been shot down (should be on fire, etc) int m_nAttachment; Vector m_vecLastPosition; // Last known position of the rocket float m_flFlareScale; // Size of the flare private: C_RocketTrail( const C_RocketTrail & ); PMaterialHandle m_MaterialHandle[2]; TimedEvent m_ParticleSpawn; CParticleMgr *m_pParticleMgr; CSmartPtr m_pRocketEmitter; }; class SporeSmokeEffect; //================================================== // SporeEffect //================================================== class SporeEffect : public CSimpleEmitter { public: explicit SporeEffect( const char *pDebugName ); static SporeEffect* Create( const char *pDebugName ); virtual void UpdateVelocity( SimpleParticle *pParticle, float timeDelta ); virtual Vector UpdateColor( const SimpleParticle *pParticle ); virtual float UpdateAlpha( const SimpleParticle *pParticle ); private: SporeEffect( const SporeEffect & ); }; //================================================== // C_SporeExplosion //================================================== class C_SporeExplosion : public C_BaseParticleEntity, public IPrototypeAppEffect { public: DECLARE_CLASS( C_SporeExplosion, C_BaseParticleEntity ); DECLARE_CLIENTCLASS(); C_SporeExplosion( void ); virtual ~C_SporeExplosion( void ); public: // C_BaseEntity public: virtual void OnDataChanged( DataUpdateType_t updateType ); // IPrototypeAppEffect public: virtual void Start( CParticleMgr *pParticleMgr, IPrototypeArgAccess *pArgs ); // IParticleEffect public: virtual void Update( float fTimeDelta ); virtual void RenderParticles( CParticleRenderIterator *pIterator ); virtual void SimulateParticles( CParticleSimulateIterator *pIterator ); public: float m_flSpawnRate; float m_flParticleLifetime; float m_flStartSize; float m_flEndSize; float m_flSpawnRadius; float m_flPreviousSpawnRate; bool m_bEmit; bool m_bDontRemove; private: C_SporeExplosion( const C_SporeExplosion & ); void AddParticles( void ); PMaterialHandle m_hMaterial; TimedEvent m_teParticleSpawn; SporeEffect *m_pSporeEffect; CParticleMgr *m_pParticleMgr; }; // // Particle trail // class CSmokeParticle; class C_FireTrail : public C_ParticleTrail { public: DECLARE_CLASS( C_FireTrail, C_ParticleTrail ); DECLARE_CLIENTCLASS(); C_FireTrail( void ); virtual ~C_FireTrail( void ); virtual void Start( CParticleMgr *pParticleMgr, IPrototypeArgAccess *pArgs ); virtual void Update( float fTimeDelta ); private: enum { // Smoke FTRAIL_SMOKE1, FTRAIL_SMOKE2, // Large flame FTRAIL_FLAME1, FTRAIL_FLAME2, FTRAIL_FLAME3, FTRAIL_FLAME4, FTRAIL_FLAME5, NUM_FTRAIL_MATERIALS }; CSmartPtr m_pTrailEmitter; CSmartPtr m_pSmokeEmitter; PMaterialHandle m_hMaterial[NUM_FTRAIL_MATERIALS]; Vector m_vecLastPosition; C_FireTrail( const C_FireTrail & ); }; //----------------------------------------------------------------------------- // Purpose: High drag, non color changing particle //----------------------------------------------------------------------------- class CDustFollower : public CSimpleEmitter { public: explicit CDustFollower( const char *pDebugName ) : CSimpleEmitter( pDebugName ) {} //Create static CDustFollower *Create( const char *pDebugName ) { return new CDustFollower( pDebugName ); } //Alpha virtual float UpdateAlpha( const SimpleParticle *pParticle ) { return ( ((float)pParticle->m_uchStartAlpha/255.0f) * sin( M_PI * (pParticle->m_flLifetime / pParticle->m_flDieTime) ) ); } virtual void UpdateVelocity( SimpleParticle *pParticle, float timeDelta ) { pParticle->m_vecVelocity = pParticle->m_vecVelocity * ExponentialDecay( 0.3, timeDelta ); } //Roll virtual float UpdateRoll( SimpleParticle *pParticle, float timeDelta ) { pParticle->m_flRoll += pParticle->m_flRollDelta * timeDelta; pParticle->m_flRollDelta *= ExponentialDecay( 0.5, timeDelta ); return pParticle->m_flRoll; } private: CDustFollower( const CDustFollower & ); }; //================================================== // C_DustTrail //================================================== class C_DustTrail : public C_BaseParticleEntity, public IPrototypeAppEffect { public: DECLARE_CLASS( C_DustTrail, C_BaseParticleEntity ); DECLARE_CLIENTCLASS(); C_DustTrail(); virtual ~C_DustTrail(); public: // Enable/disable emission. void SetEmit(bool bEmit); // Change the spawn rate. void SetSpawnRate(float rate); // C_BaseEntity. public: virtual void OnDataChanged(DataUpdateType_t updateType); virtual void CleanupToolRecordingState( KeyValues *msg ); // IPrototypeAppEffect. public: virtual void Start(CParticleMgr *pParticleMgr, IPrototypeArgAccess *pArgs); // IParticleEffect. public: virtual void Update(float fTimeDelta); virtual void RenderParticles( CParticleRenderIterator *pIterator ); virtual void SimulateParticles( CParticleSimulateIterator *pIterator ); public: // Effect parameters. These will assume default values but you can change them. float m_SpawnRate; // How many particles per second. Vector m_Color; float m_Opacity; float m_ParticleLifetime; // How long do the particles live? float m_StartEmitTime; // When did I start emitting particles? float m_StopEmitTime; // When do I stop emitting particles? (-1 = never) float m_MinSpeed; // Speed range. float m_MaxSpeed; float m_MinDirectedSpeed; // Directed speed range. float m_MaxDirectedSpeed; float m_StartSize; // Size ramp. float m_EndSize; float m_SpawnRadius; Vector m_VelocityOffset; // Emit the particles in a certain direction. bool m_bEmit; // Keep emitting particles? private: C_DustTrail( const C_DustTrail & ); #define DUSTTRAIL_MATERIALS 16 PMaterialHandle m_MaterialHandle[DUSTTRAIL_MATERIALS]; TimedEvent m_ParticleSpawn; CParticleMgr *m_pParticleMgr; CSmartPtr m_pDustEmitter; }; #endif