@@ -28,7 +28,29 @@ auto provider::association::initialization(
2828) -> void {
2929 auto assoc_ids = ecsact::meta::system_assoc_ids (sys_like_id);
3030 for (auto assoc_id : assoc_ids) {
31+ auto assoc_comp_id =
32+ ecsact::meta::system_assoc_component_id (sys_like_id, assoc_id);
33+ auto assoc_field_ids =
34+ ecsact::meta::system_assoc_fields (sys_like_id, assoc_id);
3135 assoc_view_names.insert ({assoc_id, get_unique_view_name ()});
36+
37+ for (auto field_id : assoc_field_ids) {
38+ auto field_type = ecsact::meta::get_field_type (assoc_comp_id, field_id);
39+ if (field_type.kind == ECSACT_TYPE_KIND_BUILTIN &&
40+ field_type.type .builtin == ECSACT_ENTITY_TYPE) {
41+ auto compo_id = ecsact_id_cast<ecsact_composite_id>(assoc_comp_id);
42+ assoc_fields[compo_id].push_back (field_id);
43+ assoc_composites[assoc_id].insert (compo_id);
44+ } else if (field_type.kind == ECSACT_TYPE_KIND_FIELD_INDEX) {
45+ auto compo_id = field_type.type .field_index .composite_id ;
46+ assoc_fields[compo_id].push_back (field_id);
47+ assoc_composites[assoc_id].insert (compo_id);
48+ } else {
49+ // Should never get here. Association fields may only be an indexed
50+ // field or entity field.
51+ assert (false );
52+ }
53+ }
3254 }
3355}
3456
@@ -84,35 +106,45 @@ auto provider::association::entity_iteration(
84106 make_view_opts.view_var_name = assoc_view_names.at (assoc_id);
85107 make_view_opts.registry_var_name = names.registry_var_name ;
86108
109+ for (auto compo_id : assoc_composites.at (assoc_id)) {
110+ }
111+
87112 util::make_view (ctx, make_view_opts);
88113 }
89114
115+ for (auto && [assoc_id, compo_ids] : assoc_composites) {
116+ for (auto compo_id : compo_ids) {
117+ auto field_ids = assoc_fields.at (compo_id);
118+ auto compo_cpp_ident = cpp_identifier (decl_full_name (compo_id));
119+
120+ ctx.write (std::format (
121+ " {0}.storage({3}.storage<{1}>(static_cast<::entt::id_type>(::ecsact::"
122+ " entt::detail::"
123+ " hash_vals({1}::"
124+ " id, {2}))));\n " ,
125+ assoc_view_names.at (assoc_id),
126+ compo_cpp_ident,
127+ util::comma_delim (
128+ field_ids |
129+ std::views::transform ([&](auto field_id) -> std::string {
130+ return std::format (
131+ " view.get<{}>(entity).{}" ,
132+ compo_cpp_ident,
133+ ecsact::meta::field_name (compo_id, field_id)
134+ );
135+ })
136+ ),
137+ names.registry_var_name
138+ ));
139+ }
140+ }
141+
90142 for (auto assoc_id : ecsact::meta::system_assoc_ids (sys_like_id)) {
91143 auto assoc_comp_id =
92144 ecsact::meta::system_assoc_component_id (sys_like_id, assoc_id);
93145 auto assoc_field_ids =
94146 ecsact::meta::system_assoc_fields (sys_like_id, assoc_id);
95147 auto assoc_comp_cpp_ident = cpp_identifier (decl_full_name (assoc_comp_id));
96-
97- ctx.write (std::format (
98- " {0}.storage({3}.storage<{1}>(static_cast<::entt::id_type>(::ecsact::"
99- " entt::detail::"
100- " hash_vals({1}::"
101- " id, {2}))));\n " ,
102- assoc_view_names.at (assoc_id),
103- assoc_comp_cpp_ident,
104- util::comma_delim (
105- assoc_field_ids |
106- std::views::transform ([&](auto field_id) -> std::string {
107- return std::format (
108- " view.get<{}>(entity).{}" ,
109- assoc_comp_cpp_ident,
110- ecsact::meta::field_name (assoc_comp_id, field_id)
111- );
112- })
113- ),
114- names.registry_var_name
115- ));
116148 }
117149
118150 for (auto assoc_id : ecsact::meta::system_assoc_ids (sys_like_id)) {
0 commit comments