#pragma once // Interfaz abstracta para todas las figuras 3D class Shape { public: virtual ~Shape() = default; // Generar distribución inicial de puntos en la figura // num_points: cantidad de pelotas a distribuir // screen_width/height: dimensiones del área de juego (para escalar) virtual void generatePoints(int num_points, float screen_width, float screen_height) = 0; // Actualizar animación de la figura (rotación, deformación, etc.) // delta_time: tiempo transcurrido desde último frame // screen_width/height: dimensiones actuales (puede cambiar con F4) virtual void update(float delta_time, float screen_width, float screen_height) = 0; // Obtener posición 3D del punto i después de transformaciones (rotación, etc.) // index: índice del punto (0 a num_points-1) // x, y, z: coordenadas 3D en espacio mundo (centradas en 0,0,0) virtual void getPoint3D(int index, float& x, float& y, float& z) const = 0; // Obtener nombre de la figura para debug display virtual const char* getName() const = 0; // Obtener factor de escala para ajustar física según tamaño de figura // screen_height: altura actual de pantalla // Retorna: factor multiplicador para constantes de física (spring_k, damping, etc.) virtual float getScaleFactor(float screen_height) const = 0; // Notificar a la figura sobre el porcentaje de convergencia (pelotas cerca del objetivo) // convergence: valor de 0.0 (0%) a 1.0 (100%) indicando cuántas pelotas están en posición // Default: no-op (la mayoría de figuras no necesitan esta información) virtual void setConvergence(float convergence) {} };