From b618b34070d23b6da35c77f004678d8a9e55575b Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Wed, 3 Oct 2012 16:46:15 +0200 Subject: [PATCH] Make a new system for meta-effects, and convert the blur to use it. Hides the two-pass nature. --- blur_effect.cpp | 25 ++++++++++++++++++++++--- blur_effect.h | 24 +++++++++++++++++++++++- effect.h | 12 ++++++++---- effect_chain.cpp | 6 +++--- main.cpp | 9 ++------- 5 files changed, 58 insertions(+), 18 deletions(-) diff --git a/blur_effect.cpp b/blur_effect.cpp index fd81aa8..f2d5d03 100644 --- a/blur_effect.cpp +++ b/blur_effect.cpp @@ -10,8 +10,27 @@ // 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(std::vector *chain) { + hpass->add_self_to_effect_chain(chain); + vpass->add_self_to_effect_chain(chain); +} + +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,12 +38,12 @@ 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_uniforms(GLuint glsl_program_num, const std::string &prefix, unsigned *sampler_num) { Effect::set_uniforms(glsl_program_num, prefix, sampler_num); diff --git a/blur_effect.h b/blur_effect.h index 09c6f14..ee890c2 100644 --- a/blur_effect.h +++ b/blur_effect.h @@ -3,16 +3,38 @@ #include "effect.h" +class SingleBlurPassEffect; + class BlurEffect : public Effect { public: BlurEffect(); + + virtual std::string output_fragment_shader() { + assert(false); + } + virtual void set_uniforms(GLuint glsl_program_num, const std::string &prefix, unsigned *sampler_num) { + assert(false); + } + + virtual bool needs_many_samples() const { return true; } + virtual bool needs_mipmaps() const { return true; } + virtual void add_self_to_effect_chain(std::vector *chain); + virtual bool set_float(const std::string &key, float value); + +private: + SingleBlurPassEffect *hpass, *vpass; +}; + +class SingleBlurPassEffect : public Effect { +public: + SingleBlurPassEffect(); std::string output_fragment_shader(); virtual bool needs_many_samples() const { return true; } virtual bool needs_mipmaps() const { return true; } void set_uniforms(GLuint glsl_program_num, const std::string &prefix, unsigned *sampler_num); - + enum Direction { HORIZONTAL = 0, VERTICAL = 1 }; private: diff --git a/effect.h b/effect.h index b545f85..cd6f008 100644 --- a/effect.h +++ b/effect.h @@ -3,6 +3,7 @@ #include #include +#include #include @@ -36,6 +37,9 @@ public: virtual bool needs_srgb_primaries() const { return true; } virtual bool needs_many_samples() const { return false; } virtual bool needs_mipmaps() const { return false; } + virtual void add_self_to_effect_chain(std::vector *chain) { + chain->push_back(this); + } virtual std::string output_convenience_uniforms() const; virtual std::string output_fragment_shader() = 0; @@ -43,10 +47,10 @@ public: virtual void set_uniforms(GLuint glsl_program_num, const std::string& prefix, unsigned *sampler_num); // Neither of these take ownership. - bool set_int(const std::string&, int value); - bool set_float(const std::string &key, float value); - bool set_vec2(const std::string &key, const float *values); - bool set_vec3(const std::string &key, const float *values); + virtual bool set_int(const std::string&, int value); + virtual bool set_float(const std::string &key, float value); + virtual bool set_vec2(const std::string &key, const float *values); + virtual bool set_vec3(const std::string &key, const float *values); protected: // Neither of these take ownership. diff --git a/effect_chain.cpp b/effect_chain.cpp index 85c8be3..6f53008 100644 --- a/effect_chain.cpp +++ b/effect_chain.cpp @@ -64,7 +64,7 @@ void EffectChain::normalize_to_linear_gamma() } else { GammaExpansionEffect *gamma_conversion = new GammaExpansionEffect(); gamma_conversion->set_int("source_curve", current_gamma_curve); - effects.push_back(gamma_conversion); + gamma_conversion->add_self_to_effect_chain(&effects); } current_gamma_curve = GAMMA_LINEAR; } @@ -75,7 +75,7 @@ void EffectChain::normalize_to_srgb() 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); + colorspace_conversion->add_self_to_effect_chain(&effects); current_color_space = COLORSPACE_sRGB; } @@ -91,7 +91,7 @@ Effect *EffectChain::add_effect(EffectId effect_id) normalize_to_srgb(); } - effects.push_back(effect); + effect->add_self_to_effect_chain(&effects); return effect; } diff --git a/main.cpp b/main.cpp index 5e02d70..f00abaa 100644 --- a/main.cpp +++ b/main.cpp @@ -172,8 +172,7 @@ int main(int argc, char **argv) chain.add_input(inout_format); Effect *lift_gamma_gain_effect = chain.add_effect(EFFECT_LIFT_GAMMA_GAIN); Effect *saturation_effect = chain.add_effect(EFFECT_SATURATION); - Effect *hblur_effect = chain.add_effect(EFFECT_BLUR); - Effect *vblur_effect = chain.add_effect(EFFECT_BLUR); + Effect *blur_effect = chain.add_effect(EFFECT_BLUR); Effect *vignette_effect = chain.add_effect(EFFECT_VIGNETTE); //chain.add_effect(EFFECT_MIRROR); chain.add_output(inout_format); @@ -218,11 +217,7 @@ int main(int argc, char **argv) vignette_effect->set_float("inner_radius", inner_radius); //vignette_effect->set_vec2("center", (float[]){ 0.7f, 0.5f }); - hblur_effect->set_int("direction", 0); - hblur_effect->set_float("radius", blur_radius); - - vblur_effect->set_int("direction", 1); - vblur_effect->set_float("radius", blur_radius); + blur_effect->set_float("radius", blur_radius); chain.render_to_screen(src_img); -- 2.39.2