Problema:
- Las fuentes TTF no se renderizaban (error "Text has zero width")
- Ocurría tanto al cargar desde resources.pack como desde disco
- El buffer de memoria se liberaba inmediatamente después de crear
el SDL_IOStream, pero SDL_ttf necesita acceder a esos datos
durante toda la vida de la fuente
Solución:
- Añadido campo font_data_buffer_ para mantener los datos en memoria
- Modificado init() y reinitialize() para NO liberar el buffer
inmediatamente después de cargar la fuente
- Modificado cleanup() para liberar el buffer cuando se cierre la fuente
- Añadidos logs de debug para confirmar la carga desde ResourceManager
Archivos modificados:
- source/text/textrenderer.h: Añadido campo font_data_buffer_
- source/text/textrenderer.cpp: Correcciones en init(), reinitialize()
y cleanup()
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Crear ResourceManager singleton para gestión centralizada de recursos
- Separar lógica de ResourcePack de la clase Texture
- Adaptar TextRenderer para cargar fuentes TTF desde pack
- Adaptar LogoScaler para cargar imágenes PNG desde pack
- Actualizar main.cpp y engine.cpp para usar ResourceManager
- Regenerar resources.pack con fuentes y logos incluidos
Fixes:
- Resuelve error de carga de fuentes desde disco
- Resuelve error de carga de logos (can't fopen)
- Implementa fallback automático a disco si no existe pack
- Todas las clases ahora pueden cargar recursos desde pack
🤖 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>
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>
Sistema de texto:
- Reemplazado dbgtxt.cpp (bitmap 8x8) por TextRenderer (SDL_TTF)
- Creado source/text/ con TextRenderer class
- Añadidas fuentes TrueType en data/fonts/
- Implementados dos TextRenderer (display + debug) con escalado dinámico
- Constantes configurables: TEXT_FONT_PATH, TEXT_BASE_SIZE, TEXT_ANTIALIASING
Correcciones de centrado:
- Reemplazado text.length() * 8 por text_renderer_.getTextWidth() en ~25 lugares
- Texto de tecla F ahora se centra correctamente
- Texto de modo (Demo/Logo/Lite) fijo en tercera fila del HUD debug
- Implementado espaciado dinámico con getTextHeight()
Conversión a mixed case:
- ~26 textos de display cambiados de ALL CAPS a mixed case
- 15 nombres de temas en theme_manager.cpp convertidos a mixed case
- Ejemplos: "FPS" → "fps", "MODO FISICA" → "Modo Física", "DEMO MODE ON" → "Modo Demo: On"
- Temas: "SUNSET" → "Sunset", "OCEANO" → "Océano", etc.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>