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

This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
Last modified Mon Jul 27 2020 13:40:44