this works well enough for now

This commit is contained in:
Jay Christy
2023-10-01 23:42:43 -04:00
parent d80506c43c
commit b487bf6cbb
2 changed files with 23 additions and 17 deletions

View File

@@ -6,7 +6,7 @@ use bevy_openxr::resources::{XrFrameState, XrInstance, XrSession};
use bevy_openxr::xr_input::debug_gizmos::OpenXrDebugRenderer; use bevy_openxr::xr_input::debug_gizmos::OpenXrDebugRenderer;
use bevy_openxr::xr_input::interactions::{ use bevy_openxr::xr_input::interactions::{
draw_interaction_gizmos, draw_socket_gizmos, interactions, socket_interactions, draw_interaction_gizmos, draw_socket_gizmos, interactions, socket_interactions,
update_interactable_states, InteractionEvent, XRDirectInteractor, XRInteractable, update_interactable_states, InteractionEvent, Touched, XRDirectInteractor, XRInteractable,
XRInteractableState, XRInteractorState, XRRayInteractor, XRSocketInteractor, XRInteractableState, XRInteractorState, XRRayInteractor, XRSocketInteractor,
}; };
use bevy_openxr::xr_input::oculus_touch::OculusController; use bevy_openxr::xr_input::oculus_touch::OculusController;
@@ -100,6 +100,7 @@ fn setup(
XRInteractable, XRInteractable,
XRInteractableState::default(), XRInteractableState::default(),
Grabbable, Grabbable,
Touched(false),
)); ));
} }

View File

