From 7d03e7aa75151c1f78ead7695809c7d40c4432dc Mon Sep 17 00:00:00 2001 From: Snemby Date: Sun, 10 May 2026 21:33:51 +0200 Subject: [PATCH] fix playspace reverting on space drag --- wayvr/src/backend/openxr/mod.rs | 14 ++----- wayvr/src/backend/openxr/playspace.rs | 60 ++++++++++++++------------- 2 files changed, 34 insertions(+), 40 deletions(-) diff --git a/wayvr/src/backend/openxr/mod.rs b/wayvr/src/backend/openxr/mod.rs index f6ec7a44..3b686d3c 100644 --- a/wayvr/src/backend/openxr/mod.rs +++ b/wayvr/src/backend/openxr/mod.rs @@ -94,11 +94,7 @@ pub fn openxr_run( app.monado_state_init(); - let mut playspace = app.monado_state.as_mut().and_then(|m| { - playspace::PlayspaceMover::new(&mut m.ipc) - .map_err(|e| log::warn!("Will not use Monado playspace mover: {e}")) - .ok() - }); + let mut space_mover = playspace::PlayspaceMover::new(); let mut blocker = app .monado_state @@ -296,9 +292,7 @@ pub fn openxr_run( .enqueue(TaskType::Overlay(OverlayTask::ToggleDashboard)); } - if let Some(ref mut space_mover) = playspace { - space_mover.update(&mut overlays, &mut app); - } + space_mover.update(&mut overlays, &mut app); for o in overlays.values_mut() { o.after_input(&mut app)?; @@ -481,9 +475,7 @@ pub fn openxr_run( overlays.handle_task(&mut app, task)?; } TaskType::Playspace(task) => { - if let Some(playspace) = playspace.as_mut() { - playspace.handle_task(&mut app, task); - } + space_mover.handle_task(&mut app, task); } TaskType::OpenXR(task) => { if matches!(task, OpenXrTask::EnvironmentChanged) { diff --git a/wayvr/src/backend/openxr/playspace.rs b/wayvr/src/backend/openxr/playspace.rs index 3f02d377..4e4f1613 100644 --- a/wayvr/src/backend/openxr/playspace.rs +++ b/wayvr/src/backend/openxr/playspace.rs @@ -1,4 +1,4 @@ -use glam::{Affine3A, Quat, Vec3A, vec3a}; +use glam::{Affine3A, Mat3A, Quat, Vec3A, vec3a}; use libmonado::{Monado, Pose, ReferenceSpaceType}; use crate::{ @@ -16,31 +16,16 @@ struct MoverData { } pub(super) struct PlayspaceMover { - last_transform: Affine3A, drag: Option>, rotate: Option>, } impl PlayspaceMover { - pub fn new(monado: &mut Monado) -> anyhow::Result { - log::info!("Monado: using space offset API"); - - let Ok(stage) = monado.get_reference_space_offset(ReferenceSpaceType::Stage) else { - anyhow::bail!("Space offsets not supported."); - }; - - log::debug!("STAGE is at {:?}, {:?}", stage.position, stage.orientation); - - // initial offset - let last_transform = - Affine3A::from_rotation_translation(stage.orientation.into(), stage.position.into()); - - Ok(Self { - last_transform, - + pub fn new() -> Self { + Self { drag: None, rotate: None, - }) + } } pub fn handle_task(&mut self, app: &mut AppState, task: PlayspaceTask) { @@ -83,7 +68,6 @@ impl PlayspaceMover { if let Some(mut data) = self.rotate.take() { let pointer = &app.input_state.pointers[data.hand]; if !pointer.now.space_rotate { - self.last_transform = data.pose; log::info!("End space rotate"); return; } @@ -116,9 +100,16 @@ impl PlayspaceMover { } else { for (i, pointer) in app.input_state.pointers.iter().enumerate() { if pointer.now.space_rotate { - let hand_pose = Quat::from_affine3(&(self.last_transform * pointer.raw_pose)); + let transform = match get_offset(&mut monado.ipc) { + Ok(transform) => transform, + Err(err) => { + log::warn!("Could not get initial space rotate offset: {err}"); + continue; + } + }; + let hand_pose = Quat::from_affine3(&(transform * pointer.raw_pose)); self.rotate = Some(MoverData { - pose: self.last_transform, + pose: transform, hand: i, hand_pose, }); @@ -132,7 +123,6 @@ impl PlayspaceMover { if let Some(mut data) = self.drag.take() { let pointer = &app.input_state.pointers[data.hand]; if !pointer.now.space_drag { - self.last_transform = data.pose; log::info!("End space drag"); return; } @@ -172,11 +162,16 @@ impl PlayspaceMover { } else { for (i, pointer) in app.input_state.pointers.iter().enumerate() { if pointer.now.space_drag { - let hand_pos = self - .last_transform - .transform_point3a(pointer.raw_pose.translation); + let transform = match get_offset(&mut monado.ipc) { + Ok(transform) => transform, + Err(err) => { + log::warn!("Could not get initial space drag offset: {err}"); + continue; + } + }; + let hand_pos = transform.transform_point3a(pointer.raw_pose.translation); self.drag = Some(MoverData { - pose: self.last_transform, + pose: transform, hand: i, hand_pose: hand_pos, }); @@ -222,8 +217,7 @@ impl PlayspaceMover { self.rotate = None; } - self.last_transform = Affine3A::IDENTITY; - apply_offset(self.last_transform, monado); + apply_offset(Affine3A::IDENTITY, monado); } pub fn fix_floor(&mut self, input: &InputState, monado: &mut Monado) { @@ -255,6 +249,14 @@ impl PlayspaceMover { } } +fn get_offset(monado: &mut Monado) -> Result { + let pose = monado.get_reference_space_offset(ReferenceSpaceType::Stage)?; + Ok(Affine3A { + matrix3: Mat3A::from_quat(pose.orientation.into()), + translation: pose.position.into(), + }) +} + fn apply_offset(transform: Affine3A, monado: &mut Monado) { let pose = Pose { position: transform.translation.into(),