From e6cb608bbfd667fb66dc71c3c4d4a67da1b1ad66 Mon Sep 17 00:00:00 2001 From: galister <22305755+galister@users.noreply.github.com> Date: Mon, 22 Dec 2025 13:08:02 +0900 Subject: [PATCH] add space_drag_unlocked settings --- wlx-common/src/config.rs | 3 ++ wlx-overlay-s/src/backend/openvr/playspace.rs | 28 +++++++++------- wlx-overlay-s/src/backend/openxr/playspace.rs | 32 +++++++++++-------- wlx-overlay-s/src/res/config.yaml | 8 +++-- 4 files changed, 43 insertions(+), 28 deletions(-) diff --git a/wlx-common/src/config.rs b/wlx-common/src/config.rs index 8b6e6f6..03590e7 100644 --- a/wlx-common/src/config.rs +++ b/wlx-common/src/config.rs @@ -205,6 +205,9 @@ pub struct GeneralConfig { #[serde(default = "def_point3")] pub pointer_lerp_factor: f32, + #[serde(default = "def_true")] + pub space_drag_unlocked: bool, + #[serde(default = "def_false")] pub space_rotate_unlocked: bool, diff --git a/wlx-overlay-s/src/backend/openvr/playspace.rs b/wlx-overlay-s/src/backend/openvr/playspace.rs index 918aad7..0ff600a 100644 --- a/wlx-overlay-s/src/backend/openvr/playspace.rs +++ b/wlx-overlay-s/src/backend/openvr/playspace.rs @@ -1,4 +1,4 @@ -use glam::{Affine3A, Quat, Vec3, Vec3A}; +use glam::{Affine3A, Quat, Vec3, Vec3A, vec3a}; use ovr_overlay::{ chaperone_setup::ChaperoneSetupManager, compositor::CompositorManager, @@ -58,12 +58,12 @@ impl PlayspaceMover { &mut self, chaperone_mgr: &mut ChaperoneSetupManager, overlays: &mut OverlayWindowManager, - state: &AppState, + app: &AppState, ) { let universe = self.universe.clone(); if let Some(data) = self.rotate.as_mut() { - let pointer = &state.input_state.pointers[data.hand]; + let pointer = &app.input_state.pointers[data.hand]; if !pointer.now.space_rotate { self.rotate = None; log::info!("End space rotate"); @@ -71,7 +71,7 @@ impl PlayspaceMover { } let new_hand = - Quat::from_affine3(&(data.pose * state.input_state.pointers[data.hand].raw_pose)); + Quat::from_affine3(&(data.pose * app.input_state.pointers[data.hand].raw_pose)); let dq = new_hand * data.hand_pose.conjugate(); let rel_y = f32::atan2( @@ -80,8 +80,8 @@ impl PlayspaceMover { ); let mut space_transform = Affine3A::from_rotation_y(rel_y); - let offset = (space_transform.transform_vector3a(state.input_state.hmd.translation) - - state.input_state.hmd.translation) + let offset = (space_transform.transform_vector3a(app.input_state.hmd.translation) + - app.input_state.hmd.translation) * -1.0; let mut overlay_transform = Affine3A::from_rotation_y(-rel_y); @@ -97,7 +97,7 @@ impl PlayspaceMover { set_working_copy(&universe, chaperone_mgr, &data.pose); chaperone_mgr.commit_working_copy(EChaperoneConfigFile::EChaperoneConfigFile_Live); } else { - for (i, pointer) in state.input_state.pointers.iter().enumerate() { + for (i, pointer) in app.input_state.pointers.iter().enumerate() { if pointer.now.space_rotate { let Some(mat) = get_working_copy(&universe, chaperone_mgr) else { log::warn!("Can't space rotate - failed to get zero pose"); @@ -117,7 +117,7 @@ impl PlayspaceMover { } if let Some(data) = self.drag.as_mut() { - let pointer = &state.input_state.pointers[data.hand]; + let pointer = &app.input_state.pointers[data.hand]; if !pointer.now.space_drag { self.drag = None; log::info!("End space drag"); @@ -126,9 +126,13 @@ impl PlayspaceMover { let new_hand = data .pose - .transform_point3a(state.input_state.pointers[data.hand].raw_pose.translation); - let relative_pos = - (new_hand - data.hand_pose) * state.session.config.space_drag_multiplier; + .transform_point3a(app.input_state.pointers[data.hand].raw_pose.translation); + + let relative_pos = if app.session.config.space_drag_unlocked { + new_hand - data.hand_pose + } else { + vec3a(0., new_hand.y - data.hand_pose.y, 0.) + } * app.session.config.space_drag_multiplier; if relative_pos.length_squared() > 1000.0 { log::warn!("Space drag too fast, ignoring"); @@ -156,7 +160,7 @@ impl PlayspaceMover { set_working_copy(&universe, chaperone_mgr, &data.pose); chaperone_mgr.commit_working_copy(EChaperoneConfigFile::EChaperoneConfigFile_Live); } else { - for (i, pointer) in state.input_state.pointers.iter().enumerate() { + for (i, pointer) in app.input_state.pointers.iter().enumerate() { if pointer.now.space_drag { let Some(mat) = get_working_copy(&universe, chaperone_mgr) else { log::warn!("Can't space drag - failed to get zero pose"); diff --git a/wlx-overlay-s/src/backend/openxr/playspace.rs b/wlx-overlay-s/src/backend/openxr/playspace.rs index 0af07da..8c0bdaf 100644 --- a/wlx-overlay-s/src/backend/openxr/playspace.rs +++ b/wlx-overlay-s/src/backend/openxr/playspace.rs @@ -1,4 +1,4 @@ -use glam::{Affine3A, Quat, Vec3A}; +use glam::{Affine3A, Quat, Vec3A, vec3a}; use libmonado::{Monado, Pose, ReferenceSpaceType}; use crate::{ @@ -60,10 +60,10 @@ impl PlayspaceMover { pub fn update( &mut self, overlays: &mut OverlayWindowManager, - state: &AppState, + app: &AppState, monado: &mut Monado, ) { - for pointer in &state.input_state.pointers { + for pointer in &app.input_state.pointers { if pointer.now.space_reset { if !pointer.before.space_reset { log::info!("Space reset"); @@ -74,7 +74,7 @@ impl PlayspaceMover { } if let Some(mut data) = self.rotate.take() { - let pointer = &state.input_state.pointers[data.hand]; + let pointer = &app.input_state.pointers[data.hand]; if !pointer.now.space_rotate { self.last_transform = data.pose; log::info!("End space rotate"); @@ -82,10 +82,10 @@ impl PlayspaceMover { } let new_hand = - Quat::from_affine3(&(data.pose * state.input_state.pointers[data.hand].raw_pose)); + Quat::from_affine3(&(data.pose * app.input_state.pointers[data.hand].raw_pose)); let dq = new_hand * data.hand_pose.conjugate(); - let mut space_transform = if state.session.config.space_rotate_unlocked { + let mut space_transform = if app.session.config.space_rotate_unlocked { Affine3A::from_quat(dq) } else { let rel_y = f32::atan2( @@ -95,8 +95,8 @@ impl PlayspaceMover { Affine3A::from_rotation_y(rel_y) }; - let offset = (space_transform.transform_vector3a(state.input_state.hmd.translation) - - state.input_state.hmd.translation) + let offset = (space_transform.transform_vector3a(app.input_state.hmd.translation) + - app.input_state.hmd.translation) * -1.0; space_transform.translation = offset; @@ -107,7 +107,7 @@ impl PlayspaceMover { apply_offset(data.pose, monado); self.rotate = Some(data); } else { - for (i, pointer) in state.input_state.pointers.iter().enumerate() { + 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)); self.rotate = Some(MoverData { @@ -123,7 +123,7 @@ impl PlayspaceMover { } if let Some(mut data) = self.drag.take() { - let pointer = &state.input_state.pointers[data.hand]; + let pointer = &app.input_state.pointers[data.hand]; if !pointer.now.space_drag { self.last_transform = data.pose; log::info!("End space drag"); @@ -132,9 +132,13 @@ impl PlayspaceMover { let new_hand = data .pose - .transform_point3a(state.input_state.pointers[data.hand].raw_pose.translation); - let relative_pos = - (new_hand - data.hand_pose) * state.session.config.space_drag_multiplier; + .transform_point3a(app.input_state.pointers[data.hand].raw_pose.translation); + + let relative_pos = if app.session.config.space_drag_unlocked { + new_hand - data.hand_pose + } else { + vec3a(0., new_hand.y - data.hand_pose.y, 0.) + } * app.session.config.space_drag_multiplier; if relative_pos.length_squared() > 1000.0 { log::warn!("Space drag too fast, ignoring"); @@ -159,7 +163,7 @@ impl PlayspaceMover { apply_offset(data.pose, monado); self.drag = Some(data); } else { - for (i, pointer) in state.input_state.pointers.iter().enumerate() { + for (i, pointer) in app.input_state.pointers.iter().enumerate() { if pointer.now.space_drag { let hand_pos = self .last_transform diff --git a/wlx-overlay-s/src/res/config.yaml b/wlx-overlay-s/src/res/config.yaml index 8dc9270..073a1d0 100644 --- a/wlx-overlay-s/src/res/config.yaml +++ b/wlx-overlay-s/src/res/config.yaml @@ -28,8 +28,12 @@ ## How fast to drag when the space drag feature is activated #space_drag_multiplier: 1.0 -## When enabled, the space_rotate binding can be used -## to rotate in any axis. Imagine horizon mode². +## Setting this to false will make space_drag +## only affect the vertical axis (Y). +#space_drag_unlocked: true + +## Monado/WiVRn only. When enabled, the space_rotate binding +## can rotate in any axis. Imagine horizon mode². #space_rotate_unlocked: false ## Monado/WiVRn only. Use passthrough camera if the headset supports it.