diff options
author | chai <chaifix@163.com> | 2020-02-11 11:29:07 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2020-02-11 11:29:07 +0800 |
commit | 160e1299ef3d95f8e8c48706d7f61dd3dc6c6b60 (patch) | |
tree | abe5ae5242d9cc6caf6edf103e662c44e978fca0 /src/libjin/graphics/particles/particle.cpp | |
parent | e095043485d1d298571af6d9eca7f0db9009ea7a (diff) |
Diffstat (limited to 'src/libjin/graphics/particles/particle.cpp')
-rw-r--r-- | src/libjin/graphics/particles/particle.cpp | 352 |
1 files changed, 176 insertions, 176 deletions
diff --git a/src/libjin/graphics/particles/particle.cpp b/src/libjin/graphics/particles/particle.cpp index 74600e0..ba07344 100644 --- a/src/libjin/graphics/particles/particle.cpp +++ b/src/libjin/graphics/particles/particle.cpp @@ -11,180 +11,180 @@ using namespace JinEngine::Math; namespace JinEngine { - namespace Graphics - { - namespace Particles - { - - static RandomGenerator rng(0xEA44944); - - ////////////////////////////////////////////////////////////////////////////////////////////////////// - // ScaledRangedValue - ////////////////////////////////////////////////////////////////////////////////////////////////////// - - ScaledRangedValue::ScaledRangedValue(Percentage* points, uint n) - { - for (int i = 0; i < n; ++i) - { - float x = points[2 * i].value; - float y = points[2 * i + 1].value; - addPoint(x, y); - } - } - - void ScaledRangedValue::set(Math::Percentage* points, uint n) - { - clear(); - for (int i = 0; i < n; ++i) - { - float x = points[2 * i].value; - float y = points[2 * i + 1].value; - addPoint(x, y); - } - } - - ////////////////////////////////////////////////////////////////////////////////////////////////////// - // GradientColorValue - ////////////////////////////////////////////////////////////////////////////////////////////////////// - - GradientColorValue::GradientColorValue() - : mCount(0) - { - } - - void GradientColorValue::addColor(Color col, Percentage time) - { - mColors.push_back(col); - mTimeline.push_back(time); - ++mCount; - } - - Color GradientColorValue::getColor(Percentage time) - { - int endIndex = -1; - int n = mCount; - for (int i = 1; i < n; i++) { - Percentage t = mTimeline[i]; - if (t.value > time.value) { - endIndex = i; - break; - } - } - if (endIndex == -1) return mColors[n - 1]; - int startIndex = endIndex - 1; - Color& startValue = mColors[startIndex]; - Color& endValue = mColors[endIndex]; - float t = time.value; - float start = mTimeline[startIndex].value; - float end = mTimeline[endIndex].value; - Color c; - c.r = startValue.r + (endValue.r - startValue.r) * ((t - start) / (end - start)); - c.g = startValue.g + (endValue.g - startValue.g) * ((t - start) / (end - start)); - c.b = startValue.b + (endValue.b - startValue.b) * ((t - start) / (end - start)); - c.a = startValue.a + (endValue.a - startValue.a) * ((t - start) / (end - start)); - return c; - } - - void GradientColorValue::insertColor(uint i, Color col, Math::Percentage time) - { - mColors.insert(mColors.begin() + i, col); - mTimeline.insert(mTimeline.begin() + i, time); - ++mCount; - } - - void GradientColorValue::removeColor(uint i) - { - mColors.erase(mColors.begin() + i); - mTimeline.erase(mTimeline.begin() + i); - --mCount; - } - - ////////////////////////////////////////////////////////////////////////////////////////////////////// - // Particle - ////////////////////////////////////////////////////////////////////////////////////////////////////// - - Particle::Particle() - { - reset(); - } - - void Particle::reset() - { - updateFlags = ParticleUpdateMask::NONE; - transform.set(0, 0, 1, 1, 0, 0, 0); - lifeTime = 1.0f; - life = 0.0f; - velocity.set(0, 0); - linearAcceleration.set(0, 0); - radialAcceleration = 0.0f; - angularSpeed = 0; - color = Color::WHITE; - alive = true; - spriteIndex = 0; - } - - void Particle::update(float dt) - { - life += dt; - alive = life < lifeTime; - if (!alive) - return; - float t = life / lifeTime; - if ((updateFlags & UPDATE_COLOR) != 0) - color = def->colorDef.overTime.value.getColor(t); - // transparency - if (def->transparencyDef.overTime.enable) - color.a = 0xff * def->transparencyDef.overTime.value.getValue(t); - else - color.a = 0xff * def->transparencyDef.transparency.value; - if ((updateFlags & UPDATE_SCALE) != 0) - { - // Lerp scale. - float scale = def->scaleDef.overTime.value.getValue(t); - transform.setScale(scale, scale); - } - if ((updateFlags & UPDATE_POSITION) != 0) - { - // Calculate position. - if((updateFlags & UPDATE_VELOCITY) != 0) - velocity += linearAcceleration * dt; - transform.move(velocity * dt); - } - if ((updateFlags & UPDATE_ROTATION) != 0) - { - // Calculate rotation. - angularSpeed += radialAcceleration * dt; - transform.rotate(angularSpeed * dt); - } - if ((updateFlags & UPDATE_SPRITE) != 0) - { - int n = def->spritesDef.sprites.size(); - if (def->spritesDef.mode == SpriteMode::ANIMATED) - spriteIndex = lerp<int>(0, n - 1, t); - //jin_log_info("sprite index %d", spriteIndex); - } - } - - void Particle::render() - { - // Set blend. - OpenGL::BlendMode blend = gl.getBlendMode(); - if(def->blendDef.additive) - gl.setBlendMode(OpenGL::BlendMode::ADDITIVE); - Color c = gl.getColor(); - gl.setColor(color); - const Sprite* sprite = def->spritesDef.sprites[spriteIndex]; - if (sprite != nullptr) - { - Vector2<float>& position = transform.getPosition(); - Vector2<float>& scale = transform.getScale(); - float r = transform.getRotation(); - sprite->render(position.x(), position.y(), scale.x(), scale.y(), r); - } - gl.setColor(c); - gl.setBlendMode(blend); - } - - } - } + namespace Graphics + { + namespace Particles + { + + static RandomGenerator rng(0xEA44944); + + ////////////////////////////////////////////////////////////////////////////////////////////////////// + // ScaledRangedValue + ////////////////////////////////////////////////////////////////////////////////////////////////////// + + ScaledRangedValue::ScaledRangedValue(Percentage* points, uint n) + { + for (int i = 0; i < n; ++i) + { + float x = points[2 * i].value; + float y = points[2 * i + 1].value; + addPoint(x, y); + } + } + + void ScaledRangedValue::set(Math::Percentage* points, uint n) + { + clear(); + for (int i = 0; i < n; ++i) + { + float x = points[2 * i].value; + float y = points[2 * i + 1].value; + addPoint(x, y); + } + } + + ////////////////////////////////////////////////////////////////////////////////////////////////////// + // GradientColorValue + ////////////////////////////////////////////////////////////////////////////////////////////////////// + + GradientColorValue::GradientColorValue() + : mCount(0) + { + } + + void GradientColorValue::addColor(Color col, Percentage time) + { + mColors.push_back(col); + mTimeline.push_back(time); + ++mCount; + } + + Color GradientColorValue::getColor(Percentage time) + { + int endIndex = -1; + int n = mCount; + for (int i = 1; i < n; i++) { + Percentage t = mTimeline[i]; + if (t.value > time.value) { + endIndex = i; + break; + } + } + if (endIndex == -1) return mColors[n - 1]; + int startIndex = endIndex - 1; + Color& startValue = mColors[startIndex]; + Color& endValue = mColors[endIndex]; + float t = time.value; + float start = mTimeline[startIndex].value; + float end = mTimeline[endIndex].value; + Color c; + c.r = startValue.r + (endValue.r - startValue.r) * ((t - start) / (end - start)); + c.g = startValue.g + (endValue.g - startValue.g) * ((t - start) / (end - start)); + c.b = startValue.b + (endValue.b - startValue.b) * ((t - start) / (end - start)); + c.a = startValue.a + (endValue.a - startValue.a) * ((t - start) / (end - start)); + return c; + } + + void GradientColorValue::insertColor(uint i, Color col, Math::Percentage time) + { + mColors.insert(mColors.begin() + i, col); + mTimeline.insert(mTimeline.begin() + i, time); + ++mCount; + } + + void GradientColorValue::removeColor(uint i) + { + mColors.erase(mColors.begin() + i); + mTimeline.erase(mTimeline.begin() + i); + --mCount; + } + + ////////////////////////////////////////////////////////////////////////////////////////////////////// + // Particle + ////////////////////////////////////////////////////////////////////////////////////////////////////// + + Particle::Particle() + { + reset(); + } + + void Particle::reset() + { + updateFlags = ParticleUpdateMask::NONE; + transform.set(0, 0, 1, 1, 0, 0, 0); + lifeTime = 1.0f; + life = 0.0f; + velocity.set(0, 0); + linearAcceleration.set(0, 0); + radialAcceleration = 0.0f; + angularSpeed = 0; + color = Color::WHITE; + alive = true; + spriteIndex = 0; + } + + void Particle::update(float dt) + { + life += dt; + alive = life < lifeTime; + if (!alive) + return; + float t = life / lifeTime; + if ((updateFlags & UPDATE_COLOR) != 0) + color = def->colorDef.overTime.value.getColor(t); + // transparency + if (def->transparencyDef.overTime.enable) + color.a = 0xff * def->transparencyDef.overTime.value.getValue(t); + else + color.a = 0xff * def->transparencyDef.transparency.value; + if ((updateFlags & UPDATE_SCALE) != 0) + { + // Lerp scale. + float scale = def->scaleDef.overTime.value.getValue(t); + transform.setScale(scale, scale); + } + if ((updateFlags & UPDATE_POSITION) != 0) + { + // Calculate position. + if((updateFlags & UPDATE_VELOCITY) != 0) + velocity += linearAcceleration * dt; + transform.move(velocity * dt); + } + if ((updateFlags & UPDATE_ROTATION) != 0) + { + // Calculate rotation. + angularSpeed += radialAcceleration * dt; + transform.rotate(angularSpeed * dt); + } + if ((updateFlags & UPDATE_SPRITE) != 0) + { + int n = def->spritesDef.sprites.size(); + if (def->spritesDef.mode == SpriteMode::ANIMATED) + spriteIndex = lerp<int>(0, n - 1, t); + //jin_log_info("sprite index %d", spriteIndex); + } + } + + void Particle::render() + { + // Set blend. + OpenGL::BlendMode blend = gl.getBlendMode(); + if(def->blendDef.additive) + gl.setBlendMode(OpenGL::BlendMode::ADDITIVE); + Color c = gl.getColor(); + gl.setColor(color); + const Sprite* sprite = def->spritesDef.sprites[spriteIndex]; + if (sprite != nullptr) + { + Vector2<float>& position = transform.getPosition(); + Vector2<float>& scale = transform.getScale(); + float r = transform.getRotation(); + sprite->render(position.x(), position.y(), scale.x(), scale.y(), r); + } + gl.setColor(c); + gl.setBlendMode(blend); + } + + } + } }
\ No newline at end of file |