gonna fer un commit per si reventa algo: estic a meitat implementar surfaces

This commit is contained in:
2025-02-28 22:58:01 +01:00
parent 5bb2b5e7c4
commit 5ff04daf20
14 changed files with 511 additions and 157 deletions

View File

@@ -13,6 +13,7 @@
#include "notifier.h" // Para Notify
#include "options.h"
#include "mouse.h"
#include "surface.h"
// [SINGLETON]
Screen *Screen::screen_ = nullptr;
@@ -50,27 +51,41 @@ Screen::Screen(SDL_Window *window, SDL_Renderer *renderer)
// Establece el modo de escalado
SDL_RenderSetIntegerScale(renderer_, options.video.integer_scale ? SDL_TRUE : SDL_FALSE);
// Crea la textura donde se dibujan los graficos del juego
game_canvas_ = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, options.game.width, options.game.height);
if (game_canvas_ == nullptr)
// Crea la textura donde se vuelcan las surfaces
surface_texture_ = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_STREAMING, options.game.width, options.game.height);
if (surface_texture_ == nullptr)
{
if (options.console)
{
std::cout << "gameCanvas could not be created!\nSDL Error: " << SDL_GetError() << std::endl;
std::cout << "surface_texture_ could not be created!\nSDL Error: " << SDL_GetError() << std::endl;
}
}
// Crea la textura donde se dibujan los graficos del juego
game_texture_ = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, options.game.width, options.game.height);
if (game_texture_ == nullptr)
{
if (options.console)
{
std::cout << "game_texture_ could not be created!\nSDL Error: " << SDL_GetError() << std::endl;
}
}
// Crea la textura donde se dibuja el borde que rodea el area de juego
border_canvas_ = 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 (border_canvas_ == nullptr)
border_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 (border_texture_ == nullptr)
{
if (options.console)
{
std::cout << "borderCanvas could not be created!\nSDL Error: " << SDL_GetError() << std::endl;
std::cout << "border_texture_ could not be created!\nSDL Error: " << SDL_GetError() << std::endl;
}
}
setBorderColor(border_color_);
// Crea la surface donde se pinta el juego
surface_ = std::make_shared<Surface>(nullptr, options.game.width, options.game.height);
surface_->loadPalette(Asset::get()->get("test.gif"));
// Establece el modo de video
setVideoMode(options.video.mode);
@@ -82,8 +97,9 @@ Screen::Screen(SDL_Window *window, SDL_Renderer *renderer)
// Destructor
Screen::~Screen()
{
SDL_DestroyTexture(game_canvas_);
SDL_DestroyTexture(border_canvas_);
SDL_DestroyTexture(surface_texture_);
SDL_DestroyTexture(game_texture_);
SDL_DestroyTexture(border_texture_);
}
// Limpia la pantalla
@@ -96,13 +112,14 @@ void Screen::clean(Color color)
// Prepara para empezar a dibujar en la textura de juego
void Screen::start()
{
SDL_SetRenderTarget(renderer_, game_canvas_);
surface_->clear(surface_->getSurface(), surface_->getTransparentColor());
SDL_SetRenderTarget(renderer_, game_texture_);
}
// Prepara para empezar a dibujar en la textura del borde
void Screen::startDrawOnBorder()
{
SDL_SetRenderTarget(renderer_, border_canvas_);
SDL_SetRenderTarget(renderer_, border_texture_);
}
// Vuelca el contenido del renderizador en pantalla
@@ -111,6 +128,8 @@ void Screen::render()
// Renderiza sobre gameCanvas los overlays
renderNotifications();
surface_->copyToTexture(renderer_, game_texture_);
// Si está el borde activo, vuelca gameCanvas sobre borderCanvas
if (options.video.border.enabled)
{
@@ -174,11 +193,11 @@ void Screen::setVideoMode(int videoMode)
if (options.video.border.enabled)
{
shader::init(window_, border_canvas_, source.c_str());
shader::init(window_, border_texture_, source.c_str());
}
else
{
shader::init(window_, game_canvas_, source.c_str());
shader::init(window_, game_texture_, source.c_str());
}
}
}
@@ -233,7 +252,7 @@ void Screen::setBorderColor(Color color)
{
border_color_ = color;
auto temp = SDL_GetRenderTarget(renderer_);
SDL_SetRenderTarget(renderer_, border_canvas_);
SDL_SetRenderTarget(renderer_, border_texture_);
SDL_SetRenderDrawColor(renderer_, border_color_.r, border_color_.g, border_color_.b, 0xFF);
SDL_RenderClear(renderer_);
SDL_SetRenderTarget(renderer_, temp);
@@ -279,8 +298,8 @@ void Screen::renderNotifications()
void Screen::gameCanvasToBorderCanvas()
{
auto temp = SDL_GetRenderTarget(renderer_);
SDL_SetRenderTarget(renderer_, border_canvas_);
SDL_RenderCopy(renderer_, game_canvas_, nullptr, &game_canvas_rect_);
SDL_SetRenderTarget(renderer_, border_texture_);
SDL_RenderCopy(renderer_, game_texture_, nullptr, &game_texture_rect_);
SDL_SetRenderTarget(renderer_, temp);
}
@@ -300,11 +319,11 @@ void Screen::renderPresent()
{
if (options.video.border.enabled)
{
SDL_RenderCopy(renderer_, border_canvas_, nullptr, nullptr);
SDL_RenderCopy(renderer_, border_texture_, nullptr, nullptr);
}
else
{
SDL_RenderCopy(renderer_, game_canvas_, nullptr, &game_canvas_rect_);
SDL_RenderCopy(renderer_, game_texture_, nullptr, &game_texture_rect_);
}
SDL_RenderPresent(renderer_);
}
@@ -364,7 +383,7 @@ void Screen::adjustWindowSize()
// Ajusta game_canvas_rect_
void Screen::adjustGameCanvasRect()
{
game_canvas_rect_ = {
game_texture_rect_ = {
options.video.border.enabled ? options.video.border.width : 0,
options.video.border.enabled ? options.video.border.height : 0,
options.game.width,
@@ -388,7 +407,7 @@ int Screen::getMaxZoom()
// Calcula el máximo factor de zoom que se puede aplicar a la pantalla
const int max_zoom = std::min(DM.w / window_width_, (DM.h - WINDOWS_DECORATIONS_) / window_height_);
// Normaliza los valores de zoom
options.window.zoom = std::min(options.window.zoom, max_zoom);