openscenegraph
ModularEmitter
Go to the documentation of this file.
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_MODULAREMITTER
16#define OSGPARTICLE_MODULAREMITTER 1
17
18#include <osgParticle/Export>
19#include <osgParticle/Emitter>
20#include <osgParticle/Particle>
21#include <osgParticle/RandomRateCounter>
22#include <osgParticle/Placer>
23#include <osgParticle/PointPlacer>
24#include <osgParticle/Shooter>
25#include <osgParticle/RadialShooter>
26#include <osgParticle/ParticleSystem>
27
28#include <osg/ref_ptr>
29#include <osg/CopyOp>
30#include <osg/Object>
31#include <osg/Node>
32#include <osg/NodeVisitor>
33
34namespace osgParticle
35{
36
37 /** An emitter class that holds three objects to control the creation of particles.
38 These objects are a <I>counter</I>, a <I>placer</I> and a <I>shooter</I>.
39 The counter controls the number of particles to be emitted at each frame;
40 the placer must initialize the particle's position vector, while the shooter initializes
41 its velocity vector.
42 You can use the predefined counter/placer/shooter classes, or you can create your own.
43 */
44 class OSGPARTICLE_EXPORT ModularEmitter: public Emitter {
45 public:
46 ModularEmitter();
47 ModularEmitter(const ModularEmitter& copy, const osg::CopyOp& copyop = osg::CopyOp::SHALLOW_COPY);
48
49 META_Node(osgParticle,ModularEmitter);
50
51 /// Get the counter object.
52 inline Counter* getCounter();
53
54 /// Get the const Counter object.
55 inline const Counter* getCounter() const;
56
57 /// Set the Counter object.
58 inline void setCounter(Counter* c);
59
60 /// Get the ratio between number of particle to create in compensation for movement of the emitter
61 inline float getNumParticlesToCreateMovementCompensationRatio() const;
62
63 /// Set the ratio between number of particle to create in compenstation for movement of the emitter
64 inline void setNumParticlesToCreateMovementCompensationRatio(float r);
65
66
67 /// Get the Placer object.
68 inline Placer* getPlacer();
69
70 /// Get the const Placer object.
71 inline const Placer* getPlacer() const;
72
73 /// Set the Placer object.
74 inline void setPlacer(Placer* p);
75
76 /// Get the Shooter object.
77 inline Shooter *getShooter();
78
79 /// Get the const Shooter object.
80 inline const Shooter *getShooter() const;
81
82 /// Set the Shooter object.
83 inline void setShooter(Shooter *s);
84
85 protected:
86 virtual ~ModularEmitter() {}
87 ModularEmitter &operator=(const ModularEmitter &) { return *this; }
88
89 virtual void emitParticles(double dt);
90
91 private:
92
93 float _numParticleToCreateMovementCompensationRatio;
94 osg::ref_ptr<Counter> _counter;
95 osg::ref_ptr<Placer> _placer;
96 osg::ref_ptr<Shooter> _shooter;
97 };
98
99 // INLINE FUNCTIONS
100
101 inline Counter* ModularEmitter::getCounter()
102 {
103 return _counter.get();
104 }
105
106 inline const Counter* ModularEmitter::getCounter() const
107 {
108 return _counter.get();
109 }
110
111 inline void ModularEmitter::setCounter(Counter* c)
112 {
113 _counter = c;
114 }
115
116 inline float ModularEmitter::getNumParticlesToCreateMovementCompensationRatio() const
117 {
118 return _numParticleToCreateMovementCompensationRatio;
119 }
120
121 inline void ModularEmitter::setNumParticlesToCreateMovementCompensationRatio(float r)
122 {
123 _numParticleToCreateMovementCompensationRatio = r;
124 }
125
126 inline Placer* ModularEmitter::getPlacer()
127 {
128 return _placer.get();
129 }
130
131 inline const Placer* ModularEmitter::getPlacer() const
132 {
133 return _placer.get();
134 }
135
136 inline void ModularEmitter::setPlacer(Placer* p)
137 {
138 _placer = p;
139 }
140
141 inline Shooter *ModularEmitter::getShooter()
142 {
143 return _shooter.get();
144 }
145
146 inline const Shooter *ModularEmitter::getShooter() const
147 {
148 return _shooter.get();
149 }
150
151 inline void ModularEmitter::setShooter(Shooter *s)
152 {
153 _shooter = s;
154 }
155
156}
157
158#endif