]> git.tdb.fi Git - libs/gl.git/blobdiff - source/stereoview.h
Add classes for stereographic rendering
[libs/gl.git] / source / stereoview.h
diff --git a/source/stereoview.h b/source/stereoview.h
new file mode 100644 (file)
index 0000000..63ee183
--- /dev/null
@@ -0,0 +1,73 @@
+#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