fixed the bottleneck....... (mesh.makeViews incurred a very heavy penalty per triangle, currently naively caching the mesh views until I can be bothered to muck up the function headers)
This commit is contained in:
parent
1e548265ad
commit
16062f8135
@ -6,7 +6,7 @@
|
|||||||
"metadata": {
|
"metadata": {
|
||||||
"holdable": true,
|
"holdable": true,
|
||||||
"physics": {
|
"physics": {
|
||||||
"mass": 0,
|
"mass": 5,
|
||||||
"type": "bounding box"
|
"type": "bounding box"
|
||||||
// "type": "mesh"
|
// "type": "mesh"
|
||||||
}
|
}
|
||||||
|
@ -348,7 +348,7 @@ namespace {
|
|||||||
if ( bvh.nodes.empty() ) return;
|
if ( bvh.nodes.empty() ) return;
|
||||||
|
|
||||||
// update leaf bounds
|
// update leaf bounds
|
||||||
#pragma omp parallel for
|
//#pragma omp parallel for
|
||||||
for ( auto i = 0; i < bvh.nodes.size(); i++ ) {
|
for ( auto i = 0; i < bvh.nodes.size(); i++ ) {
|
||||||
auto& node = bvh.nodes[i];
|
auto& node = bvh.nodes[i];
|
||||||
if ( node.getCount() == 0 ) continue;
|
if ( node.getCount() == 0 ) continue;
|
||||||
|
@ -13,8 +13,8 @@ namespace {
|
|||||||
uint32_t substeps = 0; // number of substeps per frame tick
|
uint32_t substeps = 0; // number of substeps per frame tick
|
||||||
uint32_t reserveCount = 32; // amount of elements to reserve for vectors used in this system, to-do: have it tie to a memory pool allocator
|
uint32_t reserveCount = 32; // amount of elements to reserve for vectors used in this system, to-do: have it tie to a memory pool allocator
|
||||||
|
|
||||||
// increasing these make things lag for reasons I can imagine why (having to test more triangles over just more boxes)
|
// increasing these make things lag for reasons I can imagine why
|
||||||
uint32_t broadphaseBvhCapacity = 4; // number of bodies per leaf node
|
uint32_t broadphaseBvhCapacity = 1; // number of bodies per leaf node
|
||||||
uint32_t meshBvhCapacity = 1; // number of triangles per leaf node
|
uint32_t meshBvhCapacity = 1; // number of triangles per leaf node
|
||||||
|
|
||||||
// additionally flattens a BVH for linear iteration, rather than a recursive / stack-based traversal
|
// additionally flattens a BVH for linear iteration, rather than a recursive / stack-based traversal
|
||||||
|
@ -92,7 +92,9 @@ namespace {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pod::TriangleWithNormal fetchTriangle( const uf::Mesh& mesh, size_t triID ) {
|
pod::TriangleWithNormal fetchTriangle( const uf::Mesh& mesh, size_t triID ) {
|
||||||
auto views = mesh.makeViews({"position", "normal"});
|
static thread_local uf::stl::unordered_map<const uf::Mesh*, uf::stl::vector<uf::Mesh::View>> cachedViews;
|
||||||
|
if ( cachedViews.count(&mesh) == 0 ) cachedViews[&mesh] = mesh.makeViews({"position"});
|
||||||
|
auto& views = cachedViews[&mesh];
|
||||||
UF_ASSERT(!views.empty());
|
UF_ASSERT(!views.empty());
|
||||||
|
|
||||||
// find which view contains this triangle index.
|
// find which view contains this triangle index.
|
||||||
@ -110,7 +112,6 @@ namespace {
|
|||||||
UF_ASSERT( view );
|
UF_ASSERT( view );
|
||||||
|
|
||||||
auto& positions = (*view)["position"];
|
auto& positions = (*view)["position"];
|
||||||
auto& normals = (*view)["normal"];
|
|
||||||
auto& indices = (*view)["index"];
|
auto& indices = (*view)["index"];
|
||||||
|
|
||||||
pod::TriangleWithNormal tri = { ::fetchTriangle( *view, indices, positions, triID ) };
|
pod::TriangleWithNormal tri = { ::fetchTriangle( *view, indices, positions, triID ) };
|
||||||
@ -122,6 +123,7 @@ namespace {
|
|||||||
// if body is a mesh, apply its transform to the triangles, else reorient the normal with respect to the body
|
// if body is a mesh, apply its transform to the triangles, else reorient the normal with respect to the body
|
||||||
pod::TriangleWithNormal fetchTriangle( const uf::Mesh& mesh, size_t triID, const pod::PhysicsBody& body, bool fast = false ) {
|
pod::TriangleWithNormal fetchTriangle( const uf::Mesh& mesh, size_t triID, const pod::PhysicsBody& body, bool fast = false ) {
|
||||||
auto tri = ::fetchTriangle( mesh, triID );
|
auto tri = ::fetchTriangle( mesh, triID );
|
||||||
|
|
||||||
auto transform = ::getTransform( body );
|
auto transform = ::getTransform( body );
|
||||||
|
|
||||||
if ( body.collider.type == pod::ShapeType::MESH ) {
|
if ( body.collider.type == pod::ShapeType::MESH ) {
|
||||||
|
Loading…
Reference in New Issue
Block a user