diff --git a/wayvr/src/backend/openvr/playspace.rs b/wayvr/src/backend/openvr/playspace.rs index 2746ff97..bedffe97 100644 --- a/wayvr/src/backend/openvr/playspace.rs +++ b/wayvr/src/backend/openvr/playspace.rs @@ -24,7 +24,6 @@ pub(super) struct PlayspaceMover { universe: ETrackingUniverseOrigin, drag: Option>, rotate: Option>, - floor_y: Option, playspace_state: PlayspaceState, } @@ -34,7 +33,6 @@ impl PlayspaceMover { universe: ETrackingUniverseOrigin::TrackingUniverseRawAndUncalibrated, drag: None, rotate: None, - floor_y: None, playspace_state: load_playspace_state().unwrap_or_default(), } } @@ -50,7 +48,7 @@ impl PlayspaceMover { self.fix_floor(chaperone_mgr, &app.input_state); } PlayspaceTask::Reset => { - self.reset_offset(chaperone_mgr, &app.input_state); + self.reset_offset(chaperone_mgr); } PlayspaceTask::Recenter => { self.recenter(chaperone_mgr, &app.input_state); @@ -180,24 +178,18 @@ impl PlayspaceMover { for pointer in &app.input_state.pointers { if pointer.now.space_reset && !pointer.before.space_reset { - self.reset_offset(chaperone_mgr, &app.input_state); + self.reset_offset(chaperone_mgr); log::info!("Space reset"); return; } } } - pub fn reset_offset(&mut self, chaperone_mgr: &mut ChaperoneSetupManager, input: &InputState) { - let height = match self.floor_y { - Some(y) => y, - None => input.hmd.translation.y - 1.7, - }; - - let xform = if self.universe == ETrackingUniverseOrigin::TrackingUniverseSeated { - Affine3A::from_translation(Vec3::NEG_Y * height) - } else { - Affine3A::IDENTITY - }; + pub fn reset_offset(&mut self, chaperone_mgr: &mut ChaperoneSetupManager) { + let mut xform = self.playspace_state.openvr_space_center; + if self.universe == ETrackingUniverseOrigin::TrackingUniverseSeated { + xform.translation.y -= 1.7; + } set_working_copy(&self.universe, chaperone_mgr, &xform); chaperone_mgr.commit_working_copy(EChaperoneConfigFile::EChaperoneConfigFile_Live); @@ -221,7 +213,7 @@ impl PlayspaceMover { }; let offset = y1.min(y2) - 0.03; mat.translation.y += offset; - self.floor_y = Some(mat.translation.y); + self.playspace_state.openvr_space_center.translation.y = mat.translation.y; set_working_copy(&self.universe, chaperone_mgr, &mat); chaperone_mgr.commit_working_copy(EChaperoneConfigFile::EChaperoneConfigFile_Live); diff --git a/wayvr/src/backend/openxr/mod.rs b/wayvr/src/backend/openxr/mod.rs index 2af7e2b2..557f156d 100644 --- a/wayvr/src/backend/openxr/mod.rs +++ b/wayvr/src/backend/openxr/mod.rs @@ -89,7 +89,7 @@ pub fn openxr_run(args: &Args) -> Result<(), BackendError> { app.late_init(); let mut playspace_mover = app.monado_state.as_mut().and_then(|m| { - playspace::PlayspaceMover::new(&mut m.ipc) + playspace::PlayspaceMover::new() .map_err(|e| log::warn!("Will not use Monado playspace mover: {e}")) .ok() }); diff --git a/wayvr/src/backend/openxr/playspace.rs b/wayvr/src/backend/openxr/playspace.rs index 641726a9..da896fca 100644 --- a/wayvr/src/backend/openxr/playspace.rs +++ b/wayvr/src/backend/openxr/playspace.rs @@ -1,5 +1,5 @@ use glam::{Affine3A, Quat, Vec3, Vec3A, vec3a}; -use libmonado::{MndResult, Monado, Pose, ReferenceSpaceType}; +use libmonado::{Monado, Pose, ReferenceSpaceType}; use wgui::log::LogErr; use crate::{ @@ -24,25 +24,17 @@ pub(super) struct PlayspaceMover { drag: Option>, rotate: Option>, gravity: SpaceGravity, - floor_y: f32, playspace_state: PlayspaceState, } impl PlayspaceMover { - pub fn new(monado: &mut Monado) -> anyhow::Result { + pub fn new() -> anyhow::Result { log::info!("Monado: using space offset API"); - let pose = match monado.get_reference_space_offset(ReferenceSpaceType::Stage) { - Err(MndResult::ErrorInvalidVersion) => anyhow::bail!("Space offsets not supported."), - Err(e) => anyhow::bail!("Could not initialize space mover: {e:?}"), - Ok(pose) => pose, - }; - Ok(Self { drag: None, rotate: None, gravity: SpaceGravity::new(), - floor_y: pose.position.y, playspace_state: load_playspace_state().unwrap_or_default(), }) } @@ -299,8 +291,7 @@ impl PlayspaceMover { } self.gravity.reset(); - let mut offset = Affine3A::IDENTITY; - offset.translation.y = self.floor_y; + let offset = self.playspace_state.openxr_space_center; apply_offset(offset, monado); } @@ -327,7 +318,7 @@ impl PlayspaceMover { pose.position.y += delta; - self.floor_y = pose.position.y; + self.playspace_state.openxr_space_center.translation.y = pose.position.y; let _ = monado .set_reference_space_offset(ReferenceSpaceType::Stage, pose)