aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/libjin/Common/je_temporary.h4
-rw-r--r--src/libjin/Graphics/animation/je_animation.h1
-rw-r--r--src/libjin/Graphics/animation/je_clip.h2
-rw-r--r--src/libjin/Graphics/je_color.h21
-rw-r--r--src/libjin/Graphics/je_graphic.h2
-rw-r--r--src/libjin/Graphics/je_sprite_batch.h3
-rw-r--r--src/libjin/Graphics/particle/je_particle.h66
-rw-r--r--src/libjin/Graphics/particle/je_particle_batch.h20
-rw-r--r--src/libjin/Graphics/particle/je_particle_emitter.cpp11
-rw-r--r--src/libjin/Graphics/particle/je_particle_emitter.h37
-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.h53
-rw-r--r--src/libjin/Graphics/particle/je_particle_system.cpp12
-rw-r--r--src/libjin/Graphics/particle/je_particle_system.h85
-rw-r--r--src/libjin/Math/je_math.h6
-rw-r--r--src/lua/modules/graphics/je_lua_particle_system.cpp11
16 files changed, 272 insertions, 62 deletions
diff --git a/src/libjin/Common/je_temporary.h b/src/libjin/Common/je_temporary.h
index 5af8704..9a127da 100644
--- a/src/libjin/Common/je_temporary.h
+++ b/src/libjin/Common/je_temporary.h
@@ -1,5 +1,5 @@
-#ifndef __JE_ON_STACK_H
-#define __JE_ON_STACK_H
+#ifndef __JE_TEMPORARY_H
+#define __JE_TEMPORARY_H
namespace JinEngine
{
diff --git a/src/libjin/Graphics/animation/je_animation.h b/src/libjin/Graphics/animation/je_animation.h
index b3bb9fb..ca5758f 100644
--- a/src/libjin/Graphics/animation/je_animation.h
+++ b/src/libjin/Graphics/animation/je_animation.h
@@ -23,7 +23,6 @@ namespace JinEngine
void play();
void switchClipByKey(const std::string& key);
- void switchClipByName(const std::string& name);
void switchClip(const Clip* clip);
///
diff --git a/src/libjin/Graphics/animation/je_clip.h b/src/libjin/Graphics/animation/je_clip.h
index cfa579f..eedffc0 100644
--- a/src/libjin/Graphics/animation/je_clip.h
+++ b/src/libjin/Graphics/animation/je_clip.h
@@ -25,7 +25,7 @@ namespace JinEngine
private:
///
- /// Frames
+ /// Key frames.
///
std::vector<Sprite*> mFrames;
diff --git a/src/libjin/Graphics/je_color.h b/src/libjin/Graphics/je_color.h
index 8fe7691..10d2818 100644
--- a/src/libjin/Graphics/je_color.h
+++ b/src/libjin/Graphics/je_color.h
@@ -6,6 +6,8 @@
#include "../core/je_configuration.h"
#if defined(jin_graphics)
+#include "../math/je_math.h"
+
#include "../common/je_types.h"
#include "../utils/je_endian.h"
@@ -28,6 +30,25 @@ namespace JinEngine
static const Color MAGENTA;
static const Color YELLOW;
+ ///
+ /// Get lerp color with given factor.
+ ///
+ /// @param start Start color.
+ /// @param end End color.
+ /// @param t Factor of interplation.
+ /// @return Color after interplation.
+ ///
+ static Color lerp(Color start, Color end, float t)
+ {
+ t = Math::clamp<float>(t, 0, 1);
+ Color c;
+ c.r = Math::lerp(start.r, end.r, t);
+ c.g = Math::lerp(start.g, end.g, t);
+ c.b = Math::lerp(start.b, end.b, t);
+ c.a = Math::lerp(start.a, end.a, t);
+ return c;
+ }
+
///
///
///
diff --git a/src/libjin/Graphics/je_graphic.h b/src/libjin/Graphics/je_graphic.h
index 5d5b2a5..d18575e 100644
--- a/src/libjin/Graphics/je_graphic.h
+++ b/src/libjin/Graphics/je_graphic.h
@@ -49,7 +49,7 @@ namespace JinEngine
///
///
///
- void render(const Math::Quad& slice, int x, int y, float sx = 1, float sy = 1, float r = 0, float ax = 0, float ay = 0);
+ void render(const Math::Quad& slice, int x, int y, float sx = 1, float sy = 1, float r = 0, float ox = 0, float oy = 0);
///
///
diff --git a/src/libjin/Graphics/je_sprite_batch.h b/src/libjin/Graphics/je_sprite_batch.h
index 85a7951..359ce24 100644
--- a/src/libjin/Graphics/je_sprite_batch.h
+++ b/src/libjin/Graphics/je_sprite_batch.h
@@ -6,6 +6,9 @@ namespace JinEngine
namespace Graphics
{
+ ///
+ /// For reducing draw call.
+ ///
class SpriteBatch
{
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
diff --git a/src/libjin/Math/je_math.h b/src/libjin/Math/je_math.h
index 1f8e0b3..e7c3ec5 100644
--- a/src/libjin/Math/je_math.h
+++ b/src/libjin/Math/je_math.h
@@ -71,6 +71,12 @@ namespace JinEngine
return a + t * (b - a);
}
+ float lerp(float a, float b, float f)
+ {
+ f = clamp<float>(f, 0, 1);
+ return a + f * (b - a);
+ }
+
} // namespace Math
} // namespace JinEngine
diff --git a/src/lua/modules/graphics/je_lua_particle_system.cpp b/src/lua/modules/graphics/je_lua_particle_system.cpp
new file mode 100644
index 0000000..7099a5c
--- /dev/null
+++ b/src/lua/modules/graphics/je_lua_particle_system.cpp
@@ -0,0 +1,11 @@
+#include "libjin/jin.h"
+
+namespace JinEngine
+{
+ namespace Lua
+ {
+
+
+
+ } // Lua
+} // namespace JinEngine \ No newline at end of file