From a0a853825c8a69c8e305752b471f35d2b988fe07 Mon Sep 17 00:00:00 2001 From: galister <22305755+galister@users.noreply.github.com> Date: Tue, 4 Jun 2024 17:51:31 +0900 Subject: [PATCH] fix: settings spawn in wrong spot --- src/backend/input.rs | 36 +++++++++++++++++++----------------- src/backend/overlay.rs | 16 +++++++++++++++- src/overlays/keyboard.rs | 1 + src/overlays/screen.rs | 1 + 4 files changed, 36 insertions(+), 18 deletions(-) diff --git a/src/backend/input.rs b/src/backend/input.rs index b4bf674..7005c10 100644 --- a/src/backend/input.rs +++ b/src/backend/input.rs @@ -531,25 +531,27 @@ impl Pointer { self.interaction.grabbed = None; } } else { - overlay.state.saved_transform = - Some(snap_upright(*anchor, Vec3A::Y).inverse() * overlay.state.transform); + if overlay.state.anchored { + overlay.state.saved_transform = + Some(snap_upright(*anchor, Vec3A::Y).inverse() * overlay.state.transform); - if let Some(grab_data) = self.interaction.grabbed.as_ref() { - if overlay.state.curvature != grab_data.old_curvature { - if let Some(val) = overlay.state.curvature { - config.curve_values.arc_ins(overlay.state.name.clone(), val); - } else { - let ref_name = overlay.state.name.as_ref(); - config.curve_values.arc_rm(ref_name); + if let Some(grab_data) = self.interaction.grabbed.as_ref() { + if overlay.state.curvature != grab_data.old_curvature { + if let Some(val) = overlay.state.curvature { + config.curve_values.arc_ins(overlay.state.name.clone(), val); + } else { + let ref_name = overlay.state.name.as_ref(); + config.curve_values.arc_rm(ref_name); + } + } + config.transform_values.arc_ins( + overlay.state.name.clone(), + overlay.state.saved_transform.unwrap(), + ); + match save_state(config) { + Ok(_) => log::debug!("Saved state"), + Err(e) => log::error!("Failed to save state: {:?}", e), } - } - config.transform_values.arc_ins( - overlay.state.name.clone(), - overlay.state.saved_transform.unwrap(), - ); - match save_state(config) { - Ok(_) => log::debug!("Saved state"), - Err(e) => log::error!("Failed to save state: {:?}", e), } } diff --git a/src/backend/overlay.rs b/src/backend/overlay.rs index a1bff02..0df939a 100644 --- a/src/backend/overlay.rs +++ b/src/backend/overlay.rs @@ -29,6 +29,7 @@ pub struct OverlayState { pub grabbable: bool, pub interactable: bool, pub recenter: bool, + pub anchored: bool, pub dirty: bool, pub alpha: f32, pub transform: Affine3A, @@ -53,6 +54,7 @@ impl Default for OverlayState { grabbable: false, recenter: false, interactable: false, + anchored: false, dirty: true, alpha: 1.0, relative_to: RelativeTo::None, @@ -102,6 +104,15 @@ impl OverlayState { } } + fn get_anchor(&self, app: &AppState) -> Affine3A { + if self.anchored { + app.anchor + } else { + // fake anchor that's always in front of HMD + app.input_state.hmd + } + } + fn get_transform(&self) -> Affine3A { self.saved_transform.unwrap_or_else(|| { Affine3A::from_scale_rotation_translation( @@ -124,7 +135,10 @@ impl OverlayState { self.saved_transform = None; } - self.transform = self.parent_transform(app).unwrap_or(app.anchor) * self.get_transform(); + self.transform = self + .parent_transform(app) + .unwrap_or_else(|| self.get_anchor(app)) + * self.get_transform(); if self.grabbable && hard_reset { self.realign(&app.input_state.hmd); diff --git a/src/overlays/keyboard.rs b/src/overlays/keyboard.rs index 37617cf..e3dfecf 100644 --- a/src/overlays/keyboard.rs +++ b/src/overlays/keyboard.rs @@ -122,6 +122,7 @@ where name: KEYBOARD_NAME.into(), grabbable: true, recenter: true, + anchored: true, interactable: true, spawn_scale: width, spawn_point: vec3a(0., -0.5, 0.), diff --git a/src/overlays/screen.rs b/src/overlays/screen.rs index 437048d..5971c13 100644 --- a/src/overlays/screen.rs +++ b/src/overlays/screen.rs @@ -632,6 +632,7 @@ fn create_screen_state( name: name.clone(), grabbable: true, recenter: true, + anchored: true, interactable: true, spawn_scale: 1.5 * session.config.desktop_view_scale, spawn_point: vec3a(0., 0.5, 0.),