diff --git a/src/backend/common.rs b/src/backend/common.rs index 807c4284..183ba7c5 100644 --- a/src/backend/common.rs +++ b/src/backend/common.rs @@ -97,7 +97,7 @@ where self.overlays.values_mut() } - pub fn show_hide(&mut self) { + pub fn show_hide(&mut self, app: &mut AppState) { let any_shown = self .overlays .values() @@ -106,6 +106,9 @@ where self.overlays.values_mut().for_each(|o| { if o.state.show_hide { o.state.want_visible = !any_shown; + if o.state.want_visible && app.session.recenter_on_show { + o.state.reset(app, false); + } } }) } diff --git a/src/backend/input.rs b/src/backend/input.rs index 8e4ed524..1d3bf5d0 100644 --- a/src/backend/input.rs +++ b/src/backend/input.rs @@ -421,7 +421,6 @@ impl Pointer { grab_data.offset.z -= self.now.scroll * 0.05; } _ => { - log::warn!("scale: {}", self.now.scroll); overlay.state.transform.matrix3 = overlay .state .transform @@ -433,7 +432,9 @@ impl Pointer { overlay.state.realign(hmd); overlay.state.dirty = true; } else { - overlay.state.spawn_point = overlay.state.transform.translation.into(); + overlay.state.spawn_point = hmd + .inverse() + .transform_point3a(overlay.state.transform.translation); self.interaction.grabbed = None; log::info!("Hand {}: dropped {}", self.idx, overlay.state.name); } diff --git a/src/backend/openvr/mod.rs b/src/backend/openvr/mod.rs index 5160b031..d777d9a8 100644 --- a/src/backend/openvr/mod.rs +++ b/src/backend/openvr/mod.rs @@ -153,7 +153,7 @@ pub fn openvr_run(running: Arc) -> Result<(), BackendError> { .iter() .any(|p| p.now.show_hide && !p.before.show_hide) { - overlays.show_hide(); + overlays.show_hide(&mut state); } overlays diff --git a/src/backend/openxr/mod.rs b/src/backend/openxr/mod.rs index 491e041a..fff0a753 100644 --- a/src/backend/openxr/mod.rs +++ b/src/backend/openxr/mod.rs @@ -200,7 +200,7 @@ pub fn openxr_run(running: Arc) -> Result<(), BackendError> { .any(|p| p.now.show_hide && !p.before.show_hide) { if show_hide_counter.click() { - overlays.show_hide(); + overlays.show_hide(&mut app_state); } } diff --git a/src/backend/overlay.rs b/src/backend/overlay.rs index cea449e7..d0e691f5 100644 --- a/src/backend/overlay.rs +++ b/src/backend/overlay.rs @@ -103,15 +103,20 @@ impl OverlayState { } } - pub fn reset(&mut self, app: &mut AppState) { + pub fn reset(&mut self, app: &mut AppState, reset_scale: bool) { let translation = app.input_state.hmd.transform_point3a(self.spawn_point); + let scale = if reset_scale { + self.spawn_scale + } else { + self.transform.x_axis.length() + }; self.transform = Affine3A::from_scale_rotation_translation( - Vec3::ONE * self.spawn_scale, + Vec3::ONE * scale, Quat::IDENTITY, translation.into(), ); - self.realign(&app.input_state.hmd); + self.dirty = true; } pub fn realign(&mut self, hmd: &Affine3A) { @@ -160,7 +165,7 @@ where T: Default, { pub fn init(&mut self, app: &mut AppState) { - self.state.reset(app); + self.state.reset(app, true); self.backend.init(app); } pub fn render(&mut self, app: &mut AppState) { diff --git a/src/overlays/watch.rs b/src/overlays/watch.rs index 505b5c24..20594f1e 100644 --- a/src/overlays/watch.rs +++ b/src/overlays/watch.rs @@ -99,16 +99,19 @@ where { app.tasks.enqueue(TaskType::Overlay( OverlaySelector::Name("kbd".into()), - Box::new(|_app, o| { + Box::new(|app, o| { o.show_hide = !o.show_hide; o.want_visible = o.show_hide; + if app.session.recenter_on_show { + o.reset(app, false); + } }), )); } else { app.tasks.enqueue(TaskType::Overlay( OverlaySelector::Name("kbd".into()), Box::new(|app, o| { - o.reset(app); + o.reset(app, true); }), )); } @@ -146,16 +149,19 @@ where { app.tasks.enqueue(TaskType::Overlay( OverlaySelector::Id(scr_idx), - Box::new(|_app, o| { + Box::new(|app, o| { o.show_hide = !o.show_hide; o.want_visible = o.show_hide; + if app.session.recenter_on_show { + o.reset(app, false); + } }), )); } else { app.tasks.enqueue(TaskType::Overlay( OverlaySelector::Id(scr_idx), Box::new(|app, o| { - o.reset(app); + o.reset(app, true); }), )); } diff --git a/src/res/config.yaml b/src/res/config.yaml index 523a5f47..1b3634f9 100644 --- a/src/res/config.yaml +++ b/src/res/config.yaml @@ -3,6 +3,8 @@ # Default: 300 click_freeze_time_ms: 300 +recenter_on_show: true + # Default: true keyboard_sound_enabled: true diff --git a/src/state.rs b/src/state.rs index 493f9044..856b5b5d 100644 --- a/src/state.rs +++ b/src/state.rs @@ -77,6 +77,7 @@ pub struct AppSession { pub config: GeneralConfig, pub show_screens: Vec, + pub recenter_on_show: bool, pub watch_hand: usize, pub watch_pos: Vec3, @@ -102,6 +103,7 @@ impl AppSession { config_root_path, config, show_screens: vec!["DP-3".to_string()], + recenter_on_show: true, capture_method: "auto".to_string(), primary_hand: 1, watch_hand: 0,