From f6ba5d77f9679dfc7a746864d0b14f620e237c50 Mon Sep 17 00:00:00 2001 From: Jonathan Date: Sat, 21 May 2022 02:45:30 -0400 Subject: [PATCH] allow recompilation of PHS from PVS data via -phsonly --- include/vis/vis.hh | 1 + vis/vis.cc | 50 ++++++++++++++++++++++++++++++++-------------- 2 files changed, 36 insertions(+), 15 deletions(-) diff --git a/include/vis/vis.hh b/include/vis/vis.hh index 5b5855fa..ab771014 100644 --- a/include/vis/vis.hh +++ b/include/vis/vis.hh @@ -229,6 +229,7 @@ public: setting_scalar visdist{ this, "visdist", 0.0, &advanced_group, "control the distance required for a portal to be considered seen"}; setting_bool nostate{this, "nostate", false, &advanced_group, "ignore saved state files, for forced re-runs"}; + setting_bool phsonly{this, "phsonly", false, &advanced_group, "re-calculate the PHS of a Quake II BSP without touching the PVS"}; fs::path sourceMap; diff --git a/vis/vis.cc b/vis/vis.cc index dfc6c239..acc98b1c 100644 --- a/vis/vis.cc +++ b/vis/vis.cc @@ -867,26 +867,46 @@ int vis_main(int argc, const char **argv) mbsp_t &bsp = std::get(bspdata.bsp); - portalfile = fs::path(options.sourceMap).replace_extension("prt"); - LoadPortals(portalfile, &bsp); + if (options.phsonly.value()) + { + if (bsp.loadversion->game->id != GAME_QUAKE_II) + { + logging::print("error: need a Q2-esque BSP for -phsonly"); + } + else + { + portalleafs = bsp.dvis.bit_offsets.size(); + leafbytes = ((portalleafs + 63) & ~63) >> 3; + leaflongs = leafbytes / sizeof(long); - statefile = fs::path(options.sourceMap).replace_extension("vis"); - statetmpfile = fs::path(options.sourceMap).replace_extension("vi0"); - - if (bsp.loadversion->game->id != GAME_QUAKE_II) { - uncompressed = new uint8_t[portalleafs * leafbytes_real]{}; - } else { - uncompressed_q2 = new uint8_t[portalleafs * leafbytes]{}; + if (bsp.loadversion->game->id == GAME_QUAKE_II) { + originalvismapsize = portalleafs * ((portalleafs + 7) / 8); + } + } } + else + { + portalfile = fs::path(options.sourceMap).replace_extension("prt"); + LoadPortals(portalfile, &bsp); - CalcVis(&bsp); + statefile = fs::path(options.sourceMap).replace_extension("vis"); + statetmpfile = fs::path(options.sourceMap).replace_extension("vi0"); - logging::print("c_noclip: {}\n", c_noclip); - logging::print("c_chains: {}\n", c_chains); + if (bsp.loadversion->game->id != GAME_QUAKE_II) { + uncompressed = new uint8_t[portalleafs * leafbytes_real]{}; + } else { + uncompressed_q2 = new uint8_t[portalleafs * leafbytes]{}; + } - bsp.dvis.bits.resize(vismap_p - bsp.dvis.bits.data()); - bsp.dvis.bits.shrink_to_fit(); - logging::print("visdatasize:{} compressed from {}\n", bsp.dvis.bits.size(), originalvismapsize); + CalcVis(&bsp); + + logging::print("c_noclip: {}\n", c_noclip); + logging::print("c_chains: {}\n", c_chains); + + bsp.dvis.bits.resize(vismap_p - bsp.dvis.bits.data()); + bsp.dvis.bits.shrink_to_fit(); + logging::print("visdatasize:{} compressed from {}\n", bsp.dvis.bits.size(), originalvismapsize); + } // no ambient sounds for Q2 if (bsp.loadversion->game->id != GAME_QUAKE_II) {