24 #ifndef PXR_IMAGING_HD_MESH_UTIL_H
25 #define PXR_IMAGING_HD_MESH_UTIL_H
28 #include "pxr/imaging/hd/api.h"
29 #include "pxr/imaging/hd/version.h"
30 #include "pxr/imaging/hd/types.h"
31 #include "pxr/imaging/hd/meshTopology.h"
33 #include "pxr/usd/sdf/path.h"
40 #include "pxr/base/vt/value.h"
42 PXR_NAMESPACE_OPEN_SCOPE
66 HdQuadInfo() : pointsOffset(0), numAdditionalPoints(0), maxNumVert(0) { }
69 bool IsAllQuads()
const {
return numAdditionalPoints == 0; }
72 int numAdditionalPoints;
74 std::vector<int> numVerts;
75 std::vector<int> verts;
86 : _topology(topology), _id(
id) {}
111 VtIntArray *primitiveParams,
112 VtIntArray *edgeIndices =
nullptr)
const;
151 VtIntArray *primitiveParams,
152 VtVec2iArray *edgeIndices =
nullptr)
const;
164 VtValue *quadrangulated)
const;
175 VtValue *quadrangulated)
const;
185 void EnumerateEdges(std::vector<GfVec2i> * edgeVerticesOut)
const;
191 static int EncodeCoarseFaceParam(
int faceIndex,
int edgeFlag) {
192 return ((faceIndex << 2) | (edgeFlag & 3));
194 static int DecodeFaceIndexFromCoarseFaceParam(
int coarseFaceParam) {
195 return (coarseFaceParam >> 2);
197 static int DecodeEdgeFlagFromCoarseFaceParam(
int coarseFaceParam) {
198 return (coarseFaceParam & 3);
204 int _ComputeNumQuads(VtIntArray
const &numVerts,
205 VtIntArray
const &holeIndices,
206 bool *invalidFaceFound =
nullptr)
const;
258 class HdMeshEdgeIndexTable
262 ~HdMeshEdgeIndexTable();
264 bool GetVerticesForEdgeIndex(
int edgeId,
GfVec2i * edgeVerticesOut)
const;
266 bool GetVerticesForEdgeIndices(
267 std::vector<int>
const & edgeIndices,
268 std::vector<GfVec2i> * edgeVerticesOut)
const;
270 bool GetEdgeIndices(
GfVec2i const & edgeVertices,
271 std::vector<int> * edgeIndicesOut)
const;
280 if (verts[0] > verts[1]) {
289 struct _CompareEdgeVertices {
290 bool operator() (_Edge
const &lhs, _Edge
const & rhs)
const {
291 return (lhs.verts[0] < rhs.verts[0] ||
292 (lhs.verts[0] == rhs.verts[0] &&
293 lhs.verts[1] < rhs.verts[1]));
297 struct _EdgeVerticesHash {
299 inline size_t operator()(
GfVec2i const& v)
const {
301 int theMin = v[0], theMax = v[1];
302 if (theMin > theMax) {
306 size_t y = x + theMax;
307 return x + (y * (y + 1)) / 2;
311 std::vector<GfVec2i> _edgeVertices;
312 std::vector<_Edge> _edgesByIndex;
316 PXR_NAMESPACE_CLOSE_SCOPE
318 #endif // PXR_IMAGING_HD_MESH_UTIL_H
bool IsAllQuads() const
Returns true if the mesh is all-quads.
Basic type for a vector of 2 int components.
HD_API void EnumerateEdges(std::vector< GfVec2i > *edgeVerticesOut) const
Return a buffer filled with face vertex index pairs corresponding to the sequence in which edges are ...
A helper class for quadrangulation computation.
HD_API void ComputeQuadIndices(VtVec4iArray *indices, VtIntArray *primitiveParams, VtVec2iArray *edgeIndices=nullptr) const
Return quadrangulated indices of the input topology.
HD_API bool ComputeQuadrangulatedPrimvar(HdQuadInfo const *qi, void const *source, int numElements, HdType dataType, VtValue *quadrangulated) const
Return a quadrangulation of a per-vertex primvar.
HD_API void ComputeQuadInfo(HdQuadInfo *quadInfo) const
Generate a quadInfo struct for the input topology.
void swap(UsdStageLoadRules &l, UsdStageLoadRules &r)
Swap the contents of rules l and r.
HD_API bool ComputeQuadrangulatedFaceVaryingPrimvar(void const *source, int numElements, HdType dataType, VtValue *quadrangulated) const
Return a quadrangulation of a face-varying primvar.
HD_API bool ComputeTriangulatedFaceVaryingPrimvar(void const *source, int numElements, HdType dataType, VtValue *triangulated) const
Return a triangulation of a face-varying primvar.
A path value used to locate objects in layers or scenegraphs.
HD_API void ComputeTriangleIndices(VtVec3iArray *indices, VtIntArray *primitiveParams, VtIntArray *edgeIndices=nullptr) const
Return a triangulation of the input topology.
Topology data for meshes.
Provides a container which may hold any type, and provides introspection and iteration over array typ...
A collection of utility algorithms for generating triangulation and quadrangulation of an input topol...