diff options
author | Sean Harmer <sean.harmer@kdab.com> | 2017-05-24 12:09:44 +0100 |
---|---|---|
committer | Sean Harmer <sean.harmer@kdab.com> | 2017-05-24 12:10:02 +0100 |
commit | 77d294db076dac19e8b549b445ffede9f7260c84 (patch) | |
tree | 828ee7a6862ec5c0bd24f97cb540625a2c647376 /src/animation/backend/clipblendnodevisitor.cpp | |
parent | 59f8fec8a41606b3185fe3a4e276978e3e1ed5ef (diff) | |
parent | 939b9b4b7591e8a421cf048a0a84ed3e75d81d21 (diff) |
Merge branch 'dev' into wip/animationwip/animation
Change-Id: I6e770609c90a7745d08fa4e2f424e865678c5d6f
Diffstat (limited to 'src/animation/backend/clipblendnodevisitor.cpp')
-rw-r--r-- | src/animation/backend/clipblendnodevisitor.cpp | 114 |
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 |