From 92bfc8ff263c80af9e67d2b08757e0deab1098a6 Mon Sep 17 00:00:00 2001 From: parker Date: Fri, 1 Aug 2025 16:04:35 +0100 Subject: [PATCH] feat: add obj reader --- src/Engine/Network/NetworkManager.cpp | 1 - src/Engine/Operator/Attribute.h | 10 ++- src/Engine/Operator/AttributeHandle.h | 6 +- src/Gui/Viewport/GLMesh.cpp | 22 ++--- src/OpDefs/CMakeLists.txt | 1 + src/OpDefs/GopGeometryImport.cpp | 123 ++++++++++++++++++++++++++ src/OpDefs/GopGeometryImport.h | 18 ++++ src/OpDefs/GopHouse.cpp | 2 +- src/OpDefs/RegisterPlugin.cpp | 12 +++ 9 files changed, 176 insertions(+), 19 deletions(-) create mode 100644 src/OpDefs/GopGeometryImport.cpp create mode 100644 src/OpDefs/GopGeometryImport.h diff --git a/src/Engine/Network/NetworkManager.cpp b/src/Engine/Network/NetworkManager.cpp index faab2d1..f73bca1 100644 --- a/src/Engine/Network/NetworkManager.cpp +++ b/src/Engine/Network/NetworkManager.cpp @@ -60,7 +60,6 @@ enzo::nt::NetworkManager& enzo::nt::NetworkManager::getInstance() enzo::nt::GeometryOperator& enzo::nt::NetworkManager::getGeoOperator(nt::OpId opId) { - std::cout << "gop size middle getter: " << gopStore_.size() <<"\n"; // <- size 0 auto it = gopStore_.find(opId); if(it == gopStore_.end()) { diff --git a/src/Engine/Operator/Attribute.h b/src/Engine/Operator/Attribute.h index c4e1142..8c675b7 100644 --- a/src/Engine/Operator/Attribute.h +++ b/src/Engine/Operator/Attribute.h @@ -1,4 +1,5 @@ #pragma once +#include #include #include #include @@ -9,6 +10,8 @@ namespace enzo{ namespace ga{ + template + using StoreContainer = std::vector; template class AttributeHandle; @@ -41,11 +44,10 @@ namespace enzo{ void* data_; - // data stores - std::shared_ptr> intStore_; - std::shared_ptr> floatStore_; - std::shared_ptr> vector3Store_; + std::shared_ptr> intStore_; + std::shared_ptr> floatStore_; + std::shared_ptr> vector3Store_; }; diff --git a/src/Engine/Operator/AttributeHandle.h b/src/Engine/Operator/AttributeHandle.h index 105a0e0..8837bac 100644 --- a/src/Engine/Operator/AttributeHandle.h +++ b/src/Engine/Operator/AttributeHandle.h @@ -6,6 +6,7 @@ #include #include "Engine/Operator/Attribute.h" #include "Engine/Types.h" +#include "tbb/concurrent_vector.h" #include @@ -54,9 +55,10 @@ public: data_->push_back(value); } + // TODO: replace with iterator std::vector getAllValues() const { - return *data_; + return {data_->begin(), data_->end()}; } size_t getSize() @@ -96,7 +98,7 @@ private: std::string name_=""; - std::shared_ptr> data_; + std::shared_ptr> data_; // int typeID_; diff --git a/src/Gui/Viewport/GLMesh.cpp b/src/Gui/Viewport/GLMesh.cpp index 0d97ed2..44ae6c3 100644 --- a/src/Gui/Viewport/GLMesh.cpp +++ b/src/Gui/Viewport/GLMesh.cpp @@ -59,19 +59,19 @@ void GLMesh::setPosBuffer(enzo::geo::Geometry& geometry) glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); vertices.clear(); - enzo::geo::HeMesh heMesh = geometry.computeHalfEdgeMesh(); + // enzo::geo::HeMesh heMesh = geometry.computeHalfEdgeMesh(); - // compute mesh normals - auto vnormals = heMesh.add_property_map("v:normals", CGAL::NULL_VECTOR).first; - auto fnormals = heMesh.add_property_map("f:normals", CGAL::NULL_VECTOR).first; - namespace PMP = CGAL::Polygon_mesh_processing; + // // compute mesh normals + // auto vnormals = heMesh.add_property_map("v:normals", CGAL::NULL_VECTOR).first; + // auto fnormals = heMesh.add_property_map("f:normals", CGAL::NULL_VECTOR).first; + // namespace PMP = CGAL::Polygon_mesh_processing; - PMP::compute_normals( - heMesh, - vnormals, - fnormals, - PMP::parameters::vertex_point_map(heMesh.points()) - ); + // PMP::compute_normals( + // heMesh, + // vnormals, + // fnormals, + // PMP::parameters::vertex_point_map(heMesh.points()) + // ); std::shared_ptr PAttr = geometry.getAttribByName(enzo::ga::AttrOwner::POINT, "P"); enzo::ga::AttributeHandleVector3 PAttrHandle = enzo::ga::AttributeHandleVector3(PAttr); diff --git a/src/OpDefs/CMakeLists.txt b/src/OpDefs/CMakeLists.txt index 0e127e7..06c1e46 100644 --- a/src/OpDefs/CMakeLists.txt +++ b/src/OpDefs/CMakeLists.txt @@ -22,6 +22,7 @@ add_library(${libName} SHARED GopTransform.cpp GopHouse.cpp GopTestCube.cpp + GopGeometryImport.cpp ) target_link_libraries(${libName} PRIVATE Qt6::Core Qt6::Widgets Qt6::SvgWidgets Qt6::OpenGLWidgets glm::glm Eigen3::Eigen TBB::tbb) diff --git a/src/OpDefs/GopGeometryImport.cpp b/src/OpDefs/GopGeometryImport.cpp new file mode 100644 index 0000000..f129dca --- /dev/null +++ b/src/OpDefs/GopGeometryImport.cpp @@ -0,0 +1,123 @@ +#include "OpDefs/GopGeometryImport.h" +#include "Engine/Operator/AttributeHandle.h" +#include "Engine/Types.h" +#include +#include +#include +#include +#include + +GopGeometryImport::GopGeometryImport(enzo::nt::NetworkManager* network, enzo::op::OpInfo opInfo) +: GeometryOpDef(network, opInfo) +{ + +} + +void GopGeometryImport::cookOp(enzo::op::Context context) +{ + using namespace enzo; + + if(outputRequested(0)) + { + std::string filePath = "/home/parker/Downloads/Rat_Placeholder_Polycount_12.obj"; + + geo::Geometry geo; + + auto PAttr = geo.getAttribByName(ga::AttrOwner::POINT, "P"); + ga::AttributeHandleVector3 PAttrHandle(PAttr); + + auto pointAttr = geo.getAttribByName(ga::AttrOwner::VERTEX, "point"); + ga::AttributeHandleInt pointAttrHandle(pointAttr); + + auto vertexCountAttr = geo.getAttribByName(ga::AttrOwner::PRIMITIVE, "vertexCount"); + ga::AttributeHandleInt vertexCountHandle(vertexCountAttr); + + std::ifstream file(filePath); + if(!file.is_open()) + { + std::cerr << "Failed to open file " << filePath << "\n"; + return; + } + + std::string line; + while(std::getline(file, line)) + { + if(line.size()==0) + { + continue; + } + + char firstChar = line[0]; + if(firstChar=='v') + { + std::vector result; + boost::split(result, line, isspace); + if(result.size()!=4) + { + continue; + + } + const bt::Vector3 pointPos = {std::stod(result[1]), std::stod(result[2]), std::stod(result[3])}; + PAttrHandle.addValue(pointPos); + std::cout << "adding vector: " << pointPos.x() << " " << pointPos.y() << " " << pointPos.z() << "\n"; + } + else if(firstChar=='f') + { + std::vector result; + boost::split(result, line, isspace); + // if(result.size()<3) + // { + // continue; + + // } + + + // set vertex attributes + std::cout << "connecting:"; + for(int i=1; i