aboutsummaryrefslogtreecommitdiff
path: root/src/libjin/Graphics/particle/je_particle_system.h
blob: 270d9a837dc8e01c29ea5b2fe6e5d2ced3a6c07c (plain)
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
#ifndef __JE_PARTICLE_EMMITTER_H
#define __JE_PARTICLE_EMMITTER_H

#include <vector>

#include "../../common/je_temporary.h"
#include "../../game/je_game_object.h"

#include "../je_sprite.h"

#include "je_particle_emitter.h"
#include "je_particle_pool.h"
#include "je_particle.h"

namespace JinEngine
{
    namespace Graphics
    {

        ///
        /// Definition of particle system.
        ///
        struct ParticleSystemDef : public Temporary
        {
            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 Game::GameObject
        {
        public:
            ///
            /// Particle system constructor 
            /// 
            /// @param def Definition of particle system.
            ///
            ParticleSystem(const ParticleSystemDef& def);

            ///
            /// Particle system destructor.
            ///
            ~ParticleSystem();

            ///
            /// Render particle system's all particles.
            ///
            void render(int x, int y, float sx = 1, float sy = 1, float r = 0, float ax = 0, float ay = 0);

            ///
            /// Set sprite to render. 
            /// 
            /// @param sprite Sprite to render.
            ///
            void setSprite(Sprite* sprite);

            /// 
            /// Release particle and make it available in particle pool.
            /// 
            void releaseParticle();

        private:
            // Disable default constructor.
            ParticleSystem();

            ///
            /// Sprite to be drawn.
            ///
            Sprite* mSprite;

            ///
            /// Particle emitter.
            ///
            ParticleEmitter mEmitter;
            ParticlePool mParticlePool;
            
            ///
            /// Alive particles, that means these particles could join to the life cycle loop.
            ///
            std::vector<Particle*> mAliveParticles;

        };

    } // namespace Graphics
} // namespace JinEngine 

#endif