diff --git a/include/qbsp/qbsp.hh b/include/qbsp/qbsp.hh index 69a0efc6..1d961c96 100644 --- a/include/qbsp/qbsp.hh +++ b/include/qbsp/qbsp.hh @@ -666,8 +666,8 @@ struct node_t uint32_t firstleafbrush; // Q2 uint32_t numleafbrushes; int32_t area; - std::set original_brushes; // FIXME: only valid during construction - std::unordered_set original_mapbrushes; + std::vector original_brushes; // FIXME: only valid during construction + std::vector original_mapbrushes; }; void InitQBSP(int argc, const char **argv); diff --git a/qbsp/brushbsp.cc b/qbsp/brushbsp.cc index a1449de0..b70571cd 100644 --- a/qbsp/brushbsp.cc +++ b/qbsp/brushbsp.cc @@ -388,8 +388,7 @@ static void LeafNode(node_t *leafnode, std::vector> } for (auto &brush : brushes) { Q_assert(brush->original != nullptr); - leafnode->original_brushes.insert(brush->original); - leafnode->original_mapbrushes.insert(brush->original->mapbrush); + leafnode->original_brushes.push_back(brush->original); } qbsp_options.target_game->count_contents_in_stats(leafnode->contents, *stats.leafstats); diff --git a/qbsp/tree.cc b/qbsp/tree.cc index 08690cf5..1b02e3cc 100644 --- a/qbsp/tree.cc +++ b/qbsp/tree.cc @@ -78,10 +78,24 @@ void FreeTreePortals(tree_t *tree) static void ConvertNodeToLeaf(node_t *node, const contentflags_t &contents) { // merge the children's brush lists - node->original_mapbrushes = node->children[0]->original_mapbrushes; - node->original_mapbrushes.insert(node->children[1]->original_mapbrushes.begin(), node->children[1]->original_mapbrushes.end()); + node->original_brushes = std::move(node->children[0]->original_brushes); + node->original_brushes.insert(node->original_brushes.end(), node->children[1]->original_brushes.begin(), node->children[1]->original_brushes.end()); - node->original_brushes.clear(); + if (node->original_brushes.size()) { + std::sort(node->original_brushes.begin(), node->original_brushes.end(), bspbrush_t_less()); + auto unique_begin = std::unique(node->original_brushes.begin(), node->original_brushes.end()); + node->original_brushes.erase(unique_begin, node->original_brushes.end()); + + // migrate it over to mapbrushes + node->original_mapbrushes.reserve(node->original_brushes.size()); + + for (auto &b : node->original_brushes) { + node->original_mapbrushes.push_back(b->mapbrush); + } + + // clear original_brushes since we no longer need it + node->original_brushes.clear(); + } node->is_leaf = true; @@ -99,7 +113,6 @@ static void ConvertNodeToLeaf(node_t *node, const contentflags_t &contents) static void PruneNodes_R(node_t *node, std::atomic &count_pruned) { if (node->is_leaf) { - node->original_brushes.clear(); return; }