-#ifndef MSP_GL_STEREOCOMBINER_H_
-#define MSP_GL_STEREOCOMBINER_H_
+#ifndef MSP_VR_STEREOCOMBINER_H_
+#define MSP_VR_STEREOCOMBINER_H_
#include <msp/geometry/angle.h>
+#include <msp/gl/mesh.h>
+#include <msp/gl/program.h>
+#include <msp/gl/programdata.h>
+#include <msp/gl/texture2d.h>
namespace Msp {
-namespace GL {
-
-class Texture2D;
+namespace VR {
class StereoCombiner
{
protected:
- unsigned width_div;
- unsigned height_div;
- bool keep_aspect;
+ struct Frustum
+ {
+ float left;
+ float right;
+ float bottom;
+ float top;
+
+ Frustum();
+ Frustum(float, float, float, float);
+ };
+
+ struct MirrorView
+ {
+ GL::Mesh mesh;
+ GL::Program shader;
+ GL::ProgramData shdata;
+
+ MirrorView();
+ };
+
+ unsigned target_width;
+ unsigned target_height;
+ float render_aspect;
Geometry::Angle<float> fov;
- float oversize;
+ float frustum_skew;
+ MirrorView *mirror;
StereoCombiner();
public:
virtual ~StereoCombiner() { }
- unsigned get_width_divisor() const { return width_div; }
- unsigned get_height_divisor() const { return height_div; }
- bool is_aspect_kept() const { return keep_aspect; }
+protected:
+ void configure_eye_frustums(const Frustum &, const Frustum &);
+public:
+ float get_target_width() const { return target_width; }
+ float get_target_height() const { return target_height; }
+ float get_render_aspect() const { return render_aspect; }
const Geometry::Angle<float> &get_field_of_view() const { return fov; }
- float get_oversize() const { return oversize; }
+ float get_frustum_skew() const { return frustum_skew; }
- virtual void render(const Texture2D &, const Texture2D &) const = 0;
+ void set_mirroring(bool);
+
+ virtual void prepare() const { }
+ virtual void render(const GL::Texture2D &, const GL::Texture2D &) const = 0;
+protected:
+ void render_mirror(const GL::Texture2D &) const;
};
-} // namespace GL
+} // namespace VR
} // namespace Msp
#endif