summaryrefslogtreecommitdiffstats
path: root/src/render
diff options
context:
space:
mode:
authorSean Harmer <sean.harmer@kdab.com>2017-08-11 10:16:07 +0100
committerSean Harmer <sean.harmer@kdab.com>2017-08-16 13:19:35 +0000
commit2302a59c0f8eab97310ff25a7bff545fd56162c4 (patch)
tree1a528aa82d70e589189853d30a9745e4f952044d /src/render
parentebd28adaaadd82395e82281eeee21fef3a0414db (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.cpp2
-rw-r--r--src/render/geometry/joint.cpp16
-rw-r--r--src/render/geometry/joint_p.h10
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