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
32
34{
35 Q_OBJECT
36 Q_PROPERTY(BlendMode blendMode READ blendMode WRITE setBlendMode NOTIFY blendModeChanged)
37 Q_PROPERTY(QQuick3DTexture *sprite READ sprite WRITE setSprite NOTIFY spriteChanged)
38 Q_PROPERTY(QQuick3DParticleSpriteSequence *spriteSequence READ spriteSequence WRITE setSpriteSequence NOTIFY spriteSequenceChanged)
39 Q_PROPERTY(bool billboard READ billboard WRITE setBillboard NOTIFY billboardChanged)
40 Q_PROPERTY(float particleScale READ particleScale WRITE setParticleScale NOTIFY particleScaleChanged)
41 Q_PROPERTY(QQuick3DTexture *colorTable READ colorTable WRITE setColorTable NOTIFY colorTableChanged)
42 Q_PROPERTY(QQmlListProperty<QQuick3DAbstractLight> lights READ lights NOTIFY lightsChanged REVISION(6, 3))
43 Q_PROPERTY(float offsetX READ offsetX WRITE setOffsetX NOTIFY offsetXChanged REVISION(6, 3))
44 Q_PROPERTY(float offsetY READ offsetY WRITE setOffsetY NOTIFY offsetYChanged REVISION(6, 3))
45 Q_PROPERTY(bool castsReflections READ castsReflections WRITE setCastsReflections NOTIFY castsReflectionsChanged REVISION(6, 4))
46 QML_NAMED_ELEMENT(SpriteParticle3D)
47 QML_ADDED_IN_VERSION(6, 2)
48
49public:
50 enum BlendMode { SourceOver = 0, Screen, Multiply };
51 Q_ENUM(BlendMode)
52
53 QQuick3DParticleSpriteParticle(QQuick3DNode *parent = nullptr);
54 ~QQuick3DParticleSpriteParticle() override;
55
56 BlendMode blendMode() const;
57 QQuick3DTexture *sprite() const;
58 QQuick3DParticleSpriteSequence *spriteSequence() const;
59 bool billboard() const;
60 float particleScale() const;
61 QQuick3DTexture *colorTable() const;
62 Q_REVISION(6, 3) QQmlListProperty<QQuick3DAbstractLight> lights();
63 float offsetX() const;
64 float offsetY() const;
65 Q_REVISION(6, 4) bool castsReflections() const;
66
67public Q_SLOTS:
68 void setBlendMode(QQuick3DParticleSpriteParticle::BlendMode blendMode);
69 void setSprite(QQuick3DTexture *sprite);
70 void setSpriteSequence(QQuick3DParticleSpriteSequence *spriteSequence);
71 void setBillboard(bool billboard);
72 void setParticleScale(float scale);
73 void setColorTable(QQuick3DTexture *colorTable);
74 void setOffsetX(float value);
75 void setOffsetY(float value);
76 Q_REVISION(6, 4) void setCastsReflections(bool castsReflections);
77
78Q_SIGNALS:
79 void blendModeChanged();
80 void spriteChanged();
81 void spriteSequenceChanged();
82 void billboardChanged();
83 void particleScaleChanged();
84 void colorTableChanged();
85 Q_REVISION(6, 3) void lightsChanged();
86 Q_REVISION(6, 3) void offsetXChanged();
87 Q_REVISION(6, 3) void offsetYChanged();
88 Q_REVISION(6, 4) void castsReflectionsChanged();
89
90protected:
91 void itemChange(ItemChange, const ItemChangeData &) override;
92 void reset() override;
93 void componentComplete() override;
94 int nextCurrentIndex(const QQuick3DParticleEmitter *emitter) override;
95 virtual void setParticleData(int particleIndex,
96 const QVector3D &position,
97 const QVector3D &rotation,
98 const QVector4D &color,
99 float size, float age,
100 float animationFrame);
101 virtual void resetParticleData(int particleIndex);
102 virtual void commitParticles(float);
103 void setDepthBias(float bias) override
104 {
105 QQuick3DParticle::setDepthBias(bias);
106 markNodesDirty();
107 }
108
109private Q_SLOTS:
110 void onLightDestroyed(QObject *object);
111
112public:
113 friend class QQuick3DParticleSystem;
114 friend class QQuick3DParticleEmitter;
115 friend class QQuick3DParticleSpriteSequence;
116
117 enum FeatureLevel
118 {
119 Simple = 0,
120 Mapped,
121 Animated,
122 SimpleVLight,
123 MappedVLight,
124 AnimatedVLight
125 };
126
127 struct SpriteParticleData
128 {
129 QVector3D position;
130 QVector3D rotation;
131 QVector4D color;
132 float size = 0.0f;
133 float age = 0.0f;
134 float animationFrame = -1.0f;
135 int emitterIndex = -1;
136 };
137
138 class ParticleUpdateNode : public QQuick3DNode
139 {
140 public:
141 ParticleUpdateNode(QQuick3DNode *parent = nullptr)
142 : QQuick3DNode(parent)
143 {
144 }
145 QSSGRenderGraphObject *updateSpatialNode(QSSGRenderGraphObject *node) override;
146 QQuick3DParticleSpriteParticle *m_particle = nullptr;
147 bool m_nodeDirty = true;
148 };
149 friend class ParticleUpdateNode;
150
151 struct PerEmitterData
152 {
153 ParticleUpdateNode *particleUpdateNode = nullptr;
154 int particleCount = 0;
155 int emitterIndex = -1;
156 const QQuick3DParticleEmitter *emitter = nullptr;
157 };
158
159 PerEmitterData &perEmitterData(const QQuick3DNode *updateNode);
160 PerEmitterData &perEmitterData(int emitterIndex);
161 QSSGRenderGraphObject *updateParticleNode(const ParticleUpdateNode *updateNode, QSSGRenderGraphObject *node);
162
163protected:
164 virtual void handleMaxAmountChanged(int amount);
165 virtual void handleSystemChanged(QQuick3DParticleSystem *system);
166 void updateNodes();
167 void deleteNodes();
168 void markNodesDirty();
169
170 QMap<const QQuick3DParticleEmitter *, PerEmitterData> m_perEmitterData;
171 QVector<SpriteParticleData> m_spriteParticleData;
172 int m_nextEmitterIndex = 0;
173 FeatureLevel m_featureLevel = FeatureLevel::Simple;
174
175private:
176 static QSSGRenderParticles::FeatureLevel mapFeatureLevel(QQuick3DParticleSpriteParticle::FeatureLevel level);
177
178 void updateParticleBuffer(ParticleUpdateNode *updateNode, QSSGRenderGraphObject *node);
179 void updateAnimatedParticleBuffer(ParticleUpdateNode *updateNode, QSSGRenderGraphObject *node);
180 void updateSceneManager(QQuick3DSceneManager *window);
181
182
183 // Call this whenever features which may affect the level change
184 void updateFeatureLevel();
185
186 QHash<QByteArray, QMetaObject::Connection> m_connections;
187 PerEmitterData n_noPerEmitterData;
188 BlendMode m_blendMode = SourceOver;
189 QQuick3DTexture *m_sprite = nullptr;
190 QQuick3DTexture *m_colorTable = nullptr;
191 float m_particleScale = 5.0f;
192 bool m_billboard = false;
193 bool m_useAnimatedParticle = false;
194
195 // Lights
196 Q_REVISION(6, 3) static void qmlAppendLight(QQmlListProperty<QQuick3DAbstractLight> *list, QQuick3DAbstractLight *light);
197 Q_REVISION(6, 3) static QQuick3DAbstractLight *qmlLightAt(QQmlListProperty<QQuick3DAbstractLight> *list, qsizetype index);
198 Q_REVISION(6, 3) static qsizetype qmlLightsCount(QQmlListProperty<QQuick3DAbstractLight> *list);
199 Q_REVISION(6, 3) static void qmlClearLights(QQmlListProperty<QQuick3DAbstractLight> *list);
200 QVector<QQuick3DAbstractLight *> m_lights;
201 QVector3D m_offset = {};
202 bool m_castsReflections = true;
203};
204
205QT_END_NAMESPACE
206
207#endif
Combined button and popup list for selecting options.
static QSSGRenderParticles::BlendMode mapBlendMode(QQuick3DParticleSpriteParticle::BlendMode mode)