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