std::set<std::pair<Socket*, Joint*>> Skeleton::socketJoints() const { if (_bones.size() == 0) return std::set<std::pair<Socket*, Joint*>>(); Bone* root = *_bones.begin(); std::set<std::pair<Socket*, Joint*>> socketJoints; std::set<Bone*> visitedBones({ root }); std::vector<Bone*> boneStack({ root }); do { Bone* bone = boneStack.back(); boneStack.pop_back(); for (auto connection : bone->connections()) { Bone* opposingBone = connection->opposingBone(); if (opposingBone == NULL) continue; socketJoints.insert(connection->socketJoint()); if (visitedBones.find(opposingBone) == visitedBones.end()) { visitedBones.insert(opposingBone); boneStack.push_back(opposingBone); } } } while (boneStack.size() > 0); return socketJoints; }
std::vector<SkeletonComponent*> Skeleton::getAllComponents() const { if (_bones.size() == 0) return std::vector<SkeletonComponent*>(); Bone* root = *_bones.begin(); std::vector<SkeletonComponent*> components; std::set<Bone*> visitedBones; std::vector<Bone*> boneStack({ root }); do { Bone* bone = boneStack.back(); boneStack.pop_back(); visitedBones.insert(bone); components.push_back(bone); for (auto connection : bone->connections()) { components.push_back(connection); Bone* opposingBone = connection->opposingBone(); if (opposingBone == NULL) continue; if (visitedBones.find(opposingBone) == visitedBones.end()) { boneStack.push_back(opposingBone); } } } while (boneStack.size() > 0); return components; }