Skip to content

Commit 9a09fc3

Browse files
committed
Physics Interpolation - Fix XR Nodes to work with SceneTreeFTI
1 parent 1a1cc0f commit 9a09fc3

File tree

2 files changed

+17
-58
lines changed

2 files changed

+17
-58
lines changed

scene/3d/xr/xr_nodes.cpp

Lines changed: 15 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -72,36 +72,13 @@ void XRCamera3D::_removed_tracker(const StringName &p_tracker_name, int p_tracke
7272

7373
void XRCamera3D::_pose_changed(const Ref<XRPose> &p_pose) {
7474
if (p_pose->get_name() == pose_name) {
75-
Node3D *parent = Object::cast_to<Node3D>(get_parent());
76-
77-
if (is_inside_tree() && parent && parent->is_physics_interpolated_and_enabled() && !is_set_as_top_level() && !is_physics_interpolated()) {
78-
pose_offset = p_pose->get_adjusted_transform();
79-
} else {
80-
set_transform(p_pose->get_adjusted_transform());
81-
}
75+
set_transform(p_pose->get_adjusted_transform());
8276
}
8377
}
8478

85-
void XRCamera3D::_notification(int p_what) {
86-
switch (p_what) {
87-
case NOTIFICATION_ENTER_TREE: {
88-
if (!Engine::get_singleton()->is_editor_hint()) {
89-
set_desired_process_modes(true, false);
90-
}
91-
} break;
92-
93-
case NOTIFICATION_INTERNAL_PROCESS: {
94-
if (!is_inside_tree() || is_physics_interpolated() || Engine::get_singleton()->is_editor_hint()) {
95-
break;
96-
}
97-
98-
Node3D *parent = Object::cast_to<Node3D>(get_parent());
99-
100-
if (parent && parent->is_physics_interpolated_and_enabled() && !is_set_as_top_level()) {
101-
set_global_transform(parent->get_global_transform_interpolated() * pose_offset);
102-
}
103-
} break;
104-
}
79+
void XRCamera3D::_physics_interpolated_changed() {
80+
Camera3D::_physics_interpolated_changed();
81+
update_configuration_warnings();
10582
}
10683

10784
PackedStringArray XRCamera3D::get_configuration_warnings() const {
@@ -114,6 +91,10 @@ PackedStringArray XRCamera3D::get_configuration_warnings() const {
11491
if (parent && origin == nullptr) {
11592
warnings.push_back(RTR("XRCamera3D may not function as expected without an XROrigin3D node as its parent."));
11693
};
94+
95+
if (is_physics_interpolated()) {
96+
warnings.push_back(RTR("XRCamera3D should have physics_interpolation_mode set to OFF in order to avoid jitter."));
97+
}
11798
}
11899

119100
return warnings;
@@ -431,13 +412,7 @@ void XRNode3D::_removed_tracker(const StringName &p_tracker_name, int p_tracker_
431412

432413
void XRNode3D::_pose_changed(const Ref<XRPose> &p_pose) {
433414
if (p_pose.is_valid() && p_pose->get_name() == pose_name) {
434-
Node3D *parent = Object::cast_to<Node3D>(get_parent());
435-
436-
if (is_inside_tree() && parent && parent->is_physics_interpolated_and_enabled() && !is_set_as_top_level() && !is_physics_interpolated()) {
437-
pose_offset = p_pose->get_adjusted_transform();
438-
} else {
439-
set_transform(p_pose->get_adjusted_transform());
440-
}
415+
set_transform(p_pose->get_adjusted_transform());
441416
_set_has_tracking_data(p_pose->get_has_tracking_data());
442417
}
443418
}
@@ -477,26 +452,8 @@ void XRNode3D::_update_visibility() {
477452
}
478453
}
479454

480-
void XRNode3D::_notification(int p_what) {
481-
switch (p_what) {
482-
case NOTIFICATION_ENTER_TREE: {
483-
if (!Engine::get_singleton()->is_editor_hint()) {
484-
set_process_internal(true);
485-
}
486-
} break;
487-
488-
case NOTIFICATION_INTERNAL_PROCESS: {
489-
if (!is_inside_tree() || is_physics_interpolated() || Engine::get_singleton()->is_editor_hint()) {
490-
break;
491-
}
492-
493-
Node3D *parent = Object::cast_to<Node3D>(get_parent());
494-
495-
if (parent && parent->is_physics_interpolated_and_enabled() && !is_set_as_top_level()) {
496-
set_global_transform(parent->get_global_transform_interpolated() * pose_offset);
497-
}
498-
} break;
499-
}
455+
void XRNode3D::_physics_interpolated_changed() {
456+
update_configuration_warnings();
500457
}
501458

502459
XRNode3D::XRNode3D() {
@@ -540,6 +497,10 @@ PackedStringArray XRNode3D::get_configuration_warnings() const {
540497
if (pose_name == "") {
541498
warnings.push_back(RTR("No pose is set."));
542499
}
500+
501+
if (is_physics_interpolated()) {
502+
warnings.push_back(RTR("XRNode3D should have physics_interpolation_mode set to OFF in order to avoid jitter."));
503+
}
543504
}
544505

545506
return warnings;

scene/3d/xr/xr_nodes.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,13 @@ class XRCamera3D : public Camera3D {
4646
StringName tracker_name = "head";
4747
StringName pose_name = SceneStringName(default_);
4848
Ref<XRPositionalTracker> tracker;
49-
Transform3D pose_offset;
5049

5150
void _bind_tracker();
5251
void _unbind_tracker();
5352
void _changed_tracker(const StringName &p_tracker_name, int p_tracker_type);
5453
void _removed_tracker(const StringName &p_tracker_name, int p_tracker_type);
5554
void _pose_changed(const Ref<XRPose> &p_pose);
56-
void _notification(int p_what);
55+
virtual void _physics_interpolated_changed() override;
5756

5857
public:
5958
PackedStringArray get_configuration_warnings() const override;
@@ -81,7 +80,6 @@ class XRNode3D : public Node3D {
8180
StringName pose_name = SceneStringName(default_);
8281
bool has_tracking_data = false;
8382
bool show_when_tracked = false;
84-
Transform3D pose_offset;
8583

8684
protected:
8785
Ref<XRPositionalTracker> tracker;
@@ -98,7 +96,7 @@ class XRNode3D : public Node3D {
9896
void _set_has_tracking_data(bool p_has_tracking_data);
9997

10098
void _update_visibility();
101-
void _notification(int p_what);
99+
virtual void _physics_interpolated_changed() override;
102100

103101
public:
104102
void _validate_property(PropertyInfo &p_property) const;

0 commit comments

Comments
 (0)