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],
|
offsetf: [f32; 2],
|
||||||
transform: wlx_frame::Transform,
|
transform: wlx_frame::Transform,
|
||||||
stereo: StereoMode,
|
stereo: StereoMode,
|
||||||
|
stereo_adjust_mouse: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ScreenPipeline {
|
impl ScreenPipeline {
|
||||||
|
|
@ -84,6 +85,7 @@ impl ScreenPipeline {
|
||||||
offsetf,
|
offsetf,
|
||||||
transform,
|
transform,
|
||||||
stereo,
|
stereo,
|
||||||
|
stereo_adjust_mouse: false,
|
||||||
};
|
};
|
||||||
me.ensure_stereo(stereo);
|
me.ensure_stereo(stereo);
|
||||||
Ok(me)
|
Ok(me)
|
||||||
|
|
@ -98,6 +100,10 @@ impl ScreenPipeline {
|
||||||
self.pass.clear(); // ensure_depth will repopulate
|
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 {
|
pub const fn transform(&self) -> wlx_frame::Transform {
|
||||||
self.transform
|
self.transform
|
||||||
}
|
}
|
||||||
|
|
@ -253,12 +259,22 @@ impl ScreenPipeline {
|
||||||
let size = CURSOR_SIZE * self.extentf[1];
|
let size = CURSOR_SIZE * self.extentf[1];
|
||||||
let half_size = size * 0.5;
|
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(
|
upload_quad_vertices(
|
||||||
&mut self.mouse.buf_vert,
|
&mut self.mouse.buf_vert,
|
||||||
self.extentf[0],
|
self.extentf[0],
|
||||||
self.extentf[1],
|
self.extentf[1],
|
||||||
mouse.x.mul_add(self.extentf[0], -half_size),
|
mouse.x.mul_add(self.extentf[0] * x_scale, -half_size),
|
||||||
mouse.y.mul_add(self.extentf[1], -half_size),
|
mouse.y.mul_add(self.extentf[1] * y_scale, -half_size),
|
||||||
size,
|
size,
|
||||||
size,
|
size,
|
||||||
)?;
|
)?;
|
||||||
|
|
|
||||||
|
|
@ -343,25 +343,31 @@ impl WvrWindowBackend {
|
||||||
self.interaction_transform = Some(ui_transform(meta.extent));
|
self.interaction_transform = Some(ui_transform(meta.extent));
|
||||||
|
|
||||||
let mut scale = vec2(
|
let mut scale = vec2(
|
||||||
((meta.extent[0] + BORDER_SIZE * 2) as f32) / (meta.extent[0] 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),
|
((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
|
if self.stereo_adjust_mouse
|
||||||
&& let Some(stereo) = self.stereo
|
&& let Some(stereo) = self.stereo
|
||||||
{
|
{
|
||||||
match stereo {
|
match stereo {
|
||||||
StereoMode::LeftRight | StereoMode::RightLeft => scale.x *= 0.5,
|
StereoMode::LeftRight | StereoMode::RightLeft => {
|
||||||
StereoMode::TopBottom | StereoMode::BottomTop => scale.y *= 0.5,
|
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.mouse_transform = Affine2::from_scale_angle_translation(scale, 0.0, translation);
|
||||||
self.uv_range = translation[0]..=(1.0 - translation[0]);
|
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() {
|
if let Some(stereo) = self.stereo.as_mut() {
|
||||||
log::debug!("{}: stereo: {stereo:?} → {new:?}", self.name);
|
log::debug!("{}: stereo: {stereo:?} → {new:?}", self.name);
|
||||||
*stereo = new;
|
*stereo = new;
|
||||||
|
if let Some(meta) = self.meta.clone() {
|
||||||
|
let _ = self.apply_extent(app, &meta);
|
||||||
|
}
|
||||||
if let Some(pipeline) = self.pipeline.as_mut() {
|
if let Some(pipeline) = self.pipeline.as_mut() {
|
||||||
pipeline.ensure_stereo(new);
|
pipeline.ensure_stereo(new);
|
||||||
}
|
}
|
||||||
|
|
@ -1040,6 +1049,9 @@ impl OverlayBackend for WvrWindowBackend {
|
||||||
let _ = self.apply_extent(app, &meta);
|
let _ = self.apply_extent(app, &meta);
|
||||||
self.meta = Some(meta);
|
self.meta = Some(meta);
|
||||||
}
|
}
|
||||||
|
if let Some(pipeline) = self.pipeline.as_mut() {
|
||||||
|
pipeline.set_stereo_adjust_mouse(new);
|
||||||
|
}
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
_ => false,
|
_ => false,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue