]> git.tdb.fi Git - libs/vr.git/blobdiff - source/oculusriftcamera.cpp
Integrate with LibOVR
[libs/vr.git] / source / oculusriftcamera.cpp
diff --git a/source/oculusriftcamera.cpp b/source/oculusriftcamera.cpp
new file mode 100644 (file)
index 0000000..9b85d12
--- /dev/null
@@ -0,0 +1,40 @@
+#include "oculusriftcamera.h"
+#include "oculusriftcamera_private.h"
+#include "oculusriftdevice.h"
+#include "oculusriftdevice_private.h"
+
+namespace Msp {
+namespace VR {
+
+OculusRiftCamera::OculusRiftCamera(const OculusRiftDevice &d, const GL::Camera &c):
+       device(d),
+       base_camera(c),
+       priv(new Private)
+{
+       const OculusRiftDevice::Private &dev_priv = device.get_private();
+       priv->ovr_sensor = dev_priv.ovr_hmd->GetSensor();
+       priv->fusion.AttachToSensor(priv->ovr_sensor);
+}
+
+OculusRiftCamera::~OculusRiftCamera()
+{
+       delete priv;
+}
+
+void OculusRiftCamera::update()
+{
+       OVR::Matrix4f sensor_matrix = priv->fusion.GetOrientation();
+       const float *m = &sensor_matrix.M[0][0];
+
+       const GL::Vector3 &base_look = base_camera.get_look_direction();
+       GL::Vector3 base_right = normalize(cross(base_look, base_camera.get_up_direction()));
+       GL::Vector3 base_up = normalize(cross(base_right, base_look));
+
+       set_position(base_camera.get_position());
+       set_up_direction(base_right*m[1]+base_up*m[5]-base_look*m[9]);
+       set_look_direction(-base_right*m[2]-base_up*m[6]+base_look*m[10]);
+       set_depth_clip(base_camera.get_near_clip(), base_camera.get_far_clip());
+}
+
+} // namespace VR
+} // namespace Msp