==============================================================================
| 2566 | |
| 2567 | //============================================================================== |
| 2568 | std::pair<Joint*, BodyNode*> Skeleton::cloneBodyNodeTree( |
| 2569 | Joint* _parentJoint, |
| 2570 | const BodyNode* _bodyNode, |
| 2571 | const SkeletonPtr& _newSkeleton, |
| 2572 | BodyNode* _parentNode, |
| 2573 | bool _recursive) const |
| 2574 | { |
| 2575 | std::pair<Joint*, BodyNode*> root(nullptr, nullptr); |
| 2576 | std::vector<const BodyNode*> tree; |
| 2577 | if (_recursive) |
| 2578 | tree = constructBodyNodeTree(_bodyNode); |
| 2579 | else |
| 2580 | tree.push_back(_bodyNode); |
| 2581 | |
| 2582 | std::map<std::string, BodyNode*> nameMap; |
| 2583 | std::vector<BodyNode*> clones; |
| 2584 | clones.reserve(tree.size()); |
| 2585 | |
| 2586 | for (std::size_t i = 0; i < tree.size(); ++i) { |
| 2587 | const BodyNode* original = tree[i]; |
| 2588 | // If this is the root of the tree, and the user has requested a change in |
| 2589 | // its parent Joint, use the specified parent Joint instead of created a |
| 2590 | // clone |
| 2591 | Joint* joint = (i == 0 && _parentJoint != nullptr) |
| 2592 | ? _parentJoint |
| 2593 | : original->getParentJoint()->clone(); |
| 2594 | |
| 2595 | BodyNode* newParent |
| 2596 | = i == 0 ? _parentNode |
| 2597 | : nameMap[original->getParentBodyNode()->getName()]; |
| 2598 | |
| 2599 | BodyNode* clone = original->clone(newParent, joint, true); |
| 2600 | clones.push_back(clone); |
| 2601 | nameMap[clone->getName()] = clone; |
| 2602 | |
| 2603 | if (0 == i) { |
| 2604 | root.first = joint; |
| 2605 | root.second = clone; |
| 2606 | } |
| 2607 | } |
| 2608 | |
| 2609 | _newSkeleton->receiveBodyNodeTree(clones); |
| 2610 | return root; |
| 2611 | } |
| 2612 | |
| 2613 | //============================================================================== |
| 2614 | template <typename BodyNodeT> |
no test coverage detected