| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | // Copyright Contributors to the OpenVDB Project | ||
| 2 | // SPDX-License-Identifier: MPL-2.0 | ||
| 3 | |||
| 4 | #include <openvdb/openvdb.h> | ||
| 5 | #include <openvdb/points/PointDataGrid.h> | ||
| 6 | #include <openvdb/points/PointConversion.h> | ||
| 7 | #include <openvdb/points/PointMask.h> | ||
| 8 | |||
| 9 | #include <gtest/gtest.h> | ||
| 10 | |||
| 11 | #include <algorithm> | ||
| 12 | #include <string> | ||
| 13 | #include <vector> | ||
| 14 | |||
| 15 | using namespace openvdb; | ||
| 16 | using namespace openvdb::points; | ||
| 17 | |||
| 18 | 2 | class TestPointMask: public ::testing::Test | |
| 19 | { | ||
| 20 | public: | ||
| 21 | 2 | void SetUp() override { openvdb::initialize(); } | |
| 22 | 2 | void TearDown() override { openvdb::uninitialize(); } | |
| 23 | }; // class TestPointMask | ||
| 24 | |||
| 25 | |||
| 26 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | TEST_F(TestPointMask, testMask) |
| 27 | { | ||
| 28 | std::vector<Vec3s> positions = { | ||
| 29 | {1, 1, 1}, | ||
| 30 | {1, 5, 1}, | ||
| 31 | {2, 1, 1}, | ||
| 32 | {2, 2, 1}, | ||
| 33 |
1/2✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
|
1 | }; |
| 34 | |||
| 35 | const PointAttributeVector<Vec3s> pointList(positions); | ||
| 36 | |||
| 37 | const float voxelSize = 0.1f; | ||
| 38 | openvdb::math::Transform::Ptr transform( | ||
| 39 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | openvdb::math::Transform::createLinearTransform(voxelSize)); |
| 40 | |||
| 41 | tools::PointIndexGrid::Ptr pointIndexGrid = | ||
| 42 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | tools::createPointIndexGrid<tools::PointIndexGrid>(pointList, *transform); |
| 43 | |||
| 44 | PointDataGrid::Ptr points = | ||
| 45 | createPointDataGrid<NullCodec, PointDataGrid>(*pointIndexGrid, | ||
| 46 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | pointList, *transform); |
| 47 | |||
| 48 | { // simple topology copy | ||
| 49 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | auto mask = convertPointsToMask(*points); |
| 50 | |||
| 51 |
3/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_EQ(points->tree().activeVoxelCount(), Index64(4)); |
| 52 |
3/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_EQ(mask->tree().activeVoxelCount(), Index64(4)); |
| 53 | |||
| 54 | // also test tree function signature | ||
| 55 | ✗ | auto maskTree = convertPointsToMask(points->tree()); | |
| 56 |
3/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_EQ(maskTree->activeVoxelCount(), Index64(4)); |
| 57 |
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(maskTree->hasSameTopology(mask->tree())); |
| 58 | } | ||
| 59 | |||
| 60 | { // mask grid instead of bool grid | ||
| 61 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | auto mask = convertPointsToMask<PointDataGrid, MaskGrid>(*points); |
| 62 | |||
| 63 |
3/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_EQ(points->tree().activeVoxelCount(), Index64(4)); |
| 64 |
3/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_EQ(mask->tree().activeVoxelCount(), Index64(4)); |
| 65 | } | ||
| 66 | |||
| 67 | { // identical transform | ||
| 68 | 1 | auto mask = convertPointsToMask(*points, *transform); | |
| 69 | |||
| 70 |
3/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_EQ(points->tree().activeVoxelCount(), Index64(4)); |
| 71 |
3/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_EQ(mask->tree().activeVoxelCount(), Index64(4)); |
| 72 | } | ||
| 73 | |||
| 74 | // assign point 3 to new group "test" | ||
| 75 | |||
| 76 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | appendGroup(points->tree(), "test"); |
| 77 | |||
| 78 |
1/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
|
1 | std::vector<short> groups{0,0,1,0}; |
| 79 | |||
| 80 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | setGroup(points->tree(), pointIndexGrid->tree(), groups, "test"); |
| 81 | |||
| 82 |
3/8✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
|
3 | std::vector<std::string> includeGroups{"test"}; |
| 83 | 1 | std::vector<std::string> excludeGroups; | |
| 84 | |||
| 85 | { // convert in turn "test" and not "test" | ||
| 86 | MultiGroupFilter filter(includeGroups, excludeGroups, | ||
| 87 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
2 | points->tree().cbeginLeaf()->attributeSet()); |
| 88 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | auto mask = convertPointsToMask(*points, filter); |
| 89 | |||
| 90 |
3/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_EQ(points->tree().activeVoxelCount(), Index64(4)); |
| 91 |
3/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_EQ(mask->tree().activeVoxelCount(), Index64(1)); |
| 92 | |||
| 93 | MultiGroupFilter filter2(excludeGroups, includeGroups, | ||
| 94 |
2/6✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
|
2 | points->tree().cbeginLeaf()->attributeSet()); |
| 95 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | mask = convertPointsToMask(*points, filter2); |
| 96 | |||
| 97 |
3/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_EQ(mask->tree().activeVoxelCount(), Index64(3)); |
| 98 | } | ||
| 99 | |||
| 100 | { // use a much larger voxel size that splits the points into two regions | ||
| 101 | const float newVoxelSize(4); | ||
| 102 | openvdb::math::Transform::Ptr newTransform( | ||
| 103 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | openvdb::math::Transform::createLinearTransform(newVoxelSize)); |
| 104 | |||
| 105 | ✗ | auto mask = convertPointsToMask(*points, *newTransform); | |
| 106 | |||
| 107 |
3/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_EQ(mask->tree().activeVoxelCount(), Index64(2)); |
| 108 | |||
| 109 | MultiGroupFilter filter(includeGroups, excludeGroups, | ||
| 110 |
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.
|
2 | points->tree().cbeginLeaf()->attributeSet()); |
| 111 | 1 | mask = convertPointsToMask(*points, *newTransform, filter); | |
| 112 | |||
| 113 |
3/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_EQ(mask->tree().activeVoxelCount(), Index64(1)); |
| 114 | |||
| 115 | MultiGroupFilter filter2(excludeGroups, includeGroups, | ||
| 116 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
2 | points->tree().cbeginLeaf()->attributeSet()); |
| 117 | 1 | mask = convertPointsToMask(*points, *newTransform, filter2); | |
| 118 | |||
| 119 |
3/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_EQ(mask->tree().activeVoxelCount(), Index64(2)); |
| 120 | } | ||
| 121 | 1 | } | |
| 122 | |||
| 123 | |||
| 124 | struct StaticVoxelDeformer | ||
| 125 | { | ||
| 126 | StaticVoxelDeformer(const Vec3d& position) | ||
| 127 | 1 | : mPosition(position) { } | |
| 128 | |||
| 129 | template <typename LeafT> | ||
| 130 | void reset(LeafT& /*leaf*/, size_t /*idx*/) { } | ||
| 131 | |||
| 132 | template <typename IterT> | ||
| 133 |
1/2✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
|
4 | void apply(Vec3d& position, IterT&) const { position = mPosition; } |
| 134 | |||
| 135 | private: | ||
| 136 | Vec3d mPosition; | ||
| 137 | }; | ||
| 138 | |||
| 139 | template <bool WorldSpace = true> | ||
| 140 | struct YOffsetDeformer | ||
| 141 | { | ||
| 142 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | YOffsetDeformer(const Vec3d& offset) : mOffset(offset) { } |
| 143 | |||
| 144 | template <typename LeafT> | ||
| 145 | void reset(LeafT& /*leaf*/, size_t /*idx*/) { } | ||
| 146 | |||
| 147 | template <typename IterT> | ||
| 148 | void apply(Vec3d& position, IterT&) const { position += mOffset; } | ||
| 149 | |||
| 150 | Vec3d mOffset; | ||
| 151 | }; | ||
| 152 | |||
| 153 | namespace openvdb { | ||
| 154 | OPENVDB_USE_VERSION_NAMESPACE | ||
| 155 | namespace OPENVDB_VERSION_NAME { | ||
| 156 | namespace points { | ||
| 157 | |||
| 158 | // configure both voxel deformers to be applied in index-space | ||
| 159 | |||
| 160 | template<> | ||
| 161 | struct DeformerTraits<StaticVoxelDeformer> { | ||
| 162 | static const bool IndexSpace = true; | ||
| 163 | }; | ||
| 164 | |||
| 165 | template<> | ||
| 166 | struct DeformerTraits<YOffsetDeformer<false>> { | ||
| 167 | static const bool IndexSpace = true; | ||
| 168 | }; | ||
| 169 | |||
| 170 | } // namespace points | ||
| 171 | } // namespace OPENVDB_VERSION_NAME | ||
| 172 | } // namespace openvdb | ||
| 173 | |||
| 174 | |||
| 175 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
2 | TEST_F(TestPointMask, testMaskDeformer) |
| 176 | { | ||
| 177 | // This test validates internal functionality that is used in various applications, such as | ||
| 178 | // building masks and producing count grids. Note that by convention, methods that live | ||
| 179 | // in an "internal" namespace are typically not promoted as part of the public API | ||
| 180 | // and thus do not receive the same level of rigour in avoiding breaking API changes. | ||
| 181 | |||
| 182 | std::vector<Vec3s> positions = { | ||
| 183 | {1, 1, 1}, | ||
| 184 | {1, 5, 1}, | ||
| 185 | {2, 1, 1}, | ||
| 186 | {2, 2, 1}, | ||
| 187 |
1/2✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
|
1 | }; |
| 188 | |||
| 189 | const PointAttributeVector<Vec3s> pointList(positions); | ||
| 190 | |||
| 191 | const float voxelSize = 0.1f; | ||
| 192 | openvdb::math::Transform::Ptr transform( | ||
| 193 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | openvdb::math::Transform::createLinearTransform(voxelSize)); |
| 194 | |||
| 195 | tools::PointIndexGrid::Ptr pointIndexGrid = | ||
| 196 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | tools::createPointIndexGrid<tools::PointIndexGrid>(pointList, *transform); |
| 197 | |||
| 198 | PointDataGrid::Ptr points = | ||
| 199 | createPointDataGrid<NullCodec, PointDataGrid>(*pointIndexGrid, | ||
| 200 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | pointList, *transform); |
| 201 | |||
| 202 | // assign point 3 to new group "test" | ||
| 203 | |||
| 204 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
1 | appendGroup(points->tree(), "test"); |
| 205 | |||
| 206 |
1/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
|
1 | std::vector<short> groups{0,0,1,0}; |
| 207 | |||
| 208 |
3/6✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
|
2 | setGroup(points->tree(), pointIndexGrid->tree(), groups, "test"); |
| 209 | |||
| 210 | NullFilter nullFilter; | ||
| 211 | |||
| 212 | { // null deformer | ||
| 213 | NullDeformer deformer; | ||
| 214 | |||
| 215 | auto mask = point_mask_internal::convertPointsToScalar<MaskGrid>( | ||
| 216 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | *points, *transform, nullFilter, deformer); |
| 217 | |||
| 218 |
1/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
|
1 | auto mask2 = convertPointsToMask(*points); |
| 219 | |||
| 220 |
3/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_EQ(points->tree().activeVoxelCount(), Index64(4)); |
| 221 |
3/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_EQ(mask->tree().activeVoxelCount(), Index64(4)); |
| 222 |
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(mask->tree().hasSameTopology(mask2->tree())); |
| 223 |
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(mask->tree().hasSameTopology(points->tree())); |
| 224 | } | ||
| 225 | |||
| 226 | { // static voxel deformer | ||
| 227 | // collapse all points into a random voxel at (9, 13, 106) | ||
| 228 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | StaticVoxelDeformer deformer(Vec3d(9, 13, 106)); |
| 229 | |||
| 230 | auto mask = point_mask_internal::convertPointsToScalar<MaskGrid>( | ||
| 231 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | *points, *transform, nullFilter, deformer); |
| 232 | |||
| 233 |
3/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_EQ(mask->tree().activeVoxelCount(), Index64(1)); |
| 234 |
1/16✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_TRUE(!mask->tree().cbeginLeaf()->isValueOn(Coord(9, 13, 105))); |
| 235 |
1/16✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_TRUE(mask->tree().cbeginLeaf()->isValueOn(Coord(9, 13, 106))); |
| 236 | } | ||
| 237 | |||
| 238 | { // +y offset deformer | ||
| 239 | Vec3d offset(0, 41.7, 0); | ||
| 240 | YOffsetDeformer</*world-space*/false> deformer(offset); | ||
| 241 | |||
| 242 | auto mask = point_mask_internal::convertPointsToScalar<MaskGrid>( | ||
| 243 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | *points, *transform, nullFilter, deformer); |
| 244 | |||
| 245 | // (repeat with deformer configured as world-space) | ||
| 246 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | YOffsetDeformer</*world-space*/true> deformerWS(offset * voxelSize); |
| 247 | |||
| 248 | auto maskWS = point_mask_internal::convertPointsToScalar<MaskGrid>( | ||
| 249 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | *points, *transform, nullFilter, deformerWS); |
| 250 | |||
| 251 |
3/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_EQ(mask->tree().activeVoxelCount(), Index64(4)); |
| 252 |
3/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_EQ(maskWS->tree().activeVoxelCount(), Index64(4)); |
| 253 | |||
| 254 | std::vector<Coord> maskVoxels; | ||
| 255 | std::vector<Coord> maskVoxelsWS; | ||
| 256 | std::vector<Coord> pointVoxels; | ||
| 257 | |||
| 258 |
2/2✓ Branch 0 taken 4 times.
✓ Branch 1 taken 1 times.
|
5 | for (auto leaf = mask->tree().cbeginLeaf(); leaf; ++leaf) { |
| 259 |
2/2✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
|
8 | for (auto iter = leaf->cbeginValueOn(); iter; ++iter) { |
| 260 |
2/4✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
|
4 | maskVoxels.emplace_back(iter.getCoord()); |
| 261 | } | ||
| 262 | } | ||
| 263 | |||
| 264 |
2/2✓ Branch 0 taken 4 times.
✓ Branch 1 taken 1 times.
|
5 | for (auto leaf = maskWS->tree().cbeginLeaf(); leaf; ++leaf) { |
| 265 |
2/2✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
|
8 | for (auto iter = leaf->cbeginValueOn(); iter; ++iter) { |
| 266 |
2/4✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
|
4 | maskVoxelsWS.emplace_back(iter.getCoord()); |
| 267 | } | ||
| 268 | } | ||
| 269 | |||
| 270 |
2/2✓ Branch 0 taken 4 times.
✓ Branch 1 taken 1 times.
|
5 | for (auto leaf = points->tree().cbeginLeaf(); leaf; ++leaf) { |
| 271 |
2/2✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
|
8 | for (auto iter = leaf->cbeginValueOn(); iter; ++iter) { |
| 272 |
2/4✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
|
4 | pointVoxels.emplace_back(iter.getCoord()); |
| 273 | } | ||
| 274 | } | ||
| 275 | |||
| 276 | 1 | std::sort(maskVoxels.begin(), maskVoxels.end()); | |
| 277 | 1 | std::sort(maskVoxelsWS.begin(), maskVoxelsWS.end()); | |
| 278 | 1 | std::sort(pointVoxels.begin(), pointVoxels.end()); | |
| 279 | |||
| 280 |
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(maskVoxels.size(), size_t(4)); |
| 281 |
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(maskVoxelsWS.size(), size_t(4)); |
| 282 |
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(pointVoxels.size(), size_t(4)); |
| 283 | |||
| 284 |
2/2✓ Branch 0 taken 4 times.
✓ Branch 1 taken 1 times.
|
5 | for (int i = 0; i < int(pointVoxels.size()); i++) { |
| 285 |
1/2✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
|
4 | Coord newCoord(pointVoxels[i]); |
| 286 | 4 | newCoord.x() = static_cast<Int32>(newCoord.x() + offset.x()); | |
| 287 |
1/2✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
|
4 | newCoord.y() = static_cast<Int32>(math::Round(newCoord.y() + offset.y())); |
| 288 |
1/2✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
|
4 | newCoord.z() = static_cast<Int32>(newCoord.z() + offset.z()); |
| 289 |
1/14✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
|
4 | EXPECT_EQ(maskVoxels[i], newCoord); |
| 290 |
1/14✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
|
4 | EXPECT_EQ(maskVoxelsWS[i], newCoord); |
| 291 | } | ||
| 292 | |||
| 293 | // use a different transform to verify deformers and transforms can be used together | ||
| 294 | |||
| 295 | const float newVoxelSize = 0.02f; | ||
| 296 | openvdb::math::Transform::Ptr newTransform( | ||
| 297 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | openvdb::math::Transform::createLinearTransform(newVoxelSize)); |
| 298 | |||
| 299 | auto mask2 = point_mask_internal::convertPointsToScalar<MaskGrid>( | ||
| 300 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | *points, *newTransform, nullFilter, deformer); |
| 301 | |||
| 302 |
3/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_EQ(mask2->tree().activeVoxelCount(), Index64(4)); |
| 303 | |||
| 304 | std::vector<Coord> maskVoxels2; | ||
| 305 | |||
| 306 |
2/2✓ Branch 0 taken 4 times.
✓ Branch 1 taken 1 times.
|
5 | for (auto leaf = mask2->tree().cbeginLeaf(); leaf; ++leaf) { |
| 307 |
2/2✓ Branch 0 taken 4 times.
✓ Branch 1 taken 4 times.
|
8 | for (auto iter = leaf->cbeginValueOn(); iter; ++iter) { |
| 308 |
2/6✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
|
4 | maskVoxels2.emplace_back(iter.getCoord()); |
| 309 | } | ||
| 310 | } | ||
| 311 | |||
| 312 | 1 | std::sort(maskVoxels2.begin(), maskVoxels2.end()); | |
| 313 | |||
| 314 |
2/2✓ Branch 0 taken 4 times.
✓ Branch 1 taken 1 times.
|
5 | for (int i = 0; i < int(maskVoxels.size()); i++) { |
| 315 |
1/2✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
|
4 | Coord newCoord(pointVoxels[i]); |
| 316 | 4 | newCoord.x() = static_cast<Int32>((newCoord.x() + offset.x()) * 5); | |
| 317 |
1/2✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
|
4 | newCoord.y() = static_cast<Int32>(math::Round((newCoord.y() + offset.y()) * 5)); |
| 318 |
1/2✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
|
4 | newCoord.z() = static_cast<Int32>((newCoord.z() + offset.z()) * 5); |
| 319 |
1/14✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
|
4 | EXPECT_EQ(maskVoxels2[i], newCoord); |
| 320 | } | ||
| 321 | |||
| 322 | // only use points in group "test" | ||
| 323 | |||
| 324 |
3/8✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
|
3 | std::vector<std::string> includeGroups{"test"}; |
| 325 | 1 | std::vector<std::string> excludeGroups; | |
| 326 | MultiGroupFilter filter(includeGroups, excludeGroups, | ||
| 327 |
2/4✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
|
2 | points->tree().cbeginLeaf()->attributeSet()); |
| 328 | |||
| 329 | auto mask3 = point_mask_internal::convertPointsToScalar<MaskGrid>( | ||
| 330 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | *points, *transform, filter, deformer); |
| 331 | |||
| 332 |
3/18✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✗ Branch 15 not taken.
✗ Branch 16 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
|
1 | EXPECT_EQ(mask3->tree().activeVoxelCount(), Index64(1)); |
| 333 | |||
| 334 |
2/2✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
|
2 | for (auto leaf = mask3->tree().cbeginLeaf(); leaf; ++leaf) { |
| 335 |
2/2✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
|
2 | for (auto iter = leaf->cbeginValueOn(); iter; ++iter) { |
| 336 | 1 | Coord newCoord(pointVoxels[2]); | |
| 337 | 1 | newCoord.x() = static_cast<Int32>(newCoord.x() + offset.x()); | |
| 338 |
1/2✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
|
1 | newCoord.y() = static_cast<Int32>(math::Round(newCoord.y() + offset.y())); |
| 339 | 1 | newCoord.z() = static_cast<Int32>(newCoord.z() + offset.z()); | |
| 340 |
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.
|
2 | EXPECT_EQ(iter.getCoord(), newCoord); |
| 341 | } | ||
| 342 | } | ||
| 343 | } | ||
| 344 | 1 | } | |
| 345 |