diff --git a/crates/bevy_xr/src/session.rs b/crates/bevy_xr/src/session.rs index 76e209b..9da4b2a 100644 --- a/crates/bevy_xr/src/session.rs +++ b/crates/bevy_xr/src/session.rs @@ -6,6 +6,7 @@ pub struct XrSessionPlugin; impl Plugin for XrSessionPlugin { fn build(&self, app: &mut App) { + app.init_resource::(); app.init_schedule(XrSessionCreated); app.init_schedule(XrSessionExiting); app.add_event::() @@ -13,10 +14,10 @@ impl Plugin for XrSessionPlugin { .add_event::() .add_event::() .add_event::() - // .add_systems( - // PreUpdate, - // handle_session.run_if(resource_exists::), - /* ) */; + .add_systems( + PreUpdate, + handle_session.run_if(resource_exists::), + ); } fn finish(&self, app: &mut App) { // This is in finnish because we need the RenderPlugin to already be added. @@ -26,6 +27,17 @@ impl Plugin for XrSessionPlugin { } } +/// Automatically starts session when it's available, gets set to false after the start event was +/// sent +#[derive(Clone, Copy, Resource, Deref, DerefMut)] +pub struct XrCreateSessionWhenAvailabe(pub bool); + +impl Default for XrCreateSessionWhenAvailabe { + fn default() -> Self { + XrCreateSessionWhenAvailabe(true) + } +} + #[derive(ScheduleLabel, Clone, Copy, PartialEq, Eq, Debug, Hash)] pub struct XrSessionCreated; @@ -79,15 +91,19 @@ pub fn handle_session( mut previous_status: Local>, mut create_session: EventWriter, mut begin_session: EventWriter, - mut end_session: EventWriter, + // mut end_session: EventWriter, mut destroy_session: EventWriter, + mut should_start_session: ResMut, ) { let current_status = status.get(); if *previous_status != Some(current_status) { match current_status { XrStatus::Unavailable => {} XrStatus::Available => { - create_session.send_default(); + if **should_start_session { + create_session.send_default(); + **should_start_session = false; + } } XrStatus::Idle => {} XrStatus::Ready => {