From fe995161b24a324c180e334fa338328f8908f78a Mon Sep 17 00:00:00 2001 From: Colin Sherratt Date: Wed, 21 May 2014 16:31:35 -0400 Subject: [PATCH] Updated style Fixed style --- configure | 3 - modules/cgmath | 2 +- src/oculus-info/main.rs | 42 +++++++-- src/oculus-vr/lib.rs | 151 +++++++++++---------------------- src/oculus-vr/libovr_wrapper.a | Bin 0 -> 58218 bytes src/oculus-vr/wrapper.cpp | 141 ++++++++++-------------------- src/oculus-vr/wrapper.o | Bin 0 -> 52016 bytes 7 files changed, 133 insertions(+), 206 deletions(-) create mode 100644 src/oculus-vr/libovr_wrapper.a create mode 100644 src/oculus-vr/wrapper.o diff --git a/configure b/configure index e5341a3..6f304ec 100755 --- a/configure +++ b/configure @@ -172,9 +172,6 @@ def write_makefile(modules): modules = [Bin("oculus-info", ["oculus-vr"]), LibMakefile("libovr_wrapper.a", "src/oculus-vr/", "src/oculus-vr/libovr_wrapper.a", ["cgmath", "libOculusVR.a"]), LibCMake("libOculusVR.a", "modules/OculusSDK/LibOVR/", "modules/OculusSDK/LibOVR/libOculusVR.a"), - #Bin("steamworks-info", ["steamworks-vr"], other_flags="-L thirdparty/Steamworks/redistributable_bin/linux64/"), - #Lib("steamworks-vr", ["cgmath", "libsteamvr_wrapper.a"]), - #LibMakefile("libsteamvr_wrapper.a", "src/steamworks-vr/", "src/steamworks-vr/libsteamvr_wrapper.a"), Lib("cgmath")] if platform.system() == "Linux": diff --git a/modules/cgmath b/modules/cgmath index 29b8f4e..702b7e1 160000 --- a/modules/cgmath +++ b/modules/cgmath @@ -1 +1 @@ -Subproject commit 29b8f4ea166ac36db4b06814eb198458cf905e11 +Subproject commit 702b7e186ef342cff73b31159a99c2d6844e46a2 diff --git a/src/oculus-info/main.rs b/src/oculus-info/main.rs index e75a19d..55e8965 100644 --- a/src/oculus-info/main.rs +++ b/src/oculus-info/main.rs @@ -2,17 +2,43 @@ extern crate ovr = "oculus-vr"; -fn main() -{ +fn main() { ovr::init(); - let dm = ovr::DeviceManager::new().unwrap(); - let dev = dm.enumerate().unwrap(); + let dm = match ovr::DeviceManager::new() { + Some(dm) => dm, + None => { + println!("Could not initialize Oculus Device Manager"); + return; + } + }; + + let dev = match dm.enumerate() { + Some(d) => d, + None => { + println!("Could not enumerate Oculus HMD."); + println!("Was it unplugged?"); + return; + } + }; + + let sf = match ovr::SensorFusion::new() { + Some(sf) => sf, + None => { + println!("Could not allocate Sensor Fusion") + return; + } + }; + + let sensor = match dev.get_sensor() { + Some(sensor) => sensor, + None => { + println!("Could not get the sensor from HMD"); + return; + } + }; + let info = dev.get_info(); - - let sf = ovr::SensorFusion::new().unwrap(); - let sensor = dev.get_sensor().unwrap(); - sf.attach_to_sensor(&sensor); match info.resolution() { diff --git a/src/oculus-vr/lib.rs b/src/oculus-vr/lib.rs index e329e9e..dbf2e03 100644 --- a/src/oculus-vr/lib.rs +++ b/src/oculus-vr/lib.rs @@ -23,6 +23,7 @@ use cgmath::angle::rad; #[link(name="Xinerama")] #[link(name="edid")] #[link(name="Xrandr")] +#[link(name="X11")] extern {} #[cfg(target_os = "macos")] @@ -58,8 +59,7 @@ pub mod ll { } impl Clone for HMDInfo { - fn clone(&self) -> HMDInfo - { + fn clone(&self) -> HMDInfo { HMDInfo { horizontal_resolution: self.horizontal_resolution, vertical_resolution: self.vertical_resolution, @@ -167,8 +167,7 @@ pub struct DeviceManager { } impl Drop for DeviceManager { - fn drop(&mut self) - { + fn drop(&mut self) { unsafe { ll::OVR_DeviceManager_drop(self.ptr); } @@ -176,8 +175,7 @@ impl Drop for DeviceManager { } impl DeviceManager { - pub fn new() -> Option - { + pub fn new() -> Option { unsafe { let ptr = ll::OVR_DeviceManager_Create(); @@ -191,8 +189,7 @@ impl DeviceManager { } } - pub fn enumerate(&self) -> Option - { + pub fn enumerate(&self) -> Option { unsafe { let ptr = ll::OVR_DeviceManager_EnumerateDevices(self.ptr); @@ -212,8 +209,7 @@ pub struct HMDDevice { } impl HMDDevice { - pub fn get_info(&self) -> HMDInfo - { + pub fn get_info(&self) -> HMDInfo { unsafe { HMDInfo{ dat: ll::OVR_HMDDevice_GetDeviceInfo(self.ptr) @@ -221,8 +217,7 @@ impl HMDDevice { } } - pub fn get_sensor(&self) -> Option - { + pub fn get_sensor(&self) -> Option { unsafe { let ptr = ll::OVR_HMDDevice_GetSensor(self.ptr); @@ -245,66 +240,55 @@ pub struct HMDInfo { impl HMDInfo { - pub fn resolution(&self) -> (uint, uint) - { + pub fn resolution(&self) -> (uint, uint) { (self.dat.horizontal_resolution as uint, self.dat.vertical_resolution as uint) } - pub fn size(&self) -> (f32, f32) - { + pub fn size(&self) -> (f32, f32) { (self.dat.horizontal_screen_size as f32, self.dat.vertical_screen_size as f32) } - pub fn desktop(&self) -> (int, int) - { + pub fn desktop(&self) -> (int, int) { (self.dat.desktop_x as int, self.dat.desktop_y as int) } - pub fn vertical_center(&self) -> f32 - { + pub fn vertical_center(&self) -> f32 { self.dat.vertical_screen_center as f32 } - pub fn eye_to_screen_distance(&self) -> f32 - { + pub fn eye_to_screen_distance(&self) -> f32 { self.dat.eye_to_screen_distance as f32 } - pub fn lens_separation_distance(&self) -> f32 - { + pub fn lens_separation_distance(&self) -> f32 { self.dat.lens_separation_distance as f32 } - pub fn interpupillary_distance(&self) -> f32 - { + pub fn interpupillary_distance(&self) -> f32 { self.dat.interpupillary_distance as f32 } - pub fn distortion_K(&self) -> [f32, ..4] - { + pub fn distortion_K(&self) -> [f32, ..4] { [self.dat.distortion_k[0] as f32, self.dat.distortion_k[1] as f32, self.dat.distortion_k[2] as f32, self.dat.distortion_k[3] as f32] } - pub fn chroma_ab_correction(&self) -> [f32, ..4] - { + pub fn chroma_ab_correction(&self) -> [f32, ..4] { [self.dat.chroma_ab_correction[0] as f32, self.dat.chroma_ab_correction[1] as f32, self.dat.chroma_ab_correction[2] as f32, self.dat.chroma_ab_correction[3] as f32] } - pub fn name(&self) -> ~str - { + pub fn name(&self) -> ~str { unsafe { std::str::raw::from_c_str(&self.dat.display_device_name[0]) } } - pub fn id(&self) -> int - { + pub fn id(&self) -> int { self.dat.display_id as int } } @@ -322,8 +306,7 @@ impl Drop for SensorFusion { } impl SensorFusion { - pub fn new() -> Option - { + pub fn new() -> Option { unsafe { let ptr = ll::OVR_SensorFusion(); @@ -337,30 +320,26 @@ impl SensorFusion { } } - pub fn attach_to_sensor(&self, sensor: &SensorDevice) -> bool - { + pub fn attach_to_sensor(&self, sensor: &SensorDevice) -> bool { unsafe { ll::OVR_SensorFusion_AttachToSensor(self.ptr, sensor.ptr) } } - pub fn is_attached_to_sensor(&self) -> bool - { + pub fn is_attached_to_sensor(&self) -> bool { unsafe { ll::OVR_SensorFusion_IsAttachedToSensor(self.ptr) } } - pub fn get_orientation(&self) -> Quaternion - { + pub fn get_orientation(&self) -> Quaternion { unsafe { let out = ll::OVR_SensorFusion_GetOrientation(self.ptr); Quaternion::new(out.w, out.x, out.y, out.z) } } - pub fn get_predicted_orientation(&self, dt: Option) -> Quaternion - { + pub fn get_predicted_orientation(&self, dt: Option) -> Quaternion { unsafe { let out = match dt { Some(dt) => ll::OVR_SensorFusion_GetPredictedOrientation_opt(self.ptr, dt as c_float), @@ -370,147 +349,127 @@ impl SensorFusion { } } - pub fn get_acceleration(&self) -> Vector3 - { + pub fn get_acceleration(&self) -> Vector3 { unsafe { let out = ll::OVR_SensorFusion_GetAcceleration(self.ptr); Vector3::new(out.x, out.y, out.z) } } - pub fn get_angular_velocity(&self) -> Vector3 - { + pub fn get_angular_velocity(&self) -> Vector3 { unsafe { let out = ll::OVR_SensorFusion_GetAngularVelocity(self.ptr); Vector3::new(out.x, out.y, out.z) } } - pub fn get_magnetometer(&self) -> Vector3 - { + pub fn get_magnetometer(&self) -> Vector3 { unsafe { let out = ll::OVR_SensorFusion_GetMagnetometer(self.ptr); Vector3::new(out.x, out.y, out.z) } } - pub fn get_calibrated_magnetometer(&self) -> Vector3 - { + pub fn get_calibrated_magnetometer(&self) -> Vector3 { unsafe { let out = ll::OVR_SensorFusion_GetCalibratedMagnetometer(self.ptr); Vector3::new(out.x, out.y, out.z) } } - pub fn reset(&self) - { + pub fn reset(&self) { unsafe { ll::OVR_SensorFusion_Reset(self.ptr); } } - pub fn enable_motion_tracking(&self, enable: bool) - { + pub fn enable_motion_tracking(&self, enable: bool) { unsafe { ll::OVR_SensorFusion_EnableMotionTracking(self.ptr, enable) } } - pub fn is_motion_tracking_enabled(&self) -> bool - { + pub fn is_motion_tracking_enabled(&self) -> bool { unsafe { ll::OVR_SensorFusion_IsMotionTrackingEnabled(self.ptr) } } - pub fn get_prediction_delta(&self) -> f32 - { + pub fn get_prediction_delta(&self) -> f32 { unsafe { ll::OVR_SensorFusion_GetPredictionDelta(self.ptr) as f32 } } - pub fn set_prediction(&self, dt: f32, enable: bool) - { + pub fn set_prediction(&self, dt: f32, enable: bool) { unsafe { ll::OVR_SensorFusion_SetPrediction(self.ptr, dt as c_float, enable) } } - pub fn set_prediction_enabled(&self, enable: bool) - { + pub fn set_prediction_enabled(&self, enable: bool) { unsafe { ll::OVR_SensorFusion_SetPredictionEnabled(self.ptr, enable) } } - pub fn is_prediction_enabled(&self) -> bool - { + pub fn is_prediction_enabled(&self) -> bool { unsafe { ll::OVR_SensorFusion_IsPredictionEnabled(self.ptr) } } - pub fn set_gravity_enabled(&self, enable_gravity: bool) - { + pub fn set_gravity_enabled(&self, enable_gravity: bool) { unsafe { ll::OVR_SensorFusion_SetGravityEnabled(self.ptr, enable_gravity) } } - pub fn is_gravity_enabled(&self) -> bool - { + pub fn is_gravity_enabled(&self) -> bool { unsafe { ll::OVR_SensorFusion_IsGravityEnabled(self.ptr) } } - pub fn get_accel_gain(&self) -> f32 - { + pub fn get_accel_gain(&self) -> f32 { unsafe { ll::OVR_SensorFusion_GetAccelGain(self.ptr) as f32 } } - pub fn set_accel_gain(&self, ag: f32) - { + pub fn set_accel_gain(&self, ag: f32) { unsafe { ll::OVR_SensorFusion_SetAccelGain(self.ptr, ag as c_float) } } - pub fn save_mag_calibration(&self, calibration_name: &str) -> bool - { + pub fn save_mag_calibration(&self, calibration_name: &str) -> bool { let cn = calibration_name.to_c_str(); unsafe { ll::OVR_SensorFusion_SaveMagCalibration(self.ptr, cn.unwrap()) } } - pub fn load_mag_calibration(&self, calibration_name: &str) -> bool - { + pub fn load_mag_calibration(&self, calibration_name: &str) -> bool { let cn = calibration_name.to_c_str(); unsafe { ll::OVR_SensorFusion_LoadMagCalibration(self.ptr, cn.unwrap()) } } - pub fn set_yaw_correction_enabled(&self, enable: bool) - { + pub fn set_yaw_correction_enabled(&self, enable: bool) { unsafe { ll::OVR_SensorFusion_SetYawCorrectionEnabled(self.ptr, enable) } } - pub fn is_yaw_correction_enabled(&self) -> bool - { + pub fn is_yaw_correction_enabled(&self) -> bool { unsafe { ll::OVR_SensorFusion_IsYawCorrectionEnabled(self.ptr) } } - pub fn set_mag_calibration(&self, m: &Matrix4) - { + pub fn set_mag_calibration(&self, m: &Matrix4) { let mat = ll::Matrix4f{ m11: m.x.x as c_float, m12: m.x.y as c_float, m13: m.x.z as c_float, m14: m.x.w as c_float, m21: m.y.x as c_float, m22: m.y.y as c_float, m23: m.y.z as c_float, m24: m.y.w as c_float, @@ -523,8 +482,7 @@ impl SensorFusion { } } - pub fn get_mag_calibration(&self) -> Matrix4 - { + pub fn get_mag_calibration(&self) -> Matrix4 { unsafe { let m = ll::OVR_SensorFusion_GetMagCalibration(self.ptr); @@ -536,29 +494,25 @@ impl SensorFusion { } /// TODO this should not return a time_t! - pub fn get_mag_calibration_time(&self) -> time_t - { + pub fn get_mag_calibration_time(&self) -> time_t { unsafe { ll::OVR_SensorFusion_GetMagCalibrationTime(self.ptr) } } - pub fn has_mag_calibration(&self) -> bool - { + pub fn has_mag_calibration(&self) -> bool { unsafe { ll::OVR_SensorFusion_HasMagCalibration(self.ptr) } } - pub fn clear_mag_calibration(&self) - { + pub fn clear_mag_calibration(&self) { unsafe { ll::OVR_SensorFusion_ClearMagCalibration(self.ptr) } } - pub fn clear_mag_references(&self, vec: &Vector3) - { + pub fn clear_mag_references(&self, vec: &Vector3) { let vec = ll::Vector3f{x: vec.x, y: vec.y, z: vec.z}; unsafe { @@ -566,8 +520,7 @@ impl SensorFusion { } } - pub fn get_calibrated_mag_value(&self) -> Vector3 - { + pub fn get_calibrated_mag_value(&self) -> Vector3 { unsafe { let vec = ll::OVR_SensorFusion_GetCalibratedMagValue(self.ptr); Vector3::new(vec.x, vec.y, vec.z) @@ -580,10 +533,8 @@ pub struct SensorDevice { msg: Option<*ll::MessageHandler> } -impl Drop for SensorDevice -{ - fn drop(&mut self) - { +impl Drop for SensorDevice { + fn drop(&mut self) { unsafe { ll::OVR_SensorDevice_drop(self.ptr); } diff --git a/src/oculus-vr/libovr_wrapper.a b/src/oculus-vr/libovr_wrapper.a new file mode 100644 index 0000000000000000000000000000000000000000..3ddc22ef8938b1351bb69fbca8eb035d5344964e GIT binary patch literal 58218 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 struct MessageBodyFrame mbf = { @@ -70,45 +68,37 @@ extern "C" void (*BodyFrame)(void *ptr, struct MessageBodyFrame *msg); }; - RustMessageHandler* OVR_MessageHandler(void *_ptr, void (*_BodyFrame)(void *ptr, struct MessageBodyFrame *msg)) - { + RustMessageHandler* OVR_MessageHandler(void *_ptr, void (*_BodyFrame)(void *ptr, struct MessageBodyFrame *msg)) { return new RustMessageHandler(_ptr, _BodyFrame); } - void* OVR_MessageHandler_move_ptr(RustMessageHandler* mh) - { + void* OVR_MessageHandler_move_ptr(RustMessageHandler* mh) { void *ptr = mh->ptr; mh->ptr = NULL; return ptr; } - void OVR_MessageHandler_drop(RustMessageHandler* mh) - { + void OVR_MessageHandler_drop(RustMessageHandler* mh) { delete mh; } - void OVR_system_init(void) - { + void OVR_system_init(void) { OVR::System::Init(OVR::Log::ConfigureDefaultLog(OVR::LogMask_All)); } - OVR::DeviceManager* OVR_DeviceManager_Create(void) - { + OVR::DeviceManager* OVR_DeviceManager_Create(void) { return OVR::DeviceManager::Create(); } - void OVR_DeviceManager_drop(OVR::DeviceManager *dm) - { + void OVR_DeviceManager_drop(OVR::DeviceManager *dm) { delete dm; } - OVR::HMDDevice* OVR_DeviceManager_EnumerateDevices(OVR::DeviceManager* pManager) - { + OVR::HMDDevice* OVR_DeviceManager_EnumerateDevices(OVR::DeviceManager* pManager) { return pManager->EnumerateDevices().CreateDevice(); } - struct HMDInfoC OVR_HMDDevice_GetDeviceInfo(OVR::HMDDevice* pHMD) - { + struct HMDInfoC OVR_HMDDevice_GetDeviceInfo(OVR::HMDDevice* pHMD) { OVR::HMDInfo hmd; struct HMDInfoC out_hmd; pHMD->GetDeviceInfo(&hmd); @@ -131,158 +121,130 @@ extern "C" return out_hmd; } - OVR::SensorDevice* OVR_HMDDevice_GetSensor(OVR::HMDDevice* pHMD) - { + OVR::SensorDevice* OVR_HMDDevice_GetSensor(OVR::HMDDevice* pHMD) { return pHMD->GetSensor(); } - void OVR_SensorDevice_drop(OVR::SensorDevice* sd) - { + void OVR_SensorDevice_drop(OVR::SensorDevice* sd) { delete sd; } - void OVR_SensorDevice_SetMessageHandler(OVR::SensorDevice* sensor, RustMessageHandler* mh) - { + void OVR_SensorDevice_SetMessageHandler(OVR::SensorDevice* sensor, RustMessageHandler* mh) { sensor->SetMessageHandler(mh); } - OVR::SensorFusion* OVR_SensorFusion(OVR::HMDDevice* pHMD) - { + OVR::SensorFusion* OVR_SensorFusion(OVR::HMDDevice* pHMD) { OVR::SensorFusion* SFusion = new OVR::SensorFusion; return SFusion; } - bool OVR_SensorFusion_IsAttachedToSensor(OVR::SensorFusion *sf) - { + bool OVR_SensorFusion_IsAttachedToSensor(OVR::SensorFusion *sf) { return sf->IsAttachedToSensor(); } - Quatf OVR_SensorFusion_GetOrientation(OVR::SensorFusion *sf) - { + Quatf OVR_SensorFusion_GetOrientation(OVR::SensorFusion *sf) { OVR::Quatf quat = sf->GetOrientation(); Quatf out = {quat.x, quat.y, quat.z, quat.w}; return out; } - Quatf OVR_SensorFusion_GetPredictedOrientation(OVR::SensorFusion *sf) - { + Quatf OVR_SensorFusion_GetPredictedOrientation(OVR::SensorFusion *sf) { OVR::Quatf quat = sf->GetPredictedOrientation(); Quatf out = {quat.x, quat.y, quat.z, quat.w}; return out; } - Quatf OVR_SensorFusion_GetPredictedOrientation_opt(OVR::SensorFusion *sf, float dt) - { + Quatf OVR_SensorFusion_GetPredictedOrientation_opt(OVR::SensorFusion *sf, float dt) { OVR::Quatf quat = sf->GetPredictedOrientation(dt); Quatf out = {quat.x, quat.y, quat.z, quat.w}; return out; } - Vector3f OVR_SensorFusion_GetAcceleration(OVR::SensorFusion *sf) - { + Vector3f OVR_SensorFusion_GetAcceleration(OVR::SensorFusion *sf) { OVR::Vector3f vec = sf->GetAcceleration(); Vector3f out = {vec.x, vec.y, vec.z}; return out; } - Vector3f OVR_SensorFusion_GetAngularVelocity(OVR::SensorFusion *sf) - { + Vector3f OVR_SensorFusion_GetAngularVelocity(OVR::SensorFusion *sf) { OVR::Vector3f vec = sf->GetAngularVelocity(); Vector3f out = {vec.x, vec.y, vec.z}; return out; } - Vector3f OVR_SensorFusion_GetMagnetometer(OVR::SensorFusion *sf) - { + Vector3f OVR_SensorFusion_GetMagnetometer(OVR::SensorFusion *sf) { OVR::Vector3f vec = sf->GetMagnetometer(); Vector3f out = {vec.x, vec.y, vec.z}; return out; } - Vector3f OVR_SensorFusion_GetCalibratedMagnetometer(OVR::SensorFusion *sf) - { + Vector3f OVR_SensorFusion_GetCalibratedMagnetometer(OVR::SensorFusion *sf) { OVR::Vector3f vec = sf->GetCalibratedMagnetometer(); Vector3f out = {vec.x, vec.y, vec.z}; return out; } - void OVR_SensorFusion_Reset(OVR::SensorFusion *sf) - { + void OVR_SensorFusion_Reset(OVR::SensorFusion *sf) { sf->Reset(); } - void OVR_SensorFusion_EnableMotionTracking(OVR::SensorFusion *sf, bool enable) - { + void OVR_SensorFusion_EnableMotionTracking(OVR::SensorFusion *sf, bool enable) { sf->EnableMotionTracking(enable); } - bool OVR_SensorFusion_IsMotionTrackingEnabled(OVR::SensorFusion *sf) - { + bool OVR_SensorFusion_IsMotionTrackingEnabled(OVR::SensorFusion *sf) { return sf->IsMotionTrackingEnabled(); } - float OVR_SensorFusion_GetPredictionDelta(OVR::SensorFusion *sf) - { + float OVR_SensorFusion_GetPredictionDelta(OVR::SensorFusion *sf) { return sf->GetPredictionDelta(); } - void OVR_SensorFusion_SetPrediction(OVR::SensorFusion *sf, float dt, bool enable) - { + void OVR_SensorFusion_SetPrediction(OVR::SensorFusion *sf, float dt, bool enable) { sf->SetPrediction(dt, enable); } - void OVR_SensorFusion_SetPredictionEnabled(OVR::SensorFusion *sf, bool enable) - { + void OVR_SensorFusion_SetPredictionEnabled(OVR::SensorFusion *sf, bool enable) { sf->SetPredictionEnabled(enable); } - bool OVR_SensorFusion_IsPredictionEnabled(OVR::SensorFusion *sf) - { + bool OVR_SensorFusion_IsPredictionEnabled(OVR::SensorFusion *sf) { return sf->IsPredictionEnabled(); } - void OVR_SensorFusion_SetGravityEnabled(OVR::SensorFusion *sf, bool enableGravity) - { + void OVR_SensorFusion_SetGravityEnabled(OVR::SensorFusion *sf, bool enableGravity) { sf->SetGravityEnabled(enableGravity); } - bool OVR_SensorFusion_IsGravityEnabled(OVR::SensorFusion *sf) - { + bool OVR_SensorFusion_IsGravityEnabled(OVR::SensorFusion *sf) { return sf->IsGravityEnabled(); } - float OVR_SensorFusion_GetAccelGain(OVR::SensorFusion *sf) - { + float OVR_SensorFusion_GetAccelGain(OVR::SensorFusion *sf) { return sf->GetAccelGain(); } - void OVR_SensorFusion_SetAccelGain(OVR::SensorFusion *sf, float ag) - { + void OVR_SensorFusion_SetAccelGain(OVR::SensorFusion *sf, float ag) { return sf->SetAccelGain(ag); } - bool OVR_SensorFusion_SaveMagCalibration(OVR::SensorFusion *sf, const char *calibrationName) - { + bool OVR_SensorFusion_SaveMagCalibration(OVR::SensorFusion *sf, const char *calibrationName) { return sf->SaveMagCalibration(calibrationName); } - bool OVR_SensorFusion_LoadMagCalibration(OVR::SensorFusion *sf, const char *calibrationName) - { + bool OVR_SensorFusion_LoadMagCalibration(OVR::SensorFusion *sf, const char *calibrationName) { return sf->LoadMagCalibration(calibrationName); } - void OVR_SensorFusion_SetYawCorrectionEnabled(OVR::SensorFusion *sf, bool enable) - { + void OVR_SensorFusion_SetYawCorrectionEnabled(OVR::SensorFusion *sf, bool enable) { sf->SetYawCorrectionEnabled(enable); } - bool OVR_SensorFusion_IsYawCorrectionEnabled(OVR::SensorFusion *sf) - { + bool OVR_SensorFusion_IsYawCorrectionEnabled(OVR::SensorFusion *sf) { return sf->IsYawCorrectionEnabled(); } - void OVR_SensorFusion_SetMagCalibration(OVR::SensorFusion *sf, Matrix4f *m) - { + void OVR_SensorFusion_SetMagCalibration(OVR::SensorFusion *sf, Matrix4f *m) { OVR::Matrix4f mat = OVR::Matrix4f(m->m11, m->m12, m->m13, m->m14, m->m21, m->m22, m->m23, m->m24, m->m31, m->m32, m->m33, m->m34, @@ -290,8 +252,7 @@ extern "C" sf->SetMagCalibration(mat); } - Matrix4f OVR_SensorFusion_GetMagCalibration(OVR::SensorFusion *sf) - { + Matrix4f OVR_SensorFusion_GetMagCalibration(OVR::SensorFusion *sf) { OVR::Matrix4f m = sf->GetMagCalibration(); Matrix4f out = { m.M[0][0], m.M[0][1], m.M[0][2], m.M[0][3], @@ -302,28 +263,23 @@ extern "C" return out; } - time_t OVR_SensorFusion_GetMagCalibrationTime(OVR::SensorFusion *sf) - { + time_t OVR_SensorFusion_GetMagCalibrationTime(OVR::SensorFusion *sf) { return sf->GetMagCalibrationTime(); } - bool OVR_SensorFusion_HasMagCalibration(OVR::SensorFusion *sf) - { + bool OVR_SensorFusion_HasMagCalibration(OVR::SensorFusion *sf) { return sf->HasMagCalibration(); } - void OVR_SensorFusion_ClearMagCalibration(OVR::SensorFusion *sf) - { + void OVR_SensorFusion_ClearMagCalibration(OVR::SensorFusion *sf) { sf->ClearMagCalibration(); } - void OVR_SensorFusion_ClearMagReferences(OVR::SensorFusion *sf) - { + void OVR_SensorFusion_ClearMagReferences(OVR::SensorFusion *sf) { sf->ClearMagReferences(); } - Vector3f OVR_SensorFusion_GetCalibratedMagValue(OVR::SensorFusion *sf, const Vector3f *rawMag) - { + Vector3f OVR_SensorFusion_GetCalibratedMagValue(OVR::SensorFusion *sf, const Vector3f *rawMag) { OVR::Vector3f input = OVR::Vector3f(rawMag->x, rawMag->y, rawMag->z); OVR::Vector3f vec = sf->GetCalibratedMagValue(input); Vector3f out = {vec.x, vec.y, vec.z}; @@ -331,13 +287,11 @@ extern "C" } - bool OVR_SensorFusion_AttachToSensor(OVR::SensorFusion* SFusion, OVR::SensorDevice *pSensor) - { + bool OVR_SensorFusion_AttachToSensor(OVR::SensorFusion* SFusion, OVR::SensorDevice *pSensor) { return (*SFusion).AttachToSensor(pSensor); } - void OVR_SensorFusion_OnMessage(OVR::SensorFusion* SFusion, const MessageBodyFrame *msg) - { + void OVR_SensorFusion_OnMessage(OVR::SensorFusion* SFusion, const MessageBodyFrame *msg) { OVR::MessageBodyFrame sensor(NULL); sensor.TimeDelta = msg->TimeDelta; @@ -350,8 +304,7 @@ extern "C" SFusion->OnMessage(sensor); } - void OVR_SensorFusion_drop(OVR::SensorFusion *sf) - { + void OVR_SensorFusion_drop(OVR::SensorFusion *sf) { delete sf; } } \ No newline at end of file diff --git a/src/oculus-vr/wrapper.o b/src/oculus-vr/wrapper.o new file mode 100644 index 0000000000000000000000000000000000000000..c38c207774482776d8a54d1e11847c4594594826 GIT binary patch literal 52016 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 TJeM|eST6Pv$wdOM5d8laPnG(5 literal 0 HcmV?d00001