\section{\module{gl} ---
         \emph{Graphics Library} interface}

\declaremodule{builtin}{gl}
  \platform{IRIX}
\modulesynopsis{Functions from the Silicon Graphics \emph{Graphics Library}.}


This module provides access to the Silicon Graphics
\emph{Graphics Library}.
It is available only on Silicon Graphics machines.

\warning{Some illegal calls to the GL library cause the Python
interpreter to dump core.
In particular, the use of most GL calls is unsafe before the first
window is opened.}

The module is too large to document here in its entirety, but the
following should help you to get started.
The parameter conventions for the C functions are translated to Python as
follows:

\begin{itemize}
\item
All (short, long, unsigned) int values are represented by Python
integers.
\item
All float and double values are represented by Python floating point
numbers.
In most cases, Python integers are also allowed.
\item
All arrays are represented by one-dimensional Python lists.
In most cases, tuples are also allowed.
\item
\begin{sloppypar}
All string and character arguments are represented by Python strings,
for instance,
\code{winopen('Hi There!')}
and
\code{rotate(900, 'z')}.
\end{sloppypar}
\item
All (short, long, unsigned) integer arguments or return values that are
only used to specify the length of an array argument are omitted.
For example, the C call

\begin{verbatim}
lmdef(deftype, index, np, props)
\end{verbatim}

is translated to Python as

\begin{verbatim}
lmdef(deftype, index, props)
\end{verbatim}

\item
Output arguments are omitted from the argument list; they are
transmitted as function return values instead.
If more than one value must be returned, the return value is a tuple.
If the C function has both a regular return value (that is not omitted
because of the previous rule) and an output argument, the return value
comes first in the tuple.
Examples: the C call

\begin{verbatim}
getmcolor(i, &red, &green, &blue)
\end{verbatim}

is translated to Python as

\begin{verbatim}
red, green, blue = getmcolor(i)
\end{verbatim}

\end{itemize}

The following functions are non-standard or have special argument
conventions:

\begin{funcdesc}{varray}{argument}
%JHXXX the argument-argument added
Equivalent to but faster than a number of
\code{v3d()}
calls.
The \var{argument} is a list (or tuple) of points.
Each point must be a tuple of coordinates
\code{(\var{x}, \var{y}, \var{z})} or \code{(\var{x}, \var{y})}.
The points may be 2- or 3-dimensional but must all have the
same dimension.
Float and int values may be mixed however.
The points are always converted to 3D double precision points
by assuming \code{\var{z} = 0.0} if necessary (as indicated in the man page),
and for each point
\code{v3d()}
is called.
\end{funcdesc}

\begin{funcdesc}{nvarray}{}
Equivalent to but faster than a number of
\code{n3f}
and
\code{v3f}
calls.
The argument is an array (list or tuple) of pairs of normals and points.
Each pair is a tuple of a point and a normal for that point.
Each point or normal must be a tuple of coordinates
\code{(\var{x}, \var{y}, \var{z})}.
Three coordinates must be given.
Float and int values may be mixed.
For each pair,
\code{n3f()}
is called for the normal, and then
\code{v3f()}
is called for the point.
\end{funcdesc}

\begin{funcdesc}{vnarray}{}
Similar to 
\code{nvarray()}
but the pairs have the point first and the normal second.
\end{funcdesc}

\begin{funcdesc}{nurbssurface}{s_k, t_k, ctl, s_ord, t_ord, type}
% XXX s_k[], t_k[], ctl[][]
Defines a nurbs surface.
The dimensions of
\code{\var{ctl}[][]}
are computed as follows:
\code{[len(\var{s_k}) - \var{s_ord}]},
\code{[len(\var{t_k}) - \var{t_ord}]}.
\end{funcdesc}

\begin{funcdesc}{nurbscurve}{knots, ctlpoints, order, type}
Defines a nurbs curve.
The length of ctlpoints is
\code{len(\var{knots}) - \var{order}}.
\end{funcdesc}

\begin{funcdesc}{pwlcurve}{points, type}
Defines a piecewise-linear curve.
\var{points}
is a list of points.
\var{type}
must be
\code{N_ST}.
\end{funcdesc}

\begin{funcdesc}{pick}{n}
\funcline{select}{n}
The only argument to these functions specifies the desired size of the
pick or select buffer.
\end{funcdesc}

\begin{funcdesc}{endpick}{}
\funcline{endselect}{}
These functions have no arguments.
They return a list of integers representing the used part of the
pick/select buffer.
No method is provided to detect buffer overrun.
\end{funcdesc}

Here is a tiny but complete example GL program in Python:

\begin{verbatim}
import gl, GL, time

def main():
    gl.foreground()
    gl.prefposition(500, 900, 500, 900)
    w = gl.winopen('CrissCross')
    gl.ortho2(0.0, 400.0, 0.0, 400.0)
    gl.color(GL.WHITE)
    gl.clear()
    gl.color(GL.RED)
    gl.bgnline()
    gl.v2f(0.0, 0.0)
    gl.v2f(400.0, 400.0)
    gl.endline()
    gl.bgnline()
    gl.v2f(400.0, 0.0)
    gl.v2f(0.0, 400.0)
    gl.endline()
    time.sleep(5)

main()
\end{verbatim}


\begin{seealso}
  \seetitle[http://pyopengl.sourceforge.net/]
           {PyOpenGL: The Python OpenGL Binding}
           {An interface to OpenGL\index{OpenGL} is also available;
            see information about the
            \strong{PyOpenGL}\index{PyOpenGL} project online at
            \url{http://pyopengl.sourceforge.net/}.  This may be a
            better option if support for SGI hardware from before
            about 1996 is not required.}
\end{seealso}


\section{\module{DEVICE} ---
         Constants used with the \module{gl} module}

\declaremodule{standard}{DEVICE}
  \platform{IRIX}
\modulesynopsis{Constants used with the \module{gl} module.}

This modules defines the constants used by the Silicon Graphics
\emph{Graphics Library} that C programmers find in the header file
\code{<gl/device.h>}.
Read the module source file for details.


\section{\module{GL} ---
         Constants used with the \module{gl} module}

\declaremodule[gl-constants]{standard}{GL}
  \platform{IRIX}
\modulesynopsis{Constants used with the \module{gl} module.}

This module contains constants used by the Silicon Graphics
\emph{Graphics Library} from the C header file \code{<gl/gl.h>}.
Read the module source file for details.
