diff --git a/src/Engine/Network/NetworkManager.cpp b/src/Engine/Network/NetworkManager.cpp index 738cb98..ae12d9f 100644 --- a/src/Engine/Network/NetworkManager.cpp +++ b/src/Engine/Network/NetworkManager.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include enzo::nt::OpId enzo::nt::NetworkManager::addOperator(op::OpInfo opInfo) @@ -99,8 +100,12 @@ std::vector enzo::nt::NetworkManager::getDependencyGraph(enzo::n auto inputConnections = getGeoOperator(currentOp).getInputConnections(); for(auto connection : inputConnections) { - traversalBuffer.push(connection->getInputOpId()); - dependencyGraph.push_back(connection->getInputOpId()); + if(auto connectionPtr = connection.lock()) + { + traversalBuffer.push(connectionPtr->getInputOpId()); + dependencyGraph.push_back(connectionPtr->getInputOpId()); + } + else { throw std::runtime_error("Connection weak ptr invalid"); } } } diff --git a/src/Engine/Operator/Context.cpp b/src/Engine/Operator/Context.cpp index 27d47bd..8f8e0ab 100644 --- a/src/Engine/Operator/Context.cpp +++ b/src/Engine/Operator/Context.cpp @@ -3,6 +3,7 @@ #include "Engine/Parameter/Parameter.h" #include #include +#include enzo::op::Context::Context(enzo::nt::OpId opId, enzo::nt::NetworkManager& networkManager) @@ -15,14 +16,21 @@ enzo::geo::Geometry enzo::op::Context::cloneInputGeo(unsigned int inputIndex) { // TODO: implement enzo::nt::GeometryOperator& selfOp = networkManager_.getGeoOperator(opId_); - std::vector> inputConnections = selfOp.getInputConnections(); + std::vector> inputConnections = selfOp.getInputConnections(); if(inputConnections.size()==0) { std::cout << "no input\n"; return enzo::geo::Geometry(); } - std::shared_ptr inputConnection = inputConnections.at(inputIndex); - return networkManager_.getGeoOperator(inputConnection->getInputOpId()).getOutputGeo(inputConnection->getInputIndex()); + auto inputConnection = inputConnections.at(inputIndex); + if(auto inputConnectionSP = inputConnection.lock()) + { + return networkManager_.getGeoOperator(inputConnectionSP->getInputOpId()).getOutputGeo(inputConnectionSP->getInputIndex()); + } + else + { + throw std::runtime_error("Connection weak ptr doesn't exist"); + } } enzo::bt::floatT enzo::op::Context::evalFloatParm(const char* parmName) const @@ -34,4 +42,8 @@ enzo::bt::floatT enzo::op::Context::evalFloatParm(const char* parmName) const { return sharedParm->evalFloat(); } + else + { + throw std::runtime_error("Parameter weak ptr invalid"); + } } diff --git a/src/Engine/Operator/GeometryOperator.cpp b/src/Engine/Operator/GeometryOperator.cpp index 6af4541..4bd153a 100644 --- a/src/Engine/Operator/GeometryOperator.cpp +++ b/src/Engine/Operator/GeometryOperator.cpp @@ -70,13 +70,10 @@ geo::Geometry& enzo::nt::GeometryOperator::getOutputGeo(unsigned outputIndex) void nt::GeometryOperator::addInputConnection(std::shared_ptr newConnection) { // delete previous input - IC(); for(auto it=inputConnections_.begin(); it!=inputConnections_.end();) { - IC(); if((*it)->getOutputIndex()==newConnection->getOutputIndex()) { - IC(); inputConnections_.erase(it); } else @@ -84,7 +81,6 @@ void nt::GeometryOperator::addInputConnection(std::shared_ptrgetInputOpId() << " -> " << newConnection->getOutputOpId() << "\n"; std::cout << "Connecting index " << newConnection->getInputIndex() << " -> " << newConnection->getOutputIndex() << "\n"; @@ -114,28 +110,30 @@ std::weak_ptr nt::GeometryOperator::getParameter(std::string par } -std::vector> nt::GeometryOperator::getInputConnections() const +std::vector> nt::GeometryOperator::getInputConnections() const { - std::vector> inputConnections; - for(std::shared_ptr connection : inputConnections_) - { - inputConnections.push_back(connection); - } - return inputConnections; + return {inputConnections_.begin(), inputConnections_.end()}; } std::vector> nt::GeometryOperator::getParameters() { return {parameters_.begin(), parameters_.end()}; } -std::vector> nt::GeometryOperator::getOutputConnections() const +std::vector> nt::GeometryOperator::getOutputConnections() const { - std::vector> outputConnections; - for(std::shared_ptr connection : outputConnections_) + return {outputConnections_.begin(), outputConnections_.end()}; +} + +std::optional nt::GeometryOperator::getInputConnection(size_t index) const +{ + for(auto it=inputConnections_.begin(); it!=inputConnections_.end();) { - outputConnections.push_back(connection); + if((*it)->getOutputIndex()==index) + { + return std::optional(**it); + } } - return outputConnections; + return std::nullopt; } diff --git a/src/Engine/Operator/GeometryOperator.h b/src/Engine/Operator/GeometryOperator.h index 827114f..4167c18 100644 --- a/src/Engine/Operator/GeometryOperator.h +++ b/src/Engine/Operator/GeometryOperator.h @@ -24,8 +24,9 @@ public: void addInputConnection(std::shared_ptr connection); void addOutputConnection(std::shared_ptr connection); - std::vector> getInputConnections() const; - std::vector> getOutputConnections() const; + std::vector> getInputConnections() const; + std::vector> getOutputConnections() const; + std::optional getInputConnection(size_t index) const; std::vector> getParameters(); std::weak_ptr getParameter(std::string parameterName); diff --git a/src/Gui/Network/Network.cpp b/src/Gui/Network/Network.cpp index 718554d..d42e387 100644 --- a/src/Gui/Network/Network.cpp +++ b/src/Gui/Network/Network.cpp @@ -129,7 +129,7 @@ void Network::leftMousePressed(QMouseEvent *event) void Network::socketClicked(SocketGraphic* socket, QMouseEvent *event) { std::cout << "socket clicked\n"; - // if first click + // clicked first socket if(!floatingEdge_) { startSocket_=socket; @@ -138,7 +138,7 @@ void Network::socketClicked(SocketGraphic* socket, QMouseEvent *event) scene_->addItem(floatingEdge_); floatingEdge_->setFloatPos(view_->mapToScene(event->pos())); } - // second click + // clicked second socket // connect to opposite type else if ( socket->getIO()!=startSocket_->getIO() && diff --git a/src/Gui/Network/NodeEdgeGraphic.cpp b/src/Gui/Network/NodeEdgeGraphic.cpp index 3353cef..716e389 100644 --- a/src/Gui/Network/NodeEdgeGraphic.cpp +++ b/src/Gui/Network/NodeEdgeGraphic.cpp @@ -5,6 +5,7 @@ #include #include #include +#include "icecream.hpp" NodeEdgeGraphic::NodeEdgeGraphic(SocketGraphic* socket1, SocketGraphic* socket2, QGraphicsItem *parent) : QGraphicsItem(parent), socket1_{socket1}, socket2_{socket2}, defaultColor_{QColor("white")} @@ -150,6 +151,7 @@ void NodeEdgeGraphic::paint(QPainter *painter, const QStyleOptionGraphicsItem *o void NodeEdgeGraphic::cleanUp() { + // TODO: possible memory leak // these probably aren't necessary but i'm trying to fix a bug prepareGeometryChange(); update(); diff --git a/src/Gui/Network/SocketGraphic.cpp b/src/Gui/Network/SocketGraphic.cpp index 3c4d586..b947f0d 100644 --- a/src/Gui/Network/SocketGraphic.cpp +++ b/src/Gui/Network/SocketGraphic.cpp @@ -3,6 +3,7 @@ #include #include #include "Gui/Network/NodeEdgeGraphic.h" +#include "icecream.hpp" SocketGraphic::SocketGraphic(enzo::nt::SocketIOType type, enzo::nt::OpId opId, unsigned int socketIndex, QGraphicsItem *parent) : QGraphicsItem(parent), type_{type}, opId_{opId}, socketIndex_{socketIndex} @@ -22,6 +23,19 @@ unsigned int SocketGraphic::getIndex() const void SocketGraphic::addEdge(NodeEdgeGraphic* edge) { std::cout << "adding edge\n"; + if(getIO()==enzo::nt::SocketIOType::Input && edges_.size()>0) + { + std::unordered_set edgesCopy = edges_; + for(NodeEdgeGraphic* edge : edgesCopy) + { + if(!edge) + { + continue; + } + edge->cleanUp(); + } + edges_.clear(); + } edges_.insert(edge); }