1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
|
#ifndef __JE_PARTICLE_EMMITTER_H__
#define __JE_PARTICLE_EMMITTER_H__
#include <vector>
#include "../../common/temporary.h"
#include "../../game/gameobject.h"
#include "../sprite.h"
#include "particle_emitter.h"
#include "particle_pool.h"
#include "particle.h"
namespace JinEngine
{
namespace Graphics
{
namespace Particles
{
///
/// Definition of particle system.
///
struct ParticleSystemDef
{
ParticleSystemDef() {}
uint maxParticleCount = 1; ///< Max count of particles in pool. 1 by default.
ParticleEmitterDef emitterDef; ///< Particle emitter definition.
ParticleDef particleDef; ///< Particle definition.
};
///
/// Particle emitter, handle all particles it emitts.
///
class ParticleSystem : public Renderable, public Game::GameObject
{
public:
///
/// Particle system constructor
///
/// @param def Definition of particle system.
///
ParticleSystem(const ParticleSystemDef& def);
///
///
///
ParticleSystem(uint maxCount = 64);
///
///
///
ParticleSystem(const std::string & config);
///
/// Particle system destructor.
///
~ParticleSystem();
///
///
///
void setDefinition(const ParticleSystemDef& def);
///
/// Load definition from config.
///
void setDefinition(const std::string& config);
///
/// Update particle system and all alive particles.
///
void update(float dt);
///
/// Render particle system.
///
void render();
///
/// Set particle system position.
///
void setPosition(float x, float y);
///
/// Set scale.
///
void setScale(float sx, float sy);
///
/// Pause particle spawn.
///
void pause(bool isPause);
///
/// Clear all particles.
///
void clear();
//////////////////////////////////////////////////////////////////////////////////////////////////
// Particle Emitter modification.
//////////////////////////////////////////////////////////////////////////////////////////////////
void setEmitRate(float floor, float ceil);
void setEmitRate(float rate);
void setEmitForce(float floor, float ceil);
void setEmitForce(float force);
void setEmitDirection(float floor, float ceil);
void setEmitDirection(float dir);
void setEmitPosition(const Math::Vector2<float>& floor, const Math::Vector2<float>& ceil);
void setEmitPosition(const Math::Vector2<float>& position);
//////////////////////////////////////////////////////////////////////////////////////////////////
// Particle modification.
//////////////////////////////////////////////////////////////////////////////////////////////////
void setParticleLife(float floor, float ceil);
void setParticleLife(float time);
void setParticleLinearAccelaration(Math::Vector2<float> ac);
void setParticleRadialAccelaration(float ra);
void setParticleAngularSpeed(float floor, float ceil);
void setParticleAngularSpeed(float speed);
void setParticleSpritesMode(SpriteMode mode);
void addParticleSprite(const Sprite* sprite);
void addParticleSprites(uint count, ...);
void addParticleSprites(const std::vector<const Sprite*>& sprs);
void removeParticleSprite(uint i);
void enableParticleBlendAdditive(bool enable);
void setParticleScale(float scale);
void addParticleScalePoint(float scale, float t);
void removeParticleScalePoint(uint i);
void setParticleColor(Color tint);
void addParticleColorPoint(Color tint, float t);
void removeParticleColorPoint(uint i);
void setParticleTransparency(float transparency);
void addParticleTransparencyPoint(float transparency, float t);
void removeParticleTransparencyPoint(uint i);
private:
friend class ParticleEmitter;
///
/// Particle system position.
///
Math::Vector2<float> mPosition;
///
///
///
Particle* claim();
///
///
///
void recycle(int i, Particle* p);
///
/// Particle system definition.
///
ParticleSystemDef mDef;
///
/// Particle emitter.
///
ParticleEmitter mEmitter;
///
/// Particle pool.
///
ParticlePool mParticlePool;
///
/// Alive particles, that means these particles could join to the life cycle loop.
///
std::vector<Particle*> mAliveParticles;
};
} // namespace Particles
} // namespace Graphics
} // namespace JinEngine
#endif
|