PContextActions_t Class Reference

This class contains the actual Action API calls. More...

#include <pAPI.h>

Inheritance diagram for PContextActions_t:

ParticleContext_t

List of all members.


Public Member Functions

void  Avoid (float magnitude, const float epsilon, const float look_ahead, const pDomain &dom)
  Steer particles away from a domain of space.
void  Bounce (float friction, const float resilience, const float cutoff, const pDomain &dom)
  Bounce particles off an object defined by a domain.
void  Callback (P_PARTICLE_CALLBACK callback, puint64 call_data=0)
  Call an arbitrary user-provided function on each particle in the group.
void  CopyVertexB (const bool copy_pos=true, const bool copy_vel=false)
  Set the secondary position and velocity from current.
void  Damping (const pVec &damping, const float vlow=0.0f, const float vhigh=P_MAXFLOAT)
  Simulate air by dampening particle velocities.
void  RotDamping (const pVec &damping, const float vlow=0.0f, const float vhigh=P_MAXFLOAT)
  Simulate air by dampening rotational velocities.
void  Explosion (const pVec ¢er, const float radius, const float magnitude, const float sigma, const float epsilon=P_EPS)
  Exert force on each particle away from explosion center.
void  Follow (float magnitude=1.0f, const float epsilon=P_EPS, const float max_radius=P_MAXFLOAT)
  Accelerate toward the next particle in the list.
void  Gravitate (const float magnitude=1.0f, const float epsilon=P_EPS, const float max_radius=P_MAXFLOAT)
  Accelerate each particle toward each other particle.
void  Gravity (const pVec &dir)
  Accelerate particles in the given direction.
void  Jet (const pDomain &dom, const pDomain &acc)
  For particles in the domain of influence, accelerate them with a domain.
void  KillOld (const float age_limit, const bool kill_less_than=false)
  Get rid of older particles.
void  MatchVelocity (const float magnitude=1.0f, const float epsilon=P_EPS, const float max_radius=P_MAXFLOAT)
  Modify each particle�s velocity to be similar to that of its neighbors.
void  MatchRotVelocity (const float magnitude=1.0f, const float epsilon=P_EPS, const float max_radius=P_MAXFLOAT)
  Modify each particle�s rotational velocity to be similar to that of its neighbors.
void  Move (const bool move_velocity=true, const bool move_rotational_velocity=true)
  Apply the particles' velocities to their positions, and age the particles.
void  OrbitLine (const pVec &p, const pVec &axis, const float magnitude=1.0f, const float epsilon=P_EPS, const float max_radius=P_MAXFLOAT)
  Accelerate particles toward the closest point on the given line.
void  OrbitPoint (const pVec ¢er, const float magnitude=1.0f, const float epsilon=P_EPS, const float max_radius=P_MAXFLOAT)
  Accelerate particles toward the given center point.
void  RandomAccel (const pDomain &dom)
  Accelerate particles in random directions.
void  RandomDisplace (const pDomain &dom)
  Immediately displace position by a random amount.
void  RandomVelocity (const pDomain &dom)
  Replace particle velocity with a random velocity.
void  RandomRotVelocity (const pDomain &dom)
  Immediately assign a random rotational velocity.
void  Restore (const float time, const bool vel=true, const bool rvel=true)
  Over time, restore particles to their target positionB and upB.
void  Sink (const bool kill_inside, const pDomain &dom)
  Kill particles that have positions on wrong side of the specified domain.
void  SinkVelocity (const bool kill_inside, const pDomain &dom)
  Kill particles that have velocities on wrong side of the specified domain.
void  Sort (const pVec &eye, const pVec &look, const bool front_to_back=false, const bool clamp_negative=false)
  Sort the particles by their projection onto the look vector.
void  Source (const float particle_rate, const pDomain &dom)
  Add particles with positions in the specified domain.
void  SpeedLimit (const float min_speed, const float max_speed=P_MAXFLOAT)
  Clamp particle velocities to the given range.
