#pragma once #include // 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) // Configuración de Helix (espiral helicoidal 3D) constexpr float HELIX_RADIUS_FACTOR = 0.25f; // Radio de la espiral (proporción de altura) constexpr float HELIX_PITCH_FACTOR = 0.25f; // Separación vertical entre vueltas (proporción de altura) constexpr float HELIX_NUM_TURNS = 3.0f; // Número de vueltas completas (1-5) constexpr float HELIX_ROTATION_SPEED_Y = 1.2f; // Velocidad rotación eje Y (rad/s) constexpr float HELIX_PHASE_SPEED = 0.5f; // Velocidad de animación vertical (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