Skip to content

Commit

Permalink
Properly load multiple action sets in XR
Browse files Browse the repository at this point in the history
  • Loading branch information
Faolan-Rad committed Aug 8, 2023
1 parent eca6f0e commit 688b1de
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 14 deletions.
32 changes: 20 additions & 12 deletions modules/openxr/openxr_api.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2274,33 +2274,41 @@ 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;
}
XrActionSet *action_handles = new XrActionSet[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[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 // 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);
Expand Down
2 changes: 1 addition & 1 deletion modules/openxr/openxr_api.h
Original file line number Diff line number Diff line change
Expand Up @@ -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<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);
Expand Down
4 changes: 3 additions & 1 deletion modules/openxr/openxr_interface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit 688b1de

Please sign in to comment.