diff --git a/examples/xr.rs b/examples/xr.rs index 1514de8..344b8b2 100644 --- a/examples/xr.rs +++ b/examples/xr.rs @@ -11,8 +11,8 @@ use bevy_openxr::xr_input::debug_gizmos::OpenXrDebugRenderer; use bevy_openxr::xr_input::oculus_touch::OculusController; use bevy_openxr::xr_input::prototype_locomotion::{proto_locomotion, PrototypeLocomotionConfig}; use bevy_openxr::xr_input::trackers::{ - OpenXRController, OpenXRLeftController, OpenXRRightController, OpenXRTracker, - OpenXRTrackingRoot, adopt_open_xr_trackers, + adopt_open_xr_trackers, OpenXRController, OpenXRLeftController, OpenXRRightController, + OpenXRTracker, OpenXRTrackingRoot, }; use bevy_openxr::xr_input::{Hand, QuatConv, Vec3Conv}; use bevy_openxr::DefaultXrPlugins; @@ -29,8 +29,6 @@ fn main() { .add_systems(Startup, setup) .add_systems(Update, proto_locomotion) .add_systems(Startup, spawn_controllers_example) - .add_systems(Update, update_open_xr_controllers) - .add_systems(Update, adopt_open_xr_trackers) .insert_resource(PrototypeLocomotionConfig::default()) .run(); } @@ -85,12 +83,6 @@ fn spawn_controllers_example(mut commands: Commands) { OpenXRController, OpenXRTracker, SpatialBundle::default(), - // PbrBundle { - // mesh: meshes.add(Mesh::from(shape::Cube { size: 0.1 })), - // material: materials.add(Color::RED.into()), - // transform: Transform::from_xyz(0.0, 0.5, 1.0), - // ..default() - // }, )); //right hand commands.spawn(( @@ -98,59 +90,5 @@ fn spawn_controllers_example(mut commands: Commands) { OpenXRController, OpenXRTracker, SpatialBundle::default(), - // PbrBundle { - // mesh: meshes.add(Mesh::from(shape::Cube { size: 0.1 })), - // material: materials.add(Color::BLUE.into()), - // transform: Transform::from_xyz(0.0, 0.5, 1.0), - // ..default() - // }, )); } - -fn update_open_xr_controllers( - oculus_controller: Res, - mut left_controller_query: Query<( - &mut Transform, - With, - Without, - )>, - mut right_controller_query: Query<( - &mut Transform, - With, - Without, - )>, - frame_state: Res, - instance: Res, - xr_input: Res, - session: Res, -) { - //lock dat frame? - let frame_state = *frame_state.lock().unwrap(); - //get controller - let controller = oculus_controller.get_ref(&instance, &session, &frame_state, &xr_input); - //get left controller - let left = controller.grip_space(Hand::Left); - let left_postion = left.0.pose.position.to_vec3(); - - left_controller_query - .get_single_mut() - .unwrap() - .0 - .translation = left_postion; - - left_controller_query.get_single_mut().unwrap().0.rotation = left.0.pose.orientation.to_quat(); - //get right controller - let right = controller.grip_space(Hand::Right); - let right_postion = right.0.pose.position.to_vec3(); - - right_controller_query - .get_single_mut() - .unwrap() - .0 - .translation = right_postion; - - right_controller_query.get_single_mut().unwrap().0.rotation = - right.0.pose.orientation.to_quat(); -} - - diff --git a/src/xr_input/mod.rs b/src/xr_input/mod.rs index e853ab3..05a0463 100644 --- a/src/xr_input/mod.rs +++ b/src/xr_input/mod.rs @@ -1,8 +1,8 @@ pub mod controllers; pub mod debug_gizmos; pub mod oculus_touch; -pub mod trackers; pub mod prototype_locomotion; +pub mod trackers; pub mod xr_camera; use crate::resources::XrSession; @@ -13,14 +13,17 @@ use crate::xr_input::xr_camera::{xr_camera_head_sync, Eye, XRProjection, XrCamer use bevy::app::{App, PostUpdate, Startup}; use bevy::log::warn; use bevy::prelude::{ - default, Commands, Component, Plugin, PreUpdate, Quat, Res, SpatialBundle, Vec3, + default, Commands, Component, Plugin, PreUpdate, Quat, Res, SpatialBundle, Update, Vec3, }; use bevy::prelude::{BuildChildren, IntoSystemConfigs}; use bevy::render::camera::CameraProjectionPlugin; use bevy::render::view::{update_frusta, VisibilitySystems}; use bevy::transform::{TransformBundle, TransformSystem}; -use self::trackers::{OpenXRLeftEye, OpenXRRightEye, OpenXRTrackingRoot}; +use self::trackers::{ + adopt_open_xr_trackers, update_open_xr_controllers, OpenXRLeftEye, OpenXRRightEye, + OpenXRTrackingRoot, +}; #[derive(Copy, Clone)] pub struct OpenXrInput { @@ -46,8 +49,12 @@ impl Plugin for OpenXrInput { app.add_systems(Startup, setup_oculus_controller); } } + //adopt any new trackers + app.add_systems(PreUpdate, adopt_open_xr_trackers); app.add_systems(PreUpdate, action_set_system); app.add_systems(PreUpdate, xr_camera_head_sync.after(xr_begin_frame)); + //update controller trackers + app.add_systems(Update, update_open_xr_controllers); app.add_systems( PostUpdate, update_frusta:: diff --git a/src/xr_input/trackers.rs b/src/xr_input/trackers.rs index 6d44248..5da4541 100644 --- a/src/xr_input/trackers.rs +++ b/src/xr_input/trackers.rs @@ -1,4 +1,8 @@ -use bevy::prelude::{info, Added, BuildChildren, Commands, Component, Entity, Query, With}; +use bevy::prelude::{info, Added, BuildChildren, Commands, Component, Entity, Query, With, Res, Transform, Without}; + +use crate::{resources::{XrFrameState, XrInstance, XrSession}, input::XrInput}; + +use super::{oculus_touch::OculusController, Hand, Vec3Conv, QuatConv}; #[derive(Component)] pub struct OpenXRTrackingRoot; @@ -34,3 +38,50 @@ pub fn adopt_open_xr_trackers( Err(_) => info!("root isnt spawned yet?"), } } + +pub fn update_open_xr_controllers( + oculus_controller: Res, + mut left_controller_query: Query<( + &mut Transform, + With, + Without, + )>, + mut right_controller_query: Query<( + &mut Transform, + With, + Without, + )>, + frame_state: Res, + instance: Res, + xr_input: Res, + session: Res, +) { + //lock dat frame? + let frame_state = *frame_state.lock().unwrap(); + //get controller + let controller = oculus_controller.get_ref(&instance, &session, &frame_state, &xr_input); + //get left controller + let left = controller.grip_space(Hand::Left); + let left_postion = left.0.pose.position.to_vec3(); + + left_controller_query + .get_single_mut() + .unwrap() + .0 + .translation = left_postion; + + left_controller_query.get_single_mut().unwrap().0.rotation = left.0.pose.orientation.to_quat(); + //get right controller + let right = controller.grip_space(Hand::Right); + let right_postion = right.0.pose.position.to_vec3(); + + right_controller_query + .get_single_mut() + .unwrap() + .0 + .translation = right_postion; + + right_controller_query.get_single_mut().unwrap().0.rotation = + right.0.pose.orientation.to_quat(); +} +