7#ifndef PXR_IMAGING_HD_MESH_UTIL_H
8#define PXR_IMAGING_HD_MESH_UTIL_H
11#include "pxr/imaging/hd/api.h"
12#include "pxr/imaging/hd/version.h"
13#include "pxr/imaging/hd/types.h"
14#include "pxr/imaging/hd/meshTopology.h"
16#include "pxr/usd/sdf/path.h"
23#include "pxr/base/vt/value.h"
25PXR_NAMESPACE_OPEN_SCOPE
49 HdQuadInfo() : pointsOffset(0), numAdditionalPoints(0), maxNumVert(0) { }
52 bool IsAllQuads()
const {
return numAdditionalPoints == 0; }
55 int numAdditionalPoints;
57 std::vector<int> numVerts;
58 std::vector<int> verts;
62enum class [[nodiscard]] HdMeshComputationResult
81 : _topology(topology), _id(
id) {}
112 VtIntArray *primitiveParams,
113 VtIntArray *edgeIndices =
nullptr)
const;
165 VtIntArray *primitiveParams,
166 VtVec2iArray *edgeIndices =
nullptr)
const;
172 VtIntArray *primitiveParams,
173 VtVec2iArray *edgeIndices =
nullptr)
const;
185 VtValue *quadrangulated)
const;
196 VtValue *quadrangulated)
const;
212 std::vector<GfVec2i> * edgeVerticesOut,
213 std::vector<int> * firstEdgeIndexForFacesOut =
nullptr)
const;
237 static int EncodeCoarseFaceParam(
int faceIndex,
int edgeFlag) {
238 return ((faceIndex << 2) | (edgeFlag & 3));
240 static int DecodeFaceIndexFromCoarseFaceParam(
int coarseFaceParam) {
241 return (coarseFaceParam >> 2);
243 static int DecodeEdgeFlagFromCoarseFaceParam(
int coarseFaceParam) {
244 return (coarseFaceParam & 3);
252 int _ComputeNumQuads(VtIntArray
const &numVerts,
253 VtIntArray
const &holeIndices,
254 bool *invalidFaceFound =
nullptr)
const;
257 void _ComputeQuadIndices(
259 VtIntArray *primitiveParams,
260 VtVec2iArray *edgeIndices,
261 bool triangulate =
false)
const;
322 bool GetVerticesForEdgeIndex(
int edgeId,
GfVec2i * edgeVerticesOut)
const;
325 bool GetVerticesForEdgeIndices(
326 std::vector<int>
const & edgeIndices,
327 std::vector<GfVec2i> * edgeVerticesOut)
const;
330 bool GetEdgeIndices(
GfVec2i const & edgeVertices,
331 std::vector<int> * edgeIndicesOut)
const;
344 if (verts[0] > verts[1]) {
345 std::swap(verts[0], verts[1]);
353 struct _CompareEdgeVertices {
354 bool operator() (_Edge
const &lhs, _Edge
const & rhs)
const {
355 return (lhs.verts[0] < rhs.verts[0] ||
356 (lhs.verts[0] == rhs.verts[0] &&
357 lhs.verts[1] < rhs.verts[1]));
361 struct _EdgeVerticesHash {
363 inline size_t operator()(
GfVec2i const& v)
const {
365 int theMin = v[0], theMax = v[1];
366 if (theMin > theMax) {
367 std::swap(theMin, theMax);
370 size_t y = x + theMax;
371 return x + (y * (y + 1)) / 2;
376 std::vector<int> _firstEdgeIndexForFaces;
378 std::vector<GfVec2i> _edgeVertices;
379 std::vector<_Edge> _edgesByIndex;
390 static int const NumIndicesPerQuad = 4;
391 static int const NumIndicesPerTriQuad = 6;
394 : _outputPtr(indicesBuffer)
395 , _triangulate(triangulate)
398 void EmitQuadFace(
GfVec4i const & quadIndices) {
400 *_outputPtr++ = quadIndices[0];
401 *_outputPtr++ = quadIndices[1];
402 *_outputPtr++ = quadIndices[2];
403 *_outputPtr++ = quadIndices[2];
404 *_outputPtr++ = quadIndices[3];
405 *_outputPtr++ = quadIndices[0];
407 *_outputPtr++ = quadIndices[0];
408 *_outputPtr++ = quadIndices[1];
409 *_outputPtr++ = quadIndices[2];
410 *_outputPtr++ = quadIndices[3];
416 bool const _triangulate;
420PXR_NAMESPACE_CLOSE_SCOPE
Basic type for a vector of 2 int components.
Basic type for a vector of 4 int components.
Mesh edges are described as a pair of adjacent vertices encoded as GfVec2i.
HD_API VtIntArray CollectFaceEdgeIndices(VtIntArray const &faceIndices) const
Returns the edge indices for all faces in faceIndices.
Topology data for meshes.
Helper class for emitting a buffer of quad indices, optionally splitting each quad into two triangles...
A collection of utility algorithms for generating triangulation and quadrangulation of an input topol...
HD_API HdMeshComputationResult ComputeTriangulatedFaceVaryingPrimvar(void const *source, int numElements, HdType dataType, VtValue *triangulated) const
Perform a triangulation of a face-varying primvar.
HD_API void ComputeTriangleIndices(VtVec3iArray *indices, VtIntArray *primitiveParams, VtIntArray *edgeIndices=nullptr) const
Return a triangulation of the input topology.
HD_API bool ComputeQuadrangulatedFaceVaryingPrimvar(void const *source, int numElements, HdType dataType, VtValue *quadrangulated) const
Return a quadrangulation of a face-varying primvar.
HD_API void ComputeQuadIndices(VtIntArray *indices, VtIntArray *primitiveParams, VtVec2iArray *edgeIndices=nullptr) const
Return quadrangulated indices of the input topology.
HD_API void ComputeTriQuadIndices(VtIntArray *indices, VtIntArray *primitiveParams, VtVec2iArray *edgeIndices=nullptr) const
Return triquad indices (triangulated after quadrangulation) of the input topology.
HD_API void ComputeQuadInfo(HdQuadInfo *quadInfo) const
Generate a quadInfo struct for 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 EnumerateEdges(std::vector< GfVec2i > *edgeVerticesOut, std::vector< int > *firstEdgeIndexForFacesOut=nullptr) const
Return a buffer filled with face vertex index pairs corresponding to the sequence in which edges are ...
A path value used to locate objects in layers or scenegraphs.
Provides a container which may hold any type, and provides introspection and iteration over array typ...
A helper class for quadrangulation computation.
bool IsAllQuads() const
Returns true if the mesh is all-quads.