chapter02.1   [plain text]


\&
.sp 1
.ce 3
\s+1\fBChapter 2\fP\s-1

\s+1\fBOutput Commands\fP\s-1
.sp 2
.nr H1 2
.nr H2 0
.nr H3 0
.nr H4 0
.nr H5 0
.na
.LP
.XS
Chapter 2: Output Commands
.XE
.LP
The functions described in this chapter direct output commands to the specified
display.
Output commands may be rendered immediately or stored in a structure resource.
The first three parameters of all output command functions are identical:
the first parameter specifies the display connection, the second parameter
specifies the resource identifier for the targeted renderer or structure, and
the third parameter specifies whether the output commands are to be rendered
immediately (in which case the second parameter identifies the renderer
resource) or stored in a structure (in which case the second parameter
identifies the structure resource).
In order for a PHIGS workstation resource to process output commands for
rendering, the output commands must be stored in structures.
See \fIChapter 10: PHIGS Workstations\fP.
.LP
.sp
Note, above, that the third parameter to each output command function (the
request type parameter) determines
how PEXlib will send the output command to the PEX server.  This parameter must
have one of four values:
.PN PEXOCRender ,
.PN PEXOCRenderSingle ,
.PN PEXOCStore
or
.PN PEXOCStoreSingle .
.IN PEXRCRenderOutputCommands
The first two,
.PN PEXOCRender
and
.PN PEXOCRenderSingle ,
will cause the output command to be formatted into a
.PN PEXRCRenderOutputCommands
request.  This request will cause the server to immediately render the output
commands using the specified renderer when the request is received by the
server.
.IN PEXRCStoreElements
.PN PEXOCStore
and
.PN PEXOCStoreSingle
will cause the output command to be formatted into a
.PN PEXRCStoreElements
request.  This request will cause the server to store the output
commands into the specified structure when the request is received by the
server.
.LP
In order to improve performance, PEXlib will try to pack output commands into
single
.PN PEXRCRenderOutputCommands
or
.PN PEXRCStoreElements
requests.  This packing, or buffering, of output commands will normally occur
when the request type is
.PN PEXOCRender
or
.PN PEXOCStore .
When the request type is
.PN PEXOCRenderSingle
or
.PN PEXOCStoreSingle ,
PEXlib will force the output command to be formatted into a single request by
itself.  This is useful, as an example, for debugging purposes.
.LP
Also, behavior of the
.PN PEXRCStoreElements
request when the specified structure's editing mode is
.PN PEXStructureReplace
is not deterministic when using the request type
.PN PEXOCStore .
The
.PN PEXRCStoreElements
request will replace a range of elements in the structure dependent upon how
many output commands are in the request.  The number of output commands in a
given request is dependent upon too many variables to predict.  Applications
should either use
.PN PEXOCStoreSingle
when the structure's editing mode is
.PN PEXStructureReplace ,
or delete elements and use
.PN PEXStructureInsert
to insert the new elements.
See \fIChapter 7: Structures\fP for more detail.
.LP
Finally, PEXlib will not pack a single request so that it is too large to send
to the server.  However, if a single OC is too large to send, PEXlib will cause the server to produce a
.PN BadLength
error.
The application can determine before-hand if an OC is too large by calling
.PN PEXGetSizeOCs
and
.PN XMaxRequestSize .
See \fIChapter 1: Introduction to PEXlib\fP for more detail.
.NH 2
Primitives and Attributes
.XS
\*(SN Primitives and Attributes
.XE
.IN "output commands"
.IN "primitives"
.IN "attributes"
.LP
Output commands processed by a renderer or PHIGS workstation to produce
visible output (that is, pixels on the display screen) are called output
primitives or simply primitives.  PEX supports a number of output primitives,
including markers, text and annotation text, polylines and non-uniform
B-spline curve, fill areas, fill area sets, triangle strips,
quadrilateral meshes, non-uniform B-spline surfaces, cell arrays and a
generalized drawing primitive (or GDP).
.LP
Output commands which alter the rendering
pipeline state are called output primitive attributes or simply attributes.
The initial renderer or PHIGS workstation pipeline state is provided by a
pipeline
context resource or defaults if no pipeline context resource was specified in
the creation of the renderer or PHIGS workstation resource.
After the renderer or PHIGS workstation has obtained its initial pipeline state,
pipeline attributes
are modifiable only by the output primitive attribute functions described in
this chapter.
It is not possible to directly query the current pipeline state.
.LP
More detailed information on attributes is given in
\fIChapter 4: Pipeline Contexts\fP.
.LP
.sp
Attributes that affect all output primitives are:
.ID
HLHSR identifier
color approximation index
depth cue index
global transformation
local transformation
model clip flag
model clip volume
name set
pick id
rendering color model
view index
.DE
.NH 3
Markers
.XS
\*(SN Markers
.XE
.LP
.IN "markers"
.IN "primitives" "markers"
A marker is a two-dimensional glyph, or symbol, representing a location in
three-dimensional space.   Modeling coordinates specify the marker's position. 
The position is transformed within the rendering pipeline like other output
primitive coordinates.  Since a marker has no surface from which to reflect
light, the light-source illumination stage of the rendering pipeline has no
effect on markers.  When depth-cueing is enabled, a marker's color is affected
by the depth-cueing computation.
.LP
The attributes that affect marker primitives are:
.ID
marker bundle index
marker color
marker color asf
marker scale
marker scale asf
marker type
marker type asf
.DE
.LP
The marker color is the intrinsic color of the marker.  This color
is affected by the depth-cueing computation,
if depth-cueing is enabled.
The resulting color is then transformed, by the color approximation stage of the
rendering pipeline, into a color the device can display. 
There are two output commands for setting the marker color attribute.
The first allows an application to set the marker color to a particular indexed
color value.  The second
is more general, allowing the marker color to be set to an
indexed color value or a direct color value.
.LP
The marker type indicates the glyph used to represent the marker's position. 
Supported values for marker type are inquirable via
.PN PEXGetEnumTypeInfo .
.LP
The marker scale is used to control the size of the rendered marker glyph. 
The nominal size of a marker is the size used if the marker scale is set to
1.0.  (See
.PN PEXGetImpDepConstants .)
The marker's displayed size is computed by
multiplying the marker's nominal size by the marker scale value, and then
selecting the nearest available size for the marker.
An exception to this is
.PN PEXMarkerDot
which is always displayed as the smallest dot the workstation can display.
.LP
Whenever a marker primitive is rendered, each of the marker attributes is
obtained directly from the current pipeline state or indirectly from a marker
bundle table.  The source for the attribute value is determined by the current
settings of the marker aspect source flags, or ASFs.  If an attribute's ASF
is set to
.PN PEXIndividual ,
the attribute value is obtained directly from the
current pipeline state. If an attribute's ASF is set to
.PN PEXBundled ,
the
attribute value is obtained from the current marker bundle table. The marker
bundle index attribute indicates the marker bundle table entry to be used.
Marker color asf, marker type asf, and marker scale asf are the
attributes which control the source of marker attribute values.
.LP
The treatment of markers during hidden surface computations depends on the
HLHSR (Hidden Line/Hidden Surface Renderer) mode selected and its
implementation.  Z-buffer algorithms usually perform the hidden
surface computation on the realization of marker glyphs.  Scan-line
algorithms may determine visibility for markers solely from the 3D position
of the marker. Clipping is performed on the marker position.  If the marker
position is outside the clipping volume, no portion of the marker glyph
will be rendered.  Clipping of portions of marker glyphs that extend beyond the
clipping volume is implementation-dependent.
.NH 3
Text
.XS
\*(SN Text
.XE
.LP
Two types of text primitives are supported: regular text and annotation text. 
Regular text primitives are rendered in an arbitrary 3D plane, while
annotation text appears parallel to the view surface.
.LP
A text string is a list of characters rendered at a
particular location in three-dimensional space.
Text positions are specified in modeling coordinates and transformed
into screen coordinates within the
rendering pipeline.
A text string has no surface from which to reflect light, so the light-source
illumination stage of the rendering pipeline has no effect.
Depth-cueing, if enabled, does affect the color of text primitives.
.LP
The attributes that affect regular text primitives are:
.ID
character expansion
character expansion asf
character height
character spacing
character spacing asf
character up vector
text alignment
text bundle index
text color
text color asf
text font index
text font index asf
text path
text precision
text precision asf
.DE
.LP
The text color is the intrinsic color of the text or annotation text
string.  This color is affected by the depth-cueing computation,
if depth-cueing is enabled.
The resulting color is transformed, by the color approximation stage of the
rendering pipeline, into a color the device can display. 
There are two output commands for setting the text color attribute.
The first allows an application to set the text color to a particular indexed
color value.  The second
is more general, allowing the text color to be set to either an
indexed color value or a direct color value.                           
.LP
The text font index specifies which entry in the current font table
(i.e. which font group) is to be used.  Character glyph definitions are 
obtained from the
font resource identifiers stored in the font table entry indicated
by the text font index.
.LP
The remaining attributes are defined exactly as they are for PHIGS.
Examples of the functionality and use of each is found in the PHIGS
specification document.  (See PHIGS functional specification,
ISO/IEC 9592-1:1988, section 4.5.5)
.LP
When a text or annotation text primitive is rendered, attributes are
obtained directly from the current pipeline state or indirectly from a text
bundle table.  The source for the attribute value is determined by the current
settings of the corresponding ASFs.  If an attribute's
ASF is set to
.PN PEXIndividual ,
the attribute value is obtained directly from the
current pipeline state. If an attribute's ASF is set to
.PN PEXBundled ,
the
attribute value is obtained from the current text bundle table. The text bundle
table entry used is indicated by the text bundle index attribute. Text
color asf, text font index asf, text precision asf, character expansion
asf, and character spacing asf are attributes which control the source
of text attribute values.
.LP
The treatment of text and annotation text strings during hidden surface
computations depends on the HLHSR mode selected and its implementation.  
Z-buffer algorithms usually perform the hidden surface computation on
the 2D realization of the text string.  Scan-line algorithms may determine
visibility for text strings only from the 3D positions of each string. Clipping
of text strings is dependent on the text precision attribute. If the text
precision is
.PN PEXStringPrecision ,
clipping is done in an implementation-dependent fashion.
If the text precision is
.PN PEXCharPrecision ,
clipping is done on at least a
character-by-character basis. If the text precision is
.PN PEXStrokePrecision , 
each character is clipped to the clipping boundaries.
.NH 3
Annotation Text                      
.XS
\*(SN Annotation Text                      
.XE
.LP
.IN "annotation text"
.IN "text" "annotation"
.IN "primitives" "annotation text"
Annotation text primitives and text primitives are the same except that
annotation primitives must appear parallel to the viewing surface.
Some attributes are shared with text primitives, and other
text attributes are duplicated to provide independent control over 
annotation text appearance.  The annotation text style attribute
specifies whether a connecting
line is rendered from the reference point to the annotation text string.
Supported values for annotation text style are inquirable via
.PN PEXGetEnumTypeInfo .
If the style is
.PN PEXATextConnected ,
the connecting line is rendered with the current polyline attributes.
.LP
The attributes that affect annotation text primitives are:
.ID
annotation text alignment
annotation text height
annotation text path
annotation text style
annotation text up vector
character expansion
character expansion asf
character spacing
character spacing asf
text bundle index
text color
text color asf
text font index
text font index asf
text precision
text precision asf
.DE
.NH 3
Polylines
.XS
\*(SN Polylines
.XE
.LP
.IN "polylines"
.IN "primitives" "polylines"
.IN "lines"
.IN "curves"
A polyline is specified as a list of vertices connected with line segments.
.LP
The attributes that affect polyline primitives are:
.ID
line bundle index
line color
line color asf
line type
line type asf
line width
line width asf
polyline interpolation
polyline interpolation asf
.DE
The line color is the intrinsic color for line primitives without vertex colors.
This color is affected by the depth-cueing computation,
if depth-cueing is enabled.
The resulting color is then transformed, by the color approximation stage of the
rendering pipeline, into a color the device can display. 
There are two output commands for setting the line color attribute.
The first allows an application to set the line color to a particular indexed
color value.  The second
is more general, allowing the line color to be set to either an
indexed color value or a direct color value.
.LP
The line type indicates the visual style of line primitives 
rendered on the screen.
Supported values for line type are inquirable via
.PN PEXGetEnumTypeInfo .
For lines types other than
.PN PEXLineTypeSolid ,
the length
of dots, dashes, and spaces is implementation-dependent.  The line width
attribute is a scale factor that is multiplied by the nominal line width
for the display. (See
.PN PEXGetImpDepConstants .)
The line type and line width attributes are applied to the
2D projection of the line in device coordinates,
not to the 3D primitive itself.
.LP                         
Polyline set primitives may include a color value at each vertex.   When vertex
colors are provided, they take precedence over the line color attribute.  The
polyline
interpolation method controls how color values provided at the vertices are
used when rendering polylines.  If the polyline interpolation method is
.PN PEXPolylineInterpNone
and colors are provided at the vertices, 
the color of the ith vertex will be
used to render the line between the ith and the i+1th vertices (leaving
the color for last vertex unused) rendering
each polyline segment in a constant color.  If the
interpolation method is
.PN PEXPolylineInterpColor ,
a linear interpolation is
performed between the vertex colors to render points along each line segment.
The interpolated colors are then depth-cued and transformed into device
colors.
.LP
When a line primitive is rendered, each attribute is obtained directly from
the current pipeline state, or indirectly from a line bundle table.  The
source for the attribute value is determined by the current settings of the
corresponding ASFs.  If an attribute's ASF is set to
.PN PEXIndividual ,
the attribute value is obtained directly from the current
pipeline state. If an attribute's ASF is set to
.PN PEXBundled ,
the attribute value
is obtained from the current line bundle table. The line bundle table entry to
be used is indicated by the line bundle index attribute. Line color asf,
line type asf, line width asf, and polyline interpolation asf are 
attributes which control source of polyline attribute values.
.NH 3
Non-Uniform Rational B-Spline Curves
.XS
\*(SN Non-Uniform Rational B-Spline Curves
.XE
.LP
.IN "B-spline curves"
.IN "primitives" "B-spline curves"
Non-uniform B-spline curves are defined as a
list of knot values and a set of control points.
.LP
The attributes that affect non-uniform B-spline curve primitives are:
.ID
curve approximation
curve approximation asf
line bundle index
line color
line color asf
line type
line type asf
line width
line width asf
.DE
.LP
Non-uniform B-spline curves use all of the attributes of polylines, except for
the polyline interpolation method.  These curves also use 
the curve approximation attribute to define the fidelity
with which non-uniform B-spline curves are rendered.
Supported values for curve approximation are inquirable via
.PN PEXGetEnumTypeInfo .
.NH 3
Fill Areas
.XS
\*(SN Fill Areas
.XE
.LP
.IN "fill areas"
.IN "primitives" "fill areas"
Fill areas are a type of surface primitive.
A surface extending beyond the clipping boundary is clipped, and only the
portion within the clipping boundary is rendered.  Surfaces are the only output
primitives affected by the reflectance calculations. Surface
primitives include fill area (with and without data), fill area set
(with and without data), set of fill area sets,
triangle strip, quadrilateral mesh, and non-uniform B-spline surface.
.LP
A fill area is a sequence of points defining the boundary of a planar
surface.  The last point is always implicitly connected to the first point
so the area is closed.  Fill areas are not required to be strictly
planar, but shading artifacts may occur if the fill area is not
planar or nearly so.
The odd-even rule is used for determining the area that lies in the interior
of the fill area.
.LP
Part of the definition of a fill area is the shape specification.  This
parameter is used to indicate whether the shape of
the fill area is
.PN PEXShapeComplex ,
.PN PEXShapeNonConvex ,
.PN PEXShapeConvex
or
.PN PEXShapeUnknown .
A shape of
.PN PEXShapeComplex
means the fill area may have self-intersecting
edges.
A shape of
.PN PEXShapeNonConvex
means the fill area has no self-intersecting edges
but some of the interior angles are not convex.
A shape of
.PN PEXShapeConvex
means all of the fill area's interior angles are
convex.
A shape of
.PN PEXShapeUnknown
means the shape of the fill area is not known.
The server will have to determine its shape or assume
it is
.PN PEXShapeComplex .
.LP
The attributes that affect fill area (all surface) primitives are:
.ID
back-face surface color
back-face surface color asf
back-face surface interior style
back-face surface interior style asf
back-face surface interior style index
back-face surface interior style index asf
back-face surface interpolation method
back-face surface interpolation method asf
back-face surface reflection attributes
back-face surface reflection attributes asf
back-face surface reflection model
back-face surface reflection model asf
facet culling mode
facet distinguish flag
interior bundle index
light state
pattern reference point
pattern reference vectors
pattern size
surface color
surface color asf
surface interior style
surface interior style asf
surface interior style index
surface interior style index asf
surface interpolation method
surface interpolation method asf
surface reflection attributes
surface reflection attributes asf
surface reflection model
surface reflection model asf
surface edge color
surface edge color asf
surface edge type
surface edge type asf
surface edge width
surface edge width asf
surface edge bundle index
surface edges
surface edges asf
.DE
.LP
If the facet distinguish flag is enabled then all back-facing surfaces will
be rendered using the back-facing attribute values.  The culling mode 
must be set to
.PN PEXNone ,
.PN PEXBackFaces
or
.PN PEXFrontFaces .
This determines whether no surfaces are culled, back-facing surfaces are culled
or front-facing surfaces are culled. 
The facet normal, either the one supplied or, if not supplied, the one computed,
for each facet is used to determine whether the facet is front-facing or
back-facing.
.LP
The surface color 
is affected by the reflectance calculations (which utilizes the interior 
style, the reflection model and reflection attributes) and the depth-cueing
computations.
The resulting color is then transformed, by the color approximation stage of the
rendering pipeline, into a color the device can display. 
.LP
The interior style determines how the interior of the fill area is 
rendered.
Supported values for surface interior style are inquirable via
.PN PEXGetEnumTypeInfo .
An interior style of
.PN PEXInteriorStyleEmpty
means the interior is not rendered at all.
An interior style of
.PN PEXInteriorStyleSolid
means the interior is solid filled.
An interior style of
.PN PEXInteriorStyleHollow
means only the boundary of the
interior area is rendered, and if the fill area is clipped, the boundary along the
clipped edge is also rendered.
An interior style of
.PN PEXInteriorStylePattern
means the interior is pattern filled using the pattern attributes (pattern
reference point, pattern reference vectors and pattern size).
An interior style of
.PN PEXInteriorStyleHatch
means the interior is hatch filled.
.LP
The light state specifies indices into the light table of those entries (or
lights) which are currently enabled.  If the light table contains defined
entries that are not referenced by the light state attribute, those lights
are disabled.
.LP
The reflection model specifies the method that is used to perform the 
reflectance calculations when rendering surface primitives.
Supported values for reflection model are inquirable via
.PN PEXGetEnumTypeInfo .
If the reflection model is
.PN PEXReflectionNone
then no reflectance calculation is performed.
If the reflection model is
.PN PEXReflectionAmbient
then only the ambient terms of the lighting equation are used.  
If the reflection model is
.PN PEXReflectionDiffuse
then only the ambient and diffuse terms of the lighting equation are used.
If the reflection model is
.PN PEXReflectionSpecular
then the ambient, diffuse and specular terms of the lighting equation are all
used during the reflectance calculations.
.LP
The reflection attributes indicate how a primitive reflects light.
These include ambient, diffuse and specular coefficients, the
specular concentration and color, and the transmission coefficient (also
thought of as a transparency coefficient).
.LP
The surface interpolation method controls how shading is performed
when rendering surface primitives.
Supported values for surface interpolation method are inquirable via
.PN PEXGetEnumTypeInfo .
If the surface interpolation method is
.PN PEXSurfaceInterpNone
then the color resulting from a single light source computation is used for
the entire surface.
If the surface interpolation method is
.PN PEXSurfaceInterpColor
then the colors are computed at the vertices of the surface according to the
current reflection model.  These color values are then linearly interpolated
across the interior of the surface or the edges.
If the surface interpolation method is
.PN PEXSurfaceInterpDotProduct
then the lighting equation dot products are computed at the vertices.  These
dot products are linearly interpolated and the reflectance calculation 
is applied using these values to compute the color value at each pixel in the 
interior of a surface or along a surface edge.
If the surface interpolation method is
.PN PEXSurfaceInterpNormal
then an attempt is made to interpolate the normal across the facet and perform
the reflectance calculation as accurately as possible at each pixel in
the interior of a surface or along a surface edge.
.LP
When a surface is rendered, each attribute is obtained directly from
the current pipeline state, or indirectly from the interior bundle table.  The
source for the attribute value is determined by the current settings of the
corresponding ASFs.  If an attribute's ASF is set to
.PN PEXIndividual ,
the attribute value is obtained directly from the current
pipeline state. If an attribute's ASF is set to
.PN PEXBundled ,
the attribute value
is obtained from the current interior bundle table. The interior bundle table 
entry to be used is indicated by the interior bundle index attribute. 
Surface interior style asf, surface interior style index asf, 
surface color asf, surface reflection attributes asf, surface reflection model asf, 
surface interpolation method asf, back-face surface interior style asf, 
back-face surface interior style index asf, back-face surface surface color asf, 
back-face surface reflection attributes asf, back-face surface reflection model
asf and back-face surface interpolation method asf
are attributes which control the source of fill area attribute values.
.LP
The surface edges attribute indicates whether fill area edges are rendered in
addition to fill area interiors. Surface edges for fill areas are the edges of
each fill area. If surface edges are rendered, the surface edge color, surface
edge type, and surface edge width are used to render them.  These attributes
are analogous to the attributes that affect line primitives. Surface edge
colors are depth-cued but are not affected by light-source computations. 
Surface edge type and width, like line type and width, are raster attributes
applied after the surface edge has been transformed into device coordinates.
Edges are considered to be rendered "on top of" fill area interiors.  This means
that surface edges, when enabled, should be visible no matter what interior
style is used.  Parts of clipped surface edges are not visible (no new edge is
generated by the clipping process).  Also the source of the edge attribute
value is determined by the surface edge color asf, surface edge type asf,
and surface edge width asf.
.LP
Some fill area primitives allow additional data for the facet and for each
vertex.
If a color value is specified for the facet, it is taken to be the
intrinsic color of the surface and is used instead of the current surface color
when the fill area is rendered.
Vertex colors take precedence over facet colors which override the surface
color attributes.
A normal specified for the fill area facet is assumed to be
a surface normal for the facet and is used for back-facing surface processing. 
This normal may also be used in reflectance calculations.
If no fill area facet normal is
provided, one is computed by determining the first three non-colinear vertices
A, B, and C, and computing the cross product of the vector from A to B with the
vector from A to C.  If the fill area is degenerate (for example, does not
contain three non-colinear vertices), the resultant value of the normal is
implementation-dependent.
.NH 3
Fill Area Sets
.XS
\*(SN Fill Area Sets
.XE
.LP
.IN "fill area sets"
.LP
A fill area set consists of multiple fill areas, each of
which defines a "contour", "island" or a "hole" that is part
of a single, planar, area-defining output primitive.  All of the 
fill area attributes described in the section on fill areas apply to 
fill area sets.  If a normal
is not provided for the fill area set then it is computed, using the
method described in the section on fill areas, for the first contour.
.LP
Part of the definition of a fill area set is the contour hint flag. This
parameter is used to indicate whether the contours are
.PN PEXContourDisjoint , 
.PN PEXContourNested ,
.PN PEXContourIntersecting
or
.PN PEXContourUnknown .  
A contour hint of
.PN PEXContourDisjoint
means all contours are spatially disjoint.  No
overlapping or intersection occurs between any contours in the fill area 
set.  A
contour hint of
.PN PEXContourNested
means the contours are either disjoint or 
wholly contained within another contour.  No contour will have edges that 
intersect or are coincident with edges of any other contour.  A
contour hint of
.PN PEXContourIntersecting
means that separate contours may have 
edges that are coincident or overlap.  A
contour hint of
.PN PEXContourUnknown
means nothing is known about the 
relationships between the contours.  Fill area sets with contours that 
have higher complexity interrelationships than that indicated by their 
contour hint parameter are rendered in an implementation-dependent manner. 
.LP
A set of fill area sets may be connected where individual
fill area sets may share geometry and attribute information at vertices.
Each fill area set defines a planar surface, but each fill area set is not
necessarily co-planar with the other fill area sets.
One benefit to the set of fill area sets primitive is that data is
transmitted across the network once per unique vertex instead of once for
every fill area set sharing the vertex.
An additional parameter specifies whether the contours are all 1, i.e. there is
only one contour in each fill area set.  If
.PN True ,
then each fill area set in the SOFAS consists of a single facet, or fill area.  
.NH 3
Triangle Strips
.XS
\*(SN Triangle Strips
.XE
.LP
.IN "triangle strips"
.IN "primitives" "triangle strips"
A triangle strip is specified as a list of n vertices that
represent n-2 triangles.  For each value of i less than
or equal to n-2, the ith, i+1th, and i+2th
vertices define a triangle.  Geometric normals are computed
in the same way as described for fill areas, except that the order
of vertices is reversed for even-numbered triangles in the triangle strip.
The set of triangles need not be co-planar.
.LP
All of the fill area attributes described in the section on fill areas, 
except for the shape flag, affect triangle strips.
The surface edges for triangle strips are the line segments forming the
boundaries of all triangles in the strip.  There is only one edge between any
two adjacent triangles.
.NH 3
Quadrilateral Meshes
.XS
\*(SN Quadrilateral Meshes
.XE
.LP
.IN "quadrilateral meshes"
.IN "primitives" "quadrilateral meshes"
A quadrilateral mesh is specified as an array of
vertices representing quadrilaterals.  For each 
i less than the number of rows minus one and each j less than the number of
columns minus one, a quadrilateral is formed by the vertices
(i,j), (i+1,j), (i+1,j+1) and (i,j+1).
Normals are assumed to be unit length vectors.
Normals for quadrilaterals, if not provided explicitly, are computed by taking
the cross product of the diagonals.  For a quadrilateral with the above 
vertices, the cross product would be formed as follows:
.ID
normal(i,j) = (point(i+1, j+1) - point(i, j)) X (point(i, j+1) - point(i+1, j))
.DE
The set of quadrilaterals need not be co-planar, however, each individual
quadrilateral is assumed to be planar.
.LP
All of the fill area attributes described in the section on fill areas affect 
quadrilateral meshes.
The surface edges for quadrilateral meshes are the line segments forming the
boundaries of the individual quadrilaterals in the mesh.  There is only one
edge between any two adjacent quadrilaterals.
.NH 3
Non-Uniform Rational B-Spline Surfaces
.XS
\*(SN Non-Uniform Rational B-Spline Surfaces
.XE
.LP
.IN "B-spline surfaces"
.IN "primitives" "B-spline surfaces"
A non-uniform B-spline surface is
a B-spline surface specified by two lists of knot values
and a set of control points.
A set of trimming loops may be specified along with the data
for a non-uniform B-spline surface to specify those areas
of the surface to be rendered.
.LP
Non-uniform rational B-spline surfaces are affected by the following
list of attributes in addition to the fill area attributes described in the 
section on fill areas: 
.ID
parametric surface characteristics
surface approximation
surface approximation asf
.DE
.LP
The surface approximation defines the approximation
method and accuracy with which non-uniform B-spline surfaces are rendered.
Supported values for surface approximation are inquirable via
.PN PEXGetEnumTypeInfo .
.LP
The parametric surface characteristics defines the surface characteristics.
Supported values for parametric surface characteristics are inquirable via
.PN PEXGetEnumTypeInfo .
.NH 3
Cell Arrays
.XS
\*(SN Cell Arrays
.XE
.LP
.IN "cell arrays"
.IN "primitives" "cell arrays"
A cell array is a parallelogram of equal-sized cells, each of which
is a parallelogram and has a single color.
The attributes affecting cell arrays are those listed in
\fI2.1: Primitives and Attributes\fP.
.NH 3
Generalized Drawing Primitives
.XS
\*(SN Generalized Drawing Primitives
.XE
.LP
.IN "GDPs"
.IN "generalized drawing primitives"
.IN "primitives" "generalized drawing primitives"
A generalized drawing primitive (GDP) output command is provided.
This allows individual implementations to extend the supported primitive set.
There are no standard PEX GDPs.
The complete interface and behavior for each specified GDP identifier
should be available with the individual PEX implementations.
.bp