diff --git a/examples/demo/src/lib.rs b/examples/demo/src/lib.rs index 484b666..8be09a4 100644 --- a/examples/demo/src/lib.rs +++ b/examples/demo/src/lib.rs @@ -11,7 +11,7 @@ use bevy::{ Schedule, SpatialBundle, StandardMaterial, Startup, Transform, Update, Vec3, Vec3Swizzles, With, Without, World, }, - time::{Fixed, Time, Timer}, + time::{Fixed, Time, Timer, TimerMode}, transform::TransformSystem, }; use bevy_oxr::{ @@ -96,7 +96,14 @@ pub fn main() { .add_systems( FixedUpdate, update_physics_hands.before(PhysicsSet::SyncBackend), - ); + ) + .add_event::() + .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 let mut physics_schedule = Schedule::new(PhysicsSchedule); @@ -167,6 +174,7 @@ fn spawn_controllers_example(mut commands: Commands) { XRDirectInteractor, XRInteractorState::default(), XRSelection::default(), + Hand::Left, )); //right hand commands.spawn(( @@ -177,6 +185,7 @@ fn spawn_controllers_example(mut commands: Commands) { XRDirectInteractor, XRInteractorState::default(), XRSelection::default(), + Hand::Right, )); } @@ -611,6 +620,63 @@ fn prototype_interaction_input( } } +//this 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, //true for no interactions, false for normal interactions +} +#[derive(Resource)] +pub struct GhostTimers { + pub left: Timer, + pub right: Timer, +} + +pub fn handle_ghost_hand_events( + mut events: EventReader, + mut bones: Query<(&Hand, &mut CollisionGroups, With)>, +) { + 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, + mut writer: EventWriter, + time: Res