45 const ObjItHostAcc &acc,
47 std::vector<u32_2> &interact_m2l,
48 std::vector<u32_2> &interact_p2p) {
50 auto dtt_child_call = [&](
u32 cell_a,
u32 cell_b) {
51 dtt_recursive_internal<allow_leaf_lowering>(
52 cell_a, cell_b, acc, theta_crit, interact_m2l, interact_p2p);
55 auto &ttrav = acc.tree_traverser.tree_traverser;
57 Tvec aabb_min_a = acc.tree_traverser.aabb_min[cell_a];
58 Tvec aabb_max_a = acc.tree_traverser.aabb_max[cell_a];
60 Tvec aabb_min_b = acc.tree_traverser.aabb_min[cell_b];
61 Tvec aabb_max_b = acc.tree_traverser.aabb_max[cell_b];
66 bool crit = mac(aabb_a, aabb_b, theta_crit) ==
false;
70 if constexpr (allow_leaf_lowering) {
72 bool is_a_leaf = ttrav.is_id_leaf(cell_a);
73 bool is_b_leaf = ttrav.is_id_leaf(cell_b);
75 if (is_a_leaf && is_b_leaf) {
76 interact_p2p.push_back({cell_a, cell_b});
80 u32 child_a_1 = (is_a_leaf) ? cell_a : ttrav.get_left_child(cell_a);
81 u32 child_a_2 = (is_a_leaf) ? cell_a : ttrav.get_right_child(cell_a);
82 u32 child_b_1 = (is_b_leaf) ? cell_b : ttrav.get_left_child(cell_b);
83 u32 child_b_2 = (is_b_leaf) ? cell_b : ttrav.get_right_child(cell_b);
86 bool run_a_2 = !is_a_leaf;
88 bool run_b_2 = !is_b_leaf;
90 if (run_a_1 && run_b_1)
91 dtt_child_call(child_a_1, child_b_1);
92 if (run_a_2 && run_b_1)
93 dtt_child_call(child_a_2, child_b_1);
94 if (run_a_1 && run_b_2)
95 dtt_child_call(child_a_1, child_b_2);
96 if (run_a_2 && run_b_2)
97 dtt_child_call(child_a_2, child_b_2);
101 u32 child_a_1 = ttrav.get_left_child(cell_a);
102 u32 child_a_2 = ttrav.get_right_child(cell_a);
103 u32 child_b_1 = ttrav.get_left_child(cell_b);
104 u32 child_b_2 = ttrav.get_right_child(cell_b);
106 bool child_a_1_leaf = ttrav.is_id_leaf(child_a_1);
107 bool child_a_2_leaf = ttrav.is_id_leaf(child_a_2);
108 bool child_b_1_leaf = ttrav.is_id_leaf(child_b_1);
109 bool child_b_2_leaf = ttrav.is_id_leaf(child_b_2);
111 if (child_a_1_leaf || child_a_2_leaf || child_b_1_leaf || child_b_2_leaf) {
112 interact_p2p.push_back({cell_a, cell_b});
116 dtt_child_call(child_a_1, child_b_1);
117 dtt_child_call(child_a_2, child_b_1);
118 dtt_child_call(child_a_1, child_b_2);
119 dtt_child_call(child_a_2, child_b_2);
123 interact_m2l.push_back({cell_a, cell_b});
130 std::vector<u32_2> &interact_m2l,
131 std::vector<u32_2> &interact_p2p,
132 bool allow_leaf_lowering) {
136 auto obj_it_host = bvh.get_object_iterator_host();
137 auto acc = obj_it_host.get_read_access();
139 auto &ttrav = acc.tree_traverser.tree_traverser;
142 if (ttrav.is_id_leaf(0)) {
143 interact_p2p.push_back({0, 0});
148 if (allow_leaf_lowering) {
149 dtt_recursive_internal<true>(0, 0, acc, theta_crit, interact_m2l, interact_p2p);
151 dtt_recursive_internal<false>(0, 0, acc, theta_crit, interact_m2l, interact_p2p);