summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/core/transforms/qtransform.cpp36
-rw-r--r--src/core/transforms/qtransform.h3
-rw-r--r--src/core/transforms/qtransform_p.h1
-rw-r--r--src/quick3d/quick3d/items/quick3dtransform.cpp2
-rw-r--r--src/quick3d/quick3d/items/quick3dtransform.h5
5 files changed, 38 insertions, 9 deletions
diff --git a/src/core/transforms/qtransform.cpp b/src/core/transforms/qtransform.cpp
index 6ac1403b9..0e98fdb0f 100644
--- a/src/core/transforms/qtransform.cpp
+++ b/src/core/transforms/qtransform.cpp
@@ -50,6 +50,15 @@ QTransformPrivate::QTransformPrivate(QTransform *qq)
{
}
+void QTransformPrivate::_q_transformDestroyed(QObject *obj)
+{
+ QAbstractTransform *transform = static_cast<QAbstractTransform *>(obj);
+ if (m_transforms.removeOne(transform)) {
+ emit q_func()->transformsChanged();
+ _q_update();
+ }
+}
+
void QTransformPrivate::_q_update()
{
if (!m_transformsDirty)
@@ -59,13 +68,10 @@ void QTransformPrivate::_q_update()
QMatrix4x4 QTransformPrivate::applyTransforms() const
{
- if (!m_transforms.isEmpty()) {
- QMatrix4x4 matrix;
- Q_FOREACH (const QAbstractTransform *t, m_transforms)
- matrix = t->transformMatrix() * matrix;
- return matrix;
- }
- return QMatrix4x4();
+ QMatrix4x4 matrix;
+ Q_FOREACH (const QAbstractTransform *t, m_transforms)
+ matrix = t->transformMatrix() * matrix;
+ return matrix;
}
@@ -92,6 +98,13 @@ QTransform::QTransform(QTransformPrivate &dd, QNode *parent)
{
}
+QTransform::~QTransform()
+{
+ Q_D(QTransform);
+ // boost destruction by avoiding _q_update()-s
+ d->m_transforms.clear();
+}
+
void QTransform::copy(const QNode *ref)
{
QComponent::copy(ref);
@@ -110,16 +123,23 @@ QList<QAbstractTransform *> QTransform::transforms() const
void QTransform::addTransform(QAbstractTransform *transform)
{
Q_D(QTransform);
+ if (transform == Q_NULLPTR || d->m_transforms.contains(transform))
+ return;
d->m_transforms.append(transform);
QObject::connect(transform, SIGNAL(transformMatrixChanged()), this, SLOT(_q_update()));
+ QObject::connect(transform, SIGNAL(destroyed(QObject*)), this, SLOT(_q_transformDestroyed(QObject*)));
+ emit transformsChanged();
d->_q_update();
}
void QTransform::removeTransform(QAbstractTransform *transform)
{
Q_D(QTransform);
- d->m_transforms.removeOne(transform);
+ if (!d->m_transforms.removeOne(transform))
+ return;
QObject::disconnect(transform, SIGNAL(transformMatrixChanged()), this, SLOT(_q_update()));
+ QObject::disconnect(transform, SIGNAL(destroyed(QObject*)), this, SLOT(_q_transformDestroyed(QObject*)));
+ emit transformsChanged();
d->_q_update();
}
diff --git a/src/core/transforms/qtransform.h b/src/core/transforms/qtransform.h
index 9cb8741d6..722dcf688 100644
--- a/src/core/transforms/qtransform.h
+++ b/src/core/transforms/qtransform.h
@@ -57,6 +57,7 @@ public:
explicit QTransform(QNode *parent = 0);
QTransform(QList<QAbstractTransform *> transforms, QNode *parent = 0);
QTransform(QAbstractTransform *transform, QNode *parent = 0);
+ ~QTransform();
QList<QAbstractTransform *> transforms() const;
void addTransform(QAbstractTransform *xform);
@@ -66,6 +67,7 @@ public:
Q_SIGNALS:
void matrixChanged();
+ void transformsChanged();
protected:
QTransform(QTransformPrivate &dd, QNode *parent = 0);
@@ -74,6 +76,7 @@ protected:
private:
Q_DECLARE_PRIVATE(QTransform)
QT3D_CLONEABLE(QTransform)
+ Q_PRIVATE_SLOT(d_func(), void _q_transformDestroyed(QObject *obj))
Q_PRIVATE_SLOT(d_func(), void _q_update())
};
diff --git a/src/core/transforms/qtransform_p.h b/src/core/transforms/qtransform_p.h
index c233f7ad7..ef2e86b1b 100644
--- a/src/core/transforms/qtransform_p.h
+++ b/src/core/transforms/qtransform_p.h
@@ -51,6 +51,7 @@ class QTransformPrivate : public QComponentPrivate
public:
QTransformPrivate(QTransform *qq);
+ void _q_transformDestroyed(QObject *obj);
void _q_update();
QMatrix4x4 applyTransforms() const;
diff --git a/src/quick3d/quick3d/items/quick3dtransform.cpp b/src/quick3d/quick3d/items/quick3dtransform.cpp
index 867e8bf51..b236b1dd7 100644
--- a/src/quick3d/quick3d/items/quick3dtransform.cpp
+++ b/src/quick3d/quick3d/items/quick3dtransform.cpp
@@ -46,6 +46,8 @@ namespace Quick {
Quick3DTransform::Quick3DTransform(QObject *parent)
: QObject(parent)
{
+ Q_ASSERT(qobject_cast<Qt3D::QTransform *>(parent) != Q_NULLPTR);
+ QObject::connect(parent, SIGNAL(transformsChanged()), this, SIGNAL(transformsChanged()));
}
QQmlListProperty<QAbstractTransform> Quick3DTransform::transformList()
diff --git a/src/quick3d/quick3d/items/quick3dtransform.h b/src/quick3d/quick3d/items/quick3dtransform.h
index 2d7f9aa10..57d350203 100644
--- a/src/quick3d/quick3d/items/quick3dtransform.h
+++ b/src/quick3d/quick3d/items/quick3dtransform.h
@@ -53,7 +53,7 @@ namespace Quick {
class QT3DQUICKSHARED_EXPORT Quick3DTransform : public QObject
{
Q_OBJECT
- Q_PROPERTY(QQmlListProperty<Qt3D::QAbstractTransform> transforms READ transformList)
+ Q_PROPERTY(QQmlListProperty<Qt3D::QAbstractTransform> transforms READ transformList NOTIFY transformsChanged)
Q_CLASSINFO("DefaultProperty", "transforms")
public:
explicit Quick3DTransform(QObject *parent = 0);
@@ -61,6 +61,9 @@ public:
inline QTransform *parentTransform() const { return qobject_cast<Qt3D::QTransform *>(parent()); }
+Q_SIGNALS:
+ void transformsChanged();
+
private:
static void qmlAppendTransform(QQmlListProperty<Qt3D::QAbstractTransform> *list, Qt3D::QAbstractTransform *bar);
static QAbstractTransform* transformAt(QQmlListProperty<Qt3D::QAbstractTransform> *list, int index);