From 014cff0b636303ea8a380002e56280bc76f0c153 Mon Sep 17 00:00:00 2001 From: Nick Gasson Date: Thu, 11 Jun 2009 21:47:59 +0100 Subject: [PATCH] Sort the smoke particles again because it looks better --- src/Billboard.cpp | 2 +- src/SmokeTrail.cpp | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/Billboard.cpp b/src/Billboard.cpp index 1024ddd..24a880e 100644 --- a/src/Billboard.cpp +++ b/src/Billboard.cpp @@ -159,7 +159,7 @@ public: }; void SphericalBillboard::render() const -{ +{ // Based on code from // http://www.lighthouse3d.com/opengl/billboarding/index.php?billSphe Vector lookAt, objToCamProj, upAux, objToCam; diff --git a/src/SmokeTrail.cpp b/src/SmokeTrail.cpp index 67d8ee3..0062133 100644 --- a/src/SmokeTrail.cpp +++ b/src/SmokeTrail.cpp @@ -50,7 +50,7 @@ private: void newParticle(); bool moveParticle(Particle& aParticle, int aDelta); - list myParticles; + mutable list myParticles; // Need to sort particles in render() float myX, myY, myZ; IBillboardPtr myBillboard; @@ -159,8 +159,19 @@ void SmokeTrail::newParticle() myParticles.push_back(p); } +struct CmpDistanceToCam { + bool operator()(const SmokeTrail::Particle& lhs, + const SmokeTrail::Particle& rhs) + { + return distanceToCamera(makeVector(lhs.x, lhs.y, lhs.z)) + > distanceToCamera(makeVector(rhs.x, rhs.y, rhs.z)); + } +}; + void SmokeTrail::render() const { + myParticles.sort(CmpDistanceToCam()); + for (list::const_iterator it = myParticles.begin(); it != myParticles.end(); ++it) { myBillboard->setPosition((*it).x, (*it).y, (*it).z); -- 2.39.2