feat: basic dependency graph cooking, updating viewport

This commit is contained in:
parker
2025-07-07 15:47:10 +01:00
parent 544889c40d
commit a14c9e973c
12 changed files with 96 additions and 21 deletions

View File

@@ -67,5 +67,5 @@ add_executable(${TestExec}
src/Engine/Operator/GeometryConnection.cpp src/Engine/Operator/GeometryConnection.cpp
) )
find_package(Catch2 3 REQUIRED) 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) target_include_directories(${TestExec} PUBLIC src)

View File

@@ -1,5 +1,8 @@
#include "Engine/Network/NetworkManager.h" #include "Engine/Network/NetworkManager.h"
#include "Engine/Operator/Geometry.h"
#include "Engine/Operator/GeometryOperator.h" #include "Engine/Operator/GeometryOperator.h"
#include "Engine/Operator/Attribute.h"
#include "Engine/Operator/AttributeHandle.h"
#include "Engine/Types.h" #include "Engine/Types.h"
#include <iostream> #include <iostream>
#include <memory> #include <memory>
@@ -43,15 +46,46 @@ bool enzo::nt::NetworkManager::isValidOp(nt::OpId opId)
void enzo::nt::NetworkManager::setDisplayOp(OpId opId) void enzo::nt::NetworkManager::setDisplayOp(OpId opId)
{ {
displayOp_=opId; displayOp_=opId;
getTraversalGraph(opId); std::vector<enzo::nt::OpId> dependencyGraph = getDependencyGraph(opId);
enzo::geo::Geometry prevGeometry;
std::shared_ptr<ga::Attribute> 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<ga::Attribute> 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<ga::Attribute> 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::OpId> enzo::nt::NetworkManager::getTraversalGraph(enzo::nt::OpId opId) std::vector<enzo::nt::OpId> enzo::nt::NetworkManager::getDependencyGraph(enzo::nt::OpId opId)
{ {
std::stack<enzo::nt::OpId> traversalBuffer; std::stack<enzo::nt::OpId> traversalBuffer;
std::vector<enzo::nt::OpId> traversalGraph; std::vector<enzo::nt::OpId> traversalGraph;

View File

@@ -1,12 +1,16 @@
#pragma once #pragma once
#include "Engine/Operator/GeometryOperator.h" #include "Engine/Operator/GeometryOperator.h"
#include "Engine/Operator/Geometry.h"
#include "Engine/Types.h" #include "Engine/Types.h"
#include <memory> #include <memory>
#include <unordered_map> #include <unordered_map>
#include <QObject>
namespace enzo::nt { namespace enzo::nt {
class NetworkManager class NetworkManager
: public QObject
{ {
Q_OBJECT
public: public:
OpId addOperator(); OpId addOperator();
void setDisplayOp(OpId opId); void setDisplayOp(OpId opId);
@@ -25,13 +29,15 @@ private:
std::unordered_map<enzo::nt::OpId, std::unique_ptr<enzo::nt::GeometryOperator>> gopStore_; std::unordered_map<enzo::nt::OpId, std::unique_ptr<enzo::nt::GeometryOperator>> gopStore_;
void cookOp(enzo::nt::OpId opId); enzo::geo::Geometry cookOp(enzo::nt::OpId opId, enzo::geo::Geometry inputGeometry);
std::vector<enzo::nt::OpId> getTraversalGraph(enzo::nt::OpId opId); std::vector<enzo::nt::OpId> getDependencyGraph(enzo::nt::OpId opId);
// the highest operator id currently stored // the highest operator id currently stored
enzo::nt::OpId maxOpId_=0; enzo::nt::OpId maxOpId_=0;
std::optional<OpId> displayOp_=std::nullopt; std::optional<OpId> displayOp_=std::nullopt;
signals:
void updateDisplay(enzo::geo::Geometry& geometry);
}; };
} }

View File

@@ -59,12 +59,19 @@ public:
return *data_; return *data_;
} }
T getValue(uint pos) const T getValue(size_t pos) const
{ {
// TODO:protect against invalid positions // TODO:protect against invalid positions
// TODO: cast types // TODO: cast types
return data_->at(pos); 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 std::string getName() const
{ {
return name_; return name_;

View File

@@ -1,4 +1,5 @@
#include "gui/Interface.h" #include "gui/Interface.h"
#include "Engine/Network/NetworkManager.h"
#include "gui/viewport/Viewport.h" #include "gui/viewport/Viewport.h"
#include "gui/network/Network.h" #include "gui/network/Network.h"
#include <qpushbutton.h> #include <qpushbutton.h>
@@ -42,9 +43,7 @@ EnzoUI::EnzoUI()
mainLayout_->addWidget(viewportSplitter_); mainLayout_->addWidget(viewportSplitter_);
QTimer::singleShot(100, this, [=] { // connect signals
std::cout << "Viewport size: " << viewport->width() << " x " << viewport->height() << std::endl; connect(enzo::nt::NetworkManager::getInstance(), &enzo::nt::NetworkManager::updateDisplay, viewport, &Viewport::geometryChanged);
std::cout << "Network size: " << network->width() << " x " << network->height() << std::endl;
});
} }

View File

@@ -114,6 +114,7 @@ void Network::leftMousePressed(QMouseEvent *event)
else if(QGraphicsItem* clickedNode = itemOfType<NodeGraphic>(clickedItems)) else if(QGraphicsItem* clickedNode = itemOfType<NodeGraphic>(clickedItems))
{ {
nodeMoveDelta_=clickedNode->pos()-view_->mapToScene(event->pos()); nodeMoveDelta_=clickedNode->pos()-view_->mapToScene(event->pos());
std::cout << "move delta: " << nodeMoveDelta_.x() << " " << nodeMoveDelta_.y() << "\n";
state_=State::MOVING_NODE; state_=State::MOVING_NODE;
moveNodeBuffer.clear(); moveNodeBuffer.clear();
moveNodeBuffer.push_back(clickedNode); moveNodeBuffer.push_back(clickedNode);
@@ -190,7 +191,7 @@ void Network::mouseMoved(QMouseEvent *event)
if(state_==State::MOVING_NODE) if(state_==State::MOVING_NODE)
{ {
moveNodes(nodeMoveDelta_+view_->mapToScene(event->pos())); moveNodes(view_->mapToScene(event->pos())+nodeMoveDelta_);
return; return;
} }

View File

@@ -52,8 +52,6 @@ void SocketGraphic::initBoundingBox()
void SocketGraphic::posChanged(QPointF pos) void SocketGraphic::posChanged(QPointF pos)
{ {
std::cout << "socket pos changed\n";
//
for(auto* edge : edges_) for(auto* edge : edges_)
{ {
// edge->setPos(startSocket_->scenePos(), socket->scenePos()); // edge->setPos(startSocket_->scenePos(), socket->scenePos());

View File

@@ -46,12 +46,15 @@ void GLMesh::initBuffers()
void GLMesh::setPosBuffer(std::vector<enzo::bt::Vector3> data) void GLMesh::setPosBuffer(std::vector<enzo::bt::Vector3> data)
{ {
bind(); bind();
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
vertexPosData.clear(); vertexPosData.clear();
std::cout << "pos data\n-------\n";
for(auto vector : data) for(auto vector : data)
{ {
vertexPosData.push_back(vector.x()); vertexPosData.push_back(vector.x());
vertexPosData.push_back(vector.y()); vertexPosData.push_back(vector.y());
vertexPosData.push_back(vector.z()); 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); glBufferData(GL_ARRAY_BUFFER, vertexPosData.size()*sizeof(GLfloat), vertexPosData.data(), GL_STATIC_DRAW);
@@ -61,12 +64,15 @@ void GLMesh::setPosBuffer(std::vector<enzo::bt::Vector3> data)
void GLMesh::setIndexBuffer(std::vector<int> data) void GLMesh::setIndexBuffer(std::vector<int> data)
{ {
bind(); bind();
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
indexData.clear(); indexData.clear();
std::cout << "index data\n-------\n";
for(int i=1;i+1<data.size();++i) for(int i=1;i+1<data.size();++i)
{ {
indexData.push_back(data.at(0)); indexData.push_back(data.at(0));
indexData.push_back(data.at(i)); indexData.push_back(data.at(i));
indexData.push_back(data.at(i+1)); indexData.push_back(data.at(i+1));
std::cout << data.at(0) << " " << data.at(i) << " " << data.at(i+1) << "\n";
} }
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexData.size()*sizeof(GLint), indexData.data(), GL_STATIC_DRAW); glBufferData(GL_ELEMENT_ARRAY_BUFFER, indexData.size()*sizeof(GLint), indexData.data(), GL_STATIC_DRAW);

View File

@@ -27,6 +27,11 @@ Viewport::Viewport(QWidget *parent, Qt::WindowFlags f)
} }
void Viewport::geometryChanged(enzo::geo::Geometry& geometry)
{
openGLWidget_->geometryChanged(geometry);
}
void Viewport::resizeEvent(QResizeEvent *event) void Viewport::resizeEvent(QResizeEvent *event)
{ {
QPainterPath path; QPainterPath path;

View File

@@ -23,4 +23,6 @@ private:
QPointF leftStartPos_; QPointF leftStartPos_;
bool rightMouseDown_=false; bool rightMouseDown_=false;
QPointF rightStartPos_; QPointF rightStartPos_;
public slots:
void geometryChanged(enzo::geo::Geometry& geometry);
}; };

View File

@@ -20,8 +20,9 @@ void ViewportGLWidget::initializeGL()
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_MULTISAMPLE); glEnable(GL_MULTISAMPLE);
auto geo = std::make_unique<enzo::geo::Geometry>(); enzo::geo::Geometry geo = enzo::geo::Geometry();
triangleMesh_ = meshFromGeo(geo); // triangleMesh_ = meshFromGeo(geo);
triangleMesh_ = std::make_unique<GLMesh>();
gridMesh_ = std::make_unique<GLGrid>(); gridMesh_ = std::make_unique<GLGrid>();
QSurfaceFormat fmt = context()->format(); QSurfaceFormat fmt = context()->format();
@@ -141,13 +142,13 @@ void ViewportGLWidget::paintGL()
} }
std::unique_ptr<GLMesh> ViewportGLWidget::meshFromGeo(std::unique_ptr<enzo::geo::Geometry>& geometry) std::unique_ptr<GLMesh> ViewportGLWidget::meshFromGeo(enzo::geo::Geometry& geometry)
{ {
using namespace enzo; using namespace enzo;
auto mesh = std::make_unique<GLMesh>(); auto mesh = std::make_unique<GLMesh>();
std::shared_ptr<ga::Attribute> PAttr = geometry->getAttribByName(ga::AttrOwner::POINT, "P"); std::shared_ptr<ga::Attribute> PAttr = geometry.getAttribByName(ga::AttrOwner::POINT, "P");
ga::AttributeHandleVector3 PAttrHandle = ga::AttributeHandleVector3(PAttr); 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(-1.0f, -1.0f, 0.0f));
@@ -157,7 +158,7 @@ std::unique_ptr<GLMesh> ViewportGLWidget::meshFromGeo(std::unique_ptr<enzo::geo:
mesh->setPosBuffer(PAttrHandle.getData()); mesh->setPosBuffer(PAttrHandle.getData());
std::shared_ptr<ga::Attribute> pointAttr = geometry->getAttribByName(ga::AttrOwner::VERTEX, "point"); std::shared_ptr<ga::Attribute> pointAttr = geometry.getAttribByName(ga::AttrOwner::VERTEX, "point");
ga::AttributeHandleInt pointAttrHandle = ga::AttributeHandleInt(pointAttr); ga::AttributeHandleInt pointAttrHandle = ga::AttributeHandleInt(pointAttr);
pointAttrHandle.addValue(0); pointAttrHandle.addValue(0);
pointAttrHandle.addValue(1); pointAttrHandle.addValue(1);
@@ -170,3 +171,16 @@ std::unique_ptr<GLMesh> ViewportGLWidget::meshFromGeo(std::unique_ptr<enzo::geo:
return mesh; return mesh;
} }
void ViewportGLWidget::geometryChanged(enzo::geo::Geometry& geometry)
{
using namespace enzo;
std::shared_ptr<ga::Attribute> PAttr = geometry.getAttribByName(ga::AttrOwner::POINT, "P");
ga::AttributeHandleVector3 PAttrHandle = ga::AttributeHandleVector3(PAttr);
triangleMesh_->setPosBuffer(PAttrHandle.getData());
std::shared_ptr<ga::Attribute> pointAttr = geometry.getAttribByName(ga::AttrOwner::VERTEX, "point");
ga::AttributeHandleInt pointAttrHandle = ga::AttributeHandleInt(pointAttr);
triangleMesh_->setIndexBuffer(pointAttrHandle.getData());
}

View File

@@ -18,10 +18,13 @@ public:
std::unique_ptr<GLMesh> triangleMesh_ ; std::unique_ptr<GLMesh> triangleMesh_ ;
std::unique_ptr<GLGrid> gridMesh_ ; std::unique_ptr<GLGrid> gridMesh_ ;
std::unique_ptr<GLMesh> meshFromGeo(std::unique_ptr<enzo::geo::Geometry>& geometry); std::unique_ptr<GLMesh> meshFromGeo(enzo::geo::Geometry& geometry);
protected: protected:
void initializeGL() override; void initializeGL() override;
void resizeGL(int w, int h) override; void resizeGL(int w, int h) override;
void paintGL() override; void paintGL() override;
public slots:
void geometryChanged(enzo::geo::Geometry& geometry);
}; };