mirror of https://github.com/wayvr-org/wayvr.git
fix playspace center saving
This commit is contained in:
parent
078055dc0f
commit
4e4d552bb6
|
|
@ -24,7 +24,6 @@ pub(super) struct PlayspaceMover {
|
|||
universe: ETrackingUniverseOrigin,
|
||||
drag: Option<MoverData<Vec3A>>,
|
||||
rotate: Option<MoverData<Quat>>,
|
||||
floor_y: Option<f32>,
|
||||
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);
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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<MoverData<Vec3A>>,
|
||||
rotate: Option<MoverData<Quat>>,
|
||||
gravity: SpaceGravity,
|
||||
floor_y: f32,
|
||||
playspace_state: PlayspaceState,
|
||||
}
|
||||
|
||||
impl PlayspaceMover {
|
||||
pub fn new(monado: &mut Monado) -> anyhow::Result<Self> {
|
||||
pub fn new() -> anyhow::Result<Self> {
|
||||
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)
|
||||
|
|
|
|||
Loading…
Reference in New Issue