XXX - Not complete yet!!!
Name

    SGIX_quad_mesh

Name Strings

    GL_SGIX_quad_mesh

Version

    $Date: 1997/02/21 17:32:24 $ $Revision: 1.2 $

Number

    XXX

Dependencies

    No extensions are required.
    OpenGL 1.1 and EXT_vertex_array affect the definition of this extension.

Overview

    This extension adds two primitive types, the quadrilateral mesh and the
    line mesh.

    For datasets representing from manifold surfaces, such as NURBS surfaces
    and most triangular databases, quadrilateral meshes reduce the number of
    vertices which must be transferred from the host to the graphics hardware
    by up to fifty percent.  This also reduces by fifty percent the number of
    vertices which must be clipped and lit.

    Quad and line meshes also reduce by half the number of vertices which must
    be transformed and lit.

Issues

    * Kurt: The issue in the past has been the required intermediate storage.
    Your spec seems to require that implementations be able to store at least
    512 vertexes.  I wonder how you arrived at this number.

    Matt: I chose this number primary because it is large enough that
    applications are unlikely to have quad-mesh datasets larger than this
    size.  I wanted to avoid forcing applications to carve up their quad mesh
    data in hardware-specific ways, and instead allow the implementation to
    make the decision about optimal mesh width.

    I was also careful to minimize the amount of state.  Note that a naive
    implementation that just wants to draw the quad mesh as a bunch of
    independent quads only needs to amount of state listed in the spec.
    Every time glVertex is then called, one new quad is drawn.
    
    * Kurt: Is it implementable on all current SGI platforms?  

    Matt: If it is implemented as drawing independent quads, then yes.  On
    platforms where you really want to take advantage of the fact that you can
    light and xform the shared vertices only once, you may need to carve up
    the quad mesh into smaller pieces on the host (or ge).  to do that, you
    will need more implementation-private state.

New Procedures and Functions

    void MeshBreadthSGIX(int breadth);

    void MeshStrideSGIX(int stride);

New Tokens

    Accepted by the <mode> parameter of Begin, and 
    also accepted by the <mode> parameter of DrawArrays:

	QUAD_MESH_SGIX	     0x????
	LINE_MESH_SGIX	     0x????

Additions to Chapter 2 of the 1.0 Specification (OpenGL Operation)

  Append to section 2.6.1 (Begin and End Objects):

    Quad meshes and line meshes use an auxilliary function, MeshBreadthSGIX to
    define GL state which affects the quads and lines drawn by these
    primitives.  The <breadth> parameter to MeshBreadthSGIX is used in the
    descriptions of quad meshes and line meshes below.  

    Quadrilateral (quad) meshes:

    Quad meshes efficiently generate a series of quads in a regular grid.
    Given n input vertices to the quad mesh, the last n mod <breadth> vertices
    are ignored completely.  Let length = (n - (n mod <breadth>)) / <breadth>,
    and consider all j = 0,1,2,<breadth>*length-1.  A quad is drawn for four
    vertices v_j-<breadth>-1, v_j-<breadth>, v_j, v_j-1 for all j such that j
    mod <breadth> != 0 and j >= <breadth>.  The order in which the quads
    within a quad mesh are drawn is intentionally left completely undefined.

    Line meshes:

    Line meshes efficiently generate a series of lines in a regular grid.
    Given n input vertices to the line mesh, the last n mod <breadth> vertices
    are ignored completely.  Let length = (n - (n mod <breadth>)) / <breadth>,
    and consider all j = 0,1,2,<breadth>*length-1.  A line is drawn between
    vertex v_j-1 and v_j for all j such that j mod <breadth> != 0.  A line is
    drawn between vertex v_j-<breadth> and v_j for all j such that j >=
    <breadth>.  The order in which the lines within a line mesh are drawn is
    intentionally left completely undefined.

  Append to section 2.8 (Vertex Arrays) entry for DrawArrays:

    The order in which the quads or lines within a quad mesh or line mesh are
    drawn is intentionally left completely undefined.  They may be rendered in
    any order convenient for the implementation.

Additions to Chapter 3 of the 1.0 Specification (Rasterization)

    None

Additions to Chapter 4 of the 1.0 Specification (Per-Fragment Operations
and the Frame Buffer)

    None

Additions to Chapter 5 of the 1.0 Specification (Special Functions)

    None

Additions to Chapter 6 of the 1.0 Specification (State and State Requests)

    None

Additions to the GLX Specification

    None

GLX Protocol

    XXX - Not figured out yet.

Dependencies on OpenGL 1.1
Dependencies on EXT_vertex_array

    If neither OpenGL 1.1 nor EXT_vertex_array are present, then the following
    should be omited:
	all references to MeshStrideSGIX,
	all references to DrawArrays.

Errors

    INVALID_VALUE is generated if MeshBreadthSGIX parameter <breadth> is
    zero or negative.

    INVALID_OPERATION is generated if MeshBreadthSGIX is executed between the
    execution of Begin and the corresponding execution of End.

New State

  Replace beginning of table 6.4:  GL Internal begin-end state variables (inaccessible)

    Get Value				Get Command	Type	Value	Attrib	Description
    ---------				-----------	----	-------	------  -----------
							Z_13	0		When != 0, indicates begin/end object

  Append to table 6.4:  GL Internal begin-end state variables (inaccessible)

    Get Value				Get Command	Type	Value	Attrib	Description
    ---------				-----------	----	-------	------  -----------
							513*XV			MAX_MESH_BREADTH + 1 vertices.
										First entries are from current row.
										Last entries are from previous row.
							Z512*	0		Number of vertices accumulated for
										current row of mesh in the array above.
							B	0		True if not in first row of quad mesh.

  Append to table 6.5:  Current Values and Associated Data

    Get Value				Get Command	Type	Value	Attrib	Description
    ---------				-----------	----	-------	------  -----------
    MESH_BREADTH			glGetIntegerv	Z+	2	current	Breadth of quad and line meshes

New Implementation Dependent State

    Get Value				Get Command	Type	Value	Attrib
    ---------				-----------	----	-------	------
    MAX_MESH_BREADTH			glGetIntegerv	Z+	512*
