From 1c6ebc745d6f16995c93f931c3176c1ce599cc38 Mon Sep 17 00:00:00 2001 From: galister <22305755+galister@users.noreply.github.com> Date: Sun, 21 Dec 2025 16:00:45 +0900 Subject: [PATCH] grab-help panel, FollowHand align_to_hmd --- uidev/assets/grab-help/controller-grip-b.svg | 1 + .../assets/grab-help/controller-grip-joy.svg | 1 + .../grab-help/controller-grip-trigger-joy.svg | 1 + uidev/assets/grab-help/controller.svg | 1 + wlx-common/src/config.rs | 51 ++--------- wlx-common/src/windowing.rs | 28 +++++- .../assets/grab-help/controller-grip-b.svg | 90 +++++++++++++++++++ .../assets/grab-help/controller-grip-joy.svg | 90 +++++++++++++++++++ .../grab-help/controller-grip-trigger-joy.svg | 90 +++++++++++++++++++ .../src/assets/grab-help/controller.svg | 86 ++++++++++++++++++ wlx-overlay-s/src/assets/gui/edit.xml | 11 ++- wlx-overlay-s/src/assets/gui/grab-help.xml | 27 ++++++ wlx-overlay-s/src/assets/lang/en.json | 18 ++++ wlx-overlay-s/src/backend/input.rs | 36 +++++++- wlx-overlay-s/src/config_wayvr.rs | 2 + wlx-overlay-s/src/overlays/anchor.rs | 26 +++++- wlx-overlay-s/src/overlays/edit/mod.rs | 12 +++ wlx-overlay-s/src/overlays/edit/pos.rs | 21 +++++ wlx-overlay-s/src/overlays/toast.rs | 1 + wlx-overlay-s/src/overlays/watch.rs | 1 + wlx-overlay-s/src/windowing/manager.rs | 12 ++- wlx-overlay-s/src/windowing/mod.rs | 3 +- wlx-overlay-s/src/windowing/window.rs | 35 +++++--- 23 files changed, 578 insertions(+), 66 deletions(-) create mode 120000 uidev/assets/grab-help/controller-grip-b.svg create mode 120000 uidev/assets/grab-help/controller-grip-joy.svg create mode 120000 uidev/assets/grab-help/controller-grip-trigger-joy.svg create mode 120000 uidev/assets/grab-help/controller.svg create mode 100644 wlx-overlay-s/src/assets/grab-help/controller-grip-b.svg create mode 100644 wlx-overlay-s/src/assets/grab-help/controller-grip-joy.svg create mode 100644 wlx-overlay-s/src/assets/grab-help/controller-grip-trigger-joy.svg create mode 100644 wlx-overlay-s/src/assets/grab-help/controller.svg create mode 100644 wlx-overlay-s/src/assets/gui/grab-help.xml diff --git a/uidev/assets/grab-help/controller-grip-b.svg b/uidev/assets/grab-help/controller-grip-b.svg new file mode 120000 index 0000000..1968a00 --- /dev/null +++ b/uidev/assets/grab-help/controller-grip-b.svg @@ -0,0 +1 @@ +../../../wlx-overlay-s/src/assets/grab-help/controller-grip-b.svg \ No newline at end of file diff --git a/uidev/assets/grab-help/controller-grip-joy.svg b/uidev/assets/grab-help/controller-grip-joy.svg new file mode 120000 index 0000000..cb8261a --- /dev/null +++ b/uidev/assets/grab-help/controller-grip-joy.svg @@ -0,0 +1 @@ +../../../wlx-overlay-s/src/assets/grab-help/controller-grip-joy.svg \ No newline at end of file diff --git a/uidev/assets/grab-help/controller-grip-trigger-joy.svg b/uidev/assets/grab-help/controller-grip-trigger-joy.svg new file mode 120000 index 0000000..ef9258b --- /dev/null +++ b/uidev/assets/grab-help/controller-grip-trigger-joy.svg @@ -0,0 +1 @@ +../../../wlx-overlay-s/src/assets/grab-help/controller-grip-trigger-joy.svg \ No newline at end of file diff --git a/uidev/assets/grab-help/controller.svg b/uidev/assets/grab-help/controller.svg new file mode 120000 index 0000000..c26f901 --- /dev/null +++ b/uidev/assets/grab-help/controller.svg @@ -0,0 +1 @@ +../../../wlx-overlay-s/src/assets/grab-help/controller.svg \ No newline at end of file diff --git a/wlx-common/src/config.rs b/wlx-common/src/config.rs index 0845d5f..7d20ddb 100644 --- a/wlx-common/src/config.rs +++ b/wlx-common/src/config.rs @@ -59,22 +59,6 @@ const fn def_osc_port() -> u16 { 9000 } -const fn def_empty_vec_string() -> Vec { - Vec::new() -} - -const fn def_sets() -> Vec { - Vec::new() -} - -fn def_global_set() -> SerializedWindowStates { - HashMap::new() -} - -const fn def_zero_u32() -> u32 { - 0 -} - fn def_timezones() -> Vec { const EMEA: i32 = -60 * 60; // UTC-1 const APAC: i32 = 5 * 60 * 60; // UTC+5 @@ -87,14 +71,6 @@ fn def_timezones() -> Vec { } } -const fn def_astrset_empty() -> AStrSet { - AStrSet::new() -} - -const fn def_attribs() -> AStrMap> { - AStrMap::new() -} - fn def_auto() -> Arc { "auto".into() } @@ -107,14 +83,6 @@ fn def_theme_path() -> Arc { "theme".into() } -fn def_toast_topics() -> IdMap { - IdMap::new() -} - -fn def_font() -> Arc { - "LiberationSans:style=Bold".into() -} - const fn def_max_height() -> u16 { 1440 } @@ -129,7 +97,7 @@ pub struct GeneralConfig { pub color_faded: Option, pub default_keymap: Option, - #[serde(default = "def_attribs")] + #[serde(default)] pub attribs: AStrMap>, #[serde(default = "def_click_freeze_time_ms")] @@ -153,7 +121,7 @@ pub struct GeneralConfig { #[serde(default = "def_true")] pub notifications_sound_enabled: bool, - #[serde(default = "def_toast_topics")] + #[serde(default)] pub notification_topics: IdMap, #[serde(default = "def_empty")] @@ -189,7 +157,7 @@ pub struct GeneralConfig { #[serde(default = "def_false")] pub single_set_mode: bool, - #[serde(default = "def_astrset_empty")] + #[serde(default)] pub custom_panels: AStrSet, #[serde(default = "def_auto")] @@ -231,9 +199,6 @@ pub struct GeneralConfig { #[serde(default = "def_true")] pub block_game_input_ignore_watch: bool, - #[serde(default = "def_font")] - pub primary_font: Arc, - #[serde(default = "def_one")] pub space_drag_multiplier: f32, @@ -258,10 +223,10 @@ pub struct GeneralConfig { #[serde(default = "def_false")] pub space_rotate_unlocked: bool, - #[serde(default = "def_empty_vec_string")] + #[serde(default)] pub alt_click_down: Vec, - #[serde(default = "def_empty_vec_string")] + #[serde(default)] pub alt_click_up: Vec, #[serde(default = "def_timezones")] @@ -270,12 +235,12 @@ pub struct GeneralConfig { #[serde(default = "def_false")] pub clock_12h: bool, - #[serde(default = "def_sets")] + #[serde(default)] pub sets: Vec, - #[serde(default = "def_global_set")] + #[serde(default)] pub global_set: SerializedWindowStates, - #[serde(default = "def_zero_u32")] + #[serde(default)] pub last_set: u32, } diff --git a/wlx-common/src/windowing.rs b/wlx-common/src/windowing.rs index 55ef9f5..23101e9 100644 --- a/wlx-common/src/windowing.rs +++ b/wlx-common/src/windowing.rs @@ -13,9 +13,18 @@ pub enum Positioning { /// Stays in place, no recentering Static, /// Following HMD - FollowHead { lerp: f32 }, + FollowHead { + #[serde(default)] + lerp: f32, + }, /// Following hand - FollowHand { hand: LeftRight, lerp: f32 }, + FollowHand { + hand: LeftRight, + #[serde(default)] + lerp: f32, + #[serde(default)] + align_to_hmd: bool, + }, } impl Positioning { @@ -37,6 +46,21 @@ impl Positioning { } self } + pub const fn get_align(self) -> Option { + match self { + Self::FollowHand { align_to_hmd, .. } => Some(align_to_hmd), + Self::FollowHead { .. } | Self::Floating | Self::Anchored | Self::Static => None, + } + } + pub const fn with_align(mut self, value: bool) -> Self { + match self { + Self::FollowHand { + ref mut align_to_hmd, .. + } => *align_to_hmd = value, + Self::FollowHead { .. } | Self::Floating | Self::Anchored | Self::Static => {} + } + self + } } // Contains the window state for a given set diff --git a/wlx-overlay-s/src/assets/grab-help/controller-grip-b.svg b/wlx-overlay-s/src/assets/grab-help/controller-grip-b.svg new file mode 100644 index 0000000..b1efd6b --- /dev/null +++ b/wlx-overlay-s/src/assets/grab-help/controller-grip-b.svg @@ -0,0 +1,90 @@ + + + + diff --git a/wlx-overlay-s/src/assets/grab-help/controller-grip-joy.svg b/wlx-overlay-s/src/assets/grab-help/controller-grip-joy.svg new file mode 100644 index 0000000..518bdad --- /dev/null +++ b/wlx-overlay-s/src/assets/grab-help/controller-grip-joy.svg @@ -0,0 +1,90 @@ + + + + diff --git a/wlx-overlay-s/src/assets/grab-help/controller-grip-trigger-joy.svg b/wlx-overlay-s/src/assets/grab-help/controller-grip-trigger-joy.svg new file mode 100644 index 0000000..4579eed --- /dev/null +++ b/wlx-overlay-s/src/assets/grab-help/controller-grip-trigger-joy.svg @@ -0,0 +1,90 @@ + + + + diff --git a/wlx-overlay-s/src/assets/grab-help/controller.svg b/wlx-overlay-s/src/assets/grab-help/controller.svg new file mode 100644 index 0000000..f9bdf99 --- /dev/null +++ b/wlx-overlay-s/src/assets/grab-help/controller.svg @@ -0,0 +1,86 @@ + + + + diff --git a/wlx-overlay-s/src/assets/gui/edit.xml b/wlx-overlay-s/src/assets/gui/edit.xml index 10bdbbf..4e4581d 100644 --- a/wlx-overlay-s/src/assets/gui/edit.xml +++ b/wlx-overlay-s/src/assets/gui/edit.xml @@ -64,9 +64,14 @@ -
-
diff --git a/wlx-overlay-s/src/assets/gui/grab-help.xml b/wlx-overlay-s/src/assets/gui/grab-help.xml new file mode 100644 index 0000000..c1611ff --- /dev/null +++ b/wlx-overlay-s/src/assets/gui/grab-help.xml @@ -0,0 +1,27 @@ + + +
+ + +
+ +
+
+ +
+
+ +
+ +
+
+
+
diff --git a/wlx-overlay-s/src/assets/lang/en.json b/wlx-overlay-s/src/assets/lang/en.json index 84bee53..4d76824 100644 --- a/wlx-overlay-s/src/assets/lang/en.json +++ b/wlx-overlay-s/src/assets/lang/en.json @@ -2,6 +2,7 @@ "ANCHOR": { "CENTER": "Center" }, + "DEFAULT": "Default", "DISABLED": "Disabled", "EDIT_MODE": { "ADJUST_CURVATURE": "Adjust curvature", @@ -12,6 +13,7 @@ "DISABLE_GRAB": "Disable grab", "HINT_POINT_WINDOW": "Point at a window to change its parameters.\nOnce done, leave edit mode using the button on the right.", "INTERPOLATION": "Interpolation", + "ALIGN_TO_HMD": "Align to HMD", "KEYBOARD": "Keyboard", "LEAVE": "Leave edit mode", "LOCK_INTERACTION": "Lock interaction", @@ -31,8 +33,24 @@ "SPLIT_RIGHT_LEFT": "RIGHT→LEFT", "SPLIT_TOP_BOTTOM": "TOP→BOTTOM", "TITLE": "3D Stereo Mode" + }, + "MOUSE": { + "TITLE": "Mouse fixes", + "EDIT_MODE.MOUSE.NORMAL": "Normal", + "EDIT_MODE.MOUSE.ROTATE90": "Rotated 90°", + "EDIT_MODE.MOUSE.ROTATE180": "Rotated 170°", + "EDIT_MODE.MOUSE.ROTATE270": "Rotated 270°", + "EDIT_MODE.MOUSE.FLIPPED": "Flipped", + "EDIT_MODE.MOUSE.ROTATE90": "Flipped 90°", + "EDIT_MODE.MOUSE.ROTATE180": "Flipped 170°", + "EDIT_MODE.MOUSE.ROTATE270": "Flipped 270°" } }, + "GRAB": { + "ADJUST_DISTANCE": "Adjust distance", + "ADJUST_SIZE": "Adjust size", + "UNRESTRICTED_MOVEMENT": "Unrestricted movement" + }, "WATCH": { "ADD_NEW_SET": "Add a new set", "CLEANUP_MIRRORS": "Remove mirrors that are\nnot currently visible", diff --git a/wlx-overlay-s/src/backend/input.rs b/wlx-overlay-s/src/backend/input.rs index 2c1bf56..9647039 100644 --- a/wlx-overlay-s/src/backend/input.rs +++ b/wlx-overlay-s/src/backend/input.rs @@ -10,7 +10,7 @@ use wlx_common::common::LeftRight; use wlx_common::windowing::{OverlayWindowState, Positioning}; use crate::backend::task::OverlayTask; -use crate::overlays::anchor::ANCHOR_NAME; +use crate::overlays::anchor::{ANCHOR_NAME, GRAB_HELP_NAME}; use crate::overlays::watch::WATCH_NAME; use crate::state::{AppSession, AppState}; use crate::subsystem::hid::WheelDelta; @@ -642,6 +642,20 @@ fn start_grab( o.activate(app); }), ))); + + if let Some(hand) = pointer.hand().clone() { + app.tasks.enqueue(TaskType::Overlay(OverlayTask::Modify( + OverlaySelector::Name(GRAB_HELP_NAME.clone()), + Box::new(move |app, o| { + o.default_state.positioning = Positioning::FollowHand { + hand, + lerp: 0.1, + align_to_hmd: true, + }; + o.activate(app); + }), + ))); + } } fn handle_scale(transform: &mut Affine3A, scroll_y: f32) { @@ -730,16 +744,26 @@ where // watch special: when dropped, follow the hand that wasn't grabbing if let Some(overlay_state) = overlay.config.active_state.as_mut() { overlay_state.positioning = match overlay_state.positioning { - Positioning::FollowHand { hand, lerp } => match pointer.hand() { + Positioning::FollowHand { + hand, + lerp, + align_to_hmd, + } => match pointer.hand() { Some(LeftRight::Left) => Positioning::FollowHand { hand: LeftRight::Right, lerp, + align_to_hmd, }, Some(LeftRight::Right) => Positioning::FollowHand { hand: LeftRight::Left, lerp, + align_to_hmd, + }, + _ => Positioning::FollowHand { + hand, + lerp, + align_to_hmd, }, - _ => Positioning::FollowHand { hand, lerp }, }, x => x, }; @@ -766,6 +790,12 @@ where o.deactivate(); }), ))); + app.tasks.enqueue(TaskType::Overlay(OverlayTask::Modify( + OverlaySelector::Name(GRAB_HELP_NAME.clone()), + Box::new(|_app, o| { + o.deactivate(); + }), + ))); log::debug!("Hand {}: dropped {}", idx, overlay.config.name); } } diff --git a/wlx-overlay-s/src/config_wayvr.rs b/wlx-overlay-s/src/config_wayvr.rs index 03946e8..3634091 100644 --- a/wlx-overlay-s/src/config_wayvr.rs +++ b/wlx-overlay-s/src/config_wayvr.rs @@ -40,10 +40,12 @@ impl AttachTo { Self::HandLeft => Positioning::FollowHand { hand: LeftRight::Left, lerp: 1.0, + align_to_hmd: false, }, Self::HandRight => Positioning::FollowHand { hand: LeftRight::Right, lerp: 1.0, + align_to_hmd: false, }, Self::Stage => Positioning::Static, Self::Head => Positioning::FollowHead { lerp: 1.0 }, diff --git a/wlx-overlay-s/src/overlays/anchor.rs b/wlx-overlay-s/src/overlays/anchor.rs index 0b4e272..95d8394 100644 --- a/wlx-overlay-s/src/overlays/anchor.rs +++ b/wlx-overlay-s/src/overlays/anchor.rs @@ -4,8 +4,8 @@ use wlx_common::windowing::{OverlayWindowState, Positioning}; use crate::gui::panel::GuiPanel; use crate::state::AppState; -use crate::windowing::Z_ORDER_ANCHOR; use crate::windowing::window::OverlayWindowConfig; +use crate::windowing::{Z_ORDER_ANCHOR, Z_ORDER_HELP}; pub static ANCHOR_NAME: LazyLock> = LazyLock::new(|| Arc::from("anchor")); @@ -31,3 +31,27 @@ pub fn create_anchor(app: &mut AppState) -> anyhow::Result ..OverlayWindowConfig::from_backend(Box::new(panel)) }) } + +pub static GRAB_HELP_NAME: LazyLock> = LazyLock::new(|| Arc::from("grab-help")); + +pub fn create_grab_help(app: &mut AppState) -> anyhow::Result { + let mut panel = GuiPanel::new_from_template(app, "gui/grab-help.xml", (), Default::default())?; + panel.update_layout()?; + + Ok(OverlayWindowConfig { + name: GRAB_HELP_NAME.clone(), + z_order: Z_ORDER_HELP, + default_state: OverlayWindowState { + interactable: false, + grabbable: false, + transform: Affine3A::from_scale_rotation_translation( + Vec3::ONE * 0.15, + Quat::IDENTITY, + Vec3::ZERO, + ), + ..OverlayWindowState::default() + }, + global: true, + ..OverlayWindowConfig::from_backend(Box::new(panel)) + }) +} diff --git a/wlx-overlay-s/src/overlays/edit/mod.rs b/wlx-overlay-s/src/overlays/edit/mod.rs index a25cd77..12a8183 100644 --- a/wlx-overlay-s/src/overlays/edit/mod.rs +++ b/wlx-overlay-s/src/overlays/edit/mod.rs @@ -381,6 +381,7 @@ fn make_edit_panel(app: &mut AppState) -> anyhow::Result { )?; set_up_checkbox(&mut panel, "additive_box", cb_assign_additive)?; + set_up_checkbox(&mut panel, "align_box", cb_assign_align)?; set_up_slider(&mut panel, "lerp_slider", cb_assign_lerp)?; set_up_slider(&mut panel, "alpha_slider", cb_assign_alpha)?; set_up_slider(&mut panel, "curve_slider", cb_assign_curve)?; @@ -427,6 +428,11 @@ fn reset_panel( .fetch_component_as::("additive_box")?; c.set_checked(&mut common, state.additive); + let c = panel + .parser_state + .fetch_component_as::("align_box")?; + c.set_checked(&mut common, state.positioning.get_align().unwrap_or(false)); + panel .state .pos @@ -493,6 +499,12 @@ const fn cb_assign_additive(_app: &mut AppState, owc: &mut OverlayWindowConfig, owc.active_state.as_mut().unwrap().additive = additive; } +const fn cb_assign_align(_app: &mut AppState, owc: &mut OverlayWindowConfig, align: bool) { + owc.dirty = true; + let active_state = owc.active_state.as_mut().unwrap(); + active_state.positioning = active_state.positioning.with_align(align); +} + fn set_up_slider( panel: &mut EditModeWrapPanel, id: &str, diff --git a/wlx-overlay-s/src/overlays/edit/pos.rs b/wlx-overlay-s/src/overlays/edit/pos.rs index 8237a2f..2305dd3 100644 --- a/wlx-overlay-s/src/overlays/edit/pos.rs +++ b/wlx-overlay-s/src/overlays/edit/pos.rs @@ -15,6 +15,7 @@ static POS_NAMES: [&str; 6] = ["static", "anchored", "floating", "hmd", "hand_l" pub struct PosTabState { pos: Positioning, has_lerp: bool, + has_align: bool, } impl From for PosTabState { @@ -22,6 +23,7 @@ impl From for PosTabState { Self { pos: value, has_lerp: false, + has_align: false, } } } @@ -30,6 +32,7 @@ pub fn new_pos_tab_handler( panel: &mut EditModeWrapPanel, ) -> anyhow::Result> { let interpolation_id = panel.parser_state.get_widget_id("pos_interpolation")?; + let align_to_hmd_id = panel.parser_state.get_widget_id("pos_align_to_hmd")?; SpriteTabHandler::new( panel, @@ -55,6 +58,16 @@ pub fn new_pos_tab_handler( interpolation_id, StyleSetRequest::Display(interpolation_disp), ); + + let align_to_hmd_disp = if state.has_align { + taffy::Display::Flex + } else { + taffy::Display::None + }; + + common + .alterables + .set_style(align_to_hmd_id, StyleSetRequest::Display(align_to_hmd_disp)); })), ) } @@ -82,32 +95,40 @@ impl SpriteTabKey for PosTabState { "static" => PosTabState { pos: Positioning::Static, has_lerp: false, + has_align: false, }, "anchored" => PosTabState { pos: Positioning::Anchored, has_lerp: false, + has_align: false, }, "floating" => PosTabState { pos: Positioning::Floating, has_lerp: false, + has_align: false, }, "hmd" => PosTabState { pos: Positioning::FollowHead { lerp: 1.0 }, has_lerp: true, + has_align: false, }, "hand_l" => PosTabState { pos: Positioning::FollowHand { hand: LeftRight::Left, lerp: 1.0, + align_to_hmd: false, }, has_lerp: true, + has_align: true, }, "hand_r" => PosTabState { pos: Positioning::FollowHand { hand: LeftRight::Right, lerp: 1.0, + align_to_hmd: false, }, has_lerp: true, + has_align: true, }, _ => { panic!("cannot translate to positioning: {key}") diff --git a/wlx-overlay-s/src/overlays/toast.rs b/wlx-overlay-s/src/overlays/toast.rs index 847b715..a2bb58f 100644 --- a/wlx-overlay-s/src/overlays/toast.rs +++ b/wlx-overlay-s/src/overlays/toast.rs @@ -128,6 +128,7 @@ fn new_toast(toast: Toast, app: &mut AppState) -> Option { LeftRight::Left =>*/ Positioning::FollowHand { hand: LeftRight::Left, lerp: 1.0, + align_to_hmd: true, /* }, LeftRight::Right => { diff --git a/wlx-overlay-s/src/overlays/watch.rs b/wlx-overlay-s/src/overlays/watch.rs index df50df7..d07ad9a 100644 --- a/wlx-overlay-s/src/overlays/watch.rs +++ b/wlx-overlay-s/src/overlays/watch.rs @@ -433,6 +433,7 @@ pub fn create_watch(app: &mut AppState) -> anyhow::Result { let positioning = Positioning::FollowHand { hand: LeftRight::Left, lerp: 1.0, + align_to_hmd: false, }; panel.update_layout()?; diff --git a/wlx-overlay-s/src/windowing/manager.rs b/wlx-overlay-s/src/windowing/manager.rs index fd5a223..f40cfe6 100644 --- a/wlx-overlay-s/src/windowing/manager.rs +++ b/wlx-overlay-s/src/windowing/manager.rs @@ -16,8 +16,13 @@ use crate::{ backend::task::OverlayTask, config::save_state, overlays::{ - anchor::create_anchor, custom::create_custom, edit::EditWrapperManager, - keyboard::create_keyboard, screen::create_screens, toast::Toast, watch::create_watch, + anchor::{create_anchor, create_grab_help}, + custom::create_custom, + edit::EditWrapperManager, + keyboard::create_keyboard, + screen::create_screens, + toast::Toast, + watch::create_watch, }, state::AppState, windowing::{ @@ -115,6 +120,9 @@ where let watch = OverlayWindowData::from_config(create_watch(app)?); me.watch_id = me.add(watch, app); + let grab_help = OverlayWindowData::from_config(create_grab_help(app)?); + me.add(grab_help, app); + let custom_panels = app.session.config.custom_panels.clone(); for name in custom_panels.into_iter() { let Some(panel) = create_custom(app, name) else { diff --git a/wlx-overlay-s/src/windowing/mod.rs b/wlx-overlay-s/src/windowing/mod.rs index c3eaa32..932286f 100644 --- a/wlx-overlay-s/src/windowing/mod.rs +++ b/wlx-overlay-s/src/windowing/mod.rs @@ -17,7 +17,8 @@ pub enum OverlaySelector { Name(Arc), } -pub const Z_ORDER_TOAST: u32 = 70; +pub const Z_ORDER_TOAST: u32 = 71; +pub const Z_ORDER_HELP: u32 = 70; pub const Z_ORDER_LINES: u32 = 69; pub const Z_ORDER_WATCH: u32 = 68; pub const Z_ORDER_ANCHOR: u32 = 67; diff --git a/wlx-overlay-s/src/windowing/window.rs b/wlx-overlay-s/src/windowing/window.rs index 0ae58c5..fb25970 100644 --- a/wlx-overlay-s/src/windowing/window.rs +++ b/wlx-overlay-s/src/windowing/window.rs @@ -145,12 +145,18 @@ impl OverlayWindowConfig { .saved_transform .unwrap_or(self.default_state.transform); - let (parent_transform, lerp) = match state.positioning { - Positioning::FollowHead { lerp } => (app.input_state.hmd, lerp), - Positioning::FollowHand { hand, lerp } => { - (app.input_state.pointers[hand as usize].pose, lerp) - } - Positioning::Anchored => (app.anchor, 1.0), + let (parent_transform, lerp, align_to_hmd) = match state.positioning { + Positioning::FollowHead { lerp } => (app.input_state.hmd, lerp, false), + Positioning::FollowHand { + hand, + lerp, + align_to_hmd, + } => ( + app.input_state.pointers[hand as usize].pose, + lerp, + align_to_hmd, + ), + Positioning::Anchored => (app.anchor, 1.0, false), _ => return, }; @@ -177,6 +183,11 @@ impl OverlayWindowConfig { ) } }; + + if align_to_hmd { + realign(&mut state.transform, &app.input_state.hmd); + } + self.dirty = true; } @@ -190,10 +201,12 @@ impl OverlayWindowConfig { .saved_transform .unwrap_or(self.default_state.transform); - let parent_transform = match state.positioning { - Positioning::Floating | Positioning::FollowHead { .. } => app.input_state.hmd, - Positioning::FollowHand { hand, .. } => app.input_state.pointers[hand as usize].pose, - Positioning::Anchored => app.anchor, + let (parent_transform, align_to_hmd) = match state.positioning { + Positioning::Floating | Positioning::FollowHead { .. } => (app.input_state.hmd, false), + Positioning::FollowHand { + hand, align_to_hmd, .. + } => (app.input_state.pointers[hand as usize].pose, align_to_hmd), + Positioning::Anchored => (app.anchor, false), Positioning::Static => return, }; @@ -203,7 +216,7 @@ impl OverlayWindowConfig { state.transform = parent_transform * cur_transform; - if state.grabbable && hard_reset { + if align_to_hmd || (state.grabbable && hard_reset) { realign(&mut state.transform, &app.input_state.hmd); } self.dirty = true;