feat: multithread building vbo
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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];
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user