38 Q_PROPERTY(BlendMode blendMode READ blendMode WRITE setBlendMode NOTIFY blendModeChanged)
39 Q_PROPERTY(QQuick3DTexture *sprite READ sprite WRITE setSprite NOTIFY spriteChanged)
40 Q_PROPERTY(QQuick3DParticleSpriteSequence *spriteSequence READ spriteSequence WRITE setSpriteSequence NOTIFY spriteSequenceChanged)
41 Q_PROPERTY(
bool billboard READ billboard WRITE setBillboard NOTIFY billboardChanged)
42 Q_PROPERTY(
float particleScale READ particleScale WRITE setParticleScale NOTIFY particleScaleChanged)
43 Q_PROPERTY(QQuick3DTexture *colorTable READ colorTable WRITE setColorTable NOTIFY colorTableChanged)
44 Q_PROPERTY(QQmlListProperty<QQuick3DAbstractLight> lights READ lights NOTIFY lightsChanged REVISION(6, 3))
45 Q_PROPERTY(
float offsetX READ offsetX WRITE setOffsetX NOTIFY offsetXChanged REVISION(6, 3))
46 Q_PROPERTY(
float offsetY READ offsetY WRITE setOffsetY NOTIFY offsetYChanged REVISION(6, 3))
47 Q_PROPERTY(
bool castsReflections READ castsReflections WRITE setCastsReflections NOTIFY castsReflectionsChanged REVISION(6, 4))
48 QML_NAMED_ELEMENT(SpriteParticle3D)
49 QML_ADDED_IN_VERSION(6, 2)
52 enum BlendMode { SourceOver = 0, Screen, Multiply };
55 QQuick3DParticleSpriteParticle(QQuick3DNode *parent =
nullptr);
56 ~QQuick3DParticleSpriteParticle() override;
58 BlendMode blendMode()
const;
59 QQuick3DTexture *sprite()
const;
60 QQuick3DParticleSpriteSequence *spriteSequence()
const;
61 bool billboard()
const;
62 float particleScale()
const;
63 QQuick3DTexture *colorTable()
const;
64 Q_REVISION(6, 3) QQmlListProperty<QQuick3DAbstractLight> lights();
65 float offsetX()
const;
66 float offsetY()
const;
67 Q_REVISION(6, 4)
bool castsReflections()
const;
70 void setBlendMode(QQuick3DParticleSpriteParticle::BlendMode blendMode);
71 void setSprite(QQuick3DTexture *sprite);
72 void setSpriteSequence(QQuick3DParticleSpriteSequence *spriteSequence);
73 void setBillboard(
bool billboard);
74 void setParticleScale(
float scale);
75 void setColorTable(QQuick3DTexture *colorTable);
76 void setOffsetX(
float value);
77 void setOffsetY(
float value);
78 Q_REVISION(6, 4)
void setCastsReflections(
bool castsReflections);
81 void blendModeChanged();
83 void spriteSequenceChanged();
84 void billboardChanged();
85 void particleScaleChanged();
86 void colorTableChanged();
87 Q_REVISION(6, 3)
void lightsChanged();
88 Q_REVISION(6, 3)
void offsetXChanged();
89 Q_REVISION(6, 3)
void offsetYChanged();
90 Q_REVISION(6, 4)
void castsReflectionsChanged();
93 void itemChange(ItemChange,
const ItemChangeData &) override;
94 void reset() override;
95 void componentComplete() override;
96 int nextCurrentIndex(
const QQuick3DParticleEmitter *emitter) override;
97 virtual void setParticleData(
int particleIndex,
98 const QVector3D &position,
99 const QVector3D &rotation,
100 const QVector4D &color,
101 float size,
float age,
102 float animationFrame);
103 virtual void resetParticleData(
int particleIndex);
104 virtual void commitParticles(
float);
105 void setDepthBias(
float bias) override
107 QQuick3DParticle::setDepthBias(bias);
112 void onLightDestroyed(QObject *object);
115 friend class QQuick3DParticleSystem;
116 friend class QQuick3DParticleEmitter;
117 friend class QQuick3DParticleSpriteSequence;
129 struct SpriteParticleData
136 float animationFrame = -1.0f;
137 int emitterIndex = -1;
140 class ParticleUpdateNode :
public QQuick3DNode
143 ParticleUpdateNode(QQuick3DNode *parent =
nullptr)
144 : QQuick3DNode(parent)
147 QSSGRenderGraphObject *updateSpatialNode(QSSGRenderGraphObject *node) override;
148 QQuick3DParticleSpriteParticle *m_particle =
nullptr;
149 bool m_nodeDirty =
true;
151 friend class ParticleUpdateNode;
153 struct PerEmitterData
155 ParticleUpdateNode *particleUpdateNode =
nullptr;
156 int particleCount = 0;
157 int emitterIndex = -1;
158 const QQuick3DParticleEmitter *emitter =
nullptr;
161 PerEmitterData &perEmitterData(
const QQuick3DNode *updateNode);
162 PerEmitterData &perEmitterData(
int emitterIndex);
163 QSSGRenderGraphObject *updateParticleNode(
const ParticleUpdateNode *updateNode, QSSGRenderGraphObject *node);
166 virtual void handleMaxAmountChanged(
int amount);
167 virtual void handleSystemChanged(QQuick3DParticleSystem *system);
170 void markNodesDirty();
171 void updateNodeLayers() override;
173 QMap<
const QQuick3DParticleEmitter *, PerEmitterData> m_perEmitterData;
174 QVector<SpriteParticleData> m_spriteParticleData;
175 int m_nextEmitterIndex = 0;
176 FeatureLevel m_featureLevel = FeatureLevel::Simple;
179 static QSSGRenderParticles::FeatureLevel mapFeatureLevel(QQuick3DParticleSpriteParticle::FeatureLevel level);
181 void updateParticleBuffer(ParticleUpdateNode *updateNode, QSSGRenderGraphObject *node);
182 void updateAnimatedParticleBuffer(ParticleUpdateNode *updateNode, QSSGRenderGraphObject *node);
183 void updateSceneManager(QQuick3DSceneManager *window);
187 void updateFeatureLevel();
189 std::array<QMetaObject::Connection, 3> m_connections;
190 PerEmitterData n_noPerEmitterData;
191 BlendMode m_blendMode = SourceOver;
192 QQuick3DTexture *m_sprite =
nullptr;
193 QQuick3DTexture *m_colorTable =
nullptr;
194 float m_particleScale = 5.0f;
195 bool m_billboard =
false;
196 bool m_useAnimatedParticle =
false;
199 Q_REVISION(6, 3)
static void qmlAppendLight(QQmlListProperty<QQuick3DAbstractLight> *list, QQuick3DAbstractLight *light);
200 Q_REVISION(6, 3)
static QQuick3DAbstractLight *qmlLightAt(QQmlListProperty<QQuick3DAbstractLight> *list, qsizetype index);
201 Q_REVISION(6, 3)
static qsizetype qmlLightsCount(QQmlListProperty<QQuick3DAbstractLight> *list);
202 Q_REVISION(6, 3)
static void qmlClearLights(QQmlListProperty<QQuick3DAbstractLight> *list);
203 QVector<QQuick3DAbstractLight *> m_lights;
204 QVector3D m_offset = {};
205 bool m_castsReflections =
true;
static QSSGRenderParticles::BlendMode mapBlendMode(QQuick3DParticleSpriteParticle::BlendMode mode)