diff --git a/common/litfile.cc b/common/litfile.cc index 2bfc6f53..313c93f4 100644 --- a/common/litfile.cc +++ b/common/litfile.cc @@ -126,7 +126,7 @@ qvec3f HDR_UnpackE5BRG9(uint32_t packed) return qvec3f(red_int, green_int, blue_int) * multiplier; } -std::vector LoadLitFile(const fs::path &path) +std::variant LoadLitFile(const fs::path &path) { std::ifstream stream(path, std::ios_base::in | std::ios_base::binary); stream >> endianness; @@ -139,16 +139,23 @@ std::vector LoadLitFile(const fs::path &path) int version; stream >= version; - if (version != 1) { - throw std::runtime_error("invalid lit version"); + if (version == LIT_VERSION) { + std::vector litdata; + while (stream.good()) { + uint8_t b; + stream >= b; + litdata.push_back(b); + } + return {lit1_t{.rgbdata = std::move(litdata)}}; + } else if (version == LIT_VERSION_E5BGR9) { + std::vector litdata; + while (stream.good()) { + uint32_t sample; + stream >= sample; + litdata.push_back(sample); + } + return {lit_hdr{.samples = std::move(litdata)}}; } - std::vector litdata; - while (stream.good()) { - uint8_t b; - stream >= b; - litdata.push_back(b); - } - - return litdata; + throw std::runtime_error("invalid lit version"); } diff --git a/include/common/litfile.hh b/include/common/litfile.hh index 172b227b..24a9e91d 100644 --- a/include/common/litfile.hh +++ b/include/common/litfile.hh @@ -23,6 +23,7 @@ #include #include #include +#include constexpr int32_t LIT_VERSION = 1; constexpr int32_t LIT_VERSION_E5BGR9 = (0x00010000 | LIT_VERSION); @@ -55,4 +56,14 @@ struct litheader_t uint32_t HDR_PackE5BRG9(qvec3f rgb); qvec3f HDR_UnpackE5BRG9(uint32_t packed); -std::vector LoadLitFile(const fs::path &path); +struct lit1_t { + // 3 bytes (r,g,b) per sample + std::vector rgbdata; +}; + +struct lit_hdr { + // 1 packed e5bgr9 uint32_t per sample + std::vector samples; +}; + +std::variant LoadLitFile(const fs::path &path); diff --git a/lightpreview/mainwindow.cpp b/lightpreview/mainwindow.cpp index 6a0b93a4..6c7b3a11 100644 --- a/lightpreview/mainwindow.cpp +++ b/lightpreview/mainwindow.cpp @@ -933,7 +933,12 @@ int MainWindow::compileMap(const QString &file, bool is_reload) lit_path.replace_extension(".lit"); try { - m_litdata = LoadLitFile(lit_path); + auto lit_variant = LoadLitFile(lit_path); + + if (auto* lit1_ptr = std::get_if(&lit_variant)) { + m_litdata = std::move(lit1_ptr->rgbdata); + } + // FIXME: handle hdr variant } catch (const std::runtime_error &error) { logging::print("error loading lit: {}", error.what()); m_litdata = {}; diff --git a/tests/test_ltface.cc b/tests/test_ltface.cc index 6422c646..48177938 100644 --- a/tests/test_ltface.cc +++ b/tests/test_ltface.cc @@ -118,9 +118,17 @@ testresults_lit_t QbspVisLight_Q1( auto lit_path = fs::path(test_quake_maps_dir) / name.filename(); lit_path.replace_extension(".lit"); - std::vector litdata = LoadLitFile(lit_path); + auto lit_variant = LoadLitFile(lit_path); + std::vector lit_bytes; - return testresults_lit_t{.bsp = res.bsp, .bspx = res.bspx, .lit = litdata}; + if (auto* lit1_ptr = std::get_if(&lit_variant)) { + lit_bytes = std::move(lit1_ptr->rgbdata); + } + // FIXME: handle hdr variant + + return testresults_lit_t{.bsp = std::move(res.bsp), + .bspx = std::move(res.bspx), + .lit = std::move(lit_bytes)}; } testresults_t QbspVisLight_Q2(