38#ifndef COAL_HIERARCHY_TREE_INL_H 
   39#define COAL_HIERARCHY_TREE_INL_H 
   53  max_lookahead_level = -1;
 
   55  bu_threshold = bu_threshold_;
 
   56  topdown_level = topdown_level_;
 
 
   90  Node* leaf = createNode(
nullptr, bv, data);
 
   91  insertLeaf(root_node, leaf);
 
 
  105template <
typename BV>
 
  107  if (root_node) recurseDeleteNode(root_node);
 
  111  max_lookahead_level = -1;
 
 
  116template <
typename BV>
 
  118  return (
nullptr == root_node);
 
 
  122template <
typename BV>
 
  135    if (lookahead_level > 0) {
 
  137      for (
int i = 0; (i < lookahead_level) && sub_root->
parent; ++i)
 
  138        sub_root = sub_root->
parent;
 
  142      sub_root = root_node;
 
  146  insertLeaf(sub_root, leaf);
 
 
  150template <
typename BV>
 
  152  if (leaf->
bv.contain(bv)) 
return false;
 
 
  158template <
typename S, 
typename BV>
 
  163    if (leaf->
bv.contain(bv)) 
return false;
 
  164    tree.update_(leaf, bv);
 
 
  171    if (leaf->
bv.contain(bv)) 
return false;
 
  172    tree.update_(leaf, bv);
 
 
 
  178template <
typename BV>
 
  185template <
typename BV>
 
  191template <
typename BV>
 
  193  if (!root_node) 
return 0;
 
  194  return getMaxHeight(root_node);
 
 
  198template <
typename BV>
 
  200  if (!root_node) 
return 0;
 
  203  getMaxDepth(root_node, 0, max_depth);
 
 
  208template <
typename BV>
 
  211    std::vector<Node*> leaves;
 
  212    leaves.reserve(n_leaves);
 
  213    fetchLeaves(root_node, leaves);
 
  214    bottomup(leaves.begin(), leaves.end());
 
  215    root_node = leaves[0];
 
 
  220template <
typename BV>
 
  223    std::vector<Node*> leaves;
 
  224    leaves.reserve(n_leaves);
 
  225    fetchLeaves(root_node, leaves);
 
  226    root_node = topdown(leaves.begin(), leaves.end());
 
 
  231template <
typename BV>
 
  233  if (iterations < 0) iterations = (int)n_leaves;
 
  234  if (root_node && (iterations > 0)) {
 
  235    for (
int i = 0; i < iterations; ++i) {
 
  236      Node* node = root_node;
 
  237      unsigned int bit = 0;
 
  239        node = sort(node, root_node)->
children[(opath >> bit) & 1];
 
  240        bit = (bit + 1) & (
sizeof(
unsigned int) * 8 - 1);
 
 
  249template <
typename BV>
 
  251  if (root_node) recurseRefit(root_node);
 
 
  255template <
typename BV>
 
  257                                      std::vector<Node*>& leaves)
 const {
 
  259    extractLeaves(root->
children[0], leaves);
 
  260    extractLeaves(root->
children[1], leaves);
 
  262    leaves.push_back(root);
 
 
  266template <
typename BV>
 
  272template <
typename BV>
 
  278template <
typename BV>
 
  284template <
typename BV>
 
  286  for (
int i = 0; i < depth; ++i) std::cout << 
" ";
 
  287  std::cout << 
" (" << root->
bv.min_[0] << 
", " << root->
bv.min_[1] << 
", " 
  288            << root->
bv.min_[2] << 
"; " << root->
bv.max_[0] << 
", " 
  289            << root->
bv.max_[1] << 
", " << root->
bv.max_[2] << 
")" << std::endl;
 
  292    print(root->
children[0], depth + 1);
 
  293    print(root->
children[1], depth + 1);
 
 
  298template <
typename BV>
 
  300                                 const NodeVecIterator lend) {
 
  301  NodeVecIterator lcur_end = lend;
 
  302  while (lbeg < lcur_end - 1) {
 
  303    NodeVecIterator min_it1 = lbeg;
 
  304    NodeVecIterator min_it2 = lbeg + 1;
 
  305    Scalar min_size = (std::numeric_limits<Scalar>::max)();
 
  306    for (NodeVecIterator it1 = lbeg; it1 < lcur_end; ++it1) {
 
  307      for (NodeVecIterator it2 = it1 + 1; it2 < lcur_end; ++it2) {
 
  308        Scalar cur_size = ((*it1)->bv + (*it2)->bv).size();
 
  309        if (cur_size < min_size) {
 
  317    Node* n[2] = {*min_it1, *min_it2};
 
  318    Node* p = createNode(
nullptr, n[0]->bv, n[1]->bv, 
nullptr);
 
  319    p->children[0] = n[0];
 
  320    p->children[1] = n[1];
 
  324    Node* tmp = *min_it2;
 
  326    *min_it2 = *lcur_end;
 
  332template <
typename BV>
 
  334    const NodeVecIterator lbeg, 
const NodeVecIterator lend) {
 
  335  switch (topdown_level) {
 
  337      return topdown_0(lbeg, lend);
 
  340      return topdown_1(lbeg, lend);
 
  343      return topdown_0(lbeg, lend);
 
  348template <
typename BV>
 
  350  if (!node->isLeaf()) {
 
  351    size_t height1 = getMaxHeight(node->children[0]);
 
  352    size_t height2 = getMaxHeight(node->children[1]);
 
  353    return std::max(height1, height2) + 1;
 
  359template <
typename BV>
 
  361                                    size_t& max_depth)
 const {
 
  362  if (!node->isLeaf()) {
 
  363    getMaxDepth(node->children[0], depth + 1, max_depth);
 
  364    getMaxDepth(node->children[1], depth + 1, max_depth);
 
  366    max_depth = std::max(max_depth, depth);
 
  370template <
typename BV>
 
  372    const NodeVecIterator lbeg, 
const NodeVecIterator lend) {
 
  373  long num_leaves = lend - lbeg;
 
  374  if (num_leaves > 1) {
 
  375    if (num_leaves > bu_threshold) {
 
  376      BV vol = (*lbeg)->bv;
 
  377      for (NodeVecIterator it = lbeg + 1; it < lend; ++it) vol += (*it)->bv;
 
  380      Scalar extent[3] = {vol.width(), vol.height(), vol.depth()};
 
  381      if (extent[1] > extent[0]) best_axis = 1;
 
  382      if (extent[2] > extent[best_axis]) best_axis = 2;
 
  385      NodeVecIterator lcenter = lbeg + num_leaves / 2;
 
  386      std::nth_element(lbeg, lcenter, lend,
 
  387                       std::bind(&nodeBaseLess<BV>, std::placeholders::_1,
 
  388                                 std::placeholders::_2, std::ref(best_axis)));
 
  390      Node* node = createNode(
nullptr, vol, 
nullptr);
 
  391      node->children[0] = topdown_0(lbeg, lcenter);
 
  392      node->children[1] = topdown_0(lcenter, lend);
 
  393      node->children[0]->parent = node;
 
  394      node->children[1]->parent = node;
 
  397      bottomup(lbeg, lend);
 
  405template <
typename BV>
 
  407    const NodeVecIterator lbeg, 
const NodeVecIterator lend) {
 
  408  long num_leaves = lend - lbeg;
 
  409  if (num_leaves > 1) {
 
  410    if (num_leaves > bu_threshold) {
 
  411      Vec3s split_p = (*lbeg)->bv.center();
 
  412      BV vol = (*lbeg)->bv;
 
  414      for (it = lbeg + 1; it < lend; ++it) {
 
  415        split_p += (*it)->bv.center();
 
  418      split_p /= 
static_cast<Scalar>(num_leaves);
 
  420      long bestmidp = num_leaves;
 
  421      int splitcount[3][2] = {{0, 0}, {0, 0}, {0, 0}};
 
  422      for (it = lbeg; it < lend; ++it) {
 
  423        Vec3s x = (*it)->bv.center() - split_p;
 
  424        for (
int j = 0; j < 3; ++j) ++splitcount[j][x[j] > 0 ? 1 : 0];
 
  427      for (
int i = 0; i < 3; ++i) {
 
  428        if ((splitcount[i][0] > 0) && (splitcount[i][1] > 0)) {
 
  429          long midp = std::abs(splitcount[i][0] - splitcount[i][1]);
 
  430          if (midp < bestmidp) {
 
  437      if (best_axis < 0) best_axis = 0;
 
  439      Scalar split_value = split_p[best_axis];
 
  440      NodeVecIterator lcenter = lbeg;
 
  441      for (it = lbeg; it < lend; ++it) {
 
  442        if ((*it)->bv.center()[best_axis] < split_value) {
 
  450      Node* node = createNode(
nullptr, vol, 
nullptr);
 
  451      node->children[0] = topdown_1(lbeg, lcenter);
 
  452      node->children[1] = topdown_1(lcenter, lend);
 
  453      node->children[0]->parent = node;
 
  454      node->children[1]->parent = node;
 
  457      bottomup(lbeg, lend);
 
  465template <
typename BV>
 
  466void HierarchyTree<BV>::init_0(std::vector<Node*>& leaves) {
 
  468  root_node = topdown(leaves.begin(), leaves.end());
 
  469  n_leaves = leaves.size();
 
  470  max_lookahead_level = -1;
 
  475template <
typename BV>
 
  476void HierarchyTree<BV>::init_1(std::vector<Node*>& leaves) {
 
  480  if (leaves.size() > 0) bound_bv = leaves[0]->bv;
 
  481  for (
size_t i = 1; i < leaves.size(); ++i) bound_bv += leaves[i]->bv;
 
  483  morton_functor<Scalar, uint32_t> coder(bound_bv);
 
  484  for (
size_t i = 0; i < leaves.size(); ++i)
 
  485    leaves[i]->code = coder(leaves[i]->bv.center());
 
  487  std::sort(leaves.begin(), leaves.end(), SortByMorton());
 
  489  root_node = mortonRecurse_0(leaves.begin(), leaves.end(),
 
  490                              (1 << (coder.bits() - 1)), coder.bits() - 1);
 
  493  n_leaves = leaves.size();
 
  494  max_lookahead_level = -1;
 
  499template <
typename BV>
 
  500void HierarchyTree<BV>::init_2(std::vector<Node*>& leaves) {
 
  504  if (leaves.size() > 0) bound_bv = leaves[0]->bv;
 
  505  for (
size_t i = 1; i < leaves.size(); ++i) bound_bv += leaves[i]->bv;
 
  507  morton_functor<Scalar, uint32_t> coder(bound_bv);
 
  508  for (
size_t i = 0; i < leaves.size(); ++i)
 
  509    leaves[i]->code = coder(leaves[i]->bv.center());
 
  511  std::sort(leaves.begin(), leaves.end(), SortByMorton());
 
  513  root_node = mortonRecurse_1(leaves.begin(), leaves.end(),
 
  514                              (1 << (coder.bits() - 1)), coder.bits() - 1);
 
  517  n_leaves = leaves.size();
 
  518  max_lookahead_level = -1;
 
  523template <
typename BV>
 
  524void HierarchyTree<BV>::init_3(std::vector<Node*>& leaves) {
 
  528  if (leaves.size() > 0) bound_bv = leaves[0]->bv;
 
  529  for (
size_t i = 1; i < leaves.size(); ++i) bound_bv += leaves[i]->bv;
 
  531  morton_functor<Scalar, uint32_t> coder(bound_bv);
 
  532  for (
size_t i = 0; i < leaves.size(); ++i)
 
  533    leaves[i]->code = coder(leaves[i]->bv.center());
 
  535  std::sort(leaves.begin(), leaves.end(), SortByMorton());
 
  537  root_node = mortonRecurse_2(leaves.begin(), leaves.end());
 
  540  n_leaves = leaves.size();
 
  541  max_lookahead_level = -1;
 
  546template <
typename BV>
 
  548    const NodeVecIterator lbeg, 
const NodeVecIterator lend,
 
  549    const uint32_t& split, 
int bits) {
 
  550  long num_leaves = lend - lbeg;
 
  551  if (num_leaves > 1) {
 
  555      NodeVecIterator lcenter =
 
  556          std::lower_bound(lbeg, lend, &dummy, SortByMorton());
 
  558      if (lcenter == lbeg) {
 
  559        uint32_t split2 = split | (1 << (bits - 1));
 
  560        return mortonRecurse_0(lbeg, lend, split2, bits - 1);
 
  561      } 
else if (lcenter == lend) {
 
  562        uint32_t split1 = (split & (~(1 << bits))) | (1 << (bits - 1));
 
  563        return mortonRecurse_0(lbeg, lend, split1, bits - 1);
 
  565        uint32_t split1 = (split & (~(1 << bits))) | (1 << (bits - 1));
 
  566        uint32_t split2 = split | (1 << (bits - 1));
 
  568        Node* child1 = mortonRecurse_0(lbeg, lcenter, split1, bits - 1);
 
  569        Node* child2 = mortonRecurse_0(lcenter, lend, split2, bits - 1);
 
  570        Node* node = createNode(
nullptr, 
nullptr);
 
  571        node->children[0] = child1;
 
  572        node->children[1] = child2;
 
  573        child1->parent = node;
 
  574        child2->parent = node;
 
  578      Node* node = topdown(lbeg, lend);
 
  586template <
typename BV>
 
  588    const NodeVecIterator lbeg, 
const NodeVecIterator lend,
 
  589    const uint32_t& split, 
int bits) {
 
  590  long num_leaves = lend - lbeg;
 
  591  if (num_leaves > 1) {
 
  595      NodeVecIterator lcenter =
 
  596          std::lower_bound(lbeg, lend, &dummy, SortByMorton());
 
  598      if (lcenter == lbeg) {
 
  599        uint32_t split2 = split | (1 << (bits - 1));
 
  600        return mortonRecurse_1(lbeg, lend, split2, bits - 1);
 
  601      } 
else if (lcenter == lend) {
 
  602        uint32_t split1 = (split & (~(1 << bits))) | (1 << (bits - 1));
 
  603        return mortonRecurse_1(lbeg, lend, split1, bits - 1);
 
  605        uint32_t split1 = (split & (~(1 << bits))) | (1 << (bits - 1));
 
  606        uint32_t split2 = split | (1 << (bits - 1));
 
  608        Node* child1 = mortonRecurse_1(lbeg, lcenter, split1, bits - 1);
 
  609        Node* child2 = mortonRecurse_1(lcenter, lend, split2, bits - 1);
 
  610        Node* node = createNode(
nullptr, 
nullptr);
 
  611        node->children[0] = child1;
 
  612        node->children[1] = child2;
 
  613        child1->parent = node;
 
  614        child2->parent = node;
 
  618      Node* child1 = mortonRecurse_1(lbeg, lbeg + num_leaves / 2, 0, bits - 1);
 
  619      Node* child2 = mortonRecurse_1(lbeg + num_leaves / 2, lend, 0, bits - 1);
 
  620      Node* node = createNode(
nullptr, 
nullptr);
 
  621      node->children[0] = child1;
 
  622      node->children[1] = child2;
 
  623      child1->parent = node;
 
  624      child2->parent = node;
 
  632template <
typename BV>
 
  634    const NodeVecIterator lbeg, 
const NodeVecIterator lend) {
 
  635  long num_leaves = lend - lbeg;
 
  636  if (num_leaves > 1) {
 
  637    Node* child1 = mortonRecurse_2(lbeg, lbeg + num_leaves / 2);
 
  638    Node* child2 = mortonRecurse_2(lbeg + num_leaves / 2, lend);
 
  639    Node* node = createNode(
nullptr, 
nullptr);
 
  640    node->children[0] = child1;
 
  641    node->children[1] = child2;
 
  642    child1->parent = node;
 
  643    child2->parent = node;
 
  650template <
typename BV>
 
  651void HierarchyTree<BV>::update_(Node* leaf, 
const BV& bv) {
 
  652  Node* root = removeLeaf(leaf);
 
  654    if (max_lookahead_level >= 0) {
 
  655      for (
int i = 0; (i < max_lookahead_level) && root->parent; ++i)
 
  662  insertLeaf(root, leaf);
 
  666template <
typename BV>
 
  670    size_t i = indexOf(n);
 
  672    Node* s = p->children[j];
 
  675      q->children[indexOf(p)] = n;
 
  681    p->children[0] = n->children[0];
 
  682    p->children[1] = n->children[1];
 
  683    n->children[0]->parent = p;
 
  684    n->children[1]->parent = p;
 
  687    std::swap(p->bv, n->bv);
 
  694template <
typename BV>
 
  695void HierarchyTree<BV>::insertLeaf(Node* 
const sub_root, Node* 
const leaf)
 
  708    leaf->parent = 
nullptr;
 
  714  Node* sibling = sub_root;
 
  715  while (!sibling->isLeaf()) {
 
  716    sibling = sibling->children[
select(*leaf, *(sibling->children[0]),
 
  717                                       *(sibling->children[1]))];
 
  719  Node* prev = sibling->parent;
 
  722  Node* node = createNode(prev, leaf->bv, sibling->bv, 
nullptr);
 
  736    prev->children[indexOf(sibling)] = node;
 
  737    node->children[0] = sibling;
 
  738    sibling->parent = node;
 
  739    node->children[1] = leaf;
 
  746      if (!prev->bv.contain(node->bv))
 
  747        prev->bv = prev->children[0]->bv + prev->children[1]->bv;
 
  751    } 
while (
nullptr != (prev = node->parent));
 
  761    node->children[0] = sibling;
 
  762    sibling->parent = node;
 
  763    node->children[1] = leaf;
 
  775template <
typename BV>
 
  782  if (leaf == root_node) {
 
  787  Node* parent = leaf->parent;
 
  788  Node* prev = parent->parent;
 
  789  Node* sibling = parent->children[1 - indexOf(leaf)];
 
  807    prev->children[indexOf(parent)] = sibling;
 
  808    sibling->parent = prev;
 
  812      BV new_bv = prev->children[0]->bv + prev->children[1]->bv;
 
  813      if (!(new_bv == prev->bv)) {
 
  820    return prev ? prev : root_node;
 
  833    sibling->parent = 
nullptr;
 
  840template <
typename BV>
 
  841void HierarchyTree<BV>::fetchLeaves(Node* root, std::vector<Node*>& leaves,
 
  843  if ((!root->isLeaf()) && depth) {
 
  844    fetchLeaves(root->children[0], leaves, depth - 1);
 
  845    fetchLeaves(root->children[1], leaves, depth - 1);
 
  848    leaves.push_back(root);
 
  853template <
typename BV>
 
  854size_t HierarchyTree<BV>::indexOf(Node* node) {
 
  856  return (node->parent->children[1] == node);
 
  860template <
typename BV>
 
  864  Node* node = createNode(parent, data);
 
  870template <
typename BV>
 
  875  Node* node = createNode(parent, data);
 
  876  node->bv = bv1 + bv2;
 
  881template <
typename BV>
 
  884  Node* node = 
nullptr;
 
  890  node->parent = parent;
 
  892  node->children[1] = 0;
 
  897template <
typename BV>
 
  898void HierarchyTree<BV>::deleteNode(Node* node) {
 
  899  if (free_node != node) {
 
  906template <
typename BV>
 
  907void HierarchyTree<BV>::recurseDeleteNode(Node* node) {
 
  908  if (!node->isLeaf()) {
 
  909    recurseDeleteNode(node->children[0]);
 
  910    recurseDeleteNode(node->children[1]);
 
  913  if (node == root_node) root_node = 
nullptr;
 
  918template <
typename BV>
 
  919void HierarchyTree<BV>::recurseRefit(Node* node) {
 
  920  if (!node->isLeaf()) {
 
  921    recurseRefit(node->children[0]);
 
  922    recurseRefit(node->children[1]);
 
  923    node->bv = node->children[0]->bv + node->children[1]->bv;
 
  929template <
typename BV>
 
  931  if (a->
bv.center()[d] < b->
bv.center()[d]) 
return true;
 
 
  936template <
typename S, 
typename BV>
 
  951template <
typename BV>
 
  958template <
typename BV>
 
  971    const AABB& bv1 = node1.
bv;
 
  972    const AABB& bv2 = node2.
bv;
 
  976    Scalar d1 = fabs(v1[0]) + fabs(v1[1]) + fabs(v1[2]);
 
  977    Scalar d2 = fabs(v2[0]) + fabs(v2[1]) + fabs(v2[2]);
 
  978    return (d1 < d2) ? 0 : 1;
 
 
  983    const AABB& bv = query;
 
  984    const AABB& bv1 = node1.
bv;
 
  985    const AABB& bv2 = node2.
bv;
 
  989    Scalar d1 = fabs(v1[0]) + fabs(v1[1]) + fabs(v1[2]);
 
  990    Scalar d2 = fabs(v2[0]) + fabs(v2[1]) + fabs(v2[2]);
 
  991    return (d1 < d2) ? 0 : 1;
 
 
 
A class describing the AABB collision structure, which is a box in 3D space determined by two diagona...
Definition AABB.h:55
 
Vec3s min_
The min point in the AABB.
Definition AABB.h:58
 
Vec3s max_
The max point in the AABB.
Definition AABB.h:60
 
Class for hierarchy tree structure.
Definition hierarchy_tree.h:56
 
~HierarchyTree()
Definition hierarchy_tree-inl.h:61
 
Node * getRoot() const
get the root of the tree
Definition hierarchy_tree-inl.h:273
 
HierarchyTree(int bu_threshold_=16, int topdown_level_=0)
Create hierarchy tree with suitable setting. bu_threshold decides the height of tree node to start bo...
Definition hierarchy_tree-inl.h:49
 
void balanceBottomup()
balance the tree from bottom
Definition hierarchy_tree-inl.h:209
 
void update(Node *leaf, int lookahead_level=-1)
Updates a leaf node. A use case is when the bounding volume of an object changes. Ensure every parent...
Definition hierarchy_tree-inl.h:123
 
Node * insert(const BV &bv, void *data)
Insest a node.
Definition hierarchy_tree-inl.h:88
 
void clear()
Clear the tree.
Definition hierarchy_tree-inl.h:106
 
void remove(Node *leaf)
Remove a leaf node.
Definition hierarchy_tree-inl.h:98
 
void balanceTopdown()
balance the tree from top
Definition hierarchy_tree-inl.h:221
 
void init(std::vector< Node * > &leaves, int level=0)
Initialize the tree by a set of leaves using algorithm with a given level.
Definition hierarchy_tree-inl.h:67
 
void refit()
refit the tree, i.e., when the leaf nodes' bounding volumes change, update the entire tree in a botto...
Definition hierarchy_tree-inl.h:250
 
bool empty() const
Whether the tree is empty.
Definition hierarchy_tree-inl.h:117
 
size_t getMaxDepth() const
get the max depth of the tree
Definition hierarchy_tree-inl.h:199
 
size_t size() const
number of leaves in the tree
Definition hierarchy_tree-inl.h:267
 
void balanceIncremental(int iterations)
balance the tree in an incremental way
Definition hierarchy_tree-inl.h:232
 
NodeBase< BV > Node
Definition hierarchy_tree.h:58
 
void print(Node *root, int depth)
print the tree in a recursive way
Definition hierarchy_tree-inl.h:285
 
size_t getMaxHeight() const
get the max height of the tree
Definition hierarchy_tree-inl.h:192
 
void extractLeaves(const Node *root, std::vector< Node * > &leaves) const
extract all the leaves of the tree
Definition hierarchy_tree-inl.h:256
 
size_t select(const NodeBase< BV > &query, const NodeBase< BV > &node1, const NodeBase< BV > &node2)
select from node1 and node2 which is close to a given query. 0 for node1 and 1 for node2
Definition hierarchy_tree-inl.h:952
 
bool nodeBaseLess(NodeBase< BV > *a, NodeBase< BV > *b, int d)
Compare two nodes accoording to the d-th dimension of node center.
Definition hierarchy_tree-inl.h:930
 
Main namespace.
Definition broadphase_bruteforce.h:44
 
Eigen::Matrix< Scalar, 3, 1 > Vec3s
Definition data_types.h:70
 
double Scalar
Definition data_types.h:68
 
dynamic AABB tree node
Definition node_base.h:49
 
NodeBase< BV > * children[2]
for leaf node, children nodes
Definition node_base.h:64
 
bool isLeaf() const
whether is a leaf
Definition node_base-inl.h:54
 
NodeBase< BV > * parent
pointer to parent node
Definition node_base.h:54
 
BV bv
the bounding volume for the node
Definition node_base.h:51
 
static std::size_t run(const AABB &query, const NodeBase< AABB > &node1, const NodeBase< AABB > &node2)
Definition hierarchy_tree-inl.h:981
 
static std::size_t run(const NodeBase< AABB > &node, const NodeBase< AABB > &node1, const NodeBase< AABB > &node2)
Definition hierarchy_tree-inl.h:967
 
Definition hierarchy_tree-inl.h:937
 
static std::size_t run(const BV &, const NodeBase< BV > &, const NodeBase< BV > &)
Definition hierarchy_tree-inl.h:944
 
static std::size_t run(const NodeBase< BV > &, const NodeBase< BV > &, const NodeBase< BV > &)
Definition hierarchy_tree-inl.h:938
 
Definition hierarchy_tree-inl.h:159
 
static bool run(const HierarchyTree< BV > &tree, typename HierarchyTree< BV >::Node *leaf, const BV &bv, const Vec3s &, Scalar)
Definition hierarchy_tree-inl.h:160
 
static bool run(const HierarchyTree< BV > &tree, typename HierarchyTree< BV >::Node *leaf, const BV &bv, const Vec3s &)
Definition hierarchy_tree-inl.h:168