diff options
-rw-r--r-- | src/core/changes/qnodecreatedchange.cpp | 45 |
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()) { } |