diff --git a/alvr/client_openxr/src/extra_extensions/multimodal_input.rs b/alvr/client_openxr/src/extra_extensions/multimodal_input.rs index d41a5b5072..a6076be907 100644 --- a/alvr/client_openxr/src/extra_extensions/multimodal_input.rs +++ b/alvr/client_openxr/src/extra_extensions/multimodal_input.rs @@ -20,39 +20,37 @@ static TYPE_SIMULTANEOUS_HANDS_AND_CONTROLLERS_TRACKING_PAUSE_INFO_META: Lazy sys::Result; -pub type PauseSimultaneousHandsAndControllersTrackingMETA = - unsafe extern "system" fn( - sys::Session, - *const SimultaneousHandsAndControllersTrackingPauseInfoMETA, - ) -> sys::Result; +type ResumeSimultaneousHandsAndControllersTrackingMETA = unsafe extern "system" fn( + sys::Session, + *const SimultaneousHandsAndControllersTrackingResumeInfoMETA, +) -> sys::Result; +type PauseSimultaneousHandsAndControllersTrackingMETA = unsafe extern "system" fn( + sys::Session, + *const SimultaneousHandsAndControllersTrackingPauseInfoMETA, +) -> sys::Result; pub struct MultimodalMeta { - pub session: xr::Session, - pub resume_simultaneous_hands_and_controllers_tracking_meta: + session: xr::Session, + resume_simultaneous_hands_and_controllers_tracking_meta: ResumeSimultaneousHandsAndControllersTrackingMETA, - pub pause_simultaneous_hands_and_controllers_tracking_meta: + pause_simultaneous_hands_and_controllers_tracking_meta: PauseSimultaneousHandsAndControllersTrackingMETA, } diff --git a/alvr/client_openxr/src/interaction.rs b/alvr/client_openxr/src/interaction.rs index b54e1e1a4a..e9c2eaa17e 100644 --- a/alvr/client_openxr/src/interaction.rs +++ b/alvr/client_openxr/src/interaction.rs @@ -108,7 +108,8 @@ pub struct InteractionContext { pub action_set: xr::ActionSet, pub button_actions: HashMap, pub hands_interaction: [HandInteraction; 2], - pub multimodal_hands: Option<(MultimodalMeta, bool)>, + multimodal_handle: Option, + pub multimodal_hands_enabled: bool, pub face_sources: FaceSources, pub body_sources: BodySources, } @@ -229,13 +230,13 @@ impl InteractionContext { "/user/hand/right/output/haptic", )); - let multimodal = create_ext_object("MultimodalMeta", Some(true), || { - MultimodalMeta::new(xr_session.clone(), &extra_extensions, xr_system) + let multimodal_handle = create_ext_object("MultimodalMeta", Some(true), || { + MultimodalMeta::new(xr_session.clone(), extra_extensions, xr_system) }); let left_detached_controller_pose_action; let right_detached_controller_pose_action; - if multimodal.is_some() { + if multimodal_handle.is_some() { // Note: when multimodal input is enabled, both controllers and hands will always be active. // To be able to detect when controllers are actually held, we have to register detached // controllers pose; the controller pose will be diverted to the detached controllers when @@ -359,7 +360,8 @@ impl InteractionContext { skeleton_tracker: right_hand_tracker, }, ], - multimodal_hands: multimodal.map(|m| (m, false)), + multimodal_handle, + multimodal_hands_enabled: false, face_sources: FaceSources { combined_eyes_source, eye_tracker_fb: None, @@ -375,12 +377,10 @@ impl InteractionContext { pub fn select_sources(&mut self, config: &InteractionSourcesConfig) { // First of all, disable/delete all sources. This ensures there are no conflicts - if let Some((handle, enabled)) = &mut self.multimodal_hands { - if *enabled { - handle.pause().ok(); - *enabled = false; - } + if let Some(handle) = &mut self.multimodal_handle { + handle.pause().ok(); } + self.multimodal_hands_enabled = false; self.face_sources.eye_tracker_fb = None; self.face_sources.face_tracker_fb = None; self.face_sources.eye_tracker_htc = None; @@ -415,10 +415,9 @@ impl InteractionContext { // Note: We cannot enable multimodal if fb body tracking is active. It would result in a // ERROR_RUNTIME_FAILURE crash. if config.body_tracking.is_none() && config.prefers_multimodal_input { - if let Some((handle, enabled)) = &mut self.multimodal_hands { - if !*enabled { - handle.resume().ok(); - *enabled = true; + if let Some(handle) = &mut self.multimodal_handle { + if handle.resume().is_ok() { + self.multimodal_hands_enabled = true; } } } diff --git a/alvr/client_openxr/src/stream.rs b/alvr/client_openxr/src/stream.rs index d029549806..e789b886ec 100644 --- a/alvr/client_openxr/src/stream.rs +++ b/alvr/client_openxr/src/stream.rs @@ -510,17 +510,12 @@ fn stream_input_loop( // Note: When multimodal input is enabled, we are sure that when free hands are used // (not holding controllers) the controller data is None. - let multimodal_enabled = int_ctx - .multimodal_hands - .as_ref() - .map(|(_, enabled)| *enabled) - .unwrap_or(false); - if multimodal_enabled || left_hand_skeleton.is_none() { + if int_ctx.multimodal_hands_enabled || left_hand_skeleton.is_none() { if let Some(motion) = left_hand_motion { device_motions.push((*HAND_LEFT_ID, motion)); } } - if multimodal_enabled || right_hand_skeleton.is_none() { + if int_ctx.multimodal_hands_enabled || right_hand_skeleton.is_none() { if let Some(motion) = right_hand_motion { device_motions.push((*HAND_RIGHT_ID, motion)); }