From a06ec0c299a267149d9440ddb935272b0165e464 Mon Sep 17 00:00:00 2001 From: Alan Alpert Date: Wed, 2 Nov 2011 13:46:01 +1000 Subject: [PATCH] Only simulate if particle was alive When spliting the simulation into multiple parts, do not simulate for times before the particle was born. Otherwise huge simulation times lead to huge effects even on particles with a simulated birth of near the end of that time. Change-Id: I7ff507b27bf819dbebd61934b9523b23316b5e80 Reviewed-by: Martin Jones --- .../particles/qquickparticleaffector.cpp | 3 ++- src/declarative/particles/qquickparticlesystem.cpp | 8 ++++++++ src/declarative/particles/qquickparticlesystem_p.h | 3 ++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/declarative/particles/qquickparticleaffector.cpp b/src/declarative/particles/qquickparticleaffector.cpp index f50efc5..5bfc699 100644 --- a/src/declarative/particles/qquickparticleaffector.cpp +++ b/src/declarative/particles/qquickparticleaffector.cpp @@ -220,7 +220,8 @@ void QQuickParticleAffector::affectSystem(qreal dt) m_system->timeInt -= myDt * 1000.0; while (myDt > simulationDelta) { m_system->timeInt += simulationDelta * 1000.0; - affected = affectParticle(d, simulationDelta) || affected; + if (d->alive())//Only affect during the parts it was alive for + affected = affectParticle(d, simulationDelta) || affected; myDt -= simulationDelta; } m_system->timeInt = realTime; diff --git a/src/declarative/particles/qquickparticlesystem.cpp b/src/declarative/particles/qquickparticlesystem.cpp index 767e1b9..613587a 100644 --- a/src/declarative/particles/qquickparticlesystem.cpp +++ b/src/declarative/particles/qquickparticlesystem.cpp @@ -580,6 +580,14 @@ bool QQuickParticleData::stillAlive() return (t + lifeSpan - EPSILON) > ((qreal)system->timeInt/1000.0); } +bool QQuickParticleData::alive() +{ + if (!system) + return false; + qreal st = ((qreal)system->timeInt/1000.0); + return (t + EPSILON) < st && (t + lifeSpan - EPSILON) > st; +} + float QQuickParticleData::curSize() { if (!system || !lifeSpan) diff --git a/src/declarative/particles/qquickparticlesystem_p.h b/src/declarative/particles/qquickparticlesystem_p.h index 6e35f0b..87f2f2a 100644 --- a/src/declarative/particles/qquickparticlesystem_p.h +++ b/src/declarative/particles/qquickparticlesystem_p.h @@ -219,7 +219,8 @@ public: QQuickImageParticle* animationOwner; void debugDump(); - bool stillAlive(); + bool stillAlive();//Only checks end, because usually that's all you need and it's a little faster. + bool alive(); float lifeLeft(); float curSize(); void clone(const QQuickParticleData& other);//Not =, leaves meta-data like index -- 1.7.2.5