summaryrefslogtreecommitdiff
path: root/src/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.c')
-rw-r--r--src/main.c152
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;
+}