Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

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 
00398         void fastForward(Real time, Real interval = 0.1);
00399 
00408         void setSpeedFactor(Real speedFactor) { mSpeedFactor = speedFactor; }
00409 
00412         Real getSpeedFactor(void) const { return mSpeedFactor; }
00413 
00429         void setIterationInterval(Real iterationInterval);
00430 
00433         Real getIterationInterval(void) const { return mIterationInterval; }
00434 
00437         static void setDefaultIterationInterval(Real iterationInterval) { msDefaultIterationInterval = iterationInterval; }
00438 
00441         static Real getDefaultIterationInterval(void) { return msDefaultIterationInterval; }
00442 
00457         void setNonVisibleUpdateTimeout(Real timeout);
00461         Real getNonVisibleUpdateTimeout(void) const { return mNonvisibleTimeout; }
00462 
00465         static void setDefaultNonVisibleUpdateTimeout(Real timeout) 
00466         { msDefaultNonvisibleTimeout = timeout; }
00467 
00470         static Real getDefaultNonVisibleUpdateTimeout(void) { return msDefaultNonvisibleTimeout; }
00471 
00473         const String& getMovableType(void) const;
00474 
00477         virtual void _notifyParticleResized(void);
00478 
00481         virtual void _notifyParticleRotated(void);
00482 
00493         virtual void setDefaultDimensions(Real width, Real height);
00494 
00496         virtual void setDefaultWidth(Real width);
00498         virtual Real getDefaultWidth(void) const;
00500         virtual void setDefaultHeight(Real height);
00502         virtual Real getDefaultHeight(void) const;
00504         virtual bool getCullIndividually(void) const;
00525         virtual void setCullIndividually(bool cullIndividual);
00527         virtual const String& getResourceGroupName(void) const { return mResourceGroupName; }
00534         const String& getOrigin(void) const { return mOrigin; }
00536         void _notifyOrigin(const String& origin) { mOrigin = origin; }
00537 
00539         void setRenderQueueGroup(uint8 queueID);
00540 
00547         void setSortingEnabled(bool enabled) { mSorted = enabled; }
00549         bool getSortingEnabled(void) const { return mSorted; }
00550 
00560         void setBounds(const AxisAlignedBox& aabb);
00561 
00578         void setBoundsAutoUpdated(bool autoUpdate, Real stopIn = 0.0f);
00579 
00589         void setKeepParticlesInLocalSpace(bool keepLocal);
00590 
00594         bool getKeepParticlesInLocalSpace(void) const { return mLocalSpace; }
00595 
00609         void _updateBounds(void);
00610 
00612         uint32 getTypeFlags(void) const;
00613     protected:
00614 
00616         static CmdCull msCullCmd;
00617         static CmdHeight msHeightCmd;
00618         static CmdMaterial msMaterialCmd;
00619         static CmdQuota msQuotaCmd;
00620         static CmdEmittedEmitterQuota msEmittedEmitterQuotaCmd;
00621         static CmdWidth msWidthCmd;
00622         static CmdRenderer msRendererCmd;
00623         static CmdSorted msSortedCmd;
00624         static CmdLocalSpace msLocalSpaceCmd;
00625         static CmdIterationInterval msIterationIntervalCmd;
00626         static CmdNonvisibleTimeout msNonvisibleTimeoutCmd;
00627 
00628 
00629         AxisAlignedBox mAABB;
00630         Real mBoundingRadius;
00631         bool mBoundsAutoUpdate;
00632         Real mBoundsUpdateTime;
00633         Real mUpdateRemainTime;
00634 
00636         AxisAlignedBox mWorldAABB;
00637 
00639         String mResourceGroupName;
00641         String mMaterialName;
00643         bool mIsRendererConfigured;
00645         MaterialPtr mpMaterial;
00647         Real mDefaultWidth;
00649         Real mDefaultHeight;
00651         Real mSpeedFactor;
00653         Real mIterationInterval;
00655         bool mIterationIntervalSet;
00657         bool mSorted;
00659         bool mLocalSpace;
00661         Real mNonvisibleTimeout;
00663         bool mNonvisibleTimeoutSet;
00665         Real mTimeSinceLastVisible;
00667         unsigned long mLastVisibleFrame;
00669         Controller<Real>* mTimeController;
00671         bool mEmittedEmitterPoolInitialised;
00672 
00673         typedef std::list<Particle*> ActiveParticleList;
00674         typedef std::list<Particle*> FreeParticleList;
00675         typedef std::vector<Particle*> ParticlePool;
00676 
00678         struct SortByDirectionFunctor
00679         {
00681             Vector3 sortDir;
00682 
00683             SortByDirectionFunctor(const Vector3& dir);
00684             float operator()(Particle* p) const;
00685         };
00686 
00688         struct SortByDistanceFunctor
00689         {
00691             Vector3 sortPos;
00692 
00693             SortByDistanceFunctor(const Vector3& pos);
00694             float operator()(Particle* p) const;
00695         };
00696 
00697         static RadixSort<ActiveParticleList, Particle*, float> mRadixSorter;
00698 
00708         ActiveParticleList mActiveParticles;
00709 
00719         FreeParticleList mFreeParticles;
00720 
00725         ParticlePool mParticlePool;
00726 
00727         typedef std::list<ParticleEmitter*> FreeEmittedEmitterList;
00728         typedef std::list<ParticleEmitter*> ActiveEmittedEmitterList;
00729         typedef std::vector<ParticleEmitter*> EmittedEmitterList;
00730         typedef std::map<String, FreeEmittedEmitterList> FreeEmittedEmitterMap;
00731         typedef std::map<String, EmittedEmitterList> EmittedEmitterPool;
00732 
00741         EmittedEmitterPool mEmittedEmitterPool;
00742 
00747         FreeEmittedEmitterMap mFreeEmittedEmitters;
00748 
00754         ActiveEmittedEmitterList mActiveEmittedEmitters;
00755 
00756         typedef std::vector<ParticleEmitter*> ParticleEmitterList;
00757         typedef std::vector<ParticleAffector*> ParticleAffectorList;
00758         
00760         ParticleEmitterList mEmitters;
00762         ParticleAffectorList mAffectors;
00763 
00765         ParticleSystemRenderer* mRenderer;
00766 
00768         bool mCullIndividual;
00769 
00771         String mRendererType;
00772         
00774         size_t mPoolSize;
00775 
00777         size_t mEmittedEmitterPoolSize;
00778 
00780         String mOrigin;
00781 
00783         static Real msDefaultIterationInterval;
00785         static Real msDefaultNonvisibleTimeout;
00786 
00788         void _expire(Real timeElapsed);
00789 
00791         void _triggerEmitters(Real timeElapsed);
00792 
00795         void _executeTriggerEmitters(ParticleEmitter* emitter, unsigned requested, Real timeElapsed);
00796 
00798         void _applyMotion(Real timeElapsed);
00799 
00801         void _triggerAffectors(Real timeElapsed);
00802 
00804         void _sortParticles(Camera* cam);
00805 
00807         void increasePool(size_t size);
00808 
00816         void increaseEmittedEmitterPool(size_t size);
00817 
00819         void initParameters(void);
00820 
00822         void configureRenderer(void);
00823 
00825         void createVisualParticles(size_t poolstart, size_t poolend);
00827         void destroyVisualParticles(size_t poolstart, size_t poolend);
00828 
00834         void initialiseEmittedEmitters(void);
00835 
00839         void initialiseEmittedEmitterPool(void);
00840 
00842         void addFreeEmittedEmitters(void);
00843 
00845         void removeAllEmittedEmitters(void);
00846 
00850         FreeEmittedEmitterList* findFreeEmittedEmitter (const String& name);
00851 
00857         void removeFromActiveEmittedEmitters (ParticleEmitter* emitter);
00858 
00863         void addActiveEmittedEmittersToFreeList (void);
00864 
00873         void _notifyReorganiseEmittedEmitterData (void);
00874     };
00875 
00876 }
00877 
00878 #endif

Copyright © 2000-2005 by The OGRE Team
Creative Commons License
This work is licensed under a Creative Commons Attribution-ShareAlike 2.5 License.
Last modified Thu Mar 6 09:46:26 2008