Skip to content

Commit 38528aa

Browse files
committed
Wrote more tests separated storages correctly
1 parent 3f5a567 commit 38528aa

File tree

10 files changed

+174
-78
lines changed

10 files changed

+174
-78
lines changed

ecsact/entt/detail/apply_pending.hh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ template<typename C>
2626
auto apply_pending_remove(::entt::registry& registry) -> void {
2727
registry.view<pending_remove<C>>().each([&](auto entity) {
2828
if constexpr(!std::is_empty_v<C>) {
29-
registry.erase<beforechange_storage<C>>(entity);
29+
registry.erase<exec_beforechange_storage<C>>(entity);
3030
}
3131
registry.erase<C>(entity);
3232
});

ecsact/entt/detail/internal_markers.hh

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,15 @@ struct beforeremove_storage<C> {
3737

3838
template<typename C>
3939
requires(!std::is_empty_v<C>)
40-
struct beforechange_storage {
40+
struct exec_beforechange_storage {
4141
C value;
4242
};
4343

4444
template<typename C>
45-
struct component_changed {};
45+
requires(!std::is_empty_v<C>)
46+
struct exec_itr_beforechange_storage {
47+
C value;
48+
};
4649

4750
template<typename C>
4851
struct pending_add;
@@ -110,7 +113,7 @@ auto remove_system_markers_if_needed( //
110113
}
111114

112115
template<typename C>
113-
auto add_sys_changestorage_if_needed( //
116+
auto add_exec_itr_beforechange_if_needed( //
114117
::entt::registry&,
115118
ecsact::entt::entity_id
116119
) -> void {

ecsact/entt/wrapper/core.hh

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -61,14 +61,15 @@ inline auto add_component( //
6161
if constexpr(std::is_empty_v<C>) {
6262
reg.emplace<C>(entity);
6363
} else {
64-
reg.emplace<detail::beforechange_storage<C>>(
64+
reg.emplace<detail::exec_beforechange_storage<C>>(
6565
entity,
6666
*static_cast<const C*>(component_data)
6767
);
6868
reg.emplace<C>(entity, *static_cast<const C*>(component_data));
6969
}
7070

7171
ecsact::entt::detail::add_system_markers_if_needed<C>(reg, entity);
72+
ecsact::entt::detail::add_exec_itr_beforechange_if_needed<C>(reg, entity);
7273
}
7374

7475
return err;
@@ -97,14 +98,15 @@ inline auto add_component_exec_options( //
9798
if constexpr(std::is_empty_v<C>) {
9899
reg.emplace<C>(entity);
99100
} else {
100-
reg.emplace<detail::beforechange_storage<C>>(
101+
reg.emplace<detail::exec_beforechange_storage<C>>(
101102
entity,
102103
*static_cast<const C*>(component_data)
103104
);
104105
reg.emplace<C>(entity, *static_cast<const C*>(component_data));
105106
}
106107
reg.template emplace_or_replace<component_added<C>>(entity);
107108
ecsact::entt::detail::add_system_markers_if_needed<C>(reg, entity);
109+
ecsact::entt::detail::add_exec_itr_beforechange_if_needed<C>(reg, entity);
108110
}
109111

110112
return err;
@@ -173,7 +175,7 @@ auto remove_component(
173175

174176
reg.remove<C>(entity);
175177
if constexpr(!std::is_empty_v<C>) {
176-
reg.remove<detail::beforechange_storage<C>>(entity);
178+
reg.remove<detail::exec_beforechange_storage<C>>(entity);
177179
}
178180
reg.template remove<component_added<C>>(entity);
179181
reg.template remove<component_updated<C>>(entity);
@@ -206,7 +208,7 @@ auto remove_component_exec_options(
206208
reg.template emplace_or_replace<component_removed<C>>(entity);
207209

208210
if constexpr(!std::is_empty_v<C>) {
209-
reg.template remove<detail::beforechange_storage<C>>(entity);
211+
reg.template remove<detail::exec_beforechange_storage<C>>(entity);
210212
}
211213

212214
ecsact::entt::detail::remove_system_markers_if_needed<C>(reg, entity);
@@ -295,7 +297,7 @@ auto _trigger_update_component_event(
295297
ecsact::entt::detail::execution_events_collector& events_collector
296298
) -> void {
297299
using ecsact::entt::component_updated;
298-
using ecsact::entt::detail::beforechange_storage;
300+
using ecsact::entt::detail::exec_beforechange_storage;
299301

300302
if(!events_collector.has_update_callback()) {
301303
return;
@@ -305,12 +307,13 @@ auto _trigger_update_component_event(
305307
if constexpr(!C::transient && !std::is_empty_v<C>) {
306308
::entt::basic_view changed_view{
307309
reg.template storage<C>(),
308-
reg.template storage<beforechange_storage<C>>(),
310+
reg.template storage<exec_beforechange_storage<C>>(),
309311
reg.template storage<component_updated<C>>(),
310312
};
311313

312314
for(ecsact::entt::entity_id entity : changed_view) {
313-
auto& before = changed_view.template get<beforechange_storage<C>>(entity);
315+
auto& before =
316+
changed_view.template get<exec_beforechange_storage<C>>(entity);
314317
auto& current = changed_view.template get<C>(entity);
315318

316319
if(before.value != current) {
@@ -403,33 +406,31 @@ inline auto prepare_component(ecsact_registry_id registry_id) -> void {
403406
reg.template storage<component_removed<C>>();
404407

405408
if constexpr(!std::is_empty_v<C>) {
406-
reg.storage<detail::beforechange_storage<C>>();
409+
reg.storage<detail::exec_beforechange_storage<C>>();
407410
reg.template storage<component_updated<C>>();
408411
}
409412
}
410413

411-
template<typename C>
412-
auto has_component_changed(entt::entity_id entity, ::entt::registry& reg)
413-
-> bool {
414-
using detail::beforechange_storage;
415-
using detail::component_changed;
414+
template<typename C, typename V>
415+
auto has_component_changed(entt::entity_id entity, V& view) -> bool {
416+
using detail::exec_itr_beforechange_storage;
416417

417-
auto current_comp = reg.get<C>(entity);
418-
auto before_comp = reg.get<beforechange_storage<C>>(entity);
418+
const auto& current_comp = view.template get<C>(entity);
419+
const auto& before_comp =
420+
view.template get<exec_itr_beforechange_storage<C>>(entity);
419421

420422
if(before_comp.value != current_comp) {
421-
std::cout << "Component has changed!" << std::endl;
422423
return true;
423424
}
424-
std::cout << "Component has not changed!" << std::endl;
425425
return false;
426426
}
427427

428428
template<typename C>
429-
auto update_beforechange_storage(entt::entity_id entity, ::entt::registry& reg)
429+
auto update_exec_itr_beforechange(entt::entity_id entity, ::entt::registry& reg)
430430
-> void {
431431
auto comp = reg.get<C>(entity);
432-
auto& beforechange_comp = reg.get<detail::beforechange_storage<C>>(entity);
432+
auto& beforechange_comp =
433+
reg.get<detail::exec_itr_beforechange_storage<C>>(entity);
433434

434435
beforechange_comp.value = comp;
435436
}

ecsact/entt/wrapper/dynamic.hh

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ auto context_add(
2020
) -> void {
2121
using ecsact::entt::component_added;
2222
using ecsact::entt::component_removed;
23-
using ecsact::entt::detail::beforechange_storage;
2423
using ecsact::entt::detail::beforeremove_storage;
24+
using ecsact::entt::detail::exec_beforechange_storage;
2525
using ecsact::entt::detail::pending_add;
2626

2727
assert(ecsact_id_cast<ecsact_component_like_id>(C::id) == component_id);
@@ -36,7 +36,8 @@ auto context_add(
3636
registry.template emplace_or_replace<pending_add<C>>(entity, *component);
3737

3838
auto& before_change =
39-
registry.template emplace_or_replace<beforechange_storage<C>>(entity);
39+
registry.template emplace_or_replace<exec_beforechange_storage<C>>(entity
40+
);
4041

4142
before_change.value = *component;
4243

rt_entt_codegen/core/execute_systems.cc

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ auto ecsact::rt_entt_codegen::core::print_execute_systems( //
6868
}
6969

7070
ctx.write("\nupdate_all_beforechange_storage(registry_id);\n");
71+
ctx.write("cleanup_system_notifies(registry_id);\n");
7172

7273
ctx.indentation -= 1;
7374
ctx.write("\n}\n\n");
@@ -90,9 +91,9 @@ auto ecsact::rt_entt_codegen::core::print_execute_systems( //
9091
"trigger_component_events_all(registry_id, events_collector);\n\n"
9192
);
9293
});
93-
ctx.write("cleanup_component_events(registry_id);\n");
94-
ctx.write("cleanup_system_notifies(registry_id);\n");
9594
});
9695

96+
ctx.write("cleanup_component_events(registry_id);\n");
97+
9798
ctx.write("return ECSACT_EXEC_SYS_OK;");
9899
}

rt_entt_codegen/core/system_markers.cc

Lines changed: 39 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -102,37 +102,43 @@ auto ecsact::rt_entt_codegen::core::print_add_sys_beforestorage_fn(
102102
using cc_lang_support::cpp_identifier;
103103
using ecsact::meta::decl_full_name;
104104

105-
// for(auto comp_id : details.all_components) {
106-
// auto comp_name = cpp_identifier(decl_full_name(comp_id));
107-
108-
// ctx.write("template<>\n");
109-
// auto printer =
110-
// method_printer{
111-
// ctx,
112-
// std::format(
113-
// "ecsact::entt::detail::add_sys_changestorage_if_needed< {}>",
114-
// comp_name
115-
// )
116-
// }
117-
// .parameter("::entt::registry&", "reg")
118-
// .parameter("ecsact::entt::entity_id", "entity")
119-
// .return_type("void");
120-
121-
// for(auto system_id : details.all_systems) {
122-
// auto count = ecsact::meta::system_notify_settings_count(system_id);
123-
// auto notify_settings = ecsact::meta::system_notify_settings(system_id);
124-
125-
// for(auto const [comp_id_to_compare, notify_setting] : notify_settings) {
126-
// if(comp_id == static_cast<ecsact_component_id>(comp_id_to_compare)) {
127-
// if(notify_setting == ECSACT_SYS_NOTIFY_ONCHANGE) {
128-
// ctx.write(std::format( //
129-
// "reg.emplace<beforechange_storage<{}>>(entity);\n",
130-
// comp_name
131-
// ));
132-
// break;
133-
// }
134-
// }
135-
// }
136-
// }
137-
// }
105+
auto already_printed_ = std::set<ecsact_component_id>{};
106+
107+
for(auto comp_id : details.all_components) {
108+
auto comp_name = cpp_identifier(decl_full_name(comp_id));
109+
110+
ctx.write("template<>\n");
111+
auto printer =
112+
method_printer{
113+
ctx,
114+
std::format(
115+
"ecsact::entt::detail::add_exec_itr_beforechange_if_needed< {}>",
116+
comp_name
117+
)
118+
}
119+
.parameter("::entt::registry&", "reg")
120+
.parameter("ecsact::entt::entity_id", "entity")
121+
.return_type("void");
122+
123+
for(auto system_id : details.all_systems) {
124+
auto count = ecsact::meta::system_notify_settings_count(system_id);
125+
auto notify_settings = ecsact::meta::system_notify_settings(system_id);
126+
127+
for(auto const [comp_id_to_compare, notify_setting] : notify_settings) {
128+
if(comp_id == static_cast<ecsact_component_id>(comp_id_to_compare)) {
129+
if(notify_setting == ECSACT_SYS_NOTIFY_ONCHANGE) {
130+
if(already_printed_.contains(comp_id)) {
131+
break;
132+
}
133+
already_printed_.insert(comp_id);
134+
ctx.write(std::format( //
135+
"reg.emplace<exec_itr_beforechange_storage<{}>>(entity);\n",
136+
comp_name
137+
));
138+
break;
139+
}
140+
}
141+
}
142+
}
143+
}
138144
}

rt_entt_codegen/core/update_beforechange.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ auto ecsact::rt_entt_codegen::core::print_update_all_beforechange_storage(
3030
auto comp_name = c_identifier(decl_full_name((comp_id)));
3131
auto cpp_comp_name = cpp_identifier(decl_full_name(comp_id));
3232
auto comp_change_name = std::format( //
33-
"ecsact::entt::detail::beforechange_storage<{}>",
33+
"ecsact::entt::detail::exec_itr_beforechange_storage<{}>",
3434
cpp_comp_name
3535
);
3636

@@ -43,7 +43,7 @@ auto ecsact::rt_entt_codegen::core::print_update_all_beforechange_storage(
4343

4444
block(ctx, std::format("for(auto entity: {})", view_name), [&]() {
4545
ctx.write(std::format(
46-
"ecsact::entt::wrapper::core::update_beforechange_storage<{}>(entity, "
46+
"ecsact::entt::wrapper::core::update_exec_itr_beforechange<{}>(entity, "
4747
"reg);\n",
4848
cpp_comp_name
4949
));

rt_entt_codegen/shared/system_util.cc

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -120,18 +120,8 @@ auto ecsact::rt_entt_codegen::system_util::detail::print_system_notify_views(
120120
}
121121

122122
if(notify_setting == ECSACT_SYS_NOTIFY_ONCHANGE) {
123-
// TODO: Implement a component to be checked and added in another PR
124-
// Added when component fields have changed during execution
125-
auto component_changed_str =
126-
std::format("ecsact::entt::component_updated<{}>", cpp_comp_name);
127-
128-
auto sys_onchange_str = std::format(
129-
"ecsact::entt::detail::beforechange_storage<{}>",
130-
cpp_comp_name
131-
);
132-
133-
auto sys_beforechanged_str = std::format(
134-
"ecsact::entt::detail::component_changed<{}>",
123+
auto exec_itr_onchange_str = std::format(
124+
"ecsact::entt::detail::exec_itr_beforechange_storage<{}>",
135125
cpp_comp_name
136126
);
137127

@@ -142,7 +132,7 @@ auto ecsact::rt_entt_codegen::system_util::detail::print_system_notify_views(
142132
view_name,
143133
registry_name,
144134
details,
145-
std::vector{component_changed_str},
135+
std::vector{exec_itr_onchange_str},
146136
std::vector{run_system_comp}
147137
);
148138

0 commit comments

Comments
 (0)