Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages


home | help
gleTextureMode(3GLE)		      GLE		  gleTextureMode(3GLE)

       gleTextureMode  - set the type of GLE automatic texture coordinate gen-

       void gleTextureMode (int	mode);

       mode	 bitwise OR of GLE texture mode	flags

       In addition to the default glTexGen modes that are supplied by  OpenGL,
       the  tubing library also	contains some of its own automatic texture co-
       ordinate	generation routines. In	addition, user-defined	texture	 coord
       generation routines can be supplied.

       To use texture mapping with the extrusion library, one must remember to
       "do the obvious":

	      Enable texture mapping through OpenGL

	      Define and load (glTexImage2D/glBindTexture) a texture

	      If using the routine below, then disable glTexgGen

       gleTextureMode can be used to set the type of automatic texture coordi-
       nate  generation	to be used. The	argument should	be a bitwise-OR	of any
       of the following	flags:

	      If this bit is set, then texturing is enabled. If	 this  bit  is
	      NOT  set,	 then  automatic texture coordinate generation is dis-

       The way in which	the automatic texture coordinate generation occurs  is
       determined  by  one  of	the following flags. One and only one of these
       should be selected at a time. These tokens  are	enumerants,  not  bit-

	      Uses  the	vertexes "x" coordinate	as the texture "u" coordinate,
	      and the accumulated segment length as the	"v" coordinate.

	      Uses the normal vector's "x" coordinate as the texture "u" coor-
	      dinate,  and  the	 accumulated segment length as the "v" coordi-

	      Uses u = phi/(2*pi) = arctan (vy/vx)/(2*pi) as the  texture  "u"
	      coordinate,  and the accumulated segment length as the "v" coor-
	      dinate.  In the above equation, "vx" and "vy" stand for the ver-
	      tex's x and y coordinates.

	      Uses  u  = phi/(2*pi) = arctan (ny/nx)/(2*pi) as the texture "u"
	      coordinate, and the accumulated segment length as	the "v"	 coor-
	      dinate.  In the above equation, "nx" and "ny" stand for the nor-
	      mal's x and y coordinates.

	      Uses u = phi/(2*pi) = arctan (vy/vx)/(2*pi) as the  texture  "u"
	      coordinate, and v	= theta/pi = (1.0 - arccos(vz))/pi as the tex-
	      ture "v" coordinate. In the above	equation, "vx","vy"  and  "vz"
	      stand for	the vertex's x,	y and z	coordinates.

	      Uses  u  = phi/(2*pi) = arctan (ny/nx)/(2*pi) as the texture "u"
	      coordinate, and v	= theta/pi = (1.0 - arccos(nz))/pi as the tex-
	      ture  "v"	 coordinate. In	the above equation, "nx","ny" and "nz"
	      stand for	the normal's x,	y and z	coordinates.






	      These define texture mapping modes  that	are  very  similar  to
	      those  described	above,	except that the	untransformed vertices
	      and/or normals are used. As a result, textures tends to stick to
	      the  extrusion according to the extrusions local surface coordi-
	      nates rather than	according to real-space	coordinates. This will
	      in  general  provide  the	 correct style of texture mapping when
	      affine transforms	are being applied to the  contour,  since  the
	      coordinates used are those prior to the affine transform.

       To best understand how to use the above functions, it is	best to	under-
       stand how the tubing is actually	drawn. Let us start by	defining  some
       terms.  The  tubing library "extrudes" a	"contour" along	a "path".  The
       contour is a 2D polyline. The path is a 3D polyline. We	use  the  word
       "segment"  to refer to a	straight-line segment of the path polyline. We
       also interchangeably use	the word "segment" to stand for	the section of
       the extrusion that lies along a path segment.

       The tubing library draws	segments one at	a time.	It uses	glPushmatrix()
       and glPopmatrix() to orient each	segment	along the negative z-axis. The
       segment	starts	at z=0 and ends	at some	negative z-value (equal	to the
       length of the segment). The segment is then  drawn  by  calling	glVer-
       tex3f()	(and  glNormal3F()) by drawing the 2D contour at z=0 and again
       at z=-len. (Of course, if the join style	is one of the fancy ones, then
       the  end-points	are  trimmed in	a variety of ways, and do not land ex-
       actly on	z=0, or	z=-len,	but they do come close). Note  that  glBegin()
       and  glEnd() are	called around each segment. (Note also that additional
       glBegins/Ends may be called to draw end-caps or filleting triangles for
       the more	complex	join styles.)

       The  obvious  way  to  automatically  generate  textures	is to warp the
       glVertex() and glNormal() functions, and	 compute  texture  coordinates
       based on	the 3-space vertex and normal coordinates. This	is essentially
       what the	tubing code does, except that it passes	some extra parameters.
       The  glBegin  calls are wrapped,	and the	integer	segment	number and the
       floating-point length of	the segment are	passed in. By knowing the seg-
       ment number, and	the segment length, the	texture	coordinates can	be ad-
       justed. Knowing the length allows the length to be accumulated, so that
       a texture is applied lengthwise along the extrusion. It is this accumu-
       lated length that is used in the	FLAT and CYL mapping modes.

       For each	vertex,	not only are the vertex	x,y,z  coordinates  available,
       but so is a contour vertex counter indicating which contour vertex this
       corresponds to. There is	also a flag indicating whether the vertex cor-
       responds	 to  a	front  or  back	 vertex	(i.e. a	z=0 or z=-len vertex).
       Again, this info	can be used to avoid confusion when drawing  the  more
       complex join styles.

       Here are	a few hints, tips, and techniques:

       o      Hint:  Confused?	RUN THE	DEMOS! The best	way to understand what
	      all the different	texture	modes are doing	is to see them in  ac-

       o      Hint: The	texture	matrix can be used to your advantage! That is,
	      you can use glMatrixMode(GL_TEXTURE) to control how textures are
	      mapped  to  the surface. In particular, you may/will want	to use
	      it to to rescale the V coordinate.

       o      The origin of the	contour	will in	general	change the vertex  x's
	      and y's, thus changing the texture coordinates.

       o      The  contour  "up" vector	will NOT influence the texture coordi-

       o      For the FLAT and CYL modes, the accumulated length really	is the
	      accumulated  length of the segments in modeling coordinates. Un-
	      less the extrusion is very small,	this length will  probably  be
	      much  larger  than  1.0, and so the resulting texture coordinate
	      will wrap. You will generally want to rescale the	"V" coordinate
	      to make the texture map fit.

       o      If  the  texture is "swimming" around on the surface in an unde-
	      sired way, try using the "MODEL" version of the texture  genera-
	      tion flag.

       o      Typically,  you  will  NOT want to use the "SPH" versions	of the
	      texture generation engine	unless you really, really have an  ex-
	      trusion  for  which  spherical coordinates are appropriate. Most
	      uses of extrusions are best handled with the  "FLAT"  and	 "CYL"
	      generation methods.

       o      User-defined  texture generation callbacks are not currently im-
	      plemented, but these should be very, very	easy to	hack in	as de-
	      sired.   It  should  be easy to let your imagination run wild in
	      here. Look at texgen.c --	what needs to be done should be	 obvi-
	      ous, I hope.  When in doubt, experiment.

       Multiple	threads	using GLE share	a single texture mode.

       gleExtrusion, gleSetJoinStyle

       Linas Vepstas (

GLE				      3.6		  gleTextureMode(3GLE)


Want to link to this manual page? Use this URL:

home | help