// Copyright (C) 2021 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #ifndef QQUICK3DPARTICLEAFFECTOR_H #define QQUICK3DPARTICLEAFFECTOR_H // // W A R N I N G // ------------- // // This file is not part of the Qt API. It exists purely as an // implementation detail. This header file may change from version to // version without notice, or even be removed. // // We mean it. // #include #include #include #include #include #include #include QT_BEGIN_NAMESPACE class Q_QUICK3DPARTICLES_EXPORT QQuick3DParticleAffector : public QQuick3DNode { Q_OBJECT Q_PROPERTY(QQuick3DParticleSystem *system READ system WRITE setSystem NOTIFY systemChanged) Q_PROPERTY(QQmlListProperty particles READ particles) Q_PROPERTY(bool enabled READ enabled WRITE setEnabled NOTIFY enabledChanged) QML_NAMED_ELEMENT(Affector3D) QML_UNCREATABLE("Affector3D is abstract") QML_ADDED_IN_VERSION(6, 2) public: QQuick3DParticleAffector(QQuick3DNode *parent = nullptr); ~QQuick3DParticleAffector() override; QQuick3DParticleSystem *system() const; bool enabled() const; // Particles list handling QQmlListProperty particles(); void appendParticle(QQuick3DParticle *); qsizetype particleCount() const; QQuick3DParticle *particle(qsizetype) const; void clearParticles(); void replaceParticle(qsizetype, QQuick3DParticle *); void removeLastParticle(); public Q_SLOTS: void setSystem(QQuick3DParticleSystem *system); void setEnabled(bool enabled); Q_SIGNALS: void update(); void systemChanged(); void enabledChanged(); protected: QList m_particles; QQuick3DNode *m_systemSharedParent = nullptr; private: friend class QQuick3DParticleSystem; // From QQmlParserStatus void componentComplete() override; // Called once per frame for all the enabled affectors. virtual void prepareToAffect(); // Called for each living particle attached to the attractor. virtual void affectParticle(const QQuick3DParticleData &sd, QQuick3DParticleDataCurrent *d, float time) = 0; static void appendParticle(QQmlListProperty *, QQuick3DParticle *); static qsizetype particleCount(QQmlListProperty *); static QQuick3DParticle *particle(QQmlListProperty *, qsizetype); static void clearParticles(QQmlListProperty *); static void replaceParticle(QQmlListProperty *, qsizetype, QQuick3DParticle *); static void removeLastParticle(QQmlListProperty *); QQuick3DParticleSystem *m_system = nullptr; bool m_enabled = true; QMap m_connections; }; QT_END_NAMESPACE #endif // QQUICK3DPARTICLEAFFECTOR_H