refactor tasks

This commit is contained in:
galister
2025-12-10 17:12:26 +09:00
parent c6aa84f6cb
commit 01fea96545
16 changed files with 255 additions and 259 deletions

View File

@@ -8,6 +8,7 @@ use idmap_derive::IntegerId;
use smallvec::{smallvec, SmallVec};
use wlx_common::windowing::{OverlayWindowState, Positioning};
use crate::backend::task::OverlayTask;
use crate::overlays::anchor::ANCHOR_NAME;
use crate::state::{AppSession, AppState};
use crate::subsystem::hid::WheelDelta;
@@ -630,12 +631,12 @@ fn start_grab(
};
// Show anchor
app.tasks.enqueue(TaskType::Overlay(
app.tasks.enqueue(TaskType::Overlay(OverlayTask::Modify(
OverlaySelector::Name(ANCHOR_NAME.clone()),
Box::new(|app, o| {
o.activate(app);
}),
));
)));
}
fn handle_scale(transform: &mut Affine3A, scroll_y: f32) {
@@ -711,12 +712,12 @@ where
}
// Hide anchor
app.tasks.enqueue(TaskType::Overlay(
app.tasks.enqueue(TaskType::Overlay(OverlayTask::Modify(
OverlaySelector::Name(ANCHOR_NAME.clone()),
Box::new(|_app, o| {
o.deactivate();
}),
));
)));
log::debug!("Hand {}: dropped {}", idx, overlay.config.name);
}
}

View File

