fix Resource: ja es veu el text de càrrega amb els shaders actius

fix Screen: trampa per a que els shaders funcionen de serie en macos i linux
This commit is contained in:
2025-06-21 23:45:15 +02:00
parent 9b176a8cc0
commit b438a0ae16
4 changed files with 229 additions and 56 deletions

View File

@@ -50,9 +50,6 @@ Screen::Screen()
game_canvas_ = SDL_CreateTexture(renderer_, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, param.game.width, param.game.height);
SDL_SetTextureScaleMode(game_canvas_, SDL_SCALEMODE_NEAREST);
// Inicializa variables
adjustRenderLogicalSize();
// Crea el objeto de texto
createText();
@@ -62,8 +59,13 @@ Screen::Screen()
#endif
// Inicializa los shaders
show();
initShaders();
// Al parecer los shaders en macos y linux no funcionan si no se ha renderizado almenos una vez
auto temp = Options::video.shaders;
Options::video.shaders = false;
renderScreen();
Options::video.shaders = temp;
}
// Destructor
@@ -275,23 +277,26 @@ void Screen::initShaders()
// Calcula el tamaño de la ventana
void Screen::adjustWindowSize()
{
// Establece el nuevo tamaño
const int WIDTH = param.game.width * Options::window.size;
const int HEIGHT = param.game.height * Options::window.size;
// if (!Options::video.fullscreen)
{
// Establece el nuevo tamaño
const int WIDTH = param.game.width * Options::window.size;
const int HEIGHT = param.game.height * Options::window.size;
int old_width, old_height;
SDL_GetWindowSize(window_, &old_width, &old_height);
int old_width, old_height;
SDL_GetWindowSize(window_, &old_width, &old_height);
int old_pos_x, old_pos_y;
SDL_GetWindowPosition(window_, &old_pos_x, &old_pos_y);
int old_pos_x, old_pos_y;
SDL_GetWindowPosition(window_, &old_pos_x, &old_pos_y);
const int NEW_POS_X = old_pos_x + (old_width - WIDTH) / 2;
const int NEW_POS_Y = old_pos_y + (old_height - HEIGHT) / 2;
const int NEW_POS_X = old_pos_x + (old_width - WIDTH) / 2;
const int NEW_POS_Y = old_pos_y + (old_height - HEIGHT) / 2;
SDL_SetWindowPosition(window_, std::max(NEW_POS_X, WINDOWS_DECORATIONS_), std::max(NEW_POS_Y, 0));
SDL_SetWindowSize(window_, WIDTH, HEIGHT);
SDL_SetWindowPosition(window_, std::max(NEW_POS_X, WINDOWS_DECORATIONS_), std::max(NEW_POS_Y, 0));
SDL_SetWindowSize(window_, WIDTH, HEIGHT);
initShaders();
initShaders();
}
}
// Renderiza todos los overlays y efectos
@@ -360,10 +365,10 @@ bool Screen::initSDLVideo()
else
{
SDL_SetRenderDrawColor(renderer_, 0x00, 0x00, 0x00, 0xFF);
SDL_SetRenderLogicalPresentation(renderer_, param.game.width, param.game.height, SDL_LOGICAL_PRESENTATION_INTEGER_SCALE);
SDL_SetWindowFullscreen(window_, Options::video.fullscreen);
SDL_SetRenderLogicalPresentation(renderer_, param.game.width, param.game.height, Options::video.integer_scale ? SDL_LOGICAL_PRESENTATION_INTEGER_SCALE : SDL_LOGICAL_PRESENTATION_LETTERBOX);
SDL_SetRenderDrawBlendMode(renderer_, SDL_BLENDMODE_BLEND);
SDL_SetRenderVSync(renderer_, Options::video.v_sync ? 1 : SDL_RENDERER_VSYNC_DISABLED);
SDL_SetWindowFullscreen(window_, Options::video.fullscreen);
}
}
}
@@ -414,11 +419,17 @@ void Screen::getDisplayInfo()
}
}
// Alterna entre activar y desactivar los shaders
void Screen::toggleShaders()
{
Options::video.shaders = !Options::video.shaders;
}
// Alterna entre activar y desactivar el escalado entero
void Screen::toggleIntegerScale()
{
Options::video.integer_scale = !Options::video.integer_scale;
SDL_SetRenderLogicalPresentation(Screen::get()->getRenderer(), param.game.width, param.game.height, Options::video.integer_scale ? SDL_LOGICAL_PRESENTATION_INTEGER_SCALE : SDL_LOGICAL_PRESENTATION_LETTERBOX);
SDL_SetRenderLogicalPresentation(renderer_, param.game.width, param.game.height, Options::video.integer_scale ? SDL_LOGICAL_PRESENTATION_INTEGER_SCALE : SDL_LOGICAL_PRESENTATION_LETTERBOX);
}
// Alterna entre activar y desactivar el V-Sync
@@ -455,5 +466,5 @@ void Screen::applySettings()
void Screen::createText()
{
auto texture = std::make_shared<Texture>(getRenderer(), Asset::get()->get("aseprite.png"));
text_ = std::make_unique<Text>(texture, Asset::get()->get("aseprite.txt"));
text_ = std::make_shared<Text>(texture, Asset::get()->get("aseprite.txt"));
}