]> git.tdb.fi Git - libs/vr.git/blobdiff - source/oculusriftdevice.cpp
Chromatic aberration correction is always included in distortion
[libs/vr.git] / source / oculusriftdevice.cpp
index 5f752df1a0d0b279b55a646c239ffbafc3581e8a..f73371f6c77d921f4ccc7ad3a04b6d2fb86060de 100644 (file)
@@ -1,18 +1,23 @@
 #include "oculusriftdevice.h"
 #include "oculusriftdevice_private.h"
+#include "stereoview.h"
 
 using namespace std;
 
 namespace Msp {
 namespace VR {
 
+unsigned OculusRiftDevice::n_instances = 0;
+
 OculusRiftDevice::OculusRiftDevice():
-       priv(new Private)
+       priv(new Private),
+       frame_index(0)
 {
-       static OVR::System system(OVR::Log::ConfigureDefaultLog(OVR::LogMask_Debug));
+       if(!n_instances)
+               ovr_Initialize();
+       ++n_instances;
 
-       priv->ovr_manager = OVR::DeviceManager::Create();
-       priv->ovr_hmd = priv->ovr_manager->EnumerateDevices<OVR::HMDDevice>().CreateDevice();
+       priv->ovr_hmd = ovrHmd_Create(0);
        if(!priv->ovr_hmd)
        {
                delete priv;
@@ -22,7 +27,19 @@ OculusRiftDevice::OculusRiftDevice():
 
 OculusRiftDevice::~OculusRiftDevice()
 {
+       ovrHmd_Destroy(priv->ovr_hmd);
        delete priv;
+
+       --n_instances;
+       if(!n_instances)
+               ovr_Shutdown();
+}
+
+void OculusRiftDevice::configure_view(StereoView &view) const
+{
+       ovrEyeRenderDesc left_desc = ovrHmd_GetRenderDesc(priv->ovr_hmd, ovrEye_Left, priv->ovr_hmd->DefaultEyeFov[ovrEye_Left]);
+       ovrEyeRenderDesc right_desc = ovrHmd_GetRenderDesc(priv->ovr_hmd, ovrEye_Right, priv->ovr_hmd->DefaultEyeFov[ovrEye_Left]);
+       view.set_eye_spacing(left_desc.HmdToEyeViewOffset.x-right_desc.HmdToEyeViewOffset.x);
 }
 
 OculusRiftCamera *OculusRiftDevice::create_camera(const GL::Camera &bc) const
@@ -32,19 +49,39 @@ OculusRiftCamera *OculusRiftDevice::create_camera(const GL::Camera &bc) const
 
 OculusRiftCombiner *OculusRiftDevice::create_combiner() const
 {
-       OculusRiftCombiner *combiner = new OculusRiftCombiner;
+       return new OculusRiftCombiner(*this);
+}
 
-       OVR::HMDInfo info;
-       if(priv->ovr_hmd->GetDeviceInfo(&info))
-       {
-               combiner->set_view_distance(info.EyeToScreenDistance/info.HScreenSize);
-               combiner->set_lens_separation(info.LensSeparationDistance/info.HScreenSize);
-               combiner->set_distortion(info.DistortionK[0], info.DistortionK[1], info.DistortionK[2], info.DistortionK[3]);
-               combiner->set_red_aberration(info.ChromaAbCorrection[0], info.ChromaAbCorrection[1]);
-               combiner->set_blue_aberration(info.ChromaAbCorrection[2], info.ChromaAbCorrection[3]);
-       }
+void OculusRiftDevice::begin_frame()
+{
+       priv->frame_timing = ovrHmd_BeginFrameTiming(priv->ovr_hmd, ++frame_index);
+       timing_active = true;
+}
 
-       return combiner;
+void OculusRiftDevice::end_frame()
+{
+       glFinish();
+       ovrHmd_EndFrameTiming(priv->ovr_hmd);
+       timing_active = false;
+}
+
+double OculusRiftDevice::get_tracking_time() const
+{
+       if(!timing_active)
+               throw logic_error("timing not active");
+       return priv->frame_timing.ScanoutMidpointSeconds;
+}
+
+double OculusRiftDevice::get_timewarp_time() const
+{
+       if(!timing_active)
+               throw logic_error("timing not active");
+       return priv->frame_timing.TimewarpPointSeconds;
+}
+
+double OculusRiftDevice::get_current_time() const
+{
+       return ovr_GetTimeInSeconds();
 }
 
 } // namespace VR