diff --git a/source/screen.cpp b/source/screen.cpp index b6356f2..1aa80bc 100644 --- a/source/screen.cpp +++ b/source/screen.cpp @@ -76,6 +76,17 @@ Screen::Screen(SDL_Window *window, SDL_Renderer *renderer) } } + // Crea la textura donde se dibuja el borde que rodea el area de juego + shaders_texture_ = SDL_CreateTexture(renderer_, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, options.game.width + options.video.border.width * 2, options.game.height + options.video.border.height * 2); + if (!shaders_texture_) + { + // Registrar el error si está habilitado + if (options.console) + { + std::cerr << "Error: shaders_texture_ could not be created!\nSDL Error: " << SDL_GetError() << std::endl; + } + } + // Crea la surface donde se dibujan los graficos del juego game_surface_ = std::make_shared(options.game.width, options.game.height); game_surface_->loadPalette(palettes_.at(current_palette_)); @@ -103,6 +114,7 @@ Screen::~Screen() { SDL_DestroyTexture(game_texture_); SDL_DestroyTexture(border_texture_); + SDL_DestroyTexture(shaders_texture_); } // Limpia la pantalla @@ -225,6 +237,7 @@ void Screen::setBorderEnabled(bool value) { options.video.border.enabled = value void Screen::toggleBorder() { options.video.border.enabled = !options.video.border.enabled; + createShadersTexture(); setVideoMode(options.video.mode); } @@ -320,7 +333,7 @@ void Screen::resetShaders() std::ifstream f(Asset::get()->get(GLSL_FILE).c_str()); std::string source((std::istreambuf_iterator(f)), std::istreambuf_iterator()); - shader::init(window_, options.video.border.enabled ? border_texture_ : game_texture_, source.c_str()); + shader::init(window_, shaders_texture_, source.c_str()); } } @@ -383,18 +396,20 @@ void Screen::surfaceToTexture() // Copia la textura al renderizador void Screen::textureToRenderer() { - - SDL_SetRenderTarget(renderer_, nullptr); - SDL_SetRenderDrawColor(renderer_, 0x00, 0x00, 0x00, 0xFF); - SDL_RenderClear(renderer_); + SDL_Texture *texture_to_render = options.video.border.enabled ? border_texture_ : game_texture_; if (options.video.shaders) { + SDL_SetRenderTarget(renderer_, shaders_texture_); + SDL_RenderCopy(renderer_, texture_to_render, nullptr, nullptr); + SDL_SetRenderTarget(renderer_, nullptr); shader::render(); } else { - SDL_Texture *texture_to_render = options.video.border.enabled ? border_texture_ : game_texture_; + SDL_SetRenderTarget(renderer_, nullptr); + SDL_SetRenderDrawColor(renderer_, 0x00, 0x00, 0x00, 0xFF); + SDL_RenderClear(renderer_); SDL_RenderCopy(renderer_, texture_to_render, nullptr, nullptr); SDL_RenderPresent(renderer_); } @@ -420,3 +435,23 @@ size_t Screen::findPalette(const std::string &name) } return static_cast(0); } + +// Recrea la textura para los shaders +void Screen::createShadersTexture() +{ + if (shaders_texture_) + { + SDL_DestroyTexture(shaders_texture_); + } + + // Crea la textura donde se dibuja el borde que rodea el area de juego + shaders_texture_ = SDL_CreateTexture(renderer_, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, options.game.width + options.video.border.width * 2, options.game.height + options.video.border.height * 2); + if (!shaders_texture_) + { + // Registrar el error si está habilitado + if (options.console) + { + std::cerr << "Error: shaders_texture_ could not be created!\nSDL Error: " << SDL_GetError() << std::endl; + } + } +} \ No newline at end of file diff --git a/source/screen.h b/source/screen.h index d7930c2..e5000b4 100644 --- a/source/screen.h +++ b/source/screen.h @@ -30,6 +30,7 @@ private: SDL_Renderer *renderer_; // El renderizador de la ventana SDL_Texture *game_texture_; // Textura donde se dibuja el juego SDL_Texture *border_texture_; // Textura donde se dibuja el borde del juego + SDL_Texture *shaders_texture_; // Textura para aplicar los shaders std::shared_ptr game_surface_; // Surface principal para manejar game_surface_data_ std::shared_ptr border_surface_; // Surface para pintar el el borde de la pantalla std::shared_ptr> renderer_surface_; // Puntero a la Surface que actua @@ -71,7 +72,10 @@ private: void renderOverlays(); // Localiza la paleta dentro del vector de paletas - size_t findPalette(const std::string& name); + size_t findPalette(const std::string &name); + + // Recrea la textura para los shaders + void createShadersTexture(); // Constructor Screen(SDL_Window *window, SDL_Renderer *renderer);