light: use DecompressAllVis() for getting visdata

This commit is contained in:
Eric Wasylishen 2023-01-09 00:43:49 -07:00
parent fe566f4715
commit 6b707b6d5a
3 changed files with 18 additions and 27 deletions

View File

@ -414,6 +414,8 @@ extern std::vector<uint8_t> filebase;
extern std::vector<uint8_t> lit_filebase; extern std::vector<uint8_t> lit_filebase;
extern std::vector<uint8_t> lux_filebase; extern std::vector<uint8_t> lux_filebase;
const std::unordered_map<int, std::vector<uint8_t>> &UncompressedVis();
bool IsOutputtingSupplementaryData(); bool IsOutputtingSupplementaryData();
std::vector<std::unique_ptr<lightsurf_t>> &LightSurfaces(); std::vector<std::unique_ptr<lightsurf_t>> &LightSurfaces();

View File

@ -91,6 +91,13 @@ static int lux_file_p;
/// offset of end of space for luxfile data /// offset of end of space for luxfile data
static int lux_file_end; static int lux_file_end;
static std::unordered_map<int, std::vector<uint8_t>> all_uncompressed_vis;
const std::unordered_map<int, std::vector<uint8_t>> &UncompressedVis()
{
return all_uncompressed_vis;
}
std::vector<modelinfo_t *> modelinfo; std::vector<modelinfo_t *> modelinfo;
std::vector<const modelinfo_t *> tracelist; std::vector<const modelinfo_t *> tracelist;
std::vector<const modelinfo_t *> selfshadowlist; std::vector<const modelinfo_t *> selfshadowlist;
@ -1526,6 +1533,7 @@ static void ResetLight()
lux_file_p = 0; lux_file_p = 0;
lux_file_end = 0; lux_file_end = 0;
all_uncompressed_vis.clear();
modelinfo.clear(); modelinfo.clear();
tracelist.clear(); tracelist.clear();
selfshadowlist.clear(); selfshadowlist.clear();
@ -1634,6 +1642,7 @@ int light_main(int argc, const char **argv)
light_options.postinitialize(argc, argv); light_options.postinitialize(argc, argv);
all_uncompressed_vis = DecompressAllVis(&bsp, true);
FindModelInfo(&bsp); FindModelInfo(&bsp);
FindDebugFace(&bsp); FindDebugFace(&bsp);

View File

@ -42,7 +42,7 @@ std::atomic<uint32_t> total_light_rays, total_light_ray_hits, total_samplepoints
std::atomic<uint32_t> total_bounce_rays, total_bounce_ray_hits; std::atomic<uint32_t> total_bounce_rays, total_bounce_ray_hits;
std::atomic<uint32_t> total_surflight_rays, total_surflight_ray_hits; // mxd std::atomic<uint32_t> total_surflight_rays, total_surflight_ray_hits; // mxd
std::atomic<uint32_t> fully_transparent_lightmaps; std::atomic<uint32_t> fully_transparent_lightmaps;
bool warned_about_light_map_overflow, warned_about_light_style_overflow; static bool warned_about_light_map_overflow, warned_about_light_style_overflow;
/* Debug helper - move elsewhere? */ /* Debug helper - move elsewhere? */
void PrintFaceInfo(const mface_t *face, const mbsp_t *bsp) void PrintFaceInfo(const mface_t *face, const mbsp_t *bsp)
@ -439,39 +439,19 @@ static bool Mod_LeafPvs(const mbsp_t *bsp, const mleaf_t *leaf, uint8_t *out)
memset(out, 0xFF, num_pvsclusterbytes); memset(out, 0xFF, num_pvsclusterbytes);
if (bsp->loadversion->game->id == GAME_QUAKE_II) { if (bsp->loadversion->game->id == GAME_QUAKE_II) {
if (leaf->cluster < 0) { auto it = UncompressedVis().find(leaf->cluster);
if (it == UncompressedVis().end()) {
return false; return false;
} }
if (leaf->cluster >= bsp->dvis.bit_offsets.size() || memcpy(out, it->second.data(), num_pvsclusterbytes);
bsp->dvis.get_bit_offset(VIS_PVS, leaf->cluster) >= bsp->dvis.bits.size()) {
logging::print("Mod_LeafPvs: invalid visofs for cluster {}\n", leaf->cluster);
return false;
}
DecompressVis(bsp->dvis.bits.data() + bsp->dvis.get_bit_offset(VIS_PVS, leaf->cluster),
bsp->dvis.bits.data() + bsp->dvis.bits.size(), out, out + num_pvsclusterbytes);
} else { } else {
if (leaf->visofs < 0) { auto it = UncompressedVis().find(leaf->visofs);
if (it == UncompressedVis().end()) {
return false; return false;
} }
const ptrdiff_t leafnum = (leaf - bsp->dleafs.data()); memcpy(out, it->second.data(), num_pvsclusterbytes);
// this is confusing.. "visleaf numbers" are the leaf number minus 1.
// they also don't go as high, bsp->dmodels[0].visleafs instead of bsp->numleafs
const int visleaf = leafnum - 1;
if (visleaf < 0 || visleaf >= bsp->dmodels[0].visleafs) {
return false;
}
if (leaf->visofs >= bsp->dvis.bits.size()) {
logging::print("Mod_LeafPvs: invalid visofs for leaf {}\n", leafnum);
return false;
}
DecompressVis(bsp->dvis.bits.data() + leaf->visofs, bsp->dvis.bits.data() + bsp->dvis.bits.size(), out,
out + num_pvsclusterbytes);
} }
return true; return true;