edit overlay progress

This commit is contained in:
galister
2025-11-14 17:58:23 +09:00
parent 70be748da1
commit 3daee83838
46 changed files with 687 additions and 352 deletions

View File

@@ -10,10 +10,10 @@ use crate::{
},
state::AppState,
windowing::{
OverlayID, OverlaySelector,
set::{OverlayWindowSet, SerializedWindowSet},
snap_upright,
window::OverlayWindowData,
OverlayID, OverlaySelector,
},
};
@@ -288,7 +288,7 @@ impl<T> OverlayWindowManager<T> {
ws.overlays.clear();
for (id, data) in self.overlays.iter_mut().filter(|(_, d)| !d.config.global) {
if let Some(mut state) = data.config.active_state.take() {
if let Some(transform) = data.config.saved_transform.take() {
if let Some(transform) = state.saved_transform {
state.transform = transform;
} else {
state.transform = Affine3A::ZERO;
@@ -309,7 +309,7 @@ impl<T> OverlayWindowManager<T> {
for (id, data) in self.overlays.iter_mut().filter(|(_, d)| !d.config.global) {
if let Some(mut state) = ws.overlays.remove(id) {
if state.transform.x_axis.length_squared() > f32::EPSILON {
data.config.saved_transform = Some(state.transform);
state.saved_transform = Some(state.transform);
}
state.transform = Affine3A::IDENTITY;
log::debug!("{}: ws{} → active_state", data.config.name, new_set);

View File

@@ -93,7 +93,6 @@ pub struct OverlayWindowConfig {
pub dirty: bool,
/// True if the window is showing the edit overlay
pub editing: bool,
pub saved_transform: Option<Affine3A>,
}
impl OverlayWindowConfig {
@@ -106,7 +105,6 @@ impl OverlayWindowConfig {
..OverlayWindowState::default()
},
active_state: None,
saved_transform: None,
z_order: 0,
keyboard_focus: None,
show_on_spawn: false,
@@ -149,7 +147,9 @@ impl OverlayWindowConfig {
return;
};
let cur_transform = self.saved_transform.unwrap_or(self.default_state.transform);
let cur_transform = state
.saved_transform
.unwrap_or(self.default_state.transform);
let (target_transform, lerp) = match state.positioning {
Positioning::FollowHead { lerp } => (app.input_state.hmd * cur_transform, lerp),
@@ -185,34 +185,14 @@ impl OverlayWindowConfig {
}
/// Returns true if changes were saved.
pub fn save_transform(&mut self, app: &mut AppState) -> bool {
let Some(state) = self.active_state.as_mut() else {
return false;
};
let parent_transform = match state.positioning {
Positioning::Floating => snap_upright(app.input_state.hmd, Vec3A::Y),
Positioning::FollowHead { .. } | Positioning::FollowHeadPaused { .. } => {
app.input_state.hmd
}
Positioning::FollowHand { hand, .. } | Positioning::FollowHandPaused { hand, .. } => {
app.input_state.pointers[hand as usize].pose
}
Positioning::Anchored => snap_upright(app.anchor, Vec3A::Y),
Positioning::Static => return false,
};
self.saved_transform = Some(parent_transform.inverse() * state.transform);
true
}
pub fn reset(&mut self, app: &mut AppState, hard_reset: bool) {
let Some(state) = self.active_state.as_mut() else {
return;
};
let cur_transform = self.saved_transform.unwrap_or(self.default_state.transform);
let cur_transform = state
.saved_transform
.unwrap_or(self.default_state.transform);
let parent_transform = match state.positioning {
Positioning::Floating
@@ -226,7 +206,7 @@ impl OverlayWindowConfig {
};
if hard_reset {
self.saved_transform = None;
state.saved_transform = None;
}
state.transform = parent_transform * cur_transform;
@@ -294,6 +274,7 @@ pub struct OverlayWindowState {
pub positioning: Positioning,
pub curvature: Option<f32>,
pub additive: bool,
pub saved_transform: Option<Affine3A>,
}
impl Default for OverlayWindowState {
@@ -306,6 +287,27 @@ impl Default for OverlayWindowState {
curvature: None,
transform: Affine3A::IDENTITY,
additive: false,
saved_transform: None,
}
}
}
impl OverlayWindowState {
pub fn save_transform(&mut self, app: &mut AppState) -> bool {
let parent_transform = match self.positioning {
Positioning::Floating => snap_upright(app.input_state.hmd, Vec3A::Y),
Positioning::FollowHead { .. } | Positioning::FollowHeadPaused { .. } => {
app.input_state.hmd
}
Positioning::FollowHand { hand, .. } | Positioning::FollowHandPaused { hand, .. } => {
app.input_state.pointers[hand as usize].pose
}
Positioning::Anchored => snap_upright(app.anchor, Vec3A::Y),
Positioning::Static => return false,
};
self.saved_transform = Some(parent_transform.inverse() * self.transform);
true
}
}