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
)
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)

View File

@@ -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 <iostream>
#include <memory>
@@ -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<enzo::nt::OpId> dependencyGraph = getDependencyGraph(opId);
enzo::geo::Geometry prevGeometry;
void enzo::nt::NetworkManager::cookOp(enzo::nt::OpId opId)
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)
{
std::cout << "COOKING: " << opId << "\n";
prevGeometry = cookOp(opId, prevGeometry);
}
updateDisplay(prevGeometry);
}
std::vector<enzo::nt::OpId> enzo::nt::NetworkManager::getTraversalGraph(enzo::nt::OpId opId)
enzo::geo::Geometry enzo::nt::NetworkManager::cookOp(enzo::nt::OpId opId, enzo::geo::Geometry inputGeometry)
{
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::getDependencyGraph(enzo::nt::OpId opId)
{
std::stack<enzo::nt::OpId> traversalBuffer;
std::vector<enzo::nt::OpId> traversalGraph;

View File

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

View File

@@ -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_;

View File

@@ -1,4 +1,5 @@
#include "gui/Interface.h"
#include "Engine/Network/NetworkManager.h"
#include "gui/viewport/Viewport.h"
#include "gui/network/Network.h"
#include <qpushbutton.h>
@@ -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);
}

View File

@@ -114,6 +114,7 @@ void Network::leftMousePressed(QMouseEvent *event)
else if(QGraphicsItem* clickedNode = itemOfType<NodeGraphic>(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;
}

View File

@@ -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());

View File

@@ -46,12 +46,15 @@ void GLMesh::initBuffers()
void GLMesh::setPosBuffer(std::vector<enzo::bt::Vector3> 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<enzo::bt::Vector3> data)
void GLMesh::setIndexBuffer(std::vector<int> data)
{
bind();
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
indexData.clear();
std::cout << "index data\n-------\n";
for(int i=1;i+1<data.size();++i)
{
indexData.push_back(data.at(0));
indexData.push_back(data.at(i));
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);

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)
{
QPainterPath path;

View File

@@ -23,4 +23,6 @@ private:
QPointF leftStartPos_;
bool rightMouseDown_=false;
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);
glEnable(GL_MULTISAMPLE);
auto geo = std::make_unique<enzo::geo::Geometry>();
triangleMesh_ = meshFromGeo(geo);
enzo::geo::Geometry geo = enzo::geo::Geometry();
// triangleMesh_ = meshFromGeo(geo);
triangleMesh_ = std::make_unique<GLMesh>();
gridMesh_ = std::make_unique<GLGrid>();
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;
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);
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());
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);
pointAttrHandle.addValue(0);
pointAttrHandle.addValue(1);
@@ -170,3 +171,16 @@ std::unique_ptr<GLMesh> ViewportGLWidget::meshFromGeo(std::unique_ptr<enzo::geo:
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<GLGrid> gridMesh_ ;
std::unique_ptr<GLMesh> meshFromGeo(std::unique_ptr<enzo::geo::Geometry>& geometry);
std::unique_ptr<GLMesh> 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);
};