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: cast types
return data_[pos];
return (*data_)[pos];
}
void setValue(size_t pos, const T& value)

View File

@@ -170,13 +170,16 @@ 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
{
return primStarts_[primOffset];
}
// TODO: handle this automatically
void geo::Geometry::computePrimStartVertices()
{
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<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();
HeMesh computeHalfEdgeMesh();
// returns the first vertex of the primitive
unsigned int getPrimStartVertex(ga::Offset primOffset);
void addFace(std::initializer_list<ga::Offset> 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<std::shared_ptr<ga::Attribute>>;
attribVector& getAttributeStore(ga::AttributeOwner& owner);

View File

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