1 | /*
|
---|
2 | -----------------------------------------------------------------------------
|
---|
3 | This source file is part of OGRE
|
---|
4 | (Object-oriented Graphics Rendering Engine)
|
---|
5 | For the latest info, see http://www.ogre3d.org/
|
---|
6 |
|
---|
7 | Copyright (c) 2000-2005 The OGRE Team
|
---|
8 | Also see acknowledgements in Readme.html
|
---|
9 |
|
---|
10 | This program is free software; you can redistribute it and/or modify it under
|
---|
11 | the terms of the GNU Lesser General Public License as published by the Free Software
|
---|
12 | Foundation; either version 2 of the License, or (at your option) any later
|
---|
13 | version.
|
---|
14 |
|
---|
15 | This program is distributed in the hope that it will be useful, but WITHOUT
|
---|
16 | ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
---|
17 | FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
---|
18 |
|
---|
19 | You should have received a copy of the GNU Lesser General Public License along with
|
---|
20 | this program; if not, write to the Free Software Foundation, Inc., 59 Temple
|
---|
21 | Place - Suite 330, Boston, MA 02111-1307, USA, or go to
|
---|
22 | http://www.gnu.org/copyleft/lesser.txt.
|
---|
23 | -----------------------------------------------------------------------------
|
---|
24 | */
|
---|
25 | #ifndef __ParticleSystem_H__
|
---|
26 | #define __ParticleSystem_H__
|
---|
27 |
|
---|
28 | #include "OgrePrerequisites.h"
|
---|
29 |
|
---|
30 | #include "OgreVector3.h"
|
---|
31 | #include "OgreString.h"
|
---|
32 | #include "OgreParticleIterator.h"
|
---|
33 | #include "OgreStringInterface.h"
|
---|
34 | #include "OgreMovableObject.h"
|
---|
35 |
|
---|
36 | namespace Ogre {
|
---|
37 |
|
---|
38 | /** Class defining particle system based special effects.
|
---|
39 | @remarks
|
---|
40 | Particle systems are special effects generators which are based on a
|
---|
41 | number of moving points to create the impression of things like like
|
---|
42 | sparkles, smoke, blood spurts, dust etc.
|
---|
43 | @par
|
---|
44 | This class simply manages a single collection of particles in world space
|
---|
45 | with a shared local origin for emission. The visual aspect of the
|
---|
46 | particles is handled by a ParticleSystemRenderer instance.
|
---|
47 | @par
|
---|
48 | Particle systems are created using the ParticleSystemManager methods, never directly.
|
---|
49 | In addition, like all subclasses of MovableObject, the ParticleSystem will only be considered for
|
---|
50 | rendering once it has been attached to a SceneNode.
|
---|
51 | */
|
---|
52 | class _OgreExport ParticleSystem : public StringInterface, public MovableObject
|
---|
53 | {
|
---|
54 | public:
|
---|
55 |
|
---|
56 | /** Command object for quota (see ParamCommand).*/
|
---|
57 | class _OgrePrivate CmdQuota : public ParamCommand
|
---|
58 | {
|
---|
59 | public:
|
---|
60 | String doGet(const void* target) const;
|
---|
61 | void doSet(void* target, const String& val);
|
---|
62 | };
|
---|
63 | /** Command object for material (see ParamCommand).*/
|
---|
64 | class _OgrePrivate CmdMaterial : public ParamCommand
|
---|
65 | {
|
---|
66 | public:
|
---|
67 | String doGet(const void* target) const;
|
---|
68 | void doSet(void* target, const String& val);
|
---|
69 | };
|
---|
70 | /** Command object for cull_each (see ParamCommand).*/
|
---|
71 | class _OgrePrivate CmdCull : public ParamCommand
|
---|
72 | {
|
---|
73 | public:
|
---|
74 | String doGet(const void* target) const;
|
---|
75 | void doSet(void* target, const String& val);
|
---|
76 | };
|
---|
77 | /** Command object for particle_width (see ParamCommand).*/
|
---|
78 | class _OgrePrivate CmdWidth : public ParamCommand
|
---|
79 | {
|
---|
80 | public:
|
---|
81 | String doGet(const void* target) const;
|
---|
82 | void doSet(void* target, const String& val);
|
---|
83 | };
|
---|
84 | /** Command object for particle_height (see ParamCommand).*/
|
---|
85 | class _OgrePrivate CmdHeight : public ParamCommand
|
---|
86 | {
|
---|
87 | public:
|
---|
88 | String doGet(const void* target) const;
|
---|
89 | void doSet(void* target, const String& val);
|
---|
90 | };
|
---|
91 | /** Command object for renderer (see ParamCommand).*/
|
---|
92 | class _OgrePrivate CmdRenderer : public ParamCommand
|
---|
93 | {
|
---|
94 | public:
|
---|
95 | String doGet(const void* target) const;
|
---|
96 | void doSet(void* target, const String& val);
|
---|
97 | };
|
---|
98 |
|
---|
99 | /// Default constructor required for STL creation in manager
|
---|
100 | ParticleSystem();
|
---|
101 | /** Creates a particle system with no emitters or affectors.
|
---|
102 | @remarks
|
---|
103 | You should use the ParticleSystemManager to create particle systems rather than creating
|
---|
104 | them directly.
|
---|
105 | */
|
---|
106 | ParticleSystem(const String& name, const String& resourceGroupName);
|
---|
107 |
|
---|
108 | virtual ~ParticleSystem();
|
---|
109 |
|
---|
110 | /** Sets the ParticleRenderer to be used to render this particle system.
|
---|
111 | @remarks
|
---|
112 | The main ParticleSystem just manages the creation and movement of
|
---|
113 | particles; they are rendered using functions in ParticleRenderer
|
---|
114 | and the ParticleVisual instances they create.
|
---|
115 | @param typeName String identifying the type of renderer to use; a new
|
---|
116 | instance of this type will be created; a factory must have been registered
|
---|
117 | with ParticleSystemManager.
|
---|
118 | */
|
---|
119 | void setRenderer(const String& typeName);
|
---|
120 |
|
---|
121 | /** Gets the ParticleRenderer to be used to render this particle system. */
|
---|
122 | ParticleSystemRenderer* getRenderer(void) const;
|
---|
123 | /** Gets the name of the ParticleRenderer to be used to render this particle system. */
|
---|
124 | const String& getRendererName(void) const;
|
---|
125 |
|
---|
126 | /** Adds an emitter to this particle system.
|
---|
127 | @remarks
|
---|
128 | Particles are created in a particle system by emitters - see the ParticleEmitter
|
---|
129 | class for more details.
|
---|
130 | @param
|
---|
131 | emitterType String identifying the emitter type to create. Emitter types are defined
|
---|
132 | by registering new factories with the manager - see ParticleEmitterFactory for more details.
|
---|
133 | Emitter types can be extended by OGRE, plugin authors or application developers.
|
---|
134 | */
|
---|
135 | ParticleEmitter* addEmitter(const String& emitterType);
|
---|
136 |
|
---|
137 | /** Retrieves an emitter by it's index (zero-based).
|
---|
138 | @remarks
|
---|
139 | Used to retrieve a pointer to an emitter for a particle system to procedurally change
|
---|
140 | emission parameters etc.
|
---|
141 | You should check how many emitters are registered against this system before calling
|
---|
142 | this method with an arbitrary index using getNumEmitters.
|
---|
143 | @param
|
---|
144 | index Zero-based index of the emitter to retrieve.
|
---|
145 | */
|
---|
146 | ParticleEmitter* getEmitter(unsigned short index) const;
|
---|
147 |
|
---|
148 | /** Returns the number of emitters for this particle system. */
|
---|
149 | unsigned short getNumEmitters(void) const;
|
---|
150 |
|
---|
151 | /** Removes an emitter from the system.
|
---|
152 | @remarks
|
---|
153 | Drops the emitter with the index specified from this system.
|
---|
154 | You should check how many emitters are registered against this system before calling
|
---|
155 | this method with an arbitrary index using getNumEmitters.
|
---|
156 | @param
|
---|
157 | index Zero-based index of the emitter to retrieve.
|
---|
158 | */
|
---|
159 | void removeEmitter(unsigned short index);
|
---|
160 |
|
---|
161 | /** Removes all the emitters from this system. */
|
---|
162 | void removeAllEmitters(void);
|
---|
163 |
|
---|
164 |
|
---|
165 | /** Adds an affector to this particle system.
|
---|
166 | @remarks
|
---|
167 | Particles are modified over time in a particle system by affectors - see the ParticleAffector
|
---|
168 | class for more details.
|
---|
169 | @param
|
---|
170 | affectorType String identifying the affector type to create. Affector types are defined
|
---|
171 | by registering new factories with the manager - see ParticleAffectorFactory for more details.
|
---|
172 | Affector types can be extended by OGRE, plugin authors or application developers.
|
---|
173 | */
|
---|
174 | ParticleAffector* addAffector(const String& affectorType);
|
---|
175 |
|
---|
176 | /** Retrieves an affector by it's index (zero-based).
|
---|
177 | @remarks
|
---|
178 | Used to retrieve a pointer to an affector for a particle system to procedurally change
|
---|
179 | affector parameters etc.
|
---|
180 | You should check how many affectors are registered against this system before calling
|
---|
181 | this method with an arbitrary index using getNumAffectors.
|
---|
182 | @param
|
---|
183 | index Zero-based index of the affector to retrieve.
|
---|
184 | */
|
---|
185 | ParticleAffector* getAffector(unsigned short index) const;
|
---|
186 |
|
---|
187 | /** Returns the number of affectors for this particle system. */
|
---|
188 | unsigned short getNumAffectors(void) const;
|
---|
189 |
|
---|
190 | /** Removes an affector from the system.
|
---|
191 | @remarks
|
---|
192 | Drops the affector with the index specified from this system.
|
---|
193 | You should check how many affectors are registered against this system before calling
|
---|
194 | this method with an arbitrary index using getNumAffectors.
|
---|
195 | @param
|
---|
196 | index Zero-based index of the affector to retrieve.
|
---|
197 | */
|
---|
198 | void removeAffector(unsigned short index);
|
---|
199 |
|
---|
200 | /** Removes all the affectors from this system. */
|
---|
201 | void removeAllAffectors(void);
|
---|
202 |
|
---|
203 | /** Empties this set of all particles.
|
---|
204 | */
|
---|
205 | void clear();
|
---|
206 |
|
---|
207 | /** Gets the number of individual particles in the system right now.
|
---|
208 | @remarks
|
---|
209 | The number of particles active in a system at a point in time depends on
|
---|
210 | the number of emitters, their emission rates, the time-to-live (TTL) each particle is
|
---|
211 | given on emission (and whether any affectors modify that TTL) and the maximum
|
---|
212 | number of particles allowed in this system at once (particle quota).
|
---|
213 | */
|
---|
214 | size_t getNumParticles(void) const;
|
---|
215 |
|
---|
216 | /** Manually add a particle to the system.
|
---|
217 | @remarks
|
---|
218 | Instead of using an emitter, you can manually add a particle to the system.
|
---|
219 | You must initialise the returned particle instance immediately with the
|
---|
220 | 'emission' state.
|
---|
221 | @note
|
---|
222 | There is no corresponding 'destroyParticle' method - if you want to dispose of a
|
---|
223 | particle manually (say, if you've used setSpeedFactor(0) to make particles live forever)
|
---|
224 | you should use getParticle() and modify it's timeToLive to zero, meaning that it will
|
---|
225 | get cleaned up in the next update.
|
---|
226 | */
|
---|
227 | Particle* createParticle(void);
|
---|
228 |
|
---|
229 | /** Retrieve a particle from the system for manual tweaking.
|
---|
230 | @remarks
|
---|
231 | Normally you use an affector to alter particles in flight, but
|
---|
232 | for small manually controlled particle systems you might want to use
|
---|
233 | this method.
|
---|
234 | */
|
---|
235 | Particle* getParticle(size_t index);
|
---|
236 |
|
---|
237 | /** Returns the maximum number of particles this system is allowed to have active at once.
|
---|
238 | @remarks
|
---|
239 | See ParticleSystem::setParticleQuota for more info.
|
---|
240 | */
|
---|
241 | size_t getParticleQuota(void) const;
|
---|
242 |
|
---|
243 | /** Sets the maximum number of particles this system is allowed to have active at once.
|
---|
244 | @remarks
|
---|
245 | Particle systems all have a particle quota, i.e. a maximum number of particles they are
|
---|
246 | allowed to have active at a time. This allows the application to set a keep particle systems
|
---|
247 | under control should they be affected by complex parameters which alter their emission rates
|
---|
248 | etc. If a particle system reaches it's particle quota, none of the emitters will be able to
|
---|
249 | emit any more particles. As existing particles die, the spare capacity will be allocated
|
---|
250 | equally across all emitters to be as consistent to the origina particle system style as possible.
|
---|
251 | @param quota The maximum number of particles this system is allowed to have.
|
---|
252 | */
|
---|
253 | void setParticleQuota(size_t quota);
|
---|
254 |
|
---|
255 |
|
---|
256 | /** Assignment operator for copying.
|
---|
257 | @remarks
|
---|
258 | This operator deep copies all particle emitters and effectors, but not particles. The
|
---|
259 | system's name is also not copied.
|
---|
260 | */
|
---|
261 | ParticleSystem& operator=(const ParticleSystem& rhs);
|
---|
262 |
|
---|
263 | /** Updates the particles in the system based on time elapsed.
|
---|
264 | @remarks
|
---|
265 | This is called automatically every frame by OGRE.
|
---|
266 | @param
|
---|
267 | timeElapsed The amount of time, in seconds, since the last frame.
|
---|
268 | */
|
---|
269 | void _update(Real timeElapsed);
|
---|
270 |
|
---|
271 | /** Returns an iterator for stepping through all particles in this system.
|
---|
272 | @remarks
|
---|
273 | This method is designed to be used by people providing new ParticleAffector subclasses,
|
---|
274 | this is the easiest way to step through all the particles in a system and apply the
|
---|
275 | changes the affector wants to make.
|
---|
276 | */
|
---|
277 | ParticleIterator _getIterator(void);
|
---|
278 |
|
---|
279 | /** Sets the name of the material to be used for this billboard set.
|
---|
280 | @param
|
---|
281 | name The new name of the material to use for this set.
|
---|
282 | */
|
---|
283 | virtual void setMaterialName(const String& name);
|
---|
284 |
|
---|
285 | /** Sets the name of the material to be used for this billboard set.
|
---|
286 | @returns The name of the material that is used for this set.
|
---|
287 | */
|
---|
288 | virtual const String& getMaterialName(void) const;
|
---|
289 |
|
---|
290 | /** Overridden from MovableObject
|
---|
291 | @see
|
---|
292 | MovableObject
|
---|
293 | */
|
---|
294 | virtual void _notifyCurrentCamera(Camera* cam);
|
---|
295 |
|
---|
296 | /** Overridden from MovableObject
|
---|
297 | @see
|
---|
298 | MovableObject
|
---|
299 | */
|
---|
300 | void _notifyAttached(Node* parent, bool isTagPoint = false);
|
---|
301 |
|
---|
302 | /** Overridden from MovableObject
|
---|
303 | @see
|
---|
304 | MovableObject
|
---|
305 | */
|
---|
306 | virtual const AxisAlignedBox& getBoundingBox(void) const { return mAABB; }
|
---|
307 |
|
---|
308 | /** Overridden from MovableObject
|
---|
309 | @see
|
---|
310 | MovableObject
|
---|
311 | */
|
---|
312 | virtual Real getBoundingRadius(void) const { return mBoundingRadius; }
|
---|
313 |
|
---|
314 | /** Overridden from MovableObject
|
---|
315 | @see
|
---|
316 | MovableObject
|
---|
317 | */
|
---|
318 | virtual void _updateRenderQueue(RenderQueue* queue);
|
---|
319 |
|
---|
320 | /** Overridden from MovableObject */
|
---|
321 | const String& getName(void) const { return mName; }
|
---|
322 |
|
---|
323 | /** Fast-forwards this system by the required number of seconds.
|
---|
324 | @remarks
|
---|
325 | This method allows you to fast-forward a system so that it effectively looks like
|
---|
326 | it has already been running for the time you specify. This is useful to avoid the
|
---|
327 | 'startup sequence' of a system, when you want the system to be fully populated right
|
---|
328 | from the start.
|
---|
329 | @param
|
---|
330 | time The number of seconds to fast-forward by.
|
---|
331 | @param
|
---|
332 | interval The sampling interval used to generate particles, apply affectors etc. The lower this
|
---|
333 | is the more realistic the fast-forward, but it takes more iterations to do it.
|
---|
334 | */
|
---|
335 | void fastForward(Real time, Real interval = 0.1);
|
---|
336 |
|
---|
337 | /** Sets a 'speed factor' on this particle system, which means it scales the elapsed
|
---|
338 | real time which has passed by this factor before passing it to the emitters, affectors,
|
---|
339 | and the particle life calculation.
|
---|
340 | @remarks
|
---|
341 | An interesting side effect - if you want to create a completely manual particle system
|
---|
342 | where you control the emission and life of particles yourself, you can set the speed
|
---|
343 | factor to 0.0f, thus disabling normal particle emission, alteration, and death.
|
---|
344 | */
|
---|
345 | void setSpeedFactor(Real speedFactor) { mSpeedFactor = speedFactor; }
|
---|
346 |
|
---|
347 | /** Gets the 'speed factor' on this particle system.
|
---|
348 | */
|
---|
349 | Real getSpeedFactor(void) const { return mSpeedFactor; }
|
---|
350 |
|
---|
351 |
|
---|
352 | /** Overridden from MovableObject */
|
---|
353 | const String& getMovableType(void) const;
|
---|
354 |
|
---|
355 | /** Internal callback used by Particles to notify their parent that they have been resized.
|
---|
356 | */
|
---|
357 | virtual void _notifyParticleResized(void);
|
---|
358 |
|
---|
359 | /** Internal callback used by Particles to notify their parent that they have been rotated.
|
---|
360 | */
|
---|
361 | virtual void _notifyParticleRotated(void);
|
---|
362 |
|
---|
363 | /** Sets the default dimensions of the particles in this set.
|
---|
364 | @remarks
|
---|
365 | All particles in a set are created with these default dimensions. The set will render most efficiently if
|
---|
366 | all the particles in the set are the default size. It is possible to alter the size of individual
|
---|
367 | particles at the expense of extra calculation. See the Particle class for more info.
|
---|
368 | @param width
|
---|
369 | The new default width for the particles in this set.
|
---|
370 | @param height
|
---|
371 | The new default height for the particles in this set.
|
---|
372 | */
|
---|
373 | virtual void setDefaultDimensions(Real width, Real height);
|
---|
374 |
|
---|
375 | /** See setDefaultDimensions - this sets 1 component individually. */
|
---|
376 | virtual void setDefaultWidth(Real width);
|
---|
377 | /** See setDefaultDimensions - this gets 1 component individually. */
|
---|
378 | virtual Real getDefaultWidth(void) const;
|
---|
379 | /** See setDefaultDimensions - this sets 1 component individually. */
|
---|
380 | virtual void setDefaultHeight(Real height);
|
---|
381 | /** See setDefaultDimensions - this gets 1 component individually. */
|
---|
382 | virtual Real getDefaultHeight(void) const;
|
---|
383 | /** Returns whether or not particles in this are tested individually for culling. */
|
---|
384 | virtual bool getCullIndividually(void) const;
|
---|
385 | /** Sets whether culling tests particles in this individually as well as in a group.
|
---|
386 | @remarks
|
---|
387 | Particle sets are always culled as a whole group, based on a bounding box which
|
---|
388 | encloses all particles in the set. For fairly localised sets, this is enough. However, you
|
---|
389 | can optionally tell the set to also cull individual particles in the set, i.e. to test
|
---|
390 | each individual particle before rendering. The default is not to do this.
|
---|
391 | @par
|
---|
392 | This is useful when you have a large, fairly distributed set of particles, like maybe
|
---|
393 | trees on a landscape. You probably still want to group them into more than one
|
---|
394 | set (maybe one set per section of landscape), which will be culled coarsely, but you also
|
---|
395 | want to cull the particles individually because they are spread out. Whilst you could have
|
---|
396 | lots of single-tree sets which are culled separately, this would be inefficient to render
|
---|
397 | because each tree would be issued as it's own rendering operation.
|
---|
398 | @par
|
---|
399 | By calling this method with a parameter of true, you can have large particle sets which
|
---|
400 | are spaced out and so get the benefit of batch rendering and coarse culling, but also have
|
---|
401 | fine-grained culling so unnecessary rendering is avoided.
|
---|
402 | @param cullIndividual If true, each particle is tested before being sent to the pipeline as well
|
---|
403 | as the whole set having to pass the coarse group bounding test.
|
---|
404 | */
|
---|
405 | virtual void setCullIndividually(bool cullIndividual);
|
---|
406 | /// Return the resource group to be used to load dependent resources
|
---|
407 | virtual const String& getResourceGroupName(void) const { return mResourceGroupName; }
|
---|
408 | /** Get the origin of this particle system, e.g. a script file name.
|
---|
409 | @remarks
|
---|
410 | This property will only contain something if the creator of
|
---|
411 | this particle system chose to populate it. Script loaders are advised
|
---|
412 | to populate it.
|
---|
413 | */
|
---|
414 | const String& getOrigin(void) const { return mOrigin; }
|
---|
415 | /// Notify this particle system of it's origin
|
---|
416 | void _notifyOrigin(const String& origin) { mOrigin = origin; }
|
---|
417 |
|
---|
418 | /** @copydoc MovableObject::setRenderQueueGroup */
|
---|
419 | void setRenderQueueGroup(RenderQueueGroupID queueID);
|
---|
420 |
|
---|
421 | /** Set the (initial) bounds of the particle system manually.
|
---|
422 | @remarks
|
---|
423 | If you can, set the bounds of a particle system up-front and
|
---|
424 | call setBoundsUpdatePeriod(0); this is the most efficient way to
|
---|
425 | organise it. Otherwise, set an initial bounds and let the bounds increase
|
---|
426 | for a little while (the default is 5 seconds), after which time the
|
---|
427 | AABB is fixed to save time.
|
---|
428 | @param aabb Bounds in local space.
|
---|
429 | */
|
---|
430 | void setBounds(const AxisAlignedBox& aabb);
|
---|
431 |
|
---|
432 | /** Sets whether the bounds will be automatically updated
|
---|
433 | for the life of the particle system
|
---|
434 | @remarks
|
---|
435 | If you have a stationary particle system, it would be a good idea to
|
---|
436 | call this method and set the value to 'false', since the maximum
|
---|
437 | bounds of the particle system will eventually be static. If you do
|
---|
438 | this, you can either set the bounds manually using the setBounds()
|
---|
439 | method, or set the second parameter of this method to a positive
|
---|
440 | number of seconds, so that the bounds are calculated for a few
|
---|
441 | seconds and then frozen.
|
---|
442 | @param autoUpdate If true (the default), the particle system will
|
---|
443 | update it's bounds every frame. If false, the bounds update will
|
---|
444 | cease after the 'stopIn' number of seconds have passed.
|
---|
445 | @param stopIn Only applicable if the first parameter is true, this is the
|
---|
446 | number of seconds after which the automatic update will cease.
|
---|
447 | */
|
---|
448 | void setBoundsAutoUpdated(bool autoUpdate, Real stopIn = 0.0f);
|
---|
449 |
|
---|
450 | /** Internal method for updating the bounds of the particle system.
|
---|
451 | @remarks
|
---|
452 | This is called automatically for a period of time after the system's
|
---|
453 | creation (5 seconds by default, settable by setBoundsUpdatePeriod)
|
---|
454 | to increase (and only increase) the bounds of the system according
|
---|
455 | to the emitted and affected particles. After this period, the
|
---|
456 | system is assumed to achieved its maximum size, and the bounds are
|
---|
457 | no longer computed for efficiency. You can tweak the behaviour by
|
---|
458 | either setting the bounds manually (setBounds, preferred), or
|
---|
459 | changing the time over which the bounds are updated (performance cost).
|
---|
460 | You can also call this method manually if you need to update the
|
---|
461 | bounds on an ad-hoc basis.
|
---|
462 | */
|
---|
463 | void _updateBounds(void);
|
---|
464 |
|
---|
465 | protected:
|
---|
466 |
|
---|
467 | /// Command objects
|
---|
468 | static CmdCull msCullCmd;
|
---|
469 | static CmdHeight msHeightCmd;
|
---|
470 | static CmdMaterial msMaterialCmd;
|
---|
471 | static CmdQuota msQuotaCmd;
|
---|
472 | static CmdWidth msWidthCmd;
|
---|
473 | static CmdRenderer msRendererCmd;
|
---|
474 |
|
---|
475 |
|
---|
476 | AxisAlignedBox mAABB;
|
---|
477 | Real mBoundingRadius;
|
---|
478 | bool mBoundsAutoUpdate;
|
---|
479 | Real mBoundsUpdateTime;
|
---|
480 |
|
---|
481 | /// World AABB, only used to compare world-space positions to calc bounds
|
---|
482 | AxisAlignedBox mWorldAABB;
|
---|
483 |
|
---|
484 | /// Name of the system; used for location in the scene.
|
---|
485 | String mName;
|
---|
486 | /// Name of the resource group to use to load materials
|
---|
487 | String mResourceGroupName;
|
---|
488 | /// Name of the material to use
|
---|
489 | String mMaterialName;
|
---|
490 | /// Have we set the material etc on the renderer?
|
---|
491 | bool mIsRendererConfigured;
|
---|
492 | /// Pointer to the material to use
|
---|
493 | MaterialPtr mpMaterial;
|
---|
494 | /// Default width of each particle
|
---|
495 | Real mDefaultWidth;
|
---|
496 | /// Default height of each particle
|
---|
497 | Real mDefaultHeight;
|
---|
498 | /// Speed factor
|
---|
499 | Real mSpeedFactor;
|
---|
500 |
|
---|
501 | typedef std::list<Particle*> ActiveParticleList;
|
---|
502 | typedef std::deque<Particle*> FreeParticleQueue;
|
---|
503 | typedef std::vector<Particle*> ParticlePool;
|
---|
504 |
|
---|
505 | /** Active particle list.
|
---|
506 | @remarks
|
---|
507 | This is a linked list of pointers to particles in the particle pool.
|
---|
508 | @par
|
---|
509 | This allows very fast instertions and deletions from anywhere in
|
---|
510 | the list to activate / deactivate particles as well as resuse of
|
---|
511 | Particle instances in the pool without construction & destruction
|
---|
512 | which avoids memory thrashing.
|
---|
513 | */
|
---|
514 | ActiveParticleList mActiveParticles;
|
---|
515 |
|
---|
516 | /** Free particle queue.
|
---|
517 | @remarks
|
---|
518 | This contains a list of the particles free for use as new instances
|
---|
519 | as required by the set. Particle instances are preconstructed up
|
---|
520 | to the estimated size in the mParticlePool vector and are
|
---|
521 | referenced on this deque at startup. As they get used this deque
|
---|
522 | reduces, as they get released back to to the set they get added back to the deque.
|
---|
523 | */
|
---|
524 | FreeParticleQueue mFreeParticles;
|
---|
525 |
|
---|
526 | /** Pool of particle instances for use and reuse in the active particle list.
|
---|
527 | @remarks
|
---|
528 | This vector will be preallocated with the estimated size of the set,and will extend as required.
|
---|
529 | */
|
---|
530 | ParticlePool mParticlePool;
|
---|
531 |
|
---|
532 | typedef std::vector<ParticleEmitter*> ParticleEmitterList;
|
---|
533 | typedef std::vector<ParticleAffector*> ParticleAffectorList;
|
---|
534 |
|
---|
535 | /// List of particle emitters, ie sources of particles
|
---|
536 | ParticleEmitterList mEmitters;
|
---|
537 | /// List of particle affectors, ie modifiers of particles
|
---|
538 | ParticleAffectorList mAffectors;
|
---|
539 |
|
---|
540 | /// The renderer used to render this particle system
|
---|
541 | ParticleSystemRenderer* mRenderer;
|
---|
542 |
|
---|
543 | /// Do we cull each particle individually?
|
---|
544 | bool mCullIndividual;
|
---|
545 |
|
---|
546 | /// The name of the type of renderer used to render this system
|
---|
547 | String mRendererType;
|
---|
548 |
|
---|
549 | /// The number of particles in the pool.
|
---|
550 | size_t mPoolSize;
|
---|
551 |
|
---|
552 | /// Optional origin of this particle system (eg script name)
|
---|
553 | String mOrigin;
|
---|
554 |
|
---|
555 |
|
---|
556 | /** Internal method used to expire dead particles. */
|
---|
557 | void _expire(Real timeElapsed);
|
---|
558 |
|
---|
559 | /** Spawn new particles based on free quota and emitter requirements. */
|
---|
560 | void _triggerEmitters(Real timeElapsed);
|
---|
561 |
|
---|
562 | /** Updates existing particle based on their momentum. */
|
---|
563 | void _applyMotion(Real timeElapsed);
|
---|
564 |
|
---|
565 | /** Applies the effects of affectors. */
|
---|
566 | void _triggerAffectors(Real timeElapsed);
|
---|
567 |
|
---|
568 | /** Resize the internal pool of particles. */
|
---|
569 | void increasePool(size_t size);
|
---|
570 |
|
---|
571 | /** Internal method for initialising string interface. */
|
---|
572 | void initParameters(void);
|
---|
573 |
|
---|
574 | /** Internal method to configure the renderer. */
|
---|
575 | void configureRenderer(void);
|
---|
576 |
|
---|
577 | /// Internal method for creating ParticleVisualData instances for the pool
|
---|
578 | void createVisualParticles(size_t poolstart, size_t poolend);
|
---|
579 | /// Internal method for destroying ParticleVisualData instances for the pool
|
---|
580 | void destroyVisualParticles(size_t poolstart, size_t poolend);
|
---|
581 |
|
---|
582 |
|
---|
583 | };
|
---|
584 |
|
---|
585 | }
|
---|
586 |
|
---|
587 | #endif
|
---|