diff options
Diffstat (limited to 'src/libjin/graphics/particles')
-rw-r--r-- | src/libjin/graphics/particles/je_particle.cpp | 9 | ||||
-rw-r--r-- | src/libjin/graphics/particles/je_particle.h | 10 | ||||
-rw-r--r-- | src/libjin/graphics/particles/je_particle_emitter.cpp | 8 | ||||
-rw-r--r-- | src/libjin/graphics/particles/je_particle_system.cpp | 39 | ||||
-rw-r--r-- | src/libjin/graphics/particles/je_particle_system.h | 14 |
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. /// |