diff options
author | Rémi Verschelde <rverschelde@gmail.com> | 2023-08-18 09:30:52 +0200 |
---|---|---|
committer | Rémi Verschelde <rverschelde@gmail.com> | 2023-08-18 09:30:52 +0200 |
commit | 8a02cd088320cb428c5ea157a26ce739aab8f0cd (patch) | |
tree | e9d6e406fe12095f97acf1073543c41b6c3c312a | |
parent | a017e9c69877be77744dfb2bff0bbc2a811427cf (diff) | |
parent | a60cf6ed6c842539895ac5a92151354dea40692f (diff) | |
download | redot-engine-8a02cd088320cb428c5ea157a26ce739aab8f0cd.tar.gz |
Merge pull request #80419 from Faolan-Rad/fix-multi_actionsets
Properly load multiple action sets in XR
-rw-r--r-- | modules/openxr/openxr_api.cpp | 33 | ||||
-rw-r--r-- | modules/openxr/openxr_api.h | 2 | ||||
-rw-r--r-- | 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 9885190cb1..2bd5376b21 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<RID> &p_action_sets) { + ERR_FAIL_COND_V(session == XR_NULL_HANDLE, false); - if (action_set->is_attached) { - // already attached - return true; - } + Vector<XrActionSet> 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 9374cb7afa..2498cd1eb4 100644 --- a/modules/openxr/openxr_api.h +++ b/modules/openxr/openxr_api.h @@ -380,7 +380,7 @@ public: 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<RID> &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<RID> &p_trackers); diff --git a/modules/openxr/openxr_interface.cpp b/modules/openxr/openxr_interface.cpp index 933148da87..cc2b4fa11b 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<RID> 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); |