Absolute File Name: | /home/opencoverage/opencoverage/guest-scripts/qtdeclarative/src/qtdeclarative/src/particles/qquickfriction.cpp |
Source code | Switch to Preprocessed file |
Line | Source | Count | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | /**************************************************************************** | - | ||||||||||||
2 | ** | - | ||||||||||||
3 | ** Copyright (C) 2016 The Qt Company Ltd. | - | ||||||||||||
4 | ** Contact: https://www.qt.io/licensing/ | - | ||||||||||||
5 | ** | - | ||||||||||||
6 | ** This file is part of the QtQuick module of the Qt Toolkit. | - | ||||||||||||
7 | ** | - | ||||||||||||
8 | ** $QT_BEGIN_LICENSE:LGPL$ | - | ||||||||||||
9 | ** Commercial License Usage | - | ||||||||||||
10 | ** Licensees holding valid commercial Qt licenses may use this file in | - | ||||||||||||
11 | ** accordance with the commercial license agreement provided with the | - | ||||||||||||
12 | ** Software or, alternatively, in accordance with the terms contained in | - | ||||||||||||
13 | ** a written agreement between you and The Qt Company. For licensing terms | - | ||||||||||||
14 | ** and conditions see https://www.qt.io/terms-conditions. For further | - | ||||||||||||
15 | ** information use the contact form at https://www.qt.io/contact-us. | - | ||||||||||||
16 | ** | - | ||||||||||||
17 | ** GNU Lesser General Public License Usage | - | ||||||||||||
18 | ** Alternatively, this file may be used under the terms of the GNU Lesser | - | ||||||||||||
19 | ** General Public License version 3 as published by the Free Software | - | ||||||||||||
20 | ** Foundation and appearing in the file LICENSE.LGPL3 included in the | - | ||||||||||||
21 | ** packaging of this file. Please review the following information to | - | ||||||||||||
22 | ** ensure the GNU Lesser General Public License version 3 requirements | - | ||||||||||||
23 | ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. | - | ||||||||||||
24 | ** | - | ||||||||||||
25 | ** GNU General Public License Usage | - | ||||||||||||
26 | ** Alternatively, this file may be used under the terms of the GNU | - | ||||||||||||
27 | ** General Public License version 2.0 or (at your option) the GNU General | - | ||||||||||||
28 | ** Public license version 3 or any later version approved by the KDE Free | - | ||||||||||||
29 | ** Qt Foundation. The licenses are as published by the Free Software | - | ||||||||||||
30 | ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 | - | ||||||||||||
31 | ** included in the packaging of this file. Please review the following | - | ||||||||||||
32 | ** information to ensure the GNU General Public License requirements will | - | ||||||||||||
33 | ** be met: https://www.gnu.org/licenses/gpl-2.0.html and | - | ||||||||||||
34 | ** https://www.gnu.org/licenses/gpl-3.0.html. | - | ||||||||||||
35 | ** | - | ||||||||||||
36 | ** $QT_END_LICENSE$ | - | ||||||||||||
37 | ** | - | ||||||||||||
38 | ****************************************************************************/ | - | ||||||||||||
39 | - | |||||||||||||
40 | #include "qquickfriction_p.h" | - | ||||||||||||
41 | #include <qmath.h> | - | ||||||||||||
42 | - | |||||||||||||
43 | QT_BEGIN_NAMESPACE | - | ||||||||||||
44 | /*! | - | ||||||||||||
45 | \qmltype Friction | - | ||||||||||||
46 | \instantiates QQuickFrictionAffector | - | ||||||||||||
47 | \inqmlmodule QtQuick.Particles | - | ||||||||||||
48 | \ingroup qtquick-particles | - | ||||||||||||
49 | \inherits Affector | - | ||||||||||||
50 | \brief For applying friction proportional to the particle's current velocity. | - | ||||||||||||
51 | - | |||||||||||||
52 | */ | - | ||||||||||||
53 | - | |||||||||||||
54 | /*! | - | ||||||||||||
55 | \qmlproperty real QtQuick.Particles::Friction::factor | - | ||||||||||||
56 | - | |||||||||||||
57 | A drag will be applied to moving objects which is this factor of their current velocity. | - | ||||||||||||
58 | */ | - | ||||||||||||
59 | /*! | - | ||||||||||||
60 | \qmlproperty real QtQuick.Particles::Friction::threshold | - | ||||||||||||
61 | - | |||||||||||||
62 | The drag will only be applied to objects with a velocity above the threshold velocity. The | - | ||||||||||||
63 | drag applied will bring objects down to the threshold velocity, but no further. | - | ||||||||||||
64 | - | |||||||||||||
65 | The default threshold is 0 | - | ||||||||||||
66 | */ | - | ||||||||||||
67 | static qreal sign(qreal a) | - | ||||||||||||
68 | { | - | ||||||||||||
69 | return a >= 0 ? 1 : -1; executed 98808 times by 1 test: return a >= 0 ? 1 : -1; Executed by:
| 98808 | ||||||||||||
70 | } | - | ||||||||||||
71 | - | |||||||||||||
72 | static const qreal epsilon = 0.00001; | - | ||||||||||||
73 | - | |||||||||||||
74 | QQuickFrictionAffector::QQuickFrictionAffector(QQuickItem *parent) : | - | ||||||||||||
75 | QQuickParticleAffector(parent), m_factor(0.0), m_threshold(0.0) | - | ||||||||||||
76 | { | - | ||||||||||||
77 | } executed 10 times by 2 tests: end of block Executed by:
| 10 | ||||||||||||
78 | - | |||||||||||||
79 | bool QQuickFrictionAffector::affectParticle(QQuickParticleData *d, qreal dt) | - | ||||||||||||
80 | { | - | ||||||||||||
81 | if (!m_factor)
| 0-93378 | ||||||||||||
82 | return false; never executed: return false; | 0 | ||||||||||||
83 | qreal curVX = d->curVX(m_system); | - | ||||||||||||
84 | qreal curVY = d->curVY(m_system); | - | ||||||||||||
85 | if (!curVX && !curVY)
| 0-48902 | ||||||||||||
86 | return false; executed 44476 times by 1 test: return false; Executed by:
| 44476 | ||||||||||||
87 | qreal newVX = curVX + (curVX * m_factor * -1 * dt); | - | ||||||||||||
88 | qreal newVY = curVY + (curVY * m_factor * -1 * dt); | - | ||||||||||||
89 | - | |||||||||||||
90 | if (!m_threshold) {
| 24062-24840 | ||||||||||||
91 | if (sign(curVX) != sign(newVX))
| 1216-22846 | ||||||||||||
92 | newVX = 0; executed 1216 times by 1 test: newVX = 0; Executed by:
| 1216 | ||||||||||||
93 | if (sign(curVY) != sign(newVY))
| 0-24062 | ||||||||||||
94 | newVY = 0; never executed: newVY = 0; | 0 | ||||||||||||
95 | } else { executed 24062 times by 1 test: end of block Executed by:
| 24062 | ||||||||||||
96 | qreal curMag = qSqrt(curVX*curVX + curVY*curVY); | - | ||||||||||||
97 | if (curMag <= m_threshold + epsilon)
| 1280-23560 | ||||||||||||
98 | return false; executed 23560 times by 1 test: return false; Executed by:
| 23560 | ||||||||||||
99 | qreal newMag = qSqrt(newVX*newVX + newVY*newVY); | - | ||||||||||||
100 | if (newMag <= m_threshold + epsilon || //went past the threshold, stop there instead
| 0-1280 | ||||||||||||
101 | sign(curVX) != sign(newVX) || //went so far past maybe it came out the other side!
| 0-1280 | ||||||||||||
102 | sign(curVY) != sign(newVY)) {
| 0 | ||||||||||||
103 | qreal theta = qAtan2(curVY, curVX); | - | ||||||||||||
104 | newVX = m_threshold * qCos(theta); | - | ||||||||||||
105 | newVY = m_threshold * qSin(theta); | - | ||||||||||||
106 | } executed 1280 times by 1 test: end of block Executed by:
| 1280 | ||||||||||||
107 | } executed 1280 times by 1 test: end of block Executed by:
| 1280 | ||||||||||||
108 | - | |||||||||||||
109 | d->setInstantaneousVX(newVX, m_system); | - | ||||||||||||
110 | d->setInstantaneousVY(newVY, m_system); | - | ||||||||||||
111 | return true; executed 25342 times by 1 test: return true; Executed by:
| 25342 | ||||||||||||
112 | } | - | ||||||||||||
113 | QT_END_NAMESPACE | - | ||||||||||||
114 | - | |||||||||||||
115 | #include "moc_qquickfriction_p.cpp" | - | ||||||||||||
Source code | Switch to Preprocessed file |