Physics Interpolation - Flush transforms after physics tick

Leftover transforms from the physics tick were being flushed during idle, which was causing problems for physics interpolation.

This PR flushes the transforms at the end of the physics tick when physics interpolation is active.
This commit is contained in:
lawnjelly 2022-05-04 19:56:06 +01:00 committed by Relintai
parent 77a399398d
commit da628411d2
4 changed files with 12 additions and 0 deletions

View File

@ -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();

View File

@ -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++;

View File

@ -535,6 +535,14 @@ void SceneTree::client_physics_interpolation_remove_spatial(SelfList<Spatial> *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++;

View File

@ -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();