diff options
author | Sean Harmer <sean.harmer@kdab.com> | 2017-03-16 13:26:41 +0000 |
---|---|---|
committer | Sean Harmer <sean.harmer@kdab.com> | 2017-03-25 08:07:15 +0000 |
commit | c7d15b7c5e044f40167f4a79be8bf4f569c6b8be (patch) | |
tree | 6379fbcb58408b2b7657081d3545a320148f966b /src/animation | |
parent | b2a274103eff2a684f0aa91c7f18ee8b358d6dd1 (diff) |
Add function to recursively calculate duration of a blend tree
The resulting duration is independent of which animators the blend
tree is associated with so this can be implemented as a simple set
of virtual functions in the concrete classes.
The value node simply returns the duration of the contained clip; the
additive node returns the duration of the base node; and the lerp node
lerps the durations of the start and end nodes.
Change-Id: Ib6edea3fa495885493fa72d44437fea5a8c5a446
Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
Reviewed-by: Mike Krus <mike.krus@kdab.com>
Diffstat (limited to 'src/animation')
-rw-r--r-- | src/animation/backend/additiveclipblend_p.h | 7 | ||||
-rw-r--r-- | src/animation/backend/clipblendnode.cpp | 5 | ||||
-rw-r--r-- | src/animation/backend/clipblendnode_p.h | 3 | ||||
-rw-r--r-- | src/animation/backend/clipblendvalue.cpp | 9 | ||||
-rw-r--r-- | src/animation/backend/clipblendvalue_p.h | 2 | ||||
-rw-r--r-- | src/animation/backend/lerpclipblend.cpp | 11 | ||||
-rw-r--r-- | src/animation/backend/lerpclipblend_p.h | 2 |
7 files changed, 34 insertions, 5 deletions
diff --git a/src/animation/backend/additiveclipblend_p.h b/src/animation/backend/additiveclipblend_p.h index d8f3f36c9..8ac53d364 100644 --- a/src/animation/backend/additiveclipblend_p.h +++ b/src/animation/backend/additiveclipblend_p.h @@ -79,6 +79,13 @@ public: return { m_baseClipId, m_additiveClipId }; } + inline double duration() const Q_DECL_OVERRIDE + { + ClipBlendNode *node = clipBlendNodeManager()->lookupNode(m_baseClipId); + Q_ASSERT(node); + return node->duration(); + } + private: void initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) Q_DECL_FINAL; diff --git a/src/animation/backend/clipblendnode.cpp b/src/animation/backend/clipblendnode.cpp index 745a7a27b..18d57b0c7 100644 --- a/src/animation/backend/clipblendnode.cpp +++ b/src/animation/backend/clipblendnode.cpp @@ -106,10 +106,7 @@ void ClipBlendNode::setClipBlendNodeManager(ClipBlendNodeManager *manager) m_manager = manager; } -ClipBlendNodeManager *ClipBlendNode::clipBlendNodeManager() const -{ - return m_manager; -} + void ClipBlendNode::initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) { diff --git a/src/animation/backend/clipblendnode_p.h b/src/animation/backend/clipblendnode_p.h index 538009dc3..4784c81a7 100644 --- a/src/animation/backend/clipblendnode_p.h +++ b/src/animation/backend/clipblendnode_p.h @@ -73,8 +73,8 @@ public: }; void setClipBlendNodeManager(ClipBlendNodeManager *manager); + inline ClipBlendNodeManager *clipBlendNodeManager() const { return m_manager; } - ClipBlendNodeManager *clipBlendNodeManager() const; BlendType blendType() const; Qt3DCore::QNodeId parentId() const; Qt3DCore::QNodeIdVector childrenIds() const; @@ -86,6 +86,7 @@ public: ClipResults clipResults(Qt3DCore::QNodeId animatorId) const; virtual QVector<Qt3DCore::QNodeId> dependencyIds() const = 0; + virtual double duration() const = 0; protected: explicit ClipBlendNode(BlendType blendType); diff --git a/src/animation/backend/clipblendvalue.cpp b/src/animation/backend/clipblendvalue.cpp index 0607340c7..b8216ec38 100644 --- a/src/animation/backend/clipblendvalue.cpp +++ b/src/animation/backend/clipblendvalue.cpp @@ -81,6 +81,15 @@ float ClipBlendValue::blend(float value1, float value2) const return 0.0f; } +double ClipBlendValue::duration() const +{ + if (m_clipId.isNull()) + return 0.0; + AnimationClipLoader *clip = m_handler->animationClipLoaderManager()->lookupResource(m_clipId); + Q_ASSERT(clip); + return clip->duration(); +} + } // namespace Animation } // namespace Qt3DAnimation diff --git a/src/animation/backend/clipblendvalue_p.h b/src/animation/backend/clipblendvalue_p.h index ea5141553..a50bd8e9a 100644 --- a/src/animation/backend/clipblendvalue_p.h +++ b/src/animation/backend/clipblendvalue_p.h @@ -72,6 +72,8 @@ public: return { m_clipId }; } + double duration() const Q_DECL_OVERRIDE; + private: void initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) Q_DECL_FINAL; diff --git a/src/animation/backend/lerpclipblend.cpp b/src/animation/backend/lerpclipblend.cpp index 7e10a5174..7b1efbf50 100644 --- a/src/animation/backend/lerpclipblend.cpp +++ b/src/animation/backend/lerpclipblend.cpp @@ -85,6 +85,17 @@ void LerpClipBlend::initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr m_blendFactor = cloneData.blendFactor; } +double LerpClipBlend::duration() const +{ + ClipBlendNode *startNode = clipBlendNodeManager()->lookupNode(m_startClipId); + const double startNodeDuration = startNode ? startNode->duration() : 0.0; + + ClipBlendNode *endNode = clipBlendNodeManager()->lookupNode(m_endClipId); + const double endNodeDuration = endNode ? endNode->duration() : 0.0; + + return blend(startNodeDuration, endNodeDuration); +} + } // Animation } // Qt3DAnimation diff --git a/src/animation/backend/lerpclipblend_p.h b/src/animation/backend/lerpclipblend_p.h index e3a2b4c7e..36b2c17e3 100644 --- a/src/animation/backend/lerpclipblend_p.h +++ b/src/animation/backend/lerpclipblend_p.h @@ -79,6 +79,8 @@ public: return { m_startClipId, m_endClipId }; } + double duration() const Q_DECL_OVERRIDE; + private: void initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) Q_DECL_FINAL; |