From 802bb1a74d30ca4175639366db709ad66e8ce954 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Tue, 30 Jan 2024 21:56:30 +0300 Subject: [PATCH] Call constructors & destructors in ecs attach/detach --- libs/ecs/include/psemek/ecs/container.hpp | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/libs/ecs/include/psemek/ecs/container.hpp b/libs/ecs/include/psemek/ecs/container.hpp index 296f6415..94276f65 100644 --- a/libs/ecs/include/psemek/ecs/container.hpp +++ b/libs/ecs/include/psemek/ecs/container.hpp @@ -448,7 +448,11 @@ namespace psemek::ecs for (auto const & column : data.table->columns()) uuid_helper_.push_back(column->uuid()); - ((data.table->column(std::remove_cvref_t::uuid()) ? 0 : (uuid_helper_.push_back(std::remove_cvref_t::uuid()), 0)), ...); + bool archetype_changed = false; + ((data.table->column(std::remove_cvref_t::uuid()) ? 0 : (archetype_changed = true, uuid_helper_.push_back(std::remove_cvref_t::uuid()), 0)), ...); + + if (archetype_changed) + data.table->trigger_destructors(*this, data.row); auto table = table_container_.get(uuid_helper_); @@ -479,6 +483,9 @@ namespace psemek::ecs ((accessor.get>() = std::forward(components)), ...); uuid_helper_.clear(); + + if (archetype_changed) + table->trigger_constructors(*this, data.row); } template @@ -493,8 +500,13 @@ namespace psemek::ecs if (!uuid_set_helper_.contains(column->uuid())) uuid_helper_.push_back(column->uuid()); + bool const archetype_changed = sizeof...(Components) > 0; + auto table = table_container_.get(uuid_helper_); + if (archetype_changed) + data.table->trigger_destructors(*this, data.row); + if (!table) { std::vector> columns; @@ -519,6 +531,9 @@ namespace psemek::ecs uuid_set_helper_.clear(); uuid_helper_.clear(); + + if (archetype_changed) + table->trigger_constructors(*this, data.row); } template