#ifndef _RENDERER_H_ #define _RENDERER_H_ #include #include #include #include #include #define UNIFORMS_COUNT 1 #define PROGRAMS_COUNT 2 #define DEFAULT_PROGRAM 0 #define NUKLEAR_PROGRAM 1 typedef int RENDERER_ERROR; #define RENDERER_ERROR_OK 0 #define RENDERER_ERROR_GLFW -1 #define RENDERER_ERROR_GLAD -2 #define ERROR_AND_QUIT(R, ...) \ ( R==RENDERER_ERROR_GLFW ? fprintf(stderr, "GLFW: %s\n", __VA_ARGS__) \ : R==RENDERER_ERROR_GLAD ? fprintf(stderr, "GLAD: %s\n", __VA_ARGS__) \ : fprintf(stderr, "%s\n", __VA_ARGS__)); exit(1) #if 0 struct nk_glfw_vertex { float position[2]; float uv[2]; nk_byte col[4]; }; #endif typedef struct { GLFWwindow *window; int width; int height; GLuint vao; GLuint vbo; GLuint ebo; mat4x4 projection; GLuint texture_color; GLuint uniforms[UNIFORMS_COUNT]; GLuint programs[PROGRAMS_COUNT]; GLint attrib_pos; GLint attrib_uv; GLint attrib_col; #if 0 /* nuklear */ struct nk_context *ctx; GLuint font_tex; struct nk_draw_null_texture tex_null; struct nk_buffer cmds; #endif } Renderer; RENDERER_ERROR renderer_init(Renderer *renderer, int width, int height); RENDERER_ERROR renderer_init_glfw(Renderer* renderer, int width, int height); void renderer_init_shaders(Renderer *renderer); void renderer_init_textures(Renderer *renderer); void renderer_init_quad(Renderer *renderer); void renderer_destroy(Renderer* renderer); void render_quad(Renderer* renderer, vec2 pos, vec2 size, vec4 color); void renderer_init_nk(Renderer* renderer); void read_shader_source(GLchar* source, const char* file_path); static const char* shader_type_as_cstr(GLuint shader); static bool compile_shader_source(const GLchar* source, GLenum shader_type, GLuint* shader); static void attach_shaders_to_program(GLuint* shaders, size_t shaders_count, GLuint program); static bool link_program(GLuint program, const char* file_path, size_t line); static void renderer_upload_atlas(Renderer* renderer, const void* image, int width, int height); #endif // _RENDERER_H_