80 QQuickParticleDataHeap();
81 void insert(QQuickParticleData* data);
82 void insertTimed(QQuickParticleData* data,
int time);
86 bool isEmpty()
const {
return m_end == 0; }
88 QSet<QQuickParticleData*> pop();
92 bool contains(QQuickParticleData*);
100 QQuickParticleDataHeapNode m_tmp;
101 QVector<QQuickParticleDataHeapNode> m_data;
102 QHash<
int,
int> m_lookups;
111 void resize(
int newSize)
113 Q_ASSERT(newSize >= 0);
114 int oldSize = isUnused.size();
115 isUnused.resize(newSize,
true);
116 if (newSize > oldSize) {
117 if (firstUnused == UINT_MAX) {
118 firstUnused = oldSize;
120 firstUnused = std::min(firstUnused,
unsigned(oldSize));
122 }
else if (firstUnused >=
unsigned(newSize)) {
123 firstUnused = UINT_MAX;
129 isUnused.setBit(index);
130 firstUnused = std::min(firstUnused,
unsigned(index));
135 {
return allocated; }
137 bool hasUnusedEntries()
const
138 {
return firstUnused != UINT_MAX; }
142 if (hasUnusedEntries()) {
143 int nextFree = firstUnused;
144 isUnused.clearBit(firstUnused);
145 firstUnused = isUnused.findNext(firstUnused,
true,
false);
146 if (firstUnused >=
unsigned(isUnused.size())) {
147 firstUnused = UINT_MAX;
157 QV4::BitVector isUnused;
158 unsigned firstUnused = UINT_MAX;
164 enum { InvalidID = -1, DefaultGroupID = 0 };
167 QQuickParticleGroupData(
const QString &name, QQuickParticleSystem* sys);
168 ~QQuickParticleGroupData();
175 bool isActive() {
return freeList.count() > 0; }
177 QString name()
const;
179 void setSize(
int newSize);
182 QQuickParticleVarLengthArray<QQuickParticlePainter*, 4> painters;
185 QVector<QQuickParticleData*> data;
187 QQuickParticleDataHeap dataHeap;
191 void kill(QQuickParticleData* d);
194 QQuickParticleData* newDatum(
bool respectsLimits);
197 void prepareRecycler(QQuickParticleData* d);
201 QQuickParticleSystem* m_system;
203 QVector<QQuickParticleData*> m_latestAliveParticles;
220 void setInstantaneousAX(
float ax, QQuickParticleSystem *particleSystem);
222 void setInstantaneousVX(
float vx, QQuickParticleSystem *particleSystem);
224 void setInstantaneousX(
float x, QQuickParticleSystem *particleSystem);
226 void setInstantaneousAY(
float ay, QQuickParticleSystem *particleSystem);
228 void setInstantaneousVY(
float vy, QQuickParticleSystem *particleSystem);
230 void setInstantaneousY(
float y, QQuickParticleSystem *particleSystem);
233 float curX(QQuickParticleSystem *particleSystem)
const;
234 float curVX(QQuickParticleSystem *particleSystem)
const;
235 float curAX()
const {
return ax; }
236 float curAX(QQuickParticleSystem *)
const {
return ax; }
237 float curY(QQuickParticleSystem *particleSystem)
const;
238 float curVY(QQuickParticleSystem *particleSystem)
const;
239 float curAY()
const {
return ay; }
240 float curAY(QQuickParticleSystem *)
const {
return ay; }
243 int systemIndex = -1;
259 Color4ub color = { 255, 255, 255, 255};
266 float rotationVelocity = 0;
267 uchar autoRotate = 0;
270 float frameDuration = 1;
272 float frameCount = 1;
277 float animHeight = 1;
279 QQuickParticleGroupData::ID groupId = 0;
282 QQuickImageParticle* colorOwner =
nullptr;
283 QQuickImageParticle* rotationOwner =
nullptr;
284 QQuickImageParticle* deformationOwner =
nullptr;
285 QQuickImageParticle* animationOwner =
nullptr;
288 QQuickItem* delegate =
nullptr;
292 void debugDump(QQuickParticleSystem *particleSystem)
const;
293 bool stillAlive(QQuickParticleSystem *particleSystem)
const;
294 bool alive(QQuickParticleSystem *particleSystem)
const;
295 float lifeLeft(QQuickParticleSystem *particleSystem)
const;
297 float curSize(QQuickParticleSystem *particleSystem)
const;
299 QQuickV4ParticleData v4Value(QQuickParticleSystem *particleSystem);
300 void extendLife(
float time, QQuickParticleSystem *particleSystem);
302 static inline constexpr float EPSILON()
noexcept {
return 0.001f; }
311 Q_PROPERTY(
bool running READ isRunning WRITE setRunning NOTIFY runningChanged)
312 Q_PROPERTY(
bool paused READ isPaused WRITE setPaused NOTIFY pausedChanged)
313 Q_PROPERTY(
bool empty READ isEmpty NOTIFY emptyChanged)
314 QML_NAMED_ELEMENT(ParticleSystem)
315 QML_ADDED_IN_VERSION(2, 0)
318 explicit QQuickParticleSystem(QQuickItem *parent =
nullptr);
319 ~QQuickParticleSystem();
321 bool isRunning()
const
328 return particleCount;
331 static const int maxLife = 600000;
335 void systemInitialized();
336 void runningChanged(
bool arg);
337 void pausedChanged(
bool arg);
338 void emptyChanged(
bool arg);
341 void start(){setRunning(
true);}
342 void stop(){setRunning(
false);}
343 void restart(){setRunning(
false);setRunning(
true);}
344 void pause(){setPaused(
true);}
345 void resume(){setPaused(
false);}
348 void setRunning(
bool arg);
349 void setPaused(
bool arg);
351 virtual int duration()
const {
return -1; }
356 void componentComplete() override;
359 void emittersChanged();
360 void loadPainter(QQuickParticlePainter *p);
362 void particleStateChange(
int idx);
366 void emitParticle(QQuickParticleData* p, QQuickParticleEmitter *particleEmitter);
367 QQuickParticleData *newDatum(
368 int groupId,
bool respectLimits =
true,
int sysIdx = -1,
369 const QQuickParticleData *cloneFrom =
nullptr);
370 void finishNewDatum(QQuickParticleData*);
371 void moveGroups(QQuickParticleData *d,
int newGIdx);
372 int nextSystemIndex();
375 int systemSync(QQuickParticlePainter* p);
378 QSet<QQuickParticleData*> needsReset;
379 QVector<QQuickParticleData*> bySysIdx;
380 QQuickStochasticEngine* stateEngine;
382 QHash<QString,
int> groupIds;
383 QVarLengthArray<QQuickParticleGroupData*, 32> groupData;
385 int registerParticleGroupData(
const QString &name, QQuickParticleGroupData *pgd);
388 void updateCurrentTime(
int currentTime );
389 QQuickParticleSystemAnimation* m_animation;
397 void registerParticlePainter(QQuickParticlePainter* p);
398 void registerParticleEmitter(QQuickParticleEmitter* e);
399 void finishRegisteringParticleEmitter(QQuickParticleEmitter *e);
400 void registerParticleAffector(QQuickParticleAffector* a);
401 void registerParticleGroup(QQuickParticleGroup* g);
403 static void statePropertyRedirect(QQmlListProperty<QObject> *prop, QObject *value);
404 static void stateRedirect(QQuickParticleGroup* group, QQuickParticleSystem* sys, QObject *value);
405 bool isPaused()
const
416 void searchNextFreeGroupId();
419 void emitterAdded(QQuickParticleEmitter *e);
420 void postProcessEmitters();
421 void initializeSystem();
423 QList<QPointer<QQuickParticleEmitter> > m_emitters;
424 QList<QPointer<QQuickParticleAffector> > m_affectors;
425 QList<QPointer<QQuickParticlePainter> > m_painters;
426 QList<QPointer<QQuickParticlePainter> > m_syncList;
427 QList<QQuickParticleGroup*> m_groups;
429 QSet<
int> m_reusableIndexes;
430 bool m_componentComplete;
460inline void QQuickParticleData::setInstantaneousAX(
float ax, QQuickParticleSystem* particleSystem)
462 float t = (particleSystem->timeInt / 1000.0f) -
this->t;
464 float vx = (
this->vx + t *
this->ax) - t * ax;
465 float ex =
this->x +
this->vx * t + 0.5f *
this->ax * t_sq;
466 float x = ex - t * vx - 0.5f * t_sq * ax;
473inline void QQuickParticleData::setInstantaneousVX(
float vx, QQuickParticleSystem* particleSystem)
475 float t = (particleSystem->timeInt / 1000.0f) -
this->t;
477 float evx = vx - t *
this->ax;
478 float ex =
this->x +
this->vx * t + 0.5f *
this->ax * t_sq;
479 float x = ex - t * evx - 0.5f * t_sq *
this->ax;
492inline void QQuickParticleData::setInstantaneousAY(
float ay, QQuickParticleSystem* particleSystem)
494 float t = (particleSystem->timeInt / 1000.0f) -
this->t;
496 float vy = (
this->vy + t *
this->ay) - t * ay;
497 float ey =
this->y +
this->vy * t + 0.5f *
this->ay * t_sq;
498 float y = ey - t * vy - 0.5f * t_sq * ay;
505inline void QQuickParticleData::setInstantaneousVY(
float vy, QQuickParticleSystem* particleSystem)
507 float t = (particleSystem->timeInt / 1000.0f) -
this->t;
509 float evy = vy - t *
this->ay;
510 float ey =
this->y +
this->vy * t + 0.5f *
this->ay * t_sq;
511 float y = ey - t*evy - 0.5f * t_sq *
this->ay;
QSet< QQuickParticleData * > data