@@ -16,6 +16,9 @@ pub struct XRRayInteractor;
#[derive(Component)] #[derive(Component)]
pub struct XRSocketInteractor; pub struct XRSocketInteractor;
#[derive(Component)]
pub struct Touched(pub bool);
#[derive(Component, Clone, Copy, PartialEq, PartialOrd, Debug)] #[derive(Component, Clone, Copy, PartialEq, PartialOrd, Debug)]
pub enum XRInteractableState { pub enum XRInteractableState {
Idle, Idle,
@@ -43,7 +46,6 @@ impl Default for XRInteractorState {
#[derive(Component)] #[derive(Component)]
pub struct XRInteractable; pub struct XRInteractable;
//i guess really these should be seperate
pub fn draw_socket_gizmos( pub fn draw_socket_gizmos(
mut gizmos: Gizmos, mut gizmos: Gizmos,
interactor_query: Query<( interactor_query: Query<(
@@ -142,7 +144,6 @@ pub struct InteractionEvent {
pub interactable_state: XRInteractableState, pub interactable_state: XRInteractableState,
} }
//yeah these need to be seperate somehow
pub fn socket_interactions( pub fn socket_interactions(
interactable_query: Query< interactable_query: Query<
(&GlobalTransform, &mut XRInteractableState, Entity), (&GlobalTransform, &mut XRInteractableState, Entity),
@@ -160,7 +161,7 @@ pub fn socket_interactions(
mut writer: EventWriter<InteractionEvent>, mut writer: EventWriter<InteractionEvent>,
) { ) {
for interactable in interactable_query.iter() { for interactable in interactable_query.iter() {
//for the interactbles //for the interactables
for socket in interactor_query.iter() { for socket in interactor_query.iter() {
let interactor_global_transform = socket.0; let interactor_global_transform = socket.0;
let xr_interactable_global_transform = interactable.0; let xr_interactable_global_transform = interactable.0;
@@ -180,7 +181,6 @@ pub fn socket_interactions(
//check for selections first //check for selections first
match interactor_state { match interactor_state {
XRInteractorState::Idle => { XRInteractorState::Idle => {
//welp now I gota actually make things do stuff lol
let event = InteractionEvent { let event = InteractionEvent {
interactor: socket.2, interactor: socket.2,
interactable: interactable.2, interactable: interactable.2,
@@ -189,7 +189,6 @@ pub fn socket_interactions(
writer.send(event); writer.send(event);
} }
XRInteractorState::Selecting => { XRInteractorState::Selecting => {
//welp now I gota actually make things do stuff lol
let event = InteractionEvent { let event = InteractionEvent {
interactor: socket.2, interactor: socket.2,
interactable: interactable.2, interactable: interactable.2,
@@ -243,7 +242,6 @@ pub fn interactions(
//check for selections first //check for selections first
match interactor_state { match interactor_state {
XRInteractorState::Idle => { XRInteractorState::Idle => {
//welp now I gota actually make things do stuff lol
let event = InteractionEvent { let event = InteractionEvent {
interactor: interactor_entity, interactor: interactor_entity,
interactable: interactable_entity, interactable: interactable_entity,
@@ -252,7 +250,6 @@ pub fn interactions(
writer.send(event); writer.send(event);
} }
XRInteractorState::Selecting => { XRInteractorState::Selecting => {
//welp now I gota actually make things do stuff lol
let event = InteractionEvent { let event = InteractionEvent {
interactor: interactor_entity, interactor: interactor_entity,
interactable: interactable_entity, interactable: interactable_entity,
@@ -288,7 +285,6 @@ pub fn interactions(
//check for selections first //check for selections first
match interactor_state { match interactor_state {
XRInteractorState::Idle => { XRInteractorState::Idle => {
//welp now I gota actually make things do stuff lol
let event = InteractionEvent { let event = InteractionEvent {
interactor: interactor_entity, interactor: interactor_entity,
interactable: interactable_entity, interactable: interactable_entity,
@@ -297,7 +293,6 @@ pub fn interactions(
writer.send(event); writer.send(event);
} }
XRInteractorState::Selecting => { XRInteractorState::Selecting => {
//welp now I gota actually make things do stuff lol
let event = InteractionEvent { let event = InteractionEvent {
interactor: interactor_entity, interactor: interactor_entity,
interactable: interactable_entity, interactable: interactable_entity,
@@ -319,17 +314,21 @@ pub fn interactions(
pub fn update_interactable_states( pub fn update_interactable_states(
mut events: EventReader<InteractionEvent>, mut events: EventReader<InteractionEvent>,
mut interactable_query: Query<(Entity, &mut XRInteractableState), With<XRInteractable>>, mut interactable_query: Query<
(Entity, &mut XRInteractableState, &mut Touched),
With<XRInteractable>,
>,
) { ) {
//i legit hate this haha but it works //i very much dislike this
for (_entity, mut state) in interactable_query.iter_mut() { for (_entity, _state, mut touched) in interactable_query.iter_mut() {
*state = XRInteractableState::Idle; *touched = Touched(false);
} }
for event in events.read() { for event in events.read() {
//lets change the state? //lets change the state
match interactable_query.get_mut(event.interactable) { match interactable_query.get_mut(event.interactable) {
Ok((_entity, mut entity_state)) => { Ok((_entity, mut entity_state, mut touched)) => {
//since we have an event we were touched this frame, i hate this name
*touched = Touched(true);
if event.interactable_state > *entity_state { if event.interactable_state > *entity_state {
// info!( // info!(
// "event.state: {:?}, interactable.state: {:?}", // "event.state: {:?}, interactable.state: {:?}",
@@ -342,6 +341,12 @@ pub fn update_interactable_states(
Err(_) => {} Err(_) => {}
} }
} }
//lets go through all the untouched interactables and set them to idle
for (_entity, mut state, touched) in interactable_query.iter_mut() {
if !touched.0 {
*state = XRInteractableState::Idle;
}
}
} }
fn ray_sphere_intersection(center: Vec3, radius: f32, ray_origin: Vec3, ray_dir: Vec3) -> bool { fn ray_sphere_intersection(center: Vec3, radius: f32, ray_origin: Vec3, ray_dir: Vec3) -> bool {