reconfigure_environment_blend to handle chroma + skybox + alpha

This commit is contained in:
galister 2026-04-17 14:44:25 +09:00
parent 0d8937ff80
commit 266b0fd507
9 changed files with 63 additions and 32 deletions

View File

@ -18,7 +18,7 @@ use wgui::{
};
use wlx_common::{
config::GeneralConfig,
dash_interface::{self, MonadoDumpSessionFrame},
dash_interface::{self, ConfigChangeKind, MonadoDumpSessionFrame},
};
use crate::{
@ -175,7 +175,7 @@ impl<T> Tab<T> for TabMonado<T> {
Task::GeneralSettingsChromaUpdate => {
if let Subtab::GeneralSettings(tab) = &mut self.subtab {
tab.chroma_update(frontend.interface.general_config(data));
frontend.interface.config_changed(data);
frontend.interface.config_changed(data, ConfigChangeKind::EnvironmentBlend);
}
}
Task::SetBrightness(brightness) => self.set_brightness(frontend, data, brightness),

View File

@ -19,7 +19,7 @@ use wgui::{
},
windowing::context_menu::{self, Blueprint, ContextMenu, TickResult},
};
use wlx_common::{config::GeneralConfig, config_io::ConfigRoot, dash_interface::RecenterMode};
use wlx_common::{config::GeneralConfig, config_io::ConfigRoot, dash_interface::{ConfigChangeKind, RecenterMode}};
use crate::{
frontend::{Frontend, FrontendTask, FrontendTasks},
@ -224,7 +224,7 @@ impl<T> Tab<T> for TabSettings<T> {
// Notify overlays of the change
if changed {
frontend.interface.config_changed(data);
frontend.interface.config_changed(data, ConfigChangeKind::OverlayConfig);
}
Ok(())

View File

@ -212,9 +212,9 @@ pub(super) fn posef_to_transform(pose: &xr::Posef) -> Affine3A {
Affine3A::from_rotation_translation(rotation, translation)
}
pub(super) fn reconfigure_chroma_key(app: &AppState) {
pub(super) fn try_apply_chroma_key(app: &AppState) -> bool {
let Some(monado) = app.monado_state.as_ref() else {
return;
return false;
};
let params = &app.session.config.chroma_key_params;
@ -226,6 +226,10 @@ pub(super) fn reconfigure_chroma_key(app: &AppState) {
params.curve,
params.despill,
) {
log::warn!("Could not set Chroma Key: {e:?}")
log::warn!("Could not set Chroma Key: {e:?}");
return false;
}
// if all values were non-0, assume we're in chroma key mode
params.hsv_max[0] * params.hsv_max[1] * params.hsv_max[2] * params.curve > 0.001
}

View File

@ -17,7 +17,7 @@ use crate::{
backend::{
BackendError, XrBackend,
input::interact,
openxr::{helpers::reconfigure_chroma_key, lines::LinePool, overlay::OpenXrOverlayData},
openxr::{helpers::try_apply_chroma_key, lines::LinePool, overlay::OpenXrOverlayData},
task::{OpenXrTask, OverlayTask, TaskType},
},
config::{save_settings, save_state},
@ -94,8 +94,6 @@ pub fn openxr_run(show_by_default: bool, headless: bool) -> Result<(), BackendEr
.ok()
});
reconfigure_chroma_key(&app);
let mut blocker = app
.monado_state
.as_ref()
@ -482,7 +480,7 @@ pub fn openxr_run(show_by_default: bool, headless: bool) -> Result<(), BackendEr
}
}
TaskType::OpenXR(task) => {
if matches!(task, OpenXrTask::SettingsChanged) {
if matches!(task, OpenXrTask::EnvironmentChanged) {
reconfigure_environment_blend(
&app,
&xr_state,
@ -491,7 +489,6 @@ pub fn openxr_run(show_by_default: bool, headless: bool) -> Result<(), BackendEr
&mut environment_blend_mode,
main_session_visible,
);
reconfigure_chroma_key(&app);
}
}
#[cfg(feature = "openvr")]
@ -532,6 +529,9 @@ pub(super) enum CompositionLayer<'a> {
Equirect2(xr::CompositionLayerEquirect2KHR<'a, xr::Vulkan>),
}
// applies chroma key settings.
// if chroma key or passthrough is enabled, use alpha env blend
// if alpha blend is not used and skybox is enabled, use skybox
fn reconfigure_environment_blend(
app: &AppState,
xr_state: &XrState,
@ -540,9 +540,11 @@ fn reconfigure_environment_blend(
environment_blend_mode: &mut xr::EnvironmentBlendMode,
main_session_visible: bool,
) {
let has_chroma_key = try_apply_chroma_key(app);
*environment_blend_mode = {
if modes.contains(&xr::EnvironmentBlendMode::ALPHA_BLEND)
&& app.session.config.use_passthrough
&& (app.session.config.use_passthrough || has_chroma_key)
{
xr::EnvironmentBlendMode::ALPHA_BLEND
} else {
@ -554,13 +556,14 @@ fn reconfigure_environment_blend(
&& app.session.config.use_skybox
&& !main_session_visible;
if want_skybox == skybox.is_some() {
return;
}
if want_skybox {
if let Some(curr_skybox) = skybox.as_ref() {
if curr_skybox.needs_recreate(app) {
*skybox = None;
log::debug!("Allocating skybox.");
*skybox = create_skybox(xr_state, app);
}
}
} else {
log::debug!("Destroying skybox.");
*skybox = None;

View File

@ -29,6 +29,7 @@ pub(super) struct Skybox {
grid: Option<WlxSwapchain>,
grid_pose: xr::Posef,
grid_color_scale_bias_khr: Option<Box<xr::sys::CompositionLayerColorScaleBiasKHR>>,
current_skybox: Arc<str>,
}
impl Skybox {
@ -66,6 +67,12 @@ impl Skybox {
}
}
let current_skybox = if maybe_image.is_some() {
app.session.config.skybox_texture.clone()
} else {
"".into()
};
if maybe_image.is_none() {
let p = include_bytes!("../../res/table_mountain_2.dds");
maybe_image = Some(command_buffer.upload_image_dds(p.as_slice())?);
@ -99,9 +106,14 @@ impl Skybox {
grid: None,
grid_pose: translation_rotation_to_posef(Vec3A::ZERO, Quat::from_rotation_x(PI * -0.5)),
grid_color_scale_bias_khr,
current_skybox,
})
}
pub(super) fn needs_recreate(&self, app: &AppState) -> bool {
*self.current_skybox != *app.session.config.skybox_texture
}
fn prepare_sky<'a>(
&'a mut self,
xr: &'a XrState,

View File

@ -56,7 +56,7 @@ pub enum OpenVrTask {
#[cfg(feature = "openxr")]
pub enum OpenXrTask {
SettingsChanged,
EnvironmentChanged,
}
pub enum PlayspaceTask {

View File

@ -16,7 +16,7 @@ use wgui::{
widget::EventResult,
};
use wlx_common::{
dash_interface::{self, DashInterface, RecenterMode},
dash_interface::{self, ConfigChangeKind, DashInterface, RecenterMode},
locale::WayVRLangProvider,
overlays::{BackendAttrib, BackendAttribValue},
};
@ -444,16 +444,22 @@ impl DashInterface<AppState> for DashInterfaceLive {
&mut data.session.config
}
fn config_changed(&mut self, data: &mut AppState) {
fn config_changed(&mut self, data: &mut AppState, kind: ConfigChangeKind) {
data.session.config_dirty = true;
match kind {
ConfigChangeKind::OverlayConfig => data
.tasks
.enqueue(TaskType::Overlay(OverlayTask::SettingsChanged)),
ConfigChangeKind::EnvironmentBlend => {
#[cfg(feature = "openxr")]
{
use crate::backend::task::OpenXrTask;
data.tasks
.enqueue(TaskType::OpenXR(OpenXrTask::SettingsChanged));
.enqueue(TaskType::OpenXR(OpenXrTask::EnvironmentChanged));
}
}
}
data.tasks
.enqueue(TaskType::Overlay(OverlayTask::SettingsChanged));
}
fn restart(&mut self, _data: &mut AppState) {

View File

@ -65,9 +65,15 @@ pub trait DashInterface<T> {
fn recenter_playspace(&mut self, data: &mut T, mode: RecenterMode) -> anyhow::Result<()>;
fn desktop_finder<'a>(&'a mut self, data: &'a mut T) -> &'a mut DesktopFinder;
fn general_config<'a>(&'a mut self, data: &'a mut T) -> &'a mut GeneralConfig;
fn config_changed(&mut self, data: &mut T);
fn config_changed(&mut self, data: &mut T, kind: ConfigChangeKind);
fn restart(&mut self, data: &mut T);
fn toggle_dashboard(&mut self, data: &mut T);
}
#[derive(Clone, Copy)]
pub enum ConfigChangeKind {
OverlayConfig,
EnvironmentBlend,
}
pub type BoxDashInterface<T> = Box<dyn DashInterface<T>>;

View File

@ -5,7 +5,7 @@ use wayvr_ipc::{
use crate::{
config::GeneralConfig,
dash_interface::{self, DashInterface, RecenterMode},
dash_interface::{self, ConfigChangeKind, DashInterface, RecenterMode},
desktop_finder::DesktopFinder,
gen_id,
};
@ -230,7 +230,7 @@ impl DashInterface<()> for DashInterfaceEmulated {
&mut self.general_config
}
fn config_changed(&mut self, _: &mut ()) {}
fn config_changed(&mut self, _: &mut (), _: ConfigChangeKind) {}
fn restart(&mut self, _data: &mut ()) {}