GCC Code Coverage Report


Directory: ./
File: openvdb/openvdb/unittest/TestMorphology.cc
Date: 2022-07-25 17:40:05
Exec Total Coverage
Lines: 380 380 100.0%
Functions: 26 26 100.0%
Branches: 577 3198 18.0%

Line Branch Exec Source
1 // Copyright Contributors to the OpenVDB Project
2 // SPDX-License-Identifier: MPL-2.0
3
4 #include <openvdb/Types.h>
5 #include <openvdb/openvdb.h>
6 #include <openvdb/tools/Morphology.h>
7 #include <openvdb/tools/LevelSetUtil.h>
8 #include <openvdb/tools/LevelSetSphere.h>
9 #include <openvdb/util/Util.h>
10
11 #include <gtest/gtest.h>
12
13
14 template<typename TreeT, openvdb::tools::NearestNeighbors NN>
15 class TestMorphologyInternal
16 {
17 public:
18 static void testMorphActiveLeafValues(); // only tests the IGNORE_TILES policy
19 static void testMorphActiveValues();
20 };
21
22 using TDFF = TestMorphologyInternal<openvdb::FloatTree, openvdb::tools::NN_FACE>;
23 using TDFE = TestMorphologyInternal<openvdb::FloatTree, openvdb::tools::NN_FACE_EDGE>;
24 using TDFV = TestMorphologyInternal<openvdb::FloatTree, openvdb::tools::NN_FACE_EDGE_VERTEX>;
25 using TDMF = TestMorphologyInternal<openvdb::MaskTree, openvdb::tools::NN_FACE>;
26 using TDME = TestMorphologyInternal<openvdb::MaskTree, openvdb::tools::NN_FACE_EDGE>;
27 using TDMV = TestMorphologyInternal<openvdb::MaskTree, openvdb::tools::NN_FACE_EDGE_VERTEX>;
28
29 14 class TestMorphology : public ::testing::Test {};
30
31
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 TEST_F(TestMorphology, testFloatFaceActiveLeafValues) { TDFF::testMorphActiveLeafValues(); }
32
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 TEST_F(TestMorphology, testFloatFaceActiveValues) { TDFF::testMorphActiveValues(); }
33
34
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 TEST_F(TestMorphology, testFloatEdgeActiveLeafValues) { TDFE::testMorphActiveLeafValues(); }
35
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 TEST_F(TestMorphology, testFloatEdgeActiveValues) { TDFE::testMorphActiveValues(); }
36
37
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 TEST_F(TestMorphology, testFloatVertexActiveLeafValues) { TDFV::testMorphActiveLeafValues(); }
38
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 TEST_F(TestMorphology, testFloatVertexActiveValues) { TDFV::testMorphActiveValues(); }
39
40
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 TEST_F(TestMorphology, testMaskFaceActiveLeafValues) { TDMF::testMorphActiveLeafValues(); }
41
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 TEST_F(TestMorphology, testMaskFaceActiveValues) { TDMF::testMorphActiveValues(); }
42
43
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 TEST_F(TestMorphology, testMaskEdgeActiveLeafValues) { TDME::testMorphActiveLeafValues(); }
44
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 TEST_F(TestMorphology, testMaskEdgeActiveValues) { TDME::testMorphActiveValues(); }
45
46
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 TEST_F(TestMorphology, testMaskVertexActiveLeafValues) { TDMV::testMorphActiveLeafValues(); }
47
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 TEST_F(TestMorphology, testMaskVertexActiveValues) { TDMV::testMorphActiveValues(); }
48
49 template<typename TreeT, openvdb::tools::NearestNeighbors NN>
50 void
51
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 TestMorphologyInternal<TreeT, NN>::testMorphActiveLeafValues()
52 {
53 using openvdb::Coord;
54 using openvdb::Index32;
55 using openvdb::Index64;
56 using ValueType = typename TreeT::ValueType;
57
58 size_t offsets = 0;
59 if (NN == openvdb::tools::NN_FACE) offsets = 6;
60 if (NN == openvdb::tools::NN_FACE_EDGE) offsets = 18;
61 if (NN == openvdb::tools::NN_FACE_EDGE_VERTEX) offsets = 26;
62
63 const Coord* const start = openvdb::util::COORD_OFFSETS;
64 const Coord* const end = start + offsets;
65
66 // Small methods to check neighbour activity from an xyz coordinate. Recurse
67 // parameter allows for recursively checking the acitvity of the xyz
68 // neighbours, with recurse=0 only checking the immediate neighbours.
69 std::function<void(const TreeT&, const Coord&, const size_t)> CheckActiveNeighbours;
70
1/4
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
2358368 CheckActiveNeighbours = [start, end, &CheckActiveNeighbours]
71 (const TreeT& acc, const Coord& xyz, const size_t recurse)
72 {
73
6/96
✗ Branch 0 not taken.
✓ Branch 1 taken 475807 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.
✗ Branch 24 not taken.
✓ Branch 25 taken 111695 times.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 2087 times.
✗ Branch 51 not taken.
✗ Branch 52 not taken.
✗ Branch 54 not taken.
✗ Branch 55 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
✗ Branch 68 not taken.
✗ Branch 69 not taken.
✗ Branch 70 not taken.
✗ Branch 71 not taken.
✗ Branch 72 not taken.
✓ Branch 73 taken 475807 times.
✗ Branch 75 not taken.
✗ Branch 76 not taken.
✗ Branch 78 not taken.
✗ Branch 79 not taken.
✗ Branch 81 not taken.
✗ Branch 82 not taken.
✗ Branch 84 not taken.
✗ Branch 85 not taken.
✗ Branch 88 not taken.
✗ Branch 89 not taken.
✗ Branch 92 not taken.
✗ Branch 93 not taken.
✗ Branch 94 not taken.
✗ Branch 95 not taken.
✗ Branch 96 not taken.
✓ Branch 97 taken 111695 times.
✗ Branch 99 not taken.
✗ Branch 100 not taken.
✗ Branch 102 not taken.
✗ Branch 103 not taken.
✗ Branch 105 not taken.
✗ Branch 106 not taken.
✗ Branch 108 not taken.
✗ Branch 109 not taken.
✗ Branch 112 not taken.
✗ Branch 113 not taken.
✗ Branch 116 not taken.
✗ Branch 117 not taken.
✗ Branch 118 not taken.
✗ Branch 119 not taken.
✗ Branch 120 not taken.
✓ Branch 121 taken 2087 times.
✗ Branch 123 not taken.
✗ Branch 124 not taken.
✗ Branch 126 not taken.
✗ Branch 127 not taken.
✗ Branch 129 not taken.
✗ Branch 130 not taken.
✗ Branch 132 not taken.
✗ Branch 133 not taken.
✗ Branch 136 not taken.
✗ Branch 137 not taken.
✗ Branch 140 not taken.
✗ Branch 141 not taken.
✗ Branch 142 not taken.
✗ Branch 143 not taken.
1179178 EXPECT_TRUE(acc.isValueOn(xyz));
74 1179178 const Coord* offset(start);
75
12/12
✓ Branch 0 taken 12370982 times.
✓ Branch 1 taken 475807 times.
✓ Branch 2 taken 2010510 times.
✓ Branch 3 taken 111695 times.
✓ Branch 4 taken 12522 times.
✓ Branch 5 taken 2087 times.
✓ Branch 6 taken 12370982 times.
✓ Branch 7 taken 475807 times.
✓ Branch 8 taken 2010510 times.
✓ Branch 9 taken 111695 times.
✓ Branch 10 taken 12522 times.
✓ Branch 11 taken 2087 times.
29967206 while (offset != end) {
76 // optionally recurse into neighbour voxels
77 28788028 const Coord ijk = xyz + *offset;
78
12/12
✓ Branch 0 taken 475280 times.
✓ Branch 1 taken 11895702 times.
✓ Branch 3 taken 111168 times.
✓ Branch 4 taken 1899342 times.
✓ Branch 6 taken 1560 times.
✓ Branch 7 taken 10962 times.
✓ Branch 9 taken 475280 times.
✓ Branch 10 taken 11895702 times.
✓ Branch 12 taken 111168 times.
✓ Branch 13 taken 1899342 times.
✓ Branch 15 taken 1560 times.
✓ Branch 16 taken 10962 times.
28788028 if (recurse > 0) CheckActiveNeighbours(acc, ijk, recurse-1);
79
6/96
✗ Branch 1 not taken.
✓ Branch 2 taken 12370982 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.
✗ Branch 26 not taken.
✓ Branch 27 taken 2010510 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✗ Branch 49 not taken.
✗ Branch 51 not taken.
✓ Branch 52 taken 12522 times.
✗ Branch 54 not taken.
✗ Branch 55 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
✗ Branch 63 not taken.
✗ Branch 64 not taken.
✗ Branch 67 not taken.
✗ Branch 68 not taken.
✗ Branch 71 not taken.
✗ Branch 72 not taken.
✗ Branch 73 not taken.
✗ Branch 74 not taken.
✗ Branch 76 not taken.
✓ Branch 77 taken 12370982 times.
✗ Branch 79 not taken.
✗ Branch 80 not taken.
✗ Branch 82 not taken.
✗ Branch 83 not taken.
✗ Branch 85 not taken.
✗ Branch 86 not taken.
✗ Branch 88 not taken.
✗ Branch 89 not taken.
✗ Branch 92 not taken.
✗ Branch 93 not taken.
✗ Branch 96 not taken.
✗ Branch 97 not taken.
✗ Branch 98 not taken.
✗ Branch 99 not taken.
✗ Branch 101 not taken.
✓ Branch 102 taken 2010510 times.
✗ Branch 104 not taken.
✗ Branch 105 not taken.
✗ Branch 107 not taken.
✗ Branch 108 not taken.
✗ Branch 110 not taken.
✗ Branch 111 not taken.
✗ Branch 113 not taken.
✗ Branch 114 not taken.
✗ Branch 117 not taken.
✗ Branch 118 not taken.
✗ Branch 121 not taken.
✗ Branch 122 not taken.
✗ Branch 123 not taken.
✗ Branch 124 not taken.
✗ Branch 126 not taken.
✓ Branch 127 taken 12522 times.
✗ Branch 129 not taken.
✗ Branch 130 not taken.
✗ Branch 132 not taken.
✗ Branch 133 not taken.
✗ Branch 135 not taken.
✗ Branch 136 not taken.
✗ Branch 138 not taken.
✗ Branch 139 not taken.
✗ Branch 142 not taken.
✗ Branch 143 not taken.
✗ Branch 146 not taken.
✗ Branch 147 not taken.
✗ Branch 148 not taken.
✗ Branch 149 not taken.
28788028 EXPECT_TRUE(acc.isValueOn(ijk));
80 28788028 ++offset;
81 }
82 };
83
84 3144 auto CheckInactiveNeighbours = [start, end]
85 (const TreeT& acc, const Coord& xyz) {
86 3132 const Coord* offset(start);
87
12/12
✓ Branch 0 taken 13572 times.
✓ Branch 1 taken 522 times.
✓ Branch 2 taken 9396 times.
✓ Branch 3 taken 522 times.
✓ Branch 4 taken 3132 times.
✓ Branch 5 taken 522 times.
✓ Branch 6 taken 13572 times.
✓ Branch 7 taken 522 times.
✓ Branch 8 taken 9396 times.
✓ Branch 9 taken 522 times.
✓ Branch 10 taken 3132 times.
✓ Branch 11 taken 522 times.
55332 while (offset != end) {
88
6/96
✗ Branch 1 not taken.
✓ Branch 2 taken 13572 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.
✗ Branch 26 not taken.
✓ Branch 27 taken 9396 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✗ Branch 49 not taken.
✗ Branch 51 not taken.
✓ Branch 52 taken 3132 times.
✗ Branch 54 not taken.
✗ Branch 55 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
✗ Branch 63 not taken.
✗ Branch 64 not taken.
✗ Branch 67 not taken.
✗ Branch 68 not taken.
✗ Branch 71 not taken.
✗ Branch 72 not taken.
✗ Branch 73 not taken.
✗ Branch 74 not taken.
✗ Branch 76 not taken.
✓ Branch 77 taken 13572 times.
✗ Branch 79 not taken.
✗ Branch 80 not taken.
✗ Branch 82 not taken.
✗ Branch 83 not taken.
✗ Branch 85 not taken.
✗ Branch 86 not taken.
✗ Branch 88 not taken.
✗ Branch 89 not taken.
✗ Branch 92 not taken.
✗ Branch 93 not taken.
✗ Branch 96 not taken.
✗ Branch 97 not taken.
✗ Branch 98 not taken.
✗ Branch 99 not taken.
✗ Branch 101 not taken.
✓ Branch 102 taken 9396 times.
✗ Branch 104 not taken.
✗ Branch 105 not taken.
✗ Branch 107 not taken.
✗ Branch 108 not taken.
✗ Branch 110 not taken.
✗ Branch 111 not taken.
✗ Branch 113 not taken.
✗ Branch 114 not taken.
✗ Branch 117 not taken.
✗ Branch 118 not taken.
✗ Branch 121 not taken.
✗ Branch 122 not taken.
✗ Branch 123 not taken.
✗ Branch 124 not taken.
✗ Branch 126 not taken.
✓ Branch 127 taken 3132 times.
✗ Branch 129 not taken.
✗ Branch 130 not taken.
✗ Branch 132 not taken.
✗ Branch 133 not taken.
✗ Branch 135 not taken.
✗ Branch 136 not taken.
✗ Branch 138 not taken.
✗ Branch 139 not taken.
✗ Branch 142 not taken.
✗ Branch 143 not taken.
✗ Branch 146 not taken.
✗ Branch 147 not taken.
✗ Branch 148 not taken.
✗ Branch 149 not taken.
52200 EXPECT_TRUE(acc.isValueOff(xyz + *offset));
89 52200 ++offset;
90 }
91 };
92
93 constexpr bool IsMask = std::is_same<ValueType, bool>::value;
94 24 TreeT tree(IsMask ? 0.0 : -1.0);
95
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 6 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.
12 EXPECT_TRUE(tree.empty());
96
97 const openvdb::Index leafDim = TreeT::LeafNodeType::DIM;
98
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(1 << 3, int(leafDim));
99
100 { // Set and dilate a single voxel at the center of a leaf node.
101
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 tree.clear();
102 const Coord xyz(leafDim >> 1);
103
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
24 tree.setValue(xyz, ValueType(1.0));
104
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 6 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.
12 EXPECT_TRUE(tree.isValueOn(xyz));
105
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(Index64(1), tree.activeVoxelCount());
106 // dilate
107
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 openvdb::tools::dilateActiveValues(tree, 1, NN, openvdb::tools::IGNORE_TILES);
108
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 CheckActiveNeighbours(tree, xyz, 0);
109
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(Index64(1 + offsets), tree.activeVoxelCount());
110 // erode
111
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 openvdb::tools::erodeActiveValues(tree, 1, NN, openvdb::tools::IGNORE_TILES);
112
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 CheckInactiveNeighbours(tree, xyz);
113
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(Index64(1), tree.activeVoxelCount());
114
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 openvdb::tools::erodeActiveValues(tree, 1, NN, openvdb::tools::IGNORE_TILES);
115
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(Index64(0), tree.activeVoxelCount());
116
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(Index32(1), tree.leafCount());
117 // check values
118 if (!IsMask) {
119
2/16
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 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.
12 EXPECT_EQ(tree.getValue(xyz), ValueType(1.0));
120 const Coord* offset(start);
121
4/18
✓ Branch 0 taken 50 times.
✓ Branch 1 taken 3 times.
✓ Branch 3 taken 50 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 50 times.
✗ 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 17 not taken.
✗ Branch 18 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
206 while (offset != end) EXPECT_EQ(tree.getValue(xyz + *offset++), ValueType(-1.0));
122 }
123 }
124 { // Create an active, leaf node-sized tile and a single edge/corner voxel
125
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 tree.clear();
126
2/4
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
24 tree.addTile(/*level*/1, Coord(0), ValueType(1.0), true);
127
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(Index32(0), tree.leafCount());
128
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(Index64(leafDim * leafDim * leafDim), tree.activeVoxelCount());
129
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(Index64(1), tree.activeTileCount());
130
131 const Coord xyz(leafDim, leafDim - 1, leafDim - 1);
132
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 tree.setValue(xyz, ValueType(1.0));
133
134
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 Index64 expected = leafDim * leafDim * leafDim + 1;
135
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(expected, tree.activeVoxelCount());
136
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(Index64(1), tree.activeTileCount());
137
138 // dilate
139
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 openvdb::tools::dilateActiveValues(tree, 1, NN, openvdb::tools::IGNORE_TILES);
140
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 CheckActiveNeighbours(tree, xyz, 0);
141
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 if (NN == openvdb::tools::NN_FACE) expected += 5; // 1 overlapping with tile
142
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 if (NN == openvdb::tools::NN_FACE_EDGE) expected += 15; // 3 overlapping
143
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 if (NN == openvdb::tools::NN_FACE_EDGE_VERTEX) expected += 22; // 4 overlapping
144
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(expected, tree.activeVoxelCount());
145
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(Index64(1), tree.activeTileCount());
146 Index32 leafs;
147
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 if (NN == openvdb::tools::NN_FACE) leafs = 3;
148
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 if (NN == openvdb::tools::NN_FACE_EDGE) leafs = 6;
149
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 if (NN == openvdb::tools::NN_FACE_EDGE_VERTEX) leafs = 7;
150
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(leafs, tree.leafCount());
151
152 // erode
153
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 openvdb::tools::erodeActiveValues(tree, 1, NN, openvdb::tools::IGNORE_TILES);
154 // tile should be umodified
155
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 expected = leafDim * leafDim * leafDim + 1;
156
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(Index64(1), tree.activeTileCount());
157
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(leafs, tree.leafCount());
158
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(expected, tree.activeVoxelCount());
159 //
160
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 openvdb::tools::erodeActiveValues(tree, 1, NN, openvdb::tools::IGNORE_TILES);
161
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(Index64(1), tree.activeTileCount());
162
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(leafs, tree.leafCount());
163
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 expected = leafDim * leafDim * leafDim;
164
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(expected, tree.activeVoxelCount());
165 // erode again, only 1 active tile, should be no change
166
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
24 TreeT copy(tree);
167
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 openvdb::tools::erodeActiveValues(tree, 1, NN, openvdb::tools::IGNORE_TILES);
168
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 6 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.
12 EXPECT_TRUE(copy.hasSameTopology(tree));
169 // check values
170 if (!IsMask) {
171
2/16
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 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.
12 EXPECT_EQ(tree.getValue(xyz), ValueType(1.0));
172
2/16
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 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.
12 EXPECT_EQ(tree.getValue(Coord(0)), ValueType(1.0));
173 }
174 }
175 { // Set and dilate a single voxel at each of the eight corners of a leaf node.
176
2/2
✓ Branch 0 taken 48 times.
✓ Branch 1 taken 6 times.
108 for (int i = 0; i < 8; ++i) {
177
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
96 tree.clear();
178 288 const Coord xyz(
179
2/2
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 24 times.
96 i & 1 ? leafDim - 1 : 0,
180
2/2
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 24 times.
96 i & 2 ? leafDim - 1 : 0,
181
2/2
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 24 times.
96 i & 4 ? leafDim - 1 : 0);
182
2/4
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 48 times.
✗ Branch 5 not taken.
192 tree.setValue(xyz, ValueType(1.0));
183
2/16
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 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.
96 EXPECT_EQ(Index64(1), tree.activeVoxelCount());
184 // dilate
185
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
96 openvdb::tools::dilateActiveValues(tree, 1, NN, openvdb::tools::IGNORE_TILES);
186
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
96 CheckActiveNeighbours(tree, xyz, 0);
187
2/16
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 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.
96 EXPECT_EQ(Index64(1 + offsets), tree.activeVoxelCount());
188 // erode
189
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
96 openvdb::tools::erodeActiveValues(tree, 1, NN, openvdb::tools::IGNORE_TILES);
190
1/2
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
96 CheckInactiveNeighbours(tree, xyz);
191
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 48 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.
96 EXPECT_TRUE(tree.isValueOn(xyz));
192
2/16
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 48 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.
96 EXPECT_EQ(Index64(1), tree.activeVoxelCount());
193 // check values
194 if (!IsMask) {
195
2/16
✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 24 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.
96 EXPECT_EQ(tree.getValue(xyz), ValueType(1.0));
196 const Coord* offset(start);
197
4/18
✓ Branch 0 taken 400 times.
✓ Branch 1 taken 24 times.
✓ Branch 3 taken 400 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 400 times.
✗ 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 17 not taken.
✗ Branch 18 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
1648 while (offset != end) EXPECT_EQ(tree.getValue(xyz + *offset++), ValueType(-1.0));
198 }
199 }
200 }
201 { // 3 neighbouring voxels
202
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 tree.clear();
203 const Coord xyz1(0), xyz2(1,0,0), xyz3(-1,0,0);
204
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 tree.setValue(xyz1, ValueType(1.0));
205
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 tree.setValue(xyz2, ValueType(1.0));
206
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 tree.setValue(xyz3, ValueType(1.0));
207
208
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 Index64 expected = 3;
209
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(expected, tree.activeVoxelCount());
210
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 openvdb::tools::dilateActiveValues(tree, 1, NN, openvdb::tools::IGNORE_TILES);
211
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 CheckActiveNeighbours(tree, xyz1, 0);
212
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 CheckActiveNeighbours(tree, xyz2, 0);
213
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 CheckActiveNeighbours(tree, xyz3, 0);
214
215
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 if (NN == openvdb::tools::NN_FACE) expected += (6* 3)-4; // dilation - overlapping
216
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 if (NN == openvdb::tools::NN_FACE_EDGE) expected += (18*3)-20; // dilation - overlapping
217
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 if (NN == openvdb::tools::NN_FACE_EDGE_VERTEX) expected += (26*3)-36; // dilation - overlapping
218
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(expected, tree.activeVoxelCount());
219
220
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 openvdb::tools::erodeActiveValues(tree, 1, NN, openvdb::tools::IGNORE_TILES);
221
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 expected = 3;
222
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(expected, tree.activeVoxelCount());
223 // check values
224 if (!IsMask) {
225
2/16
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 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.
12 EXPECT_EQ(tree.getValue(xyz1), ValueType(1.0));
226
2/16
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 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.
12 EXPECT_EQ(tree.getValue(xyz2), ValueType(1.0));
227
2/16
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 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.
12 EXPECT_EQ(tree.getValue(xyz3), ValueType(1.0));
228 }
229 }
230 { // Perform repeated dilations, starting with a single voxel.
231 struct Info { int activeVoxelCount, leafCount, nonLeafCount; };
232 12 Info iterInfo[33] = {
233 /* FACE EDGE VERTEX */
234 { 1, 1, 3 }, { 1, 1, 3 }, { 1, 1, 3 },
235 { 7, 1, 3 }, { 19, 1, 3 }, { 27, 1, 3 },
236 { 25, 1, 3 }, { 93, 1, 3 }, { 125, 1, 3 },
237 { 63, 1, 3 }, { 263, 1, 3 }, { 343, 1, 3 },
238 { 129, 4, 3 }, { 569, 7, 3 }, { 729, 8, 3 },
239 { 231, 7, 9 }, { 1051, 19, 15 }, { 1331, 27, 17 },
240 { 377, 7, 9 }, { 1749, 20, 15 }, { 2197, 27, 17 },
241 { 575, 7, 9 }, { 2703, 26, 15 }, { 3375, 27, 17 },
242 { 833, 10, 9 }, { 3953, 27, 17 }, { 4913, 27, 17 },
243 { 1159, 16, 9 }, { 5539, 27, 17 }, { 6859, 27, 17 },
244 { 1561, 19, 15 }, { 7501, 27, 17 }, { 9261, 27, 17 },
245 };
246
247
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 tree.clear();
248
2/4
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
24 tree.setValue(Coord(leafDim >> 1), ValueType(1.0));
249
250 int offset = 0;
251 if (NN == openvdb::tools::NN_FACE_EDGE) offset = 1;
252 if (NN == openvdb::tools::NN_FACE_EDGE_VERTEX) offset = 2;
253 int i = offset;
254
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(iterInfo[i].activeVoxelCount, int(tree.activeVoxelCount()));
255
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(iterInfo[i].leafCount, int(tree.leafCount()));
256
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(iterInfo[i].nonLeafCount, int(tree.nonLeafCount()));
257
258 // dilate
259 i+= 3;
260
2/2
✓ Branch 0 taken 60 times.
✓ Branch 1 taken 6 times.
132 for (; i < 33; i+=3) {
261
1/2
✓ Branch 1 taken 60 times.
✗ Branch 2 not taken.
120 openvdb::tools::dilateActiveValues(tree, 1, NN, openvdb::tools::IGNORE_TILES);
262
2/16
✓ Branch 1 taken 60 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 60 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.
120 EXPECT_EQ(iterInfo[i].activeVoxelCount, int(tree.activeVoxelCount()));
263
2/16
✓ Branch 1 taken 60 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 60 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.
120 EXPECT_EQ(iterInfo[i].leafCount, int(tree.leafCount()));
264
2/16
✓ Branch 1 taken 60 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 60 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.
120 EXPECT_EQ(iterInfo[i].nonLeafCount, int(tree.nonLeafCount()));
265 }
266 // erode
267 12 i-= 6;
268
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 60 times.
132 for (; i >= 0; i-=3) {
269
1/2
✓ Branch 1 taken 60 times.
✗ Branch 2 not taken.
120 openvdb::tools::erodeActiveValues(tree, 1, NN, openvdb::tools::IGNORE_TILES);
270 // also prune inactive to clear up empty nodes
271
1/2
✓ Branch 1 taken 60 times.
✗ Branch 2 not taken.
120 openvdb::tools::pruneInactive(tree);
272
2/16
✓ Branch 1 taken 60 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 60 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.
120 EXPECT_EQ(iterInfo[i].activeVoxelCount, int(tree.activeVoxelCount()));
273
2/16
✓ Branch 1 taken 60 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 60 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.
120 EXPECT_EQ(iterInfo[i].leafCount, int(tree.leafCount()));
274
2/16
✓ Branch 1 taken 60 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 60 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.
120 EXPECT_EQ(iterInfo[i].nonLeafCount, int(tree.nonLeafCount()));
275 }
276 // try with values as iterations
277 int j = 0;
278 i = offset;
279
2/2
✓ Branch 0 taken 66 times.
✓ Branch 1 taken 6 times.
144 for (; i < 33; i+=3, ++j) {
280
1/2
✓ Branch 1 taken 66 times.
✗ Branch 2 not taken.
132 tree.clear();
281
1/2
✓ Branch 1 taken 66 times.
✗ Branch 2 not taken.
132 tree.setValue(Coord(leafDim >> 1), ValueType(1.0));
282 // dilate
283
1/2
✓ Branch 1 taken 66 times.
✗ Branch 2 not taken.
132 openvdb::tools::dilateActiveValues(tree, j, NN, openvdb::tools::IGNORE_TILES);
284
2/16
✓ Branch 1 taken 66 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 66 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.
132 EXPECT_EQ(iterInfo[i].activeVoxelCount, int(tree.activeVoxelCount()));
285
2/16
✓ Branch 1 taken 66 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 66 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.
132 EXPECT_EQ(iterInfo[i].leafCount, int(tree.leafCount()));
286
2/16
✓ Branch 1 taken 66 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 66 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.
132 EXPECT_EQ(iterInfo[i].nonLeafCount, int(tree.nonLeafCount()));
287 }
288 // erode
289 12 i-= 3;
290 j = 0;
291
2/2
✓ Branch 0 taken 66 times.
✓ Branch 1 taken 6 times.
144 for (; i >= 0; i-=3, ++j) {
292
1/2
✓ Branch 1 taken 66 times.
✗ Branch 2 not taken.
132 tree.clear();
293
1/2
✓ Branch 1 taken 66 times.
✗ Branch 2 not taken.
132 tree.setValue(Coord(leafDim >> 1), ValueType(1.0));
294
1/2
✓ Branch 1 taken 66 times.
✗ Branch 2 not taken.
132 openvdb::tools::dilateActiveValues(tree, 10, NN, openvdb::tools::IGNORE_TILES);
295
1/2
✓ Branch 1 taken 66 times.
✗ Branch 2 not taken.
132 openvdb::tools::erodeActiveValues(tree, j, NN, openvdb::tools::IGNORE_TILES);
296 // also prune inactive to clear up empty nodes
297
1/2
✓ Branch 1 taken 66 times.
✗ Branch 2 not taken.
132 openvdb::tools::pruneInactive(tree);
298
2/16
✓ Branch 1 taken 66 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 66 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.
132 EXPECT_EQ(iterInfo[i].activeVoxelCount, int(tree.activeVoxelCount()));
299
2/16
✓ Branch 1 taken 66 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 66 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.
132 EXPECT_EQ(iterInfo[i].leafCount, int(tree.leafCount()));
300
2/16
✓ Branch 1 taken 66 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 66 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.
132 EXPECT_EQ(iterInfo[i].nonLeafCount, int(tree.nonLeafCount()));
301 }
302 }
303 { // Test multiple iterations
304
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 tree.clear();
305 const Coord xyz(leafDim >> 1);
306
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
24 tree.setValue(xyz, ValueType(1.0));
307
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 6 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.
12 EXPECT_TRUE(tree.isValueOn(xyz));
308
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 Index64 expected = 1;
309
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(expected, tree.activeVoxelCount());
310
311 4 if (NN == openvdb::tools::NN_FACE) expected = 25;
312 4 if (NN == openvdb::tools::NN_FACE_EDGE) expected = 93;
313 4 if (NN == openvdb::tools::NN_FACE_EDGE_VERTEX) expected = 125;
314
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 openvdb::tools::dilateActiveValues(tree, 2, NN, openvdb::tools::IGNORE_TILES);
315
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 CheckActiveNeighbours(tree, xyz, /*recurse-once*/1);
316
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(expected, tree.activeVoxelCount());
317
318 4 if (NN == openvdb::tools::NN_FACE) expected = 231;
319 4 if (NN == openvdb::tools::NN_FACE_EDGE) expected = 1051;
320 4 if (NN == openvdb::tools::NN_FACE_EDGE_VERTEX) expected = 1331;
321
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 openvdb::tools::dilateActiveValues(tree, 3, NN, openvdb::tools::IGNORE_TILES);
322
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 CheckActiveNeighbours(tree, xyz, /*recurse-four-times*/4);
323
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(expected, tree.activeVoxelCount());
324
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 openvdb::tools::erodeActiveValues(tree, 5, NN, openvdb::tools::IGNORE_TILES);
325
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(Index64(1), tree.activeVoxelCount());
326
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 CheckInactiveNeighbours(tree, xyz);
327 }
328
329 {// dilate a narrow band of a sphere
330
2/4
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
12 const openvdb::FloatGrid::ConstPtr grid =
331 openvdb::tools::createLevelSetSphere<openvdb::FloatGrid>(/*radius=*/20,
332 /*center=*/openvdb::Vec3f(0, 0, 0),
333 /*dx=*/1.0f, /*halfWidth*/ 3.0f);
334
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 const Index64 count = grid->tree().activeVoxelCount();
335 {
336
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
24 TreeT copy(grid->tree());
337
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 openvdb::tools::dilateActiveValues(copy, 1, NN, openvdb::tools::IGNORE_TILES);
338
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 6 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.
12 EXPECT_TRUE(copy.activeVoxelCount() > count);
339 }
340 {
341
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
24 TreeT copy(grid->tree());
342
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 openvdb::tools::erodeActiveValues(copy, 1, NN, openvdb::tools::IGNORE_TILES);
343
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 6 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.
12 EXPECT_TRUE(copy.activeVoxelCount() < count);
344 }
345 }
346
347 {// dilate a fog volume of a sphere
348
2/4
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
12 openvdb::FloatGrid::Ptr grid =
349 openvdb::tools::createLevelSetSphere<openvdb::FloatGrid>(/*radius=*/20,
350 /*center=*/openvdb::Vec3f(0, 0, 0),
351 /*dx=*/1.0f, /*halfWidth*/ 3.0f);
352
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 openvdb::tools::sdfToFogVolume(*grid);
353
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 const Index64 count = grid->tree().activeVoxelCount();
354 {
355
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
24 TreeT copy(grid->tree());
356
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 openvdb::tools::dilateActiveValues(copy, 1, NN, openvdb::tools::IGNORE_TILES);
357
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 6 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.
12 EXPECT_TRUE(copy.activeVoxelCount() > count);
358 }
359 {
360
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
24 TreeT copy(grid->tree());
361
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 openvdb::tools::erodeActiveValues(copy, 1, NN, openvdb::tools::IGNORE_TILES);
362
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 6 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.
12 EXPECT_TRUE(copy.activeVoxelCount() < count);
363 }
364 }
365
366 { // test dilation/erosion at every position inside a 8x8x8 leaf
367
2/2
✓ Branch 0 taken 48 times.
✓ Branch 1 taken 6 times.
108 for (int x=0; x<8; ++x) {
368
2/2
✓ Branch 0 taken 384 times.
✓ Branch 1 taken 48 times.
864 for (int y=0; y<8; ++y) {
369
2/2
✓ Branch 0 taken 3072 times.
✓ Branch 1 taken 384 times.
6912 for (int z=0; z<8; ++z) {
370
1/2
✓ Branch 1 taken 3072 times.
✗ Branch 2 not taken.
6144 tree.clear();
371 const openvdb::Coord xyz(x,y,z);
372
1/2
✓ Branch 1 taken 3072 times.
✗ Branch 2 not taken.
12288 tree.setValue(xyz, ValueType(1.0));
373
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 3072 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.
6144 EXPECT_TRUE(tree.isValueOn(xyz));
374
2/16
✓ Branch 1 taken 3072 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 3072 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.
6144 EXPECT_EQ(Index64(1), tree.activeVoxelCount());
375 // dilate
376
1/2
✓ Branch 1 taken 3072 times.
✗ Branch 2 not taken.
6144 openvdb::tools::dilateActiveValues(tree, 1, NN, openvdb::tools::IGNORE_TILES);
377
1/2
✓ Branch 1 taken 3072 times.
✗ Branch 2 not taken.
6144 CheckActiveNeighbours(tree, xyz, 0);
378
2/16
✓ Branch 1 taken 3072 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 3072 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.
6144 EXPECT_EQ(Index64(1 + offsets), tree.activeVoxelCount());
379 //erode
380
1/2
✓ Branch 1 taken 3072 times.
✗ Branch 2 not taken.
6144 openvdb::tools::erodeActiveValues(tree, 1, NN, openvdb::tools::IGNORE_TILES);
381
2/16
✓ Branch 1 taken 3072 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 3072 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.
6144 EXPECT_EQ(Index64(1), tree.activeVoxelCount());
382
1/2
✓ Branch 1 taken 3072 times.
✗ Branch 2 not taken.
6144 CheckInactiveNeighbours(tree, xyz);
383
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 3072 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.
6144 EXPECT_TRUE(tree.isValueOn(xyz));
384
2/16
✓ Branch 1 taken 1536 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1536 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.
3072 if (!IsMask) { EXPECT_EQ(ValueType(1.0), tree.getValue(xyz)); }
385 }
386 }
387 }
388 }
389 12 }
390
391 template<typename TreeT, openvdb::tools::NearestNeighbors NN>
392 void
393
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 TestMorphologyInternal<TreeT, NN>::testMorphActiveValues()
394 {
395 using openvdb::Coord;
396 using openvdb::CoordBBox;
397 using openvdb::Index32;
398 using openvdb::Index64;
399 using ValueType = typename TreeT::ValueType;
400
401 size_t offsets = 0;
402 if (NN == openvdb::tools::NN_FACE) offsets = 6;
403 if (NN == openvdb::tools::NN_FACE_EDGE) offsets = 18;
404 if (NN == openvdb::tools::NN_FACE_EDGE_VERTEX) offsets = 26;
405
406 const Coord* const start = openvdb::util::COORD_OFFSETS;
407 const Coord* const end = start + offsets;
408
409 // Small method to check neighbour activity from an xyz coordinate. Recurse
410 // parameter allows for recursively checking the acitvity of the xyz
411 // neighbours, with recurse=0 only checking the immediate neighbours.
412 std::function<void(const TreeT&, const Coord&, const size_t)> CheckActiveNeighbours;
413
1/4
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
14060 CheckActiveNeighbours = [start, end, &CheckActiveNeighbours]
414 (const TreeT& acc, const Coord& xyz, const size_t recurse)
415 {
416
6/96
✗ Branch 0 not taken.
✓ Branch 1 taken 1180 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.
✗ Branch 24 not taken.
✓ Branch 25 taken 1172 times.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✗ Branch 33 not taken.
✗ Branch 34 not taken.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
✗ Branch 40 not taken.
✗ Branch 41 not taken.
✗ Branch 44 not taken.
✗ Branch 45 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✓ Branch 49 taken 1160 times.
✗ Branch 51 not taken.
✗ Branch 52 not taken.
✗ Branch 54 not taken.
✗ Branch 55 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
✗ Branch 68 not taken.
✗ Branch 69 not taken.
✗ Branch 70 not taken.
✗ Branch 71 not taken.
✗ Branch 72 not taken.
✓ Branch 73 taken 1180 times.
✗ Branch 75 not taken.
✗ Branch 76 not taken.
✗ Branch 78 not taken.
✗ Branch 79 not taken.
✗ Branch 81 not taken.
✗ Branch 82 not taken.
✗ Branch 84 not taken.
✗ Branch 85 not taken.
✗ Branch 88 not taken.
✗ Branch 89 not taken.
✗ Branch 92 not taken.
✗ Branch 93 not taken.
✗ Branch 94 not taken.
✗ Branch 95 not taken.
✗ Branch 96 not taken.
✓ Branch 97 taken 1172 times.
✗ Branch 99 not taken.
✗ Branch 100 not taken.
✗ Branch 102 not taken.
✗ Branch 103 not taken.
✗ Branch 105 not taken.
✗ Branch 106 not taken.
✗ Branch 108 not taken.
✗ Branch 109 not taken.
✗ Branch 112 not taken.
✗ Branch 113 not taken.
✗ Branch 116 not taken.
✗ Branch 117 not taken.
✗ Branch 118 not taken.
✗ Branch 119 not taken.
✗ Branch 120 not taken.
✓ Branch 121 taken 1160 times.
✗ Branch 123 not taken.
✗ Branch 124 not taken.
✗ Branch 126 not taken.
✗ Branch 127 not taken.
✗ Branch 129 not taken.
✗ Branch 130 not taken.
✗ Branch 132 not taken.
✗ Branch 133 not taken.
✗ Branch 136 not taken.
✗ Branch 137 not taken.
✗ Branch 140 not taken.
✗ Branch 141 not taken.
✗ Branch 142 not taken.
✗ Branch 143 not taken.
7024 EXPECT_TRUE(acc.isValueOn(xyz));
417 7024 const Coord* offset(start);
418
12/12
✓ Branch 0 taken 30680 times.
✓ Branch 1 taken 1180 times.
✓ Branch 2 taken 21096 times.
✓ Branch 3 taken 1172 times.
✓ Branch 4 taken 6960 times.
✓ Branch 5 taken 1160 times.
✓ Branch 6 taken 30680 times.
✓ Branch 7 taken 1180 times.
✓ Branch 8 taken 21096 times.
✓ Branch 9 taken 1172 times.
✓ Branch 10 taken 6960 times.
✓ Branch 11 taken 1160 times.
124496 while (offset != end) {
419 // optionally recurse into neighbour voxels
420
12/12
✓ Branch 0 taken 26 times.
✓ Branch 1 taken 30654 times.
✓ Branch 3 taken 18 times.
✓ Branch 4 taken 21078 times.
✓ Branch 6 taken 6 times.
✓ Branch 7 taken 6954 times.
✓ Branch 9 taken 26 times.
✓ Branch 10 taken 30654 times.
✓ Branch 12 taken 18 times.
✓ Branch 13 taken 21078 times.
✓ Branch 15 taken 6 times.
✓ Branch 16 taken 6954 times.
117472 if (recurse > 0) CheckActiveNeighbours(acc, xyz + *offset, recurse-1);
421
6/96
✗ Branch 1 not taken.
✓ Branch 2 taken 30680 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.
✗ Branch 26 not taken.
✓ Branch 27 taken 21096 times.
✗ Branch 29 not taken.
✗ Branch 30 not taken.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
✗ Branch 42 not taken.
✗ Branch 43 not taken.
✗ Branch 46 not taken.
✗ Branch 47 not taken.
✗ Branch 48 not taken.
✗ Branch 49 not taken.
✗ Branch 51 not taken.
✓ Branch 52 taken 6960 times.
✗ Branch 54 not taken.
✗ Branch 55 not taken.
✗ Branch 57 not taken.
✗ Branch 58 not taken.
✗ Branch 60 not taken.
✗ Branch 61 not taken.
✗ Branch 63 not taken.
✗ Branch 64 not taken.
✗ Branch 67 not taken.
✗ Branch 68 not taken.
✗ Branch 71 not taken.
✗ Branch 72 not taken.
✗ Branch 73 not taken.
✗ Branch 74 not taken.
✗ Branch 76 not taken.
✓ Branch 77 taken 30680 times.
✗ Branch 79 not taken.
✗ Branch 80 not taken.
✗ Branch 82 not taken.
✗ Branch 83 not taken.
✗ Branch 85 not taken.
✗ Branch 86 not taken.
✗ Branch 88 not taken.
✗ Branch 89 not taken.
✗ Branch 92 not taken.
✗ Branch 93 not taken.
✗ Branch 96 not taken.
✗ Branch 97 not taken.
✗ Branch 98 not taken.
✗ Branch 99 not taken.
✗ Branch 101 not taken.
✓ Branch 102 taken 21096 times.
✗ Branch 104 not taken.
✗ Branch 105 not taken.
✗ Branch 107 not taken.
✗ Branch 108 not taken.
✗ Branch 110 not taken.
✗ Branch 111 not taken.
✗ Branch 113 not taken.
✗ Branch 114 not taken.
✗ Branch 117 not taken.
✗ Branch 118 not taken.
✗ Branch 121 not taken.
✗ Branch 122 not taken.
✗ Branch 123 not taken.
✗ Branch 124 not taken.
✗ Branch 126 not taken.
✓ Branch 127 taken 6960 times.
✗ Branch 129 not taken.
✗ Branch 130 not taken.
✗ Branch 132 not taken.
✗ Branch 133 not taken.
✗ Branch 135 not taken.
✗ Branch 136 not taken.
✗ Branch 138 not taken.
✗ Branch 139 not taken.
✗ Branch 142 not taken.
✗ Branch 143 not taken.
✗ Branch 146 not taken.
✗ Branch 147 not taken.
✗ Branch 148 not taken.
✗ Branch 149 not taken.
117472 EXPECT_TRUE(acc.isValueOn(xyz + *offset));
422 117472 ++offset;
423 }
424 };
425
426 // This test specifically tests the tile policy with various inputs
427
428 24 TreeT tree;
429
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 6 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.
12 EXPECT_TRUE(tree.empty());
430
431 const openvdb::Index leafDim = TreeT::LeafNodeType::DIM;
432
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(1 << 3, int(leafDim));
433
434 { // Test behaviour with an existing active tile at (0,0,0)
435
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 tree.clear();
436
2/4
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
24 tree.addTile(/*level*/1, Coord(0), ValueType(1.0), true);
437
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(Index32(0), tree.leafCount());
438
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(Index64(leafDim * leafDim * leafDim), tree.activeVoxelCount());
439
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(Index64(1), tree.activeTileCount());
440
441
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
24 TreeT copy(tree);
442 { // A single active tile exists so this has no effect
443
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 openvdb::tools::dilateActiveValues(tree, 1, NN, openvdb::tools::IGNORE_TILES);
444
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 6 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.
12 EXPECT_TRUE(copy.hasSameTopology(tree));
445
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 openvdb::tools::erodeActiveValues(tree, 1, NN, openvdb::tools::IGNORE_TILES);
446
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 6 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.
12 EXPECT_TRUE(copy.hasSameTopology(tree));
447 }
448
449 { // erode with EXPAND_TILES/PRESERVE_TILES - center tile should be expanded and eroded
450
2/4
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
24 TreeT erodeexp(tree), erodepres(tree);
451
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 openvdb::tools::erodeActiveValues(erodeexp, 1, NN, openvdb::tools::EXPAND_TILES);
452
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 Index64 expected = (leafDim-2) * (leafDim-2) * (leafDim-2);
453
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(Index32(1), erodeexp.leafCount());
454
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(expected, erodeexp.activeVoxelCount());
455
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(Index64(0), erodeexp.activeTileCount());
456
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 6 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.
12 EXPECT_TRUE(erodeexp.probeConstLeaf(Coord(0)));
457
458
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 openvdb::tools::erodeActiveValues(erodepres, 1, NN, openvdb::tools::PRESERVE_TILES);
459
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 6 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.
12 EXPECT_TRUE(erodeexp.hasSameTopology(erodepres));
460 }
461
462 { // dilate
463
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 openvdb::tools::dilateActiveValues(tree, 1, NN, openvdb::tools::EXPAND_TILES);
464 Index64 expected = leafDim * leafDim * leafDim;
465
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 if (NN == openvdb::tools::NN_FACE) expected += (leafDim * leafDim) * 6; // faces
466
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 if (NN == openvdb::tools::NN_FACE_EDGE) expected += ((leafDim * leafDim) * 6) + (leafDim) * 12; // edges
467
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 if (NN == openvdb::tools::NN_FACE_EDGE_VERTEX) expected += ((leafDim * leafDim) * 6) + ((leafDim) * 12) + 8; // edges
468
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(Index32(1+offsets), tree.leafCount());
469
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(expected, tree.activeVoxelCount());
470
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(Index64(0), tree.activeTileCount());
471 // Check actual values around center node faces
472
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 6 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.
12 EXPECT_TRUE(tree.probeConstLeaf(Coord(0)));
473
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 6 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.
12 EXPECT_TRUE(tree.probeConstLeaf(Coord(0))->isDense());
474
2/2
✓ Branch 0 taken 48 times.
✓ Branch 1 taken 6 times.
108 for (int i = 0; i < int(leafDim); ++i) {
475
2/2
✓ Branch 0 taken 384 times.
✓ Branch 1 taken 48 times.
864 for (int j = 0; j < int(leafDim); ++j) {
476
2/4
✓ Branch 1 taken 384 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 384 times.
✗ Branch 5 not taken.
768 CheckActiveNeighbours(tree, {i,j,0}, 0);
477
2/4
✓ Branch 1 taken 384 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 384 times.
✗ Branch 5 not taken.
768 CheckActiveNeighbours(tree, {i,0,j}, 0);
478
2/4
✓ Branch 1 taken 384 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 384 times.
✗ Branch 5 not taken.
768 CheckActiveNeighbours(tree, {0,i,j}, 0);
479
2/4
✓ Branch 1 taken 384 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 384 times.
✗ Branch 5 not taken.
768 CheckActiveNeighbours(tree, {i,j,leafDim-1}, 0);
480
2/4
✓ Branch 1 taken 384 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 384 times.
✗ Branch 5 not taken.
768 CheckActiveNeighbours(tree, {i,leafDim-1,j}, 0);
481
1/2
✓ Branch 1 taken 384 times.
✗ Branch 2 not taken.
768 CheckActiveNeighbours(tree, {leafDim-1,i,j}, 0);
482 }
483 }
484
485 // Voxelize the original copy and run with IGNORE_TILES - should produce the same result
486 copy.voxelizeActiveTiles();
487
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 openvdb::tools::dilateActiveValues(copy, 1, NN, openvdb::tools::IGNORE_TILES);
488
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 6 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.
12 EXPECT_TRUE(copy.hasSameTopology(tree));
489 }
490
491 { // erode the dilated result
492
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
24 TreeT erode(tree);
493
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 openvdb::tools::erodeActiveValues(erode, 1, NN, openvdb::tools::IGNORE_TILES);
494
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 Index64 expected = leafDim * leafDim * leafDim;
495
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(Index32(1+offsets), erode.leafCount());
496
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(expected, erode.activeVoxelCount());
497
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(Index64(0), erode.activeTileCount());
498
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 6 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.
12 EXPECT_TRUE(erode.probeConstLeaf(Coord(0)));
499
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 6 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.
12 EXPECT_TRUE(erode.probeConstLeaf(Coord(0))->isDense());
500 }
501
502 // clear
503
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 tree.clear();
504
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 copy.clear();
505
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 tree.addTile(/*level*/1, Coord(0), ValueType(1.0), true);
506
2/4
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
24 copy.addTile(/*level*/1, Coord(0), ValueType(1.0), true);
507 copy.voxelizeActiveTiles();
508
509 { // dilate both with PRESERVE_TILES
510
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 openvdb::tools::dilateActiveValues(tree, 1, NN, openvdb::tools::PRESERVE_TILES);
511
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 openvdb::tools::dilateActiveValues(copy, 1, NN, openvdb::tools::PRESERVE_TILES);
512 Index64 expected = leafDim * leafDim * leafDim;
513
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 if (NN == openvdb::tools::NN_FACE) expected += (leafDim * leafDim) * 6; // faces
514
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 if (NN == openvdb::tools::NN_FACE_EDGE) expected += ((leafDim * leafDim) * 6) + (leafDim) * 12; // edges
515
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 if (NN == openvdb::tools::NN_FACE_EDGE_VERTEX) expected += ((leafDim * leafDim) * 6) + ((leafDim) * 12) + 8; // edges
516
517
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(Index32(offsets), tree.leafCount());
518
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(expected, tree.activeVoxelCount());
519
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(Index64(1), tree.activeTileCount());
520
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 6 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.
12 EXPECT_TRUE(copy.hasSameTopology(tree));
521
522 // Check actual values around center node faces
523
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 6 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.
12 EXPECT_TRUE(!tree.probeConstLeaf(Coord(0)));
524
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 6 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.
12 EXPECT_TRUE(tree.isValueOn(Coord(0)));
525
2/2
✓ Branch 0 taken 48 times.
✓ Branch 1 taken 6 times.
108 for (int i = 0; i < int(leafDim); ++i) {
526
2/2
✓ Branch 0 taken 384 times.
✓ Branch 1 taken 48 times.
864 for (int j = 0; j < int(leafDim); ++j) {
527
2/4
✓ Branch 1 taken 384 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 384 times.
✗ Branch 5 not taken.
768 CheckActiveNeighbours(tree, {i,j,0}, 0);
528
2/4
✓ Branch 1 taken 384 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 384 times.
✗ Branch 5 not taken.
768 CheckActiveNeighbours(tree, {i,0,j}, 0);
529
2/4
✓ Branch 1 taken 384 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 384 times.
✗ Branch 5 not taken.
768 CheckActiveNeighbours(tree, {0,i,j}, 0);
530
2/4
✓ Branch 1 taken 384 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 384 times.
✗ Branch 5 not taken.
768 CheckActiveNeighbours(tree, {i,j,leafDim-1}, 0);
531
2/4
✓ Branch 1 taken 384 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 384 times.
✗ Branch 5 not taken.
768 CheckActiveNeighbours(tree, {i,leafDim-1,j}, 0);
532
1/2
✓ Branch 1 taken 384 times.
✗ Branch 2 not taken.
768 CheckActiveNeighbours(tree, {leafDim-1,i,j}, 0);
533 }
534 }
535 }
536
537 { // final erode with PRESERVE_TILES
538
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
24 TreeT erode(tree); // 10x10x10 filled tree, erode back down to a tile
539
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 openvdb::tools::erodeActiveValues(erode, 1, NN, openvdb::tools::PRESERVE_TILES);
540 // PRESERVE_TILES will prune the result
541
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 Index64 expected = leafDim * leafDim * leafDim;
542
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(Index32(0), erode.leafCount());
543
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(expected, erode.activeVoxelCount());
544
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(Index64(1), erode.activeTileCount());
545
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 6 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.
12 EXPECT_TRUE(!erode.probeConstLeaf(Coord(0)));
546
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 6 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.
12 EXPECT_TRUE(erode.isValueOn(Coord(0)));
547 }
548 }
549 { // Test tile preservation with voxel topology - create an active, leaf node-sized tile and a single edge voxel
550
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 tree.clear();
551
2/4
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
24 tree.addTile(/*level*/1, Coord(0), ValueType(1.0), true);
552
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(Index32(0), tree.leafCount());
553
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(Index64(leafDim * leafDim * leafDim), tree.activeVoxelCount());
554
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(Index64(1), tree.activeTileCount());
555
556 const Coord xyz(leafDim, leafDim >> 1, leafDim >> 1);
557
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 tree.setValue(xyz, 1.0);
558
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 Index64 expected = leafDim * leafDim * leafDim + 1;
559
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(expected, tree.activeVoxelCount());
560
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(Index64(1), tree.activeTileCount());
561
562 { // Test tile is preserve with IGNORE_TILES but only the corner gets dilated
563
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 openvdb::tools::dilateActiveValues(tree, 1, NN, openvdb::tools::IGNORE_TILES);
564
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 CheckActiveNeighbours(tree, xyz, 0);
565
566
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 if (NN == openvdb::tools::NN_FACE) expected += offsets - 1; // 1 overlapping with tile
567
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 if (NN == openvdb::tools::NN_FACE_EDGE) expected += offsets - 5; // 5 overlapping
568
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
4 if (NN == openvdb::tools::NN_FACE_EDGE_VERTEX) expected += offsets - 9; // 9 overlapping
569
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(expected, tree.activeVoxelCount());
570
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(Index64(1), tree.activeTileCount());
571
572 // Test all topology is dilated but tile is preserved
573
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 openvdb::tools::dilateActiveValues(tree, 1, NN, openvdb::tools::PRESERVE_TILES);
574
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 CheckActiveNeighbours(tree, xyz, /*recurse*/1);
575
576 // Check actual values around center node faces
577
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(Index64(1), tree.activeTileCount());
578
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(Index32(offsets), tree.leafCount());
579
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 6 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.
12 EXPECT_TRUE(!tree.probeConstLeaf(Coord(0)));
580
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 6 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.
12 EXPECT_TRUE(tree.isValueOn(Coord(0)));
581
2/2
✓ Branch 0 taken 48 times.
✓ Branch 1 taken 6 times.
108 for (int i = 0; i < int(leafDim); ++i) {
582
2/2
✓ Branch 0 taken 384 times.
✓ Branch 1 taken 48 times.
864 for (int j = 0; j < int(leafDim); ++j) {
583
2/4
✓ Branch 1 taken 384 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 384 times.
✗ Branch 5 not taken.
768 CheckActiveNeighbours(tree, {i,j,0}, 0);
584
2/4
✓ Branch 1 taken 384 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 384 times.
✗ Branch 5 not taken.
768 CheckActiveNeighbours(tree, {i,0,j}, 0);
585
2/4
✓ Branch 1 taken 384 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 384 times.
✗ Branch 5 not taken.
768 CheckActiveNeighbours(tree, {0,i,j}, 0);
586
2/4
✓ Branch 1 taken 384 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 384 times.
✗ Branch 5 not taken.
768 CheckActiveNeighbours(tree, {i,j,leafDim-1}, 0);
587
2/4
✓ Branch 1 taken 384 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 384 times.
✗ Branch 5 not taken.
768 CheckActiveNeighbours(tree, {i,leafDim-1,j}, 0);
588
1/2
✓ Branch 1 taken 384 times.
✗ Branch 2 not taken.
768 CheckActiveNeighbours(tree, {leafDim-1,i,j}, 0);
589 }
590 }
591 }
592 { // Test tile is preserved with erosions IGNORE_TILES, irrespective of iterations
593
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 openvdb::tools::erodeActiveValues(tree, 10, NN, openvdb::tools::IGNORE_TILES);
594
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(Index64(1), tree.activeTileCount());
595
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(Index32(offsets), tree.leafCount());
596
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(Index64(leafDim * leafDim * leafDim), tree.activeVoxelCount());
597
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 6 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.
12 EXPECT_TRUE(!tree.probeConstLeaf(Coord(0)));
598
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 6 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.
12 EXPECT_TRUE(tree.isValueOn(Coord(0)));
599 }
600 }
601 { // Test constant leaf nodes are pruned with PRESERVE_TILES
602 constexpr bool IsMask = std::is_same<ValueType, bool>::value;
603
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 tree.clear();
604 // For mask trees, the bg value is the active state, so make sure its 0.
605 // the second partial leaf should still become dense
606 12 const ValueType bg = IsMask ? 0.0 : 1.0;
607
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
12 tree.root().setBackground(bg, /*update-child*/false);
608 // partial leaf node which will become dense, but not constant
609
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 tree.fill(CoordBBox(Coord(0,0,1), Coord(leafDim-1)), ValueType(2.0));
610 // partial leaf node which will become dense and constant
611
2/4
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
24 tree.fill(CoordBBox(Coord(leafDim*3,0,1), Coord(leafDim*3 + leafDim - 1, leafDim-1, leafDim-1)), ValueType(1.0));
612 // dense leaf node
613 12 tree.touchLeaf(Coord(leafDim*6, 0, 0))->setValuesOn();
614
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 Index64 expected = (leafDim * leafDim * leafDim) +
615 ((leafDim * leafDim * leafDim) - (leafDim * leafDim)) * 2;
616
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(Index32(3), tree.leafCount());
617
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(expected, tree.activeVoxelCount());
618
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(Index64(0), tree.activeTileCount());
619
620 // Dilate and preserve - first leaf node becomes dense
621 // (regardless of NN) but not pruned, second dense and pruned,
622 // third, already being constant, is also pruned
623
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 openvdb::tools::dilateActiveValues(tree, 1,
624 NN, openvdb::tools::PRESERVE_TILES);
625
626 // For mask grids, both partial leaf nodes that become dense should be pruned
627
2/16
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 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.
6 if (IsMask) EXPECT_EQ(Index64(3), tree.activeTileCount());
628
2/16
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 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.
6 else EXPECT_EQ(Index64(2), tree.activeTileCount());
629
630
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 if (NN == openvdb::tools::NN_FACE) expected = offsets*3 -2;
631
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 if (NN == openvdb::tools::NN_FACE_EDGE) expected = offsets*3 -10;
632
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 if (NN == openvdb::tools::NN_FACE_EDGE_VERTEX) expected = offsets*3 -18;
633
1/2
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
6 if (!IsMask) expected += 1;
634
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(Index32(expected), tree.leafCount());
635 // first
636 if (IsMask) {
637 // should have been pruned
638
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 3 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.
6 EXPECT_TRUE(!tree.probeConstLeaf(Coord(0)));
639
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 3 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.
6 EXPECT_TRUE(tree.isValueOn(Coord(0)));
640 }
641 else {
642
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 3 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.
6 EXPECT_TRUE(tree.probeConstLeaf(Coord(0)));
643
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 3 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.
6 EXPECT_TRUE(tree.probeConstLeaf(Coord(0))->isDense());
644 }
645 //second
646
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 6 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.
12 EXPECT_TRUE(!tree.probeConstLeaf(Coord(leafDim*3, 0, 0)));
647
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 6 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.
12 EXPECT_TRUE(tree.isValueOn(Coord(leafDim*3, 0, 0)));
648 // third
649
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 6 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.
12 EXPECT_TRUE(!tree.probeConstLeaf(Coord(leafDim*6, 0, 0)));
650
1/16
✗ Branch 0 not taken.
✓ Branch 1 taken 6 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.
12 EXPECT_TRUE(tree.isValueOn(Coord(leafDim*6, 0, 0)));
651
652 // test erosion PRESERVE_TILES correctly erodes and prunes the result
653
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 openvdb::tools::erodeActiveValues(tree, 1, NN,
654 openvdb::tools::PRESERVE_TILES);
655
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 expected = (leafDim * leafDim * leafDim) +
656 ((leafDim * leafDim * leafDim) - (leafDim * leafDim)) * 2;
657
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(Index32(2), tree.leafCount());
658
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(expected, tree.activeVoxelCount());
659
2/16
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 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.
12 EXPECT_EQ(Index64(1), tree.activeTileCount());
660 }
661 12 }
662
663
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 TEST_F(TestMorphology, testPreserveMaskLeafNodes)
664 {
665 // test that mask leaf pointers are preserved
666 2 openvdb::MaskTree mask;
667 static const openvdb::Int32 count = 160;
668
669 std::vector<openvdb::MaskTree::LeafNodeType*> nodes;
670
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 nodes.reserve(count);
671
672
2/2
✓ Branch 0 taken 160 times.
✓ Branch 1 taken 1 times.
161 for (openvdb::Int32 i = 0; i < count; ++i) {
673
1/4
✓ Branch 1 taken 160 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
160 nodes.emplace_back(mask.touchLeaf({i,i,i}));
674 160 nodes.back()->setValuesOn(); // activate all
675 }
676
677
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 openvdb::tools::morphology::Morphology<openvdb::MaskTree> morph(mask);
678 morph.setThreaded(true); // only a problem during mt
679
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 morph.dilateVoxels(/*iter*/3, openvdb::tools::NN_FACE,
680 /*prune*/false, /*preserve*/true);
681
682
2/2
✓ Branch 0 taken 160 times.
✓ Branch 1 taken 1 times.
161 for (openvdb::Int32 i = 0; i < count; ++i) {
683
2/16
✓ Branch 2 taken 160 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 160 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.
160 EXPECT_EQ(mask.probeConstLeaf({i,i,i}), nodes[i]);
684 }
685 1 }
686
687
688
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 TEST_F(TestMorphology, testDeprecated)
689 {
690 // just test these can be instantiated
691
692 OPENVDB_NO_DEPRECATION_WARNING_BEGIN
693 2 openvdb::FloatTree tree;
694
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 openvdb::tree::LeafManager<openvdb::FloatTree> lm(tree);
695
696
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 openvdb::tools::dilateVoxels(tree, 1);
697 lm.rebuild();
698
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 openvdb::tools::dilateVoxels(lm, 1);
699
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 openvdb::tools::erodeVoxels(tree, 1);
700
701 lm.rebuild();
702
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 openvdb::tools::erodeVoxels(lm, 1);
703 OPENVDB_NO_DEPRECATION_WARNING_END
704 1 }
705