Browse Source

AnimatedTexture: Fix crash when loaded from a thread

Pedro J. Estébanez 1 year ago
parent
commit
e6d930b31f
2 changed files with 7 additions and 1 deletions
  1. 6 1
      scene/resources/animated_texture.cpp
  2. 1 0
      scene/resources/animated_texture.h

+ 6 - 1
scene/resources/animated_texture.cpp

@@ -270,13 +270,18 @@ void AnimatedTexture::_bind_methods() {
 	BIND_CONSTANT(MAX_FRAMES);
 	BIND_CONSTANT(MAX_FRAMES);
 }
 }
 
 
+void AnimatedTexture::_finish_non_thread_safe_setup() {
+	RenderingServer::get_singleton()->connect("frame_pre_draw", callable_mp(this, &AnimatedTexture::_update_proxy));
+}
+
 AnimatedTexture::AnimatedTexture() {
 AnimatedTexture::AnimatedTexture() {
 	//proxy = RS::get_singleton()->texture_create();
 	//proxy = RS::get_singleton()->texture_create();
 	proxy_ph = RS::get_singleton()->texture_2d_placeholder_create();
 	proxy_ph = RS::get_singleton()->texture_2d_placeholder_create();
 	proxy = RS::get_singleton()->texture_proxy_create(proxy_ph);
 	proxy = RS::get_singleton()->texture_proxy_create(proxy_ph);
 
 
 	RenderingServer::get_singleton()->texture_set_force_redraw_if_visible(proxy, true);
 	RenderingServer::get_singleton()->texture_set_force_redraw_if_visible(proxy, true);
-	RenderingServer::get_singleton()->connect("frame_pre_draw", callable_mp(this, &AnimatedTexture::_update_proxy));
+
+	MessageQueue::get_main_singleton()->push_callable(callable_mp(this, &AnimatedTexture::_finish_non_thread_safe_setup));
 }
 }
 
 
 AnimatedTexture::~AnimatedTexture() {
 AnimatedTexture::~AnimatedTexture() {

+ 1 - 0
scene/resources/animated_texture.h

@@ -65,6 +65,7 @@ private:
 	uint64_t prev_ticks = 0;
 	uint64_t prev_ticks = 0;
 
 
 	void _update_proxy();
 	void _update_proxy();
+	void _finish_non_thread_safe_setup();
 
 
 protected:
 protected:
 	static void _bind_methods();
 	static void _bind_methods();