|
|
|
@ -1,4 +1,5 @@ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include <sstream> // TODO: remove this and make something in util.h |
|
|
|
#include <cassert> |
|
|
|
#include <cassert> |
|
|
|
#include <cstdlib> // calloc |
|
|
|
#include <cstdlib> // calloc |
|
|
|
|
|
|
|
|
|
|
|
@ -23,7 +24,7 @@ bool convertMeshInfo(meMeshInfo* mesh, render_object* ro, bool use_normals); |
|
|
|
void sendIndexBufferToGL(gl_index_buffer* index_buffer, GLenum usage, GLenum target); |
|
|
|
void sendIndexBufferToGL(gl_index_buffer* index_buffer, GLenum usage, GLenum target); |
|
|
|
void drawRenderObject(render_group* rg, render_object* ro, |
|
|
|
void drawRenderObject(render_group* rg, render_object* ro, |
|
|
|
glm::mat4 model_matrix, glm::mat4 view_matrix, glm::mat4 projection_matrix, |
|
|
|
glm::mat4 model_matrix, glm::mat4 view_matrix, glm::mat4 projection_matrix, |
|
|
|
glm::vec3 light_position, GLuint light_id, |
|
|
|
rg_point_light* lights, uint num_lights, |
|
|
|
bool update_vertex_data, bool update_color_data); |
|
|
|
bool update_vertex_data, bool update_color_data); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -74,6 +75,8 @@ rgInitShaderProgram(rg_shader_program& sp, const char * vertex_code, const char |
|
|
|
sp.view_matrix_id = glGetUniformLocation(sp.program_id, "view"); |
|
|
|
sp.view_matrix_id = glGetUniformLocation(sp.program_id, "view"); |
|
|
|
sp.projection_matrix_id = glGetUniformLocation(sp.program_id, "projection"); |
|
|
|
sp.projection_matrix_id = glGetUniformLocation(sp.program_id, "projection"); |
|
|
|
sp.normal_matrix_id = glGetUniformLocation(sp.program_id, "normal_matrix"); |
|
|
|
sp.normal_matrix_id = glGetUniformLocation(sp.program_id, "normal_matrix"); |
|
|
|
|
|
|
|
sp.lights_id = glGetUniformLocation(sp.program_id, "lights"); |
|
|
|
|
|
|
|
sp.num_lights_id = glGetUniformLocation(sp.program_id, "num_lights"); |
|
|
|
|
|
|
|
|
|
|
|
glDetachShader(sp.program_id, vertex_shader_id); |
|
|
|
glDetachShader(sp.program_id, vertex_shader_id); |
|
|
|
glDetachShader(sp.program_id, fragment_shader_id); |
|
|
|
glDetachShader(sp.program_id, fragment_shader_id); |
|
|
|
@ -138,6 +141,9 @@ rgInitEntity(Entity* e) |
|
|
|
return true; |
|
|
|
return true; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// TODO: this should be called more like, rgInitGLBuffer()
|
|
|
|
|
|
|
|
// NOTE: could also make internal by adding more utility function for eg)
|
|
|
|
|
|
|
|
// initHexGrid(), initDebugDraw()...
|
|
|
|
void |
|
|
|
void |
|
|
|
rgBufferData(gl_buffer* buffer, GLenum usage, GLenum target) |
|
|
|
rgBufferData(gl_buffer* buffer, GLenum usage, GLenum target) |
|
|
|
{ |
|
|
|
{ |
|
|
|
@ -147,13 +153,16 @@ rgBufferData(gl_buffer* buffer, GLenum usage, GLenum target) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void |
|
|
|
void |
|
|
|
rgDraw(render_group* rg, glm::mat4 model_matrix, glm::mat4 view_matrix, glm::mat4 projection_matrix, |
|
|
|
rgDraw(render_group* rg, glm::mat4 model_matrix, |
|
|
|
glm::vec3 light_position, GLuint light_id, |
|
|
|
glm::mat4 view_matrix, glm::mat4 projection_matrix, |
|
|
|
bool update_vertex_data, bool update_color_data) |
|
|
|
rg_point_light* lights, uint num_lights, |
|
|
|
|
|
|
|
bool update_vertex_data, bool update_color_data) |
|
|
|
{ |
|
|
|
{ |
|
|
|
for (uint i = 0; i < rg->num_objects; i++) { |
|
|
|
for (uint i = 0; i < rg->num_objects; i++) { |
|
|
|
drawRenderObject(rg, rg->render_objects[i], model_matrix, view_matrix, projection_matrix, |
|
|
|
drawRenderObject(rg, rg->render_objects[i], |
|
|
|
light_position, light_id, update_vertex_data, update_color_data); |
|
|
|
model_matrix, view_matrix, projection_matrix, |
|
|
|
|
|
|
|
lights, num_lights, |
|
|
|
|
|
|
|
update_vertex_data, update_color_data); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -284,7 +293,7 @@ convertMeshInfo(meMeshInfo* mesh, render_object* ro, bool use_normals) |
|
|
|
void |
|
|
|
void |
|
|
|
drawRenderObject(render_group* rg, render_object* ro, |
|
|
|
drawRenderObject(render_group* rg, render_object* ro, |
|
|
|
glm::mat4 model_matrix, glm::mat4 view_matrix, glm::mat4 projection_matrix, |
|
|
|
glm::mat4 model_matrix, glm::mat4 view_matrix, glm::mat4 projection_matrix, |
|
|
|
glm::vec3 light_position, GLuint light_id, |
|
|
|
rg_point_light* lights, uint num_lights, |
|
|
|
bool update_vertex_data, bool update_color_data) |
|
|
|
bool update_vertex_data, bool update_color_data) |
|
|
|
{ |
|
|
|
{ |
|
|
|
glUseProgram(rg->shader.program_id); |
|
|
|
glUseProgram(rg->shader.program_id); |
|
|
|
@ -323,9 +332,20 @@ drawRenderObject(render_group* rg, render_object* ro, |
|
|
|
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, (void*) 0); |
|
|
|
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, (void*) 0); |
|
|
|
|
|
|
|
|
|
|
|
// TODO: testing lighting
|
|
|
|
// TODO: testing lighting
|
|
|
|
glUniform3f(light_id, light_position.x, light_position.y, light_position.z); |
|
|
|
// TODO: use Uniform Buffer Objects to update light data
|
|
|
|
|
|
|
|
// https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_uniform_buffer_object.txt
|
|
|
|
|
|
|
|
// https://www.khronos.org/opengl/wiki/Uniform_Buffer_Objects
|
|
|
|
|
|
|
|
|
|
|
|
glm::mat3 normal_matrix = glm::transpose(glm::inverse(glm::mat3(model_matrix))); |
|
|
|
glm::mat3 normal_matrix = glm::transpose(glm::inverse(glm::mat3(model_matrix))); |
|
|
|
glUniformMatrix3fv(rg->shader.normal_matrix_id, 1, GL_FALSE, &normal_matrix[0][0]); |
|
|
|
glUniformMatrix3fv(rg->shader.normal_matrix_id, 1, GL_FALSE, &normal_matrix[0][0]); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (uint i = 0; i < num_lights; i++) { |
|
|
|
|
|
|
|
// TODO: don't do this every frame * every render_group
|
|
|
|
|
|
|
|
std::stringstream ss; |
|
|
|
|
|
|
|
ss << "lights[" << i << "].position"; |
|
|
|
|
|
|
|
int light_pos_loc = glGetUniformLocation(rg->shader.program_id, ss.str().c_str()); |
|
|
|
|
|
|
|
glUniform3fv(light_pos_loc, 1, &lights[i].position[0]); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// draw
|
|
|
|
// draw
|
|
|
|
|