fix: settings spawn in wrong spot

This commit is contained in:
galister
2024-06-04 17:51:31 +09:00
parent b8a0e3630d
commit a0a853825c
4 changed files with 36 additions and 18 deletions

View File

@@ -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),
}
}

View File

@@ -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);