Revision control
Copy as Markdown
// 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 QQUICK3DPARTICLE_H
#define QQUICK3DPARTICLE_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 <QColor>
#include <QVector4D>
#include <QtQuick3DParticles/private/qquick3dparticlesystem_p.h>
#include <QtQuick3DParticles/private/qquick3dparticledata_p.h>
QT_BEGIN_NAMESPACE
class QQuick3DParticleSpriteSequence;
class Q_QUICK3DPARTICLES_EXPORT QQuick3DParticle : public QQuick3DObject
{
Q_OBJECT
Q_PROPERTY(int maxAmount READ maxAmount WRITE setMaxAmount NOTIFY maxAmountChanged)
Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged RESET resetColor)
Q_PROPERTY(QVector4D colorVariation READ colorVariation WRITE setColorVariation NOTIFY colorVariationChanged)
Q_PROPERTY(bool unifiedColorVariation READ unifiedColorVariation WRITE setUnifiedColorVariation NOTIFY unifiedColorVariationChanged)
Q_PROPERTY(FadeType fadeInEffect READ fadeInEffect WRITE setFadeInEffect NOTIFY fadeInEffectChanged)
Q_PROPERTY(FadeType fadeOutEffect READ fadeOutEffect WRITE setFadeOutEffect NOTIFY fadeOutEffectChanged)
Q_PROPERTY(int fadeInDuration READ fadeInDuration WRITE setFadeInDuration NOTIFY fadeInDurationChanged)
Q_PROPERTY(int fadeOutDuration READ fadeOutDuration WRITE setFadeOutDuration NOTIFY fadeOutDurationChanged)
Q_PROPERTY(AlignMode alignMode READ alignMode WRITE setAlignMode NOTIFY alignModeChanged)
Q_PROPERTY(QVector3D alignTargetPosition READ alignTargetPosition WRITE setAlignTargetPosition NOTIFY alignTargetPositionChanged)
Q_PROPERTY(bool hasTransparency READ hasTransparency WRITE setHasTransparency NOTIFY hasTransparencyChanged)
Q_PROPERTY(SortMode sortMode READ sortMode WRITE setSortMode NOTIFY sortModeChanged)
QML_NAMED_ELEMENT(Particle3D)
QML_UNCREATABLE("Particle3D is abstract")
QML_ADDED_IN_VERSION(6, 2)
public:
QQuick3DParticle(QQuick3DObject *parent = nullptr);
~QQuick3DParticle() override;
enum FadeType
{
FadeNone,
FadeOpacity,
FadeScale
};
Q_ENUM(FadeType)
enum AlignMode
{
AlignNone,
AlignTowardsTarget,
AlignTowardsStartVelocity
};
Q_ENUM(AlignMode)
enum SortMode
{
SortNone,
SortNewest,
SortOldest,
SortDistance,
};
Q_ENUM(SortMode)
QQuick3DParticleSystem *system() const;
int maxAmount() const;
QColor color() const;
QVector4D colorVariation() const;
bool unifiedColorVariation() const;
FadeType fadeInEffect() const;
FadeType fadeOutEffect() const;
int fadeInDuration() const;
int fadeOutDuration() const;
AlignMode alignMode() const;
QVector3D alignTargetPosition() const;
bool hasTransparency() const;
SortMode sortMode() const;
float opacity() const;
void resetColor();
public Q_SLOTS:
void setSystem(QQuick3DParticleSystem *system);
void setMaxAmount(int maxAmount);
void setColor(QColor color);
void setColorVariation(QVector4D colorVariation);
void setUnifiedColorVariation(bool unified);
void setFadeInEffect(QQuick3DParticle::FadeType fadeInEffect);
void setFadeOutEffect(QQuick3DParticle::FadeType fadeOutEffect);
void setFadeInDuration(int fadeInDuration);
void setFadeOutDuration(int fadeOutDuration);
void setAlignMode(QQuick3DParticle::AlignMode alignMode);
void setAlignTargetPosition(const QVector3D &alignPosition);
void setHasTransparency(bool transparency);
void setSortMode(QQuick3DParticle::SortMode sortMode);
Q_SIGNALS:
void systemChanged();
void maxAmountChanged();
void colorChanged();
void colorVariationChanged();
void unifiedColorVariationChanged();
void fadeInEffectChanged();
void fadeOutEffectChanged();
void fadeInDurationChanged();
void fadeOutDurationChanged();
void alignModeChanged();
void alignTargetPositionChanged();
void hasTransparencyChanged();
void sortModeChanged();
protected:
// From QQmlParserStatus
void componentComplete() override;
QQuick3DParticle(QQuick3DObjectPrivate &dd, QQuick3DNode *parent = nullptr);
virtual void reset();
virtual void doSetMaxAmount(int amount);
// Pushes the owning system's content layers onto the hidden internal
// render node(s) this particle produces. The layers property is not
// inherited, so the system value has to be forwarded explicitly. This
// only applies to internal nodes the user cannot reach; user-provided
// delegate content is never touched and manages its own layers.
virtual void updateNodeLayers() { }
void updateBurstIndex(int amount);
// This will return the next available index
virtual int nextCurrentIndex(const QQuick3DParticleEmitter *emitter);
QSSGRenderGraphObject *updateSpatialNode(QSSGRenderGraphObject *node) override
{
return node;
}
QList<QQuick3DParticleData> m_particleData;
QQuick3DParticleSpriteSequence *m_spriteSequence = nullptr;
int m_maxAmount = 100;
int m_currentIndex = -1;
int m_lastBurstIndex = 0;
AlignMode m_alignMode = AlignNone;
QVector3D m_alignTarget;
virtual void setDepthBias(float bias)
{
m_depthBias = bias;
}
float depthBias() const
{
return m_depthBias;
}
private:
friend class QQuick3DParticleSystem;
friend class QQuick3DParticleEmitter;
friend class QQuick3DParticleSpriteSequence;
QQuick3DParticleSystem *m_system = nullptr;
QColor m_color;
QVector4D m_colorVariation;
bool m_unifiedColorVariation = false;
FadeType m_fadeInEffect = FadeOpacity;
FadeType m_fadeOutEffect = FadeOpacity;
int m_fadeInDuration = 250;
int m_fadeOutDuration = 250;
float m_depthBias = 0.0f;
bool m_hasTransparency = true;
SortMode m_sortMode = SortNone;
};
QT_END_NAMESPACE
#endif