From 5d45b71e80c2fdfab23b6459f61d93f68b077299 Mon Sep 17 00:00:00 2001 From: Jeongseok Lee <jslee02@gmail.com> Date: Thu, 16 Apr 2015 18:17:44 -0400 Subject: [PATCH] Fix segfault when registering empty object vector to broad-phase collision managers --- src/broadphase/broadphase_SaP.cpp | 4 ++++ .../broadphase_dynamic_AABB_tree.cpp | 2 ++ .../broadphase_dynamic_AABB_tree_array.cpp | 2 ++ test/test_fcl_broadphase.cpp | 20 +++++++++++++++++++ 4 files changed, 28 insertions(+) diff --git a/src/broadphase/broadphase_SaP.cpp b/src/broadphase/broadphase_SaP.cpp index 81cb7f86..ca2ad816 100644 --- a/src/broadphase/broadphase_SaP.cpp +++ b/src/broadphase/broadphase_SaP.cpp @@ -89,6 +89,8 @@ void SaPCollisionManager::unregisterObject(CollisionObject* obj) void SaPCollisionManager::registerObjects(const std::vector<CollisionObject*>& other_objs) { + if(other_objs.empty()) return; + if(size() > 0) BroadPhaseCollisionManager::registerObjects(other_objs); else @@ -272,6 +274,8 @@ void SaPCollisionManager::registerObject(CollisionObject* obj) void SaPCollisionManager::setup() { + if(size() == 0) return; + FCL_REAL scale[3]; scale[0] = (velist[0].back())->getVal(0) - velist[0][0]->getVal(0); scale[1] = (velist[1].back())->getVal(1) - velist[1][0]->getVal(1);; diff --git a/src/broadphase/broadphase_dynamic_AABB_tree.cpp b/src/broadphase/broadphase_dynamic_AABB_tree.cpp index 69dc7d79..cba7ed6c 100644 --- a/src/broadphase/broadphase_dynamic_AABB_tree.cpp +++ b/src/broadphase/broadphase_dynamic_AABB_tree.cpp @@ -634,6 +634,8 @@ bool selfDistanceRecurse(DynamicAABBTreeCollisionManager::DynamicAABBNode* root, void DynamicAABBTreeCollisionManager::registerObjects(const std::vector<CollisionObject*>& other_objs) { + if(other_objs.empty()) return; + if(size() > 0) { BroadPhaseCollisionManager::registerObjects(other_objs); diff --git a/src/broadphase/broadphase_dynamic_AABB_tree_array.cpp b/src/broadphase/broadphase_dynamic_AABB_tree_array.cpp index c8364517..936a6743 100644 --- a/src/broadphase/broadphase_dynamic_AABB_tree_array.cpp +++ b/src/broadphase/broadphase_dynamic_AABB_tree_array.cpp @@ -657,6 +657,8 @@ bool distanceRecurse(DynamicAABBTreeCollisionManager_Array::DynamicAABBNode* nod void DynamicAABBTreeCollisionManager_Array::registerObjects(const std::vector<CollisionObject*>& other_objs) { + if(other_objs.empty()) return; + if(size() > 0) { BroadPhaseCollisionManager::registerObjects(other_objs); diff --git a/test/test_fcl_broadphase.cpp b/test/test_fcl_broadphase.cpp index 55382ade..e71b4fd7 100644 --- a/test/test_fcl_broadphase.cpp +++ b/test/test_fcl_broadphase.cpp @@ -149,6 +149,26 @@ BOOST_AUTO_TEST_CASE(test_core_bf_broad_phase_self_distance) broad_phase_self_distance_test(200, 5000); } +/// check broad phase collision for empty collision object set and quaries +BOOST_AUTO_TEST_CASE(test_core_bf_broad_phase_collision_empty) +{ + broad_phase_collision_test(2000, 0, 0, 10, false, false); + broad_phase_collision_test(2000, 0, 1000, 10, false, false); + broad_phase_collision_test(2000, 100, 0, 10, false, false); + + broad_phase_collision_test(2000, 0, 0, 10, false, true); + broad_phase_collision_test(2000, 0, 1000, 10, false, true); + broad_phase_collision_test(2000, 100, 0, 10, false, true); + + broad_phase_collision_test(2000, 0, 0, 10, true, false); + broad_phase_collision_test(2000, 0, 1000, 10, true, false); + broad_phase_collision_test(2000, 100, 0, 10, true, false); + + broad_phase_collision_test(2000, 0, 0, 10, true, true); + broad_phase_collision_test(2000, 0, 1000, 10, true, true); + broad_phase_collision_test(2000, 100, 0, 10, true, true); +} + /// check broad phase collision and self collision, only return collision or not BOOST_AUTO_TEST_CASE(test_core_bf_broad_phase_collision_binary) { -- GitLab