diff --git a/wayvr/src/overlays/screen/capture.rs b/wayvr/src/overlays/screen/capture.rs index 8f6a0931..e670b32f 100644 --- a/wayvr/src/overlays/screen/capture.rs +++ b/wayvr/src/overlays/screen/capture.rs @@ -56,6 +56,7 @@ pub struct ScreenPipeline { offsetf: [f32; 2], transform: wlx_frame::Transform, stereo: StereoMode, + stereo_adjust_mouse: bool, } impl ScreenPipeline { @@ -84,6 +85,7 @@ impl ScreenPipeline { offsetf, transform, stereo, + stereo_adjust_mouse: false, }; me.ensure_stereo(stereo); Ok(me) @@ -98,6 +100,10 @@ impl ScreenPipeline { self.pass.clear(); // ensure_depth will repopulate } + pub fn set_stereo_adjust_mouse(&mut self, adjust: bool) { + self.stereo_adjust_mouse = adjust; + } + pub const fn transform(&self) -> wlx_frame::Transform { self.transform } @@ -253,12 +259,22 @@ impl ScreenPipeline { let size = CURSOR_SIZE * self.extentf[1]; let half_size = size * 0.5; + let (x_scale, y_scale) = if self.stereo_adjust_mouse { + match self.stereo { + StereoMode::LeftRight | StereoMode::RightLeft => (2.0, 1.0), + StereoMode::TopBottom | StereoMode::BottomTop => (1.0, 2.0), + _ => (1.0, 1.0), + } + } else { + (1.0, 1.0) + }; + upload_quad_vertices( &mut self.mouse.buf_vert, self.extentf[0], self.extentf[1], - mouse.x.mul_add(self.extentf[0], -half_size), - mouse.y.mul_add(self.extentf[1], -half_size), + mouse.x.mul_add(self.extentf[0] * x_scale, -half_size), + mouse.y.mul_add(self.extentf[1] * y_scale, -half_size), size, size, )?; diff --git a/wayvr/src/overlays/wayvr.rs b/wayvr/src/overlays/wayvr.rs index d53ef83c..ea2dff97 100644 --- a/wayvr/src/overlays/wayvr.rs +++ b/wayvr/src/overlays/wayvr.rs @@ -343,25 +343,31 @@ impl WvrWindowBackend { self.interaction_transform = Some(ui_transform(meta.extent)); let mut scale = vec2( - ((meta.extent[0] + BORDER_SIZE * 2) as f32) / (meta.extent[0] as f32), - ((meta.extent[1] + BORDER_SIZE * 2 + BAR_SIZE) as f32) / (meta.extent[1] as f32), + ((meta.extent[0] + BORDER_SIZE * 2) as f32) / meta.extent[0] as f32, + ((meta.extent[1] + BORDER_SIZE * 2 + BAR_SIZE) as f32) / meta.extent[1] as f32, + ); + + let mut translation = vec2( + -(BORDER_SIZE as f32) / meta.extent[0] as f32, + -((BORDER_SIZE + BAR_SIZE) as f32) / meta.extent[1] as f32, ); if self.stereo_adjust_mouse && let Some(stereo) = self.stereo { match stereo { - StereoMode::LeftRight | StereoMode::RightLeft => scale.x *= 0.5, - StereoMode::TopBottom | StereoMode::BottomTop => scale.y *= 0.5, + StereoMode::LeftRight | StereoMode::RightLeft => { + scale.x *= 0.5; + translation.x *= 0.5; + } + StereoMode::TopBottom | StereoMode::BottomTop => { + scale.y *= 0.5; + translation.y *= 0.5; + } _ => {} } } - let translation = vec2( - -(BORDER_SIZE as f32) / (meta.extent[0] as f32), - -((BORDER_SIZE + BAR_SIZE) as f32) / (meta.extent[1] as f32), - ); - self.mouse_transform = Affine2::from_scale_angle_translation(scale, 0.0, translation); self.uv_range = translation[0]..=(1.0 - translation[0]); @@ -1022,6 +1028,9 @@ impl OverlayBackend for WvrWindowBackend { if let Some(stereo) = self.stereo.as_mut() { log::debug!("{}: stereo: {stereo:?} → {new:?}", self.name); *stereo = new; + if let Some(meta) = self.meta.clone() { + let _ = self.apply_extent(app, &meta); + } if let Some(pipeline) = self.pipeline.as_mut() { pipeline.ensure_stereo(new); } @@ -1040,6 +1049,9 @@ impl OverlayBackend for WvrWindowBackend { let _ = self.apply_extent(app, &meta); self.meta = Some(meta); } + if let Some(pipeline) = self.pipeline.as_mut() { + pipeline.set_stereo_adjust_mouse(new); + } true } _ => false,