From 488ff9ff722c55c752c8b70477e571938f41f625 Mon Sep 17 00:00:00 2001 From: parker Date: Sun, 3 Aug 2025 03:22:52 +0100 Subject: [PATCH] refactor: cleanup setPosBuffer funciton, add getters for geometry --- src/Engine/Operator/AttributeHandle.h | 9 ++- src/Engine/Operator/Geometry.cpp | 82 ++++++++++++++++++++++++--- src/Engine/Operator/Geometry.h | 17 ++++++ src/Engine/Types.h | 1 + src/Gui/Viewport/GLMesh.cpp | 68 +++++++--------------- src/OpDefs/GopTransform.cpp | 27 ++++++--- 6 files changed, 139 insertions(+), 65 deletions(-) diff --git a/src/Engine/Operator/AttributeHandle.h b/src/Engine/Operator/AttributeHandle.h index 8837bac..a2bcc87 100644 --- a/src/Engine/Operator/AttributeHandle.h +++ b/src/Engine/Operator/AttributeHandle.h @@ -55,13 +55,18 @@ public: data_->push_back(value); } + void reserve(std::size_t newCap) + { + data_->reserve(newCap); + } + // TODO: replace with iterator std::vector getAllValues() const { return {data_->begin(), data_->end()}; } - size_t getSize() + size_t getSize() const { return data_->size(); } @@ -70,7 +75,7 @@ public: { // TODO:protect against invalid positions // TODO: cast types - return data_->at(pos); + return data_[pos]; } void setValue(size_t pos, const T& value) diff --git a/src/Engine/Operator/Geometry.cpp b/src/Engine/Operator/Geometry.cpp index d1cb843..03228f6 100644 --- a/src/Engine/Operator/Geometry.cpp +++ b/src/Engine/Operator/Geometry.cpp @@ -10,22 +10,67 @@ #include "icecream.hpp" using namespace enzo; -geo::Geometry::Geometry() +geo::Geometry::Geometry() : + vertexCountHandlePrim_{addIntAttribute(ga::AttrOwner::PRIMITIVE, "vertexCount")}, + pointOffsetHandleVert_{addIntAttribute(ga::AttrOwner::VERTEX, "point")}, + posHandlePoint_{addVector3Attribute(ga::AttrOwner::POINT, "P")} { - addVector3Attribute(ga::AttrOwner::POINT, "P"); - addIntAttribute(ga::AttrOwner::VERTEX, "point"); - addIntAttribute(ga::AttrOwner::PRIMITIVE, "vertexCount"); + } -geo::Geometry::Geometry(const Geometry& other) +geo::Geometry::Geometry(const Geometry& other): + pointAttributes_{deepCopyAttributes(other.pointAttributes_)}, + vertexAttributes_{deepCopyAttributes(other.vertexAttributes_)}, + primitiveAttributes_{deepCopyAttributes(other.primitiveAttributes_)}, + globalAttributes_{deepCopyAttributes(other.globalAttributes_)}, + vertexCountHandlePrim_{enzo::ga::AttributeHandleInt(getAttribByName(ga::AttrOwner::PRIMITIVE, "vertexCount"))}, + pointOffsetHandleVert_{enzo::ga::AttributeHandleInt(getAttribByName(ga::AttrOwner::VERTEX, "point"))}, + posHandlePoint_{enzo::ga::AttributeHandleVector3(getAttribByName(ga::AttrOwner::POINT, "P"))} { - pointAttributes_ = deepCopyAttributes(other.pointAttributes_); - vertexAttributes_ = deepCopyAttributes(other.vertexAttributes_); - primitiveAttributes_ = deepCopyAttributes(other.primitiveAttributes_); - globalAttributes_ = deepCopyAttributes(other.globalAttributes_); } +void geo::Geometry::addFace(std::initializer_list pointOffsets) +{ + for(ga::Offset pointOffset : pointOffsets) + { + pointOffsetHandleVert_.addValue(pointOffset); + } + vertexCountHandlePrim_.addValue(pointOffsets.size()); + +} + +bt::Vector3 geo::Geometry::getPosFromVert(ga::Offset vertexOffset) const +{ + // get point offset + const ga::Offset pointOffset = pointOffsetHandleVert_.getValue(vertexOffset); + // get value at point offset + return posHandlePoint_.getValue(pointOffset); +} + +bt::Vector3 geo::Geometry::getPointPos(ga::Offset pointOffset) const +{ + return posHandlePoint_.getValue(pointOffset); +} + +unsigned int geo::Geometry::getPrimVertCount(ga::Offset primOffset) const +{ + return vertexCountHandlePrim_.getValue(primOffset); +} + +ga::Offset geo::Geometry::getNumPrims() const +{ + return vertexCountHandlePrim_.getSize(); +} + +ga::Offset geo::Geometry::getNumVerts() const +{ + return pointOffsetHandleVert_.getSize(); +} + + + + geo::Geometry::attribVector geo::Geometry::deepCopyAttributes(attribVector originalVector) { geo::Geometry::attribVector copied; @@ -125,6 +170,25 @@ enzo::geo::HeMesh geo::Geometry::computeHalfEdgeMesh() return heMesh; } +unsigned int geo::Geometry::getPrimStartVertex(ga::Offset primOffset) +{ + const ga::Offset handleSize = vertexCountHandlePrim_.getSize(); + // TODO: add smarter system to recompute primStarts_, also move to separate function + // if size changed, recompute + if(handleSize!=primStarts_.size()) + { + bt::intT primStart = 0; + for(size_t i=0; i geo::Geometry::addIntAttribute(ga::AttributeOwner owner, std::string name) { diff --git a/src/Engine/Operator/Geometry.h b/src/Engine/Operator/Geometry.h index eb0271c..eb97fb8 100644 --- a/src/Engine/Operator/Geometry.h +++ b/src/Engine/Operator/Geometry.h @@ -3,6 +3,7 @@ #include "Engine/Types.h" #include #include +#include "Engine/Operator/AttributeHandle.h" #include @@ -29,6 +30,15 @@ public: std::shared_ptr getAttribByName(ga::AttributeOwner owner, std::string name); std::vector derivePointNormals(); HeMesh computeHalfEdgeMesh(); + // returns the first vertex of the primitive + unsigned int getPrimStartVertex(ga::Offset primOffset); + void addFace(std::initializer_list pointOffsets); + + bt::Vector3 getPosFromVert(ga::Offset vertexOffset) const; + bt::Vector3 getPointPos(ga::Offset pointOffset) const; + unsigned int getPrimVertCount(ga::Offset primOffset) const; + ga::Offset getNumPrims() const; + ga::Offset getNumVerts() const; private: using attribVector = std::vector>; attribVector& getAttributeStore(ga::AttributeOwner& owner); @@ -39,5 +49,12 @@ private: attribVector vertexAttributes_; attribVector primitiveAttributes_; attribVector globalAttributes_; + + std::vector primStarts_; + + // handles + enzo::ga::AttributeHandleInt vertexCountHandlePrim_; + enzo::ga::AttributeHandleInt pointOffsetHandleVert_; + enzo::ga::AttributeHandleVector3 posHandlePoint_; }; } diff --git a/src/Engine/Types.h b/src/Engine/Types.h index 91aa852..8878aa4 100644 --- a/src/Engine/Types.h +++ b/src/Engine/Types.h @@ -22,6 +22,7 @@ namespace enzo }; using AttrType = AttributeType; using AttrOwner = AttributeOwner; + using Offset = size_t; } // basic types types namespace bt diff --git a/src/Gui/Viewport/GLMesh.cpp b/src/Gui/Viewport/GLMesh.cpp index 44ae6c3..2078ade 100644 --- a/src/Gui/Viewport/GLMesh.cpp +++ b/src/Gui/Viewport/GLMesh.cpp @@ -57,79 +57,55 @@ void GLMesh::setPosBuffer(enzo::geo::Geometry& geometry) { bind(); glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); - vertices.clear(); - // enzo::geo::HeMesh heMesh = geometry.computeHalfEdgeMesh(); + const size_t numPrims = geometry.getNumPrims(); - // // 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; + vertices.resize(geometry.getNumVerts()); - // 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); - auto pointPositions = PAttrHandle.getAllValues(); - - std::shared_ptr pointAttr = geometry.getAttribByName(enzo::ga::AttrOwner::VERTEX, "point"); - enzo::ga::AttributeHandleInt pointAttrHandle = enzo::ga::AttributeHandleInt(pointAttr); - auto vertexPointIndices = pointAttrHandle.getAllValues(); - - std::shared_ptr vertexCountAttr = geometry.getAttribByName(enzo::ga::AttrOwner::PRIMITIVE, "vertexCount"); - enzo::ga::AttributeHandleInt vertexCountHandle = enzo::ga::AttributeHandleInt(vertexCountAttr); - std::vector vertexCounts = vertexCountHandle.getAllValues(); - - unsigned int vertexCount = 0; - unsigned int primStartVert = 0; - - for (int primIndx=0; primIndx=3) { - const unsigned v0 = primStartVert; - const unsigned v1 = primStartVert + 1; - const unsigned v2 = primStartVert + 2; + const unsigned v1 = primStartVert; + const unsigned v2 = primStartVert + 1; + const unsigned v3 = primStartVert + 2; - const enzo::bt::Vector3 pos1 = pointPositions[vertexPointIndices[v0]]; - const enzo::bt::Vector3 pos2 = pointPositions[vertexPointIndices[v1]]; - const enzo::bt::Vector3 pos3 = pointPositions[vertexPointIndices[v2]]; + const enzo::bt::Vector3 pos1 = geometry.getPosFromVert(v1); + const enzo::bt::Vector3 pos2 = geometry.getPosFromVert(v2); + const enzo::bt::Vector3 pos3 = geometry.getPosFromVert(v3); - const enzo::bt::Vector3 tang1 = (pos2-pos1).normalized(); - const enzo::bt::Vector3 tang2 = (pos3-pos1).normalized(); + enzo::bt::Vector3 tang1 = (pos2-pos1); + enzo::bt::Vector3 tang2 = (pos3-pos1); + + tang1.normalize(); + tang2.normalize(); n = tang1.cross(tang2); } for(int i=0; i< faceVertCnt; ++i) { - unsigned int pointIndex = vertexPointIndices[vertexCount]; - enzo::bt::Vector3& p = pointPositions[pointIndex]; + const unsigned int vertexCount = primStartVert+i; + enzo::bt::Vector3 p = geometry.getPosFromVert(vertexCount); - - - vertices.push_back({ + vertices[vertexCount] ={ { p.x(), p.y(), p.z()}, { n.x(), n.y(), n.z()} - }); - ++vertexCount; + }; } - primStartVert+=faceVertCnt; } diff --git a/src/OpDefs/GopTransform.cpp b/src/OpDefs/GopTransform.cpp index 6fcf55f..a15cd0d 100644 --- a/src/OpDefs/GopTransform.cpp +++ b/src/OpDefs/GopTransform.cpp @@ -5,6 +5,9 @@ #include #include #include +#include +#include +#include GopTransform::GopTransform(enzo::nt::NetworkManager* network, enzo::op::OpInfo opInfo) : GeometryOpDef(network, opInfo) @@ -20,10 +23,8 @@ void GopTransform::cookOp(enzo::op::Context context) { // copy input geometry geo::Geometry geo = context.cloneInputGeo(0); + // geo::Geometry geo; - // ---- - // create geometry start - // ---- auto PAttr = geo.getAttribByName(ga::AttrOwner::POINT, "P"); ga::AttributeHandleVector3 PAttrHandle(PAttr); @@ -33,12 +34,22 @@ void GopTransform::cookOp(enzo::op::Context context) transform.rotate(Eigen::AngleAxisd(context.evalFloatParm("rotateZ"), Eigen::Vector3d(0,0,1))); transform.translate(bt::Vector3(context.evalFloatParm("translateX"), context.evalFloatParm("translateY"), context.evalFloatParm("translateZ"))); - for(int i=0; i(0, N), [&](tbb::blocked_range range) { - enzo::bt::Vector3 pointPos = PAttrHandle.getValue(i); - pointPos = transform*pointPos; - PAttrHandle.setValue(i, pointPos); - } + for(size_t i=range.begin(); i