Octree triangleselector nodes now release memory they don't need.

Before they could get pretty large as each node used the maximum memory it started with.
Also some changes to avoid unnecessary memory re-alloction when creating it.
Thanks @Squarefox for reporting the problem and proposing a patch.
See discussion at: http://irrlicht.sourceforge.net/forum/viewtopic.php?f=7&t=52484


git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@5813 dfc29bdd-3216-0410-991c-e03cc46cb475
master
cutealien 2019-05-26 16:03:08 +00:00
parent 574357cb28
commit dcfe4bcc0a
1 changed files with 9 additions and 7 deletions

View File

@ -86,17 +86,17 @@ void COctreeTriangleSelector::constructOctree(SOctreeNode* node)
node->Box.addInternalPoint(node->Triangles[i].pointC);
}
const core::vector3df& middle = node->Box.getCenter();
core::vector3df edges[8];
node->Box.getEdges(edges);
core::aabbox3d<f32> box;
core::array<core::triangle3df> keepTriangles;
// calculate children
if (!node->Box.isEmpty() && (s32)node->Triangles.size() > MinimalPolysPerNode)
{
const core::vector3df& middle = node->Box.getCenter();
core::vector3df edges[8];
node->Box.getEdges(edges);
core::aabbox3d<f32> box;
core::array<core::triangle3df> keepTriangles(node->Triangles.size()); // reserving enough memory, so we don't get re-allocations per child
for (s32 ch=0; ch<8; ++ch)
{
box.reset(middle);
@ -122,6 +122,8 @@ void COctreeTriangleSelector::constructOctree(SOctreeNode* node)
node->Triangles.set_used(keepTriangles.size());
keepTriangles.set_used(0);
}
keepTriangles.clear(); // release memory early, for large meshes it can matter.
node->Triangles.reallocate(node->Triangles.size(), true); // shrink memory to minimum necessary
// Note: We use an extra loop to construct child-nodes instead of doing
// that in above loop to avoid memory fragmentation which happens if