From b893e67309dc9556fa581e9a0a1d69b68782e40c Mon Sep 17 00:00:00 2001 From: Eric Wasylishen Date: Tue, 29 Aug 2023 01:44:16 -0600 Subject: [PATCH] light: add _light_twosided 1 key for forcing two-sided light receiving on opaque surfaces --- common/bspfile.cc | 2 +- include/common/bspfile.hh | 3 +++ light/light.cc | 3 +++ light/ltface.cc | 5 +++++ qbsp/map.cc | 5 +++++ qbsp/writebsp.cc | 3 +++ 6 files changed, 20 insertions(+), 1 deletion(-) diff --git a/common/bspfile.cc b/common/bspfile.cc index d31207d3..8d98f509 100644 --- a/common/bspfile.cc +++ b/common/bspfile.cc @@ -1830,7 +1830,7 @@ static auto as_tuple(const surfflags_t &flags) flags.no_bounce, flags.no_minlight, flags.no_expand, flags.no_phong, flags.light_ignore, flags.surflight_rescale, flags.surflight_style, flags.surflight_color, flags.surflight_minlight_scale, flags.surflight_targetname, flags.phong_angle, flags.phong_angle_concave, flags.phong_group, flags.minlight, - flags.minlight_color, flags.light_alpha, flags.maxlight, flags.lightcolorscale, flags.surflight_group, + flags.minlight_color, flags.light_alpha, flags.light_twosided, flags.maxlight, flags.lightcolorscale, flags.surflight_group, flags.world_units_per_luxel, flags.object_channel_mask); } diff --git a/include/common/bspfile.hh b/include/common/bspfile.hh index 41589640..e12b7770 100644 --- a/include/common/bspfile.hh +++ b/include/common/bspfile.hh @@ -184,6 +184,9 @@ struct surfflags_t // custom opacity std::optional light_alpha; + // two-sided lighting + std::optional light_twosided; + // maxlight value for this face vec_t maxlight; diff --git a/light/light.cc b/light/light.cc index 93ce2b03..1d3d9bca 100644 --- a/light/light.cc +++ b/light/light.cc @@ -1176,6 +1176,9 @@ static void LoadExtendedTexinfoFlags(const fs::path &sourcefilename, const mbsp_ if (val.contains("light_alpha")) { flags.light_alpha = val.at("light_alpha").get(); } + if (val.contains("light_twosided")) { + flags.light_twosided = val.at("light_twosided").get(); + } if (val.contains("lightcolorscale")) { flags.lightcolorscale = val.at("lightcolorscale").get(); } diff --git a/light/ltface.cc b/light/ltface.cc index fdb36f32..3786afac 100644 --- a/light/ltface.cc +++ b/light/ltface.cc @@ -608,6 +608,11 @@ static std::unique_ptr Lightsurf_Init(const modelinfo_t *modelinfo, const surfflags_t &extended_flags = extended_texinfo_flags[face->texinfo]; lightsurf->curved = extended_flags.phong_angle != 0 || Q2_FacePhongValue(bsp, face); + // override the autodetected twosided setting? + if (extended_flags.light_twosided) { + lightsurf->twosided = *extended_flags.light_twosided; + } + // nodirt if (modelinfo->dirt.is_changed()) { lightsurf->nodirt = (modelinfo->dirt.value() == -1); diff --git a/qbsp/map.cc b/qbsp/map.cc index 3443b8c5..2820607a 100644 --- a/qbsp/map.cc +++ b/qbsp/map.cc @@ -821,6 +821,11 @@ static surfflags_t SurfFlagsForEntity( flags.light_alpha = std::clamp(lightalpha, 0.0, 1.0); } + // handle "_light_twosided" + if (entity.epairs.has("_light_twosided")) { + flags.light_twosided = entity.epairs.get_int("_light_twosided"); + } + return flags; } diff --git a/qbsp/writebsp.cc b/qbsp/writebsp.cc index c72b66fd..ca511a32 100644 --- a/qbsp/writebsp.cc +++ b/qbsp/writebsp.cc @@ -417,6 +417,9 @@ static void WriteExtendedTexinfoFlags(void) if (tx.flags.light_alpha) { t["light_alpha"] = *tx.flags.light_alpha; } + if (tx.flags.light_twosided) { + t["light_twosided"] = *tx.flags.light_twosided; + } if (tx.flags.lightcolorscale != 1.0) { t["lightcolorscale"] = tx.flags.lightcolorscale; }