You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
96 lines
2.2 KiB
96 lines
2.2 KiB
|
|
#pragma once |
|
|
|
#include <GL/glew.h> |
|
#include <glm/glm.hpp> |
|
|
|
#include "util.h" |
|
|
|
|
|
// TODO: can these structs be used as opaque pointers? |
|
struct gl_buffer |
|
{ |
|
GLuint buffer_id; |
|
uint count; // NOTE: number of elements in buffer |
|
uint max_count; // NOTE: maxium number of elements buffer can fit |
|
GLfloat* buffer; |
|
}; |
|
|
|
struct gl_index_buffer |
|
{ |
|
GLuint buffer_id; |
|
uint count; // NOTE: number of elements in buffer |
|
uint max_count; // NOTE: maxium number of elements buffer can fit |
|
uint* buffer; |
|
}; |
|
|
|
struct render_object |
|
{ |
|
// TODO: can remove these once we're using the global color palatte for all textures |
|
bool use_texture; |
|
GLuint tex_id; |
|
|
|
gl_buffer vertex_buffer; |
|
gl_buffer normal_buffer; |
|
gl_buffer uv_buffer; |
|
gl_index_buffer index_buffer; |
|
}; |
|
|
|
struct rg_shader_program |
|
{ |
|
GLuint program_id; |
|
|
|
GLuint model_matrix_id; |
|
GLuint view_matrix_id; |
|
GLuint projection_matrix_id; |
|
GLuint normal_matrix_id; |
|
|
|
GLuint vertex_array_id; |
|
GLuint sampler_id; |
|
GLuint num_lights_id; |
|
}; |
|
|
|
struct render_group |
|
{ |
|
uint num_objects; |
|
render_object** render_objects; |
|
rg_shader_program shader; |
|
bool use_normals; |
|
bool draw_indexed; |
|
GLenum draw_mode = GL_TRIANGLES; |
|
char name[64]; |
|
}; |
|
|
|
// TODO: maybe pull out to seperate header |
|
struct rg_point_light |
|
{ |
|
uint light_ID; |
|
glm::vec3 position; |
|
glm::vec3 color; |
|
float intensity; |
|
}; |
|
|
|
render_object * rgAllocateRenderObject(uint buffer_len, uint index_len = 0); |
|
|
|
// 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 rgInitGLTexture(GLuint& tex_id, util_image image); |
|
|
|
void rgInitGLFloatBuffer(gl_buffer* buffer, GLenum usage, GLenum target); |
|
|
|
void rgInitGLIndexBuffer(gl_index_buffer* index_buffer, GLenum usage, GLenum target); |
|
|
|
void rgUpdateGLBuffer(gl_buffer& buffer); |
|
|
|
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); |
|
|
|
void rgFree(render_group* rg); |
|
|
|
|