From a78be71e34d820860f1335f35387b281fe997bb4 Mon Sep 17 00:00:00 2001 From: ZY4N Date: Tue, 25 Mar 2025 02:38:41 +0100 Subject: [PATCH] Fixed wrong vertex buffer element count bug. --- include/opengl/vertex_buffer_utils.hpp | 48 ++----------------- .../mesh_vertex_buffer_manager.cpp | 7 ++- .../point_cloud_vertex_buffer_manager.cpp | 7 ++- 3 files changed, 15 insertions(+), 47 deletions(-) diff --git a/include/opengl/vertex_buffer_utils.hpp b/include/opengl/vertex_buffer_utils.hpp index 175dada..23d4e34 100644 --- a/include/opengl/vertex_buffer_utils.hpp +++ b/include/opengl/vertex_buffer_utils.hpp @@ -39,50 +39,12 @@ void for_enabled_components( } -template -vertex_buffer_metadata generate_metadata( - const C components, - std::span buffers... -) { - - auto meta = vertex_buffer_metadata{}; - - detail::for_enabled_components( - components, - ztu::specialised_lambda - { - // Visitor for scalar values - [&](const std::span&, std::size_t index) - { - auto& component = meta.components[index]; - component.type = type_utils::to_gl_type(); - component.count = 1; - ++meta.component_count; - }, - // Visitor for numbers - [&](const std::span>&, std::size_t index) - { - auto& component = meta.components[index]; - component.type = type_utils::to_gl_type(); - component.count = Count; - ++meta.component_count; - } - }, - buffers... - ); - - for (const auto& component : std::span(meta.components).subspan(0, meta.component_count)) - { - meta.stride += type_utils::size_of(component.type) * component.count; - } - - return meta; -} template void interlace( std::vector& vertex_buffer, const C components, + const std::size_t element_count, std::span buffers... ) { std::array byte_offsets; @@ -100,11 +62,7 @@ void interlace( buffers... ); - const auto vertex_count = std::min({ - - buffers.size()... - }); - const auto buffer_size = stride * vertex_count; + const auto buffer_size = stride * element_count; vertex_buffer.resize(buffer_size); @@ -113,7 +71,7 @@ void interlace( [&](const std::span& buffer, std::size_t index) { const auto byte_offset = byte_offsets[index]; - for (const auto& value : buffer.subspan(0, vertex_count)) + for (const auto& value : buffer.subspan(0, element_count)) { std::memcpy( &vertex_buffer[byte_offset], diff --git a/source/opengl/data_managers/mesh_vertex_buffer_manager.cpp b/source/opengl/data_managers/mesh_vertex_buffer_manager.cpp index a007fe1..c3b4eac 100644 --- a/source/opengl/data_managers/mesh_vertex_buffer_manager.cpp +++ b/source/opengl/data_managers/mesh_vertex_buffer_manager.cpp @@ -33,7 +33,12 @@ void zgl::mesh_vertex_buffer_manager::process(store_type& store) std::apply( [&](const auto&... component_buffers) { - vertex_buffer_utils::interlace(m_byte_buffer, mesh.component_flags, component_buffers...); + vertex_buffer_utils::interlace( + m_byte_buffer, + mesh.component_flags, + mesh.vertex_count, + component_buffers... + ); }, mesh.vertex_component_arrays ); diff --git a/source/opengl/data_managers/point_cloud_vertex_buffer_manager.cpp b/source/opengl/data_managers/point_cloud_vertex_buffer_manager.cpp index 8f029ad..30d4b83 100644 --- a/source/opengl/data_managers/point_cloud_vertex_buffer_manager.cpp +++ b/source/opengl/data_managers/point_cloud_vertex_buffer_manager.cpp @@ -33,7 +33,12 @@ void zgl::point_cloud_vertex_buffer_manager::process(store_type& store) std::apply( [&](const auto&... component_buffers) { - vertex_buffer_utils::interlace(m_byte_buffer, point_cloud.vertex_component_flags, component_buffers...); + vertex_buffer_utils::interlace( + m_byte_buffer, + point_cloud.vertex_component_flags, + point_cloud.point_count, + component_buffers... + ); }, point_cloud.vertex_component_arrays );