X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;ds=sidebyside;f=source%2Fovr%2Foculusriftdevice.cpp;fp=source%2Fovr%2Foculusriftdevice.cpp;h=32558e049aab576cc82403789c65058b78f9d7f9;hb=12044b218363bdd93f9fc1b3c71167d700144e45;hp=0000000000000000000000000000000000000000;hpb=8d1197440f07062a1020d902619ae8e9a494baa0;p=libs%2Fvr.git diff --git a/source/ovr/oculusriftdevice.cpp b/source/ovr/oculusriftdevice.cpp new file mode 100644 index 0000000..32558e0 --- /dev/null +++ b/source/ovr/oculusriftdevice.cpp @@ -0,0 +1,88 @@ +#include +#include "oculusriftdevice.h" +#include "oculusriftdevice_private.h" + +using namespace std; + +namespace Msp { +namespace VR { + +unsigned OculusRiftDevice::n_instances = 0; + +OculusRiftDevice::OculusRiftDevice(): + priv(new Private), + frame_index(0) +{ + if(!n_instances) + ovr_Initialize(); + ++n_instances; + + priv->ovr_hmd = ovrHmd_Create(0); + if(!priv->ovr_hmd) + { + delete priv; + throw runtime_error("rift hmd not found"); + } +} + +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 +{ + return new OculusRiftCamera(*this, bc); +} + +OculusRiftCombiner *OculusRiftDevice::create_combiner() const +{ + 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