--- /dev/null
+#include <openvr.h>
+#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<vr::TrackedDevicePose_t> 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