summaryrefslogtreecommitdiffstats
path: root/src/animation/backend/clipblendnodevisitor.cpp
diff options
context:
space:
mode:
authorSean Harmer <sean.harmer@kdab.com>2017-05-24 12:09:44 +0100
committerSean Harmer <sean.harmer@kdab.com>2017-05-24 12:10:02 +0100
commit77d294db076dac19e8b549b445ffede9f7260c84 (patch)
tree828ee7a6862ec5c0bd24f97cb540625a2c647376 /src/animation/backend/clipblendnodevisitor.cpp
parent59f8fec8a41606b3185fe3a4e276978e3e1ed5ef (diff)
parent939b9b4b7591e8a421cf048a0a84ed3e75d81d21 (diff)
Merge branch 'dev' into wip/animationwip/animation
Diffstat (limited to 'src/animation/backend/clipblendnodevisitor.cpp')
-rw-r--r--src/animation/backend/clipblendnodevisitor.cpp114
1 files changed, 105 insertions, 9 deletions
diff --git a/src/animation/backend/clipblendnodevisitor.cpp b/src/animation/backend/clipblendnodevisitor.cpp
index 9940bd1f8..5e63a4e79 100644
--- a/src/animation/backend/clipblendnodevisitor.cpp
+++ b/src/animation/backend/clipblendnodevisitor.cpp
@@ -41,34 +41,130 @@
QT_BEGIN_NAMESPACE
namespace Qt3DAnimation {
-
namespace Animation {
-ClipBlendNodeVisitor::ClipBlendNodeVisitor(ClipBlendNodeManager *manager)
+/*!
+ \class ClipBlendNodeVisitor
+ \internal
+ Visits a blend tree in either pre- or post-order manner, optionally taking care
+ to only visit the nodes that are dependencies of evaluating the blend
+ tree.
+*/
+ClipBlendNodeVisitor::ClipBlendNodeVisitor(ClipBlendNodeManager *manager,
+ TraversalOrder order,
+ NodeFilter filter)
: m_manager(manager)
+ , m_order(order)
+ , m_filter(filter)
{
}
-void ClipBlendNodeVisitor::traverse(Qt3DCore::QNodeId rootId, const VisitFunction &visitFunction) const
+void ClipBlendNodeVisitor::traverse(Qt3DCore::QNodeId rootId,
+ const VisitFunction &visitFunction) const
{
ClipBlendNode *node = m_manager->lookupNode(rootId);
- if (node != nullptr)
- visit(node, visitFunction);
+ if (node != nullptr) {
+ switch (m_order) {
+ case PreOrder: {
+ switch (m_filter) {
+ case VisitAllNodes:
+ visitPreOrderAllNodes(node, visitFunction);
+ break;
+
+ case VisitOnlyDependencies:
+ visitPreOrderDependencyNodes(node, visitFunction);
+ break;
+ }
+
+ break;
+ }
+
+ case PostOrder: {
+ switch (m_filter) {
+ case VisitAllNodes:
+ visitPostOrderAllNodes(node, visitFunction);
+ break;
+
+ case VisitOnlyDependencies:
+ visitPostOrderDependencyNodes(node, visitFunction);
+ break;
+ }
+
+ break;
+ }
+ }
+ }
}
-void ClipBlendNodeVisitor::visit(ClipBlendNode *node, const VisitFunction &visitFunction) const
+/*!
+ \internal
+ Leaf to root traversal (Pre-order traversal) visiting all nodes even if
+ they will not participate in current evaluation of the blend tree.
+*/
+void ClipBlendNodeVisitor::visitPreOrderAllNodes(ClipBlendNode *node,
+ const VisitFunction &visitFunction) const
{
visitFunction(node);
- const Qt3DCore::QNodeIdVector childIds = node->childrenIds();
+ const Qt3DCore::QNodeIdVector childIds = node->allDependencyIds();
for (const Qt3DCore::QNodeId childId: childIds) {
ClipBlendNode *childNode = m_manager->lookupNode(childId);
if (childNode != nullptr)
- visit(childNode, visitFunction);
+ visitPreOrderAllNodes(childNode, visitFunction);
}
}
-} // Animation
+/*!
+ \internal
+ Leaf to root traversal (Post-order traversal) visiting all nodes even if
+ they will not participate in current evaluation of the blend tree.
+*/
+void ClipBlendNodeVisitor::visitPostOrderAllNodes(ClipBlendNode *node,
+ const VisitFunction &visitFunction) const
+{
+ const Qt3DCore::QNodeIdVector childIds = node->allDependencyIds();
+ for (const Qt3DCore::QNodeId childId: childIds) {
+ ClipBlendNode *childNode = m_manager->lookupNode(childId);
+ if (childNode != nullptr)
+ visitPostOrderAllNodes(childNode, visitFunction);
+ }
+ visitFunction(node);
+}
+
+/*!
+ \internal
+ Leaf to root traversal (Pre-order traversal) visiting only nodes required
+ to evaluate the blend tree given its current state.
+*/
+void ClipBlendNodeVisitor::visitPreOrderDependencyNodes(ClipBlendNode *node,
+ const VisitFunction &visitFunction) const
+{
+ visitFunction(node);
+ const Qt3DCore::QNodeIdVector childIds = node->currentDependencyIds();
+ for (const Qt3DCore::QNodeId childId: childIds) {
+ ClipBlendNode *childNode = m_manager->lookupNode(childId);
+ if (childNode != nullptr)
+ visitPreOrderDependencyNodes(childNode, visitFunction);
+ }
+}
+
+/*!
+ \internal
+ Leaf to root traversal (Post-order traversal) visiting only nodes required
+ to evaluate the blend tree given its current state.
+*/
+void ClipBlendNodeVisitor::visitPostOrderDependencyNodes(ClipBlendNode *node,
+ const VisitFunction &visitFunction) const
+{
+ const Qt3DCore::QNodeIdVector childIds = node->currentDependencyIds();
+ for (const Qt3DCore::QNodeId childId: childIds) {
+ ClipBlendNode *childNode = m_manager->lookupNode(childId);
+ if (childNode != nullptr)
+ visitPostOrderDependencyNodes(childNode, visitFunction);
+ }
+ visitFunction(node);
+}
+} // Animation
} // Qt3DAnimation
QT_END_NAMESPACE