]> git.tdb.fi Git - libs/vr.git/blob - source/stereoview.h
4dce63b99870b96aa5c52cdb5296fcdba2311344
[libs/vr.git] / source / stereoview.h
1 #ifndef MSP_GL_STEREOVIEW_H_
2 #define MSP_GL_STEREOVIEW_H_
3
4 #include <msp/geometry/angle.h>
5 #include "camera.h"
6 #include "framebuffer.h"
7 #include "renderable.h"
8 #include "renderbuffer.h"
9 #include "texture2d.h"
10
11 namespace Msp {
12 namespace GL {
13
14 class StereoCombiner;
15
16 class StereoView: public Renderable
17 {
18 private:
19         struct RenderTarget
20         {
21                 Framebuffer fbo;
22                 Texture2D color;
23                 Renderbuffer depth;
24
25                 RenderTarget(unsigned, unsigned);
26         };
27
28         struct EyeParams
29         {
30                 Geometry::Angle<float> fov;
31                 float aspect;
32                 float near_clip;
33                 float far_clip;
34         };
35
36         struct Eye
37         {
38                 mutable Camera camera;
39                 RenderTarget *target;
40
41                 Eye();
42
43                 void create_target(unsigned, unsigned);
44                 void setup_frame(const Camera &, const Vector3 &, const EyeParams &) const;
45                 void render(const Renderable &, const Tag &) const;
46         };
47
48         unsigned width;
49         unsigned height;
50         const Camera &base_camera;
51         const Renderable &renderable;
52         const StereoCombiner *combiner;
53         Eye left;
54         Eye right;
55         float eye_spacing;
56         mutable Vector3 offset_axis;
57
58 public:
59         StereoView(unsigned, unsigned, const Camera &, const Renderable &, const StereoCombiner &);
60
61         void set_combiner(const StereoCombiner &);
62         void set_eye_spacing(float);
63
64         virtual void setup_frame() const;
65         virtual void finish_frame() const;
66
67         virtual void render(const Tag & = Tag()) const;
68         virtual void render(Renderer &, const Tag & = Tag()) const;
69 };
70
71 } // namespace GL
72 } // namespace Msp
73
74 #endif