Line | Branch | Exec | Source |
---|---|---|---|
1 | // Copyright Contributors to the OpenVDB Project | ||
2 | // SPDX-License-Identifier: MPL-2.0 | ||
3 | |||
4 | #ifndef OPENVDB_UNITTEST_POINT_BUILDER_HAS_BEEN_INCLUDED | ||
5 | #define OPENVDB_UNITTEST_POINT_BUILDER_HAS_BEEN_INCLUDED | ||
6 | |||
7 | #include <openvdb/openvdb.h> | ||
8 | #include <openvdb/tools/PointIndexGrid.h> | ||
9 | #include <openvdb/points/PointAttribute.h> | ||
10 | #include <openvdb/points/PointConversion.h> | ||
11 | |||
12 | /// @brief Get 8 corner points from a cube with a given scale, ordered such | ||
13 | /// that if used for conversion to OpenVDB Points, that the default | ||
14 | /// iteration order remains consistent | ||
15 | inline std::vector<openvdb::Vec3f> | ||
16 | 22 | getBoxPoints(const float scale = 1.0f) | |
17 | { | ||
18 | // This order is configured to be the same layout when | ||
19 | // a vdb points grid is constructed and so matches methods | ||
20 | // like setGroup or populateAttribute | ||
21 | std::vector<openvdb::Vec3f> pos = { | ||
22 | openvdb::Vec3f(-1.0f, -1.0f, -1.0f), | ||
23 | openvdb::Vec3f(-1.0f, -1.0f, 1.0f), | ||
24 | openvdb::Vec3f(-1.0f, 1.0f, -1.0f), | ||
25 | openvdb::Vec3f(-1.0f, 1.0f, 1.0f), | ||
26 | openvdb::Vec3f(1.0f, -1.0f, -1.0f), | ||
27 | openvdb::Vec3f(1.0f, -1.0f, 1.0f), | ||
28 | openvdb::Vec3f(1.0f, 1.0f, -1.0f), | ||
29 | openvdb::Vec3f(1.0f, 1.0f, 1.0f) | ||
30 | 22 | }; | |
31 | |||
32 |
2/2✓ Branch 0 taken 176 times.
✓ Branch 1 taken 22 times.
|
198 | for (auto& p : pos) p *= scale; |
33 | 22 | return pos; | |
34 | } | ||
35 | |||
36 | /// @brief Builder pattern for creating PointDataGrids which simplifies | ||
37 | /// a lot of the repetitive boilerplate | ||
38 | struct PointBuilder | ||
39 | { | ||
40 | using PointDataTreeT = openvdb::points::PointDataTree; | ||
41 | using PointIndexTreeT = openvdb::tools::PointIndexTree; | ||
42 | |||
43 | using CallbackT1 = std::function<void(PointDataTreeT&, const PointIndexTreeT&)>; | ||
44 | using CallbackT2 = std::function<void(PointDataTreeT&)>; | ||
45 | |||
46 | // init the builder with a set of positions | ||
47 |
31/62✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 2 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 2 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 2 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 2 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 2 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✓ Branch 49 taken 2 times.
✗ Branch 50 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 1 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 64 taken 1 times.
✗ Branch 65 not taken.
✓ Branch 67 taken 1 times.
✗ Branch 68 not taken.
✓ Branch 70 taken 1 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 1 times.
✗ Branch 74 not taken.
✓ Branch 76 taken 1 times.
✗ Branch 77 not taken.
✓ Branch 79 taken 1 times.
✗ Branch 80 not taken.
✓ Branch 82 taken 1 times.
✗ Branch 83 not taken.
✓ Branch 85 taken 1 times.
✗ Branch 86 not taken.
✓ Branch 88 taken 1 times.
✗ Branch 89 not taken.
✓ Branch 91 taken 1 times.
✗ Branch 92 not taken.
|
48 | PointBuilder(const std::vector<openvdb::Vec3f>& pos) : positions(pos) {} |
48 | |||
49 | // set the desired voxel size | ||
50 |
31/62✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
✓ Branch 25 taken 1 times.
✗ Branch 26 not taken.
✓ Branch 28 taken 1 times.
✗ Branch 29 not taken.
✓ Branch 31 taken 1 times.
✗ Branch 32 not taken.
✓ Branch 34 taken 1 times.
✗ Branch 35 not taken.
✓ Branch 37 taken 1 times.
✗ Branch 38 not taken.
✓ Branch 40 taken 1 times.
✗ Branch 41 not taken.
✓ Branch 43 taken 1 times.
✗ Branch 44 not taken.
✓ Branch 46 taken 1 times.
✗ Branch 47 not taken.
✓ Branch 49 taken 1 times.
✗ Branch 50 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 55 taken 1 times.
✗ Branch 56 not taken.
✓ Branch 58 taken 1 times.
✗ Branch 59 not taken.
✓ Branch 61 taken 1 times.
✗ Branch 62 not taken.
✓ Branch 64 taken 1 times.
✗ Branch 65 not taken.
✓ Branch 67 taken 1 times.
✗ Branch 68 not taken.
✓ Branch 70 taken 1 times.
✗ Branch 71 not taken.
✓ Branch 73 taken 1 times.
✗ Branch 74 not taken.
✓ Branch 76 taken 1 times.
✗ Branch 77 not taken.
✓ Branch 79 taken 1 times.
✗ Branch 80 not taken.
✓ Branch 82 taken 1 times.
✗ Branch 83 not taken.
✓ Branch 85 taken 1 times.
✗ Branch 86 not taken.
✓ Branch 88 taken 1 times.
✗ Branch 89 not taken.
✓ Branch 91 taken 1 times.
✗ Branch 92 not taken.
|
34 | PointBuilder& voxelsize(double in) { vs = in; return *this; } |
51 | |||
52 | // add a group to be created with membership data | ||
53 | 16 | PointBuilder& group(const std::vector<short>& in, | |
54 | const std::string& name = "group") | ||
55 | { | ||
56 |
1/2✓ Branch 3 taken 16 times.
✗ Branch 4 not taken.
|
16 | callbacks.emplace_back([in, name](PointDataTreeT& tree, const PointIndexTreeT& index) { |
57 | 16 | openvdb::points::appendGroup(tree, name); | |
58 | 16 | openvdb::points::setGroup(tree, index, in, name); | |
59 | 16 | }); | |
60 | 16 | return *this; | |
61 | } | ||
62 | |||
63 | // add a uniform attribute | ||
64 | template <typename ValueT> | ||
65 | 19 | PointBuilder& attribute(const ValueT& in, const std::string& name) | |
66 | { | ||
67 |
3/9✓ Branch 2 taken 19 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 18 times.
✗ Branch 6 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 17 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
|
109 | callbacks.emplace_back([in, name](PointDataTreeT& tree, const PointIndexTreeT&) { |
68 | 18 | openvdb::points::appendAttribute<ValueT>(tree, name, in); | |
69 | }); | ||
70 | 19 | return *this; | |
71 | } | ||
72 | |||
73 | // add a varying attribute | ||
74 | template <typename ValueT> | ||
75 | 46 | PointBuilder& attribute(const std::vector<ValueT>& in, const std::string& name) | |
76 | { | ||
77 |
1/2✓ Branch 3 taken 23 times.
✗ Branch 4 not taken.
|
92 | callbacks.emplace_back([in, name](PointDataTreeT& tree, const PointIndexTreeT& index) { |
78 | 23 | openvdb::points::PointAttributeVector<ValueT> rwrap(in); | |
79 | 23 | openvdb::points::appendAttribute<ValueT>(tree, name); | |
80 | 23 | openvdb::points::populateAttribute(tree, index, name, rwrap); | |
81 | }); | ||
82 | 46 | return *this; | |
83 | } | ||
84 | |||
85 | // add a custom callback of T1 | ||
86 | PointBuilder& callback(const CallbackT1& c) | ||
87 | { | ||
88 | callbacks.emplace_back(c); return *this; | ||
89 | } | ||
90 | |||
91 | // add a custom callback of T2 | ||
92 | PointBuilder& callback(const CallbackT2& c) | ||
93 | { | ||
94 | auto wrap = [c](PointDataTreeT& tree, const PointIndexTreeT&) { c(tree); }; | ||
95 | callbacks.emplace_back(wrap); return *this; | ||
96 | } | ||
97 | |||
98 | // build and return the points | ||
99 | 48 | openvdb::points::PointDataGrid::Ptr get() | |
100 | { | ||
101 | openvdb::math::Transform::Ptr transform = | ||
102 | 48 | openvdb::math::Transform::createLinearTransform(vs); | |
103 |
1/2✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
|
48 | openvdb::points::PointAttributeVector<openvdb::Vec3f> wrap(positions); |
104 |
1/2✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
|
48 | auto index = openvdb::tools::createPointIndexGrid<openvdb::tools::PointIndexGrid>(wrap, vs); |
105 | auto points = openvdb::points::createPointDataGrid<openvdb::points::NullCodec, | ||
106 |
1/2✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
|
48 | openvdb::points::PointDataGrid>(*index, wrap, *transform); |
107 |
4/6✓ Branch 0 taken 57 times.
✓ Branch 1 taken 48 times.
✓ Branch 3 taken 57 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 57 times.
✗ Branch 7 not taken.
|
105 | for (auto c : callbacks) c(points->tree(), index->tree()); |
108 | 48 | return points; | |
109 | } | ||
110 | |||
111 | private: | ||
112 | double vs = 0.1; | ||
113 | std::vector<openvdb::Vec3f> positions = {}; | ||
114 | std::vector<CallbackT1> callbacks = {}; | ||
115 | }; | ||
116 | |||
117 | #endif // OPENVDB_UNITTEST_POINT_BUILDER_HAS_BEEN_INCLUDED | ||
118 |