diff options
Diffstat (limited to 'src/declarative/particles/qsgparticlepainter.cpp')
-rw-r--r-- | src/declarative/particles/qsgparticlepainter.cpp | 46 |
1 files changed, 34 insertions, 12 deletions
diff --git a/src/declarative/particles/qsgparticlepainter.cpp b/src/declarative/particles/qsgparticlepainter.cpp index a5e8c0a3e6..0d369fd4d8 100644 --- a/src/declarative/particles/qsgparticlepainter.cpp +++ b/src/declarative/particles/qsgparticlepainter.cpp @@ -44,7 +44,7 @@ QT_BEGIN_NAMESPACE QSGParticlePainter::QSGParticlePainter(QSGItem *parent) : QSGItem(parent), - m_system(0) + m_system(0), m_count(0), m_lastStart(0) { connect(this, SIGNAL(xChanged()), this, SLOT(calcSystemOffset())); @@ -67,7 +67,7 @@ void QSGParticlePainter::setSystem(QSGParticleSystem *arg) if (m_system != arg) { m_system = arg; if(m_system){ - m_system->registerParticleType(this); + m_system->registerParticlePainter(this); connect(m_system, SIGNAL(xChanged()), this, SLOT(calcSystemOffset())); connect(m_system, SIGNAL(yChanged()), @@ -89,15 +89,24 @@ void QSGParticlePainter::reload(QSGParticleData*) void QSGParticlePainter::reset() { //Have to every time because what it's emitting may have changed and that affects particleTypeIndex - m_particleStarts.clear(); - m_lastStart = 0; + if(m_system) + updateParticleStarts(); } +void QSGParticlePainter::resize(int, int) +{ +} + + void QSGParticlePainter::setCount(int c) { + Q_ASSERT(c >= 0); //XXX if(c == m_count) return; + int lastCount = m_count; m_count = c; + resize(lastCount, m_count);//### is virtual needed? Or should I just use the signal? + updateParticleStarts(); emit countChanged(); } @@ -107,14 +116,27 @@ int QSGParticlePainter::count() } -int QSGParticlePainter::particleTypeIndex(QSGParticleData* d) +void QSGParticlePainter::updateParticleStarts() { - if(!m_particleStarts.contains(d->group)){ - m_particleStarts.insert(d->group, m_lastStart); - m_lastStart += m_system->m_groupData[d->group]->size; + m_particleStarts.clear(); + m_lastStart = 0; + QList<int> particleList; + if(m_particles.isEmpty()) + particleList << 0; + foreach(const QString &s, m_particles) + particleList << m_system->m_groupIds[s]; + foreach(int gIdx, particleList){ + QSGParticleGroupData *gd = m_system->m_groupData[gIdx]; + m_particleStarts.insert(gIdx, qMakePair<int, int>(gd->size, m_lastStart)); + m_lastStart += gd->size; } - int ret = m_particleStarts[d->group] + d->particleIndex; - Q_ASSERT(ret >=0 && ret < m_count);//XXX: Possibly shouldn't assert, but bugs here were hard to find in the past +} + +int QSGParticlePainter::particleTypeIndex(QSGParticleData* d) +{ + Q_ASSERT(d && m_particleStarts.contains(d->group));//XXX + int ret = m_particleStarts[d->group].second + d->index; + Q_ASSERT(ret >=0 && ret < m_count);//XXX:shouldn't assert, but bugs here were hard to find in the past return ret; } @@ -129,8 +151,8 @@ void QSGParticlePainter::calcSystemOffset() //Reload all particles//TODO: Necessary? foreach(const QString &g, m_particles){ int gId = m_system->m_groupIds[g]; - for(int i=0; i<m_system->m_groupData[gId]->size; i++) - reload(m_system->m_data[m_system->m_groupData[gId]->start + i]); + foreach(QSGParticleData* d, m_system->m_groupData[gId]->data) + reload(d); } } } |