Line | Branch | Exec | Source |
---|---|---|---|
1 | // Copyright Contributors to the OpenVDB Project | ||
2 | // SPDX-License-Identifier: MPL-2.0 | ||
3 | |||
4 | #include <openvdb/tools/PointIndexGrid.h> | ||
5 | |||
6 | #include <gtest/gtest.h> | ||
7 | |||
8 | #include <vector> | ||
9 | #include <algorithm> | ||
10 | #include <cmath> | ||
11 | #include "util.h" // for genPoints | ||
12 | |||
13 | |||
14 | 3 | struct TestPointIndexGrid: public ::testing::Test | |
15 | { | ||
16 | }; | ||
17 | |||
18 | |||
19 | //////////////////////////////////////// | ||
20 | |||
21 | namespace { | ||
22 | |||
23 | class PointList | ||
24 | { | ||
25 | public: | ||
26 | typedef openvdb::Vec3R PosType; | ||
27 | |||
28 | PointList(const std::vector<PosType>& points) | ||
29 |
3/6✓ 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.
|
3 | : mPoints(&points) |
30 | { | ||
31 | } | ||
32 | |||
33 | size_t size() const { | ||
34 |
5/10✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 4 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 4 times.
✗ Branch 9 not taken.
|
36 | return mPoints->size(); |
35 | } | ||
36 | |||
37 | void getPos(size_t n, PosType& xyz) const { | ||
38 |
5/6✓ Branch 0 taken 1090000 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 40084 times.
✓ Branch 4 taken 91 times.
✓ Branch 6 taken 56648 times.
✓ Branch 7 taken 41046 times.
|
1369432 | xyz = (*mPoints)[n]; |
39 | } | ||
40 | |||
41 | protected: | ||
42 | std::vector<PosType> const * const mPoints; | ||
43 | }; // PointList | ||
44 | |||
45 | |||
46 | template<typename T> | ||
47 | 3 | bool hasDuplicates(const std::vector<T>& items) | |
48 | { | ||
49 | 3 | std::vector<T> vec(items); | |
50 | 3 | std::sort(vec.begin(), vec.end()); | |
51 | |||
52 | size_t duplicates = 0; | ||
53 |
2/2✓ Branch 0 taken 82209 times.
✓ Branch 1 taken 3 times.
|
82212 | for (size_t n = 1, N = vec.size(); n < N; ++n) { |
54 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 82209 times.
|
82209 | if (vec[n] == vec[n-1]) ++duplicates; |
55 | } | ||
56 |
1/2✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
|
3 | return duplicates != 0; |
57 | } | ||
58 | |||
59 | |||
60 | template<typename T> | ||
61 | struct WeightedAverageAccumulator { | ||
62 | typedef T ValueType; | ||
63 | 1 | WeightedAverageAccumulator(T const * const array, const T radius) | |
64 | 1 | : mValues(array), mInvRadius(1.0/radius), mWeightSum(0.0), mValueSum(0.0) {} | |
65 | |||
66 |
1/2✓ Branch 1 taken 10000 times.
✗ Branch 2 not taken.
|
10000 | void reset() { mWeightSum = mValueSum = T(0.0); } |
67 | |||
68 | 56648 | void operator()(const T distSqr, const size_t pointIndex) { | |
69 | 56648 | const T weight = T(1.0) - openvdb::math::Sqrt(distSqr) * mInvRadius; | |
70 | 56648 | mWeightSum += weight; | |
71 | 56648 | mValueSum += weight * mValues[pointIndex]; | |
72 | 56648 | } | |
73 | |||
74 |
1/2✓ Branch 0 taken 10000 times.
✗ Branch 1 not taken.
|
10000 | T result() const { return mWeightSum > T(0.0) ? mValueSum / mWeightSum : T(0.0); } |
75 | |||
76 | private: | ||
77 | T const * const mValues; | ||
78 | const T mInvRadius; | ||
79 | T mWeightSum, mValueSum; | ||
80 | }; // struct WeightedAverageAccumulator | ||
81 | |||
82 | } // namespace | ||
83 | |||
84 | |||
85 | |||
86 | //////////////////////////////////////// | ||
87 | |||
88 | |||
89 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | TEST_F(TestPointIndexGrid, testPointIndexGrid) |
90 | { | ||
91 | const float voxelSize = 0.01f; | ||
92 | const openvdb::math::Transform::Ptr transform = | ||
93 | 1 | openvdb::math::Transform::createLinearTransform(voxelSize); | |
94 | |||
95 | // generate points | ||
96 | |||
97 | std::vector<openvdb::Vec3R> points; | ||
98 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | unittest_util::genPoints(40000, points); |
99 | |||
100 | PointList pointList(points); | ||
101 | |||
102 | |||
103 | // construct data structure | ||
104 | typedef openvdb::tools::PointIndexGrid PointIndexGrid; | ||
105 | |||
106 | PointIndexGrid::Ptr pointGridPtr = | ||
107 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | openvdb::tools::createPointIndexGrid<PointIndexGrid>(pointList, *transform); |
108 | |||
109 | 1 | openvdb::CoordBBox bbox; | |
110 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | pointGridPtr->tree().evalActiveVoxelBoundingBox(bbox); |
111 | |||
112 | // coord bbox search | ||
113 | |||
114 | typedef PointIndexGrid::ConstAccessor ConstAccessor; | ||
115 | typedef openvdb::tools::PointIndexIterator<> PointIndexIterator; | ||
116 | |||
117 | ConstAccessor acc = pointGridPtr->getConstAccessor(); | ||
118 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | PointIndexIterator it(bbox, acc); |
119 | |||
120 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE(it.test()); |
121 |
2/16✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
|
1 | EXPECT_EQ(points.size(), it.size()); |
122 | |||
123 | // fractional bbox search | ||
124 | |||
125 | 1 | openvdb::BBoxd region(bbox.min().asVec3d(), bbox.max().asVec3d()); | |
126 | |||
127 | // points are bucketed in a cell-centered fashion, we need to pad the | ||
128 | // coordinate range to get the same search region in the fractional bbox. | ||
129 | 1 | region.expand(voxelSize * 0.5); | |
130 | |||
131 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | it.searchAndUpdate(region, acc, pointList, *transform); |
132 | |||
133 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE(it.test()); |
134 |
2/16✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
|
1 | EXPECT_EQ(points.size(), it.size()); |
135 | |||
136 | { | ||
137 | std::vector<uint32_t> vec; | ||
138 |
1/2✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
|
1 | vec.reserve(it.size()); |
139 | for (; it; ++it) { | ||
140 |
1/2✓ Branch 1 taken 40000 times.
✗ Branch 2 not taken.
|
40000 | vec.push_back(*it); |
141 | } | ||
142 | |||
143 |
2/18✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_EQ(vec.size(), it.size()); |
144 |
2/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
|
1 | EXPECT_TRUE(!hasDuplicates(vec)); |
145 | } | ||
146 | |||
147 | // radial search | ||
148 | openvdb::Vec3d center = region.getCenter(); | ||
149 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | double radius = region.extents().x() * 0.5; |
150 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | it.searchAndUpdate(center, radius, acc, pointList, *transform); |
151 | |||
152 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE(it.test()); |
153 |
2/16✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
|
1 | EXPECT_EQ(points.size(), it.size()); |
154 | |||
155 | { | ||
156 | std::vector<uint32_t> vec; | ||
157 |
1/2✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
|
1 | vec.reserve(it.size()); |
158 | for (; it; ++it) { | ||
159 |
1/2✓ Branch 1 taken 40000 times.
✗ Branch 2 not taken.
|
40000 | vec.push_back(*it); |
160 | } | ||
161 | |||
162 |
2/18✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_EQ(vec.size(), it.size()); |
163 |
2/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
|
1 | EXPECT_TRUE(!hasDuplicates(vec)); |
164 | } | ||
165 | |||
166 | |||
167 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | center = region.min(); |
168 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | it.searchAndUpdate(center, radius, acc, pointList, *transform); |
169 | |||
170 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE(it.test()); |
171 | |||
172 | { | ||
173 | std::vector<uint32_t> vec; | ||
174 |
1/2✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
|
1 | vec.reserve(it.size()); |
175 | for (; it; ++it) { | ||
176 |
1/2✓ Branch 1 taken 2212 times.
✗ Branch 2 not taken.
|
2212 | vec.push_back(*it); |
177 | } | ||
178 | |||
179 |
2/16✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
|
1 | EXPECT_EQ(vec.size(), it.size()); |
180 |
2/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
|
1 | EXPECT_TRUE(!hasDuplicates(vec)); |
181 | |||
182 | // check that no points where missed. | ||
183 | |||
184 |
1/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
|
1 | std::vector<unsigned char> indexMask(points.size(), 0); |
185 |
2/2✓ Branch 0 taken 2212 times.
✓ Branch 1 taken 1 times.
|
2213 | for (size_t n = 0, N = vec.size(); n < N; ++n) { |
186 | 2212 | indexMask[vec[n]] = 1; | |
187 | } | ||
188 | |||
189 | 1 | const double r2 = radius * radius; | |
190 | openvdb::Vec3R v; | ||
191 |
2/2✓ Branch 0 taken 40000 times.
✓ Branch 1 taken 1 times.
|
40001 | for (size_t n = 0, N = indexMask.size(); n < N; ++n) { |
192 |
2/2✓ Branch 0 taken 37788 times.
✓ Branch 1 taken 2212 times.
|
40000 | v = center - transform->worldToIndex(points[n]); |
193 |
2/2✓ Branch 0 taken 37788 times.
✓ Branch 1 taken 2212 times.
|
40000 | if (indexMask[n] == 0) { |
194 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 37788 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
37788 | EXPECT_TRUE(!(v.lengthSqr() < r2)); |
195 | } else { | ||
196 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 2212 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
2212 | EXPECT_TRUE(v.lengthSqr() < r2); |
197 | } | ||
198 | } | ||
199 | } | ||
200 | |||
201 | |||
202 | // Check partitioning | ||
203 | |||
204 |
2/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
|
1 | EXPECT_TRUE(openvdb::tools::isValidPartition(pointList, *pointGridPtr)); |
205 | |||
206 | 1 | points[10000].x() += 1.5; // manually modify a few points. | |
207 | 1 | points[20000].x() += 1.5; | |
208 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | points[30000].x() += 1.5; |
209 | |||
210 |
2/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
|
1 | EXPECT_TRUE(!openvdb::tools::isValidPartition(pointList, *pointGridPtr)); |
211 | |||
212 | PointIndexGrid::Ptr pointGrid2Ptr = | ||
213 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | openvdb::tools::getValidPointIndexGrid<PointIndexGrid>(pointList, pointGridPtr); |
214 | |||
215 |
2/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
|
1 | EXPECT_TRUE(openvdb::tools::isValidPartition(pointList, *pointGrid2Ptr)); |
216 | 1 | } | |
217 | |||
218 | |||
219 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | TEST_F(TestPointIndexGrid, testPointIndexFilter) |
220 | { | ||
221 | // generate points | ||
222 | const float voxelSize = 0.01f; | ||
223 | const size_t pointCount = 10000; | ||
224 | const openvdb::math::Transform::Ptr transform = | ||
225 | 1 | openvdb::math::Transform::createLinearTransform(voxelSize); | |
226 | |||
227 | std::vector<openvdb::Vec3d> points; | ||
228 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | unittest_util::genPoints(pointCount, points); |
229 | |||
230 | PointList pointList(points); | ||
231 | |||
232 | // construct data structure | ||
233 | typedef openvdb::tools::PointIndexGrid PointIndexGrid; | ||
234 | |||
235 | PointIndexGrid::Ptr pointGridPtr = | ||
236 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | openvdb::tools::createPointIndexGrid<PointIndexGrid>(pointList, *transform); |
237 | |||
238 | |||
239 |
2/6✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
1 | std::vector<double> pointDensity(pointCount, 1.0); |
240 | |||
241 | openvdb::tools::PointIndexFilter<PointList> | ||
242 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | filter(pointList, pointGridPtr->tree(), pointGridPtr->transform()); |
243 | |||
244 | const double radius = 3.0 * voxelSize; | ||
245 | |||
246 | WeightedAverageAccumulator<double> | ||
247 | accumulator(&pointDensity.front(), radius); | ||
248 | |||
249 | double sum = 0.0; | ||
250 |
2/2✓ Branch 0 taken 10000 times.
✓ Branch 1 taken 1 times.
|
10001 | for (size_t n = 0, N = points.size(); n < N; ++n) { |
251 | accumulator.reset(); | ||
252 |
1/2✓ Branch 1 taken 10000 times.
✗ Branch 2 not taken.
|
10000 | filter.searchAndApply(points[n], radius, accumulator); |
253 | 10000 | sum += accumulator.result(); | |
254 | } | ||
255 | |||
256 |
2/16✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
|
1 | EXPECT_NEAR(sum, double(points.size()), 1e-6); |
257 | 1 | } | |
258 | |||
259 | |||
260 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | TEST_F(TestPointIndexGrid, testWorldSpaceSearchAndUpdate) |
261 | { | ||
262 | // Create random particles in a cube. | ||
263 | openvdb::math::Rand01<> rnd(0); | ||
264 | |||
265 | const size_t N = 1000000; | ||
266 | std::vector<openvdb::Vec3d> pos; | ||
267 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | pos.reserve(N); |
268 | |||
269 | // Create a box to query points. | ||
270 | 1 | openvdb::BBoxd wsBBox(openvdb::Vec3d(0.25), openvdb::Vec3d(0.75)); | |
271 | |||
272 | std::set<size_t> indexListA; | ||
273 | |||
274 |
2/2✓ Branch 0 taken 1000000 times.
✓ Branch 1 taken 1 times.
|
1000001 | for (size_t i = 0; i < N; ++i) { |
275 | openvdb::Vec3d p(rnd(), rnd(), rnd()); | ||
276 |
1/2✓ Branch 1 taken 1000000 times.
✗ Branch 2 not taken.
|
1000000 | pos.push_back(p); |
277 | |||
278 |
2/2✓ Branch 0 taken 124979 times.
✓ Branch 1 taken 875021 times.
|
1000000 | if (wsBBox.isInside(p)) { |
279 | indexListA.insert(i); | ||
280 | } | ||
281 | } | ||
282 | |||
283 | // Create a point index grid | ||
284 | const double dx = 0.025; | ||
285 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | openvdb::math::Transform::Ptr transform = openvdb::math::Transform::createLinearTransform(dx); |
286 | |||
287 | PointList pointArray(pos); | ||
288 | openvdb::tools::PointIndexGrid::Ptr pointIndexGrid | ||
289 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | = openvdb::tools::createPointIndexGrid<openvdb::tools::PointIndexGrid, PointList>(pointArray, *transform); |
290 | |||
291 | // Search for points within the box. | ||
292 | openvdb::tools::PointIndexGrid::ConstAccessor acc = pointIndexGrid->getConstAccessor(); | ||
293 | |||
294 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | openvdb::tools::PointIndexIterator<openvdb::tools::PointIndexTree> pointIndexIter; |
295 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | pointIndexIter.worldSpaceSearchAndUpdate<PointList>(wsBBox, acc, pointArray, pointIndexGrid->transform()); |
296 | |||
297 | std::set<size_t> indexListB; | ||
298 | for (; pointIndexIter; ++pointIndexIter) { | ||
299 |
1/2✓ Branch 1 taken 124979 times.
✗ Branch 2 not taken.
|
124979 | indexListB.insert(*pointIndexIter); |
300 | } | ||
301 | |||
302 |
2/16✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
|
1 | EXPECT_EQ(indexListA.size(), indexListB.size()); |
303 | 1 | } | |
304 | |||
305 |