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
qquick3dparticleemitter_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 QQUICK3DPARTICLEEMITTER_H
7#define QQUICK3DPARTICLEEMITTER_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 <QtQuick3D/private/qquick3dnode_p.h>
21#include <QtQuick3DParticles/private/qquick3dparticledirection_p.h>
22#include <QtQuick3DParticles/private/qquick3dparticlesystem_p.h>
23#include <QtQuick3DParticles/private/qquick3dparticlemodelparticle_p.h>
24#include <QtQuick3DParticles/private/qquick3dparticleabstractshape_p.h>
25#include <QtQuick3DParticles/private/qquick3dparticleemitburst_p.h>
26#include <QtQuick3DParticles/private/qquick3dparticledynamicburst_p.h>
27
29
30class QQuaternion;
31
32class Q_QUICK3DPARTICLES_EXPORT QQuick3DParticleEmitter : public QQuick3DNode
33{
34 Q_OBJECT
35 Q_PROPERTY(QQuick3DParticleSystem *system READ system WRITE setSystem NOTIFY systemChanged)
36 Q_PROPERTY(QQmlListProperty<QQuick3DParticleEmitBurst> emitBursts READ emitBursts)
37 Q_PROPERTY(QQuick3DParticleDirection *velocity READ velocity WRITE setVelocity NOTIFY velocityChanged)
38 Q_PROPERTY(QQuick3DParticle *particle READ particle WRITE setParticle NOTIFY particleChanged)
39 Q_PROPERTY(bool enabled READ enabled WRITE setEnabled NOTIFY enabledChanged)
40 Q_PROPERTY(QQuick3DParticleAbstractShape *shape READ shape WRITE setShape NOTIFY shapeChanged)
41 Q_PROPERTY(float emitRate READ emitRate WRITE setEmitRate NOTIFY emitRateChanged)
42 Q_PROPERTY(int lifeSpan READ lifeSpan WRITE setLifeSpan NOTIFY lifeSpanChanged)
43 Q_PROPERTY(int lifeSpanVariation READ lifeSpanVariation WRITE setLifeSpanVariation NOTIFY lifeSpanVariationChanged)
44 Q_PROPERTY(float particleScale READ particleScale WRITE setParticleScale NOTIFY particleScaleChanged)
45 Q_PROPERTY(float particleEndScale READ particleEndScale WRITE setParticleEndScale NOTIFY particleEndScaleChanged)
46 Q_PROPERTY(float particleScaleVariation READ particleScaleVariation WRITE setParticleScaleVariation NOTIFY particleScaleVariationChanged)
47 Q_PROPERTY(float particleEndScaleVariation READ particleEndScaleVariation WRITE setParticleEndScaleVariation NOTIFY particleEndScaleVariationChanged)
48 Q_PROPERTY(QVector3D particleRotation READ particleRotation WRITE setParticleRotation NOTIFY particleRotationChanged)
49 Q_PROPERTY(QVector3D particleRotationVariation READ particleRotationVariation WRITE setParticleRotationVariation NOTIFY particleRotationVariationChanged)
50 Q_PROPERTY(QVector3D particleRotationVelocity READ particleRotationVelocity WRITE setParticleRotationVelocity NOTIFY particleRotationVelocityChanged)
51 Q_PROPERTY(QVector3D particleRotationVelocityVariation READ particleRotationVelocityVariation WRITE setParticleRotationVelocityVariation NOTIFY particleRotationVariationVelocityChanged)
52 Q_PROPERTY(float depthBias READ depthBias WRITE setDepthBias NOTIFY depthBiasChanged)
53 Q_PROPERTY(bool reversed READ reversed WRITE setReversed NOTIFY reversedChanged REVISION(6, 10))
54
55 Q_PROPERTY(EmitMode emitMode READ emitMode WRITE setEmitMode NOTIFY emitModeChanged REVISION(6, 10))
56 QML_NAMED_ELEMENT(ParticleEmitter3D)
57 QML_ADDED_IN_VERSION(6, 2)
58
59public:
60
61 enum EmitMode { Default = 0, SurfaceNormal, SurfaceReflected };
62 Q_ENUM(EmitMode)
63
64 QQuick3DParticleEmitter(QQuick3DNode *parent = nullptr);
65 ~QQuick3DParticleEmitter() override;
66
67 bool enabled() const;
68 QQuick3DParticleDirection *velocity() const;
69 QQuick3DParticleSystem *system() const;
70 float emitRate() const;
71 float particleScale() const;
72 float particleEndScale() const;
73 float particleScaleVariation() const;
74 float particleEndScaleVariation() const;
75 int lifeSpan() const;
76 int lifeSpanVariation() const;
77 QQuick3DParticle *particle() const;
78 QQuick3DParticleAbstractShape *shape() const;
79 QVector3D particleRotation() const;
80 QVector3D particleRotationVariation() const;
81 QVector3D particleRotationVelocity() const;
82 QVector3D particleRotationVelocityVariation() const;
83 float depthBias() const;
84 Q_REVISION(6, 10) bool reversed() const;
85
86 Q_REVISION(6, 10) EmitMode emitMode() const;
87 QQmlListProperty<QQuick3DParticleEmitBurst> emitBursts();
88
89 Q_INVOKABLE virtual void burst(int count);
90 Q_INVOKABLE virtual void burst(int count, int duration);
91 Q_INVOKABLE virtual void burst(int count, int duration, const QVector3D &position);
92
93public Q_SLOTS:
94 void setEnabled(bool enabled);
95 void setVelocity(QQuick3DParticleDirection *velocity);
96 void setSystem(QQuick3DParticleSystem *system);
97 void setEmitRate(float emitRate);
98 void setParticleScale(float particleScale);
99 void setParticleEndScale(float particleEndScale);
100 void setParticleScaleVariation(float particleScaleVariation);
101 void setParticleEndScaleVariation(float particleEndScaleVariation);
102 void setLifeSpan(int lifeSpan);
103 void setLifeSpanVariation(int lifeSpanVariation);
104 void setParticle(QQuick3DParticle *particle);
105 void setShape(QQuick3DParticleAbstractShape *shape);
106 void setParticleRotation(const QVector3D &particleRotation);
107 void setParticleRotationVariation(const QVector3D &particleRotationVariation);
108 void setParticleRotationVelocity(const QVector3D &particleRotationVelocity);
109 void setParticleRotationVelocityVariation(const QVector3D &particleRotationVelocityVariation);
110 void setDepthBias(float bias);
111 Q_REVISION(6, 10) void setReversed(bool reversed);
112
113 Q_REVISION(6, 10) void setEmitMode(EmitMode mode);
114Q_SIGNALS:
115 void velocityChanged();
116 void systemChanged();
117 void emitRateChanged();
118 void particleScaleChanged();
119 void particleEndScaleChanged();
120 void particleScaleVariationChanged();
121 void particleEndScaleVariationChanged();
122 void lifeSpanChanged();
123 void lifeSpanVariationChanged();
124 void particleChanged();
125 void shapeChanged();
126 void particleRotationChanged();
127 void particleRotationVariationChanged();
128 void particleRotationVelocityChanged();
129 void particleRotationVariationVelocityChanged();
130 void enabledChanged();
131 void depthBiasChanged();
132 Q_REVISION(6, 10) void reversedChanged();
133 Q_REVISION(6, 10) void emitModeChanged();
134
135protected:
136 friend class QQuick3DParticleSystem;
137 friend class QQuick3DParticleEmitBurst;
138 friend class QQuick3DParticleTrailEmitter;
139
140 void componentComplete() override;
141 void registerEmitBurst(QQuick3DParticleEmitBurst *emitBurst);
142 void unRegisterEmitBurst(QQuick3DParticleEmitBurst *emitBurst);
143 void generateEmitBursts();
144 void emitParticle(QQuick3DParticle *particle, float startTime, const QMatrix4x4 &transform, const QQuaternion &parentRotation, const QVector3D &centerPos, int index = -1,
145 const QVector3D &velocity = QVector3D(), const QVector3D &normal = QVector3D());
146 void emitParticles();
147 void emitActivationNodeParticles(QQuick3DParticleModelBlendParticle *particle);
148 void emitParticlesBurst(const QQuick3DParticleEmitBurstData &burst);
149 int getEmitAmount();
150 int getEmitAmountFromDynamicBursts(int triggerType = 0);
151
152 void reset();
153
154 // EmitBursts - list handling
155 void appendEmitBurst(QQuick3DParticleEmitBurst *);
156 qsizetype emitBurstCount() const;
157 QQuick3DParticleEmitBurst *emitBurst(qsizetype) const;
158 void clearEmitBursts();
159 void replaceEmitBurst(qsizetype, QQuick3DParticleEmitBurst *);
160 void removeLastEmitBurst();
161
162 // EmitBursts - static
163 static void appendEmitBurst(QQmlListProperty<QQuick3DParticleEmitBurst> *, QQuick3DParticleEmitBurst *);
164 static qsizetype emitBurstCount(QQmlListProperty<QQuick3DParticleEmitBurst> *);
165 static QQuick3DParticleEmitBurst *emitBurst(QQmlListProperty<QQuick3DParticleEmitBurst> *, qsizetype);
166 static void clearEmitBursts(QQmlListProperty<QQuick3DParticleEmitBurst> *);
167 static void replaceEmitBurst(QQmlListProperty<QQuick3DParticleEmitBurst> *, qsizetype, QQuick3DParticleEmitBurst *);
168 static void removeLastEmitBurst(QQmlListProperty<QQuick3DParticleEmitBurst> *);
169
170private:
171 struct BurstEmitData
172 {
173 int startTime;
174 int endTime;
175 int emitAmount;
176 int emitCounter = 0;
177 int prevBurstTime;
178 };
179 QQuick3DParticleDirection *m_velocity = nullptr;
180 QQuick3DParticleSystem *m_system = nullptr;
181 float m_emitRate = 0.0f;
182 // Time in ms when emitting last time happened
183 int m_prevEmitTime = 0;
184 // Time in ms when dynamic burst last time happened
185 int m_prevBurstTime = 0;
186 float m_particleScale = 1.0f;
187 float m_particleEndScale = -1.0f;
188 float m_particleScaleVariation = 0.0f;
189 float m_particleEndScaleVariation = -1.0f;
190 int m_lifeSpan = 1000;
191 int m_lifeSpanVariation = 0;
192 float m_unemittedF = 0.0f;
193 float m_depthBias = 0.0f;
194 QQuick3DParticle *m_particle = nullptr;
195 QQuick3DParticleAbstractShape *m_shape = nullptr;
196 QVector3D m_particleRotation;
197 QVector3D m_particleRotationVariation;
198 QVector3D m_particleRotationVelocity;
199 QVector3D m_particleRotationVelocityVariation;
200 bool m_enabled = true;
201 const QQuick3DParticleData m_clearData = {};
202 bool m_burstGenerated = false;
203 QQuick3DNode *m_systemSharedParent = nullptr;
204 // This list contains all emit bursts (both QQuick3DParticleEmitBurst and QQuick3DParticleDynamicBurst)
205 QList<QQuick3DParticleEmitBurst *> m_emitBursts;
206 QList<BurstEmitData> m_burstEmitData;
207 bool m_reversed = false;
208 EmitMode m_emitMode = EmitMode::Default;
209};
210
211QT_END_NAMESPACE
212
213#endif // QQUICK3DPARTICLEEMITTER_H
Combined button and popup list for selecting options.