fix stereo on wayvr overlays
This commit is contained in:
@@ -358,7 +358,7 @@ fn make_edit_panel(app: &mut AppState) -> anyhow::Result<EditModeWrapPanel> {
|
|||||||
}
|
}
|
||||||
"::EditModeSetStereoFullFrame" => {
|
"::EditModeSetStereoFullFrame" => {
|
||||||
let full_frame = args.next().unwrap().parse::<bool>().unwrap();
|
let full_frame = args.next().unwrap().parse::<bool>().unwrap();
|
||||||
Box::new(move |common, data, app, state| {
|
Box::new(move |_common, data, app, state| {
|
||||||
if !test_button(data) || !test_duration(&button, app) {
|
if !test_button(data) || !test_duration(&button, app) {
|
||||||
return Ok(EventResult::Pass);
|
return Ok(EventResult::Pass);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -109,6 +109,7 @@ pub struct WvrWindowBackend {
|
|||||||
meta: Option<FrameMeta>,
|
meta: Option<FrameMeta>,
|
||||||
mouse: Option<MouseMeta>,
|
mouse: Option<MouseMeta>,
|
||||||
stereo: Option<StereoMode>,
|
stereo: Option<StereoMode>,
|
||||||
|
stereo_full_frame: bool,
|
||||||
cur_image: Option<Arc<ImageView>>,
|
cur_image: Option<Arc<ImageView>>,
|
||||||
panel: GuiPanel<WindowHandle>,
|
panel: GuiPanel<WindowHandle>,
|
||||||
inner_extent: [u32; 2],
|
inner_extent: [u32; 2],
|
||||||
@@ -207,6 +208,7 @@ impl WvrWindowBackend {
|
|||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
},
|
},
|
||||||
|
stereo_full_frame: false,
|
||||||
cur_image: None,
|
cur_image: None,
|
||||||
inner_extent: [0, 0],
|
inner_extent: [0, 0],
|
||||||
panel,
|
panel,
|
||||||
@@ -303,8 +305,25 @@ impl OverlayBackend for WvrWindowBackend {
|
|||||||
extent: surf.image.extent_u32arr(),
|
extent: surf.image.extent_u32arr(),
|
||||||
format: surf.image.format(),
|
format: surf.image.format(),
|
||||||
clear: WGfxClearMode::Clear([0.0, 0.0, 0.0, 0.0]),
|
clear: WGfxClearMode::Clear([0.0, 0.0, 0.0, 0.0]),
|
||||||
|
stereo: self.stereo.unwrap_or(StereoMode::None),
|
||||||
..Default::default()
|
..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;
|
let inner_extent = meta.extent;
|
||||||
meta.extent[0] += BORDER_SIZE * 2;
|
meta.extent[0] += BORDER_SIZE * 2;
|
||||||
meta.extent[1] += BORDER_SIZE * 2 + BAR_SIZE;
|
meta.extent[1] += BORDER_SIZE * 2 + BAR_SIZE;
|
||||||
@@ -377,6 +396,12 @@ impl OverlayBackend for WvrWindowBackend {
|
|||||||
rdr: &mut RenderResources,
|
rdr: &mut RenderResources,
|
||||||
) -> anyhow::Result<()> {
|
) -> anyhow::Result<()> {
|
||||||
self.panel.render(app, rdr)?;
|
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();
|
let image = self.cur_image.as_ref().unwrap().clone();
|
||||||
|
|
||||||
@@ -422,7 +447,9 @@ impl OverlayBackend for WvrWindowBackend {
|
|||||||
&Default::default(),
|
&Default::default(),
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
rdr.cmd_buf_single().run_ref(&pass)?;
|
for buf in &mut rdr.cmd_bufs {
|
||||||
|
buf.run_ref(&pass)?;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
@@ -547,6 +574,9 @@ impl OverlayBackend for WvrWindowBackend {
|
|||||||
match attrib {
|
match attrib {
|
||||||
BackendAttrib::Stereo => self.stereo.map(BackendAttribValue::Stereo),
|
BackendAttrib::Stereo => self.stereo.map(BackendAttribValue::Stereo),
|
||||||
BackendAttrib::Icon => Some(BackendAttribValue::Icon(self.icon.clone())),
|
BackendAttrib::Icon => Some(BackendAttribValue::Icon(self.icon.clone())),
|
||||||
|
BackendAttrib::StereoFullFrame => {
|
||||||
|
Some(BackendAttribValue::StereoFullFrame(self.stereo_full_frame))
|
||||||
|
}
|
||||||
_ => None,
|
_ => None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -564,6 +594,10 @@ impl OverlayBackend for WvrWindowBackend {
|
|||||||
false
|
false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
BackendAttribValue::StereoFullFrame(new) => {
|
||||||
|
self.stereo_full_frame = new;
|
||||||
|
true
|
||||||
|
}
|
||||||
_ => false,
|
_ => false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user