**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>
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 100,000 sprites simultáneos.
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.
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 2Numpad 1-9, 0: Acceso directo al tema según página activaP: 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.pngautomá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)
// 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
- Separación: Evitar colisiones con vecinos cercanos
- Alineación: Seguir dirección promedio del grupo
- 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)
// 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)
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
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
# 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: 640px
- Alto mínimo: 480px
- 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)
- C++20 compatible compiler (GCC 10+, Clang 12+, MSVC 2019+)
- CMake 3.20+ o Make
- Plataforma: Windows, Linux, macOS
Instalación de SDL3
Windows (MinGW)
# Usando vcpkg
vcpkg install sdl3
# O compilar desde fuente
git clone https://github.com/libsdl-org/SDL
cd SDL
mkdir build && cd build
cmake ..
make
sudo make install
Linux (Ubuntu/Debian)
sudo apt update
sudo apt install libsdl3-dev
# Si no está disponible, compilar desde fuente
Linux (Arch)
sudo pacman -S sdl3
macOS
brew install sdl3
🚀 Compilación
Opción 1: CMake (Recomendado)
mkdir -p build && cd build
cmake ..
cmake --build .
Opción 2: Make directo
make
▶️ Ejecución
Ejecución Basic
# Linux/macOS
./vibe3_physics
# Windows
./vibe3_physics.exe
Ejemplos con Parámetros
# 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:
- Engine: Bucle principal (delta time, update, events, render)
- SceneManager: Gestión de pelotas y escenarios
- ShapeManager: Gestión de figuras 3D
- BoidManager: Comportamiento de enjambre
- StateManager: Control de modos (DEMO/LOGO/SANDBOX)
- ThemeManager: Temas y transiciones LERP
- UIManager: HUD, FPS, debug, notificaciones
- InputHandler: Procesamiento de teclado
- 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_RenderGeometrypor frame - Overhead mínimo: Acumulación de vértices e índices en vectores
🛠️ Desarrollo
Para contribuir al proyecto:
- Fork del repositorio
- Crear rama de feature (
git checkout -b feature/nueva-caracteristica) - Commit de cambios (
git commit -am 'Añadir nueva característica') - Push a la rama (
git push origin feature/nueva-caracteristica) - Crear Pull Request
📝 Notas Técnicas
- Smart pointers:
unique_ptr,shared_ptrpara 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