38 #define BOOST_TEST_MODULE BROADPHASE_COLLISION_2
39 #include <boost/test/included/unit_test.hpp>
54 #include <sparsehash/sparse_hash_map>
55 #include <sparsehash/dense_hash_map>
66 std::size_t query_size,
68 bool exhaustive =
false,
bool use_mesh =
false);
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> > {};
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);
186 std::size_t query_size,
189 std::vector<TStruct>
ts;
190 std::vector<BenchTimer> timers;
192 std::vector<CollisionObject*> env;
198 std::vector<CollisionObject*> query;
204 std::vector<BroadPhaseCollisionManager*> managers;
211 Vec3f lower_limit, upper_limit;
216 std::min(std::min((upper_limit[0] - lower_limit[0]) / ncell_per_axis,
217 (upper_limit[1] - lower_limit[1]) / ncell_per_axis),
218 (upper_limit[2] - lower_limit[2]) / ncell_per_axis);
223 cell_size, lower_limit, upper_limit));
228 cell_size, lower_limit, upper_limit));
232 cell_size, lower_limit, upper_limit));
240 m->tree_init_level = 2;
241 managers.push_back(
m);
247 m->tree_init_level = 2;
248 managers.push_back(
m);
251 ts.resize(managers.size());
252 timers.resize(managers.size());
254 for (
size_t i = 0; i < managers.size(); ++i) {
256 managers[i]->registerObjects(env);
258 ts[i].push_back(timers[i].getElapsedTime());
261 for (
size_t i = 0; i < managers.size(); ++i) {
263 managers[i]->setup();
265 ts[i].push_back(timers[i].getElapsedTime());
268 std::vector<CollisionCallBackDefault> callbacks(managers.size());
269 for (
size_t i = 0; i < managers.size(); ++i) {
271 callbacks[i].data.request.num_max_contacts = 100000;
276 for (
size_t i = 0; i < managers.size(); ++i) {
278 managers[i]->collide(&callbacks[i]);
280 ts[i].push_back(timers[i].getElapsedTime());
283 for (
size_t i = 0; i < managers.size(); ++i)
284 std::cout << callbacks[i].
data.result.numContacts() <<
" ";
285 std::cout << std::endl;
288 for (
size_t i = 1; i < managers.size(); ++i)
289 BOOST_CHECK(callbacks[i].
data.result.numContacts() ==
290 callbacks[0].data.result.numContacts());
292 std::vector<bool> self_res(managers.size());
293 for (
size_t i = 0; i < self_res.size(); ++i)
294 self_res[i] = (callbacks[i].
data.result.numContacts() > 0);
296 for (
size_t i = 1; i < self_res.size(); ++i)
297 BOOST_CHECK(self_res[0] == self_res[i]);
299 for (
size_t i = 1; i < managers.size(); ++i)
300 BOOST_CHECK(callbacks[i].
data.result.numContacts() ==
301 callbacks[0].data.result.numContacts());
304 for (
size_t i = 0; i < query.size(); ++i) {
305 std::vector<CollisionCallBackDefault> callbacks(managers.size());
306 for (
size_t j = 0; j < managers.size(); ++j) {
308 callbacks[j].data.request.num_max_contacts = 100000;
313 for (
size_t j = 0; j < managers.size(); ++j) {
315 managers[j]->collide(query[i], &callbacks[j]);
317 ts[j].push_back(timers[j].getElapsedTime());
325 for (
size_t j = 1; j < managers.size(); ++j)
326 BOOST_CHECK(callbacks[j].
data.result.numContacts() ==
327 callbacks[0].data.result.numContacts());
329 std::vector<bool> query_res(managers.size());
330 for (
size_t j = 0; j < query_res.size(); ++j)
331 query_res[j] = (callbacks[j].
data.result.numContacts() > 0);
332 for (
size_t j = 1; j < query_res.size(); ++j)
333 BOOST_CHECK(query_res[0] == query_res[j]);
335 for (
size_t j = 1; j < managers.size(); ++j)
336 BOOST_CHECK(callbacks[j].
data.result.numContacts() ==
337 callbacks[0].data.result.numContacts());
341 for (
size_t i = 0; i < env.size(); ++i)
delete env[i];
342 for (
size_t i = 0; i < query.size(); ++i)
delete query[i];
344 for (
size_t i = 0; i < managers.size(); ++i)
delete managers[i];
346 std::cout.setf(std::ios_base::left, std::ios_base::adjustfield);
349 std::cout <<
"collision timing summary" << std::endl;
350 std::cout << env_size <<
" objs, " << query_size <<
" queries" << std::endl;
351 std::cout <<
"register time" << std::endl;
352 for (
size_t i = 0; i <
ts.size(); ++i)
353 std::cout << std::setw(w) <<
ts[i].records[0] <<
" ";
354 std::cout << std::endl;
356 std::cout <<
"setup time" << std::endl;
357 for (
size_t i = 0; i <
ts.size(); ++i)
358 std::cout << std::setw(w) <<
ts[i].records[1] <<
" ";
359 std::cout << std::endl;
361 std::cout <<
"self collision time" << std::endl;
362 for (
size_t i = 0; i <
ts.size(); ++i)
363 std::cout << std::setw(w) <<
ts[i].records[2] <<
" ";
364 std::cout << std::endl;
366 std::cout <<
"collision time" << std::endl;
367 for (
size_t i = 0; i <
ts.size(); ++i) {
369 for (
size_t j = 3; j <
ts[i].records.size(); ++j) tmp +=
ts[i].records[j];
370 std::cout << std::setw(w) << tmp <<
" ";
372 std::cout << std::endl;
374 std::cout <<
"overall time" << std::endl;
375 for (
size_t i = 0; i <
ts.size(); ++i)
376 std::cout << std::setw(w) <<
ts[i].overall_time <<
" ";
377 std::cout << std::endl;
378 std::cout << std::endl;