go back to vector for brush lists

This commit is contained in:
Jonathan 2022-08-09 16:00:51 -04:00
parent b37917c9ca
commit 697e3325f8
3 changed files with 20 additions and 8 deletions

View File

@ -666,8 +666,8 @@ struct node_t
uint32_t firstleafbrush; // Q2
uint32_t numleafbrushes;
int32_t area;
std::set<bspbrush_t *, bspbrush_t_less> original_brushes; // FIXME: only valid during construction
std::unordered_set<const mapbrush_t *> original_mapbrushes;
std::vector<bspbrush_t *> original_brushes; // FIXME: only valid during construction
std::vector<const mapbrush_t *> original_mapbrushes;
};
void InitQBSP(int argc, const char **argv);

View File

@ -388,8 +388,7 @@ static void LeafNode(node_t *leafnode, std::vector<std::unique_ptr<bspbrush_t>>
}
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);

View File

@ -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<int32_t> &count_pruned)
{
if (node->is_leaf) {
node->original_brushes.clear();
return;
}