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-2011 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 
00313         void setParticleQuota(size_t quota);
00314 
00319         size_t getEmittedEmitterQuota(void) const;
00320 
00326         void setEmittedEmitterQuota(size_t quota);
00327 
00333         ParticleSystem& operator=(const ParticleSystem& rhs);
00334 
00341         void _update(Real timeElapsed);
00342 
00349         ParticleIterator _getIterator(void);
00350 
00355         virtual void setMaterialName( const String& name, const String& groupName = ResourceGroupManager::AUTODETECT_RESOURCE_GROUP_NAME );
00356 
00360         virtual const String& getMaterialName(void) const;
00361 
00366         virtual void _notifyCurrentCamera(Camera* cam);
00367 
00372         void _notifyAttached(Node* parent, bool isTagPoint = false);
00373 
00378         virtual const AxisAlignedBox& getBoundingBox(void) const { return mAABB; }
00379 
00384         virtual Real getBoundingRadius(void) const { return mBoundingRadius; }
00385 
00390         virtual void _updateRenderQueue(RenderQueue* queue);
00391 
00393         void visitRenderables(Renderable::Visitor* visitor, 
00394             bool debugRenderables = false);
00395 
00408         void fastForward(Real time, Real interval = 0.1);
00409 
00418         void setSpeedFactor(Real speedFactor) { mSpeedFactor = speedFactor; }
00419 
00422         Real getSpeedFactor(void) const { return mSpeedFactor; }
00423 
00439         void setIterationInterval(Real iterationInterval);
00440 
00443         Real getIterationInterval(void) const { return mIterationInterval; }
00444 
00447         static void setDefaultIterationInterval(Real iterationInterval) { msDefaultIterationInterval = iterationInterval; }
00448 
00451         static Real getDefaultIterationInterval(void) { return msDefaultIterationInterval; }
00452 
00467         void setNonVisibleUpdateTimeout(Real timeout);
00471         Real getNonVisibleUpdateTimeout(void) const { return mNonvisibleTimeout; }
00472 
00475         static void setDefaultNonVisibleUpdateTimeout(Real timeout) 
00476         { msDefaultNonvisibleTimeout = timeout; }
00477 
00480         static Real getDefaultNonVisibleUpdateTimeout(void) { return msDefaultNonvisibleTimeout; }
00481 
00483         const String& getMovableType(void) const;
00484 
00487         virtual void _notifyParticleResized(void);
00488 
00491         virtual void _notifyParticleRotated(void);
00492 
00503         virtual void setDefaultDimensions(Real width, Real height);
00504 
00506         virtual void setDefaultWidth(Real width);
00508         virtual Real getDefaultWidth(void) const;
00510         virtual void setDefaultHeight(Real height);
00512         virtual Real getDefaultHeight(void) const;
00514         virtual bool getCullIndividually(void) const;
00535         virtual void setCullIndividually(bool cullIndividual);
00537         virtual const String& getResourceGroupName(void) const { return mResourceGroupName; }
00544         const String& getOrigin(void) const { return mOrigin; }
00546         void _notifyOrigin(const String& origin) { mOrigin = origin; }
00547 
00549         void setRenderQueueGroup(uint8 queueID);
00550 
00557         void setSortingEnabled(bool enabled) { mSorted = enabled; }
00559         bool getSortingEnabled(void) const { return mSorted; }
00560 
00570         void setBounds(const AxisAlignedBox& aabb);
00571 
00588         void setBoundsAutoUpdated(bool autoUpdate, Real stopIn = 0.0f);
00589 
00599         void setKeepParticlesInLocalSpace(bool keepLocal);
00600 
00604         bool getKeepParticlesInLocalSpace(void) const { return mLocalSpace; }
00605 
00619         void _updateBounds(void);
00620 
00630         void setEmitting(bool v);
00631 
00637         bool getEmitting() const;
00638 
00640         uint32 getTypeFlags(void) const;
00641     protected:
00642 
00644         static CmdCull msCullCmd;
00645         static CmdHeight msHeightCmd;
00646         static CmdMaterial msMaterialCmd;
00647         static CmdQuota msQuotaCmd;
00648         static CmdEmittedEmitterQuota msEmittedEmitterQuotaCmd;
00649         static CmdWidth msWidthCmd;
00650         static CmdRenderer msRendererCmd;
00651         static CmdSorted msSortedCmd;
00652         static CmdLocalSpace msLocalSpaceCmd;
00653         static CmdIterationInterval msIterationIntervalCmd;
00654         static CmdNonvisibleTimeout msNonvisibleTimeoutCmd;
00655 
00656 
00657         AxisAlignedBox mAABB;
00658         Real mBoundingRadius;
00659         bool mBoundsAutoUpdate;
00660         Real mBoundsUpdateTime;
00661         Real mUpdateRemainTime;
00662 
00664         AxisAlignedBox mWorldAABB;
00665 
00667         String mResourceGroupName;
00669         String mMaterialName;
00671         bool mIsRendererConfigured;
00673         MaterialPtr mpMaterial;
00675         Real mDefaultWidth;
00677         Real mDefaultHeight;
00679         Real mSpeedFactor;
00681         Real mIterationInterval;
00683         bool mIterationIntervalSet;
00685         bool mSorted;
00687         bool mLocalSpace;
00689         Real mNonvisibleTimeout;
00691         bool mNonvisibleTimeoutSet;
00693         Real mTimeSinceLastVisible;
00695         unsigned long mLastVisibleFrame;
00697         Controller<Real>* mTimeController;
00699         bool mEmittedEmitterPoolInitialised;
00701         bool mIsEmitting;
00702 
00703         typedef list<Particle*>::type ActiveParticleList;
00704         typedef list<Particle*>::type FreeParticleList;
00705         typedef vector<Particle*>::type ParticlePool;
00706 
00708         struct SortByDirectionFunctor
00709         {
00711             Vector3 sortDir;
00712 
00713             SortByDirectionFunctor(const Vector3& dir);
00714             float operator()(Particle* p) const;
00715         };
00716 
00718         struct SortByDistanceFunctor
00719         {
00721             Vector3 sortPos;
00722 
00723             SortByDistanceFunctor(const Vector3& pos);
00724             float operator()(Particle* p) const;
00725         };
00726 
00727         static RadixSort<ActiveParticleList, Particle*, float> mRadixSorter;
00728 
00738         ActiveParticleList mActiveParticles;
00739 
00749         FreeParticleList mFreeParticles;
00750 
00755         ParticlePool mParticlePool;
00756 
00757         typedef list<ParticleEmitter*>::type FreeEmittedEmitterList;
00758         typedef list<ParticleEmitter*>::type ActiveEmittedEmitterList;
00759         typedef vector<ParticleEmitter*>::type EmittedEmitterList;
00760         typedef map<String, FreeEmittedEmitterList>::type FreeEmittedEmitterMap;
00761         typedef map<String, EmittedEmitterList>::type EmittedEmitterPool;
00762 
00771         EmittedEmitterPool mEmittedEmitterPool;
00772 
00777         FreeEmittedEmitterMap mFreeEmittedEmitters;
00778 
00784         ActiveEmittedEmitterList mActiveEmittedEmitters;
00785 
00786         typedef vector<ParticleEmitter*>::type ParticleEmitterList;
00787         typedef vector<ParticleAffector*>::type ParticleAffectorList;
00788         
00790         ParticleEmitterList mEmitters;
00792         ParticleAffectorList mAffectors;
00793 
00795         ParticleSystemRenderer* mRenderer;
00796 
00798         bool mCullIndividual;
00799 
00801         String mRendererType;
00802         
00804         size_t mPoolSize;
00805 
00807         size_t mEmittedEmitterPoolSize;
00808 
00810         String mOrigin;
00811 
00813         static Real msDefaultIterationInterval;
00815         static Real msDefaultNonvisibleTimeout;
00816 
00818         void _expire(Real timeElapsed);
00819 
00821         void _triggerEmitters(Real timeElapsed);
00822 
00825         void _executeTriggerEmitters(ParticleEmitter* emitter, unsigned requested, Real timeElapsed);
00826 
00828         void _applyMotion(Real timeElapsed);
00829 
00831         void _triggerAffectors(Real timeElapsed);
00832 
00834         void _sortParticles(Camera* cam);
00835 
00837         void increasePool(size_t size);
00838 
00846         void increaseEmittedEmitterPool(size_t size);
00847 
00849         void initParameters(void);
00850 
00852         void configureRenderer(void);
00853 
00855         void createVisualParticles(size_t poolstart, size_t poolend);
00857         void destroyVisualParticles(size_t poolstart, size_t poolend);
00858 
00864         void initialiseEmittedEmitters(void);
00865 
00869         void initialiseEmittedEmitterPool(void);
00870 
00872         void addFreeEmittedEmitters(void);
00873 
00875         void removeAllEmittedEmitters(void);
00876 
00880         FreeEmittedEmitterList* findFreeEmittedEmitter (const String& name);
00881 
00887         void removeFromActiveEmittedEmitters (ParticleEmitter* emitter);
00888 
00893         void addActiveEmittedEmittersToFreeList (void);
00894 
00903         void _notifyReorganiseEmittedEmitterData (void);
00904     };
00908 }
00909 
00910 #endif

Copyright © 2008 Torus Knot Software Ltd
Creative Commons License
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
Last modified Sat Jan 14 2012 18:40:43