@@ -1,10 +1,7 @@
use std::{
collections::VecDeque,
ops::Add,
sync::{
atomic::{AtomicBool, AtomicUsize, Ordering},
Arc,
},
sync::atomic::Ordering,
time::{Duration, Instant},
};
@@ -26,7 +23,7 @@ use crate::{
manifest::{install_manifest, uninstall_manifest},
overlay::OpenVrOverlayData,
},
task::{ManagerTask, SystemTask, TaskType},
task::{OpenVrTask, OverlayTask, TaskType},
BackendError,
},
config::save_state,
@@ -40,8 +37,8 @@ use crate::{
windowing::{
backend::{RenderResources, ShouldRender},
manager::OverlayWindowManager,
window::OverlayWindowData,
},
RUNNING,
};
#[cfg(feature = "wayvr")]
@@ -54,8 +51,6 @@ pub mod manifest;
pub mod overlay;
pub mod playspace;
static FRAME_COUNTER: AtomicUsize = AtomicUsize::new(0);
pub fn openvr_uninstall() {
let app_type = EVRApplicationType::VRApplication_Overlay;
let Ok(context) = ovr_overlay::Context::init(app_type) else {
@@ -68,11 +63,7 @@ pub fn openvr_uninstall() {
}
#[allow(clippy::too_many_lines, clippy::cognitive_complexity)]
pub fn openvr_run(
running: Arc<AtomicBool>,
show_by_default: bool,
headless: bool,
) -> Result<(), BackendError> {
pub fn openvr_run(show_by_default: bool, headless: bool) -> Result<(), BackendError> {
let app_type = EVRApplicationType::VRApplication_Overlay;
let Ok(context) = ovr_overlay::Context::init(app_type) else {
log::warn!("Will not use OpenVR: Context init failed");
@@ -107,7 +98,7 @@ pub fn openvr_run(
if show_by_default {
app.tasks.enqueue_at(
TaskType::Manager(ManagerTask::ShowHide),
TaskType::Overlay(OverlayTask::ShowHide),
Instant::now().add(Duration::from_secs(1)),
);
}
@@ -159,13 +150,11 @@ pub fn openvr_run(
'main_loop: loop {
let _ = overlay_mgr.wait_frame_sync(frame_timeout);
if !running.load(Ordering::Relaxed) {
if !RUNNING.load(Ordering::Relaxed) {
log::warn!("Received shutdown signal.");
break 'main_loop;
}
let cur_frame = FRAME_COUNTER.fetch_add(1, Ordering::Relaxed);
while let Some(event) = system_mgr.poll_next_event() {
match event.event_type {
EVREventType::VREvent_Quit => {
@@ -215,52 +204,17 @@ pub fn openvr_run(
while let Some(task) = due_tasks.pop_front() {
match task {
TaskType::Overlay(sel, f) => {
if let Some(o) = overlays.mut_by_selector(&sel) {
f(&mut app, &mut o.config);
} else {
log::warn!("Overlay not found for task: {sel:?}");
}
}
TaskType::CreateOverlay(sel, f) => {
let None = overlays.mut_by_selector(&sel) else {
continue;
};
let Some(overlay_config) = f(&mut app) else {
continue;
};
overlays.add(
OverlayWindowData {
birthframe: cur_frame,
..OverlayWindowData::from_config(overlay_config)
},
&mut app,
);
}
TaskType::DropOverlay(sel) => {
if let Some(o) = overlays.mut_by_selector(&sel)
&& o.birthframe < cur_frame
{
o.destroy(&mut overlay_mgr);
overlays.remove_by_selector(&sel, &mut app);
}
}
TaskType::System(task) => match task {
SystemTask::ColorGain(channel, value) => {
let _ = adjust_gain(&mut settings_mgr, channel, value);
}
SystemTask::FixFloor => {
playspace.fix_floor(&mut chaperone_mgr, &app.input_state);
}
SystemTask::ResetPlayspace => {
playspace.reset_offset(&mut chaperone_mgr, &app.input_state);
}
},
TaskType::Manager(task) => {
TaskType::Overlay(task) => {
overlays.handle_task(&mut app, task)?;
}
TaskType::Playspace(task) => {
playspace.handle_task(&mut app, &mut chaperone_mgr, task);
}
TaskType::OpenVR(task) => match task {
OpenVrTask::ColorGain(channel, value) => {
let _ = adjust_gain(&mut settings_mgr, channel, value);
}
},
#[cfg(feature = "wayvr")]
TaskType::WayVR(action) => {
wayvr_action(&mut app, &mut overlays, &action);
@@ -268,6 +222,10 @@ pub fn openvr_run(
}
}
while let Some(mut o) = overlays.pop_dropped() {
o.destroy(&mut overlay_mgr);
}
let universe = playspace.get_universe();
app.input_state.pre_update();

View File

@@ -6,7 +6,9 @@ use ovr_overlay::{
};
use crate::{
backend::input::InputState, state::AppState, windowing::manager::OverlayWindowManager,
backend::{input::InputState, task::PlayspaceTask},
state::AppState,
windowing::manager::OverlayWindowManager,
};
use super::{helpers::Affine3AConvert, overlay::OpenVrOverlayData};
@@ -32,6 +34,22 @@ impl PlayspaceMover {
}
}
pub fn handle_task(
&mut self,
app: &AppState,
chaperone_mgr: &mut ChaperoneSetupManager,
task: PlayspaceTask,
) {
match task {
PlayspaceTask::FixFloor => {
self.fix_floor(chaperone_mgr, &app.input_state);
}
PlayspaceTask::ResetPlayspace => {
self.reset_offset(chaperone_mgr, &app.input_state);
}
}
}
#[allow(clippy::too_many_lines, clippy::cognitive_complexity)]
pub fn update(
&mut self,

View File

@@ -2,7 +2,7 @@ use std::{
collections::VecDeque,
ops::Add,
sync::{
atomic::{AtomicBool, AtomicUsize, Ordering},
atomic::{AtomicBool, Ordering},
Arc,
},
time::{Duration, Instant},
@@ -20,7 +20,7 @@ use crate::{
backend::{
input::interact,
openxr::{lines::LinePool, overlay::OpenXrOverlayData},
task::{ManagerTask, SystemTask, TaskType},
task::{OverlayTask, TaskType},
BackendError,
},
config::save_state,
@@ -34,8 +34,8 @@ use crate::{
windowing::{
backend::{RenderResources, ShouldRender},
manager::OverlayWindowManager,
window::OverlayWindowData,
},
FRAME_COUNTER, RUNNING,
};
#[cfg(feature = "wayvr")]
@@ -51,7 +51,6 @@ mod skybox;
mod swapchain;
const VIEW_TYPE: xr::ViewConfigurationType = xr::ViewConfigurationType::PRIMARY_STEREO;
static FRAME_COUNTER: AtomicUsize = AtomicUsize::new(0);
struct XrState {
instance: xr::Instance,
@@ -63,11 +62,7 @@ struct XrState {
}
#[allow(clippy::too_many_lines, clippy::cognitive_complexity)]
pub fn openxr_run(
running: Arc<AtomicBool>,
show_by_default: bool,
headless: bool,
) -> Result<(), BackendError> {
pub fn openxr_run(show_by_default: bool, headless: bool) -> Result<(), BackendError> {
let (xr_instance, system) = match helpers::init_xr() {
Ok((xr_instance, system)) => (xr_instance, system),
Err(e) => {
@@ -95,7 +90,7 @@ pub fn openxr_run(
if show_by_default {
app.tasks.enqueue_at(
TaskType::Manager(ManagerTask::ShowHide),
TaskType::Overlay(OverlayTask::ShowHide),
Instant::now().add(Duration::from_secs(1)),
);
}
@@ -178,7 +173,7 @@ pub fn openxr_run(
'main_loop: loop {
let cur_frame = FRAME_COUNTER.fetch_add(1, Ordering::Relaxed);
if !running.load(Ordering::Relaxed) {
if !RUNNING.load(Ordering::Relaxed) {
log::warn!("Received shutdown signal.");
match xr_state.session.request_exit() {
Ok(()) => log::info!("OpenXR session exit requested."),
@@ -493,58 +488,16 @@ pub fn openxr_run(
app.tasks.retrieve_due(&mut due_tasks);
while let Some(task) = due_tasks.pop_front() {
match task {
TaskType::Overlay(sel, f) => {
if let Some(o) = overlays.mut_by_selector(&sel) {
f(&mut app, &mut o.config);
} else {
log::warn!("Overlay not found for task: {sel:?}");
}
}
TaskType::CreateOverlay(sel, f) => {
let None = overlays.mut_by_selector(&sel) else {
continue;
};
let Some(overlay_config) = f(&mut app) else {
continue;
};
overlays.add(
OverlayWindowData {
birthframe: cur_frame,
..OverlayWindowData::from_config(overlay_config)
},
&mut app,
);
}
TaskType::DropOverlay(sel) => {
if let Some(o) = overlays.mut_by_selector(&sel)
&& o.birthframe < cur_frame
{
log::debug!("{}: destroy", o.config.name);
if let Some(o) = overlays.remove_by_selector(&sel, &mut app) {
// set for deletion after all images are done showing
delete_queue.push((o, cur_frame + 5));
}
}
}
TaskType::System(task) => match task {
SystemTask::FixFloor => {
if let Some(ref mut playspace) = playspace {
playspace.fix_floor(
&app.input_state,
monado.as_mut().unwrap(), // safe
);
}
}
SystemTask::ResetPlayspace => {
if let Some(ref mut playspace) = playspace {
playspace.reset_offset(monado.as_mut().unwrap()); // safe
}
}
_ => {}
},
TaskType::Manager(task) => {
TaskType::Overlay(task) => {
overlays.handle_task(&mut app, task)?;
}
TaskType::Playspace(task) => {
if let (Some(playspace), Some(monado)) = (playspace.as_mut(), monado.as_mut()) {
playspace.handle_task(&mut app, monado, task);
}
}
#[cfg(feature = "openvr")]
TaskType::OpenVR(_) => {}
#[cfg(feature = "wayvr")]
TaskType::WayVR(action) => {
wayvr_action(&mut app, &mut overlays, &action);
@@ -552,6 +505,10 @@ pub fn openxr_run(
}
}
while let Some(o) = overlays.pop_dropped() {
delete_queue.push((o, cur_frame + 5));
}
delete_queue.retain(|(_, frame)| *frame > cur_frame);
//FIXME: Temporary workaround for Monado bug

View File

@@ -2,7 +2,9 @@ use glam::{Affine3A, Quat, Vec3A};
use libmonado::{Monado, Pose, ReferenceSpaceType};
use crate::{
backend::input::InputState, state::AppState, windowing::manager::OverlayWindowManager,
backend::{input::InputState, task::PlayspaceTask},
state::AppState,
windowing::manager::OverlayWindowManager,
};
use super::overlay::OpenXrOverlayData;
@@ -41,6 +43,17 @@ impl PlayspaceMover {
})
}
pub fn handle_task(&mut self, app: &AppState, monado: &mut Monado, task: PlayspaceTask) {
match task {
PlayspaceTask::FixFloor => {
self.fix_floor(&app.input_state, monado);
}
PlayspaceTask::ResetPlayspace => {
self.reset_offset(monado);
}
}
}
pub fn update(
&mut self,
overlays: &mut OverlayWindowManager<OpenXrOverlayData>,

View File

@@ -43,28 +43,34 @@ impl Ord for AppTask {
}
}
pub enum SystemTask {
#[cfg(feature = "openvr")]
pub enum OpenVrTask {
ColorGain(ColorChannel, f32),
}
pub enum PlayspaceTask {
ResetPlayspace,
FixFloor,
}
pub type OverlayTask = dyn FnOnce(&mut AppState, &mut OverlayWindowConfig) + Send;
pub type ModifyOverlayTask = dyn FnOnce(&mut AppState, &mut OverlayWindowConfig) + Send;
pub type CreateOverlayTask = dyn FnOnce(&mut AppState) -> Option<OverlayWindowConfig> + Send;
pub enum ManagerTask {
pub enum OverlayTask {
AddSet,
ToggleSet(usize),
DeleteActiveSet,
ToggleEditMode,
ShowHide,
Modify(OverlaySelector, Box<ModifyOverlayTask>),
Create(OverlaySelector, Box<CreateOverlayTask>),
Drop(OverlaySelector),
}
pub enum TaskType {
Overlay(OverlaySelector, Box<OverlayTask>),
CreateOverlay(OverlaySelector, Box<CreateOverlayTask>),
DropOverlay(OverlaySelector),
Manager(ManagerTask),
System(SystemTask),
Overlay(OverlayTask),
Playspace(PlayspaceTask),
#[cfg(feature = "openvr")]
OpenVR(OpenVrTask),
#[cfg(feature = "wayvr")]
WayVR(WayVRAction),
}