diff --git a/wayvr/src/assets/gui/edit.xml b/wayvr/src/assets/gui/edit.xml index f5fb30e..c21a45b 100644 --- a/wayvr/src/assets/gui/edit.xml +++ b/wayvr/src/assets/gui/edit.xml @@ -82,6 +82,9 @@ +
+ +
diff --git a/wayvr/src/assets/lang/de.json b/wayvr/src/assets/lang/de.json index c3cc2dc..2422247 100644 --- a/wayvr/src/assets/lang/de.json +++ b/wayvr/src/assets/lang/de.json @@ -54,7 +54,8 @@ "SPLIT_LEFT_RIGHT": "LINKS→RECHTS", "SPLIT_RIGHT_LEFT": "RECHTS→LINKS", "SPLIT_TOP_BOTTOM": "OBEN→UNTEN", - "SPLIT_BOTTOM_TOP": "UNTEN→OBEN" + "SPLIT_BOTTOM_TOP": "UNTEN→OBEN", + "FULL_FRAME": "Voll 3D" }, "STEREO_3D_MODE_": {}, "ALIGN_TO_HMD": "An HMD ausrichten", diff --git a/wayvr/src/assets/lang/en.json b/wayvr/src/assets/lang/en.json index ea98355..d754c0f 100644 --- a/wayvr/src/assets/lang/en.json +++ b/wayvr/src/assets/lang/en.json @@ -44,7 +44,8 @@ "SPLIT_LEFT_RIGHT": "LEFT→RIGHT", "SPLIT_RIGHT_LEFT": "RIGHT→LEFT", "SPLIT_TOP_BOTTOM": "TOP→BOTTOM", - "TITLE": "3D Stereo Mode" + "TITLE": "3D Stereo Mode", + "FULL_FRAME": "Full 3D" }, "MOUSE": { "TITLE": "Mouse fixes", diff --git a/wayvr/src/assets/lang/es.json b/wayvr/src/assets/lang/es.json index 5cd77da..614fa3e 100644 --- a/wayvr/src/assets/lang/es.json +++ b/wayvr/src/assets/lang/es.json @@ -54,7 +54,8 @@ "SPLIT_LEFT_RIGHT": "IZQ→DER", "SPLIT_RIGHT_LEFT": "DERECHA→IZQUIERDA", "SPLIT_TOP_BOTTOM": "ARRIBA→ABAJO", - "SPLIT_BOTTOM_TOP": "ABAJO→ARRIBA" + "SPLIT_BOTTOM_TOP": "ABAJO→ARRIBA", + "FULL_FRAME": "3D completo" }, "STEREO_3D_MODE_": {}, "ALIGN_TO_HMD": "Alinear al HMD", diff --git a/wayvr/src/assets/lang/it.json b/wayvr/src/assets/lang/it.json index fcda304..7400de6 100644 --- a/wayvr/src/assets/lang/it.json +++ b/wayvr/src/assets/lang/it.json @@ -44,7 +44,8 @@ "SPLIT_LEFT_RIGHT": "SINISTRA→DESTRA", "SPLIT_RIGHT_LEFT": "DESTRA→SINISTRA", "SPLIT_TOP_BOTTOM": "TOP→BOTTOM", - "TITLE": "Modalità Stereo 3D" + "TITLE": "Modalità Stereo 3D", + "FULL_FRAME": "3D Completo" }, "MOUSE": { "TITLE": "Correzioni del mouse", diff --git a/wayvr/src/assets/lang/ja.json b/wayvr/src/assets/lang/ja.json index 4b5e57d..f6180ab 100644 --- a/wayvr/src/assets/lang/ja.json +++ b/wayvr/src/assets/lang/ja.json @@ -53,7 +53,8 @@ "SPLIT_LEFT_RIGHT": "左→右", "SPLIT_RIGHT_LEFT": "右→左", "SPLIT_TOP_BOTTOM": "上→下", - "SPLIT_BOTTOM_TOP": "下→上" + "SPLIT_BOTTOM_TOP": "下→上", + "FULL_FRAME": "フル3D" }, "ALIGN_TO_HMD": "常にHMDの方を向く", "MOUSE": { diff --git a/wayvr/src/assets/lang/pl.json b/wayvr/src/assets/lang/pl.json index 95d9597..f0bef91 100644 --- a/wayvr/src/assets/lang/pl.json +++ b/wayvr/src/assets/lang/pl.json @@ -53,7 +53,8 @@ "SPLIT_LEFT_RIGHT": "LEWO→PRAWO", "SPLIT_RIGHT_LEFT": "PRAWO→LEWO", "SPLIT_TOP_BOTTOM": "GÓRA→DÓŁ", - "TITLE": "Tryb stereoskopowy 3D" + "TITLE": "Tryb stereoskopowy 3D", + "FULL_FRAME": "Pełny 3D" }, "ALIGN_TO_HMD": "Dopasuj do HMD", "MOUSE": { diff --git a/wayvr/src/overlays/edit/mod.rs b/wayvr/src/overlays/edit/mod.rs index 7aa8ebe..28c24b2 100644 --- a/wayvr/src/overlays/edit/mod.rs +++ b/wayvr/src/overlays/edit/mod.rs @@ -355,6 +355,24 @@ fn make_edit_panel(app: &mut AppState) -> anyhow::Result { Ok(EventResult::Consumed) }) } + "::EditModeSetStereoFullFrame" => { + let full_frame = args.next().unwrap().parse::().unwrap(); + Box::new(move |common, data, app, state| { + if !test_button(data) || !test_duration(&button, app) { + return Ok(EventResult::Pass); + } + + let sel = OverlaySelector::Id(*state.id.borrow()); + app.tasks.enqueue(TaskType::Overlay(OverlayTask::Modify( + sel, + Box::new(move |_app, owc| { + let attrib = BackendAttribValue::StereoFullFrame(full_frame); + owc.backend.set_attrib(_app, attrib); + }), + ))); + Ok(EventResult::Consumed) + }) + } "::EditModeSetMouse" => { let key = args.next().unwrap().to_owned(); Box::new(move |common, data, app, state| { @@ -412,6 +430,11 @@ fn make_edit_panel(app: &mut AppState) -> anyhow::Result { set_up_checkbox(&mut panel, "additive_box", cb_assign_additive)?; set_up_checkbox(&mut panel, "align_box", cb_assign_align)?; + set_up_checkbox( + &mut panel, + "stereo_full_frame_box", + cb_assign_stereo_full_frame, + )?; set_up_slider(&mut panel, "lerp_slider", cb_assign_lerp)?; set_up_slider(&mut panel, "alpha_slider", cb_assign_alpha)?; set_up_slider(&mut panel, "curve_slider", cb_assign_curve)?; @@ -499,6 +522,16 @@ fn reset_panel( .set_tab_visible(&mut common, "mouse", false); } + if let Some(full_frame) = attrib_value!( + owc.backend.get_attrib(BackendAttrib::StereoFullFrame), + BackendAttribValue::StereoFullFrame + ) { + let c = panel + .parser_state + .fetch_component_as::("stereo_full_frame_box")?; + c.set_checked(&mut common, full_frame); + } + panel.layout.process_alterables(alterables)?; Ok(()) @@ -535,6 +568,16 @@ const fn cb_assign_align(_app: &mut AppState, owc: &mut OverlayWindowConfig, ali active_state.positioning = active_state.positioning.with_align(align); } +fn cb_assign_stereo_full_frame( + _app: &mut AppState, + owc: &mut OverlayWindowConfig, + full_frame: bool, +) { + owc.dirty = true; + let attrib = BackendAttribValue::StereoFullFrame(full_frame); + owc.backend.set_attrib(_app, attrib); +} + fn set_up_slider( panel: &mut EditModeWrapPanel, id: &str, diff --git a/wayvr/src/overlays/screen/backend.rs b/wayvr/src/overlays/screen/backend.rs index c84cdfd..c55f3eb 100644 --- a/wayvr/src/overlays/screen/backend.rs +++ b/wayvr/src/overlays/screen/backend.rs @@ -57,6 +57,7 @@ pub struct ScreenBackend { mouse_transform: Affine2, interaction_transform: Option, stereo: Option, + stereo_full_frame: bool, pub(super) logical_pos: Vec2, pub(super) logical_size: Vec2, pub(super) mouse_transform_original: Transform, @@ -85,6 +86,7 @@ impl ScreenBackend { } else { None }, + stereo_full_frame: false, logical_pos: Vec2::ZERO, logical_size: Vec2::ZERO, mouse_transform_original: Transform::Undefined, @@ -208,7 +210,22 @@ impl OverlayBackend for ScreenBackend { if let Some(frame) = self.capture.receive() { let stereo = self.stereo.unwrap_or(StereoMode::None); - let meta = frame.get_frame_meta(&app.session.config, stereo); + let mut meta = frame.get_frame_meta(&app.session.config, stereo); + + 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; + } + _ => {} + } + } + } if let Some(pipeline) = self.pipeline.as_mut() { if self.meta.is_some_and(|old| old.extent != meta.extent) { @@ -331,6 +348,9 @@ impl OverlayBackend for ScreenBackend { BackendAttrib::MouseTransform => Some(BackendAttribValue::MouseTransform( self.mouse_transform_override, )), + BackendAttrib::StereoFullFrame => { + Some(BackendAttribValue::StereoFullFrame(self.stereo_full_frame)) + } _ => None, } } @@ -364,6 +384,10 @@ impl OverlayBackend for ScreenBackend { self.apply_mouse_transform_with_override(frame_transform); true } + BackendAttribValue::StereoFullFrame(new) => { + self.stereo_full_frame = new; + true + } _ => false, } } diff --git a/wayvr/src/windowing/manager.rs b/wayvr/src/windowing/manager.rs index e8562a1..52c3f71 100644 --- a/wayvr/src/windowing/manager.rs +++ b/wayvr/src/windowing/manager.rs @@ -382,7 +382,11 @@ where } } -const SAVED_ATTRIBS: [BackendAttrib; 2] = [BackendAttrib::Stereo, BackendAttrib::MouseTransform]; +const SAVED_ATTRIBS: [BackendAttrib; 3] = [ + BackendAttrib::Stereo, + BackendAttrib::StereoFullFrame, + BackendAttrib::MouseTransform, +]; impl OverlayWindowManager { pub fn pop_dropped(&mut self) -> Option> { diff --git a/wlx-common/src/overlays.rs b/wlx-common/src/overlays.rs index f2b8c25..af99283 100644 --- a/wlx-common/src/overlays.rs +++ b/wlx-common/src/overlays.rs @@ -22,6 +22,7 @@ pub enum ToastDisplayMethod { #[derive(Debug, Clone, Copy, IntegerId, PartialEq)] pub enum BackendAttrib { Stereo, + StereoFullFrame, MouseTransform, Icon, } @@ -29,6 +30,7 @@ pub enum BackendAttrib { #[derive(Debug, Clone, Serialize, Deserialize)] pub enum BackendAttribValue { Stereo(StereoMode), + StereoFullFrame(bool), MouseTransform(MouseTransform), #[serde(skip_serializing, skip_deserializing)] Icon(Arc),