1 #include <msp/graphics/display.h>
2 #include <msp/vr/stereoview.h>
3 #include "oculusriftdevice.h"
4 #include "oculusriftdevice_private.h"
11 unsigned OculusRiftDevice::n_instances = 0;
13 OculusRiftDevice::OculusRiftDevice():
21 priv->ovr_hmd = ovrHmd_Create(0);
25 throw runtime_error("rift hmd not found");
29 OculusRiftDevice::~OculusRiftDevice()
31 ovrHmd_Destroy(priv->ovr_hmd);
39 void OculusRiftDevice::configure_window(Graphics::Window &window) const
41 Graphics::WindowOptions win_opts = window.get_options();
42 win_opts.width = priv->ovr_hmd->Resolution.w;
43 win_opts.height = priv->ovr_hmd->Resolution.h;
45 const list<Graphics::Monitor> &monitors = window.get_display().get_monitors();
46 string hmd_name = priv->ovr_hmd->ProductName;
47 for(list<Graphics::Monitor>::const_iterator i=monitors.begin(); i!=monitors.end(); ++i)
48 if(hmd_name.find(i->name)!=string::npos)
50 win_opts.fullscreen = true;
51 win_opts.fullscreen_monitor = &*i;
52 win_opts.fullscreen_exclusive = false;
55 window.reconfigure(win_opts);
58 void OculusRiftDevice::configure_view(StereoView &view) const
60 ovrEyeRenderDesc left_desc = ovrHmd_GetRenderDesc(priv->ovr_hmd, ovrEye_Left, priv->ovr_hmd->DefaultEyeFov[ovrEye_Left]);
61 ovrEyeRenderDesc right_desc = ovrHmd_GetRenderDesc(priv->ovr_hmd, ovrEye_Right, priv->ovr_hmd->DefaultEyeFov[ovrEye_Left]);
62 const ovrVector3f &l = left_desc.HmdToEyeViewOffset;
63 const ovrVector3f &r = right_desc.HmdToEyeViewOffset;
64 view.set_eye_matrices(GL::Matrix::translation(GL::Vector3(l.x, l.y, l.z)), GL::Matrix::translation(GL::Vector3(r.x, r.y, r.z)));
67 OculusRiftCamera *OculusRiftDevice::create_camera(const GL::Camera &bc)
69 return new OculusRiftCamera(*this, bc);
72 OculusRiftCombiner *OculusRiftDevice::create_combiner(GL::View &view)
74 return new OculusRiftCombiner(*this, view);
77 void OculusRiftDevice::begin_frame()
79 priv->frame_timing = ovrHmd_BeginFrameTiming(priv->ovr_hmd, ++frame_index);
83 void OculusRiftDevice::end_frame()
86 ovrHmd_EndFrameTiming(priv->ovr_hmd);
87 timing_active = false;
90 double OculusRiftDevice::get_tracking_time() const
93 throw logic_error("timing not active");
94 return priv->frame_timing.ScanoutMidpointSeconds;
97 double OculusRiftDevice::get_timewarp_time() const
100 throw logic_error("timing not active");
101 return priv->frame_timing.TimewarpPointSeconds;
104 double OculusRiftDevice::get_current_time() const
106 return ovr_GetTimeInSeconds();