a-game

2D platformer written from scratch.
Log | Files | Refs | README | LICENSE

commit 6467e01416a1777a70ee92f74aaa9d786a1d7eed
parent f73cd1956673192d07f8570b27c0a3988a2d8f8a
Author: Amin Mesbah <dev@aminmesbah.com>
Date:   Mon, 28 May 2018 15:02:40 -0700

Pull game setup out of platform layer

Diffstat:
Msrc/game.c | 47+++++++++++++++++++++++++++++++++++++++++++----
Msrc/game.h | 12+++++++++++-
Msrc/platform_linux.c | 36++++--------------------------------
3 files changed, 58 insertions(+), 37 deletions(-)

diff --git a/src/game.c b/src/game.c @@ -1,14 +1,53 @@ #include "game.h" -#include <glad/glad.h> -void game_update_and_render(GLuint vao_id, struct Shader *triangle_shader) + +void game_init(struct GameState *game_state) +{ + GLfloat triangle_vertices[] = { + // positions // colors + -0.5f, -0.5f, 1.0f, 0.0f, 0.0f, + 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.5f, 0.0f, 0.0f, 1.0f, + }; + + GLuint vbo_id; + GLuint vao_id; + glGenVertexArrays(1, &vao_id); + glGenBuffers(1, &vbo_id); + + glBindVertexArray(vao_id); + glBindBuffer(GL_ARRAY_BUFFER, vbo_id); + glBufferData(GL_ARRAY_BUFFER, sizeof(triangle_vertices), triangle_vertices, GL_STATIC_DRAW); + + // positions + glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(*triangle_vertices), (GLvoid*)0); + glEnableVertexAttribArray(0); + + // colors + glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(*triangle_vertices), (GLvoid*)(2 * sizeof(*triangle_vertices))); + glEnableVertexAttribArray(1); + glBindVertexArray(0); + + game_state->vao_id = vao_id; + game_state->triangle_shader = shader_compile("shader/triangle_v.glsl", "shader/triangle_f.glsl"); +} + + +void game_update_and_render(struct GameState *game_state) { glClearColor(0.1f, 0.1f, 0.1f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); - glUseProgram(triangle_shader->program); + glUseProgram(game_state->triangle_shader.program); - glBindVertexArray(vao_id); + glBindVertexArray(game_state->vao_id); glDrawArrays(GL_TRIANGLES, 0, 3); glBindVertexArray(0); } + + +void game_deinit(struct GameState *game_state) +{ + glDeleteVertexArrays(1, &game_state->vao_id); + glDeleteBuffers(1, &game_state->vbo_id); +} diff --git a/src/game.h b/src/game.h @@ -1,8 +1,18 @@ #ifndef GAME_H #define GAME_H +#include "glad/glad.h" #include "shader.h" -void game_update_and_render(GLuint vao_id, struct Shader *triangle_shader); +struct GameState +{ + GLuint vao_id; + GLuint vbo_id; + struct Shader triangle_shader; +}; + +void game_init(struct GameState *game_state); +void game_update_and_render(struct GameState *game_state); +void game_deinit(struct GameState *game_state); #endif diff --git a/src/platform_linux.c b/src/platform_linux.c @@ -3,8 +3,6 @@ #include <glad/glad.h> #include <GLFW/glfw3.h> -#include "shader.h" -#include "glmth.h" #include "game.h" @@ -52,43 +50,17 @@ int main(void) return -1; } - struct Shader triangle_shader = shader_compile("shader/triangle_v.glsl", "shader/triangle_f.glsl"); - - GLfloat triangle_vertices[] = { - // positions // colors - -0.5f, -0.5f, 1.0f, 0.0f, 0.0f, - 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, - 0.0f, 0.5f, 0.0f, 0.0f, 1.0f, - }; - - GLuint vbo_id; - GLuint vao_id; - glGenVertexArrays(1, &vao_id); - glGenBuffers(1, &vbo_id); - - glBindVertexArray(vao_id); - glBindBuffer(GL_ARRAY_BUFFER, vbo_id); - glBufferData(GL_ARRAY_BUFFER, sizeof(triangle_vertices), triangle_vertices, GL_STATIC_DRAW); - - // positions - // TODO: make sizeof dereference pointer - glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), (GLvoid*)0); - glEnableVertexAttribArray(0); - - // colors - glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(GLfloat), (GLvoid*)(2 * sizeof(GLfloat))); - glEnableVertexAttribArray(1); - glBindVertexArray(0); + struct GameState game_state = {0}; + game_init(&game_state); while (!glfwWindowShouldClose(window)) { - game_update_and_render(vao_id, &triangle_shader); + game_update_and_render(&game_state); glfwSwapBuffers(window); glfwPollEvents(); } - glDeleteVertexArrays(1, &vao_id); - glDeleteBuffers(1, &vbo_id); + game_deinit(&game_state); glfwDestroyWindow(window); glfwTerminate();