X-Git-Url: https://git.sesse.net/?p=movit;a=blobdiff_plain;f=effect_chain.cpp;h=2bae9ed4e6f96b91567ecf6ac1c9d40497b75273;hp=a8381505109affe8ade2becd09009c58b15b1233;hb=f428e5f85aeda850d43c4b134fbb286b574c63fb;hpb=f250ae0ffd74c401511e9db448b86c19f7720f02 diff --git a/effect_chain.cpp b/effect_chain.cpp index a838150..2bae9ed 100644 --- a/effect_chain.cpp +++ b/effect_chain.cpp @@ -10,8 +10,10 @@ #include "util.h" #include "effect_chain.h" #include "gamma_expansion_effect.h" +#include "gamma_compression_effect.h" #include "lift_gamma_gain_effect.h" #include "colorspace_conversion_effect.h" +#include "saturation_effect.h" #include "texture_enum.h" EffectChain::EffectChain(unsigned width, unsigned height) @@ -38,28 +40,40 @@ Effect *instantiate_effect(EffectId effect) return new GammaExpansionEffect(); case LIFT_GAMMA_GAIN: return new LiftGammaGainEffect(); + case SATURATION: + return new SaturationEffect(); } assert(false); } +void EffectChain::normalize_to_linear_gamma() +{ + GammaExpansionEffect *gamma_conversion = new GammaExpansionEffect(); + gamma_conversion->set_int("source_curve", current_gamma_curve); + effects.push_back(gamma_conversion); + current_gamma_curve = GAMMA_LINEAR; +} + +void EffectChain::normalize_to_srgb() +{ + assert(current_gamma_curve == GAMMA_LINEAR); + ColorSpaceConversionEffect *colorspace_conversion = new ColorSpaceConversionEffect(); + colorspace_conversion->set_int("source_space", current_color_space); + colorspace_conversion->set_int("destination_space", COLORSPACE_sRGB); + effects.push_back(colorspace_conversion); + current_color_space = COLORSPACE_sRGB; +} + Effect *EffectChain::add_effect(EffectId effect_id) { Effect *effect = instantiate_effect(effect_id); if (effect->needs_linear_light() && current_gamma_curve != GAMMA_LINEAR) { - GammaExpansionEffect *gamma_conversion = new GammaExpansionEffect(); - gamma_conversion->set_int("source_curve", current_gamma_curve); - effects.push_back(gamma_conversion); - current_gamma_curve = GAMMA_LINEAR; + normalize_to_linear_gamma(); } if (effect->needs_srgb_primaries() && current_color_space != COLORSPACE_sRGB) { - assert(current_gamma_curve == GAMMA_LINEAR); - ColorSpaceConversionEffect *colorspace_conversion = new ColorSpaceConversionEffect(); - colorspace_conversion->set_int("source_space", current_color_space); - colorspace_conversion->set_int("destination_space", COLORSPACE_sRGB); - effects.push_back(colorspace_conversion); - current_color_space = COLORSPACE_sRGB; + normalize_to_srgb(); } // not handled yet @@ -113,6 +127,19 @@ std::string replace_prefix(const std::string &text, const std::string &prefix) void EffectChain::finalize() { + // TODO: If we want a non-sRGB output color space, convert. + + if (current_gamma_curve != output_format.gamma_curve) { + if (current_gamma_curve != GAMMA_LINEAR) { + normalize_to_linear_gamma(); + } + assert(current_gamma_curve == GAMMA_LINEAR); + GammaCompressionEffect *gamma_conversion = new GammaCompressionEffect(); + gamma_conversion->set_int("destination_curve", output_format.gamma_curve); + effects.push_back(gamma_conversion); + current_gamma_curve = output_format.gamma_curve; + } + std::string frag_shader = read_file("header.glsl"); for (unsigned i = 0; i < effects.size(); ++i) { @@ -167,9 +194,11 @@ void EffectChain::render_to_screen(unsigned char *src) check_error(); glUniform1i(glGetUniformLocation(glsl_program_num, "input_tex"), 0); - //for (unsigned i = 0; i < effects.size(); ++i) { - // effects[i]->set_uniforms(); - //} + for (unsigned i = 0; i < effects.size(); ++i) { + char effect_id[256]; + sprintf(effect_id, "eff%d", i); + effects[i]->set_uniforms(glsl_program_num, effect_id); + } glDisable(GL_BLEND); check_error();