aboutsummaryrefslogtreecommitdiffstats
path: root/src/declarative/particles/qsgparticlepainter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/declarative/particles/qsgparticlepainter.cpp')
-rw-r--r--src/declarative/particles/qsgparticlepainter.cpp46
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);
}
}
}