From 3e92c25c066ee070ed8e75832754425bd2358797 Mon Sep 17 00:00:00 2001
From: Mathias Paulin <mathias.paulin@irit.fr>
Date: Thu, 17 Feb 2022 23:52:42 +0100
Subject: [PATCH] [librender] NodeGraph and NodeEditor : Make loading/adapting
 and editing automatic

---
 src/Mara/RadiumPlayer.cpp                     |  74 ++---
 src/libRender/CMakeLists.txt                  |  11 +-
 .../Gui/NodeEditor/examples/CMakeLists.txt    |   1 -
 .../rendergraph/AccessibilityBufferModel.cpp  |  81 ------
 .../rendergraph/AccessibilityBufferModel.hpp  |  57 ----
 .../examples/rendergraph/BooleanData.hpp      |  28 --
 .../examples/rendergraph/CMakeLists.txt       |   5 -
 .../examples/rendergraph/CameraData.hpp       |  17 --
 .../examples/rendergraph/CameraModel.cpp      |  31 --
 .../examples/rendergraph/CameraModel.hpp      |  54 ----
 .../examples/rendergraph/ClearColorModel.cpp  |  83 ------
 .../examples/rendergraph/ClearColorModel.hpp  |  95 ------
 .../examples/rendergraph/ColorData.hpp        |  28 --
 .../examples/rendergraph/ColorSlider.cpp      | 108 -------
 .../examples/rendergraph/ColorSlider.hpp      |  45 ---
 .../examples/rendergraph/DisplayModel.cpp     | 117 --------
 .../examples/rendergraph/DisplayModel.hpp     |  55 ----
 .../examples/rendergraph/EmissivityModel.cpp  |  86 ------
 .../examples/rendergraph/EmissivityModel.hpp  |  57 ----
 .../examples/rendergraph/EnvLightModel.cpp    |  91 ------
 .../examples/rendergraph/EnvLightModel.hpp    |  57 ----
 .../FilterRenderObjectNameModel.cpp           |  87 ------
 .../FilterRenderObjectNameModel.hpp           |  69 -----
 .../FilterRenderObjectTypeModel.cpp           |  86 ------
 .../FilterRenderObjectTypeModel.hpp           |  64 ----
 .../examples/rendergraph/LightData.hpp        |  17 --
 .../examples/rendergraph/LightModel.cpp       |  31 --
 .../examples/rendergraph/LightModel.hpp       |  54 ----
 .../examples/rendergraph/LocalLightModel.cpp  |  82 ------
 .../examples/rendergraph/LocalLightModel.hpp  |  58 ----
 .../examples/rendergraph/RenderObjectData.hpp |  17 --
 .../rendergraph/RenderObjectModel.cpp         |  31 --
 .../rendergraph/RenderObjectModel.hpp         |  54 ----
 .../examples/rendergraph/ScalarData.hpp       |  28 --
 .../rendergraph/SourceBooleanModel.cpp        |  85 ------
 .../rendergraph/SourceBooleanModel.hpp        |  70 -----
 .../examples/rendergraph/SourceColorModel.cpp | 113 --------
 .../examples/rendergraph/SourceColorModel.hpp |  68 -----
 .../rendergraph/SourceColorTextureModel.cpp   |  31 --
 .../rendergraph/SourceColorTextureModel.hpp   |  54 ----
 .../rendergraph/SourceDepthTextureModel.cpp   |  31 --
 .../rendergraph/SourceDepthTextureModel.hpp   |  54 ----
 .../rendergraph/SourceScalarModel.cpp         |  90 ------
 .../rendergraph/SourceScalarModel.hpp         |  71 -----
 .../examples/rendergraph/TextData.hpp         |  27 --
 .../examples/rendergraph/TextureData.hpp      |  20 --
 .../rendergraph/TransparencyModel.cpp         |  82 ------
 .../rendergraph/TransparencyModel.hpp         |  58 ----
 .../examples/rendergraph/UIModel.cpp          |  77 -----
 .../examples/rendergraph/UIModel.hpp          |  58 ----
 .../examples/rendergraph/VolumeModel.cpp      |  77 -----
 .../examples/rendergraph/VolumeModel.hpp      |  58 ----
 .../examples/rendergraph/WireframeModel.cpp   |  77 -----
 .../examples/rendergraph/WireframeModel.hpp   |  58 ----
 .../rendergraph/ZGeomPrepassModel.cpp         |  91 ------
 .../rendergraph/ZGeomPrepassModel.hpp         |  58 ----
 .../NodeEditor/examples/rendergraph/main.cpp  | 116 --------
 .../RadiumNBR/Gui/NodeEditor/src/Node.cpp     |   5 +-
 .../FilterRenderObjectNameModel.cpp           | 105 -------
 .../FilterRenderObjectNameModel.hpp           |  94 ------
 .../FilterRenderObjectTypeModel.cpp           | 113 --------
 .../FilterRenderObjectTypeModel.hpp           |  94 ------
 .../RenderGraphEditor/NodeAdapterModel.cpp    | 153 ++++++++++
 .../RenderGraphEditor/NodeAdapterModel.hpp    |  50 +---
 .../RenderGraphEditor/NodeAdapterModel.inl    | 113 +-------
 .../RenderGraphEditorView.cpp                 | 262 +++++------------
 .../Gui/RenderGraphEditor/WidgetFactory.cpp   | 274 +++++++++++++++++-
 .../Gui/RenderGraphEditor/WidgetFactory.hpp   |  59 +++-
 src/libRender/RadiumNBR/NodeBasedRenderer.cpp | 101 ++++---
 src/libRender/RadiumNBR/NodeBasedRenderer.hpp |   9 +-
 src/libRender/RadiumNBR/NodeGraph/Node.cpp    |  53 +++-
 src/libRender/RadiumNBR/NodeGraph/Node.hpp    |  24 +-
 .../RadiumNBR/NodeGraph/NodeFactory.cpp       | 187 +++++-------
 src/libRender/RadiumNBR/NodeGraph/Port.hpp    |  11 +-
 .../PremadeNodes/Demo/SimpleNode.hpp          | 205 -------------
 .../PremadeNodes/Filters/FilterNode.hpp       |  42 +++
 .../Filters/FilterROByNameNode.hpp            |  16 +-
 .../Filters/FilterROByTypeNode.hpp            |  27 +-
 .../PremadeNodes/PremadeNodesIncludes.hpp     |   3 +-
 .../RenderPasses/AccessibilityBufferNode.cpp  |  15 +
 .../RenderPasses/AccessibilityBufferNode.hpp  |   5 +
 .../RenderPasses/ClearColorNode.cpp           |  17 ++
 .../RenderPasses/ClearColorNode.hpp           |   4 +
 .../RenderPasses/EmissivityNode.hpp           |   4 +
 .../RenderPasses/EnvLightNode.hpp             |   4 +
 .../RenderPasses/LocalLightNode.hpp           |   4 +
 .../PremadeNodes/RenderPasses/SimpleNode.cpp  | 190 ++++++++++++
 .../PremadeNodes/RenderPasses/SimpleNode.hpp  |  37 +++
 .../RenderPasses/TransparencyNode.hpp         |   4 +
 .../PremadeNodes/RenderPasses/UINode.hpp      |   5 +
 .../PremadeNodes/RenderPasses/VolumeNode.hpp  |   4 +
 .../RenderPasses/VolumeVizualisationNode.cpp  |   9 +
 .../RenderPasses/VolumeVizualisationNode.hpp  |   4 +
 .../RenderPasses/WireframeNode.cpp            |  12 +-
 .../RenderPasses/WireframeNode.hpp            |   4 +
 .../RenderPasses/ZGeomPrepassNode.hpp         |   4 +
 .../PremadeNodes/Sinks/DisplaySinkNode.cpp    |  42 ++-
 .../PremadeNodes/Sinks/DisplaySinkNode.hpp    |  11 +-
 .../NodeGraph/PremadeNodes/Sinks/SinkNode.hpp |   5 +
 .../PremadeNodes/Sources/DataNode.hpp         |   4 +
 .../PremadeNodes/Sources/SourceNode.cpp       |  89 ++++++
 .../PremadeNodes/Sources/SourceNode.hpp       |  74 ++++-
 .../PremadeNodes/Sources/TextureNode.hpp      |   4 +
 .../RadiumNBR/NodeGraph/RenderGraph.cpp       |  10 +-
 .../RenderGraphs/fullfeaturerenderer.flow     |   4 +-
 105 files changed, 1452 insertions(+), 4500 deletions(-)
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/AccessibilityBufferModel.cpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/AccessibilityBufferModel.hpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/BooleanData.hpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/CMakeLists.txt
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/CameraData.hpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/CameraModel.cpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/CameraModel.hpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/ClearColorModel.cpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/ClearColorModel.hpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/ColorData.hpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/ColorSlider.cpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/ColorSlider.hpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/DisplayModel.cpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/DisplayModel.hpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/EmissivityModel.cpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/EmissivityModel.hpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/EnvLightModel.cpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/EnvLightModel.hpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/FilterRenderObjectNameModel.cpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/FilterRenderObjectNameModel.hpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/FilterRenderObjectTypeModel.cpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/FilterRenderObjectTypeModel.hpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/LightData.hpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/LightModel.cpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/LightModel.hpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/LocalLightModel.cpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/LocalLightModel.hpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/RenderObjectData.hpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/RenderObjectModel.cpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/RenderObjectModel.hpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/ScalarData.hpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/SourceBooleanModel.cpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/SourceBooleanModel.hpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/SourceColorModel.cpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/SourceColorModel.hpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/SourceColorTextureModel.cpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/SourceColorTextureModel.hpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/SourceDepthTextureModel.cpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/SourceDepthTextureModel.hpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/SourceScalarModel.cpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/SourceScalarModel.hpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/TextData.hpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/TextureData.hpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/TransparencyModel.cpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/TransparencyModel.hpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/UIModel.cpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/UIModel.hpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/VolumeModel.cpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/VolumeModel.hpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/WireframeModel.cpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/WireframeModel.hpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/ZGeomPrepassModel.cpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/ZGeomPrepassModel.hpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/main.cpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/RenderGraphEditor/FilterRenderObjectNameModel.cpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/RenderGraphEditor/FilterRenderObjectNameModel.hpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/RenderGraphEditor/FilterRenderObjectTypeModel.cpp
 delete mode 100644 src/libRender/RadiumNBR/Gui/RenderGraphEditor/FilterRenderObjectTypeModel.hpp
 create mode 100644 src/libRender/RadiumNBR/Gui/RenderGraphEditor/NodeAdapterModel.cpp
 delete mode 100644 src/libRender/RadiumNBR/NodeGraph/PremadeNodes/Demo/SimpleNode.hpp
 create mode 100644 src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/SimpleNode.cpp
 create mode 100644 src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/SimpleNode.hpp
 create mode 100644 src/libRender/RadiumNBR/NodeGraph/PremadeNodes/Sources/SourceNode.cpp

diff --git a/src/Mara/RadiumPlayer.cpp b/src/Mara/RadiumPlayer.cpp
index 61bcada..8b9fe03 100644
--- a/src/Mara/RadiumPlayer.cpp
+++ b/src/Mara/RadiumPlayer.cpp
@@ -34,35 +34,15 @@ using namespace Ra::Core::Utils; // for LOG( logLEVEL )
 #    include <RadiumH3D/h3DLoader.hpp>
 #endif
 
-// This is temporary; must be removed with the appropriate API to make this
-#define SEMINARDEMO
-#ifdef SEMINARDEMO
 
