X-Git-Url: http://git.tdb.fi/?p=libs%2Fvr.git;a=blobdiff_plain;f=source%2Fopenvr%2Fopenvrdevice.cpp;fp=source%2Fopenvr%2Fopenvrdevice.cpp;h=1081a04937767ee68cb09521522fa00cfc32ab32;hp=0000000000000000000000000000000000000000;hb=78598b41009aeabb7f9b4b4ddc05b68e7edd6eb6;hpb=ca9e343224762bd43c91af1b15ecba12ebf3e991 diff --git a/source/openvr/openvrdevice.cpp b/source/openvr/openvrdevice.cpp new file mode 100644 index 0000000..1081a04 --- /dev/null +++ b/source/openvr/openvrdevice.cpp @@ -0,0 +1,61 @@ +#include +#include "openvrdevice.h" + +using namespace std; + +namespace Msp { +namespace VR { + +unsigned OpenVRDevice::n_instances = 0; + +OpenVRDevice::OpenVRDevice() +{ + if(!n_instances) + { + vr::EVRInitError init_err; + vr::VR_Init(&init_err, vr::VRApplication_Scene); + if(init_err!=vr::VRInitError_None) + throw runtime_error("OpenVR initialization failed"); + } + ++n_instances; + + vr::IVRCompositor *compositor = vr::VRCompositor(); + if(!compositor) + throw runtime_error("OpenVR compositor initialization failed"); + + vr::VRCompositor()->SetTrackingSpace(vr::TrackingUniverseSeated); +} + +OpenVRDevice::~OpenVRDevice() +{ + if(!--n_instances) + vr::VR_Shutdown(); +} + +OpenVRCamera *OpenVRDevice::create_camera(const GL::Camera &bc) +{ + return new OpenVRCamera(*this, bc); +} + +OpenVRCombiner *OpenVRDevice::create_combiner(GL::View &) +{ + return new OpenVRCombiner(*this); +} + +void OpenVRDevice::update_pose_matrices() +{ + vector poses; + poses.resize(vr::k_unTrackedDeviceIndex_Hmd+1); + vr::VRCompositor()->WaitGetPoses(&poses[0], poses.size(), 0, 0); + + vr::TrackedDevicePose_t &hmd_pose = poses[vr::k_unTrackedDeviceIndex_Hmd]; + if(hmd_pose.bPoseIsValid) + { + for(unsigned i=0; i<3; ++i) + for(unsigned j=0; j<4; ++j) + hmd_matrix(i, j) = hmd_pose.mDeviceToAbsoluteTracking.m[i][j]; + } +} + +} // namespace VR +} // namespace Msp