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

source code of qtdeclarative/src/particles/qquickparticleemitter_p.h