1 | #include <iostream> |
2 | #include <thread> |
3 |
|
4 | #include <SDL2/SDL.h> |
5 | #include "GL/gl3w.h" |
6 | #include <GL/gl.h> |
7 |
|
8 | #include "ZydecoCommon.hpp" |
9 | #include "CommonSDL2.hpp" |
10 | #include "EventHandlerSDL2.hpp" |
11 | #include "WindowSDL2.hpp" |
12 | #include "Engine.hpp" |
13 |
|
14 |
|
15 | static Logger LOGGER("MAIN"); |
16 |
|
17 | static const char *ZYDECO_TERMOUT[] = { |
18 | "Zydeco v0.1.0 Copyright (c) Joshua Stockin 2023", |
19 | "<https://joshstock.in> <josh@joshstock.in>", |
20 | }; |
21 |
|
22 |
|
23 | void on_terminate(void) |
24 | { |
25 | ZydecoFault("TERMINATED"); |
26 | } |
27 |
|
28 | int main(int argc, char *argv[]) |
29 | { |
30 | // Print boilerplate copyright output |
31 | for (const char *line : ZYDECO_TERMOUT) |
32 | { |
33 | std::cout << line << std::endl; |
34 | } |
35 |
|
36 | // Runtime environment setup |
37 | std::set_terminate((std::terminate_handler)on_terminate); |
38 |
|
39 | // Initialize logging |
40 | Logger::InitializeLogging(Logger::VERBOSE, &std::cout); |
41 | LOGGER.Log(Logger::INFO, "Logging initialized"); |
42 |
|
43 | // Initialize SDL environment |
44 | LOGGER.Log(Logger::INFO, "Initializing SDL..."); |
45 | SDL_CallErrorReturningFunction(SDL_Init, SDL_INIT_VIDEO | SDL_INIT_EVENTS); |
46 | LOGGER.Log(Logger::INFO, "SDL initialized"); |
47 |
|
48 | // Create subsystems |
49 | LOGGER.Log(Logger::INFO, "Creating subsystems..."); |
50 | EventHandlerSDL2 sdl_event_handler {}; |
51 | WindowSDL2 sdl_window {"Zydeco", SDL_WINDOW_MAXIMIZED | SDL_WINDOW_RESIZABLE}; |
52 | |
53 | // Load OpenGL |
54 | LOGGER.Log(Logger::INFO, "Loading OpenGL with GL3W..."); |
55 |
|
56 | int gl3wRes = gl3wInit(); |
57 | if (gl3wRes != 0) |
58 | { |
59 | ZydecoFault("gl3wInit failed ({})", gl3wRes); |
60 | } |
61 |
|
62 | if (!gl3wIsSupported(GL_VERSION_MAJOR, GL_VERSION_MINOR)) |
63 | { |
64 | ZydecoFault("OpenGL/GL3W {}.{} not supported", GL_VERSION_MAJOR, GL_VERSION_MINOR); |
65 | } |
66 |
|
67 | LOGGER.Log(Logger::DEBUG, "OpenGL {}, GLSL {}", glGetString(GL_VERSION), glGetString(GL_SHADING_LANGUAGE_VERSION)); |
68 |
|
69 | LOGGER.Log(Logger::INFO, "OpenGL loaded with GL3W"); |
70 |
|
71 | LOGGER.Log(Logger::INFO, "Subsystems created"); |
72 |
|
73 | // Create engine |
74 | LOGGER.Log(Logger::INFO, "Creating engine..."); |
75 | Engine engine {sdl_event_handler, sdl_window}; |
76 | LOGGER.Log(Logger::INFO, "Engine created"); |
77 |
|
78 | // Enter loop |
79 | LOGGER.Log(Logger::INFO, "Entering engine loop"); |
80 | engine.Execute(); |
81 |
|
82 | // Loop returned |
83 | LOGGER.Log(Logger::INFO, "Exiting engine loop"); |
84 |
|
85 | return 0; |
86 | } |
87 |
|