// sdl_manager.hpp - Gestor de inicialización de SDL3 // © 2025 Port a C++20 con SDL3 // // Tras la Fase 7 de la migración, el rendering ya no usa SDL_Renderer: // SDLManager posee un GpuFrameRenderer (SDL3 GPU) que es el contexto único // de dibujo del juego. El resto del código accede vía getRenderer() → // Rendering::Renderer* (alias del GpuFrameRenderer). #pragma once #include #include #include #include "core/rendering/render_context.hpp" class SDLManager { public: SDLManager(); // Constructor per defecte (usa Defaults::) SDLManager(int width, int height, bool fullscreen); // Constructor con configuración ~SDLManager(); // No permetre còpia ni assignació SDLManager(const SDLManager&) = delete; auto operator=(const SDLManager&) -> SDLManager& = delete; // [NUEVO] Gestió de finestra dinàmica void increaseWindowSize(); // F2: +100px void decreaseWindowSize(); // F1: -100px void toggleFullscreen(); // F3 void toggleVSync(); // F4 auto handleWindowEvent(const SDL_Event& event) -> bool; // Per a SDL_EVENT_WINDOW_RESIZED // Funciones principals (renderizado) void clear(uint8_t r = 0, uint8_t g = 0, uint8_t b = 0); void present(); // No-op desde la migración a postpro (la oscilación de brillo la // gestiona el shader, no la CPU). Se mantiene la firma para no tocar // los escenarios que la siguen invocando. void updateColors(float delta_time); // [NUEVO] Actualitzar counter de FPS void updateFPS(float delta_time); // Getters auto getRenderer() -> Rendering::Renderer* { return &gpu_renderer_; } [[nodiscard]] auto getScaleFactor() const -> float { return zoom_factor_; } // [NUEVO] Actualitzar título de la finestra void setWindowTitle(const std::string& title); // [NUEVO] Actualitzar context de renderizado (factor de scale global) void updateRenderingContext() const; private: SDL_Window* finestra_; Rendering::Renderer gpu_renderer_; // GpuFrameRenderer (SDL3 GPU) // [NUEVO] Variables FPS float fps_accumulator_; int fps_frame_count_; int fps_display_; // [NUEVO] Estat de la finestra int current_width_; // Mida física actual int current_height_; bool is_fullscreen_; int max_width_; // Calculat des del display int max_height_; // [ZOOM SYSTEM] float zoom_factor_; // Current zoom (0.5x to max_zoom_) int windowed_width_; // Saved size before fullscreen int windowed_height_; // Saved size before fullscreen float max_zoom_; // Maximum zoom (calculated from display) // [NUEVO] Funciones internes void calculateMaxWindowSize(); // Llegir resolució del display void calculateMaxZoom(); // Calculate max zoom from display void applyZoom(float new_zoom); // Apply zoom and resize window void applyWindowSize(int width, int height); // Canviar mida + centrar void updateViewport(); // Configurar viewport con letterbox };