fps-aware openxr pointer smoothing
This commit is contained in:
@@ -324,12 +324,13 @@ impl OpenXrHand {
|
|||||||
transmute::<Vector3f, Vec3>(location.pose.position),
|
transmute::<Vector3f, Vec3>(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.raw_pose = Affine3A::from_rotation_translation(new_quat, new_pos);
|
||||||
pointer.pose = Affine3A::from_rotation_translation(
|
pointer.pose = Affine3A::from_rotation_translation(
|
||||||
cur_quat.lerp(new_quat, session.config.pointer_lerp_factor),
|
cur_quat.lerp(new_quat, lerp_factor),
|
||||||
cur_pos
|
cur_pos.lerp(new_pos.into(), lerp_factor).into(),
|
||||||
.lerp(new_pos.into(), session.config.pointer_lerp_factor)
|
|
||||||
.into(),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -48,6 +48,7 @@ struct XrState {
|
|||||||
system: xr::SystemId,
|
system: xr::SystemId,
|
||||||
session: xr::Session<xr::Vulkan>,
|
session: xr::Session<xr::Vulkan>,
|
||||||
predicted_display_time: xr::Time,
|
predicted_display_time: xr::Time,
|
||||||
|
predicted_display_period: xr::Duration,
|
||||||
stage: Arc<xr::Space>,
|
stage: Arc<xr::Space>,
|
||||||
view: Arc<xr::Space>,
|
view: Arc<xr::Space>,
|
||||||
stage_offset: Affine3A,
|
stage_offset: Affine3A,
|
||||||
@@ -131,6 +132,7 @@ pub fn openxr_run(running: Arc<AtomicBool>, show_by_default: bool) -> Result<(),
|
|||||||
system,
|
system,
|
||||||
session,
|
session,
|
||||||
predicted_display_time: xr::Time::from_nanos(0),
|
predicted_display_time: xr::Time::from_nanos(0),
|
||||||
|
predicted_display_period: xr::Duration::from_nanos(10_000_000),
|
||||||
stage: Arc::new(stage),
|
stage: Arc::new(stage),
|
||||||
view: Arc::new(view),
|
view: Arc::new(view),
|
||||||
stage_offset: Affine3A::IDENTITY,
|
stage_offset: Affine3A::IDENTITY,
|
||||||
@@ -231,6 +233,7 @@ pub fn openxr_run(running: Arc<AtomicBool>, show_by_default: bool) -> Result<(),
|
|||||||
frame_stream.begin()?;
|
frame_stream.begin()?;
|
||||||
|
|
||||||
xr_state.predicted_display_time = xr_frame_state.predicted_display_time;
|
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 {
|
if !xr_frame_state.should_render {
|
||||||
frame_stream.end(
|
frame_stream.end(
|
||||||
|
|||||||
Reference in New Issue
Block a user