apply pipewire transforms to screens
This commit is contained in:
@@ -417,7 +417,9 @@ where
|
||||
.grabbed
|
||||
.is_some_and(|x| x.grabbed_id == hit.overlay)
|
||||
{
|
||||
let can_curve = hovered.extent().is_some_and(|e| e[0] >= e[1]);
|
||||
let can_curve = hovered
|
||||
.frame_transform()
|
||||
.is_some_and(|e| e.extent[0] >= e.extent[1]);
|
||||
|
||||
if can_curve {
|
||||
let cur = hovered.state.curvature.unwrap_or(0.0);
|
||||
|
||||
@@ -11,7 +11,9 @@ use vulkano::format::Format;
|
||||
use vulkano::image::view::ImageView;
|
||||
use vulkano::image::ImageLayout;
|
||||
|
||||
use crate::backend::overlay::{OverlayData, OverlayRenderer, OverlayState, SplitOverlayBackend};
|
||||
use crate::backend::overlay::{
|
||||
FrameTransform, OverlayData, OverlayRenderer, OverlayState, SplitOverlayBackend,
|
||||
};
|
||||
use crate::graphics::WlxGraphics;
|
||||
use crate::state::AppState;
|
||||
|
||||
@@ -189,7 +191,10 @@ impl OverlayRenderer for StaticRenderer {
|
||||
fn view(&mut self) -> Option<Arc<ImageView>> {
|
||||
Some(self.view.clone())
|
||||
}
|
||||
fn extent(&mut self) -> Option<[u32; 3]> {
|
||||
Some(self.view.image().extent())
|
||||
fn frame_transform(&mut self) -> Option<FrameTransform> {
|
||||
Some(FrameTransform {
|
||||
extent: self.view.image().extent(),
|
||||
..Default::default()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
@@ -188,7 +188,7 @@ impl OverlayData<OpenVrOverlayData> {
|
||||
}
|
||||
|
||||
pub(super) fn upload_transform(
|
||||
&self,
|
||||
&mut self,
|
||||
universe: ETrackingUniverseOrigin,
|
||||
overlay: &mut OverlayManager,
|
||||
) {
|
||||
@@ -197,7 +197,14 @@ impl OverlayData<OpenVrOverlayData> {
|
||||
return;
|
||||
};
|
||||
|
||||
let transform = Matrix3x4::from_affine(&self.state.transform);
|
||||
let effective = self.state.transform
|
||||
* self
|
||||
.backend
|
||||
.frame_transform()
|
||||
.map(|f| f.transform)
|
||||
.unwrap_or_default();
|
||||
|
||||
let transform = Matrix3x4::from_affine(&effective);
|
||||
|
||||
if let Err(e) = overlay.set_transform_absolute(handle, universe, &transform) {
|
||||
log::error!(
|
||||
|
||||
@@ -39,7 +39,8 @@ impl OverlayData<OpenXrOverlayData> {
|
||||
return Ok(CompositionLayer::None);
|
||||
};
|
||||
|
||||
let extent = self.extent().unwrap(); // want panic
|
||||
let frame_transform = self.frame_transform().unwrap(); // want panic
|
||||
let extent = frame_transform.extent;
|
||||
|
||||
let data = match self.data.swapchain {
|
||||
Some(ref mut data) => data,
|
||||
@@ -74,10 +75,12 @@ impl OverlayData<OpenXrOverlayData> {
|
||||
(major / aspect_ratio, major)
|
||||
};
|
||||
|
||||
let transform = self.state.transform * frame_transform.transform;
|
||||
|
||||
if let Some(curvature) = self.state.curvature {
|
||||
let radius = scale_x / (2.0 * PI * curvature);
|
||||
let quat = helpers::transform_to_norm_quat(&self.state.transform);
|
||||
let center_point = self.state.transform.translation + quat.mul_vec3a(Vec3A::Z * radius);
|
||||
let quat = helpers::transform_to_norm_quat(&transform);
|
||||
let center_point = transform.translation + quat.mul_vec3a(Vec3A::Z * radius);
|
||||
|
||||
let posef = helpers::translation_rotation_to_posef(center_point, quat);
|
||||
let angle = 2.0 * (scale_x / (2.0 * radius));
|
||||
@@ -93,7 +96,7 @@ impl OverlayData<OpenXrOverlayData> {
|
||||
.aspect_ratio(aspect_ratio);
|
||||
Ok(CompositionLayer::Cylinder(cylinder))
|
||||
} else {
|
||||
let posef = helpers::transform_to_posef(&self.state.transform);
|
||||
let posef = helpers::transform_to_posef(&transform);
|
||||
let quad = xr::CompositionLayerQuad::new()
|
||||
.layer_flags(CompositionLayerFlags::BLEND_TEXTURE_SOURCE_ALPHA)
|
||||
.pose(posef)
|
||||
|
||||
+12
-6
@@ -233,8 +233,8 @@ where
|
||||
pub fn view(&mut self) -> Option<Arc<ImageView>> {
|
||||
self.backend.view()
|
||||
}
|
||||
pub fn extent(&mut self) -> Option<[u32; 3]> {
|
||||
self.backend.extent()
|
||||
pub fn frame_transform(&mut self) -> Option<FrameTransform> {
|
||||
self.backend.frame_transform()
|
||||
}
|
||||
pub fn set_visible(&mut self, app: &mut AppState, visible: bool) -> anyhow::Result<()> {
|
||||
let old_visible = self.state.want_visible;
|
||||
@@ -250,6 +250,12 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Default)]
|
||||
pub struct FrameTransform {
|
||||
pub extent: [u32; 3],
|
||||
pub transform: Affine3A,
|
||||
}
|
||||
|
||||
pub trait OverlayRenderer {
|
||||
/// Called once, before the first frame is rendered
|
||||
fn init(&mut self, app: &mut AppState) -> anyhow::Result<()>;
|
||||
@@ -263,7 +269,7 @@ pub trait OverlayRenderer {
|
||||
/// Used for creating swapchains.
|
||||
///
|
||||
/// Muse not be None if view() is also not None
|
||||
fn extent(&mut self) -> Option<[u32; 3]>;
|
||||
fn frame_transform(&mut self) -> Option<FrameTransform>;
|
||||
}
|
||||
|
||||
pub struct FallbackRenderer;
|
||||
@@ -284,7 +290,7 @@ impl OverlayRenderer for FallbackRenderer {
|
||||
fn view(&mut self) -> Option<Arc<ImageView>> {
|
||||
None
|
||||
}
|
||||
fn extent(&mut self) -> Option<[u32; 3]> {
|
||||
fn frame_transform(&mut self) -> Option<FrameTransform> {
|
||||
None
|
||||
}
|
||||
}
|
||||
@@ -341,8 +347,8 @@ impl OverlayRenderer for SplitOverlayBackend {
|
||||
fn view(&mut self) -> Option<Arc<ImageView>> {
|
||||
self.renderer.view()
|
||||
}
|
||||
fn extent(&mut self) -> Option<[u32; 3]> {
|
||||
self.renderer.extent()
|
||||
fn frame_transform(&mut self) -> Option<FrameTransform> {
|
||||
self.renderer.frame_transform()
|
||||
}
|
||||
}
|
||||
impl InteractionHandler for SplitOverlayBackend {
|
||||
|
||||
Reference in New Issue
Block a user