8#ifndef OPENVDB_HOUDINI_GEOMETRY_UTIL_HAS_BEEN_INCLUDED 
    9#define OPENVDB_HOUDINI_GEOMETRY_UTIL_HAS_BEEN_INCLUDED 
   17#include <GU/GU_Detail.h> 
   18#include <GEO/GEO_Primitive.h> 
   26class GA_SplittableRange;
 
   33    #ifdef OPENVDB_HOUDINI_API 
   34        #undef OPENVDB_HOUDINI_API 
   35        #define OPENVDB_HOUDINI_API 
   49    const UT_Vector3* boxColor, 
const UT_Vector3* tickColor,
 
   50    bool shaded, 
bool drawTicks = 
true);
 
   55openvdb::math::Transform::Ptr
 
   57    OP_Node&, OP_Context&, OBJ_Camera&,
 
   58    float offset, 
float nearPlaneDist, 
float farPlaneDist,
 
   59    float voxelDepthSize = 1.0, 
int voxelCountX = 100);
 
   79std::unique_ptr<GU_Detail>
 
   80convertGeometry(
const GU_Detail&, std::string& warning, openvdb::util::NullInterrupter*);
 
   85std::unique_ptr<GU_Detail>
 
   97        const openvdb::math::Transform& transform,
 
   98        std::vector<openvdb::Vec3s>& pointList);
 
  103    GU_Detail 
const * 
const mGdp;
 
  104    const openvdb::math::Transform& mTransform;
 
  105    std::vector<openvdb::Vec3s>* 
const mPointList;
 
 
  117    PrimCpyOp(GU_Detail 
const * 
const gdp, std::vector<openvdb::Vec4I>& primList);
 
  121    GU_Detail 
const * 
const mGdp;
 
  122    std::vector<openvdb::Vec4I>* 
const mPrimList;
 
 
  135    VertexNormalOp(GU_Detail&, 
const GA_PrimitiveGroup* interiorPrims=
nullptr, 
float angle=0.7f);
 
  139    bool isInteriorPrim(GA_Offset primOffset)
 const 
  141        return mInteriorPrims && mInteriorPrims->containsIndex(
 
  142            mDetail.primitiveIndex(primOffset));
 
  145    const GU_Detail& mDetail;
 
  146    const GA_PrimitiveGroup* mInteriorPrims;
 
  147    GA_RWHandleV3 mNormalHandle;
 
 
  159    using EdgeData = openvdb::tools::MeshToVoxelEdgeData;
 
  162        const openvdb::math::Transform& xform, 
const GA_PrimitiveGroup* surfacePrims = 
nullptr,
 
  169    const GU_Detail& mRefGeo;
 
  171    const openvdb::math::Transform& mXForm;
 
  172    const GA_PrimitiveGroup* mSurfacePrims;
 
 
  181template<
typename IndexTreeType, 
typename BoolTreeType>
 
  188        const IndexTreeType& indexTree, 
BoolLeafManager&, 
float edgetolerance = 0.0);
 
  190    void run(
bool threaded = 
true);
 
  192    void operator()(
const tbb::blocked_range<size_t>&) 
const;
 
  195    const GU_Detail& mRefGeo;
 
  196    const IndexTreeType& mIndexTree;
 
  198    float mEdgeTolerance;
 
 
  202template<
typename IndexTreeType, 
typename BoolTreeType>
 
  204    const IndexTreeType& indexTree, 
BoolLeafManager& leafMgr, 
float edgetolerance)
 
  206    , mIndexTree(indexTree)
 
  208    , mEdgeTolerance(edgetolerance)
 
  210    mEdgeTolerance = std::max(0.0f, mEdgeTolerance);
 
  211    mEdgeTolerance = std::min(1.0f, mEdgeTolerance);
 
 
  215template<
typename IndexTreeType, 
typename BoolTreeType>
 
  220        tbb::parallel_for(mLeafs.getRange(), *
this);
 
  222        (*this)(mLeafs.getRange());
 
 
  227template<
typename IndexTreeType, 
typename BoolTreeType>
 
  230    const tbb::blocked_range<size_t>& range)
 const 
  232    using IndexAccessorType = 
