1
// Copyright (C) 2002-2011 Nikolaus Gebhardt
2
// This file is part of the "Irrlicht Engine".
3
// For conditions of distribution and use, see copyright notice in irrlicht.h
5
#ifndef __C_PARTICLE_SYSTEM_SCENE_NODE_H_INCLUDED__
6
#define __C_PARTICLE_SYSTEM_SCENE_NODE_H_INCLUDED__
8
#include "IParticleSystemSceneNode.h"
11
#include "SMeshBuffer.h"
18
//! A particle system scene node.
19
/** A scene node controlling a particle system. The behavior of the particles
20
can be controlled by setting the right particle emitters and affectors.
22
class CParticleSystemSceneNode : public IParticleSystemSceneNode
27
CParticleSystemSceneNode(bool createDefaultEmitter,
28
ISceneNode* parent, ISceneManager* mgr, s32 id,
29
const core::vector3df& position,
30
const core::vector3df& rotation,
31
const core::vector3df& scale);
34
virtual ~CParticleSystemSceneNode();
36
//! Gets the particle emitter, which creates the particles.
37
virtual IParticleEmitter* getEmitter();
39
//! Sets the particle emitter, which creates the particles.
40
virtual void setEmitter(IParticleEmitter* emitter);
42
//! Adds new particle affector to the particle system.
43
virtual void addAffector(IParticleAffector* affector);
45
//! Get a list of all particle affectors.
46
virtual const core::list<IParticleAffector*>& getAffectors() const;
48
//! Removes all particle affectors in the particle system.
49
virtual void removeAllAffectors();
51
//! Returns the material based on the zero based index i.
52
virtual video::SMaterial& getMaterial(u32 i);
54
//! Returns amount of materials used by this scene node.
55
virtual u32 getMaterialCount() const;
58
virtual void OnRegisterSceneNode();
61
virtual void render();
63
//! returns the axis aligned bounding box of this node
64
virtual const core::aabbox3d<f32>& getBoundingBox() const;
66
//! Creates a particle emitter for an animated mesh scene node
67
virtual IParticleAnimatedMeshSceneNodeEmitter* createAnimatedMeshSceneNodeEmitter(
68
scene::IAnimatedMeshSceneNode* node, bool useNormalDirection = true,
69
const core::vector3df& direction = core::vector3df(0.0f,0.03f,0.0f),
70
f32 normalDirectionModifier = 100.0f, s32 mbNumber = -1,
71
bool everyMeshVertex = false, u32 minParticlesPerSecond = 5,
72
u32 maxParticlesPerSecond = 10,
73
const video::SColor& minStartColor = video::SColor(255,0,0,0),
74
const video::SColor& maxStartColor = video::SColor(255,255,255,255),
75
u32 lifeTimeMin = 2000, u32 lifeTimeMax = 4000,
76
s32 maxAngleDegrees = 0,
77
const core::dimension2df& minStartSize = core::dimension2df(5.0f,5.0f),
78
const core::dimension2df& maxStartSize = core::dimension2df(5.0f,5.0f) );
80
//! Creates a box particle emitter.
81
virtual IParticleBoxEmitter* createBoxEmitter(
82
const core::aabbox3df& box = core::aabbox3d<f32>(-10,0,-10,5,30,10),
83
const core::vector3df& direction = core::vector3df(0.0f,0.03f,0.0f),
84
u32 minParticlesPerSecond = 5,
85
u32 maxParticlesPerSecond = 10,
86
const video::SColor& minStartColor = video::SColor(255,0,0,0),
87
const video::SColor& maxStartColor = video::SColor(255,255,255,255),
88
u32 lifeTimeMin=2000, u32 lifeTimeMax=4000,
89
s32 maxAngleDegrees=0,
90
const core::dimension2df& minStartSize = core::dimension2df(5.0f,5.0f),
91
const core::dimension2df& maxStartSize = core::dimension2df(5.0f,5.0f) );
93
//! Creates a particle emitter for emitting from a cylinder
94
virtual IParticleCylinderEmitter* createCylinderEmitter(
95
const core::vector3df& center, f32 radius,
96
const core::vector3df& normal, f32 length,
97
bool outlineOnly = false, const core::vector3df& direction = core::vector3df(0.0f,0.5f,0.0f),
98
u32 minParticlesPerSecond = 5, u32 maxParticlesPersSecond = 10,
99
const video::SColor& minStartColor = video::SColor(255,0,0,0),
100
const video::SColor& maxStartColor = video::SColor(255,255,255,255),
101
u32 lifeTimeMin = 2000, u32 lifeTimeMax = 4000,
102
s32 maxAngleDegrees = 0,
103
const core::dimension2df& minStartSize = core::dimension2df(5.0f,5.0f),
104
const core::dimension2df& maxStartSize = core::dimension2df(5.0f,5.0f) );
106
//! Creates a mesh particle emitter.
107
virtual IParticleMeshEmitter* createMeshEmitter(
108
scene::IMesh* mesh, bool useNormalDirection = true,
109
const core::vector3df& direction = core::vector3df(0.0f,0.03f,0.0f),
110
f32 normalDirectionModifier = 100.0f, s32 mbNumber = -1,
111
bool everyMeshVertex = false,
112
u32 minParticlesPerSecond = 5,
113
u32 maxParticlesPerSecond = 10,
114
const video::SColor& minStartColor = video::SColor(255,0,0,0),
115
const video::SColor& maxStartColor = video::SColor(255,255,255,255),
116
u32 lifeTimeMin = 2000, u32 lifeTimeMax = 4000,
117
s32 maxAngleDegrees = 0,
118
const core::dimension2df& minStartSize = core::dimension2df(5.0f,5.0f),
119
const core::dimension2df& maxStartSize = core::dimension2df(5.0f,5.0f) );
121
//! Creates a point particle emitter.
122
virtual IParticlePointEmitter* createPointEmitter(
123
const core::vector3df& direction = core::vector3df(0.0f,0.03f,0.0f),
124
u32 minParticlesPerSecond = 5,
125
u32 maxParticlesPerSecond = 10,
126
const video::SColor& minStartColor = video::SColor(255,0,0,0),
127
const video::SColor& maxStartColor = video::SColor(255,255,255,255),
128
u32 lifeTimeMin=2000, u32 lifeTimeMax=4000,
129
s32 maxAngleDegrees=0,
130
const core::dimension2df& minStartSize = core::dimension2df(5.0f,5.0f),
131
const core::dimension2df& maxStartSize = core::dimension2df(5.0f,5.0f) );
133
//! Creates a ring particle emitter.
134
virtual IParticleRingEmitter* createRingEmitter(
135
const core::vector3df& center, f32 radius, f32 ringThickness,
136
const core::vector3df& direction = core::vector3df(0.0f,0.03f,0.0f),
137
u32 minParticlesPerSecond = 5,
138
u32 maxParticlesPerSecond = 10,
139
const video::SColor& minStartColor = video::SColor(255,0,0,0),
140
const video::SColor& maxStartColor = video::SColor(255,255,255,255),
141
u32 lifeTimeMin=2000, u32 lifeTimeMax=4000,
142
s32 maxAngleDegrees=0,
143
const core::dimension2df& minStartSize = core::dimension2df(5.0f,5.0f),
144
const core::dimension2df& maxStartSize = core::dimension2df(5.0f,5.0f) );
146
//! Creates a sphere particle emitter.
147
virtual IParticleSphereEmitter* createSphereEmitter(
148
const core::vector3df& center, f32 radius,
149
const core::vector3df& direction = core::vector3df(0.0f,0.03f,0.0f),
150
u32 minParticlesPerSecond = 5,
151
u32 maxParticlesPerSecond = 10,
152
const video::SColor& minStartColor = video::SColor(255,0,0,0),
153
const video::SColor& maxStartColor = video::SColor(255,255,255,255),
154
u32 lifeTimeMin=2000, u32 lifeTimeMax=4000,
155
s32 maxAngleDegrees=0,
156
const core::dimension2df& minStartSize = core::dimension2df(5.0f,5.0f),
157
const core::dimension2df& maxStartSize = core::dimension2df(5.0f,5.0f) );
159
//! Creates a point attraction affector. This affector modifies the positions of the
160
//! particles and attracts them to a specified point at a specified speed per second.
161
virtual IParticleAttractionAffector* createAttractionAffector(
162
const core::vector3df& point, f32 speed = 1.0f, bool attract = true,
163
bool affectX = true, bool affectY = true, bool affectZ = true);
165
//! Creates a scale particle affector.
166
virtual IParticleAffector* createScaleParticleAffector(const core::dimension2df& scaleTo = core::dimension2df(1.0f, 1.0f));
168
//! Creates a fade out particle affector.
169
virtual IParticleFadeOutAffector* createFadeOutParticleAffector(
170
const video::SColor& targetColor = video::SColor(0,0,0,0),
171
u32 timeNeededToFadeOut = 1000);
173
//! Creates a gravity affector.
174
virtual IParticleGravityAffector* createGravityAffector(
175
const core::vector3df& gravity = core::vector3df(0.0f,-0.03f,0.0f),
176
u32 timeForceLost = 1000);
178
//! Creates a rotation affector. This affector rotates the particles
179
//! around a specified pivot point. The speed is in Degrees per second.
180
virtual IParticleRotationAffector* createRotationAffector(
181
const core::vector3df& speed = core::vector3df(5.0f,5.0f,5.0f),
182
const core::vector3df& pivotPoint = core::vector3df(0.0f,0.0f,0.0f) );
184
//! Sets the size of all particles.
185
virtual void setParticleSize(
186
const core::dimension2d<f32> &size = core::dimension2d<f32>(5.0f, 5.0f));
188
//! Sets if the particles should be global. If they are, the particles are affected by
189
//! the movement of the particle system scene node too, otherwise they completely
190
//! ignore it. Default is true.
191
virtual void setParticlesAreGlobal(bool global=true);
193
//! Remove all currently visible particles
194
virtual void clearParticles();
196
//! Do manually update the particles.
197
//! This should only be called when you want to render the node outside the scenegraph,
198
//! as the node will care about this otherwise automatically.
199
virtual void doParticleSystem(u32 time);
201
//! Writes attributes of the scene node.
202
virtual void serializeAttributes(io::IAttributes* out, io::SAttributeReadWriteOptions* options=0) const;
204
//! Reads attributes of the scene node.
205
virtual void deserializeAttributes(io::IAttributes* in, io::SAttributeReadWriteOptions* options=0);
207
//! Returns type of the scene node
208
virtual ESCENE_NODE_TYPE getType() const { return ESNT_PARTICLE_SYSTEM; }
212
void reallocateBuffers();
214
core::list<IParticleAffector*> AffectorList;
215
IParticleEmitter* Emitter;
216
core::array<SParticle> Particles;
217
core::dimension2d<f32> ParticleSize;
223
enum E_PARTICLES_PRIMITIVE
229
E_PARTICLES_PRIMITIVE ParticlePrimitive;
231
bool ParticlesAreGlobal;
234
} // end namespace scene
235
} // end namespace irr