mirror of https://github.com/wayvr-org/wayvr.git
fix stereo mouse on apps
This commit is contained in:
parent
7c7e7edbfb
commit
779baaf86c
|
|
@ -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,
|
||||
)?;
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Reference in New Issue