diff options
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 |