#pragma once #include #include namespace Rendering { /** * @brief Parámetros de intensidad de los efectos PostFX * Definido a nivel de namespace para facilitar el uso desde subclases y screen.cpp */ struct PostFXParams { float vignette = 0.0F; // Intensidad de la viñeta float scanlines = 0.0F; // Intensidad de las scanlines float chroma = 0.0F; // Aberración cromática float mask = 0.0F; // Máscara de fósforo RGB float gamma = 0.0F; // Corrección gamma (blend 0=off, 1=full) float curvature = 0.0F; // Curvatura barrel CRT float bleeding = 0.0F; // Sangrado de color NTSC float flicker = 0.0F; // Parpadeo de fósforo CRT ~50 Hz }; /** * @brief Interfaz abstracta para backends de renderizado con shaders * * Esta interfaz define el contrato que todos los backends de shaders * deben cumplir (OpenGL, Metal, Vulkan, etc.) */ class ShaderBackend { public: virtual ~ShaderBackend() = default; /** * @brief Inicializa el backend de shaders * @param window Ventana SDL * @param texture Textura de backbuffer a la que aplicar shaders * @param vertex_source Código fuente del vertex shader * @param fragment_source Código fuente del fragment shader * @return true si la inicialización fue exitosa */ virtual auto init(SDL_Window* window, SDL_Texture* texture, const std::string& vertex_source, const std::string& fragment_source) -> bool = 0; /** * @brief Renderiza la textura con los shaders aplicados */ virtual void render() = 0; /** * @brief Establece el tamaño de la textura como parámetro del shader * @param width Ancho de la textura * @param height Alto de la textura */ virtual void setTextureSize(float width, float height) = 0; /** * @brief Limpia y libera recursos del backend */ virtual void cleanup() = 0; /** * @brief Sube píxeles ARGB8888 desde la CPU al backend de shaders * Usado por SDL3GPUShader para evitar pasar por SDL_Texture */ virtual void uploadPixels(const Uint32* /*pixels*/, int /*width*/, int /*height*/) {} /** * @brief Establece los parámetros de intensidad de los efectos PostFX * @param p Struct con todos los parámetros PostFX */ virtual void setPostFXParams(const PostFXParams& /*p*/) {} /** * @brief Activa o desactiva VSync en el swapchain del GPU device */ virtual void setVSync(bool /*vsync*/) {} /** * @brief Activa o desactiva el escalado entero (integer scale) */ virtual void setScaleMode(bool /*integer_scale*/) {} /** * @brief Establece el factor de supersampling (1 = off, 3 = 3× SS) * Con factor > 1, la textura GPU se crea a game×factor resolución y * las scanlines se hornean en CPU (uploadPixels). El sampler usa LINEAR. */ virtual void setOversample(int /*factor*/) {} /** * @brief Verifica si el backend está usando aceleración por hardware * @return true si usa aceleración (OpenGL/Metal/Vulkan) */ [[nodiscard]] virtual auto isHardwareAccelerated() const -> bool = 0; }; } // namespace Rendering