From 03ef34ffe83d25bbd54320c8cb2e535a256470a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dar=C3=ADo?= Date: Sat, 22 Feb 2025 10:12:56 -0300 Subject: [PATCH] Dpi fixes (#449) * Potential fix for DPI scaling. * Show window size in pixels while in Fullscreen mode. --- UnleashedRecomp/gpu/rhi/plume_vulkan.cpp | 2 +- UnleashedRecomp/gpu/video.cpp | 26 +++++++++++++++--------- UnleashedRecomp/ui/game_window.cpp | 5 +++++ UnleashedRecomp/ui/game_window.h | 1 + UnleashedRecomp/ui/options_menu.cpp | 22 +++++++++++++------- 5 files changed, 38 insertions(+), 18 deletions(-) diff --git a/UnleashedRecomp/gpu/rhi/plume_vulkan.cpp b/UnleashedRecomp/gpu/rhi/plume_vulkan.cpp index a181eab..477a431 100644 --- a/UnleashedRecomp/gpu/rhi/plume_vulkan.cpp +++ b/UnleashedRecomp/gpu/rhi/plume_vulkan.cpp @@ -2344,7 +2344,7 @@ namespace plume { dstWidth = rect.right - rect.left; dstHeight = rect.bottom - rect.top; # elif defined(SDL_VULKAN_ENABLED) - SDL_GetWindowSize(renderWindow, (int *)(&dstWidth), (int *)(&dstHeight)); + SDL_GetWindowSizeInPixels(renderWindow, (int *)(&dstWidth), (int *)(&dstHeight)); # elif defined(__ANDROID__) dstWidth = ANativeWindow_getWidth(renderWindow); dstHeight = ANativeWindow_getHeight(renderWindow); diff --git a/UnleashedRecomp/gpu/video.cpp b/UnleashedRecomp/gpu/video.cpp index f21f2ce..42f122c 100644 --- a/UnleashedRecomp/gpu/video.cpp +++ b/UnleashedRecomp/gpu/video.cpp @@ -2415,19 +2415,25 @@ static void DrawImGui() // we can adjust the mouse events before ImGui processes them. uint32_t width = g_swapChain->getWidth(); uint32_t height = g_swapChain->getHeight(); - - if (width != Video::s_viewportWidth || height != Video::s_viewportHeight) + float mousePosScaleX = float(width) / float(GameWindow::s_width); + float mousePosScaleY = float(height) / float(GameWindow::s_height); + float mousePosOffsetX = (width - Video::s_viewportWidth) / 2.0f; + float mousePosOffsetY = (height - Video::s_viewportHeight) / 2.0f; + for (int i = 0; i < io.Ctx->InputEventsQueue.Size; i++) { - float mousePosOffsetX = (width - Video::s_viewportWidth) / 2.0f; - float mousePosOffsetY = (height - Video::s_viewportHeight) / 2.0f; - - for (int i = 0; i < io.Ctx->InputEventsQueue.Size; i++) + auto& e = io.Ctx->InputEventsQueue[i]; + if (e.Type == ImGuiInputEventType_MousePos) { - auto& e = io.Ctx->InputEventsQueue[i]; - if (e.Type == ImGuiInputEventType_MousePos) + if (e.MousePos.PosX != -FLT_MAX) { - if (e.MousePos.PosX != -FLT_MAX) e.MousePos.PosX -= mousePosOffsetX; - if (e.MousePos.PosY != -FLT_MAX) e.MousePos.PosY -= mousePosOffsetY; + e.MousePos.PosX *= mousePosScaleX; + e.MousePos.PosX -= mousePosOffsetX; + } + + if (e.MousePos.PosY != -FLT_MAX) + { + e.MousePos.PosY *= mousePosScaleY; + e.MousePos.PosY -= mousePosOffsetY; } } } diff --git a/UnleashedRecomp/ui/game_window.cpp b/UnleashedRecomp/ui/game_window.cpp index 3ed5fbb..cc25ab6 100644 --- a/UnleashedRecomp/ui/game_window.cpp +++ b/UnleashedRecomp/ui/game_window.cpp @@ -378,6 +378,11 @@ SDL_Rect GameWindow::GetDimensions() return rect; } +void GameWindow::GetSizeInPixels(int *w, int *h) +{ + SDL_GetWindowSizeInPixels(s_pWindow, w, h); +} + void GameWindow::SetDimensions(int w, int h, int x, int y) { s_width = w; diff --git a/UnleashedRecomp/ui/game_window.h b/UnleashedRecomp/ui/game_window.h index 5f51b2f..bd0cb9a 100644 --- a/UnleashedRecomp/ui/game_window.h +++ b/UnleashedRecomp/ui/game_window.h @@ -37,6 +37,7 @@ public: static bool IsMaximised(); static EWindowState SetMaximised(bool isEnabled); static SDL_Rect GetDimensions(); + static void GetSizeInPixels(int *w, int *h); static void SetDimensions(int w, int h, int x = SDL_WINDOWPOS_CENTERED, int y = SDL_WINDOWPOS_CENTERED); static void ResetDimensions(); static uint32_t GetWindowFlags(); diff --git a/UnleashedRecomp/ui/options_menu.cpp b/UnleashedRecomp/ui/options_menu.cpp index b348d82..a16252d 100644 --- a/UnleashedRecomp/ui/options_menu.cpp +++ b/UnleashedRecomp/ui/options_menu.cpp @@ -1121,17 +1121,25 @@ static void DrawConfigOption(int32_t rowIndex, float yOffset, ConfigDef* conf { if (config == &Config::WindowSize) { - auto displayModes = GameWindow::GetDisplayModes(); - - if (config->Value >= 0 && config->Value < displayModes.size()) + if (Config::Fullscreen) { - auto& displayMode = displayModes[config->Value]; - - valueText = fmt::format("{}x{}", displayMode.w, displayMode.h); + int displayW, displayH; + GameWindow::GetSizeInPixels(&displayW, &displayH); + valueText = fmt::format("{}x{}", displayW, displayH); } else { - valueText = fmt::format("{}x{}", GameWindow::s_width, GameWindow::s_height); + auto displayModes = GameWindow::GetDisplayModes(); + if (config->Value >= 0 && config->Value < displayModes.size()) + { + auto& displayMode = displayModes[config->Value]; + + valueText = fmt::format("{}x{}", displayMode.w, displayMode.h); + } + else + { + valueText = fmt::format("{}x{}", GameWindow::s_width, GameWindow::s_height); + } } } else if (config == &Config::Monitor)