diff options
-rw-r--r-- | Makefile | 6 | ||||
-rw-r--r-- | graph.c | 50 | ||||
-rw-r--r-- | include/graph.h | 7 | ||||
-rw-r--r-- | mino.c | 1 |
4 files changed, 55 insertions, 9 deletions
@@ -1,8 +1,8 @@ .POSIX: -CC := clang -CFLAGS := -std=c11 -Wall -Wextra -Wshadow -Iinclude $(shell sdl2-config --cflags) +CC := clang +CFLAGS := -std=c11 -Wall -Wextra -Wshadow -Iinclude $(shell sdl2-config --cflags) LDFLAGS := -LDLIBS := -ldl $(shell sdl2-config --libs) +LDLIBS := -ldl $(shell sdl2-config --libs) all: mino mino: glad.o graph.o mino.o mino.o: mino.c include/mino.h @@ -6,20 +6,22 @@ #include"graph.h" _ SDL_Window*win; -_ SDL_GLContext ctx; _ U32 win_w=1280; _ U32 win_h=720; +_ SDL_GLContext ctx; + _ V on_err(IM C*d){die("Could not %s: %s\n",d,SDL_GetError());} V graph_init(V){SDL_version sdl_vh,sdl_vl; Q(SDL_Init(SDL_INIT_VIDEO),on_err("init sdl2")) 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); - N(win=SDL_CreateWindow("mino",SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,win_w,win_h,SDL_WINDOW_RESIZABLE|SDL_WINDOW_OPENGL),on_err("create window")) + SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK,SDL_GL_CONTEXT_PROFILE_CORE), + SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,1); + N(win=SDL_CreateWindow("mino",SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,win_w,win_h,SDL_WINDOW_OPENGL),on_err("create window")) N(ctx=SDL_GL_CreateContext(win),on_err("create OpenGL context")) - N(gladLoadGLLoader((GLADloadproc)SDL_GL_GetProcAddress),on_err("load GL")) - SDL_GL_SetSwapInterval(-1); + N(gladLoadGLLoader(SDL_GL_GetProcAddress),on_err("load GL")) + SDL_GL_SetSwapInterval(1); SDL_VERSION(&sdl_vh)SDL_GetVersion(&sdl_vl); fprintf(stderr, @@ -34,3 +36,41 @@ V graph_init(V){SDL_version sdl_vh,sdl_vl; glGetString(GL_VERSION),glGetString(GL_VENDOR),glGetString(GL_RENDERER));} V graph_deinit(V){SDL_GL_DeleteContext(ctx),SDL_DestroyWindow(win),SDL_Quit();} +V graph_events(V){SDL_Event ev;WH(SDL_PollEvent(&ev),Q(SDL_QUIT==ev.type,exit(0)))} +V graph_before(V){glClearColor(1.0,0.75,0.8,1.0),glClear(GL_COLOR_BUFFER_BIT);} +V graph_after(V){SDL_GL_SwapWindow(win);} + +V graph_triangle(V){ + IM C*vert_shader_src="#version 330 core\n" + "layout(location=0)in vec3 pos;void main(){gl_Position=vec4(pos.x,pos.y,pos.z,1.0);}"; + U32 vert_shader=glCreateShader(GL_VERTEX_SHADER); + glShaderSource(vert_shader,1,&vert_shader_src,NULL),glCompileShader(vert_shader); + I success; + C info_log[512]; + glGetShaderiv(vert_shader,GL_COMPILE_STATUS,&success); + N(success,die("error compiling vert shader")) + + IM C*frag_shader_src = "#version 330 core\n" + "out vec4 Colour;void main(){Colour=vec4(1.0, 0.5, 0.2, 1.0);}"; + U32 frag_shader=glCreateShader(GL_FRAGMENT_SHADER); + glShaderSource(frag_shader,1,&frag_shader_src,NULL),glCompileShader(frag_shader); + glGetShaderiv(vert_shader,GL_COMPILE_STATUS,&success); + N(success,die("error compiling frag shader")) + + U32 shader_program=glCreateProgram(); + glAttachShader(shader_program,vert_shader),glAttachShader(shader_program,frag_shader), + glLinkProgram(shader_program);//glDeleteShader(vert_shader),glDeleteShader(frag_shader); + glGetProgramiv(shader_program,GL_LINK_STATUS,&success); + N(success,glGetProgramInfoLog(shader_program,512,0,info_log),die("error linking: %s")) + + IM F32 verts[]={ + -0.5,-0.5,0.0, + 0.5,-0.5,0.0, + 0.0, 0.5,0.0}; + U32 vbo,vao; + glGenBuffers(1,&vbo), glBindBuffer(GL_ARRAY_BUFFER,vbo), + glGenVertexArrays(1,&vao), glBindVertexArray(vao); + glBufferData(GL_ARRAY_BUFFER,SZ verts,verts,GL_STATIC_DRAW), + glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,3*SZ verts[0],0), + glEnableVertexAttribArray(0),glUseProgram(shader_program), + glBindVertexArray(vao),glDrawArrays(GL_TRIANGLES,0,3);} diff --git a/include/graph.h b/include/graph.h index 59c0655..b2a9ffa 100644 --- a/include/graph.h +++ b/include/graph.h @@ -1,6 +1,11 @@ #ifndef MINO_GRAPH_H #define MINO_GRAPH_H X V graph_init(V); -X V graph_loop(V); X V graph_deinit(V); +X V graph_events(V); +/*actual rendering*/ +X V graph_before(V); +X V graph_after(V); +/*shapes*/ +X V graph_triangle(V); #endif @@ -11,4 +11,5 @@ V del(V*p){free(p);} I main(I ac,C**av){(V)ac,(V)av; graph_init(); atexit(graph_deinit); + WH(1,graph_events(),graph_before(),graph_triangle(),graph_after()); R 0;} |