|
|
|
@ -43,6 +43,7 @@ rgInitShaderProgram(gl_render_group* rg, const char * vertex_code, const char * |
|
|
|
rg->model_matrix_id = glGetUniformLocation(rg->program_id, model_name); |
|
|
|
rg->model_matrix_id = glGetUniformLocation(rg->program_id, model_name); |
|
|
|
rg->view_matrix_id = glGetUniformLocation(rg->program_id, view_name); |
|
|
|
rg->view_matrix_id = glGetUniformLocation(rg->program_id, view_name); |
|
|
|
rg->projection_matrix_id = glGetUniformLocation(rg->program_id, projection_name); |
|
|
|
rg->projection_matrix_id = glGetUniformLocation(rg->program_id, projection_name); |
|
|
|
|
|
|
|
rg->normal_matrix_id = glGetUniformLocation(rg->program_id, "normal_matrix"); |
|
|
|
|
|
|
|
|
|
|
|
glDetachShader(rg->program_id, vertex_shader_id); |
|
|
|
glDetachShader(rg->program_id, vertex_shader_id); |
|
|
|
glDetachShader(rg->program_id, fragment_shader_id); |
|
|
|
glDetachShader(rg->program_id, fragment_shader_id); |
|
|
|
@ -73,6 +74,7 @@ rgInitShaderProgram(gl_render_group* rg, const char * vertex_code, const char * |
|
|
|
void |
|
|
|
void |
|
|
|
rgInitGLBufferObject(gl_buffer* buf_obj, uint len, GLenum usage, GLenum target, GLfloat data[]) |
|
|
|
rgInitGLBufferObject(gl_buffer* buf_obj, uint len, GLenum usage, GLenum target, GLfloat data[]) |
|
|
|
{ |
|
|
|
{ |
|
|
|
|
|
|
|
// TODO: why not just assing the pointer to the render group instead of copying here?
|
|
|
|
buf_obj->buffer_len = len; |
|
|
|
buf_obj->buffer_len = len; |
|
|
|
buf_obj->buffer = (GLfloat*) std::calloc(len, sizeof(GLfloat)); |
|
|
|
buf_obj->buffer = (GLfloat*) std::calloc(len, sizeof(GLfloat)); |
|
|
|
|
|
|
|
|
|
|
|
@ -201,23 +203,31 @@ rgInitEntity(gl_render_group* rg, Entity* e) |
|
|
|
|
|
|
|
|
|
|
|
void |
|
|
|
void |
|
|
|
rgDraw(gl_render_group* rg, GLenum draw_mode, glm::mat4 model_matrix, |
|
|
|
rgDraw(gl_render_group* rg, GLenum draw_mode, glm::mat4 model_matrix, |
|
|
|
glm::mat4 view_matrix, glm::mat4 projection_matrix, bool update_vertex_data) |
|
|
|
glm::mat4 view_matrix, glm::mat4 projection_matrix, |
|
|
|
|
|
|
|
glm::vec3 light_position, GLuint light_id) |
|
|
|
{ |
|
|
|
{ |
|
|
|
glUseProgram(rg->program_id); |
|
|
|
glUseProgram(rg->program_id); |
|
|
|
glUniformMatrix4fv(rg->model_matrix_id, 1, GL_FALSE, &model_matrix[0][0]); |
|
|
|
glUniformMatrix4fv(rg->model_matrix_id, 1, GL_FALSE, &model_matrix[0][0]); |
|
|
|
glUniformMatrix4fv(rg->view_matrix_id, 1, GL_FALSE, &view_matrix[0][0]); |
|
|
|
glUniformMatrix4fv(rg->view_matrix_id, 1, GL_FALSE, &view_matrix[0][0]); |
|
|
|
glUniformMatrix4fv(rg->projection_matrix_id, 1, GL_FALSE, &projection_matrix[0][0]); |
|
|
|
glUniformMatrix4fv(rg->projection_matrix_id, 1, GL_FALSE, &projection_matrix[0][0]); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// TODO: testing lighting
|
|
|
|
|
|
|
|
glUniform3f(light_id, light_position.x, light_position.y, light_position.z); |
|
|
|
|
|
|
|
glm::mat3 normal_matrix = glm::transpose(glm::inverse(glm::mat3(model_matrix))); |
|
|
|
|
|
|
|
glUniformMatrix3fv(rg->normal_matrix_id, 1, GL_FALSE, &normal_matrix[0][0]); |
|
|
|
|
|
|
|
|
|
|
|
// 1st attribute buffer : vertices
|
|
|
|
// 1st attribute buffer : vertices
|
|
|
|
glEnableVertexAttribArray(0); |
|
|
|
glEnableVertexAttribArray(0); |
|
|
|
glBindBuffer(GL_ARRAY_BUFFER, rg->vertex_buffer.buffer_id); |
|
|
|
glBindBuffer(GL_ARRAY_BUFFER, rg->vertex_buffer.buffer_id); |
|
|
|
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*) 0); |
|
|
|
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*) 0); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if 0 |
|
|
|
if (update_vertex_data) |
|
|
|
if (update_vertex_data) |
|
|
|
{ |
|
|
|
{ |
|
|
|
glBufferSubData(GL_ARRAY_BUFFER, 0, rg->vertex_buffer.buffer_len * sizeof(GLfloat), |
|
|
|
glBufferSubData(GL_ARRAY_BUFFER, 0, rg->vertex_buffer.buffer_len * sizeof(GLfloat), |
|
|
|
rg->vertex_buffer.buffer); |
|
|
|
rg->vertex_buffer.buffer); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
// 2nd attribute buffer : colors
|
|
|
|
// 2nd attribute buffer : colors
|
|
|
|
if (rg->color_buffer.buffer) |
|
|
|
if (rg->color_buffer.buffer) |
|
|
|
@ -230,6 +240,14 @@ rgDraw(gl_render_group* rg, GLenum draw_mode, glm::mat4 model_matrix, |
|
|
|
glBufferSubData(GL_ARRAY_BUFFER, 0, rg->color_buffer.buffer_len * sizeof(GLfloat), |
|
|
|
glBufferSubData(GL_ARRAY_BUFFER, 0, rg->color_buffer.buffer_len * sizeof(GLfloat), |
|
|
|
rg->color_buffer.buffer); |
|
|
|
rg->color_buffer.buffer); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 3rd attribute buffer: normals
|
|
|
|
|
|
|
|
if (rg->use_normals) { |
|
|
|
|
|
|
|
glEnableVertexAttribArray(2); |
|
|
|
|
|
|
|
glBindBuffer(GL_ARRAY_BUFFER, rg->vertex_normals.buffer_id); |
|
|
|
|
|
|
|
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, (void*) 0); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// draw
|
|
|
|
// draw
|
|
|
|
glDrawArrays(draw_mode, 0, rg->vertex_buffer.buffer_len / 3); |
|
|
|
glDrawArrays(draw_mode, 0, rg->vertex_buffer.buffer_len / 3); |
|
|
|
|
|
|
|
|
|
|
|
@ -241,13 +259,19 @@ rgDraw(gl_render_group* rg, GLenum draw_mode, glm::mat4 model_matrix, |
|
|
|
|
|
|
|
|
|
|
|
void |
|
|
|
void |
|
|
|
rgDrawIndexed(gl_render_group* rg, GLenum draw_mode, glm::mat4 model_matrix, |
|
|
|
rgDrawIndexed(gl_render_group* rg, GLenum draw_mode, glm::mat4 model_matrix, |
|
|
|
glm::mat4 view_matrix, glm::mat4 projection_matrix, bool update_vertex_data) |
|
|
|
glm::mat4 view_matrix, glm::mat4 projection_matrix, |
|
|
|
|
|
|
|
glm::vec3 light_position, GLuint light_id) |
|
|
|
{ |
|
|
|
{ |
|
|
|
glUseProgram(rg->program_id); |
|
|
|
glUseProgram(rg->program_id); |
|
|
|
glUniformMatrix4fv(rg->model_matrix_id, 1, GL_FALSE, &model_matrix[0][0]); |
|
|
|
glUniformMatrix4fv(rg->model_matrix_id, 1, GL_FALSE, &model_matrix[0][0]); |
|
|
|
glUniformMatrix4fv(rg->view_matrix_id, 1, GL_FALSE, &view_matrix[0][0]); |
|
|
|
glUniformMatrix4fv(rg->view_matrix_id, 1, GL_FALSE, &view_matrix[0][0]); |
|
|
|
glUniformMatrix4fv(rg->projection_matrix_id, 1, GL_FALSE, &projection_matrix[0][0]); |
|
|
|
glUniformMatrix4fv(rg->projection_matrix_id, 1, GL_FALSE, &projection_matrix[0][0]); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// TODO: testing lighting
|
|
|
|
|
|
|
|
glUniform3f(light_id, light_position.x, light_position.y, light_position.z); |
|
|
|
|
|
|
|
glm::mat3 normal_matrix = glm::transpose(glm::inverse(glm::mat3(model_matrix))); |
|
|
|
|
|
|
|
glUniformMatrix3fv(rg->normal_matrix_id, 1, GL_FALSE, &normal_matrix[0][0]); |
|
|
|
|
|
|
|
|
|
|
|
// 1st attribute buffer : vertices
|
|
|
|
// 1st attribute buffer : vertices
|
|
|
|
glEnableVertexAttribArray(0); |
|
|
|
glEnableVertexAttribArray(0); |
|
|
|
glBindBuffer(GL_ARRAY_BUFFER, rg->vertex_buffer.buffer_id); |
|
|
|
glBindBuffer(GL_ARRAY_BUFFER, rg->vertex_buffer.buffer_id); |
|
|
|
@ -300,6 +324,8 @@ rgFree(gl_render_group* rg) |
|
|
|
rg->index_buffer.indices = nullptr; |
|
|
|
rg->index_buffer.indices = nullptr; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// TODO: free vertex_normals here, and switch to using utilFree function
|
|
|
|
|
|
|
|
|
|
|
|
std::free(rg); |
|
|
|
std::free(rg); |
|
|
|
rg = nullptr; |
|
|
|
rg = nullptr; |
|
|
|
} |
|
|
|
} |
|
|
|
|