diff --git a/wayvr/src/overlays/edit/mod.rs b/wayvr/src/overlays/edit/mod.rs index 32603f7..609b991 100644 --- a/wayvr/src/overlays/edit/mod.rs +++ b/wayvr/src/overlays/edit/mod.rs @@ -358,7 +358,7 @@ fn make_edit_panel(app: &mut AppState) -> anyhow::Result { } "::EditModeSetStereoFullFrame" => { let full_frame = args.next().unwrap().parse::().unwrap(); - Box::new(move |common, data, app, state| { + Box::new(move |_common, data, app, state| { if !test_button(data) || !test_duration(&button, app) { return Ok(EventResult::Pass); } diff --git a/wayvr/src/overlays/wayvr.rs b/wayvr/src/overlays/wayvr.rs index a00e954..a52fed7 100644 --- a/wayvr/src/overlays/wayvr.rs +++ b/wayvr/src/overlays/wayvr.rs @@ -109,6 +109,7 @@ pub struct WvrWindowBackend { meta: Option, mouse: Option, stereo: Option, + stereo_full_frame: bool, cur_image: Option>, panel: GuiPanel, inner_extent: [u32; 2], @@ -207,6 +208,7 @@ impl WvrWindowBackend { } else { None }, + stereo_full_frame: false, cur_image: None, inner_extent: [0, 0], panel, @@ -303,8 +305,25 @@ impl OverlayBackend for WvrWindowBackend { extent: surf.image.extent_u32arr(), format: surf.image.format(), clear: WGfxClearMode::Clear([0.0, 0.0, 0.0, 0.0]), + stereo: self.stereo.unwrap_or(StereoMode::None), ..Default::default() }; + + if let Some(stereo) = self.stereo { + // Apply stereo full frame logic + if self.stereo_full_frame { + match stereo { + StereoMode::LeftRight | StereoMode::RightLeft => { + meta.extent[0] /= 2; + } + StereoMode::TopBottom | StereoMode::BottomTop => { + meta.extent[1] /= 2; + } + _ => {} + } + } + } + let inner_extent = meta.extent; meta.extent[0] += BORDER_SIZE * 2; meta.extent[1] += BORDER_SIZE * 2 + BAR_SIZE; @@ -377,6 +396,12 @@ impl OverlayBackend for WvrWindowBackend { rdr: &mut RenderResources, ) -> anyhow::Result<()> { self.panel.render(app, rdr)?; + // `GuiPanel` is not stereo-aware, so just render the same pass twice + if rdr.cmd_bufs.len() > 1 { + rdr.cmd_bufs.reverse(); + self.panel.render(app, rdr)?; + rdr.cmd_bufs.reverse(); + } let image = self.cur_image.as_ref().unwrap().clone(); @@ -422,7 +447,9 @@ impl OverlayBackend for WvrWindowBackend { &Default::default(), )?; - rdr.cmd_buf_single().run_ref(&pass)?; + for buf in &mut rdr.cmd_bufs { + buf.run_ref(&pass)?; + } } Ok(()) @@ -547,6 +574,9 @@ impl OverlayBackend for WvrWindowBackend { match attrib { BackendAttrib::Stereo => self.stereo.map(BackendAttribValue::Stereo), BackendAttrib::Icon => Some(BackendAttribValue::Icon(self.icon.clone())), + BackendAttrib::StereoFullFrame => { + Some(BackendAttribValue::StereoFullFrame(self.stereo_full_frame)) + } _ => None, } } @@ -564,6 +594,10 @@ impl OverlayBackend for WvrWindowBackend { false } } + BackendAttribValue::StereoFullFrame(new) => { + self.stereo_full_frame = new; + true + } _ => false, } }