Line | Branch | Exec | Source |
---|---|---|---|
1 | // Copyright Contributors to the OpenVDB Project | ||
2 | // SPDX-License-Identifier: MPL-2.0 | ||
3 | // | ||
4 | /// @file TestFastSweeping.cc | ||
5 | /// | ||
6 | /// @author Ken Museth | ||
7 | |||
8 | //#define BENCHMARK_FAST_SWEEPING | ||
9 | //#define TIMING_FAST_SWEEPING | ||
10 | |||
11 | #include <openvdb/Types.h> | ||
12 | #include <openvdb/openvdb.h> | ||
13 | #include <openvdb/tools/ChangeBackground.h> | ||
14 | #include <openvdb/tools/Diagnostics.h> | ||
15 | #include <openvdb/tools/FastSweeping.h> | ||
16 | #include <openvdb/tools/LevelSetSphere.h> | ||
17 | #include <openvdb/tools/LevelSetTracker.h> | ||
18 | #include <openvdb/tools/LevelSetRebuild.h> | ||
19 | #include <openvdb/tools/LevelSetPlatonic.h> | ||
20 | #include <openvdb/tools/LevelSetUtil.h> | ||
21 | #ifdef TIMING_FAST_SWEEPING | ||
22 | #include <openvdb/util/CpuTimer.h> | ||
23 | #endif | ||
24 | |||
25 | #include <gtest/gtest.h> | ||
26 | |||
27 | #include <sstream> | ||
28 | |||
29 | // Uncomment to test on models from our web-site | ||
30 | //#define TestFastSweeping_DATA_PATH "/Users/ken/dev/data/vdb/" | ||
31 | //#define TestFastSweeping_DATA_PATH "/home/kmu/dev/data/vdb/" | ||
32 | //#define TestFastSweeping_DATA_PATH "/usr/pic1/Data/OpenVDB/LevelSetModels/" | ||
33 | |||
34 | 7 | class TestFastSweeping: public ::testing::Test | |
35 | { | ||
36 | public: | ||
37 | 7 | void SetUp() override { openvdb::initialize(); } | |
38 | 7 | void TearDown() override { openvdb::uninitialize(); } | |
39 | |||
40 | void writeFile(const std::string &name, openvdb::FloatGrid::Ptr grid) | ||
41 | { | ||
42 | openvdb::io::File file(name); | ||
43 | file.setCompression(openvdb::io::COMPRESS_NONE); | ||
44 | openvdb::GridPtrVec grids; | ||
45 | grids.push_back(grid); | ||
46 | file.write(grids); | ||
47 | } | ||
48 | };// TestFastSweeping | ||
49 | |||
50 | |||
51 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | TEST_F(TestFastSweeping, dilateSignedDistance) |
52 | { | ||
53 | using namespace openvdb; | ||
54 | // Define parameters for the level set sphere to be re-normalized | ||
55 | const float radius = 60.0f; | ||
56 | const Vec3f center(0.0f, 0.0f, 0.0f); | ||
57 | const float voxelSize = 1.0f;//half width | ||
58 | const int width = 3, new_width = 12; | ||
59 | |||
60 | 1 | FloatGrid::Ptr grid = tools::createLevelSetSphere<FloatGrid>(radius, center, voxelSize, float(width)); | |
61 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | const size_t oldVoxelCount = grid->activeVoxelCount(); |
62 | |||
63 | 2 | tools::FastSweeping<FloatGrid> fs; | |
64 |
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(size_t(0), fs.sweepingVoxelCount()); |
65 |
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(size_t(0), fs.boundaryVoxelCount()); |
66 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | fs.initDilate(*grid, new_width - width); |
67 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE(fs.sweepingVoxelCount() > 0); |
68 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE(fs.boundaryVoxelCount() > 0); |
69 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | fs.sweep(); |
70 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE(fs.sweepingVoxelCount() > 0); |
71 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE(fs.boundaryVoxelCount() > 0); |
72 | auto grid2 = fs.sdfGrid(); | ||
73 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | fs.clear(); |
74 |
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(size_t(0), fs.sweepingVoxelCount()); |
75 |
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(size_t(0), fs.boundaryVoxelCount()); |
76 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | const Index64 sweepingVoxelCount = grid2->activeVoxelCount(); |
77 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE(sweepingVoxelCount > oldVoxelCount); |
78 | |||
79 | {// Check that the norm of the gradient for all active voxels is close to unity | ||
80 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | tools::Diagnose<FloatGrid> diagnose(*grid2); |
81 |
1/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
|
1 | tools::CheckNormGrad<FloatGrid> test(*grid2, 0.99f, 1.01f); |
82 | const std::string message = diagnose.check(test, | ||
83 | false,// don't generate a mask grid | ||
84 | true,// check active voxels | ||
85 | false,// ignore active tiles since a level set has none | ||
86 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | false);// no need to check the background value |
87 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE(message.empty()); |
88 |
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(0), diagnose.failureCount()); |
89 | //std::cout << "\nOutput 1: " << message << std::endl; | ||
90 | } | ||
91 | {// Make sure all active voxels fail the following test | ||
92 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | tools::Diagnose<FloatGrid> diagnose(*grid2); |
93 |
1/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
|
1 | tools::CheckNormGrad<FloatGrid> test(*grid2, std::numeric_limits<float>::min(), 0.99f); |
94 | const std::string message = diagnose.check(test, | ||
95 | false,// don't generate a mask grid | ||
96 | true,// check active voxels | ||
97 | false,// ignore active tiles since a level set has none | ||
98 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | false);// no need to check the background value |
99 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE(!message.empty()); |
100 |
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(sweepingVoxelCount, diagnose.failureCount()); |
101 | //std::cout << "\nOutput 2: " << message << std::endl; | ||
102 | } | ||
103 | {// Make sure all active voxels fail the following test | ||
104 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | tools::Diagnose<FloatGrid> diagnose(*grid2); |
105 |
1/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
|
1 | tools::CheckNormGrad<FloatGrid> test(*grid2, 1.01f, std::numeric_limits<float>::max()); |
106 | const std::string message = diagnose.check(test, | ||
107 | false,// don't generate a mask grid | ||
108 | true,// check active voxels | ||
109 | false,// ignore active tiles since a level set has none | ||
110 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | false);// no need to check the background value |
111 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE(!message.empty()); |
112 |
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(sweepingVoxelCount, diagnose.failureCount()); |
113 | //std::cout << "\nOutput 3: " << message << std::endl; | ||
114 | } | ||
115 | 1 | }// dilateSignedDistance | |
116 | |||
117 | |||
118 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | TEST_F(TestFastSweeping, testMaskSdf) |
119 | { | ||
120 | using namespace openvdb; | ||
121 | // Define parameters for the level set sphere to be re-normalized | ||
122 | const float radius = 60.0f; | ||
123 | const Vec3f center(0.0f, 0.0f, 0.0f); | ||
124 | const float voxelSize = 1.0f, width = 3.0f;//half width | ||
125 | const float new_width = 12; | ||
126 | |||
127 | {// Use box as a mask | ||
128 | //std::cerr << "\nUse box as a mask" << std::endl; | ||
129 | 1 | FloatGrid::Ptr grid = tools::createLevelSetSphere<FloatGrid>(radius, center, voxelSize, width); | |
130 | 1 | CoordBBox bbox(Coord(60,-25,-25), Coord(100,25,25)); | |
131 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | MaskGrid mask; |
132 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
2 | mask.sparseFill(bbox, true); |
133 | |||
134 | //this->writeFile("/tmp/box_mask_input.vdb", grid); | ||
135 | #ifdef TIMING_FAST_SWEEPING | ||
136 | util::CpuTimer timer("\nParallel sparse fast sweeping with a box mask"); | ||
137 | #endif | ||
138 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
2 | grid = tools::maskSdf(*grid, mask); |
139 | //tools::FastSweeping<FloatGrid> fs; | ||
140 | //fs.initMask(*grid, mask); | ||
141 | //fs.sweep(); | ||
142 | //std::cerr << "voxel count = " << fs.sweepingVoxelCount() << std::endl; | ||
143 | //std::cerr << "boundary count = " << fs.boundaryVoxelCount() << std::endl; | ||
144 | //EXPECT_TRUE(fs.sweepingVoxelCount() > 0); | ||
145 | #ifdef TIMING_FAST_SWEEPING | ||
146 | timer.stop(); | ||
147 | #endif | ||
148 | //writeFile("/tmp/box_mask_output.vdb", grid); | ||
149 | {// Check that the norm of the gradient for all active voxels is close to unity | ||
150 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | tools::Diagnose<FloatGrid> diagnose(*grid); |
151 |
1/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
|
1 | tools::CheckNormGrad<FloatGrid> test(*grid, 0.99f, 1.01f); |
152 | const std::string message = diagnose.check(test, | ||
153 | false,// don't generate a mask grid | ||
154 | true,// check active voxels | ||
155 | false,// ignore active tiles since a level set has none | ||
156 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | false);// no need to check the background value |
157 | //std::cerr << message << std::endl; | ||
158 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | const double percent = 100.0*double(diagnose.failureCount())/double(grid->activeVoxelCount()); |
159 | //std::cerr << "Failures = " << percent << "%" << std::endl; | ||
160 | //std::cerr << "Failed: " << diagnose.failureCount() << std::endl; | ||
161 | //std::cerr << "Total : " << grid->activeVoxelCount() << std::endl; | ||
162 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE(percent < 0.01); |
163 | //EXPECT_TRUE(message.empty()); | ||
164 | //EXPECT_EQ(size_t(0), diagnose.failureCount()); | ||
165 | } | ||
166 | } | ||
167 | |||
168 | {// Use sphere as a mask | ||
169 | //std::cerr << "\nUse sphere as a mask" << std::endl; | ||
170 | 1 | FloatGrid::Ptr grid = tools::createLevelSetSphere<FloatGrid>(radius, center, voxelSize, width); | |
171 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | FloatGrid::Ptr mask = tools::createLevelSetSphere<FloatGrid>(radius, center, voxelSize, new_width); |
172 | |||
173 | //this->writeFile("/tmp/sphere_mask_input.vdb", grid); | ||
174 | #ifdef TIMING_FAST_SWEEPING | ||
175 | util::CpuTimer timer("\nParallel sparse fast sweeping with a sphere mask"); | ||
176 | #endif | ||
177 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
2 | grid = tools::maskSdf(*grid, *mask); |
178 | //tools::FastSweeping<FloatGrid> fs; | ||
179 | //fs.initMask(*grid, *mask); | ||
180 | //fs.sweep(); | ||
181 | #ifdef TIMING_FAST_SWEEPING | ||
182 | timer.stop(); | ||
183 | #endif | ||
184 | //std::cerr << "voxel count = " << fs.sweepingVoxelCount() << std::endl; | ||
185 | //std::cerr << "boundary count = " << fs.boundaryVoxelCount() << std::endl; | ||
186 | //EXPECT_TRUE(fs.sweepingVoxelCount() > 0); | ||
187 | //this->writeFile("/tmp/sphere_mask_output.vdb", grid); | ||
188 | {// Check that the norm of the gradient for all active voxels is close to unity | ||
189 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | tools::Diagnose<FloatGrid> diagnose(*grid); |
190 |
1/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
|
1 | tools::CheckNormGrad<FloatGrid> test(*grid, 0.99f, 1.01f); |
191 | const std::string message = diagnose.check(test, | ||
192 | false,// don't generate a mask grid | ||
193 | true,// check active voxels | ||
194 | false,// ignore active tiles since a level set has none | ||
195 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | false);// no need to check the background value |
196 | //std::cerr << message << std::endl; | ||
197 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | const double percent = 100.0*double(diagnose.failureCount())/double(grid->activeVoxelCount()); |
198 | //std::cerr << "Failures = " << percent << "%" << std::endl; | ||
199 | //std::cerr << "Failed: " << diagnose.failureCount() << std::endl; | ||
200 | //std::cerr << "Total : " << grid->activeVoxelCount() << std::endl; | ||
201 | //EXPECT_TRUE(message.empty()); | ||
202 | //EXPECT_EQ(size_t(0), diagnose.failureCount()); | ||
203 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE(percent < 0.01); |
204 | //std::cout << "\nOutput 1: " << message << std::endl; | ||
205 | } | ||
206 | } | ||
207 | |||
208 | {// Use dodecahedron as a mask | ||
209 | //std::cerr << "\nUse dodecahedron as a mask" << std::endl; | ||
210 | 1 | FloatGrid::Ptr grid = tools::createLevelSetSphere<FloatGrid>(radius, center, voxelSize, width); | |
211 |
1/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
|
1 | FloatGrid::Ptr mask = tools::createLevelSetDodecahedron<FloatGrid>(50, Vec3f(radius, 0.0f, 0.0f), |
212 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | voxelSize, 10); |
213 | |||
214 | //this->writeFile("/tmp/dodecahedron_mask_input.vdb", grid); | ||
215 | #ifdef TIMING_FAST_SWEEPING | ||
216 | util::CpuTimer timer("\nParallel sparse fast sweeping with a dodecahedron mask"); | ||
217 | #endif | ||
218 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
2 | grid = tools::maskSdf(*grid, *mask); |
219 | //tools::FastSweeping<FloatGrid> fs; | ||
220 | //fs.initMask(*grid, *mask); | ||
221 | //std::cerr << "voxel count = " << fs.sweepingVoxelCount() << std::endl; | ||
222 | //std::cerr << "boundary count = " << fs.boundaryVoxelCount() << std::endl; | ||
223 | //EXPECT_TRUE(fs.sweepingVoxelCount() > 0); | ||
224 | //fs.sweep(); | ||
225 | #ifdef TIMING_FAST_SWEEPING | ||
226 | timer.stop(); | ||
227 | #endif | ||
228 | //this->writeFile("/tmp/dodecahedron_mask_output.vdb", grid); | ||
229 | {// Check that the norm of the gradient for all active voxels is close to unity | ||
230 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | tools::Diagnose<FloatGrid> diagnose(*grid); |
231 |
1/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
|
1 | tools::CheckNormGrad<FloatGrid> test(*grid, 0.99f, 1.01f); |
232 | const std::string message = diagnose.check(test, | ||
233 | false,// don't generate a mask grid | ||
234 | true,// check active voxels | ||
235 | false,// ignore active tiles since a level set has none | ||
236 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | false);// no need to check the background value |
237 | //std::cerr << message << std::endl; | ||
238 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | const double percent = 100.0*double(diagnose.failureCount())/double(grid->activeVoxelCount()); |
239 | //std::cerr << "Failures = " << percent << "%" << std::endl; | ||
240 | //std::cerr << "Failed: " << diagnose.failureCount() << std::endl; | ||
241 | //std::cerr << "Total : " << grid->activeVoxelCount() << std::endl; | ||
242 | //EXPECT_TRUE(message.empty()); | ||
243 | //EXPECT_EQ(size_t(0), diagnose.failureCount()); | ||
244 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE(percent < 0.01); |
245 | //std::cout << "\nOutput 1: " << message << std::endl; | ||
246 | } | ||
247 | } | ||
248 | #ifdef TestFastSweeping_DATA_PATH | ||
249 | {// Use bunny as a mask | ||
250 | //std::cerr << "\nUse bunny as a mask" << std::endl; | ||
251 | FloatGrid::Ptr grid = tools::createLevelSetSphere<FloatGrid>(10.0f, Vec3f(-10,0,0), 0.05f, width); | ||
252 | openvdb::initialize();//required whenever I/O of OpenVDB files is performed! | ||
253 | const std::string path(TestFastSweeping_DATA_PATH); | ||
254 | io::File file( path + "bunny.vdb" ); | ||
255 | file.open(false);//disable delayed loading | ||
256 | FloatGrid::Ptr mask = openvdb::gridPtrCast<openvdb::FloatGrid>(file.getGrids()->at(0)); | ||
257 | |||
258 | //this->writeFile("/tmp/bunny_mask_input.vdb", grid); | ||
259 | tools::FastSweeping<FloatGrid> fs; | ||
260 | #ifdef TIMING_FAST_SWEEPING | ||
261 | util::CpuTimer timer("\nParallel sparse fast sweeping with a bunny mask"); | ||
262 | #endif | ||
263 | fs.initMask(*grid, *mask); | ||
264 | //std::cerr << "voxel count = " << fs.sweepingVoxelCount() << std::endl; | ||
265 | //std::cerr << "boundary count = " << fs.boundaryVoxelCount() << std::endl; | ||
266 | fs.sweep(); | ||
267 | auto grid2 = fs.sdfGrid(); | ||
268 | #ifdef TIMING_FAST_SWEEPING | ||
269 | timer.stop(); | ||
270 | #endif | ||
271 | //this->writeFile("/tmp/bunny_mask_output.vdb", grid2); | ||
272 | {// Check that the norm of the gradient for all active voxels is close to unity | ||
273 | tools::Diagnose<FloatGrid> diagnose(*grid2); | ||
274 | tools::CheckNormGrad<FloatGrid> test(*grid2, 0.99f, 1.01f); | ||
275 | const std::string message = diagnose.check(test, | ||
276 | false,// don't generate a mask grid | ||
277 | true,// check active voxels | ||
278 | false,// ignore active tiles since a level set has none | ||
279 | false);// no need to check the background value | ||
280 | //std::cerr << message << std::endl; | ||
281 | const double percent = 100.0*double(diagnose.failureCount())/double(grid2->activeVoxelCount()); | ||
282 | //std::cerr << "Failures = " << percent << "%" << std::endl; | ||
283 | //std::cerr << "Failed: " << diagnose.failureCount() << std::endl; | ||
284 | //std::cerr << "Total : " << grid2->activeVoxelCount() << std::endl; | ||
285 | //EXPECT_TRUE(message.empty()); | ||
286 | //EXPECT_EQ(size_t(0), diagnose.failureCount()); | ||
287 | EXPECT_TRUE(percent < 4.5);// crossing characteristics! | ||
288 | //std::cout << "\nOutput 1: " << message << std::endl; | ||
289 | } | ||
290 | } | ||
291 | #endif | ||
292 | 1 | }// testMaskSdf | |
293 | |||
294 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | TEST_F(TestFastSweeping, testSdfToFogVolume) |
295 | { | ||
296 | using namespace openvdb; | ||
297 | // Define parameterS FOR the level set sphere to be re-normalized | ||
298 | const float radius = 50.0f; | ||
299 | const Vec3f center(0.0f, 0.0f, 0.0f); | ||
300 | const float voxelSize = 1.0f, width = 3.0f;//half width | ||
301 | |||
302 | 1 | FloatGrid::Ptr grid = tools::createLevelSetSphere<FloatGrid>(radius, center, voxelSize, float(width)); | |
303 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | tools::sdfToFogVolume(*grid); |
304 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | const Index64 sweepingVoxelCount = grid->activeVoxelCount(); |
305 | |||
306 | //this->writeFile("/tmp/fog_input.vdb", grid); | ||
307 | 2 | tools::FastSweeping<FloatGrid> fs; | |
308 | #ifdef TIMING_FAST_SWEEPING | ||
309 | util::CpuTimer timer("\nParallel sparse fast sweeping with a fog volume"); | ||
310 | #endif | ||
311 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | fs.initSdf(*grid, /*isoValue*/0.5f,/*isInputSdf*/false); |
312 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE(fs.sweepingVoxelCount() > 0); |
313 | //std::cerr << "voxel count = " << fs.sweepingVoxelCount() << std::endl; | ||
314 | //std::cerr << "boundary count = " << fs.boundaryVoxelCount() << std::endl; | ||
315 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | fs.sweep(); |
316 | auto grid2 = fs.sdfGrid(); | ||
317 | #ifdef TIMING_FAST_SWEEPING | ||
318 | timer.stop(); | ||
319 | #endif | ||
320 |
3/20✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
|
1 | EXPECT_EQ(sweepingVoxelCount, grid->activeVoxelCount()); |
321 | //this->writeFile("/tmp/ls_output.vdb", grid2); | ||
322 | |||
323 | {// Check that the norm of the gradient for all active voxels is close to unity | ||
324 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | tools::Diagnose<FloatGrid> diagnose(*grid2); |
325 |
1/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
|
1 | tools::CheckNormGrad<FloatGrid> test(*grid2, 0.99f, 1.01f); |
326 | const std::string message = diagnose.check(test, | ||
327 | false,// don't generate a mask grid | ||
328 | true,// check active voxels | ||
329 | false,// ignore active tiles since a level set has none | ||
330 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | false);// no need to check the background value |
331 | //std::cerr << message << std::endl; | ||
332 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | const double percent = 100.0*double(diagnose.failureCount())/double(grid2->activeVoxelCount()); |
333 | //std::cerr << "Failures = " << percent << "%" << std::endl; | ||
334 | //std::cerr << "Failure count = " << diagnose.failureCount() << std::endl; | ||
335 | //std::cerr << "Total active voxel count = " << grid2->activeVoxelCount() << std::endl; | ||
336 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE(percent < 10.0); |
337 | } | ||
338 | 1 | }// testSdfToFogVolume | |
339 | |||
340 | |||
341 | #ifdef BENCHMARK_FAST_SWEEPING | ||
342 | TEST_F(TestFastSweeping, testBenchmarks) | ||
343 | { | ||
344 | using namespace openvdb; | ||
345 | // Define parameterS FOR the level set sphere to be re-normalized | ||
346 | const float radius = 200.0f; | ||
347 | const Vec3f center(0.0f, 0.0f, 0.0f); | ||
348 | const float voxelSize = 1.0f, width = 3.0f;//half width | ||
349 | const float new_width = 50; | ||
350 | |||
351 | {// Use rebuildLevelSet (limited to closed and symmetric narrow-band level sets) | ||
352 | FloatGrid::Ptr grid = tools::createLevelSetSphere<FloatGrid>(radius, center, voxelSize, width); | ||
353 | #ifdef TIMING_FAST_SWEEPING | ||
354 | util::CpuTimer timer("\nRebuild level set"); | ||
355 | #endif | ||
356 | FloatGrid::Ptr ls = tools::levelSetRebuild(*grid, 0.0f, new_width); | ||
357 | #ifdef TIMING_FAST_SWEEPING | ||
358 | timer.stop(); | ||
359 | #endif | ||
360 | std::cout << "Diagnostics:\n" << tools::checkLevelSet(*ls, 9) << std::endl; | ||
361 | //this->writeFile("/tmp/rebuild_sdf.vdb", ls); | ||
362 | } | ||
363 | {// Use LevelSetTracker::normalize() | ||
364 | FloatGrid::Ptr grid = tools::createLevelSetSphere<FloatGrid>(radius, center, voxelSize, width); | ||
365 | tools::dilateActiveValues(grid->tree(), int(new_width-width), tools::NN_FACE, tools::IGNORE_TILES); | ||
366 | tools::changeLevelSetBackground(grid->tree(), new_width); | ||
367 | std::cout << "Diagnostics:\n" << tools::checkLevelSet(*grid, 9) << std::endl; | ||
368 | //std::cerr << "Number of active tiles = " << grid->tree().activeTileCount() << std::endl; | ||
369 | //grid->print(std::cout, 3); | ||
370 | tools::LevelSetTracker<FloatGrid> track(*grid); | ||
371 | track.setNormCount(int(new_width/0.3f));//CFL is 1/3 for RK1 | ||
372 | track.setSpatialScheme(math::FIRST_BIAS); | ||
373 | track.setTemporalScheme(math::TVD_RK1); | ||
374 | #ifdef TIMING_FAST_SWEEPING | ||
375 | util::CpuTimer timer("\nConventional re-normalization"); | ||
376 | #endif | ||
377 | track.normalize(); | ||
378 | #ifdef TIMING_FAST_SWEEPING | ||
379 | timer.stop(); | ||
380 | #endif | ||
381 | std::cout << "Diagnostics:\n" << tools::checkLevelSet(*grid, 9) << std::endl; | ||
382 | //this->writeFile("/tmp/old_sdf.vdb", grid); | ||
383 | } | ||
384 | {// Use new sparse and parallel fast sweeping | ||
385 | FloatGrid::Ptr grid = tools::createLevelSetSphere<FloatGrid>(radius, center, voxelSize, width); | ||
386 | |||
387 | //this->writeFile("/tmp/original_sdf.vdb", grid); | ||
388 | #ifdef TIMING_FAST_SWEEPING | ||
389 | util::CpuTimer timer("\nParallel sparse fast sweeping"); | ||
390 | #endif | ||
391 | auto grid2 = tools::dilateSdf(*grid, int(new_width - width), tools::NN_FACE_EDGE); | ||
392 | //tools::FastSweeping<FloatGrid> fs(*grid); | ||
393 | //EXPECT_TRUE(fs.sweepingVoxelCount() > 0); | ||
394 | //tbb::task_scheduler_init init(4);//thread count | ||
395 | //fs.sweep(); | ||
396 | #ifdef TIMING_FAST_SWEEPING | ||
397 | timer.stop(); | ||
398 | #endif | ||
399 | //std::cout << "Diagnostics:\n" << tools::checkLevelSet(*grid, 9) << std::endl; | ||
400 | //this->writeFile("/tmp/new_sdf.vdb", grid2); | ||
401 | } | ||
402 | } | ||
403 | #endif | ||
404 | |||
405 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | TEST_F(TestFastSweeping, testIntersection) |
406 | { | ||
407 | using namespace openvdb; | ||
408 | const Coord ijk(1,4,-9); | ||
409 |
1/2✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
|
2 | FloatGrid grid(0.0f); |
410 | auto acc = grid.getAccessor(); | ||
411 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | math::GradStencil<FloatGrid> stencil(grid); |
412 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | acc.setValue(ijk,-1.0f); |
413 | 1 | int cases = 0; | |
414 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1 times.
|
3 | for (int mx=0; mx<2; ++mx) { |
415 |
3/4✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
|
3 | acc.setValue(ijk.offsetBy(-1,0,0), mx ? 1.0f : -1.0f); |
416 |
2/2✓ Branch 0 taken 4 times.
✓ Branch 1 taken 2 times.
|
6 | for (int px=0; px<2; ++px) { |
417 |
3/4✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
✓ Branch 3 taken 4 times.
✗ Branch 4 not taken.
|
6 | acc.setValue(ijk.offsetBy(1,0,0), px ? 1.0f : -1.0f); |
418 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 4 times.
|
12 | for (int my=0; my<2; ++my) { |
419 |
3/4✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
|
12 | acc.setValue(ijk.offsetBy(0,-1,0), my ? 1.0f : -1.0f); |
420 |
2/2✓ Branch 0 taken 16 times.
✓ Branch 1 taken 8 times.
|
24 | for (int py=0; py<2; ++py) { |
421 |
3/4✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
✓ Branch 3 taken 16 times.
✗ Branch 4 not taken.
|
24 | acc.setValue(ijk.offsetBy(0,1,0), py ? 1.0f : -1.0f); |
422 |
2/2✓ Branch 0 taken 32 times.
✓ Branch 1 taken 16 times.
|
48 | for (int mz=0; mz<2; ++mz) { |
423 |
3/4✓ Branch 0 taken 16 times.
✓ Branch 1 taken 16 times.
✓ Branch 3 taken 32 times.
✗ Branch 4 not taken.
|
48 | acc.setValue(ijk.offsetBy(0,0,-1), mz ? 1.0f : -1.0f); |
424 |
2/2✓ Branch 0 taken 64 times.
✓ Branch 1 taken 32 times.
|
96 | for (int pz=0; pz<2; ++pz) { |
425 |
3/4✓ Branch 0 taken 32 times.
✓ Branch 1 taken 32 times.
✓ Branch 3 taken 64 times.
✗ Branch 4 not taken.
|
96 | acc.setValue(ijk.offsetBy(0,0,1), pz ? 1.0f : -1.0f); |
426 |
1/2✓ Branch 1 taken 64 times.
✗ Branch 2 not taken.
|
64 | ++cases; |
427 |
2/16✓ Branch 1 taken 64 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 64 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.
|
64 | EXPECT_EQ(Index64(7), grid.activeVoxelCount()); |
428 |
1/2✓ Branch 1 taken 64 times.
✗ Branch 2 not taken.
|
64 | stencil.moveTo(ijk); |
429 | 64 | const size_t count = mx + px + my + py + mz + pz;// number of intersections | |
430 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 64 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.
|
64 | EXPECT_TRUE(stencil.intersects() == (count > 0)); |
431 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 64 times.
|
64 | auto mask = stencil.intersectionMask(); |
432 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 64 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.
|
64 | EXPECT_TRUE(mask.none() == (count == 0)); |
433 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 64 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.
|
64 | EXPECT_TRUE(mask.any() == (count > 0)); |
434 |
2/16✓ Branch 1 taken 64 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 64 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.
|
64 | EXPECT_EQ(count, mask.count()); |
435 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 64 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.
|
64 | EXPECT_TRUE(mask.test(0) == mx); |
436 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 64 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.
|
64 | EXPECT_TRUE(mask.test(1) == px); |
437 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 64 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.
|
64 | EXPECT_TRUE(mask.test(2) == my); |
438 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 64 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.
|
64 | EXPECT_TRUE(mask.test(3) == py); |
439 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 64 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.
|
64 | EXPECT_TRUE(mask.test(4) == mz); |
440 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 64 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.
|
64 | EXPECT_TRUE(mask.test(5) == pz); |
441 | }//pz | ||
442 | }//mz | ||
443 | }//py | ||
444 | }//my | ||
445 | }//px | ||
446 | }//mx | ||
447 |
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(64, cases);// = 2^6 |
448 | 1 | }//testIntersection | |
449 | |||
450 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | TEST_F(TestFastSweeping, fogToSdfAndExt) |
451 | { | ||
452 | using namespace openvdb; | ||
453 | const float isoValue = 0.5f; | ||
454 | const float radius = 50.0f; | ||
455 | 1 | const float background = 0.0f; | |
456 | const float tolerance = 0.00001f; | ||
457 | const Vec3f center(0.0f, 0.0f, 0.0f); | ||
458 | const float voxelSize = 1.0f, width = 3.0f;//half width | ||
459 | 1 | FloatGrid::Ptr grid = tools::createLevelSetSphere<FloatGrid>(radius, center, voxelSize, float(width)); | |
460 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | tools::sdfToFogVolume(*grid); |
461 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE(grid); |
462 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | const float fog[] = {grid->tree().getValue( Coord(52, 0, 0) ), |
463 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | grid->tree().getValue( Coord(51, 0, 0) ), |
464 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | grid->tree().getValue( Coord(50, 0, 0) ), |
465 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | grid->tree().getValue( Coord(49, 0, 0) ), |
466 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
|
1 | grid->tree().getValue( Coord(48, 0, 0) )}; |
467 | //for (auto v : fog) std::cerr << v << std::endl; | ||
468 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE( math::isApproxEqual(fog[0], 0.0f, tolerance) ); |
469 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE( math::isApproxEqual(fog[1], 0.0f, tolerance) ); |
470 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE( math::isApproxEqual(fog[2], 0.0f, tolerance) ); |
471 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE( math::isApproxEqual(fog[3], 1.0f/3.0f, tolerance) ); |
472 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE( math::isApproxEqual(fog[4], 2.0f/3.0f, tolerance) ); |
473 | //this->writeFile("/tmp/sphere1_fog_in.vdb", grid); | ||
474 | |||
475 |
3/4✓ Branch 0 taken 66424 times.
✓ Branch 1 taken 22292 times.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
|
88717 | auto op = [radius](const Vec3R &xyz) {return math::Sin(2*3.14*(xyz[0]+xyz[1]+xyz[2])/radius);}; |
476 |
2/6✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
|
3 | auto grids = tools::fogToSdfAndExt(*grid, op, background, isoValue); |
477 | |||
478 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | const auto sdf1 = grids.first->tree().getValue( Coord(50, 0, 0) ); |
479 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | const auto sdf2 = grids.first->tree().getValue( Coord(49, 0, 0) ); |
480 | 1 | const auto sdf3 = grids.first->tree().getValue( Coord(48, 0, 0) ); | |
481 | //std::cerr << "\nsdf1 = " << sdf1 << ", sdf2 = " << sdf2 << ", sdf3 = " << sdf3 << std::endl; | ||
482 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE( sdf1 > sdf2 ); |
483 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE( math::isApproxEqual( sdf2, 0.5f, tolerance) ); |
484 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE( math::isApproxEqual( sdf3,-0.5f, tolerance) ); |
485 | |||
486 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | const auto ext1 = grids.second->tree().getValue( Coord(50, 0, 0) ); |
487 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | const auto ext2 = grids.second->tree().getValue( Coord(49, 0, 0) ); |
488 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
|
1 | const auto ext3 = grids.second->tree().getValue( Coord(48, 0, 0) ); |
489 | //std::cerr << "\next1 = " << ext1 << ", ext2 = " << ext2 << ", ext3 = " << ext3 << std::endl; | ||
490 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE( math::isApproxEqual(ext1, background, tolerance) ); |
491 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE( math::isApproxEqual(ext2, ext3, tolerance) ); |
492 | //this->writeFile("/tmp/sphere1_sdf_out.vdb", grids.first); | ||
493 | //this->writeFile("/tmp/sphere1_ext_out.vdb", grids.second); | ||
494 | 1 | }// fogToSdfAndExt | |
495 | |||
496 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | TEST_F(TestFastSweeping, sdfToSdfAndExt) |
497 | { | ||
498 | using namespace openvdb; | ||
499 | const float isoValue = 0.0f; | ||
500 | const float radius = 100.0f; | ||
501 | 1 | const float background = 1.234f; | |
502 | const float tolerance = 0.00001f; | ||
503 | const Vec3f center(0.0f, 0.0f, 0.0f); | ||
504 | const float voxelSize = 1.0f, width = 3.0f;//half width | ||
505 | 1 | FloatGrid::Ptr lsGrid = tools::createLevelSetSphere<FloatGrid>(radius, center, voxelSize, width); | |
506 | //std::cerr << "\nls(100,0,0) = " << lsGrid->tree().getValue( Coord(100, 0, 0) ) << std::endl; | ||
507 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE( math::isApproxEqual(lsGrid->tree().getValue( Coord(100, 0, 0) ), 0.0f, tolerance) ); |
508 | |||
509 |
3/4✓ Branch 0 taken 282894 times.
✓ Branch 1 taken 93480 times.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
|
376525 | auto op = [radius](const Vec3R &xyz) {return math::Sin(2*3.14*xyz[0]/radius);}; |
510 |
2/6✓ 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.
|
3 | auto grids = tools::sdfToSdfAndExt(*lsGrid, op, background, isoValue); |
511 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE(grids.first); |
512 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE(grids.second); |
513 | |||
514 | //std::cerr << "\nsdf = " << grids.first->tree().getValue( Coord(100, 0, 0) ) << std::endl; | ||
515 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE( math::isApproxEqual(grids.first->tree().getValue( Coord(100, 0, 0) ), 0.0f, tolerance) ); |
516 | |||
517 | //std::cerr << "\nBackground = " << grids.second->background() << std::endl; | ||
518 | //std::cerr << "\nBackground = " << grids.second->tree().getValue( Coord(10000) ) << std::endl; | ||
519 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE( math::isApproxEqual(grids.second->background(), background, tolerance) ); |
520 | |||
521 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | const auto sdf1 = grids.first->tree().getValue( Coord(100, 0, 0) ); |
522 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | const auto sdf2 = grids.first->tree().getValue( Coord(102, 0, 0) ); |
523 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
|
1 | const auto sdf3 = grids.first->tree().getValue( Coord(102, 1, 1) ); |
524 | //std::cerr << "\nsdf1 = " << sdf1 << ", sdf2 = " << sdf2 << ", sdf3 = " << sdf3 << std::endl; | ||
525 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE( math::isApproxEqual( sdf1, 0.0f, tolerance) ); |
526 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE( math::isApproxEqual( sdf2, 2.0f, tolerance) ); |
527 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE( sdf3 > 2.0f ); |
528 | |||
529 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | const auto ext1 = grids.second->tree().getValue( Coord(100, 0, 0) ); |
530 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | const auto ext2 = grids.second->tree().getValue( Coord(102, 0, 0) ); |
531 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
|
1 | const auto ext3 = grids.second->tree().getValue( Coord(102, 1, 0) ); |
532 | //std::cerr << "\next1 = " << ext1 << ", ext2 = " << ext2 << ", ext3 = " << ext3 << std::endl; | ||
533 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE( math::isApproxEqual(float(op(Vec3R(100, 0, 0))), ext1, tolerance) ); |
534 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE( math::isApproxEqual(ext1, ext2, tolerance) ); |
535 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE(!math::isApproxEqual(ext1, ext3, tolerance) ); |
536 | //writeFile("/tmp/sphere2_sdf_out.vdb", grids.first); | ||
537 | //writeFile("/tmp/sphere2_ext_out.vdb", grids.second); | ||
538 | 1 | }// sdfToSdfAndExt | |
539 | |||
540 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | TEST_F(TestFastSweeping, sdfToSdfAndExt_velocity) |
541 | { | ||
542 | using namespace openvdb; | ||
543 | const float isoValue = 0.0f; | ||
544 | const float radius = 100.0f; | ||
545 | const Vec3f background(-1.0f, 2.0f, 1.234f); | ||
546 | const float tolerance = 0.00001f; | ||
547 | const Vec3f center(0.0f, 0.0f, 0.0f); | ||
548 | const float voxelSize = 1.0f, width = 3.0f;//half width | ||
549 | 1 | FloatGrid::Ptr lsGrid = tools::createLevelSetSphere<FloatGrid>(radius, center, voxelSize, width); | |
550 | //std::cerr << "\nls(100,0,0) = " << lsGrid->tree().getValue( Coord(100, 0, 0) ) << std::endl; | ||
551 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE( math::isApproxEqual(lsGrid->tree().getValue( Coord(100, 0, 0) ), 0.0f, tolerance) ); |
552 | //tools::sdfToFogVolume(*grid); | ||
553 | //writeFile("/tmp/sphere1_fog_in.vdb", grid); | ||
554 | //tools::fogToSdf(*grid, isoValue); | ||
555 | |||
556 | // Vector valued extension field, e.g. a velocity field | ||
557 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | auto op = [radius](const Vec3R &xyz) { |
558 | 376525 | return Vec3f(float(xyz[0]), float(-xyz[1]), float(math::Sin(2*3.14*xyz[2]/radius))); | |
559 | }; | ||
560 |
2/6✓ 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.
|
3 | auto grids = tools::sdfToSdfAndExt(*lsGrid, op, background, isoValue); |
561 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE(grids.first); |
562 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE(grids.second); |
563 | |||
564 | //std::cerr << "\nBackground = " << grids.second->background() << std::endl; | ||
565 | //std::cerr << "\nBackground = " << grids.second->tree().getValue( Coord(10000) ) << std::endl; | ||
566 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE( math::isApproxZero((grids.second->background()-background).length(), tolerance) ); |
567 | //std::cerr << "\nsdf = " << grids.first->tree().getValue( Coord(100, 0, 0) ) << std::endl; | ||
568 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE( math::isApproxEqual(grids.first->tree().getValue( Coord(100, 0, 0) ), 0.0f, tolerance) ); |
569 | |||
570 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | const auto sdf1 = grids.first->tree().getValue( Coord(100, 0, 0) ); |
571 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | const auto sdf2 = grids.first->tree().getValue( Coord(102, 0, 0) ); |
572 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
|
1 | const auto sdf3 = grids.first->tree().getValue( Coord(102, 1, 1) ); |
573 | //std::cerr << "\nsdf1 = " << sdf1 << ", sdf2 = " << sdf2 << ", sdf3 = " << sdf3 << std::endl; | ||
574 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE( math::isApproxEqual( sdf1, 0.0f, tolerance) ); |
575 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE( math::isApproxEqual( sdf2, 2.0f, tolerance) ); |
576 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE( sdf3 > 2.0f ); |
577 | |||
578 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | const auto ext1 = grids.second->tree().getValue( Coord(100, 0, 0) ); |
579 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | const auto ext2 = grids.second->tree().getValue( Coord(102, 0, 0) ); |
580 | 1 | const auto ext3 = grids.second->tree().getValue( Coord(102, 1, 0) ); | |
581 | //std::cerr << "\next1 = " << ext1 << ", ext2 = " << ext2 << ", ext3 = " << ext3 << std::endl; | ||
582 |
1/16✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
|
2 | EXPECT_TRUE( math::isApproxZero((op(Vec3R(100, 0, 0)) - ext1).length(), tolerance) ); |
583 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE( math::isApproxZero((ext1 - ext2).length(), tolerance) ); |
584 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
|
1 | EXPECT_TRUE(!math::isApproxZero((ext1 - ext3).length(), tolerance) ); |
585 | |||
586 | //writeFile("/tmp/sphere2_sdf_out.vdb", grids.first); | ||
587 | //writeFile("/tmp/sphere2_ext_out.vdb", grids.second); | ||
588 | 1 | }// sdfToSdfAndExt_velocity | |
589 | |||
590 | #ifdef TestFastSweeping_DATA_PATH | ||
591 | TEST_F(TestFastSweeping, velocityExtensionOfFogBunny) | ||
592 | { | ||
593 | using namespace openvdb; | ||
594 | |||
595 | openvdb::initialize();//required whenever I/O of OpenVDB files is performed! | ||
596 | const std::string path(TestFastSweeping_DATA_PATH); | ||
597 | io::File file( path + "bunny.vdb" ); | ||
598 | file.open(false);//disable delayed loading | ||
599 | auto grid = openvdb::gridPtrCast<openvdb::FloatGrid>(file.getGrids()->at(0)); | ||
600 | tools::sdfToFogVolume(*grid); | ||
601 | writeFile("/tmp/bunny1_fog_in.vdb", grid); | ||
602 | auto bbox = grid->evalActiveVoxelBoundingBox(); | ||
603 | const double xSize = bbox.dim()[0]*grid->voxelSize()[0]; | ||
604 | std::cerr << "\ndim=" << bbox.dim() << ", voxelSize="<< grid->voxelSize()[0] | ||
605 | << ", xSize=" << xSize << std::endl; | ||
606 | |||
607 | auto op = [xSize](const Vec3R &xyz) { | ||
608 | return math::Sin(2*3.14*xyz[0]/xSize); | ||
609 | }; | ||
610 | auto grids = tools::fogToSdfAndExt(*grid, op, 0.0f, 0.5f); | ||
611 | std::cerr << "before writing" << std::endl; | ||
612 | writeFile("/tmp/bunny1_sdf_out.vdb", grids.first); | ||
613 | writeFile("/tmp/bunny1_ext_out.vdb", grids.second); | ||
614 | std::cerr << "after writing" << std::endl; | ||
615 | }//velocityExtensionOfFogBunnyevalActiveVoxelBoundingBox | ||
616 | |||
617 | TEST_F(TestFastSweeping, velocityExtensionOfSdfBunny) | ||
618 | { | ||
619 | using namespace openvdb; | ||
620 | const std::string path(TestFastSweeping_DATA_PATH); | ||
621 | io::File file( path + "bunny.vdb" ); | ||
622 | file.open(false);//disable delayed loading | ||
623 | auto grid = openvdb::gridPtrCast<openvdb::FloatGrid>(file.getGrids()->at(0)); | ||
624 | writeFile("/tmp/bunny2_sdf_in.vdb", grid); | ||
625 | auto bbox = grid->evalActiveVoxelBoundingBox(); | ||
626 | const double xSize = bbox.dim()[0]*grid->voxelSize()[0]; | ||
627 | std::cerr << "\ndim=" << bbox.dim() << ", voxelSize="<< grid->voxelSize()[0] | ||
628 | << ", xSize=" << xSize << std::endl; | ||
629 | |||
630 | auto op = [xSize](const Vec3R &xyz) { | ||
631 | return math::Sin(2*3.14*xyz[0]/xSize); | ||
632 | }; | ||
633 | auto grids = tools::sdfToSdfAndExt(*grid, op, 0.0f); | ||
634 | std::cerr << "before writing" << std::endl; | ||
635 | writeFile("/tmp/bunny2_sdf_out.vdb", grids.first); | ||
636 | writeFile("/tmp/bunny2_ext_out.vdb", grids.second); | ||
637 | std::cerr << "after writing" << std::endl; | ||
638 | |||
639 | }//velocityExtensionOfFogBunnyevalActiveVoxelBoundingBox | ||
640 | #endif | ||
641 |