diff --git a/modules/openxr/scene/openxr_composition_layer.cpp b/modules/openxr/scene/openxr_composition_layer.cpp index 8263d0100c5..61f5cff4fd6 100644 --- a/modules/openxr/scene/openxr_composition_layer.cpp +++ b/modules/openxr/scene/openxr_composition_layer.cpp @@ -245,7 +245,7 @@ void OpenXRCompositionLayer::_clear_composition_layer_provider() { void OpenXRCompositionLayer::_on_openxr_session_begun() { openxr_session_running = true; - if (is_natively_supported() && is_visible() && is_inside_tree()) { + if (_should_register()) { _setup_composition_layer_provider(); } if (!fallback && _should_use_fallback_node()) { @@ -265,6 +265,10 @@ void OpenXRCompositionLayer::update_fallback_mesh() { should_update_fallback_mesh = true; } +bool OpenXRCompositionLayer::_should_register() { + return !registered && openxr_session_running && is_inside_tree() && is_visible() && is_natively_supported(); +} + XrPosef OpenXRCompositionLayer::get_openxr_pose() { Transform3D reference_frame = XRServer::get_singleton()->get_reference_frame(); Transform3D transform = reference_frame.inverse() * get_transform(); @@ -298,7 +302,7 @@ void OpenXRCompositionLayer::set_layer_viewport(SubViewport *p_viewport) { } layer_viewport = p_viewport; - if (!registered && is_natively_supported() && openxr_session_running && is_inside_tree() && is_visible()) { + if (_should_register()) { _setup_composition_layer_provider(); } @@ -328,8 +332,13 @@ void OpenXRCompositionLayer::set_use_android_surface(bool p_use_android_surface) use_android_surface = p_use_android_surface; if (use_android_surface) { + // It's possible that the layer provider is unregistered here (if previously invisible) set_layer_viewport(nullptr); openxr_layer_provider->set_use_android_surface(true, android_surface_size); + // ...and it may not be set up above because of viewport = null, android surface is false, so set it up again: + if (_should_register()) { + _setup_composition_layer_provider(); + } } else { openxr_layer_provider->set_use_android_surface(false, Size2i()); } diff --git a/modules/openxr/scene/openxr_composition_layer.h b/modules/openxr/scene/openxr_composition_layer.h index 9783837722a..ae9da59c37b 100644 --- a/modules/openxr/scene/openxr_composition_layer.h +++ b/modules/openxr/scene/openxr_composition_layer.h @@ -120,6 +120,8 @@ protected: virtual void _on_openxr_session_begun(); virtual void _on_openxr_session_stopping(); + bool _should_register(); + virtual Ref _create_fallback_mesh() = 0; void update_fallback_mesh();