From a60cf6ed6c842539895ac5a92151354dea40692f Mon Sep 17 00:00:00 2001 From: Faolan <46481567+Faolan-Rad@users.noreply.github.com> Date: Wed, 9 Aug 2023 21:40:16 -0400 Subject: [PATCH] Properly load multiple action sets in XR --- modules/openxr/openxr_api.cpp | 33 ++++++++++++++++++----------- modules/openxr/openxr_api.h | 2 +- modules/openxr/openxr_interface.cpp | 4 +++- 3 files changed, 25 insertions(+), 14 deletions(-) diff --git a/modules/openxr/openxr_api.cpp b/modules/openxr/openxr_api.cpp index 9885190cb1cb..2bd5376b219c 100644 --- a/modules/openxr/openxr_api.cpp +++ b/modules/openxr/openxr_api.cpp @@ -2274,33 +2274,42 @@ String OpenXRAPI::action_set_get_name(RID p_action_set) { return action_set->name; } -bool OpenXRAPI::action_set_attach(RID p_action_set) { - ActionSet *action_set = action_set_owner.get_or_null(p_action_set); - ERR_FAIL_NULL_V(action_set, false); +bool OpenXRAPI::attach_action_sets(const Vector &p_action_sets) { + ERR_FAIL_COND_V(session == XR_NULL_HANDLE, false); - if (action_set->is_attached) { - // already attached - return true; - } + Vector action_handles; + action_handles.resize(p_action_sets.size()); + for (int i = 0; i < p_action_sets.size(); i++) { + ActionSet *action_set = action_set_owner.get_or_null(p_action_sets[i]); + ERR_FAIL_NULL_V(action_set, false); - ERR_FAIL_COND_V(session == XR_NULL_HANDLE, false); + if (action_set->is_attached) { + return false; + } + + action_handles.set(i, action_set->handle); + } // So according to the docs, once we attach our action set to our session it becomes read only.. // https://www.khronos.org/registry/OpenXR/specs/1.0/man/html/xrAttachSessionActionSets.html XrSessionActionSetsAttachInfo attach_info = { XR_TYPE_SESSION_ACTION_SETS_ATTACH_INFO, // type nullptr, // next - 1, // countActionSets, - &action_set->handle // actionSets + (uint32_t)p_action_sets.size(), // countActionSets, + action_handles.ptr() // actionSets }; XrResult result = xrAttachSessionActionSets(session, &attach_info); if (XR_FAILED(result)) { - print_line("OpenXR: failed to attach action set! [", get_error_string(result), "]"); + print_line("OpenXR: failed to attach action sets! [", get_error_string(result), "]"); return false; } - action_set->is_attached = true; + for (int i = 0; i < p_action_sets.size(); i++) { + ActionSet *action_set = action_set_owner.get_or_null(p_action_sets[i]); + ERR_FAIL_NULL_V(action_set, false); + action_set->is_attached = true; + } /* For debugging: print_verbose("Attached set " + action_set->name); diff --git a/modules/openxr/openxr_api.h b/modules/openxr/openxr_api.h index 9374cb7afada..2498cd1eb47c 100644 --- a/modules/openxr/openxr_api.h +++ b/modules/openxr/openxr_api.h @@ -380,7 +380,7 @@ class OpenXRAPI { RID action_set_create(const String p_name, const String p_localized_name, const int p_priority); String action_set_get_name(RID p_action_set); - bool action_set_attach(RID p_action_set); + bool attach_action_sets(const Vector &p_action_sets); void action_set_free(RID p_action_set); RID action_create(RID p_action_set, const String p_name, const String p_localized_name, OpenXRAction::ActionType p_action_type, const Vector &p_trackers); diff --git a/modules/openxr/openxr_interface.cpp b/modules/openxr/openxr_interface.cpp index 933148da874a..cc2b4fa11bcb 100644 --- a/modules/openxr/openxr_interface.cpp +++ b/modules/openxr/openxr_interface.cpp @@ -555,9 +555,11 @@ bool OpenXRInterface::initialize() { xr_server->add_tracker(head); // attach action sets + Vector loaded_action_sets; for (int i = 0; i < action_sets.size(); i++) { - openxr_api->action_set_attach(action_sets[i]->action_set_rid); + loaded_action_sets.append(action_sets[i]->action_set_rid); } + openxr_api->attach_action_sets(loaded_action_sets); // make this our primary interface xr_server->set_primary_interface(this);