GCC Code Coverage Report


Directory: ./
File: src/shape/geometric_shapes.cpp
Date: 2025-05-02 10:16:21
Exec Total Coverage
Lines: 101 104 97.1%
Branches: 119 226 52.7%

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/shape/geometric_shapes.h"
39 #include "coal/shape/geometric_shapes_utility.h"
40
41 #ifdef COAL_HAS_QHULL
42 #include <libqhullcpp/QhullError.h>
43 #include <libqhullcpp/QhullFacet.h>
44 #include <libqhullcpp/QhullLinkedList.h>
45 #include <libqhullcpp/QhullVertex.h>
46 #include <libqhullcpp/QhullVertexSet.h>
47 #include <libqhullcpp/QhullRidge.h>
48 #include <libqhullcpp/Qhull.h>
49
50 using orgQhull::Qhull;
51 using orgQhull::QhullFacet;
52 using orgQhull::QhullPoint;
53 using orgQhull::QhullRidgeSet;
54 using orgQhull::QhullVertexList;
55 using orgQhull::QhullVertexSet;
56 #endif
57
58 namespace coal {
59
60 template <typename IndexType>
61 ConvexBaseTpl<IndexType>* ConvexBaseTpl<IndexType>::convexHull(
62 std::shared_ptr<std::vector<Vec3s>>& pts, unsigned int num_points,
63 bool keepTriangles, const char* qhullCommand) {
64 COAL_COMPILER_DIAGNOSTIC_PUSH
65 COAL_COMPILER_DIAGNOSTIC_IGNORED_DEPRECECATED_DECLARATIONS
66 return ConvexBaseTpl<IndexType>::convexHull(pts->data(), num_points,
67 keepTriangles, qhullCommand);
68 COAL_COMPILER_DIAGNOSTIC_POP
69 }
70 template COAL_DLLAPI ConvexBaseTpl<Triangle16::IndexType>*
71 ConvexBaseTpl<Triangle16::IndexType>::convexHull(
72 std::shared_ptr<std::vector<Vec3s>>& pts, unsigned int num_points,
73 bool keepTriangles, const char* qhullCommand);
74 template COAL_DLLAPI ConvexBaseTpl<Triangle32::IndexType>*
75 ConvexBaseTpl<Triangle32::IndexType>::convexHull(
76 std::shared_ptr<std::vector<Vec3s>>& pts, unsigned int num_points,
77 bool keepTriangles, const char* qhullCommand);
78
79 template <typename IndexType>
80 2 ConvexBaseTpl<IndexType>* ConvexBaseTpl<IndexType>::convexHull(
81 const Vec3s* pts, unsigned int num_points, bool keepTriangles,
82 const char* qhullCommand) {
83 #ifdef COAL_HAS_QHULL
84 if (num_points <= 3) {
85 COAL_THROW_PRETTY(
86 "You shouldn't use this function with less than"
87 " 4 points.",
88 std::invalid_argument);
89 }
90 assert(pts[0].data() + 3 == pts[1].data());
91
92 Qhull qh;
93 const char* command =
94 qhullCommand ? qhullCommand : (keepTriangles ? "Qt" : "");
95
96 // TODO: add a ifdef not double precision here
97 using Vec3d = Eigen::Vector3d;
98 std::vector<Vec3d> qhull_pts;
99 qhull_pts.reserve(num_points);
100 for (size_t i = 0; i < num_points; ++i) {
101 qhull_pts.push_back(pts[i].template cast<double>());
102 }
103 qh.runQhull("", 3, static_cast<int>(num_points), qhull_pts[0].data(),
104 command);
105
106 if (qh.qhullStatus() != qh_ERRnone) {
107 if (qh.hasQhullMessage()) std::cerr << qh.qhullMessage() << std::endl;
108 COAL_THROW_PRETTY("Qhull failed", std::logic_error);
109 }
110
111 typedef int size_type;
112
113 // Map index in pts to index in vertices. -1 means not used
114 std::vector<int> pts_to_vertices(num_points, -1);
115
116 // Initialize the vertices
117 size_t nvertex = static_cast<size_t>(qh.vertexCount());
118 if (nvertex >= size_t(std::numeric_limits<IndexType>::max())) {
119 COAL_THROW_PRETTY("nvertex >= std::numeric_limits<IndexType>::max()",
120 std::runtime_error);
121 }
122 std::shared_ptr<std::vector<Vec3s>> vertices(
123 new std::vector<Vec3s>(size_t(nvertex)));
124 QhullVertexList vertexList(qh.vertexList());
125 size_t i_vertex = 0;
126 for (QhullVertexList::const_iterator v = vertexList.begin();
127 v != vertexList.end(); ++v) {
128 QhullPoint pt((*v).point());
129 pts_to_vertices[(size_t)pt.id()] = (int)i_vertex;
130 (*vertices)[i_vertex] = Vec3s(Scalar(pt[0]), Scalar(pt[1]), Scalar(pt[2]));
131 ++i_vertex;
132 }
133 assert(i_vertex == nvertex);
134
135 ConvexTpl<TriangleTpl<IndexType>>* convex_tri(NULL);
136 ConvexBaseTpl<IndexType>* convex(NULL);
137 if (keepTriangles)
138 convex = convex_tri = new ConvexTpl<TriangleTpl<IndexType>>();
139 else
140 convex = new ConvexBaseTpl<IndexType>;
141 convex->initialize(vertices, static_cast<unsigned int>(nvertex));
142
143 // Build the neighbors
144 convex->neighbors.reset(new std::vector<Neighbors>(size_t(nvertex)));
145 std::vector<std::set<IndexType>> nneighbors(static_cast<size_t>(nvertex));
146 if (keepTriangles) {
147 convex_tri->num_polygons = static_cast<unsigned int>(qh.facetCount());
148 convex_tri->polygons.reset(
149 new std::vector<TriangleTpl<IndexType>>(convex_tri->num_polygons));
150 convex_tri->computeCenter();
151 }
152
153 unsigned int c_nneighbors = 0;
154 unsigned int i_polygon = 0;
155
156 // TODO: make sure number of vertices < size of IndexType
157
158 // Compute the neighbors from the edges of the faces.
159 for (QhullFacet facet = qh.beginFacet(); facet != qh.endFacet();
160 facet = facet.next()) {
161 if (facet.isSimplicial()) {
162 // In 3D, simplicial faces have 3 vertices. We mark them as neighbors.
163 QhullVertexSet f_vertices(facet.vertices());
164 IndexType n = static_cast<IndexType>(f_vertices.count());
165 assert(n == 3);
166 TriangleTpl<IndexType> tri(
167 static_cast<IndexType>(
168 pts_to_vertices[static_cast<size_t>(f_vertices[0].point().id())]),
169 static_cast<IndexType>(
170 pts_to_vertices[static_cast<size_t>(f_vertices[1].point().id())]),
171 static_cast<IndexType>(pts_to_vertices[static_cast<size_t>(
172 f_vertices[2].point().id())]));
173 if (keepTriangles) {
174 reorderTriangle(convex_tri, tri);
175 (*convex_tri->polygons)[i_polygon++] = tri;
176 }
177 for (IndexType j = 0; j < static_cast<IndexType>(n); ++j) {
178 IndexType i = (j == 0) ? n - 1 : j - 1;
179 IndexType k = (j == n - 1) ? 0 : j + 1;
180 // Update neighbors of pj;
181 if (nneighbors[tri[j]].insert(tri[i]).second) c_nneighbors++;
182 if (nneighbors[tri[j]].insert(tri[k]).second) c_nneighbors++;
183 }
184 } else {
185 if (keepTriangles) { // TODO I think there is a memory leak here.
186 COAL_THROW_PRETTY(
187 "You requested to keep triangles so you "
188 "must pass option \"Qt\" to qhull via the qhull command argument.",
189 std::invalid_argument);
190 }
191 // Non-simplicial faces have more than 3 vertices and contains a list of
192 // rigdes. Ridges are (3-1)D simplex (i.e. one edge). We mark the two
193 // vertices of each ridge as neighbors.
194 QhullRidgeSet f_ridges(facet.ridges());
195 for (size_type j = 0; j < f_ridges.count(); ++j) {
196 assert(f_ridges[j].vertices().count() == 2);
197 int pi = pts_to_vertices[static_cast<size_t>(
198 f_ridges[j].vertices()[0].point().id())],
199 pj = pts_to_vertices[static_cast<size_t>(
200 f_ridges[j].vertices()[1].point().id())];
201 // Update neighbors of pi and pj;
202 if (nneighbors[static_cast<size_t>(pj)]
203 .insert(static_cast<IndexType>(pi))
204 .second)
205 c_nneighbors++;
206 if (nneighbors[static_cast<size_t>(pi)]
207 .insert(static_cast<IndexType>(pj))
208 .second)
209 c_nneighbors++;
210 }
211 }
212 }
213 assert(!keepTriangles || static_cast<int>(i_polygon) == qh.facetCount());
214
215 // Build the double representation (free in this case because qhull has
216 // alreday run)
217 convex->buildDoubleDescriptionFromQHullResult(qh);
218
219 // Fill the neighbor attribute of the returned object.
220 convex->nneighbors_.reset(new std::vector<IndexType>(c_nneighbors));
221 std::vector<Neighbors>& neighbors_ = *(convex->neighbors);
222 std::vector<IndexType>& nneighbors_ = *(convex->nneighbors_);
223 IndexType begin_id = 0;
224 for (size_t i = 0; i < static_cast<size_t>(nvertex); ++i) {
225 Neighbors& n = neighbors_[i];
226 if (nneighbors[i].size() >= (std::numeric_limits<unsigned char>::max)())
227 COAL_THROW_PRETTY("Too many neighbors.", std::logic_error);
228 n.count = (unsigned char)nneighbors[i].size();
229 n.begin_id = begin_id;
230 IndexType j = 0;
231 for (IndexType idx : nneighbors[i]) {
232 nneighbors_[n.begin_id + j] = idx;
233 j++;
234 }
235 begin_id += n.count;
236 }
237
238 // Now that the neighbors are computed, we can call the
239 // `buildSupportWarmStart` function.
240 convex->buildSupportWarmStart();
241 return convex;
242 #else
243
15/30
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 1 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 1 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 1 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 1 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 1 times.
✗ Branch 38 not taken.
✓ Branch 41 taken 1 times.
✗ Branch 42 not taken.
✓ Branch 44 taken 1 times.
✗ Branch 45 not taken.
2 COAL_THROW_PRETTY(
244 "Library built without qhull. Cannot build object of this type.",
245 std::logic_error);
246 COAL_UNUSED_VARIABLE(pts);
247 COAL_UNUSED_VARIABLE(num_points);
248 COAL_UNUSED_VARIABLE(keepTriangles);
249 COAL_UNUSED_VARIABLE(qhullCommand);
250 #endif
251 }
252 template COAL_DLLAPI ConvexBaseTpl<Triangle16::IndexType>*
253 ConvexBaseTpl<Triangle16::IndexType>::convexHull(const Vec3s* pts,
254 unsigned int num_points,
255 bool keepTriangles,
256 const char* qhullCommand);
257 template COAL_DLLAPI ConvexBaseTpl<Triangle32::IndexType>*
258 ConvexBaseTpl<Triangle32::IndexType>::convexHull(const Vec3s* pts,
259 unsigned int num_points,
260 bool keepTriangles,
261 const char* qhullCommand);
262
263 #ifdef COAL_HAS_QHULL
264 template <typename IndexType>
265 void ConvexBaseTpl<IndexType>::buildDoubleDescription() {
266 if (num_points <= 3) {
267 COAL_THROW_PRETTY(
268 "You shouldn't use this function with a convex less than"
269 " 4 points.",
270 std::invalid_argument);
271 }
272
273 Qhull qh;
274 const char* command = "Qt";
275 using Vec3d = Eigen::Vector3d;
276 std::vector<Vec3d> qhull_pts;
277 qhull_pts.reserve(num_points);
278 for (size_t i = 0; i < num_points; ++i) {
279 qhull_pts.push_back((*points)[i].template cast<double>());
280 }
281 qh.runQhull("", 3, static_cast<int>(num_points), qhull_pts[0].data(),
282 command);
283
284 if (qh.qhullStatus() != qh_ERRnone) {
285 if (qh.hasQhullMessage()) std::cerr << qh.qhullMessage() << std::endl;
286 COAL_THROW_PRETTY("Qhull failed", std::logic_error);
287 }
288
289 buildDoubleDescriptionFromQHullResult(qh);
290 }
291 template void COAL_DLLAPI
292 ConvexBaseTpl<Triangle16::IndexType>::buildDoubleDescription();
293 template void COAL_DLLAPI
294 ConvexBaseTpl<Triangle32::IndexType>::buildDoubleDescription();
295
296 template <typename IndexType>
297 void ConvexBaseTpl<IndexType>::buildDoubleDescriptionFromQHullResult(
298 const Qhull& qh) {
299 num_normals_and_offsets = static_cast<unsigned int>(qh.facetCount());
300 normals.reset(new std::vector<Vec3s>(num_normals_and_offsets));
301 std::vector<Vec3s>& normals_ = *normals;
302 offsets.reset(new std::vector<Scalar>(num_normals_and_offsets));
303 std::vector<Scalar>& offsets_ = *offsets;
304 unsigned int i_normal = 0;
305 for (QhullFacet facet = qh.beginFacet(); facet != qh.endFacet();
306 facet = facet.next()) {
307 const orgQhull::QhullHyperplane& plane = facet.hyperplane();
308 normals_[i_normal] =
309 Vec3s(Scalar(plane.coordinates()[0]), Scalar(plane.coordinates()[1]),
310 Scalar(plane.coordinates()[2]));
311 offsets_[i_normal] = Scalar(plane.offset());
312 i_normal++;
313 }
314 assert(static_cast<int>(i_normal) == qh.facetCount());
315 }
316 template void COAL_DLLAPI
317 ConvexBaseTpl<Triangle16::IndexType>::buildDoubleDescriptionFromQHullResult(
318 const Qhull& qh);
319 template void COAL_DLLAPI
320 ConvexBaseTpl<Triangle32::IndexType>::buildDoubleDescriptionFromQHullResult(
321 const Qhull& qh);
322 #endif
323
324 17640 void Halfspace::unitNormalTest() {
325 17640 Scalar l = n.norm();
326
2/2
✓ Branch 0 taken 17638 times.
✓ Branch 1 taken 2 times.
17640 if (l > 0) {
327 17638 Scalar inv_l = Scalar(1) / l;
328
1/2
✓ Branch 1 taken 17638 times.
✗ Branch 2 not taken.
17638 n *= inv_l;
329 17638 d *= inv_l;
330 } else {
331
3/6
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
2 n << 1, 0, 0;
332 2 d = 0;
333 }
334 17640 }
335
336 255 void Plane::unitNormalTest() {
337 255 Scalar l = n.norm();
338
2/2
✓ Branch 0 taken 253 times.
✓ Branch 1 taken 2 times.
255 if (l > 0) {
339 253 Scalar inv_l = Scalar(1) / l;
340
1/2
✓ Branch 1 taken 253 times.
✗ Branch 2 not taken.
253 n *= inv_l;
341 253 d *= inv_l;
342 } else {
343
3/6
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
2 n << 1, 0, 0;
344 2 d = 0;
345 }
346 255 }
347
348 14112 void Box::computeLocalAABB() {
349
2/4
✓ Branch 1 taken 14112 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14112 times.
✗ Branch 5 not taken.
14112 computeBV<AABB>(*this, Transform3s(), aabb_local);
350 14112 const Scalar ssr = this->getSweptSphereRadius();
351
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 14111 times.
14112 if (ssr > 0) {
352
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 aabb_local.min_ -= Vec3s::Constant(ssr);
353
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 aabb_local.max_ += Vec3s::Constant(ssr);
354 }
355
1/2
✓ Branch 1 taken 14112 times.
✗ Branch 2 not taken.
14112 aabb_center = aabb_local.center();
356
2/4
✓ Branch 1 taken 14112 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 14112 times.
✗ Branch 5 not taken.
14112 aabb_radius = (aabb_local.min_ - aabb_center).norm();
357 14112 }
358
359 16918 void Sphere::computeLocalAABB() {
360
2/4
✓ Branch 1 taken 16918 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 16918 times.
✗ Branch 5 not taken.
16918 computeBV<AABB>(*this, Transform3s(), aabb_local);
361 16918 const Scalar ssr = this->getSweptSphereRadius();
362
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 16917 times.
16918 if (ssr > 0) {
363
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 aabb_local.min_ -= Vec3s::Constant(ssr);
364
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 aabb_local.max_ += Vec3s::Constant(ssr);
365 }
366
1/2
✓ Branch 1 taken 16918 times.
✗ Branch 2 not taken.
16918 aabb_center = aabb_local.center();
367 16918 aabb_radius = radius;
368 16918 }
369
370 1 void Ellipsoid::computeLocalAABB() {
371
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 computeBV<AABB>(*this, Transform3s(), aabb_local);
372 1 const Scalar ssr = this->getSweptSphereRadius();
373
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 if (ssr > 0) {
374
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 aabb_local.min_ -= Vec3s::Constant(ssr);
375
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 aabb_local.max_ += Vec3s::Constant(ssr);
376 }
377
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 aabb_center = aabb_local.center();
378
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 aabb_radius = (aabb_local.min_ - aabb_center).norm();
379 1 }
380
381 10011 void Capsule::computeLocalAABB() {
382
2/4
✓ Branch 1 taken 10011 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 10011 times.
✗ Branch 5 not taken.
10011 computeBV<AABB>(*this, Transform3s(), aabb_local);
383 10011 const Scalar ssr = this->getSweptSphereRadius();
384
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 10010 times.
10011 if (ssr > 0) {
385
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 aabb_local.min_ -= Vec3s::Constant(ssr);
386
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 aabb_local.max_ += Vec3s::Constant(ssr);
387 }
388
1/2
✓ Branch 1 taken 10011 times.
✗ Branch 2 not taken.
10011 aabb_center = aabb_local.center();
389
2/4
✓ Branch 1 taken 10011 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 10011 times.
✗ Branch 5 not taken.
10011 aabb_radius = (aabb_local.min_ - aabb_center).norm();
390 10011 }
391
392 1 void Cone::computeLocalAABB() {
393
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 computeBV<AABB>(*this, Transform3s(), aabb_local);
394 1 const Scalar ssr = this->getSweptSphereRadius();
395
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 if (ssr > 0) {
396
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 aabb_local.min_ -= Vec3s::Constant(ssr);
397
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 aabb_local.max_ += Vec3s::Constant(ssr);
398 }
399
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 aabb_center = aabb_local.center();
400
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 aabb_radius = (aabb_local.min_ - aabb_center).norm();
401 1 }
402
403 8913 void Cylinder::computeLocalAABB() {
404
2/4
✓ Branch 1 taken 8913 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8913 times.
✗ Branch 5 not taken.
8913 computeBV<AABB>(*this, Transform3s(), aabb_local);
405 8913 const Scalar ssr = this->getSweptSphereRadius();
406
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 8912 times.
8913 if (ssr > 0) {
407
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 aabb_local.min_ -= Vec3s::Constant(ssr);
408
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 aabb_local.max_ += Vec3s::Constant(ssr);
409 }
410
1/2
✓ Branch 1 taken 8913 times.
✗ Branch 2 not taken.
8913 aabb_center = aabb_local.center();
411
2/4
✓ Branch 1 taken 8913 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 8913 times.
✗ Branch 5 not taken.
8913 aabb_radius = (aabb_local.min_ - aabb_center).norm();
412 8913 }
413
414 1 void Halfspace::computeLocalAABB() {
415
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 computeBV<AABB>(*this, Transform3s(), aabb_local);
416 1 const Scalar ssr = this->getSweptSphereRadius();
417
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 if (ssr > 0) {
418
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 aabb_local.min_ -= Vec3s::Constant(ssr);
419
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 aabb_local.max_ += Vec3s::Constant(ssr);
420 }
421
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 aabb_center = aabb_local.center();
422
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 aabb_radius = (aabb_local.min_ - aabb_center).norm();
423 1 }
424
425 1 void Plane::computeLocalAABB() {
426
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 computeBV<AABB>(*this, Transform3s(), aabb_local);
427 1 const Scalar ssr = this->getSweptSphereRadius();
428
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 if (ssr > 0) {
429
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 aabb_local.min_ -= Vec3s::Constant(ssr);
430
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 aabb_local.max_ += Vec3s::Constant(ssr);
431 }
432
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 aabb_center = aabb_local.center();
433
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 aabb_radius = (aabb_local.min_ - aabb_center).norm();
434 1 }
435
436 1 void TriangleP::computeLocalAABB() {
437
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 computeBV<AABB>(*this, Transform3s(), aabb_local);
438 1 const Scalar ssr = this->getSweptSphereRadius();
439
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 if (ssr > 0) {
440
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 aabb_local.min_ -= Vec3s::Constant(ssr);
441
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 aabb_local.max_ += Vec3s::Constant(ssr);
442 }
443
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 aabb_center = aabb_local.center();
444
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 aabb_radius = (aabb_local.min_ - aabb_center).norm();
445 1 }
446
447 } // namespace coal
448