#include "oculusriftdevice.h"
#include "oculusriftdevice_private.h"
+#include "stereoview.h"
using namespace std;
unsigned OculusRiftDevice::n_instances = 0;
OculusRiftDevice::OculusRiftDevice():
- priv(new Private)
+ priv(new Private),
+ frame_index(0)
{
if(!n_instances)
ovr_Initialize();
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
{
return new OculusRiftCamera(*this, bc);
return new OculusRiftCombiner(*this);
}
+void OculusRiftDevice::begin_frame()
+{
+ priv->frame_timing = ovrHmd_BeginFrameTiming(priv->ovr_hmd, ++frame_index);
+ timing_active = true;
+}
+
+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
} // namespace Msp