From d80506c43c0a1957ee3cd3dbc410149d52db86b9 Mon Sep 17 00:00:00 2001 From: Jay Christy Date: Sun, 1 Oct 2023 00:22:42 -0400 Subject: [PATCH] this is a little better --- examples/xr.rs | 56 ++++++++++++++++------------- src/xr_input/interactions.rs | 69 +++++++++++++++++++++++++----------- 2 files changed, 79 insertions(+), 46 deletions(-) diff --git a/examples/xr.rs b/examples/xr.rs index 35b0800..fd8f2ea 100644 --- a/examples/xr.rs +++ b/examples/xr.rs @@ -5,9 +5,9 @@ use bevy_openxr::input::XrInput; use bevy_openxr::resources::{XrFrameState, XrInstance, XrSession}; use bevy_openxr::xr_input::debug_gizmos::OpenXrDebugRenderer; use bevy_openxr::xr_input::interactions::{ - draw_interaction_gizmos, draw_socket_gizmos, interactions, update_interactable_states, - InteractionEvent, XRDirectInteractor, XRInteractable, XRInteractableState, XRInteractorState, - XRRayInteractor, XRSocketInteractor, socket_interactions, + draw_interaction_gizmos, draw_socket_gizmos, interactions, socket_interactions, + update_interactable_states, InteractionEvent, XRDirectInteractor, XRInteractable, + XRInteractableState, XRInteractorState, XRRayInteractor, XRSocketInteractor, }; use bevy_openxr::xr_input::oculus_touch::OculusController; use bevy_openxr::xr_input::prototype_locomotion::{proto_locomotion, PrototypeLocomotionConfig}; @@ -35,10 +35,13 @@ fn main() { draw_interaction_gizmos.after(update_interactable_states), ) .add_systems(Update, draw_socket_gizmos.after(update_interactable_states)) - .add_systems(Update, interactions) - .add_systems(Update, socket_interactions) + .add_systems(Update, interactions.before(update_interactable_states)) + .add_systems( + Update, + socket_interactions.before(update_interactable_states), + ) .add_systems(Update, prototype_interaction_input) - .add_systems(Update, update_interactable_states.after(interactions)) + .add_systems(Update, update_interactable_states) .add_systems(Update, update_grabbables.after(update_interactable_states)) .add_event::() .run(); @@ -173,37 +176,40 @@ pub struct Grabbable; pub fn update_grabbables( mut events: EventReader, mut grabbable_query: Query<(&mut Transform, With, Without)>, - interactor_query: Query<( - &GlobalTransform, - With, - Without, - )>, + interactor_query: Query<(&GlobalTransform, &XRInteractorState, Without)>, ) { //so basically the idea is to try all the events? for event in events.read() { - info!("some event"); + // info!("some event"); match grabbable_query.get_mut(event.interactable) { Ok(mut grabbable_transform) => { - info!("we got a grabbable"); + // info!("we got a grabbable"); //now we need the location of our interactor match interactor_query.get(event.interactor) { Ok(interactor_transform) => { - info!("its a direct interactor?"); - info!( - "before gT: {:?}, iT: {:?}", - grabbable_transform, interactor_transform - ); - *grabbable_transform.0 = interactor_transform.0.compute_transform(); - info!( - "after gT: {:?}, iT: {:?}", - grabbable_transform, interactor_transform - ); + match interactor_transform.1 { + XRInteractorState::Idle => (), + XRInteractorState::Selecting => { + // info!("its a direct interactor?"); + // info!( + // "before gT: {:?}, iT: {:?}", + // grabbable_transform, interactor_transform + // ); + *grabbable_transform.0 = interactor_transform.0.compute_transform(); + // info!( + // "after gT: {:?}, iT: {:?}", + // grabbable_transform, interactor_transform + // ); + } + } + } + Err(_) => { + // info!("not a direct interactor") } - Err(_) => info!("not a direct interactor"), } } Err(_) => { - info!("not a grabbable?") + // info!("not a grabbable?") } } } diff --git a/src/xr_input/interactions.rs b/src/xr_input/interactions.rs index db3dfc2..425d8d6 100644 --- a/src/xr_input/interactions.rs +++ b/src/xr_input/interactions.rs @@ -16,7 +16,7 @@ pub struct XRRayInteractor; #[derive(Component)] pub struct XRSocketInteractor; -#[derive(Component, Clone, Copy)] +#[derive(Component, Clone, Copy, PartialEq, PartialOrd, Debug)] pub enum XRInteractableState { Idle, Hover, @@ -78,7 +78,7 @@ pub fn draw_interaction_gizmos( Option<&XRRayInteractor>, Option<&AimPose>, ), - (Without), + Without, >, tracking_root_query: Query<(&mut Transform, With)>, ) { @@ -144,7 +144,7 @@ pub struct InteractionEvent { //yeah these need to be seperate somehow pub fn socket_interactions( - mut interactable_query: Query< + interactable_query: Query< (&GlobalTransform, &mut XRInteractableState, Entity), (With, Without), >, @@ -155,7 +155,7 @@ pub fn socket_interactions( Entity, &XRSocketInteractor, ), - (Without), + Without, >, mut writer: EventWriter, ) { @@ -179,7 +179,15 @@ pub fn socket_interactions( { //check for selections first match interactor_state { - XRInteractorState::Idle => (), //welp this wont work, + XRInteractorState::Idle => { + //welp now I gota actually make things do stuff lol + let event = InteractionEvent { + interactor: socket.2, + interactable: interactable.2, + interactable_state: XRInteractableState::Hover, + }; + writer.send(event); + } XRInteractorState::Selecting => { //welp now I gota actually make things do stuff lol let event = InteractionEvent { @@ -196,8 +204,8 @@ pub fn socket_interactions( } pub fn interactions( - mut interactable_query: Query< - (&GlobalTransform, &mut XRInteractableState, Entity), + interactable_query: Query< + (&GlobalTransform, Entity), (With, Without), >, interactor_query: Query< @@ -209,15 +217,12 @@ pub fn interactions( Option<&XRRayInteractor>, Option<&AimPose>, ), - (Without), + Without, >, tracking_root_query: Query<(&mut Transform, With)>, mut writer: EventWriter, ) { - for (xr_interactable_global_transform, mut state, interactable_entity) in - interactable_query.iter_mut() - { - let mut hovered = false; + for (xr_interactable_global_transform, interactable_entity) in interactable_query.iter() { for (interactor_global_transform, interactor_state, interactor_entity, direct, ray, aim) in interactor_query.iter() { @@ -237,7 +242,15 @@ pub fn interactions( { //check for selections first match interactor_state { - XRInteractorState::Idle => hovered = true, + XRInteractorState::Idle => { + //welp now I gota actually make things do stuff lol + let event = InteractionEvent { + interactor: interactor_entity, + interactable: interactable_entity, + interactable_state: XRInteractableState::Hover, + }; + writer.send(event); + } XRInteractorState::Selecting => { //welp now I gota actually make things do stuff lol let event = InteractionEvent { @@ -274,7 +287,15 @@ pub fn interactions( ) { //check for selections first match interactor_state { - XRInteractorState::Idle => hovered = true, + XRInteractorState::Idle => { + //welp now I gota actually make things do stuff lol + let event = InteractionEvent { + interactor: interactor_entity, + interactable: interactable_entity, + interactable_state: XRInteractableState::Hover, + }; + writer.send(event); + } XRInteractorState::Selecting => { //welp now I gota actually make things do stuff lol let event = InteractionEvent { @@ -293,23 +314,29 @@ pub fn interactions( None => (), } } - //still hate this - if hovered { - *state = XRInteractableState::Hover; - } else { - *state = XRInteractableState::Idle; - } } } pub fn update_interactable_states( mut events: EventReader, - mut interactable_query: Query<(Entity, &mut XRInteractableState), (With)>, + mut interactable_query: Query<(Entity, &mut XRInteractableState), With>, ) { + //i legit hate this haha but it works + for (_entity, mut state) in interactable_query.iter_mut() { + *state = XRInteractableState::Idle; + } + for event in events.read() { //lets change the state? match interactable_query.get_mut(event.interactable) { Ok((_entity, mut entity_state)) => { + if event.interactable_state > *entity_state { + // info!( + // "event.state: {:?}, interactable.state: {:?}", + // event.interactable_state, entity_state + // ); + // info!("event has a higher state"); + } *entity_state = event.interactable_state; } Err(_) => {}