basic vr controller events
This commit is contained in:
51
src/vr.rs
51
src/vr.rs
@@ -13,6 +13,7 @@ use self::gfx_device_gl::Resources as GLResources;
|
||||
use self::na::Inverse;
|
||||
use self::num_traits::identities::Zero;
|
||||
use self::num_traits::identities::One;
|
||||
use self::openvr_sys::{VREvent_Controller_t, VREvent_t};
|
||||
|
||||
pub struct VR {
|
||||
system: vr::IVRSystem,
|
||||
@@ -20,7 +21,13 @@ pub struct VR {
|
||||
gfx_handles: gfx::handle::Manager<GLResources>,
|
||||
}
|
||||
|
||||
pub struct Event {
|
||||
#[derive(Debug)]
|
||||
pub enum Event {
|
||||
Touch { dev_idx: u32, controller: VREvent_Controller_t },
|
||||
Press { dev_idx: u32, controller: VREvent_Controller_t },
|
||||
Unpress { dev_idx: u32, controller: VREvent_Controller_t },
|
||||
Untouch { dev_idx: u32, controller: VREvent_Controller_t },
|
||||
Other(VREvent_t),
|
||||
}
|
||||
|
||||
impl VR {
|
||||
@@ -60,6 +67,48 @@ impl VR {
|
||||
assert!(mat.inverse_mut(), "inverse eye matrix");
|
||||
mat
|
||||
}
|
||||
|
||||
pub fn poll_next_event(&mut self) -> Option<Event> {
|
||||
use self::openvr_sys::EVREventType as EvType;
|
||||
unsafe {
|
||||
let system = * { self.system.0 as *mut openvr_sys::VR_IVRSystem_FnTable };
|
||||
let mut event: openvr_sys::VREvent_t = ::std::mem::zeroed();
|
||||
|
||||
if system.PollNextEvent.unwrap()(&mut event,
|
||||
::std::mem::size_of::<openvr_sys::VREvent_t>() as u32
|
||||
) == 0 {
|
||||
return None;
|
||||
}
|
||||
|
||||
let dev_idx = event.trackedDeviceIndex;
|
||||
Some(match ::std::mem::transmute(event.eventType) {
|
||||
EvType::EVREventType_VREvent_ButtonTouch =>
|
||||
Event::Touch { dev_idx: dev_idx as u32, controller: *event.data.controller() },
|
||||
EvType::EVREventType_VREvent_ButtonPress =>
|
||||
Event::Press { dev_idx: dev_idx as u32, controller: *event.data.controller() },
|
||||
EvType::EVREventType_VREvent_ButtonUnpress =>
|
||||
Event::Unpress { dev_idx: dev_idx as u32, controller: *event.data.controller() },
|
||||
EvType::EVREventType_VREvent_ButtonUntouch =>
|
||||
Event::Untouch { dev_idx: dev_idx as u32, controller: *event.data.controller() },
|
||||
_ => Event::Other(event),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_controller_state(&self, index: u32) -> Option<openvr_sys::VRControllerState_t> {
|
||||
unsafe {
|
||||
let system = * { self.system.0 as *const openvr_sys::VR_IVRSystem_FnTable };
|
||||
let mut state: openvr_sys::VRControllerState_t = ::std::mem::zeroed();
|
||||
|
||||
match system.GetControllerState.unwrap()(
|
||||
index,
|
||||
&mut state,
|
||||
) {
|
||||
0 => None,
|
||||
_ => Some(state)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Drop for VR {
|
||||
|
||||
Reference in New Issue
Block a user