38 #ifndef HPP_FCL_HIERARCHY_TREE_INL_H 
   39 #define HPP_FCL_HIERARCHY_TREE_INL_H 
   49 template <
typename BV>
 
   54   max_lookahead_level = -1;
 
   56   bu_threshold = bu_threshold_;
 
   57   topdown_level = topdown_level_;
 
   61 template <
typename BV>
 
   67 template <
typename BV>
 
   88 template <
typename BV>
 
   91   Node* leaf = createNode(
nullptr, bv, data);
 
   92   insertLeaf(root_node, leaf);
 
   98 template <
typename BV>
 
  106 template <
typename BV>
 
  108   if (root_node) recurseDeleteNode(root_node);
 
  112   max_lookahead_level = -1;
 
  117 template <
typename BV>
 
  119   return (
nullptr == root_node);
 
  123 template <
typename BV>
 
  136     if (lookahead_level > 0) {
 
  138       for (
int i = 0; (i < lookahead_level) && sub_root->
parent; ++i)
 
  139         sub_root = sub_root->
parent;
 
  143       sub_root = root_node;
 
  147   insertLeaf(sub_root, leaf);
 
  151 template <
typename BV>
 
  153   if (leaf->
bv.contain(bv)) 
return false;
 
  159 template <
typename S, 
typename BV>
 
  164     if (leaf->
bv.contain(bv)) 
return false;
 
  165     tree.update_(leaf, bv);
 
  172     if (leaf->
bv.contain(bv)) 
return false;
 
  173     tree.update_(leaf, bv);
 
  179 template <
typename BV>
 
  186 template <
typename BV>
 
  192 template <
typename BV>
 
  194   if (!root_node) 
return 0;
 
  195   return getMaxHeight(root_node);
 
  199 template <
typename BV>
 
  201   if (!root_node) 
return 0;
 
  204   getMaxDepth(root_node, 0, max_depth);
 
  209 template <
typename BV>
 
  212     std::vector<Node*> leaves;
 
  213     leaves.reserve(n_leaves);
 
  214     fetchLeaves(root_node, leaves);
 
  215     bottomup(leaves.begin(), leaves.end());
 
  216     root_node = leaves[0];
 
  221 template <
typename BV>
 
  224     std::vector<Node*> leaves;
 
  225     leaves.reserve(n_leaves);
 
  226     fetchLeaves(root_node, leaves);
 
  227     root_node = topdown(leaves.begin(), leaves.end());
 
  232 template <
typename BV>
 
  234   if (iterations < 0) iterations = (int)n_leaves;
 
  235   if (root_node && (iterations > 0)) {
 
  236     for (
int i = 0; i < iterations; ++i) {
 
  237       Node* node = root_node;
 
  238       unsigned int bit = 0;
 
  240         node = sort(node, root_node)->
children[(opath >> bit) & 1];
 
  241         bit = (bit + 1) & (
sizeof(
unsigned int) * 8 - 1);
 
  250 template <
typename BV>
 
  252   if (root_node) recurseRefit(root_node);
 
  256 template <
typename BV>
 
  258                                       std::vector<Node*>& leaves)
 const {
 
  260     extractLeaves(root->
children[0], leaves);
 
  261     extractLeaves(root->
children[1], leaves);
 
  263     leaves.push_back(root);
 
  267 template <
typename BV>
 
  273 template <
typename BV>
 
  279 template <
typename BV>
 
  285 template <
typename BV>
 
  287   for (
int i = 0; i < depth; ++i) std::cout << 
" ";
 
  288   std::cout << 
" (" << root->
bv.min_[0] << 
", " << root->
bv.min_[1] << 
", " 
  289             << root->
bv.min_[2] << 
"; " << root->
bv.max_[0] << 
", " 
  290             << root->
bv.max_[1] << 
", " << root->
bv.max_[2] << 
")" << std::endl;
 
  293     print(root->
children[0], depth + 1);
 
  294     print(root->
children[1], depth + 1);
 
  299 template <
typename BV>
 
  301                                  const NodeVecIterator lend) {
 
  302   NodeVecIterator lcur_end = lend;
 
  303   while (lbeg < lcur_end - 1) {
 
  304     NodeVecIterator min_it1 = lbeg;
 
  305     NodeVecIterator min_it2 = lbeg + 1;
 
  306     FCL_REAL min_size = (std::numeric_limits<FCL_REAL>::max)();
 
  307     for (NodeVecIterator it1 = lbeg; it1 < lcur_end; ++it1) {
 
  308       for (NodeVecIterator it2 = it1 + 1; it2 < lcur_end; ++it2) {
 
  309         FCL_REAL cur_size = ((*it1)->bv + (*it2)->bv).size();
 
  310         if (cur_size < min_size) {
 
  318     Node* n[2] = {*min_it1, *min_it2};
 
  319     Node* p = createNode(
nullptr, n[0]->bv, n[1]->bv, 
nullptr);
 
  320     p->children[0] = n[0];
 
  321     p->children[1] = n[1];
 
  325     Node* tmp = *min_it2;
 
  327     *min_it2 = *lcur_end;
 
  333 template <
typename BV>
 
  335     const NodeVecIterator lbeg, 
const NodeVecIterator lend) {
 
  336   switch (topdown_level) {
 
  338       return topdown_0(lbeg, lend);
 
  341       return topdown_1(lbeg, lend);
 
  344       return topdown_0(lbeg, lend);
 
  349 template <
typename BV>
 
  351   if (!node->isLeaf()) {
 
  352     size_t height1 = getMaxHeight(node->children[0]);
 
  353     size_t height2 = getMaxHeight(node->children[1]);
 
  354     return std::max(height1, height2) + 1;
 
  360 template <
typename BV>
 
  362                                     size_t& max_depth)
 const {
 
  363   if (!node->isLeaf()) {
 
  364     getMaxDepth(node->children[0], depth + 1, max_depth);
 
  365     getMaxDepth(node->children[1], depth + 1, max_depth);
 
  367     max_depth = std::max(max_depth, depth);
 
  371 template <
typename BV>
 
  373     const NodeVecIterator lbeg, 
const NodeVecIterator lend) {
 
  374   long num_leaves = lend - lbeg;
 
  375   if (num_leaves > 1) {
 
  376     if (num_leaves > bu_threshold) {
 
  377       BV vol = (*lbeg)->bv;
 
  378       for (NodeVecIterator it = lbeg + 1; it < lend; ++it) vol += (*it)->bv;
 
  381       FCL_REAL extent[3] = {vol.width(), vol.height(), vol.depth()};
 
  382       if (extent[1] > extent[0]) best_axis = 1;
 
  383       if (extent[2] > extent[best_axis]) best_axis = 2;
 
  386       NodeVecIterator lcenter = lbeg + num_leaves / 2;
 
  387       std::nth_element(lbeg, lcenter, lend,
 
  388                        std::bind(&nodeBaseLess<BV>, std::placeholders::_1,
 
  389                                  std::placeholders::_2, std::ref(best_axis)));
 
  391       Node* node = createNode(
nullptr, vol, 
nullptr);
 
  392       node->children[0] = topdown_0(lbeg, lcenter);
 
  393       node->children[1] = topdown_0(lcenter, lend);
 
  394       node->children[0]->parent = node;
 
  395       node->children[1]->parent = node;
 
  398       bottomup(lbeg, lend);
 
  406 template <
typename BV>
 
  407 typename HierarchyTree<BV>::Node* HierarchyTree<BV>::topdown_1(
 
  408     const NodeVecIterator lbeg, 
const NodeVecIterator lend) {
 
  409   long num_leaves = lend - lbeg;
 
  410   if (num_leaves > 1) {
 
  411     if (num_leaves > bu_threshold) {
 
  412       Vec3f split_p = (*lbeg)->bv.center();
 
  413       BV vol = (*lbeg)->bv;
 
  415       for (it = lbeg + 1; it < lend; ++it) {
 
  416         split_p += (*it)->bv.center();
 
  419       split_p /= 
static_cast<FCL_REAL>(num_leaves);
 
  421       long bestmidp = num_leaves;
 
  422       int splitcount[3][2] = {{0, 0}, {0, 0}, {0, 0}};
 
  423       for (it = lbeg; it < lend; ++it) {
 
  424         Vec3f x = (*it)->bv.center() - split_p;
 
  425         for (
int j = 0; j < 3; ++j) ++splitcount[j][x[j] > 0 ? 1 : 0];
 
  428       for (
int i = 0; i < 3; ++i) {
 
  429         if ((splitcount[i][0] > 0) && (splitcount[i][1] > 0)) {
 
  430           long midp = std::abs(splitcount[i][0] - splitcount[i][1]);
 
  431           if (midp < bestmidp) {
 
  438       if (best_axis < 0) best_axis = 0;
 
  440       FCL_REAL split_value = split_p[best_axis];
 
  441       NodeVecIterator lcenter = lbeg;
 
  442       for (it = lbeg; it < lend; ++it) {
 
  443         if ((*it)->bv.center()[best_axis] < split_value) {
 
  451       Node* node = createNode(
nullptr, vol, 
nullptr);
 
  452       node->children[0] = topdown_1(lbeg, lcenter);
 
  453       node->children[1] = topdown_1(lcenter, lend);
 
  454       node->children[0]->parent = node;
 
  455       node->children[1]->parent = node;
 
  458       bottomup(lbeg, lend);
 
  466 template <
typename BV>
 
  467 void HierarchyTree<BV>::init_0(std::vector<Node*>& leaves) {
 
  469   root_node = topdown(leaves.begin(), leaves.end());
 
  470   n_leaves = leaves.size();
 
  471   max_lookahead_level = -1;
 
  476 template <
typename BV>
 
  477 void HierarchyTree<BV>::init_1(std::vector<Node*>& leaves) {
 
  481   if (leaves.size() > 0) bound_bv = leaves[0]->bv;
 
  482   for (
size_t i = 1; i < leaves.size(); ++i) bound_bv += leaves[i]->bv;
 
  484   morton_functor<FCL_REAL, uint32_t> coder(bound_bv);
 
  485   for (
size_t i = 0; i < leaves.size(); ++i)
 
  486     leaves[i]->code = coder(leaves[i]->bv.center());
 
  488   std::sort(leaves.begin(), leaves.end(), SortByMorton());
 
  490   root_node = mortonRecurse_0(leaves.begin(), leaves.end(),
 
  491                               (1 << (coder.bits() - 1)), coder.bits() - 1);
 
  494   n_leaves = leaves.size();
 
  495   max_lookahead_level = -1;
 
  500 template <
typename BV>
 
  501 void HierarchyTree<BV>::init_2(std::vector<Node*>& leaves) {
 
  505   if (leaves.size() > 0) bound_bv = leaves[0]->bv;
 
  506   for (
size_t i = 1; i < leaves.size(); ++i) bound_bv += leaves[i]->bv;
 
  508   morton_functor<FCL_REAL, uint32_t> coder(bound_bv);
 
  509   for (
size_t i = 0; i < leaves.size(); ++i)
 
  510     leaves[i]->code = coder(leaves[i]->bv.center());
 
  512   std::sort(leaves.begin(), leaves.end(), SortByMorton());
 
  514   root_node = mortonRecurse_1(leaves.begin(), leaves.end(),
 
  515                               (1 << (coder.bits() - 1)), coder.bits() - 1);
 
  518   n_leaves = leaves.size();
 
  519   max_lookahead_level = -1;
 
  524 template <
typename BV>
 
  525 void HierarchyTree<BV>::init_3(std::vector<Node*>& leaves) {
 
  529   if (leaves.size() > 0) bound_bv = leaves[0]->bv;
 
  530   for (
size_t i = 1; i < leaves.size(); ++i) bound_bv += leaves[i]->bv;
 
  532   morton_functor<FCL_REAL, uint32_t> coder(bound_bv);
 
  533   for (
size_t i = 0; i < leaves.size(); ++i)
 
  534     leaves[i]->code = coder(leaves[i]->bv.center());
 
  536   std::sort(leaves.begin(), leaves.end(), SortByMorton());
 
  538   root_node = mortonRecurse_2(leaves.begin(), leaves.end());
 
  541   n_leaves = leaves.size();
 
  542   max_lookahead_level = -1;
 
  547 template <
typename BV>
 
  548 typename HierarchyTree<BV>::Node* HierarchyTree<BV>::mortonRecurse_0(
 
  549     const NodeVecIterator lbeg, 
const NodeVecIterator lend,
 
  550     const uint32_t& split, 
int bits) {
 
  551   long num_leaves = lend - lbeg;
 
  552   if (num_leaves > 1) {
 
  556       NodeVecIterator lcenter =
 
  557           std::lower_bound(lbeg, lend, &dummy, SortByMorton());
 
  559       if (lcenter == lbeg) {
 
  560         uint32_t split2 = split | (1 << (bits - 1));
 
  561         return mortonRecurse_0(lbeg, lend, split2, bits - 1);
 
  562       } 
else if (lcenter == lend) {
 
  563         uint32_t split1 = (split & (~(1 << bits))) | (1 << (bits - 1));
 
  564         return mortonRecurse_0(lbeg, lend, split1, bits - 1);
 
  566         uint32_t split1 = (split & (~(1 << bits))) | (1 << (bits - 1));
 
  567         uint32_t split2 = split | (1 << (bits - 1));
 
  569         Node* child1 = mortonRecurse_0(lbeg, lcenter, split1, bits - 1);
 
  570         Node* child2 = mortonRecurse_0(lcenter, lend, split2, bits - 1);
 
  571         Node* node = createNode(
nullptr, 
nullptr);
 
  572         node->children[0] = child1;
 
  573         node->children[1] = child2;
 
  574         child1->parent = node;
 
  575         child2->parent = node;
 
  579       Node* node = topdown(lbeg, lend);
 
  587 template <
typename BV>
 
  588 typename HierarchyTree<BV>::Node* HierarchyTree<BV>::mortonRecurse_1(
 
  589     const NodeVecIterator lbeg, 
const NodeVecIterator lend,
 
  590     const uint32_t& split, 
int bits) {
 
  591   long num_leaves = lend - lbeg;
 
  592   if (num_leaves > 1) {
 
  596       NodeVecIterator lcenter =
 
  597           std::lower_bound(lbeg, lend, &dummy, SortByMorton());
 
  599       if (lcenter == lbeg) {
 
  600         uint32_t split2 = split | (1 << (bits - 1));
 
  601         return mortonRecurse_1(lbeg, lend, split2, bits - 1);
 
  602       } 
else if (lcenter == lend) {
 
  603         uint32_t split1 = (split & (~(1 << bits))) | (1 << (bits - 1));
 
  604         return mortonRecurse_1(lbeg, lend, split1, bits - 1);
 
  606         uint32_t split1 = (split & (~(1 << bits))) | (1 << (bits - 1));
 
  607         uint32_t split2 = split | (1 << (bits - 1));
 
  609         Node* child1 = mortonRecurse_1(lbeg, lcenter, split1, bits - 1);
 
  610         Node* child2 = mortonRecurse_1(lcenter, lend, split2, bits - 1);
 
  611         Node* node = createNode(
nullptr, 
nullptr);
 
  612         node->children[0] = child1;
 
  613         node->children[1] = child2;
 
  614         child1->parent = node;
 
  615         child2->parent = node;
 
  619       Node* child1 = mortonRecurse_1(lbeg, lbeg + num_leaves / 2, 0, bits - 1);
 
  620       Node* child2 = mortonRecurse_1(lbeg + num_leaves / 2, lend, 0, bits - 1);
 
  621       Node* node = createNode(
nullptr, 
nullptr);
 
  622       node->children[0] = child1;
 
  623       node->children[1] = child2;
 
  624       child1->parent = node;
 
  625       child2->parent = node;
 
  633 template <
typename BV>
 
  634 typename HierarchyTree<BV>::Node* HierarchyTree<BV>::mortonRecurse_2(
 
  635     const NodeVecIterator lbeg, 
const NodeVecIterator lend) {
 
  636   long num_leaves = lend - lbeg;
 
  637   if (num_leaves > 1) {
 
  638     Node* child1 = mortonRecurse_2(lbeg, lbeg + num_leaves / 2);
 
  639     Node* child2 = mortonRecurse_2(lbeg + num_leaves / 2, lend);
 
  640     Node* node = createNode(
nullptr, 
nullptr);
 
  641     node->children[0] = child1;
 
  642     node->children[1] = child2;
 
  643     child1->parent = node;
 
  644     child2->parent = node;
 
  651 template <
typename BV>
 
  652 void HierarchyTree<BV>::update_(Node* leaf, 
const BV& bv) {
 
  653   Node* root = removeLeaf(leaf);
 
  655     if (max_lookahead_level >= 0) {
 
  656       for (
int i = 0; (i < max_lookahead_level) && root->parent; ++i)
 
  663   insertLeaf(root, leaf);
 
  667 template <
typename BV>
 
  668 typename HierarchyTree<BV>::Node* HierarchyTree<BV>::sort(Node* n, Node*& r) {
 
  671     size_t i = indexOf(n);
 
  673     Node* s = p->children[j];
 
  676       q->children[indexOf(p)] = n;
 
  682     p->children[0] = n->children[0];
 
  683     p->children[1] = n->children[1];
 
  684     n->children[0]->parent = p;
 
  685     n->children[1]->parent = p;
 
  688     std::swap(p->bv, n->bv);
 
  695 template <
typename BV>
 
  696 void HierarchyTree<BV>::insertLeaf(Node* 
const sub_root, Node* 
const leaf)
 
  709     leaf->parent = 
nullptr;
 
  715   Node* sibling = sub_root;
 
  716   while (!sibling->isLeaf()) {
 
  717     sibling = sibling->children[
select(*leaf, *(sibling->children[0]),
 
  718                                        *(sibling->children[1]))];
 
  720   Node* prev = sibling->parent;
 
  723   Node* node = createNode(prev, leaf->bv, sibling->bv, 
nullptr);
 
  737     prev->children[indexOf(sibling)] = node;
 
  738     node->children[0] = sibling;
 
  739     sibling->parent = node;
 
  740     node->children[1] = leaf;
 
  747       if (!prev->bv.contain(node->bv))
 
  748         prev->bv = prev->children[0]->bv + prev->children[1]->bv;
 
  752     } 
while (
nullptr != (prev = node->parent));
 
  762     node->children[0] = sibling;
 
  763     sibling->parent = node;
 
  764     node->children[1] = leaf;
 
  776 template <
typename BV>
 
  777 typename HierarchyTree<BV>::Node* HierarchyTree<BV>::removeLeaf(
 
  783   if (leaf == root_node) {
 
  788   Node* parent = leaf->parent;
 
  789   Node* prev = parent->parent;
 
  790   Node* sibling = parent->children[1 - indexOf(leaf)];
 
  808     prev->children[indexOf(parent)] = sibling;
 
  809     sibling->parent = prev;
 
  813       BV new_bv = prev->children[0]->bv + prev->children[1]->bv;
 
  814       if (!(new_bv == prev->bv)) {
 
  821     return prev ? prev : root_node;
 
  834     sibling->parent = 
nullptr;
 
  841 template <
typename BV>
 
  842 void HierarchyTree<BV>::fetchLeaves(Node* root, std::vector<Node*>& leaves,
 
  844   if ((!root->isLeaf()) && depth) {
 
  845     fetchLeaves(root->children[0], leaves, depth - 1);
 
  846     fetchLeaves(root->children[1], leaves, depth - 1);
 
  849     leaves.push_back(root);
 
  854 template <
typename BV>
 
  855 size_t HierarchyTree<BV>::indexOf(Node* node) {
 
  857   return (node->parent->children[1] == node);
 
  861 template <
typename BV>
 
  862 typename HierarchyTree<BV>::Node* HierarchyTree<BV>::createNode(Node* parent,
 
  865   Node* node = createNode(parent, data);
 
  871 template <
typename BV>
 
  872 typename HierarchyTree<BV>::Node* HierarchyTree<BV>::createNode(Node* parent,
 
  876   Node* node = createNode(parent, data);
 
  877   node->bv = bv1 + bv2;
 
  882 template <
typename BV>
 
  883 typename HierarchyTree<BV>::Node* HierarchyTree<BV>::createNode(Node* parent,
 
  885   Node* node = 
nullptr;
 
  891   node->parent = parent;
 
  893   node->children[1] = 0;
 
  898 template <
typename BV>
 
  899 void HierarchyTree<BV>::deleteNode(Node* node) {
 
  900   if (free_node != node) {
 
  907 template <
typename BV>
 
  908 void HierarchyTree<BV>::recurseDeleteNode(Node* node) {
 
  909   if (!node->isLeaf()) {
 
  910     recurseDeleteNode(node->children[0]);
 
  911     recurseDeleteNode(node->children[1]);
 
  914   if (node == root_node) root_node = 
nullptr;
 
  919 template <
typename BV>
 
  920 void HierarchyTree<BV>::recurseRefit(Node* node) {
 
  921   if (!node->isLeaf()) {
 
  922     recurseRefit(node->children[0]);
 
  923     recurseRefit(node->children[1]);
 
  924     node->bv = node->children[0]->bv + node->children[1]->bv;
 
  930 template <
typename BV>
 
  932   if (a->
bv.center()[d] < b->
bv.center()[d]) 
return true;
 
  937 template <
typename S, 
typename BV>
 
  952 template <
typename BV>
 
  959 template <
typename BV>
 
  966 template <
typename S>
 
  972     const AABB& bv1 = node1.
bv;
 
  973     const AABB& bv2 = node2.
bv;
 
  977     FCL_REAL d1 = fabs(v1[0]) + fabs(v1[1]) + fabs(v1[2]);
 
  978     FCL_REAL d2 = fabs(v2[0]) + fabs(v2[1]) + fabs(v2[2]);
 
  979     return (d1 < d2) ? 0 : 1;
 
  984     const AABB& bv = query;
 
  985     const AABB& bv1 = node1.
bv;
 
  986     const AABB& bv2 = node2.
bv;
 
  990     FCL_REAL d1 = fabs(v1[0]) + fabs(v1[1]) + fabs(v1[2]);
 
  991     FCL_REAL d2 = fabs(v2[0]) + fabs(v2[1]) + fabs(v2[2]);
 
  992     return (d1 < d2) ? 0 : 1;