Files
bevy_oxr/crates/bevy_openxr/src/openxr/reference_space.rs
2025-10-19 16:13:59 +02:00

70 lines
2.2 KiB
Rust

use bevy_app::{App, Plugin};
use bevy_ecs::{
entity::Entity,
query::With,
resource::Resource,
system::{Commands, Query, Res},
};
use bevy_log::error;
use bevy_math::Isometry3d;
use bevy_mod_xr::{
session::{XrPreDestroySession, XrSessionCreated},
spaces::{XrPrimaryReferenceSpace, XrReferenceSpace},
};
use bevy_render::{RenderApp, extract_resource::ExtractResourcePlugin};
use crate::session::OxrSession;
pub struct OxrReferenceSpacePlugin {
pub default_primary_ref_space: openxr::ReferenceSpaceType,
}
impl Default for OxrReferenceSpacePlugin {
fn default() -> Self {
Self {
default_primary_ref_space: openxr::ReferenceSpaceType::STAGE,
}
}
}
/// Resource specifying what the type should used be for the [`XrPrimaryReferenceSpace`]. Set through [`OxrReferenceSpacePlugin`].
#[derive(Resource)]
struct OxrDefaultPrimaryReferenceSpaceType(openxr::ReferenceSpaceType);
impl Plugin for OxrReferenceSpacePlugin {
fn build(&self, app: &mut App) {
app.add_plugins(ExtractResourcePlugin::<XrPrimaryReferenceSpace>::default())
.insert_resource(OxrDefaultPrimaryReferenceSpaceType(
self.default_primary_ref_space,
))
.add_systems(XrSessionCreated, set_primary_ref_space)
.add_systems(XrPreDestroySession, cleanup);
let render_app = app.sub_app_mut(RenderApp);
render_app.add_systems(XrPreDestroySession, cleanup);
}
}
fn cleanup(query: Query<Entity, With<XrReferenceSpace>>, mut cmds: Commands) {
cmds.remove_resource::<XrPrimaryReferenceSpace>();
for e in &query {
cmds.entity(e).remove::<XrReferenceSpace>();
}
}
fn set_primary_ref_space(
session: Res<OxrSession>,
space_type: Res<OxrDefaultPrimaryReferenceSpaceType>,
mut cmds: Commands,
) {
match session.create_reference_space(space_type.0, Isometry3d::IDENTITY) {
Ok(space) => {
cmds.insert_resource(XrPrimaryReferenceSpace(space));
}
Err(openxr::sys::Result::ERROR_EXTENSION_NOT_PRESENT) => {
error!("Required Extension for Reference Space not loaded");
}
Err(err) => error!("Error while creating reference space: {}", err.to_string()),
};
}