diff options
Diffstat (limited to 'src/particle/particleengine.cpp')
-rw-r--r-- | src/particle/particleengine.cpp | 234 |
1 files changed, 5 insertions, 229 deletions
diff --git a/src/particle/particleengine.cpp b/src/particle/particleengine.cpp index 1a65b51d8..cb43f5059 100644 --- a/src/particle/particleengine.cpp +++ b/src/particle/particleengine.cpp @@ -56,28 +56,8 @@ bool ParticleEngine::enabled = true; const float ParticleEngine::PARTICLE_SKY = 800.0F; ParticleEngine::ParticleEngine() : - Actor(), - mAlpha(1.0F), - mLifetimeLeft(-1), - mLifetimePast(0), - mFadeOut(0), - mFadeIn(0), - mVelocity(), - mAlive(AliveStatus::ALIVE), - mChildEmitters(), mChildParticles(), - mDeathEffect(), - mGravity(0.0F), - mBounce(0.0F), - mAcceleration(0.0F), - mInvDieDistance(-1.0F), - mMomentum(1.0F), - mTarget(nullptr), - mRandomness(0), - mDeathEffectConditions(0x00), - mAutoDelete(true), - mAllowSizeAdjust(false), - mFollow(false) + mMap(nullptr) { ParticleEngine::particleCount++; } @@ -97,161 +77,13 @@ void ParticleEngine::setupEngine() restrict2 if (!ParticleEngine::emitterSkip) ParticleEngine::emitterSkip = 1; ParticleEngine::enabled = config.getBoolValue("particleeffects"); - disableAutoDelete(); logger->log1("Particle engine set up"); } -void ParticleEngine::draw(Graphics *restrict const, - const int, const int) const restrict2 -{ -} - -void ParticleEngine::updateSelf() restrict2 -{ - if (mLifetimeLeft == 0 && mAlive == AliveStatus::ALIVE) - mAlive = AliveStatus::DEAD_TIMEOUT; - - if (mAlive == AliveStatus::ALIVE) - { - // calculate particle movement - if (mMomentum != 1.0F) - mVelocity *= mMomentum; - - if (mTarget && mAcceleration != 0.0F) - { - Vector dist = mPos - mTarget->mPos; - dist.x *= SIN45; - float invHypotenuse; - - switch (ParticleEngine::fastPhysics) - { - case 1: - invHypotenuse = fastInvSqrt( - dist.x * dist.x + dist.y * dist.y + dist.z * dist.z); - break; - case 2: - if (!dist.x) - { - invHypotenuse = 0; - break; - } - - invHypotenuse = 2.0F / (static_cast<float>(fabs(dist.x)) - + static_cast<float>(fabs(dist.y)) - + static_cast<float>(fabs(dist.z))); - break; - default: - invHypotenuse = 1.0F / static_cast<float>(sqrt( - dist.x * dist.x + dist.y * dist.y + dist.z * dist.z)); - break; - } - - if (invHypotenuse) - { - if (mInvDieDistance > 0.0F && invHypotenuse > mInvDieDistance) - mAlive = AliveStatus::DEAD_IMPACT; - const float accFactor = invHypotenuse * mAcceleration; - mVelocity -= dist * accFactor; - } - } - - if (mRandomness > 0) - { - mVelocity.x += static_cast<float>((rand() % mRandomness - rand() - % mRandomness)) / 1000.0F; - mVelocity.y += static_cast<float>((rand() % mRandomness - rand() - % mRandomness)) / 1000.0F; - mVelocity.z += static_cast<float>((rand() % mRandomness - rand() - % mRandomness)) / 1000.0F; - } - - mVelocity.z -= mGravity; - - // Update position - mPos.x += mVelocity.x; - mPos.y += mVelocity.y * SIN45; - mPos.z += mVelocity.z * SIN45; - - // Update other stuff - if (mLifetimeLeft > 0) - mLifetimeLeft--; - - mLifetimePast++; - - if (mPos.z < 0.0F) - { - if (mBounce > 0.0F) - { - mPos.z *= -mBounce; - mVelocity *= mBounce; - mVelocity.z = -mVelocity.z; - } - else - { - mAlive = AliveStatus::DEAD_FLOOR; - } - } - else if (mPos.z > PARTICLE_SKY) - { - mAlive = AliveStatus::DEAD_SKY; - } - - // Update child emitters - if (ParticleEngine::emitterSkip && (mLifetimePast - 1) - % ParticleEngine::emitterSkip == 0) - { - FOR_EACH (EmitterConstIterator, e, mChildEmitters) - { - std::vector<Particle*> newParticles; - (*e)->createParticles(mLifetimePast, newParticles); - FOR_EACH (std::vector<Particle*>::const_iterator, - it, - newParticles) - { - Particle *const p = *it; - p->moveBy(mPos); - mChildParticles.push_back(p); - } - } - } - } - - // create death effect when the particle died - if (mAlive != AliveStatus::ALIVE && - mAlive != AliveStatus::DEAD_LONG_AGO) - { - if ((CAST_U32(mAlive) & mDeathEffectConditions) - > 0x00 && !mDeathEffect.empty()) - { - Particle *restrict const deathEffect = particleEngine->addEffect( - mDeathEffect, 0, 0); - if (deathEffect) - deathEffect->moveBy(mPos); - } - mAlive = AliveStatus::DEAD_LONG_AGO; - } -} - bool ParticleEngine::update() restrict2 { - if (!mMap) - return false; - - const Vector oldPos = mPos; - - updateSelf(); - - const Vector change = mPos - oldPos; - - if (mChildParticles.empty()) - { - if (mAlive != AliveStatus::ALIVE && - mAutoDelete) - { - return false; - } + if (mChildParticles.empty() || !mMap) return true; - } // Update child particles @@ -273,10 +105,6 @@ bool ParticleEngine::update() restrict2 ++p; continue; } - // move particle with its parent if desired - if (particle->mFollow) - particle->moveBy(change); - // update particle if (particle->update()) { @@ -288,32 +116,9 @@ bool ParticleEngine::update() restrict2 p = mChildParticles.erase(p); } } - if (mAlive != AliveStatus::ALIVE && - mChildParticles.empty() && - mAutoDelete) - { - return false; - } - return true; } -void ParticleEngine::moveBy(const Vector &restrict change) restrict2 -{ - mPos += change; - FOR_EACH (ParticleConstIterator, p, mChildParticles) - { - Particle *restrict const particle = *p; - if (particle->mFollow) - particle->moveBy(change); - } -} - -void ParticleEngine::moveTo(const float x, const float y) restrict2 -{ - moveTo(Vector(x, y, mPos.z)); -} - Particle *ParticleEngine::createChild() restrict2 { Particle *const newParticle = new Particle(); @@ -394,9 +199,9 @@ Particle *ParticleEngine::addEffect(const std::string &restrict effectChildNode, "position-y", 0)); const float offsetZ = static_cast<float>(XML::getFloatProperty( effectChildNode, "position-z", 0)); - const Vector position(mPos.x + static_cast<float>(pixelX) + offsetX, - mPos.y + static_cast<float>(pixelY) + offsetY, - mPos.z + offsetZ); + const Vector position(static_cast<float>(pixelX) + offsetX, + static_cast<float>(pixelY) + offsetY, + offsetZ); newParticle->moveTo(position); const int lifetime = XML::getProperty(effectChildNode, "lifetime", -1); @@ -522,37 +327,8 @@ Particle *ParticleEngine::addTextRiseFadeOutEffect(const std::string &restrict return newParticle; } -void ParticleEngine::adjustEmitterSize(const int w, const int h) restrict2 -{ - if (mAllowSizeAdjust) - { - FOR_EACH (EmitterConstIterator, e, mChildEmitters) - (*e)->adjustSize(w, h); - } -} - -void ParticleEngine::prepareToDie() restrict2 -{ - FOR_EACH (ParticleIterator, p, mChildParticles) - { - Particle *restrict const particle = *p; - if (!particle) - continue; - particle->prepareToDie(); - if (particle->isAlive() && - particle->mLifetimeLeft == -1 && - particle->mAutoDelete) - { - particle->kill(); - } - } -} - void ParticleEngine::clear() restrict2 { - delete_all(mChildEmitters); - mChildEmitters.clear(); - delete_all(mChildParticles); mChildParticles.clear(); } |