@@ -4,9 +4,11 @@ use bevy::{
|
||||
prelude::*,
|
||||
render::extract_resource::{ExtractResource, ExtractResourcePlugin},
|
||||
};
|
||||
use bevy_xr::session::{status_changed_to, XrStatus};
|
||||
use bevy_xr::session::{
|
||||
status_changed_to, XrRenderSessionEnding, XrSessionCreated, XrSessionEnding, XrStatus,
|
||||
};
|
||||
|
||||
use crate::{init::OxrPreUpdateSet, resources::OxrSession};
|
||||
use crate::{init::OxrPreUpdateSet, session::OxrSession};
|
||||
|
||||
pub struct OxrReferenceSpacePlugin {
|
||||
pub default_primary_ref_space: openxr::ReferenceSpaceType,
|
||||
@@ -20,8 +22,7 @@ impl Default for OxrReferenceSpacePlugin {
|
||||
}
|
||||
|
||||
#[derive(Resource)]
|
||||
struct OxrPrimaryReferenceSpaceType(openxr::ReferenceSpaceType);
|
||||
// TODO: this will keep the session alive so we need to remove this in the render world too
|
||||
struct OxrDefaultPrimaryReferenceSpaceType(openxr::ReferenceSpaceType);
|
||||
/// The Default Reference space used for locating things
|
||||
#[derive(Resource, Deref, ExtractResource, Clone)]
|
||||
pub struct OxrPrimaryReferenceSpace(pub Arc<openxr::Space>);
|
||||
@@ -32,20 +33,24 @@ pub struct OxrReferenceSpace(pub openxr::Space);
|
||||
|
||||
impl Plugin for OxrReferenceSpacePlugin {
|
||||
fn build(&self, app: &mut App) {
|
||||
app.insert_resource(OxrPrimaryReferenceSpaceType(self.default_primary_ref_space));
|
||||
app.insert_resource(OxrDefaultPrimaryReferenceSpaceType(self.default_primary_ref_space));
|
||||
app.add_plugins(ExtractResourcePlugin::<OxrPrimaryReferenceSpace>::default());
|
||||
app.add_systems(
|
||||
PreUpdate,
|
||||
set_primary_ref_space
|
||||
.run_if(status_changed_to(XrStatus::Ready))
|
||||
.in_set(OxrPreUpdateSet::UpdateCriticalComponents),
|
||||
);
|
||||
app.add_systems(XrSessionCreated, set_primary_ref_space);
|
||||
app.add_systems(XrSessionEnding, cleanup);
|
||||
app.add_systems(XrRenderSessionEnding, cleanup);
|
||||
}
|
||||
}
|
||||
|
||||
fn cleanup(mut cmds: Commands, query: Query<Entity, With<OxrReferenceSpace>>) {
|
||||
cmds.remove_resource::<OxrPrimaryReferenceSpace>();
|
||||
for e in &query {
|
||||
cmds.entity(e).remove::<OxrReferenceSpace>();
|
||||
}
|
||||
}
|
||||
|
||||
fn set_primary_ref_space(
|
||||
session: Res<OxrSession>,
|
||||
space_type: Res<OxrPrimaryReferenceSpaceType>,
|
||||
space_type: Res<OxrDefaultPrimaryReferenceSpaceType>,
|
||||
mut cmds: Commands,
|
||||
) {
|
||||
match session.create_reference_space(space_type.0, openxr::Posef::IDENTITY) {
|
||||
|
||||
Reference in New Issue
Block a user