diff --git a/effects/effect.cpp b/effects/effect.cpp index 21a27df41..82c1f1c3b 100644 --- a/effects/effect.cpp +++ b/effects/effect.cpp @@ -32,6 +32,7 @@ #include "effects/audio/volumeeffect.h" #include "effects/audio/audionoiseeffect.h" #include "effects/audio/toneeffect.h" +#include "effects/video/waveeffect.h" #include #include @@ -57,6 +58,7 @@ void init_effects() { video_effect_names[VIDEO_CROP_EFFECT] = "Crop"; video_effect_names[VIDEO_FLIP_EFFECT] = "Flip"; video_effect_names[VIDEO_BOXBLUR_EFFECT] = "Box Blur"; + video_effect_names[VIDEO_WAVE_EFFECT] = "Wave"; audio_effect_names[AUDIO_VOLUME_EFFECT] = "Volume"; audio_effect_names[AUDIO_PAN_EFFECT] = "Pan"; @@ -77,6 +79,7 @@ Effect* create_effect(int effect_id, Clip* c) { case VIDEO_CROP_EFFECT: return new CropEffect(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); } } else { switch (effect_id) { diff --git a/effects/effect.h b/effects/effect.h index 6cc0172f5..08b955b33 100644 --- a/effects/effect.h +++ b/effects/effect.h @@ -33,6 +33,7 @@ enum VideoEffects { VIDEO_CROP_EFFECT, VIDEO_FLIP_EFFECT, VIDEO_BOXBLUR_EFFECT, + VIDEO_WAVE_EFFECT, VIDEO_EFFECT_COUNT }; diff --git a/effects/video/glsl/shaders.qrc b/effects/video/glsl/shaders.qrc index 832469688..d165c0095 100644 --- a/effects/video/glsl/shaders.qrc +++ b/effects/video/glsl/shaders.qrc @@ -6,5 +6,6 @@ chromakeyeffect.frag solideffect.frag boxblureffect.frag + waveeffect.frag diff --git a/effects/video/glsl/waveeffect.frag b/effects/video/glsl/waveeffect.frag new file mode 100644 index 000000000..be97675e9 --- /dev/null +++ b/effects/video/glsl/waveeffect.frag @@ -0,0 +1,27 @@ +#version 110 + +// uniform float evolution; +uniform float frequency; +uniform float intensity; +uniform float evolution; + +uniform mediump float amount_val; +uniform sampler2D myTexture; +varying vec2 vTexCoord; + +void main(void) { + float offset = sin((vTexCoord.x+evolution)*frequency)*intensity; + + float y = vTexCoord.y-offset; + if (y < 0.0 || y > 1.0) { + gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0); + } else { + vec4 textureColor = texture2D(myTexture, vec2(vTexCoord.x, y)); + gl_FragColor = vec4( + textureColor.r, + textureColor.g, + textureColor.b, + textureColor.a + ); + } +} \ No newline at end of file diff --git a/effects/video/waveeffect.cpp b/effects/video/waveeffect.cpp new file mode 100644 index 000000000..8c97147c3 --- /dev/null +++ b/effects/video/waveeffect.cpp @@ -0,0 +1,28 @@ +#include "waveeffect.h" + +WaveEffect::WaveEffect(Clip* c) : Effect(c, EFFECT_TYPE_VIDEO, VIDEO_WAVE_EFFECT) { + enable_shader = true; + + frequency_val = add_row("Frequency:")->add_field(EFFECT_FIELD_DOUBLE); + frequency_val->set_double_minimum_value(0); + frequency_val->set_double_default_value(10); + + intensity_val = add_row("Intensity:")->add_field(EFFECT_FIELD_DOUBLE); + intensity_val->set_double_default_value(10); + + evolution_val = add_row("Evolution:")->add_field(EFFECT_FIELD_DOUBLE); + evolution_val->set_double_default_value(0); + + connect(frequency_val, SIGNAL(changed()), this, SLOT(field_changed())); + connect(intensity_val, SIGNAL(changed()), this, SLOT(field_changed())); + connect(evolution_val, SIGNAL(changed()), this, SLOT(field_changed())); + + vertPath = ":/shaders/common.vert"; + fragPath = ":/shaders/waveeffect.frag"; +} + +void WaveEffect::process_shader(double timecode) { + glslProgram->setUniformValue("frequency", (GLfloat) (frequency_val->get_double_value(timecode))); + glslProgram->setUniformValue("intensity", (GLfloat) (intensity_val->get_double_value(timecode)*0.01)); + glslProgram->setUniformValue("evolution", (GLfloat) (evolution_val->get_double_value(timecode)*0.01)); +} diff --git a/effects/video/waveeffect.h b/effects/video/waveeffect.h new file mode 100644 index 000000000..78e973585 --- /dev/null +++ b/effects/video/waveeffect.h @@ -0,0 +1,17 @@ +#ifndef WAVEEFFECT_H +#define WAVEEFFECT_H + +#include "../effect.h" + +class WaveEffect : public Effect { + Q_OBJECT +public: + WaveEffect(Clip* c); + void process_shader(double timecode); +private: + EffectField* frequency_val; + EffectField* intensity_val; + EffectField* evolution_val; +}; + +#endif // WAVEEFFECT_H diff --git a/olive.pro b/olive.pro index 2cfa28b54..e41ec2117 100644 --- a/olive.pro +++ b/olive.pro @@ -82,7 +82,8 @@ SOURCES += \ effects/audio/toneeffect.cpp \ project/marker.cpp \ dialogs/speeddialog.cpp \ - dialogs/mediapropertiesdialog.cpp + dialogs/mediapropertiesdialog.cpp \ + effects/video/waveeffect.cpp HEADERS += \ mainwindow.h \ @@ -143,7 +144,8 @@ HEADERS += \ project/selection.h \ dialogs/speeddialog.h \ dialogs/speeddialog.h \ - dialogs/mediapropertiesdialog.h + dialogs/mediapropertiesdialog.h \ + effects/video/waveeffect.h FORMS += \ mainwindow.ui \