]> git.tdb.fi Git - libs/gl.git/blobdiff - source/bloom.cpp
Drop Id tags and copyright notices from files
[libs/gl.git] / source / bloom.cpp
index 3993c8c901b9a01c66e621af65d6bcefc5ebc1f7..0ff0c5da34210c2b155150934603dc0fbec2ef5c 100644 (file)
@@ -1,10 +1,3 @@
-/* $Id$
-
-This file is part of libmspgl
-Copyright © 2009  Mikko Rasa, Mikkosoft Productions
-Distributed under the LGPL
-*/
-
 #include <cmath>
 #include <msp/strings/formatter.h>
 #include "blend.h"
@@ -35,8 +28,8 @@ static const char blur_fs[]=
        "void main()\n"
        "{\n"
        "       gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);\n"
-       "       for(int i=-size; i<=size; ++i)\n"
-       "               gl_FragColor += texture2D(source, texcoord+delta*i)*factors[i+size];\n"
+       "       for(int i=0; i<=size*2; ++i)\n"
+       "               gl_FragColor += texture2D(source, texcoord+delta*float(i-size))*factors[i];\n"
        "}";
 
 static const char combine_vs[]=
@@ -64,34 +57,38 @@ namespace GL {
 
 Bloom::Bloom(unsigned w, unsigned h):
        blur_shader(blur_vs, blur_fs),
+       blur_shdata_common(blur_shader),
+       blur_shdata_x(blur_shader),
+       blur_shdata_y(blur_shader),
        combine_shader(combine_vs, combine_fs),
+       combine_shdata(combine_shader),
        quad(VERTEX2)
 {
        int loc = blur_shader.get_uniform_location("delta");
-       blur_shdata[0].uniform(loc, 1.0f/w, 0.0f);
-       blur_shdata[1].uniform(loc, 0.0f, 1.0f/h);
+       blur_shdata_x.uniform(loc, 1.0f/w, 0.0f);
+       blur_shdata_y.uniform(loc, 0.0f, 1.0f/h);
 
-       loc = blur_shader.get_uniform_location("source");
+       blur_shdata_common.uniform("source", 0);
        for(unsigned i=0; i<2; ++i)
        {
-               blur_shdata[i].uniform(loc, 0);
                tex[i].set_min_filter(NEAREST);
-               tex[i].storage(RGB16F, w, h, 0);
-               tex[i].image(0, RGB, UNSIGNED_BYTE, 0);
+               tex[i].storage(RGB16F, w, h);
        }
 
-       combine_shdata.uniform(combine_shader.get_uniform_location("source"), 1);
-       combine_shdata.uniform(combine_shader.get_uniform_location("blurred"), 0);
+       combine_shdata.uniform("source", 1);
+       combine_shdata.uniform("blurred", 0);
+
+       combine_texturing.attach(0, tex[1]);
 
        set_radius(2.0f);
        set_strength(0.2f);
 
        MeshBuilder mbld(quad);
-       mbld.begin(QUADS);
+       mbld.begin(TRIANGLE_STRIP);
+       mbld.vertex(0, 1);
        mbld.vertex(0, 0);
-       mbld.vertex(1, 0);
        mbld.vertex(1, 1);
-       mbld.vertex(0, 1);
+       mbld.vertex(1, 0);
        mbld.end();
 }
 
@@ -101,9 +98,7 @@ void Bloom::set_radius(float r)
                throw InvalidParameterValue("Radius must be positive");
 
        int size = min(static_cast<int>(r*3.0f), 9);
-       int loc = blur_shader.get_uniform_location("size");
-       blur_shdata[0].uniform(loc, size);
-       blur_shdata[1].uniform(loc, size);
+       blur_shdata_common.uniform("size", size);
 
        vector<float> factors(size*2+1);
        float sum = 0.0f;
@@ -112,52 +107,39 @@ void Bloom::set_radius(float r)
                sum += (factors[size+i] = exp(-i*i/r));
 
        for(int i=0; i<=size*2; ++i)
-       {
-               loc = blur_shader.get_uniform_location(format("factors[%d]", i));
-               float f = factors[i]/sum;
-               blur_shdata[0].uniform(loc, f);
-               blur_shdata[1].uniform(loc, f);
-       }
+               blur_shdata_common.uniform(format("factors[%d]", i), factors[i]/sum);
 }
 
 void Bloom::set_strength(float s)
 {
        if(s<0.0f || s>1.0f)
                throw InvalidParameterValue("Strength must be in the range [0.0, 1.0]");
-       combine_shdata.uniform(combine_shader.get_uniform_location("strength"), s);
+       combine_shdata.uniform("strength", s);
 }
 
-void Bloom::render(const Texture2D &src)
+void Bloom::render(const Texture2D &src, const Texture2D &)
 {
-       const Framebuffer *dest = Framebuffer::current();
-       blur_shader.bind();
-       fbo.bind();
-       src.bind_to(0);
-       disable(DEPTH_TEST);
-       disable(BLEND);
-       for(unsigned i=0; i<2; ++i)
+       Bind unbind_dtest(static_cast<DepthTest *>(0), true);
+       Bind unbind_blend(static_cast<Blend *>(0), true);
+
        {
-               fbo.attach(COLOR_ATTACHMENT0, tex[i], 0);
-               blur_shdata[i].apply();
-               quad.draw();
-               tex[i].bind_to(0);
+               Bind bind_shader(blur_shader);
+               blur_shdata_common.apply();
+               Bind bind_fbo(fbo, true);
+               for(unsigned i=0; i<2; ++i)
+               {
+                       Bind bind_tex(i ? tex[0] : src);
+                       fbo.attach(COLOR_ATTACHMENT0, tex[i], 0);
+                       (i ? blur_shdata_y : blur_shdata_x).apply();
+                       quad.draw();
+               }
        }
 
-       if(dest)
-               dest->bind();
-       else
-               Framebuffer::unbind();
-
-       combine_shader.bind();
+       combine_texturing.attach(1, src);
+       Bind bind_texturing(combine_texturing);
+       Bind bind_shader(combine_shader);
        combine_shdata.apply();
-       src.bind_to(1);
        quad.draw();
-       Program::unbind();
-       Texture::unbind_from(1);
-       Texture::unbind_from(0);
-       // XXX Should check if the modes were enabled in the first place
-       enable(DEPTH_TEST);
-       enable(BLEND);
 }
 
 } // namespace GL