aboutsummaryrefslogtreecommitdiffstats
path: root/src/particles
diff options
context:
space:
mode:
authorLeander Beernaert <leander.beernaert@qt.io>2020-01-16 16:25:06 +0100
committerLeander Beernaert <leander.beernaert@qt.io>2020-01-16 16:25:06 +0100
commit1d333d3375874efb8d37df37dc5ef561573794ad (patch)
tree2d8c995f64c05c84c1fcceb2c5cb40fcae69855f /src/particles
parentb106d86c433706928b0b0c206a0d9f831681e1bf (diff)
parente79a2658cde899d6ee11ec3c0d0a3768eb2c864b (diff)
Merge remote-tracking branch 'origin/dev' into wip/cmake
Diffstat (limited to 'src/particles')
-rw-r--r--src/particles/particles.pro6
-rw-r--r--src/particles/qquickitemparticle.cpp98
-rw-r--r--src/particles/qquickitemparticle_p.h6
-rw-r--r--src/particles/qquickparticleextruder.cpp2
-rw-r--r--src/particles/qquickparticlesmodule.cpp42
-rw-r--r--src/particles/qquickparticlesystem.cpp7
-rw-r--r--src/particles/qquickparticlesystem_p.h2
-rw-r--r--src/particles/shaders_ng/imageparticle_colored.frag.qsbbin1990 -> 1572 bytes
-rw-r--r--src/particles/shaders_ng/imageparticle_colored.vert.qsbbin3677 -> 3329 bytes
-rw-r--r--src/particles/shaders_ng/imageparticle_deformed.frag.qsbbin2028 -> 1601 bytes
-rw-r--r--src/particles/shaders_ng/imageparticle_deformed.vert.qsbbin5044 -> 4712 bytes
-rw-r--r--src/particles/shaders_ng/imageparticle_simple.frag.qsbbin2000 -> 1581 bytes
-rw-r--r--src/particles/shaders_ng/imageparticle_simple.vert.qsbbin3639 -> 3261 bytes
-rw-r--r--src/particles/shaders_ng/imageparticle_sprite.frag.qsbbin2369 -> 1918 bytes
-rw-r--r--src/particles/shaders_ng/imageparticle_sprite.vert.qsbbin5964 -> 5367 bytes
-rw-r--r--src/particles/shaders_ng/imageparticle_tabled.frag.qsbbin2240 -> 1777 bytes
-rw-r--r--src/particles/shaders_ng/imageparticle_tabled.vert.qsbbin5462 -> 4929 bytes
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
index 7ae640d224..aa6ae5c6bc 100644
--- a/src/particles/shaders_ng/imageparticle_colored.frag.qsb
+++ b/src/particles/shaders_ng/imageparticle_colored.frag.qsb
Binary files differ
diff --git a/src/particles/shaders_ng/imageparticle_colored.vert.qsb b/src/particles/shaders_ng/imageparticle_colored.vert.qsb
index 0e2938b72c..a07c8d0e79 100644
--- a/src/particles/shaders_ng/imageparticle_colored.vert.qsb
+++ b/src/particles/shaders_ng/imageparticle_colored.vert.qsb
Binary files differ
diff --git a/src/particles/shaders_ng/imageparticle_deformed.frag.qsb b/src/particles/shaders_ng/imageparticle_deformed.frag.qsb
index fa9d9d35bb..1f4a08fe48 100644
--- a/src/particles/shaders_ng/imageparticle_deformed.frag.qsb
+++ b/src/particles/shaders_ng/imageparticle_deformed.frag.qsb
Binary files differ
diff --git a/src/particles/shaders_ng/imageparticle_deformed.vert.qsb b/src/particles/shaders_ng/imageparticle_deformed.vert.qsb
index 65092d5b26..6a2048c5bf 100644
--- a/src/particles/shaders_ng/imageparticle_deformed.vert.qsb
+++ b/src/particles/shaders_ng/imageparticle_deformed.vert.qsb
Binary files differ
diff --git a/src/particles/shaders_ng/imageparticle_simple.frag.qsb b/src/particles/shaders_ng/imageparticle_simple.frag.qsb
index a5874cba24..f580048e71 100644
--- a/src/particles/shaders_ng/imageparticle_simple.frag.qsb
+++ b/src/particles/shaders_ng/imageparticle_simple.frag.qsb
Binary files differ
diff --git a/src/particles/shaders_ng/imageparticle_simple.vert.qsb b/src/particles/shaders_ng/imageparticle_simple.vert.qsb
index da815d7e19..6735e1ae38 100644
--- a/src/particles/shaders_ng/imageparticle_simple.vert.qsb
+++ b/src/particles/shaders_ng/imageparticle_simple.vert.qsb
Binary files differ
diff --git a/src/particles/shaders_ng/imageparticle_sprite.frag.qsb b/src/particles/shaders_ng/imageparticle_sprite.frag.qsb
index 778550344b..01806a3c54 100644
--- a/src/particles/shaders_ng/imageparticle_sprite.frag.qsb
+++ b/src/particles/shaders_ng/imageparticle_sprite.frag.qsb
Binary files differ
diff --git a/src/particles/shaders_ng/imageparticle_sprite.vert.qsb b/src/particles/shaders_ng/imageparticle_sprite.vert.qsb
index 45b21ace8a..6d8c1852f5 100644
--- a/src/particles/shaders_ng/imageparticle_sprite.vert.qsb
+++ b/src/particles/shaders_ng/imageparticle_sprite.vert.qsb
Binary files differ
diff --git a/src/particles/shaders_ng/imageparticle_tabled.frag.qsb b/src/particles/shaders_ng/imageparticle_tabled.frag.qsb
index c5dcc2c68f..630fb064ac 100644
--- a/src/particles/shaders_ng/imageparticle_tabled.frag.qsb
+++ b/src/particles/shaders_ng/imageparticle_tabled.frag.qsb
Binary files differ
diff --git a/src/particles/shaders_ng/imageparticle_tabled.vert.qsb b/src/particles/shaders_ng/imageparticle_tabled.vert.qsb
index ea42607570..af0f475bb8 100644
--- a/src/particles/shaders_ng/imageparticle_tabled.vert.qsb
+++ b/src/particles/shaders_ng/imageparticle_tabled.vert.qsb
Binary files differ