From bc5996bba5f9afecf764f13b837e0fc5dd2ff9ba Mon Sep 17 00:00:00 2001
From: Mathias Paulin <mathias.paulin@irit.fr>
Date: Fri, 12 Mar 2021 01:25:51 +0100
Subject: [PATCH] Allow to configure the NodeBasedRenderer after from any
 functor.

---
 src/libRender/RadiumNBR/NodeBasedRenderer.cpp | 10 ++++++++--
 src/libRender/RadiumNBR/NodeBasedRenderer.hpp | 14 ++++++++++++--
 2 files changed, 20 insertions(+), 4 deletions(-)

diff --git a/src/libRender/RadiumNBR/NodeBasedRenderer.cpp b/src/libRender/RadiumNBR/NodeBasedRenderer.cpp
index a6e4f71..19602c3 100644
--- a/src/libRender/RadiumNBR/NodeBasedRenderer.cpp
+++ b/src/libRender/RadiumNBR/NodeBasedRenderer.cpp
@@ -22,12 +22,16 @@ using namespace Ra::Engine::Rendering;
 namespace RadiumNBR {
 using namespace gl;
 
-static int NodeBasedRendererMagic = 0xFF0F00F0;
+int NodeBasedRendererMagic = 0xFF0F00F0;
 
 static const GLenum buffers[] = { GL_COLOR_ATTACHMENT0 };
 
 NodeBasedRenderer::NodeBasedRenderer() : Renderer() {}
 
+NodeBasedRenderer::NodeBasedRenderer( std::function<void(NodeBasedRenderer *, int, int)> configurator ) :
+    Renderer(),
+    m_configurator{std::move(configurator)} {}
+
 NodeBasedRenderer::~NodeBasedRenderer() = default;
 
 bool NodeBasedRenderer::buildRenderTechnique( RenderObject* ro ) const {
@@ -106,6 +110,8 @@ void NodeBasedRenderer::initializeInternal() {
     initBuffers();
     for ( const auto& t : m_sharedTextures )
     { m_secondaryTextures.insert( { t.first, t.second.get() } ); }
+
+    if ( m_configurator ) { m_configurator( this, m_width, m_height ); }
 }
 
 void NodeBasedRenderer::resizeInternal() {
@@ -266,7 +272,7 @@ void NodeBasedRenderer::postProcessInternal( const ViewingParameters& /* renderD
 // Todo : verify if the ro partition is the good one and that the passes use the right part.
 void NodeBasedRenderer::updateStepInternal( const ViewingParameters& renderData ) {
     m_allRenderObjects.clear();
-    for ( auto it = m_fancyRenderObjects.begin(); it != m_fancyRenderObjects.end(); )
+    for ( auto it = m_fancyRenderObjects.begin(); it != m_fancyRenderObjects.end(); ++it)
     {
         m_allRenderObjects.push_back( *it );
     }
diff --git a/src/libRender/RadiumNBR/NodeBasedRenderer.hpp b/src/libRender/RadiumNBR/NodeBasedRenderer.hpp
index 53d1ad7..6514175 100644
--- a/src/libRender/RadiumNBR/NodeBasedRenderer.hpp
+++ b/src/libRender/RadiumNBR/NodeBasedRenderer.hpp
@@ -2,6 +2,7 @@
 #include <RadiumNBR/NodeBasedRendererMacro.hpp>
 #include <RadiumNBR/RenderPass.hpp>
 
+#include <Core/Resources/Resources.hpp>
 #include <Engine/Rendering/Renderer.hpp>
 
 namespace globjects {
@@ -10,10 +11,13 @@ class Framebuffer;
 
 namespace RadiumNBR {
 
+/// Todo, put this somewhere else. This is needed to locate resources by cclient applications
+extern int NodeBasedRendererMagic;
+
 /** Node based for the Radium Engine
  * This Renderer is fully configurable, either dynammically or programatically.
- * It implements the Ra::Engine::Rendering/Renderer interface and cand be configured by adding
- * as many RadiumNBR::RenderPass rendering passes.
+ * It implements the Ra::Engine::Rendering/Renderer interface and can be configured by adding
+ * as many RadiumNBR::RenderPass as needed.
  *
  * It defines two textures that migh be shared between passes :
  *  - a depth buffer attachable texture
@@ -29,6 +33,8 @@ class NodeBasedRenderer_LIBRARY_API NodeBasedRenderer : public Ra::Engine::Rende
 
   public:
     NodeBasedRenderer();
+    NodeBasedRenderer( std::function<void(NodeBasedRenderer *, int, int)> configurator );
+
     ~NodeBasedRenderer() override;
 
     [[nodiscard]] std::string getRendererName() const override { return "Configurable Renderer"; }
@@ -61,6 +67,7 @@ class NodeBasedRenderer_LIBRARY_API NodeBasedRenderer : public Ra::Engine::Rende
     virtual void initShaders();
     virtual void initBuffers();
 
+  public:
     inline std::map<std::string, std::shared_ptr<Ra::Engine::Data::Texture>> &sharedTextures() {
         return m_sharedTextures;
     }
@@ -100,6 +107,9 @@ class NodeBasedRenderer_LIBRARY_API NodeBasedRenderer : public Ra::Engine::Rende
 
     /// The default pass
     int m_defaultPass{-1};
+
+    /// The configurator functor to use
+    std::function<void(NodeBasedRenderer *, int, int)> m_configurator;
 };
 
 }
-- 
GitLab