2 #include <msp/gl/meshbuilder.h>
3 #include "stereocombiner.h"
9 const char mirror_vs_source[] =
10 "uniform vec2 scale;\n"
11 "varying vec2 texcoord;\n"
14 " gl_Position = vec4(gl_Vertex.xy, 0.0, 1.0);\n"
15 " texcoord = gl_Vertex.xy*scale*0.5+0.5;\n"
18 const char mirror_fs_source[] =
19 "uniform sampler2D texture;\n"
20 "varying vec2 texcoord;\n"
23 " gl_FragColor = texture2D(texture, texcoord);\n"
32 StereoCombiner::StereoCombiner():
40 StereoCombiner::~StereoCombiner()
45 void StereoCombiner::configure_eye_frustums(const Frustum &left_frustum, const Frustum &right_frustum)
47 float vertical = max(max(left_frustum.top, -left_frustum.bottom), max(right_frustum.top, -right_frustum.bottom));
48 fov = Geometry::atan<float>(vertical)*2.0f;
50 float inner = max(left_frustum.right, -right_frustum.left);
51 float outer = max(-left_frustum.left, right_frustum.right);
52 frustum_skew = (inner-outer)/(inner+outer);
54 render_aspect = (inner+outer)/(vertical*2);
57 void StereoCombiner::set_mirroring(bool m)
59 if(m && !is_mirroring_supported())
60 throw runtime_error("mirroring not supported");
63 mirror = new MirrorView;
71 void StereoCombiner::render_mirror(const GL::Texture2D &tex) const
76 GL::Bind bind_tex(tex);
77 GL::Bind bind_shprog(mirror->shader);
78 mirror->shdata.apply();
83 StereoCombiner::Frustum::Frustum():
90 StereoCombiner::Frustum::Frustum(float l, float r, float b, float t):
98 StereoCombiner::MirrorView::MirrorView():
100 shader(mirror_vs_source, mirror_fs_source)
102 GL::MeshBuilder bld(mesh);
103 bld.begin(GL::TRIANGLE_STRIP);
110 shdata.uniform("scale", 0.5f, 0.5f);