8 #ifndef __UT_VDBUtils__ 
    9 #define __UT_VDBUtils__ 
   51     using namespace openvdb;
 
   52     using namespace openvdb::tools;
 
  108         return "invalid type";
 
  149 template <
typename T>
 
  165 template <
typename Gr
idType>
 
  170 template <
typename Gr
idType>
 
  175 template <
typename Gr
idType>
 
  180 template <
typename Gr
idType>
 
  185 template <
typename Gr
idType>
 
  186 inline typename GridType::ConstPtr
 
  188     { 
return openvdb::gridConstPtrCast<GridType>(grid); }
 
  190 template <
typename Gr
idType>
 
  191 inline typename GridType::Ptr
 
  193     { 
return openvdb::gridPtrCast<GridType>(grid); }
 
  198 namespace UT_VDBUtils {
 
  203 template<
typename Gr
idType, 
typename OpType, 
typename Gr
idBaseType>
 
  207     op.template operator()<
GridType>(UTvdbGridCast<GridType>(grid));
 
  243 #define UT_VDB_DECL_PROCESS_TYPED_GRID(GRID_BASE_T) \ 
  244 template<typename OpType> \ 
  246 UTvdbProcessTypedGrid(UT_VDBType grid_type, GRID_BASE_T grid, OpType& op) \ 
  248     using namespace openvdb; \ 
  249     using namespace UT_VDBUtils; \ 
  252         case UT_VDB_FLOAT:  callTypedGrid<FloatGrid>(grid, op); break; \ 
  253         case UT_VDB_DOUBLE: callTypedGrid<DoubleGrid>(grid, op); break; \ 
  254         case UT_VDB_INT32:  callTypedGrid<Int32Grid>(grid, op); break; \ 
  255         case UT_VDB_INT64:  callTypedGrid<Int64Grid>(grid, op); break; \ 
  256         case UT_VDB_VEC3F:  callTypedGrid<Vec3SGrid>(grid, op); break; \ 
  257         case UT_VDB_VEC3D:  callTypedGrid<Vec3DGrid>(grid, op); break; \ 
  258         case UT_VDB_VEC3I:  callTypedGrid<Vec3IGrid>(grid, op); break; \ 
  259         default: return false; \ 
  263 template<typename OpType> \ 
  265 UTvdbProcessTypedGridTopology(UT_VDBType grid_type, GRID_BASE_T grid, OpType& op) \ 
  267     using namespace openvdb; \ 
  268     using namespace UT_VDBUtils; \ 
  271         case UT_VDB_FLOAT:  callTypedGrid<FloatGrid>(grid, op); break; \ 
  272         case UT_VDB_DOUBLE: callTypedGrid<DoubleGrid>(grid, op); break; \ 
  273         case UT_VDB_INT32:  callTypedGrid<Int32Grid>(grid, op); break; \ 
  274         case UT_VDB_INT64:  callTypedGrid<Int64Grid>(grid, op); break; \ 
  275         case UT_VDB_VEC3F:  callTypedGrid<Vec3SGrid>(grid, op); break; \ 
  276         case UT_VDB_VEC3D:  callTypedGrid<Vec3DGrid>(grid, op); break; \ 
  277         case UT_VDB_VEC3I:  callTypedGrid<Vec3IGrid>(grid, op); break; \ 
  278         case UT_VDB_BOOL:   callTypedGrid<BoolGrid>(grid, op); break; \ 
  279         default: return false; \ 
  283 template<typename OpType> \ 
  285 UTvdbProcessTypedGridVec3(UT_VDBType grid_type, GRID_BASE_T grid, OpType& op) \ 
  287     using namespace openvdb; \ 
  288     using namespace UT_VDBUtils; \ 
  291         case UT_VDB_VEC3F:  callTypedGrid<Vec3SGrid>(grid, op); break; \ 
  292         case UT_VDB_VEC3D:  callTypedGrid<Vec3DGrid>(grid, op); break; \ 
  293         case UT_VDB_VEC3I:  callTypedGrid<Vec3IGrid>(grid, op); break; \ 
  294         default:            return false; \ 
  298 template<typename OpType> \ 
  300 UTvdbProcessTypedGridScalar(UT_VDBType grid_type, GRID_BASE_T grid, OpType& op) \ 
  302     using namespace openvdb; \ 
  303     using namespace UT_VDBUtils; \ 
  306         case UT_VDB_FLOAT:  callTypedGrid<FloatGrid>(grid, op); break; \ 
  307         case UT_VDB_DOUBLE: callTypedGrid<DoubleGrid>(grid, op); break; \ 
  308         case UT_VDB_INT32:  callTypedGrid<Int32Grid>(grid, op); break; \ 
  309         case UT_VDB_INT64:  callTypedGrid<Int64Grid>(grid, op); break; \ 
  310         default:            return false; \ 
  314 template<typename OpType> \ 
  316 UTvdbProcessTypedGridReal(UT_VDBType grid_type, GRID_BASE_T grid, OpType& op) \ 
  318     using namespace openvdb; \ 
  319     using namespace UT_VDBUtils; \ 
  322         case UT_VDB_FLOAT:  callTypedGrid<FloatGrid>(grid, op); break; \ 
  323         case UT_VDB_DOUBLE: callTypedGrid<DoubleGrid>(grid, op); break; \ 
  324         default:            return false; \ 
  328 template<typename OpType> \ 
  330 UTvdbProcessTypedGridPoint(UT_VDBType grid_type, GRID_BASE_T grid, OpType& op) \ 
  332     using namespace openvdb; \ 
  333     using namespace openvdb::tools; \ 
  334     using namespace openvdb::points; \ 
  335     using namespace UT_VDBUtils; \ 
  338         case UT_VDB_POINTINDEX: callTypedGrid<PointIndexGrid>(grid, op); break; \ 
  339         case UT_VDB_POINTDATA:  callTypedGrid<PointDataGrid>(grid, op); break; \ 
  340         default:                return false; \ 
  356 #define UT_VDB_CALL(GRIDT, RETURN, FNAME, GRIDBASE, ...) \ 
  358         RETURN FNAME <GRIDT> (UTvdbGridCast<GRIDT>(GRIDBASE), __VA_ARGS__ ); \ 
  376 #define UTvdbCallRealType(TYPE, FNAME, GRIDBASE, ...)   \ 
  377     if (TYPE == UT_VDB_FLOAT)   \ 
  378         UT_VDB_CALL(openvdb::FloatGrid,(void),FNAME,GRIDBASE,__VA_ARGS__) \ 
  379     else if (TYPE == UT_VDB_DOUBLE)     \ 
  380         UT_VDB_CALL(openvdb::DoubleGrid,(void),FNAME,GRIDBASE,__VA_ARGS__) \ 
  382 #define UTvdbCallScalarType(TYPE, FNAME, GRIDBASE, ...) \ 
  383     UTvdbCallRealType(TYPE, FNAME, GRIDBASE, __VA_ARGS__)               \ 
  384     else if (TYPE == UT_VDB_INT32)      \ 
  385         UT_VDB_CALL(openvdb::Int32Grid,(void),FNAME,GRIDBASE,__VA_ARGS__) \ 
  386     else if (TYPE == UT_VDB_INT64)      \ 
  387         UT_VDB_CALL(openvdb::Int64Grid,(void),FNAME,GRIDBASE,__VA_ARGS__) \ 
  389 #define UTvdbCallVec3Type(TYPE, FNAME, GRIDBASE, ...)   \ 
  390     if (TYPE == UT_VDB_VEC3F)   \ 
  391         UT_VDB_CALL(openvdb::Vec3fGrid,(void),FNAME,GRIDBASE,__VA_ARGS__) \ 
  392     else if (TYPE == UT_VDB_VEC3D)      \ 
  393         UT_VDB_CALL(openvdb::Vec3dGrid,(void),FNAME,GRIDBASE,__VA_ARGS__) \ 
  394     else if (TYPE == UT_VDB_VEC3I)      \ 
  395         UT_VDB_CALL(openvdb::Vec3IGrid,(void),FNAME,GRIDBASE,__VA_ARGS__) \ 
  397 #define UTvdbCallPointType(TYPE, FNAME, GRIDBASE, ...)  \ 
  398     if (TYPE == UT_VDB_POINTINDEX)      \ 
  399         UT_VDB_CALL(openvdb::tools::PointIndexGrid,(void),FNAME,GRIDBASE,__VA_ARGS__) \ 
  400     else if (TYPE == UT_VDB_POINTDATA)  \ 
  401         UT_VDB_CALL(openvdb::points::PointDataGrid,(void),FNAME,GRIDBASE,__VA_ARGS__) \ 
  403 #define UTvdbCallBoolType(TYPE, FNAME, GRIDBASE, ...)   \ 
  404     if (TYPE == UT_VDB_BOOL) \ 
  405         UT_VDB_CALL(openvdb::BoolGrid,(void),FNAME,GRIDBASE,__VA_ARGS__) \ 
  407 #define UTvdbCallAllType(TYPE, FNAME, GRIDBASE, ...)    \ 
  408     UTvdbCallScalarType(TYPE, FNAME, GRIDBASE, __VA_ARGS__)             \ 
  409     else UTvdbCallVec3Type(TYPE, FNAME, GRIDBASE, __VA_ARGS__); \ 
  411 #define UTvdbCallAllTopology(TYPE, FNAME, GRIDBASE, ...)        \ 
  412     UTvdbCallScalarType(TYPE, FNAME, GRIDBASE, __VA_ARGS__)             \ 
  413     else UTvdbCallVec3Type(TYPE, FNAME, GRIDBASE, __VA_ARGS__) \ 
  414     else UTvdbCallBoolType(TYPE, FNAME, GRIDBASE, __VA_ARGS__) \ 
  436 #define UTvdbReturnRealType(TYPE, FNAME, GRIDBASE, ...) \ 
  437     if (TYPE == UT_VDB_FLOAT)   \ 
  438         UT_VDB_CALL(openvdb::FloatGrid,return,FNAME,GRIDBASE,__VA_ARGS__) \ 
  439     else if (TYPE == UT_VDB_DOUBLE)     \ 
  440         UT_VDB_CALL(openvdb::DoubleGrid,return,FNAME,GRIDBASE,__VA_ARGS__) \ 
  442 #define UTvdbReturnScalarType(TYPE, FNAME, GRIDBASE, ...)       \ 
  443     UTvdbReturnRealType(TYPE, FNAME, GRIDBASE, __VA_ARGS__)             \ 
  444     else if (TYPE == UT_VDB_INT32)      \ 
  445         UT_VDB_CALL(openvdb::Int32Grid,return,FNAME,GRIDBASE,__VA_ARGS__) \ 
  446     else if (TYPE == UT_VDB_INT64)      \ 
  447         UT_VDB_CALL(openvdb::Int64Grid,return,FNAME,GRIDBASE,__VA_ARGS__) \ 
  449 #define UTvdbReturnVec3Type(TYPE, FNAME, GRIDBASE, ...) \ 
  450     if (TYPE == UT_VDB_VEC3F)   \ 
  451         UT_VDB_CALL(openvdb::Vec3fGrid,return,FNAME,GRIDBASE,__VA_ARGS__) \ 
  452     else if (TYPE == UT_VDB_VEC3D)      \ 
  453         UT_VDB_CALL(openvdb::Vec3dGrid,return,FNAME,GRIDBASE,__VA_ARGS__) \ 
  454     else if (TYPE == UT_VDB_VEC3I)      \ 
  455         UT_VDB_CALL(openvdb::Vec3IGrid,return,FNAME,GRIDBASE,__VA_ARGS__) \ 
  457 #define UTvdbReturnPointType(TYPE, FNAME, GRIDBASE, ...)        \ 
  458     if (TYPE == UT_VDB_POINTINDEX)      \ 
  459         UT_VDB_CALL(openvdb::tools::PointIndexGrid,return,FNAME,GRIDBASE,__VA_ARGS__) \ 
  460     else if (TYPE == UT_VDB_POINTDATA)  \ 
  461         UT_VDB_CALL(openvdb::points::PointDataGrid,return,FNAME,GRIDBASE,__VA_ARGS__) \ 
  463 #define UTvdbReturnBoolType(TYPE, FNAME, GRIDBASE, ...)         \ 
  464     if (TYPE == UT_VDB_BOOL) \ 
  465         UT_VDB_CALL(openvdb::BoolGrid,return,FNAME,GRIDBASE,__VA_ARGS__) \ 
  467 #define UTvdbReturnAllType(TYPE, FNAME, GRIDBASE, ...)  \ 
  468     UTvdbReturnScalarType(TYPE, FNAME, GRIDBASE, __VA_ARGS__) \ 
  469     else UTvdbReturnVec3Type(TYPE, FNAME, GRIDBASE, __VA_ARGS__); \ 
  471 #define UTvdbReturnAllTopology(TYPE, FNAME, GRIDBASE, ...)      \ 
  472     UTvdbReturnScalarType(TYPE, FNAME, GRIDBASE, __VA_ARGS__) \ 
  473     else UTvdbReturnVec3Type(TYPE, FNAME, GRIDBASE, __VA_ARGS__) \ 
  474     else UTvdbReturnBoolType(TYPE, FNAME, GRIDBASE, __VA_ARGS__) \ 
  484 template <
typename S>
 
  494 template <
typename S>
 
  503 template <
typename S>
 
  514 template <
typename S>
 
  515 openvdb::math::Mat4<S>
 
  518     return openvdb::math::Mat4<S>(
src(0,0), 
src(0,1), 
src(0,2), 
src(0,3),
 
  523 template <
typename S>
 
  524 openvdb::math::Mat3<S>
 
  527     return openvdb::math::Mat3<S>(
src(0,0), 
src(0,1), 
src(0,2),
 
  531 template <
typename S>
 
  532 openvdb::math::Mat2<S>
 
  535     return openvdb::math::Mat2<S>(
src(0,0), 
src(0,1),
 
  542 template <
typename S>
 
  548 template <
typename S>
 
  554 template <
typename S>
 
  564 template <
typename S>
 
  565 openvdb::math::Vec4<S>
 
  568     return openvdb::math::Vec4<S>(src.
data());
 
  570 template <
typename S>
 
  571 openvdb::math::Vec3<S>
 
  574     return openvdb::math::Vec3<S>(src.
data());
 
  576 template <
typename S>
 
  577 openvdb::math::Vec2<S>
 
  580     return openvdb::math::Vec2<S>(src.
data());
 
  598         openvdb::math::Coord(bbox.
xmin(), bbox.
ymin(), bbox.
zmin()),
 
  599         openvdb::math::Coord(bbox.
xmax(), bbox.
ymax(), bbox.
zmax()));
 
  604 inline openvdb::math::Transform::Ptr
 
  610     openvdb::math::Transform::Ptr xform =
 
  611                             openvdb::math::Transform::createLinearTransform(vs);
 
  617 template <
typename T>
 
  618 inline openvdb::math::Vec4<T>   
SYSabs(
const openvdb::math::Vec4<T> &
v1)
 
  619 {  
return openvdb::math::Vec4<T>( 
SYSabs(v1[0]),
 
  625 template <
typename T>
 
  626 inline openvdb::math::Vec3<T>   
SYSabs(
const openvdb::math::Vec3<T> &
v1)
 
  627 {  
return openvdb::math::Vec3<T>( 
SYSabs(v1[0]),
 
  632 template <
typename T>
 
  633 inline openvdb::math::Vec2<T>   
SYSabs(
const openvdb::math::Vec2<T> &
v1)
 
  634 {  
return openvdb::math::Vec2<T>( 
SYSabs(v1[0]),
 
  639 template <
typename T>
 
  640 inline openvdb::math::Vec4<T>   
SYSmin(
const openvdb::math::Vec4<T> &
v1, 
const openvdb::math::Vec4<T> &
v2)
 
  641 {  
return openvdb::math::Vec4<T>( 
SYSmin(v1[0], v2[0]),
 
  647 template <
typename T>
 
  648 inline openvdb::math::Vec4<T>   
SYSmax(
const openvdb::math::Vec4<T> &
v1, 
const openvdb::math::Vec4<T> &
v2)
 
  649 {  
return openvdb::math::Vec4<T>( 
SYSmax(v1[0], v2[0]),
 
  655 template <
typename T>
 
  656 inline openvdb::math::Vec4<T>   
SYSmin(
const openvdb::math::Vec4<T> &
v1, 
const openvdb::math::Vec4<T> &
v2, 
const openvdb::math::Vec4<T> &
v3)
 
  657 {  
return openvdb::math::Vec4<T>( 
SYSmin(v1[0], v2[0], v3[0]),
 
  658                                   SYSmin(v1[1], v2[1], v3[1]),
 
  659                                   SYSmin(v1[2], v2[2], v3[2]),
 
  660                                   SYSmin(v1[3], v2[3], v3[3])
 
  663 template <
typename T>
 
  664 inline openvdb::math::Vec4<T>   
SYSmax(
const openvdb::math::Vec4<T> &
v1, 
const openvdb::math::Vec4<T> &
v2, 
const openvdb::math::Vec4<T> &
v3)
 
  665 {  
return openvdb::math::Vec4<T>( 
SYSmax(v1[0], v2[0], v3[0]),
 
  666                                   SYSmax(v1[1], v2[1], v3[1]),
 
  667                                   SYSmax(v1[2], v2[2], v3[2]),
 
  668                                   SYSmax(v1[3], v2[3], v3[3])
 
  671 template <
typename T>
 
  672 inline openvdb::math::Vec3<T>   
SYSmin(
const openvdb::math::Vec3<T> &
v1, 
const openvdb::math::Vec3<T> &
v2)
 
  673 {  
return openvdb::math::Vec3<T>( 
SYSmin(v1[0], v2[0]),
 
  678 template <
typename T>
 
  679 inline openvdb::math::Vec3<T>   
SYSmax(
const openvdb::math::Vec3<T> &
v1, 
const openvdb::math::Vec3<T> &
v2)
 
  680 {  
return openvdb::math::Vec3<T>( 
SYSmax(v1[0], v2[0]),
 
  685 template <
typename T>
 
  686 inline openvdb::math::Vec3<T>   
SYSmin(
const openvdb::math::Vec3<T> &
v1, 
const openvdb::math::Vec3<T> &
v2, 
const openvdb::math::Vec3<T> &
v3)
 
  687 {  
return openvdb::math::Vec3<T>( 
SYSmin(v1[0], v2[0], v3[0]),
 
  688                                   SYSmin(v1[1], v2[1], v3[1]),
 
  689                                   SYSmin(v1[2], v2[2], v3[2])
 
  692 template <
typename T>
 
  693 inline openvdb::math::Vec3<T>   
SYSmax(
const openvdb::math::Vec3<T> &
v1, 
const openvdb::math::Vec3<T> &
v2, 
const openvdb::math::Vec3<T> &
v3)
 
  694 {  
return openvdb::math::Vec3<T>( 
SYSmax(v1[0], v2[0], v3[0]),
 
  695                                   SYSmax(v1[1], v2[1], v3[1]),
 
  696                                   SYSmax(v1[2], v2[2], v3[2])
 
  699 template <
typename T>
 
  700 inline openvdb::math::Vec2<T>   
SYSmin(
const openvdb::math::Vec2<T> &
v1, 
const openvdb::math::Vec2<T> &
v2)
 
  701 {  
return openvdb::math::Vec2<T>( 
SYSmin(v1[0], v2[0]),
 
  705 template <
typename T>
 
  706 inline openvdb::math::Vec2<T>   
SYSmax(
const openvdb::math::Vec2<T> &
v1, 
const openvdb::math::Vec2<T> &
v2)
 
  707 {  
return openvdb::math::Vec2<T>( 
SYSmax(v1[0], v2[0]),
 
  711 template <
typename T>
 
  712 inline openvdb::math::Vec2<T>   
SYSmin(
const openvdb::math::Vec2<T> &
v1, 
const openvdb::math::Vec2<T> &
v2, 
const openvdb::math::Vec2<T> &
v3)
 
  713 {  
return openvdb::math::Vec2<T>( 
SYSmin(v1[0], v2[0], v3[0]),
 
  714                                   SYSmin(v1[1], v2[1], v3[1])
 
  717 template <
typename T>
 
  718 inline openvdb::math::Vec2<T>   
SYSmax(
const openvdb::math::Vec2<T> &
v1, 
const openvdb::math::Vec2<T> &
v2, 
const openvdb::math::Vec2<T> &
v3)
 
  719 {  
return openvdb::math::Vec2<T>( 
SYSmax(v1[0], v2[0], v3[0]),
 
  720                                   SYSmax(v1[1], v2[1], v3[1])
 
  724 #endif // __UT_VDBUtils__ 
static void plusEqual(bool &lhs, const bool &rhs)
 
GLdouble GLdouble GLint GLint const GLdouble * points
 
GridType
List of types that are currently supported by NanoVDB. 
 
Grid< Vec3fTree > Vec3fGrid
 
UT_VDBType UTvdbGetGridType(const openvdb::GridBase &grid)
Find the UT_VDBType from a grid. 
 
Grid< DoubleTree > DoubleGrid
 
const GridType * UTvdbGridCast(const openvdb::GridBase *grid)
 
void UTvdbInitialize()
Calls openvdb::initialize() 
 
SYS_FORCE_INLINE TO_T UTverify_cast(FROM_T from)
 
void callTypedGrid(GridBaseType &grid, OpType &op)
 
GLfloat GLfloat GLfloat v2
 
GLfloat GLfloat GLfloat GLfloat v3
 
UT_BoundingBoxT< fpreal64 > UT_BoundingBoxD
 
constexpr SYS_FORCE_INLINE const T * data() const noexcept
 
openvdb::math::Vec4< T > SYSabs(const openvdb::math::Vec4< T > &v1)
 
openvdb::math::Vec4< T > SYSmax(const openvdb::math::Vec4< T > &v1, const openvdb::math::Vec4< T > &v2)
 
constexpr SYS_FORCE_INLINE T minComponent() const noexcept
 
#define UT_VDB_DECL_PROCESS_TYPED_GRID(GRID_BASE_T)
Utility function that, given a generic grid pointer, calls a functor on the fully-resolved grid...
 
Grid< Int64Tree > Int64Grid
 
UT_API size_t format(char *buffer, size_t buffer_size, const UT_VDBType &v)
 
Grid< FloatTree > FloatGrid
 
openvdb::math::Transform::Ptr UTvdbCreateTransform(const UT_Vector3 &orig, const UT_Vector3 &voxsize)
 
GLint GLint GLsizei GLint GLenum GLenum type
 
Grid< Vec3ITree > Vec3IGrid
 
static void plusEqual(T &lhs, const T &rhs)
 
const char * UTvdbGetGridTypeString(const openvdb::GridBase &grid)
Return the string representation of a grid's underlying value type. 
 
UT_API const char * UTvdbType(UT_VDBType t)
 
Grid< PointDataTree > PointDataGrid
Point data grid. 
 
constexpr SYS_FORCE_INLINE const T * data() const noexcept
 
OPENVDB_API void initialize()
Global registration of native Grid, Transform, Metadata and Point attribute types. Also initializes blosc (if enabled). 
 
int UTvdbGetGridTupleSize(UT_VDBType type)
Returns the tuple size of a grid given its value type. 
 
Space-partitioning acceleration structure for points. Partitions the points into voxels to accelerate...
 
constexpr SYS_FORCE_INLINE const T * data() const noexcept
 
Grid< BoolTree > BoolGrid
 
Grid< Vec3dTree > Vec3dGrid
 
openvdb::math::Vec4< T > SYSmin(const openvdb::math::Vec4< T > &v1, const openvdb::math::Vec4< T > &v2)
 
constexpr SYS_FORCE_INLINE T maxComponent() const noexcept
 
Attribute-owned data structure for points. Point attributes are stored in leaf nodes and ordered by v...
 
UT_Matrix4T< S > UTvdbConvert(const openvdb::math::Mat4< S > &src)
Matrix conversion from openvdb to UT. 
 
Grid< Int32Tree > Int32Grid