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