1
0
Fork 0

Physics Interpolation - Auto-reset on `set_physics_interpolation_mode()`

Fixes historical bug where auto-reset wasn't working correctly.
Also fixes process modes on Cameras when mode is changed.
This commit is contained in:
lawnjelly 2025-02-10 10:14:50 +00:00
parent 36d90c73a8
commit e46993f0db
4 changed files with 11 additions and 4 deletions

View File

@ -300,6 +300,7 @@ void Camera2D::_notification(int p_what) {
// Force the limits etc. to update. // Force the limits etc. to update.
_interpolation_data.xform_curr = get_camera_transform(); _interpolation_data.xform_curr = get_camera_transform();
_interpolation_data.xform_prev = _interpolation_data.xform_curr; _interpolation_data.xform_prev = _interpolation_data.xform_curr;
_update_process_callback();
} break; } break;
case NOTIFICATION_SUSPENDED: case NOTIFICATION_SUSPENDED:

View File

@ -230,6 +230,7 @@ void Camera3D::_notification(int p_what) {
if (is_inside_tree()) { if (is_inside_tree()) {
_interpolation_data.xform_curr = get_global_transform(); _interpolation_data.xform_curr = get_global_transform();
_interpolation_data.xform_prev = _interpolation_data.xform_curr; _interpolation_data.xform_prev = _interpolation_data.xform_curr;
_update_process_mode();
} }
} break; } break;

View File

@ -921,12 +921,12 @@ void Node::set_physics_interpolation_mode(PhysicsInterpolationMode p_mode) {
} break; } break;
} }
// If swapping from interpolated to non-interpolated, use this as an extra means to cause a reset. _propagate_physics_interpolated(interpolate);
if (is_physics_interpolated() && !interpolate && is_inside_tree()) {
// Auto-reset on changing interpolation mode.
if (is_physics_interpolated() && is_inside_tree()) {
propagate_notification(NOTIFICATION_RESET_PHYSICS_INTERPOLATION); propagate_notification(NOTIFICATION_RESET_PHYSICS_INTERPOLATION);
} }
_propagate_physics_interpolated(interpolate);
} }
void Node::reset_physics_interpolation() { void Node::reset_physics_interpolation() {

View File

@ -482,6 +482,11 @@ void SceneTree::set_physics_interpolation_enabled(bool p_enabled) {
_physics_interpolation_enabled = p_enabled; _physics_interpolation_enabled = p_enabled;
RenderingServer::get_singleton()->set_physics_interpolation_enabled(p_enabled); RenderingServer::get_singleton()->set_physics_interpolation_enabled(p_enabled);
// Perform an auto reset on the root node for convenience for the user.
if (root) {
root->reset_physics_interpolation();
}
} }
bool SceneTree::is_physics_interpolation_enabled() const { bool SceneTree::is_physics_interpolation_enabled() const {