summaryrefslogtreecommitdiff
path: root/game/client/particles_simple.h
diff options
context:
space:
mode:
Diffstat (limited to 'game/client/particles_simple.h')
-rw-r--r--game/client/particles_simple.h255
1 files changed, 255 insertions, 0 deletions
diff --git a/game/client/particles_simple.h b/game/client/particles_simple.h
new file mode 100644
index 0000000..4b30f11
--- /dev/null
+++ b/game/client/particles_simple.h
@@ -0,0 +1,255 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//===========================================================================//
+
+#ifndef PARTICLES_SIMPLE_H
+#define PARTICLES_SIMPLE_H
+#ifdef _WIN32
+#pragma once
+#endif
+
+#include "particlemgr.h"
+#include "particlesphererenderer.h"
+#include "smartptr.h"
+
+
+// ------------------------------------------------------------------------------------------------ //
+// CParticleEffect is the base class that you can derive from to make a particle effect.
+// These can be used two ways:
+//
+// 1. Allocate a CParticleEffect-based object using the class's static Create() function. This gives
+// you back a smart pointer that handles the reference counting for you.
+//
+// 2. Contain a CParticleEffect object in your class.
+// ------------------------------------------------------------------------------------------------ //
+
+class CParticleEffect : public IParticleEffect
+{
+public:
+ DECLARE_CLASS_NOBASE( CParticleEffect );
+
+ friend class CRefCountAccessor;
+
+ // Call this before adding a bunch of particles to give it a rough estimate of where
+ // your particles are for sorting amongst other translucent entities.
+ void SetSortOrigin( const Vector &vSortOrigin );
+
+ PMaterialHandle GetPMaterial(const char *name);
+
+ Particle* AddParticle( unsigned int particleSize, PMaterialHandle material, const Vector &origin );
+
+ CParticleEffectBinding& GetBinding() { return m_ParticleEffect; }
+
+ const char *GetEffectName();
+
+ void AddFlags( int iFlags ) { m_Flags |= iFlags; }
+ void RemoveFlags( int iFlags ) { m_Flags &= ~iFlags; }
+
+ void SetDontRemove( bool bSet )
+ {
+ if( bSet )
+ AddFlags( FLAG_DONT_REMOVE );
+ else
+ RemoveFlags( FLAG_DONT_REMOVE );
+ }
+
+// IParticleEffect overrides
+public:
+
+ virtual void SetParticleCullRadius( float radius );
+ virtual void NotifyRemove( void );
+ virtual const Vector & GetSortOrigin();
+ virtual void NotifyDestroyParticle( Particle* pParticle );
+ virtual void Update( float flTimeDelta );
+
+ // All Create() functions should call this so the effect deletes itself
+ // when it is removed from the particle manager.
+ void SetDynamicallyAllocated( bool bDynamic=true );
+
+ virtual bool ShouldSimulate() const { return m_bSimulate; }
+ virtual void SetShouldSimulate( bool bSim ) { m_bSimulate = bSim; }
+
+ int AllocateToolParticleEffectId();
+ int GetToolParticleEffectId() const;
+protected:
+ CParticleEffect( const char *pDebugName );
+ virtual ~CParticleEffect();
+
+ // Returns nonzero if Release() has been called.
+ int IsReleased();
+
+ enum
+ {
+ FLAG_ALLOCATED = (1<<1), // Most of the CParticleEffects are dynamically allocated but
+ // some are member variables of a class. If they're member variables.
+ FLAG_DONT_REMOVE = (1<<2),
+ };
+
+ // Used to track down bugs.
+ char const *m_pDebugName;
+
+ CParticleEffectBinding m_ParticleEffect;
+ Vector m_vSortOrigin;
+
+ int m_Flags; // Combination of CParticleEffect::FLAG_
+
+ bool m_bSimulate;
+ int m_nToolParticleEffectId;
+
+private:
+ // Update the reference count.
+ void AddRef();
+ void Release();
+
+ int m_RefCount; // When this goes to zero and the effect has no more active
+ // particles, (and it's dynamically allocated), it will delete itself.
+
+ CParticleEffect( const CParticleEffect & ); // not defined, not accessible
+};
+
+inline int CParticleEffect::GetToolParticleEffectId() const
+{
+ return m_nToolParticleEffectId;
+}
+
+inline int CParticleEffect::AllocateToolParticleEffectId()
+{
+ m_nToolParticleEffectId = ParticleMgr()->AllocateToolParticleEffectId();
+ return m_nToolParticleEffectId;
+}
+
+
+//-----------------------------------------------------------------------------
+// Particle flags
+//-----------------------------------------------------------------------------
+enum SimpleParticleFlag_t
+{
+ SIMPLE_PARTICLE_FLAG_WINDBLOWN = 0x1,
+ SIMPLE_PARTICLE_FLAG_NO_VEL_DECAY = 0x2 // Used by the blood spray emitter. By default, it decays the
+ // particle velocity.
+};
+
+class SimpleParticle : public Particle
+{
+public:
+ SimpleParticle() : m_iFlags(0) {}
+
+ // AddSimpleParticle automatically initializes these fields.
+ Vector m_vecVelocity;
+ float m_flRoll;
+ float m_flDieTime; // How long it lives for.
+ float m_flLifetime; // How long it has been alive for so far.
+ unsigned char m_uchColor[3];
+ unsigned char m_uchStartAlpha;
+ unsigned char m_uchEndAlpha;
+ unsigned char m_uchStartSize;
+ unsigned char m_uchEndSize;
+ unsigned char m_iFlags; // See SimpleParticleFlag_t above
+ float m_flRollDelta;
+};
+
+
+
+// CSimpleEmitter implements a common way to simulate and render particles.
+//
+// Effects can add particles to the particle manager and point at CSimpleEmitter
+// for the effect so they don't have to implement the simulation code. It simulates
+// velocity, and fades their alpha from invisible to solid and back to invisible over their lifetime.
+//
+// Particles you add using this effect must use the class CParticleSimple::Particle.
+class CSimpleEmitter : public CParticleEffect
+{
+// IParticleEffect overrides.
+public:
+
+ DECLARE_CLASS( CSimpleEmitter, CParticleEffect );
+
+ static CSmartPtr<CSimpleEmitter> Create( const char *pDebugName );
+
+ virtual void SimulateParticles( CParticleSimulateIterator *pIterator );
+ virtual void RenderParticles( CParticleRenderIterator *pIterator );
+
+ void SetNearClip( float nearClipMin, float nearClipMax );
+
+ void SetDrawBeforeViewModel( bool state = true );
+
+ SimpleParticle* AddSimpleParticle( PMaterialHandle hMaterial, const Vector &vOrigin, float flDieTime=3, unsigned char uchSize=10 );
+
+// Overridables for variants like CEmberEffect.
+protected:
+ CSimpleEmitter( const char *pDebugName = NULL );
+ virtual ~CSimpleEmitter();
+
+ virtual float UpdateAlpha( const SimpleParticle *pParticle );
+ virtual float UpdateScale( const SimpleParticle *pParticle );
+ virtual float UpdateRoll( SimpleParticle *pParticle, float timeDelta );
+ virtual void UpdateVelocity( SimpleParticle *pParticle, float timeDelta );
+ virtual Vector UpdateColor( const SimpleParticle *pParticle );
+
+ float m_flNearClipMin;
+ float m_flNearClipMax;
+
+private:
+ CSimpleEmitter( const CSimpleEmitter & ); // not defined, not accessible
+};
+
+//==================================================
+// EmberEffect
+//==================================================
+
+class CEmberEffect : public CSimpleEmitter
+{
+public:
+ CEmberEffect( const char *pDebugName );
+ static CSmartPtr<CEmberEffect> Create( const char *pDebugName );
+
+ virtual void UpdateVelocity( SimpleParticle *pParticle, float timeDelta );
+ virtual Vector UpdateColor( const SimpleParticle *pParticle );
+
+private:
+ CEmberEffect( const CEmberEffect & ); // not defined, not accessible
+};
+
+
+//==================================================
+// FireSmokeEffect
+//==================================================
+
+class CFireSmokeEffect : public CSimpleEmitter
+{
+public:
+ CFireSmokeEffect( const char *pDebugName );
+ static CSmartPtr<CFireSmokeEffect> Create( const char *pDebugName );
+
+ virtual void UpdateVelocity( SimpleParticle *pParticle, float timeDelta );
+ virtual float UpdateAlpha( const SimpleParticle *pParticle );
+
+protected:
+ VPlane m_planeClip;
+
+private:
+ CFireSmokeEffect( const CFireSmokeEffect & ); // not defined, not accessible
+};
+
+
+//==================================================
+// CFireParticle
+//==================================================
+
+class CFireParticle : public CSimpleEmitter
+{
+public:
+ CFireParticle( const char *pDebugName );
+ static CSmartPtr<CFireParticle> Create( const char *pDebugName );
+
+ virtual Vector UpdateColor( const SimpleParticle *pParticle );
+
+private:
+ CFireParticle( const CFireParticle & ); // not defined, not accessible
+};
+
+
+#endif // PARTICLES_SIMPLE_H