--- /dev/null
+#ifndef MSP_GL_STEREOVIEW_H_
+#define MSP_GL_STEREOVIEW_H_
+
+#include "camera.h"
+#include "framebuffer.h"
+#include "renderable.h"
+#include "renderbuffer.h"
+#include "texture2d.h"
+
+namespace Msp {
+namespace GL {
+
+class StereoCombiner;
+
+class StereoView: public Renderable
+{
+private:
+ struct RenderTarget
+ {
+ Framebuffer fbo;
+ Texture2D color;
+ Renderbuffer depth;
+
+ RenderTarget(unsigned, unsigned);
+ };
+
+ struct EyeParams
+ {
+ float fov;
+ float aspect;
+ float near_clip;
+ float far_clip;
+ };
+
+ struct Eye
+ {
+ mutable Camera camera;
+ RenderTarget *target;
+
+ Eye();
+
+ void create_target(unsigned, unsigned);
+ void setup_frame(const Camera &, const Vector3 &, const EyeParams &) const;
+ void render(const Renderable &, const Tag &) const;
+ };
+
+ unsigned width;
+ unsigned height;
+ const Camera &base_camera;
+ const Renderable &renderable;
+ const StereoCombiner *combiner;
+ Eye left;
+ Eye right;
+ float eye_spacing;
+ mutable Vector3 offset_axis;
+
+public:
+ StereoView(unsigned, unsigned, const Camera &, const Renderable &, const StereoCombiner &);
+
+ void set_combiner(const StereoCombiner &);
+ void set_eye_spacing(float);
+
+ virtual void setup_frame() const;
+ virtual void finish_frame() const;
+
+ virtual void render(const Tag & = Tag()) const;
+ virtual void render(Renderer &, const Tag & = Tag()) const;
+};
+
+} // namespace GL
+} // namespace Msp
+
+#endif