diff options
Diffstat (limited to 'src/core/nodes')
-rw-r--r-- | src/core/nodes/qentity.cpp | 4 | ||||
-rw-r--r-- | src/core/nodes/qnode.cpp | 43 | ||||
-rw-r--r-- | src/core/nodes/qnode_p.h | 2 |
3 files changed, 47 insertions, 2 deletions
diff --git a/src/core/nodes/qentity.cpp b/src/core/nodes/qentity.cpp index ea3523c0c..b28898c60 100644 --- a/src/core/nodes/qentity.cpp +++ b/src/core/nodes/qentity.cpp @@ -232,8 +232,8 @@ QNodeCreatedChangeBasePtr QEntity::createNodeCreationChange() const data.parentEntityId = parentEntity() ? parentEntity()->id() : Qt3DCore::QNodeId(); data.componentIdsAndTypes.reserve(d->m_components.size()); const QComponentVector &components = d->m_components; - for (const auto &c : components) { - const auto idAndType = QNodeIdTypePair(c->id(), c->metaObject()); + for (QComponent *c : components) { + const auto idAndType = QNodeIdTypePair(c->id(), QNodePrivate::findStaticMetaObject(c->metaObject())); data.componentIdsAndTypes.push_back(idAndType); } diff --git a/src/core/nodes/qnode.cpp b/src/core/nodes/qnode.cpp index f0df147ab..8dbcb295a 100644 --- a/src/core/nodes/qnode.cpp +++ b/src/core/nodes/qnode.cpp @@ -54,6 +54,7 @@ #include <QChildEvent> #include <QMetaObject> #include <QMetaProperty> +#include <QtCore/private/qmetaobject_p.h> #include <Qt3DCore/QComponent> #include <Qt3DCore/private/corelogging_p.h> #include <Qt3DCore/private/qnodecreatedchangegenerator_p.h> @@ -793,6 +794,48 @@ QNodeCreatedChangeBasePtr QNode::createNodeCreationChange() const return QNodeCreatedChangeBasePtr::create(this); } +namespace { + +/*! \internal */ +inline const QMetaObjectPrivate *priv(const uint* data) +{ + return reinterpret_cast<const QMetaObjectPrivate*>(data); +} + +/*! \internal */ +inline bool isDynamicMetaObject(const QMetaObject *mo) +{ + return (priv(mo->d.data)->flags & DynamicMetaObject); +} + +} // anonymous + +/*! + * \internal + * + * Find the most derived metaobject that doesn't have a dynamic + * metaobject farther up the chain. + * TODO: Add support to QMetaObject to explicitly say if it's a dynamic + * or static metaobject so we don't need this logic + */ +const QMetaObject *QNodePrivate::findStaticMetaObject(const QMetaObject *metaObject) +{ + const QMetaObject *lastStaticMetaobject = nullptr; + auto mo = metaObject; + while (mo) { + const bool dynamicMetaObject = isDynamicMetaObject(mo); + if (dynamicMetaObject) + lastStaticMetaobject = nullptr; + + if (!dynamicMetaObject && !lastStaticMetaobject) + lastStaticMetaobject = mo; + + mo = mo->superClass(); + } + Q_ASSERT(lastStaticMetaobject); + return lastStaticMetaobject; +} + } // namespace Qt3DCore QT_END_NAMESPACE diff --git a/src/core/nodes/qnode_p.h b/src/core/nodes/qnode_p.h index 56a54a8ae..dec114084 100644 --- a/src/core/nodes/qnode_p.h +++ b/src/core/nodes/qnode_p.h @@ -130,6 +130,8 @@ public: QObject::disconnect(m_destructionConnections.take(node)); } + static const QMetaObject *findStaticMetaObject(const QMetaObject *metaObject); + private: void notifyCreationChange(); void notifyDestructionChangesAndRemoveFromScene(); |