Skip to content

Commit 3797c1e

Browse files
committed
Merge pull request #109647 from m4gr3d/fix_composition_layer_provider_setup
Fix missing layer provider setup when setting Surface after visibility
2 parents 34d2095 + ca798bf commit 3797c1e

File tree

2 files changed

+13
-2
lines changed

2 files changed

+13
-2
lines changed

modules/openxr/scene/openxr_composition_layer.cpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ void OpenXRCompositionLayer::_clear_composition_layer_provider() {
245245

246246
void OpenXRCompositionLayer::_on_openxr_session_begun() {
247247
openxr_session_running = true;
248-
if (is_natively_supported() && is_visible() && is_inside_tree()) {
248+
if (_should_register()) {
249249
_setup_composition_layer_provider();
250250
}
251251
if (!fallback && _should_use_fallback_node()) {
@@ -265,6 +265,10 @@ void OpenXRCompositionLayer::update_fallback_mesh() {
265265
should_update_fallback_mesh = true;
266266
}
267267

268+
bool OpenXRCompositionLayer::_should_register() {
269+
return !registered && openxr_session_running && is_inside_tree() && is_visible() && is_natively_supported();
270+
}
271+
268272
XrPosef OpenXRCompositionLayer::get_openxr_pose() {
269273
Transform3D reference_frame = XRServer::get_singleton()->get_reference_frame();
270274
Transform3D transform = reference_frame.inverse() * get_transform();
@@ -298,7 +302,7 @@ void OpenXRCompositionLayer::set_layer_viewport(SubViewport *p_viewport) {
298302
}
299303

300304
layer_viewport = p_viewport;
301-
if (!registered && is_natively_supported() && openxr_session_running && is_inside_tree() && is_visible()) {
305+
if (_should_register()) {
302306
_setup_composition_layer_provider();
303307
}
304308

@@ -328,8 +332,13 @@ void OpenXRCompositionLayer::set_use_android_surface(bool p_use_android_surface)
328332

329333
use_android_surface = p_use_android_surface;
330334
if (use_android_surface) {
335+
// It's possible that the layer provider is unregistered here (if previously invisible)
331336
set_layer_viewport(nullptr);
332337
openxr_layer_provider->set_use_android_surface(true, android_surface_size);
338+
// ...and it may not be set up above because of viewport = null, android surface is false, so set it up again:
339+
if (_should_register()) {
340+
_setup_composition_layer_provider();
341+
}
333342
} else {
334343
openxr_layer_provider->set_use_android_surface(false, Size2i());
335344
}

modules/openxr/scene/openxr_composition_layer.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,8 @@ class OpenXRCompositionLayer : public Node3D {
120120
virtual void _on_openxr_session_begun();
121121
virtual void _on_openxr_session_stopping();
122122

123+
bool _should_register();
124+
123125
virtual Ref<Mesh> _create_fallback_mesh() = 0;
124126

125127
void update_fallback_mesh();

0 commit comments

Comments
 (0)