collision_crisis/src/main.cpp

120 lines
3 KiB
C++

#include "defs.h"
#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>
#include <imgui-SFML.h>
#include <imgui.h>
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<sf::Event::JoystickButtonPressed>() || event.is<sf::Event::JoystickButtonReleased>() ||
event.is<sf::Event::JoystickMoved>() ||
event.is<sf::Event::JoystickConnected>() || event.is<sf::Event::JoystickDisconnected>() ||
event.is<sf::Event::KeyPressed>() || event.is<sf::Event::KeyReleased>() ||
event.is<sf::Event::TouchBegan>() || event.is<sf::Event::TouchEnded>() ||
event.is<sf::Event::TouchMoved>() ||
event.is<sf::Event::MouseButtonPressed>() || event.is<sf::Event::MouseButtonReleased>() ||
event.is<sf::Event::MouseMoved>() || event.is<sf::Event::MouseMovedRaw>()};
if (is_input_event) {
handle_input_event(event);
}
}
void try_handle_window_event(sf::Event const &event) {
bool const is_window_event{
event.is<sf::Event::FocusGained>() ||
event.is<sf::Event::FocusLost>() ||
event.is<sf::Event::Resized>()};
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<sf::Event::Closed>()) {
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);
}