[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 ; } + } ; |