diff --git a/crates/bevy_openxr/src/openxr/action_set_syncing.rs b/crates/bevy_openxr/src/openxr/action_set_syncing.rs new file mode 100644 index 0000000..9ff3ddb --- /dev/null +++ b/crates/bevy_openxr/src/openxr/action_set_syncing.rs @@ -0,0 +1,37 @@ +use crate::{init::OxrPreUpdateSet, resources::OxrSession}; +use bevy::prelude::*; +use bevy_xr::session::session_running; + +impl Plugin for OxrActionSyncingPlugin { + fn build(&self, app: &mut App) { + app.add_event::(); + app.add_systems( + PreUpdate, + sync_sets + .run_if(session_running) + .in_set(OxrPreUpdateSet::SyncActions), + ); + } +} + +fn sync_sets(session: Res, mut events: EventReader) { + let sets = events + .read() + .map(|v| &v.0) + .map(openxr::ActiveActionSet::new) + .collect::>(); + + if sets.is_empty() { + return; + } + + if let Err(err) = session.sync_actions(&sets) { + warn!("error while syncing actionsets: {}", err.to_string()); + } +} + +#[derive(Event, Clone)] +/// Send this event for every ActionSet you want to attach to the [`OxrSession`] once the Session Status changed to Ready. all requests will +pub struct OxrSyncActionSet(pub openxr::ActionSet); + +pub struct OxrActionSyncingPlugin; diff --git a/crates/bevy_openxr/src/openxr/init.rs b/crates/bevy_openxr/src/openxr/init.rs index af7bc37..d557465 100644 --- a/crates/bevy_openxr/src/openxr/init.rs +++ b/crates/bevy_openxr/src/openxr/init.rs @@ -42,6 +42,7 @@ pub enum OxrPreUpdateSet { HandleEvents, UpdateCriticalComponents, UpdateNonCriticalComponents, + SyncActions, } pub struct OxrInitPlugin { diff --git a/crates/bevy_openxr/src/openxr/mod.rs b/crates/bevy_openxr/src/openxr/mod.rs index 34f62f0..c36acff 100644 --- a/crates/bevy_openxr/src/openxr/mod.rs +++ b/crates/bevy_openxr/src/openxr/mod.rs @@ -28,6 +28,7 @@ pub mod reference_space; pub mod render; pub mod resources; pub mod types; +pub mod action_set_syncing; pub fn add_xr_plugins(plugins: G) -> PluginGroupBuilder { plugins @@ -43,6 +44,7 @@ pub fn add_xr_plugins(plugins: G) -> PluginGroupBuilder { .add(XrCameraPlugin) .add(action_set_attaching::OxrActionAttachingPlugin) .add(action_binding::OxrActionBindingPlugin) + .add(action_set_syncing::OxrActionSyncingPlugin) // .add(XrActionPlugin) .set(WindowPlugin { primary_window: Some(Window {