10#ifndef OPENVDB_POINTS_POINT_COUNT_HAS_BEEN_INCLUDED
11#define OPENVDB_POINTS_POINT_COUNT_HAS_BEEN_INCLUDED
19#include <tbb/parallel_reduce.h>
35template <
typename Po
intDataTreeT,
typename FilterT = NullFilter>
37 const FilterT& filter = NullFilter(),
38 const bool inCoreOnly =
false,
39 const bool threaded =
true);
49template <
typename Po
intDataTreeT,
typename FilterT = NullFilter>
51 const PointDataTreeT& tree,
52 const FilterT& filter = NullFilter(),
53 const bool inCoreOnly =
false,
54 const bool threaded =
true);
61template <
typename PointDataGridT,
62 typename GridT =
typename PointDataGridT::template ValueConverter<Int32>::Type,
63 typename FilterT = NullFilter>
64inline typename GridT::Ptr
66 const FilterT& filter = NullFilter());
75template <
typename PointDataGridT,
76 typename GridT =
typename PointDataGridT::template ValueConverter<Int32>::Type,
77 typename FilterT = NullFilter>
78inline typename GridT::Ptr
80 const openvdb::math::Transform& transform,
81 const FilterT& filter = NullFilter());
87template <
typename Po
intDataTreeT,
typename FilterT>
89 const FilterT& filter,
90 const bool inCoreOnly,
94 using LeafRangeT =
typename LeafManagerT::LeafRange;
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));
110 LeafManagerT leafManager(tree);
112 return tbb::parallel_reduce(leafManager.leafRange(),
Index64(0), countLambda,
116 return countLambda(leafManager.leafRange(),
Index64(0));
121template <
typename Po
intDataTreeT,
typename FilterT>
123 const PointDataTreeT& tree,
124 const FilterT& filter,
125 const bool inCoreOnly,
128 using LeafT =
typename PointDataTreeT::LeafNodeType;
138 LeafManagerT leafManager(tree);
140 [&
pointOffsets, &filter, &inCoreOnly](
const LeafT& leaf,
size_t pos) {
141 if (inCoreOnly && leaf.buffer().isOutOfCore())
return;
142 auto state = filter.state(leaf);
143 if (state == index::ALL) {
145 }
else if (state != index::NONE) {
163template <
typename Po
intDataGr
idT,
typename Gr
idT,
typename FilterT>
166 const FilterT& filter)
168 static_assert(std::is_integral<typename GridT::ValueType>::value ||
169 std::is_floating_point<typename GridT::ValueType>::value,
170 "openvdb::points::pointCountGrid must return an integer or floating-point scalar grid");
172 using PointDataTreeT =
typename PointDataGridT::TreeType;
173 using TreeT =
typename GridT::TreeType;
175 typename TreeT::Ptr tree =
176 point_mask_internal::convertPointsToScalar<TreeT, PointDataTreeT, FilterT>
177 (points.tree(), filter);
179 typename GridT::Ptr grid(
new GridT(tree));
180 grid->setTransform(points.transform().copy());
185template <
typename Po
intDataGr
idT,
typename Gr
idT,
typename FilterT>
188 const openvdb::math::Transform& transform,
189 const FilterT& filter)
191 static_assert( std::is_integral<typename GridT::ValueType>::value ||
192 std::is_floating_point<typename GridT::ValueType>::value,
193 "openvdb::points::pointCountGrid must return an integer or floating-point scalar grid");
197 auto& nonConstPoints =
const_cast<typename AdapterT::NonConstGridType&
>(points);
200 return point_mask_internal::convertPointsToScalar<GridT>(
201 nonConstPoints, transform, filter, deformer);
Index filters primarily designed to be used with a FilterIndexIter.
Attribute-owned data structure for points. Point attributes are stored in leaf nodes and ordered by v...
Methods for extracting masks from VDB Point grids.
This class manages a linear array of pointers to a given tree's leaf nodes, as well as optional auxil...
Definition LeafManager.h:85
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
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
GridT::Ptr pointCountGrid(const PointDataGridT &grid, const FilterT &filter=NullFilter())
Generate a new grid with voxel values to store the number of points per voxel.
Definition PointCount.h:165
Index64 iterCount(const IterT &iter)
Count up the number of times the iterator can iterate.
Definition IndexIterator.h:314
uint64_t Index64
Definition Types.h:53
Definition Exceptions.h:13
This adapter allows code that is templated on a Tree type to accept either a Tree type or a Grid type...
Definition Grid.h:1060
#define OPENVDB_VERSION_NAME
The version namespace name for this library version.
Definition version.h.in:121
#define OPENVDB_USE_VERSION_NAMESPACE
Definition version.h.in:212