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)
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 Q_EMIT particlesPerSecondChanged(arg);
148 }
149 }
150
151 void setParticleDuration(int arg)
152 {
153 if (m_particleDuration != arg) {
154 m_particleDuration = arg;
155 Q_EMIT particleDurationChanged(arg);
156 }
157 }
158
159 void setSystem(QQuickParticleSystem* arg)
160 {
161 if (m_system != arg) {
162 m_system = arg;
163 m_groupIdNeedRecalculation = true;
164 if (m_system)
165 m_system->registerParticleEmitter(this);
166 Q_EMIT systemChanged(arg);
167 }
168 }
169
170 void setGroup(const QString &arg)
171 {
172 if (m_group != arg) {
173 m_group = arg;
174 m_groupIdNeedRecalculation = true;
175 Q_EMIT groupChanged(arg);
176 }
177 }
178
179 void setParticleDurationVariation(int arg)
180 {
181 if (m_particleDurationVariation != arg) {
182 m_particleDurationVariation = arg;
183 Q_EMIT particleDurationVariationChanged(arg);
184 }
185 }
186 void setExtruder(QQuickParticleExtruder* arg)
187 {
188 if (m_extruder != arg) {
189 m_extruder = arg;
190 Q_EMIT extruderChanged(arg);
191 }
192 }
193
194 void setParticleSize(qreal arg)
195 {
196 if (m_particleSize != arg) {
197 m_particleSize = arg;
198 Q_EMIT particleSizeChanged(arg);
199 }
200 }
201
202 void setParticleEndSize(qreal arg)
203 {
204 if (m_particleEndSize != arg) {
205 m_particleEndSize = arg;
206 Q_EMIT particleEndSizeChanged(arg);
207 }
208 }
209
210 void setParticleSizeVariation(qreal arg)
211 {
212 if (m_particleSizeVariation != arg) {
213 m_particleSizeVariation = arg;
214 Q_EMIT particleSizeVariationChanged(arg);
215 }
216 }
217
218 void setVelocity(QQuickDirection * arg)
219 {
220 if (m_velocity != arg) {
221 m_velocity = arg;
222 Q_EMIT velocityChanged(arg);
223 }
224 }
225
226 void setAcceleration(QQuickDirection * arg)
227 {
228 if (m_acceleration != arg) {
229 m_acceleration = arg;
230 Q_EMIT accelerationChanged(arg);
231 }
232 }
233
234 void setMaxParticleCount(int arg);
235
236 void setStartTime(int arg)
237 {
238 if (m_startTime != arg) {
239 m_startTime = arg;
240 Q_EMIT startTimeChanged(arg);
241 }
242 }
243
244 virtual void reset();
245public:
246 int particleCount() const
247 {
248 if (m_maxParticleCount >= 0)
249 return m_maxParticleCount;
250 return m_particlesPerSecond*((m_particleDuration+m_particleDurationVariation)/1000.0);
251 }
252
253 QQuickParticleExtruder* extruder() const
254 {
255 return m_extruder;
256 }
257
258 qreal particleSize() const
259 {
260 return m_particleSize;
261 }
262
263 qreal particleEndSize() const
264 {
265 return m_particleEndSize;
266 }
267
268 qreal particleSizeVariation() const
269 {
270 return m_particleSizeVariation;
271 }
272
273 QQuickDirection * velocity() const
274 {
275 return m_velocity;
276 }
277
278 QQuickDirection * acceleration() const
279 {
280 return m_acceleration;
281 }
282
283 int maxParticleCount() const
284 {
285 return m_maxParticleCount;
286 }
287
288 int startTime() const
289 {
290 return m_startTime;
291 }
292
293 void reclaculateGroupId() const;
294
295protected:
296 qreal m_particlesPerSecond;
297 int m_particleDuration;
298 int m_particleDurationVariation;
299 bool m_enabled;
300 QQuickParticleSystem* m_system;
301 QQuickParticleExtruder* m_extruder;
302 QQuickParticleExtruder* m_defaultExtruder;
303 QQuickParticleExtruder* effectiveExtruder();
304 QQuickDirection * m_velocity;
305 QQuickDirection * m_acceleration;
306 qreal m_particleSize;
307 qreal m_particleEndSize;
308 qreal m_particleSizeVariation;
309
310 int m_startTime;
311 bool m_overwrite;
312
313 int m_pulseLeft;
314 QList<std::pair<int, QPointF > > m_burstQueue;
315 int m_maxParticleCount;
316
317 //Used in default implementation, but might be useful
318 qreal m_velocity_from_movement;
319
320 int m_emitCap;
321 bool m_reset_last;
322 qreal m_last_timestamp;
323 qreal m_last_emission;
324
325 QPointF m_last_emitter;
326 QPointF m_last_last_emitter;
327
328 bool isEmitConnected();
329
330private: // data
331 QString m_group;
332 mutable bool m_groupIdNeedRecalculation;
333 mutable QQuickParticleGroupData::ID m_groupId;
334 QQuickDirection m_nullVector;
335
336};
337
338QT_END_NAMESPACE
339
340#endif // PARTICLEEMITTER_H
QSet< QQuickParticleData * > data