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-2005 The OGRE Team 00008 Also see acknowledgements in Readme.html 00009 00010 This program is free software; you can redistribute it and/or modify it under 00011 the terms of the GNU Lesser General Public License as published by the Free Software 00012 Foundation; either version 2 of the License, or (at your option) any later 00013 version. 00014 00015 This program is distributed in the hope that it will be useful, but WITHOUT 00016 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 00017 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. 00018 00019 You should have received a copy of the GNU Lesser General Public License along with 00020 this program; if not, write to the Free Software Foundation, Inc., 59 Temple 00021 Place - Suite 330, Boston, MA 02111-1307, USA, or go to 00022 http://www.gnu.org/copyleft/lesser.txt. 00023 ----------------------------------------------------------------------------- 00024 */ 00025 #ifndef __ParticleSystem_H__ 00026 #define __ParticleSystem_H__ 00027 00028 #include "OgrePrerequisites.h" 00029 00030 #include "OgreVector3.h" 00031 #include "OgreString.h" 00032 #include "OgreParticleIterator.h" 00033 #include "OgreStringInterface.h" 00034 #include "OgreMovableObject.h" 00035 00036 namespace Ogre { 00037 00052 class _OgreExport ParticleSystem : public StringInterface, public MovableObject 00053 { 00054 public: 00055 00057 class _OgrePrivate CmdQuota : public ParamCommand 00058 { 00059 public: 00060 String doGet(const void* target) const; 00061 void doSet(void* target, const String& val); 00062 }; 00064 class _OgrePrivate CmdMaterial : public ParamCommand 00065 { 00066 public: 00067 String doGet(const void* target) const; 00068 void doSet(void* target, const String& val); 00069 }; 00071 class _OgrePrivate CmdCull : public ParamCommand 00072 { 00073 public: 00074 String doGet(const void* target) const; 00075 void doSet(void* target, const String& val); 00076 }; 00078 class _OgrePrivate CmdWidth : public ParamCommand 00079 { 00080 public: 00081 String doGet(const void* target) const; 00082 void doSet(void* target, const String& val); 00083 }; 00085 class _OgrePrivate CmdHeight : public ParamCommand 00086 { 00087 public: 00088 String doGet(const void* target) const; 00089 void doSet(void* target, const String& val); 00090 }; 00092 class _OgrePrivate CmdRenderer : public ParamCommand 00093 { 00094 public: 00095 String doGet(const void* target) const; 00096 void doSet(void* target, const String& val); 00097 }; 00098 00100 ParticleSystem(); 00106 ParticleSystem(const String& name, const String& resourceGroupName); 00107 00108 virtual ~ParticleSystem(); 00109 00119 void setRenderer(const String& typeName); 00120 00122 ParticleSystemRenderer* getRenderer(void) const; 00124 const String& getRendererName(void) const; 00125 00135 ParticleEmitter* addEmitter(const String& emitterType); 00136 00146 ParticleEmitter* getEmitter(unsigned short index) const; 00147 00149 unsigned short getNumEmitters(void) const; 00150 00159 void removeEmitter(unsigned short index); 00160 00162 void removeAllEmitters(void); 00163 00164 00174 ParticleAffector* addAffector(const String& affectorType); 00175 00185 ParticleAffector* getAffector(unsigned short index) const; 00186 00188 unsigned short getNumAffectors(void) const; 00189 00198 void removeAffector(unsigned short index); 00199 00201 void removeAllAffectors(void); 00202 00205 void clear(); 00206 00214 size_t getNumParticles(void) const; 00215 00227 Particle* createParticle(void); 00228 00235 Particle* getParticle(size_t index); 00236 00241 size_t getParticleQuota(void) const; 00242 00253 void setParticleQuota(size_t quota); 00254 00255 00261 ParticleSystem& operator=(const ParticleSystem& rhs); 00262 00269 void _update(Real timeElapsed); 00270 00277 ParticleIterator _getIterator(void); 00278 00283 virtual void setMaterialName(const String& name); 00284 00288 virtual const String& getMaterialName(void) const; 00289 00294 virtual void _notifyCurrentCamera(Camera* cam); 00295 00300 void _notifyAttached(Node* parent, bool isTagPoint = false); 00301 00306 virtual const AxisAlignedBox& getBoundingBox(void) const { return mAABB; } 00307 00312 virtual Real getBoundingRadius(void) const { return mBoundingRadius; } 00313 00318 virtual void _updateRenderQueue(RenderQueue* queue); 00319 00321 const String& getName(void) const { return mName; } 00322 00335 void fastForward(Real time, Real interval = 0.1); 00336 00345 void setSpeedFactor(Real speedFactor) { mSpeedFactor = speedFactor; } 00346 00349 Real getSpeedFactor(void) const { return mSpeedFactor; } 00350 00351 00353 const String& getMovableType(void) const; 00354 00357 virtual void _notifyParticleResized(void); 00358 00361 virtual void _notifyParticleRotated(void); 00362 00373 virtual void setDefaultDimensions(Real width, Real height); 00374 00376 virtual void setDefaultWidth(Real width); 00378 virtual Real getDefaultWidth(void) const; 00380 virtual void setDefaultHeight(Real height); 00382 virtual Real getDefaultHeight(void) const; 00384 virtual bool getCullIndividually(void) const; 00405 virtual void setCullIndividually(bool cullIndividual); 00407 virtual const String& getResourceGroupName(void) const { return mResourceGroupName; } 00414 const String& getOrigin(void) const { return mOrigin; } 00416 void _notifyOrigin(const String& origin) { mOrigin = origin; } 00417 00419 void setRenderQueueGroup(RenderQueueGroupID queueID); 00420 00430 void setBounds(const AxisAlignedBox& aabb); 00431 00448 void setBoundsAutoUpdated(bool autoUpdate, Real stopIn = 0.0f); 00449 00463 void _updateBounds(void); 00464 00465 protected: 00466 00468 static CmdCull msCullCmd; 00469 static CmdHeight msHeightCmd; 00470 static CmdMaterial msMaterialCmd; 00471 static CmdQuota msQuotaCmd; 00472 static CmdWidth msWidthCmd; 00473 static CmdRenderer msRendererCmd; 00474 00475 00476 AxisAlignedBox mAABB; 00477 Real mBoundingRadius; 00478 bool mBoundsAutoUpdate; 00479 Real mBoundsUpdateTime; 00480 00482 AxisAlignedBox mWorldAABB; 00483 00485 String mName; 00487 String mResourceGroupName; 00489 String mMaterialName; 00491 bool mIsRendererConfigured; 00493 MaterialPtr mpMaterial; 00495 Real mDefaultWidth; 00497 Real mDefaultHeight; 00499 Real mSpeedFactor; 00500 00501 typedef std::list<Particle*> ActiveParticleList; 00502 typedef std::deque<Particle*> FreeParticleQueue; 00503 typedef std::vector<Particle*> ParticlePool; 00504 00514 ActiveParticleList mActiveParticles; 00515 00524 FreeParticleQueue mFreeParticles; 00525 00530 ParticlePool mParticlePool; 00531 00532 typedef std::vector<ParticleEmitter*> ParticleEmitterList; 00533 typedef std::vector<ParticleAffector*> ParticleAffectorList; 00534 00536 ParticleEmitterList mEmitters; 00538 ParticleAffectorList mAffectors; 00539 00541 ParticleSystemRenderer* mRenderer; 00542 00544 bool mCullIndividual; 00545 00547 String mRendererType; 00548 00550 size_t mPoolSize; 00551 00553 String mOrigin; 00554 00555 00557 void _expire(Real timeElapsed); 00558 00560 void _triggerEmitters(Real timeElapsed); 00561 00563 void _applyMotion(Real timeElapsed); 00564 00566 void _triggerAffectors(Real timeElapsed); 00567 00569 void increasePool(size_t size); 00570 00572 void initParameters(void); 00573 00575 void configureRenderer(void); 00576 00578 void createVisualParticles(size_t poolstart, size_t poolend); 00580 void destroyVisualParticles(size_t poolstart, size_t poolend); 00581 00582 00583 }; 00584 00585 } 00586 00587 #endif
Copyright © 2000-2005 by The OGRE Team
This work is licensed under a Creative Commons Attribution-ShareAlike 2.5 License.
Last modified Sun Feb 12 12:59:49 2006