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 format(char *buffer, size_t buffer_size, const UT_VDBType &v);
40 
41 UT_API const char *UTvdbType(UT_VDBType t);
42 UT_API UT_VDBType UTvdbType(const char *n);
43 
44 /// Calls openvdb::initialize()
46 
47 /// Find the UT_VDBType from a grid
48 inline UT_VDBType
49 UTvdbGetGridType(const openvdb::GridBase &grid)
50 {
51  using namespace openvdb;
52  using namespace openvdb::tools;
53  using namespace openvdb::points;
54 
55  if (grid.isType<FloatGrid>())
56  return UT_VDB_FLOAT;
57  if (grid.isType<DoubleGrid>())
58  return UT_VDB_DOUBLE;
59  if (grid.isType<Int32Grid>())
60  return UT_VDB_INT32;
61  if (grid.isType<Int64Grid>())
62  return UT_VDB_INT64;
63  if (grid.isType<BoolGrid>())
64  return UT_VDB_BOOL;
65  if (grid.isType<Vec3fGrid>())
66  return UT_VDB_VEC3F;
67  if (grid.isType<Vec3dGrid>())
68  return UT_VDB_VEC3D;
69  if (grid.isType<Vec3IGrid>())
70  return UT_VDB_VEC3I;
71  if (grid.isType<Vec3IGrid>())
72  return UT_VDB_VEC3I;
73  if (grid.isType<PointIndexGrid>())
74  return UT_VDB_POINTINDEX;
75  if (grid.isType<PointDataGrid>())
76  return UT_VDB_POINTDATA;
77 
78  return UT_VDB_INVALID;
79 }
80 
81 /// Return the string representation of a grid's underlying value type
82 inline const char *
83 UTvdbGetGridTypeString(const openvdb::GridBase &grid)
84 {
85  switch(UTvdbGetGridType(grid))
86  {
87  case UT_VDB_FLOAT:
88  return "float";
89  case UT_VDB_DOUBLE:
90  return "double";
91  case UT_VDB_INT32:
92  return "int32";
93  case UT_VDB_INT64:
94  return "int64";
95  case UT_VDB_BOOL:
96  return "bool";
97  case UT_VDB_VEC3F:
98  return "Vec3f";
99  case UT_VDB_VEC3D:
100  return "Vec3d";
101  case UT_VDB_VEC3I:
102  return "Vec3i";
103  case UT_VDB_POINTINDEX:
104  return "PointIndex";
105  case UT_VDB_POINTDATA:
106  return "PointData";
107  default:
108  return "invalid type";
109  }
110 }
111 
112 /// Returns the tuple size of a grid given its value type.
113 inline int
115 {
116  switch(type)
117  {
118  case UT_VDB_FLOAT:
119  case UT_VDB_DOUBLE:
120  case UT_VDB_INT32:
121  case UT_VDB_INT64:
122  case UT_VDB_BOOL:
123  return 1;
124 
125  case UT_VDB_VEC3F:
126  case UT_VDB_VEC3D:
127  case UT_VDB_VEC3I:
128  return 3;
129 
130  case UT_VDB_POINTINDEX:
131  case UT_VDB_POINTDATA:
132  case UT_VDB_INVALID:
133  default:
134  break;
135  }
136 
137  return 0;
138 }
139 
140 /// Returns the tuple size of a grid
141 inline int
142 UTvdbGetGridTupleSize(const openvdb::GridBase &grid)
143 {
145 }
146 
147 /// Special plusEqual class to avoid bool warnings
148 /// @{
149 template <typename T>
151 {
152  static void plusEqual(T &lhs, const T &rhs)
153  { lhs += rhs; }
154 };
155 template <>
157 {
158  static void plusEqual(bool &lhs, const bool &rhs)
159  { lhs = lhs | rhs; }
160 };
161 /// @}
162 
163 /// Helpers for downcasting to a specific grid type
164 /// @{
165 template <typename GridType>
166 inline const GridType *
167 UTvdbGridCast(const openvdb::GridBase *grid)
168  { return UTverify_cast<const GridType *>(grid); }
169 
170 template <typename GridType>
171 inline GridType *
172 UTvdbGridCast(openvdb::GridBase *grid)
173  { return UTverify_cast<GridType *>(grid); }
174 
175 template <typename GridType>
176 inline const GridType &
177 UTvdbGridCast(const openvdb::GridBase &grid)
178  { return *UTverify_cast<const GridType *>(&grid); }
179 
180 template <typename GridType>
181 inline GridType &
182 UTvdbGridCast(openvdb::GridBase &grid)
183  { return *UTverify_cast<GridType *>(&grid); }
184 
185 template <typename GridType>
186 inline typename GridType::ConstPtr
187 UTvdbGridCast(openvdb::GridBase::ConstPtr grid)
188  { return openvdb::gridConstPtrCast<GridType>(grid); }
189 
190 template <typename GridType>
191 inline typename GridType::Ptr
192 UTvdbGridCast(openvdb::GridBase::Ptr grid)
193  { return openvdb::gridPtrCast<GridType>(grid); }
194 /// @}
195 
196 ////////////////////////////////////////
197 
198 namespace UT_VDBUtils {
199 
200 // Helper function used internally by UTvdbProcessTypedGrid()
201 // to instantiate a templated functor for a specific grid type
202 // and then to call the functor with a grid of that type
203 template<typename GridType, typename OpType, typename GridBaseType>
204 inline void
205 callTypedGrid(GridBaseType &grid, OpType& op)
206 {
207  op.template operator()<GridType>(UTvdbGridCast<GridType>(grid));
208 }
209 
210 } // namespace UT_VDBUtils
211 
212 ////////////////////////////////////////
213 
214 
215 /// @brief Utility function that, given a generic grid pointer,
216 /// calls a functor on the fully-resolved grid
217 ///
218 /// @par Example:
219 /// @code
220 /// using openvdb::Coord;
221 /// using openvdb::CoordBBox;
222 ///
223 /// struct FillOp {
224 /// const CoordBBox bbox;
225 ///
226 /// FillOp(const CoordBBox& b): bbox(b) {}
227 ///
228 /// template<typename GridT>
229 /// void operator()(GridT& grid) const {
230 /// using ValueT = typename GridT::ValueType;
231 /// grid.fill(bbox, ValueT(1));
232 /// }
233 /// };
234 ///
235 /// GU_PrimVDB* vdb = ...;
236 /// vdb->makeGridUnique();
237 /// CoordBBox bbox(Coord(0,0,0), Coord(10,10,10));
238 /// UTvdbProcessTypedGrid(vdb->getStorageType(), vdb->getGrid(), FillOp(bbox));
239 /// @endcode
240 ///
241 /// @return @c false if the grid type is unknown or unhandled.
242 /// @{
243 #define UT_VDB_DECL_PROCESS_TYPED_GRID(GRID_BASE_T) \
244 template<typename OpType> \
245 inline bool \
246 UTvdbProcessTypedGrid(UT_VDBType grid_type, GRID_BASE_T grid, OpType& op) \
247 { \
248  using namespace openvdb; \
249  using namespace UT_VDBUtils; \
250  switch (grid_type) \
251  { \
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; \
260  } \
261  return true; \
262 } \
263 template<typename OpType> \
264 inline bool \
265 UTvdbProcessTypedGridTopology(UT_VDBType grid_type, GRID_BASE_T grid, OpType& op) \
266 { \
267  using namespace openvdb; \
268  using namespace UT_VDBUtils; \
269  switch (grid_type) \
270  { \
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; \
280  } \
281  return true; \
282 } \
283 template<typename OpType> \
284 inline bool \
285 UTvdbProcessTypedGridVec3(UT_VDBType grid_type, GRID_BASE_T grid, OpType& op) \
286 { \
287  using namespace openvdb; \
288  using namespace UT_VDBUtils; \
289  switch (grid_type) \
290  { \
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; \
295  } \
296  return true; \
297 } \
298 template<typename OpType> \
299 inline bool \
300 UTvdbProcessTypedGridScalar(UT_VDBType grid_type, GRID_BASE_T grid, OpType& op) \
301 { \
302  using namespace openvdb; \
303  using namespace UT_VDBUtils; \
304  switch (grid_type) \
305  { \
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; \
311  } \
312  return true; \
313 } \
314 template<typename OpType> \
315 inline bool \
316 UTvdbProcessTypedGridReal(UT_VDBType grid_type, GRID_BASE_T grid, OpType& op) \
317 { \
318  using namespace openvdb; \
319  using namespace UT_VDBUtils; \
320  switch (grid_type) \
321  { \
322  case UT_VDB_FLOAT: callTypedGrid<FloatGrid>(grid, op); break; \
323  case UT_VDB_DOUBLE: callTypedGrid<DoubleGrid>(grid, op); break; \
324  default: return false; \
325  } \
326  return true; \
327 } \
328 template<typename OpType> \
329 inline bool \
330 UTvdbProcessTypedGridPoint(UT_VDBType grid_type, GRID_BASE_T grid, OpType& op) \
331 { \
332  using namespace openvdb; \
333  using namespace openvdb::tools; \
334  using namespace openvdb::points; \
335  using namespace UT_VDBUtils; \
336  switch (grid_type) \
337  { \
338  case UT_VDB_POINTINDEX: callTypedGrid<PointIndexGrid>(grid, op); break; \
339  case UT_VDB_POINTDATA: callTypedGrid<PointDataGrid>(grid, op); break; \
340  default: return false; \
341  } \
342  return true; \
343 } \
344 /**/
345 UT_VDB_DECL_PROCESS_TYPED_GRID(const openvdb::GridBase &)
346 UT_VDB_DECL_PROCESS_TYPED_GRID(const openvdb::GridBase *)
347 UT_VDB_DECL_PROCESS_TYPED_GRID(openvdb::GridBase::ConstPtr)
348 UT_VDB_DECL_PROCESS_TYPED_GRID(openvdb::GridBase &)
349 UT_VDB_DECL_PROCESS_TYPED_GRID(openvdb::GridBase *)
350 UT_VDB_DECL_PROCESS_TYPED_GRID(openvdb::GridBase::Ptr)
351 
352 /// @}
353 
354 
355 // Helper macro for UTvdbCall* macros, do not outside of this file!
356 #define UT_VDB_CALL(GRIDT, RETURN, FNAME, GRIDBASE, ...) \
357  { \
358  RETURN FNAME <GRIDT> (UTvdbGridCast<GRIDT>(GRIDBASE), __VA_ARGS__ ); \
359  } \
360  /**/
361 
362 //@{
363 /// Macro to invoke the correct type of grid.
364 /// Use like:
365 /// @code
366 /// UTvdbCallScalarType(grid_type, myfunction, grid, parms)
367 /// @endcode
368 /// to invoke
369 /// @code
370 /// template <typename GridType>
371 /// static void
372 /// myfunction(const GridType &grid, parms)
373 /// { }
374 /// @endcode
375 
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__) \
381  /**/
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__) \
388  /**/
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__) \
396  /**/
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__) \
402  /**/
403 #define UTvdbCallBoolType(TYPE, FNAME, GRIDBASE, ...) \
404  if (TYPE == UT_VDB_BOOL) \
405  UT_VDB_CALL(openvdb::BoolGrid,(void),FNAME,GRIDBASE,__VA_ARGS__) \
406  /**/
407 #define UTvdbCallAllType(TYPE, FNAME, GRIDBASE, ...) \
408  UTvdbCallScalarType(TYPE, FNAME, GRIDBASE, __VA_ARGS__) \
409  else UTvdbCallVec3Type(TYPE, FNAME, GRIDBASE, __VA_ARGS__); \
410  /**/
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__) \
415  /**/
416 //@}
417 
418 //@{
419 /// Macro to invoke the correct type of grid.
420 /// Use like:
421 /// @code
422 /// UTvdbReturnScalarType(grid_type, myfunction, grid, parms)
423 /// @endcode
424 /// to invoke
425 /// @code
426 /// return myfunction(grid, parms);
427 /// @endcode
428 /// via:
429 /// @code
430 /// template <typename GridType>
431 /// static RESULT
432 /// myfunction(const GridType &grid, parms)
433 /// { }
434 /// @endcode
435 
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__) \
441  /**/
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__) \
448  /**/
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__) \
456  /**/
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__) \
462  /**/
463 #define UTvdbReturnBoolType(TYPE, FNAME, GRIDBASE, ...) \
464  if (TYPE == UT_VDB_BOOL) \
465  UT_VDB_CALL(openvdb::BoolGrid,return,FNAME,GRIDBASE,__VA_ARGS__) \
466  /**/
467 #define UTvdbReturnAllType(TYPE, FNAME, GRIDBASE, ...) \
468  UTvdbReturnScalarType(TYPE, FNAME, GRIDBASE, __VA_ARGS__) \
469  else UTvdbReturnVec3Type(TYPE, FNAME, GRIDBASE, __VA_ARGS__); \
470  /**/
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__) \
475  /**/
476 //@}
477 
478 
479 ////////////////////////////////////////
480 
481 
482 /// Matrix conversion from openvdb to UT
483 // @{
484 template <typename S>
486 UTvdbConvert(const openvdb::math::Mat4<S> &src)
487 {
488  return UT_Matrix4T<S>(src(0,0), src(0,1), src(0,2), src(0,3),
489  src(1,0), src(1,1), src(1,2), src(1,3),
490  src(2,0), src(2,1), src(2,2), src(2,3),
491  src(3,0), src(3,1), src(3,2), src(3,3));
492 }
493 
494 template <typename S>
496 UTvdbConvert(const openvdb::math::Mat3<S> &src)
497 {
498  return UT_Matrix3T<S>(src(0,0), src(0,1), src(0,2),
499  src(1,0), src(1,1), src(1,2),
500  src(2,0), src(2,1), src(2,2));
501 }
502 
503 template <typename S>
505 UTvdbConvert(const openvdb::math::Mat2<S> &src)
506 {
507  return UT_Matrix2T<S>(src(0,0), src(0,1),
508  src(1,0), src(1,1));
509 }
510 // @}
511 
512 /// Matrix conversion from UT to openvdb
513 // @{
514 template <typename S>
515 openvdb::math::Mat4<S>
517 {
518  return openvdb::math::Mat4<S>(src(0,0), src(0,1), src(0,2), src(0,3),
519  src(1,0), src(1,1), src(1,2), src(1,3),
520  src(2,0), src(2,1), src(2,2), src(2,3),
521  src(3,0), src(3,1), src(3,2), src(3,3));
522 }
523 template <typename S>
524 openvdb::math::Mat3<S>
526 {
527  return openvdb::math::Mat3<S>(src(0,0), src(0,1), src(0,2),
528  src(1,0), src(1,1), src(1,2),
529  src(2,0), src(2,1), src(2,2));
530 }
531 template <typename S>
532 openvdb::math::Mat2<S>
534 {
535  return openvdb::math::Mat2<S>(src(0,0), src(0,1),
536  src(1,0), src(1,1));
537 }
538 // @}
539 
540 /// Vector conversion from openvdb to UT
541 // @{
542 template <typename S>
544 UTvdbConvert(const openvdb::math::Vec4<S> &src)
545 {
546  return UT_Vector4T<S>(src.asPointer());
547 }
548 template <typename S>
550 UTvdbConvert(const openvdb::math::Vec3<S> &src)
551 {
552  return UT_Vector3T<S>(src.asPointer());
553 }
554 template <typename S>
556 UTvdbConvert(const openvdb::math::Vec2<S> &src)
557 {
558  return UT_Vector2T<S>(src.asPointer());
559 }
560 // @}
561 
562 /// Vector conversion from UT to openvdb
563 // @{
564 template <typename S>
565 openvdb::math::Vec4<S>
567 {
568  return openvdb::math::Vec4<S>(src.data());
569 }
570 template <typename S>
571 openvdb::math::Vec3<S>
573 {
574  return openvdb::math::Vec3<S>(src.data());
575 }
576 template <typename S>
577 openvdb::math::Vec2<S>
579 {
580  return openvdb::math::Vec2<S>(src.data());
581 }
582 // @}
583 
584 
585 /// Bounding box conversion from openvdb to UT
586 inline UT_BoundingBoxD
588 {
589  return UT_BoundingBoxD(UTvdbConvert(bbox.getStart().asVec3d()),
590  UTvdbConvert(bbox.getEnd().asVec3d()));
591 }
592 
593 /// Bounding box conversion from openvdb to UT
596 {
598  openvdb::math::Coord(bbox.xmin(), bbox.ymin(), bbox.zmin()),
599  openvdb::math::Coord(bbox.xmax(), bbox.ymax(), bbox.zmax()));
600 }
601 
602 /// Utility method to construct a Transform that lines up with a
603 /// cell-centered Houdini volume with specified origin and voxel size.
604 inline openvdb::math::Transform::Ptr
605 UTvdbCreateTransform(const UT_Vector3 &orig, const UT_Vector3 &voxsize)
606 {
607  // Transforms only valid for square voxels.
608  UT_ASSERT(SYSalmostEqual(voxsize.minComponent(), voxsize.maxComponent()));
609  fpreal vs = voxsize.maxComponent();
610  openvdb::math::Transform::Ptr xform =
611  openvdb::math::Transform::createLinearTransform(vs);
612  // Ensure voxel centers line up.
613  xform->postTranslate(UTvdbConvert(orig) + vs / 2);
614  return xform;
615 }
616 
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]),
620  SYSabs(v1[1]),
621  SYSabs(v1[2]),
622  SYSabs(v1[3])
623  );
624 }
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]),
628  SYSabs(v1[1]),
629  SYSabs(v1[2])
630  );
631 }
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]),
635  SYSabs(v1[1])
636  );
637 }
638 
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]),
642  SYSmin(v1[1], v2[1]),
643  SYSmin(v1[2], v2[2]),
644  SYSmin(v1[3], v2[3])
645  );
646 }
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]),
650  SYSmax(v1[1], v2[1]),
651  SYSmax(v1[2], v2[2]),
652  SYSmax(v1[3], v2[3])
653  );
654 }
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])
661  );
662 }
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])
669  );
670 }
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]),
674  SYSmin(v1[1], v2[1]),
675  SYSmin(v1[2], v2[2])
676  );
677 }
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]),
681  SYSmax(v1[1], v2[1]),
682  SYSmax(v1[2], v2[2])
683  );
684 }
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])
690  );
691 }
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])
697  );
698 }
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]),
702  SYSmin(v1[1], v2[1])
703  );
704 }
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]),
708  SYSmax(v1[1], v2[1])
709  );
710 }
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])
715  );
716 }
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])
721  );
722 }
723 
724 #endif // __UT_VDBUtils__
static void plusEqual(bool &lhs, const bool &rhs)
Definition: UT_VDBUtils.h:158
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:49
Grid< DoubleTree > DoubleGrid
Definition: NanoVDB.h:6494
const GridType * UTvdbGridCast(const openvdb::GridBase *grid)
Definition: UT_VDBUtils.h:167
void UTvdbInitialize()
Calls openvdb::initialize()
Definition: UT_VDBUtils.h:45
#define UT_API
Definition: UT_API.h:14
SYS_FORCE_INLINE TO_T UTverify_cast(FROM_T from)
Definition: UT_Assert.h:229
void callTypedGrid(GridBaseType &grid, OpType &op)
Definition: UT_VDBUtils.h:205
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:174
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:292
OutGridT const XformOp bool bool
openvdb::math::Vec4< T > SYSabs(const openvdb::math::Vec4< T > &v1)
Definition: UT_VDBUtils.h:618
openvdb::math::Vec4< T > SYSmax(const openvdb::math::Vec4< T > &v1, const openvdb::math::Vec4< T > &v2)
Definition: UT_VDBUtils.h:648
constexpr SYS_FORCE_INLINE T minComponent() const noexcept
Definition: UT_Vector3.h:413
#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:243
Grid< Int64Tree > Int64Grid
Definition: NanoVDB.h:6497
UT_API size_t format(char *buffer, size_t buffer_size, const UT_VDBType &v)
Grid< FloatTree > FloatGrid
Definition: NanoVDB.h:6489
openvdb::math::Transform::Ptr UTvdbCreateTransform(const UT_Vector3 &orig, const UT_Vector3 &voxsize)
Definition: UT_VDBUtils.h:605
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:152
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:83
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:217
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:114
fpreal64 fpreal
Definition: SYS_Types.h:278
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:224
GLfloat GLfloat v1
Definition: glcorearb.h:817
Grid< BoolTree > BoolGrid
Definition: NanoVDB.h:6504
#define UT_ASSERT(ZZ)
Definition: UT_Assert.h:156
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:640
constexpr SYS_FORCE_INLINE T maxComponent() const noexcept
Definition: UT_Vector3.h:408
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:486
Grid< Int32Tree > Int32Grid
Definition: NanoVDB.h:6495
GLenum src
Definition: glcorearb.h:1793