215void QQuick3DParticleWander::setUniqueAmountVariation(
float uniqueAmountVariation)
217 if (qFuzzyCompare(m_uniqueAmountVariation, uniqueAmountVariation))
220 uniqueAmountVariation = std::max(0.0f, std::min(1.0f, uniqueAmountVariation));
221 m_uniqueAmountVariation = uniqueAmountVariation;
222 Q_EMIT uniqueAmountVariationChanged();
226void QQuick3DParticleWander::setUniquePaceVariation(
float uniquePaceVariation)
228 if (qFuzzyCompare(m_uniquePaceVariation, uniquePaceVariation))
231 uniquePaceVariation = std::max(0.0f, std::min(1.0f, uniquePaceVariation));
232 m_uniquePaceVariation = uniquePaceVariation;
233 Q_EMIT uniquePaceVariationChanged();
257void QQuick3DParticleWander::affectParticle(
const QQuick3DParticleData &sd, QQuick3DParticleDataCurrent *d,
float time)
261 auto rand = system()->rand();
265 if (m_fadeInDuration > 0) {
266 smooth = time / (
float(m_fadeInDuration) / 1000.0f);
267 smooth = std::min(1.0f, smooth);
269 if (m_fadeOutDuration > 0) {
270 float timeLeft = (sd.lifetime - time);
271 float smoothOut = timeLeft / (
float(m_fadeOutDuration) / 1000.0f);
273 smooth = std::min(smoothOut, smooth);
276 const float pi2 =
float(
M_PI * 2);
278 if (!qFuzzyIsNull(m_globalAmount.x()) && !qFuzzyIsNull(m_globalPace.x()))
279 d->position.setX(d->position.x() + smooth *
QPSIN(m_globalPaceStart.x() + time * pi2 * m_globalPace.x()) * m_globalAmount.x());
280 if (!qFuzzyIsNull(m_globalAmount.y()) && !qFuzzyIsNull(m_globalPace.y()))
281 d->position.setY(d->position.y() + smooth *
QPSIN(m_globalPaceStart.y() + time * pi2 * m_globalPace.y()) * m_globalAmount.y());
282 if (!qFuzzyIsNull(m_globalAmount.z()) && !qFuzzyIsNull(m_globalPace.z()))
283 d->position.setZ(d->position.z() + smooth *
QPSIN(m_globalPaceStart.z() + time * pi2 * m_globalPace.z()) * m_globalAmount.z());
287 if (!qFuzzyIsNull(m_uniqueAmount.x()) && !qFuzzyIsNull(m_uniquePace.x())) {
289 float paceVariation = 1.0f + m_uniquePaceVariation - 2.0f * rand->get(sd.index, QPRand::WanderXPV) * m_uniquePaceVariation;
290 float amountVariation = 1.0f + m_uniqueAmountVariation - 2.0f * rand->get(sd.index, QPRand::WanderXAV) * m_uniqueAmountVariation;
291 float startPace = rand->get(sd.index, QPRand::WanderXPS) * pi2;
292 float pace = startPace + paceVariation * time * pi2 * m_uniquePace.x();
293 float amount = amountVariation * m_uniqueAmount.x();
294 d->position.setX(d->position.x() + smooth *
QPSIN(pace) * amount);
296 if (!qFuzzyIsNull(m_uniqueAmount.y()) && !qFuzzyIsNull(m_uniquePace.y())) {
298 float paceVariation = 1.0f + m_uniquePaceVariation - 2.0f * rand->get(sd.index, QPRand::WanderYPV) * m_uniquePaceVariation;
299 float amountVariation = 1.0f + m_uniqueAmountVariation - 2.0f * rand->get(sd.index, QPRand::WanderYAV) * m_uniqueAmountVariation;
300 float startPace = rand->get(sd.index, QPRand::WanderYPS) * pi2;
301 float pace = startPace + paceVariation * time * pi2 * m_uniquePace.y();
302 float amount = amountVariation * m_uniqueAmount.y();
303 d->position.setY(d->position.y() + smooth *
QPSIN(pace) * amount);
305 if (!qFuzzyIsNull(m_uniqueAmount.z()) && !qFuzzyIsNull(m_uniquePace.z())) {
307 float paceVariation = 1.0f + m_uniquePaceVariation - 2.0f * rand->get(sd.index, QPRand::WanderZPV) * m_uniquePaceVariation;
308 float amountVariation = 1.0f + m_uniqueAmountVariation - 2.0f * rand->get(sd.index, QPRand::WanderZAV) * m_uniqueAmountVariation;
309 float startPace = rand->get(sd.index, QPRand::WanderZPS) * pi2;
310 float pace = startPace + paceVariation * time * pi2 * m_uniquePace.z();
311 float amount = amountVariation * m_uniqueAmount.z();
312 d->position.setZ(d->position.z() + smooth *
QPSIN(pace) * amount);