-#include <cmath>
#include <msp/gl/meshbuilder.h>
#include <msp/gl/texture2d.h>
#include "oculusriftcombiner.h"
-#include "oculusriftdevice.h"
-#include "oculusriftdevice_private.h"
+#include "oculusriftsystem.h"
+#include "oculusriftsystem_private.h"
using namespace std;
namespace Msp {
namespace VR {
-OculusRiftCombiner::OculusRiftCombiner(OculusRiftDevice &d, GL::View &v):
+struct OculusRiftCombiner::Frustum: StereoCombiner::Frustum
+{
+ Frustum(const ovrFovPort &);
+};
+
+
+OculusRiftCombiner::OculusRiftCombiner(OculusRiftSystem &d, GL::View &v):
device(d),
view(v),
left_mesh((GL::VERTEX2, GL::TEXCOORD2,0, GL::TEXCOORD2,1, GL::TEXCOORD2,2, GL::TEXCOORD2,3)),
ovrFovPort left_fov = hmd->DefaultEyeFov[ovrEye_Left];
ovrFovPort right_fov = hmd->DefaultEyeFov[ovrEye_Right];
- float vertical = max(max(left_fov.UpTan, left_fov.DownTan), max(right_fov.UpTan, right_fov.DownTan));
- fov = Geometry::atan<float>(vertical)*2.0f;
+ configure_eye_frustums(Frustum(left_fov), Frustum(right_fov));
- float inner = max(left_fov.RightTan, right_fov.LeftTan);
- float outer = max(left_fov.LeftTan, right_fov.RightTan);
- frustum_skew = (inner-outer)/(inner+outer);
-
- left_fov.UpTan = right_fov.UpTan = vertical;
- left_fov.DownTan = right_fov.DownTan = vertical;
- left_fov.RightTan = right_fov.LeftTan = inner;
- left_fov.LeftTan = right_fov.RightTan = outer;
+ left_fov.UpTan = left_fov.DownTan = tan(fov/2.0f);
+ left_fov.LeftTan = left_fov.UpTan*render_aspect*(1-frustum_skew);
+ left_fov.RightTan = left_fov.UpTan*render_aspect*(1+frustum_skew);
+ right_fov = left_fov;
+ swap(right_fov.LeftTan, right_fov.RightTan);
create_distortion_mesh(left_mesh, hmd, ovrEye_Left, left_fov);
create_distortion_mesh(right_mesh, hmd, ovrEye_Right, right_fov);
ovrSizei tex_size = ovrHmd_GetFovTextureSize(hmd, ovrEye_Left, left_fov, 1.0);
target_width = tex_size.w;
target_height = tex_size.h;
- render_aspect = (inner+outer)/(vertical*2);
left_shdata.uniform("texture", 0);
right_shdata.uniform("texture", 0);
device.end_frame();
}
+
+OculusRiftCombiner::Frustum::Frustum(const ovrFovPort &fov):
+ StereoCombiner::Frustum(-fov.LeftTan, fov.RightTan, -fov.DownTan, fov.UpTan)
+{ }
+
} // namespace VR
} // namespace Msp