diff --git a/src/libRender/CMakeLists.txt b/src/libRender/CMakeLists.txt index 0eb4180b0078d41a6f4c177364766fde95151d21..6130d3769d71586c3067442c57199275bd92c114 100644 --- a/src/libRender/CMakeLists.txt +++ b/src/libRender/CMakeLists.txt @@ -318,7 +318,7 @@ set(gui_public_headers ) set(gui_headers - + RadiumNBR/Gui/RenderGraphEditor/NodeAdapterTemplateInstanciations.hpp ) set(gui_inlines diff --git a/src/libRender/RadiumNBR/Gui/RenderGraphEditor/NodeAdapterModel.cpp b/src/libRender/RadiumNBR/Gui/RenderGraphEditor/NodeAdapterModel.cpp index 588f50e3b6374363d54cafb400b22dbe1b140157..52c5bd360e1ec65bfe8b083813088d31da472a64 100644 --- a/src/libRender/RadiumNBR/Gui/RenderGraphEditor/NodeAdapterModel.cpp +++ b/src/libRender/RadiumNBR/Gui/RenderGraphEditor/NodeAdapterModel.cpp @@ -2,16 +2,14 @@ #include <RadiumNBR/Gui/RenderGraphEditor/WidgetFactory.hpp> +#include <RadiumNBR/Gui/PowerSlider.hpp> +#include <RadiumNBR/Gui/RendererPanel.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 { @@ -172,44 +170,3 @@ void NlohmannObjectToQJsonObject(const nlohmann::json& data, QJsonObject& p) { } } // 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 c0067d379835c2f7e2fc72e620f69a0b35c6d584..2cf10da0ee14cc4a2b0a228b84226ae51418bea6 100644 --- a/src/libRender/RadiumNBR/Gui/RenderGraphEditor/NodeAdapterModel.hpp +++ b/src/libRender/RadiumNBR/Gui/RenderGraphEditor/NodeAdapterModel.hpp @@ -1,12 +1,12 @@ #pragma once #include <RadiumNBR/NodeBasedRendererMacro.hpp> -#include <nodes/NodeDataModel> - #include <RadiumNBR/Gui/RenderGraphEditor/ConnectionStatusData.hpp> #include <RadiumNBR/NodeGraph/RenderGraph.hpp> +#include <nodes/NodeDataModel> + #include <iostream> namespace NodeDataModelTools { diff --git a/src/libRender/RadiumNBR/Gui/RenderGraphEditor/NodeAdapterTemplateInstanciations.hpp b/src/libRender/RadiumNBR/Gui/RenderGraphEditor/NodeAdapterTemplateInstanciations.hpp new file mode 100644 index 0000000000000000000000000000000000000000..745f17918dcc8eb348717424f7eb6761ae403781 --- /dev/null +++ b/src/libRender/RadiumNBR/Gui/RenderGraphEditor/NodeAdapterTemplateInstanciations.hpp @@ -0,0 +1,50 @@ +#pragma once + + +#include <RadiumNBR/Gui/RenderGraphEditor/NodeAdapterModel.hpp> + +/** Node adapter specialized 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<DataNode<NodeTypeRenderObject>>::destroy() {} + +template <> +void NodeAdapterModel<DataNode<NodeTypeLight>>::destroy() {} + +template <> +void NodeAdapterModel<DataNode<NodeTypeCamera>>::destroy() {} + +#if 1 +// TODO : understand why ????? +// gcc does not find this is a template partial specialization for DisplaySinkNode :( +// code moved to RenderGraphEditorView.cpp +template <> +void NodeAdapterModel<DisplaySinkNode>::init() { + m_node = m_renderGraph->getDisplayNode(); + m_inputsConnected.resize( m_node->getInputs().size() ); + checkConnections(); +} + +template <> +void NodeAdapterModel<DisplaySinkNode>::destroy() {} +#endif diff --git a/src/libRender/RadiumNBR/Gui/RenderGraphEditor/RenderGraphEditorView.cpp b/src/libRender/RadiumNBR/Gui/RenderGraphEditor/RenderGraphEditorView.cpp index 8f275c9dc64b3e2a3cae2d435191326c2bb29a64..d691df57a39be3dd367b083a4c0e7d7ee1953a9c 100644 --- a/src/libRender/RadiumNBR/Gui/RenderGraphEditor/RenderGraphEditorView.cpp +++ b/src/libRender/RadiumNBR/Gui/RenderGraphEditor/RenderGraphEditorView.cpp @@ -7,6 +7,7 @@ #include <nodes/NodeData> #include <RadiumNBR/NodeBasedRenderer.hpp> +#include <RadiumNBR/NodeGraph/RenderGraph.hpp> #include <RadiumNBR/Gui/RenderGraphEditor/NodeAdapterModel.hpp> #include <RadiumNBR/Gui/RenderGraphEditor/SourceColorTextureModel.hpp> @@ -15,6 +16,8 @@ #include <RadiumNBR/NodeGraph/PremadeNodes/PremadeNodesIncludes.hpp> +#include <RadiumNBR/Gui/RenderGraphEditor/NodeAdapterTemplateInstanciations.hpp> + RenderGraphEditorView::RenderGraphEditorView( QWidget* parent ) : QWidget( parent, Qt::Window ) { QtNodes::ConnectionStyle::setConnectionStyle( R"( @@ -70,6 +73,67 @@ RenderGraphEditorView::RenderGraphEditorView( QWidget* parent ) : QWidget( paren connectAll(); } +void RenderGraphEditorView::disconnectAll() { + for ( size_t i = 0; i < connections.size(); i++ ) + { QObject::disconnect( connections[i] ); } + connections.clear(); +} + +void RenderGraphEditorView::connectAll() { + + /* + // This connection is not needed + //connections.push_back(QObject::connect(scene, &QtNodes::FlowScene::nodeHoverLeft, + this, &RenderGraphEditorView::needUpdate)); + + connections.push_back(QObject::connect(scene, &QtNodes::FlowScene::nodeDeleted, this, + &RenderGraphEditorView::needUpdate)); connections.push_back(QObject::connect(scene, + &QtNodes::FlowScene::connectionCreated, this, &RenderGraphEditorView::needUpdate)); + connections.push_back(QObject::connect(scene, &QtNodes::FlowScene::connectionDeleted, + this, &RenderGraphEditorView::needUpdate)); + */ + connections.push_back( + QObject::connect( scene, &QtNodes::FlowScene::nodeHoverLeft, [this]() { + std::cout << "QtNodes::FlowScene::nodeHoverLeft\n"; + emit needUpdate(); + } ) ); + + connections.push_back( QObject::connect( scene, &QtNodes::FlowScene::nodeDeleted, [this]() { + std::cout << "QtNodes::FlowScene::nodeDeleted\n"; + emit needUpdate(); + } ) ); + connections.push_back( + QObject::connect( scene, &QtNodes::FlowScene::connectionCreated, [this]() { + std::cout << "QtNodes::FlowScene::connectionCreated\n"; + emit needUpdate(); + } ) ); + connections.push_back( + QObject::connect( scene, &QtNodes::FlowScene::connectionDeleted, [this]() { + std::cout << "QtNodes::FlowScene::connectionDeleted\n"; + emit needUpdate(); + } ) ); +} + +void RenderGraphEditorView::setGraph( RenderGraph* rg) { + currentGraph = rg; + auto editorRegistry = NodeGraphQtEditor::initializeNodeRegistry( currentGraph ); + scene->setRegistry( editorRegistry ); +} + +#if 0 +// TODO : understand why this is problematic with gcc (and not with clang) +// Moved here from NodeAdapterModel.cpp +template <> +void NodeAdapterModel<DisplaySinkNode>::init() { + m_node = m_renderGraph->getDisplayNode(); + m_inputsConnected.resize( m_node->getInputs().size() ); + checkConnections(); +} + +template <> +void NodeAdapterModel<DisplaySinkNode>::destroy() {} +#endif + namespace NodeGraphQtEditor { template <typename T> @@ -78,7 +142,9 @@ class NodeCreator public: explicit NodeCreator( RenderGraph* renderGraph ) : m_renderGraph( renderGraph ) {} - std::unique_ptr<T> operator()() { return std::make_unique<T>( m_renderGraph ); } + std::unique_ptr<T> operator()() { + return std::make_unique<T>( m_renderGraph ); + } private: RenderGraph* m_renderGraph; @@ -94,6 +160,9 @@ std::shared_ptr<DataModelRegistry> initializeNodeRegistry( RenderGraph* renderGr ret->registerModel<NodeAdapterModel<DataNode<NodeTypeCamera>>>( NodeCreator<NodeAdapterModel<DataNode<NodeTypeCamera>>>( renderGraph ), "Data" ); + ret->registerModel<NodeAdapterModel<DisplaySinkNode>>( + NodeCreator<NodeAdapterModel<DisplaySinkNode>>( renderGraph ), "Sinks" ); + ret->registerModel<NodeAdapterModel<FilterROByTypeNode>>( NodeCreator<NodeAdapterModel<FilterROByTypeNode>>( renderGraph ), "Filters" ); ret->registerModel<NodeAdapterModel<FilterROByNameNode>>( @@ -145,10 +214,6 @@ std::shared_ptr<DataModelRegistry> initializeNodeRegistry( RenderGraph* renderGr ret->registerModel<NodeAdapterModel<DepthTextureNode>>( NodeCreator<NodeAdapterModel<DepthTextureNode>>( renderGraph ), "Sources" ); - - ret->registerModel<NodeAdapterModel<DisplaySinkNode>>( - NodeCreator<NodeAdapterModel<DisplaySinkNode>>( renderGraph ), "Sinks" ); - ret->registerModel<NodeAdapterModel<DifferenceNode>>( NodeCreator<NodeAdapterModel<DifferenceNode>>( renderGraph ), "Compositing" ); ret->registerModel<NodeAdapterModel<SumNode>>( diff --git a/src/libRender/RadiumNBR/Gui/RenderGraphEditor/RenderGraphEditorView.hpp b/src/libRender/RadiumNBR/Gui/RenderGraphEditor/RenderGraphEditorView.hpp index 72473c09e9018e0bf77272b5223f5a36b6683b17..4f859017d370dc701db011328e10fb38c73ff38a 100644 --- a/src/libRender/RadiumNBR/Gui/RenderGraphEditor/RenderGraphEditorView.hpp +++ b/src/libRender/RadiumNBR/Gui/RenderGraphEditor/RenderGraphEditorView.hpp @@ -10,8 +10,8 @@ namespace RadiumNBR { class NodeBasedRenderer; - } + // TODO, why is this class outside of any namespace ? class RenderGraph; @@ -25,46 +25,10 @@ class NodeBasedRenderer_LIBRARY_API RenderGraphEditorView : public QWidget public: explicit RenderGraphEditorView( QWidget* parent ); - void disconnectAll() { - for ( size_t i = 0; i < connections.size(); i++ ) - { QObject::disconnect( connections[i] ); } - connections.clear(); - } - - void connectAll() { - - /* - // This connection is not needed - //connections.push_back(QObject::connect(scene, &QtNodes::FlowScene::nodeHoverLeft, - this, &RenderGraphEditorView::needUpdate)); - - connections.push_back(QObject::connect(scene, &QtNodes::FlowScene::nodeDeleted, this, - &RenderGraphEditorView::needUpdate)); connections.push_back(QObject::connect(scene, - &QtNodes::FlowScene::connectionCreated, this, &RenderGraphEditorView::needUpdate)); - connections.push_back(QObject::connect(scene, &QtNodes::FlowScene::connectionDeleted, - this, &RenderGraphEditorView::needUpdate)); - */ - connections.push_back( - QObject::connect( scene, &QtNodes::FlowScene::nodeHoverLeft, [this]() { - std::cout << "QtNodes::FlowScene::nodeHoverLeft\n"; - emit needUpdate(); - } ) ); - - connections.push_back( QObject::connect( scene, &QtNodes::FlowScene::nodeDeleted, [this]() { - std::cout << "QtNodes::FlowScene::nodeDeleted\n"; - emit needUpdate(); - } ) ); - connections.push_back( - QObject::connect( scene, &QtNodes::FlowScene::connectionCreated, [this]() { - std::cout << "QtNodes::FlowScene::connectionCreated\n"; - emit needUpdate(); - } ) ); - connections.push_back( - QObject::connect( scene, &QtNodes::FlowScene::connectionDeleted, [this]() { - std::cout << "QtNodes::FlowScene::connectionDeleted\n"; - emit needUpdate(); - } ) ); - } + void disconnectAll(); + void connectAll(); + + void setGraph( RenderGraph* rg); public slots: bool eventFilter( QObject* object, QEvent* event ) { @@ -77,16 +41,20 @@ class NodeBasedRenderer_LIBRARY_API RenderGraphEditorView : public QWidget void needUpdate(); public: + QMenuBar* menuBar{ nullptr }; QAction* newAction{ nullptr }; QAction* openAction{ nullptr }; QAction* saveAction{ nullptr }; QAction* saveAsAction{ nullptr }; + + std::vector<QMetaObject::Connection> connections; + + // TODO, put all these as private data QtNodes::FlowScene* scene{ nullptr }; QtNodes::FlowView* view{ nullptr }; - RadiumNBR::NodeBasedRenderer* current{ nullptr }; - - std::vector<QMetaObject::Connection> connections; + private: + RenderGraph* currentGraph{ nullptr }; };