From 739b0c0c3f51c12cb2421d221e1a8d8e2d61f092 Mon Sep 17 00:00:00 2001 From: lawnjelly Date: Tue, 14 Jun 2022 10:19:44 +0100 Subject: [PATCH] Physics Interpolation - fix stale interpolation data when unhiding A previous optimization prevented instances being added to the interpolation lists when hidden to save processing. This caused a regression when unhiding nodes outside of the physics tick - the interpolated transforms would be stale until the next physics tick, causing a glitch. This PR readds instances immediately to the interpolation lists when they are unhidden, preventing this glitch. --- servers/visual/visual_server_scene.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/servers/visual/visual_server_scene.cpp b/servers/visual/visual_server_scene.cpp index 2d3ba6601..b3f7d3d54 100644 --- a/servers/visual/visual_server_scene.cpp +++ b/servers/visual/visual_server_scene.cpp @@ -989,6 +989,16 @@ void VisualServerScene::instance_set_visible(RID p_instance, bool p_visible) { instance->visible = p_visible; + // Special case for physics interpolation, we want to ensure the interpolated data is up to date + if (_interpolation_data.interpolation_enabled && p_visible && instance->interpolated && instance->scenario && !instance->on_interpolate_list) { + // Do all the extra work we normally do on instance_set_transform(), because this is optimized out for hidden instances. + // This prevents a glitch of stale interpolation transform data when unhiding before the next physics tick. + instance->interpolation_method = TransformInterpolator::find_method(instance->transform_prev.basis, instance->transform_curr.basis); + _interpolation_data.instance_interpolate_update_list.push_back(p_instance); + instance->on_interpolate_list = true; + _instance_queue_update(instance, true); + } + // give the opportunity for the spatial partitioning scene to use a special implementation of visibility // for efficiency (supported in BVH but not octree)