-#    include <Engine/Data/Material.hpp>
-#    include <Engine/Data/RenderParameters.hpp>
-#    include <Engine/Data/ShaderConfigFactory.hpp>
-#    include <RadiumNBR/Gui/RenderGraphEditor/NodeAdapterModel.hpp>
-#    include <RadiumNBR/NodeGraph/PremadeNodes/Compositing/DifferenceNode.hpp>
-#    include <RadiumNBR/NodeGraph/PremadeNodes/Demo/SimpleNode.hpp>
-
-template <typename T>
-class NodeCreator
-{
-  public:
-    NodeCreator( RenderGraph* renderGraph ) : m_renderGraph( renderGraph ) {}
-
-    std::unique_ptr<T> operator()() { return std::make_unique<T>( m_renderGraph ); }
-
-  private:
-    RenderGraph* m_renderGraph;
-};
-
-#endif
 
 namespace Mara {
 
 RadiumPlayer::RadiumPlayer( int& argc, char** argv ) :
-    Ra::Gui::BaseApplication( argc, argv, "RenderApp", "STORM-IRIT" ) {}
+    Ra::Gui::BaseApplication( argc, argv, "RenderApp", "STORM-IRIT" ) {
+    LOG( logINFO ) << "*** My Awesome Rendering Application (MARA) ***";
+    parseCommandLine();
+}
 
 void RadiumPlayer::initialize( const WindowFactory& factory ) {
     Ra::Gui::BaseApplication::initialize( factory );
@@ -86,8 +66,7 @@ void RadiumPlayer::initialize( const WindowFactory& factory ) {
         LOG( logINFO ) << "Reading settings from " << settings.fileName().toStdString();
     }
 #endif
-    LOG( logINFO ) << "*** My Awesome Rendering Application (MARA) ***";
-    parseCommandLine();
+
     addConnections();
 }
 
@@ -113,7 +92,9 @@ void RadiumPlayer::parseCommandLine() {
             << parser.errorText().toStdString();
     }
 
-    if ( parser.isSet( graphOpt ) ) { m_graphOption = parser.value( graphOpt ).toStdString(); }
+    if ( parser.isSet( graphOpt ) ) {
+        m_graphOption = parser.value( graphOpt ).toStdString();
+    }
 }
 
 void RadiumPlayer::toggleCirclePicking( bool on ) {
@@ -198,20 +179,6 @@ void RadiumPlayer::addRenderers() {
         // 1 - Initialize the base node graph system
         NodeFactory::initializeNodeFactory();
 
-#ifdef SEMINARDEMO
-        // Demo
-        NodeFactory::registerNode<SimpleNode>( []( const nlohmann::json& data ) {
-            auto simpleNode =
-                new SimpleNode( "SimpleNode" + std::to_string( NodeFactory::newNodeId() ) );
-            return simpleNode;
-        } );
-
-        NodeFactory::registerNode<DifferenceNode>( []( const nlohmann::json& data ) {
-            auto differenceNode =
-                new DifferenceNode( "DifferenceNode" + std::to_string( NodeFactory::newNodeId() ) );
-            return differenceNode;
-        } );
-#endif
         // 2 - Initialize the renderer using default or customized NodeGraphController
         auto renderControl = new RadiumNBR::NodeGraphController;
         auto myRenderer    = std::make_shared<RadiumNBR::NodeBasedRenderer>( *renderControl );
@@ -223,26 +190,27 @@ void RadiumPlayer::addRenderers() {
         auto controlPanel = RadiumNBR::buildNodeGraphControllerGui(
             myRenderer.get(), [this]() { this->askForUpdate(); } );
 
-        mainWindow->addRenderer( rendererName, myRenderer, controlPanel );
 
-#if 1
         // 3 - load default graph or user provided graph
-        auto resourcesCheck =
-            Ra::Core::Resources::getResourcesPath( nullptr, { "Resources/RadiumNBR" } );
-        if ( !resourcesCheck )
-        {
-            LOG( Ra::Core::Utils::logERROR ) << "Unable to find resources for FakeNBRRenderer!";
-            return;
-        }
-
-        if ( m_graphOption.has_value() ) { myRenderer->setJsonFilePath( m_graphOption.value() ); }
+        if ( m_graphOption ) {
+            std::cout << "Setting initial graph to " << *m_graphOption << "\n";
+            myRenderer->setJsonFilePath( *m_graphOption ); }
         else
         {
+            auto resourcesCheck =
+                Ra::Core::Resources::getResourcesPath( nullptr, { "Resources/RadiumNBR" } );
+            if ( !resourcesCheck )
+            {
+                LOG( Ra::Core::Utils::logERROR ) << "Unable to find resources for NodeBased Renderer!";
+                return;
+            }
             auto resourcesPath{ *resourcesCheck };
             myRenderer->setJsonFilePath( resourcesPath + "RenderGraphs/fullfeaturerenderer.flow" );
         }
         myRenderer->signalReloadJson();
-#endif
+
+        // 4 add the renderer to the mainwindow
+        mainWindow->addRenderer( rendererName, myRenderer, controlPanel );
     }
 
     // add the default forward renderer
diff --git a/src/libRender/CMakeLists.txt b/src/libRender/CMakeLists.txt
index f828b9f..8a4f697 100644
--- a/src/libRender/CMakeLists.txt
+++ b/src/libRender/CMakeLists.txt
@@ -37,6 +37,7 @@ set(sources
     RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/EmissivityNode.cpp
     RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/EnvLightNode.cpp
     RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/LocalLightNode.cpp
+    RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/SimpleNode.cpp
     RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/TransparencyNode.cpp
     RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/VolumeNode.cpp
     RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/VolumeVizualisationNode.cpp
@@ -44,6 +45,7 @@ set(sources
     RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/UINode.cpp
     RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/WireframeNode.cpp
 
+    RadiumNBR/NodeGraph/PremadeNodes/Sources/SourceNode.cpp
     RadiumNBR/NodeGraph/PremadeNodes/Sources/TextureNode.cpp
 
     RadiumNBR/NodeGraph/PremadeNodes/Sinks/DisplaySinkNode.cpp
@@ -87,6 +89,7 @@ set(sources
     RadiumNBR/VolumeVisualization/VolumeVisualization.cpp
     RadiumNBR/VolumeVisualization/RenderNode/VolumeVisualizationPass.cpp
     )
+
 set(public_headers
     RadiumNBR/Renderer/FakeNBRRenderer.hpp
     RadiumNBR/Renderer/NodeGraphController.hpp
@@ -103,6 +106,7 @@ set(public_headers
     RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/EmissivityNode.hpp
     RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/EnvLightNode.hpp
     RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/LocalLightNode.hpp
+    RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/SimpleNode.hpp
     RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/TransparencyNode.hpp
     RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/VolumeNode.hpp
     RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/VolumeVizualisationNode.hpp
@@ -134,7 +138,7 @@ set(public_headers
 
     RadiumNBR/NodeGraph/PremadeNodes/AntiAliasing/FXAANode.hpp
 
-    RadiumNBR/NodeGraph/PremadeNodes/Demo/SimpleNode.hpp
+
 
     RadiumNBR/NodeGraph/PremadeNodes/PremadeNodesIncludes.hpp
 	
@@ -263,8 +267,7 @@ set(gui_sources
     RadiumNBR/Gui/RenderGraphEditor/RenderGraphEditorView.cpp
     RadiumNBR/Gui/RenderGraphEditor/WidgetFactory.cpp
     RadiumNBR/Gui/RenderGraphEditor/ColorSlider.cpp
-    RadiumNBR/Gui/RenderGraphEditor/FilterRenderObjectNameModel.cpp
-    RadiumNBR/Gui/RenderGraphEditor/FilterRenderObjectTypeModel.cpp
+    RadiumNBR/Gui/RenderGraphEditor/NodeAdapterModel.cpp
     RadiumNBR/Gui/RenderGraphEditor/SourceColorTextureModel.cpp
     RadiumNBR/Gui/RenderGraphEditor/SourceDepthTextureModel.cpp
     RadiumNBR/Gui/RenderGraphEditor/SourceNodeModel.cpp
@@ -299,8 +302,6 @@ set(gui_public_headers
     RadiumNBR/Gui/RenderGraphEditor/ConnectionStatusData.hpp
     RadiumNBR/Gui/RenderGraphEditor/WidgetFactory.hpp
     RadiumNBR/Gui/RenderGraphEditor/ColorSlider.hpp
-    RadiumNBR/Gui/RenderGraphEditor/FilterRenderObjectNameModel.hpp
-    RadiumNBR/Gui/RenderGraphEditor/FilterRenderObjectTypeModel.hpp
     RadiumNBR/Gui/RenderGraphEditor/SourceColorTextureModel.hpp
     RadiumNBR/Gui/RenderGraphEditor/SourceDepthTextureModel.hpp
 
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/CMakeLists.txt b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/CMakeLists.txt
index 2ea2e4b..e17f997 100644
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/CMakeLists.txt
+++ b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/CMakeLists.txt
@@ -8,4 +8,3 @@ add_subdirectory(images)
 
 add_subdirectory(styles)
 
-add_subdirectory(rendergraph)
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/AccessibilityBufferModel.cpp b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/AccessibilityBufferModel.cpp
deleted file mode 100644
index cfdfb63..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/AccessibilityBufferModel.cpp
+++ /dev/null
@@ -1,81 +0,0 @@
-#include "AccessibilityBufferModel.hpp"
-
-unsigned int AccessibilityBufferModel::nPorts(PortType portType) const {
-    unsigned int result = 1;
-
-    switch (portType) {
-        case PortType::In: {
-            result = 4;
-            break;
-        }
-
-        case PortType::Out: {
-            result = 1;
-            break;
-        }
-
-        default: {
-            break;
-       }
-    }
-
-    return result;
-}
-
-
-NodeDataType AccessibilityBufferModel::dataType(PortType portType, PortIndex portIndex) const {
-    NodeDataType result = ScalarData("Scalar").type();
-
-    switch (portType) {
-        case PortType::In: {
-            switch (portIndex) {
-                case 0: {
-                    result = TextureData("Pos In World Texture").type();
-                    break;
-                }
-
-                case 1: {
-                    result = TextureData("Normal In World Texture").type();
-                    break;
-                }
-
-                case 2: {
-                    result = ScalarData("AO Radius").type();
-                    break;
-                }
-
-                case 3: {
-                    result = CameraData().type();
-                    break;
-                }
-            }
-            break;
-        }
-
-        case PortType::Out: {
-            switch (portIndex) {
-                case 0: {
-                    result = TextureData("AO Texture").type();
-                    break;
-                }
-            }
-            break;
-        }
-    }
-
-    return result;
-}
-
-
-std::shared_ptr<NodeData> AccessibilityBufferModel::outData(PortIndex portIndex) {
-    std::shared_ptr<NodeData> result = nullptr;
-
-    switch (portIndex) {
-        case 0: {
-            result = std::make_shared<TextureData>("AO Texture");
-            break;
-        }
-    }
-
-    return result;
-}
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/AccessibilityBufferModel.hpp b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/AccessibilityBufferModel.hpp
deleted file mode 100644
index adfcc77..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/AccessibilityBufferModel.hpp
+++ /dev/null
@@ -1,57 +0,0 @@
-#pragma once
-
-#include <QtCore/QObject>
-#include <QtWidgets/QLabel>
-
-#include "CameraData.hpp"
-#include "TextureData.hpp"
-#include "ScalarData.hpp"
-
-#include <nodes/NodeDataModel>
-
-#include <iostream>
-
-using QtNodes::PortType;
-using QtNodes::PortIndex;
-using QtNodes::NodeData;
-using QtNodes::NodeDataModel;
-
-class AccessibilityBufferModel : public NodeDataModel
-{
-    Q_OBJECT
-
-public:
-    AccessibilityBufferModel() {}
-
-    virtual ~AccessibilityBufferModel() {}
-
-public:
-
-    QString caption() const override {
-        return QStringLiteral("Accessibility Buffer Pass");
-    }
-
-    bool captionVisible() const override {
-        return true;
-    }
-
-    static QString Name() {
-        return QString("AccessibilityBufferPass");
-    }
-
-    QString name() const override {
-        return AccessibilityBufferModel::Name();
-    }
-
-public:
-
-    unsigned int nPorts(PortType portType) const override;
-
-    NodeDataType dataType(PortType portType, PortIndex portIndex) const override;
-
-    std::shared_ptr<NodeData> outData(PortIndex port) override;
-
-    void setInData(std::shared_ptr<NodeData> data, int port) override {}
-
-    QWidget* embeddedWidget() override { return nullptr; }
-};
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/BooleanData.hpp b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/BooleanData.hpp
deleted file mode 100644
index b4fa096..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/BooleanData.hpp
+++ /dev/null
@@ -1,28 +0,0 @@
-#pragma once
-
-#include <nodes/NodeDataModel>
-
-using QtNodes::NodeData;
-using QtNodes::NodeDataType;
-
-class BooleanData : public NodeData
-{
-public:
-
-    BooleanData(const std::string& name) : m_name(name) {}
-
-    BooleanData(const std::string& name, bool boolean)
-    : m_name(name), _boolean(boolean)
-    {}
-
-    NodeDataType type() const override {
-        return NodeDataType {"boolean", QString::fromStdString(m_name)};
-    }
-
-    bool value() const { return _boolean; }
-
-private:
-    std::string m_name {""};
-
-    bool _boolean;
-};
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/CMakeLists.txt b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/CMakeLists.txt
deleted file mode 100644
index 2e91c6d..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/CMakeLists.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-file(GLOB_RECURSE CPPS  ./*.cpp )
-
-add_executable(rendergraph ${CPPS})
-
-target_link_libraries(rendergraph nodes)
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/CameraData.hpp b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/CameraData.hpp
deleted file mode 100644
index 147348c..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/CameraData.hpp
+++ /dev/null
@@ -1,17 +0,0 @@
-#pragma once
-
-#include <nodes/NodeDataModel>
-
-using QtNodes::NodeData;
-using QtNodes::NodeDataType;
-
-class CameraData : public NodeData
-{
-public:
-
-    CameraData() {}
-
-    NodeDataType type() const override {
-        return NodeDataType {"camera", "Cameras"};
-    }
-};
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/CameraModel.cpp b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/CameraModel.cpp
deleted file mode 100644
index d3cda82..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/CameraModel.cpp
+++ /dev/null
@@ -1,31 +0,0 @@
-#include "CameraModel.hpp"
-
-unsigned int CameraModel::nPorts(PortType portType) const {
-    unsigned int result = 1;
-
-    switch (portType) {
-        case PortType::In: {
-            result = 0;
-            break;
-        }
-
-        case PortType::Out: {
-            result = 1;
-            break;
-        }
-
-        default: {
-            break;
-        }
-    }
-
-    return result;
-}
-
-NodeDataType CameraModel::dataType(PortType, PortIndex) const {
-    return CameraData().type();
-}
-
-std::shared_ptr<NodeData> CameraModel::outData(PortIndex) {
-    return std::make_shared<CameraData>();
-}
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/CameraModel.hpp b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/CameraModel.hpp
deleted file mode 100644
index c29b383..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/CameraModel.hpp
+++ /dev/null
@@ -1,54 +0,0 @@
-#pragma once
-
-#include <QtCore/QObject>
-
-#include "CameraData.hpp"
-
-#include <nodes/NodeDataModel>
-
-#include <iostream>
-
-using QtNodes::PortType;
-using QtNodes::PortIndex;
-using QtNodes::NodeData;
-using QtNodes::NodeDataModel;
-
-class CameraModel : public NodeDataModel
-{
-    Q_OBJECT
-
-public:
-    CameraModel() {}
-
-    virtual ~CameraModel() {}
-
-public:
-
-    QString caption() const override {
-        return QStringLiteral("Cameras");
-    }
-
-    bool captionVisible() const override {
-        return true;
-    }
-
-    static QString Name() {
-        return QString("Cameras");
-    }
-
-    QString name() const override {
-        return CameraModel::Name();
-    }
-
-public:
-
-    unsigned int nPorts(PortType portType) const override;
-
-    NodeDataType dataType(PortType portType, PortIndex portIndex) const override;
-
-    std::shared_ptr<NodeData> outData(PortIndex port) override;
-
-    void setInData(std::shared_ptr<NodeData> data, int) override {}
-
-    QWidget* embeddedWidget() override { return nullptr; }
-};
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/ClearColorModel.cpp b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/ClearColorModel.cpp
deleted file mode 100644
index 3368397..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/ClearColorModel.cpp
+++ /dev/null
@@ -1,83 +0,0 @@
-#include "ClearColorModel.hpp"
-
-ClearColorModel::ClearColorModel()
-  : _label(new QLabel("Clear Color"))
-{
-    QPalette palette = _label->palette();
-    palette.setColor(_label->backgroundRole(), QColor(0, 0, 0, 255));
-    palette.setColor(_label->foregroundRole(), QColor(255, 255, 255, 255));
-    _label->setAutoFillBackground(true);
-    _label->setPalette(palette);
-    _label->setMargin(3);
-}
-
-unsigned int ClearColorModel::nPorts(PortType portType) const {
-    unsigned int result = 1;
-
-    switch (portType) {
-        case PortType::In: {
-            result = 4;
-            break;
-        }
-
-        case PortType::Out: {
-            result = 1;
-            break;
-        }
-
-        default: {
-            break;
-       }
-    }
-
-    return result;
-}
-
-
-NodeDataType ClearColorModel::dataType(PortType portType, PortIndex portIndex) const {
-    NodeDataType result = ColorData("Color").type();
-
-    switch (portType) {
-        case PortType::In: {
-            switch (portIndex) {
-                case 0: {
-                    result = TextureData("Color Texture").type();
-                    break;
-                }
-
-                case 1: {
-                    result = ColorData("Clear Color").type();
-                    break;
-                }
-
-                case 2: {
-                    result = TextureData("Envmap Texture").type();
-                    break;
-                }
-
-                case 3: {
-                    result = CameraData().type();
-                    break;
-                }
-            }
-            break;
-        }
-
-        case PortType::Out: {
-            switch (portIndex) {
-                case 0: {
-                    result = TextureData("Cleared Color Texture").type();
-                    break;
-                }
-            }
-            break;
-        }
-    }
-
-    return result;
-}
-
-
-std::shared_ptr<NodeData> ClearColorModel::outData(PortIndex) {
-    return std::make_shared<TextureData>("Cleared Color Texture");
-}
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/ClearColorModel.hpp b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/ClearColorModel.hpp
deleted file mode 100644
index 8a6cf0b..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/ClearColorModel.hpp
+++ /dev/null
@@ -1,95 +0,0 @@
-#pragma once
-
-#include <QtCore/QObject>
-#include <QtWidgets/QLabel>
-
-#include "ColorData.hpp"
-#include "TextureData.hpp"
-#include "CameraData.hpp"
-
-#include <nodes/NodeDataModel>
-
-#include <iostream>
-
-using QtNodes::PortType;
-using QtNodes::PortIndex;
-using QtNodes::NodeData;
-using QtNodes::NodeDataModel;
-
-class ClearColorModel : public NodeDataModel
-{
-    Q_OBJECT
-
-public:
-    ClearColorModel();
-
-    virtual ~ClearColorModel() {}
-
-public:
-
-    QString caption() const override {
-        return QStringLiteral("Clear Color Pass");
-    }
-
-    bool captionVisible() const override {
-        return true;
-    }
-
-    static QString Name() {
-        return QString("ClearColorPass");
-    }
-
-    QString name() const override {
-        return ClearColorModel::Name();
-    }
-
-public:
-
-    unsigned int nPorts(PortType portType) const override;
-
-    NodeDataType dataType(PortType portType, PortIndex portIndex) const override;
-
-    std::shared_ptr<NodeData> outData(PortIndex port) override;
-
-    void setInData(std::shared_ptr<NodeData> data, int port) override {
-        switch (port) {
-            case 1: {
-                auto colorData = std::dynamic_pointer_cast<ColorData>(data);
-
-                if (colorData)
-                {
-                    QColor tmpColor = colorData->color();
-                    int r, g, b;
-                    tmpColor.getRgb(&r, &g, &b);
-
-                    float red = static_cast<float>(r) / 255.0;
-                    float green = static_cast<float>(g) / 255.0;
-                    float blue = static_cast<float>(b) / 255.0;
-
-                    float luminance = red * 0.2126 + green * 0.7152 + blue * 0.0722;
-                    QColor textColor = luminance >= 0.5 ? QColor(0, 0, 0, 255) : QColor(255, 255, 255, 255);
-
-                    QPalette palette = _label->palette();
-                    palette.setColor(_label->backgroundRole(), colorData->color());
-                    palette.setColor(_label->foregroundRole(), textColor);
-                    _label->setAutoFillBackground(true);
-                    _label->setPalette(palette);
-                }
-                else
-                {
-                    QPalette palette = _label->palette();
-                    palette.setColor(_label->backgroundRole(), QColor(0, 0, 0, 255));
-                    palette.setColor(_label->foregroundRole(), QColor(255, 255, 255, 255));
-                    _label->setAutoFillBackground(true);
-                    _label->setPalette(palette);
-                }
-                break;
-            }
-        }
-    }
-
-    QWidget* embeddedWidget() override { return _label; }
-
-private:
-    QLabel* _label;
-};
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/ColorData.hpp b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/ColorData.hpp
deleted file mode 100644
index 65cbc9d..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/ColorData.hpp
+++ /dev/null
@@ -1,28 +0,0 @@
-#pragma once
-
-#include <nodes/NodeDataModel>
-
-using QtNodes::NodeData;
-using QtNodes::NodeDataType;
-
-class ColorData : public NodeData
-{
-public:
-
-    ColorData(const std::string& name) : m_name(name) {}
-
-    ColorData(const std::string& name, QColor const &color)
-    : m_name(name), _color(color)
-    {}
-
-    NodeDataType type() const override {
-        return NodeDataType {"color", QString::fromStdString(m_name)};
-    }
-
-    QColor color() const { return _color; }
-
-private:
-    std::string m_name {""};
-
-    QColor _color;
-};
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/ColorSlider.cpp b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/ColorSlider.cpp
deleted file mode 100644
index 15abafb..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/ColorSlider.cpp
+++ /dev/null
@@ -1,108 +0,0 @@
-#include "ColorSlider.hpp"
-#include <QGridLayout>
-#include <QHBoxLayout>
-#include <QVBoxLayout>
-
-ColorSlider::ColorSlider(QWidget* parent) : QWidget(parent), _color(0, 0, 0, 255) {
-    QGridLayout* layout = new QGridLayout(this);
-    layout->setMargin(0);
-
-    QHBoxLayout* hLayout = new QHBoxLayout();
-    hLayout->setMargin(0);
-    layout->addLayout(hLayout, 0, 1);
-
-    QVBoxLayout* vLayout = new QVBoxLayout();
-    vLayout->setMargin(0);
-    layout->addLayout(vLayout, 0, 0);
-
-    _sliderRed = new QSlider(Qt::Horizontal, this);
-    _sliderRed->setMinimum(0);
-    _sliderRed->setMaximum(255);
-    _sliderRed->setStyleSheet("QSlider::groove:horizontal {border: 0px solid #999999; height: 8px; background: white; margin: 2px 0;} QSlider::handle:horizontal {background: qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 #b4b4b4, stop:1 #8f8f8f); border: 1px solid #5c5c5c; width: 10px; margin: -2px 0; border-radius: 1px; } QSlider::sub-page:horizontal {background: qlineargradient(x1:0, y1:0, x2:1, y2:0, stop:0 #000000, stop:1 #ff0000);}");
-    vLayout->addWidget(_sliderRed);
-
-    QPalette sliderRedPalette = _sliderRed->palette();
-    sliderRedPalette.setColor(QPalette::Window, QColor(255, 0, 0, 255));
-    _sliderRed->setPalette(sliderRedPalette);
-
-    connect(_sliderRed, &QSlider::valueChanged,
-            this, &ColorSlider::redSliderChanged);
-
-    _sliderGreen = new QSlider(Qt::Horizontal, this);
-    _sliderGreen->setMinimum(0);
-    _sliderGreen->setMaximum(255);
-    _sliderGreen->setStyleSheet("QSlider::groove:horizontal {border: 0px solid #999999; height: 8px; background: white; margin: 2px 0;} QSlider::handle:horizontal {background: qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 #b4b4b4, stop:1 #8f8f8f); border: 1px solid #5c5c5c; width: 10px; margin: -2px 0; border-radius: 1px; } QSlider::sub-page:horizontal {background: qlineargradient(x1:0, y1:0, x2:1, y2:0, stop:0 #000000, stop:1 #00ff00);}");
-    vLayout->addWidget(_sliderGreen);
-
-    QPalette sliderGreenPalette = _sliderGreen->palette();
-    sliderGreenPalette.setColor(QPalette::Window, QColor(0, 255, 0, 255));
-    sliderGreenPalette.setColor(QPalette::Dark, QColor(0, 255, 0, 255));
-    _sliderGreen->setPalette(sliderGreenPalette);
-
-    connect(_sliderGreen, &QSlider::valueChanged,
-            this, &ColorSlider::greenSliderChanged);
-
-    _sliderBlue = new QSlider(Qt::Horizontal, this);
-    _sliderBlue->setMinimum(0);
-    _sliderBlue->setMaximum(255);
-    _sliderBlue->setStyleSheet("QSlider::groove:horizontal {border: 0px solid #999999; height: 8px; background: white; margin: 2px 0;} QSlider::handle:horizontal {background: qlineargradient(x1:0, y1:0, x2:1, y2:1, stop:0 #b4b4b4, stop:1 #8f8f8f); border: 1px solid #5c5c5c; width: 10px; margin: -2px 0; border-radius: 1px; } QSlider::sub-page:horizontal {background: qlineargradient(x1:0, y1:0, x2:1, y2:0, stop:0 #000000, stop:1 #0000ff);}");
-    vLayout->addWidget(_sliderBlue);
-
-    QPalette sliderBluePalette = _sliderBlue->palette();
-    sliderBluePalette.setColor(QPalette::Window, QColor(0, 0, 255, 255));
-    _sliderBlue->setPalette(sliderBluePalette);
-
-    connect(_sliderBlue, &QSlider::valueChanged,
-            this, &ColorSlider::blueSliderChanged);
-
-    _colorLabel = new QLabel("    ", this);
-    hLayout->addWidget(_colorLabel);
-
-    QPalette colorSliderPalette;
-    colorSliderPalette.setColor(QPalette::Window, QColor(0, 0, 0 ,0));
-    setPalette(colorSliderPalette);
-}
-
-void ColorSlider::setColor(QColor newColor) {
-    _color = newColor;
-
-    QPalette palette = _colorLabel->palette();
-    palette.setColor(_colorLabel->backgroundRole(), _color);
-    _colorLabel->setAutoFillBackground(true);
-    _colorLabel->setPalette(palette);
-
-    Q_EMIT colorChanged(_color);
-}
-
-void ColorSlider::redSliderChanged(int const &value) {
-    _color.setRed(value);
-
-    QPalette palette = _colorLabel->palette();
-    palette.setColor(_colorLabel->backgroundRole(), _color);
-    _colorLabel->setAutoFillBackground(true);
-    _colorLabel->setPalette(palette);
-
-    Q_EMIT colorChanged(_color);
-}
-
-void ColorSlider::greenSliderChanged(int const &value) {
-    _color.setGreen(value);
-
-    QPalette palette = _colorLabel->palette();
-    palette.setColor(_colorLabel->backgroundRole(), _color);
-    _colorLabel->setAutoFillBackground(true);
-    _colorLabel->setPalette(palette);
-
-    Q_EMIT colorChanged(_color);
-}
-
-void ColorSlider::blueSliderChanged(int const &value) {
-    _color.setBlue(value);
-
-    QPalette palette = _colorLabel->palette();
-    palette.setColor(_colorLabel->backgroundRole(), _color);
-    _colorLabel->setAutoFillBackground(true);
-    _colorLabel->setPalette(palette);
-
-    Q_EMIT colorChanged(_color);
-}
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/ColorSlider.hpp b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/ColorSlider.hpp
deleted file mode 100644
index 83df577..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/ColorSlider.hpp
+++ /dev/null
@@ -1,45 +0,0 @@
-#pragma once
-
-#include <QWidget>
-#include <QColor>
-#include <QLabel>
-#include <QSlider>
-
-class ColorSlider : public QWidget {
-    Q_OBJECT
-
-public:
-    ColorSlider(QWidget* parent = 0);
-    ~ColorSlider() {}
-
-    QColor getColor() { return _color; }
-    void setColor(QColor newColor);
-
-    void setRedSliderValue(int newRed) {
-        _sliderRed->setValue(newRed);
-    }
-
-    void setGreenSliderValue(int newGreen) {
-        _sliderGreen->setValue(newGreen);
-    }
-
-    void setBlueSliderValue(int newBlue) {
-        _sliderBlue->setValue(newBlue);
-    }
-
-private Q_SLOTS:
-    void redSliderChanged(int const &value);
-    void greenSliderChanged(int const &value);
-    void blueSliderChanged(int const &value);
-
-Q_SIGNALS:
-    void colorChanged(QColor);
-
-private:
-    QColor _color;
-
-    QSlider* _sliderRed;
-    QSlider* _sliderGreen;
-    QSlider* _sliderBlue;
-    QLabel* _colorLabel {nullptr};
-};
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/DisplayModel.cpp b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/DisplayModel.cpp
deleted file mode 100644
index 0d72664..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/DisplayModel.cpp
+++ /dev/null
@@ -1,117 +0,0 @@
-#include "DisplayModel.hpp"
-
-unsigned int DisplayModel::nPorts(PortType portType) const {
-    unsigned int result = 1;
-
-    switch (portType) {
-        case PortType::In: {
-            result = 16;
-            break;
-        }
-
-        case PortType::Out: {
-            result = 0;
-            break;
-        }
-
-        default: {
-            break;
-       }
-    }
-
-    return result;
-}
-
-
-NodeDataType DisplayModel::dataType(PortType portType, PortIndex portIndex) const {
-    NodeDataType result = TextureData("Texture").type();
-
-    switch (portType) {
-        case PortType::In: {
-            switch (portIndex) {
-                case 0: {
-                    result = TextureData("Texture 0").type();
-                    break;
-                }
-
-                case 1: {
-                    result = TextureData("Texture 1").type();
-                    break;
-                }
-
-                case 2: {
-                    result = TextureData("Texture 2").type();
-                    break;
-                }
-
-                case 3: {
-                    result = TextureData("Texture 3").type();
-                    break;
-                }
-
-                case 4: {
-                    result = TextureData("Texture 4").type();
-                    break;
-                }
-
-                case 5: {
-                    result = TextureData("Texture 5").type();
-                    break;
-                }
-
-                case 6: {
-                    result = TextureData("Texture 6").type();
-                    break;
-                }
-
-                case 7: {
-                    result = TextureData("Texture 7").type();
-                    break;
-                }
-
-                case 8: {
-                    result = TextureData("Texture 8").type();
-                    break;
-                }
-
-                case 9: {
-                    result = TextureData("Texture 9").type();
-                    break;
-                }
-
-                case 10: {
-                    result = TextureData("Texture 10").type();
-                    break;
-                }
-
-                case 11: {
-                    result = TextureData("Texture 11").type();
-                    break;
-                }
-
-                case 12: {
-                    result = TextureData("Texture 12").type();
-                    break;
-                }
-
-                case 13: {
-                    result = TextureData("Texture 13").type();
-                    break;
-                }
-
-                case 14: {
-                    result = TextureData("Texture 14").type();
-                    break;
-                }
-
-                case 15: {
-                    result = TextureData("Texture 15").type();
-                    break;
-                }
-            }
-            break;
-        }
-    }
-
-    return result;
-}
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/DisplayModel.hpp b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/DisplayModel.hpp
deleted file mode 100644
index 040bd38..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/DisplayModel.hpp
+++ /dev/null
@@ -1,55 +0,0 @@
-#pragma once
-
-#include <QtCore/QObject>
-#include <QtWidgets/QLabel>
-
-#include "TextureData.hpp"
-
-#include <nodes/NodeDataModel>
-
-#include <iostream>
-
-using QtNodes::PortType;
-using QtNodes::PortIndex;
-using QtNodes::NodeData;
-using QtNodes::NodeDataModel;
-
-class DisplayModel : public NodeDataModel
-{
-    Q_OBJECT
-
-public:
-    DisplayModel() {}
-
-    virtual ~DisplayModel() {}
-
-public:
-
-    QString caption() const override {
-        return QStringLiteral("Display");
-    }
-
-    bool captionVisible() const override {
-        return true;
-    }
-
-    static QString Name() {
-        return QString("Display");
-    }
-
-    QString name() const override {
-        return DisplayModel::Name();
-    }
-
-public:
-
-    unsigned int nPorts(PortType portType) const override;
-
-    NodeDataType dataType(PortType portType, PortIndex portIndex) const override;
-
-    std::shared_ptr<NodeData> outData(PortIndex port) override {}
-
-    void setInData(std::shared_ptr<NodeData> data, int port) override {}
-
-    QWidget* embeddedWidget() override { return nullptr; }
-};
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/EmissivityModel.cpp b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/EmissivityModel.cpp
deleted file mode 100644
index 07a13af..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/EmissivityModel.cpp
+++ /dev/null
@@ -1,86 +0,0 @@
-#include "EmissivityModel.hpp"
-
-unsigned int EmissivityModel::nPorts(PortType portType) const {
-    unsigned int result = 1;
-
-    switch (portType) {
-        case PortType::In: {
-            result = 5;
-            break;
-        }
-
-        case PortType::Out: {
-            result = 1;
-            break;
-        }
-
-        default: {
-            break;
-       }
-    }
-
-    return result;
-}
-
-
-NodeDataType EmissivityModel::dataType(PortType portType, PortIndex portIndex) const {
-    NodeDataType result = TextureData("Texture").type();
-
-    switch (portType) {
-        case PortType::In: {
-            switch (portIndex) {
-                case 0: {
-                    result = TextureData("Color Texture").type();
-                    break;
-                }
-
-                case 1: {
-                    result = TextureData("Depth Texture").type();
-                    break;
-                }
-
-                case 2: {
-                    result = TextureData("AO Texture").type();
-                    break;
-                }
-
-                case 3: {
-                    result = RenderObjectData().type();
-                    break;
-                }
-
-                case 4: {
-                    result = CameraData().type();
-                    break;
-                }
-            }
-            break;
-        }
-
-        case PortType::Out: {
-            switch (portIndex) {
-                case 0: {
-                    result = TextureData("Color Texture").type();
-                    break;
-                }
-            }
-            break;
-        }
-    }
-
-    return result;
-}
-
-
-std::shared_ptr<NodeData> EmissivityModel::outData(PortIndex portIndex) {
-    std::shared_ptr<NodeData> result = nullptr;
-
-    switch (portIndex) {
-        case 0: {
-            result = std::make_shared<TextureData>("Color Texture");
-            break;
-        }
-    }
-
-    return result;
-}
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/EmissivityModel.hpp b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/EmissivityModel.hpp
deleted file mode 100644
index 4534cf2..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/EmissivityModel.hpp
+++ /dev/null
@@ -1,57 +0,0 @@
-#pragma once
-
-#include <QtCore/QObject>
-#include <QtWidgets/QLabel>
-
-#include "TextureData.hpp"
-#include "CameraData.hpp"
-#include "RenderObjectData.hpp"
-
-#include <nodes/NodeDataModel>
-
-#include <iostream>
-
-using QtNodes::PortType;
-using QtNodes::PortIndex;
-using QtNodes::NodeData;
-using QtNodes::NodeDataModel;
-
-class EmissivityModel : public NodeDataModel
-{
-    Q_OBJECT
-
-public:
-    EmissivityModel() {}
-
-    virtual ~EmissivityModel() {}
-
-public:
-
-    QString caption() const override {
-        return QStringLiteral("Emissivity Pass");
-    }
-
-    bool captionVisible() const override {
-        return true;
-    }
-
-    static QString Name() {
-        return QString("EmissivityPass");
-    }
-
-    QString name() const override {
-        return EmissivityModel::Name();
-    }
-
-public:
-
-    unsigned int nPorts(PortType portType) const override;
-
-    NodeDataType dataType(PortType portType, PortIndex portIndex) const override;
-
-    std::shared_ptr<NodeData> outData(PortIndex port) override;
-
-    void setInData(std::shared_ptr<NodeData> data, int port) override {}
-
-    QWidget* embeddedWidget() override { return nullptr; }
-};
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/EnvLightModel.cpp b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/EnvLightModel.cpp
deleted file mode 100644
index 043deab..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/EnvLightModel.cpp
+++ /dev/null
@@ -1,91 +0,0 @@
-#include "EnvLightModel.hpp"
-
-unsigned int EnvLightModel::nPorts(PortType portType) const {
-    unsigned int result = 1;
-
-    switch (portType) {
-        case PortType::In: {
-            result = 6;
-            break;
-        }
-
-        case PortType::Out: {
-            result = 1;
-            break;
-        }
-
-        default: {
-            break;
-       }
-    }
-
-    return result;
-}
-
-
-NodeDataType EnvLightModel::dataType(PortType portType, PortIndex portIndex) const {
-    NodeDataType result = TextureData("Texture").type();
-
-    switch (portType) {
-        case PortType::In: {
-            switch (portIndex) {
-                case 0: {
-                    result = TextureData("Color Texture").type();
-                    break;
-                }
-
-                case 1: {
-                    result = TextureData("Depth Texture").type();
-                    break;
-                }
-
-                case 2: {
-                    result = TextureData("AO Texture").type();
-                    break;
-                }
-
-                case 3: {
-                    result = TextureData("Envmap Texture").type();
-                    break;
-                }
-
-                case 4: {
-                    result = RenderObjectData().type();
-                    break;
-                }
-
-                case 5: {
-                    result = CameraData().type();
-                    break;
-                }
-            }
-            break;
-        }
-
-        case PortType::Out: {
-            switch (portIndex) {
-                case 0: {
-                    result = TextureData("Color Texture").type();
-                    break;
-                }
-            }
-            break;
-        }
-    }
-
-    return result;
-}
-
-
-std::shared_ptr<NodeData> EnvLightModel::outData(PortIndex portIndex) {
-    std::shared_ptr<NodeData> result = nullptr;
-
-    switch (portIndex) {
-        case 0: {
-            result = std::make_shared<TextureData>("Color Texture");
-            break;
-        }
-    }
-
-    return result;
-}
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/EnvLightModel.hpp b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/EnvLightModel.hpp
deleted file mode 100644
index 97c022c..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/EnvLightModel.hpp
+++ /dev/null
@@ -1,57 +0,0 @@
-#pragma once
-
-#include <QtCore/QObject>
-#include <QtWidgets/QLabel>
-
-#include "TextureData.hpp"
-#include "CameraData.hpp"
-#include "RenderObjectData.hpp"
-
-#include <nodes/NodeDataModel>
-
-#include <iostream>
-
-using QtNodes::PortType;
-using QtNodes::PortIndex;
-using QtNodes::NodeData;
-using QtNodes::NodeDataModel;
-
-class EnvLightModel : public NodeDataModel
-{
-    Q_OBJECT
-
-public:
-    EnvLightModel() {}
-
-    virtual ~EnvLightModel() {}
-
-public:
-
-    QString caption() const override {
-        return QStringLiteral("Environment Light Pass");
-    }
-
-    bool captionVisible() const override {
-        return true;
-    }
-
-    static QString Name() {
-        return QString("EnvironmentLightPass");
-    }
-
-    QString name() const override {
-        return EnvLightModel::Name();
-    }
-
-public:
-
-    unsigned int nPorts(PortType portType) const override;
-
-    NodeDataType dataType(PortType portType, PortIndex portIndex) const override;
-
-    std::shared_ptr<NodeData> outData(PortIndex port) override;
-
-    void setInData(std::shared_ptr<NodeData> data, int port) override {}
-
-    QWidget* embeddedWidget() override { return nullptr; }
-};
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/FilterRenderObjectNameModel.cpp b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/FilterRenderObjectNameModel.cpp
deleted file mode 100644
index e9cc530..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/FilterRenderObjectNameModel.cpp
+++ /dev/null
@@ -1,87 +0,0 @@
-#include "FilterRenderObjectNameModel.hpp"
-
-FilterRenderObjectNameModel::FilterRenderObjectNameModel()
-    : _lineEdit(new QLineEdit(" ")) {
-      connect(_lineEdit, &QLineEdit::textEdited,
-            this, &FilterRenderObjectNameModel::onTextEdited);
-}
-
-unsigned int FilterRenderObjectNameModel::nPorts(PortType portType) const {
-    unsigned int result = 1;
-
-    switch (portType) {
-        case PortType::In: {
-            result = 1;
-            break;
-        }
-
-        case PortType::Out: {
-            result = 1;
-            break;
-        }
-
-        default: {
-            break;
-       }
-    }
-
-    return result;
-}
-
-void FilterRenderObjectNameModel::onTextEdited(QString const &string) {
-  Q_UNUSED(string);
-
-  Q_EMIT dataUpdated(0);
-}
-
-QJsonObject FilterRenderObjectNameModel::save() const {
-    QJsonObject modelJson = NodeDataModel::save();
-
-    modelJson["filteredName"] = _lineEdit->text();
-
-    return modelJson;
-}
-
-
-void FilterRenderObjectNameModel::restore(QJsonObject const &p){
-    QJsonValue n = p["filteredName"];
-
-    if (!n.isUndefined()) {
-        QString str = n.toString();
-
-        _lineEdit->setText(str);
-    }
-}
-
-NodeDataType FilterRenderObjectNameModel::dataType(PortType portType, PortIndex portIndex) const {
-    NodeDataType result = RenderObjectData().type();
-
-    switch (portType) {
-        case PortType::In: {
-            switch (portIndex) {
-                case 0: {
-                    result = RenderObjectData().type();
-                    break;
-                }
-            }
-            break;
-        }
-
-        case PortType::Out: {
-            switch (portIndex) {
-                case 0: {
-                    result = RenderObjectData().type();
-                    break;
-                }
-            }
-            break;
-        }
-    }
-
-    return result;
-}
-
-
-std::shared_ptr<NodeData> FilterRenderObjectNameModel::outData(PortIndex) {
-    return std::make_shared<RenderObjectData>();
-}
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/FilterRenderObjectNameModel.hpp b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/FilterRenderObjectNameModel.hpp
deleted file mode 100644
index 74f52f3..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/FilterRenderObjectNameModel.hpp
+++ /dev/null
@@ -1,69 +0,0 @@
-#pragma once
-
-#include <QtCore/QObject>
-#include <QtWidgets/QLineEdit>
-
-#include "RenderObjectData.hpp"
-
-#include <nodes/NodeDataModel>
-
-#include <iostream>
-
-using QtNodes::PortType;
-using QtNodes::PortIndex;
-using QtNodes::NodeData;
-using QtNodes::NodeDataModel;
-
-class FilterRenderObjectNameModel : public NodeDataModel
-{
-    Q_OBJECT
-
-public:
-    FilterRenderObjectNameModel();
-
-    virtual ~FilterRenderObjectNameModel() {}
-
-public:
-
-    QString caption() const override {
-        return QStringLiteral("Filter RenderObject by Name");
-    }
-
-    bool captionVisible() const override {
-        return true;
-    }
-
-    static QString Name() {
-        return QString("FilterRenderObjectByName");
-    }
-
-    QString name() const override {
-        return FilterRenderObjectNameModel::Name();
-    }
-
-public:
-
-    QJsonObject save() const override;
-
-    void restore(QJsonObject const &p) override;
-
-public:
-
-    unsigned int nPorts(PortType portType) const override;
-
-    NodeDataType dataType(PortType portType, PortIndex portIndex) const override;
-
-    std::shared_ptr<NodeData> outData(PortIndex port) override;
-
-    void setInData(std::shared_ptr<NodeData> data, int port) override {}
-
-    QWidget* embeddedWidget() override { return _lineEdit; }
-
-private Q_SLOTS:
-
-    void
-    onTextEdited(QString const &string);
-
-private:
-    QLineEdit* _lineEdit;
-};
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/FilterRenderObjectTypeModel.cpp b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/FilterRenderObjectTypeModel.cpp
deleted file mode 100644
index 4385751..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/FilterRenderObjectTypeModel.cpp
+++ /dev/null
@@ -1,86 +0,0 @@
-#include "FilterRenderObjectTypeModel.hpp"
-
-FilterRenderObjectTypeModel::FilterRenderObjectTypeModel()
-  : _list(new QComboBox())
-{
-    _list->addItem("Opaque");
-    _list->addItem("Transparent");
-    _list->addItem("Volume");
-}
-
-unsigned int FilterRenderObjectTypeModel::nPorts(PortType portType) const {
-    unsigned int result = 1;
-
-    switch (portType) {
-        case PortType::In: {
-            result = 1;
-            break;
-        }
-
-        case PortType::Out: {
-            result = 1;
-            break;
-        }
-
-        default: {
-            break;
-       }
-    }
-
-    return result;
-}
-
-QJsonObject FilterRenderObjectTypeModel::save() const {
-    QJsonObject modelJson = NodeDataModel::save();
-
-    modelJson["filteredType"] = _list->currentText();
-
-    return modelJson;
-}
-
-
-void FilterRenderObjectTypeModel::restore(QJsonObject const &p){
-    QJsonValue n = p["filteredType"];
-
-    if (!n.isUndefined()) {
-        QString str = n.toString();
-
-        int i = _list->findText(str);
-        if (i != -1) {
-            _list->setCurrentIndex(i);
-        }
-    }
-}
-
-NodeDataType FilterRenderObjectTypeModel::dataType(PortType portType, PortIndex portIndex) const {
-    NodeDataType result = RenderObjectData().type();
-
-    switch (portType) {
-        case PortType::In: {
-            switch (portIndex) {
-                case 0: {
-                    result = RenderObjectData().type();
-                    break;
-                }
-            }
-            break;
-        }
-
-        case PortType::Out: {
-            switch (portIndex) {
-                case 0: {
-                    result = RenderObjectData().type();
-                    break;
-                }
-            }
-            break;
-        }
-    }
-
-    return result;
-}
-
-
-std::shared_ptr<NodeData> FilterRenderObjectTypeModel::outData(PortIndex) {
-    return std::make_shared<RenderObjectData>();
-}
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/FilterRenderObjectTypeModel.hpp b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/FilterRenderObjectTypeModel.hpp
deleted file mode 100644
index cf4028d..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/FilterRenderObjectTypeModel.hpp
+++ /dev/null
@@ -1,64 +0,0 @@
-#pragma once
-
-#include <QtCore/QObject>
-#include <QtWidgets/QComboBox>
-
-#include "RenderObjectData.hpp"
-
-#include <nodes/NodeDataModel>
-
-#include <iostream>
-
-using QtNodes::PortType;
-using QtNodes::PortIndex;
-using QtNodes::NodeData;
-using QtNodes::NodeDataModel;
-
-class FilterRenderObjectTypeModel : public NodeDataModel
-{
-    Q_OBJECT
-
-public:
-    FilterRenderObjectTypeModel();
-
-    virtual ~FilterRenderObjectTypeModel() {}
-
-public:
-
-    QString caption() const override {
-        return QStringLiteral("Filter RenderObject by Type");
-    }
-
-    bool captionVisible() const override {
-        return true;
-    }
-
-    static QString Name() {
-        return QString("FilterRenderObjectByType");
-    }
-
-    QString name() const override {
-        return FilterRenderObjectTypeModel::Name();
-    }
-
-public:
-
-    QJsonObject save() const override;
-
-    void restore(QJsonObject const &p) override;
-
-public:
-
-    unsigned int nPorts(PortType portType) const override;
-
-    NodeDataType dataType(PortType portType, PortIndex portIndex) const override;
-
-    std::shared_ptr<NodeData> outData(PortIndex port) override;
-
-    void setInData(std::shared_ptr<NodeData> data, int port) override {}
-
-    QWidget* embeddedWidget() override { return _list; }
-
-private:
-    QComboBox* _list;
-};
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/LightData.hpp b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/LightData.hpp
deleted file mode 100644
index 9e8b6c3..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/LightData.hpp
+++ /dev/null
@@ -1,17 +0,0 @@
-#pragma once
-
-#include <nodes/NodeDataModel>
-
-using QtNodes::NodeData;
-using QtNodes::NodeDataType;
-
-class LightData : public NodeData
-{
-public:
-
-    LightData() {}
-
-    NodeDataType type() const override {
-        return NodeDataType {"light", "Lights"};
-    }
-};
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/LightModel.cpp b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/LightModel.cpp
deleted file mode 100644
index e400006..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/LightModel.cpp
+++ /dev/null
@@ -1,31 +0,0 @@
-#include "LightModel.hpp"
-
-unsigned int LightModel::nPorts(PortType portType) const {
-    unsigned int result = 1;
-
-    switch (portType) {
-        case PortType::In: {
-            result = 0;
-            break;
-        }
-
-        case PortType::Out: {
-            result = 1;
-            break;
-        }
-
-        default: {
-            break;
-        }
-    }
-
-    return result;
-}
-
-NodeDataType LightModel::dataType(PortType, PortIndex) const {
-    return LightData().type();
-}
-
-std::shared_ptr<NodeData> LightModel::outData(PortIndex) {
-    return std::make_shared<LightData>();
-}
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/LightModel.hpp b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/LightModel.hpp
deleted file mode 100644
index 4a0000e..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/LightModel.hpp
+++ /dev/null
@@ -1,54 +0,0 @@
-#pragma once
-
-#include <QtCore/QObject>
-
-#include "LightData.hpp"
-
-#include <nodes/NodeDataModel>
-
-#include <iostream>
-
-using QtNodes::PortType;
-using QtNodes::PortIndex;
-using QtNodes::NodeData;
-using QtNodes::NodeDataModel;
-
-class LightModel : public NodeDataModel
-{
-    Q_OBJECT
-
-public:
-    LightModel() {}
-
-    virtual ~LightModel() {}
-
-public:
-
-    QString caption() const override {
-        return QStringLiteral("Lights");
-    }
-
-    bool captionVisible() const override {
-        return true;
-    }
-
-    static QString Name() {
-        return QString("Lights");
-    }
-
-    QString name() const override {
-        return LightModel::Name();
-    }
-
-public:
-
-    unsigned int nPorts(PortType portType) const override;
-
-    NodeDataType dataType(PortType portType, PortIndex portIndex) const override;
-
-    std::shared_ptr<NodeData> outData(PortIndex port) override;
-
-    void setInData(std::shared_ptr<NodeData> data, int) override {}
-
-    QWidget* embeddedWidget() override { return nullptr; }
-};
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/LocalLightModel.cpp b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/LocalLightModel.cpp
deleted file mode 100644
index b44fc53..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/LocalLightModel.cpp
+++ /dev/null
@@ -1,82 +0,0 @@
-#include "LocalLightModel.hpp"
-
-unsigned int LocalLightModel::nPorts(PortType portType) const {
-    unsigned int result = 1;
-
-    switch (portType) {
-        case PortType::In: {
-            result = 6;
-            break;
-        }
-
-        case PortType::Out: {
-            result = 1;
-            break;
-        }
-
-        default: {
-            break;
-       }
-    }
-
-    return result;
-}
-
-
-NodeDataType LocalLightModel::dataType(PortType portType, PortIndex portIndex) const {
-    NodeDataType result = TextureData("Texture").type();
-
-    switch (portType) {
-        case PortType::In: {
-            switch (portIndex) {
-                case 0: {
-                    result = TextureData("Color Texture").type();
-                    break;
-                }
-
-                case 1: {
-                    result = TextureData("Depth Texture").type();
-                    break;
-                }
-
-                case 2: {
-                    result = TextureData("AO Texture").type();
-                    break;
-                }
-
-                case 3: {
-                    result = RenderObjectData().type();
-                    break;
-                }
-
-                case 4: {
-                    result = CameraData().type();
-                    break;
-                }
-
-                case 5: {
-                    result = LightData().type();
-                    break;
-                }
-            }
-            break;
-        }
-
-        case PortType::Out: {
-            switch (portIndex) {
-                case 0: {
-                    result = TextureData("Color Texture").type();
-                    break;
-                }
-            }
-            break;
-        }
-    }
-
-    return result;
-}
-
-
-std::shared_ptr<NodeData> LocalLightModel::outData(PortIndex) {
-    return std::make_shared<TextureData>("Color Texture");
-}
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/LocalLightModel.hpp b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/LocalLightModel.hpp
deleted file mode 100644
index e508c6d..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/LocalLightModel.hpp
+++ /dev/null
@@ -1,58 +0,0 @@
-#pragma once
-
-#include <QtCore/QObject>
-#include <QtWidgets/QLabel>
-
-#include "TextureData.hpp"
-#include "CameraData.hpp"
-#include "RenderObjectData.hpp"
-#include "LightData.hpp"
-
-#include <nodes/NodeDataModel>
-
-#include <iostream>
-
-using QtNodes::PortType;
-using QtNodes::PortIndex;
-using QtNodes::NodeData;
-using QtNodes::NodeDataModel;
-
-class LocalLightModel : public NodeDataModel
-{
-    Q_OBJECT
-
-public:
-    LocalLightModel() {}
-
-    virtual ~LocalLightModel() {}
-
-public:
-
-    QString caption() const override {
-        return QStringLiteral("Local Light Pass");
-    }
-
-    bool captionVisible() const override {
-        return true;
-    }
-
-    static QString Name() {
-        return QString("LocalLightPass");
-    }
-
-    QString name() const override {
-        return LocalLightModel::Name();
-    }
-
-public:
-
-    unsigned int nPorts(PortType portType) const override;
-
-    NodeDataType dataType(PortType portType, PortIndex portIndex) const override;
-
-    std::shared_ptr<NodeData> outData(PortIndex port) override;
-
-    void setInData(std::shared_ptr<NodeData> data, int port) override {}
-
-    QWidget* embeddedWidget() override { return nullptr; }
-};
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/RenderObjectData.hpp b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/RenderObjectData.hpp
deleted file mode 100644
index c134ee3..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/RenderObjectData.hpp
+++ /dev/null
@@ -1,17 +0,0 @@
-#pragma once
-
-#include <nodes/NodeDataModel>
-
-using QtNodes::NodeData;
-using QtNodes::NodeDataType;
-
-class RenderObjectData : public NodeData
-{
-public:
-
-    RenderObjectData() {}
-
-    NodeDataType type() const override {
-        return NodeDataType {"renderObject", "Render Objects"};
-    }
-};
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/RenderObjectModel.cpp b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/RenderObjectModel.cpp
deleted file mode 100644
index cfc258e..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/RenderObjectModel.cpp
+++ /dev/null
@@ -1,31 +0,0 @@
-#include "RenderObjectModel.hpp"
-
-unsigned int RenderObjectModel::nPorts(PortType portType) const {
-    unsigned int result = 1;
-
-    switch (portType) {
-        case PortType::In: {
-            result = 0;
-            break;
-        }
-
-        case PortType::Out: {
-            result = 1;
-            break;
-        }
-
-        default: {
-            break;
-        }
-    }
-
-    return result;
-}
-
-NodeDataType RenderObjectModel::dataType(PortType, PortIndex) const {
-    return RenderObjectData().type();
-}
-
-std::shared_ptr<NodeData> RenderObjectModel::outData(PortIndex) {
-    return std::make_shared<RenderObjectData>();
-}
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/RenderObjectModel.hpp b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/RenderObjectModel.hpp
deleted file mode 100644
index b71dba5..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/RenderObjectModel.hpp
+++ /dev/null
@@ -1,54 +0,0 @@
-#pragma once
-
-#include <QtCore/QObject>
-
-#include "RenderObjectData.hpp"
-
-#include <nodes/NodeDataModel>
-
-#include <iostream>
-
-using QtNodes::PortType;
-using QtNodes::PortIndex;
-using QtNodes::NodeData;
-using QtNodes::NodeDataModel;
-
-class RenderObjectModel : public NodeDataModel
-{
-    Q_OBJECT
-
-public:
-    RenderObjectModel() {}
-
-    virtual ~RenderObjectModel() {}
-
-public:
-
-    QString caption() const override {
-        return QStringLiteral("RenderObjects");
-    }
-
-    bool captionVisible() const override {
-        return true;
-    }
-
-    static QString Name() {
-        return QString("RenderObjects");
-    }
-
-    QString name() const override {
-        return RenderObjectModel::Name();
-    }
-
-public:
-
-    unsigned int nPorts(PortType portType) const override;
-
-    NodeDataType dataType(PortType portType, PortIndex portIndex) const override;
-
-    std::shared_ptr<NodeData> outData(PortIndex port) override;
-
-    void setInData(std::shared_ptr<NodeData> data, int) override {}
-
-    QWidget* embeddedWidget() override { return nullptr; }
-};
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/ScalarData.hpp b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/ScalarData.hpp
deleted file mode 100644
index 19cdf60..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/ScalarData.hpp
+++ /dev/null
@@ -1,28 +0,0 @@
-#pragma once
-
-#include <nodes/NodeDataModel>
-
-using QtNodes::NodeData;
-using QtNodes::NodeDataType;
-
-class ScalarData : public NodeData
-{
-public:
-
-    ScalarData(const std::string& name) : m_name(name) {}
-
-    ScalarData(const std::string& name, float scalar)
-    : m_name(name), _scalar(scalar)
-    {}
-
-    NodeDataType type() const override {
-        return NodeDataType {"scalar", QString::fromStdString(m_name)};
-    }
-
-    float value() const { return _scalar; }
-
-private:
-    std::string m_name {""};
-
-    float _scalar;
-};
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/SourceBooleanModel.cpp b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/SourceBooleanModel.cpp
deleted file mode 100644
index a6980cf..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/SourceBooleanModel.cpp
+++ /dev/null
@@ -1,85 +0,0 @@
-#include "SourceBooleanModel.hpp"
-
-SourceBooleanModel::SourceBooleanModel()
-  : _checkBox(new QCheckBox()) {
-    connect(_checkBox, &QCheckBox::stateChanged,
-            this, &SourceBooleanModel::onStateChanged);
-}
-
-
-unsigned int SourceBooleanModel::nPorts(PortType portType) const {
-    unsigned int result = 1;
-
-    switch (portType) {
-        case PortType::In: {
-            result = 0;
-            break;
-        }
-
-        case PortType::Out: {
-            result = 1;
-            break;
-        }
-
-        default: {
-            break;
-        }
-    }
-
-    return result;
-}
-
-void SourceBooleanModel::onStateChanged(int const &state) {
-    if (state == Qt::Unchecked) {
-        _boolean = std::make_shared<BooleanData>("Boolean", false);
-    }
-    else if (state == Qt::Checked) {
-        _boolean = std::make_shared<BooleanData>("Boolean", true);
-    }
-
-    Q_EMIT dataUpdated(0);
-}
-
-QJsonObject SourceBooleanModel::save() const {
-    QJsonObject modelJson = NodeDataModel::save();
-
-    if (_boolean) {
-        if (_boolean->value()) {
-            modelJson["boolean"] = QString::number(1);
-        }
-        else {
-            modelJson["boolean"] = QString::number(0);
-        }
-    }
-
-    return modelJson;
-}
-
-
-void SourceBooleanModel::restore(QJsonObject const &p){
-    QJsonValue b = p["boolean"];
-
-    if (!b.isUndefined()) {
-        QString strNum = b.toString();
-
-        bool   ok;
-        int i = strNum.toInt(&ok);
-        if (ok)
-        {
-            if (i == 1) {
-                _checkBox->setCheckState(Qt::Checked);
-            }
-            else {
-                _checkBox->setCheckState(Qt::Unchecked);
-            }
-        }
-    }
-}
-
-NodeDataType SourceBooleanModel::dataType(PortType, PortIndex) const {
-    return BooleanData("Boolean").type();
-}
-
-std::shared_ptr<NodeData> SourceBooleanModel::outData(PortIndex) {
-    return _boolean;
-}
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/SourceBooleanModel.hpp b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/SourceBooleanModel.hpp
deleted file mode 100644
index 4c266b7..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/SourceBooleanModel.hpp
+++ /dev/null
@@ -1,70 +0,0 @@
-#pragma once
-
-#include <QtCore/QObject>
-#include <QtWidgets/QCheckBox>
-
-#include "BooleanData.hpp"
-
-#include <nodes/NodeDataModel>
-
-#include <iostream>
-
-using QtNodes::PortType;
-using QtNodes::PortIndex;
-using QtNodes::NodeData;
-using QtNodes::NodeDataModel;
-
-class SourceBooleanModel : public NodeDataModel
-{
-    Q_OBJECT
-
-public:
-    SourceBooleanModel();
-
-    virtual ~SourceBooleanModel() {}
-
-public:
-
-    QString caption() const override {
-        return QStringLiteral("Source Boolean");
-    }
-
-    bool captionVisible() const override {
-        return true;
-    }
-
-    static QString Name() {
-        return QString("SourceBoolean");
-    }
-
-    QString name() const override {
-        return SourceBooleanModel::Name();
-    }
-
-public:
-
-    QJsonObject save() const override;
-
-    void restore(QJsonObject const &p) override;
-
-public:
-
-    unsigned int nPorts(PortType portType) const override;
-
-    NodeDataType dataType(PortType portType, PortIndex portIndex) const override;
-
-    std::shared_ptr<NodeData> outData(PortIndex port) override;
-
-    void setInData(std::shared_ptr<NodeData> data, int) override {}
-
-    QWidget* embeddedWidget() override { return _checkBox; }
-
-private Q_SLOTS:
-
-    void onStateChanged(int const &state);
-
-private:
-  std::shared_ptr<BooleanData> _boolean;
-
-  QCheckBox* _checkBox;
-};
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/SourceColorModel.cpp b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/SourceColorModel.cpp
deleted file mode 100644
index fbb9819..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/SourceColorModel.cpp
+++ /dev/null
@@ -1,113 +0,0 @@
-#include "SourceColorModel.hpp"
-
-SourceColorModel::SourceColorModel()
-  : _colorSlider(new ColorSlider()) {
-    connect(_colorSlider, &ColorSlider::colorChanged,
-            this, &SourceColorModel::onColorChanged);
-}
-
-
-unsigned int SourceColorModel::nPorts(PortType portType) const {
-    unsigned int result = 1;
-
-    switch (portType) {
-        case PortType::In: {
-            result = 0;
-            break;
-        }
-
-        case PortType::Out: {
-            result = 1;
-            break;
-        }
-
-        default: {
-            break;
-        }
-    }
-
-    return result;
-}
-
-void SourceColorModel::onColorChanged(QColor const& color) {
-    Q_UNUSED(color);
-
-    Q_EMIT dataUpdated(0);
-}
-
-QJsonObject SourceColorModel::save() const {
-    QJsonObject modelJson = NodeDataModel::save();
-
-    if (_colorSlider) {
-        int r;
-        int g;
-        int b;
-        _colorSlider->getColor().getRgb(&r, &g, &b);
-        modelJson["colorRed"] = QString::number(r);
-        modelJson["colorGreen"] = QString::number(g);
-        modelJson["colorBlue"] = QString::number(b);
-    }
-
-    return modelJson;
-}
-
-
-void SourceColorModel::restore(QJsonObject const &p){
-    QColor color {0, 0, 0, 255};
-
-    QJsonValue r = p["colorRed"];
-
-    if (!r.isUndefined()) {
-        QString strNum = r.toString();
-
-        bool   ok;
-        int i = strNum.toInt(&ok);
-        if (ok)
-        {
-            color.setRed(i);
-        }
-    }
-
-    QJsonValue g = p["colorGreen"];
-
-    if (!g.isUndefined()) {
-        QString strNum = g.toString();
-
-        bool   ok;
-        int i = strNum.toInt(&ok);
-        if (ok)
-        {
-            color.setGreen(i);
-        }
-    }
-
-    QJsonValue b = p["colorBlue"];
-
-    if (!b.isUndefined()) {
-        QString strNum = b.toString();
-
-        bool   ok;
-        int i = strNum.toInt(&ok);
-        if (ok)
-        {
-            color.setBlue(i);
-        }
-    }
-
-    int newR, newG, newB;
-    color.getRgb(&newR, &newG, &newB);
-    _colorSlider->setRedSliderValue(newR);
-    _colorSlider->setGreenSliderValue(newG);
-    _colorSlider->setBlueSliderValue(newB);
-    _colorSlider->setColor(color);
-}
-
-NodeDataType SourceColorModel::dataType(PortType, PortIndex) const {
-    return ColorData("Color").type();
-}
-
-std::shared_ptr<NodeData> SourceColorModel::outData(PortIndex) {
-    return std::make_shared<ColorData>("Color", _colorSlider->getColor());
-
-    Q_EMIT dataUpdated(0);
-}
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/SourceColorModel.hpp b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/SourceColorModel.hpp
deleted file mode 100644
index 02f0b0c..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/SourceColorModel.hpp
+++ /dev/null
@@ -1,68 +0,0 @@
-#pragma once
-
-#include <QtCore/QObject>
-#include "ColorSlider.hpp"
-
-#include "ColorData.hpp"
-
-#include <nodes/NodeDataModel>
-
-#include <iostream>
-
-using QtNodes::PortType;
-using QtNodes::PortIndex;
-using QtNodes::NodeData;
-using QtNodes::NodeDataModel;
-
-class SourceColorModel : public NodeDataModel
-{
-    Q_OBJECT
-
-public:
-    SourceColorModel();
-
-    virtual ~SourceColorModel() {}
-
-public:
-
-    QString caption() const override {
-        return QStringLiteral("Source Color");
-    }
-
-    bool captionVisible() const override {
-        return true;
-    }
-
-    static QString Name() {
-        return QString("SourceColor");
-    }
-
-    QString name() const override {
-        return SourceColorModel::Name();
-    }
-
-public:
-
-    QJsonObject save() const override;
-
-    void restore(QJsonObject const &p) override;
-
-public:
-
-    unsigned int nPorts(PortType portType) const override;
-
-    NodeDataType dataType(PortType portType, PortIndex portIndex) const override;
-
-    std::shared_ptr<NodeData> outData(PortIndex port) override;
-
-    void setInData(std::shared_ptr<NodeData> data, int) override {}
-
-    QWidget* embeddedWidget() override { return _colorSlider; }
-
-private Q_SLOTS:
-
-    void onColorChanged(QColor const& color);
-
-private:
-    ColorSlider* _colorSlider;
-};
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/SourceColorTextureModel.cpp b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/SourceColorTextureModel.cpp
deleted file mode 100644
index 73a3434..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/SourceColorTextureModel.cpp
+++ /dev/null
@@ -1,31 +0,0 @@
-#include "SourceColorTextureModel.hpp"
-
-unsigned int SourceColorTextureModel::nPorts(PortType portType) const {
-    unsigned int result = 1;
-
-    switch (portType) {
-        case PortType::In: {
-            result = 0;
-            break;
-        }
-
-        case PortType::Out: {
-            result = 1;
-            break;
-        }
-
-        default: {
-            break;
-        }
-    }
-
-    return result;
-}
-
-NodeDataType SourceColorTextureModel::dataType(PortType, PortIndex) const {
-    return TextureData("Color Texture").type();
-}
-
-std::shared_ptr<NodeData> SourceColorTextureModel::outData(PortIndex) {
-    return std::make_shared<TextureData>("Color Texture");
-}
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/SourceColorTextureModel.hpp b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/SourceColorTextureModel.hpp
deleted file mode 100644
index ce4db2d..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/SourceColorTextureModel.hpp
+++ /dev/null
@@ -1,54 +0,0 @@
-#pragma once
-
-#include <QtCore/QObject>
-
-#include "TextureData.hpp"
-
-#include <nodes/NodeDataModel>
-
-#include <iostream>
-
-using QtNodes::PortType;
-using QtNodes::PortIndex;
-using QtNodes::NodeData;
-using QtNodes::NodeDataModel;
-
-class SourceColorTextureModel : public NodeDataModel
-{
-    Q_OBJECT
-
-public:
-    SourceColorTextureModel() {}
-
-    virtual ~SourceColorTextureModel() {}
-
-public:
-
-    QString caption() const override {
-        return QStringLiteral("Source Color Texture");
-    }
-
-    bool captionVisible() const override {
-        return true;
-    }
-
-    static QString Name() {
-        return QString("SourceColorTexture");
-    }
-
-    QString name() const override {
-        return SourceColorTextureModel::Name();
-    }
-
-public:
-
-    unsigned int nPorts(PortType portType) const override;
-
-    NodeDataType dataType(PortType portType, PortIndex portIndex) const override;
-
-    std::shared_ptr<NodeData> outData(PortIndex port) override;
-
-    void setInData(std::shared_ptr<NodeData> data, int) override {}
-
-    QWidget* embeddedWidget() override { return nullptr; }
-};
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/SourceDepthTextureModel.cpp b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/SourceDepthTextureModel.cpp
deleted file mode 100644
index c4b1abd..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/SourceDepthTextureModel.cpp
+++ /dev/null
@@ -1,31 +0,0 @@
-#include "SourceDepthTextureModel.hpp"
-
-unsigned int SourceDepthTextureModel::nPorts(PortType portType) const {
-    unsigned int result = 1;
-
-    switch (portType) {
-        case PortType::In: {
-            result = 0;
-            break;
-        }
-
-        case PortType::Out: {
-            result = 1;
-            break;
-        }
-
-        default: {
-            break;
-        }
-    }
-
-    return result;
-}
-
-NodeDataType SourceDepthTextureModel::dataType(PortType, PortIndex) const {
-    return TextureData("Depth Texture").type();
-}
-
-std::shared_ptr<NodeData> SourceDepthTextureModel::outData(PortIndex) {
-    return std::make_shared<TextureData>("Depth Texture");
-}
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/SourceDepthTextureModel.hpp b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/SourceDepthTextureModel.hpp
deleted file mode 100644
index 4c59efd..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/SourceDepthTextureModel.hpp
+++ /dev/null
@@ -1,54 +0,0 @@
-#pragma once
-
-#include <QtCore/QObject>
-
-#include "TextureData.hpp"
-
-#include <nodes/NodeDataModel>
-
-#include <iostream>
-
-using QtNodes::PortType;
-using QtNodes::PortIndex;
-using QtNodes::NodeData;
-using QtNodes::NodeDataModel;
-
-class SourceDepthTextureModel : public NodeDataModel
-{
-    Q_OBJECT
-
-public:
-    SourceDepthTextureModel() {}
-
-    virtual ~SourceDepthTextureModel() {}
-
-public:
-
-    QString caption() const override {
-        return QStringLiteral("Source Depth Texture");
-    }
-
-    bool captionVisible() const override {
-        return true;
-    }
-
-    static QString Name() {
-        return QString("SourceDepthTexture");
-    }
-
-    QString name() const override {
-        return SourceDepthTextureModel::Name();
-    }
-
-public:
-
-    unsigned int nPorts(PortType portType) const override;
-
-    NodeDataType dataType(PortType portType, PortIndex portIndex) const override;
-
-    std::shared_ptr<NodeData> outData(PortIndex port) override;
-
-    void setInData(std::shared_ptr<NodeData> data, int) override {}
-
-    QWidget* embeddedWidget() override { return nullptr; }
-};
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/SourceScalarModel.cpp b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/SourceScalarModel.cpp
deleted file mode 100644
index 4ab7019..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/SourceScalarModel.cpp
+++ /dev/null
@@ -1,90 +0,0 @@
-#include "SourceScalarModel.hpp"
-
-#include <QtGui/QDoubleValidator>
-
-SourceScalarModel::SourceScalarModel()
-  : _lineEdit(new QLineEdit()) {
-    _lineEdit->setValidator(new QDoubleValidator());
-
-    _lineEdit->setMaximumSize(_lineEdit->sizeHint());
-
-    connect(_lineEdit, &QLineEdit::textChanged,
-            this, &SourceScalarModel::onTextEdited);
-
-    _lineEdit->setText("0.0");
-}
-
-
-unsigned int SourceScalarModel::nPorts(PortType portType) const {
-    unsigned int result = 1;
-
-    switch (portType) {
-        case PortType::In: {
-            result = 0;
-            break;
-        }
-
-        case PortType::Out: {
-            result = 1;
-            break;
-        }
-
-        default: {
-            break;
-        }
-    }
-
-    return result;
-}
-
-void SourceScalarModel::onTextEdited(QString const &string) {
-    Q_UNUSED(string);
-
-    bool ok = false;
-
-    float number = _lineEdit->text().toFloat(&ok);
-
-    if (ok) {
-        _number = std::make_shared<ScalarData>("Scalar", number);
-
-        Q_EMIT dataUpdated(0);
-    }
-    else {
-        Q_EMIT dataInvalidated(0);
-    }
-}
-
-QJsonObject SourceScalarModel::save() const {
-    QJsonObject modelJson = NodeDataModel::save();
-
-    if (_number) {
-        modelJson["number"] = QString::number(_number->value());
-    }
-
-    return modelJson;
-}
-
-
-void SourceScalarModel::restore(QJsonObject const &p){
-    QJsonValue n = p["number"];
-
-    if (!n.isUndefined()) {
-        QString strNum = n.toString();
-
-        bool   ok;
-        float f = strNum.toFloat(&ok);
-        if (ok)
-        {
-            _number = std::make_shared<ScalarData>("Scalar", f);
-            _lineEdit->setText(strNum);
-        }
-    }
-}
-
-NodeDataType SourceScalarModel::dataType(PortType, PortIndex) const {
-    return ScalarData("Scalar").type();
-}
-
-std::shared_ptr<NodeData> SourceScalarModel::outData(PortIndex) {
-    return _number;
-}
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/SourceScalarModel.hpp b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/SourceScalarModel.hpp
deleted file mode 100644
index 02154dd..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/SourceScalarModel.hpp
+++ /dev/null
@@ -1,71 +0,0 @@
-#pragma once
-
-#include <QtCore/QObject>
-#include <QtWidgets/QLineEdit>
-
-#include "ScalarData.hpp"
-
-#include <nodes/NodeDataModel>
-
-#include <iostream>
-
-using QtNodes::PortType;
-using QtNodes::PortIndex;
-using QtNodes::NodeData;
-using QtNodes::NodeDataModel;
-
-class SourceScalarModel : public NodeDataModel
-{
-    Q_OBJECT
-
-public:
-    SourceScalarModel();
-
-    virtual ~SourceScalarModel() {}
-
-public:
-
-    QString caption() const override {
-        return QStringLiteral("Source Scalar");
-    }
-
-    bool captionVisible() const override {
-        return true;
-    }
-
-    static QString Name() {
-        return QString("SourceScalar");
-    }
-
-    QString name() const override {
-        return SourceScalarModel::Name();
-    }
-
-public:
-
-    QJsonObject save() const override;
-
-    void restore(QJsonObject const &p) override;
-
-public:
-
-    unsigned int nPorts(PortType portType) const override;
-
-    NodeDataType dataType(PortType portType, PortIndex portIndex) const override;
-
-    std::shared_ptr<NodeData> outData(PortIndex port) override;
-
-    void setInData(std::shared_ptr<NodeData> data, int) override {}
-
-    QWidget* embeddedWidget() override { return _lineEdit; }
-
-private Q_SLOTS:
-
-  void
-  onTextEdited(QString const &string);
-
-private:
-  std::shared_ptr<ScalarData> _number;
-
-  QLineEdit * _lineEdit;
-};
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/TextData.hpp b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/TextData.hpp
deleted file mode 100644
index 3c5cf06..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/TextData.hpp
+++ /dev/null
@@ -1,27 +0,0 @@
-#pragma once
-
-#include <nodes/NodeDataModel>
-
-using QtNodes::NodeData;
-using QtNodes::NodeDataType;
-
-class TextData : public NodeData
-{
-public:
-
-    TextData() {}
-
-    TextData(QString const &text)
-        : _text(text)
-    {}
-
-    NodeDataType type() const override {
-        return NodeDataType {"text", "Text"};
-    }
-
-    QString text() const { return _text; }
-
-private:
-
-    QString _text;
-};
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/TextureData.hpp b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/TextureData.hpp
deleted file mode 100644
index 947a7c4..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/TextureData.hpp
+++ /dev/null
@@ -1,20 +0,0 @@
-#pragma once
-
-#include <nodes/NodeDataModel>
-
-using QtNodes::NodeData;
-using QtNodes::NodeDataType;
-
-class TextureData : public NodeData
-{
-public:
-
-    TextureData(const std::string& name) : m_name(name) {}
-
-    NodeDataType type() const override {
-        return NodeDataType {"texture", QString::fromStdString(m_name)};
-    }
-
-private:
-    std::string m_name {""};
-};
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/TransparencyModel.cpp b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/TransparencyModel.cpp
deleted file mode 100644
index cfb0ec2..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/TransparencyModel.cpp
+++ /dev/null
@@ -1,82 +0,0 @@
-#include "TransparencyModel.hpp"
-
-unsigned int TransparencyModel::nPorts(PortType portType) const {
-    unsigned int result = 1;
-
-    switch (portType) {
-        case PortType::In: {
-            result = 6;
-            break;
-        }
-
-        case PortType::Out: {
-            result = 1;
-            break;
-        }
-
-        default: {
-            break;
-       }
-    }
-
-    return result;
-}
-
-
-NodeDataType TransparencyModel::dataType(PortType portType, PortIndex portIndex) const {
-    NodeDataType result = TextureData("Texture").type();
-
-    switch (portType) {
-        case PortType::In: {
-            switch (portIndex) {
-                case 0: {
-                    result = TextureData("Color Texture").type();
-                    break;
-                }
-
-                case 1: {
-                    result = TextureData("Depth Texture").type();
-                    break;
-                }
-
-                case 2: {
-                    result = TextureData("AO Texture").type();
-                    break;
-                }
-
-                case 3: {
-                    result = RenderObjectData().type();
-                    break;
-                }
-
-                case 4: {
-                    result = CameraData().type();
-                    break;
-                }
-
-                case 5: {
-                    result = LightData().type();
-                    break;
-                }
-            }
-            break;
-        }
-
-        case PortType::Out: {
-            switch (portIndex) {
-                case 0: {
-                    result = TextureData("Color Texture").type();
-                    break;
-                }
-            }
-            break;
-        }
-    }
-
-    return result;
-}
-
-
-std::shared_ptr<NodeData> TransparencyModel::outData(PortIndex) {
-    return std::make_shared<TextureData>("Color Texture");
-}
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/TransparencyModel.hpp b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/TransparencyModel.hpp
deleted file mode 100644
index 128ee1d..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/TransparencyModel.hpp
+++ /dev/null
@@ -1,58 +0,0 @@
-#pragma once
-
-#include <QtCore/QObject>
-#include <QtWidgets/QLabel>
-
-#include "TextureData.hpp"
-#include "CameraData.hpp"
-#include "RenderObjectData.hpp"
-#include "LightData.hpp"
-
-#include <nodes/NodeDataModel>
-
-#include <iostream>
-
-using QtNodes::PortType;
-using QtNodes::PortIndex;
-using QtNodes::NodeData;
-using QtNodes::NodeDataModel;
-
-class TransparencyModel : public NodeDataModel
-{
-    Q_OBJECT
-
-public:
-    TransparencyModel() {}
-
-    virtual ~TransparencyModel() {}
-
-public:
-
-    QString caption() const override {
-        return QStringLiteral("Transparency Pass");
-    }
-
-    bool captionVisible() const override {
-        return true;
-    }
-
-    static QString Name() {
-        return QString("TransparencyPass");
-    }
-
-    QString name() const override {
-        return TransparencyModel::Name();
-    }
-
-public:
-
-    unsigned int nPorts(PortType portType) const override;
-
-    NodeDataType dataType(PortType portType, PortIndex portIndex) const override;
-
-    std::shared_ptr<NodeData> outData(PortIndex port) override;
-
-    void setInData(std::shared_ptr<NodeData> data, int port) override {}
-
-    QWidget* embeddedWidget() override { return nullptr; }
-};
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/UIModel.cpp b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/UIModel.cpp
deleted file mode 100644
index c83b295..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/UIModel.cpp
+++ /dev/null
@@ -1,77 +0,0 @@
-#include "UIModel.hpp"
-
-unsigned int UIModel::nPorts(PortType portType) const {
-    unsigned int result = 1;
-
-    switch (portType) {
-        case PortType::In: {
-            result = 5;
-            break;
-        }
-
-        case PortType::Out: {
-            result = 1;
-            break;
-        }
-
-        default: {
-            break;
-       }
-    }
-
-    return result;
-}
-
-
-NodeDataType UIModel::dataType(PortType portType, PortIndex portIndex) const {
-    NodeDataType result = TextureData("Texture").type();
-
-    switch (portType) {
-        case PortType::In: {
-            switch (portIndex) {
-                case 0: {
-                    result = TextureData("Color Texture").type();
-                    break;
-                }
-
-                case 1: {
-                    result = TextureData("Depth Texture").type();
-                    break;
-                }
-
-                case 2: {
-                    result = BooleanData("Activate").type();
-                    break;
-                }
-
-                case 3: {
-                    result = RenderObjectData().type();
-                    break;
-                }
-
-                case 4: {
-                    result = CameraData().type();
-                    break;
-                }
-            }
-            break;
-        }
-
-        case PortType::Out: {
-            switch (portIndex) {
-                case 0: {
-                    result = TextureData("Color Texture").type();
-                    break;
-                }
-            }
-            break;
-        }
-    }
-
-    return result;
-}
-
-
-std::shared_ptr<NodeData> UIModel::outData(PortIndex) {
-    return std::make_shared<TextureData>("Color Texture");
-}
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/UIModel.hpp b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/UIModel.hpp
deleted file mode 100644
index 9f0077c..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/UIModel.hpp
+++ /dev/null
@@ -1,58 +0,0 @@
-#pragma once
-
-#include <QtCore/QObject>
-#include <QtWidgets/QLabel>
-
-#include "TextureData.hpp"
-#include "CameraData.hpp"
-#include "RenderObjectData.hpp"
-#include "BooleanData.hpp"
-
-#include <nodes/NodeDataModel>
-
-#include <iostream>
-
-using QtNodes::PortType;
-using QtNodes::PortIndex;
-using QtNodes::NodeData;
-using QtNodes::NodeDataModel;
-
-class UIModel : public NodeDataModel
-{
-    Q_OBJECT
-
-public:
-    UIModel() {}
-
-    virtual ~UIModel() {}
-
-public:
-
-    QString caption() const override {
-        return QStringLiteral("User Interface Pass");
-    }
-
-    bool captionVisible() const override {
-        return true;
-    }
-
-    static QString Name() {
-        return QString("UserInterfacePass");
-    }
-
-    QString name() const override {
-        return UIModel::Name();
-    }
-
-public:
-
-    unsigned int nPorts(PortType portType) const override;
-
-    NodeDataType dataType(PortType portType, PortIndex portIndex) const override;
-
-    std::shared_ptr<NodeData> outData(PortIndex port) override;
-
-    void setInData(std::shared_ptr<NodeData> data, int port) override {}
-
-    QWidget* embeddedWidget() override { return nullptr; }
-};
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/VolumeModel.cpp b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/VolumeModel.cpp
deleted file mode 100644
index 64dced7..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/VolumeModel.cpp
+++ /dev/null
@@ -1,77 +0,0 @@
-#include "VolumeModel.hpp"
-
-unsigned int VolumeModel::nPorts(PortType portType) const {
-    unsigned int result = 1;
-
-    switch (portType) {
-        case PortType::In: {
-            result = 5;
-            break;
-        }
-
-        case PortType::Out: {
-            result = 1;
-            break;
-        }
-
-        default: {
-            break;
-       }
-    }
-
-    return result;
-}
-
-
-NodeDataType VolumeModel::dataType(PortType portType, PortIndex portIndex) const {
-    NodeDataType result = TextureData("Texture").type();
-
-    switch (portType) {
-        case PortType::In: {
-            switch (portIndex) {
-                case 0: {
-                    result = TextureData("Color Texture").type();
-                    break;
-                }
-
-                case 1: {
-                    result = TextureData("Depth Texture").type();
-                    break;
-                }
-
-                case 2: {
-                    result = RenderObjectData().type();
-                    break;
-                }
-
-                case 3: {
-                    result = CameraData().type();
-                    break;
-                }
-
-                case 4: {
-                    result = LightData().type();
-                    break;
-                }
-            }
-            break;
-        }
-
-        case PortType::Out: {
-            switch (portIndex) {
-                case 0: {
-                    result = TextureData("Color Texture").type();
-                    break;
-                }
-            }
-            break;
-        }
-    }
-
-    return result;
-}
-
-
-std::shared_ptr<NodeData> VolumeModel::outData(PortIndex) {
-    return std::make_shared<TextureData>("Color Texture");
-}
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/VolumeModel.hpp b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/VolumeModel.hpp
deleted file mode 100644
index 4201a27..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/VolumeModel.hpp
+++ /dev/null
@@ -1,58 +0,0 @@
-#pragma once
-
-#include <QtCore/QObject>
-#include <QtWidgets/QLabel>
-
-#include "TextureData.hpp"
-#include "CameraData.hpp"
-#include "RenderObjectData.hpp"
-#include "LightData.hpp"
-
-#include <nodes/NodeDataModel>
-
-#include <iostream>
-
-using QtNodes::PortType;
-using QtNodes::PortIndex;
-using QtNodes::NodeData;
-using QtNodes::NodeDataModel;
-
-class VolumeModel : public NodeDataModel
-{
-    Q_OBJECT
-
-public:
-    VolumeModel() {}
-
-    virtual ~VolumeModel() {}
-
-public:
-
-    QString caption() const override {
-        return QStringLiteral("Volume Pass");
-    }
-
-    bool captionVisible() const override {
-        return true;
-    }
-
-    static QString Name() {
-        return QString("VolumePass");
-    }
-
-    QString name() const override {
-        return VolumeModel::Name();
-    }
-
-public:
-
-    unsigned int nPorts(PortType portType) const override;
-
-    NodeDataType dataType(PortType portType, PortIndex portIndex) const override;
-
-    std::shared_ptr<NodeData> outData(PortIndex port) override;
-
-    void setInData(std::shared_ptr<NodeData> data, int port) override {}
-
-    QWidget* embeddedWidget() override { return nullptr; }
-};
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/WireframeModel.cpp b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/WireframeModel.cpp
deleted file mode 100644
index 2d80a9a..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/WireframeModel.cpp
+++ /dev/null
@@ -1,77 +0,0 @@
-#include "WireframeModel.hpp"
-
-unsigned int WireframeModel::nPorts(PortType portType) const {
-    unsigned int result = 1;
-
-    switch (portType) {
-        case PortType::In: {
-            result = 5;
-            break;
-        }
-
-        case PortType::Out: {
-            result = 1;
-            break;
-        }
-
-        default: {
-            break;
-       }
-    }
-
-    return result;
-}
-
-
-NodeDataType WireframeModel::dataType(PortType portType, PortIndex portIndex) const {
-    NodeDataType result = TextureData("Texture").type();
-
-    switch (portType) {
-        case PortType::In: {
-            switch (portIndex) {
-                case 0: {
-                    result = TextureData("Color Texture").type();
-                    break;
-                }
-
-                case 1: {
-                    result = TextureData("Depth Texture").type();
-                    break;
-                }
-
-                case 2: {
-                    result = BooleanData("Activate").type();
-                    break;
-                }
-
-                case 3: {
-                    result = RenderObjectData().type();
-                    break;
-                }
-
-                case 4: {
-                    result = CameraData().type();
-                    break;
-                }
-            }
-            break;
-        }
-
-        case PortType::Out: {
-            switch (portIndex) {
-                case 0: {
-                    result = TextureData("Color Texture").type();
-                    break;
-                }
-            }
-            break;
-        }
-    }
-
-    return result;
-}
-
-
-std::shared_ptr<NodeData> WireframeModel::outData(PortIndex) {
-    return std::make_shared<TextureData>("Color Texture");
-}
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/WireframeModel.hpp b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/WireframeModel.hpp
deleted file mode 100644
index fe6e4b2..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/WireframeModel.hpp
+++ /dev/null
@@ -1,58 +0,0 @@
-#pragma once
-
-#include <QtCore/QObject>
-#include <QtWidgets/QLabel>
-
-#include "TextureData.hpp"
-#include "CameraData.hpp"
-#include "RenderObjectData.hpp"
-#include "BooleanData.hpp"
-
-#include <nodes/NodeDataModel>
-
-#include <iostream>
-
-using QtNodes::PortType;
-using QtNodes::PortIndex;
-using QtNodes::NodeData;
-using QtNodes::NodeDataModel;
-
-class WireframeModel : public NodeDataModel
-{
-    Q_OBJECT
-
-public:
-    WireframeModel() {}
-
-    virtual ~WireframeModel() {}
-
-public:
-
-    QString caption() const override {
-        return QStringLiteral("Wireframe Pass");
-    }
-
-    bool captionVisible() const override {
-        return true;
-    }
-
-    static QString Name() {
-        return QString("WireframePass");
-    }
-
-    QString name() const override {
-        return WireframeModel::Name();
-    }
-
-public:
-
-    unsigned int nPorts(PortType portType) const override;
-
-    NodeDataType dataType(PortType portType, PortIndex portIndex) const override;
-
-    std::shared_ptr<NodeData> outData(PortIndex port) override;
-
-    void setInData(std::shared_ptr<NodeData> data, int port) override {}
-
-    QWidget* embeddedWidget() override { return nullptr; }
-};
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/ZGeomPrepassModel.cpp b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/ZGeomPrepassModel.cpp
deleted file mode 100644
index 802ba26..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/ZGeomPrepassModel.cpp
+++ /dev/null
@@ -1,91 +0,0 @@
-#include "ZGeomPrepassModel.hpp"
-
-unsigned int ZGeomPrepassModel::nPorts(PortType portType) const {
-    unsigned int result = 1;
-
-    switch (portType) {
-        case PortType::In: {
-            result = 2;
-            break;
-        }
-
-        case PortType::Out: {
-            result = 3;
-            break;
-        }
-
-        default: {
-            break;
-       }
-    }
-
-    return result;
-}
-
-
-NodeDataType ZGeomPrepassModel::dataType(PortType portType, PortIndex portIndex) const {
-    NodeDataType result = ColorData("Color").type();
-
-    switch (portType) {
-        case PortType::In: {
-            switch (portIndex) {
-                case 0: {
-                    result = RenderObjectData().type();
-                    break;
-                }
-
-                case 1: {
-                    result = CameraData().type();
-                    break;
-                }
-            }
-            break;
-        }
-
-        case PortType::Out: {
-            switch (portIndex) {
-                case 0: {
-                    result = TextureData("Depth Texture").type();
-                    break;
-                }
-
-                case 1: {
-                    result = TextureData("Pos In World Texture").type();
-                    break;
-                }
-
-                case 2: {
-                    result = TextureData("Normal In World Texture").type();
-                    break;
-                }
-            }
-            break;
-        }
-    }
-
-    return result;
-}
-
-
-std::shared_ptr<NodeData> ZGeomPrepassModel::outData(PortIndex portIndex) {
-    std::shared_ptr<NodeData> result = nullptr;
-
-    switch (portIndex) {
-        case 0: {
-            result = std::make_shared<TextureData>("Depth Texture");
-            break;
-        }
-
-        case 1: {
-            result = std::make_shared<TextureData>("Pos In World Texture");
-            break;
-        }
-
-        case 2: {
-            result = std::make_shared<TextureData>("Normal In World Texture");
-            break;
-        }
-    }
-
-    return result;
-}
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/ZGeomPrepassModel.hpp b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/ZGeomPrepassModel.hpp
deleted file mode 100644
index 77e9d13..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/ZGeomPrepassModel.hpp
+++ /dev/null
@@ -1,58 +0,0 @@
-#pragma once
-
-#include <QtCore/QObject>
-#include <QtWidgets/QLabel>
-
-#include "ColorData.hpp"
-#include "TextureData.hpp"
-#include "CameraData.hpp"
-#include "RenderObjectData.hpp"
-
-#include <nodes/NodeDataModel>
-
-#include <iostream>
-
-using QtNodes::PortType;
-using QtNodes::PortIndex;
-using QtNodes::NodeData;
-using QtNodes::NodeDataModel;
-
-class ZGeomPrepassModel : public NodeDataModel
-{
-    Q_OBJECT
-
-public:
-    ZGeomPrepassModel() {}
-
-    virtual ~ZGeomPrepassModel() {}
-
-public:
-
-    QString caption() const override {
-        return QStringLiteral("Z Geom Prepass");
-    }
-
-    bool captionVisible() const override {
-        return true;
-    }
-
-    static QString Name() {
-        return QString("ZGeomPrepass");
-    }
-
-    QString name() const override {
-        return ZGeomPrepassModel::Name();
-    }
-
-public:
-
-    unsigned int nPorts(PortType portType) const override;
-
-    NodeDataType dataType(PortType portType, PortIndex portIndex) const override;
-
-    std::shared_ptr<NodeData> outData(PortIndex port) override;
-
-    void setInData(std::shared_ptr<NodeData> data, int port) override {}
-
-    QWidget* embeddedWidget() override { return nullptr; }
-};
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/main.cpp b/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/main.cpp
deleted file mode 100644
index 830ce6a..0000000
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/examples/rendergraph/main.cpp
+++ /dev/null
@@ -1,116 +0,0 @@
-#include <nodes/NodeData>
-#include <nodes/FlowScene>
-#include <nodes/FlowView>
-
-#include <QtWidgets/QApplication>
-#include <QMenuBar>
-#include <QVBoxLayout>
-
-#include <nodes/DataModelRegistry>
-#include <nodes/ConnectionStyle>
-
-#include "RenderObjectModel.hpp"
-#include "LightModel.hpp"
-#include "CameraModel.hpp"
-
-#include "FilterRenderObjectNameModel.hpp"
-#include "FilterRenderObjectTypeModel.hpp"
-
-#include "ClearColorModel.hpp"
-#include "ZGeomPrepassModel.hpp"
-#include "AccessibilityBufferModel.hpp"
-#include "EnvLightModel.hpp"
-#include "LocalLightModel.hpp"
-#include "EmissivityModel.hpp"
-#include "TransparencyModel.hpp"
-#include "VolumeModel.hpp"
-#include "UIModel.hpp"
-#include "WireframeModel.hpp"
-
-#include "SourceColorModel.hpp"
-#include "SourceBooleanModel.hpp"
-#include "SourceScalarModel.hpp"
-#include "SourceColorTextureModel.hpp"
-#include "SourceDepthTextureModel.hpp"
-
-#include "DisplayModel.hpp"
-
-using QtNodes::DataModelRegistry;
-using QtNodes::FlowView;
-using QtNodes::FlowScene;
-using QtNodes::ConnectionStyle;
-
-static std::shared_ptr<DataModelRegistry> registerDataModels() {
-    auto ret = std::make_shared<DataModelRegistry>();
-
-    ret->registerModel<RenderObjectModel>("Data");
-    ret->registerModel<LightModel>("Data");
-    ret->registerModel<CameraModel>("Data");
-
-    ret->registerModel<FilterRenderObjectNameModel>("Filters");
-    ret->registerModel<FilterRenderObjectTypeModel>("Filters");
-
-    ret->registerModel<ClearColorModel>("Premade Nodes");
-    ret->registerModel<ZGeomPrepassModel>("Premade Nodes");
-    ret->registerModel<AccessibilityBufferModel>("Premade Nodes");
-    ret->registerModel<EnvLightModel>("Premade Nodes");
-    ret->registerModel<LocalLightModel>("Premade Nodes");
-    ret->registerModel<EmissivityModel>("Premade Nodes");
-    ret->registerModel<TransparencyModel>("Premade Nodes");
-    ret->registerModel<VolumeModel>("Premade Nodes");
-    ret->registerModel<UIModel>("Premade Nodes");
-    ret->registerModel<WireframeModel>("Premade Nodes");
-
-    ret->registerModel<SourceColorModel>("Sources");
-    ret->registerModel<SourceBooleanModel>("Sources");
-    ret->registerModel<SourceScalarModel>("Sources");
-    ret->registerModel<SourceColorTextureModel>("Sources");
-    ret->registerModel<SourceDepthTextureModel>("Sources");
-
-    ret->registerModel<DisplayModel>("Sinks");
-
-    return ret;
-}
-
-static void setStyle() {
-    ConnectionStyle::setConnectionStyle(
-        R"(
-        {
-            "ConnectionStyle": {
-                "UseDataDefinedColors": true
-            }
-        }
-        )");
-}
-
-int main(int argc, char *argv[]) {
-    QApplication app(argc, argv);
-
-    setStyle();
-
-    QWidget mainWidget;
-
-    auto menuBar    = new QMenuBar();
-    auto saveAction = menuBar->addAction("Save...");
-    auto loadAction = menuBar->addAction("Load...");
-
-    QVBoxLayout *l = new QVBoxLayout(&mainWidget);
-    l->addWidget(menuBar);
-
-    auto scene = new FlowScene(registerDataModels(), &mainWidget);
-    l->addWidget(new FlowView(scene));
-    l->setContentsMargins(0, 0, 0, 0);
-    l->setSpacing(0);
-
-    QObject::connect(saveAction, &QAction::triggered,
-                     scene, &FlowScene::save);
-
-    QObject::connect(loadAction, &QAction::triggered,
-                     scene, &FlowScene::load);
-
-    mainWidget.setWindowTitle("RenderGraph Node Editor");
-    mainWidget.resize(800, 600);
-    mainWidget.show();
-
-    return app.exec();
-}
diff --git a/src/libRender/RadiumNBR/Gui/NodeEditor/src/Node.cpp b/src/libRender/RadiumNBR/Gui/NodeEditor/src/Node.cpp
index 8ad34c3..dc097a4 100644
--- a/src/libRender/RadiumNBR/Gui/NodeEditor/src/Node.cpp
+++ b/src/libRender/RadiumNBR/Gui/NodeEditor/src/Node.cpp
@@ -74,8 +74,11 @@ restore(QJsonObject const& json)
   QPointF     point(positionJson["x"].toDouble(),
                     positionJson["y"].toDouble());
   _nodeGraphicsObject->setPos(point);
-
+#ifdef ORIGINAL_NODEEDITOR
   _nodeDataModel->restore(json["model"].toObject());
+#else
+  _nodeDataModel->restore(json);
+#endif
 }
 
 
diff --git a/src/libRender/RadiumNBR/Gui/RenderGraphEditor/FilterRenderObjectNameModel.cpp b/src/libRender/RadiumNBR/Gui/RenderGraphEditor/FilterRenderObjectNameModel.cpp
deleted file mode 100644
index f233f37..0000000
--- a/src/libRender/RadiumNBR/Gui/RenderGraphEditor/FilterRenderObjectNameModel.cpp
+++ /dev/null
@@ -1,105 +0,0 @@
-#include "FilterRenderObjectNameModel.hpp"
-
-#include <RadiumNBR/NodeGraph/Node.hpp>
-
-#include <regex>
-
-using QtNodes::NodeData;
-using QtNodes::NodeDataModel;
-using QtNodes::NodeDataType;
-using QtNodes::PortIndex;
-using QtNodes::PortType;
-
-FilterRenderObjectNameModel::FilterRenderObjectNameModel( RenderGraph* renderGraph ) :
-    m_renderGraph( renderGraph ), m_lineEdit( new QLineEdit() ) {
-    connect( m_lineEdit, &QLineEdit::textEdited, this, &FilterRenderObjectNameModel::onTextEdited );
-
-    m_node = new FilterROByNameNode( "Filter RO By Name" +
-                                     std::to_string( m_renderGraph->getNodesCount() ) );
-    m_renderGraph->addNode( m_node );
-}
-
-unsigned int FilterRenderObjectNameModel::nPorts( PortType portType ) const {
-    unsigned int result = 1;
-
-    switch ( portType )
-    {
-    case PortType::In: {
-        result = 1;
-        break;
-    }
-
-    case PortType::Out: {
-        result = 1;
-        break;
-    }
-
-    default: {
-        break;
-    }
-    }
-
-    return result;
-}
-
-void FilterRenderObjectNameModel::onTextEdited( QString const& string ) {
-    m_node->setNameToFilter( string.toStdString() );
-
-    Q_EMIT dataUpdated( 0 );
-}
-
-QJsonObject FilterRenderObjectNameModel::save() const {
-    QJsonObject modelJson = NodeDataModel::save();
-
-    modelJson["filteredName"] = m_lineEdit->text();
-
-    return modelJson;
-}
-
-void FilterRenderObjectNameModel::restore( QJsonObject const& p ) {
-    QJsonValue n = p["filteredName"];
-
-    if ( !n.isUndefined() )
-    {
-        QString str = n.toString();
-
-        m_lineEdit->setText( str );
-        m_node->setNameToFilter( str.toStdString() );
-    }
-}
-
-NodeDataType FilterRenderObjectNameModel::dataType( PortType portType, PortIndex portIndex ) const {
-    NodeDataType result{ "incorrect", "incorrect" };
-
-    switch ( portType )
-    {
-    case PortType::In: {
-        switch ( portIndex )
-        {
-        case 0: {
-            result = NodeDataType{
-                std::to_string( typeid( std::vector<NodeTypeRenderObject> ).hash_code() ).c_str(),
-                "inData*" };
-            break;
-        }
-        }
-        break;
-    }
-    case PortType::Out: {
-        switch ( portIndex )
-        {
-        case 0: {
-            result = NodeDataType{
-                std::to_string( typeid( std::vector<NodeTypeRenderObject> ).hash_code() ).c_str(),
-                "outData" };
-            break;
-        }
-        }
-        break;
-    }
-    default:
-        break;
-    }
-
-    return result;
-}
diff --git a/src/libRender/RadiumNBR/Gui/RenderGraphEditor/FilterRenderObjectNameModel.hpp b/src/libRender/RadiumNBR/Gui/RenderGraphEditor/FilterRenderObjectNameModel.hpp
deleted file mode 100644
index 5579707..0000000
--- a/src/libRender/RadiumNBR/Gui/RenderGraphEditor/FilterRenderObjectNameModel.hpp
+++ /dev/null
@@ -1,94 +0,0 @@
-#pragma once
-#include <QtCore/QObject>
-#include <QtWidgets/QLineEdit>
-#include <RadiumNBR/NodeBasedRendererMacro.hpp>
-
-#include <nodes/NodeDataModel>
-
-#include "ConnectionStatusData.hpp"
-
-#include <RadiumNBR/NodeGraph/PremadeNodes/Filters/FilterROByNameNode.hpp>
-#include <RadiumNBR/NodeGraph/RenderGraph.hpp>
-
-#include <iostream>
-
-class NodeBasedRenderer_LIBRARY_API FilterRenderObjectNameModel : public QtNodes::NodeDataModel
-{
-    Q_OBJECT
-
-  public:
-    FilterRenderObjectNameModel( RenderGraph* renderGraph );
-
-    ~FilterRenderObjectNameModel() {
-        m_renderGraph->removeNode( m_node );
-        m_renderGraph->m_recompile = true;
-    }
-
-  public:
-    QString caption() const override { return FilterRenderObjectNameModel::Name(); }
-
-    bool captionVisible() const override { return true; }
-
-    static QString Name() { return FilterROByNameNode::getTypename().c_str(); }
-
-    QString name() const override { return FilterRenderObjectNameModel::Name(); }
-
-  public:
-    QJsonObject save() const override;
-
-    void restore( QJsonObject const& p ) override;
-
-  public:
-    unsigned int nPorts( QtNodes::PortType portType ) const override;
-
-    QtNodes::NodeDataType dataType( QtNodes::PortType portType,
-                                    QtNodes::PortIndex portIndex ) const override;
-
-    std::shared_ptr<QtNodes::NodeData> outData( QtNodes::PortIndex port ) override {
-        return std::make_shared<ConnectionStatusData>( m_node,
-                                                       m_node->getOutputs()[port]->getName() );
-    }
-
-    void setInData( std::shared_ptr<QtNodes::NodeData> data, int port ) override {
-        auto connectionData = dynamic_cast<ConnectionStatusData*>( data.get() );
-        if ( connectionData )
-        {
-            // Add connection
-            m_renderGraph->addLink( connectionData->getNode(),
-                                    connectionData->getOutputName(),
-                                    m_node,
-                                    m_node->getInputs()[port]->getName() );
-
-            m_validationError = "";
-            m_validationState = QtNodes::NodeValidationState::Valid;
-        }
-        else
-        {
-            // Remove connection
-            m_renderGraph->removeLink( m_node, m_node->getInputs()[port]->getName() );
-
-            m_validationError = "1 mandatory port is not linked (*).";
-            m_validationState = QtNodes::NodeValidationState::Error;
-        }
-        m_renderGraph->m_recompile = true;
-    }
-
-    QtNodes::NodeValidationState validationState() const override { return m_validationState; }
-
-    QString validationMessage() const override { return m_validationError; }
-
-    QWidget* embeddedWidget() override { return m_lineEdit; }
-
-  private Q_SLOTS:
-
-    void onTextEdited( QString const& string );
-
-  private:
-    FilterROByNameNode* m_node{};
-    RenderGraph* m_renderGraph{};
-
-    QLineEdit* m_lineEdit;
-
-    mutable QtNodes::NodeValidationState m_validationState = QtNodes::NodeValidationState::Valid;
-    mutable QString m_validationError                      = QString( "" );
-};
diff --git a/src/libRender/RadiumNBR/Gui/RenderGraphEditor/FilterRenderObjectTypeModel.cpp b/src/libRender/RadiumNBR/Gui/RenderGraphEditor/FilterRenderObjectTypeModel.cpp
deleted file mode 100644
index 413029e..0000000
--- a/src/libRender/RadiumNBR/Gui/RenderGraphEditor/FilterRenderObjectTypeModel.cpp
+++ /dev/null
@@ -1,113 +0,0 @@
-#include <RadiumNBR/Gui/RenderGraphEditor/FilterRenderObjectTypeModel.hpp>
-
-#include <Engine/Data/Material.hpp>
-
-#include <RadiumNBR/NodeGraph/Node.hpp>
-
-using QtNodes::NodeData;
-using QtNodes::NodeDataModel;
-using QtNodes::NodeDataType;
-using QtNodes::PortIndex;
-using QtNodes::PortType;
-
-FilterRenderObjectTypeModel::FilterRenderObjectTypeModel( RenderGraph* renderGraph ) :
-    m_renderGraph( renderGraph ), m_list( new QComboBox() ) {
-    m_list->addItem( "Opaque" );
-    m_list->addItem( "Transparent" );
-    m_list->addItem( "Volume" );
-    connect(
-        m_list, &QComboBox::currentTextChanged, this, &FilterRenderObjectTypeModel::onTextEdited );
-
-    m_node = new FilterROByTypeNode( "Filter RO By Type" +
-                                     std::to_string( m_renderGraph->getNodesCount() ) );
-    m_renderGraph->addNode( m_node );
-}
-
-unsigned int FilterRenderObjectTypeModel::nPorts( PortType portType ) const {
-    unsigned int result = 1;
-
-    switch ( portType )
-    {
-    case PortType::In: {
-        result = 1;
-        break;
-    }
-
-    case PortType::Out: {
-        result = 1;
-        break;
-    }
-
-    default: {
-        break;
-    }
-    }
-
-    return result;
-}
-
-void FilterRenderObjectTypeModel::onTextEdited( QString const& string ) {
-    m_node->setTypeToFilter( string.toStdString() );
-
-    Q_EMIT dataUpdated( 0 );
-}
-
-QJsonObject FilterRenderObjectTypeModel::save() const {
-    QJsonObject modelJson = NodeDataModel::save();
-
-    modelJson["filteredType"] = m_list->currentText();
-
-    return modelJson;
-}
-
-void FilterRenderObjectTypeModel::restore( QJsonObject const& p ) {
-    QJsonValue n = p["filteredType"];
-
-    if ( !n.isUndefined() )
-    {
-        QString str = n.toString();
-
-        int i = m_list->findText( str );
-        if ( i != -1 ) { m_list->setCurrentIndex( i ); }
-    }
-}
-
-NodeDataType FilterRenderObjectTypeModel::dataType( PortType portType, PortIndex portIndex ) const {
-    NodeDataType result{ "incorrect", "incorrect" };
-
-    switch ( portType )
-    {
-    case PortType::In: {
-        switch ( portIndex )
-        {
-        case 0: {
-            result = NodeDataType{
-                std::to_string( typeid( std::vector<NodeTypeRenderObject> ).hash_code() ).c_str(),
-                "inData*" };
-            break;
-        default:
-            break;
-        }
-        }
-        break;
-    }
-    case PortType::Out: {
-        switch ( portIndex )
-        {
-        case 0: {
-            result = NodeDataType{
-                std::to_string( typeid( std::vector<NodeTypeRenderObject> ).hash_code() ).c_str(),
-                "outData" };
-            break;
-        default:
-            break;
-        }
-        }
-        break;
-    }
-    default:
-        break;
-    }
-
-    return result;
-}
diff --git a/src/libRender/RadiumNBR/Gui/RenderGraphEditor/FilterRenderObjectTypeModel.hpp b/src/libRender/RadiumNBR/Gui/RenderGraphEditor/FilterRenderObjectTypeModel.hpp
deleted file mode 100644
index 1b838eb..0000000
--- a/src/libRender/RadiumNBR/Gui/RenderGraphEditor/FilterRenderObjectTypeModel.hpp
+++ /dev/null
@@ -1,94 +0,0 @@
-#pragma once
-#include <QtCore/QObject>
-#include <QtWidgets/QComboBox>
-#include <RadiumNBR/NodeBasedRendererMacro.hpp>
-
-#include <nodes/NodeDataModel>
-
-#include "ConnectionStatusData.hpp"
-
-#include <RadiumNBR/NodeGraph/PremadeNodes/Filters/FilterROByTypeNode.hpp>
-#include <RadiumNBR/NodeGraph/RenderGraph.hpp>
-
-#include <iostream>
-
-class NodeBasedRenderer_LIBRARY_API FilterRenderObjectTypeModel : public QtNodes::NodeDataModel
-{
-    Q_OBJECT
-
-  public:
-    FilterRenderObjectTypeModel( RenderGraph* renderGraph );
-
-    ~FilterRenderObjectTypeModel() {
-        m_renderGraph->removeNode( m_node );
-        m_renderGraph->m_recompile = true;
-    }
-
-  public:
-    QString caption() const override { return FilterRenderObjectTypeModel::Name(); }
-
-    bool captionVisible() const override { return true; }
-
-    static QString Name() { return FilterROByTypeNode::getTypename().c_str(); }
-
-    QString name() const override { return FilterRenderObjectTypeModel::Name(); }
-
-  public:
-    QJsonObject save() const override;
-
-    void restore( QJsonObject const& p ) override;
-
-  public:
-    unsigned int nPorts( QtNodes::PortType portType ) const override;
-
-    QtNodes::NodeDataType dataType( QtNodes::PortType portType,
-                                    QtNodes::PortIndex portIndex ) const override;
-
-    std::shared_ptr<QtNodes::NodeData> outData( QtNodes::PortIndex port ) override {
-        return std::make_shared<ConnectionStatusData>( m_node,
-                                                       m_node->getOutputs()[port]->getName() );
-    }
-
-    void setInData( std::shared_ptr<QtNodes::NodeData> data, int port ) override {
-        auto connectionData = dynamic_cast<ConnectionStatusData*>( data.get() );
-        if ( connectionData )
-        {
-            // Add connection
-            m_renderGraph->addLink( connectionData->getNode(),
-                                    connectionData->getOutputName(),
-                                    m_node,
-                                    m_node->getInputs()[port]->getName() );
-
-            m_validationError = "";
-            m_validationState = QtNodes::NodeValidationState::Valid;
-        }
-        else
-        {
-            // Remove connection
-            m_renderGraph->removeLink( m_node, m_node->getInputs()[port]->getName() );
-
-            m_validationError = "1 mandatory port is not linked (*).";
-            m_validationState = QtNodes::NodeValidationState::Error;
-        }
-        m_renderGraph->m_recompile = true;
-    }
-
-    QtNodes::NodeValidationState validationState() const override { return m_validationState; }
-
-    QString validationMessage() const override { return m_validationError; }
-
-    QWidget* embeddedWidget() override { return m_list; }
-
-  private Q_SLOTS:
-
-    void onTextEdited( QString const& string );
-
-  private:
-    FilterROByTypeNode* m_node{};
-    RenderGraph* m_renderGraph{};
-
-    QComboBox* m_list;
-
-    mutable QtNodes::NodeValidationState m_validationState = QtNodes::NodeValidationState::Valid;
-    mutable QString m_validationError                      = QString( "" );
-};
diff --git a/src/libRender/RadiumNBR/Gui/RenderGraphEditor/NodeAdapterModel.cpp b/src/libRender/RadiumNBR/Gui/RenderGraphEditor/NodeAdapterModel.cpp
new file mode 100644
index 0000000..f1de357
--- /dev/null
+++ b/src/libRender/RadiumNBR/Gui/RenderGraphEditor/NodeAdapterModel.cpp
@@ -0,0 +1,153 @@
+#include <RadiumNBR/Gui/RenderGraphEditor/NodeAdapterModel.hpp>
+
+#include <RadiumNBR/Gui/RenderGraphEditor/WidgetFactory.hpp>
+
+#include <QCheckBox>
+#include <QColorDialog>
+#include <QJsonArray>
+#include <QLabel>
+#include <QObject>
+
+#include <RadiumNBR/Gui/PowerSlider.hpp>
+#include <RadiumNBR/Gui/RendererPanel.hpp>
+#include <RadiumNBR/NodeGraph/PremadeNodes/Sources/SourceNode.hpp>
+
+#include <filesystem>
+
+namespace NodeDataModelTools {
+
+QWidget* getWidget( Node* node ) {
+    if ( node->getEditableParameters().size() == 0 ) { return nullptr; }
+
+    auto controlPanel = new RadiumNBR::Gui::RendererPanel( "Editable parameters", false, nullptr );
+    controlPanel->beginLayout( QBoxLayout::TopToBottom );
+    for ( size_t i = 0; i < node->getEditableParameters().size(); i++ )
+    {
+        auto edtParam      = node->getEditableParameters()[i].get();
+        QWidget* newWidget = WidgetFactory::createWidget( edtParam );
+        if ( newWidget )
+        {
+            newWidget->setParent( controlPanel );
+            newWidget->setObjectName( edtParam->m_name.c_str() );
+            controlPanel->addLabel( edtParam->m_name );
+            controlPanel->addWidget( newWidget );
+
+            if ( i != node->getEditableParameters().size() - 1 ) { controlPanel->addSeparator(); }
+        }
+    }
+    controlPanel->endLayout();
+    controlPanel->setVisible( true );
+
+    return controlPanel;
+}
+
+void updateWidget( Node* node, QWidget* widget ) {
+    if ( node->getEditableParameters().size() == 0 ) { return; }
+    for ( size_t i = 0; i < node->getEditableParameters().size(); i++ )
+    {
+        auto edtParam = node->getEditableParameters()[i].get();
+        if ( !WidgetFactory::updateWidget( widget, edtParam ) )
+        { std::cerr << "Unable to update parameter " << edtParam->m_name << "\n"; }
+    }
+}
+
+/** Convert from Qt::Json to nlohmann::json */
+void convertQJsonEntry( const QString& key, const QJsonValue& value, nlohmann::json& data ) {
+    switch ( value.type() )
+    {
+    case QJsonValue::Bool:
+        data[key.toStdString()] = value.toBool();
+        break;
+    case QJsonValue::Double:
+        // as there is no QJsonValue::Int, manage explicitely keys with int value :(
+        // TODO find a better way to do that ...
+        if ( key.compare( "type" ) == 0 ) { data[key.toStdString()] = int( value.toDouble() ); }
+        else
+        { data[key.toStdString()] = Scalar( value.toDouble() ); }
+
+        break;
+    case QJsonValue::String:
+        data[key.toStdString()] = value.toString().toStdString();
+        break;
+    case QJsonValue::Array: {
+        auto jsArray = value.toArray();
+        auto len     = jsArray.size();
+        switch ( jsArray.first().type() )
+        {
+        case QJsonValue::Double: {
+            std::vector<Scalar> array;
+            for ( auto v : jsArray )
+            { array.push_back( Scalar( v.toDouble() ) ); }
+            data[key.toStdString()] = array;
+            break;
+        }
+        break;
+        default:
+            LOG( Ra::Core::Utils::logERROR )
+                << "Only Scalar arrays are supported for Json conversion.";
+        }
+    }
+    break;
+    default:
+        LOG( Ra::Core::Utils::logERROR ) << "QJson to nlohmann::json : QtJson value type "
+                                         << value.type() << " is not suported.";
+    }
+}
+
+void convertQJsonObject( const QJsonObject& p, nlohmann::json& data ) {
+    for ( const auto& key : p.keys() )
+    {
+        auto value = p.value( key );
+        if ( value.isObject() )
+        {
+            nlohmann::json j;
+            convertQJsonObject( value.toObject(), j );
+            data[key.toStdString()] = j;
+        }
+        else
+        { convertQJsonEntry( key, value, data ); }
+    }
+}
+
+} // namespace NodeDataModelTools
+
+/** Node adapter methods */
+template <>
+void NodeAdapterModel<DataNode<NodeTypeRenderObject>>::init() {
+    m_node = m_renderGraph->getDataNode<NodeTypeRenderObject>();
+    m_inputsConnected.resize( m_node->getInputs().size() );
+    checkConnections();
+}
+
+template <>
+void NodeAdapterModel<DataNode<NodeTypeLight>>::init() {
+    m_node = m_renderGraph->getDataNode<NodeTypeLight>();
+    m_inputsConnected.resize( m_node->getInputs().size() );
+    checkConnections();
+}
+
+template <>
+void NodeAdapterModel<DataNode<NodeTypeCamera>>::init() {
+    m_node = m_renderGraph->getDataNode<NodeTypeCamera>();
+    m_inputsConnected.resize( m_node->getInputs().size() );
+    checkConnections();
+}
+
+template <>
+void NodeAdapterModel<DisplaySinkNode>::init() {
+    m_node = m_renderGraph->getDisplayNode();
+    m_inputsConnected.resize( m_node->getInputs().size() );
+    checkConnections();
+}
+
+template <>
+void NodeAdapterModel<DataNode<NodeTypeRenderObject>>::destroy() {}
+
+template <>
+void NodeAdapterModel<DataNode<NodeTypeLight>>::destroy() {}
+
+template <>
+void NodeAdapterModel<DataNode<NodeTypeCamera>>::destroy() {}
+
+template <>
+void NodeAdapterModel<DisplaySinkNode>::destroy() {}
diff --git a/src/libRender/RadiumNBR/Gui/RenderGraphEditor/NodeAdapterModel.hpp b/src/libRender/RadiumNBR/Gui/RenderGraphEditor/NodeAdapterModel.hpp
index b142437..0713e37 100644
--- a/src/libRender/RadiumNBR/Gui/RenderGraphEditor/NodeAdapterModel.hpp
+++ b/src/libRender/RadiumNBR/Gui/RenderGraphEditor/NodeAdapterModel.hpp
@@ -1,43 +1,19 @@
 #pragma once
 #include <RadiumNBR/NodeBasedRendererMacro.hpp>
 
-#include <QtCore/QObject>
-#include <QtWidgets/QLabel>
-#include <RadiumNBR/Gui/RenderGraphEditor/WidgetFactory.hpp>
-
 #include <nodes/NodeDataModel>
 
 #include <RadiumNBR/Gui/RenderGraphEditor/ConnectionStatusData.hpp>
 
-#include <RadiumNBR/NodeGraph/Node.hpp>
-#include <RadiumNBR/NodeGraph/PremadeNodes/Sinks/DisplaySinkNode.hpp>
-#include <RadiumNBR/NodeGraph/PremadeNodes/Sources/DataNode.hpp>
-
-#include <RadiumNBR/Gui/RendererPanel.hpp>
+#include <RadiumNBR/NodeGraph/RenderGraph.hpp>
 
 #include <iostream>
 
-QWidget* getWidget( Node* node ) {
-    if ( node->getEditableParameters().size() == 0 ) { return nullptr; }
-
-    auto controlPanel = new RadiumNBR::Gui::RendererPanel( "Editable parameters", false, nullptr );
-    controlPanel->beginLayout( QBoxLayout::TopToBottom );
-    for ( size_t i = 0; i < node->getEditableParameters().size(); i++ )
-    {
-        QWidget* newWidget = WidgetFactory::createWidget( node->getEditableParameters()[i].get() );
-        if ( newWidget )
-        {
-            controlPanel->addLabel( node->getEditableParameters()[i]->m_name );
-            controlPanel->addWidget( newWidget );
-
-            if ( i != node->getEditableParameters().size() - 1 ) { controlPanel->addSeparator(); }
-        }
-    }
-    controlPanel->endLayout();
-    controlPanel->setVisible( true );
-
-    return controlPanel;
-}
+namespace NodeDataModelTools {
+QWidget* getWidget( Node* node );
+void updateWidget( Node* node, QWidget* widget );
+void convertQJsonObject( const QJsonObject& p, nlohmann::json& data );
+} // namespace NodeDataModelTools
 
 template <typename T>
 class NodeAdapterModel : public QtNodes::NodeDataModel
@@ -49,7 +25,7 @@ class NodeAdapterModel : public QtNodes::NodeDataModel
         m_renderGraph->addNode( m_node );
         m_inputsConnected.resize( m_node->getInputs().size() );
 
-        m_widget = getWidget( m_node );
+        m_widget = NodeDataModelTools::getWidget( m_node );
 
         checkConnections();
     }
@@ -60,8 +36,12 @@ class NodeAdapterModel : public QtNodes::NodeDataModel
     }
 
   public:
-    NodeAdapterModel( RenderGraph* renderGraph ) : m_renderGraph( renderGraph ) { init(); }
-
+    explicit NodeAdapterModel( RenderGraph* renderGraph ) : m_renderGraph( renderGraph ) { init(); }
+    NodeAdapterModel()                          = delete;
+    NodeAdapterModel( const NodeAdapterModel& ) = delete;
+    NodeAdapterModel( NodeAdapterModel&& )      = default;
+    NodeAdapterModel& operator=( const NodeAdapterModel& ) = delete;
+    NodeAdapterModel& operator=( NodeAdapterModel&& ) = default;
     ~NodeAdapterModel() override { destroy(); }
 
   public:
@@ -198,8 +178,8 @@ class NodeAdapterModel : public QtNodes::NodeDataModel
     mutable QString m_validationError                      = QString( "" );
 
   public:
-    QJsonObject save() const override { return QtNodes::NodeDataModel::save(); }
-    void restore( QJsonObject const& p ) override { QtNodes::NodeDataModel::restore( p ); }
+    QJsonObject save() const override;
+    void restore( QJsonObject const& p ) override;
 };
 
 #include <RadiumNBR/Gui/RenderGraphEditor/NodeAdapterModel.inl>
diff --git a/src/libRender/RadiumNBR/Gui/RenderGraphEditor/NodeAdapterModel.inl b/src/libRender/RadiumNBR/Gui/RenderGraphEditor/NodeAdapterModel.inl
index 4b09289..aed5a70 100644
--- a/src/libRender/RadiumNBR/Gui/RenderGraphEditor/NodeAdapterModel.inl
+++ b/src/libRender/RadiumNBR/Gui/RenderGraphEditor/NodeAdapterModel.inl
@@ -1,103 +1,16 @@
-
-template <>
-void NodeAdapterModel<DataNode<NodeTypeRenderObject>>::init() {
-    m_node = m_renderGraph->getDataNode<NodeTypeRenderObject>();
-    m_inputsConnected.resize( m_node->getInputs().size() );
-    checkConnections();
-}
-
-template <>
-void NodeAdapterModel<DataNode<NodeTypeLight>>::init() {
-    m_node = m_renderGraph->getDataNode<NodeTypeLight>();
-    m_inputsConnected.resize( m_node->getInputs().size() );
-    checkConnections();
-}
-
-template <>
-void NodeAdapterModel<DataNode<NodeTypeCamera>>::init() {
-    m_node = m_renderGraph->getDataNode<NodeTypeCamera>();
-    m_inputsConnected.resize( m_node->getInputs().size() );
-    checkConnections();
-}
-
-template <>
-void NodeAdapterModel<DisplaySinkNode>::init() {
-    m_node = m_renderGraph->getDisplayNode();
-    m_inputsConnected.resize( m_node->getInputs().size() );
-    checkConnections();
+template <typename T>
+QJsonObject NodeAdapterModel<T>::save() const {
+    return QtNodes::NodeDataModel::save();
 }
 
-template <>
-void NodeAdapterModel<DataNode<NodeTypeRenderObject>>::destroy() {}
-
-template <>
-void NodeAdapterModel<DataNode<NodeTypeLight>>::destroy() {}
-
-template <>
-void NodeAdapterModel<DataNode<NodeTypeCamera>>::destroy() {}
-
-template <>
-void NodeAdapterModel<DisplaySinkNode>::destroy() {}
-
-// ---------
-// method specialization for models with internal parameters
-#include <RadiumNBR/Gui/PowerSlider.hpp>
-#include <RadiumNBR/NodeGraph/PremadeNodes/Sources/SourceNode.hpp>
-#include <filesystem>
-template <>
-QJsonObject NodeAdapterModel<SourceNode<std::shared_ptr<RadiumNBR::EnvMap>>>::save() const {
-    QJsonObject modelJson = NodeDataModel::save();
-    modelJson["files"]    = m_node->getData()->getImageName().c_str();
-    modelJson["type"]     = QString::number( int( m_node->getData()->getImageType() ) );
-    modelJson["strength"] = QString::number( float( m_node->getData()->getEnvStrength() ) * 100. );
-    return modelJson;
-}
-
-template <>
-void NodeAdapterModel<SourceNode<std::shared_ptr<RadiumNBR::EnvMap>>>::restore(
-    QJsonObject const& p ) {
-    auto controlPanel = dynamic_cast<RadiumNBR::Gui::RendererPanel*>( m_widget );
-
-    QJsonValue n      = p["files"];
-    std::string files = n.toString().toStdString();
-    if ( files.empty() ) { m_node->setData( nullptr ); }
-    else
-    {
-        std::string type = p["type"].toString().toStdString();
-        int t            = std::stoi( type );
-        RadiumNBR::EnvMap::EnvMapType envType;
-        switch ( t )
-        {
-        case 0:
-            envType = RadiumNBR::EnvMap::EnvMapType::ENVMAP_PFM;
-            break;
-        case 1:
-            envType = RadiumNBR::EnvMap::EnvMapType::ENVMAP_CUBE;
-            break;
-        case 2:
-            envType = RadiumNBR::EnvMap::EnvMapType::ENVMAP_LATLON;
-            break;
-        }
-        // check if the file exists
-        bool envmap_exist;
-        float s = 100.;
-        if ( envType == RadiumNBR::EnvMap::EnvMapType::ENVMAP_CUBE )
-        {
-            std::string f1 = files.substr( 0, files.find( ';' ) - 1 );
-            envmap_exist   = std::filesystem::exists( f1 );
-        }
-        else
-        { envmap_exist = std::filesystem::exists( files ); }
-        if ( !envmap_exist ) { m_node->setData( nullptr ); }
-        else
-        {
-            // for now, only skyboxes are managed
-            m_node->setData( std::make_shared<RadiumNBR::EnvMap>( files, envType, true ) );
-            s = std::atof( p["strength"].toString().toStdString().c_str() );
-            m_node->getData()->setEnvStrength( s / 100. );
-        }
-        // This assume thereis only one powerslider in the control panel
-        auto slider = controlPanel->findChild<PowerSlider*>( "Strength" );
-        slider->setValue( s );
-    }
+template <typename T>
+void NodeAdapterModel<T>::restore( QJsonObject const& p ) {
+    QtNodes::NodeDataModel::restore( p );
+    // 1 - convert the QJsonObject to nlohmann::json
+    nlohmann::json nodeData;
+    NodeDataModelTools::convertQJsonObject( p, nodeData );
+    // 2 - call fromjson on the node using this json object
+    m_node->fromJson( nodeData );
+    // 3 - update the wiget according to the editable parameters
+    NodeDataModelTools::updateWidget( m_node, m_widget );
 }
diff --git a/src/libRender/RadiumNBR/Gui/RenderGraphEditor/RenderGraphEditorView.cpp b/src/libRender/RadiumNBR/Gui/RenderGraphEditor/RenderGraphEditorView.cpp
index f0ec68b..d14cf9b 100644
--- a/src/libRender/RadiumNBR/Gui/RenderGraphEditor/RenderGraphEditorView.cpp
+++ b/src/libRender/RadiumNBR/Gui/RenderGraphEditor/RenderGraphEditorView.cpp
@@ -1,25 +1,22 @@
 #include <RadiumNBR/Gui/RenderGraphEditor/RenderGraphEditorView.hpp>
 
-#include <QCheckBox>
-#include <QColorDialog>
 #include <QCoreApplication>
-#include <QPushButton>
 #include <QVBoxLayout>
 
-#include <RadiumNBR/EnvMap.hpp>
-
-#include <RadiumNBR/Gui/PowerSlider.hpp>
-#include <RadiumNBR/Gui/RenderGraphEditor/ColorSlider.hpp>
-#include <RadiumNBR/Gui/TransferEditor.hpp>
-
 #include <nodes/ConnectionStyle>
-
 #include <nodes/NodeData>
 
-#include <RadiumNBR/Gui/RenderGraphEditor/WidgetFactory.hpp>
-#include <RadiumNBR/Gui/RendererPanel.hpp>
+
 #include <RadiumNBR/NodeBasedRenderer.hpp>
 
+#include <RadiumNBR/Gui/RenderGraphEditor/NodeAdapterModel.hpp>
+#include <RadiumNBR/Gui/RenderGraphEditor/SourceColorTextureModel.hpp>
+#include <RadiumNBR/Gui/RenderGraphEditor/SourceDepthTextureModel.hpp>
+#include <RadiumNBR/Gui/RenderGraphEditor/WidgetFactory.hpp>
+
+#include <RadiumNBR/NodeGraph/PremadeNodes/PremadeNodesIncludes.hpp>
+
+
 RenderGraphEditorView::RenderGraphEditorView( QWidget* parent ) : QWidget( parent, Qt::Window ) {
     QtNodes::ConnectionStyle::setConnectionStyle(
         R"(
@@ -30,7 +27,7 @@ RenderGraphEditorView::RenderGraphEditorView( QWidget* parent ) : QWidget( paren
                 }
                 )" );
 
-    // TODO Check wy, with Qt6 o macos this menu replaces the main window menu.
+    // TODO Check why, with Qt6 on macos this menu replaces the main window menu.
     menuBar = new QMenuBar( this );
 
     auto fileMenu = menuBar->addMenu( "&File" );
@@ -69,163 +66,16 @@ RenderGraphEditorView::RenderGraphEditorView( QWidget* parent ) : QWidget( paren
     QCoreApplication::instance()->installEventFilter( this );
 
     // Create widgets
-    WidgetFactory::registerWidget<std::shared_ptr<RadiumNBR::EnvMap>>(
-        []( EditableParameterBase* editableParameter ) {
-            auto editableEnvMap =
-                dynamic_cast<EditableParameter<std::shared_ptr<RadiumNBR::EnvMap>>*>(
-                    editableParameter );
-
-            auto controlPanel = new RadiumNBR::Gui::RendererPanel( "EnvMap", false );
-            auto envmpClbck   = [editableEnvMap, controlPanel]( const std::string& files ) {
-                if ( files.empty() ) { editableEnvMap->m_data = nullptr; }
-                else
-                {
-                    auto t = ( files.find( ';' ) != files.npos )
-                                   ? RadiumNBR::EnvMap::EnvMapType::ENVMAP_CUBE
-                                   : RadiumNBR::EnvMap::EnvMapType::ENVMAP_PFM;
-                    if ( t == RadiumNBR::EnvMap::EnvMapType::ENVMAP_PFM )
-                    {
-                        auto ext = files.substr( files.size() - 3 );
-                        if ( ext != "pfm" ) { t = RadiumNBR::EnvMap::EnvMapType::ENVMAP_LATLON; }
-                    }
-                    // for now, only skyboxes are managed
-                    editableEnvMap->m_data = std::make_shared<RadiumNBR::EnvMap>( files, t, true );
-                    auto slider            = controlPanel->findChild<PowerSlider*>( "Strength" );
-                    if ( slider )
-                    { editableEnvMap->m_data->setEnvStrength( slider->value() / 100. ); }
-                }
-            };
-            controlPanel->addFileInput(
-                "Image(s)", envmpClbck, "../", "Images (*.png *.jpg *.pfm *.exr *hdr)" );
-
-            auto strengthClbk = [editableEnvMap]( double v ) {
-                if ( editableEnvMap->m_data )
-                {
-                    auto* env = editableEnvMap->m_data.get();
-                    if ( env ) { env->setEnvStrength( v / 100. ); }
-                }
-            };
-            float s_init = 100.;
-            if ( editableEnvMap->m_data )
-            { s_init = editableEnvMap->m_data->getEnvStrength() * 100.; }
-            controlPanel->addPowerSliderInput( "Strength", strengthClbk, s_init, 0., 100 );
-            controlPanel->setVisible( true );
-            return controlPanel;
-        } );
-
-    WidgetFactory::registerWidget<Scalar>( []( EditableParameterBase* editableParameter ) {
-        auto editableScalar = dynamic_cast<EditableParameter<Scalar>*>( editableParameter );
-
-        auto powerSlider = new PowerSlider();
-        powerSlider->setValue( editableScalar->m_data );
-        if ( editableScalar->additionalData.size() >= 2 )
-        {
-            powerSlider->setRange( editableScalar->additionalData[0],
-                                   editableScalar->additionalData[1] );
-        }
-        else
-        { powerSlider->setRange( 0.0, 9999.0 ); }
-        PowerSlider::connect(
-            powerSlider, &PowerSlider::valueChanged, [editableScalar]( double value ) {
-                editableScalar->m_data = value;
-            } );
-        return powerSlider;
-    } );
-
-    WidgetFactory::registerWidget<bool>( []( EditableParameterBase* editableParameter ) {
-        auto editableBoolean = dynamic_cast<EditableParameter<bool>*>( editableParameter );
-
-        auto checkBox = new QCheckBox();
-        checkBox->setCheckState( editableBoolean->m_data ? Qt::CheckState::Checked
-                                                         : Qt::CheckState::Unchecked );
-        QCheckBox::connect( checkBox, &QCheckBox::stateChanged, [editableBoolean]( int state ) {
-            if ( state == Qt::Unchecked ) { editableBoolean->m_data = false; }
-            else if ( state == Qt::Checked )
-            { editableBoolean->m_data = true; }
-        } );
-        return checkBox;
-    } );
-
-    WidgetFactory::registerWidget<NodeTypeColor>( []( EditableParameterBase* editableParameter ) {
-        auto editableColor = dynamic_cast<EditableParameter<NodeTypeColor>*>( editableParameter );
-
-        auto button      = new QPushButton( "Open widget" );
-        auto colorDialog = new QColorDialog();
-#if !defined( __APPLE__ )
-        colorDialog->setOption( QColorDialog::DontUseNativeDialog );
-#endif
-
-        QColor tmpColor;
-        tmpColor.setRed( editableColor->m_data.x() * 255 );
-        tmpColor.setRed( editableColor->m_data.y() * 255 );
-        tmpColor.setRed( editableColor->m_data.z() * 255 );
-        colorDialog->setCurrentColor( tmpColor );
-        ColorSlider::connect(
-            colorDialog, &QColorDialog::currentColorChanged, [editableColor]( QColor value ) {
-                int newR, newG, newB;
-                value.getRgb( &newR, &newG, &newB );
-
-                editableColor->m_data = ( NodeTypeColor::sRGBToLinearRGB( NodeTypeColor::fromRGB(
-                    Ra::Core::Utils::ColorBase<float>( newR / 255.0f, newG / 255.0f, newB / 255.0f )
-                        .rgb() ) ) );
-            } );
-
-        connect( button, &QPushButton::clicked, [colorDialog]() { colorDialog->show(); } );
-
-        return button;
-    } );
-
-    WidgetFactory::registerWidget<std::array<float, 256 * 4>>(
-        []( EditableParameterBase* editableParameter ) {
-            auto editableTransferFunction =
-                dynamic_cast<EditableParameter<std::array<float, 256 * 4>>*>( editableParameter );
-
-            auto button         = new QPushButton( "Open widget" );
-            auto transferEditor = new TransferEditor();
-
-            TransferEditor::connect(
-                transferEditor,
-                &TransferEditor::propertiesChanged,
-                [editableTransferFunction, transferEditor]() {
-                    int pos = 0;
-                    for ( int i = 0; i < 256; i++ )
-                    {
-                        unsigned int color = transferEditor->colorAt( i );
-                        editableTransferFunction->m_data.at( pos ) =
-                            (unsigned char)( ( 0x00ff0000 & color ) >> 16 ) / 255.f;
-                        editableTransferFunction->m_data.at( pos + 1 ) =
-                            (unsigned char)( ( 0x0000ff00 & color ) >> 8 ) / 255.f;
-                        editableTransferFunction->m_data.at( pos + 2 ) =
-                            (unsigned char)( ( 0x000000ff & color ) ) / 255.f;
-                        editableTransferFunction->m_data.at( pos + 3 ) =
-                            (unsigned char)( ( 0xff000000 & color ) >> 24 ) / 255.f;
-                        pos = pos + 4;
-                    }
-                } );
-            connect(
-                button, &QPushButton::clicked, [transferEditor]() { transferEditor->show(); } );
-
-            return button;
-        } );
+    WidgetFactory::initializeWidgetFactory();
 }
 
-#include <RadiumNBR/Gui/RenderGraphEditor/FilterRenderObjectNameModel.hpp>
-#include <RadiumNBR/Gui/RenderGraphEditor/FilterRenderObjectTypeModel.hpp>
-#include <RadiumNBR/Gui/RenderGraphEditor/NodeAdapterModel.hpp>
-#include <RadiumNBR/Gui/RenderGraphEditor/SourceColorTextureModel.hpp>
-#include <RadiumNBR/Gui/RenderGraphEditor/SourceDepthTextureModel.hpp>
-
-using EnvMapData = std::shared_ptr<RadiumNBR::EnvMap>;
-
-#include <RadiumNBR/NodeGraph/PremadeNodes/PremadeNodesIncludes.hpp>
-
 namespace NodeGraphQtEditor {
 
 template <typename T>
 class NodeCreator
 {
   public:
-    NodeCreator( RenderGraph* renderGraph ) : m_renderGraph( renderGraph ) {}
+    explicit NodeCreator( RenderGraph* renderGraph ) : m_renderGraph( renderGraph ) {}
 
     std::unique_ptr<T> operator()() { return std::make_unique<T>( m_renderGraph ); }
 
@@ -243,42 +93,44 @@ std::shared_ptr<DataModelRegistry> initializeNodeRegistry( RenderGraph* renderGr
     ret->registerModel<NodeAdapterModel<DataNode<NodeTypeCamera>>>(
         NodeCreator<NodeAdapterModel<DataNode<NodeTypeCamera>>>( renderGraph ), "Data" );
 
-    ret->registerModel<FilterRenderObjectNameModel>(
-        NodeCreator<FilterRenderObjectNameModel>( renderGraph ), "Filters" );
-    ret->registerModel<FilterRenderObjectTypeModel>(
-        NodeCreator<FilterRenderObjectTypeModel>( renderGraph ), "Filters" );
+    ret->registerModel<NodeAdapterModel<FilterROByTypeNode>>(
+        NodeCreator<NodeAdapterModel<FilterROByTypeNode>>( renderGraph ), "Filters" );
+    ret->registerModel<NodeAdapterModel<FilterROByNameNode>>(
+        NodeCreator<NodeAdapterModel<FilterROByNameNode>>( renderGraph ), "Filters" );
 
     ret->registerModel<NodeAdapterModel<ClearColorNode>>(
-        NodeCreator<NodeAdapterModel<ClearColorNode>>( renderGraph ), "Premade Nodes" );
+        NodeCreator<NodeAdapterModel<ClearColorNode>>( renderGraph ), "RenderPasses" );
     ret->registerModel<NodeAdapterModel<ZGeomPrepassNode>>(
-        NodeCreator<NodeAdapterModel<ZGeomPrepassNode>>( renderGraph ), "Premade Nodes" );
+        NodeCreator<NodeAdapterModel<ZGeomPrepassNode>>( renderGraph ), "RenderPasses" );
     ret->registerModel<NodeAdapterModel<AccessibilityBufferNode>>(
-        NodeCreator<NodeAdapterModel<AccessibilityBufferNode>>( renderGraph ), "Premade Nodes" );
+        NodeCreator<NodeAdapterModel<AccessibilityBufferNode>>( renderGraph ), "RenderPasses" );
     ret->registerModel<NodeAdapterModel<EnvLightNode>>(
-        NodeCreator<NodeAdapterModel<EnvLightNode>>( renderGraph ), "Premade Nodes" );
+        NodeCreator<NodeAdapterModel<EnvLightNode>>( renderGraph ), "RenderPasses" );
     ret->registerModel<NodeAdapterModel<LocalLightNode>>(
-        NodeCreator<NodeAdapterModel<LocalLightNode>>( renderGraph ), "Premade Nodes" );
+        NodeCreator<NodeAdapterModel<LocalLightNode>>( renderGraph ), "RenderPasses" );
     ret->registerModel<NodeAdapterModel<EmissivityNode>>(
-        NodeCreator<NodeAdapterModel<EmissivityNode>>( renderGraph ), "Premade Nodes" );
+        NodeCreator<NodeAdapterModel<EmissivityNode>>( renderGraph ), "RenderPasses" );
     ret->registerModel<NodeAdapterModel<TransparencyNode>>(
-        NodeCreator<NodeAdapterModel<TransparencyNode>>( renderGraph ), "Premade Nodes" );
+        NodeCreator<NodeAdapterModel<TransparencyNode>>( renderGraph ), "RenderPasses" );
     ret->registerModel<NodeAdapterModel<VolumeNode>>(
-        NodeCreator<NodeAdapterModel<VolumeNode>>( renderGraph ), "Premade Nodes" );
+        NodeCreator<NodeAdapterModel<VolumeNode>>( renderGraph ), "RenderPasses" );
     ret->registerModel<NodeAdapterModel<VolumeVizualisationNode>>(
-        NodeCreator<NodeAdapterModel<VolumeVizualisationNode>>( renderGraph ), "Premade Nodes" );
+        NodeCreator<NodeAdapterModel<VolumeVizualisationNode>>( renderGraph ), "RenderPasses" );
     ret->registerModel<NodeAdapterModel<UINode>>(
-        NodeCreator<NodeAdapterModel<UINode>>( renderGraph ), "Premade Nodes" );
+        NodeCreator<NodeAdapterModel<UINode>>( renderGraph ), "RenderPasses" );
     ret->registerModel<NodeAdapterModel<WireframeNode>>(
-        NodeCreator<NodeAdapterModel<WireframeNode>>( renderGraph ), "Premade Nodes" );
+        NodeCreator<NodeAdapterModel<WireframeNode>>( renderGraph ), "RenderPasses" );
+    ret->registerModel<NodeAdapterModel<SimpleNode>>(
+        NodeCreator<NodeAdapterModel<SimpleNode>>( renderGraph ), "RenderPasses" );
 
-    ret->registerModel<NodeAdapterModel<SourceNode<NodeTypeColor>>>(
-        NodeCreator<NodeAdapterModel<SourceNode<NodeTypeColor>>>( renderGraph ), "Sources" );
-    ret->registerModel<NodeAdapterModel<SourceNode<bool>>>(
-        NodeCreator<NodeAdapterModel<SourceNode<bool>>>( renderGraph ), "Sources" );
-    ret->registerModel<NodeAdapterModel<SourceNode<float>>>(
-        NodeCreator<NodeAdapterModel<SourceNode<float>>>( renderGraph ), "Sources" );
-    ret->registerModel<NodeAdapterModel<SourceNode<EnvMapData>>>(
-        NodeCreator<NodeAdapterModel<SourceNode<EnvMapData>>>( renderGraph ), "Sources" );
+    ret->registerModel<NodeAdapterModel<ColorSourceNode>>(
+        NodeCreator<NodeAdapterModel<ColorSourceNode>>( renderGraph ), "Sources" );
+    ret->registerModel<NodeAdapterModel<BooleanValueSource>>(
+        NodeCreator<NodeAdapterModel<BooleanValueSource>>( renderGraph ), "Sources" );
+    ret->registerModel<NodeAdapterModel<ScalarValueSource>>(
+        NodeCreator<NodeAdapterModel<ScalarValueSource>>( renderGraph ), "Sources" );
+    ret->registerModel<NodeAdapterModel<EnvMapTextureSource>>(
+        NodeCreator<NodeAdapterModel<EnvMapTextureSource>>( renderGraph ), "Sources" );
 
     ret->registerModel<SourceColorTextureModel>(
         NodeCreator<SourceColorTextureModel>( renderGraph ), "Sources" );
@@ -287,13 +139,41 @@ std::shared_ptr<DataModelRegistry> initializeNodeRegistry( RenderGraph* renderGr
 
     ret->registerModel<NodeAdapterModel<DisplaySinkNode>>(
         NodeCreator<NodeAdapterModel<DisplaySinkNode>>( renderGraph ), "Sinks" );
-#define SEMINARDEMO
-#ifdef SEMINARDEMO
-    ret->registerModel<NodeAdapterModel<SimpleNode>>(
-        NodeCreator<NodeAdapterModel<SimpleNode>>( renderGraph ), "Custom Nodes" );
+
+
     ret->registerModel<NodeAdapterModel<DifferenceNode>>(
-        NodeCreator<NodeAdapterModel<DifferenceNode>>( renderGraph ), "Custom Nodes" );
-#endif
+        NodeCreator<NodeAdapterModel<DifferenceNode>>( renderGraph ),
+        "Compositing" );
+    ret->registerModel<NodeAdapterModel<SumNode>>(
+        NodeCreator<NodeAdapterModel<SumNode>>( renderGraph ),
+        "Compositing" );
+    ret->registerModel<NodeAdapterModel<MultiplyNode>>(
+        NodeCreator<NodeAdapterModel<MultiplyNode>>( renderGraph ),
+        "Compositing" );
+    ret->registerModel<NodeAdapterModel<OneMinusNode>>(
+        NodeCreator<NodeAdapterModel<OneMinusNode>>( renderGraph ),
+        "Compositing" );
+    ret->registerModel<NodeAdapterModel<MaxNode>>(
+        NodeCreator<NodeAdapterModel<MaxNode>>( renderGraph ),
+        "Compositing" );
+    ret->registerModel<NodeAdapterModel<MinNode>>(
+        NodeCreator<NodeAdapterModel<MinNode>>( renderGraph ),
+        "Compositing" );
+    ret->registerModel<NodeAdapterModel<MoreThanThresholdNode>>(
+        NodeCreator<NodeAdapterModel<MoreThanThresholdNode>>( renderGraph ),
+        "Compositing" );
+    ret->registerModel<NodeAdapterModel<LessThanThresholdNode>>(
+        NodeCreator<NodeAdapterModel<LessThanThresholdNode>>( renderGraph ),
+        "Compositing" );
+
+    ret->registerModel<NodeAdapterModel<FXAANode>>(
+        NodeCreator<NodeAdapterModel<FXAANode>>( renderGraph ),
+        "Anti Aliasing" );
+
+
+
+
+
     return ret;
 }
 } // namespace NodeGraphQtEditor
