Fix: TextRenderer aplica offset de viewport para modo letterbox (F3)
Corrige el posicionamiento del texto HUD en modo F3 (letterbox) cuando SDL3 crea barras negras y ajusta el viewport con offset para centrar. ## Problema En modo letterbox (F3), SDL_LOGICAL_PRESENTATION_LETTERBOX crea: - Barras negras para mantener aspect ratio - Viewport con offset (x, y) para centrar la imagen renderizada Cuando printAbsolute() deshabilitaba temporalmente la presentación lógica, perdía el offset del viewport y pintaba en (0,0) absoluto, cayendo en las barras negras. ## Solución **textrenderer.cpp - printAbsolute():** - Obtener viewport ANTES de deshabilitar presentación lógica - Aplicar offset del viewport a coordenadas físicas: - `dest_rect.x = physical_x + viewport.x` - `dest_rect.y = physical_y + viewport.y` ## Resultado ✅ HUD se pinta dentro del área visible con offset de letterbox ✅ Compatible con todos los modos: - Ventana normal - F3 letterbox (con barras negras) - F4 stretch fullscreen 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -186,10 +186,16 @@ void TextRenderer::printAbsolute(int physical_x, int physical_y, const char* tex
|
|||||||
SDL_SetTextureAlphaModFloat(text_texture, color.a / 255.0f);
|
SDL_SetTextureAlphaModFloat(text_texture, color.a / 255.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Obtener viewport ANTES de deshabilitar presentación lógica
|
||||||
|
// En modo letterbox (F3), SDL crea un viewport con offset para centrar la imagen
|
||||||
|
SDL_Rect viewport;
|
||||||
|
SDL_GetRenderViewport(renderer_, &viewport);
|
||||||
|
|
||||||
// Preparar rectángulo de destino en coordenadas físicas absolutas
|
// Preparar rectángulo de destino en coordenadas físicas absolutas
|
||||||
|
// Aplicar offset del viewport para que el texto se pinte dentro del área visible
|
||||||
SDL_FRect dest_rect;
|
SDL_FRect dest_rect;
|
||||||
dest_rect.x = static_cast<float>(physical_x);
|
dest_rect.x = static_cast<float>(physical_x + viewport.x);
|
||||||
dest_rect.y = static_cast<float>(physical_y);
|
dest_rect.y = static_cast<float>(physical_y + viewport.y);
|
||||||
dest_rect.w = static_cast<float>(text_surface->w);
|
dest_rect.w = static_cast<float>(text_surface->w);
|
||||||
dest_rect.h = static_cast<float>(text_surface->h);
|
dest_rect.h = static_cast<float>(text_surface->h);
|
||||||
|
|
||||||
@@ -198,7 +204,7 @@ void TextRenderer::printAbsolute(int physical_x, int physical_y, const char* tex
|
|||||||
SDL_RendererLogicalPresentation presentation_mode;
|
SDL_RendererLogicalPresentation presentation_mode;
|
||||||
SDL_GetRenderLogicalPresentation(renderer_, &logical_w, &logical_h, &presentation_mode);
|
SDL_GetRenderLogicalPresentation(renderer_, &logical_w, &logical_h, &presentation_mode);
|
||||||
|
|
||||||
// Renderizar sin presentación lógica (coordenadas absolutas)
|
// Renderizar sin presentación lógica (coordenadas absolutas con offset de viewport)
|
||||||
SDL_SetRenderLogicalPresentation(renderer_, 0, 0, SDL_LOGICAL_PRESENTATION_DISABLED);
|
SDL_SetRenderLogicalPresentation(renderer_, 0, 0, SDL_LOGICAL_PRESENTATION_DISABLED);
|
||||||
SDL_RenderTexture(renderer_, text_texture, nullptr, &dest_rect);
|
SDL_RenderTexture(renderer_, text_texture, nullptr, &dest_rect);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user