diff options
Diffstat (limited to 'src/libjin/Graphics/particles')
-rw-r--r-- | src/libjin/Graphics/particles/je_particle.cpp | 26 | ||||
-rw-r--r-- | src/libjin/Graphics/particles/je_particle.h | 178 | ||||
-rw-r--r-- | src/libjin/Graphics/particles/je_particle_emitter.cpp | 42 | ||||
-rw-r--r-- | src/libjin/Graphics/particles/je_particle_emitter.h | 112 | ||||
-rw-r--r-- | src/libjin/Graphics/particles/je_particle_pool.h | 24 | ||||
-rw-r--r-- | src/libjin/Graphics/particles/je_particle_system.cpp | 11 | ||||
-rw-r--r-- | src/libjin/Graphics/particles/je_particle_system.h | 103 |
7 files changed, 496 insertions, 0 deletions
diff --git a/src/libjin/Graphics/particles/je_particle.cpp b/src/libjin/Graphics/particles/je_particle.cpp new file mode 100644 index 0000000..20bbd03 --- /dev/null +++ b/src/libjin/Graphics/particles/je_particle.cpp @@ -0,0 +1,26 @@ +#include "je_particle.h" + +namespace JinEngine +{ + namespace Graphics + { + namespace Particles + { + + void Particle::reset() + { + lifeTime = 0.0f; + life = 0.0f; + position.set(0, 0); + direction = 0.0f; + speed.set(0, 0); + linearAcceleration.set(0, 0); + radialAcceleration = 0.0f; + size = 1; + sizeBegin = 1; + alive = true; + } + + } + } +}
\ No newline at end of file diff --git a/src/libjin/Graphics/particles/je_particle.h b/src/libjin/Graphics/particles/je_particle.h new file mode 100644 index 0000000..2d112d1 --- /dev/null +++ b/src/libjin/Graphics/particles/je_particle.h @@ -0,0 +1,178 @@ +#ifndef __JE_PARTICLE_H__ +#define __JE_PARTICLE_H__ + +#include "../../math/je_vector2.hpp" +#include "../je_color.h" + +namespace JinEngine +{ + namespace Graphics + { + namespace Particles + { + + class ParticleEmitter; + + /// + /// + /// + struct LifeTimeDef + { + bool enableRandom = false; + union + { + struct + { + float min, max; + } random; + float life; + } life; + }; + + /// + /// + /// + struct SpeedOverTimeDef + { + bool enable = false; + bool enableRandom = false; + union + { + struct + { + Math::Vector2<float> startFloor; + Math::Vector2<float> startCeil; + Math::Vector2<float> endFloor; + Math::Vector2<float> endCeil; + } random; + struct + { + Math::Vector2<float> start; + Math::Vector2<float> end; + } speed; + } speed; + }; + + struct SizeOverTimeDef + { + bool enable = false; + bool enableRandom = false; + union { + struct { + float startFloor = 1; + float startCeil = 1; + float endFloor = 1; + float endCeil = 1; + } random; + struct { + float start = 1; + float end = 1; + } size; + } size; + }; + + struct ColorOverTimeDef + { + bool enable = false; + Color colorStart = Color::WHITE; + Color colorEnd = Color::WHITE; + }; + + struct linearAccelarationDef + { + Math::Vector2<float> linearAccelaration; + }; + + struct RadialAccelarationDef + { + float radialAccelaration; + }; + + /// + /// + /// + struct ParticleDef + { + private: + friend class ParticleEmitter; + + public: + // Basic definitions. + LifeTimeDef lifeTimeDef; ///< + linearAccelarationDef linearAccelarationDef; ///< + RadialAccelarationDef radialAccelarationDef; ///< + // Optional definitions. + SpeedOverTimeDef speedOverTimeDef; ///< + SizeOverTimeDef sizeOverTimeDef; ///< + ColorOverTimeDef colorOverTimeDef; ///< + }; + + /// + /// A single particle contains various properties of particle, such as position, accelaration, color and + /// other attributes changed over time. + /// + struct Particle + { + /// + /// Default constructor. + /// + Particle() {}; + + /// + /// Reset to default. + /// + void reset(); + + /// + /// Whole life time. + /// + float lifeTime = 0.0f; + + /// + /// Current life time. + /// + float life = 0.0f; + + /// + /// Current position. + /// + Math::Vector2<float> position; + + /// + /// Emitte direction. + /// + float direction = 0; + + Math::Vector2<float> speed; + Math::Vector2<float> linearAcceleration; + float radialAcceleration = 0; + + /// + /// Size over lifetime. + /// + float size = 1; + float sizeBegin = 1; + float sizeEnd = 1; + + float rotation = 0; + float angle = 0; + + /// + /// Color over lifetime. + /// + Color color = Color::WHITE; + Color colorStart = Color::WHITE; + Color colorEnd = Color::WHITE; + + /// + /// Is particle still alive? Alive is equivalent to NOT available in particle pool. + /// + bool alive = true; + + }; + + } // namespace Particles + } // namespace Graphics +} // namespace JinEngine + +#endif
\ No newline at end of file diff --git a/src/libjin/Graphics/particles/je_particle_emitter.cpp b/src/libjin/Graphics/particles/je_particle_emitter.cpp new file mode 100644 index 0000000..edc4bee --- /dev/null +++ b/src/libjin/Graphics/particles/je_particle_emitter.cpp @@ -0,0 +1,42 @@ +#include <time.h> + +#include "../../math/je_random.h" + +#include "je_particle_emitter.h" + +using namespace JinEngine::Math; + +namespace JinEngine +{ + namespace Graphics + { + namespace Particles + { + + // Particle emitter + static RandomGenerator rnd(time(NULL)); + + ParticleEmitter::ParticleEmitter(ParticleSystem& ps) + : mParticleSystem(ps) + { + } + + void ParticleEmitter::update(float dt) + { + mTime += dt; + if (mTime < 1) + return; + + + mTime -= 1; + } + + void ParticleEmitter::emit() + { + + + } + + } + } +}
\ No newline at end of file diff --git a/src/libjin/Graphics/particles/je_particle_emitter.h b/src/libjin/Graphics/particles/je_particle_emitter.h new file mode 100644 index 0000000..9200532 --- /dev/null +++ b/src/libjin/Graphics/particles/je_particle_emitter.h @@ -0,0 +1,112 @@ +#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 +{ + namespace Graphics + { + namespace Particles + { + + struct PositionDef + { + bool enableRandom = false; + union + { + struct + { + Math::Vector2<float> min; + Math::Vector2<float> max; + } random; + Math::Vector2<float> position; + } position; + }; + + struct DirectionDef + { + bool enableRandom = false; + union + { + struct + { + float min = 0; + float max = 0; + } random; + float direction = 0; + } direction; + }; + + /// + /// How many particles emitted per second. + /// + struct EmitRateDef + { + bool enableRandom = false; + union + { + struct + { + float min = 1; + float max = 1; + } random; + float rate = 1; + } rate; + }; + + /// + /// Definition of particle emitter. + /// + struct ParticleEmitterDef : public Temporary + { + PositionDef positionDef; ///< Emit position(relativily to the particle system center). + DirectionDef directionDef; ///< Emit direction. + EmitRateDef emitRateDef; ///< Emit rate. + }; + + class ParticleSystem; + + /// + /// Emit a single particle. + /// + class ParticleEmitter + { + public: + /// + /// + /// + ParticleEmitter(ParticleSystem& ps); + + /// + /// + /// + void update(float dt); + + private: + /// + /// + /// + ParticleSystem& mParticleSystem; + + /// + /// Emit a particle according to emitter definition and particle definition, particle system should + /// assign particle value to the particle in particle pool, but not use this return particle. + /// + void emit(); + + /// + /// + /// + float mTime; + + }; + + } // namespace Particles + } // namespace Graphics +} // namespace JinEngine + +#endif
\ No newline at end of file diff --git a/src/libjin/Graphics/particles/je_particle_pool.h b/src/libjin/Graphics/particles/je_particle_pool.h new file mode 100644 index 0000000..46cd73a --- /dev/null +++ b/src/libjin/Graphics/particles/je_particle_pool.h @@ -0,0 +1,24 @@ +#ifndef __JE_PARTICLE_BATCH_H__ +#define __JE_PARTICLE_BATCH_H__ + +#include "../../common/je_pool.hpp" + +#include "je_particle.h" + +namespace JinEngine +{ + namespace Graphics + { + namespace Particles + { + + /// + /// Particle pool for reducing memory fragmentation. + /// + typedef Pool<Particle> ParticlePool; + + } // namespace Particles + } // namespace Graphics +} // namespace JinEngine + +#endif
\ No newline at end of file diff --git a/src/libjin/Graphics/particles/je_particle_system.cpp b/src/libjin/Graphics/particles/je_particle_system.cpp new file mode 100644 index 0000000..68f8f21 --- /dev/null +++ b/src/libjin/Graphics/particles/je_particle_system.cpp @@ -0,0 +1,11 @@ +#include "je_particle_system.h" + +namespace JinEngine +{ + namespace Graphics + { + + + + } +} diff --git a/src/libjin/Graphics/particles/je_particle_system.h b/src/libjin/Graphics/particles/je_particle_system.h new file mode 100644 index 0000000..afa96b2 --- /dev/null +++ b/src/libjin/Graphics/particles/je_particle_system.h @@ -0,0 +1,103 @@ +#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 : 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(); + + /// + /// Update particle system and all alive particles. + /// + void update(float sec); + + /// + /// Render particle system. + /// + 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); + + private: + // Disable default constructor. + ParticleSystem(); + + /// + /// Particle system definition. + /// + ParticleSystemDef mDef; + + /// + /// Sprite to be drawn. + /// + Sprite* mSprite; + + /// + /// 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
\ No newline at end of file |