diff --git a/src/libRender/RadiumNBR/Gui/RenderGraphEditor/WidgetFactory.cpp b/src/libRender/RadiumNBR/Gui/RenderGraphEditor/WidgetFactory.cpp
index efd1e10..a87c3eb 100644
--- a/src/libRender/RadiumNBR/Gui/RenderGraphEditor/WidgetFactory.cpp
+++ b/src/libRender/RadiumNBR/Gui/RenderGraphEditor/WidgetFactory.cpp
@@ -1,28 +1,286 @@
 #include <RadiumNBR/Gui/RenderGraphEditor/WidgetFactory.hpp>
 
+#include <RadiumNBR/Gui/PowerSlider.hpp>
+#include <RadiumNBR/Gui/RendererPanel.hpp>
+#include <RadiumNBR/Gui/TransferEditor.hpp>
+#include <RadiumNBR/NodeGraph/PremadeNodes/PremadeNodesIncludes.hpp>
+
+#include <QCheckBox>
+#include <QColorDialog>
+#include <QComboBox>
+#include <QLineEdit>
+#include <QPushButton>
+
 namespace WidgetFactory {
-std::unordered_map<size_t, std::function<QWidget*( EditableParameterBase* )>> widgetsCreators;
+using WidgetFunctionPair = std::pair<WidgetCreatorFunc, WidgetUpdaterFunc>;
+
+std::unordered_map<size_t, WidgetFunctionPair> widgetsfunctions;
 
 void registerWidgetInternal( size_t hashedType,
-                             std::function<QWidget*( EditableParameterBase* )> widgetCreator ) {
-    if ( widgetsCreators.find( hashedType ) == widgetsCreators.end() )
-    { widgetsCreators[hashedType] = std::move( widgetCreator ); }
+                             WidgetCreatorFunc widgetCreator,
+                             WidgetUpdaterFunc widgetUpdater ) {
+    if ( widgetsfunctions.find( hashedType ) == widgetsfunctions.end() )
+    { widgetsfunctions[hashedType] = { std::move( widgetCreator ), std::move( widgetUpdater ) }; }
     else
     {
         std::cerr
-            << "WidgetFactory: trying to add an already existing widget creator for hashed type "
+            << "WidgetFactory: trying to add an already existing widget builder for hashed type "
             << hashedType << "." << std::endl;
     }
 }
 
 QWidget* createWidget( EditableParameterBase* editableParameter ) {
-    if ( widgetsCreators.find( editableParameter->m_hashedType ) != widgetsCreators.end() )
-    { return widgetsCreators[editableParameter->m_hashedType]( editableParameter ); }
+    if ( widgetsfunctions.find( editableParameter->m_hashedType ) != widgetsfunctions.end() )
+    { return widgetsfunctions[editableParameter->m_hashedType].first( editableParameter ); }
     else
     {
-        std::cerr << "WidgetFactory: no defined widget for hashed type "
+        std::cerr << "WidgetFactory: no defined widget builder for hashed type "
                   << editableParameter->m_hashedType << "." << std::endl;
     }
     return nullptr;
 }
+
+bool updateWidget( QWidget* widget, EditableParameterBase* editableParameter ) {
+    if ( widgetsfunctions.find( editableParameter->m_hashedType ) != widgetsfunctions.end() )
+    {
+        return widgetsfunctions[editableParameter->m_hashedType].second( widget,
+                                                                         editableParameter );
+    }
+    else
+    {
+        std::cerr << "WidgetFactory: no defined widget updater for hashed type "
+                  << editableParameter->m_hashedType << "." << std::endl;
+    }
+    return false;
+}
+
+void initializeWidgetFactory() {
+    WidgetFactory::registerWidget<std::shared_ptr<RadiumNBR::EnvMap>>(
+        []( EditableParameterBase* editableParameter ) {
+            auto editable = dynamic_cast<EditableParameter<std::shared_ptr<RadiumNBR::EnvMap>>*>(
+                editableParameter );
+
+            auto controlPanel = new RadiumNBR::Gui::RendererPanel( editable->m_name, false );
+            auto envmpClbck   = [editable, controlPanel]( const std::string& files ) {
+                if ( files.empty() ) { editable->m_data = nullptr; }
+                else
+                {
+                    auto t = ( files.find( ';' ) != files.npos )
+                                   ? RadiumNBR::EnvMap::EnvMapType::ENVMAP_CUBE
+                                   : RadiumNBR::EnvMap::EnvMapType::ENVMAP_PFM;
+                    if ( t == RadiumNBR::EnvMap::EnvMapType::ENVMAP_PFM )
+                    {
+                        auto ext = files.substr( files.size() - 3 );
+                        if ( ext != "pfm" ) { t = RadiumNBR::EnvMap::EnvMapType::ENVMAP_LATLON; }
+                    }
+                    // for now, only skyboxes are managed
+                    editable->m_data = std::make_shared<RadiumNBR::EnvMap>( files, t, true );
+                    auto slider      = controlPanel->findChild<PowerSlider*>( "strength" );
+                    if ( slider ) { editable->m_data->setEnvStrength( slider->value() / 100. ); }
+                }
+            };
+            // TODO : display the name of the envmap image somewhere
+            controlPanel->addFileInput(
+                "files", envmpClbck, "../", "Images (*.png *.jpg *.pfm *.exr *hdr)" );
+
+            auto strengthClbk = [editable]( double v ) {
+                if ( editable->m_data )
+                {
+                    auto* env = editable->m_data.get();
+                    if ( env ) { env->setEnvStrength( v / 100. ); }
+                }
+            };
+            float s_init = 100.;
+            if ( editable->m_data ) { s_init = editable->m_data->getEnvStrength() * 100.; }
+            controlPanel->addPowerSliderInput( "strength", strengthClbk, s_init, 0., 100 );
+            controlPanel->setVisible( true );
+            return controlPanel;
+        },
+        []( QWidget* widget, EditableParameterBase* editableParameter ) -> bool {
+            auto editable = dynamic_cast<EditableParameter<std::shared_ptr<RadiumNBR::EnvMap>>*>(
+                editableParameter );
+            auto slider = widget->findChild<PowerSlider*>( "strength" );
+            if ( slider && editable->m_data )
+            {
+                slider->setValue( editable->m_data->getEnvStrength() * 100. );
+                return true;
+            }
+            else
+            { return false; }
+        } );
+
+    WidgetFactory::registerWidget<Scalar>(
+        []( EditableParameterBase* editableParameter ) {
+            auto editable = dynamic_cast<EditableParameter<Scalar>*>( editableParameter );
+            auto powerSlider = new PowerSlider();
+            powerSlider->setObjectName( editable->m_name.c_str() );
+            powerSlider->setValue( editable->m_data );
+            if ( editable->additionalData.size() >= 2 )
+            { powerSlider->setRange( editable->additionalData[0], editable->additionalData[1] ); }
+            else
+            { powerSlider->setRange( 0.0, 9999.0 ); }
+            PowerSlider::connect( powerSlider,
+                                  &PowerSlider::valueChanged,
+                                  [editable]( double value ) { editable->m_data = value; } );
+            return powerSlider;
+        },
+        []( QWidget* widget, EditableParameterBase* editableParameter ) -> bool {
+            auto editable = dynamic_cast<EditableParameter<Scalar>*>( editableParameter );
+            auto slider = widget->findChild<PowerSlider*>( editableParameter->m_name.c_str() );
+            if ( slider )
+            {
+                slider->setValue( editable->m_data );
+                return true;
+            }
+            else
+            { return false; }
+        } );
+
+    WidgetFactory::registerWidget<bool>(
+        []( EditableParameterBase* editableParameter ) {
+            auto editable = dynamic_cast<EditableParameter<bool>*>( editableParameter );
+            auto checkBox = new QCheckBox();
+            checkBox->setObjectName( editable->m_name.c_str() );
+            checkBox->setCheckState( editable->m_data ? Qt::CheckState::Checked
+                                                      : Qt::CheckState::Unchecked );
+            QCheckBox::connect( checkBox, &QCheckBox::stateChanged, [editable]( int state ) {
+                if ( state == Qt::Unchecked ) { editable->m_data = false; }
+                else if ( state == Qt::Checked )
+                { editable->m_data = true; }
+            } );
+            return checkBox;
+        },
+        []( QWidget* widget, EditableParameterBase* editableParameter ) -> bool {
+            auto editable = dynamic_cast<EditableParameter<bool>*>( editableParameter );
+            auto checkBox = widget->findChild<QCheckBox*>( editableParameter->m_name.c_str() );
+            if ( checkBox )
+            {
+                checkBox->setCheckState( editable->m_data ? Qt::Checked : Qt::Unchecked );
+                return true;
+            }
+            else
+            { return false; }
+        } );
+
+    WidgetFactory::registerWidget<NodeTypeColor>(
+        []( EditableParameterBase* editableParameter ) {
+            auto editable = dynamic_cast<EditableParameter<NodeTypeColor>*>( editableParameter );
+            NodeTypeColor c = 255_ra * NodeTypeColor::linearRGBTosRGB( editable->m_data );
+            auto button      = new QPushButton( "Choose color" );
+            auto colorDialog = new QColorDialog( QColor( c.x(), c.y(), c.z() ), button );
+            colorDialog->setObjectName( editable->m_name.c_str() );
+#if !defined( __APPLE__ )
+            colorDialog->setOption( QColorDialog::DontUseNativeDialog );
+#endif
+            QColorDialog::connect(
+                colorDialog, &QColorDialog::currentColorChanged, [editable]( QColor value ) {
+                    int newR, newG, newB;
+                    value.getRgb( &newR, &newG, &newB );
+                    editable->m_data = ( NodeTypeColor::sRGBToLinearRGB(
+                        NodeTypeColor( float( newR ), float( newG ), float( newB ) ) *
+                        ( 1_ra / 255_ra ) ) );
+                } );
+            QPushButton::connect( button, &QPushButton::clicked, [colorDialog, editable]() {
+                NodeTypeColor c = 255_ra * NodeTypeColor::linearRGBTosRGB( editable->m_data );
+                colorDialog->setCurrentColor( QColor( c.x(), c.y(), c.z() ) );
+                colorDialog->show();
+            } );
+            return button;
+        },
+        []( QWidget* widget, EditableParameterBase* editableParameter ) -> bool {
+            auto editable    = dynamic_cast<EditableParameter<NodeTypeColor>*>( editableParameter );
+            auto colorDialog = widget->findChild<QColorDialog*>( editable->m_name.c_str() );
+            NodeTypeColor c  = 255_ra * NodeTypeColor::linearRGBTosRGB( editable->m_data );
+            if ( colorDialog )
+            {
+                colorDialog->setCurrentColor( QColor( int( c.x() ), int( c.y() ), int( c.z() ) ) );
+                return true;
+            }
+            else
+            { return false; }
+        } );
+
+    WidgetFactory::registerWidget<std::array<float, 256 * 4>>(
+        []( EditableParameterBase* editableParameter ) {
+            auto editableTransferFunction =
+                dynamic_cast<EditableParameter<std::array<float, 256 * 4>>*>( editableParameter );
+            // TODO, give a name to the widget so that they can be updated automatically when
+            // loading a node
+            auto button         = new QPushButton( "Open widget" );
+            auto transferEditor = new TransferEditor();
+            TransferEditor::connect(
+                transferEditor,
+                &TransferEditor::propertiesChanged,
+                [editableTransferFunction, transferEditor]() {
+                    int pos = 0;
+                    for ( int i = 0; i < 256; i++ )
+                    {
+                        unsigned int color = transferEditor->colorAt( i );
+                        editableTransferFunction->m_data.at( pos ) =
+                            (unsigned char)( ( 0x00ff0000 & color ) >> 16 ) / 255.f;
+                        editableTransferFunction->m_data.at( pos + 1 ) =
+                            (unsigned char)( ( 0x0000ff00 & color ) >> 8 ) / 255.f;
+                        editableTransferFunction->m_data.at( pos + 2 ) =
+                            (unsigned char)( ( 0x000000ff & color ) ) / 255.f;
+                        editableTransferFunction->m_data.at( pos + 3 ) =
+                            (unsigned char)( ( 0xff000000 & color ) >> 24 ) / 255.f;
+                        pos = pos + 4;
+                    }
+                } );
+            QPushButton::connect(
+                button, &QPushButton::clicked, [transferEditor]() { transferEditor->show(); } );
+            return button;
+        },
+        []( QWidget*, EditableParameterBase* ) -> bool { return false; } );
+
+    WidgetFactory::registerWidget<Selector<std::string>>(
+        []( EditableParameterBase* editableParameter ) {
+            auto editable = dynamic_cast<EditableParameter<Selector<std::string>>*>( editableParameter );
+            auto selector = new QComboBox();
+            selector->setObjectName( editable->m_name.c_str() );
+            for( const auto&e : editable->m_data ) {
+                selector->addItem( e.c_str() );
+            }
+            QComboBox::connect( selector, &QComboBox::currentTextChanged,
+                                [editable]( const QString& string ) {
+                editable->m_data.set( string.toStdString() );
+            } );
+            return selector;
+        },
+        []( QWidget* widget, EditableParameterBase* editableParameter ) -> bool {
+            auto editable = dynamic_cast<EditableParameter<Selector<std::string>>*>( editableParameter );
+            auto comboBox = widget->findChild<QComboBox*>( editable->m_name.c_str() );
+            if ( comboBox )
+            {
+                comboBox->setCurrentText( editable->m_data.get().c_str() );
+                return true;
+            }
+            else
+            { return false; }
+        } );
+
+    WidgetFactory::registerWidget<std::string>(
+        []( EditableParameterBase* editableParameter ) {
+            auto editable = dynamic_cast<EditableParameter<std::string>*>( editableParameter );
+            auto line = new QLineEdit();
+            line->setObjectName( editable->m_name.c_str() );
+            QLineEdit::connect( line, &QLineEdit::textEdited,
+                                [editable]( const QString& string ) {
+                                    editable->m_data = string.toStdString() ;
+                                } );
+            return line;
+        },
+        []( QWidget* widget, EditableParameterBase* editableParameter ) -> bool {
+            auto editable = dynamic_cast<EditableParameter<std::string>*>( editableParameter );
+            auto line  = widget->findChild<QLineEdit*>( editable->m_name.c_str() );
+            if ( line )
+            {
+                line->setText( editable->m_data.c_str() );
+                return true;
+            }
+            else
+            { return false; }
+        } );
+}
+
 } // namespace WidgetFactory
