Revision control
++ // Copyright (C) 2022 The Qt Company Ltd.
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
++ // Qt-Security score:significant reason:default
++
++
++ #ifndef QQUICK3DPARTICLELINEPARTICLE_H
++ #define QQUICK3DPARTICLELINEPARTICLE_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 <QtQuick3DParticles/private/qquick3dparticlespriteparticle_p.h>
++
++ QT_BEGIN_NAMESPACE
++
++ class Q_QUICK3DPARTICLES_EXPORT QQuick3DParticleLineParticle : public QQuick3DParticleSpriteParticle
++ {
++ Q_OBJECT
++ Q_PROPERTY(int segmentCount READ segmentCount WRITE setSegmentCount NOTIFY segmentCountChanged)
++ Q_PROPERTY(float alphaFade READ alphaFade WRITE setAlphaFade NOTIFY alphaFadeChanged)
++ Q_PROPERTY(float scaleMultiplier READ scaleMultiplier WRITE setScaleMultiplier NOTIFY scaleMultiplierChanged)
++ Q_PROPERTY(float texcoordMultiplier READ texcoordMultiplier WRITE setTexcoordMultiplier NOTIFY texcoordMultiplierChanged)
++ Q_PROPERTY(float length READ length WRITE setLength NOTIFY lengthChanged)
++ Q_PROPERTY(float lengthVariation READ lengthVariation WRITE setLengthVariation NOTIFY lengthVariationChanged)
++ Q_PROPERTY(float lengthDeltaMin READ lengthDeltaMin WRITE setLengthDeltaMin NOTIFY lengthDeltaMinChanged)
++ Q_PROPERTY(int eolFadeOutDuration READ eolFadeOutDuration WRITE setEolFadeOutDuration NOTIFY eolFadeOutDurationChanged)
++ Q_PROPERTY(TexcoordMode texcoordMode READ texcoordMode WRITE setTexcoordMode NOTIFY texcoordModeChanged)
++
++ QML_NAMED_ELEMENT(LineParticle3D)
++ QML_ADDED_IN_VERSION(6, 4)
++
++ public:
++ enum TexcoordMode
++ {
++ Absolute,
++ Relative,
++ Fill,
++ };
++ Q_ENUM(TexcoordMode)
++
++ QQuick3DParticleLineParticle(QQuick3DNode *parent = nullptr);
++ ~QQuick3DParticleLineParticle() override;
++
++ int segmentCount() const;
++ float alphaFade() const;
++ float scaleMultiplier() const;
++ float texcoordMultiplier() const;
++ float length() const;
++ float lengthVariation() const;
++ float lengthDeltaMin() const;
++ int eolFadeOutDuration() const;
++ TexcoordMode texcoordMode() const;
++
++ public Q_SLOTS:
++ void setSegmentCount(int count);
++ void setAlphaFade(float fade);
++ void setScaleMultiplier(float multiplier);
++ void setTexcoordMultiplier(float multiplier);
++ void setLength(float length);
++ void setLengthVariation(float length);
++ void setLengthDeltaMin(float min);
++ void setEolFadeOutDuration(int duration);
++ void setTexcoordMode(QQuick3DParticleLineParticle::TexcoordMode mode);
++
++ Q_SIGNALS:
++ void segmentCountChanged();
++ void alphaFadeChanged();
++ void scaleMultiplierChanged();
++ void texcoordMultiplierChanged();
++ void lengthChanged();
++ void lengthVariationChanged();
++ void lengthDeltaMinChanged();
++ void eolFadeOutDurationChanged();
++ void texcoordModeChanged();
++
++ private:
++
++ struct LineDataHeader
++ {
++ int emitterIndex = -1;
++ int pointCount = 0;
++ int currentIndex = 0;
++ float length = 0.0f;
++ };
++ struct LineData
++ {
++ QVector3D position;
++ QVector3D normal;
++ QVector4D color;
++ QVector3D tangent;
++ QVector3D binormal;
++ float size = 0.0f;
++ float length = 0.0f;
++ };
++ struct FadeOutLineData
++ {
++ int emitterIndex;
++ SpriteParticleData endPoint;
++ LineDataHeader header;
++ QVector<LineData> lineData;
++ float beginTime;
++ float endTime;
++ float timeFactor;
++ };
++
++ friend class QQuick3DParticleSystem;
++
++ class LineParticleUpdateNode : public ParticleUpdateNode
++ {
++ public:
++ LineParticleUpdateNode(QQuick3DNode *parent = nullptr)
++ : ParticleUpdateNode(parent)
++ {
++ }
++ QSSGRenderGraphObject *updateSpatialNode(QSSGRenderGraphObject *node) override;
++ };
++
++ void updateLineBuffer(LineParticleUpdateNode *updateNode, QSSGRenderGraphObject *node);
++ QSSGRenderGraphObject *updateLineNode(QSSGRenderGraphObject *node);
++ void handleSegmentCountChanged();
++ void updateLineSegment(int particleIndex);
++ void clearSegment(int particleIndex);
++ void handleMaxAmountChanged(int amount) override;
++ void handleSystemChanged(QQuick3DParticleSystem *system) override;
++ void reset() override;
++ void commitParticles(float time) override;
++ int nextCurrentIndex(const QQuick3DParticleEmitter *emitter) override;
++ void saveLineSegment(int particleIndex, float time);
++ void setParticleData(int particleIndex,
++ const QVector3D &position,
++ const QVector3D &rotation,
++ const QVector4D &color,
++ float size, float age,
++ float animationFrame) override;
++ void resetParticleData(int particleIndex) override;
++
++ QVector<LineDataHeader> m_lineHeaderData;
++ QVector<LineData> m_lineData;
++ QVector<FadeOutLineData> m_fadeOutData;
++
++ float m_alphaFade = 0.0f;
++ float m_scaleMultiplier = 1.0f;
++ float m_texcoordMultiplier = 1.0f;
++ float m_lengthDeltaMin = 10.0f;
++ float m_length = -1.0f;
++ float m_lengthVariation = 0.0f;
++ int m_segmentCount = 1;
++ int m_eolFadeOutDuration = 0;
++ TexcoordMode m_texcoordMode = TexcoordMode::Absolute;
++ };
++
++ QT_END_NAMESPACE
++
++ #endif