summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJFonS <joan.fonssanchez@gmail.com>2020-01-07 11:35:34 +0100
committerJFonS <joan.fonssanchez@gmail.com>2020-01-07 11:35:34 +0100
commit4e10c6202473c24735b4b5afee8db19846a8779e (patch)
tree73a97ec870a50301986e65d6e3247316fccc3af8
parent2ee6f42759f8617781458f46cf64b5d97f63d8a8 (diff)
Make NoiseTexture threading more robust
Fixes crash when a NoiseTexture was freed before the generation thread finished.
-rw-r--r--modules/opensimplex/noise_texture.cpp12
1 files changed, 8 insertions, 4 deletions
diff --git a/modules/opensimplex/noise_texture.cpp b/modules/opensimplex/noise_texture.cpp
index e0cdfb33b4..aa1c822813 100644
--- a/modules/opensimplex/noise_texture.cpp
+++ b/modules/opensimplex/noise_texture.cpp
@@ -53,6 +53,10 @@ NoiseTexture::NoiseTexture() {
NoiseTexture::~NoiseTexture() {
VS::get_singleton()->free(texture);
+ if (noise_thread) {
+ Thread::wait_to_finish(noise_thread);
+ memdelete(noise_thread);
+ }
}
void NoiseTexture::_bind_methods() {
@@ -73,6 +77,7 @@ void NoiseTexture::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_bump_strength"), &NoiseTexture::get_bump_strength);
ClassDB::bind_method(D_METHOD("_update_texture"), &NoiseTexture::_update_texture);
+ ClassDB::bind_method(D_METHOD("_queue_update"), &NoiseTexture::_queue_update);
ClassDB::bind_method(D_METHOD("_generate_texture"), &NoiseTexture::_generate_texture);
ClassDB::bind_method(D_METHOD("_thread_done", "image"), &NoiseTexture::_thread_done);
@@ -130,8 +135,6 @@ void NoiseTexture::_queue_update() {
Ref<Image> NoiseTexture::_generate_texture() {
- update_queued = false;
-
if (noise.is_null()) return Ref<Image>();
Ref<Image> image;
@@ -171,17 +174,18 @@ void NoiseTexture::_update_texture() {
Ref<Image> image = _generate_texture();
_set_texture_data(image);
}
+ update_queued = false;
}
void NoiseTexture::set_noise(Ref<OpenSimplexNoise> p_noise) {
if (p_noise == noise)
return;
if (noise.is_valid()) {
- noise->disconnect(CoreStringNames::get_singleton()->changed, this, "_update_texture");
+ noise->disconnect(CoreStringNames::get_singleton()->changed, this, "_queue_update");
}
noise = p_noise;
if (noise.is_valid()) {
- noise->connect(CoreStringNames::get_singleton()->changed, this, "_update_texture");
+ noise->connect(CoreStringNames::get_singleton()->changed, this, "_queue_update");
}
_queue_update();
}