From e846014a88551d4e20c94cd23e66d98f6d979095 Mon Sep 17 00:00:00 2001 From: galister <22305755+galister@users.noreply.github.com> Date: Sun, 4 Feb 2024 03:34:50 +0100 Subject: [PATCH] openxr haptics --- src/backend/openxr/input.rs | 20 +++++++++++++++++++- src/backend/openxr/mod.rs | 2 +- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/backend/openxr/input.rs b/src/backend/openxr/input.rs index e5bdc40..ff93223 100644 --- a/src/backend/openxr/input.rs +++ b/src/backend/openxr/input.rs @@ -3,7 +3,10 @@ use std::time::{Duration, Instant}; use glam::{bool, Affine3A, Quat, Vec3}; use openxr as xr; -use crate::{backend::input::Pointer, state::AppState}; +use crate::{ + backend::input::{Haptics, Pointer}, + state::AppState, +}; use super::XrState; @@ -77,6 +80,21 @@ impl OpenXrInputSource { } } + pub fn haptics(&self, xr: &XrState, hand: usize, haptics: &Haptics) { + let action = &self.hands[hand].source.action_haptics; + + let duration_nanos = (haptics.duration as f64) * 1_000_000_000.0; + + let _ = action.apply_feedback( + &xr.session, + xr::Path::NULL, + &xr::HapticVibration::new() + .amplitude(haptics.intensity) + .frequency(haptics.frequency) + .duration(xr::Duration::from_nanos(duration_nanos as _)), + ); + } + pub fn update(&self, xr: &XrState, state: &mut AppState) { xr.session .sync_actions(&[(&self.action_set).into()]) diff --git a/src/backend/openxr/mod.rs b/src/backend/openxr/mod.rs index fe2e0b1..ec212ce 100644 --- a/src/backend/openxr/mod.rs +++ b/src/backend/openxr/mod.rs @@ -233,7 +233,7 @@ pub fn openxr_run(running: Arc) -> Result<(), BackendError> { &app_state.input_state.hmd, ); if let Some(haptics) = haptics { - //TODO! + input_source.haptics(&xr_state, idx, haptics); } }