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 openxr::{self as xr, SessionCreateFlags, Version, sys::Handle};
|
||||||
use xr::OverlaySessionCreateFlagsEXTX;
|
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> {
|
pub(super) fn init_xr() -> Result<(xr::Instance, xr::SystemId), anyhow::Error> {
|
||||||
let entry = xr::Entry::linked();
|
let entry = xr::Entry::linked();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,10 @@ use xr::EyeVisibility;
|
||||||
|
|
||||||
use super::{CompositionLayer, XrState, helpers, swapchain::WlxSwapchain};
|
use super::{CompositionLayer, XrState, helpers, swapchain::WlxSwapchain};
|
||||||
use crate::{
|
use crate::{
|
||||||
backend::openxr::swapchain::{SwapchainOpts, WlxSwapchainImage, create_swapchain},
|
backend::openxr::{
|
||||||
|
helpers::next_chain_insert,
|
||||||
|
swapchain::{SwapchainOpts, WlxSwapchainImage, create_swapchain},
|
||||||
|
},
|
||||||
state::AppState,
|
state::AppState,
|
||||||
windowing::window::OverlayWindowData,
|
windowing::window::OverlayWindowData,
|
||||||
};
|
};
|
||||||
|
|
@ -20,17 +23,6 @@ pub struct OpenXrOverlayData {
|
||||||
color_bias_khr: Option<Box<xr::sys::CompositionLayerColorScaleBiasKHR>>,
|
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> {
|
impl OverlayWindowData<OpenXrOverlayData> {
|
||||||
pub(super) fn ensure_swapchain_acquire<'a>(
|
pub(super) fn ensure_swapchain_acquire<'a>(
|
||||||
&'a mut self,
|
&'a mut self,
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,10 @@ use wgui::gfx::{cmd::WGfxClearMode, pipeline::WPipelineCreateInfo};
|
||||||
use wlx_common::config_io;
|
use wlx_common::config_io;
|
||||||
|
|
||||||
use crate::{
|
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},
|
graphics::{ExtentExt, GpuFutures, dds::WlxCommandBufferDds},
|
||||||
state::AppState,
|
state::AppState,
|
||||||
};
|
};
|
||||||
|
|
@ -28,10 +31,11 @@ pub(super) struct Skybox {
|
||||||
view: Arc<ImageView>,
|
view: Arc<ImageView>,
|
||||||
sky: Option<WlxSwapchain>,
|
sky: Option<WlxSwapchain>,
|
||||||
grid: Option<WlxSwapchain>,
|
grid: Option<WlxSwapchain>,
|
||||||
|
grid_color_scale_bias_khr: Option<xr::sys::CompositionLayerColorScaleBiasKHR>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Skybox {
|
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
|
let mut command_buffer = app
|
||||||
.gfx
|
.gfx
|
||||||
.create_xfer_command_buffer(CommandBufferUsage::OneTimeSubmit)?;
|
.create_xfer_command_buffer(CommandBufferUsage::OneTimeSubmit)?;
|
||||||
|
|
@ -74,10 +78,27 @@ impl Skybox {
|
||||||
|
|
||||||
let view = ImageView::new_default(maybe_image.unwrap())?; // safe unwrap
|
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 {
|
Ok(Self {
|
||||||
view,
|
view,
|
||||||
sky: None,
|
sky: None,
|
||||||
grid: None,
|
grid: None,
|
||||||
|
grid_color_scale_bias_khr: grid_color_scale_bias_khr,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -161,17 +182,13 @@ impl Skybox {
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.next()
|
.next()
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let set0 = pipeline.uniform_buffer_upload(
|
|
||||||
0,
|
|
||||||
vec![app.session.config.grid_opacity * app.session.config.grid_opacity],
|
|
||||||
)?;
|
|
||||||
let pass = pipeline.create_pass(
|
let pass = pipeline.create_pass(
|
||||||
tgt.extent_f32(),
|
tgt.extent_f32(),
|
||||||
[0.0, 0.0],
|
[0.0, 0.0],
|
||||||
app.gfx_extras.quad_verts.clone(),
|
app.gfx_extras.quad_verts.clone(),
|
||||||
0..4,
|
0..4,
|
||||||
0..1,
|
0..1,
|
||||||
vec![set0],
|
vec![],
|
||||||
&Default::default(),
|
&Default::default(),
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
|
|
@ -236,8 +253,10 @@ impl Skybox {
|
||||||
.lower_vertical_angle(LO_VERT_ANGLE);
|
.lower_vertical_angle(LO_VERT_ANGLE);
|
||||||
|
|
||||||
self.grid.as_mut().unwrap().ensure_image_released()?;
|
self.grid.as_mut().unwrap().ensure_image_released()?;
|
||||||
let grid = xr::CompositionLayerQuad::new()
|
let flags = xr::CompositionLayerFlags::BLEND_TEXTURE_SOURCE_ALPHA
|
||||||
.layer_flags(xr::CompositionLayerFlags::BLEND_TEXTURE_SOURCE_ALPHA)
|
| xr::CompositionLayerFlags::UNPREMULTIPLIED_ALPHA;
|
||||||
|
let mut grid = xr::CompositionLayerQuad::new()
|
||||||
|
.layer_flags(flags)
|
||||||
.pose(*GRID_POSE)
|
.pose(*GRID_POSE)
|
||||||
.size(xr::Extent2Df {
|
.size(xr::Extent2Df {
|
||||||
width: 10.0,
|
width: 10.0,
|
||||||
|
|
@ -247,6 +266,15 @@ impl Skybox {
|
||||||
.eye_visibility(xr::EyeVisibility::BOTH)
|
.eye_visibility(xr::EyeVisibility::BOTH)
|
||||||
.space(&xr.stage);
|
.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![
|
Ok(vec![
|
||||||
CompositionLayer::Equirect2(sky),
|
CompositionLayer::Equirect2(sky),
|
||||||
CompositionLayer::Quad(grid),
|
CompositionLayer::Quad(grid),
|
||||||
|
|
@ -258,5 +286,5 @@ pub(super) fn create_skybox(xr: &XrState, app: &AppState) -> Option<Skybox> {
|
||||||
xr.instance
|
xr.instance
|
||||||
.exts()
|
.exts()
|
||||||
.khr_composition_layer_equirect2
|
.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) in vec2 in_uv;
|
||||||
layout (location = 0) out vec4 out_color;
|
layout (location = 0) out vec4 out_color;
|
||||||
|
|
||||||
layout (set = 0, binding = 0) uniform OpacityBlock {
|
|
||||||
uniform float opacity;
|
|
||||||
};
|
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
{
|
{
|
||||||
float fade = max(1.0 - 2.0 * length(in_uv.xy + vec2(-0.5, -0.5)), 0.0);
|
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 {
|
} else {
|
||||||
grid = 0.0;
|
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