From 0989b3b72e514294cbd96be7d80b30b296cb1217 Mon Sep 17 00:00:00 2001 From: Nick Gasson Date: Sun, 31 May 2009 22:14:31 +0100 Subject: [PATCH] Finish tuning smoke system --- data/images/smoke_particle.png | Bin 900 -> 6458 bytes src/SmokeTrail.cpp | 31 ++++++++++++++++++++++--------- src/Train.cpp | 4 ++-- 3 files changed, 24 insertions(+), 11 deletions(-) diff --git a/data/images/smoke_particle.png b/data/images/smoke_particle.png index 14109fcbfcc54ae63f8ee059a9282637ed16ce57..55251ea510ae2dc232dc5cdab2a1d98055a8d16b 100644 GIT binary patch delta 6417 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 diff --git a/src/SmokeTrail.cpp b/src/SmokeTrail.cpp index 5b276b5..5328ca2 100644 --- a/src/SmokeTrail.cpp +++ b/src/SmokeTrail.cpp @@ -43,6 +43,7 @@ public: float xv, yv, zv; float scale; float r, g, b, a; + bool appearing; }; private: @@ -72,9 +73,10 @@ SmokeTrail::SmokeTrail() // Returns true if the particle is dead bool SmokeTrail::moveParticle(Particle& aParticle, int aDelta) { - const float ySpeed = 0.3f; + const float ySpeed = 0.4f; const float growth = 0.3f; - const float decay = 0.2f; + const float decay = 0.3f; + const float appear = 4.0f; const float slowdown = 0.1f; const float xWind = 0.02f; const float zWind = 0.01f; @@ -91,8 +93,18 @@ bool SmokeTrail::moveParticle(Particle& aParticle, int aDelta) aParticle.scale += growth * time; - // Kill the particle if it becomes invisible - return (aParticle.a -= decay * time) <= 0.0f; + const float maxA = 0.8f; + if (aParticle.appearing) { + if ((aParticle.a += appear * time) >= maxA) { + aParticle.a = maxA; + aParticle.appearing = false; + } + return false; + } + else { + // Kill the particle if it becomes invisible + return (aParticle.a -= decay * time) <= 0.0f; + } } void SmokeTrail::update(int aDelta) @@ -117,13 +129,13 @@ void SmokeTrail::newParticle() { // Random number generator for colour variance static variate_generator > - colourRand(mt19937(time(NULL)), normal_distribution<>(0.0f, 0.06f)); + colourRand(mt19937(time(NULL)), normal_distribution<>(0.0f, 0.08f)); // Random number generator for position variance static variate_generator > - posRand(mt19937(time(NULL)), normal_distribution<>(0.0f, 0.05f)); + posRand(mt19937(time(NULL)), normal_distribution<>(0.0f, 0.07f)); - const float col = 0.75f + colourRand(); + const float col = 0.7f + colourRand(); const float dx = posRand(); const float dz = posRand(); @@ -131,9 +143,10 @@ void SmokeTrail::newParticle() Particle p = { myX + dx, myY, myZ + dz, // Position myXSpeed, myYSpeed, myZSpeed, // Speed - 0.2f, // Scale + 0.5f, // Scale col, col, col, // Colour - 0.8f, // Alpha + 0.0f, // Alpha + true, // Appearing }; myParticles.push_back(p); diff --git a/src/Train.cpp b/src/Train.cpp index aa23bd7..9558613 100644 --- a/src/Train.cpp +++ b/src/Train.cpp @@ -171,9 +171,9 @@ void Train::updateSmokePosition(int aDelta) // Make the rate at which new particles are created proportional // to the throttle of the controller const int throttle = e.vehicle->controller()->throttle(); - const int baseDelay = 300; + const int baseDelay = 200; - mySmokeTrail->setDelay(baseDelay - (throttle * 25)); + mySmokeTrail->setDelay(baseDelay - (throttle * 15)); } void Train::update(int aDelta) -- 2.39.2