diff options
author | Sean Harmer <sean.harmer@kdab.com> | 2017-08-11 10:16:07 +0100 |
---|---|---|
committer | Sean Harmer <sean.harmer@kdab.com> | 2017-08-16 13:19:35 +0000 |
commit | 2302a59c0f8eab97310ff25a7bff545fd56162c4 (patch) | |
tree | 1a528aa82d70e589189853d30a9745e4f952044d /src/render | |
parent | ebd28adaaadd82395e82281eeee21fef3a0414db (diff) |
Trigger a skeleton re-load when an inverse bind matrix changes
This is a rare operation so should not be a problem to do a full
skeleton rebuild when it happens.
Change-Id: I00c3293dfff91d99bda762051714cb9eaae2c40f
Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
Diffstat (limited to 'src/render')
-rw-r--r-- | src/render/frontend/qrenderaspect.cpp | 2 | ||||
-rw-r--r-- | src/render/geometry/joint.cpp | 16 | ||||
-rw-r--r-- | src/render/geometry/joint_p.h | 10 |
3 files changed, 21 insertions, 7 deletions
diff --git a/src/render/frontend/qrenderaspect.cpp b/src/render/frontend/qrenderaspect.cpp index 35d773304..756a0e792 100644 --- a/src/render/frontend/qrenderaspect.cpp +++ b/src/render/frontend/qrenderaspect.cpp @@ -243,7 +243,7 @@ void QRenderAspectPrivate::registerBackendTypes() q->registerBackendType<QGeometryRenderer>(QSharedPointer<Render::GeometryRendererFunctor>::create(m_renderer, m_nodeManagers->geometryRendererManager())); q->registerBackendType<Qt3DCore::QArmature>(QSharedPointer<Render::NodeFunctor<Render::Armature, Render::ArmatureManager>>::create(m_renderer)); q->registerBackendType<Qt3DCore::QSkeletonLoader>(QSharedPointer<Render::SkeletonFunctor>::create(m_renderer, m_nodeManagers->skeletonManager())); - q->registerBackendType<Qt3DCore::QJoint>(QSharedPointer<Render::JointFunctor>::create(m_renderer, m_nodeManagers->jointManager())); + q->registerBackendType<Qt3DCore::QJoint>(QSharedPointer<Render::JointFunctor>::create(m_renderer, m_nodeManagers->jointManager(), m_nodeManagers->skeletonManager())); // Textures q->registerBackendType<QAbstractTexture>(QSharedPointer<Render::TextureFunctor>::create(m_renderer, m_nodeManagers->textureManager(), m_nodeManagers->textureImageManager())); diff --git a/src/render/geometry/joint.cpp b/src/render/geometry/joint.cpp index 233cbc66c..541ab3302 100644 --- a/src/render/geometry/joint.cpp +++ b/src/render/geometry/joint.cpp @@ -55,6 +55,7 @@ Joint::Joint() : BackendNode(Qt3DCore::QBackendNode::ReadOnly) , m_localPose() , m_jointManager(nullptr) + , m_skeletonManager(nullptr) { } @@ -101,11 +102,12 @@ void Joint::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) markDirty(AbstractRenderer::JointDirty); m_jointManager->addDirtyJoint(peerId()); } else if (propertyChange->propertyName() == QByteArrayLiteral("inverseBindMatrix")) { + // Setting the inverse bind matrix should be a rare operation. Usually it is + // set once and then remains constant for the duration of the skeleton. So just + // trigger a rebuild of the skeleton's SkeletonData which will include obtaining + // the inverse bind matrix. m_inverseBindMatrix = propertyChange->value().value<QMatrix4x4>(); - markDirty(AbstractRenderer::JointDirty); - m_jointManager->addDirtyJoint(peerId()); - - // TODO: Mark just the inverse bind matrix as dirty + m_skeletonManager->addDirtySkeleton(SkeletonManager::SkeletonDataDirty, m_owningSkeleton); } // TODO: Add name property to QJoint } else if (e->type() == PropertyValueAdded) { @@ -122,9 +124,12 @@ void Joint::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) } -JointFunctor::JointFunctor(AbstractRenderer *renderer, JointManager *jointManager) +JointFunctor::JointFunctor(AbstractRenderer *renderer, + JointManager *jointManager, + SkeletonManager *skeletonManager) : m_renderer(renderer) , m_jointManager(jointManager) + , m_skeletonManager(skeletonManager) { } @@ -133,6 +138,7 @@ Qt3DCore::QBackendNode *JointFunctor::create(const Qt3DCore::QNodeCreatedChangeB Joint *backend = m_jointManager->getOrCreateResource(change->subjectId()); backend->setRenderer(m_renderer); backend->setJointManager(m_jointManager); + backend->setSkeletonManager(m_skeletonManager); return backend; } diff --git a/src/render/geometry/joint_p.h b/src/render/geometry/joint_p.h index c5b6737a1..e144ac489 100644 --- a/src/render/geometry/joint_p.h +++ b/src/render/geometry/joint_p.h @@ -61,6 +61,7 @@ namespace Qt3DRender { namespace Render { class JointManager; +class SkeletonManager; class Q_AUTOTEST_EXPORT Joint : public BackendNode { @@ -85,6 +86,9 @@ public: void setJointManager(JointManager *jointManager) { m_jointManager = jointManager; } JointManager *jointManager() const { return m_jointManager; } + void setSkeletonManager(SkeletonManager *skeletonManager) { m_skeletonManager = skeletonManager; } + SkeletonManager *skeletonManager() const { return m_skeletonManager; } + private: void initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) final; @@ -93,13 +97,16 @@ private: QVector<Qt3DCore::QNodeId> m_childJointIds; QString m_name; JointManager *m_jointManager; + SkeletonManager *m_skeletonManager; HSkeleton m_owningSkeleton; }; class JointFunctor : public Qt3DCore::QBackendNodeMapper { public: - explicit JointFunctor(AbstractRenderer *renderer, JointManager *jointManager); + explicit JointFunctor(AbstractRenderer *renderer, + JointManager *jointManager, + SkeletonManager *skeletonManager); Qt3DCore::QBackendNode *create(const Qt3DCore::QNodeCreatedChangeBasePtr &change) const final; Qt3DCore::QBackendNode *get(Qt3DCore::QNodeId id) const final; void destroy(Qt3DCore::QNodeId id) const final; @@ -107,6 +114,7 @@ public: private: AbstractRenderer *m_renderer; JointManager *m_jointManager; + SkeletonManager *m_skeletonManager; }; } // namespace Render |