From 95e720d1b63312e50be3df467973d098c4527b7d Mon Sep 17 00:00:00 2001 From: Alan Alpert Date: Mon, 9 Jan 2012 10:26:35 +1000 Subject: Fix QQuickItemParticle timing issues It was possible for m_loadables to be reset before the items were loaded, and the datum pointer was lost. This was exacerbated by another bug where reset was called every frame for no reason. Both bugs are now fixed. Task-number: QTBUG-23491 Change-Id: I9b60858621b697fc46de1e964cb27ddc0d2dbc65 Reviewed-by: Michael Brasser --- src/quick/particles/qquickitemparticle.cpp | 22 +++++++++++++--------- src/quick/particles/qquickitemparticle_p.h | 7 +++++-- 2 files changed, 18 insertions(+), 11 deletions(-) (limited to 'src/quick') diff --git a/src/quick/particles/qquickitemparticle.cpp b/src/quick/particles/qquickitemparticle.cpp index 56661ffde1..0b7cbe4661 100644 --- a/src/quick/particles/qquickitemparticle.cpp +++ b/src/quick/particles/qquickitemparticle.cpp @@ -103,12 +103,8 @@ QQuickItemParticle::QQuickItemParticle(QQuickItem *parent) : QQuickParticlePainter(parent), m_fade(true), m_delegate(0) { setFlag(QQuickItem::ItemHasContents); - QTimer* manageDelegates = new QTimer(this);//TODO: don't leak - connect(manageDelegates, SIGNAL(timeout()), - this, SLOT(tick())); - manageDelegates->setInterval(16); - manageDelegates->setSingleShot(false); - manageDelegates->start(); + clock = new Clock(this, this); + clock->start(); } @@ -146,8 +142,9 @@ void QQuickItemParticle::commit(int, int) { } -void QQuickItemParticle::tick() +void QQuickItemParticle::tick(int time) { + Q_UNUSED(time);//only needed because QTickAnimationProxy expects one foreach (QQuickItem* item, m_deletables){ if (m_fade) item->setOpacity(0.); @@ -194,8 +191,8 @@ void QQuickItemParticle::tick() void QQuickItemParticle::reset() { QQuickParticlePainter::reset(); - //TODO: Cleanup items? m_loadables.clear(); + //TODO: Cleanup items? //deletables? } @@ -205,7 +202,14 @@ QSGNode* QQuickItemParticle::updatePaintNode(QSGNode* n, UpdatePaintNodeData* d) //Dummy update just to get painting tick if (m_pleaseReset){ m_pleaseReset = false; - reset(); + //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 + foreach (const QString group, m_groups){ + int gIdx = m_system->groupIds[group]; + foreach (QQuickParticleData* d, m_system->groupData[gIdx]->data) + if (!d->delegate && d->t != -1 && d->stillAlive()) + m_loadables << d; + } } prepareNextFrame(); diff --git a/src/quick/particles/qquickitemparticle_p.h b/src/quick/particles/qquickitemparticle_p.h index 84f60ace31..d5284430e2 100644 --- a/src/quick/particles/qquickitemparticle_p.h +++ b/src/quick/particles/qquickitemparticle_p.h @@ -44,6 +44,7 @@ #include "qquickparticlepainter_p.h" #include #include +#include QT_BEGIN_HEADER QT_BEGIN_NAMESPACE @@ -95,9 +96,8 @@ protected: virtual void commit(int gIdx, int pIdx); virtual void initialize(int gIdx, int pIdx); void prepareNextFrame(); -private slots: - void tick(); private: + void tick(int time = 0); QList m_deletables; QList< QQuickParticleData* > m_loadables; bool m_fade; @@ -108,6 +108,9 @@ private: qreal m_lastT; int m_activeCount; QDeclarativeComponent* m_delegate; + + typedef QTickAnimationProxy Clock; + Clock *clock; }; class QQuickItemParticleAttached : public QObject -- cgit v1.2.3