Fixed wrong vertex buffer element count bug.
This commit is contained in:
@@ -39,50 +39,12 @@ void for_enabled_components(
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename C, typename... Ts>
|
|
||||||
vertex_buffer_metadata generate_metadata(
|
|
||||||
const C components,
|
|
||||||
std::span<Ts> buffers...
|
|
||||||
) {
|
|
||||||
|
|
||||||
auto meta = vertex_buffer_metadata{};
|
|
||||||
|
|
||||||
detail::for_enabled_components(
|
|
||||||
components,
|
|
||||||
ztu::specialised_lambda
|
|
||||||
{
|
|
||||||
// Visitor for scalar values
|
|
||||||
[&]<detail::numeric_type Component>(const std::span<Component>&, std::size_t index)
|
|
||||||
{
|
|
||||||
auto& component = meta.components[index];
|
|
||||||
component.type = type_utils::to_gl_type<Component>();
|
|
||||||
component.count = 1;
|
|
||||||
++meta.component_count;
|
|
||||||
},
|
|
||||||
// Visitor for numbers
|
|
||||||
[&]<detail::numeric_type Component, std::size_t Count>(const std::span<std::array<Component, Count>>&, std::size_t index)
|
|
||||||
{
|
|
||||||
auto& component = meta.components[index];
|
|
||||||
component.type = type_utils::to_gl_type<Component>();
|
|
||||||
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<typename C, typename... Ts>
|
template<typename C, typename... Ts>
|
||||||
void interlace(
|
void interlace(
|
||||||
std::vector<ztu::u8>& vertex_buffer,
|
std::vector<ztu::u8>& vertex_buffer,
|
||||||
const C components,
|
const C components,
|
||||||
|
const std::size_t element_count,
|
||||||
std::span<Ts> buffers...
|
std::span<Ts> buffers...
|
||||||
) {
|
) {
|
||||||
std::array<std::size_t, sizeof...(buffers)> byte_offsets;
|
std::array<std::size_t, sizeof...(buffers)> byte_offsets;
|
||||||
@@ -100,11 +62,7 @@ void interlace(
|
|||||||
buffers...
|
buffers...
|
||||||
);
|
);
|
||||||
|
|
||||||
const auto vertex_count = std::min({
|
const auto buffer_size = stride * element_count;
|
||||||
|
|
||||||
buffers.size()...
|
|
||||||
});
|
|
||||||
const auto buffer_size = stride * vertex_count;
|
|
||||||
|
|
||||||
vertex_buffer.resize(buffer_size);
|
vertex_buffer.resize(buffer_size);
|
||||||
|
|
||||||
@@ -113,7 +71,7 @@ void interlace(
|
|||||||
[&]<class Component>(const std::span<Component>& buffer, std::size_t index)
|
[&]<class Component>(const std::span<Component>& buffer, std::size_t index)
|
||||||
{
|
{
|
||||||
const auto byte_offset = byte_offsets[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(
|
std::memcpy(
|
||||||
&vertex_buffer[byte_offset],
|
&vertex_buffer[byte_offset],
|
||||||
|
|||||||
@@ -33,7 +33,12 @@ void zgl::mesh_vertex_buffer_manager::process(store_type& store)
|
|||||||
std::apply(
|
std::apply(
|
||||||
[&](const auto&... component_buffers)
|
[&](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
|
mesh.vertex_component_arrays
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -33,7 +33,12 @@ void zgl::point_cloud_vertex_buffer_manager::process(store_type& store)
|
|||||||
std::apply(
|
std::apply(
|
||||||
[&](const auto&... component_buffers)
|
[&](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
|
point_cloud.vertex_component_arrays
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user