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
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
Last modified Fri May 25 23:36:25 2012