root/OpenSceneGraph/trunk/include/osgParticle/ParticleSystemUpdater @ 13041

Revision 13041, 4.5 kB (checked in by robert, 2 years ago)

Ran script to remove trailing spaces and tabs

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
2 *
3 * This library is open source and may be redistributed and/or modified under
4 * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
5 * (at your option) any later version.  The full license is in LICENSE file
6 * included with this distribution, and on the openscenegraph.org website.
7 *
8 * This library is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 * OpenSceneGraph Public License for more details.
12*/
13//osgParticle - Copyright (C) 2002 Marco Jez
14
15#ifndef OSGPARTICLE_PARTICLESYSTEMUPDATER
16#define OSGPARTICLE_PARTICLESYSTEMUPDATER 1
17
18#include <osgParticle/Export>
19#include <osgParticle/ParticleSystem>
20
21#include <vector>
22
23#include <osg/ref_ptr>
24#include <osg/CopyOp>
25#include <osg/Object>
26#include <osg/Geode>
27#include <osg/NodeVisitor>
28
29#include <osgUtil/CullVisitor>
30
31namespace osgParticle
32{
33
34    /**    A useful node class for updating particle systems automatically.
35        When a ParticleSystemUpdater is traversed by a cull visitor, it calls the
36        update() method on the specified particle systems. You should place this updater
37        AFTER other nodes like emitters and programs.
38    */
39    class OSGPARTICLE_EXPORT ParticleSystemUpdater: public osg::Node {
40    public:
41        ParticleSystemUpdater();
42        ParticleSystemUpdater(const ParticleSystemUpdater& copy, const osg::CopyOp& copyop = osg::CopyOp::SHALLOW_COPY);
43
44        META_Node(osgParticle,ParticleSystemUpdater);
45
46        /// Add a particle system to the list.
47        virtual bool addParticleSystem(ParticleSystem* ps);
48
49        /// Remove a particle system from the list (by pointer).
50        virtual bool removeParticleSystem(ParticleSystem* ps);
51
52        /// Remove a particle system(s) from the list (by index).
53        virtual bool removeParticleSystem(unsigned int i, unsigned int numParticleSystemsToRemove=1);
54
55        /// Replace ParticleSystem with another ParticleSystem.
56        virtual bool replaceParticleSystem(ParticleSystem* origPS, ParticleSystem* newPS);
57
58        /// set a particle system by index.
59        virtual bool setParticleSystem( unsigned int i, ParticleSystem* ps );
60
61        /// Return the number of particle systems on the list.
62        inline unsigned int getNumParticleSystems() const;
63
64        /// Get a particle system from the list.
65        inline ParticleSystem* getParticleSystem(unsigned int i);
66
67        /// Get a particle system from the list.
68        inline const ParticleSystem* getParticleSystem(unsigned int i) const;
69
70        /// return true if ParticleSystem is contained within ParticlsSystemUpdater.
71        inline bool containsParticleSystem( const ParticleSystem* ps ) const;
72
73        /// get index number of ParticleSystem.
74        inline unsigned int getParticleSystemIndex( const ParticleSystem* ps ) const;
75
76        virtual void traverse(osg::NodeVisitor& nv);
77
78        virtual osg::BoundingSphere computeBound() const;
79
80    protected:
81        virtual ~ParticleSystemUpdater() {}
82        ParticleSystemUpdater &operator=(const ParticleSystemUpdater &) { return *this; }
83
84    private:
85        typedef std::vector<osg::ref_ptr<ParticleSystem> > ParticleSystem_Vector;
86
87        ParticleSystem_Vector _psv;
88        double _t0;
89
90        //added 1/17/06- bgandere@nps.edu
91        //a var to keep from doing multiple updates per frame
92        unsigned int _frameNumber;
93    };
94
95    // INLINE FUNCTIONS
96
97    inline unsigned int ParticleSystemUpdater::getNumParticleSystems() const
98    {
99        return static_cast<int>(_psv.size());
100    }
101
102    inline ParticleSystem* ParticleSystemUpdater::getParticleSystem(unsigned int i)
103    {
104        return _psv[i].get();
105    }
106
107    inline const ParticleSystem* ParticleSystemUpdater::getParticleSystem(unsigned int i) const
108    {
109        return _psv[i].get();
110    }
111
112    inline bool ParticleSystemUpdater::containsParticleSystem( const ParticleSystem* ps ) const
113    {
114       for( ParticleSystem_Vector::const_iterator itr=_psv.begin();
115            itr!=_psv.end();
116            ++itr )
117       {
118          if( itr->get() == ps ) return true;
119       }
120       return false;
121    }
122
123    inline unsigned int ParticleSystemUpdater::getParticleSystemIndex( const ParticleSystem* ps ) const
124    {
125       for( unsigned int particleSystemNum=0; particleSystemNum<_psv.size(); ++particleSystemNum )
126       {
127          if( _psv[particleSystemNum] == ps ) return particleSystemNum;
128       }
129       return _psv.size(); // node not found.
130    }
131
132}
133
134#endif
Note: See TracBrowser for help on using the browser.