diff --git a/data/test_scene.json b/data/test_scene.json index 386ae31..339f59d 100644 --- a/data/test_scene.json +++ b/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 + } } ], diff --git a/src/camera.cpp b/src/camera.cpp index 791d3dc..c21411b 100644 --- a/src/camera.cpp +++ b/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), diff --git a/src/camera.h b/src/camera.h index ddfa375..d018e8b 100644 --- a/src/camera.h +++ b/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 diff --git a/src/render_group.cpp b/src/render_group.cpp index 304071f..b6e071a 100644 --- a/src/render_group.cpp +++ b/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 diff --git a/src/render_group.h b/src/render_group.h index 0342b28..e58de1e 100644 --- a/src/render_group.h +++ b/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); diff --git a/src/renderer.cpp b/src/renderer.cpp index 181d28d..5aaf0c4 100644 --- a/src/renderer.cpp +++ b/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 *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,