OpenVDB  6.1.0
Classes | Namespaces | Enumerations | Functions | Variables
VolumeToMesh.h File Reference

Extract polygonal surfaces from scalar volumes. More...

#include <openvdb/Platform.h>
#include <openvdb/math/Operators.h>
#include <openvdb/tree/ValueAccessor.h>
#include <openvdb/util/Util.h>
#include <boost/scoped_array.hpp>
#include <tbb/blocked_range.h>
#include <tbb/parallel_for.h>
#include <tbb/parallel_reduce.h>
#include <tbb/task_scheduler_init.h>
#include <cmath>
#include <map>
#include <memory>
#include <set>
#include <type_traits>
#include <vector>

Go to the source code of this file.

Classes

class  PolygonPool
 Collection of quads and triangles. More...
 
struct  VolumeToMesh
 Mesh any scalar grid that has a continuous isosurface. More...
 
struct  FillArray< ValueType >
 
struct  ComputePoints< InputTreeType >
 
struct  SeamLineWeights< InputTreeType >
 
struct  SetSeamLineFlags< TreeType >
 
struct  TransferSeamLineFlags< BoolTreeType, SignDataType >
 
struct  MaskSeamLineVoxels< TreeType >
 
struct  MergeVoxelRegions< InputGridType >
 
struct  UniformPrimBuilder
 
struct  AdaptivePrimBuilder
 
struct  MaskTileBorders< InputTreeType >
 
class  PointListCopy
 
struct  LeafNodeVoxelOffsets
 
struct  VoxelEdgeAccessor< AccessorT, _AXIS >
 Utility method to marks all voxels that share an edge. More...
 
struct  IdentifyIntersectingVoxels< InputTreeType >
 
struct  MaskIntersectingVoxels< InputTreeType >
 
struct  MaskBorderVoxels< BoolTreeType >
 
struct  SyncMaskValues< BoolTreeType >
 
struct  MaskSurface< BoolTreeType >
 
struct  ComputeAuxiliaryData< InputTreeType >
 
struct  LeafNodePointCount< LeafNodeLog2Dim >
 
struct  AdaptiveLeafNodePointCount< PointIndexLeafNode >
 
struct  MapPoints< PointIndexLeafNode >
 
struct  ComputePolygons< TreeType, PrimBuilder >
 
struct  CopyArray< T >
 
struct  FlagAndCountQuadsToSubdivide
 
struct  SubdivideQuads
 
struct  ReviseSeamLineFlags
 
struct  MaskDisorientedTrianglePoints< InputTreeType >
 

Namespaces

 openvdb
 
 openvdb::v6_1
 
 openvdb::v6_1::tools
 
 openvdb::v6_1::tools::volume_to_mesh_internal
 

Typedefs

using PointList = boost::scoped_array< openvdb::Vec3s >
 Point and primitive list types. More...
 
using PolygonPoolList = boost::scoped_array< PolygonPool >
 Point and primitive list types. More...
 

Enumerations

enum  { POLYFLAG_EXTERIOR = 0x1, POLYFLAG_FRACTURE_SEAM = 0x2, POLYFLAG_SUBDIVIDED = 0x4 }
 Polygon flags, used for reference based meshing. More...
 
enum  {
  SIGNS = 0xFF, EDGES = 0xE00, INSIDE = 0x100, XEDGE = 0x200,
  YEDGE = 0x400, ZEDGE = 0x800, SEAM = 0x1000
}
 Bit-flags used to classify cells. More...
 

Functions

template<typename GridType >
void volumeToMesh (const GridType &grid, std::vector< Vec3s > &points, std::vector< Vec4I > &quads, double isovalue=0.0)
 Uniformly mesh any scalar grid that has a continuous isosurface. More...
 
template<typename GridType >
void volumeToMesh (const GridType &grid, std::vector< Vec3s > &points, std::vector< Vec3I > &triangles, std::vector< Vec4I > &quads, double isovalue=0.0, double adaptivity=0.0, bool relaxDisorientedTriangles=true)
 Adaptively mesh any scalar grid that has a continuous isosurface. More...
 
Vec3d findFeaturePoint (const std::vector< Vec3d > &points, const std::vector< Vec3d > &normals)
 Given a set of tangent elements, points with corresponding normals, this method returns the intersection point of all tangent elements. More...
 
