This commit is contained in:
Jay Christy
2023-11-12 00:51:41 -05:00
parent 76715755f0
commit 0f838074b1

View File

@@ -11,7 +11,7 @@ use bevy::{
Schedule, SpatialBundle, StandardMaterial, Startup, Transform, Update, Vec3, Vec3Swizzles, Schedule, SpatialBundle, StandardMaterial, Startup, Transform, Update, Vec3, Vec3Swizzles,
With, Without, World, With, Without, World,
}, },
time::{Fixed, Time, Timer}, time::{Fixed, Time, Timer, TimerMode},
transform::TransformSystem, transform::TransformSystem,
}; };
use bevy_oxr::{ use bevy_oxr::{
@@ -54,7 +54,7 @@ pub fn main() {
.add_plugins(OpenXrDebugRenderer) .add_plugins(OpenXrDebugRenderer)
//rapier goes here //rapier goes here
.add_plugins(RapierPhysicsPlugin::<NoUserData>::default().with_default_system_setup(false)) .add_plugins(RapierPhysicsPlugin::<NoUserData>::default().with_default_system_setup(false))
// .add_plugins(RapierDebugRenderPlugin::default()) .add_plugins(RapierDebugRenderPlugin::default())
//lets setup the starting scene //lets setup the starting scene
.add_systems(Startup, setup_scene) .add_systems(Startup, setup_scene)
.add_systems(Startup, spawn_controllers_example) //you need to spawn controllers or it crashes TODO:: Fix this .add_systems(Startup, spawn_controllers_example) //you need to spawn controllers or it crashes TODO:: Fix this
@@ -95,7 +95,14 @@ pub fn main() {
.add_systems( .add_systems(
FixedUpdate, FixedUpdate,
update_physics_hands.before(PhysicsSet::SyncBackend), update_physics_hands.before(PhysicsSet::SyncBackend),
); )
.add_event::<GhostHandEvent>()
.add_systems(Update, handle_ghost_hand_events.after(update_grabbables))
.insert_resource(GhostTimers {
left: Timer::from_seconds(0.25, TimerMode::Once),
right: Timer::from_seconds(0.25, TimerMode::Once),
})
.add_systems(Update, watch_ghost_timers.before(handle_ghost_hand_events));
//configure rapier sets //configure rapier sets
let mut physics_schedule = Schedule::new(PhysicsSchedule); let mut physics_schedule = Schedule::new(PhysicsSchedule);
@@ -166,6 +173,7 @@ fn spawn_controllers_example(mut commands: Commands) {
XRDirectInteractor, XRDirectInteractor,
XRInteractorState::default(), XRInteractorState::default(),
XRSelection::default(), XRSelection::default(),
Hand::Left,
)); ));
//right hand //right hand
commands.spawn(( commands.spawn((
@@ -176,6 +184,7 @@ fn spawn_controllers_example(mut commands: Commands) {
XRDirectInteractor, XRDirectInteractor,
XRInteractorState::default(), XRInteractorState::default(),
XRSelection::default(), XRSelection::default(),
Hand::Right,
)); ));
} }
@@ -609,6 +618,65 @@ fn prototype_interaction_input(
} }
} }
//this terribly named event is for transitioning the physics hand in an out of existent so we can drop things better
#[derive(Event)]
pub struct GhostHandEvent {
pub hand: Hand,
pub desired_state: bool,
}
#[derive(Resource)]
pub struct GhostTimers {
pub left: Timer,
pub right: Timer,
}
pub fn handle_ghost_hand_events(
mut events: EventReader<GhostHandEvent>,
mut bones: Query<(&Hand, &mut CollisionGroups, With<PhysicsHandBone>)>,
) {
for event in events.read() {
info!(
"Ghost hand Event: {:?}, {:?}",
event.hand, event.desired_state
);
//do work
for mut bone in bones.iter_mut() {
match *bone.0 == event.hand {
true => match event.desired_state {
true => bone.1.filters = Group::NONE,
false => bone.1.filters = Group::from_bits(0b0001).unwrap(),
},
false => (),
}
}
}
}
pub fn watch_ghost_timers(
mut timers: ResMut<GhostTimers>,
mut writer: EventWriter<GhostHandEvent>,
time: Res<Time>,
) {
timers.left.tick(time.delta());
timers.right.tick(time.delta());
if timers.left.just_finished() {
info!("hey");
writer.send(GhostHandEvent {
hand: Hand::Left,
desired_state: false,
});
}
if timers.right.just_finished() {
info!("hey");
writer.send(GhostHandEvent {
hand: Hand::Right,
desired_state: false,
});
}
}
#[derive(Component)] #[derive(Component)]
pub struct Grabbable; pub struct Grabbable;
@@ -625,8 +693,11 @@ pub fn update_grabbables(
&GlobalTransform, &GlobalTransform,
&XRInteractorState, &XRInteractorState,
&mut XRSelection, &mut XRSelection,
&Hand,
Without<Grabbable>, Without<Grabbable>,
)>, )>,
mut writer: EventWriter<GhostHandEvent>,
mut timers: ResMut<GhostTimers>,
) { ) {
//so basically the idea is to try all the events? //so basically the idea is to try all the events?
for event in events.read() { for event in events.read() {
@@ -654,6 +725,11 @@ pub fn update_grabbables(
*thing = RigidBody::KinematicPositionBased; *thing = RigidBody::KinematicPositionBased;
*interactor_transform.2 = *interactor_transform.2 =
XRSelection::Full(grabbable_transform.0); XRSelection::Full(grabbable_transform.0);
//raise enter ghost hand event
writer.send(GhostHandEvent {
hand: *interactor_transform.3,
desired_state: true,
});
} }
None => (), None => (),
} }
@@ -673,7 +749,12 @@ pub fn update_grabbables(
} }
match interactor_transform.1 { match interactor_transform.1 {
XRInteractorState::Idle => { XRInteractorState::Idle => {
*interactor_transform.2 = XRSelection::Empty *interactor_transform.2 = XRSelection::Empty;
//raise leave ghost hand event
match *interactor_transform.3 {
Hand::Left => timers.left.reset(),
Hand::Right => timers.right.reset(),
}
} }
XRInteractorState::Selecting => {} XRInteractorState::Selecting => {}
} }