XXX - Not complete yet!!!
XXX - Obsolete; implemented as part of GL_SGIX_igloo_interface
    We still need to talk to myoung about error behavior.

Name

    IGLOO_swap_triangle_strip_vertex_pointerXXX


Name Strings

    GL_IGLOO_swap_triangle_strip_vertex_pointerXXX

    No name should be returned by glGetString, glXQueryExtensionsString, or gluGetString .
    The name string here is used solely in the registry.

Version

    $Date: 1999/04/03 08:40:51 $ $Revision: 1.3 $

Number

    None

	Igloo extensions should be compatible with *ALL* other extensions.
	(i.e. igloo extensions must document their interactions with subsequent
	extensions preceding it, so there is no number).

Dependencies

	None

Overview

	This extensions allows a single triangle fan to be generated within
	a glBegin(GL_TRIANGLE_STRIP) . . .glEnd();

New Procedures and Functions

	void SwapTriangleStripVertexPointerXXX(void);

New Tokens

	None

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

	Note: It is not explicitely stated but glGetError returns INVALID OPERATION
	when this is called between glBegin and glEnd if this extension is not supported.

	Section 2.6.3 -- GL Commands within Begin/End
	    The only GL command that are allowed within any Begin/End Pairs are the
	commands for specifying vertex coordinates, vertex color, normal coordinates,
	and texture coordinates (Vertex, Color, Index, Normal, TexCoord),
	EvalCoord and EvalPoint commands (see section 5.1)
	commands for specifying lighting material parameters
	(Material commnads: see section 2.12.2) display list invocation commands
	(callList and CallLists: see section 5.4), *SwapTriangleStripVertexPointerXXX*
	(see section 2.7) and the EdgeFlag command.

	Section 2.6.1 --- Begin and End Objects
	Triangle strips.  second paragraph
	    The state required to support triangle strips consists of a flag
	indicating if the first triangle has been completed, two stored
	processed vertices, (called vertex A and vertex B), and a one bit pointer
	indicating which stored vertex will be replaced with the next vertex.
	After a Begin(TRIANGLE_STRIP), the pointer is initialized to point to
	vertex A. Each vertex set between a Begin/End pair toggles the pointer.
	Therefore, the first vertex is stored as vertex A, the second stored
	as vertex B, the third stored as vertex A, and so on.
	***SwapTriangleStripVertexPointerXXX
	causes the pointer to point to the vertex it is not pointing to. Therefore
	if the pointer points to vertex A then SwapTriangleStripVertexPointerXXX will
	cause it to point to vertex B and vice-versa. ***  Any vertex after the second one sent
	forms a triangle from vertex A, vertex B, and the current vertex (in that order).

	same section the following should be appended to the end.
	    SwapTriangleStripVertexPointerXXX has no effect unless it is called between
	a Begin with the argument TRIANGLE_STRIP, and the corresponding call to End.

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)

	Currently Igloo doesn't use OpenGL display lists. But this command
	should be display listable. So it is *NOT* included in the set of
	commands which are *NOT* display listable.

	The way this is spec'd this will *NOT* generate an extra feedback vertex,
	or selection hit.  So nothing is added here regarding feedback and selection.
	HOWEVER,  if this is implemented in the future in software it is
	likely to be implemented by redundantly re-issuing the	second
	to the last vertex issued,  and this *WILL* generate a couple of
	feedback or selection vertices.


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

    None

Additions to the GLX Specification

GLX Protocol

    This command does not need to be recognized by GLX.
    IGLOO doesn't use indirect rendering.

Dependencies on SGI_extension_name

    None

Errors

    This command  should be a no-op for other primitive types
    (and outside of glBegin/glEnd.)   However, this implies that
    the Error state knows if you are within Begin/End. and
    worse it means that it knows if you are generating a Triangle
    Strip.  I'm assuming that if it is possible to flag
    an error it is also possible to ignore it.	SO. . .there is
    no error generated outside of glBegin(GL_TRIANGLE_STRIP) glEnd()
    and so nothing is written into this section.

    Blythe said that he'd talk to Myoung and make sure that this
    is ok.



New State

*	Description of all state values in table format.  Note that client
*	state should have "client" listed in the Attrib column.

								Initial
    Get Value				Get Command	Type	Value	Attrib
    ---------				-----------	----	------- ------
None

New Implementation Dependent State

*	Description of all implementation dependent state in table format.

									Minimum
    Get Value				Get Command	Type		Value
    ---------				-----------	----		-------

None

