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
|
#ifndef __JE_PARTICLE_EMMITTER_H__
#define __JE_PARTICLE_EMMITTER_H__
#include <vector>
#include "../../common/je_temporary.h"
#include "../../game/je_gameobject.h"
#include "../je_sprite.h"
#include "je_particle_emitter.h"
#include "je_particle_pool.h"
#include "je_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 IRenderable, public Game::GameObject
{
public:
///
/// Particle system constructor
///
/// @param def Definition of particle system.
///
ParticleSystem(const ParticleSystemDef& def);
///
/// Particle system destructor.
///
~ParticleSystem();
///
/// 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 Emitter 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 addParticleSprites(const Sprite* sprite);
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 color);
void addParticleColorPoint(Color color, float t);
void removeParticleColorPoint(uint i);
private:
friend class ParticleEmitter;
ParticleSystem();
///
/// 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
|