mirror of https://github.com/wayvr-org/wayvr.git
fix grid opacity not updating live
This commit is contained in:
parent
de6047107e
commit
ab3f873a38
|
|
@ -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();
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue