From e347e04d33e1023410128c5d63e3522ecaa7fd01 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Thu, 2 Oct 2025 17:24:40 +0200 Subject: [PATCH] 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 --- source/external/jail_shader.cpp | 34 +++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/source/external/jail_shader.cpp b/source/external/jail_shader.cpp index a730de9..33fbee4 100644 --- a/source/external/jail_shader.cpp +++ b/source/external/jail_shader.cpp @@ -257,6 +257,12 @@ bool init(SDL_Window *window, SDL_Texture *back_buffer_texture, const std::strin return false; } + // Limpiar shader anterior si existe + if (programId != INVALID_PROGRAM_ID) { + glDeleteProgram(programId); + programId = INVALID_PROGRAM_ID; + } + // Verificar que el renderer sea OpenGL if (!strncmp(render_name, "opengl", 6)) { #ifndef __APPLE__ @@ -304,6 +310,10 @@ void render() { SDL_RenderClear(renderer); 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, ¤t_win_width, ¤t_win_height); + // Guardar estados de OpenGL GLint oldProgramId; glGetIntegerv(GL_CURRENT_PROGRAM, &oldProgramId); @@ -330,35 +340,35 @@ void render() { SDL_RendererLogicalPresentation mode; SDL_GetRenderLogicalPresentation(renderer, &logicalW, &logicalH, &mode); if (logicalW == 0 || logicalH == 0) { - logicalW = win_size.x; - logicalH = win_size.y; + logicalW = current_win_width; + logicalH = current_win_height; } // 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; if (USE_INTEGER_SCALE) { // Calcula el factor de escalado entero máximo que se puede aplicar - int scaleX = win_size.x / logicalW; - int scaleY = win_size.y / logicalH; + int scaleX = current_win_width / logicalW; + int scaleY = current_win_height / logicalH; int scale = (scaleX < scaleY ? scaleX : scaleY); if (scale < 1) { scale = 1; } viewportW = logicalW * scale; viewportH = logicalH * scale; - viewportX = (win_size.x - viewportW) / 2; - viewportY = (win_size.y - viewportH) / 2; + viewportX = (current_win_width - viewportW) / 2; + viewportY = (current_win_height - viewportH) / 2; } else { // Letterboxing: preserva la relación de aspecto usando una escala flotante - float windowAspect = static_cast(win_size.x) / win_size.y; + float windowAspect = static_cast(current_win_width) / current_win_height; float logicalAspect = static_cast(logicalW) / logicalH; if (windowAspect > logicalAspect) { - viewportW = static_cast(logicalAspect * win_size.y); - viewportX = (win_size.x - viewportW) / 2; + viewportW = static_cast(logicalAspect * current_win_height); + viewportX = (current_win_width - viewportW) / 2; } else { - viewportH = static_cast(win_size.x / logicalAspect); - viewportY = (win_size.y - viewportH) / 2; + viewportH = static_cast(current_win_width / logicalAspect); + viewportY = (current_win_height - viewportH) / 2; } } glViewport(viewportX, viewportY, viewportW, viewportH);