fix grid opacity not updating live

This commit is contained in:
Torge Matthies 2026-02-25 22:31:11 +01:00 committed by galister
parent de6047107e
commit ab3f873a38
4 changed files with 55 additions and 28 deletions

View File

@ -3,6 +3,18 @@ use glam::{Affine3A, Quat, Vec3, Vec3A};
use openxr::{self as xr, SessionCreateFlags, Version, sys::Handle};
use xr::OverlaySessionCreateFlagsEXTX;
macro_rules! next_chain_insert {
($layer:expr, $payload:expr) => {{
let payload_ptr = $payload as *mut _ as *mut xr::sys::BaseInStructure;
let new_elem = payload_ptr.as_mut().unwrap();
let mut raw = $layer.into_raw();
new_elem.next = raw.next as _;
raw.next = payload_ptr as *const _;
raw
}};
}
pub(crate) use next_chain_insert;
pub(super) fn init_xr() -> Result<(xr::Instance, xr::SystemId), anyhow::Error> {
let entry = xr::Entry::linked();

View File

@ -6,7 +6,10 @@ use xr::EyeVisibility;
use super::{CompositionLayer, XrState, helpers, swapchain::WlxSwapchain};
use crate::{
backend::openxr::swapchain::{SwapchainOpts, WlxSwapchainImage, create_swapchain},
backend::openxr::{
helpers::next_chain_insert,
swapchain::{SwapchainOpts, WlxSwapchainImage, create_swapchain},
},
state::AppState,
windowing::window::OverlayWindowData,
};
@ -20,17 +23,6 @@ pub struct OpenXrOverlayData {
color_bias_khr: Option<Box<xr::sys::CompositionLayerColorScaleBiasKHR>>,
}
macro_rules! next_chain_insert {
($layer:expr, $payload:expr) => {{
let payload_ptr = $payload.as_mut() as *mut _ as *mut xr::sys::BaseInStructure;
let new_elem = payload_ptr.as_mut().unwrap();
let mut raw = $layer.into_raw();
new_elem.next = raw.next as _;
raw.next = payload_ptr as *const _;
raw
}};
}
impl OverlayWindowData<OpenXrOverlayData> {
pub(super) fn ensure_swapchain_acquire<'a>(
&'a mut self,

View File

@ -14,7 +14,10 @@ use wgui::gfx::{cmd::WGfxClearMode, pipeline::WPipelineCreateInfo};
use wlx_common::config_io;
use crate::{
backend::openxr::{helpers::translation_rotation_to_posef, swapchain::SwapchainOpts},
backend::openxr::{
helpers::{next_chain_insert, translation_rotation_to_posef},
swapchain::SwapchainOpts,
},
graphics::{ExtentExt, GpuFutures, dds::WlxCommandBufferDds},
state::AppState,
};
@ -28,10 +31,11 @@ pub(super) struct Skybox {
view: Arc<ImageView>,
sky: Option<WlxSwapchain>,
grid: Option<WlxSwapchain>,
grid_color_scale_bias_khr: Option<xr::sys::CompositionLayerColorScaleBiasKHR>,
}
impl Skybox {
pub fn new(app: &AppState) -> anyhow::Result<Self> {
pub fn new(xr: &XrState, app: &AppState) -> anyhow::Result<Self> {
let mut command_buffer = app
.gfx
.create_xfer_command_buffer(CommandBufferUsage::OneTimeSubmit)?;
@ -74,10 +78,27 @@ impl Skybox {
let view = ImageView::new_default(maybe_image.unwrap())?; // safe unwrap
let grid_color_scale_bias_khr = xr
.instance
.exts()
.khr_composition_layer_color_scale_bias
.map(|_| xr::sys::CompositionLayerColorScaleBiasKHR {
ty: xr::StructureType::COMPOSITION_LAYER_COLOR_SCALE_BIAS_KHR,
next: std::ptr::null(),
color_bias: Default::default(),
color_scale: xr::Color4f {
r: 1.0,
g: 1.0,
b: 1.0,
a: 1.0,
},
});
Ok(Self {
view,
sky: None,
grid: None,
grid_color_scale_bias_khr: grid_color_scale_bias_khr,
})
}
@ -161,17 +182,13 @@ impl Skybox {
.into_iter()
.next()
.unwrap();
let set0 = pipeline.uniform_buffer_upload(
0,
vec![app.session.config.grid_opacity * app.session.config.grid_opacity],
)?;
let pass = pipeline.create_pass(
tgt.extent_f32(),
[0.0, 0.0],
app.gfx_extras.quad_verts.clone(),
0..4,
0..1,
vec![set0],
vec![],
&Default::default(),
)?;
@ -236,8 +253,10 @@ impl Skybox {
.lower_vertical_angle(LO_VERT_ANGLE);
self.grid.as_mut().unwrap().ensure_image_released()?;
let grid = xr::CompositionLayerQuad::new()
.layer_flags(xr::CompositionLayerFlags::BLEND_TEXTURE_SOURCE_ALPHA)
let flags = xr::CompositionLayerFlags::BLEND_TEXTURE_SOURCE_ALPHA
| xr::CompositionLayerFlags::UNPREMULTIPLIED_ALPHA;
let mut grid = xr::CompositionLayerQuad::new()
.layer_flags(flags)
.pose(*GRID_POSE)
.size(xr::Extent2Df {
width: 10.0,
@ -247,6 +266,15 @@ impl Skybox {
.eye_visibility(xr::EyeVisibility::BOTH)
.space(&xr.stage);
if let Some(grid_color_scale_bias_khr) = self.grid_color_scale_bias_khr.as_mut() {
let grid_opacity = app.session.config.grid_opacity;
grid_color_scale_bias_khr.color_scale.a = grid_opacity * grid_opacity;
unsafe {
let raw = next_chain_insert!(grid, grid_color_scale_bias_khr);
grid = xr::CompositionLayerQuad::from_raw(raw);
}
}
Ok(vec![
CompositionLayer::Equirect2(sky),
CompositionLayer::Quad(grid),
@ -258,5 +286,5 @@ pub(super) fn create_skybox(xr: &XrState, app: &AppState) -> Option<Skybox> {
xr.instance
.exts()
.khr_composition_layer_equirect2
.and_then(|_| Skybox::new(app).ok())
.and_then(|_| Skybox::new(xr, app).ok())
}

View File

@ -4,10 +4,6 @@ precision highp float;
layout (location = 0) in vec2 in_uv;
layout (location = 0) out vec4 out_color;
layout (set = 0, binding = 0) uniform OpacityBlock {
uniform float opacity;
};
void main()
{
float fade = max(1.0 - 2.0 * length(in_uv.xy + vec2(-0.5, -0.5)), 0.0);
@ -18,6 +14,5 @@ void main()
} else {
grid = 0.0;
}
out_color = vec4(1.0, 1.0, 1.0, grid * fade * opacity);
out_color = vec4(1.0, 1.0, 1.0, grid * fade);
}