void  TargetColor (const pVec &color, const float alpha, const float scale)
  Change color of all particles toward the specified color.
void  TargetSize (const pVec &size, const pVec &scale)
  Change sizes of all particles toward the specified size.
void  TargetVelocity (const pVec &vel, const float scale)
  Change velocity of all particles toward the specified velocity.
void  TargetRotVelocity (const pVec &rvel, const float scale)
  Change rotational velocity of all particles toward the specified rotational velocity.
void  Vertex (const pVec &v, puint64 data=0)
  Add a single particle at the specified location.
void  Vortex (const pVec ¢er, const pVec &axis, const float tightnessExponent, const float max_radius, const float inSpeed, const float upSpeed, const float aroundSpeed)
  Accelerate particles in a vortex-like way.

Protected Member Functions

void  InternalSetup (PInternalState_t *Sr)

Protected Attributes

PInternalState_t *  PS

Detailed Description

This class contains the actual Action API calls.

Actions modify the position, color, velocity, size, age, and other attributes of particles. All actions apply to the current particle group, as set by CurrentGroup(). Some actions will add particles to or delete them from the particle group, and others will modify the particles in other ways. Typically, a series of actions will be applied to each particle group once (or more) per rendered frame.

Remember that the amount of effect of an action call depends on the time step size, dt, as set by TimeStep. See TimeStep() for an explanation of time steps.

Some functions have parameters with a default value of the constant P_EPS. P_EPS is a very small floating point constant that is most often used as the default value of the epsilon parameter to actions whose influence on a particle is relative to the inverse square of its distance from something. If that distance is very small, the amount of influence approaches infinity. Since all actions are computed using Euler's method, this can cause unsatisfying results in which particles are accelerated way too much. So this epsilon parameter is added to the distance before taking its inverse square, thus keeping the acceleration within reasonable limits. By varying epsilon, you specify what is reasonable. Larger epsilon make particles accelerate less.


Member Function Documentation

void Avoid ( float  magnitude,
const float  epsilon,
const float  look_ahead,
const pDomain dom  
)

Steer particles away from a domain of space.

Particles are tested to see whether they will pass from being outside the specified domain to being inside it within look_ahead time units from now if the next Move() action were to occur now. The specific direction and amount of turn is dependent on the kind of domain being avoided.

At present the only domains for which Avoid() is implemented are PDSphere, PDRectangle, PDTriangle, PDDisc and PDPlane.

Parameters:
magnitude  how drastically the particle velocities are modified to avoid the obstacle at each time step.
epsilon  The amount of acceleration falls off inversely with the squared distance to the edge of the domain. But when that distance is small, the acceleration would be infinite, so epsilon is always added to the distance.
look_ahead  how far forward along the velocity vector to look for the obstacle
dom  the space to avoid

void Bounce ( float  friction,
const float  resilience,
const float  cutoff,
const pDomain dom  
)

Bounce particles off an object defined by a domain.

Particles are tested to see whether they will pass from being outside the specified domain to being inside it if the next Move() action were to occur now. If they would pass through the surface of the domain, they are instead bounced off it. That is, their velocity vector is decomposed into components normal to the surface and tangent to the surface. The direction of the normal component is reversed, and friction, resilience and cutoff are applied to the components. They are then recomposed into a new velocity heading away from the surface.

Since particles are tested to see whether they would pass through the domain if Move() were called now, it is best to have Bounce() be the last action that modifies a particle's velocity before calling Move(). Also, actions such as RandomDisplace() that modify a particle's position directly, rather than modifying its velocity vector, may yield unsatisfying results when used with Bounce().

At present the only domains for which Bounce() is implemented are PDSphere, PDRectangle, PDTriangle, PDDisc and PDPlane. For spheres, the particle bounces off either the inside or the outside of the sphere. For planes, triangles and discs, the particles bounce off either side of the surface. For rectangles, particles bounce off either side of the diamond-shaped patch whose corners are o, o+u, o+u+v, and o+v. See the documentation on domains for further explanation.

