Browse Source

add option to not send color data every frame

master
cinnaboot 8 years ago
parent
commit
6f65d7cc97
  1. 20
      data/test_scene.json
  2. 1
      src/camera.cpp
  3. 1
      src/camera.h
  4. 18
      src/render_group.cpp
  5. 3
      src/render_group.h
  6. 7
      src/renderer.cpp

20
data/test_scene.json

@ -43,6 +43,26 @@
"y" : 10,
"z" : 10
}
},
{
"name" : "catepillar 2",
"model_file" : "catepillar.dae",
"position" : {
"x" : 600,
"y" : 400,
"z" : 0
},
"rotation" : {
"x" : 0,
"y" : 0,
"z" : 0,
"w" : 0
},
"scale" : {
"x" : 10,
"y" : 10,
"z" : 10
}
}
],

1
src/camera.cpp

@ -14,6 +14,7 @@ cameraInitPerspective(camera& cam, glm::vec3 position, glm::vec3 target, glm::ve
cam.vAngle = glm::atan((cam.target.z - cam.position.z) / (cam.target.y - cam.position.y));
// FIXME: bug, camera always starts with forward pointing at positive 'z' axis
// camera position also changes with change to window size
cam.forward = glm::normalize(glm::vec3(
glm::cos(cam.vAngle) * glm::sin(cam.hAngle),
glm::cos(cam.vAngle) * glm::cos(cam.hAngle),

1
src/camera.h

@ -8,6 +8,7 @@
// TODO: store scene matrices on camera struct instead of global in renderer.h
// TODO: add these props to scene json
#define FOV 60.f
#define ASPECT_RATIO 16.f/9.f
#define NEAR_CLIP_PLANE 0.1f

18
src/render_group.cpp

@ -23,7 +23,8 @@ bool convertMeshInfo(meMeshInfo* mesh, render_object* ro, bool use_normals);
void sendIndexBufferToGL(gl_index_buffer* index_buffer, GLenum usage, GLenum target);
void drawRenderObject(render_group* rg, render_object* ro,
glm::mat4 model_matrix, glm::mat4 view_matrix, glm::mat4 projection_matrix,
glm::vec3 light_position, GLuint light_id, bool update_vertex_data);
glm::vec3 light_position, GLuint light_id,
bool update_vertex_data, bool update_color_data);
// interface
@ -147,11 +148,12 @@ rgBufferData(gl_buffer* buffer, GLenum usage, GLenum target)
void
rgDraw(render_group* rg, glm::mat4 model_matrix, glm::mat4 view_matrix, glm::mat4 projection_matrix,
glm::vec3 light_position, GLuint light_id, bool update_vertex_data)
glm::vec3 light_position, GLuint light_id,
bool update_vertex_data, bool update_color_data)
{
for (uint i = 0; i < rg->num_objects; i++) {
drawRenderObject(rg, rg->render_objects[i], model_matrix, view_matrix, projection_matrix,
light_position, light_id, update_vertex_data);
light_position, light_id, update_vertex_data, update_color_data);
}
}
@ -282,7 +284,8 @@ convertMeshInfo(meMeshInfo* mesh, render_object* ro, bool use_normals)
void
drawRenderObject(render_group* rg, render_object* ro,
glm::mat4 model_matrix, glm::mat4 view_matrix, glm::mat4 projection_matrix,
glm::vec3 light_position, GLuint light_id, bool update_vertex_data)
glm::vec3 light_position, GLuint light_id,
bool update_vertex_data, bool update_color_data)
{
glUseProgram(rg->shader.program_id);
glUniformMatrix4fv(rg->shader.model_matrix_id, 1, GL_FALSE, &model_matrix[0][0]);
@ -307,9 +310,10 @@ drawRenderObject(render_group* rg, render_object* ro,
glBindBuffer(GL_ARRAY_BUFFER, ro->color_buffer.buffer_id);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (void*) 0);
// TODO: maybe add an option to not send color data every frame?
glBufferSubData(GL_ARRAY_BUFFER, 0, ro->color_buffer.buffer_len * sizeof(GLfloat),
ro->color_buffer.buffer);
if (update_color_data) {
glBufferSubData(GL_ARRAY_BUFFER, 0, ro->color_buffer.buffer_len * sizeof(GLfloat),
ro->color_buffer.buffer);
}
}
// 3rd attribute buffer: normals

3
src/render_group.h

@ -70,7 +70,8 @@ rgBufferData(gl_buffer* buffer, GLenum usage, GLenum target);
void rgDraw(render_group* rg, glm::mat4 model_matrix,
glm::mat4 view_matrix, glm::mat4 projection_matrix,
glm::vec3 light_position, GLuint light_id, bool update_vertex_data = false);
glm::vec3 light_position, GLuint light_id,
bool update_vertex_data = false, bool update_color_data = false);
void rgFree(render_group* rg);

7
src/renderer.cpp

@ -118,10 +118,13 @@ initRenderer(SDL_Handles &handles, v2i vpDims)
glEnable(GL_DEPTH_TEST);
glEnable(GL_LINE_SMOOTH);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
#if 0
// TODO: blending messes up rendering with mesa on intel graphics 4000
glEnable(GL_BLEND);
glBlendEquation(GL_FUNC_ADD);
glBlendFunc(GL_ONE, GL_SRC_ALPHA);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
#endif
// TODO: glDebugMessageCallback is only availabe from >v4.3
// check and warn if context doesn't support this function here
@ -356,7 +359,7 @@ renderFrame(std::vector<hex_info> *hexes, Entity* entities, uint32 entity_count)
gl_buffer& color_buf = rg->render_objects[0]->color_buffer;
fillColorBuffer(color_buf.buffer, color_buf.buffer_len, hexes);
rgDraw(rg, m_model, m_view, m_projection,
g_test_light.position, g_test_light.light_ID);
g_test_light.position, g_test_light.light_ID, false, true);
// hex lines
rgDraw(g_hex_line_render_group, m_model, m_view, m_projection,

Loading…
Cancel
Save