From 4311f91c37350457c647bb37b6c3aff0e9755579 Mon Sep 17 00:00:00 2001 From: PJB3005 Date: Sun, 5 Apr 2026 22:45:46 +0200 Subject: [PATCH 1/4] Add "lock aspect ratio" setting Uses new Aurora functionality: https://github.com/encounter/aurora/pull/97 Fixes #138 --- include/dusk/dusk.h | 8 ++++++++ include/dusk/settings.h | 1 + src/dusk/imgui/ImGuiMenuGame.cpp | 12 +++++++++++- src/dusk/settings.cpp | 1 + src/m_Do/m_Do_main.cpp | 4 ++-- 5 files changed, 23 insertions(+), 3 deletions(-) diff --git a/include/dusk/dusk.h b/include/dusk/dusk.h index d84e496827..744b0f9152 100644 --- a/include/dusk/dusk.h +++ b/include/dusk/dusk.h @@ -5,4 +5,12 @@ extern AuroraInfo auroraInfo; +constexpr u32 defaultWindowWidth = 608; +constexpr u32 defaultWindowHeight = 448; + +constexpr u32 defaultAspectRatioW = 19; +constexpr u32 defaultAspectRatioH = 14; + +static_assert(defaultWindowWidth / defaultAspectRatioW == defaultWindowHeight / defaultAspectRatioH); + #endif // DUSK_DUSK_H diff --git a/include/dusk/settings.h b/include/dusk/settings.h index 07047fad99..b4ded9f83e 100644 --- a/include/dusk/settings.h +++ b/include/dusk/settings.h @@ -11,6 +11,7 @@ struct UserSettings { struct { // Video bool enableFullscreen; + bool lockAspectRatio; } video; struct { diff --git a/src/dusk/imgui/ImGuiMenuGame.cpp b/src/dusk/imgui/ImGuiMenuGame.cpp index cd1d5a06f3..b1849a6856 100644 --- a/src/dusk/imgui/ImGuiMenuGame.cpp +++ b/src/dusk/imgui/ImGuiMenuGame.cpp @@ -6,8 +6,9 @@ #include #include "JSystem/JUtility/JUTGamePad.h" -#include "dusk/audio/DuskDsp.hpp" #include "dusk/audio/DuskAudioSystem.h" +#include "dusk/audio/DuskDsp.hpp" +#include "dusk/dusk.h" #include "dusk/hotkeys.h" #include "dusk/settings.h" #include "m_Do/m_Do_controller_pad.h" @@ -29,6 +30,15 @@ namespace dusk { VISetWindowFullscreen(getSettings().video.enableFullscreen); } + bool& lockAspect = getSettings().video.lockAspectRatio; + if (ImGui::Checkbox("Lock Aspect Ratio", &lockAspect)) { + if (lockAspect) { + VILockAspectRatio(defaultAspectRatioW, defaultAspectRatioH); + } else { + VIUnlockAspectRatio(); + } + } + ImGui::EndMenu(); } diff --git a/src/dusk/settings.cpp b/src/dusk/settings.cpp index 38fa455e47..5625b284e3 100644 --- a/src/dusk/settings.cpp +++ b/src/dusk/settings.cpp @@ -8,6 +8,7 @@ UserSettings g_userSettings = { // Video .video = { .enableFullscreen = false, + .lockAspectRatio = false, }, // Audio diff --git a/src/m_Do/m_Do_main.cpp b/src/m_Do/m_Do_main.cpp index b8eeba892e..84c50a5f52 100644 --- a/src/m_Do/m_Do_main.cpp +++ b/src/m_Do/m_Do_main.cpp @@ -269,8 +269,8 @@ int game_main(int argc, char* argv[]) { config.appName = "Dusk"; config.windowPosX = -1; config.windowPosY = -1; - config.windowWidth = 608 * 2; - config.windowHeight = 448 * 2; + config.windowWidth = defaultWindowWidth * 2; + config.windowHeight = defaultWindowHeight * 2; config.desiredBackend = ParseAuroraBackend(parsed_arg_options["backend"].as()); config.logCallback = &aurora_log_callback; config.logLevel = (AuroraLogLevel)parsed_arg_options["log-level"].as(); From 581b5046581f814eb2bc392ab572f5a0888c343c Mon Sep 17 00:00:00 2001 From: MelonSpeedruns Date: Tue, 7 Apr 2026 18:22:41 -0400 Subject: [PATCH 2/4] rename name of button to "Force 4:3 Aspect Ratio" --- src/dusk/imgui/ImGuiMenuGame.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/dusk/imgui/ImGuiMenuGame.cpp b/src/dusk/imgui/ImGuiMenuGame.cpp index 50877caad9..d9b521d98a 100644 --- a/src/dusk/imgui/ImGuiMenuGame.cpp +++ b/src/dusk/imgui/ImGuiMenuGame.cpp @@ -54,7 +54,7 @@ namespace dusk { } bool lockAspect = getSettings().video.lockAspectRatio; - if (ImGui::Checkbox("Lock Aspect Ratio", &lockAspect)) { + if (ImGui::Checkbox("Force 4:3 Aspect Ratio", &lockAspect)) { getSettings().video.lockAspectRatio.setValue(lockAspect); if (lockAspect) { From a14cd3da06a683d66586b3bb6bc357f99449be94 Mon Sep 17 00:00:00 2001 From: MelonSpeedruns Date: Tue, 7 Apr 2026 18:49:24 -0400 Subject: [PATCH 3/4] Move audio settings to init and set rather than update, improving performance --- src/dusk/imgui/ImGuiConfig.hpp | 20 ++++++++++++++++---- src/dusk/imgui/ImGuiConsole.cpp | 5 +++-- src/dusk/imgui/ImGuiMenuGame.cpp | 9 +++++++-- 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/src/dusk/imgui/ImGuiConfig.hpp b/src/dusk/imgui/ImGuiConfig.hpp index fc5aa34bbd..e3e80b9920 100644 --- a/src/dusk/imgui/ImGuiConfig.hpp +++ b/src/dusk/imgui/ImGuiConfig.hpp @@ -5,36 +5,48 @@ #include "imgui.h" namespace dusk::config { - inline void ImGuiCheckbox(const char* title, ConfigVar& var) { + inline bool ImGuiCheckbox(const char* title, ConfigVar& var) { bool copy = var.getValue(); if (ImGui::Checkbox(title, ©)) { var.setValue(copy); Save(); + return true; } + + return false; } - static void ImGuiSliderFloat(const char* label, ConfigVar& var, float v_min, float v_max, const char* format = "%.3f", ImGuiSliderFlags flags = 0) { + static bool ImGuiSliderFloat(const char* label, ConfigVar& var, float v_min, float v_max, const char* format = "%.3f", ImGuiSliderFlags flags = 0) { float val = var; if (ImGui::SliderFloat(label, &val, v_min, v_max, format, flags)) { var.setValue(val); Save(); + return true; } + + return false; } - static void ImGuiSliderInt(const char* label, ConfigVar& var, int v_min, int v_max, const char* format = "%d", ImGuiSliderFlags flags = 0) { + static bool ImGuiSliderInt(const char* label, ConfigVar& var, int v_min, int v_max, const char* format = "%d", ImGuiSliderFlags flags = 0) { int val = var; if (ImGui::SliderInt(label, &val, v_min, v_max, format, flags)) { var.setValue(val); Save(); + return true; } + + return false; } - static void ImGuiMenuItem(const char* label, const char* shortcut, ConfigVar& p_selected, bool enabled = true) { + static bool ImGuiMenuItem(const char* label, const char* shortcut, ConfigVar& p_selected, bool enabled = true) { bool copy = p_selected.getValue(); if (ImGui::MenuItem(label, shortcut, ©, enabled)) { p_selected.setValue(copy); Save(); + return true; } + + return false; } } diff --git a/src/dusk/imgui/ImGuiConsole.cpp b/src/dusk/imgui/ImGuiConsole.cpp index e0ca351e4f..35609f641c 100644 --- a/src/dusk/imgui/ImGuiConsole.cpp +++ b/src/dusk/imgui/ImGuiConsole.cpp @@ -186,11 +186,12 @@ namespace dusk { } else { VIUnlockAspectRatio(); } + + dusk::audio::SetMasterVolume(dusk::getSettings().audio.masterVolume / 100.0f); + dusk::audio::SetEnableReverb(dusk::getSettings().audio.enableReverb); } void ImGuiConsole::UpdateSettings() { - dusk::audio::SetMasterVolume(dusk::getSettings().audio.masterVolume / 100.0f); - dusk::audio::SetEnableReverb(dusk::getSettings().audio.enableReverb); getTransientSettings().skipFrameRateLimit = getSettings().game.enableTurboKeybind && ImGui::IsKeyDown(ImGuiKey_Tab); } diff --git a/src/dusk/imgui/ImGuiMenuGame.cpp b/src/dusk/imgui/ImGuiMenuGame.cpp index d9b521d98a..050e5c5c77 100644 --- a/src/dusk/imgui/ImGuiMenuGame.cpp +++ b/src/dusk/imgui/ImGuiMenuGame.cpp @@ -71,8 +71,13 @@ namespace dusk { if (ImGui::BeginMenu("Audio")) { ImGui::Text("Master Volume"); - config::ImGuiSliderInt("##masterVolume", getSettings().audio.masterVolume, 0, 100); - config::ImGuiCheckbox("Enable Reverb", getSettings().audio.enableReverb); + if (config::ImGuiSliderInt("##masterVolume", getSettings().audio.masterVolume, 0, 100)) { + dusk::audio::SetMasterVolume(dusk::getSettings().audio.masterVolume / 100.0f); + } + + if (config::ImGuiCheckbox("Enable Reverb", getSettings().audio.enableReverb)) { + dusk::audio::SetEnableReverb(dusk::getSettings().audio.enableReverb); + } /* // TODO: Implement additional settings ImGui::Text("Main Music Volume"); From e8e5b3eb967ec4507319096f8d3b8cca54e2220e Mon Sep 17 00:00:00 2001 From: MelonSpeedruns Date: Tue, 7 Apr 2026 18:51:04 -0400 Subject: [PATCH 4/4] remove useless dusk calls --- src/dusk/imgui/ImGuiConsole.cpp | 4 ++-- src/dusk/imgui/ImGuiMenuGame.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/dusk/imgui/ImGuiConsole.cpp b/src/dusk/imgui/ImGuiConsole.cpp index 35609f641c..bc86b015d8 100644 --- a/src/dusk/imgui/ImGuiConsole.cpp +++ b/src/dusk/imgui/ImGuiConsole.cpp @@ -187,8 +187,8 @@ namespace dusk { VIUnlockAspectRatio(); } - dusk::audio::SetMasterVolume(dusk::getSettings().audio.masterVolume / 100.0f); - dusk::audio::SetEnableReverb(dusk::getSettings().audio.enableReverb); + dusk::audio::SetMasterVolume(getSettings().audio.masterVolume / 100.0f); + dusk::audio::SetEnableReverb(getSettings().audio.enableReverb); } void ImGuiConsole::UpdateSettings() { diff --git a/src/dusk/imgui/ImGuiMenuGame.cpp b/src/dusk/imgui/ImGuiMenuGame.cpp index 050e5c5c77..cbe26ba81c 100644 --- a/src/dusk/imgui/ImGuiMenuGame.cpp +++ b/src/dusk/imgui/ImGuiMenuGame.cpp @@ -72,11 +72,11 @@ namespace dusk { if (ImGui::BeginMenu("Audio")) { ImGui::Text("Master Volume"); if (config::ImGuiSliderInt("##masterVolume", getSettings().audio.masterVolume, 0, 100)) { - dusk::audio::SetMasterVolume(dusk::getSettings().audio.masterVolume / 100.0f); + dusk::audio::SetMasterVolume(getSettings().audio.masterVolume / 100.0f); } if (config::ImGuiCheckbox("Enable Reverb", getSettings().audio.enableReverb)) { - dusk::audio::SetEnableReverb(dusk::getSettings().audio.enableReverb); + dusk::audio::SetEnableReverb(getSettings().audio.enableReverb); } /* // TODO: Implement additional settings