Problemas resueltos:
- En 640x360, el overlay generaba textura enorme con letras grandes
- El cálculo de font size usaba dimensiones físicas (con zoom aplicado)
en lugar de dimensiones lógicas (resolución interna)
- No había límite máximo de ancho para el overlay
- Padding fijo de 25px era excesivo en pantallas pequeñas
Cambios realizados:
1. UIManager: Usar dimensiones lógicas para calcular font size
- Nuevo parámetro logical_width/logical_height en initialize()
- calculateFontSize() ahora usa altura lógica sin zoom
- Escalado híbrido: proporcional en extremos, escalonado en rango medio
- Para 640x360: 10px (antes 18px con zoom 2x)
- Para 640x480: 12px (antes 24px con zoom 2x)
2. HelpOverlay: Agregar límites máximos de dimensiones
- Box width limitado al 95% del ancho físico
- Box height limitado al 90% de la altura física
- Padding dinámico: 25px para >=600px, escalado para menores
- Para 360px altura: padding de 15px (antes 25px fijo)
3. Engine: Pasar dimensiones lógicas a UIManager
- initialize() ahora recibe current_screen_width/height
Resultado:
- 640x360: Overlay compacto con fuente 10px que cabe en pantalla
- 640x480: Overlay con fuente 12px (tamaño apropiado)
- Tamaño de fuente consistente independiente del zoom de ventana
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Implementación de deformación elástica con vértices para el logo:
FADE IN (0.5s):
- Scale: 120% → 100% con easing elástico (bounce)
- Squash Y: 0.6 → 1.0 con easing back (aplastamiento)
- Stretch X: compensación automática
- Efecto: logo se "pega" aplastándose y rebotando
FADE OUT (0.5s):
- Scale: 100% → 120% (aceleración cuadrática)
- Squash Y: 1.0 → 1.3 (estiramiento vertical)
- Stretch X: 1.0 → 0.8 (compresión horizontal)
- Rotación: 0° → ~5.7° (torsión sutil)
- Efecto: logo se "despega" estirándose y girando
Características técnicas:
- Enum AppLogoAnimationType (ZOOM_ONLY / ELASTIC_STICK)
- Renderizado con SDL_RenderGeometry para deformaciones
- Funciones de easing: easeOutElastic() y easeOutBack()
- Transformación de vértices con rotación y escala 2D
- Actualmente fijo en ELASTIC_STICK para testing
Limpieza adicional:
- Eliminado dbgtxt.h (no utilizado)
- Removidos SDL_Log de debug en HelpOverlay
- Comentada variable no usada en ShapeManager
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Problema:
- Solo columna 0 verificaba si cabía más texto antes de escribir
- Columna 1 (derecha) escribía fuera del overlay si no cabía
- En ventanas de 600px altura, columna 1 se desbordaba
Solución:
- Eliminada restricción `&& current_column == 0` del check de padding
- Ahora AMBAS columnas verifican si caben antes de escribir
- Si columna 1 está llena: omitir texto restante (continue)
- Si columna 0 está llena: cambiar a columna 1
Comportamiento preferido por el usuario:
"prefiero que 'falte texto' a que el texto se escriba por fuera del overlay"
Resultado:
✅ Columna 0 cambia a columna 1 cuando se llena
✅ Columna 1 omite texto que no cabe
✅ Overlay nunca muestra texto fuera de sus límites
✅ Funciona correctamente en ventanas pequeñas (600px)
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
Problemas resueltos:
- En modo F3 (letterbox), el overlay se centraba en pantalla física
en lugar de en el viewport visible, quedando desplazado
- Al salir de F3 a ventana, el overlay seguía roto
- Padding inferior no se respetaba correctamente
Cambios implementados:
1. render() ahora usa SDL_GetRenderViewport() para obtener área visible
2. Centrado calculado dentro del viewport (con offset de barras negras)
3. toggleFullscreen() restaura tamaño de ventana al salir de F3
4. Padding check movido ANTES de escribir línea (>= en lugar de >)
5. Debug logging añadido para diagnóstico de dimensiones
Resultado:
✅ Overlay centrado correctamente en F3 letterbox
✅ Overlay se regenera correctamente al salir de F3
✅ Padding inferior respetado en columna 0
Pendiente:
- Columna 2 (índice 1) todavía no respeta padding inferior
- Verificar que F4 (real fullscreen) siga funcionando correctamente
🤖 Generated with Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
Correcciones críticas para overlay en fullscreen y padding:
1. Fullscreen/resize roto CORREGIDO:
- Problema: orden incorrecto de actualizaciones causaba mezcla de
dimensiones antiguas (800x600) con font nuevo (24px)
- Solución: nuevo método updateAll() que actualiza font Y dimensiones
de forma atómica
- Flujo correcto: dimensiones físicas → font → recalcular box
- Antes: overlay gigante y descuadrado al cambiar fullscreen
- Ahora: overlay se reposiciona y escala correctamente
2. Padding inferior inexistente CORREGIDO:
- Problema: calculateTextDimensions() usaba num_lines/2 asumiendo
división perfecta entre columnas
- Problema 2: rebuildCachedTexture() no verificaba límite inferior
en columna 1
- Solución: contar líneas REALES en cada columna y usar el máximo
- Fórmula correcta: line_height*2 + max_column_lines*line_height + padding*2
- Ahora: padding inferior respetado siempre
3. Implementación técnica:
- HelpOverlay::updateAll(font, width, height) nuevo método unificado
- UIManager llama updateAll() en lugar de reinitializeFontSize() +
updatePhysicalWindowSize() separadamente
- Elimina race condition entre actualización de font y dimensiones
Resultado:
- F3/F4 (fullscreen) funciona correctamente
- Resize ventana (F1/F2) funciona correctamente
- Padding inferior respetado en ambas columnas
- Sin overlays gigantes o descuadrados
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Tres correcciones importantes para el Help Overlay:
1. Solapamiento de columnas corregido:
- Añadidos column1_width_ y column2_width_ para anchos reales
- calculateTextDimensions() ahora incluye encabezados en cálculo
- rebuildCachedTexture() usa anchos reales de columnas
- Columna 2 empieza en padding + column1_width_ + padding
- Elimina cálculo erróneo column_width = (box_width_ - padding*3)/2
2. Layout en alta resolución corregido:
- Eliminado ancho mínimo forzado del 90% de dimensión menor
- box_width_ ahora usa directamente text_width (justo lo necesario)
- Antes: 1920x1080 → min 972px aunque contenido necesite 600px
- Ahora: box ajustado al contenido sin espacio vacío extra
3. Fullscreen/resize corregido:
- reinitializeFontSize() ya NO llama a calculateBoxDimensions()
- Evita recalcular con physical_width_ y physical_height_ antiguos
- Confía en updatePhysicalWindowSize() que se llama después
- Antes: textura cacheada creada con dimensiones incorrectas
- Ahora: textura siempre creada con dimensiones correctas
Resultado:
- Columnas no se montan entre sí
- Box ajustado al contenido sin espacio vacío derecha
- Cambios fullscreen/ventana funcionan correctamente
- Overlay se recalcula apropiadamente en todos los casos
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Sistema de escalado dinámico de texto con 3 tamaños según área de ventana:
1. TextRenderer improvements:
- Añadido reinitialize(int new_font_size) para cambiar tamaño en runtime
- Almacena font_path_ para permitir recarga de fuente
- Cierra fuente anterior y abre nueva con diferente tamaño
- Verifica si tamaño es igual antes de reinicializar (optimización)
2. UIManager - Font size calculation:
- Añadido calculateFontSize() con stepped scaling por área:
* SMALL (< 800x600): 14px
* MEDIUM (800x600 a 1920x1080): 18px
* LARGE (> 1920x1080): 24px
- Tracking de current_font_size_ para detectar cambios
- Inicialización con tamaño dinámico en initialize()
- Reinitialización automática en updatePhysicalWindowSize()
3. UIManager - Propagation:
- Reinitializa 3 TextRenderer instances cuando cambia tamaño
- Propaga nuevo tamaño a HelpOverlay
- Detecta cambios solo cuando área cruza umbrales (eficiencia)
4. HelpOverlay integration:
- Acepta font_size como parámetro en initialize()
- Añadido reinitializeFontSize() para cambios dinámicos
- Recalcula dimensiones del box cuando cambia fuente
- Marca textura para rebuild completo tras cambio
Resultado:
- Ventanas pequeñas: texto 14px (más espacio para contenido)
- Ventanas medianas: texto 18px (tamaño original, óptimo)
- Ventanas grandes: texto 24px (mejor legibilidad)
- Cambios automáticos al redimensionar ventana (F1/F2/F3/F4)
- Sin impacto en performance (solo recalcula al cruzar umbrales)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Mejoras de rendimiento y usabilidad del Help Overlay:
1. Anchura dinámica basada en contenido:
- Ya no es siempre cuadrado (box_size_)
- Calcula ancho real según texto más largo por columna
- Mantiene mínimo del 90% dimensión menor como antes
- Nueva función calculateTextDimensions()
2. Render-to-texture caching para optimización:
- Renderiza overlay completo a textura una sola vez
- Detecta cambios de color con umbral (threshold 5/255)
- Soporta temas dinámicos con LERP sin rebuild constante
- Regenera solo cuando colores cambian o ventana redimensiona
3. Impacto en performance:
- Antes: 1200 FPS → 200 FPS con overlay activo
- Después: 1200 FPS → 1000-1200 FPS (casi sin impacto)
- Temas estáticos: 1 render total (~∞x más rápido)
- Temas dinámicos: regenera cada ~20-30 frames (~25x más rápido)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>