| 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/openvdb.h> | ||
| 6 | #include <openvdb/tools/MultiResGrid.h> | ||
| 7 | #include <openvdb/tools/LevelSetSphere.h> | ||
| 8 | #include <openvdb/tools/Diagnostics.h> | ||
| 9 | |||
| 10 | #include <gtest/gtest.h> | ||
| 11 | |||
| 12 | #include <cstdio> // for remove() | ||
| 13 | |||
| 14 | |||
| 15 | 5 | class TestMultiResGrid : public ::testing::Test | |
| 16 | { | ||
| 17 | public: | ||
| 18 | // Use to test logic in openvdb::tools::MultiResGrid | ||
| 19 | struct CoordMask { | ||
| 20 | static int Mask(int i, int j, int k) { return (i & 1) | ((j & 1) << 1) | ((k & 1) << 2); } | ||
| 21 | CoordMask() : mask(0) {} | ||
| 22 | CoordMask(const openvdb::Coord &c ) : mask( Mask(c[0],c[1],c[2]) ) {} | ||
| 23 | inline void setCoord(int i, int j, int k) { mask = Mask(i,j,k); } | ||
| 24 | inline void setCoord(const openvdb::Coord &c) { mask = Mask(c[0],c[1],c[2]); } | ||
| 25 | inline bool allEven() const { return mask == 0; } | ||
| 26 | inline bool xOdd() const { return mask == 1; } | ||
| 27 | inline bool yOdd() const { return mask == 2; } | ||
| 28 | inline bool zOdd() const { return mask == 4; } | ||
| 29 | inline bool xyOdd() const { return mask == 3; } | ||
| 30 | inline bool xzOdd() const { return mask == 5; } | ||
| 31 | inline bool yzOdd() const { return mask == 6; } | ||
| 32 | inline bool allOdd() const { return mask == 7; } | ||
| 33 | int mask; | ||
| 34 | };// CoordMask | ||
| 35 | }; | ||
| 36 | |||
| 37 | |||
| 38 | // Uncomment to test on models from our web-site | ||
| 39 | //#define TestMultiResGrid_DATA_PATH "/home/kmu/src/openvdb/data/" | ||
| 40 | //#define TestMultiResGrid_DATA_PATH "/usr/pic1/Data/OpenVDB/LevelSetModels/" | ||
| 41 | |||
| 42 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | TEST_F(TestMultiResGrid, testTwosComplement) |
| 43 | { | ||
| 44 | // test bit-operations that assume 2's complement representation of negative integers | ||
| 45 |
1/14✗ 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 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
1 | EXPECT_EQ( 1, 13 & 1 );// odd |
| 46 |
1/14✗ 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 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
1 | EXPECT_EQ( 1,-13 & 1 );// odd |
| 47 |
1/14✗ 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 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
1 | EXPECT_EQ( 0, 12 & 1 );// even |
| 48 |
1/14✗ 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 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
1 | EXPECT_EQ( 0,-12 & 1 );// even |
| 49 |
1/14✗ 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 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
1 | EXPECT_EQ( 0, 0 & 1 );// even |
| 50 |
2/2✓ Branch 0 taken 101 times.
✓ Branch 1 taken 1 times.
|
102 | for (int i=-50; i<=50; ++i) { |
| 51 |
2/2✓ Branch 0 taken 51 times.
✓ Branch 1 taken 50 times.
|
101 | if ( (i % 2) == 0 ) {//i.e. even number |
| 52 |
1/14✗ Branch 1 not taken.
✓ Branch 2 taken 51 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 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
51 | EXPECT_EQ( 0, i & 1); |
| 53 |
1/14✗ Branch 1 not taken.
✓ Branch 2 taken 51 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 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
51 | EXPECT_EQ( i, (i >> 1) << 1 ); |
| 54 | } else {//i.e. odd number | ||
| 55 |
1/14✗ Branch 1 not taken.
✓ Branch 2 taken 50 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 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
50 | EXPECT_EQ( 1, i & 1); |
| 56 |
1/16✗ Branch 0 not taken.
✓ Branch 1 taken 50 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.
|
50 | EXPECT_TRUE( i != (i >> 1) << 1 ); |
| 57 | } | ||
| 58 | } | ||
| 59 | 1 | } | |
| 60 | |||
| 61 | |||
| 62 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | TEST_F(TestMultiResGrid, testCoordMask) |
| 63 | { | ||
| 64 | using namespace openvdb; | ||
| 65 | CoordMask mask; | ||
| 66 | |||
| 67 | mask.setCoord(-4, 2, 18); | ||
| 68 | EXPECT_TRUE(mask.allEven()); | ||
| 69 | |||
| 70 | mask.setCoord(1, 2, -6); | ||
| 71 | EXPECT_TRUE(mask.xOdd()); | ||
| 72 | |||
| 73 | mask.setCoord(4, -3, -6); | ||
| 74 | EXPECT_TRUE(mask.yOdd()); | ||
| 75 | |||
| 76 | mask.setCoord(-8, 2, -7); | ||
| 77 | EXPECT_TRUE(mask.zOdd()); | ||
| 78 | |||
| 79 | mask.setCoord(1, -3, 2); | ||
| 80 | EXPECT_TRUE(mask.xyOdd()); | ||
| 81 | |||
| 82 | mask.setCoord(1, 2, -7); | ||
| 83 | EXPECT_TRUE(mask.xzOdd()); | ||
| 84 | |||
| 85 | mask.setCoord(-10, 3, -3); | ||
| 86 | EXPECT_TRUE(mask.yzOdd()); | ||
| 87 | |||
| 88 | mask.setCoord(1, 3,-3); | ||
| 89 | EXPECT_TRUE(mask.allOdd()); | ||
| 90 | 1 | } | |
| 91 | |||
| 92 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | TEST_F(TestMultiResGrid, testManualTopology) |
| 93 | { | ||
| 94 | // Perform tests when the sparsity (or topology) of the multiple grids is defined manually | ||
| 95 | using namespace openvdb; | ||
| 96 | |||
| 97 | typedef tools::MultiResGrid<DoubleTree> MultiResGridT; | ||
| 98 | const double background = -1.0; | ||
| 99 | 1 | const size_t levels = 4; | |
| 100 | |||
| 101 |
1/2✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
|
1 | MultiResGridT::Ptr mrg(new MultiResGridT( levels, background)); |
| 102 | |||
| 103 |
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(mrg != nullptr); |
| 104 |
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(levels , mrg->numLevels()); |
| 105 |
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), mrg->finestLevel()); |
| 106 |
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(levels-1, mrg->coarsestLevel()); |
| 107 | |||
| 108 | // Define grid domain so they exactly overlap! | ||
| 109 | const int w = 16;//half-width of dense patch on the finest grid level | ||
| 110 | 1 | const CoordBBox bbox( Coord(-w), Coord(w) );// both inclusive | |
| 111 | |||
| 112 | // First check all trees against the background value | ||
| 113 |
2/2✓ Branch 0 taken 4 times.
✓ Branch 1 taken 1 times.
|
5 | for (size_t level = 0; level < mrg->numLevels(); ++level) { |
| 114 |
2/2✓ Branch 1 taken 41704 times.
✓ Branch 2 taken 4 times.
|
41708 | for (CoordBBox::Iterator<true> iter(bbox>>level); iter; ++iter) { |
| 115 |
2/16✓ Branch 2 taken 41704 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 41704 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
|
83408 | EXPECT_NEAR(background, |
| 116 | mrg->tree(level).getValue(*iter), /*tolerance=*/0.0); | ||
| 117 | } | ||
| 118 | } | ||
| 119 | |||
| 120 | // Fill all trees according to a power of two refinement pattern | ||
| 121 |
2/2✓ Branch 0 taken 4 times.
✓ Branch 1 taken 1 times.
|
5 | for (size_t level = 0; level < mrg->numLevels(); ++level) { |
| 122 | 8 | mrg->tree(level).fill( bbox>>level, double(level)); | |
| 123 | 4 | mrg->tree(level).voxelizeActiveTiles();// avoid active tiles | |
| 124 | // Check values | ||
| 125 |
2/2✓ Branch 1 taken 41704 times.
✓ Branch 2 taken 4 times.
|
41708 | for (CoordBBox::Iterator<true> iter(bbox>>level); iter; ++iter) { |
| 126 |
2/16✓ Branch 2 taken 41704 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 41704 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
|
83408 | EXPECT_NEAR(double(level), |
| 127 | mrg->tree(level).getValue(*iter), /*tolerance=*/0.0); | ||
| 128 | } | ||
| 129 | //mrg->tree( level ).print(std::cerr, 2); | ||
| 130 | // Check bounding box of active voxels | ||
| 131 | 4 | CoordBBox bbox_actual;// Expected Tree dimensions: 33^3 -> 17^3 -> 9^3 ->5^3 | |
| 132 |
1/2✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
|
4 | mrg->tree( level ).evalActiveVoxelBoundingBox( bbox_actual ); |
| 133 |
1/14✗ Branch 1 not taken.
✓ Branch 2 taken 4 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 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
|
8 | EXPECT_EQ( bbox >> level, bbox_actual ); |
| 134 | } | ||
| 135 | |||
| 136 | //pick a grid point that is shared between all the grids | ||
| 137 | const Coord ijk(0); | ||
| 138 | |||
| 139 | // Value at ijk equals the level | ||
| 140 |
3/18✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
|
1 | EXPECT_NEAR(2.0, mrg->tree(2).getValue(ijk>>2), /*tolerance=*/ 0.001); |
| 141 |
3/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_NEAR(2.0, mrg->sampleValue<0>(ijk, size_t(2)), /*tolerance=*/ 0.001); |
| 142 |
3/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_NEAR(2.0, mrg->sampleValue<1>(ijk, size_t(2)), /*tolerance=*/ 0.001); |
| 143 |
3/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_NEAR(2.0, mrg->sampleValue<2>(ijk, size_t(2)), /*tolerance=*/ 0.001); |
| 144 |
3/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_NEAR(2.0, mrg->sampleValue<1>(ijk, 2.0f), /*tolerance=*/ 0.001); |
| 145 |
3/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_NEAR(2.0, mrg->sampleValue<1>(ijk, float(2)), /*tolerance=*/ 0.001); |
| 146 | |||
| 147 | // Value at ijk at floating point level | ||
| 148 |
3/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_NEAR(2.25, mrg->sampleValue<1>(ijk, 2.25f), /*tolerance=*/ 0.001); |
| 149 | |||
| 150 | // Value at a floating-point position close to ijk and a floating point level | ||
| 151 |
3/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_NEAR(2.25, |
| 152 | mrg->sampleValue<1>(Vec3R(0.124), 2.25f), /*tolerance=*/ 0.001); | ||
| 153 | |||
| 154 | // prolongate at a given point at top level | ||
| 155 |
3/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_NEAR(1.0, mrg->prolongateVoxel(ijk, 0), /*tolerance=*/ 0.0); |
| 156 | |||
| 157 | // First check the coarsest level (3) | ||
| 158 |
2/2✓ Branch 1 taken 125 times.
✓ Branch 2 taken 1 times.
|
126 | for (CoordBBox::Iterator<true> iter(bbox>>size_t(3)); iter; ++iter) { |
| 159 |
2/16✓ Branch 2 taken 125 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 125 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
|
250 | EXPECT_NEAR(3.0, mrg->tree(3).getValue(*iter), /*tolerance=*/0.0); |
| 160 | } | ||
| 161 | |||
| 162 | // Prolongate from level 3 -> level 2 and check values | ||
| 163 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | mrg->prolongateActiveVoxels(2); |
| 164 |
2/2✓ Branch 1 taken 729 times.
✓ Branch 2 taken 1 times.
|
730 | for (CoordBBox::Iterator<true> iter(bbox>>size_t(2)); iter; ++iter) { |
| 165 |
2/16✓ Branch 2 taken 729 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 729 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
|
1458 | EXPECT_NEAR(3.0, mrg->tree(2).getValue(*iter), /*tolerance=*/0.0); |
| 166 | } | ||
| 167 | |||
| 168 | // Prolongate from level 2 -> level 1 and check values | ||
| 169 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | mrg->prolongateActiveVoxels(1); |
| 170 |
2/2✓ Branch 1 taken 4913 times.
✓ Branch 2 taken 1 times.
|
4914 | for (CoordBBox::Iterator<true> iter(bbox>>size_t(1)); iter; ++iter) { |
| 171 |
2/16✓ Branch 2 taken 4913 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 4913 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
|
9826 | EXPECT_NEAR(3.0, mrg->tree(1).getValue(*iter), /*tolerance=*/0.0); |
| 172 | } | ||
| 173 | |||
| 174 | // Prolongate from level 1 -> level 0 and check values | ||
| 175 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | mrg->prolongateActiveVoxels(0); |
| 176 |
2/2✓ Branch 0 taken 35937 times.
✓ Branch 1 taken 1 times.
|
35938 | for (CoordBBox::Iterator<true> iter(bbox); iter; ++iter) { |
| 177 |
2/16✓ Branch 2 taken 35937 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 35937 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
|
71874 | EXPECT_NEAR(3.0, mrg->tree(0).getValue(*iter), /*tolerance=*/0.0); |
| 178 | } | ||
| 179 | |||
| 180 | // Redefine values at the finest level and check values | ||
| 181 |
2/6✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
2 | mrg->finestTree().fill( bbox, 5.0 ); |
| 182 | mrg->finestTree().voxelizeActiveTiles();// avoid active tiles | ||
| 183 |
2/2✓ Branch 0 taken 35937 times.
✓ Branch 1 taken 1 times.
|
35938 | for (CoordBBox::Iterator<true> iter(bbox); iter; ++iter) { |
| 184 |
2/16✓ Branch 2 taken 35937 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 35937 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
|
71874 | EXPECT_NEAR(5.0, mrg->tree(0).getValue(*iter), /*tolerance=*/0.0); |
| 185 | } | ||
| 186 | |||
| 187 | // USE RESTRICTION BY INJECTION since it doesn't have boundary issues | ||
| 188 | // // Restrict from level 0 -> level 1 and check values | ||
| 189 | // mrg->restrictActiveVoxels(1); | ||
| 190 | // for (CoordBBox::Iterator<true> iter((bbox>>1UL).expandBy(-1)); iter; ++iter) { | ||
| 191 | // EXPECT_NEAR(5.0, mrg->tree(1).getValue(*iter), /*tolerance=*/0.0); | ||
| 192 | // } | ||
| 193 | |||
| 194 | // // Restrict from level 1 -> level 2 and check values | ||
| 195 | // mrg->restrictActiveVoxels(2); | ||
| 196 | // for (CoordBBox::Iterator<true> iter(bbox>>2UL); iter; ++iter) { | ||
| 197 | // EXPECT_NEAR(5.0, mrg->tree(2).getValue(*iter), /*tolerance=*/0.0); | ||
| 198 | // } | ||
| 199 | |||
| 200 | // // Restrict from level 2 -> level 3 and check values | ||
| 201 | // mrg->restrictActiveVoxels(3); | ||
| 202 | // for (CoordBBox::Iterator<true> iter(bbox>>3UL); iter; ++iter) { | ||
| 203 | // EXPECT_NEAR(5.0, mrg->tree(3).getValue(*iter), /*tolerance=*/0.0); | ||
| 204 | // } | ||
| 205 | 1 | } | |
| 206 | |||
| 207 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | TEST_F(TestMultiResGrid, testIO) |
| 208 | { | ||
| 209 | using namespace openvdb; | ||
| 210 | |||
| 211 | const float radius = 1.0f; | ||
| 212 | const Vec3f center(0.0f, 0.0f, 0.0f); | ||
| 213 | const float voxelSize = 0.01f; | ||
| 214 | |||
| 215 | openvdb::FloatGrid::Ptr ls = | ||
| 216 | 1 | openvdb::tools::createLevelSetSphere<openvdb::FloatGrid>(radius, center, voxelSize); | |
| 217 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | ls->setName("LevelSetSphere"); |
| 218 | |||
| 219 | typedef tools::MultiResGrid<FloatTree> MultiResGridT; | ||
| 220 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | const size_t levels = 4; |
| 221 | |||
| 222 | // Generate LOD sequence | ||
| 223 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | MultiResGridT mrg( levels, *ls, /* reduction by injection */ false ); |
| 224 | //mrg.print( std::cout, 3 ); | ||
| 225 | |||
| 226 |
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(levels , mrg.numLevels()); |
| 227 |
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), mrg.finestLevel()); |
| 228 |
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(levels-1, mrg.coarsestLevel()); |
| 229 | |||
| 230 | // Check inside and outside values | ||
| 231 |
2/2✓ Branch 0 taken 3 times.
✓ Branch 1 taken 1 times.
|
4 | for ( size_t level = 1; level < mrg.numLevels(); ++level) { |
| 232 |
1/2✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
|
3 | const float inside = mrg.sampleValue<1>( Coord(0,0,0), 0UL, level ); |
| 233 |
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_NEAR( -ls->background(), inside,/*tolerance=*/ 0.001 ); |
| 234 |
1/2✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
|
3 | const float outside = mrg.sampleValue<1>( Coord( int(1.1*radius/voxelSize) ), 0UL, level ); |
| 235 |
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_NEAR( ls->background(), outside,/*tolerance=*/ 0.001 ); |
| 236 | } | ||
| 237 | |||
| 238 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | const std::string filename( "sphere.vdb" ); |
| 239 | |||
| 240 | // Write grids | ||
| 241 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | io::File outputFile( filename ); |
| 242 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
2 | outputFile.write( *mrg.grids() ); |
| 243 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | outputFile.close(); |
| 244 | |||
| 245 | // Read grids | ||
| 246 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | openvdb::initialize(); |
| 247 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | openvdb::io::File file( filename ); |
| 248 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | file.open(); |
| 249 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | GridPtrVecPtr grids = file.getGrids(); |
| 250 |
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( levels, grids->size() ); |
| 251 | //std::cerr << "\nsize = " << grids->size() << std::endl; | ||
| 252 |
2/2✓ Branch 0 taken 4 times.
✓ Branch 1 taken 1 times.
|
5 | for ( size_t i=0; i<grids->size(); ++i ) { |
| 253 | FloatGrid::Ptr grid = gridPtrCast<FloatGrid>(grids->at(i)); | ||
| 254 |
4/20✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 4 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 4 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 4 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✗ Branch 27 not taken.
✗ Branch 28 not taken.
|
4 | EXPECT_EQ( grid->activeVoxelCount(), mrg.tree(i).activeVoxelCount() ); |
| 255 | //grid->print(std::cerr, 3); | ||
| 256 | } | ||
| 257 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | file.close(); |
| 258 | |||
| 259 | 1 | ::remove(filename.c_str()); | |
| 260 | 1 | } | |
| 261 | |||
| 262 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | TEST_F(TestMultiResGrid, testModels) |
| 263 | { | ||
| 264 | using namespace openvdb; | ||
| 265 | |||
| 266 | #ifdef TestMultiResGrid_DATA_PATH | ||
| 267 | initialize();//required whenever I/O of OpenVDB files is performed! | ||
| 268 | const std::string path(TestMultiResGrid_DATA_PATH); | ||
| 269 | std::vector<std::string> filenames; | ||
| 270 | filenames.push_back("armadillo.vdb"); | ||
| 271 | filenames.push_back("buddha.vdb"); | ||
| 272 | filenames.push_back("bunny.vdb"); | ||
| 273 | filenames.push_back("crawler.vdb"); | ||
| 274 | filenames.push_back("dragon.vdb"); | ||
| 275 | filenames.push_back("iss.vdb"); | ||
| 276 | filenames.push_back("utahteapot.vdb"); | ||
| 277 | util::CpuTimer timer; | ||
| 278 | for ( size_t i=0; i<filenames.size(); ++i) { | ||
| 279 | std::cerr << "\n=====================>\"" << filenames[i] | ||
| 280 | << "\" =====================" << std::endl; | ||
| 281 | std::cerr << "Reading \"" << filenames[i] << "\" ..."; | ||
| 282 | io::File file( path + filenames[i] ); | ||
| 283 | file.open(false);//disable delayed loading | ||
| 284 | FloatGrid::Ptr model = gridPtrCast<FloatGrid>(file.getGrids()->at(0)); | ||
| 285 | std::cerr << " done\nProcessing \"" << filenames[i] << "\" ..."; | ||
| 286 | timer.start("\nMultiResGrid processing"); | ||
| 287 | tools::MultiResGrid<FloatTree> mrg( 6, model ); | ||
| 288 | timer.stop(); | ||
| 289 | std::cerr << "\n High-res level set " << tools::checkLevelSet(*mrg.grid(0)) << "\n"; | ||
| 290 | std::cerr << " done\nWriting \"" << filenames[i] << "\" ..."; | ||
| 291 | |||
| 292 | io::File file( "/tmp/" + filenames[i] ); | ||
| 293 | file.write( *mrg.grids() ); | ||
| 294 | file.close(); | ||
| 295 | |||
| 296 | std::cerr << " done\n" << std::endl; | ||
| 297 | // {// in-betweening | ||
| 298 | // timer.start("\nIn-betweening"); | ||
| 299 | // FloatGrid::Ptr model3 = mrg.createGrid( 1.9999f ); | ||
| 300 | // timer.stop(); | ||
| 301 | // // | ||
| 302 | // std::cerr << "\n" << tools::checkLevelSet(*model3) << "\n"; | ||
| 303 | // // | ||
| 304 | // GridPtrVecPtr grids2( new GridPtrVec ); | ||
| 305 | // grids2->push_back( model3 ); | ||
| 306 | // io::File file2( "/tmp/inbetween_" + filenames[i] ); | ||
| 307 | // file2.write( *grids2 ); | ||
| 308 | // file2.close(); | ||
| 309 | // } | ||
| 310 | // {// prolongate | ||
| 311 | // timer.start("\nProlongate"); | ||
| 312 | // mrg.prolongateActiveVoxels(1); | ||
| 313 | // FloatGrid::Ptr model31= mrg.grid(1); | ||
| 314 | // timer.stop(); | ||
| 315 | // GridPtrVecPtr grids2( new GridPtrVec ); | ||
| 316 | // grids2->push_back( model31 ); | ||
| 317 | // io::File file2( "/tmp/prolongate_" + filenames[i] ); | ||
| 318 | // file2.write( *grids2 ); | ||
| 319 | // file2.close(); | ||
| 320 | // } | ||
| 321 | //::remove(filenames[i].c_str()); | ||
| 322 | } | ||
| 323 | #endif | ||
| 324 | 1 | } | |
| 325 |