copied src from Schmarni-Dev/bevy_openxr:demo
This commit is contained in:
84
src/xr_input/handtracking.rs
Normal file
84
src/xr_input/handtracking.rs
Normal file
@@ -0,0 +1,84 @@
|
||||
use std::mem::MaybeUninit;
|
||||
|
||||
use bevy::prelude::*;
|
||||
use openxr::{HandJointLocationEXT, HandTracker, Result};
|
||||
|
||||
use crate::{
|
||||
input::XrInput,
|
||||
resources::{XrFrameState, XrFrameWaiter, XrSession},
|
||||
};
|
||||
|
||||
use super::hand::HandBone;
|
||||
|
||||
#[derive(Resource)]
|
||||
pub struct HandTrackingTracker {
|
||||
left_hand: HandTracker,
|
||||
right_hand: HandTracker,
|
||||
}
|
||||
|
||||
impl HandTrackingTracker {
|
||||
pub fn new(session: &XrSession) -> Result<HandTrackingTracker> {
|
||||
let left = session.create_hand_tracker(openxr::HandEXT::LEFT)?;
|
||||
let right = session.create_hand_tracker(openxr::HandEXT::RIGHT)?;
|
||||
Ok(HandTrackingTracker {
|
||||
left_hand: left,
|
||||
right_hand: right,
|
||||
})
|
||||
}
|
||||
pub fn get_ref<'a>(
|
||||
&'a self,
|
||||
input: &'a XrInput,
|
||||
frame_state: &'a XrFrameState,
|
||||
) -> HandTrackingRef<'a> {
|
||||
HandTrackingRef {
|
||||
tracking: self,
|
||||
input,
|
||||
frame_state,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub struct HandTrackingRef<'a> {
|
||||
tracking: &'a HandTrackingTracker,
|
||||
input: &'a XrInput,
|
||||
frame_state: &'a XrFrameState,
|
||||
}
|
||||
|
||||
// pub type HandJoints = [(HandJointLocationEXT, HandBone); 26];
|
||||
|
||||
impl<'a> HandTrackingRef<'a> {
|
||||
pub fn get_left_poses(&self) -> Option<[HandJointLocationEXT;26]> {
|
||||
self.input
|
||||
.stage
|
||||
.locate_hand_joints(
|
||||
&self.tracking.left_hand,
|
||||
self.frame_state.lock().unwrap().predicted_display_time,
|
||||
)
|
||||
.unwrap()
|
||||
// .map(|joints| {
|
||||
// joints
|
||||
// .into_iter()
|
||||
// .zip(HandBone::get_all_bones().into_iter())
|
||||
// .collect::<Vec<(HandJointLocationEXT, HandBone)>>()
|
||||
// .try_into()
|
||||
// .unwrap()
|
||||
// })
|
||||
}
|
||||
pub fn get_right_poses(&self) -> Option<[HandJointLocationEXT;26]> {
|
||||
self.input
|
||||
.stage
|
||||
.locate_hand_joints(
|
||||
&self.tracking.right_hand,
|
||||
self.frame_state.lock().unwrap().predicted_display_time,
|
||||
)
|
||||
.unwrap()
|
||||
// .map(|joints| {
|
||||
// joints
|
||||
// .into_iter()
|
||||
// .zip(HandBone::get_all_bones().into_iter())
|
||||
// .collect::<Vec<(HandJointLocationEXT, HandBone)>>()
|
||||
// .try_into()
|
||||
// .unwrap()
|
||||
// })
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user