source: trunk/examples/effects/lighting/lighting.cpp@ 846

Last change on this file since 846 was 846, checked in by Dmitry A. Kuminov, 14 years ago

trunk: Merged in qt 4.7.2 sources from branches/vendor/nokia/qt.

  • Property svn:eol-style set to native
File size: 4.6 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
4** All rights reserved.
5** Contact: Nokia Corporation ([email protected])
6**
7** This file is part of the examples of the Qt Toolkit.
8**
9** $QT_BEGIN_LICENSE:BSD$
10** You may use this file under the terms of the BSD license as follows:
11**
12** "Redistribution and use in source and binary forms, with or without
13** modification, are permitted provided that the following conditions are
14** met:
15** * Redistributions of source code must retain the above copyright
16** notice, this list of conditions and the following disclaimer.
17** * Redistributions in binary form must reproduce the above copyright
18** notice, this list of conditions and the following disclaimer in
19** the documentation and/or other materials provided with the
20** distribution.
21** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
22** the names of its contributors may be used to endorse or promote
23** products derived from this software without specific prior written
24** permission.
25**
26** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
27** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
28** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
29** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
30** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
31** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
32** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
33** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
34** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
35** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
36** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
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
49Lighting::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
64void 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
110void 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
Note: See TracBrowser for help on using the repository browser.