68void QQuick3DParticleRepeller::setOuterRadius(
float radius)
70 radius = qMax(0.0f, radius);
71 if (qFuzzyCompare(radius, m_outerRadius))
return;
73 m_outerRadius = radius;
74 Q_EMIT outerRadiusChanged();
77void QQuick3DParticleRepeller::setStrength(
float strength)
79 strength = qMax(0.0f, strength);
80 if (qFuzzyCompare(strength, m_strength))
return;
82 m_strength = strength;
83 Q_EMIT strengthChanged();
98void QQuick3DParticleRepeller::affectParticle(
const QQuick3DParticleData &, QQuick3DParticleDataCurrent *d,
float )
100 QVector3D pos = position();
101 QVector3D dir = d->position - pos;
102 float radius = dir.length();
103 float outerRadius = qMax(m_outerRadius, m_radius);
104 if (radius > outerRadius || qFuzzyIsNull(radius))
107 if (radius < m_radius)
108 d->position += dir * m_strength / radius;
110 d->position += dir * m_strength * (1.0f - qt_smoothstep(m_radius, outerRadius, radius)) / radius;
static float qt_smoothstep(float edge0, float edge1, float x)