Commit Graph

177 Commits

Author SHA1 Message Date
7db9e46f95 soport per a pantalles de poca resolució en mode finestra 2026-03-12 09:05:57 +01:00
ff6aaef7c6 parametres per saltarse el benchmark i per limitar el maxim de pilotes en els modes automatics 2026-03-12 08:56:59 +01:00
8e2e681b2c el benchmark es fa ara amb una figura i no amb el mode de fisica 2026-03-12 08:48:14 +01:00
f06123feff eliminat un binari que s'havia colat en el repo 2026-03-12 08:31:04 +01:00
cbe6dc9744 varies millores en el hud de debug 2026-03-11 23:27:02 +01:00
dfbd8a430b afegit escenari personalitzat per parametre 2026-03-11 22:44:17 +01:00
ea27a771ab benchmark inicial per a determinar modes de baix rendiment
ajustats escenaris maxims i minims per als diferents modes automatics
2026-03-11 20:30:32 +01:00
09303537a4 advertencia de modo kiosko al intentar cambiar els modes de finestra 2026-03-11 20:07:20 +01:00
df17e85a8a afegides dll al release de windows 2026-03-11 19:30:18 +01:00
ce5c4681b8 afegit mode kiosko 2026-03-11 19:14:22 +01:00
b79f1c3424 afegida cache a resource manager per evitar accessos a disc 2026-03-11 18:59:56 +01:00
a65544e8b3 fix: png_shape ja carrega de resources.pack
Amb tots els fixos anteriors, el app de macos ja funciona correctament
2026-03-08 22:36:10 +01:00
b9264c96a1 fix: no carregava correctament data/shapes/jailgames.png si s'executava desde fora del directori de l'executable 2026-03-08 22:24:41 +01:00
fa285519b2 Fix: Corregir creación de DMG eliminando prefijo rw.* y conflictos
- Corregir nombre de archivos DMG usando TARGET_NAME en lugar de TARGET_FILE
- Agregar limpieza de volúmenes montados antes de crear DMG
- Eliminar creación manual de enlace Applications (create-dmg lo hace con --app-drop-link)
- Mejorar manejo de errores eliminando || true y agregando verificación de éxito
- Limpiar archivos temporales rw.*.dmg después de crear DMG

Esto resuelve el problema donde el DMG final tenía prefijo "rw.XXXXX" y no se
podía abrir correctamente debido a conflictos con volúmenes montados y doble
creación del enlace a Applications.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-25
2025-10-25 11:03:31 +02:00
8285a8fafe Mejorar creación de DMG en macOS con create-dmg y posicionamiento de iconos
- Añadir instalación automática de create-dmg vía Homebrew si no está presente
- Reemplazar hdiutil por create-dmg para generar DMG con diseño profesional
- Configurar ventana de DMG: 720x300px con iconos de 96x96px
- Posicionar iconos centrados: Applications, .app, LICENSE, README.md
- Aplicar mejoras a ambas versiones: Intel y Apple Silicon
- Eliminar referencia obsoleta a tmp.dmg

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-25 10:31:25 +02:00
1a555e03f7 Fix: Mejorar escalado de fuentes para resoluciones altas y actualizar .gitignore
Problemas resueltos:
- Texto demasiado pequeño en resoluciones 2K/4K (1440p mostraba 36-41px)
- Archivos generados (resources.pack, *.zip) siendo versionados
- Carpetas temporales de empaquetado sin ignorar

Cambios realizados:

1. UIManager: Escalado más agresivo para resoluciones altas
   - Proporción mejorada: 1/40 → 1/26 (incremento ~35%)
   - Límite máximo: 36px → 72px
   - Resultados: 1080p→42px, 1440p→55px, 2160p→72px
   - Resoluciones bajas sin cambios (10-18px)

