Commit Graph

186 Commits

Author SHA1 Message Date
821eba3483 refactor(bloques2-5): auditoria de codi - limpieza i arquitectura
Bloque 2: eliminar codi mort comentat (shape_manager, engine)
Bloque 3: Engine shape methods com thin wrappers a ShapeManager;
          eliminar estat duplicat de shapes en Engine
Bloque 4: encapsular getBallsMutable() amb helpers a SceneManager
          (enableShapeAttractionAll, resetDepthScalesAll)
Bloque 5: StateManager Phase 9 - tota la logica DEMO/LOGO
          implementada directament amb refs a SceneManager,
          ThemeManager i ShapeManager; eliminar callbacks a Engine.
          Acoplament Engine<->StateManager passa a unidireccional.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-19 00:42:03 +01:00
6409b61bd5 refactor(bloque1): reorganitzar fitxers als subsistemes correctes
- app_logo.hpp/cpp i logo_scaler.hpp/cpp moguts a source/ui/
- spatial_grid.hpp/cpp mogut a source/boids_mgr/

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-19 00:41:50 +01:00
2d1f4195dc afegida carpeta .vscode multisistema 2026-03-18 23:32:11 +01:00
18a6735a39 corregit fitxer de llicencia 2026-03-18 23:26:16 +01:00
83934f9507 redistribuia la carpeta release
afegida carpeta dist
2026-03-18 23:22:41 +01:00
e8a6485e88 desactivada la tecla O (png_shape) i la B (Boids) 2026-03-18 23:09:31 +01:00
ec0f14afd8 modificat makefile 2026-03-18 23:06:41 +01:00
6aa4a1227e ordenació per buckets 2026-03-18 2026-03-12 22:55:33 +01:00
02fdcd4113 Ara --custom-balls N --skip-benchmark (o --max-balls N) inclou el custom escenari en la rotació automàtica de DEMO/DEMO_LITE 2026-03-12 22:35:10 +01:00
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