diff --git a/scene/3d/xr_nodes.cpp b/scene/3d/xr_nodes.cpp index 4ab6e4cab925..43def378bd5d 100644 --- a/scene/3d/xr_nodes.cpp +++ b/scene/3d/xr_nodes.cpp @@ -714,6 +714,12 @@ void XROrigin3D::_set_current(bool p_enabled, bool p_update_others) { ERR_FAIL_NULL(xr_server); xr_server->set_world_origin(get_global_transform()); + + if (is_physics_interpolated()) { + set_process_internal(true); + } + } else if (is_physics_interpolated()) { + set_process_internal(false); } // Check if we need to update our other origin nodes accordingly @@ -784,10 +790,16 @@ void XROrigin3D::_notification(int p_what) { case NOTIFICATION_LOCAL_TRANSFORM_CHANGED: case NOTIFICATION_TRANSFORM_CHANGED: { - if (current && !Engine::get_singleton()->is_editor_hint()) { + if (current && !Engine::get_singleton()->is_editor_hint() && !is_physics_interpolated_and_enabled()) { xr_server->set_world_origin(get_global_transform()); } } break; + + case NOTIFICATION_INTERNAL_PROCESS: { + if (current && !Engine::get_singleton()->is_editor_hint() && is_physics_interpolated_and_enabled()) { + xr_server->set_world_origin(get_global_transform_interpolated()); + } + } break; } if (current) { @@ -800,3 +812,9 @@ void XROrigin3D::_notification(int p_what) { } } } + +void XROrigin3D::_physics_interpolated_changed() { + if (current && !Engine::get_singleton()->is_editor_hint()) { + set_process_internal(is_physics_interpolated()); + } +} diff --git a/scene/3d/xr_nodes.h b/scene/3d/xr_nodes.h index 805456012f3c..cbf8ad5dc0d7 100644 --- a/scene/3d/xr_nodes.h +++ b/scene/3d/xr_nodes.h @@ -198,6 +198,7 @@ class XROrigin3D : public Node3D { protected: void _notification(int p_what); static void _bind_methods(); + virtual void _physics_interpolated_changed() override; public: PackedStringArray get_configuration_warnings() const override;