GlowEffect::GlowEffect()
: blur(new BlurEffect),
+ cutoff(new HighlightCutoffEffect),
mix(new MixEffect)
{
+ blur->set_float("radius", 20.0f);
mix->set_float("strength_first", 1.0f);
- mix->set_float("strength_second", 0.3f);
+ mix->set_float("strength_second", 1.0f);
+ cutoff->set_float("cutoff", 0.2f);
}
void GlowEffect::rewrite_graph(EffectChain *graph, Node *self)
Node *blur_node = graph->add_node(blur);
Node *mix_node = graph->add_node(mix);
+ Node *cutoff_node = graph->add_node(cutoff);
graph->replace_receiver(self, mix_node);
- graph->connect_nodes(input, blur_node);
+ graph->connect_nodes(input, cutoff_node);
+ graph->connect_nodes(cutoff_node, blur_node);
graph->connect_nodes(blur_node, mix_node);
graph->replace_sender(self, mix_node);
if (key == "blurred_mix_amount") {
return mix->set_float("strength_second", value);
}
+ if (key == "highlight_cutoff") {
+ return cutoff->set_float("cutoff", value);
+ }
return blur->set_float(key, value);
}
+
+HighlightCutoffEffect::HighlightCutoffEffect()
+ : cutoff(0.0f)
+{
+ register_float("cutoff", &cutoff);
+}
+
+std::string HighlightCutoffEffect::output_fragment_shader()
+{
+ return read_file("highlight_cutoff_effect.frag");
+}
#ifndef _GLOW_EFFECT_H
#define _GLOW_EFFECT_H 1
-// Glow: Simply add a blurred version of the image to itself.
+// Glow: Cut out the highlights of the image (everything above a certain threshold),
+// blur them, and overlay them onto the original image.
#include "effect.h"
class BlurEffect;
class MixEffect;
+class HighlightCutoffEffect;
class GlowEffect : public Effect {
public:
private:
BlurEffect *blur;
+ HighlightCutoffEffect *cutoff;
MixEffect *mix;
};
+// An effect that cuts out only the highlights of an image;
+// anything at the cutoff or below is set to 0.0, and then all other pixels
+// get the cutoff subtracted. Used only as part of GlowEffect.
+
+class HighlightCutoffEffect : public Effect {
+public:
+ HighlightCutoffEffect();
+ virtual std::string effect_type_id() const { return "HighlightCutoffEffect"; }
+ std::string output_fragment_shader();
+
+private:
+ float cutoff;
+};
+
#endif // !defined(_GLOW_EFFECT_H)