# OgreParticleSystem.h

Go to the documentation of this file.

    00001 /*
    00002 -----------------------------------------------------------------------------
    00003 This source file is part of OGRE
    00004 (Object-oriented Graphics Rendering Engine)
    00005 For the latest info, see http://www.ogre3d.org/
    00006
    00007 Copyright (c) 2000-2009 Torus Knot Software Ltd
    00008
    00009 Permission is hereby granted, free of charge, to any person obtaining a copy
    00010 of this software and associated documentation files (the "Software"), to deal
    00011 in the Software without restriction, including without limitation the rights
    00012 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    00013 copies of the Software, and to permit persons to whom the Software is
    00014 furnished to do so, subject to the following conditions:
    00015
    00016 The above copyright notice and this permission notice shall be included in
    00017 all copies or substantial portions of the Software.
    00018
    00019 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    00020 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    00021 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    00022 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    00023 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    00024 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    00025 THE SOFTWARE.
    00026 -----------------------------------------------------------------------------
    00027 */
    00028 #ifndef __ParticleSystem_H__
    00029 #define __ParticleSystem_H__
    00030
    00031 #include "OgrePrerequisites.h"
    00032
    00033 #include "OgreVector3.h"
    00034 #include "OgreString.h"
    00035 #include "OgreParticleIterator.h"
    00036 #include "OgreStringInterface.h"
    00037 #include "OgreMovableObject.h"
    00038 #include "OgreRadixSort.h"
    00039 #include "OgreController.h"
    00040 #include "OgreResourceGroupManager.h"
    00041
    00042
    00043 namespace Ogre {
    00044
    00066     class _OgreExport ParticleSystem : public StringInterface, public MovableObject
    00067     {
    00068     public:
    00069
    00071         class _OgrePrivate CmdQuota : public ParamCommand
    00072         {
    00073         public:
    00074             String doGet(const void* target) const;
    00075             void doSet(void* target, const String& val);
    00076         };
    00078         class _OgrePrivate CmdEmittedEmitterQuota : public ParamCommand
    00079         {
    00080         public:
    00081             String doGet(const void* target) const;
    00082             void doSet(void* target, const String& val);
    00083         };
    00085         class _OgrePrivate CmdMaterial : public ParamCommand
    00086         {
    00087         public:
    00088             String doGet(const void* target) const;
    00089             void doSet(void* target, const String& val);
    00090         };
    00092         class _OgrePrivate CmdCull : public ParamCommand
    00093         {
    00094         public:
    00095             String doGet(const void* target) const;
    00096             void doSet(void* target, const String& val);
    00097         };
    00099         class _OgrePrivate CmdWidth : public ParamCommand
    00100         {
    00101         public:
    00102             String doGet(const void* target) const;
    00103             void doSet(void* target, const String& val);
    00104         };
    00106         class _OgrePrivate CmdHeight : public ParamCommand
    00107         {
    00108         public:
    00109             String doGet(const void* target) const;
    00110             void doSet(void* target, const String& val);
    00111         };
    00113         class _OgrePrivate CmdRenderer : public ParamCommand
    00114         {
    00115         public:
    00116             String doGet(const void* target) const;
    00117             void doSet(void* target, const String& val);
    00118         };
    00120         class CmdSorted : public ParamCommand
    00121         {
    00122         public:
    00123             String doGet(const void* target) const;
    00124             void doSet(void* target, const String& val);
    00125         };
    00127         class CmdLocalSpace : public ParamCommand
    00128         {
    00129         public:
    00130             String doGet(const void* target) const;
    00131             void doSet(void* target, const String& val);
    00132         };
    00134         class CmdIterationInterval : public ParamCommand
    00135         {
    00136         public:
    00137             String doGet(const void* target) const;
    00138             void doSet(void* target, const String& val);
    00139         };
    00141         class CmdNonvisibleTimeout : public ParamCommand
    00142         {
    00143         public:
    00144             String doGet(const void* target) const;
    00145             void doSet(void* target, const String& val);
    00146         };
    00147
    00149         ParticleSystem();
    00155         ParticleSystem(const String& name, const String& resourceGroupName);
    00156
    00157         virtual ~ParticleSystem();
    00158
    00168         void setRenderer(const String& typeName);
    00169
    00171         ParticleSystemRenderer* getRenderer(void) const;
    00173         const String& getRendererName(void) const;
    00174
    00184         ParticleEmitter* addEmitter(const String& emitterType);
    00185
    00195         ParticleEmitter* getEmitter(unsigned short index) const;
    00196
    00198         unsigned short getNumEmitters(void) const;
    00199
    00208         void removeEmitter(unsigned short index);
    00209
    00211         void removeAllEmitters(void);
    00212
    00213
    00223         ParticleAffector* addAffector(const String& affectorType);
    00224
    00234         ParticleAffector* getAffector(unsigned short index) const;
    00235
    00237         unsigned short getNumAffectors(void) const;
    00238
    00247         void removeAffector(unsigned short index);
    00248
    00250         void removeAllAffectors(void);
    00251
    00254         void clear();
    00255
    00263         size_t getNumParticles(void) const;
    00264
    00276         Particle* createParticle(void);
    00277
    00287         Particle* createEmitterParticle(const String& emitterName);
    00288
    00295         Particle* getParticle(size_t index);
    00296
    00301         size_t getParticleQuota(void) const;
    00302
    00313         void setParticleQuota(size_t quota);
    00314
    00319         size_t getEmittedEmitterQuota(void) const;
    00320
    00326         void setEmittedEmitterQuota(size_t quota);
    00327
    00333         ParticleSystem& operator=(const ParticleSystem& rhs);
    00334
    00341         void _update(Real timeElapsed);
    00342
    00349         ParticleIterator _getIterator(void);
    00350
    00355         virtual void setMaterialName( const String& name, const String& groupName = ResourceGroupManager::AUTODETECT_RESOURCE_GROUP_NAME );
    00356
    00360         virtual const String& getMaterialName(void) const;
    00361
    00366         virtual void _notifyCurrentCamera(Camera* cam);
    00367
    00372         void _notifyAttached(Node* parent, bool isTagPoint = false);
    00373
    00378         virtual const AxisAlignedBox& getBoundingBox(void) const { return mAABB; }
    00379
    00384         virtual Real getBoundingRadius(void) const { return mBoundingRadius; }
    00385
    00390         virtual void _updateRenderQueue(RenderQueue* queue);
    00391
    00393         void visitRenderables(Renderable::Visitor* visitor,
    00394             bool debugRenderables = false);
    00395
    00408         void fastForward(Real time, Real interval = 0.1);
    00409
    00418         void setSpeedFactor(Real speedFactor) { mSpeedFactor = speedFactor; }
    00419
    00422         Real getSpeedFactor(void) const { return mSpeedFactor; }
    00423
    00439         void setIterationInterval(Real iterationInterval);
    00440
    00443         Real getIterationInterval(void) const { return mIterationInterval; }
    00444
    00447         static void setDefaultIterationInterval(Real iterationInterval) { msDefaultIterationInterval = iterationInterval; }
    00448
    00451         static Real getDefaultIterationInterval(void) { return msDefaultIterationInterval; }
    00452
    00467         void setNonVisibleUpdateTimeout(Real timeout);
    00471         Real getNonVisibleUpdateTimeout(void) const { return mNonvisibleTimeout; }
    00472
    00475         static void setDefaultNonVisibleUpdateTimeout(Real timeout)
    00476         { msDefaultNonvisibleTimeout = timeout; }
    00477
    00480         static Real getDefaultNonVisibleUpdateTimeout(void) { return msDefaultNonvisibleTimeout; }
    00481
    00483         const String& getMovableType(void) const;
    00484
    00487         virtual void _notifyParticleResized(void);
    00488
    00491         virtual void _notifyParticleRotated(void);
    00492
    00503         virtual void setDefaultDimensions(Real width, Real height);
    00504
    00506         virtual void setDefaultWidth(Real width);
    00508         virtual Real getDefaultWidth(void) const;
    00510         virtual void setDefaultHeight(Real height);
    00512         virtual Real getDefaultHeight(void) const;
    00514         virtual bool getCullIndividually(void) const;
    00535         virtual void setCullIndividually(bool cullIndividual);
    00537         virtual const String& getResourceGroupName(void) const { return mResourceGroupName; }
    00544         const String& getOrigin(void) const { return mOrigin; }
    00546         void _notifyOrigin(const String& origin) { mOrigin = origin; }
    00547
    00549         void setRenderQueueGroup(uint8 queueID);
    00550
    00557         void setSortingEnabled(bool enabled) { mSorted = enabled; }
    00559         bool getSortingEnabled(void) const { return mSorted; }
    00560
    00570         void setBounds(const AxisAlignedBox& aabb);
    00571
    00588         void setBoundsAutoUpdated(bool autoUpdate, Real stopIn = 0.0f);
    00589
    00599         void setKeepParticlesInLocalSpace(bool keepLocal);
    00600
    00604         bool getKeepParticlesInLocalSpace(void) const { return mLocalSpace; }
    00605
    00619         void _updateBounds(void);
    00620
    00630         void setEmitting(bool v);
    00631
    00637         bool getEmitting() const;
    00638
    00640         uint32 getTypeFlags(void) const;
    00641     protected:
    00642
    00644         static CmdCull msCullCmd;
    00645         static CmdHeight msHeightCmd;
    00646         static CmdMaterial msMaterialCmd;
    00647         static CmdQuota msQuotaCmd;
    00648         static CmdEmittedEmitterQuota msEmittedEmitterQuotaCmd;
    00649         static CmdWidth msWidthCmd;
    00650         static CmdRenderer msRendererCmd;
    00651         static CmdSorted msSortedCmd;
    00652         static CmdLocalSpace msLocalSpaceCmd;
    00653         static CmdIterationInterval msIterationIntervalCmd;
    00654         static CmdNonvisibleTimeout msNonvisibleTimeoutCmd;
    00655
    00656
    00657         AxisAlignedBox mAABB;
    00658         Real mBoundingRadius;
    00659         bool mBoundsAutoUpdate;
    00660         Real mBoundsUpdateTime;
    00661         Real mUpdateRemainTime;
    00662
    00664         AxisAlignedBox mWorldAABB;
    00665
    00667         String mResourceGroupName;
    00669         String mMaterialName;
    00671         bool mIsRendererConfigured;
    00673         MaterialPtr mpMaterial;
    00675         Real mDefaultWidth;
    00677         Real mDefaultHeight;
    00679         Real mSpeedFactor;
    00681         Real mIterationInterval;
    00683         bool mIterationIntervalSet;
    00685         bool mSorted;
    00687         bool mLocalSpace;
    00689         Real mNonvisibleTimeout;
    00691         bool mNonvisibleTimeoutSet;
    00693         Real mTimeSinceLastVisible;
    00695         unsigned long mLastVisibleFrame;
    00697         Controller<Real>* mTimeController;
    00699         bool mEmittedEmitterPoolInitialised;
    00701         bool mIsEmitting;
    00702
    00703         typedef list<Particle*>::type ActiveParticleList;
    00704         typedef list<Particle*>::type FreeParticleList;
    00705         typedef vector<Particle*>::type ParticlePool;
    00706
    00708         struct SortByDirectionFunctor
    00709         {
    00711             Vector3 sortDir;
    00712
    00713             SortByDirectionFunctor(const Vector3& dir);
    00714             float operator()(Particle* p) const;
    00715         };
    00716
    00718         struct SortByDistanceFunctor
    00719         {
    00721             Vector3 sortPos;
    00722
    00723             SortByDistanceFunctor(const Vector3& pos);
    00724             float operator()(Particle* p) const;
    00725         };
    00726
    00727         static RadixSort<ActiveParticleList, Particle*, float> mRadixSorter;
    00728
    00738         ActiveParticleList mActiveParticles;
    00739
    00749         FreeParticleList mFreeParticles;
    00750
    00755         ParticlePool mParticlePool;
    00756
    00757         typedef list<ParticleEmitter*>::type FreeEmittedEmitterList;
    00758         typedef list<ParticleEmitter*>::type ActiveEmittedEmitterList;
    00759         typedef vector<ParticleEmitter*>::type EmittedEmitterList;
    00760         typedef map<String, FreeEmittedEmitterList>::type FreeEmittedEmitterMap;
    00761         typedef map<String, EmittedEmitterList>::type EmittedEmitterPool;
    00762
    00771         EmittedEmitterPool mEmittedEmitterPool;
    00772
    00777         FreeEmittedEmitterMap mFreeEmittedEmitters;
    00778
    00784         ActiveEmittedEmitterList mActiveEmittedEmitters;
    00785
    00786         typedef vector<ParticleEmitter*>::type ParticleEmitterList;
    00787         typedef vector<ParticleAffector*>::type ParticleAffectorList;
    00788
    00790         ParticleEmitterList mEmitters;
    00792         ParticleAffectorList mAffectors;
    00793
    00795         ParticleSystemRenderer* mRenderer;
    00796
    00798         bool mCullIndividual;
    00799
    00801         String mRendererType;
    00802
    00804         size_t mPoolSize;
    00805
    00807         size_t mEmittedEmitterPoolSize;
    00808
    00810         String mOrigin;
    00811
    00813         static Real msDefaultIterationInterval;
    00815         static Real msDefaultNonvisibleTimeout;
    00816
    00818         void _expire(Real timeElapsed);
    00819
    00821         void _triggerEmitters(Real timeElapsed);
    00822
    00825         void _executeTriggerEmitters(ParticleEmitter* emitter, unsigned requested, Real timeElapsed);
    00826
    00828         void _applyMotion(Real timeElapsed);
    00829
    00831         void _triggerAffectors(Real timeElapsed);
    00832
    00834         void _sortParticles(Camera* cam);
    00835
    00837         void increasePool(size_t size);
    00838
    00846         void increaseEmittedEmitterPool(size_t size);
    00847
    00849         void initParameters(void);
    00850
    00852         void configureRenderer(void);
    00853
    00855         void createVisualParticles(size_t poolstart, size_t poolend);
    00857         void destroyVisualParticles(size_t poolstart, size_t poolend);
    00858
    00864         void initialiseEmittedEmitters(void);
    00865
    00869         void initialiseEmittedEmitterPool(void);
    00870
    00872         void addFreeEmittedEmitters(void);
    00873
    00875         void removeAllEmittedEmitters(void);
    00876
    00880         FreeEmittedEmitterList* findFreeEmittedEmitter (const String& name);
    00881
    00887         void removeFromActiveEmittedEmitters (ParticleEmitter* emitter);
    00888
    00893         void addActiveEmittedEmittersToFreeList (void);
    00894
    00903         void _notifyReorganiseEmittedEmitterData (void);
    00904     };
    00908 }
    00909
    00910 #endif

Copyright © 2008 Torus Knot Software Ltd
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
Last modified Sun May 8 2011 20:28:08