NUEVAS CARACTERÍSTICAS: - Control de escala dinámico con Numpad +/-/* (30%-300%) - Protección automática contra clipping según resolución - Texto informativo muestra porcentaje de escala - Fix: Redondeo correcto en display de escala (79% → 80%) CAMBIOS EN README: - Actualizar tabla de controles (C→F, T→B, añadir Q/W/E/R/T/Y/U/I) - Documentar sistema polimórfico de figuras 3D - Añadir sección "Controles de Figuras 3D" con Numpad +/-/* - Actualizar debug display (8 líneas ahora) - Expandir sección "Modo RotoBall" → "Sistema de Figuras 3D" - Documentar Esfera y Cubo implementados - Listar 6 figuras futuras (Wave/Helix/Torus/Cylinder/Icosahedron/Atom) - Actualizar estructura del proyecto (añadir source/shapes/) - Añadir parámetros de escala manual a sección técnica IMPLEMENTACIÓN TÉCNICA: - defines.h: Constantes SHAPE_SCALE_MIN/MAX/STEP/DEFAULT - engine.h: Variable shape_scale_factor_, método clampShapeScale() - engine.cpp: Handlers Numpad +/-/*, multiplicar scale_factor en updateShape() - clampShapeScale(): Límite dinámico según tamaño de pantalla (90% máximo) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
109 lines
5.4 KiB
C++
109 lines
5.4 KiB
C++
#pragma once
|
|
|
|
#include <SDL3/SDL_stdinc.h> // for Uint64
|
|
|
|
// Configuración de ventana y pantalla
|
|
constexpr char WINDOW_CAPTION[] = "vibe3_physics";
|
|
|
|
constexpr int SCREEN_WIDTH = 320; // Ancho de la pantalla lógica (píxeles)
|
|
constexpr int SCREEN_HEIGHT = 240; // Alto de la pantalla lógica (píxeles)
|
|
constexpr int WINDOW_ZOOM = 3; // Zoom inicial de la ventana
|
|
constexpr int BALL_SIZE = 10; // Tamaño de las pelotas (píxeles)
|
|
|
|
// Configuración de zoom dinámico de ventana
|
|
constexpr int WINDOW_ZOOM_MIN = 1; // Zoom mínimo (320x240)
|
|
constexpr int WINDOW_ZOOM_MAX = 10; // Zoom máximo teórico (3200x2400)
|
|
constexpr int WINDOW_DESKTOP_MARGIN = 10; // Margen mínimo con bordes del escritorio
|
|
constexpr int WINDOW_DECORATION_HEIGHT = 30; // Altura estimada de decoraciones del SO
|
|
|
|
// Configuración de física
|
|
constexpr float GRAVITY_FORCE = 0.2f; // Fuerza de gravedad (píxeles/frame²)
|
|
|
|
// Configuración de interfaz
|
|
constexpr Uint64 TEXT_DURATION = 2000; // Duración del texto informativo (ms)
|
|
|
|
// Configuración de pérdida aleatoria en rebotes
|
|
constexpr float BASE_BOUNCE_COEFFICIENT = 0.75f; // Coeficiente base IGUAL para todas las pelotas
|
|
constexpr float BOUNCE_RANDOM_LOSS_PERCENT = 0.1f; // 0-10% pérdida adicional aleatoria en cada rebote
|
|
constexpr float LATERAL_LOSS_PERCENT = 0.02f; // ±2% pérdida lateral en rebotes
|
|
|
|
// Configuración de masa/peso individual por pelota
|
|
constexpr float GRAVITY_MASS_MIN = 0.7f; // Factor mínimo de masa (pelota ligera - 70% gravedad)
|
|
constexpr float GRAVITY_MASS_MAX = 1.3f; // Factor máximo de masa (pelota pesada - 130% gravedad)
|
|
|
|
// Configuración de velocidad lateral al cambiar gravedad (muy sutil)
|
|
constexpr float GRAVITY_CHANGE_LATERAL_MIN = 0.04f; // Velocidad lateral mínima (2.4 px/s)
|
|
constexpr float GRAVITY_CHANGE_LATERAL_MAX = 0.08f; // Velocidad lateral máxima (4.8 px/s)
|
|
|
|
// Configuración de spawn inicial de pelotas
|
|
constexpr float BALL_SPAWN_MARGIN = 0.15f; // Margen lateral para spawn (0.25 = 25% a cada lado)
|
|
|
|
// Estructura para representar colores RGB
|
|
struct Color {
|
|
int r, g, b; // Componentes rojo, verde, azul (0-255)
|
|
};
|
|
|
|
// Enum para dirección de gravedad
|
|
enum class GravityDirection {
|
|
DOWN, // ↓ Gravedad hacia abajo (por defecto)
|
|
UP, // ↑ Gravedad hacia arriba
|
|
LEFT, // ← Gravedad hacia la izquierda
|
|
RIGHT // → Gravedad hacia la derecha
|
|
};
|
|
|
|
// Enum para temas de colores (seleccionables con teclado numérico)
|
|
enum class ColorTheme {
|
|
SUNSET = 0, // Naranjas, rojos, amarillos, rosas
|
|
OCEAN = 1, // Azules, turquesas, blancos
|
|
NEON = 2, // Cian, magenta, verde lima, amarillo vibrante
|
|
FOREST = 3, // Verdes, marrones, amarillos otoño
|
|
RGB = 4 // RGB puros y subdivisiones matemáticas (fondo blanco)
|
|
};
|
|
|
|
// Enum para tipo de figura 3D
|
|
enum class ShapeType {
|
|
NONE, // Sin figura (modo física pura)
|
|
SPHERE, // Esfera Fibonacci (antiguo RotoBall)
|
|
CUBE, // Cubo rotante
|
|
HELIX, // Espiral 3D (futuro)
|
|
TORUS, // Toroide/donut (futuro)
|
|
WAVE_GRID, // Malla ondeante (futuro)
|
|
CYLINDER, // Cilindro rotante (futuro)
|
|
ICOSAHEDRON, // Icosaedro D20 (futuro)
|
|
ATOM // Átomo con órbitas (futuro)
|
|
};
|
|
|
|
// Enum para modo de simulación
|
|
enum class SimulationMode {
|
|
PHYSICS, // Modo física normal con gravedad
|
|
SHAPE // Modo figura 3D (Shape polimórfico)
|
|
};
|
|
|
|
// Configuración de RotoBall (esfera 3D rotante)
|
|
constexpr float ROTOBALL_RADIUS_FACTOR = 0.333f; // Radio como proporción de altura de pantalla (80/240 ≈ 0.333)
|
|
constexpr float ROTOBALL_ROTATION_SPEED_Y = 1.5f; // Velocidad rotación eje Y (rad/s)
|
|
constexpr float ROTOBALL_ROTATION_SPEED_X = 0.8f; // Velocidad rotación eje X (rad/s)
|
|
constexpr float ROTOBALL_TRANSITION_TIME = 1.5f; // Tiempo de transición (segundos)
|
|
constexpr int ROTOBALL_MIN_BRIGHTNESS = 50; // Brillo mínimo (fondo, 0-255)
|
|
constexpr int ROTOBALL_MAX_BRIGHTNESS = 255; // Brillo máximo (frente, 0-255)
|
|
|
|
// Física de atracción para figuras 3D (sistema de resorte compartido)
|
|
constexpr float ROTOBALL_SPRING_K = 300.0f; // Constante de rigidez del resorte (N/m)
|
|
constexpr float ROTOBALL_DAMPING_BASE = 35.0f; // Amortiguación base (amortiguamiento crítico ≈ 2*√k*m)
|
|
constexpr float ROTOBALL_DAMPING_NEAR = 80.0f; // Amortiguación cerca del punto (absorción rápida)
|
|
constexpr float ROTOBALL_NEAR_THRESHOLD = 5.0f; // Distancia "cerca" en píxeles
|
|
constexpr float ROTOBALL_MAX_FORCE = 1000.0f; // Fuerza máxima aplicable (evita explosiones)
|
|
|
|
// Configuración del Cubo (cubo 3D rotante)
|
|
constexpr float CUBE_SIZE_FACTOR = 0.25f; // Tamaño como proporción de altura (60/240 = 0.25)
|
|
constexpr float CUBE_ROTATION_SPEED_X = 0.5f; // Velocidad rotación eje X (rad/s)
|
|
constexpr float CUBE_ROTATION_SPEED_Y = 0.7f; // Velocidad rotación eje Y (rad/s)
|
|
constexpr float CUBE_ROTATION_SPEED_Z = 0.3f; // Velocidad rotación eje Z (rad/s)
|
|
|
|
// Control manual de escala de figuras 3D (Numpad +/-)
|
|
constexpr float SHAPE_SCALE_MIN = 0.3f; // Escala mínima (30%)
|
|
constexpr float SHAPE_SCALE_MAX = 3.0f; // Escala máxima (300%)
|
|
constexpr float SHAPE_SCALE_STEP = 0.1f; // Incremento por pulsación
|
|
constexpr float SHAPE_SCALE_DEFAULT = 1.0f; // Escala por defecto (100%)
|
|
|
|
constexpr float PI = 3.14159265358979323846f; // Constante PI
|