refactor tasks
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>,
|
||||
|
||||
@@ -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),
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user