From 7f6a5b5b7c846616c19cd2a9efac586de6175bd6 Mon Sep 17 00:00:00 2001 From: mchughalex <25671999+mchughalex@users.noreply.github.com> Date: Fri, 17 Jul 2026 08:26:00 +0100 Subject: [PATCH] ui: Ambient Occlusion settings row --- .../rex/ui/overlay/simple_settings_overlay.h | 1 + src/ui/overlay/simple_settings_overlay.cpp | 29 +++++++++++++++++-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/include/rex/ui/overlay/simple_settings_overlay.h b/include/rex/ui/overlay/simple_settings_overlay.h index 6e21938..3f31f83 100644 --- a/include/rex/ui/overlay/simple_settings_overlay.h +++ b/include/rex/ui/overlay/simple_settings_overlay.h @@ -115,6 +115,7 @@ class SimpleSettingsDialog final : public ImGuiDialog { char gamertag_buf_[32] = {}; // Live setting values (hot cvars, applied and saved on change). bool renderer_native_ = true; + bool ssao_ = true; bool mode_indicator_ = true; bool fps_counter_ = false; bool audio_mute_ = false; diff --git a/src/ui/overlay/simple_settings_overlay.cpp b/src/ui/overlay/simple_settings_overlay.cpp index 5fb45cd..9ef5e92 100644 --- a/src/ui/overlay/simple_settings_overlay.cpp +++ b/src/ui/overlay/simple_settings_overlay.cpp @@ -53,11 +53,12 @@ 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_ssao", "skate3_native_render_mode_indicator", "show_fps_counter", "monitor", @@ -867,6 +868,8 @@ void SimpleSettingsDialog::LoadSettingsFromCvars() { mnk_capture_mouse_ = rex::cvar::Query("mnk_capture_mouse"); renderer_native_ = HasCvar("skate3_native_render_scene") && rex::cvar::Query("skate3_native_render_scene"); + ssao_ = HasCvar("skate3_native_render_scene_ssao") && + rex::cvar::Query("skate3_native_render_scene_ssao"); mode_indicator_ = HasCvar("skate3_native_render_mode_indicator") && rex::cvar::Query("skate3_native_render_mode_indicator"); fps_counter_ = HasCvar("show_fps_counter") && rex::cvar::Query("show_fps_counter"); @@ -1203,7 +1206,8 @@ void SimpleSettingsDialog::BuildRows(std::vector& rows, int category) { row.reset = [this] { tearing_ = TearingDefault(); }; rows.push_back(std::move(row)); } - if (HasRendererChoice() || HasMsaaCvar() || HasShadowQualityCvars()) { + if (HasRendererChoice() || HasMsaaCvar() || HasShadowQualityCvars() || + HasCvar("skate3_native_render_scene_ssao")) { header("Quality"); } if (HasRendererChoice()) { @@ -1276,6 +1280,27 @@ void SimpleSettingsDialog::BuildRows(std::vector& rows, int category) { }; rows.push_back(std::move(row)); } + if (HasCvar("skate3_native_render_scene_ssao")) { + RowSpec row; + row.kind = RowSpec::kEnum; + row.label = "Ambient Occlusion"; + row.desc = + "Soft contact shading where surfaces meet (under ledges, rails, " + "vehicles, the skater). Native renderer only; applies " + "immediately."; + row.options = {"Off", "On"}; + row.flag = &ssao_; + row.on_enum_change = [this](int value) { + SetBoolCvar("skate3_native_render_scene_ssao", value != 0); + SaveSimpleSettingsConfig(config_path_); + }; + row.reset = [this] { + ssao_ = CvarDefaultBool("skate3_native_render_scene_ssao", true); + SetBoolCvar("skate3_native_render_scene_ssao", ssao_); + SaveSimpleSettingsConfig(config_path_); + }; + rows.push_back(std::move(row)); + } if (HasFieldOfViewCvar()) { header("Gameplay"); RowSpec row;