~lbrulet-8/compiz-plugins-main/fix-876591

« back to all changes in this revision

Viewing changes to animation/src/curvedfold.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Didier Roche
  • Date: 2011-02-24 17:34:18 UTC
  • Revision ID: james.westby@ubuntu.com-20110224173418-b81hfllshqpciq6n
Tags: upstream-0.9.4
ImportĀ upstreamĀ versionĀ 0.9.4

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Animation plugin for compiz/beryl
 
3
 *
 
4
 * animation.c
 
5
 *
 
6
 * Copyright : (C) 2006 Erkin Bahceci
 
7
 * E-mail    : erkinbah@gmail.com
 
8
 *
 
9
 * Based on Wobbly and Minimize plugins by
 
10
 *           : David Reveman
 
11
 * E-mail    : davidr@novell.com>
 
12
 *
 
13
 * Particle system added by : (C) 2006 Dennis Kasprzyk
 
14
 * E-mail                   : onestone@beryl-project.org
 
15
 *
 
16
 * Beam-Up added by : Florencio Guimaraes
 
17
 * E-mail           : florencio@nexcorp.com.br
 
18
 *
 
19
 * Hexagon tessellator added by : Mike Slegeir
 
20
 * E-mail                       : mikeslegeir@mail.utexas.edu>
 
21
 *
 
22
 * This program is free software; you can redistribute it and/or
 
23
 * modify it under the terms of the GNU General Public License
 
24
 * as published by the Free Software Foundation; either version 2
 
25
 * of the License, or (at your option) any later version.
 
26
 *
 
27
 * This program is distributed in the hope that it will be useful,
 
28
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
29
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
30
 * GNU General Public License for more details.
 
31
 *
 
32
 * You should have received a copy of the GNU General Public License
 
33
 * along with this program; if not, write to the Free Software
 
34
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
35
 */
 
36
 
 
37
#include "private.h"
 
38
 
 
39
// =====================  Effect: Curved Fold  =========================
 
40
 
 
41
FoldAnim::FoldAnim (CompWindow *w,
 
42
                    WindowEvent curWindowEvent,
 
43
                    float duration,
 
44
                    const AnimEffect info,
 
45
                    const CompRect &icon) :
 
46
    Animation::Animation (w, curWindowEvent, duration, info, icon),
 
47
    TransformAnim::TransformAnim (w, curWindowEvent, duration, info, icon),
 
48
    GridZoomAnim::GridZoomAnim (w, curWindowEvent, duration, info, icon)
 
49
{
 
50
}
 
51
 
 
52
float
 
53
FoldAnim::getFadeProgress ()
 
54
{
 
55
    // if shade/unshade, don't do anything
 
56
    if (mCurWindowEvent == WindowEventShade ||
 
57
        mCurWindowEvent == WindowEventUnshade)
 
58
        return 0;
 
59
 
 
60
    if (zoomToIcon ())
 
61
        return ZoomAnim::getFadeProgress ();
 
62
 
 
63
    return progressLinear ();
 
64
}
 
65
 
 
66
CurvedFoldAnim::CurvedFoldAnim (CompWindow *w,
 
67
                                WindowEvent curWindowEvent,
 
68
                                float duration,
 
69
                                const AnimEffect info,
 
70
                                const CompRect &icon) :
 
71
    Animation::Animation (w, curWindowEvent, duration, info, icon),
 
72
    TransformAnim::TransformAnim (w, curWindowEvent, duration, info, icon),
 
73
    FoldAnim::FoldAnim (w, curWindowEvent, duration, info, icon)
 
74
{
 
75
}
 
76
 
 
77
void
 
78
CurvedFoldAnim::initGrid ()
 
79
{
 
80
    mGridWidth = 2;
 
81
    mGridHeight = optValI (AnimationOptions::MagicLampWavyGridRes); // TODO new option
 
82
}
 
83
 
 
84
float
 
85
CurvedFoldAnim::getObjectZ (GridAnim::GridModel *mModel,
 
86
                            float forwardProgress,
 
87
                            float sinForProg,
 
88
                            float relDistToCenter,
 
89
                            float curveMaxAmp)
 
90
{
 
91
    return -(sinForProg *
 
92
             (1 - pow (pow (2 * relDistToCenter, 1.3), 2)) *
 
93
             curveMaxAmp *
 
94
             mModel->scale ().x ());
 
95
}
 
96
 
 
97
void
 
98
CurvedFoldAnim::step ()
 
