//==============================================================================
bool DARTCollisionDetector::collide(
    CollisionGroup* group,
    const CollisionOption& option, CollisionResult& result)
{
  result.clear();

  if (this != group->getCollisionDetector().get())
  {
    dterr << "[DARTCollisionDetector::detect] Attempting to check collision "
          << "for a collision group that is created from a different collision "
          << "detector instance.\n";

    return false;
  }

  auto casted = static_cast<DARTCollisionGroup*>(group);
  const auto& objects = casted->mCollisionObjects;

  if (objects.empty())
    return false;

  auto done = false;
  const auto& filter = option.collisionFilter;

  for (auto i = 0u; i < objects.size() - 1; ++i)
  {
    auto collObj1 = objects[i];

    for (auto j = i + 1u; j < objects.size(); ++j)
    {
      auto collObj2 = objects[j];

      if (filter && !filter->needCollision(collObj1, collObj2))
        continue;

      checkPair(collObj1, collObj2, option, result);

      if ((option.binaryCheck && result.isCollision())
          || (result.getNumContacts() >= option.maxNumContacts))
      {
        done = true;
        break;
      }
    }

    if (done)
      break;
  }

  return result.isCollision();
}
Beispiel #2
0
bool CollisionRequest::isSatisfied(const CollisionResult& result) const
{
  return (!enable_cost) && result.isCollision() && (num_max_contacts <= result.numContacts());
}