Particles In Code

From Valve Developer Community
Revision as of 15:55, 25 October 2009 by TomEdwards (talk | contribs) (expanded)
Jump to navigation Jump to search

Precaching

Particle systems must be precached before they can be used. This is done by listing the PCF containing them in particles_manifest.txt, then making this call:

PrecacheParticleSystem( "your_particle_effect_name" );

Creating

Serverside

Particles are dispatched as events. The functions are shared, so there's no need to #ifdef calls out on the client.

#include "particle_parse.h"

// Create at world co-ords
void DispatchParticleEffect( "my_particle", vecOrigin, angAngles, pOwnerEntity )
// Create at model attachment
void DispatchParticleEffect( "my_particle", ParticleAttachment_t, pOwnerEntity, iAttachmentPoint, bResetAllParticlesOnEntity  )
Icon-Bug.pngBug:Valve's code for dispatching a particle on a model attachment is broken. Get the fix here.  [todo tested in ?]

Values of ParticleAttachment_t are:

PATTACH_ABSORIGIN
PATTACH_ABSORIGIN_FOLLOW
Spawn at (and optionally follow) the entity's origin.
PATTACH_POINT
PATTACH_POINT_FOLLOW
Spawn at (and optionally follow) an attachment point on the entity's model.
PATTACH_CUSTOMORIGIN
Spawn at a given origin.
PATTACH_WORLDORIGIN
Don't associate with an entity at all. Use with caution - could easily cause memory leaks.

Client

Each particle system is a temporary entity: only the client can interact with it once it has been dispatched. In addition, it isn't possible to specify control points on the server at all.

Each active system is a CNewParticleEffect object that can be created and accessed through an entity's ParticleProp() accessor.

#include "particles_new.h"

// To create a new systen:
CNewParticleEffect* pEffect = ParticleProp()->Create( "my_particles", PATTACH_ABSORIGIN );

// Or if the system already exists:
CNewParticleEffect* pEffect = ParticleProp()->FindEffect( "my_particles" );

pEffect->SetControlPoint( 1, vecSomeVector );

Alternatively, you can hook into particle creation:

void C_MyEntity::OnNewParticleEffect( const char* pszParticleName, CNewParticleEffect* pNewParticleEffect )
{
	// ...
}

Destroying

You can stop particle systems with:

StopParticleEffects( CBaseEntity* )
Stops all effects on the given entity
ParticleProp()->StopParticlesInvolving( CBaseEntity* )
Stops all effects with a control point attached to the given entity.
ParticleProp()->StopParticlesNamed( const char* )
Stops all effects with the given system name.
Todo: Global or only on current entity?
CNewParticleEffect::StopEmission( bool bInfiniteOnly, bool bRemoveAllParticles, bool bWakeOnStop)
Stops the current particle system, without removing it.
Todo: Meaning of first and third arguments.