NAME
	  fglMap2d, fglMap2f - define a	two-dimensional	evaluator


     FORTRAN SPECIFICATION
	  SUBROUTINE fglMap2d( INTEGER*4 target,
			       REAL*8 u1,
			       REAL*8 u2,
			       INTEGER*4 ustride,
			       INTEGER*4 uorder,
			       REAL*8 v1,
			       REAL*8 v2,
			       INTEGER*4 vstride,
			       INTEGER*4 vorder,
			       CHARACTER*8 points )
	  SUBROUTINE fglMap2f( INTEGER*4 target,
			       REAL*4 u1,
			       REAL*4 u2,
			       INTEGER*4 ustride,
			       INTEGER*4 uorder,
			       REAL*4 v1,
			       REAL*4 v2,
			       INTEGER*4 vstride,
			       INTEGER*4 vorder,
			       CHARACTER*8 points )


     PARAMETERS
	  target   Specifies the kind of values	that are generated by
		   the evaluator.  Symbolic constants
		   GL_MAP2_VERTEX_3, GL_MAP2_VERTEX_4, GL_MAP2_INDEX,
		   GL_MAP2_COLOR_4, GL_MAP2_NORMAL,
		   GL_MAP2_TEXTURE_COORD_1, GL_MAP2_TEXTURE_COORD_2,
		   GL_MAP2_TEXTURE_COORD_3, and
		   GL_MAP2_TEXTURE_COORD_4 are accepted.

	  u1, u2   Specify a linear mapping of u, as presented to
		   fglEvalCoord2, to ^,	one of the two variables that
		   are evaluated by the	equations specified by this
		   command. Initially, u1 is 0 and u2 is 1.

	  ustride  Specifies the number	of floats or doubles between
		   the beginning of control point R   and the
		   beginning of	control	point R	   ij, where i and j
		   are the u and v control pointiindices,
		   respectively.  This allows control points to	be
		   embedded in arbitrary data structures.  The only
		   constraint is that the values for a particular
		   control point must occupy contiguous	memory
		   locations. The initial value	of ustride is 0.

	  uorder   Specifies the dimension of the control point	array
		   in the u axis.  Must	be positive. The initial value
		   is 1.

	  v1, v2   Specify a linear mapping of v, as presented to
		   fglEvalCoord2, to ^,	one of the two variables that
		   are evaluated by the	equations specified by this
		   command. Initially, v1 is 0 and v2 is 1.

	  vstride  Specifies the number	of floats or doubles between
		   the beginning of control point R   and the
		   beginning of	control	point R	   ij, where i and j
		   are the u and v control point(indices,
		   respectively.  This allows control points to	be
		   embedded in arbitrary data structures.  The only
		   constraint is that the values for a particular
		   control point must occupy contiguous	memory
		   locations. The initial value	of vstride is 0.

	  vorder   Specifies the dimension of the control point	array
		   in the v axis.  Must	be positive. The initial value
		   is 1.

	  points   Specifies a pointer to the array of control points.

     DESCRIPTION
	  Evaluators provide a way to use polynomial or	rational
	  polynomial mapping to	produce	vertices, normals, texture
	  coordinates, and colors.  The	values produced	by an
	  evaluator are	sent on	to further stages of GL	processing
	  just as if they had been presented using fglVertex,
	  fglNormal, fglTexCoord, and fglColor commands, except	that
	  the generated	values do not update the current normal,
	  texture coordinates, or color.

	  All polynomial or rational polynomial	splines	of any degree
	  (up to the maximum degree supported by the GL
	  implementation) can be described using evaluators.  These
	  include almost all surfaces used in computer graphics,
	  including B-spline surfaces, NURBS surfaces, Bezier
	  surfaces, and	so on.

	  Evaluators define surfaces based on bivariate	Bernstein
	  polynomials.	Define p(^,^) as
				     n	m
				     R	R  n	m
			 p(^,^)	 =  i=0j=0Bi(^)Bj(^)Rij


	  where	R   is a control point,	Bn(^) is the ith Bernstein
	  polynomial of	degree		 i
	  n (uorder = n+1)

			    n	     (n	 ) i	 n-i
			   Bi(^)  =  |	 |^ (1-^)
				     (i	 )
	  and Bm(^) is the jth Bernstein polynomial of degree m
	  (vord<EM>er = m+1)

			    m	     (m	 ) j	 m-j
			   Bj(^)  =  |	 |^ (1-^)
				     (j	 )
	  Recall that
			     0	       (n   )
			    0  = 1 and |    |  =  1
				       ( 0  )
	  fglMap2 is used to define the	basis and to specify what kind
	  of values are	produced.  Once	defined, a map can be enabled
	  and disabled by calling fglEnable and	fglDisable with	the
	  map name, one	of the nine predefined values for target,
	  described below.  When fglEvalCoord2 presents	values u and
	  v, the bivariate Bernstein polynomials are evaluated using ^
	  and ^, where

				 ^  =  _______
				       u2 - u1
				 ^  =  _______
				       v2 - v1
	  target is a symbolic constant	that indicates what kind of
	  control points are provided in points, and what output is
	  generated when the map is evaluated.	It can assume one of
	  nine predefined values:

	  GL_MAP2_VERTEX_3	   Each	control	point is three
				   floating-point values representing
				   x, y, and z.	 Internal fglVertex3
				   commands are	generated when the map
				   is evaluated.

	  GL_MAP2_VERTEX_4	   Each	control	point is four
				   floating-point values representing
				   x, y, z, and	w.  Internal
				   fglVertex4 commands are generated
				   when	the map	is evaluated.

	  GL_MAP2_INDEX		   Each	control	point is a single
				   floating-point value	representing a
				   color index.	 Internal fglIndex
				   commands are	generated when the map
				   is evaluated	but the	current	index
				   is not updated with the value of
				   these fglIndex commands.

	  GL_MAP2_COLOR_4	   Each	control	point is four
				   floating-point values representing
				   red,	green, blue, and alpha.
				   Internal fglColor4 commands are
				   generated when the map is evaluated
				   but the current color is not
				   updated with	the value of these
				   fglColor4 commands.

	  GL_MAP2_NORMAL	   Each	control	point is three
				   floating-point values representing
				   the x, y, and z components of a
				   normal vector.  Internal fglNormal
				   commands are	generated when the map
				   is evaluated	but the	current	normal
				   is not updated with the value of
				   these fglNormal commands.

	  GL_MAP2_TEXTURE_COORD_1  Each	control	point is a single
				   floating-point value	representing
				   the s texture coordinate.  Internal
				   fglTexCoord1	commands are generated
				   when	the map	is evaluated but the
				   current texture coordinates are not
				   updated with	the value of these
				   fglTexCoord commands.

	  GL_MAP2_TEXTURE_COORD_2  Each	control	point is two
				   floating-point values representing
				   the s and t texture coordinates.
				   Internal
				   fglTexCoord2	commands are generated
				   when	the map	is evaluated but the
				   current texture coordinates are not
				   updated with	the value of these
				   fglTexCoord commands.

	  GL_MAP2_TEXTURE_COORD_3  Each	control	point is three
				   floating-point values representing
				   the s, t, and r texture
				   coordinates.	 Internal fglTexCoord3
				   commands are	generated when the map
				   is evaluated	but the	current
				   texture coordinates are not updated
				   with	the value of these fglTexCoord
				   commands.

	  GL_MAP2_TEXTURE_COORD_4  Each	control	point is four
				   floating-point values representing
				   the s, t, r,	and q texture
				   coordinates.	 Internal
				   fglTexCoord4	commands are generated
				   when	the map	is evaluated but the
				   current texture coordinates are not
				   updated with	the value of these
				   fglTexCoord commands.

	  ustride, uorder, vstride, vorder, and	points define the
	  array	addressing for accessing the control points.  points
	  is the location of the first control point, which occupies
	  one, two, three, or four contiguous memory locations,
	  depending on which map is being defined.  There are
	  uorderxvorder	control	points in the array.  ustride
	  specifies how	many float or double locations are skipped to
	  advance the internal memory pointer from control point R
	  to control point R	  .  vstride specifies how many	float
	  or double locationsiarejskipped to advance the internal
	  memory pointer from control point R	to control point
	  R	 .			     ij
	   i(j+1)
     NOTES
	  As is	the case with all GL commands that accept pointers to
	  data,	it is as if the	contents of points were	copied by
	  fglMap2 before fglMap2 returns.  Changes to the contents of
	  points have no effect	after fglMap2 is called.

	  Initially, GL_AUTO_NORMAL is enabled.	If GL_AUTO_NORMAL is
	  enabled, normal vectors are generated	when either
	  GL_MAP2_VERTEX_3 or GL_MAP2_VERTEX_4 is used to generate
	  vertices.

     ERRORS
	  GL_INVALID_ENUM is generated if target is not	an accepted
	  value.

	  GL_INVALID_VALUE is generated	if u1 is equal to u2, or if v1
	  is equal to v2.

	  GL_INVALID_VALUE is generated	if either ustride or vstride
	  is less than the number of values in a control point.

	  GL_INVALID_VALUE is generated	if either uorder or vorder is
	  less than 1 or greater than the return value of
	  GL_MAX_EVAL_ORDER.

	  GL_INVALID_OPERATION is generated if fglMap2 is executed
	  between the execution	of fglBegin and	the corresponding
	  execution of fglEnd.

     ASSOCIATED	GETS
	  fglGetMap
	  fglGet with argument GL_MAX_EVAL_ORDER
	  fglIsEnabled with argument GL_MAP2_VERTEX_3
	  fglIsEnabled with argument GL_MAP2_VERTEX_4
	  fglIsEnabled with argument GL_MAP2_INDEX
	  fglIsEnabled with argument GL_MAP2_COLOR_4
	  fglIsEnabled with argument GL_MAP2_NORMAL
	  fglIsEnabled with argument GL_MAP2_TEXTURE_COORD_1
	  fglIsEnabled with argument GL_MAP2_TEXTURE_COORD_2
	  fglIsEnabled with argument GL_MAP2_TEXTURE_COORD_3
	  fglIsEnabled with argument GL_MAP2_TEXTURE_COORD_4

     SEE ALSO
	  fglBegin, fglColor, fglEnable, fglEvalCoord, fglEvalMesh,
	  fglEvalPoint,	fglMap1, fglMapGrid, fglNormal,	fglTexCoord,
	  fglVertex