feat: multithread building vbo

This commit is contained in:
parker
2025-08-03 03:47:51 +01:00
parent 488ff9ff72
commit 40c37438ce
4 changed files with 59 additions and 54 deletions

View File

@@ -75,7 +75,7 @@ public:
{ {
// TODO:protect against invalid positions // TODO:protect against invalid positions
// TODO: cast types // TODO: cast types
return data_[pos]; return (*data_)[pos];
} }
void setValue(size_t pos, const T& value) void setValue(size_t pos, const T& value)

View File

@@ -170,13 +170,16 @@ enzo::geo::HeMesh geo::Geometry::computeHalfEdgeMesh()
return heMesh; return heMesh;
} }
unsigned int geo::Geometry::getPrimStartVertex(ga::Offset primOffset) ga::Offset geo::Geometry::getPrimStartVertex(ga::Offset primOffset) const
{
return primStarts_[primOffset];
}
// TODO: handle this automatically
void geo::Geometry::computePrimStartVertices()
{ {
const ga::Offset handleSize = vertexCountHandlePrim_.getSize(); 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; bt::intT primStart = 0;
for(size_t i=0; i<handleSize; ++i) for(size_t i=0; i<handleSize; ++i)
{ {
@@ -185,8 +188,6 @@ unsigned int geo::Geometry::getPrimStartVertex(ga::Offset primOffset)
} }
} }
return primStarts_[primOffset];
}

View File

@@ -31,14 +31,15 @@ public:
std::vector<bt::Vector3> derivePointNormals(); std::vector<bt::Vector3> derivePointNormals();
HeMesh computeHalfEdgeMesh(); HeMesh computeHalfEdgeMesh();
// returns the first vertex of the primitive // returns the first vertex of the primitive
unsigned int getPrimStartVertex(ga::Offset primOffset);
void addFace(std::initializer_list<ga::Offset> pointOffsets); void addFace(std::initializer_list<ga::Offset> pointOffsets);
ga::Offset getPrimStartVertex(ga::Offset primOffset) const;
bt::Vector3 getPosFromVert(ga::Offset vertexOffset) const; bt::Vector3 getPosFromVert(ga::Offset vertexOffset) const;
bt::Vector3 getPointPos(ga::Offset pointOffset) const; bt::Vector3 getPointPos(ga::Offset pointOffset) const;
unsigned int getPrimVertCount(ga::Offset primOffset) const; unsigned int getPrimVertCount(ga::Offset primOffset) const;
ga::Offset getNumPrims() const; ga::Offset getNumPrims() const;
ga::Offset getNumVerts() const; ga::Offset getNumVerts() const;
void computePrimStartVertices();
private: private:
using attribVector = std::vector<std::shared_ptr<ga::Attribute>>; using attribVector = std::vector<std::shared_ptr<ga::Attribute>>;
attribVector& getAttributeStore(ga::AttributeOwner& owner); attribVector& getAttributeStore(ga::AttributeOwner& owner);

View File

@@ -5,6 +5,8 @@
#include "Engine/Operator/Geometry.h" #include "Engine/Operator/Geometry.h"
#include "Engine/Types.h" #include "Engine/Types.h"
#include <CGAL/Polygon_mesh_processing/compute_normal.h> #include <CGAL/Polygon_mesh_processing/compute_normal.h>
#include <oneapi/tbb/blocked_range.h>
#include <oneapi/tbb/parallel_for.h>
#include "icecream.hpp" #include "icecream.hpp"
@@ -61,16 +63,16 @@ void GLMesh::setPosBuffer(enzo::geo::Geometry& geometry)
const size_t numPrims = geometry.getNumPrims(); const size_t numPrims = geometry.getNumPrims();
vertices.resize(geometry.getNumVerts()); vertices.resize(geometry.getNumVerts());
geometry.computePrimStartVertices();
tbb::parallel_for(tbb::blocked_range<size_t>(0, numPrims), [&](tbb::blocked_range<size_t> range)
for (int primOffset=0; primOffset<numPrims; ++primOffset)
{ {
const unsigned int primStartVert = geometry.getPrimStartVertex(primOffset); for (int primOffset=range.begin(); primOffset<range.end(); ++primOffset)
auto faceIndex = primOffset; {
const enzo::ga::Offset primStartVert = geometry.getPrimStartVertex(primOffset);
const unsigned int faceVertCnt = geometry.getPrimVertCount(primOffset);
int faceVertCnt = geometry.getPrimVertCount(primOffset); enzo::bt::Vector3 Normal;
enzo::bt::Vector3 n;
// compute normal // compute normal
if(faceVertCnt>=3) if(faceVertCnt>=3)
@@ -89,7 +91,7 @@ void GLMesh::setPosBuffer(enzo::geo::Geometry& geometry)
tang1.normalize(); tang1.normalize();
tang2.normalize(); tang2.normalize();
n = tang1.cross(tang2); Normal = tang1.cross(tang2);
} }
for(int i=0; i< faceVertCnt; ++i) for(int i=0; i< faceVertCnt; ++i)
@@ -101,13 +103,14 @@ void GLMesh::setPosBuffer(enzo::geo::Geometry& geometry)
{ p.x(), { p.x(),
p.y(), p.y(),
p.z()}, p.z()},
{ n.x(), { Normal.x(),
n.y(), Normal.y(),
n.z()} Normal.z()}
}; };
} }
} }
});
glBufferData(GL_ARRAY_BUFFER, vertices.size()*sizeof(Vertex), vertices.data(), GL_STATIC_DRAW); glBufferData(GL_ARRAY_BUFFER, vertices.size()*sizeof(Vertex), vertices.data(), GL_STATIC_DRAW);
unbind(); unbind();