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 updateLoggingData();
129 void resetLoggingVariables();
130 void doSeedRandomization();
131 void refresh();
132 void markDirty();
133 void processModelParticle(QQuick3DParticleModelParticle *modelParticle, const QVector<TrailEmits> &trailEmits, float timeS);
134 void processSpriteParticle(QQuick3DParticleSpriteParticle *spriteParticle, const QVector<TrailEmits> &trailEmits, float timeS);
135 void processModelBlendParticle(QQuick3DParticleModelBlendParticle *particle, const QVector<TrailEmits> &trailEmits, float timeS);
136 void processParticleCommon(QQuick3DParticleDataCurrent &currentData, const QQuick3DParticleData *d, float particleTimeS);
137 void processParticleFadeInOut(QQuick3DParticleDataCurrent &currentData, const QQuick3DParticle *particle, float particleTimeS, float particleTimeLeftS);
138 void processParticleAlignment(QQuick3DParticleDataCurrent &currentData, const QQuick3DParticle *particle, const QQuick3DParticleData *d);
139 static bool isGloballyDisabled();
140 static bool isEditorModeOn();
141
142private:
143 friend class QQuick3DParticleEmitter;
144 friend class QQuick3DParticleTrailEmitter;
145 friend class QQuick3DParticleSystemUpdate;
146 friend class QQuick3DParticleSystemAnimation;
147 friend class QQuick3DParticleModelBlendParticle;
148
149 bool m_running;
150 bool m_paused;
151 bool m_initialized;
152 bool m_componentComplete;
153 // This animation runs the system, progressing time with pause, continue etc.
154 QQuick3DParticleSystemAnimation *m_animation = nullptr;
155 // This animation handles system dirty updates and runs always.
156 // It makes sure that updates are done in sync with other animations and only once per frame.
157 QQuick3DParticleSystemUpdate *m_updateAnimation = nullptr;
158
159 QList<QQuick3DParticle *> m_particles;
160 QList<QQuick3DParticleEmitter *> m_emitters;
161 QList<QQuick3DParticleTrailEmitter *> m_trailEmitters;
162 QList<QQuick3DParticleAffector *> m_affectors;
163 QMap<QQuick3DParticleAffector *, QMetaObject::Connection> m_connections;
164
165 int m_startTime = 0;
166 // Current time in ms
167 int m_time = 0;
168 int m_currentTime = 0;
169
170 // This overrides the time when editor mode is on
171 int m_editorTime = 0;
172
173 QElapsedTimer m_perfTimer;
174 QTimer m_loggingTimer;
175 qint64 m_timeAnimation = 0;
176 int m_particlesMax = 0;
177 int m_particlesUsed = 0;
178 int m_updates = 0;
179 bool m_useRandomSeed = true;
180 int m_seed = 0;
181 bool m_logging;
182 QQuick3DParticleSystemLogging *m_loggingData = nullptr;
183 QPRand m_rand;
184 int m_particleIdIndex = 0;
185};
186
188{
190public:
194protected:
196 {
197 // Keep the time property up-to-date
200
202 }
203
204 int duration() const override
205 {
206 return -1;
207 }
208
209private:
211};
212
214{
216public:
220
221 void setDirty(bool dirty)
222 {
223 m_dirty = dirty;
224 }
225
226protected:
228 {
229 Q_UNUSED(t);
230 if (m_dirty)
231 m_system->refresh();
232 }
233
234 int duration() const override
235 {
236 return -1;
237 }
238
239private:
241 bool m_dirty = false;
242};
243
244QT_END_NAMESPACE
245
246#endif // QQUICK3DPPARTICLESYSTEM_H
Combined button and popup list for selecting options.