1 // Copyright (C) 2002-2012 Nikolaus Gebhardt 2 // This file is part of the "Irrlicht Engine". 3 // For conditions of distribution and use, see copyright notice in irrlicht.h 4 5 #ifndef __I_PARTICLE_SYSTEM_SCENE_NODE_H_INCLUDED__ 6 #define __I_PARTICLE_SYSTEM_SCENE_NODE_H_INCLUDED__ 7 8 #include "ISceneNode.h" 9 #include "IParticleAnimatedMeshSceneNodeEmitter.h" 10 #include "IParticleBoxEmitter.h" 11 #include "IParticleCylinderEmitter.h" 12 #include "IParticleMeshEmitter.h" 13 #include "IParticleRingEmitter.h" 14 #include "IParticleSphereEmitter.h" 15 #include "IParticleAttractionAffector.h" 16 #include "IParticleFadeOutAffector.h" 17 #include "IParticleGravityAffector.h" 18 #include "IParticleRotationAffector.h" 19 #include "dimension2d.h" 20 21 namespace irr 22 { 23 namespace scene 24 { 25 26 //! A particle system scene node for creating snow, fire, exlosions, smoke... 27 /** A scene node controlling a particle System. The behavior of the particles 28 can be controlled by setting the right particle emitters and affectors. 29 You can for example easily create a campfire by doing this: 30 31 \code 32 scene::IParticleSystemSceneNode* p = scenemgr->addParticleSystemSceneNode(); 33 p->setParticleSize(core::dimension2d<f32>(20.0f, 10.0f)); 34 scene::IParticleEmitter* em = p->createBoxEmitter( 35 core::aabbox3d<f32>(-5,0,-5,5,1,5), 36 core::vector3df(0.0f,0.03f,0.0f), 37 40,80, video::SColor(0,255,255,255),video::SColor(0,255,255,255), 1100,2000); 38 p->setEmitter(em); 39 em->drop(); 40 scene::IParticleAffector* paf = p->createFadeOutParticleAffector(); 41 p->addAffector(paf); 42 paf->drop(); 43 \endcode 44 45 */ 46 class IParticleSystemSceneNode : public ISceneNode 47 { 48 public: 49 50 //! Constructor 51 IParticleSystemSceneNode(ISceneNode* parent, ISceneManager* mgr, s32 id, 52 const core::vector3df& position = core::vector3df(0,0,0), 53 const core::vector3df& rotation = core::vector3df(0,0,0), 54 const core::vector3df& scale = core::vector3df(1.0f, 1.0f, 1.0f)) ISceneNode(parent,mgr,id,position,rotation,scale)55 : ISceneNode(parent, mgr, id, position, rotation, scale) {} 56 57 //! Sets the size of all particles. 58 virtual void setParticleSize( 59 const core::dimension2d<f32> &size = core::dimension2d<f32>(5.0f, 5.0f)) = 0; 60 61 //! Sets if the particles should be global. 62 /** If they are, the particles are affected by the movement of the 63 particle system scene node too, otherwise they completely ignore it. 64 Default is true. */ 65 virtual void setParticlesAreGlobal(bool global=true) = 0; 66 67 //! Remove all currently visible particles 68 virtual void clearParticles() = 0; 69 70 //! Do manually update the particles. 71 //! This should only be called when you want to render the node outside the scenegraph, 72 //! as the node will care about this otherwise automatically. 73 virtual void doParticleSystem(u32 time) = 0; 74 75 //! Gets the particle emitter, which creates the particles. 76 /** \return The particle emitter. Can be 0 if none is set. */ 77 virtual IParticleEmitter* getEmitter() =0; 78 79 //! Sets the particle emitter, which creates the particles. 80 /** A particle emitter can be created using one of the createEmitter 81 methods. For example to create and use a simple PointEmitter, call 82 IParticleEmitter* p = createPointEmitter(); setEmitter(p); p->drop(); 83 \param emitter: Sets the particle emitter. You can set this to 0 for 84 removing the current emitter and stopping the particle system emitting 85 new particles. */ 86 virtual void setEmitter(IParticleEmitter* emitter) = 0; 87 88 //! Adds new particle effector to the particle system. 89 /** A particle affector modifies the particles. For example, the FadeOut 90 affector lets all particles fade out after some time. It is created and 91 used in this way: 92 \code 93 IParticleAffector* p = createFadeOutParticleAffector(); 94 addAffector(p); 95 p->drop(); 96 \endcode 97 Please note that an affector is not necessary for the particle system to 98 work. 99 \param affector: New affector. */ 100 virtual void addAffector(IParticleAffector* affector) = 0; 101 102 //! Get a list of all particle affectors. 103 /** \return The list of particle affectors attached to this node. */ 104 virtual const core::list<IParticleAffector*>& getAffectors() const = 0; 105 106 //! Removes all particle affectors in the particle system. 107 virtual void removeAllAffectors() = 0; 108 109 //! Creates a particle emitter for an animated mesh scene node 110 /** \param node: Pointer to the animated mesh scene node to emit 111 particles from 112 \param useNormalDirection: If true, the direction of each particle 113 created will be the normal of the vertex that it's emitting from. The 114 normal is divided by the normalDirectionModifier parameter, which 115 defaults to 100.0f. 116 \param direction: Direction and speed of particle emission. 117 \param normalDirectionModifier: If the emitter is using the normal 118 direction then the normal of the vertex that is being emitted from is 119 divided by this number. 120 \param mbNumber: This allows you to specify a specific meshBuffer for 121 the IMesh* to emit particles from. The default value is -1, which 122 means a random meshBuffer picked from all of the meshes meshBuffers 123 will be selected to pick a random vertex from. If the value is 0 or 124 greater, it will only pick random vertices from the meshBuffer 125 specified by this value. 126 \param everyMeshVertex: If true, the emitter will emit between min/max 127 particles every second, for every vertex in the mesh, if false, it will 128 emit between min/max particles from random vertices in the mesh. 129 \param minParticlesPerSecond: Minimal amount of particles emitted per 130 second. 131 \param maxParticlesPerSecond: Maximal amount of particles emitted per 132 second. 133 \param minStartColor: Minimal initial start color of a particle. The 134 real color of every particle is calculated as random interpolation 135 between minStartColor and maxStartColor. 136 \param maxStartColor: Maximal initial start color of a particle. The 137 real color of every particle is calculated as random interpolation 138 between minStartColor and maxStartColor. 139 \param lifeTimeMin: Minimal lifetime of a particle, in milliseconds. 140 \param lifeTimeMax: Maximal lifetime of a particle, in milliseconds. 141 \param maxAngleDegrees: Maximal angle in degrees, the emitting 142 direction of the particle will differ from the original direction. 143 \param minStartSize: Minimal initial start size of a particle. The 144 real size of every particle is calculated as random interpolation 145 between minStartSize and maxStartSize. 146 \param maxStartSize: Maximal initial start size of a particle. The 147 real size of every particle is calculated as random interpolation 148 between minStartSize and maxStartSize. 149 \return Pointer to the created particle emitter. To set this emitter 150 as new emitter of this particle system, just call setEmitter(). Note 151 that you'll have to drop() the returned pointer, after you don't need 152 it any more, see IReferenceCounted::drop() for more informations. */ 153 virtual IParticleAnimatedMeshSceneNodeEmitter* createAnimatedMeshSceneNodeEmitter( 154 scene::IAnimatedMeshSceneNode* node, bool useNormalDirection = true, 155 const core::vector3df& direction = core::vector3df(0.0f,0.03f,0.0f), 156 f32 normalDirectionModifier = 100.0f, s32 mbNumber = -1, 157 bool everyMeshVertex = false, 158 u32 minParticlesPerSecond = 5, u32 maxParticlesPerSecond = 10, 159 const video::SColor& minStartColor = video::SColor(255,0,0,0), 160 const video::SColor& maxStartColor = video::SColor(255,255,255,255), 161 u32 lifeTimeMin = 2000, u32 lifeTimeMax = 4000, 162 s32 maxAngleDegrees = 0, 163 const core::dimension2df& minStartSize = core::dimension2df(5.0f,5.0f), 164 const core::dimension2df& maxStartSize = core::dimension2df(5.0f,5.0f) ) = 0; 165 166 //! Creates a box particle emitter. 167 /** \param box: The box for the emitter. 168 \param direction: Direction and speed of particle emission. 169 \param minParticlesPerSecond: Minimal amount of particles emitted per 170 second. 171 \param maxParticlesPerSecond: Maximal amount of particles emitted per 172 second. 173 \param minStartColor: Minimal initial start color of a particle. The 174 real color of every particle is calculated as random interpolation 175 between minStartColor and maxStartColor. 176 \param maxStartColor: Maximal initial start color of a particle. The 177 real color of every particle is calculated as random interpolation 178 between minStartColor and maxStartColor. 179 \param lifeTimeMin: Minimal lifetime of a particle, in milliseconds. 180 \param lifeTimeMax: Maximal lifetime of a particle, in milliseconds. 181 \param maxAngleDegrees: Maximal angle in degrees, the emitting 182 direction of the particle will differ from the original direction. 183 \param minStartSize: Minimal initial start size of a particle. The 184 real size of every particle is calculated as random interpolation 185 between minStartSize and maxStartSize. 186 \param maxStartSize: Maximal initial start size of a particle. The 187 real size of every particle is calculated as random interpolation 188 between minStartSize and maxStartSize. 189 \return Pointer to the created particle emitter. To set this emitter 190 as new emitter of this particle system, just call setEmitter(). Note 191 that you'll have to drop() the returned pointer, after you don't need 192 it any more, see IReferenceCounted::drop() for more informations. */ 193 virtual IParticleBoxEmitter* createBoxEmitter( 194 const core::aabbox3df& box = core::aabbox3df(-10,28,-10,10,30,10), 195 const core::vector3df& direction = core::vector3df(0.0f,0.03f,0.0f), 196 u32 minParticlesPerSecond = 5, 197 u32 maxParticlesPerSecond = 10, 198 const video::SColor& minStartColor = video::SColor(255,0,0,0), 199 const video::SColor& maxStartColor = video::SColor(255,255,255,255), 200 u32 lifeTimeMin=2000, u32 lifeTimeMax=4000, 201 s32 maxAngleDegrees=0, 202 const core::dimension2df& minStartSize = core::dimension2df(5.0f,5.0f), 203 const core::dimension2df& maxStartSize = core::dimension2df(5.0f,5.0f) ) = 0; 204 205 //! Creates a particle emitter for emitting from a cylinder 206 /** \param center: The center of the circle at the base of the cylinder 207 \param radius: The thickness of the cylinder 208 \param normal: Direction of the length of the cylinder 209 \param length: The length of the the cylinder 210 \param outlineOnly: Whether or not to put points inside the cylinder or 211 on the outline only 212 \param direction: Direction and speed of particle emission. 213 \param minParticlesPerSecond: Minimal amount of particles emitted per 214 second. 215 \param maxParticlesPerSecond: Maximal amount of particles emitted per 216 second. 217 \param minStartColor: Minimal initial start color of a particle. The 218 real color of every particle is calculated as random interpolation 219 between minStartColor and maxStartColor. 220 \param maxStartColor: Maximal initial start color of a particle. The 221 real color of every particle is calculated as random interpolation 222 between minStartColor and maxStartColor. 223 \param lifeTimeMin: Minimal lifetime of a particle, in milliseconds. 224 \param lifeTimeMax: Maximal lifetime of a particle, in milliseconds. 225 \param maxAngleDegrees: Maximal angle in degrees, the emitting 226 direction of the particle will differ from the original direction. 227 \param minStartSize: Minimal initial start size of a particle. The 228 real size of every particle is calculated as random interpolation 229 between minStartSize and maxStartSize. 230 \param maxStartSize: Maximal initial start size of a particle. The 231 real size of every particle is calculated as random interpolation 232 between minStartSize and maxStartSize. 233 \return Pointer to the created particle emitter. To set this emitter 234 as new emitter of this particle system, just call setEmitter(). Note 235 that you'll have to drop() the returned pointer, after you don't need 236 it any more, see IReferenceCounted::drop() for more informations. */ 237 virtual IParticleCylinderEmitter* createCylinderEmitter( 238 const core::vector3df& center, f32 radius, 239 const core::vector3df& normal, f32 length, 240 bool outlineOnly = false, 241 const core::vector3df& direction = core::vector3df(0.0f,0.03f,0.0f), 242 u32 minParticlesPerSecond = 5, u32 maxParticlesPerSecond = 10, 243 const video::SColor& minStartColor = video::SColor(255,0,0,0), 244 const video::SColor& maxStartColor = video::SColor(255,255,255,255), 245 u32 lifeTimeMin = 2000, u32 lifeTimeMax = 4000, 246 s32 maxAngleDegrees = 0, 247 const core::dimension2df& minStartSize = core::dimension2df(5.0f,5.0f), 248 const core::dimension2df& maxStartSize = core::dimension2df(5.0f,5.0f) ) = 0; 249 250 //! Creates a mesh particle emitter. 251 /** \param mesh: Pointer to mesh to emit particles from 252 \param useNormalDirection: If true, the direction of each particle 253 created will be the normal of the vertex that it's emitting from. The 254 normal is divided by the normalDirectionModifier parameter, which 255 defaults to 100.0f. 256 \param direction: Direction and speed of particle emission. 257 \param normalDirectionModifier: If the emitter is using the normal 258 direction then the normal of the vertex that is being emitted from is 259 divided by this number. 260 \param mbNumber: This allows you to specify a specific meshBuffer for 261 the IMesh* to emit particles from. The default value is -1, which 262 means a random meshBuffer picked from all of the meshes meshBuffers 263 will be selected to pick a random vertex from. If the value is 0 or 264 greater, it will only pick random vertices from the meshBuffer 265 specified by this value. 266 \param everyMeshVertex: If true, the emitter will emit between min/max 267 particles every second, for every vertex in the mesh, if false, it will 268 emit between min/max particles from random vertices in the mesh. 269 \param minParticlesPerSecond: Minimal amount of particles emitted per 270 second. 271 \param maxParticlesPerSecond: Maximal amount of particles emitted per 272 second. 273 \param minStartColor: Minimal initial start color of a particle. The 274 real color of every particle is calculated as random interpolation 275 between minStartColor and maxStartColor. 276 \param maxStartColor: Maximal initial start color of a particle. The 277 real color of every particle is calculated as random interpolation 278 between minStartColor and maxStartColor. 279 \param lifeTimeMin: Minimal lifetime of a particle, in milliseconds. 280 \param lifeTimeMax: Maximal lifetime of a particle, in milliseconds. 281 \param maxAngleDegrees: Maximal angle in degrees, the emitting 282 direction of the particle will differ from the original direction. 283 \param minStartSize: Minimal initial start size of a particle. The 284 real size of every particle is calculated as random interpolation 285 between minStartSize and maxStartSize. 286 \param maxStartSize: Maximal initial start size of a particle. The 287 real size of every particle is calculated as random interpolation 288 between minStartSize and maxStartSize. 289 \return Pointer to the created particle emitter. To set this emitter 290 as new emitter of this particle system, just call setEmitter(). Note 291 that you'll have to drop() the returned pointer, after you don't need 292 it any more, see IReferenceCounted::drop() for more informations. */ 293 virtual IParticleMeshEmitter* createMeshEmitter( 294 scene::IMesh* mesh, bool useNormalDirection = true, 295 const core::vector3df& direction = core::vector3df(0.0f,0.03f,0.0f), 296 f32 normalDirectionModifier = 100.0f, s32 mbNumber = -1, 297 bool everyMeshVertex = false, 298 u32 minParticlesPerSecond = 5, u32 maxParticlesPerSecond = 10, 299 const video::SColor& minStartColor = video::SColor(255,0,0,0), 300 const video::SColor& maxStartColor = video::SColor(255,255,255,255), 301 u32 lifeTimeMin = 2000, u32 lifeTimeMax = 4000, 302 s32 maxAngleDegrees = 0, 303 const core::dimension2df& minStartSize = core::dimension2df(5.0f,5.0f), 304 const core::dimension2df& maxStartSize = core::dimension2df(5.0f,5.0f) ) = 0; 305 306 //! Creates a point particle emitter. 307 /** \param direction: Direction and speed of particle emission. 308 \param minParticlesPerSecond: Minimal amount of particles emitted per 309 second. 310 \param maxParticlesPerSecond: Maximal amount of particles emitted per 311 second. 312 \param minStartColor: Minimal initial start color of a particle. The 313 real color of every particle is calculated as random interpolation 314 between minStartColor and maxStartColor. 315 \param maxStartColor: Maximal initial start color of a particle. The 316 real color of every particle is calculated as random interpolation 317 between minStartColor and maxStartColor. 318 \param lifeTimeMin: Minimal lifetime of a particle, in milliseconds. 319 \param lifeTimeMax: Maximal lifetime of a particle, in milliseconds. 320 \param maxAngleDegrees: Maximal angle in degrees, the emitting 321 direction of the particle will differ from the original direction. 322 \param minStartSize: Minimal initial start size of a particle. The 323 real size of every particle is calculated as random interpolation 324 between minStartSize and maxStartSize. 325 \param maxStartSize: Maximal initial start size of a particle. The 326 real size of every particle is calculated as random interpolation 327 between minStartSize and maxStartSize. 328 \return Pointer to the created particle emitter. To set this emitter 329 as new emitter of this particle system, just call setEmitter(). Note 330 that you'll have to drop() the returned pointer, after you don't need 331 it any more, see IReferenceCounted::drop() for more informations. */ 332 virtual IParticlePointEmitter* createPointEmitter( 333 const core::vector3df& direction = core::vector3df(0.0f,0.03f,0.0f), 334 u32 minParticlesPerSecond = 5, 335 u32 maxParticlesPerSecond = 10, 336 const video::SColor& minStartColor = video::SColor(255,0,0,0), 337 const video::SColor& maxStartColor = video::SColor(255,255,255,255), 338 u32 lifeTimeMin=2000, u32 lifeTimeMax=4000, 339 s32 maxAngleDegrees=0, 340 const core::dimension2df& minStartSize = core::dimension2df(5.0f,5.0f), 341 const core::dimension2df& maxStartSize = core::dimension2df(5.0f,5.0f) ) = 0; 342 343 //! Creates a ring particle emitter. 344 /** \param center: Center of ring 345 \param radius: Distance of points from center, points will be rotated 346 around the Y axis at a random 360 degrees and will then be shifted by 347 the provided ringThickness values in each axis. 348 \param ringThickness : thickness of the ring or how wide the ring is 349 \param direction: Direction and speed of particle emission. 350 \param minParticlesPerSecond: Minimal amount of particles emitted per 351 second. 352 \param maxParticlesPerSecond: Maximal amount of particles emitted per 353 second. 354 \param minStartColor: Minimal initial start color of a particle. The 355 real color of every particle is calculated as random interpolation 356 between minStartColor and maxStartColor. 357 \param maxStartColor: Maximal initial start color of a particle. The 358 real color of every particle is calculated as random interpolation 359 between minStartColor and maxStartColor. 360 \param lifeTimeMin: Minimal lifetime of a particle, in milliseconds. 361 \param lifeTimeMax: Maximal lifetime of a particle, in milliseconds. 362 \param maxAngleDegrees: Maximal angle in degrees, the emitting 363 direction of the particle will differ from the original direction. 364 \param minStartSize: Minimal initial start size of a particle. The 365 real size of every particle is calculated as random interpolation 366 between minStartSize and maxStartSize. 367 \param maxStartSize: Maximal initial start size of a particle. The 368 real size of every particle is calculated as random interpolation 369 between minStartSize and maxStartSize. 370 \return Pointer to the created particle emitter. To set this emitter 371 as new emitter of this particle system, just call setEmitter(). Note 372 that you'll have to drop() the returned pointer, after you don't need 373 it any more, see IReferenceCounted::drop() for more informations. */ 374 virtual IParticleRingEmitter* createRingEmitter( 375 const core::vector3df& center, f32 radius, f32 ringThickness, 376 const core::vector3df& direction = core::vector3df(0.0f,0.03f,0.0f), 377 u32 minParticlesPerSecond = 5, 378 u32 maxParticlesPerSecond = 10, 379 const video::SColor& minStartColor = video::SColor(255,0,0,0), 380 const video::SColor& maxStartColor = video::SColor(255,255,255,255), 381 u32 lifeTimeMin=2000, u32 lifeTimeMax=4000, 382 s32 maxAngleDegrees=0, 383 const core::dimension2df& minStartSize = core::dimension2df(5.0f,5.0f), 384 const core::dimension2df& maxStartSize = core::dimension2df(5.0f,5.0f) ) = 0; 385 386 //! Creates a sphere particle emitter. 387 /** \param center: Center of sphere 388 \param radius: Radius of sphere 389 \param direction: Direction and speed of particle emission. 390 \param minParticlesPerSecond: Minimal amount of particles emitted per 391 second. 392 \param maxParticlesPerSecond: Maximal amount of particles emitted per 393 second. 394 \param minStartColor: Minimal initial start color of a particle. The 395 real color of every particle is calculated as random interpolation 396 between minStartColor and maxStartColor. 397 \param maxStartColor: Maximal initial start color of a particle. The 398 real color of every particle is calculated as random interpolation 399 between minStartColor and maxStartColor. 400 \param lifeTimeMin: Minimal lifetime of a particle, in milliseconds. 401 \param lifeTimeMax: Maximal lifetime of a particle, in milliseconds. 402 \param maxAngleDegrees: Maximal angle in degrees, the emitting 403 direction of the particle will differ from the original direction. 404 \param minStartSize: Minimal initial start size of a particle. The 405 real size of every particle is calculated as random interpolation 406 between minStartSize and maxStartSize. 407 \param maxStartSize: Maximal initial start size of a particle. The 408 real size of every particle is calculated as random interpolation 409 between minStartSize and maxStartSize. 410 \return Pointer to the created particle emitter. To set this emitter 411 as new emitter of this particle system, just call setEmitter(). Note 412 that you'll have to drop() the returned pointer, after you don't need 413 it any more, see IReferenceCounted::drop() for more informations. */ 414 virtual IParticleSphereEmitter* createSphereEmitter( 415 const core::vector3df& center, f32 radius, 416 const core::vector3df& direction = core::vector3df(0.0f,0.03f,0.0f), 417 u32 minParticlesPerSecond = 5, 418 u32 maxParticlesPerSecond = 10, 419 const video::SColor& minStartColor = video::SColor(255,0,0,0), 420 const video::SColor& maxStartColor = video::SColor(255,255,255,255), 421 u32 lifeTimeMin=2000, u32 lifeTimeMax=4000, 422 s32 maxAngleDegrees=0, 423 const core::dimension2df& minStartSize = core::dimension2df(5.0f,5.0f), 424 const core::dimension2df& maxStartSize = core::dimension2df(5.0f,5.0f) ) = 0; 425 426 //! Creates a point attraction affector. 427 /** This affector modifies the positions of the particles and attracts 428 them to a specified point at a specified speed per second. 429 \param point: Point to attract particles to. 430 \param speed: Speed in units per second, to attract to the specified 431 point. 432 \param attract: Whether the particles attract or detract from this 433 point. 434 \param affectX: Whether or not this will affect the X position of the 435 particle. 436 \param affectY: Whether or not this will affect the Y position of the 437 particle. 438 \param affectZ: Whether or not this will affect the Z position of the 439 particle. 440 \return Pointer to the created particle affector. To add this affector 441 as new affector of this particle system, just call addAffector(). Note 442 that you'll have to drop() the returned pointer, after you don't need 443 it any more, see IReferenceCounted::drop() for more informations. */ 444 virtual IParticleAttractionAffector* createAttractionAffector( 445 const core::vector3df& point, f32 speed = 1.0f, bool attract = true, 446 bool affectX = true, bool affectY = true, bool affectZ = true) = 0; 447 448 //! Creates a scale particle affector. 449 /** This affector scales the particle to the a multiple of its size defined 450 by the scaleTo variable. 451 \param scaleTo: multiple of the size which the particle will be scaled to until deletion 452 \return Pointer to the created particle affector. 453 To add this affector as new affector of this particle system, 454 just call addAffector(). Note that you'll have to drop() the 455 returned pointer, after you don't need it any more, see 456 IReferenceCounted::drop() for more information. */ 457 virtual IParticleAffector* createScaleParticleAffector(const core::dimension2df& scaleTo = core::dimension2df(1.0f, 1.0f)) = 0; 458 459 //! Creates a fade out particle affector. 460 /** This affector modifies the color of every particle and and reaches 461 the final color when the particle dies. This affector looks really 462 good, if the EMT_TRANSPARENT_ADD_COLOR material is used and the 463 targetColor is video::SColor(0,0,0,0): Particles are fading out into 464 void with this setting. 465 \param targetColor: Color whereto the color of the particle is changed. 466 \param timeNeededToFadeOut: How much time in milli seconds should the 467 affector need to change the color to the targetColor. 468 \return Pointer to the created particle affector. To add this affector 469 as new affector of this particle system, just call addAffector(). Note 470 that you'll have to drop() the returned pointer, after you don't need 471 it any more, see IReferenceCounted::drop() for more informations. */ 472 virtual IParticleFadeOutAffector* createFadeOutParticleAffector( 473 const video::SColor& targetColor = video::SColor(0,0,0,0), 474 u32 timeNeededToFadeOut = 1000) = 0; 475 476 //! Creates a gravity affector. 477 /** This affector modifies the direction of the particle. It assumes 478 that the particle is fired out of the emitter with huge force, but is 479 loosing this after some time and is catched by the gravity then. This 480 affector is ideal for creating things like fountains. 481 \param gravity: Direction and force of gravity. 482 \param timeForceLost: Time in milli seconds when the force of the 483 emitter is totally lost and the particle does not move any more. This 484 is the time where gravity fully affects the particle. 485 \return Pointer to the created particle affector. To add this affector 486 as new affector of this particle system, just call addAffector(). Note 487 that you'll have to drop() the returned pointer, after you don't need 488 it any more, see IReferenceCounted::drop() for more informations. */ 489 virtual IParticleGravityAffector* createGravityAffector( 490 const core::vector3df& gravity = core::vector3df(0.0f,-0.03f,0.0f), 491 u32 timeForceLost = 1000) = 0; 492 493 //! Creates a rotation affector. 494 /** This affector modifies the positions of the particles and attracts 495 them to a specified point at a specified speed per second. 496 \param speed: Rotation in degrees per second 497 \param pivotPoint: Point to rotate the particles around 498 \return Pointer to the created particle affector. To add this affector 499 as new affector of this particle system, just call addAffector(). Note 500 that you'll have to drop() the returned pointer, after you don't need 501 it any more, see IReferenceCounted::drop() for more informations. */ 502 virtual IParticleRotationAffector* createRotationAffector( 503 const core::vector3df& speed = core::vector3df(5.0f,5.0f,5.0f), 504 const core::vector3df& pivotPoint = core::vector3df(0.0f,0.0f,0.0f) ) = 0; 505 }; 506 507 } // end namespace scene 508 } // end namespace irr 509 510 511 #endif 512 513