Revision control
++ // Copyright (C) 2021 The Qt Company Ltd.
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
++ // Qt-Security score:significant reason:default
++
++
++ #ifndef QQUICK3DPARTICLEEMITTER_H
++ #define QQUICK3DPARTICLEEMITTER_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 <QtQuick3D/private/qquick3dnode_p.h>
++ #include <QtQuick3DParticles/private/qquick3dparticledirection_p.h>
++ #include <QtQuick3DParticles/private/qquick3dparticlesystem_p.h>
++ #include <QtQuick3DParticles/private/qquick3dparticlemodelparticle_p.h>
++ #include <QtQuick3DParticles/private/qquick3dparticleabstractshape_p.h>
++ #include <QtQuick3DParticles/private/qquick3dparticleemitburst_p.h>
++ #include <QtQuick3DParticles/private/qquick3dparticledynamicburst_p.h>
++
++ QT_BEGIN_NAMESPACE
++
++ class QQuaternion;
++
++ class Q_QUICK3DPARTICLES_EXPORT QQuick3DParticleEmitter : public QQuick3DNode
++ {
++ Q_OBJECT
++ Q_PROPERTY(QQuick3DParticleSystem *system READ system WRITE setSystem NOTIFY systemChanged)
++ Q_PROPERTY(QQmlListProperty<QQuick3DParticleEmitBurst> emitBursts READ emitBursts)
++ Q_PROPERTY(QQuick3DParticleDirection *velocity READ velocity WRITE setVelocity NOTIFY velocityChanged)
++ Q_PROPERTY(QQuick3DParticle *particle READ particle WRITE setParticle NOTIFY particleChanged)
++ Q_PROPERTY(bool enabled READ enabled WRITE setEnabled NOTIFY enabledChanged)
++ Q_PROPERTY(QQuick3DParticleAbstractShape *shape READ shape WRITE setShape NOTIFY shapeChanged)
++ Q_PROPERTY(float emitRate READ emitRate WRITE setEmitRate NOTIFY emitRateChanged)
++ Q_PROPERTY(int lifeSpan READ lifeSpan WRITE setLifeSpan NOTIFY lifeSpanChanged)
++ Q_PROPERTY(int lifeSpanVariation READ lifeSpanVariation WRITE setLifeSpanVariation NOTIFY lifeSpanVariationChanged)
++ Q_PROPERTY(float particleScale READ particleScale WRITE setParticleScale NOTIFY particleScaleChanged)
++ Q_PROPERTY(float particleEndScale READ particleEndScale WRITE setParticleEndScale NOTIFY particleEndScaleChanged)
++ Q_PROPERTY(float particleScaleVariation READ particleScaleVariation WRITE setParticleScaleVariation NOTIFY particleScaleVariationChanged)
++ Q_PROPERTY(float particleEndScaleVariation READ particleEndScaleVariation WRITE setParticleEndScaleVariation NOTIFY particleEndScaleVariationChanged)
++ Q_PROPERTY(QVector3D particleRotation READ particleRotation WRITE setParticleRotation NOTIFY particleRotationChanged)
++ Q_PROPERTY(QVector3D particleRotationVariation READ particleRotationVariation WRITE setParticleRotationVariation NOTIFY particleRotationVariationChanged)
++ Q_PROPERTY(QVector3D particleRotationVelocity READ particleRotationVelocity WRITE setParticleRotationVelocity NOTIFY particleRotationVelocityChanged)
++ Q_PROPERTY(QVector3D particleRotationVelocityVariation READ particleRotationVelocityVariation WRITE setParticleRotationVelocityVariation NOTIFY particleRotationVariationVelocityChanged)
++ Q_PROPERTY(float depthBias READ depthBias WRITE setDepthBias NOTIFY depthBiasChanged)
++ Q_PROPERTY(bool reversed READ reversed WRITE setReversed NOTIFY reversedChanged REVISION(6, 10))
++
++ Q_PROPERTY(EmitMode emitMode READ emitMode WRITE setEmitMode NOTIFY emitModeChanged REVISION(6, 10))
++ QML_NAMED_ELEMENT(ParticleEmitter3D)
++ QML_ADDED_IN_VERSION(6, 2)
++
++ public:
++
++ enum EmitMode { Default = 0, SurfaceNormal, SurfaceReflected };
++ Q_ENUM(EmitMode)
++
++ QQuick3DParticleEmitter(QQuick3DNode *parent = nullptr);
++ ~QQuick3DParticleEmitter() override;
++
++ bool enabled() const;
++ QQuick3DParticleDirection *velocity() const;
++ QQuick3DParticleSystem *system() const;
++ float emitRate() const;
++ float particleScale() const;
++ float particleEndScale() const;
++ float particleScaleVariation() const;
++ float particleEndScaleVariation() const;
++ int lifeSpan() const;
++ int lifeSpanVariation() const;
++ QQuick3DParticle *particle() const;
++ QQuick3DParticleAbstractShape *shape() const;
++ QVector3D particleRotation() const;
++ QVector3D particleRotationVariation() const;
++ QVector3D particleRotationVelocity() const;
++ QVector3D particleRotationVelocityVariation() const;
++ float depthBias() const;
++ Q_REVISION(6, 10) bool reversed() const;
++
++ Q_REVISION(6, 10) EmitMode emitMode() const;
++ QQmlListProperty<QQuick3DParticleEmitBurst> emitBursts();
++
++ Q_INVOKABLE virtual void burst(int count);
++ Q_INVOKABLE virtual void burst(int count, int duration);
++ Q_INVOKABLE virtual void burst(int count, int duration, const QVector3D &position);
++
++ public Q_SLOTS:
++ void setEnabled(bool enabled);
++ void setVelocity(QQuick3DParticleDirection *velocity);
++ void setSystem(QQuick3DParticleSystem *system);
++ void setEmitRate(float emitRate);
++ void setParticleScale(float particleScale);
++ void setParticleEndScale(float particleEndScale);
++ void setParticleScaleVariation(float particleScaleVariation);
++ void setParticleEndScaleVariation(float particleEndScaleVariation);
++ void setLifeSpan(int lifeSpan);
++ void setLifeSpanVariation(int lifeSpanVariation);
++ void setParticle(QQuick3DParticle *particle);
++ void setShape(QQuick3DParticleAbstractShape *shape);
++ void setParticleRotation(const QVector3D &particleRotation);
++ void setParticleRotationVariation(const QVector3D &particleRotationVariation);
++ void setParticleRotationVelocity(const QVector3D &particleRotationVelocity);
++ void setParticleRotationVelocityVariation(const QVector3D &particleRotationVelocityVariation);
++ void setDepthBias(float bias);
++ Q_REVISION(6, 10) void setReversed(bool reversed);
++
++ Q_REVISION(6, 10) void setEmitMode(EmitMode mode);
++ Q_SIGNALS:
++ void velocityChanged();
++ void systemChanged();
++ void emitRateChanged();
++ void particleScaleChanged();
++ void particleEndScaleChanged();
++ void particleScaleVariationChanged();
++ void particleEndScaleVariationChanged();
++ void lifeSpanChanged();
++ void lifeSpanVariationChanged();
++ void particleChanged();
++ void shapeChanged();
++ void particleRotationChanged();
++ void particleRotationVariationChanged();
++ void particleRotationVelocityChanged();
++ void particleRotationVariationVelocityChanged();
++ void enabledChanged();
++ void depthBiasChanged();
++ Q_REVISION(6, 10) void reversedChanged();
++ Q_REVISION(6, 10) void emitModeChanged();
++
++ protected:
++ friend class QQuick3DParticleSystem;
++ friend class QQuick3DParticleEmitBurst;
++ friend class QQuick3DParticleTrailEmitter;
++
++ void componentComplete() override;
++ void registerEmitBurst(QQuick3DParticleEmitBurst *emitBurst);
++ void unRegisterEmitBurst(QQuick3DParticleEmitBurst *emitBurst);
++ void generateEmitBursts();
++ void emitParticle(QQuick3DParticle *particle, float startTime, const QMatrix4x4 &transform, const QQuaternion &parentRotation, const QVector3D ¢erPos, int index = -1,
++ const QVector3D &velocity = QVector3D(), const QVector3D &normal = QVector3D());
++ void emitParticles();
++ void emitActivationNodeParticles(QQuick3DParticleModelBlendParticle *particle);
++ void emitParticlesBurst(const QQuick3DParticleEmitBurstData &burst);
++ int getEmitAmount();
++ int getEmitAmountFromDynamicBursts(int triggerType = 0);
++
++ void reset();
++
++ // EmitBursts - list handling
++ void appendEmitBurst(QQuick3DParticleEmitBurst *);
++ qsizetype emitBurstCount() const;
++ QQuick3DParticleEmitBurst *emitBurst(qsizetype) const;
++ void clearEmitBursts();
++ void replaceEmitBurst(qsizetype, QQuick3DParticleEmitBurst *);
++ void removeLastEmitBurst();
++
++ // EmitBursts - static
++ static void appendEmitBurst(QQmlListProperty<QQuick3DParticleEmitBurst> *, QQuick3DParticleEmitBurst *);
++ static qsizetype emitBurstCount(QQmlListProperty<QQuick3DParticleEmitBurst> *);
++ static QQuick3DParticleEmitBurst *emitBurst(QQmlListProperty<QQuick3DParticleEmitBurst> *, qsizetype);
++ static void clearEmitBursts(QQmlListProperty<QQuick3DParticleEmitBurst> *);
++ static void replaceEmitBurst(QQmlListProperty<QQuick3DParticleEmitBurst> *, qsizetype, QQuick3DParticleEmitBurst *);
++ static void removeLastEmitBurst(QQmlListProperty<QQuick3DParticleEmitBurst> *);
++
++ private:
++ struct BurstEmitData
++ {
++ int startTime;
++ int endTime;
++ int emitAmount;
++ int emitCounter = 0;
++ int prevBurstTime;
++ };
++ QQuick3DParticleDirection *m_velocity = nullptr;
++ QQuick3DParticleSystem *m_system = nullptr;
++ float m_emitRate = 0.0f;
++ // Time in ms when emitting last time happened
++ int m_prevEmitTime = 0;
++ // Time in ms when dynamic burst last time happened
++ int m_prevBurstTime = 0;
++ float m_particleScale = 1.0f;
++ float m_particleEndScale = -1.0f;
++ float m_particleScaleVariation = 0.0f;
++ float m_particleEndScaleVariation = -1.0f;
++ int m_lifeSpan = 1000;
++ int m_lifeSpanVariation = 0;
++ float m_unemittedF = 0.0f;
++ float m_depthBias = 0.0f;
++ QQuick3DParticle *m_particle = nullptr;
++ QQuick3DParticleAbstractShape *m_shape = nullptr;
++ QVector3D m_particleRotation;
++ QVector3D m_particleRotationVariation;
++ QVector3D m_particleRotationVelocity;
++ QVector3D m_particleRotationVelocityVariation;
++ bool m_enabled = true;
++ const QQuick3DParticleData m_clearData = {};
++ bool m_burstGenerated = false;
++ QQuick3DNode *m_systemSharedParent = nullptr;
++ // This list contains all emit bursts (both QQuick3DParticleEmitBurst and QQuick3DParticleDynamicBurst)
++ QList<QQuick3DParticleEmitBurst *> m_emitBursts;
++ QList<BurstEmitData> m_burstEmitData;
++ bool m_reversed = false;
++ EmitMode m_emitMode = EmitMode::Default;
++ };
++
++ QT_END_NAMESPACE
++
++ #endif // QQUICK3DPARTICLEEMITTER_H