diff --git a/src/libRender/RadiumNBR/Gui/RenderGraphEditor/WidgetFactory.hpp b/src/libRender/RadiumNBR/Gui/RenderGraphEditor/WidgetFactory.hpp
index bcc1152..2ba0d62 100644
--- a/src/libRender/RadiumNBR/Gui/RenderGraphEditor/WidgetFactory.hpp
+++ b/src/libRender/RadiumNBR/Gui/RenderGraphEditor/WidgetFactory.hpp
@@ -5,15 +5,62 @@
 #include <iostream>
 #include <unordered_map>
 
+/**
+ * Set of functions to manage automatic widget creation and update for editable parameters in the Qt
+ * Node Editor.
+ */
 namespace WidgetFactory {
-NodeBasedRenderer_LIBRARY_API void
-registerWidgetInternal( size_t hashedType,
-                        std::function<QWidget*( EditableParameterBase* )> widgetCreator );
+/** Type of the function that creates a widget.
+ *  @param the editable parameter that defines the widget content
+ *  @return the created widget
+ */
+using WidgetCreatorFunc = std::function<QWidget*( EditableParameterBase* )>;
+/** Type of the function that creates a widget.
+ * @param the widget whose content must be updated
+ *  @param the editable parameter that defines the widget content
+ *  @return true if update is done, false if not
+ */
+using WidgetUpdaterFunc = std::function<bool( QWidget*, EditableParameterBase* )>;
 
-NodeBasedRenderer_LIBRARY_API QWidget* createWidget( EditableParameterBase* editableParameter );
+/** private method to manage the factory
+ */
+NodeBasedRenderer_LIBRARY_API void registerWidgetInternal( size_t hashedType,
+                                                           WidgetCreatorFunc widgetCreator,
+                                                           WidgetUpdaterFunc widgetUpdater );
 
+/** Register a widget builder and updater in the factory given the type of the editable parameter
+ * @tparam T The concrete type of the editable parameter
+ * @param widgetCreator a function that build a widget to edit the given parameter.
+ * @param widgetUpdater a function to update the widget state according to the given parameter.
+ */
 template <typename T>
-void registerWidget( std::function<QWidget*( EditableParameterBase* )> widgetCreator ) {
-    registerWidgetInternal( typeid( T ).hash_code(), std::move( widgetCreator ) );
+void registerWidget( WidgetCreatorFunc widgetCreator, WidgetUpdaterFunc widgetUpdater ) {
+    registerWidgetInternal(
+        typeid( T ).hash_code(), std::move( widgetCreator ), std::move( widgetUpdater ) );
 }
+
+/**
+ * Create a widget from an editable parameter using the widget factory
+ * @param editableParameter the data whose type will define the widget
+ * @return the created widget, nullptr if no widget creator is associated with the editable
+ * parameter type.
+ */
+NodeBasedRenderer_LIBRARY_API QWidget* createWidget( EditableParameterBase* editableParameter );
+
+/**
+ * Update a widget from an editable parameter using the widget factory
+ *
+ * @param widget the widget to update
+ * @param editableParameter the data whose content will be transfered to the widget
+ * @return true if the update is done, false if thereis no updater associated with the
+ * editableParrameter type.
+ */
+NodeBasedRenderer_LIBRARY_API bool updateWidget( QWidget* widget,
+                                                 EditableParameterBase* editableParameter );
+
+/**
+ * Initialize the factory with pre-defined widgets according to the Radium NodeGraph predefined
+ * nodes.
+ */
+NodeBasedRenderer_LIBRARY_API void initializeWidgetFactory();
 }; // namespace WidgetFactory
diff --git a/src/libRender/RadiumNBR/NodeBasedRenderer.cpp b/src/libRender/RadiumNBR/NodeBasedRenderer.cpp
index 2f4914c..ad87059 100644
--- a/src/libRender/RadiumNBR/NodeBasedRenderer.cpp
+++ b/src/libRender/RadiumNBR/NodeBasedRenderer.cpp
@@ -77,17 +77,20 @@ void NodeBasedRenderer::loadFromJson( const std::string& jsonFilePath ) {
     {
         m_originalRenderGraph.loadFromJson( jsonFilePath );
         m_originalRenderGraph.init();
-        m_displaySinkNode = m_originalRenderGraph.getDisplayNode();
+        m_displayObserverId=-1;
+        setDisplayNode( m_originalRenderGraph.getDisplayNode() );
     }
     else
     { std::cerr << "No Json was given to load a render graph." << std::endl; }
 }
 
 void NodeBasedRenderer::reloadRenderGraph() {
-    m_originalRenderGraph.compile();
+    // TODO : no need to compile, init will do this !!!
+    // m_originalRenderGraph.compile();
 
     m_originalRenderGraph.init();
-    m_displaySinkNode = m_originalRenderGraph.getDisplayNode();
+    m_displayObserverId = -1;
+    setDisplayNode( m_originalRenderGraph.getDisplayNode() );
     m_originalRenderGraph.resize( m_width, m_height );
 
     buildAllRenderTechniques();
@@ -108,7 +111,8 @@ void NodeBasedRenderer::reloadRenderGraphFromJson() {
         // Reload
         m_originalRenderGraph.loadFromJson( m_jsonFilePath );
         m_originalRenderGraph.init();
-        m_displaySinkNode = m_originalRenderGraph.getDisplayNode();
+        m_displayObserverId = -1;
+        setDisplayNode( m_originalRenderGraph.getDisplayNode() );
         m_originalRenderGraph.resize( m_width, m_height );
 
         buildAllRenderTechniques();
@@ -181,40 +185,6 @@ void NodeBasedRenderer::renderInternal( const ViewingParameters& renderData ) {
     // Run the render graph
     m_originalRenderGraph.execute();
 
-    // Add display nodes' linked textures to secondary textures
-    m_secondaryTextures.clear();
-    for ( const auto& t : m_sharedTextures )
-    { m_secondaryTextures.insert( { t.first, t.second.get() } ); }
-
-    bool colorTextureSet = false;
-    if ( m_displaySinkNode )
-    {
-        auto textures = m_displaySinkNode->getTextures();
-        for ( const auto t : textures )
-        {
-#ifdef GRAPH_CALL_TRACE
-            std::cout << t->getName() << std::endl;
-#endif
-            if ( !colorTextureSet )
-            {
-                m_colorTexture  = t;
-                colorTextureSet = true;
-            }
-            else
-            { m_secondaryTextures.insert( { t->getName(), t } ); }
-        }
-    }
-    else
-    {
-        m_colorTexture  = m_fancyTexture.get();
-        colorTextureSet = true;
-    }
-
-    if ( !colorTextureSet )
-    {
-        m_colorTexture  = m_fancyTexture.get();
-        colorTextureSet = true;
-    }
 }
 
 // Draw debug stuff, do not overwrite depth map but do depth testing
@@ -375,4 +345,59 @@ void NodeBasedRenderer::updateStepInternal( const ViewingParameters& renderData
     m_originalRenderGraph.update();
 }
 
+void NodeBasedRenderer::setDisplayNode( DisplaySinkNode* displayNode) {
+    if ( m_displayObserverId != -1 ) {
+        m_displaySinkNode->detach(m_displayObserverId);
+    }
+    m_displaySinkNode = displayNode;
+    m_displayObserverId = m_displaySinkNode->attachMember(this, &NodeBasedRenderer::observeDisplaySink);
+}
+
+void NodeBasedRenderer::observeDisplaySink(const std::vector<NodeTypeTexture*>& graphOutput) {
+    // TODO : find a way to make the renderer observable to manage ouput texture in the applicaiton gui if needed
+    std::cout << "NodeBasedRenderer::observeDisplaySink - connected textures (" << graphOutput.size() << ") : \n";
+    /*
+    for ( const auto t : graphOutput )
+    {
+        if ( t ) { std::cout << "\t" << t->getName() << "\n"; }
+        else
+        { std::cout << "\tName not available yet. Must run the graph a first time\n"; }
+    }
+    */
+    // Add display nodes' linked textures to secondary textures
+    m_secondaryTextures.clear();
+    for ( const auto& t : m_sharedTextures )
+    { m_secondaryTextures.insert( { t.first, t.second.get() } ); }
+
+    bool colorTextureSet = false;
+    if ( m_displaySinkNode )
+    {
+        auto textures = m_displaySinkNode->getTextures();
+        for ( const auto t : textures )
+        {
+#ifdef GRAPH_CALL_TRACE
+            std::cout << t->getName() << std::endl;
+#endif
+            if ( !colorTextureSet )
+            {
+                m_colorTexture  = t;
+                colorTextureSet = true;
+            }
+            else
+            { m_secondaryTextures.insert( { t->getName(), t } ); }
+        }
+    }
+    else
+    {
+        m_colorTexture  = m_fancyTexture.get();
+        colorTextureSet = true;
+    }
+
+    if ( !colorTextureSet )
+    {
+        m_colorTexture  = m_fancyTexture.get();
+        colorTextureSet = true;
+    }
+}
+
 } // namespace RadiumNBR
diff --git a/src/libRender/RadiumNBR/NodeBasedRenderer.hpp b/src/libRender/RadiumNBR/NodeBasedRenderer.hpp
index aac89df..77b6166 100644
--- a/src/libRender/RadiumNBR/NodeBasedRenderer.hpp
+++ b/src/libRender/RadiumNBR/NodeBasedRenderer.hpp
@@ -41,8 +41,7 @@ extern int NodeBasedRendererMagic;
  *
  * @see rendering.md for description of the renderer
  */
-class NodeBasedRenderer_LIBRARY_API NodeBasedRenderer : public Ra::Engine::Rendering::Renderer
-{
+class NodeBasedRenderer_LIBRARY_API NodeBasedRenderer : public Ra::Engine::Rendering::Renderer{
 
   public:
     /**
@@ -98,7 +97,7 @@ class NodeBasedRenderer_LIBRARY_API NodeBasedRenderer : public Ra::Engine::Rende
     RenderGraph* getRenderGraph() { return &m_originalRenderGraph; }
 
     /// Sets the display sink node
-    void setDisplayNode( DisplaySinkNode* displayNode ) { m_displaySinkNode = displayNode; }
+    void setDisplayNode( DisplaySinkNode* displayNode );
 
     /// Loads the render graph from a Json file.
     void loadFromJson( const std::string& jsonFilePath );
@@ -144,6 +143,10 @@ class NodeBasedRenderer_LIBRARY_API NodeBasedRenderer : public Ra::Engine::Rende
 
     /// The display sink node used to get the secondary textures
     DisplaySinkNode* m_displaySinkNode{ nullptr };
+    /// ObserverId for displaySink;
+    int m_displayObserverId{-1};
+
+    void observeDisplaySink(const std::vector<NodeTypeTexture*>&);
 
   public:
     inline std::map<std::string, std::shared_ptr<Ra::Engine::Data::Texture>>& sharedTextures() {
diff --git a/src/libRender/RadiumNBR/NodeGraph/Node.cpp b/src/libRender/RadiumNBR/NodeGraph/Node.cpp
index 39bcfcb..59d3352 100644
--- a/src/libRender/RadiumNBR/NodeGraph/Node.cpp
+++ b/src/libRender/RadiumNBR/NodeGraph/Node.cpp
@@ -1,16 +1,59 @@
 #include <RadiumNBR/NodeGraph/Node.hpp>
 
+#include <Core/Utils/Log.hpp>
+using namespace Ra::Core::Utils;
+
+Node::Node( const std::string& instanceName, const std::string& typeName ) :
+    m_typeName{ typeName }, m_instanceName{ instanceName } {}
+
 void Node::fromJson( const nlohmann::json& data ) {
-    // TODO get the common content of the Node from the json data
-    m_uuid = data["id"];
+#if 0
+    std::cout << "\nNode::fromJson data are : \n";
+    for (auto& [key, value] : data.items()) {
+        std::cout << key << " : " << value << "\n";
+    }
+#endif
+
+    // get the common content of the Node from the json data
+    m_uuid                   = data["id"];
+    std::string readTypeName = data["model"]["name"];
+    if ( readTypeName != m_typeName )
+    {
+        LOG( logERROR ) << "Node::fromJson : incoherent type names : json data : " << readTypeName
+                        << " -- expected : " << m_typeName;
+    }
+    if ( data["model"].contains( "instance" ) ) { m_instanceName = data["model"]["instance"]; }
 
     // get the specific concrete node informations
-    fromJsonInternal( data );
+    const auto& datamodel = data["model"];
+    fromJsonInternal( datamodel );
+
+    // get the supplemental informations related to application/gui/...
+    for ( auto& [key, value] : data.items() )
+    {
+        if ( key != "id" && key != "model" ) { m_extraJsonData.emplace( key, value ); }
+    }
 }
 
 void Node::toJson( nlohmann::json& data ) const {
-    // TODO write the common content of the Node to the json data
+    // write the common content of the Node to the json data
+    data["id"] = m_uuid;
+
+    nlohmann::json model;
+    model["instance"] = m_instanceName;
+    model["name"]     = m_typeName;
 
     // Fill the specific concrete node informations
-    toJsonInternal( data );
+    toJsonInternal( model );
+    data.emplace( "model", model );
+
+    // store the supplemental informations related to application/gui/...
+    for ( auto& [key, value] : m_extraJsonData.items() )
+    {
+        if ( key != "id" && key != "model" ) { data.emplace( key, value ); }
+    }
+
+    std::cout << "Node::toJson -- generated json is : \n";
+    for ( auto& [key, value] : data.items() )
+    { std::cout << "\t" << key << " : " << value << "\n"; }
 }
diff --git a/src/libRender/RadiumNBR/NodeGraph/Node.hpp b/src/libRender/RadiumNBR/NodeGraph/Node.hpp
index c85968d..aaa3c21 100644
--- a/src/libRender/RadiumNBR/NodeGraph/Node.hpp
+++ b/src/libRender/RadiumNBR/NodeGraph/Node.hpp
@@ -92,10 +92,12 @@ class NodeBasedRenderer_LIBRARY_API Node
 
     /// return the json representation of the concrete node
     void toJson( nlohmann::json& data ) const;
-    virtual void toJsonInternal( nlohmann::json& data ) const {} //= 0;
+
     /// Fill the node from its json description
     void fromJson( const nlohmann::json& data );
-    virtual void fromJsonInternal( const nlohmann::json& data ) {} //= 0;
+
+    /// Give access to extra json data stored on the node by external application components
+    nlohmann::json& getExtraJsonData() { return m_extraJsonData; }
 
     /// Build a render technic per material.
     /// @param ro The render object to get the material from
@@ -136,8 +138,19 @@ class NodeBasedRenderer_LIBRARY_API Node
   protected:
     /// @param instanceName The name of the node
     /// @param typeName The type name of the node
-    Node( const std::string instanceName, const std::string& typeName ) :
-        m_typeName{ typeName }, m_instanceName{ instanceName } {}
+    Node( const std::string& instanceName, const std::string& typeName );
+
+    /// internal json representation of the Node.
+    /// Must be implemented by inheriting classes.
+    /// Be careful with template specialization and function member overriding when implementing this method.
+    virtual void fromJsonInternal( const nlohmann::json& data ) {
+        std::cout << "virtual void fromJsonInternal : MUST NOT BE CALLED on a " << typeid(*this).name() << "\n";
+    }//= 0;
+
+    /// internal json representation of the Node.
+    /// Must be implemented by inheriting classes.
+    /// Be careful with template specialization and function member overriding when implementing this method.
+    virtual void toJsonInternal( nlohmann::json& data ) const {} //= 0;
 
     /// Adds an in port to the node.
     /// This function checks if there is no in port with the same name already associated with this
@@ -198,4 +211,7 @@ class NodeBasedRenderer_LIBRARY_API Node
     std::string m_resourceDir{ "./" };
     /// The renderer's shader program manager
     Ra::Engine::Data::ShaderProgramManager* m_shaderMngr;
+
+    /// Additional data on the node, added by application or gui or ...
+    nlohmann::json m_extraJsonData;
 };
diff --git a/src/libRender/RadiumNBR/NodeGraph/NodeFactory.cpp b/src/libRender/RadiumNBR/NodeGraph/NodeFactory.cpp
index 391fd54..d83ab51 100644
--- a/src/libRender/RadiumNBR/NodeGraph/NodeFactory.cpp
+++ b/src/libRender/RadiumNBR/NodeGraph/NodeFactory.cpp
@@ -42,228 +42,195 @@ void initializeNodeFactory() {
     {
         needsInitialization = false;
         // Fill the factory with premades nodes
-        NodeFactory::registerNode<SourceNode<bool>>( []( const nlohmann::json& data ) {
-            std::string value = data["model"]["boolean"];
-            auto sourceBoolean =
-                new SourceNode<bool>( "boolean" + std::to_string( NodeFactory::newNodeId() ) );
-            sourceBoolean->setData( value == "1" );
-            return sourceBoolean;
+        NodeFactory::registerNode<BooleanValueSource>( []( const nlohmann::json& data ) {
+            auto node =
+                new BooleanValueSource( "boolean_" + std::to_string( NodeFactory::newNodeId() ) );
+            node->fromJson( data );
+            return node;
         } );
 
-        NodeFactory::registerNode<SourceNode<float>>( []( const nlohmann::json& data ) {
-            std::string value = data["model"]["number"];
-            float scalar      = std::stof( value );
-            auto sourceScalar =
-                new SourceNode<float>( "float" + std::to_string( NodeFactory::newNodeId() ) );
-            sourceScalar->setData( scalar );
-            return sourceScalar;
+        NodeFactory::registerNode<ScalarValueSource>( []( const nlohmann::json& data ) {
+            auto node =
+                new ScalarValueSource( "Scalar_" + std::to_string( NodeFactory::newNodeId() ) );
+            node->fromJson( data );
+            return node;
         } );
 
-        NodeFactory::registerNode<SourceNode<NodeTypeColor>>( []( const nlohmann::json& data ) {
-            std::string valueRed   = data["model"]["colorRed"];
-            std::string valueGreen = data["model"]["colorGreen"];
-            std::string valueBlue  = data["model"]["colorBlue"];
-            float red              = std::stof( valueRed ) / 255.0f;
-            float green            = std::stof( valueGreen ) / 255.0f;
-            float blue             = std::stof( valueBlue ) / 255.0f;
-
-            auto sourceColor = new SourceNode<NodeTypeColor>(
-                "color" + std::to_string( NodeFactory::newNodeId() ) );
+        NodeFactory::registerNode<ColorSourceNode>( []( const nlohmann::json& data ) {
+            auto node = new ColorSourceNode( "Color_" + std::to_string( NodeFactory::newNodeId() ) );
+            node->fromJson( data );
+            return node;
+        } );
 
-            sourceColor->setData( NodeTypeColor::sRGBToLinearRGB( NodeTypeColor::fromRGB(
-                Ra::Core::Utils::ColorBase<float>( red, green, blue ).rgb() ) ) );
-            return sourceColor;
+        NodeFactory::registerNode<EnvMapTextureSource>( []( const nlohmann::json& data ) -> Node* {
+            auto node =
+                new EnvMapTextureSource( "EnvMap_" + std::to_string( NodeFactory::newNodeId() ) );
+            node->fromJson( data );
+            return node;
         } );
 
         NodeFactory::registerNode<ColorTextureNode>( []( const nlohmann::json& data ) {
-            auto sourceColorTexture =
-                new ColorTextureNode( "colorTexture" + std::to_string( NodeFactory::newNodeId() ) );
-            return sourceColorTexture;
+            auto node =
+                new ColorTextureNode( "colorTexture_" + std::to_string( NodeFactory::newNodeId() ) );
+            node->fromJson( data );
+            return node;
         } );
 
         NodeFactory::registerNode<DepthTextureNode>( []( const nlohmann::json& data ) {
-            auto sourceDepthTexture =
-                new DepthTextureNode( "depthTexture" + std::to_string( NodeFactory::newNodeId() ) );
-            return sourceDepthTexture;
+            auto node =
+                new DepthTextureNode( "depthTexture_" + std::to_string( NodeFactory::newNodeId() ) );
+            node->fromJson( data );
+            return node;
         } );
 
         NodeFactory::registerNode<FilterROByTypeNode>( []( const nlohmann::json& data ) {
-            std::string filteredType = data["model"]["filteredType"];
-            auto filterROByType      = new FilterROByTypeNode(
+            auto node      = new FilterROByTypeNode(
                 "filterROByType" + std::to_string( NodeFactory::newNodeId() ) );
-            filterROByType->setTypeToFilter( filteredType );
-            return filterROByType;
+            node->fromJson( data );
+            return node;
         } );
 
         NodeFactory::registerNode<FilterROByNameNode>( []( const nlohmann::json& data ) {
-            std::string filteredName = data["model"]["filteredName"];
-            auto filterROByName      = new FilterROByNameNode(
+            auto node      = new FilterROByNameNode(
                 "filterROByName" + std::to_string( NodeFactory::newNodeId() ) );
-            filterROByName->setNameToFilter( filteredName );
-            return filterROByName;
+            node->fromJson( data );
+            return node;
         } );
 
         NodeFactory::registerNode<AccessibilityBufferNode>( []( const nlohmann::json& data ) {
-            auto accessibilityBuffer = new AccessibilityBufferNode(
+            auto node = new AccessibilityBufferNode(
                 "accessibilityBufferPass" + std::to_string( NodeFactory::newNodeId() ) );
-            return accessibilityBuffer;
+            node->fromJson( data );
+            return node;
         } );
 
         NodeFactory::registerNode<ZGeomPrepassNode>( []( const nlohmann::json& data ) {
-            auto zGeomPrepass =
+            auto node =
                 new ZGeomPrepassNode( "zGeomPrepass" + std::to_string( NodeFactory::newNodeId() ) );
-            return zGeomPrepass;
+            node->fromJson( data );
+            return node;
         } );
 
         NodeFactory::registerNode<EmissivityNode>( []( const nlohmann::json& data ) {
-            auto emissivity =
+            auto node =
                 new EmissivityNode( "emissivityPass" + std::to_string( NodeFactory::newNodeId() ) );
-            return emissivity;
+            node->fromJson( data );
+            return node;
         } );
 
         NodeFactory::registerNode<EnvLightNode>( []( const nlohmann::json& data ) {
-            auto environmentLight = new EnvLightNode( "environmentLightPass" +
+            auto node = new EnvLightNode( "environmentLightPass" +
                                                       std::to_string( NodeFactory::newNodeId() ) );
-            return environmentLight;
+            node->fromJson( data );
+            return node;
         } );
 
         NodeFactory::registerNode<LocalLightNode>( []( const nlohmann::json& data ) {
-            auto localLight =
+            auto node =
                 new LocalLightNode( "localLightPass" + std::to_string( NodeFactory::newNodeId() ) );
-            return localLight;
+            node->fromJson( data );
+            return node;
         } );
 
         NodeFactory::registerNode<ClearColorNode>( []( const nlohmann::json& data ) {
-            auto clearColor =
+            auto node =
                 new ClearColorNode( "clearColorPass" + std::to_string( NodeFactory::newNodeId() ) );
-            return clearColor;
+            node->fromJson( data );
+            return node;
         } );
 
         NodeFactory::registerNode<TransparencyNode>( []( const nlohmann::json& data ) {
-            auto transparency = new TransparencyNode( "transparencyPass" +
+            auto node = new TransparencyNode( "transparencyPass" +
                                                       std::to_string( NodeFactory::newNodeId() ) );
-            return transparency;
+            node->fromJson( data );
+            return node;
         } );
 
         NodeFactory::registerNode<VolumeNode>( []( const nlohmann::json& data ) {
-            auto volume =
+            auto node =
                 new VolumeNode( "volumePass" + std::to_string( NodeFactory::newNodeId() ) );
-            return volume;
+            node->fromJson( data );
+            return node;
         } );
 
         NodeFactory::registerNode<VolumeVizualisationNode>( []( const nlohmann::json& data ) {
-            auto volumeViz = new VolumeVizualisationNode(
+            auto node = new VolumeVizualisationNode(
                 "volumeVizualisationPass" + std::to_string( NodeFactory::newNodeId() ) );
-            return volumeViz;
+            node->fromJson( data );
+            return node;
         } );
 
         NodeFactory::registerNode<UINode>( []( const nlohmann::json& data ) {
-            auto ui = new UINode( "uiPass" + std::to_string( NodeFactory::newNodeId() ) );
-            return ui;
+            auto node = new UINode( "uiPass" + std::to_string( NodeFactory::newNodeId() ) );
+            node->fromJson( data );
+            return node;
         } );
 
         NodeFactory::registerNode<WireframeNode>( []( const nlohmann::json& data ) {
-            auto wireframe =
+            auto node =
                 new WireframeNode( "wireframePass" + std::to_string( NodeFactory::newNodeId() ) );
-            return wireframe;
+            node->fromJson( data );
+            return node;
         } );
 
-        NodeFactory::registerNode<SourceNode<std::shared_ptr<RadiumNBR::EnvMap>>>(
-            []( const nlohmann::json& data ) -> Node* {
-                std::string name     = data["model"]["name"];
-                std::string files    = data["model"]["files"];
-                std::string envt     = data["model"]["type"];
-                std::string strength = data["model"]["strength"];
-                float s              = std::atof( strength.c_str() ) / 100.;
-                int t                = std::stoi( envt.c_str() );
-                RadiumNBR::EnvMap::EnvMapType envType;
-                switch ( t )
-                {
-                case 0:
-                    envType = RadiumNBR::EnvMap::EnvMapType::ENVMAP_PFM;
-                    break;
-                case 1:
-                    envType = RadiumNBR::EnvMap::EnvMapType::ENVMAP_CUBE;
-                    break;
-                case 2:
-                    envType = RadiumNBR::EnvMap::EnvMapType::ENVMAP_LATLON;
-                    break;
-                default:
-                    return nullptr;
-                }
-                // check if the file exists
-                bool envmap_exist;
-                if ( envType == RadiumNBR::EnvMap::EnvMapType::ENVMAP_CUBE )
-                {
-                    std::string f1 = files.substr( 0, files.find( ';' ) - 1 );
-                    envmap_exist   = std::filesystem::exists( f1 );
-                }
-                else
-                { envmap_exist = std::filesystem::exists( files ); }
-                if ( !envmap_exist )
-                {
-                    auto node = new SourceNode<std::shared_ptr<RadiumNBR::EnvMap>>(
-                        name + "_" + std::to_string( NodeFactory::newNodeId() ) );
-                    return node;
-                }
-                else
-                {
-                    auto envmp = std::make_shared<RadiumNBR::EnvMap>( files, envType, true );
-                    envmp->setEnvStrength( s );
-                    auto node = new SourceNode<std::shared_ptr<RadiumNBR::EnvMap>>(
-                        name + "_" + std::to_string( NodeFactory::newNodeId() ) );
-                    node->setData( envmp );
-                    return node;
-                }
-            } );
 
+// -->
         NodeFactory::registerNode<SumNode>( []( const nlohmann::json& data ) {
             auto sum = new SumNode( "sum" + std::to_string( NodeFactory::newNodeId() ) );
+            // TODO :             node->fromJson( data );
             return sum;
         } );
 
         NodeFactory::registerNode<DifferenceNode>( []( const nlohmann::json& data ) {
             auto difference =
                 new DifferenceNode( "difference" + std::to_string( NodeFactory::newNodeId() ) );
+            // TODO :             node->fromJson( data );
             return difference;
         } );
 
         NodeFactory::registerNode<MultiplyNode>( []( const nlohmann::json& data ) {
             auto multiply =
                 new MultiplyNode( "multiply" + std::to_string( NodeFactory::newNodeId() ) );
+            // TODO :             node->fromJson( data );
             return multiply;
         } );
 
         NodeFactory::registerNode<OneMinusNode>( []( const nlohmann::json& data ) {
             auto oneMinus =
                 new OneMinusNode( "one minus" + std::to_string( NodeFactory::newNodeId() ) );
+            // TODO :             node->fromJson( data );
             return oneMinus;
         } );
 
         NodeFactory::registerNode<MaxNode>( []( const nlohmann::json& data ) {
             auto max = new MaxNode( "max" + std::to_string( NodeFactory::newNodeId() ) );
+            // TODO :             node->fromJson( data );
             return max;
         } );
 
         NodeFactory::registerNode<MinNode>( []( const nlohmann::json& data ) {
             auto min = new MinNode( "min" + std::to_string( NodeFactory::newNodeId() ) );
+            // TODO :             node->fromJson( data );
             return min;
         } );
 
         NodeFactory::registerNode<MoreThanThresholdNode>( []( const nlohmann::json& data ) {
             auto moreThanThreshold = new MoreThanThresholdNode(
                 "more than threshold" + std::to_string( NodeFactory::newNodeId() ) );
+            // TODO :             node->fromJson( data );
             return moreThanThreshold;
         } );
 
         NodeFactory::registerNode<LessThanThresholdNode>( []( const nlohmann::json& data ) {
             auto lessThanThreshold = new LessThanThresholdNode(
                 "less than threshold" + std::to_string( NodeFactory::newNodeId() ) );
+            // TODO :             node->fromJson( data );
             return lessThanThreshold;
         } );
 
         NodeFactory::registerNode<FXAANode>( []( const nlohmann::json& data ) {
             auto fxaa = new FXAANode( "fxaa" + std::to_string( NodeFactory::newNodeId() ) );
+            // TODO :             node->fromJson( data );
             return fxaa;
         } );
     }
diff --git a/src/libRender/RadiumNBR/NodeGraph/Port.hpp b/src/libRender/RadiumNBR/NodeGraph/Port.hpp
index 9925e9b..c1ce9b6 100644
--- a/src/libRender/RadiumNBR/NodeGraph/Port.hpp
+++ b/src/libRender/RadiumNBR/NodeGraph/Port.hpp
@@ -2,6 +2,7 @@
 #include <string>
 #include <typeinfo>
 
+#include <Core/Utils/Observable.hpp>
 class Node;
 
 /// Base class for nodes' ports
@@ -86,8 +87,12 @@ class PortOut : public PortBase
     bool disconnect() override { return false; }
 };
 
+/**
+ * PortIn is an Observable<PortIn<T>&> that notifyes its observers at connect/disconnect event
+ * @tparam T
+ */
 template <typename T>
-class PortIn : public PortBase
+class PortIn : public PortBase, public Ra::Core::Utils::Observable<const std::string&, const PortIn<T>&, bool>
 {
   private:
     /// A pointer to the out port this port is connected to.
@@ -118,6 +123,8 @@ class PortIn : public PortBase
         {
             m_from     = dynamic_cast<PortOut<T>*>( other );
             m_isLinked = true;
+            // notify after connect
+            this->notify(getName(), *this, true);
         }
         return m_isLinked;
     }
@@ -126,6 +133,8 @@ class PortIn : public PortBase
     bool disconnect() override {
         if ( m_isLinked )
         {
+            // notify before disconnect
+            this->notify(getName(), *this, false);
             m_from     = nullptr;
             m_isLinked = false;
             return true;
diff --git a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/Demo/SimpleNode.hpp b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/Demo/SimpleNode.hpp
deleted file mode 100644
index a477aaf..0000000
--- a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/Demo/SimpleNode.hpp
+++ /dev/null
@@ -1,205 +0,0 @@
-#pragma once
-#include <RadiumNBR/NodeGraph/Node.hpp>
-
-#include <globjects/Framebuffer.h>
-
-class NodeBasedRenderer_LIBRARY_API SimpleNode : public Node
-{
-  public:
-    explicit SimpleNode( const std::string& name ) : Node( name, getTypename() ) {
-        auto portInRO = new PortIn<std::vector<NodeTypeRenderObject>>( "inRenderObjects", this );
-        addInput( portInRO );
-        auto portInC = new PortIn<std::vector<NodeTypeCamera>>( "inCameras", this );
-        addInput( portInC );
-        portInC->mustBeLinked();
-        auto portInL = new PortIn<std::vector<NodeTypeLight>>( "inLights", this );
-        addInput( portInL );
-
-        Ra::Engine::Data::TextureParameters colorTexParams = { "Color Texture",
-                                                               gl::GL_TEXTURE_2D,
-                                                               1,
-                                                               1,
-                                                               1,
-                                                               gl::GL_RGBA,
-                                                               gl::GL_RGBA32F,
-                                                               gl::GL_FLOAT,
-                                                               gl::GL_CLAMP_TO_EDGE,
-                                                               gl::GL_CLAMP_TO_EDGE,
-                                                               gl::GL_CLAMP_TO_EDGE,
-                                                               gl::GL_LINEAR,
-                                                               gl::GL_LINEAR,
-                                                               nullptr };
-        m_colorTexture = new Ra::Engine::Data::Texture( colorTexParams );
-
-        auto portOutColorTex = new PortOut<NodeTypeTexture>( "outColorTexture", this );
-        addOutput( portOutColorTex, m_colorTexture );
-    }
-
-    void init() override {
-        m_framebuffer = new globjects::Framebuffer();
-
-        Ra::Engine::Data::TextureParameters depthTexParams = { "Depth Texture",
-                                                               gl::GL_TEXTURE_2D,
-                                                               1,
-                                                               1,
-                                                               1,
-                                                               gl::GL_DEPTH_COMPONENT,
-                                                               gl::GL_DEPTH_COMPONENT24,
-                                                               gl::GL_UNSIGNED_INT,
-                                                               gl::GL_CLAMP_TO_EDGE,
-                                                               gl::GL_CLAMP_TO_EDGE,
-                                                               gl::GL_CLAMP_TO_EDGE,
-                                                               gl::GL_NEAREST,
-                                                               gl::GL_NEAREST,
-                                                               nullptr };
-        m_depthTexture = new Ra::Engine::Data::Texture( depthTexParams );
-
-        float blankAO[4] = { 1.f, 1.f, 1.f, 1.f };
-        Ra::Engine::Data::TextureParameters texParams;
-        texParams.target         = gl::GL_TEXTURE_2D;
-        texParams.width          = 1;
-        texParams.height         = 1;
-        texParams.internalFormat = gl::GL_RGBA32F;
-        texParams.format         = gl::GL_RGBA;
-        texParams.type           = gl::GL_FLOAT;
-        texParams.minFilter      = gl::GL_NEAREST;
-        texParams.magFilter      = gl::GL_NEAREST;
-        texParams.name           = "Blank AO";
-        texParams.texels         = &blankAO;
-        m_blankAO                = new Ra::Engine::Data::Texture( texParams );
-        m_blankAO->initializeGL();
-    }
-
-    void update() override {}
-
-    void execute() override {
-        Ra::Engine::Data::RenderParameters inPassParams;
-
-        // Render objects
-        auto inputRO =
-            dynamic_cast<PortIn<std::vector<NodeTypeRenderObject>>*>( m_inputs[0].get() );
-        std::vector<NodeTypeRenderObject> renderObjects;
-        if ( !inputRO->isLinked() )
-        {
-#ifdef GRAPH_CALL_TRACE
-            std::cout << "RenderObjects port is not linked, no render object" << std::endl;
-#endif
-        }
-        else
-        {
-            renderObjects = inputRO->getData();
-#ifdef GRAPH_CALL_TRACE
-            std::cout << renderObjects.size() << " render objects" << std::endl;
-#endif
-        }
-
-        // Cameras
-        auto inputCamera = dynamic_cast<PortIn<std::vector<NodeTypeCamera>>*>( m_inputs[1].get() );
-        std::vector<NodeTypeCamera> cameras = inputCamera->getData();
-#ifdef GRAPH_CALL_TRACE
-        std::cout << cameras.size() << " cameras" << std::endl;
-#endif
-
-        // Lights
-        auto inputLight = dynamic_cast<PortIn<std::vector<NodeTypeLight>>*>( m_inputs[2].get() );
-        std::vector<NodeTypeLight> lights;
-        if ( !inputLight->isLinked() )
-        {
-#ifdef GRAPH_CALL_TRACE
-            std::cout << "Lights port is not linked, 0 light" << std::endl;
-#endif
-        }
-        else
-        {
-            lights = inputLight->getData();
-#ifdef GRAPH_CALL_TRACE
-            std::cout << lights.size() << " lights" << std::endl;
-#endif
-        }
-
-        inPassParams.addParameter( "amb_occ_sampler", m_blankAO );
-
-        m_framebuffer->bind();
-        m_framebuffer->attachTexture( gl::GL_DEPTH_ATTACHMENT, m_depthTexture->texture() );
-        m_framebuffer->attachTexture( gl::GL_COLOR_ATTACHMENT0, m_colorTexture->texture() );
-
-        const gl::GLenum buffers[] = { gl::GL_COLOR_ATTACHMENT0 };
-        gl::glDrawBuffers( 1, buffers );
-        gl::glEnable( gl::GL_DEPTH_TEST );
-        gl::glDepthMask( gl::GL_TRUE );
-        gl::glDepthFunc( gl::GL_LESS );
-        gl::glColorMask( gl::GL_TRUE, gl::GL_TRUE, gl::GL_TRUE, gl::GL_TRUE );
-
-        float clearBlack[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
-        float clearDepth    = 1.0f;
-        gl::glClearBufferfv( gl::GL_COLOR, 0, clearBlack );
-        gl::glClearBufferfv( gl::GL_DEPTH, 0, &clearDepth );
-
-        gl::glDisable( gl::GL_BLEND );
-
-        if ( lights.size() > 0 )
-        {
-            for ( const auto& l : lights )
-            {
-                l->getRenderParameters( inPassParams );
-
-                for ( const auto& ro : renderObjects )
-                { ro->render( inPassParams, cameras[0], m_idx ); }
-            }
-        }
-
-        m_framebuffer->detach( gl::GL_DEPTH_ATTACHMENT );
-        m_framebuffer->detach( gl::GL_COLOR_ATTACHMENT0 );
-        m_framebuffer->unbind();
-    }
-
-    void destroy() override {
-        delete m_framebuffer;
-        delete m_colorTexture;
-        delete m_depthTexture;
-    }
-
-    void resize( uint32_t width, uint32_t height ) override {
-        m_colorTexture->resize( width, height );
-        m_depthTexture->resize( width, height );
-    }
-
-    void buildRenderTechnique( const Ra::Engine::Rendering::RenderObject* ro,
-                               Ra::Engine::Rendering::RenderTechnique& rt ) const override {
-        auto mat = const_cast<Ra::Engine::Rendering::RenderObject*>( ro )->getMaterial();
-        // Volumes are not used in EnvLightPass
-        if ( mat->getMaterialAspect() == Ra::Engine::Data::Material::MaterialAspect::MAT_DENSITY )
-        { return; }
-
-        if ( auto cfg = Ra::Engine::Data::ShaderConfigurationFactory::getConfiguration(
-                 { "LocalLightPass::" + mat->getMaterialName() } ) )
-        { rt.setConfiguration( *cfg, m_idx ); }
-        else
-        {
-            std::string resourcesRootDir = m_resourceDir;
-            // Build the shader configuration
-            Ra::Engine::Data::ShaderConfiguration theConfig{
-                { "LocalLightPass::" + mat->getMaterialName() },
-                resourcesRootDir + "Shaders/LocalLightPass/lightpass.vert.glsl",
-                resourcesRootDir + "Shaders/LocalLightPass/lightpass.frag.glsl" };
-            // add the material interface to the fragment shader
-            theConfig.addInclude( "\"" + mat->getMaterialName() + ".glsl\"",
-                                  Ra::Engine::Data::ShaderType::ShaderType_FRAGMENT );
-            // Add to the ShaderConfigManager
-            Ra::Engine::Data::ShaderConfigurationFactory::addConfiguration( theConfig );
-            // Add to the RenderTechnique
-            rt.setConfiguration( theConfig, m_idx );
-        }
-        rt.setParametersProvider( mat, m_idx );
-    }
-
-    static const std::string getTypename() { return "Simple Render Pass"; }
-
-  private:
-    Ra::Engine::Data::Texture* m_colorTexture{ nullptr };
-    Ra::Engine::Data::Texture* m_depthTexture{ nullptr };
-
-    Ra::Engine::Data::Texture* m_blankAO{ nullptr };
-
-    globjects::Framebuffer* m_framebuffer{ nullptr };
-};
diff --git a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/Filters/FilterNode.hpp b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/Filters/FilterNode.hpp
index 5b1eba1..cd88055 100644
--- a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/Filters/FilterNode.hpp
+++ b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/Filters/FilterNode.hpp
@@ -63,7 +63,49 @@ class FilterNode : public Node
         addOutput( portOut, &m_elements );
     }
 
+    void toJsonInternal( nlohmann::json& data ) const override {}
+    void fromJsonInternal( const nlohmann::json& data ) override {}
+
   private:
     std::function<bool( T )> m_filterFunction;
     std::vector<T> m_elements;
 };
+
+#include <vector>
+#include <initializer_list>
+template <typename T>
+class Selector {
+    std::vector<T> m_values;
+    size_t m_currentIndex{0};
+    T* m_currentValue;
+  public:
+    explicit Selector(std::initializer_list<T> values) : m_values{values}, m_currentValue { m_values.data() } {}
+    const T& get() const { return *m_currentValue; }
+    size_t size() const { return m_values.size(); }
+    bool set(size_t p) {
+        if (p < m_values.size()) {
+            m_currentValue = m_values.data()+p;
+            m_currentIndex = p;
+            return true;
+        } else { return false; }
+    }
+    bool set(const T& v) {
+        size_t p = 0;
+        for(const auto& e : m_values) {
+            if ( e == v ) {
+                return set(p);
+            }
+            p++;
+        }
+        return false;
+    }
+    typename std::vector<T>::const_iterator begin() const {
+        return m_values.cbegin();
+    }
+    typename std::vector<T>::const_iterator end() const {
+        return m_values.cend();
+    }
+    const T& operator[](size_t p) const {
+        return m_values.at( p );
+    }
+};
diff --git a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/Filters/FilterROByNameNode.hpp b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/Filters/FilterROByNameNode.hpp
index b7696c2..4471b9a 100644
--- a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/Filters/FilterROByNameNode.hpp
+++ b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/Filters/FilterROByNameNode.hpp
@@ -17,12 +17,26 @@ class FilterROByNameNode : public FilterNode<NodeTypeRenderObject>
                 }
                 catch ( ... )
                 { return false; }
-            } ) {}
+            } ) {
+        addEditableParameter( new EditableParameter( "Name regexp", m_filteredName ) );
+    }
 
     void setNameToFilter( const std::string& newNameToFilter ) { m_filteredName = newNameToFilter; }
 
     static const std::string getTypename() { return "Filter RenderObjects By Name"; }
 
