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-2013 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 #include "OgreHeaderPrefix.h"
00042 
00043 
00044 namespace Ogre {
00045 
00067     class _OgreExport ParticleSystem : public StringInterface, public MovableObject
00068     {
00069     public:
00070 
00072         class _OgrePrivate CmdQuota : public ParamCommand
00073         {
00074         public:
00075             String doGet(const void* target) const;
00076             void doSet(void* target, const String& val);
00077         };
00079         class _OgrePrivate CmdEmittedEmitterQuota : public ParamCommand
00080         {
00081         public:
00082             String doGet(const void* target) const;
00083             void doSet(void* target, const String& val);
00084         };
00086         class _OgrePrivate CmdMaterial : public ParamCommand
00087         {
00088         public:
00089             String doGet(const void* target) const;
00090             void doSet(void* target, const String& val);
00091         };
00093         class _OgrePrivate CmdCull : public ParamCommand
00094         {
00095         public:
00096             String doGet(const void* target) const;
00097             void doSet(void* target, const String& val);
00098         };
00100         class _OgrePrivate CmdWidth : public ParamCommand
00101         {
00102         public:
00103             String doGet(const void* target) const;
00104             void doSet(void* target, const String& val);
00105         };
00107         class _OgrePrivate CmdHeight : public ParamCommand
00108         {
00109         public:
00110             String doGet(const void* target) const;
00111             void doSet(void* target, const String& val);
00112         };
00114         class _OgrePrivate CmdRenderer : public ParamCommand
00115         {
00116         public:
00117             String doGet(const void* target) const;
00118             void doSet(void* target, const String& val);
00119         };
00121         class CmdSorted : public ParamCommand
00122         {
00123         public:
00124             String doGet(const void* target) const;
00125             void doSet(void* target, const String& val);
00126         };
00128         class CmdLocalSpace : public ParamCommand
00129         {
00130         public:
00131             String doGet(const void* target) const;
00132             void doSet(void* target, const String& val);
00133         };
00135         class CmdIterationInterval : public ParamCommand
00136         {
00137         public:
00138             String doGet(const void* target) const;
00139             void doSet(void* target, const String& val);
00140         };
00142         class CmdNonvisibleTimeout : public ParamCommand
00143         {
00144         public:
00145             String doGet(const void* target) const;
00146             void doSet(void* target, const String& val);
00147         };
00148 
00150         ParticleSystem();
00156         ParticleSystem(const String& name, const String& resourceGroupName);
00157 
00158         virtual ~ParticleSystem();
00159 
00169         void setRenderer(const String& typeName);
00170 
00172         ParticleSystemRenderer* getRenderer(void) const;
00174         const String& getRendererName(void) const;
00175 
00185         ParticleEmitter* addEmitter(const String& emitterType);
00186 
00196         ParticleEmitter* getEmitter(unsigned short index) const;
00197 
00199         unsigned short getNumEmitters(void) const;
00200 
00209         void removeEmitter(unsigned short index);
00210 
00212         void removeAllEmitters(void);
00213 
00214 
00224         ParticleAffector* addAffector(const String& affectorType);
00225 
00235         ParticleAffector* getAffector(unsigned short index) const;
00236 
00238         unsigned short getNumAffectors(void) const;
00239 
00248         void removeAffector(unsigned short index);
00249 
00251         void removeAllAffectors(void);
00252 
00255         void clear();
00256 
00264         size_t getNumParticles(void) const;
00265 
00277         Particle* createParticle(void);
00278 
00288         Particle* createEmitterParticle(const String& emitterName);
00289 
00296         Particle* getParticle(size_t index);
00297 
00302         size_t getParticleQuota(void) const;
00303 
00315         void setParticleQuota(size_t quota);
00316 
00321         size_t getEmittedEmitterQuota(void) const;
00322 
00328         void setEmittedEmitterQuota(size_t quota);
00329 
00335         ParticleSystem& operator=(const ParticleSystem& rhs);
00336 
00343         void _update(Real timeElapsed);
00344 
00351         ParticleIterator _getIterator(void);
00352 
00357         virtual void setMaterialName( const String& name, const String& groupName = ResourceGroupManager::AUTODETECT_RESOURCE_GROUP_NAME );
00358 
00362         virtual const String& getMaterialName(void) const;
00363 
00368         virtual void _notifyCurrentCamera(Camera* cam);
00369 
00374         void _notifyAttached(Node* parent, bool isTagPoint = false);
00375 
00380         virtual const AxisAlignedBox& getBoundingBox(void) const { return mAABB; }
00381 
00386         virtual Real getBoundingRadius(void) const { return mBoundingRadius; }
00387 
00392         virtual void _updateRenderQueue(RenderQueue* queue);
00393 
00395         void visitRenderables(Renderable::Visitor* visitor, 
00396             bool debugRenderables = false);
00397 
00410         void fastForward(Real time, Real interval = 0.1);
00411 
00420         void setSpeedFactor(Real speedFactor) { mSpeedFactor = speedFactor; }
00421 
00424         Real getSpeedFactor(void) const { return mSpeedFactor; }
00425 
00441         void setIterationInterval(Real iterationInterval);
00442 
00445         Real getIterationInterval(void) const { return mIterationInterval; }
00446 
00449         static void setDefaultIterationInterval(Real iterationInterval) { msDefaultIterationInterval = iterationInterval; }
00450 
00453         static Real getDefaultIterationInterval(void) { return msDefaultIterationInterval; }
00454 
00469         void setNonVisibleUpdateTimeout(Real timeout);
00473         Real getNonVisibleUpdateTimeout(void) const { return mNonvisibleTimeout; }
00474 
00477         static void setDefaultNonVisibleUpdateTimeout(Real timeout) 
00478         { msDefaultNonvisibleTimeout = timeout; }
00479 
00482         static Real getDefaultNonVisibleUpdateTimeout(void) { return msDefaultNonvisibleTimeout; }
00483 
00485         const String& getMovableType(void) const;
00486 
00489         virtual void _notifyParticleResized(void);
00490 
00493         virtual void _notifyParticleRotated(void);
00494 
00505         virtual void setDefaultDimensions(Real width, Real height);
00506 
00508         virtual void setDefaultWidth(Real width);
00510         virtual Real getDefaultWidth(void) const;
00512         virtual void setDefaultHeight(Real height);
00514         virtual Real getDefaultHeight(void) const;
00516         virtual bool getCullIndividually(void) const;
00537         virtual void setCullIndividually(bool cullIndividual);
00539         virtual const String& getResourceGroupName(void) const { return mResourceGroupName; }
00546         const String& getOrigin(void) const { return mOrigin; }
00548         void _notifyOrigin(const String& origin) { mOrigin = origin; }
00549 
00551         void setRenderQueueGroup(uint8 queueID);
00553         void setRenderQueueGroupAndPriority(uint8 queueID, ushort priority);
00554 
00561         void setSortingEnabled(bool enabled) { mSorted = enabled; }
00563         bool getSortingEnabled(void) const { return mSorted; }
00564 
00574         void setBounds(const AxisAlignedBox& aabb);
00575 
00592         void setBoundsAutoUpdated(bool autoUpdate, Real stopIn = 0.0f);
00593 
00603         void setKeepParticlesInLocalSpace(bool keepLocal);
00604 
00608         bool getKeepParticlesInLocalSpace(void) const { return mLocalSpace; }
00609 
00623         void _updateBounds(void);
00624 
00634         void setEmitting(bool v);
00635 
00641         bool getEmitting() const;
00642 
00644         uint32 getTypeFlags(void) const;
00645     protected:
00646 
00648         static CmdCull msCullCmd;
00649         static CmdHeight msHeightCmd;
00650         static CmdMaterial msMaterialCmd;
00651         static CmdQuota msQuotaCmd;
00652         static CmdEmittedEmitterQuota msEmittedEmitterQuotaCmd;
00653         static CmdWidth msWidthCmd;
00654         static CmdRenderer msRendererCmd;
00655         static CmdSorted msSortedCmd;
00656         static CmdLocalSpace msLocalSpaceCmd;
00657         static CmdIterationInterval msIterationIntervalCmd;
00658         static CmdNonvisibleTimeout msNonvisibleTimeoutCmd;
00659 
00660 
00661         AxisAlignedBox mAABB;
00662         Real mBoundingRadius;
00663         bool mBoundsAutoUpdate;
00664         Real mBoundsUpdateTime;
00665         Real mUpdateRemainTime;
00666 
00668         AxisAlignedBox mWorldAABB;
00669 
00671         String mResourceGroupName;
00673         String mMaterialName;
00675         bool mIsRendererConfigured;
00677         MaterialPtr mMaterial;
00679         Real mDefaultWidth;
00681         Real mDefaultHeight;
00683         Real mSpeedFactor;
00685         Real mIterationInterval;
00687         bool mIterationIntervalSet;
00689         bool mSorted;
00691         bool mLocalSpace;
00693         Real mNonvisibleTimeout;
00695         bool mNonvisibleTimeoutSet;
00697         Real mTimeSinceLastVisible;
00699         unsigned long mLastVisibleFrame;
00701         Controller<Real>* mTimeController;
00703         bool mEmittedEmitterPoolInitialised;
00705         bool mIsEmitting;
00706 
00707         typedef list<Particle*>::type ActiveParticleList;
00708         typedef list<Particle*>::type FreeParticleList;
00709         typedef vector<Particle*>::type ParticlePool;
00710 
00712         struct SortByDirectionFunctor
00713         {
00715             Vector3 sortDir;
00716 
00717             SortByDirectionFunctor(const Vector3& dir);
00718             float operator()(Particle* p) const;
00719         };
00720 
00722         struct SortByDistanceFunctor
00723         {
00725             Vector3 sortPos;
00726 
00727             SortByDistanceFunctor(const Vector3& pos);
00728             float operator()(Particle* p) const;
00729         };
00730 
00731         static RadixSort<ActiveParticleList, Particle*, float> mRadixSorter;
00732 
00742         ActiveParticleList mActiveParticles;
00743 
00753         FreeParticleList mFreeParticles;
00754 
00759         ParticlePool mParticlePool;
00760 
00761         typedef list<ParticleEmitter*>::type FreeEmittedEmitterList;
00762         typedef list<ParticleEmitter*>::type ActiveEmittedEmitterList;
00763         typedef vector<ParticleEmitter*>::type EmittedEmitterList;
00764         typedef map<String, FreeEmittedEmitterList>::type FreeEmittedEmitterMap;
00765         typedef map<String, EmittedEmitterList>::type EmittedEmitterPool;
00766 
00775         EmittedEmitterPool mEmittedEmitterPool;
00776 
00781         FreeEmittedEmitterMap mFreeEmittedEmitters;
00782 
00788         ActiveEmittedEmitterList mActiveEmittedEmitters;
00789 
00790         typedef vector<ParticleEmitter*>::type ParticleEmitterList;
00791         typedef vector<ParticleAffector*>::type ParticleAffectorList;
00792         
00794         ParticleEmitterList mEmitters;
00796         ParticleAffectorList mAffectors;
00797 
00799         ParticleSystemRenderer* mRenderer;
00800 
00802         bool mCullIndividual;
00803 
00805         String mRendererType;
00806         
00808         size_t mPoolSize;
00809 
00811         size_t mEmittedEmitterPoolSize;
00812 
00814         String mOrigin;
00815 
00817         static Real msDefaultIterationInterval;
00819         static Real msDefaultNonvisibleTimeout;
00820 
00822         void _expire(Real timeElapsed);
00823 
00825         void _triggerEmitters(Real timeElapsed);
00826 
00829         void _executeTriggerEmitters(ParticleEmitter* emitter, unsigned requested, Real timeElapsed);
00830 
00832         void _applyMotion(Real timeElapsed);
00833 
00835         void _triggerAffectors(Real timeElapsed);
00836 
00838         void _sortParticles(Camera* cam);
00839 
00841         void increasePool(size_t size);
00842 
00850         void increaseEmittedEmitterPool(size_t size);
00851 
00853         void initParameters(void);
00854 
00856         void configureRenderer(void);
00857 
00859         void createVisualParticles(size_t poolstart, size_t poolend);
00861         void destroyVisualParticles(size_t poolstart, size_t poolend);
00862 
00868         void initialiseEmittedEmitters(void);
00869 
00873         void initialiseEmittedEmitterPool(void);
00874 
00876         void addFreeEmittedEmitters(void);
00877 
00879         void removeAllEmittedEmitters(void);
00880 
00884         FreeEmittedEmitterList* findFreeEmittedEmitter (const String& name);
00885 
00891         void removeFromActiveEmittedEmitters (ParticleEmitter* emitter);
00892 
00897         void addActiveEmittedEmittersToFreeList (void);
00898 
00907         void _notifyReorganiseEmittedEmitterData (void);
00908     };
00912 }
00913 
00914 #include "OgreHeaderSuffix.h"
00915 
00916 #endif

Copyright © 2012 Torus Knot Software Ltd
Creative Commons License
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
Last modified Mon Jul 27 2020 13:40:44