From 763df573d8f5538c1b4aa6cad02bc90c11d81f56 Mon Sep 17 00:00:00 2001 From: Anthony Debucquoy Date: Mon, 29 May 2023 23:17:14 +0200 Subject: [PATCH] base gameoflife graph --- build.sh | 6 +- gameoflife_graph.c | 131 ++++++++++++++++++++++++++++++++++++ main.c => gameoflife_term.c | 0 shader.fs | 7 ++ shader.vs | 7 ++ 5 files changed, 150 insertions(+), 1 deletion(-) create mode 100644 gameoflife_graph.c rename main.c => gameoflife_term.c (100%) create mode 100644 shader.fs create mode 100644 shader.vs diff --git a/build.sh b/build.sh index 4aac112..755d00c 100755 --- a/build.sh +++ b/build.sh @@ -2,4 +2,8 @@ set -xe -gcc -Wall -Wextra -o main main.c +CFLAGS="-Wall -Wextra $(pkg-config --cflags sdl2 glew)" +LIBS="$(pkg-config --libs sdl2 glew)" + +# gcc -Wall -Wextra -o gameoflife_term gameoflife_term.c +gcc ${CFLAGS} -o gameoflife_graph gameoflife_graph.c ${LIBS} diff --git a/gameoflife_graph.c b/gameoflife_graph.c new file mode 100644 index 0000000..4add809 --- /dev/null +++ b/gameoflife_graph.c @@ -0,0 +1,131 @@ +#include +#include +#include +#include +#include +#include +#include + +#define FACTOR 80 +#define WIDTH ((FACTOR) * 16) +#define HEIGHT ((FACTOR) * 9) + +SDL_Event e; + +float vertices[] = { + 0.0f, 0.5f, + 0.5f, -0.5f, + -0.5f, -0.5f +}; + +char * read_file(const char* path){ + FILE* file = fopen(path, "r"); + + fseek(file, 0, SEEK_END); + int eof = ftell(file); + fseek(file, 0, SEEK_SET); + + char* file_content = malloc(eof * sizeof(char)); + fread(file_content, sizeof(char), eof, file); + fclose(file); + return file_content; +} + +GLuint CompileShader(const char* data, GLenum type){ + GLuint shader = glCreateShader(type); + glShaderSource(shader, 1, &data, NULL); + glCompileShader(shader); + + GLint status; + glGetShaderiv(shader, GL_COMPILE_STATUS, &status); + char buffer[512]; + glGetShaderInfoLog(shader, 512, NULL, buffer); + printf("%s", buffer); + + return shader; +} + +GLuint LinkShader(GLuint vertexShader, GLuint fragmentShader){ + GLuint shaderProgram = glCreateProgram(); + glAttachShader(shaderProgram, vertexShader); + glAttachShader(shaderProgram, fragmentShader); + glLinkProgram(shaderProgram); + + GLint status; + glGetProgramiv(shaderProgram, GL_LINK_STATUS, &status); + char buffer[512]; + glGetProgramInfoLog(shaderProgram, 512, NULL, buffer); + printf("%s", buffer); + + return shaderProgram; +} + +int main(void) +{ + + const char* vs = read_file("./shader.vs"); + const char* fs = read_file("./shader.fs"); + + if(SDL_Init(SDL_INIT_EVENTS | SDL_INIT_VIDEO)){ + SDL_Log("Unable to initialize SDL: %s", SDL_GetError()); + } + + SDL_Window *win; + + win = SDL_CreateWindow("Game of life", 0, 0, WIDTH, HEIGHT, SDL_WINDOW_OPENGL); + if(!win){ + SDL_Log("Unable to create Window: %s", SDL_GetError()); + } + SDL_GLContext con = SDL_GL_CreateContext(win); + if(!con){ + SDL_Log("Unable to create OpenGL Context: %s", SDL_GetError()); + } + + if(glewInit()){ + SDL_Log("SDL_INIT error"); + }; + + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); + SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2); + + GLuint vertexBuffer; + glGenBuffers(1, &vertexBuffer); + glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); + + glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); + + GLuint vertexShader = CompileShader(vs, GL_VERTEX_SHADER); + GLuint fragmentShader = CompileShader(fs, GL_FRAGMENT_SHADER); + GLuint shaderProgram = LinkShader(vertexShader, fragmentShader); + + GLint posAttrib = glGetAttribLocation(shaderProgram, "positions"); + glEnableVertexAttribArray(posAttrib); + glVertexAttribPointer(posAttrib, 2, GL_FLOAT, GL_FALSE, 0, 0); + + bool should_close = false; + while(!should_close){ + glClearColor(0, 0, 0, 1); + glClear(GL_COLOR_BUFFER_BIT); + + glDrawArrays(GL_TRIANGLES, 0, 3); + + SDL_GL_SwapWindow(win); + + while(SDL_PollEvent(&e)){ + if(e.type == SDL_QUIT) should_close = true; + if(e.type == SDL_KEYDOWN && e.key.keysym.sym == SDLK_a) should_close = true; + } + } + + glDeleteProgram(shaderProgram); + glDeleteShader(fragmentShader); + glDeleteShader(vertexShader); + + glDeleteBuffers(1, &vertexBuffer); + + SDL_GL_DeleteContext(con); + SDL_DestroyWindow(win); + SDL_Quit(); + + return 0; +} diff --git a/main.c b/gameoflife_term.c similarity index 100% rename from main.c rename to gameoflife_term.c diff --git a/shader.fs b/shader.fs new file mode 100644 index 0000000..54d7607 --- /dev/null +++ b/shader.fs @@ -0,0 +1,7 @@ +#version 330 core + +out vec4 outColor; + +void main(){ + outColor = vec4(1.0, 1.0, 1.0, 1.0); +} diff --git a/shader.vs b/shader.vs new file mode 100644 index 0000000..9a558f0 --- /dev/null +++ b/shader.vs @@ -0,0 +1,7 @@ +#version 330 core + +in vec2 positions; + +void main(){ + gl_Position = vec4(positions, 0.0, 1.0); +}