# ViBe3 Physics - Simulador de Sprites con Física Avanzada

**ViBe3 Physics** es una demo experimental de **vibe-coding** que implementa **físicas avanzadas** con sistema de delta time independiente del framerate. Utiliza **SDL3** para renderizado optimizado con batch geometry de hasta 50,000 sprites simultáneos.

![ViBe3 Physics - Gameplay](https://php.sustancia.synology.me/images/vibe3_physics/captura_vibe3_physics_1.png)

El nombre refleja su propósito: **ViBe** (vibe-coding experimental) + **Physics** (nuevas físicas experimentales). La demo sirve como sandbox para probar bucles de juego con timing independiente, comportamientos emergentes (boids), figuras 3D procedurales y efectos demoscene.

---

## 🎯 Características Principales

- **Sistema delta time**: Física independiente del framerate (60Hz, 75Hz, 144Hz+)
- **Batch rendering**: Hasta 100,000 sprites con SDL_RenderGeometry
- **15 temas visuales**: 9 estáticos + 6 dinámicos animados (sistema de 2 páginas)
- **9 figuras 3D**: Esfera, Cubo, Helix, Torus, Cylinder, Icosahedron, Atom, Lissajous, PNG_SHAPE
- **Modo BOIDS**: Comportamiento de enjambre emergente (separación, alineación, cohesión)
- **Gravedad multidireccional**: UP/DOWN/LEFT/RIGHT con detección de superficie inteligente
- **4 modos de aplicación**: SANDBOX (manual), DEMO (auto completo), DEMO_LITE (auto física), LOGO (easter egg)
- **Logo periódico animado**: Sistema AppLogo con 4 tipos de animación y fade dual
- **Control dinámico**: V-Sync, zoom, fullscreen, escalado, sprites, escenarios
- **Parámetros CLI**: Resolución, zoom, fullscreen, modo inicial configurables
- **Hot-swap de sprites**: Cambio de textura dinámico sin reiniciar física
- **Transiciones LERP**: Cambios de tema suaves (0.5s) sin pérdida de estado

---

## 🎮 Modos de Funcionamiento

### Modos de Aplicación (AppMode)

ViBe3 Physics tiene 4 modos mutuamente excluyentes que controlan el comportamiento general:

| Modo | Tecla | Descripción | Comportamiento |
|------|-------|-------------|----------------|
| **SANDBOX** | - | Modo sandbox (por defecto) | Control manual completo del usuario |
| **DEMO** | `D` | Auto-play completo | Aleatoriza física, temas, escenarios automáticamente |
| **DEMO_LITE** | `Shift+D` | Auto-play solo física | Solo aleatoriza física (gravedad, shapes, impulso) |
| **LOGO** | `K` | Easter egg animado | Muestra logo 3D con PNG_SHAPE (mín. 500 pelotas) |

**Notas:**
- Al entrar a DEMO/DEMO_LITE se aleatoriza el estado inicial
- LOGO configura automáticamente: tema especial, 5000 pelotas, sprite pequeño, PNG_SHAPE
- Presionar misma tecla vuelve a SANDBOX
- DEMO puede saltar automáticamente a LOGO (easter egg)

### Modos de Simulación (SimulationMode)

Controlan el comportamiento físico de las pelotas:

| Modo | Activación | Descripción |
|------|------------|-------------|
| **PHYSICS** | Cursores, `G`, `1-8` | Física normal con gravedad |
| **SHAPE** | `Q-O`, `F` | Figura 3D activa (atracción tipo resorte) |
| **BOIDS** | `C` | Comportamiento de enjambre emergente |

**Cambio automático:**
- Pulsar cursores o `G` → Sale de SHAPE/BOIDS a PHYSICS
- Pulsar `Q-O` → Activa SHAPE y figura específica
- Pulsar `C` → Toggle entre BOIDS ↔ último modo (PHYSICS o SHAPE)
- Pulsar `F` → Toggle entre PHYSICS ↔ última SHAPE usada

---

## 🎹 Controles

### Sistema

| Tecla | Acción |
|-------|--------|
| `H` | **Toggle debug display** (FPS, V-Sync, física, gravedad, modo) |
| `V` | **Toggle V-Sync** ON/OFF |
| `ESC` | **Salir** del programa |

### Ventana y Zoom

| Tecla | Acción |
|-------|--------|
| `F1` | **Zoom Out** (reducir zoom ventana) |
| `F2` | **Zoom In** (aumentar zoom ventana) |
| `F3` | **Toggle Fullscreen** (letterbox, mantiene aspecto) |
| `F4` | **Toggle Real Fullscreen** (resolución nativa) |
| `F5` | **Toggle escalado** INTEGER/LETTERBOX/STRETCH (solo F3) |

### Modos de Aplicación

| Tecla | Acción |
|-------|--------|
| `D` | **Toggle DEMO Mode** (auto-play completo) |
| `Shift+D` | **Toggle DEMO LITE Mode** (auto-play solo física) |
| `K` | **Toggle LOGO Mode** (easter egg con logo 3D) |

### Temas de Colores

| Tecla | Acción |
|-------|--------|
| `B` | **Ciclar temas** (adelante) |
| `Shift+B` | **Ciclar temas** (atrás) |
| `Numpad Enter` | **Cambiar página** de temas (Página 1 ↔ Página 2) |
| `Numpad 1-9, 0` | **Acceso directo** al tema de la página activa |
| `P` | **Pausar/Reanudar** animación de temas dinámicos |

### Sprites y Escenarios

| Tecla | Acción |
|-------|--------|
| `N` | **Cambiar sprite** (tiny → small → normal → big) |
| `1` | **10 pelotas** |
| `2` | **50 pelotas** |
| `3` | **100 pelotas** |
| `4` | **500 pelotas** |
| `5` | **1,000 pelotas** |
| `6` | **5,000 pelotas** |
| `7` | **10,000 pelotas** |
| `8` | **50,000 pelotas** |

### Física y Gravedad

| Tecla | Acción |
|-------|--------|
| `ESPACIO` | **Impulsar** todas las pelotas hacia arriba |
| `G` | **Toggle gravedad** ON/OFF (sale de figuras SIN gravedad) |
| `↑` | **Gravedad hacia ARRIBA** (sale de figuras CON gravedad) |
| `↓` | **Gravedad hacia ABAJO** (sale de figuras CON gravedad) |
| `←` | **Gravedad hacia IZQUIERDA** (sale de figuras CON gravedad) |
| `→` | **Gravedad hacia DERECHA** (sale de figuras CON gravedad) |

### Figuras 3D

| Tecla | Acción |
|-------|--------|
| `F` | **Toggle** modo PHYSICS ↔ última FIGURA activa |
| `Q` | **SPHERE** (Esfera Fibonacci rotante) |
| `W` | **LISSAJOUS** (Curva paramétrica 3D ondeante) |
| `E` | **HELIX** (Espiral helicoidal) |
| `R` | **TORUS** (Toroide/donut rotante) |
| `T` | **CUBE** (Cubo rotante triple XYZ) |
| `Y` | **CYLINDER** (Cilindro rotante) |
| `U` | **ICOSAHEDRON** (Icosaedro D20) |
| `I` | **ATOM** (Núcleo + órbitas electrónicas) |
| `O` | **PNG_SHAPE** (Logo 3D desde PNG) |
| `Numpad +` | **Aumentar escala** de figura (+10%) |
| `Numpad -` | **Reducir escala** de figura (-10%) |
| `Numpad *` | **Reset escala** a 100% |
| `Numpad /` | **Toggle zoom profundidad** (perspectiva 3D ON/OFF) |

### Modo BOIDS

| Tecla | Acción |
|-------|--------|
| `C` | **Toggle BOIDS Mode** (comportamiento de enjambre) |

---

## 🎨 Sistema de Temas (15 Temas - 2 Páginas)

ViBe3 Physics incluye **15 temas visuales** organizados en **2 páginas** (9 estáticos + 1 dinámico en Página 1, 5 dinámicos en Página 2). Los temas dinámicos tienen animación de colores en tiempo real.

![ViBe3 Physics - Gameplay](https://php.sustancia.synology.me/images/vibe3_physics/captura_vibe3_physics_2.png)

### Controles de Temas

- **`B`**: Ciclar entre TODOS los temas (adelante)
- **`Shift+B`**: Ciclar entre TODOS los temas (atrás)
- **`Numpad Enter`**: Cambiar entre Página 1 y Página 2
- **`Numpad 1-9, 0`**: Acceso directo al tema según página activa
- **`P`**: Pausar/reanudar animación de temas dinámicos

### Página 1 (Temas Estáticos + 1 Dinámico)

| Tecla | Tema | Tipo | Descripción |
|-------|------|------|-------------|
| `Numpad 1` | **ATARDECER** | Estático | Naranjas, rojos, amarillos, rosas |
| `Numpad 2` | **OCÉANO** | Estático | Azules, turquesas, blancos |
| `Numpad 3` | **NEÓN** | Estático | Cian, magenta, verde lima, amarillo vibrante |
| `Numpad 4` | **BOSQUE** | Estático | Verdes, marrones, amarillos otoño |
| `Numpad 5` | **RGB** | Estático | Círculo cromático 24 colores (fondo blanco) |
| `Numpad 6` | **MONOCROMO** | Estático | Fondo negro degradado, sprites blancos |
| `Numpad 7` | **LAVANDA** | Estático | Degradado violeta-azul, pelotas amarillo dorado |
| `Numpad 8` | **CARMESÍ** | Estático | Fondo negro-rojo, pelotas rojas uniformes |
| `Numpad 9` | **ESMERALDA** | Estático | Fondo negro-verde, pelotas verdes uniformes |
| `Numpad 0` | **AMANECER** | **Dinámico** | Noche → Alba → Día (loop 12s) |

### Página 2 (Temas Dinámicos Animados)

| Tecla | Tema | Tipo | Descripción |
|-------|------|------|-------------|
| `Numpad 1` | **OLAS OCEÁNICAS** | **Dinámico** | Azul oscuro ↔ Turquesa (loop 8s) |
| `Numpad 2` | **PULSO NEÓN** | **Dinámico** | Negro ↔ Neón brillante (ping-pong 3s) |
| `Numpad 3` | **FUEGO** | **Dinámico** | Brasas → Llamas → Inferno (loop 10s) |
| `Numpad 4` | **AURORA** | **Dinámico** | Verde → Violeta → Cian (loop 14s) |
| `Numpad 5` | **VOLCÁN** | **Dinámico** | Ceniza → Erupción → Lava (loop 12s) |
| `Numpad 6-9, 0` | *(sin asignar)* | - | Sin función en Página 2 |

### Características Técnicas

- **Transiciones LERP**: Interpolación suave (0.5s) entre temas
- **Fondos degradados**: 2 colores interpolados verticalmente
- **Paletas por tema**: 8-24 colores (RGB tiene 24, resto 8)
- **Sin pérdida de estado**: Mantiene física, posiciones, velocidades
- **Compatible**: Con todos los modos y escenarios

---

## 🔷 Sistema de Figuras 3D (9 Figuras)

Sistema polimórfico que convierte pelotas en formas geométricas 3D proyectadas en 2D.

### Figuras Disponibles

#### 🌐 SPHERE (Tecla `Q`)
- **Algoritmo**: Fibonacci Sphere (distribución uniforme de puntos)
- **Rotación**: Dual (ejes X e Y)
- **Efecto**: Esfera rotante clásica estilo demoscene

#### 🌊 LISSAJOUS (Tecla `W`)
- **Algoritmo**: Curva paramétrica 3D (frecuencias 3:2:1)
- **Animación**: Fase oscilante + rotación global
- **Efecto**: Malla ondeante compleja

#### 🧬 HELIX (Tecla `E`)
- **Algoritmo**: Espiral helicoidal paramétrica (3 vueltas)
- **Animación**: Rotación en eje Y + fase vertical
- **Efecto**: DNA/hélice rotante

#### 🍩 TORUS (Tecla `R`)
- **Algoritmo**: Toroide paramétrico (radio mayor + menor)
- **Rotación**: Triple eje (X, Y, Z) con velocidades diferentes
- **Efecto**: Donut flotante estilo demoscene

#### 🎲 CUBE (Tecla `T`)
- **Distribución inteligente**:
  - 1-8 pelotas: Solo vértices (8 puntos)
  - 9-26 pelotas: Vértices + caras + aristas (26 puntos)
  - 27+ pelotas: Grid volumétrico 3D uniforme
- **Rotación**: Triple (X, Y, Z simultáneos)
- **Efecto**: Cubo Rubik rotante

#### 🏛️ CYLINDER (Tecla `Y`)
- **Algoritmo**: Cilindro con tapas circulares
- **Rotación**: Eje Y (spin horizontal)
- **Efecto**: Columna griega rotante

#### ⚛️ ICOSAHEDRON (Tecla `U`)
- **Algoritmo**: Poliedro regular de 20 caras (12 vértices)
- **Geometría**: Proporción áurea
- **Rotación**: Triple eje caótico
- **Efecto**: Dado D20 flotante

#### ⚛️ ATOM (Tecla `I`)
- **Estructura**: Núcleo central + 3 órbitas elípticas
- **Animación**: Electrones en movimiento orbital
- **Rotación**: Órbitas perpendiculares entre sí
- **Efecto**: Átomo de Bohr animado

#### 🖼️ PNG_SHAPE (Tecla `O`)
- **Algoritmo**: Carga imagen PNG 1-bit y extrude a volumen 3D
- **Animación**: Rotación "legible" (flip ocasional cada 2-4s)
- **Profundidad**: 15 capas de extrusión
- **Efecto**: Logo 3D con volteretas
- **Uso**: Modo LOGO carga `data/logo/logo.png` automáticamente

### Características Físicas

- **Sistema spring-damper**: Transición suave con Ley de Hooke
- **Profundidad Z simulada**: Color modulado (oscuro=fondo, brillante=frente)
- **Z-sorting**: Painter's Algorithm para oclusión correcta
- **Zoom por profundidad**: Perspectiva 3D (50%-150% según Z)
- **Escala dinámica**: Control manual Numpad +/- (30%-300%)
- **Protección clipping**: Límites automáticos según resolución

### Parámetros Configurables (defines.h)

```cpp
// Física compartida (spring-damper)
SHAPE_SPRING_K = 800.0f;          // Rigidez resorte (N/m)
SHAPE_DAMPING_BASE = 60.0f;       // Amortiguación base
SHAPE_DAMPING_NEAR = 150.0f;      // Absorción cerca del punto

// Control manual de escala
SHAPE_SCALE_MIN = 0.3f;           // Mínimo 30%
SHAPE_SCALE_MAX = 3.0f;           // Máximo 300%
SHAPE_SCALE_STEP = 0.1f;          // Incremento 10%
```

---

## 🐦 Modo BOIDS (Comportamiento de Enjambre)

Sistema de inteligencia de enjambre basado en **3 reglas de Reynolds**:

### Reglas de Comportamiento

1. **Separación**: Evitar colisiones con vecinos cercanos
2. **Alineación**: Seguir dirección promedio del grupo
3. **Cohesión**: Moverse hacia el centro del grupo local

### Características

- **Toggle**: Tecla `C` (alterna BOIDS ↔ último modo)
- **Bordes como obstáculos**: Evitan bordes de pantalla
- **Time-based**: Física independiente del framerate
- **Compatible**: Con temas, escenarios (1-100,000 boids)
- **Gravedad OFF**: Desactiva gravedad automáticamente

### Parámetros Ajustables (defines.h)

```cpp
// Velocidades
BOIDS_MAX_SPEED = 200.0f;         // Velocidad máxima (px/s)
BOIDS_MAX_FORCE = 400.0f;         // Fuerza máxima (px/s²)

// Pesos de comportamiento
BOIDS_SEPARATION_WEIGHT = 1.5f;   // Peso separación
BOIDS_ALIGNMENT_WEIGHT = 1.0f;    // Peso alineación
BOIDS_COHESION_WEIGHT = 1.0f;     // Peso cohesión

// Radios de detección
BOIDS_SEPARATION_RADIUS = 25.0f;  // Radio separación (px)
BOIDS_NEIGHBOR_RADIUS = 50.0f;    // Radio vecindad (px)
```

---

## 🖼️ Sistema AppLogo (Logo Periódico)

Logo animado que aparece periódicamente en modos **DEMO**, **DEMO_LITE** y **LOGO**. No aparece en modo SANDBOX.

### Características

- **Intervalo**: Cada 5 segundos (configurable)
- **Duración visible**: 10 segundos (configurable)
- **Animación entrada/salida**: 2 segundos con fade lineal
- **4 tipos de animación aleatoria**:
  - **ZOOM_ONLY**: Zoom simple de 120% → 100%
  - **ELASTIC_STICK**: Efecto elástico tipo pegatina
  - **ROTATE_SPIRAL**: Rotación en espiral de 0% → 100%
  - **BOUNCE_SQUASH**: Rebote con squash & stretch
- **Sistema dual logo**: Dos logos superpuestos con animación sincronizada
- **Retraso Logo 2**: 0.25s detrás de Logo 1 (efecto echo)
- **Posición**: Esquina inferior derecha con padding 10%
- **Tamaño**: 40% de altura de pantalla
- **Pre-escalado**: 2 versiones (base + resolución nativa) para calidad óptima

### Configuración (defines.h)

```cpp
APPLOGO_DISPLAY_INTERVAL = 5.0f;     // Intervalo entre apariciones (s)
APPLOGO_DISPLAY_DURATION = 10.0f;    // Duración visible (s)
APPLOGO_ANIMATION_DURATION = 2.0f;   // Duración fade entrada/salida (s)
APPLOGO_HEIGHT_PERCENT = 0.4f;       // Altura = 40% pantalla
APPLOGO_PADDING_PERCENT = 0.1f;      // Padding = 10% desde bordes
APPLOGO_LOGO2_DELAY = 0.25f;         // Retraso Logo 2 (s)
```

---

## ⚙️ Parámetros de Línea de Comandos

ViBe3 Physics acepta parámetros CLI para configurar resolución, zoom, fullscreen y modo inicial.

### Sintaxis

```bash
vibe3_physics [opciones]
```

### Opciones Disponibles

| Parámetro | Descripción | Default | Ejemplo |
|-----------|-------------|---------|---------|
| `-w, --width <px>` | Ancho de resolución | 320 | `-w 1920` |
| `-h, --height <px>` | Alto de resolución | 240 | `-h 1080` |
| `-z, --zoom <n>` | Zoom de ventana | 3 (auto si -w/-h) | `-z 2` |
| `-f, --fullscreen` | Fullscreen letterbox (F3) | OFF | `-f` |
| `-F, --real-fullscreen` | Fullscreen nativo (F4) | OFF | `-F` |
| `-m, --mode <mode>` | Modo inicial | sandbox | `-m demo` |
| `--help` | Mostrar ayuda | - | `--help` |

### Modos Disponibles

- **`sandbox`**: Modo manual (default)
- **`demo`**: Auto-play completo (aleatoriza todo al iniciar)
- **`demo-lite`**: Auto-play solo física (aleatoriza física al iniciar)
- **`logo`**: Easter egg (configura tema, PNG_SHAPE, 5000 pelotas)

### Ejemplos de Uso

```bash
# Resolución default (320x240 zoom 3)
./vibe3_physics

# 1080p en ventana 1x
./vibe3_physics -w 1920 -h 1080

# 640x480 zoom 2 (ventana 1280x960)
./vibe3_physics -w 640 -h 480 -z 2

# Fullscreen letterbox (mantiene aspecto)
./vibe3_physics -f

# Fullscreen nativo (resolución de monitor)
./vibe3_physics -F

# Iniciar directamente en modo DEMO
./vibe3_physics -m demo

# Fullscreen + modo LOGO
./vibe3_physics -F --mode logo
```

### Validaciones

- **Ancho mínimo**: 320px
- **Alto mínimo**: 240px
- **Zoom automático**: Si resolución > pantalla, usa default
- **Zoom máximo**: Ajustado según pantalla disponible

---

## 📊 Información en Pantalla

### Display Normal

- **Esquina superior derecha**: Contador FPS en tiempo real (**amarillo**)

### Debug Display (Tecla `H`)

Cuando se activa con `H`, muestra información técnica detallada:

- **Línea 1 (sup. izq.)**: Estado V-Sync (**VSYNC ON/OFF** en **cian**)
- **Línea 2 (sup. der.)**: Contador FPS (**amarillo**)
- **Líneas 3-5**: Valores física primera pelota (**magenta**):
  - `GRAV` - Magnitud gravedad (px/s²)
  - `VY` - Velocidad vertical (px/s)
  - `SURFACE` - En superficie (YES/NO)
  - `LOSS` - Coeficiente rebote (0.30-0.95)
- **Línea 6**: Dirección gravedad (**GRAVITY UP/DOWN/LEFT/RIGHT** en **amarillo**)
- **Línea 7**: Tema activo (**THEME SUNSET/OCEAN/...** en **amarillo claro**)
- **Línea 8**: Modo simulación (**MODE PHYSICS/SHAPE/BOIDS** en **verde claro**)

### Notificaciones Temporales

Sistema de notificaciones superior centrado con animación slide + fade:
- **Cambio de tema**: "TEMA: ATARDECER" (2s)
- **Cambio de sprite**: "SPRITE: SMALL" (2s)
- **Cambio de escenario**: "ESCENARIO: 5000 PELOTAS" (2s)
- **Cambio de modo**: "MODO DEMO" / "MODO SANDBOX" (2s)

---

## 🏗️ Estructura del Proyecto

```
vibe3_physics/
├── source/
│   ├── main.cpp                    # Entry point y parseo CLI
│   ├── engine.h/cpp                # Motor principal con loop y rendering
│   ├── ball.h/cpp                  # Clase Ball - física de pelotas
│   ├── defines.h                   # Constantes y configuración global
│   ├── app_logo.h/cpp              # Sistema de logo periódico
│   ├── logo_scaler.h/cpp           # Pre-escalado de logos (stb_image_resize2)
│   ├── theme_manager.h/cpp         # Gestión de temas y transiciones LERP
│   ├── spatial_grid.h/cpp          # Grid espacial para optimización BOIDS
│   │
│   ├── boids_mgr/
│   │   └── boid_manager.h/cpp      # Gestor de comportamiento BOIDS
│   │
│   ├── input/
│   │   └── input_handler.h/cpp     # Manejo de teclado y eventos SDL
│   │
│   ├── scene/
│   │   └── scene_manager.h/cpp     # Gestión de pelotas y escenarios
│   │
│   ├── shapes/                     # Sistema polimórfico de figuras 3D
│   │   ├── shape.h                     # Interfaz abstracta Shape
│   │   ├── sphere_shape.h/cpp          # Fibonacci Sphere
│   │   ├── cube_shape.h/cpp            # Cubo rotante triple
│   │   ├── helix_shape.h/cpp           # Espiral helicoidal
│   │   ├── torus_shape.h/cpp           # Toroide/donut
│   │   ├── lissajous_shape.h/cpp       # Curva paramétrica 3D
│   │   ├── cylinder_shape.h/cpp        # Cilindro rotante
│   │   ├── icosahedron_shape.h/cpp     # Icosaedro D20
│   │   ├── atom_shape.h/cpp            # Átomo con órbitas
│   │   └── png_shape.h/cpp             # Logo 3D desde PNG
│   │
│   ├── shapes_mgr/
│   │   └── shape_manager.h/cpp     # Gestor de figuras 3D
│   │
│   ├── state/
│   │   └── state_manager.h/cpp     # Gestor de modos (DEMO/LOGO/SANDBOX)
│   │
│   ├── themes/
│   │   ├── static_theme.h/cpp      # Temas estáticos
│   │   └── dynamic_theme.h/cpp     # Temas dinámicos animados
│   │
│   ├── ui/
│   │   ├── ui_manager.h/cpp        # Gestor de UI (HUD, FPS, debug)
│   │   ├── notifier.h/cpp          # Sistema de notificaciones temporales
│   │   └── help_overlay.h/cpp      # Overlay de ayuda (no implementado)
│   │
│   └── external/                   # Utilidades externas
│       ├── sprite.h/cpp                # Renderizado de sprites
│       ├── texture.h/cpp               # Gestión de texturas (con pack)
│       ├── dbgtxt.h                    # Sistema de debug text
│       ├── mouse.h                     # Utilidades de mouse
│       ├── stb_image.h                 # Carga de imágenes (stb)
│       └── stb_image_resize2.h         # Resize de imágenes (stb)
│
├── data/                           # Recursos del juego
│   ├── balls/                          # Texturas de pelotas
│   │   ├── tiny.png                        # 4x4 píxeles
│   │   ├── small.png                       # 6x6 píxeles
│   │   ├── normal.png                      # 10x10 píxeles
│   │   └── big.png                         # 16x16 píxeles
│   ├── logo/                           # Logos para AppLogo
│   │   ├── logo.png                        # Logo principal (PNG 1-bit)
│   │   └── logo2.png                       # Logo secundario
│   └── fonts/
│       └── determination.ttf           # Fuente para texto
│
├── CMakeLists.txt                  # Configuración CMake
├── Makefile                        # Configuración Make
├── CLAUDE.md                       # Seguimiento de desarrollo
├── README.md                       # Este archivo
└── .gitignore                      # Archivos ignorados por Git
```

---

## 🔧 Requisitos del Sistema

- **SDL3** (Simple DirectMedia Layer 3)
- **SDL3_ttf** (fuentes TTF para SDL3)
- **C++20** compatible compiler (GCC 10+, Clang 12+, MSVC 2019+)
- **CMake 3.20+**
- **Plataforma**: Windows, Linux, macOS

### Dependencias de shaders

El proyecto compila shaders GLSL a SPIR-V en todas las plataformas usando `glslc` (incluido en el Vulkan SDK). En macOS, adicionalmente transpila los `.spv` a MSL (Metal) con `spirv-cross` (shaders internos: sprite, ball, postfx).

| Plataforma | Backend GPU | Herramienta de shaders | Resultado |
|------------|-------------|------------------------|-----------|
| Linux      | Vulkan      | `glslc` (Vulkan SDK)   | `.spv`    |
| Windows    | Vulkan      | `glslc` (Vulkan SDK)   | `.spv`    |
| macOS      | Metal       | `glslc` + `spirv-cross`| `.spv.msl`|

---

### Instalación de dependencias

#### macOS

```bash
# SDL3 + SDL3_ttf
brew install sdl3 sdl3_ttf

# Vulkan SDK (incluye glslc para compilar shaders)
# Descargar desde https://vulkan.lunarg.com/ o via Homebrew:
brew install --cask vulkan-sdk

# spirv-cross (transpilación SPIR-V → MSL para Metal)
brew install spirv-cross
```

Tras instalar el Vulkan SDK es posible que necesites añadir `glslc` al PATH:
```bash
# Añadir a ~/.zshrc o ~/.bash_profile (ajusta la versión):
export PATH="$HOME/VulkanSDK/<version>/macOS/bin:$PATH"
source ~/.zshrc
```

#### Linux (Ubuntu/Debian)

```bash
# SDL3 + SDL3_ttf
sudo apt update
sudo apt install libsdl3-dev libsdl3-ttf-dev

# Vulkan SDK (incluye glslc)
# Opción A: paquete del sistema
sudo apt install glslc

# Opción B: Vulkan SDK completo (recomendado para versión reciente)
wget -qO- https://packages.lunarg.com/lunarg-signing-key-pub.asc | sudo apt-key add -
sudo wget -qO /etc/apt/sources.list.d/lunarg-vulkan.list \
    https://packages.lunarg.com/vulkan/lunarg-vulkan-focal.list
sudo apt update
sudo apt install vulkan-sdk
```

#### Linux (Arch)

```bash
sudo pacman -S sdl3 sdl3_ttf vulkan-devel glslang shaderc
```

#### Windows (MinGW / MSYS2)

```bash
# En MSYS2 shell:
pacman -S mingw-w64-x86_64-SDL3 mingw-w64-x86_64-SDL3_ttf

# Vulkan SDK: descargar el instalador desde https://vulkan.lunarg.com/
# El instalador añade glslc al PATH automáticamente.
```

Con Visual Studio + vcpkg:
```bash
vcpkg install sdl3 sdl3-ttf
# Instalar Vulkan SDK desde https://vulkan.lunarg.com/ (incluye glslc)
```

---

## 🚀 Compilación

### CMake (todas las plataformas)

```bash
mkdir -p build && cd build
cmake ..
cmake --build .
```

En macOS, CMake detecta automáticamente `spirv-cross` y genera los `.spv.msl` necesarios para los shaders internos (sprite, ball, postfx).

### Make directo (Linux/macOS)

```bash
make
```

---

## ▶️ Ejecución

### Ejecución Basic

```bash
# Linux/macOS
./vibe3_physics

# Windows
./vibe3_physics.exe
```

### Ejemplos con Parámetros

```bash
# 1080p fullscreen + modo DEMO
./vibe3_physics -w 1920 -h 1080 -F -m demo

# 720p zoom 2 + modo LOGO
./vibe3_physics -w 1280 -h 720 -z 2 -m logo

# Default con fullscreen letterbox
./vibe3_physics -f
```

---

## 📊 Detalles Técnicos

### Configuración Default

- **Resolución**: 320x240 píxeles (escalado x3 = 960x720 ventana)
- **Sistema de timing**: Delta time independiente del framerate
- **Física**: Gravedad 720 px/s², rebotes con pérdida 0.30-0.95
- **Tamaño de pelota**: Dinámico (4, 6, 10, 16 según sprite)
- **V-Sync**: Activado por defecto, controlable dinámicamente
- **Temas**: 15 temas (9 estáticos + 6 dinámicos)
- **Figuras 3D**: 9 figuras completas con física spring-damper

### Arquitectura del Código

El engine sigue una arquitectura **component-based** con separación de responsabilidades:

1. **Engine**: Bucle principal (delta time, update, events, render)
2. **SceneManager**: Gestión de pelotas y escenarios
3. **ShapeManager**: Gestión de figuras 3D
4. **BoidManager**: Comportamiento de enjambre
5. **StateManager**: Control de modos (DEMO/LOGO/SANDBOX)
6. **ThemeManager**: Temas y transiciones LERP
7. **UIManager**: HUD, FPS, debug, notificaciones
8. **InputHandler**: Procesamiento de teclado
9. **AppLogo**: Sistema de logo periódico

### Sistema de Delta Time

**Conversión de unidades (frame-based → time-based):**

| Parámetro | Frame-Based | Time-Based | Conversión |
|-----------|-------------|------------|------------|
| Velocidad | px/frame | px/segundo | ×60 |
| Gravedad | px/frame² | px/segundo² | ×3600 (60²) |
| Física | Cada 16.67ms | Cada delta_time | Proporcional |

**Beneficios:**
- ✅ Velocidad consistente entre 60Hz, 75Hz, 144Hz+
- ✅ V-Sync independiente (misma velocidad ON/OFF)
- ✅ Física precisa y predecible
- ✅ Escalable a cualquier framerate

### Batch Rendering

**Rendimiento conseguido:**
- **50,000 pelotas**: >75 FPS (mejora de 750% vs rendering individual)
- **100,000 pelotas**: Fluido y jugable
- **Una sola llamada** `SDL_RenderGeometry` por frame
- **Overhead mínimo**: Acumulación de vértices e índices en vectores

---

## 🛠️ Desarrollo

Para contribuir al proyecto:

1. Fork del repositorio
2. Crear rama de feature (`git checkout -b feature/nueva-caracteristica`)
3. Commit de cambios (`git commit -am 'Añadir nueva característica'`)
4. Push a la rama (`git push origin feature/nueva-caracteristica`)
5. Crear Pull Request

---

## 📝 Notas Técnicas

- **Smart pointers**: `unique_ptr`, `shared_ptr` para gestión de memoria
- **RAII**: Para recursos SDL (window, renderer, texturas)
- **Separación de responsabilidades**: Arquitectura component-based
- **Configuración multiplataforma**: Windows, Linux, macOS
- **Filtro nearest neighbor**: Texturas pixel-perfect
- **Sistema de métricas**: FPS, V-Sync, física en tiempo real
- **Resource pack**: Sistema de empaquetado de recursos (opcional)

---

## 🐛 Problemas Conocidos

Ninguno conocido. El sistema está completamente funcional con delta time, batch rendering, temas, figuras 3D, BOIDS y modos de aplicación implementados.

---

## 📸 Capturas de Pantalla

*(Pendiente de añadir capturas de pantalla)*

---

**Proyecto desarrollado como base para experimentación con game loops, física en tiempo real, comportamientos emergentes y efectos demoscene usando SDL3.**

*ViBe3 Physics - JailDesigner 2025*
