extern crate vrtue; use vrtue::vr; extern crate env_logger; extern crate gfx; #[macro_use] extern crate log; extern crate openvr_sys; extern crate piston_window; use self::piston_window::{PistonWindow, Window, WindowSettings}; pub type ColorFormat = gfx::format::Srgba8; pub type DepthFormat = gfx::format::DepthStencil; pub fn main() { let mut vr = vr::VR::new().expect("VR init"); let mut window: PistonWindow = WindowSettings::new("Click Test", [512; 2]) .exit_on_esc(true) .vsync(false) .build().expect("Building Window"); let render_size = vr.recommended_render_target_size(); let left: vr::EyeBuffer = vr::create_eyebuffer(&mut window.factory, render_size) .expect("create left renderbuffer"); let right: vr::EyeBuffer = vr::create_eyebuffer(&mut window.factory, render_size) .expect("create right renderbuffer"); window.encoder.clear(&left.target, [1.0, 0.0, 0.0, 1.0]); window.encoder.clear_depth(&left.depth, 1.0); window.encoder.clear(&right.target, [0.0, 1.0, 0.0, 1.0]); window.encoder.clear_depth(&right.depth, 1.0); window.encoder.flush(&mut window.device); let mut pads = ::std::collections::BTreeMap::<_, Option>::new(); 'main: loop { let _poses = vr.poses(); vr.submit(vr::Eye::Left, &left.tex); vr.submit(vr::Eye::Right, &right.tex); while let Some(ev) = vr.poll_next_event() { match ev { vr::Event::Press { dev_idx, controller } => { println!("Press event on #{}: {:?}", dev_idx, controller); }, vr::Event::Unpress { dev_idx, controller } => { println!("Unpress event on #{}: {:?}", dev_idx, controller); }, vr::Event::Touch { dev_idx, controller } => { if controller.button == openvr_sys::EVRButtonId_k_EButton_SteamVR_Touchpad as u32 { pads.insert(dev_idx, None); } println!("Touch event on #{}: {:?}", dev_idx, controller); }, vr::Event::Untouch { dev_idx, controller } => { if controller.button == openvr_sys::EVRButtonId_k_EButton_SteamVR_Touchpad as u32 { pads.remove(&dev_idx); } println!("Untouch event on #{}: {:?}", dev_idx, controller); }, /* t if t == openvr_sys::EVREventType::EVREventType_VREvent_TouchPadMove as u32 => { let touch; unsafe { touch = *ev.data.touchPadMove(); } println!("TouchPadMove event on #{}: {:?}", ev.trackedDeviceIndex, touch); }, */ _ => () } } for (pad, old) in pads.iter_mut() { if let Some(state) = vr.get_controller_state(*pad) { if let Some(old_state) = *old { if state.unPacketNum == old_state.unPacketNum { continue; } } *old = Some(state); println!("state for {}: {:?}", *pad, state); } } // handle window events while let Some(ev) = window.poll_event() { match ev { piston_window::Input::Text(_) => break 'main, _ => debug!("\t{:?}", ev) } } } }