Bounce() doesn't work correctly with small time step sizes for particles sliding along a surface. The friction and resilience parameters should not be scaled by dt, since a bounce happens instantaneously. On the other hand, they should be scaled by dt because particles sliding along a surface will hit more often if dt is smaller. Adjust these parameters manually when you change dt.

Parameters:
friction  The tangential component of the outgoing velocity vector is scaled by (1 - friction).
resilience  The normal component of the outgoing velocity vector is scaled by resilience.
cutoff  Only apply friction if the outgoing tangential velocity is greater than cutoff. This can allow particles to glide smoothly along a surface without sticking.
dom  Bounce off the surface of this domain.

void Callback ( P_PARTICLE_CALLBACK  callback,
puint64  call_data = 0  
)

Call an arbitrary user-provided function on each particle in the group.

The function will receive both your call data and the full Particle_t struct, which contains per-particle user data.

Parameters:
callback  Pointer to function of yours to call
call_data  Arbitrary data of yours to pass into your function

void CopyVertexB ( const bool  copy_pos = true,
const bool  copy_vel = false  
)

Set the secondary position and velocity from current.

Parameters:
copy_pos  If true, sets the PositionB of each particle to the current position of that particle. This makes each particle remember this position so it can later return to it using the Restore() action.
copy_vel  If true, sets the velocityB of each particle to the current velocity of that particle. This can be useful for computing the orientation of the particle by copying a particle's velocity at the beginning of each time step. Then when drawing a particle, the cross-product velocity and velocityB yields a tangent vector.

void Damping ( const pVec damping,
const float  vlow = 0.0f,
const float  vhigh = P_MAXFLOAT  
)

Simulate air by dampening particle velocities.

If a particle's velocity magnitude is within vlow and vhigh, then multiply each component of the velocity by the respective damping constant. Typically, the three components of damping will have the same value.

There are no bounds on the damping constants. Thus, by giving values greater than 1.0 they may be used to speed up particles instead of slow them down.

Parameters:
damping  Component-wise multiply this vector by the velocity vector

void Explosion ( const pVec center,
const float  radius,
const float  magnitude,
const float  sigma,
const float  epsilon = P_EPS  
)

Exert force on each particle away from explosion center.

Causes an explosion by accelerating all particles away from the center. Particles are accelerated away from the center by an amount proportional to magnitude. The shock wave of the explosion has a gaussian magnitude. The peak of the wave front travels spherically outward from the center at the specified velocity. So at a given time step, particles at a distance (velocity * age) from center will receive the most acceleration, and particles not at the peak of the shock wave will receive a lesser outward acceleration.

radius is the current radius of the explosion wave's peak. It is up to the application to increment the radius for each call to Explosion(). For Explosion() calls in action lists, this means you will need to recreate the action list each time step.

You can set up a standing wave by not incrementing the radius.

Parameters:
center  center point of shock wave
radius  current radius of wave peak
magnitude  scales the acceleration applied to particles
sigma  standard deviation of the gaussian; the sharpness or broadness of the strength of the wave.
epsilon  The amount of acceleration falls off inversely with the squared distance to the edge of the domain. But when that distance is small, the acceleration would be infinite, so epsilon is always added to the distance.

void Follow ( float  magnitude = 1.0f,
const float  epsilon = P_EPS,
const float  max_radius = P_MAXFLOAT  
)

Accelerate toward the next particle in the list.

This allows snaky effects where the particles follow each other. Each particle is accelerated toward the next particle in the group. The Follow() action does not affect the last particle in the group. This allows controlled effects where the last particle in the group is killed after each time step and replaced by a new particle at a slightly different position. See KillOld() to learn how to kill the last particle in the group after each step.

