25 #if !defined(SESI_OPENVDB) && !defined(SESI_OPENVDB_PRIM)
27 #include <GEO/GEO_PrimVDB.h>
30 using ::GEO_VolumeOptions;
36 #ifndef __HDK_GEO_PrimVDB__
37 #define __HDK_GEO_PrimVDB__
39 #include <GEO/GEO_Primitive.h>
40 #include <GEO/GEO_VolumeOptions.h>
41 #include <GA/GA_Defines.h>
43 #include <SYS/SYS_AtomicInt.h>
45 #include <UT/UT_BoundingBox.h>
54 class GEO_PrimVolumeXform;
55 class UT_MemoryCounter;
61 typedef uint64 UniqueId;
66 GEO_PrimVDB(GEO_Detail *d, GA_Offset offset = GA_INVALID_OFFSET);
68 ~GEO_PrimVDB()
override;
70 static GA_PrimitiveFamilyMask buildFamilyMask()
71 {
return GA_FAMILY_NONE; }
75 bool isDegenerate()
const override;
76 int getBBox(UT_BoundingBox *bbox)
const override;
77 void reverse()
override;
78 UT_Vector3 computeNormal()
const override;
79 void copyPrimitive(
const GEO_Primitive *src)
override;
80 void copySubclassData(
const GA_Primitive *source)
override;
82 using GEO_Primitive::getVertexOffset;
83 using GEO_Primitive::getPointOffset;
84 using GEO_Primitive::setPointOffset;
85 using GEO_Primitive::getPos3;
86 using GEO_Primitive::setPos3;
88 GA_Offset getVertexOffset()
const
89 {
return getVertexOffset(0); }
91 GA_Offset getPointOffset()
const
92 {
return getPointOffset(0); }
94 void setPointOffset(GA_Offset pt)
95 { setPointOffset(0, pt); }
97 UT_Vector3 getPos3()
const
98 {
return getPos3(0); }
100 void setPos3(
const UT_Vector3 &pos)
105 void indexToPos(
int x,
int y,
int z, UT_Vector3 &pos)
const;
106 void findexToPos(UT_Vector3 index, UT_Vector3 &pos)
const;
107 void indexToPos(exint x, exint y, exint z, UT_Vector3D &pos)
const;
108 void findexToPos(UT_Vector3D index, UT_Vector3D &pos)
const;
111 void posToIndex(UT_Vector3 pos,
int &x,
int &y,
int &z)
const;
112 void posToIndex(UT_Vector3 pos, UT_Vector3 &index)
const;
113 void posToIndex(UT_Vector3D pos, exint &x, exint &y, exint &z)
const;
114 void posToIndex(UT_Vector3D pos, UT_Vector3D &index)
const;
119 fpreal getValueF(
const UT_Vector3 &pos)
const;
120 fpreal getValueAtIndexF(
int ix,
int iy,
int iz)
const;
121 UT_Vector3D getValueV3(
const UT_Vector3 &pos)
const;
122 UT_Vector3D getValueAtIndexV3(
int ix,
int iy,
int iz)
const;
124 void getValues(
float *f,
int stride,
const UT_Vector3 *pos,
int num)
const;
125 void getValues(
int *f,
int stride,
const UT_Vector3 *pos,
int num)
const;
126 void getValuesAtIndices(
float *f,
int stride,
const int *ix,
const int *iy,
const int *iz,
int num)
const;
127 void getValuesAtIndices(
int *f,
int stride,
const int *ix,
const int *iy,
const int *iz,
int num)
const;
130 void getValues(UT_Vector3 *f,
int stride,
const UT_Vector3 *pos,
int num)
const;
131 void getValuesAtIndices(UT_Vector3 *f,
int stride,
const int *ix,
const int *iy,
const int *iz,
int num)
const;
133 void getValues(
double *f,
int stride,
const UT_Vector3D *pos,
int num)
const;
134 void getValues(exint *f,
int stride,
const UT_Vector3D *pos,
int num)
const;
135 void getValuesAtIndices(
double *f,
int stride,
const exint *ix,
const exint *iy,
const exint *iz,
int num)
const;
136 void getValuesAtIndices(exint *f,
int stride,
const exint *ix,
const exint *iy,
const exint *iz,
int num)
const;
139 void getValues(UT_Vector3D *f,
int stride,
const UT_Vector3D *pos,
int num)
const;
140 void getValuesAtIndices(UT_Vector3D *f,
int stride,
const exint *ix,
const exint *iy,
const exint *iz,
int num)
const;
143 UT_Vector3 getGradient(
const UT_Vector3 &pos)
const;
150 UT_Vector3 *gradients,
151 int gradients_stride,
152 const UT_Vector3 *positions,
158 UT_VDBType getStorageType()
const
159 {
return myGridAccessor.getStorageType(); }
162 int getTupleSize()
const
163 {
return UTvdbGetGridTupleSize(getStorageType()); }
168 bool isAligned(
const GEO_PrimVDB *vdb)
const;
170 bool isActiveRegionMatched(
const GEO_PrimVDB *vdb)
const;
174 bool isWorldAxisAligned()
const;
178 void transform(
const UT_Matrix4 &mat)
override;
184 void setTransform4(
const UT_DMatrix4 &xform4);
185 void setTransform4(
const UT_Matrix4 &xform4);
186 UT_Matrix4D getTransform4()
const;
194 int detachPoints(GA_PointGroup &grp)
override;
198 GA_DereferenceStatus dereferencePoint(GA_Offset point,
199 bool dry_run=
false)
override;
200 GA_DereferenceStatus dereferencePoints(
const GA_RangeMemberQuery &pt_q,
201 bool dry_run=
false)
override;
202 const GA_PrimitiveJSON *getJSON()
const override;
206 void assignVertex(GA_Offset new_vtx,
bool update_topology);
209 bool evaluatePointRefMap(
210 GA_Offset result_vtx,
211 GA_AttributeRefMap &hlist,
213 uint du, uint dv)
const override;
217 float u,
float v = 0,
218 unsigned du=0,
unsigned dv=0)
const override
220 return GEO_Primitive::evaluatePointV4(pos, u, v,
232 GEO_PrimVolumeXform getIndexSpaceTransform()
const;
238 GEO_PrimVolumeXform getSpaceTransform()
const;
247 GEO_PrimVolumeXform getSpaceTransform(
const UT_BoundingBoxD &bbox)
const;
253 void setSpaceTransform(
const GEO_PrimVolumeXform &space,
254 const UT_Vector3R &resolution,
255 bool force_taper =
false);
259 fpreal getTaper()
const;
263 void getRes(
int &rx,
int &ry,
int &rz)
const;
267 fpreal getVoxelDiameter()
const;
270 UT_Vector3 getVoxelSize()
const;
273 fpreal calcMinimum()
const;
274 fpreal calcMaximum()
const;
275 fpreal calcAverage()
const;
283 bool getFrustumBounds(UT_BoundingBox &idxbox)
const;
285 enum ActivateOperation
298 void activateIndexBBox(
300 ActivateOperation operation,
301 bool setvalue, fpreal value)
303 activateIndexBBoxAdapter(
304 &bbox, operation, setvalue, value);
311 void activateByVDB(
const GEO_PrimVDB *vdb,
312 ActivateOperation operation,
313 bool setvalue, fpreal value,
314 bool ignore_transform=
false);
319 GEO_Primitive *copy(
int preserve_shared_pts = 0)
const override;
322 void stashed(
bool beingstashed,
323 GA_Offset offset=GA_INVALID_OFFSET)
override;
330 UT_Vector3 baryCenter()
const override;
331 fpreal calcVolume(
const UT_Vector3 &refpt)
const override;
334 fpreal calcArea()
const override;
342 bool enlargeBoundingBox(
344 const GA_Attribute *P)
const override;
345 bool enlargeBoundingBox(
347 const GA_Attribute *P)
const override;
348 void enlargePointBounds(UT_BoundingBox &e)
const override;
354 bool enlargeBoundingSphere(
355 UT_BoundingSphere &b,
356 const GA_Attribute *P)
const override;
362 void getLocalTransform(UT_Matrix3D &result)
const override;
363 void setLocalTransform(
const UT_Matrix3D &new_mat3)
override;
369 static bool conditionMatrix(UT_Matrix4D &mat4);
373 const GEO_VolumeOptions &getVisOptions()
const {
return myVis; }
374 void setVisOptions(
const GEO_VolumeOptions &vis)
375 { setVisualization(vis.myMode, vis.myIso, vis.myDensity, vis.myLod); }
377 void setVisualization(
378 GEO_VolumeVis vismode,
381 GEO_VolumeVisLod lod = GEO_VOLUMEVISLOD_FULL)
383 myVis.myMode = vismode;
385 myVis.myDensity = density;
388 GEO_VolumeVis getVisualization()
const {
return myVis.myMode; }
389 fpreal getVisIso()
const {
return myVis.myIso; }
390 fpreal getVisDensity()
const {
return myVis.myDensity; }
391 GEO_VolumeVisLod getVisLod()
const {
return myVis.myLod; }
395 bool loadOrder(
const UT_JSONValue &p);
399 bool saveVDB(UT_JSONWriter &w,
const GA_SaveMap &sm,
400 bool as_shmem =
false)
const;
401 bool loadVDB(UT_JSONParser &p,
402 bool as_shmem =
false);
405 bool saveVisualization(
407 const GA_SaveMap &map)
const;
408 bool loadVisualization(
410 const GA_LoadMap &map);
413 GA_Offset fastVertexOffset(GA_Size UT_IF_ASSERT_P(index))
const
415 UT_ASSERT_P(index < 1);
416 return getVertexOffset();
419 void setVertexPoint(
int i, GA_Offset pt)
427 fpreal calcPositiveDensity()
const;
430 bool hasGrid()
const {
return myGridAccessor.hasGrid(); }
436 void makeGridUnique()
437 { myGridAccessor.makeGridUnique(); }
441 bool isGridUnique()
const
442 {
return myGridAccessor.isGridUnique(); }
448 {
return myGridAccessor.getConstGrid(*
this); }
453 {
return getConstGrid(); }
461 return myGridAccessor.getGrid(*
this);
469 {
return myGridAccessor.getConstGridPtr(*
this); }
475 {
return getConstGridPtr(); }
484 return myGridAccessor.getGridPtr(*
this);
493 myGridAccessor.setGrid(grid, *
this, copyPosition);
499 {
return getConstGrid(); }
503 {
return getConstGrid(); }
509 incrMetadataUniqueId();
510 return myGridAccessor.getGrid(*
this);
515 const char * getGridName()
const;
519 UniqueId getUniqueId()
const
520 {
return static_cast<UniqueId
>(myUniqueId.relaxedLoad()); }
526 UniqueId getTreeUniqueId()
const
527 {
return static_cast<UniqueId
>(myTreeUniqueId.relaxedLoad()); }
532 UniqueId getMetadataUniqueId()
const
533 {
return static_cast<UniqueId
>(myMetadataUniqueId.relaxedLoad()); }
538 UniqueId getTransformUniqueId()
const
539 {
return static_cast<UniqueId
>(myTransformUniqueId.relaxedLoad()); }
554 template<
typename Gr
idTypeListT,
typename OpT>
555 bool apply(OpT& op)
const
556 {
return hasGrid() ? getConstGrid().apply<GridTypeListT>(op) :
false; }
576 template<
typename Gr
idTypeListT,
typename OpT>
577 bool apply(OpT& op,
bool makeUnique =
true)
580 auto& grid = myGridAccessor.getGrid(*
this);
583 if (treePtr.use_count() > 2) {
587 baseGrid.setTree(baseGrid.constBaseTree().copy());
588 this->incrTreeUniqueId();
592 if (grid.
apply<GridTypeListT>(op)) {
601 typedef SYS_AtomicCounter AtomicUniqueId;
604 GA_DECLARE_INTRINSICS(
override)
607 static
bool isIntrinsicMetadata(const
char *name);
610 GA_Offset vertexPoint(GA_Size)
const
611 {
return getPointOffset(); }
615 int64 getBaseMemoryUsage()
const;
619 void countBaseMemory(UT_MemoryCounter &counter)
const;
623 static UniqueId nextUniqueId();
625 void incrTreeUniqueId()
626 { myTreeUniqueId.maximum(nextUniqueId()); }
627 void incrMetadataUniqueId()
628 { myMetadataUniqueId.maximum(nextUniqueId()); }
629 void incrTransformUniqueId()
630 { myTransformUniqueId.maximum(nextUniqueId()); }
631 void incrGridUniqueIds()
634 incrMetadataUniqueId();
635 incrTransformUniqueId();
640 void copyGridFrom(
const GEO_PrimVDB&,
bool copyPosition=
true);
659 GridAccessor() : myStorageType(UT_VDB_INVALID)
666 myStorageType = UT_VDB_INVALID;
671 getGrid(
const GEO_PrimVDB &prim)
672 { updateGridTranslates(prim);
return *myGrid; }
676 getConstGrid(
const GEO_PrimVDB &prim)
const
677 { updateGridTranslates(prim);
return *myGrid; }
681 getGridPtr(
const GEO_PrimVDB &prim)
682 { updateGridTranslates(prim);
return myGrid; }
686 getConstGridPtr(
const GEO_PrimVDB &prim)
const
687 { updateGridTranslates(prim);
return myGrid; }
692 void setGrid(
const openvdb::GridBase& grid, GEO_PrimVDB& prim,
bool copyPosition=
true)
693 { setGridAdapter(&grid, prim, copyPosition); }
696 const openvdb::math::Transform &xform,
698 { setTransformAdapter(&xform, prim); }
700 void makeGridUnique();
701 bool isGridUnique()
const;
704 UT_VDBType getStorageType()
const {
return myStorageType; }
707 bool hasGrid()
const {
return myGrid != 0; }
710 void updateGridTranslates(
const GEO_PrimVDB &prim)
const;
713 void setVertexPosition(
714 const openvdb::math::Transform &xform,
716 { setVertexPositionAdapter(&xform, prim); }
718 void setGridAdapter(
const void* grid, GEO_PrimVDB&,
bool copyPosition);
719 void setTransformAdapter(
const void* xform, GEO_PrimVDB&);
720 void setVertexPositionAdapter(
const void* xform, GEO_PrimVDB&);
724 UT_VDBType myStorageType;
728 void activateIndexBBoxAdapter(
731 bool setvalue, fpreal value);
734 GridAccessor myGridAccessor;
736 GEO_VolumeOptions myVis;
738 AtomicUniqueId myUniqueId;
739 AtomicUniqueId myTreeUniqueId;
740 AtomicUniqueId myMetadataUniqueId;
741 AtomicUniqueId myTransformUniqueId;
748 using ::GEO_VolumeOptions;
757 namespace UT_VDBUtils {
764 template<
typename Gr
idType,
typename OpType>
766 callTypedGrid(GEO_PrimVDB& prim, OpType& op)
768 prim.makeGridUnique();
769 op.template operator()<GridType>(*(UTverify_cast<GridType*>(&prim.getGrid())));
773 template<
typename Gr
idType,
typename OpType>
775 callTypedGrid(
const GEO_PrimVDB& prim, OpType& op)
777 op.template operator()<GridType>(*(UTverify_cast<const GridType*>(&prim.getConstGrid())));
784 UT_VDB_DECL_PROCESS_TYPED_GRID(GEO_PrimVDB&)
785 UT_VDB_DECL_PROCESS_TYPED_GRID(
const GEO_PrimVDB&)
791 template <
typename OpT>
795 inline bool GEOvdbProcessTypedGrid(
const GEO_PrimVDB &vdb, OpT &op)
797 return UTvdbProcessTypedGrid(vdb.getStorageType(), vdb.getGrid(), op);
800 template <
typename OpT>
801 inline bool GEOvdbProcessTypedGridReal(
const GEO_PrimVDB &vdb, OpT &op)
803 return UTvdbProcessTypedGridReal(vdb.getStorageType(), vdb.getGrid(), op);
806 template <
typename OpT>
807 inline bool GEOvdbProcessTypedGridScalar(
const GEO_PrimVDB &vdb, OpT &op)
809 return UTvdbProcessTypedGridScalar(vdb.getStorageType(), vdb.getGrid(), op);
812 template <
typename OpT>
813 inline bool GEOvdbProcessTypedGridTopology(
const GEO_PrimVDB &vdb, OpT &op)
815 return UTvdbProcessTypedGridTopology(vdb.getStorageType(), vdb.getGrid(), op);
818 template <
typename OpT>
819 inline bool GEOvdbProcessTypedGridVec3(
const GEO_PrimVDB &vdb, OpT &op)
821 return UTvdbProcessTypedGridVec3(vdb.getStorageType(), vdb.getGrid(), op);
824 template <
typename OpT>
825 inline bool GEOvdbProcessTypedGridPoint(
const GEO_PrimVDB &vdb, OpT &op)
827 return UTvdbProcessTypedGridPoint(vdb.getStorageType(), vdb.getGrid(), op);
838 template <
typename OpT>
839 inline bool GEOvdbProcessTypedGrid(GEO_PrimVDB &vdb, OpT &op,
bool makeUnique =
true)
841 if (makeUnique)
return UTvdbProcessTypedGrid(vdb.getStorageType(), vdb, op);
842 return UTvdbProcessTypedGrid(vdb.getStorageType(), vdb.getGrid(), op);
845 template <
typename OpT>
846 inline bool GEOvdbProcessTypedGridReal(GEO_PrimVDB &vdb, OpT &op,
bool makeUnique =
true)
848 if (makeUnique)
return UTvdbProcessTypedGridReal(vdb.getStorageType(), vdb, op);
849 return UTvdbProcessTypedGridReal(vdb.getStorageType(), vdb.getGrid(), op);
852 template <
typename OpT>
853 inline bool GEOvdbProcessTypedGridScalar(GEO_PrimVDB &vdb, OpT &op,
bool makeUnique =
true)
855 if (makeUnique)
return UTvdbProcessTypedGridScalar(vdb.getStorageType(), vdb, op);
856 return UTvdbProcessTypedGridScalar(vdb.getStorageType(), vdb.getGrid(), op);
859 template <
typename OpT>
860 inline bool GEOvdbProcessTypedGridTopology(GEO_PrimVDB &vdb, OpT &op,
bool makeUnique =
true)
862 if (makeUnique)
return UTvdbProcessTypedGridTopology(vdb.getStorageType(), vdb, op);
863 return UTvdbProcessTypedGridTopology(vdb.getStorageType(), vdb.getGrid(), op);
866 template <
typename OpT>
867 inline bool GEOvdbProcessTypedGridVec3(GEO_PrimVDB &vdb, OpT &op,
bool makeUnique =
true)
869 if (makeUnique)
return UTvdbProcessTypedGridVec3(vdb.getStorageType(), vdb, op);
870 return UTvdbProcessTypedGridVec3(vdb.getStorageType(), vdb.getGrid(), op);
873 template <
typename OpT>
874 inline bool GEOvdbProcessTypedGridPoint(GEO_PrimVDB &vdb, OpT &op,
bool makeUnique =
true)
876 if (makeUnique)
return UTvdbProcessTypedGridPoint(vdb.getStorageType(), vdb, op);
877 return UTvdbProcessTypedGridPoint(vdb.getStorageType(), vdb.getGrid(), op);
Abstract base class for typed grids.
Definition: Grid.h:78
SharedPtr< const GridBase > ConstPtr
Definition: Grid.h:81
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:1809
SharedPtr< GridBase > Ptr
Definition: Grid.h:80
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:1240
Axis-aligned bounding box of signed integer coordinates.
Definition: Coord.h:249
Definition: AttributeTransferUtil.h:33