+  protected:
+    void toJsonInternal( nlohmann::json& data ) const override {
+        if ( !m_filteredName.empty() ) {
+            data["filteredName"] = m_filteredName;
+        }
+    }
+    void fromJsonInternal( const nlohmann::json& data ) override {
+        if ( data.contains( "filteredName" ) ) { m_filteredName = data["filteredName"].get<std::string>(); }
+        else
+        { m_filteredName = ""; }
+    }
+
   private:
     std::string m_filteredName{ "" };
 };
diff --git a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/Filters/FilterROByTypeNode.hpp b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/Filters/FilterROByTypeNode.hpp
index df56997..c0a262a 100644
--- a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/Filters/FilterROByTypeNode.hpp
+++ b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/Filters/FilterROByTypeNode.hpp
@@ -10,10 +10,11 @@ class FilterROByTypeNode : public FilterNode<NodeTypeRenderObject>
             name,
             getTypename(),
             [this]( const NodeTypeRenderObject& ro ) {
-                if ( m_filteredType == "Opaque" ) { return !ro->isTransparent(); }
-                else if ( m_filteredType == "Transparent" )
+                const auto& currentSelection = m_selector.get();
+                if ( currentSelection == "Opaque" ) { return !ro->isTransparent(); }
+                else if ( currentSelection == "Transparent" )
                 { return ro->isTransparent(); }
-                else if ( m_filteredType == "Volume" )
+                else if ( currentSelection == "Volume" )
                 {
                     auto material = ro->getMaterial();
                     return material && material->getMaterialAspect() ==
@@ -21,12 +22,26 @@ class FilterROByTypeNode : public FilterNode<NodeTypeRenderObject>
                 }
                 else
                 { return false; }
-            } ) {}
+            } ) {
+        addEditableParameter( new EditableParameter( "Selected type", m_selector ) );
+    }
 
