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-2006 Torus Knot Software Ltd
00008 Also see acknowledgements in Readme.html
00009 
00010 This program is free software; you can redistribute it and/or modify it under 
00011 the terms of the GNU Lesser General Public License as published by the Free Software 
00012 Foundation; either version 2 of the License, or (at your option) any later 
00013 version.
00014 
00015 This program is distributed in the hope that it will be useful, but WITHOUT 
00016 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 
00017 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
00018 
00019 You should have received a copy of the GNU Lesser General Public License along with 
00020 this program; if not, write to the Free Software Foundation, Inc., 59 Temple 
00021 Place - Suite 330, Boston, MA 02111-1307, USA, or go to 
00022 http://www.gnu.org/copyleft/lesser.txt.
00023 
00024 You may alternatively use this source under the terms of a specific version of
00025 the OGRE Unrestricted License provided you have obtained such a license from
00026 Torus Knot Software Ltd.
00027 -----------------------------------------------------------------------------
00028 */
00029 #ifndef __ParticleSystem_H__
00030 #define __ParticleSystem_H__
00031 
00032 #include "OgrePrerequisites.h"
00033 
00034 #include "OgreVector3.h"
00035 #include "OgreString.h"
00036 #include "OgreParticleIterator.h"
00037 #include "OgreStringInterface.h"
00038 #include "OgreMovableObject.h"
00039 #include "OgreRadixSort.h"
00040 #include "OgreController.h"
00041 
00042 
00043 namespace Ogre {
00044 
00060     class _OgreExport ParticleSystem : public StringInterface, public MovableObject
00061     {
00062     public:
00063 
00065         class _OgrePrivate CmdQuota : public ParamCommand
00066         {
00067         public:
00068             String doGet(const void* target) const;
00069             void doSet(void* target, const String& val);
00070         };
00072         class _OgrePrivate CmdEmittedEmitterQuota : public ParamCommand
00073         {
00074         public:
00075             String doGet(const void* target) const;
00076             void doSet(void* target, const String& val);
00077         };
00079         class _OgrePrivate CmdMaterial : public ParamCommand
00080         {
00081         public:
00082             String doGet(const void* target) const;
00083             void doSet(void* target, const String& val);
00084         };
00086         class _OgrePrivate CmdCull : public ParamCommand
00087         {
00088         public:
00089             String doGet(const void* target) const;
00090             void doSet(void* target, const String& val);
00091         };
00093         class _OgrePrivate CmdWidth : public ParamCommand
00094         {
00095         public:
00096             String doGet(const void* target) const;
00097             void doSet(void* target, const String& val);
00098         };
00100         class _OgrePrivate CmdHeight : public ParamCommand
00101         {
00102         public:
00103             String doGet(const void* target) const;
00104             void doSet(void* target, const String& val);
00105         };
00107         class _OgrePrivate CmdRenderer : public ParamCommand
00108         {
00109         public:
00110             String doGet(const void* target) const;
00111             void doSet(void* target, const String& val);
00112         };
00114         class CmdSorted : public ParamCommand
00115         {
00116         public:
00117             String doGet(const void* target) const;
00118             void doSet(void* target, const String& val);
00119         };
00121         class CmdLocalSpace : public ParamCommand
00122         {
00123         public:
00124             String doGet(const void* target) const;
00125             void doSet(void* target, const String& val);
00126         };
00128         class CmdIterationInterval : public ParamCommand
00129         {
00130         public:
00131             String doGet(const void* target) const;
00132             void doSet(void* target, const String& val);
00133         };
00135         class CmdNonvisibleTimeout : public ParamCommand
00136         {
00137         public:
00138             String doGet(const void* target) const;
00139             void doSet(void* target, const String& val);
00140         };
00141 
00143         ParticleSystem();
00149         ParticleSystem(const String& name, const String& resourceGroupName);
00150 
00151         virtual ~ParticleSystem();
00152 
00162         void setRenderer(const String& typeName);
00163 
00165         ParticleSystemRenderer* getRenderer(void) const;
00167         const String& getRendererName(void) const;
00168 
00178         ParticleEmitter* addEmitter(const String& emitterType);
00179 
00189         ParticleEmitter* getEmitter(unsigned short index) const;
00190 
00192         unsigned short getNumEmitters(void) const;
00193 
00202         void removeEmitter(unsigned short index);
00203 
00205         void removeAllEmitters(void);
00206 
00207 
00217         ParticleAffector* addAffector(const String& affectorType);
00218 
00228         ParticleAffector* getAffector(unsigned short index) const;
00229 
00231         unsigned short getNumAffectors(void) const;
00232 
00241         void removeAffector(unsigned short index);
00242 
00244         void removeAllAffectors(void);
00245 
00248         void clear();
00249 
00257         size_t getNumParticles(void) const;
00258 
00270         Particle* createParticle(void);
00271 
00281         Particle* createEmitterParticle(const String& emitterName);
00282 
00289         Particle* getParticle(size_t index);
00290 
00295         size_t getParticleQuota(void) const;
00296 
00307         void setParticleQuota(size_t quota);
00308 
00313         size_t getEmittedEmitterQuota(void) const;
00314 
00320         void setEmittedEmitterQuota(size_t quota);
00321 
00327         ParticleSystem& operator=(const ParticleSystem& rhs);
00328 
00335         void _update(Real timeElapsed);
00336 
00343         ParticleIterator _getIterator(void);
00344 
00349         virtual void setMaterialName(const String& name);
00350 
00354         virtual const String& getMaterialName(void) const;
00355 
00360         virtual void _notifyCurrentCamera(Camera* cam);
00361 
00366         void _notifyAttached(Node* parent, bool isTagPoint = false);
00367 
00372         virtual const AxisAlignedBox& getBoundingBox(void) const { return mAABB; }
00373 
00378         virtual Real getBoundingRadius(void) const { return mBoundingRadius; }
00379 
00384         virtual void _updateRenderQueue(RenderQueue* queue);
00385 
00387         void visitRenderables(Renderable::Visitor* visitor, 
00388             bool debugRenderables = false);
00389 
00402         void fastForward(Real time, Real interval = 0.1);
00403 
00412         void setSpeedFactor(Real speedFactor) { mSpeedFactor = speedFactor; }
00413 
00416         Real getSpeedFactor(void) const { return mSpeedFactor; }
00417 
00433         void setIterationInterval(Real iterationInterval);
00434 
00437         Real getIterationInterval(void) const { return mIterationInterval; }
00438 
00441         static void setDefaultIterationInterval(Real iterationInterval) { msDefaultIterationInterval = iterationInterval; }
00442 
00445         static Real getDefaultIterationInterval(void) { return msDefaultIterationInterval; }
00446 
00461         void setNonVisibleUpdateTimeout(Real timeout);
00465         Real getNonVisibleUpdateTimeout(void) const { return mNonvisibleTimeout; }
00466 
00469         static void setDefaultNonVisibleUpdateTimeout(Real timeout) 
00470         { msDefaultNonvisibleTimeout = timeout; }
00471 
00474         static Real getDefaultNonVisibleUpdateTimeout(void) { return msDefaultNonvisibleTimeout; }
00475 
00477         const String& getMovableType(void) const;
00478 
00481         virtual void _notifyParticleResized(void);
00482 
00485         virtual void _notifyParticleRotated(void);
00486 
00497         virtual void setDefaultDimensions(Real width, Real height);
00498 
00500         virtual void setDefaultWidth(Real width);
00502         virtual Real getDefaultWidth(void) const;
00504         virtual void setDefaultHeight(Real height);
00506         virtual Real getDefaultHeight(void) const;
00508         virtual bool getCullIndividually(void) const;
00529         virtual void setCullIndividually(bool cullIndividual);
00531         virtual const String& getResourceGroupName(void) const { return mResourceGroupName; }
00538         const String& getOrigin(void) const { return mOrigin; }
00540         void _notifyOrigin(const String& origin) { mOrigin = origin; }
00541 
00543         void setRenderQueueGroup(uint8 queueID);
00544 
00551         void setSortingEnabled(bool enabled) { mSorted = enabled; }
00553         bool getSortingEnabled(void) const { return mSorted; }
00554 
00564         void setBounds(const AxisAlignedBox& aabb);
00565 
00582         void setBoundsAutoUpdated(bool autoUpdate, Real stopIn = 0.0f);
00583 
00593         void setKeepParticlesInLocalSpace(bool keepLocal);
00594 
00598         bool getKeepParticlesInLocalSpace(void) const { return mLocalSpace; }
00599 
00613         void _updateBounds(void);
00614 
00616         uint32 getTypeFlags(void) const;
00617     protected:
00618 
00620         static CmdCull msCullCmd;
00621         static CmdHeight msHeightCmd;
00622         static CmdMaterial msMaterialCmd;
00623         static CmdQuota msQuotaCmd;
00624         static CmdEmittedEmitterQuota msEmittedEmitterQuotaCmd;
00625         static CmdWidth msWidthCmd;
00626         static CmdRenderer msRendererCmd;
00627         static CmdSorted msSortedCmd;
00628         static CmdLocalSpace msLocalSpaceCmd;
00629         static CmdIterationInterval msIterationIntervalCmd;
00630         static CmdNonvisibleTimeout msNonvisibleTimeoutCmd;
00631 
00632 
00633         AxisAlignedBox mAABB;
00634         Real mBoundingRadius;
00635         bool mBoundsAutoUpdate;
00636         Real mBoundsUpdateTime;
00637         Real mUpdateRemainTime;
00638 
00640         AxisAlignedBox mWorldAABB;
00641 
00643         String mResourceGroupName;
00645         String mMaterialName;
00647         bool mIsRendererConfigured;
00649         MaterialPtr mpMaterial;
00651         Real mDefaultWidth;
00653         Real mDefaultHeight;
00655         Real mSpeedFactor;
00657         Real mIterationInterval;
00659         bool mIterationIntervalSet;
00661         bool mSorted;
00663         bool mLocalSpace;
00665         Real mNonvisibleTimeout;
00667         bool mNonvisibleTimeoutSet;
00669         Real mTimeSinceLastVisible;
00671         unsigned long mLastVisibleFrame;
00673         Controller<Real>* mTimeController;
00675         bool mEmittedEmitterPoolInitialised;
00676 
00677         typedef std::list<Particle*> ActiveParticleList;
00678         typedef std::list<Particle*> FreeParticleList;
00679         typedef std::vector<Particle*> ParticlePool;
00680 
00682         struct SortByDirectionFunctor
00683         {
00685             Vector3 sortDir;
00686 
00687             SortByDirectionFunctor(const Vector3& dir);
00688             float operator()(Particle* p) const;
00689         };
00690 
00692         struct SortByDistanceFunctor
00693         {
00695             Vector3 sortPos;
00696 
00697             SortByDistanceFunctor(const Vector3& pos);
00698             float operator()(Particle* p) const;
00699         };
00700 
00701         static RadixSort<ActiveParticleList, Particle*, float> mRadixSorter;
00702 
00712         ActiveParticleList mActiveParticles;
00713 
00723         FreeParticleList mFreeParticles;
00724 
00729         ParticlePool mParticlePool;
00730 
00731         typedef std::list<ParticleEmitter*> FreeEmittedEmitterList;
00732         typedef std::list<ParticleEmitter*> ActiveEmittedEmitterList;
00733         typedef std::vector<ParticleEmitter*> EmittedEmitterList;
00734         typedef std::map<String, FreeEmittedEmitterList> FreeEmittedEmitterMap;
00735         typedef std::map<String, EmittedEmitterList> EmittedEmitterPool;
00736 
00745         EmittedEmitterPool mEmittedEmitterPool;
00746 
00751         FreeEmittedEmitterMap mFreeEmittedEmitters;
00752 
00758         ActiveEmittedEmitterList mActiveEmittedEmitters;
00759 
00760         typedef std::vector<ParticleEmitter*> ParticleEmitterList;
00761         typedef std::vector<ParticleAffector*> ParticleAffectorList;
00762         
00764         ParticleEmitterList mEmitters;
00766         ParticleAffectorList mAffectors;
00767 
00769         ParticleSystemRenderer* mRenderer;
00770 
00772         bool mCullIndividual;
00773 
00775         String mRendererType;
00776         
00778         size_t mPoolSize;
00779 
00781         size_t mEmittedEmitterPoolSize;
00782 
00784         String mOrigin;
00785 
00787         static Real msDefaultIterationInterval;
00789         static Real msDefaultNonvisibleTimeout;
00790 
00792         void _expire(Real timeElapsed);
00793 
00795         void _triggerEmitters(Real timeElapsed);
00796 
00799         void _executeTriggerEmitters(ParticleEmitter* emitter, unsigned requested, Real timeElapsed);
00800 
00802         void _applyMotion(Real timeElapsed);
00803 
00805         void _triggerAffectors(Real timeElapsed);
00806 
00808         void _sortParticles(Camera* cam);
00809 
00811         void increasePool(size_t size);
00812 
00820         void increaseEmittedEmitterPool(size_t size);
00821 
00823         void initParameters(void);
00824 
00826         void configureRenderer(void);
00827 
00829         void createVisualParticles(size_t poolstart, size_t poolend);
00831         void destroyVisualParticles(size_t poolstart, size_t poolend);
00832 
00838         void initialiseEmittedEmitters(void);
00839 
00843         void initialiseEmittedEmitterPool(void);
00844 
00846         void addFreeEmittedEmitters(void);
00847 
00849         void removeAllEmittedEmitters(void);
00850 
00854         FreeEmittedEmitterList* findFreeEmittedEmitter (const String& name);
00855 
00861         void removeFromActiveEmittedEmitters (ParticleEmitter* emitter);
00862 
00867         void addActiveEmittedEmittersToFreeList (void);
00868 
00877         void _notifyReorganiseEmittedEmitterData (void);
00878     };
00879 
00880 }
00881 
00882 #endif

Copyright © 2008 Torus Knot Software Ltd
Creative Commons License
This work is licensed under a Creative Commons Attribution-ShareAlike 2.5 License.
Last modified Sun Sep 27 22:02:24 2009