feat: basic dependency graph cooking, updating viewport
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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_;
|
||||||
|
|||||||
@@ -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;
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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());
|
||||||
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user