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;
62 typedef uint64 UniqueId;
67 GEO_PrimVDB(GEO_Detail *d, GA_Offset offset = GA_INVALID_OFFSET);
69 ~GEO_PrimVDB()
override;
71 static GA_PrimitiveFamilyMask buildFamilyMask()
72 {
return GA_FAMILY_NONE; }
76 bool isDegenerate()
const override;
77 bool getBBox(UT_BoundingBox *bbox)
const override;
78 void reverse()
override;
79 UT_Vector3 computeNormal()
const override;
80 UT_Vector3D computeNormalD()
const override;
81 void copyPrimitive(
const GEO_Primitive *src)
override;
82 void copySubclassData(
const GA_Primitive *source)
override;
89 CE_VDBGrid *getCEGrid(
bool read,
bool write)
const;
93 void flushCEWriteCaches()
override;
97 void flushCECaches()
override;
100 void stealCEBuffers(
const GA_Primitive *src)
override;
102 using GEO_Primitive::getVertexOffset;
103 using GEO_Primitive::getPointOffset;
104 using GEO_Primitive::setPointOffset;
105 using GEO_Primitive::getPos3;
106 using GEO_Primitive::setPos3;
108 GA_Offset getVertexOffset()
const 109 {
return getVertexOffset(0); }
111 GA_Offset getPointOffset()
const 112 {
return getPointOffset(0); }
114 void setPointOffset(GA_Offset pt)
115 { setPointOffset(0, pt); }
117 UT_Vector3 getPos3()
const 118 {
return getPos3(0); }
120 void setPos3(
const UT_Vector3 &pos)
125 void indexToPos(
int x,
int y,
int z, UT_Vector3 &pos)
const;
126 void findexToPos(UT_Vector3 index, UT_Vector3 &pos)
const;
127 void indexToPos(exint x, exint y, exint z, UT_Vector3D &pos)
const;
128 void findexToPos(UT_Vector3D index, UT_Vector3D &pos)
const;
131 void posToIndex(UT_Vector3 pos,
int &x,
int &y,
int &z)
const;
132 void posToIndex(UT_Vector3 pos, UT_Vector3 &index)
const;
133 void posToIndex(UT_Vector3D pos, exint &x, exint &y, exint &z)
const;
134 void posToIndex(UT_Vector3D pos, UT_Vector3D &index)
const;
139 fpreal getValueF(
const UT_Vector3 &pos)
const;
140 fpreal getValueAtIndexF(
int ix,
int iy,
int iz)
const;
141 UT_Vector3D getValueV3(
const UT_Vector3 &pos)
const;
142 UT_Vector3D getValueAtIndexV3(
int ix,
int iy,
int iz)
const;
144 void getValues(
float *f,
int stride,
const UT_Vector3 *pos,
int num)
const;
145 void getValues(
int *f,
int stride,
const UT_Vector3 *pos,
int num)
const;
146 void getValuesAtIndices(
float *f,
int stride,
const int *ix,
const int *iy,
const int *iz,
int num)
const;
147 void getValuesAtIndices(
int *f,
int stride,
const int *ix,
const int *iy,
const int *iz,
int num)
const;
150 void getValues(UT_Vector3 *f,
int stride,
const UT_Vector3 *pos,
int num)
const;
151 void getValuesAtIndices(UT_Vector3 *f,
int stride,
const int *ix,
const int *iy,
const int *iz,
int num)
const;
153 void getValues(
double *f,
int stride,
const UT_Vector3D *pos,
int num)
const;
154 void getValues(exint *f,
int stride,
const UT_Vector3D *pos,
int num)
const;
155 void getValuesAtIndices(
double *f,
int stride,
const exint *ix,
const exint *iy,
const exint *iz,
int num)
const;
156 void getValuesAtIndices(exint *f,
int stride,
const exint *ix,
const exint *iy,
const exint *iz,
int num)
const;
159 void getValues(UT_Vector3D *f,
int stride,
const UT_Vector3D *pos,
int num)
const;
160 void getValuesAtIndices(UT_Vector3D *f,
int stride,
const exint *ix,
const exint *iy,
const exint *iz,
int num)
const;
163 UT_Vector3 getGradient(
const UT_Vector3 &pos)
const;
170 UT_Vector3 *gradients,
171 int gradients_stride,
172 const UT_Vector3 *positions,
178 UT_VDBType getStorageType()
const 179 {
return myGridAccessor.getStorageType(); }
182 int getTupleSize()
const 183 {
return UTvdbGetGridTupleSize(getStorageType()); }
188 bool isAligned(
const GEO_PrimVDB *vdb)
const;
190 bool isActiveRegionMatched(
const GEO_PrimVDB *vdb)
const;
194 bool isWorldAxisAligned()
const;
198 void transform(
const UT_Matrix4 &mat)
override;
202 bool isEmpty()
const {
return getGridPtr()->empty(); }
205 fpreal backgroundF()
const;
206 UT_Vector3D backgroundV3()
const;
212 void setTransform4(
const UT_DMatrix4 &xform4);
213 void setTransform4(
const UT_Matrix4 &xform4);
214 UT_Matrix4D getTransform4()
const;
222 int detachPoints(GA_PointGroup &grp)
override;
226 GA_DereferenceStatus dereferencePoint(GA_Offset point,
227 bool dry_run=
false)
override;
228 GA_DereferenceStatus dereferencePoints(
const GA_RangeMemberQuery &pt_q,
229 bool dry_run=
false)
override;
230 const GA_PrimitiveJSON *getJSON()
const override;
234 void assignVertex(GA_Offset new_vtx,
bool update_topology);
237 bool evaluatePointRefMap(
238 GA_Offset result_vtx,
239 GA_AttributeRefMap &hlist,
241 uint du, uint dv)
const override;
245 float u,
float v = 0,
246 unsigned du=0,
unsigned dv=0)
const override 248 return GEO_Primitive::evaluatePointV4(pos, u, v,
262 GEO_PrimVolumeXform getIndexSpaceTransform()
const;
268 GEO_PrimVolumeXform getSpaceTransform()
const;
277 GEO_PrimVolumeXform getSpaceTransform(
const UT_BoundingBoxD &bbox)
const;
283 void setSpaceTransform(
const GEO_PrimVolumeXform &space,
284 const UT_Vector3R &resolution,
285 bool force_taper =
false);
289 fpreal getTaper()
const;
293 void getRes(
int &rx,
int &ry,
int &rz)
const;
294 void getRes(int64 &rx, int64 &ry, int64 &rz)
const;
298 fpreal getVoxelDiameter()
const;
301 UT_Vector3 getVoxelSize()
const;
304 fpreal calcMinimum()
const;
305 fpreal calcMaximum()
const;
306 fpreal calcAverage()
const;
314 bool getFrustumBounds(UT_BoundingBox &idxbox)
const;
316 enum ActivateOperation
329 void activateIndexBBox(
331 ActivateOperation operation,
332 bool setvalue, fpreal value)
334 activateIndexBBoxAdapter(
335 &bbox, operation, setvalue, value);
342 void activateByVDB(
const GEO_PrimVDB *vdb,
343 ActivateOperation operation,
344 bool setvalue, fpreal value,
345 bool ignore_transform=
false);
350 GEO_Primitive *copy(
int preserve_shared_pts = 0)
const override;
353 void stashed(
bool beingstashed,
354 GA_Offset offset=GA_INVALID_OFFSET)
override;
361 UT_Vector3 baryCenter()
const override;
362 fpreal calcVolume(
const UT_Vector3 &refpt)
const override;
365 fpreal calcArea()
const override;
373 bool enlargeBoundingBox(
375 const GA_Attribute *P)
const override;
376 bool enlargeBoundingBox(
378 const GA_Attribute *P)
const override;
379 void enlargePointBounds(UT_BoundingBox &e)
const override;
385 bool enlargeBoundingSphere(
386 UT_BoundingSphere &b,
387 const GA_Attribute *P)
const override;
393 void getLocalTransform(UT_Matrix3D &result)
const override;
394 void setLocalTransform(
const UT_Matrix3D &new_mat3)
override;
400 static bool conditionMatrix(UT_Matrix4D &mat4);
404 const GEO_VolumeOptions &getVisOptions()
const {
return myVis; }
405 void setVisOptions(
const GEO_VolumeOptions &vis)
406 { setVisualization(vis.myMode, vis.myIso, vis.myDensity, vis.myLod); }
408 void setVisualization(
409 GEO_VolumeVis vismode,
412 GEO_VolumeVisLod lod = GEO_VOLUMEVISLOD_FULL)
414 myVis.myMode = vismode;
416 myVis.myDensity = density;
419 GEO_VolumeVis getVisualization()
const {
return myVis.myMode; }
420 fpreal getVisIso()
const {
return myVis.myIso; }
421 fpreal getVisDensity()
const {
return myVis.myDensity; }
422 GEO_VolumeVisLod getVisLod()
const {
return myVis.myLod; }
426 bool loadOrder(
const UT_JSONValue &p);
430 bool saveVDB(UT_JSONWriter &w,
const GA_SaveMap &sm,
431 bool as_shmem =
false)
const;
432 bool loadVDB(UT_JSONParser &p,
433 bool as_shmem =
false);
436 bool saveVisualization(
438 const GA_SaveMap &map)
const;
439 bool loadVisualization(
441 const GA_LoadMap &map);
444 GA_Offset fastVertexOffset(GA_Size UT_IF_ASSERT_P(index))
const 446 UT_ASSERT_P(index < 1);
447 return getVertexOffset();
450 void setVertexPoint(
int i, GA_Offset pt)
458 fpreal calcPositiveDensity()
const;
461 bool hasGrid()
const {
return myGridAccessor.hasGrid(); }
467 void makeGridUnique()
468 { myGridAccessor.makeGridUnique(); }
472 bool isGridUnique()
const 473 {
return myGridAccessor.isGridUnique(); }
479 {
return myGridAccessor.getConstGrid(*
this); }
484 {
return getConstGrid(); }
492 return myGridAccessor.getGrid(*
this);
500 {
return myGridAccessor.getConstGridPtr(*
this); }
506 {
return getConstGridPtr(); }
515 return myGridAccessor.getGridPtr(*
this);
524 myGridAccessor.setGrid(grid, *
this, copyPosition);
530 {
return getConstGrid(); }
534 {
return getConstGrid(); }
540 incrMetadataUniqueId();
541 return myGridAccessor.getGrid(*
this);
546 const char * getGridName()
const;
550 UniqueId getUniqueId()
const 551 {
return static_cast<UniqueId
>(myUniqueId.relaxedLoad()); }
557 UniqueId getTreeUniqueId()
const 558 {
return static_cast<UniqueId
>(myTreeUniqueId.relaxedLoad()); }
563 UniqueId getMetadataUniqueId()
const 564 {
return static_cast<UniqueId
>(myMetadataUniqueId.relaxedLoad()); }
569 UniqueId getTransformUniqueId()
const 570 {
return static_cast<UniqueId
>(myTransformUniqueId.relaxedLoad()); }
585 template<
typename Gr
idTypeListT,
typename OpT>
586 bool apply(OpT& op)
const 587 {
return hasGrid() ? getConstGrid().apply<GridTypeListT>(op) :
false; }
607 template<
typename Gr
idTypeListT,
typename OpT>
608 bool apply(OpT& op,
bool makeUnique =
true)
611 auto& grid = myGridAccessor.getGrid(*
this);
614 if (treePtr.use_count() > 2) {
618 baseGrid.setTree(baseGrid.constBaseTree().copy());
619 this->incrTreeUniqueId();
623 if (grid.
apply<GridTypeListT>(op)) {
632 typedef SYS_AtomicCounter AtomicUniqueId;
635 GA_DECLARE_INTRINSICS(
override)
638 static
bool isIntrinsicMetadata(const
char *name);
641 GA_Offset vertexPoint(GA_Size)
const 642 {
return getPointOffset(); }
646 int64 getBaseMemoryUsage()
const;
650 void countBaseMemory(UT_MemoryCounter &counter)
const;
654 static UniqueId nextUniqueId();
656 void incrTreeUniqueId()
657 { myTreeUniqueId.maximum(nextUniqueId()); }
658 void incrMetadataUniqueId()
659 { myMetadataUniqueId.maximum(nextUniqueId()); }
660 void incrTransformUniqueId()
661 { myTransformUniqueId.maximum(nextUniqueId()); }
662 void incrGridUniqueIds()
665 incrMetadataUniqueId();
666 incrTransformUniqueId();
671 void copyGridFrom(
const GEO_PrimVDB&,
bool copyPosition=
true);
690 GridAccessor() : myStorageType(UT_VDB_INVALID)
697 myStorageType = UT_VDB_INVALID;
702 getGrid(
const GEO_PrimVDB &prim)
703 { updateGridTranslates(prim);
return *myGrid; }
707 getConstGrid(
const GEO_PrimVDB &prim)
const 708 { updateGridTranslates(prim);
return *myGrid; }
712 getGridPtr(
const GEO_PrimVDB &prim)
713 { updateGridTranslates(prim);
return myGrid; }
717 getConstGridPtr(
const GEO_PrimVDB &prim)
const 718 { updateGridTranslates(prim);
return myGrid; }
723 void setGrid(
const openvdb::GridBase& grid, GEO_PrimVDB& prim,
bool copyPosition=
true)
724 { setGridAdapter(&grid, prim, copyPosition); }
727 const openvdb::math::Transform &xform,
729 { setTransformAdapter(&xform, prim); }
731 void makeGridUnique();
732 bool isGridUnique()
const;
735 UT_VDBType getStorageType()
const {
return myStorageType; }
738 bool hasGrid()
const {
return myGrid != 0; }
741 void updateGridTranslates(
const GEO_PrimVDB &prim)
const;
744 void setVertexPosition(
745 const openvdb::math::Transform &xform,
747 { setVertexPositionAdapter(&xform, prim); }
749 void setGridAdapter(
const void* grid, GEO_PrimVDB&,
bool copyPosition);
750 void setTransformAdapter(
const void* xform, GEO_PrimVDB&);
751 void setVertexPositionAdapter(
const void* xform, GEO_PrimVDB&);
755 UT_VDBType myStorageType;
759 void activateIndexBBoxAdapter(
762 bool setvalue, fpreal value);
765 GridAccessor myGridAccessor;
767 GEO_VolumeOptions myVis;
769 mutable CE_VDBGrid *myCEGrid;
770 mutable bool myCEGridAuthorative;
771 mutable bool myCEGridIsOwned;
773 AtomicUniqueId myUniqueId;
774 AtomicUniqueId myTreeUniqueId;
775 AtomicUniqueId myMetadataUniqueId;
776 AtomicUniqueId myTransformUniqueId;
783 using ::GEO_VolumeOptions;
792 namespace UT_VDBUtils {
799 template<
typename Gr
idType,
typename OpType>
801 callTypedGrid(GEO_PrimVDB& prim, OpType& op)
803 prim.makeGridUnique();
804 op.template operator()<
GridType>(*(UTverify_cast<
GridType*>(&prim.getGrid())));
808 template<
typename Gr
idType,
typename OpType>
810 callTypedGrid(
const GEO_PrimVDB& prim, OpType& op)
812 op.template operator()<
GridType>(*(UTverify_cast<
const GridType*>(&prim.getConstGrid())));
819 UT_VDB_DECL_PROCESS_TYPED_GRID(GEO_PrimVDB&)
820 UT_VDB_DECL_PROCESS_TYPED_GRID(const GEO_PrimVDB&)
829 template <typename OpT>
830 inline
bool GEOvdbProcessTypedGrid(const GEO_PrimVDB &vdb, OpT &op)
832 return UTvdbProcessTypedGrid(vdb.getStorageType(), vdb.getGrid(), op);
835 template <
typename OpT>
836 inline bool GEOvdbProcessTypedGridReal(
const GEO_PrimVDB &vdb, OpT &op)
838 return UTvdbProcessTypedGridReal(vdb.getStorageType(), vdb.getGrid(), op);
841 template <
typename OpT>
842 inline bool GEOvdbProcessTypedGridScalar(
const GEO_PrimVDB &vdb, OpT &op)
844 return UTvdbProcessTypedGridScalar(vdb.getStorageType(), vdb.getGrid(), op);
847 template <
typename OpT>
848 inline bool GEOvdbProcessTypedGridTopology(
const GEO_PrimVDB &vdb, OpT &op)
850 return UTvdbProcessTypedGridTopology(vdb.getStorageType(), vdb.getGrid(), op);
853 template <
typename OpT>
854 inline bool GEOvdbProcessTypedGridVec3(
const GEO_PrimVDB &vdb, OpT &op)
856 return UTvdbProcessTypedGridVec3(vdb.getStorageType(), vdb.getGrid(), op);
859 template <
typename OpT>
860 inline bool GEOvdbProcessTypedGridPoint(
const GEO_PrimVDB &vdb, OpT &op)
862 return UTvdbProcessTypedGridPoint(vdb.getStorageType(), vdb.getGrid(), op);
873 template <
typename OpT>
874 inline bool GEOvdbProcessTypedGrid(GEO_PrimVDB &vdb, OpT &op,
bool makeUnique =
true)
876 if (makeUnique)
return UTvdbProcessTypedGrid(vdb.getStorageType(), vdb, op);
877 return UTvdbProcessTypedGrid(vdb.getStorageType(), vdb.getGrid(), op);
880 template <
typename OpT>
881 inline bool GEOvdbProcessTypedGridReal(GEO_PrimVDB &vdb, OpT &op,
bool makeUnique =
true)
883 if (makeUnique)
return UTvdbProcessTypedGridReal(vdb.getStorageType(), vdb, op);
884 return UTvdbProcessTypedGridReal(vdb.getStorageType(), vdb.getGrid(), op);
887 template <
typename OpT>
888 inline bool GEOvdbProcessTypedGridScalar(GEO_PrimVDB &vdb, OpT &op,
bool makeUnique =
true)
890 if (makeUnique)
return UTvdbProcessTypedGridScalar(vdb.getStorageType(), vdb, op);
891 return UTvdbProcessTypedGridScalar(vdb.getStorageType(), vdb.getGrid(), op);
894 template <
typename OpT>
895 inline bool GEOvdbProcessTypedGridTopology(GEO_PrimVDB &vdb, OpT &op,
bool makeUnique =
true)
897 if (makeUnique)
return UTvdbProcessTypedGridTopology(vdb.getStorageType(), vdb, op);
898 return UTvdbProcessTypedGridTopology(vdb.getStorageType(), vdb.getGrid(), op);
901 template <
typename OpT>
902 inline bool GEOvdbProcessTypedGridVec3(GEO_PrimVDB &vdb, OpT &op,
bool makeUnique =
true)
904 if (makeUnique)
return UTvdbProcessTypedGridVec3(vdb.getStorageType(), vdb, op);
905 return UTvdbProcessTypedGridVec3(vdb.getStorageType(), vdb.getGrid(), op);
908 template <
typename OpT>
909 inline bool GEOvdbProcessTypedGridPoint(GEO_PrimVDB &vdb, OpT &op,
bool makeUnique =
true)
911 if (makeUnique)
return UTvdbProcessTypedGridPoint(vdb.getStorageType(), vdb, op);
912 return UTvdbProcessTypedGridPoint(vdb.getStorageType(), vdb.getGrid(), op);
916 #endif // __HDK_GEO_PrimVDB__ 918 #endif // SESI_OPENVDB || SESI_OPENVDB_PRIM static bool isAligned(const void *p)
return true if the specified pointer is aligned
Definition: NanoVDB.h:737
SharedPtr< const GridBase > ConstPtr
Definition: Grid.h:81
bool hasGrid(const std::string &fileName, const std::string &gridName)
Return true if the file contains a grid with the specified name.
Definition: IO.h:715
static fileSize_t write(std::ostream &os, const GridHandle< BufferT > &handle, Codec codec, uint32_t n)
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:1768
BBox< Coord > CoordBBox
Definition: NanoVDB.h:2535
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:1227
Definition: AttributeTransferUtil.h:34
GridType
List of types that are currently supported by NanoVDB.
Definition: NanoVDB.h:317
static void read(std::istream &is, BufferT &buffer, Codec codec)
SharedPtr< GridBase > Ptr
Definition: Grid.h:80
Abstract base class for typed grids.
Definition: Grid.h:77