213void QQuick3DParticleWander::setUniqueAmountVariation(
float uniqueAmountVariation)
215 if (qFuzzyCompare(m_uniqueAmountVariation, uniqueAmountVariation))
218 uniqueAmountVariation = std::max(0.0f, std::min(1.0f, uniqueAmountVariation));
219 m_uniqueAmountVariation = uniqueAmountVariation;
220 Q_EMIT uniqueAmountVariationChanged();
224void QQuick3DParticleWander::setUniquePaceVariation(
float uniquePaceVariation)
226 if (qFuzzyCompare(m_uniquePaceVariation, uniquePaceVariation))
229 uniquePaceVariation = std::max(0.0f, std::min(1.0f, uniquePaceVariation));
230 m_uniquePaceVariation = uniquePaceVariation;
231 Q_EMIT uniquePaceVariationChanged();
255void QQuick3DParticleWander::affectParticle(
const QQuick3DParticleData &sd, QQuick3DParticleDataCurrent *d,
float time)
259 auto rand = system()->rand();
263 if (m_fadeInDuration > 0) {
264 smooth = time / (
float(m_fadeInDuration) / 1000.0f);
265 smooth = std::min(1.0f, smooth);
267 if (m_fadeOutDuration > 0) {
268 float timeLeft = (sd.lifetime - time);
269 float smoothOut = timeLeft / (
float(m_fadeOutDuration) / 1000.0f);
271 smooth = std::min(smoothOut, smooth);
274 const float pi2 =
float(
M_PI * 2);
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());
285 if (!qFuzzyIsNull(m_uniqueAmount.x()) && !qFuzzyIsNull(m_uniquePace.x())) {
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);
294 if (!qFuzzyIsNull(m_uniqueAmount.y()) && !qFuzzyIsNull(m_uniquePace.y())) {
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);
303 if (!qFuzzyIsNull(m_uniqueAmount.z()) && !qFuzzyIsNull(m_uniquePace.z())) {
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);