Skip to content

Commit f5b8693

Browse files
authored
fix: entity created callback called too often (#111)
1 parent 5223bcf commit f5b8693

File tree

2 files changed

+48
-34
lines changed

2 files changed

+48
-34
lines changed

ecsact/entt/wrapper/core.hh

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -216,43 +216,43 @@ inline auto _trigger_create_entity_events(
216216
) -> void {
217217
using ecsact::entt::detail::created_entity;
218218

219-
if(!events_collector.has_entity_created_callback()) {
220-
return;
221-
}
222-
223219
auto& reg = ecsact::entt::get_registry(registry_id);
224220

225-
::entt::basic_view created_view{
226-
reg.template storage<created_entity>(),
227-
};
221+
if(events_collector.has_entity_created_callback()) {
222+
::entt::basic_view created_view{
223+
reg.template storage<created_entity>(),
224+
};
228225

229-
for(ecsact::entt::entity_id entity : created_view) {
230-
events_collector.invoke_entity_created_callback(
231-
entity,
232-
created_view.template get<created_entity>(entity).placeholder_entity_id
233-
);
226+
for(ecsact::entt::entity_id entity : created_view) {
227+
events_collector.invoke_entity_created_callback(
228+
entity,
229+
created_view.template get<created_entity>(entity).placeholder_entity_id
230+
);
231+
}
234232
}
233+
234+
reg.clear<created_entity>();
235235
}
236236

237237
inline auto _trigger_destroy_entity_events(
238238
ecsact_registry_id registry_id,
239239
ecsact::entt::detail::execution_events_collector& events_collector
240240
) -> void {
241-
auto& reg = ecsact::entt::get_registry(registry_id);
242-
243241
using ecsact::entt::detail::destroyed_entity;
244242

245-
if(!events_collector.has_entity_destroyed_callback()) {
246-
return;
247-
}
243+
auto& reg = ecsact::entt::get_registry(registry_id);
248244

249-
::entt::basic_view destroy_view{
250-
reg.template storage<destroyed_entity>(),
251-
};
245+
if(events_collector.has_entity_destroyed_callback()) {
246+
::entt::basic_view destroy_view{
247+
reg.template storage<destroyed_entity>(),
248+
};
252249

253-
for(ecsact::entt::entity_id entity : destroy_view) {
254-
events_collector.invoke_entity_destroyed_callback(entity);
250+
for(ecsact::entt::entity_id entity : destroy_view) {
251+
events_collector.invoke_entity_destroyed_callback(entity);
252+
}
255253
}
254+
255+
reg.clear<destroyed_entity>();
256256
}
257257

258258
template<typename C>

test/runtime_test.cc

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -789,7 +789,8 @@ TEST(Core, CreateAndDestroyEntity) {
789789
ecsact_placeholder_entity_id placeholder_entity_id;
790790
};
791791

792-
auto info = callback_info{};
792+
auto created_entity = ecsact_invalid_entity_id;
793+
auto info = std::optional<callback_info>{};
793794
auto options = ecsact::core::execution_options{};
794795
auto evc = ecsact::core::execution_events_collector<>{};
795796

@@ -798,42 +799,55 @@ TEST(Core, CreateAndDestroyEntity) {
798799
ecsact_entity_id entity_id,
799800
ecsact_placeholder_entity_id placeholder_entity_id
800801
) {
801-
info.entity_created = true;
802-
info.entity_id = entity_id;
803-
info.placeholder_entity_id = placeholder_entity_id;
802+
info = callback_info{};
803+
info->entity_created = true;
804+
info->entity_id = entity_id;
805+
info->placeholder_entity_id = placeholder_entity_id;
806+
created_entity = entity_id;
804807
}
805808
);
806809

807810
evc.set_entity_destroyed_callback([&](ecsact_entity_id entity_id) {
808-
info.entity_destroyed = true;
809-
info.entity_id = entity_id;
811+
info = callback_info{};
812+
info->entity_destroyed = true;
813+
info->entity_id = entity_id;
810814
});
811815

812816
options.create_entity(static_cast<ecsact_placeholder_entity_id>(42))
813817
.add_component(&component_a);
814818
auto exec_err = reg.execute_systems(std::array{options}, evc);
815819
EXPECT_EQ(exec_err, ECSACT_EXEC_SYS_OK);
816820

817-
ASSERT_TRUE(info.entity_created);
818-
ASSERT_FALSE(info.entity_destroyed);
821+
ASSERT_TRUE(info.has_value());
822+
ASSERT_TRUE(info->entity_created);
823+
ASSERT_FALSE(info->entity_destroyed);
824+
ASSERT_EQ(info->entity_id, created_entity);
819825
ASSERT_EQ(reg.count_entities(), 1);
820826

821827
EXPECT_EQ(
822-
info.placeholder_entity_id,
828+
info->placeholder_entity_id,
823829
static_cast<ecsact_placeholder_entity_id>(42)
824830
);
825831

826-
auto comp = reg.get_component<runtime_test::EntityTesting>(info.entity_id);
832+
auto comp = reg.get_component<runtime_test::EntityTesting>(info->entity_id);
827833

828834
ASSERT_EQ(comp.a, 6);
829835

830836
options.clear();
831-
options.destroy_entity(info.entity_id);
837+
info = std::nullopt;
832838

839+
// Make sure create doesn't get called again
840+
exec_err = reg.execute_systems(std::array{options}, evc);
841+
ASSERT_EQ(exec_err, ECSACT_EXEC_SYS_OK);
842+
ASSERT_FALSE(info.has_value());
843+
844+
options.destroy_entity(created_entity);
845+
info = std::nullopt;
833846
exec_err = reg.execute_systems(std::array{options}, evc);
834847
ASSERT_EQ(exec_err, ECSACT_EXEC_SYS_OK);
835848
ASSERT_EQ(reg.count_entities(), 0);
836-
ASSERT_TRUE(info.entity_destroyed);
849+
ASSERT_TRUE(info.has_value());
850+
ASSERT_TRUE(info->entity_destroyed);
837851
}
838852

839853
TEST(Core, MultiPkgUpdate) {

0 commit comments

Comments
 (0)