aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlan Alpert <alan.alpert@nokia.com>2011-10-20 17:48:40 +1000
committerQt by Nokia <qt-info@nokia.com>2011-10-24 12:36:29 +0200
commitd3ed664d23197397e3f140986841ea188cde8a65 (patch)
tree31a170320cba83a9c3a8b883e97dcae351797ad3
parent34cefb69b3f36d7eed9f50a2190459fbae0681de (diff)
Fold Move into Affector
Since 'Move' was just a generic physics property affector, it makes sense to fold it into the generic affector as an easier way of implementing the common case of custom affector (and much faster, since it doesn't hit JS). For completeness in the Move behavior, 'once' now applies the effect of affectors over a second in that one time, so as to avoid exposing the simulation tick. This allows once to have actual meaning for continous affectors. Gravity is also going to be kept around as a convenience (although it will change slightly), so just removing its deprecation warning. Change-Id: Ieb52f8990445fe95f94070175a0f9beb6686324b Reviewed-by: Martin Jones <martin.jones@nokia.com>
-rw-r--r--examples/declarative/particles/affectors/gravity.qml8
-rw-r--r--examples/declarative/particles/affectors/move.qml13
-rw-r--r--src/declarative/particles/particles.pri6
-rw-r--r--src/declarative/particles/qsgcustomaffector.cpp93
-rw-r--r--src/declarative/particles/qsgcustomaffector_p.h90
-rw-r--r--src/declarative/particles/qsggravity.cpp2
-rw-r--r--src/declarative/particles/qsgmove.cpp131
-rw-r--r--src/declarative/particles/qsgmove_p.h155
-rw-r--r--src/declarative/particles/qsgparticleaffector.cpp12
-rw-r--r--src/declarative/particles/qsgparticleaffector_p.h10
-rw-r--r--src/declarative/particles/qsgparticlesmodule.cpp2
-rw-r--r--tests/auto/particles/qsgcustomaffector/data/move.qml74
-rw-r--r--tests/auto/particles/qsgcustomaffector/tst_qsgcustomaffector.cpp27
13 files changed, 307 insertions, 316 deletions
diff --git a/examples/declarative/particles/affectors/gravity.qml b/examples/declarative/particles/affectors/gravity.qml
index 47710e6306..dc55324f3a 100644
--- a/examples/declarative/particles/affectors/gravity.qml
+++ b/examples/declarative/particles/affectors/gravity.qml
@@ -82,12 +82,10 @@ Item {
}
ParticleSystem { id: sys }
- Move {
+ Gravity {
system: sys
- acceleration: AngleDirection {
- angle: ground.rotation + 90
- magnitude: 32
- }
+ acceleration: 32
+ angle: ground.rotation + 90
}
Emitter {
system: sys
diff --git a/examples/declarative/particles/affectors/move.qml b/examples/declarative/particles/affectors/move.qml
index 93ff37bd74..bdeab335ad 100644
--- a/examples/declarative/particles/affectors/move.qml
+++ b/examples/declarative/particles/affectors/move.qml
@@ -66,12 +66,11 @@ Rectangle {
height: 80
}
- Move {
+ Affector {
groups: ["A"]
x: 120
width: 80
height: 80
- relative: true
once: true
position: PointDirection { x: 120; }
}
@@ -96,13 +95,12 @@ Rectangle {
height: 10
}
- Move {
+ Affector {
groups: ["B"]
x: 120
y: 240
width: 80
height: 80
- relative: true
once: true
speed: AngleDirection { angleVariation:360; magnitude: 72 }
}
@@ -123,18 +121,19 @@ Rectangle {
size: 32
sizeVariation: 8
speed: PointDirection{ x: 80; xVariation: 10 }
+ acceleration: PointDirection { y: 10; x: 20; }
width: 80
height: 80
}
- Move {
+ Affector {
groups: ["C"]
x: 120
y: 400
width: 80
- height: 80
- relative: true
+ height: 120
once: true
+ relative: false
acceleration: PointDirection { y: -80; }
}
diff --git a/src/declarative/particles/particles.pri b/src/declarative/particles/particles.pri
index 4663c17981..b35cb8a614 100644
--- a/src/declarative/particles/particles.pri
+++ b/src/declarative/particles/particles.pri
@@ -28,8 +28,7 @@ HEADERS += \
$$PWD/qsgv8particledata_p.h \
$$PWD/qsgrectangleextruder_p.h \
$$PWD/qsgparticlegroup_p.h \
- $$PWD/qsggroupgoal_p.h \
- $$PWD/qsgmove_p.h
+ $$PWD/qsggroupgoal_p.h
SOURCES += \
$$PWD/qsgangledirection.cpp \
@@ -61,8 +60,7 @@ SOURCES += \
$$PWD/qsgv8particledata.cpp \
$$PWD/qsgrectangleextruder.cpp \
$$PWD/qsgparticlegroup.cpp \
- $$PWD/qsggroupgoal.cpp \
- $$PWD/qsgmove.cpp
+ $$PWD/qsggroupgoal.cpp
RESOURCES += \
$$PWD/particles.qrc
diff --git a/src/declarative/particles/qsgcustomaffector.cpp b/src/declarative/particles/qsgcustomaffector.cpp
index 28b220d45c..e8a1507e99 100644
--- a/src/declarative/particles/qsgcustomaffector.cpp
+++ b/src/declarative/particles/qsgcustomaffector.cpp
@@ -46,7 +46,7 @@
#include <QDebug>
QT_BEGIN_NAMESPACE
-//TODO: Move docs (and inherit) to real base when docs can propagate
+//TODO: Move docs (and inheritence) to real base when docs can propagate. Currently this pretends to be the base class!
/*!
\qmlsignal QtQuick.Particles2::Affector::affectParticles(Array particles, real dt)
@@ -59,8 +59,44 @@ QT_BEGIN_NAMESPACE
Note that JS is slower to execute, so it is not recommended to use this in
high-volume particle systems.
*/
+
+/*!
+ \qmlproperty StochasticDirection QtQuick.Particles2::Affector::position
+
+ Affected particles will have their position set to this direction,
+ relative to the ParticleSystem. When interpreting directions as points,
+ imagine it as an arrow with the base at the 0,0 of the ParticleSystem and the
+ tip at where the specified position will be.
+*/
+
+/*!
+ \qmlproperty StochasticDirection QtQuick.Particles2::Affector::speed
+
+ Affected particles will have their speed set to this direction.
+*/
+
+
+/*!
+ \qmlproperty StochasticDirection QtQuick.Particles2::Affector::acceleration
+
+ Affected particles will have their acceleration set to this direction.
+*/
+
+
+/*!
+ \qmlproperty bool QtQuick.Particles2::Affector::relative
+
+ Whether the affected particles have their existing position/speed/acceleration added
+ to the new one.
+
+ Default is true.
+*/
QSGCustomAffector::QSGCustomAffector(QQuickItem *parent) :
QSGParticleAffector(parent)
+ , m_position(&m_nullVector)
+ , m_speed(&m_nullVector)
+ , m_acceleration(&m_nullVector)
+ , m_relative(true)
{
}
@@ -90,6 +126,9 @@ void QSGCustomAffector::affectSystem(qreal dt)
if (toAffect.isEmpty())
return;
+ if (m_onceOff)
+ dt = 1.0;
+
v8::HandleScope handle_scope;
v8::Context::Scope scope(QDeclarativeEnginePrivate::getV8Engine(qmlEngine(this))->context());
v8::Handle<v8::Array> array = v8::Array::New(toAffect.size());
@@ -97,6 +136,7 @@ void QSGCustomAffector::affectSystem(qreal dt)
array->Set(i, toAffect[i]->v8Value().toHandle());
if (dt >= simulationCutoff || dt <= simulationDelta) {
+ affectProperties(toAffect, dt);
emit affectParticles(QDeclarativeV8Handle::fromHandle(array), dt);
} else {
int realTime = m_system->timeInt;
@@ -104,10 +144,12 @@ void QSGCustomAffector::affectSystem(qreal dt)
while (dt > simulationDelta) {
m_system->timeInt += simulationDelta * 1000.0;
dt -= simulationDelta;
+ affectProperties(toAffect, simulationDelta);
emit affectParticles(QDeclarativeV8Handle::fromHandle(array), simulationDelta);
}
m_system->timeInt = realTime;
if (dt > 0.0) {
+ affectProperties(toAffect, dt);
emit affectParticles(QDeclarativeV8Handle::fromHandle(array), dt);
}
}
@@ -117,4 +159,53 @@ void QSGCustomAffector::affectSystem(qreal dt)
postAffect(d);
}
+bool QSGCustomAffector::affectParticle(QSGParticleData *d, qreal dt)
+{
+ //This does the property based affecting, called by superclass if signal isn't hooked up.
+ bool changed = false;
+ QPointF curPos(d->curX(), d->curY());
+
+ if (m_acceleration != &m_nullVector){
+ QPointF pos = m_acceleration->sample(curPos);
+ if (m_relative) {
+ pos *= dt;
+ pos += QPointF(d->curAX(), d->curAY());
+ }
+ d->setInstantaneousAX(pos.x());
+ d->setInstantaneousAY(pos.y());
+ changed = true;
+ }
+
+ if (m_speed != &m_nullVector){
+ QPointF pos = m_speed->sample(curPos);
+ if (m_relative) {
+ pos *= dt;
+ pos += QPointF(d->curVX(), d->curVY());
+ }
+ d->setInstantaneousVX(pos.x());
+ d->setInstantaneousVY(pos.y());
+ changed = true;
+ }
+
+ if (m_position != &m_nullVector){
+ QPointF pos = m_position->sample(curPos);
+ if (m_relative) {
+ pos *= dt;
+ pos += curPos;
+ }
+ d->setInstantaneousX(pos.x());
+ d->setInstantaneousY(pos.y());
+ changed = true;
+ }
+
+ return changed;
+}
+
+void QSGCustomAffector::affectProperties(const QList<QSGParticleData*> particles, qreal dt)
+{
+ foreach (QSGParticleData* d, particles)
+ if ( affectParticle(d, dt) )
+ d->update = 1.0;
+}
+
QT_END_NAMESPACE
diff --git a/src/declarative/particles/qsgcustomaffector_p.h b/src/declarative/particles/qsgcustomaffector_p.h
index 679034e602..ed711b6c95 100644
--- a/src/declarative/particles/qsgcustomaffector_p.h
+++ b/src/declarative/particles/qsgcustomaffector_p.h
@@ -46,6 +46,7 @@
#include "qsgparticlesystem_p.h"
#include "qsgparticleextruder_p.h"
#include "qsgparticleaffector_p.h"
+#include "qsgdirection_p.h"
QT_BEGIN_HEADER
@@ -56,17 +57,106 @@ QT_MODULE(Declarative)
class QSGCustomAffector : public QSGParticleAffector
{
Q_OBJECT
+ Q_PROPERTY(bool relative READ relative WRITE setRelative NOTIFY relativeChanged)
+ Q_PROPERTY(QSGDirection *position READ position WRITE setPosition NOTIFY positionChanged RESET positionReset)
+ Q_PROPERTY(QSGDirection *speed READ speed WRITE setSpeed NOTIFY speedChanged RESET speedReset)
+ Q_PROPERTY(QSGDirection *acceleration READ acceleration WRITE setAcceleration NOTIFY accelerationChanged RESET accelerationReset)
public:
explicit QSGCustomAffector(QQuickItem *parent = 0);
virtual void affectSystem(qreal dt);
+ QSGDirection * position() const
+ {
+ return m_position;
+ }
+
+ QSGDirection * speed() const
+ {
+ return m_speed;
+ }
+
+ QSGDirection * acceleration() const
+ {
+ return m_acceleration;
+ }
+
+ void positionReset()
+ {
+ m_position = &m_nullVector;
+ }
+
+ void speedReset()
+ {
+ m_speed = &m_nullVector;
+ }
+
+ void accelerationReset()
+ {
+ m_acceleration = &m_nullVector;
+ }
+
+ bool relative() const
+ {
+ return m_relative;
+ }
+
+
signals:
void affectParticles(QDeclarativeV8Handle particles, qreal dt);
+
+ void positionChanged(QSGDirection * arg);
+
+ void speedChanged(QSGDirection * arg);
+
+ void accelerationChanged(QSGDirection * arg);
+
+ void relativeChanged(bool arg);
+
public slots:
+ void setPosition(QSGDirection * arg)
+ {
+ if (m_position != arg) {
+ m_position = arg;
+ emit positionChanged(arg);
+ }
+ }
+
+ void setSpeed(QSGDirection * arg)
+ {
+ if (m_speed != arg) {
+ m_speed = arg;
+ emit speedChanged(arg);
+ }
+ }
+
+ void setAcceleration(QSGDirection * arg)
+ {
+ if (m_acceleration != arg) {
+ m_acceleration = arg;
+ emit accelerationChanged(arg);
+ }
+ }
+
+ void setRelative(bool arg)
+ {
+ if (m_relative != arg) {
+ m_relative = arg;
+ emit relativeChanged(arg);
+ }
+ }
+
protected:
bool isAffectConnected();
+ virtual bool affectParticle(QSGParticleData *d, qreal dt);
private:
+ void affectProperties(const QList<QSGParticleData*> particles, qreal dt);
+ QSGDirection * m_position;
+ QSGDirection * m_speed;
+ QSGDirection * m_acceleration;
+
+ QSGDirection m_nullVector;
+ bool m_relative;
};
QT_END_NAMESPACE
diff --git a/src/declarative/particles/qsggravity.cpp b/src/declarative/particles/qsggravity.cpp
index 2967f7a307..8f6b221387 100644
--- a/src/declarative/particles/qsggravity.cpp
+++ b/src/declarative/particles/qsggravity.cpp
@@ -78,8 +78,6 @@ QSGGravityAffector::QSGGravityAffector(QQuickItem *parent) :
connect(this, SIGNAL(angleChanged(qreal)),
this, SLOT(recalc()));
recalc();
- qWarning() << "Gravity has been deprecated. Use Move instead."
- << "The difference is that you can specify the acceleration with a StochasticDirection instead of just an angle/magnitude pair";
}
void QSGGravityAffector::recalc()
diff --git a/src/declarative/particles/qsgmove.cpp b/src/declarative/particles/qsgmove.cpp
deleted file mode 100644
index 9f13fad093..0000000000
--- a/src/declarative/particles/qsgmove.cpp
+++ /dev/null
@@ -1,131 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the Declarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this
-** file. Please review the following information to ensure the GNU Lesser
-** General Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qsgmove_p.h"
-#include <cmath>
-QT_BEGIN_NAMESPACE
-const qreal CONV = 0.017453292520444443;
-/*!
- \qmlclass Move QSGMoveAffector
- \inqmlmodule QtQuick.Particles 2
- \inherits Affector
- \brief The Move element allows you to set a new position, speed or acceleration on particles
-
- You'll often want to set the 'once' property to true for efficiency in the case where you just
- want to set the parameter. Otherwise, the parameter will be needlessly set to the same thing
- every simulation cycle.
-*/
-
-/*!
- \qmlproperty StochasticDirection QtQuick.Particles2::Move::position
-
- Affected particles will have their position set to this direction,
- relative to the ParticleSystem. When interpreting directions as points,
- imagine it as an arrow with the base at the 0,0 of the ParticleSystem and the
- tip at where the specified position will be.
-*/
-
-/*!
- \qmlproperty StochasticDirection QtQuick.Particles2::Move::speed
-
- Affected particles will have their speed set to this direction.
-*/
-
-
-/*!
- \qmlproperty StochasticDirection QtQuick.Particles2::Move::acceleration
-
- Affected particles will have their acceleration set to this direction.
-*/
-
-
-/*!
- \qmlproperty bool QtQuick.Particles2::Move::relative
-
- Whether the affected particles have their existing position/speed/acceleration added
- to the new one.
-*/
-
-QSGMoveAffector::QSGMoveAffector(QQuickItem *parent)
- : QSGParticleAffector(parent)
- , m_position(&m_nullVector)
- , m_speed(&m_nullVector)
- , m_acceleration(&m_nullVector)
- , m_relative(false)
-{
-}
-
-bool QSGMoveAffector::affectParticle(QSGParticleData *d, qreal dt)
-{
- Q_UNUSED(dt);
- bool changed = false;
- QPointF curPos(d->curX(), d->curY());
-
- if (m_position != &m_nullVector){
- QPointF pos = m_position->sample(curPos);
- if (m_relative)
- pos += curPos;
- d->setInstantaneousX(pos.x());
- d->setInstantaneousY(pos.y());
- changed = true;
- }
-
- if (m_speed != &m_nullVector){
- QPointF pos = m_speed->sample(curPos);
- if (m_relative)
- pos += QPointF(d->curVX(), d->curVY());
- d->setInstantaneousVX(pos.x());
- d->setInstantaneousVY(pos.y());
- changed = true;
- }
-
- if (m_acceleration != &m_nullVector){
- QPointF pos = m_acceleration->sample(curPos);
- if (m_relative)
- pos += QPointF(d->curAX(), d->curAY());
- d->setInstantaneousAX(pos.x());
- d->setInstantaneousAY(pos.y());
- changed = true;
- }
-
- return changed;
-}
-QT_END_NAMESPACE
diff --git a/src/declarative/particles/qsgmove_p.h b/src/declarative/particles/qsgmove_p.h
deleted file mode 100644
index 4ff5239357..0000000000
--- a/src/declarative/particles/qsgmove_p.h
+++ /dev/null
@@ -1,155 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the Declarative module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this
-** file. Please review the following information to ensure the GNU Lesser
-** General Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef MOVEAFFECTOR_H
-#define MOVEAFFECTOR_H
-#include "qsgparticleaffector_p.h"
-#include "qsgdirection_p.h"
-
-QT_BEGIN_HEADER
-
-QT_BEGIN_NAMESPACE
-
-QT_MODULE(Declarative)
-
-
-class QSGMoveAffector : public QSGParticleAffector
-{
- Q_OBJECT
- Q_PROPERTY(bool relative READ relative WRITE setRelative NOTIFY relativeChanged)
- Q_PROPERTY(QSGDirection *position READ position WRITE setPosition NOTIFY positionChanged RESET positionReset)
- Q_PROPERTY(QSGDirection *speed READ speed WRITE setSpeed NOTIFY speedChanged RESET speedReset)
- Q_PROPERTY(QSGDirection *acceleration READ acceleration WRITE setAcceleration NOTIFY accelerationChanged RESET accelerationReset)
-
-public:
- explicit QSGMoveAffector(QQuickItem *parent = 0);
- QSGDirection * position() const
- {
- return m_position;
- }
-
- QSGDirection * speed() const
- {
- return m_speed;
- }
-
- QSGDirection * acceleration() const
- {
- return m_acceleration;
- }
-
- void positionReset()
- {
- m_position = &m_nullVector;
- }
-
- void speedReset()
- {
- m_speed = &m_nullVector;
- }
-
- void accelerationReset()
- {
- m_acceleration = &m_nullVector;
- }
-
- bool relative() const
- {
- return m_relative;
- }
-
-protected:
- virtual bool affectParticle(QSGParticleData *d, qreal dt);
-signals:
- void positionChanged(QSGDirection * arg);
-
- void speedChanged(QSGDirection * arg);
-
- void accelerationChanged(QSGDirection * arg);
-
- void relativeChanged(bool arg);
-
-public slots:
- void setPosition(QSGDirection * arg)
- {
- if (m_position != arg) {
- m_position = arg;
- emit positionChanged(arg);
- }
- }
-
- void setSpeed(QSGDirection * arg)
- {
- if (m_speed != arg) {
- m_speed = arg;
- emit speedChanged(arg);
- }
- }
-
- void setAcceleration(QSGDirection * arg)
- {
- if (m_acceleration != arg) {
- m_acceleration = arg;
- emit accelerationChanged(arg);
- }
- }
-
- void setRelative(bool arg)
- {
- if (m_relative != arg) {
- m_relative = arg;
- emit relativeChanged(arg);
- }
- }
-
-private slots:
-private:
- QSGDirection * m_position;
- QSGDirection * m_speed;
- QSGDirection * m_acceleration;
-
- QSGDirection m_nullVector;
- bool m_relative;
-};
-
-QT_END_NAMESPACE
-QT_END_HEADER
-#endif // MOVEAFFECTOR_H
diff --git a/src/declarative/particles/qsgparticleaffector.cpp b/src/declarative/particles/qsgparticleaffector.cpp
index e31f8ff89c..9d633aa900 100644
--- a/src/declarative/particles/qsgparticleaffector.cpp
+++ b/src/declarative/particles/qsgparticleaffector.cpp
@@ -99,7 +99,9 @@ QT_BEGIN_NAMESPACE
/*!
\qmlproperty bool QtQuick.Particles2::Affector::once
If once is set to true, this affector will only affect each particle
- once in their lifetimes.
+ once in their lifetimes. If the affector normally simulates a continuous
+ effect over time, then it will simulate the effect of one second of time
+ the one instant it affects the particle.
Default value is false.
*/
@@ -137,8 +139,8 @@ QT_BEGIN_NAMESPACE
x,y is the particles current position.
*/
QSGParticleAffector::QSGParticleAffector(QQuickItem *parent) :
- QQuickItem(parent), m_needsReset(false), m_ignoresTime(false), m_system(0), m_enabled(true)
- , m_updateIntSet(false), m_shape(new QSGParticleExtruder(this))
+ QQuickItem(parent), m_needsReset(false), m_ignoresTime(false), m_onceOff(false), m_enabled(true)
+ , m_system(0), m_updateIntSet(false), m_shape(new QSGParticleExtruder(this))
{
}
@@ -196,7 +198,7 @@ void QSGParticleAffector::postAffect(QSGParticleData* d)
}
const qreal QSGParticleAffector::simulationDelta = 0.020;
-const qreal QSGParticleAffector::simulationCutoff = 1.000;
+const qreal QSGParticleAffector::simulationCutoff = 1.000;//If this goes above 1.0, then m_once behaviour needs special codepath
void QSGParticleAffector::affectSystem(qreal dt)
{
@@ -205,6 +207,8 @@ void QSGParticleAffector::affectSystem(qreal dt)
//If not reimplemented, calls affectParticle per particle
//But only on particles in targeted system/area
updateOffsets();//### Needed if an ancestor is transformed.
+ if (m_onceOff)
+ dt = 1.0;
foreach (QSGParticleGroupData* gd, m_system->groupData) {
if (activeGroup(m_system->groupData.key(gd))) {
foreach (QSGParticleData* d, gd->data) {
diff --git a/src/declarative/particles/qsgparticleaffector_p.h b/src/declarative/particles/qsgparticleaffector_p.h
index 10c1cf095a..b7fef2e226 100644
--- a/src/declarative/particles/qsgparticleaffector_p.h
+++ b/src/declarative/particles/qsgparticleaffector_p.h
@@ -169,14 +169,16 @@ public slots:
protected:
friend class QSGParticleSystem;
virtual bool affectParticle(QSGParticleData *d, qreal dt);
- bool m_needsReset;//### What is this really saving?
- bool m_ignoresTime;
+ bool m_needsReset:1;//### What is this really saving?
+ bool m_ignoresTime:1;
+ bool m_onceOff:1;
+ bool m_enabled:1;
+
QSGParticleSystem* m_system;
QStringList m_groups;
bool activeGroup(int g);
bool shouldAffect(QSGParticleData* datum);//Call to do the logic on whether it is affecting that datum
void postAffect(QSGParticleData* datum);//Call to do the post-affect logic on particles which WERE affected(once off, needs reset, affected signal)
- bool m_enabled;
virtual void componentComplete();
QPointF m_offset;
bool isAffectedConnected();
@@ -187,8 +189,6 @@ private:
QSet<QPair<int, int> > m_onceOffed;
bool m_updateIntSet;
- bool m_onceOff;
-
QSGParticleExtruder* m_shape;
QStringList m_whenCollidingWith;
diff --git a/src/declarative/particles/qsgparticlesmodule.cpp b/src/declarative/particles/qsgparticlesmodule.cpp
index 6e170b1e1c..f9a457bce1 100644
--- a/src/declarative/particles/qsgparticlesmodule.cpp
+++ b/src/declarative/particles/qsgparticlesmodule.cpp
@@ -68,7 +68,6 @@
#include "qsgrectangleextruder_p.h"
#include "qsgparticlegroup_p.h"
#include "qsggroupgoal_p.h"
-#include "qsgmove_p.h"
QT_BEGIN_NAMESPACE
@@ -105,7 +104,6 @@ void QSGParticlesModule::defineModule()
qmlRegisterType<QSGSpriteGoalAffector>(uri, 2, 0, "SpriteGoal");
qmlRegisterType<QSGGroupGoalAffector>(uri, 2, 0, "GroupGoal");
qmlRegisterType<QSGTurbulenceAffector>(uri, 2, 0 , "Turbulence");
- qmlRegisterType<QSGMoveAffector>(uri, 2, 0, "Move");
//Exposed just for completeness
qmlRegisterUncreatableType<QSGParticleAffector>(uri, 2, 0, "ParticleAffector",
diff --git a/tests/auto/particles/qsgcustomaffector/data/move.qml b/tests/auto/particles/qsgcustomaffector/data/move.qml
new file mode 100644
index 0000000000..f3d651c502
--- /dev/null
+++ b/tests/auto/particles/qsgcustomaffector/data/move.qml
@@ -0,0 +1,74 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import QtQuick 2.0
+import QtQuick.Particles 2.0
+
+Rectangle {
+ color: "black"
+ width: 320
+ height: 320
+
+ ParticleSystem {
+ id: sys
+ objectName: "system"
+ anchors.fill: parent
+
+ ImageParticle {
+ source: "../../shared/star.png"
+ }
+
+ Emitter{
+ //0,0 position
+ size: 32
+ emitRate: 1000
+ lifeSpan: 500
+ }
+
+ Affector {
+ once: false
+ relative: false
+ position: PointDirection { x: 50; y: 50; }
+ speed: PointDirection { x: 50; y: 50; }
+ acceleration: PointDirection { x: 50; y: 50; }
+ }
+ }
+}
diff --git a/tests/auto/particles/qsgcustomaffector/tst_qsgcustomaffector.cpp b/tests/auto/particles/qsgcustomaffector/tst_qsgcustomaffector.cpp
index d49f6cb908..91aa971eb7 100644
--- a/tests/auto/particles/qsgcustomaffector/tst_qsgcustomaffector.cpp
+++ b/tests/auto/particles/qsgcustomaffector/tst_qsgcustomaffector.cpp
@@ -52,6 +52,7 @@ public:
private slots:
void test_basic();
+ void test_move();
};
tst_qsgcustomaffector::tst_qsgcustomaffector()
@@ -83,6 +84,32 @@ void tst_qsgcustomaffector::test_basic()
}
}
+void tst_qsgcustomaffector::test_move()
+{
+ QQuickView* view = createView(QCoreApplication::applicationDirPath() + "/data/move.qml", 600);
+ QSGParticleSystem* system = view->rootObject()->findChild<QSGParticleSystem*>("system");
+ ensureAnimTime(600, system->m_animation);
+
+ QCOMPARE(system->groupData[0]->size(), 500);
+ foreach (QSGParticleData *d, system->groupData[0]->data) {
+ if (d->t == -1)
+ continue; //Particle data unused
+ if (!d->stillAlive())
+ continue; //parameters no longer get set once you die
+
+ QVERIFY(myFuzzyCompare(d->curX(), 50.0));
+ QVERIFY(myFuzzyCompare(d->curY(), 50.0));
+ QVERIFY(myFuzzyCompare(d->curVX(), 50.0));
+ QVERIFY(myFuzzyCompare(d->curVY(), 50.0));
+ QVERIFY(myFuzzyCompare(d->curAX(), 50.0));
+ QVERIFY(myFuzzyCompare(d->curAY(), 50.0));
+ QCOMPARE(d->lifeSpan, 0.5f);
+ QCOMPARE(d->size, 32.f);
+ QCOMPARE(d->endSize, 32.f);
+ QVERIFY(myFuzzyLEQ(d->t, ((qreal)system->timeInt/1000.0)));
+ }
+}
+
QTEST_MAIN(tst_qsgcustomaffector);
#include "tst_qsgcustomaffector.moc"