From 1a0831c5ed0e4d172dcf4c912e435c195da3da50 Mon Sep 17 00:00:00 2001 From: Nick Gasson Date: Thu, 11 Jun 2009 21:43:06 +0100 Subject: [PATCH] Use glDepthMask to avoid sorting billboards --- src/Billboard.cpp | 8 ++++++++ src/SmokeTrail.cpp | 15 ++------------- 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/src/Billboard.cpp b/src/Billboard.cpp index 396175f..1024ddd 100644 --- a/src/Billboard.cpp +++ b/src/Billboard.cpp @@ -122,6 +122,9 @@ void CylindricalBillboard::render() const // http://www.lighthouse3d.com/opengl/billboarding/index.php?billCheat1 float modelview[16]; + + glPushAttrib(GL_DEPTH_BUFFER_BIT); + glDepthMask(GL_FALSE); glPushMatrix(); @@ -142,6 +145,7 @@ void CylindricalBillboard::render() const drawTextureQuad(); glPopMatrix(); + glPopAttrib(); } // A billboard which always faces the viewer @@ -161,6 +165,9 @@ void SphericalBillboard::render() const Vector lookAt, objToCamProj, upAux, objToCam; float angleCosine; + glPushAttrib(GL_DEPTH_BUFFER_BIT); + glDepthMask(GL_FALSE); + glPushMatrix(); translate(); @@ -227,6 +234,7 @@ void SphericalBillboard::render() const drawTextureQuad(); glPopMatrix(); + glPopAttrib(); } IBillboardPtr makeCylindricalBillboard(ITexturePtr aTexture) diff --git a/src/SmokeTrail.cpp b/src/SmokeTrail.cpp index bf1d83e..67d8ee3 100644 --- a/src/SmokeTrail.cpp +++ b/src/SmokeTrail.cpp @@ -50,7 +50,7 @@ private: void newParticle(); bool moveParticle(Particle& aParticle, int aDelta); - mutable list myParticles; // Need to sort particles in render() + list myParticles; float myX, myY, myZ; IBillboardPtr myBillboard; @@ -159,19 +159,8 @@ 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