summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/core/changes/qnodecreatedchange.cpp45
1 files changed, 44 insertions, 1 deletions
diff --git a/src/core/changes/qnodecreatedchange.cpp b/src/core/changes/qnodecreatedchange.cpp
index cb4312cb4..4845b4faf 100644
--- a/src/core/changes/qnodecreatedchange.cpp
+++ b/src/core/changes/qnodecreatedchange.cpp
@@ -38,15 +38,58 @@
#include "qnodecreatedchange_p.h"
#include <Qt3DCore/qnode.h>
#include <QtCore/qmetaobject.h>
+#include <QtCore/private/qmetaobject_p.h>
QT_BEGIN_NAMESPACE
+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);
+}
+
+/*!
+ * \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 *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 {
QNodeCreatedChangeBasePrivate::QNodeCreatedChangeBasePrivate(const QNode *node)
: QSceneChangePrivate()
, m_parentId(node->parentNode() ? node->parentNode()->id() : QNodeId())
- , m_metaObject(node->metaObject())
+ , m_metaObject(findStaticMetaObject(node->metaObject()))
, m_nodeEnabled(node->isEnabled())
{
}