Ported the obj parser.
This commit is contained in:
@@ -242,7 +242,7 @@ typename assets::detail::generic_basic_store<ID, T>::iterator assets::detail::ge
|
||||
{
|
||||
return iterator{
|
||||
m_ids.data(),
|
||||
m_data.begin(),
|
||||
m_data.data(),
|
||||
0
|
||||
};
|
||||
}
|
||||
@@ -252,7 +252,7 @@ typename assets::detail::generic_basic_store<ID, T>::iterator assets::detail::ge
|
||||
{
|
||||
return iterator{
|
||||
m_ids.data(),
|
||||
m_data.begin(),
|
||||
m_data.data(),
|
||||
m_ids.size()
|
||||
};
|
||||
}
|
||||
@@ -262,7 +262,7 @@ typename assets::detail::generic_basic_store<ID, T>::const_iterator assets::deta
|
||||
{
|
||||
return const_iterator{
|
||||
m_ids.data(),
|
||||
m_data.begin(),
|
||||
m_data.data(),
|
||||
0
|
||||
};
|
||||
}
|
||||
@@ -272,7 +272,7 @@ typename assets::detail::generic_basic_store<ID, T>::const_iterator assets::deta
|
||||
{
|
||||
return const_iterator{
|
||||
m_ids.data(),
|
||||
m_data.begin(),
|
||||
m_data.data(),
|
||||
m_ids.size()
|
||||
};
|
||||
}
|
||||
|
||||
@@ -13,13 +13,13 @@ template<typename... Ts>
|
||||
assets::detail::generic_material_store_iterator<Ts...>::generic_material_store_iterator(
|
||||
id_iterator_type ids,
|
||||
const component_iterator_type& components,
|
||||
flag_count_iterator_type flag_counts,
|
||||
flag_iterator_type flags,
|
||||
const size_type index,
|
||||
const offsets_type& offsets
|
||||
) :
|
||||
m_ids{ ids },
|
||||
m_components{ components },
|
||||
m_flag_counts{ flag_counts },
|
||||
m_flags{ flags },
|
||||
m_index{ index },
|
||||
m_offsets{ offsets } {}
|
||||
|
||||
@@ -31,7 +31,7 @@ typename assets::detail::generic_material_store_iterator<Ts...>::reference asset
|
||||
|
||||
template<typename... Ts>
|
||||
assets::detail::generic_material_store_iterator<Ts...>& assets::detail::generic_material_store_iterator<Ts...>::operator++() {
|
||||
adjust_offsets(std::index_sequence_for<Ts...>{}, 1);
|
||||
calc_offsets(std::index_sequence_for<Ts...>{}, 1);
|
||||
++m_index;
|
||||
return *this;
|
||||
}
|
||||
@@ -45,7 +45,7 @@ assets::detail::generic_material_store_iterator<Ts...> assets::detail::generic_m
|
||||
|
||||
template<typename... Ts>
|
||||
assets::detail::generic_material_store_iterator<Ts...>& assets::detail::generic_material_store_iterator<Ts...>::operator--() {
|
||||
adjust_offsets(std::index_sequence_for<Ts...>{}, -1);
|
||||
calc_offsets(std::index_sequence_for<Ts...>{}, -1);
|
||||
--m_index;
|
||||
return *this;
|
||||
}
|
||||
@@ -60,7 +60,7 @@ assets::detail::generic_material_store_iterator<Ts...> assets::detail::generic_m
|
||||
template<typename... Ts>
|
||||
assets::detail::generic_material_store_iterator<Ts...>& assets::detail::generic_material_store_iterator<Ts...>::operator+=(const difference_type n)
|
||||
{
|
||||
adjust_offsets(std::index_sequence_for<Ts...>{}, n);
|
||||
calc_offsets(std::index_sequence_for<Ts...>{}, n);
|
||||
m_index += n;
|
||||
return *this;
|
||||
}
|
||||
@@ -158,14 +158,12 @@ void assets::detail::generic_material_store_iterator<Ts...>::calc_offsets(
|
||||
|
||||
while (n--)
|
||||
{
|
||||
const auto& [ flags, index_count, component_count ] = m_flag_counts[m_index];
|
||||
|
||||
std::get<0>(m_offsets) += step * index_count;
|
||||
const auto flags = m_flags[m_index];
|
||||
|
||||
([&] {
|
||||
if (is_component_enabled<Is>(flags))
|
||||
{
|
||||
std::get<1 + Is>(m_offsets) += step * component_count;
|
||||
std::get<Is>(m_offsets) += step;
|
||||
}
|
||||
}(), ...);
|
||||
|
||||
@@ -178,12 +176,13 @@ template<std::size_t... Is>
|
||||
typename assets::detail::generic_material_store_iterator<Ts...>::reference
|
||||
assets::detail::generic_material_store_iterator<Ts...>::dereference(std::index_sequence<Is...>) const
|
||||
{
|
||||
const auto& flags = m_flag_counts[m_index];
|
||||
const auto& flags = m_flags[m_index];
|
||||
|
||||
return std::make_pair(
|
||||
m_ids[m_index],
|
||||
material_view{
|
||||
.data = {
|
||||
.component_flags = flags,
|
||||
.components = {
|
||||
(
|
||||
is_component_enabled<Is>(flags)
|
||||
? std::optional{ std::get<Is>(m_components)[m_offsets[Is]] }
|
||||
@@ -197,7 +196,7 @@ assets::detail::generic_material_store_iterator<Ts...>::dereference(std::index_s
|
||||
template<typename... Ts>
|
||||
std::tuple<std::add_pointer_t<Ts>...> assets::detail::generic_material_store<z3d::structure<Ts...>>::component_iterators()
|
||||
{
|
||||
return [&]<auto... Is>(std::index_sequence<Is>)
|
||||
return [&]<auto... Is>(std::index_sequence<Is...>)
|
||||
{
|
||||
return std::make_tuple(std::get<Is>(m_component_arrays).data()...);
|
||||
}
|
||||
@@ -207,7 +206,7 @@ std::tuple<std::add_pointer_t<Ts>...> assets::detail::generic_material_store<z3d
|
||||
template<typename... Ts>
|
||||
std::tuple<std::add_pointer_t<std::add_const_t<Ts>>...> assets::detail::generic_material_store<z3d::structure<Ts...>>::component_iterators() const
|
||||
{
|
||||
return [&]<auto... Is>(std::index_sequence<Is>)
|
||||
return [&]<auto... Is>(std::index_sequence<Is...>)
|
||||
{
|
||||
return std::make_tuple(std::get<Is>(m_component_arrays).data()...);
|
||||
}
|
||||
@@ -218,7 +217,7 @@ template<typename... Ts>
|
||||
std::array<typename assets::detail::generic_material_store<z3d::structure<Ts...>>::count_type, 1 + sizeof...(Ts)>
|
||||
assets::detail::generic_material_store<z3d::structure<Ts...>>::array_counts() const
|
||||
{
|
||||
return [&]<auto... Is>(std::index_sequence<Is>)
|
||||
return [&]<auto... Is>(std::index_sequence<Is...>)
|
||||
{
|
||||
return std::array{
|
||||
std::get<Is>(m_component_arrays).size()...
|
||||
@@ -279,35 +278,37 @@ bool assets::detail::generic_material_store<z3d::structure<Ts...>>::unsafe_inser
|
||||
|
||||
auto& dst_component_flags = m_component_flag_counts[index];
|
||||
|
||||
[&]<auto... Is>(std::integer_sequence<Is...>)
|
||||
[&]<auto... Is>(std::index_sequence<Is...>)
|
||||
{
|
||||
const auto is_component_enabled = src_component_flags & component_flag_type{ 1 } << Is;
|
||||
const auto was_component_enabled = (
|
||||
new_entry
|
||||
? static_cast<bool>(dst_component_flags & component_flag_type{ 1 } << Is)
|
||||
: component_flag_type{}
|
||||
);
|
||||
([&] {
|
||||
const auto is_component_enabled = static_cast<bool>(src_component_flags & component_flag_type{ 1 } << Is);
|
||||
const auto was_component_enabled = (
|
||||
new_entry
|
||||
? static_cast<bool>(dst_component_flags & component_flag_type{ 1 } << Is)
|
||||
: false
|
||||
);
|
||||
|
||||
const auto& src_component = std::get<Is>(data.components);
|
||||
auto& dst_component_array = std::get<Is>(m_component_arrays);
|
||||
const auto component_index = it.m_offsets[Is];
|
||||
const auto dst_component_it = dst_component_array.begin() + component_index;
|
||||
const auto& src_component = std::get<Is>(data.components);
|
||||
auto& dst_component_array = std::get<Is>(m_component_arrays);
|
||||
const auto component_index = it.m_offsets[Is];
|
||||
const auto dst_component_it = dst_component_array.begin() + component_index;
|
||||
|
||||
if (is_component_enabled)
|
||||
{
|
||||
if (was_component_enabled)
|
||||
if (is_component_enabled)
|
||||
{
|
||||
*dst_component_it = *src_component;
|
||||
if (was_component_enabled)
|
||||
{
|
||||
*dst_component_it = *src_component;
|
||||
}
|
||||
else
|
||||
{
|
||||
dst_component_array.insert(dst_component_it, *src_component);
|
||||
}
|
||||
}
|
||||
else
|
||||
else if (was_component_enabled)
|
||||
{
|
||||
dst_component_array.insert(dst_component_it, *src_component);
|
||||
dst_component_array.erase(dst_component_it);
|
||||
}
|
||||
}
|
||||
else if (was_component_enabled)
|
||||
{
|
||||
dst_component_array.erase(dst_component_it);
|
||||
}
|
||||
}, ...);
|
||||
}
|
||||
(std::index_sequence_for<Ts...>{});
|
||||
|
||||
@@ -347,10 +348,12 @@ void assets::detail::generic_material_store<z3d::structure<Ts...>>::remove(const
|
||||
|
||||
m_ids.erase(m_ids.begin() + it.m_index);
|
||||
|
||||
return [&]<auto... Is>(std::index_sequence<Is>)
|
||||
return [&]<auto... Is>(std::index_sequence<Is...>)
|
||||
{
|
||||
auto& component_array = std::get<Is>(m_component_arrays);
|
||||
(component_array.erase(component_array.begin() + it.m_offsets[Is]), ...);
|
||||
([&] {
|
||||
auto& component_array = std::get<Is>(m_component_arrays);
|
||||
(component_array.erase(component_array.begin() + it.m_offsets[Is]), ...);
|
||||
}, ...);
|
||||
} (std::index_sequence_for<Ts...>{});
|
||||
|
||||
m_component_flag_counts.erase(m_component_flag_counts.begin() + it.m_index);
|
||||
@@ -362,9 +365,9 @@ void assets::detail::generic_material_store<z3d::structure<Ts...>>::clear()
|
||||
auto lock = std::unique_lock{ m_mutex };
|
||||
|
||||
m_ids.clear();
|
||||
[&]<auto... Is>(std::index_sequence<Is>)
|
||||
[&]<auto... Is>(std::index_sequence<Is...>)
|
||||
{
|
||||
std::get<Is>(m_component_arrays).clear();
|
||||
(std::get<Is>(m_component_arrays).clear(), ...);
|
||||
} (std::index_sequence_for<Ts...>{});
|
||||
m_component_flag_counts.clear();
|
||||
}
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
template<typename... Ts>
|
||||
assets::detail::generic_mesh_store_iterator<Ts...>::generic_mesh_store_iterator(
|
||||
id_iterator_type ids,
|
||||
index_iterator_type indices,
|
||||
triangle_iterator_type triangles,
|
||||
const component_iterator_type& components,
|
||||
material_id_iterator_type material_ids,
|
||||
flag_count_iterator_type flag_counts,
|
||||
@@ -22,7 +22,7 @@ assets::detail::generic_mesh_store_iterator<Ts...>::generic_mesh_store_iterator(
|
||||
const offsets_type& offsets
|
||||
) :
|
||||
m_ids{ ids },
|
||||
m_indices{ indices },
|
||||
m_triangles{ triangles },
|
||||
m_components{ components },
|
||||
m_material_ids{ material_ids },
|
||||
m_flag_counts{ flag_counts },
|
||||
@@ -37,7 +37,7 @@ typename assets::detail::generic_mesh_store_iterator<Ts...>::reference assets::d
|
||||
|
||||
template<typename... Ts>
|
||||
assets::detail::generic_mesh_store_iterator<Ts...>& assets::detail::generic_mesh_store_iterator<Ts...>::operator++() {
|
||||
adjust_offsets(std::index_sequence_for<Ts...>{}, 1);
|
||||
calc_offsets(std::index_sequence_for<Ts...>{}, 1);
|
||||
++m_index;
|
||||
return *this;
|
||||
}
|
||||
@@ -51,7 +51,7 @@ assets::detail::generic_mesh_store_iterator<Ts...> assets::detail::generic_mesh_
|
||||
|
||||
template<typename... Ts>
|
||||
assets::detail::generic_mesh_store_iterator<Ts...>& assets::detail::generic_mesh_store_iterator<Ts...>::operator--() {
|
||||
adjust_offsets(std::index_sequence_for<Ts...>{}, -1);
|
||||
calc_offsets(std::index_sequence_for<Ts...>{}, -1);
|
||||
--m_index;
|
||||
return *this;
|
||||
}
|
||||
@@ -66,7 +66,7 @@ assets::detail::generic_mesh_store_iterator<Ts...> assets::detail::generic_mesh_
|
||||
template<typename... Ts>
|
||||
assets::detail::generic_mesh_store_iterator<Ts...>& assets::detail::generic_mesh_store_iterator<Ts...>::operator+=(const difference_type n)
|
||||
{
|
||||
adjust_offsets(std::index_sequence_for<Ts...>{}, n);
|
||||
calc_offsets(std::index_sequence_for<Ts...>{}, n);
|
||||
m_index += n;
|
||||
return *this;
|
||||
}
|
||||
@@ -209,7 +209,7 @@ assets::detail::generic_mesh_store_iterator<Ts...>::dereference(std::index_seque
|
||||
template<typename... Ts>
|
||||
std::tuple<std::add_pointer_t<Ts>...> assets::detail::generic_mesh_store<z3d::structure<Ts...>>::component_iterators()
|
||||
{
|
||||
return [&]<auto... Is>(std::index_sequence<Is>)
|
||||
return [&]<auto... Is>(std::index_sequence<Is...>)
|
||||
{
|
||||
return std::make_tuple(std::get<Is>(m_component_arrays).data()...);
|
||||
}
|
||||
@@ -219,7 +219,7 @@ std::tuple<std::add_pointer_t<Ts>...> assets::detail::generic_mesh_store<z3d::st
|
||||
template<typename... Ts>
|
||||
std::tuple<std::add_pointer_t<std::add_const_t<Ts>>...> assets::detail::generic_mesh_store<z3d::structure<Ts...>>::component_iterators() const
|
||||
{
|
||||
return [&]<auto... Is>(std::index_sequence<Is>)
|
||||
return [&]<auto... Is>(std::index_sequence<Is...>)
|
||||
{
|
||||
return std::make_tuple(std::get<Is>(m_component_arrays).data()...);
|
||||
}
|
||||
@@ -230,7 +230,7 @@ template<typename... Ts>
|
||||
std::array<typename assets::detail::generic_mesh_store<z3d::structure<Ts...>>::count_type, 1 + sizeof...(Ts)>
|
||||
assets::detail::generic_mesh_store<z3d::structure<Ts...>>::array_counts() const
|
||||
{
|
||||
return [&]<auto... Is>(std::index_sequence<Is>)
|
||||
return [&]<auto... Is>(std::index_sequence<Is...>)
|
||||
{
|
||||
return std::array{
|
||||
m_triangles.size(),
|
||||
@@ -289,18 +289,20 @@ bool assets::detail::generic_mesh_store<z3d::structure<Ts...>>::unsafe_insert(it
|
||||
: std::numeric_limits<count_type>::max()
|
||||
);
|
||||
|
||||
[&]<auto... Is>(std::integer_sequence<Is...>)
|
||||
[&]<auto... Is>(std::index_sequence<Is...>)
|
||||
{
|
||||
const auto& component_array = std::get<Is>(data.component_arrays);
|
||||
if (not component_array.empty())
|
||||
{
|
||||
// TODO check count
|
||||
const auto component_count = static_cast<count_type>(component_array.size());
|
||||
if (component_count != 0 and component_count < vertex_count)
|
||||
([&] {
|
||||
const auto& component_array = std::get<Is>(data.component_arrays);
|
||||
if (not component_array.empty())
|
||||
{
|
||||
vertex_count = component_count;
|
||||
// TODO check count
|
||||
const auto component_count = static_cast<count_type>(component_array.size());
|
||||
if (component_count != 0 and component_count < vertex_count)
|
||||
{
|
||||
vertex_count = component_count;
|
||||
}
|
||||
}
|
||||
}
|
||||
}, ...);
|
||||
}
|
||||
(std::index_sequence_for<Ts...>{});
|
||||
|
||||
@@ -339,27 +341,33 @@ bool assets::detail::generic_mesh_store<z3d::structure<Ts...>>::unsafe_insert(it
|
||||
data.triangles().end()
|
||||
);
|
||||
|
||||
[&]<auto... Is>(std::integer_sequence<Is...>)
|
||||
[&]<auto... Is>(std::index_sequence<Is...>)
|
||||
{
|
||||
const auto is_component_enabled = src_component_flags & component_flag_type{ 1 } << Is;
|
||||
const auto was_component_enabled = (
|
||||
new_entry
|
||||
? static_cast<bool>(dst_component_flags & component_flag_type{ 1 } << Is)
|
||||
: component_flag_type{}
|
||||
);
|
||||
([&] {
|
||||
const auto is_component_enabled = static_cast<bool>(src_component_flags & component_flag_type{ 1 } << Is);
|
||||
const auto was_component_enabled = (
|
||||
new_entry
|
||||
? static_cast<bool>(dst_component_flags & component_flag_type{ 1 } << Is)
|
||||
: false
|
||||
);
|
||||
|
||||
const auto& src_component_array = std::get<Is>(data.component_arrays);
|
||||
auto& dst_component_array = std::get<Is>(m_component_arrays);
|
||||
const auto component_index = it.m_offsets[1 + Is];
|
||||
const auto dst_component_it = dst_component_array.begin() + component_index;
|
||||
const auto src_component_count = is_component_enabled ? vertex_count : count_type{};
|
||||
const auto dst_component_count = was_component_enabled ? dst_vertex_count : count_type{};
|
||||
|
||||
ztu::replace_range(
|
||||
dst_component_array,
|
||||
dst_component_it,
|
||||
dst_component_it + dst_vertex_count,
|
||||
src_component_array.begin(),
|
||||
src_component_array.begin() + vertex_count
|
||||
);
|
||||
const auto& src_component_array = std::get<Is>(data.component_arrays);
|
||||
auto& dst_component_array = std::get<Is>(m_component_arrays);
|
||||
const auto component_index = it.m_offsets[1 + Is];
|
||||
const auto dst_component_it = dst_component_array.begin() + component_index;
|
||||
|
||||
|
||||
ztu::replace_range(
|
||||
dst_component_array,
|
||||
dst_component_it,
|
||||
dst_component_it + dst_component_count,
|
||||
src_component_array.begin(),
|
||||
src_component_array.begin() + src_component_count
|
||||
);
|
||||
}, ...);
|
||||
}
|
||||
(std::index_sequence_for<Ts...>{});
|
||||
|
||||
@@ -404,7 +412,7 @@ void assets::detail::generic_mesh_store<z3d::structure<Ts...>>::remove(const ite
|
||||
|
||||
m_component_flag_counts.erase(m_component_flag_counts.begin() + index);
|
||||
|
||||
[&]<auto... Is>(std::index_sequence<Is>)
|
||||
[&]<auto... Is>(std::index_sequence<Is...>)
|
||||
{
|
||||
([&]{
|
||||
if ( component_flags & component_flag_type{ 1 } << Is)
|
||||
@@ -426,9 +434,9 @@ void assets::detail::generic_mesh_store<z3d::structure<Ts...>>::clear()
|
||||
|
||||
m_ids.clear();
|
||||
m_triangles.clear();
|
||||
[&]<auto... Is>(std::index_sequence<Is>)
|
||||
[&]<auto... Is>(std::index_sequence<Is...>)
|
||||
{
|
||||
std::get<Is>(m_component_arrays).clear();
|
||||
(std::get<Is>(m_component_arrays).clear(), ...);
|
||||
} (std::index_sequence_for<Ts...>{});
|
||||
m_component_flag_counts.clear();
|
||||
m_material_ids.clear();
|
||||
|
||||
@@ -198,7 +198,7 @@ assets::detail::generic_point_cloud_store_iterator<Ts...>::dereference(std::inde
|
||||
template<typename... Ts>
|
||||
std::tuple<std::add_pointer_t<Ts>...> assets::detail::generic_point_cloud_store<z3d::structure<Ts...>>::component_iterators()
|
||||
{
|
||||
return [&]<auto... Is>(std::index_sequence<Is>)
|
||||
return [&]<auto... Is>(std::index_sequence<Is...>)
|
||||
{
|
||||
return std::make_tuple(std::get<Is>(m_component_arrays).data()...);
|
||||
}
|
||||
@@ -208,7 +208,7 @@ std::tuple<std::add_pointer_t<Ts>...> assets::detail::generic_point_cloud_store<
|
||||
template<typename... Ts>
|
||||
std::tuple<std::add_pointer_t<std::add_const_t<Ts>>...> assets::detail::generic_point_cloud_store<z3d::structure<Ts...>>::component_iterators() const
|
||||
{
|
||||
return [&]<auto... Is>(std::index_sequence<Is>)
|
||||
return [&]<auto... Is>(std::index_sequence<Is...>)
|
||||
{
|
||||
return std::make_tuple(std::get<Is>(m_component_arrays).data()...);
|
||||
}
|
||||
@@ -219,7 +219,7 @@ template<typename... Ts>
|
||||
std::array<typename assets::detail::generic_point_cloud_store<z3d::structure<Ts...>>::count_type, 1 + sizeof...(Ts)>
|
||||
assets::detail::generic_point_cloud_store<z3d::structure<Ts...>>::array_counts() const
|
||||
{
|
||||
return [&]<auto... Is>(std::index_sequence<Is>)
|
||||
return [&]<auto... Is>(std::index_sequence<Is...>)
|
||||
{
|
||||
return std::array{
|
||||
std::get<Is>(m_component_arrays).size()...
|
||||
@@ -268,18 +268,20 @@ bool assets::detail::generic_point_cloud_store<z3d::structure<Ts...>>::unsafe_in
|
||||
: std::numeric_limits<count_type>::max()
|
||||
);
|
||||
|
||||
[&]<auto... Is>(std::integer_sequence<Is...>)
|
||||
[&]<auto... Is>(std::index_sequence<Is...>)
|
||||
{
|
||||
const auto& component_array = std::get<Is>(data.component_arrays);
|
||||
if (not component_array.empty())
|
||||
{
|
||||
// TODO check count
|
||||
const auto component_count = static_cast<count_type>(component_array.size());
|
||||
if (component_count != 0 and component_count < vertex_count)
|
||||
([&] {
|
||||
const auto& component_array = std::get<Is>(data.component_arrays);
|
||||
if (not component_array.empty())
|
||||
{
|
||||
vertex_count = component_count;
|
||||
// TODO check count
|
||||
const auto component_count = static_cast<count_type>(component_array.size());
|
||||
if (component_count != 0 and component_count < vertex_count)
|
||||
{
|
||||
vertex_count = component_count;
|
||||
}
|
||||
}
|
||||
}
|
||||
}, ...);
|
||||
}
|
||||
(std::index_sequence_for<Ts...>{});
|
||||
|
||||
@@ -305,27 +307,29 @@ bool assets::detail::generic_point_cloud_store<z3d::structure<Ts...>>::unsafe_in
|
||||
m_component_flag_counts[index] = src_component_flag_count;
|
||||
}
|
||||
|
||||
[&]<auto... Is>(std::integer_sequence<Is...>)
|
||||
[&]<auto... Is>(std::index_sequence<Is...>)
|
||||
{
|
||||
const auto is_component_enabled = src_component_flags & component_flag_type{ 1 } << Is;
|
||||
const auto was_component_enabled = (
|
||||
new_entry
|
||||
? static_cast<bool>(dst_component_flags & component_flag_type{ 1 } << Is)
|
||||
: component_flag_type{}
|
||||
);
|
||||
([&] {
|
||||
const auto is_component_enabled = src_component_flags & component_flag_type{ 1 } << Is;
|
||||
const auto was_component_enabled = (
|
||||
new_entry
|
||||
? static_cast<bool>(dst_component_flags & component_flag_type{ 1 } << Is)
|
||||
: component_flag_type{}
|
||||
);
|
||||
|
||||
const auto& src_component_array = std::get<Is>(data.component_arrays);
|
||||
auto& dst_component_array = std::get<Is>(m_component_arrays);
|
||||
const auto component_index = it.m_offsets[1 + Is];
|
||||
const auto dst_component_it = dst_component_array.begin() + component_index;
|
||||
const auto& src_component_array = std::get<Is>(data.component_arrays);
|
||||
auto& dst_component_array = std::get<Is>(m_component_arrays);
|
||||
const auto component_index = it.m_offsets[1 + Is];
|
||||
const auto dst_component_it = dst_component_array.begin() + component_index;
|
||||
|
||||
ztu::replace_range(
|
||||
dst_component_array,
|
||||
dst_component_it,
|
||||
dst_component_it + dst_vertex_count,
|
||||
src_component_array.begin(),
|
||||
src_component_array.begin() + vertex_count
|
||||
);
|
||||
ztu::replace_range(
|
||||
dst_component_array,
|
||||
dst_component_it,
|
||||
dst_component_it + dst_vertex_count,
|
||||
src_component_array.begin(),
|
||||
src_component_array.begin() + vertex_count
|
||||
);
|
||||
}, ...);
|
||||
}
|
||||
(std::index_sequence_for<Ts...>{});
|
||||
|
||||
@@ -368,7 +372,7 @@ void assets::detail::generic_point_cloud_store<z3d::structure<Ts...>>::remove(co
|
||||
|
||||
m_component_flag_counts.erase(m_component_flag_counts.begin() + index);
|
||||
|
||||
[&]<auto... Is>(std::index_sequence<Is>)
|
||||
[&]<auto... Is>(std::index_sequence<Is...>)
|
||||
{
|
||||
([&]{
|
||||
if ( component_flags & component_flag_type{ 1 } << Is)
|
||||
@@ -387,9 +391,9 @@ void assets::detail::generic_point_cloud_store<z3d::structure<Ts...>>::clear()
|
||||
auto lock = std::unique_lock{ m_mutex };
|
||||
|
||||
m_ids.clear();
|
||||
[&]<auto... Is>(std::index_sequence<Is>)
|
||||
[&]<auto... Is>(std::index_sequence<Is...>)
|
||||
{
|
||||
std::get<Is>(m_component_arrays).clear();
|
||||
(std::get<Is>(m_component_arrays).clear(), ...);
|
||||
} (std::index_sequence_for<Ts...>{});
|
||||
m_component_flag_counts.clear();
|
||||
}
|
||||
|
||||
@@ -27,12 +27,12 @@ assets::pose_list_store_iterator<Char>::pose_list_store_iterator(
|
||||
|
||||
template<typename Char>
|
||||
typename assets::pose_list_store_iterator<Char>::reference assets::pose_list_store_iterator<Char>::operator*() const {
|
||||
return dereference(std::index_sequence_for<Char>{});
|
||||
return dereference();
|
||||
}
|
||||
|
||||
template<typename Char>
|
||||
assets::pose_list_store_iterator<Char>& assets::pose_list_store_iterator<Char>::operator++() {
|
||||
adjust_offsets(std::index_sequence_for<Char>{}, 1);
|
||||
calc_offset(1);
|
||||
++m_index;
|
||||
return *this;
|
||||
}
|
||||
@@ -46,7 +46,7 @@ assets::pose_list_store_iterator<Char> assets::pose_list_store_iterator<Char>::o
|
||||
|
||||
template<typename Char>
|
||||
assets::pose_list_store_iterator<Char>& assets::pose_list_store_iterator<Char>::operator--() {
|
||||
adjust_offsets(std::index_sequence_for<Char>{}, -1);
|
||||
calc_offset(-1);
|
||||
--m_index;
|
||||
return *this;
|
||||
}
|
||||
@@ -61,7 +61,7 @@ assets::pose_list_store_iterator<Char> assets::pose_list_store_iterator<Char>::o
|
||||
template<typename Char>
|
||||
assets::pose_list_store_iterator<Char>& assets::pose_list_store_iterator<Char>::operator+=(const difference_type n)
|
||||
{
|
||||
adjust_offsets(std::index_sequence_for<Char>{}, n);
|
||||
calc_offset(n);
|
||||
m_index += n;
|
||||
return *this;
|
||||
}
|
||||
|
||||
@@ -30,12 +30,12 @@ assets::shader_source_store_iterator<Char>::shader_source_store_iterator(
|
||||
|
||||
template<typename Char>
|
||||
typename assets::shader_source_store_iterator<Char>::reference assets::shader_source_store_iterator<Char>::operator*() const {
|
||||
return dereference(std::index_sequence_for<Char>{});
|
||||
return dereference();
|
||||
}
|
||||
|
||||
template<typename Char>
|
||||
assets::shader_source_store_iterator<Char>& assets::shader_source_store_iterator<Char>::operator++() {
|
||||
adjust_offsets(std::index_sequence_for<Char>{}, 1);
|
||||
calc_offset(1);
|
||||
++m_index;
|
||||
return *this;
|
||||
}
|
||||
@@ -49,7 +49,7 @@ assets::shader_source_store_iterator<Char> assets::shader_source_store_iterator<
|
||||
|
||||
template<typename Char>
|
||||
assets::shader_source_store_iterator<Char>& assets::shader_source_store_iterator<Char>::operator--() {
|
||||
adjust_offsets(std::index_sequence_for<Char>{}, -1);
|
||||
calc_offset(-1);
|
||||
--m_index;
|
||||
return *this;
|
||||
}
|
||||
@@ -64,7 +64,7 @@ assets::shader_source_store_iterator<Char> assets::shader_source_store_iterator<
|
||||
template<typename Char>
|
||||
assets::shader_source_store_iterator<Char>& assets::shader_source_store_iterator<Char>::operator+=(const difference_type n)
|
||||
{
|
||||
adjust_offsets(std::index_sequence_for<Char>{}, n);
|
||||
calc_offset(n);
|
||||
m_index += n;
|
||||
return *this;
|
||||
}
|
||||
@@ -172,7 +172,7 @@ assets::shader_source_store_iterator<Char>::dereference() const
|
||||
);
|
||||
}
|
||||
|
||||
bool assets::shader_source_store::insert(const id_type id, const data_type& data)
|
||||
inline bool assets::shader_source_store::insert(const id_type id, const data_type& data)
|
||||
{
|
||||
auto lock = std::unique_lock{ m_mutex };
|
||||
|
||||
@@ -181,10 +181,21 @@ bool assets::shader_source_store::insert(const id_type id, const data_type& data
|
||||
return insert(result.first, id, data);
|
||||
}
|
||||
|
||||
inline std::pair<assets::shader_source_store::iterator, bool> assets::shader_source_store::find(id_type id)
|
||||
{
|
||||
auto lock = std::shared_lock{ m_mutex };
|
||||
|
||||
return unsafe_find(id);
|
||||
}
|
||||
|
||||
template<typename... Ts>
|
||||
bool assets::shader_source_store::insert(iterator it, const id_type id, const data_type& data)
|
||||
inline std::pair<assets::shader_source_store::const_iterator, bool> assets::shader_source_store::find(id_type id) const
|
||||
{
|
||||
auto lock = std::shared_lock{ m_mutex };
|
||||
|
||||
return unsafe_find(id);
|
||||
}
|
||||
|
||||
inline bool assets::shader_source_store::unsafe_insert(iterator it, const id_type id, const data_type& data)
|
||||
{
|
||||
auto lock = std::unique_lock{ m_mutex };
|
||||
|
||||
@@ -223,10 +234,8 @@ bool assets::shader_source_store::insert(iterator it, const id_type id, const da
|
||||
return new_entry;
|
||||
}
|
||||
|
||||
inline std::pair<assets::shader_source_store::iterator, bool> assets::shader_source_store::find(id_type id)
|
||||
inline std::pair<assets::shader_source_store::iterator, bool> assets::shader_source_store::unsafe_find(id_type id)
|
||||
{
|
||||
auto lock = std::shared_lock{ m_mutex };
|
||||
|
||||
const auto it = std::ranges::lower_bound(m_ids, id);
|
||||
|
||||
const auto found = it != m_ids.end() and *it == id;
|
||||
@@ -235,10 +244,8 @@ inline std::pair<assets::shader_source_store::iterator, bool> assets::shader_sou
|
||||
return { begin() + index, found };
|
||||
}
|
||||
|
||||
inline std::pair<assets::shader_source_store::const_iterator, bool> assets::shader_source_store::find(id_type id) const
|
||||
inline std::pair<assets::shader_source_store::const_iterator, bool> assets::shader_source_store::unsafe_find(id_type id) const
|
||||
{
|
||||
auto lock = std::shared_lock{ m_mutex };
|
||||
|
||||
const auto it = std::ranges::lower_bound(m_ids, id);
|
||||
|
||||
const auto found = it != m_ids.end() and *it == id;
|
||||
@@ -251,14 +258,16 @@ void assets::shader_source_store::remove(const iterator& it)
|
||||
{
|
||||
auto lock = std::unique_lock{ m_mutex };
|
||||
|
||||
m_ids.erase(m_ids.begin() + it.m_index);
|
||||
const auto index = it.m_index;
|
||||
|
||||
m_ids.erase(m_ids.begin() + index);
|
||||
|
||||
const auto strings_begin = m_strings.begin() + it.m_offset;
|
||||
const auto strings_end = begin + it.m_lengths[it.m_index] + sizeof('\0');
|
||||
const auto strings_end = strings_begin + it.m_lengths[it.m_index] + sizeof('\0');
|
||||
m_strings.erase(strings_begin, strings_end);
|
||||
|
||||
m_lengths.erase(m_lengths.begin() + it.m_index);
|
||||
m_metadata.erase(m_metadata.begin() + it.m_index);
|
||||
m_lengths.erase(m_lengths.begin() + index);
|
||||
m_metadata.erase(m_metadata.begin() + index);
|
||||
}
|
||||
|
||||
void assets::shader_source_store::clear()
|
||||
|
||||
Reference in New Issue
Block a user