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