NAME¶
gleTextureMode - set the type of GLE automatic texture coordinate generation.
SYNTAX¶
void gleTextureMode (int mode);
ARGUMENTS¶
- mode
- bitwise OR of GLE texture mode flags
DESCRIPTION¶
In addition to the default glTexGen modes that are supplied by OpenGL, the
tubing library also contains some of its own automatic texture coordinate
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 coordinate
generation to be used. The argument should be a bitwise-OR of any of the
following flags:
- GLE_TEXTURE_ENABLE
- If this bit is set, then texturing is enabled. If this bit
is NOT set, then automatic texture coordinate generation is disabled.
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-flags.
- GLE_TEXTURE_VERTEX_FLAT
- Uses the vertexes "x" coordinate as the texture
"u" coordinate, and the accumulated segment length as the
"v" coordinate.
- GLE_TEXTURE_NORMAL_FLAT
- Uses the normal vector's "x" coordinate as the
texture "u" coordinate, and the accumulated segment length as
the "v" coordinate.
- GLE_TEXTURE_VERTEX_CYL
- Uses u = phi/(2*pi) = arctan (vy/vx)/(2*pi) as the texture
"u" coordinate, and the accumulated segment length as the
"v" coordinate. In the above equation, "vx" and
"vy" stand for the vertex's x and y coordinates.
- GLE_TEXTURE_NORMAL_CYL
- Uses u = phi/(2*pi) = arctan (ny/nx)/(2*pi) as the texture
"u" coordinate, and the accumulated segment length as the
"v" coordinate. In the above equation, "nx" and
"ny" stand for the normal's x and y coordinates.
- GLE_TEXTURE_VERTEX_SPH
- 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
texture "v" coordinate. In the above equation,
"vx","vy" and "vz" stand for the vertex's x,
y and z coordinates.
- GLE_TEXTURE_NORMAL_SPH
- 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
texture "v" coordinate. In the above equation,
"nx","ny" and "nz" stand for the normal's x,
y and z coordinates.
- GLE_TEXTURE_VERTEX_MODEL_FLAT
- GLE_TEXTURE_NORMAL_MODEL_FLAT
- GLE_TEXTURE_VERTEX_MODEL_CYL
- GLE_TEXTURE_NORMAL_MODEL_CYL
- GLE_TEXTURE_VERTEX_MODEL_SPH
- GLE_TEXTURE_NORMAL_MODEL_SPH
- 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 coordinates 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.
OPERATION¶
To best understand how to use the above functions, it is best to understand 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 glVertex3f() (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 exactly 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 segment number, and the segment length, the
texture coordinates can be adjusted. Knowing the length allows the length to
be accumulated, so that a texture is applied lengthwise along the extrusion.
It is this accumulated 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 corresponds 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.
HINTS¶
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
action.
- 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 coordinates.
- o
- For the FLAT and CYL modes, the accumulated length really
is the accumulated length of the segments in modeling coordinates. Unless
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 undesired way, try using the "MODEL" version of
the texture generation flag.
- o
- Typically, you will NOT want to use the "SPH"
versions of the texture generation engine unless you really, really have
an extrusion 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
implemented, but these should be very, very easy to hack in as desired. It
should be easy to let your imagination run wild in here. Look at texgen.c
-- what needs to be done should be obvious, I hope. When in doubt,
experiment.
BUGS¶
Multiple threads using GLE share a single texture mode.
SEE ALSO¶
gleExtrusion, gleSetJoinStyle
AUTHOR¶
Linas Vepstas (linas@linas.org)