From 21331b5c42e3bde159e28017c61eeb9bb6b7be7a Mon Sep 17 00:00:00 2001 From: galister <22305755+galister@users.noreply.github.com> Date: Mon, 16 Sep 2024 05:09:10 +0900 Subject: [PATCH] fps-aware openxr pointer smoothing --- src/backend/openxr/input.rs | 9 +++++---- src/backend/openxr/mod.rs | 3 +++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/backend/openxr/input.rs b/src/backend/openxr/input.rs index b80a467..7f68f6a 100644 --- a/src/backend/openxr/input.rs +++ b/src/backend/openxr/input.rs @@ -324,12 +324,13 @@ impl OpenXrHand { transmute::(location.pose.position), ) }; + let lerp_factor = (1.0 / (xr.predicted_display_period.as_nanos() / 10_000_000) as f32 + * session.config.pointer_lerp_factor) + .clamp(0.1, 1.0); pointer.raw_pose = Affine3A::from_rotation_translation(new_quat, new_pos); pointer.pose = Affine3A::from_rotation_translation( - cur_quat.lerp(new_quat, session.config.pointer_lerp_factor), - cur_pos - .lerp(new_pos.into(), session.config.pointer_lerp_factor) - .into(), + cur_quat.lerp(new_quat, lerp_factor), + cur_pos.lerp(new_pos.into(), lerp_factor).into(), ); } diff --git a/src/backend/openxr/mod.rs b/src/backend/openxr/mod.rs index 07e6f93..6b249aa 100644 --- a/src/backend/openxr/mod.rs +++ b/src/backend/openxr/mod.rs @@ -48,6 +48,7 @@ struct XrState { system: xr::SystemId, session: xr::Session, predicted_display_time: xr::Time, + predicted_display_period: xr::Duration, stage: Arc, view: Arc, stage_offset: Affine3A, @@ -131,6 +132,7 @@ pub fn openxr_run(running: Arc, show_by_default: bool) -> Result<(), system, session, predicted_display_time: xr::Time::from_nanos(0), + predicted_display_period: xr::Duration::from_nanos(10_000_000), stage: Arc::new(stage), view: Arc::new(view), stage_offset: Affine3A::IDENTITY, @@ -231,6 +233,7 @@ pub fn openxr_run(running: Arc, show_by_default: bool) -> Result<(), frame_stream.begin()?; xr_state.predicted_display_time = xr_frame_state.predicted_display_time; + xr_state.predicted_display_period = xr_frame_state.predicted_display_period; if !xr_frame_state.should_render { frame_stream.end(