Add Vec2Conv helper and Display warning with message when openxr fails to load (#58)

* add support for Vec2 Actions, slightly changed the way actions are created but no functionality change and changed the get_action_* return result to a custom error

* Whoops

* added warning with error when openxr fails to load and added Vec2Conv helper

* made it possible for the user to spawn OpenXRTrackingRoot
This commit is contained in:
Schmarni
2023-12-14 06:25:17 +01:00
committed by GitHub
parent 248d160ae5
commit 265696b07d
2 changed files with 88 additions and 65 deletions

View File

@@ -82,67 +82,70 @@ impl Plugin for OpenXrPlugin {
let mut system_state: SystemState<Query<&RawHandleWrapper, With<PrimaryWindow>>> = let mut system_state: SystemState<Query<&RawHandleWrapper, With<PrimaryWindow>>> =
SystemState::new(&mut app.world); SystemState::new(&mut app.world);
let primary_window = system_state.get(&app.world).get_single().ok().cloned(); let primary_window = system_state.get(&app.world).get_single().ok().cloned();
if let Ok(( match graphics::initialize_xr_graphics(primary_window.clone()) {
device, Ok((
queue, device,
adapter_info, queue,
render_adapter, adapter_info,
instance, render_adapter,
xr_instance, instance,
session,
blend_mode,
resolution,
format,
session_running,
frame_waiter,
swapchain,
input,
views,
frame_state,
)) = graphics::initialize_xr_graphics(primary_window.clone())
{
// std::thread::sleep(Duration::from_secs(5));
debug!("Configured wgpu adapter Limits: {:#?}", device.limits());
debug!("Configured wgpu adapter Features: {:#?}", device.features());
app.insert_resource(xr_instance.clone());
app.insert_resource(session.clone());
app.insert_resource(blend_mode.clone());
app.insert_resource(resolution.clone());
app.insert_resource(format.clone());
app.insert_resource(session_running.clone());
app.insert_resource(frame_waiter.clone());
app.insert_resource(swapchain.clone());
app.insert_resource(input.clone());
app.insert_resource(views.clone());
app.insert_resource(frame_state.clone());
let xr_data = XrRenderData {
xr_instance, xr_instance,
xr_session: session, session,
xr_blend_mode: blend_mode, blend_mode,
xr_resolution: resolution, resolution,
xr_format: format, format,
xr_session_running: session_running, session_running,
xr_frame_waiter: frame_waiter, frame_waiter,
xr_swapchain: swapchain, swapchain,
xr_input: input, input,
xr_views: views, views,
xr_frame_state: frame_state, frame_state,
}; )) => {
app.insert_resource(xr_data); // std::thread::sleep(Duration::from_secs(5));
app.insert_resource(ActionSets(vec![])); debug!("Configured wgpu adapter Limits: {:#?}", device.limits());
app.add_plugins(RenderPlugin { debug!("Configured wgpu adapter Features: {:#?}", device.features());
render_creation: RenderCreation::Manual( app.insert_resource(xr_instance.clone());
device, app.insert_resource(session.clone());
queue, app.insert_resource(blend_mode.clone());
adapter_info, app.insert_resource(resolution.clone());
render_adapter, app.insert_resource(format.clone());
RenderInstance(Arc::new(instance)), app.insert_resource(session_running.clone());
), app.insert_resource(frame_waiter.clone());
}); app.insert_resource(swapchain.clone());
app.insert_resource(XrEnableStatus::Enabled); app.insert_resource(input.clone());
} else { app.insert_resource(views.clone());
app.add_plugins(RenderPlugin::default()); app.insert_resource(frame_state.clone());
app.insert_resource(XrEnableStatus::Disabled); let xr_data = XrRenderData {
xr_instance,
xr_session: session,
xr_blend_mode: blend_mode,
xr_resolution: resolution,
xr_format: format,
xr_session_running: session_running,
xr_frame_waiter: frame_waiter,
xr_swapchain: swapchain,
xr_input: input,
xr_views: views,
xr_frame_state: frame_state,
};
app.insert_resource(xr_data);
app.insert_resource(ActionSets(vec![]));
app.add_plugins(RenderPlugin {
render_creation: RenderCreation::Manual(
device,
queue,
adapter_info,
render_adapter,
RenderInstance(Arc::new(instance)),
),
});
app.insert_resource(XrEnableStatus::Enabled);
}
Err(err) => {
warn!("OpenXR Failed to initialize: {}", err);
app.add_plugins(RenderPlugin::default());
app.insert_resource(XrEnableStatus::Disabled);
}
} }
} }

