X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fcolorcurve.cpp;h=40f61b813dd088171beeea361b92dc91dac11a6e;hp=6b456dfe31bbc55a21d0148459c43a5d800e8f42;hb=00cc52f21b5ae29fb1b25c162552c851a0559e66;hpb=f07dffb230b53efcf5e2706493b065f020077fdc diff --git a/source/colorcurve.cpp b/source/colorcurve.cpp index 6b456dfe..40f61b81 100644 --- a/source/colorcurve.cpp +++ b/source/colorcurve.cpp @@ -2,75 +2,52 @@ #include "color.h" #include "colorcurve.h" #include "mesh.h" +#include "renderer.h" #include "shader.h" #include "texture2d.h" using namespace std; -namespace { - -static const char fragment_src[] = - "uniform sampler2D texture;\n" - "uniform sampler1D curve;\n" - "uniform float peak;\n" - "uniform float brightness;\n" - "varying vec2 texcoord;\n" - "void main()\n" - "{\n" - " vec4 sample = texture2D(texture, texcoord);\n" - " float maxc = max(sample.r, max(sample.g, sample.b));\n" - " if(maxc>1.0-peak)\n" - " {\n" - " vec3 saturated = sample.rgb/maxc;\n" - " if(maxc>1.0+peak)\n" - " {\n" - " sample.rgb = mix(vec3(1.0), saturated, 1.0/pow(brightness, maxc-1.0-peak));\n" - " }\n" - " else\n" - " {\n" - " float x = (1.0+peak-maxc)/(2.0*peak);\n" - " sample.rgb = saturated.rgb*(1.0-peak+(1.0-x*x)*peak);\n" - " }\n" - " }\n" - " gl_FragColor = vec4(texture1D(curve, sample.r).r, texture1D(curve, sample.g).r, texture1D(curve, sample.b).r, sample.a);\n" - "}"; - -} - namespace Msp { namespace GL { ColorCurve::ColorCurve(): + shprog("colorcurve.glsl"), quad(get_fullscreen_quad()) { - shprog.attach_shader(get_fullscreen_vertex_shader()); - shprog.attach_shader_owned(new FragmentShader(fragment_src)); - shprog.link(); - - shdata.uniform("texture", 0); + shdata.uniform("source", 0); shdata.uniform("curve", 1); curve.storage(LUMINANCE, 256); curve.set_min_filter(LINEAR); curve.set_wrap(CLAMP_TO_EDGE); + texturing.attach(1, curve); - set_peak(0.2); - set_brightness(1.5); + set_exposure_adjust(0.0f); + set_brightness_response(0.4f); set_linear(); } -void ColorCurve::set_peak(float p) +void ColorCurve::set_exposure_adjust(float e) +{ + shdata.uniform("exposure", pow(2.0f, e)); +} + +void ColorCurve::set_brightness_response(float b) +{ + if(b<=0 || b>1) + throw invalid_argument("ColorCurve::set_brightness_response"); + float t = (b<1 ? pow(b, 1/(1-b)) : 0.0f); + shdata.uniform("brightness_response", b, t, pow(t, b)); +} + +void ColorCurve::set_peak(float) { - if(p<0 || p>1) - throw invalid_argument("ColorCurve::set_peak"); - shdata.uniform("peak", p); } void ColorCurve::set_brightness(float b) { - if(b<1) - throw invalid_argument("ColorCurve::set_brightness"); - shdata.uniform("brightness", b); + set_brightness_response(1/b); } void ColorCurve::set_gamma(float g) @@ -101,13 +78,55 @@ void ColorCurve::set_linear() curve.image(0, LUMINANCE, UNSIGNED_BYTE, curve_data); } -void ColorCurve::render(const Texture2D &color_buf, const Texture2D &) +void ColorCurve::render(Renderer &renderer, const Texture2D &color_buf, const Texture2D &) +{ + texturing.attach(0, color_buf); + + Renderer::Push push(renderer); + renderer.set_shader_program(&shprog, &shdata); + renderer.set_texturing(&texturing); + quad.draw(renderer); +} + + +ColorCurve::Template::Template(): + exposure_adjust(0.0f), + brightness_response(0.4f), + gamma(1.0f), + srgb(false) +{ } + +ColorCurve *ColorCurve::Template::create(unsigned, unsigned) const +{ + RefPtr colorcurve = new ColorCurve; + colorcurve->set_exposure_adjust(exposure_adjust); + colorcurve->set_brightness_response(brightness_response); + if(srgb) + colorcurve->set_srgb(); + else + colorcurve->set_gamma(gamma); + return colorcurve.release(); +} + + +ColorCurve::Template::Loader::Loader(Template &t): + DataFile::DerivedObjectLoader(t) +{ + add("brightness_response", &Template::brightness_response); + add("exposure_adjust", &Template::exposure_adjust); + add("gamma", &Loader::gamma); + add("srgb", &Loader::srgb); +} + +void ColorCurve::Template::Loader::gamma(float g) +{ + obj.gamma = g; + obj.srgb = false; +} + +void ColorCurve::Template::Loader::srgb() { - Bind _bind_shader(shprog); - shdata.apply(); - Bind _bind_tex(color_buf); - Bind _bind_curve(curve, 1); - quad.draw(); + obj.srgb = true; } } // namespace GL