40 const auto scaled_timestep = dt * m_time_scale;
51 auto& egg = egg_group.get<egg_component>(entity_id);
52 if (egg.incubation_phase >= 1.0f)
58 egg.incubation_phase += scaled_timestep /
egg.incubation_period;
61 if (
egg.incubation_phase >= 1.0f)
63 const auto& genome = *egg_group.get<ant_genome_component>(entity_id).genome;
64 const auto layer_mask = registry.get<scene_component>(entity_id).layer_mask;
65 auto& rigid_body = *registry.get<rigid_body_component>(entity_id).body;
68 const auto egg_scale = rigid_body.get_scale().x();
69 const auto first_instar_scale = egg_scale * genome.larva->phenes.front().first_instar_scale;
70 const auto final_instar_scale = egg_scale;
73 const auto growth_rate = (final_instar_scale - first_instar_scale) / genome.larva->phenes.front().development_period;
76 registry.erase<egg_component>(entity_id);
79 registry.erase<scene_component>(entity_id);
80 registry.emplace<scene_component>(entity_id, std::make_shared<scene::skeletal_mesh>(genome.larva->phenes.front().model), layer_mask);
83 rigid_body.set_scale(first_instar_scale);
84 rigid_body.set_previous_scale(first_instar_scale);
87 larva_component larva;
88 larva.development_period = genome.larva->phenes.front().development_period;
89 larva.spinning_period = genome.larva->phenes.front().spinning_period;
90 registry.emplace<larva_component>(entity_id, std::move(larva));
93 registry.emplace<isometric_growth_component>(entity_id, growth_rate);
107 auto& larva = larva_group.get<larva_component>(entity_id);
109 if (larva.development_phase < 1.0f)
112 larva.development_phase += scaled_timestep / larva.development_period;
115 if (larva.development_phase >= 1.0f)
117 const auto& rigid_body = *registry.get<rigid_body_component>(entity_id).body;
118 const auto& genome = *larva_group.get<ant_genome_component>(entity_id).genome;
119 const auto layer_mask = registry.get<scene_component>(entity_id).layer_mask;
122 registry.remove<isometric_growth_component>(entity_id);
125 auto cocoon_mesh = std::make_shared<scene::static_mesh>(genome.pupa->phenes.front().cocoon_model);
126 cocoon_mesh->set_transform(rigid_body.get_transform());
129 auto cocoon_material = std::make_shared<render::material>(*cocoon_mesh->get_model()->get_groups().front().material);
132 larva.spinning_phase_matvar = std::static_pointer_cast<render::matvar_float>(cocoon_material->get_variable(
"spinning_phase"));
133 larva.spinning_phase_matvar->set(0.0f);
136 cocoon_mesh->set_material(0, std::move(cocoon_material));
139 larva.cocoon_eid = registry.create();
140 registry.emplace<scene_component>(larva.cocoon_eid, std::move(cocoon_mesh), layer_mask);
143 else if (
larva.spinning_phase < 1.0f)
145 const auto& genome = *larva_group.get<ant_genome_component>(entity_id).genome;
148 larva.spinning_phase += scaled_timestep / larva.spinning_period;
151 larva.spinning_phase_matvar->set(larva.spinning_phase);
154 if (larva.spinning_phase >= 1.0f)
157 registry.erase<larva_component>(entity_id);
160 registry.erase<scene_component>(entity_id);
164 pupa.development_period = genome.pupa->phenes.front().development_period;
165 registry.emplace<pupa_component>(entity_id, std::move(pupa));
180 auto& pupa = pupa_group.get<pupa_component>(entity_id);
181 if (pupa.development_phase >= 1.0f)
187 pupa.development_phase += scaled_timestep /
pupa.development_period;
190 if (
pupa.development_phase >= 1.0f)
192 const auto& genome = *pupa_group.get<ant_genome_component>(entity_id).genome;
195 registry.erase<pupa_component>(entity_id);
Abstract base class for updatable systems.
entity::registry & registry
Registry on which the system operate.
entt::registry registry
Component registry type.
Egg incubation parameters.
Larval development parameters.
Pupal development parameters.