diff options
Diffstat (limited to 'src/libjin/Graphics/particle')
-rw-r--r-- | src/libjin/Graphics/particle/je_particle.h | 66 | ||||
-rw-r--r-- | src/libjin/Graphics/particle/je_particle_batch.h | 20 | ||||
-rw-r--r-- | src/libjin/Graphics/particle/je_particle_emitter.cpp | 11 | ||||
-rw-r--r-- | src/libjin/Graphics/particle/je_particle_emitter.h | 37 | ||||
-rw-r--r-- | src/libjin/Graphics/particle/je_particle_pool.cpp (renamed from src/libjin/Graphics/particle/je_particle_batch.cpp) | 0 | ||||
-rw-r--r-- | src/libjin/Graphics/particle/je_particle_pool.h | 53 | ||||
-rw-r--r-- | src/libjin/Graphics/particle/je_particle_system.cpp | 12 | ||||
-rw-r--r-- | src/libjin/Graphics/particle/je_particle_system.h | 85 |
8 files changed, 227 insertions, 57 deletions
diff --git a/src/libjin/Graphics/particle/je_particle.h b/src/libjin/Graphics/particle/je_particle.h index d32d9fe..474e15b 100644 --- a/src/libjin/Graphics/particle/je_particle.h +++ b/src/libjin/Graphics/particle/je_particle.h @@ -8,33 +8,61 @@ namespace JinEngine namespace Graphics { + class ParticleSystem; + /// - /// Single particle. Grab from love2d. + /// A single particle contains various properties of particle, such as position, accelaration, color and + /// other attributes changed over time. /// - class Particle + struct Particle { - public: + /// + /// Whole life time. + /// + float lifeTime = 0.0f; + + /// + /// Current life time. + /// + float life = 0.0f; + + /// + /// Current position. + /// + float position[2] = {0,0}; + + /// + /// Emitte direction. + /// + float direction = 0; + + Math::Vector2<float> speed; + Math::Vector2<float> linearAcceleration; + float radialAcceleration = 0; + float tangetialAcceleration = 0; - private: - float mLifeTime; - float mLife; - float mPosition[2]; - float mDirection; + /// + /// Size over lifetime. + /// + float size = 1; + float sizeBegin = 1; + float sizeEnd = 1; - Math::Vector2<float> mSpeed; - float mGravity; - float mRadialAcceleration; - float mTangetialAcceleration; + float rotation = 0; + float angle = 0; - float mSize; - float mSizeStart; - float mSizeEnd; + /// + /// Color over lifetime. + /// + Color color = Color::WHITE; + Color colorStart = Color::WHITE; + Color colorEnd = Color::WHITE; - float mRotation; - float mSpinStart; - float mSpinEnd; + /// + /// Is particle still alive? Alive is equivalent to NOT available in particle pool. + /// + bool alive = false; - float color[4]; }; } // namespace Graphics diff --git a/src/libjin/Graphics/particle/je_particle_batch.h b/src/libjin/Graphics/particle/je_particle_batch.h deleted file mode 100644 index 19f4ded..0000000 --- a/src/libjin/Graphics/particle/je_particle_batch.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef __JE_PARTICLE_BATCH_H -#define __JE_PARTICLE_BATCH_H - -namespace JinEngine -{ - namespace Graphics - { - - /// - /// - /// - class ParticleBatch - { - - }; - - } // namespace Graphics -} // namespace JinEngine - -#endif
\ No newline at end of file diff --git a/src/libjin/Graphics/particle/je_particle_emitter.cpp b/src/libjin/Graphics/particle/je_particle_emitter.cpp index d57d5ed..e69de29 100644 --- a/src/libjin/Graphics/particle/je_particle_emitter.cpp +++ b/src/libjin/Graphics/particle/je_particle_emitter.cpp @@ -1,11 +0,0 @@ -#include "je_particle_emitter.h" - -namespace JinEngine -{ - namespace Graphics - { - - - - } -} diff --git a/src/libjin/Graphics/particle/je_particle_emitter.h b/src/libjin/Graphics/particle/je_particle_emitter.h index e191e36..95b7875 100644 --- a/src/libjin/Graphics/particle/je_particle_emitter.h +++ b/src/libjin/Graphics/particle/je_particle_emitter.h @@ -1,5 +1,10 @@ -#ifndef __JE_PARTICLE_EMMITTER_H -#define __JE_PARTICLE_EMMITTER_H +#ifndef __JE_PARTICLE_EMITTER_H +#define __JE_PARTICLE_EMITTER_H + +#include "../../common/je_temporary.h" +#include "../../math/je_vector2.hpp" + +#include "je_particle.h" namespace JinEngine { @@ -7,17 +12,37 @@ namespace JinEngine { /// - /// Particle emitter + /// Definition of particle emitter. /// + struct ParticleEmitterDef : public Temporary + { + Math::Vector2<float> position; + + }; + class ParticleEmitter { public: + ParticleEmitter(const ParticleEmitterDef& def); + + /// + /// Create new particle. + /// + Particle* emit(); + + /// + /// Emitter position. + /// + Math::Vector2<float> mPosition; - private: + /// + /// + /// + float mDirection; }; - } -} + } // namespace Graphics +} // namespace JinEngine #endif
\ No newline at end of file diff --git a/src/libjin/Graphics/particle/je_particle_batch.cpp b/src/libjin/Graphics/particle/je_particle_pool.cpp index e69de29..e69de29 100644 --- a/src/libjin/Graphics/particle/je_particle_batch.cpp +++ b/src/libjin/Graphics/particle/je_particle_pool.cpp diff --git a/src/libjin/Graphics/particle/je_particle_pool.h b/src/libjin/Graphics/particle/je_particle_pool.h new file mode 100644 index 0000000..f1f6214 --- /dev/null +++ b/src/libjin/Graphics/particle/je_particle_pool.h @@ -0,0 +1,53 @@ +#ifndef __JE_PARTICLE_BATCH_H +#define __JE_PARTICLE_BATCH_H + +#include <list> + +#include "je_particle.h" + +namespace JinEngine +{ + namespace Graphics + { + + /// + /// Particle pool for reducing memory fragmentation. + /// + class ParticlePool + { + public: + + /// + /// Particle pool constructor. + /// + /// @param count Max count of particles. + /// + ParticlePool(uint count); + + /// + /// Particle pool destructor. + /// + ~ParticlePool(); + + /// + /// Claim a particle if available. + /// + Particle* claim(); + + /// + /// Recycle particle if the particle is no more alive. + /// + void recycle(Particle* particle); + + private: + /// + /// All particles include available and inavailable particles. + /// + std::list<Particle> particles; + + }; + + } // namespace Graphics +} // namespace JinEngine + +#endif
\ No newline at end of file diff --git a/src/libjin/Graphics/particle/je_particle_system.cpp b/src/libjin/Graphics/particle/je_particle_system.cpp index 6f70f09..68f8f21 100644 --- a/src/libjin/Graphics/particle/je_particle_system.cpp +++ b/src/libjin/Graphics/particle/je_particle_system.cpp @@ -1 +1,11 @@ -#pragma once +#include "je_particle_system.h" + +namespace JinEngine +{ + namespace Graphics + { + + + + } +} diff --git a/src/libjin/Graphics/particle/je_particle_system.h b/src/libjin/Graphics/particle/je_particle_system.h index e69de29..c5db938 100644 --- a/src/libjin/Graphics/particle/je_particle_system.h +++ b/src/libjin/Graphics/particle/je_particle_system.h @@ -0,0 +1,85 @@ +#ifndef __JE_PARTICLE_EMMITTER_H +#define __JE_PARTICLE_EMMITTER_H + +#include <vector> + +#include "../../common/je_temporary.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. 1 by default. + + }; + + /// + /// Particle emitter, handle all particles it emitts. + /// + class ParticleSystem + { + 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: + /// + /// 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
\ No newline at end of file |