FCL  0.6.0
Flexible Collision Library
broadphase_SaP.h
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 
38 #ifndef FCL_BROAD_PHASE_SAP_H
39 #define FCL_BROAD_PHASE_SAP_H
40 
41 #include <map>
42 #include <list>
43 
44 #include "fcl/broadphase/broadphase_collision_manager.h"
45 
46 namespace fcl
47 {
48 
50 template <typename S>
52 {
53 public:
54 
56 
58 
60  void registerObjects(const std::vector<CollisionObject<S>*>& other_objs);
61 
64 
67 
69  void setup();
70 
72  void update();
73 
75  void update(CollisionObject<S>* updated_obj);
76 
78  void update(const std::vector<CollisionObject<S>*>& updated_objs);
79 
81  void clear();
82 
84  void getObjects(std::vector<CollisionObject<S>*>& objs) const;
85 
87  void collide(CollisionObject<S>* obj, void* cdata, CollisionCallBack<S> callback) const;
88 
90  void distance(CollisionObject<S>* obj, void* cdata, DistanceCallBack<S> callback) const;
91 
93  void collide(void* cdata, CollisionCallBack<S> callback) const;
94 
96  void distance(void* cdata, DistanceCallBack<S> callback) const;
97 
99  void collide(BroadPhaseCollisionManager<S>* other_manager, void* cdata, CollisionCallBack<S> callback) const;
100 
102  void distance(BroadPhaseCollisionManager<S>* other_manager, void* cdata, DistanceCallBack<S> callback) const;
103 
105  bool empty() const;
106 
108  size_t size() const;
109 
110 protected:
111 
113  struct SaPAABB;
114 
116  struct EndPoint;
117 
119  struct SaPPair;
120 
122  class isUnregistered;
123 
125  class isNotValidPair;
126 
127  void update_(SaPAABB* updated_aabb);
128 
129  void updateVelist();
130 
133 
135  std::vector<EndPoint*> velist[3];
136 
138  std::list<SaPAABB*> AABB_arr;
139 
141  std::list<SaPPair> overlap_pairs;
142 
143  size_t optimal_axis;
144 
145  std::map<CollisionObject<S>*, SaPAABB*> obj_aabb_map;
146 
147  bool distance_(CollisionObject<S>* obj, void* cdata, DistanceCallBack<S> callback, S& min_dist) const;
148 
149  bool collide_(CollisionObject<S>* obj, void* cdata, CollisionCallBack<S> callback) const;
150 
151  void addToOverlapPairs(const SaPPair& p);
152 
153  void removeFromOverlapPairs(const SaPPair& p);
154 };
155 
158 
160 template <typename S>
162 {
165 
168 
171 
174 };
175 
177 template <typename S>
179 {
181  char minmax;
182 
185 
187  EndPoint* prev[3];
188 
190  EndPoint* next[3];
191 
193  const Vector3<S>& getVal() const;
194 
196  Vector3<S>& getVal();
197 
198  S getVal(size_t i) const;
199 
200  S& getVal(size_t i);
201 
202 };
203 
205 template <typename S>
207 {
209 
210  CollisionObject<S>* obj1;
211  CollisionObject<S>* obj2;
212 
213  bool operator == (const SaPPair& other) const;
214 };
215 
217 template <typename S>
219 {
220  CollisionObject<S>* obj;
221 
222 public:
224 
225  bool operator() (const SaPPair& pair) const;
226 };
227 
229 template <typename S>
231 {
232  CollisionObject<S>* obj1;
233  CollisionObject<S>* obj2;
234 
235 public:
237 
238  bool operator() (const SaPPair& pair);
239 };
240 
241 } // namespace fcl
242 
243 #include "fcl/broadphase/broadphase_SaP-inl.h"
244 
245 #endif
End point for an interval.
Definition: broadphase_SaP.h:178
void clear()
clear the manager
Definition: broadphase_SaP-inl.h:521
EndPoint * elist[3]
End point list for x, y, z coordinates.
Definition: broadphase_SaP.h:132
Main namespace.
Definition: broadphase_bruteforce-inl.h:45
void distance(CollisionObject< S > *obj, void *cdata, DistanceCallBack< S > callback) const
perform distance computation between one object and all the objects belonging to the manager ...
Definition: broadphase_SaP-inl.h:759
Functor to help remove collision pairs no longer valid (i.e., should be culled away) ...
Definition: broadphase_SaP.h:230
size_t size() const
the number of objects managed by the manager
Definition: broadphase_SaP-inl.h:880
SaPCollisionManager< S >::EndPoint * hi
higher bound end point of the interval
Definition: broadphase_SaP.h:170
SAP interval for one object.
Definition: broadphase_SaP.h:161
char minmax
tag for whether it is a lower bound or higher bound of an interval, 0 for lo, and 1 for hi ...
Definition: broadphase_SaP.h:181
SaPCollisionManager< S >::SaPAABB * aabb
back pointer to SAP interval
Definition: broadphase_SaP.h:184
std::list< SaPAABB * > AABB_arr
SAP interval list.
Definition: broadphase_SaP.h:138
Functor to help unregister one object.
Definition: broadphase_SaP.h:218
bool(*)(CollisionObject< S > *o1, CollisionObject< S > *o2, void *cdata) CollisionCallBack
Callback for collision between two objects. Return value is whether can stop now. ...
Definition: broadphase_collision_manager.h:53
void update()
update the condition of manager
Definition: broadphase_SaP-inl.h:507
bool(*)(CollisionObject< S > *o1, CollisionObject< S > *o2, void *cdata, S &dist) DistanceCallBack
Callback for distance between two objects, Return value is whether can stop now, also return the mini...
Definition: broadphase_collision_manager.h:60
std::list< SaPPair > overlap_pairs
The pair of objects that should further check for collision.
Definition: broadphase_SaP.h:141
CollisionObject< S > * obj
object
Definition: broadphase_SaP.h:164
void collide(CollisionObject< S > *obj, void *cdata, CollisionCallBack< S > callback) const
perform collision test between one object and all the objects belonging to the manager ...
Definition: broadphase_SaP-inl.h:642
AABB< S > cached
cached AABB<S> value
Definition: broadphase_SaP.h:173
bool empty() const
whether the manager is empty
Definition: broadphase_SaP-inl.h:873
the object for collision or distance computation, contains the geometry and the transform information...
Definition: collision_object.h:51
void registerObject(CollisionObject< S > *obj)
remove one object from the manager
Definition: broadphase_SaP-inl.h:206
void setup()
initialize the manager, related with the specific type of manager
Definition: broadphase_SaP-inl.h:306
void unregisterObject(CollisionObject< S > *obj)
add one object to the manager
Definition: broadphase_SaP-inl.h:52
void registerObjects(const std::vector< CollisionObject< S > * > &other_objs)
add objects to the manager
Definition: broadphase_SaP-inl.h:117
SaPCollisionManager< S >::EndPoint * lo
lower bound end point of the interval
Definition: broadphase_SaP.h:167
Base class for broad phase collision. It helps to accelerate the collision/distance between N objects...
Definition: broadphase_collision_manager.h:66
A pair of objects that are not culling away and should further check collision.
Definition: broadphase_SaP.h:206
std::vector< EndPoint * > velist[3]
vector version of elist, for acceleration
Definition: broadphase_SaP.h:135
Rigorous SAP collision manager.
Definition: broadphase_SaP.h:51
void getObjects(std::vector< CollisionObject< S > * > &objs) const
return the objects managed by the manager
Definition: broadphase_SaP-inl.h:547