Commit Graph

8 Commits

Author SHA1 Message Date
c50ecbc02a Add: Sistema de páginas para selección de temas + 5 nuevos temas
Implementación:
- 5 nuevos temas (2 estáticos: CRIMSON, EMERALD / 3 dinámicos: FIRE, AURORA, VOLCANIC)
- Sistema de páginas con Numpad Enter (Página 1 ↔ Página 2)
- Shift+B para ciclar temas hacia atrás
- Página 1: 9 temas estáticos + SUNRISE (Numpad 1-9, 0)
- Página 2: 5 temas dinámicos animados (Numpad 1-5)

Motivo:
- Shift+Numpad no funciona en Windows (limitación hardware/OS)
- Solución: Toggle de página con Numpad Enter

Archivos modificados:
- defines.h: Añadidos 5 nuevos ColorTheme enum values
- theme_manager.h: Añadido cyclePrevTheme() + actualizada doc 10→15 temas
- theme_manager.cpp: Implementados 5 nuevos temas + cyclePrevTheme()
- engine.h: Añadida variable theme_page_ (0 o 1)
- engine.cpp: Handlers Numpad Enter, KP_1-9,0 con sistema de páginas, SDLK_B con Shift detection
- CLAUDE.md: Documentación actualizada con tablas de 2 páginas

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-09 18:04:13 +02:00
31ac22bd0f Documentar Z-sorting en CLAUDE.md 2025-10-03 13:45:55 +02:00
355fa4ffb7 Ajustar amortiguación para absorción rápida sin oscilación
Incrementar constantes de damping para lograr amortiguamiento crítico
y eliminar oscilaciones durante la convergencia a la esfera RotoBall.

## Cambios

**defines.h - Nuevos valores:**
- `ROTOBALL_DAMPING_BASE`: 15.0 → 35.0 (+133%)
  - Amortiguamiento crítico calculado: c ≈ 2*√(k*m) = 2*√(300*1) ≈ 34.64
- `ROTOBALL_DAMPING_NEAR`: 50.0 → 80.0 (+60%)
  - Absorción rápida cuando están cerca del punto

## Problema Resuelto

**Antes (subdamped):**
- Las pelotas oscilaban varias veces antes de estabilizarse
- Sobrepasaban el punto destino repetidamente
- Convergencia lenta con "rebotes" visuales

**Ahora (critically damped):**
- Las pelotas convergen directamente sin oscilar
- Se "pegan" suavemente a la esfera
- Absorción rápida y visualmente limpia

## Teoría

Sistema masa-resorte-amortiguador:
- Subdamped (c < 2√km): Oscila antes de estabilizar
- Critically damped (c = 2√km): Converge rápido sin oscilar
- Overdamped (c > 2√km): Converge muy lento

Valores ajustados para estar en el punto crítico, logrando
la convergencia más rápida posible sin oscilación.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-03 13:27:26 +02:00
91ab6487b3 Implementar física de atracción con resorte en RotoBall
Reemplazar interpolación lineal artificial por sistema de fuerzas físicamente
realista usando Ley de Hooke con amortiguación variable.

## Cambios Principales

### Sistema de Física Implementado

