diff --git a/core/os/main_loop.h b/core/os/main_loop.h index b9b2b688a..5685bbdaf 100644 --- a/core/os/main_loop.h +++ b/core/os/main_loop.h @@ -67,6 +67,7 @@ public: virtual void init(); virtual bool iteration(float p_time); + virtual void iteration_end() {} virtual bool idle(float p_time); virtual void finish(); diff --git a/main/main.cpp b/main/main.cpp index 7927bf46a..c36ccfc8f 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -2215,6 +2215,8 @@ bool Main::iteration() { message_queue->flush(); + OS::get_singleton()->get_main_loop()->iteration_end(); + physics_process_ticks = MAX(physics_process_ticks, OS::get_singleton()->get_ticks_usec() - physics_begin); // keep the largest one for reference physics_process_max = MAX(OS::get_singleton()->get_ticks_usec() - physics_begin, physics_process_max); Engine::get_singleton()->_physics_frames++; diff --git a/scene/main/scene_tree.cpp b/scene/main/scene_tree.cpp index 62008ca25..c2268828c 100644 --- a/scene/main/scene_tree.cpp +++ b/scene/main/scene_tree.cpp @@ -535,6 +535,14 @@ void SceneTree::client_physics_interpolation_remove_spatial(SelfList *p _client_physics_interpolation._spatials_list.remove(p_elem); } +void SceneTree::iteration_end() { + // When physics interpolation is active, we want all pending transforms + // to be flushed to the VisualServer before finishing a physics tick. + if (_physics_interpolation_enabled) { + flush_transform_notifications(); + } +} + bool SceneTree::iteration(float p_time) { root_lock++; diff --git a/scene/main/scene_tree.h b/scene/main/scene_tree.h index bfe44e670..fda8c88f3 100644 --- a/scene/main/scene_tree.h +++ b/scene/main/scene_tree.h @@ -305,6 +305,7 @@ public: virtual void init(); virtual bool iteration(float p_time); + virtual void iteration_end(); virtual bool idle(float p_time); virtual void finish();