HDK
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
UT_VDBUtils.h
Go to the documentation of this file.
1 /*
2  * PROPRIETARY INFORMATION. This software is proprietary to
3  * Side Effects Software Inc., and is not to be reproduced,
4  * transmitted, or disclosed in any way without written permission.
5  *
6  */
7 
8 #ifndef __UT_VDBUtils__
9 #define __UT_VDBUtils__
10 
11 
12 #include <openvdb/openvdb.h>
15 
16 #include "UT_API.h"
17 
18 #include "UT_Assert.h"
19 #include "UT_BoundingBox.h"
20 #include "UT_Matrix4.h"
21 #include "UT_Matrix3.h"
22 #include "UT_Matrix2.h"
23 #include <SYS/SYS_Math.h>
24 
26 {
38 };
39 UT_API size_t
40 UTformatBuffer(char *buffer, size_t buffer_size, const UT_VDBType &v);
41 
42 UT_API const char *UTvdbType(UT_VDBType t);
43 UT_API UT_VDBType UTvdbType(const char *n);
44 
45 /// Calls openvdb::initialize()
47 
48 /// Find the UT_VDBType from a grid
49 inline UT_VDBType
50 UTvdbGetGridType(const openvdb::GridBase &grid)
51 {
52  using namespace openvdb;
53  using namespace openvdb::tools;
54  using namespace openvdb::points;
55 
56  if (grid.isType<FloatGrid>())
57  return UT_VDB_FLOAT;
58  if (grid.isType<DoubleGrid>())
59  return UT_VDB_DOUBLE;
60  if (grid.isType<Int32Grid>())
61  return UT_VDB_INT32;
62  if (grid.isType<Int64Grid>())
63  return UT_VDB_INT64;
64  if (grid.isType<BoolGrid>())
65  return UT_VDB_BOOL;
66  if (grid.isType<Vec3fGrid>())
67  return UT_VDB_VEC3F;
68  if (grid.isType<Vec3dGrid>())
69  return UT_VDB_VEC3D;
70  if (grid.isType<Vec3IGrid>())
71  return UT_VDB_VEC3I;
72  if (grid.isType<Vec3IGrid>())
73  return UT_VDB_VEC3I;
74  if (grid.isType<PointIndexGrid>())
75  return UT_VDB_POINTINDEX;
76  if (grid.isType<PointDataGrid>())
77  return UT_VDB_POINTDATA;
78 
79  return UT_VDB_INVALID;
80 }
81 
82 /// Return the string representation of a grid's underlying value type
83 inline const char *
84 UTvdbGetGridTypeString(const openvdb::GridBase &grid)
85 {
86  switch(UTvdbGetGridType(grid))
87  {
88  case UT_VDB_FLOAT:
89  return "float";
90  case UT_VDB_DOUBLE:
91  return "double";
92  case UT_VDB_INT32:
93  return "int32";
94  case UT_VDB_INT64:
95  return "int64";
96  case UT_VDB_BOOL:
97  return "bool";
98  case UT_VDB_VEC3F:
99  return "Vec3f";
100  case UT_VDB_VEC3D:
101  return "Vec3d";
102  case UT_VDB_VEC3I:
103  return "Vec3i";
104  case UT_VDB_POINTINDEX:
105  return "PointIndex";
106  case UT_VDB_POINTDATA:
107  return "PointData";
108  default:
109  return "invalid type";
110  }
111 }
112 
113 /// Returns the tuple size of a grid given its value type.
114 inline int
116 {
117  switch(type)
118  {
119  case UT_VDB_FLOAT:
120  case UT_VDB_DOUBLE:
121  case UT_VDB_INT32:
122  case UT_VDB_INT64:
123  case UT_VDB_BOOL:
124  return 1;
125 
126  case UT_VDB_VEC3F:
127  case UT_VDB_VEC3D:
128  case UT_VDB_VEC3I:
129  return 3;
130 
131  case UT_VDB_POINTINDEX:
132  case UT_VDB_POINTDATA:
133  case UT_VDB_INVALID:
134  default:
135  break;
136  }
137 
138  return 0;
139 }
140 
141 /// Returns the tuple size of a grid
142 inline int
143 UTvdbGetGridTupleSize(const openvdb::GridBase &grid)
144 {
146 }
147 
148 /// Special plusEqual class to avoid bool warnings
149 /// @{
150 template <typename T>
152 {
153  static void plusEqual(T &lhs, const T &rhs)
154  { lhs += rhs; }
155 };
156 template <>
158 {
159  static void plusEqual(bool &lhs, const bool &rhs)
160  { lhs = lhs | rhs; }
161 };
162 /// @}
163 
164 /// Helpers for downcasting to a specific grid type
165 /// @{
166 template <typename GridType>
167 inline const GridType *
168 UTvdbGridCast(const openvdb::GridBase *grid)
169  { return UTverify_cast<const GridType *>(grid); }
170 
171 template <typename GridType>
172 inline GridType *
173 UTvdbGridCast(openvdb::GridBase *grid)
174  { return UTverify_cast<GridType *>(grid); }
175 
176 template <typename GridType>
177 inline const GridType &
178 UTvdbGridCast(const openvdb::GridBase &grid)
179  { return *UTverify_cast<const GridType *>(&grid); }
180 
181 template <typename GridType>
182 inline GridType &
183 UTvdbGridCast(openvdb::GridBase &grid)
184  { return *UTverify_cast<GridType *>(&grid); }
185 
186 template <typename GridType>
187 inline typename GridType::ConstPtr
188 UTvdbGridCast(openvdb::GridBase::ConstPtr grid)
189  { return openvdb::gridConstPtrCast<GridType>(grid); }
190 
191 template <typename GridType>
192 inline typename GridType::Ptr
193 UTvdbGridCast(openvdb::GridBase::Ptr grid)
194  { return openvdb::gridPtrCast<GridType>(grid); }
195 /// @}
196 
197 ////////////////////////////////////////
198 
199 namespace UT_VDBUtils {
200 
201 // Helper function used internally by UTvdbProcessTypedGrid()
202 // to instantiate a templated functor for a specific grid type
203 // and then to call the functor with a grid of that type
204 template<typename GridType, typename OpType, typename GridBaseType>
205 inline void
206 callTypedGrid(GridBaseType &grid, OpType& op)
207 {
208  op.template operator()<GridType>(UTvdbGridCast<GridType>(grid));
209 }
210 
211 } // namespace UT_VDBUtils
212 
213 ////////////////////////////////////////
214 
215 
216 /// @brief Utility function that, given a generic grid pointer,
217 /// calls a functor on the fully-resolved grid
218 ///
219 /// @par Example:
220 /// @code
221 /// using openvdb::Coord;
222 /// using openvdb::CoordBBox;
223 ///
224 /// struct FillOp {
225 /// const CoordBBox bbox;
226 ///
227 /// FillOp(const CoordBBox& b): bbox(b) {}
228 ///
229 /// template<typename GridT>
230 /// void operator()(GridT& grid) const {
231 /// using ValueT = typename GridT::ValueType;
232 /// grid.fill(bbox, ValueT(1));
233 /// }
234 /// };
235 ///
236 /// GU_PrimVDB* vdb = ...;
237 /// vdb->makeGridUnique();
238 /// CoordBBox bbox(Coord(0,0,0), Coord(10,10,10));
239 /// UTvdbProcessTypedGrid(vdb->getStorageType(), vdb->getGrid(), FillOp(bbox));
240 /// @endcode
241 ///
242 /// @return @c false if the grid type is unknown or unhandled.
243 /// @{
244 #define UT_VDB_DECL_PROCESS_TYPED_GRID(GRID_BASE_T) \
245 template<typename OpType> \
246 inline bool \
247 UTvdbProcessTypedGrid(UT_VDBType grid_type, GRID_BASE_T grid, OpType& op) \
248 { \
249  using namespace openvdb; \
250  using namespace UT_VDBUtils; \
251  switch (grid_type) \
252  { \
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; \
261  } \
262  return true; \
263 } \
264 template<typename OpType> \
265 inline bool \
266 UTvdbProcessTypedGridTopology(UT_VDBType grid_type, GRID_BASE_T grid, OpType& op) \
267 { \
268  using namespace openvdb; \
269  using namespace UT_VDBUtils; \
270  switch (grid_type) \
271  { \
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; \
281  } \
282  return true; \
283 } \
284 template<typename OpType> \
285 inline bool \
286 UTvdbProcessTypedGridVec3(UT_VDBType grid_type, GRID_BASE_T grid, OpType& op) \
287 { \
288  using namespace openvdb; \
289  using namespace UT_VDBUtils; \
290  switch (grid_type) \
291  { \
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; \
296  } \
297  return true; \
298 } \
299 template<typename OpType> \
300 inline bool \
301 UTvdbProcessTypedGridScalar(UT_VDBType grid_type, GRID_BASE_T grid, OpType& op) \
302 { \
303  using namespace openvdb; \
304  using namespace UT_VDBUtils; \
305  switch (grid_type) \
306  { \
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; \
312  } \
313  return true; \
314 } \
315 template<typename OpType> \
316 inline bool \
317 UTvdbProcessTypedGridReal(UT_VDBType grid_type, GRID_BASE_T grid, OpType& op) \
318 { \
319  using namespace openvdb; \
320  using namespace UT_VDBUtils; \
321  switch (grid_type) \
322  { \
323  case UT_VDB_FLOAT: callTypedGrid<FloatGrid>(grid, op); break; \
324  case UT_VDB_DOUBLE: callTypedGrid<DoubleGrid>(grid, op); break; \
325  default: return false; \
326  } \
327  return true; \
328 } \
329 template<typename OpType> \
330 inline bool \
331 UTvdbProcessTypedGridPoint(UT_VDBType grid_type, GRID_BASE_T grid, OpType& op) \
332 { \
333  using namespace openvdb; \
334  using namespace openvdb::tools; \
335  using namespace openvdb::points; \
336  using namespace UT_VDBUtils; \
337  switch (grid_type) \
338  { \
339  case UT_VDB_POINTINDEX: callTypedGrid<PointIndexGrid>(grid, op); break; \
340  case UT_VDB_POINTDATA: callTypedGrid<PointDataGrid>(grid, op); break; \
341  default: return false; \
342  } \
343  return true; \
344 } \
345 /**/
346 UT_VDB_DECL_PROCESS_TYPED_GRID(const openvdb::GridBase &)
347 UT_VDB_DECL_PROCESS_TYPED_GRID(const openvdb::GridBase *)
348 UT_VDB_DECL_PROCESS_TYPED_GRID(openvdb::GridBase::ConstPtr)
349 UT_VDB_DECL_PROCESS_TYPED_GRID(openvdb::GridBase &)
350 UT_VDB_DECL_PROCESS_TYPED_GRID(openvdb::GridBase *)
351 UT_VDB_DECL_PROCESS_TYPED_GRID(openvdb::GridBase::Ptr)
352 
353 /// @}
354 
355 
356 // Helper macro for UTvdbCall* macros, do not outside of this file!
357 #define UT_VDB_CALL(GRIDT, RETURN, FNAME, GRIDBASE, ...) \
358  { \
359  RETURN FNAME <GRIDT> (UTvdbGridCast<GRIDT>(GRIDBASE), __VA_ARGS__ ); \
360  } \
361  /**/
362 
363 //@{
364 /// Macro to invoke the correct type of grid.
365 /// Use like:
366 /// @code
367 /// UTvdbCallScalarType(grid_type, myfunction, grid, parms)
368 /// @endcode
369 /// to invoke
370 /// @code
371 /// template <typename GridType>
372 /// static void
373 /// myfunction(const GridType &grid, parms)
374 /// { }
375 /// @endcode
376 
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__) \
382  /**/
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__) \
389  /**/
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__) \
397  /**/
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__) \
403  /**/
404 #define UTvdbCallBoolType(TYPE, FNAME, GRIDBASE, ...) \
405  if (TYPE == UT_VDB_BOOL) \
406  UT_VDB_CALL(openvdb::BoolGrid,(void),FNAME,GRIDBASE,__VA_ARGS__) \
407  /**/
408 #define UTvdbCallAllType(TYPE, FNAME, GRIDBASE, ...) \
409  UTvdbCallScalarType(TYPE, FNAME, GRIDBASE, __VA_ARGS__) \
410  else UTvdbCallVec3Type(TYPE, FNAME, GRIDBASE, __VA_ARGS__); \
411  /**/
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__) \
416  /**/
417 //@}
418 
419 //@{
420 /// Macro to invoke the correct type of grid.
421 /// Use like:
422 /// @code
423 /// UTvdbReturnScalarType(grid_type, myfunction, grid, parms)
424 /// @endcode
425 /// to invoke
426 /// @code
427 /// return myfunction(grid, parms);
428 /// @endcode
429 /// via:
430 /// @code
431 /// template <typename GridType>
432 /// static RESULT
433 /// myfunction(const GridType &grid, parms)
434 /// { }
435 /// @endcode
436 
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__) \
442  /**/
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__) \
449  /**/
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__) \
457  /**/
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__) \
463  /**/
464 #define UTvdbReturnBoolType(TYPE, FNAME, GRIDBASE, ...) \
465  if (TYPE == UT_VDB_BOOL) \
466  UT_VDB_CALL(openvdb::BoolGrid,return,FNAME,GRIDBASE,__VA_ARGS__) \
467  /**/
468 #define UTvdbReturnAllType(TYPE, FNAME, GRIDBASE, ...) \
469  UTvdbReturnScalarType(TYPE, FNAME, GRIDBASE, __VA_ARGS__) \
470  else UTvdbReturnVec3Type(TYPE, FNAME, GRIDBASE, __VA_ARGS__); \
471  /**/
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__) \
476  /**/
477 //@}
478 
479 
480 ////////////////////////////////////////
481 
482 
483 /// Matrix conversion from openvdb to UT
484 // @{
485 template <typename S>
487 UTvdbConvert(const openvdb::math::Mat4<S> &src)
488 {
489  return UT_Matrix4T<S>(src(0,0), src(0,1), src(0,2), src(0,3),
490  src(1,0), src(1,1), src(1,2), src(1,3),
491  src(2,0), src(2,1), src(2,2), src(2,3),
492  src(3,0), src(3,1), src(3,2), src(3,3));
493 }
494 
495 template <typename S>
497 UTvdbConvert(const openvdb::math::Mat3<S> &src)
498 {
499  return UT_Matrix3T<S>(src(0,0), src(0,1), src(0,2),
500  src(1,0), src(1,1), src(1,2),
501  src(2,0), src(2,1), src(2,2));
502 }
503 
504 template <typename S>
506 UTvdbConvert(const openvdb::math::Mat2<S> &src)
507 {
508  return UT_Matrix2T<S>(src(0,0), src(0,1),
509  src(1,0), src(1,1));
510 }
511 // @}
512 
513 /// Matrix conversion from UT to openvdb
514 // @{
515 template <typename S>
516 openvdb::math::Mat4<S>
518 {
519  return openvdb::math::Mat4<S>(src(0,0), src(0,1), src(0,2), src(0,3),
520  src(1,0), src(1,1), src(1,2), src(1,3),
521  src(2,0), src(2,1), src(2,2), src(2,3),
522  src(3,0), src(3,1), src(3,2), src(3,3));
523 }
524 template <typename S>
525 openvdb::math::Mat3<S>
527 {
528  return openvdb::math::Mat3<S>(src(0,0), src(0,1), src(0,2),
529  src(1,0), src(1,1), src(1,2),
530  src(2,0), src(2,1), src(2,2));
531 }
532 template <typename S>
533 openvdb::math::Mat2<S>
535 {
536  return openvdb::math::Mat2<S>(src(0,0), src(0,1),
537  src(1,0), src(1,1));
538 }
539 // @}
540 
541 /// Vector conversion from openvdb to UT
542 // @{
543 template <typename S>
545 UTvdbConvert(const openvdb::math::Vec4<S> &src)
546 {
547  return UT_Vector4T<S>(src.asPointer());
548 }
549 template <typename S>
551 UTvdbConvert(const openvdb::math::Vec3<S> &src)
552 {
553  return UT_Vector3T<S>(src.asPointer());
554 }
555 template <typename S>
557 UTvdbConvert(const openvdb::math::Vec2<S> &src)
558 {
559  return UT_Vector2T<S>(src.asPointer());
560 }
561 // @}
562 
563 /// Vector conversion from UT to openvdb
564 // @{
565 template <typename S>
566 openvdb::math::Vec4<S>
568 {
569  return openvdb::math::Vec4<S>(src.data());
570 }
571 template <typename S>
572 openvdb::math::Vec3<S>
574 {
575  return openvdb::math::Vec3<S>(src.data());
576 }
577 template <typename S>
578 openvdb::math::Vec2<S>
580 {
581  return openvdb::math::Vec2<S>(src.data());
582 }
583 // @}
584 
585 
586 /// Bounding box conversion from openvdb to UT
587 inline UT_BoundingBoxD
589 {
590  return UT_BoundingBoxD(UTvdbConvert(bbox.getStart().asVec3d()),
591  UTvdbConvert(bbox.getEnd().asVec3d()));
592 }
593 
594 /// Bounding box conversion from openvdb to UT
597 {
599  openvdb::math::Coord(bbox.xmin(), bbox.ymin(), bbox.zmin()),
600  openvdb::math::Coord(bbox.xmax(), bbox.ymax(), bbox.zmax()));
601 }
602 
603 /// Utility method to construct a Transform that lines up with a
604 /// cell-centered Houdini volume with specified origin and voxel size.
605 inline openvdb::math::Transform::Ptr
606 UTvdbCreateTransform(const UT_Vector3 &orig, const UT_Vector3 &voxsize)
607 {
608  // Transforms only valid for square voxels.
609  UT_ASSERT(SYSalmostEqual(voxsize.minComponent(), voxsize.maxComponent()));
610  fpreal vs = voxsize.maxComponent();
611  openvdb::math::Transform::Ptr xform =
612  openvdb::math::Transform::createLinearTransform(vs);
613  // Ensure voxel centers line up.
614  xform->postTranslate(UTvdbConvert(orig) + vs / 2);
615  return xform;
616 }
617 
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]),
621  SYSabs(v1[1]),
622  SYSabs(v1[2]),
623  SYSabs(v1[3])
624  );
625 }
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]),
629  SYSabs(v1[1]),
630  SYSabs(v1[2])
631  );
632 }
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]),
636  SYSabs(v1[1])
637  );
638 }
639 
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]),
643  SYSmin(v1[1], v2[1]),
644  SYSmin(v1[2], v2[2]),
645  SYSmin(v1[3], v2[3])
646  );
647 }
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]),
651  SYSmax(v1[1], v2[1]),
652  SYSmax(v1[2], v2[2]),
653  SYSmax(v1[3], v2[3])
654  );
655 }
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])
662  );
663 }
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])
670  );
671 }
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]),
675  SYSmin(v1[1], v2[1]),
676  SYSmin(v1[2], v2[2])
677  );
678 }
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]),
682  SYSmax(v1[1], v2[1]),
683  SYSmax(v1[2], v2[2])
684  );
685 }
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])
691  );
692 }
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])
698  );
699 }
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]),
703  SYSmin(v1[1], v2[1])
704  );
705 }
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]),
709  SYSmax(v1[1], v2[1])
710  );
711 }
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])
716  );
717 }
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])
722  );
723 }
724 
725 #endif // __UT_VDBUtils__
static void plusEqual(bool &lhs, const bool &rhs)
Definition: UT_VDBUtils.h:159
GLdouble GLdouble GLint GLint const GLdouble * points
Definition: glad.h:2676
GridType
List of types that are currently supported by NanoVDB.
Definition: NanoVDB.h:294
const GLdouble * v
Definition: glcorearb.h:837
Grid< Vec3fTree > Vec3fGrid
Definition: NanoVDB.h:6498
UT_VDBType UTvdbGetGridType(const openvdb::GridBase &grid)
Find the UT_VDBType from a grid.
Definition: UT_VDBUtils.h:50
Grid< DoubleTree > DoubleGrid
Definition: NanoVDB.h:6494
const GridType * UTvdbGridCast(const openvdb::GridBase *grid)
Definition: UT_VDBUtils.h:168
UT_API size_t UTformatBuffer(char *buffer, size_t buffer_size, const UT_VDBType &v)
void UTvdbInitialize()
Calls openvdb::initialize()
Definition: UT_VDBUtils.h:46
#define UT_API
Definition: UT_API.h:14
SYS_FORCE_INLINE TO_T UTverify_cast(FROM_T from)
Definition: UT_Assert.h:242
void callTypedGrid(GridBaseType &grid, OpType &op)
Definition: UT_VDBUtils.h:206
UT_VDBType
Definition: UT_VDBUtils.h:25
GLfloat GLfloat GLfloat v2
Definition: glcorearb.h:818
GLfloat GLfloat GLfloat GLfloat v3
Definition: glcorearb.h:819
4D Vector class.
Definition: UT_Vector4.h:176
UT_BoundingBoxT< fpreal64 > UT_BoundingBoxD
Definition: HUSD_Info.h:36
GLuint buffer
Definition: glcorearb.h:660
constexpr SYS_FORCE_INLINE const T * data() const noexcept
Definition: UT_Vector3.h:294
OutGridT const XformOp bool bool
openvdb::math::Vec4< T > SYSabs(const openvdb::math::Vec4< T > &v1)
Definition: UT_VDBUtils.h:619
openvdb::math::Vec4< T > SYSmax(const openvdb::math::Vec4< T > &v1, const openvdb::math::Vec4< T > &v2)
Definition: UT_VDBUtils.h:649
constexpr SYS_FORCE_INLINE T minComponent() const noexcept
Definition: UT_Vector3.h:415
#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...
Definition: UT_VDBUtils.h:244
Grid< Int64Tree > Int64Grid
Definition: NanoVDB.h:6497
Grid< FloatTree > FloatGrid
Definition: NanoVDB.h:6489
openvdb::math::Transform::Ptr UTvdbCreateTransform(const UT_Vector3 &orig, const UT_Vector3 &voxsize)
Definition: UT_VDBUtils.h:606
GLdouble n
Definition: glcorearb.h:2008
GLint GLint GLsizei GLint GLenum GLenum type
Definition: glcorearb.h:108
Grid< Vec3ITree > Vec3IGrid
Definition: NanoVDB.h:6502
static void plusEqual(T &lhs, const T &rhs)
Definition: UT_VDBUtils.h:153
BBox< Coord > CoordBBox
Definition: NanoVDB.h:2516
const char * UTvdbGetGridTypeString(const openvdb::GridBase &grid)
Return the string representation of a grid's underlying value type.
Definition: UT_VDBUtils.h:84
UT_API const char * UTvdbType(UT_VDBType t)
Grid< PointDataTree > PointDataGrid
Point data grid.
constexpr SYS_FORCE_INLINE const T * data() const noexcept
Definition: UT_Vector2.h:220
OPENVDB_API void initialize()
Global registration of native Grid, Transform, Metadata and Point attribute types. Also initializes blosc (if enabled).
Definition: logging.h:294
GLdouble t
Definition: glad.h:2397
Grid< PointIndexTree > PointIndexGrid
Point index grid.
int UTvdbGetGridTupleSize(UT_VDBType type)
Returns the tuple size of a grid given its value type.
Definition: UT_VDBUtils.h:115
fpreal64 fpreal
Definition: SYS_Types.h:283
Space-partitioning acceleration structure for points. Partitions the points into voxels to accelerate...
constexpr SYS_FORCE_INLINE const T * data() const noexcept
Definition: UT_Vector4.h:226
GLfloat GLfloat v1
Definition: glcorearb.h:817
GU_API void xform(CE_Context &context, bool recompile, int npts, const cl::Buffer &outPos, const cl::Buffer &inPos, const cl::Buffer &surfacexform, const cl::Buffer *grp=nullptr)
Grid< BoolTree > BoolGrid
Definition: NanoVDB.h:6504
#define UT_ASSERT(ZZ)
Definition: UT_Assert.h:165
Grid< Vec3dTree > Vec3dGrid
Definition: NanoVDB.h:6499
openvdb::math::Vec4< T > SYSmin(const openvdb::math::Vec4< T > &v1, const openvdb::math::Vec4< T > &v2)
Definition: UT_VDBUtils.h:641
constexpr SYS_FORCE_INLINE T maxComponent() const noexcept
Definition: UT_Vector3.h:410
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.
Definition: UT_VDBUtils.h:487
Grid< Int32Tree > Int32Grid
Definition: NanoVDB.h:6495
GLenum src
Definition: glcorearb.h:1793