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-01-07 11:14:15 +00:00
parent 5e904cd4df
commit 7c824d1fa5
4 changed files with 11 additions and 5 deletions

View File

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

View File

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

View File

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

View File

@ -537,6 +537,11 @@ void SceneTree::set_physics_interpolation_enabled(bool p_enabled) {
_physics_interpolation_enabled = p_enabled;
VisualServer::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 {