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);
    }
}
Example #2
0
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);
  }
}
Example #3
0
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);
    }
}
Example #4
0
//==============================================================================
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;
  }
}