void propagateBVHFrontListCollisionRecurse(CollisionTraversalNodeBase* node, BVHFrontList* front_list)
{
  BVHFrontList::iterator front_iter;
  BVHFrontList append;
  for(front_iter = front_list->begin(); front_iter != front_list->end(); ++front_iter)
  {
    int b1 = front_iter->left;
    int b2 = front_iter->right;
    bool l1 = node->isFirstNodeLeaf(b1);
    bool l2 = node->isSecondNodeLeaf(b2);

    if(l1 & l2)
    {
      front_iter->valid = false; // the front node is no longer valid, in collideRecurse will add again.
      collisionRecurse(node, b1, b2, &append);
    }
    else
    {
      if(!node->BVTesting(b1, b2))
      {
        front_iter->valid = false;

        if(node->firstOverSecond(b1, b2))
        {
          int c1 = node->getFirstLeftChild(b1);
          int c2 = node->getFirstRightChild(b2);

          collisionRecurse(node, c1, b2, front_list);
          collisionRecurse(node, c2, b2, front_list);
        }
        else
        {
          int c1 = node->getSecondLeftChild(b2);
          int c2 = node->getSecondRightChild(b2);

          collisionRecurse(node, b1, c1, front_list);
          collisionRecurse(node, b1, c2, front_list);
        }
      }
    }
  }


  // clean the old front list (remove invalid node)
  for(front_iter = front_list->begin(); front_iter != front_list->end();)
  {
    if(!front_iter->valid)
      front_iter = front_list->erase(front_iter);
    else
      ++front_iter;
  }

  for(front_iter = append.begin(); front_iter != append.end(); ++front_iter)
  {
    front_list->push_back(*front_iter);
  }
}
示例#2
0
    void propagateBVHFrontList(BVNode<RSS>* tree1, BVNode<RSS>* tree2,
                               Vec3f R[3], const Vec3f& T,
                               Vec3f* vertices1, Vec3f* vertices2,
                               Triangle* tri_indices1, Triangle* tri_indices2,
                               BVH_CollideResult* res,
                               BVHFrontList* front_list)
    {
      BVHFrontList::iterator front_iter;
      BVHFrontList append;
      for(front_iter = front_list->begin(); front_iter != front_list->end(); ++front_iter)
      {
        int b1 = front_iter->left;
        int b2 = front_iter->right;
        BVNode<RSS>* node1 = tree1 + b1;
        BVNode<RSS>* node2 = tree2 + b2;


        bool l1 = node1->isLeaf();
        bool l2 = node2->isLeaf();

        if(l1 & l2)
        {
          front_iter->valid = false; // the front node is no longer valid, in collideRecurse will add again.
          collideRecurse(tree1, tree2, R, T, b1, b2, vertices1, vertices2, tri_indices1, tri_indices2, res, &append);
        }
        else
        {
          res->num_bv_tests++;
          if(!overlap(R, T, node1->bv, node2->bv))
          {
            front_iter->valid = false; // the front node is no longer valid

            BVH_REAL sz1 = node1->bv.size();
            BVH_REAL sz2 = node2->bv.size();

            if(l2 || (!l1 && (sz1 > sz2)))
            {
              int c1 = node1->first_child;
              int c2 = c1 + 1;

              collideRecurse(tree1, tree2, R, T, c1, b2, vertices1, vertices2, tri_indices1, tri_indices2, res, &append);

              collideRecurse(tree1, tree2, R, T, c2, b2, vertices1, vertices2, tri_indices1, tri_indices2, res, &append);
            }
            else
            {
              int c1 = node2->first_child;
              int c2 = c1 + 1;

              collideRecurse(tree1, tree2, R, T, b1, c1, vertices1, vertices2, tri_indices1, tri_indices2, res, &append);

              collideRecurse(tree1, tree2, R, T, b1, c2, vertices1, vertices2, tri_indices1, tri_indices2, res, &append);
            }
          }
        }
      }


      // clean the old front list (remove invalid node)
      for(front_iter = front_list->begin(); front_iter != front_list->end();)
      {
        if(!front_iter->valid)
          front_iter = front_list->erase(front_iter);
        else
          ++front_iter;
      }

      for(front_iter = append.begin(); front_iter != append.end(); ++front_iter)
      {
        front_list->push_back(*front_iter);
      }
    }