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
qquick3dparticlesystem_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 QQUICK3DPPARTICLESYSTEM_H
7#define QQUICK3DPPARTICLESYSTEM_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 <QtQuick3DParticles/qtquick3dparticlesglobal.h>
21#include <QtQuick3D/private/qquick3dnode_p.h>
22#include <QtQuick3D/private/qquick3ddefaultmaterial_p.h>
23#include <QtQuick3D/private/qquick3dprincipledmaterial_p.h>
24#include <QtQuick3D/private/qquick3dloader_p.h>
25#include <QtQuick3DParticles/private/qquick3dparticlesystemlogging_p.h>
26#include <QtQuick3DParticles/private/qquick3dparticlerandomizer_p.h>
27#include <QtQuick3DParticles/private/qquick3dparticledata_p.h>
28#include <QElapsedTimer>
29#include <QVector>
30#include <QList>
31#include <QHash>
32#include <QPointer>
33#include <QAbstractAnimation>
34#include <QtQml/qqml.h>
35#include <QElapsedTimer>
36#include <QTimer>
37
39
40class QQuick3DParticleSpriteParticle;
41class QQuick3DParticleModelParticle;
42class QQuick3DParticleModelBlendParticle;
43class QQuick3DParticleEmitter;
44class QQuick3DParticleTrailEmitter;
45class QQuick3DParticleAffector;
46class QQuick3DParticleStatelessAffector;
47
48class QQuick3DParticle;
52
53class Q_QUICK3DPARTICLES_EXPORT QQuick3DParticleSystem : public QQuick3DNode
54{
55 Q_OBJECT
56 Q_PROPERTY(bool running READ isRunning WRITE setRunning NOTIFY runningChanged)
57 Q_PROPERTY(bool paused READ isPaused WRITE setPaused NOTIFY pausedChanged)
58 Q_PROPERTY(int startTime READ startTime WRITE setStartTime NOTIFY startTimeChanged)
59 Q_PROPERTY(int time READ time WRITE setTime NOTIFY timeChanged)
60 Q_PROPERTY(bool useRandomSeed READ useRandomSeed WRITE setUseRandomSeed NOTIFY useRandomSeedChanged)
61 Q_PROPERTY(int seed READ seed WRITE setSeed NOTIFY seedChanged)
62 Q_PROPERTY(bool logging READ logging WRITE setLogging NOTIFY loggingChanged)
63 Q_PROPERTY(QQuick3DParticleSystemLogging *loggingData READ loggingData NOTIFY loggingDataChanged)
64 QML_NAMED_ELEMENT(ParticleSystem3D)
65 QML_ADDED_IN_VERSION(6, 2)
66
67public:
68 QQuick3DParticleSystem(QQuick3DNode *parent = nullptr);
69 ~QQuick3DParticleSystem() override;
70
71 bool isRunning() const;
72 bool isPaused() const;
73 int startTime() const;
74 int time() const;
75 bool useRandomSeed() const;
76 int seed() const;
77 // Return the total amount of particles
78 int particleCount() const;
79 bool logging() const;
80 QQuick3DParticleSystemLogging *loggingData() const;
81
82 // Registering of different components into system
83 void registerParticle(QQuick3DParticle *particle);
84 void unRegisterParticle(QQuick3DParticle *particle);
85 void registerParticleEmitter(QQuick3DParticleEmitter* e);
86 void unRegisterParticleEmitter(QQuick3DParticleEmitter* e);
87 void registerParticleAffector(QQuick3DParticleAffector* a);
88 void unRegisterParticleAffector(QQuick3DParticleAffector* a);
89
90 void updateCurrentTime(int currentTime);
91
92 QPRand *rand();
93 bool isShared(const QQuick3DParticle *particle) const;
94 int currentTime() const;
95
96 struct TrailEmits {
97 QQuick3DParticleTrailEmitter *emitter = nullptr;
98 int amount = 0;
99 };
100
101 Q_INVOKABLE void reset();
102
103public Q_SLOTS:
104 void setRunning(bool running);
105 void setPaused(bool paused);
106 void setStartTime(int startTime);
107 void setTime(int time);
108 void setUseRandomSeed(bool randomize);
109 void setSeed(int seed);
110 void setLogging(bool logging);
111
112 void setEditorTime(int time);
113
114Q_SIGNALS:
115 void runningChanged();
116 void pausedChanged();
117 void timeChanged();
118 void startTimeChanged();
119 void useRandomSeedChanged();
120 void seedChanged();
121 void loggingChanged();
122 void loggingDataChanged();
123
124protected:
125 void componentComplete() override;
126
127private:
128 void registerParticleModel(QQuick3DParticleModelParticle* m);
129 void registerParticleSprite(QQuick3DParticleSpriteParticle* m);
130 void updateLoggingData();
131 void resetLoggingVariables();
132 void doSeedRandomization();
133 void refresh();
134 void markDirty();
135 void processModelParticle(QQuick3DParticleModelParticle *modelParticle, const QVector<TrailEmits> &trailEmits, float timeS);
136 void processSpriteParticle(QQuick3DParticleSpriteParticle *spriteParticle, const QVector<TrailEmits> &trailEmits, float timeS);
137 void processModelBlendParticle(QQuick3DParticleModelBlendParticle *particle, const QVector<TrailEmits> &trailEmits, float timeS);
138 void processParticleCommon(QQuick3DParticleDataCurrent &currentData, const QQuick3DParticleData *d, float particleTimeS);
139 void processParticleFadeInOut(QQuick3DParticleDataCurrent &currentData, const QQuick3DParticle *particle, float particleTimeS, float particleTimeLeftS);
140 void processParticleAlignment(QQuick3DParticleDataCurrent &currentData, const QQuick3DParticle *particle, const QQuick3DParticleData *d);
141 static bool isGloballyDisabled();
142 static bool isEditorModeOn();
143
144private:
145 friend class QQuick3DParticleEmitter;
146 friend class QQuick3DParticleTrailEmitter;
147 friend class QQuick3DParticleSystemUpdate;
148 friend class QQuick3DParticleSystemAnimation;
149 friend class QQuick3DParticleModelBlendParticle;
150
151 bool m_running;
152 bool m_paused;
153 bool m_initialized;
154 bool m_componentComplete;
155 // This animation runs the system, progressing time with pause, continue etc.
156 QQuick3DParticleSystemAnimation *m_animation = nullptr;
157 // This animation handles system dirty updates and runs always.
158 // It makes sure that updates are done in sync with other animations and only once per frame.
159 QQuick3DParticleSystemUpdate *m_updateAnimation = nullptr;
160
161 QList<QQuick3DParticle *> m_particles;
162 QList<QQuick3DParticleEmitter *> m_emitters;
163 QList<QQuick3DParticleTrailEmitter *> m_trailEmitters;
164 QList<QQuick3DParticleAffector *> m_affectors;
165 QMap<QQuick3DParticleAffector *, QMetaObject::Connection> m_connections;
166
167 int m_startTime = 0;
168 // Current time in ms
169 int m_time = 0;
170 int m_currentTime = 0;
171
172 // This overrides the time when editor mode is on
173 int m_editorTime = 0;
174
175 QElapsedTimer m_perfTimer;
176 QTimer m_loggingTimer;
177 qint64 m_timeAnimation = 0;
178 int m_particlesMax = 0;
179 int m_particlesUsed = 0;
180 int m_updates = 0;
181 bool m_useRandomSeed = true;
182 int m_seed = 0;
183 bool m_logging;
184 QQuick3DParticleSystemLogging *m_loggingData = nullptr;
185 QPRand m_rand;
186 int m_particleIdIndex = 0;
187};
188
190{
192public:
196protected:
198 {
199 // Keep the time property up-to-date
202
204 }
205
206 int duration() const override
207 {
208 return -1;
209 }
210
211private:
213};
214
216{
218public:
222
223 void setDirty(bool dirty)
224 {
225 m_dirty = dirty;
226 }
227
228protected:
230 {
231 Q_UNUSED(t);
232 if (m_dirty)
233 m_system->refresh();
234 }
235
236 int duration() const override
237 {
238 return -1;
239 }
240
241private:
243 bool m_dirty = false;
244};
245
246QT_END_NAMESPACE
247
248#endif // QQUICK3DPPARTICLESYSTEM_H
Combined button and popup list for selecting options.