**Fuerza de Resorte (Hooke's Law):**
```cpp
F_spring = k * (target - position)
F_damping = c * velocity
F_total = F_spring - F_damping
acceleration = F_total / mass
```

**Constantes (defines.h):**
- `ROTOBALL_SPRING_K = 300.0f`: Rigidez del resorte
- `ROTOBALL_DAMPING_BASE = 15.0f`: Amortiguación lejos del punto
- `ROTOBALL_DAMPING_NEAR = 50.0f`: Amortiguación cerca (estabilización)
- `ROTOBALL_NEAR_THRESHOLD = 5.0f`: Distancia considerada "cerca"
- `ROTOBALL_MAX_FORCE = 1000.0f`: Límite de seguridad

### Nuevas Funciones (Ball class)

- `enableRotoBallAttraction(bool)`: Activa/desactiva atracción física
- `applyRotoBallForce(target_x, target_y, deltaTime)`: Aplica fuerza de resorte

### Comportamiento Físico

**Al entrar (PHYSICS → ROTOBALL):**
1. Pelotas mantienen velocidad actual (vx, vy)
2. Fuerza de atracción las acelera hacia puntos en esfera rotante
3. Amortiguación variable evita oscilaciones infinitas
4. Convergen al punto con aceleración natural

**Durante RotoBall:**
- Punto destino rota constantemente
- Fuerza se recalcula cada frame hacia posición rotada
- Pelotas "persiguen" su punto móvil
- Efecto: Convergencia orgánica con ligera oscilación

**Al salir (ROTOBALL → PHYSICS):**
1. Atracción se desactiva
2. Pelotas conservan velocidad tangencial actual
3. Gravedad vuelve a aplicarse
4. Caen con la inercia que traían de la esfera

### Archivos Modificados

- `defines.h`: 5 nuevas constantes físicas
- `ball.h/cpp`: Sistema de resorte completo
- `engine.cpp`: Enable/disable atracción en toggle, updateRotoBall() usa física
- `CLAUDE.md`: Documentación técnica completa

## Ventajas del Sistema

 Física realista con conservación de momento
 Transición orgánica (no artificial)
 Inercia preservada entrada/salida
 Amortiguación automática (no oscila infinito)
 Constantes ajustables para tuning
 Performance: O(1) por pelota

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-03 13:24:07 +02:00
22e3356f80 Implementar modo RotoBall - Esfera 3D rotante (demoscene effect)
Añadido modo alternativo de simulación que transforma las pelotas en una
esfera 3D rotante proyectada en 2D, inspirado en efectos clásicos de demoscene.

## Características Principales

- **Algoritmo Fibonacci Sphere**: Distribución uniforme de puntos en esfera 3D
- **Rotación dual**: Matrices de rotación en ejes X e Y simultáneos
- **Profundidad Z simulada**: Color modulation según distancia (oscuro=lejos, brillante=cerca)
- **Transición suave**: Interpolación de 1.5s desde física a esfera
- **Sin sprites adicionales**: Usa SDL_SetTextureColorMod para profundidad
- **Performance optimizado**: >60 FPS con 100,000 pelotas

## Implementación Técnica

### Nuevos Archivos/Cambios:
- `defines.h`: Enum SimulationMode + constantes RotoBall (radio, velocidades, brillo)
- `ball.h/cpp`: Soporte 3D (pos_3d, target_2d, depth_brightness, setters)
- `engine.h/cpp`: Lógica completa RotoBall (generate, update, toggle)
  - `generateRotoBallSphere()`: Fibonacci sphere algorithm
  - `updateRotoBall()`: Rotación 3D + proyección ortográfica
  - `toggleRotoBallMode()`: Cambio entre PHYSICS/ROTOBALL
- `README.md`: Documentación completa del modo
- `CLAUDE.md`: Detalles técnicos y algoritmos

## Parámetros Configurables (defines.h)

```cpp
ROTOBALL_RADIUS = 80.0f;           // Radio de la esfera
ROTOBALL_ROTATION_SPEED_Y = 1.5f;  // Velocidad rotación eje Y (rad/s)
ROTOBALL_ROTATION_SPEED_X = 0.8f;  // Velocidad rotación eje X (rad/s)
ROTOBALL_TRANSITION_TIME = 1.5f;   // Tiempo de transición (segundos)
ROTOBALL_MIN_BRIGHTNESS = 50;      // Brillo mínimo fondo (0-255)
ROTOBALL_MAX_BRIGHTNESS = 255;     // Brillo máximo frente (0-255)
```

## Uso

- **Tecla C**: Alternar entre modo física y modo RotoBall
- Compatible con todos los temas de colores
- Funciona con 1-100,000 pelotas
- Debug display muestra "MODE PHYSICS" o "MODE ROTOBALL"

## Performance

- Batch rendering: Una sola llamada SDL_RenderGeometry
- Fibonacci sphere recalculada por frame (O(n) predecible)
- Color mod CPU-side sin overhead GPU
- Delta time independiente del framerate

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-03 13:03:03 +02:00
ac57755bd2 Añadir tema RGB y actualizar documentación completa
- Añadido nuevo tema RGB con fondo blanco puro y colores matemáticos
- Actualizado README.md con controles actuales y nuevas características
- Reorganizada documentación de controles por categorías
- Corregida información obsoleta (resolución, temas, problemas)
- Añadido control KP_5 para selección directa del tema RGB
- Mejorada visibilidad del texto adaptando colores por tema

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-18 22:08:28 +02:00
78656cf17d Implementar sistema de variación por rebote individual
- Corregir coeficiente base: ahora TODAS las pelotas tienen el mismo (0.75)
- Añadir constantes configurables en defines.h:
  * BASE_BOUNCE_COEFFICIENT = 0.75f (igual para todas)
  * BOUNCE_VARIATION_PERCENT = 0.05f (±5% por rebote)
  * LATERAL_LOSS_PERCENT = 0.02f (±2% pérdida lateral)
- Implementar funciones generateBounceVariation() y generateLateralLoss()
- Aplicar variación aleatoria en cada rebote individual:
  * Superficie de gravedad: rebote con ±5% variación
  * Otras superficies: pérdida lateral 0-2%
- Añadir pérdida lateral perpendicular en todos los rebotes
- Actualizar debug display para mostrar coeficiente LOSS

Efecto: Pelotas idénticas divergen gradualmente por variaciones microscópicas
acumulativas, eliminando sincronización de forma natural y realista.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-18 16:52:24 +02:00
dec8d431f5 Implementar sistema de gravedad direccional con controles de cursor
- Añadir enum GravityDirection (UP/DOWN/LEFT/RIGHT) en defines.h
- Modificar Ball class para soportar gravedad multi-direccional
- Reescribir Ball::update() con lógica direccional completa
- Cambiar on_floor_ por on_surface_ (más genérico)
- Implementar detección de superficie según dirección de gravedad
- Añadir controles de teclado con teclas de cursor
- Actualizar debug display para mostrar dirección actual
- Aplicar fricción correctamente según superficie activa

Controles nuevos:
- ↑/↓/←/→: Cambiar dirección de gravedad
- H: Toggle debug display (incluye nueva info de gravedad)

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-17 22:37:19 +02:00