Loading...
Searching...
No Matches
Util.h
Go to the documentation of this file.
// Copyright Contributors to the OpenVDB Project
// SPDX-License-Identifier: MPL-2.0
#ifndef OPENVDB_UTIL_UTIL_HAS_BEEN_INCLUDED
#define OPENVDB_UTIL_UTIL_HAS_BEEN_INCLUDED
#include <openvdb/Types.h>
#include <openvdb/tree/Tree.h>
#include <openvdb/tools/ValueTransformer.h>
#include <openvdb/tools/Prune.h>// for tree::pruneInactive
namespace openvdb {
OPENVDB_USE_VERSION_NAMESPACE
namespace OPENVDB_VERSION_NAME {
namespace util {
OPENVDB_API extern const Index32 INVALID_IDX;
/// @brief coordinate offset table for neighboring voxels
OPENVDB_API extern const Coord COORD_OFFSETS[26];
////////////////////////////////////////
/// Return @a voxelCoord rounded to the closest integer coordinates.
inline Coord
nearestCoord(const Vec3d& voxelCoord)
{
Coord ijk;
ijk[0] = int(std::floor(voxelCoord[0]));
ijk[1] = int(std::floor(voxelCoord[1]));
ijk[2] = int(std::floor(voxelCoord[2]));
return ijk;
}
////////////////////////////////////////
/// @brief Functor for use with tools::foreach() to compute the boolean intersection
/// between the value masks of corresponding leaf nodes in two trees
template<class TreeType1, class TreeType2>
class LeafTopologyIntOp
{
public:
LeafTopologyIntOp(const TreeType2& tree): mOtherTree(&tree) {}
inline void operator()(const typename TreeType1::LeafIter& lIter) const
{
const Coord xyz = lIter->origin();
const typename TreeType2::LeafNodeType* leaf = mOtherTree->probeConstLeaf(xyz);
if (leaf) {//leaf node
lIter->topologyIntersection(*leaf, zeroVal<typename TreeType1::ValueType>());
} else if (!mOtherTree->isValueOn(xyz)) {//inactive tile
lIter->setValuesOff();
}
}
private:
const TreeType2* mOtherTree;
};
/// @brief Functor for use with tools::foreach() to compute the boolean difference
/// between the value masks of corresponding leaf nodes in two trees
template<class TreeType1, class TreeType2>
class LeafTopologyDiffOp
{
public:
LeafTopologyDiffOp(const TreeType2& tree): mOtherTree(&tree) {}
inline void operator()(const typename TreeType1::LeafIter& lIter) const
{
const Coord xyz = lIter->origin();
const typename TreeType2::LeafNodeType* leaf = mOtherTree->probeConstLeaf(xyz);
if (leaf) {//leaf node
lIter->topologyDifference(*leaf, zeroVal<typename TreeType1::ValueType>());
} else if (mOtherTree->isValueOn(xyz)) {//active tile
lIter->setValuesOff();
}
}
private:
const TreeType2* mOtherTree;
};
////////////////////////////////////////
/// @brief Perform a boolean intersection between two leaf nodes' topology masks.
/// @return a pointer to a new, boolean-valued tree containing the overlapping voxels.
template<class TreeType1, class TreeType2>
inline typename TreeType1::template ValueConverter<bool>::Type::Ptr
leafTopologyIntersection(const TreeType1& lhs, const TreeType2& rhs, bool threaded = true)
{
typedef typename TreeType1::template ValueConverter<bool>::Type BoolTreeType;
typename BoolTreeType::Ptr topologyTree(new BoolTreeType(
lhs, /*inactiveValue=*/false, /*activeValue=*/true, TopologyCopy()));
tools::foreach(topologyTree->beginLeaf(),
LeafTopologyIntOp<BoolTreeType, TreeType2>(rhs), threaded);
tools::pruneInactive(*topologyTree, threaded);
return topologyTree;
}
/// @brief Perform a boolean difference between two leaf nodes' topology masks.
/// @return a pointer to a new, boolean-valued tree containing the non-overlapping
/// voxels from the lhs.
template<class TreeType1, class TreeType2>
inline typename TreeType1::template ValueConverter<bool>::Type::Ptr
leafTopologyDifference(const TreeType1& lhs, const TreeType2& rhs, bool threaded = true)
{
typedef typename TreeType1::template ValueConverter<bool>::Type BoolTreeType;
typename BoolTreeType::Ptr topologyTree(new BoolTreeType(
lhs, /*inactiveValue=*/false, /*activeValue=*/true, TopologyCopy()));
tools::foreach(topologyTree->beginLeaf(),
LeafTopologyDiffOp<BoolTreeType, TreeType2>(rhs), threaded);
tools::pruneInactive(*topologyTree, threaded);
return topologyTree;
}
} // namespace util
} // namespace OPENVDB_VERSION_NAME
} // namespace openvdb
#endif // OPENVDB_UTIL_UTIL_HAS_BEEN_INCLUDED
OPENVDB_API
#define OPENVDB_API
Definition Platform.h:251
Prune.h
Defined various multi-threaded utility functions for trees.
Tree.h
ValueTransformer.h
openvdb::v10_0::TopologyCopy
Tag dispatch class that distinguishes topology copy constructors from deep copy constructors.
Definition Types.h:644
openvdb::v10_0::math::Coord
Signed (x, y, z) 32-bit integer coordinates.
Definition Coord.h:25
openvdb::v10_0::util::LeafTopologyDiffOp
Functor for use with tools::foreach() to compute the boolean difference between the value masks of co...
Definition Util.h:70
openvdb::v10_0::util::LeafTopologyDiffOp::LeafTopologyDiffOp
LeafTopologyDiffOp(const TreeType2 &tree)
Definition Util.h:72
openvdb::v10_0::util::LeafTopologyDiffOp::operator()
void operator()(const typename TreeType1::LeafIter &lIter) const
Definition Util.h:74
openvdb::v10_0::util::LeafTopologyIntOp
Functor for use with tools::foreach() to compute the boolean intersection between the value masks of ...
Definition Util.h:46
openvdb::v10_0::util::LeafTopologyIntOp::operator()
void operator()(const typename TreeType1::LeafIter &lIter) const
Definition Util.h:50
openvdb::v10_0::util::LeafTopologyIntOp::LeafTopologyIntOp
LeafTopologyIntOp(const TreeType2 &tree)
Definition Util.h:48
openvdb::v10_0::math::Vec3d
Vec3< double > Vec3d
Definition Vec3.h:664
openvdb::v10_0::tools::foreach
void foreach(const IterT &iter, XformOp &op, bool threaded=true, bool shareOp=true)
Definition ValueTransformer.h:380
openvdb::v10_0::tools::pruneInactive
void pruneInactive(TreeT &tree, bool threaded=true, size_t grainSize=1)
Reduce the memory footprint of a tree by replacing with background tiles any nodes whose values are a...
Definition Prune.h:355
openvdb::v10_0::tree
Definition PointDataGrid.h:169
openvdb::v10_0::util::COORD_OFFSETS
OPENVDB_API const Coord COORD_OFFSETS[26]
coordinate offset table for neighboring voxels
openvdb::v10_0::util::leafTopologyDifference
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
openvdb::v10_0::util::nearestCoord
Coord nearestCoord(const Vec3d &voxelCoord)
Return voxelCoord rounded to the closest integer coordinates.
Definition Util.h:29
openvdb::v10_0::util::INVALID_IDX
OPENVDB_API const Index32 INVALID_IDX
openvdb::v10_0::util::leafTopologyIntersection
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
openvdb::v10_0::Index32
uint32_t Index32
Definition Types.h:52
openvdb::v10_0::zeroVal
T zeroVal()
Return the value of type T that corresponds to zero.
Definition Math.h:70
openvdb
Definition Exceptions.h:13
Types.h
OPENVDB_VERSION_NAME
#define OPENVDB_VERSION_NAME
The version namespace name for this library version.
Definition version.h.in:121
OPENVDB_USE_VERSION_NAMESPACE
#define OPENVDB_USE_VERSION_NAMESPACE
Definition version.h.in:212