]> 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 b9e626989e1e585def0f45395cf6e5ff7ac1f016..0ff0c5da34210c2b155150934603dc0fbec2ef5c 100644 (file)
@@ -1,14 +1,10 @@
-/* $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"
 #include "bloom.h"
 #include "meshbuilder.h"
+#include "misc.h"
+#include "tests.h"
 #include "texunit.h"
 
 using namespace std;
@@ -19,8 +15,8 @@ static const char blur_vs[]=
        "varying vec2 texcoord;\n"
        "void main()\n"
        "{\n"
-       "       gl_Position=vec4(gl_Vertex.xy*2.0-1.0, 0.0, 1.0);\n"
-       "       texcoord=gl_Vertex.xy;\n"
+       "       gl_Position = vec4(gl_Vertex.xy*2.0-1.0, 0.0, 1.0);\n"
+       "       texcoord = gl_Vertex.xy;\n"
        "}";
 
 static const char blur_fs[]=
@@ -31,17 +27,17 @@ static const char blur_fs[]=
        "varying vec2 texcoord;\n"
        "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"
+       "       gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);\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[]=
        "varying vec2 texcoord;\n"
        "void main()\n"
        "{\n"
-       "       gl_Position=vec4(gl_Vertex.xy*2.0-1.0, 0.0, 1.0);\n"
-       "       texcoord=gl_Vertex.xy;\n"
+       "       gl_Position = vec4(gl_Vertex.xy*2.0-1.0, 0.0, 1.0);\n"
+       "       texcoord = gl_Vertex.xy;\n"
        "}";
 
 static const char combine_fs[]=
@@ -51,7 +47,7 @@ static const char combine_fs[]=
        "varying vec2 texcoord;\n"
        "void main()\n"
        "{\n"
-       "       gl_FragColor=mix(texture2D(source, texcoord), texture2D(blurred, texcoord), strength);\n"
+       "       gl_FragColor = mix(texture2D(source, texcoord), texture2D(blurred, texcoord), strength);\n"
        "}";
 
 }
@@ -61,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);
+       int loc = blur_shader.get_uniform_location("delta");
+       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].storage(RGB16F, w, h, 0);
-               tex[i].image(0, RGB, UNSIGNED_BYTE, 0);
                tex[i].set_min_filter(NEAREST);
+               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();
 }
 
@@ -97,60 +97,49 @@ void Bloom::set_radius(float r)
        if(r<=0.0f)
                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);
+       int size = min(static_cast<int>(r*3.0f), 9);
+       blur_shdata_common.uniform("size", size);
 
        vector<float> factors(size*2+1);
-       float sum=0.0f;
-       r=2*r*r;
+       float sum = 0.0f;
+       r = 2*r*r;
        for(int i=-size; i<=size; ++i)
-               sum+=(factors[size+i]=exp(-i*i/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);
-       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();
-       TexUnit::activate(0);
-       Texture::unbind();
 }
 
 } // namespace GL