summaryrefslogtreecommitdiffstats
path: root/src/animation
diff options
context:
space:
mode:
authorSean Harmer <sean.harmer@kdab.com>2017-03-16 13:26:41 +0000
committerSean Harmer <sean.harmer@kdab.com>2017-03-25 08:07:15 +0000
commitc7d15b7c5e044f40167f4a79be8bf4f569c6b8be (patch)
tree6379fbcb58408b2b7657081d3545a320148f966b /src/animation
parentb2a274103eff2a684f0aa91c7f18ee8b358d6dd1 (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.h7
-rw-r--r--src/animation/backend/clipblendnode.cpp5
-rw-r--r--src/animation/backend/clipblendnode_p.h3
-rw-r--r--src/animation/backend/clipblendvalue.cpp9
-rw-r--r--src/animation/backend/clipblendvalue_p.h2
-rw-r--r--src/animation/backend/lerpclipblend.cpp11
-rw-r--r--src/animation/backend/lerpclipblend_p.h2
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;