terrain-module/terrain_modifier_composite.cpp

56 lines
1.4 KiB
C++

#include "terrain_modifier_composite.h"
#include "terrain/terrain.h"
void TerrainModifierComposite::update_sub_modifiers() {
for (TerrainModifier *mod : this->sub_modifiers) {
push_changed(mod->get_bounds());
}
this->sub_modifiers.clear();
for (Variant var : get_children()) {
if (TerrainModifier * mod{ cast_to<TerrainModifier>(var) }) {
this->sub_modifiers.push_back(mod);
mod->set_terrain(get_terrain());
push_changed(mod->get_bounds());
}
}
}
void TerrainModifierComposite::terrain_changed(Terrain *terrain) {
for (TerrainModifier *mod : this->sub_modifiers) {
mod->set_terrain(terrain);
}
}
void TerrainModifierComposite::_notification(int what) {
switch (what) {
default:
return;
case NOTIFICATION_ENTER_TREE:
set_notify_transform(true);
if (!is_ready()) {
connect(sig_terrain_changed, callable_mp(this, &self_type::terrain_changed));
}
return;
case NOTIFICATION_TRANSFORM_CHANGED:
for (TerrainModifier *mod : this->sub_modifiers) {
push_changed(mod->get_bounds());
}
return;
case NOTIFICATION_CHILD_ORDER_CHANGED:
if (!is_ready()) {
return;
}
// fall through
case NOTIFICATION_READY:
update_sub_modifiers();
return;
}
}
float TerrainModifierComposite::evaluate_at(Vector2 world_coordinate, float before) {
float result{ 0.f };
for (TerrainModifier *mod : sub_modifiers) {
result = mod->evaluate_at(world_coordinate, result);
}
return result + before;
}