fix playspace center saving

This commit is contained in:
galister 2026-07-23 18:12:05 +09:00
parent 078055dc0f
commit 4e4d552bb6
3 changed files with 13 additions and 30 deletions

View File

@ -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);

View File

@ -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()
});

View File

@ -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)