From 20cfadeb0bf110b6d7a107d66e460b217b6f0ed1 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Wed, 20 May 2026 20:10:10 +0200 Subject: [PATCH] =?UTF-8?q?fix(viewport):=20deslligar=20el=20viewport=20de?= =?UTF-8?q?=20zoom=5Ffactor=5F=20(aspect-fit=20per=20pantalla=20f=C3=ADsic?= =?UTF-8?q?a)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit El viewport del pase final es calculava com `Game::WIDTH * zoom_factor_`. Però `zoom_factor_` està capat a `max_zoom_`, que es deriva de `display - 100px` (marge per a decoracions). En fullscreen això deixa marc negre als 4 costats: amb display 1920×1080 max_zoom_≈1.25 → viewport 1600×900 dins de 1920×1080. Ara l'escala es calcula directament de la finestra física actual com a aspect-fit (`min(curW/1280, curH/720)`), de manera que el viewport sempre omple un eix i lletraboxeja l'altre, independentment del zoom_factor_. El zoom_factor_ continua dimensionant la finestra en mode windowed (F1/F2). --- source/core/rendering/sdl_manager.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/source/core/rendering/sdl_manager.cpp b/source/core/rendering/sdl_manager.cpp index 47c5416..6d4d587 100644 --- a/source/core/rendering/sdl_manager.cpp +++ b/source/core/rendering/sdl_manager.cpp @@ -173,10 +173,17 @@ void SDLManager::applyZoom(float new_zoom) { } void SDLManager::updateViewport() { - // Cálculo de letterbox: el juego se renderiza a 1280×720 lógicos, pero - // la swapchain tiene el tamaño físico de la ventana. Aplicamos un viewport - // centrado con la proporción 16:9 para preservar aspect ratio. - float scale = zoom_factor_; + // Càlcul de letterbox: el joc es renderitza a 1280×720 lògics, però la + // swapchain té la mida física de la finestra. Apliquem un viewport + // centrat amb aspect-fit (omple un eix, lletrabox a l'altre). + // + // IMPORTANT: l'escala del viewport es deriva de la mida física actual, + // NO del zoom_factor_. El zoom_factor_ només dimensiona la finestra en + // mode windowed (F1/F2). Si l'enllacéssim, en fullscreen el viewport + // quedaria capat per max_zoom_ (display-100px) i no ompliria la pantalla. + float scale_w = static_cast(current_width_) / Defaults::Game::WIDTH; + float scale_h = static_cast(current_height_) / Defaults::Game::HEIGHT; + float scale = std::min(scale_w, scale_h); int scaled_width = static_cast(std::round(Defaults::Game::WIDTH * scale)); int scaled_height = static_cast(std::round(Defaults::Game::HEIGHT * scale));