pfMeshVertex(3pf) OpenGL Performer 3.2.2 libpf C++ Reference Pages
NAMEpfMeshVertex - Stores vertex as a part of a pfMesh
FUNCTION SPECIFICATION
#include <Performer/pf/pfMesh.h>
void pfMeshVertex::setCoord(pfVec3 *v);
pfVec3 * pfMeshVertex::getCoord(void);
void pfMeshVertex::setCoordPtr(pfVec3 *v);
pfVec3 * pfMeshVertex::getCoordPtr(void);
void pfMeshVertex::setNextVertex(int v);
int pfMeshVertex::getNextVertex(void);
void pfMeshVertex::setNumNeighbors(int n);
int pfMeshVertex::getNumNeighbors(void);
void pfMeshVertex::setNeighbor(int i,
pfMeshVertexNeighbor *n);
pfMeshVertexNeighbor * pfMeshVertex::getNeighbor(int i);
pfMeshVertexNeighbor * pfMeshVertex::replaceNeighbor(int v1, int face1,
int face2, int v,
_pfMeshVertexNeighborListT *nbrs);
pfMeshVertexNeighbor * pfMeshVertex::getPreviousNeighbor(int v1);
int pfMeshVertex::getPreviousNeighborIndex(int v1);
pfMeshVertexNeighbor * pfMeshVertex::getNextNeighbor(int v1);
int pfMeshVertex::getNextNeighborIndex(int v1);
void pfMeshVertex::setFlags(int which, int value);
int pfMeshVertex::getFlags(int which);
DESCRIPTION
A pfMeshVertex is a high level OpenGL Performer class. A pfMeshVertex is
used in a pfMesh to store information about vertices. A pfMeshVertex
stores vertex coordinates, the pointer to the original vertex coordinates
(to be able to detect local changes in the mesh), an array of vertex
neighbors, a set of binary flags and an index of another vertex at the
same location (used for non-manifolds, see below).
The vertex coordinates and the pointer to the original coordinates are
Page 1
pfMeshVertex(3pf) OpenGL Performer 3.2.2 libpf C++ Reference Pages
set using pfMeshVertex::setCoord and pfMeshVertex::setCoordPtr. The
value set by pfMeshVertex::setCoord should correspond to the value at
location set by pfMeshVertex::setCoordPtr. If the supplied pointer is
NULL (for example, in case that a pfGeoSet was under a pfSCS node) it is
not possible to automatically detect changes in position of vertices and
the user have to modify all the vertices manually by calling
pfMeshVertex::setCoord. In case you do not plan to animate the mesh you
can set the pointer to NULL.
Each vertex stores an array of its neighbors. You can query the
neighbors using functions pfMeshVertex::getNumNeighbors and
pfMeshVertex::getNeighbor. The structure pfMeshVertexNeighbor is defined
in pf.h as follows:
typedef struct
{
int vertex;
int face;
short int edgeType;
short int next, prev;
} pfMeshVertexNeighbor;
This structure consists of the vertex index (in the array of vertices in
pfMesh), face index (in the array of faces in pfMesh), edge type and
index of the next and previous neighbor in the array of neighbors. The
edge can be of the following type:
PFM_EDGE_NORMAL smooth edge with two adjacent faces
PFM_EDGE_CREASE sharp edge with two adjacent faces
+PFM_EDGE_BOUNDARY edge with one adjacent face to the left of the
edge
-PFM_EDGE_BOUNDARY
edge with one adjacent face to the right of the edge
The face is the face to the left of the edge (unless the edge is marked
as -PFM_EDGE_BOUNDARY). The next neighbor is part of this face and the
previous neighbor is part of the face to the left. If the edge is of type
-PFM_EDGE_BOUNDARY the next neighbor points to the corresponding edge of
type +PFM_EDGE_BOUNDARY and the previous neighbors of the edge of type
+PFM_EDGE_BOUNDARY points to the the corresponding edge of type
+PFM_EDGE_BOUNDARY. Note that in case of manifolds each vertex has are
exactly zero or two boundary edges.
In case of arbitrary surfaces there may be more than one loop of
neighbors (if you follow the next links). That is why the class pfMesh
provides a function pfMesh::splitVertices that splits each vertex at
which the surface behaves as non-manifold. The vertex is split into
several vertices with the same position, each having a single loop of
ordered neighbors.
Page 2
pfMeshVertex(3pf) OpenGL Performer 3.2.2 libpf C++ Reference Pages
You can access the next and previous neighbor for a given neighbor with
vertex indexed v1 by calling pfMeshVertex::getPreviousNeighbor and
pfMeshVertex::getNextNeighbor. You can also determine the index of such
neighbor in the array of neighbors by calling
pfMeshVertex::getPreviousNeighborIndex and
pfMeshVertex::getNextNeighborIndex.
The following flags can be set for each pfMeshVertex:
PFMV_FLAG_VERTEX_CHANGED set by function
pfMesh::updateMesh when the coordinate stored at
the vertex does not match the value at the
coordinate pointer
PFMV_FLAG_VERTEX_NEIGHBOR_CHANGED
set by function pfMesh::updateMesh when position
of any neighbor changes
PFMV_FLAG_VERTEX_FACE_CHANGED
set by function pfMesh::updateMesh when position
of any vertex on any of the faces associated with
this vertex changes
PFMV_FLAG_VERTEX_SPLIT
set by function pfMesh::splitVertices when
surface around the vertex is not manifold and the
vertex is split into several vertices (see above)
SEE ALSO
pfMesh, pfMeshFace, pfObject, pfNode
Page 3