Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qquick3dparticlewander.cpp
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
4#include <QtCore/qmath.h>
8
10
27
38{
39 return m_globalAmount;
40}
41
50{
51 return m_globalPace;
52}
53
72{
73 return m_globalPaceStart;
74}
75
84{
85 return m_uniqueAmount;
86}
87
96{
97 return m_uniquePace;
98}
99
113{
114 return m_uniqueAmountVariation;
115}
116
129{
130 return m_uniquePaceVariation;
131}
132
144{
145 return m_fadeInDuration;
146}
147
159{
160 return m_fadeOutDuration;
161}
162
164{
165 if (m_globalAmount == globalAmount)
166 return;
167
168 m_globalAmount = globalAmount;
170 Q_EMIT update();
171}
172
174{
175 if (m_globalPace == globalPace)
176 return;
177
178 m_globalPace = globalPace;
180 Q_EMIT update();
181}
182
184{
185 if (m_globalPaceStart == globalPaceStart)
186 return;
187
188 m_globalPaceStart = globalPaceStart;
190 Q_EMIT update();
191}
192
194{
195 if (m_uniqueAmount == uniqueAmount)
196 return;
197
198 m_uniqueAmount = uniqueAmount;
200 Q_EMIT update();
201}
202
204{
205 if (m_uniquePace == uniquePace)
206 return;
207
208 m_uniquePace = uniquePace;
210 Q_EMIT update();
211}
212
214{
215 if (qFuzzyCompare(m_uniqueAmountVariation, uniqueAmountVariation))
216 return;
217
218 uniqueAmountVariation = std::max(0.0f, std::min(1.0f, uniqueAmountVariation));
219 m_uniqueAmountVariation = uniqueAmountVariation;
221 Q_EMIT update();
222}
223
225{
226 if (qFuzzyCompare(m_uniquePaceVariation, uniquePaceVariation))
227 return;
228
229 uniquePaceVariation = std::max(0.0f, std::min(1.0f, uniquePaceVariation));
230 m_uniquePaceVariation = uniquePaceVariation;
232 Q_EMIT update();
233}
234
236{
237 if (m_fadeInDuration == fadeInDuration)
238 return;
239
240 m_fadeInDuration = std::max(0, fadeInDuration);
242 Q_EMIT update();
243}
244
246{
247 if (m_fadeOutDuration == fadeOutDuration)
248 return;
249
250 m_fadeOutDuration = std::max(0, fadeOutDuration);
252 Q_EMIT update();
253}
254
256{
257 if (!system())
258 return;
259 auto rand = system()->rand();
260
261 // Optionally smoothen the beginning & end of wander
262 float smooth = 1.0f;
263 if (m_fadeInDuration > 0) {
264 smooth = time / (float(m_fadeInDuration) / 1000.0f);
265 smooth = std::min(1.0f, smooth);
266 }
267 if (m_fadeOutDuration > 0) {
268 float timeLeft = (sd.lifetime - time);
269 float smoothOut = timeLeft / (float(m_fadeOutDuration) / 1000.0f);
270 // When fading both in & out, select smaller (which is always max 1.0)
271 smooth = std::min(smoothOut, smooth);
272 }
273
274 const float pi2 = float(M_PI * 2);
275 // Global
276 if (!qFuzzyIsNull(m_globalAmount.x()) && !qFuzzyIsNull(m_globalPace.x()))
277 d->position.setX(d->position.x() + smooth * QPSIN(m_globalPaceStart.x() + time * pi2 * m_globalPace.x()) * m_globalAmount.x());
278 if (!qFuzzyIsNull(m_globalAmount.y()) && !qFuzzyIsNull(m_globalPace.y()))
279 d->position.setY(d->position.y() + smooth * QPSIN(m_globalPaceStart.y() + time * pi2 * m_globalPace.y()) * m_globalAmount.y());
280 if (!qFuzzyIsNull(m_globalAmount.z()) && !qFuzzyIsNull(m_globalPace.z()))
281 d->position.setZ(d->position.z() + smooth * QPSIN(m_globalPaceStart.z() + time * pi2 * m_globalPace.z()) * m_globalAmount.z());
282
283 // Unique
284 // Rather simple to only use a single sin operation per direction
285 if (!qFuzzyIsNull(m_uniqueAmount.x()) && !qFuzzyIsNull(m_uniquePace.x())) {
286 // Values between 1.0 +/- variation
287 float paceVariation = 1.0f + m_uniquePaceVariation - 2.0f * rand->get(sd.index, QPRand::WanderXPV) * m_uniquePaceVariation;
288 float amountVariation = 1.0f + m_uniqueAmountVariation - 2.0f * rand->get(sd.index, QPRand::WanderXAV) * m_uniqueAmountVariation;
289 float startPace = rand->get(sd.index, QPRand::WanderXPS) * pi2;
290 float pace = startPace + paceVariation * time * pi2 * m_uniquePace.x();
291 float amount = amountVariation * m_uniqueAmount.x();
292 d->position.setX(d->position.x() + smooth * QPSIN(pace) * amount);
293 }
294 if (!qFuzzyIsNull(m_uniqueAmount.y()) && !qFuzzyIsNull(m_uniquePace.y())) {
295 // Values between 1.0 +/- variation
296 float paceVariation = 1.0f + m_uniquePaceVariation - 2.0f * rand->get(sd.index, QPRand::WanderYPV) * m_uniquePaceVariation;
297 float amountVariation = 1.0f + m_uniqueAmountVariation - 2.0f * rand->get(sd.index, QPRand::WanderYAV) * m_uniqueAmountVariation;
298 float startPace = rand->get(sd.index, QPRand::WanderYPS) * pi2;
299 float pace = startPace + paceVariation * time * pi2 * m_uniquePace.y();
300 float amount = amountVariation * m_uniqueAmount.y();
301 d->position.setY(d->position.y() + smooth * QPSIN(pace) * amount);
302 }
303 if (!qFuzzyIsNull(m_uniqueAmount.z()) && !qFuzzyIsNull(m_uniquePace.z())) {
304 // Values between 1.0 +/- variation
305 float paceVariation = 1.0f + m_uniquePaceVariation - 2.0f * rand->get(sd.index, QPRand::WanderZPV) * m_uniquePaceVariation;
306 float amountVariation = 1.0f + m_uniqueAmountVariation - 2.0f * rand->get(sd.index, QPRand::WanderZAV) * m_uniqueAmountVariation;
307 float startPace = rand->get(sd.index, QPRand::WanderZPS) * pi2;
308 float pace = startPace + paceVariation * time * pi2 * m_uniquePace.z();
309 float amount = amountVariation * m_uniqueAmount.z();
310 d->position.setZ(d->position.z() + smooth * QPSIN(pace) * amount);
311 }
312}
313
QQuick3DParticleSystem * system
QQuick3DParticleWander(QQuick3DNode *parent=nullptr)
\qmltype Wander3D \inherits Affector3D \inqmlmodule QtQuick3D.Particles3D
void uniqueAmountVariationChanged()
void setFadeInDuration(int fadeInDuration)
void setUniqueAmountVariation(float uniqueAmountVariation)
void setGlobalAmount(const QVector3D &globalAmount)
void setGlobalPaceStart(const QVector3D &globalPaceStart)
void setGlobalPace(const QVector3D &globalPace)
void affectParticle(const QQuick3DParticleData &sd, QQuick3DParticleDataCurrent *d, float time) override
void setUniquePaceVariation(float uniquePaceVariation)
void setUniqueAmount(const QVector3D &uniqueAmount)
void setFadeOutDuration(int fadeOutDuration)
void setUniquePace(const QVector3D &uniquePace)
The QVector3D class represents a vector or vertex in 3D space.
Definition qvectornd.h:171
constexpr float y() const noexcept
Returns the y coordinate of this point.
Definition qvectornd.h:671
constexpr float x() const noexcept
Returns the x coordinate of this point.
Definition qvectornd.h:670
constexpr float z() const noexcept
Returns the z coordinate of this point.
Definition qvectornd.h:672
Combined button and popup list for selecting options.
bool qFuzzyCompare(qfloat16 p1, qfloat16 p2) noexcept
Definition qfloat16.h:333
bool qFuzzyIsNull(qfloat16 f) noexcept
Definition qfloat16.h:349
#define M_PI
Definition qmath.h:209
#define QPSIN
#define Q_EMIT