diff options
Diffstat (limited to 'src/quick/particles/qquickparticleaffector_p.h')
-rw-r--r-- | src/quick/particles/qquickparticleaffector_p.h | 199 |
1 files changed, 199 insertions, 0 deletions
diff --git a/src/quick/particles/qquickparticleaffector_p.h b/src/quick/particles/qquickparticleaffector_p.h new file mode 100644 index 0000000000..94eba70ae4 --- /dev/null +++ b/src/quick/particles/qquickparticleaffector_p.h @@ -0,0 +1,199 @@ +/**************************************************************************** +** +** 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 PARTICLEAFFECTOR_H +#define PARTICLEAFFECTOR_H + +#include <QObject> +#include "qquickparticlesystem_p.h" +#include "qquickparticleextruder_p.h" + +QT_BEGIN_HEADER + +QT_BEGIN_NAMESPACE + +class QQuickParticleAffector : public QQuickItem +{ + Q_OBJECT + Q_PROPERTY(QQuickParticleSystem* system READ system WRITE setSystem NOTIFY systemChanged) + Q_PROPERTY(QStringList groups READ groups WRITE setGroups NOTIFY groupsChanged) + Q_PROPERTY(QStringList whenCollidingWith READ whenCollidingWith WRITE setWhenCollidingWith NOTIFY whenCollidingWithChanged) + Q_PROPERTY(bool enabled READ enabled WRITE setEnabled NOTIFY enabledChanged) + Q_PROPERTY(bool once READ onceOff WRITE setOnceOff NOTIFY onceChanged) + Q_PROPERTY(QQuickParticleExtruder* shape READ shape WRITE setShape NOTIFY shapeChanged) + +public: + explicit QQuickParticleAffector(QQuickItem *parent = 0); + virtual void affectSystem(qreal dt); + virtual void reset(QQuickParticleData*);//As some store their own data per particle? + QQuickParticleSystem* system() const + { + return m_system; + } + + QStringList groups() const + { + return m_groups; + } + + bool enabled() const + { + return m_enabled; + } + + bool onceOff() const + { + return m_onceOff; + } + + QQuickParticleExtruder* shape() const + { + return m_shape; + } + + QStringList whenCollidingWith() const + { + return m_whenCollidingWith; + } + +signals: + + void systemChanged(QQuickParticleSystem* arg); + + void groupsChanged(QStringList arg); + + void enabledChanged(bool arg); + + void onceChanged(bool arg); + + void shapeChanged(QQuickParticleExtruder* arg); + + void affected(qreal x, qreal y); + + void whenCollidingWithChanged(QStringList arg); + +public slots: +void setSystem(QQuickParticleSystem* arg) +{ + if (m_system != arg) { + m_system = arg; + m_system->registerParticleAffector(this); + emit systemChanged(arg); + } +} + +void setGroups(QStringList arg) +{ + if (m_groups != arg) { + m_groups = arg; + m_updateIntSet = true; + emit groupsChanged(arg); + } +} + +void setEnabled(bool arg) +{ + if (m_enabled != arg) { + m_enabled = arg; + emit enabledChanged(arg); + } +} + +void setOnceOff(bool arg) +{ + if (m_onceOff != arg) { + m_onceOff = arg; + m_needsReset = true; + emit onceChanged(arg); + } +} + +void setShape(QQuickParticleExtruder* arg) +{ + if (m_shape != arg) { + m_shape = arg; + emit shapeChanged(arg); + } +} + +void setWhenCollidingWith(QStringList arg) +{ + if (m_whenCollidingWith != arg) { + m_whenCollidingWith = arg; + emit whenCollidingWithChanged(arg); + } +} +public slots: + void updateOffsets(); + +protected: + friend class QQuickParticleSystem; + virtual bool affectParticle(QQuickParticleData *d, qreal dt); + bool m_needsReset:1;//### What is this really saving? + bool m_ignoresTime:1; + bool m_onceOff:1; + bool m_enabled:1; + + QQuickParticleSystem* m_system; + QStringList m_groups; + bool activeGroup(int g); + bool shouldAffect(QQuickParticleData* datum);//Call to do the logic on whether it is affecting that datum + void postAffect(QQuickParticleData* datum);//Call to do the post-affect logic on particles which WERE affected(once off, needs reset, affected signal) + virtual void componentComplete(); + QPointF m_offset; + bool isAffectedConnected(); + static const qreal simulationDelta; + static const qreal simulationCutoff; +private: + QSet<int> m_groupIds; + QSet<QPair<int, int> > m_onceOffed; + bool m_updateIntSet; + + QQuickParticleExtruder* m_shape; + + QStringList m_whenCollidingWith; + + bool isColliding(QQuickParticleData* d); +}; + +QT_END_NAMESPACE +QT_END_HEADER +#endif // PARTICLEAFFECTOR_H |