|
|
|
|
@ -25,6 +25,7 @@ struct simple_render_object
|
|
|
|
|
GLuint vertex_buffer_id; |
|
|
|
|
GLuint vertex_color_buffer_id; |
|
|
|
|
uint vertex_count; |
|
|
|
|
GLenum draw_mode; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
struct render_objects |
|
|
|
|
@ -42,6 +43,7 @@ void drawDefault(render_objects* r_objs,
|
|
|
|
|
camera& cam, |
|
|
|
|
shader_wrapper sw, |
|
|
|
|
light_group* lights); |
|
|
|
|
inline void enableGLFloatBuffer(uint buffer_id, uint location); |
|
|
|
|
bool initGLFloatBuffer(glm::vec3* buffer, uint count, GLuint& buffer_id); |
|
|
|
|
bool initGLIndexBuffer(uint* buffer, uint num_indices, GLuint& buffer_id); |
|
|
|
|
bool initGLTexture(const util_image image, GLuint& tex_id); |
|
|
|
|
@ -49,7 +51,6 @@ bool loadMeshIntoGL(default_render_object* ro_out, mesh_info* mi_in);
|
|
|
|
|
inline void updateMatrices(default_shader_program* shader, |
|
|
|
|
camera& cam, |
|
|
|
|
glm::mat4 node_xform); |
|
|
|
|
inline void enableGLFloatBuffer(uint buffer_id, uint location); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// interface
|
|
|
|
|
@ -77,6 +78,34 @@ roInitModel(mesh_group mg)
|
|
|
|
|
return r_objs; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
render_objects* |
|
|
|
|
roInitSimpleMesh(simple_mesh& mesh_in, GLenum draw_mode) |
|
|
|
|
{ |
|
|
|
|
render_objects* r_objs = UTIL_ALLOC(1, render_objects); |
|
|
|
|
r_objs->count = 1; |
|
|
|
|
r_objs->mesh_type = SIMPLE_MESH; |
|
|
|
|
r_objs->objects = UTIL_ALLOC(1, simple_render_object); |
|
|
|
|
|
|
|
|
|
simple_render_object* objects = (simple_render_object*) r_objs->objects; |
|
|
|
|
|
|
|
|
|
if (initGLFloatBuffer(mesh_in.vertices, |
|
|
|
|
mesh_in.num_vertices, |
|
|
|
|
objects->vertex_buffer_id) && |
|
|
|
|
initGLFloatBuffer(mesh_in.vert_colors, |
|
|
|
|
mesh_in.num_vertices, |
|
|
|
|
objects->vertex_color_buffer_id)) |
|
|
|
|
{ |
|
|
|
|
objects->model_transform = mesh_in.model_transform; |
|
|
|
|
objects->vertex_count = mesh_in.num_vertices; |
|
|
|
|
objects->draw_mode = draw_mode; |
|
|
|
|
return r_objs; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
LOG(Error) << "Failed to initialize render_object\n"; |
|
|
|
|
roFree(r_objs); |
|
|
|
|
return nullptr; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
roFree(render_objects* r_objs) |
|
|
|
|
{ |
|
|
|
|
@ -99,37 +128,6 @@ roFree(render_objects* r_objs)
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
simple_render_object* |
|
|
|
|
roInitSimpleMesh(simple_mesh& mesh_in) |
|
|
|
|
{ |
|
|
|
|
// TODO: switch on mesh type here
|
|
|
|
|
simple_render_object* ro_out = UTIL_ALLOC(1, simple_render_object); |
|
|
|
|
|
|
|
|
|
if (initGLFloatBuffer(mesh_in.vertices, |
|
|
|
|
mesh_in.num_vertices, |
|
|
|
|
ro_out->vertex_buffer_id) && |
|
|
|
|
initGLFloatBuffer(mesh_in.vert_colors, |
|
|
|
|
mesh_in.num_vertices, |
|
|
|
|
ro_out->vertex_color_buffer_id)) |
|
|
|
|
{ |
|
|
|
|
ro_out->model_transform = mesh_in.model_transform; |
|
|
|
|
ro_out->vertex_count = mesh_in.num_vertices; |
|
|
|
|
return ro_out; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
LOG(Error) << "Failed to initialize render_object\n"; |
|
|
|
|
roFreeSimple(ro_out); |
|
|
|
|
return nullptr; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
roFreeSimple(simple_render_object* ro) |
|
|
|
|
{ |
|
|
|
|
glDeleteBuffers(1, &ro->vertex_buffer_id); |
|
|
|
|
glDeleteBuffers(1, &ro->vertex_color_buffer_id); |
|
|
|
|
utilSafeFree(ro); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
roTranslate(render_objects* r_objs, glm::mat4 xform) |
|
|
|
|
{ |
|
|
|
|
@ -167,23 +165,6 @@ roDraw(render_objects* r_objs,
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
roDrawSimple(simple_render_object* ro, |
|
|
|
|
camera& cam, |
|
|
|
|
simple_shader_program& shader, |
|
|
|
|
GLenum draw_mode) |
|
|
|
|
{ |
|
|
|
|
glUseProgram(shader.program_id); |
|
|
|
|
cam.MVP = cam.projection * cam.view * ro->model_transform; |
|
|
|
|
glUniformMatrix4fv(shader.MVP_id, 1, GL_FALSE, &cam.MVP[0][0]); |
|
|
|
|
enableGLFloatBuffer(ro->vertex_buffer_id, 0); |
|
|
|
|
enableGLFloatBuffer(ro->vertex_color_buffer_id, 1); |
|
|
|
|
glDrawArrays(draw_mode, 0, ro->vertex_count); |
|
|
|
|
glDisableVertexAttribArray(0); |
|
|
|
|
glDisableVertexAttribArray(1); |
|
|
|
|
glUseProgram(0); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// internal
|
|
|
|
|
|
|
|
|
|
@ -193,7 +174,18 @@ drawSimple(render_objects* r_objs,
|
|
|
|
|
shader_wrapper sw, |
|
|
|
|
light_group* lights) |
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
simple_render_object* ro = (simple_render_object*) r_objs->objects; |
|
|
|
|
simple_shader_program* shader = |
|
|
|
|
(simple_shader_program*) sw.simple_shader; |
|
|
|
|
glUseProgram(shader->program_id); |
|
|
|
|
cam.MVP = cam.projection * cam.view * ro->model_transform; |
|
|
|
|
glUniformMatrix4fv(shader->MVP_id, 1, GL_FALSE, &cam.MVP[0][0]); |
|
|
|
|
enableGLFloatBuffer(ro->vertex_buffer_id, 0); |
|
|
|
|
enableGLFloatBuffer(ro->vertex_color_buffer_id, 1); |
|
|
|
|
glDrawArrays(ro->draw_mode, 0, ro->vertex_count); |
|
|
|
|
glDisableVertexAttribArray(0); |
|
|
|
|
glDisableVertexAttribArray(1); |
|
|
|
|
glUseProgram(0); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
|