From a14c9e973c1497b29c61dc3a2d3ddfbea0ad62a3 Mon Sep 17 00:00:00 2001 From: parker Date: Mon, 7 Jul 2025 15:47:10 +0100 Subject: [PATCH] feat: basic dependency graph cooking, updating viewport --- CMakeLists.txt | 2 +- src/Engine/Network/NetworkManager.cpp | 42 ++++++++++++++++++++++++--- src/Engine/Network/NetworkManager.h | 10 +++++-- src/Engine/Operator/AttributeHandle.h | 9 +++++- src/gui/Interface.cpp | 7 ++--- src/gui/network/Network.cpp | 3 +- src/gui/network/SocketGraphic.cpp | 2 -- src/gui/viewport/GLMesh.cpp | 6 ++++ src/gui/viewport/Viewport.cpp | 5 ++++ src/gui/viewport/Viewport.h | 2 ++ src/gui/viewport/ViewportGLWidget.cpp | 24 +++++++++++---- src/gui/viewport/ViewportGLWidget.h | 5 +++- 12 files changed, 96 insertions(+), 21 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 09456e1..7d508c8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -67,5 +67,5 @@ add_executable(${TestExec} src/Engine/Operator/GeometryConnection.cpp ) find_package(Catch2 3 REQUIRED) -target_link_libraries(${TestExec} PRIVATE Catch2::Catch2WithMain Eigen3::Eigen) +target_link_libraries(${TestExec} PRIVATE Catch2::Catch2WithMain Eigen3::Eigen Qt6::Core ) target_include_directories(${TestExec} PUBLIC src) diff --git a/src/Engine/Network/NetworkManager.cpp b/src/Engine/Network/NetworkManager.cpp index 722ef52..5ce9d7c 100644 --- a/src/Engine/Network/NetworkManager.cpp +++ b/src/Engine/Network/NetworkManager.cpp @@ -1,5 +1,8 @@ #include "Engine/Network/NetworkManager.h" +#include "Engine/Operator/Geometry.h" #include "Engine/Operator/GeometryOperator.h" +#include "Engine/Operator/Attribute.h" +#include "Engine/Operator/AttributeHandle.h" #include "Engine/Types.h" #include #include @@ -43,15 +46,46 @@ bool enzo::nt::NetworkManager::isValidOp(nt::OpId opId) void enzo::nt::NetworkManager::setDisplayOp(OpId opId) { displayOp_=opId; - getTraversalGraph(opId); + std::vector dependencyGraph = getDependencyGraph(opId); + enzo::geo::Geometry prevGeometry; + + std::shared_ptr PAttr = prevGeometry.getAttribByName(ga::AttrOwner::POINT, "P"); + ga::AttributeHandleVector3 PAttrHandle = ga::AttributeHandleVector3(PAttr); + PAttrHandle.addValue(bt::Vector3(1.0f, -1.0f, 0.0f)); + PAttrHandle.addValue(bt::Vector3(-1.0f, -1.0f, 0.0f)); + PAttrHandle.addValue(bt::Vector3(-1.0f, 1.0f, 0.0f)); + PAttrHandle.addValue(bt::Vector3(0.0f, 2.0f, 0.0f)); + PAttrHandle.addValue(bt::Vector3(1.0f, 1.0f, 0.0f)); + + std::shared_ptr pointAttr = prevGeometry.getAttribByName(ga::AttrOwner::VERTEX, "point"); + ga::AttributeHandleInt pointAttrHandle = ga::AttributeHandleInt(pointAttr); + pointAttrHandle.addValue(0); + pointAttrHandle.addValue(1); + pointAttrHandle.addValue(2); + pointAttrHandle.addValue(3); + pointAttrHandle.addValue(4); + + for(enzo::nt::OpId opId : dependencyGraph) + { + prevGeometry = cookOp(opId, prevGeometry); + } + updateDisplay(prevGeometry); } -void enzo::nt::NetworkManager::cookOp(enzo::nt::OpId opId) +enzo::geo::Geometry enzo::nt::NetworkManager::cookOp(enzo::nt::OpId opId, enzo::geo::Geometry inputGeometry) { - std::cout << "COOKING: " << opId << "\n"; + std::shared_ptr PAttr = inputGeometry.getAttribByName(ga::AttrOwner::POINT, "P"); + ga::AttributeHandleVector3 PAttrHandle = ga::AttributeHandleVector3(PAttr); + for(int i=0; i<5; ++i) + { + enzo::bt::Vector3 vector = PAttrHandle.getValue(i); + vector.y()+=1; + PAttrHandle.setValue(i, vector); + } + return inputGeometry; } -std::vector enzo::nt::NetworkManager::getTraversalGraph(enzo::nt::OpId opId) +std::vector enzo::nt::NetworkManager::getDependencyGraph(enzo::nt::OpId opId) { std::stack traversalBuffer; std::vector traversalGraph; diff --git a/src/Engine/Network/NetworkManager.h b/src/Engine/Network/NetworkManager.h index 794951c..af35e62 100644 --- a/src/Engine/Network/NetworkManager.h +++ b/src/Engine/Network/NetworkManager.h @@ -1,12 +1,16 @@ #pragma once #include "Engine/Operator/GeometryOperator.h" +#include "Engine/Operator/Geometry.h" #include "Engine/Types.h" #include #include +#include namespace enzo::nt { class NetworkManager +: public QObject { + Q_OBJECT public: OpId addOperator(); void setDisplayOp(OpId opId); @@ -25,13 +29,15 @@ private: std::unordered_map> gopStore_; - void cookOp(enzo::nt::OpId opId); - std::vector getTraversalGraph(enzo::nt::OpId opId); + enzo::geo::Geometry cookOp(enzo::nt::OpId opId, enzo::geo::Geometry inputGeometry); + std::vector getDependencyGraph(enzo::nt::OpId opId); // the highest operator id currently stored enzo::nt::OpId maxOpId_=0; std::optional displayOp_=std::nullopt; +signals: + void updateDisplay(enzo::geo::Geometry& geometry); }; } diff --git a/src/Engine/Operator/AttributeHandle.h b/src/Engine/Operator/AttributeHandle.h index 4e78224..302dca4 100644 --- a/src/Engine/Operator/AttributeHandle.h +++ b/src/Engine/Operator/AttributeHandle.h @@ -59,12 +59,19 @@ public: return *data_; } - T getValue(uint pos) const + T getValue(size_t pos) const { // TODO:protect against invalid positions // TODO: cast types return data_->at(pos); } + + void setValue(size_t pos, const T& value) + { + // TODO:protect against invalid positions + // TODO: cast types + (*data_)[pos] = value; + } std::string getName() const { return name_; diff --git a/src/gui/Interface.cpp b/src/gui/Interface.cpp index ba56a45..98356bd 100644 --- a/src/gui/Interface.cpp +++ b/src/gui/Interface.cpp @@ -1,4 +1,5 @@ #include "gui/Interface.h" +#include "Engine/Network/NetworkManager.h" #include "gui/viewport/Viewport.h" #include "gui/network/Network.h" #include @@ -42,9 +43,7 @@ EnzoUI::EnzoUI() mainLayout_->addWidget(viewportSplitter_); - QTimer::singleShot(100, this, [=] { - std::cout << "Viewport size: " << viewport->width() << " x " << viewport->height() << std::endl; - std::cout << "Network size: " << network->width() << " x " << network->height() << std::endl; -}); + // connect signals + connect(enzo::nt::NetworkManager::getInstance(), &enzo::nt::NetworkManager::updateDisplay, viewport, &Viewport::geometryChanged); } diff --git a/src/gui/network/Network.cpp b/src/gui/network/Network.cpp index f1f99ff..c6981f9 100644 --- a/src/gui/network/Network.cpp +++ b/src/gui/network/Network.cpp @@ -114,6 +114,7 @@ void Network::leftMousePressed(QMouseEvent *event) else if(QGraphicsItem* clickedNode = itemOfType(clickedItems)) { nodeMoveDelta_=clickedNode->pos()-view_->mapToScene(event->pos()); + std::cout << "move delta: " << nodeMoveDelta_.x() << " " << nodeMoveDelta_.y() << "\n"; state_=State::MOVING_NODE; moveNodeBuffer.clear(); moveNodeBuffer.push_back(clickedNode); @@ -190,7 +191,7 @@ void Network::mouseMoved(QMouseEvent *event) if(state_==State::MOVING_NODE) { - moveNodes(nodeMoveDelta_+view_->mapToScene(event->pos())); + moveNodes(view_->mapToScene(event->pos())+nodeMoveDelta_); return; } diff --git a/src/gui/network/SocketGraphic.cpp b/src/gui/network/SocketGraphic.cpp index ec6f616..0c674cd 100644 --- a/src/gui/network/SocketGraphic.cpp +++ b/src/gui/network/SocketGraphic.cpp @@ -52,8 +52,6 @@ void SocketGraphic::initBoundingBox() void SocketGraphic::posChanged(QPointF pos) { - std::cout << "socket pos changed\n"; - // for(auto* edge : edges_) { // edge->setPos(startSocket_->scenePos(), socket->scenePos()); diff --git a/src/gui/viewport/GLMesh.cpp b/src/gui/viewport/GLMesh.cpp index d30092c..ee9ee3c 100644 --- a/src/gui/viewport/GLMesh.cpp +++ b/src/gui/viewport/GLMesh.cpp @@ -46,12 +46,15 @@ void GLMesh::initBuffers() void GLMesh::setPosBuffer(std::vector data) { bind(); + glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); vertexPosData.clear(); + std::cout << "pos data\n-------\n"; for(auto vector : data) { vertexPosData.push_back(vector.x()); vertexPosData.push_back(vector.y()); vertexPosData.push_back(vector.z()); + std::cout << vector.x() << " " << vector.y() << " " << vector.z() << "\n"; } glBufferData(GL_ARRAY_BUFFER, vertexPosData.size()*sizeof(GLfloat), vertexPosData.data(), GL_STATIC_DRAW); @@ -61,12 +64,15 @@ void GLMesh::setPosBuffer(std::vector data) void GLMesh::setIndexBuffer(std::vector data) { bind(); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer); indexData.clear(); + std::cout << "index data\n-------\n"; for(int i=1;i+1geometryChanged(geometry); +} + void Viewport::resizeEvent(QResizeEvent *event) { QPainterPath path; diff --git a/src/gui/viewport/Viewport.h b/src/gui/viewport/Viewport.h index 7ed71a9..a63ed73 100644 --- a/src/gui/viewport/Viewport.h +++ b/src/gui/viewport/Viewport.h @@ -23,4 +23,6 @@ private: QPointF leftStartPos_; bool rightMouseDown_=false; QPointF rightStartPos_; +public slots: + void geometryChanged(enzo::geo::Geometry& geometry); }; diff --git a/src/gui/viewport/ViewportGLWidget.cpp b/src/gui/viewport/ViewportGLWidget.cpp index 9c189b2..bb44624 100644 --- a/src/gui/viewport/ViewportGLWidget.cpp +++ b/src/gui/viewport/ViewportGLWidget.cpp @@ -20,8 +20,9 @@ void ViewportGLWidget::initializeGL() glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_MULTISAMPLE); - auto geo = std::make_unique(); - triangleMesh_ = meshFromGeo(geo); + enzo::geo::Geometry geo = enzo::geo::Geometry(); + // triangleMesh_ = meshFromGeo(geo); + triangleMesh_ = std::make_unique(); gridMesh_ = std::make_unique(); QSurfaceFormat fmt = context()->format(); @@ -141,13 +142,13 @@ void ViewportGLWidget::paintGL() } -std::unique_ptr ViewportGLWidget::meshFromGeo(std::unique_ptr& geometry) +std::unique_ptr ViewportGLWidget::meshFromGeo(enzo::geo::Geometry& geometry) { using namespace enzo; auto mesh = std::make_unique(); - std::shared_ptr PAttr = geometry->getAttribByName(ga::AttrOwner::POINT, "P"); + std::shared_ptr PAttr = geometry.getAttribByName(ga::AttrOwner::POINT, "P"); ga::AttributeHandleVector3 PAttrHandle = ga::AttributeHandleVector3(PAttr); PAttrHandle.addValue(bt::Vector3(1.0f, -1.0f, 0.0f)); PAttrHandle.addValue(bt::Vector3(-1.0f, -1.0f, 0.0f)); @@ -157,7 +158,7 @@ std::unique_ptr ViewportGLWidget::meshFromGeo(std::unique_ptrsetPosBuffer(PAttrHandle.getData()); - std::shared_ptr pointAttr = geometry->getAttribByName(ga::AttrOwner::VERTEX, "point"); + std::shared_ptr pointAttr = geometry.getAttribByName(ga::AttrOwner::VERTEX, "point"); ga::AttributeHandleInt pointAttrHandle = ga::AttributeHandleInt(pointAttr); pointAttrHandle.addValue(0); pointAttrHandle.addValue(1); @@ -170,3 +171,16 @@ std::unique_ptr ViewportGLWidget::meshFromGeo(std::unique_ptr PAttr = geometry.getAttribByName(ga::AttrOwner::POINT, "P"); + ga::AttributeHandleVector3 PAttrHandle = ga::AttributeHandleVector3(PAttr); + + triangleMesh_->setPosBuffer(PAttrHandle.getData()); + + std::shared_ptr pointAttr = geometry.getAttribByName(ga::AttrOwner::VERTEX, "point"); + ga::AttributeHandleInt pointAttrHandle = ga::AttributeHandleInt(pointAttr); + + triangleMesh_->setIndexBuffer(pointAttrHandle.getData()); +} diff --git a/src/gui/viewport/ViewportGLWidget.h b/src/gui/viewport/ViewportGLWidget.h index 620edb9..e079d89 100644 --- a/src/gui/viewport/ViewportGLWidget.h +++ b/src/gui/viewport/ViewportGLWidget.h @@ -18,10 +18,13 @@ public: std::unique_ptr triangleMesh_ ; std::unique_ptr gridMesh_ ; - std::unique_ptr meshFromGeo(std::unique_ptr& geometry); + std::unique_ptr meshFromGeo(enzo::geo::Geometry& geometry); protected: void initializeGL() override; void resizeGL(int w, int h) override; void paintGL() override; + +public slots: + void geometryChanged(enzo::geo::Geometry& geometry); };