/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2003 Robert Osfield * * This library is open source and may be redistributed and/or modified under * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or * (at your option) any later version. The full license is in LICENSE file * included with this distribution, and on the openscenegraph.org website. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * OpenSceneGraph Public License for more details. */ //osgParticle - Copyright (C) 2002 Marco Jez #ifndef OSGPARTICLE_PARTICLESYSTEMUPDATER_ #define OSGPARTICLE_PARTICLESYSTEMUPDATER_ 1 #include #include #include #include #include #include #include #include #include namespace osgParticle { /** A useful node class for updating particle systems automatically. When a ParticleSystemUpdater is traversed by a cull visitor, it calls the update() method on the specified particle systems. You should place this updater AFTER other nodes like emitters and programs. */ class OSGPARTICLE_EXPORT ParticleSystemUpdater: public osg::Node { public: ParticleSystemUpdater(); ParticleSystemUpdater(const ParticleSystemUpdater ©, const osg::CopyOp ©op = osg::CopyOp::SHALLOW_COPY); META_Node(osgParticle,ParticleSystemUpdater); /// Add a particle system to the list. 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); protected: virtual ~ParticleSystemUpdater() {} ParticleSystemUpdater &operator=(const ParticleSystemUpdater &) { return *this; } inline virtual bool computeBound() const; private: typedef std::vector > ParticleSystem_Vector; ParticleSystem_Vector psv_; double t0_; }; // INLINE FUNCTIONS inline bool ParticleSystemUpdater::computeBound() const { _bsphere.init(); _bsphere_computed = true; return true; } inline bool ParticleSystemUpdater::addParticleSystem(ParticleSystem *ps) { psv_.push_back(ps); return true; } inline bool ParticleSystemUpdater::removeParticleSystem(ParticleSystem *ps) { 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