GCC Code Coverage Report


Directory: ./
File: test/broadphase_collision_2.cpp
Date: 2025-04-01 09:23:31
Exec Total Coverage
Lines: 158 158 100.0%
Branches: 412 762 54.1%

Line Branch Exec Source
1 /*
2 * Software License Agreement (BSD License)
3 *
4 * Copyright (c) 2011-2014, Willow Garage, Inc.
5 * Copyright (c) 2014-2016, Open Source Robotics Foundation
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 *
12 * * Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * * Redistributions in binary form must reproduce the above
15 * copyright notice, this list of conditions and the following
16 * disclaimer in the documentation and/or other materials provided
17 * with the distribution.
18 * * Neither the name of Open Source Robotics Foundation nor the names of its
19 * contributors may be used to endorse or promote products derived
20 * from this software without specific prior written permission.
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
25 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
26 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
27 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
28 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
30 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
32 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33 * POSSIBILITY OF SUCH DAMAGE.
34 */
35
36 /** @author Jia Pan */
37
38 #define BOOST_TEST_MODULE COAL_BROADPHASE_COLLISION_2
39 #include <boost/test/included/unit_test.hpp>
40
41 #include "coal/broadphase/broadphase_bruteforce.h"
42 #include "coal/broadphase/broadphase_spatialhash.h"
43 #include "coal/broadphase/broadphase_SaP.h"
44 #include "coal/broadphase/broadphase_SSaP.h"
45 #include "coal/broadphase/broadphase_interval_tree.h"
46 #include "coal/broadphase/broadphase_dynamic_AABB_tree.h"
47 #include "coal/broadphase/broadphase_dynamic_AABB_tree_array.h"
48 #include "coal/broadphase/default_broadphase_callbacks.h"
49 #include "coal/broadphase/detail/sparse_hash_table.h"
50 #include "coal/broadphase/detail/spatial_hash.h"
51 #include "utility.h"
52
53 #if USE_GOOGLEHASH
54 #include <sparsehash/sparse_hash_map>
55 #include <sparsehash/dense_hash_map>
56 #include <hash_map>
57 #endif
58
59 #include <iostream>
60 #include <iomanip>
61
62 using namespace coal;
63
64 /// @brief test for broad phase collision and self collision
65 void broad_phase_collision_test(Scalar env_scale, std::size_t env_size,
66 std::size_t query_size,
67 std::size_t num_max_contacts = 1,
68 bool exhaustive = false, bool use_mesh = false);
69
70 #if USE_GOOGLEHASH
71 template <typename U, typename V>
72 struct GoogleSparseHashTable
73 : public google::sparse_hash_map<U, V, std::tr1::hash<size_t>,
74 std::equal_to<size_t> > {};
75
76 template <typename U, typename V>
77 struct GoogleDenseHashTable
78 : public google::dense_hash_map<U, V, std::tr1::hash<size_t>,
79 std::equal_to<size_t> > {
80 GoogleDenseHashTable()
81 : google::dense_hash_map<U, V, std::tr1::hash<size_t>,
82 std::equal_to<size_t> >() {
83 this->set_empty_key(nullptr);
84 }
85 };
86 #endif
87
88 /// check broad phase collision for empty collision object set and queries
89
33/66
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 27 taken 1 times.
✗ Branch 28 not taken.
✓ Branch 30 taken 1 times.
✗ Branch 31 not taken.
✓ Branch 33 taken 1 times.
✗ Branch 34 not taken.
✓ Branch 36 taken 1 times.
✗ Branch 37 not taken.
✓ Branch 41 taken 1 times.
✗ Branch 42 not taken.
✓ Branch 45 taken 1 times.
✗ Branch 46 not taken.
✓ Branch 48 taken 1 times.
✗ Branch 49 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 1 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 66 taken 1 times.
✗ Branch 67 not taken.
✓ Branch 70 taken 1 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 1 times.
✗ Branch 74 not taken.
✓ Branch 77 taken 1 times.
✗ Branch 78 not taken.
✓ Branch 80 taken 1 times.
✗ Branch 81 not taken.
✓ Branch 83 taken 1 times.
✗ Branch 84 not taken.
✓ Branch 86 taken 1 times.
✗ Branch 87 not taken.
✓ Branch 91 taken 1 times.
✗ Branch 92 not taken.
✓ Branch 95 taken 1 times.
✗ Branch 96 not taken.
✓ Branch 98 taken 1 times.
✗ Branch 99 not taken.
✓ Branch 102 taken 1 times.
✗ Branch 103 not taken.
✓ Branch 105 taken 1 times.
✗ Branch 106 not taken.
✓ Branch 108 taken 1 times.
✗ Branch 109 not taken.
✓ Branch 111 taken 1 times.
✗ Branch 112 not taken.
✓ Branch 116 taken 1 times.
✗ Branch 117 not taken.
4 BOOST_AUTO_TEST_CASE(test_core_bf_broad_phase_collision_empty) {
90 #ifdef NDEBUG
91 broad_phase_collision_test(2000, 0, 0, 10, false, false);
92 broad_phase_collision_test(2000, 0, 1000, 10, false, false);
93 broad_phase_collision_test(2000, 100, 0, 10, false, false);
94
95 broad_phase_collision_test(2000, 0, 0, 10, false, true);
96 broad_phase_collision_test(2000, 0, 1000, 10, false, true);
97 broad_phase_collision_test(2000, 100, 0, 10, false, true);
98
99 broad_phase_collision_test(2000, 0, 0, 10, true, false);
100 broad_phase_collision_test(2000, 0, 1000, 10, true, false);
101 broad_phase_collision_test(2000, 100, 0, 10, true, false);
102
103 broad_phase_collision_test(2000, 0, 0, 10, true, true);
104 broad_phase_collision_test(2000, 0, 1000, 10, true, true);
105 broad_phase_collision_test(2000, 100, 0, 10, true, true);
106 #else
107 2 broad_phase_collision_test(2000, 0, 0, 10, false, false);
108 2 broad_phase_collision_test(2000, 0, 5, 10, false, false);
109 2 broad_phase_collision_test(2000, 2, 0, 10, false, false);
110
111 2 broad_phase_collision_test(2000, 0, 0, 10, false, true);
112 2 broad_phase_collision_test(2000, 0, 5, 10, false, true);
113 2 broad_phase_collision_test(2000, 2, 0, 10, false, true);
114
115 2 broad_phase_collision_test(2000, 0, 0, 10, true, false);
116 2 broad_phase_collision_test(2000, 0, 5, 10, true, false);
117 2 broad_phase_collision_test(2000, 2, 0, 10, true, false);
118
119 2 broad_phase_collision_test(2000, 0, 0, 10, true, true);
120 2 broad_phase_collision_test(2000, 0, 5, 10, true, true);
121 2 broad_phase_collision_test(2000, 2, 0, 10, true, true);
122 #endif
123 2 }
124
125 /// check broad phase collision and self collision, only return collision or not
126
33/66
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 27 taken 1 times.
✗ Branch 28 not taken.
✓ Branch 30 taken 1 times.
✗ Branch 31 not taken.
✓ Branch 33 taken 1 times.
✗ Branch 34 not taken.
✓ Branch 36 taken 1 times.
✗ Branch 37 not taken.
✓ Branch 41 taken 1 times.
✗ Branch 42 not taken.
✓ Branch 45 taken 1 times.
✗ Branch 46 not taken.
✓ Branch 48 taken 1 times.
✗ Branch 49 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 1 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 66 taken 1 times.
✗ Branch 67 not taken.
✓ Branch 70 taken 1 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 1 times.
✗ Branch 74 not taken.
✓ Branch 77 taken 1 times.
✗ Branch 78 not taken.
✓ Branch 80 taken 1 times.
✗ Branch 81 not taken.
✓ Branch 83 taken 1 times.
✗ Branch 84 not taken.
✓ Branch 86 taken 1 times.
✗ Branch 87 not taken.
✓ Branch 91 taken 1 times.
✗ Branch 92 not taken.
✓ Branch 95 taken 1 times.
✗ Branch 96 not taken.
✓ Branch 98 taken 1 times.
✗ Branch 99 not taken.
✓ Branch 102 taken 1 times.
✗ Branch 103 not taken.
✓ Branch 105 taken 1 times.
✗ Branch 106 not taken.
✓ Branch 108 taken 1 times.
✗ Branch 109 not taken.
✓ Branch 111 taken 1 times.
✗ Branch 112 not taken.
✓ Branch 116 taken 1 times.
✗ Branch 117 not taken.
4 BOOST_AUTO_TEST_CASE(test_core_bf_broad_phase_collision_binary) {
127 #ifdef NDEBUG
128 broad_phase_collision_test(2000, 100, 1000, 1, false);
129 broad_phase_collision_test(2000, 1000, 1000, 1, false);
130 broad_phase_collision_test(2000, 100, 1000, 1, true);
131 broad_phase_collision_test(2000, 1000, 1000, 1, true);
132 #else
133 2 broad_phase_collision_test(2000, 10, 100, 1, false);
134 2 broad_phase_collision_test(2000, 100, 100, 1, false);
135 2 broad_phase_collision_test(2000, 10, 100, 1, true);
136 2 broad_phase_collision_test(2000, 100, 100, 1, true);
137 #endif
138 2 }
139
140 /// check broad phase collision and self collision, return 10 contacts
141
33/66
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 27 taken 1 times.
✗ Branch 28 not taken.
✓ Branch 30 taken 1 times.
✗ Branch 31 not taken.
✓ Branch 33 taken 1 times.
✗ Branch 34 not taken.
✓ Branch 36 taken 1 times.
✗ Branch 37 not taken.
✓ Branch 41 taken 1 times.
✗ Branch 42 not taken.
✓ Branch 45 taken 1 times.
✗ Branch 46 not taken.
✓ Branch 48 taken 1 times.
✗ Branch 49 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 1 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 66 taken 1 times.
✗ Branch 67 not taken.
✓ Branch 70 taken 1 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 1 times.
✗ Branch 74 not taken.
✓ Branch 77 taken 1 times.
✗ Branch 78 not taken.
✓ Branch 80 taken 1 times.
✗ Branch 81 not taken.
✓ Branch 83 taken 1 times.
✗ Branch 84 not taken.
✓ Branch 86 taken 1 times.
✗ Branch 87 not taken.
✓ Branch 91 taken 1 times.
✗ Branch 92 not taken.
✓ Branch 95 taken 1 times.
✗ Branch 96 not taken.
✓ Branch 98 taken 1 times.
✗ Branch 99 not taken.
✓ Branch 102 taken 1 times.
✗ Branch 103 not taken.
✓ Branch 105 taken 1 times.
✗ Branch 106 not taken.
✓ Branch 108 taken 1 times.
✗ Branch 109 not taken.
✓ Branch 111 taken 1 times.
✗ Branch 112 not taken.
✓ Branch 116 taken 1 times.
✗ Branch 117 not taken.
4 BOOST_AUTO_TEST_CASE(test_core_bf_broad_phase_collision) {
142 #ifdef NDEBUG
143 broad_phase_collision_test(2000, 100, 1000, 10, false);
144 broad_phase_collision_test(2000, 1000, 1000, 10, false);
145 #else
146 2 broad_phase_collision_test(2000, 10, 100, 10, false);
147 2 broad_phase_collision_test(2000, 100, 100, 10, false);
148 #endif
149 2 }
150
151 /// check broad phase collision and self collision, return only collision or
152 /// not, in mesh
153
33/66
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 27 taken 1 times.
✗ Branch 28 not taken.
✓ Branch 30 taken 1 times.
✗ Branch 31 not taken.
✓ Branch 33 taken 1 times.
✗ Branch 34 not taken.
✓ Branch 36 taken 1 times.
✗ Branch 37 not taken.
✓ Branch 41 taken 1 times.
✗ Branch 42 not taken.
✓ Branch 45 taken 1 times.
✗ Branch 46 not taken.
✓ Branch 48 taken 1 times.
✗ Branch 49 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 1 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 66 taken 1 times.
✗ Branch 67 not taken.
✓ Branch 70 taken 1 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 1 times.
✗ Branch 74 not taken.
✓ Branch 77 taken 1 times.
✗ Branch 78 not taken.
✓ Branch 80 taken 1 times.
✗ Branch 81 not taken.
✓ Branch 83 taken 1 times.
✗ Branch 84 not taken.
✓ Branch 86 taken 1 times.
✗ Branch 87 not taken.
✓ Branch 91 taken 1 times.
✗ Branch 92 not taken.
✓ Branch 95 taken 1 times.
✗ Branch 96 not taken.
✓ Branch 98 taken 1 times.
✗ Branch 99 not taken.
✓ Branch 102 taken 1 times.
✗ Branch 103 not taken.
✓ Branch 105 taken 1 times.
✗ Branch 106 not taken.
✓ Branch 108 taken 1 times.
✗ Branch 109 not taken.
✓ Branch 111 taken 1 times.
✗ Branch 112 not taken.
✓ Branch 116 taken 1 times.
✗ Branch 117 not taken.
4 BOOST_AUTO_TEST_CASE(test_core_mesh_bf_broad_phase_collision_mesh_binary) {
154 #ifdef NDEBUG
155 broad_phase_collision_test(2000, 100, 1000, 1, false, true);
156 broad_phase_collision_test(2000, 1000, 1000, 1, false, true);
157 #else
158 2 broad_phase_collision_test(2000, 2, 5, 1, false, true);
159 2 broad_phase_collision_test(2000, 5, 5, 1, false, true);
160 #endif
161 2 }
162
163 /// check broad phase collision and self collision, return 10 contacts, in mesh
164
33/66
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 27 taken 1 times.
✗ Branch 28 not taken.
✓ Branch 30 taken 1 times.
✗ Branch 31 not taken.
✓ Branch 33 taken 1 times.
✗ Branch 34 not taken.
✓ Branch 36 taken 1 times.
✗ Branch 37 not taken.
✓ Branch 41 taken 1 times.
✗ Branch 42 not taken.
✓ Branch 45 taken 1 times.
✗ Branch 46 not taken.
✓ Branch 48 taken 1 times.
✗ Branch 49 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 1 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 66 taken 1 times.
✗ Branch 67 not taken.
✓ Branch 70 taken 1 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 1 times.
✗ Branch 74 not taken.
✓ Branch 77 taken 1 times.
✗ Branch 78 not taken.
✓ Branch 80 taken 1 times.
✗ Branch 81 not taken.
✓ Branch 83 taken 1 times.
✗ Branch 84 not taken.
✓ Branch 86 taken 1 times.
✗ Branch 87 not taken.
✓ Branch 91 taken 1 times.
✗ Branch 92 not taken.
✓ Branch 95 taken 1 times.
✗ Branch 96 not taken.
✓ Branch 98 taken 1 times.
✗ Branch 99 not taken.
✓ Branch 102 taken 1 times.
✗ Branch 103 not taken.
✓ Branch 105 taken 1 times.
✗ Branch 106 not taken.
✓ Branch 108 taken 1 times.
✗ Branch 109 not taken.
✓ Branch 111 taken 1 times.
✗ Branch 112 not taken.
✓ Branch 116 taken 1 times.
✗ Branch 117 not taken.
4 BOOST_AUTO_TEST_CASE(test_core_mesh_bf_broad_phase_collision_mesh) {
165 #ifdef NDEBUG
166 broad_phase_collision_test(2000, 100, 1000, 10, false, true);
167 broad_phase_collision_test(2000, 1000, 1000, 10, false, true);
168 #else
169 2 broad_phase_collision_test(2000, 2, 5, 10, false, true);
170 2 broad_phase_collision_test(2000, 5, 5, 10, false, true);
171 #endif
172 2 }
173
174 /// check broad phase collision and self collision, exhaustive, in mesh
175
33/66
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 27 taken 1 times.
✗ Branch 28 not taken.
✓ Branch 30 taken 1 times.
✗ Branch 31 not taken.
✓ Branch 33 taken 1 times.
✗ Branch 34 not taken.
✓ Branch 36 taken 1 times.
✗ Branch 37 not taken.
✓ Branch 41 taken 1 times.
✗ Branch 42 not taken.
✓ Branch 45 taken 1 times.
✗ Branch 46 not taken.
✓ Branch 48 taken 1 times.
✗ Branch 49 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 1 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 66 taken 1 times.
✗ Branch 67 not taken.
✓ Branch 70 taken 1 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 1 times.
✗ Branch 74 not taken.
✓ Branch 77 taken 1 times.
✗ Branch 78 not taken.
✓ Branch 80 taken 1 times.
✗ Branch 81 not taken.
✓ Branch 83 taken 1 times.
✗ Branch 84 not taken.
✓ Branch 86 taken 1 times.
✗ Branch 87 not taken.
✓ Branch 91 taken 1 times.
✗ Branch 92 not taken.
✓ Branch 95 taken 1 times.
✗ Branch 96 not taken.
✓ Branch 98 taken 1 times.
✗ Branch 99 not taken.
✓ Branch 102 taken 1 times.
✗ Branch 103 not taken.
✓ Branch 105 taken 1 times.
✗ Branch 106 not taken.
✓ Branch 108 taken 1 times.
✗ Branch 109 not taken.
✓ Branch 111 taken 1 times.
✗ Branch 112 not taken.
✓ Branch 116 taken 1 times.
✗ Branch 117 not taken.
4 BOOST_AUTO_TEST_CASE(test_core_mesh_bf_broad_phase_collision_mesh_exhaustive) {
176 #ifdef NDEBUG
177 broad_phase_collision_test(2000, 100, 1000, 1, true, true);
178 broad_phase_collision_test(2000, 1000, 1000, 1, true, true);
179 #else
180 2 broad_phase_collision_test(2000, 2, 5, 1, true, true);
181 2 broad_phase_collision_test(2000, 5, 5, 1, true, true);
182 #endif
183 2 }
184
185 24 void broad_phase_collision_test(Scalar env_scale, std::size_t env_size,
186 std::size_t query_size,
187 std::size_t num_max_contacts, bool exhaustive,
188 bool use_mesh) {
189 24 std::vector<TStruct> ts;
190 24 std::vector<BenchTimer> timers;
191
192 24 std::vector<CollisionObject*> env;
193
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 12 times.
24 if (use_mesh)
194
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 generateEnvironmentsMesh(env, env_scale, env_size);
195 else
196
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 generateEnvironments(env, env_scale, env_size);
197
198 24 std::vector<CollisionObject*> query;
199
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 12 times.
24 if (use_mesh)
200
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 generateEnvironmentsMesh(query, env_scale, query_size);
201 else
202
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 generateEnvironments(query, env_scale, query_size);
203
204 24 std::vector<BroadPhaseCollisionManager*> managers;
205
206
3/6
✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 24 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 24 times.
✗ Branch 8 not taken.
24 managers.push_back(new NaiveCollisionManager());
207
3/6
✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 24 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 24 times.
✗ Branch 8 not taken.
24 managers.push_back(new SSaPCollisionManager());
208
3/6
✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 24 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 24 times.
✗ Branch 8 not taken.
24 managers.push_back(new SaPCollisionManager());
209
3/6
✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 24 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 24 times.
✗ Branch 8 not taken.
24 managers.push_back(new IntervalTreeCollisionManager());
210
211
2/4
✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 24 times.
✗ Branch 5 not taken.
24 Vec3s lower_limit, upper_limit;
212
1/2
✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
24 SpatialHashingCollisionManager<>::computeBound(env, lower_limit, upper_limit);
213 // Scalar ncell_per_axis = std::pow((S)env_size / 10, 1 / 3.0);
214 24 Scalar ncell_per_axis = 20;
215 Scalar cell_size =
216
1/2
✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
24 std::min(std::min((upper_limit[0] - lower_limit[0]) / ncell_per_axis,
217
2/4
✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 24 times.
✗ Branch 5 not taken.
24 (upper_limit[1] - lower_limit[1]) / ncell_per_axis),
218
3/6
✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 24 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 24 times.
✗ Branch 8 not taken.
24 (upper_limit[2] - lower_limit[2]) / ncell_per_axis);
219 // managers.push_back(new SpatialHashingCollisionManager(cell_size,
220 // lower_limit, upper_limit));
221
1/2
✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
24 managers.push_back(new SpatialHashingCollisionManager<detail::SparseHashTable<
222 AABB, CollisionObject*, detail::SpatialHash> >(
223
2/4
✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 24 times.
✗ Branch 5 not taken.
24 cell_size, lower_limit, upper_limit));
224 #if USE_GOOGLEHASH
225 managers.push_back(
226 new SpatialHashingCollisionManager<detail::SparseHashTable<
227 AABB, CollisionObject*, detail::SpatialHash, GoogleSparseHashTable> >(
228 cell_size, lower_limit, upper_limit));
229 managers.push_back(
230 new SpatialHashingCollisionManager<detail::SparseHashTable<
231 AABB, CollisionObject*, detail::SpatialHash, GoogleDenseHashTable> >(
232 cell_size, lower_limit, upper_limit));
233 #endif
234
3/6
✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 24 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 24 times.
✗ Branch 8 not taken.
24 managers.push_back(new DynamicAABBTreeCollisionManager());
235
236
3/6
✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 24 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 24 times.
✗ Branch 8 not taken.
24 managers.push_back(new DynamicAABBTreeArrayCollisionManager());
237
238 {
239
2/4
✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 24 times.
✗ Branch 5 not taken.
24 DynamicAABBTreeCollisionManager* m = new DynamicAABBTreeCollisionManager();
240 24 m->tree_init_level = 2;
241
1/2
✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
24 managers.push_back(m);
242 }
243
244 {
245 DynamicAABBTreeArrayCollisionManager* m =
246
2/4
✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 24 times.
✗ Branch 5 not taken.
24 new DynamicAABBTreeArrayCollisionManager();
247 24 m->tree_init_level = 2;
248
1/2
✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
24 managers.push_back(m);
249 }
250
251
1/2
✓ Branch 2 taken 24 times.
✗ Branch 3 not taken.
24 ts.resize(managers.size());
252
1/2
✓ Branch 2 taken 24 times.
✗ Branch 3 not taken.
24 timers.resize(managers.size());
253
254
2/2
✓ Branch 1 taken 216 times.
✓ Branch 2 taken 24 times.
240 for (size_t i = 0; i < managers.size(); ++i) {
255
1/2
✓ Branch 2 taken 216 times.
✗ Branch 3 not taken.
216 timers[i].start();
256
1/2
✓ Branch 2 taken 216 times.
✗ Branch 3 not taken.
216 managers[i]->registerObjects(env);
257
1/2
✓ Branch 2 taken 216 times.
✗ Branch 3 not taken.
216 timers[i].stop();
258
2/4
✓ Branch 3 taken 216 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 216 times.
✗ Branch 7 not taken.
216 ts[i].push_back(timers[i].getElapsedTime());
259 }
260
261
2/2
✓ Branch 1 taken 216 times.
✓ Branch 2 taken 24 times.
240 for (size_t i = 0; i < managers.size(); ++i) {
262
1/2
✓ Branch 2 taken 216 times.
✗ Branch 3 not taken.
216 timers[i].start();
263
1/2
✓ Branch 2 taken 216 times.
✗ Branch 3 not taken.
216 managers[i]->setup();
264
1/2
✓ Branch 2 taken 216 times.
✗ Branch 3 not taken.
216 timers[i].stop();
265
2/4
✓ Branch 3 taken 216 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 216 times.
✗ Branch 7 not taken.
216 ts[i].push_back(timers[i].getElapsedTime());
266 }
267
268
1/2
✓ Branch 3 taken 24 times.
✗ Branch 4 not taken.
24 std::vector<CollisionCallBackDefault> callbacks(managers.size());
269
2/2
✓ Branch 1 taken 216 times.
✓ Branch 2 taken 24 times.
240 for (size_t i = 0; i < managers.size(); ++i) {
270
2/2
✓ Branch 0 taken 90 times.
✓ Branch 1 taken 126 times.
216 if (exhaustive)
271 90 callbacks[i].data.request.num_max_contacts = 100000;
272 else
273 126 callbacks[i].data.request.num_max_contacts = num_max_contacts;
274 }
275
276
2/2
✓ Branch 1 taken 216 times.
✓ Branch 2 taken 24 times.
240 for (size_t i = 0; i < managers.size(); ++i) {
277
1/2
✓ Branch 2 taken 216 times.
✗ Branch 3 not taken.
216 timers[i].start();
278
1/2
✓ Branch 3 taken 216 times.
✗ Branch 4 not taken.
216 managers[i]->collide(&callbacks[i]);
279
1/2
✓ Branch 2 taken 216 times.
✗ Branch 3 not taken.
216 timers[i].stop();
280
2/4
✓ Branch 3 taken 216 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 216 times.
✗ Branch 7 not taken.
216 ts[i].push_back(timers[i].getElapsedTime());
281 }
282
283
2/2
✓ Branch 1 taken 216 times.
✓ Branch 2 taken 24 times.
240 for (size_t i = 0; i < managers.size(); ++i)
284
2/4
✓ Branch 3 taken 216 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 216 times.
✗ Branch 7 not taken.
216 std::cout << callbacks[i].data.result.numContacts() << " ";
285
1/2
✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
24 std::cout << std::endl;
286
287
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 14 times.
24 if (exhaustive) {
288
2/2
✓ Branch 1 taken 80 times.
✓ Branch 2 taken 10 times.
90 for (size_t i = 1; i < managers.size(); ++i)
289
6/12
✓ Branch 1 taken 80 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 80 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 80 times.
✗ Branch 12 not taken.
✓ Branch 18 taken 80 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 80 times.
✗ Branch 22 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 80 times.
80 BOOST_CHECK(callbacks[i].data.result.numContacts() ==
290 callbacks[0].data.result.numContacts());
291 } else {
292
1/2
✓ Branch 3 taken 14 times.
✗ Branch 4 not taken.
14 std::vector<bool> self_res(managers.size());
293
2/2
✓ Branch 1 taken 126 times.
✓ Branch 2 taken 14 times.
140 for (size_t i = 0; i < self_res.size(); ++i)
294
1/2
✓ Branch 3 taken 126 times.
✗ Branch 4 not taken.
126 self_res[i] = (callbacks[i].data.result.numContacts() > 0);
295
296
2/2
✓ Branch 1 taken 112 times.
✓ Branch 2 taken 14 times.
126 for (size_t i = 1; i < self_res.size(); ++i)
297
8/16
✓ Branch 1 taken 112 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 112 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 112 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 112 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 112 times.
✗ Branch 18 not taken.
✓ Branch 21 taken 112 times.
✗ Branch 22 not taken.
✓ Branch 24 taken 112 times.
✗ Branch 25 not taken.
✗ Branch 29 not taken.
✓ Branch 30 taken 112 times.
112 BOOST_CHECK(self_res[0] == self_res[i]);
298
299
2/2
✓ Branch 1 taken 112 times.
✓ Branch 2 taken 14 times.
126 for (size_t i = 1; i < managers.size(); ++i)
300
6/12
✓ Branch 1 taken 112 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 112 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 112 times.
✗ Branch 12 not taken.
✓ Branch 18 taken 112 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 112 times.
✗ Branch 22 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 112 times.
112 BOOST_CHECK(callbacks[i].data.result.numContacts() ==
301 callbacks[0].data.result.numContacts());
302 14 }
303
304
2/2
✓ Branch 1 taken 1950 times.
✓ Branch 2 taken 24 times.
1974 for (size_t i = 0; i < query.size(); ++i) {
305
1/2
✓ Branch 3 taken 1950 times.
✗ Branch 4 not taken.
1950 std::vector<CollisionCallBackDefault> callbacks(managers.size());
306
2/2
✓ Branch 1 taken 17550 times.
✓ Branch 2 taken 1950 times.
19500 for (size_t j = 0; j < managers.size(); ++j) {
307
2/2
✓ Branch 0 taken 5940 times.
✓ Branch 1 taken 11610 times.
17550 if (exhaustive)
308 5940 callbacks[j].data.request.num_max_contacts = 100000;
309 else
310 11610 callbacks[j].data.request.num_max_contacts = num_max_contacts;
311 }
312
313
2/2
✓ Branch 1 taken 17550 times.
✓ Branch 2 taken 1950 times.
19500 for (size_t j = 0; j < managers.size(); ++j) {
314
1/2
✓ Branch 2 taken 17550 times.
✗ Branch 3 not taken.
17550 timers[j].start();
315
1/2
✓ Branch 4 taken 17550 times.
✗ Branch 5 not taken.
17550 managers[j]->collide(query[i], &callbacks[j]);
316
1/2
✓ Branch 2 taken 17550 times.
✗ Branch 3 not taken.
17550 timers[j].stop();
317
2/4
✓ Branch 3 taken 17550 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 17550 times.
✗ Branch 7 not taken.
17550 ts[j].push_back(timers[j].getElapsedTime());
318 }
319
320 // for(size_t j = 0; j < managers.size(); ++j)
321 // std::cout << callbacks[i].data.result.numContacts() << " ";
322 // std::cout << std::endl;
323
324
2/2
✓ Branch 0 taken 660 times.
✓ Branch 1 taken 1290 times.
1950 if (exhaustive) {
325
2/2
✓ Branch 1 taken 5280 times.
✓ Branch 2 taken 660 times.
5940 for (size_t j = 1; j < managers.size(); ++j)
326
6/12
✓ Branch 1 taken 5280 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 5280 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 5280 times.
✗ Branch 12 not taken.
✓ Branch 18 taken 5280 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 5280 times.
✗ Branch 22 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 5280 times.
5280 BOOST_CHECK(callbacks[j].data.result.numContacts() ==
327 callbacks[0].data.result.numContacts());
328 } else {
329
1/2
✓ Branch 3 taken 1290 times.
✗ Branch 4 not taken.
1290 std::vector<bool> query_res(managers.size());
330
2/2
✓ Branch 1 taken 11610 times.
✓ Branch 2 taken 1290 times.
12900 for (size_t j = 0; j < query_res.size(); ++j)
331
1/2
✓ Branch 3 taken 11610 times.
✗ Branch 4 not taken.
11610 query_res[j] = (callbacks[j].data.result.numContacts() > 0);
332
2/2
✓ Branch 1 taken 10320 times.
✓ Branch 2 taken 1290 times.
11610 for (size_t j = 1; j < query_res.size(); ++j)
333
8/16
✓ Branch 1 taken 10320 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 10320 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 10320 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 10320 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 10320 times.
✗ Branch 18 not taken.
✓ Branch 21 taken 10320 times.
✗ Branch 22 not taken.
✓ Branch 24 taken 10320 times.
✗ Branch 25 not taken.
✗ Branch 29 not taken.
✓ Branch 30 taken 10320 times.
10320 BOOST_CHECK(query_res[0] == query_res[j]);
334
335
2/2
✓ Branch 1 taken 10320 times.
✓ Branch 2 taken 1290 times.
11610 for (size_t j = 1; j < managers.size(); ++j)
336
6/12
✓ Branch 1 taken 10320 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 10320 times.
✗ Branch 6 not taken.
✓ Branch 11 taken 10320 times.
✗ Branch 12 not taken.
✓ Branch 18 taken 10320 times.
✗ Branch 19 not taken.
✓ Branch 21 taken 10320 times.
✗ Branch 22 not taken.
✗ Branch 26 not taken.
✓ Branch 27 taken 10320 times.
10320 BOOST_CHECK(callbacks[j].data.result.numContacts() ==
337 callbacks[0].data.result.numContacts());
338 1290 }
339 1950 }
340
341
3/4
✓ Branch 1 taken 1077 times.
✗ Branch 2 not taken.
✓ Branch 6 taken 1077 times.
✓ Branch 7 taken 24 times.
1101 for (size_t i = 0; i < env.size(); ++i) delete env[i];
342
3/4
✓ Branch 1 taken 1950 times.
✗ Branch 2 not taken.
✓ Branch 6 taken 1950 times.
✓ Branch 7 taken 24 times.
1974 for (size_t i = 0; i < query.size(); ++i) delete query[i];
343
344
3/4
✓ Branch 1 taken 216 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 216 times.
✓ Branch 6 taken 24 times.
240 for (size_t i = 0; i < managers.size(); ++i) delete managers[i];
345
346 24 std::cout.setf(std::ios_base::left, std::ios_base::adjustfield);
347 24 int w = 7;
348
349
2/4
✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 24 times.
✗ Branch 5 not taken.
24 std::cout << "collision timing summary" << std::endl;
350
5/10
✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 24 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 24 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 24 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 24 times.
✗ Branch 14 not taken.
24 std::cout << env_size << " objs, " << query_size << " queries" << std::endl;
351
2/4
✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 24 times.
✗ Branch 5 not taken.
24 std::cout << "register time" << std::endl;
352
2/2
✓ Branch 1 taken 216 times.
✓ Branch 2 taken 24 times.
240 for (size_t i = 0; i < ts.size(); ++i)
353
3/6
✓ Branch 2 taken 216 times.
✗ Branch 3 not taken.
✓ Branch 7 taken 216 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 216 times.
✗ Branch 11 not taken.
216 std::cout << std::setw(w) << ts[i].records[0] << " ";
354
1/2
✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
24 std::cout << std::endl;
355
356
2/4
✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 24 times.
✗ Branch 5 not taken.
24 std::cout << "setup time" << std::endl;
357
2/2
✓ Branch 1 taken 216 times.
✓ Branch 2 taken 24 times.
240 for (size_t i = 0; i < ts.size(); ++i)
358
3/6
✓ Branch 2 taken 216 times.
✗ Branch 3 not taken.
✓ Branch 7 taken 216 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 216 times.
✗ Branch 11 not taken.
216 std::cout << std::setw(w) << ts[i].records[1] << " ";
359
1/2
✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
24 std::cout << std::endl;
360
361
2/4
✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 24 times.
✗ Branch 5 not taken.
24 std::cout << "self collision time" << std::endl;
362
2/2
✓ Branch 1 taken 216 times.
✓ Branch 2 taken 24 times.
240 for (size_t i = 0; i < ts.size(); ++i)
363
3/6
✓ Branch 2 taken 216 times.
✗ Branch 3 not taken.
✓ Branch 7 taken 216 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 216 times.
✗ Branch 11 not taken.
216 std::cout << std::setw(w) << ts[i].records[2] << " ";
364
1/2
✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
24 std::cout << std::endl;
365
366
2/4
✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 24 times.
✗ Branch 5 not taken.
24 std::cout << "collision time" << std::endl;
367
2/2
✓ Branch 1 taken 216 times.
✓ Branch 2 taken 24 times.
240 for (size_t i = 0; i < ts.size(); ++i) {
368 216 double tmp = 0;
369
2/2
✓ Branch 4 taken 17550 times.
✓ Branch 5 taken 216 times.
17766 for (size_t j = 3; j < ts[i].records.size(); ++j) tmp += ts[i].records[j];
370
3/6
✓ Branch 2 taken 216 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 216 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 216 times.
✗ Branch 9 not taken.
216 std::cout << std::setw(w) << tmp << " ";
371 }
372
1/2
✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
24 std::cout << std::endl;
373
374
2/4
✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 24 times.
✗ Branch 5 not taken.
24 std::cout << "overall time" << std::endl;
375
2/2
✓ Branch 1 taken 216 times.
✓ Branch 2 taken 24 times.
240 for (size_t i = 0; i < ts.size(); ++i)
376
3/6
✓ Branch 2 taken 216 times.
✗ Branch 3 not taken.
✓ Branch 6 taken 216 times.
✗ Branch 7 not taken.
✓ Branch 9 taken 216 times.
✗ Branch 10 not taken.
216 std::cout << std::setw(w) << ts[i].overall_time << " ";
377
1/2
✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
24 std::cout << std::endl;
378
1/2
✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
24 std::cout << std::endl;
379 24 }
380