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 a5a9f3d..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,6 +44,8 @@ private: enzo::nt::OpId maxOpId_=0; // operator selected for displaying in the viewport std::optional displayOp_=std::nullopt; + + Q_SIGNALS: void updateDisplay(enzo::geo::Geometry& geometry); diff --git a/src/Engine/Operator/GeometryOperator.cpp b/src/Engine/Operator/GeometryOperator.cpp index 93c0189..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) diff --git a/src/Engine/Operator/GeometryOperator.h b/src/Engine/Operator/GeometryOperator.h index e4a0513..827114f 100644 --- a/src/Engine/Operator/GeometryOperator.h +++ b/src/Engine/Operator/GeometryOperator.h @@ -29,10 +29,16 @@ public: 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(); @@ -46,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 4f22343..bbe193e 100644 --- a/src/Engine/Parameter/Parameter.cpp +++ b/src/Engine/Parameter/Parameter.cpp @@ -1,7 +1,6 @@ #include "Engine/Parameter/Parameter.h" #include - enzo::prm::Parameter::Parameter(Template prmTemplate) : template_{prmTemplate} { @@ -21,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/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, [=] {