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