diff --git a/CMakeLists.txt b/CMakeLists.txt index ba25f38..5b43982 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -54,6 +54,7 @@ set(GUI_SOURCES # qt find_package(Qt6 REQUIRED COMPONENTS Core Widgets SvgWidgets OpenGLWidgets) qt_standard_project_setup() +ADD_DEFINITIONS(-DQT_NO_KEYWORDS) # glm find_package(glm REQUIRED) diff --git a/src/Engine/Network/NetworkManager.cpp b/src/Engine/Network/NetworkManager.cpp index 1768f22..738cb98 100644 --- a/src/Engine/Network/NetworkManager.cpp +++ b/src/Engine/Network/NetworkManager.cpp @@ -15,7 +15,19 @@ enzo::nt::OpId enzo::nt::NetworkManager::addOperator(op::OpInfo opInfo) { maxOpId_++; - gopStore_.emplace(maxOpId_, std::make_unique(maxOpId_, opInfo)); + std::unique_ptr newOp = std::make_unique(maxOpId_, opInfo); + newOp->nodeDirtied.connect( + [this](nt::OpId opId) + { + cookOp(opId); + + if(getDisplayOp()==opId) + { + enzo::nt::GeometryOperator& displayOp = getGeoOperator(opId); + updateDisplay(displayOp.getOutputGeo(0)); + } + }); + gopStore_.emplace(maxOpId_, std::move(newOp)); std::cout << "adding operator " << maxOpId_ << "\n"; return maxOpId_; @@ -51,27 +63,25 @@ bool enzo::nt::NetworkManager::isValidOp(nt::OpId opId) void enzo::nt::NetworkManager::setDisplayOp(OpId opId) { - std::cout << "gop size before: " << gopStore_.size() <<"\n"; displayOp_=opId; - std::vector dependencyGraph = getDependencyGraph(opId); - enzo::geo::Geometry prevGeometry; - std::cout << "size: " << dependencyGraph.size() << "\n"; + + cookOp(opId); - for(enzo::nt::OpId dependencyOpId : dependencyGraph) - { - cookOp(dependencyOpId); - } - std::cout << "gop size middle: " << gopStore_.size() <<"\n"; // <- size: 1 enzo::nt::GeometryOperator& displayOp = getGeoOperator(opId); updateDisplay(displayOp.getOutputGeo(0)); - std::cout << "gop size after: " << gopStore_.size() <<"\n"; + displayNodeChanged(); } void enzo::nt::NetworkManager::cookOp(enzo::nt::OpId opId) { - enzo::nt::GeometryOperator& op = getGeoOperator(opId); - enzo::op::Context context(opId, enzo::nt::nm()); - op.cookOp(context); + std::vector dependencyGraph = getDependencyGraph(opId); + + for(enzo::nt::OpId dependencyOpId : dependencyGraph) + { + enzo::nt::GeometryOperator& op = getGeoOperator(dependencyOpId); + enzo::op::Context context(dependencyOpId, enzo::nt::nm()); + op.cookOp(context); + } } std::vector enzo::nt::NetworkManager::getDependencyGraph(enzo::nt::OpId opId) diff --git a/src/Engine/Network/NetworkManager.h b/src/Engine/Network/NetworkManager.h index 5ea01b1..87a6043 100644 --- a/src/Engine/Network/NetworkManager.h +++ b/src/Engine/Network/NetworkManager.h @@ -24,6 +24,8 @@ public: GeometryOperator& getGeoOperator(nt::OpId opId); void setDisplayOp(OpId opId); + boost::signals2::signal displayNodeChanged; + #ifdef UNIT_TEST void _reset(); #endif @@ -42,7 +44,9 @@ private: enzo::nt::OpId maxOpId_=0; // operator selected for displaying in the viewport std::optional displayOp_=std::nullopt; -signals: + + +Q_SIGNALS: void updateDisplay(enzo::geo::Geometry& geometry); }; diff --git a/src/Engine/Operator/Context.cpp b/src/Engine/Operator/Context.cpp index 34eecaa..27d47bd 100644 --- a/src/Engine/Operator/Context.cpp +++ b/src/Engine/Operator/Context.cpp @@ -1,6 +1,8 @@ #include "Engine/Operator/Context.h" #include "Engine/Network/NetworkManager.h" +#include "Engine/Parameter/Parameter.h" #include +#include enzo::op::Context::Context(enzo::nt::OpId opId, enzo::nt::NetworkManager& networkManager) @@ -23,3 +25,13 @@ enzo::geo::Geometry enzo::op::Context::cloneInputGeo(unsigned int inputIndex) return networkManager_.getGeoOperator(inputConnection->getInputOpId()).getOutputGeo(inputConnection->getInputIndex()); } +enzo::bt::floatT enzo::op::Context::evalFloatParm(const char* parmName) const +{ + enzo::nt::GeometryOperator& selfOp = networkManager_.getGeoOperator(opId_); + std::weak_ptr parameter = selfOp.getParameter(parmName); + + if(auto sharedParm = parameter.lock()) + { + return sharedParm->evalFloat(); + } +} diff --git a/src/Engine/Operator/Context.h b/src/Engine/Operator/Context.h index c89c37f..96dd46c 100644 --- a/src/Engine/Operator/Context.h +++ b/src/Engine/Operator/Context.h @@ -15,6 +15,7 @@ class Context public: Context(enzo::nt::OpId opId, enzo::nt::NetworkManager& networkManager); enzo::geo::Geometry cloneInputGeo(unsigned int inputIndex); + bt::floatT evalFloatParm(const char* parmName) const; private: enzo::nt::OpId opId_; enzo::nt::NetworkManager& networkManager_; diff --git a/src/Engine/Operator/GeometryOpDef.h b/src/Engine/Operator/GeometryOpDef.h index 2a671df..9ffaee9 100644 --- a/src/Engine/Operator/GeometryOpDef.h +++ b/src/Engine/Operator/GeometryOpDef.h @@ -20,6 +20,7 @@ private: unsigned int minInputs_; unsigned int maxInputs_; unsigned int maxOutputs_; + protected: enzo::nt::OpId opId_; const enzo::geo::Geometry& getInputGeoView(unsigned int inputIndex); diff --git a/src/Engine/Operator/GeometryOperator.cpp b/src/Engine/Operator/GeometryOperator.cpp index bbc6234..f66ee81 100644 --- a/src/Engine/Operator/GeometryOperator.cpp +++ b/src/Engine/Operator/GeometryOperator.cpp @@ -41,16 +41,24 @@ void nt::GeometryOperator::initParameters() { std::cout << "name: " << t->getName() << "\n"; // create parameter - parameters_.push_back( - std::make_shared(*t) - ); + auto parameter = std::make_shared(*t); + parameter->valueChanged.connect(boost::bind(&GeometryOperator::dirtyNode, this)); + + parameters_.push_back(parameter); } } +void enzo::nt::GeometryOperator::dirtyNode() +{ + dirty_=true; + nodeDirtied(opId_); +} + void enzo::nt::GeometryOperator::cookOp(op::Context context) { opDef_->cookOp(context); + dirty_=false; } geo::Geometry& enzo::nt::GeometryOperator::getOutputGeo(unsigned outputIndex) @@ -74,6 +82,19 @@ void nt::GeometryOperator::addOutputConnection(std::shared_ptr nt::GeometryOperator::getParameter(std::string parameterName) +{ + for(auto parm : parameters_) + { + if(parm->getName()==parameterName) + { + return parm; + } + } + return std::weak_ptr(); + +} + std::vector> nt::GeometryOperator::getInputConnections() const { std::vector> inputConnections; diff --git a/src/Engine/Operator/GeometryOperator.h b/src/Engine/Operator/GeometryOperator.h index 43b4d83..827114f 100644 --- a/src/Engine/Operator/GeometryOperator.h +++ b/src/Engine/Operator/GeometryOperator.h @@ -27,11 +27,18 @@ public: std::vector> getInputConnections() const; std::vector> getOutputConnections() const; std::vector> getParameters(); + std::weak_ptr getParameter(std::string parameterName); + + void dirtyNode(); unsigned int getMaxInputs() const; unsigned int getMaxOutputs() const; + // signals + boost::signals2::signal nodeDirtied; + + private: void initParameters(); @@ -45,5 +52,6 @@ private: std::unique_ptr opDef_; enzo::nt::OpId opId_; enzo::op::OpInfo opInfo_; + bool dirty_ = true; }; } diff --git a/src/Engine/Parameter/Parameter.cpp b/src/Engine/Parameter/Parameter.cpp index 6399446..bbe193e 100644 --- a/src/Engine/Parameter/Parameter.cpp +++ b/src/Engine/Parameter/Parameter.cpp @@ -1,10 +1,10 @@ #include "Engine/Parameter/Parameter.h" #include - enzo::prm::Parameter::Parameter(Template prmTemplate) : template_{prmTemplate} { + floatValue_ = prmTemplate.getDefault(); std::cout << "created new parameter: " << prmTemplate.getName() << "\n"; } @@ -20,5 +20,6 @@ enzo::bt::floatT enzo::prm::Parameter::evalFloat() const void enzo::prm::Parameter::setFloat(bt::floatT value) { floatValue_ = value; + valueChanged(); } diff --git a/src/Engine/Parameter/Parameter.h b/src/Engine/Parameter/Parameter.h index e2ce818..dbf9cba 100644 --- a/src/Engine/Parameter/Parameter.h +++ b/src/Engine/Parameter/Parameter.h @@ -1,6 +1,7 @@ #pragma once #include "Engine/Parameter/Template.h" #include "Engine/Types.h" +#include namespace enzo::prm { @@ -11,6 +12,7 @@ public: std::string getName() const; bt::floatT evalFloat() const; void setFloat(bt::floatT value); + boost::signals2::signal valueChanged; private: Template template_; bt::floatT floatValue_ = 0; diff --git a/src/Engine/Parameter/Template.cpp b/src/Engine/Parameter/Template.cpp index 2768e1e..ff699ef 100644 --- a/src/Engine/Parameter/Template.cpp +++ b/src/Engine/Parameter/Template.cpp @@ -1,8 +1,8 @@ #include "Engine/Parameter/Template.h" #include "Engine/Parameter/Type.h" -enzo::prm::Template::Template(enzo::prm::Type type, const char* name) -: type_{type}, name_{name} +enzo::prm::Template::Template(enzo::prm::Type type, const char* name, bt::floatT theDefault) +: type_{type}, name_{name}, default_{theDefault} { } @@ -18,6 +18,11 @@ bool enzo::prm::Template::isValid() const } +const enzo::bt::floatT enzo::prm::Template::getDefault() const +{ + return default_; +} + const char* enzo::prm::Template::getName() const { return name_; diff --git a/src/Engine/Parameter/Template.h b/src/Engine/Parameter/Template.h index 6e69d38..b34cde2 100644 --- a/src/Engine/Parameter/Template.h +++ b/src/Engine/Parameter/Template.h @@ -1,5 +1,6 @@ #pragma once #include "Engine/Parameter/Type.h" +#include "Engine/Types.h" namespace enzo::prm { @@ -7,12 +8,19 @@ namespace enzo::prm class Template { public: - Template(enzo::prm::Type type, const char* name); + Template( + enzo::prm::Type type, + const char* name, + // TODO: change default to class that can store multiple types + bt::floatT theDefault + ); Template(); const char* getName() const; + const bt::floatT getDefault() const; bool isValid() const; private: enzo::prm::Type type_; + bt::floatT default_; // TODO: make a class that holds token and name const char* name_; diff --git a/src/Gui/Interface.cpp b/src/Gui/Interface.cpp index ffd80cf..9a6a1bf 100644 --- a/src/Gui/Interface.cpp +++ b/src/Gui/Interface.cpp @@ -55,7 +55,8 @@ EnzoUI::EnzoUI() // connect signals connect(&enzo::nt::nm(), &enzo::nt::NetworkManager::updateDisplay, viewport, &Viewport::geometryChanged); - connect(&enzo::nt::nm(), &enzo::nt::NetworkManager::updateDisplay, parametersPanel, &ParametersPanel::selectionChanged); + enzo::nt::nm().displayNodeChanged.connect([parametersPanel](){parametersPanel->selectionChanged();}); + // connect(&enzo::nt::nm(), &enzo::nt::NetworkManager::updateDisplay, parametersPanel, &ParametersPanel::selectionChanged); // ─── end of EnzoUI ctor ─── QTimer::singleShot(0, this, [=] { diff --git a/src/Gui/Network/TabMenu.h b/src/Gui/Network/TabMenu.h index 12f6f65..fa158bc 100644 --- a/src/Gui/Network/TabMenu.h +++ b/src/Gui/Network/TabMenu.h @@ -59,7 +59,7 @@ protected: void focusOutEvent(QFocusEvent *event) override; bool event(QEvent *event) override; // void resizeEvent(QResizeEvent *event) override; -protected slots: +protected Q_SLOTS: void nodeClicked(); }; diff --git a/src/Gui/Parameters/AbstractFormParm.cpp b/src/Gui/Parameters/AbstractFormParm.cpp index 64f605a..629c413 100644 --- a/src/Gui/Parameters/AbstractFormParm.cpp +++ b/src/Gui/Parameters/AbstractFormParm.cpp @@ -16,7 +16,6 @@ enzo::ui::AbstractFormParm::AbstractFormParm(std::weak_ptr param label->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred); auto slider = new AbstractSliderParm(); - connect(slider, &AbstractSliderParm::valueChanged, this, &AbstractFormParm::changeValue); slider->setValue(sharedParameter->evalFloat()); mainLayout_ = new QHBoxLayout(); @@ -28,6 +27,8 @@ enzo::ui::AbstractFormParm::AbstractFormParm(std::weak_ptr param setProperty("class", "Parameter"); setStyleSheet(".Parameter { background-color: none;}"); setLayout(mainLayout_); + + connect(slider, &AbstractSliderParm::valueChanged, this, &AbstractFormParm::changeValue); } } diff --git a/src/Gui/Parameters/AbstractFormParm.h b/src/Gui/Parameters/AbstractFormParm.h index d2279bb..3b58e89 100644 --- a/src/Gui/Parameters/AbstractFormParm.h +++ b/src/Gui/Parameters/AbstractFormParm.h @@ -2,6 +2,7 @@ #include #include #include +#include namespace enzo::ui { @@ -9,13 +10,13 @@ namespace enzo::ui class AbstractFormParm : public QWidget { + Q_OBJECT public: AbstractFormParm(std::weak_ptr parameter); -protected slots: +protected Q_SLOTS: void changeValue(bt::floatT value); - private: QHBoxLayout* mainLayout_; std::weak_ptr parameter_; diff --git a/src/Gui/Parameters/AbstractSliderParm.h b/src/Gui/Parameters/AbstractSliderParm.h index 640321c..1e28496 100644 --- a/src/Gui/Parameters/AbstractSliderParm.h +++ b/src/Gui/Parameters/AbstractSliderParm.h @@ -15,7 +15,7 @@ public: AbstractSliderParm(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags()); void setValue(bt::floatT value); -signals: +Q_SIGNALS: void valueChanged(bt::floatT value); private: diff --git a/src/Gui/ParametersPanel/ParametersPanel.h b/src/Gui/ParametersPanel/ParametersPanel.h index 8749474..5a99de1 100644 --- a/src/Gui/ParametersPanel/ParametersPanel.h +++ b/src/Gui/ParametersPanel/ParametersPanel.h @@ -8,7 +8,7 @@ class ParametersPanel { public: ParametersPanel(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags()); -public slots: +public Q_SLOTS: void selectionChanged(); private: QVBoxLayout* mainLayout_; diff --git a/src/Gui/Viewport/Viewport.h b/src/Gui/Viewport/Viewport.h index bf63d68..fe86376 100644 --- a/src/Gui/Viewport/Viewport.h +++ b/src/Gui/Viewport/Viewport.h @@ -23,6 +23,6 @@ private: QPointF leftStartPos_; bool rightMouseDown_=false; QPointF rightStartPos_; -public slots: +public Q_SLOTS: void geometryChanged(enzo::geo::Geometry& geometry); }; diff --git a/src/Gui/Viewport/ViewportGLWidget.h b/src/Gui/Viewport/ViewportGLWidget.h index 0c02d31..2917873 100644 --- a/src/Gui/Viewport/ViewportGLWidget.h +++ b/src/Gui/Viewport/ViewportGLWidget.h @@ -25,6 +25,6 @@ protected: void resizeGL(int w, int h) override; void paintGL() override; -public slots: +public Q_SLOTS: void geometryChanged(enzo::geo::Geometry& geometry); }; diff --git a/src/OpDefs/CMakeLists.txt b/src/OpDefs/CMakeLists.txt index f58e6db..0ed25a4 100644 --- a/src/OpDefs/CMakeLists.txt +++ b/src/OpDefs/CMakeLists.txt @@ -18,6 +18,7 @@ add_library(${libName} SHARED ../Engine/Operator/Attribute.cpp ../Engine/Network/NetworkManager.cpp ../Engine/Parameter/Template.cpp + ../Engine/Parameter/Parameter.cpp GopTransform.cpp GopHouse.cpp ) diff --git a/src/OpDefs/GopHouse.cpp b/src/OpDefs/GopHouse.cpp index 4610be1..beacaf5 100644 --- a/src/OpDefs/GopHouse.cpp +++ b/src/OpDefs/GopHouse.cpp @@ -48,7 +48,7 @@ void GOP_house::cookOp(enzo::op::Context context) for(int i=0; i