1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#include "qquickgroupgoal_p.h"
5#include <private/qquickspriteengine_p.h>
6#include <private/qquicksprite_p.h>
7#include "qquickimageparticle_p.h"
8#include <QDebug>
9
10QT_BEGIN_NAMESPACE
11
12/*!
13 \qmltype GroupGoal
14 \instantiates QQuickGroupGoalAffector
15 \inqmlmodule QtQuick.Particles
16 \ingroup qtquick-particles
17 \inherits Affector
18 \brief For changing the state of a group of a particle.
19
20*/
21/*!
22 \qmlproperty string QtQuick.Particles::GroupGoal::goalState
23
24 The name of the group which the affected particles should move to.
25
26 Groups can have defined durations and transitions between them, setting goalState
27 will cause it to disregard any path weightings (including 0) and head down the path
28 which will reach the goalState quickest. It will pass through intermediate groups
29 on that path for their respective durations.
30*/
31/*!
32 \qmlproperty bool QtQuick.Particles::GroupGoal::jump
33
34 If true, affected particles will jump directly to the target group instead of taking the
35 shortest valid path to get there. They will also not finish their current state,
36 but immediately move to the beginning of the goal state.
37
38 Default is false.
39*/
40
41QQuickGroupGoalAffector::QQuickGroupGoalAffector(QQuickItem *parent) :
42 QQuickParticleAffector(parent), m_jump(false)
43{
44 m_ignoresTime = true;
45}
46
47void QQuickGroupGoalAffector::setGoalState(const QString &arg)
48{
49 if (m_goalState != arg) {
50 m_goalState = arg;
51 emit goalStateChanged(arg);
52 }
53}
54
55bool QQuickGroupGoalAffector::affectParticle(QQuickParticleData *d, qreal dt)
56{
57 Q_UNUSED(dt);
58 QQuickStochasticEngine *engine = m_system->stateEngine;
59 int index = d->systemIndex;
60 int goalIdx = m_system->groupIds[m_goalState];
61 if (!engine){//no stochastic states defined. So cut out the engine
62 //TODO: It's possible to move to a group that is intermediate and not used by painters or emitters - but right now that will redirect to the default group
63 m_system->moveGroups(d, newGIdx: goalIdx);
64 return true;
65 }else if (engine->curState(index) != goalIdx){
66 engine->setGoal(state: goalIdx, sprite: index, jump: m_jump);
67 return true;
68 }
69 return false;
70}
71
72QT_END_NAMESPACE
73
74#include "moc_qquickgroupgoal_p.cpp"
75

source code of qtdeclarative/src/particles/qquickgroupgoal.cpp