120 lines
3 KiB
C++
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);
|
|
}
|