-    void setTypeToFilter( const std::string& newTypeToFilter ) { m_filteredType = newTypeToFilter; }
+    void setTypeToFilter( const std::string& newTypeToFilter ) { m_selector.set( newTypeToFilter ); }
 
     static const std::string getTypename() { return "Filter RenderObjects By Type"; }
 
+  protected:
+    void toJsonInternal( nlohmann::json& data ) const override {
+        if ( m_selector.get() != "Opaque" ) {
+            data["filteredType"] = m_selector.get();
+        }
+    }
+    void fromJsonInternal( const nlohmann::json& data ) override {
+        if ( data.contains( "filteredType" ) ) { m_selector.set( data["filteredType"].get<std::string>() ); }
+        else
+        { m_selector.set(0); }
+    }
+
   private:
-    std::string m_filteredType{ "Opaque" };
+    Selector<std::string> m_selector{"Opaque", "Transparent", "Volume"};
 };
diff --git a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/PremadeNodesIncludes.hpp b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/PremadeNodesIncludes.hpp
index 80bf363..21787cb 100644
--- a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/PremadeNodesIncludes.hpp
+++ b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/PremadeNodesIncludes.hpp
@@ -4,6 +4,7 @@
 #include <RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/EmissivityNode.hpp>
 #include <RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/EnvLightNode.hpp>
 #include <RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/LocalLightNode.hpp>
