From 4a6e9afacb439c64848f7c8319def561c2a876e7 Mon Sep 17 00:00:00 2001 From: mchughalex <25671999+mchughalex@users.noreply.github.com> Date: Sun, 19 Jul 2026 19:50:22 +0100 Subject: [PATCH] ui: bloom and volumetric lighting settings rows --- .../rex/ui/overlay/simple_settings_overlay.h | 3 +- src/ui/overlay/simple_settings_overlay.cpp | 107 +++++++++++------- 2 files changed, 70 insertions(+), 40 deletions(-) diff --git a/include/rex/ui/overlay/simple_settings_overlay.h b/include/rex/ui/overlay/simple_settings_overlay.h index 2192585..ccf20e7 100644 --- a/include/rex/ui/overlay/simple_settings_overlay.h +++ b/include/rex/ui/overlay/simple_settings_overlay.h @@ -119,8 +119,9 @@ class SimpleSettingsDialog final : public ImGuiDialog { bool renderer_native_ = true; bool ssao_ = true; bool static_shadows_ = true; - float static_shadow_strength_ = 1.0f; bool shadow_pcss_ = true; + bool bloom_ = true; + bool volumetrics_ = true; int draw_distance_index_ = 1; int stream_probe_index_ = 0; bool mode_indicator_ = true; diff --git a/src/ui/overlay/simple_settings_overlay.cpp b/src/ui/overlay/simple_settings_overlay.cpp index 0d790d4..05cf01d 100644 --- a/src/ui/overlay/simple_settings_overlay.cpp +++ b/src/ui/overlay/simple_settings_overlay.cpp @@ -53,16 +53,18 @@ constexpr std::array kCoreSimpleSettingsCvars = { // Optional cvars persisted when the host defines them (HasCvar-gated: app // cvars like the native-renderer knobs don't exist in every embedder, and // backend/platform cvars don't exist in every build). -constexpr std::array kOptionalSimpleSettingsCvars = { +constexpr std::array kOptionalSimpleSettingsCvars = { "skate3_native_render_scene", "skate3_native_render_scene_msaa", "skate3_native_render_scene_shadows", "skate3_native_render_scene_shadow_tile", "skate3_native_render_scene_shadow_static_casters", - "skate3_native_render_scene_shadow_static_strength", "skate3_native_render_scene_shadow_static_size", "skate3_native_render_scene_shadow_pcss", "skate3_native_render_scene_ssao", + "skate3_native_render_scene_bloom", + "skate3_native_render_scene_shafts", + "skate3_native_render_scene_haze", "skate3_native_render_mode_indicator", "show_fps_counter", "monitor", @@ -1013,14 +1015,16 @@ void SimpleSettingsDialog::LoadSettingsFromCvars() { static_shadows_ = HasCvar("skate3_native_render_scene_shadow_static_casters") && rex::cvar::Query("skate3_native_render_scene_shadow_static_casters"); - static_shadow_strength_ = - HasCvar("skate3_native_render_scene_shadow_static_strength") - ? float(std::clamp(rex::cvar::Query( - "skate3_native_render_scene_shadow_static_strength"), - 0.0, 1.0)) - : 1.0f; shadow_pcss_ = HasCvar("skate3_native_render_scene_shadow_pcss") && rex::cvar::Query("skate3_native_render_scene_shadow_pcss"); + bloom_ = HasCvar("skate3_native_render_scene_bloom") && + rex::cvar::Query("skate3_native_render_scene_bloom"); + // The volumetric row drives the shafts + haze pair; either one on shows + // as On so toggling Off always disables both. + volumetrics_ = (HasCvar("skate3_native_render_scene_shafts") && + rex::cvar::Query("skate3_native_render_scene_shafts")) || + (HasCvar("skate3_native_render_scene_haze") && + rex::cvar::Query("skate3_native_render_scene_haze")); draw_distance_index_ = DrawDistanceIndexFromCvar(); stream_probe_index_ = StreamProbeIndexFromCvar(); mode_indicator_ = HasCvar("skate3_native_render_mode_indicator") && @@ -1419,7 +1423,7 @@ void SimpleSettingsDialog::BuildRows(std::vector& rows, int category) { } if (HasRendererChoice() || HasMsaaCvar() || HasShadowQualityCvars() || HasCvar("skate3_native_render_scene_ssao") || HasDrawDistanceCvars()) { - header("Quality"); + header("Graphics"); } if (HasRendererChoice()) { RowSpec row; @@ -1535,36 +1539,6 @@ void SimpleSettingsDialog::BuildRows(std::vector& rows, int category) { }; rows.push_back(std::move(row)); } - if (HasCvar("skate3_native_render_scene_shadow_static_strength")) { - RowSpec row; - row.kind = RowSpec::kSlider; - row.label = "Enhanced Shadow Strength"; - row.desc = - "How dark the enhanced shadows get (1 matches the game's dynamic " - "shadows). Lower values blend them with the baked lighting where " - "the two disagree. Applies immediately."; - row.value = &static_shadow_strength_; - row.min = 0.0f; - row.max = 1.0f; - row.step = 0.05f; - row.fmt = "%.2f"; - row.on_value_change = [this] { - static_shadow_strength_ = - std::clamp(static_shadow_strength_, 0.0f, 1.0f); - rex::cvar::SetFlagByName( - "skate3_native_render_scene_shadow_static_strength", - std::to_string(static_shadow_strength_)); - }; - row.reset = [this] { - static_shadow_strength_ = float(CvarDefaultDouble( - "skate3_native_render_scene_shadow_static_strength", 1.0)); - rex::cvar::SetFlagByName( - "skate3_native_render_scene_shadow_static_strength", - std::to_string(static_shadow_strength_)); - SaveSimpleSettingsConfig(config_path_); - }; - rows.push_back(std::move(row)); - } if (HasCvar("skate3_native_render_scene_shadow_pcss")) { RowSpec row; row.kind = RowSpec::kEnum; @@ -1609,6 +1583,61 @@ void SimpleSettingsDialog::BuildRows(std::vector& rows, int category) { }; rows.push_back(std::move(row)); } + if (HasCvar("skate3_native_render_scene_bloom")) { + RowSpec row; + row.kind = RowSpec::kEnum; + row.label = "Bloom"; + row.desc = + "Glow around bright light sources (lamps, neon, the sun and " + "sky glare), driven by real scene brightness. Most visible at " + "night. Applies immediately."; + row.options = {"Off", "On"}; + row.flag = &bloom_; + row.on_enum_change = [this](int value) { + SetBoolCvar("skate3_native_render_scene_bloom", value != 0); + SaveSimpleSettingsConfig(config_path_); + }; + row.reset = [this] { + bloom_ = CvarDefaultBool("skate3_native_render_scene_bloom", true); + SetBoolCvar("skate3_native_render_scene_bloom", bloom_); + SaveSimpleSettingsConfig(config_path_); + }; + rows.push_back(std::move(row)); + } + if (HasCvar("skate3_native_render_scene_shafts") || + HasCvar("skate3_native_render_scene_haze")) { + RowSpec row; + row.kind = RowSpec::kEnum; + row.label = "Volumetric Lighting"; + row.desc = + "Sun shafts through buildings and trees plus directional " + "atmospheric haze, both following the time of day. Costs a " + "little performance. Applies immediately."; + row.options = {"Off", "On"}; + row.flag = &volumetrics_; + row.on_enum_change = [this](int value) { + if (HasCvar("skate3_native_render_scene_shafts")) { + SetBoolCvar("skate3_native_render_scene_shafts", value != 0); + } + if (HasCvar("skate3_native_render_scene_haze")) { + SetBoolCvar("skate3_native_render_scene_haze", value != 0); + } + SaveSimpleSettingsConfig(config_path_); + }; + row.reset = [this] { + volumetrics_ = + CvarDefaultBool("skate3_native_render_scene_shafts", true) || + CvarDefaultBool("skate3_native_render_scene_haze", true); + if (HasCvar("skate3_native_render_scene_shafts")) { + SetBoolCvar("skate3_native_render_scene_shafts", volumetrics_); + } + if (HasCvar("skate3_native_render_scene_haze")) { + SetBoolCvar("skate3_native_render_scene_haze", volumetrics_); + } + SaveSimpleSettingsConfig(config_path_); + }; + rows.push_back(std::move(row)); + } if (HasDrawDistanceCvars()) { RowSpec row; row.kind = RowSpec::kEnum;