#pragma once #include #include "entity.h" #include "util.h" struct Entity; // TODO: can these structs be used as opaque pointers? struct gl_buffer { GLuint buffer_id = 0; size_t buffer_len = 0; // NOTE: number of elements in buffer GLfloat* buffer = nullptr; }; struct gl_index_buffer { GLuint buffer_id = 0; size_t buffer_len = 0; uint* buffer = nullptr; }; struct render_object { gl_buffer vertex_buffer; gl_buffer normal_buffer; gl_buffer color_buffer; gl_index_buffer index_buffer; }; struct rg_shader_program { GLuint program_id = 0; GLuint model_matrix_id = 0; GLuint view_matrix_id = 0; GLuint projection_matrix_id = 0; GLuint normal_matrix_id = 0; GLuint vertex_array_id = 0; GLuint num_lights_id = 0; }; struct render_group { uint num_objects = 0; render_object** render_objects = nullptr; rg_shader_program shader; bool use_normals = false; bool draw_indexed = false; GLenum draw_mode = GL_TRIANGLES; }; // TODO: maybe pull out to seperate header struct rg_point_light { uint light_ID; glm::vec3 position; glm::vec3 color; float intensity; }; // NOTE: initializes a render_group with 1 render_object allocated render_group* rgInitSingle(rg_shader_program& sp, uint vertex_buffer_len, bool use_normals = false, uint index_buffer_len = 0, GLenum draw_mode = GL_TRIANGLES); bool rgInitShaderProgram(rg_shader_program& sp, const char * vertex_code, const char * frag_code); bool rgInitEntity(Entity* e); void rgBufferData(gl_buffer* buffer, GLenum usage, GLenum target); void rgDraw(render_group* rg, glm::mat4 model_matrix, glm::mat4 view_matrix, glm::mat4 projection_matrix, rg_point_light* lights, uint num_lights, bool update_vertex_data = false, bool update_color_data = false); void rgFree(render_group* rg);