void Skeleton::_relate() { for (BoneNodeMap::iterator it = _boneNodes.begin(); it != _boneNodes.end(); ++it) { BoneNode* node = it->second; if (node) { Bone* bone = node->getBone(); if (bone) { int parentID = bone->parent; BoneNode* parentNode = _getBoneNode(parentID); if (parentNode) { parentNode->addChild(node); } else { _roots.push_back(bone->name); } } } } if (_roots.empty()) { throw Zen::Exception("no bone root found!"); } // if (roots.size() > 1) // { // for (size_t i = 0; i != roots.size(); ++i) // { // std::string name = roots[i]; // std::transform(name.begin(), name.end(), name.begin(), std::tolower); // if (name == "root") // { // _rootName = roots[i]; // break; // } // } // if (_rootName.empty()) // { // _addRootNode(); // _relate(); // } // } // else // { // _rootName = roots[0]; // } // _matrices.resize(_boneNodes.size()); _matricesFull.resize(_boneNodes.size()); }
BoneNode* Skeleton::_getBoneNode( int id ) { for (BoneNodeMap::iterator it = _boneNodes.begin(); it != _boneNodes.end(); ++it) { BoneNode* node = it->second; Bone* bone = node->getBone(); if (id == bone->id) { return node; } } return NULL; }
void Skeleton::destroy() { for (BoneNodeMap::iterator it = _boneNodes.begin(); it != _boneNodes.end(); ++it) { BoneNode* r = it->second; if (r) { Bone* b = r->getBone(); delete b; r->detachObject(); delete r; } } _clear(); }