Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Properly load multiple action sets in XR #80419

Merged
merged 1 commit into from
Aug 18, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
33 changes: 21 additions & 12 deletions modules/openxr/openxr_api.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
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