OpenVDB  7.1.0
PointCount.h
Go to the documentation of this file.
1 // Copyright Contributors to the OpenVDB Project
2 // SPDX-License-Identifier: MPL-2.0
3 
9 
10 #ifndef OPENVDB_POINTS_POINT_COUNT_HAS_BEEN_INCLUDED
11 #define OPENVDB_POINTS_POINT_COUNT_HAS_BEEN_INCLUDED
12 
13 #include <openvdb/openvdb.h>
14 
15 #include "PointDataGrid.h"
16 #include "PointMask.h"
17 #include "IndexFilter.h"
18 
19 #include <tbb/parallel_reduce.h>
20 
21 #include <vector>
22 
23 
24 namespace openvdb {
26 namespace OPENVDB_VERSION_NAME {
27 namespace points {
28 
29 
35 template <typename PointDataTreeT, typename FilterT = NullFilter>
36 inline Index64 pointCount( const PointDataTreeT& tree,
37  const FilterT& filter = NullFilter(),
38  const bool inCoreOnly = false,
39  const bool threaded = true);
40 
41 
49 template <typename PointDataTreeT, typename FilterT = NullFilter>
50 inline Index64 pointOffsets(std::vector<Index64>& pointOffsets,
51  const PointDataTreeT& tree,
52  const FilterT& filter = NullFilter(),
53  const bool inCoreOnly = false,
54  const bool threaded = true);
55 
56 
61 template <typename PointDataGridT,
62  typename GridT = typename PointDataGridT::template ValueConverter<Int32>::Type,
63  typename FilterT = NullFilter>
64 inline typename GridT::Ptr
65 pointCountGrid( const PointDataGridT& grid,
66  const FilterT& filter = NullFilter());
67 
68 
75 template <typename PointDataGridT,
76  typename GridT = typename PointDataGridT::template ValueConverter<Int32>::Type,
77  typename FilterT = NullFilter>
78 inline typename GridT::Ptr
79 pointCountGrid( const PointDataGridT& grid,
80  const openvdb::math::Transform& transform,
81  const FilterT& filter = NullFilter());
82 
83 
85 
86 
87 template <typename PointDataTreeT, typename FilterT>
88 Index64 pointCount(const PointDataTreeT& tree,
89  const FilterT& filter,
90  const bool inCoreOnly,
91  const bool threaded)
92 {
93  using LeafManagerT = tree::LeafManager<const PointDataTreeT>;
94  using LeafRangeT = typename LeafManagerT::LeafRange;
95 
96  auto countLambda =
97  [&filter, &inCoreOnly] (const LeafRangeT& range, Index64 sum) -> Index64 {
98  for (const auto& leaf : range) {
99  if (inCoreOnly && leaf.buffer().isOutOfCore()) continue;
100  auto state = filter.state(leaf);
101  if (state == index::ALL) {
102  sum += leaf.pointCount();
103  } else if (state != index::NONE) {
104  sum += iterCount(leaf.beginIndexAll(filter));
105  }
106  }
107  return sum;
108  };
109 
110  LeafManagerT leafManager(tree);
111  if (threaded) {
112  return tbb::parallel_reduce(leafManager.leafRange(), Index64(0), countLambda,
113  [] (Index64 n, Index64 m) -> Index64 { return n + m; });
114  }
115  else {
116  return countLambda(leafManager.leafRange(), Index64(0));
117  }
118 }
119 
120 
121 template <typename PointDataTreeT, typename FilterT>
122 Index64 pointOffsets( std::vector<Index64>& pointOffsets,
123  const PointDataTreeT& tree,
124  const FilterT& filter,
125  const bool inCoreOnly,
126  const bool threaded)
127 {
128  using LeafT = typename PointDataTreeT::LeafNodeType;
129  using LeafManagerT = typename tree::LeafManager<const PointDataTreeT>;
130 
131  // allocate and zero values in point offsets array
132 
133  pointOffsets.assign(tree.leafCount(), Index64(0));
134 
135  // compute total points per-leaf
136 
137  LeafManagerT leafManager(tree);
138  leafManager.foreach(
139  [&pointOffsets, &filter, &inCoreOnly](const LeafT& leaf, size_t pos) {
140  if (inCoreOnly && leaf.buffer().isOutOfCore()) return;
141  auto state = filter.state(leaf);
142  if (state == index::ALL) {
143  pointOffsets[pos] = leaf.pointCount();
144  } else if (state != index::NONE) {
145  pointOffsets[pos] = iterCount(leaf.beginIndexAll(filter));
146  }
147  },
148  threaded);
149 
150  // turn per-leaf totals into cumulative leaf totals
151 
152  Index64 pointOffset(pointOffsets[0]);
153  for (size_t n = 1; n < pointOffsets.size(); n++) {
154  pointOffset += pointOffsets[n];
155  pointOffsets[n] = pointOffset;
156  }
157 
158  return pointOffset;
159 }
160 
161 
162 template <typename PointDataGridT, typename GridT, typename FilterT>
163 typename GridT::Ptr
164 pointCountGrid( const PointDataGridT& points,
165  const FilterT& filter)
166 {
167  static_assert( std::is_integral<typename GridT::ValueType>::value ||
168  std::is_floating_point<typename GridT::ValueType>::value,
169  "openvdb::points::pointCountGrid must return an integer or floating-point scalar grid");
170 
171  // This is safe because the PointDataGrid can only be modified by the deformer
173  auto& nonConstPoints = const_cast<typename AdapterT::NonConstGridType&>(points);
174 
175  return point_mask_internal::convertPointsToScalar<GridT>(
176  nonConstPoints, filter);
177 }
178 
179 
180 template <typename PointDataGridT, typename GridT, typename FilterT>
181 typename GridT::Ptr
182 pointCountGrid( const PointDataGridT& points,
183  const openvdb::math::Transform& transform,
184  const FilterT& filter)
185 {
186  static_assert( std::is_integral<typename GridT::ValueType>::value ||
187  std::is_floating_point<typename GridT::ValueType>::value,
188  "openvdb::points::pointCountGrid must return an integer or floating-point scalar grid");
189 
190  // This is safe because the PointDataGrid can only be modified by the deformer
192  auto& nonConstPoints = const_cast<typename AdapterT::NonConstGridType&>(points);
193 
194  NullDeformer deformer;
195  return point_mask_internal::convertPointsToScalar<GridT>(
196  nonConstPoints, transform, filter, deformer);
197 }
198 
199 
201 
202 
203 } // namespace points
204 } // namespace OPENVDB_VERSION_NAME
205 } // namespace openvdb
206 
207 #endif // OPENVDB_POINTS_POINT_COUNT_HAS_BEEN_INCLUDED
openvdb::v7_1::points::pointCount
Index64 pointCount(const PointDataTreeT &tree, const FilterT &filter=NullFilter(), const bool inCoreOnly=false, const bool threaded=true)
Count the total number of points in a PointDataTree.
Definition: PointCount.h:88
PointMask.h
Methods for extracting masks from VDB Point grids.
openvdb::v7_1::points::index::NONE
@ NONE
Definition: IndexIterator.h:42
openvdb::v7_1::tree::LeafManager
This class manages a linear array of pointers to a given tree's leaf nodes, as well as optional auxil...
Definition: LeafManager.h:83
openvdb::v7_1::Index64
uint64_t Index64
Definition: Types.h:30
openvdb::v7_1::tree::Tree::ValueConverter< Int32 >::Type
Tree< typename RootNodeType::template ValueConverter< Int32 >::Type > Type
Definition: Tree.h:195
IndexFilter.h
Index filters primarily designed to be used with a FilterIndexIter.
openvdb::v7_1::points::pointCountGrid
GridT::Ptr pointCountGrid(const PointDataGridT &grid, const openvdb::math::Transform &transform, const FilterT &filter=NullFilter())
Generate a new grid that uses the supplied transform with voxel values to store the number of points ...
Definition: PointCount.h:182
PointDataGrid.h
Attribute-owned data structure for points. Point attributes are stored in leaf nodes and ordered by v...
openvdb::v7_1::points::iterCount
Index64 iterCount(const IterT &iter)
Count up the number of times the iterator can iterate.
Definition: IndexIterator.h:314
openvdb::v7_1::TreeAdapter
This adapter allows code that is templated on a Tree type to accept either a Tree type or a Grid type...
Definition: Grid.h:1069
OPENVDB_USE_VERSION_NAMESPACE
#define OPENVDB_USE_VERSION_NAMESPACE
Definition: version.h:146
openvdb::v7_1::points::NullDeformer
No-op deformer (adheres to the deformer interface documented in PointMove.h)
Definition: PointMask.h:65
openvdb::v7_1::points::index::ALL
@ ALL
Definition: IndexIterator.h:43
OPENVDB_VERSION_NAME
#define OPENVDB_VERSION_NAME
The version namespace name for this library version.
Definition: version.h:94
openvdb
Definition: Exceptions.h:13
openvdb.h
openvdb::v7_1::points::pointOffsets
Index64 pointOffsets(std::vector< Index64 > &pointOffsets, const PointDataTreeT &tree, const FilterT &filter=NullFilter(), const bool inCoreOnly=false, const bool threaded=true)
Populate an array of cumulative point offsets per leaf node.
Definition: PointCount.h:122