1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-21 14:57:09 +00:00

Add missing layer provider setup when setting Surface after visibility

This commit is contained in:
Mauricio Narvaez
2025-07-22 15:03:12 -07:00
committed by Fredia Huya-Kouadio
parent e67074d0ab
commit ca798bf94d
2 changed files with 13 additions and 2 deletions

View File

@@ -245,7 +245,7 @@ void OpenXRCompositionLayer::_clear_composition_layer_provider() {
void OpenXRCompositionLayer::_on_openxr_session_begun() { void OpenXRCompositionLayer::_on_openxr_session_begun() {
openxr_session_running = true; openxr_session_running = true;
if (is_natively_supported() && is_visible() && is_inside_tree()) { if (_should_register()) {
_setup_composition_layer_provider(); _setup_composition_layer_provider();
} }
if (!fallback && _should_use_fallback_node()) { if (!fallback && _should_use_fallback_node()) {
@@ -265,6 +265,10 @@ void OpenXRCompositionLayer::update_fallback_mesh() {
should_update_fallback_mesh = true; 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() { XrPosef OpenXRCompositionLayer::get_openxr_pose() {
Transform3D reference_frame = XRServer::get_singleton()->get_reference_frame(); Transform3D reference_frame = XRServer::get_singleton()->get_reference_frame();
Transform3D transform = reference_frame.inverse() * get_transform(); Transform3D transform = reference_frame.inverse() * get_transform();
@@ -298,7 +302,7 @@ void OpenXRCompositionLayer::set_layer_viewport(SubViewport *p_viewport) {
} }
layer_viewport = 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(); _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; use_android_surface = p_use_android_surface;
if (use_android_surface) { if (use_android_surface) {
// It's possible that the layer provider is unregistered here (if previously invisible)
set_layer_viewport(nullptr); set_layer_viewport(nullptr);
openxr_layer_provider->set_use_android_surface(true, android_surface_size); 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 { } else {
openxr_layer_provider->set_use_android_surface(false, Size2i()); openxr_layer_provider->set_use_android_surface(false, Size2i());
} }

View File

@@ -120,6 +120,8 @@ protected:
virtual void _on_openxr_session_begun(); virtual void _on_openxr_session_begun();
virtual void _on_openxr_session_stopping(); virtual void _on_openxr_session_stopping();
bool _should_register();
virtual Ref<Mesh> _create_fallback_mesh() = 0; virtual Ref<Mesh> _create_fallback_mesh() = 0;
void update_fallback_mesh(); void update_fallback_mesh();