Nuevas Características:
- PNG_SHAPE (tecla O): Logo JAILGAMES desde PNG 1-bit
- Extrusión 2D con detección de bordes/relleno configurable
- Rotación "legible": 90% frente, 10% volteretas aleatorias
- 15 capas de extrusión con relleno completo (22K+ puntos 3D)
- Fix: Z forzado a máximo cuando está de frente (brillante)
- Excluido de DEMO/DEMO_LITE (logo especial)
- Sistema de texturas dinámicas
- Carga automática desde data/balls/*.png
- normal.png siempre primero, resto alfabético
- Tecla N cicla entre todas las texturas encontradas
- Display dinámico del nombre (uppercase)
- Física mejorada para figuras 3D
- Constantes SHAPE separadas de ROTOBALL
- SHAPE_SPRING_K=800 (+167% rigidez vs ROTOBALL)
- SHAPE_DAMPING_NEAR=150 (+88% absorción)
- Pelotas mucho más "pegadas" durante rotaciones
- applyRotoBallForce() acepta parámetros personalizados
Archivos:
- NEW: source/shapes/png_shape.{h,cpp}
- NEW: data/shapes/jailgames.png
- NEW: data/balls/{normal,small,tiny}.png
- MOD: defines.h (constantes PNG + SHAPE physics)
- MOD: engine.cpp (carga dinámica texturas + física SHAPE)
- MOD: ball.{h,cpp} (parámetros física configurables)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
59 lines
2.4 KiB
C++
59 lines
2.4 KiB
C++
#pragma once
|
|
|
|
#include "shape.h"
|
|
#include <vector>
|
|
|
|
// Figura: Shape generada desde PNG 1-bit (blanco sobre negro)
|
|
// Enfoque A: Extrusión 2D (implementado)
|
|
// Enfoque B: Voxelización 3D (preparado para futuro)
|
|
class PNGShape : public Shape {
|
|
private:
|
|
// Datos de la imagen cargada
|
|
int image_width_ = 0;
|
|
int image_height_ = 0;
|
|
std::vector<bool> pixel_data_; // Mapa de píxeles blancos (true = blanco)
|
|
|
|
// Puntos generados (Enfoque A: Extrusión 2D)
|
|
struct Point2D {
|
|
float x, y;
|
|
};
|
|
std::vector<Point2D> edge_points_; // Contorno (solo bordes)
|
|
std::vector<Point2D> filled_points_; // Relleno completo (para Enfoque B)
|
|
|
|
// Parámetros de extrusión
|
|
float extrusion_depth_ = 0.0f; // Profundidad de extrusión en Z
|
|
int num_layers_ = 0; // Capas de extrusión (más capas = más denso)
|
|
|
|
// Rotación "legible" (de frente con volteretas ocasionales)
|
|
float angle_x_ = 0.0f;
|
|
float angle_y_ = 0.0f;
|
|
float idle_timer_ = 0.0f; // Timer para tiempo de frente
|
|
float flip_timer_ = 0.0f; // Timer para voltereta
|
|
float next_idle_time_ = 5.0f; // Próximo tiempo de espera (aleatorio)
|
|
bool is_flipping_ = false; // Estado: quieto o voltereta
|
|
int flip_axis_ = 0; // Eje de voltereta (0=X, 1=Y, 2=ambos)
|
|
|
|
// Dimensiones normalizadas
|
|
float scale_factor_ = 1.0f;
|
|
float center_offset_x_ = 0.0f;
|
|
float center_offset_y_ = 0.0f;
|
|
|
|
int num_points_ = 0; // Total de puntos generados (para indexación)
|
|
|
|
// Métodos internos
|
|
bool loadPNG(const char* path); // Cargar PNG con stb_image
|
|
void detectEdges(); // Detectar contorno (Enfoque A)
|
|
void floodFill(); // Rellenar interior (Enfoque B - futuro)
|
|
void generateExtrudedPoints(); // Generar puntos con extrusión 2D
|
|
|
|
public:
|
|
// Constructor: recibe path relativo al PNG
|
|
PNGShape(const char* png_path = "data/shapes/jailgames.png");
|
|
|
|
void generatePoints(int num_points, float screen_width, float screen_height) override;
|
|
void update(float delta_time, float screen_width, float screen_height) override;
|
|
void getPoint3D(int index, float& x, float& y, float& z) const override;
|
|
const char* getName() const override { return "PNG SHAPE"; }
|
|
float getScaleFactor(float screen_height) const override;
|
|
};
|