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.
135 lines
5.3 KiB
135 lines
5.3 KiB
//====== Copyright © 1996-2005, Valve Corporation, All rights reserved. =======
|
|
//
|
|
// Purpose:
|
|
//
|
|
//=============================================================================
|
|
|
|
#ifndef PARTICLEPROPERTY_H
|
|
#define PARTICLEPROPERTY_H
|
|
#ifdef _WIN32
|
|
#pragma once
|
|
#endif
|
|
|
|
#include "smartptr.h"
|
|
#include "globalvars_base.h"
|
|
#include "particles_new.h"
|
|
#include "particle_parse.h"
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Forward declarations
|
|
//-----------------------------------------------------------------------------
|
|
class CBaseEntity;
|
|
class CNewParticleEffect;
|
|
|
|
// Argh: Server considers -1 to be an invalid attachment, whereas the client uses 0
|
|
#ifdef CLIENT_DLL
|
|
#define INVALID_PARTICLE_ATTACHMENT 0
|
|
#else
|
|
#define INVALID_PARTICLE_ATTACHMENT -1
|
|
#endif
|
|
|
|
struct ParticleControlPoint_t
|
|
{
|
|
ParticleControlPoint_t()
|
|
{
|
|
iControlPoint = 0;
|
|
iAttachType = PATTACH_ABSORIGIN_FOLLOW;
|
|
iAttachmentPoint = 0;
|
|
vecOriginOffset = vec3_origin;
|
|
matOffset.Invalidate();
|
|
}
|
|
|
|
int iControlPoint;
|
|
ParticleAttachment_t iAttachType;
|
|
int iAttachmentPoint;
|
|
Vector vecOriginOffset;
|
|
matrix3x4_t matOffset;
|
|
EHANDLE hEntity;
|
|
};
|
|
|
|
struct ParticleEffectList_t
|
|
{
|
|
ParticleEffectList_t()
|
|
{
|
|
pParticleEffect = NULL;
|
|
}
|
|
|
|
CUtlVector<ParticleControlPoint_t> pControlPoints;
|
|
CSmartPtr<CNewParticleEffect> pParticleEffect;
|
|
};
|
|
|
|
extern int GetAttachTypeFromString( const char *pszString );
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Encapsulates particle handling for an entity
|
|
//-----------------------------------------------------------------------------
|
|
class CParticleProperty
|
|
{
|
|
DECLARE_CLASS_NOBASE( CParticleProperty );
|
|
DECLARE_EMBEDDED_NETWORKVAR();
|
|
DECLARE_PREDICTABLE();
|
|
DECLARE_DATADESC();
|
|
|
|
public:
|
|
CParticleProperty();
|
|
~CParticleProperty();
|
|
|
|
void Init( CBaseEntity *pEntity );
|
|
CBaseEntity *GetOuter( void ) { return m_pOuter; }
|
|
int GetAllParticleEffectRenderables( IClientRenderable **pOutput, int iMaxOutput ); //gets a list of all renderables used by this particle property
|
|
|
|
// Effect Creation
|
|
CNewParticleEffect *Create( const char *pszParticleName, ParticleAttachment_t iAttachType, const char *pszAttachmentName );
|
|
CNewParticleEffect *Create( const char *pszParticleName, ParticleAttachment_t iAttachType, int iAttachmentPoint = -1, Vector vecOriginOffset = vec3_origin, matrix3x4_t *vecOffsetMatrix = NULL );
|
|
CNewParticleEffect *CreatePrecached( int nPrecacheIndex, ParticleAttachment_t iAttachType, int iAttachmentPoint = -1, Vector vecOriginOffset = vec3_origin, matrix3x4_t *vecOffsetMatrix = NULL );
|
|
void AddControlPoint( CNewParticleEffect *pEffect, int iPoint, C_BaseEntity *pEntity, ParticleAttachment_t iAttachType, const char *pszAttachmentName = NULL, Vector vecOriginOffset = vec3_origin, matrix3x4_t *vecOffsetMatrix = NULL );
|
|
void AddControlPoint( int iEffectIndex, int iPoint, C_BaseEntity *pEntity, ParticleAttachment_t iAttachType, int iAttachmentPoint = -1, Vector vecOriginOffset = vec3_origin, matrix3x4_t *vecOffsetMatrix = NULL );
|
|
|
|
inline void SetControlPointParent( CNewParticleEffect *pEffect, int whichControlPoint, int parentIdx );
|
|
void SetControlPointParent( int iEffectIndex, int whichControlPoint, int parentIdx );
|
|
|
|
// Commands
|
|
void StopEmission( CNewParticleEffect *pEffect = NULL, bool bWakeOnStop = false, bool bDestroyAsleepSystems = false, bool bForceRemoveInstantly = false, bool bPlayEndCap = false );
|
|
void StopEmissionAndDestroyImmediately( CNewParticleEffect *pEffect = NULL );
|
|
|
|
// kill all particle systems involving a given entity for their control points
|
|
void StopParticlesInvolving( CBaseEntity *pEntity, bool bForceRemoveInstantly = false );
|
|
void StopParticlesNamed( const char *pszEffectName, bool bForceRemoveInstantly = false, int nSplitScreenPlayerSlot = -1 ); ///< kills all particles using the given definition name
|
|
|
|
// Particle System hooks
|
|
void OnParticleSystemUpdated( CNewParticleEffect *pEffect, float flTimeDelta );
|
|
void OnParticleSystemDeleted( CNewParticleEffect *pEffect );
|
|
|
|
#ifdef CLIENT_DLL
|
|
void OwnerSetDormantTo( bool bDormant );
|
|
#endif
|
|
|
|
// Used to replace a particle effect with a different one; attaches the control point updating to the new one
|
|
void ReplaceParticleEffect( CNewParticleEffect *pOldEffect, CNewParticleEffect *pNewEffect );
|
|
|
|
// Debugging
|
|
void DebugPrintEffects( void );
|
|
|
|
bool IsValidEffect( const CNewParticleEffect *pEffect ); //is this effect still alive?
|
|
|
|
int FindEffect( CNewParticleEffect *pEffect );
|
|
int FindEffect( const char *pEffectName );
|
|
|
|
private:
|
|
CNewParticleEffect *Create( CParticleSystemDefinition *pDef, ParticleAttachment_t iAttachType, int iAttachmentPoint, Vector vecOriginOffset, matrix3x4_t *matOffset = NULL );
|
|
int GetParticleAttachment( C_BaseEntity *pEntity, const char *pszAttachmentName, const char *pszParticleName );
|
|
void UpdateParticleEffect( ParticleEffectList_t *pEffect, bool bInitializing = false, int iOnlyThisControlPoint = -1 );
|
|
void UpdateControlPoint( ParticleEffectList_t *pEffect, int iPoint, bool bInitializing );
|
|
inline CNewParticleEffect *GetParticleEffectFromIdx( int idx );
|
|
|
|
private:
|
|
CBaseEntity *m_pOuter;
|
|
CUtlVector<ParticleEffectList_t> m_ParticleEffects;
|
|
int m_iDormancyChangedAtFrame;
|
|
|
|
friend class CBaseEntity;
|
|
};
|
|
|
|
#include "particle_property_inlines.h"
|
|
|
|
#endif // PARTICLEPROPERTY_H
|