66void QQuick3DParticleRepeller::setOuterRadius(
float radius)
68 radius = qMax(0.0f, radius);
69 if (qFuzzyCompare(radius, m_outerRadius))
return;
71 m_outerRadius = radius;
72 Q_EMIT outerRadiusChanged();
75void QQuick3DParticleRepeller::setStrength(
float strength)
77 strength = qMax(0.0f, strength);
78 if (qFuzzyCompare(strength, m_strength))
return;
80 m_strength = strength;
81 Q_EMIT strengthChanged();
96void QQuick3DParticleRepeller::affectParticle(
const QQuick3DParticleData &, QQuick3DParticleDataCurrent *d,
float )
98 QVector3D pos = position();
99 QVector3D dir = d->position - pos;
100 float radius = dir.length();
101 float outerRadius = qMax(m_outerRadius, m_radius);
102 if (radius > outerRadius || qFuzzyIsNull(radius))
105 if (radius < m_radius)
106 d->position += dir * m_strength / radius;
108 d->position += dir * m_strength * (1.0f - qt_smoothstep(m_radius, outerRadius, radius)) / radius;
static float qt_smoothstep(float edge0, float edge1, float x)