15#include <UT/UT_Version.h>
17#if !defined(SESI_OPENVDB) && !defined(SESI_OPENVDB_PRIM)
19#include <UT/UT_VDBUtils.h>
23#ifndef __HDK_UT_VDBUtils__
24#define __HDK_UT_VDBUtils__
45#include <UT/UT_Assert.h>
46#include <UT/UT_BoundingBox.h>
47#include <UT/UT_Matrix4.h>
48#include <UT/UT_Matrix3.h>
49#include <UT/UT_Matrix2.h>
50#include <SYS/SYS_Math.h>
53UTformatBuffer(
char *buffer,
size_t buffer_size,
const UT_VDBType &v);
55UT_API
const char *UTvdbType(UT_VDBType t);
56UT_API UT_VDBType UTvdbType(
const char *n);
87 if (grid.
isType<PointIndexGrid>())
88 return UT_VDB_POINTINDEX;
89 if (grid.
isType<PointDataGrid>())
90 return UT_VDB_POINTDATA;
92 return UT_VDB_INVALID;
99 switch(UTvdbGetGridType(grid))
117 case UT_VDB_POINTINDEX:
119 case UT_VDB_POINTDATA:
122 return "invalid type";
128UTvdbGetGridTupleSize(UT_VDBType type)
144 case UT_VDB_POINTINDEX:
145 case UT_VDB_POINTDATA:
158 return UTvdbGetGridTupleSize(UTvdbGetGridType(grid));
166 static void plusEqual(T &lhs,
const T &rhs)
170struct UT_VDBMath<bool>
172 static void plusEqual(
bool &lhs,
const bool &rhs)
179template <
typename Gr
idType>
182 {
return UTverify_cast<const GridType *>(grid); }
184template <
typename Gr
idType>
187 {
return UTverify_cast<GridType *>(grid); }
189template <
typename Gr
idType>
192 {
return *UTverify_cast<const GridType *>(&grid); }
194template <
typename Gr
idType>
197 {
return *UTverify_cast<GridType *>(&grid); }
199template <
typename Gr
idType>
200inline typename GridType::ConstPtr
201UTvdbGridCast(openvdb::GridBase::ConstPtr grid)
204template <
typename Gr
idType>
205inline typename GridType::Ptr
206UTvdbGridCast(openvdb::GridBase::Ptr grid)
212namespace UT_VDBUtils {
217template<
typename Gr
idType,
typename OpType,
typename Gr
idBaseType>
219callTypedGrid(GridBaseType &grid, OpType& op)
221 op.template operator()<
GridType>(UTvdbGridCast<GridType>(grid));
257#define UT_VDB_DECL_PROCESS_TYPED_GRID(GRID_BASE_T) \
258template<typename OpType> \
260UTvdbProcessTypedGrid(UT_VDBType grid_type, GRID_BASE_T grid, OpType& op) \
262 using namespace openvdb; \
263 using namespace UT_VDBUtils; \
266 case UT_VDB_FLOAT: callTypedGrid<FloatGrid>(grid, op); break; \
267 case UT_VDB_DOUBLE: callTypedGrid<DoubleGrid>(grid, op); break; \
268 case UT_VDB_INT32: callTypedGrid<Int32Grid>(grid, op); break; \
269 case UT_VDB_INT64: callTypedGrid<Int64Grid>(grid, op); break; \
270 case UT_VDB_VEC3F: callTypedGrid<Vec3SGrid>(grid, op); break; \
271 case UT_VDB_VEC3D: callTypedGrid<Vec3DGrid>(grid, op); break; \
272 case UT_VDB_VEC3I: callTypedGrid<Vec3IGrid>(grid, op); break; \
273 default: return false; \
277template<typename OpType> \
279UTvdbProcessTypedGridTopology(UT_VDBType grid_type, GRID_BASE_T grid, OpType& op) \
281 using namespace openvdb; \
282 using namespace UT_VDBUtils; \
285 case UT_VDB_FLOAT: callTypedGrid<FloatGrid>(grid, op); break; \
286 case UT_VDB_DOUBLE: callTypedGrid<DoubleGrid>(grid, op); break; \
287 case UT_VDB_INT32: callTypedGrid<Int32Grid>(grid, op); break; \
288 case UT_VDB_INT64: callTypedGrid<Int64Grid>(grid, op); break; \
289 case UT_VDB_VEC3F: callTypedGrid<Vec3SGrid>(grid, op); break; \
290 case UT_VDB_VEC3D: callTypedGrid<Vec3DGrid>(grid, op); break; \
291 case UT_VDB_VEC3I: callTypedGrid<Vec3IGrid>(grid, op); break; \
292 case UT_VDB_BOOL: callTypedGrid<BoolGrid>(grid, op); break; \
293 default: return false; \
297template<typename OpType> \
299UTvdbProcessTypedGridVec3(UT_VDBType grid_type, GRID_BASE_T grid, OpType& op) \
301 using namespace openvdb; \
302 using namespace UT_VDBUtils; \
305 case UT_VDB_VEC3F: callTypedGrid<Vec3SGrid>(grid, op); break; \
306 case UT_VDB_VEC3D: callTypedGrid<Vec3DGrid>(grid, op); break; \
307 case UT_VDB_VEC3I: callTypedGrid<Vec3IGrid>(grid, op); break; \
308 default: return false; \
312template<typename OpType> \
314UTvdbProcessTypedGridScalar(UT_VDBType grid_type, GRID_BASE_T grid, OpType& op) \
316 using namespace openvdb; \
317 using namespace UT_VDBUtils; \
320 case UT_VDB_FLOAT: callTypedGrid<FloatGrid>(grid, op); break; \
321 case UT_VDB_DOUBLE: callTypedGrid<DoubleGrid>(grid, op); break; \
322 case UT_VDB_INT32: callTypedGrid<Int32Grid>(grid, op); break; \
323 case UT_VDB_INT64: callTypedGrid<Int64Grid>(grid, op); break; \
324 default: return false; \
328template<typename OpType> \
330UTvdbProcessTypedGridReal(UT_VDBType grid_type, GRID_BASE_T grid, OpType& op) \
332 using namespace openvdb; \
333 using namespace UT_VDBUtils; \
336 case UT_VDB_FLOAT: callTypedGrid<FloatGrid>(grid, op); break; \
337 case UT_VDB_DOUBLE: callTypedGrid<DoubleGrid>(grid, op); break; \
338 default: return false; \
342template<typename OpType> \
344UTvdbProcessTypedGridPoint(UT_VDBType grid_type, GRID_BASE_T grid, OpType& op) \
346 using namespace openvdb; \
347 using namespace openvdb::tools; \
348 using namespace openvdb::points; \
349 using namespace UT_VDBUtils; \
352 case UT_VDB_POINTINDEX: callTypedGrid<PointIndexGrid>(grid, op); break; \
353 case UT_VDB_POINTDATA: callTypedGrid<PointDataGrid>(grid, op); break; \
354 default: return false; \
361UT_VDB_DECL_PROCESS_TYPED_GRID(openvdb::GridBase::ConstPtr)
364UT_VDB_DECL_PROCESS_TYPED_GRID(openvdb::GridBase::Ptr)
370#define UT_VDB_CALL(GRIDT, RETURN, FNAME, GRIDBASE, ...) \
372 RETURN FNAME <GRIDT> (UTvdbGridCast<GRIDT>(GRIDBASE), __VA_ARGS__ ); \
390#define UTvdbCallRealType(TYPE, FNAME, GRIDBASE, ...) \
391 if (TYPE == UT_VDB_FLOAT) \
392 UT_VDB_CALL(openvdb::FloatGrid,(void),FNAME,GRIDBASE,__VA_ARGS__) \
393 else if (TYPE == UT_VDB_DOUBLE) \
394 UT_VDB_CALL(openvdb::DoubleGrid,(void),FNAME,GRIDBASE,__VA_ARGS__) \
396#define UTvdbCallScalarType(TYPE, FNAME, GRIDBASE, ...) \
397 UTvdbCallRealType(TYPE, FNAME, GRIDBASE, __VA_ARGS__) \
398 else if (TYPE == UT_VDB_INT32) \
399 UT_VDB_CALL(openvdb::Int32Grid,(void),FNAME,GRIDBASE,__VA_ARGS__) \
400 else if (TYPE == UT_VDB_INT64) \
401 UT_VDB_CALL(openvdb::Int64Grid,(void),FNAME,GRIDBASE,__VA_ARGS__) \
403#define UTvdbCallVec3Type(TYPE, FNAME, GRIDBASE, ...) \
404 if (TYPE == UT_VDB_VEC3F) \
405 UT_VDB_CALL(openvdb::Vec3fGrid,(void),FNAME,GRIDBASE,__VA_ARGS__) \
406 else if (TYPE == UT_VDB_VEC3D) \
407 UT_VDB_CALL(openvdb::Vec3dGrid,(void),FNAME,GRIDBASE,__VA_ARGS__) \
408 else if (TYPE == UT_VDB_VEC3I) \
409 UT_VDB_CALL(openvdb::Vec3IGrid,(void),FNAME,GRIDBASE,__VA_ARGS__) \
411#define UTvdbCallPointType(TYPE, FNAME, GRIDBASE, ...) \
412 if (TYPE == UT_VDB_POINTINDEX) \
413 UT_VDB_CALL(openvdb::tools::PointIndexGrid,(void),FNAME,GRIDBASE,__VA_ARGS__) \
414 else if (TYPE == UT_VDB_POINTDATA) \
415 UT_VDB_CALL(openvdb::points::PointDataGrid,(void),FNAME,GRIDBASE,__VA_ARGS__) \
417#define UTvdbCallBoolType(TYPE, FNAME, GRIDBASE, ...) \
418 if (TYPE == UT_VDB_BOOL) \
419 UT_VDB_CALL(openvdb::BoolGrid,(void),FNAME,GRIDBASE,__VA_ARGS__) \
421#define UTvdbCallAllType(TYPE, FNAME, GRIDBASE, ...) \
422 UTvdbCallScalarType(TYPE, FNAME, GRIDBASE, __VA_ARGS__) \
423 else UTvdbCallVec3Type(TYPE, FNAME, GRIDBASE, __VA_ARGS__); \
425#define UTvdbCallAllTopology(TYPE, FNAME, GRIDBASE, ...) \
426 UTvdbCallScalarType(TYPE, FNAME, GRIDBASE, __VA_ARGS__) \
427 else UTvdbCallVec3Type(TYPE, FNAME, GRIDBASE, __VA_ARGS__) \
428 else UTvdbCallBoolType(TYPE, FNAME, GRIDBASE, __VA_ARGS__) \
450#define UTvdbReturnRealType(TYPE, FNAME, GRIDBASE, ...) \
451 if (TYPE == UT_VDB_FLOAT) \
452 UT_VDB_CALL(openvdb::FloatGrid,return,FNAME,GRIDBASE,__VA_ARGS__) \
453 else if (TYPE == UT_VDB_DOUBLE) \
454 UT_VDB_CALL(openvdb::DoubleGrid,return,FNAME,GRIDBASE,__VA_ARGS__) \
456#define UTvdbReturnScalarType(TYPE, FNAME, GRIDBASE, ...) \
457 UTvdbReturnRealType(TYPE, FNAME, GRIDBASE, __VA_ARGS__) \
458 else if (TYPE == UT_VDB_INT32) \
459 UT_VDB_CALL(openvdb::Int32Grid,return,FNAME,GRIDBASE,__VA_ARGS__) \
460 else if (TYPE == UT_VDB_INT64) \
461 UT_VDB_CALL(openvdb::Int64Grid,return,FNAME,GRIDBASE,__VA_ARGS__) \
463#define UTvdbReturnVec3Type(TYPE, FNAME, GRIDBASE, ...) \
464 if (TYPE == UT_VDB_VEC3F) \
465 UT_VDB_CALL(openvdb::Vec3fGrid,return,FNAME,GRIDBASE,__VA_ARGS__) \
466 else if (TYPE == UT_VDB_VEC3D) \
467 UT_VDB_CALL(openvdb::Vec3dGrid,return,FNAME,GRIDBASE,__VA_ARGS__) \
468 else if (TYPE == UT_VDB_VEC3I) \
469 UT_VDB_CALL(openvdb::Vec3IGrid,return,FNAME,GRIDBASE,__VA_ARGS__) \
471#define UTvdbReturnPointType(TYPE, FNAME, GRIDBASE, ...) \
472 if (TYPE == UT_VDB_POINTINDEX) \
473 UT_VDB_CALL(openvdb::tools::PointIndexGrid,return,FNAME,GRIDBASE,__VA_ARGS__) \
474 else if (TYPE == UT_VDB_POINTDATA) \
475 UT_VDB_CALL(openvdb::points::PointDataGrid,return,FNAME,GRIDBASE,__VA_ARGS__) \
477#define UTvdbReturnBoolType(TYPE, FNAME, GRIDBASE, ...) \
478 if (TYPE == UT_VDB_BOOL) \
479 UT_VDB_CALL(openvdb::BoolGrid,return,FNAME,GRIDBASE,__VA_ARGS__) \
481#define UTvdbReturnAllType(TYPE, FNAME, GRIDBASE, ...) \
482 UTvdbReturnScalarType(TYPE, FNAME, GRIDBASE, __VA_ARGS__) \
483 else UTvdbReturnVec3Type(TYPE, FNAME, GRIDBASE, __VA_ARGS__); \
485#define UTvdbReturnAllTopology(TYPE, FNAME, GRIDBASE, ...) \
486 UTvdbReturnScalarType(TYPE, FNAME, GRIDBASE, __VA_ARGS__) \
487 else UTvdbReturnVec3Type(TYPE, FNAME, GRIDBASE, __VA_ARGS__) \
488 else UTvdbReturnBoolType(TYPE, FNAME, GRIDBASE, __VA_ARGS__) \
500UTvdbConvert(
const openvdb::math::Mat4<S> &src)
502 return UT_Matrix4T<S>(src(0,0), src(0,1), src(0,2), src(0,3),
503 src(1,0), src(1,1), src(1,2), src(1,3),
504 src(2,0), src(2,1), src(2,2), src(2,3),
505 src(3,0), src(3,1), src(3,2), src(3,3));
510UTvdbConvert(
const openvdb::math::Mat3<S> &src)
512 return UT_Matrix3T<S>(src(0,0), src(0,1), src(0,2),
513 src(1,0), src(1,1), src(1,2),
514 src(2,0), src(2,1), src(2,2));
519UTvdbConvert(
const openvdb::math::Mat2<S> &src)
521 return UT_Matrix2T<S>(src(0,0), src(0,1),
529openvdb::math::Mat4<S>
530UTvdbConvert(
const UT_Matrix4T<S> &src)
532 return openvdb::math::Mat4<S>(src(0,0), src(0,1), src(0,2), src(0,3),
533 src(1,0), src(1,1), src(1,2), src(1,3),
534 src(2,0), src(2,1), src(2,2), src(2,3),
535 src(3,0), src(3,1), src(3,2), src(3,3));
538openvdb::math::Mat3<S>
539UTvdbConvert(
const UT_Matrix3T<S> &src)
541 return openvdb::math::Mat3<S>(src(0,0), src(0,1), src(0,2),
542 src(1,0), src(1,1), src(1,2),
543 src(2,0), src(2,1), src(2,2));
546openvdb::math::Mat2<S>
547UTvdbConvert(
const UT_Matrix2T<S> &src)
549 return openvdb::math::Mat2<S>(src(0,0), src(0,1),
558UTvdbConvert(
const openvdb::math::Vec4<S> &src)
560 return UT_Vector4T<S>(src.asPointer());
564UTvdbConvert(
const openvdb::math::Vec3<S> &src)
566 return UT_Vector3T<S>(src.asPointer());
570UTvdbConvert(
const openvdb::math::Vec2<S> &src)
572 return UT_Vector2T<S>(src.asPointer());
579openvdb::math::Vec4<S>
580UTvdbConvert(
const UT_Vector4T<S> &src)
582 return openvdb::math::Vec4<S>(src.data());
585openvdb::math::Vec3<S>
586UTvdbConvert(
const UT_Vector3T<S> &src)
588 return openvdb::math::Vec3<S>(src.data());
591openvdb::math::Vec2<S>
592UTvdbConvert(
const UT_Vector2T<S> &src)
594 return openvdb::math::Vec2<S>(src.data());
600inline UT_BoundingBoxD
608inline openvdb::math::CoordBBox
609UTvdbConvert(
const UT_BoundingBoxI &bbox)
611 return openvdb::math::CoordBBox(
612 openvdb::math::Coord(bbox.xmin(), bbox.ymin(), bbox.zmin()),
613 openvdb::math::Coord(bbox.xmax(), bbox.ymax(), bbox.zmax()));
618inline openvdb::math::Transform::Ptr
619UTvdbCreateTransform(
const UT_Vector3 &orig,
const UT_Vector3 &voxsize)
622 UT_ASSERT(SYSalmostEqual(voxsize.minComponent(), voxsize.maxComponent()));
623 fpreal vs = voxsize.maxComponent();
624 openvdb::math::Transform::Ptr xform =
625 openvdb::math::Transform::createLinearTransform(vs);
627 xform->postTranslate(UTvdbConvert(orig) + vs / 2);
632inline openvdb::math::Vec4<T> SYSabs(
const openvdb::math::Vec4<T> &v1)
633{
return openvdb::math::Vec4<T>( SYSabs(v1[0]),
640inline openvdb::math::Vec3<T> SYSabs(
const openvdb::math::Vec3<T> &v1)
641{
return openvdb::math::Vec3<T>( SYSabs(v1[0]),
647inline openvdb::math::Vec2<T> SYSabs(
const openvdb::math::Vec2<T> &v1)
648{
return openvdb::math::Vec2<T>( SYSabs(v1[0]),
654inline openvdb::math::Vec4<T> SYSmin(
const openvdb::math::Vec4<T> &v1,
const openvdb::math::Vec4<T> &v2)
655{
return openvdb::math::Vec4<T>( SYSmin(v1[0], v2[0]),
656 SYSmin(v1[1], v2[1]),
657 SYSmin(v1[2], v2[2]),
662inline openvdb::math::Vec4<T> SYSmax(
const openvdb::math::Vec4<T> &v1,
const openvdb::math::Vec4<T> &v2)
663{
return openvdb::math::Vec4<T>( SYSmax(v1[0], v2[0]),
664 SYSmax(v1[1], v2[1]),
665 SYSmax(v1[2], v2[2]),
670inline openvdb::math::Vec4<T> SYSmin(
const openvdb::math::Vec4<T> &v1,
const openvdb::math::Vec4<T> &v2,
const openvdb::math::Vec4<T> &v3)
671{
return openvdb::math::Vec4<T>( SYSmin(v1[0], v2[0], v3[0]),
672 SYSmin(v1[1], v2[1], v3[1]),
673 SYSmin(v1[2], v2[2], v3[2]),
674 SYSmin(v1[3], v2[3], v3[3])
678inline openvdb::math::Vec4<T> SYSmax(
const openvdb::math::Vec4<T> &v1,
const openvdb::math::Vec4<T> &v2,
const openvdb::math::Vec4<T> &v3)
679{
return openvdb::math::Vec4<T>( SYSmax(v1[0], v2[0], v3[0]),
680 SYSmax(v1[1], v2[1], v3[1]),
681 SYSmax(v1[2], v2[2], v3[2]),
682 SYSmax(v1[3], v2[3], v3[3])
686inline openvdb::math::Vec3<T> SYSmin(
const openvdb::math::Vec3<T> &v1,
const openvdb::math::Vec3<T> &v2)
687{
return openvdb::math::Vec3<T>( SYSmin(v1[0], v2[0]),
688 SYSmin(v1[1], v2[1]),
693inline openvdb::math::Vec3<T> SYSmax(
const openvdb::math::Vec3<T> &v1,
const openvdb::math::Vec3<T> &v2)
694{
return openvdb::math::Vec3<T>( SYSmax(v1[0], v2[0]),
695 SYSmax(v1[1], v2[1]),
700inline openvdb::math::Vec3<T> SYSmin(
const openvdb::math::Vec3<T> &v1,
const openvdb::math::Vec3<T> &v2,
const openvdb::math::Vec3<T> &v3)
701{
return openvdb::math::Vec3<T>( SYSmin(v1[0], v2[0], v3[0]),
702 SYSmin(v1[1], v2[1], v3[1]),
703 SYSmin(v1[2], v2[2], v3[2])
707inline openvdb::math::Vec3<T> SYSmax(
const openvdb::math::Vec3<T> &v1,
const openvdb::math::Vec3<T> &v2,
const openvdb::math::Vec3<T> &v3)
708{
return openvdb::math::Vec3<T>( SYSmax(v1[0], v2[0], v3[0]),
709 SYSmax(v1[1], v2[1], v3[1]),
710 SYSmax(v1[2], v2[2], v3[2])
714inline openvdb::math::Vec2<T> SYSmin(
const openvdb::math::Vec2<T> &v1,
const openvdb::math::Vec2<T> &v2)
715{
return openvdb::math::Vec2<T>( SYSmin(v1[0], v2[0]),
720inline openvdb::math::Vec2<T> SYSmax(
const openvdb::math::Vec2<T> &v1,
const openvdb::math::Vec2<T> &v2)
721{
return openvdb::math::Vec2<T>( SYSmax(v1[0], v2[0]),
726inline openvdb::math::Vec2<T> SYSmin(
const openvdb::math::Vec2<T> &v1,
const openvdb::math::Vec2<T> &v2,
const openvdb::math::Vec2<T> &v3)
727{
return openvdb::math::Vec2<T>( SYSmin(v1[0], v2[0], v3[0]),
728 SYSmin(v1[1], v2[1], v3[1])
732inline openvdb::math::Vec2<T> SYSmax(
const openvdb::math::Vec2<T> &v1,
const openvdb::math::Vec2<T> &v2,
const openvdb::math::Vec2<T> &v3)
733{
return openvdb::math::Vec2<T>( SYSmax(v1[0], v2[0], v3[0]),
734 SYSmax(v1[1], v2[1], v3[1])
Attribute-owned data structure for points. Point attributes are stored in leaf nodes and ordered by v...
Space-partitioning acceleration structure for points. Partitions the points into voxels to accelerate...
Abstract base class for typed grids.
Definition Grid.h:78
bool isType() const
Return true if this grid is of the same type as the template parameter.
Definition Grid.h:146
Axis-aligned bounding box of signed integer coordinates.
Definition Coord.h:252
Coord getStart() const
Return the minimum coordinate.
Definition Coord.h:336
Coord getEnd() const
Return the maximum coordinate plus one.
Definition Coord.h:339
Vec3d asVec3d() const
Definition Coord.h:144
GridType
List of types that are currently supported by NanoVDB.
Definition NanoVDB.h:219
Definition AttributeArray.h:42
Vec3DGrid Vec3dGrid
Definition openvdb.h:86
void initialize()
Global registration of native Grid, Transform, Metadata and Point attribute types....
Grid< FloatTree > FloatGrid
Definition openvdb.h:76
GridType::ConstPtr gridConstPtrCast(const GridBase::ConstPtr &grid)
Cast a generic const grid pointer to a const pointer to a grid of a concrete class.
Definition Grid.h:1016
Grid< BoolTree > BoolGrid
Common grid types.
Definition openvdb.h:74
GridType::Ptr gridPtrCast(const GridBase::Ptr &grid)
Cast a generic grid pointer to a pointer to a grid of a concrete class.
Definition Grid.h:1000
Vec3SGrid Vec3fGrid
Definition openvdb.h:87
Grid< Vec3ITree > Vec3IGrid
Definition openvdb.h:82
Grid< Int64Tree > Int64Grid
Definition openvdb.h:79
Grid< Int32Tree > Int32Grid
Definition openvdb.h:78
Grid< DoubleTree > DoubleGrid
Definition openvdb.h:75
Definition Exceptions.h:13