From 9a09fc35d8ab0314e852a00702217dac3798824f Mon Sep 17 00:00:00 2001 From: Asaduji <39374509+Asaduji@users.noreply.github.com> Date: Mon, 5 May 2025 21:56:34 +0200 Subject: [PATCH] Physics Interpolation - Fix XR Nodes to work with `SceneTreeFTI` --- scene/3d/xr/xr_nodes.cpp | 69 +++++++++------------------------------- scene/3d/xr/xr_nodes.h | 6 ++-- 2 files changed, 17 insertions(+), 58 deletions(-) diff --git a/scene/3d/xr/xr_nodes.cpp b/scene/3d/xr/xr_nodes.cpp index 12e01c78511..48a7cc07ac4 100644 --- a/scene/3d/xr/xr_nodes.cpp +++ b/scene/3d/xr/xr_nodes.cpp @@ -72,36 +72,13 @@ void XRCamera3D::_removed_tracker(const StringName &p_tracker_name, int p_tracke void XRCamera3D::_pose_changed(const Ref &p_pose) { if (p_pose->get_name() == pose_name) { - Node3D *parent = Object::cast_to(get_parent()); - - if (is_inside_tree() && parent && parent->is_physics_interpolated_and_enabled() && !is_set_as_top_level() && !is_physics_interpolated()) { - pose_offset = p_pose->get_adjusted_transform(); - } else { - set_transform(p_pose->get_adjusted_transform()); - } + set_transform(p_pose->get_adjusted_transform()); } } -void XRCamera3D::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_ENTER_TREE: { - if (!Engine::get_singleton()->is_editor_hint()) { - set_desired_process_modes(true, false); - } - } break; - - case NOTIFICATION_INTERNAL_PROCESS: { - if (!is_inside_tree() || is_physics_interpolated() || Engine::get_singleton()->is_editor_hint()) { - break; - } - - Node3D *parent = Object::cast_to(get_parent()); - - if (parent && parent->is_physics_interpolated_and_enabled() && !is_set_as_top_level()) { - set_global_transform(parent->get_global_transform_interpolated() * pose_offset); - } - } break; - } +void XRCamera3D::_physics_interpolated_changed() { + Camera3D::_physics_interpolated_changed(); + update_configuration_warnings(); } PackedStringArray XRCamera3D::get_configuration_warnings() const { @@ -114,6 +91,10 @@ PackedStringArray XRCamera3D::get_configuration_warnings() const { if (parent && origin == nullptr) { warnings.push_back(RTR("XRCamera3D may not function as expected without an XROrigin3D node as its parent.")); }; + + if (is_physics_interpolated()) { + warnings.push_back(RTR("XRCamera3D should have physics_interpolation_mode set to OFF in order to avoid jitter.")); + } } return warnings; @@ -431,13 +412,7 @@ void XRNode3D::_removed_tracker(const StringName &p_tracker_name, int p_tracker_ void XRNode3D::_pose_changed(const Ref &p_pose) { if (p_pose.is_valid() && p_pose->get_name() == pose_name) { - Node3D *parent = Object::cast_to(get_parent()); - - if (is_inside_tree() && parent && parent->is_physics_interpolated_and_enabled() && !is_set_as_top_level() && !is_physics_interpolated()) { - pose_offset = p_pose->get_adjusted_transform(); - } else { - set_transform(p_pose->get_adjusted_transform()); - } + set_transform(p_pose->get_adjusted_transform()); _set_has_tracking_data(p_pose->get_has_tracking_data()); } } @@ -477,26 +452,8 @@ void XRNode3D::_update_visibility() { } } -void XRNode3D::_notification(int p_what) { - switch (p_what) { - case NOTIFICATION_ENTER_TREE: { - if (!Engine::get_singleton()->is_editor_hint()) { - set_process_internal(true); - } - } break; - - case NOTIFICATION_INTERNAL_PROCESS: { - if (!is_inside_tree() || is_physics_interpolated() || Engine::get_singleton()->is_editor_hint()) { - break; - } - - Node3D *parent = Object::cast_to(get_parent()); - - if (parent && parent->is_physics_interpolated_and_enabled() && !is_set_as_top_level()) { - set_global_transform(parent->get_global_transform_interpolated() * pose_offset); - } - } break; - } +void XRNode3D::_physics_interpolated_changed() { + update_configuration_warnings(); } XRNode3D::XRNode3D() { @@ -540,6 +497,10 @@ PackedStringArray XRNode3D::get_configuration_warnings() const { if (pose_name == "") { warnings.push_back(RTR("No pose is set.")); } + + if (is_physics_interpolated()) { + warnings.push_back(RTR("XRNode3D should have physics_interpolation_mode set to OFF in order to avoid jitter.")); + } } return warnings; diff --git a/scene/3d/xr/xr_nodes.h b/scene/3d/xr/xr_nodes.h index 65ba86abd20..a02d5f3f2d9 100644 --- a/scene/3d/xr/xr_nodes.h +++ b/scene/3d/xr/xr_nodes.h @@ -46,14 +46,13 @@ protected: StringName tracker_name = "head"; StringName pose_name = SceneStringName(default_); Ref tracker; - Transform3D pose_offset; void _bind_tracker(); void _unbind_tracker(); void _changed_tracker(const StringName &p_tracker_name, int p_tracker_type); void _removed_tracker(const StringName &p_tracker_name, int p_tracker_type); void _pose_changed(const Ref &p_pose); - void _notification(int p_what); + virtual void _physics_interpolated_changed() override; public: PackedStringArray get_configuration_warnings() const override; @@ -81,7 +80,6 @@ private: StringName pose_name = SceneStringName(default_); bool has_tracking_data = false; bool show_when_tracked = false; - Transform3D pose_offset; protected: Ref tracker; @@ -98,7 +96,7 @@ protected: void _set_has_tracking_data(bool p_has_tracking_data); void _update_visibility(); - void _notification(int p_what); + virtual void _physics_interpolated_changed() override; public: void _validate_property(PropertyInfo &p_property) const;