diff options
-rw-r--r-- | src/core/transforms/qtransform.cpp | 36 | ||||
-rw-r--r-- | src/core/transforms/qtransform.h | 3 | ||||
-rw-r--r-- | src/core/transforms/qtransform_p.h | 1 | ||||
-rw-r--r-- | src/quick3d/quick3d/items/quick3dtransform.cpp | 2 | ||||
-rw-r--r-- | src/quick3d/quick3d/items/quick3dtransform.h | 5 |
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); |