diff options
Diffstat (limited to 'modules/opensimplex/noise_texture.cpp')
-rw-r--r-- | modules/opensimplex/noise_texture.cpp | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/modules/opensimplex/noise_texture.cpp b/modules/opensimplex/noise_texture.cpp index 8e5b04f995..2018f90e9f 100644 --- a/modules/opensimplex/noise_texture.cpp +++ b/modules/opensimplex/noise_texture.cpp @@ -34,7 +34,7 @@ NoiseTexture::NoiseTexture() { update_queued = false; - noise_thread = NULL; + noise_thread = nullptr; regen_queued = false; first_time = true; @@ -50,7 +50,7 @@ NoiseTexture::NoiseTexture() { NoiseTexture::~NoiseTexture() { if (texture.is_valid()) { - VS::get_singleton()->free(texture); + RS::get_singleton()->free(texture); } if (noise_thread) { Thread::wait_to_finish(noise_thread); @@ -100,10 +100,10 @@ void NoiseTexture::_set_texture_data(const Ref<Image> &p_image) { data = p_image; if (data.is_valid()) { if (texture.is_valid()) { - RID new_texture = VS::get_singleton()->texture_2d_create(p_image); - VS::get_singleton()->texture_replace(texture, new_texture); + RID new_texture = RS::get_singleton()->texture_2d_create(p_image); + RS::get_singleton()->texture_replace(texture, new_texture); } else { - texture = VS::get_singleton()->texture_2d_create(p_image); + texture = RS::get_singleton()->texture_2d_create(p_image); } } emit_changed(); @@ -114,7 +114,7 @@ void NoiseTexture::_thread_done(const Ref<Image> &p_image) { _set_texture_data(p_image); Thread::wait_to_finish(noise_thread); memdelete(noise_thread); - noise_thread = NULL; + noise_thread = nullptr; if (regen_queued) { noise_thread = Thread::create(_thread_function, this); regen_queued = false; @@ -137,14 +137,19 @@ void NoiseTexture::_queue_update() { Ref<Image> NoiseTexture::_generate_texture() { - if (noise.is_null()) return Ref<Image>(); + // Prevent memdelete due to unref() on other thread. + Ref<OpenSimplexNoise> ref_noise = noise; + + if (ref_noise.is_null()) { + return Ref<Image>(); + } Ref<Image> image; if (seamless) { - image = noise->get_seamless_image(size.x); + image = ref_noise->get_seamless_image(size.x); } else { - image = noise->get_image(size.x, size.y); + image = ref_noise->get_image(size.x, size.y); } if (as_normalmap) { @@ -254,7 +259,7 @@ int NoiseTexture::get_height() const { RID NoiseTexture::get_rid() const { if (!texture.is_valid()) { - texture = VS::get_singleton()->texture_2d_placeholder_create(); + texture = RS::get_singleton()->texture_2d_placeholder_create(); } return texture; |