template<typename ValueType >
void fillArray (ValueType *array, const ValueType &val, const size_t length)
 
bool isPlanarQuad (const Vec3d &p0, const Vec3d &p1, const Vec3d &p2, const Vec3d &p3, double epsilon=0.001)
 
template<typename T >
bool isBoolValue ()
 
template<>
bool isBoolValue< bool > ()
 
template<typename T >
bool isInsideValue (T value, T isovalue)
 
template<>
bool isInsideValue< bool > (bool value, bool)
 
template<typename AccessorT >
void getCellVertexValues (const AccessorT &accessor, Coord ijk, math::Tuple< 8, typename AccessorT::ValueType > &values)
 
template<typename LeafT >
void getCellVertexValues (const LeafT &leaf, const Index offset, math::Tuple< 8, typename LeafT::ValueType > &values)
 
template<typename ValueType >
uint8_t computeSignFlags (const math::Tuple< 8, ValueType > &values, const ValueType iso)
 
template<typename AccessorT >
uint8_t evalCellSigns (const AccessorT &accessor, const Coord &ijk, typename AccessorT::ValueType iso)
 General method that computes the cell-sign configuration at the given ijk coordinate. More...
 
template<typename LeafT >
uint8_t evalCellSigns (const LeafT &leaf, const Index offset, typename LeafT::ValueType iso)
 Leaf node optimized method that computes the cell-sign configuration at the given local offset. More...
 
template<class AccessorT >
void correctCellSigns (uint8_t &signs, uint8_t face, const AccessorT &acc, Coord ijk, typename AccessorT::ValueType iso)
 Used to correct topological ambiguities related to two adjacent cells that share an ambiguous face. More...
 
template<class AccessorT >
bool isNonManifold (const AccessorT &accessor, const Coord &ijk, typename AccessorT::ValueType isovalue, const int dim)
 
template<class LeafType >
void mergeVoxels (LeafType &leaf, const Coord &start, int dim, int regionId)
 
template<class LeafType >
bool isMergable (LeafType &leaf, const Coord &start, int dim, typename LeafType::ValueType::value_type adaptivity)
 
double evalZeroCrossing (double v0, double v1, double iso)
 linear interpolation. More...
 
template<typename LeafT >
void collectCornerValues (const LeafT &leaf, const Index offset, std::vector< double > &values)
 Extracts the eight corner values for leaf inclusive cells. More...
 
template<typename AccessorT >
void collectCornerValues (const AccessorT &acc, const Coord &ijk, std::vector< double > &values)
 Extracts the eight corner values for a cell starting at the given (ijk) coordinate. More...
 
Vec3d computePoint (const std::vector< double > &values, unsigned char signs, unsigned char edgeGroup, double iso)
 Computes the average cell point for a given edge group. More...
 
int computeMaskedPoint (Vec3d &avg, const std::vector< double > &values, unsigned char signs, unsigned char signsMask, unsigned char edgeGroup, double iso)
 Computes the average cell point for a given edge group, ignoring edge samples present in the signsMask configuration. More...
 
Vec3d computeWeightedPoint (const Vec3d &p, const std::vector< double > &values, unsigned char signs, unsigned char edgeGroup, double iso)
 Computes the average cell point for a given edge group, by computing convex weights based on the distance from the sample point p. More...
 
void computeCellPoints (std::vector< Vec3d > &points, const std::vector< double > &values, unsigned char signs, double iso)
 Computes the average cell points defined by the sign configuration signs and the given corner values values. More...
 
int matchEdgeGroup (unsigned char groupId, unsigned char lhsSigns, unsigned char rhsSigns)
 Given a sign configuration lhsSigns and an edge group groupId, finds the corresponding edge group in a different sign configuration rhsSigns. Returns -1 if no match is found. More...
 
void computeCellPoints (std::vector< Vec3d > &points, std::vector< bool > &weightedPointMask, const std::vector< double > &lhsValues, const std::vector< double > &rhsValues, unsigned char lhsSigns, unsigned char rhsSigns, double iso, size_t pointIdx, const uint32_t *seamPointArray)
 Computes the average cell points defined by the sign configuration signs and the given corner values values. Combines data from two different level sets to eliminate seam lines when meshing fractured segments. More...
 
