]> git.tdb.fi Git - libs/demoscene.git/blob - source/vignette.cpp
e4d7de8f3a848e61c4fd31c6fce8059a550010ed
[libs/demoscene.git] / source / vignette.cpp
1 #include <algorithm>
2 #include <msp/gl/mesh.h>
3 #include <msp/gl/renderer.h>
4 #include <msp/gl/texture2d.h>
5 #include "resources.h"
6 #include "vignette.h"
7
8 using namespace std;
9
10 namespace Msp {
11 namespace DemoScene {
12
13 Vignette::Vignette(float aspect):
14         mesh(get_fullscreen_quad()),
15         shprog(Resources::get_builtins().get<GL::Program>("vignette.glsl"))
16 {
17         shdata.uniform("coord_scale", min(aspect, 1.0f), min(1.0f/aspect, 1.0f));
18         set_optical(1.0f, 0.5f);
19         set_natural(1.0f, 1.0f);
20 }
21
22 void Vignette::set_optical(float pupil, float aperture)
23 {
24         if(pupil<0.0f || aperture<0.0f || aperture>pupil)
25                 throw std::invalid_argument("Vignette::set_optical");
26
27         float p_sq = pupil*pupil;
28         float a_sq = aperture*aperture;
29         float two_ap = 2*pupil*aperture;
30         shdata.uniform("optical", pupil, aperture, a_sq, a_sq*M_PI);
31         shdata.uniform("optical_range", p_sq-two_ap+a_sq, p_sq+two_ap+a_sq);
32 }
33
34 void Vignette::set_natural(float radius, float darkening)
35 {
36         if(radius<=0.0f || darkening<0.0f)
37                 throw std::invalid_argument("Vignette::set_natural");
38
39         float v = pow(2.0f, -darkening);
40         float t_sq = 1/sqrt(v)-1;
41         shdata.uniform("natural", t_sq/(radius*radius));
42 }
43
44 void Vignette::render(GL::Renderer &renderer, const GL::Texture2D &color, const GL::Texture2D &)
45 {
46         renderer.set_texture(&color);
47         renderer.set_shader_program(&shprog, &shdata);
48         mesh.draw(renderer);
49 }
50
51
52 Vignette::Template::Template():
53         pupil(1.0f),
54         aperture(0.5f),
55         radius(1.0f),
56         darkening(1.0f)
57 { }
58
59 Vignette *Vignette::Template::create(unsigned w, unsigned h) const
60 {
61         Vignette *vign = new Vignette(static_cast<float>(w)/h);
62         vign->set_optical(pupil, aperture);
63         vign->set_natural(radius, darkening);
64         return vign;
65 }
66
67
68 Vignette::Template::Loader::Loader(Template &t):
69         DerivedObjectLoader<Template, PostProcessor::Template::Loader>(t)
70 {
71         add("optical", &Template::pupil, &Template::aperture);
72         add("natural", &Template::radius, &Template::darkening);
73 }
74
75 } // namespace DemoScene
76 } // namespace Msp