#pragma once #include // Para Uint8, SDL_FRect, SDL_Renderer, SDL_Texture, Uint16 #include // Para vector struct Color; // --- Clase Fade: gestor de transiciones de fundido --- class Fade { public: // --- Enums --- enum class Type : Uint8 { FULLSCREEN = 0, // Fundido de pantalla completa CENTER = 1, // Fundido desde el centro RANDOM_SQUARE = 2, // Fundido con cuadrados aleatorios RANDOM_SQUARE2 = 3, // Fundido con cuadrados aleatorios (variante 2) DIAGONAL = 4, // Fundido diagonal desde esquina superior izquierda VENETIAN = 5, // Fundido tipo persiana veneciana }; enum class Mode : Uint8 { IN = 0, // Fundido de entrada OUT = 1, // Fundido de salida }; enum class State : Uint8 { NOT_ENABLED = 0, // No activado PRE = 1, // Estado previo FADING = 2, // Fundiendo POST = 3, // Estado posterior FINISHED = 4, // Finalizado }; // --- Constructores y destructor --- Fade(); ~Fade(); // --- Métodos principales --- void reset(); // Resetea variables para reutilizar el fade void render(); // Dibuja la transición en pantalla void update(); // Actualiza el estado interno (ya usa tiempo real) void update(float delta_time); // Compatibilidad delta-time (ignora el parámetro) void activate(); // Activa el fade // --- Configuración --- void setColor(Uint8 r, Uint8 g, Uint8 b); // Establece el color RGB del fade void setColor(Color color); // Establece el color del fade void setType(Type type) { type_ = type; } // Establece el tipo de fade void setMode(Mode mode) { mode_ = mode; } // Establece el modo de fade void setPostDuration(int milliseconds) { post_duration_ = milliseconds; } // Duración posterior al fade en milisegundos void setPreDuration(int milliseconds) { pre_duration_ = milliseconds; } // Duración previa al fade en milisegundos // --- Getters --- [[nodiscard]] auto getValue() const -> int { return value_; } [[nodiscard]] auto isEnabled() const -> bool { return state_ != State::NOT_ENABLED; } [[nodiscard]] auto hasEnded() const -> bool { return state_ == State::FINISHED; } private: // --- Objetos y punteros --- SDL_Renderer *renderer_; // Renderizador de la ventana SDL_Texture *backbuffer_; // Backbuffer para efectos // --- Variables de estado --- std::vector square_; // Vector de cuadrados std::vector square_age_; // Edad de cada cuadrado (para RANDOM_SQUARE2) SDL_FRect rect1_, rect2_; // Rectángulos para efectos Type type_; // Tipo de fade Mode mode_; // Modo de fade State state_ = State::NOT_ENABLED; // Estado actual Uint16 counter_; // Contador interno Uint8 r_, g_, b_, a_; // Color del fade (RGBA) int num_squares_width_; // Cuadrados en horizontal int num_squares_height_; // Cuadrados en vertical Uint32 random_squares_start_time_; // Tiempo de inicio del fade de cuadrados int random_squares_duration_; // Duración total en milisegundos int square_transition_duration_; // Duración de transición de cada cuadrado en ms int post_duration_ = 0; // Duración posterior en milisegundos Uint32 post_start_time_ = 0; // Tiempo de inicio del estado POST int pre_duration_ = 0; // Duración previa en milisegundos Uint32 pre_start_time_ = 0; // Tiempo de inicio del estado PRE int value_ = 0; // Estado del fade (0-100) // --- Inicialización y limpieza --- void init(); // Inicializa variables void cleanBackbuffer(Uint8 r, Uint8 g, Uint8 b, Uint8 a); // Limpia el backbuffer con un color RGBA // --- Utilidades generales --- static auto calculateValue(int min, int max, int current) -> int; // Calcula el valor del fade entre dos límites // --- Lógica de estado --- void updatePreState(); // Actualiza el estado previo al fade void updateFadingState(); // Actualiza el estado durante el fade void updatePostState(); // Actualiza el estado posterior al fade void changeToPostState(); // Cambia al estado POST e inicializa el tiempo // --- Efectos de fundido (fade) --- void updateFullscreenFade(); // Actualiza el fundido de pantalla completa void updateCenterFade(); // Actualiza el fundido desde el centro void updateRandomSquareFade(); // Actualiza el fundido con cuadrados aleatorios void updateRandomSquare2Fade(); // Actualiza el fundido con cuadrados aleatorios (variante 2) void updateDiagonalFade(); // Actualiza el fundido diagonal void updateVenetianFade(); // Actualiza el fundido tipo persiana veneciana void updateVenetianRectangles(); // Actualiza los rectángulos del efecto veneciano void calculateVenetianProgress(); // Calcula el progreso del efecto veneciano // --- Dibujo de efectos visuales --- void drawCenterFadeRectangles(); // Dibuja los rectángulos del fundido central void drawRandomSquares(int active_count = -1); // Dibuja los cuadrados aleatorios del fundido void drawRandomSquares2(); // Dibuja los cuadrados con transición de color (RANDOM_SQUARE2) void drawDiagonal(); // Dibuja los cuadrados con patrón diagonal void activateDiagonal(int diagonal_index, Uint32 current_time); // Activa una diagonal específica void drawVenetianBlinds(); // Dibuja las persianas venecianas del fundido };