remove file_order; we can infer this from the pointers now

remove unnecessary early microbrush check, use microbrush option value on later one
This commit is contained in:
Jonathan 2022-08-10 02:22:32 -04:00
parent bca6bda7c3
commit faf9173f10
4 changed files with 13 additions and 10 deletions

View File

@ -57,7 +57,6 @@ struct bspbrush_t
*/ */
bspbrush_t *original; bspbrush_t *original;
mapbrush_t *mapbrush; mapbrush_t *mapbrush;
uint32_t file_order;
aabb3d bounds; aabb3d bounds;
int side, testside; // side of node during construction int side, testside; // side of node during construction
std::vector<side_t> sides; std::vector<side_t> sides;

View File

@ -590,7 +590,7 @@ static twosided<std::unique_ptr<bspbrush_t>> SplitBrush(std::unique_ptr<bspbrush
for (i = 0; i < 2; i++) { for (i = 0; i < 2; i++) {
v1 = BrushVolume(*result[i]); v1 = BrushVolume(*result[i]);
if (v1 < 1.0) { if (v1 < qbsp_options.microvolume.value()) {
result[i] = nullptr; result[i] = nullptr;
stats.c_tinyvolumes++; stats.c_tinyvolumes++;
} }
@ -1021,10 +1021,10 @@ static void BuildTree_r(tree_t *tree, node_t *node, std::vector<std::unique_ptr<
} }
// to save time/memory we can destroy node's volume at this point // to save time/memory we can destroy node's volume at this point
auto children_volumes = SplitBrush(std::move(node->volume), bestplane.value(), stats); auto children_volumes = SplitBrush(std::move(node->volume), bestplane.value(), stats);
node->volume = nullptr; node->volume = nullptr;
node->children[0]->volume = std::move(children_volumes[0]); node->children[0]->volume = std::move(children_volumes[0]);
node->children[1]->volume = std::move(children_volumes[1]); node->children[1]->volume = std::move(children_volumes[1]);
// recursively process children // recursively process children
tbb::task_group g; tbb::task_group g;
@ -1049,6 +1049,7 @@ static std::unique_ptr<tree_t> BrushBSP_internal(mapentity_t *entity, std::vecto
for (const auto &b : brushlist) { for (const auto &b : brushlist) {
c_brushes++; c_brushes++;
#if 0
// fixme-brushbsp: why does this just print and do nothing? should // fixme-brushbsp: why does this just print and do nothing? should
// the brush be removed? // the brush be removed?
double volume = BrushVolume(*b); double volume = BrushVolume(*b);
@ -1056,6 +1057,7 @@ static std::unique_ptr<tree_t> BrushBSP_internal(mapentity_t *entity, std::vecto
logging::print("WARNING: {}: microbrush\n", logging::print("WARNING: {}: microbrush\n",
b->original->mapbrush->line); b->original->mapbrush->line);
} }
#endif
for (side_t &side : b->sides) { for (side_t &side : b->sides) {
if (side.bevel) if (side.bevel)
@ -1106,7 +1108,7 @@ static std::unique_ptr<tree_t> BrushBSP_internal(mapentity_t *entity, std::vecto
auto node = tree->create_node(); auto node = tree->create_node();
node->volume = BrushFromBounds(tree->bounds.grow(SIDESPACE)); node->volume = BrushFromBounds(tree->bounds.grow(SIDESPACE));
node->bounds = tree->bounds.grow(SIDESPACE); node->bounds = tree->bounds.grow(SIDESPACE);
tree->headnode = node; tree->headnode = node;

View File

@ -450,11 +450,13 @@ static void ProcessEntity(mapentity_t *entity, const int hullnum)
*/ */
Brush_LoadEntity(entity, hullnum, brushes); Brush_LoadEntity(entity, hullnum, brushes);
// assign brush file order size_t num_sides = 0;
for (size_t i = 0; i < brushes.size(); ++i) { for (size_t i = 0; i < brushes.size(); ++i) {
brushes[i]->file_order = i; num_sides += brushes[i]->sides.size();
} }
logging::print(logging::flag::STAT, "INFO: calculating BSP for {} brushes with {} sides\n", brushes.size(), num_sides);
// entity->brushes = ChopBrushes(entity->brushes); // entity->brushes = ChopBrushes(entity->brushes);
// if (entity == map.world_entity() && hullnum <= 0) { // if (entity == map.world_entity() && hullnum <= 0) {

View File

@ -83,7 +83,7 @@ static void ConvertNodeToLeaf(node_t *node, const contentflags_t &contents)
node->original_brushes.insert(node->original_brushes.end(), node->children[base ^ 1]->original_brushes.begin(), node->children[base ^ 1]->original_brushes.end()); node->original_brushes.insert(node->original_brushes.end(), node->children[base ^ 1]->original_brushes.begin(), node->children[base ^ 1]->original_brushes.end());
std::sort(node->original_brushes.begin(), node->original_brushes.end(), [](const bspbrush_t *a, const bspbrush_t *b) { std::sort(node->original_brushes.begin(), node->original_brushes.end(), [](const bspbrush_t *a, const bspbrush_t *b) {
return a->file_order < b->file_order; return a->mapbrush < b->mapbrush;
}); });
auto unique = std::unique(node->original_brushes.begin(), node->original_brushes.end()); auto unique = std::unique(node->original_brushes.begin(), node->original_brushes.end());
node->original_brushes.erase(unique, node->original_brushes.end()); node->original_brushes.erase(unique, node->original_brushes.end());