Skip to content

Commit d1f6d4c

Browse files
committed
Merge pull request #92339 from devloglogan/comp-layer-reference-frame
Apply reference frame transform to `OpenXRCompositionLayer` nodes
2 parents 76237c5 + 6a8f2f0 commit d1f6d4c

10 files changed

+45
-12
lines changed

doc/classes/XRServer.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,11 @@
135135
Emitted when an interface is removed.
136136
</description>
137137
</signal>
138+
<signal name="reference_frame_changed">
139+
<description>
140+
Emitted when the reference frame transform changes.
141+
</description>
142+
</signal>
138143
<signal name="tracker_added">
139144
<param index="0" name="tracker_name" type="StringName" />
140145
<param index="1" name="type" type="int" />

modules/openxr/scene/openxr_composition_layer.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,16 @@ void OpenXRCompositionLayer::update_fallback_mesh() {
151151
should_update_fallback_mesh = true;
152152
}
153153

154+
XrPosef OpenXRCompositionLayer::get_openxr_pose() {
155+
Transform3D reference_frame = XRServer::get_singleton()->get_reference_frame();
156+
Transform3D transform = reference_frame.inverse() * get_transform();
157+
Quaternion quat(transform.basis.orthonormalized());
158+
return {
159+
{ (float)quat.x, (float)quat.y, (float)quat.z, (float)quat.w },
160+
{ (float)transform.origin.x, (float)transform.origin.y, (float)transform.origin.z }
161+
};
162+
}
163+
154164
bool OpenXRCompositionLayer::is_viewport_in_use(SubViewport *p_viewport) {
155165
for (const OpenXRCompositionLayer *other_composition_layer : composition_layer_nodes) {
156166
if (other_composition_layer != this && other_composition_layer->is_inside_tree() && other_composition_layer->get_layer_viewport() == p_viewport) {

modules/openxr/scene/openxr_composition_layer.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,8 @@ class OpenXRCompositionLayer : public Node3D {
7777

7878
void update_fallback_mesh();
7979

80+
XrPosef get_openxr_pose();
81+
8082
static Vector<OpenXRCompositionLayer *> composition_layer_nodes;
8183
bool is_viewport_in_use(SubViewport *p_viewport);
8284

modules/openxr/scene/openxr_composition_layer_cylinder.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ OpenXRCompositionLayerCylinder::OpenXRCompositionLayerCylinder() {
5252
aspect_ratio, // aspectRatio
5353
};
5454
openxr_layer_provider = memnew(OpenXRViewportCompositionLayerProvider((XrCompositionLayerBaseHeader *)&composition_layer));
55+
XRServer::get_singleton()->connect("reference_frame_changed", callable_mp(this, &OpenXRCompositionLayerCylinder::update_transform));
5556
}
5657

5758
OpenXRCompositionLayerCylinder::~OpenXRCompositionLayerCylinder() {
@@ -131,14 +132,15 @@ Ref<Mesh> OpenXRCompositionLayerCylinder::_create_fallback_mesh() {
131132
void OpenXRCompositionLayerCylinder::_notification(int p_what) {
132133
switch (p_what) {
133134
case NOTIFICATION_LOCAL_TRANSFORM_CHANGED: {
134-
Transform3D transform = get_transform();
135-
Quaternion quat(transform.basis.orthonormalized());
136-
composition_layer.pose.orientation = { (float)quat.x, (float)quat.y, (float)quat.z, (float)quat.w };
137-
composition_layer.pose.position = { (float)transform.origin.x, (float)transform.origin.y, (float)transform.origin.z };
135+
update_transform();
138136
} break;
139137
}
140138
}
141139

140+
void OpenXRCompositionLayerCylinder::update_transform() {
141+
composition_layer.pose = get_openxr_pose();
142+
}
143+
142144
void OpenXRCompositionLayerCylinder::set_radius(float p_radius) {
143145
ERR_FAIL_COND(p_radius <= 0);
144146
radius = p_radius;

modules/openxr/scene/openxr_composition_layer_cylinder.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ class OpenXRCompositionLayerCylinder : public OpenXRCompositionLayer {
5050

5151
void _notification(int p_what);
5252

53+
void update_transform();
54+
5355
virtual Ref<Mesh> _create_fallback_mesh() override;
5456

5557
public:

modules/openxr/scene/openxr_composition_layer_equirect.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ OpenXRCompositionLayerEquirect::OpenXRCompositionLayerEquirect() {
5353
-lower_vertical_angle, // lowerVerticalAngle
5454
};
5555
openxr_layer_provider = memnew(OpenXRViewportCompositionLayerProvider((XrCompositionLayerBaseHeader *)&composition_layer));
56+
XRServer::get_singleton()->connect("reference_frame_changed", callable_mp(this, &OpenXRCompositionLayerEquirect::update_transform));
5657
}
5758

5859
OpenXRCompositionLayerEquirect::~OpenXRCompositionLayerEquirect() {
@@ -139,14 +140,15 @@ Ref<Mesh> OpenXRCompositionLayerEquirect::_create_fallback_mesh() {
139140
void OpenXRCompositionLayerEquirect::_notification(int p_what) {
140141
switch (p_what) {
141142
case NOTIFICATION_LOCAL_TRANSFORM_CHANGED: {
142-
Transform3D transform = get_transform();
143-
Quaternion quat(transform.basis.orthonormalized());
144-
composition_layer.pose.orientation = { (float)quat.x, (float)quat.y, (float)quat.z, (float)quat.w };
145-
composition_layer.pose.position = { (float)transform.origin.x, (float)transform.origin.y, (float)transform.origin.z };
143+
update_transform();
146144
} break;
147145
}
148146
}
149147

148+
void OpenXRCompositionLayerEquirect::update_transform() {
149+
composition_layer.pose = get_openxr_pose();
150+
}
151+
150152
void OpenXRCompositionLayerEquirect::set_radius(float p_radius) {
151153
ERR_FAIL_COND(p_radius <= 0);
152154
radius = p_radius;

modules/openxr/scene/openxr_composition_layer_equirect.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ class OpenXRCompositionLayerEquirect : public OpenXRCompositionLayer {
5151

5252
void _notification(int p_what);
5353

54+
void update_transform();
55+
5456
virtual Ref<Mesh> _create_fallback_mesh() override;
5557

5658
public:

modules/openxr/scene/openxr_composition_layer_quad.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ OpenXRCompositionLayerQuad::OpenXRCompositionLayerQuad() {
5050
{ (float)quad_size.x, (float)quad_size.y }, // size
5151
};
5252
openxr_layer_provider = memnew(OpenXRViewportCompositionLayerProvider((XrCompositionLayerBaseHeader *)&composition_layer));
53+
XRServer::get_singleton()->connect("reference_frame_changed", callable_mp(this, &OpenXRCompositionLayerQuad::update_transform));
5354
}
5455

5556
OpenXRCompositionLayerQuad::~OpenXRCompositionLayerQuad() {
@@ -72,14 +73,15 @@ Ref<Mesh> OpenXRCompositionLayerQuad::_create_fallback_mesh() {
7273
void OpenXRCompositionLayerQuad::_notification(int p_what) {
7374
switch (p_what) {
7475
case NOTIFICATION_LOCAL_TRANSFORM_CHANGED: {
75-
Transform3D transform = get_transform();
76-
Quaternion quat(transform.basis.orthonormalized());
77-
composition_layer.pose.orientation = { (float)quat.x, (float)quat.y, (float)quat.z, (float)quat.w };
78-
composition_layer.pose.position = { (float)transform.origin.x, (float)transform.origin.y, (float)transform.origin.z };
76+
update_transform();
7977
} break;
8078
}
8179
}
8280

81+
void OpenXRCompositionLayerQuad::update_transform() {
82+
composition_layer.pose = get_openxr_pose();
83+
}
84+
8385
void OpenXRCompositionLayerQuad::set_quad_size(const Size2 &p_size) {
8486
quad_size = p_size;
8587
composition_layer.size = { (float)quad_size.x, (float)quad_size.y };

modules/openxr/scene/openxr_composition_layer_quad.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ class OpenXRCompositionLayerQuad : public OpenXRCompositionLayer {
4747

4848
void _notification(int p_what);
4949

50+
void update_transform();
51+
5052
virtual Ref<Mesh> _create_fallback_mesh() override;
5153

5254
public:

servers/xr_server.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,8 @@ void XRServer::_bind_methods() {
9898
BIND_ENUM_CONSTANT(RESET_BUT_KEEP_TILT);
9999
BIND_ENUM_CONSTANT(DONT_RESET_ROTATION);
100100

101+
ADD_SIGNAL(MethodInfo("reference_frame_changed"));
102+
101103
ADD_SIGNAL(MethodInfo("interface_added", PropertyInfo(Variant::STRING_NAME, "interface_name")));
102104
ADD_SIGNAL(MethodInfo("interface_removed", PropertyInfo(Variant::STRING_NAME, "interface_name")));
103105

@@ -213,11 +215,13 @@ void XRServer::center_on_hmd(RotationMode p_rotation_mode, bool p_keep_height) {
213215

214216
reference_frame = new_reference_frame.inverse();
215217
set_render_reference_frame(reference_frame);
218+
emit_signal(SNAME("reference_frame_changed"));
216219
}
217220

218221
void XRServer::clear_reference_frame() {
219222
reference_frame = Transform3D();
220223
set_render_reference_frame(reference_frame);
224+
emit_signal(SNAME("reference_frame_changed"));
221225
}
222226

223227
void XRServer::_set_render_reference_frame(const Transform3D &p_reference_frame) {

0 commit comments

Comments
 (0)