+#include <RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/SimpleNode.hpp>
 #include <RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/TransparencyNode.hpp>
 #include <RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/UINode.hpp>
 #include <RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/VolumeNode.hpp>
@@ -34,5 +35,3 @@
 #include <RadiumNBR/NodeGraph/PremadeNodes/Compositing/SumNode.hpp>
 
 #include <RadiumNBR/NodeGraph/PremadeNodes/AntiAliasing/FXAANode.hpp>
-
-#include <RadiumNBR/NodeGraph/PremadeNodes/Demo/SimpleNode.hpp>
diff --git a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/AccessibilityBufferNode.cpp b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/AccessibilityBufferNode.cpp
index f893396..037b56b 100644
--- a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/AccessibilityBufferNode.cpp
+++ b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/AccessibilityBufferNode.cpp
@@ -221,3 +221,18 @@ void AccessibilityBufferNode::resize( uint32_t width, uint32_t height ) {
               << "x" << height << "." << std::endl;
 #endif
 }
+
+void AccessibilityBufferNode::toJsonInternal( nlohmann::json& data ) const {
+    data["samples"] = m_currentSamples;
+    data["radius"] = m_editableAORadius;
+}
+
+void AccessibilityBufferNode::fromJsonInternal( const nlohmann::json& data ) {
+    if ( data.contains("radius") ) {
+        m_editableAORadius = data["radius"];
+    }
+    if ( data.contains("samples") ) {
+        m_currentSamples = data["samples"];
+        m_editableSamples = Scalar(m_currentSamples);
+    }
+}
diff --git a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/AccessibilityBufferNode.hpp b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/AccessibilityBufferNode.hpp
index 85a7f7a..a17b8af 100644
--- a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/AccessibilityBufferNode.hpp
+++ b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/AccessibilityBufferNode.hpp
@@ -20,6 +20,11 @@ class NodeBasedRenderer_LIBRARY_API AccessibilityBufferNode : public Node
     */
     static const std::string getTypename() { return "Accessibility Buffer Pass"; }
 
+
+  protected:
+    void toJsonInternal( nlohmann::json& data ) const override;
+    void fromJsonInternal( const nlohmann::json& data ) override;
+
   private:
     NodeTypeTexture* m_rawAO{ nullptr };
     NodeTypeTexture* m_AO{ nullptr };
diff --git a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/ClearColorNode.cpp b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/ClearColorNode.cpp
index a6cb092..5101600 100644
--- a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/ClearColorNode.cpp
+++ b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/ClearColorNode.cpp
@@ -134,3 +134,20 @@ void ClearColorNode::resize( uint32_t width, uint32_t height ) {
               << height << "." << std::endl;
 #endif
 }
+
+
+void ClearColorNode::toJsonInternal( nlohmann::json& data ) const {
+    NodeTypeColor c = NodeTypeColor::linearRGBTosRGB( m_editableClearColor );
+    std::array<Scalar, 3> color{ c.x(), c.y(), c.z() };
+    data["clearColor"] = color;
+}
+
+void ClearColorNode::fromJsonInternal( const nlohmann::json& data ) {
+    if ( data.contains("clearColor") ) {
+        std::array<Scalar, 3> c = data["clearColor"];
+        m_editableClearColor = NodeTypeColor::sRGBToLinearRGB( NodeTypeColor( c[0], c[1], c[2] ) );
+    } else {
+        m_editableClearColor = NodeTypeColor::sRGBToLinearRGB( NodeTypeColor( 42, 42, 42 ) * 1_ra/255_ra );
+    }
+
+}
diff --git a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/ClearColorNode.hpp b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/ClearColorNode.hpp
index 34faff8..87f63b4 100644
--- a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/ClearColorNode.hpp
+++ b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/ClearColorNode.hpp
@@ -21,6 +21,10 @@ class NodeBasedRenderer_LIBRARY_API ClearColorNode : public Node
 
     static const std::string getTypename() { return "Clear Color Pass"; }
 
+  protected:
+    void toJsonInternal( nlohmann::json& data ) const override;
+    void fromJsonInternal( const nlohmann::json& data ) override;
+
   private:
     Ra::Engine::Data::Texture* m_colorTexture{ nullptr };
     globjects::Framebuffer* m_framebuffer{ nullptr };
diff --git a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/EmissivityNode.hpp b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/EmissivityNode.hpp
index 971639d..8de9808 100644
--- a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/EmissivityNode.hpp
+++ b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/EmissivityNode.hpp
@@ -19,6 +19,10 @@ class NodeBasedRenderer_LIBRARY_API EmissivityNode : public Node
 
     static const std::string getTypename() { return "Emissivity Pass"; }
 
+  protected:
+    void toJsonInternal( nlohmann::json& data ) const override {}
+    void fromJsonInternal( const nlohmann::json& data ) override {}
+
   private:
     Ra::Engine::Data::Texture* m_colorTexture;
 
diff --git a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/EnvLightNode.hpp b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/EnvLightNode.hpp
index 9dbd96f..5c7172f 100644
--- a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/EnvLightNode.hpp
+++ b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/EnvLightNode.hpp
@@ -16,6 +16,10 @@ class NodeBasedRenderer_LIBRARY_API EnvLightNode : public Node
                                Ra::Engine::Rendering::RenderTechnique& rt ) const override;
     static const std::string getTypename() { return "Environment Light Pass"; }
 
+  protected:
+    void toJsonInternal( nlohmann::json& data ) const override {}
+    void fromJsonInternal( const nlohmann::json& data ) override {}
+
   private:
     Ra::Engine::Data::Texture* m_colorTexture{ nullptr };
 
diff --git a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/LocalLightNode.hpp b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/LocalLightNode.hpp
index 1744235..928390f 100644
--- a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/LocalLightNode.hpp
+++ b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/LocalLightNode.hpp
@@ -17,6 +17,10 @@ class NodeBasedRenderer_LIBRARY_API LocalLightNode : public Node
 
     static const std::string getTypename() { return "Local Light Pass"; }
 
+  protected:
+    void toJsonInternal( nlohmann::json& data ) const override {}
+    void fromJsonInternal( const nlohmann::json& data ) override {}
+
   private:
     Ra::Engine::Data::Texture* m_colorTexture{ nullptr };
 
