summaryrefslogtreecommitdiffstats
path: root/src/core/nodes
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/nodes')
-rw-r--r--src/core/nodes/qentity.cpp4
-rw-r--r--src/core/nodes/qnode.cpp43
-rw-r--r--src/core/nodes/qnode_p.h2
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();