git
This commit is contained in:
@@ -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::{
|
||||
@@ -54,7 +54,7 @@ pub fn main() {
|
||||
.add_plugins(OpenXrDebugRenderer)
|
||||
//rapier goes here
|
||||
.add_plugins(RapierPhysicsPlugin::<NoUserData>::default().with_default_system_setup(false))
|
||||
// .add_plugins(RapierDebugRenderPlugin::default())
|
||||
.add_plugins(RapierDebugRenderPlugin::default())
|
||||
//lets setup the starting scene
|
||||
.add_systems(Startup, setup_scene)
|
||||
.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(
|
||||
FixedUpdate,
|
||||
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
|
||||
let mut physics_schedule = Schedule::new(PhysicsSchedule);
|
||||
@@ -166,6 +173,7 @@ fn spawn_controllers_example(mut commands: Commands) {
|
||||
XRDirectInteractor,
|
||||
XRInteractorState::default(),
|
||||
XRSelection::default(),
|
||||
Hand::Left,
|
||||
));
|
||||
//right hand
|
||||
commands.spawn((
|
||||
@@ -176,6 +184,7 @@ fn spawn_controllers_example(mut commands: Commands) {
|
||||
XRDirectInteractor,
|
||||
XRInteractorState::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)]
|
||||
pub struct Grabbable;
|
||||
|
||||
@@ -625,8 +693,11 @@ pub fn update_grabbables(
|
||||
&GlobalTransform,
|
||||
&XRInteractorState,
|
||||
&mut XRSelection,
|
||||
&Hand,
|
||||
Without<Grabbable>,
|
||||
)>,
|
||||
mut writer: EventWriter<GhostHandEvent>,
|
||||
mut timers: ResMut<GhostTimers>,
|
||||
) {
|
||||
//so basically the idea is to try all the events?
|
||||
for event in events.read() {
|
||||
@@ -654,6 +725,11 @@ pub fn update_grabbables(
|
||||
*thing = RigidBody::KinematicPositionBased;
|
||||
*interactor_transform.2 =
|
||||
XRSelection::Full(grabbable_transform.0);
|
||||
//raise enter ghost hand event
|
||||
writer.send(GhostHandEvent {
|
||||
hand: *interactor_transform.3,
|
||||
desired_state: true,
|
||||
});
|
||||
}
|
||||
None => (),
|
||||
}
|
||||
@@ -673,7 +749,12 @@ pub fn update_grabbables(
|
||||
}
|
||||
match interactor_transform.1 {
|
||||
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 => {}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user