|
|
|
|
@ -35,11 +35,13 @@ struct render_objects
|
|
|
|
|
mesh_t mesh_type; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
void drawSimple(render_objects* r_objs, |
|
|
|
|
void drawDefault(render_objects* r_objs, |
|
|
|
|
glm::mat4 world_transform, |
|
|
|
|
camera& cam, |
|
|
|
|
shader_wrapper sw, |
|
|
|
|
light_group* lights); |
|
|
|
|
void drawDefault(render_objects* r_objs, |
|
|
|
|
void drawSimple(render_objects* r_objs, |
|
|
|
|
glm::mat4 world_transform, |
|
|
|
|
camera& cam, |
|
|
|
|
shader_wrapper sw, |
|
|
|
|
light_group* lights); |
|
|
|
|
@ -128,68 +130,26 @@ roFree(render_objects* r_objs)
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
roTranslate(render_objects* r_objs, glm::mat4 xform) |
|
|
|
|
{ |
|
|
|
|
if (r_objs->mesh_type == SIMPLE_MESH) { |
|
|
|
|
//
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
else if (r_objs->mesh_type == DEFAULT_MESHES) { |
|
|
|
|
//
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
roScale(render_object* ro, glm::mat4 xform) |
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
roRotate(render_object* ro, glm::mat4 xform) |
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// TODO: update projection * view matrices once per frame here
|
|
|
|
|
void |
|
|
|
|
roDraw(render_objects* r_objs, |
|
|
|
|
glm::mat4 world_transform, |
|
|
|
|
camera& cam, |
|
|
|
|
shader_wrapper sw, |
|
|
|
|
light_group* lights) |
|
|
|
|
{ |
|
|
|
|
if (r_objs->mesh_type == SIMPLE_MESH) { |
|
|
|
|
drawSimple(r_objs, cam, sw, lights); |
|
|
|
|
} else if (r_objs->mesh_type == DEFAULT_MESHES) { |
|
|
|
|
drawDefault(r_objs, cam, sw, lights); |
|
|
|
|
} |
|
|
|
|
if (r_objs->mesh_type == SIMPLE_MESH) |
|
|
|
|
drawSimple(r_objs, world_transform, cam, sw, lights); |
|
|
|
|
else if (r_objs->mesh_type == DEFAULT_MESHES) |
|
|
|
|
drawDefault(r_objs, world_transform, cam, sw, lights); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// internal
|
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
drawSimple(render_objects* r_objs, |
|
|
|
|
camera& cam, |
|
|
|
|
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 |
|
|
|
|
drawDefault(render_objects* r_objs, |
|
|
|
|
glm::mat4 world_transform, |
|
|
|
|
camera& cam, |
|
|
|
|
shader_wrapper sw, |
|
|
|
|
light_group* lights) |
|
|
|
|
@ -223,6 +183,37 @@ drawDefault(render_objects* r_objs,
|
|
|
|
|
glUseProgram(0); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
drawSimple(render_objects* r_objs, |
|
|
|
|
glm::mat4 world_transform, |
|
|
|
|
camera& cam, |
|
|
|
|
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->world_transform_id, 1, GL_FALSE, &world_transform[0][0]); |
|
|
|
|
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); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline void |
|
|
|
|
enableGLFloatBuffer(uint buffer_id, uint location) |
|
|
|
|
{ |
|
|
|
|
glEnableVertexAttribArray(location); |
|
|
|
|
glBindBuffer(GL_ARRAY_BUFFER, buffer_id); |
|
|
|
|
glVertexAttribPointer(location, 3, GL_FLOAT, GL_FALSE, 0, (void*) 0); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool |
|
|
|
|
initGLFloatBuffer(glm::vec3* buffer, uint count, GLuint& buffer_id) |
|
|
|
|
{ |
|
|
|
|
@ -310,11 +301,3 @@ updateMatrices(default_shader_program* shader,
|
|
|
|
|
&normal_matrix[0][0]); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
inline void |
|
|
|
|
enableGLFloatBuffer(uint buffer_id, uint location) |
|
|
|
|
{ |
|
|
|
|
glEnableVertexAttribArray(location); |
|
|
|
|
glBindBuffer(GL_ARRAY_BUFFER, buffer_id); |
|
|
|
|
glVertexAttribPointer(location, 3, GL_FLOAT, GL_FALSE, 0, (void*) 0); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|