From ba8a05121bc1ab641c7680adb04681e44a58d82b Mon Sep 17 00:00:00 2001 From: Colin Sherratt Date: Fri, 23 May 2014 22:12:43 -0400 Subject: [PATCH] WIP 2 --- src/oculus-info/main.rs | 8 +- src/oculus-vr/lib.rs | 162 +++++++++++++++++++++++++++++++++++----- 2 files changed, 147 insertions(+), 23 deletions(-) diff --git a/src/oculus-info/main.rs b/src/oculus-info/main.rs index 92ea8b0..5e954f0 100644 --- a/src/oculus-info/main.rs +++ b/src/oculus-info/main.rs @@ -46,11 +46,11 @@ fn main() { println!("Manufacture: {:s}", hmd_desc.manufacture); println!("Hmd Capabilities: {:?}", hmd_desc.hmd_capabilities); println!("Sensor Capabilities: {:?}", hmd_desc.sensor_capabilities); - println!("Distorion Capabilities: {}", hmd_desc.distortion_capabilities); + println!("Distorion Capabilities: {:?}", hmd_desc.distortion_capabilities); println!("Resolution: {:?}", hmd_desc.resolution); println!("Window Position: {:?}", hmd_desc.window_position); - println!("Default eye field of view: {:?}", hmd_desc.default_eye_fov); - println!("Max eye field of view: {:?}", hmd_desc.max_eye_fov); + println!("right: {:?}", hmd_desc.right); + println!("left {:?}", hmd_desc.left); println!("Eyes render order: {:?}", hmd_desc.eye_render_order); println!("Display device name: {:s}", hmd_desc.display_device_name); println!("Display idr: {}", hmd_desc.display_id); @@ -58,7 +58,7 @@ fn main() { /*let dm = match ovr::DeviceManager::new() { Some(dm) => dm, - None => { + None => {s println!("Could not initialize Oculus Device Manager"); return; } diff --git a/src/oculus-vr/lib.rs b/src/oculus-vr/lib.rs index 80ea026..dc555fd 100644 --- a/src/oculus-vr/lib.rs +++ b/src/oculus-vr/lib.rs @@ -165,6 +165,13 @@ pub mod ll { pub static Status_PositionConnected : c_uint = 0x0020; pub static Status_HmdConnected : c_uint = 0x0080; + pub static DistortionCap_Chromatic : c_uint = 0x01; + pub static DistortionCap_TimeWarp : c_uint = 0x02; + pub static DistortionCap_Vignette : c_uint = 0x08; + + pub static Eye_Left : c_uint = 0; + pub static Eye_Right : c_uint = 1; + extern "C" { pub fn ovr_Initialize() -> bool; pub fn ovr_Shutdown(); @@ -186,7 +193,10 @@ pub mod ll { sensor_desc: *SensorDesc) -> bool; pub fn ovrHmd_GetDesc(hmd: *Hmd, size: *HmdDesc); - //pub fn ovrHmd_GetFovTextureSize(hmd: *Hmd); + pub fn ovrHmd_GetFovTextureSize(hmd: *Hmd, + eye: c_uint, + fov: FovPort, + pixels: c_float) -> Sizei; } } @@ -353,6 +363,18 @@ impl Hmd { HmdDescription::from_ll(c_desc) } } + + pub fn get_fov_texture_size(&self, + eye: EyeType, + fov: ll::FovPort, + pixels_per_display_pixel: f32) -> ll::Sizei { + unsafe { + ll::ovrHmd_GetFovTextureSize(self.ptr, + eye.to_ll(), + fov, + pixels_per_display_pixel) + } + } } pub struct HmdCapabilities { @@ -488,16 +510,65 @@ impl SensorCapabilities { } } -fn to_quat(q: ll::Quaternionf) -> Quaternion { - Quaternion::new(q.x, q.y, q.z, q.w) +pub struct DistortionCapabilities { + flags: c_uint } -fn to_vec3(v: ll::Vector3f) -> Vector3 { - Vector3::new(v.x, v.y, v.z) +impl DistortionCapabilities { + pub fn new() -> DistortionCapabilities { + DistortionCapabilities { + flags: 0 + } + } + + pub fn chromatic(&self) -> bool { + self.flags & ll::DistortionCap_Chromatic == + ll::DistortionCap_Chromatic + } + + pub fn timewarp(&self) -> bool { + self.flags & ll::DistortionCap_TimeWarp == + ll::DistortionCap_TimeWarp + } + + pub fn vignette(&self) -> bool { + self.flags & ll::DistortionCap_Vignette == + ll::DistortionCap_Vignette + } + + pub fn set_chromatic(&self, flag: bool) -> DistortionCapabilities { + DistortionCapabilities {flags: + if flag { + self.flags | ll::DistortionCap_Chromatic + } else { + self.flags & !ll::DistortionCap_Chromatic + } + } + } + + pub fn set_timewarp(&self, flag: bool) -> DistortionCapabilities { + DistortionCapabilities {flags: + if flag { + self.flags | ll::DistortionCap_TimeWarp + } else { + self.flags & !ll::DistortionCap_TimeWarp + } + } + } + + pub fn set_vignette(&self, flag: bool) -> DistortionCapabilities { + DistortionCapabilities {flags: + if flag { + self.flags | ll::DistortionCap_Vignette + } else { + self.flags & !ll::DistortionCap_Vignette + } + } + } } #[deriving(Clone)] -struct Status { +pub struct Status { flags: u32 } @@ -523,6 +594,15 @@ impl Status { } } +fn to_quat(q: ll::Quaternionf) -> Quaternion { + Quaternion::new(q.x, q.y, q.z, q.w) +} + +fn to_vec3(v: ll::Vector3f) -> Vector3 { + Vector3::new(v.x, v.y, v.z) +} + + #[deriving(Clone)] pub struct Pose { pub orientation: Quaternion, @@ -596,18 +676,45 @@ impl SensorDescription { } } +pub enum EyeType { + EyeLeft, + EyeRight +} + +impl EyeType { + fn from_ll(c: c_uint) -> EyeType { + match c { + ll::Eye_Left => EyeLeft, + ll::Eye_Right => EyeRight, + _ => fail!("Invalid eye type {:?}", c) + } + } + + fn to_ll(&self) -> c_uint { + match *self { + EyeLeft => ll::Eye_Left, + EyeRight => ll::Eye_Right + } + } +} + +pub struct HmdDescriptionEye { + default_eye_fov: ll::FovPort, + max_eye_fov: ll::FovPort, +} + pub struct HmdDescription { pub hmd_type: HmdType, pub product_name: ~str, pub manufacture: ~str, pub hmd_capabilities: HmdCapabilities, pub sensor_capabilities: SensorCapabilities, - pub distortion_capabilities: c_uint, + pub distortion_capabilities: DistortionCapabilities, pub resolution: ll::Sizei, pub window_position: ll::Vector2i, - pub default_eye_fov: [ll::FovPort, ..2], - pub max_eye_fov: [ll::FovPort, ..2], - pub eye_render_order: [c_uint, ..2], + pub left: HmdDescriptionEye, + pub right: HmdDescriptionEye, + pub eye_render_order: [EyeType, ..2], pub display_device_name: ~str, pub display_id: c_int } @@ -619,20 +726,37 @@ impl HmdDescription { hmd_type: HmdType::from_ll(sd.hmd_type), product_name: from_c_str(sd.product_name), manufacture: from_c_str(sd.manufacture), - hmd_capabilities: HmdCapabilities{flags: sd.hmd_capabilities}, - sensor_capabilities: SensorCapabilities{flags: sd.sensor_capabilities}, - distortion_capabilities: sd.distortion_capabilities, + hmd_capabilities: HmdCapabilities{ + flags: sd.hmd_capabilities + }, + sensor_capabilities: SensorCapabilities{ + flags: sd.sensor_capabilities + }, + distortion_capabilities: DistortionCapabilities{ + flags: sd.distortion_capabilities + }, resolution: sd.resolution, window_position: sd.window_position, - default_eye_fov: [sd.default_eye_fov[0], - sd.default_eye_fov[1]], - max_eye_fov: [sd.max_eye_fov[0], - sd.max_eye_fov[1]], - eye_render_order: [sd.eye_render_order[0], - sd.eye_render_order[1]], + left: HmdDescriptionEye { + default_eye_fov: sd.default_eye_fov[ll::Eye_Left as uint], + max_eye_fov: sd.max_eye_fov[ll::Eye_Left as uint] + }, + right: HmdDescriptionEye { + default_eye_fov: sd.default_eye_fov[ll::Eye_Right as uint], + max_eye_fov: sd.max_eye_fov[ll::Eye_Right as uint] + }, + eye_render_order: [EyeType::from_ll(sd.eye_render_order[0]), + EyeType::from_ll(sd.eye_render_order[1])], display_device_name: from_c_str(sd.display_device_name), display_id: sd.display_id } } } + + pub fn eye<'a>(&'a self, eye: EyeType) -> &'a HmdDescriptionEye { + match eye { + EyeLeft => &self.left, + EyeRight => &self.right + } + } } \ No newline at end of file