From 031efb2d7921d2bd3cd1dbd706b7dfdf4ac90763 Mon Sep 17 00:00:00 2001 From: Chris D <32441086+CheesecakeCG@users.noreply.github.com> Date: Fri, 12 Apr 2024 05:55:43 -0400 Subject: [PATCH] Add bindings for WMR controllers (#28) * Add bindings for WMR controllers * Add support for HP Mixed Reality Controllers --------- Co-authored-by: hare_ware <3469405-hare_ware@users.noreply.gitlab.com> --- src/backend/openxr/helpers.rs | 11 +++ src/backend/openxr/input.rs | 126 ++++++++++++++++++++++++++++++++++ 2 files changed, 137 insertions(+) diff --git a/src/backend/openxr/helpers.rs b/src/backend/openxr/helpers.rs index e127dde..7ba86b5 100644 --- a/src/backend/openxr/helpers.rs +++ b/src/backend/openxr/helpers.rs @@ -21,6 +21,17 @@ pub(super) fn init_xr() -> Result<(xr::Instance, xr::SystemId), anyhow::Error> { let mut enabled_extensions = xr::ExtensionSet::default(); enabled_extensions.khr_vulkan_enable2 = true; enabled_extensions.extx_overlay = true; + if available_extensions.khr_binding_modification && available_extensions.ext_dpad_binding { + enabled_extensions.khr_binding_modification = true; + enabled_extensions.ext_dpad_binding = true; + } else { + log::warn!("Missing EXT_dpad_binding extension."); + } + if available_extensions.ext_hp_mixed_reality_controller { + enabled_extensions.ext_hp_mixed_reality_controller = true; + } else { + log::warn!("Missing EXT_hp_mixed_reality_controller extension."); + } //#[cfg(not(debug_assertions))] let layers = []; diff --git a/src/backend/openxr/input.rs b/src/backend/openxr/input.rs index e452036..bcc2ef3 100644 --- a/src/backend/openxr/input.rs +++ b/src/backend/openxr/input.rs @@ -521,5 +521,131 @@ fn suggest_bindings( ], )?; + let path = instance.string_to_path("/interaction_profiles/microsoft/motion_controller")?; + instance.suggest_interaction_profile_bindings( + path, + &[ + xr::Binding::new( + &hands[0].action_pose, + instance.string_to_path("/user/hand/left/input/aim/pose")?, + ), + xr::Binding::new( + &hands[1].action_pose, + instance.string_to_path("/user/hand/right/input/aim/pose")?, + ), + xr::Binding::new( + &hands[1].action_click, + instance.string_to_path("/user/hand/right/input/trigger/value")?, + ), + xr::Binding::new( + &hands[0].action_grab, + instance.string_to_path("/user/hand/left/input/squeeze/click")?, + ), + xr::Binding::new( + &hands[1].action_grab, + instance.string_to_path("/user/hand/right/input/squeeze/click")?, + ), + xr::Binding::new( + &hands[0].action_click_modifier_right, + instance.string_to_path("/user/hand/left/input/trackpad/dpad_up")?, + ), + xr::Binding::new( + &hands[1].action_click_modifier_right, + instance.string_to_path("/user/hand/right/input/trackpad/dpad_up")?, + ), + xr::Binding::new( + &hands[0].action_click_modifier_middle, + instance.string_to_path("/user/hand/left/input/trackpad/dpad_down")?, + ), + xr::Binding::new( + &hands[1].action_click_modifier_middle, + instance.string_to_path("/user/hand/right/input/trackpad/dpad_down")?, + ), + xr::Binding::new( + &hands[0].action_scroll, + instance.string_to_path("/user/hand/left/input/thumbstick/y")?, + ), + xr::Binding::new( + &hands[1].action_scroll, + instance.string_to_path("/user/hand/right/input/thumbstick/y")?, + ), + xr::Binding::new( + &hands[0].action_show_hide, + instance.string_to_path("/user/hand/left/input/menu/click")?, + ), + xr::Binding::new( + &hands[0].action_haptics, + instance.string_to_path("/user/hand/left/output/haptic")?, + ), + xr::Binding::new( + &hands[1].action_haptics, + instance.string_to_path("/user/hand/right/output/haptic")?, + ), + ], + )?; + + let path = instance.string_to_path("/interaction_profiles/hp/mixed_reality_controller")?; + instance.suggest_interaction_profile_bindings( + path, + &[ + xr::Binding::new( + &hands[0].action_pose, + instance.string_to_path("/user/hand/left/input/aim/pose")?, + ), + xr::Binding::new( + &hands[1].action_pose, + instance.string_to_path("/user/hand/right/input/aim/pose")?, + ), + xr::Binding::new( + &hands[1].action_click, + instance.string_to_path("/user/hand/right/input/trigger/value")?, + ), + xr::Binding::new( + &hands[0].action_grab, + instance.string_to_path("/user/hand/left/input/squeeze/value")?, + ), + xr::Binding::new( + &hands[1].action_grab, + instance.string_to_path("/user/hand/right/input/squeeze/value")?, + ), + xr::Binding::new( + &hands[0].action_click_modifier_right, + instance.string_to_path("/user/hand/left/input/y/click")?, + ), + xr::Binding::new( + &hands[1].action_click_modifier_right, + instance.string_to_path("/user/hand/right/input/b/click")?, + ), + xr::Binding::new( + &hands[0].action_click_modifier_middle, + instance.string_to_path("/user/hand/left/input/x/click")?, + ), + xr::Binding::new( + &hands[1].action_click_modifier_middle, + instance.string_to_path("/user/hand/right/input/a/click")?, + ), + xr::Binding::new( + &hands[0].action_scroll, + instance.string_to_path("/user/hand/left/input/thumbstick/y")?, + ), + xr::Binding::new( + &hands[1].action_scroll, + instance.string_to_path("/user/hand/right/input/thumbstick/y")?, + ), + xr::Binding::new( + &hands[0].action_show_hide, + instance.string_to_path("/user/hand/left/input/menu/click")?, + ), + xr::Binding::new( + &hands[0].action_haptics, + instance.string_to_path("/user/hand/left/output/haptic")?, + ), + xr::Binding::new( + &hands[1].action_haptics, + instance.string_to_path("/user/hand/right/output/haptic")?, + ), + ], + )?; + Ok(()) }