71QQuickCustomAffector::QQuickCustomAffector(QQuickItem *parent) :
72 QQuickParticleAffector(parent)
73 , m_position(&m_nullVector)
74 , m_velocity(&m_nullVector)
75 , m_acceleration(&m_nullVector)
80bool QQuickCustomAffector::isAffectConnected()
83 this, QQuickCustomAffector, affectParticles,
84 (
const QList<QQuickV4ParticleData> &, qreal));
87void QQuickCustomAffector::affectSystem(qreal dt)
90 bool justAffected = (m_acceleration == &m_nullVector
91 && m_velocity == &m_nullVector
92 && m_position == &m_nullVector
93 && isAffectedConnected());
94 if (!isAffectConnected() && !justAffected) {
95 QQuickParticleAffector::affectSystem(dt);
102 QList<QQuickParticleData*> toAffect;
103 for (
const QQuickParticleGroupData *gd : std::as_const(m_system->groupData)) {
104 if (activeGroup(gd->index)) {
105 for (QQuickParticleData *d : gd->data) {
106 if (shouldAffect(d)) {
113 if (toAffect.isEmpty())
117 for (
const QQuickParticleData *d : std::as_const(toAffect)) {
119 m_onceOffed << std::make_pair(d->groupId, d->index);
120 emit affected(d->curX(m_system), d->curY(m_system));
128 QList<QQuickV4ParticleData> particles;
129 particles.reserve(toAffect.size());
130 for (QQuickParticleData *data: std::as_const(toAffect))
131 particles.push_back(data->v4Value(m_system));
133 const auto doAffect = [&](qreal dt) {
134 affectProperties(toAffect, dt);
135 emit affectParticles(particles, dt);
138 if (dt >= simulationCutoff || dt <= simulationDelta) {
141 int realTime = m_system->timeInt;
142 m_system->timeInt -= dt * 1000.0;
143 while (dt > simulationDelta) {
144 m_system->timeInt += simulationDelta * 1000.0;
145 dt -= simulationDelta;
146 doAffect(simulationDelta);
148 m_system->timeInt = realTime;
153 for (QQuickParticleData *d : std::as_const(toAffect))
154 if (d->update == 1.0)
158bool QQuickCustomAffector::affectParticle(QQuickParticleData *d, qreal dt)
161 bool changed =
false;
162 QPointF curPos(d->curX(m_system), d->curY(m_system));
164 if (m_acceleration != &m_nullVector){
165 QPointF pos = m_acceleration->sample(curPos);
166 QPointF curAcc = QPointF(d->curAX(), d->curAY());
172 d->setInstantaneousAX(pos.x(), m_system);
173 d->setInstantaneousAY(pos.y(), m_system);
178 if (m_velocity != &m_nullVector){
179 QPointF pos = m_velocity->sample(curPos);
180 QPointF curVel = QPointF(d->curVX(m_system), d->curVY(m_system));
186 d->setInstantaneousVX(pos.x(), m_system);
187 d->setInstantaneousVY(pos.y(), m_system);
192 if (m_position != &m_nullVector){
193 QPointF pos = m_position->sample(curPos);
199 d->setInstantaneousX(pos.x(), m_system);
200 d->setInstantaneousY(pos.y(), m_system);
208void QQuickCustomAffector::affectProperties(
const QList<QQuickParticleData*> &particles, qreal dt)