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 #ifndef CUSTOMAFFECTOR_H 41 #define CUSTOMAFFECTOR_H 42 43 // 44 // W A R N I N G 45 // ------------- 46 // 47 // This file is not part of the Qt API. It exists purely as an 48 // implementation detail. This header file may change from version to 49 // version without notice, or even be removed. 50 // 51 // We mean it. 52 // 53 54 #include <QObject> 55 #include <QtQml/qqml.h> 56 #include "qquickparticlesystem_p.h" 57 #include "qquickparticleextruder_p.h" 58 #include "qquickparticleaffector_p.h" 59 #include "qquickdirection_p.h" 60 61 QT_BEGIN_NAMESPACE 62 63 class QQuickCustomAffector : public QQuickParticleAffector 64 { 65 Q_OBJECT 66 Q_PROPERTY(bool relative READ relative WRITE setRelative NOTIFY relativeChanged) 67 Q_PROPERTY(QQuickDirection *position READ position WRITE setPosition NOTIFY positionChanged RESET positionReset) 68 Q_PROPERTY(QQuickDirection *velocity READ velocity WRITE setVelocity NOTIFY velocityChanged RESET velocityReset) 69 Q_PROPERTY(QQuickDirection *acceleration READ acceleration WRITE setAcceleration NOTIFY accelerationChanged RESET accelerationReset) 70 QML_NAMED_ELEMENT(Affector) 71 72 public: 73 explicit QQuickCustomAffector(QQuickItem *parent = 0); 74 void affectSystem(qreal dt) override; 75 position()76 QQuickDirection * position() const 77 { 78 return m_position; 79 } 80 velocity()81 QQuickDirection * velocity() const 82 { 83 return m_velocity; 84 } 85 acceleration()86 QQuickDirection * acceleration() const 87 { 88 return m_acceleration; 89 } 90 positionReset()91 void positionReset() 92 { 93 m_position = &m_nullVector; 94 } 95 velocityReset()96 void velocityReset() 97 { 98 m_velocity = &m_nullVector; 99 } 100 accelerationReset()101 void accelerationReset() 102 { 103 m_acceleration = &m_nullVector; 104 } 105 relative()106 bool relative() const 107 { 108 return m_relative; 109 } 110 111 112 Q_SIGNALS: 113 void affectParticles(const QJSValue &particles, qreal dt); 114 115 void positionChanged(QQuickDirection * arg); 116 117 void velocityChanged(QQuickDirection * arg); 118 119 void accelerationChanged(QQuickDirection * arg); 120 121 void relativeChanged(bool arg); 122 123 public Q_SLOTS: setPosition(QQuickDirection * arg)124 void setPosition(QQuickDirection * arg) 125 { 126 if (m_position != arg) { 127 m_position = arg; 128 Q_EMIT positionChanged(arg); 129 } 130 } 131 setVelocity(QQuickDirection * arg)132 void setVelocity(QQuickDirection * arg) 133 { 134 if (m_velocity != arg) { 135 m_velocity = arg; 136 Q_EMIT velocityChanged(arg); 137 } 138 } 139 setAcceleration(QQuickDirection * arg)140 void setAcceleration(QQuickDirection * arg) 141 { 142 if (m_acceleration != arg) { 143 m_acceleration = arg; 144 Q_EMIT accelerationChanged(arg); 145 } 146 } 147 setRelative(bool arg)148 void setRelative(bool arg) 149 { 150 if (m_relative != arg) { 151 m_relative = arg; 152 Q_EMIT relativeChanged(arg); 153 } 154 } 155 156 protected: 157 bool isAffectConnected(); 158 bool affectParticle(QQuickParticleData *d, qreal dt) override; 159 160 private: 161 void affectProperties(const QList<QQuickParticleData*> &particles, qreal dt); 162 QQuickDirection * m_position; 163 QQuickDirection * m_velocity; 164 QQuickDirection * m_acceleration; 165 166 QQuickDirection m_nullVector; 167 bool m_relative; 168 }; 169 170 QT_END_NAMESPACE 171 #endif // CUSTOMAFFECTOR_H 172