40 Q_PROPERTY(
int duration READ duration WRITE setDuration NOTIFY durationChanged)
41 Q_PROPERTY(
int durationVariation READ durationVariation WRITE setDurationVariation NOTIFY durationVariationChanged)
43 Q_PROPERTY(
bool randomStart READ randomStart WRITE setRandomStart NOTIFY randomStartChanged)
44 Q_PROPERTY(QVariantMap to READ to WRITE setTo NOTIFY toChanged)
45 Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
48 QQuickStochasticState(QObject* parent =
nullptr)
63 QVariantMap to()
const
68 int durationVariation()
const
70 return m_durationVariation;
74 virtual int variedDuration()
const
76 return qMax(0.0 , m_duration
77 + (m_durationVariation * QRandomGenerator::global()->bounded(2.0))
78 - m_durationVariation);
81 bool randomStart()
const
87 void durationChanged(
int arg);
89 void nameChanged(
const QString &arg);
91 void toChanged(
const QVariantMap &arg);
93 void durationVariationChanged(
int arg);
97 void randomStartChanged(
bool arg);
100 void setDuration(
int arg)
102 if (m_duration != arg) {
104 Q_EMIT durationChanged(arg);
108 void setName(
const QString &arg)
112 Q_EMIT nameChanged(arg);
116 void setTo(
const QVariantMap &arg)
120 Q_EMIT toChanged(arg);
124 void setDurationVariation(
int arg)
126 if (m_durationVariation != arg) {
127 m_durationVariation = arg;
128 Q_EMIT durationVariationChanged(arg);
132 void setRandomStart(
bool arg)
134 if (m_randomStart != arg) {
136 Q_EMIT randomStartChanged(arg);
144 int m_durationVariation = 0;
146 friend class QQuickStochasticEngine;
147 bool m_randomStart =
false;
154 Q_PROPERTY(QString globalGoal READ globalGoal WRITE setGlobalGoal NOTIFY globalGoalChanged FINAL)
155 Q_PROPERTY(QQmlListProperty<QQuickStochasticState> states READ states FINAL)
157 explicit QQuickStochasticEngine(QObject *parent =
nullptr);
158 QQuickStochasticEngine(
const QList<QQuickStochasticState*> &states, QObject *parent =
nullptr);
159 ~QQuickStochasticEngine() override;
161 QQmlListProperty<QQuickStochasticState> states()
163 return QQmlListProperty<QQuickStochasticState>(
this, &m_states);
166 QString globalGoal()
const
171 int count()
const {
return m_things.size();}
172 void setCount(
int c);
174 void setGoal(
int state,
int sprite=0,
bool jump=
false);
175 void start(
int index=0,
int state=0);
176 virtual void restart(
int index=0);
177 virtual void advance(
int index=0);
178 void stop(
int index=0);
179 int curState(
int index=0)
const {
return m_things[index];}
181 QQuickStochasticState* state(
int idx)
const {
return m_states[idx];}
182 int stateIndex(QQuickStochasticState* s)
const {
return m_states.indexOf(s);}
183 int stateIndex(
const QString& s)
const {
184 for (
int i=0; i<m_states.size(); i++)
185 if (m_states[i]->name() == s)
190 int stateCount() {
return m_states.size();}
194 void globalGoalChanged(
const QString &arg);
195 void stateChanged(
int idx);
198 void setGlobalGoal(
const QString &arg)
200 if (m_globalGoal != arg) {
202 Q_EMIT globalGoalChanged(arg);
206 uint updateSprites(uint time);
209 friend class QQuickParticleSystem;
210 void addToUpdateList(uint t,
int idx);
211 int nextState(
int curState,
int idx=0);
212 int goalSeek(
int curState,
int idx,
int dist=-1);
213 QList<QQuickStochasticState*> m_states;
217 QList<
int> m_duration;
218 QList<
int> m_startTimes;
219 QList<std::pair<uint, QList<
int> > > m_stateUpdates;
221 QElapsedTimer m_advanceTimer;
223 QString m_globalGoal;
225 int m_imageStateCount;
232 Q_PROPERTY(QQmlListProperty<QQuickSprite> sprites READ sprites FINAL)
234 explicit QQuickSpriteEngine(QObject *parent =
nullptr);
235 QQuickSpriteEngine(
const QList<QQuickSprite*> &sprites, QObject *parent =
nullptr);
236 ~QQuickSpriteEngine() override;
237 QQmlListProperty<QQuickSprite> sprites()
239 return QQmlListProperty<QQuickSprite>(
this, &m_sprites);
242 QQuickSprite* sprite(
int sprite = 0)
const;
243 int spriteState(
int sprite = 0)
const;
244 int spriteStart(
int sprite = 0)
const;
245 int spriteFrames(
int sprite = 0)
const;
246 int spriteDuration(
int sprite = 0)
const;
247 int spriteX(
int sprite = 0)
const;
248 int spriteY(
int sprite = 0)
const;
249 int spriteWidth(
int sprite = 0)
const;
250 int spriteHeight(
int sprite = 0)
const;
251 int spriteCount()
const;
252 int maxFrames()
const;
254 void restart(
int index=0) override;
255 void advance(
int index=0) override;
258 bool isNull()
const {
return status() == QQuickPixmap::Null; }
259 bool isReady()
const {
return status() == QQuickPixmap::Ready; }
260 bool isLoading()
const {
return status() == QQuickPixmap::Loading; }
261 bool isError()
const {
return status() == QQuickPixmap::Error; }
262 QQuickPixmap::Status status()
const;
263 void startAssemblingImage();
264 QImage assembledImage(
int maxSize = 2048);
267 int pseudospriteProgress(
int,
int,
int *rd =
nullptr)
const;
268 QList<QQuickSprite*> m_sprites;
269 bool m_startedImageAssembly;
271 bool m_errorsPrinted;
297inline void spriteReplace(QQmlListProperty<QQuickSprite> *p, qsizetype idx, QQuickSprite *s)
299 reinterpret_cast<QList<QQuickSprite *> *>(p->data)->replace(idx, s);
300 p->object->metaObject()->invokeMethod(p->object,
"createEngine");