28#if !defined(SESI_OPENVDB) && !defined(SESI_OPENVDB_PRIM)
30#include <GEO/GEO_PrimVDB.h>
33using ::GEO_VolumeOptions;
39#ifndef __HDK_GEO_PrimVDB__
40#define __HDK_GEO_PrimVDB__
42#include <GEO/GEO_Primitive.h>
43#include <GEO/GEO_VolumeOptions.h>
44#include <GA/GA_Defines.h>
46#include <SYS/SYS_AtomicInt.h>
48#include <UT/UT_BoundingBox.h>
57class GEO_PrimVolumeXform;
58class UT_MemoryCounter;
65 typedef uint64 UniqueId;
70 GEO_PrimVDB(GEO_Detail *d, GA_Offset offset = GA_INVALID_OFFSET);
72 ~GEO_PrimVDB()
override;
74 static GA_PrimitiveFamilyMask buildFamilyMask()
75 {
return GA_FAMILY_NONE; }
79 bool isDegenerate()
const override;
80 bool getBBox(UT_BoundingBox *bbox)
const override;
81 void reverse()
override;
82 UT_Vector3 computeNormal()
const override;
83 UT_Vector3D computeNormalD()
const override;
84 void copyPrimitive(
const GEO_Primitive *src)
override;
85 void copySubclassData(
const GA_Primitive *source)
override;
92 CE_VDBGrid *getCEGrid(
bool read,
bool write)
const;
96 void flushCEWriteCaches()
override;
100 void flushCECaches()
override;
103 void stealCEBuffers(
const GA_Primitive *src)
override;
105 using GEO_Primitive::getVertexOffset;
106 using GEO_Primitive::getPointOffset;
107 using GEO_Primitive::setPointOffset;
108 using GEO_Primitive::getPos3;
109 using GEO_Primitive::setPos3;
111 GA_Offset getVertexOffset()
const
112 {
return getVertexOffset(0); }
114 GA_Offset getPointOffset()
const
115 {
return getPointOffset(0); }
117 void setPointOffset(GA_Offset pt)
118 { setPointOffset(0, pt); }
120 UT_Vector3 getPos3()
const
121 {
return getPos3(0); }
123 void setPos3(
const UT_Vector3 &pos)
128 void indexToPos(
int x,
int y,
int z, UT_Vector3 &pos)
const;
129 void findexToPos(UT_Vector3 index, UT_Vector3 &pos)
const;
130 void indexToPos(exint x, exint y, exint z, UT_Vector3D &pos)
const;
131 void findexToPos(UT_Vector3D index, UT_Vector3D &pos)
const;
134 void posToIndex(UT_Vector3 pos,
int &x,
int &y,
int &z)
const;
135 void posToIndex(UT_Vector3 pos, UT_Vector3 &index)
const;
136 void posToIndex(UT_Vector3D pos, exint &x, exint &y, exint &z)
const;
137 void posToIndex(UT_Vector3D pos, UT_Vector3D &index)
const;
142 fpreal getValueF(
const UT_Vector3 &pos)
const;
143 fpreal getValueAtIndexF(
int ix,
int iy,
int iz)
const;
144 UT_Vector3D getValueV3(
const UT_Vector3 &pos)
const;
145 UT_Vector3D getValueAtIndexV3(
int ix,
int iy,
int iz)
const;
147 void getValues(
float *f,
int stride,
const UT_Vector3 *pos,
int num)
const;
148 void getValues(
int *f,
int stride,
const UT_Vector3 *pos,
int num)
const;
149 void getValuesAtIndices(
float *f,
int stride,
const int *ix,
const int *iy,
const int *iz,
int num)
const;
150 void getValuesAtIndices(
int *f,
int stride,
const int *ix,
const int *iy,
const int *iz,
int num)
const;
153 void getValues(UT_Vector3 *f,
int stride,
const UT_Vector3 *pos,
int num)
const;
154 void getValuesAtIndices(UT_Vector3 *f,
int stride,
const int *ix,
const int *iy,
const int *iz,
int num)
const;
156 void getValues(
double *f,
int stride,
const UT_Vector3D *pos,
int num)
const;
157 void getValues(exint *f,
int stride,
const UT_Vector3D *pos,
int num)
const;
158 void getValuesAtIndices(
double *f,
int stride,
const exint *ix,
const exint *iy,
const exint *iz,
int num)
const;
159 void getValuesAtIndices(exint *f,
int stride,
const exint *ix,
const exint *iy,
const exint *iz,
int num)
const;
162 void getValues(UT_Vector3D *f,
int stride,
const UT_Vector3D *pos,
int num)
const;
163 void getValuesAtIndices(UT_Vector3D *f,
int stride,
const exint *ix,
const exint *iy,
const exint *iz,
int num)
const;
166 UT_Vector3 getGradient(
const UT_Vector3 &pos)
const;
173 UT_Vector3 *gradients,
174 int gradients_stride,
175 const UT_Vector3 *positions,
177 bool normalize =
false)
const;
181 UT_VDBType getStorageType()
const
182 {
return myGridAccessor.getStorageType(); }
185 int getTupleSize()
const
186 {
return UTvdbGetGridTupleSize(getStorageType()); }
191 bool isAligned(
const GEO_PrimVDB *vdb)
const;
193 bool isActiveRegionMatched(
const GEO_PrimVDB *vdb)
const;
197 bool isWorldAxisAligned()
const;
201 void transform(
const UT_Matrix4 &mat)
override;
205 bool isEmpty()
const {
return getGridPtr()->empty(); }
208 fpreal backgroundF()
const;
209 UT_Vector3D backgroundV3()
const;
215 void setTransform4(
const UT_DMatrix4 &xform4);
216 void setTransform4(
const UT_Matrix4 &xform4);
217 UT_Matrix4D getTransform4()
const;
225 int detachPoints(GA_PointGroup &grp)
override;
229 GA_DereferenceStatus dereferencePoint(GA_Offset point,
230 bool dry_run=
false)
override;
231 GA_DereferenceStatus dereferencePoints(
const GA_RangeMemberQuery &pt_q,
232 bool dry_run=
false)
override;
233 const GA_PrimitiveJSON *getJSON()
const override;
237 void assignVertex(GA_Offset new_vtx,
bool update_topology);
240 bool evaluatePointRefMap(
241 GA_Offset result_vtx,
242 GA_AttributeRefMap &hlist,
244 uint du, uint dv)
const override;
248 float u,
float v = 0,
249 unsigned du=0,
unsigned dv=0)
const override
251 return GEO_Primitive::evaluatePointV4(pos, u, v,
265 GEO_PrimVolumeXform getIndexSpaceTransform()
const;
271 GEO_PrimVolumeXform getSpaceTransform()
const;
280 GEO_PrimVolumeXform getSpaceTransform(
const UT_BoundingBoxD &bbox)
const;
286 void setSpaceTransform(
const GEO_PrimVolumeXform &space,
287 const UT_Vector3R &resolution,
288 bool force_taper =
false);
292 fpreal getTaper()
const;
296 void getRes(
int &rx,
int &ry,
int &rz)
const;
297 void getRes(int64 &rx, int64 &ry, int64 &rz)
const;
301 fpreal getVoxelDiameter()
const;
304 UT_Vector3 getVoxelSize()
const;
307 fpreal calcMinimum()
const;
308 fpreal calcMaximum()
const;
309 fpreal calcAverage()
const;
317 bool getFrustumBounds(UT_BoundingBox &idxbox)
const;
319 enum ActivateOperation
332 void activateIndexBBox(
333 const openvdb::CoordBBox& bbox,
334 ActivateOperation operation,
335 bool setvalue, fpreal value)
337 activateIndexBBoxAdapter(
338 &bbox, operation, setvalue, value);
345 void activateByVDB(
const GEO_PrimVDB *vdb,
346 ActivateOperation operation,
347 bool setvalue, fpreal value,
348 bool ignore_transform=
false);
353 GEO_Primitive *copy(
int preserve_shared_pts = 0)
const override;
356 void stashed(
bool beingstashed,
357 GA_Offset offset=GA_INVALID_OFFSET)
override;
364 UT_Vector3 baryCenter()
const override;
365 fpreal calcVolume(
const UT_Vector3 &refpt)
const override;
368 fpreal calcArea()
const override;
376 bool enlargeBoundingBox(
378 const GA_Attribute *P)
const override;
379 bool enlargeBoundingBox(
381 const GA_Attribute *P)
const override;
382 void enlargePointBounds(UT_BoundingBox &e)
const override;
388 bool enlargeBoundingSphere(
389 UT_BoundingSphere &b,
390 const GA_Attribute *P)
const override;
396 void getLocalTransform(UT_Matrix3D &result)
const override;
397 void setLocalTransform(
const UT_Matrix3D &new_mat3)
override;
403 static bool conditionMatrix(UT_Matrix4D &mat4);
407 const GEO_VolumeOptions &getVisOptions()
const {
return myVis; }
408 void setVisOptions(
const GEO_VolumeOptions &vis)
409 { setVisualization(vis.myMode, vis.myIso, vis.myDensity, vis.myLod); }
411 void setVisualization(
412 GEO_VolumeVis vismode,
415 GEO_VolumeVisLod lod = GEO_VOLUMEVISLOD_FULL)
417 myVis.myMode = vismode;
419 myVis.myDensity = density;
422 GEO_VolumeVis getVisualization()
const {
return myVis.myMode; }
423 fpreal getVisIso()
const {
return myVis.myIso; }
424 fpreal getVisDensity()
const {
return myVis.myDensity; }
425 GEO_VolumeVisLod getVisLod()
const {
return myVis.myLod; }
429 bool loadOrder(
const UT_JSONValue &p);
433 bool saveVDB(UT_JSONWriter &w,
const GA_SaveMap &sm,
434 bool as_shmem =
false)
const;
435 bool loadVDB(UT_JSONParser &p,
436 bool as_shmem =
false);
439 bool saveVisualization(
441 const GA_SaveMap &map)
const;
442 bool loadVisualization(
444 const GA_LoadMap &map);
447 GA_Offset fastVertexOffset(GA_Size UT_IF_ASSERT_P(index))
const
449 UT_ASSERT_P(index < 1);
450 return getVertexOffset();
453 void setVertexPoint(
int i, GA_Offset pt)
461 fpreal calcPositiveDensity()
const;
464 bool hasGrid()
const {
return myGridAccessor.hasGrid(); }
470 void makeGridUnique()
471 { myGridAccessor.makeGridUnique(); }
475 bool isGridUnique()
const
476 {
return myGridAccessor.isGridUnique(); }
481 const openvdb::GridBase & getConstGrid()
const
482 {
return myGridAccessor.getConstGrid(*
this); }
486 const openvdb::GridBase & getGrid()
const
487 {
return getConstGrid(); }
492 openvdb::GridBase & getGrid()
495 return myGridAccessor.getGrid(*
this);
502 openvdb::GridBase::ConstPtr getConstGridPtr()
const
503 {
return myGridAccessor.getConstGridPtr(*
this); }
508 openvdb::GridBase::ConstPtr getGridPtr()
const
509 {
return getConstGridPtr(); }
515 openvdb::GridBase::Ptr getGridPtr()
518 return myGridAccessor.getGridPtr(*
this);
524 void setGrid(
const openvdb::GridBase &grid,
bool copyPosition=
true)
527 myGridAccessor.setGrid(grid, *
this, copyPosition);
532 const openvdb::MetaMap& getConstMetadata()
const
533 {
return getConstGrid(); }
536 const openvdb::MetaMap& getMetadata()
const
537 {
return getConstGrid(); }
541 openvdb::MetaMap& getMetadata()
543 incrMetadataUniqueId();
544 return myGridAccessor.getGrid(*
this);
549 const char * getGridName()
const;
553 UniqueId getUniqueId()
const
554 {
return static_cast<UniqueId
>(myUniqueId.relaxedLoad()); }
560 UniqueId getTreeUniqueId()
const
561 {
return static_cast<UniqueId
>(myTreeUniqueId.relaxedLoad()); }
566 UniqueId getMetadataUniqueId()
const
567 {
return static_cast<UniqueId
>(myMetadataUniqueId.relaxedLoad()); }
572 UniqueId getTransformUniqueId()
const
573 {
return static_cast<UniqueId
>(myTransformUniqueId.relaxedLoad()); }
588 template<
typename Gr
idTypeListT,
typename OpT>
589 bool apply(OpT& op)
const
590 {
return hasGrid() ? getConstGrid().apply<GridTypeListT>(op) : false; }
610 template<
typename Gr
idTypeListT,
typename OpT>
611 bool apply(OpT& op,
bool makeUnique =
true)
614 auto& grid = myGridAccessor.getGrid(*
this);
617 if (treePtr.use_count() > 2) {
620 grid.
apply<GridTypeListT>([
this](openvdb::GridBase& baseGrid) {
621 baseGrid.setTree(baseGrid.constBaseTree().copy());
622 this->incrTreeUniqueId();
626 if (grid.
apply<GridTypeListT>(op)) {
635 typedef SYS_AtomicCounter AtomicUniqueId;
638 GA_DECLARE_INTRINSICS(
override)
641 static
bool isIntrinsicMetadata(const
char *name);
644 GA_Offset vertexPoint(GA_Size)
const
645 {
return getPointOffset(); }
649 int64 getBaseMemoryUsage()
const;
653 void countBaseMemory(UT_MemoryCounter &counter)
const;
657 static UniqueId nextUniqueId();
659 void incrTreeUniqueId()
660 { myTreeUniqueId.maximum(nextUniqueId()); }
661 void incrMetadataUniqueId()
662 { myMetadataUniqueId.maximum(nextUniqueId()); }
663 void incrTransformUniqueId()
664 { myTransformUniqueId.maximum(nextUniqueId()); }
665 void incrGridUniqueIds()
668 incrMetadataUniqueId();
669 incrTransformUniqueId();
674 void copyGridFrom(
const GEO_PrimVDB&,
bool copyPosition=
true);
693 GridAccessor() : myStorageType(UT_VDB_INVALID)
700 myStorageType = UT_VDB_INVALID;
705 getGrid(
const GEO_PrimVDB &prim)
706 { updateGridTranslates(prim);
return *myGrid; }
709 const openvdb::GridBase &
710 getConstGrid(
const GEO_PrimVDB &prim)
const
711 { updateGridTranslates(prim);
return *myGrid; }
714 openvdb::GridBase::Ptr
715 getGridPtr(
const GEO_PrimVDB &prim)
716 { updateGridTranslates(prim);
return myGrid; }
719 openvdb::GridBase::ConstPtr
720 getConstGridPtr(
const GEO_PrimVDB &prim)
const
721 { updateGridTranslates(prim);
return myGrid; }
726 void setGrid(
const openvdb::GridBase& grid, GEO_PrimVDB& prim,
bool copyPosition=
true)
727 { setGridAdapter(&grid, prim, copyPosition); }
730 const openvdb::math::Transform &xform,
732 { setTransformAdapter(&xform, prim); }
734 void makeGridUnique();
735 bool isGridUnique()
const;
738 UT_VDBType getStorageType()
const {
return myStorageType; }
741 bool hasGrid()
const {
return myGrid != 0; }
744 void updateGridTranslates(
const GEO_PrimVDB &prim)
const;
747 void setVertexPosition(
748 const openvdb::math::Transform &xform,
750 { setVertexPositionAdapter(&xform, prim); }
752 void setGridAdapter(
const void* grid, GEO_PrimVDB&,
bool copyPosition);
753 void setTransformAdapter(
const void* xform, GEO_PrimVDB&);
754 void setVertexPositionAdapter(
const void* xform, GEO_PrimVDB&);
757 openvdb::GridBase::Ptr myGrid;
758 UT_VDBType myStorageType;
762 void activateIndexBBoxAdapter(
765 bool setvalue, fpreal value);
768 GridAccessor myGridAccessor;
770 GEO_VolumeOptions myVis;
772 mutable CE_VDBGrid *myCEGrid;
773 mutable bool myCEGridAuthorative;
774 mutable bool myCEGridIsOwned;
776 AtomicUniqueId myUniqueId;
777 AtomicUniqueId myTreeUniqueId;
778 AtomicUniqueId myMetadataUniqueId;
779 AtomicUniqueId myTransformUniqueId;
786using ::GEO_VolumeOptions;
795namespace UT_VDBUtils {
802template<
typename Gr
idType,
typename OpType>
804callTypedGrid(GEO_PrimVDB& prim, OpType& op)
806 prim.makeGridUnique();
807 op.template operator()<
GridType>(*(UTverify_cast<GridType*>(&prim.getGrid())));
811template<
typename Gr
idType,
typename OpType>
813callTypedGrid(
const GEO_PrimVDB& prim, OpType& op)
815 op.template operator()<
GridType>(*(UTverify_cast<const GridType*>(&prim.getConstGrid())));
822UT_VDB_DECL_PROCESS_TYPED_GRID(GEO_PrimVDB&)
823UT_VDB_DECL_PROCESS_TYPED_GRID(
const GEO_PrimVDB&)
832template <
typename OpT>
833inline bool GEOvdbProcessTypedGrid(
const GEO_PrimVDB &vdb, OpT &op)
835 return UTvdbProcessTypedGrid(vdb.getStorageType(), vdb.getGrid(), op);
838template <
typename OpT>
839inline bool GEOvdbProcessTypedGridReal(
const GEO_PrimVDB &vdb, OpT &op)
841 return UTvdbProcessTypedGridReal(vdb.getStorageType(), vdb.getGrid(), op);
844template <
typename OpT>
845inline bool GEOvdbProcessTypedGridScalar(
const GEO_PrimVDB &vdb, OpT &op)
847 return UTvdbProcessTypedGridScalar(vdb.getStorageType(), vdb.getGrid(), op);
850template <
typename OpT>
851inline bool GEOvdbProcessTypedGridTopology(
const GEO_PrimVDB &vdb, OpT &op)
853 return UTvdbProcessTypedGridTopology(vdb.getStorageType(), vdb.getGrid(), op);
856template <
typename OpT>
857inline bool GEOvdbProcessTypedGridVec3(
const GEO_PrimVDB &vdb, OpT &op)
859 return UTvdbProcessTypedGridVec3(vdb.getStorageType(), vdb.getGrid(), op);
862template <
typename OpT>
863inline bool GEOvdbProcessTypedGridPoint(
const GEO_PrimVDB &vdb, OpT &op)
865 return UTvdbProcessTypedGridPoint(vdb.getStorageType(), vdb.getGrid(), op);
876template <
typename OpT>
877inline bool GEOvdbProcessTypedGrid(GEO_PrimVDB &vdb, OpT &op,
bool makeUnique =
true)
879 if (makeUnique)
return UTvdbProcessTypedGrid(vdb.getStorageType(), vdb, op);
880 return UTvdbProcessTypedGrid(vdb.getStorageType(), vdb.getGrid(), op);
883template <
typename OpT>
884inline bool GEOvdbProcessTypedGridReal(GEO_PrimVDB &vdb, OpT &op,
bool makeUnique =
true)
886 if (makeUnique)
return UTvdbProcessTypedGridReal(vdb.getStorageType(), vdb, op);
887 return UTvdbProcessTypedGridReal(vdb.getStorageType(), vdb.getGrid(), op);
890template <
typename OpT>
891inline bool GEOvdbProcessTypedGridScalar(GEO_PrimVDB &vdb, OpT &op,
bool makeUnique =
true)
893 if (makeUnique)
return UTvdbProcessTypedGridScalar(vdb.getStorageType(), vdb, op);
894 return UTvdbProcessTypedGridScalar(vdb.getStorageType(), vdb.getGrid(), op);
897template <
typename OpT>
898inline bool GEOvdbProcessTypedGridTopology(GEO_PrimVDB &vdb, OpT &op,
bool makeUnique =
true)
900 if (makeUnique)
return UTvdbProcessTypedGridTopology(vdb.getStorageType(), vdb, op);
901 return UTvdbProcessTypedGridTopology(vdb.getStorageType(), vdb.getGrid(), op);
904template <
typename OpT>
905inline bool GEOvdbProcessTypedGridVec3(GEO_PrimVDB &vdb, OpT &op,
bool makeUnique =
true)
907 if (makeUnique)
return UTvdbProcessTypedGridVec3(vdb.getStorageType(), vdb, op);
908 return UTvdbProcessTypedGridVec3(vdb.getStorageType(), vdb.getGrid(), op);
911template <
typename OpT>
912inline bool GEOvdbProcessTypedGridPoint(GEO_PrimVDB &vdb, OpT &op,
bool makeUnique =
true)
914 if (makeUnique)
return UTvdbProcessTypedGridPoint(vdb.getStorageType(), vdb, op);
915 return UTvdbProcessTypedGridPoint(vdb.getStorageType(), vdb.getGrid(), op);
bool apply(OpT &) const
If this grid resolves to one of the listed grid types, invoke the given functor on the resolved grid.
Definition Grid.h:1793
TreeBase::Ptr baseTreePtr()
Return a pointer to this grid's tree, which might be shared with other grids. The pointer is guarante...
Definition Grid.h:1258
GridType
List of types that are currently supported by NanoVDB.
Definition NanoVDB.h:214
Definition AttributeTransferUtil.h:34