diff options
author | Mike Krus <mike.krus@kdab.com> | 2019-10-24 14:59:58 +0100 |
---|---|---|
committer | Mike Krus <mike.krus@kdab.com> | 2019-10-25 10:58:24 +0100 |
commit | c48a542f685a2b73333ea340ea629d2827ccdc1d (patch) | |
tree | d35a332eec3951677b03a3d8416c71e0dedbb8a5 | |
parent | 0d5f53df8ad7e2e20fcefb35272d1a4b31a5c036 (diff) | |
download | qt3d-c48a542f685a2b73333ea340ea629d2827ccdc1d.tar.gz |
Fix skeleton loading
Set the nodes created on the backend properly (assigning parent) so
that the backend nodes get created before the second round of updates.
Change-Id: Ia8ac9aacfc6bdb8938d07dbf714d471b5ddc4999
Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
-rw-r--r-- | src/core/transforms/qskeletonloader.cpp | 38 | ||||
-rw-r--r-- | src/core/transforms/qskeletonloader_p.h | 1 | ||||
-rw-r--r-- | src/render/jobs/loadskeletonjob.cpp | 2 |
3 files changed, 24 insertions, 17 deletions
diff --git a/src/core/transforms/qskeletonloader.cpp b/src/core/transforms/qskeletonloader.cpp index b8cd6e29b..b1a311a0c 100644 --- a/src/core/transforms/qskeletonloader.cpp +++ b/src/core/transforms/qskeletonloader.cpp @@ -68,6 +68,27 @@ void QSkeletonLoaderPrivate::setStatus(QSkeletonLoader::Status status) } } +void QSkeletonLoaderPrivate::setRootJoint(QJoint *rootJoint) +{ + Q_Q(QSkeletonLoader); + if (rootJoint == m_rootJoint) + return; + + if (m_rootJoint) + unregisterDestructionHelper(m_rootJoint); + + if (rootJoint && !rootJoint->parent()) + rootJoint->setParent(q); + + m_rootJoint = rootJoint; + + // Ensures proper bookkeeping + if (m_rootJoint) + registerPrivateDestructionHelper(m_rootJoint, &QSkeletonLoaderPrivate::setRootJoint); + + emit q->rootJointChanged(m_rootJoint); +} + /*! \qmltype SkeletonLoader \inqmlmodule Qt3D.Core @@ -217,22 +238,7 @@ void QSkeletonLoader::setCreateJointsEnabled(bool createJoints) void QSkeletonLoader::setRootJoint(QJoint *rootJoint) { Q_D(QSkeletonLoader); - if (rootJoint == d->m_rootJoint) - return; - - if (d->m_rootJoint) - d->unregisterDestructionHelper(d->m_rootJoint); - - if (rootJoint && !rootJoint->parent()) - rootJoint->setParent(this); - - d->m_rootJoint = rootJoint; - - // Ensures proper bookkeeping - if (d->m_rootJoint) - d->registerDestructionHelper(d->m_rootJoint, &QSkeletonLoader::setRootJoint, d->m_rootJoint); - - emit rootJointChanged(d->m_rootJoint); + d->setRootJoint(rootJoint); } /*! \internal */ diff --git a/src/core/transforms/qskeletonloader_p.h b/src/core/transforms/qskeletonloader_p.h index 5c415745b..6bd4e1eef 100644 --- a/src/core/transforms/qskeletonloader_p.h +++ b/src/core/transforms/qskeletonloader_p.h @@ -70,6 +70,7 @@ public: QSkeletonLoaderPrivate(); void setStatus(QSkeletonLoader::Status status); + void setRootJoint(QJoint *rootJoint); Q_DECLARE_PUBLIC(QSkeletonLoader) diff --git a/src/render/jobs/loadskeletonjob.cpp b/src/render/jobs/loadskeletonjob.cpp index ddd59f5d7..6f7bcd9b7 100644 --- a/src/render/jobs/loadskeletonjob.cpp +++ b/src/render/jobs/loadskeletonjob.cpp @@ -288,7 +288,7 @@ void LoadSkeletonJobPrivate::postFrame(Qt3DCore::QAspectManager *manager) dloaderNode->setStatus(m_backendSkeleton->status()); if (m_loadedRootJoint) { - dloaderNode->m_rootJoint = m_loadedRootJoint; + dloaderNode->setRootJoint(m_loadedRootJoint); m_loadedRootJoint = nullptr; } } |