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