fix edit overlay getting stuck on mirrors

This commit is contained in:
galister
2025-12-21 18:03:00 +09:00
parent b7ea642ef3
commit 3776bad899
2 changed files with 31 additions and 9 deletions

View File

@@ -101,6 +101,8 @@ impl EditWrapperManager {
owc.backend = Box::new(EditModeBackendWrapper { owc.backend = Box::new(EditModeBackendWrapper {
inner: ManuallyDrop::new(inner), inner: ManuallyDrop::new(inner),
panel: ManuallyDrop::new(panel), panel: ManuallyDrop::new(panel),
last_render: Instant::now(),
can_render_inner: false,
}); });
owc.editing = true; owc.editing = true;
@@ -139,6 +141,9 @@ impl EditWrapperManager {
pub struct EditModeBackendWrapper { pub struct EditModeBackendWrapper {
panel: ManuallyDrop<EditModeWrapPanel>, panel: ManuallyDrop<EditModeWrapPanel>,
inner: ManuallyDrop<Box<dyn OverlayBackend>>, inner: ManuallyDrop<Box<dyn OverlayBackend>>,
last_render: Instant,
can_render_inner: bool,
} }
impl OverlayBackend for EditModeBackendWrapper { impl OverlayBackend for EditModeBackendWrapper {
@@ -160,9 +165,9 @@ impl OverlayBackend for EditModeBackendWrapper {
app.tasks.transfer_from(&mut local_tasks); app.tasks.transfer_from(&mut local_tasks);
} }
let i = self.inner.should_render(app)?; let inner = self.inner.should_render(app)?;
if !matches!(i, ShouldRender::Unable) if !matches!(inner, ShouldRender::Unable)
&& let Some(ref frame_meta) = self.inner.frame_meta() && let Some(ref frame_meta) = self.inner.frame_meta()
{ {
let (width_px, height_px) = (frame_meta.extent[0], frame_meta.extent[1]); let (width_px, height_px) = (frame_meta.extent[0], frame_meta.extent[1]);
@@ -176,18 +181,25 @@ impl OverlayBackend for EditModeBackendWrapper {
self.panel.gui_scale = (gui_scale * 4.0).round() / 4.0; self.panel.gui_scale = (gui_scale * 4.0).round() / 4.0;
self.panel.update_layout()?; self.panel.update_layout()?;
} }
self.can_render_inner = true;
} else { } else {
return Ok(ShouldRender::Unable); self.can_render_inner = false;
if self.last_render.elapsed() < Duration::from_millis(100) {
return Ok(ShouldRender::Unable);
}
} }
let p = self.panel.should_render(app)?; let panel = self.panel.should_render(app)?;
#[allow(clippy::match_same_arms)] #[allow(clippy::match_same_arms)]
Ok(match (i, p) { Ok(match (inner, panel) {
(ShouldRender::Should, ShouldRender::Should) => ShouldRender::Should, (ShouldRender::Should, ShouldRender::Should) => ShouldRender::Should,
(ShouldRender::Should, ShouldRender::Can) => ShouldRender::Should, (ShouldRender::Should, ShouldRender::Can) => ShouldRender::Should,
(ShouldRender::Can, ShouldRender::Should) => ShouldRender::Should, (ShouldRender::Can, ShouldRender::Should) => ShouldRender::Should,
(ShouldRender::Can, ShouldRender::Can) => ShouldRender::Can, (ShouldRender::Can, ShouldRender::Can) => ShouldRender::Can,
// only if last render was more than 100ms ago.
(ShouldRender::Unable, ShouldRender::Should) => ShouldRender::Should,
_ => ShouldRender::Unable, _ => ShouldRender::Unable,
}) })
} }
@@ -196,7 +208,9 @@ impl OverlayBackend for EditModeBackendWrapper {
app: &mut crate::state::AppState, app: &mut crate::state::AppState,
rdr: &mut RenderResources, rdr: &mut RenderResources,
) -> anyhow::Result<()> { ) -> anyhow::Result<()> {
self.inner.render(app, rdr)?; if self.can_render_inner {
self.inner.render(app, rdr)?;
}
self.panel.render(app, rdr)?; self.panel.render(app, rdr)?;
// `GuiPanel` is not stereo-aware, so just render the same pass twice // `GuiPanel` is not stereo-aware, so just render the same pass twice

View File

@@ -51,6 +51,7 @@ pub struct ScreenBackend {
pub(super) logical_size: Vec2, pub(super) logical_size: Vec2,
pub(super) mouse_transform_original: Transform, pub(super) mouse_transform_original: Transform,
mouse_transform_override: MouseTransform, mouse_transform_override: MouseTransform,
just_resumed: bool,
} }
impl ScreenBackend { impl ScreenBackend {
@@ -76,6 +77,7 @@ impl ScreenBackend {
logical_size: Vec2::ZERO, logical_size: Vec2::ZERO,
mouse_transform_original: Transform::Undefined, mouse_transform_original: Transform::Undefined,
mouse_transform_override: MouseTransform::Default, mouse_transform_override: MouseTransform::Default,
just_resumed: false,
} }
} }
@@ -203,17 +205,22 @@ impl OverlayBackend for ScreenBackend {
self.meta = Some(meta); self.meta = Some(meta);
self.cur_frame = Some(frame); self.cur_frame = Some(frame);
}
if self.cur_frame.is_some() {
Ok(ShouldRender::Should) Ok(ShouldRender::Should)
} else if self.cur_frame.is_some() {
if self.just_resumed {
self.just_resumed = false;
Ok(ShouldRender::Should)
} else {
Ok(ShouldRender::Can)
}
} else { } else {
Ok(ShouldRender::Unable) Ok(ShouldRender::Unable)
} }
} }
fn render(&mut self, app: &mut AppState, rdr: &mut RenderResources) -> anyhow::Result<()> { fn render(&mut self, app: &mut AppState, rdr: &mut RenderResources) -> anyhow::Result<()> {
// want panic; must be some if should_render was not Unable // want panic; must be some if should_render was not Unable
let capture = self.cur_frame.take().unwrap(); let capture = self.cur_frame.as_ref().unwrap();
// want panic; must be Some if cur_frame is also Some // want panic; must be Some if cur_frame is also Some
self.pipeline.as_mut().unwrap().render(&capture, app, rdr)?; self.pipeline.as_mut().unwrap().render(&capture, app, rdr)?;
@@ -225,6 +232,7 @@ impl OverlayBackend for ScreenBackend {
Ok(()) Ok(())
} }
fn resume(&mut self, _app: &mut AppState) -> anyhow::Result<()> { fn resume(&mut self, _app: &mut AppState) -> anyhow::Result<()> {
self.just_resumed = true;
self.capture.resume(); self.capture.resume();
Ok(()) Ok(())
} }