From 0a23c7fba9ce57a77246b807ba76a802311a6862 Mon Sep 17 00:00:00 2001
From: Mathias Paulin <mathias.paulin@irit.fr>
Date: Thu, 11 Mar 2021 18:02:44 +0100
Subject: [PATCH] Fix passes coherency wrt wireframe

---
 src/libRender/RadiumNBR/NodeBasedRenderer.cpp  |  7 ++++++-
 src/libRender/RadiumNBR/Passes/GeomPrepass.cpp |  5 +++--
 .../RadiumNBR/Passes/TransparencyPass.cpp      |  2 +-
 .../RadiumNBR/Passes/WireframePass.cpp         | 18 +++++++++---------
 .../RadiumNBR/Passes/WireframePass.hpp         |  5 +++--
 5 files changed, 22 insertions(+), 15 deletions(-)

diff --git a/src/libRender/RadiumNBR/NodeBasedRenderer.cpp b/src/libRender/RadiumNBR/NodeBasedRenderer.cpp
index 4791790..fd28a8a 100644
--- a/src/libRender/RadiumNBR/NodeBasedRenderer.cpp
+++ b/src/libRender/RadiumNBR/NodeBasedRenderer.cpp
@@ -241,16 +241,20 @@ void NodeBasedRenderer::initPasses() {
     m_zPrePass->activate();
     m_renderPasses.emplace_back( m_aoPass );
     m_aoPass->activate();
+
     m_renderPasses.emplace_back( m_emissivityPass );
     m_emissivityPass->activate();
+
     m_renderPasses.emplace_back( m_envlightPass );
     m_envlightPass->activate();
+
     m_renderPasses.emplace_back( m_locallightPass );
     m_locallightPass->activate();
     m_renderPasses.emplace_back( m_transparencyPass );
     m_transparencyPass->activate();
     m_renderPasses.emplace_back( m_volumelightPass );
     m_volumelightPass->activate();
+
     m_renderPasses.emplace_back( m_wireframePass );
 
     // Add intermediate textures to the texture explorer
@@ -524,7 +528,8 @@ void NodeBasedRenderer::setEnvMap( const std::string& files ) {
         auto e = std::make_shared<EnvMap>( files, t, true );
         m_clearPass->setEnvMap( e );
         m_envlightPass->setEnvMap( e );
-        m_envlightPass->activate();
+        // activate the envmap pass only if wireframe is inactive ?
+        if ( !m_wireframePass->isActive() ) { m_envlightPass->activate(); }
         m_volumelightPass->setEnvMap( e );
         m_hasEnvMap = true;
     }
diff --git a/src/libRender/RadiumNBR/Passes/GeomPrepass.cpp b/src/libRender/RadiumNBR/Passes/GeomPrepass.cpp
index 1c8a7c0..6ac1716 100644
--- a/src/libRender/RadiumNBR/Passes/GeomPrepass.cpp
+++ b/src/libRender/RadiumNBR/Passes/GeomPrepass.cpp
@@ -111,11 +111,12 @@ void GeomPrePass::execute( const Ra::Engine::Data::ViewingParameters& viewParams
 
     GL_ASSERT( glDepthFunc( GL_LESS ) );
     GL_ASSERT( glDisable( GL_BLEND ) );
-
+    glPolygonOffset( 1.1f, 1.f );
+    glEnable( GL_POLYGON_OFFSET_FILL );
     for ( const auto& ro : *m_objectsToRender )
     { ro->render( m_passParams, viewParams, passIndex() ); }
 
-    // Beware of the state left by the pass
+    // Beware of the state left by the pass : Polygon offset must be enable after this for rendering coherency
 }
 
 bool GeomPrePass::buildRenderTechnique( const Ra::Engine::Rendering::RenderObject* ro,
diff --git a/src/libRender/RadiumNBR/Passes/TransparencyPass.cpp b/src/libRender/RadiumNBR/Passes/TransparencyPass.cpp
index 7edcc0f..d28871c 100644
--- a/src/libRender/RadiumNBR/Passes/TransparencyPass.cpp
+++ b/src/libRender/RadiumNBR/Passes/TransparencyPass.cpp
@@ -152,7 +152,7 @@ void TransparencyPass::execute( const Ra::Engine::Data::ViewingParameters& viewP
     GL_ASSERT( glClearBufferfv( GL_COLOR, 0, clearZeros.data() ) );
     GL_ASSERT( glClearBufferfv( GL_COLOR, 1, clearOnes.data() ) );
     GL_ASSERT( glDepthMask( GL_FALSE ) );
-    GL_ASSERT( glDepthFunc( GL_LESS ) );
+    GL_ASSERT( glDepthFunc( GL_LEQUAL ) );
     GL_ASSERT( glEnable( GL_DEPTH_TEST ) );
 
     GL_ASSERT( glEnable( GL_BLEND ) );
diff --git a/src/libRender/RadiumNBR/Passes/WireframePass.cpp b/src/libRender/RadiumNBR/Passes/WireframePass.cpp
index 051e768..ce32ad5 100644
--- a/src/libRender/RadiumNBR/Passes/WireframePass.cpp
+++ b/src/libRender/RadiumNBR/Passes/WireframePass.cpp
@@ -168,21 +168,19 @@ void WireframePass::execute( const Ra::Engine::Data::ViewingParameters& viewPara
     GL_ASSERT( glColorMask( GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE ) );
 
     GL_ASSERT( glEnable( GL_DEPTH_TEST ) );
-    GL_ASSERT( glDepthFunc( GL_LEQUAL ) );
+    GL_ASSERT( glDepthFunc( GL_LESS ) );
     GL_ASSERT( glEnable( GL_BLEND ) );
 #ifdef ADVANCED_WIREFRAME_SHADER
     glBlendEquationSeparate( GL_FUNC_ADD, GL_FUNC_ADD );
     glBlendFuncSeparate( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ZERO );
-    glPolygonOffset( -4.f, -2.f );
-    glEnable( GL_POLYGON_OFFSET_FILL );
-
+    // To prevent z-fighting, remove polygon offset
+    glDisable( GL_POLYGON_OFFSET_FILL );
 #else
-    GL_ASSERT( glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ) );
+    glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
     glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
     glEnable( GL_LINE_SMOOTH );
     glLineWidth( 1.f );
-    glPolygonOffset( -1.1f, -0.1f );
-    glEnable( GL_POLYGON_OFFSET_LINE );
+    glDisable( GL_POLYGON_OFFSET_LINE );
 #endif
 
     for ( const auto& ro : *m_objectsToRender )
@@ -209,10 +207,12 @@ void WireframePass::execute( const Ra::Engine::Data::ViewingParameters& viewPara
 #endif
     }
 #ifdef ADVANCED_WIREFRAME_SHADER
-    glDisable( GL_POLYGON_OFFSET_FILL );
+    // need to maintain global state invariant
+    glEnable( GL_POLYGON_OFFSET_FILL );
 #else
     glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
-    glDisable( GL_POLYGON_OFFSET_LINE );
+    // do we need to enable this ? it is not part of the invariant ...
+    // glEnable( GL_POLYGON_OFFSET_LINE );
 #endif
     GL_ASSERT( glDisable( GL_BLEND ) );
 }
diff --git a/src/libRender/RadiumNBR/Passes/WireframePass.hpp b/src/libRender/RadiumNBR/Passes/WireframePass.hpp
index f2f8f3e..df0ca9b 100644
--- a/src/libRender/RadiumNBR/Passes/WireframePass.hpp
+++ b/src/libRender/RadiumNBR/Passes/WireframePass.hpp
@@ -3,8 +3,9 @@
 
 #include <Core/Utils/Color.hpp>
 
-//#define ADVANCED_WIREFRAME
-//#define ADVANCED_WIREFRAME_SHADER
+// This is the default. The two way of rendering wireframe is kept for illustration only
+#define ADVANCED_WIREFRAME
+#define ADVANCED_WIREFRAME_SHADER
 #ifdef ADVANCED_WIREFRAME
 #include <Engine/Data/DisplayableObject.hpp>
 #endif
-- 
GitLab