From b77bb954d0cfebbdbacc2e214e6147afdb8c6af8 Mon Sep 17 00:00:00 2001 From: awtterpip Date: Sat, 16 Mar 2024 19:42:50 -0500 Subject: [PATCH] some init code --- crates/bevy_openxr/src/init.rs | 50 ++++++++++++++++++++++++++++++---- crates/bevy_xr/src/session.rs | 6 ++-- 2 files changed, 48 insertions(+), 8 deletions(-) diff --git a/crates/bevy_openxr/src/init.rs b/crates/bevy_openxr/src/init.rs index 40fe4f2..d0d6f53 100644 --- a/crates/bevy_openxr/src/init.rs +++ b/crates/bevy_openxr/src/init.rs @@ -1,3 +1,4 @@ +use bevy::app::AppExit; use bevy::math::uvec2; use bevy::prelude::*; use bevy::render::extract_resource::ExtractResourcePlugin; @@ -25,6 +26,9 @@ pub enum XrPreUpdateSet { HandleEvents, } +#[derive(Resource, Clone, Copy, PartialEq)] +pub struct AppExiting(bool); + pub struct XrInitPlugin { /// Information about the app this is being used to build. pub app_info: AppInfo, @@ -83,11 +87,17 @@ impl Plugin for XrInitPlugin { .run_if(status_equals(XrStatus::Ready)), end_xr_session .run_if(on_event::()) - .run_if(session_started), + .run_if(status_equals(XrStatus::Exiting)), ) .in_set(XrPreUpdateSet::HandleEvents), ), ) + .add_systems( + Last, + app_exit_xr + .run_if(resource_equals(AppExiting(false))) + .run_if(on_event::()), + ) .insert_resource(instance.clone()) .insert_resource(system_id) .insert_resource(status.clone()) @@ -126,7 +136,8 @@ impl Plugin for XrInitPlugin { let session_started = XrSessionStarted::default(); - app.insert_resource(session_started.clone()); + app.insert_resource(session_started.clone()) + .insert_resource(AppExiting(false)); let render_app = app.sub_app_mut(RenderApp); @@ -177,8 +188,8 @@ impl XrInitPlugin { let instance = entry.create_instance( self.app_info.clone(), exts, - // &["XR_APILAYER_LUNARG_api_dump"], - &[], + &["XR_APILAYER_LUNARG_api_dump"], + // &[], backend, )?; let instance_props = instance.properties()?; @@ -418,6 +429,17 @@ pub fn end_xr_session(session: Res, session_started: Res, + mut app_exit_events: ResMut>, + session_started: Res, +) { + // we need to temporarily intercept the exit event to allow the session to exit. + app_exit_events.clear(); + *app_exiting = AppExiting(true); + session_started.set(false); +} + /// This system transfers important render resources from the main world to the render world when a session is created. pub fn transfer_xr_resources(mut commands: Commands, mut world: ResMut) { let Some(XrRenderResources { @@ -441,7 +463,13 @@ pub fn transfer_xr_resources(mut commands: Commands, mut world: ResMut, status: Res) { +pub fn poll_events( + instance: Res, + status: Res, + session: Option>, + app_exiting: Res, + mut exit_app: EventWriter, +) { let mut buffer = Default::default(); while let Some(event) = instance .poll_event(&mut buffer) @@ -462,7 +490,17 @@ pub fn poll_events(instance: Res, status: Res) { SessionState::SYNCHRONIZED | SessionState::VISIBLE | SessionState::FOCUSED => { XrStatus::Running } - SessionState::STOPPING => XrStatus::Stopping, + SessionState::STOPPING => { + if app_exiting.0 { + if let Some(session) = &session { + session.end().expect("Failed to end session"); + } + + exit_app.send_default(); + } + + XrStatus::Stopping + } SessionState::EXITING | SessionState::LOSS_PENDING => XrStatus::Exiting, _ => unreachable!(), }; diff --git a/crates/bevy_xr/src/session.rs b/crates/bevy_xr/src/session.rs index 31a3382..04c76b9 100644 --- a/crates/bevy_xr/src/session.rs +++ b/crates/bevy_xr/src/session.rs @@ -58,7 +58,7 @@ pub fn handle_session( mut previous_status: Local>, mut create_session: EventWriter, mut begin_session: EventWriter, - mut _end_session: EventWriter, + mut end_session: EventWriter, ) { let current_status = status.get(); if *previous_status != Some(current_status) { @@ -72,7 +72,9 @@ pub fn handle_session( begin_session.send_default(); } XrStatus::Running => {} - XrStatus::Stopping => {} + XrStatus::Stopping => { + end_session.send_default(); + } XrStatus::Exiting => {} } }