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);
00551 
00558         void setSortingEnabled(bool enabled) { mSorted = enabled; }
00560         bool getSortingEnabled(void) const { return mSorted; }
00561 
00571         void setBounds(const AxisAlignedBox& aabb);
00572 
00589         void setBoundsAutoUpdated(bool autoUpdate, Real stopIn = 0.0f);
00590 
00600         void setKeepParticlesInLocalSpace(bool keepLocal);
00601 
00605         bool getKeepParticlesInLocalSpace(void) const { return mLocalSpace; }
00606 
00620         void _updateBounds(void);
00621 
00631         void setEmitting(bool v);
00632 
00638         bool getEmitting() const;
00639 
00641         uint32 getTypeFlags(void) const;
00642     protected:
00643 
00645         static CmdCull msCullCmd;
00646         static CmdHeight msHeightCmd;
00647         static CmdMaterial msMaterialCmd;
00648         static CmdQuota msQuotaCmd;
00649         static CmdEmittedEmitterQuota msEmittedEmitterQuotaCmd;
00650         static CmdWidth msWidthCmd;
00651         static CmdRenderer msRendererCmd;
00652         static CmdSorted msSortedCmd;
00653         static CmdLocalSpace msLocalSpaceCmd;
00654         static CmdIterationInterval msIterationIntervalCmd;
00655         static CmdNonvisibleTimeout msNonvisibleTimeoutCmd;
00656 
00657 
00658         AxisAlignedBox mAABB;
00659         Real mBoundingRadius;
00660         bool mBoundsAutoUpdate;
00661         Real mBoundsUpdateTime;
00662         Real mUpdateRemainTime;
00663 
00665         AxisAlignedBox mWorldAABB;
00666 
00668         String mResourceGroupName;
00670         String mMaterialName;
00672         bool mIsRendererConfigured;
00674         MaterialPtr mMaterial;
00676         Real mDefaultWidth;
00678         Real mDefaultHeight;
00680         Real mSpeedFactor;
00682         Real mIterationInterval;
00684         bool mIterationIntervalSet;
00686         bool mSorted;
00688         bool mLocalSpace;
00690         Real mNonvisibleTimeout;
00692         bool mNonvisibleTimeoutSet;
00694         Real mTimeSinceLastVisible;
00696         unsigned long mLastVisibleFrame;
00698         Controller<Real>* mTimeController;
00700         bool mEmittedEmitterPoolInitialised;
00702         bool mIsEmitting;
00703 
00704         typedef list<Particle*>::type ActiveParticleList;
00705         typedef list<Particle*>::type FreeParticleList;
00706         typedef vector<Particle*>::type ParticlePool;
00707 
00709         struct SortByDirectionFunctor
00710         {
00712             Vector3 sortDir;
00713 
00714             SortByDirectionFunctor(const Vector3& dir);
00715             float operator()(Particle* p) const;
00716         };
00717 
00719         struct SortByDistanceFunctor
00720         {
00722             Vector3 sortPos;
00723 
00724             SortByDistanceFunctor(const Vector3& pos);
00725             float operator()(Particle* p) const;
00726         };
00727 
00728         static RadixSort<ActiveParticleList, Particle*, float> mRadixSorter;
00729 
00739         ActiveParticleList mActiveParticles;
00740 
00750         FreeParticleList mFreeParticles;
00751 
00756         ParticlePool mParticlePool;
00757 
00758         typedef list<ParticleEmitter*>::type FreeEmittedEmitterList;
00759         typedef list<ParticleEmitter*>::type ActiveEmittedEmitterList;
00760         typedef vector<ParticleEmitter*>::type EmittedEmitterList;
00761         typedef map<String, FreeEmittedEmitterList>::type FreeEmittedEmitterMap;
00762         typedef map<String, EmittedEmitterList>::type EmittedEmitterPool;
00763 
00772         EmittedEmitterPool mEmittedEmitterPool;
00773 
00778         FreeEmittedEmitterMap mFreeEmittedEmitters;
00779 
00785         ActiveEmittedEmitterList mActiveEmittedEmitters;
00786 
00787         typedef vector<ParticleEmitter*>::type ParticleEmitterList;
00788         typedef vector<ParticleAffector*>::type ParticleAffectorList;
00789         
00791         ParticleEmitterList mEmitters;
00793         ParticleAffectorList mAffectors;
00794 
00796         ParticleSystemRenderer* mRenderer;
00797 
00799         bool mCullIndividual;
00800 
00802         String mRendererType;
00803         
00805         size_t mPoolSize;
00806 
00808         size_t mEmittedEmitterPoolSize;
00809 
00811         String mOrigin;
00812 
00814         static Real msDefaultIterationInterval;
00816         static Real msDefaultNonvisibleTimeout;
00817 
00819         void _expire(Real timeElapsed);
00820 
00822         void _triggerEmitters(Real timeElapsed);
00823 
00826         void _executeTriggerEmitters(ParticleEmitter* emitter, unsigned requested, Real timeElapsed);
00827 
00829         void _applyMotion(Real timeElapsed);
00830 
00832         void _triggerAffectors(Real timeElapsed);
00833 
00835         void _sortParticles(Camera* cam);
00836 
00838         void increasePool(size_t size);
00839 
00847         void increaseEmittedEmitterPool(size_t size);
00848 
00850         void initParameters(void);
00851 
00853         void configureRenderer(void);
00854 
00856         void createVisualParticles(size_t poolstart, size_t poolend);
00858         void destroyVisualParticles(size_t poolstart, size_t poolend);
00859 
00865         void initialiseEmittedEmitters(void);
00866 
00870         void initialiseEmittedEmitterPool(void);
00871 
00873         void addFreeEmittedEmitters(void);
00874 
00876         void removeAllEmittedEmitters(void);
00877 
00881         FreeEmittedEmitterList* findFreeEmittedEmitter (const String& name);
00882 
00888         void removeFromActiveEmittedEmitters (ParticleEmitter* emitter);
00889 
00894         void addActiveEmittedEmittersToFreeList (void);
00895 
00904         void _notifyReorganiseEmittedEmitterData (void);
00905     };
00909 }
00910 
00911 #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 Fri May 25 23:36:25 2012