X-Git-Url: https://git.sesse.net/?p=movit;a=blobdiff_plain;f=blur_effect.cpp;h=e6a9a313ec8fd82918d7719570d96a194814beb9;hp=fd81aa86cdbc342cbdf3e231e6f89acbae9fa80d;hb=c3718fbd4be80a2825e7fdc66eb54a516e4c4df1;hpb=0a3c9320e21fc211f0c61a4bda1c6932920c6883 diff --git a/blur_effect.cpp b/blur_effect.cpp index fd81aa8..e6a9a31 100644 --- a/blur_effect.cpp +++ b/blur_effect.cpp @@ -10,8 +10,31 @@ // Must match blur_effect.frag. #define NUM_TAPS 16 + +BlurEffect::BlurEffect() { + hpass = new SingleBlurPassEffect(); + hpass->set_int("direction", SingleBlurPassEffect::HORIZONTAL); + vpass = new SingleBlurPassEffect(); + vpass->set_int("direction", SingleBlurPassEffect::VERTICAL); +} + +void BlurEffect::add_self_to_effect_chain(EffectChain *chain, const std::vector &inputs) { + assert(inputs.size() == 1); + hpass->add_self_to_effect_chain(chain, inputs); + + std::vector vpass_inputs; + vpass_inputs.push_back(hpass); + vpass->add_self_to_effect_chain(chain, vpass_inputs); +} + +bool BlurEffect::set_float(const std::string &key, float value) { + if (!hpass->set_float(key, value)) { + return false; + } + return vpass->set_float(key, value); +} -BlurEffect::BlurEffect() +SingleBlurPassEffect::SingleBlurPassEffect() : radius(3.0f), direction(HORIZONTAL) { @@ -19,14 +42,14 @@ BlurEffect::BlurEffect() register_int("direction", (int *)&direction); } -std::string BlurEffect::output_fragment_shader() +std::string SingleBlurPassEffect::output_fragment_shader() { return read_file("blur_effect.frag"); } -void BlurEffect::set_uniforms(GLuint glsl_program_num, const std::string &prefix, unsigned *sampler_num) +void SingleBlurPassEffect::set_gl_state(GLuint glsl_program_num, const std::string &prefix, unsigned *sampler_num) { - Effect::set_uniforms(glsl_program_num, prefix, sampler_num); + Effect::set_gl_state(glsl_program_num, prefix, sampler_num); int base_texture_size, texture_size; if (direction == HORIZONTAL) { @@ -179,3 +202,13 @@ void BlurEffect::set_uniforms(GLuint glsl_program_num, const std::string &prefix set_uniform_vec4_array(glsl_program_num, prefix, "samples", samples, NUM_TAPS + 1); #endif } + +void SingleBlurPassEffect::clear_gl_state() +{ + glActiveTexture(GL_TEXTURE0); + check_error(); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0); + check_error(); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1000); + check_error(); +}