#include "defs.h" #include #include #include #include static sf::RenderWindow window{}; static sf::Clock delta_clock{}; static sf::Time delta_time{}; static AppConfig cfg{}; static sf::View view{}; extern void configure(AppConfig &config); void initialize_window() { cfg = AppConfig(); configure(cfg); window.create(cfg.mode, cfg.window_title); if (cfg.frame_rate_limit) { window.setFramerateLimit(cfg.frame_rate_limit.value_or(0)); } window.setVerticalSyncEnabled(cfg.vsync); view = window.getDefaultView(); } void initialize_imgui() { if (!ImGui::SFML::Init(window)) exit(-1); } extern void handle_input_event(sf::Event const &evt); extern void handle_window_event(sf::Event const &evt); void try_handle_input_event(sf::Event const &event) { bool const is_input_event{ event.is() || event.is() || event.is() || event.is() || event.is() || event.is() || event.is() || event.is() || event.is() || event.is() || event.is() || event.is() || event.is() || event.is()}; if (is_input_event) { handle_input_event(event); } } void try_handle_window_event(sf::Event const &event) { bool const is_window_event{ event.is() || event.is() || event.is()}; if (is_window_event) { handle_window_event(event); } } void poll_events() { while (std::optional const event{window.pollEvent()}) { ImGui::SFML::ProcessEvent(window, *event); try_handle_input_event(*event); try_handle_window_event(*event); if (event->is()) { window.close(); } } } extern void setup(void); extern void loop(double delta); extern void draw_scene(sf::RenderTarget &target, sf::RenderStates const &states); extern void draw_main_menu_bar(void); extern void draw_gui(void); extern void shutdown(void); int main() { initialize_window(); initialize_imgui(); setup(); while (window.isOpen()) { // Event Polling poll_events(); // Update delta_time = delta_clock.restart(); ImGui::SFML::Update(window, delta_time); loop(delta_time.asSeconds()); if (ImGui::BeginMainMenuBar()) { draw_main_menu_bar(); ImGui::EndMainMenuBar(); } draw_gui(); // Render window.clear(); draw_scene(window, cfg.default_render_states); ImGui::SFML::Render(window); window.display(); } shutdown(); ImGui::SFML::Shutdown(); return 0; } AppConfig const &get_application_configuration() { return cfg; } sf::Time const &get_delta_time() { return delta_time; } sf::RenderWindow &get_window() { return window; } void set_render_view(sf::View const &view) { window.setView(view); }