diff options
Diffstat (limited to 'src/engine/M_game.c')
| -rw-r--r-- | src/engine/M_game.c | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/src/engine/M_game.c b/src/engine/M_game.c new file mode 100644 index 0000000..3c76d96 --- /dev/null +++ b/src/engine/M_game.c @@ -0,0 +1,66 @@ +#include "M_game.h" + +int M_initGame(M_Game *game, const char *window_title) +{ + game->window_width = 1280; + game->window_height = 720; + + SDL_Init( + SDL_INIT_VIDEO + ); + + game->window = SDL_CreateWindow( + window_title, + game->window_width, + game->window_height, + SDL_WINDOW_OPENGL + ); + M_setupProjection(90.0f, ((float)game->window_width)/((float)game->window_height), &game->render_info); + + game->block_atlas = M_createBlockAtlas(); + + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); + game->gpu = SDL_GL_CreateContext(game->window); + + SDL_GL_MakeCurrent(game->window, game->gpu); + + game->running = 1; + + int version = gladLoadGL((GLADloadfunc)SDL_GL_GetProcAddress); + if (version == 0) { + return 1; + } + + game->event_handler = SDL_CreateThread(M_handleEvents, "eventHandler", (void*)game); + + glClearColor(0.0f, 0.25f, 0.5f, 1.0f); + + glEnable(GL_DEPTH_TEST); + + return 0; +} + +int M_killGame(M_Game *game) +{ + SDL_WaitThread(game->event_handler, NULL); + SDL_Quit(); + return 0; +} + +int SDLCALL M_handleEvents(void* arg) +{ + M_Game *game = arg; + SDL_Event event; + while (game->running) { + SDL_PollEvent(&event); + switch (event.type) { + case SDL_EVENT_QUIT: + game->running = 0; + break; + } + SDL_Delay(1); + } + return 0; +} |
