_C_ License Applicability. Except to the extent portions of this file are
_C_ made subject to an alternative license as permitted in the SGI Free
_C_ Software License B, Version 1.1 (the "License"), the contents of this
_C_ file are subject only to the provisions of the License. You may not use
_C_ this file except in compliance with the License. You may obtain a copy
_C_ of the License at Silicon Graphics, Inc., attn: Legal Services, 1600
_C_ Amphitheatre Parkway, Mountain View, CA 94043-1351, or at:
_C_ 
_C_ http://oss.sgi.com/projects/FreeB
_C_ 
_C_ Note that, as provided in the License, the Software is distributed on an
_C_ "AS IS" basis, with ALL EXPRESS AND IMPLIED WARRANTIES AND CONDITIONS
_C_ DISCLAIMED, INCLUDING, WITHOUT LIMITATION, ANY IMPLIED WARRANTIES AND
_C_ CONDITIONS OF MERCHANTABILITY, SATISFACTORY QUALITY, FITNESS FOR A
_C_ PARTICULAR PURPOSE, AND NON-INFRINGEMENT.
_C_ 
_C_ Original Code. The Original Code is: OpenGL Sample Implementation,
_C_ Version 1.2.1, released January 26, 2000, developed by Silicon Graphics,
_C_ Inc. The Original Code is Copyright (c) 1991-2000 Silicon Graphics, Inc.
_C_ Copyright in any portions created by third parties is as indicated
_C_ elsewhere herein. All Rights Reserved.
_C_ 
_C_ Additional Notice Provisions: The application programming interfaces
_C_ established by SGI in conjunction with the Original Code are The
_C_ OpenGL(R) Graphics System: A Specification (Version 1.2.1), released
_C_ April 1, 1999; The OpenGL(R) Graphics System Utility Library (Version
_C_ 1.3), released November 4, 1998; and OpenGL(R) Graphics with the X
_C_ Window System(R) (Version 1.3), released October 19, 1998. This software
_C_ was created using the OpenGL(R) version 1.2.1 Sample Implementation
_C_ published by SGI, but has not been independently verified as being
_C_ compliant with the OpenGL(R) version 1.2.1 Specification.
_C_
_C_ The first character in this file must be an '_'!
_C_ Anything on a line after _C_ is ignored
_define(_filters,tbl|eqn)_C_
_C_      eqn is automatically replaced with neqn for nroff
_header(FeedbackBuffer,controls feedback mode)
_names(FeedbackBuffer)
.EQ
delim $$
.EN
.SH PARAMETERS
_phead(_param1)
Specifies the maximum number of values that can be written into _param3.
_phead(_param2) 
Specifies a symbolic constant that describes the information
that will be returned for each vertex.
_const(2D),
_const(3D),
_const(3D_COLOR),
_const(3D_COLOR_TEXTURE), and
_const(4D_COLOR_TEXTURE) are accepted.
_phead(_param3)
Returns the feedback data.
.SH DESCRIPTION
The _cmnd function controls feedback.
Feedback, like selection, is a GL mode.
The mode is selected by calling
_cmnd(RenderMode) with _const(FEEDBACK).
When the GL is in feedback mode,
no pixels are produced by rasterization.
Instead, information about primitives that would have been
rasterized is fed back to the application using the GL.
.P
_cmnd has three arguments:
_param3 is a pointer to an array of floating-point values
into which feedback information is placed.
_param1 indicates the size of the array.
_param2 is a symbolic constant describing the information
that is fed back for each vertex.
_cmnd must be issued before feedback mode is enabled
(by calling _cmnd(RenderMode) with argument _const(FEEDBACK)).
Setting _const(FEEDBACK) without establishing the feedback buffer,
or calling _cmnd while the GL is in feedback mode,
is an error.
.P
When _cmnd(RenderMode) is called while in feedback mode, it returns the number of entries
placed in the feedback array, and resets the feedback array pointer to the base
of the feedback buffer. The returned value never exceeds _param1. If the feedback
data required more room than was available in _param3, 
_cmnd(RenderMode) returns a negative value.
To take the GL out of feedback mode, call
_cmnd(RenderMode) with a parameter value other than _const(FEEDBACK).
.P
While in feedback mode,
each primitive, bitmap, or pixel rectangle that would be rasterized
generates a block of values that are copied into the feedback array.
If doing so would cause the number of entries to exceed the maximum,
the block is partially written so as to fill the array
(if there is any room left at all),
and an overflow flag is set.
Each block begins with a code indicating the primitive type,
followed by values that describe the primitive's vertices and
associated data.
Entries are also written for bitmaps and pixel rectangles.
Feedback occurs after polygon culling and _cmnd(PolygonMode) interpretation
of polygons has taken place,
so polygons that are culled are not returned in the feedback buffer.
It can also occur after polygons with more than three edges are broken up
into triangles,
if the GL implementation renders polygons by performing this decomposition.
.P
The _cmnd(PassThrough) command can be used to insert a marker
into the feedback buffer.
See _cmnd(PassThrough).
.P
Following is the grammar for the blocks of values written
into the feedback buffer.
Each primitive is indicated with a unique identifying value
followed by some number of vertices.
Polygon entries include an integer value indicating how many vertices follow.
A vertex is fed back as some number of floating-point values,
as determined by _param2.
Colors are fed back as four values in RGBA mode and one value
in color index mode. 
.RS
.na
.sp
feedbackList \(<- feedbackItem feedbackList | feedbackItem
.sp
feedbackItem \(<- point | lineSegment | polygon | bitmap | pixelRectangle | passThru
.sp
point \(<- _const(POINT_TOKEN) vertex
.sp
lineSegment \(<- _const(LINE_TOKEN) vertex vertex | _const(LINE_RESET_TOKEN) vertex vertex
.sp
polygon \(<- _const(POLYGON_TOKEN) n polySpec
.sp
polySpec \(<- polySpec vertex | vertex vertex vertex
.sp
bitmap \(<- _const(BITMAP_TOKEN) vertex 
.sp
pixelRectangle \(<- _const(DRAW_PIXEL_TOKEN) vertex | _const(COPY_PIXEL_TOKEN) vertex
.sp
passThru \(<- _const(PASS_THROUGH_TOKEN) value
.sp
vertex \(<- 2d | 3d | 3dColor | 3dColorTexture | 4dColorTexture
.sp
2d \(<- value value
.sp
3d \(<- value value value
.sp
3dColor  \(<- value value value color
.sp
3dColorTexture \(<- value value value color tex
.sp
4dColorTexture \(<- value value value value color tex
.sp
color \(<- rgba | index
.sp
rgba \(<- value value value value
.sp
index \(<- value
.sp
tex \(<- value value value value
.sp
.RE
.P
.I value
is a floating-point number, 
and
.I n
is a floating-point integer giving the number of vertices in the polygon.
_const(POINT_TOKEN), 
_const(LINE_TOKEN),
_const(LINE_RESET_TOKEN),
_const(POLYGON_TOKEN),
_const(BITMAP_TOKEN),
_const(DRAW_PIXEL_TOKEN),
_const(COPY_PIXEL_TOKEN) and
_const(PASS_THROUGH_TOKEN) are symbolic floating-point constants.
_const(LINE_RESET_TOKEN) is returned whenever the line stipple pattern
is reset.
The data returned as a vertex depends on the feedback _param2.
.P
The following table gives the correspondence between _param2
and the number of values per vertex.
\f2k\fP is 1 in color index mode and 4 in RGBA mode.
.sp
.ne
.TS
center tab(:);
lb lb cb cb cb
l l c c c.
_
Type:Coordinates:Color:Texture:Total Number of Values
_
_const(2D):\f2x\fP, \f2y\fP:::2
_const(3D):\f2x\fP, \f2y\fP, \f2z\fP:::3
_const(3D_COLOR):\f2x\fP, \f2y\fP, \f2z\fP:$k$::$3 ~+~ k$
_const(3D_COLOR_TEXTURE):\f2x\fP, \f2y\fP, \f2z\fP,:$k$:4:$7 ~+~ k$
_const(4D_COLOR_TEXTURE):\f2x\fP, \f2y\fP, \f2z\fP, \f2w\fP:$k$:4:$8 ~+~ k$
_
.TE

.P
Feedback vertex coordinates are in window coordinates,
except \f2w\fP,
which is in clip coordinates.
Feedback colors are lighted, if lighting is enabled.
Feedback texture coordinates are generated,
if texture coordinate generation is enabled.
They are always transformed by the texture matrix.
.SH NOTES
_cmnd, when used in a display list, is not compiled into the display list 
but is executed immediately. 
.P
When the _arbstring(multitexture) extension is supported, _cmnd
returns only the texture coordinates of texture unit _arbconst(TEXTURE0).
.SH ERRORS
_const(INVALID_ENUM) is generated if _param2 is not an accepted value.
.P
_const(INVALID_VALUE) is generated if _param1 is negative.
.P
_const(INVALID_OPERATION) is generated if _cmnd is called while the
render mode is _const(FEEDBACK),
or if _cmnd(RenderMode) is called with argument _const(FEEDBACK) before
_cmnd is called at least once.
.P
_const(INVALID_OPERATION) is generated if _cmnd
is executed between the execution of _cmnd(Begin)
and the corresponding execution of _cmnd(End).
.SH ASSOCIATED GETS
_cmnd(Get) with argument _const(RENDER_MODE)
.br
_cmnd(Get) with argument _const(FEEDBACK_BUFFER_POINTER)
.br
_cmnd(Get) with argument _const(FEEDBACK_BUFFER_SIZE)
.br
_cmnd(Get) with argument _const(FEEDBACK_BUFFER_TYPE)
.SH SEE ALSO
_cmnd(Begin),
_cmnd(LineStipple),
_cmnd(PassThrough),
_cmnd(PolygonMode),
_cmnd(RenderMode),
_cmnd(SelectBuffer)
