summaryrefslogtreecommitdiff
path: root/src/engine/M_game.c
diff options
context:
space:
mode:
authorDrNuget <drnuget@outlook.com>2026-01-07 04:58:54 +0200
committerDrNuget <drnuget@outlook.com>2026-01-07 04:58:54 +0200
commit7f3aa1cff755d21d972457b05c140cf465b9fa19 (patch)
tree748b74a65d71ead9d0d7ade533074c5a643076d7 /src/engine/M_game.c
parent67592a66dd9bcc4d79d23624a9abfd8f2c6e92ff (diff)
downloadmnm-7f3aa1cff755d21d972457b05c140cf465b9fa19.tar.gz
some basic 3D rendering and the base for chunk generation etc.
Diffstat (limited to 'src/engine/M_game.c')
-rw-r--r--src/engine/M_game.c66
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;
+}