From 40c37438cecb488ce7b601cdd9809b13064d980c Mon Sep 17 00:00:00 2001 From: parker Date: Sun, 3 Aug 2025 03:47:51 +0100 Subject: [PATCH] feat: multithread building vbo --- src/Engine/Operator/AttributeHandle.h | 2 +- src/Engine/Operator/Geometry.cpp | 27 ++++----- src/Engine/Operator/Geometry.h | 3 +- src/Gui/Viewport/GLMesh.cpp | 81 ++++++++++++++------------- 4 files changed, 59 insertions(+), 54 deletions(-) diff --git a/src/Engine/Operator/AttributeHandle.h b/src/Engine/Operator/AttributeHandle.h index a2bcc87..e3e0a49 100644 --- a/src/Engine/Operator/AttributeHandle.h +++ b/src/Engine/Operator/AttributeHandle.h @@ -75,7 +75,7 @@ public: { // TODO:protect against invalid positions // TODO: cast types - return data_[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 03228f6..069fb3e 100644 --- a/src/Engine/Operator/Geometry.cpp +++ b/src/Engine/Operator/Geometry.cpp @@ -170,24 +170,25 @@ enzo::geo::HeMesh geo::Geometry::computeHalfEdgeMesh() return heMesh; } -unsigned int geo::Geometry::getPrimStartVertex(ga::Offset primOffset) +ga::Offset geo::Geometry::getPrimStartVertex(ga::Offset primOffset) const { - 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 eb97fb8..833c97e 100644 --- a/src/Engine/Operator/Geometry.h +++ b/src/Engine/Operator/Geometry.h @@ -31,14 +31,15 @@ public: std::vector derivePointNormals(); HeMesh computeHalfEdgeMesh(); // returns the first vertex of the primitive - unsigned int getPrimStartVertex(ga::Offset primOffset); void addFace(std::initializer_list pointOffsets); + ga::Offset getPrimStartVertex(ga::Offset primOffset) const; 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; + void computePrimStartVertices(); private: using attribVector = std::vector>; attribVector& getAttributeStore(ga::AttributeOwner& owner); diff --git a/src/Gui/Viewport/GLMesh.cpp b/src/Gui/Viewport/GLMesh.cpp index 2078ade..46a9d61 100644 --- a/src/Gui/Viewport/GLMesh.cpp +++ b/src/Gui/Viewport/GLMesh.cpp @@ -5,6 +5,8 @@ #include "Engine/Operator/Geometry.h" #include "Engine/Types.h" #include +#include +#include #include "icecream.hpp" @@ -61,53 +63,54 @@ void GLMesh::setPosBuffer(enzo::geo::Geometry& geometry) const size_t numPrims = geometry.getNumPrims(); vertices.resize(geometry.getNumVerts()); + geometry.computePrimStartVertices(); - - for (int primOffset=0; primOffset(0, numPrims), [&](tbb::blocked_range range) { - const unsigned int primStartVert = geometry.getPrimStartVertex(primOffset); - auto faceIndex = primOffset; - - int faceVertCnt = geometry.getPrimVertCount(primOffset); - - enzo::bt::Vector3 n; - - // compute normal - if(faceVertCnt>=3) + for (int primOffset=range.begin(); primOffset=3) + { + const unsigned v1 = primStartVert; + const unsigned v2 = primStartVert + 1; + const unsigned v3 = primStartVert + 2; - tang1.normalize(); - tang2.normalize(); + const enzo::bt::Vector3 pos1 = geometry.getPosFromVert(v1); + const enzo::bt::Vector3 pos2 = geometry.getPosFromVert(v2); + const enzo::bt::Vector3 pos3 = geometry.getPosFromVert(v3); + + enzo::bt::Vector3 tang1 = (pos2-pos1); + enzo::bt::Vector3 tang2 = (pos3-pos1); + + tang1.normalize(); + tang2.normalize(); + + Normal = tang1.cross(tang2); + } + + for(int i=0; i< faceVertCnt; ++i) + { + const unsigned int vertexCount = primStartVert+i; + enzo::bt::Vector3 p = geometry.getPosFromVert(vertexCount); + + vertices[vertexCount] ={ + { p.x(), + p.y(), + p.z()}, + { Normal.x(), + Normal.y(), + Normal.z()} + }; + } - n = tang1.cross(tang2); } - - for(int i=0; i< faceVertCnt; ++i) - { - const unsigned int vertexCount = primStartVert+i; - enzo::bt::Vector3 p = geometry.getPosFromVert(vertexCount); - - vertices[vertexCount] ={ - { p.x(), - p.y(), - p.z()}, - { n.x(), - n.y(), - n.z()} - }; - } - - } + }); glBufferData(GL_ARRAY_BUFFER, vertices.size()*sizeof(Vertex), vertices.data(), GL_STATIC_DRAW); unbind();