X-Git-Url: http://git.tdb.fi/?p=libs%2Fvr.git;a=blobdiff_plain;f=source%2Foculusriftdevice.cpp;h=f73371f6c77d921f4ccc7ad3a04b6d2fb86060de;hp=5f752df1a0d0b279b55a646c239ffbafc3581e8a;hb=ed0489e44b7cb9748e5086e1e78ef65e1c3d1930;hpb=245c16a330e7c0cec79f5f96120b51b47a295392 diff --git a/source/oculusriftdevice.cpp b/source/oculusriftdevice.cpp index 5f752df..f73371f 100644 --- a/source/oculusriftdevice.cpp +++ b/source/oculusriftdevice.cpp @@ -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().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