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
parent 912e22821d
commit df7fab51a3
4 changed files with 12 additions and 0 deletions

View file

@ -68,6 +68,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

@ -2257,6 +2257,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

@ -525,6 +525,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

@ -306,6 +306,7 @@ public:
virtual void init();
virtual bool iteration(float p_time);
virtual void iteration_end();
virtual bool idle(float p_time);
virtual void finish();