aboutsummaryrefslogtreecommitdiff
path: root/src/libjin/graphics/particles
diff options
context:
space:
mode:
Diffstat (limited to 'src/libjin/graphics/particles')
-rw-r--r--src/libjin/graphics/particles/je_particle.cpp9
-rw-r--r--src/libjin/graphics/particles/je_particle.h10
-rw-r--r--src/libjin/graphics/particles/je_particle_emitter.cpp8
-rw-r--r--src/libjin/graphics/particles/je_particle_system.cpp39
-rw-r--r--src/libjin/graphics/particles/je_particle_system.h14
5 files changed, 73 insertions, 7 deletions
diff --git a/src/libjin/graphics/particles/je_particle.cpp b/src/libjin/graphics/particles/je_particle.cpp
index 6cab9db..00e593f 100644
--- a/src/libjin/graphics/particles/je_particle.cpp
+++ b/src/libjin/graphics/particles/je_particle.cpp
@@ -127,6 +127,11 @@ namespace JinEngine
float t = life / lifeTime;
if ((updateFlags & UPDATE_COLOR) != 0)
color = def->colorDef.overTime.value.getColor(t);
+ // transparency
+ if (def->transparencyDef.overTime.enable)
+ color.a *= def->transparencyDef.overTime.value.getValue(t);
+ else
+ color.a *= def->transparencyDef.transparency.value;
if ((updateFlags & UPDATE_SCALE) != 0)
{
// Lerp scale.
@@ -151,8 +156,8 @@ namespace JinEngine
int n = def->spritesDef.sprites.size();
if (def->spritesDef.mode == SpriteMode::ANIMATED)
spriteIndex = lerp<int>(0, n - 1, t);
- else
- spriteIndex = rng.rand(0, n - 1);
+ //else
+ // spriteIndex = rng.rand(0, n - 1);
}
life += dt;
alive = life < lifeTime;
diff --git a/src/libjin/graphics/particles/je_particle.h b/src/libjin/graphics/particles/je_particle.h
index 1efdc11..bef3e6d 100644
--- a/src/libjin/graphics/particles/je_particle.h
+++ b/src/libjin/graphics/particles/je_particle.h
@@ -78,6 +78,15 @@ namespace JinEngine
);
};
+ struct TransparencyDef
+ {
+ Math::Percentage transparency = 1.f;
+ Struct(overTime,
+ bool enable = false;
+ ScaledRangedValue value;
+ );
+ };
+
struct linearAccelarationDef
{
Math::Vector2<float> linearAccelaration;
@@ -135,6 +144,7 @@ namespace JinEngine
// Optional definitions.
ScaleDef scaleDef; ///<
ColorDef colorDef; ///<
+ TransparencyDef transparencyDef; ///<
private:
friend class ParticleEmitter;
diff --git a/src/libjin/graphics/particles/je_particle_emitter.cpp b/src/libjin/graphics/particles/je_particle_emitter.cpp
index 533bbf4..47957b6 100644
--- a/src/libjin/graphics/particles/je_particle_emitter.cpp
+++ b/src/libjin/graphics/particles/je_particle_emitter.cpp
@@ -60,7 +60,9 @@ namespace JinEngine
p->transform.setPosition(x, y);
}
else
- p->transform.setPosition(mDef.positionDef.position.position);
+ {
+ p->transform.setPosition(mDef.positionDef.position.position + mPS.mPosition);
+ }
// Init speed.
float r = 0;
if (mDef.directionDef.enableRandom)
@@ -104,7 +106,11 @@ namespace JinEngine
p->color = mPDef.colorDef.color;
// Sprite
if (mPDef.spritesDef.mode != SpriteMode::SINGLE)
+ {
p->updateFlags |= Particle::UPDATE_SPRITE;
+ if (mPDef.spritesDef.mode == SpriteMode::RANDOM)
+ p->spriteIndex = rng.rand(0, mPDef.spritesDef.sprites.size() - 1);
+ }
}
}
diff --git a/src/libjin/graphics/particles/je_particle_system.cpp b/src/libjin/graphics/particles/je_particle_system.cpp
index d16b918..2c2f9bb 100644
--- a/src/libjin/graphics/particles/je_particle_system.cpp
+++ b/src/libjin/graphics/particles/je_particle_system.cpp
@@ -1,3 +1,5 @@
+#include <stdarg.h>
+
#include "je_particle_system.h"
namespace JinEngine
@@ -7,6 +9,12 @@ namespace JinEngine
namespace Particles
{
+ ParticleSystem::ParticleSystem(uint maxCount)
+ : mEmitter(*this)
+ , mParticlePool(maxCount, sizeof(Particle))
+ {
+ }
+
ParticleSystem::ParticleSystem(const ParticleSystemDef& def)
: mDef(def)
, mEmitter(*this)
@@ -164,11 +172,23 @@ namespace JinEngine
mDef.particleDef.spritesDef.mode = mode;
}
- void ParticleSystem::addParticleSprites(const Sprite* sprite)
+ void ParticleSystem::addParticleSprite(const Sprite* sprite)
{
mDef.particleDef.spritesDef.sprites.push_back(sprite);
}
+ void ParticleSystem::addParticleSprites(uint count, ...)
+ {
+ va_list args;
+ va_start(args, count);
+ while (count--)
+ {
+ Sprite* spr = va_arg(args, Sprite*);
+ addParticleSprite(spr);
+ }
+ va_end(args);
+ }
+
void ParticleSystem::removeParticleSprite(uint i)
{
mDef.particleDef.spritesDef.sprites.erase(mDef.particleDef.spritesDef.sprites.begin() + i);
@@ -213,6 +233,23 @@ namespace JinEngine
mDef.particleDef.colorDef.overTime.value.removeColor(i);
}
+ void ParticleSystem::setParticleTransparency(float transparency)
+ {
+ mDef.particleDef.transparencyDef.overTime.enable = false;
+ mDef.particleDef.transparencyDef.transparency = transparency;
+ }
+
+ void ParticleSystem::addParticleTransparencyPoint(float transparency, float t)
+ {
+ mDef.particleDef.transparencyDef.overTime.enable = true;
+ mDef.particleDef.transparencyDef.overTime.value.addPoint(t, transparency);
+ }
+
+ void ParticleSystem::removeParticleTransparencyPoint(uint i)
+ {
+ mDef.particleDef.transparencyDef.overTime.value.removePoint(i);
+ }
+
}
}
} \ No newline at end of file
diff --git a/src/libjin/graphics/particles/je_particle_system.h b/src/libjin/graphics/particles/je_particle_system.h
index 1a07588..20f39dc 100644
--- a/src/libjin/graphics/particles/je_particle_system.h
+++ b/src/libjin/graphics/particles/je_particle_system.h
@@ -44,6 +44,11 @@ namespace JinEngine
ParticleSystem(const ParticleSystemDef& def);
///
+ ///
+ ///
+ ParticleSystem(uint maxCount = 64);
+
+ ///
/// Particle system destructor.
///
~ParticleSystem();
@@ -109,7 +114,8 @@ namespace JinEngine
void setParticleAngularSpeed(float speed);
void setParticleSpritesMode(SpriteMode mode);
- void addParticleSprites(const Sprite* sprite);
+ void addParticleSprite(const Sprite* sprite);
+ void addParticleSprites(uint count, ...);
void removeParticleSprite(uint i);
void enableParticleBlendAdditive(bool enable);
@@ -122,12 +128,14 @@ namespace JinEngine
void addParticleColorPoint(Color color, float t);
void removeParticleColorPoint(uint i);
+ void setParticleTransparency(float transparency);
+ void addParticleTransparencyPoint(float transparency, float t);
+ void removeParticleTransparencyPoint(uint i);
+
private:
friend class ParticleEmitter;
- ParticleSystem();
-
///
/// Particle system position.
///