template<typename SignDataTreeType >
void markSeamLineData (SignDataTreeType &signFlagsTree, const SignDataTreeType &refSignFlagsTree)
 
template<typename SignAccT , typename IdxAccT , typename PrimBuilder >
void constructPolygons (bool invertSurfaceOrientation, Int16 flags, Int16 refFlags, const Vec3i &offsets, const Coord &ijk, const SignAccT &signAcc, const IdxAccT &idxAcc, PrimBuilder &mesher)
 
template<typename InputTreeType >
void maskActiveTileBorders (const InputTreeType &inputTree, typename InputTreeType::ValueType iso, typename InputTreeType::template ValueConverter< bool >::Type &mask)
 
template<typename VoxelEdgeAcc , typename LeafNode >
void evalInternalVoxelEdges (VoxelEdgeAcc &edgeAcc, const LeafNode &leafnode, const LeafNodeVoxelOffsets &voxels, const typename LeafNode::ValueType iso)
 
template<typename LeafNode , typename TreeAcc , typename VoxelEdgeAcc >
void evalExtrenalVoxelEdges (VoxelEdgeAcc &edgeAcc, TreeAcc &acc, const LeafNode &lhsNode, const LeafNodeVoxelOffsets &voxels, const typename LeafNode::ValueType iso)
 
template<typename LeafNode , typename TreeAcc , typename VoxelEdgeAcc >
void evalExtrenalVoxelEdgesInv (VoxelEdgeAcc &edgeAcc, TreeAcc &acc, const LeafNode &leafnode, const LeafNodeVoxelOffsets &voxels, const typename LeafNode::ValueType iso)
 
template<typename InputTreeType >
void identifySurfaceIntersectingVoxels (typename InputTreeType::template ValueConverter< bool >::Type &intersectionTree, const InputTreeType &inputTree, typename InputTreeType::ValueType isovalue)
 
template<typename InputGridType >
void applySurfaceMask (typename InputGridType::TreeType::template ValueConverter< bool >::Type &intersectionTree, typename InputGridType::TreeType::template ValueConverter< bool >::Type &borderTree, const InputGridType &inputGrid, const GridBase::ConstPtr &maskGrid, bool invertMask, typename InputGridType::ValueType isovalue)
 
template<typename InputTreeType >
void computeAuxiliaryData (typename InputTreeType::template ValueConverter< Int16 >::Type &signFlagsTree, typename InputTreeType::template ValueConverter< Index32 >::Type &pointIndexTree, const typename InputTreeType::template ValueConverter< bool >::Type &intersectionTree, const InputTreeType &inputTree, typename InputTreeType::ValueType isovalue)
 
void subdivideNonplanarSeamLineQuads (PolygonPoolList &polygonPoolList, size_t polygonPoolListSize, PointList &pointList, size_t &pointListSize, std::vector< uint8_t > &pointFlags)
 
void reviseSeamLineFlags (PolygonPoolList &polygonPoolList, size_t polygonPoolListSize, std::vector< uint8_t > &pointFlags)
 
template<typename InputTree >
void relaxDisorientedTriangles (bool invertSurfaceOrientation, const InputTree &inputTree, const math::Transform &transform, PolygonPoolList &polygonPoolList, size_t polygonPoolListSize, PointList &pointList, const size_t pointListSize)
 

Variables

const bool sAdaptable [256]
 Used to quickly determine if a given cell is adaptable. More...
 
const unsigned char sAmbiguousFace [256]
 Contains the ambiguous face index for certain cell configuration. More...
 
const unsigned char sEdgeGroupTable [256][13]
 Lookup table for different cell sign configurations. The first entry specifies the total number of points that need to be generated inside a cell and the remaining 12 entries indicate different edge groups. More...
 
enum  { MASK_FIRST_10_BITS = 0x000003FF, MASK_DIRTY_BIT = 0x80000000, MASK_INVALID_BIT = 0x40000000 }
 Utility methods for point quantization. More...
 
uint32_t packPoint (const Vec3d &v)
 Utility methods for point quantization. More...
 
Vec3d unpackPoint (uint32_t data)
 Utility methods for point quantization. More...
 

Detailed Description

Extract polygonal surfaces from scalar volumes.

Author
Mihai Alden