56 lines
1.4 KiB
C++
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;
|
|
}
|