diff options
Diffstat (limited to 'src/main.c')
| -rw-r--r-- | src/main.c | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..eb655b7 --- /dev/null +++ b/src/main.c @@ -0,0 +1,152 @@ +#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(Game* game) +{ + glm_perspective(90.0f, ((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"); + + SDL_Time time; + +// Enable/disable wireframe rendering: + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + + glUseProgram(shader_program); + + setupProjection(&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; +} |