View File

@@ -16,7 +16,11 @@ use crate::xr_input::controllers::XrControllerType;
use crate::xr_input::oculus_touch::setup_oculus_controller; use crate::xr_input::oculus_touch::setup_oculus_controller;
use crate::xr_input::xr_camera::{xr_camera_head_sync, Eye, XRProjection, XrCameraBundle}; use crate::xr_input::xr_camera::{xr_camera_head_sync, Eye, XRProjection, XrCameraBundle};
use bevy::app::{App, PostUpdate, Startup}; use bevy::app::{App, PostUpdate, Startup};
use bevy::ecs::entity::Entity;
use bevy::ecs::query::With;
use bevy::ecs::system::Query;
use bevy::log::{info, warn}; use bevy::log::{info, warn};
use bevy::math::Vec2;
use bevy::prelude::{BuildChildren, Component, Deref, DerefMut, IntoSystemConfigs, Resource}; use bevy::prelude::{BuildChildren, Component, Deref, DerefMut, IntoSystemConfigs, Resource};
use bevy::prelude::{Commands, Plugin, PreUpdate, Quat, Res, SpatialBundle, Update, Vec3}; use bevy::prelude::{Commands, Plugin, PreUpdate, Quat, Res, SpatialBundle, Update, Vec3};
use bevy::render::camera::CameraProjectionPlugin; use bevy::render::camera::CameraProjectionPlugin;
@@ -60,7 +64,7 @@ impl Plugin for OpenXrInput {
} }
//adopt any new trackers //adopt any new trackers
app.add_systems(PreUpdate, adopt_open_xr_trackers.run_if(xr_only())); app.add_systems(PreUpdate, adopt_open_xr_trackers.run_if(xr_only()));
app.add_systems(PreUpdate, action_set_system); app.add_systems(PreUpdate, action_set_system.run_if(xr_only()));
app.add_systems( app.add_systems(
PreUpdate, PreUpdate,
xr_camera_head_sync.run_if(xr_only()).after(xr_begin_frame), xr_camera_head_sync.run_if(xr_only()).after(xr_begin_frame),
@@ -88,12 +92,19 @@ fn setup_binding_recommendations(
commands.remove_resource::<InteractionProfileBindings>(); commands.remove_resource::<InteractionProfileBindings>();
} }
fn setup_xr_cameras(mut commands: Commands) { fn setup_xr_cameras(
mut commands: Commands,
tracking_root_query: Query<Entity, With<OpenXRTrackingRoot>>,
) {
//this needs to do the whole xr tracking volume not just cameras //this needs to do the whole xr tracking volume not just cameras
//get the root? //get the root?
let tracking_root = commands
.spawn((SpatialBundle::default(), OpenXRTrackingRoot)) let tracking_root = match tracking_root_query.get_single() {
.id(); Ok(e) => e,
Err(_) => commands
.spawn((SpatialBundle::default(), OpenXRTrackingRoot))
.id(),
};
let right = commands let right = commands
.spawn((XrCameraBundle::new(Eye::Right), OpenXRRightEye)) .spawn((XrCameraBundle::new(Eye::Right), OpenXRRightEye))
.id(); .id();
@@ -117,6 +128,15 @@ pub fn action_set_system(action_sets: Res<ActionSets>, session: Res<XrSession>)
} }
} }
pub trait Vec2Conv {
fn to_vec2(&self) -> Vec2;
}
impl Vec2Conv for openxr::Vector2f {
fn to_vec2(&self) -> Vec2 {
Vec2::new(self.x, self.y)
}
}
pub trait Vec3Conv { pub trait Vec3Conv {
fn to_vec3(&self) -> Vec3; fn to_vec3(&self) -> Vec3;
} }