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
qquickparticleemitter_p.h
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#ifndef PARTICLEEMITTER_H
5#define PARTICLEEMITTER_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 <QtQuick/QQuickItem>
19#include <QDebug>
23
24#include <QList>
25#include <QPointF>
26
27#include <utility>
28
30
32{
33 Q_OBJECT
34 Q_PROPERTY(QQuickParticleSystem* system READ system WRITE setSystem NOTIFY systemChanged)
35 Q_PROPERTY(QString group READ group WRITE setGroup NOTIFY groupChanged)
36 Q_PROPERTY(QQuickParticleExtruder* shape READ extruder WRITE setExtruder NOTIFY extruderChanged)
37 Q_PROPERTY(bool enabled READ enabled WRITE setEnabled NOTIFY enabledChanged OVERRIDE)
38 Q_PROPERTY(int startTime READ startTime WRITE setStartTime NOTIFY startTimeChanged)
39
40 Q_PROPERTY(qreal emitRate READ particlesPerSecond WRITE setParticlesPerSecond NOTIFY particlesPerSecondChanged)
41 Q_PROPERTY(int lifeSpan READ particleDuration WRITE setParticleDuration NOTIFY particleDurationChanged)
42 Q_PROPERTY(int lifeSpanVariation READ particleDurationVariation WRITE setParticleDurationVariation NOTIFY particleDurationVariationChanged)
43 Q_PROPERTY(int maximumEmitted READ maxParticleCount WRITE setMaxParticleCount NOTIFY maximumEmittedChanged)
44
45 Q_PROPERTY(qreal size READ particleSize WRITE setParticleSize NOTIFY particleSizeChanged)
46 Q_PROPERTY(qreal endSize READ particleEndSize WRITE setParticleEndSize NOTIFY particleEndSizeChanged)
47 Q_PROPERTY(qreal sizeVariation READ particleSizeVariation WRITE setParticleSizeVariation NOTIFY particleSizeVariationChanged)
48
49 Q_PROPERTY(QQuickDirection *velocity READ velocity WRITE setVelocity NOTIFY velocityChanged)
50 Q_PROPERTY(QQuickDirection *acceleration READ acceleration WRITE setAcceleration NOTIFY accelerationChanged)
51 Q_PROPERTY(qreal velocityFromMovement READ velocityFromMovement WRITE setVelocityFromMovement NOTIFY velocityFromMovementChanged)
52 QML_NAMED_ELEMENT(Emitter)
53 QML_ADDED_IN_VERSION(2, 0)
54
55public:
56 explicit QQuickParticleEmitter(QQuickItem *parent = nullptr);
57 virtual ~QQuickParticleEmitter();
58 virtual void emitWindow(int timeStamp);
59
60 enum Lifetime {
61 InfiniteLife = QQuickParticleSystem::maxLife
62 };
63 Q_ENUM(Lifetime)
64
65 bool enabled() const
66 {
67 return m_enabled;
68 }
69
70 qreal particlesPerSecond() const
71 {
72 return m_particlesPerSecond;
73 }
74
75 int particleDuration() const
76 {
77 return m_particleDuration;
78 }
79
80 QQuickParticleSystem* system() const
81 {
82 return m_system;
83 }
84
85 QString group() const
86 {
87 return m_group;
88 }
89
90 QQuickParticleGroupData::ID groupId() const
91 {
92 if (m_groupIdNeedRecalculation)
93 reclaculateGroupId();
94 return m_groupId;
95 }
96
97 int particleDurationVariation() const
98 {
99 return m_particleDurationVariation;
100 }
101
102 qreal velocityFromMovement() const { return m_velocity_from_movement; }
103 void setVelocityFromMovement(qreal s);
104 void componentComplete() override;
105Q_SIGNALS:
106 void emitParticles(const QList<QQuickV4ParticleData> &particles);
107 void particlesPerSecondChanged(qreal);
108 void particleDurationChanged(int);
109 void enabledChanged(bool);
110
111 void systemChanged(QQuickParticleSystem* arg);
112
113 void groupChanged(const QString &arg);
114
115 void particleDurationVariationChanged(int arg);
116
117 void extruderChanged(QQuickParticleExtruder* arg);
118
119 void particleSizeChanged(qreal arg);
120
121 void particleEndSizeChanged(qreal arg);
122
123 void particleSizeVariationChanged(qreal arg);
124
125 void velocityChanged(QQuickDirection * arg);
126
127 void accelerationChanged(QQuickDirection * arg);
128
129 void maximumEmittedChanged(int arg);
130 void particleCountChanged();
131
132 void velocityFromMovementChanged();
133
134 void startTimeChanged(int arg);
135
136public Q_SLOTS:
137 void pulse(int milliseconds);
138 void burst(int num);
139 void burst(int num, qreal x, qreal y);
140
141 void setEnabled(bool arg);
142
143 void setParticlesPerSecond(qreal arg)
144 {
145 if (m_particlesPerSecond != arg) {
146 m_particlesPerSecond = arg;
147 callSystemEmittersChanged();
148 Q_EMIT particlesPerSecondChanged(arg);
149 }
150 }
151
152 void setParticleDuration(int arg)
153 {
154 if (m_particleDuration != arg) {
155 m_particleDuration = arg;
156 callSystemEmittersChanged();
157 Q_EMIT particleDurationChanged(arg);
158 }
159 }
160
161 void setSystem(QQuickParticleSystem* arg)
162 {
163 if (arg == m_system)
164 return;
165
166 if (m_system)
167 m_system->unregisterParticleEmitter(this);
168
169 m_system = arg;
170 m_groupIdNeedRecalculation = true;
171
172 if (m_system) {
173 m_system->registerParticleEmitter(this);
174 if (isComponentComplete())
175 m_system->finishRegisteringParticleEmitter(this);
176 }
177
178 Q_EMIT systemChanged(arg);
179 }
180
181 void setGroup(const QString &arg)
182 {
183 if (m_group != arg) {
184 m_group = arg;
185 m_groupIdNeedRecalculation = true;
186 callSystemEmittersChanged();
187 Q_EMIT groupChanged(arg);
188 }
189 }
190
191 void setParticleDurationVariation(int arg)
192 {
193 if (m_particleDurationVariation != arg) {
194 m_particleDurationVariation = arg;
195 Q_EMIT particleDurationVariationChanged(arg);
196 }
197 }
198 void setExtruder(QQuickParticleExtruder* arg)
199 {
200 if (m_extruder != arg) {
201 m_extruder = arg;
202 Q_EMIT extruderChanged(arg);
203 }
204 }
205
206 void setParticleSize(qreal arg)
207 {
208 if (m_particleSize != arg) {
209 m_particleSize = arg;
210 Q_EMIT particleSizeChanged(arg);
211 }
212 }
213
214 void setParticleEndSize(qreal arg)
215 {
216 if (m_particleEndSize != arg) {
217 m_particleEndSize = arg;
218 Q_EMIT particleEndSizeChanged(arg);
219 }
220 }
221
222 void setParticleSizeVariation(qreal arg)
223 {
224 if (m_particleSizeVariation != arg) {
225 m_particleSizeVariation = arg;
226 Q_EMIT particleSizeVariationChanged(arg);
227 }
228 }
229
230 void setVelocity(QQuickDirection * arg)
231 {
232 if (m_velocity != arg) {
233 m_velocity = arg;
234 Q_EMIT velocityChanged(arg);
235 }
236 }
237
238 void setAcceleration(QQuickDirection * arg)
239 {
240 if (m_acceleration != arg) {
241 m_acceleration = arg;
242 Q_EMIT accelerationChanged(arg);
243 }
244 }
245
246 void setMaxParticleCount(int arg);
247
248 void setStartTime(int arg)
249 {
250 if (m_startTime != arg) {
251 m_startTime = arg;
252 Q_EMIT startTimeChanged(arg);
253 }
254 }
255
256 virtual void reset();
257public:
258 int particleCount() const
259 {
260 if (m_maxParticleCount >= 0)
261 return m_maxParticleCount;
262 return m_particlesPerSecond*((m_particleDuration+m_particleDurationVariation)/1000.0);
263 }
264
265 QQuickParticleExtruder* extruder() const
266 {
267 return m_extruder;
268 }
269
270 qreal particleSize() const
271 {
272 return m_particleSize;
273 }
274
275 qreal particleEndSize() const
276 {
277 return m_particleEndSize;
278 }
279
280 qreal particleSizeVariation() const
281 {
282 return m_particleSizeVariation;
283 }
284
285 QQuickDirection * velocity() const
286 {
287 return m_velocity;
288 }
289
290 QQuickDirection * acceleration() const
291 {
292 return m_acceleration;
293 }
294
295 int maxParticleCount() const
296 {
297 return m_maxParticleCount;
298 }
299
300 int startTime() const
301 {
302 return m_startTime;
303 }
304
305 void reclaculateGroupId() const;
306
307protected:
308 qreal m_particlesPerSecond;
309 int m_particleDuration;
310 int m_particleDurationVariation;
311 bool m_enabled;
312 QQuickParticleSystem* m_system;
313 QQuickParticleExtruder* m_extruder;
314 QQuickParticleExtruder* m_defaultExtruder;
315 QQuickParticleExtruder* effectiveExtruder();
316 QQuickDirection * m_velocity;
317 QQuickDirection * m_acceleration;
318 qreal m_particleSize;
319 qreal m_particleEndSize;
320 qreal m_particleSizeVariation;
321
322 int m_startTime;
323 bool m_overwrite;
324
325 int m_pulseLeft;
326 QList<std::pair<int, QPointF > > m_burstQueue;
327 int m_maxParticleCount;
328
329 //Used in default implementation, but might be useful
330 qreal m_velocity_from_movement;
331
332 int m_emitCap;
333 bool m_reset_last;
334 qreal m_last_timestamp;
335 qreal m_last_emission;
336
337 QPointF m_last_emitter;
338 QPointF m_last_last_emitter;
339
340 bool isEmitConnected();
341
342private: // data
343 void callSystemEmittersChanged();
344
345 QString m_group;
346 mutable bool m_groupIdNeedRecalculation;
347 mutable QQuickParticleGroupData::ID m_groupId;
348 QQuickDirection m_nullVector;
349
350};
351
352QT_END_NAMESPACE
353
354#endif // PARTICLEEMITTER_H
Combined button and popup list for selecting options.
QSet< QQuickParticleData * > data