]> git.tdb.fi Git - libs/vr.git/blobdiff - source/openvr/openvrdevice.cpp
Implement a basic OpenVR driver
[libs/vr.git] / source / openvr / openvrdevice.cpp
diff --git a/source/openvr/openvrdevice.cpp b/source/openvr/openvrdevice.cpp
new file mode 100644 (file)
index 0000000..1081a04
--- /dev/null
@@ -0,0 +1,61 @@
+#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