99
{
 
100
    GridZoomAnim::step ();
 
101
 
 
102
    float forwardProgress = getActualProgress ();
 
103
 
 
104
    CompRect winRect (mAWindow->savedRectsValid () ?
 
105
                      mAWindow->saveWinRect () :
 
106
                      mWindow->geometry ());
 
107
    CompRect inRect (mAWindow->savedRectsValid () ?
 
108
                     mAWindow->savedInRect () :
 
109
                     mWindow->inputRect ());
 
110
    CompRect outRect (mAWindow->savedRectsValid () ?
 
111
                      mAWindow->savedOutRect () :
 
112
                      mWindow->outputRect ());
 
113
    CompWindowExtents outExtents (mAWindow->savedRectsValid () ?
 
114
                                  mAWindow->savedOutExtents () :
 
115
                                  mWindow->output ());
 
116
 
 
117
    int wx = winRect.x ();
 
118
    int wy = winRect.y ();
 
119
    int wheight = winRect.height ();
 
120
 
 
121
    int oy = outRect.y ();
 
122
    int owidth = outRect.width ();
 
123
    int oheight = outRect.height ();
 
124
 
 
125
    float curveMaxAmp = (0.4 * pow ((float)oheight /
 
126
                                    ::screen->height (), 0.4) *
 
127
                         optValF (AnimationOptions::CurvedFoldAmpMult));
 
128
 
 
129
    float sinForProg = sin (forwardProgress * M_PI / 2);
 
130
 
 
131
    GridModel::GridObject *object = mModel->objects ();
 
132
    unsigned int n = mModel->numObjects ();
 
133
    for (unsigned int i = 0; i < n; i++, object++)
 
134
    {
 
135
        Point3d &objPos = object->position ();
 
136
 
 
137
        if (i % 2 == 0) // object is at the left side
 
138
        {
 
139
            float objGridY = object->gridPosition ().y ();
 
140
 
 
141
            float origy = (wy +
 
142
                           (oheight * objGridY -
 
143
                            outExtents.top) * mModel->scale ().y ());
 
144
 
 
145
            if (mCurWindowEvent == WindowEventShade ||
 
146
                mCurWindowEvent == WindowEventUnshade)
 
147
            {
 
148
                // Execute shade mode
 
149
 
 
150
                // find position in window contents
 
151
                // (window contents correspond to 0.0-1.0 range)
 
152
                float relPosInWinContents =
 
153
                    (objGridY * oheight -
 
154
                     mDecorTopHeight) / wheight;
 
155
                float relDistToCenter = fabs (relPosInWinContents - 0.5);
 
156
 
 
157
                if (objGridY == 0)
 
158
                {
 
159
                    objPos.setY (oy);
 
160
                    objPos.setZ (0);
 
161
                }
 
162
                else if (objGridY == 1)
 
163
                {
 
164
                    objPos.setY (
 
165
                        (1 - forwardProgress) * origy +
 
166
                        forwardProgress *
 
167
                        (oy + mDecorTopHeight + mDecorBottomHeight));
 
168
                    objPos.setZ (0);
 
169
                }
 
170
                else
 
171
                {
 
172
                    objPos.setY (
 
173
                        (1 - forwardProgress) * origy +
 
174
                        forwardProgress * (oy + mDecorTopHeight));
 
175
                    objPos.setZ (
 
176
                        getObjectZ (mModel, forwardProgress, sinForProg, relDistToCenter,
 
177
                                    curveMaxAmp));
 
178
                }
 
179
            }
 
180
            else
 
181
            {
 
182
                // Execute normal mode
 
183
 
 
184
                // find position within window borders
 
185
                // (border contents correspond to 0.0-1.0 range)
 
186
                float relPosInWinBorders =
 
187
                    (objGridY * oheight -
 
188
                     (inRect.y () - oy)) / inRect.height ();
 
189
                float relDistToCenter = fabs (relPosInWinBorders - 0.5);
 
190
 
 
191
                // prevent top & bottom shadows from extending too much
 
192
                if (relDistToCenter > 0.5)
 
193
                    relDistToCenter = 0.5;
 
194
 
 
195
                objPos.setY (
 
196
                    (1 - forwardProgress) * origy +
 
197
                    forwardProgress * (inRect.y () + inRect.height () / 2.0));
 
198
                objPos.setZ (
 
199
                    getObjectZ (mModel, forwardProgress, sinForProg, relDistToCenter,
 
200
                                curveMaxAmp));
 
201
            }
 
202
        }
 
203
        else // object is at the right side
 
204
        {
 
205
            // Set y/z position to the y/z position of the object at the left
 
206
            // on the same row (previous object)
 
207
            Point3d &leftObjPos = (object - 1)->position ();
 
208
            objPos.setY (leftObjPos.y ());
 
209
            objPos.setZ (leftObjPos.z ());
 
210
        }
 
211
 
 
212
        float origx = (wx +
 
213
                       (owidth * object->gridPosition ().x () -
 
214
                        outExtents.left) * mModel->scale ().x ());
 
215
        objPos.setX (origx);
 
216
    }
 
217
}
 
218
 
 
219
void
 
220
CurvedFoldAnim::updateBB (CompOutput &output)
 
221
{
 
222
    if (optValF (AnimationOptions::CurvedFoldAmpMult) < 0) // if outward
 
223
    {
 
224
        GridZoomAnim::updateBB (output); // goes through all objects
 
225
        return;
 
226
    }
 
227
 
 
228
    // Just consider the corner objects
 
229
 
 
230
    GridModel::GridObject *objects = mModel->objects ();
 
231
    unsigned int n = mModel->numObjects ();
 
232
    for (unsigned int i = 0; i < n; i++)
 
233
    {
 
234
        Point3d &pos = objects[i].position ();
 
235
        GLVector coords (pos.x (), pos.y (), 0, 1);
 
236
        mAWindow->expandBBWithPoint2DTransform (coords, mTransform);
 
237
 
 
238
        if (i == 1)
 
239
        {
 
240
            // skip to the last row after considering the first row
 
241
            // (each row has 2 objects)
 
242
            i = n - 3;
 
243
        }
 
244
    }
 
245
}
 
246
 
 
247
bool
 
248
CurvedFoldAnim::zoomToIcon ()
 
249
{
 
250
    return ((mCurWindowEvent == WindowEventMinimize ||
 
251
             mCurWindowEvent == WindowEventUnminimize) &&
 
252
            optValB (AnimationOptions::CurvedFoldZoomToTaskbar));
 
253
}
 
254