diff --git a/effects/effect.cpp b/effects/effect.cpp index 39c8fe45f..2ed853a23 100644 --- a/effects/effect.cpp +++ b/effects/effect.cpp @@ -28,6 +28,7 @@ #include "effects/internal/toneeffect.h" #include "effects/internal/volumeeffect.h" #include "effects/internal/paneffect.h" +#include "effects/internal/shakeeffect.h" #include #include @@ -58,6 +59,7 @@ Effect* create_effect(Clip* c, const EffectMeta* em) { case EFFECT_INTERNAL_VOLUME: return new VolumeEffect(c, em); break; case EFFECT_INTERNAL_PAN: return new PanEffect(c, em); break; case EFFECT_INTERNAL_TONE: return new ToneEffect(c, em); break; + case EFFECT_INTERNAL_SHAKE: return new ShakeEffect(c, em); break; } } else { dout << "[ERROR] Invalid effect data"; @@ -112,6 +114,11 @@ void load_internal_effects() { em.category = "Render"; em.internal = EFFECT_INTERNAL_SOLID; video_effects.append(em); + + em.name = "Shake"; + em.category = "Distort"; + em.internal = EFFECT_INTERNAL_SHAKE; + video_effects.append(em); } void load_shader_effects() { diff --git a/effects/effect.h b/effects/effect.h index d719b1463..22d4ff423 100644 --- a/effects/effect.h +++ b/effects/effect.h @@ -64,7 +64,8 @@ extern QMutex effects_loaded; #define EFFECT_INTERNAL_VOLUME 4 #define EFFECT_INTERNAL_PAN 5 #define EFFECT_INTERNAL_TONE 6 -#define EFFECT_INTERNAL_COUNT 7 +#define EFFECT_INTERNAL_SHAKE 7 +#define EFFECT_INTERNAL_COUNT 8 struct GLTextureCoords { int vertexTopLeftX; diff --git a/effects/internal/shakeeffect.cpp b/effects/internal/shakeeffect.cpp new file mode 100644 index 000000000..29615662d --- /dev/null +++ b/effects/internal/shakeeffect.cpp @@ -0,0 +1,85 @@ +#include "shakeeffect.h" + +#include +#include +#include +#include + +#include "ui/labelslider.h" +#include "ui/collapsiblewidget.h" +#include "project/clip.h" +#include "project/sequence.h" +#include "panels/timeline.h" + +#include "debug.h" + +ShakeEffect::ShakeEffect(Clip *c, const EffectMeta *em) : Effect(c, em), evolution(INT_MIN) { + enable_coords = true; + + EffectRow* intensity_row = add_row("Intensity:"); + intensity_val = intensity_row->add_field(EFFECT_FIELD_DOUBLE); + intensity_val->id = "intensity"; + intensity_val->set_double_minimum_value(0); + + EffectRow* rotation_row = add_row("Rotation:"); + rotation_val = rotation_row->add_field(EFFECT_FIELD_DOUBLE); + rotation_val->id = "rotation"; + rotation_val->set_double_minimum_value(0); + + EffectRow* frequency_row = add_row("Frequency:"); + frequency_val = frequency_row->add_field(EFFECT_FIELD_DOUBLE); + frequency_val->id = "frequency"; + frequency_val->set_double_minimum_value(0); + + // set defaults + intensity_val->set_double_default_value(25); + rotation_val->set_double_default_value(10); + frequency_val->set_double_default_value(5); + + srand(QDateTime::currentMSecsSinceEpoch()); + + for (int i=0;iget_double_value(timecode)/lim; + double rotmult = rotation_val->get_double_value(timecode)/lim/10; + double x = timecode * frequency_val->get_double_value(timecode); + + double xoff = 0; + double yoff = 0; + double rotoff = 0; + + for (int i=0;i