8 #ifndef __UT_VDBUtils__
9 #define __UT_VDBUtils__
52 using namespace openvdb;
53 using namespace openvdb::tools;
109 return "invalid type";
150 template <
typename T>
166 template <
typename Gr
idType>
171 template <
typename Gr
idType>
176 template <
typename Gr
idType>
181 template <
typename Gr
idType>
186 template <
typename Gr
idType>
187 inline typename GridType::ConstPtr
189 {
return openvdb::gridConstPtrCast<GridType>(grid); }
191 template <
typename Gr
idType>
192 inline typename GridType::Ptr
194 {
return openvdb::gridPtrCast<GridType>(grid); }
199 namespace UT_VDBUtils {
204 template<
typename Gr
idType,
typename OpType,
typename Gr
idBaseType>
208 op.template operator()<
GridType>(UTvdbGridCast<GridType>(grid));
244 #define UT_VDB_DECL_PROCESS_TYPED_GRID(GRID_BASE_T) \
245 template<typename OpType> \
247 UTvdbProcessTypedGrid(UT_VDBType grid_type, GRID_BASE_T grid, OpType& op) \
249 using namespace openvdb; \
250 using namespace UT_VDBUtils; \
253 case UT_VDB_FLOAT: callTypedGrid<FloatGrid>(grid, op); break; \
254 case UT_VDB_DOUBLE: callTypedGrid<DoubleGrid>(grid, op); break; \
255 case UT_VDB_INT32: callTypedGrid<Int32Grid>(grid, op); break; \
256 case UT_VDB_INT64: callTypedGrid<Int64Grid>(grid, op); break; \
257 case UT_VDB_VEC3F: callTypedGrid<Vec3SGrid>(grid, op); break; \
258 case UT_VDB_VEC3D: callTypedGrid<Vec3DGrid>(grid, op); break; \
259 case UT_VDB_VEC3I: callTypedGrid<Vec3IGrid>(grid, op); break; \
260 default: return false; \
264 template<typename OpType> \
266 UTvdbProcessTypedGridTopology(UT_VDBType grid_type, GRID_BASE_T grid, OpType& op) \
268 using namespace openvdb; \
269 using namespace UT_VDBUtils; \
272 case UT_VDB_FLOAT: callTypedGrid<FloatGrid>(grid, op); break; \
273 case UT_VDB_DOUBLE: callTypedGrid<DoubleGrid>(grid, op); break; \
274 case UT_VDB_INT32: callTypedGrid<Int32Grid>(grid, op); break; \
275 case UT_VDB_INT64: callTypedGrid<Int64Grid>(grid, op); break; \
276 case UT_VDB_VEC3F: callTypedGrid<Vec3SGrid>(grid, op); break; \
277 case UT_VDB_VEC3D: callTypedGrid<Vec3DGrid>(grid, op); break; \
278 case UT_VDB_VEC3I: callTypedGrid<Vec3IGrid>(grid, op); break; \
279 case UT_VDB_BOOL: callTypedGrid<BoolGrid>(grid, op); break; \
280 default: return false; \
284 template<typename OpType> \
286 UTvdbProcessTypedGridVec3(UT_VDBType grid_type, GRID_BASE_T grid, OpType& op) \
288 using namespace openvdb; \
289 using namespace UT_VDBUtils; \
292 case UT_VDB_VEC3F: callTypedGrid<Vec3SGrid>(grid, op); break; \
293 case UT_VDB_VEC3D: callTypedGrid<Vec3DGrid>(grid, op); break; \
294 case UT_VDB_VEC3I: callTypedGrid<Vec3IGrid>(grid, op); break; \
295 default: return false; \
299 template<typename OpType> \
301 UTvdbProcessTypedGridScalar(UT_VDBType grid_type, GRID_BASE_T grid, OpType& op) \
303 using namespace openvdb; \
304 using namespace UT_VDBUtils; \
307 case UT_VDB_FLOAT: callTypedGrid<FloatGrid>(grid, op); break; \
308 case UT_VDB_DOUBLE: callTypedGrid<DoubleGrid>(grid, op); break; \
309 case UT_VDB_INT32: callTypedGrid<Int32Grid>(grid, op); break; \
310 case UT_VDB_INT64: callTypedGrid<Int64Grid>(grid, op); break; \
311 default: return false; \
315 template<typename OpType> \
317 UTvdbProcessTypedGridReal(UT_VDBType grid_type, GRID_BASE_T grid, OpType& op) \
319 using namespace openvdb; \
320 using namespace UT_VDBUtils; \
323 case UT_VDB_FLOAT: callTypedGrid<FloatGrid>(grid, op); break; \
324 case UT_VDB_DOUBLE: callTypedGrid<DoubleGrid>(grid, op); break; \
325 default: return false; \
329 template<typename OpType> \
331 UTvdbProcessTypedGridPoint(UT_VDBType grid_type, GRID_BASE_T grid, OpType& op) \
333 using namespace openvdb; \
334 using namespace openvdb::tools; \
335 using namespace openvdb::points; \
336 using namespace UT_VDBUtils; \
339 case UT_VDB_POINTINDEX: callTypedGrid<PointIndexGrid>(grid, op); break; \
340 case UT_VDB_POINTDATA: callTypedGrid<PointDataGrid>(grid, op); break; \
341 default: return false; \
357 #define UT_VDB_CALL(GRIDT, RETURN, FNAME, GRIDBASE, ...) \
359 RETURN FNAME <GRIDT> (UTvdbGridCast<GRIDT>(GRIDBASE), __VA_ARGS__ ); \
377 #define UTvdbCallRealType(TYPE, FNAME, GRIDBASE, ...) \
378 if (TYPE == UT_VDB_FLOAT) \
379 UT_VDB_CALL(openvdb::FloatGrid,(void),FNAME,GRIDBASE,__VA_ARGS__) \
380 else if (TYPE == UT_VDB_DOUBLE) \
381 UT_VDB_CALL(openvdb::DoubleGrid,(void),FNAME,GRIDBASE,__VA_ARGS__) \
383 #define UTvdbCallScalarType(TYPE, FNAME, GRIDBASE, ...) \
384 UTvdbCallRealType(TYPE, FNAME, GRIDBASE, __VA_ARGS__) \
385 else if (TYPE == UT_VDB_INT32) \
386 UT_VDB_CALL(openvdb::Int32Grid,(void),FNAME,GRIDBASE,__VA_ARGS__) \
387 else if (TYPE == UT_VDB_INT64) \
388 UT_VDB_CALL(openvdb::Int64Grid,(void),FNAME,GRIDBASE,__VA_ARGS__) \
390 #define UTvdbCallVec3Type(TYPE, FNAME, GRIDBASE, ...) \
391 if (TYPE == UT_VDB_VEC3F) \
392 UT_VDB_CALL(openvdb::Vec3fGrid,(void),FNAME,GRIDBASE,__VA_ARGS__) \
393 else if (TYPE == UT_VDB_VEC3D) \
394 UT_VDB_CALL(openvdb::Vec3dGrid,(void),FNAME,GRIDBASE,__VA_ARGS__) \
395 else if (TYPE == UT_VDB_VEC3I) \
396 UT_VDB_CALL(openvdb::Vec3IGrid,(void),FNAME,GRIDBASE,__VA_ARGS__) \
398 #define UTvdbCallPointType(TYPE, FNAME, GRIDBASE, ...) \
399 if (TYPE == UT_VDB_POINTINDEX) \
400 UT_VDB_CALL(openvdb::tools::PointIndexGrid,(void),FNAME,GRIDBASE,__VA_ARGS__) \
401 else if (TYPE == UT_VDB_POINTDATA) \
402 UT_VDB_CALL(openvdb::points::PointDataGrid,(void),FNAME,GRIDBASE,__VA_ARGS__) \
404 #define UTvdbCallBoolType(TYPE, FNAME, GRIDBASE, ...) \
405 if (TYPE == UT_VDB_BOOL) \
406 UT_VDB_CALL(openvdb::BoolGrid,(void),FNAME,GRIDBASE,__VA_ARGS__) \
408 #define UTvdbCallAllType(TYPE, FNAME, GRIDBASE, ...) \
409 UTvdbCallScalarType(TYPE, FNAME, GRIDBASE, __VA_ARGS__) \
410 else UTvdbCallVec3Type(TYPE, FNAME, GRIDBASE, __VA_ARGS__); \
412 #define UTvdbCallAllTopology(TYPE, FNAME, GRIDBASE, ...) \
413 UTvdbCallScalarType(TYPE, FNAME, GRIDBASE, __VA_ARGS__) \
414 else UTvdbCallVec3Type(TYPE, FNAME, GRIDBASE, __VA_ARGS__) \
415 else UTvdbCallBoolType(TYPE, FNAME, GRIDBASE, __VA_ARGS__) \
437 #define UTvdbReturnRealType(TYPE, FNAME, GRIDBASE, ...) \
438 if (TYPE == UT_VDB_FLOAT) \
439 UT_VDB_CALL(openvdb::FloatGrid,return,FNAME,GRIDBASE,__VA_ARGS__) \
440 else if (TYPE == UT_VDB_DOUBLE) \
441 UT_VDB_CALL(openvdb::DoubleGrid,return,FNAME,GRIDBASE,__VA_ARGS__) \
443 #define UTvdbReturnScalarType(TYPE, FNAME, GRIDBASE, ...) \
444 UTvdbReturnRealType(TYPE, FNAME, GRIDBASE, __VA_ARGS__) \
445 else if (TYPE == UT_VDB_INT32) \
446 UT_VDB_CALL(openvdb::Int32Grid,return,FNAME,GRIDBASE,__VA_ARGS__) \
447 else if (TYPE == UT_VDB_INT64) \
448 UT_VDB_CALL(openvdb::Int64Grid,return,FNAME,GRIDBASE,__VA_ARGS__) \
450 #define UTvdbReturnVec3Type(TYPE, FNAME, GRIDBASE, ...) \
451 if (TYPE == UT_VDB_VEC3F) \
452 UT_VDB_CALL(openvdb::Vec3fGrid,return,FNAME,GRIDBASE,__VA_ARGS__) \
453 else if (TYPE == UT_VDB_VEC3D) \
454 UT_VDB_CALL(openvdb::Vec3dGrid,return,FNAME,GRIDBASE,__VA_ARGS__) \
455 else if (TYPE == UT_VDB_VEC3I) \
456 UT_VDB_CALL(openvdb::Vec3IGrid,return,FNAME,GRIDBASE,__VA_ARGS__) \
458 #define UTvdbReturnPointType(TYPE, FNAME, GRIDBASE, ...) \
459 if (TYPE == UT_VDB_POINTINDEX) \
460 UT_VDB_CALL(openvdb::tools::PointIndexGrid,return,FNAME,GRIDBASE,__VA_ARGS__) \
461 else if (TYPE == UT_VDB_POINTDATA) \
462 UT_VDB_CALL(openvdb::points::PointDataGrid,return,FNAME,GRIDBASE,__VA_ARGS__) \
464 #define UTvdbReturnBoolType(TYPE, FNAME, GRIDBASE, ...) \
465 if (TYPE == UT_VDB_BOOL) \
466 UT_VDB_CALL(openvdb::BoolGrid,return,FNAME,GRIDBASE,__VA_ARGS__) \
468 #define UTvdbReturnAllType(TYPE, FNAME, GRIDBASE, ...) \
469 UTvdbReturnScalarType(TYPE, FNAME, GRIDBASE, __VA_ARGS__) \
470 else UTvdbReturnVec3Type(TYPE, FNAME, GRIDBASE, __VA_ARGS__); \
472 #define UTvdbReturnAllTopology(TYPE, FNAME, GRIDBASE, ...) \
473 UTvdbReturnScalarType(TYPE, FNAME, GRIDBASE, __VA_ARGS__) \
474 else UTvdbReturnVec3Type(TYPE, FNAME, GRIDBASE, __VA_ARGS__) \
475 else UTvdbReturnBoolType(TYPE, FNAME, GRIDBASE, __VA_ARGS__) \
485 template <
typename S>
495 template <
typename S>
504 template <
typename S>
515 template <
typename S>
516 openvdb::math::Mat4<S>
519 return openvdb::math::Mat4<S>(
src(0,0),
src(0,1),
src(0,2),
src(0,3),
524 template <
typename S>
525 openvdb::math::Mat3<S>
528 return openvdb::math::Mat3<S>(
src(0,0),
src(0,1),
src(0,2),
532 template <
typename S>
533 openvdb::math::Mat2<S>
536 return openvdb::math::Mat2<S>(
src(0,0),
src(0,1),
543 template <
typename S>
549 template <
typename S>
555 template <
typename S>
565 template <
typename S>
566 openvdb::math::Vec4<S>
569 return openvdb::math::Vec4<S>(src.
data());
571 template <
typename S>
572 openvdb::math::Vec3<S>
575 return openvdb::math::Vec3<S>(src.
data());
577 template <
typename S>
578 openvdb::math::Vec2<S>
581 return openvdb::math::Vec2<S>(src.
data());
599 openvdb::math::Coord(bbox.
xmin(), bbox.
ymin(), bbox.
zmin()),
600 openvdb::math::Coord(bbox.
xmax(), bbox.
ymax(), bbox.
zmax()));
605 inline openvdb::math::Transform::Ptr
611 openvdb::math::Transform::Ptr
xform =
612 openvdb::math::Transform::createLinearTransform(vs);
618 template <
typename T>
619 inline openvdb::math::Vec4<T>
SYSabs(
const openvdb::math::Vec4<T> &
v1)
620 {
return openvdb::math::Vec4<T>(
SYSabs(v1[0]),
626 template <
typename T>
627 inline openvdb::math::Vec3<T>
SYSabs(
const openvdb::math::Vec3<T> &
v1)
628 {
return openvdb::math::Vec3<T>(
SYSabs(v1[0]),
633 template <
typename T>
634 inline openvdb::math::Vec2<T>
SYSabs(
const openvdb::math::Vec2<T> &
v1)
635 {
return openvdb::math::Vec2<T>(
SYSabs(v1[0]),
640 template <
typename T>
641 inline openvdb::math::Vec4<T>
SYSmin(
const openvdb::math::Vec4<T> &
v1,
const openvdb::math::Vec4<T> &
v2)
642 {
return openvdb::math::Vec4<T>(
SYSmin(v1[0], v2[0]),
648 template <
typename T>
649 inline openvdb::math::Vec4<T>
SYSmax(
const openvdb::math::Vec4<T> &
v1,
const openvdb::math::Vec4<T> &
v2)
650 {
return openvdb::math::Vec4<T>(
SYSmax(v1[0], v2[0]),
656 template <
typename T>
657 inline openvdb::math::Vec4<T>
SYSmin(
const openvdb::math::Vec4<T> &
v1,
const openvdb::math::Vec4<T> &
v2,
const openvdb::math::Vec4<T> &
v3)
658 {
return openvdb::math::Vec4<T>(
SYSmin(v1[0], v2[0], v3[0]),
659 SYSmin(v1[1], v2[1], v3[1]),
660 SYSmin(v1[2], v2[2], v3[2]),
661 SYSmin(v1[3], v2[3], v3[3])
664 template <
typename T>
665 inline openvdb::math::Vec4<T>
SYSmax(
const openvdb::math::Vec4<T> &
v1,
const openvdb::math::Vec4<T> &
v2,
const openvdb::math::Vec4<T> &
v3)
666 {
return openvdb::math::Vec4<T>(
SYSmax(v1[0], v2[0], v3[0]),
667 SYSmax(v1[1], v2[1], v3[1]),
668 SYSmax(v1[2], v2[2], v3[2]),
669 SYSmax(v1[3], v2[3], v3[3])
672 template <
typename T>
673 inline openvdb::math::Vec3<T>
SYSmin(
const openvdb::math::Vec3<T> &
v1,
const openvdb::math::Vec3<T> &
v2)
674 {
return openvdb::math::Vec3<T>(
SYSmin(v1[0], v2[0]),
679 template <
typename T>
680 inline openvdb::math::Vec3<T>
SYSmax(
const openvdb::math::Vec3<T> &
v1,
const openvdb::math::Vec3<T> &
v2)
681 {
return openvdb::math::Vec3<T>(
SYSmax(v1[0], v2[0]),
686 template <
typename T>
687 inline openvdb::math::Vec3<T>
SYSmin(
const openvdb::math::Vec3<T> &
v1,
const openvdb::math::Vec3<T> &
v2,
const openvdb::math::Vec3<T> &
v3)
688 {
return openvdb::math::Vec3<T>(
SYSmin(v1[0], v2[0], v3[0]),
689 SYSmin(v1[1], v2[1], v3[1]),
690 SYSmin(v1[2], v2[2], v3[2])
693 template <
typename T>
694 inline openvdb::math::Vec3<T>
SYSmax(
const openvdb::math::Vec3<T> &
v1,
const openvdb::math::Vec3<T> &
v2,
const openvdb::math::Vec3<T> &
v3)
695 {
return openvdb::math::Vec3<T>(
SYSmax(v1[0], v2[0], v3[0]),
696 SYSmax(v1[1], v2[1], v3[1]),
697 SYSmax(v1[2], v2[2], v3[2])
700 template <
typename T>
701 inline openvdb::math::Vec2<T>
SYSmin(
const openvdb::math::Vec2<T> &
v1,
const openvdb::math::Vec2<T> &
v2)
702 {
return openvdb::math::Vec2<T>(
SYSmin(v1[0], v2[0]),
706 template <
typename T>
707 inline openvdb::math::Vec2<T>
SYSmax(
const openvdb::math::Vec2<T> &
v1,
const openvdb::math::Vec2<T> &
v2)
708 {
return openvdb::math::Vec2<T>(
SYSmax(v1[0], v2[0]),
712 template <
typename T>
713 inline openvdb::math::Vec2<T>
SYSmin(
const openvdb::math::Vec2<T> &
v1,
const openvdb::math::Vec2<T> &
v2,
const openvdb::math::Vec2<T> &
v3)
714 {
return openvdb::math::Vec2<T>(
SYSmin(v1[0], v2[0], v3[0]),
715 SYSmin(v1[1], v2[1], v3[1])
718 template <
typename T>
719 inline openvdb::math::Vec2<T>
SYSmax(
const openvdb::math::Vec2<T> &
v1,
const openvdb::math::Vec2<T> &
v2,
const openvdb::math::Vec2<T> &
v3)
720 {
return openvdb::math::Vec2<T>(
SYSmax(v1[0], v2[0], v3[0]),
721 SYSmax(v1[1], v2[1], v3[1])
725 #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)
UT_API size_t UTformatBuffer(char *buffer, size_t buffer_size, const UT_VDBType &v)
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
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