diff options
-rw-r--r-- | modules/gdscript/gdscript.cpp | 6 | ||||
-rw-r--r-- | scene/animation/animation_player.cpp | 14 | ||||
-rw-r--r-- | scene/animation/animation_player.h | 1 | ||||
-rw-r--r-- | scene/main/window.cpp | 6 |
4 files changed, 23 insertions, 4 deletions
diff --git a/modules/gdscript/gdscript.cpp b/modules/gdscript/gdscript.cpp index 05c2558417..87f21bf568 100644 --- a/modules/gdscript/gdscript.cpp +++ b/modules/gdscript/gdscript.cpp @@ -2106,6 +2106,12 @@ void GDScriptLanguage::thread_enter() { } void GDScriptLanguage::thread_exit() { + // This thread may have been created before GDScript was up + // (which also means it can't have run any GDScript code at all). + if (!GDScript::func_ptrs_to_update_thread_local) { + return; + } + GDScript::_fixup_thread_function_bookkeeping(); bool destroy = false; diff --git a/scene/animation/animation_player.cpp b/scene/animation/animation_player.cpp index a89bf8c8c1..6e7aec379b 100644 --- a/scene/animation/animation_player.cpp +++ b/scene/animation/animation_player.cpp @@ -151,7 +151,7 @@ void AnimationPlayer::_notification(int p_what) { if (!Engine::get_singleton()->is_editor_hint() && animation_set.has(autoplay)) { set_active(true); play(autoplay); - seek(0, true); + _check_immediately_after_start(); } } break; } @@ -522,8 +522,9 @@ void AnimationPlayer::seek(double p_time, bool p_update, bool p_update_only) { return; } - playback.current.pos = p_time; + _check_immediately_after_start(); + playback.current.pos = p_time; if (!playback.current.from) { if (playback.assigned) { ERR_FAIL_COND_MSG(!animation_set.has(playback.assigned), vformat("Animation not found: %s.", playback.assigned)); @@ -534,7 +535,6 @@ void AnimationPlayer::seek(double p_time, bool p_update, bool p_update_only) { } } - playback.started = false; // Start has already gone by seeking, delta does not need to be 0 in the internal process. playback.seeked = true; if (p_update) { _process_animation(0, p_update_only); @@ -543,10 +543,16 @@ void AnimationPlayer::seek(double p_time, bool p_update, bool p_update_only) { } void AnimationPlayer::advance(double p_time) { - playback.started = false; // Start has already gone by advancing, delta does not need to be 0 in the internal process. + _check_immediately_after_start(); AnimationMixer::advance(p_time); } +void AnimationPlayer::_check_immediately_after_start() { + if (playback.started) { + _process_animation(0); // Force process current key for Discrete/Method/Audio/AnimationPlayback. Then, started flag is cleared. + } +} + bool AnimationPlayer::is_valid() const { return (playback.current.from); } diff --git a/scene/animation/animation_player.h b/scene/animation/animation_player.h index 0bab586088..74f9323e2b 100644 --- a/scene/animation/animation_player.h +++ b/scene/animation/animation_player.h @@ -111,6 +111,7 @@ private: void _process_playback_data(PlaybackData &cd, double p_delta, float p_blend, bool p_seeked, bool p_started, bool p_is_current = false); void _blend_playback_data(double p_delta, bool p_started); void _stop_internal(bool p_reset, bool p_keep_state); + void _check_immediately_after_start(); bool playing = false; diff --git a/scene/main/window.cpp b/scene/main/window.cpp index 2c28dc31d6..823b0c6f5b 100644 --- a/scene/main/window.cpp +++ b/scene/main/window.cpp @@ -681,6 +681,9 @@ void Window::_propagate_window_notification(Node *p_node, int p_notification) { void Window::_event_callback(DisplayServer::WindowEvent p_event) { switch (p_event) { case DisplayServer::WINDOW_EVENT_MOUSE_ENTER: { + if (!is_inside_tree()) { + return; + } Window *root = get_tree()->get_root(); if (root->gui.windowmanager_window_over) { #ifdef DEV_ENABLED @@ -696,6 +699,9 @@ void Window::_event_callback(DisplayServer::WindowEvent p_event) { } } break; case DisplayServer::WINDOW_EVENT_MOUSE_EXIT: { + if (!is_inside_tree()) { + return; + } Window *root = get_tree()->get_root(); if (!root->gui.windowmanager_window_over) { #ifdef DEV_ENABLED |