root/OpenSceneGraph/trunk/src/osgParticle/ParticleSystemUpdater.cpp @ 13041

Revision 13041, 3.6 kB (checked in by robert, 3 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#include <osgParticle/ParticleSystemUpdater>
2
3#include <osg/CopyOp>
4#include <osg/Geode>
5
6using namespace osg;
7
8osgParticle::ParticleSystemUpdater::ParticleSystemUpdater()
9: osg::Node(), _t0(-1), _frameNumber(0)
10{
11    setCullingActive(false);
12}
13
14osgParticle::ParticleSystemUpdater::ParticleSystemUpdater(const ParticleSystemUpdater& copy, const osg::CopyOp& copyop)
15: osg::Node(copy, copyop), _t0(copy._t0), _frameNumber(0)
16{
17    ParticleSystem_Vector::const_iterator i;
18    for (i=copy._psv.begin(); i!=copy._psv.end(); ++i) {
19        _psv.push_back(static_cast<ParticleSystem* >(copyop(i->get())));
20    }
21}
22
23void osgParticle::ParticleSystemUpdater::traverse(osg::NodeVisitor& nv)
24{
25    osgUtil::CullVisitor *cv = dynamic_cast<osgUtil::CullVisitor *>(&nv);
26    if (cv)
27    {
28        if (nv.getFrameStamp())
29        {
30            if( _frameNumber < nv.getFrameStamp()->getFrameNumber())
31            {
32                _frameNumber = nv.getFrameStamp()->getFrameNumber();
33
34                double t = nv.getFrameStamp()->getSimulationTime();
35                if (_t0 != -1.0)
36                {
37                    ParticleSystem_Vector::iterator i;
38                    for (i=_psv.begin(); i!=_psv.end(); ++i)
39                    {
40                        ParticleSystem* ps = i->get();
41
42                        ParticleSystem::ScopedWriteLock lock(*(ps->getReadWriteMutex()));
43
44                        if (!ps->isFrozen() && (ps->getLastFrameNumber() >= (nv.getFrameStamp()->getFrameNumber() - 1) || !ps->getFreezeOnCull()))
45                        {
46                            ps->update(t - _t0, nv);
47                        }
48                    }
49                }
50                _t0 = t;
51            }
52
53        }
54        else
55        {
56            OSG_WARN << "osgParticle::ParticleSystemUpdater::traverse(NodeVisitor&) requires a valid FrameStamp to function, particles not updated.\n";
57        }
58
59    }
60    Node::traverse(nv);
61}
62
63osg::BoundingSphere osgParticle::ParticleSystemUpdater::computeBound() const
64{
65    return osg::BoundingSphere();
66}
67
68bool osgParticle::ParticleSystemUpdater::addParticleSystem(ParticleSystem* ps)
69{
70    _psv.push_back(ps);
71    return true;
72}
73
74bool osgParticle::ParticleSystemUpdater::removeParticleSystem(ParticleSystem* ps)
75{
76   unsigned int i = getParticleSystemIndex( ps );
77   if( i >= _psv.size() ) return false;
78
79   removeParticleSystem( i );
80   return true;
81}
82
83bool osgParticle::ParticleSystemUpdater::removeParticleSystem(unsigned int pos, unsigned int numParticleSystemsToRemove)
84{
85   if( (pos < _psv.size()) && (numParticleSystemsToRemove > 0) )
86   {
87      unsigned int endOfRemoveRange = pos + numParticleSystemsToRemove;
88      if( endOfRemoveRange > _psv.size() )
89      {
90         OSG_DEBUG<<"Warning: ParticleSystem::removeParticleSystem(i,numParticleSystemsToRemove) has been passed an excessive number"<<std::endl;
91         OSG_DEBUG<<"         of ParticleSystems to remove, trimming just to end of ParticleSystem list."<<std::endl;
92         endOfRemoveRange = _psv.size();
93      }
94      _psv.erase(_psv.begin()+pos, _psv.begin()+endOfRemoveRange);
95      return true;
96   }
97   return false;
98}
99
100bool osgParticle::ParticleSystemUpdater::replaceParticleSystem( ParticleSystem* origPS, ParticleSystem* newPS )
101{
102   if( (newPS == NULL) || (origPS == newPS) ) return false;
103
104   unsigned int pos = getParticleSystemIndex( origPS );
105   if( pos < _psv.size() )
106   {
107      return setParticleSystem( pos, newPS );
108   }
109   return false;
110}
111
112bool osgParticle::ParticleSystemUpdater::setParticleSystem( unsigned int i, ParticleSystem* ps )
113{
114   if( (i < _psv.size()) && ps )
115   {
116      _psv[i] = ps;
117      return true;
118   }
119   return false;
120}
Note: See TracBrowser for help on using the browser.