From 35696e1dcd0c43168965752c1a16dfc2f2a04d4c Mon Sep 17 00:00:00 2001 From: Chris Laurel Date: Mon, 23 Apr 2007 16:28:07 +0000 Subject: [PATCH] Additive blending fixes: - Consider blend mode when comparing materials - Enable additive blending even when opacity = 1 --- src/celengine/model.cpp | 8 ++++++++ src/celengine/rendcontext.cpp | 12 +++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/celengine/model.cpp b/src/celengine/model.cpp index b2ff0c09d..ff09025af 100644 --- a/src/celengine/model.cpp +++ b/src/celengine/model.cpp @@ -246,6 +246,14 @@ operator<(const Mesh::Material& m0, const Mesh::Material& m1) else if (m0.opacity > m1.opacity) return false; + // Reverse sense of comparison here--additive blending is 1, normal + // blending is 0, and we'd prefer to render additively blended submeshes + // last. + if (m0.blend > m1.blend) + return true; + else if (m0.blend < m1.blend) + return false; + if (m0.diffuse < m1.diffuse) return true; else if (m1.diffuse < m0.diffuse) diff --git a/src/celengine/rendcontext.cpp b/src/celengine/rendcontext.cpp index 1e94a7b0a..d7cd9af46 100644 --- a/src/celengine/rendcontext.cpp +++ b/src/celengine/rendcontext.cpp @@ -217,7 +217,9 @@ FixedFunctionRenderContext::makeCurrent(const Mesh::Material& m) } Mesh::BlendMode newBlendMode = Mesh::InvalidBlend; - if (m.opacity != 1.0f || (t != NULL && t->hasAlpha())) + if (m.opacity != 1.0f || + m.blend == Mesh::AdditiveBlend || + (t != NULL && t->hasAlpha())) { newBlendMode = m.blend; } @@ -657,7 +659,9 @@ GLSL_RenderContext::makeCurrent(const Mesh::Material& m) } Mesh::BlendMode newBlendMode = Mesh::InvalidBlend; - if (m.opacity != 1.0f || (baseTex != NULL && baseTex->hasAlpha())) + if (m.opacity != 1.0f || + m.blend == Mesh::AdditiveBlend || + (baseTex != NULL && baseTex->hasAlpha())) { newBlendMode = m.blend; } @@ -807,7 +811,9 @@ GLSLUnlit_RenderContext::makeCurrent(const Mesh::Material& m) } Mesh::BlendMode newBlendMode = Mesh::InvalidBlend; - if (m.opacity != 1.0f || (baseTex != NULL && baseTex->hasAlpha())) + if (m.opacity != 1.0f || + m.blend == Mesh::AdditiveBlend || + (baseTex != NULL && baseTex->hasAlpha())) { newBlendMode = m.blend; }