1 #ifndef SIMPLE_RENDERER_H_ 2 #define SIMPLE_RENDERER_H_ 3 4 #include <assert.h> 5 6 #define GLEW_STATIC 7 #include <GL/glew.h> 8 9 #define GL_GLEXT_PROTOTYPES 10 #include <SDL2/SDL_opengl.h> 11 12 #include "./la.h" 13 14 typedef enum { 15 UNIFORM_SLOT_TIME = 0, 16 UNIFORM_SLOT_RESOLUTION, 17 UNIFORM_SLOT_CAMERA_POS, 18 UNIFORM_SLOT_CAMERA_SCALE, 19 COUNT_UNIFORM_SLOTS, 20 } Uniform_Slot; 21 22 typedef enum { 23 SIMPLE_VERTEX_ATTR_POSITION = 0, 24 SIMPLE_VERTEX_ATTR_COLOR, 25 SIMPLE_VERTEX_ATTR_UV, 26 } Simple_Vertex_Attr; 27 28 typedef struct { 29 Vec2f position; 30 Vec4f color; 31 Vec2f uv; 32 } Simple_Vertex; 33 34 #define SIMPLE_VERTICIES_CAP (3*640*1000) 35 36 static_assert(SIMPLE_VERTICIES_CAP%3 == 0, "Simple renderer vertex capacity must be divisible by 3. We are rendring triangles after all."); 37 38 typedef enum { 39 SHADER_FOR_COLOR = 0, 40 SHADER_FOR_IMAGE, 41 SHADER_FOR_TEXT, 42 SHADER_FOR_EPICNESS, // This is the one that does that cool rainbowish animation 43 COUNT_SIMPLE_SHADERS, 44 } Simple_Shader; 45 46 typedef struct { 47 GLuint vao; 48 GLuint vbo; 49 GLuint programs[COUNT_SIMPLE_SHADERS]; 50 Simple_Shader current_shader; 51 52 GLint uniforms[COUNT_UNIFORM_SLOTS]; 53 Simple_Vertex verticies[SIMPLE_VERTICIES_CAP]; 54 size_t verticies_count; 55 56 Vec2f resolution; 57 float time; 58 59 Vec2f camera_pos; 60 float camera_scale; 61 float camera_scale_vel; 62 Vec2f camera_vel; 63 } Simple_Renderer; 64 65 void simple_renderer_init(Simple_Renderer *sr); 66 67 void simple_renderer_reload_shaders(Simple_Renderer *sr); 68 69 void simple_renderer_vertex(Simple_Renderer *sr, 70 Vec2f p, Vec4f c, Vec2f uv); 71 void simple_renderer_set_shader(Simple_Renderer *sr, Simple_Shader shader); 72 void simple_renderer_triangle(Simple_Renderer *sr, 73 Vec2f p0, Vec2f p1, Vec2f p2, 74 Vec4f c0, Vec4f c1, Vec4f c2, 75 Vec2f uv0, Vec2f uv1, Vec2f uv2); 76 void simple_renderer_quad(Simple_Renderer *sr, 77 Vec2f p0, Vec2f p1, Vec2f p2, Vec2f p3, 78 Vec4f c0, Vec4f c1, Vec4f c2, Vec4f c3, 79 Vec2f uv0, Vec2f uv1, Vec2f uv2, Vec2f uv3); 80 void simple_renderer_solid_rect(Simple_Renderer *sr, Vec2f p, Vec2f s, Vec4f c); 81 void simple_renderer_image_rect(Simple_Renderer *sr, Vec2f p, Vec2f s, Vec2f uvp, Vec2f uvs, Vec4f c); 82 void simple_renderer_flush(Simple_Renderer *sr); 83 void simple_renderer_sync(Simple_Renderer *sr); 84 void simple_renderer_draw(Simple_Renderer *sr); 85 86 #endif // SIMPLE_RENDERER_H_
