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>
51#include <IMX/IMX_VDB.h>
59class GA_PrimVolumeXform;
60using GEO_PrimVolumeXform = GA_PrimVolumeXform;
61class UT_MemoryCounter;
68 typedef uint64 UniqueId;
73 GEO_PrimVDB(GEO_Detail *d, GA_Offset offset = GA_INVALID_OFFSET);
75 ~GEO_PrimVDB()
override;
77 static GA_PrimitiveFamilyMask buildFamilyMask()
78 {
return GA_FAMILY_NONE; }
82 bool isDegenerate()
const override;
83 bool getBBox(UT_BoundingBox *bbox)
const override;
84 void reverse()
override;
85 UT_Vector3 computeNormal()
const override;
86 UT_Vector3D computeNormalD()
const override;
87 void copyPrimitive(
const GEO_Primitive *src)
override;
88 void copySubclassData(
const GA_Primitive *source)
override;
90 int64 getDeviceMemoryUsage()
const override;
97 CE_VDBGrid *getCEGrid(
bool read,
bool write)
const;
103 IMX_VDBPtr getIMXVDB(
bool read,
bool write)
const;
107 void setBorrowedIMXVDB(
const UT_SharedPtr<IMX_VDB> &v);
111 void flushCEWriteCaches()
override;
115 void flushCECaches()
override;
118 void clearCECaches()
override;
121 void stealCEBuffers(
const GA_Primitive *src)
override;
123 using GEO_Primitive::getVertexOffset;
124 using GEO_Primitive::getPointOffset;
125 using GEO_Primitive::setPointOffset;
126 using GEO_Primitive::getPos3;
127 using GEO_Primitive::setPos3;
129 GA_Offset getVertexOffset()
const
130 {
return getVertexOffset(0); }
132 GA_Offset getPointOffset()
const
133 {
return getPointOffset(0); }
135 void setPointOffset(GA_Offset pt)
136 { setPointOffset(0, pt); }
138 UT_Vector3 getPos3()
const
139 {
return getPos3(0); }
141 void setPos3(
const UT_Vector3 &pos)
146 void indexToPos(
int x,
int y,
int z, UT_Vector3 &pos)
const;
147 void findexToPos(UT_Vector3 index, UT_Vector3 &pos)
const;
148 void indexToPos(exint x, exint y, exint z, UT_Vector3D &pos)
const;
149 void findexToPos(UT_Vector3D index, UT_Vector3D &pos)
const;
152 void posToIndex(UT_Vector3 pos,
int &x,
int &y,
int &z)
const;
153 void posToIndex(UT_Vector3 pos, UT_Vector3 &index)
const;
154 void posToIndex(UT_Vector3D pos, exint &x, exint &y, exint &z)
const;
155 void posToIndex(UT_Vector3D pos, UT_Vector3D &index)
const;
160 fpreal getValueF(
const UT_Vector3 &pos)
const;
161 fpreal getValueAtIndexF(
int ix,
int iy,
int iz)
const;
162 UT_Vector3D getValueV3(
const UT_Vector3 &pos)
const;
163 UT_Vector3D getValueAtIndexV3(
int ix,
int iy,
int iz)
const;
165 void getValues(
float *f,
int stride,
const UT_Vector3 *pos,
int num)
const;
166 void getValues(
int *f,
int stride,
const UT_Vector3 *pos,
int num)
const;
167 void getValuesAtIndices(
float *f,
int stride,
const int *ix,
const int *iy,
const int *iz,
int num)
const;
168 void getValuesAtIndices(
int *f,
int stride,
const int *ix,
const int *iy,
const int *iz,
int num)
const;
171 void getValues(UT_Vector3 *f,
int stride,
const UT_Vector3 *pos,
int num)
const;
172 void getValuesAtIndices(UT_Vector3 *f,
int stride,
const int *ix,
const int *iy,
const int *iz,
int num)
const;
174 void getValues(
double *f,
int stride,
const UT_Vector3D *pos,
int num)
const;
175 void getValues(exint *f,
int stride,
const UT_Vector3D *pos,
int num)
const;
176 void getValuesAtIndices(
double *f,
int stride,
const exint *ix,
const exint *iy,
const exint *iz,
int num)
const;
177 void getValuesAtIndices(exint *f,
int stride,
const exint *ix,
const exint *iy,
const exint *iz,
int num)
const;
180 void getValues(UT_Vector3D *f,
int stride,
const UT_Vector3D *pos,
int num)
const;
181 void getValuesAtIndices(UT_Vector3D *f,
int stride,
const exint *ix,
const exint *iy,
const exint *iz,
int num)
const;
184 UT_Vector3 getGradient(
const UT_Vector3 &pos)
const;
191 UT_Vector3 *gradients,
192 int gradients_stride,
193 const UT_Vector3 *positions,
195 bool normalize =
false)
const;
199 UT_VDBType getStorageType()
const
200 {
return myGridAccessor.getStorageType(); }
203 int getTupleSize()
const
204 {
return UTvdbGetGridTupleSize(getStorageType()); }
209 bool isAligned(
const GEO_PrimVDB *vdb)
const;
211 bool isActiveRegionMatched(
const GEO_PrimVDB *vdb)
const;
215 bool isWorldAxisAligned()
const;
219 void transform(
const UT_Matrix4 &mat)
override;
223 bool isEmpty()
const {
return getGridPtr()->empty(); }
226 fpreal backgroundF()
const;
227 UT_Vector3D backgroundV3()
const;
233 void setTransform4(
const UT_DMatrix4 &xform4);
234 void setTransform4(
const UT_Matrix4 &xform4);
235 UT_Matrix4D getTransform4()
const;
243 int detachPoints(GA_PointGroup &grp)
override;
247 GA_DereferenceStatus dereferencePoint(GA_Offset point,
248 bool dry_run=
false)
override;
249 GA_DereferenceStatus dereferencePoints(
const GA_RangeMemberQuery &pt_q,
250 bool dry_run=
false)
override;
251 const GA_PrimitiveJSON *getJSON()
const override;
255 void assignVertex(GA_Offset new_vtx,
bool update_topology);
258 bool evaluatePointRefMap(
259 GA_Offset result_vtx,
260 GA_AttributeRefMap &hlist,
262 uint du, uint dv)
const override;
266 float u,
float v = 0,
267 unsigned du=0,
unsigned dv=0)
const override
269 return GEO_Primitive::evaluatePointV4(pos, u, v,
283 GEO_PrimVolumeXform getIndexSpaceTransform()
const;
289 GEO_PrimVolumeXform getSpaceTransform()
const;
298 GEO_PrimVolumeXform getSpaceTransform(
const UT_BoundingBoxD &bbox)
const;
304 void setSpaceTransform(
const GEO_PrimVolumeXform &space,
305 const UT_Vector3R &resolution,
306 bool force_taper =
false);
310 fpreal getTaper()
const;
314 void getRes(
int &rx,
int &ry,
int &rz)
const;
315 void getRes(int64 &rx, int64 &ry, int64 &rz)
const;
319 fpreal getVoxelDiameter()
const;
322 UT_Vector3 getVoxelSize()
const;
325 fpreal calcMinimum()
const;
326 fpreal calcMaximum()
const;
327 fpreal calcAverage()
const;
335 bool getFrustumBounds(UT_BoundingBox &idxbox)
const;
337 enum ActivateOperation
355 void activateIndexBBox(
356 const openvdb::CoordBBox& bbox,
357 ActivateOperation operation,
358 bool setvalue, fpreal value)
360 activateIndexBBoxAdapter(
361 &bbox, operation, setvalue, value);
368 void activateByVDB(
const GEO_PrimVDB *vdb,
369 ActivateOperation operation,
370 bool setvalue, fpreal value,
371 bool ignore_transform=
false);
376 GEO_Primitive *copy(
int preserve_shared_pts = 0)
const override;
379 void stashed(
bool beingstashed,
380 GA_Offset offset=GA_INVALID_OFFSET)
override;
387 UT_Vector3 baryCenter()
const override;
388 fpreal calcVolume(
const UT_Vector3 &refpt)
const override;
391 fpreal calcArea()
const override;
399 bool enlargeBoundingBox(
401 const GA_Attribute *P)
const override;
402 bool enlargeBoundingBox(
404 const GA_Attribute *P)
const override;
405 void enlargePointBounds(UT_BoundingBox &e)
const override;
411 bool enlargeBoundingSphere(
412 UT_BoundingSphere &b,
413 const GA_Attribute *P)
const override;
419 void getLocalTransform(UT_Matrix3D &result)
const override;
420 void setLocalTransform(
const UT_Matrix3D &new_mat3)
override;
426 static bool conditionMatrix(UT_Matrix4D &mat4);
430 const GEO_VolumeOptions &getVisOptions()
const {
return myVis; }
431 void setVisOptions(
const GEO_VolumeOptions &vis)
432 { setVisualization(vis.myMode, vis.myIso, vis.myDensity, vis.myLod); }
434 void setVisualization(
435 GEO_VolumeVis vismode,
438 GEO_VolumeVisLod lod = GEO_VOLUMEVISLOD_FULL)
440 myVis.myMode = vismode;
442 myVis.myDensity = density;
445 GEO_VolumeVis getVisualization()
const {
return myVis.myMode; }
446 fpreal getVisIso()
const {
return myVis.myIso; }
447 fpreal getVisDensity()
const {
return myVis.myDensity; }
448 GEO_VolumeVisLod getVisLod()
const {
return myVis.myLod; }
449 GEO_VolumeTypeInfo getTypeInfo()
const {
return myVis.myTypeInfo; }
450 void setTypeInfo(GEO_VolumeTypeInfo info) { myVis.myTypeInfo = info; }
454 bool loadOrder(
const UT_JSONValue &p);
458 bool saveVDB(UT_JSONWriter &w,
const GA_SaveMap &sm,
459 bool as_shmem =
false)
const;
460 bool loadVDB(UT_JSONParser &p,
461 bool as_shmem =
false);
464 bool saveVisualization(
466 const GA_SaveMap &map)
const;
467 bool loadVisualization(
469 const GA_LoadMap &map);
472 GA_Offset fastVertexOffset(GA_Size UT_IF_ASSERT_P(index))
const
474 UT_ASSERT_P(index < 1);
475 return getVertexOffset();
478 void setVertexPoint(
int i, GA_Offset pt)
486 fpreal calcPositiveDensity()
const;
489 bool hasGrid()
const {
return myGridAccessor.hasGrid(); }
495 void makeGridUnique()
496 { myGridAccessor.makeGridUnique(); }
500 bool isGridUnique()
const
501 {
return myGridAccessor.isGridUnique(); }
506 const openvdb::GridBase & getConstGrid()
const
507 {
return myGridAccessor.getConstGrid(*
this); }
511 const openvdb::GridBase & getGrid()
const
512 {
return getConstGrid(); }
517 openvdb::GridBase & getGrid()
520 return myGridAccessor.getGrid(*
this);
527 openvdb::GridBase::ConstPtr getConstGridPtr()
const
528 {
return myGridAccessor.getConstGridPtr(*
this); }
533 openvdb::GridBase::ConstPtr getGridPtr()
const
534 {
return getConstGridPtr(); }
540 openvdb::GridBase::Ptr getGridPtr()
543 return myGridAccessor.getGridPtr(*
this);
549 void setGrid(
const openvdb::GridBase &grid,
bool copyPosition=
true)
552 myGridAccessor.setGrid(grid, *
this, copyPosition);
557 const openvdb::MetaMap& getConstMetadata()
const
558 {
return getConstGrid(); }
561 const openvdb::MetaMap& getMetadata()
const
562 {
return getConstGrid(); }
566 openvdb::MetaMap& getMetadata()
568 incrMetadataUniqueId();
569 return myGridAccessor.getGrid(*
this);
574 const char * getGridName()
const;
578 UniqueId getUniqueId()
const
579 {
return static_cast<UniqueId
>(myUniqueId.relaxedLoad()); }
585 UniqueId getTreeUniqueId()
const
586 {
return static_cast<UniqueId
>(myTreeUniqueId.relaxedLoad()); }
591 UniqueId getMetadataUniqueId()
const
592 {
return static_cast<UniqueId
>(myMetadataUniqueId.relaxedLoad()); }
597 UniqueId getTransformUniqueId()
const
598 {
return static_cast<UniqueId
>(myTransformUniqueId.relaxedLoad()); }
613 template<
typename Gr
idTypeListT,
typename OpT>
614 bool apply(OpT& op)
const
615 {
return hasGrid() ? getConstGrid().apply<GridTypeListT>(op) : false; }
635 template<
typename Gr
idTypeListT,
typename OpT>
636 bool apply(OpT& op,
bool makeUnique =
true)
639 auto& grid = myGridAccessor.getGrid(*
this);
642 if (treePtr.use_count() > 2) {
645 grid.
apply<GridTypeListT>([
this](openvdb::GridBase& baseGrid) {
646 baseGrid.setTree(baseGrid.constBaseTree().copy());
647 this->incrTreeUniqueId();
651 if (grid.
apply<GridTypeListT>(op)) {
660 typedef SYS_AtomicCounter AtomicUniqueId;
663 GA_DECLARE_INTRINSICS(
override)
666 static
bool isIntrinsicMetadata(const
char *name);
669 GA_Offset vertexPoint(GA_Size)
const
670 {
return getPointOffset(); }
674 int64 getBaseMemoryUsage()
const;
678 void countBaseMemory(UT_MemoryCounter &counter)
const;
682 static UniqueId nextUniqueId();
684 void incrTreeUniqueId()
685 { myTreeUniqueId.maximum(nextUniqueId()); }
686 void incrMetadataUniqueId()
687 { myMetadataUniqueId.maximum(nextUniqueId()); }
688 void incrTransformUniqueId()
689 { myTransformUniqueId.maximum(nextUniqueId()); }
690 void incrGridUniqueIds()
693 incrMetadataUniqueId();
694 incrTransformUniqueId();
699 void copyGridFrom(
const GEO_PrimVDB&,
bool copyPosition=
true);
718 GridAccessor() : myStorageType(UT_VDB_INVALID)
725 myStorageType = UT_VDB_INVALID;
730 getGrid(
const GEO_PrimVDB &prim)
731 { updateGridTranslates(prim);
return *myGrid; }
734 const openvdb::GridBase &
735 getConstGrid(
const GEO_PrimVDB &prim)
const
736 { updateGridTranslates(prim);
return *myGrid; }
739 openvdb::GridBase::Ptr
740 getGridPtr(
const GEO_PrimVDB &prim)
741 { updateGridTranslates(prim);
return myGrid; }
744 openvdb::GridBase::ConstPtr
745 getConstGridPtr(
const GEO_PrimVDB &prim)
const
746 { updateGridTranslates(prim);
return myGrid; }
751 void setGrid(
const openvdb::GridBase& grid, GEO_PrimVDB& prim,
bool copyPosition=
true)
752 { setGridAdapter(&grid, prim, copyPosition); }
755 const openvdb::math::Transform &xform,
757 { setTransformAdapter(&xform, prim); }
759 void makeGridUnique();
760 bool isGridUnique()
const;
763 UT_VDBType getStorageType()
const {
return myStorageType; }
766 bool hasGrid()
const {
return myGrid != 0; }
768 void clearGridAndSetStorageType(UT_VDBType storage)
769 { myStorageType = storage; myGrid.reset(); }
772 void updateGridTranslates(
const GEO_PrimVDB &prim)
const;
775 void setVertexPosition(
776 const openvdb::math::Transform &xform,
778 { setVertexPositionAdapter(&xform, prim); }
780 void setGridAdapter(
const void* grid, GEO_PrimVDB&,
bool copyPosition);
781 void setTransformAdapter(
const void* xform, GEO_PrimVDB&);
782 void setVertexPositionAdapter(
const void* xform, GEO_PrimVDB&);
785 openvdb::GridBase::Ptr myGrid;
786 UT_VDBType myStorageType;
790 void activateIndexBBoxAdapter(
793 bool setvalue, fpreal value);
796 GridAccessor myGridAccessor;
798 GEO_VolumeOptions myVis;
803 mutable IMX_VDBPtr myCEGrid;
804 mutable bool myCEGridAuthorative;
806 AtomicUniqueId myUniqueId;
807 AtomicUniqueId myTreeUniqueId;
808 AtomicUniqueId myMetadataUniqueId;
809 AtomicUniqueId myTransformUniqueId;
816using ::GEO_VolumeOptions;
825namespace UT_VDBUtils {
832template<
typename Gr
idType,
typename OpType>
834callTypedGrid(GEO_PrimVDB& prim, OpType& op)
836 prim.makeGridUnique();
837 op.template operator()<
GridType>(*(UTverify_cast<GridType*>(&prim.getGrid())));
841template<
typename Gr
idType,
typename OpType>
843callTypedGrid(
const GEO_PrimVDB& prim, OpType& op)
845 op.template operator()<
GridType>(*(UTverify_cast<const GridType*>(&prim.getConstGrid())));
852UT_VDB_DECL_PROCESS_TYPED_GRID(GEO_PrimVDB&)
853UT_VDB_DECL_PROCESS_TYPED_GRID(
const GEO_PrimVDB&)
862template <
typename OpT>
863inline bool GEOvdbProcessTypedGrid(
const GEO_PrimVDB &vdb, OpT &op)
865 return UTvdbProcessTypedGrid(vdb.getStorageType(), vdb.getGrid(), op);
868template <
typename OpT>
869inline bool GEOvdbProcessTypedGridReal(
const GEO_PrimVDB &vdb, OpT &op)
871 return UTvdbProcessTypedGridReal(vdb.getStorageType(), vdb.getGrid(), op);
874template <
typename OpT>
875inline bool GEOvdbProcessTypedGridScalar(
const GEO_PrimVDB &vdb, OpT &op)
877 return UTvdbProcessTypedGridScalar(vdb.getStorageType(), vdb.getGrid(), op);
880template <
typename OpT>
881inline bool GEOvdbProcessTypedGridTopology(
const GEO_PrimVDB &vdb, OpT &op)
883 return UTvdbProcessTypedGridTopology(vdb.getStorageType(), vdb.getGrid(), op);
886template <
typename OpT>
887inline bool GEOvdbProcessTypedGridVec3(
const GEO_PrimVDB &vdb, OpT &op)
889 return UTvdbProcessTypedGridVec3(vdb.getStorageType(), vdb.getGrid(), op);
892template <
typename OpT>
893inline bool GEOvdbProcessTypedGridPoint(
const GEO_PrimVDB &vdb, OpT &op)
895 return UTvdbProcessTypedGridPoint(vdb.getStorageType(), vdb.getGrid(), op);
906template <
typename OpT>
907inline bool GEOvdbProcessTypedGrid(GEO_PrimVDB &vdb, OpT &op,
bool makeUnique =
true)
909 if (makeUnique)
return UTvdbProcessTypedGrid(vdb.getStorageType(), vdb, op);
910 return UTvdbProcessTypedGrid(vdb.getStorageType(), vdb.getGrid(), op);
913template <
typename OpT>
914inline bool GEOvdbProcessTypedGridReal(GEO_PrimVDB &vdb, OpT &op,
bool makeUnique =
true)
916 if (makeUnique)
return UTvdbProcessTypedGridReal(vdb.getStorageType(), vdb, op);
917 return UTvdbProcessTypedGridReal(vdb.getStorageType(), vdb.getGrid(), op);
920template <
typename OpT>
921inline bool GEOvdbProcessTypedGridScalar(GEO_PrimVDB &vdb, OpT &op,
bool makeUnique =
true)
923 if (makeUnique)
return UTvdbProcessTypedGridScalar(vdb.getStorageType(), vdb, op);
924 return UTvdbProcessTypedGridScalar(vdb.getStorageType(), vdb.getGrid(), op);
927template <
typename OpT>
928inline bool GEOvdbProcessTypedGridTopology(GEO_PrimVDB &vdb, OpT &op,
bool makeUnique =
true)
930 if (makeUnique)
return UTvdbProcessTypedGridTopology(vdb.getStorageType(), vdb, op);
931 return UTvdbProcessTypedGridTopology(vdb.getStorageType(), vdb.getGrid(), op);
934template <
typename OpT>
935inline bool GEOvdbProcessTypedGridVec3(GEO_PrimVDB &vdb, OpT &op,
bool makeUnique =
true)
937 if (makeUnique)
return UTvdbProcessTypedGridVec3(vdb.getStorageType(), vdb, op);
938 return UTvdbProcessTypedGridVec3(vdb.getStorageType(), vdb.getGrid(), op);
941template <
typename OpT>
942inline bool GEOvdbProcessTypedGridPoint(GEO_PrimVDB &vdb, OpT &op,
bool makeUnique =
true)
944 if (makeUnique)
return UTvdbProcessTypedGridPoint(vdb.getStorageType(), vdb, op);
945 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:1795
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:1260
GridType
List of types that are currently supported by NanoVDB.
Definition NanoVDB.h:219
Definition AttributeTransferUtil.h:34