OpenVDB 10.0.1
Loading...
Searching...
No Matches
Util.h
Go to the documentation of this file.
1// Copyright Contributors to the OpenVDB Project
2// SPDX-License-Identifier: MPL-2.0
3
4#ifndef OPENVDB_UTIL_UTIL_HAS_BEEN_INCLUDED
5#define OPENVDB_UTIL_UTIL_HAS_BEEN_INCLUDED
6
7#include <openvdb/Types.h>
8#include <openvdb/tree/Tree.h>
10#include <openvdb/tools/Prune.h>// for tree::pruneInactive
11
12
13namespace openvdb {
15namespace OPENVDB_VERSION_NAME {
16namespace util {
17
19
20/// @brief coordinate offset table for neighboring voxels
21OPENVDB_API extern const Coord COORD_OFFSETS[26];
22
23
24////////////////////////////////////////
25
26
27/// Return @a voxelCoord rounded to the closest integer coordinates.
28inline Coord
29nearestCoord(const Vec3d& voxelCoord)
30{
31 Coord ijk;
32 ijk[0] = int(std::floor(voxelCoord[0]));
33 ijk[1] = int(std::floor(voxelCoord[1]));
34 ijk[2] = int(std::floor(voxelCoord[2]));
35 return ijk;
36}
37
38
39////////////////////////////////////////
40
41
42/// @brief Functor for use with tools::foreach() to compute the boolean intersection
43/// between the value masks of corresponding leaf nodes in two trees
44template<class TreeType1, class TreeType2>
46{
47public:
48 LeafTopologyIntOp(const TreeType2& tree): mOtherTree(&tree) {}
49
50 inline void operator()(const typename TreeType1::LeafIter& lIter) const
51 {
52 const Coord xyz = lIter->origin();
53 const typename TreeType2::LeafNodeType* leaf = mOtherTree->probeConstLeaf(xyz);
54 if (leaf) {//leaf node
55 lIter->topologyIntersection(*leaf, zeroVal<typename TreeType1::ValueType>());
56 } else if (!mOtherTree->isValueOn(xyz)) {//inactive tile
57 lIter->setValuesOff();
58 }
59 }
60
61private:
62 const TreeType2* mOtherTree;
63};
64
65
66/// @brief Functor for use with tools::foreach() to compute the boolean difference
67/// between the value masks of corresponding leaf nodes in two trees
68template<class TreeType1, class TreeType2>
70{
71public:
72 LeafTopologyDiffOp(const TreeType2& tree): mOtherTree(&tree) {}
73
74 inline void operator()(const typename TreeType1::LeafIter& lIter) const
75 {
76 const Coord xyz = lIter->origin();
77 const typename TreeType2::LeafNodeType* leaf = mOtherTree->probeConstLeaf(xyz);
78 if (leaf) {//leaf node
79 lIter->topologyDifference(*leaf, zeroVal<typename TreeType1::ValueType>());
80 } else if (mOtherTree->isValueOn(xyz)) {//active tile
81 lIter->setValuesOff();
82 }
83 }
84
85private:
86 const TreeType2* mOtherTree;
87};
88
89
90////////////////////////////////////////
91
92
93/// @brief Perform a boolean intersection between two leaf nodes' topology masks.
94/// @return a pointer to a new, boolean-valued tree containing the overlapping voxels.
95template<class TreeType1, class TreeType2>
96inline typename TreeType1::template ValueConverter<bool>::Type::Ptr
97leafTopologyIntersection(const TreeType1& lhs, const TreeType2& rhs, bool threaded = true)
98{
99 typedef typename TreeType1::template ValueConverter<bool>::Type BoolTreeType;
100
101 typename BoolTreeType::Ptr topologyTree(new BoolTreeType(
102 lhs, /*inactiveValue=*/false, /*activeValue=*/true, TopologyCopy()));
103
104 tools::foreach(topologyTree->beginLeaf(),
106
107 tools::pruneInactive(*topologyTree, threaded);
108 return topologyTree;
109}
110
111
112/// @brief Perform a boolean difference between two leaf nodes' topology masks.
113/// @return a pointer to a new, boolean-valued tree containing the non-overlapping
114/// voxels from the lhs.
115template<class TreeType1, class TreeType2>
116inline typename TreeType1::template ValueConverter<bool>::Type::Ptr
117leafTopologyDifference(const TreeType1& lhs, const TreeType2& rhs, bool threaded = true)
118{
119 typedef typename TreeType1::template ValueConverter<bool>::Type BoolTreeType;
120
121 typename BoolTreeType::Ptr topologyTree(new BoolTreeType(
122 lhs, /*inactiveValue=*/false, /*activeValue=*/true, TopologyCopy()));
123
124 tools::foreach(topologyTree->beginLeaf(),
126
127 tools::pruneInactive(*topologyTree, threaded);
128 return topologyTree;
129}
130
131} // namespace util
132} // namespace OPENVDB_VERSION_NAME
133} // namespace openvdb
134
135#endif // OPENVDB_UTIL_UTIL_HAS_BEEN_INCLUDED
#define OPENVDB_API
Definition Platform.h:251
Defined various multi-threaded utility functions for trees.
Tag dispatch class that distinguishes topology copy constructors from deep copy constructors.
Definition Types.h:644
Signed (x, y, z) 32-bit integer coordinates.
Definition Coord.h:25
Functor for use with tools::foreach() to compute the boolean difference between the value masks of co...
Definition Util.h:70
LeafTopologyDiffOp(const TreeType2 &tree)
Definition Util.h:72
void operator()(const typename TreeType1::LeafIter &lIter) const
Definition Util.h:74
Functor for use with tools::foreach() to compute the boolean intersection between the value masks of ...
Definition Util.h:46
void operator()(const typename TreeType1::LeafIter &lIter) const
Definition Util.h:50
LeafTopologyIntOp(const TreeType2 &tree)
Definition Util.h:48
OPENVDB_API const Coord COORD_OFFSETS[26]
coordinate offset table for neighboring voxels
TreeType1::template ValueConverter< bool >::Type::Ptr leafTopologyDifference(const TreeType1 &lhs, const TreeType2 &rhs, bool threaded=true)
Perform a boolean difference between two leaf nodes' topology masks.
Definition Util.h:117
Coord nearestCoord(const Vec3d &voxelCoord)
Return voxelCoord rounded to the closest integer coordinates.
Definition Util.h:29
OPENVDB_API const Index32 INVALID_IDX
TreeType1::template ValueConverter< bool >::Type::Ptr leafTopologyIntersection(const TreeType1 &lhs, const TreeType2 &rhs, bool threaded=true)
Perform a boolean intersection between two leaf nodes' topology masks.
Definition Util.h:97
uint32_t Index32
Definition Types.h:52
Definition Exceptions.h:13
#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