diff --git a/effects/effect.cpp b/effects/effect.cpp index 82c1f1c3b..a508c509f 100644 --- a/effects/effect.cpp +++ b/effects/effect.cpp @@ -27,12 +27,13 @@ #include "effects/video/cropeffect.h" #include "effects/video/flipeffect.h" #include "effects/video/boxblureffect.h" +#include "effects/video/waveeffect.h" +#include "effects/video/temperatureeffect.h" #include "effects/audio/paneffect.h" #include "effects/audio/volumeeffect.h" #include "effects/audio/audionoiseeffect.h" #include "effects/audio/toneeffect.h" -#include "effects/video/waveeffect.h" #include #include @@ -59,6 +60,7 @@ void init_effects() { video_effect_names[VIDEO_FLIP_EFFECT] = "Flip"; video_effect_names[VIDEO_BOXBLUR_EFFECT] = "Box Blur"; video_effect_names[VIDEO_WAVE_EFFECT] = "Wave"; + video_effect_names[VIDEO_TEMPERATURE_EFFECT] = "Temperature"; audio_effect_names[AUDIO_VOLUME_EFFECT] = "Volume"; audio_effect_names[AUDIO_PAN_EFFECT] = "Pan"; @@ -80,6 +82,7 @@ Effect* create_effect(int effect_id, Clip* c) { case VIDEO_FLIP_EFFECT: return new FlipEffect(c); case VIDEO_BOXBLUR_EFFECT: return new BoxBlurEffect(c); case VIDEO_WAVE_EFFECT: return new WaveEffect(c); + case VIDEO_TEMPERATURE_EFFECT: return new TemperatureEffect(c); } } else { switch (effect_id) { diff --git a/effects/effect.h b/effects/effect.h index 08b955b33..950d3ad52 100644 --- a/effects/effect.h +++ b/effects/effect.h @@ -34,6 +34,7 @@ enum VideoEffects { VIDEO_FLIP_EFFECT, VIDEO_BOXBLUR_EFFECT, VIDEO_WAVE_EFFECT, + VIDEO_TEMPERATURE_EFFECT, VIDEO_EFFECT_COUNT }; diff --git a/effects/video/glsl/shaders.qrc b/effects/video/glsl/shaders.qrc index d165c0095..b9512b59c 100644 --- a/effects/video/glsl/shaders.qrc +++ b/effects/video/glsl/shaders.qrc @@ -7,5 +7,6 @@ solideffect.frag boxblureffect.frag waveeffect.frag + temperatureeffect.frag diff --git a/effects/video/glsl/temperatureeffect.frag b/effects/video/glsl/temperatureeffect.frag new file mode 100644 index 000000000..56098c587 --- /dev/null +++ b/effects/video/glsl/temperatureeffect.frag @@ -0,0 +1,36 @@ +#version 110 + +// adapted from Tanner Helland's temperature algorithm +// (http://www.tannerhelland.com/4435/convert-temperature-rgb-algorithm-code/) + +uniform float temperature; + +uniform mediump float amount_val; +uniform sampler2D myTexture; +varying vec2 vTexCoord; + +void main(void) { + vec4 textureColor = texture2D(myTexture, vTexCoord); + + // red value + float red = (temperature <= 66.0) ? 1.0 : min(1.0, max(0.0, (329.698727446 * (pow(temperature - 60.0, -0.1332047592)))/255.0)); + + // green value + float green = min(1.0, max(0.0, ((temperature <= 66.0) ? (99.4708025861 * log(temperature) - 161.1195681661) : 288.1221695283 * (pow(temperature - 60.0, -0.0755148492)))/255.0)); + + // blue value + float blue = (temperature >= 66.0) ? 1.0 : min(1.0, max(0.0, (138.5177312231 * log(temperature - 10.0) - 305.0447927307)/255.0)); + + gl_FragColor = vec4( + textureColor.r*red, + textureColor.g*green, + textureColor.b*blue, + textureColor.a + ); + /*gl_FragColor = vec4( + red, + green, + blue, + 1.0 + );*/ +} \ No newline at end of file diff --git a/effects/video/glsl/waveeffect.frag b/effects/video/glsl/waveeffect.frag index be97675e9..c64f60d60 100644 --- a/effects/video/glsl/waveeffect.frag +++ b/effects/video/glsl/waveeffect.frag @@ -10,7 +10,7 @@ uniform sampler2D myTexture; varying vec2 vTexCoord; void main(void) { - float offset = sin((vTexCoord.x+evolution)*frequency)*intensity; + float offset = sin((vTexCoord.x-evolution)*frequency)*intensity; float y = vTexCoord.y-offset; if (y < 0.0 || y > 1.0) { diff --git a/effects/video/inverteffect.cpp b/effects/video/inverteffect.cpp index 73947accb..4d8d38889 100644 --- a/effects/video/inverteffect.cpp +++ b/effects/video/inverteffect.cpp @@ -4,10 +4,6 @@ #include #include -#include -#include -#include -#include InvertEffect::InvertEffect(Clip* c) : Effect(c, EFFECT_TYPE_VIDEO, VIDEO_INVERT_EFFECT) { enable_shader = true; diff --git a/effects/video/temperatureeffect.cpp b/effects/video/temperatureeffect.cpp new file mode 100644 index 000000000..c158a6983 --- /dev/null +++ b/effects/video/temperatureeffect.cpp @@ -0,0 +1,19 @@ +#include "temperatureeffect.h" + +TemperatureEffect::TemperatureEffect(Clip* c) : Effect(c, EFFECT_TYPE_VIDEO, VIDEO_TEMPERATURE_EFFECT) { + enable_shader = true; + + temp_val = add_row("Temperature:")->add_field(EFFECT_FIELD_DOUBLE); + temp_val->set_double_minimum_value(2000); + temp_val->set_double_default_value(5200); + temp_val->set_double_maximum_value(40000); + + connect(temp_val, SIGNAL(changed()), this, SLOT(field_changed())); + + vertPath = ":/shaders/common.vert"; + fragPath = ":/shaders/temperatureeffect.frag"; +} + +void TemperatureEffect::process_shader(double timecode) { + glslProgram->setUniformValue("temperature", (GLfloat) (temp_val->get_double_value(timecode)*0.01)); +} diff --git a/effects/video/temperatureeffect.h b/effects/video/temperatureeffect.h new file mode 100644 index 000000000..b367d4258 --- /dev/null +++ b/effects/video/temperatureeffect.h @@ -0,0 +1,15 @@ +#ifndef TEMPERATUREEFFECT_H +#define TEMPERATUREEFFECT_H + +#include "../effect.h" + +class TemperatureEffect : public Effect { + Q_OBJECT +public: + TemperatureEffect(Clip* c); + void process_shader(double timecode); +private: + EffectField* temp_val; +}; + +#endif // TEMPERATUREEFFECT_H diff --git a/olive.pro b/olive.pro index e41ec2117..ae60fa782 100644 --- a/olive.pro +++ b/olive.pro @@ -83,7 +83,8 @@ SOURCES += \ project/marker.cpp \ dialogs/speeddialog.cpp \ dialogs/mediapropertiesdialog.cpp \ - effects/video/waveeffect.cpp + effects/video/waveeffect.cpp \ + effects/video/temperatureeffect.cpp HEADERS += \ mainwindow.h \ @@ -145,7 +146,8 @@ HEADERS += \ dialogs/speeddialog.h \ dialogs/speeddialog.h \ dialogs/mediapropertiesdialog.h \ - effects/video/waveeffect.h + effects/video/waveeffect.h \ + effects/video/temperatureeffect.h FORMS += \ mainwindow.ui \