#pragma once #include // for SDL_Event #include // for SDL_Renderer #include // for Uint64 #include // for SDL_Window #include // for array #include // for unique_ptr, shared_ptr #include // for string #include // for vector #include "defines.h" // for GravityDirection, ColorTheme class Ball; class Texture; class Engine { public: // Interfaz pública bool initialize(); void run(); void shutdown(); private: // Recursos SDL SDL_Window* window_ = nullptr; SDL_Renderer* renderer_ = nullptr; std::shared_ptr texture_ = nullptr; // Estado del simulador std::vector> balls_; std::array test_ = {1, 10, 100, 500, 1000, 10000, 50000, 100000}; GravityDirection current_gravity_ = GravityDirection::DOWN; int scenario_ = 0; bool should_exit_ = false; // Sistema de timing Uint64 last_frame_time_ = 0; float delta_time_ = 0.0f; // UI y debug bool show_debug_ = false; bool show_text_ = true; std::string text_; int text_pos_ = 0; Uint64 text_init_time_ = 0; // FPS y V-Sync Uint64 fps_last_time_ = 0; int fps_frame_count_ = 0; int fps_current_ = 0; std::string fps_text_ = "FPS: 0"; bool vsync_enabled_ = true; std::string vsync_text_ = "VSYNC ON"; // Sistema de temas ColorTheme current_theme_ = ColorTheme::SUNSET; // Batch rendering std::vector batch_vertices_; std::vector batch_indices_; // Métodos principales del loop void calculateDeltaTime(); void update(); void handleEvents(); void render(); // Métodos auxiliares void initBalls(int value); void setText(); void pushUpBalls(); void switchBallsGravity(); void changeGravityDirection(GravityDirection direction); void toggleVSync(); std::string gravityDirectionToString(GravityDirection direction) const; // Rendering void renderGradientBackground(); void addSpriteToBatch(float x, float y, float w, float h, int r, int g, int b); };