diff --git a/src/backend/overlay.rs b/src/backend/overlay.rs index 211e69f..4244aa9 100644 --- a/src/backend/overlay.rs +++ b/src/backend/overlay.rs @@ -100,9 +100,9 @@ where impl OverlayState { pub fn parent_transform(&self, app: &AppState) -> Option { match self.relative_to { - RelativeTo::None => None, RelativeTo::Head => Some(app.input_state.hmd), RelativeTo::Hand(idx) => Some(app.input_state.pointers[idx].pose), + _ => None, } } @@ -201,19 +201,21 @@ where .arc_get(self.state.name.as_ref()) .copied(); - let hard_reset; - if let Some(transform) = app - .session - .config - .transform_values - .arc_get(self.state.name.as_ref()) - { - self.state.saved_transform = Some(*transform); - hard_reset = false; - } else { - hard_reset = true; + if matches!(self.state.relative_to, RelativeTo::None) { + let hard_reset; + if let Some(transform) = app + .session + .config + .transform_values + .arc_get(self.state.name.as_ref()) + { + self.state.saved_transform = Some(*transform); + hard_reset = false; + } else { + hard_reset = true; + } + self.state.reset(app, hard_reset); } - self.state.reset(app, hard_reset); self.backend.init(app) } pub fn render(&mut self, app: &mut AppState) -> anyhow::Result<()> { @@ -267,10 +269,15 @@ impl OverlayRenderer for FallbackRenderer { #[derive(Clone, Copy, Debug, Default)] pub enum RelativeTo { + /// Stays in place unless rencentered #[default] None, + /// Stays in position relative to HMD Head, + /// Stays in position relative to hand Hand(usize), + /// Stays in place, no recentering + Stage, } pub struct SplitOverlayBackend { diff --git a/src/overlays/anchor.rs b/src/overlays/anchor.rs index 5a7068e..dcbe9fd 100644 --- a/src/overlays/anchor.rs +++ b/src/overlays/anchor.rs @@ -2,7 +2,7 @@ use glam::Vec3A; use once_cell::sync::Lazy; use std::sync::Arc; -use crate::backend::overlay::{OverlayData, OverlayState}; +use crate::backend::overlay::{OverlayData, OverlayState, RelativeTo}; use crate::config::{load_known_yaml, ConfigType}; use crate::gui::modular::{modular_canvas, ModularUiConfig}; use crate::state::AppState; @@ -24,6 +24,7 @@ where z_order: 67, spawn_scale: config.width, spawn_point: Vec3A::NEG_Z * 0.5, + relative_to: RelativeTo::Stage, ..Default::default() }, backend: Box::new(modular_canvas(&config.size, &config.elements, state)?),