Octree::Node::Node(const std::unordered_map<std::size_t, Triangle3D_t>& triangles, const AxisAlignedBox& box, std::size_t leafTriangles, std::size_t currentDepth, std::size_t maxDepth) : box(box), isLeaf(false) { std::size_t numContainedTriangles = triangles.size(); if (numContainedTriangles > 0) { containedTriangles.reserve(numContainedTriangles); for (const std::unordered_map<std::size_t, Triangle3D_t>::value_type& containedTriangle : triangles) { containedTriangles.push_back(containedTriangle.first); } if ((numContainedTriangles > leafTriangles) && (currentDepth < maxDepth)) { std::array<AxisAlignedBox, 8> octants; box.OctantSplit(octants); for (int octantIndex = 0; octantIndex < 8; ++octantIndex) { std::unordered_map<std::size_t, Triangle3D_t> octantTriangles; for (const std::unordered_map<std::size_t, Triangle3D_t>::value_type& containedTriangle : triangles) { if (octants[octantIndex].Intersects(containedTriangle.second)) { octantTriangles[containedTriangle.first] = containedTriangle.second; } } children[octantIndex] = std::make_unique<Node>(octantTriangles, octants[octantIndex], leafTriangles, currentDepth + 1, maxDepth); } } else { isLeaf = true; } } else { isLeaf = true; } }