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:
34
source/external/jail_shader.cpp
vendored
34
source/external/jail_shader.cpp
vendored
@@ -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, ¤t_win_width, ¤t_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);
|
||||||
|
|||||||
Reference in New Issue
Block a user