summaryrefslogtreecommitdiffstats
path: root/progs/samples
diff options
context:
space:
mode:
authorThierry Reding <[email protected]>2006-10-14 03:46:41 +0000
committerThierry Reding <[email protected]>2006-10-14 03:46:41 +0000
commit1ddf606332a188e46a47607cd41eb5d81bdf4c8a (patch)
tree8cb51078803106d87aedeae7bbd7a762a0d369d1 /progs/samples
Import Mesa 6.5.1 (MesaLib, MesaDemos, MesaGLUT).
Diffstat (limited to 'progs/samples')
-rw-r--r--progs/samples/Makefile48
-rw-r--r--progs/samples/Makefile.DJ85
-rw-r--r--progs/samples/Makefile.dja25
-rw-r--r--progs/samples/Makefile.mgw68
-rw-r--r--progs/samples/Makefile.win41
-rw-r--r--progs/samples/README520
-rw-r--r--progs/samples/accum.c157
-rw-r--r--progs/samples/bitmap1.c250
-rw-r--r--progs/samples/bitmap2.c787
-rw-r--r--progs/samples/blendeq.c319
-rw-r--r--progs/samples/blendxor.c206
-rw-r--r--progs/samples/copy.c193
-rw-r--r--progs/samples/cursor.c150
-rw-r--r--progs/samples/depth.c209
-rw-r--r--progs/samples/eval.c472
-rw-r--r--progs/samples/fog.c311
-rw-r--r--progs/samples/font.c273
-rw-r--r--progs/samples/line.c219
-rw-r--r--progs/samples/loadppm.c72
-rw-r--r--progs/samples/logo.c1635
-rw-r--r--progs/samples/nurb.c357
-rw-r--r--progs/samples/oglinfo.c218
-rw-r--r--progs/samples/olympic.c389
-rw-r--r--progs/samples/overlay.c378
-rw-r--r--progs/samples/point.c234
-rw-r--r--progs/samples/prim.c546
-rw-r--r--progs/samples/quad.c457
-rw-r--r--progs/samples/readtex.c454
-rw-r--r--progs/samples/rgbtoppm.c285
-rw-r--r--progs/samples/select.c456
-rw-r--r--progs/samples/shape.c345
-rw-r--r--progs/samples/sphere.c1014
-rw-r--r--progs/samples/star.c345
-rw-r--r--progs/samples/stencil.c143
-rw-r--r--progs/samples/stretch.c390
-rw-r--r--progs/samples/texture.c474
-rw-r--r--progs/samples/tkmap.c71
-rw-r--r--progs/samples/tri.c403
-rw-r--r--progs/samples/wave.c619
39 files changed, 13618 insertions, 0 deletions
diff --git a/progs/samples/Makefile b/progs/samples/Makefile
new file mode 100644
index 00000000000..063008dccff
--- /dev/null
+++ b/progs/samples/Makefile
@@ -0,0 +1,48 @@
+# progs/samples/Makefile
+
+TOP = ../..
+include $(TOP)/configs/current
+
+INCDIR = $(TOP)/include
+
+LIB_DEP = $(TOP)/$(LIB_DIR)/$(GL_LIB_NAME) $(TOP)/$(LIB_DIR)/$(GLU_LIB_NAME) $(TOP)/$(LIB_DIR)/$(GLUT_LIB_NAME)
+
+PROGS = accum bitmap1 bitmap2 blendeq blendxor copy cursor depth eval fog \
+ font line logo nurb olympic overlay point prim quad select \
+ shape sphere star stencil stretch texture tri wave
+
+
+##### RULES #####
+
+.SUFFIXES:
+.SUFFIXES: .c
+
+.c: $(LIB_DEP)
+ $(CC) -I$(INCDIR) $(CFLAGS) $< $(APP_LIB_DEPS) -o $@
+
+
+##### TARGETS #####
+
+default: $(PROGS)
+
+
+sphere: sphere.o readtex.o
+ $(CC) -I$(INCDIR) $(CFLAGS) sphere.o readtex.o $(APP_LIB_DEPS) -o $@
+
+sphere.o: sphere.c readtex.h
+ $(CC) -c -I$(INCDIR) $(CFLAGS) sphere.c
+
+readtex.c: $(TOP)/progs/util/readtex.c
+ cp $< .
+
+readtex.h: $(TOP)/progs/util/readtex.h
+ cp $< .
+
+readtex.o: readtex.c readtex.h
+ $(CC) -c -I$(INCDIR) $(CFLAGS) $< -o $@
+
+
+clean:
+ -rm -f $(PROGS)
+ -rm -f *.o *~
+ -rm -f readtex.c readtex.h
diff --git a/progs/samples/Makefile.DJ b/progs/samples/Makefile.DJ
new file mode 100644
index 00000000000..cda4e059418
--- /dev/null
+++ b/progs/samples/Makefile.DJ
@@ -0,0 +1,85 @@
+# Mesa 3-D graphics library
+# Version: 4.0
+#
+# Copyright (C) 1999 Brian Paul All Rights Reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+# BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+# DOS/DJGPP samples makefile v1.6 for Mesa
+#
+# Copyright (C) 2002 - Daniel Borca
+# Web : http://www.geocities.com/dborca
+
+
+#
+# Available options:
+#
+# Environment variables:
+# GLIDE path to Glide3 SDK; used with FX.
+# default = $(TOP)/glide3
+# FX=1 build for 3dfx Glide3. Note that this disables
+# compilation of most DMesa code and requires fxMesa.
+# As a consequence, you'll need the DJGPP Glide3
+# library to build any application.
+# default = no
+# DXE=1 use DXE modules (see README.DJ for details).
+# default = no
+#
+# Targets:
+# <file.exe> build a specific file
+#
+
+
+
+.PHONY: all
+.SUFFIXES: .c .o .exe
+.SECONDARY: ../util/readtex.o ../util/showbuffer.o
+
+TOP = ../..
+GLIDE ?= $(TOP)/glide3
+
+CC = gcc
+CFLAGS = -Wall -W -pedantic
+CFLAGS += -O2 -ffast-math
+CFLAGS += -I$(TOP)/include -I../util
+CFLAGS += -DGLUT_IMPORT_LIB
+ifeq ($(FX),1)
+CFLAGS += -DFX
+endif
+
+LD = gxx
+LDFLAGS = -s -L$(TOP)/lib
+
+ifeq ($(DXE),1)
+LDLIBS += -liglut -liglu -ligl
+else
+LDLIBS = -lglut -lglu -lgl
+ifeq ($(FX),1)
+LDFLAGS += -L$(GLIDE)/lib
+LDLIBS += -lgld3x
+endif
+endif
+
+.c.o:
+ $(CC) -o $@ $(CFLAGS) -c $<
+%.exe: ../util/readtex.o ../util/showbuffer.o %.o
+ $(LD) -o $@ $(LDFLAGS) $^ $(LDLIBS)
+
+all:
+ $(error Must specify <filename.exe> to build)
diff --git a/progs/samples/Makefile.dja b/progs/samples/Makefile.dja
new file mode 100644
index 00000000000..b60a11197b6
--- /dev/null
+++ b/progs/samples/Makefile.dja
@@ -0,0 +1,25 @@
+
+# Makefile for sample programs for MS-DOS with DJGPP and ALLEGRO
+
+
+
+INCDIR = ../include
+LIBDIR = ../lib
+include ../common.dja
+
+ _PROGS = accum bitmap1 bitmap2 blendeq blendxor copy cursor depth \
+ eval fog font line logo nurb oglinfo olympic overlay point \
+ prim quad select shape sphere star stencil stretch texture \
+ tri wave
+
+ PROGS = $(_PROGS:=.exe)
+
+
+default: $(PROGS)
+
+clean:
+ del *.
+
+realclean: clean
+ del *.exe
+
diff --git a/progs/samples/Makefile.mgw b/progs/samples/Makefile.mgw
new file mode 100644
index 00000000000..11935405783
--- /dev/null
+++ b/progs/samples/Makefile.mgw
@@ -0,0 +1,68 @@
+# Mesa 3-D graphics library
+# Version: 4.0
+#
+# Copyright (C) 1999 Brian Paul All Rights Reserved.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+# BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+# MinGW samples makefile v1.2 for Mesa
+#
+# Copyright (C) 2002 - Daniel Borca
+# Web : http://www.geocities.com/dborca
+
+
+#
+# Available options:
+#
+# Environment variables:
+#
+# Targets:
+# <file.exe> build a specific file
+#
+
+
+
+.PHONY: all
+.SUFFIXES: .c .o .exe
+.SECONDARY: ../util/readtex.o ../util/showbuffer.o
+
+TOP = ../..
+
+CC = mingw32-gcc
+CFLAGS = -Wall -W -pedantic
+CFLAGS += -O2 -ffast-math
+CFLAGS += -I$(TOP)/include -I../util
+ifeq ($(FX),1)
+CFLAGS += -DFX
+endif
+CFLAGS += -DGLUT_DISABLE_ATEXIT_HACK -D_STDCALL_SUPPORTED
+CFLAGS += -D_WINDEF_ -D_WINGDI_
+
+LD = mingw32-g++
+LDFLAGS = -s -L$(TOP)/lib
+
+LDLIBS = -lglut32 -lglu32 -lopengl32
+
+.c.o:
+ $(CC) -o $@ $(CFLAGS) -c $<
+%.exe: ../util/readtex.o ../util/showbuffer.o %.o
+ $(LD) -o $@ $(LDFLAGS) $^ $(LDLIBS)
+
+all:
+ $(error Must specify <filename.exe> to build)
diff --git a/progs/samples/Makefile.win b/progs/samples/Makefile.win
new file mode 100644
index 00000000000..e74568f7c96
--- /dev/null
+++ b/progs/samples/Makefile.win
@@ -0,0 +1,41 @@
+
+# Mesa 3-D graphics library
+# Version: 3.5
+# Copyright (C) 1995-2001 Brian Paul
+
+# Makefile for GLUT-based demo programs for Windows
+
+!include <win32.mak>
+
+##### MACROS #####
+
+TOP = ..
+INCDIR = ..\include
+LIBDIR = ..\lib
+
+PROGS = accum bitmap1 bitmap2 blendeq blendxor copy cursor depth eval fog \
+ font line logo nurb oglinfo olympic overlay point prim quad select \
+ shape sphere star stencil stretch texture tri wave
+
+SRCS = \
+ accum.c \
+ bitmap1.c \
+ bitmap2.c \
+ blendeq.c \
+ blendxor.c \
+ copy.c \
+ cursor.c depth.c eval.c fog.c \
+ font.c line.c logo.c nurb.c olympic.c overlay.c point.c prim.c quad.c select.c \
+ shape.c sphere.c star.c stencil.c stretch.c texture.c tri.c wave.c
+
+!include "../mesawin32.mak"
+
+##### TARGETS #####
+
+clean::
+
+clobber::
+
+$(EXES) : $*.obj
+ @echo $@
+ $(link) -out:$@ $* /LIBPATH:$(LIBDIR) $(LIBS)
diff --git a/progs/samples/README b/progs/samples/README
new file mode 100644
index 00000000000..853158873c9
--- /dev/null
+++ b/progs/samples/README
@@ -0,0 +1,520 @@
+/*
+ * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the name of
+ * Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF
+ * ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+accum - Accumulation test.
+ - RGBA, SB/DB (SB default).
+ - cmd line options:
+ -sb Single buffer mode.
+ -db Double buffer mode.
+ - keys:
+ ESC Quit
+ 1 Use filled polygon mode.
+ 2 Use outlined polygon mode.
+
+bitmap1 - Bitmap test.
+ - RGBA/CI (RGBA default), SB/DB (SB default).
+ - cmd line options:
+ -rgb RGBA mode.
+ -ci Color index mode.
+ -sb Single buffer mode.
+ -db Double buffer mode.
+ - keys:
+ ESC Quit.
+
+bitmap2 - Bitmap test.
+ - RGBA/CI (RGBA default), SB/DB (SB default).
+ - cmd line options:
+ -rgb RGBA mode.
+ -ci Color index mode.
+ -sb Single buffer mode.
+ -db Double buffer mode.
+ - keys:
+ ESC Quit.
+ 1 Toggle display list mode.
+ 2 Toggle color animation mode.
+
+copy - Pixel copy test.
+ - RGBA, SB/DB (SB default).
+ - cmd line options:
+ -sb Single buffer mode.
+ -db Double buffer mode.
+ -dr Direct render mode.
+ -ir Indirect render mode.
+ -f <file name> RGB image file.
+ - keys:
+ ESC Quit.
+ Z Increase zoom factor.
+ z Decrease zoom factor.
+ - mouse input:
+ Left Copy location.
+
+cursor - Cursor test.
+ - RGBA/CI (RGBA default), SB/DB (SB default).
+ - cmd line options:
+ -rgb RGBA mode.
+ -ci Color index mode.
+ -sb Single buffer mode.
+ -db Double buffer mode.
+ - keys:
+ ESC Quit.
+ SPACE switch cursor color.
+
+depth - Z buffer test.
+ - RGBA/CI (RGBA default), SB/DB (SB default).
+ - cmd line options:
+ -rgb RGBA mode.
+ -ci Color index mode.
+ -sb Single buffer mode.
+ -db Double buffer mode.
+ - keys:
+ ESC Quit.
+ 1 Toggle anti-aliased mode.
+ 2 Toggle stipple mode.
+
+eval - Evaluator test.
+ - RGBA, SB/DB (SB default).
+ - cmd line options:
+ -sb Single buffer mode.
+ -db Double buffer mode.
+ - keys:
+ ESC Quit.
+ LEFT Rotate.
+ RIGHT Rotate.
+ UP Rotate.
+ DOWN Rotate.
+ 1 Toggle dimensions.
+ 2 Toggle dimensions.
+ e Use eval mode.
+ m Use mesh mode.
+ f Toggle polygon mode.
+ p Toggle point mode.
+ c Toggle color mode.
+ t Toggle texture mode.
+ l Toggle lighting mode.
+
+fog - Fog test.
+ - RGBA/CI (RGBA default), SB/DB (SB default).
+ - cmd line options:
+ -rgb RGBA mode.
+ -ci Color index mode.
+ -sb Single buffer mode.
+ -db Double buffer mode.
+ - keys:
+ ESC Quit.
+ LEFT Rotate.
+ RIGHT Rotate.
+ UP Rotate.
+ DOWN Rotate.
+ D Increase fog density.
+ d Decrease fog density.
+
+font - font test.
+ - RGBA/CI (RGBA default), SB/DB (SB default).
+ - cmd line options:
+ -rgb RGBA mode.
+ -ci Color index mode.
+ -sb Single buffer mode.
+ -db Double buffer mode.
+ - keys:
+ ESC Quit.
+ Left Shift left.
+ Right Shift right.
+ Up Shift up.
+ Down Shift down.
+ n Shift in.
+ m Shift out.
+ q Scale up x.
+ w Scale down x.
+ a Scale up y.
+ s Scale down y.
+ z Scale up z.
+ x Scale down z.
+ e Rotate clockwise x.
+ r Rotate counter-clockwise x.
+ d Rotate clockwise y.
+ f Rotate counter-clockwise y.
+ c Rotate clockwise z.
+ v Rotate counter-clockwise z.
+
+line - Line test.
+ - RGBA/CI (RGBA default), SB/DB (SB default).
+ - cmd line options:
+ -rgb RGBA mode.
+ -ci Color index mode.
+ -sb Single buffer mode.
+ -db Double buffer mode.
+ - keys:
+ ESC Quit.
+ W Increase line width.
+ w Decrease line width.
+ 1 Toggle stipple mode.
+ 2 Toggle anti-aliased mode.
+
+logo - Demo.
+ - RGBA/CI (RGBA default), SB/DB (SB default).
+ - cmd line options:
+ -rgb RGBA mode.
+ -ci Color index mode.
+ -sb Single buffer mode.
+ -db Double buffer mode.
+ - keys:
+ ESC Quit.
+ LEFT Rotate.
+ RIGHT Rotate
+ UP Move clipping plane.
+ DOWN Move clipping plane.
+ Z Translate.
+ z Translate.
+ 1 Use GL_POINT polygon mode.
+ 2 Use GL_LINE polygon mode.
+ 3 Use GL_FILL polygon mode.
+ p Toggle polygon fill modes.
+ 4 Use GL_NICEST for GL_POLYGON_SMOOTH_HINT.
+ 5 Use anti-aliased polygon mode.
+ 6 Use aliased polygon mode.
+ 8 Toggle dither mode.
+ 9 Toggle stipple polygon mode.
+ 0 Toggle flat/smooth shading mode.
+ q Disable cull mode.
+ w Use front face cull mode.
+ e Use back face cull mode.
+ r Use clockwise front face mode.
+ t Use counter-clockwise front face mode.
+ y Use MSB first stipple pattern.
+ u Use LSB first stipple pattern.
+ a Use brick texture map.
+ s Use checker texture map.
+ d Disable texture map.
+ f Use decal texture environment mode.
+ g Use modulate texture environment mode.
+
+nurb - Nurb test.
+ - RGBA, SB/DB (SB default).
+ - cmd line options:
+ -sb Single buffer mode.
+ -db Double buffer mode.
+ - keys:
+ ESC Quit.
+ LEFT Rotate.
+ RIGHT Rotate.
+ UP Rotate.
+ DOWN Rotate.
+
+olympic - Olymipic rings demo.
+ - RGBA/CI (RGBA default), SB/DB (SB default).
+ - cmd line options:
+ -rgb RGBA mode.
+ -ci Color index mode.
+ -sb Single buffer mode.
+ -db Double buffer mode.
+ - keys:
+ ESC Quit.
+ SPACE Restart demo.
+
+overlay - Overlay plane demo.
+ - RGBA, SB/DB (SB default).
+ - cmd line options:
+ -sb Single buffer mode.
+ -db Double buffer mode.
+ - keys:
+ ESC Quit.
+ SPACE Toggle star weird movement mode.
+ t Toggle star turbo mode.
+
+point - Point test.
+ - RGBA/CI (RGBA default), SB/DB (SB default).
+ - cmd line options:
+ -rgb RGBA mode.
+ -ci Color index mode.
+ -sb Single buffer mode.
+ -db Double buffer mode.
+ - keys:
+ ESC Quit.
+ LEFT Translate.
+ RIGHT Translate.
+ UP Translate.
+ DOWN Translate.
+ W Increase point width.
+ w Decrease point width.
+ 1 Toggle anti-aliased mode.
+
+prim - Primitive test.
+ - RGBA/CI (RGBA default), SB/DB (SB default).
+ - cmd line options:
+ -rgb RGBA mode.
+ -ci Color index mode.
+ -sb Single buffer mode.
+ -db Double buffer mode.
+ - keys:
+ ESC Quit.
+ 1 Toggle flat/smooth shade mode.
+ 2 Toggle outlined/filled polygon mode.
+ 3 Toggle color mask mode.
+
+quad - Quadric test.
+ - RGBA/CI (RGBA default), SB/DB (SB default).
+ - cmd line options:
+ -rgb RGBA mode.
+ -ci Color index mode.
+ -sb Single buffer mode.
+ -db Double buffer mode.
+ -dr Direct render mode.
+ -ir Indirect render mode.
+ -f <file name> texture file.
+ - keys:
+ ESC Quit.
+ LEFT Rotate.
+ RIGHT Rotate.
+ UP Rotate.
+ DOWN Rotate.
+ X Rotate.
+ x Rotate.
+ 1 Use GLU_FILL draw style.
+ 2 Use GLU_POINT draw style.
+ 3 Use GLU_LINE draw style.
+ 4 Use GLU_SILHOUETTE draw style.
+ 0 Toggle flat/smooth shade mode.
+ f Cylce through quadrics.
+ d Toggle orientation.
+ A Increase number of stacks.
+ a Decrease number of stacks.
+ S Increase number of slices.
+ s Decrease number of slices.
+ G Increase radius1.
+ g Decrease radius1.
+ J Increase radius2.
+ j Decrease radius2.
+ H Increase height.
+ h Decrease height.
+ K Increase angle1.
+ k Decrease angle1.
+ L Increase angle2.
+ l Decrease angle2.
+ z Toggle texture mode.
+ q Disable cull mode.
+ w Use front face cull mode.
+ e Use back face cull mode.
+ r Use clockwise front face mode.
+ t Use counter-clockwise front face mode.
+ y Toggle dither mode.
+
+select - Selection test.
+ - RGBA, SB.
+ - cmd line options:
+ - keys:
+ ESC Quit.
+ LEFT Rotate.
+ RIGHT Rotate.
+ Z Increase zoom factor.
+ z Decrease zoom factor.
+ d Zoom at current mouse location.
+ f Print feedback information.
+ l Toggle outlined/filled polygon mode.
+ - mouse:
+ Left Recolor selected triangle.
+ Center Enlarge selected triangle.
+ Right Delete selected triangle.
+
+shape - shape test.
+ - RGBA/CI (RGBA default), SB/DB (SB default).
+ - cmd line options:
+ -rgb RGBA mode.
+ -ci Color index mode.
+ -sb Single buffer mode.
+ -db Double buffer mode.
+ - keys:
+ ESC Quit.
+ Left Shift left.
+ Right Shift right.
+ Up Shift up.
+ Down Shift down.
+ n Shift in.
+ m Shift out.
+ q Scale up x.
+ w Scale down x.
+ a Scale up y.
+ s Scale down y.
+ z Scale up z.
+ x Scale down z.
+ e Rotate clockwise x.
+ r Rotate counter-clockwise x.
+ d Rotate clockwise y.
+ f Rotate counter-clockwise y.
+ c Rotate clockwise z.
+ v Rotate counter-clockwise z.
+ SPACE switch shapes.
+
+speed - Speed test.
+ - RGBA/CI (RGBA default), SB/DB (SB default).
+ - cmd line options:
+ -rgb RGBA mode.
+ -ci Color index mode.
+ -sb Single buffer mode.
+ -db Double buffer mode.
+ - keys:
+ ESC Quit.
+ a Toggle anti-aliased mode.
+ d Toggle z buffering mode.
+ f Toggle fog mode.
+ F Toggle fog hint mode.
+ s Toggle flat/smooth shading mode.
+ t Toggle texturing mode.
+
+sphere - Spheremap test.
+ - RGBA, SB/DB (SB default).
+ - cmd line options:
+ -sb Single buffer mode.
+ -db Double buffer mode.
+ -dr Direct render mode.
+ -ir Indirect render mode.
+ -f <file name> texture file.
+ -3 Use RGB components.
+ -4 Use RGBA components.
+ - keys:
+ ESC Quit.
+ LEFT Rotate about the y axis.
+ RIGHT Rotate about the y axis.
+ UP Rotate about the x axis.
+ DOWN Rotate about the x axis.
+ a Toggle auto rotate mode.
+ c toggle between cylinder or cube object.
+ t Use torus object.
+ d Use decal texture mode.
+ m Use modulate texture mode.
+ l Toggle lighted mode.
+ f Toggle fog mode.
+ 0 Use nearest magification filter.
+ 1 Use linear magification.
+ 2 Use nearest minification filter.
+ 3 Use linear minification filter.
+ 4 Use nearest-mipmap-nearest minification filter.
+ 5 Use nearest-mipmap-linear minification filter.
+ 6 Use linear-mipmap-nearest minification filter.
+ 7 Use linear-mipmap-linear minification filter.
+
+star - Demo.
+ - RGBA, SB/DB (SB default).
+ - cmd line options:
+ -sb Single buffer mode.
+ -db Double buffer mode.
+ - keys:
+ ESC Quit.
+ SPACE Toggle weird movement mode.
+ t Toggle turbo mode.
+
+stencil - Stencil test.
+ - RGBA, SB.
+ - cmd line options:
+
+stretch - Texture test.
+ - RGBA, SB.
+ - cmd line options:
+ -sb Single buffer mode.
+ -db Double buffer mode.
+ -dr Direct render mode.
+ -ir Indirect render mode.
+ -f <file name> texture file.
+ - keys:
+ ESC Quit.
+ SPACE Start animation.
+ - mouse:
+ Left Added stretch point.
+
+texture - Texture test.
+ - RGBA, SB/DB (SB default).
+ - cmd line options:
+ -sb Single buffer mode.
+ -db Double buffer mode.
+ -dr Direct render mode.
+ -ir Indirect render mode.
+ -f <file name> texture file.
+ - keys:
+ ESC Quit.
+ LEFT Rotate.
+ RIGHT Rotate.
+ UP Rotate.
+ DOWN Rotate.
+ T Translate.
+ t Translate.
+ s Toggle sphere map mode.
+ 0 Use nearest magification filter.
+ 1 Use linear magification filter.
+ 2 Use nearest minification filter.
+ 3 Use linear minification filter.
+ 4 Use nearest-mipmap-nearest minification filter.
+ 5 Use nearest-mipmap-linear minification filter.
+ 6 Use linear-mipmap-nearest minification filter.
+ 7 Use linear-mipmap-linear minification filter.
+
+tri - Triangle test.
+ - RGBA/CI (RGBA default), SB/DB (SB default).
+ - cmd line options:
+ -rgb RGBA mode.
+ -ci Color index mode.
+ -sb Single buffer mode.
+ -db Double buffer mode.
+ - keys:
+ ESC Quit.
+ LEFT Translate.
+ RIGHT Translate.
+ Z Increase zoom factor.
+ z Decrease zoom factor.
+ 1 Use point polygon mode.
+ 2 Use line polygon mode.
+ 3 Use filled polygon mode.
+ 4 Use point primitive.
+ 5 Use line-loop primitive.
+ 6 Use polygon primitive.
+ 7 Toggle cull mode.
+ 8 Use clockwise/counter-clockwise front face mode.
+ 9 Toggle front/back face cull mode.
+ v Toggle show verticies mode.
+ s Toggle flat/smooth shade mode.
+ h Toggle hide bottom triangle mode.
+ o Toggle outline mode.
+ m Toggle dither mode.
+ 0 Toggle anti-aliased mode.
+
+wave - Demo.
+ - RGBA/CI (RGBA default), SB/DB (SB default).
+ - cmd line options:
+ -rgb RGBA mode.
+ -ci Color index mode.
+ -sb Single buffer mode.
+ -db Double buffer mode.
+ -dr Direct render mode.
+ -ir Indirect render mode.
+ -grid <x> <y> Number of grids.
+ -size <number> Size of grid.
+ -wave <number> Height of wave (floating point number).
+ -frames <count> Number of frames.
+ - keys:
+ ESC Quit.
+ c Toggle contouring mode.
+ s Toggle flat/smooth shade mode.
+ l Toggle lighting mode.
+ d Toggle depth checking mode.
+ SPACE Toggle step/animation mode.
+ n Single step in step mode.
+ a Toggle spin mode.
diff --git a/progs/samples/accum.c b/progs/samples/accum.c
new file mode 100644
index 00000000000..24dfc07d2a6
--- /dev/null
+++ b/progs/samples/accum.c
@@ -0,0 +1,157 @@
+/*
+ * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the name of
+ * Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF
+ * ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <GL/glut.h>
+
+
+GLenum doubleBuffer;
+GLint thing1, thing2;
+
+
+static void Init(void)
+{
+
+ glClearColor(0.0, 0.0, 0.0, 0.0);
+ glClearAccum(0.0, 0.0, 0.0, 0.0);
+
+ thing1 = glGenLists(1);
+ glNewList(thing1, GL_COMPILE);
+ glColor3f(1.0, 0.0, 0.0);
+ glRectf(-1.0, -1.0, 1.0, 0.0);
+ glEndList();
+
+ thing2 = glGenLists(1);
+ glNewList(thing2, GL_COMPILE);
+ glColor3f(0.0, 1.0, 0.0);
+ glRectf(0.0, -1.0, 1.0, 1.0);
+ glEndList();
+}
+
+static void Reshape(int width, int height)
+{
+
+ glViewport(0, 0, (GLint)width, (GLint)height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+}
+
+static void Key(unsigned char key, int x, int y)
+{
+ (void) x;
+ (void) y;
+ switch (key) {
+ case 27:
+ exit(1);
+ case '1':
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ break;
+ case '2':
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ break;
+ default:
+ return;
+ }
+
+ glutPostRedisplay();
+}
+
+static void Draw(void)
+{
+
+ glPushMatrix();
+
+ glScalef(0.8, 0.8, 1.0);
+
+ glClear(GL_COLOR_BUFFER_BIT);
+ glCallList(thing1);
+ glAccum(GL_LOAD, 0.5);
+
+ glClear(GL_COLOR_BUFFER_BIT);
+ glCallList(thing2);
+ glAccum(GL_ACCUM, 0.5);
+
+ glAccum(GL_RETURN, 1.0);
+
+ glPopMatrix();
+
+ glFlush();
+
+ if (doubleBuffer) {
+ glutSwapBuffers();
+ }
+}
+
+static GLenum Args(int argc, char **argv)
+{
+ GLint i;
+
+ doubleBuffer = GL_FALSE;
+
+ for (i = 1; i < argc; i++) {
+ if (strcmp(argv[i], "-sb") == 0) {
+ doubleBuffer = GL_FALSE;
+ } else if (strcmp(argv[i], "-db") == 0) {
+ doubleBuffer = GL_TRUE;
+ } else {
+ printf("%s (Bad option).\n", argv[i]);
+ return GL_FALSE;
+ }
+ }
+ return GL_TRUE;
+}
+
+int main(int argc, char **argv)
+{
+ GLenum type;
+
+ glutInit(&argc, argv);
+
+ if (Args(argc, argv) == GL_FALSE) {
+ exit(1);
+ }
+
+ glutInitWindowPosition(0, 0);
+ glutInitWindowSize( 300, 300);
+
+ type = GLUT_RGB | GLUT_ACCUM;
+ type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
+ glutInitDisplayMode(type);
+
+ if (glutCreateWindow("Accum Test") == GL_FALSE) {
+ exit(1);
+ }
+
+ Init();
+
+ glutReshapeFunc(Reshape);
+ glutKeyboardFunc(Key);
+ glutDisplayFunc(Draw);
+ glutMainLoop();
+ return 0;
+}
diff --git a/progs/samples/bitmap1.c b/progs/samples/bitmap1.c
new file mode 100644
index 00000000000..517d584e212
--- /dev/null
+++ b/progs/samples/bitmap1.c
@@ -0,0 +1,250 @@
+/*
+ * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the name of
+ * Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF
+ * ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <GL/glut.h>
+
+
+#define OPENGL_WIDTH 24
+#define OPENGL_HEIGHT 13
+
+
+GLenum rgb, doubleBuffer, windType;
+
+float boxA[3] = {
+ 0, 0, 0
+};
+float boxB[3] = {
+ -100, 0, 0
+};
+float boxC[3] = {
+ 100, 0, 0
+};
+float boxD[3] = {
+ 0, 95, 0
+};
+float boxE[3] = {
+ 0, -105, 0
+};
+GLubyte OpenGL_bits1[] = {
+ 0x00, 0x03, 0x00,
+ 0x7f, 0xfb, 0xff,
+ 0x7f, 0xfb, 0xff,
+ 0x00, 0x03, 0x00,
+ 0x3e, 0x8f, 0xb7,
+ 0x63, 0xdb, 0xb0,
+ 0x63, 0xdb, 0xb7,
+ 0x63, 0xdb, 0xb6,
+ 0x63, 0x8f, 0xf3,
+ 0x63, 0x00, 0x00,
+ 0x63, 0x00, 0x00,
+ 0x63, 0x00, 0x00,
+ 0x3e, 0x00, 0x00,
+};
+GLubyte OpenGL_bits2[] = {
+ 0x00, 0x00, 0x00,
+ 0xff, 0xff, 0x01,
+ 0xff, 0xff, 0x01,
+ 0x00, 0x00, 0x00,
+ 0xf9, 0xfc, 0x01,
+ 0x8d, 0x0d, 0x00,
+ 0x8d, 0x0d, 0x00,
+ 0x8d, 0x0d, 0x00,
+ 0xcc, 0x0d, 0x00,
+ 0x0c, 0x4c, 0x0a,
+ 0x0c, 0x4c, 0x0e,
+ 0x8c, 0xed, 0x0e,
+ 0xf8, 0x0c, 0x00,
+};
+GLubyte logo_bits[] = {
+ 0x00, 0x66, 0x66,
+ 0xff, 0x66, 0x66,
+ 0x00, 0x00, 0x00,
+ 0xff, 0x3c, 0x3c,
+ 0x00, 0x42, 0x40,
+ 0xff, 0x42, 0x40,
+ 0x00, 0x41, 0x40,
+ 0xff, 0x21, 0x20,
+ 0x00, 0x2f, 0x20,
+ 0xff, 0x20, 0x20,
+ 0x00, 0x10, 0x90,
+ 0xff, 0x10, 0x90,
+ 0x00, 0x0f, 0x10,
+ 0xff, 0x00, 0x00,
+ 0x00, 0x66, 0x66,
+ 0xff, 0x66, 0x66,
+};
+
+#include "tkmap.c"
+
+static void Init(void)
+{
+
+ glClearColor(0.0, 0.0, 0.0, 0.0);
+ glClearIndex(0.0);
+}
+
+static void Reshape(int width, int height)
+{
+
+ glViewport(0, 0, (GLint)width, (GLint)height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluOrtho2D(-175, 175, -175, 175);
+ glMatrixMode(GL_MODELVIEW);
+}
+
+static void Key(unsigned char key, int x, int y)
+{
+
+ switch (key) {
+ case 27:
+ exit(1);
+ }
+}
+
+static void Draw(void)
+{
+ float mapI[2], mapIA[2], mapIR[2];
+
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ mapI[0] = 0.0;
+ mapI[1] = 1.0;
+ mapIR[0] = 0.0;
+ mapIR[1] = 0.0;
+ mapIA[0] = 1.0;
+ mapIA[1] = 1.0;
+
+ glPixelMapfv(GL_PIXEL_MAP_I_TO_R, 2, mapIR);
+ glPixelMapfv(GL_PIXEL_MAP_I_TO_G, 2, mapI);
+ glPixelMapfv(GL_PIXEL_MAP_I_TO_B, 2, mapI);
+ glPixelMapfv(GL_PIXEL_MAP_I_TO_A, 2, mapIA);
+ glPixelTransferi(GL_MAP_COLOR, GL_TRUE);
+
+ SetColor(COLOR_WHITE);
+ glRasterPos3fv(boxA);
+ glPixelStorei(GL_UNPACK_ROW_LENGTH, 24);
+ glPixelStorei(GL_UNPACK_SKIP_PIXELS, 8);
+ glPixelStorei(GL_UNPACK_SKIP_ROWS, 2);
+ glPixelStorei(GL_UNPACK_LSB_FIRST, GL_FALSE);
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ glBitmap(16, 12, 8.0, 0.0, 0.0, 0.0, logo_bits);
+
+ glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
+ glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
+ glPixelStorei(GL_UNPACK_SKIP_ROWS, 0);
+ glPixelStorei(GL_UNPACK_LSB_FIRST, GL_TRUE);
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+
+ SetColor(COLOR_WHITE);
+ glRasterPos3fv(boxB);
+ glBitmap(OPENGL_WIDTH, OPENGL_HEIGHT, OPENGL_WIDTH, 0.0, OPENGL_WIDTH, 0.0,
+ OpenGL_bits1);
+ glBitmap(OPENGL_WIDTH, OPENGL_HEIGHT, OPENGL_WIDTH, 0.0, OPENGL_WIDTH, 0.0,
+ OpenGL_bits2);
+
+ SetColor(COLOR_YELLOW);
+ glRasterPos3fv(boxC);
+ glBitmap(OPENGL_WIDTH, OPENGL_HEIGHT, OPENGL_WIDTH, 0.0, OPENGL_WIDTH, 0.0,
+ OpenGL_bits1);
+ glBitmap(OPENGL_WIDTH, OPENGL_HEIGHT, OPENGL_WIDTH, 0.0, OPENGL_WIDTH, 0.0,
+ OpenGL_bits2);
+
+ SetColor(COLOR_CYAN);
+ glRasterPos3fv(boxD);
+ glBitmap(OPENGL_WIDTH, OPENGL_HEIGHT, OPENGL_WIDTH, 0.0, OPENGL_WIDTH, 0.0,
+ OpenGL_bits1);
+ glBitmap(OPENGL_WIDTH, OPENGL_HEIGHT, OPENGL_WIDTH, 0.0, OPENGL_WIDTH, 0.0,
+ OpenGL_bits2);
+
+ SetColor(COLOR_RED);
+ glRasterPos3fv(boxE);
+ glBitmap(OPENGL_WIDTH, OPENGL_HEIGHT, OPENGL_WIDTH, 0.0, OPENGL_WIDTH, 0.0,
+ OpenGL_bits1);
+ glBitmap(OPENGL_WIDTH, OPENGL_HEIGHT, OPENGL_WIDTH, 0.0, OPENGL_WIDTH, 0.0,
+ OpenGL_bits2);
+
+ glFlush();
+
+ if (doubleBuffer) {
+ glutSwapBuffers();
+ }
+}
+
+static GLenum Args(int argc, char **argv)
+{
+ GLint i;
+
+ rgb = GL_TRUE;
+ doubleBuffer = GL_FALSE;
+
+ for (i = 1; i < argc; i++) {
+ if (strcmp(argv[i], "-ci") == 0) {
+ rgb = GL_FALSE;
+ } else if (strcmp(argv[i], "-rgb") == 0) {
+ rgb = GL_TRUE;
+ } else if (strcmp(argv[i], "-sb") == 0) {
+ doubleBuffer = GL_FALSE;
+ } else if (strcmp(argv[i], "-db") == 0) {
+ doubleBuffer = GL_TRUE;
+ } else {
+ printf("%s (Bad option).\n", argv[i]);
+ return GL_FALSE;
+ }
+ }
+ return GL_TRUE;
+}
+
+int main(int argc, char **argv)
+{
+ glutInit(&argc, argv);
+
+ if (Args(argc, argv) == GL_FALSE) {
+ exit(1);
+ }
+
+ glutInitWindowPosition(0, 0); glutInitWindowSize( 300, 300);
+
+ windType = (rgb) ? GLUT_RGB : GLUT_INDEX;
+ windType |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
+ glutInitDisplayMode(windType);
+
+ if (glutCreateWindow("Bitmap Test") == GL_FALSE) {
+ exit(1);
+ }
+
+ InitMap();
+
+ Init();
+
+ glutReshapeFunc(Reshape);
+ glutKeyboardFunc(Key);
+ glutDisplayFunc(Draw);
+ glutMainLoop();
+ return 0;
+}
diff --git a/progs/samples/bitmap2.c b/progs/samples/bitmap2.c
new file mode 100644
index 00000000000..5faac841622
--- /dev/null
+++ b/progs/samples/bitmap2.c
@@ -0,0 +1,787 @@
+/*
+ * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the name of
+ * Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF
+ * ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <GL/glut.h>
+
+
+#define EXP_WIDTH 80
+#define EXP_HEIGHT 80
+
+
+GLenum rgb, doubleBuffer, windType;
+
+#include "tkmap.c"
+
+GLenum useLists, abuse;
+GLubyte exp_bits[7][800] = {
+ {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x81, 0x04, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf2, 0x1f, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xbe, 0x7c, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf6, 0x4f, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xde, 0x7d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xea, 0xef, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0x55, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xdd, 0xfd, 0x03, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xbf, 0xae, 0x22, 0x36, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xdb, 0xf7, 0x3f, 0x1e, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x80, 0x50, 0xbf, 0xbf, 0x85, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xe5, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xee, 0x7e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x74, 0x4b, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xe8, 0x3e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xf8, 0x49, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x54, 0x07, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x04, 0x80, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ },
+ {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc0, 0x70, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x78, 0x91, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x60, 0xf1, 0x53, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x40, 0x97, 0x5c, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xa0, 0x0c, 0x8c, 0x1b, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xc4, 0x01, 0x00, 0xc8, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x88, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x60, 0x00, 0x02, 0x40, 0x02, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x70, 0x00, 0x0c, 0x40, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x70, 0xe0, 0x0d, 0x00, 0x04, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x72, 0xc8, 0x07, 0x40, 0x08, 0x00, 0x00,
+ 0x00, 0x00, 0x80, 0x02, 0x78, 0x2f, 0x40, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x40, 0x02, 0xb0, 0x0a, 0x20, 0x77, 0x00, 0x00,
+ 0x00, 0x00, 0x40, 0x13, 0x10, 0x33, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xc0, 0x02, 0x78, 0xbb, 0x81, 0x09, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x02, 0xdc, 0xe7, 0x00, 0x09, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xac, 0x78, 0x00, 0x31, 0x00, 0x00,
+ 0x00, 0x00, 0x40, 0x03, 0x74, 0x4b, 0x00, 0x03, 0x00, 0x00,
+ 0x00, 0x00, 0x80, 0x02, 0xe8, 0x3e, 0x00, 0x01, 0x10, 0x00,
+ 0x00, 0x00, 0x80, 0x00, 0xf8, 0x49, 0x80, 0x09, 0x1c, 0x00,
+ 0x00, 0x00, 0x00, 0x0c, 0x40, 0x07, 0x00, 0x05, 0x1c, 0x00,
+ 0x00, 0x00, 0x80, 0x09, 0x04, 0x80, 0x00, 0x02, 0x00, 0x00,
+ 0x00, 0x00, 0x80, 0x11, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
+ 0x00, 0x00, 0x80, 0x1d, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x80, 0xe3, 0x0b, 0x00, 0x22, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x80, 0x8f, 0x10, 0x00, 0xa0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x80, 0x4f, 0x20, 0x78, 0x60, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x80, 0x80, 0x79, 0x18, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x78, 0x7c, 0x05, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x03, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ },
+ {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x02, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x18, 0xc0, 0x04, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x84, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x80, 0x60, 0x06, 0x0c, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x80, 0x07, 0x64, 0x3a, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x20, 0x00, 0x08, 0x72, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x80, 0x3b, 0x00, 0x00, 0xc0, 0x33, 0x00, 0x00,
+ 0x00, 0x00, 0xa0, 0x1b, 0x00, 0x00, 0x80, 0x42, 0x00, 0x00,
+ 0x00, 0x00, 0xd0, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00,
+ 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00,
+ 0x00, 0x00, 0x6a, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00,
+ 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x50, 0x02, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
+ 0x00, 0x80, 0x07, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00,
+ 0x00, 0x30, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00,
+ 0x00, 0x80, 0x03, 0x03, 0x80, 0x00, 0x00, 0x00, 0x08, 0x00,
+ 0x00, 0xe2, 0x82, 0x03, 0x00, 0x20, 0x00, 0x00, 0x40, 0x00,
+ 0x00, 0x0e, 0x80, 0x03, 0x00, 0x4c, 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x0e, 0x80, 0x03, 0xec, 0x10, 0x00, 0x00, 0x60, 0x00,
+ 0x00, 0x12, 0x00, 0x00, 0x05, 0x93, 0x01, 0x00, 0x20, 0x00,
+ 0x00, 0x12, 0x00, 0x00, 0x00, 0x5c, 0x0c, 0x00, 0x60, 0x00,
+ 0x00, 0x30, 0x00, 0xc0, 0x05, 0x81, 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x2c, 0x00, 0x00, 0xcc, 0x06, 0x00, 0x00, 0x20, 0x00,
+ 0x00, 0x30, 0x00, 0x00, 0x28, 0x20, 0x02, 0x00, 0x00, 0x00,
+ 0x00, 0x30, 0x80, 0x80, 0x22, 0x00, 0x02, 0x00, 0x00, 0x02,
+ 0x00, 0x20, 0x00, 0x80, 0x02, 0x20, 0x08, 0x00, 0x20, 0x02,
+ 0x00, 0x38, 0x00, 0x00, 0x00, 0x11, 0x28, 0x00, 0x20, 0x06,
+ 0x00, 0x20, 0x00, 0x80, 0x0e, 0xc0, 0x21, 0x00, 0x5c, 0x00,
+ 0x00, 0x24, 0x00, 0x90, 0x40, 0x58, 0x04, 0x00, 0x20, 0x01,
+ 0x00, 0x24, 0x00, 0x10, 0x22, 0x02, 0x05, 0x00, 0x20, 0x02,
+ 0x00, 0x00, 0x00, 0x00, 0x28, 0xb6, 0x00, 0x00, 0x20, 0x01,
+ 0x00, 0x70, 0x00, 0x00, 0x18, 0xc1, 0x00, 0x00, 0xc0, 0x01,
+ 0x00, 0xc0, 0x00, 0x00, 0x40, 0x83, 0x04, 0x00, 0xc0, 0x01,
+ 0x00, 0x00, 0x01, 0x80, 0xfc, 0x41, 0x02, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x03, 0x30, 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x10, 0x02, 0x00, 0x40, 0x1d, 0x00, 0x00, 0x20, 0x00,
+ 0x00, 0x30, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x20, 0x00,
+ 0x00, 0x00, 0x04, 0x00, 0x60, 0x00, 0x00, 0x00, 0x20, 0x00,
+ 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00,
+ 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01,
+ 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+ 0x00, 0x00, 0x38, 0x00, 0x81, 0x0f, 0x00, 0x00, 0x2a, 0x00,
+ 0x00, 0x00, 0xf8, 0x02, 0x80, 0x0f, 0x00, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0xf8, 0x02, 0x80, 0x0f, 0x00, 0x00, 0x08, 0x00,
+ 0x00, 0x00, 0x00, 0x06, 0xc0, 0x01, 0x00, 0x00, 0x07, 0x00,
+ 0x00, 0x00, 0x00, 0x14, 0xe0, 0x00, 0x00, 0x80, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x08, 0x70, 0x00, 0x00, 0x85, 0x00, 0x00,
+ 0x00, 0x00, 0xc0, 0x00, 0x30, 0x00, 0x20, 0x3c, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xe0, 0xe0, 0x80, 0x00, 0x0b, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xe0, 0x79, 0x83, 0x80, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x19, 0x22, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xf4, 0x28, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ },
+ {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x04, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x80, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
+ 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
+ 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x00, 0x00,
+ 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xe0, 0x03, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
+ 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0x00, 0x00, 0x00, 0x02, 0x90, 0x00, 0x00, 0x00, 0x40,
+ 0x02, 0x02, 0x00, 0x80, 0x80, 0x00, 0x02, 0x00, 0x00, 0x00,
+ 0x40, 0x00, 0x00, 0x40, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x20, 0x00, 0x04, 0x02, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x30, 0x28, 0x90, 0x05, 0x00, 0x00, 0x40,
+ 0x00, 0x00, 0x00, 0x48, 0x05, 0x00, 0x21, 0x00, 0x00, 0x0c,
+ 0x00, 0x00, 0x00, 0x84, 0x00, 0x54, 0x05, 0x00, 0x00, 0x00,
+ 0x04, 0x00, 0x00, 0x40, 0x05, 0x80, 0x41, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x0e, 0x02, 0x01, 0x00, 0x00, 0x20,
+ 0x00, 0x00, 0x00, 0x08, 0x20, 0x20, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x84, 0x82, 0x00, 0x03, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x48, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x40,
+ 0x04, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x21, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x90, 0x40, 0x40, 0x04, 0x00, 0x00, 0x80,
+ 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x41, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x08, 0x40, 0xa0, 0x00, 0x00, 0x00, 0x50,
+ 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x40,
+ 0x40, 0x00, 0x00, 0x00, 0x40, 0x02, 0x04, 0x00, 0x00, 0x30,
+ 0x00, 0x00, 0x00, 0x80, 0x84, 0x00, 0x02, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0xc2, 0x20, 0x20, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10, 0xc0, 0x05, 0x20, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x20, 0x04, 0x00, 0x02, 0x00, 0x00, 0x10,
+ 0x08, 0x00, 0x00, 0x80, 0x00, 0x10, 0x10, 0x00, 0x00, 0x08,
+ 0x10, 0x02, 0x00, 0x00, 0x21, 0x04, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x18, 0x08, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x08, 0x10, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x3a, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x40, 0x04,
+ 0x00, 0x60, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x04,
+ 0x00, 0xb8, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00,
+ 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x40, 0x00, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ },
+ {
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00,
+ 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x08, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x1f, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x80, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x40, 0x00, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00,
+ 0x00, 0x00, 0x60, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x08, 0x01, 0x00, 0x01, 0x10, 0x04, 0x00, 0x00,
+ 0x00, 0x40, 0x00, 0x02, 0x02, 0x90, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x03, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x1c, 0x20, 0x05, 0x00, 0x04, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x14, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x20, 0x40, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0xc4, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x40, 0x00, 0x02, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x10, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x80, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x80, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00,
+ 0x00, 0x00, 0x42, 0x00, 0x00, 0x04, 0x20, 0x01, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x20, 0x05, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x02, 0x00, 0x81, 0x07, 0x01, 0x03, 0x00, 0x00,
+ 0x00, 0x00, 0x40, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x20, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x08, 0x02, 0x80, 0x20, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x80, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x80, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x80, 0x00, 0x00, 0x40, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
+ 0xc0, 0x00, 0x00, 0x80, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x40, 0x0d, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ },
+ {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x07, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x1f, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
+ 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x10, 0x00, 0x00, 0x04, 0x00, 0x00, 0x20, 0x00,
+ 0x02, 0x02, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xc0, 0x00, 0x40, 0x00, 0x02, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x40, 0x00,
+ 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x01,
+ 0x00, 0x04, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
+ 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00,
+ 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x80, 0x06, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x04, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x02, 0x20, 0x00, 0x00,
+ 0x08, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00
+ },
+ {
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x04, 0x00, 0x00, 0x80, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00,
+ 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00,
+ 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
+ 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ }
+};
+GLint exp_lists[7];
+
+
+static void Init(void)
+{
+ GLint i;
+
+ glClearColor(0.0, 0.0, 0.0, 0.0);
+ glClearIndex(0.0);
+
+ glPixelStorei(GL_UNPACK_LSB_FIRST, GL_TRUE);
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ for (i = 0; i < 7; i++) {
+ exp_lists[i] = glGenLists(1);
+ glNewList(exp_lists[i], GL_COMPILE);
+ glBitmap(80, 80, 40.0, 40.0, 0.0, 0.0, exp_bits[i]);
+ glEndList();
+ }
+
+ abuse = GL_FALSE;
+ useLists = GL_TRUE;
+}
+
+static void Reshape(int width, int height)
+{
+
+ glViewport(0, 0, (GLint)width, (GLint)height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluOrtho2D(-175, 175, -175, 175);
+ glMatrixMode(GL_MODELVIEW);
+}
+
+static void Key(unsigned char key, int x, int y)
+{
+
+ switch (key) {
+ case 27:
+ exit(1);
+ case '1':
+ useLists = !useLists;
+ break;
+ case '2':
+ abuse = !abuse;
+ break;
+ default:
+ return;
+ }
+
+ glutPostRedisplay();
+}
+
+static void Draw(void)
+{
+ GLint i, j;
+
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ for (i = 0; i < 7; i++) {
+ for (j = 0; j < 40; j++) {
+ switch (j % 7) {
+ case 0:
+ SetColor(COLOR_YELLOW);
+ break;
+ case 1:
+ SetColor(COLOR_GREEN);
+ break;
+ case 2:
+ SetColor(COLOR_BLUE);
+ break;
+ case 3:
+ SetColor(COLOR_MAGENTA);
+ break;
+ case 4:
+ SetColor(COLOR_CYAN);
+ break;
+ case 5:
+ SetColor(COLOR_WHITE);
+ break;
+ case 6:
+ SetColor(COLOR_RED);
+ break;
+ }
+ glRasterPos3i((j*3)%5, (j*3)%8, 0);
+
+ if (useLists) {
+ glCallList(exp_lists[i]);
+ } else {
+ glBitmap(80, 80, 40.0, 40.0, 0.0, 0.0, exp_bits[i]);
+ }
+ if (!abuse) {
+ break;
+ }
+ }
+
+ if (i == 6) {
+ break;
+ }
+
+ for (j = 0; j < 40; j++) {
+ SetColor(COLOR_BLACK);
+ glRasterPos3i((j*3)%5, (j*3)%8, 0);
+ if (useLists) {
+ glCallList(exp_lists[i]);
+ } else {
+ glBitmap(80, 80, 40.0, 40.0, 0.0, 0.0, exp_bits[i]);
+ }
+ if (!abuse) {
+ break;
+ }
+ }
+ }
+
+ glFlush();
+
+ if (doubleBuffer) {
+ glutSwapBuffers();
+ }
+}
+
+static GLenum Args(int argc, char **argv)
+{
+ GLint i;
+
+ rgb = GL_TRUE;
+ doubleBuffer = GL_FALSE;
+
+ for (i = 1; i < argc; i++) {
+ if (strcmp(argv[i], "-ci") == 0) {
+ rgb = GL_FALSE;
+ } else if (strcmp(argv[i], "-rgb") == 0) {
+ rgb = GL_TRUE;
+ } else if (strcmp(argv[i], "-sb") == 0) {
+ doubleBuffer = GL_FALSE;
+ } else if (strcmp(argv[i], "-db") == 0) {
+ doubleBuffer = GL_TRUE;
+ } else {
+ printf("%s (Bad option).\n", argv[i]);
+ return GL_FALSE;
+ }
+ }
+ return GL_TRUE;
+}
+
+int main(int argc, char **argv)
+{
+ glutInit(&argc, argv);
+
+ if (Args(argc, argv) == GL_FALSE) {
+ exit(1);
+ }
+
+ glutInitWindowPosition(0, 0); glutInitWindowSize( 300, 300);
+
+ windType = (rgb) ? GLUT_RGB : GLUT_INDEX;
+ windType |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
+ glutInitDisplayMode(windType);
+
+ if (glutCreateWindow("Bitmap Test") == GL_FALSE) {
+ exit(1);
+ }
+
+ InitMap();
+
+ Init();
+
+ glutReshapeFunc(Reshape);
+ glutKeyboardFunc(Key);
+ glutDisplayFunc(Draw);
+ glutMainLoop();
+ return 0;
+}
diff --git a/progs/samples/blendeq.c b/progs/samples/blendeq.c
new file mode 100644
index 00000000000..f78afd30381
--- /dev/null
+++ b/progs/samples/blendeq.c
@@ -0,0 +1,319 @@
+/*
+** blendeq.c - Demonstrates the use of the blend_minmax, blend_subtract,
+** and blend_logic_op extensions using glBlendEquationEXT.
+**
+** Over a two-color backround, draw rectangles using twelve blend
+** options. The values are read back as UNSIGNED_BYTE and printed
+** in hex over each value. These values are useful for logic
+** op comparisons when channels are 8 bits deep.
+*/
+
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#ifdef _WIN32
+#include <windows.h>
+#endif
+#define GL_GLEXT_PROTOTYPES
+#include <GL/glut.h>
+
+GLenum doubleBuffer;
+static int dithering = 0;
+int use11ops = 0;
+int supportlogops = 0;
+static int doPrint = 1;
+static int deltaY;
+GLint windW, windH;
+
+static void DrawString(const char *string)
+{
+ int i;
+
+ for (i = 0; string[i]; i++)
+ glutBitmapCharacter(GLUT_BITMAP_9_BY_15, string[i]);
+}
+
+static void Init(void)
+{
+
+ glDisable(GL_DITHER);
+ glShadeModel(GL_FLAT);
+}
+
+static void Reshape(int width, int height)
+{
+
+ windW = (GLint)width;
+ windH = (GLint)height;
+
+ glViewport(0, 0, (GLint)width, (GLint)height);
+ deltaY = windH /16;
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluOrtho2D(0, windW, 0, windH);
+ glMatrixMode(GL_MODELVIEW);
+}
+
+static void Key(unsigned char key, int x, int y)
+{
+
+ switch (key) {
+ case 27:
+ exit(1);
+ case 'd':
+ dithering = !dithering;
+ break;
+ case 'l':
+ if (supportlogops == 3)
+ use11ops = (!use11ops);
+ if (use11ops)
+ printf("Using GL 1.1 color logic ops.\n");
+ else printf("Using GL_EXT_blend_logic_op.\n");
+ break;
+ default:
+ return;
+ }
+
+ glutPostRedisplay();
+}
+
+static void PrintColorStrings( void )
+{
+ GLubyte ubbuf[3];
+ int i, xleft, xright;
+ char colorString[18];
+
+ xleft = 5 + windW/4;
+ xright = 5 + windW/2;
+
+ for (i = windH - deltaY + 4; i > 0; i-=deltaY) {
+ glReadPixels(xleft, i+10, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, ubbuf);
+ sprintf(colorString, "(0x%x, 0x%x, 0x%x)",
+ ubbuf[0], ubbuf[1], ubbuf[2]);
+ glRasterPos2f(xleft, i);
+ DrawString(colorString);
+ glReadPixels(xright, i+10, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, ubbuf);
+ sprintf(colorString, "(0x%x, 0x%x, 0x%x)",
+ ubbuf[0], ubbuf[1], ubbuf[2]);
+ glRasterPos2f(xright, i);
+ DrawString(colorString);
+ }
+}
+
+static void Draw(void)
+{
+ int stringOffset = 5, stringx = 8;
+ int x1, x2, xleft, xright;
+ int i;
+
+ (dithering) ? glEnable(GL_DITHER) : glDisable(GL_DITHER);
+ glDisable(GL_BLEND);
+ if (supportlogops & 2)
+ glDisable(GL_COLOR_LOGIC_OP);
+
+ glClearColor(0.5, 0.6, 0.1, 1.0);
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ /* Draw background */
+ glColor3f(0.1, 0.1, 1.0);
+ glRectf(0.0, 0.0, windW/2, windH);
+
+ /* Draw labels */
+ glColor3f(0.8, 0.8, 0.0);
+ i = windH - deltaY + stringOffset;
+ glRasterPos2f(stringx, i); i -= deltaY;
+ DrawString("SOURCE");
+ glRasterPos2f(stringx, i); i -= deltaY;
+ DrawString("DEST");
+ glRasterPos2f(stringx, i); i -= deltaY;
+ DrawString("min");
+ glRasterPos2f(stringx, i); i -= deltaY;
+ DrawString("max");
+ glRasterPos2f(stringx, i); i -= deltaY;
+ DrawString("subtract");
+ glRasterPos2f(stringx, i); i -= deltaY;
+ DrawString("reverse_subtract");
+ glRasterPos2f(stringx, i); i -= deltaY;
+ DrawString("clear");
+ glRasterPos2f(stringx, i); i -= deltaY;
+ DrawString("set");
+ glRasterPos2f(stringx, i); i -= deltaY;
+ DrawString("copy");
+ glRasterPos2f(stringx, i); i -= deltaY;
+ DrawString("noop");
+ glRasterPos2f(stringx, i); i -= deltaY;
+ DrawString("and");
+ glRasterPos2f(stringx, i); i -= deltaY;
+ DrawString("invert");
+ glRasterPos2f(stringx, i); i -= deltaY;
+ DrawString("or");
+ glRasterPos2f(stringx, i); i -= deltaY;
+ DrawString("xor");
+
+
+ i = windH - deltaY;
+ x1 = windW/4;
+ x2 = 3 * windW/4;
+ xleft = 5 + windW/4;
+ xright = 5 + windW/2;
+
+ /* Draw foreground color for comparison */
+ glColor3f(0.9, 0.2, 0.8);
+ glRectf(x1, i, x2, i+deltaY);
+
+ /* Leave one rectangle of background color */
+
+ /* Begin test cases */
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_ONE, GL_ONE);
+
+ i -= 2*deltaY;
+ glBlendEquationEXT(GL_MIN_EXT);
+ glRectf(x1, i, x2, i+deltaY);
+
+ i -= deltaY;
+ glBlendEquationEXT(GL_MAX_EXT);
+ glRectf(x1, i, x2, i+deltaY);
+
+ i -= deltaY;
+ glBlendEquationEXT(GL_FUNC_SUBTRACT_EXT);
+ glRectf(x1, i, x2, i+deltaY);
+
+ i -= deltaY;
+ glBlendEquationEXT(GL_FUNC_REVERSE_SUBTRACT_EXT);
+ glRectf(x1, i, x2, i+deltaY);
+
+ glBlendFunc(GL_ONE, GL_ZERO);
+ i -= deltaY;
+ if (!use11ops)
+ glBlendEquationEXT(GL_LOGIC_OP);
+ else
+ glEnable(GL_COLOR_LOGIC_OP);
+ glLogicOp(GL_CLEAR);
+ glRectf(x1, i, x2, i+deltaY);
+
+ i -= deltaY;
+ glLogicOp(GL_SET);
+ glRectf(x1, i, x2, i+deltaY);
+
+ i -= deltaY;
+ glLogicOp(GL_COPY);
+ glRectf(x1, i, x2, i+deltaY);
+
+ i -= deltaY;
+ glLogicOp(GL_NOOP);
+ glRectf(x1, i, x2, i+deltaY);
+
+ i -= deltaY;
+ glLogicOp(GL_AND);
+ glRectf(x1, i, x2, i+deltaY);
+
+ i -= deltaY;
+ glLogicOp(GL_INVERT);
+ glRectf(x1, i, x2, i+deltaY);
+
+ i -= deltaY;
+ glLogicOp(GL_OR);
+ glRectf(x1, i, x2, i+deltaY);
+
+ i -= deltaY;
+ glLogicOp(GL_XOR);
+ glRectf(x1, i, x2, i+deltaY);
+ glRectf(x1, i+10, x2, i+5);
+
+ if (doPrint) {
+ glDisable(GL_BLEND);
+ if (supportlogops & 2)
+ glDisable(GL_COLOR_LOGIC_OP);
+ glColor3f(1.0, 1.0, 1.0);
+ PrintColorStrings();
+ }
+ glFlush();
+
+ if (doubleBuffer) {
+ glutSwapBuffers();
+ }
+
+}
+
+static GLenum Args(int argc, char **argv)
+{
+ GLint i;
+
+ doubleBuffer = GL_FALSE;
+
+ for (i = 1; i < argc; i++) {
+ if (strcmp(argv[i], "-sb") == 0) {
+ doubleBuffer = GL_FALSE;
+ } else if (strcmp(argv[i], "-db") == 0) {
+ doubleBuffer = GL_TRUE;
+ } else {
+ printf("%s (Bad option).\n", argv[i]);
+ return GL_FALSE;
+ }
+ }
+ return GL_TRUE;
+}
+
+int main(int argc, char **argv)
+{
+ GLenum type;
+ char *s;
+ char *extName1 = "GL_EXT_blend_logic_op";
+ char *extName2 = "GL_EXT_blend_minmax";
+ char *extName3 = "GL_EXT_blend_subtract";
+ char *version;
+
+ glutInit(&argc, argv);
+
+ if (Args(argc, argv) == GL_FALSE) {
+ exit(1);
+ }
+
+ glutInitWindowPosition(0, 0); glutInitWindowSize( 800, 400);
+
+ type = GLUT_RGB;
+ type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
+ glutInitDisplayMode(type);
+
+ if (glutCreateWindow("Blend Equation") == GL_FALSE) {
+ exit(1);
+ }
+
+ /* Make sure blend_logic_op extension is there. */
+ s = (char *) glGetString(GL_EXTENSIONS);
+ version = (char*) glGetString(GL_VERSION);
+ if (!s)
+ exit(1);
+ if (strstr(s,extName1)) {
+ supportlogops = 1;
+ use11ops = 0;
+ printf("blend_logic_op extension available.\n");
+ }
+ if (strncmp(version,"1.1",3)>=0) {
+ supportlogops += 2;
+ use11ops = 1;
+ printf("1.1 color logic ops available.\n");
+ }
+ if (supportlogops == 0) {
+ printf("Blend_logic_op extension and GL 1.1 not present.\n");
+ exit(1);
+ }
+ if (strstr(s,extName2) == 0) {
+ printf("Blend_minmax extension is not present.\n");
+ exit(1);
+ }
+ if (strstr(s,extName3) == 0) {
+ printf("Blend_subtract extension is not present.\n");
+ exit(1);
+ }
+
+ Init();
+
+ glutReshapeFunc(Reshape);
+ glutKeyboardFunc(Key);
+ glutDisplayFunc(Draw);
+ glutMainLoop();
+ return 0;
+}
diff --git a/progs/samples/blendxor.c b/progs/samples/blendxor.c
new file mode 100644
index 00000000000..5bc4aa9bea4
--- /dev/null
+++ b/progs/samples/blendxor.c
@@ -0,0 +1,206 @@
+/*
+** blendxor.c - Demonstrates the use of the blend_logic_op
+** extension to draw hilights. Using XOR to draw the same
+** image twice restores the background to its original value.
+*/
+
+#include <stdio.h>
+#include <string.h>
+#ifndef _WIN32
+#include <unistd.h>
+#endif
+#include <stdlib.h>
+#ifdef _WIN32
+#include <windows.h>
+#endif
+#define GL_GLEXT_LEGACY
+#define GL_GLEXT_PROTOTYPES
+#include <GL/glut.h>
+#include <GL/glext.h>
+
+
+GLenum doubleBuffer;
+int dithering = 0;
+int use11ops = 0;
+int supportlogops = 0;
+GLint windW, windH;
+
+static void Init(void)
+{
+ glDisable(GL_DITHER);
+ glShadeModel(GL_FLAT);
+}
+
+static void Reshape(int width, int height)
+{
+
+ windW = (GLint)width;
+ windH = (GLint)height;
+
+ glViewport(0, 0, (GLint)width, (GLint)height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluOrtho2D(0, 400, 0, 400);
+ glMatrixMode(GL_MODELVIEW);
+}
+
+static void Key(unsigned char key, int x, int y)
+{
+
+ switch (key) {
+ case 27:
+ exit(1);
+ case 'd':
+ dithering = !dithering;
+ break;
+ case 'l':
+ if (supportlogops == 3)
+ use11ops = (!use11ops);
+ if (use11ops)
+ printf("Using GL 1.1 color logic ops.\n");
+ else printf("Using GL_EXT_blend_logic_op.\n");
+ break;
+ default:
+ return;
+ }
+
+ glutPostRedisplay();
+}
+
+static void Draw(void)
+{
+ int i;
+
+ glDisable(GL_BLEND);
+ if (supportlogops & 2)
+ glDisable(GL_COLOR_LOGIC_OP);
+
+ (dithering) ? glEnable(GL_DITHER) : glDisable(GL_DITHER);
+
+ glClearColor(0.5, 0.6, 0.1, 1.0);
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ /* Draw background prims */
+ glColor3f(0.1, 0.1, 1.0);
+ glBegin(GL_TRIANGLES);
+ glVertex2i(5, 5);
+ glVertex2i(130, 50);
+ glVertex2i(100, 300);
+ glEnd();
+ glColor3f(0.5, 0.2, 0.9);
+ glBegin(GL_TRIANGLES);
+ glVertex2i(200, 100);
+ glVertex2i(330, 50);
+ glVertex2i(340, 400);
+ glEnd();
+
+ glEnable(GL_BLEND);
+ if (!use11ops)
+ glBlendEquationEXT(GL_LOGIC_OP);
+ else
+ glEnable(GL_COLOR_LOGIC_OP);
+ glLogicOp(GL_XOR);
+
+ /* Draw a set of rectangles across the window */
+ glColor3f(0.9, 0.2, 0.8);
+ for(i = 0; i < 400; i+=60) {
+ glBegin(GL_POLYGON);
+ glVertex2i(i, 100);
+ glVertex2i(i+50, 100);
+ glVertex2i(i+50, 200);
+ glVertex2i(i, 200);
+ glEnd();
+ }
+ glFlush(); /* Added by Brian Paul */
+#ifndef _WIN32
+ sleep(2);
+#endif
+
+ /* Redraw the rectangles, which should erase them */
+ for(i = 0; i < 400; i+=60) {
+ glBegin(GL_POLYGON);
+ glVertex2i(i, 100);
+ glVertex2i(i+50, 100);
+ glVertex2i(i+50, 200);
+ glVertex2i(i, 200);
+ glEnd();
+ }
+ glFlush();
+
+
+ if (doubleBuffer) {
+ glutSwapBuffers();
+ }
+}
+
+static GLenum Args(int argc, char **argv)
+{
+ GLint i;
+
+ doubleBuffer = GL_FALSE;
+
+ for (i = 1; i < argc; i++) {
+ if (strcmp(argv[i], "-sb") == 0) {
+ doubleBuffer = GL_FALSE;
+ } else if (strcmp(argv[i], "-db") == 0) {
+ doubleBuffer = GL_TRUE;
+ } else {
+ printf("%s (Bad option).\n", argv[i]);
+ return GL_FALSE;
+ }
+ }
+ return GL_TRUE;
+}
+
+int main(int argc, char **argv)
+{
+ GLenum type;
+ char *s;
+ char *extName = "GL_EXT_blend_logic_op";
+ char *version;
+
+ glutInit(&argc, argv);
+
+ if (Args(argc, argv) == GL_FALSE) {
+ exit(1);
+ }
+
+ glutInitWindowPosition(0, 0); glutInitWindowSize( 400, 400);
+
+ type = GLUT_RGB;
+ type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
+ glutInitDisplayMode(type);
+
+ if (glutCreateWindow("Blend XOR") == GL_FALSE) {
+ exit(1);
+ }
+
+ /* Make sure blend_logic_op extension is there. */
+ s = (char *) glGetString(GL_EXTENSIONS);
+ version = (char*) glGetString(GL_VERSION);
+ if (!s)
+ exit(1);
+ if (strstr(s,extName)) {
+ supportlogops = 1;
+ use11ops = 0;
+ printf("blend_logic_op extension available.\n");
+ }
+ if (strncmp(version,"1.1",3)>=0) {
+ supportlogops += 2;
+ use11ops = 1;
+ printf("1.1 color logic ops available.\n");
+ }
+ if (supportlogops == 0) {
+ printf("Blend_logic_op extension and GL 1.1 not present.\n");
+ exit(1);
+ }
+
+ Init();
+
+ glutReshapeFunc(Reshape);
+ glutKeyboardFunc(Key);
+ glutDisplayFunc(Draw);
+ glutMainLoop();
+ return 0;
+}
diff --git a/progs/samples/copy.c b/progs/samples/copy.c
new file mode 100644
index 00000000000..391c637d6fa
--- /dev/null
+++ b/progs/samples/copy.c
@@ -0,0 +1,193 @@
+/*
+ * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the name of
+ * Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF
+ * ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <GL/glut.h>
+
+
+#include "loadppm.c"
+
+GLenum doubleBuffer;
+GLint windW, windH;
+
+char *fileName = 0;
+PPMImage *image;
+float point[3];
+float zoom;
+GLint x, y;
+
+static void Init(void)
+{
+
+ glClearColor(0.0, 0.0, 0.0, 0.0);
+
+ x = 0;
+ y = windH;
+ zoom = 1.8;
+}
+
+static void Reshape(int width, int height)
+{
+
+ windW = (GLint)width;
+ windH = (GLint)height;
+
+ glViewport(0, 0, windW, windH);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluOrtho2D(0, windW, 0, windH);
+ glMatrixMode(GL_MODELVIEW);
+}
+
+static void Key(unsigned char key, int x, int y)
+{
+
+ switch (key) {
+ case 27:
+ exit(1);
+ case 'Z':
+ zoom += 0.2;
+ break;
+ case 'z':
+ zoom -= 0.2;
+ if (zoom < 0.2) {
+ zoom = 0.2;
+ }
+ break;
+ default:
+ return;
+ }
+
+ glutPostRedisplay();
+}
+
+static void Mouse(int button, int state, int mouseX, int mouseY)
+{
+ if (state != GLUT_DOWN)
+ return;
+ x = (GLint)mouseX;
+ y = (GLint)mouseY;
+
+ glutPostRedisplay();
+}
+
+static void Draw(void)
+{
+
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ point[0] = (windW / 2) - (image->sizeX / 2);
+ point[1] = (windH / 2) - (image->sizeY / 2);
+ point[2] = 0;
+ glRasterPos3fv(point);
+
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ glPixelZoom(1.0, 1.0);
+ glDrawPixels(image->sizeX, image->sizeY, GL_RGB, GL_UNSIGNED_BYTE,
+ image->data);
+
+ point[0] = (float)x;
+ point[1] = windH - (float)y;
+ point[2] = 0.0;
+ glRasterPos3fv(point);
+
+ glPixelZoom(zoom, zoom);
+ glCopyPixels((windW/2)-(image->sizeX/2),
+ (windH/2)-(image->sizeY/2),
+ image->sizeX, image->sizeY, GL_COLOR);
+
+ glFlush();
+
+ if (doubleBuffer) {
+ glutSwapBuffers();
+ }
+}
+
+static GLenum Args(int argc, char **argv)
+{
+ GLint i;
+
+ doubleBuffer = GL_FALSE;
+
+ for (i = 1; i < argc; i++) {
+ if (strcmp(argv[i], "-sb") == 0) {
+ doubleBuffer = GL_FALSE;
+ } else if (strcmp(argv[i], "-db") == 0) {
+ doubleBuffer = GL_TRUE;
+ } else if (strcmp(argv[i], "-f") == 0) {
+ if (i+1 >= argc || argv[i+1][0] == '-') {
+ printf("-f (No file name).\n");
+ return GL_FALSE;
+ } else {
+ fileName = argv[++i];
+ }
+ } else {
+ printf("%s (Bad option).\n", argv[i]);
+ return GL_FALSE;
+ }
+ }
+ return GL_TRUE;
+}
+
+int main(int argc, char **argv)
+{
+ GLenum type;
+
+ glutInit(&argc, argv);
+
+ if (Args(argc, argv) == GL_FALSE) {
+ exit(1);
+ }
+
+ if (fileName == 0) {
+ printf("No image file.\n");
+ exit(1);
+ }
+
+ image = LoadPPM(fileName);
+
+ windW = 300;
+ windH = 300;
+ glutInitWindowPosition(0, 0); glutInitWindowSize( windW, windH);
+
+ type = GLUT_RGB;
+ type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
+ glutInitDisplayMode(type);
+
+ if (glutCreateWindow("Copy Test") == GL_FALSE) {
+ exit(1);
+ }
+
+ Init();
+
+ glutReshapeFunc(Reshape);
+ glutKeyboardFunc(Key);
+ glutMouseFunc(Mouse);
+ glutDisplayFunc(Draw);
+ glutMainLoop();
+ return 0;
+}
diff --git a/progs/samples/cursor.c b/progs/samples/cursor.c
new file mode 100644
index 00000000000..de8fc58556c
--- /dev/null
+++ b/progs/samples/cursor.c
@@ -0,0 +1,150 @@
+/*
+ * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the name of
+ * Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF
+ * ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <GL/glut.h>
+
+
+GLenum rgb, doubleBuffer, windType;
+int windX, windY;
+int cursor;
+
+
+#include "tkmap.c"
+
+static void Init(void)
+{
+ cursor = 0;
+ glutSetCursor(cursor);
+ glClearColor(0.0, 0.0, 0.0, 0.0);
+ glClearIndex(0.0);
+}
+
+static void Reshape(int width, int height)
+{
+
+ windX = width;
+ windY = height;
+ glViewport(0, 0, windX, windY);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluOrtho2D(0, windX, 0, windY);
+ glMatrixMode(GL_MODELVIEW);
+}
+
+static void Key(unsigned char key, int x, int y)
+{
+
+ switch (key) {
+ case 27:
+ exit(1);
+ case 32:
+ cursor++;
+ if (cursor > 19) {
+ cursor = 0;
+ }
+ glutSetCursor(cursor);
+ }
+}
+
+static void Draw(void)
+{
+
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ glBegin(GL_POLYGON);
+ SetColor(COLOR_BLACK);
+ glVertex2i(0, 0);
+ SetColor(COLOR_RED);
+ glVertex2i(windX, 0);
+ SetColor(COLOR_GREEN);
+ glVertex2i(windX, windY);
+ SetColor(COLOR_BLUE);
+ glVertex2i(0, windY);
+ glEnd();
+
+ glFlush();
+
+ if (doubleBuffer) {
+ glutSwapBuffers();
+ }
+}
+
+static GLenum Args(int argc, char **argv)
+{
+ GLint i;
+
+ rgb = GL_TRUE;
+ doubleBuffer = GL_FALSE;
+
+ for (i = 1; i < argc; i++) {
+ if (strcmp(argv[i], "-ci") == 0) {
+ rgb = GL_FALSE;
+ } else if (strcmp(argv[i], "-rgb") == 0) {
+ rgb = GL_TRUE;
+ } else if (strcmp(argv[i], "-sb") == 0) {
+ doubleBuffer = GL_FALSE;
+ } else if (strcmp(argv[i], "-db") == 0) {
+ doubleBuffer = GL_TRUE;
+ } else {
+ printf("%s (Bad option).\n", argv[i]);
+ return GL_FALSE;
+ }
+ }
+ return GL_TRUE;
+}
+
+int main(int argc, char **argv)
+{
+ glutInit(&argc, argv);
+
+ if (Args(argc, argv) == GL_FALSE) {
+ exit(1);
+ }
+
+ windX = 300;
+ windY = 300;
+ glutInitWindowPosition(0, 0); glutInitWindowSize( windX, windY);
+
+ windType = (rgb) ? GLUT_RGB : GLUT_INDEX;
+ windType |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
+ glutInitDisplayMode(windType);
+
+ if (glutCreateWindow("Cursor Test") == GL_FALSE) {
+ exit(1);
+ }
+
+ InitMap();
+
+ Init();
+
+ glutReshapeFunc(Reshape);
+ glutKeyboardFunc(Key);
+ glutDisplayFunc(Draw);
+ glutMainLoop();
+ return 0;
+}
diff --git a/progs/samples/depth.c b/progs/samples/depth.c
new file mode 100644
index 00000000000..afe2ec17a38
--- /dev/null
+++ b/progs/samples/depth.c
@@ -0,0 +1,209 @@
+/*
+ * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the name of
+ * Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF
+ * ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <GL/glut.h>
+
+
+#define CI_OFFSET_1 16
+#define CI_OFFSET_2 32
+
+
+GLenum rgb, doubleBuffer;
+
+GLenum antiAlias, stipple;
+GLubyte stippleBits[32*4] = {
+ 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
+ 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
+ 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
+ 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
+ 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
+ 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
+ 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
+ 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
+ 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
+ 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
+ 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
+ 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
+ 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
+ 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
+ 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
+ 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55,
+};
+
+
+#include "tkmap.c"
+
+static void Init(void)
+{
+ GLint i;
+
+ glClearColor(0.0, 0.0, 0.0, 0.0);
+ glClearIndex(0.0);
+
+ if (!rgb) {
+ for (i = 0; i < 16; i++) {
+ glutSetColor(i+CI_OFFSET_1, 0.0, 0.0, i/15.0);
+ glutSetColor(i+CI_OFFSET_2, 0.0, i/15.0, 0.0);
+ }
+ }
+
+ glPolygonStipple(stippleBits);
+
+ antiAlias = GL_FALSE;
+ stipple = GL_FALSE;
+}
+
+static void Reshape(int width, int height)
+{
+
+ glViewport(0, 0, (GLint)width, (GLint)height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glOrtho(-1.0, 1.0, -1.0, 1.0, -0.5, 1000.0);
+ glMatrixMode(GL_MODELVIEW);
+}
+
+static void Key(unsigned char key, int x, int y)
+{
+
+ switch (key) {
+ case 27:
+ exit(1);
+ case '1':
+ antiAlias = !antiAlias;
+ break;
+ case '2':
+ stipple = !stipple;
+ break;
+ default:
+ return;
+ }
+
+ glutPostRedisplay();
+}
+
+static void Draw(void)
+{
+ GLint ci1, ci2;
+
+ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
+
+ if (antiAlias) {
+ ci1 = CI_OFFSET_1;
+ ci2 = CI_OFFSET_2;
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE);
+ glEnable(GL_BLEND);
+ glEnable(GL_POLYGON_SMOOTH);
+ glDisable(GL_DEPTH_TEST);
+ } else {
+ ci1 = COLOR_BLUE;
+ ci2 = COLOR_GREEN;
+ glDisable(GL_BLEND);
+ glDisable(GL_POLYGON_SMOOTH);
+ glEnable(GL_DEPTH_TEST);
+ }
+
+ if (stipple) {
+ glEnable(GL_POLYGON_STIPPLE);
+ } else {
+ glDisable(GL_POLYGON_STIPPLE);
+ }
+
+ glBegin(GL_TRIANGLES);
+ (rgb) ? glColor3fv(RGBMap[COLOR_BLUE]) : glIndexi(ci1);
+ glVertex3f( 0.9, -0.9, -30.0);
+ glVertex3f( 0.9, 0.9, -30.0);
+ glVertex3f(-0.9, 0.0, -30.0);
+ (rgb) ? glColor3fv(RGBMap[COLOR_GREEN]) : glIndexi(ci2);
+ glVertex3f(-0.9, -0.9, -40.0);
+ glVertex3f(-0.9, 0.9, -40.0);
+ glVertex3f( 0.9, 0.0, -25.0);
+ glEnd();
+
+ glFlush();
+
+ if (doubleBuffer) {
+ glutSwapBuffers();
+ }
+}
+
+static GLenum Args(int argc, char **argv)
+{
+ GLint i;
+
+ rgb = GL_TRUE;
+ doubleBuffer = GL_FALSE;
+
+ for (i = 1; i < argc; i++) {
+ if (strcmp(argv[i], "-ci") == 0) {
+ rgb = GL_FALSE;
+ } else if (strcmp(argv[i], "-rgb") == 0) {
+ rgb = GL_TRUE;
+ } else if (strcmp(argv[i], "-sb") == 0) {
+ doubleBuffer = GL_FALSE;
+ } else if (strcmp(argv[i], "-db") == 0) {
+ doubleBuffer = GL_TRUE;
+ } else {
+ printf("%s (Bad option).\n", argv[i]);
+ return GL_FALSE;
+ }
+ }
+ return GL_TRUE;
+}
+
+int main(int argc, char **argv)
+{
+ GLenum type;
+
+ glutInit(&argc, argv);
+
+ if (Args(argc, argv) == GL_FALSE) {
+ exit(1);
+ }
+
+ glutInitWindowPosition(0, 0); glutInitWindowSize( 300, 300);
+
+ type = GLUT_DEPTH;
+ type |= (rgb) ? GLUT_RGB : GLUT_INDEX;
+ type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
+ glutInitDisplayMode(type);
+
+ if (glutCreateWindow("Depth Test") == GL_FALSE) {
+ exit(1);
+ }
+
+ InitMap();
+
+ Init();
+
+ glutReshapeFunc(Reshape);
+ glutKeyboardFunc(Key);
+ glutDisplayFunc(Draw);
+ glutMainLoop();
+ return 0;
+}
diff --git a/progs/samples/eval.c b/progs/samples/eval.c
new file mode 100644
index 00000000000..3ad9c5468f8
--- /dev/null
+++ b/progs/samples/eval.c
@@ -0,0 +1,472 @@
+/*
+ * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the name of
+ * Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF
+ * ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <math.h>
+#include <GL/glut.h>
+
+
+#define VORDER 10
+#define CORDER 10
+#define TORDER 3
+
+#define VMAJOR_ORDER 2
+#define VMINOR_ORDER 3
+
+#define CMAJOR_ORDER 2
+#define CMINOR_ORDER 2
+
+#define TMAJOR_ORDER 2
+#define TMINOR_ORDER 2
+
+#define VDIM 4
+#define CDIM 4
+#define TDIM 2
+
+#define ONE_D 1
+#define TWO_D 2
+
+#define EVAL 3
+#define MESH 4
+
+
+GLenum doubleBuffer;
+
+float rotX = 0.0, rotY = 0.0, translateZ = -1.0;
+
+GLenum arrayType = ONE_D;
+GLenum colorType = GL_FALSE;
+GLenum textureType = GL_FALSE;
+GLenum polygonFilled = GL_FALSE;
+GLenum lighting = GL_FALSE;
+GLenum mapPoint = GL_FALSE;
+GLenum mapType = EVAL;
+
+double point1[10*4] = {
+ -0.5, 0.0, 0.0, 1.0,
+ -0.4, 0.5, 0.0, 1.0,
+ -0.3,-0.5, 0.0, 1.0,
+ -0.2, 0.5, 0.0, 1.0,
+ -0.1,-0.5, 0.0, 1.0,
+ 0.0, 0.5, 0.0, 1.0,
+ 0.1,-0.5, 0.0, 1.0,
+ 0.2, 0.5, 0.0, 1.0,
+ 0.3,-0.5, 0.0, 1.0,
+ 0.4, 0.0, 0.0, 1.0,
+};
+double cpoint1[10*4] = {
+ 0.0, 0.0, 1.0, 1.0,
+ 0.3, 0.0, 0.7, 1.0,
+ 0.6, 0.0, 0.3, 1.0,
+ 1.0, 0.0, 0.0, 1.0,
+ 1.0, 0.3, 0.0, 1.0,
+ 1.0, 0.6, 0.0, 1.0,
+ 1.0, 1.0, 0.0, 1.0,
+ 1.0, 1.0, 0.5, 1.0,
+ 1.0, 1.0, 1.0, 1.0,
+};
+double tpoint1[11*4] = {
+ 0.0, 0.0, 0.0, 1.0,
+ 0.0, 0.1, 0.0, 1.0,
+ 0.0, 0.2, 0.0, 1.0,
+ 0.0, 0.3, 0.0, 1.0,
+ 0.0, 0.4, 0.0, 1.0,
+ 0.0, 0.5, 0.0, 1.0,
+ 0.0, 0.6, 0.0, 1.0,
+ 0.0, 0.7, 0.0, 1.0,
+ 0.0, 0.8, 0.0, 1.0,
+ 0.0, 0.9, 0.0, 1.0,
+};
+double point2[2*3*4] = {
+ -0.5, -0.5, 0.5, 1.0,
+ 0.0, 1.0, 0.5, 1.0,
+ 0.5, -0.5, 0.5, 1.0,
+ -0.5, 0.5, -0.5, 1.0,
+ 0.0, -1.0, -0.5, 1.0,
+ 0.5, 0.5, -0.5, 1.0,
+};
+double cpoint2[2*2*4] = {
+ 0.0, 0.0, 0.0, 1.0,
+ 0.0, 0.0, 1.0, 1.0,
+ 0.0, 1.0, 0.0, 1.0,
+ 1.0, 1.0, 1.0, 1.0,
+};
+double tpoint2[2*2*2] = {
+ 0.0, 0.0, 0.0, 1.0,
+ 1.0, 0.0, 1.0, 1.0,
+};
+float textureImage[4*2*4] = {
+ 1.0, 1.0, 1.0, 1.0,
+ 1.0, 0.0, 0.0, 1.0,
+ 1.0, 0.0, 0.0, 1.0,
+ 1.0, 1.0, 1.0, 1.0,
+ 1.0, 1.0, 1.0, 1.0,
+ 1.0, 0.0, 0.0, 1.0,
+ 1.0, 0.0, 0.0, 1.0,
+ 1.0, 1.0, 1.0, 1.0,
+};
+
+
+static void Init(void)
+{
+ static float ambient[] = {0.1, 0.1, 0.1, 1.0};
+ static float diffuse[] = {1.0, 1.0, 1.0, 1.0};
+ static float position[] = {0.0, 0.0, -150.0, 0.0};
+ static float front_mat_diffuse[] = {1.0, 0.2, 1.0, 1.0};
+ static float back_mat_diffuse[] = {1.0, 1.0, 0.2, 1.0};
+ static float lmodel_ambient[] = {1.0, 1.0, 1.0, 1.0};
+ static float lmodel_twoside[] = {GL_TRUE};
+ static float decal[] = {GL_DECAL};
+ static float repeat[] = {GL_REPEAT};
+ static float nr[] = {GL_NEAREST};
+
+ glFrontFace(GL_CCW);
+
+ glEnable(GL_DEPTH_TEST);
+
+ glMap1d(GL_MAP1_VERTEX_4, 0.0, 1.0, VDIM, VORDER, point1);
+ glMap1d(GL_MAP1_COLOR_4, 0.0, 1.0, CDIM, CORDER, cpoint1);
+
+ glMap2d(GL_MAP2_VERTEX_4, 0.0, 1.0, VMINOR_ORDER*VDIM, VMAJOR_ORDER, 0.0,
+ 1.0, VDIM, VMINOR_ORDER, point2);
+ glMap2d(GL_MAP2_COLOR_4, 0.0, 1.0, CMINOR_ORDER*CDIM, CMAJOR_ORDER, 0.0,
+ 1.0, CDIM, CMINOR_ORDER, cpoint2);
+ glMap2d(GL_MAP2_TEXTURE_COORD_2, 0.0, 1.0, TMINOR_ORDER*TDIM,
+ TMAJOR_ORDER, 0.0, 1.0, TDIM, TMINOR_ORDER, tpoint2);
+
+ glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+ glLightfv(GL_LIGHT0, GL_POSITION, position);
+
+ glMaterialfv(GL_FRONT, GL_DIFFUSE, front_mat_diffuse);
+ glMaterialfv(GL_BACK, GL_DIFFUSE, back_mat_diffuse);
+
+ glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+ glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
+
+ glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, decal);
+ glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, repeat);
+ glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, repeat);
+ glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, nr);
+ glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, nr);
+ glTexImage2D(GL_TEXTURE_2D, 0, 4, 2, 4, 0, GL_RGBA, GL_FLOAT,
+ (GLvoid *)textureImage);
+}
+
+static void DrawPoints1(void)
+{
+ GLint i;
+
+ glColor3f(0.0, 1.0, 0.0);
+ glPointSize(2);
+ glBegin(GL_POINTS);
+ for (i = 0; i < VORDER; i++) {
+ glVertex4dv(&point1[i*4]);
+ }
+ glEnd();
+}
+
+static void DrawPoints2(void)
+{
+ GLint i, j;
+
+ glColor3f(1.0, 0.0, 1.0);
+ glPointSize(2);
+ glBegin(GL_POINTS);
+ for (i = 0; i < VMAJOR_ORDER; i++) {
+ for (j = 0; j < VMINOR_ORDER; j++) {
+ glVertex4dv(&point2[i*4*VMINOR_ORDER+j*4]);
+ }
+ }
+ glEnd();
+}
+
+static void DrawMapEval1(float du)
+{
+ float u;
+
+ glColor3f(1.0, 0.0, 0.0);
+ glBegin(GL_LINE_STRIP);
+ for (u = 0.0; u < 1.0; u += du) {
+ glEvalCoord1d(u);
+ }
+ glEvalCoord1d(1.0);
+ glEnd();
+}
+
+static void DrawMapEval2(float du, float dv)
+{
+ float u, v, tmp;
+
+ glColor3f(1.0, 0.0, 0.0);
+ for (v = 0.0; v < 1.0; v += dv) {
+ glBegin(GL_QUAD_STRIP);
+ for (u = 0.0; u <= 1.0; u += du) {
+ glEvalCoord2d(u,v);
+ tmp = (v + dv < 1.0) ? (v + dv) : 1.0;
+ glEvalCoord2d(u, tmp);
+ }
+ glEvalCoord2d(1.0, v);
+ glEvalCoord2d(1.0, v+dv);
+ glEnd();
+ }
+}
+
+static void RenderEval(void)
+{
+
+ if (colorType) {
+ glEnable(GL_MAP1_COLOR_4);
+ glEnable(GL_MAP2_COLOR_4);
+ } else {
+ glDisable(GL_MAP1_COLOR_4);
+ glDisable(GL_MAP2_COLOR_4);
+ }
+
+ if (textureType) {
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_MAP2_TEXTURE_COORD_2);
+ } else {
+ glDisable(GL_TEXTURE_2D);
+ glDisable(GL_MAP2_TEXTURE_COORD_2);
+ }
+
+ if (polygonFilled) {
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ } else {
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ }
+
+ glShadeModel(GL_SMOOTH);
+
+ switch (mapType) {
+ case EVAL:
+ switch (arrayType) {
+ case ONE_D:
+ glDisable(GL_MAP2_VERTEX_4);
+ glEnable(GL_MAP1_VERTEX_4);
+ DrawPoints1();
+ DrawMapEval1(0.1/VORDER);
+ break;
+ case TWO_D:
+ glDisable(GL_MAP1_VERTEX_4);
+ glEnable(GL_MAP2_VERTEX_4);
+ DrawPoints2();
+ DrawMapEval2(0.1/VMAJOR_ORDER,0.1/VMINOR_ORDER);
+ break;
+ default:
+ break;
+ }
+ break;
+ case MESH:
+ switch (arrayType) {
+ case ONE_D:
+ DrawPoints1();
+ glDisable(GL_MAP2_VERTEX_4);
+ glEnable (GL_MAP1_VERTEX_4);
+ glColor3f(0.0, 0.0, 1.0);
+ glMapGrid1d(40, 0.0, 1.0);
+ if (mapPoint) {
+ glPointSize(2);
+ glEvalMesh1(GL_POINT, 0, 40);
+ } else {
+ glEvalMesh1(GL_LINE, 0, 40);
+ }
+ break;
+ case TWO_D:
+ DrawPoints2();
+ glDisable(GL_MAP1_VERTEX_4);
+ glEnable(GL_MAP2_VERTEX_4);
+ glColor3f(0.0, 0.0, 1.0);
+ glMapGrid2d(20, 0.0, 1.0, 20, 0.0, 1.0);
+ if (mapPoint) {
+ glPointSize(2);
+ glEvalMesh2(GL_POINT, 0, 20, 0, 20);
+ } else if (polygonFilled) {
+ glEvalMesh2(GL_FILL, 0, 20, 0, 20);
+ } else {
+ glEvalMesh2(GL_LINE, 0, 20, 0, 20);
+ }
+ break;
+ default:
+ break;
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+static void Reshape(int width, int height)
+{
+
+ glViewport(0, 0, (GLint)width, (GLint)height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glOrtho(-1.0, 1.0, -1.0, 1.0, -0.5, 10.0);
+ glMatrixMode(GL_MODELVIEW);
+}
+
+static void Key2(int key, int x, int y)
+{
+ switch (key) {
+ case GLUT_KEY_LEFT:
+ rotY -= 30;
+ break;
+ case GLUT_KEY_RIGHT:
+ rotY += 30;
+ break;
+ case GLUT_KEY_UP:
+ rotX -= 30;
+ break;
+ case GLUT_KEY_DOWN:
+ rotX += 30;
+ break;
+ default:
+ return;
+ }
+
+ glutPostRedisplay();
+}
+
+static void Key(unsigned char key, int x, int y)
+{
+ switch (key) {
+ case 27:
+ exit(1);
+ case '1':
+ arrayType = ONE_D;
+ break;
+ case '2':
+ arrayType = TWO_D;
+ break;
+ case 'e':
+ mapType = EVAL;
+ break;
+ case 'm':
+ mapType = MESH;
+ break;
+ case 'f':
+ polygonFilled = !polygonFilled;
+ break;
+ case 'p':
+ mapPoint = !mapPoint;
+ break;
+ case 'c':
+ colorType = !colorType;
+ break;
+ case 't':
+ textureType = !textureType;
+ break;
+ case 'l':
+ lighting =! lighting;
+ if (lighting) {
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_AUTO_NORMAL);
+ } else {
+ glDisable(GL_LIGHTING);
+ glDisable(GL_LIGHT0);
+ glDisable(GL_AUTO_NORMAL);
+ }
+ break;
+ default:
+ return;
+ }
+
+ glutPostRedisplay();
+}
+
+static void Draw(void)
+{
+
+ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix();
+
+ glTranslatef(0.0, 0.0 , translateZ);
+ glRotatef(rotX, 1, 0, 0);
+ glRotatef(rotY, 0, 1, 0);
+ RenderEval();
+
+ glPopMatrix();
+
+ glFlush();
+
+ if (doubleBuffer) {
+ glutSwapBuffers();
+ }
+}
+
+static GLenum Args(int argc, char **argv)
+{
+ GLint i;
+
+ doubleBuffer = GL_FALSE;
+
+ for (i = 1; i < argc; i++) {
+ if (strcmp(argv[i], "-sb") == 0) {
+ doubleBuffer = GL_FALSE;
+ } else if (strcmp(argv[i], "-db") == 0) {
+ doubleBuffer = GL_TRUE;
+ } else {
+ printf("%s (Bad option).\n", argv[i]);
+ return GL_FALSE;
+ }
+ }
+ return GL_TRUE;
+}
+
+int main(int argc, char **argv)
+{
+ GLenum type;
+
+ glutInit(&argc, argv);
+
+ if (Args(argc, argv) == GL_FALSE) {
+ exit(1);
+ }
+
+ glutInitWindowPosition(0, 0); glutInitWindowSize( 300, 300);
+
+ type = GLUT_RGB | GLUT_DEPTH;
+ type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
+ glutInitDisplayMode(type);
+
+ if (glutCreateWindow("Evaluator Test") == GL_FALSE) {
+ exit(1);
+ }
+
+ Init();
+
+ glutReshapeFunc(Reshape);
+ glutKeyboardFunc(Key);
+ glutSpecialFunc(Key2);
+ glutDisplayFunc(Draw);
+ glutMainLoop();
+ return 0;
+}
diff --git a/progs/samples/fog.c b/progs/samples/fog.c
new file mode 100644
index 00000000000..3f3ffdbcc7a
--- /dev/null
+++ b/progs/samples/fog.c
@@ -0,0 +1,311 @@
+/*
+ * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the name of
+ * Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF
+ * ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <GL/glut.h>
+
+GLenum rgb, doubleBuffer;
+
+#include "tkmap.c"
+
+double plane[4] = {
+ 1.0, 0.0, -1.0, 0.0
+};
+float rotX = 5.0, rotY = -5.0, zTranslate = -65.0;
+float fogDensity = 0.02;
+GLint cubeList = 1;
+
+float scp[18][3] = {
+ {
+ 1.000000, 0.000000, 0.000000
+ },
+ {
+ 1.000000, 0.000000, 5.000000
+ },
+ {
+ 0.707107, 0.707107, 0.000000
+ },
+ {
+ 0.707107, 0.707107, 5.000000
+ },
+ {
+ 0.000000, 1.000000, 0.000000
+ },
+ {
+ 0.000000, 1.000000, 5.000000
+ },
+ {
+ -0.707107, 0.707107, 0.000000
+ },
+ {
+ -0.707107, 0.707107, 5.000000
+ },
+ {
+ -1.000000, 0.000000, 0.000000
+ },
+ {
+ -1.000000, 0.000000, 5.000000
+ },
+ {
+ -0.707107, -0.707107, 0.000000
+ },
+ {
+ -0.707107, -0.707107, 5.000000
+ },
+ {
+ 0.000000, -1.000000, 0.000000
+ },
+ {
+ 0.000000, -1.000000, 5.000000
+ },
+ {
+ 0.707107, -0.707107, 0.000000
+ },
+ {
+ 0.707107, -0.707107, 5.000000
+ },
+ {
+ 1.000000, 0.000000, 0.000000
+ },
+ {
+ 1.000000, 0.000000, 5.000000
+ },
+};
+
+
+static void Build_lists(void)
+{
+
+ glNewList(cubeList, GL_COMPILE);
+ glBegin(GL_TRIANGLE_STRIP);
+ glNormal3fv(scp[0]); glVertex3fv(scp[0]);
+ glNormal3fv(scp[0]); glVertex3fv(scp[1]);
+ glNormal3fv(scp[2]); glVertex3fv(scp[2]);
+ glNormal3fv(scp[2]); glVertex3fv(scp[3]);
+ glNormal3fv(scp[4]); glVertex3fv(scp[4]);
+ glNormal3fv(scp[4]); glVertex3fv(scp[5]);
+ glNormal3fv(scp[6]); glVertex3fv(scp[6]);
+ glNormal3fv(scp[6]); glVertex3fv(scp[7]);
+ glNormal3fv(scp[8]); glVertex3fv(scp[8]);
+ glNormal3fv(scp[8]); glVertex3fv(scp[9]);
+ glNormal3fv(scp[10]); glVertex3fv(scp[10]);
+ glNormal3fv(scp[10]); glVertex3fv(scp[11]);
+ glNormal3fv(scp[12]); glVertex3fv(scp[12]);
+ glNormal3fv(scp[12]); glVertex3fv(scp[13]);
+ glNormal3fv(scp[14]); glVertex3fv(scp[14]);
+ glNormal3fv(scp[14]); glVertex3fv(scp[15]);
+ glNormal3fv(scp[16]); glVertex3fv(scp[16]);
+ glNormal3fv(scp[16]); glVertex3fv(scp[17]);
+ glEnd();
+ glEndList();
+}
+
+static void Init(void)
+{
+ static float ambient[] = {0.1, 0.1, 0.1, 1.0};
+ static float diffuse[] = {1.0, 1.0, 1.0, 1.0};
+ static float position[] = {90.0, 90.0, 0.0, 0.0};
+ static float front_mat_shininess[] = {30.0};
+ static float front_mat_specular[] = {0.0, 0.0, 0.0, 1.0};
+ static float front_mat_diffuse[] = {0.0, 1.0, 0.0, 1.0};
+ static float back_mat_shininess[] = {50.0};
+ static float back_mat_specular[] = {0.0, 0.0, 1.0, 1.0};
+ static float back_mat_diffuse[] = {1.0, 0.0, 0.0, 1.0};
+ static float lmodel_ambient[] = {0.0, 0.0, 0.0, 1.0};
+ static float fog_color[] = {0.8, 0.8, 0.8, 1.0};
+
+ glFrontFace(GL_CW);
+
+ glEnable(GL_DEPTH_TEST);
+
+ glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+ glLightfv(GL_LIGHT0, GL_POSITION, position);
+ glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+ glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+
+ glMaterialfv(GL_FRONT, GL_SHININESS, front_mat_shininess);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, front_mat_specular);
+ glMaterialfv(GL_FRONT, GL_DIFFUSE, front_mat_diffuse);
+ glMaterialfv(GL_BACK, GL_SHININESS, back_mat_shininess);
+ glMaterialfv(GL_BACK, GL_SPECULAR, back_mat_specular);
+ glMaterialfv(GL_BACK, GL_DIFFUSE, back_mat_diffuse);
+
+ glEnable(GL_FOG);
+ glFogi(GL_FOG_MODE, GL_EXP);
+ glFogf(GL_FOG_DENSITY, fogDensity);
+ if (rgb) {
+ glFogfv(GL_FOG_COLOR, fog_color);
+ glClearColor(0.8, 0.8, 0.8, 1.0);
+ } else {
+ glFogi(GL_FOG_INDEX, 1<<5);
+ SetFogRamp(5, 3);
+ glClearIndex(128);
+ }
+
+ Build_lists();
+}
+
+static void Reshape(int width, int height)
+{
+
+ glViewport(0, 0, (GLint)width, (GLint)height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(45.0, 1.0, 1.0, 200.0);
+ glMatrixMode(GL_MODELVIEW);
+}
+
+static void Key2(int key, int x, int y)
+{
+
+ switch (key) {
+ case GLUT_KEY_UP:
+ rotX -= 5;
+ break;
+ case GLUT_KEY_DOWN:
+ rotX += 5;
+ break;
+ case GLUT_KEY_LEFT:
+ rotY -= 5;
+ break;
+ case GLUT_KEY_RIGHT:
+ rotY += 5;
+ break;
+ default:
+ return;
+ }
+
+ glutPostRedisplay();
+}
+
+static void Key(unsigned char key, int x, int y)
+{
+
+ switch (key) {
+ case 27:
+ exit(1);
+ case 'D':
+ if (rgb) {
+ fogDensity *= 1.10;
+ glFogf(GL_FOG_DENSITY, fogDensity);
+ }
+ break;
+ case 'd':
+ if (rgb) {
+ fogDensity /= 1.10;
+ glFogf(GL_FOG_DENSITY, fogDensity);
+ }
+ break;
+ default:
+ return;
+ }
+
+ glutPostRedisplay();
+}
+
+static void Draw(void)
+{
+
+ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix();
+
+ glTranslatef(0, 0, zTranslate);
+ glRotatef(rotY, 0,1,0);
+ glRotatef(rotX, 1,0,0);
+ glScalef(1.0, 1.0, 10.0);
+
+ glCallList(cubeList);
+
+ glPopMatrix();
+
+ glFlush();
+
+ if (doubleBuffer) {
+ glutSwapBuffers();
+ }
+}
+
+static GLenum Args(int argc, char **argv)
+{
+ GLint i;
+
+ rgb = GL_TRUE;
+ doubleBuffer = GL_TRUE;
+
+ for (i = 1; i < argc; i++) {
+ if (strcmp(argv[i], "-ci") == 0) {
+ rgb = GL_FALSE;
+ } else if (strcmp(argv[i], "-rgb") == 0) {
+ rgb = GL_TRUE;
+ } else if (strcmp(argv[i], "-sb") == 0) {
+ doubleBuffer = GL_FALSE;
+ } else if (strcmp(argv[i], "-db") == 0) {
+ doubleBuffer = GL_TRUE;
+ } else {
+ printf("%s (Bad option).\n", argv[i]);
+ return GL_FALSE;
+ }
+ }
+ return GL_TRUE;
+}
+
+int main(int argc, char **argv)
+{
+ GLenum type;
+
+ glutInit(&argc, argv);
+
+ if (Args(argc, argv) == GL_FALSE) {
+ exit(1);
+ }
+
+ glutInitWindowPosition(0, 0); glutInitWindowSize( 300, 300);
+
+ type = GLUT_DEPTH;
+ type |= (rgb) ? GLUT_RGB : GLUT_INDEX;
+ type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
+ glutInitDisplayMode(type);
+
+ if (glutCreateWindow("Fog Test") == GL_FALSE) {
+ exit(1);
+ }
+
+ InitMap();
+
+ Init();
+
+ glutReshapeFunc(Reshape);
+ glutKeyboardFunc(Key);
+ glutSpecialFunc(Key2);
+ glutDisplayFunc(Draw);
+ glutMainLoop();
+ return 0;
+}
diff --git a/progs/samples/font.c b/progs/samples/font.c
new file mode 100644
index 00000000000..a0091a65d79
--- /dev/null
+++ b/progs/samples/font.c
@@ -0,0 +1,273 @@
+/*
+ * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the name of
+ * Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF
+ * ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <GL/glut.h>
+
+
+#define OPENGL_WIDTH 24
+#define OPENGL_HEIGHT 13
+
+
+char string[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz";
+GLenum rgb, doubleBuffer, windType;
+float angleX = 0.0, angleY = 0.0, angleZ = 0.0;
+float scaleX = 1.0, scaleY = 1.0, scaleZ = 1.0;
+float shiftX = 0.0, shiftY = 0.0, shiftZ = 0.0;
+
+
+#include "tkmap.c"
+
+
+static void DrawBitmapString(void *font, const char *string)
+{
+ int i;
+
+ for (i = 0; string[i]; i++)
+ glutBitmapCharacter(font, string[i]);
+}
+
+static void DrawStrokeString(void *font, const char *string)
+{
+ int i;
+
+ for (i = 0; string[i]; i++)
+ glutStrokeCharacter(font, string[i]);
+}
+
+static void Init(void)
+{
+
+ glClearColor(0.0, 0.0, 0.0, 0.0);
+ glClearIndex(0.0);
+}
+
+static void Reshape(int width, int height)
+{
+
+ glViewport(0, 0, (GLint)width, (GLint)height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glOrtho(-400.0, 400.0, -200.0, 200.0, -400.0, 400.0);
+ glMatrixMode(GL_MODELVIEW);
+}
+
+static void Key2(int key, int x, int y)
+{
+
+ switch (key) {
+ case GLUT_KEY_LEFT:
+ shiftX -= 20.0;
+ break;
+ case GLUT_KEY_RIGHT:
+ shiftX += 20.0;
+ break;
+ case GLUT_KEY_UP:
+ shiftY += 20.0;
+ break;
+ case GLUT_KEY_DOWN:
+ shiftY -= 20.0;
+ break;
+ default:
+ return;
+ }
+
+ glutPostRedisplay();
+}
+
+static void Key(unsigned char key, int x, int y)
+{
+
+ switch (key) {
+ case 27:
+ exit(1);
+
+ case 'n':
+ shiftZ += 20.0;
+ break;
+ case 'm':
+ shiftZ -= 20.0;
+ break;
+
+ case 'q':
+ scaleX -= 0.1;
+ if (scaleX < 0.1) {
+ scaleX = 0.1;
+ }
+ break;
+ case 'w':
+ scaleX += 0.1;
+ break;
+ case 'a':
+ scaleY -= 0.1;
+ if (scaleY < 0.1) {
+ scaleY = 0.1;
+ }
+ break;
+ case 's':
+ scaleY += 0.1;
+ break;
+ case 'z':
+ scaleZ -= 0.1;
+ if (scaleZ < 0.1) {
+ scaleZ = 0.1;
+ }
+ break;
+ case 'x':
+ scaleZ += 0.1;
+ break;
+
+ case 'e':
+ angleX -= 5.0;
+ if (angleX < 0.0) {
+ angleX = 360.0 + angleX;
+ }
+ break;
+ case 'r':
+ angleX += 5.0;
+ if (angleX > 360.0) {
+ angleX = angleX - 360.0;
+ }
+ break;
+ case 'd':
+ angleY -= 5.0;
+ if (angleY < 0.0) {
+ angleY = 360.0 + angleY;
+ }
+ break;
+ case 'f':
+ angleY += 5.0;
+ if (angleY > 360.0) {
+ angleY = angleY - 360.0;
+ }
+ break;
+ case 'c':
+ angleZ -= 5.0;
+ if (angleZ < 0.0) {
+ angleZ = 360.0 + angleZ;
+ }
+ break;
+ case 'v':
+ angleZ += 5.0;
+ if (angleZ > 360.0) {
+ angleZ = angleZ - 360.0;
+ }
+ break;
+ default:
+ return;
+ }
+
+ glutPostRedisplay();
+}
+
+static void Draw(void)
+{
+
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ SetColor(COLOR_WHITE);
+
+ glPushMatrix();
+
+ glTranslatef(shiftX, shiftY, shiftZ);
+ glRotatef(angleX, 1.0, 0.0, 0.0);
+ glRotatef(angleY, 0.0, 1.0, 0.0);
+ glRotatef(angleZ, 0.0, 0.0, 1.0);
+ glScalef(scaleX, scaleY, scaleZ);
+
+ glPushMatrix();
+ glRasterPos2f(-390.5, 0.5);
+ DrawBitmapString(GLUT_BITMAP_9_BY_15, string);
+ glPopMatrix();
+
+ glPushMatrix();
+ glTranslatef(-390.5, -30.5, 0.0);
+ DrawStrokeString(GLUT_STROKE_ROMAN, string);
+ glPopMatrix();
+
+ glPopMatrix();
+
+ glFlush();
+
+ if (doubleBuffer) {
+ glutSwapBuffers();
+ }
+}
+
+static GLenum Args(int argc, char **argv)
+{
+ GLint i;
+
+ rgb = GL_TRUE;
+ doubleBuffer = GL_FALSE;
+
+ for (i = 1; i < argc; i++) {
+ if (strcmp(argv[i], "-ci") == 0) {
+ rgb = GL_FALSE;
+ } else if (strcmp(argv[i], "-rgb") == 0) {
+ rgb = GL_TRUE;
+ } else if (strcmp(argv[i], "-sb") == 0) {
+ doubleBuffer = GL_FALSE;
+ } else if (strcmp(argv[i], "-db") == 0) {
+ doubleBuffer = GL_TRUE;
+ } else {
+ printf("%s (Bad option).\n", argv[i]);
+ return GL_FALSE;
+ }
+ }
+ return GL_TRUE;
+}
+
+int main(int argc, char **argv)
+{
+ glutInit(&argc, argv);
+
+ if (Args(argc, argv) == GL_FALSE) {
+ exit(1);
+ }
+
+ glutInitWindowPosition(0, 0); glutInitWindowSize( 800, 400);
+
+ windType = (rgb) ? GLUT_RGB : GLUT_INDEX;
+ windType |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
+ glutInitDisplayMode(windType);
+
+ if (glutCreateWindow("Font Test") == GL_FALSE) {
+ exit(1);
+ }
+
+ InitMap();
+
+ Init();
+
+ glutReshapeFunc(Reshape);
+ glutKeyboardFunc(Key);
+ glutSpecialFunc(Key2);
+ glutDisplayFunc(Draw);
+ glutMainLoop();
+ return 0;
+}
diff --git a/progs/samples/line.c b/progs/samples/line.c
new file mode 100644
index 00000000000..83f70cb3ac4
--- /dev/null
+++ b/progs/samples/line.c
@@ -0,0 +1,219 @@
+/*
+ * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the name of
+ * Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF
+ * ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <GL/glut.h>
+
+
+#define CI_OFFSET 16
+
+
+GLenum rgb, doubleBuffer, windType;
+
+GLenum mode1, mode2;
+GLint size;
+float pntA[3] = {
+ -160.0, 0.0, 0.0
+};
+float pntB[3] = {
+ -130.0, 0.0, 0.0
+};
+float pntC[3] = {
+ -40.0, -50.0, 0.0
+};
+float pntD[3] = {
+ 30.0, 60.0, 0.0
+};
+
+
+#include "tkmap.c"
+
+static void Init(void)
+{
+ GLint i;
+
+ glClearColor(0.0, 0.0, 0.0, 0.0);
+
+ glLineStipple(1, 0xF0E0);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE);
+
+ if (!rgb) {
+ for (i = 0; i < 16; i++) {
+ glutSetColor(i+CI_OFFSET, i/15.0, i/15.0, 0.0);
+ }
+ }
+
+ mode1 = GL_FALSE;
+ mode2 = GL_FALSE;
+ size = 1;
+}
+
+static void Reshape(int width, int height)
+{
+
+ glViewport(0, 0, (GLint)width, (GLint)height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluOrtho2D(-175, 175, -175, 175);
+ glMatrixMode(GL_MODELVIEW);
+}
+
+static void Key(unsigned char key, int x, int y)
+{
+
+ switch (key) {
+ case 27:
+ exit(1);
+ case '1':
+ mode1 = !mode1;
+ break;
+ case '2':
+ mode2 = !mode2;
+ break;
+ case 'W':
+ size++;
+ break;
+ case 'w':
+ size--;
+ if (size < 1) {
+ size = 1;
+ }
+ break;
+ default:
+ return;
+ }
+
+ glutPostRedisplay();
+}
+
+static void Draw(void)
+{
+ GLint ci, i;
+
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ glLineWidth(size);
+
+ if (mode1) {
+ glEnable(GL_LINE_STIPPLE);
+ } else {
+ glDisable(GL_LINE_STIPPLE);
+ }
+
+ if (mode2) {
+ ci = CI_OFFSET;
+ glEnable(GL_LINE_SMOOTH);
+ glEnable(GL_BLEND);
+ } else {
+ ci = COLOR_YELLOW;
+ glDisable(GL_LINE_SMOOTH);
+ glDisable(GL_BLEND);
+ }
+
+ glPushMatrix();
+
+ glShadeModel( GL_FLAT );
+
+ for (i = 0; i < 360; i += 5) {
+ glRotatef(5.0, 0,0,1);
+
+ (rgb) ? glColor3f(1.0, 1.0, 0.0) : glIndexi(ci);
+ glBegin(GL_LINE_STRIP);
+ glVertex3fv(pntA);
+ glVertex3fv(pntB);
+ glEnd();
+
+ glPointSize(1);
+
+ SetColor(COLOR_GREEN);
+ glBegin(GL_POINTS);
+ glVertex3fv(pntA);
+ glVertex3fv(pntB);
+ glEnd();
+ }
+
+ glPopMatrix();
+
+ glFlush();
+
+ if (doubleBuffer) {
+ glutSwapBuffers();
+ }
+}
+
+static GLenum Args(int argc, char **argv)
+{
+ GLint i;
+
+ rgb = GL_TRUE;
+ doubleBuffer = GL_TRUE;
+
+ for (i = 1; i < argc; i++) {
+ if (strcmp(argv[i], "-ci") == 0) {
+ rgb = GL_FALSE;
+ } else if (strcmp(argv[i], "-rgb") == 0) {
+ rgb = GL_TRUE;
+ } else if (strcmp(argv[i], "-sb") == 0) {
+ doubleBuffer = GL_FALSE;
+ } else if (strcmp(argv[i], "-db") == 0) {
+ doubleBuffer = GL_TRUE;
+ } else {
+ printf("%s (Bad option).\n", argv[i]);
+ return GL_FALSE;
+ }
+ }
+ return GL_TRUE;
+}
+
+int main(int argc, char **argv)
+{
+ glutInit(&argc, argv);
+
+ if (Args(argc, argv) == GL_FALSE) {
+ exit(1);
+ }
+
+ glutInitWindowPosition(0, 0); glutInitWindowSize( 300, 300);
+
+ windType = (rgb) ? GLUT_RGB : GLUT_INDEX;
+ windType |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
+ glutInitDisplayMode(windType);
+
+ if (glutCreateWindow("Line Test") == GL_FALSE) {
+ exit(1);
+ }
+
+ InitMap();
+
+ Init();
+
+ glutReshapeFunc(Reshape);
+ glutKeyboardFunc(Key);
+ glutDisplayFunc(Draw);
+ glutMainLoop();
+ return 0;
+}
diff --git a/progs/samples/loadppm.c b/progs/samples/loadppm.c
new file mode 100644
index 00000000000..be056d62940
--- /dev/null
+++ b/progs/samples/loadppm.c
@@ -0,0 +1,72 @@
+
+typedef struct {
+ size_t sizeX, sizeY;
+ GLubyte *data;
+} PPMImage;
+
+static PPMImage *LoadPPM(const char *filename)
+{
+ char buff[16];
+ PPMImage *result;
+ FILE *fp;
+ int maxval;
+
+ fp = fopen(filename, "rb");
+ if (!fp)
+ {
+ fprintf(stderr, "Unable to open file `%s'\n", filename);
+ exit(1);
+ }
+
+ if (!fgets(buff, sizeof(buff), fp))
+ {
+ perror(filename);
+ exit(1);
+ }
+
+ if (buff[0] != 'P' || buff[1] != '6')
+ {
+ fprintf(stderr, "Invalid image format (must be `P6')\n");
+ exit(1);
+ }
+
+ result = (PPMImage *) malloc(sizeof(PPMImage));
+ if (!result)
+ {
+ fprintf(stderr, "Unable to allocate memory\n");
+ exit(1);
+ }
+
+ if (fscanf(fp, "%lu %lu", &result->sizeX, &result->sizeY) != 2)
+ {
+ fprintf(stderr, "Error loading image `%s'\n", filename);
+ exit(1);
+ }
+
+ if (fscanf(fp, "%d", &maxval) != 1)
+ {
+ fprintf(stderr, "Error loading image `%s'\n", filename);
+ exit(1);
+ }
+
+ while (fgetc(fp) != '\n')
+ ;
+
+ result->data = (GLubyte *) malloc(3 * result->sizeX * result->sizeY);
+ if (!result)
+ {
+ fprintf(stderr, "Unable to allocate memory\n");
+ exit(1);
+ }
+
+ if (fread(result->data, 3 * result->sizeX, result->sizeY, fp) != result->sizeY)
+ {
+ fprintf(stderr, "Error loading image `%s'\n", filename);
+ exit(1);
+ }
+
+ fclose(fp);
+
+ return result;
+}
+
diff --git a/progs/samples/logo.c b/progs/samples/logo.c
new file mode 100644
index 00000000000..ae74af685a7
--- /dev/null
+++ b/progs/samples/logo.c
@@ -0,0 +1,1635 @@
+
+/*
+ * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the name of
+ * Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF
+ * ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <GL/glut.h>
+
+
+#define PI 3.141592654
+
+#define BLACK 0
+#define GRAY 128
+#define WHITE 255
+#define BL 0x00
+#define WH 0xFF
+#define RD 0xA4,0x00,0x00,0xFF
+#define WT 0xFF,0xFF,0xFF,0xFF
+
+#define CHECKIMAGEWIDTH 8
+#define CHECKIMAGEHEIGHT 8
+#define BRICKIMAGEWIDTH 16
+#define BRICKIMAGEHEIGHT 16
+
+
+GLenum rgb, doubleBuffer;
+
+#include "tkmap.c"
+
+float black[3] = {0.0, 0.0, 0.0};
+float white[3] = {1.0, 1.0, 1.0};
+float gray[3] = {0.5, 0.5, 0.5};
+float blue[3] = {0.0, 0.0, 1.0};
+GLint colorIndexes[3] = {0, 200, 255};
+
+GLenum polyMode;
+GLboolean dithering;
+GLboolean shade;
+GLboolean doStipple;
+GLboolean noDraw = 0;
+GLboolean LineSmooth = GL_FALSE;
+
+double plane[4] = {1.0, 0.0, -1.0, 0.0};
+float xRotation = 30.0, yRotation = 30.0;
+float zTranslation = -15.0;
+
+GLint singleCylinder;
+GLint doubleCylinder;
+GLint elbow, logo;
+
+GLubyte checkImage[3*CHECKIMAGEWIDTH*CHECKIMAGEHEIGHT] = {
+ BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH,
+ WH, WH, BL, BL, BL, WH, WH, WH, WH, WH, WH, BL, BL, BL, WH, WH,
+ WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL,
+ BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH,
+ WH, WH, BL, BL, BL, WH, WH, WH, WH, WH, WH, BL, BL, BL, WH, WH,
+ WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL,
+ BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH,
+ WH, WH, BL, BL, BL, WH, WH, WH, WH, WH, WH, BL, BL, BL, WH, WH,
+ WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL,
+ BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH,
+ WH, WH, BL, BL, BL, WH, WH, WH, WH, WH, WH, BL, BL, BL, WH, WH,
+ WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL,
+};
+GLubyte brickImage[4*BRICKIMAGEWIDTH*BRICKIMAGEHEIGHT] = {
+ RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD,
+ RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD,
+ RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD,
+ RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD,
+ WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT,
+ RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD,
+ RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD,
+ RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD,
+ RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD,
+ WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT,
+ RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD,
+ RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD,
+ RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD,
+ RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD,
+ WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT,
+ RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD
+};
+
+GLubyte *image = checkImage;
+GLint imageHeight = CHECKIMAGEHEIGHT;
+GLint imageWidth = CHECKIMAGEWIDTH;
+
+static float decal[] = {
+ GL_DECAL,
+};
+static float modulate[] = {
+ GL_MODULATE,
+};
+static float repeat[] = {
+ GL_REPEAT,
+};
+static float nearest[] = {
+ GL_NEAREST,
+};
+
+GLubyte stipple[4*32] = {
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+
+ 0x00, 0x0F, 0xF0, 0x00,
+ 0x00, 0x0F, 0xF0, 0x00,
+ 0x00, 0x0F, 0xF0, 0x00,
+ 0x00, 0x0F, 0xF0, 0x00,
+ 0x00, 0x0F, 0xF0, 0x00,
+ 0x00, 0x0F, 0xF0, 0x00,
+ 0x00, 0x0F, 0xF0, 0x00,
+ 0x00, 0x0F, 0xF0, 0x00,
+
+ 0x00, 0x0F, 0xF0, 0x00,
+ 0x00, 0x0F, 0xF0, 0x00,
+ 0x00, 0x0F, 0xF0, 0x00,
+ 0x00, 0x0F, 0xF0, 0x00,
+ 0x00, 0x0F, 0xF0, 0x00,
+ 0x00, 0x0F, 0xF0, 0x00,
+ 0x00, 0x0F, 0xF0, 0x00,
+ 0x00, 0x0F, 0xF0, 0x00,
+
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00,
+};
+
+float tscp[18][2] = {
+ {
+ 0.0, 0.0
+ },
+ {
+ 1.0, 0.0
+ },
+ {
+ 0.0, 0.125
+ },
+ {
+ 1.0, 0.125
+ },
+ {
+ 0.0, 0.250
+ },
+ {
+ 1.0, 0.25
+ },
+ {
+ 0.0, 0.375
+ },
+ {
+ 1.0, 0.375
+ },
+ {
+ 0.0, 0.50
+ },
+ {
+ 1.0, 0.50
+ },
+ {
+ 0.0, 0.625
+ },
+ {
+ 1.0, 0.625
+ },
+ {
+ 0.0, 0.75
+ },
+ {
+ 1.0, 0.75
+ },
+ {
+ 0.0, 0.875
+ },
+ {
+ 1.0, 0.875
+ },
+ {
+ 0.0, 1.0
+ },
+ {
+ 1.0, 1.0
+ }
+};
+float scp[18][3] = {
+ {
+ 1.000000, 0.000000, 0.000000
+ },
+ {
+ 1.000000, 0.000000, 5.000000
+ },
+ {
+ 0.707107, 0.707107, 0.000000
+ },
+ {
+ 0.707107, 0.707107, 5.000000
+ },
+ {
+ 0.000000, 1.000000, 0.000000
+ },
+ {
+ 0.000000, 1.000000, 5.000000
+ },
+ {
+ -0.707107, 0.707107, 0.000000
+ },
+ {
+ -0.707107, 0.707107, 5.000000
+ },
+ {
+ -1.000000, 0.000000, 0.000000
+ },
+ {
+ -1.000000, 0.000000, 5.000000
+ },
+ {
+ -0.707107, -0.707107, 0.000000
+ },
+ {
+ -0.707107, -0.707107, 5.000000
+ },
+ {
+ 0.000000, -1.000000, 0.000000
+ },
+ {
+ 0.000000, -1.000000, 5.000000
+ },
+ {
+ 0.707107, -0.707107, 0.000000
+ },
+ {
+ 0.707107, -0.707107, 5.000000
+ },
+ {
+ 1.000000, 0.000000, 0.000000
+ },
+ {
+ 1.000000, 0.000000, 5.000000
+ }
+};
+float dcp[18][3] = {
+ {
+ 1.000000, 0.000000, 0.000000
+ },
+ {
+ 1.000000, 0.000000, 7.000000
+ },
+ {
+ 0.707107, 0.707107, 0.000000
+ },
+ {
+ 0.707107, 0.707107, 7.000000
+ },
+ {
+ 0.000000, 1.000000, 0.000000
+ },
+ {
+ 0.000000, 1.000000, 7.000000
+ },
+ {
+ -0.707107, 0.707107, 0.000000
+ },
+ {
+ -0.707107, 0.707107, 7.000000
+ },
+ {
+ -1.000000, 0.000000, 0.000000
+ },
+ {
+ -1.000000, 0.000000, 7.000000
+ },
+ {
+ -0.707107, -0.707107, 0.000000
+ },
+ {
+ -0.707107, -0.707107, 7.000000
+ },
+ {
+ 0.000000, -1.000000, 0.000000
+ },
+ {
+ 0.000000, -1.000000, 7.000000
+ },
+ {
+ 0.707107, -0.707107, 0.000000
+ },
+ {
+ 0.707107, -0.707107, 7.000000
+ },
+ {
+ 1.000000, 0.000000, 0.000000
+ },
+ {
+ 1.000000, 0.000000, 7.000000
+ }
+};
+float ep[7][9][3] = {
+ {
+ {
+ 1.000000, 0.000000, 0.000000
+ },
+ {
+ 0.707107, 0.707107, 0.000000
+ },
+ {
+ 0.000000, 1.000000, 0.000000
+ },
+ {
+ -0.707107, 0.707107, 0.000000
+ },
+ {
+ -1.000000, 0.000000, 0.000000
+ },
+ {
+ -0.707107, -0.707107, 0.000000
+ },
+ {
+ 0.000000, -1.000000, 0.000000
+ },
+ {
+ 0.707107, -0.707107, 0.000000
+ },
+ {
+ 1.000000, 0.000000, 0.000000
+ }
+ },
+ {
+ {
+ 1.000000, 0.034074, 0.258819
+ },
+ {
+ 0.707107, 0.717087, 0.075806
+ },
+ {
+ 0.000000, 1.000000, 0.000000
+ },
+ {
+ -0.707107, 0.717087, 0.075806
+ },
+ {
+ -1.000000, 0.034074, 0.258819
+ },
+ {
+ -0.707107, -0.648939, 0.441832
+ },
+ {
+ 0.000000, -0.931852, 0.517638
+ },
+ {
+ 0.707107, -0.648939, 0.441832
+ },
+ {
+ 1.000000, 0.034074, 0.258819
+ }
+ },
+ {
+ {
+ 1.000000, 0.133975, 0.500000
+ },
+ {
+ 0.707107, 0.746347, 0.146447
+ },
+ {
+ 0.000000, 1.000000, 0.000000
+ },
+ {
+ -0.707107, 0.746347, 0.146447
+ },
+ {
+ -1.000000, 0.133975, 0.500000
+ },
+ {
+ -0.707107, -0.478398, 0.853553
+ },
+ {
+ 0.000000, -0.732051, 1.000000
+ },
+ {
+ 0.707107, -0.478398, 0.853553
+ },
+ {
+ 1.000000, 0.133975, 0.500000
+ }
+ },
+ {
+ {
+ 1.000000, 0.292893, 0.707107
+ },
+ {
+ 0.707107, 0.792893, 0.207107
+ },
+ {
+ 0.000000, 1.000000, 0.000000
+ },
+ {
+ -0.707107, 0.792893, 0.207107
+ },
+ {
+ -1.000000, 0.292893, 0.707107
+ },
+ {
+ -0.707107, -0.207107, 1.207107
+ },
+ {
+ 0.000000, -0.414214, 1.414214
+ },
+ {
+ 0.707107, -0.207107, 1.207107
+ },
+ {
+ 1.000000, 0.292893, 0.707107
+ }
+ },
+ {
+ {
+ 1.000000, 0.500000, 0.866025
+ },
+ {
+ 0.707107, 0.853553, 0.253653
+ },
+ {
+ 0.000000, 1.000000, 0.000000
+ },
+ {
+ -0.707107, 0.853553, 0.253653
+ },
+ {
+ -1.000000, 0.500000, 0.866025
+ },
+ {
+ -0.707107, 0.146447, 1.478398
+ },
+ {
+ 0.000000, 0.000000, 1.732051
+ },
+ {
+ 0.707107, 0.146447, 1.478398
+ },
+ {
+ 1.000000, 0.500000, 0.866025
+ }
+ },
+ {
+ {
+ 1.000000, 0.741181, 0.965926
+ },
+ {
+ 0.707107, 0.924194, 0.282913
+ },
+ {
+ 0.000000, 1.000000, 0.000000
+ },
+ {
+ -0.707107, 0.924194, 0.282913
+ },
+ {
+ -1.000000, 0.741181, 0.965926
+ },
+ {
+ -0.707107, 0.558168, 1.648939
+ },
+ {
+ 0.000000, 0.482362, 1.931852
+ },
+ {
+ 0.707107, 0.558168, 1.648939
+ },
+ {
+ 1.000000, 0.741181, 0.965926
+ }
+ },
+ {
+ {
+ 1.000000, 1.000000, 1.000000
+ },
+ {
+ 0.707107, 1.000000, 0.292893
+ },
+ {
+ 0.000000, 1.000000, 0.000000
+ },
+ {
+ -0.707107, 1.000000, 0.292893
+ },
+ {
+ -1.000000, 1.000000, 1.000000
+ },
+ {
+ -0.707107, 1.000000, 1.707107
+ },
+ {
+ 0.000000, 1.000000, 2.000000
+ },
+ {
+ 0.707107, 1.000000, 1.707107
+ },
+ {
+ 1.000000, 1.000000, 1.000000
+ }
+ }
+};
+float en[7][9][3] = {
+ {
+ {
+ 1.000000, 0.000000, 0.000000
+ },
+ {
+ 0.707107, 0.707107, 0.000000
+ },
+ {
+ 0.000000, 1.000000, 0.000000
+ },
+ {
+ -0.707107, 0.707107, 0.000000
+ },
+ {
+ -1.000000, 0.000000, 0.000000
+ },
+ {
+ -0.707107, -0.707107, 0.000000
+ },
+ {
+ 0.000000, -1.000000, 0.000000
+ },
+ {
+ 0.707107, -0.707107, 0.000000
+ },
+ {
+ 1.000000, 0.000000, 0.000000
+ }
+ },
+ {
+ {
+ 1.000000, 0.000000, 0.000000
+ },
+ {
+ 0.707107, 0.683013, -0.183013
+ },
+ {
+ 0.000000, 0.965926, -0.258819
+ },
+ {
+ -0.707107, 0.683013, -0.183013
+ },
+ {
+ -1.000000, 0.000000, 0.000000
+ },
+ {
+ -0.707107, -0.683013, 0.183013
+ },
+ {
+ 0.000000, -0.965926, 0.258819
+ },
+ {
+ 0.707107, -0.683013, 0.183013
+ },
+ {
+ 1.000000, 0.000000, 0.000000
+ }
+ },
+ {
+ {
+ 1.000000, 0.000000, 0.000000
+ },
+ {
+ 0.707107, 0.612372, -0.353553
+ },
+ {
+ 0.000000, 0.866025, -0.500000
+ },
+ {
+ -0.707107, 0.612372, -0.353553
+ },
+ {
+ -1.000000, 0.000000, 0.000000
+ },
+ {
+ -0.707107, -0.612372, 0.353553
+ },
+ {
+ 0.000000, -0.866025, 0.500000
+ },
+ {
+ 0.707107, -0.612372, 0.353553
+ },
+ {
+ 1.000000, 0.000000, 0.000000
+ }
+ },
+ {
+ {
+ 1.000000, 0.000000, 0.000000
+ },
+ {
+ /* These 3 lines added by BEP */
+ 0.707107, 0.500000, -0.500000
+ },
+ {
+ 0.000000, 0.707107, -0.707107
+ },
+ {
+ -0.707107, 0.500000, -0.500000
+ },
+ {
+ -1.000000, 0.000000, 0.000000
+ },
+ {
+ -0.707107, -0.500000, 0.500000
+ },
+ {
+ 0.000000, -0.707107, 0.707107
+ },
+ {
+ 0.707107, -0.500000, 0.500000
+ },
+ {
+ 1.000000, 0.000000, 0.000000
+ }
+ },
+ {
+ {
+ 1.000000, 0.000000, 0.000000
+ },
+ {
+ 0.707107, 0.353553, -0.612372
+ },
+ {
+ 0.000000, 0.500000, -0.866025
+ },
+ {
+ -0.707107, 0.353553, -0.612372
+ },
+ {
+ -1.000000, 0.000000, 0.000000
+ },
+ {
+ -0.707107, -0.353553, 0.612372
+ },
+ {
+ 0.000000, -0.500000, 0.866025
+ },
+ {
+ 0.707107, -0.353553, 0.612372
+ },
+ {
+ 1.000000, 0.000000, 0.000000
+ }
+ },
+ {
+ {
+ 1.000000, 0.000000, 0.000000
+ },
+ {
+ 0.707107, 0.183013, -0.683013
+ },
+ {
+ 0.000000, 0.258819, -0.965926
+ },
+ {
+ -0.707107, 0.183013, -0.683013
+ },
+ {
+ -1.000000, 0.000000, 0.000000
+ },
+ {
+ -0.707107, -0.183013, 0.683013
+ },
+ {
+ 0.000000, -0.258819, 0.965926
+ },
+ {
+ 0.707107, -0.183013, 0.683013
+ },
+ {
+ 1.000000, 0.000000, 0.000000
+ }
+ },
+ {
+ {
+ 1.000000, 0.000000, 0.000000
+ },
+ {
+ 0.707107, 0.000000, -0.707107
+ },
+ {
+ 0.000000, 0.000000, -1.000000
+ },
+ {
+ -0.707107, 0.000000, -0.707107
+ },
+ {
+ -1.000000, 0.000000, 0.000000
+ },
+ {
+ -0.707107, 0.000000, 0.707107
+ },
+ {
+ 0.000000, 0.000000, 1.000000
+ },
+ {
+ 0.707107, 0.000000, 0.707107
+ },
+ {
+ 1.000000, 0.000000, 0.000000
+ }
+ }
+};
+float tep[7][9][2] = {
+ {
+ {
+ 0, 0.0
+ },
+ {
+ 0.125, 0.0
+ },
+ {
+ 0.25, 0.0
+ },
+ {
+ 0.375, 0.0
+ },
+ {
+ 0.5, 0.0
+ },
+ {
+ 0.625, 0.0
+ },
+ {
+ 0.75, 0.0
+ },
+ {
+ 0.875, 0.0
+ },
+ {
+ 1.0, 0.0
+ }
+ },
+ {
+ {
+ 0, 0.16667
+ },
+ {
+ 0.125, 0.16667
+ },
+ {
+ 0.25, 0.16667
+ },
+ {
+ 0.375, 0.16667
+ },
+ {
+ 0.5, 0.16667
+ },
+ {
+ 0.625, 0.16667
+ },
+ {
+ 0.75, 0.16667
+ },
+ {
+ 0.875, 0.16667
+ },
+ {
+ 1.0, 0.16667
+ }
+ },
+ {
+ {
+ 0, 0.33333
+ },
+ {
+ 0.125, 0.33333
+ },
+ {
+ 0.25, 0.33333
+ },
+ {
+ 0.375, 0.33333
+ },
+ {
+ 0.5, 0.33333
+ },
+ {
+ 0.625, 0.33333
+ },
+ {
+ 0.75, 0.33333
+ },
+ {
+ 0.875, 0.33333
+ },
+ {
+ 1.0, 0.33333
+ }
+ },
+ {
+ {
+ 0, 0.5
+ },
+ {
+ 0.125, 0.5
+ },
+ {
+ 0.25, 0.5
+ },
+ {
+ 0.375, 0.5
+ },
+ {
+ 0.5, 0.5
+ },
+ {
+ 0.625, 0.5
+ },
+ {
+ 0.75, 0.5
+ },
+ {
+ 0.875, 0.5
+ },
+ {
+ 1.0, 0.5
+ }
+ },
+ {
+ {
+ 0, 0.6667
+ },
+ {
+ 0.125, 0.6667
+ },
+ {
+ 0.25, 0.6667
+ },
+ {
+ 0.375, 0.6667
+ },
+ {
+ 0.5, 0.6667
+ },
+ {
+ 0.625, 0.6667
+ },
+ {
+ 0.75, 0.6667
+ },
+ {
+ 0.875, 0.6667
+ },
+ {
+ 1.0, 0.6667
+ }
+ },
+ {
+ {
+ 0, 0.83333
+ },
+ {
+ 0.125, 0.83333
+ },
+ {
+ 0.25, 0.83333
+ },
+ {
+ 0.375, 0.83333
+ },
+ {
+ 0.5, 0.83333
+ },
+ {
+ 0.625, 0.83333
+ },
+ {
+ 0.75, 0.83333
+ },
+ {
+ 0.875, 0.83333
+ },
+ {
+ 1.0, 0.83333
+ }
+ },
+ {
+ {
+ 0, 1.0
+ },
+ {
+ 0.125, 1.0
+ },
+ {
+ 0.25, 1.0
+ },
+ {
+ 0.375, 1.0
+ },
+ {
+ 0.5, 1.0
+ },
+ {
+ 0.625, 1.0
+ },
+ {
+ 0.75, 1.0
+ },
+ {
+ 0.875, 1.0
+ },
+ {
+ 1.0, 1.0
+ }
+ }
+};
+
+
+static void SetUpAntiAliasedGrayScale(void)
+{
+ float color;
+ GLint i, j;
+
+ for (i = 0; i < 16; i++) {
+ color = (2 * i + 1) / 32.0;
+ for (j = 0; j < 16; j++) {
+ glutSetColor(i*16+j, color*j/15.0, color*j/15.0, color*j/15.0);
+ }
+ }
+}
+
+static void BendForward(void)
+{
+
+ glTranslatef(0.0, 1.0, 0.0);
+ glRotatef(90.0, 1, 0, 0);
+ glTranslatef(0.0, -1.0, 0.0);
+}
+
+static void BendLeft(void)
+{
+
+ glRotatef(-90.0, 0, 0, 1);
+ glTranslatef(0.0, 1.0, 0.0);
+ glRotatef(90.0, 1, 0, 0);
+ glTranslatef(0.0, -1.0, 0.0);
+}
+
+static void BendRight(void)
+{
+
+ glRotatef(90.0, 0, 0, 1);
+ glTranslatef(0.0, 1.0, 0.0);
+ glRotatef(90.0, 1, 0, 0);
+ glTranslatef(0.0, -1.0, 0.0);
+}
+
+static void BuildSingleCylinder(void)
+{
+
+ glNewList(singleCylinder, GL_COMPILE);
+
+ glBegin(GL_TRIANGLE_STRIP);
+ glNormal3fv(scp[0]); glTexCoord2fv(tscp[0]); glVertex3fv(scp[0]);
+ glNormal3fv(scp[0]); glTexCoord2fv(tscp[1]); glVertex3fv(scp[1]);
+ glNormal3fv(scp[2]); glTexCoord2fv(tscp[2]); glVertex3fv(scp[2]);
+ glNormal3fv(scp[2]); glTexCoord2fv(tscp[3]); glVertex3fv(scp[3]);
+ glNormal3fv(scp[4]); glTexCoord2fv(tscp[4]); glVertex3fv(scp[4]);
+ glNormal3fv(scp[4]); glTexCoord2fv(tscp[5]); glVertex3fv(scp[5]);
+ glNormal3fv(scp[6]); glTexCoord2fv(tscp[6]); glVertex3fv(scp[6]);
+ glNormal3fv(scp[6]); glTexCoord2fv(tscp[7]); glVertex3fv(scp[7]);
+ glNormal3fv(scp[8]); glTexCoord2fv(tscp[8]); glVertex3fv(scp[8]);
+ glNormal3fv(scp[8]); glTexCoord2fv(tscp[9]); glVertex3fv(scp[9]);
+ glNormal3fv(scp[10]); glTexCoord2fv(tscp[10]); glVertex3fv(scp[10]);
+ glNormal3fv(scp[10]); glTexCoord2fv(tscp[11]); glVertex3fv(scp[11]);
+ glNormal3fv(scp[12]); glTexCoord2fv(tscp[12]); glVertex3fv(scp[12]);
+ glNormal3fv(scp[12]); glTexCoord2fv(tscp[13]); glVertex3fv(scp[13]);
+ glNormal3fv(scp[14]); glTexCoord2fv(tscp[14]); glVertex3fv(scp[14]);
+ glNormal3fv(scp[14]); glTexCoord2fv(tscp[15]); glVertex3fv(scp[15]);
+ glNormal3fv(scp[16]); glTexCoord2fv(tscp[16]); glVertex3fv(scp[16]);
+ glNormal3fv(scp[16]); glTexCoord2fv(tscp[17]); glVertex3fv(scp[17]);
+ glEnd();
+
+ glEndList();
+}
+
+static void BuildDoubleCylinder(void)
+{
+
+ glNewList(doubleCylinder, GL_COMPILE);
+
+ glBegin(GL_TRIANGLE_STRIP);
+ glNormal3fv(dcp[0]); glTexCoord2fv(tscp[0]); glVertex3fv(dcp[0]);
+ glNormal3fv(dcp[0]); glTexCoord2fv(tscp[1]); glVertex3fv(dcp[1]);
+ glNormal3fv(dcp[2]); glTexCoord2fv(tscp[2]); glVertex3fv(dcp[2]);
+ glNormal3fv(dcp[2]); glTexCoord2fv(tscp[3]); glVertex3fv(dcp[3]);
+ glNormal3fv(dcp[4]); glTexCoord2fv(tscp[4]); glVertex3fv(dcp[4]);
+ glNormal3fv(dcp[4]); glTexCoord2fv(tscp[5]); glVertex3fv(dcp[5]);
+ glNormal3fv(dcp[6]); glTexCoord2fv(tscp[6]); glVertex3fv(dcp[6]);
+ glNormal3fv(dcp[6]); glTexCoord2fv(tscp[7]); glVertex3fv(dcp[7]);
+ glNormal3fv(dcp[8]); glTexCoord2fv(tscp[8]); glVertex3fv(dcp[8]);
+ glNormal3fv(dcp[8]); glTexCoord2fv(tscp[9]); glVertex3fv(dcp[9]);
+ glNormal3fv(dcp[10]); glTexCoord2fv(tscp[10]); glVertex3fv(dcp[10]);
+ glNormal3fv(dcp[10]); glTexCoord2fv(tscp[11]); glVertex3fv(dcp[11]);
+ glNormal3fv(dcp[12]); glTexCoord2fv(tscp[12]); glVertex3fv(dcp[12]);
+ glNormal3fv(dcp[12]); glTexCoord2fv(tscp[13]); glVertex3fv(dcp[13]);
+ glNormal3fv(dcp[14]); glTexCoord2fv(tscp[14]); glVertex3fv(dcp[14]);
+ glNormal3fv(dcp[14]); glTexCoord2fv(tscp[15]); glVertex3fv(dcp[15]);
+ glNormal3fv(dcp[16]); glTexCoord2fv(tscp[16]); glVertex3fv(dcp[16]);
+ glNormal3fv(dcp[16]); glTexCoord2fv(tscp[17]); glVertex3fv(dcp[17]);
+ glEnd();
+
+ glEndList();
+}
+
+static void BuildElbow(void)
+{
+
+ glNewList(elbow, GL_COMPILE);
+
+ glBegin(GL_TRIANGLE_STRIP);
+ glNormal3fv(en[0][0]); glTexCoord2fv(tep[0][0]); glVertex3fv(ep[0][0]);
+ glNormal3fv(en[1][0]); glTexCoord2fv(tep[1][0]); glVertex3fv(ep[1][0]);
+ glNormal3fv(en[0][1]); glTexCoord2fv(tep[0][1]); glVertex3fv(ep[0][1]);
+ glNormal3fv(en[1][1]); glTexCoord2fv(tep[1][1]); glVertex3fv(ep[1][1]);
+ glNormal3fv(en[0][2]); glTexCoord2fv(tep[0][2]); glVertex3fv(ep[0][2]);
+ glNormal3fv(en[1][2]); glTexCoord2fv(tep[1][2]); glVertex3fv(ep[1][2]);
+ glNormal3fv(en[0][3]); glTexCoord2fv(tep[0][3]); glVertex3fv(ep[0][3]);
+ glNormal3fv(en[1][3]); glTexCoord2fv(tep[1][3]); glVertex3fv(ep[1][3]);
+ glNormal3fv(en[0][4]); glTexCoord2fv(tep[0][4]); glVertex3fv(ep[0][4]);
+ glNormal3fv(en[1][4]); glTexCoord2fv(tep[1][4]); glVertex3fv(ep[1][4]);
+ glNormal3fv(en[0][5]); glTexCoord2fv(tep[0][5]); glVertex3fv(ep[0][5]);
+ glNormal3fv(en[1][5]); glTexCoord2fv(tep[1][5]); glVertex3fv(ep[1][5]);
+ glNormal3fv(en[0][6]); glTexCoord2fv(tep[0][6]); glVertex3fv(ep[0][6]);
+ glNormal3fv(en[1][6]); glTexCoord2fv(tep[1][6]); glVertex3fv(ep[1][6]);
+ glNormal3fv(en[0][7]); glTexCoord2fv(tep[0][7]); glVertex3fv(ep[0][7]);
+ glNormal3fv(en[1][7]); glTexCoord2fv(tep[1][7]); glVertex3fv(ep[1][7]);
+ glNormal3fv(en[0][8]); glTexCoord2fv(tep[0][8]); glVertex3fv(ep[0][8]);
+ glNormal3fv(en[1][8]); glTexCoord2fv(tep[1][8]); glVertex3fv(ep[1][8]);
+ glEnd();
+ glBegin(GL_TRIANGLE_STRIP);
+ glNormal3fv(en[1][0]); glTexCoord2fv(tep[1][0]); glVertex3fv(ep[1][0]);
+ glNormal3fv(en[2][0]); glTexCoord2fv(tep[2][0]); glVertex3fv(ep[2][0]);
+ glNormal3fv(en[1][1]); glTexCoord2fv(tep[1][1]); glVertex3fv(ep[1][1]);
+ glNormal3fv(en[2][1]); glTexCoord2fv(tep[2][1]); glVertex3fv(ep[2][1]);
+ glNormal3fv(en[1][2]); glTexCoord2fv(tep[1][2]); glVertex3fv(ep[1][2]);
+ glNormal3fv(en[2][2]); glTexCoord2fv(tep[2][2]); glVertex3fv(ep[2][2]);
+ glNormal3fv(en[1][3]); glTexCoord2fv(tep[1][3]); glVertex3fv(ep[1][3]);
+ glNormal3fv(en[2][3]); glTexCoord2fv(tep[2][3]); glVertex3fv(ep[2][3]);
+ glNormal3fv(en[1][4]); glTexCoord2fv(tep[1][4]); glVertex3fv(ep[1][4]);
+ glNormal3fv(en[2][4]); glTexCoord2fv(tep[2][4]); glVertex3fv(ep[2][4]);
+ glNormal3fv(en[1][5]); glTexCoord2fv(tep[1][5]); glVertex3fv(ep[1][5]);
+ glNormal3fv(en[2][5]); glTexCoord2fv(tep[2][5]); glVertex3fv(ep[2][5]);
+ glNormal3fv(en[1][6]); glTexCoord2fv(tep[1][6]); glVertex3fv(ep[1][6]);
+ glNormal3fv(en[2][6]); glTexCoord2fv(tep[2][6]); glVertex3fv(ep[2][6]);
+ glNormal3fv(en[1][7]); glTexCoord2fv(tep[1][7]); glVertex3fv(ep[1][7]);
+ glNormal3fv(en[2][7]); glTexCoord2fv(tep[2][7]); glVertex3fv(ep[2][7]);
+ glNormal3fv(en[1][8]); glTexCoord2fv(tep[1][8]); glVertex3fv(ep[1][8]);
+ glNormal3fv(en[2][8]); glTexCoord2fv(tep[2][8]); glVertex3fv(ep[2][8]);
+ glEnd();
+ glBegin(GL_TRIANGLE_STRIP);
+ glNormal3fv(en[2][0]); glTexCoord2fv(tep[2][0]); glVertex3fv(ep[2][0]);
+ glNormal3fv(en[3][0]); glTexCoord2fv(tep[3][0]); glVertex3fv(ep[3][0]);
+ glNormal3fv(en[2][1]); glTexCoord2fv(tep[2][1]); glVertex3fv(ep[2][1]);
+ glNormal3fv(en[3][1]); glTexCoord2fv(tep[3][1]); glVertex3fv(ep[3][1]);
+ glNormal3fv(en[2][2]); glTexCoord2fv(tep[2][2]); glVertex3fv(ep[2][2]);
+ glNormal3fv(en[3][2]); glTexCoord2fv(tep[3][2]); glVertex3fv(ep[3][2]);
+ glNormal3fv(en[2][3]); glTexCoord2fv(tep[2][3]); glVertex3fv(ep[2][3]);
+ glNormal3fv(en[3][3]); glTexCoord2fv(tep[3][3]); glVertex3fv(ep[3][3]);
+ glNormal3fv(en[2][4]); glTexCoord2fv(tep[2][4]); glVertex3fv(ep[2][4]);
+ glNormal3fv(en[3][4]); glTexCoord2fv(tep[3][4]); glVertex3fv(ep[3][4]);
+ glNormal3fv(en[2][5]); glTexCoord2fv(tep[2][5]); glVertex3fv(ep[2][5]);
+ glNormal3fv(en[3][5]); glTexCoord2fv(tep[3][5]); glVertex3fv(ep[3][5]);
+ glNormal3fv(en[2][6]); glTexCoord2fv(tep[2][6]); glVertex3fv(ep[2][6]);
+ glNormal3fv(en[3][6]); glTexCoord2fv(tep[3][6]); glVertex3fv(ep[3][6]);
+ glNormal3fv(en[2][7]); glTexCoord2fv(tep[2][7]); glVertex3fv(ep[2][7]);
+ glNormal3fv(en[3][7]); glTexCoord2fv(tep[3][7]); glVertex3fv(ep[3][7]);
+ glNormal3fv(en[2][8]); glTexCoord2fv(tep[2][8]); glVertex3fv(ep[2][8]);
+ glNormal3fv(en[3][8]); glTexCoord2fv(tep[3][8]); glVertex3fv(ep[3][8]);
+ glEnd();
+ glBegin(GL_TRIANGLE_STRIP);
+ glNormal3fv(en[3][0]); glTexCoord2fv(tep[3][0]); glVertex3fv(ep[3][0]);
+ glNormal3fv(en[4][0]); glTexCoord2fv(tep[4][0]); glVertex3fv(ep[4][0]);
+ glNormal3fv(en[3][1]); glTexCoord2fv(tep[3][1]); glVertex3fv(ep[3][1]);
+ glNormal3fv(en[4][1]); glTexCoord2fv(tep[4][1]); glVertex3fv(ep[4][1]);
+ glNormal3fv(en[3][2]); glTexCoord2fv(tep[3][2]); glVertex3fv(ep[3][2]);
+ glNormal3fv(en[4][2]); glTexCoord2fv(tep[4][2]); glVertex3fv(ep[4][2]);
+ glNormal3fv(en[3][3]); glTexCoord2fv(tep[3][3]); glVertex3fv(ep[3][3]);
+ glNormal3fv(en[4][3]); glTexCoord2fv(tep[4][3]); glVertex3fv(ep[4][3]);
+ glNormal3fv(en[3][4]); glTexCoord2fv(tep[3][4]); glVertex3fv(ep[3][4]);
+ glNormal3fv(en[4][4]); glTexCoord2fv(tep[4][4]); glVertex3fv(ep[4][4]);
+ glNormal3fv(en[3][5]); glTexCoord2fv(tep[3][5]); glVertex3fv(ep[3][5]);
+ glNormal3fv(en[4][5]); glTexCoord2fv(tep[4][5]); glVertex3fv(ep[4][5]);
+ glNormal3fv(en[3][6]); glTexCoord2fv(tep[3][6]); glVertex3fv(ep[3][6]);
+ glNormal3fv(en[4][6]); glTexCoord2fv(tep[4][6]); glVertex3fv(ep[4][6]);
+ glNormal3fv(en[3][7]); glTexCoord2fv(tep[3][7]); glVertex3fv(ep[3][7]);
+ glNormal3fv(en[4][7]); glTexCoord2fv(tep[4][7]); glVertex3fv(ep[4][7]);
+ glNormal3fv(en[3][8]); glTexCoord2fv(tep[3][8]); glVertex3fv(ep[3][8]);
+ glNormal3fv(en[4][8]); glTexCoord2fv(tep[4][8]); glVertex3fv(ep[4][8]);
+ glEnd();
+ glBegin(GL_TRIANGLE_STRIP);
+ glNormal3fv(en[4][0]); glTexCoord2fv(tep[4][0]); glVertex3fv(ep[4][0]);
+ glNormal3fv(en[5][0]); glTexCoord2fv(tep[5][0]); glVertex3fv(ep[5][0]);
+ glNormal3fv(en[4][1]); glTexCoord2fv(tep[4][1]); glVertex3fv(ep[4][1]);
+ glNormal3fv(en[5][1]); glTexCoord2fv(tep[5][1]); glVertex3fv(ep[5][1]);
+ glNormal3fv(en[4][2]); glTexCoord2fv(tep[4][2]); glVertex3fv(ep[4][2]);
+ glNormal3fv(en[5][2]); glTexCoord2fv(tep[5][2]); glVertex3fv(ep[5][2]);
+ glNormal3fv(en[4][3]); glTexCoord2fv(tep[4][3]); glVertex3fv(ep[4][3]);
+ glNormal3fv(en[5][3]); glTexCoord2fv(tep[5][3]); glVertex3fv(ep[5][3]);
+ glNormal3fv(en[4][4]); glTexCoord2fv(tep[4][4]); glVertex3fv(ep[4][4]);
+ glNormal3fv(en[5][4]); glTexCoord2fv(tep[5][4]); glVertex3fv(ep[5][4]);
+ glNormal3fv(en[4][5]); glTexCoord2fv(tep[4][5]); glVertex3fv(ep[4][5]);
+ glNormal3fv(en[5][5]); glTexCoord2fv(tep[5][5]); glVertex3fv(ep[5][5]);
+ glNormal3fv(en[4][6]); glTexCoord2fv(tep[4][6]); glVertex3fv(ep[4][6]);
+ glNormal3fv(en[5][6]); glTexCoord2fv(tep[5][6]); glVertex3fv(ep[5][6]);
+ glNormal3fv(en[4][7]); glTexCoord2fv(tep[4][7]); glVertex3fv(ep[4][7]);
+ glNormal3fv(en[5][7]); glTexCoord2fv(tep[5][7]); glVertex3fv(ep[5][7]);
+ glNormal3fv(en[4][8]); glTexCoord2fv(tep[4][8]); glVertex3fv(ep[4][8]);
+ glNormal3fv(en[5][8]); glTexCoord2fv(tep[5][8]); glVertex3fv(ep[5][8]);
+ glEnd();
+ glBegin(GL_TRIANGLE_STRIP);
+ glNormal3fv(en[5][0]); glTexCoord2fv(tep[5][0]); glVertex3fv(ep[5][0]);
+ glNormal3fv(en[6][0]); glTexCoord2fv(tep[6][0]); glVertex3fv(ep[6][0]);
+ glNormal3fv(en[5][1]); glTexCoord2fv(tep[5][1]); glVertex3fv(ep[5][1]);
+ glNormal3fv(en[6][1]); glTexCoord2fv(tep[6][1]); glVertex3fv(ep[6][1]);
+ glNormal3fv(en[5][2]); glTexCoord2fv(tep[5][2]); glVertex3fv(ep[5][2]);
+ glNormal3fv(en[6][2]); glTexCoord2fv(tep[6][2]); glVertex3fv(ep[6][2]);
+ glNormal3fv(en[5][3]); glTexCoord2fv(tep[5][3]); glVertex3fv(ep[5][3]);
+ glNormal3fv(en[6][3]); glTexCoord2fv(tep[6][3]); glVertex3fv(ep[6][3]);
+ glNormal3fv(en[5][4]); glTexCoord2fv(tep[5][4]); glVertex3fv(ep[5][4]);
+ glNormal3fv(en[6][4]); glTexCoord2fv(tep[6][4]); glVertex3fv(ep[6][4]);
+ glNormal3fv(en[5][5]); glTexCoord2fv(tep[5][5]); glVertex3fv(ep[5][5]);
+ glNormal3fv(en[6][5]); glTexCoord2fv(tep[6][5]); glVertex3fv(ep[6][5]);
+ glNormal3fv(en[5][6]); glTexCoord2fv(tep[5][6]); glVertex3fv(ep[5][6]);
+ glNormal3fv(en[6][6]); glTexCoord2fv(tep[6][6]); glVertex3fv(ep[6][6]);
+ glNormal3fv(en[5][7]); glTexCoord2fv(tep[5][7]); glVertex3fv(ep[5][7]);
+ glNormal3fv(en[6][7]); glTexCoord2fv(tep[6][7]); glVertex3fv(ep[6][7]);
+ glNormal3fv(en[5][8]); glTexCoord2fv(tep[5][8]); glVertex3fv(ep[5][8]);
+ glNormal3fv(en[6][8]); glTexCoord2fv(tep[6][8]); glVertex3fv(ep[6][8]);
+ glEnd();
+
+ glEndList();
+}
+
+static void BuildLogo(void)
+{
+
+ glNewList(logo, GL_COMPILE);
+
+ glTranslatef(5.5, -3.5, 4.5);
+ glTranslatef(0.0, 0.0, -7.0);
+ glCallList(doubleCylinder);
+ BendForward();
+ glCallList(elbow);
+ glTranslatef(0.0, 0.0, -7.0);
+ glCallList(doubleCylinder);
+ BendForward();
+ glCallList(elbow);
+ glTranslatef(0.0, 0.0, -5.0);
+ glCallList(singleCylinder);
+ BendRight();
+ glCallList(elbow);
+ glTranslatef(0.0, 0.0, -7.0);
+ glCallList(doubleCylinder);
+ BendForward();
+ glCallList(elbow);
+ glTranslatef(0.0, 0.0, -7.0);
+ glCallList(doubleCylinder);
+ BendForward();
+ glCallList(elbow);
+ glTranslatef(0.0, 0.0, -5.0);
+ glCallList(singleCylinder);
+ BendLeft();
+ glCallList(elbow);
+ glTranslatef(0.0, 0.0, -7.0);
+ glCallList(doubleCylinder);
+ BendForward();
+ glCallList(elbow);
+ glTranslatef(0.0, 0.0, -7.0);
+ glCallList(doubleCylinder);
+ BendForward();
+ glCallList(elbow);
+ glTranslatef(0.0, 0.0, -5.0);
+ glCallList(singleCylinder);
+ BendRight();
+ glCallList(elbow);
+ glTranslatef(0.0, 0.0, -7.0);
+ glCallList(doubleCylinder);
+ BendForward();
+ glCallList(elbow);
+ glTranslatef(0.0, 0.0, -7.0);
+ glCallList(doubleCylinder);
+ BendForward();
+ glCallList(elbow);
+ glTranslatef(0.0, 0.0, -5.0);
+ glCallList(singleCylinder);
+ BendLeft();
+ glCallList(elbow);
+ glTranslatef(0.0, 0.0, -7.0);
+ glCallList(doubleCylinder);
+ BendForward();
+ glCallList(elbow);
+ glTranslatef(0.0, 0.0, -7.0);
+ glCallList(doubleCylinder);
+ BendForward();
+ glCallList(elbow);
+ glTranslatef(0.0, 0.0, -5.0);
+ glCallList(singleCylinder);
+ BendRight();
+ glCallList(elbow);
+ glTranslatef(0.0, 0.0, -7.0);
+ glCallList(doubleCylinder);
+ BendForward();
+ glCallList(elbow);
+ glTranslatef(0.0, 0.0, -7.0);
+ glCallList(doubleCylinder);
+ BendForward();
+ glCallList(elbow);
+ glTranslatef(0.0, 0.0, -5.0);
+ glCallList(singleCylinder);
+ BendLeft();
+ glCallList(elbow);
+
+ glEndList();
+}
+
+static void BuildLists(void)
+{
+
+ singleCylinder = glGenLists(1);
+ doubleCylinder = glGenLists(1);
+ elbow = glGenLists(1);
+ logo = glGenLists(1);
+
+ BuildSingleCylinder();
+ BuildDoubleCylinder();
+ BuildElbow();
+ BuildLogo();
+}
+
+static void Init(void)
+{
+ static float ambient[] = {0.1, 0.1, 0.1, 1.0};
+ static float diffuse[] = {0.5, 1.0, 1.0, 1.0};
+ static float position[] = {90.0, 90.0, 150.0, 0.0};
+ static float front_mat_shininess[] = {30.0};
+ static float front_mat_specular[] = {0.2, 0.2, 0.2, 1.0};
+ static float front_mat_diffuse[] = {0.5, 0.28, 0.38, 1.0};
+ static float back_mat_shininess[] = {50.0};
+ static float back_mat_specular[] = {0.5, 0.5, 0.2, 1.0};
+ static float back_mat_diffuse[] = {1.0, 1.0, 0.2, 1.0};
+ static float lmodel_ambient[] = {1.0, 1.0, 1.0, 1.0};
+ static float lmodel_twoside[] = {GL_TRUE};
+
+ glClearColor(0.0, 0.0, 0.0, 0.0);
+
+ glFrontFace(GL_CW);
+
+ glEnable(GL_DEPTH_TEST);
+
+ glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+ glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+ glLightfv(GL_LIGHT0, GL_POSITION, position);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+
+ glMaterialfv(GL_FRONT, GL_SHININESS, front_mat_shininess);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, front_mat_specular);
+ glMaterialfv(GL_FRONT, GL_DIFFUSE, front_mat_diffuse);
+ glMaterialfv(GL_BACK, GL_SHININESS, back_mat_shininess);
+ glMaterialfv(GL_BACK, GL_SPECULAR, back_mat_specular);
+ glMaterialfv(GL_BACK, GL_DIFFUSE, back_mat_diffuse);
+
+ glEnable(GL_CLIP_PLANE0);
+
+ if (rgb) {
+ glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, decal);
+ glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, repeat);
+ glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, repeat);
+ glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, nearest);
+ glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, nearest);
+ glTexImage2D(GL_TEXTURE_2D, 0, 3, CHECKIMAGEWIDTH, CHECKIMAGEHEIGHT, 0,
+ GL_RGB, GL_UNSIGNED_BYTE, (GLvoid *)checkImage);
+ glEnable(GL_TEXTURE_2D);
+
+ glCullFace(GL_BACK);
+ glEnable(GL_CULL_FACE);
+ } else {
+ SetGreyRamp();
+ /* commented out by BrianP because it's the wrong way to handle a 4-bit visual!
+ if (doubleBuffer) {
+ colorIndexes[1] = 10;
+ colorIndexes[2] = 15;
+ }
+ */
+ glMaterialiv(GL_FRONT_AND_BACK, GL_COLOR_INDEXES, colorIndexes);
+ }
+
+ BuildLists();
+
+ dithering = GL_TRUE;
+ shade = GL_TRUE;
+ doStipple = GL_FALSE;
+ polyMode = GL_BACK;
+}
+
+static void Reshape(int width, int height)
+{
+ glViewport(0, 0, (GLint)width, (GLint)height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(90, 1.0, 1.0, 200.0);
+ glMatrixMode(GL_MODELVIEW);
+}
+
+static void Key2(int key, int x, int y)
+{
+ (void) x;
+ (void) y;
+ switch (key) {
+ case GLUT_KEY_LEFT:
+ yRotation += 0.5;
+ break;
+ case GLUT_KEY_RIGHT:
+ yRotation -= 0.5;
+ break;
+ case GLUT_KEY_UP:
+ plane[3] += 2.0;
+ break;
+ case GLUT_KEY_DOWN:
+ plane[3] -= 2.0;
+ break;
+ default:
+ return;
+ }
+
+ glutPostRedisplay();
+}
+
+static void Key(unsigned char key, int x, int y)
+{
+ (void) x;
+ (void) y;
+ switch (key) {
+ case 27:
+ exit(1);
+
+ case 'Z':
+ zTranslation -= 1.0;
+ break;
+ case 'z':
+ zTranslation += 1.0;
+ break;
+
+ case '1':
+ glPolygonMode(polyMode, GL_POINT);
+ break;
+ case '2':
+ glPolygonMode(polyMode, GL_LINE);
+ break;
+ case '3':
+ glPolygonMode(polyMode, GL_FILL);
+ break;
+ case 'p':
+ switch (polyMode) {
+ case GL_BACK:
+ polyMode = GL_FRONT;
+ printf("PolygonMode GL_FRONT\n");
+ break;
+ case GL_FRONT:
+ polyMode = GL_FRONT_AND_BACK;
+ printf("PolygonMode GL_FRONT_AND_BACK\n");
+ break;
+ case GL_FRONT_AND_BACK:
+ polyMode = GL_BACK;
+ printf("PolygonMode GL_BACK\n");
+ break;
+ default:
+ break;
+ }
+ break;
+
+ case '4':
+ glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST);
+ break;
+ case '5':
+ glEnable(GL_POLYGON_SMOOTH);
+ if (rgb) {
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE);
+ glEnable(GL_BLEND);
+ glDisable(GL_DEPTH_TEST);
+ } else {
+ SetUpAntiAliasedGrayScale();
+ }
+ break;
+ case '6':
+ glDisable(GL_POLYGON_SMOOTH);
+ if (rgb) {
+ glBlendFunc(GL_ONE, GL_ZERO);
+ glDisable(GL_BLEND);
+ glEnable(GL_DEPTH_TEST);
+ } else {
+ SetGreyRamp();
+ }
+ break;
+
+ case '8':
+ dithering = !dithering;
+ (dithering) ? glEnable(GL_DITHER) : glDisable(GL_DITHER);
+ break;
+
+ case '9':
+ doStipple = !doStipple;
+ if (doStipple) {
+ glPolygonStipple(stipple);
+ glEnable(GL_POLYGON_STIPPLE);
+ } else {
+ glDisable(GL_POLYGON_STIPPLE);
+ }
+ break;
+
+ case '0':
+ shade = !shade;
+ (shade) ? glShadeModel(GL_SMOOTH) : glShadeModel(GL_FLAT);
+ break;
+
+ case 'q':
+ glDisable(GL_CULL_FACE);
+ printf("disable culling\n");
+ break;
+ case 'w':
+ glEnable(GL_CULL_FACE);
+ glCullFace(GL_FRONT);
+ printf("enable front face culling\n");
+ break;
+ case 'e':
+ glEnable(GL_CULL_FACE);
+ glCullFace(GL_BACK);
+ printf("enable back face culling\n");
+ break;
+
+ case 'r':
+ glFrontFace(GL_CW);
+ break;
+ case 't':
+ glFrontFace(GL_CCW);
+ break;
+ case 'y':
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ glPixelStorei(GL_UNPACK_LSB_FIRST, 0);
+ glPolygonStipple(stipple);
+ break;
+ case 'u':
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ glPixelStorei(GL_UNPACK_LSB_FIRST, 1);
+ glPolygonStipple(stipple);
+ break;
+
+ case 'a':
+ glEnable(GL_TEXTURE_2D);
+ glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, repeat);
+ glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, repeat);
+ glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, nearest);
+ glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, nearest);
+ glTexImage2D(GL_TEXTURE_2D, 0, 4, BRICKIMAGEWIDTH,
+ BRICKIMAGEHEIGHT, 0, GL_RGBA, GL_UNSIGNED_BYTE,
+ (GLvoid *)brickImage);
+ break;
+ case 's':
+ glEnable(GL_TEXTURE_2D);
+ glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, repeat);
+ glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, repeat);
+ glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, nearest);
+ glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, nearest);
+ glTexImage2D(GL_TEXTURE_2D, 0, 3, CHECKIMAGEWIDTH,
+ CHECKIMAGEHEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE,
+ (GLvoid *)checkImage);
+ break;
+ case 'd':
+ glDisable(GL_TEXTURE_2D);
+ break;
+
+ case 'f':
+ glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, decal);
+ break;
+ case 'g':
+ glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, modulate);
+ break;
+
+ case 'n':
+ /* added by BrianP */
+ noDraw = !noDraw;
+ if (noDraw) {
+ glDrawBuffer( GL_NONE );
+ }
+ else {
+ if (doubleBuffer) {
+ glDrawBuffer( GL_BACK );
+ }
+ else {
+ glDrawBuffer( GL_FRONT );
+ }
+ }
+ break;
+
+ case 'l':
+ /* Line Smooth - added by BrianP */
+ LineSmooth = !LineSmooth;
+ if (LineSmooth) {
+ glEnable(GL_LINE_SMOOTH);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_BLEND);
+ }
+ else {
+ glDisable(GL_LINE_SMOOTH);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glDisable(GL_BLEND);
+ }
+ break;
+ default:
+ return;
+ }
+
+ glutPostRedisplay();
+}
+
+static void Draw(void)
+{
+
+ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix();
+
+ glTranslatef(0, 0, zTranslation);
+ glRotatef(30.0, 1, 0, 0);
+ glRotatef(yRotation, 0, 1, 0);
+ glClipPlane(GL_CLIP_PLANE0, plane);
+ glCallList(logo);
+
+ glPopMatrix();
+
+ glFlush();
+
+ if (doubleBuffer) {
+ glutSwapBuffers();
+ }
+}
+
+static GLenum Args(int argc, char **argv)
+{
+ GLint i;
+
+ rgb = GL_TRUE;
+ doubleBuffer = GL_FALSE;
+
+ for (i = 1; i < argc; i++) {
+ if (strcmp(argv[i], "-ci") == 0) {
+ rgb = GL_FALSE;
+ } else if (strcmp(argv[i], "-rgb") == 0) {
+ rgb = GL_TRUE;
+ } else if (strcmp(argv[i], "-sb") == 0) {
+ doubleBuffer = GL_FALSE;
+ } else if (strcmp(argv[i], "-db") == 0) {
+ doubleBuffer = GL_TRUE;
+ } else {
+ printf("%s (Bad option).\n", argv[i]);
+ return GL_FALSE;
+ }
+ }
+ return GL_TRUE;
+}
+
+int main(int argc, char **argv)
+{
+ unsigned int type;
+
+ glutInit(&argc, argv);
+
+ if (Args(argc, argv) == GL_FALSE) {
+ exit(1);
+ }
+
+ glutInitWindowPosition(0, 0); glutInitWindowSize( 300, 300);
+
+ type = GLUT_DEPTH;
+ type |= (rgb) ? GLUT_RGB : GLUT_INDEX;
+ type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
+ glutInitDisplayMode(type);
+
+ if (glutCreateWindow("Logo Test") == GL_FALSE) {
+ exit(1);
+ }
+
+ InitMap();
+
+ Init();
+
+ glutReshapeFunc(Reshape);
+ glutKeyboardFunc(Key);
+ glutSpecialFunc(Key2);
+ glutDisplayFunc(Draw);
+ glutMainLoop();
+ return 0;
+}
diff --git a/progs/samples/nurb.c b/progs/samples/nurb.c
new file mode 100644
index 00000000000..dc8991295e8
--- /dev/null
+++ b/progs/samples/nurb.c
@@ -0,0 +1,357 @@
+/*
+ * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the name of
+ * Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF
+ * ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include <GL/glut.h>
+
+
+#ifndef CALLBACK
+#define CALLBACK
+#endif
+
+
+#define INREAL float
+
+#define S_NUMPOINTS 13
+#define S_ORDER 3
+#define S_NUMKNOTS (S_NUMPOINTS + S_ORDER)
+#define T_NUMPOINTS 3
+#define T_ORDER 3
+#define T_NUMKNOTS (T_NUMPOINTS + T_ORDER)
+#define SQRT_TWO 1.41421356237309504880
+
+
+typedef INREAL Point[4];
+
+
+GLenum doubleBuffer;
+
+GLenum expectedError;
+GLint rotX = 40, rotY = 40;
+INREAL sknots[S_NUMKNOTS] = {
+ -1.0, -1.0, -1.0, 0.0, 1.0, 2.0, 3.0, 4.0,
+ 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 9.0, 9.0
+};
+INREAL tknots[T_NUMKNOTS] = {
+ 1.0, 1.0, 1.0, 2.0, 2.0, 2.0
+};
+Point ctlpoints[S_NUMPOINTS][T_NUMPOINTS] = {
+ {
+ {
+ 4.0, 2.0, 2.0, 1.0
+ },
+ {
+ 4.0, 1.6, 2.5, 1.0
+ },
+ {
+ 4.0, 2.0, 3.0, 1.0
+ }
+ },
+ {
+ {
+ 5.0, 4.0, 2.0, 1.0
+ },
+ {
+ 5.0, 4.0, 2.5, 1.0
+ },
+ {
+ 5.0, 4.0, 3.0, 1.0
+ }
+ },
+ {
+ {
+ 6.0, 5.0, 2.0, 1.0
+ },
+ {
+ 6.0, 5.0, 2.5, 1.0
+ },
+ {
+ 6.0, 5.0, 3.0, 1.0
+ }
+ },
+ {
+ {
+ SQRT_TWO*6.0, SQRT_TWO*6.0, SQRT_TWO*2.0, SQRT_TWO
+ },
+ {
+ SQRT_TWO*6.0, SQRT_TWO*6.0, SQRT_TWO*2.5, SQRT_TWO
+ },
+ {
+ SQRT_TWO*6.0, SQRT_TWO*6.0, SQRT_TWO*3.0, SQRT_TWO
+ }
+ },
+ {
+ {
+ 5.2, 6.7, 2.0, 1.0
+ },
+ {
+ 5.2, 6.7, 2.5, 1.0
+ },
+ {
+ 5.2, 6.7, 3.0, 1.0
+ }
+ },
+ {
+ {
+ SQRT_TWO*4.0, SQRT_TWO*6.0, SQRT_TWO*2.0, SQRT_TWO
+ },
+ {
+ SQRT_TWO*4.0, SQRT_TWO*6.0, SQRT_TWO*2.5, SQRT_TWO
+ },
+ {
+ SQRT_TWO*4.0, SQRT_TWO*6.0, SQRT_TWO*3.0, SQRT_TWO
+ }
+ },
+ {
+ {
+ 4.0, 5.2, 2.0, 1.0
+ },
+ {
+ 4.0, 4.6, 2.5, 1.0
+ },
+ {
+ 4.0, 5.2, 3.0, 1.0
+ }
+ },
+ {
+ {
+ SQRT_TWO*4.0, SQRT_TWO*6.0, SQRT_TWO*2.0, SQRT_TWO
+ },
+ {
+ SQRT_TWO*4.0, SQRT_TWO*6.0, SQRT_TWO*2.5, SQRT_TWO
+ },
+ {
+ SQRT_TWO*4.0, SQRT_TWO*6.0, SQRT_TWO*3.0, SQRT_TWO
+ }
+ },
+ {
+ {
+ 2.8, 6.7, 2.0, 1.0
+ },
+ {
+ 2.8, 6.7, 2.5, 1.0
+ },
+ {
+ 2.8, 6.7, 3.0, 1.0
+ }
+ },
+ {
+ {
+ SQRT_TWO*2.0, SQRT_TWO*6.0, SQRT_TWO*2.0, SQRT_TWO
+ },
+ {
+ SQRT_TWO*2.0, SQRT_TWO*6.0, SQRT_TWO*2.5, SQRT_TWO
+ },
+ {
+ SQRT_TWO*2.0, SQRT_TWO*6.0, SQRT_TWO*3.0, SQRT_TWO
+ }
+ },
+ {
+ {
+ 2.0, 5.0, 2.0, 1.0
+ },
+ {
+ 2.0, 5.0, 2.5, 1.0
+ },
+ {
+ 2.0, 5.0, 3.0, 1.0
+ }
+ },
+ {
+ {
+ 3.0, 4.0, 2.0, 1.0
+ },
+ {
+ 3.0, 4.0, 2.5, 1.0
+ },
+ {
+ 3.0, 4.0, 3.0, 1.0
+ }
+ },
+ {
+ {
+ 4.0, 2.0, 2.0, 1.0
+ },
+ {
+ 4.0, 1.6, 2.5, 1.0
+ },
+ {
+ 4.0, 2.0, 3.0, 1.0
+ }
+ }
+};
+GLUnurbsObj *theNurbs;
+
+
+static void CALLBACK ErrorCallback(GLenum which)
+{
+
+ if (which != expectedError) {
+ fprintf(stderr, "Unexpected error occured (%d):\n", which);
+ fprintf(stderr, " %s\n", (char *) gluErrorString(which));
+ }
+}
+
+typedef void (GLAPIENTRY *callback_t)();
+
+static void Init(void)
+{
+
+ theNurbs = gluNewNurbsRenderer();
+ gluNurbsCallback(theNurbs, GLU_ERROR, (callback_t) ErrorCallback);
+
+ gluNurbsProperty(theNurbs, GLU_SAMPLING_TOLERANCE, 15.0);
+ gluNurbsProperty(theNurbs, GLU_DISPLAY_MODE, GLU_OUTLINE_PATCH);
+
+ expectedError = GLU_INVALID_ENUM;
+ gluNurbsProperty(theNurbs, ~0, 15.0);
+ expectedError = GLU_NURBS_ERROR13;
+ gluEndSurface(theNurbs);
+ expectedError = 0;
+
+ glColor3f(1.0, 1.0, 1.0);
+}
+
+static void Reshape(int width, int height)
+{
+
+ glViewport(0, 0, (GLint)width, (GLint)height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glFrustum(-2.0, 2.0, -2.0, 2.0, 0.8, 10.0);
+ gluLookAt(7.0, 4.5, 4.0, 4.5, 4.5, 2.5, 6.0, -3.0, 2.0);
+ glMatrixMode(GL_MODELVIEW);
+}
+
+static void Key2(int key, int x, int y)
+{
+
+ switch (key) {
+ case GLUT_KEY_DOWN:
+ rotX -= 5;
+ break;
+ case GLUT_KEY_UP:
+ rotX += 5;
+ break;
+ case GLUT_KEY_LEFT:
+ rotY -= 5;
+ break;
+ case GLUT_KEY_RIGHT:
+ rotY += 5;
+ break;
+ default:
+ return;
+ }
+
+ glutPostRedisplay();
+}
+
+static void Key(unsigned char key, int x, int y)
+{
+
+ switch (key) {
+ case 27:
+ exit(1);
+ }
+}
+
+static void Draw(void)
+{
+
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ glPushMatrix();
+
+ glTranslatef(4.0, 4.5, 2.5);
+ glRotatef(rotY, 1, 0, 0);
+ glRotatef(rotX, 0, 1, 0);
+ glTranslatef(-4.0, -4.5, -2.5);
+
+ gluBeginSurface(theNurbs);
+ gluNurbsSurface(theNurbs, S_NUMKNOTS, sknots, T_NUMKNOTS, tknots,
+ 4*T_NUMPOINTS, 4, &ctlpoints[0][0][0], S_ORDER,
+ T_ORDER, GL_MAP2_VERTEX_4);
+ gluEndSurface(theNurbs);
+
+ glPopMatrix();
+
+ glFlush();
+
+ if (doubleBuffer) {
+ glutSwapBuffers();
+ }
+}
+
+static GLenum Args(int argc, char **argv)
+{
+ GLint i;
+
+ doubleBuffer = GL_FALSE;
+
+ for (i = 1; i < argc; i++) {
+ if (strcmp(argv[i], "-sb") == 0) {
+ doubleBuffer = GL_FALSE;
+ } else if (strcmp(argv[i], "-db") == 0) {
+ doubleBuffer = GL_TRUE;
+ } else {
+ printf("%s (Bad option).\n", argv[i]);
+ return GL_FALSE;
+ }
+ }
+ return GL_TRUE;
+}
+
+int main(int argc, char **argv)
+{
+ GLenum type;
+
+ glutInit(&argc, argv);
+
+ if (Args(argc, argv) == GL_FALSE) {
+ exit(1);
+ }
+
+ glutInitWindowPosition(0, 0); glutInitWindowSize( 300, 300);
+
+ type = GLUT_RGB;
+ type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
+ glutInitDisplayMode(type);
+
+ if (glutCreateWindow("NURBS Test") == GL_FALSE) {
+ exit(1);
+ }
+
+ Init();
+
+ glutReshapeFunc(Reshape);
+ glutKeyboardFunc(Key);
+ glutSpecialFunc(Key2);
+ glutDisplayFunc(Draw);
+ glutMainLoop();
+ return 0;
+}
diff --git a/progs/samples/oglinfo.c b/progs/samples/oglinfo.c
new file mode 100644
index 00000000000..4fe51efb3cb
--- /dev/null
+++ b/progs/samples/oglinfo.c
@@ -0,0 +1,218 @@
+/* oglinfo.c */
+
+/* This demo modified by BrianP to accomodate Mesa and test
+ * the GLX 1.1 functions.
+ */
+
+
+
+#include <GL/gl.h>
+#include <GL/glx.h>
+#include <GL/glu.h>
+#include <stdio.h>
+#include <string.h>
+
+int visual_request0[] = { None }; /* don't need much of a visual */
+int visual_request1[] = { GLX_RGBA, None }; /* in case CI failed */
+
+int main(int argc, char **argv)
+{
+ char *display_name = NULL;
+ char *string;
+ Display *dpy;
+ int screen_num;
+ int major, minor;
+ XVisualInfo *vis;
+ GLXContext ctx;
+ Window root, win;
+ Colormap cmap;
+ XSetWindowAttributes swa;
+ int dontcare;
+
+ /* parse arguments */
+ if(argc > 1) {
+ if(!strcmp(argv[1],"-display"))
+ display_name = argv[2];
+ else {
+ fprintf(stderr, "Usage: %s [-display <display>]\n",argv[0]);
+ return 0;
+ }
+ }
+
+ /* get display */
+ if (!(dpy = XOpenDisplay(display_name))) {
+ fprintf(stderr,"Error: XOpenDisplay() failed.\n");
+ return 1;
+ }
+
+ /* does the server know about OpenGL & GLX? */
+#ifndef MESA
+ if(!XQueryExtension(dpy, "GLX", &dontcare, &dontcare, &dontcare)) {
+ fprintf(stderr,"This system doesn't appear to support OpenGL\n");
+ return 1;
+ }
+#else
+ (void) dontcare;
+#endif
+
+ /* find the glx version */
+ if(glXQueryVersion(dpy, &major, &minor))
+ printf("GLX Version: %d.%d\n", major, minor);
+ else {
+ fprintf(stderr, "Error: glXQueryVersion() failed.\n");
+ return 1;
+ }
+
+ /* get screen number */
+ screen_num = DefaultScreen(dpy);
+
+/* This #ifdef isn't redundant. It keeps the build from breaking
+** if you are building on a machine that has an old (1.0) version
+** of glx.
+**
+** This program could still be *run* on a machine that has an old
+** version of glx, even if it was *compiled* on a version that has
+** a new version.
+**
+** If compiled on a system with an old version of glx, then it will
+** never recognize glx extensions, since that code would have been
+** #ifdef'ed out.
+*/
+#ifdef GLX_VERSION_1_1
+
+ /*
+ ** This test guarantees that glx, on the display you are inquiring,
+ ** suppports glXQueryExtensionsString().
+ */
+ if(minor > 0 || major > 1)
+ string = (char *) glXQueryExtensionsString(dpy, screen_num);
+ else
+ string = "";
+
+ if(string)
+ printf("GLX Extensions (client & server): %s\n",
+ string);
+ else {
+ fprintf(stderr, "Error: glXQueryExtensionsString() failed.\n");
+ return 1;
+ }
+
+ if (minor>0 || major>1) {
+ printf("glXGetClientString(GLX_VENDOR): %s\n", glXGetClientString(dpy,GLX_VENDOR));
+ printf("glXGetClientString(GLX_VERSION): %s\n", glXGetClientString(dpy,GLX_VERSION));
+ printf("glXGetClientString(GLX_EXTENSIONS): %s\n", glXGetClientString(dpy,GLX_EXTENSIONS));
+ printf("glXQueryServerString(GLX_VENDOR): %s\n", glXQueryServerString(dpy,screen_num,GLX_VENDOR));
+ printf("glXQueryServerString(GLX_VERSION): %s\n", glXQueryServerString(dpy,screen_num,GLX_VERSION));
+ printf("glXQueryServerString(GLX_EXTENSIONS): %s\n", glXQueryServerString(dpy,screen_num,GLX_EXTENSIONS));
+ }
+
+
+#endif
+
+ /* get any valid OpenGL visual */
+ if (!(vis = glXChooseVisual(dpy, screen_num, visual_request0))) {
+ if (!(vis = glXChooseVisual(dpy, screen_num, visual_request1))) {
+ fprintf(stderr,"Error: glXChooseVisual() failed.\n");
+ return 1;
+ }
+ }
+
+ /* get context */
+ ctx = glXCreateContext(dpy,vis,0,GL_TRUE);
+
+ /* root window */
+ root = RootWindow(dpy,vis->screen);
+
+ /* get RGBA colormap */
+ cmap = XCreateColormap(dpy, root, vis->visual, AllocNone);
+
+ /* get window */
+ swa.colormap = cmap;
+ swa.border_pixel = 0;
+ swa.event_mask = StructureNotifyMask;
+ win = XCreateWindow(dpy, root, 0, 0, 1, 1, 0, vis->depth,
+ InputOutput,vis->visual,
+ CWBorderPixel|CWColormap|CWEventMask,
+ &swa);
+
+ glXMakeCurrent(dpy,win,ctx);
+
+ string = (char *) glGetString(GL_VERSION);
+ if(string)
+#ifdef MESA
+ printf("Mesa Version: %s\n", string);
+#else
+ printf("OpenGL Version: %s\n", string);
+#endif
+ else {
+ fprintf(stderr, "Error: glGetString(GL_VERSION) failed.\n");
+ return 1;
+ }
+
+ string = (char *) glGetString(GL_EXTENSIONS);
+
+ if(string)
+#ifdef MESA
+ printf("Mesa Extensions: %s\n", string);
+#else
+ printf("OpenGL Extensions: %s\n", string);
+#endif
+ else {
+ fprintf(stderr, "Error: glGetString(GL_EXTENSIONS) failed.\n");
+ return 1;
+ }
+
+ string = (char *) glGetString(GL_RENDERER);
+
+ if(string)
+#ifdef MESA
+ printf("Mesa Renderer: %s\n", string);
+#else
+ printf("OpenGL renderer: %s\n", string);
+#endif
+ else {
+ fprintf(stderr, "Error: glGetString(GL_RENDERER) failed.\n");
+ return 1;
+ }
+
+/*
+** This #ifdef prevents a build failure if you compile on an a
+** machine with an old GLU library.
+**
+** If you build on a pre GLU 1.1 machine, you will never be able
+** to get glu info, even if you run on a GLU 1.1 or latter machine,
+** since the code has been #ifdef'ed out.
+*/
+#ifdef GLU_VERSION_1_1
+
+ /*
+ ** If the glx version is 1.1 or latter, gluGetString() is guaranteed
+ ** to exist.
+ */
+ if(minor > 0 || major > 1)
+ string = (char *) gluGetString(GLU_VERSION);
+ else
+ string = "1.0";
+
+ if(string)
+ printf("GLU Version: %s\n", string);
+ else {
+ fprintf(stderr, "Error: gluGetString(GLU_VERSION) failed.\n");
+ return 1;
+ }
+
+ if(minor > 0 || major > 1)
+ string = (char *) gluGetString(GLU_EXTENSIONS);
+ else
+ string = "";
+
+ if(string)
+ printf("GLU Extensions: %s\n", string);
+ else {
+ fprintf(stderr, "Error: gluGetString(GLU_EXTENSIONS) failed.\n");
+ return 1;
+ }
+
+#endif
+ return 0;
+}
diff --git a/progs/samples/olympic.c b/progs/samples/olympic.c
new file mode 100644
index 00000000000..5385e487026
--- /dev/null
+++ b/progs/samples/olympic.c
@@ -0,0 +1,389 @@
+/*
+ * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the name of
+ * Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF
+ * ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * Nov 20, 1995 use stdlib's rand()/srand() instead of random()/srand48(), etc.
+ */
+
+/*
+ * Modified by Li Wei([email protected]) to be able to run in Windows
+ * 6/13
+ *
+ * Modified by Brian Paul to compile with Windows OR Unix. 7/23/97
+ */
+
+
+#define _HPUX_SOURCE
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include <GL/glut.h>
+
+#ifndef RAND_MAX
+# define RAND_MAX 32767
+#endif
+
+
+#define XSIZE 100
+#define YSIZE 75
+
+#define RINGS 5
+#define BLUERING 0
+#define BLACKRING 1
+#define REDRING 2
+#define YELLOWRING 3
+#define GREENRING 4
+
+#define BACKGROUND 8
+
+
+GLenum rgb, doubleBuffer;
+
+#include "tkmap.c"
+
+unsigned char rgb_colors[RINGS][3];
+int mapped_colors[RINGS];
+float dests[RINGS][3];
+float offsets[RINGS][3];
+float angs[RINGS];
+float rotAxis[RINGS][3];
+int iters[RINGS];
+GLuint theTorus;
+
+
+void FillTorus(float rc, int numc, float rt, int numt)
+{
+ int i, j, k;
+ double s, t;
+ double x, y, z;
+ double pi, twopi;
+
+ pi = 3.14159265358979323846;
+ twopi = 2 * pi;
+
+ for (i = 0; i < numc; i++) {
+ glBegin(GL_QUAD_STRIP);
+ for (j = 0; j <= numt; j++) {
+ for (k = 1; k >= 0; k--) {
+ s = (i + k) % numc + 0.5;
+ t = j % numt;
+
+ x = cos(t*twopi/numt) * cos(s*twopi/numc);
+ y = sin(t*twopi/numt) * cos(s*twopi/numc);
+ z = sin(s*twopi/numc);
+ glNormal3f(x, y, z);
+
+ x = (rt + rc * cos(s*twopi/numc)) * cos(t*twopi/numt);
+ y = (rt + rc * cos(s*twopi/numc)) * sin(t*twopi/numt);
+ z = rc * sin(s*twopi/numc);
+ glVertex3f(x, y, z);
+ }
+ }
+ glEnd();
+ }
+}
+
+float Clamp(int iters_left, float t)
+{
+ if (iters_left < 3) {
+ return 0.0;
+ }
+ return (iters_left-2)*t/iters_left;
+}
+
+void DrawScene(void)
+{
+ int i, j;
+ GLboolean goIdle;
+ static double t0 = -1.;
+ double t, dt;
+ t = glutGet(GLUT_ELAPSED_TIME) / 1000.;
+ if (t0 < 0.)
+ t0 = t;
+ dt = t - t0;
+
+ if (dt < 1./30.)
+ return;
+
+ t0 = t;
+
+ goIdle = GL_TRUE;
+ for (i = 0; i < RINGS; i++) {
+ if (iters[i]) {
+ for (j = 0; j < 3; j++) {
+ offsets[i][j] = Clamp(iters[i], offsets[i][j]);
+ }
+ angs[i] = Clamp(iters[i], angs[i]);
+ iters[i]--;
+ goIdle = GL_FALSE;
+ }
+ }
+ if (goIdle) {
+ glutIdleFunc(NULL);
+ }
+
+ glPushMatrix();
+
+ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
+ gluLookAt(0,0,10, 0,0,0, 0,1,0);
+
+ for (i = 0; i < RINGS; i++) {
+ if (rgb) {
+ glColor3ubv(rgb_colors[i]);
+ } else {
+ glIndexi(mapped_colors[i]);
+ }
+ glPushMatrix();
+ glTranslatef(dests[i][0]+offsets[i][0], dests[i][1]+offsets[i][1],
+ dests[i][2]+offsets[i][2]);
+ glRotatef(angs[i], rotAxis[i][0], rotAxis[i][1], rotAxis[i][2]);
+ glCallList(theTorus);
+ glPopMatrix();
+ }
+
+ glPopMatrix();
+
+ glFlush();
+ if (doubleBuffer) {
+ glutSwapBuffers();
+ }
+}
+
+float MyRand(void)
+{
+ return 10.0 * ( (float) rand() / (float) RAND_MAX - 0.5 );
+}
+
+#if !defined(GLUTCALLBACK)
+#define GLUTCALLBACK
+#endif
+
+void GLUTCALLBACK glut_post_redisplay_p(void)
+{
+ glutPostRedisplay();
+}
+
+void ReInit(void)
+{
+ int i;
+ float deviation;
+
+ deviation = MyRand() / 2;
+ deviation = deviation * deviation;
+ for (i = 0; i < RINGS; i++) {
+ offsets[i][0] = MyRand();
+ offsets[i][1] = MyRand();
+ offsets[i][2] = MyRand();
+ angs[i] = 260.0 * MyRand();
+ rotAxis[i][0] = MyRand();
+ rotAxis[i][1] = MyRand();
+ rotAxis[i][2] = MyRand();
+ iters[i] = (deviation * MyRand() + 60.0);
+ }
+ glutIdleFunc(glut_post_redisplay_p);
+}
+
+void Init(void)
+{
+ float base, height;
+ float aspect, x, y;
+ int i;
+
+ float top_y = 1.0;
+ float bottom_y = 0.0;
+ float top_z = 0.15;
+ float bottom_z = 0.69;
+ float spacing = 2.5;
+ static float lmodel_ambient[] = {0.0, 0.0, 0.0, 0.0};
+ static float lmodel_twoside[] = {GL_FALSE};
+ static float lmodel_local[] = {GL_FALSE};
+ static float light0_ambient[] = {0.1, 0.1, 0.1, 1.0};
+ static float light0_diffuse[] = {1.0, 1.0, 1.0, 0.0};
+ static float light0_position[] = {0.8660254, 0.5, 1, 0};
+ static float light0_specular[] = {1.0, 1.0, 1.0, 0.0};
+ static float bevel_mat_ambient[] = {0.0, 0.0, 0.0, 1.0};
+ static float bevel_mat_shininess[] = {40.0};
+ static float bevel_mat_specular[] = {1.0, 1.0, 1.0, 0.0};
+ static float bevel_mat_diffuse[] = {1.0, 0.0, 0.0, 0.0};
+
+ srand( (unsigned int) glutGet(GLUT_ELAPSED_TIME) );
+
+ ReInit();
+ for (i = 0; i < RINGS; i++) {
+ rgb_colors[i][0] = rgb_colors[i][1] = rgb_colors[i][2] = 0;
+ }
+ rgb_colors[BLUERING][2] = 255;
+ rgb_colors[REDRING][0] = 255;
+ rgb_colors[GREENRING][1] = 255;
+ rgb_colors[YELLOWRING][0] = 255;
+ rgb_colors[YELLOWRING][1] = 255;
+ mapped_colors[BLUERING] = COLOR_BLUE;
+ mapped_colors[REDRING] = COLOR_RED;
+ mapped_colors[GREENRING] = COLOR_GREEN;
+ mapped_colors[YELLOWRING] = COLOR_YELLOW;
+ mapped_colors[BLACKRING] = COLOR_BLACK;
+
+ dests[BLUERING][0] = -spacing;
+ dests[BLUERING][1] = top_y;
+ dests[BLUERING][2] = top_z;
+
+ dests[BLACKRING][0] = 0.0;
+ dests[BLACKRING][1] = top_y;
+ dests[BLACKRING][2] = top_z;
+
+ dests[REDRING][0] = spacing;
+ dests[REDRING][1] = top_y;
+ dests[REDRING][2] = top_z;
+
+ dests[YELLOWRING][0] = -spacing / 2.0;
+ dests[YELLOWRING][1] = bottom_y;
+ dests[YELLOWRING][2] = bottom_z;
+
+ dests[GREENRING][0] = spacing / 2.0;
+ dests[GREENRING][1] = bottom_y;
+ dests[GREENRING][2] = bottom_z;
+
+ base = 2.0;
+ height = 2.0;
+ theTorus = glGenLists(1);
+ glNewList(theTorus, GL_COMPILE);
+ FillTorus(0.1, 8, 1.0, 25);
+ glEndList();
+
+ x = (float)XSIZE;
+ y = (float)YSIZE;
+ aspect = x / y;
+ glEnable(GL_CULL_FACE);
+ glCullFace(GL_BACK);
+ glEnable(GL_DEPTH_TEST);
+ glClearDepth(1.0);
+
+ if (rgb) {
+ glClearColor(0.5, 0.5, 0.5, 0.0);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, light0_ambient);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, light0_specular);
+ glLightfv(GL_LIGHT0, GL_POSITION, light0_position);
+ glEnable(GL_LIGHT0);
+
+ glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, lmodel_local);
+ glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
+ glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+ glEnable(GL_LIGHTING);
+
+ glMaterialfv(GL_FRONT, GL_AMBIENT, bevel_mat_ambient);
+ glMaterialfv(GL_FRONT, GL_SHININESS, bevel_mat_shininess);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, bevel_mat_specular);
+ glMaterialfv(GL_FRONT, GL_DIFFUSE, bevel_mat_diffuse);
+
+ glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
+ glEnable(GL_COLOR_MATERIAL);
+ glShadeModel(GL_SMOOTH);
+ } else {
+ glClearIndex(BACKGROUND);
+ glShadeModel(GL_FLAT);
+ }
+
+ glMatrixMode(GL_PROJECTION);
+ gluPerspective(45, 1.33, 0.1, 100.0);
+ glMatrixMode(GL_MODELVIEW);
+}
+
+void Reshape(int width, int height)
+{
+
+ glViewport(0, 0, width, height);
+}
+
+void Key(unsigned char key, int x, int y)
+{
+
+ switch (key) {
+ case 27:
+ exit(1);
+ case 32:
+ ReInit();
+ break;
+ }
+}
+
+GLenum Args(int argc, char **argv)
+{
+ GLint i;
+
+ rgb = GL_TRUE;
+ doubleBuffer = GL_TRUE;
+
+ for (i = 1; i < argc; i++) {
+ if (strcmp(argv[i], "-ci") == 0) {
+ rgb = GL_FALSE;
+ } else if (strcmp(argv[i], "-rgb") == 0) {
+ rgb = GL_TRUE;
+ } else if (strcmp(argv[i], "-sb") == 0) {
+ doubleBuffer = GL_FALSE;
+ } else if (strcmp(argv[i], "-db") == 0) {
+ doubleBuffer = GL_TRUE;
+ } else {
+ printf("%s (Bad option).\n", argv[i]);
+ return GL_FALSE;
+ }
+ }
+ return GL_TRUE;
+}
+
+int main(int argc, char **argv)
+{
+ GLenum type;
+
+ glutInit(&argc, argv);
+
+ if (Args(argc, argv) == GL_FALSE) {
+ exit(1);
+ }
+
+ glutInitWindowPosition(0, 0); glutInitWindowSize( 400, 300);
+
+ type = GLUT_DEPTH;
+ type |= (rgb) ? GLUT_RGB : GLUT_INDEX;
+ type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
+ glutInitDisplayMode(type);
+
+ if (glutCreateWindow("Olympic") == GL_FALSE) {
+ exit(1);
+ }
+
+ InitMap();
+
+ Init();
+
+ glutReshapeFunc(Reshape);
+ glutKeyboardFunc(Key);
+ glutDisplayFunc(DrawScene);
+ glutIdleFunc(glut_post_redisplay_p);
+
+ glutMainLoop();
+ return 0;
+}
diff --git a/progs/samples/overlay.c b/progs/samples/overlay.c
new file mode 100644
index 00000000000..23b5a4793ba
--- /dev/null
+++ b/progs/samples/overlay.c
@@ -0,0 +1,378 @@
+/*
+ * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the name of
+ * Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF
+ * ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <math.h>
+#include <time.h>
+#include <GL/glut.h>
+
+
+#ifndef PI
+#define PI 3.141592657
+#endif
+
+
+enum {
+ NORMAL = 0,
+ WEIRD = 1
+};
+
+enum {
+ STREAK = 0,
+ CIRCLE = 1
+};
+
+#define MAXSTARS 400
+#define MAXPOS 10000
+#define MAXWARP 10
+#define MAXANGLES 6000
+
+
+typedef struct _starRec {
+ GLint type;
+ float x[2], y[2], z[2];
+ float offsetX, offsetY, offsetR, rotation;
+} starRec;
+
+
+GLenum doubleBuffer;
+GLint windW, windH;
+
+GLenum flag = NORMAL, overlayInit = GL_FALSE;
+GLint starCount = MAXSTARS / 2;
+float speed = 1.0;
+GLint nitro = 0;
+starRec stars[MAXSTARS];
+float sinTable[MAXANGLES];
+
+
+float Sin(float angle)
+{
+
+ return (sinTable[(GLint)angle]);
+}
+
+float Cos(float angle)
+{
+
+ return (sinTable[((GLint)angle+(MAXANGLES/4))%MAXANGLES]);
+}
+
+void NewStar(GLint n, GLint d)
+{
+
+ if (rand()%4 == 0) {
+ stars[n].type = CIRCLE;
+ } else {
+ stars[n].type = STREAK;
+ }
+ stars[n].x[0] = (float)(rand() % MAXPOS - MAXPOS / 2);
+ stars[n].y[0] = (float)(rand() % MAXPOS - MAXPOS / 2);
+ stars[n].z[0] = (float)(rand() % MAXPOS + d);
+ if (rand()%4 == 0 && flag == WEIRD) {
+ stars[n].offsetX = (float)(rand() % 100 - 100 / 2);
+ stars[n].offsetY = (float)(rand() % 100 - 100 / 2);
+ stars[n].offsetR = (float)(rand() % 25 - 25 / 2);
+ } else {
+ stars[n].offsetX = 0.0;
+ stars[n].offsetY = 0.0;
+ stars[n].offsetR = 0.0;
+ }
+}
+
+void RotatePoint(float *x, float *y, float rotation)
+{
+ float tmpX, tmpY;
+
+ tmpX = *x * Cos(rotation) - *y * Sin(rotation);
+ tmpY = *y * Cos(rotation) + *x * Sin(rotation);
+ *x = tmpX;
+ *y = tmpY;
+}
+
+void MoveStars(void)
+{
+ float offset;
+ GLint n;
+
+ offset = speed * 60.0;
+
+ for (n = 0; n < starCount; n++) {
+ stars[n].x[1] = stars[n].x[0];
+ stars[n].y[1] = stars[n].y[0];
+ stars[n].z[1] = stars[n].z[0];
+ stars[n].x[0] += stars[n].offsetX;
+ stars[n].y[0] += stars[n].offsetY;
+ stars[n].z[0] -= offset;
+ stars[n].rotation += stars[n].offsetR;
+ if (stars[n].rotation > MAXANGLES) {
+ stars[n].rotation = 0.0;
+ }
+ }
+}
+
+GLenum StarPoint(GLint n)
+{
+ float x0, y0, x1, y1, width;
+ GLint i;
+
+ x0 = stars[n].x[0] * windW / stars[n].z[0];
+ y0 = stars[n].y[0] * windH / stars[n].z[0];
+ RotatePoint(&x0, &y0, stars[n].rotation);
+ x0 += windW / 2.0;
+ y0 += windH / 2.0;
+
+ if (x0 >= 0.0 && x0 < windW && y0 >= 0.0 && y0 < windH) {
+ if (stars[n].type == STREAK) {
+ x1 = stars[n].x[1] * windW / stars[n].z[1];
+ y1 = stars[n].y[1] * windH / stars[n].z[1];
+ RotatePoint(&x1, &y1, stars[n].rotation);
+ x1 += windW / 2.0;
+ y1 += windH / 2.0;
+
+ glLineWidth(MAXPOS/100.0/stars[n].z[0]+1.0);
+ glColor3f(1.0, (MAXWARP-speed)/MAXWARP, (MAXWARP-speed)/MAXWARP);
+ if (fabs(x0-x1) < 1.0 && fabs(y0-y1) < 1.0) {
+ glBegin(GL_POINTS);
+ glVertex2f(x0, y0);
+ glEnd();
+ } else {
+ glBegin(GL_LINES);
+ glVertex2f(x0, y0);
+ glVertex2f(x1, y1);
+ glEnd();
+ }
+ } else {
+ width = MAXPOS / 10.0 / stars[n].z[0] + 1.0;
+ glColor3f(1.0, 0.0, 0.0);
+ glBegin(GL_POLYGON);
+ for (i = 0; i < 8; i++) {
+ float x = x0 + width * Cos((float)i*MAXANGLES/8.0);
+ float y = y0 + width * Sin((float)i*MAXANGLES/8.0);
+ glVertex2f(x, y);
+ };
+ glEnd();
+ }
+ return GL_TRUE;
+ } else {
+ return GL_FALSE;
+ }
+}
+
+void ShowStars(void)
+{
+ GLint n;
+
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ for (n = 0; n < starCount; n++) {
+ if (stars[n].z[0] > speed || (stars[n].z[0] > 0.0 && speed < MAXWARP)) {
+ if (StarPoint(n) == GL_FALSE) {
+ NewStar(n, MAXPOS);
+ }
+ } else {
+ NewStar(n, MAXPOS);
+ }
+ }
+}
+
+static void Init(void)
+{
+ float angle;
+ GLint n;
+
+ srand((unsigned int)time(NULL));
+
+ for (n = 0; n < MAXSTARS; n++) {
+ NewStar(n, 100);
+ }
+
+ angle = 0.0;
+ for (n = 0; n < MAXANGLES ; n++) {
+ sinTable[n] = sin(angle);
+ angle += PI / (MAXANGLES / 2.0);
+ }
+
+ glClearColor(0.0, 0.0, 0.0, 0.0);
+
+ glDisable(GL_DITHER);
+}
+
+void Reshape(int width, int height)
+{
+
+ windW = (GLint)width;
+ windH = (GLint)height;
+
+ glutUseLayer(GLUT_OVERLAY);
+
+ glViewport(0, 0, windW, windH);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluOrtho2D(-0.5, windW+0.5, -0.5, windH+0.5);
+ glMatrixMode(GL_MODELVIEW);
+ overlayInit = GL_FALSE;
+
+ glutUseLayer(GLUT_NORMAL);
+
+ glViewport(0, 0, windW, windH);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluOrtho2D(-0.5, windW+0.5, -0.5, windH+0.5);
+ glMatrixMode(GL_MODELVIEW);
+}
+
+static void Key(unsigned char key, int x, int y)
+{
+
+ switch (key) {
+ case 27:
+ exit(1);
+ case 32:
+ flag = (flag == NORMAL) ? WEIRD : NORMAL;
+ break;
+ case 't':
+ nitro = 1;
+ break;
+ default:
+ return;
+ }
+}
+
+void Idle(void)
+{
+
+ if (overlayInit == GL_FALSE) {
+ glutUseLayer(GLUT_OVERLAY);
+ glClear(GL_COLOR_BUFFER_BIT);
+/* glColor3f(1.0, 0.0, 0.0);*/
+
+ glIndexf( 2.0 );
+ glBegin(GL_POLYGON);
+ glVertex2i(windW/4-10, windH/4-10);
+ glVertex2i(windW/2-10, windH/4-10);
+ glVertex2i(windW/2-10, windH/2-10);
+ glVertex2i(windW/4-10, windH/2-10);
+ glEnd();
+
+ glIndexf( 0.0 );
+ glBegin(GL_POLYGON);
+ glVertex2i(windW/4, windH/4);
+ glVertex2i(windW/2, windH/4);
+ glVertex2i(windW/2, windH/2);
+ glVertex2i(windW/4, windH/2);
+ glEnd();
+
+ glIndexf( 1.0 );
+ glBegin(GL_POLYGON);
+ glVertex2i(windW/4+10, windH/4+10);
+ glVertex2i(windW/2+10, windH/4+10);
+ glVertex2i(windW/2+10, windH/2+10);
+ glVertex2i(windW/4+10, windH/2+10);
+ glEnd();
+
+ glutUseLayer(GLUT_NORMAL);
+ overlayInit = GL_TRUE;
+ }
+
+ MoveStars();
+ ShowStars();
+ if (nitro > 0) {
+ speed = (float)(nitro / 10) + 1.0;
+ if (speed > MAXWARP) {
+ speed = MAXWARP;
+ }
+ if (++nitro > MAXWARP*10) {
+ nitro = -nitro;
+ }
+ } else if (nitro < 0) {
+ nitro++;
+ speed = (float)(-nitro / 10) + 1.0;
+ if (speed > MAXWARP) {
+ speed = MAXWARP;
+ }
+ }
+
+ glFlush();
+ if (doubleBuffer) {
+ glutSwapBuffers();
+ }
+}
+
+static GLenum Args(int argc, char **argv)
+{
+ GLint i;
+
+ doubleBuffer = GL_TRUE;
+
+ for (i = 1; i < argc; i++) {
+ if (strcmp(argv[i], "-sb") == 0) {
+ doubleBuffer = GL_FALSE;
+ } else if (strcmp(argv[i], "-db") == 0) {
+ doubleBuffer = GL_TRUE;
+ }
+ }
+ return GL_TRUE;
+}
+
+int main(int argc, char **argv)
+{
+ GLenum type;
+
+ glutInit(&argc, argv);
+
+ if (!glutLayerGet(GLUT_OVERLAY_POSSIBLE))
+ {
+ fprintf(stderr, "Overlay not available\n");
+ return(1);
+ }
+
+ if (Args(argc, argv) == GL_FALSE) {
+ return(1);
+ }
+
+ windW = 300;
+ windH = 300;
+ glutInitWindowPosition(0, 0); glutInitWindowSize( 300, 300);
+
+ type = GLUT_RGB;
+ type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
+ glutInitDisplayMode(type);
+
+ if (glutCreateWindow("Overlay Test") == GL_FALSE) {
+ return(1);
+ }
+
+ glutEstablishOverlay();
+
+ Init();
+
+ glutReshapeFunc(Reshape);
+ glutKeyboardFunc(Key);
+ glutIdleFunc(Idle);
+ glutMainLoop();
+ return 0;
+}
diff --git a/progs/samples/point.c b/progs/samples/point.c
new file mode 100644
index 00000000000..4cb6ad7d517
--- /dev/null
+++ b/progs/samples/point.c
@@ -0,0 +1,234 @@
+/*
+ * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the name of
+ * Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF
+ * ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <GL/glut.h>
+
+
+#define CI_RED COLOR_RED
+#define CI_ANTI_ALIAS_GREEN 16
+#define CI_ANTI_ALIAS_YELLOW 32
+#define CI_ANTI_ALIAS_RED 48
+
+
+GLenum rgb, doubleBuffer, windType;
+GLint windW, windH;
+
+#include "tkmap.c"
+
+GLenum mode;
+GLint size;
+float point[3] = {
+ 1.0, 1.0, 0.0
+};
+
+
+static void Init(void)
+{
+ GLint i;
+
+ glClearColor(0.0, 0.0, 0.0, 0.0);
+
+ glBlendFunc(GL_SRC_ALPHA, GL_ZERO);
+
+ if (!rgb) {
+ for (i = 0; i < 16; i++) {
+ glutSetColor(i+CI_ANTI_ALIAS_RED, i/15.0, 0.0, 0.0);
+ glutSetColor(i+CI_ANTI_ALIAS_YELLOW, i/15.0, i/15.0, 0.0);
+ glutSetColor(i+CI_ANTI_ALIAS_GREEN, 0.0, i/15.0, 0.0);
+ }
+ }
+
+ mode = GL_FALSE;
+ size = 1;
+}
+
+static void Reshape(int width, int height)
+{
+
+ windW = (GLint)width;
+ windH = (GLint)height;
+
+ glViewport(0, 0, width, height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluOrtho2D(-windW/2, windW/2, -windH/2, windH/2);
+ glMatrixMode(GL_MODELVIEW);
+}
+
+static void Key2(int key, int x, int y)
+{
+
+ switch (key) {
+ case GLUT_KEY_LEFT:
+ point[0] -= 0.25;
+ break;
+ case GLUT_KEY_RIGHT:
+ point[0] += 0.25;
+ break;
+ case GLUT_KEY_UP:
+ point[1] += 0.25;
+ break;
+ case GLUT_KEY_DOWN:
+ point[1] -= 0.25;
+ break;
+ default:
+ return;
+ }
+
+ glutPostRedisplay();
+}
+
+static void Key(unsigned char key, int x, int y)
+{
+
+ switch (key) {
+ case 27:
+ exit(1);
+ case '1':
+ mode = !mode;
+ break;
+ case 'W':
+ size++;
+ break;
+ case 'w':
+ size--;
+ if (size < 1) {
+ size = 1;
+ }
+ break;
+ default:
+ return;
+ }
+
+ glutPostRedisplay();
+}
+
+static void Draw(void)
+{
+
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ SetColor(COLOR_YELLOW);
+ glBegin(GL_LINE_STRIP);
+ glVertex2f(-windW/2, 0);
+ glVertex2f(windW/2, 0);
+ glEnd();
+ glBegin(GL_LINE_STRIP);
+ glVertex2f(0, -windH/2);
+ glVertex2f(0, windH/2);
+ glEnd();
+
+ if (mode) {
+ glEnable(GL_BLEND);
+ glEnable(GL_POINT_SMOOTH);
+ } else {
+ glDisable(GL_BLEND);
+ glDisable(GL_POINT_SMOOTH);
+ }
+
+ glPointSize(size);
+ if (mode) {
+ (rgb) ? glColor3f(1.0, 0.0, 0.0) : glIndexf(CI_ANTI_ALIAS_RED);
+ } else {
+ (rgb) ? glColor3f(1.0, 0.0, 0.0) : glIndexf(CI_RED);
+ }
+ glBegin(GL_POINTS);
+ glVertex3fv(point);
+ glEnd();
+
+ glDisable(GL_POINT_SMOOTH);
+ glDisable(GL_BLEND);
+
+ glPointSize(1);
+ SetColor(COLOR_GREEN);
+ glBegin(GL_POINTS);
+ glVertex3fv(point);
+ glEnd();
+
+ glFlush();
+
+ if (doubleBuffer) {
+ glutSwapBuffers();
+ }
+}
+
+static GLenum Args(int argc, char **argv)
+{
+ GLint i;
+
+ rgb = GL_TRUE;
+ doubleBuffer = GL_FALSE;
+
+ for (i = 1; i < argc; i++) {
+ if (strcmp(argv[i], "-ci") == 0) {
+ rgb = GL_FALSE;
+ } else if (strcmp(argv[i], "-rgb") == 0) {
+ rgb = GL_TRUE;
+ } else if (strcmp(argv[i], "-sb") == 0) {
+ doubleBuffer = GL_FALSE;
+ } else if (strcmp(argv[i], "-db") == 0) {
+ doubleBuffer = GL_TRUE;
+ } else {
+ printf("%s (Bad option).\n", argv[i]);
+ return GL_FALSE;
+ }
+ }
+ return GL_TRUE;
+}
+
+int main(int argc, char **argv)
+{
+ glutInit(&argc, argv);
+
+ if (Args(argc, argv) == GL_FALSE) {
+ exit(1);
+ }
+
+ windW = 300;
+ windH = 300;
+ glutInitWindowPosition(0, 0); glutInitWindowSize( windW, windH);
+
+ windType = (rgb) ? GLUT_RGB : GLUT_INDEX;
+ windType |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
+ glutInitDisplayMode(windType);
+
+ if (glutCreateWindow("Point Test") == GL_FALSE) {
+ exit(1);
+ }
+
+ InitMap();
+
+ Init();
+
+ glutReshapeFunc(Reshape);
+ glutKeyboardFunc(Key);
+ glutSpecialFunc(Key2);
+ glutDisplayFunc(Draw);
+ glutMainLoop();
+ return 0;
+}
diff --git a/progs/samples/prim.c b/progs/samples/prim.c
new file mode 100644
index 00000000000..388e0153b4f
--- /dev/null
+++ b/progs/samples/prim.c
@@ -0,0 +1,546 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <GL/glut.h>
+
+
+#define PIXEL_CENTER(x) ((long)(x) + 0.5)
+
+#define GAP 10
+#define ROWS 3
+#define COLS 4
+
+#define OPENGL_WIDTH 48
+#define OPENGL_HEIGHT 13
+
+
+GLenum rgb, doubleBuffer, windType;
+GLint windW, windH;
+
+GLenum mode1, mode2;
+GLint boxW, boxH;
+GLubyte OpenGL_bits[] = {
+ 0x00, 0x03, 0x00, 0x00, 0x00, 0x00,
+ 0x7f, 0xfb, 0xff, 0xff, 0xff, 0x01,
+ 0x7f, 0xfb, 0xff, 0xff, 0xff, 0x01,
+ 0x00, 0x03, 0x00, 0x00, 0x00, 0x00,
+ 0x3e, 0x8f, 0xb7, 0xf9, 0xfc, 0x01,
+ 0x63, 0xdb, 0xb0, 0x8d, 0x0d, 0x00,
+ 0x63, 0xdb, 0xb7, 0x8d, 0x0d, 0x00,
+ 0x63, 0xdb, 0xb6, 0x8d, 0x0d, 0x00,
+ 0x63, 0x8f, 0xf3, 0xcc, 0x0d, 0x00,
+ 0x63, 0x00, 0x00, 0x0c, 0x4c, 0x0a,
+ 0x63, 0x00, 0x00, 0x0c, 0x4c, 0x0e,
+ 0x63, 0x00, 0x00, 0x8c, 0xed, 0x0e,
+ 0x3e, 0x00, 0x00, 0xf8, 0x0c, 0x00,
+};
+
+
+#include "tkmap.c"
+
+static void Init(void)
+{
+
+ mode1 = GL_TRUE;
+ mode2 = GL_TRUE;
+}
+
+static void Reshape(int width, int height)
+{
+
+ windW = (GLint)width;
+ windH = (GLint)height;
+}
+
+static void RotateColorMask(void)
+{
+ static GLint rotation = 0;
+
+ rotation = (rotation + 1) & 0x3;
+ switch (rotation) {
+ case 0:
+ glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
+ glIndexMask( 0xff );
+ break;
+ case 1:
+ glColorMask(GL_FALSE, GL_TRUE, GL_TRUE, GL_TRUE);
+ glIndexMask(0xFE);
+ break;
+ case 2:
+ glColorMask(GL_TRUE, GL_FALSE, GL_TRUE, GL_TRUE);
+ glIndexMask(0xFD);
+ break;
+ case 3:
+ glColorMask(GL_TRUE, GL_TRUE, GL_FALSE, GL_TRUE);
+ glIndexMask(0xFB);
+ break;
+ }
+}
+
+static void Key(unsigned char key, int x, int y)
+{
+
+ switch (key) {
+ case 27:
+ exit(1);
+ case '1':
+ mode1 = !mode1;
+ break;
+ case '2':
+ mode2 = !mode2;
+ break;
+ case '3':
+ RotateColorMask();
+ break;
+ default:
+ return;
+ }
+
+ glutPostRedisplay();
+}
+
+static void Viewport(GLint row, GLint column)
+{
+ GLint x, y;
+
+ boxW = (windW - (COLS + 1) * GAP) / COLS;
+ boxH = (windH - (ROWS + 1) * GAP) / ROWS;
+
+ x = GAP + column * (boxW + GAP);
+ y = GAP + row * (boxH + GAP);
+
+ glViewport(x, y, boxW, boxH);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glOrtho(-boxW/2, boxW/2, -boxH/2, boxH/2, 0.0, 1.0);
+ glMatrixMode(GL_MODELVIEW);
+
+ glEnable(GL_SCISSOR_TEST);
+ glScissor(x, y, boxW, boxH);
+}
+
+static void Point(void)
+{
+ GLint i;
+
+ glBegin(GL_POINTS);
+ SetColor(COLOR_WHITE);
+ glVertex2i(0, 0);
+ for (i = 1; i < 8; i++) {
+ GLint j = i * 2;
+ SetColor(COLOR_BLACK+i);
+ glVertex2i(-j, -j);
+ glVertex2i(-j, 0);
+ glVertex2i(-j, j);
+ glVertex2i(0, j);
+ glVertex2i(j, j);
+ glVertex2i(j, 0);
+ glVertex2i(j, -j);
+ glVertex2i(0, -j);
+ }
+ glEnd();
+}
+
+static void Lines(void)
+{
+ GLint i;
+
+ glPushMatrix();
+
+ glTranslatef(-12, 0, 0);
+ for (i = 1; i < 8; i++) {
+ SetColor(COLOR_BLACK+i);
+ glBegin(GL_LINES);
+ glVertex2i(-boxW/4, -boxH/4);
+ glVertex2i(boxW/4, boxH/4);
+ glEnd();
+ glTranslatef(4, 0, 0);
+ }
+
+ glPopMatrix();
+
+ glBegin(GL_LINES);
+ glVertex2i(0, 0);
+ glEnd();
+}
+
+static void LineStrip(void)
+{
+
+ glBegin(GL_LINE_STRIP);
+ SetColor(COLOR_RED);
+ glVertex2f(PIXEL_CENTER(-boxW/4), PIXEL_CENTER(-boxH/4));
+ SetColor(COLOR_GREEN);
+ glVertex2f(PIXEL_CENTER(-boxW/4), PIXEL_CENTER(boxH/4));
+ SetColor(COLOR_BLUE);
+ glVertex2f(PIXEL_CENTER(boxW/4), PIXEL_CENTER(boxH/4));
+ SetColor(COLOR_WHITE);
+ glVertex2f(PIXEL_CENTER(boxW/4), PIXEL_CENTER(-boxH/4));
+ glEnd();
+
+ glBegin(GL_LINE_STRIP);
+ glVertex2i(0, 0);
+ glEnd();
+}
+
+static void LineLoop(void)
+{
+
+ glBegin(GL_LINE_LOOP);
+ SetColor(COLOR_RED);
+ glVertex2f(PIXEL_CENTER(-boxW/4), PIXEL_CENTER(-boxH/4));
+ SetColor(COLOR_GREEN);
+ glVertex2f(PIXEL_CENTER(-boxW/4), PIXEL_CENTER(boxH/4));
+ SetColor(COLOR_BLUE);
+ glVertex2f(PIXEL_CENTER(boxW/4), PIXEL_CENTER(boxH/4));
+ SetColor(COLOR_WHITE);
+ glVertex2f(PIXEL_CENTER(boxW/4), PIXEL_CENTER(-boxH/4));
+ glEnd();
+
+ glEnable(GL_LOGIC_OP);
+ glLogicOp(GL_XOR);
+
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_ONE, GL_ONE);
+
+ SetColor(COLOR_MAGENTA);
+ glBegin(GL_LINE_LOOP);
+ glVertex2f(PIXEL_CENTER(-boxW/8), PIXEL_CENTER(-boxH/8));
+ glVertex2f(PIXEL_CENTER(-boxW/8), PIXEL_CENTER(boxH/8));
+ glEnd();
+ glBegin(GL_LINE_LOOP);
+ glVertex2f(PIXEL_CENTER(-boxW/8), PIXEL_CENTER(boxH/8+5));
+ glVertex2f(PIXEL_CENTER(boxW/8), PIXEL_CENTER(boxH/8+5));
+ glEnd();
+ glDisable(GL_LOGIC_OP);
+ glDisable(GL_BLEND);
+
+ SetColor(COLOR_GREEN);
+ glBegin(GL_POINTS);
+ glVertex2i(0, 0);
+ glEnd();
+
+ glBegin(GL_LINE_LOOP);
+ glVertex2i(0, 0);
+ glEnd();
+}
+
+static void Bitmap(void)
+{
+
+ glBegin(GL_LINES);
+ SetColor(COLOR_GREEN);
+ glVertex2i(-boxW/2, 0);
+ glVertex2i(boxW/2, 0);
+ glVertex2i(0, -boxH/2);
+ glVertex2i(0, boxH/2);
+ SetColor(COLOR_RED);
+ glVertex2i(0, -3);
+ glVertex2i(0, -3+OPENGL_HEIGHT);
+ SetColor(COLOR_BLUE);
+ glVertex2i(0, -3);
+ glVertex2i(OPENGL_WIDTH, -3);
+ glEnd();
+
+ SetColor(COLOR_GREEN);
+
+ glPixelStorei(GL_UNPACK_LSB_FIRST, GL_TRUE);
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+
+ glRasterPos2i(0, 0);
+ glBitmap(OPENGL_WIDTH, OPENGL_HEIGHT, 0, 3, 0.0, 0.0, OpenGL_bits);
+}
+
+static void Triangles(void)
+{
+
+ glBegin(GL_TRIANGLES);
+ SetColor(COLOR_GREEN);
+ glVertex2i(-boxW/4, -boxH/4);
+ SetColor(COLOR_RED);
+ glVertex2i(-boxW/8, -boxH/16);
+ SetColor(COLOR_BLUE);
+ glVertex2i(boxW/8, -boxH/16);
+
+ SetColor(COLOR_GREEN);
+ glVertex2i(-boxW/4, boxH/4);
+ SetColor(COLOR_RED);
+ glVertex2i(-boxW/8, boxH/16);
+ SetColor(COLOR_BLUE);
+ glVertex2i(boxW/8, boxH/16);
+ glEnd();
+
+ glBegin(GL_TRIANGLES);
+ glVertex2i(0, 0);
+ glVertex2i(-100, 100);
+ glEnd();
+}
+
+static void TriangleStrip(void)
+{
+
+ glBegin(GL_TRIANGLE_STRIP);
+ SetColor(COLOR_GREEN);
+ glVertex2i(-boxW/4, -boxH/4);
+ SetColor(COLOR_RED);
+ glVertex2i(-boxW/4, boxH/4);
+ SetColor(COLOR_BLUE);
+ glVertex2i(0, -boxH/4);
+ SetColor(COLOR_WHITE);
+ glVertex2i(0, boxH/4);
+ SetColor(COLOR_CYAN);
+ glVertex2i(boxW/4, -boxH/4);
+ SetColor(COLOR_YELLOW);
+ glVertex2i(boxW/4, boxH/4);
+ glEnd();
+
+ glBegin(GL_TRIANGLE_STRIP);
+ glVertex2i(0, 0);
+ glVertex2i(-100, 100);
+ glEnd();
+}
+
+static void TriangleFan(void)
+{
+ GLint vx[8][2];
+ GLint x0, y0, x1, y1, x2, y2, x3, y3;
+ GLint i;
+
+ y0 = -boxH/4;
+ y1 = y0 + boxH/2/3;
+ y2 = y1 + boxH/2/3;
+ y3 = boxH/4;
+ x0 = -boxW/4;
+ x1 = x0 + boxW/2/3;
+ x2 = x1 + boxW/2/3;
+ x3 = boxW/4;
+
+ vx[0][0] = x0; vx[0][1] = y1;
+ vx[1][0] = x0; vx[1][1] = y2;
+ vx[2][0] = x1; vx[2][1] = y3;
+ vx[3][0] = x2; vx[3][1] = y3;
+ vx[4][0] = x3; vx[4][1] = y2;
+ vx[5][0] = x3; vx[5][1] = y1;
+ vx[6][0] = x2; vx[6][1] = y0;
+ vx[7][0] = x1; vx[7][1] = y0;
+
+ glBegin(GL_TRIANGLE_FAN);
+ SetColor(COLOR_WHITE);
+ glVertex2i(0, 0);
+ for (i = 0; i < 8; i++) {
+ SetColor(COLOR_WHITE-i);
+ glVertex2iv(vx[i]);
+ }
+ glEnd();
+
+ glBegin(GL_TRIANGLE_FAN);
+ glVertex2i(0, 0);
+ glVertex2i(-100, 100);
+ glEnd();
+}
+
+static void Rect(void)
+{
+
+ SetColor(COLOR_GREEN);
+ glRecti(-boxW/4, -boxH/4, boxW/4, boxH/4);
+}
+
+static void PolygonFunc(void)
+{
+ GLint vx[8][2];
+ GLint x0, y0, x1, y1, x2, y2, x3, y3;
+ GLint i;
+
+ y0 = -boxH/4;
+ y1 = y0 + boxH/2/3;
+ y2 = y1 + boxH/2/3;
+ y3 = boxH/4;
+ x0 = -boxW/4;
+ x1 = x0 + boxW/2/3;
+ x2 = x1 + boxW/2/3;
+ x3 = boxW/4;
+
+ vx[0][0] = x0; vx[0][1] = y1;
+ vx[1][0] = x0; vx[1][1] = y2;
+ vx[2][0] = x1; vx[2][1] = y3;
+ vx[3][0] = x2; vx[3][1] = y3;
+ vx[4][0] = x3; vx[4][1] = y2;
+ vx[5][0] = x3; vx[5][1] = y1;
+ vx[6][0] = x2; vx[6][1] = y0;
+ vx[7][0] = x1; vx[7][1] = y0;
+
+ glBegin(GL_POLYGON);
+ for (i = 0; i < 8; i++) {
+ SetColor(COLOR_WHITE-i);
+ glVertex2iv(vx[i]);
+ }
+ glEnd();
+
+ glBegin(GL_POLYGON);
+ glVertex2i(0, 0);
+ glVertex2i(100, 100);
+ glEnd();
+}
+
+static void Quads(void)
+{
+
+ glBegin(GL_QUADS);
+ SetColor(COLOR_GREEN);
+ glVertex2i(-boxW/4, -boxH/4);
+ SetColor(COLOR_RED);
+ glVertex2i(-boxW/8, -boxH/16);
+ SetColor(COLOR_BLUE);
+ glVertex2i(boxW/8, -boxH/16);
+ SetColor(COLOR_WHITE);
+ glVertex2i(boxW/4, -boxH/4);
+
+ SetColor(COLOR_GREEN);
+ glVertex2i(-boxW/4, boxH/4);
+ SetColor(COLOR_RED);
+ glVertex2i(-boxW/8, boxH/16);
+ SetColor(COLOR_BLUE);
+ glVertex2i(boxW/8, boxH/16);
+ SetColor(COLOR_WHITE);
+ glVertex2i(boxW/4, boxH/4);
+ glEnd();
+
+ glBegin(GL_QUADS);
+ glVertex2i(0, 0);
+ glVertex2i(100, 100);
+ glVertex2i(-100, 100);
+ glEnd();
+}
+
+static void QuadStrip(void)
+{
+
+ glBegin(GL_QUAD_STRIP);
+ SetColor(COLOR_GREEN);
+ glVertex2i(-boxW/4, -boxH/4);
+ SetColor(COLOR_RED);
+ glVertex2i(-boxW/4, boxH/4);
+ SetColor(COLOR_BLUE);
+ glVertex2i(0, -boxH/4);
+ SetColor(COLOR_WHITE);
+ glVertex2i(0, boxH/4);
+ SetColor(COLOR_CYAN);
+ glVertex2i(boxW/4, -boxH/4);
+ SetColor(COLOR_YELLOW);
+ glVertex2i(boxW/4, boxH/4);
+ glEnd();
+
+ glBegin(GL_QUAD_STRIP);
+ glVertex2i(0, 0);
+ glVertex2i(100, 100);
+ glVertex2i(-100, 100);
+ glEnd();
+}
+
+static void Draw(void)
+{
+
+ glViewport(0, 0, windW, windH);
+ glDisable(GL_SCISSOR_TEST);
+
+ glPushAttrib(GL_COLOR_BUFFER_BIT);
+
+ glColorMask(1, 1, 1, 1);
+ glIndexMask(~0);
+
+ glClearColor(0.0, 0.0, 0.0, 0.0);
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ glPopAttrib();
+
+ if (mode1) {
+ glShadeModel(GL_SMOOTH);
+ } else {
+ glShadeModel(GL_FLAT);
+ }
+
+ if (mode2) {
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ } else {
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ }
+
+ Viewport(0, 0); Point();
+ Viewport(0, 1); Lines();
+ Viewport(0, 2); LineStrip();
+ Viewport(0, 3); LineLoop();
+
+ Viewport(1, 0); Bitmap();
+
+ Viewport(1, 1); TriangleFan();
+ Viewport(1, 2); Triangles();
+ Viewport(1, 3); TriangleStrip();
+
+ Viewport(2, 0); Rect();
+ Viewport(2, 1); PolygonFunc();
+ Viewport(2, 2); Quads();
+ Viewport(2, 3); QuadStrip();
+
+ glFlush();
+
+ if (doubleBuffer) {
+ glutSwapBuffers();
+ }
+}
+
+static GLenum Args(int argc, char **argv)
+{
+ GLint i;
+
+ rgb = GL_TRUE;
+ doubleBuffer = GL_FALSE;
+
+ for (i = 1; i < argc; i++) {
+ if (strcmp(argv[i], "-ci") == 0) {
+ rgb = GL_FALSE;
+ } else if (strcmp(argv[i], "-rgb") == 0) {
+ rgb = GL_TRUE;
+ } else if (strcmp(argv[i], "-sb") == 0) {
+ doubleBuffer = GL_FALSE;
+ } else if (strcmp(argv[i], "-db") == 0) {
+ doubleBuffer = GL_TRUE;
+ } else {
+ printf("%s (Bad option).\n", argv[i]);
+ return GL_FALSE;
+ }
+ }
+ return GL_TRUE;
+}
+
+int main(int argc, char **argv)
+{
+ glutInit(&argc, argv);
+
+ if (Args(argc, argv) == GL_FALSE) {
+ exit(1);
+ }
+
+ windW = 600;
+ windH = 300;
+ glutInitWindowPosition(0, 0); glutInitWindowSize( windW, windH);
+
+ windType = (rgb) ? GLUT_RGB : GLUT_INDEX;
+ windType |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
+ glutInitDisplayMode(windType);
+
+ if (glutCreateWindow("Primitive Test") == GL_FALSE) {
+ exit(1);
+ }
+
+ InitMap();
+
+ Init();
+
+ glutReshapeFunc(Reshape);
+ glutKeyboardFunc(Key);
+ glutDisplayFunc(Draw);
+ glutMainLoop();
+ return 0;
+}
diff --git a/progs/samples/quad.c b/progs/samples/quad.c
new file mode 100644
index 00000000000..193850abc45
--- /dev/null
+++ b/progs/samples/quad.c
@@ -0,0 +1,457 @@
+/*
+ * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the name of
+ * Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF
+ * ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <GL/glut.h>
+
+
+#ifndef CALLBACK
+#define CALLBACK
+#endif
+
+
+#define PI 3.141592654
+#define BLACK 0
+#define GRAY 128
+#define WHITE 255
+#define RD 0xA4,0x00,0x00,0xFF
+#define WT 0xFF,0xFF,0xFF,0xFF
+#define brickImageWidth 16
+#define brickImageHeight 16
+
+
+#include "loadppm.c"
+
+GLenum rgb, doubleBuffer;
+
+#include "tkmap.c"
+
+float black[3] = {
+ 0.0, 0.0, 0.0
+};
+float blue[3] = {
+ 0.0, 0.0, 1.0
+};
+float gray[3] = {
+ 0.5, 0.5, 0.5
+};
+float white[3] = {
+ 1.0, 1.0, 1.0
+};
+
+GLenum doDither = GL_TRUE;
+GLenum shade = GL_TRUE;
+GLenum texture = GL_TRUE;
+
+float xRotation = 30.0, yRotation = 30.0, zRotation = 0.0;
+GLint radius1, radius2;
+GLdouble angle1, angle2;
+GLint slices, stacks;
+GLint height;
+GLint orientation = GLU_OUTSIDE;
+GLint whichQuadric=0;
+GLUquadricObj *quadObj;
+
+GLubyte brickImage[4*brickImageWidth*brickImageHeight] = {
+ RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD,
+ RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD,
+ RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD,
+ RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD,
+ WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT,
+ RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD,
+ RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD,
+ RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD,
+ RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD,
+ WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT,
+ RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD,
+ RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD,
+ RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD,
+ RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD,
+ WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT,
+ RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD
+};
+char *texFileName = 0;
+
+
+static void CALLBACK ErrorHandler(GLenum which)
+{
+
+ fprintf(stderr, "Quad Error: %s\n", (char *) gluErrorString(which));
+}
+
+typedef void (GLAPIENTRY *callback_t)();
+
+static void Init(void)
+{
+ static GLint colorIndexes[3] = {0, 200, 255};
+ static float ambient[] = {0.1, 0.1, 0.1, 1.0};
+ static float diffuse[] = {0.5, 1.0, 1.0, 1.0};
+ static float position[] = {90.0, 90.0, 150.0, 0.0};
+ static float front_mat_shininess[] = {30.0};
+ static float front_mat_specular[] = {0.2, 0.2, 0.2, 1.0};
+ static float front_mat_diffuse[] = {0.5, 0.28, 0.38, 1.0};
+ static float back_mat_shininess[] = {50.0};
+ static float back_mat_specular[] = {0.5, 0.5, 0.2, 1.0};
+ static float back_mat_diffuse[] = {1.0, 1.0, 0.2, 1.0};
+ static float lmodel_ambient[] = {1.0, 1.0, 1.0, 1.0};
+ static float lmodel_twoside[] = {GL_TRUE};
+ static float decal[] = {GL_DECAL};
+ static float repeat[] = {GL_REPEAT};
+ static float nearest[] = {GL_NEAREST};
+ static PPMImage *image;
+
+ if (!rgb) {
+ SetGreyRamp();
+ }
+ glClearColor(0.0, 0.0, 0.0, 0.0);
+
+ glEnable(GL_DEPTH_TEST);
+
+ glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+ glLightfv(GL_LIGHT0, GL_POSITION, position);
+ glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+ glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+
+ glMaterialfv(GL_FRONT, GL_SHININESS, front_mat_shininess);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, front_mat_specular);
+ glMaterialfv(GL_FRONT, GL_DIFFUSE, front_mat_diffuse);
+ glMaterialfv(GL_BACK, GL_SHININESS, back_mat_shininess);
+ glMaterialfv(GL_BACK, GL_SPECULAR, back_mat_specular);
+ glMaterialfv(GL_BACK, GL_DIFFUSE, back_mat_diffuse);
+ if (!rgb) {
+ glMaterialiv( GL_FRONT_AND_BACK, GL_COLOR_INDEXES, colorIndexes);
+ }
+
+ glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, decal);
+ glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, repeat);
+ glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, repeat);
+ glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, nearest);
+ glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, nearest);
+ if (texFileName) {
+ image = LoadPPM(texFileName);
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ gluBuild2DMipmaps(GL_TEXTURE_2D, 3, image->sizeX, image->sizeY,
+ GL_RGB, GL_UNSIGNED_BYTE, image->data);
+ } else {
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ glTexImage2D(GL_TEXTURE_2D, 0, 4, brickImageWidth, brickImageHeight,
+ 0, GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid *)brickImage);
+ }
+
+ quadObj = gluNewQuadric();
+ gluQuadricCallback(quadObj, GLU_ERROR, (callback_t) ErrorHandler);
+
+ radius1 = 10;
+ radius2 = 5;
+ angle1 = 90;
+ angle2 = 180;
+ slices = 16;
+ stacks = 10;
+ height = 20;
+}
+
+static void Reshape(int width, int height)
+{
+
+ glViewport(0, 0, (GLint)width, (GLint)height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glFrustum(-1, 1, -1, 1, 1, 10);
+ gluLookAt(2, 2, 2, 0, 0, 0, 0, 0, 1);
+ glMatrixMode(GL_MODELVIEW);
+}
+
+static void Key2(int key, int x, int y)
+{
+
+ switch (key) {
+ case GLUT_KEY_LEFT:
+ yRotation += 5;
+ break;
+ case GLUT_KEY_RIGHT:
+ yRotation -= 5;
+ break;
+ case GLUT_KEY_UP:
+ xRotation += 5;
+ break;
+ case GLUT_KEY_DOWN:
+ xRotation -= 5;
+ break;
+ default:
+ return;
+ }
+
+ glutPostRedisplay();
+}
+
+static void Key(unsigned char key, int x, int y)
+{
+
+ switch (key) {
+ case 27:
+ exit(1);
+
+ case 'X':
+ zRotation += 5;
+ break;
+ case 'x':
+ zRotation -= 5;
+ break;
+
+ case '1':
+ gluQuadricDrawStyle(quadObj, GLU_FILL);
+ break;
+ case '2':
+ gluQuadricDrawStyle(quadObj, GLU_POINT);
+ break;
+ case '3':
+ gluQuadricDrawStyle(quadObj, GLU_LINE);
+ break;
+ case '4':
+ gluQuadricDrawStyle(quadObj, GLU_SILHOUETTE);
+ break;
+
+ case '0':
+ shade = !shade;
+ if (shade) {
+ glShadeModel(GL_SMOOTH);
+ gluQuadricNormals(quadObj, GLU_SMOOTH);
+ } else {
+ glShadeModel(GL_FLAT);
+ gluQuadricNormals(quadObj, GLU_FLAT);
+ }
+ break;
+
+ case 'A':
+ stacks++;
+ break;
+ case 'a':
+ stacks--;
+ break;
+
+ case 'S':
+ slices++;
+ break;
+ case 's':
+ slices--;
+ break;
+
+ case 'd':
+ switch(orientation) {
+ case GLU_OUTSIDE:
+ orientation = GLU_INSIDE;
+ break;
+ case GLU_INSIDE:
+ default:
+ orientation = GLU_OUTSIDE;
+ break;
+ }
+ gluQuadricOrientation(quadObj, orientation);
+ break;
+
+ case 'f':
+ whichQuadric = (whichQuadric + 1) % 4;
+ break;
+
+ case 'G':
+ radius1 += 1;
+ break;
+ case 'g':
+ radius1 -= 1;
+ break;
+
+ case 'J':
+ radius2 += 1;
+ break;
+ case 'j':
+ radius2 -= 1;
+ break;
+
+ case 'H':
+ height += 2;
+ break;
+ case 'h':
+ height -= 2;
+ break;
+
+ case 'K':
+ angle1 += 5;
+ break;
+ case 'k':
+ angle1 -= 5;
+ break;
+
+ case 'L':
+ angle2 += 5;
+ break;
+ case 'l':
+ angle2 -= 5;
+ break;
+
+ case 'z':
+ texture = !texture;
+ if (texture) {
+ gluQuadricTexture(quadObj, GL_TRUE);
+ glEnable(GL_TEXTURE_2D);
+ } else {
+ gluQuadricTexture(quadObj, GL_FALSE);
+ glDisable(GL_TEXTURE_2D);
+ }
+ break;
+
+ case 'q':
+ glDisable(GL_CULL_FACE);
+ break;
+ case 'w':
+ glEnable(GL_CULL_FACE);
+ glCullFace(GL_FRONT);
+ break;
+ case 'e':
+ glEnable(GL_CULL_FACE);
+ glCullFace(GL_BACK);
+ break;
+
+ case 'r':
+ glFrontFace(GL_CW);
+ break;
+ case 't':
+ glFrontFace(GL_CCW);
+ break;
+
+ case 'y':
+ doDither = !doDither;
+ (doDither) ? glEnable(GL_DITHER) : glDisable(GL_DITHER);
+ break;
+ default:
+ return;
+ }
+
+ glutPostRedisplay();
+}
+
+static void Draw(void)
+{
+
+ glLoadIdentity();
+ glRotatef(xRotation, 1, 0, 0);
+ glRotatef(yRotation, 0, 1, 0);
+ glRotatef(zRotation, 0, 0, 1);
+
+ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
+
+ glColor3f(1.0, 1.0, 1.0);
+ switch (whichQuadric) {
+ case 0:
+ glTranslatef(0, 0, -height/20.0);
+ gluCylinder(quadObj, radius1/10.0, radius2/10.0, height/10.0,
+ slices, stacks);
+ break;
+ case 1:
+ gluSphere(quadObj, radius1/10.0, slices, stacks);
+ break;
+ case 2:
+ gluPartialDisk(quadObj, radius2/10.0, radius1/10.0, slices,
+ stacks, angle1, angle2);
+ break;
+ case 3:
+ gluDisk(quadObj, radius2/10.0, radius1/10.0, slices, stacks);
+ break;
+ }
+
+ glFlush();
+
+ if (doubleBuffer) {
+ glutSwapBuffers();
+ }
+}
+
+static GLenum Args(int argc, char **argv)
+{
+ GLint i;
+
+ rgb = GL_TRUE;
+ doubleBuffer = GL_FALSE;
+
+ for (i = 1; i < argc; i++) {
+ if (strcmp(argv[i], "-ci") == 0) {
+ rgb = GL_FALSE;
+ } else if (strcmp(argv[i], "-rgb") == 0) {
+ rgb = GL_TRUE;
+ } else if (strcmp(argv[i], "-sb") == 0) {
+ doubleBuffer = GL_FALSE;
+ } else if (strcmp(argv[i], "-db") == 0) {
+ doubleBuffer = GL_TRUE;
+ } else if (strcmp(argv[i], "-f") == 0) {
+ if (i+1 >= argc || argv[i+1][0] == '-') {
+ printf("-f (No file name).\n");
+ return GL_FALSE;
+ } else {
+ texFileName = argv[++i];
+ }
+ } else {
+ printf("%s (Bad option).\n", argv[i]);
+ return GL_FALSE;
+ }
+ }
+ return GL_TRUE;
+}
+
+int main(int argc, char **argv)
+{
+ GLenum type;
+
+ glutInit(&argc, argv);
+
+ if (Args(argc, argv) == GL_FALSE) {
+ exit(1);
+ }
+
+ glutInitWindowPosition(0, 0); glutInitWindowSize( 300, 300);
+
+ type = GLUT_DEPTH;
+ type |= (rgb) ? GLUT_RGB : GLUT_INDEX;
+ type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
+ glutInitDisplayMode(type);
+
+ if (glutCreateWindow("Quad Test") == GL_FALSE) {
+ exit(1);
+ }
+
+ InitMap();
+
+ Init();
+
+ glutReshapeFunc(Reshape);
+ glutKeyboardFunc(Key);
+ glutSpecialFunc(Key2);
+ glutDisplayFunc(Draw);
+ glutMainLoop();
+ return 0;
+}
diff --git a/progs/samples/readtex.c b/progs/samples/readtex.c
new file mode 100644
index 00000000000..37d5fcd0d3a
--- /dev/null
+++ b/progs/samples/readtex.c
@@ -0,0 +1,454 @@
+/* readtex.c */
+
+/*
+ * Read an SGI .rgb image file and generate a mipmap texture set.
+ * Much of this code was borrowed from SGI's tk OpenGL toolkit.
+ */
+
+
+
+#include <GL/gl.h>
+#include <GL/glu.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "readtex.h"
+
+
+#ifndef SEEK_SET
+# define SEEK_SET 0
+#endif
+
+
+/*
+** RGB Image Structure
+*/
+
+typedef struct _TK_RGBImageRec {
+ GLint sizeX, sizeY;
+ GLint components;
+ unsigned char *data;
+} TK_RGBImageRec;
+
+
+
+/******************************************************************************/
+
+typedef struct _rawImageRec {
+ unsigned short imagic;
+ unsigned short type;
+ unsigned short dim;
+ unsigned short sizeX, sizeY, sizeZ;
+ unsigned long min, max;
+ unsigned long wasteBytes;
+ char name[80];
+ unsigned long colorMap;
+ FILE *file;
+ unsigned char *tmp, *tmpR, *tmpG, *tmpB, *tmpA;
+ unsigned long rleEnd;
+ GLuint *rowStart;
+ GLint *rowSize;
+} rawImageRec;
+
+/******************************************************************************/
+
+static void ConvertShort(unsigned short *array, long length)
+{
+ unsigned long b1, b2;
+ unsigned char *ptr;
+
+ ptr = (unsigned char *)array;
+ while (length--) {
+ b1 = *ptr++;
+ b2 = *ptr++;
+ *array++ = (unsigned short) ((b1 << 8) | (b2));
+ }
+}
+
+static void ConvertLong(GLuint *array, long length)
+{
+ unsigned long b1, b2, b3, b4;
+ unsigned char *ptr;
+
+ ptr = (unsigned char *)array;
+ while (length--) {
+ b1 = *ptr++;
+ b2 = *ptr++;
+ b3 = *ptr++;
+ b4 = *ptr++;
+ *array++ = (b1 << 24) | (b2 << 16) | (b3 << 8) | (b4);
+ }
+}
+
+static rawImageRec *RawImageOpen(const char *fileName)
+{
+ union {
+ int testWord;
+ char testByte[4];
+ } endianTest;
+ rawImageRec *raw;
+ GLenum swapFlag;
+ int x;
+
+ endianTest.testWord = 1;
+ if (endianTest.testByte[0] == 1) {
+ swapFlag = GL_TRUE;
+ } else {
+ swapFlag = GL_FALSE;
+ }
+
+ raw = (rawImageRec *)calloc(1, sizeof(rawImageRec));
+ if (raw == NULL) {
+ fprintf(stderr, "Out of memory!\n");
+ return NULL;
+ }
+ if ((raw->file = fopen(fileName, "rb")) == NULL) {
+ perror(fileName);
+ return NULL;
+ }
+
+ fread(raw, 1, 12, raw->file);
+
+ if (swapFlag) {
+ ConvertShort(&raw->imagic, 6);
+ }
+
+ raw->tmp = (unsigned char *)malloc(raw->sizeX*256);
+ raw->tmpR = (unsigned char *)malloc(raw->sizeX*256);
+ raw->tmpG = (unsigned char *)malloc(raw->sizeX*256);
+ raw->tmpB = (unsigned char *)malloc(raw->sizeX*256);
+ if (raw->sizeZ==4) {
+ raw->tmpA = (unsigned char *)malloc(raw->sizeX*256);
+ }
+ if (raw->tmp == NULL || raw->tmpR == NULL || raw->tmpG == NULL ||
+ raw->tmpB == NULL) {
+ fprintf(stderr, "Out of memory!\n");
+ return NULL;
+ }
+
+ if ((raw->type & 0xFF00) == 0x0100) {
+ x = raw->sizeY * raw->sizeZ * sizeof(GLuint);
+ raw->rowStart = (GLuint *)malloc(x);
+ raw->rowSize = (GLint *)malloc(x);
+ if (raw->rowStart == NULL || raw->rowSize == NULL) {
+ fprintf(stderr, "Out of memory!\n");
+ return NULL;
+ }
+ raw->rleEnd = 512 + (2 * x);
+ fseek(raw->file, 512, SEEK_SET);
+ fread(raw->rowStart, 1, x, raw->file);
+ fread(raw->rowSize, 1, x, raw->file);
+ if (swapFlag) {
+ ConvertLong(raw->rowStart, (long) (x/sizeof(GLuint)));
+ ConvertLong((GLuint *)raw->rowSize, (long) (x/sizeof(GLint)));
+ }
+ }
+ return raw;
+}
+
+static void RawImageClose(rawImageRec *raw)
+{
+ fclose(raw->file);
+ free(raw->tmp);
+ free(raw->tmpR);
+ free(raw->tmpG);
+ free(raw->tmpB);
+ if (raw->rowStart)
+ free(raw->rowStart);
+ if (raw->rowSize)
+ free(raw->rowSize);
+ if (raw->sizeZ>3) {
+ free(raw->tmpA);
+ }
+ free(raw);
+}
+
+static void RawImageGetRow(rawImageRec *raw, unsigned char *buf, int y, int z)
+{
+ unsigned char *iPtr, *oPtr, pixel;
+ int count, done = 0;
+
+ if ((raw->type & 0xFF00) == 0x0100) {
+ fseek(raw->file, (long) raw->rowStart[y+z*raw->sizeY], SEEK_SET);
+ fread(raw->tmp, 1, (unsigned int)raw->rowSize[y+z*raw->sizeY],
+ raw->file);
+
+ iPtr = raw->tmp;
+ oPtr = buf;
+ while (!done) {
+ pixel = *iPtr++;
+ count = (int)(pixel & 0x7F);
+ if (!count) {
+ done = 1;
+ return;
+ }
+ if (pixel & 0x80) {
+ while (count--) {
+ *oPtr++ = *iPtr++;
+ }
+ } else {
+ pixel = *iPtr++;
+ while (count--) {
+ *oPtr++ = pixel;
+ }
+ }
+ }
+ } else {
+ fseek(raw->file, 512+(y*raw->sizeX)+(z*raw->sizeX*raw->sizeY),
+ SEEK_SET);
+ fread(buf, 1, raw->sizeX, raw->file);
+ }
+}
+
+
+static void RawImageGetData(rawImageRec *raw, TK_RGBImageRec *final)
+{
+ unsigned char *ptr;
+ int i, j;
+
+ final->data = (unsigned char *)malloc((raw->sizeX+1)*(raw->sizeY+1)*4);
+ if (final->data == NULL) {
+ fprintf(stderr, "Out of memory!\n");
+ }
+
+ ptr = final->data;
+ for (i = 0; i < (int)(raw->sizeY); i++) {
+ RawImageGetRow(raw, raw->tmpR, i, 0);
+ RawImageGetRow(raw, raw->tmpG, i, 1);
+ RawImageGetRow(raw, raw->tmpB, i, 2);
+ if (raw->sizeZ>3) {
+ RawImageGetRow(raw, raw->tmpA, i, 3);
+ }
+ for (j = 0; j < (int)(raw->sizeX); j++) {
+ *ptr++ = *(raw->tmpR + j);
+ *ptr++ = *(raw->tmpG + j);
+ *ptr++ = *(raw->tmpB + j);
+ if (raw->sizeZ>3) {
+ *ptr++ = *(raw->tmpA + j);
+ }
+ }
+ }
+}
+
+
+static TK_RGBImageRec *tkRGBImageLoad(const char *fileName)
+{
+ rawImageRec *raw;
+ TK_RGBImageRec *final;
+
+ raw = RawImageOpen(fileName);
+ if (!raw) {
+ fprintf(stderr, "File not found\n");
+ return NULL;
+ }
+ final = (TK_RGBImageRec *)malloc(sizeof(TK_RGBImageRec));
+ if (final == NULL) {
+ fprintf(stderr, "Out of memory!\n");
+ return NULL;
+ }
+ final->sizeX = raw->sizeX;
+ final->sizeY = raw->sizeY;
+ final->components = raw->sizeZ;
+ RawImageGetData(raw, final);
+ RawImageClose(raw);
+ return final;
+}
+
+
+static void FreeImage( TK_RGBImageRec *image )
+{
+ free(image->data);
+ free(image);
+}
+
+
+/*
+ * Load an SGI .rgb file and generate a set of 2-D mipmaps from it.
+ * Input: imageFile - name of .rgb to read
+ * intFormat - internal texture format to use, or number of components
+ * Return: GL_TRUE if success, GL_FALSE if error.
+ */
+GLboolean LoadRGBMipmaps( const char *imageFile, GLint intFormat )
+{
+ GLint w, h;
+ return LoadRGBMipmaps2( imageFile, GL_TEXTURE_2D, intFormat, &w, &h );
+}
+
+
+
+GLboolean LoadRGBMipmaps2( const char *imageFile, GLenum target,
+ GLint intFormat, GLint *width, GLint *height )
+{
+ GLint error;
+ GLenum format;
+ TK_RGBImageRec *image;
+
+ image = tkRGBImageLoad( imageFile );
+ if (!image) {
+ return GL_FALSE;
+ }
+
+ if (image->components==3) {
+ format = GL_RGB;
+ }
+ else if (image->components==4) {
+ format = GL_RGBA;
+ }
+ else {
+ /* not implemented */
+ fprintf(stderr,
+ "Error in LoadRGBMipmaps %d-component images not implemented\n",
+ image->components );
+ return GL_FALSE;
+ }
+
+ error = gluBuild2DMipmaps( target,
+ intFormat,
+ image->sizeX, image->sizeY,
+ format,
+ GL_UNSIGNED_BYTE,
+ image->data );
+
+ *width = image->sizeX;
+ *height = image->sizeY;
+
+ FreeImage(image);
+
+ return error ? GL_FALSE : GL_TRUE;
+}
+
+
+
+/*
+ * Load an SGI .rgb file and return a pointer to the image data.
+ * Input: imageFile - name of .rgb to read
+ * Output: width - width of image
+ * height - height of image
+ * format - format of image (GL_RGB or GL_RGBA)
+ * Return: pointer to image data or NULL if error
+ */
+GLubyte *LoadRGBImage( const char *imageFile, GLint *width, GLint *height,
+ GLenum *format )
+{
+ TK_RGBImageRec *image;
+ GLint bytes;
+ GLubyte *buffer;
+
+ image = tkRGBImageLoad( imageFile );
+ if (!image) {
+ return NULL;
+ }
+
+ if (image->components==3) {
+ *format = GL_RGB;
+ }
+ else if (image->components==4) {
+ *format = GL_RGBA;
+ }
+ else {
+ /* not implemented */
+ fprintf(stderr,
+ "Error in LoadRGBImage %d-component images not implemented\n",
+ image->components );
+ return NULL;
+ }
+
+ *width = image->sizeX;
+ *height = image->sizeY;
+
+ bytes = image->sizeX * image->sizeY * image->components;
+ buffer = (GLubyte *) malloc(bytes);
+ if (!buffer)
+ return NULL;
+
+ memcpy( (void *) buffer, (void *) image->data, bytes );
+
+ FreeImage(image);
+
+ return buffer;
+}
+
+#define CLAMP( X, MIN, MAX ) ( (X)<(MIN) ? (MIN) : ((X)>(MAX) ? (MAX) : (X)) )
+
+
+static void ConvertRGBtoYUV(GLint w, GLint h, GLint texel_bytes,
+ const GLubyte *src,
+ GLushort *dest)
+{
+ GLint i, j;
+
+ for (i = 0; i < h; i++) {
+ for (j = 0; j < w; j++) {
+ const GLfloat r = (src[0]) / 255.0;
+ const GLfloat g = (src[1]) / 255.0;
+ const GLfloat b = (src[2]) / 255.0;
+ GLfloat y, cr, cb;
+ GLint iy, icr, icb;
+
+ y = r * 65.481 + g * 128.553 + b * 24.966 + 16;
+ cb = r * -37.797 + g * -74.203 + b * 112.0 + 128;
+ cr = r * 112.0 + g * -93.786 + b * -18.214 + 128;
+ /*printf("%f %f %f -> %f %f %f\n", r, g, b, y, cb, cr);*/
+ iy = (GLint) CLAMP(y, 0, 254);
+ icb = (GLint) CLAMP(cb, 0, 254);
+ icr = (GLint) CLAMP(cr, 0, 254);
+
+ if (j & 1) {
+ /* odd */
+ *dest = (iy << 8) | icr;
+ }
+ else {
+ /* even */
+ *dest = (iy << 8) | icb;
+ }
+ dest++;
+ src += texel_bytes;
+ }
+ }
+}
+
+
+/*
+ * Load an SGI .rgb file and return a pointer to the image data, converted
+ * to 422 yuv.
+ *
+ * Input: imageFile - name of .rgb to read
+ * Output: width - width of image
+ * height - height of image
+ * Return: pointer to image data or NULL if error
+ */
+GLushort *LoadYUVImage( const char *imageFile, GLint *width, GLint *height )
+{
+ TK_RGBImageRec *image;
+ GLushort *buffer;
+
+ image = tkRGBImageLoad( imageFile );
+ if (!image) {
+ return NULL;
+ }
+
+ if (image->components != 3 && image->components !=4 ) {
+ /* not implemented */
+ fprintf(stderr,
+ "Error in LoadYUVImage %d-component images not implemented\n",
+ image->components );
+ return NULL;
+ }
+
+ *width = image->sizeX;
+ *height = image->sizeY;
+
+ buffer = (GLushort *) malloc( image->sizeX * image->sizeY * 2 );
+
+ if (buffer)
+ ConvertRGBtoYUV( image->sizeX,
+ image->sizeY,
+ image->components,
+ image->data,
+ buffer );
+
+
+ FreeImage(image);
+ return buffer;
+}
+
diff --git a/progs/samples/rgbtoppm.c b/progs/samples/rgbtoppm.c
new file mode 100644
index 00000000000..116d9a8cfa5
--- /dev/null
+++ b/progs/samples/rgbtoppm.c
@@ -0,0 +1,285 @@
+
+/* texture.c - by David Blythe, SGI */
+
+/* texload is a simplistic routine for reading an SGI .rgb image file. */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <GL/glut.h>
+
+typedef struct _ImageRec {
+ unsigned short imagic;
+ unsigned short type;
+ unsigned short dim;
+ unsigned short xsize, ysize, zsize;
+ unsigned int min, max;
+ unsigned int wasteBytes;
+ char name[80];
+ unsigned long colorMap;
+ FILE *file;
+ unsigned char *tmp;
+ unsigned long rleEnd;
+ unsigned int *rowStart;
+ int *rowSize;
+} ImageRec;
+
+void
+rgbtorgb(unsigned char *r,unsigned char *g,unsigned char *b,unsigned char *l,int n) {
+ while(n--) {
+ l[0] = r[0];
+ l[1] = g[0];
+ l[2] = b[0];
+ l += 3; r++; g++; b++;
+ }
+}
+
+static void
+ConvertShort(unsigned short *array, unsigned int length) {
+ unsigned short b1, b2;
+ unsigned char *ptr;
+
+ ptr = (unsigned char *)array;
+ while (length--) {
+ b1 = *ptr++;
+ b2 = *ptr++;
+ *array++ = (b1 << 8) | (b2);
+ }
+}
+
+static void
+ConvertUint(unsigned *array, unsigned int length) {
+ unsigned int b1, b2, b3, b4;
+ unsigned char *ptr;
+
+ ptr = (unsigned char *)array;
+ while (length--) {
+ b1 = *ptr++;
+ b2 = *ptr++;
+ b3 = *ptr++;
+ b4 = *ptr++;
+ *array++ = (b1 << 24) | (b2 << 16) | (b3 << 8) | (b4);
+ }
+}
+
+static ImageRec *ImageOpen(char *fileName)
+{
+ union {
+ int testWord;
+ char testByte[4];
+ } endianTest;
+ ImageRec *image;
+ int swapFlag;
+ int x;
+
+ endianTest.testWord = 1;
+ if (endianTest.testByte[0] == 1) {
+ swapFlag = 1;
+ } else {
+ swapFlag = 0;
+ }
+
+ image = (ImageRec *)malloc(sizeof(ImageRec));
+ if (image == NULL) {
+ fprintf(stderr, "Out of memory!\n");
+ exit(1);
+ }
+ if ((image->file = fopen(fileName, "rb")) == NULL) {
+ return NULL;
+ }
+
+ fread(image, 1, 12, image->file);
+
+ if (swapFlag) {
+ ConvertShort(&image->imagic, 6);
+ }
+
+ image->tmp = (unsigned char *)malloc(image->xsize*256);
+ if (image->tmp == NULL) {
+ fprintf(stderr, "\nOut of memory!\n");
+ exit(1);
+ }
+
+ if ((image->type & 0xFF00) == 0x0100) {
+ x = image->ysize * image->zsize * (int) sizeof(unsigned);
+ image->rowStart = (unsigned *)malloc(x);
+ image->rowSize = (int *)malloc(x);
+ if (image->rowStart == NULL || image->rowSize == NULL) {
+ fprintf(stderr, "\nOut of memory!\n");
+ exit(1);
+ }
+ image->rleEnd = 512 + (2 * x);
+ fseek(image->file, 512, SEEK_SET);
+ fread(image->rowStart, 1, x, image->file);
+ fread(image->rowSize, 1, x, image->file);
+ if (swapFlag) {
+ ConvertUint(image->rowStart, x/(int) sizeof(unsigned));
+ ConvertUint((unsigned *)image->rowSize, x/(int) sizeof(int));
+ }
+ }
+ return image;
+}
+
+static void
+ImageClose(ImageRec *image) {
+ fclose(image->file);
+ free(image->tmp);
+ free(image);
+}
+
+static void
+ImageGetRow(ImageRec *image, unsigned char *buf, int y, int z) {
+ unsigned char *iPtr, *oPtr, pixel;
+ int count;
+
+ if ((image->type & 0xFF00) == 0x0100) {
+ fseek(image->file, (long) image->rowStart[y+z*image->ysize], SEEK_SET);
+ fread(image->tmp, 1, (unsigned int)image->rowSize[y+z*image->ysize],
+ image->file);
+
+ iPtr = image->tmp;
+ oPtr = buf;
+ for (;;) {
+ pixel = *iPtr++;
+ count = (int)(pixel & 0x7F);
+ if (!count) {
+ return;
+ }
+ if (pixel & 0x80) {
+ while (count--) {
+ *oPtr++ = *iPtr++;
+ }
+ } else {
+ pixel = *iPtr++;
+ while (count--) {
+ *oPtr++ = pixel;
+ }
+ }
+ }
+ } else {
+ fseek(image->file, 512+(y*image->xsize)+(z*image->xsize*image->ysize),
+ SEEK_SET);
+ fread(buf, 1, image->xsize, image->file);
+ }
+}
+
+GLubyte *
+read_alpha_texture(char *name, int *width, int *height)
+{
+ unsigned char *base, *lptr;
+ ImageRec *image;
+ int y;
+
+ image = ImageOpen(name);
+ if(!image) {
+ return NULL;
+ }
+
+ (*width)=image->xsize;
+ (*height)=image->ysize;
+ if (image->zsize != 1) {
+ ImageClose(image);
+ return NULL;
+ }
+
+ base = (unsigned char *)malloc(image->xsize*image->ysize*sizeof(unsigned char));
+ lptr = base;
+ for(y=0; y<image->ysize; y++) {
+ ImageGetRow(image,lptr,y,0);
+ lptr += image->xsize;
+ }
+ ImageClose(image);
+
+ return (unsigned char *) base;
+}
+
+GLubyte *
+read_rgb_texture(char *name, int *width, int *height)
+{
+ unsigned char *base, *ptr;
+ unsigned char *rbuf, *gbuf, *bbuf, *abuf;
+ ImageRec *image;
+ int y;
+
+ image = ImageOpen(name);
+
+ if(!image)
+ return NULL;
+ (*width)=image->xsize;
+ (*height)=image->ysize;
+ if (image->zsize != 3 && image->zsize != 4) {
+ ImageClose(image);
+ return NULL;
+ }
+
+ base = (unsigned char*)malloc(image->xsize*image->ysize*sizeof(unsigned int)*3);
+ rbuf = (unsigned char *)malloc(image->xsize*sizeof(unsigned char));
+ gbuf = (unsigned char *)malloc(image->xsize*sizeof(unsigned char));
+ bbuf = (unsigned char *)malloc(image->xsize*sizeof(unsigned char));
+ abuf = (unsigned char *)malloc(image->xsize*sizeof(unsigned char));
+ if(!base || !rbuf || !gbuf || !bbuf || !abuf) {
+ if (base) free(base);
+ if (rbuf) free(rbuf);
+ if (gbuf) free(gbuf);
+ if (bbuf) free(bbuf);
+ if (abuf) free(abuf);
+ return NULL;
+ }
+ ptr = base;
+ for(y=0; y<image->ysize; y++) {
+ if(image->zsize == 4) {
+ ImageGetRow(image,rbuf,y,0);
+ ImageGetRow(image,gbuf,y,1);
+ ImageGetRow(image,bbuf,y,2);
+ ImageGetRow(image,abuf,y,3); /* Discard. */
+ rgbtorgb(rbuf,gbuf,bbuf,ptr,image->xsize);
+ ptr += (image->xsize * 3);
+ } else {
+ ImageGetRow(image,rbuf,y,0);
+ ImageGetRow(image,gbuf,y,1);
+ ImageGetRow(image,bbuf,y,2);
+ rgbtorgb(rbuf,gbuf,bbuf,ptr,image->xsize);
+ ptr += (image->xsize * 3);
+ }
+ }
+ ImageClose(image);
+ free(rbuf);
+ free(gbuf);
+ free(bbuf);
+ free(abuf);
+
+ return (GLubyte *) base;
+}
+
+int main(int argc, char **argv)
+{
+ int width, height;
+ GLubyte *data;
+ char buff[32];
+ int n;
+ FILE *fo;
+
+ if (argc != 3)
+ {
+ fprintf(stderr, "usage: %s <infile.rgb> <outfile.p6>\n", argv[0]);
+ return 1;
+ }
+
+ data = read_rgb_texture(argv[1], &width, &height);
+
+ n = sprintf(buff, "P6\n%d %d\n255\n", width, height);
+
+ /* [dBorca] avoid LF to CRLF conversion */
+ if ((fo = fopen(argv[2], "wb")) == NULL) {
+ fprintf(stderr, "Cannot open output file!\n");
+ exit(1);
+ }
+
+ fwrite(buff, n, 1, fo);
+ fwrite(data, width * 3, height, fo);
+
+ fclose(fo);
+
+ return 0;
+}
diff --git a/progs/samples/select.c b/progs/samples/select.c
new file mode 100644
index 00000000000..2c8f333bfa9
--- /dev/null
+++ b/progs/samples/select.c
@@ -0,0 +1,456 @@
+/*
+ * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the name of
+ * Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF
+ * ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <string.h>
+#include <time.h>
+#include <GL/glut.h>
+
+
+#define MAXOBJS 10000
+#define MAXSELECT 100
+#define MAXFEED 300
+#define SOLID 1
+#define LINE 2
+#define POINT 3
+
+
+GLint windW, windH;
+
+GLuint selectBuf[MAXSELECT];
+GLfloat feedBuf[MAXFEED];
+GLint vp[4];
+float zRotation = 90.0;
+float zoom = 1.0;
+GLint objectCount;
+GLint numObjects;
+struct object {
+ float v1[2];
+ float v2[2];
+ float v3[2];
+ float color[3];
+} objects[MAXOBJS];
+GLenum linePoly = GL_FALSE;
+
+
+static void InitObjects(GLint num)
+{
+ GLint i;
+ float x, y;
+
+ if (num > MAXOBJS) {
+ num = MAXOBJS;
+ }
+ if (num < 1) {
+ num = 1;
+ }
+ objectCount = num;
+
+ srand((unsigned int)time(NULL));
+ for (i = 0; i < num; i++) {
+ x = (rand() % 300) - 150;
+ y = (rand() % 300) - 150;
+
+ objects[i].v1[0] = x + (rand() % 50) - 25;
+ objects[i].v2[0] = x + (rand() % 50) - 25;
+ objects[i].v3[0] = x + (rand() % 50) - 25;
+ objects[i].v1[1] = y + (rand() % 50) - 25;
+ objects[i].v2[1] = y + (rand() % 50) - 25;
+ objects[i].v3[1] = y + (rand() % 50) - 25;
+ objects[i].color[0] = ((rand() % 100) + 50) / 150.0;
+ objects[i].color[1] = ((rand() % 100) + 50) / 150.0;
+ objects[i].color[2] = ((rand() % 100) + 50) / 150.0;
+ }
+}
+
+static void Init(void)
+{
+
+ numObjects = 10;
+ InitObjects(numObjects);
+ glGetIntegerv(GL_VIEWPORT, vp);
+}
+
+static void Reshape(int width, int height)
+{
+
+ windW = (GLint)width;
+ windH = (GLint)height;
+}
+
+static void Render(GLenum mode)
+{
+ GLint i;
+
+ for (i = 0; i < objectCount; i++) {
+ if (mode == GL_SELECT) {
+ glLoadName(i);
+ }
+ glColor3fv(objects[i].color);
+ glBegin(GL_POLYGON);
+ glVertex2fv(objects[i].v1);
+ glVertex2fv(objects[i].v2);
+ glVertex2fv(objects[i].v3);
+ glEnd();
+ }
+}
+
+static GLint DoSelect(GLint x, GLint y)
+{
+ GLint hits;
+
+ glSelectBuffer(MAXSELECT, selectBuf);
+ (void)glRenderMode(GL_SELECT);
+ glInitNames();
+ glPushName(~0);
+
+ glPushMatrix();
+
+ glViewport(0, 0, windW, windH);
+ glGetIntegerv(GL_VIEWPORT, vp);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPickMatrix(x, windH-y, 4, 4, vp);
+ gluOrtho2D(-175, 175, -175, 175);
+ glMatrixMode(GL_MODELVIEW);
+
+ glClearColor(0.0, 0.0, 0.0, 0.0);
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ glScalef(zoom, zoom, zoom);
+ glRotatef(zRotation, 0, 0, 1);
+
+ Render(GL_SELECT);
+
+ glPopMatrix();
+
+ hits = glRenderMode(GL_RENDER);
+ if (hits <= 0) {
+ return -1;
+ }
+
+ return selectBuf[(hits-1)*4+3];
+}
+
+static void RecolorTri(GLint h)
+{
+
+ objects[h].color[0] = ((rand() % 100) + 50) / 150.0;
+ objects[h].color[1] = ((rand() % 100) + 50) / 150.0;
+ objects[h].color[2] = ((rand() % 100) + 50) / 150.0;
+}
+
+static void DeleteTri(GLint h)
+{
+
+ objects[h] = objects[objectCount-1];
+ objectCount--;
+}
+
+static void GrowTri(GLint h)
+{
+ float v[2];
+ float *oldV = NULL;
+ GLint i;
+
+ v[0] = objects[h].v1[0] + objects[h].v2[0] + objects[h].v3[0];
+ v[1] = objects[h].v1[1] + objects[h].v2[1] + objects[h].v3[1];
+ v[0] /= 3;
+ v[1] /= 3;
+
+ for (i = 0; i < 3; i++) {
+ switch (i) {
+ case 0:
+ oldV = objects[h].v1;
+ break;
+ case 1:
+ oldV = objects[h].v2;
+ break;
+ case 2:
+ oldV = objects[h].v3;
+ break;
+ }
+ oldV[0] = 1.5 * (oldV[0] - v[0]) + v[0];
+ oldV[1] = 1.5 * (oldV[1] - v[1]) + v[1];
+ }
+}
+
+static void Mouse(int button, int state, int mouseX, int mouseY)
+{
+ GLint hit;
+
+ if (state != GLUT_DOWN)
+ return;
+
+ hit = DoSelect((GLint)mouseX, (GLint)mouseY);
+ if (hit != -1) {
+ if (button == GLUT_LEFT_BUTTON) {
+ RecolorTri(hit);
+ }
+ if (button == GLUT_MIDDLE_BUTTON) {
+ GrowTri(hit);
+ }
+ if (button == GLUT_RIGHT_BUTTON) {
+ DeleteTri(hit);
+ }
+ }
+
+ glutPostRedisplay();
+}
+
+static void Draw(void)
+{
+
+ glPushMatrix();
+
+ glViewport(0, 0, windW, windH);
+ glGetIntegerv(GL_VIEWPORT, vp);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluOrtho2D(-175, 175, -175, 175);
+ glMatrixMode(GL_MODELVIEW);
+
+ glClearColor(0.0, 0.0, 0.0, 0.0);
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ glScalef(zoom, zoom, zoom);
+ glRotatef(zRotation, 0, 0, 1);
+
+ Render(GL_RENDER);
+
+ glPopMatrix();
+
+ glFlush();
+}
+
+static void DrawZoom(GLint x, GLint y)
+{
+
+ glPushMatrix();
+
+ glViewport(0, 0, windW, windH);
+ glGetIntegerv(GL_VIEWPORT, vp);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPickMatrix(x, windH-y, 4, 4, vp);
+ gluOrtho2D(-175, 175, -175, 175);
+ glMatrixMode(GL_MODELVIEW);
+
+ glClearColor(0.0, 0.0, 0.0, 0.0);
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ glScalef(zoom, zoom, zoom);
+ glRotatef(zRotation, 0, 0, 1);
+
+ Render(GL_RENDER);
+
+ glPopMatrix();
+}
+
+static void DumpFeedbackVert(GLint *i, GLint n)
+{
+ GLint index;
+
+ index = *i;
+ if (index+7 > n) {
+ *i = n;
+ printf(" ???\n");
+ return;
+ }
+ printf(" (%g %g %g), color = (%4.2f %4.2f %4.2f)\n",
+ feedBuf[index],
+ feedBuf[index+1],
+ feedBuf[index+2],
+ feedBuf[index+3],
+ feedBuf[index+4],
+ feedBuf[index+5]);
+ index += 7;
+ *i = index;
+}
+
+static void DrawFeedback(GLint n)
+{
+ GLint i;
+ GLint verts;
+
+ printf("Feedback results (%d floats):\n", n);
+ for (i = 0; i < n; i++) {
+ switch ((GLint)feedBuf[i]) {
+ case GL_POLYGON_TOKEN:
+ printf("Polygon");
+ i++;
+ if (i < n) {
+ verts = (GLint)feedBuf[i];
+ i++;
+ printf(": %d vertices", verts);
+ } else {
+ verts = 0;
+ }
+ printf("\n");
+ while (verts) {
+ DumpFeedbackVert(&i, n);
+ verts--;
+ }
+ i--;
+ break;
+ case GL_LINE_TOKEN:
+ printf("Line:\n");
+ i++;
+ DumpFeedbackVert(&i, n);
+ DumpFeedbackVert(&i, n);
+ i--;
+ break;
+ case GL_LINE_RESET_TOKEN:
+ printf("Line Reset:\n");
+ i++;
+ DumpFeedbackVert(&i, n);
+ DumpFeedbackVert(&i, n);
+ i--;
+ break;
+ default:
+ printf("%9.2f\n", feedBuf[i]);
+ break;
+ }
+ }
+ if (i == MAXFEED) {
+ printf("...\n");
+ }
+ printf("\n");
+}
+
+static void DoFeedback(void)
+{
+ GLint x;
+
+ glFeedbackBuffer(MAXFEED, GL_3D_COLOR, feedBuf);
+ (void)glRenderMode(GL_FEEDBACK);
+
+ glPushMatrix();
+
+ glViewport(0, 0, windW, windH);
+ glGetIntegerv(GL_VIEWPORT, vp);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluOrtho2D(-175, 175, -175, 175);
+ glMatrixMode(GL_MODELVIEW);
+
+ glClearColor(0.0, 0.0, 0.0, 0.0);
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ glScalef(zoom, zoom, zoom);
+ glRotatef(zRotation, 0, 0, 1);
+
+ Render(GL_FEEDBACK);
+
+ glPopMatrix();
+
+ x = glRenderMode(GL_RENDER);
+ if (x == -1) {
+ x = MAXFEED;
+ }
+
+ DrawFeedback((GLint)x);
+}
+
+static void Key2(int key, int x, int y)
+{
+ switch (key) {
+ case GLUT_KEY_LEFT:
+ zRotation += 0.5;
+ break;
+ case GLUT_KEY_RIGHT:
+ zRotation -= 0.5;
+ break;
+ default:
+ return;
+ }
+
+ glutPostRedisplay();
+}
+
+static void Key(unsigned char key, int x, int y)
+{
+ switch (key) {
+ case 27:
+ exit(1);
+ case 'Z':
+ zoom /= 0.75;
+ break;
+ case 'z':
+ zoom *= 0.75;
+ break;
+ case 'f':
+ DoFeedback();
+ break;
+ case 'd':
+ DrawZoom(x, y);
+ break;
+ case 'l':
+ linePoly = !linePoly;
+ if (linePoly) {
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ } else {
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ }
+ break;
+ default:
+ return;
+ }
+
+ glutPostRedisplay();
+}
+
+int main(int argc, char **argv)
+{
+ GLenum type;
+
+ glutInit(&argc, argv);
+
+ windW = 300;
+ windH = 300;
+ glutInitWindowPosition(0, 0); glutInitWindowSize( windW, windH);
+
+ type = GLUT_RGB | GLUT_SINGLE;
+ glutInitDisplayMode(type);
+
+ if (glutCreateWindow("Select Test") == GL_FALSE) {
+ exit(1);
+ }
+
+ Init();
+
+ glutReshapeFunc(Reshape);
+ glutKeyboardFunc(Key);
+ glutSpecialFunc(Key2);
+ glutMouseFunc(Mouse);
+ glutDisplayFunc(Draw);
+ glutMainLoop();
+ return 0;
+}
diff --git a/progs/samples/shape.c b/progs/samples/shape.c
new file mode 100644
index 00000000000..d342ee5b07b
--- /dev/null
+++ b/progs/samples/shape.c
@@ -0,0 +1,345 @@
+/*
+ * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the name of
+ * Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF
+ * ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <GL/glut.h>
+
+
+#define OPENGL_WIDTH 24
+#define OPENGL_HEIGHT 13
+
+
+GLenum rgb, doubleBuffer, windType;
+GLint objectIndex = 0;
+GLuint bases[20];
+float angleX = 0.0, angleY = 0.0, angleZ = 0.0;
+float scaleX = 1.0, scaleY = 1.0, scaleZ = 1.0;
+float shiftX = 0.0, shiftY = 0.0, shiftZ = 0.0;
+
+
+#include "tkmap.c"
+
+static void Init(void)
+{
+
+ bases[0] = glGenLists(1);
+ glNewList(bases[0], GL_COMPILE);
+ glutWireSphere(1.0, 20, 10);
+ glEndList();
+
+ bases[1] = glGenLists(1);
+ glNewList(bases[1], GL_COMPILE);
+ glutSolidSphere(1.0, 20, 10);
+ glEndList();
+
+ bases[2] = glGenLists(1);
+ glNewList(bases[2], GL_COMPILE);
+ glutWireCube(1.0);
+ glEndList();
+
+ bases[3] = glGenLists(1);
+ glNewList(bases[3], GL_COMPILE);
+ glutSolidCube(1.0);
+ glEndList();
+
+ bases[4] = glGenLists(1);
+ glNewList(bases[4], GL_COMPILE);
+ glutWireTorus(1.0, 1.0, 10, 20);
+ glEndList();
+
+ bases[5] = glGenLists(1);
+ glNewList(bases[5], GL_COMPILE);
+ glutSolidTorus(1.0, 1.0, 10, 20);
+ glEndList();
+
+ bases[6] = glGenLists(1);
+ glNewList(bases[6], GL_COMPILE);
+ glutWireIcosahedron();
+ glEndList();
+
+ bases[7] = glGenLists(1);
+ glNewList(bases[7], GL_COMPILE);
+ glutSolidIcosahedron();
+ glEndList();
+
+ bases[8] = glGenLists(1);
+ glNewList(bases[8], GL_COMPILE);
+ glutWireOctahedron();
+ glEndList();
+
+ bases[9] = glGenLists(1);
+ glNewList(bases[9], GL_COMPILE);
+ glutSolidOctahedron();
+ glEndList();
+
+ bases[10] = glGenLists(1);
+ glNewList(bases[10], GL_COMPILE);
+ glutWireTetrahedron();
+ glEndList();
+
+ bases[11] = glGenLists(1);
+ glNewList(bases[11], GL_COMPILE);
+ glutSolidTetrahedron();
+ glEndList();
+
+ bases[12] = glGenLists(1);
+ glNewList(bases[12], GL_COMPILE);
+ glutWireDodecahedron();
+ glEndList();
+
+ bases[13] = glGenLists(1);
+ glNewList(bases[13], GL_COMPILE);
+ glutSolidDodecahedron();
+ glEndList();
+
+ bases[14] = glGenLists(1);
+ glNewList(bases[14], GL_COMPILE);
+ glutWireCone(5.0, 5.0, 20, 10);
+ glEndList();
+
+ bases[15] = glGenLists(1);
+ glNewList(bases[15], GL_COMPILE);
+ glutSolidCone(5.0, 5.0, 20, 10);
+ glEndList();
+
+ bases[16] = glGenLists(1);
+ glNewList(bases[16], GL_COMPILE);
+ glutWireTeapot(1.0);
+ glEndList();
+
+ bases[17] = glGenLists(1);
+ glNewList(bases[17], GL_COMPILE);
+ glutSolidTeapot(1.0);
+ glEndList();
+
+ glClearColor(0.0, 0.0, 0.0, 0.0);
+ glClearIndex(0.0);
+}
+
+static void Reshape(int width, int height)
+{
+
+ glViewport(0, 0, (GLint)width, (GLint)height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glOrtho(-400.0, 400.0, -200.0, 200.0, -400.0, 400.0);
+ glMatrixMode(GL_MODELVIEW);
+}
+
+static void Key2(int key, int x, int y)
+{
+
+ switch (key) {
+ case GLUT_KEY_LEFT:
+ shiftX -= 20.0;
+ break;
+ case GLUT_KEY_RIGHT:
+ shiftX += 20.0;
+ break;
+ case GLUT_KEY_UP:
+ shiftY += 20.0;
+ break;
+ case GLUT_KEY_DOWN:
+ shiftY -= 20.0;
+ break;
+ default:
+ return;
+ }
+
+ glutPostRedisplay();
+}
+
+static void Key(unsigned char key, int x, int y)
+{
+
+ switch (key) {
+ case 27:
+ exit(1);
+
+ case 32:
+ objectIndex++;
+ if (objectIndex > 17) {
+ objectIndex = 0;
+ }
+ break;
+
+ case 'n':
+ shiftZ += 20.0;
+ break;
+ case 'm':
+ shiftZ -= 20.0;
+ break;
+
+ case 'q':
+ scaleX -= 0.1;
+ if (scaleX < 0.1) {
+ scaleX = 0.1;
+ }
+ break;
+ case 'w':
+ scaleX += 0.1;
+ break;
+ case 'a':
+ scaleY -= 0.1;
+ if (scaleY < 0.1) {
+ scaleY = 0.1;
+ }
+ break;
+ case 's':
+ scaleY += 0.1;
+ break;
+ case 'z':
+ scaleZ -= 0.1;
+ if (scaleZ < 0.1) {
+ scaleZ = 0.1;
+ }
+ break;
+ case 'x':
+ scaleZ += 0.1;
+ break;
+
+ case 'e':
+ angleX -= 5.0;
+ if (angleX < 0.0) {
+ angleX = 360.0 + angleX;
+ }
+ break;
+ case 'r':
+ angleX += 5.0;
+ if (angleX > 360.0) {
+ angleX = angleX - 360.0;
+ }
+ break;
+ case 'd':
+ angleY -= 5.0;
+ if (angleY < 0.0) {
+ angleY = 360.0 + angleY;
+ }
+ break;
+ case 'f':
+ angleY += 5.0;
+ if (angleY > 360.0) {
+ angleY = angleY - 360.0;
+ }
+ break;
+ case 'c':
+ angleZ -= 5.0;
+ if (angleZ < 0.0) {
+ angleZ = 360.0 + angleZ;
+ }
+ break;
+ case 'v':
+ angleZ += 5.0;
+ if (angleZ > 360.0) {
+ angleZ = angleZ - 360.0;
+ }
+ break;
+ default:
+ return;
+ }
+
+ glutPostRedisplay();
+}
+
+static void Draw(void)
+{
+
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ SetColor(COLOR_WHITE);
+
+ glPushMatrix();
+
+ glTranslatef(shiftX, shiftY, shiftZ);
+ glRotatef(angleX, 1.0, 0.0, 0.0);
+ glRotatef(angleY, 0.0, 1.0, 0.0);
+ glRotatef(angleZ, 0.0, 0.0, 1.0);
+ glScalef(scaleX, scaleY, scaleZ);
+
+ glCallList(bases[objectIndex]);
+ glPopMatrix();
+
+ glFlush();
+
+ if (doubleBuffer) {
+ glutSwapBuffers();
+ }
+}
+
+static GLenum Args(int argc, char **argv)
+{
+ GLint i;
+
+ rgb = GL_TRUE;
+ doubleBuffer = GL_FALSE;
+
+ for (i = 1; i < argc; i++) {
+ if (strcmp(argv[i], "-ci") == 0) {
+ rgb = GL_FALSE;
+ } else if (strcmp(argv[i], "-rgb") == 0) {
+ rgb = GL_TRUE;
+ } else if (strcmp(argv[i], "-sb") == 0) {
+ doubleBuffer = GL_FALSE;
+ } else if (strcmp(argv[i], "-db") == 0) {
+ doubleBuffer = GL_TRUE;
+ } else {
+ printf("%s (Bad option).\n", argv[i]);
+ return GL_FALSE;
+ }
+ }
+ return GL_TRUE;
+}
+
+int main(int argc, char **argv)
+{
+ glutInit(&argc, argv);
+
+ if (Args(argc, argv) == GL_FALSE) {
+ exit(1);
+ }
+
+ glutInitWindowPosition(0, 0); glutInitWindowSize( 400, 400);
+
+ windType = (rgb) ? GLUT_RGB : GLUT_INDEX;
+ windType |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
+ glutInitDisplayMode(windType);
+
+ if (glutCreateWindow("Font Test") == GL_FALSE) {
+ exit(1);
+ }
+
+ InitMap();
+
+ Init();
+
+ glutReshapeFunc(Reshape);
+ glutKeyboardFunc(Key);
+ glutSpecialFunc(Key2);
+ glutDisplayFunc(Draw);
+ glutMainLoop();
+ return 0;
+}
diff --git a/progs/samples/sphere.c b/progs/samples/sphere.c
new file mode 100644
index 00000000000..7d0508dee9f
--- /dev/null
+++ b/progs/samples/sphere.c
@@ -0,0 +1,1014 @@
+/*
+ * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the name of
+ * Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF
+ * ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+/* BEP: renamed "nearest" as "nnearest" to avoid math.h collision on AIX */
+
+#include <stdio.h>
+#include <string.h>
+#include <math.h>
+#include <stdlib.h>
+#include <GL/glut.h>
+#include "readtex.h"
+
+
+#ifndef PI
+#define PI 3.14159265358979323846
+#endif
+
+
+GLenum doubleBuffer;
+int W = 400, H = 400;
+
+char *imageFileName = "../images/reflect.rgb";
+
+float *minFilter, *magFilter, *sWrapMode, *tWrapMode;
+float decal[] = {GL_DECAL};
+float modulate[] = {GL_MODULATE};
+float repeat[] = {GL_REPEAT};
+float clamp[] = {GL_CLAMP};
+float nnearest[] = {GL_NEAREST};
+float linear[] = {GL_LINEAR};
+float nearest_mipmap_nearest[] = {GL_NEAREST_MIPMAP_NEAREST};
+float nearest_mipmap_linear[] = {GL_NEAREST_MIPMAP_LINEAR};
+float linear_mipmap_nearest[] = {GL_LINEAR_MIPMAP_NEAREST};
+float linear_mipmap_linear[] = {GL_LINEAR_MIPMAP_LINEAR};
+GLint sphereMap[] = {GL_SPHERE_MAP};
+
+float xRotation = 0.0, yRotation = 0.0;
+float zTranslate = -3.0;
+GLenum autoRotate = GL_TRUE;
+GLboolean isLit = GL_TRUE;
+GLboolean isFogged = GL_FALSE;
+GLboolean doTexture = GL_TRUE;
+float *textureEnvironment = modulate;
+
+int cube, cage, cylinder, torus, genericObject;
+
+float c[6][4][4][3] = {
+ {
+ {
+ {
+ 1.0, 1.0, -1.0
+ },
+ {
+ 0.0, 1.0, -1.0
+ },
+ {
+ 0.0, 0.0, -1.0
+ },
+ {
+ 1.0, 0.0, -1.0
+ },
+ },
+ {
+ {
+ 0.0, 1.0, -1.0
+ },
+ {
+ -1.0, 1.0, -1.0
+ },
+ {
+ -1.0, 0.0, -1.0
+ },
+ {
+ 0.0, 0.0, -1.0
+ },
+ },
+ {
+ {
+ 0.0, 0.0, -1.0
+ },
+ {
+ -1.0, 0.0, -1.0
+ },
+ {
+ -1.0, -1.0, -1.0
+ },
+ {
+ 0.0, -1.0, -1.0
+ },
+ },
+ {
+ {
+ 1.0, 0.0, -1.0
+ },
+ {
+ 0.0, 0.0, -1.0
+ },
+ {
+ 0.0, -1.0, -1.0
+ },
+ {
+ 1.0, -1.0, -1.0
+ },
+ },
+ },
+ {
+ {
+ {
+ 1.0, 1.0, 1.0
+ },
+ {
+ 1.0, 1.0, 0.0
+ },
+ {
+ 1.0, 0.0, 0.0
+ },
+ {
+ 1.0, 0.0, 1.0
+ },
+ },
+ {
+ {
+ 1.0, 1.0, 0.0
+ },
+ {
+ 1.0, 1.0, -1.0
+ },
+ {
+ 1.0, 0.0, -1.0
+ },
+ {
+ 1.0, 0.0, 0.0
+ },
+ },
+ {
+ {
+ 1.0, 0.0, -1.0
+ },
+ {
+ 1.0, -1.0, -1.0
+ },
+ {
+ 1.0, -1.0, 0.0
+ },
+ {
+ 1.0, 0.0, 0.0
+ },
+ },
+ {
+ {
+ 1.0, 0.0, 0.0
+ },
+ {
+ 1.0, -1.0, 0.0
+ },
+ {
+ 1.0, -1.0, 1.0
+ },
+ {
+ 1.0, 0.0, 1.0
+ },
+ },
+ },
+ {
+ {
+ {
+ -1.0, 1.0, 1.0
+ },
+ {
+ 0.0, 1.0, 1.0
+ },
+ {
+ 0.0, 0.0, 1.0
+ },
+ {
+ -1.0, 0.0, 1.0
+ },
+ },
+ {
+ {
+ 0.0, 1.0, 1.0
+ },
+ {
+ 1.0, 1.0, 1.0
+ },
+ {
+ 1.0, 0.0, 1.0
+ },
+ {
+ 0.0, 0.0, 1.0
+ },
+ },
+ {
+ {
+ 1.0, 0.0, 1.0
+ },
+ {
+ 1.0, -1.0, 1.0
+ },
+ {
+ 0.0, -1.0, 1.0
+ },
+ {
+ 0.0, 0.0, 1.0
+ },
+ },
+ {
+ {
+ 0.0, -1.0, 1.0
+ },
+ {
+ -1.0, -1.0, 1.0
+ },
+ {
+ -1.0, 0.0, 1.0
+ },
+ {
+ 0.0, 0.0, 1.0
+ },
+ },
+ },
+ {
+ {
+ {
+ -1.0, 1.0, -1.0
+ },
+ {
+ -1.0, 1.0, 0.0
+ },
+ {
+ -1.0, 0.0, 0.0
+ },
+ {
+ -1.0, 0.0, -1.0
+ },
+ },
+ {
+ {
+ -1.0, 1.0, 0.0
+ },
+ {
+ -1.0, 1.0, 1.0
+ },
+ {
+ -1.0, 0.0, 1.0
+ },
+ {
+ -1.0, 0.0, 0.0
+ },
+ },
+ {
+ {
+ -1.0, 0.0, 1.0
+ },
+ {
+ -1.0, -1.0, 1.0
+ },
+ {
+ -1.0, -1.0, 0.0
+ },
+ {
+ -1.0, 0.0, 0.0
+ },
+ },
+ {
+ {
+ -1.0, -1.0, 0.0
+ },
+ {
+ -1.0, -1.0, -1.0
+ },
+ {
+ -1.0, 0.0, -1.0
+ },
+ {
+ -1.0, 0.0, 0.0
+ },
+ },
+ },
+ {
+ {
+ {
+ -1.0, 1.0, 1.0
+ },
+ {
+ -1.0, 1.0, 0.0
+ },
+ {
+ 0.0, 1.0, 0.0
+ },
+ {
+ 0.0, 1.0, 1.0
+ },
+ },
+ {
+ {
+ -1.0, 1.0, 0.0
+ },
+ {
+ -1.0, 1.0, -1.0
+ },
+ {
+ 0.0, 1.0, -1.0
+ },
+ {
+ 0.0, 1.0, 0.0
+ },
+ },
+ {
+ {
+ 0.0, 1.0, -1.0
+ },
+ {
+ 1.0, 1.0, -1.0
+ },
+ {
+ 1.0, 1.0, 0.0
+ },
+ {
+ 0.0, 1.0, 0.0
+ },
+ },
+ {
+ {
+ 1.0, 1.0, 0.0
+ },
+ {
+ 1.0, 1.0, 1.0
+ },
+ {
+ 0.0, 1.0, 1.0
+ },
+ {
+ 0.0, 1.0, 0.0
+ },
+ },
+ },
+ {
+ {
+ {
+ -1.0, -1.0, -1.0
+ },
+ {
+ -1.0, -1.0, 0.0
+ },
+ {
+ 0.0, -1.0, 0.0
+ },
+ {
+ 0.0, -1.0, -1.0
+ },
+ },
+ {
+ {
+ -1.0, -1.0, 0.0
+ },
+ {
+ -1.0, -1.0, 1.0
+ },
+ {
+ 0.0, -1.0, 1.0
+ },
+ {
+ 0.0, -1.0, 0.0
+ },
+ },
+ {
+ {
+ 0.0, -1.0, 1.0
+ },
+ {
+ 1.0, -1.0, 1.0
+ },
+ {
+ 1.0, -1.0, 0.0
+ },
+ {
+ 0.0, -1.0, 0.0
+ },
+ },
+ {
+ {
+ 1.0, -1.0, 0.0
+ },
+ {
+ 1.0, -1.0, -1.0
+ },
+ {
+ 0.0, -1.0, -1.0
+ },
+ {
+ 0.0, -1.0, 0.0
+ },
+ },
+ }
+};
+
+float n[6][3] = {
+ {
+ 0.0, 0.0, -1.0
+ },
+ {
+ 1.0, 0.0, 0.0
+ },
+ {
+ 0.0, 0.0, 1.0
+ },
+ {
+ -1.0, 0.0, 0.0
+ },
+ {
+ 0.0, 1.0, 0.0
+ },
+ {
+ 0.0, -1.0, 0.0
+ }
+};
+
+GLfloat identity[16] = {
+ 1, 0, 0, 0,
+ 0, 1, 0, 0,
+ 0, 0, 1, 0,
+ 0, 0, 0, 1,
+};
+
+
+void BuildCylinder(int numEdges)
+{
+ int i, top = 1.0, bottom = -1.0;
+ float x[100], y[100], angle;
+
+ for (i = 0; i <= numEdges; i++) {
+ angle = i * 2.0 * PI / numEdges;
+ x[i] = cos(angle); /* was cosf() */
+ y[i] = sin(angle); /* was sinf() */
+ }
+
+ glNewList(cylinder, GL_COMPILE);
+ glBegin(GL_TRIANGLE_STRIP);
+ for (i = 0; i <= numEdges; i++) {
+ glNormal3f(x[i], y[i], 0.0);
+ glVertex3f(x[i], y[i], bottom);
+ glVertex3f(x[i], y[i], top);
+ }
+ glEnd();
+ glBegin(GL_TRIANGLE_FAN);
+ glNormal3f(0.0, 0.0, 1.0);
+ glVertex3f(0.0, 0.0, top);
+ for (i = 0; i <= numEdges; i++) {
+ glVertex3f(x[i], -y[i], top);
+ }
+ glEnd();
+ glBegin(GL_TRIANGLE_FAN);
+ glNormal3f(0.0, 0.0, -1.0);
+ glVertex3f(0.0, 0.0, bottom);
+ for (i = 0; i <= numEdges; i++) {
+ glVertex3f(x[i], y[i], bottom);
+ }
+ glEnd();
+ glEndList();
+}
+
+void BuildTorus(float rc, int numc, float rt, int numt)
+{
+ int i, j, k;
+ double s, t;
+ double x, y, z;
+ double pi, twopi;
+
+ pi = 3.14159265358979323846;
+ twopi = 2.0 * pi;
+
+ glNewList(torus, GL_COMPILE);
+ for (i = 0; i < numc; i++) {
+ glBegin(GL_QUAD_STRIP);
+ for (j = 0; j <= numt; j++) {
+ for (k = 0; k <= 1; k++) {
+ s = (i + k) % numc + 0.5;
+ t = j % numt;
+
+ x = cos(t*twopi/numt) * cos(s*twopi/numc);
+ y = sin(t*twopi/numt) * cos(s*twopi/numc);
+ z = sin(s*twopi/numc);
+ glNormal3f(x, y, z);
+
+ x = (rt + rc * cos(s*twopi/numc)) * cos(t*twopi/numt);
+ y = (rt + rc * cos(s*twopi/numc)) * sin(t*twopi/numt);
+ z = rc * sin(s*twopi/numc);
+ glVertex3f(x, y, z);
+ }
+ }
+ glEnd();
+ }
+ glEndList();
+}
+
+void BuildCage(void)
+{
+ int i;
+ float inc;
+ float right, left, top, bottom, front, back;
+
+ front = 0.0;
+ back = -8.0;
+
+ left = -4.0;
+ bottom = -4.0;
+ right = 4.0;
+ top = 4.0;
+
+ inc = 2.0 * 4.0 * 0.1;
+
+ glNewList(cage, GL_COMPILE);
+ for (i = 0; i < 10; i++) {
+
+ /*
+ ** Back
+ */
+ glBegin(GL_LINES);
+ glVertex3f(left+i*inc, top, back);
+ glVertex3f(left+i*inc, bottom, back);
+ glEnd();
+ glBegin(GL_LINES);
+ glVertex3f(right, bottom+i*inc, back);
+ glVertex3f(left, bottom+i*inc, back);
+ glEnd();
+
+ /*
+ ** Front
+ */
+ glBegin(GL_LINES);
+ glVertex3f(left+i*inc, top, front);
+ glVertex3f(left+i*inc, bottom, front);
+ glEnd();
+ glBegin(GL_LINES);
+ glVertex3f(right, bottom+i*inc, front);
+ glVertex3f(left, bottom+i*inc, front);
+ glEnd();
+
+ /*
+ ** Left
+ */
+ glBegin(GL_LINES);
+ glVertex3f(left, bottom+i*inc, front);
+ glVertex3f(left, bottom+i*inc, back);
+ glEnd();
+ glBegin(GL_LINES);
+ glVertex3f(left, top, back+i*inc);
+ glVertex3f(left, bottom, back+i*inc);
+ glEnd();
+
+ /*
+ ** Right
+ */
+ glBegin(GL_LINES);
+ glVertex3f(right, top-i*inc, front);
+ glVertex3f(right, top-i*inc, back);
+ glEnd();
+ glBegin(GL_LINES);
+ glVertex3f(right, top, back+i*inc);
+ glVertex3f(right, bottom, back+i*inc);
+ glEnd();
+
+ /*
+ ** Top
+ */
+ glBegin(GL_LINES);
+ glVertex3f(left+i*inc, top, front);
+ glVertex3f(left+i*inc, top, back);
+ glEnd();
+ glBegin(GL_LINES);
+ glVertex3f(right, top, back+i*inc);
+ glVertex3f(left, top, back+i*inc);
+ glEnd();
+
+ /*
+ ** Bottom
+ */
+ glBegin(GL_LINES);
+ glVertex3f(right-i*inc, bottom, front);
+ glVertex3f(right-i*inc, bottom, back);
+ glEnd();
+ glBegin(GL_LINES);
+ glVertex3f(right, bottom, back+i*inc);
+ glVertex3f(left, bottom, back+i*inc);
+ glEnd();
+ }
+ glEndList();
+}
+
+void BuildCube(void)
+{
+ int i, j;
+
+ glNewList(cube, GL_COMPILE);
+ for (i = 0; i < 6; i++) {
+ for (j = 0; j < 4; j++) {
+ glNormal3fv(n[i]);
+ glBegin(GL_POLYGON);
+ glVertex3fv(c[i][j][0]);
+ glVertex3fv(c[i][j][1]);
+ glVertex3fv(c[i][j][2]);
+ glVertex3fv(c[i][j][3]);
+ glEnd();
+ }
+ }
+ glEndList();
+}
+
+void BuildLists(void)
+{
+
+ cube = glGenLists(1);
+ BuildCube();
+
+ cage = glGenLists(2);
+ BuildCage();
+
+ cylinder = glGenLists(3);
+ BuildCylinder(60);
+
+ torus = glGenLists(4);
+ BuildTorus(0.65, 20, .85, 65);
+
+ genericObject = torus;
+}
+
+void SetDefaultSettings(void)
+{
+
+ magFilter = nnearest;
+ minFilter = nnearest;
+ sWrapMode = repeat;
+ tWrapMode = repeat;
+ textureEnvironment = modulate;
+ autoRotate = GL_TRUE;
+}
+
+unsigned char *AlphaPadImage(int bufSize, unsigned char *inData, int alpha)
+{
+ unsigned char *outData, *out_ptr, *in_ptr;
+ int i;
+
+ outData = (unsigned char *) malloc(bufSize * 4);
+ out_ptr = outData;
+ in_ptr = inData;
+
+ for (i = 0; i < bufSize; i++) {
+ *out_ptr++ = *in_ptr++;
+ *out_ptr++ = *in_ptr++;
+ *out_ptr++ = *in_ptr++;
+ *out_ptr++ = alpha;
+ }
+
+ free (inData);
+ return outData;
+}
+
+void Init(void)
+{
+ float ambient[] = {0.0, 0.0, 0.0, 1.0};
+ float diffuse[] = {1.0, 1.0, 1.0, 1.0};
+ float specular[] = {1.0, 1.0, 1.0, 1.0};
+ float position[] = {0.0, 0.0, 4.0, 0.0};
+ float fog_color[] = {0.0, 0.0, 0.0, 1.0};
+ float mat_ambient[] = {0.0, 0.0, 0.0, 1.0};
+ float mat_shininess[] = {90.0};
+ float mat_specular[] = {1.0, 1.0, 1.0, 1.0};
+ float mat_diffuse[] = {0.8, 0.8, 0.8, 1.0};
+ float lmodel_ambient[] = {0.2, 0.2, 0.2, 1.0};
+ float lmodel_twoside[] = {GL_TRUE};
+ int w, h;
+ GLenum format;
+ GLubyte *image;
+
+ printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER));
+
+ SetDefaultSettings();
+
+ image = LoadRGBImage(imageFileName, &w, &h, &format);
+ if (!image) {
+ printf("Error: couldn't load %s\n", imageFileName);
+ exit(1);
+ }
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ gluBuild2DMipmaps(GL_TEXTURE_2D, format, w, h,
+ GL_RGB, GL_UNSIGNED_BYTE, image);
+
+ free(image);
+
+ glFogf(GL_FOG_DENSITY, 0.125);
+ glFogi(GL_FOG_MODE, GL_LINEAR);
+ glFogf(GL_FOG_START, 4.0);
+ glFogf(GL_FOG_END, 8.5);
+ glFogfv(GL_FOG_COLOR, fog_color);
+
+ glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, specular);
+ glLightfv(GL_LIGHT0, GL_POSITION, position);
+ glEnable(GL_LIGHT0);
+
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_diffuse);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_ambient);
+
+ glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+ glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
+ glShadeModel(GL_SMOOTH);
+
+
+ glClearColor(0.0, 0.0, 0.0, 0.0);
+ glEnable(GL_DEPTH_TEST);
+
+ glFrontFace(GL_CW);
+ glEnable(GL_CULL_FACE);
+ glCullFace(GL_BACK);
+
+ glTexGeniv(GL_S, GL_TEXTURE_GEN_MODE, sphereMap);
+ glTexGeniv(GL_T, GL_TEXTURE_GEN_MODE, sphereMap);
+ glEnable(GL_TEXTURE_GEN_S);
+ glEnable(GL_TEXTURE_GEN_T);
+
+ glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, magFilter);
+ glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, minFilter);
+ glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, sWrapMode);
+ glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, tWrapMode);
+
+ glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, textureEnvironment);
+
+ BuildLists();
+}
+
+void ReInit(void)
+{
+ if (genericObject == torus) {
+ glEnable(GL_DEPTH_TEST);
+ } else {
+ glDisable(GL_DEPTH_TEST);
+ }
+ glEnable(GL_DEPTH_TEST);
+
+#if 0
+ if (isFogged) {
+ textureEnvironment = modulate;
+ }
+#endif
+
+ glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, magFilter);
+ glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, minFilter);
+ glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, textureEnvironment);
+}
+
+void Draw(void)
+{
+ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
+
+ /* draw cage */
+ if (isFogged)
+ glEnable(GL_FOG);
+ else
+ glDisable(GL_FOG);
+ glColor3f(1, 1, 1);
+ glDisable(GL_LIGHTING);
+ glDisable(GL_TEXTURE_2D);
+ glCallList(cage);
+
+ /* draw object */
+ if (isLit)
+ glEnable(GL_LIGHTING);
+ else
+ glColor3f(1.0, 0.5, 0.2);
+ if (doTexture)
+ glEnable(GL_TEXTURE_2D);
+
+ glPushMatrix();
+ glTranslatef(0.0, 0.0, zTranslate);
+ glRotatef(xRotation, 1, 0, 0);
+ glRotatef(yRotation, 0, 1, 0);
+ glCallList(genericObject);
+ glPopMatrix();
+
+ glFlush();
+ glutSwapBuffers();
+}
+
+void Reshape(int width, int height)
+{
+ W = width;
+ H = height;
+ ReInit();
+ glViewport( 0, 0, width, height ); /*new*/
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glFrustum(-0.2, 0.2, -0.2, 0.2, 0.15, 9.0);
+ glMatrixMode(GL_MODELVIEW);
+}
+
+void Idle(void)
+{
+ static double t0 = -1.;
+ double t, dt;
+ t = glutGet(GLUT_ELAPSED_TIME) / 1000.;
+ if (t0 < 0.)
+ t0 = t;
+ dt = t - t0;
+ t0 = t;
+
+ xRotation += .75*60.*dt;
+ yRotation += .375*60.*dt;
+ glutPostRedisplay();
+}
+
+void Key2(int key, int x, int y)
+{
+
+ switch (key) {
+ case GLUT_KEY_LEFT:
+ yRotation -= 0.5;
+ autoRotate = GL_FALSE;
+ ReInit();
+ break;
+ case GLUT_KEY_RIGHT:
+ yRotation += 0.5;
+ autoRotate = GL_FALSE;
+ ReInit();
+ break;
+ case GLUT_KEY_UP:
+ xRotation -= 0.5;
+ autoRotate = GL_FALSE;
+ ReInit();
+ break;
+ case GLUT_KEY_DOWN:
+ xRotation += 0.5;
+ autoRotate = GL_FALSE;
+ ReInit();
+ break;
+ default:
+ return;
+ }
+ glutPostRedisplay();
+}
+
+void Key(unsigned char key, int x, int y)
+{
+
+ switch (key) {
+ case 27:
+ /* free(image->data);*/
+ exit(1);
+
+ case 'a':
+ autoRotate = !autoRotate;
+ if (autoRotate)
+ glutIdleFunc(Idle);
+ else
+ glutIdleFunc(NULL);
+
+ ReInit();
+ break;
+ case 'o':
+ if (genericObject == cube) {
+ genericObject = cylinder;
+ }
+ else if (genericObject == cylinder) {
+ genericObject = torus;
+ }
+ else {
+ genericObject = cube;
+ }
+ ReInit();
+ break;
+ case 'd':
+ textureEnvironment = decal;
+ ReInit();
+ break;
+ case 'm':
+ textureEnvironment = modulate;
+ ReInit();
+ break;
+ case 'l':
+ isLit = !isLit;
+ ReInit();
+ break;
+ case 'f':
+ isFogged = !isFogged;
+ ReInit();
+ break;
+ case 't':
+ doTexture = !doTexture;
+ ReInit();
+ break;
+ case '0':
+ magFilter = nnearest;
+ ReInit();
+ break;
+ case '1':
+ magFilter = linear;
+ ReInit();
+ break;
+ case '2':
+ minFilter = nnearest;
+ ReInit();
+ break;
+ case '3':
+ minFilter = linear;
+ ReInit();
+ break;
+ case '4':
+ minFilter = nearest_mipmap_nearest;
+ ReInit();
+ break;
+ case '5':
+ minFilter = nearest_mipmap_linear;
+ ReInit();
+ break;
+ case '6':
+ minFilter = linear_mipmap_nearest;
+ ReInit();
+ break;
+ case '7':
+ minFilter = linear_mipmap_linear;
+ ReInit();
+ break;
+ default:
+ return;
+ }
+ glutPostRedisplay();
+}
+
+GLenum Args(int argc, char **argv)
+{
+ GLint i;
+
+ doubleBuffer = GL_TRUE;
+
+ for (i = 1; i < argc; i++) {
+ if (strcmp(argv[i], "-sb") == 0) {
+ doubleBuffer = GL_FALSE;
+ } else if (strcmp(argv[i], "-db") == 0) {
+ doubleBuffer = GL_TRUE;
+ } else if (strcmp(argv[i], "-f") == 0) {
+ if (i+1 >= argc || argv[i+1][0] == '-') {
+ printf("-f (No file name).\n");
+ return GL_FALSE;
+ } else {
+ imageFileName = argv[++i];
+ }
+ } else {
+ printf("%s (Bad option).\n", argv[i]);
+ return GL_FALSE;
+ }
+ }
+ return GL_TRUE;
+}
+
+int main(int argc, char **argv)
+{
+ GLenum type;
+
+ glutInit(&argc, argv);
+
+ if (Args(argc, argv) == GL_FALSE) {
+ exit(1);
+ }
+
+ if (imageFileName == 0) {
+ printf("No image file.\n");
+ exit(1);
+ }
+
+ glutInitWindowPosition(0, 0); glutInitWindowSize( W, H);
+
+ type = GLUT_RGB | GLUT_DEPTH;
+ type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
+ glutInitDisplayMode(type);
+
+ if (glutCreateWindow("Texture Test") == GL_FALSE) {
+ exit(1);
+ }
+
+ Init();
+
+ glutReshapeFunc(Reshape);
+ glutKeyboardFunc(Key);
+ glutSpecialFunc(Key2);
+ glutDisplayFunc(Draw);
+ glutIdleFunc(Idle);
+
+ glutMainLoop();
+ return 0;
+}
diff --git a/progs/samples/star.c b/progs/samples/star.c
new file mode 100644
index 00000000000..2cf470e2a2f
--- /dev/null
+++ b/progs/samples/star.c
@@ -0,0 +1,345 @@
+/*
+ * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the name of
+ * Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF
+ * ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <math.h>
+#include <GL/glut.h>
+
+
+#ifndef PI
+#define PI 3.141592657
+#endif
+
+enum {
+ NORMAL = 0,
+ WEIRD = 1
+};
+
+enum {
+ STREAK = 0,
+ CIRCLE = 1
+};
+
+#define MAXSTARS 400
+#define MAXPOS 10000
+#define MAXWARP 500
+#define MAXANGLES 6000
+
+
+typedef struct _starRec {
+ GLint type;
+ float x[2], y[2], z[2];
+ float offsetX, offsetY, offsetR, rotation;
+} starRec;
+
+
+GLenum doubleBuffer;
+GLint windW, windH;
+
+GLenum flag = NORMAL;
+GLint starCount = MAXSTARS / 2;
+float speed = 1.0;
+GLint nitro = 0;
+starRec stars[MAXSTARS];
+float sinTable[MAXANGLES];
+
+
+float Sin(float angle)
+{
+
+ return (sinTable[(GLint)angle]);
+}
+
+float Cos(float angle)
+{
+
+ return (sinTable[((GLint)angle+(MAXANGLES/4))%MAXANGLES]);
+}
+
+void NewStar(GLint n, GLint d)
+{
+
+ if (rand()%4 == 0) {
+ stars[n].type = CIRCLE;
+ } else {
+ stars[n].type = STREAK;
+ }
+ stars[n].x[0] = (float)(rand() % MAXPOS - MAXPOS / 2);
+ stars[n].y[0] = (float)(rand() % MAXPOS - MAXPOS / 2);
+ stars[n].z[0] = (float)(rand() % MAXPOS + d);
+ if (rand()%4 == 0 && flag == WEIRD) {
+ stars[n].offsetX = (float)(rand() % 100 - 100 / 2);
+ stars[n].offsetY = (float)(rand() % 100 - 100 / 2);
+ stars[n].offsetR = (float)(rand() % 25 - 25 / 2);
+ } else {
+ stars[n].offsetX = 0.0;
+ stars[n].offsetY = 0.0;
+ stars[n].offsetR = 0.0;
+ }
+}
+
+void RotatePoint(float *x, float *y, float rotation)
+{
+ float tmpX, tmpY;
+
+ tmpX = *x * Cos(rotation) - *y * Sin(rotation);
+ tmpY = *y * Cos(rotation) + *x * Sin(rotation);
+ *x = tmpX;
+ *y = tmpY;
+}
+
+void MoveStars(void)
+{
+ float offset;
+ GLint n;
+ static double t0 = -1.;
+ double t, dt;
+ t = glutGet(GLUT_ELAPSED_TIME) / 1000.;
+ if (t0 < 0.)
+ t0 = t;
+ dt = 85.*(t - t0);
+ t0 = t;
+
+ offset = speed * 60.0;
+
+ for (n = 0; n < starCount; n++) {
+ stars[n].x[1] = stars[n].x[0];
+ stars[n].y[1] = stars[n].y[0];
+ stars[n].z[1] = stars[n].z[0];
+ stars[n].x[0] += stars[n].offsetX*dt;
+ stars[n].y[0] += stars[n].offsetY*dt;
+ stars[n].z[0] -= offset*dt;
+ stars[n].rotation += stars[n].offsetR*dt;
+ if (stars[n].rotation > MAXANGLES) {
+ stars[n].rotation = 0.0;
+ }
+ else if (stars[n].rotation < 0.0) {
+ stars[n].rotation += 360.0;
+ }
+ }
+}
+
+GLenum StarPoint(GLint n)
+{
+ float x0, y0, x1, y1, width;
+ GLint i;
+
+ x0 = stars[n].x[0] * windW / stars[n].z[0];
+ y0 = stars[n].y[0] * windH / stars[n].z[0];
+ RotatePoint(&x0, &y0, stars[n].rotation);
+ x0 += windW / 2.0;
+ y0 += windH / 2.0;
+
+ if (x0 >= 0.0 && x0 < windW && y0 >= 0.0 && y0 < windH) {
+ if (stars[n].type == STREAK) {
+ x1 = stars[n].x[1] * windW / stars[n].z[1];
+ y1 = stars[n].y[1] * windH / stars[n].z[1];
+ RotatePoint(&x1, &y1, stars[n].rotation);
+ x1 += windW / 2.0;
+ y1 += windH / 2.0;
+
+ glLineWidth(MAXPOS/100.0/stars[n].z[0]+1.0);
+ glColor3f(1.0, (MAXWARP-speed)/MAXWARP, (MAXWARP-speed)/MAXWARP);
+ if (fabs(x0-x1) < 1.0 && fabs(y0-y1) < 1.0) {
+ glBegin(GL_POINTS);
+ glVertex2f(x0, y0);
+ glEnd();
+ } else {
+ glBegin(GL_LINES);
+ glVertex2f(x0, y0);
+ glVertex2f(x1, y1);
+ glEnd();
+ }
+ } else {
+ width = MAXPOS / 10.0 / stars[n].z[0] + 1.0;
+ glColor3f(1.0, 0.0, 0.0);
+ glBegin(GL_POLYGON);
+ for (i = 0; i < 8; i++) {
+ float x = x0 + width * Cos((float)i*MAXANGLES/8.0);
+ float y = y0 + width * Sin((float)i*MAXANGLES/8.0);
+ glVertex2f(x, y);
+ };
+ glEnd();
+ }
+ return GL_TRUE;
+ } else {
+ return GL_FALSE;
+ }
+}
+
+void ShowStars(void)
+{
+ GLint n;
+
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ for (n = 0; n < starCount; n++) {
+ if (stars[n].z[0] > speed || (stars[n].z[0] > 0.0 && speed < MAXWARP)) {
+ if (StarPoint(n) == GL_FALSE) {
+ NewStar(n, MAXPOS);
+ }
+ } else {
+ NewStar(n, MAXPOS);
+ }
+ }
+}
+
+static void Init(void)
+{
+ float angle;
+ GLint n;
+
+ srand((unsigned int) glutGet(GLUT_ELAPSED_TIME) );
+
+ for (n = 0; n < MAXSTARS; n++) {
+ NewStar(n, 100);
+ }
+
+ angle = 0.0;
+ for (n = 0; n < MAXANGLES ; n++) {
+ sinTable[n] = sin(angle);
+ angle += PI / (MAXANGLES / 2.0);
+ }
+
+ glClearColor(0.0, 0.0, 0.0, 0.0);
+
+ glDisable(GL_DITHER);
+}
+
+void Reshape(int width, int height)
+{
+
+ windW = (GLint)width;
+ windH = (GLint)height;
+
+ glViewport(0, 0, windW, windH);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluOrtho2D(-0.5, windW+0.5, -0.5, windH+0.5);
+ glMatrixMode(GL_MODELVIEW);
+}
+
+static void Key(unsigned char key, int x, int y)
+{
+
+ switch (key) {
+ case 27:
+ exit(1);
+ case 32:
+ flag = (flag == NORMAL) ? WEIRD : NORMAL;
+ break;
+ case 't':
+ nitro = 1;
+ break;
+ default:
+ return;
+ }
+}
+
+void Draw(void)
+{
+
+ MoveStars();
+ ShowStars();
+ if (nitro > 0) {
+ speed = (float)(nitro / 10) + 1.0;
+ if (speed > MAXWARP) {
+ speed = MAXWARP;
+ }
+ if (++nitro > MAXWARP*10) {
+ nitro = -nitro;
+ }
+ } else if (nitro < 0) {
+ nitro++;
+ speed = (float)(-nitro / 10) + 1.0;
+ if (speed > MAXWARP) {
+ speed = MAXWARP;
+ }
+ }
+
+ glFlush();
+ if (doubleBuffer) {
+ glutSwapBuffers();
+ }
+}
+
+static GLenum Args(int argc, char **argv)
+{
+ GLint i;
+
+ doubleBuffer = GL_TRUE;
+
+ for (i = 1; i < argc; i++) {
+ if (strcmp(argv[i], "-sb") == 0) {
+ doubleBuffer = GL_FALSE;
+ } else if (strcmp(argv[i], "-db") == 0) {
+ doubleBuffer = GL_TRUE;
+ }
+ }
+ return GL_TRUE;
+}
+
+#if !defined(GLUTCALLBACK)
+#define GLUTCALLBACK
+#endif
+
+void GLUTCALLBACK glut_post_redisplay_p(void)
+{
+ glutPostRedisplay();
+}
+
+int main(int argc, char **argv)
+{
+ GLenum type;
+
+ glutInit(&argc, argv);
+
+ if (Args(argc, argv) == GL_FALSE) {
+ exit(1);
+ }
+
+ windW = 300;
+ windH = 300;
+ glutInitWindowPosition(0, 0); glutInitWindowSize( 300, 300);
+
+ type = GLUT_RGB;
+ type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
+ glutInitDisplayMode(type);
+
+ if (glutCreateWindow("Stars") == GL_FALSE) {
+ exit(1);
+ }
+
+ Init();
+
+ glutReshapeFunc(Reshape);
+ glutKeyboardFunc(Key);
+ glutDisplayFunc(Draw);
+ glutIdleFunc(glut_post_redisplay_p);
+ glutMainLoop();
+ return 0;
+}
diff --git a/progs/samples/stencil.c b/progs/samples/stencil.c
new file mode 100644
index 00000000000..e00bbb61b0d
--- /dev/null
+++ b/progs/samples/stencil.c
@@ -0,0 +1,143 @@
+/*
+ * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the name of
+ * Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF
+ * ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include <GL/glut.h>
+
+
+static void Init(void)
+{
+ glShadeModel(GL_FLAT);
+ glClearColor(0.0, 0.0, 0.0, 0.0);
+
+ glClearStencil(0);
+ glStencilMask(1);
+ glEnable(GL_STENCIL_TEST);
+}
+
+static void Reshape(int width, int height)
+{
+
+ glViewport(0, 0, (GLint)width, (GLint)height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glOrtho(-5.0, 5.0, -5.0, 5.0, -5.0, 5.0);
+ glMatrixMode(GL_MODELVIEW);
+}
+
+static void Key(unsigned char key, int x, int y)
+{
+
+ switch (key) {
+ case 27:
+ exit(1);
+ }
+}
+
+static void Draw(void)
+{
+
+ glClear(GL_COLOR_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
+
+ glStencilFunc(GL_ALWAYS, 1, 1);
+ glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
+
+ glColor3ub(200, 0, 0);
+ glBegin(GL_POLYGON);
+ glVertex3i(-4, -4, 0);
+ glVertex3i( 4, -4, 0);
+ glVertex3i( 0, 4, 0);
+ glEnd();
+
+ glStencilFunc(GL_EQUAL, 1, 1);
+ glStencilOp(GL_INCR, GL_KEEP, GL_DECR);
+
+ glColor3ub(0, 200, 0);
+ glBegin(GL_POLYGON);
+ glVertex3i(3, 3, 0);
+ glVertex3i(-3, 3, 0);
+ glVertex3i(-3, -3, 0);
+ glVertex3i(3, -3, 0);
+ glEnd();
+
+ glStencilFunc(GL_EQUAL, 1, 1);
+ glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
+
+ glColor3ub(0, 0, 200);
+ glBegin(GL_POLYGON);
+ glVertex3i(3, 3, 0);
+ glVertex3i(-3, 3, 0);
+ glVertex3i(-3, -3, 0);
+ glVertex3i(3, -3, 0);
+ glEnd();
+
+ glFlush();
+}
+
+static GLenum Args(int argc, char **argv)
+{
+ GLint i;
+
+
+ for (i = 1; i < argc; i++) {
+ if (strcmp(argv[i], "-dr") == 0) {
+ } else {
+ printf("%s (Bad option).\n", argv[i]);
+ return GL_FALSE;
+ }
+ }
+ return GL_TRUE;
+}
+
+int main(int argc, char **argv)
+{
+ GLenum type;
+
+ glutInit(&argc, argv);
+
+ if (Args(argc, argv) == GL_FALSE) {
+ exit(1);
+ }
+
+ glutInitWindowPosition(0, 0); glutInitWindowSize( 300, 300);
+
+ type = GLUT_RGB | GLUT_SINGLE | GLUT_STENCIL;
+ glutInitDisplayMode(type);
+
+ if (glutCreateWindow("Stencil Test") == GL_FALSE) {
+ exit(1);
+ }
+
+ Init();
+
+ glutReshapeFunc(Reshape);
+ glutKeyboardFunc(Key);
+ glutDisplayFunc(Draw);
+ glutMainLoop();
+ return 0;
+}
diff --git a/progs/samples/stretch.c b/progs/samples/stretch.c
new file mode 100644
index 00000000000..1fd015d794a
--- /dev/null
+++ b/progs/samples/stretch.c
@@ -0,0 +1,390 @@
+/*
+ * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the name of
+ * Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF
+ * ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include <GL/glut.h>
+
+
+#define STEPCOUNT 40
+#define FALSE 0
+#define TRUE 1
+#define MAX(a, b) (((a) > (b)) ? (a) : (b))
+#define MIN(a, b) (((a) < (b)) ? (a) : (b))
+
+
+enum {
+ OP_NOOP = 0,
+ OP_STRETCH,
+ OP_DRAWPOINT,
+ OP_DRAWIMAGE
+};
+
+
+typedef struct _cRec {
+ float x, y;
+} cRec;
+
+typedef struct _vertexRec {
+ float x, y;
+ float dX, dY;
+ float tX, tY;
+} vertexRec;
+
+
+#include "loadppm.c"
+
+GLenum doubleBuffer;
+int imageSizeX, imageSizeY;
+char *fileName = 0;
+PPMImage *image;
+cRec cList[50];
+vertexRec vList[5];
+int cCount, cIndex[2], cStep;
+GLenum op = OP_NOOP;
+
+
+void DrawImage(void)
+{
+
+ glRasterPos2i(0, 0);
+ glDrawPixels(image->sizeX, image->sizeY, GL_RGB, GL_UNSIGNED_BYTE,
+ image->data);
+
+ glFlush();
+ if (doubleBuffer) {
+ glutSwapBuffers();
+ }
+
+ glRasterPos2i(0, 0);
+ glDrawPixels(image->sizeX, image->sizeY, GL_RGB, GL_UNSIGNED_BYTE,
+ image->data);
+}
+
+void DrawPoint(void)
+{
+ int i;
+
+ glColor3f(1.0, 0.0, 1.0);
+ glPointSize(3.0);
+ glBegin(GL_POINTS);
+ for (i = 0; i < cCount; i++) {
+ glVertex2f(cList[i].x, cList[i].y);
+ }
+ glEnd();
+
+ glFlush();
+ if (doubleBuffer) {
+ glutSwapBuffers();
+ }
+}
+
+void InitVList(void)
+{
+
+ vList[0].x = 0.0;
+ vList[0].y = 0.0;
+ vList[0].dX = 0.0;
+ vList[0].dY = 0.0;
+ vList[0].tX = 0.0;
+ vList[0].tY = 0.0;
+
+ vList[1].x = (float)imageSizeX;
+ vList[1].y = 0.0;
+ vList[1].dX = 0.0;
+ vList[1].dY = 0.0;
+ vList[1].tX = 1.0;
+ vList[1].tY = 0.0;
+
+ vList[2].x = (float)imageSizeX;
+ vList[2].y = (float)imageSizeY;
+ vList[2].dX = 0.0;
+ vList[2].dY = 0.0;
+ vList[2].tX = 1.0;
+ vList[2].tY = 1.0;
+
+ vList[3].x = 0.0;
+ vList[3].y = (float)imageSizeY;
+ vList[3].dX = 0.0;
+ vList[3].dY = 0.0;
+ vList[3].tX = 0.0;
+ vList[3].tY = 1.0;
+
+ vList[4].x = cList[0].x;
+ vList[4].y = cList[0].y;
+ vList[4].dX = (cList[1].x - cList[0].x) / STEPCOUNT;
+ vList[4].dY = (cList[1].y - cList[0].y) / STEPCOUNT;
+ vList[4].tX = cList[0].x / (float)imageSizeX;
+ vList[4].tY = cList[0].y / (float)imageSizeY;
+}
+
+void ScaleImage(int sizeX, int sizeY)
+{
+ GLubyte *buf;
+
+ buf = (GLubyte *)malloc(3*sizeX*sizeY);
+ gluScaleImage(GL_RGB, image->sizeX, image->sizeY, GL_UNSIGNED_BYTE,
+ image->data, sizeX, sizeY, GL_UNSIGNED_BYTE, buf);
+ free(image->data);
+ image->data = buf;
+ image->sizeX = sizeX;
+ image->sizeY = sizeY;
+}
+
+void SetPoint(int x, int y)
+{
+
+ cList[cCount].x = (float)x;
+ cList[cCount].y = (float)y;
+ cCount++;
+}
+
+void Stretch(void)
+{
+
+ glBegin(GL_TRIANGLES);
+ glTexCoord2f(vList[0].tX, vList[0].tY);
+ glVertex2f(vList[0].x, vList[0].y);
+ glTexCoord2f(vList[1].tX, vList[1].tY);
+ glVertex2f(vList[1].x, vList[1].y);
+ glTexCoord2f(vList[4].tX, vList[4].tY);
+ glVertex2f(vList[4].x, vList[4].y);
+ glEnd();
+
+ glBegin(GL_TRIANGLES);
+ glTexCoord2f(vList[1].tX, vList[1].tY);
+ glVertex2f(vList[1].x, vList[1].y);
+ glTexCoord2f(vList[2].tX, vList[2].tY);
+ glVertex2f(vList[2].x, vList[2].y);
+ glTexCoord2f(vList[4].tX, vList[4].tY);
+ glVertex2f(vList[4].x, vList[4].y);
+ glEnd();
+
+ glBegin(GL_TRIANGLES);
+ glTexCoord2f(vList[2].tX, vList[2].tY);
+ glVertex2f(vList[2].x, vList[2].y);
+ glTexCoord2f(vList[3].tX, vList[3].tY);
+ glVertex2f(vList[3].x, vList[3].y);
+ glTexCoord2f(vList[4].tX, vList[4].tY);
+ glVertex2f(vList[4].x, vList[4].y);
+ glEnd();
+
+ glBegin(GL_TRIANGLES);
+ glTexCoord2f(vList[3].tX, vList[3].tY);
+ glVertex2f(vList[3].x, vList[3].y);
+ glTexCoord2f(vList[0].tX, vList[0].tY);
+ glVertex2f(vList[0].x, vList[0].y);
+ glTexCoord2f(vList[4].tX, vList[4].tY);
+ glVertex2f(vList[4].x, vList[4].y);
+ glEnd();
+
+ glFlush();
+ if (doubleBuffer) {
+ glutSwapBuffers();
+ }
+
+ if (++cStep < STEPCOUNT) {
+ vList[4].x += vList[4].dX;
+ vList[4].y += vList[4].dY;
+ } else {
+ cIndex[0] = cIndex[1];
+ cIndex[1] = cIndex[1] + 1;
+ if (cIndex[1] == cCount) {
+ cIndex[1] = 0;
+ }
+ vList[4].dX = (cList[cIndex[1]].x - cList[cIndex[0]].x) / STEPCOUNT;
+ vList[4].dY = (cList[cIndex[1]].y - cList[cIndex[0]].y) / STEPCOUNT;
+ cStep = 0;
+ }
+}
+
+void Key(unsigned char key, int x, int y)
+{
+
+ switch (key) {
+ case 27:
+ free(image->data);
+ exit(1);
+ case 32:
+ if (cCount > 1) {
+ InitVList();
+ cIndex[0] = 0;
+ cIndex[1] = 1;
+ cStep = 0;
+ glEnable(GL_TEXTURE_2D);
+ op = OP_STRETCH;
+ }
+ break;
+ default:
+ return;
+ }
+
+ glutPostRedisplay();
+}
+
+void Mouse(int button, int state, int mouseX, int mouseY)
+{
+
+ if (state != GLUT_DOWN)
+ return;
+
+ if (op == OP_STRETCH) {
+ glDisable(GL_TEXTURE_2D);
+ cCount = 0;
+ op = OP_DRAWIMAGE;
+ } else {
+ SetPoint(mouseX, imageSizeY-mouseY);
+ op = OP_DRAWPOINT;
+ }
+
+ glutPostRedisplay();
+}
+
+void Animate(void)
+{
+ static double t0 = -1.;
+ double t, dt;
+ t = glutGet(GLUT_ELAPSED_TIME) / 1000.;
+ if (t0 < 0.)
+ t0 = t;
+ dt = t - t0;
+
+ if (dt < 1./60.)
+ return;
+
+ t0 = t;
+
+ switch (op) {
+ case OP_STRETCH:
+ Stretch();
+ break;
+ case OP_DRAWPOINT:
+ DrawPoint();
+ break;
+ case OP_DRAWIMAGE:
+ DrawImage();
+ break;
+ default:
+ break;
+ }
+}
+
+static GLenum Args(int argc, char **argv)
+{
+ GLint i;
+
+ doubleBuffer = GL_TRUE;
+
+ for (i = 1; i < argc; i++) {
+ if (strcmp(argv[i], "-sb") == 0) {
+ doubleBuffer = GL_FALSE;
+ } else if (strcmp(argv[i], "-db") == 0) {
+ doubleBuffer = GL_TRUE;
+ } else if (strcmp(argv[i], "-f") == 0) {
+ if (i+1 >= argc || argv[i+1][0] == '-') {
+ printf("-f (No file name).\n");
+ return GL_FALSE;
+ } else {
+ fileName = argv[++i];
+ }
+ } else {
+ printf("%s (Bad option).\n", argv[i]);
+ return GL_FALSE;
+ }
+ }
+ return GL_TRUE;
+}
+
+#if !defined(GLUTCALLBACK)
+#define GLUTCALLBACK
+#endif
+
+void GLUTCALLBACK glut_post_redisplay_p(void)
+{
+ glutPostRedisplay();
+}
+
+int main(int argc, char **argv)
+{
+ GLenum type;
+
+ glutInit(&argc, argv);
+
+ if (Args(argc, argv) == GL_FALSE) {
+ exit(1);
+ }
+
+ if (fileName == 0) {
+ printf("No image file.\n");
+ exit(1);
+ }
+
+ image = LoadPPM(fileName);
+
+ /* changed powf and logf to pow and log -Brian */
+ imageSizeX = (int)pow(2.0, (float)((int)(log(image->sizeX)/log(2.0))));
+ imageSizeY = (int)pow(2.0, (float)((int)(log(image->sizeY)/log(2.0))));
+
+ glutInitWindowPosition(0, 0); glutInitWindowSize( imageSizeX, imageSizeY);
+
+ type = GLUT_RGB;
+ type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
+ glutInitDisplayMode(type);
+
+ if (glutCreateWindow("Stretch") == GL_FALSE) {
+ exit(1);
+ }
+
+ glViewport(0, 0, imageSizeX, imageSizeY);
+ gluOrtho2D(0, imageSizeX, 0, imageSizeY);
+ glClearColor(0.0, 0.0, 0.0, 0.0);
+
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ glPixelStorei(GL_PACK_ALIGNMENT, 1);
+
+ ScaleImage(imageSizeX, imageSizeY);
+
+ glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexImage2D(GL_TEXTURE_2D, 0, 3, image->sizeX, image->sizeY, 0,
+ GL_RGB, GL_UNSIGNED_BYTE, (unsigned char *)image->data);
+
+ cCount = 0;
+ cIndex[0] = 0;
+ cIndex[1] = 0;
+ cStep = 0;
+ op = OP_DRAWIMAGE;
+
+ glutKeyboardFunc(Key);
+ glutMouseFunc(Mouse);
+ glutDisplayFunc(Animate);
+ glutIdleFunc(glut_post_redisplay_p);
+ glutMainLoop();
+ return 0;
+}
diff --git a/progs/samples/texture.c b/progs/samples/texture.c
new file mode 100644
index 00000000000..7ee41eef28b
--- /dev/null
+++ b/progs/samples/texture.c
@@ -0,0 +1,474 @@
+/*
+ * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the name of
+ * Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF
+ * ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <math.h>
+#include <stdlib.h>
+#include <GL/glut.h>
+
+
+#include "loadppm.c"
+
+GLenum doubleBuffer;
+
+char *texFileName = 0;
+PPMImage *image;
+
+float *minFilter, *magFilter, *sWrapMode, *tWrapMode;
+float decal[] = {GL_DECAL};
+float modulate[] = {GL_MODULATE};
+float repeat[] = {GL_REPEAT};
+float clamp[] = {GL_CLAMP};
+float nr[] = {GL_NEAREST};
+float ln[] = {GL_LINEAR};
+float nr_mipmap_nr[] = {GL_NEAREST_MIPMAP_NEAREST};
+float nr_mipmap_ln[] = {GL_NEAREST_MIPMAP_LINEAR};
+float ln_mipmap_nr[] = {GL_LINEAR_MIPMAP_NEAREST};
+float ln_mipmap_ln[] = {GL_LINEAR_MIPMAP_LINEAR};
+GLint sphereMap[] = {GL_SPHERE_MAP};
+
+GLenum doSphere = GL_FALSE;
+float xRotation = 0.0, yRotation = 0.0, zTranslate = -3.125;
+
+GLint cube;
+float c[6][4][3] = {
+ {
+ {
+ 1.0, 1.0, -1.0
+ },
+ {
+ -1.0, 1.0, -1.0
+ },
+ {
+ -1.0, -1.0, -1.0
+ },
+ {
+ 1.0, -1.0, -1.0
+ }
+ },
+ {
+ {
+ 1.0, 1.0, 1.0
+ },
+ {
+ 1.0, 1.0, -1.0
+ },
+ {
+ 1.0, -1.0, -1.0
+ },
+ {
+ 1.0, -1.0, 1.0
+ }
+ },
+ {
+ {
+ -1.0, 1.0, 1.0
+ },
+ {
+ 1.0, 1.0, 1.0
+ },
+ {
+ 1.0, -1.0, 1.0
+ },
+ {
+ -1.0, -1.0, 1.0
+ }
+ },
+ {
+ {
+ -1.0, 1.0, -1.0
+ },
+ {
+ -1.0, 1.0, 1.0
+ },
+ {
+ -1.0, -1.0, 1.0
+ },
+ {
+ -1.0, -1.0, -1.0
+ }
+ },
+ {
+ {
+ -1.0, 1.0, 1.0
+ },
+ {
+ -1.0, 1.0, -1.0
+ },
+ {
+ 1.0, 1.0, -1.0
+ },
+ {
+ 1.0, 1.0, 1.0
+ }
+ },
+ {
+ {
+ -1.0, -1.0, -1.0
+ },
+ {
+ -1.0, -1.0, 1.0
+ },
+ {
+ 1.0, -1.0, 1.0
+ },
+ {
+ 1.0, -1.0, -1.0
+ }
+ }
+};
+static float n[6][3] = {
+ {
+ 0.0, 0.0, -1.0
+ },
+ {
+ 1.0, 0.0, 0.0
+ },
+ {
+ 0.0, 0.0, 1.0
+ },
+ {
+ -1.0, 0.0, 0.0
+ },
+ {
+ 0.0, 1.0, 0.0
+ },
+ {
+ 0.0, -1.0, 0.0
+ }
+};
+static float t[6][4][2] = {
+ {
+ {
+ 1.1, 1.1
+ },
+ {
+ -0.1, 1.1
+ },
+ {
+ -0.1, -0.1
+ },
+ {
+ 1.1, -0.1
+ }
+ },
+ {
+ {
+ 1.1, 1.1
+ },
+ {
+ -0.1, 1.1
+ },
+ {
+ -0.1, -0.1
+ },
+ {
+ 1.1, -0.1
+ }
+ },
+ {
+ {
+ -0.1, 1.1
+ },
+ {
+ 1.1, 1.1
+ },
+ {
+ 1.1, -0.1
+ },
+ {
+ -0.1, -0.1
+ }
+ },
+ {
+ {
+ 1.1, 1.1
+ },
+ {
+ -0.1, 1.1
+ },
+ {
+ -0.1, -0.1
+ },
+ {
+ 1.1, -0.1
+ }
+ },
+ {
+ {
+ 1.1, 1.1
+ },
+ {
+ -0.1, 1.1
+ },
+ {
+ -0.1, -0.1
+ },
+ {
+ 1.1, -0.1
+ }
+ },
+ {
+ {
+ 1.1, 1.1
+ },
+ {
+ -0.1, 1.1
+ },
+ {
+ -0.1, -0.1
+ },
+ {
+ 1.1, -0.1
+ }
+ },
+};
+
+static void BuildCube(void)
+{
+ GLint i;
+
+ glNewList(cube, GL_COMPILE);
+ for (i = 0; i < 6; i++) {
+ glBegin(GL_POLYGON);
+ glNormal3fv(n[i]); glTexCoord2fv(t[i][0]); glVertex3fv(c[i][0]);
+ glNormal3fv(n[i]); glTexCoord2fv(t[i][1]); glVertex3fv(c[i][1]);
+ glNormal3fv(n[i]); glTexCoord2fv(t[i][2]); glVertex3fv(c[i][2]);
+ glNormal3fv(n[i]); glTexCoord2fv(t[i][3]); glVertex3fv(c[i][3]);
+ glEnd();
+ }
+ glEndList();
+}
+
+static void BuildLists(void)
+{
+
+ cube = glGenLists(1);
+ BuildCube();
+}
+
+static void Init(void)
+{
+
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ gluBuild2DMipmaps(GL_TEXTURE_2D, 3, image->sizeX, image->sizeY,
+ GL_RGB, GL_UNSIGNED_BYTE, image->data);
+ glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, decal);
+ glEnable(GL_TEXTURE_2D);
+
+ glFrontFace(GL_CCW);
+ glCullFace(GL_FRONT);
+ glEnable(GL_CULL_FACE);
+
+ BuildLists();
+
+ glClearColor(0.0, 0.0, 0.0, 0.0);
+
+ magFilter = nr;
+ minFilter = nr;
+ sWrapMode = repeat;
+ tWrapMode = repeat;
+}
+
+static void Reshape(int width, int height)
+{
+
+ glViewport(0, 0, (GLint)width, (GLint)height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(145.0, 1.0, 0.01, 1000);
+ glMatrixMode(GL_MODELVIEW);
+}
+
+static void Key2(int key, int x, int y)
+{
+
+ switch (key) {
+ case GLUT_KEY_LEFT:
+ yRotation -= 0.5;
+ break;
+ case GLUT_KEY_RIGHT:
+ yRotation += 0.5;
+ break;
+ case GLUT_KEY_UP:
+ xRotation -= 0.5;
+ break;
+ case GLUT_KEY_DOWN:
+ xRotation += 0.5;
+ break;
+ default:
+ return;
+ }
+
+ glutPostRedisplay();
+}
+
+static void Key(unsigned char key, int x, int y)
+{
+
+ switch (key) {
+ case 27:
+ exit(1);
+
+ case 'T':
+ zTranslate += 0.25;
+ break;
+ case 't':
+ zTranslate -= 0.25;
+ break;
+
+ case 's':
+ doSphere = !doSphere;
+ if (doSphere) {
+ glTexGeniv(GL_S, GL_TEXTURE_GEN_MODE, sphereMap);
+ glTexGeniv(GL_T, GL_TEXTURE_GEN_MODE, sphereMap);
+ glEnable(GL_TEXTURE_GEN_S);
+ glEnable(GL_TEXTURE_GEN_T);
+ } else {
+ glDisable(GL_TEXTURE_GEN_S);
+ glDisable(GL_TEXTURE_GEN_T);
+ }
+ break;
+
+ case '0':
+ magFilter = nr;
+ break;
+ case '1':
+ magFilter = ln;
+ break;
+ case '2':
+ minFilter = nr;
+ break;
+ case '3':
+ minFilter = ln;
+ break;
+ case '4':
+ minFilter = nr_mipmap_nr;
+ break;
+ case '5':
+ minFilter = nr_mipmap_ln;
+ break;
+ case '6':
+ minFilter = ln_mipmap_nr;
+ break;
+ case '7':
+ minFilter = ln_mipmap_ln;
+ break;
+ default:
+ return;
+ }
+
+ glutPostRedisplay();
+}
+
+static void Draw(void)
+{
+
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, sWrapMode);
+ glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, tWrapMode);
+ glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, magFilter);
+ glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, minFilter);
+
+ glPushMatrix();
+
+ glTranslatef(0.0, 0.0, zTranslate);
+ glRotatef(xRotation, 1, 0, 0);
+ glRotatef(yRotation, 0, 1, 0);
+ glCallList(cube);
+
+ glPopMatrix();
+
+ glFlush();
+
+ if (doubleBuffer) {
+ glutSwapBuffers();
+ }
+}
+
+static GLenum Args(int argc, char **argv)
+{
+ GLint i;
+
+ doubleBuffer = GL_FALSE;
+
+ for (i = 1; i < argc; i++) {
+ if (strcmp(argv[i], "-sb") == 0) {
+ doubleBuffer = GL_FALSE;
+ } else if (strcmp(argv[i], "-db") == 0) {
+ doubleBuffer = GL_TRUE;
+ } else if (strcmp(argv[i], "-f") == 0) {
+ if (i+1 >= argc || argv[i+1][0] == '-') {
+ printf("-f (No file name).\n");
+ return GL_FALSE;
+ } else {
+ texFileName = argv[++i];
+ }
+ } else {
+ printf("%s (Bad option).\n", argv[i]);
+ return GL_FALSE;
+ }
+ }
+ return GL_TRUE;
+}
+
+int main(int argc, char **argv)
+{
+ GLenum type;
+
+ glutInit(&argc, argv);
+
+ if (Args(argc, argv) == GL_FALSE) {
+ exit(1);
+ }
+
+ if (texFileName == 0) {
+ printf("No image file.\n");
+ exit(1);
+ }
+
+ image = LoadPPM(texFileName);
+
+ glutInitWindowPosition(0, 0); glutInitWindowSize( 300, 300);
+
+ type = GLUT_RGB;
+ type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
+ glutInitDisplayMode(type);
+
+ if (glutCreateWindow("Texture Test") == GL_FALSE) {
+ exit(1);
+ }
+
+ Init();
+
+ glutReshapeFunc(Reshape);
+ glutKeyboardFunc(Key);
+ glutSpecialFunc(Key2);
+ glutDisplayFunc(Draw);
+ glutMainLoop();
+ return 0;
+}
diff --git a/progs/samples/tkmap.c b/progs/samples/tkmap.c
new file mode 100644
index 00000000000..3ded79cacaa
--- /dev/null
+++ b/progs/samples/tkmap.c
@@ -0,0 +1,71 @@
+
+enum {
+ COLOR_BLACK = 0,
+ COLOR_RED,
+ COLOR_GREEN,
+ COLOR_YELLOW,
+ COLOR_BLUE,
+ COLOR_MAGENTA,
+ COLOR_CYAN,
+ COLOR_WHITE
+};
+
+static float RGBMap[9][3] = {
+ {0, 0, 0},
+ {1, 0, 0},
+ {0, 1, 0},
+ {1, 1, 0},
+ {0, 0, 1},
+ {1, 0, 1},
+ {0, 1, 1},
+ {1, 1, 1},
+ {0.5, 0.5, 0.5}
+};
+
+static void SetColor(int c)
+{
+ if (glutGet(GLUT_WINDOW_RGBA))
+ glColor3fv(RGBMap[c]);
+ else
+ glIndexf(c);
+}
+
+static void InitMap(void)
+{
+ int i;
+
+ if (rgb)
+ return;
+
+ for (i = 0; i < 9; i++)
+ glutSetColor(i, RGBMap[i][0], RGBMap[i][1], RGBMap[i][2]);
+}
+
+static void SetFogRamp(int density, int startIndex)
+{
+ int fogValues, colorValues;
+ int i, j, k;
+ float intensity;
+
+ fogValues = 1 << density;
+ colorValues = 1 << startIndex;
+ for (i = 0; i < colorValues; i++) {
+ for (j = 0; j < fogValues; j++) {
+ k = i * fogValues + j;
+ intensity = (i * fogValues + j * colorValues) / 255.0;
+ glutSetColor(k, intensity, intensity, intensity);
+ }
+ }
+}
+
+static void SetGreyRamp(void)
+{
+ int i;
+ float intensity;
+
+ for (i = 0; i < 255; i++) {
+ intensity = i / 255.0;
+ glutSetColor(i, intensity, intensity, intensity);
+ }
+}
+
diff --git a/progs/samples/tri.c b/progs/samples/tri.c
new file mode 100644
index 00000000000..700325132ef
--- /dev/null
+++ b/progs/samples/tri.c
@@ -0,0 +1,403 @@
+/*
+ * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the name of
+ * Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF
+ * ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <GL/glut.h>
+
+
+#define SOLID 1
+#define LINE 2
+#define POINT 3
+
+
+GLenum rgb, doubleBuffer, windType;
+GLint windW, windH;
+
+GLenum dithering = GL_TRUE;
+GLenum showVerticies = GL_TRUE;
+GLenum hideBottomTriangle = GL_FALSE;
+GLenum outline = GL_TRUE;
+GLenum culling = GL_FALSE;
+GLenum winding = GL_FALSE;
+GLenum face = GL_FALSE;
+GLenum state = SOLID;
+GLenum aaMode = GL_FALSE;
+GLenum shade = GL_TRUE;
+
+GLint color1, color2, color3;
+
+float zRotation = 90.0;
+float zoom = 1.0;
+
+float boxA[3] = {-100, -100, 0};
+float boxB[3] = { 100, -100, 0};
+float boxC[3] = { 100, 100, 0};
+float boxD[3] = {-100, 100, 0};
+
+float p0[3] = {-125,-80, 0};
+float p1[3] = {-125, 80, 0};
+float p2[3] = { 172, 0, 0};
+
+
+#include "tkmap.c"
+
+static void Init(void)
+{
+ float r, g, b;
+ float percent1, percent2;
+ GLint i, j;
+
+ glClearColor(0.0, 0.0, 0.0, 0.0);
+
+ glLineStipple(1, 0xF0F0);
+
+ glEnable(GL_SCISSOR_TEST);
+
+ if (!rgb) {
+ for (j = 0; j <= 12; j++) {
+ if (j <= 6) {
+ percent1 = j / 6.0;
+ r = 1.0 - 0.8 * percent1;
+ g = 0.2 + 0.8 * percent1;
+ b = 0.2;
+ } else {
+ percent1 = (j - 6) / 6.0;
+ r = 0.2;
+ g = 1.0 - 0.8 * percent1;
+ b = 0.2 + 0.8 * percent1;
+ }
+ glutSetColor(j+18, r, g, b);
+ for (i = 0; i < 16; i++) {
+ percent2 = i / 15.0;
+ glutSetColor(j*16+1+32, r*percent2, g*percent2, b*percent2);
+ }
+ }
+ color1 = 18;
+ color2 = 24;
+ color3 = 30;
+ }
+}
+
+static void Reshape(int width, int height)
+{
+
+ windW = (GLint)width;
+ windH = (GLint)height;
+}
+
+static void Key2(int key, int x, int y)
+{
+
+ switch (key) {
+ case GLUT_KEY_LEFT:
+ zRotation += 0.5;
+ break;
+ case GLUT_KEY_RIGHT:
+ zRotation -= 0.5;
+ break;
+ default:
+ return;
+ }
+
+ glutPostRedisplay();
+}
+
+static void Key(unsigned char key, int x, int y)
+{
+
+ switch (key) {
+ case 27:
+ exit(1);
+ case 'Z':
+ zoom *= 0.75;
+ break;
+ case 'z':
+ zoom /= 0.75;
+ if (zoom > 10) {
+ zoom = 10;
+ }
+ break;
+ case '1':
+ glPolygonMode(GL_FRONT_AND_BACK, GL_POINT);
+ break;
+ case '2':
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ break;
+ case '3':
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ break;
+ case '4':
+ state = POINT;
+ break;
+ case '5':
+ state = LINE;
+ break;
+ case '6':
+ state = SOLID;
+ break;
+ case '7':
+ culling = !culling;
+ break;
+ case '8':
+ winding = !winding;
+ break;
+ case '9':
+ face = !face;
+ break;
+ case 'v':
+ showVerticies = !showVerticies;
+ break;
+ case 's':
+ shade = !shade;
+ (shade) ? glShadeModel(GL_SMOOTH) : glShadeModel(GL_FLAT);
+ break;
+ case 'h':
+ hideBottomTriangle = !hideBottomTriangle;
+ break;
+ case 'o':
+ outline = !outline;
+ break;
+ case 'm':
+ dithering = !dithering;
+ break;
+ case '0':
+ aaMode = !aaMode;
+ if (aaMode) {
+ glEnable(GL_POLYGON_SMOOTH);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE);
+ if (!rgb) {
+ color1 = 32;
+ color2 = 128;
+ color3 = 224;
+ }
+ } else {
+ glDisable(GL_POLYGON_SMOOTH);
+ glDisable(GL_BLEND);
+ if (!rgb) {
+ color1 = 18;
+ color2 = 24;
+ color3 = 30;
+ }
+ }
+ break;
+ default:
+ return;
+ }
+
+ glutPostRedisplay();
+}
+
+static void BeginPrim(void)
+{
+
+ switch (state) {
+ case SOLID:
+ glBegin(GL_POLYGON);
+ break;
+ case LINE:
+ glBegin(GL_LINE_LOOP);
+ break;
+ case POINT:
+ glBegin(GL_POINTS);
+ break;
+ default:
+ break;
+ }
+}
+
+static void EndPrim(void)
+{
+
+ glEnd();
+}
+
+static void Draw(void)
+{
+ float scaleX, scaleY;
+
+ glViewport(0, 0, windW, windH);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluOrtho2D(-175, 175, -175, 175);
+ glMatrixMode(GL_MODELVIEW);
+
+ glScissor(0, 0, windW, windH);
+
+ (culling) ? glEnable(GL_CULL_FACE) : glDisable(GL_CULL_FACE);
+ (winding) ? glFrontFace(GL_CCW) : glFrontFace(GL_CW);
+ (face) ? glCullFace(GL_FRONT) : glCullFace(GL_BACK);
+
+ (dithering) ? glEnable(GL_DITHER) : glDisable(GL_DITHER);
+
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ SetColor(COLOR_GREEN);
+ glBegin(GL_LINE_LOOP);
+ glVertex3fv(boxA);
+ glVertex3fv(boxB);
+ glVertex3fv(boxC);
+ glVertex3fv(boxD);
+ glEnd();
+
+ if (!hideBottomTriangle) {
+ glPushMatrix();
+
+ glScalef(zoom, zoom, zoom);
+ glRotatef(zRotation, 0, 0, 1);
+
+ SetColor(COLOR_BLUE);
+ BeginPrim();
+ glVertex3fv(p0);
+ glVertex3fv(p1);
+ glVertex3fv(p2);
+ EndPrim();
+
+ if (showVerticies) {
+ (rgb) ? glColor3fv(RGBMap[COLOR_RED]) : glIndexf(color1);
+ glRectf(p0[0]-2, p0[1]-2, p0[0]+2, p0[1]+2);
+ (rgb) ? glColor3fv(RGBMap[COLOR_GREEN]) : glIndexf(color2);
+ glRectf(p1[0]-2, p1[1]-2, p1[0]+2, p1[1]+2);
+ (rgb) ? glColor3fv(RGBMap[COLOR_BLUE]) : glIndexf(color3);
+ glRectf(p2[0]-2, p2[1]-2, p2[0]+2, p2[1]+2);
+ }
+
+ glPopMatrix();
+ }
+
+ scaleX = (float)(windW - 20) / 2 / 175 * (175 - 100) + 10;
+ scaleY = (float)(windH - 20) / 2 / 175 * (175 - 100) + 10;
+
+ glViewport(scaleX, scaleY, windW-2*scaleX, windH-2*scaleY);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluOrtho2D(-100, 100, -100, 100);
+ glMatrixMode(GL_MODELVIEW);
+
+ glScissor(scaleX, scaleY, windW-2*scaleX, windH-2*scaleY);
+
+ glPushMatrix();
+
+ glScalef(zoom, zoom, zoom);
+ glRotatef(zRotation, 0,0,1);
+
+ glPointSize(10);
+ glLineWidth(5);
+ glEnable(GL_POINT_SMOOTH);
+ glEnable(GL_LINE_STIPPLE);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ SetColor(COLOR_RED);
+ BeginPrim();
+ (rgb) ? glColor3fv(RGBMap[COLOR_RED]) : glIndexf(color1);
+ glVertex3fv(p0);
+ (rgb) ? glColor3fv(RGBMap[COLOR_GREEN]) : glIndexf(color2);
+ glVertex3fv(p1);
+ (rgb) ? glColor3fv(RGBMap[COLOR_BLUE]) : glIndexf(color3);
+ glVertex3fv(p2);
+ EndPrim();
+
+ glPointSize(1);
+ glLineWidth(1);
+ glDisable(GL_POINT_SMOOTH);
+ glDisable(GL_LINE_STIPPLE);
+ glBlendFunc(GL_ONE, GL_ZERO);
+
+ if (outline) {
+ SetColor(COLOR_WHITE);
+ glBegin(GL_LINE_LOOP);
+ glVertex3fv(p0);
+ glVertex3fv(p1);
+ glVertex3fv(p2);
+ glEnd();
+ }
+
+ glPopMatrix();
+
+ glFlush();
+
+ if (doubleBuffer) {
+ glutSwapBuffers();
+ }
+}
+
+static GLenum Args(int argc, char **argv)
+{
+ GLint i;
+
+ rgb = GL_TRUE;
+ doubleBuffer = GL_FALSE;
+
+ for (i = 1; i < argc; i++) {
+ if (strcmp(argv[i], "-ci") == 0) {
+ rgb = GL_FALSE;
+ } else if (strcmp(argv[i], "-rgb") == 0) {
+ rgb = GL_TRUE;
+ } else if (strcmp(argv[i], "-sb") == 0) {
+ doubleBuffer = GL_FALSE;
+ } else if (strcmp(argv[i], "-db") == 0) {
+ doubleBuffer = GL_TRUE;
+ } else {
+ printf("%s (Bad option).\n", argv[i]);
+ return GL_FALSE;
+ }
+ }
+ return GL_TRUE;
+}
+
+int main(int argc, char **argv)
+{
+ glutInit(&argc, argv);
+
+ if (Args(argc, argv) == GL_FALSE) {
+ exit(1);
+ }
+
+ windW = 600;
+ windH = 300;
+ glutInitWindowPosition(0, 0); glutInitWindowSize( windW, windH);
+
+ windType = (rgb) ? GLUT_RGB : GLUT_INDEX;
+ windType |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
+ glutInitDisplayMode(windType);
+
+ if (glutCreateWindow("Triangle Test") == GL_FALSE) {
+ exit(1);
+ }
+
+ InitMap();
+
+ Init();
+
+ glutReshapeFunc(Reshape);
+ glutKeyboardFunc(Key);
+ glutSpecialFunc(Key2);
+ glutDisplayFunc(Draw);
+ glutMainLoop();
+ return 0;
+}
diff --git a/progs/samples/wave.c b/progs/samples/wave.c
new file mode 100644
index 00000000000..d3c4687459e
--- /dev/null
+++ b/progs/samples/wave.c
@@ -0,0 +1,619 @@
+/*
+ * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the name of
+ * Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Silicon Graphics.
+ *
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF
+ * ANY KIND,
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <math.h>
+#include <GL/glut.h>
+
+#ifndef PI
+#define PI 3.14159265358979323846
+#endif
+
+#define GETCOORD(frame, x, y) (&(theMesh.coords[frame*theMesh.numCoords+(x)+(y)*(theMesh.widthX+1)]))
+#define GETFACET(frame, x, y) (&(theMesh.facets[frame*theMesh.numFacets+(x)+(y)*theMesh.widthX]))
+
+
+GLenum rgb, doubleBuffer;
+
+#include "tkmap.c"
+
+GLint colorIndexes1[3];
+GLint colorIndexes2[3];
+GLenum clearMask = GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT;
+
+GLenum smooth = GL_FALSE;
+GLenum lighting = GL_TRUE;
+GLenum depth = GL_TRUE;
+GLenum stepMode = GL_FALSE;
+GLenum spinMode = GL_FALSE;
+GLint contouring = 0;
+
+GLint widthX, widthY;
+GLint checkerSize;
+float height;
+
+GLint frames, curFrame = 0, nextFrame = 0;
+
+struct facet {
+ float color[3];
+ float normal[3];
+};
+struct coord {
+ float vertex[3];
+ float normal[3];
+};
+struct mesh {
+ GLint widthX, widthY;
+ GLint numFacets;
+ GLint numCoords;
+ GLint frames;
+ struct coord *coords;
+ struct facet *facets;
+} theMesh;
+
+GLubyte contourTexture1[] = {
+ 255, 255, 255, 255,
+ 255, 255, 255, 255,
+ 255, 255, 255, 255,
+ 127, 127, 127, 127,
+};
+GLubyte contourTexture2[] = {
+ 255, 255, 255, 255,
+ 255, 127, 127, 127,
+ 255, 127, 127, 127,
+ 255, 127, 127, 127,
+};
+
+#if !defined(GLUTCALLBACK)
+#define GLUTCALLBACK
+#endif
+
+
+void GLUTCALLBACK glut_post_redisplay_p(void)
+{
+ static double t0 = -1.;
+ double t, dt;
+ t = glutGet(GLUT_ELAPSED_TIME) / 1000.;
+ if (t0 < 0.)
+ t0 = t;
+ dt = t - t0;
+
+ if (dt < 1./30.)
+ return;
+
+ t0 = t;
+
+ glutPostRedisplay();
+}
+
+static void Animate(void)
+{
+ struct coord *coord;
+ struct facet *facet;
+ float *lastColor;
+ float *thisColor;
+ GLint i, j;
+
+ glClear(clearMask);
+
+ if (nextFrame || !stepMode) {
+ curFrame++;
+ }
+ if (curFrame >= theMesh.frames) {
+ curFrame = 0;
+ }
+
+ if ((nextFrame || !stepMode) && spinMode) {
+ glRotatef(5.0, 0.0, 0.0, 1.0);
+ }
+ nextFrame = 0;
+
+ for (i = 0; i < theMesh.widthX; i++) {
+ glBegin(GL_QUAD_STRIP);
+ lastColor = NULL;
+ for (j = 0; j < theMesh.widthY; j++) {
+ facet = GETFACET(curFrame, i, j);
+ if (!smooth && lighting) {
+ glNormal3fv(facet->normal);
+ }
+ if (lighting) {
+ if (rgb) {
+ thisColor = facet->color;
+ glColor3fv(facet->color);
+ } else {
+ thisColor = facet->color;
+ glMaterialfv(GL_FRONT_AND_BACK, GL_COLOR_INDEXES,
+ facet->color);
+ }
+ } else {
+ if (rgb) {
+ thisColor = facet->color;
+ glColor3fv(facet->color);
+ } else {
+ thisColor = facet->color;
+ glIndexf(facet->color[1]);
+ }
+ }
+
+ if (!lastColor || (thisColor[0] != lastColor[0] && smooth)) {
+ if (lastColor) {
+ glEnd();
+ glBegin(GL_QUAD_STRIP);
+ }
+ coord = GETCOORD(curFrame, i, j);
+ if (smooth && lighting) {
+ glNormal3fv(coord->normal);
+ }
+ glVertex3fv(coord->vertex);
+
+ coord = GETCOORD(curFrame, i+1, j);
+ if (smooth && lighting) {
+ glNormal3fv(coord->normal);
+ }
+ glVertex3fv(coord->vertex);
+ }
+
+ coord = GETCOORD(curFrame, i, j+1);
+ if (smooth && lighting) {
+ glNormal3fv(coord->normal);
+ }
+ glVertex3fv(coord->vertex);
+
+ coord = GETCOORD(curFrame, i+1, j+1);
+ if (smooth && lighting) {
+ glNormal3fv(coord->normal);
+ }
+ glVertex3fv(coord->vertex);
+
+ lastColor = thisColor;
+ }
+ glEnd();
+ }
+
+ glFlush();
+ if (doubleBuffer) {
+ glutSwapBuffers();
+ }
+}
+
+static void SetColorMap(void)
+{
+ static float green[3] = {0.2, 1.0, 0.2};
+ static float red[3] = {1.0, 0.2, 0.2};
+ float *color = 0, percent;
+ GLint *indexes = 0, entries, i, j;
+
+ entries = glutGet(GLUT_WINDOW_COLORMAP_SIZE);
+
+ colorIndexes1[0] = 1;
+ colorIndexes1[1] = 1 + (GLint)((entries - 1) * 0.3);
+ colorIndexes1[2] = (GLint)((entries - 1) * 0.5);
+ colorIndexes2[0] = 1 + (GLint)((entries - 1) * 0.5);
+ colorIndexes2[1] = 1 + (GLint)((entries - 1) * 0.8);
+ colorIndexes2[2] = entries - 1;
+
+ for (i = 0; i < 2; i++) {
+ switch (i) {
+ case 0:
+ color = green;
+ indexes = colorIndexes1;
+ break;
+ case 1:
+ color = red;
+ indexes = colorIndexes2;
+ break;
+ }
+
+ for (j = indexes[0]; j < indexes[1]; j++) {
+ percent = 0.2 + 0.8 * (j - indexes[0]) /
+ (float)(indexes[1] - indexes[0]);
+ glutSetColor(j, percent*color[0], percent*color[1],
+ percent*color[2]);
+ }
+ for (j=indexes[1]; j<=indexes[2]; j++) {
+ percent = (j - indexes[1]) / (float)(indexes[2] - indexes[1]);
+ glutSetColor(j, percent*(1-color[0])+color[0],
+ percent*(1-color[1])+color[1],
+ percent*(1-color[2])+color[2]);
+ }
+ }
+}
+
+static void InitMesh(void)
+{
+ struct coord *coord;
+ struct facet *facet;
+ float dp1[3], dp2[3];
+ float *pt1, *pt2, *pt3;
+ float angle, d, x, y;
+ GLint numFacets, numCoords, frameNum, i, j;
+
+ theMesh.widthX = widthX;
+ theMesh.widthY = widthY;
+ theMesh.frames = frames;
+
+ numFacets = widthX * widthY;
+ numCoords = (widthX + 1) * (widthY + 1);
+
+ theMesh.numCoords = numCoords;
+ theMesh.numFacets = numFacets;
+
+ theMesh.coords = (struct coord *)malloc(frames*numCoords*
+ sizeof(struct coord));
+ theMesh.facets = (struct facet *)malloc(frames*numFacets*
+ sizeof(struct facet));
+ if (theMesh.coords == NULL || theMesh.facets == NULL) {
+ printf("Out of memory.\n");
+ exit(1);
+ }
+
+ for (frameNum = 0; frameNum < frames; frameNum++) {
+ for (i = 0; i <= widthX; i++) {
+ x = i / (float)widthX;
+ for (j = 0; j <= widthY; j++) {
+ y = j / (float)widthY;
+
+ d = sqrt(x*x+y*y);
+ if (d == 0.0) {
+ d = 0.0001;
+ }
+ angle = 2 * PI * d + (2 * PI / frames * frameNum);
+
+ coord = GETCOORD(frameNum, i, j);
+
+ coord->vertex[0] = x - 0.5;
+ coord->vertex[1] = y - 0.5;
+ coord->vertex[2] = (height - height * d) * cos(angle);
+
+ coord->normal[0] = -(height / d) * x * ((1 - d) * 2 * PI *
+ sin(angle) + cos(angle));
+ coord->normal[1] = -(height / d) * y * ((1 - d) * 2 * PI *
+ sin(angle) + cos(angle));
+ coord->normal[2] = -1;
+
+ d = 1.0 / sqrt(coord->normal[0]*coord->normal[0]+
+ coord->normal[1]*coord->normal[1]+1);
+ coord->normal[0] *= d;
+ coord->normal[1] *= d;
+ coord->normal[2] *= d;
+ }
+ }
+ for (i = 0; i < widthX; i++) {
+ for (j = 0; j < widthY; j++) {
+ facet = GETFACET(frameNum, i, j);
+ if (((i/checkerSize)%2)^(j/checkerSize)%2) {
+ if (rgb) {
+ facet->color[0] = 1.0;
+ facet->color[1] = 0.2;
+ facet->color[2] = 0.2;
+ } else {
+ facet->color[0] = colorIndexes1[0];
+ facet->color[1] = colorIndexes1[1];
+ facet->color[2] = colorIndexes1[2];
+ }
+ } else {
+ if (rgb) {
+ facet->color[0] = 0.2;
+ facet->color[1] = 1.0;
+ facet->color[2] = 0.2;
+ } else {
+ facet->color[0] = colorIndexes2[0];
+ facet->color[1] = colorIndexes2[1];
+ facet->color[2] = colorIndexes2[2];
+ }
+ }
+ pt1 = GETCOORD(frameNum, i, j)->vertex;
+ pt2 = GETCOORD(frameNum, i, j+1)->vertex;
+ pt3 = GETCOORD(frameNum, i+1, j+1)->vertex;
+
+ dp1[0] = pt2[0] - pt1[0];
+ dp1[1] = pt2[1] - pt1[1];
+ dp1[2] = pt2[2] - pt1[2];
+
+ dp2[0] = pt3[0] - pt2[0];
+ dp2[1] = pt3[1] - pt2[1];
+ dp2[2] = pt3[2] - pt2[2];
+
+ facet->normal[0] = dp1[1] * dp2[2] - dp1[2] * dp2[1];
+ facet->normal[1] = dp1[2] * dp2[0] - dp1[0] * dp2[2];
+ facet->normal[2] = dp1[0] * dp2[1] - dp1[1] * dp2[0];
+
+ d = 1.0 / sqrt(facet->normal[0]*facet->normal[0]+
+ facet->normal[1]*facet->normal[1]+
+ facet->normal[2]*facet->normal[2]);
+
+ facet->normal[0] *= d;
+ facet->normal[1] *= d;
+ facet->normal[2] *= d;
+ }
+ }
+ }
+}
+
+static void InitMaterials(void)
+{
+ static float ambient[] = {0.1, 0.1, 0.1, 1.0};
+ static float diffuse[] = {0.5, 1.0, 1.0, 1.0};
+ static float position[] = {90.0, 90.0, 150.0, 0.0};
+ static float front_mat_shininess[] = {60.0};
+ static float front_mat_specular[] = {0.2, 0.2, 0.2, 1.0};
+ static float front_mat_diffuse[] = {0.5, 0.28, 0.38, 1.0};
+ static float back_mat_shininess[] = {60.0};
+ static float back_mat_specular[] = {0.5, 0.5, 0.2, 1.0};
+ static float back_mat_diffuse[] = {1.0, 1.0, 0.2, 1.0};
+ static float lmodel_ambient[] = {1.0, 1.0, 1.0, 1.0};
+ static float lmodel_twoside[] = {GL_TRUE};
+
+ glMatrixMode(GL_PROJECTION);
+ gluPerspective(90.0, 1.0, 0.5, 10.0);
+
+ glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+ glLightfv(GL_LIGHT0, GL_POSITION, position);
+ glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+ glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+
+ glMaterialfv(GL_FRONT, GL_SHININESS, front_mat_shininess);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, front_mat_specular);
+ glMaterialfv(GL_FRONT, GL_DIFFUSE, front_mat_diffuse);
+ glMaterialfv(GL_BACK, GL_SHININESS, back_mat_shininess);
+ glMaterialfv(GL_BACK, GL_SPECULAR, back_mat_specular);
+ glMaterialfv(GL_BACK, GL_DIFFUSE, back_mat_diffuse);
+ if (rgb) {
+ glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
+ }
+
+ if (rgb) {
+ glEnable(GL_COLOR_MATERIAL);
+ } else {
+ SetColorMap();
+ }
+}
+
+static void InitTexture(void)
+{
+
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+}
+
+static void Init(void)
+{
+
+ glClearColor(0.0, 0.0, 0.0, 0.0);
+
+ glShadeModel(GL_FLAT);
+
+ glFrontFace(GL_CW);
+
+ glEnable(GL_DEPTH_TEST);
+
+ InitMaterials();
+ InitTexture();
+ InitMesh();
+
+ glMatrixMode(GL_MODELVIEW);
+ glTranslatef(0.0, 0.4, -1.8);
+ glScalef(2.0, 2.0, 2.0);
+ glRotatef(-35.0, 1.0, 0.0, 0.0);
+ glRotatef(35.0, 0.0, 0.0, 1.0);
+}
+
+static void Reshape(int width, int height)
+{
+
+ glViewport(0, 0, (GLint)width, (GLint)height);
+}
+
+static void Key(unsigned char key, int x, int y)
+{
+
+ switch (key) {
+ case 27:
+ exit(1);
+ case 'c':
+ contouring++;
+ if (contouring == 1) {
+ static GLfloat map[4] = {0, 0, 20, 0};
+
+ glTexImage2D(GL_TEXTURE_2D, 0, 3, 4, 4, 0, GL_LUMINANCE,
+ GL_UNSIGNED_BYTE, (GLvoid *)contourTexture1);
+ glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+ glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+ glTexGenfv(GL_S, GL_OBJECT_PLANE, map);
+ glTexGenfv(GL_T, GL_OBJECT_PLANE, map);
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_TEXTURE_GEN_S);
+ glEnable(GL_TEXTURE_GEN_T);
+ } else if (contouring == 2) {
+ static GLfloat map[4] = {0, 0, 20, 0};
+
+ glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
+ glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
+ glPushMatrix();
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glTexGenfv(GL_S, GL_EYE_PLANE, map);
+ glTexGenfv(GL_T, GL_EYE_PLANE, map);
+ glPopMatrix();
+ } else {
+ contouring = 0;
+ glDisable(GL_TEXTURE_GEN_S);
+ glDisable(GL_TEXTURE_GEN_T);
+ glDisable(GL_TEXTURE_2D);
+ }
+ break;
+ case 's':
+ smooth = !smooth;
+ if (smooth) {
+ glShadeModel(GL_SMOOTH);
+ } else {
+ glShadeModel(GL_FLAT);
+ }
+ break;
+ case 'l':
+ lighting = !lighting;
+ if (lighting) {
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ if (rgb) {
+ glEnable(GL_COLOR_MATERIAL);
+ }
+ } else {
+ glDisable(GL_LIGHTING);
+ glDisable(GL_LIGHT0);
+ if (rgb) {
+ glDisable(GL_COLOR_MATERIAL);
+ }
+ }
+ break;
+ case 'd':
+ depth = !depth;
+ if (depth) {
+ glEnable(GL_DEPTH_TEST);
+ clearMask |= GL_DEPTH_BUFFER_BIT;
+ } else {
+ glDisable(GL_DEPTH_TEST);
+ clearMask &= ~GL_DEPTH_BUFFER_BIT;
+ }
+ break;
+ case 32:
+ stepMode = !stepMode;
+ if (stepMode) {
+ glutIdleFunc(0);
+ } else {
+ glutIdleFunc(glut_post_redisplay_p);
+ }
+ break;
+ case 'n':
+ if (stepMode) {
+ nextFrame = 1;
+ }
+ break;
+ case 'a':
+ spinMode = !spinMode;
+ break;
+ default:
+ return;
+ }
+ glutPostRedisplay();
+}
+
+static GLenum Args(int argc, char **argv)
+{
+ GLint i;
+
+ rgb = GL_TRUE;
+ doubleBuffer = GL_TRUE;
+ frames = 10;
+ widthX = 10;
+ widthY = 10;
+ checkerSize = 2;
+ height = 0.2;
+
+ for (i = 1; i < argc; i++) {
+ if (strcmp(argv[i], "-ci") == 0) {
+ rgb = GL_FALSE;
+ } else if (strcmp(argv[i], "-rgb") == 0) {
+ rgb = GL_TRUE;
+ } else if (strcmp(argv[i], "-sb") == 0) {
+ doubleBuffer = GL_FALSE;
+ } else if (strcmp(argv[i], "-db") == 0) {
+ doubleBuffer = GL_TRUE;
+ } else if (strcmp(argv[i], "-grid") == 0) {
+ if (i+2 >= argc || argv[i+1][0] == '-' || argv[i+2][0] == '-') {
+ printf("-grid (No numbers).\n");
+ return GL_FALSE;
+ } else {
+ widthX = atoi(argv[++i]);
+ widthY = atoi(argv[++i]);
+ }
+ } else if (strcmp(argv[i], "-size") == 0) {
+ if (i+1 >= argc || argv[i+1][0] == '-') {
+ printf("-checker (No number).\n");
+ return GL_FALSE;
+ } else {
+ checkerSize = atoi(argv[++i]);
+ }
+ } else if (strcmp(argv[i], "-wave") == 0) {
+ if (i+1 >= argc || argv[i+1][0] == '-') {
+ printf("-wave (No number).\n");
+ return GL_FALSE;
+ } else {
+ height = atof(argv[++i]);
+ }
+ } else if (strcmp(argv[i], "-frames") == 0) {
+ if (i+1 >= argc || argv[i+1][0] == '-') {
+ printf("-frames (No number).\n");
+ return GL_FALSE;
+ } else {
+ frames = atoi(argv[++i]);
+ }
+ } else {
+ printf("%s (Bad option).\n", argv[i]);
+ return GL_FALSE;
+ }
+ }
+ return GL_TRUE;
+}
+
+int main(int argc, char **argv)
+{
+ GLenum type;
+
+ glutInit(&argc, argv);
+
+ if (Args(argc, argv) == GL_FALSE) {
+ exit(1);
+ }
+
+ glutInitWindowPosition(0, 0); glutInitWindowSize( 300, 300);
+
+ type = GLUT_DEPTH;
+ type |= (rgb) ? GLUT_RGB : GLUT_INDEX;
+ type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
+ glutInitDisplayMode(type);
+
+ if (glutCreateWindow("Wave Demo") == GL_FALSE) {
+ exit(1);
+ }
+
+ InitMap();
+
+ Init();
+
+ glutReshapeFunc(Reshape);
+ glutKeyboardFunc(Key);
+ glutDisplayFunc(Animate);
+ glutIdleFunc(glut_post_redisplay_p);
+ glutMainLoop();
+ return 0;
+}