GCC Code Coverage Report


Directory: ./
File: openvdb/openvdb/unittest/TestGridTransformer.cc
Date: 2022-07-25 17:40:05
Exec Total Coverage
Lines: 133 133 100.0%
Functions: 20 20 100.0%
Branches: 156 708 22.0%

Line Branch Exec Source
1 // Copyright Contributors to the OpenVDB Project
2 // SPDX-License-Identifier: MPL-2.0
3
4 #include <openvdb/openvdb.h>
5 #include <openvdb/math/BBox.h>
6 #include <openvdb/math/Math.h>
7 #include <openvdb/tree/Tree.h>
8 #include <openvdb/tools/GridTransformer.h>
9 #include <openvdb/tools/Prune.h>
10
11 #include <gtest/gtest.h>
12
13
14 #define ASSERT_DOUBLES_EXACTLY_EQUAL(expected, actual) \
15 EXPECT_NEAR((expected), (actual), /*tolerance=*/0.0);
16
17 11 class TestGridTransformer: public ::testing::Test
18 {
19 protected:
20 template<typename GridType, typename Sampler> void transformGrid();
21 };
22
23
24 ////////////////////////////////////////
25
26
27 template<typename GridType, typename Sampler>
28 void
29 18 TestGridTransformer::transformGrid()
30 {
31 using openvdb::Coord;
32 using openvdb::CoordBBox;
33 using openvdb::Vec3R;
34
35 typedef typename GridType::ValueType ValueT;
36
37 const int radius = Sampler::radius();
38 const openvdb::Vec3R zeroVec(0, 0, 0), oneVec(1, 1, 1);
39 const ValueT
40 16 zero = openvdb::zeroVal<ValueT>(),
41 2 one = zero + 1,
42 16 two = one + 1,
43 18 background = one;
44 const bool transformTiles = true;
45
46 // Create a sparse test grid comprising the eight corners of a 20 x 20 x 20 cube.
47 18 typename GridType::Ptr inGrid = GridType::create(background);
48 typename GridType::Accessor inAcc = inGrid->getAccessor();
49
2/4
✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
18 inAcc.setValue(Coord( 0, 0, 0), /*value=*/zero);
50
2/4
✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
18 inAcc.setValue(Coord(20, 0, 0), zero);
51
2/4
✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
18 inAcc.setValue(Coord( 0, 20, 0), zero);
52
2/4
✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
18 inAcc.setValue(Coord( 0, 0, 20), zero);
53
2/4
✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
18 inAcc.setValue(Coord(20, 0, 20), zero);
54
2/4
✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
18 inAcc.setValue(Coord( 0, 20, 20), zero);
55
2/4
✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
18 inAcc.setValue(Coord(20, 20, 0), zero);
56
2/4
✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
18 inAcc.setValue(Coord(20, 20, 20), zero);
57
3/20
✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 9 times.
✗ 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 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
18 EXPECT_EQ(openvdb::Index64(8), inGrid->activeVoxelCount());
58
59 // For various combinations of scaling, rotation and translation...
60
2/2
✓ Branch 0 taken 72 times.
✓ Branch 1 taken 9 times.
162 for (int i = 0; i < 8; ++i) {
61 const openvdb::Vec3R
62
2/2
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 36 times.
144 scale = i & 1 ? openvdb::Vec3R(10, 4, 7.5) : oneVec,
63
2/2
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 36 times.
144 rotate = (i & 2 ? openvdb::Vec3R(30, 230, -190) : zeroVec) * (M_PI / 180),
64
2/2
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 36 times.
144 translate = i & 4 ? openvdb::Vec3R(-5, 0, 10) : zeroVec,
65
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 72 times.
144 pivot = i & 8 ? openvdb::Vec3R(0.5, 4, -3.3) : zeroVec;
66
4/8
✓ Branch 1 taken 72 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 72 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 72 times.
✗ Branch 8 not taken.
✓ Branch 11 taken 72 times.
✗ Branch 12 not taken.
288 openvdb::tools::GridTransformer transformer(pivot, scale, rotate, translate);
67 transformer.setTransformTiles(transformTiles);
68
69 // Add a tile (either active or inactive) in the interior of the cube.
70
1/2
✓ Branch 1 taken 72 times.
✗ Branch 2 not taken.
144 const bool tileIsActive = (i % 2);
71
1/2
✓ Branch 1 taken 72 times.
✗ Branch 2 not taken.
144 inGrid->fill(CoordBBox(Coord(8), Coord(15)), two, tileIsActive);
72
2/2
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 36 times.
144 if (tileIsActive) {
73
3/18
✓ Branch 1 taken 36 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 36 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 36 times.
✗ 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 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
72 EXPECT_EQ(openvdb::Index64(512 + 8), inGrid->activeVoxelCount());
74 } else {
75
3/18
✓ Branch 1 taken 36 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 36 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 36 times.
✗ 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 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
72 EXPECT_EQ(openvdb::Index64(8), inGrid->activeVoxelCount());
76 }
77 // Verify that a voxel outside the cube has the background value.
78
3/26
✓ Branch 1 taken 64 times.
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 64 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 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.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
176 EXPECT_TRUE(openvdb::math::isExactlyEqual(inAcc.getValue(Coord(21, 0, 0)), background));
79
2/16
✓ Branch 2 taken 72 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 72 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.
144 EXPECT_EQ(false, inAcc.isValueOn(Coord(21, 0, 0)));
80 // Verify that a voxel inside the cube has value two.
81
3/26
✓ Branch 1 taken 64 times.
✓ Branch 2 taken 8 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 64 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 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.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
176 EXPECT_TRUE(openvdb::math::isExactlyEqual(inAcc.getValue(Coord(12)), two));
82
2/16
✓ Branch 2 taken 72 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 72 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.
144 EXPECT_EQ(tileIsActive, inAcc.isValueOn(Coord(12)));
83
84 // Verify that the bounding box of all active values is 20 x 20 x 20.
85
1/2
✓ Branch 1 taken 72 times.
✗ Branch 2 not taken.
144 CoordBBox activeVoxelBBox = inGrid->evalActiveVoxelBoundingBox();
86
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 72 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.
144 EXPECT_TRUE(!activeVoxelBBox.empty());
87
1/2
✓ Branch 1 taken 72 times.
✗ Branch 2 not taken.
144 const Coord imin = activeVoxelBBox.min(), imax = activeVoxelBBox.max();
88
1/14
✗ Branch 0 not taken.
✓ Branch 1 taken 72 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 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
144 EXPECT_EQ(Coord(0), imin);
89
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 72 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 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
144 EXPECT_EQ(Coord(20), imax);
90
91 // Transform the corners of the input grid's bounding box
92 // and compute the enclosing bounding box in the output grid.
93 144 const openvdb::Mat4R xform = transformer.getTransform();
94 const Vec3R
95 144 inRMin(imin.x(), imin.y(), imin.z()),
96 144 inRMax(imax.x(), imax.y(), imax.z());
97 Vec3R outRMin, outRMax;
98 144 outRMin = outRMax = inRMin * xform;
99
2/2
✓ Branch 0 taken 576 times.
✓ Branch 1 taken 72 times.
1296 for (int j = 0; j < 8; ++j) {
100 3456 Vec3R corner(
101
2/2
✓ Branch 0 taken 288 times.
✓ Branch 1 taken 288 times.
1152 j & 1 ? inRMax.x() : inRMin.x(),
102
2/2
✓ Branch 0 taken 288 times.
✓ Branch 1 taken 288 times.
1152 j & 2 ? inRMax.y() : inRMin.y(),
103
2/2
✓ Branch 0 taken 288 times.
✓ Branch 1 taken 288 times.
1152 j & 4 ? inRMax.z() : inRMin.z());
104 1152 outRMin = openvdb::math::minComponent(outRMin, corner * xform);
105 1152 outRMax = openvdb::math::maxComponent(outRMax, corner * xform);
106 }
107
108 144 CoordBBox bbox(
109 144 Coord(openvdb::tools::local_util::floorVec3(outRMin) - radius),
110 144 Coord(openvdb::tools::local_util::ceilVec3(outRMax) + radius));
111
112 // Transform the test grid.
113
1/2
✓ Branch 1 taken 72 times.
✗ Branch 2 not taken.
144 typename GridType::Ptr outGrid = GridType::create(background);
114
1/2
✓ Branch 1 taken 72 times.
✗ Branch 2 not taken.
144 transformer.transformGrid<Sampler>(*inGrid, *outGrid);
115
1/2
✓ Branch 1 taken 72 times.
✗ Branch 2 not taken.
144 openvdb::tools::prune(outGrid->tree());
116
117 // Verify that the bounding box of the transformed grid
118 // matches the transformed bounding box of the original grid.
119
120
1/2
✓ Branch 1 taken 72 times.
✗ Branch 2 not taken.
144 activeVoxelBBox = outGrid->evalActiveVoxelBoundingBox();
121
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 72 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.
144 EXPECT_TRUE(!activeVoxelBBox.empty());
122 const openvdb::Vec3i
123 144 omin = activeVoxelBBox.min().asVec3i(),
124 144 omax = activeVoxelBBox.max().asVec3i();
125 const int bboxTolerance = 1; // allow for rounding
126 #if 0
127 if (!omin.eq(bbox.min().asVec3i(), bboxTolerance) ||
128 !omax.eq(bbox.max().asVec3i(), bboxTolerance))
129 {
130 std::cerr << "\nS = " << scale << ", R = " << rotate
131 << ", T = " << translate << ", P = " << pivot << "\n"
132 << xform.transpose() << "\n" << "computed bbox = " << bbox
133 << "\nactual bbox = " << omin << " -> " << omax << "\n";
134 }
135 #endif
136
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 72 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.
144 EXPECT_TRUE(omin.eq(bbox.min().asVec3i(), bboxTolerance));
137
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 72 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.
144 EXPECT_TRUE(omax.eq(bbox.max().asVec3i(), bboxTolerance));
138
139 // Verify that (a voxel in) the interior of the cube was
140 // transformed correctly.
141
1/2
✓ Branch 3 taken 64 times.
✗ Branch 4 not taken.
144 const Coord center = Coord::round(Vec3R(12) * xform);
142 const typename GridType::TreeType& outTree = outGrid->tree();
143
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 72 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.
144 EXPECT_TRUE(openvdb::math::isExactlyEqual(transformTiles ? two : background,
144 outTree.getValue(center)));
145
3/18
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 36 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 36 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
216 if (transformTiles && tileIsActive) EXPECT_TRUE(outTree.isValueOn(center));
146
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 36 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.
72 else EXPECT_TRUE(!outTree.isValueOn(center));
147 }
148 18 }
149
150
151
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 TEST_F(TestGridTransformer, testTransformBoolPoint)
152 1 { transformGrid<openvdb::BoolGrid, openvdb::tools::PointSampler>(); }
153
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 TEST_F(TestGridTransformer, TransformFloatPoint)
154 1 { transformGrid<openvdb::FloatGrid, openvdb::tools::PointSampler>(); }
155
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 TEST_F(TestGridTransformer, TransformFloatBox)
156 1 { transformGrid<openvdb::FloatGrid, openvdb::tools::BoxSampler>(); }
157
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 TEST_F(TestGridTransformer, TransformFloatQuadratic)
158 1 { transformGrid<openvdb::FloatGrid, openvdb::tools::QuadraticSampler>(); }
159
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 TEST_F(TestGridTransformer, TransformDoubleBox)
160 1 { transformGrid<openvdb::DoubleGrid, openvdb::tools::BoxSampler>(); }
161
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 TEST_F(TestGridTransformer, TransformInt32Box)
162 1 { transformGrid<openvdb::Int32Grid, openvdb::tools::BoxSampler>(); }
163
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 TEST_F(TestGridTransformer, TransformInt64Box)
164 1 { transformGrid<openvdb::Int64Grid, openvdb::tools::BoxSampler>(); }
165
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 TEST_F(TestGridTransformer, TransformVec3SPoint)
166 1 { transformGrid<openvdb::VectorGrid, openvdb::tools::PointSampler>(); }
167
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 TEST_F(TestGridTransformer, TransformVec3DBox)
168 1 { transformGrid<openvdb::Vec3DGrid, openvdb::tools::BoxSampler>(); }
169
170
171 ////////////////////////////////////////
172
173
174
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 TEST_F(TestGridTransformer, testResampleToMatch)
175 {
176 using namespace openvdb;
177
178 // Create an input grid with an identity transform.
179 2 FloatGrid inGrid;
180 // Populate it with a 20 x 20 x 20 cube.
181
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 inGrid.fill(CoordBBox(Coord(5), Coord(24)), /*value=*/1.0);
182
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(8000, int(inGrid.activeVoxelCount()));
183
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(inGrid.tree().activeTileCount() > 0);
184
185 {//test identity transform
186
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 FloatGrid outGrid;
187
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(outGrid.transform() == inGrid.transform());
188 // Resample the input grid into the output grid using point sampling.
189
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 tools::resampleToMatch<tools::PointSampler>(inGrid, outGrid);
190
3/18
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ 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 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
1 EXPECT_EQ(int(inGrid.activeVoxelCount()), int(outGrid.activeVoxelCount()));
191
2/2
✓ Branch 0 taken 3912 times.
✓ Branch 1 taken 1 times.
3913 for (openvdb::FloatTree::ValueOnCIter iter = inGrid.tree().cbeginValueOn(); iter; ++iter) {
192
4/20
✓ Branch 1 taken 3912 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3912 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 3912 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 3912 times.
✗ 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 21 not taken.
✗ Branch 22 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
3912 ASSERT_DOUBLES_EXACTLY_EQUAL(*iter,outGrid.tree().getValue(iter.getCoord()));
193 }
194 // The output grid's transform should not have changed.
195
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(outGrid.transform() == inGrid.transform());
196 }
197
198 {//test nontrivial transform
199 // Create an output grid with a different transform.
200
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 math::Transform::Ptr xform = math::Transform::createLinearTransform();
201
1/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
1 xform->preScale(Vec3d(0.5, 0.5, 1.0));
202
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 FloatGrid outGrid;
203
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 outGrid.setTransform(xform);
204
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(outGrid.transform() != inGrid.transform());
205
206 // Resample the input grid into the output grid using point sampling.
207
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 tools::resampleToMatch<tools::PointSampler>(inGrid, outGrid);
208
209 // The output grid's transform should not have changed.
210
1/14
✗ 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 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
1 EXPECT_EQ(*xform, outGrid.transform());
211
212 // The output grid should have double the resolution of the input grid
213 // in x and y and the same resolution in z.
214
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(32000, int(outGrid.activeVoxelCount()));
215
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(Coord(40, 40, 20), outGrid.evalActiveVoxelDim());
216
1/14
✗ 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 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
1 EXPECT_EQ(CoordBBox(Coord(9, 9, 5), Coord(48, 48, 24)),
217 outGrid.evalActiveVoxelBoundingBox());
218
2/2
✓ Branch 0 taken 32000 times.
✓ Branch 1 taken 1 times.
32001 for (auto it = outGrid.tree().cbeginValueOn(); it; ++it) {
219
2/16
✓ Branch 1 taken 32000 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 32000 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.
32000 EXPECT_NEAR(1.0, *it, 1.0e-6);
220 }
221 }
222 1 }
223
224
225 ////////////////////////////////////////
226
227
228
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 TEST_F(TestGridTransformer, testDecomposition)
229 {
230 using namespace openvdb;
231 using tools::local_util::decompose;
232
233 {
234 Vec3d s, r, t;
235 1 auto m = Mat4d::identity();
236
1/16
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ 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 17 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
1 EXPECT_TRUE(decompose(m, s, r, t));
237 1 m(1, 3) = 1.0; // add a perspective component
238 // Verify that decomposition fails for perspective transforms.
239
1/16
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ 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 17 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
1 EXPECT_TRUE(!decompose(m, s, r, t));
240 }
241
242 const auto rad = [](double deg) { return deg * M_PI / 180.0; };
243
244 const Vec3d ix(1, 0, 0), iy(0, 1, 0), iz(0, 0, 1);
245
246 const auto translation = { Vec3d(0), Vec3d(100, 0, -100), Vec3d(-50, 100, 250) };
247 const auto scale = { 1.0, 0.25, -0.25, -1.0, 10.0, -10.0 };
248 const auto angle = { rad(0.0), rad(45.0), rad(90.0), rad(180.0),
249 1 rad(225.0), rad(270.0), rad(315.0), rad(360.0) };
250
251
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 1 times.
4 for (const auto& t: translation) {
252
253
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 3 times.
21 for (const double sx: scale) {
254
2/2
✓ Branch 0 taken 108 times.
✓ Branch 1 taken 18 times.
126 for (const double sy: scale) {
255
2/2
✓ Branch 0 taken 648 times.
✓ Branch 1 taken 108 times.
756 for (const double sz: scale) {
256 const Vec3d s(sx, sy, sz);
257
258
2/2
✓ Branch 0 taken 5184 times.
✓ Branch 1 taken 648 times.
5832 for (const double rx: angle) {
259
2/2
✓ Branch 0 taken 41472 times.
✓ Branch 1 taken 5184 times.
46656 for (const double ry: angle) {
260
2/2
✓ Branch 0 taken 331776 times.
✓ Branch 1 taken 41472 times.
373248 for (const double rz: angle) {
261
262 Mat4d m =
263
1/2
✓ Branch 1 taken 331776 times.
✗ Branch 2 not taken.
331776 math::rotation<Mat4d>(iz, rz) *
264
1/2
✓ Branch 1 taken 331776 times.
✗ Branch 2 not taken.
663552 math::rotation<Mat4d>(iy, ry) *
265
1/2
✓ Branch 1 taken 331776 times.
✗ Branch 2 not taken.
663552 math::rotation<Mat4d>(ix, rx) *
266
1/2
✓ Branch 3 taken 331776 times.
✗ Branch 4 not taken.
663552 math::scale<Mat4d>(s);
267 m.setTranslation(t);
268
269 Vec3d outS(0), outR(0), outT(0);
270
3/4
✓ Branch 1 taken 331776 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 74304 times.
✓ Branch 4 taken 257472 times.
331776 if (decompose(m, outS, outR, outT)) {
271 // If decomposition succeeds, verify that it produces
272 // the same matrix. (Most decompositions fail to find
273 // a unique solution, though.)
274 Mat4d outM =
275
1/2
✓ Branch 1 taken 74304 times.
✗ Branch 2 not taken.
74304 math::rotation<Mat4d>(iz, outR.z()) *
276
1/2
✓ Branch 1 taken 74304 times.
✗ Branch 2 not taken.
148608 math::rotation<Mat4d>(iy, outR.y()) *
277
1/2
✓ Branch 1 taken 74304 times.
✗ Branch 2 not taken.
148608 math::rotation<Mat4d>(ix, outR.x()) *
278 148608 math::scale<Mat4d>(outS);
279 outM.setTranslation(outT);
280
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 74304 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.
74304 EXPECT_TRUE(outM.eq(m));
281 }
282
1/2
✓ Branch 1 taken 331776 times.
✗ Branch 2 not taken.
331776 tools::GridTransformer transformer(m);
283 const bool transformUnchanged = transformer.getTransform().eq(m);
284
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 331776 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.
331776 EXPECT_TRUE(transformUnchanged);
285 }
286 }
287 }
288 }
289 }
290 }
291 }
292 1 }
293
294