From 62df2c0460857a701c04d97343a79b84cb0f8279 Mon Sep 17 00:00:00 2001 From: MelonSpeedruns Date: Sat, 11 Apr 2026 19:52:08 -0400 Subject: [PATCH] Shadow Quality Enhancement (#311) * Shadow Quality Enhancement * added 1 space because we like consistency here * Addressed encounter comments * Renamed description of shadow resolution * added period at the end of shadow resolution description --------- Co-authored-by: MelonSpeedruns --- include/dusk/settings.h | 1 + src/d/d_drawlist.cpp | 18 +++++++++++++++++- src/dusk/imgui/ImGuiMenuEnhancements.cpp | 5 +++++ src/dusk/settings.cpp | 2 ++ 4 files changed, 25 insertions(+), 1 deletion(-) diff --git a/include/dusk/settings.h b/include/dusk/settings.h index cc867474da..d9d1ae154b 100644 --- a/include/dusk/settings.h +++ b/include/dusk/settings.h @@ -54,6 +54,7 @@ struct UserSettings { ConfigVar enableBloom; ConfigVar useWaterProjectionOffset; ConfigVar enableFrameInterpolation; + ConfigVar shadowResolutionMultiplier; // Audio ConfigVar noLowHpSound; diff --git a/src/d/d_drawlist.cpp b/src/d/d_drawlist.cpp index 1474b6f24d..f5dd0f23f5 100644 --- a/src/d/d_drawlist.cpp +++ b/src/d/d_drawlist.cpp @@ -1441,7 +1441,11 @@ void dDlst_shadowSimple_c::set(cXyz* param_0, f32 param_1, f32 param_2, cXyz* pa void dDlst_shadowControl_c::init() { #if TARGET_PC // Increase shadow map resolution - static u16 l_realImageSize[2] = {1024, 512}; + u16 l_realImageSize[2] = + { + 192 * dusk::getSettings().game.shadowResolutionMultiplier, + 64 * dusk::getSettings().game.shadowResolutionMultiplier + }; #else static u16 l_realImageSize[2] = {192, 64}; #endif @@ -1480,7 +1484,19 @@ void dDlst_shadowControl_c::reset() { #endif } +#if TARGET_PC +int lastShadowValue = 0; +#endif + void dDlst_shadowControl_c::imageDraw(Mtx param_0) { + #if TARGET_PC + if (lastShadowValue != dusk::getSettings().game.shadowResolutionMultiplier) { + reset(); + init(); + lastShadowValue = dusk::getSettings().game.shadowResolutionMultiplier; + } + #endif + static u8 l_matDL[] ATTRIBUTE_ALIGN(32) = { 0x10, 0x00, 0x00, 0x10, 0x0E, 0x00, 0x00, 0x04, 0x00, 0x10, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00, 0x04, 0x00, 0x61, 0x28, 0x38, 0x00, 0x00, 0x61, 0xC0, 0x08, 0xFF, 0xF2, diff --git a/src/dusk/imgui/ImGuiMenuEnhancements.cpp b/src/dusk/imgui/ImGuiMenuEnhancements.cpp index 39cf09a9cd..b505d84345 100644 --- a/src/dusk/imgui/ImGuiMenuEnhancements.cpp +++ b/src/dusk/imgui/ImGuiMenuEnhancements.cpp @@ -85,6 +85,11 @@ namespace dusk { ImGui::SetTooltip("Uses inter-frame interpolation to enable higher frame rates.\nVisual artifacts, animation glitches, or instability may occur."); } + config::ImGuiSliderInt("Shadow Resolution", getSettings().game.shadowResolutionMultiplier, 1, 8, "x%d"); + if (ImGui::IsItemHovered()) { + ImGui::SetTooltip("Improves the shadow resolution, making them higher quality."); + } + ImGui::EndMenu(); } diff --git a/src/dusk/settings.cpp b/src/dusk/settings.cpp index 889ebbaf28..4768abef93 100644 --- a/src/dusk/settings.cpp +++ b/src/dusk/settings.cpp @@ -42,6 +42,7 @@ UserSettings g_userSettings = { .enableBloom {"game.enableBloom", true}, .useWaterProjectionOffset {"game.useWaterProjectionOffset", false}, .enableFrameInterpolation = {"game.enableFrameInterpolation", false}, + .shadowResolutionMultiplier {"game.shadowResolutionMultiplier", 1}, // Audio .noLowHpSound {"game.noLowHpSound", false}, @@ -103,6 +104,7 @@ void registerSettings() { Register(g_userSettings.game.invertCameraXAxis); Register(g_userSettings.game.enableBloom); Register(g_userSettings.game.useWaterProjectionOffset); + Register(g_userSettings.game.shadowResolutionMultiplier); Register(g_userSettings.game.enableFastIronBoots); Register(g_userSettings.game.canTransformAnywhere); Register(g_userSettings.game.freeMagicArmor);