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