Esempio n. 1
0
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;
}
Esempio n. 2
0
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;
}