diff --git a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/SimpleNode.cpp b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/SimpleNode.cpp
new file mode 100644
index 0000000..f56d417
--- /dev/null
+++ b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/SimpleNode.cpp
@@ -0,0 +1,190 @@
+#include <RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/SimpleNode.hpp>
+
+#include <Engine/Data/Material.hpp>
+#include <Engine/Data/ShaderConfigFactory.hpp>
+
+SimpleNode::SimpleNode( const std::string& name ) : Node( name, getTypename() ) {
+    auto portInRO = new PortIn<std::vector<NodeTypeRenderObject>>( "inRenderObjects", this );
+    addInput( portInRO );
+    auto portInC = new PortIn<std::vector<NodeTypeCamera>>( "inCameras", this );
+    addInput( portInC );
+    portInC->mustBeLinked();
+    auto portInL = new PortIn<std::vector<NodeTypeLight>>( "inLights", this );
+    addInput( portInL );
+
+    Ra::Engine::Data::TextureParameters colorTexParams = { "Color Texture",
+                                                           gl::GL_TEXTURE_2D,
+                                                           1,
+                                                           1,
+                                                           1,
+                                                           gl::GL_RGBA,
+                                                           gl::GL_RGBA32F,
+                                                           gl::GL_FLOAT,
+                                                           gl::GL_CLAMP_TO_EDGE,
+                                                           gl::GL_CLAMP_TO_EDGE,
+                                                           gl::GL_CLAMP_TO_EDGE,
+                                                           gl::GL_LINEAR,
+                                                           gl::GL_LINEAR,
+                                                           nullptr };
+    m_colorTexture = new Ra::Engine::Data::Texture( colorTexParams );
+
+    auto portOutColorTex = new PortOut<NodeTypeTexture>( "outColorTexture", this );
+    addOutput( portOutColorTex, m_colorTexture );
+}
+
+void SimpleNode::init() {
+    m_framebuffer = new globjects::Framebuffer();
+
+    Ra::Engine::Data::TextureParameters depthTexParams = { "Depth Texture",
+                                                           gl::GL_TEXTURE_2D,
+                                                           1,
+                                                           1,
+                                                           1,
+                                                           gl::GL_DEPTH_COMPONENT,
+                                                           gl::GL_DEPTH_COMPONENT24,
+                                                           gl::GL_UNSIGNED_INT,
+                                                           gl::GL_CLAMP_TO_EDGE,
+                                                           gl::GL_CLAMP_TO_EDGE,
+                                                           gl::GL_CLAMP_TO_EDGE,
+                                                           gl::GL_NEAREST,
+                                                           gl::GL_NEAREST,
+                                                           nullptr };
+    m_depthTexture = new Ra::Engine::Data::Texture( depthTexParams );
+
+    float blankAO[4] = { 1.f, 1.f, 1.f, 1.f };
+    Ra::Engine::Data::TextureParameters texParams;
+    texParams.target         = gl::GL_TEXTURE_2D;
+    texParams.width          = 1;
+    texParams.height         = 1;
+    texParams.internalFormat = gl::GL_RGBA32F;
+    texParams.format         = gl::GL_RGBA;
+    texParams.type           = gl::GL_FLOAT;
+    texParams.minFilter      = gl::GL_NEAREST;
+    texParams.magFilter      = gl::GL_NEAREST;
+    texParams.name           = "Blank AO";
+    texParams.texels         = &blankAO;
+    m_blankAO                = new Ra::Engine::Data::Texture( texParams );
+    m_blankAO->initializeGL();
+}
+
+void SimpleNode::update() {}
+
+void SimpleNode::execute() {
+    Ra::Engine::Data::RenderParameters inPassParams;
+
+    // Render objects
+    auto inputRO = dynamic_cast<PortIn<std::vector<NodeTypeRenderObject>>*>( m_inputs[0].get() );
+    std::vector<NodeTypeRenderObject> renderObjects;
+    if ( !inputRO->isLinked() )
+    {
+#ifdef GRAPH_CALL_TRACE
+        std::cout << "RenderObjects port is not linked, no render object" << std::endl;
+#endif
+    }
+    else
+    {
+        renderObjects = inputRO->getData();
+#ifdef GRAPH_CALL_TRACE
+        std::cout << renderObjects.size() << " render objects" << std::endl;
+#endif
+    }
+
+    // Cameras
+    auto inputCamera = dynamic_cast<PortIn<std::vector<NodeTypeCamera>>*>( m_inputs[1].get() );
+    std::vector<NodeTypeCamera> cameras = inputCamera->getData();
+#ifdef GRAPH_CALL_TRACE
+    std::cout << cameras.size() << " cameras" << std::endl;
+#endif
+
+    // Lights
+    auto inputLight = dynamic_cast<PortIn<std::vector<NodeTypeLight>>*>( m_inputs[2].get() );
+    std::vector<NodeTypeLight> lights;
+    if ( !inputLight->isLinked() )
+    {
+#ifdef GRAPH_CALL_TRACE
+        std::cout << "Lights port is not linked, 0 light" << std::endl;
+#endif
+    }
+    else
+    {
+        lights = inputLight->getData();
+#ifdef GRAPH_CALL_TRACE
+        std::cout << lights.size() << " lights" << std::endl;
+#endif
+    }
+
+    inPassParams.addParameter( "amb_occ_sampler", m_blankAO );
+
+    m_framebuffer->bind();
+    m_framebuffer->attachTexture( gl::GL_DEPTH_ATTACHMENT, m_depthTexture->texture() );
+    m_framebuffer->attachTexture( gl::GL_COLOR_ATTACHMENT0, m_colorTexture->texture() );
+
+    const gl::GLenum buffers[] = { gl::GL_COLOR_ATTACHMENT0 };
+    gl::glDrawBuffers( 1, buffers );
+    gl::glEnable( gl::GL_DEPTH_TEST );
+    gl::glDepthMask( gl::GL_TRUE );
+    gl::glDepthFunc( gl::GL_LESS );
+    gl::glColorMask( gl::GL_TRUE, gl::GL_TRUE, gl::GL_TRUE, gl::GL_TRUE );
+
+    float clearBlack[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
+    float clearDepth    = 1.0f;
+    gl::glClearBufferfv( gl::GL_COLOR, 0, clearBlack );
+    gl::glClearBufferfv( gl::GL_DEPTH, 0, &clearDepth );
+
+    gl::glDisable( gl::GL_BLEND );
+
+    if ( lights.size() > 0 )
+    {
+        for ( const auto& l : lights )
+        {
+            l->getRenderParameters( inPassParams );
+
+            for ( const auto& ro : renderObjects )
+            { ro->render( inPassParams, cameras[0], m_idx ); }
+        }
+    }
+
+    m_framebuffer->detach( gl::GL_DEPTH_ATTACHMENT );
+    m_framebuffer->detach( gl::GL_COLOR_ATTACHMENT0 );
+    m_framebuffer->unbind();
+}
+
+void SimpleNode::destroy() {
+    delete m_framebuffer;
+    delete m_colorTexture;
+    delete m_depthTexture;
+}
+
+void SimpleNode::resize( uint32_t width, uint32_t height ) {
+    m_colorTexture->resize( width, height );
+    m_depthTexture->resize( width, height );
+}
+
+void SimpleNode::buildRenderTechnique( const Ra::Engine::Rendering::RenderObject* ro,
+                                       Ra::Engine::Rendering::RenderTechnique& rt ) const {
+    auto mat = const_cast<Ra::Engine::Rendering::RenderObject*>( ro )->getMaterial();
+    // Volumes are not used in EnvLightPass
+    if ( mat->getMaterialAspect() == Ra::Engine::Data::Material::MaterialAspect::MAT_DENSITY )
+    { return; }
+
+    if ( auto cfg = Ra::Engine::Data::ShaderConfigurationFactory::getConfiguration(
+             { "LocalLightPass::" + mat->getMaterialName() } ) )
+    { rt.setConfiguration( *cfg, m_idx ); }
+    else
+    {
+        std::string resourcesRootDir = m_resourceDir;
+        // Build the shader configuration
+        Ra::Engine::Data::ShaderConfiguration theConfig{
+            { "LocalLightPass::" + mat->getMaterialName() },
+            resourcesRootDir + "Shaders/LocalLightPass/lightpass.vert.glsl",
+            resourcesRootDir + "Shaders/LocalLightPass/lightpass.frag.glsl" };
+        // add the material interface to the fragment shader
+        theConfig.addInclude( "\"" + mat->getMaterialName() + ".glsl\"",
+                              Ra::Engine::Data::ShaderType::ShaderType_FRAGMENT );
+        // Add to the ShaderConfigManager
+        Ra::Engine::Data::ShaderConfigurationFactory::addConfiguration( theConfig );
+        // Add to the RenderTechnique
+        rt.setConfiguration( theConfig, m_idx );
+    }
+    rt.setParametersProvider( mat, m_idx );
+}
diff --git a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/SimpleNode.hpp b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/SimpleNode.hpp
new file mode 100644
index 0000000..7c34b73
--- /dev/null
+++ b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/SimpleNode.hpp
@@ -0,0 +1,37 @@
+#pragma once
+#include <RadiumNBR/NodeGraph/Node.hpp>
+
+#include <globjects/Framebuffer.h>
+
+class NodeBasedRenderer_LIBRARY_API SimpleNode : public Node
+{
+  public:
+    explicit SimpleNode( const std::string& name );
+
+    void init() override;
+
+    void update() override;
+
+    void execute() override;
+
+    void destroy() override;
+
+    void resize( uint32_t width, uint32_t height ) override;
+
+    void buildRenderTechnique( const Ra::Engine::Rendering::RenderObject* ro,
+                               Ra::Engine::Rendering::RenderTechnique& rt ) const override;
+
+    static const std::string getTypename() { return "Simple Render Pass"; }
+
+  protected:
+    void toJsonInternal( nlohmann::json& data ) const override {}
+    void fromJsonInternal( const nlohmann::json& data ) override {}
+
+  private:
+    Ra::Engine::Data::Texture* m_colorTexture{ nullptr };
+    Ra::Engine::Data::Texture* m_depthTexture{ nullptr };
+
+    Ra::Engine::Data::Texture* m_blankAO{ nullptr };
+
+    globjects::Framebuffer* m_framebuffer{ nullptr };
+};
diff --git a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/TransparencyNode.hpp b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/TransparencyNode.hpp
index c7d1d3f..5035ce4 100644
--- a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/TransparencyNode.hpp
+++ b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/TransparencyNode.hpp
@@ -17,6 +17,10 @@ class NodeBasedRenderer_LIBRARY_API TransparencyNode : public Node
 
     static const std::string getTypename() { return "Transparency Pass"; }
 
+  protected:
+    void toJsonInternal( nlohmann::json& data ) const override {}
+    void fromJsonInternal( const nlohmann::json& data ) override {}
+
   private:
     /// The pointer to the color texture used by a previous pass (blending)
     /// It is used to compose this pass' final image
diff --git a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/UINode.hpp b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/UINode.hpp
index 32dfbd9..a910e84 100644
--- a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/UINode.hpp
+++ b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/UINode.hpp
@@ -3,6 +3,7 @@
 
 #include <globjects/Framebuffer.h>
 
+// TODO : make this accept only UI/Debug Objects
 class NodeBasedRenderer_LIBRARY_API UINode : public Node
 {
   public:
@@ -15,6 +16,10 @@ class NodeBasedRenderer_LIBRARY_API UINode : public Node
 
     static const std::string getTypename() { return "User Interface Pass"; }
 
+  protected:
+    void toJsonInternal( nlohmann::json& data ) const override {}
+    void fromJsonInternal( const nlohmann::json& data ) override {}
+
   private:
     Ra::Engine::Data::Texture* m_colorTexture{ nullptr };
     globjects::Framebuffer* m_framebuffer{ nullptr };
diff --git a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/VolumeNode.hpp b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/VolumeNode.hpp
index 9870080..d31f91e 100644
--- a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/VolumeNode.hpp
+++ b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/VolumeNode.hpp
@@ -18,6 +18,10 @@ class NodeBasedRenderer_LIBRARY_API VolumeNode : public Node
 
     static const std::string getTypename() { return "Volume Pass"; }
 
+  protected:
+    void toJsonInternal( nlohmann::json& data ) const override {}
+    void fromJsonInternal( const nlohmann::json& data ) override {}
+
   private:
     /// The pointer to the color texture used by a previous pass (blending)
     /// It is used to compose this pass' final image
diff --git a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/VolumeVizualisationNode.cpp b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/VolumeVizualisationNode.cpp
index 21a98f3..51875da 100644
--- a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/VolumeVizualisationNode.cpp
+++ b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/VolumeVizualisationNode.cpp
@@ -255,3 +255,12 @@ void VolumeVizualisationNode::buildRenderTechnique(
     }
     rt.setParametersProvider( paramProvider, m_idx );
 }
+
+// TODO : implement these
+void VolumeVizualisationNode::toJsonInternal( nlohmann::json& data ) const {
+
+}
+
+void VolumeVizualisationNode::fromJsonInternal( const nlohmann::json& data ) {
+
+}
diff --git a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/VolumeVizualisationNode.hpp b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/VolumeVizualisationNode.hpp
index c07526f..b46bf86 100644
--- a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/VolumeVizualisationNode.hpp
+++ b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/VolumeVizualisationNode.hpp
@@ -70,6 +70,10 @@ class NodeBasedRenderer_LIBRARY_API VolumeVizualisationNode : public Node
 
     static const std::string getTypename() { return "Volume Vizualisation Pass"; }
 
+  protected:
+    void toJsonInternal( nlohmann::json& data ) const override;
+    void fromJsonInternal( const nlohmann::json& data ) override;
+
   private:
     /// The pointer to the color texture used by a previous pass (blending)
     /// It is used to compose this pass' final image
diff --git a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/WireframeNode.cpp b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/WireframeNode.cpp
index 20e6242..5342e1c 100644
--- a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/WireframeNode.cpp
+++ b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/WireframeNode.cpp
@@ -108,7 +108,7 @@ WireframeNode::WireframeNode( const std::string& name ) : Node( name, getTypenam
     auto portOutColorTex = new PortOut<NodeTypeTexture>( "outColorTexture", this );
     addOutput( portOutColorTex, m_colorTexture );
 
-    auto editableActivate = new EditableParameter( "activate", m_editableActivate );
+    auto editableActivate = new EditableParameter( "activated", m_editableActivate );
     addEditableParameter( editableActivate );
 }
 
@@ -281,3 +281,13 @@ void WireframeNode::buildRenderTechnique( const Ra::Engine::Rendering::RenderObj
     }
     rt.setParametersProvider( mat, m_idx );
 }
+
+void WireframeNode::toJsonInternal( nlohmann::json& data ) const {
+    data["activated"] = m_editableActivate;
+}
+
+void WireframeNode::fromJsonInternal( const nlohmann::json& data ) {
+    if ( data.contains( "activated" ) ) { m_editableActivate = data["activated"]; }
+    else
+    { m_editableActivate = false; }
+}
diff --git a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/WireframeNode.hpp b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/WireframeNode.hpp
index e5d9b4c..3b12146 100644
--- a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/WireframeNode.hpp
+++ b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/WireframeNode.hpp
@@ -20,6 +20,10 @@ class NodeBasedRenderer_LIBRARY_API WireframeNode : public Node
 
     static const std::string getTypename() { return "Wireframe Pass"; }
 
+  protected:
+    void toJsonInternal( nlohmann::json& data ) const override;
+    void fromJsonInternal( const nlohmann::json& data ) override;
+
   private:
     Ra::Engine::Data::Texture* m_colorTexture{ nullptr };
 
diff --git a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/ZGeomPrepassNode.hpp b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/ZGeomPrepassNode.hpp
index 5058ef9..2775377 100644
--- a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/ZGeomPrepassNode.hpp
+++ b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/RenderPasses/ZGeomPrepassNode.hpp
@@ -17,6 +17,10 @@ class NodeBasedRenderer_LIBRARY_API ZGeomPrepassNode : public Node
 
     static const std::string getTypename() { return "Z Geometry Prepass"; }
 
+  protected:
+    void toJsonInternal( nlohmann::json& data ) const override {}
+    void fromJsonInternal( const nlohmann::json& data ) override {}
+
   private:
     Ra::Engine::Data::Texture* m_depthTexture{ nullptr };
     Ra::Engine::Data::Texture* m_posInWorldTexture{ nullptr };
diff --git a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/Sinks/DisplaySinkNode.cpp b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/Sinks/DisplaySinkNode.cpp
index 95d8fee..6c7d03f 100644
--- a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/Sinks/DisplaySinkNode.cpp
+++ b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/Sinks/DisplaySinkNode.cpp
@@ -6,6 +6,7 @@ DisplaySinkNode::DisplaySinkNode( const std::string& name ) : Node( name, getTyp
     for ( size_t i = 0; i < MAX_DISPLAY_INPUTS; i++ )
     {
         auto portIn = new PortIn<NodeTypeTexture>( "inTexture" + std::to_string( i ), this );
+        portIn->attachMember(this, &DisplaySinkNode::observeConnection);
         addInput( portIn );
     }
 }
@@ -22,15 +23,19 @@ void DisplaySinkNode::update() {
 #endif
 }
 void DisplaySinkNode::execute() {
-    m_textures.clear();
-    for ( size_t i = 0; i < MAX_DISPLAY_INPUTS; i++ )
-    {
-        if ( m_inputs[i]->isLinked() )
+    if( m_firstRun) {
+        m_firstRun = false;
+        m_textures.clear();
+        for ( size_t i = 0; i < MAX_DISPLAY_INPUTS; i++ )
         {
-            auto input               = dynamic_cast<PortIn<NodeTypeTexture>*>( m_inputs[i].get() );
-            NodeTypeTexture* texture = &input->getData();
-            if ( texture ) { m_textures.push_back( texture ); }
+            if ( m_inputs[i]->isLinked() )
+            {
+                auto input               = dynamic_cast<PortIn<NodeTypeTexture>*>( m_inputs[i].get() );
+                NodeTypeTexture* texture = &input->getData();
+                if ( texture ) { m_textures.push_back( texture ); }
+            }
         }
+        this->notify(m_textures);
     }
 #ifdef GRAPH_CALL_TRACE
     std::cout << "\e[31m\e[1mDisplaySinkNode\e[0m \"" << m_name << "\": execute." << std::endl;
@@ -52,3 +57,26 @@ void DisplaySinkNode::resize( uint32_t width, uint32_t height ) {
 const std::vector<NodeTypeTexture*>& DisplaySinkNode::getTextures() {
     return m_textures;
 }
+
+void DisplaySinkNode::observeConnection(const std::string& name, const PortIn<NodeTypeTexture>& port, bool connected) {
+    // manage textures
+    // Right now, naive management of textures (erase and fill again).
+    // TODO : only update the texture sets
+    m_textures.clear();
+    for ( size_t i = 0; i < MAX_DISPLAY_INPUTS; i++ )
+    {
+        if (!connected && m_inputs[i]->getName() == name) {
+            // this port is disconnected
+            continue;
+        }
+        if ( m_inputs[i]->isLinked() )
+        {
+            auto input               = dynamic_cast<PortIn<NodeTypeTexture>*>( m_inputs[i].get() );
+            NodeTypeTexture* texture = &input->getData();
+            if ( texture ) { m_textures.push_back( texture ); }
+        }
+    }
+    if  (!m_firstRun ) {
+        this->notify(m_textures);
+    }
+}
diff --git a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/Sinks/DisplaySinkNode.hpp b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/Sinks/DisplaySinkNode.hpp
index 4455023..e17da0d 100644
--- a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/Sinks/DisplaySinkNode.hpp
+++ b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/Sinks/DisplaySinkNode.hpp
@@ -1,7 +1,7 @@
 #pragma once
 #include <RadiumNBR/NodeGraph/Node.hpp>
 
-class NodeBasedRenderer_LIBRARY_API DisplaySinkNode : public Node
+class NodeBasedRenderer_LIBRARY_API DisplaySinkNode : public Node, public Ra::Core::Utils::Observable<const std::vector<NodeTypeTexture*>&>
 {
   public:
     explicit DisplaySinkNode( const std::string& name );
@@ -16,6 +16,15 @@ class NodeBasedRenderer_LIBRARY_API DisplaySinkNode : public Node
 
     const std::vector<NodeTypeTexture*>& getTextures();
 
+  protected:
+    void toJsonInternal( nlohmann::json& data ) const override {}
+    void fromJsonInternal( const nlohmann::json& data ) override {}
+
   private:
     std::vector<NodeTypeTexture*> m_textures;
+
+    // the observer method
+    void observeConnection(const std::string& name, const PortIn<NodeTypeTexture>& port, bool connected);
+
+    bool m_firstRun{true};
 };
diff --git a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/Sinks/SinkNode.hpp b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/Sinks/SinkNode.hpp
index f808844..a5f5eb1 100644
--- a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/Sinks/SinkNode.hpp
+++ b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/Sinks/SinkNode.hpp
@@ -42,4 +42,9 @@ class NodeBasedRenderer_LIBRARY_API SinkNode : public Node
     }
 
     static const std::string getTypename() { return "Sink " + std::string( type_name<T>() ); }
+
+  protected:
+    void toJsonInternal( nlohmann::json& data ) const override {}
+    void fromJsonInternal( const nlohmann::json& data ) override {}
+
 };
diff --git a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/Sources/DataNode.hpp b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/Sources/DataNode.hpp
index 3af6c50..3c0e980 100644
--- a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/Sources/DataNode.hpp
+++ b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/Sources/DataNode.hpp
@@ -51,6 +51,10 @@ class DataNode : public Node
 
     void setElements( const std::vector<T>& elements ) { m_elements = elements; }
 
+  protected:
+    void toJsonInternal( nlohmann::json& data ) const override {}
+    void fromJsonInternal( const nlohmann::json& data ) override {}
+
   private:
     std::vector<T> m_elements;
 };
diff --git a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/Sources/SourceNode.cpp b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/Sources/SourceNode.cpp
new file mode 100644
index 0000000..2f46911
--- /dev/null
+++ b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/Sources/SourceNode.cpp
@@ -0,0 +1,89 @@
+#include <RadiumNBR/NodeGraph/PremadeNodes/Sources/SourceNode.hpp>
+
+#include <Core/Utils/Log.hpp>
+using namespace Ra::Core::Utils;
+
+/** This file contains specialisation of the sourceNode template for premade sourceNodes
+ *
+ */
+
+/** Source env map */
+
+void EnvMapTextureSource::toJsonInternal( nlohmann::json& data ) const {
+    data["files"]    = getData()->getImageName().c_str();
+    data["type"]     = int( getData()->getImageType() );
+    data["strength"] = getData()->getEnvStrength() * 100.;
+}
+
+void EnvMapTextureSource::fromJsonInternal( const nlohmann::json& data ) {
+    std::string files = data["files"];
+    int t             = data["type"];
+    float strength    = data["strength"];
+    float s           = strength / 100.;
+    RadiumNBR::EnvMap::EnvMapType envType;
+    switch ( t )
+    {
+    case 0:
+        envType = RadiumNBR::EnvMap::EnvMapType::ENVMAP_PFM;
+        break;
+    case 1:
+        envType = RadiumNBR::EnvMap::EnvMapType::ENVMAP_CUBE;
+        break;
+    case 2:
+        envType = RadiumNBR::EnvMap::EnvMapType::ENVMAP_LATLON;
+        break;
+    default:
+        LOG( logERROR ) << "SourceNode<std::shared_ptr<RadiumNBR::EnvMap>>::fromJsonInternal : "
+                           "unsupported envmap type "
+                        << t;
+        return;
+    }
+    // check if the file exists
+    bool envmap_exist;
+    if ( envType == RadiumNBR::EnvMap::EnvMapType::ENVMAP_CUBE )
+    {
+        std::string f1 = files.substr( 0, files.find( ';' ) - 1 );
+        envmap_exist   = std::filesystem::exists( f1 );
+    }
+    else
+    { envmap_exist = std::filesystem::exists( files ); }
+    if ( envmap_exist )
+    {
+        auto envmp = std::make_shared<RadiumNBR::EnvMap>( files, envType, true );
+        envmp->setEnvStrength( s );
+        setData( envmp );
+    }
+    else
+    { setData( nullptr ); }
+}
+
+
+/** Source bool */
+void BooleanValueSource::toJsonInternal( nlohmann::json& data ) const {
+    data["boolean"] = getData();
+}
+
+void BooleanValueSource::fromJsonInternal( const nlohmann::json& data ) {
+    setData( data["boolean"] );
+}
+
+/** Source Scalar */
+void ScalarValueSource::toJsonInternal( nlohmann::json& data ) const {
+    data["number"] = getData();
+}
+
+void ScalarValueSource::fromJsonInternal( const nlohmann::json& data ) {
+    setData( data["number"] );
+}
+
+/** Source Color */
+void ColorSourceNode::toJsonInternal( nlohmann::json& data ) const {
+    NodeTypeColor c = NodeTypeColor::linearRGBTosRGB( getData() );
+    std::array<Scalar, 3> color{ c.x(), c.y(), c.z() };
+    data["color"] = color;
+}
+
+void ColorSourceNode::fromJsonInternal( const nlohmann::json& data ) {
+    std::array<Scalar, 3> c = data["color"];
+    setData( NodeTypeColor::sRGBToLinearRGB( NodeTypeColor( c[0], c[1], c[2] ) ) );
+}
diff --git a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/Sources/SourceNode.hpp b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/Sources/SourceNode.hpp
index 95aa24f..9bc841b 100644
--- a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/Sources/SourceNode.hpp
+++ b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/Sources/SourceNode.hpp
@@ -7,17 +7,20 @@
 template <typename T>
 class SourceNode : public Node
 {
-  public:
-    SourceNode( const std::string& name ) : Node( name, getTypename() ) {
+  protected:
+    SourceNode( const std::string& instanceName, const std::string& typeName ) :
+        Node( instanceName, typeName ) {
         auto portOut = new PortOut<T>( "to", this );
         addOutput( portOut, &m_data );
 
-        auto editableData = new EditableParameter( "data", m_data );
-        addEditableParameter( editableData );
+
     }
 
   public:
-    SourceNode() : SourceNode( getTypename ) {}
+    explicit SourceNode( const std::string& name ) : SourceNode( name, getTypename() ) {
+        auto editableData = new EditableParameter( "Data", m_data );
+        addEditableParameter( editableData );
+    }
     void init() override {
 #ifdef GRAPH_CALL_TRACE
         std::cout << "\e[34m\e[1mSourceNode\e[0m \"" << m_name << "\": initialization."
@@ -52,7 +55,7 @@ class SourceNode : public Node
 
     void setData( T data ) { m_data = data; }
 
-    T getData() { return m_data; }
+    T getData() const { return m_data; }
 
     static const std::string getTypename() {
         std::string templatedTypeName = std::string( type_name<T>() );
@@ -65,6 +68,63 @@ class SourceNode : public Node
         return "Source " + templatedTypeName;
     }
 
-  private:
+  protected:
+    void toJsonInternal( nlohmann::json& data ) const override {}
+    void fromJsonInternal( const nlohmann::json& data ) override {}
     T m_data{};
 };
+
+/** In order to specialized inherited methods, one must derive the SourceNode template class*/
+
+#include <RadiumNBR/EnvMap.hpp>
+class EnvMapTextureSource : public SourceNode<std::shared_ptr<RadiumNBR::EnvMap>>
+{
+  public:
+    explicit EnvMapTextureSource( const std::string& name ) : SourceNode( name, getTypename() ) {
+        auto editableData = new EditableParameter( "Envmap", m_data );
+        addEditableParameter( editableData );
+    }
+
+  protected:
+    void toJsonInternal( nlohmann::json& data ) const override;
+    void fromJsonInternal( const nlohmann::json& data ) override;
+};
+
+class BooleanValueSource : public SourceNode<bool>
+{
+  public:
+    explicit BooleanValueSource( const std::string& name ) : SourceNode( name, getTypename() ) {
+        auto editableData = new EditableParameter( "boolean", m_data );
+        addEditableParameter( editableData );
+    }
+
+  protected:
+    void toJsonInternal( nlohmann::json& data ) const override;
+    void fromJsonInternal( const nlohmann::json& data ) override;
+};
+
+class ScalarValueSource : public SourceNode<Scalar>
+{
+  public:
+    explicit ScalarValueSource( const std::string& name ) : SourceNode( name, getTypename() ) {
+        auto editableData = new EditableParameter( "number", m_data );
+        addEditableParameter( editableData );
+    }
+
+  protected:
+    void toJsonInternal( nlohmann::json& data ) const override;
+    void fromJsonInternal( const nlohmann::json& data ) override;
+};
+
+class ColorSourceNode : public SourceNode<NodeTypeColor>
+{
+  public:
+    explicit ColorSourceNode( const std::string& name ) : SourceNode( name, getTypename() ) {
+        auto editableData = new EditableParameter( "color", m_data );
+        addEditableParameter( editableData );
+    }
+
+  protected:
+    void toJsonInternal( nlohmann::json& data ) const override;
+    void fromJsonInternal( const nlohmann::json& data ) override;
+};
diff --git a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/Sources/TextureNode.hpp b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/Sources/TextureNode.hpp
index 0d3faa1..cc3d6d3 100644
--- a/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/Sources/TextureNode.hpp
+++ b/src/libRender/RadiumNBR/NodeGraph/PremadeNodes/Sources/TextureNode.hpp
@@ -19,6 +19,10 @@ class NodeBasedRenderer_LIBRARY_API TextureNode : public Node
                  const std::string& typeName,
                  const Ra::Engine::Data::TextureParameters& texParams );
 
+    void toJsonInternal( nlohmann::json& data ) const override {}
+    void fromJsonInternal( const nlohmann::json& data ) override {}
+
   private:
+    // TODO : editable parameter for TextureParameters
     Ra::Engine::Data::Texture* m_texture{ nullptr };
 };
diff --git a/src/libRender/RadiumNBR/NodeGraph/RenderGraph.cpp b/src/libRender/RadiumNBR/NodeGraph/RenderGraph.cpp
index e581b06..a20338d 100644
--- a/src/libRender/RadiumNBR/NodeGraph/RenderGraph.cpp
+++ b/src/libRender/RadiumNBR/NodeGraph/RenderGraph.cpp
@@ -101,8 +101,8 @@ void RenderGraph::resize( uint32_t width, uint32_t height ) {
 
 void RenderGraph::loadFromJson( const std::string& jsonFilePath ) {
 
-    std::cout << "\e[32m\e[1mRenderGraph\e[0m \"" << m_instanceName << "\": loadFromJson: " << jsonFilePath
-              << std::endl;
+    std::cout << "\e[32m\e[1mRenderGraph\e[0m \"" << m_instanceName
+              << "\": loadFromJson: " << jsonFilePath << std::endl;
     std::ifstream file( jsonFilePath );
     nlohmann::json j;
     file >> j;
@@ -124,8 +124,6 @@ void RenderGraph::loadFromJson( const std::string& jsonFilePath ) {
         { nodeById.emplace( id, getDisplayNode() ); }
         else
         {
-            std::cerr << "Loading a node = " << name << " --- " << std::endl;
-
             auto newNode = NodeFactory::createNode( name, n );
             nodeById.emplace( id, newNode );
             addNode( newNode );
@@ -261,8 +259,10 @@ bool RenderGraph::addLink( Node* nodeFrom,
     // Check node "from" existence in the graph
     if ( findNode( nodeFrom->getName() ) == -1 )
     {
+#ifdef GRAPH_CALL_TRACE
         std::cerr << "ADD LINK : node \"from\" \"" + nodeFrom->getName() + "\" does not exist."
                   << std::endl;
+#endif
         return false;
     }
 
@@ -582,6 +582,8 @@ void RenderGraph::clearNodes() {
     m_nodes.clear();
     m_nodes.shrink_to_fit();
 
+    // Why reallocating these ???
+    // TODO Check the need of reallocating nodes and modify the observers mathod on these.
     auto renderObjects = new DataNode<NodeTypeRenderObject>( "renderObjects" );
     addNode( renderObjects );
     auto lights = new DataNode<NodeTypeLight>( "lights" );
diff --git a/src/libRender/Resources/RadiumNBR/RenderGraphs/fullfeaturerenderer.flow b/src/libRender/Resources/RadiumNBR/RenderGraphs/fullfeaturerenderer.flow
index 78366f6..622cc62 100644
--- a/src/libRender/Resources/RadiumNBR/RenderGraphs/fullfeaturerenderer.flow
+++ b/src/libRender/Resources/RadiumNBR/RenderGraphs/fullfeaturerenderer.flow
@@ -223,8 +223,8 @@
             "model": {
                 "files": "/Users/mathias/Professionnel/Data/skyboxes/Spherical/spiaggia_di_mondello.jpg",
                 "name": "Source std::shared_ptr<RadiumNBR::EnvMap>",
-                "strength": "100",
-                "type": "2"
+                "strength": 100.0,
+                "type": 2
             },
             "position": {
                 "x": 555.6,
-- 
GitLab