diff options
author | Faolan <46481567+Faolan-Rad@users.noreply.github.com> | 2023-08-09 21:40:16 -0400 |
---|---|---|
committer | Faolan <46481567+Faolan-Rad@users.noreply.github.com> | 2023-08-09 21:40:16 -0400 |
commit | a60cf6ed6c842539895ac5a92151354dea40692f (patch) | |
tree | 145fd23627ea3662616f5881ead68156d9847573 /modules/openxr/openxr_api.cpp | |
parent | eca6f0eb545166708c56633152974f40f51de2be (diff) | |
download | redot-engine-a60cf6ed6c842539895ac5a92151354dea40692f.tar.gz |
Properly load multiple action sets in XR
Diffstat (limited to 'modules/openxr/openxr_api.cpp')
-rw-r--r-- | modules/openxr/openxr_api.cpp | 33 |
1 files changed, 21 insertions, 12 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); |