fix: arreglat bug en jail_shader.cpp que no aplicava be el tamany de la textura amb filtros al canviar el tamany de la finestra si arrancaves el joc sense filtros activats

This commit is contained in:
2025-10-02 17:24:40 +02:00
parent 7946ea54a6
commit e347e04d33

View File

@@ -257,6 +257,12 @@ bool init(SDL_Window *window, SDL_Texture *back_buffer_texture, const std::strin
return false; return false;
} }
// Limpiar shader anterior si existe
if (programId != INVALID_PROGRAM_ID) {
glDeleteProgram(programId);
programId = INVALID_PROGRAM_ID;
}
// Verificar que el renderer sea OpenGL // Verificar que el renderer sea OpenGL
if (!strncmp(render_name, "opengl", 6)) { if (!strncmp(render_name, "opengl", 6)) {
#ifndef __APPLE__ #ifndef __APPLE__
@@ -304,6 +310,10 @@ void render() {
SDL_RenderClear(renderer); SDL_RenderClear(renderer);
if (usingOpenGL && programId != INVALID_PROGRAM_ID) { if (usingOpenGL && programId != INVALID_PROGRAM_ID) {
// Obtener el tamaño actual de la ventana (puede haber cambiado desde init)
int current_win_width, current_win_height;
SDL_GetWindowSize(win, &current_win_width, &current_win_height);
// Guardar estados de OpenGL // Guardar estados de OpenGL
GLint oldProgramId; GLint oldProgramId;
glGetIntegerv(GL_CURRENT_PROGRAM, &oldProgramId); glGetIntegerv(GL_CURRENT_PROGRAM, &oldProgramId);
@@ -330,35 +340,35 @@ void render() {
SDL_RendererLogicalPresentation mode; SDL_RendererLogicalPresentation mode;
SDL_GetRenderLogicalPresentation(renderer, &logicalW, &logicalH, &mode); SDL_GetRenderLogicalPresentation(renderer, &logicalW, &logicalH, &mode);
if (logicalW == 0 || logicalH == 0) { if (logicalW == 0 || logicalH == 0) {
logicalW = win_size.x; logicalW = current_win_width;
logicalH = win_size.y; logicalH = current_win_height;
} }
// Cálculo del viewport // Cálculo del viewport
int viewportX = 0, viewportY = 0, viewportW = win_size.x, viewportH = win_size.y; int viewportX = 0, viewportY = 0, viewportW = current_win_width, viewportH = current_win_height;
const bool USE_INTEGER_SCALE = mode == SDL_LOGICAL_PRESENTATION_INTEGER_SCALE; const bool USE_INTEGER_SCALE = mode == SDL_LOGICAL_PRESENTATION_INTEGER_SCALE;
if (USE_INTEGER_SCALE) { if (USE_INTEGER_SCALE) {
// Calcula el factor de escalado entero máximo que se puede aplicar // Calcula el factor de escalado entero máximo que se puede aplicar
int scaleX = win_size.x / logicalW; int scaleX = current_win_width / logicalW;
int scaleY = win_size.y / logicalH; int scaleY = current_win_height / logicalH;
int scale = (scaleX < scaleY ? scaleX : scaleY); int scale = (scaleX < scaleY ? scaleX : scaleY);
if (scale < 1) { if (scale < 1) {
scale = 1; scale = 1;
} }
viewportW = logicalW * scale; viewportW = logicalW * scale;
viewportH = logicalH * scale; viewportH = logicalH * scale;
viewportX = (win_size.x - viewportW) / 2; viewportX = (current_win_width - viewportW) / 2;
viewportY = (win_size.y - viewportH) / 2; viewportY = (current_win_height - viewportH) / 2;
} else { } else {
// Letterboxing: preserva la relación de aspecto usando una escala flotante // Letterboxing: preserva la relación de aspecto usando una escala flotante
float windowAspect = static_cast<float>(win_size.x) / win_size.y; float windowAspect = static_cast<float>(current_win_width) / current_win_height;
float logicalAspect = static_cast<float>(logicalW) / logicalH; float logicalAspect = static_cast<float>(logicalW) / logicalH;
if (windowAspect > logicalAspect) { if (windowAspect > logicalAspect) {
viewportW = static_cast<int>(logicalAspect * win_size.y); viewportW = static_cast<int>(logicalAspect * current_win_height);
viewportX = (win_size.x - viewportW) / 2; viewportX = (current_win_width - viewportW) / 2;
} else { } else {
viewportH = static_cast<int>(win_size.x / logicalAspect); viewportH = static_cast<int>(current_win_width / logicalAspect);
viewportY = (win_size.y - viewportH) / 2; viewportY = (current_win_height - viewportH) / 2;
} }
} }
glViewport(viewportX, viewportY, viewportW, viewportH); glViewport(viewportX, viewportY, viewportW, viewportH);