GCC Code Coverage Report


Directory: ./
File: include/coal/internal/traversal_node_base.h
Date: 2025-04-01 09:23:31
Exec Total Coverage
Lines: 12 21 57.1%
Branches: 1 2 50.0%

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 #ifndef COAL_TRAVERSAL_NODE_BASE_H
39 #define COAL_TRAVERSAL_NODE_BASE_H
40
41 /// @cond INTERNAL
42
43 #include "coal/data_types.h"
44 #include "coal/math/transform.h"
45 #include "coal/collision_data.h"
46
47 namespace coal {
48
49 /// @brief Node structure encoding the information required for traversal.
50
51 class TraversalNodeBase {
52 public:
53 21368 TraversalNodeBase() : enable_statistics(false) {}
54
55 42736 virtual ~TraversalNodeBase() {}
56
57 virtual void preprocess() {}
58
59 virtual void postprocess() {}
60
61 /// @brief Whether b is a leaf node in the first BVH tree
62 3100 virtual bool isFirstNodeLeaf(unsigned int /*b*/) const { return true; }
63
64 /// @brief Whether b is a leaf node in the second BVH tree
65 77568 virtual bool isSecondNodeLeaf(unsigned int /*b*/) const { return true; }
66
67 /// @brief Traverse the subtree of the node in the first tree first
68 39229 virtual bool firstOverSecond(unsigned int /*b1*/, unsigned int /*b2*/) const {
69 39229 return true;
70 }
71
72 /// @brief Get the left child of the node b in the first tree
73 virtual int getFirstLeftChild(unsigned int b) const { return (int)b; }
74
75 /// @brief Get the right child of the node b in the first tree
76 virtual int getFirstRightChild(unsigned int b) const { return (int)b; }
77
78 /// @brief Get the left child of the node b in the second tree
79 virtual int getSecondLeftChild(unsigned int b) const { return (int)b; }
80
81 /// @brief Get the right child of the node b in the second tree
82 virtual int getSecondRightChild(unsigned int b) const { return (int)b; }
83
84 /// @brief Whether store some statistics information during traversal
85 void enableStatistics(bool enable) { enable_statistics = enable; }
86
87 /// @brief configuation of first object
88 Transform3s tf1;
89
90 /// @brief configuration of second object
91 Transform3s tf2;
92
93 /// @brief Whether stores statistics
94 bool enable_statistics;
95 };
96
97 /// @defgroup Traversal_For_Collision
98 /// regroup class about traversal for distance.
99 /// @{
100
101 /// @brief Node structure encoding the information required for collision
102 /// traversal.
103 class CollisionTraversalNodeBase : public TraversalNodeBase {
104 public:
105 14079 CollisionTraversalNodeBase(const CollisionRequest& request_)
106 14079 : request(request_), result(NULL) {}
107
108 28158 virtual ~CollisionTraversalNodeBase() {}
109
110 /// BV test between b1 and b2
111 /// @param b1, b2 Bounding volumes to test,
112 /// @retval sqrDistLowerBound square of a lower bound of the minimal
113 /// distance between bounding volumes.
114 virtual bool BVDisjoints(unsigned int b1, unsigned int b2,
115 Scalar& sqrDistLowerBound) const = 0;
116
117 /// @brief Leaf test between node b1 and b2, if they are both leafs
118 virtual void leafCollides(unsigned int /*b1*/, unsigned int /*b2*/,
119 Scalar& /*sqrDistLowerBound*/) const = 0;
120
121 /// @brief Check whether the traversal can stop
122 20823389 bool canStop() const { return this->request.isSatisfied(*(this->result)); }
123
124 /// @brief request setting for collision
125 const CollisionRequest& request;
126
127 /// @brief collision result kept during the traversal iteration
128 CollisionResult* result;
129 };
130
131 /// @}
132
133 /// @defgroup Traversal_For_Distance
134 /// regroup class about traversal for distance.
135 /// @{
136
137 /// @brief Node structure encoding the information required for distance
138 /// traversal.
139 class DistanceTraversalNodeBase : public TraversalNodeBase {
140 public:
141
1/2
✓ Branch 2 taken 7289 times.
✗ Branch 3 not taken.
7289 DistanceTraversalNodeBase() : result(NULL) {}
142
143 14578 virtual ~DistanceTraversalNodeBase() {}
144
145 /// @brief BV test between b1 and b2
146 /// @return a lower bound of the distance between the two BV.
147 /// @note except for OBB, this method returns the distance.
148 virtual Scalar BVDistanceLowerBound(unsigned int /*b1*/,
149 unsigned int /*b2*/) const {
150 return (std::numeric_limits<Scalar>::max)();
151 }
152
153 /// @brief Leaf test between node b1 and b2, if they are both leafs
154 virtual void leafComputeDistance(unsigned int b1, unsigned int b2) const = 0;
155
156 /// @brief Check whether the traversal can stop
157 virtual bool canStop(Scalar /*c*/) const { return false; }
158
159 /// @brief request setting for distance
160 DistanceRequest request;
161
162 /// @brief distance result kept during the traversal iteration
163 DistanceResult* result;
164 };
165
166 ///@}
167
168 } // namespace coal
169
170 /// @endcond
171
172 #endif
173