mirror of
https://github.com/nillerusr/source-engine.git
synced 2026-08-12 11:49:09 +00:00
1
This commit is contained in:
@@ -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
|
||||
Reference in New Issue
Block a user