# 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
This work is licensed under a Creative Commons Attribution-ShareAlike 2.5 License.
Last modified Sat May 10 16:25:01 2008