diff options
author | Leander Beernaert <leander.beernaert@qt.io> | 2020-01-16 16:25:06 +0100 |
---|---|---|
committer | Leander Beernaert <leander.beernaert@qt.io> | 2020-01-16 16:25:06 +0100 |
commit | 1d333d3375874efb8d37df37dc5ef561573794ad (patch) | |
tree | 2d8c995f64c05c84c1fcceb2c5cb40fcae69855f /src/particles | |
parent | b106d86c433706928b0b0c206a0d9f831681e1bf (diff) | |
parent | e79a2658cde899d6ee11ec3c0d0a3768eb2c864b (diff) |
Merge remote-tracking branch 'origin/dev' into wip/cmake
Change-Id: I0c5b939c70bdb91ccdf7068784308416dcaa5736
Diffstat (limited to 'src/particles')
17 files changed, 67 insertions, 96 deletions
diff --git a/src/particles/particles.pro b/src/particles/particles.pro index 6a3fb1bdc4..f4efb140bd 100644 --- a/src/particles/particles.pro +++ b/src/particles/particles.pro @@ -16,4 +16,10 @@ exists("qqml_enable_gcov") { include(particles.pri) +QMLTYPES_FILENAME = plugins.qmltypes +QMLTYPES_INSTALL_DIR = $$[QT_INSTALL_QML]/QtQuick/Particles.2 +QML_IMPORT_NAME = QtQuick.Particles +IMPORT_VERSION = 2.15 +CONFIG += qmltypes install_qmltypes install_metatypes + load(qt_module) diff --git a/src/particles/qquickitemparticle.cpp b/src/particles/qquickitemparticle.cpp index fc28864746..ce254c212d 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) @@ -159,13 +160,21 @@ void QQuickItemParticle::take(QQuickItem *item, bool prioritize) void QQuickItemParticle::give(QQuickItem *item) { - //TODO: This - Q_UNUSED(item); + for (auto groupId : groupIds()) { + for (QQuickParticleData* data : qAsConst(m_system->groupData[groupId]->data)) { + if (data->delegate == item){ + m_deletables << item; + data->delegate = nullptr; + return; + } + } + } } 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) @@ -179,8 +188,11 @@ void QQuickItemParticle::processDeletables() item->setOpacity(0.); item->setVisible(false); QQuickItemParticleAttached* mpa; - if ((mpa = qobject_cast<QQuickItemParticleAttached*>(qmlAttachedPropertiesObject<QQuickItemParticle>(item)))) - mpa->detach();//reparent as well? + if ((mpa = qobject_cast<QQuickItemParticleAttached*>(qmlAttachedPropertiesObject<QQuickItemParticle>(item)))) { + if (mpa->m_parentItem != nullptr) + item->setParentItem(mpa->m_parentItem); + mpa->detach(); + } int idx = -1; if ((idx = m_managed.indexOf(item)) != -1) { m_managed.takeAt(idx); @@ -195,46 +207,43 @@ 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)) { + QQuickItem* parentItem = nullptr; + if (!m_pendingItems.isEmpty()){ + QQuickItem *item = m_pendingItems.front(); + m_pendingItems.pop_front(); + parentItem = item->parentItem(); + d->delegate = item; + }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_parentItem = parentItem; + 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 +253,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 +262,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 70cfe2a446..32c9881691 100644 --- a/src/particles/qquickitemparticle_p.h +++ b/src/particles/qquickitemparticle_p.h @@ -108,9 +108,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; @@ -130,13 +129,14 @@ class QQuickItemParticleAttached : public QObject Q_PROPERTY(QQuickItemParticle* particle READ particle CONSTANT); public: QQuickItemParticleAttached(QObject* parent) - : QObject(parent), m_mp(0) + : QObject(parent), m_mp(0), m_parentItem(nullptr) {;} QQuickItemParticle* particle() const { return m_mp; } void detach(){Q_EMIT detached();} void attach(){Q_EMIT attached();} private: QQuickItemParticle* m_mp; + QPointer<QQuickItem> m_parentItem; friend class QQuickItemParticle; Q_SIGNALS: void detached(); diff --git a/src/particles/qquickparticleextruder.cpp b/src/particles/qquickparticleextruder.cpp index f56e288e09..ea64a79563 100644 --- a/src/particles/qquickparticleextruder.cpp +++ b/src/particles/qquickparticleextruder.cpp @@ -43,7 +43,7 @@ QT_BEGIN_NAMESPACE /*! - \qmltype Shape + \qmltype ParticleExtruder \instantiates QQuickParticleExtruder \inqmlmodule QtQuick.Particles \brief For specifying an area for affectors and emitters. diff --git a/src/particles/qquickparticlesmodule.cpp b/src/particles/qquickparticlesmodule.cpp index 4f2e1cf29d..801af079e6 100644 --- a/src/particles/qquickparticlesmodule.cpp +++ b/src/particles/qquickparticlesmodule.cpp @@ -81,48 +81,6 @@ QT_BEGIN_NAMESPACE void QQuickParticlesModule::defineModule() { initResources(); - - const char* uri = "QtQuick.Particles"; - - qmlRegisterTypesAndRevisions< - QQuickParticleSystem, - QQuickParticleGroup, - - QQuickImageParticle, -#if QT_CONFIG(quick_shadereffect) - QQuickCustomParticle, -#endif - QQuickItemParticle, - - QQuickParticleEmitter, - QQuickTrailEmitter, - - QQuickEllipseExtruder, - QQuickRectangleExtruder, - QQuickLineExtruder, - QQuickMaskExtruder, - - QQuickPointDirection, - QQuickAngleDirection, - QQuickTargetDirection, - QQuickCumulativeDirection, - - QQuickCustomAffector, - QQuickWanderAffector, - QQuickFrictionAffector, - QQuickAttractorAffector, - QQuickGravityAffector, - QQuickAgeAffector, - QQuickSpriteGoalAffector, - QQuickGroupGoalAffector, - QQuickTurbulenceAffector, - - // Exposed just for completeness - QQuickParticleAffector, - QQuickParticlePainter, - QQuickParticleExtruder, - QQuickDirection - >(uri, 2); } QT_END_NAMESPACE diff --git a/src/particles/qquickparticlesystem.cpp b/src/particles/qquickparticlesystem.cpp index 14ffc67324..158aede727 100644 --- a/src/particles/qquickparticlesystem.cpp +++ b/src/particles/qquickparticlesystem.cpp @@ -389,16 +389,21 @@ QQuickParticleData* QQuickParticleGroupData::newDatum(bool respectsLimits) bool QQuickParticleGroupData::recycle() { + m_latestAliveParticles.clear(); + while (dataHeap.top() <= m_system->timeInt) { foreach (QQuickParticleData* datum, dataHeap.pop()) { if (!datum->stillAlive(m_system)) { freeList.free(datum->index); } else { - prepareRecycler(datum); //ttl has been altered mid-way, put it back + m_latestAliveParticles.push_back(datum); } } } + for (auto particle : m_latestAliveParticles) + prepareRecycler(particle); //ttl has been altered mid-way, put it back + //TODO: If the data is clear, gc (consider shrinking stack size)? return freeList.count() == 0; } diff --git a/src/particles/qquickparticlesystem_p.h b/src/particles/qquickparticlesystem_p.h index dd721a7164..7c0a1ffd7d 100644 --- a/src/particles/qquickparticlesystem_p.h +++ b/src/particles/qquickparticlesystem_p.h @@ -227,6 +227,8 @@ public: private: int m_size; QQuickParticleSystem* m_system; + // Only used in recycle() for tracking of alive particles after latest recycling round + QVector<QQuickParticleData*> m_latestAliveParticles; }; struct Color4ub { diff --git a/src/particles/shaders_ng/imageparticle_colored.frag.qsb b/src/particles/shaders_ng/imageparticle_colored.frag.qsb Binary files differindex 7ae640d224..aa6ae5c6bc 100644 --- a/src/particles/shaders_ng/imageparticle_colored.frag.qsb +++ b/src/particles/shaders_ng/imageparticle_colored.frag.qsb diff --git a/src/particles/shaders_ng/imageparticle_colored.vert.qsb b/src/particles/shaders_ng/imageparticle_colored.vert.qsb Binary files differindex 0e2938b72c..a07c8d0e79 100644 --- a/src/particles/shaders_ng/imageparticle_colored.vert.qsb +++ b/src/particles/shaders_ng/imageparticle_colored.vert.qsb diff --git a/src/particles/shaders_ng/imageparticle_deformed.frag.qsb b/src/particles/shaders_ng/imageparticle_deformed.frag.qsb Binary files differindex fa9d9d35bb..1f4a08fe48 100644 --- a/src/particles/shaders_ng/imageparticle_deformed.frag.qsb +++ b/src/particles/shaders_ng/imageparticle_deformed.frag.qsb diff --git a/src/particles/shaders_ng/imageparticle_deformed.vert.qsb b/src/particles/shaders_ng/imageparticle_deformed.vert.qsb Binary files differindex 65092d5b26..6a2048c5bf 100644 --- a/src/particles/shaders_ng/imageparticle_deformed.vert.qsb +++ b/src/particles/shaders_ng/imageparticle_deformed.vert.qsb diff --git a/src/particles/shaders_ng/imageparticle_simple.frag.qsb b/src/particles/shaders_ng/imageparticle_simple.frag.qsb Binary files differindex a5874cba24..f580048e71 100644 --- a/src/particles/shaders_ng/imageparticle_simple.frag.qsb +++ b/src/particles/shaders_ng/imageparticle_simple.frag.qsb diff --git a/src/particles/shaders_ng/imageparticle_simple.vert.qsb b/src/particles/shaders_ng/imageparticle_simple.vert.qsb Binary files differindex da815d7e19..6735e1ae38 100644 --- a/src/particles/shaders_ng/imageparticle_simple.vert.qsb +++ b/src/particles/shaders_ng/imageparticle_simple.vert.qsb diff --git a/src/particles/shaders_ng/imageparticle_sprite.frag.qsb b/src/particles/shaders_ng/imageparticle_sprite.frag.qsb Binary files differindex 778550344b..01806a3c54 100644 --- a/src/particles/shaders_ng/imageparticle_sprite.frag.qsb +++ b/src/particles/shaders_ng/imageparticle_sprite.frag.qsb diff --git a/src/particles/shaders_ng/imageparticle_sprite.vert.qsb b/src/particles/shaders_ng/imageparticle_sprite.vert.qsb Binary files differindex 45b21ace8a..6d8c1852f5 100644 --- a/src/particles/shaders_ng/imageparticle_sprite.vert.qsb +++ b/src/particles/shaders_ng/imageparticle_sprite.vert.qsb diff --git a/src/particles/shaders_ng/imageparticle_tabled.frag.qsb b/src/particles/shaders_ng/imageparticle_tabled.frag.qsb Binary files differindex c5dcc2c68f..630fb064ac 100644 --- a/src/particles/shaders_ng/imageparticle_tabled.frag.qsb +++ b/src/particles/shaders_ng/imageparticle_tabled.frag.qsb diff --git a/src/particles/shaders_ng/imageparticle_tabled.vert.qsb b/src/particles/shaders_ng/imageparticle_tabled.vert.qsb Binary files differindex ea42607570..af0f475bb8 100644 --- a/src/particles/shaders_ng/imageparticle_tabled.vert.qsb +++ b/src/particles/shaders_ng/imageparticle_tabled.vert.qsb |