@@ -66,7 +66,7 @@ OpenXRCompositionLayer::OpenXRCompositionLayer() {
6666 XRServer::get_singleton ()->connect (" reference_frame_changed" , callable_mp (this , &OpenXRCompositionLayer::update_transform));
6767
6868 set_process_internal (true );
69- set_notify_local_transform (true );
69+ set_notify_transform (true );
7070
7171 if (Engine::get_singleton ()->is_editor_hint ()) {
7272 // In the editor, create the fallback right away.
@@ -196,7 +196,7 @@ bool OpenXRCompositionLayer::_should_use_fallback_node() {
196196 if (Engine::get_singleton ()->is_editor_hint () || openxr_api == nullptr ) {
197197 return true ;
198198 } else if (openxr_session_running) {
199- return enable_hole_punch || ( !is_natively_supported () && !use_android_surface );
199+ return enable_hole_punch || !is_natively_supported ();
200200 }
201201 return false ;
202202}
@@ -245,7 +245,7 @@ void OpenXRCompositionLayer::_clear_composition_layer() {
245245}
246246
247247void OpenXRCompositionLayer::_viewport_size_changed () {
248- if (layer_viewport && openxr_session_running && composition_layer_extension && is_natively_supported () && is_visible () && is_inside_tree ()) {
248+ if (layer_viewport && openxr_session_running && composition_layer_extension && is_natively_supported () && is_visible_in_tree () && is_inside_tree ()) {
249249 composition_layer_extension->composition_layer_set_viewport (composition_layer, layer_viewport->get_viewport_rid (), layer_viewport->get_size ());
250250 }
251251}
@@ -270,7 +270,13 @@ void OpenXRCompositionLayer::_on_openxr_session_stopping() {
270270
271271void OpenXRCompositionLayer::update_transform () {
272272 if (composition_layer_extension) {
273- composition_layer_extension->composition_layer_set_transform (composition_layer, get_transform ());
273+ Transform3D xf;
274+ if (Object::cast_to<XROrigin3D>(get_parent ()) != nullptr ) {
275+ xf = get_transform ();
276+ } else {
277+ xf = get_global_transform ();
278+ }
279+ composition_layer_extension->composition_layer_set_transform (composition_layer, xf);
274280 }
275281}
276282
@@ -279,7 +285,7 @@ void OpenXRCompositionLayer::update_fallback_mesh() {
279285}
280286
281287bool OpenXRCompositionLayer::_should_register () {
282- return !registered && openxr_session_running && is_inside_tree () && is_visible () && is_natively_supported ();
288+ return !registered && openxr_session_running && is_inside_tree () && is_visible_in_tree () && is_natively_supported ();
283289}
284290
285291bool OpenXRCompositionLayer::is_viewport_in_use (SubViewport *p_viewport) {
@@ -325,7 +331,8 @@ void OpenXRCompositionLayer::set_layer_viewport(SubViewport *p_viewport) {
325331
326332 if (fallback) {
327333 _reset_fallback_material ();
328- } else if (openxr_session_running && composition_layer_extension && is_visible () && is_inside_tree ()) {
334+ }
335+ if (openxr_session_running && composition_layer_extension && is_visible_in_tree () && is_inside_tree () && is_natively_supported ()) {
329336 if (layer_viewport) {
330337 composition_layer_extension->composition_layer_set_viewport (composition_layer, layer_viewport->get_viewport_rid (), layer_viewport->get_size ());
331338 } else {
@@ -676,22 +683,22 @@ void OpenXRCompositionLayer::_notification(int p_what) {
676683 } break ;
677684 case NOTIFICATION_VISIBILITY_CHANGED: {
678685 if (is_natively_supported () && openxr_session_running && is_inside_tree ()) {
679- if (is_visible ()) {
686+ if (is_visible_in_tree ()) {
680687 _setup_composition_layer ();
681688 } else {
682689 _clear_composition_layer ();
683690 }
684691 }
685692 update_configuration_warnings ();
686693 } break ;
687- case NOTIFICATION_LOCAL_TRANSFORM_CHANGED : {
694+ case NOTIFICATION_TRANSFORM_CHANGED : {
688695 update_transform ();
689696 update_configuration_warnings ();
690697 } break ;
691698 case NOTIFICATION_ENTER_TREE: {
692699 if (layer_viewport && is_viewport_in_use (layer_viewport)) {
693700 _clear_composition_layer ();
694- } else if (openxr_session_running && is_visible ()) {
701+ } else if (openxr_session_running && is_visible_in_tree ()) {
695702 _setup_composition_layer ();
696703 }
697704 } break ;
@@ -756,13 +763,27 @@ void OpenXRCompositionLayer::_validate_property(PropertyInfo &p_property) const
756763 }
757764}
758765
766+ XROrigin3D *OpenXRCompositionLayer::_get_xrorigin3d_ancestor () const {
767+ Node *parent = get_parent ();
768+ while (parent != nullptr ) {
769+ XROrigin3D *origin = Object::cast_to<XROrigin3D>(parent);
770+ if (origin != nullptr ) {
771+ return origin;
772+ }
773+
774+ parent = parent->get_parent ();
775+ }
776+
777+ return nullptr ;
778+ }
779+
759780PackedStringArray OpenXRCompositionLayer::get_configuration_warnings () const {
760781 PackedStringArray warnings = Node3D::get_configuration_warnings ();
761782
762- if (is_visible () && is_inside_tree ()) {
763- XROrigin3D *origin = Object::cast_to<XROrigin3D>( get_parent () );
783+ if (is_visible_in_tree () && is_inside_tree ()) {
784+ XROrigin3D *origin = _get_xrorigin3d_ancestor ( );
764785 if (origin == nullptr ) {
765- warnings.push_back (RTR (" OpenXR composition layers must have an XROrigin3D node as their parent ." ));
786+ warnings.push_back (RTR (" OpenXR composition layers must have an XROrigin3D node as their ancestor ." ));
766787 }
767788 }
768789
0 commit comments