Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qquick3dparticlespriteparticle_p.h
Go to the documentation of this file.
1// Copyright (C) 2021 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
5
6#ifndef QQUICK3DSPRITEPARTICLE_H
7#define QQUICK3DSPRITEPARTICLE_H
8
9//
10// W A R N I N G
11// -------------
12//
13// This file is not part of the Qt API. It exists purely as an
14// implementation detail. This header file may change from version to
15// version without notice, or even be removed.
16//
17// We mean it.
18//
19
20#include <QColor>
21#include <QVector4D>
22#include <QtQml/QQmlListProperty>
23
24#include <QtQuick3DParticles/private/qquick3dparticle_p.h>
25#include <QtQuick3DParticles/private/qquick3dparticlesystem_p.h>
26#include <QtQuick3DParticles/private/qquick3dparticledata_p.h>
27#include <QtQuick3DParticles/private/qquick3dparticlespritesequence_p.h>
28#include <QtQuick3D/private/qquick3dabstractlight_p.h>
29#include <QtQuick3DRuntimeRender/private/qssgrenderparticles_p.h>
30
31#include <array>
32
34
36{
37 Q_OBJECT
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)
50
51public:
52 enum BlendMode { SourceOver = 0, Screen, Multiply };
53 Q_ENUM(BlendMode)
54
55 QQuick3DParticleSpriteParticle(QQuick3DNode *parent = nullptr);
56 ~QQuick3DParticleSpriteParticle() override;
57
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;
68
69public Q_SLOTS:
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);
79
80Q_SIGNALS:
81 void blendModeChanged();
82 void spriteChanged();
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();
91
92protected:
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
106 {
107 QQuick3DParticle::setDepthBias(bias);
108 markNodesDirty();
109 }
110
111private Q_SLOTS:
112 void onLightDestroyed(QObject *object);
113
114public:
115 friend class QQuick3DParticleSystem;
116 friend class QQuick3DParticleEmitter;
117 friend class QQuick3DParticleSpriteSequence;
118
119 enum FeatureLevel
120 {
121 Simple = 0,
122 Mapped,
123 Animated,
124 SimpleVLight,
125 MappedVLight,
126 AnimatedVLight
127 };
128
129 struct SpriteParticleData
130 {
131 QVector3D position;
132 QVector3D rotation;
133 QVector4D color;
134 float size = 0.0f;
135 float age = 0.0f;
136 float animationFrame = -1.0f;
137 int emitterIndex = -1;
138 };
139
140 class ParticleUpdateNode : public QQuick3DNode
141 {
142 public:
143 ParticleUpdateNode(QQuick3DNode *parent = nullptr)
144 : QQuick3DNode(parent)
145 {
146 }
147 QSSGRenderGraphObject *updateSpatialNode(QSSGRenderGraphObject *node) override;
148 QQuick3DParticleSpriteParticle *m_particle = nullptr;
149 bool m_nodeDirty = true;
150 };
151 friend class ParticleUpdateNode;
152
153 struct PerEmitterData
154 {
155 ParticleUpdateNode *particleUpdateNode = nullptr;
156 int particleCount = 0;
157 int emitterIndex = -1;
158 const QQuick3DParticleEmitter *emitter = nullptr;
159 };
160
161 PerEmitterData &perEmitterData(const QQuick3DNode *updateNode);
162 PerEmitterData &perEmitterData(int emitterIndex);
163 QSSGRenderGraphObject *updateParticleNode(const ParticleUpdateNode *updateNode, QSSGRenderGraphObject *node);
164
165protected:
166 virtual void handleMaxAmountChanged(int amount);
167 virtual void handleSystemChanged(QQuick3DParticleSystem *system);
168 void updateNodes();
169 void deleteNodes();
170 void markNodesDirty();
171 void updateNodeLayers() override;
172
173 QMap<const QQuick3DParticleEmitter *, PerEmitterData> m_perEmitterData;
174 QVector<SpriteParticleData> m_spriteParticleData;
175 int m_nextEmitterIndex = 0;
176 FeatureLevel m_featureLevel = FeatureLevel::Simple;
177
178private:
179 static QSSGRenderParticles::FeatureLevel mapFeatureLevel(QQuick3DParticleSpriteParticle::FeatureLevel level);
180
181 void updateParticleBuffer(ParticleUpdateNode *updateNode, QSSGRenderGraphObject *node);
182 void updateAnimatedParticleBuffer(ParticleUpdateNode *updateNode, QSSGRenderGraphObject *node);
183 void updateSceneManager(QQuick3DSceneManager *window);
184
185
186 // Call this whenever features which may affect the level change
187 void updateFeatureLevel();
188
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;
197
198 // Lights
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;
206};
207
208QT_END_NAMESPACE
209
210#endif
Combined button and popup list for selecting options.
static QSSGRenderParticles::BlendMode mapBlendMode(QQuick3DParticleSpriteParticle::BlendMode mode)