#include "terrain_modifier_noise.h" #include "core/math/math_defs.h" #include "macros.h" void TerrainModifierNoise::_bind_methods() { BIND_HPROPERTY(Variant::OBJECT, noise, PROPERTY_HINT_RESOURCE_TYPE, "Noise"); BIND_PROPERTY(Variant::FLOAT, noise_amplitude); } void TerrainModifierNoise::push_changed_all() { push_changed(get_bounds()); } void TerrainModifierNoise::noise_changed() { { SharedMutex::LockExclusive exclusive{ this->lock }; this->noise_buffer = this->noise->duplicate_deep(); } push_changed_all(); } float TerrainModifierNoise::evaluate_at(Vector2 world_coordinates, float before) { SharedMutex::LockShared shared{ this->lock }; if (this->noise.is_null()) { return before; } return 0.5f * this->noise_amplitude * (this->noise_buffer->get_noise_2d(world_coordinates.x, world_coordinates.y) + 1.f) + before; } void TerrainModifierNoise::set_noise(Ref noise) { { SharedMutex::LockExclusive exclusive{ this->lock }; if (noise == this->noise) { return; } if (this->noise.is_valid()) { this->noise->disconnect_changed(callable_mp(this, &self_type::noise_changed)); } if (noise.is_valid()) { noise->connect_changed(callable_mp(this, &self_type::noise_changed)); set_bounds({ { -Math::INF, -Math::INF }, { Math::INF, Math::INF } }); } else { set_bounds({ { 0, 0 }, { 0, 0 } }); } this->noise = noise; } noise_changed(); } Ref TerrainModifierNoise::get_noise() const { return this->noise; }