Line | Branch | Exec | Source |
---|---|---|---|
1 | // Copyright Contributors to the OpenVDB Project | ||
2 | // SPDX-License-Identifier: MPL-2.0 | ||
3 | |||
4 | #include <openvdb/Exceptions.h> | ||
5 | #include <openvdb/Types.h> | ||
6 | #include <openvdb/tree/NodeManager.h> | ||
7 | #include <openvdb/tree/LeafManager.h> | ||
8 | #include "util.h" // for unittest_util::makeSphere() | ||
9 | #include <gtest/gtest.h> | ||
10 | |||
11 | |||
12 | 3 | class TestNodeManager: public ::testing::Test | |
13 | { | ||
14 | public: | ||
15 | 3 | void SetUp() override { openvdb::initialize(); } | |
16 | 3 | void TearDown() override { openvdb::uninitialize(); } | |
17 | }; | ||
18 | |||
19 | |||
20 | namespace { | ||
21 | |||
22 | template<typename TreeT> | ||
23 |
2/4✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
4 | struct NodeCountOp { |
24 |
5/10✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
|
3 | NodeCountOp() : nodeCount(TreeT::DEPTH, 0), totalCount(0) |
25 | { | ||
26 | } | ||
27 | 2 | NodeCountOp(const NodeCountOp&, tbb::split) | |
28 |
1/4✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
2 | : nodeCount(TreeT::DEPTH, 0), totalCount(0) |
29 | { | ||
30 | } | ||
31 | void join(const NodeCountOp& other) | ||
32 | { | ||
33 |
2/16✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 8 times.
✓ Branch 15 taken 2 times.
|
10 | for (size_t i = 0; i < nodeCount.size(); ++i) { |
34 | 8 | nodeCount[i] += other.nodeCount[i]; | |
35 | } | ||
36 | 2 | totalCount += other.totalCount; | |
37 | } | ||
38 | // do nothing for the root node | ||
39 | bool operator()(const typename TreeT::RootNodeType&, size_t = 0) | ||
40 | { | ||
41 | return true; | ||
42 | } | ||
43 | // count the internal and leaf nodes | ||
44 | template<typename NodeT> | ||
45 | bool operator()(const NodeT&, size_t = 0) | ||
46 | { | ||
47 | 828 | ++(nodeCount[NodeT::LEVEL]); | |
48 | 828 | ++totalCount; | |
49 | return true; | ||
50 | } | ||
51 | std::vector<openvdb::Index64> nodeCount; | ||
52 | openvdb::Index64 totalCount; | ||
53 | };// NodeCountOp | ||
54 | |||
55 | }//unnamed namespace | ||
56 | |||
57 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | TEST_F(TestNodeManager, testAll) |
58 | { | ||
59 | using openvdb::CoordBBox; | ||
60 | using openvdb::Coord; | ||
61 | using openvdb::Vec3f; | ||
62 | using openvdb::Index64; | ||
63 | using openvdb::FloatGrid; | ||
64 | using openvdb::FloatTree; | ||
65 | |||
66 | const Vec3f center(0.35f, 0.35f, 0.35f); | ||
67 | const float radius = 0.15f; | ||
68 | const int dim = 128, half_width = 5; | ||
69 | const float voxel_size = 1.0f/dim; | ||
70 | |||
71 |
1/2✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
|
1 | FloatGrid::Ptr grid = FloatGrid::create(/*background=*/half_width*voxel_size); |
72 | FloatTree& tree = grid->tree(); | ||
73 |
3/6✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
|
2 | grid->setTransform(openvdb::math::Transform::createLinearTransform(/*voxel size=*/voxel_size)); |
74 | |||
75 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | unittest_util::makeSphere<FloatGrid>(Coord(dim), center, |
76 | radius, *grid, unittest_util::SPHERE_SPARSE_NARROW_BAND); | ||
77 | |||
78 |
2/16✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
|
1 | EXPECT_EQ(4, int(FloatTree::DEPTH)); |
79 |
2/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_EQ(3, int(openvdb::tree::NodeManager<FloatTree>::LEVELS)); |
80 | |||
81 | std::vector<Index64> nodeCount; | ||
82 |
3/6✓ Branch 0 taken 4 times.
✓ Branch 1 taken 1 times.
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
|
5 | for (openvdb::Index i=0; i<FloatTree::DEPTH; ++i) nodeCount.push_back(0); |
83 |
3/4✓ Branch 0 taken 208 times.
✓ Branch 1 taken 1 times.
✓ Branch 3 taken 208 times.
✗ Branch 4 not taken.
|
209 | for (FloatTree::NodeCIter it = tree.cbeginNode(); it; ++it) ++(nodeCount[it.getLevel()]); |
84 | |||
85 | //for (size_t i=0; i<nodeCount.size(); ++i) {//includes the root node | ||
86 | // std::cerr << "Level=" << i << " nodes=" << nodeCount[i] << std::endl; | ||
87 | //} | ||
88 | |||
89 | {// test tree constructor | ||
90 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | openvdb::tree::NodeManager<FloatTree> manager(tree); |
91 | |||
92 | //for (openvdb::Index i=0; i<openvdb::tree::NodeManager<FloatTree>::LEVELS; ++i) { | ||
93 | // std::cerr << "Level=" << i << " nodes=" << manager.nodeCount(i) << std::endl; | ||
94 | //} | ||
95 | |||
96 | 1 | Index64 totalCount = 0; | |
97 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 1 times.
|
4 | for (openvdb::Index i=0; i<FloatTree::RootNodeType::LEVEL; ++i) {//exclude root in nodeCount |
98 | //std::cerr << "Level=" << i << " expected=" << nodeCount[i] | ||
99 | // << " cached=" << manager.nodeCount(i) << std::endl; | ||
100 |
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.
|
3 | EXPECT_EQ(nodeCount[i], manager.nodeCount(i)); |
101 | 3 | totalCount += nodeCount[i]; | |
102 | } | ||
103 |
2/16✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
|
1 | EXPECT_EQ(totalCount, manager.nodeCount()); |
104 | |||
105 | // test the map reduce functionality | ||
106 | NodeCountOp<FloatTree> bottomUpOp; | ||
107 | NodeCountOp<FloatTree> topDownOp; | ||
108 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | manager.reduceBottomUp(bottomUpOp); |
109 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | manager.reduceTopDown(topDownOp); |
110 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 1 times.
|
4 | for (openvdb::Index i=0; i<FloatTree::RootNodeType::LEVEL; ++i) {//exclude root in nodeCount |
111 |
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.
|
3 | EXPECT_EQ(bottomUpOp.nodeCount[i], manager.nodeCount(i)); |
112 |
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.
|
3 | EXPECT_EQ(topDownOp.nodeCount[i], manager.nodeCount(i)); |
113 | } | ||
114 |
2/16✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
|
1 | EXPECT_EQ(bottomUpOp.totalCount, manager.nodeCount()); |
115 |
2/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_EQ(topDownOp.totalCount, manager.nodeCount()); |
116 | } | ||
117 | |||
118 | {// test LeafManager constructor | ||
119 | typedef openvdb::tree::LeafManager<FloatTree> LeafManagerT; | ||
120 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | LeafManagerT manager1(tree); |
121 |
2/16✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
|
1 | EXPECT_EQ(nodeCount[0], Index64(manager1.leafCount())); |
122 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | openvdb::tree::NodeManager<LeafManagerT> manager2(manager1); |
123 | 1 | Index64 totalCount = 0; | |
124 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 1 times.
|
4 | for (openvdb::Index i=0; i<FloatTree::RootNodeType::LEVEL; ++i) {//exclude root in nodeCount |
125 | //std::cerr << "Level=" << i << " expected=" << nodeCount[i] | ||
126 | // << " cached=" << manager2.nodeCount(i) << std::endl; | ||
127 |
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.
|
3 | EXPECT_EQ(nodeCount[i], Index64(manager2.nodeCount(i))); |
128 | 3 | totalCount += nodeCount[i]; | |
129 | } | ||
130 |
2/16✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
|
1 | EXPECT_EQ(totalCount, Index64(manager2.nodeCount())); |
131 | |||
132 | // test the map reduce functionality | ||
133 | NodeCountOp<FloatTree> bottomUpOp; | ||
134 | NodeCountOp<FloatTree> topDownOp; | ||
135 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | manager2.reduceBottomUp(bottomUpOp); |
136 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | manager2.reduceTopDown(topDownOp); |
137 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 1 times.
|
4 | for (openvdb::Index i=0; i<FloatTree::RootNodeType::LEVEL; ++i) {//exclude root in nodeCount |
138 |
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.
|
3 | EXPECT_EQ(bottomUpOp.nodeCount[i], manager2.nodeCount(i)); |
139 |
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.
|
3 | EXPECT_EQ(topDownOp.nodeCount[i], manager2.nodeCount(i)); |
140 | } | ||
141 |
2/16✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
|
1 | EXPECT_EQ(bottomUpOp.totalCount, manager2.nodeCount()); |
142 |
2/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_EQ(topDownOp.totalCount, manager2.nodeCount()); |
143 | } | ||
144 | |||
145 | 1 | } | |
146 | |||
147 | |||
148 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | TEST_F(TestNodeManager, testConst) |
149 | { | ||
150 | using namespace openvdb; | ||
151 | |||
152 | const Vec3f center(0.35f, 0.35f, 0.35f); | ||
153 | const int dim = 128, half_width = 5; | ||
154 | const float voxel_size = 1.0f/dim; | ||
155 | |||
156 |
1/2✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
|
1 | FloatGrid::Ptr grid = FloatGrid::create(/*background=*/half_width*voxel_size); |
157 | const FloatTree& tree = grid->constTree(); | ||
158 | |||
159 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | tree::NodeManager<const FloatTree> nodeManager(tree); |
160 | |||
161 | NodeCountOp<const FloatTree> topDownOp; | ||
162 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | nodeManager.reduceTopDown(topDownOp); |
163 | |||
164 | std::vector<Index64> nodeCount; | ||
165 |
3/4✓ Branch 0 taken 4 times.
✓ Branch 1 taken 1 times.
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
|
5 | for (openvdb::Index i=0; i<FloatTree::DEPTH; ++i) nodeCount.push_back(0); |
166 |
3/4✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
|
2 | for (FloatTree::NodeCIter it = tree.cbeginNode(); it; ++it) ++(nodeCount[it.getLevel()]); |
167 | |||
168 | 1 | Index64 totalCount = 0; | |
169 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 1 times.
|
4 | for (openvdb::Index i=0; i<FloatTree::RootNodeType::LEVEL; ++i) {//exclude root in nodeCount |
170 |
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.
|
3 | EXPECT_EQ(nodeCount[i], nodeManager.nodeCount(i)); |
171 | 3 | totalCount += nodeCount[i]; | |
172 | } | ||
173 |
2/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_EQ(totalCount, nodeManager.nodeCount()); |
174 |
1/14✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
|
1 | EXPECT_EQ(totalCount, topDownOp.totalCount); |
175 | |||
176 | // test DynamicNodeManager also works with a const tree | ||
177 | |||
178 | 1 | tree::DynamicNodeManager<const FloatTree> dynamicNodeManager(tree); | |
179 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | dynamicNodeManager.reduceTopDown(topDownOp); |
180 |
1/14✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
|
1 | EXPECT_EQ(totalCount, topDownOp.totalCount); |
181 | 1 | } | |
182 | |||
183 | |||
184 | namespace { | ||
185 | |||
186 | template<typename TreeT> | ||
187 | struct ExpandOp | ||
188 | { | ||
189 | using RootT = typename TreeT::RootNodeType; | ||
190 | using LeafT = typename TreeT::LeafNodeType; | ||
191 | |||
192 | 2 | explicit ExpandOp(bool zeroOnly = false) : mZeroOnly(zeroOnly) { } | |
193 | |||
194 | // do nothing for the root node | ||
195 | bool operator()(RootT&, size_t = 1) const { return true; } | ||
196 | |||
197 | // count the internal and leaf nodes | ||
198 | template<typename NodeT> | ||
199 | 38 | bool operator()(NodeT& node, size_t idx = 1) const | |
200 | { | ||
201 |
2/2✓ Branch 0 taken 163840 times.
✓ Branch 1 taken 19 times.
|
327718 | for (auto iter = node.cbeginValueAll(); iter; ++iter) { |
202 | 327680 | const openvdb::Coord ijk = iter.getCoord(); | |
203 |
6/6✓ Branch 0 taken 71680 times.
✓ Branch 1 taken 92160 times.
✓ Branch 2 taken 65920 times.
✓ Branch 3 taken 5760 times.
✓ Branch 4 taken 65560 times.
✓ Branch 5 taken 360 times.
|
327680 | if (ijk.x() < 256 && ijk.y() < 256 && ijk.z() < 256) { |
204 |
2/4✓ Branch 2 taken 65536 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 65536 times.
✗ Branch 6 not taken.
|
131120 | node.addChild(new typename NodeT::ChildNodeType(iter.getCoord(), NodeT::LEVEL, true)); |
205 | } | ||
206 | } | ||
207 | |||
208 |
2/2✓ Branch 0 taken 9 times.
✓ Branch 1 taken 10 times.
|
38 | if (mZeroOnly) return idx == 0; |
209 | return true; | ||
210 | } | ||
211 | |||
212 | 36864 | bool operator()(LeafT& leaf, size_t /*idx*/ = 1) const | |
213 | { | ||
214 |
2/2✓ Branch 1 taken 18874368 times.
✓ Branch 2 taken 36864 times.
|
18948096 | for (auto iter = leaf.beginValueAll(); iter; ++iter) { |
215 | 18874368 | iter.setValue(iter.pos()); | |
216 | } | ||
217 | |||
218 | 36864 | return true; | |
219 | } | ||
220 | |||
221 | bool mZeroOnly = false; | ||
222 | };// ExpandOp | ||
223 | |||
224 | template<typename TreeT> | ||
225 | struct RootOnlyOp | ||
226 | { | ||
227 | using RootT = typename TreeT::RootNodeType; | ||
228 | |||
229 | RootOnlyOp() = default; | ||
230 | RootOnlyOp(const RootOnlyOp&, tbb::split) { } | ||
231 | void join(const RootOnlyOp&) { } | ||
232 | |||
233 | // do nothing for the root node but return false | ||
234 | bool operator()(RootT&, size_t) const { return false; } | ||
235 | |||
236 | // throw on internal or leaf nodes | ||
237 | template<typename NodeOrLeafT> | ||
238 | bool operator()(NodeOrLeafT&, size_t) const | ||
239 | { | ||
240 | OPENVDB_THROW(openvdb::RuntimeError, "Should not process nodes below root."); | ||
241 | } | ||
242 | };// RootOnlyOp | ||
243 | |||
244 | template<typename TreeT> | ||
245 | struct SumOp { | ||
246 | using RootT = typename TreeT::RootNodeType; | ||
247 | using LeafT = typename TreeT::LeafNodeType; | ||
248 | |||
249 | 4 | explicit SumOp(bool zeroOnly = false) : mZeroOnly(zeroOnly) { } | |
250 | 13 | SumOp(const SumOp& other, tbb::split): totalCount(0), mZeroOnly(other.mZeroOnly) { } | |
251 | void join(const SumOp& other) | ||
252 | { | ||
253 | 13 | totalCount += other.totalCount; | |
254 | } | ||
255 | // do nothing for the root node | ||
256 | bool operator()(const typename TreeT::RootNodeType&, size_t /*idx*/ = 0) { return true; } | ||
257 | // count the internal nodes | ||
258 | template<typename NodeT> | ||
259 | 56 | bool operator()(const NodeT& node, size_t idx = 0) | |
260 | { | ||
261 |
2/2✓ Branch 0 taken 131040 times.
✓ Branch 1 taken 28 times.
|
262136 | for (auto iter = node.cbeginValueAll(); iter; ++iter) { |
262 | 262080 | totalCount += *iter; | |
263 | } | ||
264 |
2/2✓ Branch 0 taken 9 times.
✓ Branch 1 taken 19 times.
|
56 | if (mZeroOnly) return idx == 0; |
265 | return true; | ||
266 | } | ||
267 | // count the leaf nodes | ||
268 | 69632 | bool operator()(const LeafT& leaf, size_t /*idx*/ = 0) | |
269 | { | ||
270 |
2/2✓ Branch 1 taken 35651584 times.
✓ Branch 2 taken 69632 times.
|
35790848 | for (auto iter = leaf.cbeginValueAll(); iter; ++iter) { |
271 | 35651584 | totalCount += *iter; | |
272 | } | ||
273 | 69632 | return true; | |
274 | } | ||
275 | openvdb::Index64 totalCount = openvdb::Index64(0); | ||
276 | bool mZeroOnly = false; | ||
277 | };// SumOp | ||
278 | |||
279 | }//unnamed namespace | ||
280 | |||
281 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | TEST_F(TestNodeManager, testDynamic) |
282 | { | ||
283 | using openvdb::Coord; | ||
284 | using openvdb::Index32; | ||
285 | using openvdb::Index64; | ||
286 | using openvdb::Int32Tree; | ||
287 | |||
288 | using RootNodeType = Int32Tree::RootNodeType; | ||
289 | using Internal1NodeType = RootNodeType::ChildNodeType; | ||
290 | |||
291 | 2 | Int32Tree sourceTree(0); | |
292 | |||
293 | auto child = | ||
294 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
2 | std::make_unique<Internal1NodeType>(Coord(0, 0, 0), /*value=*/1.0f); |
295 | |||
296 |
2/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
|
1 | EXPECT_TRUE(sourceTree.root().addChild(child.release())); |
297 |
2/16✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
|
1 | EXPECT_EQ(Index32(0), sourceTree.leafCount()); |
298 |
2/16✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
|
1 | EXPECT_EQ(Index32(2), sourceTree.nonLeafCount()); |
299 | |||
300 | ExpandOp<Int32Tree> expandOp; | ||
301 | |||
302 | { // use NodeManager::foreachTopDown | ||
303 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | Int32Tree tree(sourceTree); |
304 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | openvdb::tree::NodeManager<Int32Tree> manager(tree); |
305 |
2/16✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
|
1 | EXPECT_EQ(Index64(1), manager.nodeCount()); |
306 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | manager.foreachTopDown(expandOp); |
307 |
2/16✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
|
1 | EXPECT_EQ(Index32(0), tree.leafCount()); |
308 | |||
309 | // first level has been expanded, but node manager cache does not include the new nodes | ||
310 | SumOp<Int32Tree> sumOp; | ||
311 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | manager.reduceBottomUp(sumOp); |
312 |
3/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 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.
|
1 | EXPECT_EQ(Index64(32760), sumOp.totalCount); |
313 | } | ||
314 | |||
315 | { // use DynamicNodeManager::foreachTopDown and filter out nodes below root | ||
316 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | Int32Tree tree(sourceTree); |
317 | 1 | openvdb::tree::DynamicNodeManager<Int32Tree> manager(tree); | |
318 | RootOnlyOp<Int32Tree> rootOnlyOp; | ||
319 |
3/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ 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 22 not taken.
✗ Branch 23 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
|
1 | EXPECT_NO_THROW(manager.foreachTopDown(rootOnlyOp)); |
320 |
3/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ 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 22 not taken.
✗ Branch 23 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
|
1 | EXPECT_NO_THROW(manager.reduceTopDown(rootOnlyOp)); |
321 | } | ||
322 | |||
323 | { // use DynamicNodeManager::foreachTopDown | ||
324 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | Int32Tree tree(sourceTree); |
325 | 1 | openvdb::tree::DynamicNodeManager<Int32Tree> manager(tree); | |
326 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | manager.foreachTopDown(expandOp, /*threaded=*/true, /*leafGrainSize=*/32, /*nonLeafGrainSize=*/8); |
327 |
2/16✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
|
1 | EXPECT_EQ(Index32(32768), tree.leafCount()); |
328 | |||
329 | SumOp<Int32Tree> sumOp; | ||
330 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | manager.reduceTopDown(sumOp); |
331 |
2/16✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
|
1 | EXPECT_EQ(Index64(4286611448), sumOp.totalCount); |
332 | |||
333 | SumOp<Int32Tree> zeroSumOp(true); | ||
334 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | manager.reduceTopDown(zeroSumOp); |
335 |
2/16✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
|
1 | EXPECT_EQ(Index64(535855096), zeroSumOp.totalCount); |
336 | } | ||
337 | |||
338 | { // use DynamicNodeManager::foreachTopDown but filter nodes with non-zero index | ||
339 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | Int32Tree tree(sourceTree); |
340 | 1 | openvdb::tree::DynamicNodeManager<Int32Tree> manager(tree); | |
341 | ExpandOp<Int32Tree> zeroExpandOp(true); | ||
342 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | manager.foreachTopDown(zeroExpandOp); |
343 |
2/16✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
|
1 | EXPECT_EQ(Index32(32768), tree.leafCount()); |
344 | |||
345 | SumOp<Int32Tree> sumOp; | ||
346 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | manager.reduceTopDown(sumOp); |
347 |
2/16✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
|
1 | EXPECT_EQ(Index64(550535160), sumOp.totalCount); |
348 | } | ||
349 | 1 | } | |
350 |