GCC Code Coverage Report


Directory: ./
File: src/distance_func_matrix.cpp
Date: 2025-05-02 10:16:21
Exec Total Coverage
Lines: 233 286 81.5%
Branches: 14 150 9.3%

Line Branch Exec Source
1 /*
2 * Software License Agreement (BSD License)
3 *
4 * Copyright (c) 2011-2014, Willow Garage, Inc.
5 * Copyright (c) 2014-2015, 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 #include "coal/distance_func_matrix.h"
39
40 #include <../src/collision_node.h>
41 #include "coal/internal/shape_shape_func.h"
42 #include "coal/internal/traversal_node_setup.h"
43 #include "coal/internal/shape_shape_func.h"
44 #include <../src/traits_traversal.h>
45
46 namespace coal {
47
48 #ifdef COAL_HAS_OCTOMAP
49
50 template <typename TypeA, typename TypeB>
51 Scalar Distance(const CollisionGeometry* o1, const Transform3s& tf1,
52 const CollisionGeometry* o2, const Transform3s& tf2,
53 const GJKSolver* nsolver, const DistanceRequest& request,
54 DistanceResult& result) {
55 if (request.isSatisfied(result)) return result.min_distance;
56 typename TraversalTraitsDistance<TypeA, TypeB>::CollisionTraversal_t node;
57 const TypeA* obj1 = static_cast<const TypeA*>(o1);
58 const TypeB* obj2 = static_cast<const TypeB*>(o2);
59 OcTreeSolver otsolver(nsolver);
60
61 initialize(node, *obj1, tf1, *obj2, tf2, &otsolver, request, result);
62 distance(&node);
63
64 return result.min_distance;
65 }
66
67 #endif
68
69 COAL_LOCAL Scalar distance_function_not_implemented(
70 const CollisionGeometry* o1, const Transform3s& /*tf1*/,
71 const CollisionGeometry* o2, const Transform3s& /*tf2*/,
72 const GJKSolver* /*nsolver*/, const DistanceRequest& /*request*/,
73 DistanceResult& /*result*/) {
74 NODE_TYPE node_type1 = o1->getNodeType();
75 NODE_TYPE node_type2 = o2->getNodeType();
76
77 COAL_THROW_PRETTY("Distance function between node type "
78 << std::string(get_node_type_name(node_type1))
79 << " and node type "
80 << std::string(get_node_type_name(node_type2))
81 << " is not yet supported.",
82 std::invalid_argument);
83 }
84
85 template <typename T_BVH, typename T_SH>
86 struct COAL_LOCAL BVHShapeDistancer {
87 static Scalar distance(const CollisionGeometry* o1, const Transform3s& tf1,
88 const CollisionGeometry* o2, const Transform3s& tf2,
89 const GJKSolver* nsolver,
90 const DistanceRequest& request,
91 DistanceResult& result) {
92 if (request.isSatisfied(result)) return result.min_distance;
93 MeshShapeDistanceTraversalNode<T_BVH, T_SH> node;
94 const BVHModel<T_BVH>* obj1 = static_cast<const BVHModel<T_BVH>*>(o1);
95 BVHModel<T_BVH>* obj1_tmp = new BVHModel<T_BVH>(*obj1);
96 Transform3s tf1_tmp = tf1;
97 const T_SH* obj2 = static_cast<const T_SH*>(o2);
98
99 initialize(node, *obj1_tmp, tf1_tmp, *obj2, tf2, nsolver, request, result);
100 ::coal::distance(&node);
101
102 delete obj1_tmp;
103 return result.min_distance;
104 } // namespace coal
105 };
106
107 namespace details {
108
109 template <typename OrientedMeshShapeDistanceTraversalNode, typename T_BVH,
110 typename T_SH>
111 204 Scalar orientedBVHShapeDistance(const CollisionGeometry* o1,
112 const Transform3s& tf1,
113 const CollisionGeometry* o2,
114 const Transform3s& tf2,
115 const GJKSolver* nsolver,
116 const DistanceRequest& request,
117 DistanceResult& result) {
118
2/4
✓ Branch 1 taken 102 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 102 times.
204 if (request.isSatisfied(result)) return result.min_distance;
119
1/2
✓ Branch 1 taken 102 times.
✗ Branch 2 not taken.
204 OrientedMeshShapeDistanceTraversalNode node;
120 204 const BVHModel<T_BVH>* obj1 = static_cast<const BVHModel<T_BVH>*>(o1);
121 204 const T_SH* obj2 = static_cast<const T_SH*>(o2);
122
123
1/2
✓ Branch 1 taken 102 times.
✗ Branch 2 not taken.
204 initialize(node, *obj1, tf1, *obj2, tf2, nsolver, request, result);
124
1/2
✓ Branch 1 taken 102 times.
✗ Branch 2 not taken.
204 ::coal::distance(&node);
125
126 204 return result.min_distance;
127 }
128
129 } // namespace details
130
131 template <typename T_SH>
132 struct COAL_LOCAL BVHShapeDistancer<RSS, T_SH> {
133 static Scalar distance(const CollisionGeometry* o1, const Transform3s& tf1,
134 const CollisionGeometry* o2, const Transform3s& tf2,
135 const GJKSolver* nsolver,
136 const DistanceRequest& request,
137 DistanceResult& result) {
138 return details::orientedBVHShapeDistance<
139 MeshShapeDistanceTraversalNodeRSS<T_SH>, RSS, T_SH>(
140 o1, tf1, o2, tf2, nsolver, request, result);
141 }
142 };
143
144 template <typename T_SH>
145 struct COAL_LOCAL BVHShapeDistancer<kIOS, T_SH> {
146 static Scalar distance(const CollisionGeometry* o1, const Transform3s& tf1,
147 const CollisionGeometry* o2, const Transform3s& tf2,
148 const GJKSolver* nsolver,
149 const DistanceRequest& request,
150 DistanceResult& result) {
151 return details::orientedBVHShapeDistance<
152 MeshShapeDistanceTraversalNodekIOS<T_SH>, kIOS, T_SH>(
153 o1, tf1, o2, tf2, nsolver, request, result);
154 }
155 };
156
157 template <typename T_SH>
158 struct COAL_LOCAL BVHShapeDistancer<OBBRSS, T_SH> {
159 204 static Scalar distance(const CollisionGeometry* o1, const Transform3s& tf1,
160 const CollisionGeometry* o2, const Transform3s& tf2,
161 const GJKSolver* nsolver,
162 const DistanceRequest& request,
163 DistanceResult& result) {
164 return details::orientedBVHShapeDistance<
165 204 MeshShapeDistanceTraversalNodeOBBRSS<T_SH>, OBBRSS, T_SH>(
166 204 o1, tf1, o2, tf2, nsolver, request, result);
167 }
168 };
169
170 template <typename T_HF, typename T_SH>
171 struct COAL_LOCAL HeightFieldShapeDistancer {
172 static Scalar distance(const CollisionGeometry* o1, const Transform3s& tf1,
173 const CollisionGeometry* o2, const Transform3s& tf2,
174 const GJKSolver* nsolver,
175 const DistanceRequest& request,
176 DistanceResult& result) {
177 COAL_UNUSED_VARIABLE(o1);
178 COAL_UNUSED_VARIABLE(tf1);
179 COAL_UNUSED_VARIABLE(o2);
180 COAL_UNUSED_VARIABLE(tf2);
181 COAL_UNUSED_VARIABLE(nsolver);
182 COAL_UNUSED_VARIABLE(request);
183 // TODO(jcarpent)
184 COAL_THROW_PRETTY(
185 "Distance between a height field and a shape is not implemented",
186 std::invalid_argument);
187 // if(request.isSatisfied(result)) return result.min_distance;
188 // HeightFieldShapeDistanceTraversalNode<T_HF, T_SH> node;
189 //
190 // const HeightField<T_HF>* obj1 = static_cast<const HeightField<T_HF>*
191 // >(o1); const T_SH* obj2 = static_cast<const T_SH*>(o2);
192 //
193 // initialize(node, *obj1, tf1, *obj2, tf2, nsolver, request, result);
194 // fcl::distance(&node);
195
196 return result.min_distance;
197 }
198 };
199
200 template <typename T_BVH>
201 Scalar BVHDistance(const CollisionGeometry* o1, const Transform3s& tf1,
202 const CollisionGeometry* o2, const Transform3s& tf2,
203 const DistanceRequest& request, DistanceResult& result) {
204 if (request.isSatisfied(result)) return result.min_distance;
205 MeshDistanceTraversalNode<T_BVH> node;
206 const BVHModel<T_BVH>* obj1 = static_cast<const BVHModel<T_BVH>*>(o1);
207 const BVHModel<T_BVH>* obj2 = static_cast<const BVHModel<T_BVH>*>(o2);
208 BVHModel<T_BVH>* obj1_tmp = new BVHModel<T_BVH>(*obj1);
209 Transform3s tf1_tmp = tf1;
210 BVHModel<T_BVH>* obj2_tmp = new BVHModel<T_BVH>(*obj2);
211 Transform3s tf2_tmp = tf2;
212
213 initialize(node, *obj1_tmp, tf1_tmp, *obj2_tmp, tf2_tmp, request, result);
214 distance(&node);
215 delete obj1_tmp;
216 delete obj2_tmp;
217
218 return result.min_distance;
219 }
220
221 namespace details {
222 template <typename OrientedMeshDistanceTraversalNode, typename T_BVH>
223 14282 Scalar orientedMeshDistance(const CollisionGeometry* o1, const Transform3s& tf1,
224 const CollisionGeometry* o2, const Transform3s& tf2,
225 const DistanceRequest& request,
226 DistanceResult& result) {
227
2/4
✓ Branch 1 taken 7141 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 7141 times.
14282 if (request.isSatisfied(result)) return result.min_distance;
228
1/2
✓ Branch 1 taken 7141 times.
✗ Branch 2 not taken.
14282 OrientedMeshDistanceTraversalNode node;
229 14282 const BVHModel<T_BVH>* obj1 = static_cast<const BVHModel<T_BVH>*>(o1);
230 14282 const BVHModel<T_BVH>* obj2 = static_cast<const BVHModel<T_BVH>*>(o2);
231
232
1/2
✓ Branch 1 taken 7141 times.
✗ Branch 2 not taken.
14282 initialize(node, *obj1, tf1, *obj2, tf2, request, result);
233
1/2
✓ Branch 1 taken 7141 times.
✗ Branch 2 not taken.
14282 distance(&node);
234
235 14282 return result.min_distance;
236 }
237
238 } // namespace details
239
240 template <>
241 Scalar BVHDistance<RSS>(const CollisionGeometry* o1, const Transform3s& tf1,
242 const CollisionGeometry* o2, const Transform3s& tf2,
243 const DistanceRequest& request,
244 DistanceResult& result) {
245 return details::orientedMeshDistance<MeshDistanceTraversalNodeRSS, RSS>(
246 o1, tf1, o2, tf2, request, result);
247 }
248
249 template <>
250 Scalar BVHDistance<kIOS>(const CollisionGeometry* o1, const Transform3s& tf1,
251 const CollisionGeometry* o2, const Transform3s& tf2,
252 const DistanceRequest& request,
253 DistanceResult& result) {
254 return details::orientedMeshDistance<MeshDistanceTraversalNodekIOS, kIOS>(
255 o1, tf1, o2, tf2, request, result);
256 }
257
258 template <>
259 7141 Scalar BVHDistance<OBBRSS>(const CollisionGeometry* o1, const Transform3s& tf1,
260 const CollisionGeometry* o2, const Transform3s& tf2,
261 const DistanceRequest& request,
262 DistanceResult& result) {
263 7141 return details::orientedMeshDistance<MeshDistanceTraversalNodeOBBRSS, OBBRSS>(
264 7141 o1, tf1, o2, tf2, request, result);
265 }
266
267 template <typename T_BVH>
268 14282 Scalar BVHDistance(const CollisionGeometry* o1, const Transform3s& tf1,
269 const CollisionGeometry* o2, const Transform3s& tf2,
270 const GJKSolver* /*nsolver*/, const DistanceRequest& request,
271 DistanceResult& result) {
272 14282 return BVHDistance<T_BVH>(o1, tf1, o2, tf2, request, result);
273 }
274
275 10 DistanceFunctionMatrix::DistanceFunctionMatrix() {
276
2/2
✓ Branch 0 taken 230 times.
✓ Branch 1 taken 10 times.
240 for (int i = 0; i < NODE_COUNT; ++i) {
277
2/2
✓ Branch 0 taken 5290 times.
✓ Branch 1 taken 230 times.
5520 for (int j = 0; j < NODE_COUNT; ++j) distance_matrix[i][j] = NULL;
278 }
279
280 // clang-format off
281 10 distance_matrix[GEOM_BOX][GEOM_BOX] = &ShapeShapeDistance<Box, Box>;
282 10 distance_matrix[GEOM_BOX][GEOM_SPHERE] = &ShapeShapeDistance<Box, Sphere>;
283 10 distance_matrix[GEOM_BOX][GEOM_CAPSULE] = &ShapeShapeDistance<Box, Capsule>;
284 10 distance_matrix[GEOM_BOX][GEOM_CONE] = &ShapeShapeDistance<Box, Cone>;
285 10 distance_matrix[GEOM_BOX][GEOM_CYLINDER] = &ShapeShapeDistance<Box, Cylinder>;
286 10 distance_matrix[GEOM_BOX][GEOM_CONVEX16] = &ShapeShapeDistance<Box, ConvexBase16>;
287 10 distance_matrix[GEOM_BOX][GEOM_CONVEX32] = &ShapeShapeDistance<Box, ConvexBase32>;
288 10 distance_matrix[GEOM_BOX][GEOM_PLANE] = &ShapeShapeDistance<Box, Plane>;
289 10 distance_matrix[GEOM_BOX][GEOM_HALFSPACE] = &ShapeShapeDistance<Box, Halfspace>;
290 10 distance_matrix[GEOM_BOX][GEOM_ELLIPSOID] = &ShapeShapeDistance<Box, Ellipsoid>;
291
292 10 distance_matrix[GEOM_SPHERE][GEOM_BOX] = &ShapeShapeDistance<Sphere, Box>;
293 10 distance_matrix[GEOM_SPHERE][GEOM_SPHERE] = &ShapeShapeDistance<Sphere, Sphere>;
294 10 distance_matrix[GEOM_SPHERE][GEOM_CAPSULE] = &ShapeShapeDistance<Sphere, Capsule>;
295 10 distance_matrix[GEOM_SPHERE][GEOM_CONE] = &ShapeShapeDistance<Sphere, Cone>;
296 10 distance_matrix[GEOM_SPHERE][GEOM_CYLINDER] = &ShapeShapeDistance<Sphere, Cylinder>;
297 10 distance_matrix[GEOM_SPHERE][GEOM_CONVEX16] = &ShapeShapeDistance<Sphere, ConvexBase16>;
298 10 distance_matrix[GEOM_SPHERE][GEOM_CONVEX32] = &ShapeShapeDistance<Sphere, ConvexBase32>;
299 10 distance_matrix[GEOM_SPHERE][GEOM_PLANE] = &ShapeShapeDistance<Sphere, Plane>;
300 10 distance_matrix[GEOM_SPHERE][GEOM_HALFSPACE] = &ShapeShapeDistance<Sphere, Halfspace>;
301 10 distance_matrix[GEOM_SPHERE][GEOM_ELLIPSOID] = &ShapeShapeDistance<Sphere, Ellipsoid>;
302
303 10 distance_matrix[GEOM_ELLIPSOID][GEOM_BOX] = &ShapeShapeDistance<Ellipsoid, Box>;
304 10 distance_matrix[GEOM_ELLIPSOID][GEOM_SPHERE] = &ShapeShapeDistance<Ellipsoid, Sphere>;
305 10 distance_matrix[GEOM_ELLIPSOID][GEOM_CAPSULE] = &ShapeShapeDistance<Ellipsoid, Capsule>;
306 10 distance_matrix[GEOM_ELLIPSOID][GEOM_CONE] = &ShapeShapeDistance<Ellipsoid, Cone>;
307 10 distance_matrix[GEOM_ELLIPSOID][GEOM_CYLINDER] = &ShapeShapeDistance<Ellipsoid, Cylinder>;
308 10 distance_matrix[GEOM_ELLIPSOID][GEOM_CONVEX16] = &ShapeShapeDistance<Ellipsoid, ConvexBase16>;
309 10 distance_matrix[GEOM_ELLIPSOID][GEOM_CONVEX32] = &ShapeShapeDistance<Ellipsoid, ConvexBase32>;
310 10 distance_matrix[GEOM_ELLIPSOID][GEOM_PLANE] = &ShapeShapeDistance<Ellipsoid, Plane>;
311 10 distance_matrix[GEOM_ELLIPSOID][GEOM_HALFSPACE] = &ShapeShapeDistance<Ellipsoid, Halfspace>;
312 10 distance_matrix[GEOM_ELLIPSOID][GEOM_ELLIPSOID] = &ShapeShapeDistance<Ellipsoid, Ellipsoid>;
313
314 10 distance_matrix[GEOM_CAPSULE][GEOM_BOX] = &ShapeShapeDistance<Capsule, Box>;
315 10 distance_matrix[GEOM_CAPSULE][GEOM_SPHERE] = &ShapeShapeDistance<Capsule, Sphere>;
316 10 distance_matrix[GEOM_CAPSULE][GEOM_CAPSULE] = &ShapeShapeDistance<Capsule, Capsule>;
317 10 distance_matrix[GEOM_CAPSULE][GEOM_CONE] = &ShapeShapeDistance<Capsule, Cone>;
318 10 distance_matrix[GEOM_CAPSULE][GEOM_CYLINDER] = &ShapeShapeDistance<Capsule, Cylinder>;
319 10 distance_matrix[GEOM_CAPSULE][GEOM_CONVEX16] = &ShapeShapeDistance<Capsule, ConvexBase16>;
320 10 distance_matrix[GEOM_CAPSULE][GEOM_CONVEX32] = &ShapeShapeDistance<Capsule, ConvexBase32>;
321 10 distance_matrix[GEOM_CAPSULE][GEOM_PLANE] = &ShapeShapeDistance<Capsule, Plane>;
322 10 distance_matrix[GEOM_CAPSULE][GEOM_HALFSPACE] = &ShapeShapeDistance<Capsule, Halfspace>;
323 10 distance_matrix[GEOM_CAPSULE][GEOM_ELLIPSOID] = &ShapeShapeDistance<Capsule, Ellipsoid>;
324
325 10 distance_matrix[GEOM_CONE][GEOM_BOX] = &ShapeShapeDistance<Cone, Box>;
326 10 distance_matrix[GEOM_CONE][GEOM_SPHERE] = &ShapeShapeDistance<Cone, Sphere>;
327 10 distance_matrix[GEOM_CONE][GEOM_CAPSULE] = &ShapeShapeDistance<Cone, Capsule>;
328 10 distance_matrix[GEOM_CONE][GEOM_CONE] = &ShapeShapeDistance<Cone, Cone>;
329 10 distance_matrix[GEOM_CONE][GEOM_CYLINDER] = &ShapeShapeDistance<Cone, Cylinder>;
330 10 distance_matrix[GEOM_CONE][GEOM_CONVEX16] = &ShapeShapeDistance<Cone, ConvexBase16>;
331 10 distance_matrix[GEOM_CONE][GEOM_CONVEX32] = &ShapeShapeDistance<Cone, ConvexBase32>;
332 10 distance_matrix[GEOM_CONE][GEOM_PLANE] = &ShapeShapeDistance<Cone, Plane>;
333 10 distance_matrix[GEOM_CONE][GEOM_HALFSPACE] = &ShapeShapeDistance<Cone, Halfspace>;
334 10 distance_matrix[GEOM_CONE][GEOM_ELLIPSOID] = &ShapeShapeDistance<Cone, Ellipsoid>;
335
336 10 distance_matrix[GEOM_CYLINDER][GEOM_BOX] = &ShapeShapeDistance<Cylinder, Box>;
337 10 distance_matrix[GEOM_CYLINDER][GEOM_SPHERE] = &ShapeShapeDistance<Cylinder, Sphere>;
338 10 distance_matrix[GEOM_CYLINDER][GEOM_CAPSULE] = &ShapeShapeDistance<Cylinder, Capsule>;
339 10 distance_matrix[GEOM_CYLINDER][GEOM_CONE] = &ShapeShapeDistance<Cylinder, Cone>;
340 10 distance_matrix[GEOM_CYLINDER][GEOM_CYLINDER] = &ShapeShapeDistance<Cylinder, Cylinder>;
341 10 distance_matrix[GEOM_CYLINDER][GEOM_CONVEX16] = &ShapeShapeDistance<Cylinder, ConvexBase16>;
342 10 distance_matrix[GEOM_CYLINDER][GEOM_CONVEX32] = &ShapeShapeDistance<Cylinder, ConvexBase32>;
343 10 distance_matrix[GEOM_CYLINDER][GEOM_PLANE] = &ShapeShapeDistance<Cylinder, Plane>;
344 10 distance_matrix[GEOM_CYLINDER][GEOM_HALFSPACE] = &ShapeShapeDistance<Cylinder, Halfspace>;
345 10 distance_matrix[GEOM_CYLINDER][GEOM_ELLIPSOID] = &ShapeShapeDistance<Cylinder, Ellipsoid>;
346
347 10 distance_matrix[GEOM_CONVEX16][GEOM_BOX] = &ShapeShapeDistance<ConvexBase16, Box>;
348 10 distance_matrix[GEOM_CONVEX16][GEOM_SPHERE] = &ShapeShapeDistance<ConvexBase16, Sphere>;
349 10 distance_matrix[GEOM_CONVEX16][GEOM_CAPSULE] = &ShapeShapeDistance<ConvexBase16, Capsule>;
350 10 distance_matrix[GEOM_CONVEX16][GEOM_CONE] = &ShapeShapeDistance<ConvexBase16, Cone>;
351 10 distance_matrix[GEOM_CONVEX16][GEOM_CYLINDER] = &ShapeShapeDistance<ConvexBase16, Cylinder>;
352 10 distance_matrix[GEOM_CONVEX16][GEOM_CONVEX16] = &ShapeShapeDistance<ConvexBase16, ConvexBase16>;
353 10 distance_matrix[GEOM_CONVEX16][GEOM_CONVEX32] = &ShapeShapeDistance<ConvexBase16, ConvexBase32>;
354 10 distance_matrix[GEOM_CONVEX16][GEOM_PLANE] = &ShapeShapeDistance<ConvexBase16, Plane>;
355 10 distance_matrix[GEOM_CONVEX16][GEOM_HALFSPACE] = &ShapeShapeDistance<ConvexBase16, Halfspace>;
356 10 distance_matrix[GEOM_CONVEX16][GEOM_ELLIPSOID] = &ShapeShapeDistance<ConvexBase16, Ellipsoid>;
357
358 10 distance_matrix[GEOM_CONVEX32][GEOM_BOX] = &ShapeShapeDistance<ConvexBase32, Box>;
359 10 distance_matrix[GEOM_CONVEX32][GEOM_SPHERE] = &ShapeShapeDistance<ConvexBase32, Sphere>;
360 10 distance_matrix[GEOM_CONVEX32][GEOM_CAPSULE] = &ShapeShapeDistance<ConvexBase32, Capsule>;
361 10 distance_matrix[GEOM_CONVEX32][GEOM_CONE] = &ShapeShapeDistance<ConvexBase32, Cone>;
362 10 distance_matrix[GEOM_CONVEX32][GEOM_CYLINDER] = &ShapeShapeDistance<ConvexBase32, Cylinder>;
363 10 distance_matrix[GEOM_CONVEX32][GEOM_CONVEX16] = &ShapeShapeDistance<ConvexBase32, ConvexBase16>;
364 10 distance_matrix[GEOM_CONVEX32][GEOM_CONVEX32] = &ShapeShapeDistance<ConvexBase32, ConvexBase32>;
365 10 distance_matrix[GEOM_CONVEX32][GEOM_PLANE] = &ShapeShapeDistance<ConvexBase32, Plane>;
366 10 distance_matrix[GEOM_CONVEX32][GEOM_HALFSPACE] = &ShapeShapeDistance<ConvexBase32, Halfspace>;
367 10 distance_matrix[GEOM_CONVEX32][GEOM_ELLIPSOID] = &ShapeShapeDistance<ConvexBase32, Ellipsoid>;
368
369 10 distance_matrix[GEOM_PLANE][GEOM_BOX] = &ShapeShapeDistance<Plane, Box>;
370 10 distance_matrix[GEOM_PLANE][GEOM_SPHERE] = &ShapeShapeDistance<Plane, Sphere>;
371 10 distance_matrix[GEOM_PLANE][GEOM_CAPSULE] = &ShapeShapeDistance<Plane, Capsule>;
372 10 distance_matrix[GEOM_PLANE][GEOM_CONE] = &ShapeShapeDistance<Plane, Cone>;
373 10 distance_matrix[GEOM_PLANE][GEOM_CYLINDER] = &ShapeShapeDistance<Plane, Cylinder>;
374 10 distance_matrix[GEOM_PLANE][GEOM_CONVEX16] = &ShapeShapeDistance<Plane, ConvexBase16>;
375 10 distance_matrix[GEOM_PLANE][GEOM_CONVEX32] = &ShapeShapeDistance<Plane, ConvexBase32>;
376 10 distance_matrix[GEOM_PLANE][GEOM_PLANE] = &ShapeShapeDistance<Plane, Plane>;
377 10 distance_matrix[GEOM_PLANE][GEOM_HALFSPACE] = &ShapeShapeDistance<Plane, Halfspace>;
378 10 distance_matrix[GEOM_PLANE][GEOM_ELLIPSOID] = &ShapeShapeDistance<Plane, Ellipsoid>;
379
380 10 distance_matrix[GEOM_HALFSPACE][GEOM_BOX] = &ShapeShapeDistance<Halfspace, Box>;
381 10 distance_matrix[GEOM_HALFSPACE][GEOM_SPHERE] = &ShapeShapeDistance<Halfspace, Sphere>;
382 10 distance_matrix[GEOM_HALFSPACE][GEOM_CAPSULE] = &ShapeShapeDistance<Halfspace, Capsule>;
383 10 distance_matrix[GEOM_HALFSPACE][GEOM_CONE] = &ShapeShapeDistance<Halfspace, Cone>;
384 10 distance_matrix[GEOM_HALFSPACE][GEOM_CYLINDER] = &ShapeShapeDistance<Halfspace, Cylinder>;
385 10 distance_matrix[GEOM_HALFSPACE][GEOM_CONVEX16] = &ShapeShapeDistance<Halfspace, ConvexBase16>;
386 10 distance_matrix[GEOM_HALFSPACE][GEOM_CONVEX32] = &ShapeShapeDistance<Halfspace, ConvexBase32>;
387 10 distance_matrix[GEOM_HALFSPACE][GEOM_PLANE] = &ShapeShapeDistance<Halfspace, Plane>;
388 10 distance_matrix[GEOM_HALFSPACE][GEOM_HALFSPACE] = &ShapeShapeDistance<Halfspace, Halfspace>;
389 10 distance_matrix[GEOM_HALFSPACE][GEOM_ELLIPSOID] = &ShapeShapeDistance<Halfspace, Ellipsoid>;
390 // clang-format on
391
392 /* AABB distance not implemented */
393 /*
394 distance_matrix[BV_AABB][GEOM_BOX] = &BVHShapeDistancer<AABB, Box>::distance;
395 distance_matrix[BV_AABB][GEOM_SPHERE] = &BVHShapeDistancer<AABB,
396 Sphere>::distance; distance_matrix[BV_AABB][GEOM_CAPSULE] =
397 &BVHShapeDistancer<AABB, Capsule>::distance;
398 distance_matrix[BV_AABB][GEOM_CONE] = &BVHShapeDistancer<AABB,
399 Cone>::distance; distance_matrix[BV_AABB][GEOM_CYLINDER] =
400 &BVHShapeDistancer<AABB, Cylinder>::distance;
401 distance_matrix[BV_AABB][GEOM_CONVEX] = &BVHShapeDistancer<AABB,
402 ConvexBase>::distance; distance_matrix[BV_AABB][GEOM_PLANE] =
403 &BVHShapeDistancer<AABB, Plane>::distance;
404 distance_matrix[BV_AABB][GEOM_HALFSPACE] = &BVHShapeDistancer<AABB,
405 Halfspace>::distance;
406 */
407
408 // clang-format off
409 10 distance_matrix[BV_OBB][GEOM_BOX] = &BVHShapeDistancer<OBB, Box>::distance;
410 10 distance_matrix[BV_OBB][GEOM_SPHERE] = &BVHShapeDistancer<OBB, Sphere>::distance;
411 10 distance_matrix[BV_OBB][GEOM_CAPSULE] = &BVHShapeDistancer<OBB, Capsule>::distance;
412 10 distance_matrix[BV_OBB][GEOM_CONE] = &BVHShapeDistancer<OBB, Cone>::distance;
413 10 distance_matrix[BV_OBB][GEOM_CYLINDER] = &BVHShapeDistancer<OBB, Cylinder>::distance;
414 10 distance_matrix[BV_OBB][GEOM_CONVEX16] = &BVHShapeDistancer<OBB, ConvexBase16>::distance;
415 10 distance_matrix[BV_OBB][GEOM_CONVEX32] = &BVHShapeDistancer<OBB, ConvexBase32>::distance;
416 10 distance_matrix[BV_OBB][GEOM_PLANE] = &BVHShapeDistancer<OBB, Plane>::distance;
417 10 distance_matrix[BV_OBB][GEOM_HALFSPACE] = &BVHShapeDistancer<OBB, Halfspace>::distance;
418 10 distance_matrix[BV_OBB][GEOM_ELLIPSOID] = &BVHShapeDistancer<OBB, Ellipsoid>::distance;
419
420 10 distance_matrix[BV_RSS][GEOM_BOX] = &BVHShapeDistancer<RSS, Box>::distance;
421 10 distance_matrix[BV_RSS][GEOM_SPHERE] = &BVHShapeDistancer<RSS, Sphere>::distance;
422 10 distance_matrix[BV_RSS][GEOM_CAPSULE] = &BVHShapeDistancer<RSS, Capsule>::distance;
423 10 distance_matrix[BV_RSS][GEOM_CONE] = &BVHShapeDistancer<RSS, Cone>::distance;
424 10 distance_matrix[BV_RSS][GEOM_CYLINDER] = &BVHShapeDistancer<RSS, Cylinder>::distance;
425 10 distance_matrix[BV_RSS][GEOM_CONVEX16] = &BVHShapeDistancer<RSS, ConvexBase16>::distance;
426 10 distance_matrix[BV_RSS][GEOM_CONVEX32] = &BVHShapeDistancer<RSS, ConvexBase32>::distance;
427 10 distance_matrix[BV_RSS][GEOM_PLANE] = &BVHShapeDistancer<RSS, Plane>::distance;
428 10 distance_matrix[BV_RSS][GEOM_HALFSPACE] = &BVHShapeDistancer<RSS, Halfspace>::distance;
429 10 distance_matrix[BV_RSS][GEOM_ELLIPSOID] = &BVHShapeDistancer<RSS, Ellipsoid>::distance;
430 // clang-format on
431
432 /* KDOP distance not implemented */
433 /*
434 distance_matrix[BV_KDOP16][GEOM_BOX] = &BVHShapeDistancer<KDOP<16>,
435 Box>::distance; distance_matrix[BV_KDOP16][GEOM_SPHERE] =
436 &BVHShapeDistancer<KDOP<16>, Sphere>::distance;
437 distance_matrix[BV_KDOP16][GEOM_CAPSULE] = &BVHShapeDistancer<KDOP<16>,
438 Capsule>::distance; distance_matrix[BV_KDOP16][GEOM_CONE] =
439 &BVHShapeDistancer<KDOP<16>, Cone>::distance;
440 distance_matrix[BV_KDOP16][GEOM_CYLINDER] = &BVHShapeDistancer<KDOP<16>,
441 Cylinder>::distance; distance_matrix[BV_KDOP16][GEOM_CONVEX] =
442 &BVHShapeDistancer<KDOP<16>, ConvexBase>::distance;
443 distance_matrix[BV_KDOP16][GEOM_PLANE] = &BVHShapeDistancer<KDOP<16>,
444 Plane>::distance; distance_matrix[BV_KDOP16][GEOM_HALFSPACE] =
445 &BVHShapeDistancer<KDOP<16>, Halfspace>::distance;
446
447 distance_matrix[BV_KDOP18][GEOM_BOX] = &BVHShapeDistancer<KDOP<18>,
448 Box>::distance; distance_matrix[BV_KDOP18][GEOM_SPHERE] =
449 &BVHShapeDistancer<KDOP<18>, Sphere>::distance;
450 distance_matrix[BV_KDOP18][GEOM_CAPSULE] = &BVHShapeDistancer<KDOP<18>,
451 Capsule>::distance; distance_matrix[BV_KDOP18][GEOM_CONE] =
452 &BVHShapeDistancer<KDOP<18>, Cone>::distance;
453 distance_matrix[BV_KDOP18][GEOM_CYLINDER] = &BVHShapeDistancer<KDOP<18>,
454 Cylinder>::distance; distance_matrix[BV_KDOP18][GEOM_CONVEX] =
455 &BVHShapeDistancer<KDOP<18>, ConvexBase>::distance;
456 distance_matrix[BV_KDOP18][GEOM_PLANE] = &BVHShapeDistancer<KDOP<18>,
457 Plane>::distance; distance_matrix[BV_KDOP18][GEOM_HALFSPACE] =
458 &BVHShapeDistancer<KDOP<18>, Halfspace>::distance;
459
460 distance_matrix[BV_KDOP24][GEOM_BOX] = &BVHShapeDistancer<KDOP<24>,
461 Box>::distance; distance_matrix[BV_KDOP24][GEOM_SPHERE] =
462 &BVHShapeDistancer<KDOP<24>, Sphere>::distance;
463 distance_matrix[BV_KDOP24][GEOM_CAPSULE] = &BVHShapeDistancer<KDOP<24>,
464 Capsule>::distance; distance_matrix[BV_KDOP24][GEOM_CONE] =
465 &BVHShapeDistancer<KDOP<24>, Cone>::distance;
466 distance_matrix[BV_KDOP24][GEOM_CYLINDER] = &BVHShapeDistancer<KDOP<24>,
467 Cylinder>::distance; distance_matrix[BV_KDOP24][GEOM_CONVEX] =
468 &BVHShapeDistancer<KDOP<24>, ConvexBase>::distance;
469 distance_matrix[BV_KDOP24][GEOM_PLANE] = &BVHShapeDistancer<KDOP<24>,
470 Plane>::distance; distance_matrix[BV_KDOP24][GEOM_HALFSPACE] =
471 &BVHShapeDistancer<KDOP<24>, Halfspace>::distance;
472 */
473
474 // clang-format off
475 10 distance_matrix[BV_kIOS][GEOM_BOX] = &BVHShapeDistancer<kIOS, Box>::distance;
476 10 distance_matrix[BV_kIOS][GEOM_SPHERE] = &BVHShapeDistancer<kIOS, Sphere>::distance;
477 10 distance_matrix[BV_kIOS][GEOM_CAPSULE] = &BVHShapeDistancer<kIOS, Capsule>::distance;
478 10 distance_matrix[BV_kIOS][GEOM_CONE] = &BVHShapeDistancer<kIOS, Cone>::distance;
479 10 distance_matrix[BV_kIOS][GEOM_CYLINDER] = &BVHShapeDistancer<kIOS, Cylinder>::distance;
480 10 distance_matrix[BV_kIOS][GEOM_CONVEX16] = &BVHShapeDistancer<kIOS, ConvexBase16>::distance;
481 10 distance_matrix[BV_kIOS][GEOM_CONVEX32] = &BVHShapeDistancer<kIOS, ConvexBase32>::distance;
482 10 distance_matrix[BV_kIOS][GEOM_PLANE] = &BVHShapeDistancer<kIOS, Plane>::distance;
483 10 distance_matrix[BV_kIOS][GEOM_HALFSPACE] = &BVHShapeDistancer<kIOS, Halfspace>::distance;
484 10 distance_matrix[BV_kIOS][GEOM_ELLIPSOID] = &BVHShapeDistancer<kIOS, Ellipsoid>::distance;
485
486 10 distance_matrix[BV_OBBRSS][GEOM_BOX] = &BVHShapeDistancer<OBBRSS, Box>::distance;
487 10 distance_matrix[BV_OBBRSS][GEOM_SPHERE] = &BVHShapeDistancer<OBBRSS, Sphere>::distance;
488 10 distance_matrix[BV_OBBRSS][GEOM_CAPSULE] = &BVHShapeDistancer<OBBRSS, Capsule>::distance;
489 10 distance_matrix[BV_OBBRSS][GEOM_CONE] = &BVHShapeDistancer<OBBRSS, Cone>::distance;
490 10 distance_matrix[BV_OBBRSS][GEOM_CYLINDER] = &BVHShapeDistancer<OBBRSS, Cylinder>::distance;
491 10 distance_matrix[BV_OBBRSS][GEOM_CONVEX16] = &BVHShapeDistancer<OBBRSS, ConvexBase16>::distance;
492 10 distance_matrix[BV_OBBRSS][GEOM_CONVEX32] = &BVHShapeDistancer<OBBRSS, ConvexBase32>::distance;
493 10 distance_matrix[BV_OBBRSS][GEOM_PLANE] = &BVHShapeDistancer<OBBRSS, Plane>::distance;
494 10 distance_matrix[BV_OBBRSS][GEOM_HALFSPACE] = &BVHShapeDistancer<OBBRSS, Halfspace>::distance;
495 10 distance_matrix[BV_OBBRSS][GEOM_ELLIPSOID] = &BVHShapeDistancer<OBBRSS, Ellipsoid>::distance;
496
497 10 distance_matrix[HF_AABB][GEOM_BOX] = &HeightFieldShapeDistancer<AABB, Box>::distance;
498 10 distance_matrix[HF_AABB][GEOM_SPHERE] = &HeightFieldShapeDistancer<AABB, Sphere>::distance;
499 10 distance_matrix[HF_AABB][GEOM_CAPSULE] = &HeightFieldShapeDistancer<AABB, Capsule>::distance;
500 10 distance_matrix[HF_AABB][GEOM_CONE] = &HeightFieldShapeDistancer<AABB, Cone>::distance;
501 10 distance_matrix[HF_AABB][GEOM_CYLINDER] = &HeightFieldShapeDistancer<AABB, Cylinder>::distance;
502 10 distance_matrix[HF_AABB][GEOM_CONVEX16] = &HeightFieldShapeDistancer<AABB, ConvexBase16>::distance;
503 10 distance_matrix[HF_AABB][GEOM_CONVEX32] = &HeightFieldShapeDistancer<AABB, ConvexBase32>::distance;
504 10 distance_matrix[HF_AABB][GEOM_PLANE] = &HeightFieldShapeDistancer<AABB, Plane>::distance;
505 10 distance_matrix[HF_AABB][GEOM_HALFSPACE] = &HeightFieldShapeDistancer<AABB, Halfspace>::distance;
506 10 distance_matrix[HF_AABB][GEOM_ELLIPSOID] = &HeightFieldShapeDistancer<AABB, Ellipsoid>::distance;
507
508 10 distance_matrix[HF_OBBRSS][GEOM_BOX] = &HeightFieldShapeDistancer<OBBRSS, Box>::distance;
509 10 distance_matrix[HF_OBBRSS][GEOM_SPHERE] = &HeightFieldShapeDistancer<OBBRSS, Sphere>::distance;
510 10 distance_matrix[HF_OBBRSS][GEOM_CAPSULE] = &HeightFieldShapeDistancer<OBBRSS, Capsule>::distance;
511 10 distance_matrix[HF_OBBRSS][GEOM_CONE] = &HeightFieldShapeDistancer<OBBRSS, Cone>::distance;
512 10 distance_matrix[HF_OBBRSS][GEOM_CYLINDER] = &HeightFieldShapeDistancer<OBBRSS, Cylinder>::distance;
513 10 distance_matrix[HF_OBBRSS][GEOM_CONVEX16] = &HeightFieldShapeDistancer<OBBRSS, ConvexBase16>::distance;
514 10 distance_matrix[HF_OBBRSS][GEOM_CONVEX32] = &HeightFieldShapeDistancer<OBBRSS, ConvexBase32>::distance;
515 10 distance_matrix[HF_OBBRSS][GEOM_PLANE] = &HeightFieldShapeDistancer<OBBRSS, Plane>::distance;
516 10 distance_matrix[HF_OBBRSS][GEOM_HALFSPACE] = &HeightFieldShapeDistancer<OBBRSS, Halfspace>::distance;
517 10 distance_matrix[HF_OBBRSS][GEOM_ELLIPSOID] = &HeightFieldShapeDistancer<OBBRSS, Ellipsoid>::distance;
518
519 10 distance_matrix[BV_AABB][BV_AABB] = &BVHDistance<AABB>;
520 10 distance_matrix[BV_OBB][BV_OBB] = &BVHDistance<OBB>;
521 10 distance_matrix[BV_RSS][BV_RSS] = &BVHDistance<RSS>;
522 10 distance_matrix[BV_kIOS][BV_kIOS] = &BVHDistance<kIOS>;
523 10 distance_matrix[BV_OBBRSS][BV_OBBRSS] = &BVHDistance<OBBRSS>;
524
525 #ifdef COAL_HAS_OCTOMAP
526 10 distance_matrix[GEOM_OCTREE][GEOM_BOX] = &Distance<OcTree, Box>;
527 10 distance_matrix[GEOM_OCTREE][GEOM_SPHERE] = &Distance<OcTree, Sphere>;
528 10 distance_matrix[GEOM_OCTREE][GEOM_CAPSULE] = &Distance<OcTree, Capsule>;
529 10 distance_matrix[GEOM_OCTREE][GEOM_CONE] = &Distance<OcTree, Cone>;
530 10 distance_matrix[GEOM_OCTREE][GEOM_CYLINDER] = &Distance<OcTree, Cylinder>;
531 10 distance_matrix[GEOM_OCTREE][GEOM_CONVEX16] = &Distance<OcTree, ConvexBase16>;
532 10 distance_matrix[GEOM_OCTREE][GEOM_CONVEX32] = &Distance<OcTree, ConvexBase32>;
533 10 distance_matrix[GEOM_OCTREE][GEOM_PLANE] = &Distance<OcTree, Plane>;
534 10 distance_matrix[GEOM_OCTREE][GEOM_HALFSPACE] = &Distance<OcTree, Halfspace>;
535 10 distance_matrix[GEOM_OCTREE][GEOM_ELLIPSOID] = &Distance<OcTree, Ellipsoid>;
536
537 10 distance_matrix[GEOM_BOX][GEOM_OCTREE] = &Distance<Box, OcTree>;
538 10 distance_matrix[GEOM_SPHERE][GEOM_OCTREE] = &Distance<Sphere, OcTree>;
539 10 distance_matrix[GEOM_CAPSULE][GEOM_OCTREE] = &Distance<Capsule, OcTree>;
540 10 distance_matrix[GEOM_CONE][GEOM_OCTREE] = &Distance<Cone, OcTree>;
541 10 distance_matrix[GEOM_CYLINDER][GEOM_OCTREE] = &Distance<Cylinder, OcTree>;
542 10 distance_matrix[GEOM_CONVEX16][GEOM_OCTREE] = &Distance<ConvexBase16, OcTree>;
543 10 distance_matrix[GEOM_CONVEX32][GEOM_OCTREE] = &Distance<ConvexBase32, OcTree>;
544 10 distance_matrix[GEOM_PLANE][GEOM_OCTREE] = &Distance<Plane, OcTree>;
545 10 distance_matrix[GEOM_HALFSPACE][GEOM_OCTREE] = &Distance<Halfspace, OcTree>;
546
547 10 distance_matrix[GEOM_OCTREE][GEOM_OCTREE] = &Distance<OcTree, OcTree>;
548
549 10 distance_matrix[GEOM_OCTREE][BV_AABB] = &Distance<OcTree, BVHModel<AABB> >;
550 10 distance_matrix[GEOM_OCTREE][BV_OBB] = &Distance<OcTree, BVHModel<OBB> >;
551 10 distance_matrix[GEOM_OCTREE][BV_RSS] = &Distance<OcTree, BVHModel<RSS> >;
552 10 distance_matrix[GEOM_OCTREE][BV_OBBRSS] = &Distance<OcTree, BVHModel<OBBRSS> >;
553 10 distance_matrix[GEOM_OCTREE][BV_kIOS] = &Distance<OcTree, BVHModel<kIOS> >;
554 10 distance_matrix[GEOM_OCTREE][BV_KDOP16] = &Distance<OcTree, BVHModel<KDOP<16> > >;
555 10 distance_matrix[GEOM_OCTREE][BV_KDOP18] = &Distance<OcTree, BVHModel<KDOP<18> > >;
556 10 distance_matrix[GEOM_OCTREE][BV_KDOP24] = &Distance<OcTree, BVHModel<KDOP<24> > >;
557
558 10 distance_matrix[BV_AABB][GEOM_OCTREE] = &Distance<BVHModel<AABB>, OcTree>;
559 10 distance_matrix[BV_OBB][GEOM_OCTREE] = &Distance<BVHModel<OBB>, OcTree>;
560 10 distance_matrix[BV_RSS][GEOM_OCTREE] = &Distance<BVHModel<RSS>, OcTree>;
561 10 distance_matrix[BV_OBBRSS][GEOM_OCTREE] = &Distance<BVHModel<OBBRSS>, OcTree>;
562 10 distance_matrix[BV_kIOS][GEOM_OCTREE] = &Distance<BVHModel<kIOS>, OcTree>;
563 10 distance_matrix[BV_KDOP16][GEOM_OCTREE] = &Distance<BVHModel<KDOP<16> >, OcTree>;
564 10 distance_matrix[BV_KDOP18][GEOM_OCTREE] = &Distance<BVHModel<KDOP<18> >, OcTree>;
565 10 distance_matrix[BV_KDOP24][GEOM_OCTREE] = &Distance<BVHModel<KDOP<24> >, OcTree>;
566 10 distance_matrix[GEOM_OCTREE][HF_AABB] = &distance_function_not_implemented;
567 10 distance_matrix[GEOM_OCTREE][HF_OBBRSS] = &distance_function_not_implemented;
568 10 distance_matrix[HF_AABB][GEOM_OCTREE] = &distance_function_not_implemented;
569 10 distance_matrix[HF_OBBRSS][GEOM_OCTREE] = &distance_function_not_implemented;
570 #endif
571 // clang-format on
572 10 }
573 // template struct DistanceFunctionMatrix;
574 } // namespace coal
575