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-2012 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 
00314         void setParticleQuota(size_t quota);
00315 
00320         size_t getEmittedEmitterQuota(void) const;
00321 
00327         void setEmittedEmitterQuota(size_t quota);
00328 
00334         ParticleSystem& operator=(const ParticleSystem& rhs);
00335 
00342         void _update(Real timeElapsed);
00343 
00350         ParticleIterator _getIterator(void);
00351 
00356         virtual void setMaterialName( const String& name, const String& groupName = ResourceGroupManager::AUTODETECT_RESOURCE_GROUP_NAME );
00357 
00361         virtual const String& getMaterialName(void) const;
00362 
00367         virtual void _notifyCurrentCamera(Camera* cam);
00368 
00373         void _notifyAttached(Node* parent, bool isTagPoint = false);
00374 
00379         virtual const AxisAlignedBox& getBoundingBox(void) const { return mAABB; }
00380 
00385         virtual Real getBoundingRadius(void) const { return mBoundingRadius; }
00386 
00391         virtual void _updateRenderQueue(RenderQueue* queue);
00392 
00394         void visitRenderables(Renderable::Visitor* visitor, 
00395             bool debugRenderables = false);
00396 
00409         void fastForward(Real time, Real interval = 0.1);
00410 
00419         void setSpeedFactor(Real speedFactor) { mSpeedFactor = speedFactor; }
00420 
00423         Real getSpeedFactor(void) const { return mSpeedFactor; }
00424 
00440         void setIterationInterval(Real iterationInterval);
00441 
00444         Real getIterationInterval(void) const { return mIterationInterval; }
00445 
00448         static void setDefaultIterationInterval(Real iterationInterval) { msDefaultIterationInterval = iterationInterval; }
00449 
00452         static Real getDefaultIterationInterval(void) { return msDefaultIterationInterval; }
00453 
00468         void setNonVisibleUpdateTimeout(Real timeout);
00472         Real getNonVisibleUpdateTimeout(void) const { return mNonvisibleTimeout; }
00473 
00476         static void setDefaultNonVisibleUpdateTimeout(Real timeout) 
00477         { msDefaultNonvisibleTimeout = timeout; }
00478 
00481         static Real getDefaultNonVisibleUpdateTimeout(void) { return msDefaultNonvisibleTimeout; }
00482 
00484         const String& getMovableType(void) const;
00485 
00488         virtual void _notifyParticleResized(void);
00489 
00492         virtual void _notifyParticleRotated(void);
00493 
00504         virtual void setDefaultDimensions(Real width, Real height);
00505 
00507         virtual void setDefaultWidth(Real width);
00509         virtual Real getDefaultWidth(void) const;
00511         virtual void setDefaultHeight(Real height);
00513         virtual Real getDefaultHeight(void) const;
00515         virtual bool getCullIndividually(void) const;
00536         virtual void setCullIndividually(bool cullIndividual);
00538         virtual const String& getResourceGroupName(void) const { return mResourceGroupName; }
00545         const String& getOrigin(void) const { return mOrigin; }
00547         void _notifyOrigin(const String& origin) { mOrigin = origin; }
00548 
00550         void setRenderQueueGroup(uint8 queueID);
00552         void setRenderQueueGroupAndPriority(uint8 queueID, ushort priority);
00553 
00560         void setSortingEnabled(bool enabled) { mSorted = enabled; }
00562         bool getSortingEnabled(void) const { return mSorted; }
00563 
00573         void setBounds(const AxisAlignedBox& aabb);
00574 
00591         void setBoundsAutoUpdated(bool autoUpdate, Real stopIn = 0.0f);
00592 
00602         void setKeepParticlesInLocalSpace(bool keepLocal);
00603 
00607         bool getKeepParticlesInLocalSpace(void) const { return mLocalSpace; }
00608 
00622         void _updateBounds(void);
00623 
00633         void setEmitting(bool v);
00634 
00640         bool getEmitting() const;
00641 
00643         uint32 getTypeFlags(void) const;
00644     protected:
00645 
00647         static CmdCull msCullCmd;
00648         static CmdHeight msHeightCmd;
00649         static CmdMaterial msMaterialCmd;
00650         static CmdQuota msQuotaCmd;
00651         static CmdEmittedEmitterQuota msEmittedEmitterQuotaCmd;
00652         static CmdWidth msWidthCmd;
00653         static CmdRenderer msRendererCmd;
00654         static CmdSorted msSortedCmd;
00655         static CmdLocalSpace msLocalSpaceCmd;
00656         static CmdIterationInterval msIterationIntervalCmd;
00657         static CmdNonvisibleTimeout msNonvisibleTimeoutCmd;
00658 
00659 
00660         AxisAlignedBox mAABB;
00661         Real mBoundingRadius;
00662         bool mBoundsAutoUpdate;
00663         Real mBoundsUpdateTime;
00664         Real mUpdateRemainTime;
00665 
00667         AxisAlignedBox mWorldAABB;
00668 
00670         String mResourceGroupName;
00672         String mMaterialName;
00674         bool mIsRendererConfigured;
00676         MaterialPtr mMaterial;
00678         Real mDefaultWidth;
00680         Real mDefaultHeight;
00682         Real mSpeedFactor;
00684         Real mIterationInterval;
00686         bool mIterationIntervalSet;
00688         bool mSorted;
00690         bool mLocalSpace;
00692         Real mNonvisibleTimeout;
00694         bool mNonvisibleTimeoutSet;
00696         Real mTimeSinceLastVisible;
00698         unsigned long mLastVisibleFrame;
00700         Controller<Real>* mTimeController;
00702         bool mEmittedEmitterPoolInitialised;
00704         bool mIsEmitting;
00705 
00706         typedef list<Particle*>::type ActiveParticleList;
00707         typedef list<Particle*>::type FreeParticleList;
00708         typedef vector<Particle*>::type ParticlePool;
00709 
00711         struct SortByDirectionFunctor
00712         {
00714             Vector3 sortDir;
00715 
00716             SortByDirectionFunctor(const Vector3& dir);
00717             float operator()(Particle* p) const;
00718         };
00719 
00721         struct SortByDistanceFunctor
00722         {
00724             Vector3 sortPos;
00725 
00726             SortByDistanceFunctor(const Vector3& pos);
00727             float operator()(Particle* p) const;
00728         };
00729 
00730         static RadixSort<ActiveParticleList, Particle*, float> mRadixSorter;
00731 
00741         ActiveParticleList mActiveParticles;
00742 
00752         FreeParticleList mFreeParticles;
00753 
00758         ParticlePool mParticlePool;
00759 
00760         typedef list<ParticleEmitter*>::type FreeEmittedEmitterList;
00761         typedef list<ParticleEmitter*>::type ActiveEmittedEmitterList;
00762         typedef vector<ParticleEmitter*>::type EmittedEmitterList;
00763         typedef map<String, FreeEmittedEmitterList>::type FreeEmittedEmitterMap;
00764         typedef map<String, EmittedEmitterList>::type EmittedEmitterPool;
00765 
00774         EmittedEmitterPool mEmittedEmitterPool;
00775 
00780         FreeEmittedEmitterMap mFreeEmittedEmitters;
00781 
00787         ActiveEmittedEmitterList mActiveEmittedEmitters;
00788 
00789         typedef vector<ParticleEmitter*>::type ParticleEmitterList;
00790         typedef vector<ParticleAffector*>::type ParticleAffectorList;
00791         
00793         ParticleEmitterList mEmitters;
00795         ParticleAffectorList mAffectors;
00796 
00798         ParticleSystemRenderer* mRenderer;
00799 
00801         bool mCullIndividual;
00802 
00804         String mRendererType;
00805         
00807         size_t mPoolSize;
00808 
00810         size_t mEmittedEmitterPoolSize;
00811 
00813         String mOrigin;
00814 
00816         static Real msDefaultIterationInterval;
00818         static Real msDefaultNonvisibleTimeout;
00819 
00821         void _expire(Real timeElapsed);
00822 
00824         void _triggerEmitters(Real timeElapsed);
00825 
00828         void _executeTriggerEmitters(ParticleEmitter* emitter, unsigned requested, Real timeElapsed);
00829 
00831         void _applyMotion(Real timeElapsed);
00832 
00834         void _triggerAffectors(Real timeElapsed);
00835 
00837         void _sortParticles(Camera* cam);
00838 
00840         void increasePool(size_t size);
00841 
00849         void increaseEmittedEmitterPool(size_t size);
00850 
00852         void initParameters(void);
00853 
00855         void configureRenderer(void);
00856 
00858         void createVisualParticles(size_t poolstart, size_t poolend);
00860         void destroyVisualParticles(size_t poolstart, size_t poolend);
00861 
00867         void initialiseEmittedEmitters(void);
00868 
00872         void initialiseEmittedEmitterPool(void);
00873 
00875         void addFreeEmittedEmitters(void);
00876 
00878         void removeAllEmittedEmitters(void);
00879 
00883         FreeEmittedEmitterList* findFreeEmittedEmitter (const String& name);
00884 
00890         void removeFromActiveEmittedEmitters (ParticleEmitter* emitter);
00891 
00896         void addActiveEmittedEmittersToFreeList (void);
00897 
00906         void _notifyReorganiseEmittedEmitterData (void);
00907     };
00911 }
00912 
00913 #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 Sun Sep 2 2012 07:27:22