Support removing entities while iterating in util::ecs
This commit is contained in:
parent
b519391f83
commit
c6f971a36f
1 changed files with 12 additions and 4 deletions
|
|
@ -93,7 +93,7 @@ namespace psemek::util
|
|||
|
||||
auto visit = [&](auto * ... ptrs)
|
||||
{
|
||||
if constexpr (std::is_invocable_v<Behavior, typename Components::data & ..., typename Behavior::context &>)
|
||||
if constexpr (std::is_invocable_v<Behavior, typename Components::data & ..., typename Behavior::context const &>)
|
||||
{
|
||||
behavior(*ptrs..., ctx);
|
||||
}
|
||||
|
|
@ -119,7 +119,10 @@ namespace psemek::util
|
|||
if (*list == i)
|
||||
{
|
||||
ctx.entity = i;
|
||||
ctx.remove = false;
|
||||
std::apply(visit, cptrs);
|
||||
if (ctx.remove)
|
||||
remove_entity(i);
|
||||
}
|
||||
std::apply(increment, cptrs);
|
||||
++list;
|
||||
|
|
@ -128,12 +131,15 @@ namespace psemek::util
|
|||
else
|
||||
{
|
||||
// packed
|
||||
std::size_t const size = entity_count();
|
||||
for (std::size_t i = 0; i < size; ++i)
|
||||
for (std::size_t i = 0; i < entity_count(); ++i)
|
||||
{
|
||||
ctx.entity = i;
|
||||
ctx.remove = false;
|
||||
std::apply(visit, cptrs);
|
||||
std::apply(increment, cptrs);
|
||||
if (ctx.remove)
|
||||
remove_entity(i);
|
||||
else
|
||||
std::apply(increment, cptrs);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -323,6 +329,8 @@ namespace psemek::util
|
|||
|
||||
component_ptrs components;
|
||||
|
||||
mutable bool remove = false;
|
||||
|
||||
template <typename Component>
|
||||
Component & get() const
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue