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

Revision 13041, 4.7 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/ParticleProcessor>
2
3#include <osg/Node>
4#include <osg/NodeVisitor>
5#include <osg/CopyOp>
6#include <osg/Matrix>
7#include <osg/Notify>
8
9#include <osgUtil/CullVisitor>
10
11
12using namespace osg;
13
14osgParticle::ParticleProcessor::ParticleProcessor()
15:    osg::Node(),
16    _rf(RELATIVE_RF),
17    _enabled(true),
18    _t0(-1),
19    _ps(0),
20    _first_ltw_compute(true),
21    _need_ltw_matrix(false),
22    _first_wtl_compute(true),
23    _need_wtl_matrix(false),
24    _current_nodevisitor(0),
25    _endless(true),
26    _lifeTime(0.0),
27    _startTime(0.0),
28    _currentTime(0.0),
29    _resetTime(0.0),
30    _frameNumber(0)
31{
32    setCullingActive(false);
33}
34
35osgParticle::ParticleProcessor::ParticleProcessor(const ParticleProcessor& copy, const osg::CopyOp& copyop)
36:    osg::Node(copy, copyop),
37    _rf(copy._rf),
38    _enabled(copy._enabled),
39    _t0(copy._t0),
40    _ps(static_cast<ParticleSystem* >(copyop(copy._ps.get()))),
41    _first_ltw_compute(copy._first_ltw_compute),
42    _need_ltw_matrix(copy._need_ltw_matrix),
43    _first_wtl_compute(copy._first_wtl_compute),
44    _need_wtl_matrix(copy._need_wtl_matrix),
45    _current_nodevisitor(0),
46    _endless(copy._endless),
47    _lifeTime(copy._lifeTime),
48    _startTime(copy._startTime),
49    _currentTime(copy._currentTime),
50    _resetTime(copy._resetTime)
51{
52}
53
54void osgParticle::ParticleProcessor::traverse(osg::NodeVisitor& nv)
55{
56    // typecast the NodeVisitor to CullVisitor
57    osgUtil::CullVisitor* cv = dynamic_cast<osgUtil::CullVisitor*>(&nv);
58
59    // continue only if the visitor actually is a cull visitor
60    if (cv) {
61
62        // continue only if the particle system is valid
63        if (_ps.valid())
64        {
65            if (nv.getFrameStamp())
66            {
67                ParticleSystem::ScopedWriteLock lock(*(_ps->getReadWriteMutex()));
68
69                //added- 1/17/06- bgandere@nps.edu
70                //a check to make sure we havent updated yet this frame
71                if(_frameNumber < nv.getFrameStamp()->getFrameNumber())
72                {
73
74
75                    // retrieve the current time
76                    double t = nv.getFrameStamp()->getSimulationTime();
77
78                    // reset this processor if we've reached the reset point
79                    if ((_currentTime >= _resetTime) && (_resetTime > 0))
80                    {
81                        _currentTime = 0;
82                        _t0 = -1;
83                    }
84
85                    // skip if we haven't initialized _t0 yet
86                    if (_t0 != -1)
87                    {
88
89                        // check whether the processor is alive
90                        bool alive = false;
91                        if (_currentTime >= _startTime)
92                        {
93                            if (_endless || (_currentTime < (_startTime + _lifeTime)))
94                                alive = true;
95                        }
96
97                        // update current time
98                        _currentTime += t - _t0;
99
100                        // process only if the particle system is not frozen/culled
101                        if (alive &&
102                            _enabled &&
103                            !_ps->isFrozen() &&
104                            ((_ps->getLastFrameNumber()+1) >= (nv.getFrameStamp()->getFrameNumber()) || !_ps->getFreezeOnCull()))
105                        {
106                            // initialize matrix flags
107                            _need_ltw_matrix = true;
108                            _need_wtl_matrix = true;
109                            _current_nodevisitor = &nv;
110
111                            // do some process (unimplemented in this base class)
112                            process( t - _t0 );
113                        } else {
114                            //The values of _previous_wtl_matrix and _previous_ltw_matrix will be invalid
115                            //since processing was skipped for this frame
116                            _first_ltw_compute = true;
117                            _first_wtl_compute = true;
118                        }
119                    }
120                    _t0 = t;
121                }
122
123                //added- 1/17/06- bgandere@nps.edu
124                //updates the _frameNumber, keeping it current
125                _frameNumber = nv.getFrameStamp()->getFrameNumber();
126            }
127            else
128            {
129                OSG_WARN << "osgParticle::ParticleProcessor::traverse(NodeVisitor&) requires a valid FrameStamp to function, particles not updated.\n";
130            }
131
132        } else
133        {
134            OSG_WARN << "ParticleProcessor \"" << getName() << "\": invalid particle system\n";
135        }
136    }
137
138
139    // call the inherited method
140    Node::traverse(nv);
141}
142
143osg::BoundingSphere osgParticle::ParticleProcessor::computeBound() const
144{
145    return osg::BoundingSphere();
146}
Note: See TracBrowser for help on using the browser.