79 const auto prim_count =
bboxes_.size();
82 bvh.nodes.reserve((2 * prim_count) /
config_.min_leaf_size);
83 bvh.nodes.emplace_back();
86 std::stack<WorkItem> stack;
87 stack.push(
WorkItem { 0, 0, prim_count });
88 while (!stack.empty()) {
89 auto item = stack.top();
92 auto& node =
bvh.nodes[item.node_id];
93 if (item.size() >
config_.min_leaf_size) {
94 if (
auto split_pos =
try_split(node.get_bbox(), item.begin, item.end)) {
95 auto first_child =
bvh.nodes.size();
98 bvh.nodes.resize(first_child + 2);
102 auto first_range = std::make_pair(item.begin, *split_pos);
103 auto second_range = std::make_pair(*split_pos, item.end);
109 if (first_bbox.get_half_area() < second_bbox.get_half_area()) {
110 std::swap(first_bbox, second_bbox);
111 std::swap(first_range, second_range);
114 auto first_item =
WorkItem { first_child + 0, first_range.first, first_range.second };
115 auto second_item =
WorkItem { first_child + 1, second_range.first, second_range.second };
116 bvh.nodes[first_child + 0].set_bbox(first_bbox);
117 bvh.nodes[first_child + 1].set_bbox(second_bbox);
120 if (first_item.size() < second_item.size())
121 std::swap(first_item, second_item);
123 stack.push(first_item);
124 stack.push(second_item);
133 bvh.nodes.shrink_to_fit();