41 Q_PROPERTY(
int duration READ duration WRITE setDuration NOTIFY durationChanged)
42 Q_PROPERTY(
int durationVariation READ durationVariation WRITE setDurationVariation NOTIFY durationVariationChanged)
44 Q_PROPERTY(
bool randomStart READ randomStart WRITE setRandomStart NOTIFY randomStartChanged)
45 Q_PROPERTY(QVariantMap to READ to WRITE setTo NOTIFY toChanged)
46 Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
49 QQuickStochasticState(QObject* parent =
nullptr)
64 QVariantMap to()
const
69 int durationVariation()
const
71 return m_durationVariation;
75 virtual int variedDuration()
const
77 return qMax(0.0 , m_duration
78 + (m_durationVariation * QRandomGenerator::global()->bounded(2.0))
79 - m_durationVariation);
82 bool randomStart()
const
88 void durationChanged(
int arg);
90 void nameChanged(
const QString &arg);
92 void toChanged(
const QVariantMap &arg);
94 void durationVariationChanged(
int arg);
98 void randomStartChanged(
bool arg);
101 void setDuration(
int arg)
103 if (m_duration != arg) {
105 Q_EMIT durationChanged(arg);
109 void setName(
const QString &arg)
113 Q_EMIT nameChanged(arg);
117 void setTo(
const QVariantMap &arg)
121 Q_EMIT toChanged(arg);
125 void setDurationVariation(
int arg)
127 if (m_durationVariation != arg) {
128 m_durationVariation = arg;
129 Q_EMIT durationVariationChanged(arg);
133 void setRandomStart(
bool arg)
135 if (m_randomStart != arg) {
137 Q_EMIT randomStartChanged(arg);
145 int m_durationVariation = 0;
147 friend class QQuickStochasticEngine;
148 bool m_randomStart =
false;
155 Q_PROPERTY(QString globalGoal READ globalGoal WRITE setGlobalGoal NOTIFY globalGoalChanged FINAL)
156 Q_PROPERTY(QQmlListProperty<QQuickStochasticState> states READ states FINAL)
158 explicit QQuickStochasticEngine(QObject *parent =
nullptr);
159 QQuickStochasticEngine(
const QList<QQuickStochasticState*> &states, QObject *parent =
nullptr);
160 ~QQuickStochasticEngine() override;
162 QQmlListProperty<QQuickStochasticState> states()
164 return QQmlListProperty<QQuickStochasticState>(
this, &m_states);
167 QString globalGoal()
const
172 int count()
const {
return m_things.size();}
173 void setCount(
int c);
175 void setGoal(
int state,
int sprite=0,
bool jump=
false);
176 void start(
int index=0,
int state=0);
177 virtual void restart(
int index=0);
178 virtual void advance(
int index=0);
179 void stop(
int index=0);
180 int curState(
int index=0)
const {
return m_things[index];}
182 QQuickStochasticState* state(
int idx)
const {
return m_states[idx];}
183 int stateIndex(QQuickStochasticState* s)
const {
return m_states.indexOf(s);}
184 int stateIndex(
const QString& s)
const {
185 for (
int i=0; i<m_states.size(); i++)
186 if (m_states[i]->name() == s)
191 int stateCount() {
return m_states.size();}
195 void globalGoalChanged(
const QString &arg);
196 void stateChanged(
int idx);
199 void setGlobalGoal(
const QString &arg)
201 if (m_globalGoal != arg) {
203 Q_EMIT globalGoalChanged(arg);
207 uint updateSprites(uint time);
210 friend class QQuickParticleSystem;
211 void addToUpdateList(uint t,
int idx);
212 int nextState(
int curState,
int idx=0);
213 int goalSeek(
int curState,
int idx,
int dist=-1);
214 QList<QQuickStochasticState*> m_states;
216 QVector<
int> m_things;
217 QVector<
int> m_goals;
218 QVector<
int> m_duration;
219 QVector<
int> m_startTimes;
220 QVector<std::pair<uint, QVector<
int> > > m_stateUpdates;
222 QElapsedTimer m_advanceTimer;
224 QString m_globalGoal;
226 int m_imageStateCount;
233 Q_PROPERTY(QQmlListProperty<QQuickSprite> sprites READ sprites FINAL)
235 explicit QQuickSpriteEngine(QObject *parent =
nullptr);
236 QQuickSpriteEngine(
const QList<QQuickSprite*> &sprites, QObject *parent =
nullptr);
237 ~QQuickSpriteEngine() override;
238 QQmlListProperty<QQuickSprite> sprites()
240 return QQmlListProperty<QQuickSprite>(
this, &m_sprites);
243 QQuickSprite* sprite(
int sprite = 0)
const;
244 int spriteState(
int sprite = 0)
const;
245 int spriteStart(
int sprite = 0)
const;
246 int spriteFrames(
int sprite = 0)
const;
247 int spriteDuration(
int sprite = 0)
const;
248 int spriteX(
int sprite = 0)
const;
249 int spriteY(
int sprite = 0)
const;
250 int spriteWidth(
int sprite = 0)
const;
251 int spriteHeight(
int sprite = 0)
const;
252 int spriteCount()
const;
253 int maxFrames()
const;
255 void restart(
int index=0) override;
256 void advance(
int index=0) override;
259 bool isNull()
const {
return status() == QQuickPixmap::Null; }
260 bool isReady()
const {
return status() == QQuickPixmap::Ready; }
261 bool isLoading()
const {
return status() == QQuickPixmap::Loading; }
262 bool isError()
const {
return status() == QQuickPixmap::Error; }
263 QQuickPixmap::Status status()
const;
264 void startAssemblingImage();
265 QImage assembledImage(
int maxSize = 2048);
268 int pseudospriteProgress(
int,
int,
int *rd =
nullptr)
const;
269 QList<QQuickSprite*> m_sprites;
270 bool m_startedImageAssembly;
272 bool m_errorsPrinted;
298inline void spriteReplace(QQmlListProperty<QQuickSprite> *p, qsizetype idx, QQuickSprite *s)
300 reinterpret_cast<QList<QQuickSprite *> *>(p->data)->replace(idx, s);
301 p->object->metaObject()->invokeMethod(p->object,
"createEngine");