Loading...
Searching...
No Matches
VectorTransformer.h
Go to the documentation of this file.
// Copyright Contributors to the OpenVDB Project
// SPDX-License-Identifier: MPL-2.0
//
/// @file VectorTransformer.h
#ifndef OPENVDB_TOOLS_VECTORTRANSFORMER_HAS_BEEN_INCLUDED
#define OPENVDB_TOOLS_VECTORTRANSFORMER_HAS_BEEN_INCLUDED
#include <openvdb/Types.h>
#include <openvdb/math/Mat4.h>
#include <openvdb/math/Vec3.h>
#include <openvdb/openvdb.h>
#include "ValueTransformer.h" // for tools::foreach()
#include <type_traits>
namespace openvdb {
OPENVDB_USE_VERSION_NAMESPACE
namespace OPENVDB_VERSION_NAME {
namespace tools {
/// @brief Apply an affine transform to the voxel values of a vector-valued grid
/// in accordance with the grid's vector type (covariant, contravariant, etc.).
/// @throw TypeError if the grid is not vector-valued
template<typename GridType>
void
transformVectors(GridType&, const Mat4d&);
////////////////////////////////////////
// Functors for use with tools::foreach() to transform vector voxel values
struct HomogeneousMatMul
{
const Mat4d mat;
HomogeneousMatMul(const Mat4d& _mat): mat(_mat) {}
template<typename TreeIterT> void operator()(const TreeIterT& it) const
{
Vec3d v(*it);
it.setValue(mat.transformH(v));
}
};
struct MatMul
{
const Mat4d mat;
MatMul(const Mat4d& _mat): mat(_mat) {}
template<typename TreeIterT>
void operator()(const TreeIterT& it) const
{
Vec3d v(*it);
it.setValue(mat.transform3x3(v));
}
};
struct MatMulNormalize
{
const Mat4d mat;
MatMulNormalize(const Mat4d& _mat): mat(_mat) {}
template<typename TreeIterT>
void operator()(const TreeIterT& it) const
{
Vec3d v(*it);
v = mat.transform3x3(v);
v.normalize();
it.setValue(v);
}
};
//{
/// @cond OPENVDB_DOCS_INTERNAL
/// @internal This overload is enabled only for scalar-valued grids.
template<typename GridType> inline
typename std::enable_if<!VecTraits<typename GridType::ValueType>::IsVec, void>::type
doTransformVectors(GridType&, const Mat4d&)
{
OPENVDB_THROW(TypeError, "tools::transformVectors() requires a vector-valued grid");
}
/// @internal This overload is enabled only for vector-valued grids.
template<typename GridType> inline
typename std::enable_if<VecTraits<typename GridType::ValueType>::IsVec, void>::type
doTransformVectors(GridType& grid, const Mat4d& mat)
{
if (!grid.isInWorldSpace()) return;
const VecType vecType = grid.getVectorType();
switch (vecType) {
case VEC_COVARIANT:
case VEC_COVARIANT_NORMALIZE:
{
Mat4d invmat = mat.inverse();
invmat = invmat.transpose();
if (vecType == VEC_COVARIANT_NORMALIZE) {
foreach(grid.beginValueAll(), MatMulNormalize(invmat));
} else {
foreach(grid.beginValueAll(), MatMul(invmat));
}
break;
}
case VEC_CONTRAVARIANT_RELATIVE:
foreach(grid.beginValueAll(), MatMul(mat));
break;
case VEC_CONTRAVARIANT_ABSOLUTE:
foreach(grid.beginValueAll(), HomogeneousMatMul(mat));
break;
case VEC_INVARIANT:
break;
}
}
/// @endcond
//}
template<typename GridType>
void
transformVectors(GridType& grid, const Mat4d& mat)
{
doTransformVectors<GridType>(grid, mat);
}
////////////////////////////////////////
// Explicit Template Instantiation
#ifdef OPENVDB_USE_EXPLICIT_INSTANTIATION
#ifdef OPENVDB_INSTANTIATE_VECTORTRANSFORMER
#include <openvdb/util/ExplicitInstantiation.h>
#endif
#define _FUNCTION(TreeT) \
void transformVectors(Grid<TreeT>&, const Mat4d&)
OPENVDB_VEC3_TREE_INSTANTIATE(_FUNCTION)
#undef _FUNCTION
#endif // OPENVDB_USE_EXPLICIT_INSTANTIATION
} // namespace tools
} // namespace OPENVDB_VERSION_NAME
} // namespace openvdb
#endif // OPENVDB_TOOLS_VECTORTRANSFORMER_HAS_BEEN_INCLUDED
OPENVDB_THROW
#define OPENVDB_THROW(exception, message)
Definition Exceptions.h:74
ExplicitInstantiation.h
Mat4.h
Types.h
ValueTransformer.h
Vec3.h
_mat
#define _mat(m, r, c)
openvdb::v11_0::TypeError
Definition Exceptions.h:64
openvdb::v11_0::math::Mat4::inverse
Mat4 inverse(T tolerance=0) const
Definition Mat4.h:485
openvdb::v11_0::math::Mat4::transpose
Mat4 transpose() const
Definition Mat4.h:472
openvdb::v11_0::math::Vec3::normalize
bool normalize(T eps=T(1.0e-7))
this = normalized this
Definition Vec3.h:362
openvdb::v11_0::math::Vec3d
Vec3< double > Vec3d
Definition Vec3.h:664
openvdb::v11_0::math::Mat4d
Mat4< double > Mat4d
Definition Mat4.h:1354
openvdb::v11_0::tools::transformVectors
void transformVectors(GridType &, const Mat4d &)
Apply an affine transform to the voxel values of a vector-valued grid in accordance with the grid's v...
Definition VectorTransformer.h:126
openvdb::v11_0::VecType
VecType
Definition Types.h:483
openvdb::v11_0::VEC_CONTRAVARIANT_ABSOLUTE
@ VEC_CONTRAVARIANT_ABSOLUTE
Definition Types.h:488
openvdb::v11_0::VEC_CONTRAVARIANT_RELATIVE
@ VEC_CONTRAVARIANT_RELATIVE
Definition Types.h:487
openvdb::v11_0::VEC_COVARIANT
@ VEC_COVARIANT
Definition Types.h:485
openvdb::v11_0::VEC_COVARIANT_NORMALIZE
@ VEC_COVARIANT_NORMALIZE
Definition Types.h:486
openvdb::v11_0::VEC_INVARIANT
@ VEC_INVARIANT
Definition Types.h:484
openvdb
Definition Exceptions.h:13
openvdb.h
openvdb::v11_0::tools::HomogeneousMatMul::HomogeneousMatMul
HomogeneousMatMul(const Mat4d &_mat)
Definition VectorTransformer.h:38
openvdb::v11_0::tools::HomogeneousMatMul::mat
const Mat4d mat
Definition VectorTransformer.h:37
openvdb::v11_0::tools::HomogeneousMatMul::operator()
void operator()(const TreeIterT &it) const
Definition VectorTransformer.h:39
openvdb::v11_0::tools::MatMul::MatMul
MatMul(const Mat4d &_mat)
Definition VectorTransformer.h:49
openvdb::v11_0::tools::MatMul::mat
const Mat4d mat
Definition VectorTransformer.h:48
openvdb::v11_0::tools::MatMul::operator()
void operator()(const TreeIterT &it) const
Definition VectorTransformer.h:51
openvdb::v11_0::tools::MatMulNormalize::MatMulNormalize
MatMulNormalize(const Mat4d &_mat)
Definition VectorTransformer.h:61
openvdb::v11_0::tools::MatMulNormalize::mat
const Mat4d mat
Definition VectorTransformer.h:60
openvdb::v11_0::tools::MatMulNormalize::operator()
void operator()(const TreeIterT &it) const
Definition VectorTransformer.h:63
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
OPENVDB_VEC3_TREE_INSTANTIATE
#define OPENVDB_VEC3_TREE_INSTANTIATE(Function)
Definition version.h.in:159