25 #if !defined(SESI_OPENVDB) && !defined(SESI_OPENVDB_PRIM)
27 #include <GEO/GEO_PrimVDB.h>
30 using ::GEO_VolumeOptions;
34 #else // SESI_OPENVDB || SESI_OPENVDB_PRIM
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);
69 static GA_PrimitiveFamilyMask buildFamilyMask()
70 {
return GA_FAMILY_NONE; }
74 virtual bool isDegenerate()
const;
75 virtual int getBBox(UT_BoundingBox *bbox)
const;
76 virtual void reverse();
77 virtual UT_Vector3 computeNormal()
const;
78 virtual void copyPrimitive(
const GEO_Primitive *src);
79 virtual void copySubclassData(
const GA_Primitive *source);
81 using GEO_Primitive::getVertexOffset;
82 using GEO_Primitive::getPointOffset;
83 using GEO_Primitive::setPointOffset;
84 using GEO_Primitive::getPos3;
85 using GEO_Primitive::setPos3;
87 GA_Offset getVertexOffset()
const
88 {
return getVertexOffset(0); }
90 GA_Offset getPointOffset()
const
91 {
return getPointOffset(0); }
93 void setPointOffset(GA_Offset pt)
94 { setPointOffset(0, pt); }
96 UT_Vector3 getPos3()
const
97 {
return getPos3(0); }
99 void setPos3(
const UT_Vector3 &pos)
104 void indexToPos(
int x,
int y,
int z, UT_Vector3 &pos)
const;
105 void findexToPos(UT_Vector3 index, UT_Vector3 &pos)
const;
106 void indexToPos(exint x, exint y, exint z, UT_Vector3D &pos)
const;
107 void findexToPos(UT_Vector3D index, UT_Vector3D &pos)
const;
110 void posToIndex(UT_Vector3 pos,
int &x,
int &y,
int &z)
const;
111 void posToIndex(UT_Vector3 pos, UT_Vector3 &index)
const;
112 void posToIndex(UT_Vector3D pos, exint &x, exint &y, exint &z)
const;
113 void posToIndex(UT_Vector3D pos, UT_Vector3D &index)
const;
118 fpreal getValueF(
const UT_Vector3 &pos)
const;
119 fpreal getValueAtIndexF(
int ix,
int iy,
int iz)
const;
120 UT_Vector3D getValueV3(
const UT_Vector3 &pos)
const;
121 UT_Vector3D getValueAtIndexV3(
int ix,
int iy,
int iz)
const;
123 void getValues(
float *f,
int stride,
const UT_Vector3 *pos,
int num)
const;
124 void getValues(
int *f,
int stride,
const UT_Vector3 *pos,
int num)
const;
125 void getValuesAtIndices(
float *f,
int stride,
const int *ix,
const int *iy,
const int *iz,
int num)
const;
126 void getValuesAtIndices(
int *f,
int stride,
const int *ix,
const int *iy,
const int *iz,
int num)
const;
129 void getValues(UT_Vector3 *f,
int stride,
const UT_Vector3 *pos,
int num)
const;
130 void getValuesAtIndices(UT_Vector3 *f,
int stride,
const int *ix,
const int *iy,
const int *iz,
int num)
const;
132 void getValues(
double *f,
int stride,
const UT_Vector3D *pos,
int num)
const;
133 void getValues(exint *f,
int stride,
const UT_Vector3D *pos,
int num)
const;
134 void getValuesAtIndices(
double *f,
int stride,
const exint *ix,
const exint *iy,
const exint *iz,
int num)
const;
135 void getValuesAtIndices(exint *f,
int stride,
const exint *ix,
const exint *iy,
const exint *iz,
int num)
const;
138 void getValues(UT_Vector3D *f,
int stride,
const UT_Vector3D *pos,
int num)
const;
139 void getValuesAtIndices(UT_Vector3D *f,
int stride,
const exint *ix,
const exint *iy,
const exint *iz,
int num)
const;
142 UT_Vector3 getGradient(
const UT_Vector3 &pos)
const;
149 UT_Vector3 *gradients,
150 int gradients_stride,
151 const UT_Vector3 *positions,
157 UT_VDBType getStorageType()
const
158 {
return myGridAccessor.getStorageType(); }
161 int getTupleSize()
const
162 {
return UTvdbGetGridTupleSize(getStorageType()); }
167 bool isAligned(
const GEO_PrimVDB *vdb)
const;
169 bool isActiveRegionMatched(
const GEO_PrimVDB *vdb)
const;
173 bool isWorldAxisAligned()
const;
177 virtual void transform(
const UT_Matrix4 &mat);
183 void setTransform4(
const UT_DMatrix4 &xform4);
184 void setTransform4(
const UT_Matrix4 &xform4);
185 UT_Matrix4D getTransform4()
const;
193 virtual int detachPoints(GA_PointGroup &grp);
197 virtual GA_DereferenceStatus dereferencePoint(GA_Offset point,
199 virtual GA_DereferenceStatus dereferencePoints(
200 const GA_RangeMemberQuery &pt_q,
202 virtual const GA_PrimitiveJSON *getJSON()
const;
206 void assignVertex(GA_Offset new_vtx,
bool update_topology);
209 virtual bool evaluatePointRefMap(GA_Offset result_vtx,
210 GA_AttributeRefMap &hlist,
211 fpreal u, fpreal v, uint du, uint dv)
const;
213 virtual int evaluatePointV4(UT_Vector4 &pos,
float u,
float v = 0,
214 unsigned du=0,
unsigned dv=0)
const
216 return GEO_Primitive::evaluatePointV4(pos, u, v,
228 GEO_PrimVolumeXform getIndexSpaceTransform()
const;
234 GEO_PrimVolumeXform getSpaceTransform()
const;
243 GEO_PrimVolumeXform getSpaceTransform(
const UT_BoundingBoxD &bbox)
const;
249 void setSpaceTransform(
const GEO_PrimVolumeXform &space,
250 const UT_Vector3R &resolution,
251 bool force_taper =
false);
255 fpreal getTaper()
const;
259 void getRes(
int &rx,
int &ry,
int &rz)
const;
263 fpreal getVoxelDiameter()
const;
266 UT_Vector3 getVoxelSize()
const;
269 fpreal calcMinimum()
const;
270 fpreal calcMaximum()
const;
271 fpreal calcAverage()
const;
279 bool getFrustumBounds(UT_BoundingBox &idxbox)
const;
281 enum ActivateOperation
294 void activateIndexBBox(
296 ActivateOperation operation,
297 bool setvalue, fpreal value)
299 activateIndexBBoxAdapter(
300 &bbox, operation, setvalue, value);
307 void activateByVDB(
const GEO_PrimVDB *vdb,
308 ActivateOperation operation,
309 bool setvalue, fpreal value,
310 bool ignore_transform=
false);
315 virtual GEO_Primitive *copy(
int preserve_shared_pts = 0)
const;
318 virtual void stashed(
bool beingstashed, GA_Offset offset=GA_INVALID_OFFSET);
325 virtual UT_Vector3 baryCenter()
const;
326 virtual fpreal calcVolume(
const UT_Vector3 &refpt)
const;
329 virtual fpreal calcArea()
const;
337 virtual bool enlargeBoundingBox(UT_BoundingRect &b,
338 const GA_Attribute *P)
const;
339 virtual bool enlargeBoundingBox(UT_BoundingBox &b,
340 const GA_Attribute *P)
const;
341 virtual void enlargePointBounds(UT_BoundingBox &e)
const;
347 virtual bool enlargeBoundingSphere(UT_BoundingSphere &b,
348 const GA_Attribute *P)
const;
354 virtual void getLocalTransform(UT_Matrix3D &result)
const;
355 virtual void setLocalTransform(
const UT_Matrix3D &new_mat3);
361 static bool conditionMatrix(UT_Matrix4D &mat4);
365 const GEO_VolumeOptions &getVisOptions()
const {
return myVis; }
366 void setVisOptions(
const GEO_VolumeOptions &vis)
367 { setVisualization(vis.myMode, vis.myIso, vis.myDensity, vis.myLod); }
369 void setVisualization(
370 GEO_VolumeVis vismode,
373 GEO_VolumeVisLod lod = GEO_VOLUMEVISLOD_FULL)
375 myVis.myMode = vismode;
377 myVis.myDensity = density;
380 GEO_VolumeVis getVisualization()
const {
return myVis.myMode; }
381 fpreal getVisIso()
const {
return myVis.myIso; }
382 fpreal getVisDensity()
const {
return myVis.myDensity; }
383 GEO_VolumeVisLod getVisLod()
const {
return myVis.myLod; }
387 bool loadOrder(
const UT_JSONValue &p);
391 bool saveVDB(UT_JSONWriter &w,
const GA_SaveMap &sm,
392 bool as_shmem =
false)
const;
393 bool loadVDB(UT_JSONParser &p,
394 bool as_shmem =
false);
397 bool saveVisualization(
399 const GA_SaveMap &map)
const;
400 bool loadVisualization(
402 const GA_LoadMap &map);
405 GA_Offset fastVertexOffset(GA_Size UT_IF_ASSERT_P(index))
const
407 UT_ASSERT_P(index < 1);
408 return getVertexOffset();
411 void setVertexPoint(
int i, GA_Offset pt)
419 fpreal calcPositiveDensity()
const;
422 bool hasGrid()
const {
return myGridAccessor.hasGrid(); }
428 void makeGridUnique()
429 { myGridAccessor.makeGridUnique(); }
433 bool isGridUnique()
const
434 {
return myGridAccessor.isGridUnique(); }
440 {
return myGridAccessor.getConstGrid(*
this); }
445 {
return getConstGrid(); }
453 return myGridAccessor.getGrid(*
this);
461 {
return myGridAccessor.getConstGridPtr(*
this); }
467 {
return getConstGridPtr(); }
476 return myGridAccessor.getGridPtr(*
this);
485 myGridAccessor.setGrid(grid, *
this, copyPosition);
491 {
return getConstGrid(); }
495 {
return getConstGrid(); }
501 incrMetadataUniqueId();
502 return myGridAccessor.getGrid(*
this);
507 const char * getGridName()
const;
511 UniqueId getUniqueId()
const
512 {
return static_cast<UniqueId
>(myUniqueId.relaxedLoad()); }
518 UniqueId getTreeUniqueId()
const
519 {
return static_cast<UniqueId
>(myTreeUniqueId.relaxedLoad()); }
524 UniqueId getMetadataUniqueId()
const
525 {
return static_cast<UniqueId
>(myMetadataUniqueId.relaxedLoad()); }
530 UniqueId getTransformUniqueId()
const
531 {
return static_cast<UniqueId
>(myTransformUniqueId.relaxedLoad()); }
546 template<
typename Gr
idTypeListT,
typename OpT>
547 bool apply(OpT& op)
const
548 {
return hasGrid() ? getConstGrid().apply<GridTypeListT>(op) :
false; }
568 template<
typename Gr
idTypeListT,
typename OpT>
569 bool apply(OpT& op,
bool makeUnique =
true)
572 auto& grid = myGridAccessor.getGrid(*
this);
575 if (treePtr.use_count() > 2) {
579 baseGrid.setTree(baseGrid.constBaseTree().copy());
580 this->incrTreeUniqueId();
584 if (grid.
apply<GridTypeListT>(op)) {
593 typedef SYS_AtomicCounter AtomicUniqueId;
596 GA_DECLARE_INTRINSICS(GA_NO_OVERRIDE)
599 static bool isIntrinsicMetadata(
const char *
name);
602 GA_Offset vertexPoint(GA_Size)
const
603 {
return getPointOffset(); }
607 int64 getBaseMemoryUsage()
const;
611 void countBaseMemory(UT_MemoryCounter &counter)
const;
615 static UniqueId nextUniqueId();
617 void incrTreeUniqueId()
618 { myTreeUniqueId.maximum(nextUniqueId()); }
619 void incrMetadataUniqueId()
620 { myMetadataUniqueId.maximum(nextUniqueId()); }
621 void incrTransformUniqueId()
622 { myTransformUniqueId.maximum(nextUniqueId()); }
623 void incrGridUniqueIds()
626 incrMetadataUniqueId();
627 incrTransformUniqueId();
632 void copyGridFrom(
const GEO_PrimVDB&,
bool copyPosition=
true);
651 GridAccessor() : myStorageType(UT_VDB_INVALID)
658 myStorageType = UT_VDB_INVALID;
663 getGrid(
const GEO_PrimVDB &prim)
664 { updateGridTranslates(prim);
return *myGrid; }
668 getConstGrid(
const GEO_PrimVDB &prim)
const
669 { updateGridTranslates(prim);
return *myGrid; }
673 getGridPtr(
const GEO_PrimVDB &prim)
674 { updateGridTranslates(prim);
return myGrid; }
678 getConstGridPtr(
const GEO_PrimVDB &prim)
const
679 { updateGridTranslates(prim);
return myGrid; }
684 void setGrid(
const openvdb::GridBase& grid, GEO_PrimVDB& prim,
bool copyPosition=
true)
685 { setGridAdapter(&grid, prim, copyPosition); }
688 const openvdb::math::Transform &xform,
690 { setTransformAdapter(&xform, prim); }
692 void makeGridUnique();
693 bool isGridUnique()
const;
696 UT_VDBType getStorageType()
const {
return myStorageType; }
699 bool hasGrid()
const {
return myGrid != 0; }
702 void updateGridTranslates(
const GEO_PrimVDB &prim)
const;
705 void setVertexPosition(
706 const openvdb::math::Transform &xform,
708 { setVertexPositionAdapter(&xform, prim); }
710 void setGridAdapter(
const void* grid, GEO_PrimVDB&,
bool copyPosition);
711 void setTransformAdapter(
const void* xform, GEO_PrimVDB&);
712 void setVertexPositionAdapter(
const void* xform, GEO_PrimVDB&);
716 UT_VDBType myStorageType;
720 void activateIndexBBoxAdapter(
723 bool setvalue, fpreal value);
726 GridAccessor myGridAccessor;
728 GEO_VolumeOptions myVis;
730 AtomicUniqueId myUniqueId;
731 AtomicUniqueId myTreeUniqueId;
732 AtomicUniqueId myMetadataUniqueId;
733 AtomicUniqueId myTransformUniqueId;
740 using ::GEO_VolumeOptions;
749 namespace UT_VDBUtils {
756 template<
typename Gr
idType,
typename OpType>
758 callTypedGrid(GEO_PrimVDB& prim, OpType& op)
760 prim.makeGridUnique();
761 op.template operator()<GridType>(*(UTverify_cast<GridType*>(&prim.getGrid())));
765 template<
typename Gr
idType,
typename OpType>
767 callTypedGrid(
const GEO_PrimVDB& prim, OpType& op)
769 op.template operator()<GridType>(*(UTverify_cast<const GridType*>(&prim.getConstGrid())));
776 UT_VDB_DECL_PROCESS_TYPED_GRID(GEO_PrimVDB&)
777 UT_VDB_DECL_PROCESS_TYPED_GRID(
const GEO_PrimVDB&)
783 template <
typename OpT>
787 inline bool GEOvdbProcessTypedGrid(
const GEO_PrimVDB &vdb, OpT &op)
789 return UTvdbProcessTypedGrid(vdb.getStorageType(), vdb.getGrid(), op);
792 template <
typename OpT>
793 inline bool GEOvdbProcessTypedGridReal(
const GEO_PrimVDB &vdb, OpT &op)
795 return UTvdbProcessTypedGridReal(vdb.getStorageType(), vdb.getGrid(), op);
798 template <
typename OpT>
799 inline bool GEOvdbProcessTypedGridScalar(
const GEO_PrimVDB &vdb, OpT &op)
801 return UTvdbProcessTypedGridScalar(vdb.getStorageType(), vdb.getGrid(), op);
804 template <
typename OpT>
805 inline bool GEOvdbProcessTypedGridTopology(
const GEO_PrimVDB &vdb, OpT &op)
807 return UTvdbProcessTypedGridTopology(vdb.getStorageType(), vdb.getGrid(), op);
810 template <
typename OpT>
811 inline bool GEOvdbProcessTypedGridVec3(
const GEO_PrimVDB &vdb, OpT &op)
813 return UTvdbProcessTypedGridVec3(vdb.getStorageType(), vdb.getGrid(), op);
816 template <
typename OpT>
817 inline bool GEOvdbProcessTypedGridPoint(
const GEO_PrimVDB &vdb, OpT &op)
819 return UTvdbProcessTypedGridPoint(vdb.getStorageType(), vdb.getGrid(), op);
830 template <
typename OpT>
831 inline bool GEOvdbProcessTypedGrid(GEO_PrimVDB &vdb, OpT &op,
bool makeUnique =
true)
833 if (makeUnique)
return UTvdbProcessTypedGrid(vdb.getStorageType(), vdb, op);
834 return UTvdbProcessTypedGrid(vdb.getStorageType(), vdb.getGrid(), op);
837 template <
typename OpT>
838 inline bool GEOvdbProcessTypedGridReal(GEO_PrimVDB &vdb, OpT &op,
bool makeUnique =
true)
840 if (makeUnique)
return UTvdbProcessTypedGridReal(vdb.getStorageType(), vdb, op);
841 return UTvdbProcessTypedGridReal(vdb.getStorageType(), vdb.getGrid(), op);
844 template <
typename OpT>
845 inline bool GEOvdbProcessTypedGridScalar(GEO_PrimVDB &vdb, OpT &op,
bool makeUnique =
true)
847 if (makeUnique)
return UTvdbProcessTypedGridScalar(vdb.getStorageType(), vdb, op);
848 return UTvdbProcessTypedGridScalar(vdb.getStorageType(), vdb.getGrid(), op);
851 template <
typename OpT>
852 inline bool GEOvdbProcessTypedGridTopology(GEO_PrimVDB &vdb, OpT &op,
bool makeUnique =
true)
854 if (makeUnique)
return UTvdbProcessTypedGridTopology(vdb.getStorageType(), vdb, op);
855 return UTvdbProcessTypedGridTopology(vdb.getStorageType(), vdb.getGrid(), op);
858 template <
typename OpT>
859 inline bool GEOvdbProcessTypedGridVec3(GEO_PrimVDB &vdb, OpT &op,
bool makeUnique =
true)
861 if (makeUnique)
return UTvdbProcessTypedGridVec3(vdb.getStorageType(), vdb, op);
862 return UTvdbProcessTypedGridVec3(vdb.getStorageType(), vdb.getGrid(), op);
865 template <
typename OpT>
866 inline bool GEOvdbProcessTypedGridPoint(GEO_PrimVDB &vdb, OpT &op,
bool makeUnique =
true)
868 if (makeUnique)
return UTvdbProcessTypedGridPoint(vdb.getStorageType(), vdb, op);
869 return UTvdbProcessTypedGridPoint(vdb.getStorageType(), vdb.getGrid(), op);
873 #endif // __HDK_GEO_PrimVDB__
875 #endif // SESI_OPENVDB || SESI_OPENVDB_PRIM