HDK
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
GT_PrimPolygonMesh.h
Go to the documentation of this file.
1 /*
2  * PROPRIETARY INFORMATION. This software is proprietary to
3  * Side Effects Software Inc., and is not to be reproduced,
4  * transmitted, or disclosed in any way without written permission.
5  *
6  * NAME: GT_PrimPolygonMesh.h ( GT Library, C++)
7  *
8  * COMMENTS:
9  */
10 
11 #ifndef __GT_PrimPolygonMesh__
12 #define __GT_PrimPolygonMesh__
13 
14 #include "GT_API.h"
15 #include "GT_Primitive.h"
16 #include "GT_CountArray.h"
17 #include "GT_FaceSetMap.h"
18 #include "GT_AttributeMerge.h"
19 #include <GA/GA_Names.h>
20 
21 class GT_DataArray;
22 class GT_PrimPolygon;
23 class GT_AttributeList;
24 class UT_StringRef;
25 
26 /// Note this is all just copied from GEO_Normal
27 #define GT_DEFAULT_CUSP_ANGLE 60.0
28 
29 /// Magic tolerance factor of 1.001 on GT_DEFAULT_CUSP_ANGLE so that
30 /// hexagonal tubes will be smooth by default, even with a bit of roundoff
31 /// or slight deformation.
32 #define GT_DEFAULT_ADJUSTED_CUSP_ANGLE 60.06
33 
34 /// @brief A mesh of polygons
36 {
37 public:
38  /// Default constructor
40  : myVMerge()
41  , myUMerge()
42  , myConvexFlag(false)
43  {
44  }
45  /// Useful constructor
47  const GT_DataArrayHandle &vtx_indices,
48  const GT_AttributeListHandle &shared,
50  const GT_AttributeListHandle &uniform,
51  const GT_AttributeListHandle &detail,
53  GT_Size min_vertex_count=0,
54  GT_Size max_vertex_count=0)
55  : myVMerge()
56  , myUMerge()
57  , myConvexFlag(false)
58  {
59  init(vtx_counts, vtx_indices, shared, vertex, uniform, detail,
60  indexing, min_vertex_count, max_vertex_count);
61  }
62 
63  GT_PrimPolygonMesh(const GT_CountArray &vtx_counts,
64  const GT_DataArrayHandle &vtx_indices,
65  const GT_AttributeListHandle &shared,
67  const GT_AttributeListHandle &uniform,
68  const GT_AttributeListHandle &detail)
69  : myVMerge()
70  , myUMerge()
71  , myConvexFlag(false)
72  {
73  init(vtx_counts, vtx_indices, shared, vertex, uniform, detail);
74  }
75 
76  /// Copy the topology information from the source pmesh, but use different
77  /// attribute lists.
79  const GT_AttributeListHandle &shared,
81  const GT_AttributeListHandle &uniform,
82  const GT_AttributeListHandle &detail);
83 
84  /// Create a new polygon mesh with re-mapped vertices (used by
85  /// removeUnusedPoints).
86  ///
87  /// Since the polygon faces are remapped you'll have to pass in a new face
88  /// set map.
90  const GT_DataArrayHandle &vtx_indices,
91  const GT_AttributeListHandle &shared);
92 
93  /// Copy c-tor
95 
96  /// Construct a polygon mesh from a GT_PrimPolygon
98 
99  const char *className() const override { return "GT_PrimPolygonMesh"; }
100  bool save(UT_JSONWriter &w) const override;
101 
102  /// @{
103  /// Methods defined on GT_Primitive
104  void enlargeBounds(UT_BoundingBox boxes[],
105  int nsegments) const override;
106  int getPrimitiveType() const override;
107  bool refine(GT_Refine &refiner,
108  const GT_RefineParms *parms) const override;
109  int getMotionSegments() const override;
110  int64 getMemoryUsage() const override;
111  /// @}
112 
113  /// @{
114  /// Initialize the mesh
115  /// - @c vtx_counts @n
116  /// An integer array, representing the number of vertices in each face.
117  /// The length of the array determines the number of faces in the mesh.
118  /// - @c vtx_indices @n
119  /// An array of vertex references. There is an entry for every vertex in
120  /// every face. These indices refer to the shared attribute data.
121  /// - @c shared @n
122  /// Shared attribute data. This data is referenced by the vertex arrays.
123  /// - @c vertex @n
124  /// Unique data per vertex. The length of these attribute arrays should
125  /// be the same as the length of the vtx_indices array.
126  /// - @c uniform @n
127  /// Attribute per face. There should be one entry for each entry in the
128  /// @c vtx_counts array.
129  /// - @c detail @n
130  /// Constant attribute for all faces.
131  /// @c vtx_counts array.
132  /// - @c indexing @n
133  /// What type of indexing is required
134  void init(const GT_DataArrayHandle &vtx_counts,
135  const GT_DataArrayHandle &vtx_indices,
136  const GT_AttributeListHandle &shared,
138  const GT_AttributeListHandle &uniform,
139  const GT_AttributeListHandle &detail,
141  GT_Size min_vertex_count=0,
142  GT_Size max_vertex_count=0);
143  void init(const GT_CountArray &vtx_counts,
144  const GT_DataArrayHandle &vtx_indices,
145  const GT_AttributeListHandle &shared,
147  const GT_AttributeListHandle &uniform,
148  const GT_AttributeListHandle &detail);
149  /// @}
150 
151  /// Return the number of faces in the mesh
152  GT_Size getFaceCount() const;
153  /// Return a pointer to the individual face
154  GT_PrimitiveHandle getFace(GT_Offset i) const;
155 
156  /// Return the number of vertices
158  {
159  return myVertexList ? myVertexList->entries() : 0;
160  }
161  /// Return the number of points
163  {
164  return myShared ? myShared->get(0)->entries() : 0;
165  }
166 
167  /// @{
168  /// Query the minimum/maximum number of vertices per face
169  GT_Size getMinVertexCount() const { return myFaceOffsets.getMinCount();}
170  GT_Size getMaxVertexCount() const { return myFaceOffsets.getMaxCount();}
171  /// @}
172 
173  /// @{
174  /// Accessor
175  const GT_DataArrayHandle &getVertexList() const override
176  { return myVertexList; }
178  { return myFaceOffsets; }
179 #if 0
180  const GT_DataArrayHandle &getFaceOffsets() const
181  { return myFaceOffsets; }
182 #endif
184  { return myShared; }
186  { return myVertex; }
188  { return myUniform; }
190  { return myDetail; }
191  /// @}
192 
193  /// @{
194  /// Access to the face sets
195  const GT_FaceSetMapPtr &faceSetMap() const { return myFaceSetMap; }
197  { myFaceSetMap = v; }
198  void addFaceSet(const UT_StringHolder &name,
199  const GT_FaceSetPtr &set);
200  /// @}
201 
202  /// Harden all attributes so there are no dangling dependencies
203  GT_PrimitiveHandle doHarden() const override;
205  { return new GT_PrimPolygonMesh(*this); }
206 
207  /// The virtual implementation of attribute merging
209  const GT_Primitive &src,
210  const UT_StringMMPattern *vertex,
211  const UT_StringMMPattern *point,
212  const UT_StringMMPattern *uniform,
213  const UT_StringMMPattern *detail
214  ) const override;
215 
216  /// @{
217  /// Access attributes
219  { return myVertex; }
221  { return myShared; }
223  { return myUniform; }
225  { return myDetail; }
226  /// @}
227 
228  /// Return the point index for a given face and vertex
229  GT_Offset getPoint(GT_Offset face, GT_Offset v) const;
230 
231  /// Return the offset into the vertex list for the given face
233  { return myFaceOffsets.getOffset(face); }
234  /// Return the length of the vertex list for the given face
236  { return myFaceOffsets.getCount(face); }
237  /// For a given face, find the shared point numbers for the given vertex
238  /// and the next vertex (i.e. the edge starting from the given vertex).
239  void getEdgePoints(GT_Offset face, GT_Offset vertex,
240  GT_Offset &p0, GT_Offset &p1) const;
241 
242  /// Returns true if this mesh has been convexed
243  bool isConvexed() const { return myConvexFlag; }
244 
245  /// Set the convex flag on the mesh
246  void setConvexed(bool c) { myConvexFlag = c; }
247 
248  /// Return an array containing the face counts per-face
250  getFaceCounts(GT_IndexingMode indexing=GT_INDEXING_QUICK) const;
251 
252  /// The polygon mesh may have shared points which aren't used. That is,
253  /// there may be elements in the shared element list which aren't
254  /// referenced by any vertex. This method will build a list of indices for
255  /// all the used points.
256  ///
257  /// The list returned will be monotonically ascending.
258  const GT_DataArrayHandle
259  getUsedPointList(GT_IndexingMode idx=GT_INDEXING_QUICK) const;
260 
261  /// Ensure all polygons in the mesh are convex
262  ///
263  /// If the @c holes set is passed in, then the faces in that set will be
264  /// excluded from the convexed result.
265  GT_PrimitiveHandle convex(int max_points_per_poly=3,
266  bool keep_degenerate = false,
267  bool allow_interrupt = true,
268  bool allow_indirect_flattening = false,
269  const UT_Set<int> *holes = nullptr) const;
270 
271  /// Using the indirect arrays and vertex list from a convexed mesh,
272  /// convex this mesh (assumes topology is the same).
273  GT_PrimitiveHandle adoptConvexing(
274  const GT_DataArrayHandle &verts,
275  const GT_DataArrayHandle &uniform_indexing,
276  const GT_DataArrayHandle &vertex_indexing,
277  const GT_DataArrayHandle &vert_info,
278  const GT_DataArrayHandle &prim_info)
279  const;
280 
281  /// Fetches the convexed arrays from the mesh, to be used by adoptConvexing
282  /// on a different mesh with the same topology.
283  void getConvexArrays(
284  GT_DataArrayHandle &verts,
285  GT_DataArrayHandle &uniform_indexing,
286  GT_DataArrayHandle &vertex_indexing,
287  GT_DataArrayHandle &vert_info,
288  GT_DataArrayHandle &prim_info) const;
289 
290  /// Remove unused points. This will collapse the varying point arrays,
291  /// leaving only the points referenced by the vertices.
292  GT_PrimitiveHandle removeUnusedPoints(const int32 *idx=NULL) const;
293 
294  /// @{
295  /// Compute face normals. This will use the shared attribute named P to
296  /// compute the normals for each face.
297  /// fpreal16 must have the proper vector length
298  bool faceNormals(UT_Vector3 *N,
299  int segment=0,
300  const UT_StringRef &P=GA_Names::P) const;
301  bool faceNormals(UT_Vector3D *N64,
302  int segment=0,
303  const UT_StringRef &P=GA_Names::P) const;
304  bool faceNormals(fpreal16 *N16,
305  int segment=0,
306  const UT_StringRef &P=GA_Names::P) const;
307  GT_DataArrayHandle faceNormals(int segment=0,
308  const UT_StringRef &P=GA_Names::P,
309  GT_Storage store=GT_STORE_REAL32) const;
310  /// @}
311 
312  /// @{
313  /// Compute shared normals. This will use the shared attribute named P to
314  /// compute the normals for each shared point.
315  bool pointNormals(UT_Vector3T<fpreal16> *N,
316  GT_Size npts,
317  int segment=0,
318  const UT_StringRef &P=GA_Names::P,
319  bool normalize=true,
320  const fpreal32 *pntdata = NULL) const;
321  bool pointNormals(UT_Vector3 *N, GT_Size npts,
322  int segment=0,
323  const UT_StringRef &P=GA_Names::P,
324  bool normalize=true,
325  const fpreal32 *pntdata = NULL) const;
326  bool pointNormals(UT_Vector3D *N, GT_Size npts,
327  int segment=0,
328  const UT_StringRef &P=GA_Names::P,
329  bool normalize=true,
330  const fpreal32 *pntdata = NULL) const;
332  const UT_StringRef &P=GA_Names::P,
333  bool normalize=true,
334  const fpreal32 *pntdata = NULL,
336  ) const override;
337  /// @}
338 
339  /// @{
340  /// Compute vertex normals. This will use the shared attribute named P to
341  /// compute the normals for each vertex.
342  bool vertexNormals(UT_Vector3T<fpreal16> *N,
343  GT_Size npts,
344  int segment=0,
345  const UT_StringRef &P=GA_Names::P,
346  fpreal maxangledegrees=GT_DEFAULT_ADJUSTED_CUSP_ANGLE,
347  bool normalize=true) const;
348  bool vertexNormals(UT_Vector3 *N,
349  GT_Size npts,
350  int segment=0,
351  const UT_StringRef &P=GA_Names::P,
352  fpreal maxangledegrees=GT_DEFAULT_ADJUSTED_CUSP_ANGLE,
353  bool normalize=true) const;
354  bool vertexNormals(UT_Vector3D *N,
355  GT_Size npts,
356  int segment=0,
357  const UT_StringRef &P=GA_Names::P,
358  fpreal maxangledegrees=GT_DEFAULT_ADJUSTED_CUSP_ANGLE,
359  bool normalize=true) const;
360  virtual GT_DataArrayHandle createVertexNormals(int segment=0,
361  const UT_StringRef &P=GA_Names::P,
362  fpreal maxangledegrees=GT_DEFAULT_ADJUSTED_CUSP_ANGLE,
363  bool normalize=true,
364  GT_Storage store =GT_STORE_REAL32) const;
365  /// @}
366 
367 
368  /// @brief Create point normals on a new mesh if no normals are found.
369  /// If no point or vertex normals are found, generate point normals from P
370  /// and return a new mesh. If normals are found, return NULL.
371  ///
372  /// If the segement is less than 0, normals for *all* segments will be
373  /// computed (if required)
374  GT_PrimPolygonMesh *createPointNormalsIfMissing(
375  const UT_StringRef &P=GA_Names::P,
376  bool normalize=true,
377  bool *error = nullptr) const;
378 
379  GT_PrimPolygonMesh *createVertexNormalsIfMissing(
380  const UT_StringRef &P=GA_Names::P,
381  fpreal cuspangledegrees=GT_DEFAULT_ADJUSTED_CUSP_ANGLE,
382  bool normalize=true,
383  bool *error = nullptr) const;
384 
385  /// Create point normals and MikkT tangents on a new mesh if not found.
386  /// If either normals or tangents are not found, return a new mesh with
387  /// both generated. If both exist, return NULL.
388  GT_PrimPolygonMesh *createTangentsIfMissing(bool *error = nullptr);
389 
390  /// Create quick tangents (not MikkT) for fast viewer tangent generation.
391  /// Tangents are not created in this mesh.
392  /// NOTE: Not working very well yet.
393  bool createFastTangents(GT_DataArrayHandle *tanu_h,
394  GT_DataArrayHandle *tanv_h) const;
395 
396  /// @brief Divide a mesh into smaller meshes if it exceeds the poly_limit.
397  /// If this mesh has more than polygon_limit polygons, this will split the
398  /// mesh into multiple sub-meshes, attempting to keep them all roughly the
399  /// same number of polygons. If this mesh has fewer than polygon_limit
400  /// polygons, it will return false and not add any meshes to split_meshes.
401  /// If remove_unused_points is true, each submesh will have unused points
402  /// removed.
403  bool splitMesh(GT_Size polygon_limit,
404  UT_Array<GT_PrimitiveHandle> &split_meshes,
405  bool remove_unused_points = true) const;
406 
407  /// Partition a mesh into submeshes by the shop_materialpath attribute,
408  /// each with exact one material in a detail shop_materialpath attribute.
409  /// Returns false if shop_materialpath doesn't exist, isn't a uniform attrib,
410  /// or has only 1 material.
411  bool partitionByMaterial(const GT_DataArrayHandle &mat_id,
412  UT_Array<GT_PrimitiveHandle> &sub_meshes,
413  GT_Size polygon_limit = SYS_INT32_MAX) const;
414 
415  /// @{
416  /// Methods for GEO/GU support.
417  fpreal computePerimeter(int seg) const override;
418  fpreal computeSurfaceArea(int seg) const override;
419  fpreal computeVolume(const UT_Vector3 &ref_P, int seg) const override;
420  /// @}
421 
422  bool updateGeoPrim(const GU_ConstDetailHandle &dtl,
423  const GT_RefineParms &refine) override;
424 
425 protected:
426  void hardenAttributes();
427 
428  // We have "clone" methods so that sub-classes (i.e.
429  // GT_PrimSubdivisionMesh) can create an appropriate clone. These are used
430  // by methods internal when duplicating the mesh (i.e. removeUnusedPoints)
431  virtual GT_PrimPolygonMesh *clone(const GT_DataArrayHandle &vtx_counts,
432  const GT_DataArrayHandle &vtx_indices,
433  const GT_AttributeListHandle &shared,
435  const GT_AttributeListHandle &uniform,
436  const GT_AttributeListHandle &detail,
438  GT_Size min_vertex_count=0,
439  GT_Size max_vertex_count=0) const
440  {
441  return new GT_PrimPolygonMesh(vtx_counts, vtx_indices,
442  shared, vertex, uniform, detail, indexing,
443  min_vertex_count, max_vertex_count);
444  }
445  virtual GT_PrimPolygonMesh *clone(const GT_CountArray &vtx_counts,
446  const GT_DataArrayHandle &vtx_indices,
447  const GT_AttributeListHandle &shared,
449  const GT_AttributeListHandle &uniform,
450  const GT_AttributeListHandle &detail) const
451  {
452  return new GT_PrimPolygonMesh(vtx_counts, vtx_indices,
453  shared, vertex, uniform, detail);
454  }
457  const GT_AttributeListHandle &uniform,
458  const GT_AttributeListHandle &detail) const
459  {
460  return new GT_PrimPolygonMesh(*this, shared, vertex, uniform, detail);
461  }
462  virtual GT_PrimPolygonMesh *clone(const GT_DataArrayHandle &vtx_indices,
463  const GT_AttributeListHandle &shared) const
464  {
465  return new GT_PrimPolygonMesh(*this, vtx_indices, shared);
466  }
467 
472 
473 private:
474  template <typename VECTOR_T>
475  GT_DataArrayHandle getVertexNormalHandle(
476  const UT_StringRef &P_name,
477  int seg,
478  fpreal maxangledegrees,
479  bool normalize) const;
480  template <typename VECTOR_T>
481  bool computePointNormals(
483  GT_Size Nsize,
484  const UT_StringRef &P,
485  int segment,
486  bool normalize,
487  const fpreal32 *point_data) const;
488  template <typename VECTOR_T>
489  bool computeVertexNormals(
491  GT_Size Nsize,
492  const UT_StringRef &P,
493  int segment,
494  fpreal maxangledegrees,
495  bool normalize) const;
496 
497  bool createFastTangentsUV(const GT_DataArrayHandle &ph,
498  const GT_DataArrayHandle &uvh,
499  GT_Owner uv_owner,
500  GT_DataArrayHandle *tanuh,
501  GT_DataArrayHandle *tanvh) const;
502 
503  void makeMerge();
504 
505  GT_DataArrayHandle myVertexList;
506  GT_CountArray myFaceOffsets;
507  GT_FaceSetMapPtr myFaceSetMap;
508  UT_UniquePtr<GT_AttributeMerge> myVMerge, myUMerge;
509  bool myConvexFlag;
510 };
511 
512 #endif
513 
SIM_API const UT_StringHolder vertex
GT_Size getPointCount() const
Return the number of points.
GT_Storage
Definition: GT_Types.h:19
virtual int getMotionSegments() const =0
GT_PrimPolygonMesh(const GT_CountArray &vtx_counts, const GT_DataArrayHandle &vtx_indices, const GT_AttributeListHandle &shared, const GT_AttributeListHandle &vertex, const GT_AttributeListHandle &uniform, const GT_AttributeListHandle &detail)
const GT_AttributeListHandle & getVertexAttributes() const override
virtual bool updateGeoPrim(const GU_ConstDetailHandle &dtl, const GT_RefineParms &parms)
update any cached data for geometry and its attributes
int int32
Definition: SYS_Types.h:39
virtual bool refine(GT_Refine &refiner, const GT_RefineParms *parms=NULL) const
const GT_AttributeListHandle & getPointAttributes() const override
void setFaceSetMap(const GT_FaceSetMapPtr &v)
A mesh of polygons.
virtual int getPrimitiveType() const
#define SYS_INT32_MAX
Definition: SYS_Types.h:171
virtual fpreal computePerimeter(int seg=0) const
virtual fpreal computeVolume(const UT_Vector3 &ref_P, int seg=0) const
#define GT_DEFAULT_ADJUSTED_CUSP_ANGLE
const GLdouble * v
Definition: glcorearb.h:837
GT_Size getMinVertexCount() const
GT_Size getVertexCount(GT_Offset face) const
Return the length of the vertex list for the given face.
const GT_CountArray & getFaceCountArray() const
GT_AttributeListHandle myShared
GT_IndexingMode
Definition: GT_Types.h:106
#define GT_API
Definition: GT_API.h:13
GT_PrimPolygonMesh(const GT_DataArrayHandle &vtx_counts, const GT_DataArrayHandle &vtx_indices, const GT_AttributeListHandle &shared, const GT_AttributeListHandle &vertex, const GT_AttributeListHandle &uniform, const GT_AttributeListHandle &detail, GT_IndexingMode indexing=GT_INDEXING_QUICK, GT_Size min_vertex_count=0, GT_Size max_vertex_count=0)
Useful constructor.
Class which writes ASCII or binary JSON streams.
Definition: UT_JSONWriter.h:37
GA_API const UT_StringHolder P
GT_Size getVertexCount() const
Return the number of vertices.
float fpreal32
Definition: SYS_Types.h:200
const GT_AttributeListHandle & getShared() const
bool isConvexed() const
Returns true if this mesh has been convexed.
std::unique_ptr< T, Deleter > UT_UniquePtr
A smart pointer for unique ownership of dynamically allocated objects.
Definition: UT_UniquePtr.h:39
< returns > If no error
Definition: snippets.dox:2
const GT_AttributeListHandle & getVertex() const
const GT_AttributeListHandle & getUniform() const
virtual GT_PrimPolygonMesh * clone(const GT_DataArrayHandle &vtx_counts, const GT_DataArrayHandle &vtx_indices, const GT_AttributeListHandle &shared, const GT_AttributeListHandle &vertex, const GT_AttributeListHandle &uniform, const GT_AttributeListHandle &detail, GT_IndexingMode indexing=GT_INDEXING_QUICK, GT_Size min_vertex_count=0, GT_Size max_vertex_count=0) const
GT_PrimPolygonMesh()
Default constructor.
Abstract data class for an array of float, int or string data.
Definition: GT_DataArray.h:40
GT_PrimitiveHandle doSoftCopy() const override
virtual fpreal computeSurfaceArea(int seg=0) const
virtual GT_PrimPolygonMesh * clone(const GT_CountArray &vtx_counts, const GT_DataArrayHandle &vtx_indices, const GT_AttributeListHandle &shared, const GT_AttributeListHandle &vertex, const GT_AttributeListHandle &uniform, const GT_AttributeListHandle &detail) const
void setConvexed(bool c)
Set the convex flag on the mesh.
int64 GT_Offset
Definition: GT_Types.h:129
long long int64
Definition: SYS_Types.h:116
GT_Size getMaxVertexCount() const
GLuint const GLchar * name
Definition: glcorearb.h:786
The base class for all GT primitive types.
Definition: GT_Primitive.h:43
virtual GT_PrimitiveHandle doHarden() const
const char * className() const override
virtual int64 getMemoryUsage() const =0
virtual GT_PrimPolygonMesh * clone(const GT_DataArrayHandle &vtx_indices, const GT_AttributeListHandle &shared) const
Processes primitives generated by refinement process.
Definition: GT_Refine.h:20
GT_Owner
Definition: GT_Types.h:90
int64 GT_Size
Definition: GT_Types.h:128
GT_AttributeListHandle myVertex
GT_AttributeListHandle myUniform
fpreal64 fpreal
Definition: SYS_Types.h:277
const GT_AttributeListHandle & getDetailAttributes() const override
virtual bool save(UT_JSONWriter &w) const
GA_API const UT_StringHolder N
GT_Offset getVertexOffset(GT_Offset face) const
Return the offset into the vertex list for the given face.
GLubyte GLubyte GLubyte GLubyte w
Definition: glcorearb.h:857
virtual GT_DataArrayHandle createPointNormals(int segment=0, const UT_StringRef &P=GA_Names::P, bool normalize=true, const fpreal32 *pntdata=NULL, GT_Storage store=GT_STORE_REAL32) const
GT_AttributeListHandle myDetail
virtual GT_PrimPolygonMesh * clone(const GT_AttributeListHandle &shared, const GT_AttributeListHandle &vertex, const GT_AttributeListHandle &uniform, const GT_AttributeListHandle &detail) const
virtual GT_PrimitiveHandle doAttributeMerge(const GT_Primitive &src, const UT_StringMMPattern *vertex, const UT_StringMMPattern *point, const UT_StringMMPattern *uniform, const UT_StringMMPattern *detail) const
The virtual implementation of attribute merging.
virtual void enlargeBounds(UT_BoundingBox boxes[], int nsegments) const =0
const GT_FaceSetMapPtr & faceSetMap() const
Single closed polygon.
const GT_AttributeListHandle & getDetail() const
const GT_AttributeListHandle & getUniformAttributes() const override
constexpr T normalize(UT_FixedVector< T, D > &a) noexcept
const GT_DataArrayHandle & getVertexList() const override
GLenum src
Definition: glcorearb.h:1793