From aa66dd41c1b4b841259373f6a7a43f8219bb74c2 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Wed, 3 Dec 2025 08:23:42 +0100 Subject: [PATCH] =?UTF-8?q?ja=20renderitza=20a=20la=20resoluci=C3=B3=20de?= =?UTF-8?q?=20la=20finestra?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/core/rendering/sdl_manager.cpp | 51 +++++++++++++++++++++------ source/core/rendering/sdl_manager.hpp | 5 +++ source/game/escenes/escena_joc.cpp | 3 ++ source/game/escenes/escena_logo.cpp | 3 ++ source/game/escenes/escena_titol.cpp | 3 ++ 5 files changed, 55 insertions(+), 10 deletions(-) diff --git a/source/core/rendering/sdl_manager.cpp b/source/core/rendering/sdl_manager.cpp index 65d419d..22477fe 100644 --- a/source/core/rendering/sdl_manager.cpp +++ b/source/core/rendering/sdl_manager.cpp @@ -8,6 +8,7 @@ #include #include "core/defaults.hpp" +#include "core/rendering/coordinate_transform.hpp" #include "core/rendering/line_renderer.hpp" #include "game/options.hpp" #include "project.h" @@ -228,6 +229,9 @@ void SDLManager::applyZoom(float new_zoom) { // Apply to window (centers via applyWindowSize) applyWindowSize(new_width, new_height); + // Update viewport for new zoom + updateViewport(); + // Update windowed size cache windowed_width_ = new_width; windowed_height_ = new_height; @@ -242,14 +246,38 @@ void SDLManager::applyZoom(float new_zoom) { } void SDLManager::updateLogicalPresentation() { - // AIXÒ ÉS LA MÀGIA: El joc SEMPRE dibuixa en 640x480, - // SDL escala automàticament a la mida física de la finestra - SDL_SetRenderLogicalPresentation( - renderer_, - Defaults::Game::WIDTH, // 640 (lògic) - Defaults::Game::HEIGHT, // 480 (lògic) - SDL_LOGICAL_PRESENTATION_LETTERBOX // Mantenir aspect ratio 4:3 - ); + // CANVIAT: Ja no usem SDL_SetRenderLogicalPresentation + // Ara renderitzem directament a resolució física per evitar pixelació irregular + // El viewport amb letterbox es configura a updateViewport() + updateViewport(); +} + +void SDLManager::updateViewport() { + // Calcular dimensions físiques basades en el zoom + float scale = zoom_factor_; + int scaled_width = static_cast(std::round(Defaults::Game::WIDTH * scale)); + int scaled_height = static_cast(std::round(Defaults::Game::HEIGHT * scale)); + + // Càlcul de letterbox (centrar l'àrea escalada) + int offset_x = (current_width_ - scaled_width) / 2; + int offset_y = (current_height_ - scaled_height) / 2; + + // Evitar offsets negatius + offset_x = std::max(offset_x, 0); + offset_y = std::max(offset_y, 0); + + // Configurar viewport per al renderitzat + SDL_Rect viewport = {offset_x, offset_y, scaled_width, scaled_height}; + SDL_SetRenderViewport(renderer_, &viewport); + + std::cout << "Viewport: " << scaled_width << "x" << scaled_height + << " @ (" << offset_x << "," << offset_y << ") [scale=" << scale << "]" + << std::endl; +} + +void SDLManager::updateRenderingContext() { + // Actualitzar el factor d'escala global per a totes les funcions de renderitzat + Rendering::g_current_scale_factor = zoom_factor_; } void SDLManager::increaseWindowSize() { @@ -300,8 +328,8 @@ void SDLManager::applyWindowSize(int new_width, int new_height) { SDL_SetWindowPosition(finestra_, new_x, new_y); - // NO cal actualitzar el logical presentation aquí, - // SDL ho maneja automàticament + // Actualitzar viewport després del resize + updateViewport(); } void SDLManager::toggleFullscreen() { @@ -345,6 +373,9 @@ bool SDLManager::handleWindowEvent(const SDL_Event& event) { windowed_height_ = current_height_; } + // Actualitzar viewport després del resize manual + updateViewport(); + std::cout << "Finestra redimensionada: " << current_width_ << "x" << current_height_ << " (zoom ≈" << zoom_factor_ << "x)" << std::endl; diff --git a/source/core/rendering/sdl_manager.hpp b/source/core/rendering/sdl_manager.hpp index 3cfbd07..0ac402c 100644 --- a/source/core/rendering/sdl_manager.hpp +++ b/source/core/rendering/sdl_manager.hpp @@ -42,10 +42,14 @@ class SDLManager { // Getters SDL_Renderer* obte_renderer() { return renderer_; } + float getScaleFactor() const { return zoom_factor_; } // [NUEVO] Actualitzar títol de la finestra void setWindowTitle(const std::string& title); + // [NUEVO] Actualitzar context de renderitzat (factor d'escala global) + void updateRenderingContext(); + private: SDL_Window* finestra_; SDL_Renderer* renderer_; @@ -74,6 +78,7 @@ class SDLManager { void applyZoom(float new_zoom); // Apply zoom and resize window void applyWindowSize(int width, int height); // Canviar mida + centrar void updateLogicalPresentation(); // Actualitzar viewport + void updateViewport(); // Configurar viewport amb letterbox // [NUEVO] Oscil·lador de colors Rendering::ColorOscillator color_oscillator_; diff --git a/source/game/escenes/escena_joc.cpp b/source/game/escenes/escena_joc.cpp index f3fe9b3..ea9934e 100644 --- a/source/game/escenes/escena_joc.cpp +++ b/source/game/escenes/escena_joc.cpp @@ -83,6 +83,9 @@ void EscenaJoc::executar() { // Netejar pantalla (usa color oscil·lat) sdl_.neteja(0, 0, 0); + // Actualitzar context de renderitzat (factor d'escala global) + sdl_.updateRenderingContext(); + // Dibuixar joc dibuixar(); diff --git a/source/game/escenes/escena_logo.cpp b/source/game/escenes/escena_logo.cpp index 3409dd0..79c06af 100644 --- a/source/game/escenes/escena_logo.cpp +++ b/source/game/escenes/escena_logo.cpp @@ -89,6 +89,9 @@ void EscenaLogo::executar() { // Actualitzar colors oscil·lats (efecte verd global) sdl_.updateColors(delta_time); + // Actualitzar context de renderitzat (factor d'escala global) + sdl_.updateRenderingContext(); + // Dibuixar dibuixar(); } diff --git a/source/game/escenes/escena_titol.cpp b/source/game/escenes/escena_titol.cpp index c2989cc..cb7c101 100644 --- a/source/game/escenes/escena_titol.cpp +++ b/source/game/escenes/escena_titol.cpp @@ -82,6 +82,9 @@ void EscenaTitol::executar() { // Netejar pantalla sdl_.neteja(0, 0, 0); + // Actualitzar context de renderitzat (factor d'escala global) + sdl_.updateRenderingContext(); + // Dibuixar dibuixar();