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); } }
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); } }