From 3fea25a0a12eca916f9bb579ebf2d39df6989d55 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Wed, 17 Mar 2004 20:31:55 +0000 Subject: [PATCH] From Marco Jez, updates to osgParticle, with integration of changes from Tom Jolly. --- include/osgParticle/ParticleProcessor | 14 ++ include/osgParticle/ParticleSystemUpdater | 155 ++++++++++++------ .../osgParticle/IO_ParticleSystemUpdater.cpp | 2 +- 3 files changed, 119 insertions(+), 52 deletions(-) diff --git a/include/osgParticle/ParticleProcessor b/include/osgParticle/ParticleProcessor index e0d962925..d19bc5f62 100644 --- a/include/osgParticle/ParticleProcessor +++ b/include/osgParticle/ParticleProcessor @@ -102,6 +102,15 @@ namespace osgParticle /// Get the reset time of this processor. inline double getResetTime() const; + /** + Check whether the processor is alive with respect to start time and + life duration. Note that this method may return true even if the + processor has been disabled by calling setEnabled(false). To test + whether the processor is actually processing particles or not, you + should evaluate (isEnabled() && isAlive()). + */ + inline bool isAlive() const; + void traverse(osg::NodeVisitor &nv); /// Get the current local-to-world transformation matrix (valid only during cull traversal). @@ -289,6 +298,11 @@ namespace osgParticle return getWorldToLocalMatrix().preMult(P) - getWorldToLocalMatrix().preMult(osg::Vec3(0, 0, 0)); } + + inline bool ParticleProcessor::isAlive() const + { + return currentTime_ < (lifeTime_ + startTime_); + } } diff --git a/include/osgParticle/ParticleSystemUpdater b/include/osgParticle/ParticleSystemUpdater index 4785cb8f3..0331c1340 100644 --- a/include/osgParticle/ParticleSystemUpdater +++ b/include/osgParticle/ParticleSystemUpdater @@ -43,26 +43,35 @@ namespace osgParticle META_Node(osgParticle,ParticleSystemUpdater); - /// Return the number of particle systems on the list. - inline int numParticleSystems() const; - /// Add a particle system to the list. - inline void addParticleSystem(ParticleSystem *ps); - - /// Get a const particle system from the list. - inline const ParticleSystem *getParticleSystem(int i) const; - - /// Get a particle system from the list. - inline ParticleSystem *getParticleSystem(int i); - - /// Find a particle system. - inline int findParticleSystem(ParticleSystem *ps) const; - - /// Remove a particle system from the list (by index). - inline void removeParticleSystem(int i); - + inline bool addParticleSystem(ParticleSystem *ps); + /// Remove a particle system from the list (by pointer). inline bool removeParticleSystem(ParticleSystem *ps); + + /// Remove a particle system(s) from the list (by index). + inline bool removeParticleSystem(unsigned int i, unsigned int numParticleSystemsToRemove=1); + + /// Replace ParticleSystem with another ParticleSystem. + inline bool replaceParticleSystem(ParticleSystem *origPS, ParticleSystem *newPS); + + /// set a particle system by index. + inline bool setParticleSystem( unsigned int i, ParticleSystem* ps ); + + /// Return the number of particle systems on the list. + inline unsigned int getNumParticleSystems() const; + + /// Get a particle system from the list. + inline ParticleSystem* getParticleSystem(unsigned int i); + + /// Get a particle system from the list. + inline const ParticleSystem* getParticleSystem(unsigned int i) const; + + /// return true if ParticleSystem is contained within ParticlsSystemUpdater. + inline bool containsParticleSystem( const ParticleSystem* ps ) const; + + /// get index number of ParticleSystem. + inline unsigned int getParticleSystemIndex( const ParticleSystem* ps ) const; virtual void traverse(osg::NodeVisitor &nv); @@ -87,50 +96,94 @@ namespace osgParticle _bsphere_computed = true; return true; } - - inline int ParticleSystemUpdater::numParticleSystems() const - { - return static_cast(psv_.size()); - } - inline void ParticleSystemUpdater::addParticleSystem(ParticleSystem *ps) + inline bool ParticleSystemUpdater::addParticleSystem(ParticleSystem *ps) { psv_.push_back(ps); - } - - inline const ParticleSystem *ParticleSystemUpdater::getParticleSystem(int i) const - { - return psv_[i].get(); - } - - inline ParticleSystem *ParticleSystemUpdater::getParticleSystem(int i) - { - return psv_[i].get(); - } - - inline void ParticleSystemUpdater::removeParticleSystem(int i) - { - psv_.erase(psv_.begin()+i); - } - - inline int ParticleSystemUpdater::findParticleSystem(ParticleSystem *ps) const - { - ParticleSystem_Vector::const_iterator i; - int j = 0; - for (i=psv_.begin(); i!=psv_.end(); ++i, ++j) { - if (i->get() == ps) return j; - } - return -1; + return true; } inline bool ParticleSystemUpdater::removeParticleSystem(ParticleSystem *ps) { - int i = findParticleSystem(ps); - if (i == -1) return false; - removeParticleSystem(i); + unsigned int i = getParticleSystemIndex( ps ); + if( i >= psv_.size() ) return false; + removeParticleSystem( i ); return true; } + + inline bool ParticleSystemUpdater::removeParticleSystem(unsigned int pos, unsigned int numParticleSystemsToRemove) + { + if( (pos < psv_.size()) && (numParticleSystemsToRemove > 0) ) + { + unsigned int endOfRemoveRange = pos + numParticleSystemsToRemove; + if( endOfRemoveRange > psv_.size() ) + { + osg::notify(osg::DEBUG_INFO)<<"Warning: ParticleSystem::removeParticleSystem(i,numParticleSystemsToRemove) has been passed an excessive number"<(psv_.size()); + } + inline ParticleSystem* ParticleSystemUpdater::getParticleSystem(unsigned int i) + { + return psv_[i].get(); + } + + inline const ParticleSystem* ParticleSystemUpdater::getParticleSystem(unsigned int i) const + { + return psv_[i].get(); + } + + inline bool ParticleSystemUpdater::containsParticleSystem( const ParticleSystem* ps ) const + { + for( ParticleSystem_Vector::const_iterator itr=psv_.begin(); + itr!=psv_.end(); + ++itr ) + { + if( itr->get() == ps ) return true; + } + return false; + } + + inline unsigned int ParticleSystemUpdater::getParticleSystemIndex( const ParticleSystem* ps ) const + { + for( unsigned int particleSystemNum=0; particleSystemNum(obj); - for (int i=0; i