[Plib-cvs] CVS: plib/src/ssgAux ssgaParticleSystem.cxx,1.1,1.2 ssgaParticleSystem.h,1.1,1.2
Brought to you by:
sjbaker
|
From: Steve B. <sj...@us...> - 2002-01-19 20:37:24
|
Update of /cvsroot/plib/plib/src/ssgAux
In directory usw-pr-cvs1:/tmp/cvs-serv2656/plib/src/ssgAux
Modified Files:
ssgaParticleSystem.cxx ssgaParticleSystem.h
Log Message:
Exposer will now operate in command-line mode to convert model+bones into tweened model.
The SSG loader now observes the 'appstate' callback.
ssgTween and ssgTweenController now include print() and getTypeName().
Significant changes to ssgaParticleSystem have taken place.
Index: ssgaParticleSystem.cxx
===================================================================
RCS file: /cvsroot/plib/plib/src/ssgAux/ssgaParticleSystem.cxx,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- ssgaParticleSystem.cxx 2002/01/13 02:13:15 1.1
+++ ssgaParticleSystem.cxx 2002/01/19 20:37:21 1.2
@@ -1,28 +1,12 @@
#include "ssgAux.h"
-void ssgaParticle::init ()
-{
- sgSetVec4 ( col, 1, 1, 1, 1 ) ;
- sgZeroVec3 ( pos ) ;
- sgZeroVec3 ( vel ) ;
- sgZeroVec3 ( acc ) ;
- time_to_live = 0 ;
-}
-
-void ssgaParticle::update ( float dt )
-{
- sgAddScaledVec3 ( vel, acc, dt ) ;
- sgAddScaledVec3 ( pos, vel, dt ) ;
- time_to_live -= dt ;
-}
-
-
ssgaParticleSystem::ssgaParticleSystem ( int num, int initial_num,
float _create_rate, int _ttf,
float sz, float bsphere_size,
- ssgaParticleFunc _particle_create,
- ssgaParticleFunc _particle_update ) :
+ ssgaParticleCreateFunc _particle_create,
+ ssgaParticleUpdateFunc _particle_update,
+ ssgaParticleDeleteFunc _particle_delete ) :
ssgVtxArray ( GL_QUADS,
new ssgVertexArray ( num * 4, new sgVec3 [ num * 4 ] ),
new ssgNormalArray ( num * 4, new sgVec3 [ num * 4 ] ),
@@ -35,40 +19,39 @@
create_rate = _create_rate ;
particle_create = _particle_create ;
particle_update = _particle_update ;
+ particle_delete = _particle_delete ;
size = sz ;
num_particles = num ;
num_verts = num * 4 ;
+ getBSphere () -> setRadius ( bsphere_size ) ;
+ getBSphere () -> setCenter ( 0, 0, 0 ) ;
+
particle = new ssgaParticle [ num ] ;
for ( int i = 0 ; i < num_verts ; i++ )
{
- sgSetVec3 ( getNormal ( i ), 0, -1, 0 ) ;
- sgSetVec4 ( getColour ( i ), 1, 1, 1, 1 ) ;
+ sgSetVec3 ( getNormal ( i ), 0, -1, 0 ) ;
+ sgSetVec4 ( getColour ( i ), 1, 1, 1, 1 ) ;
+ sgZeroVec3 ( getVertex ( i ) ) ;
*(getIndex( i )) = i ;
}
for ( int i = 0 ; i < num_particles ; i++ )
{
- particle [ i ] . init () ;
-
- sgSetVec3 ( getVertex ( i*4+0 ), 0 , 0, 0 ) ;
- sgSetVec3 ( getVertex ( i*4+1 ), 0 , 0, size ) ;
- sgSetVec3 ( getVertex ( i*4+2 ), size, 0, size ) ;
- sgSetVec3 ( getVertex ( i*4+3 ), size, 0, 0 ) ;
sgSetVec2 ( getTexCoord ( i*4+0 ), 0, 0 ) ;
sgSetVec2 ( getTexCoord ( i*4+1 ), 1, 0 ) ;
sgSetVec2 ( getTexCoord ( i*4+2 ), 1, 1 ) ;
sgSetVec2 ( getTexCoord ( i*4+3 ), 0, 1 ) ;
-
- if ( i < initial_num && particle_create )
- (*particle_create) ( & particle [ i ] ) ;
}
- getBSphere () -> setRadius ( bsphere_size ) ;
- getBSphere () -> setCenter ( 0, 0, 0 ) ;
+ if ( particle_create )
+ for ( int i = 0 ; i < initial_num ; i++ )
+ (*particle_create) ( this, i, & particle [ i ] ) ;
+
+ update ( 0.1 ) ;
}
@@ -97,25 +80,15 @@
for ( int i = 0 ; i < num_particles ; i++, j += 4 )
{
- if ( particle [ i ] . time_to_live < 0.0 )
- {
- getVertex ( j + 0 ) [ 2 ] = -1000000.0f ;
- getVertex ( j + 1 ) [ 2 ] = -1000000.0f ;
- getVertex ( j + 2 ) [ 2 ] = -1000000.0f ;
- getVertex ( j + 3 ) [ 2 ] = -1000000.0f ;
- }
- else
- {
- sgCopyVec4 ( getColour ( j + 0 ), particle[i].col ) ;
- sgCopyVec4 ( getColour ( j + 1 ), particle[i].col ) ;
- sgCopyVec4 ( getColour ( j + 2 ), particle[i].col ) ;
- sgCopyVec4 ( getColour ( j + 3 ), particle[i].col ) ;
+ sgCopyVec4 ( getColour ( j + 0 ), particle[i].col ) ;
+ sgCopyVec4 ( getColour ( j + 1 ), particle[i].col ) ;
+ sgCopyVec4 ( getColour ( j + 2 ), particle[i].col ) ;
+ sgCopyVec4 ( getColour ( j + 3 ), particle[i].col ) ;
- sgCopyVec3 ( getVertex ( j + 0 ), particle[i].pos ) ;
- sgAddVec3 ( getVertex ( j + 1 ), particle[i].pos, xx ) ;
- sgAddVec3 ( getVertex ( j + 2 ), particle[i].pos, xxyy ) ;
- sgAddVec3 ( getVertex ( j + 3 ), particle[i].pos, yy ) ;
- }
+ sgCopyVec3 ( getVertex ( j + 0 ), particle[i].pos ) ;
+ sgAddVec3 ( getVertex ( j + 1 ), particle[i].pos, xx ) ;
+ sgAddVec3 ( getVertex ( j + 2 ), particle[i].pos, xxyy ) ;
+ sgAddVec3 ( getVertex ( j + 3 ), particle[i].pos, yy ) ;
}
glDisable ( GL_CULL_FACE ) ;
@@ -128,23 +101,54 @@
}
+ssgaParticleSystem::~ssgaParticleSystem ()
+{
+ if ( particle_delete )
+ for ( int i = 0 ; i < num_particles ; i++ )
+ if ( particle [ i ] . time_to_live >= 0.0 )
+ (*particle_delete) ( this, i, & particle [ i ] ) ;
+
+ delete particle ;
+}
+
+
void ssgaParticleSystem::update ( float t )
{
+ int i ;
+
create_error += create_rate * t ;
- for ( int i = 0 ; i < num_particles ; i++ )
- {
+ num_active = 0 ;
+
+ /* Update all the particles */
+
+ for ( i = 0 ; i < num_particles ; i++ )
particle [ i ] . update ( t ) ;
- if ( particle_update )
- (*particle_update) ( & particle [ i ] ) ;
+ /* Call the update routine for all the particles */
- if ( particle [ i ] . time_to_live < 0.0 &&
- create_error >= 1.0f && particle_create )
+ if ( particle_update )
+ for ( i = 0 ; i < num_particles ; i++ )
+ (*particle_update) ( t, this, i, & particle [ i ] ) ;
+
+ /* Check for death of particles */
+
+ for ( i = 0 ; i < num_particles ; i++ )
+ if ( particle [ i ] . time_to_live < 0.0 )
{
- (*particle_create) ( & particle [ i ] ) ;
- create_error -= 1.0f ;
+ if ( particle_delete )
+ (*particle_delete) ( this, i, & particle [ i ] ) ;
+
+ particle [ i ] . pos [ 2 ] = -1000000.0f ;
+
+ if ( create_error >= 1.0f && particle_create )
+ {
+ (*particle_create) ( this, i, & particle [ i ] ) ;
+ create_error -= 1.0f ;
+ }
}
- }
+ else
+ num_active++ ;
}
+
Index: ssgaParticleSystem.h
===================================================================
RCS file: /cvsroot/plib/plib/src/ssgAux/ssgaParticleSystem.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- ssgaParticleSystem.h 2002/01/13 02:13:15 1.1
+++ ssgaParticleSystem.h 2002/01/19 20:37:21 1.2
@@ -1,26 +1,58 @@
-struct ssgaParticle
+class ssgaParticle
{
+public:
+
sgVec4 col ;
sgVec3 pos ;
sgVec3 vel ;
sgVec3 acc ;
float time_to_live ;
+ void *userData ;
- void init () ;
- void update ( float dt ) ;
+ void update ( float dt )
+ {
+ sgAddScaledVec3 ( vel, acc, dt ) ;
+ sgAddScaledVec3 ( pos, vel, dt ) ;
+ time_to_live -= dt ;
+ }
+
+ ssgaParticle ()
+ {
+ sgSetVec4 ( col, 1, 1, 1, 1 ) ;
+ sgZeroVec3 ( pos ) ;
+ sgZeroVec3 ( vel ) ;
+ sgZeroVec3 ( acc ) ;
+ time_to_live = 0 ;
+ userData = NULL ;
+ }
+
} ;
-typedef void (* ssgaParticleFunc) ( ssgaParticle *p ) ;
+class ssgaParticleSystem ;
+
+
+typedef void (* ssgaParticleCreateFunc) ( ssgaParticleSystem *ps,
+ int index,
+ ssgaParticle *p ) ;
+typedef void (* ssgaParticleUpdateFunc) ( float deltaTime,
+ ssgaParticleSystem *ps,
+ int index,
+ ssgaParticle *p ) ;
+typedef void (* ssgaParticleDeleteFunc) ( ssgaParticleSystem *ps,
+ int index,
+ ssgaParticle *p ) ;
+
class ssgaParticleSystem : public ssgVtxArray
{
int num_particles ;
int num_verts ;
int turn_to_face ;
+ int num_active ;
ssgaParticle *particle ;
float create_error ;
@@ -28,19 +60,29 @@
float size ;
- ssgaParticleFunc particle_create ;
- ssgaParticleFunc particle_update ;
+ ssgaParticleCreateFunc particle_create ;
+ ssgaParticleUpdateFunc particle_update ;
+ ssgaParticleDeleteFunc particle_delete ;
public:
ssgaParticleSystem ( int num, int initial_num,
float _create_rate, int _turn_to_face,
float sz, float bsphere_size,
- ssgaParticleFunc _particle_create,
- ssgaParticleFunc _particle_update ) ;
+ ssgaParticleCreateFunc _particle_create,
+ ssgaParticleUpdateFunc _particle_update = NULL,
+ ssgaParticleDeleteFunc _particle_delete = NULL ) ;
+
+ virtual ~ssgaParticleSystem () ;
+
+ void setSize ( float sz ) { size = sz ; }
+ float getSize () { return size ; }
void update ( float t ) ;
void draw_geometry () ;
+
+ int getNumActiveParticles () { return num_active ; }
+
} ;
|