Parameters:
magnitude  scales each particle's acceleration
epsilon  The amount of acceleration falls off inversely with the squared distance to the edge of the domain. But when that distance is small, the acceleration would be infinite, so epsilon is always added to the distance.
max_radius  defines the sphere of influence of this action. No particle further than max_radius from its predecessor is affected.

void Gravitate ( const float  magnitude = 1.0f,
const float  epsilon = P_EPS,
const float  max_radius = P_MAXFLOAT  
)

Accelerate each particle toward each other particle.

Each particle is accelerated toward each other particle. This action is more computationally intensive than the others are because each particle is affected by each other particle.

Parameters:
magnitude  scales each particle's acceleration
epsilon  The amount of acceleration falls off inversely with the squared distance to the edge of the domain. But when that distance is small, the acceleration would be infinite, so epsilon is always added to the distance.
max_radius  defines the sphere of influence of this action. No particle further than max_radius from another particle is affected.

void Gravity ( const pVec dir  ) 

Accelerate particles in the given direction.

The gravity acceleration vector is simply added to the velocity vector of each particle at each time step. The magnitude of the gravity vector is the acceleration due to gravity.

void Jet ( const pDomain dom,
const pDomain acc  
)

For particles in the domain of influence, accelerate them with a domain.

For each particle within the jet's domain of influence, dom, Jet() chooses an acceleration vector from the domain acc and applies it to the particle's velocity. acceleration vector comes from this domain

Parameters:
dom  apply jet to particles in this domain

void KillOld ( const float  age_limit,
const bool  kill_less_than = false  
)

Get rid of older particles.

Removes all particles older than age_limit. But if kill_less_than is true, it instead removes all particles newer than age_limit. age_limit is not clamped, so negative values are ok. This can be used in conjunction with StartingAge(-n) to create and then kill a particular set of particles.

In order to kill a particular particle, set StartingAge() to a number that will never be a typical age for any other particle in the group, for example -1.0. Then emit the particle using Source() or Vertex(). Then do the rest of the particle actions and finally call KillOld(-0.9, true) to kill the special particle because it is the only one with an age less than -0.9.

Parameters:
kill_less_than  true to kill particles younger than age_limit

void MatchRotVelocity ( const float  magnitude = 1.0f,
const float  epsilon = P_EPS,
const float  max_radius = P_MAXFLOAT  
)

Modify each particle�s rotational velocity to be similar to that of its neighbors.

Each particle is accelerated toward the weighted mean of the rotational velocities of the other particles in the group.

Using an epsilon similar in size to magnitude can increase the range of influence of nearby particles on this particle.

Parameters:
magnitude  scales each particle's acceleration
epsilon  The amount of acceleration falls off inversely with the squared distance to the edge of the domain. But when that distance is small, the acceleration would be infinite, so epsilon is always added to the distance.
max_radius  defines the sphere of influence of this action. No particle further than max_radius from another particle is affected.

void MatchVelocity ( const float  magnitude = 1.0f,
const float  epsilon = P_EPS,
const float  max_radius = P_MAXFLOAT  
)

Modify each particle�s velocity to be similar to that of its neighbors.

Each particle is accelerated toward the weighted mean of the velocities of the other particles in the group.

Using an epsilon similar in size to magnitude can increase the range of influence of nearby particles on this particle.

Parameters:
magnitude  scales each particle's acceleration
epsilon  The amount of acceleration falls off inversely with the squared distance to the edge of the domain. But when that distance is small, the acceleration would be infinite, so epsilon is always added to the distance.
max_radius  defines the sphere of influence of this action. No particle further than max_radius from another particle is affected.

void Move ( const bool  move_velocity = true,
const bool  move_rotational_velocity = true  
)

Apply the particles' velocities to their positions, and age the particles.

This action actually updates the particle positions by adding the current velocity to the current position and the current rotational velocity to the current up vector. This is typically the last particle action performed in an iteration of a particle simulation, and typically only occurs once per iteration.