typename openvdb::tree::ValueAccessor<const IndexTreeType>;
 
  233    IndexAccessorType idxAcc(mIndexTree);
 
  235    UT_Vector3 tmpN, normal;
 
  236    GA_Offset primOffset;
 
  240    typename BoolTreeType::LeafNodeType::ValueOnIter iter;
 
  242    for (
size_t n = range.begin(); n < range.end(); ++n) {
 
  243        iter = mLeafs.leaf(n).beginValueOn();
 
  244        for (; iter; ++iter) {
 
  245            ijk = iter.getCoord();
 
  247            bool edgeVoxel = 
false;
 
  249            int idx = idxAcc.getValue(ijk);
 
  251            primOffset = mRefGeo.primitiveOffset(idx);
 
  252            normal = mRefGeo.getGEOPrimitive(primOffset)->computeNormal();
 
  254            for (
size_t i = 0; i < 18; ++i) {
 
  255                nijk = ijk + openvdb::util::COORD_OFFSETS[i];
 
  256                if (idxAcc.probeValue(nijk, tmpIdx) && tmpIdx != idx) {
 
  257                    primOffset = mRefGeo.primitiveOffset(tmpIdx);
 
  258                    tmpN = mRefGeo.getGEOPrimitive(primOffset)->computeNormal();
 
  260                    if (normal.dot(tmpN) < mEdgeTolerance) {
 
  267            if (!edgeVoxel) iter.setValueOff();
 
 
A LeafManager manages a linear array of pointers to a given tree's leaf nodes, as well as optional au...
Convert polygonal meshes that consist of quads and/or triangles into signed or unsigned distance fiel...
Signed (x, y, z) 32-bit integer coordinates.
Definition Coord.h:26
void run(bool threaded=true)
Definition GeometryUtil.h:217
void operator()(const tbb::blocked_range< size_t > &) const
Definition GeometryUtil.h:229
openvdb::tree::LeafManager< BoolTreeType > BoolLeafManager
Definition GeometryUtil.h:185
GenAdaptivityMaskOp(const GU_Detail &refGeo, const IndexTreeType &indexTree, BoolLeafManager &, float edgetolerance=0.0)
Definition GeometryUtil.h:203
Deprecated wrapper class with the same interface as HoudiniInterrupter, however it does not derive fr...
Definition Utils.h:209
void operator()(const GA_SplittableRange &) const
PrimCpyOp(GU_Detail const *const gdp, std::vector< openvdb::Vec4I > &primList)
void operator()(const GA_SplittableRange &) const
SharpenFeaturesOp(GU_Detail &meshGeo, const GU_Detail &refGeo, EdgeData &edgeData, const openvdb::math::Transform &xform, const GA_PrimitiveGroup *surfacePrims=nullptr, const openvdb::BoolTree *mask=nullptr)
openvdb::tools::MeshToVoxelEdgeData EdgeData
Definition GeometryUtil.h:159
void operator()(const GA_SplittableRange &) const
VertexNormalOp(GU_Detail &, const GA_PrimitiveGroup *interiorPrims=nullptr, float angle=0.7f)
Definition VoxToNanoVDB.h:15
tree::Tree4< bool, 5, 4, 3 >::Type BoolTree
Common tree types.
Definition openvdb.h:53
Definition AttributeTransferUtil.h:34
OPENVDB_HOUDINI_API bool pointInPrimGroup(GA_Offset ptnOffset, GU_Detail &, const GA_PrimitiveGroup &)
Return true if the point at the given offset is referenced by primitives from a certain primitive gro...
OPENVDB_HOUDINI_API void drawFrustum(GU_Detail &, const openvdb::math::Transform &, const UT_Vector3 *boxColor, const UT_Vector3 *tickColor, bool shaded, bool drawTicks=true)
Add geometry to the given detail to indicate the extents of a frustum transform.
OPENVDB_HOUDINI_API std::unique_ptr< GU_Detail > convertGeometry(const GU_Detail &, std::string &warning, openvdb::util::NullInterrupter *)
Convert geometry to quads and triangles.
OPENVDB_HOUDINI_API openvdb::math::Transform::Ptr frustumTransformFromCamera(OP_Node &, OP_Context &, OBJ_Camera &, float offset, float nearPlaneDist, float farPlaneDist, float voxelDepthSize=1.0, int voxelCountX=100)
Construct a frustum transform from a Houdini camera.