1 /****************************************************************************
2 **
3 ** Copyright (C) 2015 The Qt Company Ltd.
4 ** Contact: http://www.qt.io/licensing/
5 **
6 ** This file is part of the examples of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:BSD$
9 ** You may use this file under the terms of the BSD license as follows:
10 **
11 ** "Redistribution and use in source and binary forms, with or without
12 ** modification, are permitted provided that the following conditions are
13 ** met:
14 **   * Redistributions of source code must retain the above copyright
15 **     notice, this list of conditions and the following disclaimer.
16 **   * Redistributions in binary form must reproduce the above copyright
17 **     notice, this list of conditions and the following disclaimer in
18 **     the documentation and/or other materials provided with the
19 **     distribution.
20 **   * Neither the name of The Qt Company Ltd nor the names of its
21 **     contributors may be used to endorse or promote products derived
22 **     from this software without specific prior written permission.
23 **
24 **
25 ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26 ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27 ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28 ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29 ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30 ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31 ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35 ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
36 **
37 ** $QT_END_LICENSE$
38 **
39 ****************************************************************************/
40 
41 #include "lighting.h"
42 
43 #include <QtGui>
44 
45 #ifndef M_PI
46 #define M_PI 3.14159265358979323846
47 #endif
48 
Lighting(QWidget * parent)49 Lighting::Lighting(QWidget *parent): QGraphicsView(parent), angle(0.0)
50 {
51     setScene(&m_scene);
52 
53     setupScene();
54 
55     QTimer *timer = new QTimer(this);
56     connect(timer, SIGNAL(timeout()), SLOT(animate()));
57     timer->setInterval(30);
58     timer->start();
59 
60     setRenderHint(QPainter::Antialiasing, true);
61     setFrameStyle(QFrame::NoFrame);
62 }
63 
setupScene()64 void Lighting::setupScene()
65 {
66     m_scene.setSceneRect(-300, -200, 600, 460);
67 
68     QLinearGradient linearGrad(QPointF(-100, -100), QPointF(100, 100));
69     linearGrad.setColorAt(0, QColor(255, 255, 255));
70     linearGrad.setColorAt(1, QColor(192, 192, 255));
71     setBackgroundBrush(linearGrad);
72 
73     QRadialGradient radialGrad(30, 30, 30);
74     radialGrad.setColorAt(0, Qt::yellow);
75     radialGrad.setColorAt(0.2, Qt::yellow);
76     radialGrad.setColorAt(1, Qt::transparent);
77     QPixmap pixmap(60, 60);
78     pixmap.fill(Qt::transparent);
79     QPainter painter(&pixmap);
80     painter.setPen(Qt::NoPen);
81     painter.setBrush(radialGrad);
82     painter.drawEllipse(0, 0, 60, 60);
83     painter.end();
84 
85     m_lightSource = m_scene.addPixmap(pixmap);
86     m_lightSource->setZValue(2);
87 
88     for (int i = -2; i < 3; ++i)
89         for (int j = -2; j < 3; ++j) {
90             QAbstractGraphicsShapeItem *item;
91             if ((i + j) & 1)
92                 item = new QGraphicsEllipseItem(0, 0, 50, 50);
93             else
94                 item = new QGraphicsRectItem(0, 0, 50, 50);
95 
96             item->setPen(QPen(Qt::black, 1));
97             item->setBrush(QBrush(Qt::white));
98             QGraphicsDropShadowEffect *effect = new QGraphicsDropShadowEffect;
99             effect->setBlurRadius(8);
100             item->setGraphicsEffect(effect);
101             item->setZValue(1);
102             item->setPos(i * 80, j * 80);
103             m_scene.addItem(item);
104             m_items << item;
105         }
106 
107 
108 }
109 
animate()110 void Lighting::animate()
111 {
112     angle += (M_PI / 30);
113     qreal xs = 200 * sin(angle) - 40 + 25;
114     qreal ys = 200 * cos(angle) - 40 + 25;
115     m_lightSource->setPos(xs, ys);
116 
117     for (int i = 0; i < m_items.size(); ++i) {
118         QGraphicsItem *item = m_items.at(i);
119         Q_ASSERT(item);
120         QGraphicsDropShadowEffect *effect = static_cast<QGraphicsDropShadowEffect *>(item->graphicsEffect());
121         Q_ASSERT(effect);
122 
123         QPointF delta(item->x() - xs, item->y() - ys);
124         effect->setOffset(delta.toPoint() / 30);
125 
126         qreal dx = delta.x();
127         qreal dy = delta.y();
128         qreal dd = sqrt(dx * dx + dy * dy);
129         QColor color = effect->color();
130         color.setAlphaF(qBound(0.4, 1 - dd / 200.0, 0.7));
131         effect->setColor(color);
132     }
133 
134     m_scene.update();
135 }
136 
resizeEvent(QResizeEvent *)137 void Lighting::resizeEvent(QResizeEvent */*event*/)
138 {
139 #if defined(Q_OS_SYMBIAN) || defined(Q_WS_MAEMO_5) || defined(Q_WS_SIMULATOR)
140     fitInView(sceneRect(), Qt::KeepAspectRatio);
141 #endif
142 }
143