From 2c8cca3382d2bbfb625053f8aad74667769faad6 Mon Sep 17 00:00:00 2001 From: Simon <oehrl@vr.rwth-aachen.de> Date: Wed, 8 Aug 2018 16:01:41 +0200 Subject: [PATCH] Create an OpenGL buffer for 1D texture coords #468 --- .../rendering/render_passes/geometry_pass.cpp | 36 +++++++++++++------ .../rendering/render_passes/geometry_pass.hpp | 3 +- tests/src/test_geometry_pass.cpp | 9 ++--- 3 files changed, 32 insertions(+), 16 deletions(-) diff --git a/library/phx/rendering/render_passes/geometry_pass.cpp b/library/phx/rendering/render_passes/geometry_pass.cpp index fe5812c1..54c4594d 100644 --- a/library/phx/rendering/render_passes/geometry_pass.cpp +++ b/library/phx/rendering/render_passes/geometry_pass.cpp @@ -107,15 +107,25 @@ void GeometryPass::UploadMeshData( static_cast<GLsizeiptr>(mesh->GetNormals().size() * sizeof(glm::vec3)), mesh->GetNormals().data()); - const void* texture_coord_data = - mesh->GetNumberOfTextureCoordComponents(0) == 2 - ? mesh->GetTextureCoords()[0].data() - : nullptr; - rendering_resource_->tex_coords_buffer.set_sub_data( - static_cast<GLintptr>(offset.vertex_offset * sizeof(glm::vec2)), - static_cast<GLsizeiptr>(mesh->GetNumberOfTextureCoordComponents(0) * - mesh->GetVertices().size() * sizeof(float)), - texture_coord_data); + if (mesh->GetNumberOfTextureCoordComponents(0) == 1) { + const void* texture_coord_data = mesh->GetTextureCoords()[0].data(); + rendering_resource_->tex_coords_buffer_1d.set_sub_data( + static_cast<GLintptr>(offset.vertex_offset * + mesh->GetNumberOfTextureCoordComponents(0) * + sizeof(float)), + static_cast<GLsizeiptr>(mesh->GetNumberOfTextureCoordComponents(0) * + mesh->GetVertices().size() * sizeof(float)), + texture_coord_data); + } else if (mesh->GetNumberOfTextureCoordComponents(0) == 2) { + const void* texture_coord_data = mesh->GetTextureCoords()[0].data(); + rendering_resource_->tex_coords_buffer_2d.set_sub_data( + static_cast<GLintptr>(offset.vertex_offset * + mesh->GetNumberOfTextureCoordComponents(0) * + sizeof(float)), + static_cast<GLsizeiptr>(mesh->GetNumberOfTextureCoordComponents(0) * + mesh->GetVertices().size() * sizeof(float)), + texture_coord_data); + } std::vector<unsigned int> shifted_indices; shifted_indices.reserve(mesh->GetIndices().size()); @@ -193,7 +203,9 @@ void GeometryPass::CreateRenderingResource() { rendering_resource_->vertex_buffer_size * sizeof(glm::vec3)); rendering_resource_->normal_buffer.set_data( rendering_resource_->vertex_buffer_size * sizeof(glm::vec3)); - rendering_resource_->tex_coords_buffer.set_data( + rendering_resource_->tex_coords_buffer_1d.set_data( + rendering_resource_->vertex_buffer_size * sizeof(float)); + rendering_resource_->tex_coords_buffer_2d.set_data( rendering_resource_->vertex_buffer_size * sizeof(glm::vec2)); rendering_resource_->index_buffer.set_data( rendering_resource_->index_buffer_size * sizeof(unsigned int)); @@ -202,8 +214,10 @@ void GeometryPass::CreateRenderingResource() { sizeof(glm::vec3)); CreateAttachVertexArrayVertexBuffer(rendering_resource_->normal_buffer, 1u, 3, sizeof(glm::vec3)); - CreateAttachVertexArrayVertexBuffer(rendering_resource_->tex_coords_buffer, + CreateAttachVertexArrayVertexBuffer(rendering_resource_->tex_coords_buffer_2d, 2u, 2, sizeof(glm::vec2)); + CreateAttachVertexArrayVertexBuffer(rendering_resource_->tex_coords_buffer_1d, + 3u, 1, sizeof(glm::vec2)); rendering_resource_->vertex_array.set_element_buffer( rendering_resource_->index_buffer); diff --git a/library/phx/rendering/render_passes/geometry_pass.hpp b/library/phx/rendering/render_passes/geometry_pass.hpp index a0273315..28013974 100644 --- a/library/phx/rendering/render_passes/geometry_pass.hpp +++ b/library/phx/rendering/render_passes/geometry_pass.hpp @@ -97,7 +97,8 @@ class PHOENIX_EXPORT GeometryPass : public RenderPass { gl::buffer vertex_buffer; gl::buffer normal_buffer; - gl::buffer tex_coords_buffer; + gl::buffer tex_coords_buffer_1d; + gl::buffer tex_coords_buffer_2d; gl::buffer index_buffer; gl::vertex_array vertex_array; diff --git a/tests/src/test_geometry_pass.cpp b/tests/src/test_geometry_pass.cpp index 15c7e708..9eb47334 100644 --- a/tests/src/test_geometry_pass.cpp +++ b/tests/src/test_geometry_pass.cpp @@ -55,8 +55,9 @@ SCENARIO( OPENGL_MOCK_ALLOW_ANY_CALL const GLuint vertex_buffer_id = 1u; const GLuint normal_buffer_id = 2u; - const GLuint texCoord_buffer_id = 3u; - const GLuint index_buffer_id = 4u; + const GLuint texCoord_buffer_1d_id = 3u; + const GLuint texCoord_buffer_2d_id = 4u; + const GLuint index_buffer_id = 1u; GIVEN("A geometry pass") { phx::Entity camera; @@ -140,7 +141,7 @@ SCENARIO( glNamedBufferSubData(normal_buffer_id, 0, 3 * sizeof(glm::vec3), _)); REQUIRE_CALL(open_gl_mock, - glNamedBufferSubData(texCoord_buffer_id, 0, + glNamedBufferSubData(texCoord_buffer_2d_id, 0, 3 * sizeof(glm::vec2), _)); REQUIRE_CALL(open_gl_mock, glNamedBufferSubData(index_buffer_id, 0, @@ -213,7 +214,7 @@ SCENARIO( REQUIRE_CALL(open_gl_mock, glVertexArrayVertexBuffer(1u, _, 1u, _, _)); REQUIRE_CALL(open_gl_mock, glVertexArrayVertexBuffer(1u, _, 2u, _, _)); REQUIRE_CALL(open_gl_mock, glVertexArrayVertexBuffer(1u, _, 3u, _, _)); - REQUIRE_CALL(open_gl_mock, glVertexArrayElementBuffer(1u, 4u)); + REQUIRE_CALL(open_gl_mock, glVertexArrayElementBuffer(1u, 1u)); geometry_pass.Initialize(); } } -- GitLab