34
34
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
37
#include "animation-internal.h"
39
const float WaveAnim::kMinDuration = 400;
39
41
// ===================== Effect: Wave =========================
42
fxWaveModelStepObject(CompWindow * w,
45
float forwardProgress,
50
float origx = w->attrib.x + (WIN_W(w) * object->gridPosition.x -
51
w->output.left) * model->scale.x;
52
float origy = w->attrib.y + (WIN_H(w) * object->gridPosition.y -
53
w->output.top) * model->scale.y;
55
object->position.x = origx;
56
object->position.y = origy;
57
object->position.z = 0;
59
if (fabs(object->position.y - wavePosition) < waveHalfWidth)
43
WaveAnim::WaveAnim (CompWindow *w,
44
WindowEvent curWindowEvent,
46
const AnimEffect info,
47
const CompRect &icon) :
48
Animation::Animation (w, curWindowEvent, duration, info, icon),
49
TransformAnim::TransformAnim (w, curWindowEvent, duration, info, icon),
50
GridTransformAnim::GridTransformAnim (w, curWindowEvent, duration, info,
56
WaveAnim::adjustDuration ()
58
if (mTotalTime < kMinDuration)
61
object->position.z += waveAmp *
62
(cos ((object->position.y - wavePosition) *
63
M_PI / waveHalfWidth) + 1) / 2;
60
mTotalTime = kMinDuration;
61
mRemainingTime = mTotalTime;
68
fxWaveModelStep (CompWindow *w, float time)
70
defaultAnimStep (w, time);
74
Model *model = aw->com.model;
76
float forwardProgress = 1 - defaultAnimProgress (w);
78
float waveHalfWidth = (WIN_H(w) * model->scale.y *
79
animGetF (w, ANIM_SCREEN_OPTION_WAVE_WIDTH) / 2);
81
float waveAmp = (0.02 * pow ((float)WIN_H (w) / w->screen->height, 0.4) *
82
animGetF (w, ANIM_SCREEN_OPTION_WAVE_AMP_MULT));
69
mGridHeight = optValI (AnimationOptions::MagicLampWavyGridRes); // TODO new option
75
float forwardProgress = 1 - progressLinear ();
76
if (mCurWindowEvent == WindowEventClose)
77
forwardProgress = 1 - forwardProgress;
79
CompRect winRect (mAWindow->savedRectsValid () ?
80
mAWindow->saveWinRect () :
81
mWindow->geometry ());
82
CompRect outRect (mAWindow->savedRectsValid () ?
83
mAWindow->savedOutRect () :
84
mWindow->outputRect ());
85
CompWindowExtents outExtents (mAWindow->savedRectsValid () ?
86
mAWindow->savedOutExtents () :
89
float waveHalfWidth = (outRect.height () * mModel->scale ().y () *
90
optValF (AnimationOptions::WaveWidth) / 2);
92
float waveAmp = (pow ((float)outRect.height () / ::screen->height (), 0.4) *
93
0.04 * optValF (AnimationOptions::WaveAmpMult));
84
95
float wavePosition =
85
WIN_Y(w) - waveHalfWidth +
86
forwardProgress * (WIN_H(w) * model->scale.y + 2 * waveHalfWidth);
88
Object *object = model->objects;
90
for (i = 0; i < model->numObjects; i++, object++)
91
fxWaveModelStepObject(w,
96
outRect.y () - waveHalfWidth +
97
forwardProgress * (outRect.height () * mModel->scale ().y () +
100
GridModel::GridObject *object = mModel->objects ();
101
for (int i = 0; i < mModel->numObjects (); i++, object++)
103
float origx = winRect.x () + mModel->scale ().x () *
104
(outRect.width () * object->gridPosition ().x () -
106
float origy = winRect.y () + mModel->scale ().y () *
107
(outRect.height () * object->gridPosition ().y () -
110
object->position ().setX (origx);
111
object->position ().setY (origy);
112
float distFromWaveCenter =
113
fabs (object->position ().y () - wavePosition);
115
if (distFromWaveCenter < waveHalfWidth)
117
setZ (waveAmp * (cos (distFromWaveCenter *
118
M_PI / waveHalfWidth) + 1) / 2);
120
object->position ().setZ (0);