From 6aaa7d279a91af0a6cb264be8428f48ef7bafeae Mon Sep 17 00:00:00 2001 From: Christoph Schulz Date: Wed, 10 Jul 2019 02:29:13 +0200 Subject: [PATCH] Upgrade to OpenVR 1.4.18 (#40) Cleanup and update to latest openvr-sys --- .gitignore | 18 +- Cargo.toml | 8 +- Readme.md => README.md | 23 +-- examples/test.rs | 33 ++-- src/chaperone.rs | 7 +- src/compositor/mod.rs | 97 ++++++++--- src/compositor/texture.rs | 2 +- src/lib.rs | 72 +++++--- src/property.rs | 335 +++++++++++++++++++++++++------------- src/render_models.rs | 180 ++++++++++++++------ src/system/event.rs | 325 ++++++++++++++++++++++++++++-------- src/system/mod.rs | 263 +++++++++++++++++++++++------- src/tracking.rs | 26 ++- 13 files changed, 995 insertions(+), 394 deletions(-) rename Readme.md => README.md (54%) diff --git a/.gitignore b/.gitignore index 0780130..95f61fc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,11 +1,9 @@ -/.tmp.txt -/Makefile -/bin -/lib -/modules/oculus_sdk_mac/LibOVR/Lib/Mac/Xcode/Release/ -/target -*.py[co] -/src/sys/target/ -*.lock +# Generated by Cargo +/target/ + +# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries +# More information here http://doc.crates.io/guide.html#cargotoml-vs-cargolock Cargo.lock -/idea/ + +/.idea/ +/.vscode/ diff --git a/Cargo.toml b/Cargo.toml index 815360f..bcffcb0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "openvr" -version = "0.5.2" +version = "0.6.0" authors = [ "Colin Sherratt", "Erick Tryzelaar", @@ -12,7 +12,7 @@ license = "MIT" homepage = "https://github.com/rust-openvr/rust-openvr" repository = "https://github.com/rust-openvr/rust-openvr" -description = "A high-level binding for openvr." +description = "A high-level binding for OpenVR." keywords = ["vr", "vive", "steamvr"] categories = [ "hardware-support", "api-bindings" ] @@ -22,5 +22,5 @@ travis-ci = { repository = "rust-openvr/rust-openvr" } maintenance = { status = "passively-maintained" } [dependencies] -openvr_sys = "2" -lazy_static = "0.2.8" +openvr_sys = "2.0.3" +lazy_static = "1.3.0" diff --git a/Readme.md b/README.md similarity index 54% rename from Readme.md rename to README.md index a2ee0e4..98e8036 100644 --- a/Readme.md +++ b/README.md @@ -4,39 +4,30 @@ rust-openvr [![Build Status](https://travis-ci.org/rust-openvr/rust-openvr.svg?branch=master)](https://travis-ci.org/rust-openvr/rust-openvr) [![Join the chat at https://gitter.im/rust-openvr/rust-openvr](https://badges.gitter.im/rust-openvr/rust-openvr.svg)](https://gitter.im/rust-openvr/rust-openvr?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) -A high-level binding for OpenVR 1.0.10. +High-level bindings for OpenVR. [API documentation](https://docs.rs/openvr/*/openvr/) -High-level documentation can be found at [the OpenVR wiki](https://github.com/ValveSoftware/openvr/wiki/API-Documentation). - -Using rust-openvr ------------ +[C/C++ API documentation](https://github.com/ValveSoftware/openvr/wiki/API-Documentation) for reference purposes. # Requirements -openvr-sys needs cmake and a C++ compiler so that it can compile and statically link the OpenVR client library. +`openvr-sys` requires CMake and C++ to compile and statically link the OpenVR library. -## Windows - -Upstream OpenVR does not support MinGW. You must use an MSVC-targeted rust toolchain and C++ compiler. +**Imporant**: OpenVR does not support MinGW on Windows, i.e., you have to use the MSVC Rust toolchain and C++ compiler. # Initializing ```rust - extern crate openvr; fn main() { - // Initialize OpenVR + // Initialize OpenVR. let context = unsafe { openvr::init(openvr::ApplicationType::Scene) }.unwrap(); - // accessing subsystems + // Access subsystem. let system = context.system().unwrap(); - // .. + // See examples/test.rs for a more detailed example. } ``` - -# Examples -See examples/test.rs for a more detailed example. diff --git a/examples/test.rs b/examples/test.rs index e764dea..16214e4 100644 --- a/examples/test.rs +++ b/examples/test.rs @@ -1,8 +1,9 @@ extern crate openvr; fn print_matrix(offset: u32, mat: M) - where M: AsRef<[N]>, - N: AsRef<[f32]>, +where + M: AsRef<[N]>, + N: AsRef<[f32]>, { let offset: String = (0..offset).map(|_| ' ').collect(); let mut is_first_row = true; @@ -35,7 +36,10 @@ fn main() { } }; - println!("\tRecommended size: {:?}", system.recommended_render_target_size()); + println!( + "\tRecommended size: {:?}", + system.recommended_render_target_size() + ); println!("\tVSync: {:?}", system.time_since_last_vsync()); print!("\tProjection matrix left "); @@ -47,20 +51,19 @@ fn main() { print_matrix(25, system.eye_to_head_transform(openvr::Eye::Left)); print!("\tPoses "); - let poses = system.device_to_absolute_tracking_pose(openvr::TrackingUniverseOrigin::RawAndUncalibrated, 0.0); + let poses = system + .device_to_absolute_tracking_pose(openvr::TrackingUniverseOrigin::RawAndUncalibrated, 0.0); for pose in poses.iter() { - print_matrix(8+6, pose.device_to_absolute_tracking()); + print_matrix(8 + 6, pose.device_to_absolute_tracking()); break; } println!("\tDistortion example"); for u in 0..2 { for v in 0..2 { - let pos = system.compute_distortion( - openvr::Eye::Left, - u as f32 / 4., - v as f32 / 4., - ).unwrap(); + let pos = system + .compute_distortion(openvr::Eye::Left, u as f32 / 4., v as f32 / 4.) + .unwrap(); print!("\t\t({:7.4}, {:7.4}) ", pos.red[0], pos.red[1]); } println!(); @@ -91,7 +94,10 @@ fn main() { return; } }; - println!("\tCalibration state: {:?}", chaperone.get_calibration_state()); + println!( + "\tCalibration state: {:?}", + chaperone.get_calibration_state() + ); println!("\tPlay area size: {:?}", chaperone.get_play_area_size()); print!("\tPlay area rect: "); if let Some(play_area_rect) = chaperone.get_play_area_rect() { @@ -99,7 +105,10 @@ fn main() { } else { println!("None"); } - println!("\tAre bounds visible = {:?}", chaperone.are_bounds_visible()); + println!( + "\tAre bounds visible = {:?}", + chaperone.are_bounds_visible() + ); println!(); println!("Done! \\o/"); diff --git a/src/chaperone.rs b/src/chaperone.rs index db1b125..49e75f9 100644 --- a/src/chaperone.rs +++ b/src/chaperone.rs @@ -104,7 +104,12 @@ impl Chaperone { }; let is_ok = unsafe { self.0.GetPlayAreaRect.unwrap()(&mut r) }; if is_ok { - Some([r.vCorners[0].v, r.vCorners[1].v, r.vCorners[2].v, r.vCorners[3].v]) + Some([ + r.vCorners[0].v, + r.vCorners[1].v, + r.vCorners[2].v, + r.vCorners[3].v, + ]) } else { None } diff --git a/src/compositor/mod.rs b/src/compositor/mod.rs index 0d29477..914c4b7 100644 --- a/src/compositor/mod.rs +++ b/src/compositor/mod.rs @@ -8,8 +8,8 @@ //! It is recommended that you continue presenting your application's own window, reusing either the left or right eye //! camera render target to draw a single quad (perhaps cropped to a lower fov to hide the hidden area mask). -use std::{mem, ptr, error, fmt}; use std::ffi::CString; +use std::{error, fmt, mem, ptr}; use openvr_sys as sys; @@ -21,14 +21,29 @@ use super::*; impl Compositor { pub fn vulkan_instance_extensions_required(&self) -> Vec { - let temp = unsafe { get_string(|ptr, n| self.0.GetVulkanInstanceExtensionsRequired.unwrap()(ptr, n)) }.unwrap(); - temp.as_bytes().split(|&x| x == b' ').map(|x| CString::new(x.to_vec()).expect("extension name contained null byte")).collect() + let temp = unsafe { + get_string(|ptr, n| self.0.GetVulkanInstanceExtensionsRequired.unwrap()(ptr, n)) + } + .unwrap(); + temp.as_bytes() + .split(|&x| x == b' ') + .map(|x| CString::new(x.to_vec()).expect("extension name contained null byte")) + .collect() } /// Safety: physical_device must be a valid VkPhysicalDevice - pub unsafe fn vulkan_device_extensions_required(&self, physical_device: *mut VkPhysicalDevice_T) -> Vec { - let temp = get_string(|ptr, n| self.0.GetVulkanDeviceExtensionsRequired.unwrap()(physical_device, ptr, n)).unwrap(); - temp.as_bytes().split(|&x| x == b' ').map(|x| CString::new(x.to_vec()).expect("extension name contained null byte")).collect() + pub unsafe fn vulkan_device_extensions_required( + &self, + physical_device: *mut VkPhysicalDevice_T, + ) -> Vec { + let temp = get_string(|ptr, n| { + self.0.GetVulkanDeviceExtensionsRequired.unwrap()(physical_device, ptr, n) + }) + .unwrap(); + temp.as_bytes() + .split(|&x| x == b' ') + .map(|x| CString::new(x.to_vec()).expect("extension name contained null byte")) + .collect() } /// Sets tracking space returned by WaitGetPoses @@ -43,8 +58,12 @@ impl Compositor { pub fn wait_get_poses(&self) -> Result { unsafe { let mut result: WaitPoses = mem::uninitialized(); - let e = self.0.WaitGetPoses.unwrap()(result.render.as_mut().as_mut_ptr() as *mut _, result.render.len() as u32, - result.game.as_mut().as_mut_ptr() as *mut _, result.game.len() as u32); + let e = self.0.WaitGetPoses.unwrap()( + result.render.as_mut().as_mut_ptr() as *mut _, + result.render.len() as u32, + result.game.as_mut().as_mut_ptr() as *mut _, + result.game.len() as u32, + ); if e == sys::EVRCompositorError_VRCompositorError_None { Ok(result) } else { @@ -60,13 +79,23 @@ impl Compositor { /// # Safety /// /// The handles you supply must be valid and comply with the graphics API's synchronization requirements. - pub unsafe fn submit(&self, eye: Eye, texture: &Texture, bounds: Option<&texture::Bounds>, pose: Option<[[f32; 4]; 3]>) -> Result<(), CompositorError> { + pub unsafe fn submit( + &self, + eye: Eye, + texture: &Texture, + bounds: Option<&texture::Bounds>, + pose: Option<[[f32; 4]; 3]>, + ) -> Result<(), CompositorError> { use self::texture::Handle::*; let flags = match texture.handle { Vulkan(_) => sys::EVRSubmitFlags_Submit_Default, OpenGLTexture(_) => sys::EVRSubmitFlags_Submit_Default, OpenGLRenderBuffer(_) => sys::EVRSubmitFlags_Submit_GlRenderBuffer, - } | if pose.is_some() { sys::EVRSubmitFlags_Submit_TextureWithPose } else { 0 }; + } | if pose.is_some() { + sys::EVRSubmitFlags_Submit_TextureWithPose + } else { + 0 + }; let texture = sys::VRTextureWithPose_t_real { handle: match texture.handle { Vulkan(ref x) => x as *const _ as *mut _, @@ -79,13 +108,18 @@ impl Compositor { OpenGLRenderBuffer(_) => sys::ETextureType_TextureType_OpenGL, }, eColorSpace: texture.color_space as sys::EColorSpace, - mDeviceToAbsoluteTracking: sys::HmdMatrix34_t { m: pose.unwrap_or([[0.0; 4]; 3]) }, + mDeviceToAbsoluteTracking: sys::HmdMatrix34_t { + m: pose.unwrap_or([[0.0; 4]; 3]), + }, }; let e = self.0.Submit.unwrap()( eye as sys::EVREye, &texture as *const _ as *mut _, - bounds.map(|x| x as *const _ as *mut texture::Bounds as *mut _).unwrap_or(ptr::null_mut()), - flags); + bounds + .map(|x| x as *const _ as *mut texture::Bounds as *mut _) + .unwrap_or(ptr::null_mut()), + flags, + ); if e == sys::EVRCompositorError_VRCompositorError_None { Ok(()) } else { @@ -138,7 +172,7 @@ impl Compositor { /// to access the queue. Note that PostPresentHandoff and SubmitExplicitTimingData will access the queue, so only /// WaitGetPoses becomes safe for accessing the queue from another thread. pub fn set_explicit_timing_mode(&self, mode: bool) { - unsafe { self.0.SetExplicitTimingMode.unwrap()(mode) } + unsafe { self.0.SetExplicitTimingMode.unwrap()(mode as sys::EVRCompositorTimingMode) } } pub fn submit_explicit_timing_data(&self) -> Result<(), CompositorError> { @@ -151,7 +185,7 @@ impl Compositor { } } -#[derive(Debug, Copy, Clone)] +#[derive(Copy, Clone)] pub struct WaitPoses { /// Predicted to the point they will be at the upcoming frame. pub render: TrackedDevicePoses, @@ -165,17 +199,28 @@ pub struct CompositorError(sys::EVRCompositorError); pub mod compositor_error { use super::*; - pub const REQUEST_FAILED: CompositorError = CompositorError(sys::EVRCompositorError_VRCompositorError_RequestFailed); - pub const INCOMPATIBLE_VERSION: CompositorError = CompositorError(sys::EVRCompositorError_VRCompositorError_IncompatibleVersion); - pub const DO_NOT_HAVE_FOCUS: CompositorError = CompositorError(sys::EVRCompositorError_VRCompositorError_DoNotHaveFocus); - pub const INVALID_TEXTURE: CompositorError = CompositorError(sys::EVRCompositorError_VRCompositorError_InvalidTexture); - pub const IS_NOT_SCENE_APPLICATION: CompositorError = CompositorError(sys::EVRCompositorError_VRCompositorError_IsNotSceneApplication); - pub const TEXTURE_IS_ON_WRONG_DEVICE: CompositorError = CompositorError(sys::EVRCompositorError_VRCompositorError_TextureIsOnWrongDevice); - pub const TEXTURE_USES_UNSUPPORTED_FORMAT: CompositorError = CompositorError(sys::EVRCompositorError_VRCompositorError_TextureUsesUnsupportedFormat); - pub const SHARED_TEXTURES_NOT_SUPPORTED: CompositorError = CompositorError(sys::EVRCompositorError_VRCompositorError_SharedTexturesNotSupported); - pub const INDEX_OUT_OF_RANGE: CompositorError = CompositorError(sys::EVRCompositorError_VRCompositorError_IndexOutOfRange); - pub const ALREADY_SUBMITTED: CompositorError = CompositorError(sys::EVRCompositorError_VRCompositorError_AlreadySubmitted); - pub const INVALID_BOUNDS: CompositorError = CompositorError(sys::EVRCompositorError_VRCompositorError_InvalidBounds); + pub const REQUEST_FAILED: CompositorError = + CompositorError(sys::EVRCompositorError_VRCompositorError_RequestFailed); + pub const INCOMPATIBLE_VERSION: CompositorError = + CompositorError(sys::EVRCompositorError_VRCompositorError_IncompatibleVersion); + pub const DO_NOT_HAVE_FOCUS: CompositorError = + CompositorError(sys::EVRCompositorError_VRCompositorError_DoNotHaveFocus); + pub const INVALID_TEXTURE: CompositorError = + CompositorError(sys::EVRCompositorError_VRCompositorError_InvalidTexture); + pub const IS_NOT_SCENE_APPLICATION: CompositorError = + CompositorError(sys::EVRCompositorError_VRCompositorError_IsNotSceneApplication); + pub const TEXTURE_IS_ON_WRONG_DEVICE: CompositorError = + CompositorError(sys::EVRCompositorError_VRCompositorError_TextureIsOnWrongDevice); + pub const TEXTURE_USES_UNSUPPORTED_FORMAT: CompositorError = + CompositorError(sys::EVRCompositorError_VRCompositorError_TextureUsesUnsupportedFormat); + pub const SHARED_TEXTURES_NOT_SUPPORTED: CompositorError = + CompositorError(sys::EVRCompositorError_VRCompositorError_SharedTexturesNotSupported); + pub const INDEX_OUT_OF_RANGE: CompositorError = + CompositorError(sys::EVRCompositorError_VRCompositorError_IndexOutOfRange); + pub const ALREADY_SUBMITTED: CompositorError = + CompositorError(sys::EVRCompositorError_VRCompositorError_AlreadySubmitted); + pub const INVALID_BOUNDS: CompositorError = + CompositorError(sys::EVRCompositorError_VRCompositorError_InvalidBounds); } impl fmt::Debug for CompositorError { diff --git a/src/compositor/texture.rs b/src/compositor/texture.rs index b45439e..41aa2e4 100644 --- a/src/compositor/texture.rs +++ b/src/compositor/texture.rs @@ -1,4 +1,4 @@ -use super::{sys, VkInstance_T, VkDevice_T, VkPhysicalDevice_T, VkQueue_T}; +use super::{sys, VkDevice_T, VkInstance_T, VkPhysicalDevice_T, VkQueue_T}; #[derive(Debug, Copy, Clone)] pub struct Texture { diff --git a/src/lib.rs b/src/lib.rs index 34f29c1..0e366a7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -2,29 +2,29 @@ extern crate openvr_sys; #[macro_use] extern crate lazy_static; -use std::sync::atomic::{Ordering, AtomicBool, ATOMIC_BOOL_INIT}; -use std::{fmt, error, ptr, mem}; -use std::ffi::{CStr, CString}; use std::cell::Cell; +use std::ffi::{CStr, CString}; +use std::sync::atomic::{AtomicBool, Ordering}; +use std::{error, fmt, mem, ptr}; use openvr_sys as sys; mod tracking; -pub mod system; -pub mod compositor; -pub mod render_models; pub mod chaperone; +pub mod compositor; pub mod property; +pub mod render_models; +pub mod system; pub use tracking::*; -pub use sys::VkPhysicalDevice_T; pub use sys::VkDevice_T; pub use sys::VkInstance_T; +pub use sys::VkPhysicalDevice_T; pub use sys::VkQueue_T; -static INITIALIZED: AtomicBool = ATOMIC_BOOL_INIT; +static INITIALIZED: AtomicBool = AtomicBool::new(false); /// Initialize OpenVR /// @@ -48,9 +48,13 @@ pub unsafe fn init(ty: ApplicationType) -> Result { } if !sys::VR_IsInterfaceVersionValid(sys::IVRSystem_Version.as_ptr() as *const i8) { sys::VR_ShutdownInternal(); - return Err(InitError(sys::EVRInitError_VRInitError_Init_InterfaceNotFound)); + return Err(InitError( + sys::EVRInitError_VRInitError_Init_InterfaceNotFound, + )); } - Ok(Context { live: Cell::new(true) }) + Ok(Context { + live: Cell::new(true), + }) } pub struct System(&'static sys::VR_IVRSystem_FnTable); @@ -63,7 +67,9 @@ pub struct Chaperone(&'static sys::VR_IVRChaperone_FnTable); /// At most one of this object may exist at a time. /// /// See safety notes in `init`. -pub struct Context { live: Cell } +pub struct Context { + live: Cell, +} fn load(suffix: &[u8]) -> Result<*const T, InitError> { let mut magic = Vec::from(b"FnTable:".as_ref()); @@ -71,16 +77,26 @@ fn load(suffix: &[u8]) -> Result<*const T, InitError> { let mut error = sys::EVRInitError_VRInitError_None; let result = unsafe { sys::VR_GetGenericInterface(magic.as_ptr() as *const i8, &mut error) }; if error != sys::EVRInitError_VRInitError_None { - return Err(InitError(sys::EVRInitError_VRInitError_Init_InterfaceNotFound)); + return Err(InitError( + sys::EVRInitError_VRInitError_Init_InterfaceNotFound, + )); } Ok(result as *const T) } impl Context { - pub fn system(&self) -> Result { load(sys::IVRSystem_Version).map(|x| unsafe { System(&*x) }) } - pub fn compositor(&self) -> Result { load(sys::IVRCompositor_Version).map(|x| unsafe { Compositor(&*x) }) } - pub fn render_models(&self) -> Result { load(sys::IVRRenderModels_Version).map(|x| unsafe { RenderModels(&*x) }) } - pub fn chaperone(&self) -> Result { load(sys::IVRChaperone_Version).map(|x| unsafe { Chaperone(&*x) }) } + pub fn system(&self) -> Result { + load(sys::IVRSystem_Version).map(|x| unsafe { System(&*x) }) + } + pub fn compositor(&self) -> Result { + load(sys::IVRCompositor_Version).map(|x| unsafe { Compositor(&*x) }) + } + pub fn render_models(&self) -> Result { + load(sys::IVRRenderModels_Version).map(|x| unsafe { RenderModels(&*x) }) + } + pub fn chaperone(&self) -> Result { + load(sys::IVRChaperone_Version).map(|x| unsafe { Chaperone(&*x) }) + } } impl Drop for Context { @@ -111,7 +127,7 @@ impl Context { #[derive(Debug, Copy, Clone, Eq, PartialEq)] pub enum ApplicationType { - /// Some other kind of application that isn't covered by the other entries + /// Some other kind of application that isn't covered by the other entries Other = sys::EVRApplicationType_VRApplication_Other as isize, /// Application will submit 3D frames Scene = sys::EVRApplicationType_VRApplication_Scene as isize, @@ -136,19 +152,19 @@ pub struct InitError(sys::EVRInitError); impl fmt::Debug for InitError { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let msg = unsafe { - CStr::from_ptr(sys::VR_GetVRInitErrorAsSymbol(self.0)) - }; - f.pad(msg.to_str().expect("OpenVR init error symbol was not valid UTF-8")) + let msg = unsafe { CStr::from_ptr(sys::VR_GetVRInitErrorAsSymbol(self.0)) }; + f.pad( + msg.to_str() + .expect("OpenVR init error symbol was not valid UTF-8"), + ) } } impl error::Error for InitError { fn description(&self) -> &str { - let msg = unsafe { - CStr::from_ptr(sys::VR_GetVRInitErrorAsEnglishDescription(self.0)) - }; - msg.to_str().expect("OpenVR init error description was not valid UTF-8") + let msg = unsafe { CStr::from_ptr(sys::VR_GetVRInitErrorAsEnglishDescription(self.0)) }; + msg.to_str() + .expect("OpenVR init error description was not valid UTF-8") } } @@ -167,13 +183,15 @@ pub enum Eye { /// Helper to call OpenVR functions that return strings unsafe fn get_string u32>(mut f: F) -> Option { let n = f(ptr::null_mut(), 0); - if n == 0 { return None } + if n == 0 { + return None; + } let mut storage = Vec::new(); storage.reserve_exact(n as usize); storage.resize(n as usize, mem::uninitialized()); let n_ = f(storage.as_mut_ptr() as *mut _, n); assert!(n == n_); - storage.truncate((n-1) as usize); // Strip trailing null + storage.truncate((n - 1) as usize); // Strip trailing null Some(CString::from_vec_unchecked(storage)) } diff --git a/src/property.rs b/src/property.rs index 25c7f38..aab88de 100644 --- a/src/property.rs +++ b/src/property.rs @@ -1,123 +1,234 @@ #![allow(non_upper_case_globals)] -use openvr_sys as sys; use super::TrackedDeviceProperty; +use openvr_sys as sys; pub const Invalid: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_Invalid; -pub const TrackingSystemName_String: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_TrackingSystemName_String; -pub const ModelNumber_String: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_ModelNumber_String; -pub const SerialNumber_String: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_SerialNumber_String; -pub const RenderModelName_String: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_RenderModelName_String; -pub const WillDriftInYaw_Bool: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_WillDriftInYaw_Bool; -pub const ManufacturerName_String: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_ManufacturerName_String; -pub const TrackingFirmwareVersion_String: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_TrackingFirmwareVersion_String; -pub const HardwareRevision_String: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_HardwareRevision_String; -pub const AllWirelessDongleDescriptions_String: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_AllWirelessDongleDescriptions_String; -pub const ConnectedWirelessDongle_String: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_ConnectedWirelessDongle_String; -pub const DeviceIsWireless_Bool: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_DeviceIsWireless_Bool; -pub const DeviceIsCharging_Bool: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_DeviceIsCharging_Bool; -pub const DeviceBatteryPercentage_Float: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_DeviceBatteryPercentage_Float; -pub const StatusDisplayTransform_Matrix34: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_StatusDisplayTransform_Matrix34; -pub const Firmware_UpdateAvailable_Bool: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_Firmware_UpdateAvailable_Bool; -pub const Firmware_ManualUpdate_Bool: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_Firmware_ManualUpdate_Bool; -pub const Firmware_ManualUpdateURL_String: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_Firmware_ManualUpdateURL_String; -pub const HardwareRevision_Uint64: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_HardwareRevision_Uint64; -pub const FirmwareVersion_Uint64: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_FirmwareVersion_Uint64; -pub const FPGAVersion_Uint64: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_FPGAVersion_Uint64; -pub const VRCVersion_Uint64: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_VRCVersion_Uint64; -pub const RadioVersion_Uint64: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_RadioVersion_Uint64; -pub const DongleVersion_Uint64: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_DongleVersion_Uint64; -pub const BlockServerShutdown_Bool: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_BlockServerShutdown_Bool; -pub const CanUnifyCoordinateSystemWithHmd_Bool: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_CanUnifyCoordinateSystemWithHmd_Bool; -pub const ContainsProximitySensor_Bool: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_ContainsProximitySensor_Bool; -pub const DeviceProvidesBatteryStatus_Bool: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_DeviceProvidesBatteryStatus_Bool; -pub const DeviceCanPowerOff_Bool: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_DeviceCanPowerOff_Bool; -pub const Firmware_ProgrammingTarget_String: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_Firmware_ProgrammingTarget_String; -pub const DeviceClass_Int32: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_DeviceClass_Int32; +pub const TrackingSystemName_String: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_TrackingSystemName_String; +pub const ModelNumber_String: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_ModelNumber_String; +pub const SerialNumber_String: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_SerialNumber_String; +pub const RenderModelName_String: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_RenderModelName_String; +pub const WillDriftInYaw_Bool: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_WillDriftInYaw_Bool; +pub const ManufacturerName_String: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_ManufacturerName_String; +pub const TrackingFirmwareVersion_String: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_TrackingFirmwareVersion_String; +pub const HardwareRevision_String: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_HardwareRevision_String; +pub const AllWirelessDongleDescriptions_String: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_AllWirelessDongleDescriptions_String; +pub const ConnectedWirelessDongle_String: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_ConnectedWirelessDongle_String; +pub const DeviceIsWireless_Bool: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_DeviceIsWireless_Bool; +pub const DeviceIsCharging_Bool: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_DeviceIsCharging_Bool; +pub const DeviceBatteryPercentage_Float: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_DeviceBatteryPercentage_Float; +pub const StatusDisplayTransform_Matrix34: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_StatusDisplayTransform_Matrix34; +pub const Firmware_UpdateAvailable_Bool: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_Firmware_UpdateAvailable_Bool; +pub const Firmware_ManualUpdate_Bool: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_Firmware_ManualUpdate_Bool; +pub const Firmware_ManualUpdateURL_String: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_Firmware_ManualUpdateURL_String; +pub const HardwareRevision_Uint64: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_HardwareRevision_Uint64; +pub const FirmwareVersion_Uint64: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_FirmwareVersion_Uint64; +pub const FPGAVersion_Uint64: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_FPGAVersion_Uint64; +pub const VRCVersion_Uint64: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_VRCVersion_Uint64; +pub const RadioVersion_Uint64: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_RadioVersion_Uint64; +pub const DongleVersion_Uint64: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_DongleVersion_Uint64; +pub const BlockServerShutdown_Bool: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_BlockServerShutdown_Bool; +pub const CanUnifyCoordinateSystemWithHmd_Bool: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_CanUnifyCoordinateSystemWithHmd_Bool; +pub const ContainsProximitySensor_Bool: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_ContainsProximitySensor_Bool; +pub const DeviceProvidesBatteryStatus_Bool: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_DeviceProvidesBatteryStatus_Bool; +pub const DeviceCanPowerOff_Bool: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_DeviceCanPowerOff_Bool; +pub const Firmware_ProgrammingTarget_String: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_Firmware_ProgrammingTarget_String; +pub const DeviceClass_Int32: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_DeviceClass_Int32; pub const HasCamera_Bool: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_HasCamera_Bool; -pub const DriverVersion_String: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_DriverVersion_String; -pub const Firmware_ForceUpdateRequired_Bool: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_Firmware_ForceUpdateRequired_Bool; -pub const ViveSystemButtonFixRequired_Bool: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_ViveSystemButtonFixRequired_Bool; -pub const ParentDriver_Uint64: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_ParentDriver_Uint64; -pub const ResourceRoot_String: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_ResourceRoot_String; -pub const ReportsTimeSinceVSync_Bool: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_ReportsTimeSinceVSync_Bool; -pub const SecondsFromVsyncToPhotons_Float: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_SecondsFromVsyncToPhotons_Float; -pub const DisplayFrequency_Float: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_DisplayFrequency_Float; -pub const UserIpdMeters_Float: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_UserIpdMeters_Float; -pub const CurrentUniverseId_Uint64: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_CurrentUniverseId_Uint64; -pub const PreviousUniverseId_Uint64: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_PreviousUniverseId_Uint64; -pub const DisplayFirmwareVersion_Uint64: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_DisplayFirmwareVersion_Uint64; -pub const IsOnDesktop_Bool: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_IsOnDesktop_Bool; -pub const DisplayMCType_Int32: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_DisplayMCType_Int32; -pub const DisplayMCOffset_Float: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_DisplayMCOffset_Float; -pub const DisplayMCScale_Float: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_DisplayMCScale_Float; -pub const EdidVendorID_Int32: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_EdidVendorID_Int32; -pub const DisplayMCImageLeft_String: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_DisplayMCImageLeft_String; -pub const DisplayMCImageRight_String: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_DisplayMCImageRight_String; -pub const DisplayGCBlackClamp_Float: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_DisplayGCBlackClamp_Float; -pub const EdidProductID_Int32: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_EdidProductID_Int32; -pub const CameraToHeadTransform_Matrix34: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_CameraToHeadTransform_Matrix34; -pub const DisplayGCType_Int32: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_DisplayGCType_Int32; -pub const DisplayGCOffset_Float: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_DisplayGCOffset_Float; -pub const DisplayGCScale_Float: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_DisplayGCScale_Float; -pub const DisplayGCPrescale_Float: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_DisplayGCPrescale_Float; -pub const DisplayGCImage_String: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_DisplayGCImage_String; -pub const LensCenterLeftU_Float: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_LensCenterLeftU_Float; -pub const LensCenterLeftV_Float: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_LensCenterLeftV_Float; -pub const LensCenterRightU_Float: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_LensCenterRightU_Float; -pub const LensCenterRightV_Float: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_LensCenterRightV_Float; -pub const UserHeadToEyeDepthMeters_Float: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_UserHeadToEyeDepthMeters_Float; -pub const CameraFirmwareVersion_Uint64: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_CameraFirmwareVersion_Uint64; -pub const CameraFirmwareDescription_String: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_CameraFirmwareDescription_String; -pub const DisplayFPGAVersion_Uint64: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_DisplayFPGAVersion_Uint64; -pub const DisplayBootloaderVersion_Uint64: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_DisplayBootloaderVersion_Uint64; -pub const DisplayHardwareVersion_Uint64: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_DisplayHardwareVersion_Uint64; -pub const AudioFirmwareVersion_Uint64: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_AudioFirmwareVersion_Uint64; -pub const CameraCompatibilityMode_Int32: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_CameraCompatibilityMode_Int32; -pub const ScreenshotHorizontalFieldOfViewDegrees_Float: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_ScreenshotHorizontalFieldOfViewDegrees_Float; -pub const ScreenshotVerticalFieldOfViewDegrees_Float: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_ScreenshotVerticalFieldOfViewDegrees_Float; -pub const DisplaySuppressed_Bool: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_DisplaySuppressed_Bool; -pub const DisplayAllowNightMode_Bool: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_DisplayAllowNightMode_Bool; -pub const DisplayMCImageWidth_Int32: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_DisplayMCImageWidth_Int32; -pub const DisplayMCImageHeight_Int32: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_DisplayMCImageHeight_Int32; -pub const DisplayMCImageNumChannels_Int32: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_DisplayMCImageNumChannels_Int32; -pub const DisplayMCImageData_Binary: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_DisplayMCImageData_Binary; -pub const SecondsFromPhotonsToVblank_Float: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_SecondsFromPhotonsToVblank_Float; -pub const DriverDirectModeSendsVsyncEvents_Bool: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_DriverDirectModeSendsVsyncEvents_Bool; -pub const DisplayDebugMode_Bool: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_DisplayDebugMode_Bool; -pub const GraphicsAdapterLuid_Uint64: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_GraphicsAdapterLuid_Uint64; -pub const AttachedDeviceId_String: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_AttachedDeviceId_String; -pub const SupportedButtons_Uint64: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_SupportedButtons_Uint64; +pub const DriverVersion_String: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_DriverVersion_String; +pub const Firmware_ForceUpdateRequired_Bool: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_Firmware_ForceUpdateRequired_Bool; +pub const ViveSystemButtonFixRequired_Bool: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_ViveSystemButtonFixRequired_Bool; +pub const ParentDriver_Uint64: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_ParentDriver_Uint64; +pub const ResourceRoot_String: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_ResourceRoot_String; +pub const ReportsTimeSinceVSync_Bool: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_ReportsTimeSinceVSync_Bool; +pub const SecondsFromVsyncToPhotons_Float: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_SecondsFromVsyncToPhotons_Float; +pub const DisplayFrequency_Float: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_DisplayFrequency_Float; +pub const UserIpdMeters_Float: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_UserIpdMeters_Float; +pub const CurrentUniverseId_Uint64: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_CurrentUniverseId_Uint64; +pub const PreviousUniverseId_Uint64: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_PreviousUniverseId_Uint64; +pub const DisplayFirmwareVersion_Uint64: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_DisplayFirmwareVersion_Uint64; +pub const IsOnDesktop_Bool: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_IsOnDesktop_Bool; +pub const DisplayMCType_Int32: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_DisplayMCType_Int32; +pub const DisplayMCOffset_Float: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_DisplayMCOffset_Float; +pub const DisplayMCScale_Float: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_DisplayMCScale_Float; +pub const EdidVendorID_Int32: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_EdidVendorID_Int32; +pub const DisplayMCImageLeft_String: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_DisplayMCImageLeft_String; +pub const DisplayMCImageRight_String: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_DisplayMCImageRight_String; +pub const DisplayGCBlackClamp_Float: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_DisplayGCBlackClamp_Float; +pub const EdidProductID_Int32: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_EdidProductID_Int32; +pub const CameraToHeadTransform_Matrix34: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_CameraToHeadTransform_Matrix34; +pub const DisplayGCType_Int32: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_DisplayGCType_Int32; +pub const DisplayGCOffset_Float: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_DisplayGCOffset_Float; +pub const DisplayGCScale_Float: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_DisplayGCScale_Float; +pub const DisplayGCPrescale_Float: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_DisplayGCPrescale_Float; +pub const DisplayGCImage_String: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_DisplayGCImage_String; +pub const LensCenterLeftU_Float: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_LensCenterLeftU_Float; +pub const LensCenterLeftV_Float: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_LensCenterLeftV_Float; +pub const LensCenterRightU_Float: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_LensCenterRightU_Float; +pub const LensCenterRightV_Float: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_LensCenterRightV_Float; +pub const UserHeadToEyeDepthMeters_Float: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_UserHeadToEyeDepthMeters_Float; +pub const CameraFirmwareVersion_Uint64: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_CameraFirmwareVersion_Uint64; +pub const CameraFirmwareDescription_String: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_CameraFirmwareDescription_String; +pub const DisplayFPGAVersion_Uint64: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_DisplayFPGAVersion_Uint64; +pub const DisplayBootloaderVersion_Uint64: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_DisplayBootloaderVersion_Uint64; +pub const DisplayHardwareVersion_Uint64: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_DisplayHardwareVersion_Uint64; +pub const AudioFirmwareVersion_Uint64: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_AudioFirmwareVersion_Uint64; +pub const CameraCompatibilityMode_Int32: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_CameraCompatibilityMode_Int32; +pub const ScreenshotHorizontalFieldOfViewDegrees_Float: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_ScreenshotHorizontalFieldOfViewDegrees_Float; +pub const ScreenshotVerticalFieldOfViewDegrees_Float: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_ScreenshotVerticalFieldOfViewDegrees_Float; +pub const DisplaySuppressed_Bool: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_DisplaySuppressed_Bool; +pub const DisplayAllowNightMode_Bool: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_DisplayAllowNightMode_Bool; +pub const DisplayMCImageWidth_Int32: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_DisplayMCImageWidth_Int32; +pub const DisplayMCImageHeight_Int32: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_DisplayMCImageHeight_Int32; +pub const DisplayMCImageNumChannels_Int32: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_DisplayMCImageNumChannels_Int32; +pub const DisplayMCImageData_Binary: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_DisplayMCImageData_Binary; +pub const SecondsFromPhotonsToVblank_Float: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_SecondsFromPhotonsToVblank_Float; +pub const DriverDirectModeSendsVsyncEvents_Bool: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_DriverDirectModeSendsVsyncEvents_Bool; +pub const DisplayDebugMode_Bool: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_DisplayDebugMode_Bool; +pub const GraphicsAdapterLuid_Uint64: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_GraphicsAdapterLuid_Uint64; +pub const AttachedDeviceId_String: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_AttachedDeviceId_String; +pub const SupportedButtons_Uint64: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_SupportedButtons_Uint64; pub const Axis0Type_Int32: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_Axis0Type_Int32; pub const Axis1Type_Int32: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_Axis1Type_Int32; pub const Axis2Type_Int32: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_Axis2Type_Int32; pub const Axis3Type_Int32: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_Axis3Type_Int32; pub const Axis4Type_Int32: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_Axis4Type_Int32; -pub const ControllerRoleHint_Int32: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_ControllerRoleHint_Int32; -pub const FieldOfViewLeftDegrees_Float: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_FieldOfViewLeftDegrees_Float; -pub const FieldOfViewRightDegrees_Float: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_FieldOfViewRightDegrees_Float; -pub const FieldOfViewTopDegrees_Float: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_FieldOfViewTopDegrees_Float; -pub const FieldOfViewBottomDegrees_Float: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_FieldOfViewBottomDegrees_Float; -pub const TrackingRangeMinimumMeters_Float: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_TrackingRangeMinimumMeters_Float; -pub const TrackingRangeMaximumMeters_Float: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_TrackingRangeMaximumMeters_Float; -pub const ModeLabel_String: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_ModeLabel_String; -pub const IconPathName_String: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_IconPathName_String; -pub const NamedIconPathDeviceOff_String: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_NamedIconPathDeviceOff_String; -pub const NamedIconPathDeviceSearching_String: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_NamedIconPathDeviceSearching_String; -pub const NamedIconPathDeviceSearchingAlert_String: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_NamedIconPathDeviceSearchingAlert_String; -pub const NamedIconPathDeviceReady_String: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_NamedIconPathDeviceReady_String; -pub const NamedIconPathDeviceReadyAlert_String: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_NamedIconPathDeviceReadyAlert_String; -pub const NamedIconPathDeviceNotReady_String: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_NamedIconPathDeviceNotReady_String; -pub const NamedIconPathDeviceStandby_String: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_NamedIconPathDeviceStandby_String; -pub const NamedIconPathDeviceAlertLow_String: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_NamedIconPathDeviceAlertLow_String; -pub const DisplayHiddenArea_Binary_Start: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_DisplayHiddenArea_Binary_Start; -pub const DisplayHiddenArea_Binary_End: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_DisplayHiddenArea_Binary_End; -pub const UserConfigPath_String: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_UserConfigPath_String; -pub const InstallPath_String: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_InstallPath_String; -pub const HasDisplayComponent_Bool: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_HasDisplayComponent_Bool; -pub const HasControllerComponent_Bool: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_HasControllerComponent_Bool; -pub const HasCameraComponent_Bool: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_HasCameraComponent_Bool; -pub const HasDriverDirectModeComponent_Bool: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_HasDriverDirectModeComponent_Bool; -pub const HasVirtualDisplayComponent_Bool: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_HasVirtualDisplayComponent_Bool; -pub const VendorSpecific_Reserved_Start: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_VendorSpecific_Reserved_Start; -pub const VendorSpecific_Reserved_End: TrackedDeviceProperty = sys::ETrackedDeviceProperty_Prop_VendorSpecific_Reserved_End; +pub const ControllerRoleHint_Int32: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_ControllerRoleHint_Int32; +pub const FieldOfViewLeftDegrees_Float: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_FieldOfViewLeftDegrees_Float; +pub const FieldOfViewRightDegrees_Float: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_FieldOfViewRightDegrees_Float; +pub const FieldOfViewTopDegrees_Float: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_FieldOfViewTopDegrees_Float; +pub const FieldOfViewBottomDegrees_Float: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_FieldOfViewBottomDegrees_Float; +pub const TrackingRangeMinimumMeters_Float: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_TrackingRangeMinimumMeters_Float; +pub const TrackingRangeMaximumMeters_Float: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_TrackingRangeMaximumMeters_Float; +pub const ModeLabel_String: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_ModeLabel_String; +pub const IconPathName_String: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_IconPathName_String; +pub const NamedIconPathDeviceOff_String: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_NamedIconPathDeviceOff_String; +pub const NamedIconPathDeviceSearching_String: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_NamedIconPathDeviceSearching_String; +pub const NamedIconPathDeviceSearchingAlert_String: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_NamedIconPathDeviceSearchingAlert_String; +pub const NamedIconPathDeviceReady_String: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_NamedIconPathDeviceReady_String; +pub const NamedIconPathDeviceReadyAlert_String: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_NamedIconPathDeviceReadyAlert_String; +pub const NamedIconPathDeviceNotReady_String: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_NamedIconPathDeviceNotReady_String; +pub const NamedIconPathDeviceStandby_String: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_NamedIconPathDeviceStandby_String; +pub const NamedIconPathDeviceAlertLow_String: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_NamedIconPathDeviceAlertLow_String; +pub const DisplayHiddenArea_Binary_Start: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_DisplayHiddenArea_Binary_Start; +pub const DisplayHiddenArea_Binary_End: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_DisplayHiddenArea_Binary_End; +pub const UserConfigPath_String: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_UserConfigPath_String; +pub const InstallPath_String: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_InstallPath_String; +pub const HasDisplayComponent_Bool: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_HasDisplayComponent_Bool; +pub const HasControllerComponent_Bool: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_HasControllerComponent_Bool; +pub const HasCameraComponent_Bool: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_HasCameraComponent_Bool; +pub const HasDriverDirectModeComponent_Bool: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_HasDriverDirectModeComponent_Bool; +pub const HasVirtualDisplayComponent_Bool: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_HasVirtualDisplayComponent_Bool; +pub const VendorSpecific_Reserved_Start: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_VendorSpecific_Reserved_Start; +pub const VendorSpecific_Reserved_End: TrackedDeviceProperty = + sys::ETrackedDeviceProperty_Prop_VendorSpecific_Reserved_End; diff --git a/src/render_models.rs b/src/render_models.rs index 47c962d..290430d 100644 --- a/src/render_models.rs +++ b/src/render_models.rs @@ -1,9 +1,9 @@ -use std::{fmt, ptr, slice, mem}; use std::ffi::{CStr, CString}; +use std::{fmt, mem, ptr, slice}; use openvr_sys as sys; -use {RenderModels, ControllerState, get_string}; +use {get_string, ControllerState, RenderModels}; impl RenderModels { /// Loads and returns a render model for use in the application. `name` should be a render model name from the @@ -13,11 +13,12 @@ impl RenderModels { /// it returns `Ok(Some(model))`. pub fn load_render_model(&self, name: &CStr) -> Result> { let mut ptr = ptr::null_mut(); - let r = unsafe { - self.0.LoadRenderModel_Async.unwrap()(name.as_ptr() as *mut _, &mut ptr) - }; + let r = unsafe { self.0.LoadRenderModel_Async.unwrap()(name.as_ptr() as *mut _, &mut ptr) }; match Error(r) { - error::NONE => Ok(Some(Model { ptr: ptr, sys: self.0 })), + error::NONE => Ok(Some(Model { + ptr: ptr, + sys: self.0, + })), error::LOADING => Ok(None), x => Err(x), } @@ -40,13 +41,24 @@ impl RenderModels { /// `component` does not correlate to a tracked device index, but is only used for iterating over all available /// components. If it's out of range, this function will return None. pub fn component_name(&self, model: &CStr, component: u32) -> Option { - unsafe { get_string(|ptr, n| self.0.GetComponentName.unwrap()(model.as_ptr() as *mut _, component, ptr, n)) } + unsafe { + get_string(|ptr, n| { + self.0.GetComponentName.unwrap()(model.as_ptr() as *mut _, component, ptr, n) + }) + } } /// Gets all component names of a given model - pub fn component_names(&self, model: &CStr) -> ::std::vec::IntoIter { // FIXME: impl Iterator rather than allocating + pub fn component_names(&self, model: &CStr) -> ::std::vec::IntoIter { + // FIXME: impl Iterator rather than allocating let n = self.component_count(model); - (0..n).map(|i| self.component_name(model, i).expect("inconsistent component presence reported by OpenVR")).collect::>().into_iter() + (0..n) + .map(|i| { + self.component_name(model, i) + .expect("inconsistent component presence reported by OpenVR") + }) + .collect::>() + .into_iter() } /// Use this to get the render model name for the specified rendermodel/component combination, to be passed to @@ -56,8 +68,14 @@ impl RenderModels { /// Otherwise, it will return the size of the buffer required for the name. pub fn component_render_model_name(&self, model: &CStr, component: &CStr) -> Option { unsafe { - get_string(|ptr, n| self.0.GetComponentRenderModelName.unwrap()( - model.as_ptr() as *mut _, component.as_ptr() as *mut _, ptr, n)) + get_string(|ptr, n| { + self.0.GetComponentRenderModelName.unwrap()( + model.as_ptr() as *mut _, + component.as_ptr() as *mut _, + ptr, + n, + ) + }) } } @@ -69,12 +87,22 @@ impl RenderModels { /// /// For dynamic controller components (ex: trigger) values will reflect component motions. /// For static components this will return a consistent value independent of the `ControllerState`. - pub fn component_state(&self, model: &CStr, component: &CStr, state: &ControllerState, mode: &ControllerMode) -> Option { + pub fn component_state( + &self, + model: &CStr, + component: &CStr, + state: &ControllerState, + mode: &ControllerMode, + ) -> Option { unsafe { let mut out = mem::uninitialized(); - if self.0.GetComponentState.unwrap()(model.as_ptr() as *mut _, component.as_ptr() as *mut _, - state as *const _ as *mut _, mode as *const _ as *mut _, - &mut out as *mut _ as *mut _) { + if self.0.GetComponentState.unwrap()( + model.as_ptr() as *mut _, + component.as_ptr() as *mut _, + state as *const _ as *mut _, + mode as *const _ as *mut _, + &mut out as *mut _ as *mut _, + ) { Some(out) } else { None @@ -89,11 +117,12 @@ impl RenderModels { /// returns `Ok(Some(texture))`. pub fn load_texture(&self, id: TextureId) -> Result> { let mut ptr = ptr::null_mut(); - let r = unsafe { - self.0.LoadTexture_Async.unwrap()(id, &mut ptr) - }; + let r = unsafe { self.0.LoadTexture_Async.unwrap()(id, &mut ptr) }; match Error(r) { - error::NONE => Ok(Some(Texture { ptr: ptr, sys: self.0 })), + error::NONE => Ok(Some(Texture { + ptr: ptr, + sys: self.0, + })), error::LOADING => Ok(None), x => Err(x), } @@ -108,17 +137,26 @@ pub mod error { pub const NONE: Error = Error(sys::EVRRenderModelError_VRRenderModelError_None); pub const LOADING: Error = Error(sys::EVRRenderModelError_VRRenderModelError_Loading); - pub const NOT_SUPPORTED: Error = Error(sys::EVRRenderModelError_VRRenderModelError_NotSupported); + pub const NOT_SUPPORTED: Error = + Error(sys::EVRRenderModelError_VRRenderModelError_NotSupported); pub const INVALID_ARG: Error = Error(sys::EVRRenderModelError_VRRenderModelError_InvalidArg); - pub const INVALID_MODEL: Error = Error(sys::EVRRenderModelError_VRRenderModelError_InvalidModel); + pub const INVALID_MODEL: Error = + Error(sys::EVRRenderModelError_VRRenderModelError_InvalidModel); pub const NO_SHAPES: Error = Error(sys::EVRRenderModelError_VRRenderModelError_NoShapes); - pub const MULTIPLE_SHAPES: Error = Error(sys::EVRRenderModelError_VRRenderModelError_MultipleShapes); - pub const TOO_MANY_VERTICES: Error = Error(sys::EVRRenderModelError_VRRenderModelError_TooManyVertices); - pub const MULTIPLE_TEXTURES: Error = Error(sys::EVRRenderModelError_VRRenderModelError_MultipleTextures); - pub const BUFFER_TOO_SMALL: Error = Error(sys::EVRRenderModelError_VRRenderModelError_BufferTooSmall); - pub const NOT_ENOUGH_NORMALS: Error = Error(sys::EVRRenderModelError_VRRenderModelError_NotEnoughNormals); - pub const NOT_ENOUGH_TEX_COORDS: Error = Error(sys::EVRRenderModelError_VRRenderModelError_NotEnoughTexCoords); - pub const INVALID_TEXTURE: Error = Error(sys::EVRRenderModelError_VRRenderModelError_InvalidTexture); + pub const MULTIPLE_SHAPES: Error = + Error(sys::EVRRenderModelError_VRRenderModelError_MultipleShapes); + pub const TOO_MANY_VERTICES: Error = + Error(sys::EVRRenderModelError_VRRenderModelError_TooManyVertices); + pub const MULTIPLE_TEXTURES: Error = + Error(sys::EVRRenderModelError_VRRenderModelError_MultipleTextures); + pub const BUFFER_TOO_SMALL: Error = + Error(sys::EVRRenderModelError_VRRenderModelError_BufferTooSmall); + pub const NOT_ENOUGH_NORMALS: Error = + Error(sys::EVRRenderModelError_VRRenderModelError_NotEnoughNormals); + pub const NOT_ENOUGH_TEX_COORDS: Error = + Error(sys::EVRRenderModelError_VRRenderModelError_NotEnoughTexCoords); + pub const INVALID_TEXTURE: Error = + Error(sys::EVRRenderModelError_VRRenderModelError_InvalidTexture); } impl fmt::Debug for Error { @@ -167,7 +205,10 @@ impl<'a> Model<'a> { pub fn vertices(&self) -> &[Vertex] { unsafe { let model = &*self.ptr; - slice::from_raw_parts(model.rVertexData as *mut Vertex, model.unVertexCount as usize) + slice::from_raw_parts( + model.rVertexData as *mut Vertex, + model.unVertexCount as usize, + ) } } @@ -180,12 +221,18 @@ impl<'a> Model<'a> { pub fn diffuse_texture_id(&self) -> Option { let id = unsafe { (&*self.ptr).diffuseTextureId }; - if id < 0 { None } else { Some(id) } + if id < 0 { + None + } else { + Some(id) + } } } impl<'a> Drop for Model<'a> { - fn drop(&mut self) { unsafe { self.sys.FreeRenderModel.unwrap()(self.ptr) } } + fn drop(&mut self) { + unsafe { self.sys.FreeRenderModel.unwrap()(self.ptr) } + } } pub struct Texture<'a> { @@ -203,13 +250,18 @@ impl<'a> Texture<'a> { pub fn data(&self) -> &[u8] { unsafe { let tex = &*self.ptr; - slice::from_raw_parts(tex.rubTextureMapData, tex.unWidth as usize * tex.unHeight as usize * 4) + slice::from_raw_parts( + tex.rubTextureMapData, + tex.unWidth as usize * tex.unHeight as usize * 4, + ) } } } impl<'a> Drop for Texture<'a> { - fn drop(&mut self) { unsafe { self.sys.FreeTexture.unwrap()(self.ptr) } } + fn drop(&mut self) { + unsafe { self.sys.FreeTexture.unwrap()(self.ptr) } + } } pub type TextureId = sys::TextureID_t; @@ -229,7 +281,11 @@ pub struct ControllerMode { } impl Default for ControllerMode { - fn default() -> Self { ControllerMode { scroll_wheel_visible: false } } + fn default() -> Self { + ControllerMode { + scroll_wheel_visible: false, + } + } } #[repr(C)] @@ -241,11 +297,21 @@ pub struct ComponentState { } impl ComponentState { - pub fn is_static(&self) -> bool { self.properties & component_properties::IS_STATIC != 0 } - pub fn is_visible(&self) -> bool { self.properties & component_properties::IS_VISIBLE != 0 } - pub fn is_touched(&self) -> bool { self.properties & component_properties::IS_TOUCHED != 0 } - pub fn is_pressed(&self) -> bool { self.properties & component_properties::IS_PRESSED != 0 } - pub fn is_scrolled(&self) -> bool { self.properties & component_properties::IS_SCROLLED != 0 } + pub fn is_static(&self) -> bool { + self.properties & component_properties::IS_STATIC != 0 + } + pub fn is_visible(&self) -> bool { + self.properties & component_properties::IS_VISIBLE != 0 + } + pub fn is_touched(&self) -> bool { + self.properties & component_properties::IS_TOUCHED != 0 + } + pub fn is_pressed(&self) -> bool { + self.properties & component_properties::IS_PRESSED != 0 + } + pub fn is_scrolled(&self) -> bool { + self.properties & component_properties::IS_SCROLLED != 0 + } } type ComponentProperties = sys::VRComponentProperties; @@ -253,25 +319,39 @@ type ComponentProperties = sys::VRComponentProperties; pub mod component_properties { use super::{sys, ComponentProperties}; - pub const IS_STATIC: ComponentProperties = sys::EVRComponentProperty_VRComponentProperty_IsStatic; - pub const IS_VISIBLE: ComponentProperties = sys::EVRComponentProperty_VRComponentProperty_IsVisible; - pub const IS_TOUCHED: ComponentProperties = sys::EVRComponentProperty_VRComponentProperty_IsTouched; - pub const IS_PRESSED: ComponentProperties = sys::EVRComponentProperty_VRComponentProperty_IsPressed; - pub const IS_SCROLLED: ComponentProperties = sys::EVRComponentProperty_VRComponentProperty_IsScrolled; + pub const IS_STATIC: ComponentProperties = + sys::EVRComponentProperty_VRComponentProperty_IsStatic as ComponentProperties; + pub const IS_VISIBLE: ComponentProperties = + sys::EVRComponentProperty_VRComponentProperty_IsVisible as ComponentProperties; + pub const IS_TOUCHED: ComponentProperties = + sys::EVRComponentProperty_VRComponentProperty_IsTouched as ComponentProperties; + pub const IS_PRESSED: ComponentProperties = + sys::EVRComponentProperty_VRComponentProperty_IsPressed as ComponentProperties; + pub const IS_SCROLLED: ComponentProperties = + sys::EVRComponentProperty_VRComponentProperty_IsScrolled as ComponentProperties; } pub mod component { pub mod controller { - use std::ffi::CStr; use openvr_sys as sys; + use std::ffi::CStr; // TODO: Real constants lazy_static! { - pub static ref GDC2015: &'static CStr = unsafe { CStr::from_bytes_with_nul_unchecked(sys::k_pch_Controller_Component_GDC2015) }; - pub static ref BASE: &'static CStr = unsafe { CStr::from_bytes_with_nul_unchecked(sys::k_pch_Controller_Component_Base) }; - pub static ref TIP: &'static CStr = unsafe { CStr::from_bytes_with_nul_unchecked(sys::k_pch_Controller_Component_Tip) }; - pub static ref HAND_GRIP: &'static CStr = unsafe { CStr::from_bytes_with_nul_unchecked(sys::k_pch_Controller_Component_HandGrip) }; - pub static ref STATUS: &'static CStr = unsafe { CStr::from_bytes_with_nul_unchecked(sys::k_pch_Controller_Component_Status) }; + pub static ref GDC2015: &'static CStr = unsafe { + CStr::from_bytes_with_nul_unchecked(sys::k_pch_Controller_Component_GDC2015) + }; + pub static ref BASE: &'static CStr = unsafe { + CStr::from_bytes_with_nul_unchecked(sys::k_pch_Controller_Component_Base) + }; + pub static ref TIP: &'static CStr = + unsafe { CStr::from_bytes_with_nul_unchecked(sys::k_pch_Controller_Component_Tip) }; + pub static ref HAND_GRIP: &'static CStr = unsafe { + CStr::from_bytes_with_nul_unchecked(sys::k_pch_Controller_Component_HandGrip) + }; + pub static ref STATUS: &'static CStr = unsafe { + CStr::from_bytes_with_nul_unchecked(sys::k_pch_Controller_Component_Status) + }; } } } diff --git a/src/system/event.rs b/src/system/event.rs index 91807cc..28b2ff3 100644 --- a/src/system/event.rs +++ b/src/system/event.rs @@ -11,11 +11,12 @@ pub struct EventInfo { } impl From for EventInfo { + #[allow(unused_unsafe)] fn from(x: sys::VREvent_t) -> Self { EventInfo { tracked_device_index: x.trackedDeviceIndex, age: x.eventAgeSeconds, - event: Event::from_sys(x.eventType, &x.data) + event: Event::from_sys(x.eventType as sys::EVREventType, unsafe { &x.data }), } } } @@ -34,7 +35,9 @@ pub struct Controller { impl FromEventData for Controller { unsafe fn from_event_data(x: &sys::VREvent_Data_t) -> Self { - Controller { button: x.controller.button } + Controller { + button: x.controller.button, + } } } @@ -49,23 +52,28 @@ pub struct Mouse { impl FromEventData for Mouse { unsafe fn from_event_data(x: &sys::VREvent_Data_t) -> Self { - Mouse { position: (x.mouse.x, x.mouse.y), button: x.mouse.button } + Mouse { + position: (x.mouse.x, x.mouse.y), + button: x.mouse.button, + } } } - #[derive(Debug, Copy, Clone)] /// Simulated mouse wheel scroll in overlay space /// /// Coordinates are fraction of the touchpad traversed since last scroll event. pub struct Scroll { pub delta: (f32, f32), - pub repeat_count: u32, + pub viewportscale: f32, } impl FromEventData for Scroll { unsafe fn from_event_data(x: &sys::VREvent_Data_t) -> Self { - Scroll { delta: (x.scroll.xdelta, x.scroll.ydelta), repeat_count: x.scroll.repeatCount } + Scroll { + delta: (x.scroll.xdelta, x.scroll.ydelta), + viewportscale: x.scroll.viewportscale, + } } } @@ -85,9 +93,12 @@ pub struct TouchPadMove { impl FromEventData for TouchPadMove { unsafe fn from_event_data(x: &sys::VREvent_Data_t) -> Self { - TouchPadMove { finger_down: x.touchPadMove.bFingerDown, seconds_finger_down: x.touchPadMove.flSecondsFingerDown, - first: (x.touchPadMove.fValueXFirst, x.touchPadMove.fValueYFirst), - raw: (x.touchPadMove.fValueXRaw, x.touchPadMove.fValueYRaw) } + TouchPadMove { + finger_down: x.touchPadMove.bFingerDown, + seconds_finger_down: x.touchPadMove.flSecondsFingerDown, + first: (x.touchPadMove.fValueXFirst, x.touchPadMove.fValueYFirst), + raw: (x.touchPadMove.fValueXRaw, x.touchPadMove.fValueYRaw), + } } } @@ -107,7 +118,11 @@ pub struct Process { impl FromEventData for Process { unsafe fn from_event_data(x: &sys::VREvent_Data_t) -> Self { - Process { pid: x.process.pid, old_pid: x.process.oldPid, forced: x.process.bForced } + Process { + pid: x.process.pid, + old_pid: x.process.oldPid, + forced: x.process.bForced, + } } } @@ -118,7 +133,9 @@ pub struct Overlay { impl FromEventData for Overlay { unsafe fn from_event_data(x: &sys::VREvent_Data_t) -> Self { - Overlay { overlay_handle: x.overlay.overlayHandle } + Overlay { + overlay_handle: x.overlay.overlayHandle, + } } } @@ -136,7 +153,10 @@ pub struct Keyboard { impl FromEventData for Keyboard { unsafe fn from_event_data(x: &sys::VREvent_Data_t) -> Self { let x = &*(&x.keyboard as *const _ as *const sys::VREvent_Keyboard_t_real); - Keyboard { new_input: *(x.cNewInput.as_ptr() as *const _), user_value: x.uUserValue } + Keyboard { + new_input: *(x.cNewInput.as_ptr() as *const _), + user_value: x.uUserValue, + } } } @@ -182,22 +202,31 @@ pub enum Event { WatchdogWakeUpRequested, LensDistortionChanged, PropertyChanged(Property), - + WirelessDisconnect, + WirelessReconnect, ButtonPress(Controller), ButtonUnpress(Controller), ButtonTouch(Controller), ButtonUntouch(Controller), - + DualAnalog_Press, + DualAnalog_Unpress, + DualAnalog_Touch, + DualAnalog_Untouch, + DualAnalog_Move, + DualAnalog_ModeSwitch1, + DualAnalog_ModeSwitch2, + DualAnalog_Cancel, MouseMove(Mouse), MouseButtonDown(Mouse), MouseButtonUp(Mouse), FocusEnter(Overlay), FocusLeave(Overlay), - Scroll(Scroll), + ScrollDiscrete(Scroll), TouchPadMove(TouchPadMove), /// global event OverlayFocusChanged(Overlay), - + ReloadOverlays, + ScrollSmooth(Scroll), #[deprecated] InputFocusCaptured(Process), #[deprecated] @@ -210,19 +239,19 @@ pub enum Event { SceneFocusChanged(Process), InputFocusChanged(Process), SceneApplicationSecondaryRenderingStarted(Process), - + SceneApplicationUsingWrongGraphicsAdapter, + ActionBindingReloaded, /// Sent to the scene application to request hiding render models temporarily HideRenderModels, /// Sent to the scene application to request restoring render model visibility ShowRenderModels, - + ConsoleOpened, + ConsoleClosed, OverlayShown, OverlayHidden, DashboardActivated, DashboardDeactivated, /// Sent to the overlay manager - data is overlay - DashboardThumbSelected, - /// Sent to the overlay manager - data is overlay DashboardRequested, /// Send to the overlay manager ResetDashboard, @@ -239,14 +268,12 @@ pub enum Event { /// Send to an overlay when it previously had focus and IVROverlay::SetFocusOverlay is called on something else OverlayGamepadFocusLost, OverlaySharedTextureChanged, - DashboardGuideButtonDown, - DashboardGuideButtonUp, /// Screenshot button combo was pressed, Dashboard should request a screenshot ScreenshotTriggered, /// Sent to overlays when a SetOverlayRaw or SetOverlayfromFail fails to load ImageFailed, DashboardOverlayCreated, - + SwitchGamepadFocus, /// Sent by vrclient application to compositor to take a screenshot RequestScreenshot, /// Sent by compositor to the application that the screenshot has been taken @@ -257,14 +284,15 @@ pub enum Event { SubmitScreenshotToDashboard, /// Sent by compositor to the dashboard that a completed screenshot was submitted ScreenshotProgressToDashboard, - PrimaryDashboardDeviceChanged, - + RoomViewShown, + RoomViewHidden, + ShowUI, + ShowDevTools, Notification_Shown, Notification_Hidden, Notification_BeginInteraction, Notification_Destroyed, - /// The application has been asked to quit Quit(Process), ProcessQuit(Process), @@ -272,34 +300,44 @@ pub enum Event { QuitAcknowledged(Process), /// The driver has requested that SteamVR shut down DriverRequestedQuit, - + RestartRequested, ChaperoneDataHasChanged, ChaperoneUniverseHasChanged, ChaperoneTempDataHasChanged, ChaperoneSettingsHaveChanged, SeatedZeroPoseReset, - + ChaperoneFlushCache, + ChaperoneRoomSetupStarting, + ChaperoneRoomSetupFinished, AudioSettingsHaveChanged, - BackgroundSettingHasChanged, CameraSettingsHaveChanged, ReprojectionSettingHasChanged, ModelSkinSettingsHaveChanged, EnvironmentSettingsHaveChanged, + EnableHomeAppSettingsHaveChanged, PowerSettingsHaveChanged, - + SteamVRSectionSettingChanged, + LighthouseSectionSettingChanged, + NullSectionSettingChanged, + UserInterfaceSectionSettingChanged, + NotificationsSectionSettingChanged, + KeyboardSectionSettingChanged, + PerfSectionSettingChanged, + DashboardSectionSettingChanged, + WebInterfaceSectionSettingChanged, + TrackersSectionSettingChanged, + LastKnownSectionSettingChanged, + DismissedWarningsSectionSettingChanged, StatusUpdate, - + WebInterface_InstallDriverCompleted, MCImageUpdated, - FirmwareUpdateStarted, FirmwareUpdateFinished, - KeyboardClosed, KeyboardCharInput(Keyboard), /// Sent when DONE button clicked on keyboard KeyboardDone, - ApplicationTransitionStarted, ApplicationTransitionAborted, ApplicationTransitionNewAppStarted, @@ -308,30 +346,46 @@ pub enum Event { ApplicationTransitionNewAppLaunchComplete, ProcessConnected, ProcessDisconnected, - Compositor_MirrorWindowShown, Compositor_MirrorWindowHidden, Compositor_ChaperoneBoundsShown, Compositor_ChaperoneBoundsHidden, - + Compositor_DisplayDisconnected, + Compositor_DisplayReconnected, + Compositor_HDCPError, + Compositor_ApplicationNotResponding, + Compositor_ApplicationResumed, + Compositor_OutOfVideoMemory, TrackedCamera_StartVideoStream, TrackedCamera_StopVideoStream, TrackedCamera_PauseVideoStream, TrackedCamera_ResumeVideoStream, TrackedCamera_EditingSurface, - PerformanceTest_EnableCapture, PerformanceTest_DisableCapture, PerformanceTest_FidelityLevel, - MessageOverlay_Closed, + MessageOverlayCloseRequested, + Input_HapticVibration, + Input_BindingLoadFailed, + Input_BindingLoadSuccessful, + Input_ActionManifestReloaded, + Input_ActionManifestLoadFailed, + Input_ProgressUpdate, + Input_TrackerActivated, + Input_BindingsUpdated, + SpatialAnchors_PoseUpdated, + SpatialAnchors_DescriptorUpdated, + SpatialAnchors_RequestPoseUpdate, + SpatialAnchors_RequestDescriptorUpdate, + SystemReport_Started, - VendorSpecific(u32), - Unknown(u32), + VendorSpecific(sys::EVREventType), + Unknown(sys::EVREventType), } impl Event { - fn from_sys(ty: u32, data: &sys::VREvent_Data_t) -> Self { + fn from_sys(ty: sys::EVREventType, data: &sys::VREvent_Data_t) -> Self { use self::Event::*; fn get(x: &sys::VREvent_Data_t) -> T { @@ -343,8 +397,12 @@ impl Event { sys::EVREventType_VREvent_TrackedDeviceActivated => TrackedDeviceActivated, sys::EVREventType_VREvent_TrackedDeviceDeactivated => TrackedDeviceDeactivated, sys::EVREventType_VREvent_TrackedDeviceUpdated => TrackedDeviceUpdated, - sys::EVREventType_VREvent_TrackedDeviceUserInteractionStarted => TrackedDeviceUserInteractionStarted, - sys::EVREventType_VREvent_TrackedDeviceUserInteractionEnded => TrackedDeviceUserInteractionEnded, + sys::EVREventType_VREvent_TrackedDeviceUserInteractionStarted => { + TrackedDeviceUserInteractionStarted + } + sys::EVREventType_VREvent_TrackedDeviceUserInteractionEnded => { + TrackedDeviceUserInteractionEnded + } sys::EVREventType_VREvent_IpdChanged => IpdChanged, sys::EVREventType_VREvent_EnterStandbyMode => EnterStandbyMode, sys::EVREventType_VREvent_LeaveStandbyMode => LeaveStandbyMode, @@ -352,18 +410,30 @@ impl Event { sys::EVREventType_VREvent_WatchdogWakeUpRequested => WatchdogWakeUpRequested, sys::EVREventType_VREvent_LensDistortionChanged => LensDistortionChanged, sys::EVREventType_VREvent_PropertyChanged => PropertyChanged(get(data)), + sys::EVREventType_VREvent_WirelessDisconnect => WirelessDisconnect, + sys::EVREventType_VREvent_WirelessReconnect => WirelessReconnect, sys::EVREventType_VREvent_ButtonPress => ButtonPress(get(data)), sys::EVREventType_VREvent_ButtonUnpress => ButtonUnpress(get(data)), sys::EVREventType_VREvent_ButtonTouch => ButtonTouch(get(data)), sys::EVREventType_VREvent_ButtonUntouch => ButtonUntouch(get(data)), + sys::EVREventType_VREvent_DualAnalog_Press => DualAnalog_Press, + sys::EVREventType_VREvent_DualAnalog_Unpress => DualAnalog_Unpress, + sys::EVREventType_VREvent_DualAnalog_Touch => DualAnalog_Touch, + sys::EVREventType_VREvent_DualAnalog_Untouch => DualAnalog_Untouch, + sys::EVREventType_VREvent_DualAnalog_Move => DualAnalog_Move, + sys::EVREventType_VREvent_DualAnalog_ModeSwitch1 => DualAnalog_ModeSwitch1, + sys::EVREventType_VREvent_DualAnalog_ModeSwitch2 => DualAnalog_ModeSwitch2, + sys::EVREventType_VREvent_DualAnalog_Cancel => DualAnalog_Cancel, sys::EVREventType_VREvent_MouseMove => MouseMove(get(data)), sys::EVREventType_VREvent_MouseButtonDown => MouseButtonDown(get(data)), sys::EVREventType_VREvent_MouseButtonUp => MouseButtonUp(get(data)), sys::EVREventType_VREvent_FocusEnter => FocusEnter(get(data)), sys::EVREventType_VREvent_FocusLeave => FocusLeave(get(data)), - sys::EVREventType_VREvent_Scroll => Scroll(get(data)), + sys::EVREventType_VREvent_ScrollDiscrete => ScrollDiscrete(get(data)), sys::EVREventType_VREvent_TouchPadMove => TouchPadMove(get(data)), sys::EVREventType_VREvent_OverlayFocusChanged => OverlayFocusChanged(get(data)), + sys::EVREventType_VREvent_ReloadOverlays => ReloadOverlays, + sys::EVREventType_VREvent_ScrollSmooth => ScrollSmooth(get(data)), sys::EVREventType_VREvent_InputFocusCaptured => InputFocusCaptured(get(data)), sys::EVREventType_VREvent_InputFocusReleased => InputFocusReleased(get(data)), sys::EVREventType_VREvent_SceneFocusLost => SceneFocusLost(get(data)), @@ -371,14 +441,21 @@ impl Event { sys::EVREventType_VREvent_SceneApplicationChanged => SceneApplicationChanged(get(data)), sys::EVREventType_VREvent_SceneFocusChanged => SceneFocusChanged(get(data)), sys::EVREventType_VREvent_InputFocusChanged => InputFocusChanged(get(data)), - sys::EVREventType_VREvent_SceneApplicationSecondaryRenderingStarted => SceneApplicationSecondaryRenderingStarted(get(data)), + sys::EVREventType_VREvent_SceneApplicationSecondaryRenderingStarted => { + SceneApplicationSecondaryRenderingStarted(get(data)) + } + sys::EVREventType_VREvent_SceneApplicationUsingWrongGraphicsAdapter => { + SceneApplicationUsingWrongGraphicsAdapter + } + sys::EVREventType_VREvent_ActionBindingReloaded => ActionBindingReloaded, sys::EVREventType_VREvent_HideRenderModels => HideRenderModels, sys::EVREventType_VREvent_ShowRenderModels => ShowRenderModels, + sys::EVREventType_VREvent_ConsoleOpened => ConsoleOpened, + sys::EVREventType_VREvent_ConsoleClosed => ConsoleClosed, sys::EVREventType_VREvent_OverlayShown => OverlayShown, sys::EVREventType_VREvent_OverlayHidden => OverlayHidden, sys::EVREventType_VREvent_DashboardActivated => DashboardActivated, sys::EVREventType_VREvent_DashboardDeactivated => DashboardDeactivated, - sys::EVREventType_VREvent_DashboardThumbSelected => DashboardThumbSelected, sys::EVREventType_VREvent_DashboardRequested => DashboardRequested, sys::EVREventType_VREvent_ResetDashboard => ResetDashboard, sys::EVREventType_VREvent_RenderToast => RenderToast, @@ -388,39 +465,92 @@ impl Event { sys::EVREventType_VREvent_OverlayGamepadFocusGained => OverlayGamepadFocusGained, sys::EVREventType_VREvent_OverlayGamepadFocusLost => OverlayGamepadFocusLost, sys::EVREventType_VREvent_OverlaySharedTextureChanged => OverlaySharedTextureChanged, - sys::EVREventType_VREvent_DashboardGuideButtonDown => DashboardGuideButtonDown, - sys::EVREventType_VREvent_DashboardGuideButtonUp => DashboardGuideButtonUp, sys::EVREventType_VREvent_ScreenshotTriggered => ScreenshotTriggered, sys::EVREventType_VREvent_ImageFailed => ImageFailed, sys::EVREventType_VREvent_DashboardOverlayCreated => DashboardOverlayCreated, + sys::EVREventType_VREvent_SwitchGamepadFocus => SwitchGamepadFocus, sys::EVREventType_VREvent_RequestScreenshot => RequestScreenshot, sys::EVREventType_VREvent_ScreenshotTaken => ScreenshotTaken, sys::EVREventType_VREvent_ScreenshotFailed => ScreenshotFailed, sys::EVREventType_VREvent_SubmitScreenshotToDashboard => SubmitScreenshotToDashboard, - sys::EVREventType_VREvent_ScreenshotProgressToDashboard => ScreenshotProgressToDashboard, - sys::EVREventType_VREvent_PrimaryDashboardDeviceChanged => PrimaryDashboardDeviceChanged, + sys::EVREventType_VREvent_ScreenshotProgressToDashboard => { + ScreenshotProgressToDashboard + } + sys::EVREventType_VREvent_PrimaryDashboardDeviceChanged => { + PrimaryDashboardDeviceChanged + } + sys::EVREventType_VREvent_RoomViewShown => RoomViewShown, + sys::EVREventType_VREvent_RoomViewHidden => RoomViewHidden, + sys::EVREventType_VREvent_ShowUI => ShowUI, + sys::EVREventType_VREvent_ShowDevTools => ShowDevTools, sys::EVREventType_VREvent_Notification_Shown => Notification_Shown, sys::EVREventType_VREvent_Notification_Hidden => Notification_Hidden, - sys::EVREventType_VREvent_Notification_BeginInteraction => Notification_BeginInteraction, + sys::EVREventType_VREvent_Notification_BeginInteraction => { + Notification_BeginInteraction + } sys::EVREventType_VREvent_Notification_Destroyed => Notification_Destroyed, sys::EVREventType_VREvent_Quit => Quit(get(data)), sys::EVREventType_VREvent_ProcessQuit => ProcessQuit(get(data)), sys::EVREventType_VREvent_QuitAborted_UserPrompt => QuitAborted_UserPrompt(get(data)), sys::EVREventType_VREvent_QuitAcknowledged => QuitAcknowledged(get(data)), sys::EVREventType_VREvent_DriverRequestedQuit => DriverRequestedQuit, + sys::EVREventType_VREvent_RestartRequested => RestartRequested, sys::EVREventType_VREvent_ChaperoneDataHasChanged => ChaperoneDataHasChanged, sys::EVREventType_VREvent_ChaperoneUniverseHasChanged => ChaperoneUniverseHasChanged, sys::EVREventType_VREvent_ChaperoneTempDataHasChanged => ChaperoneTempDataHasChanged, sys::EVREventType_VREvent_ChaperoneSettingsHaveChanged => ChaperoneSettingsHaveChanged, sys::EVREventType_VREvent_SeatedZeroPoseReset => SeatedZeroPoseReset, + sys::EVREventType_VREvent_ChaperoneFlushCache => ChaperoneFlushCache, + sys::EVREventType_VREvent_ChaperoneRoomSetupStarting => ChaperoneRoomSetupStarting, + sys::EVREventType_VREvent_ChaperoneRoomSetupFinished => ChaperoneRoomSetupFinished, sys::EVREventType_VREvent_AudioSettingsHaveChanged => AudioSettingsHaveChanged, sys::EVREventType_VREvent_BackgroundSettingHasChanged => BackgroundSettingHasChanged, sys::EVREventType_VREvent_CameraSettingsHaveChanged => CameraSettingsHaveChanged, - sys::EVREventType_VREvent_ReprojectionSettingHasChanged => ReprojectionSettingHasChanged, + sys::EVREventType_VREvent_ReprojectionSettingHasChanged => { + ReprojectionSettingHasChanged + } sys::EVREventType_VREvent_ModelSkinSettingsHaveChanged => ModelSkinSettingsHaveChanged, - sys::EVREventType_VREvent_EnvironmentSettingsHaveChanged => EnvironmentSettingsHaveChanged, + sys::EVREventType_VREvent_EnvironmentSettingsHaveChanged => { + EnvironmentSettingsHaveChanged + } sys::EVREventType_VREvent_PowerSettingsHaveChanged => PowerSettingsHaveChanged, + sys::EVREventType_VREvent_EnableHomeAppSettingsHaveChanged => { + EnableHomeAppSettingsHaveChanged + } + sys::EVREventType_VREvent_SteamVRSectionSettingChanged => SteamVRSectionSettingChanged, + sys::EVREventType_VREvent_LighthouseSectionSettingChanged => { + LighthouseSectionSettingChanged + } + sys::EVREventType_VREvent_NullSectionSettingChanged => NullSectionSettingChanged, + sys::EVREventType_VREvent_UserInterfaceSectionSettingChanged => { + UserInterfaceSectionSettingChanged + } + sys::EVREventType_VREvent_NotificationsSectionSettingChanged => { + NotificationsSectionSettingChanged + } + sys::EVREventType_VREvent_KeyboardSectionSettingChanged => { + KeyboardSectionSettingChanged + } + sys::EVREventType_VREvent_PerfSectionSettingChanged => PerfSectionSettingChanged, + sys::EVREventType_VREvent_DashboardSectionSettingChanged => { + DashboardSectionSettingChanged + } + sys::EVREventType_VREvent_WebInterfaceSectionSettingChanged => { + WebInterfaceSectionSettingChanged + } + sys::EVREventType_VREvent_TrackersSectionSettingChanged => { + TrackersSectionSettingChanged + } + sys::EVREventType_VREvent_LastKnownSectionSettingChanged => { + LastKnownSectionSettingChanged + } + sys::EVREventType_VREvent_DismissedWarningsSectionSettingChanged => { + DismissedWarningsSectionSettingChanged + } sys::EVREventType_VREvent_StatusUpdate => StatusUpdate, + sys::EVREventType_VREvent_WebInterface_InstallDriverCompleted => { + WebInterface_InstallDriverCompleted + } sys::EVREventType_VREvent_MCImageUpdated => MCImageUpdated, sys::EVREventType_VREvent_FirmwareUpdateStarted => FirmwareUpdateStarted, sys::EVREventType_VREvent_FirmwareUpdateFinished => FirmwareUpdateFinished, @@ -429,27 +559,90 @@ impl Event { sys::EVREventType_VREvent_KeyboardDone => KeyboardDone, sys::EVREventType_VREvent_ApplicationTransitionStarted => ApplicationTransitionStarted, sys::EVREventType_VREvent_ApplicationTransitionAborted => ApplicationTransitionAborted, - sys::EVREventType_VREvent_ApplicationTransitionNewAppStarted => ApplicationTransitionNewAppStarted, + sys::EVREventType_VREvent_ApplicationTransitionNewAppStarted => { + ApplicationTransitionNewAppStarted + } sys::EVREventType_VREvent_ApplicationListUpdated => ApplicationListUpdated, sys::EVREventType_VREvent_ApplicationMimeTypeLoad => ApplicationMimeTypeLoad, - sys::EVREventType_VREvent_ApplicationTransitionNewAppLaunchComplete => ApplicationTransitionNewAppLaunchComplete, + sys::EVREventType_VREvent_ApplicationTransitionNewAppLaunchComplete => { + ApplicationTransitionNewAppLaunchComplete + } sys::EVREventType_VREvent_ProcessConnected => ProcessConnected, sys::EVREventType_VREvent_ProcessDisconnected => ProcessDisconnected, sys::EVREventType_VREvent_Compositor_MirrorWindowShown => Compositor_MirrorWindowShown, - sys::EVREventType_VREvent_Compositor_MirrorWindowHidden => Compositor_MirrorWindowHidden, - sys::EVREventType_VREvent_Compositor_ChaperoneBoundsShown => Compositor_ChaperoneBoundsShown, - sys::EVREventType_VREvent_Compositor_ChaperoneBoundsHidden => Compositor_ChaperoneBoundsHidden, - sys::EVREventType_VREvent_TrackedCamera_StartVideoStream => TrackedCamera_StartVideoStream, - sys::EVREventType_VREvent_TrackedCamera_StopVideoStream => TrackedCamera_StopVideoStream, - sys::EVREventType_VREvent_TrackedCamera_PauseVideoStream => TrackedCamera_PauseVideoStream, - sys::EVREventType_VREvent_TrackedCamera_ResumeVideoStream => TrackedCamera_ResumeVideoStream, + sys::EVREventType_VREvent_Compositor_MirrorWindowHidden => { + Compositor_MirrorWindowHidden + } + sys::EVREventType_VREvent_Compositor_ChaperoneBoundsShown => { + Compositor_ChaperoneBoundsShown + } + sys::EVREventType_VREvent_Compositor_ChaperoneBoundsHidden => { + Compositor_ChaperoneBoundsHidden + } + sys::EVREventType_VREvent_Compositor_DisplayDisconnected => { + Compositor_DisplayDisconnected + } + sys::EVREventType_VREvent_Compositor_DisplayReconnected => { + Compositor_DisplayReconnected + } + sys::EVREventType_VREvent_Compositor_HDCPError => Compositor_HDCPError, + sys::EVREventType_VREvent_Compositor_ApplicationNotResponding => { + Compositor_ApplicationNotResponding + } + sys::EVREventType_VREvent_Compositor_ApplicationResumed => { + Compositor_ApplicationResumed + } + sys::EVREventType_VREvent_Compositor_OutOfVideoMemory => Compositor_OutOfVideoMemory, + sys::EVREventType_VREvent_TrackedCamera_StartVideoStream => { + TrackedCamera_StartVideoStream + } + sys::EVREventType_VREvent_TrackedCamera_StopVideoStream => { + TrackedCamera_StopVideoStream + } + sys::EVREventType_VREvent_TrackedCamera_PauseVideoStream => { + TrackedCamera_PauseVideoStream + } + sys::EVREventType_VREvent_TrackedCamera_ResumeVideoStream => { + TrackedCamera_ResumeVideoStream + } sys::EVREventType_VREvent_TrackedCamera_EditingSurface => TrackedCamera_EditingSurface, - sys::EVREventType_VREvent_PerformanceTest_EnableCapture => PerformanceTest_EnableCapture, - sys::EVREventType_VREvent_PerformanceTest_DisableCapture => PerformanceTest_DisableCapture, - sys::EVREventType_VREvent_PerformanceTest_FidelityLevel => PerformanceTest_FidelityLevel, + sys::EVREventType_VREvent_PerformanceTest_EnableCapture => { + PerformanceTest_EnableCapture + } + sys::EVREventType_VREvent_PerformanceTest_DisableCapture => { + PerformanceTest_DisableCapture + } + sys::EVREventType_VREvent_PerformanceTest_FidelityLevel => { + PerformanceTest_FidelityLevel + } sys::EVREventType_VREvent_MessageOverlay_Closed => MessageOverlay_Closed, + sys::EVREventType_VREvent_MessageOverlayCloseRequested => MessageOverlayCloseRequested, + sys::EVREventType_VREvent_Input_HapticVibration => Input_HapticVibration, + sys::EVREventType_VREvent_Input_BindingLoadFailed => Input_BindingLoadFailed, + sys::EVREventType_VREvent_Input_BindingLoadSuccessful => Input_BindingLoadSuccessful, + sys::EVREventType_VREvent_Input_ActionManifestReloaded => Input_ActionManifestReloaded, + sys::EVREventType_VREvent_Input_ActionManifestLoadFailed => { + Input_ActionManifestLoadFailed + } + sys::EVREventType_VREvent_Input_ProgressUpdate => Input_ProgressUpdate, + sys::EVREventType_VREvent_Input_TrackerActivated => Input_TrackerActivated, + sys::EVREventType_VREvent_Input_BindingsUpdated => Input_BindingsUpdated, + sys::EVREventType_VREvent_SpatialAnchors_PoseUpdated => SpatialAnchors_PoseUpdated, + sys::EVREventType_VREvent_SpatialAnchors_DescriptorUpdated => { + SpatialAnchors_DescriptorUpdated + } + sys::EVREventType_VREvent_SpatialAnchors_RequestPoseUpdate => { + SpatialAnchors_RequestPoseUpdate + } + sys::EVREventType_VREvent_SpatialAnchors_RequestDescriptorUpdate => { + SpatialAnchors_RequestDescriptorUpdate + } + sys::EVREventType_VREvent_SystemReport_Started => SystemReport_Started, x if x >= sys::EVREventType_VREvent_VendorSpecific_Reserved_Start - && x <= sys::EVREventType_VREvent_VendorSpecific_Reserved_End => VendorSpecific(x), + && x <= sys::EVREventType_VREvent_VendorSpecific_Reserved_End => + { + VendorSpecific(x) + } x => Unknown(x), } } diff --git a/src/system/mod.rs b/src/system/mod.rs index 4470f28..108cb86 100644 --- a/src/system/mod.rs +++ b/src/system/mod.rs @@ -1,9 +1,9 @@ //! The `System` interface provides access to display configuration information, tracking data, controller state, //! events, and device properties. It is the main interface of OpenVR. -use std::{mem, slice, ptr}; use std::ffi::CString; use std::marker::PhantomData; +use std::{mem, ptr, slice}; use openvr_sys as sys; @@ -38,7 +38,13 @@ impl System { pub fn projection_raw(&self, eye: Eye) -> RawProjection { unsafe { let mut result: RawProjection = mem::uninitialized(); - self.0.GetProjectionRaw.unwrap()(eye as sys::EVREye, &mut result.left, &mut result.right, &mut result.top, &mut result.bottom); + self.0.GetProjectionRaw.unwrap()( + eye as sys::EVREye, + &mut result.left, + &mut result.right, + &mut result.top, + &mut result.bottom, + ); result } } @@ -79,11 +85,19 @@ impl System { /// to the chaperone soft bounds. TrackingUniverseRawAndUncalibrated should probably not be used unless the /// application is the chaperone calibration tool itself, but will provide poses relative to the hardware-specific /// coordinate system in the driver. - pub fn device_to_absolute_tracking_pose(&self, origin: TrackingUniverseOrigin, predicted_seconds_to_photons_from_now: f32) -> TrackedDevicePoses { + pub fn device_to_absolute_tracking_pose( + &self, + origin: TrackingUniverseOrigin, + predicted_seconds_to_photons_from_now: f32, + ) -> TrackedDevicePoses { unsafe { let mut result: TrackedDevicePoses = mem::uninitialized(); - self.0.GetDeviceToAbsoluteTrackingPose.unwrap()(origin as sys::ETrackingUniverseOrigin, predicted_seconds_to_photons_from_now, - result.as_mut().as_mut_ptr() as *mut _, result.len() as u32); + self.0.GetDeviceToAbsoluteTrackingPose.unwrap()( + origin as sys::ETrackingUniverseOrigin, + predicted_seconds_to_photons_from_now, + result.as_mut().as_mut_ptr() as *mut _, + result.len() as u32, + ); result } } @@ -105,13 +119,20 @@ impl System { unsafe { self.0.IsTrackedDeviceConnected.unwrap()(index) } } - pub fn poll_next_event_with_pose(&self, origin: TrackingUniverseOrigin) -> Option<(EventInfo, TrackedDevicePose)> { + pub fn poll_next_event_with_pose( + &self, + origin: TrackingUniverseOrigin, + ) -> Option<(EventInfo, TrackedDevicePose)> { let mut event = unsafe { mem::uninitialized() }; let mut pose = unsafe { mem::uninitialized() }; - if unsafe { self.0.PollNextEventWithPose.unwrap()(origin as sys::ETrackingUniverseOrigin, - &mut event, mem::size_of_val(&event) as u32, - &mut pose as *mut _ as *mut _) } - { + if unsafe { + self.0.PollNextEventWithPose.unwrap()( + origin as sys::ETrackingUniverseOrigin, + &mut event, + mem::size_of_val(&event) as u32, + &mut pose as *mut _ as *mut _, + ) + } { Some((event.into(), pose)) } else { None @@ -122,12 +143,9 @@ impl System { /// Gets the result of a single distortion value for use in a distortion map. Input UVs are in a single eye's viewport, and output UVs are for the source render target in the distortion shader. pub fn compute_distortion(&self, eye: Eye, u: f32, v: f32) -> Option { let mut coord = unsafe { mem::uninitialized() }; - let success = unsafe { self.0.ComputeDistortion.unwrap()( - eye as sys::EVREye, - u, v, - &mut coord - ) }; - + let success = + unsafe { self.0.ComputeDistortion.unwrap()(eye as sys::EVREye, u, v, &mut coord) }; + if !success { return None; } @@ -135,78 +153,154 @@ impl System { Some(DistortionCoordinates { red: coord.rfRed, blue: coord.rfBlue, - green: coord.rfGreen + green: coord.rfGreen, }) } /// Returns the device index associated with a specific role, for example the left hand or the right hand. - pub fn tracked_device_index_for_controller_role(&self, role: TrackedControllerRole) -> Option { - let x = unsafe { self.0.GetTrackedDeviceIndexForControllerRole.unwrap()(role as sys::ETrackedControllerRole) }; - if x == tracked_device_index::INVALID { None } else { Some(x) } + pub fn tracked_device_index_for_controller_role( + &self, + role: TrackedControllerRole, + ) -> Option { + let x = unsafe { + self.0.GetTrackedDeviceIndexForControllerRole.unwrap()( + role as sys::ETrackedControllerRole, + ) + }; + if x == tracked_device_index::INVALID { + None + } else { + Some(x) + } } /// Returns the controller type associated with a device index. - pub fn get_controller_role_for_tracked_device_index(&self, i: TrackedDeviceIndex) -> Option { + pub fn get_controller_role_for_tracked_device_index( + &self, + i: TrackedDeviceIndex, + ) -> Option { let x = unsafe { self.0.GetControllerRoleForTrackedDeviceIndex.unwrap()(i) }; match x { - sys::ETrackedControllerRole_TrackedControllerRole_LeftHand => Some(TrackedControllerRole::LeftHand), - sys::ETrackedControllerRole_TrackedControllerRole_RightHand => Some(TrackedControllerRole::RightHand), + sys::ETrackedControllerRole_TrackedControllerRole_LeftHand => { + Some(TrackedControllerRole::LeftHand) + } + sys::ETrackedControllerRole_TrackedControllerRole_RightHand => { + Some(TrackedControllerRole::RightHand) + } _ => None, } } - pub fn vulkan_output_device(&self, instance: *mut VkInstance_T) -> Option<*mut VkPhysicalDevice_T> { + pub fn vulkan_output_device( + &self, + instance: *mut VkInstance_T, + ) -> Option<*mut VkPhysicalDevice_T> { unsafe { let mut device = mem::uninitialized(); - self.0.GetOutputDevice.unwrap()(&mut device, sys::ETextureType_TextureType_Vulkan, instance); - if device == 0 { None } else { Some(device as usize as *mut _) } + self.0.GetOutputDevice.unwrap()( + &mut device, + sys::ETextureType_TextureType_Vulkan, + instance, + ); + if device == 0 { + None + } else { + Some(device as usize as *mut _) + } } } - pub fn bool_tracked_device_property(&self, device: TrackedDeviceIndex, property: TrackedDeviceProperty) -> Result { + pub fn bool_tracked_device_property( + &self, + device: TrackedDeviceIndex, + property: TrackedDeviceProperty, + ) -> Result { unsafe { let mut error: TrackedPropertyError = mem::uninitialized(); let r = self.0.GetBoolTrackedDeviceProperty.unwrap()(device, property, &mut error.0); - if error == tracked_property_error::SUCCESS { Ok(r) } else { Err(error) } + if error == tracked_property_error::SUCCESS { + Ok(r) + } else { + Err(error) + } } } - pub fn float_tracked_device_property(&self, device: TrackedDeviceIndex, property: TrackedDeviceProperty) -> Result { + pub fn float_tracked_device_property( + &self, + device: TrackedDeviceIndex, + property: TrackedDeviceProperty, + ) -> Result { unsafe { let mut error: TrackedPropertyError = mem::uninitialized(); let r = self.0.GetFloatTrackedDeviceProperty.unwrap()(device, property, &mut error.0); - if error == tracked_property_error::SUCCESS { Ok(r) } else { Err(error) } + if error == tracked_property_error::SUCCESS { + Ok(r) + } else { + Err(error) + } } } - pub fn int32_tracked_device_property(&self, device: TrackedDeviceIndex, property: TrackedDeviceProperty) -> Result { + pub fn int32_tracked_device_property( + &self, + device: TrackedDeviceIndex, + property: TrackedDeviceProperty, + ) -> Result { unsafe { let mut error: TrackedPropertyError = mem::uninitialized(); let r = self.0.GetInt32TrackedDeviceProperty.unwrap()(device, property, &mut error.0); - if error == tracked_property_error::SUCCESS { Ok(r) } else { Err(error) } + if error == tracked_property_error::SUCCESS { + Ok(r) + } else { + Err(error) + } } } - pub fn uint64_tracked_device_property(&self, device: TrackedDeviceIndex, property: TrackedDeviceProperty) -> Result { + pub fn uint64_tracked_device_property( + &self, + device: TrackedDeviceIndex, + property: TrackedDeviceProperty, + ) -> Result { unsafe { let mut error: TrackedPropertyError = mem::uninitialized(); let r = self.0.GetUint64TrackedDeviceProperty.unwrap()(device, property, &mut error.0); - if error == tracked_property_error::SUCCESS { Ok(r) } else { Err(error) } + if error == tracked_property_error::SUCCESS { + Ok(r) + } else { + Err(error) + } } } - pub fn matrix34_tracked_device_property(&self, device: TrackedDeviceIndex, property: TrackedDeviceProperty) -> Result<[[f32; 4]; 3], TrackedPropertyError> { + pub fn matrix34_tracked_device_property( + &self, + device: TrackedDeviceIndex, + property: TrackedDeviceProperty, + ) -> Result<[[f32; 4]; 3], TrackedPropertyError> { unsafe { let mut error: TrackedPropertyError = mem::uninitialized(); - let r = self.0.GetMatrix34TrackedDeviceProperty.unwrap()(device, property, &mut error.0); - if error == tracked_property_error::SUCCESS { Ok(r.m) } else { Err(error) } + let r = + self.0.GetMatrix34TrackedDeviceProperty.unwrap()(device, property, &mut error.0); + if error == tracked_property_error::SUCCESS { + Ok(r.m) + } else { + Err(error) + } } } - pub fn string_tracked_device_property(&self, device: TrackedDeviceIndex, property: TrackedDeviceProperty) -> Result { + pub fn string_tracked_device_property( + &self, + device: TrackedDeviceIndex, + property: TrackedDeviceProperty, + ) -> Result { unsafe { let mut error = mem::uninitialized(); - let res = get_string(|ptr, n| self.0.GetStringTrackedDeviceProperty.unwrap()(device, property, ptr, n, &mut error)); + let res = get_string(|ptr, n| { + self.0.GetStringTrackedDeviceProperty.unwrap()(device, property, ptr, n, &mut error) + }); res.map_or(Err(TrackedPropertyError(error)), Ok) } } @@ -226,8 +320,17 @@ impl System { /// full-screen quads. The visible area mesh covers all of the pixels the hidden area mesh does not cover. // TODO: Handle line loops with a separate method and return type, since HiddenAreaMesh assumes triangles. pub fn hidden_area_mesh(&self, eye: Eye, ty: HiddenAreaMeshType) -> Option { - let mesh = unsafe { self.0.GetHiddenAreaMesh.unwrap()(eye as sys::EVREye, ty as sys::EHiddenAreaMeshType) }; - if mesh.pVertexData == ptr::null_mut() { None } else { Some(HiddenAreaMesh { mesh, _phantom: PhantomData }) } + let mesh = unsafe { + self.0.GetHiddenAreaMesh.unwrap()(eye as sys::EVREye, ty as sys::EHiddenAreaMeshType) + }; + if mesh.pVertexData == ptr::null_mut() { + None + } else { + Some(HiddenAreaMesh { + mesh, + _phantom: PhantomData, + }) + } } /// Looks up the current input state of a controller. @@ -239,7 +342,11 @@ impl System { pub fn controller_state(&self, device: TrackedDeviceIndex) -> Option { unsafe { let mut state = mem::uninitialized(); - if self.0.GetControllerState.unwrap()(device, &mut state as *mut _ as *mut _, mem::size_of_val(&state) as u32) { + if self.0.GetControllerState.unwrap()( + device, + &mut state as *mut _ as *mut _, + mem::size_of_val(&state) as u32, + ) { Some(state) } else { None @@ -248,14 +355,21 @@ impl System { } /// See `controller_state` - pub fn controller_state_with_pose(&self, origin: TrackingUniverseOrigin, device: TrackedDeviceIndex) -> Option<(ControllerState, TrackedDevicePose)> { + pub fn controller_state_with_pose( + &self, + origin: TrackingUniverseOrigin, + device: TrackedDeviceIndex, + ) -> Option<(ControllerState, TrackedDevicePose)> { unsafe { let mut state = mem::uninitialized(); let mut pose = mem::uninitialized(); if self.0.GetControllerStateWithPose.unwrap()( origin as sys::ETrackingUniverseOrigin, - device, &mut state as *mut _ as *mut _, mem::size_of_val(&state) as u32, - &mut pose) { + device, + &mut state as *mut _ as *mut _, + mem::size_of_val(&state) as u32, + &mut pose, + ) { Some((state, pose.into())) } else { None @@ -277,7 +391,9 @@ impl System { /// /// This extends the timeout until the process is killed. pub fn acknowledge_quit_exiting(&self) { - unsafe { self.0.AcknowledgeQuit_Exiting.unwrap()(); } + unsafe { + self.0.AcknowledgeQuit_Exiting.unwrap()(); + } } /// Call this to tell the system that the user is being prompted to save data. @@ -285,7 +401,9 @@ impl System { /// This halts the timeout and dismisses the dashboard (if it was up). Applications should be sure to actually /// prompt the user to save and then exit afterward, otherwise the user will be left in a confusing state. pub fn acknowledge_quit_user_prompt(&self) { - unsafe { self.0.AcknowledgeQuit_UserPrompt.unwrap()(); } + unsafe { + self.0.AcknowledgeQuit_UserPrompt.unwrap()(); + } } /// Sets the zero pose for the seated tracker coordinate system to the current position and yaw of the HMD. @@ -299,7 +417,9 @@ impl System { /// NOTE: This function overrides the user's previously saved seated zero pose and should only be called as the /// result of a user action. Users are also able to set their seated zero pose via the OpenVR Dashboard. pub fn reset_seated_zero_pose(&self) { - unsafe { self.0.ResetSeatedZeroPose.unwrap()(); } + unsafe { + self.0.ResetSeatedZeroPose.unwrap()(); + } } } @@ -329,18 +449,30 @@ pub struct TrackedPropertyError(sys::TrackedPropertyError); pub mod tracked_property_error { use super::{sys, TrackedPropertyError}; - pub const SUCCESS: TrackedPropertyError = TrackedPropertyError(sys::ETrackedPropertyError_TrackedProp_Success); - pub const WRONG_DATA_TYPE: TrackedPropertyError = TrackedPropertyError(sys::ETrackedPropertyError_TrackedProp_WrongDataType); - pub const WRONG_DEVICE_CLASS: TrackedPropertyError = TrackedPropertyError(sys::ETrackedPropertyError_TrackedProp_WrongDeviceClass); - pub const BUFFER_TOO_SMALL: TrackedPropertyError = TrackedPropertyError(sys::ETrackedPropertyError_TrackedProp_BufferTooSmall); - pub const UNKNOWN_PROPERTY: TrackedPropertyError = TrackedPropertyError(sys::ETrackedPropertyError_TrackedProp_UnknownProperty); - pub const INVALID_DEVICE: TrackedPropertyError = TrackedPropertyError(sys::ETrackedPropertyError_TrackedProp_InvalidDevice); - pub const COULD_NOT_CONTACT_SERVER: TrackedPropertyError = TrackedPropertyError(sys::ETrackedPropertyError_TrackedProp_CouldNotContactServer); - pub const VALUE_NOT_PROVIDED_BY_DEVICE: TrackedPropertyError = TrackedPropertyError(sys::ETrackedPropertyError_TrackedProp_ValueNotProvidedByDevice); - pub const STRING_EXCEEDS_MAXIMUM_LENGTH: TrackedPropertyError = TrackedPropertyError(sys::ETrackedPropertyError_TrackedProp_StringExceedsMaximumLength); - pub const NOT_YET_AVAILABLE: TrackedPropertyError = TrackedPropertyError(sys::ETrackedPropertyError_TrackedProp_NotYetAvailable); - pub const PERMISSION_DENIED: TrackedPropertyError = TrackedPropertyError(sys::ETrackedPropertyError_TrackedProp_PermissionDenied); - pub const INVALID_OPERATION: TrackedPropertyError = TrackedPropertyError(sys::ETrackedPropertyError_TrackedProp_InvalidOperation); + pub const SUCCESS: TrackedPropertyError = + TrackedPropertyError(sys::ETrackedPropertyError_TrackedProp_Success); + pub const WRONG_DATA_TYPE: TrackedPropertyError = + TrackedPropertyError(sys::ETrackedPropertyError_TrackedProp_WrongDataType); + pub const WRONG_DEVICE_CLASS: TrackedPropertyError = + TrackedPropertyError(sys::ETrackedPropertyError_TrackedProp_WrongDeviceClass); + pub const BUFFER_TOO_SMALL: TrackedPropertyError = + TrackedPropertyError(sys::ETrackedPropertyError_TrackedProp_BufferTooSmall); + pub const UNKNOWN_PROPERTY: TrackedPropertyError = + TrackedPropertyError(sys::ETrackedPropertyError_TrackedProp_UnknownProperty); + pub const INVALID_DEVICE: TrackedPropertyError = + TrackedPropertyError(sys::ETrackedPropertyError_TrackedProp_InvalidDevice); + pub const COULD_NOT_CONTACT_SERVER: TrackedPropertyError = + TrackedPropertyError(sys::ETrackedPropertyError_TrackedProp_CouldNotContactServer); + pub const VALUE_NOT_PROVIDED_BY_DEVICE: TrackedPropertyError = + TrackedPropertyError(sys::ETrackedPropertyError_TrackedProp_ValueNotProvidedByDevice); + pub const STRING_EXCEEDS_MAXIMUM_LENGTH: TrackedPropertyError = + TrackedPropertyError(sys::ETrackedPropertyError_TrackedProp_StringExceedsMaximumLength); + pub const NOT_YET_AVAILABLE: TrackedPropertyError = + TrackedPropertyError(sys::ETrackedPropertyError_TrackedProp_NotYetAvailable); + pub const PERMISSION_DENIED: TrackedPropertyError = + TrackedPropertyError(sys::ETrackedPropertyError_TrackedProp_PermissionDenied); + pub const INVALID_OPERATION: TrackedPropertyError = + TrackedPropertyError(sys::ETrackedPropertyError_TrackedProp_InvalidOperation); } impl fmt::Debug for TrackedPropertyError { @@ -384,7 +516,9 @@ pub enum HiddenAreaMeshType { } impl Default for HiddenAreaMeshType { - fn default() -> Self { HiddenAreaMeshType::Standard } + fn default() -> Self { + HiddenAreaMeshType::Standard + } } /// A triangle mesh containing geometry determined by `HiddenAreaMeshType`. @@ -399,6 +533,11 @@ pub struct HiddenAreaMesh<'a> { impl<'a> ::std::ops::Deref for HiddenAreaMesh<'a> { type Target = [[f32; 2]]; fn deref(&self) -> &Self::Target { - unsafe { slice::from_raw_parts(&(*self.mesh.pVertexData).v, self.mesh.unTriangleCount as usize * 3) } + unsafe { + slice::from_raw_parts( + &(*self.mesh.pVertexData).v, + self.mesh.unTriangleCount as usize * 3, + ) + } } } diff --git a/src/tracking.rs b/src/tracking.rs index 9daa006..143b258 100644 --- a/src/tracking.rs +++ b/src/tracking.rs @@ -12,9 +12,15 @@ pub enum TrackingUniverseOrigin { pub struct TrackedDevicePose(sys::TrackedDevicePose_t); impl TrackedDevicePose { - pub fn device_to_absolute_tracking(&self) -> &[[f32; 4]; 3] { &self.0.mDeviceToAbsoluteTracking.m } - pub fn velocity(&self) -> &[f32; 3] { &self.0.vVelocity.v } - pub fn angular_velocity(&self) -> &[f32; 3] { &self.0.vAngularVelocity.v } + pub fn device_to_absolute_tracking(&self) -> &[[f32; 4]; 3] { + &self.0.mDeviceToAbsoluteTracking.m + } + pub fn velocity(&self) -> &[f32; 3] { + &self.0.vVelocity.v + } + pub fn angular_velocity(&self) -> &[f32; 3] { + &self.0.vAngularVelocity.v + } pub fn tracking_result(&self) -> TrackingResult { use self::TrackingResult::*; match self.0.eTrackingResult { @@ -23,15 +29,21 @@ impl TrackedDevicePose { sys::ETrackingResult_TrackingResult_Calibrating_OutOfRange => CalibratingOutOfRange, sys::ETrackingResult_TrackingResult_Running_OK => OK, sys::ETrackingResult_TrackingResult_Running_OutOfRange => RunningOutOfRange, - _ => panic!("unrecognized tracking result") + _ => panic!("unrecognized tracking result"), } } - pub fn pose_is_valid(&self) -> bool { self.0.bPoseIsValid } - pub fn device_is_connected(&self) -> bool { self.0.bDeviceIsConnected } + pub fn pose_is_valid(&self) -> bool { + self.0.bPoseIsValid + } + pub fn device_is_connected(&self) -> bool { + self.0.bDeviceIsConnected + } } impl From for TrackedDevicePose { - fn from(x: sys::TrackedDevicePose_t) -> Self { TrackedDevicePose(x) } + fn from(x: sys::TrackedDevicePose_t) -> Self { + TrackedDevicePose(x) + } } #[derive(Debug, Copy, Clone, Eq, PartialEq)]