8#ifndef OPENSUBDIV3_BFR_VERTEX_DESCRIPTOR_H
9#define OPENSUBDIV3_BFR_VERTEX_DESCRIPTOR_H
11#include "../version.h"
16namespace OPENSUBDIV_VERSION {
222 float trailingEdgeSharp);
261 float * leadingEdgeSharp,
float * trailingEdgeSharp)
const;
266 friend class FaceVertex;
271 typedef Vtr::internal::StackBuffer<int,8,true> IntBuffer;
272 typedef Vtr::internal::StackBuffer<float,16,true> FloatBuffer;
274 void initFaceSizes();
275 void initEdgeSharpness();
281 unsigned short _isValid : 1;
282 unsigned short _isInitialized : 1;
283 unsigned short _isFinalized : 1;
285 unsigned short _isManifold : 1;
286 unsigned short _isBoundary : 1;
288 unsigned short _hasFaceSizes : 1;
289 unsigned short _hasEdgeSharpness : 1;
292 float _vertSharpness;
294 FloatBuffer _faceEdgeSharpness;
295 IntBuffer _faceSizeOffsets;
309 _isManifold = isManifold;
318 _isBoundary = isBoundary;
330 return _hasFaceSizes;
334 _hasFaceSizes =
false;
340 if (!_hasFaceSizes) initFaceSizes();
342 _faceSizeOffsets[incFaceIndex] = faceSize;
347 return _isFinalized ?
348 (_faceSizeOffsets[incFaceIndex+1] - _faceSizeOffsets[incFaceIndex]) :
349 _faceSizeOffsets[incFaceIndex];
357 return _vertSharpness > 0.0f;
361 _vertSharpness = 0.0f;
366 _vertSharpness = vertSharpness;
370 return _vertSharpness;
378 return _hasEdgeSharpness;
382 _hasEdgeSharpness =
false;
388 if (!_hasEdgeSharpness) initEdgeSharpness();
391 if (edgeIndex < _numFaces) {
392 _faceEdgeSharpness[2*edgeIndex] = sharpness;
397 _faceEdgeSharpness[2*edgeIndex-1] = sharpness;
399 _faceEdgeSharpness[2*_numFaces-1] = sharpness;
406 return _faceEdgeSharpness[2*edgeIndex - (edgeIndex == _numFaces)];
411 float leadingEdgeSharpness,
float trailingEdgeSharpness) {
413 if (!_hasEdgeSharpness) initEdgeSharpness();
415 _faceEdgeSharpness[2*faceIndex ] = leadingEdgeSharpness;
416 _faceEdgeSharpness[2*faceIndex+1] = trailingEdgeSharpness;
420 float * leadingEdgeSharpness,
float * trailingEdgeSharpness)
const {
422 *leadingEdgeSharpness = _faceEdgeSharpness[2*faceIndex];
423 *trailingEdgeSharpness = _faceEdgeSharpness[2*faceIndex+1];
429using namespace OPENSUBDIV_VERSION;
Simple class used by subclasses of SurfaceFactory to describe a vertex.
float GetVertexSharpness() const
Return the sharpness of the vertex.
bool Finalize()
Terminate the sequence of specifications.
void SetManifold(bool isManifold)
Declare the vertex neighborhood as manifold (ordered)
bool Initialize(int numIncidentFaces)
Initialize specification with the number of incident faces.
bool IsManifold() const
Return if vertex neighborhood is manifold.
bool HasEdgeSharpness() const
Return if sharpness was assigned to the incident edges.
int GetIncidentFaceSize(int faceIndex) const
Return the size of an incident face.
float GetManifoldEdgeSharpness(int edgeIndex) const
Return the sharpness assigned to a manifold edge.
void SetIncidentFaceEdgeSharpness(int faceIndex, float leadingEdgeSharp, float trailingEdgeSharp)
Assign sharpness to the edges of an incident face.
bool HasVertexSharpness() const
Return if sharpness was assigned to the vertex.
void ClearIncidentFaceSizes()
Remove any assigned sizes of incident faces.
void SetVertexSharpness(float sharpness)
Assign sharpness to the vertex.
void ClearVertexSharpness()
Remove any sharpness assigned to the vertex.
void ClearEdgeSharpness()
Remove any sharpness assigned to the incident edges.
void GetIncidentFaceEdgeSharpness(int faceIndex, float *leadingEdgeSharp, float *trailingEdgeSharp) const
Return the sharpness assigned to edges of an incident face.
bool IsBoundary() const
Return if vertex neighborhood is on a boundary.
bool IsValid() const
Return if instance is valid.
bool HasIncidentFaceSizes() const
Return if the sizes of incident faces are assigned.
void SetBoundary(bool isOnBoundary)
Declare the vertex neighborhood as being on a boundary.
void SetIncidentFaceSize(int faceIndex, int faceSize)
Assign the size of an incident face.
void SetManifoldEdgeSharpness(int edgeIndex, float edgeSharpness)
Assign sharpness to the edge of a manifold neighborhood.