2. .gitignore: Excluir archivos generados y temporales
   - resources.pack (archivo empaquetado)
   - Archivos de distribución (*.zip, *.dmg, *.tar.gz, *.AppImage)
   - Carpetas temporales (vibe3_release/, Frameworks/)
   - Binarios de herramientas (tools/*.exe)

3. defines.hpp: Resolución por defecto actualizada
   - 640x360 (zoom 2x) → 1280x720 (zoom 1x)

Resultado:
- Texto significativamente más legible en pantallas grandes
- Repositorio limpio sin archivos generados

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-25 10:22:25 +02:00
af3ed6c2b3 Fix: Ajustar dimensionamiento de HelpOverlay para resoluciones bajas
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>
2025-10-23 14:23:59 +02:00
a9d7b66e83 Refactorizar estilo del proyecto: .h → .hpp, #pragma once, includes desde raíz
Modernizar convenciones de código C++ aplicando las siguientes directivas:

## Cambios principales

**1. Renombrar headers (.h → .hpp)**
- 36 archivos renombrados a extensión .hpp (estándar C++)
- Mantenidos como .h: stb_image.h, stb_image_resize2.h (librerías C externas)

**2. Modernizar include guards (#ifndef → #pragma once)**
- resource_manager.hpp: #ifndef RESOURCE_MANAGER_H → #pragma once
- resource_pack.hpp: #ifndef RESOURCE_PACK_H → #pragma once
- spatial_grid.hpp: #ifndef SPATIAL_GRID_H → #pragma once

**3. Sistema de includes desde raíz del proyecto**
- CMakeLists.txt: añadido include_directories(${CMAKE_SOURCE_DIR}/source)
- Eliminadas rutas relativas (../) en todos los includes
- Includes ahora usan rutas absolutas desde source/

**Antes:**
```cpp
#include "../defines.h"
#include "../text/textrenderer.h"
```

**Ahora:**
```cpp
#include "defines.hpp"
#include "text/textrenderer.hpp"
```

## Archivos afectados

- 1 archivo CMakeLists.txt modificado
- 36 archivos renombrados (.h → .hpp)
- 32 archivos .cpp actualizados (includes)
- 36 archivos .hpp actualizados (includes + guards)
- 1 archivo tools/ actualizado

**Total: 70 archivos modificados**

## Verificación

 Proyecto compila sin errores
 Todas las rutas de includes correctas
 Include guards modernizados
 Librerías externas C mantienen extensión .h

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-23 13:49:58 +02:00
a929df6b73 Fix: Corregir inicialización de figuras en modo DEMO
Solucionar bug donde las pelotas aparecían en el centro sin formar
la figura geométrica al entrar en modo DEMO con SimulationMode::SHAPE.

## Problema
Al randomizar el estado en modo DEMO, si se elegía una figura:
1. Se configuraba el modo SHAPE
2. Se llamaba a changeScenario() que creaba pelotas en el centro
3. NO se llamaba a generateShape() para calcular los puntos de la figura
4. Resultado: pelotas amontonadas en el centro sin formar figura

## Solución
Reordenar operaciones en executeRandomizeOnDemoStart():
1. Decidir PRIMERO el modo (PHYSICS o SHAPE) antes de changeScenario
2. Si SHAPE: configurar figura manualmente sin generar puntos
3. Llamar a changeScenario() con el modo ya establecido
4. Después de changeScenario(), generar figura y activar atracción

Cambios adicionales:
- Arreglar warning de formato %zu en textrenderer.cpp (MinGW)
- Usar %lu con cast para size_t en logs

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-23 13:22:03 +02:00
3f027d953c Eliminados warnings en textrenderer.cpp 2025-10-23 12:26:52 +02:00
1354ed82d2 Fix: Corregir carga de fuentes desde ResourceManager
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>
2025-10-23 12:15:54 +02:00
2fd6d99a61 Añadir sistema de Makefiles para herramienta de empaquetado de recursos
- Crear tools/Makefile con soporte multiplataforma (Windows/Linux/macOS)
- Añadir targets: pack_tool, resource_pack, test_pack, clean, help
- Mejorar Makefile raíz con target force_resource_pack
- Integrar regeneración automática de resources.pack en todos los releases
- Los releases siempre generan un resources.pack actualizado

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-23 09:48:57 +02:00
2fa1684f01 Refactorizar sistema de recursos: crear ResourceManager centralizado
- 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>
2025-10-23 09:16:18 +02:00
41c76316ef Actualizar README.md 2025-10-19 17:39:35 +02:00
ce50a29019 Eliminado código DEPRECATED de ui_manager 2025-10-19 15:02:13 +02:00
f25cb96a91 Correciones en Makefile 2025-10-19 09:46:55 +02:00
d73781be9f Añadido vibe3.res 2025-10-19 09:29:26 +02:00
288e4813e8 fix: Recompilar pack_resources (binario antiguo generaba formato incorrecto)
**Problema crítico:**
Error al ejecutar aplicación: "Pack inválido (magic incorrecto)"

**Causa raíz:**
El binario tools/pack_resources era OBSOLETO (de proyecto anterior):
- Binario: "Coffee Crisis Arcade Edition" (5 oct, 68 KB)
- Magic number generado: "CCAE" (43 43 41 45)
- Magic esperado por código: "VBE3" (56 42 45 33)

**Verificación:**
```bash
$ strings tools/pack_resources | grep -i coffee
Coffee Crisis Arcade Edition  ← BINARIO ANTIGUO
CCAE_RESOURCES_2024
```

**Solución:**
1. Eliminado binario antiguo tools/pack_resources
2. Recompilado desde código actual (pack_resources.cpp)
3. Regenerado resources.pack con herramienta correcta

**Resultado:**
 Binario nuevo: "ViBe3 Physics - Resource Packer"
 Magic number correcto: 56 42 45 33 ("VBE3")
 Pack válido: 16 recursos, 3.7 MB
 Aplicación carga correctamente

**Nota:** El commit anterior (4d3ddec) añadió permisos +x al binario
antiguo, pero no lo recompiló. Este commit corrige el binario.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-19 09:19:39 +02:00
4d3ddec14e fix: Regenerar resources.pack automáticamente cuando cambian archivos en data/
**Problema crítico detectado:**
- resources.pack del 5 oct (14 días antiguo, 1.3 KB)
- Archivos en data/ modificados recientemente (logo.png: 18 oct)
- make *_release NO regeneraba resources.pack automáticamente
- Releases distribuían resources.pack obsoleto

**Causa:**
Makefile línea 108 solo dependía de $(PACK_TOOL):
```makefile
resources.pack: $(PACK_TOOL)  # ← Faltaban archivos de data/
```
Result: Make decía "up to date" aunque data/ tuviera cambios

**Solución:**
Añadido wildcard con todos los archivos de data/ como dependencias:
```makefile
DATA_FILES := $(shell find data -type f 2>/dev/null)
resources.pack: $(PACK_TOOL) $(DATA_FILES)  # ← Ahora detecta cambios
```

**Verificación:**
 Regeneración completa: 1.3 KB → 3.7 MB (16 recursos)
 Detección de cambios: touch data/logo.png → regenera automáticamente
 Eficiencia: Si no hay cambios → "up to date" (no regenera)
 tools/pack_resources: +x permisos de ejecución

**Impacto:**
Todas las recetas *_release ahora regeneran resources.pack si hay cambios

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-19 09:11:53 +02:00
ec1700b439 chore: Sincronizar versión mínima de macOS a 12.0 (Monterey)
**Problema:** Inconsistencia entre Makefile y Info.plist
- Info.plist declaraba 10.15 (Catalina)
- Makefile compilaba para 11.0 (Big Sur) en Apple Silicon
- Makefile compilaba para 10.15 en Intel

**Solución:** Unificar todo a macOS 12.0 (Monterey, 2021)
- Info.plist: LSMinimumSystemVersion 10.15 → 12.0
- Makefile arm64: -target arm64-apple-macos11 → macos12
- Makefile x86_64: -target x86_64-apple-macos10.15 → macos12

**Resultado:**
 Ambos archivos sincronizados (declaran 12.0)
 Elimina soporte para macOS 10.15 y 11.0
 Optimizaciones del compilador para Monterey+
 Warning cambiará a "building for macOS-12.0"

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-19 09:07:16 +02:00
8aa2a112b4 fix: Enlazar SDL3_ttf en Makefile + corregir declaración SDL_Renderer
**Problema 1: Símbolos no definidos de SDL_ttf** (CRÍTICO)
- Error: "Undefined symbols: _TTF_Init, _TTF_OpenFont, etc."
- Causa: LDFLAGS solo incluía -lSDL3 (faltaba -lSDL3_ttf)
- Solución: Añadido -lSDL3_ttf a LDFLAGS para Unix/macOS (línea 81)
- Afecta: Linux, macOS y otros sistemas Unix

**Problema 2: Mismatch class/struct SDL_Renderer** (WARNING)
- Warning: "class 'SDL_Renderer' was previously declared as a struct"
- Causa: ui_manager.h:7 declaraba "class SDL_Renderer"
- SDL3 lo declara como "struct SDL_Renderer" (SDL_render.h:119)
- Solución: Cambiado class → struct en ui_manager.h:7
- Evita warnings y potenciales errores de linker en MSVC

**Resultado:**
 make macos_release completa exitosamente
 DMG creado: vibe3_physics-2025-10-19-macos-apple-silicon.dmg (17.9 MB)
 Sin errores de enlazado, solo warnings menores de versión macOS

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-19 09:00:01 +02:00
dfebd8ece4 chore: Mover archivos .md a .claude/ + añadir DLLs/frameworks + fix Makefile Windows
**Cambios organizativos:**
- Archivos .md movidos de raíz a .claude/ (BOIDS_ROADMAP, CLAUDE, REFACTOR_*, ROADMAP, RULES)
- .claude/ ya está en .gitignore, archivos de sesión no versionados

**Nuevos recursos para release:**
- Añadido release/frameworks/SDL3_ttf.xcframework/ para macOS
- Añadidos release/SDL3.dll y release/SDL3_ttf.dll para Windows (forzado con -f)

**Configuración:**
- defines.h: APPLOGO_DISPLAY_INTERVAL 120→90 segundos (logo aparece más frecuente)
- defines.h: Ajustes de formato/indentación (sin cambios funcionales)

**Makefile windows_release:**
- Comandos Unix reemplazados por Windows CMD nativos:
  - rm -rf → if exist + rmdir /S /Q
  - mkdir -p → mkdir
  - cp -f → copy /Y
  - rm -f → if exist + del /Q
- Ahora funciona en Windows CMD sin necesitar Git Bash/MSYS2

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-19 08:51:56 +02:00
827d9f0e76 fix: Actualizar Makefile con detección automática de archivos y SDL3_ttf
**Problemas corregidos:**
1. APP_SOURCES ahora usa wildcards automáticos (como CMakeLists.txt)
   - Detecta automáticamente todos los .cpp en subdirectorios
   - Faltaban 16 archivos: themes, state, input, scene, shapes_mgr, boids_mgr, text, ui, app_logo, logo_scaler
   - Elimina mantenimiento manual de lista de archivos
2. macOS release ahora copia SDL3_ttf.xcframework correctamente
   - Añadido a Contents/Frameworks en el .app
   - Añadido a carpeta Frameworks temporal
3. Windows DLLs: línea mantenida para futuro uso

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-19 08:29:56 +02:00
df93d5080d docs: Reorganización completa del README.md
**Cambios principales:**

1. **Nueva estructura organizada**:
   - Secciones claramente separadas sin repeticiones
   - Información actualizada y completa
   - Navegación mejorada con separadores

2. **Nuevo contenido agregado**:
   - 🎮 Modos de Funcionamiento (AppMode y SimulationMode)
   - ⚙️ Parámetros de Línea de Comandos (completo)
   - 🐦 Modo BOIDS (documentado)
   - 🖼️ Sistema AppLogo (logo periódico)
   - Tecla O (PNG_SHAPE) agregada

3. **Secciones actualizadas**:
   - Controles: Reorganizados por categoría SIN repeticiones
   - Temas: 15 temas (9 estáticos + 6 dinámicos), 2 páginas
   - Figuras 3D: 9 figuras (incluye PNG_SHAPE)
   - Todas las teclas documentadas (D, Shift+D, K, C, O, P, etc.)

4. **Información eliminada**:
   - Duplicación de "Controles de Temas" (eliminada)
   - Sección de temas repetida (consolidada)
   - Información obsoleta o desactualizada

5. **Mejoras de formato**:
   - Tablas para mejor legibilidad
   - Ejemplos de código con sintaxis
   - Emojis para secciones (navegación visual)
   - Estructura del proyecto actualizada

**Cobertura completa:**
-  AppMode: SANDBOX, DEMO, DEMO_LITE, LOGO
-  SimulationMode: PHYSICS, SHAPE, BOIDS
-  15 temas con sistema de 2 páginas
-  9 figuras 3D incluyendo PNG_SHAPE
-  Parámetros CLI: -w, -h, -z, -f, -F, -m
-  Todas las teclas documentadas
-  Sistema AppLogo explicado
-  Modo BOIDS documentado

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-19 07:59:32 +02:00
0da4b45fef fix: Usar métodos de alto nivel para inicialización CLI de modos
**Problema:**
Cuando se iniciaba con `-m demo`, `-m demo-lite` o `-m logo`, se llamaba
a `setState()` directamente, que es un método de bajo nivel que solo
cambia el estado interno SIN ejecutar las acciones de configuración.

**Resultado del bug:**
- `-m demo`: NO aleatorizaba (tema default, primer escenario)
- `-m demo-lite`: NO aleatorizaba física
- `-m logo`: NO configuraba tema, PNG_SHAPE, ni pelotas pequeñas

**Arquitectura correcta:**
- `setState()` = Método primitivo bajo nivel (solo cambia estado)
- `toggleDemoMode()` = Método alto nivel (setState + randomize)
- `toggleDemoLiteMode()` = Método alto nivel (setState + randomize)
- `enterLogoMode()` = Método alto nivel (setState + configuración completa)

**Solución implementada:**
En lugar de llamar a setState() directamente, usar los métodos de
alto nivel que ejecutan las acciones de configuración:

```cpp
if (initial_mode == AppMode::DEMO) {
    state_manager_->toggleDemoMode(...);  // Entra a DEMO + randomiza
}
else if (initial_mode == AppMode::DEMO_LITE) {
    state_manager_->toggleDemoLiteMode(...);  // Entra a DEMO_LITE + randomiza
}
else if (initial_mode == AppMode::LOGO) {
    state_manager_->enterLogoMode(...);  // Entra a LOGO + configura todo
}
```

**Archivos modificados:**
- source/engine.cpp (líneas 249-263):
  - Reemplazado setState() por toggleDemoMode/toggleDemoLiteMode/enterLogoMode
  - Agregados comentarios explicativos

**Resultado esperado:**
-  `-m demo` → Aleatoriza todo como si pulsaras D
-  `-m demo-lite` → Aleatoriza física como si pulsaras Shift+D
-  `-m logo` → Configura tema/PNG_SHAPE/pelotas como si pulsaras K
-  Comportamiento consistente entre CLI y teclas
-  Arquitectura correcta: alto nivel para acciones, bajo nivel para estado

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-18 20:00:27 +02:00
db8acf0331 clean: Eliminar logging debug + fix: Centro fijo para animación ZOOM
**1. Eliminado logging de debug del FADE_OUT:**
- Removido log de timer/delta_time/progress (FADE_OUT inicial)
- Removido log de alpha1/alpha2
- Removido log de animaciones (ZOOM, ELASTIC, SPIRAL, BOUNCE)
- Removido log de completado de FADE_OUT
- Consola limpia en modo producción

**2. Fix centro del logo en animación ZOOM_ONLY:**

**Problema:**
- Centro del logo se calculaba basándose en width/height escalados
- Cuando scale cambiaba (1.2 → 1.0), corner_x/corner_y se movían
- Resultado: logo se desplazaba lateralmente durante zoom

**Solución:**
- Calcular esquina BASE (sin escala): corner_x_base, corner_y_base
- Calcular centro FIJO basándose en base_width/base_height
- Calcular width/height escalados DESPUÉS (solo para vértices)
- Resultado: centro permanece fijo, zoom crece/decrece alrededor del centro

**Archivos modificados:**
- source/app_logo.cpp:
  - Líneas 343-347: Eliminado log FADE_OUT inicial
  - Línea 347: Eliminado log completado
  - Líneas 365-366: Eliminado log alphas
  - Líneas 381-383: Eliminado log ZOOM
  - Líneas 396-398: Eliminado log ELASTIC
  - Líneas 414-417: Eliminado log SPIRAL
  - Líneas 444-446: Eliminado log BOUNCE
  - Líneas 609-625: Reordenado cálculo de centro (FIJO) y tamaño (ESCALADO)

**Resultado esperado:**
- Sin spam en consola
- Animación ZOOM perfectamente centrada en esquina inferior derecha
- Logo crece/decrece sin desplazamiento lateral

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-18 19:40:53 +02:00
5a35cc1abf fix: Aplicar alpha del logo a través de vértices en lugar de textura
**Problema:**
- SDL_SetTextureAlphaMod() no funciona correctamente con SDL_RenderGeometry()
- El alpha de los vértices (hardcodeado a 1.0) overrideaba el alpha de textura
- Resultado: fade invisible o instantáneo a pesar de valores correctos

**Solución:**
- Eliminar SDL_SetTextureAlphaMod()
- Convertir alpha de 0-255 a 0.0-1.0 (alpha_normalized)
- Aplicar alpha_normalized directamente al canal alpha de los 4 vértices
- Ahora SDL_RenderGeometry respeta el fade correctamente

**Archivos modificados:**
- source/app_logo.cpp:
  - Línea 630: Crear alpha_normalized en lugar de SetTextureAlphaMod
  - Líneas 669, 680, 691, 702: Aplicar alpha_normalized a vértices

**Resultado esperado:**
- Fade visible y suave durante 2 segundos completos
- Logo 2 con retraso de 0.25s como esperado
- Sincronización perfecta entre animación y fade

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-18 19:31:28 +02:00
d30a4fd440 debug: Agregar logging detallado a FADE_OUT de AppLogo
- Log de timer_, delta_time, progress en cada frame
- Log de alpha1/alpha2 calculados
- Log de valores de animación por tipo (ZOOM/ELASTIC/SPIRAL/BOUNCE)
- Log de ease_t1 en ROTATE_SPIRAL para diagnosticar desincronización
- Log cuando FADE_OUT se completa

Propósito: Diagnosticar por qué el fade parece instantáneo
y desincronizado con la animación (serie en lugar de paralelo).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-18 19:26:14 +02:00
97c0683f6e fix: Restaurar fade lineal del alpha + renombrar constante
Restaura fade lineal para el alpha de los logos, eliminando el easing
que hacía la transición casi imperceptible. Renombra constante para
mayor claridad sobre lo que controla.

Problema identificado:
- El alpha usaba easeInOutQuad, acelerando la transición en el medio
- Con 2 segundos, el easing hacía que el logo pareciera aparecer/
  desaparecer instantáneamente sin fade visible
- El usuario reportó "el logo termina y desaparece directamente"

Solución implementada:

1. **Fade lineal restaurado**:
   - FADE_IN: alpha aumenta linealmente 0→255
   - FADE_OUT: alpha disminuye linealmente 255→0
   - Progreso visible y constante durante toda la duración

2. **Constante renombrada**:
   - `APPLOGO_FADE_DURATION` → `APPLOGO_ANIMATION_DURATION`
   - Nombre más claro: controla duración de toda la animación
   - Actualizado valor a 2.0 segundos (configurable por usuario)

3. **Animaciones mantienen easing**:
   - Zoom, rotación, squash, etc. siguen usando sus easings
   - Solo el alpha es lineal para fade visible

Confirmaciones:
 Sistema time-based: usa delta_time correctamente
 Blend mode configurado: SDL_BLENDMODE_BLEND en todas las texturas
 Alpha se aplica: SDL_SetTextureAlphaMod en renderizado

Resultado con APPLOGO_ANIMATION_DURATION = 2.0s:
- t=0.0s → Alpha=0 (invisible)
- t=0.5s → Alpha=64 (25% visible)
- t=1.0s → Alpha=127 (50% visible)
- t=1.5s → Alpha=191 (75% visible)
- t=2.0s → Alpha=255 (100% visible)

Nota: El logo solo se muestra en modos DEMO/DEMO_LITE/LOGO,
no en SANDBOX. Para probar: ./vibe3_physics --mode demo

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-18 19:16:33 +02:00
c3d24cc07d feat: Argumentos CLI para establecer AppMode inicial
Permite arrancar directamente en modo DEMO, DEMO_LITE, LOGO o SANDBOX
mediante argumentos de línea de comandos, eliminando necesidad de
cambiar manualmente el modo después del arranque.

Nuevos argumentos:
- `-m, --mode <mode>` - Establece modo inicial
  - `sandbox` - Control manual (default)
  - `demo` - Auto-play completo (figuras + temas + colisiones)
  - `demo-lite` - Auto-play simple (solo física/figuras)
  - `logo` - Modo logo (easter egg con convergencia)

Ejemplos de uso:
```bash
# Arrancar en modo DEMO
./vibe3_physics --mode demo
./vibe3_physics -m demo

# Arrancar en DEMO_LITE (solo física)
./vibe3_physics -m demo-lite

# Arrancar directo en LOGO
./vibe3_physics --mode logo

# Combinar con otros argumentos
./vibe3_physics -w 1920 -h 1080 --mode demo
./vibe3_physics -F -m demo-lite  # Fullscreen + DEMO_LITE
```

Implementación:
1. main.cpp: Parsing de argumento --mode con validación
2. engine.h: Nuevo parámetro `initial_mode` en initialize()
3. engine.cpp: Aplicación del modo vía StateManager::setState()

Si no se especifica --mode, se usa SANDBOX (comportamiento actual).
El modo se aplica después de inicializar StateManager, garantizando
que todos los componentes estén listos antes del cambio de estado.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-18 19:00:16 +02:00
7609b9ef5c feat: Animaciones de logos sincronizadas con retraso + easing en alpha
Implementa sistema de sincronización elegante entre logos con efecto de
"seguimiento" y fade suavizado para eliminar desincronización visual.

Cambios principales:

1. **Animación sincronizada**: Ambos logos usan la MISMA animación
   - Eliminadas 4 variables independientes (logo1/logo2 × entry/exit)
   - Una sola variable `current_animation_` compartida
   - Misma animación para entrada y salida (simetría)

2. **Retraso de Logo 2**: 0.25 segundos detrás de Logo 1
   - Logo 1 empieza en t=0.00s
   - Logo 2 empieza en t=0.25s
   - Efecto visual de "eco" o "seguimiento"

3. **Alpha independiente con retraso**:
   - `logo1_alpha_` y `logo2_alpha_` separados
   - Logo 2 aparece/desaparece más tarde visualmente

4. **Easing en alpha** (NUEVO):
   - Aplicado `easeInOutQuad()` al fade de alpha
   - Elimina problema de "logo deformado esperando a desvanecerse"
   - Sincronización visual perfecta entre animación y fade
   - Curva suave: lento al inicio, rápido en medio, lento al final

Comportamiento resultante:

FADE_IN:
- t=0.00s: Logo 1 empieza (alpha con easing)
- t=0.25s: Logo 2 empieza (alpha con easing + retraso)
- t=0.50s: Logo 1 completamente visible
- t=0.75s: Logo 2 completamente visible

FADE_OUT:
- t=0.00s: Logo 1 empieza a desaparecer (misma animación)
- t=0.25s: Logo 2 empieza a desaparecer
- t=0.50s: Logo 1 completamente invisible
- t=0.75s: Logo 2 completamente invisible

Archivos modificados:
- source/defines.h: +APPLOGO_LOGO2_DELAY
- source/app_logo.h: Reestructuración de variables de animación/alpha
- source/app_logo.cpp: Implementación de retraso + easing

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-18 12:33:09 +02:00
ad3f5a00e4 feat: Sistema de pre-escalado de logos con stb_image_resize2
Implementa pre-escalado de alta calidad para eliminar artefactos de
escalado dinámico de SDL y mejorar la nitidez visual de los logos.

Características:
- 4 texturas pre-escaladas (2 logos × 2 resoluciones: base + nativa)
- Detección automática de resolución nativa del monitor
- Switching dinámico entre texturas al cambiar resolución (F4)
- Renderizado 1:1 sin escalado adicional (máxima calidad)
- Algoritmo Mitchell en espacio sRGB (balance calidad/velocidad)
- Todo en RAM, sin archivos temporales

Archivos nuevos:
- source/external/stb_image_resize2.h: Biblioteca de escalado stb
- source/logo_scaler.h/cpp: Clase helper para pre-escalado

Cambios en AppLogo:
- Reemplazadas shared_ptr<Texture> por SDL_Texture* raw pointers
- initialize(): Pre-escala logos a 2 resoluciones al inicio
- updateScreenSize(): Cambia entre texturas según resolución
- render(): Simplificado, siempre usa renderWithGeometry()
- ~AppLogo(): Libera 4 texturas SDL manualmente

El sistema detecta la resolución nativa al inicio y crea versiones
optimizadas. Al presionar F4, cambia automáticamente a la textura
nativa para calidad perfecta en fullscreen.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-18 10:36:26 +02:00
c91cb1ca56 feat: Sistema dual de logos con animaciones independientes + ajuste de tamaño/posición
Implementación de sistema de 2 logos superpuestos con animaciones completamente independientes:

**Nuevas características:**
- Dos logos superpuestos (logo1.png + logo2.png) con animaciones independientes
- 4 tipos de animación: ZOOM_ONLY, ELASTIC_STICK, ROTATE_SPIRAL, BOUNCE_SQUASH
- Aleatorización independiente para entrada y salida de cada logo
- 256 combinaciones posibles (4×4 entrada × 4×4 salida)

**Ajuste de tamaño y posición:**
- Nueva constante APPLOGO_HEIGHT_PERCENT (40%) - altura del logo respecto a pantalla
- Nueva constante APPLOGO_PADDING_PERCENT (10%) - padding desde esquina inferior-derecha
- Logo anclado a esquina en lugar de centrado en cuadrante
- Valores fácilmente ajustables mediante constantes en defines.h

**Cambios técnicos:**
- Variables duplicadas para logo1 y logo2 (scale, squash, stretch, rotation)
- Variables compartidas para sincronización (state, timer, alpha)
- renderWithGeometry() acepta parámetro logo_index (1 o 2)
- Logo1 renderizado primero (fondo), Logo2 encima (overlay)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-18 10:01:32 +02:00
8d608357b4 feat: Animación elástica tipo pegatina para AppLogo
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>
2025-10-18 01:46:56 +02:00
f73a133756 feat: Sistema de logo periódico con fade in/out
- Nuevo sistema AppLogo que muestra el logo cada 20 segundos por 5 segundos
- Fade in/out suave de 0.5 segundos con alpha blending
- Máquina de estados: HIDDEN → FADE_IN → VISIBLE → FADE_OUT
- Logo posicionado en cuadrante inferior derecho (1/4 de pantalla)
- Añadido método setAlpha() a Texture para control de transparencia
- Habilitado SDL_BLENDMODE_BLEND en todas las texturas
- Filtrado LINEAR para suavizado del logo escalado
- Desactivado automáticamente en modo SANDBOX

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-18 01:31:29 +02:00
de23327861 fix: Mantener gravedad OFF al cambiar escenario en modo BOIDS
Problema:
- Al cambiar de escenario (teclas 1-8) en modo BOIDS, la gravedad
  se reseteaba a 720 en lugar de mantenerse en 0
- SceneManager::changeScenario() reinicializa bolas con gravedad default
- Esto rompía el invariante: "modo BOIDS = gravedad OFF siempre"

Solución:
- Añadido check en Engine::changeScenario() para forzar gravedad OFF
  después del cambio de escenario si estamos en modo BOIDS
- Mantiene consistencia con el comportamiento de SHAPE mode

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-18 00:14:08 +02:00
f6402084eb feat: Bordes como obstáculos + Variables BOIDS ajustables + Fix tecla G
**1. Bordes como obstáculos (no más wrapping):**
- Implementada fuerza de repulsión cuando boids se acercan a bordes
- Nueva regla: Boundary Avoidance (evitar bordes)
- Fuerza proporcional a cercanía (0% en margen, 100% en colisión)
- Constantes: BOID_BOUNDARY_MARGIN (50px), BOID_BOUNDARY_WEIGHT (7200 px/s²)

**2. Variables ajustables en runtime:**
- Añadidas 11 variables miembro en BoidManager (inicializadas con defines.h)
- Permite modificar comportamiento sin recompilar
- Variables: radios (separation/alignment/cohesion), weights, speeds, boundary
- Base para futuras herramientas de debug/tweaking visual

**3. Fix tecla G (BOIDS → PHYSICS):**
- Corregido: toggleBoidsMode() ahora acepta parámetro force_gravity_on
- handleGravityToggle() pasa explícitamente false para preservar inercia
- Transición BOIDS→PHYSICS ahora mantiene gravedad OFF correctamente

**Implementación:**
- defines.h: +2 constantes (BOUNDARY_MARGIN, BOUNDARY_WEIGHT)
- boid_manager.h: +11 variables miembro ajustables
- boid_manager.cpp:
  - Constructor inicializa variables
  - Todas las funciones usan variables en lugar de constantes
  - applyBoundaries() completamente reescrito (repulsión vs wrapping)
- engine.h/cpp: toggleBoidsMode() con parámetro opcional

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-17 20:09:33 +02:00
9909d4c12d feat: Convertir BOIDS a sistema time-based (independiente de framerate)
- Conversión completa de físicas BOIDS de frame-based a time-based
- Velocidades: ×60 (px/frame → px/s)
- Aceleraciones (Separation, Cohesion): ×3600 (px/frame² → px/s²)
- Steering proporcional (Alignment): ×60
- Límites de velocidad: ×60

Constantes actualizadas en defines.h:
- BOID_SEPARATION_WEIGHT: 1.5 → 5400.0 (aceleración)
- BOID_COHESION_WEIGHT: 0.001 → 3.6 (aceleración)
- BOID_ALIGNMENT_WEIGHT: 1.0 → 60.0 (steering)
- BOID_MAX_SPEED: 2.5 → 150.0 px/s
- BOID_MIN_SPEED: 0.3 → 18.0 px/s
- BOID_MAX_FORCE: 0.05 → 3.0 px/s

Física ahora consistente en 60Hz, 144Hz, 240Hz screens.
Transiciones BOIDS↔PHYSICS preservan velocidad correctamente.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-17 20:05:49 +02:00
a929346463 fix: SHAPE mode - regenerar figuras al cambiar tamaño con F4
Al entrar o salir del modo fullscreen real (F4), el área de juego cambia
de tamaño. Si estábamos en modo SHAPE, las bolas aparecían centradas pero
sin formar la figura.

PROBLEMA RAÍZ:
- changeScenario() recrea las bolas en nuevas posiciones
- NO se regeneraban los targets de la figura (puntos 3D)
- NO se reactivaba la atracción física hacia los targets
- Resultado: bolas centradas sin formar figura

SOLUCIÓN:
Después de changeScenario() en ambas transiciones de F4:
1. Llamar a generateShape() (Engine, no ShapeManager)
2. Reactivar enableShapeAttraction(true) en todas las bolas

Esto sigue el mismo patrón usado en Engine::changeScenario() (línea 515).

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-17 09:34:20 +02:00
c4075f68db fix: Debug HUD usa viewport físico en F3 (coordenadas reales)
Problema:
- En modo F3 (letterbox/integer scale), el debug HUD se pintaba
  fuera del área de juego (en las barras negras laterales)
- SDL_GetRenderViewport() devuelve coordenadas LÓGICAS cuando hay
  presentación lógica activa
- printAbsolute() trabaja en píxeles FÍSICOS
- Mismatch de coordenadas causaba alineación derecha incorrecta

Solución:
- Nuevo helper getPhysicalViewport() que:
  1. Guarda estado de presentación lógica
  2. Deshabilita presentación lógica temporalmente
  3. Obtiene viewport en coordenadas físicas
  4. Restaura presentación lógica
  5. Retorna viewport físico

- UIManager::renderDebugHUD() ahora usa physical_viewport.w
  para cálculo de alineación derecha (9 referencias actualizadas)

Resultado:
- Debug HUD alineado correctamente en F3 letterbox
- Debug HUD alineado correctamente en F4 integer scale
- Modo ventana sigue funcionando correctamente

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-17 08:08:04 +02:00