diff --git a/examples/xr.rs b/examples/xr.rs index d6bbb41..8b52c8d 100644 --- a/examples/xr.rs +++ b/examples/xr.rs @@ -9,7 +9,11 @@ use bevy_openxr::input::XrInput; use bevy_openxr::resources::{XrFrameState, XrInstance, XrSession, XrViews}; use bevy_openxr::xr_input::debug_gizmos::OpenXrDebugRenderer; use bevy_openxr::xr_input::oculus_touch::OculusController; -use bevy_openxr::xr_input::{Hand, QuatConv, TrackingRoot, Vec3Conv}; +use bevy_openxr::xr_input::trackers::{ + OpenXRController, OpenXRLeftController, OpenXRRightController, OpenXRTracker, + OpenXRTrackingRoot, +}; +use bevy_openxr::xr_input::{Hand, QuatConv, Vec3Conv}; use bevy_openxr::DefaultXrPlugins; fn main() { @@ -23,6 +27,9 @@ fn main() { .add_plugins(FrameTimeDiagnosticsPlugin) .add_systems(Startup, setup) .add_systems(Update, proto_locomotion) + .add_systems(Startup, spawn_controllers) + .add_systems(Update, update_hands) + .add_systems(Update, adopt_open_xr_trackers) .run(); } @@ -88,9 +95,106 @@ struct RotationTimer { timer: Timer, } +fn spawn_controllers( + mut commands: Commands, + mut meshes: ResMut>, + mut materials: ResMut>, +) { + //left hand + commands.spawn(( + OpenXRLeftController, + 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(( + OpenXRRightController, + 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_hands( + 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(); +} + +fn adopt_open_xr_trackers( + query: Query<(Entity), Added>, + mut commands: Commands, + tracking_root_query: Query<(Entity, With)>, +) { + let root = tracking_root_query.get_single(); + match root { + Ok(thing) => { + // info!("root is"); + for tracker in query.iter() { + info!("we got a new tracker"); + commands.entity(thing.0).add_child(tracker); + } + } + Err(_) => info!("root isnt spawned yet?"), + } +} + fn proto_locomotion( time: Res