Fix materials' shaders not updated if loaded on a non-main thread

This commit is contained in:
Pedro J. Estébanez 2023-05-31 12:50:27 +02:00
parent 6101240231
commit 197b54370a
1 changed files with 6 additions and 2 deletions

View File

@ -88,9 +88,13 @@ void Material::_mark_initialized(const Callable &p_queue_shader_change_callable)
if (ResourceLoader::is_within_load() && Thread::get_caller_id() != Thread::get_main_id()) {
DEV_ASSERT(init_state != INIT_STATE_READY);
if (init_state == INIT_STATE_UNINITIALIZED) { // Prevent queueing twice.
// Queue an individual update of this material (the ResourceLoader knows how to handle deferred calls safely).
p_queue_shader_change_callable.call_deferred();
// Let's mark this material as being initialized.
init_state = INIT_STATE_INITIALIZING;
// Knowing that the ResourceLoader will eventually feed deferred calls into the main message queue, let's do these:
// 1. Queue setting the init state to INIT_STATE_READY finally.
callable_mp(this, &Material::_mark_initialized).bind(p_queue_shader_change_callable).call_deferred();
// 2. Queue an individual update of this material.
p_queue_shader_change_callable.call_deferred();
}
} else {
// Straightforward conditions.