1 /****************************************************************************
3 ** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/legal
6 ** This file is part of the QtQuick module of the Qt Toolkit.
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 Digia. For licensing terms and
14 ** conditions see http://qt.digia.com/licensing. For further information
15 ** use the contact form at http://qt.digia.com/contact-us.
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 2.1 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL included in the
21 ** packaging of this file. Please review the following information to
22 ** ensure the GNU Lesser General Public License version 2.1 requirements
23 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
25 ** In addition, as a special exception, Digia gives you certain additional
26 ** rights. These rights are described in the Digia Qt LGPL Exception
27 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
29 ** GNU General Public License Usage
30 ** Alternatively, this file may be used under the terms of the GNU
31 ** General Public License version 3.0 as published by the Free Software
32 ** Foundation and appearing in the file LICENSE.GPL included in the
33 ** packaging of this file. Please review the following information to
34 ** ensure the GNU General Public License version 3.0 requirements will be
35 ** met: http://www.gnu.org/copyleft/gpl.html.
40 ****************************************************************************/
42 #include "qquicktargetdirection_p.h"
43 #include "qquickparticleemitter_p.h"
49 \qmltype TargetDirection
50 \instantiates QQuickTargetDirection
51 \inqmlmodule QtQuick.Particles 2
52 \ingroup qtquick-particles
54 \brief For specifying a direction towards the target point
58 \qmlproperty real QtQuick.Particles2::TargetDirection::targetX
61 \qmlproperty real QtQuick.Particles2::TargetDirection::targetY
64 \qmlproperty Item QtQuick.Particles2::TargetDirection::targetItem
65 If specified, this will take precedence over targetX and targetY.
66 The targeted point will be the center of the specified Item
69 \qmlproperty real QtQuick.Particles2::TargetDirection::targetVariation
72 \qmlproperty real QtQuick.Particles2::TargetDirection::magnitude
75 \qmlproperty real QtQuick.Particles2::TargetDirection::magnitudeVariation
78 \qmlproperty bool QtQuick.Particles2::TargetDirection::proportionalMagnitude
80 If true, then the value of magnitude and magnitudeVariation shall be interpreted as multiples
81 of the distance between the source point and the target point, per second.
83 If false(default), then the value of magnitude and magnitudeVariation shall be interpreted as
87 QQuickTargetDirection::QQuickTargetDirection(QObject *parent) :
88 QQuickDirection(parent)
91 , m_targetVariation(0)
92 , m_proportionalMagnitude(false)
94 , m_magnitudeVariation(0)
99 const QPointF QQuickTargetDirection::sample(const QPointF &from)
101 //###This approach loses interpolating the last position of the target (like we could with the emitter) is it worthwhile?
106 QQuickParticleEmitter* parentEmitter = qobject_cast<QQuickParticleEmitter*>(parent());
107 targetX = m_targetItem->width()/2;
108 targetY = m_targetItem->height()/2;
110 qWarning() << "Directed vector is not a child of the emitter. Mapping of target item coordinates may fail.";
111 targetX += m_targetItem->x();
112 targetY += m_targetItem->y();
114 ret = parentEmitter->mapFromItem(m_targetItem, QPointF(targetX, targetY));
122 targetX += 0 - from.x() - m_targetVariation + rand()/(float)RAND_MAX * m_targetVariation*2;
123 targetY += 0 - from.y() - m_targetVariation + rand()/(float)RAND_MAX * m_targetVariation*2;
124 qreal theta = atan2(targetY, targetX);
125 qreal mag = m_magnitude + rand()/(float)RAND_MAX * m_magnitudeVariation * 2 - m_magnitudeVariation;
126 if (m_proportionalMagnitude)
127 mag *= sqrt(targetX * targetX + targetY * targetY);
128 ret.setX(mag * cos(theta));
129 ret.setY(mag * sin(theta));