The velocity is multiplied by the time step length, dt, before being added to the position. This implements Euler's method of numerical integration with a constant but specifiable step size. See TimeStep() for more on varying the time step size.

Parameters:
move_velocity  apply velocity to position.
move_rotational_velocity  apply rotational velocity to Up vector. This is an optimization.

void OrbitLine ( const pVec p,
const pVec axis,
const float  magnitude = 1.0f,
const float  epsilon = P_EPS,
const float  max_radius = P_MAXFLOAT  
)

Accelerate particles toward the closest point on the given line.

For each particle, this action computes the vector to the closest point on the line, and accelerates the particle in that direction.

Parameters:
p  a point on the line
axis  any vector parallel to the line
magnitude  scales each particle's acceleration
epsilon  The amount of acceleration falls off inversely with the squared distance to the edge of the domain. But when that distance is small, the acceleration would be infinite, so epsilon is always added to the distance.
max_radius  defines the cylinder of influence of this action. No particle further than max_radius from the line is affected.

void OrbitPoint ( const pVec center,
const float  magnitude = 1.0f,
const float  epsilon = P_EPS,
const float  max_radius = P_MAXFLOAT  
)

Accelerate particles toward the given center point.

For each particle, this action computes the vector to the center point, and accelerates the particle in the vector direction.

Parameters:
center  accelerate toward this point
magnitude  scales each particle's acceleration
epsilon  The amount of acceleration falls off inversely with the squared distance to the edge of the domain. But when that distance is small, the acceleration would be infinite, so epsilon is always added to the distance.
max_radius  defines the sphere of influence of this action. No particle further than max_radius from the center is affected.

void RandomAccel ( const pDomain dom  ) 

Accelerate particles in random directions.

For each particle, chooses an acceleration vector from the specified domain and adds it to the particle's velocity. Reducing the time step, dt, will make a higher probability of being near the original velocity after unit time. Smaller dt approach a normal distribution of velocity vectors instead of a square wave distribution.

void RandomDisplace ( const pDomain dom  ) 

Immediately displace position by a random amount.

Chooses a displacement vector from the specified domain and adds it to the particle's position. Reducing the time step, dt, will make a higher probability of being near the original position after unit time. Smaller dt approach a normal distribution of particle positions instead of a square wave distribution.

Since this action changes particle positions, rather than changing their velocities and depending on the Move() action to change the positions, unsatisfying results may occur when used with the Avoid() or Bounce() actions. In particular, particles may be displaced to the opposite side of the surface without bouncing off it.

void RandomRotVelocity ( const pDomain dom  ) 

Immediately assign a random rotational velocity.

For each particle, sets the particle's rotational velocity vector to a random vector in the specified domain. This function is not affected by dt.

void RandomVelocity ( const pDomain dom  ) 

Replace particle velocity with a random velocity.

For each particle, sets the particle's velocity vector to a random vector in the specified domain. This function is not affected by dt.

void Restore ( const float  time,
const bool  vel = true,
const bool  rvel = true  
)

Over time, restore particles to their target positionB and upB.

If vel is true, computes a new velocity for each particle that will make the particle arrive at its positionB at the specified amount of time in the future. If rvel is true, computes a new rotational velocity that moves up toward upB.

The curved path that the particles take is a parametric quadratic. Once the specified amount of time has passed, Restore() instead sets position and Up to equal positionB and upB and sets velocity and rotational velocity to 0 to freeze them in place.

It is the application's responsibility to decrease time_left by dt on each call. When in an action list, this means you need to recreate the action list each time step.

The positionB attribute of each particle is typically the particle's position when it was created, or it can be specified within a domain. This is controlled by VertexBTracks(), and VertexB(). The positionB can be set at any time to the particle's current position using the CopyVertexB() action.

Restore(0) is the opposite of CopyVertexB(); it sets each particle's position to be equal to its positionB. However, this has the side effect of setting each particle's velocity to 0.

