fix stereo mouse on apps

This commit is contained in:
galister 2026-07-14 14:53:56 +09:00
parent 7c7e7edbfb
commit 779baaf86c
2 changed files with 39 additions and 11 deletions

View File

@ -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,
)?;

View File

@ -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,