aboutsummaryrefslogtreecommitdiffstats
path: root/src/particles
diff options
context:
space:
mode:
Diffstat (limited to 'src/particles')
-rw-r--r--src/particles/qquickitemparticle.cpp75
-rw-r--r--src/particles/qquickitemparticle_p.h3
2 files changed, 32 insertions, 46 deletions
diff --git a/src/particles/qquickitemparticle.cpp b/src/particles/qquickitemparticle.cpp
index fc28864746..de74c8a2c4 100644
--- a/src/particles/qquickitemparticle.cpp
+++ b/src/particles/qquickitemparticle.cpp
@@ -136,6 +136,7 @@ QQuickItemParticle::QQuickItemParticle(QQuickItem *parent) :
QQuickItemParticle::~QQuickItemParticle()
{
delete clock;
+ qDeleteAll(m_managed);
}
void QQuickItemParticle::freeze(QQuickItem* item)
@@ -165,7 +166,8 @@ void QQuickItemParticle::give(QQuickItem *item)
void QQuickItemParticle::initialize(int gIdx, int pIdx)
{
- m_loadables << m_system->groupData[gIdx]->data[pIdx];//defer to other thread
+ Q_UNUSED(gIdx);
+ Q_UNUSED(pIdx);
}
void QQuickItemParticle::commit(int, int)
@@ -196,45 +198,39 @@ void QQuickItemParticle::tick(int time)
Q_UNUSED(time);//only needed because QTickAnimationProxy expects one
processDeletables();
- foreach (QQuickParticleData* d, m_loadables){
- Q_ASSERT(d);
- if (m_stasis.contains(d->delegate))
- qWarning() << "Current model particles prefers overwrite:false";
- //remove old item from the particle that is dying to make room for this one
- if (d->delegate) {
- m_deletables << d->delegate;
- d->delegate = nullptr;
- }
- if (!m_pendingItems.isEmpty()){
- d->delegate = m_pendingItems.front();
- m_pendingItems.pop_front();
- }else if (m_delegate){
- d->delegate = qobject_cast<QQuickItem*>(m_delegate->create(qmlContext(this)));
- if (d->delegate)
- m_managed << d->delegate;
- }
- if (d && d->delegate){//###Data can be zero if creating an item leads to a reset - this screws things up.
- d->delegate->setX(d->curX(m_system) - d->delegate->width() / 2); //TODO: adjust for system?
- d->delegate->setY(d->curY(m_system) - d->delegate->height() / 2);
- QQuickItemParticleAttached* mpa = qobject_cast<QQuickItemParticleAttached*>(qmlAttachedPropertiesObject<QQuickItemParticle>(d->delegate));
- if (mpa){
- mpa->m_mp = this;
- mpa->attach();
+ for (auto groupId : groupIds()) {
+ for (QQuickParticleData* d : qAsConst(m_system->groupData[groupId]->data)) {
+ if (!d->delegate && d->t != -1 && d->stillAlive(m_system)) {
+ if (!m_pendingItems.isEmpty()){
+ d->delegate = m_pendingItems.front();
+ m_pendingItems.pop_front();
+ }else if (m_delegate){
+ d->delegate = qobject_cast<QQuickItem*>(m_delegate->create(qmlContext(this)));
+ if (d->delegate)
+ m_managed << d->delegate;
+ }
+ if (d && d->delegate){//###Data can be zero if creating an item leads to a reset - this screws things up.
+ d->delegate->setX(d->curX(m_system) - d->delegate->width() / 2); //TODO: adjust for system?
+ d->delegate->setY(d->curY(m_system) - d->delegate->height() / 2);
+ QQuickItemParticleAttached* mpa = qobject_cast<QQuickItemParticleAttached*>(qmlAttachedPropertiesObject<QQuickItemParticle>(d->delegate));
+ if (mpa){
+ mpa->m_mp = this;
+ mpa->attach();
+ }
+ d->delegate->setParentItem(this);
+ if (m_fade)
+ d->delegate->setOpacity(0.);
+ d->delegate->setVisible(false);//Will be set to true when we prepare the next frame
+ m_activeCount++;
+ }
}
- d->delegate->setParentItem(this);
- if (m_fade)
- d->delegate->setOpacity(0.);
- d->delegate->setVisible(false);//Will be set to true when we prepare the next frame
- m_activeCount++;
}
}
- m_loadables.clear();
}
void QQuickItemParticle::reset()
{
QQuickParticlePainter::reset();
- m_loadables.clear();
// delete all managed items which had their logical particles cleared
// but leave it alone if the logical particle is maintained
@@ -244,7 +240,7 @@ void QQuickItemParticle::reset()
lost.remove(d->delegate);
}
}
- m_deletables.append(lost.values());
+ m_deletables.unite(lost);
//TODO: This doesn't yet handle calling detach on taken particles in the system reset case
processDeletables();
}
@@ -253,18 +249,9 @@ void QQuickItemParticle::reset()
QSGNode* QQuickItemParticle::updatePaintNode(QSGNode* n, UpdatePaintNodeData* d)
{
//Dummy update just to get painting tick
- if (m_pleaseReset){
+ if (m_pleaseReset)
m_pleaseReset = false;
- //Refill loadables, delayed here so as to only happen once per frame max
- //### Constant resetting might lead to m_loadables never being populated when tick() occurs
- for (auto groupId : groupIds()) {
- for (QQuickParticleData* d : qAsConst(m_system->groupData[groupId]->data)) {
- if (!d->delegate && d->t != -1 && d->stillAlive(m_system)) {
- m_loadables << d;
- }
- }
- }
- }
+
prepareNextFrame();
update();//Get called again
diff --git a/src/particles/qquickitemparticle_p.h b/src/particles/qquickitemparticle_p.h
index 7867add4e4..b278008460 100644
--- a/src/particles/qquickitemparticle_p.h
+++ b/src/particles/qquickitemparticle_p.h
@@ -106,9 +106,8 @@ protected:
private:
void processDeletables();
void tick(int time = 0);
- QList<QQuickItem* > m_deletables;
+ QSet<QQuickItem* > m_deletables;
QList<QQuickItem* > m_managed;
- QList< QQuickParticleData* > m_loadables;
bool m_fade;
QList<QQuickItem*> m_pendingItems;