Skip to content

Commit 36940aa

Browse files
committed
Wrote more tests separated storages correctly
1 parent b94675b commit 36940aa

File tree

10 files changed

+176
-82
lines changed

10 files changed

+176
-82
lines changed

ecsact/entt/detail/apply_pending.hh

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

ecsact/entt/detail/internal_markers.hh

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

3838
template<typename C>
3939
requires(!std::is_empty_v<C>)
40-
struct beforechange_storage {
41-
C value;
42-
bool has_update_occurred = false;
40+
struct exec_beforechange_storage {
41+
C value;
4342
};
4443

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

4850
template<typename C>
4951
struct pending_add;
@@ -111,7 +113,7 @@ auto remove_system_markers_if_needed( //
111113
}
112114

113115
template<typename C>
114-
auto add_sys_changestorage_if_needed( //
116+
auto add_exec_itr_beforechange_if_needed( //
115117
::entt::registry&,
116118
ecsact::entt::entity_id
117119
) -> void {

ecsact/entt/wrapper/core.hh

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ 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
false
@@ -70,6 +70,7 @@ inline auto add_component( //
7070
}
7171

7272
ecsact::entt::detail::add_system_markers_if_needed<C>(reg, entity);
73+
ecsact::entt::detail::add_exec_itr_beforechange_if_needed<C>(reg, entity);
7374
}
7475

7576
return err;
@@ -98,14 +99,15 @@ inline auto add_component_exec_options( //
9899
if constexpr(std::is_empty_v<C>) {
99100
reg.emplace<C>(entity);
100101
} else {
101-
reg.emplace<detail::beforechange_storage<C>>(
102+
reg.emplace<detail::exec_beforechange_storage<C>>(
102103
entity,
103104
*static_cast<const C*>(component_data)
104105
);
105106
reg.emplace<C>(entity, *static_cast<const C*>(component_data));
106107
}
107108
reg.template emplace_or_replace<component_added<C>>(entity);
108109
ecsact::entt::detail::add_system_markers_if_needed<C>(reg, entity);
110+
ecsact::entt::detail::add_exec_itr_beforechange_if_needed<C>(reg, entity);
109111
}
110112

111113
return err;
@@ -174,7 +176,7 @@ auto remove_component(
174176

175177
reg.remove<C>(entity);
176178
if constexpr(!std::is_empty_v<C>) {
177-
reg.remove<detail::beforechange_storage<C>>(entity);
179+
reg.remove<detail::exec_beforechange_storage<C>>(entity);
178180
}
179181
reg.template remove<component_added<C>>(entity);
180182
reg.template remove<component_updated<C>>(entity);
@@ -207,7 +209,7 @@ auto remove_component_exec_options(
207209
reg.template emplace_or_replace<component_removed<C>>(entity);
208210

209211
if constexpr(!std::is_empty_v<C>) {
210-
reg.template remove<detail::beforechange_storage<C>>(entity);
212+
reg.template remove<detail::exec_beforechange_storage<C>>(entity);
211213
}
212214

213215
ecsact::entt::detail::remove_system_markers_if_needed<C>(reg, entity);
@@ -296,7 +298,7 @@ auto _trigger_update_component_event(
296298
ecsact::entt::detail::execution_events_collector& events_collector
297299
) -> void {
298300
using ecsact::entt::component_updated;
299-
using ecsact::entt::detail::beforechange_storage;
301+
using ecsact::entt::detail::exec_beforechange_storage;
300302

301303
if(!events_collector.has_update_callback()) {
302304
return;
@@ -306,12 +308,13 @@ auto _trigger_update_component_event(
306308
if constexpr(!C::transient && !std::is_empty_v<C>) {
307309
::entt::basic_view changed_view{
308310
reg.template storage<C>(),
309-
reg.template storage<beforechange_storage<C>>(),
311+
reg.template storage<exec_beforechange_storage<C>>(),
310312
reg.template storage<component_updated<C>>(),
311313
};
312314

313315
for(ecsact::entt::entity_id entity : changed_view) {
314-
auto& before = changed_view.template get<beforechange_storage<C>>(entity);
316+
auto& before =
317+
changed_view.template get<exec_beforechange_storage<C>>(entity);
315318
auto& current = changed_view.template get<C>(entity);
316319
before.has_update_occurred = false;
317320

@@ -405,33 +408,31 @@ inline auto prepare_component(ecsact_registry_id registry_id) -> void {
405408
reg.template storage<component_removed<C>>();
406409

407410
if constexpr(!std::is_empty_v<C>) {
408-
reg.storage<detail::beforechange_storage<C>>();
411+
reg.storage<detail::exec_beforechange_storage<C>>();
409412
reg.template storage<component_updated<C>>();
410413
}
411414
}
412415

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

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

422424
if(before_comp.value != current_comp) {
423-
std::cout << "Component has changed!" << std::endl;
424425
return true;
425426
}
426-
std::cout << "Component has not changed!" << std::endl;
427427
return false;
428428
}
429429

430430
template<typename C>
431-
auto update_beforechange_storage(entt::entity_id entity, ::entt::registry& reg)
431+
auto update_exec_itr_beforechange(entt::entity_id entity, ::entt::registry& reg)
432432
-> void {
433433
auto comp = reg.get<C>(entity);
434-
auto& beforechange_comp = reg.get<detail::beforechange_storage<C>>(entity);
434+
auto& beforechange_comp =
435+
reg.get<detail::exec_itr_beforechange_storage<C>>(entity);
435436

436437
beforechange_comp.value = comp;
437438
}

ecsact/entt/wrapper/dynamic.hh

Lines changed: 4 additions & 4 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);
@@ -34,7 +34,6 @@ auto context_add(
3434
} else {
3535
const C* component = static_cast<const C*>(component_data);
3636
registry.template emplace_or_replace<pending_add<C>>(entity, *component);
37-
3837
registry.template remove<beforeremove_storage<C>>(entity);
3938
}
4039

@@ -144,7 +143,7 @@ auto context_update(
144143
const void* in_component_data
145144
) -> void {
146145
using ecsact::entt::component_updated;
147-
using ecsact::entt::detail::beforechange_storage;
146+
using ecsact::entt::detail::exec_beforechange_storage;
148147
// TODO(Kelwan): for remove, beforeremove_storage
149148

150149
auto entity = context->entity;
@@ -153,7 +152,8 @@ auto context_update(
153152
const auto& in_component = *static_cast<const C*>(in_component_data);
154153

155154
auto& current_component = registry.template get<C>(entity);
156-
auto& beforechange = registry.template get<beforechange_storage<C>>(entity);
155+
auto& beforechange =
156+
registry.template get<exec_beforechange_storage<C>>(entity);
157157
if(!beforechange.has_update_occurred) {
158158
beforechange.value = current_component;
159159
beforechange.has_update_occurred = true;

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)