Nimbin2git.christianimmanuel.de / Games / strichmaennchen / platform.c

strichmaennchen git · main

git clone https://git.christianimmanuel.de/games/strichmaennchen.gitwget https://git.christianimmanuel.de/games/strichmaennchen/archive/strichmaennchen.tar.gz
platform.c 1.8 KB · 61 lines raw
#include <stdio.h>

#include "platform.h"
#include "glfuncs.h"


// ----------------------
// Globals (temporary, later modularize)
// ----------------------


bool Platform_init(Renderer* renderer) {
    if (!SDL_Init(SDL_INIT_VIDEO)) {
        SDL_Log("SDL init failed: %s", SDL_GetError());
        return false;
    }

    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);
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);

    renderer->window = SDL_CreateWindow("Game",
                                       renderer->width, renderer->height,
                                       SDL_WINDOW_OPENGL);
    if (!renderer->window) {
        SDL_Log("Window creation failed: %s", SDL_GetError());
        return false;
    }

    SDL_SetWindowResizable(renderer->window, true);
    SDL_SetWindowRelativeMouseMode(renderer->window, true);
    SDL_CaptureMouse(true);

    renderer->gl_context = SDL_GL_CreateContext(renderer->window);
    if (!renderer->gl_context) {
        SDL_Log("GL context creation failed: %s", SDL_GetError());
        return false;
    }

    if (!SDL_GL_MakeCurrent(renderer->window, renderer->gl_context)) {
        SDL_Log("SDL_GL_MakeCurrent failed: %s", SDL_GetError());
        return false;
    }

    Glfuncs_load();
    if (!glCreateShader) {
        SDL_Log("glCreateShader not loaded!");
        return false;
    }
    SDL_Log("OpenGL version: %s", glGetString(GL_VERSION));

    return true;
}

void Platform_shutdown(Renderer* renderer) {
    if (renderer->gl_context) SDL_GL_DestroyContext(renderer->gl_context);
    if (renderer->window) SDL_DestroyWindow(renderer->window);
    SDL_Quit();
}