#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 #include "ball.h" // for Ball #include "external/texture.h" // for 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; // Sistema de zoom dinámico int current_window_zoom_ = WINDOW_ZOOM; 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"; bool fullscreen_enabled_ = false; bool real_fullscreen_enabled_ = false; // Auto-restart system Uint64 all_balls_stopped_start_time_ = 0; // Momento cuando todas se pararon bool all_balls_were_stopped_ = false; // Flag de estado anterior static constexpr Uint64 AUTO_RESTART_DELAY = 5000; // 5 segundos en ms // Resolución dinámica para modo real fullscreen int current_screen_width_ = SCREEN_WIDTH; int current_screen_height_ = SCREEN_HEIGHT; // Sistema de temas ColorTheme current_theme_ = ColorTheme::SUNSET; // Estructura de tema de colores struct ThemeColors { float bg_top_r, bg_top_g, bg_top_b; float bg_bottom_r, bg_bottom_g, bg_bottom_b; std::vector ball_colors; }; // Temas de colores definidos ThemeColors themes_[5]; // 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 pushBallsAwayFromGravity(); void switchBallsGravity(); void changeGravityDirection(GravityDirection direction); void toggleVSync(); void toggleFullscreen(); void toggleRealFullscreen(); std::string gravityDirectionToString(GravityDirection direction) const; void initializeThemes(); void checkAutoRestart(); void performRandomRestart(); // Sistema de zoom dinámico int calculateMaxWindowZoom() const; void setWindowZoom(int new_zoom); void zoomIn(); void zoomOut(); // Rendering void renderGradientBackground(); void addSpriteToBatch(float x, float y, float w, float h, int r, int g, int b); };