#include "includes.h" #include "main.h" #include "shader.h" #include "object.h" #include "cube.h" inline void handleEvents(Game* game) { SDL_Event event; SDL_PollEvent(&event); switch (event.type) { case SDL_EVENT_QUIT: game->running = 0; break; } } int initGame(Game* game) { game->window_width = 600; game->window_height = 400; game->window = SDL_CreateWindow( "OpenGL Test", game->window_width, game->window_height, SDL_WINDOW_OPENGL ); glm_vec3_zero(game->player.pos); // OpenGL stuff starts here 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); //VSYNC: // SDL_SetWindowSurfaceVSync(game->window, SDL_WINDOW_SURFACE_VSYNC_DISABLED); // SDL_GL_SetSwapInterval(0); game->running = 1; int version = gladLoadGL((GLADloadfunc)SDL_GL_GetProcAddress); if (version == 0) { return 1; } glEnable(GL_DEPTH_TEST); return 0; } int killGame(Game* game) { SDL_GL_DestroyContext(game->gpu); SDL_DestroyWindow(game->window); return 0; } void setupProjection(float fov, Game* game) { glm_perspective(fov, ((float)game->window_width)/((float)game->window_height), 0.1f, 40.0f, game->projection); glUniformMatrix4fv(game->projection_loc, 1, GL_FALSE, (float*)game->projection); } int main() { Game game; initGame(&game); unsigned int vertex_shader, fragment_shader, shader_program; vertex_shader = loadShader("../src/shaders/test.vert", GL_VERTEX_SHADER); fragment_shader = loadShader("../src/shaders/test.frag", GL_FRAGMENT_SHADER); shader_program = shaderProgram(vertex_shader, fragment_shader); glClearColor(0.0f, 0.25f, 0.5f, 1.0f); // TODO: texture loading, will add when sdl 3.4 // // float tex_coords[] = { // 1.0f, 1.0f, // 1.0f, 0.0f, // 0.0f, 0.0f, // 0.0f, 1.0f, // }; // // glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); // glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); // // float border_color[] = {1.0f, 1.0f, 1.0f, 1.0f}; // glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, border_color); // // glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); // glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); ViewModel cubeModel = createCube(); ViewModel pengerModel = loadViewModel("../assets/objects/penger.obj"); Object myCube; Object penger; createObject(&myCube, &cubeModel); createObject(&penger, &pengerModel); moveObject(&penger, (vec3){0.0f, -0.5f, -1.0f}); scaleObject(&penger, (vec3){1.0f, 1.0f, 1.0f}); game.transform_loc = glGetUniformLocation(shader_program, "model"); game.projection_loc = glGetUniformLocation(shader_program, "projection"); // Enable/disable wireframe rendering: glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glUseProgram(shader_program); setupProjection(90.0f, &game); bindViewModel(&pengerModel); while (game.running) { for (int i=0;i<628;i++) { glClear(GL_COLOR_BUFFER_BIT); glClear(GL_DEPTH_BUFFER_BIT); rotateObject(&penger, (float)i/100, (vec3){0.0f, 1.0f, 0.0f}); drawObject(&game, &penger); SDL_GL_SwapWindow(game.window); handleEvents(&game); } } killViewModel(&pengerModel); killViewModel(&cubeModel); glDeleteShader(vertex_shader); glDeleteShader(fragment_shader); killGame(&game); return 0; }