void FCLMESHCollisionDetector::addCollisionSkeletonNode(kinematics::BodyNode *_bd, bool _bRecursive) { if (_bRecursive == false || _bd->getNumChildJoints() == 0) { FCLMESHCollisionNode* csnode = new FCLMESHCollisionNode(_bd); csnode->setBodyNodeID(mCollisionNodes.size()); mCollisionNodes.push_back(csnode); mBodyCollisionMap[_bd] = csnode; mActiveMatrix.push_back(vector<bool>(mCollisionNodes.size() - 1)); for(unsigned int i = 0; i < mCollisionNodes.size() - 1; i++) { //if(mCollisionSkeletonNodeList[i]->mBodyNode->getParentNode() == _bd || _bd->getParentNode() == mCollisionSkeletonNodeList[i]->mBodyNode) { if(mCollisionNodes[i]->getBodyNode()->getSkel() == _bd->getSkel()) { mActiveMatrix.back()[i] = false; } else { mActiveMatrix.back()[i] = true; } } } else { addCollisionSkeletonNode(_bd, false); for (int i = 0; i < _bd->getNumChildJoints(); i++) addCollisionSkeletonNode(_bd->getChildNode(i), true); } }
void CollisionDetector::addCollisionSkeletonNode(dynamics::BodyNode* _bodyNode, bool _isRecursive) { assert(_bodyNode != NULL && "Invalid body node."); // If this collision detector already has collision node for _bodyNode, then // we do nothing. if (getCollisionNode(_bodyNode) != NULL) { std::cout << "The collision detector already has a collision node for " << "body node [" << _bodyNode->getName() << "]." << std::endl; return; } // Create collision node and set index CollisionNode* collNode = createCollisionNode(_bodyNode); collNode->setIndex(mCollisionNodes.size()); // Add the collision node to collision node list mCollisionNodes.push_back(collNode); // Add the collision node to map (BodyNode -> CollisionNode) mBodyCollisionMap[_bodyNode] = collNode; // Add collidable pairs for the collision node mCollidablePairs.push_back( std::vector<bool>(mCollisionNodes.size() - 1, true)); if (_isRecursive) { for (int i = 0; i < _bodyNode->getNumChildBodyNodes(); i++) addCollisionSkeletonNode(_bodyNode->getChildBodyNode(i), true); } }
void CollisionDetector::addCollisionSkeletonNode(kinematics::BodyNode* _bodyNode, bool _recursive) { CollisionNode* collNode = createCollisionNode(_bodyNode); collNode->setIndex(mCollisionNodes.size()); mCollisionNodes.push_back(collNode); mBodyCollisionMap[_bodyNode] = collNode; mCollidablePairs.push_back(vector<bool>(mCollisionNodes.size() - 1, true)); if(_recursive) { for (int i = 0; i < _bodyNode->getNumChildJoints(); i++) addCollisionSkeletonNode(_bodyNode->getChildNode(i), true); } }
//============================================================================== void CollisionDetector::addSkeleton(dynamics::Skeleton* _skeleton) { assert(_skeleton != NULL && "Null pointer skeleton is not allowed to add to CollisionDetector."); if (containSkeleton(_skeleton) == false) { mSkeletons.push_back(_skeleton); for (int i = 0; i < _skeleton->getNumBodyNodes(); ++i) addCollisionSkeletonNode(_skeleton->getBodyNode(i)); } else { dtwarn << "Skeleton [" << _skeleton->getName() << "] is already in CollisionDetector." << std::endl; } }