Parameters:
time  how long more until particles should arrive at target position and orientation
vel  restore positions
rvel  restore up vectors

void RotDamping ( const pVec damping,
const float  vlow = 0.0f,
const float  vhigh = P_MAXFLOAT  
)

Simulate air by dampening rotational velocities.

If a particle's rotational velocity magnitude is within vlow and vhigh, then multiply each component of the rotational velocity by the respective damping constant. Typically, the three components of damping will have the same value.

There are no bounds on the damping constants. Thus, by giving values greater than 1.0 they may be used to speed up particles instead of slow them down.

Parameters:
damping  Component-wise multiply this vector by the rotational velocity vector

void Sink ( const bool  kill_inside,
const pDomain dom  
)

Kill particles that have positions on wrong side of the specified domain.

If kill_inside is true, deletes all particles inside the given domain. If kill_inside is false, deletes all particles outside the given domain.

Parameters:
kill_inside  true to kill particles inside the domain

void SinkVelocity ( const bool  kill_inside,
const pDomain dom  
)

Kill particles that have velocities on wrong side of the specified domain.

If kill_inside is true, deletes all particles whose velocity vectors are inside the given domain. If kill_inside is false, deletes all particles whose velocity vectors are outside the given domain. This allows particles to die when they turn around, get too fast or too slow, etc. For example, use a sphere domain centered at the origin with a radius equal to the minimum velocity to kill particles that are too slow.

Parameters:
kill_inside  true to kill particles with velocities inside the domain

void Sort ( const pVec eye,
const pVec look,
const bool  front_to_back = false,
const bool  clamp_negative = false  
)

Sort the particles by their projection onto the look vector.

Many rendering systems require rendering transparent particles in back-to-front order. The ordering is defined by the eye point and the look vector. These are the same vectors you pass into gluLookAt(), for example. The vector from the eye point to each particle's position is computed, then projected onto the look vector. Particles are sorted back-to-front by the result of this dot product.

Parameters:
front_to_back  true to sort in front-to-back order instead of back-to-front
clamp_negative  true to set negative dot product values to zero before sorting. This speeds up sorting time. Particles behind the viewer won't be visible so their relative order doesn't matter.

void Source ( const float  particle_rate,
const pDomain dom  
)

Add particles with positions in the specified domain.

Adds new particles to the current particle group. The particle positions are chosen from the given domain. All the other particle attributes such as color and velocity are chosen according to their current domains.

When the Source action is called within an action list, the particle attribute domains used are those that were current when the Source command was called within the NewActionList() / EndActionList() block instead of when CallActionList() was called. Note that this is unlike OpenGL display lists.

If particle_rate / dt is not an integer then Source() adjusts the number of particles to add during this time step so that the average number added per unit time is particle_rate.

If too few particles seem to be added each frame, it is probably because the particle group is already full. If this is bad, you can grow the group using SetMaxParticles().

Parameters:
particle_rate  how many particles to add per unit time
dom  particle positions are chosen from this domain

void SpeedLimit ( const float  min_speed,
const float  max_speed = P_MAXFLOAT  
)

Clamp particle velocities to the given range.

Computes each particle�s speed (the magnitude of its velocity vector) and if it is less than min_speed or greater than max_speed the velocity is scaled to within those bounds, while preserving the velocity vector�s direction.

The vector [0,0,0] is an exception because it has no direction. Such vectors are not modified by SpeedLimit().

void TargetColor ( const pVec color,
const float  alpha,
const float  scale  
)

Change color of all particles toward the specified color.

Modifies the color and alpha of each particle to be scale percent of the way closer to the specified color and alpha. scale is multiplied by dt before scaling the sizes. Thus, using smaller dt causes a slightly faster approach to the target color.

This action makes all colors tend toward the specified, uniform color. The value of scale will usually be very small (less than 0.01) to yield a gradual transition.

