diff --git a/Cargo.toml b/Cargo.toml index 2836170..2f6c6f5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,7 +15,7 @@ force-link = ["openxr/linked"] members = ["examples/android", "examples/demo"] [dependencies] -anyhow = "1.0.75" +# anyhow = "1.0.75" ash = "0.37.3" bevy = "0.12" futures-lite = "2.0.1" @@ -23,6 +23,7 @@ mint = "0.5.9" wgpu = "0.17.1" wgpu-core = { version = "0.17.1", features = ["vulkan"] } wgpu-hal = "0.17.1" +eyre = "0.6.11" [target.'cfg(windows)'.dependencies] openxr = { git = "https://github.com/Ralith/openxrs", rev = "0177d2d", features = [ @@ -42,8 +43,8 @@ openxr = { git = "https://github.com/Ralith/openxrs", rev = "0177d2d", features [dev-dependencies] bevy = "0.12" -color-eyre = "0.6.2" bevy_rapier3d = { git = "https://github.com/devil-ira/bevy_rapier", branch = "bevy-0.12" } +color-eyre = "0.6.2" [[example]] name = "xr" diff --git a/examples/demo/src/lib.rs b/examples/demo/src/lib.rs index 22529c7..ad92cd8 100644 --- a/examples/demo/src/lib.rs +++ b/examples/demo/src/lib.rs @@ -560,8 +560,6 @@ fn request_cube_spawn( ) { timer.0.tick(time.delta()); if timer.0.finished() { - //lock frame - let frame_state = *frame_state.lock().unwrap(); //get controller let controller = oculus_controller.get_ref(&session, &frame_state, &xr_input, &action_sets); //get controller triggers @@ -628,8 +626,6 @@ fn prototype_interaction_input( >, action_sets: Res, ) { - //lock frame - let frame_state = *frame_state.lock().unwrap(); //get controller let controller = oculus_controller.get_ref(&session, &frame_state, &xr_input, &action_sets); //get controller triggers diff --git a/src/graphics/mod.rs b/src/graphics/mod.rs index 0aa3dfc..49baa88 100644 --- a/src/graphics/mod.rs +++ b/src/graphics/mod.rs @@ -7,8 +7,8 @@ use wgpu::Instance; use crate::input::XrInput; use crate::resources::{ - XrEnvironmentBlendMode, XrFormat, XrFrameState, XrFrameWaiter, XrInstance, XrResolution, - XrSession, XrSessionRunning, XrSwapchain, XrViews, + XrEnvironmentBlendMode, XrFormat, XrFrameState, XrInstance, XrResolution, XrSession, + XrSessionRunning, XrSwapchain, XrViews, XrFrameWaiter, }; use openxr as xr; @@ -44,7 +44,7 @@ pub fn initialize_xr_graphics( reqeusted_extensions: XrExtensions, prefered_blend_mode: XrPreferdBlendMode, app_info: XrAppInfo, -) -> anyhow::Result<( +) -> eyre::Result<( RenderDevice, RenderQueue, RenderAdapterInfo, @@ -62,13 +62,14 @@ pub fn initialize_xr_graphics( XrViews, XrFrameState, )> { - vulkan::initialize_xr_graphics(window, reqeusted_extensions, prefered_blend_mode, app_info) + // vulkan::initialize_xr_graphics(window, reqeusted_extensions, prefered_blend_mode, app_info) + todo!() } -pub fn xr_entry() -> anyhow::Result { +pub fn xr_entry() -> eyre::Result { #[cfg(windows)] let entry = Ok(xr::Entry::linked()); #[cfg(not(windows))] - let entry = unsafe { xr::Entry::load().map_err(|e| anyhow::anyhow!(e)) }; + let entry = unsafe { xr::Entry::load().map_err(|e| eyre::eyre!(e)) }; entry } diff --git a/src/graphics/vulkan.rs b/src/graphics/vulkan.rs index ba9814e..1411491 100644 --- a/src/graphics/vulkan.rs +++ b/src/graphics/vulkan.rs @@ -1,52 +1,45 @@ use std::ffi::{c_void, CString}; use std::sync::atomic::AtomicBool; -use std::sync::{Arc, Mutex}; +use std::sync::Mutex; -use anyhow::Context; +// use anyhow::Context; use ash::vk::{self, Handle}; use bevy::math::uvec2; use bevy::prelude::*; use bevy::render::renderer::{RenderAdapter, RenderAdapterInfo, RenderDevice, RenderQueue}; use bevy::window::RawHandleWrapper; +use eyre::{Context, ContextCompat}; use openxr as xr; use wgpu::Instance; +use wgpu_hal::{api::Vulkan as V, Api}; use xr::EnvironmentBlendMode; use crate::graphics::extensions::XrExtensions; use crate::input::XrInput; use crate::resources::{ - Swapchain, SwapchainInner, XrEnvironmentBlendMode, XrFormat, XrFrameState, XrFrameWaiter, - XrInstance, XrResolution, XrSession, XrSessionRunning, XrSwapchain, XrViews, + OXrSessionSetupInfo, Swapchain, SwapchainInner, VulkanOXrSessionSetupInfo, + XrEnvironmentBlendMode, XrFormat, XrFrameState, XrFrameWaiter, XrInstance, XrResolution, + XrSession, XrSessionRunning, XrSwapchain, XrViews, }; use crate::VIEW_TYPE; use super::{XrAppInfo, XrPreferdBlendMode}; -pub fn initialize_xr_graphics( +pub fn initialize_xr_instance( window: Option, reqeusted_extensions: XrExtensions, prefered_blend_mode: XrPreferdBlendMode, app_info: XrAppInfo, -) -> anyhow::Result<( +) -> eyre::Result<( + XrInstance, + OXrSessionSetupInfo, + XrEnvironmentBlendMode, RenderDevice, RenderQueue, RenderAdapterInfo, RenderAdapter, Instance, - XrInstance, - XrSession, - XrEnvironmentBlendMode, - XrResolution, - XrFormat, - XrSessionRunning, - XrFrameWaiter, - XrSwapchain, - XrInput, - XrViews, - XrFrameState, )> { - use wgpu_hal::{api::Vulkan as V, Api}; - let xr_entry = super::xr_entry()?; #[cfg(target_os = "android")] @@ -108,7 +101,6 @@ pub fn initialize_xr_graphics( _ => EnvironmentBlendMode::OPAQUE, }; - #[cfg(not(target_os = "android"))] let vk_target_version = vk::make_api_version(0, 1, 2, 0); #[cfg(not(target_os = "android"))] @@ -296,22 +288,66 @@ pub fn initialize_xr_graphics( None, ) }?; + Ok(( + xr_instance.into(), + OXrSessionSetupInfo::Vulkan(VulkanOXrSessionSetupInfo { + device_ptr: vk_device_ptr, + physical_device_ptr: vk_physical_device_ptr, + vk_instance_ptr, + queue_family_index, + xr_system_id, + }), + blend_mode.into(), + wgpu_device.into(), + RenderQueue(wgpu_queue.into()), + RenderAdapterInfo(wgpu_adapter.get_info()), + RenderAdapter(wgpu_adapter.into()), + wgpu_instance.into(), + )) +} +pub fn initialize_xr_graphics( + window: Option, + ptrs: &OXrSessionSetupInfo, + xr_instance: &XrInstance, + render_device: &RenderDevice, + render_adapter: &RenderAdapter, + wgpu_instance: &Instance, +) -> eyre::Result<( + XrInstance, + XrSession, + XrResolution, + XrFormat, + XrSessionRunning, + XrFrameWaiter, + XrSwapchain, + XrInput, + XrViews, + XrFrameState, +)> { + let wgpu_device = render_device.wgpu_device(); + let wgpu_adapter = &render_adapter.0; + + #[allow(unreachable_patterns)] + let setup_info = match ptrs { + OXrSessionSetupInfo::Vulkan(v) => v, + _ => eyre::bail!("Wrong Graphics Api"), + }; let (session, frame_wait, frame_stream) = unsafe { xr_instance.create_session::( - xr_system_id, + xr_instance.system(xr::FormFactor::HEAD_MOUNTED_DISPLAY)?, &xr::vulkan::SessionCreateInfo { - instance: vk_instance_ptr, - physical_device: vk_physical_device_ptr, - device: vk_device_ptr, - queue_family_index, + instance: setup_info.vk_instance_ptr, + physical_device: setup_info.physical_device_ptr, + device: setup_info.device_ptr, + queue_family_index: setup_info.queue_family_index, queue_index: 0, }, ) }?; - let views = xr_instance.enumerate_view_configuration_views(xr_system_id, VIEW_TYPE)?; - + let views = + xr_instance.enumerate_view_configuration_views(setup_info.xr_system_id, VIEW_TYPE)?; let surface = window.map(|wrapper| unsafe { // SAFETY: Plugins should be set up on the main thread. let handle = wrapper.get_handle(); @@ -346,6 +382,7 @@ pub fn initialize_xr_graphics( mip_count: 1, }) .unwrap(); + let images = handle.enumerate_images().unwrap(); let buffers = images @@ -399,18 +436,12 @@ pub fn initialize_xr_graphics( .collect(); Ok(( - wgpu_device.into(), - RenderQueue(Arc::new(wgpu_queue)), - RenderAdapterInfo(wgpu_adapter.get_info()), - RenderAdapter(Arc::new(wgpu_adapter)), - wgpu_instance, xr_instance.clone().into(), session.clone().into_any_graphics().into(), - blend_mode.into(), resolution.into(), swapchain_format.into(), AtomicBool::new(false).into(), - Mutex::new(frame_wait).into(), + frame_wait.into(), Swapchain::Vulkan(SwapchainInner { stream: Mutex::new(frame_stream), handle: Mutex::new(handle), @@ -418,13 +449,13 @@ pub fn initialize_xr_graphics( image_index: Mutex::new(0), }) .into(), - XrInput::new(xr_instance, session.into_any_graphics())?, - Mutex::default().into(), - Mutex::new(xr::FrameState { + XrInput::new(xr_instance, &session.into_any_graphics())?, + Vec::default().into(), + xr::FrameState { predicted_display_time: xr::Time::from_nanos(1), predicted_display_period: xr::Duration::from_nanos(1), should_render: true, - }) + } .into(), )) } diff --git a/src/input.rs b/src/input.rs index 561969f..cf81c0e 100644 --- a/src/input.rs +++ b/src/input.rs @@ -16,8 +16,8 @@ pub struct XrInput { impl XrInput { pub fn new( - instance: xr::Instance, - session: xr::Session, + instance: &xr::Instance, + session: &xr::Session, // frame_state: &FrameState, ) -> xr::Result { // let right_hand_subaction_path = instance.string_to_path("/user/hand/right").unwrap(); diff --git a/src/lib.rs b/src/lib.rs index 9a77e87..6f9a591 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -26,7 +26,7 @@ use input::XrInput; use openxr as xr; // use passthrough::{start_passthrough, supports_passthrough, XrPassthroughLayer}; use resources::*; -use xr::FormFactor; +use xr::{FormFactor, FrameWaiter}; use xr_init::{xr_only, XrEnableStatus, XrRenderData}; use xr_input::controllers::XrControllerType; use xr_input::hands::emulated::HandEmulationPlugin; @@ -57,7 +57,7 @@ pub struct FutureXrResources( XrResolution, XrFormat, XrSessionRunning, - XrFrameWaiter, + // XrFrameWaiter, XrSwapchain, XrInput, XrViews, @@ -110,7 +110,7 @@ impl Plugin for OpenXrPlugin { 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(frame_waiter); app.insert_resource(swapchain.clone()); app.insert_resource(input.clone()); app.insert_resource(views.clone()); @@ -122,7 +122,6 @@ impl Plugin for OpenXrPlugin { 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, @@ -221,7 +220,7 @@ impl Plugin for OpenXrPlugin { render_app.insert_resource(data.xr_resolution.clone()); render_app.insert_resource(data.xr_format.clone()); render_app.insert_resource(data.xr_session_running.clone()); - render_app.insert_resource(data.xr_frame_waiter.clone()); + // render_app.insert_resource(data.xr_frame_waiter.clone()); render_app.insert_resource(data.xr_swapchain.clone()); render_app.insert_resource(data.xr_input.clone()); render_app.insert_resource(data.xr_views.clone()); @@ -286,10 +285,10 @@ pub fn xr_begin_frame( instance: Res, session: Res, session_running: Res, - frame_state: Res, - frame_waiter: Res, + mut frame_state: ResMut, + mut frame_waiter: ResMut, swapchain: Res, - views: Res, + mut views: ResMut, input: Res, mut app_exit: EventWriter, ) { @@ -303,6 +302,7 @@ pub fn xr_begin_frame( // find quit messages! info!("entered XR state {:?}", e.state()); match e.state() { + // xr_frame_waiter: frame_waiter, xr::SessionState::READY => { session.begin(VIEW_TYPE).unwrap(); session_running.store(true, std::sync::atomic::Ordering::Relaxed); @@ -316,6 +316,7 @@ pub fn xr_begin_frame( app_exit.send(AppExit); return; } + _ => {} } } @@ -329,8 +330,8 @@ pub fn xr_begin_frame( } { let _span = info_span!("xr_wait_frame").entered(); - *frame_state.lock().unwrap() = match frame_waiter.lock().unwrap().wait() { - Ok(a) => a, + *frame_state = match frame_waiter.wait() { + Ok(a) => a.into(), Err(e) => { warn!("error: {}", e); return; @@ -343,12 +344,8 @@ pub fn xr_begin_frame( } { let _span = info_span!("xr_locate_views").entered(); - *views.lock().unwrap() = session - .locate_views( - VIEW_TYPE, - frame_state.lock().unwrap().predicted_display_time, - &input.stage, - ) + **views = session + .locate_views(VIEW_TYPE, frame_state.predicted_display_time, &input.stage) .unwrap() .1; } @@ -402,8 +399,8 @@ pub fn end_frame( { let _span = info_span!("xr_end_frame").entered(); let result = swapchain.end( - xr_frame_state.lock().unwrap().predicted_display_time, - &views.lock().unwrap(), + xr_frame_state.predicted_display_time, + &views, &input.stage, **resolution, **environment_blend_mode, @@ -417,15 +414,15 @@ pub fn end_frame( } pub fn locate_views( - views: Res, + mut views: ResMut, input: Res, session: Res, xr_frame_state: Res, ) { let _span = info_span!("xr_locate_views").entered(); - *views.lock().unwrap() = match session.locate_views( + **views = match session.locate_views( VIEW_TYPE, - xr_frame_state.lock().unwrap().predicted_display_time, + xr_frame_state.predicted_display_time, &input.stage, ) { Ok(this) => this, diff --git a/src/resource_macros.rs b/src/resource_macros.rs index 5f4df4e..933ce20 100644 --- a/src/resource_macros.rs +++ b/src/resource_macros.rs @@ -1,7 +1,7 @@ #[macro_export] macro_rules! xr_resource_wrapper { ($wrapper_type:ident, $xr_type:ty) => { - #[derive(Clone, bevy::prelude::Resource)] + #[derive(Clone, bevy::prelude::Resource, bevy::prelude::Deref, bevy::prelude::DerefMut)] pub struct $wrapper_type($xr_type); impl $wrapper_type { @@ -10,13 +10,13 @@ macro_rules! xr_resource_wrapper { } } - impl std::ops::Deref for $wrapper_type { - type Target = $xr_type; - - fn deref(&self) -> &Self::Target { - &self.0 - } - } + // impl std::ops::Deref for $wrapper_type { + // type Target = $xr_type; + // + // fn deref(&self) -> &Self::Target { + // &self.0 + // } + // } impl From<$xr_type> for $wrapper_type { fn from(value: $xr_type) -> Self { @@ -29,7 +29,7 @@ macro_rules! xr_resource_wrapper { #[macro_export] macro_rules! xr_arc_resource_wrapper { ($wrapper_type:ident, $xr_type:ty) => { - #[derive(Clone, bevy::prelude::Resource)] + #[derive(Clone, bevy::prelude::Resource, bevy::prelude::Deref, bevy::prelude::DerefMut)] pub struct $wrapper_type(std::sync::Arc<$xr_type>); impl $wrapper_type { @@ -38,13 +38,41 @@ macro_rules! xr_arc_resource_wrapper { } } - impl std::ops::Deref for $wrapper_type { - type Target = $xr_type; + // impl std::ops::Deref for $wrapper_type { + // type Target = $xr_type; + // + // fn deref(&self) -> &Self::Target { + // self.0.as_ref() + // } + // } - fn deref(&self) -> &Self::Target { - self.0.as_ref() + impl From<$xr_type> for $wrapper_type { + fn from(value: $xr_type) -> Self { + Self::new(value) } } + }; +} + +#[macro_export] +macro_rules! xr_no_clone_resource_wrapper { + ($wrapper_type:ident, $xr_type:ty) => { + #[derive(bevy::prelude::Resource, bevy::prelude::Deref, bevy::prelude::DerefMut)] + pub struct $wrapper_type($xr_type); + + impl $wrapper_type { + pub fn new(value: $xr_type) -> Self { + Self(value) + } + } + + // impl std::ops::Deref for $wrapper_type { + // type Target = $xr_type; + // + // fn deref(&self) -> &Self::Target { + // &self.0 + // } + // } impl From<$xr_type> for $wrapper_type { fn from(value: $xr_type) -> Self { @@ -55,4 +83,5 @@ macro_rules! xr_arc_resource_wrapper { } pub use xr_arc_resource_wrapper; +pub use xr_no_clone_resource_wrapper; pub use xr_resource_wrapper; diff --git a/src/resources.rs b/src/resources.rs index a798955..62f2855 100644 --- a/src/resources.rs +++ b/src/resources.rs @@ -1,3 +1,4 @@ +use std::ffi::c_void; use std::sync::atomic::AtomicBool; use std::sync::Mutex; @@ -5,17 +6,31 @@ use std::sync::Mutex; use crate::resource_macros::*; use bevy::prelude::*; use openxr as xr; +use xr::ViewConfigurationView; xr_resource_wrapper!(XrInstance, xr::Instance); xr_resource_wrapper!(XrSession, xr::Session); xr_resource_wrapper!(XrEnvironmentBlendMode, xr::EnvironmentBlendMode); xr_resource_wrapper!(XrResolution, UVec2); xr_resource_wrapper!(XrFormat, wgpu::TextureFormat); +xr_resource_wrapper!(XrFrameState, xr::FrameState); +xr_resource_wrapper!(XrViews, Vec); xr_arc_resource_wrapper!(XrSessionRunning, AtomicBool); -xr_arc_resource_wrapper!(XrFrameWaiter, Mutex); xr_arc_resource_wrapper!(XrSwapchain, Swapchain); -xr_arc_resource_wrapper!(XrFrameState, Mutex); -xr_arc_resource_wrapper!(XrViews, Mutex>); +xr_no_clone_resource_wrapper!(XrFrameWaiter, xr::FrameWaiter); + +pub(crate) struct VulkanOXrSessionSetupInfo { + pub(crate) device_ptr: *const c_void, + pub(crate) physical_device_ptr: *const c_void, + pub(crate) vk_instance_ptr: *const c_void, + pub(crate) queue_family_index: u32, + pub(crate) xr_system_id: xr::SystemId, + // pub(crate) swapchain_create_info: xr::SwapchainCreateInfo +} + +pub(crate) enum OXrSessionSetupInfo { + Vulkan(VulkanOXrSessionSetupInfo), +} pub enum Swapchain { Vulkan(SwapchainInner), diff --git a/src/xr_init.rs b/src/xr_init.rs index 499e7ce..f60b0ba 100644 --- a/src/xr_init.rs +++ b/src/xr_init.rs @@ -11,16 +11,16 @@ use bevy::{ renderer::{self, RenderAdapter, RenderAdapterInfo, RenderDevice, RenderQueue}, settings::WgpuSettings, }, - window::RawHandleWrapper, + window::{RawHandleWrapper, PrimaryWindow}, }; use wgpu::Instance; use crate::{ input::XrInput, resources::{ - XrEnvironmentBlendMode, XrFormat, XrFrameState, XrFrameWaiter, XrInstance, XrResolution, - XrSession, XrSessionRunning, XrSwapchain, XrViews, - }, + XrEnvironmentBlendMode, XrFormat, XrFrameState, XrInstance, XrResolution, XrSession, + XrSessionRunning, XrSwapchain, XrViews, + }, graphics, }; #[derive(Resource, Clone)] @@ -40,7 +40,7 @@ pub struct XrRenderData { pub xr_resolution: XrResolution, pub xr_format: XrFormat, pub xr_session_running: XrSessionRunning, - pub xr_frame_waiter: XrFrameWaiter, + // pub xr_frame_waiter: XrFrameWaiter, pub xr_swapchain: XrSwapchain, pub xr_input: XrInput, pub xr_views: XrViews, @@ -174,6 +174,14 @@ pub fn update_xr_stuff(world: &mut World) { world.run_schedule(XrPostRenderUpdate); } +fn setup_xr_graphics() { + +} + +fn enable_xr( + +) {} + // fn handle_xr_enable_requests( // primary_window: Query<&RawHandleWrapper, With>, // mut commands: Commands, @@ -183,7 +191,6 @@ pub fn update_xr_stuff(world: &mut World) { // // Just to force this system onto the main thread because of unsafe code // let _ = on_main; // -// commands.insert_resource(XrEnableStatus::Waiting); // let (creation_data, xr_data) = match next_state.into_inner() { // XrNextEnabledState::Enabled => { // let ( diff --git a/src/xr_input/actions.rs b/src/xr_input/actions.rs index 9e71511..748968d 100644 --- a/src/xr_input/actions.rs +++ b/src/xr_input/actions.rs @@ -206,7 +206,7 @@ impl SetupActionSet { for binding in bindings { self.actions .get_mut(binding.action) - .ok_or(anyhow::anyhow!("Missing Action: {}", binding.action)) + .ok_or(eyre::eyre!("Missing Action: {}", binding.action)) .unwrap() .bindings .entry(device_path) diff --git a/src/xr_input/debug_gizmos.rs b/src/xr_input/debug_gizmos.rs index c67d900..ff93ef8 100644 --- a/src/xr_input/debug_gizmos.rs +++ b/src/xr_input/debug_gizmos.rs @@ -91,7 +91,7 @@ pub fn draw_gizmos( // } // } //lock frame - let frame_state = *frame_state.lock().unwrap(); + // let frame_state = *frame_state.lock().unwrap(); //get controller let controller = oculus_controller.get_ref(&session, &frame_state, &xr_input, &action_sets); let root = tracking_root_query.get_single(); diff --git a/src/xr_input/hands/hand_tracking.rs b/src/xr_input/hands/hand_tracking.rs index 1af55df..fd8c920 100644 --- a/src/xr_input/hands/hand_tracking.rs +++ b/src/xr_input/hands/hand_tracking.rs @@ -87,7 +87,7 @@ impl<'a> HandTrackingRef<'a> { Hand::Left => &self.tracking.left_hand, Hand::Right => &self.tracking.right_hand, }, - self.frame_state.lock().unwrap().predicted_display_time, + self.frame_state.predicted_display_time, ) .unwrap() .map(|joints| { diff --git a/src/xr_input/oculus_touch.rs b/src/xr_input/oculus_touch.rs index 6f405f8..27111c4 100644 --- a/src/xr_input/oculus_touch.rs +++ b/src/xr_input/oculus_touch.rs @@ -371,7 +371,7 @@ pub struct OculusController { pub aim_space: Option>, } impl OculusController { - pub fn new(mut action_sets: ResMut) -> anyhow::Result { + pub fn new(mut action_sets: ResMut) -> eyre::Result { let action_set = action_sets.add_action_set("oculus_input", "Oculus Touch Controller Input".into(), 0); action_set.new_action( diff --git a/src/xr_input/prototype_locomotion.rs b/src/xr_input/prototype_locomotion.rs index 52bf355..791ee04 100644 --- a/src/xr_input/prototype_locomotion.rs +++ b/src/xr_input/prototype_locomotion.rs @@ -70,17 +70,13 @@ pub fn proto_locomotion( config_option: Option>, action_sets: Res, ) { - match config_option { - Some(_) => (), + let mut config = match config_option { + Some(c) => c, None => { info!("no locomotion config"); return; } - } - //i hate this but im too tired to think - let mut config = config_option.unwrap(); - //lock frame - let frame_state = *frame_state.lock().unwrap(); + }; //get controller let controller = oculus_controller.get_ref(&session, &frame_state, &xr_input, &action_sets); let root = tracking_root_query.get_single_mut(); @@ -92,8 +88,7 @@ pub fn proto_locomotion( let reference_quat; match config.locomotion_type { LocomotionType::Head => { - let v = views.lock().unwrap(); - let views = v.get(0); + let views = views.first(); match views { Some(view) => { reference_quat = view.pose.orientation.to_quat(); @@ -127,8 +122,7 @@ pub fn proto_locomotion( rot_input * config.smooth_rotation_speed * time.delta_seconds(), ); //apply rotation - let v = views.lock().unwrap(); - let views = v.get(0); + let views = views.first(); match views { Some(view) => { let mut hmd_translation = view.pose.position.to_vec3(); @@ -159,8 +153,8 @@ pub fn proto_locomotion( let smoth_rot = Quat::from_axis_angle(position.0.up(), config.snap_angle * dir); //apply rotation - let v = views.lock().unwrap(); - let views = v.get(0); + let v = views; + let views = v.first(); match views { Some(view) => { let mut hmd_translation = view.pose.position.to_vec3(); diff --git a/src/xr_input/trackers.rs b/src/xr_input/trackers.rs index a57e8a8..eea28c1 100644 --- a/src/xr_input/trackers.rs +++ b/src/xr_input/trackers.rs @@ -66,8 +66,6 @@ pub fn update_open_xr_controllers( session: Res, action_sets: Res, ) { - //lock dat frame? - let frame_state = *frame_state.lock().unwrap(); //get controller let controller = oculus_controller.get_ref(&session, &frame_state, &xr_input, &action_sets); //get left controller diff --git a/src/xr_input/xr_camera.rs b/src/xr_input/xr_camera.rs index 64528f8..210feaa 100644 --- a/src/xr_input/xr_camera.rs +++ b/src/xr_input/xr_camera.rs @@ -241,22 +241,24 @@ impl CameraProjection for XRProjection { pub fn xr_camera_head_sync( views: ResMut, - mut query: Query<(&mut Transform, &XrCameraType, &mut XRProjection)>, + query: Query<(&mut Transform, &XrCameraType, &mut XRProjection)>, ) { - let mut f = || -> Option<()> { + fn f( + views: ResMut, + mut query: Query<(&mut Transform, &XrCameraType, &mut XRProjection)>, + ) -> Option<()> { //TODO calculate HMD position for (mut transform, camera_type, mut xr_projection) in query.iter_mut() { let view_idx = match camera_type { XrCameraType::Xr(eye) => *eye as usize, XrCameraType::Flatscreen => return None, }; - let v = views.lock().unwrap(); - let view = v.get(view_idx)?; + let view = views.get(view_idx)?; xr_projection.fov = view.fov; transform.rotation = view.pose.orientation.to_quat(); transform.translation = view.pose.position.to_vec3(); } Some(()) - }; - let _ = f(); + } + let _ = f(views, query); }