| Directory: | ./ |
|---|---|
| File: | include/pinocchio/collision/tree-broadphase-manager.hxx |
| Date: | 2025-02-12 21:03:38 |
| Exec | Total | Coverage | |
|---|---|---|---|
| Lines: | 36 | 74 | 48.6% |
| Branches: | 21 | 38 | 55.3% |
| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | // | ||
| 2 | // Copyright (c) 2022 INRIA | ||
| 3 | // | ||
| 4 | |||
| 5 | #ifndef __pinocchio_collision_tree_broadphase_manager_hxx__ | ||
| 6 | #define __pinocchio_collision_tree_broadphase_manager_hxx__ | ||
| 7 | |||
| 8 | namespace pinocchio | ||
| 9 | { | ||
| 10 | |||
| 11 | template<typename Manager> | ||
| 12 | 1002 | void TreeBroadPhaseManagerTpl<Manager>::update(bool compute_local_aabb) | |
| 13 | { | ||
| 14 |
2/2✓ Branch 5 taken 33066 times.
✓ Branch 6 taken 1002 times.
|
34068 | for (auto && manager : managers) |
| 15 | { | ||
| 16 |
1/2✓ Branch 1 taken 33066 times.
✗ Branch 2 not taken.
|
33066 | manager.update(compute_local_aabb); |
| 17 | } | ||
| 18 | 1002 | } | |
| 19 | |||
| 20 | template<typename Manager> | ||
| 21 | ✗ | void TreeBroadPhaseManagerTpl<Manager>::update(GeometryData * geom_data_ptr_new) | |
| 22 | { | ||
| 23 | ✗ | for (auto && manager : managers) | |
| 24 | { | ||
| 25 | ✗ | manager.update(geom_data_ptr_new); | |
| 26 | } | ||
| 27 | } | ||
| 28 | |||
| 29 | template<typename Manager> | ||
| 30 | 1 | bool TreeBroadPhaseManagerTpl<Manager>::check() const | |
| 31 | { | ||
| 32 |
2/2✓ Branch 5 taken 1 times.
✓ Branch 6 taken 1 times.
|
2 | for (auto && manager : managers) |
| 33 | { | ||
| 34 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
|
1 | if (!manager.check()) |
| 35 | ✗ | return false; | |
| 36 | } | ||
| 37 | |||
| 38 | 1 | return true; | |
| 39 | } | ||
| 40 | |||
| 41 | template<typename Manager> | ||
| 42 | 1004 | bool TreeBroadPhaseManagerTpl<Manager>::check(CollisionCallBackBase * callback) const | |
| 43 | { | ||
| 44 |
2/2✓ Branch 5 taken 33132 times.
✓ Branch 6 taken 1004 times.
|
34136 | for (auto && manager : managers) |
| 45 | { | ||
| 46 |
2/4✓ Branch 1 taken 33132 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 33132 times.
|
33132 | if (!manager.check(callback)) |
| 47 | ✗ | return false; | |
| 48 | } | ||
| 49 | |||
| 50 | 1004 | return true; | |
| 51 | } | ||
| 52 | |||
| 53 | template<typename Manager> | ||
| 54 | 2 | void TreeBroadPhaseManagerTpl<Manager>::init(const size_t njoints) | |
| 55 | { | ||
| 56 | 2 | managers.reserve(njoints); | |
| 57 |
2/2✓ Branch 0 taken 34 times.
✓ Branch 1 taken 2 times.
|
36 | for (size_t joint_id = 0; joint_id < njoints; ++joint_id) |
| 58 | { | ||
| 59 | 34 | GeometryObjectFilterSelectByJoint filter(joint_id); | |
| 60 |
1/2✓ Branch 1 taken 34 times.
✗ Branch 2 not taken.
|
34 | managers.push_back( |
| 61 |
1/2✓ Branch 4 taken 34 times.
✗ Branch 5 not taken.
|
68 | BroadPhaseManager(&getModel(), &getGeometryModel(), &getGeometryData(), filter)); |
| 62 | } | ||
| 63 | 2 | } | |
| 64 | |||
| 65 | template<typename Manager> | ||
| 66 | 1004 | bool TreeBroadPhaseManagerTpl<Manager>::collide(CollisionCallBackBase * callback) const | |
| 67 | { | ||
| 68 | 1004 | const size_t num_joints = managers.size(); | |
| 69 | |||
| 70 | 1004 | callback->init(); | |
| 71 | 1004 | const bool accumulate_save_value = callback->accumulate; | |
| 72 | 1004 | callback->accumulate = true; | |
| 73 | |||
| 74 |
2/2✓ Branch 0 taken 33132 times.
✓ Branch 1 taken 1004 times.
|
34136 | for (size_t i = 0; i < num_joints; ++i) |
| 75 | { | ||
| 76 | 33132 | const BroadPhaseManager & manager_outer = managers[i]; | |
| 77 | 33132 | bool should_stop = false; | |
| 78 |
2/2✓ Branch 0 taken 530112 times.
✓ Branch 1 taken 33132 times.
|
563244 | for (size_t j = i + 1; j < num_joints; ++j) |
| 79 | { | ||
| 80 | 530112 | BroadPhaseManager & manager_inner = const_cast<BroadPhaseManager &>(managers[j]); | |
| 81 | 530112 | manager_outer.collide(manager_inner, callback); | |
| 82 | 530112 | should_stop = callback->stop(); | |
| 83 | |||
| 84 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 530112 times.
|
530112 | if (should_stop) |
| 85 | ✗ | break; | |
| 86 | } | ||
| 87 | |||
| 88 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 33132 times.
|
33132 | if (should_stop) |
| 89 | ✗ | break; | |
| 90 | } | ||
| 91 | |||
| 92 | 1004 | callback->accumulate = accumulate_save_value; // restore initial value | |
| 93 | |||
| 94 | 1004 | callback->done(); | |
| 95 | 1004 | return callback->collision; | |
| 96 | } | ||
| 97 | |||
| 98 | template<typename Manager> | ||
| 99 | ✗ | bool TreeBroadPhaseManagerTpl<Manager>::collide( | |
| 100 | CollisionObject & collision_object, CollisionCallBackBase * callback) const | ||
| 101 | { | ||
| 102 | ✗ | const size_t num_joints = managers.size(); | |
| 103 | |||
| 104 | ✗ | callback->init(); | |
| 105 | ✗ | const bool accumulate_save_value = callback->accumulate; | |
| 106 | ✗ | callback->accumulate = true; | |
| 107 | |||
| 108 | ✗ | for (size_t i = 0; i < num_joints; ++i) | |
| 109 | { | ||
| 110 | ✗ | const BroadPhaseManager & manager = managers[i]; | |
| 111 | ✗ | manager.collide(collision_object, callback); | |
| 112 | ✗ | if (callback->stop()) | |
| 113 | ✗ | break; | |
| 114 | } | ||
| 115 | |||
| 116 | ✗ | callback->accumulate = accumulate_save_value; // restore initial value | |
| 117 | |||
| 118 | ✗ | callback->done(); | |
| 119 | ✗ | return callback->collision; | |
| 120 | } | ||
| 121 | |||
| 122 | template<typename Manager> | ||
| 123 | ✗ | bool TreeBroadPhaseManagerTpl<Manager>::collide( | |
| 124 | TreeBroadPhaseManagerTpl & other_manager, CollisionCallBackBase * callback) const | ||
| 125 | { | ||
| 126 | ✗ | const size_t num_joints = managers.size(); | |
| 127 | |||
| 128 | ✗ | callback->init(); | |
| 129 | ✗ | const bool accumulate_save_value = callback->accumulate; | |
| 130 | ✗ | callback->accumulate = true; | |
| 131 | |||
| 132 | ✗ | for (size_t i = 0; i < num_joints; ++i) | |
| 133 | { | ||
| 134 | ✗ | const BroadPhaseManager & manager_outer = managers[i]; | |
| 135 | ✗ | bool should_stop = false; | |
| 136 | ✗ | for (auto && manager_inner : other_manager.managers) | |
| 137 | { | ||
| 138 | ✗ | manager_outer.collide(manager_inner, callback); | |
| 139 | ✗ | should_stop = callback->stop(); | |
| 140 | |||
| 141 | ✗ | if (should_stop) | |
| 142 | ✗ | break; | |
| 143 | } | ||
| 144 | ✗ | if (should_stop) | |
| 145 | ✗ | break; | |
| 146 | } | ||
| 147 | |||
| 148 | ✗ | callback->accumulate = accumulate_save_value; // restore initial value | |
| 149 | |||
| 150 | ✗ | callback->done(); | |
| 151 | ✗ | return callback->collision; | |
| 152 | } | ||
| 153 | |||
| 154 | } // namespace pinocchio | ||
| 155 | |||
| 156 | #endif // ifndef __pinocchio_collision_tree_broadphase_manager_hxx__ | ||
| 157 |