Parameters:
color  target color
alpha  target alpha value
scale  what percent of the way from the current color to the target color to transition in unit time

void TargetRotVelocity ( const pVec rvel,
const float  scale  
)

Change rotational velocity of all particles toward the specified rotational velocity.

Modifies the rotational velocity of each particle to be scale percent of the way closer to the specified rotational velocity. This makes rotational velocities grow asymptotically closer to the given rotational velocity. scale is multiplied by dt before scaling the velocities. Thus, using smaller dt causes a slightly faster approach to the target rotational velocity.

This action makes all rotational velocities tend toward the specified, uniform rotational velocity. The value of scale will usually be very small (less than 0.01) to yield a gradual transition.

Parameters:
rvel  rotational velocity
scale  what percent of the way from the current rotational velocity to the target rotational velocity to transition in unit time

void TargetSize ( const pVec size,
const pVec scale  
)

Change sizes of all particles toward the specified size.

Modifies the size of each particle to be scale percent of the way closer to the specified size triple. This makes sizes grow asymptotically closer to the given size. scale is multiplied by dt before scaling the sizes. Thus, using smaller dt causes a slightly faster approach to the target size. The separate scales for each component allow only selected components to be scaled.

This action makes all sizes tend toward the specified, uniform size. Future versions will have more actions that modify size. Please send me suggestions (perhaps with sample implementations).

The value of scale will usually be very small (less than 0.01) to yield a gradual transition.

Parameters:
size  target size
scale  what percent of the way from the current size to the target size to transition in unit time

void TargetVelocity ( const pVec vel,
const float  scale  
)

Change velocity of all particles toward the specified velocity.

Modifies the velocity of each particle to be scale percent of the way closer to the specified velocity. This makes velocities grow asymptotically closer to the given velocity. scale is multiplied by dt before scaling the velocities. Thus, using smaller dt causes a slightly faster approach to the target velocity.

This action makes all velocities tend toward the specified, uniform velocity. The value of scale will usually be very small (less than 0.01) to yield a gradual transition.

Parameters:
vel  target velocity
scale  what percent of the way from the current velocity to the target velocity to transition in unit time

void Vertex ( const pVec v,
puint64  data = 0  
)

Add a single particle at the specified location.

This action mostly is a shorthand for Source(1, PDPoint(x, y, z)) but allows different callback data per particle.

When called in immediate mode, this action uses a slightly faster method to add a single particle to the current particle group. Also when in immediate mode, exactly one particle will be added per call, instead of an average of 1 / dt particles being added. Particle attributes are chosen according to their current domains, as with Source.

The user data attribute is an exception. It always takes the attribute from the optional data parameter to Vertex(), overriding the source state value.

This call is patterned after the glVertex() calls. It is useful for creating a particle group with exactly specified initial positions. For example, you can specify a geometrical model using Vertex calls, and then explode or deform it.

Parameters:
v  position of particle to create
data  application data to be passed to the birth and death callbacks

void Vortex ( const pVec center,
const pVec axis,
const float  tightnessExponent,
const float  max_radius,
const float  inSpeed,
const float  upSpeed,
const float  aroundSpeed  
)

Accelerate particles in a vortex-like way.

The vortex is a complicated action to use, but when done correctly it makes particles fly around like in a tornado.

Parameters:
center  tip of the vortex
axis  the ray along the center of the vortex
tightnessExponent  like a Phong exponent that gives a curve to the vortex silhouette; 1.0 is a cone; greater than 1.0 curves inward.
max_radius  defines the radius at the top of the vortex and the infinite cylinder of influence. No particle further than max_radius from the axis is affected.
inSpeed  inward acceleration of particles OUTSIDE the vortex
upSpeed  vertical acceleration of particles INSIDE the vortex. Can be negative to apply gravity.
aroundSpeed  acceleration around vortex of particles INSIDE the vortex.


Generated on Tue Dec 30 11:28:40 2008 for ParticleAPI by  doxygen 1.5.8