// Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #include "qquickpointattractor_p.h" #include #include QT_BEGIN_NAMESPACE /*! \qmltype Attractor \nativetype QQuickAttractorAffector \inqmlmodule QtQuick.Particles \ingroup qtquick-particles \inherits ParticleAffector \brief Attracts particles towards a specific point. Like other affectors, Attractor has the standard properties x, y, width, and height that represent the affected area. The size and position of the Attractor item determine the affected particles. The size of the attracting point is always 0x0, and its location is specified by \l pointX and \l pointY properties. */ /*! \qmlproperty real QtQuick.Particles::Attractor::pointX The x coordinate of the attracting point, relative to the x coordinate of the Attractor item. */ /*! \qmlproperty real QtQuick.Particles::Attractor::pointY The y coordinate of the attracting point, relative to the y coordinate of the Attractor item. */ /*! \qmlproperty real QtQuick.Particles::Attractor::strength The pull, in units per second, to be exerted on an item one pixel away. Strength, together with the value of \l proportionalToDistance property, determine the exact amount of pull exerted on particles at a distance. */ /*! \qmlproperty enumeration QtQuick.Particles::Attractor::affectedParameter The attribute of particles that is directly affected. \value Attractor.Position Position \value Attractor.Velocity Velocity \value Attractor.Acceleration Acceleration */ /*! \qmlproperty enumeration QtQuick.Particles::Attractor::proportionalToDistance The relation between the \l strength of the attraction and the distance from the particle to the attracting point. \value Attractor.Constant Constant \value Attractor.Linear Linear \value Attractor.InverseLinear Inverse linear \value Attractor.Quadratic Quadratic \value Attractor.InverseQuadratic Inverse quadratic */ QQuickAttractorAffector::QQuickAttractorAffector(QQuickItem *parent) : QQuickParticleAffector(parent), m_strength(0.0), m_x(0), m_y(0) , m_physics(Velocity), m_proportionalToDistance(Linear) { } bool QQuickAttractorAffector::affectParticle(QQuickParticleData *d, qreal dt) { if (m_strength == 0.0) return false; qreal dx = m_x+m_offset.x() - d->curX(m_system); qreal dy = m_y+m_offset.y() - d->curY(m_system); qreal r = std::sqrt((dx*dx) + (dy*dy)); qreal theta = std::atan2(dy,dx); qreal ds = 0; switch (m_proportionalToDistance){ case InverseQuadratic: ds = (m_strength / qMax(1.,r*r)); break; case InverseLinear: ds = (m_strength / qMax(1.,r)); break; case Quadratic: ds = (m_strength * qMax(1.,r*r)); break; case Linear: ds = (m_strength * qMax(1.,r)); break; default: //also Constant ds = m_strength; } ds *= dt; dx = ds * std::cos(theta); dy = ds * std::sin(theta); qreal vx,vy; switch (m_physics){ case Position: d->x = (d->x + dx); d->y = (d->y + dy); break; case Acceleration: d->setInstantaneousAX(d->ax + dx, m_system); d->setInstantaneousAY(d->ay + dy, m_system); break; case Velocity: //also default default: vx = d->curVX(m_system); vy = d->curVY(m_system); d->setInstantaneousVX(vx + dx, m_system); d->setInstantaneousVY(vy + dy, m_system); } return true; } QT_END_NAMESPACE #include "moc_qquickpointattractor_p.cpp"