From 70706b4923c7ed701f9128d9706bc3b7a2fe01e4 Mon Sep 17 00:00:00 2001 From: Eric Wasylishen Date: Sat, 21 May 2022 13:53:05 -0600 Subject: [PATCH] outside.cc: make FindOccupiedClusters safe to call more than once --- qbsp/outside.cc | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/qbsp/outside.cc b/qbsp/outside.cc index 897ab099..8a0fe1c7 100644 --- a/qbsp/outside.cc +++ b/qbsp/outside.cc @@ -323,10 +323,8 @@ FindOccupiedLeafs sets node->occupant ================== */ -std::vector FindOccupiedClusters(node_t *headnode) +static void MarkOccupiedClusters(node_t *headnode) { - std::vector result; - for (int i = 1; i < map.entities.size(); i++) { mapentity_t *entity = &map.entities.at(i); @@ -347,10 +345,33 @@ std::vector FindOccupiedClusters(node_t *headnode) } cluster->occupant = entity; + } +} - result.push_back(cluster); +static void FindOccupiedClusters_R(node_t *node, std::vector& result) +{ + if (node->planenum != PLANENUM_LEAF) { + FindOccupiedClusters_R(node->children[0], result); + FindOccupiedClusters_R(node->children[1], result); + return; } + if (node->occupant) { + result.push_back(node); + } +} + +/* +================== +FindOccupiedClusters + +Requires that FillOutside has run +================== +*/ +std::vector FindOccupiedClusters(node_t *headnode) +{ + std::vector result; + FindOccupiedClusters_R(headnode, result); return result; } @@ -508,6 +529,7 @@ bool FillOutside(mapentity_t *entity, node_t *node, const int hullnum) ClearOccupied_r(node); // Sets leaf->occupant + MarkOccupiedClusters(node); const std::vector occupied_clusters = FindOccupiedClusters(node); for (auto *occupied_cluster : occupied_clusters) {