diff --git a/libs/util/include/psemek/util/ecs.hpp b/libs/util/include/psemek/util/ecs.hpp index 44a2f8e1..d645c291 100644 --- a/libs/util/include/psemek/util/ecs.hpp +++ b/libs/util/include/psemek/util/ecs.hpp @@ -93,7 +93,7 @@ namespace psemek::util auto visit = [&](auto * ... ptrs) { - if constexpr (std::is_invocable_v) + if constexpr (std::is_invocable_v) { 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 Component & get() const {