aboutsummaryrefslogtreecommitdiffstats
path: root/progs/demos
diff options
context:
space:
mode:
Diffstat (limited to 'progs/demos')
-rw-r--r--progs/demos/.cvsignore48
-rw-r--r--progs/demos/Makefile119
-rw-r--r--progs/demos/Makefile.cygnus87
-rw-r--r--progs/demos/Makefile.win118
-rw-r--r--progs/demos/README230
-rw-r--r--progs/demos/Windows/all.dsp101
-rw-r--r--progs/demos/Windows/bounce.dsp112
-rw-r--r--progs/demos/Windows/clearspd.dsp112
-rw-r--r--progs/demos/Windows/cubemap.dsp112
-rw-r--r--progs/demos/Windows/demos.dsw782
-rw-r--r--progs/demos/Windows/drawpix.dsp112
-rw-r--r--progs/demos/Windows/fire.dsp112
-rw-r--r--progs/demos/Windows/gears.dsp112
-rw-r--r--progs/demos/Windows/geartrain.dsp112
-rw-r--r--progs/demos/Windows/glinfo.dsp112
-rw-r--r--progs/demos/Windows/gloss.dsp112
-rw-r--r--progs/demos/Windows/gltestperf.dsp112
-rw-r--r--progs/demos/Windows/glutfx.dsp112
-rw-r--r--progs/demos/Windows/ipers.dsp112
-rw-r--r--progs/demos/Windows/isosurf.dsp112
-rw-r--r--progs/demos/Windows/loadbias.dsp112
-rw-r--r--progs/demos/Windows/morph3d.dsp112
-rw-r--r--progs/demos/Windows/multiarb.dsp112
-rw-r--r--progs/demos/Windows/occlude.dsp112
-rw-r--r--progs/demos/Windows/osdemo.dsp112
-rw-r--r--progs/demos/Windows/paltex.dsp112
-rw-r--r--progs/demos/Windows/pixeltex.dsp112
-rw-r--r--progs/demos/Windows/pointblast.dsp112
-rw-r--r--progs/demos/Windows/rain.dsp112
-rw-r--r--progs/demos/Windows/ray.dsp112
-rw-r--r--progs/demos/Windows/readpix.dsp112
-rw-r--r--progs/demos/Windows/reflect.dsp112
-rw-r--r--progs/demos/Windows/renormal.dsp112
-rw-r--r--progs/demos/Windows/shadowtex.dsp112
-rw-r--r--progs/demos/Windows/spectex.dsp112
-rw-r--r--progs/demos/Windows/spriteblast.dsp112
-rw-r--r--progs/demos/Windows/stex3d.dsp112
-rw-r--r--progs/demos/Windows/teapot.dsp112
-rw-r--r--progs/demos/Windows/terrain.dsp112
-rw-r--r--progs/demos/Windows/tessdemo.dsp112
-rw-r--r--progs/demos/Windows/texcyl.dsp112
-rw-r--r--progs/demos/Windows/texdown.dsp112
-rw-r--r--progs/demos/Windows/texenv.dsp112
-rw-r--r--progs/demos/Windows/texobj.dsp112
-rw-r--r--progs/demos/Windows/trispd.dsp112
-rw-r--r--progs/demos/Windows/tunnel.dsp112
-rw-r--r--progs/demos/Windows/tunnel2.dsp112
-rw-r--r--progs/demos/Windows/winpos.dsp112
-rw-r--r--progs/demos/arbfplight.c395
-rw-r--r--progs/demos/arbfslight.c289
-rw-r--r--progs/demos/arbocclude.c283
-rw-r--r--progs/demos/bounce.c226
-rw-r--r--progs/demos/clearspd.c218
-rw-r--r--progs/demos/cubemap.c475
-rw-r--r--progs/demos/descrip.mms90
-rw-r--r--progs/demos/drawpix.c358
-rw-r--r--progs/demos/fire.c777
-rw-r--r--progs/demos/fogcoord.c420
-rw-r--r--progs/demos/fplight.c285
-rw-r--r--progs/demos/gamma.c162
-rw-r--r--progs/demos/gearbox.c485
-rw-r--r--progs/demos/gears.c381
-rw-r--r--progs/demos/geartrain.c1073
-rw-r--r--progs/demos/geartrain.dat119
-rw-r--r--progs/demos/glinfo.c32
-rw-r--r--progs/demos/gloss.c483
-rwxr-xr-xprogs/demos/glslnoise.c185
-rw-r--r--progs/demos/gltestperf.c580
-rw-r--r--progs/demos/glutfx.c189
-rw-r--r--progs/demos/ipers.c712
-rw-r--r--progs/demos/isosurf.c1125
-rw-r--r--progs/demos/isosurf.dat7179
-rw-r--r--progs/demos/lodbias.c282
-rw-r--r--progs/demos/morph3d.c896
-rw-r--r--progs/demos/multiarb.c345
-rw-r--r--progs/demos/occlude.c234
-rw-r--r--progs/demos/paltex.c270
-rw-r--r--progs/demos/particles.cxx219
-rw-r--r--progs/demos/particles.h81
-rw-r--r--progs/demos/pointblast.c498
-rw-r--r--progs/demos/rain.cxx394
-rw-r--r--progs/demos/ray.c904
-rw-r--r--progs/demos/readpix.c344
-rw-r--r--progs/demos/reflect.c590
-rw-r--r--progs/demos/renormal.c139
-rw-r--r--progs/demos/shadowtex.c766
-rw-r--r--progs/demos/singlebuffer.c269
-rw-r--r--progs/demos/spectex.c272
-rw-r--r--progs/demos/spriteblast.c554
-rw-r--r--progs/demos/stex3d.c678
-rw-r--r--progs/demos/teapot.c675
-rw-r--r--progs/demos/terrain.c656
-rw-r--r--progs/demos/terrain.dat1
-rw-r--r--progs/demos/tessdemo.c524
-rw-r--r--progs/demos/texcyl.c288
-rw-r--r--progs/demos/texdown.c403
-rw-r--r--progs/demos/texenv.c815
-rw-r--r--progs/demos/texobj.c284
-rw-r--r--progs/demos/trispd.c253
-rw-r--r--progs/demos/tunnel.c535
-rw-r--r--progs/demos/tunnel2.c605
-rw-r--r--progs/demos/tunneldat.h395
-rw-r--r--progs/demos/winpos.c118
103 files changed, 35885 insertions, 0 deletions
diff --git a/progs/demos/.cvsignore b/progs/demos/.cvsignore
new file mode 100644
index 00000000000..f764b3d117e
--- /dev/null
+++ b/progs/demos/.cvsignore
@@ -0,0 +1,48 @@
+.cvsignore
+arbfplight
+arbocclude
+bounce
+clearspd
+cubemap
+drawpix
+fire
+fplight
+gamma
+gears
+geartrain
+glinfo
+gloss
+gltestperf
+glutfx
+ipers
+isosurf
+lodbias
+morph3d
+multiarb
+occlude
+osdemo
+paltex
+pixeltex
+pointblast
+ray
+readpix
+readtex.c
+readtex.h
+reflect
+renormal
+shadowtex
+showbuffer.c
+showbuffer.h
+spectex
+stex3d
+teapot
+terrain
+tessdemo
+texcyl
+texdown
+texenv
+texobj
+trispd
+tunnel
+tunnel2
+winpos
diff --git a/progs/demos/Makefile b/progs/demos/Makefile
new file mode 100644
index 00000000000..c7a4cc7b828
--- /dev/null
+++ b/progs/demos/Makefile
@@ -0,0 +1,119 @@
+# progs/demos/Makefile
+
+TOP = ../..
+include $(TOP)/configs/current
+
+INCDIR = $(TOP)/include
+
+OSMESA_LIBS = -L$(LIB_DIR) -lglut -lOSMesa -lGLU -lGL $(APP_LIB_DEPS)
+
+OSMESA16_LIBS = -L$(LIB_DIR) -lglut -lOSMesa16 -lGLU -lGL $(APP_LIB_DEPS)
+
+OSMESA32_LIBS = -L$(LIB_DIR) -lglut -lOSMesa32 -lGLU -lGL $(APP_LIB_DEPS)
+
+LIB_DEP = $(LIB_DIR)/$(GL_LIB_NAME) $(LIB_DIR)/$(GLU_LIB_NAME) $(LIB_DIR)/$(GLUT_LIB_NAME)
+
+PROGS = \
+ arbfplight \
+ arbfslight \
+ arbocclude \
+ bounce \
+ clearspd \
+ cubemap \
+ drawpix \
+ fire \
+ fogcoord \
+ fplight \
+ gamma \
+ gearbox \
+ gears \
+ geartrain \
+ glinfo \
+ gloss \
+ glslnoise \
+ gltestperf \
+ glutfx \
+ isosurf \
+ ipers \
+ lodbias \
+ morph3d \
+ multiarb \
+ occlude \
+ paltex \
+ pointblast \
+ ray \
+ readpix \
+ reflect \
+ renormal \
+ shadowtex \
+ singlebuffer \
+ spectex \
+ spriteblast \
+ stex3d \
+ teapot \
+ terrain \
+ tessdemo \
+ texcyl \
+ texdown \
+ texenv \
+ texobj \
+ trispd \
+ tunnel \
+ tunnel2 \
+ winpos
+
+
+##### RULES #####
+
+.SUFFIXES:
+.SUFFIXES: .c
+
+
+# make executable from .c file:
+.c: $(LIB_DEP) readtex.o
+ $(CC) -I$(INCDIR) $(CFLAGS) $< readtex.o $(APP_LIB_DEPS) -o $@
+
+
+##### TARGETS #####
+
+default: $(PROGS)
+
+$(PROGS): readtex.o
+
+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) readtex.c
+
+
+showbuffer.c: $(TOP)/progs/util/showbuffer.c
+ cp $< .
+
+showbuffer.h: $(TOP)/progs/util/showbuffer.h
+ cp $< .
+
+showbuffer.o: showbuffer.c showbuffer.h
+ $(CC) -c -I$(INCDIR) $(CFLAGS) showbuffer.c
+
+
+reflect: reflect.o showbuffer.o readtex.o
+ $(CC) -I$(INCDIR) $(CFLAGS) reflect.o showbuffer.o readtex.o $(APP_LIB_DEPS) -o $@
+
+reflect.o: reflect.c showbuffer.h
+ $(CC) -c -I$(INCDIR) $(CFLAGS) reflect.c
+
+
+shadowtex: shadowtex.o showbuffer.o
+ $(CC) -I$(INCDIR) $(CFLAGS) shadowtex.o showbuffer.o $(APP_LIB_DEPS) -o $@
+
+shadowtex.o: shadowtex.c showbuffer.h
+ $(CC) -c -I$(INCDIR) $(CFLAGS) shadowtex.c
+
+clean:
+ -rm -f $(PROGS)
+ -rm -f *.o *~
+ -rm -f readtex.[ch] showbuffer.[ch]
diff --git a/progs/demos/Makefile.cygnus b/progs/demos/Makefile.cygnus
new file mode 100644
index 00000000000..0efc1ab0c99
--- /dev/null
+++ b/progs/demos/Makefile.cygnus
@@ -0,0 +1,87 @@
+
+# Mesa 3-D graphics library
+# Version: 3.3
+# Copyright (C) 1995-2000 Brian Paul
+
+
+# Makefile for demo programs for cygnus
+# Stephane Rehel ([email protected]) April 13 1997
+
+
+
+##### MACROS #####
+
+INCDIR = ../include
+LIBDIR = ../lib
+
+GL_LIBS = -L$(LIBDIR) -lglut -lMesaGLU -lMesaGL -lm $(WLIBS)
+
+LIB_DEP = $(LIBDIR)/$(GL_LIB) $(LIBDIR)/$(GLU_LIB) $(LIBDIR)/$(GLUT_LIB)
+
+PROGS = bounce \
+ clearspd \
+ cubemap \
+ drawpix \
+ fire \
+ gamma \
+ gears \
+ geartrain \
+ glinfo \
+ gloss \
+ gltestperf \
+ glutfx \
+ isosurf \
+ ipers \
+ lodbias \
+ morph3d \
+ multiarb \
+ occlude \
+ osdemo \
+ paltex \
+ pixeltex \
+ pointblast \
+ ray \
+ readpix \
+ reflect \
+ renormal \
+ spectex \
+ stex3d \
+ teapot \
+ terrain \
+ tessdemo \
+ texcyl \
+ texdown \
+ texenv \
+ texobj \
+ trispd \
+ tunnel \
+ tunnel2 \
+ winpos
+
+
+##### RULES #####
+
+.SUFFIXES:
+.SUFFIXES: .c
+
+.c: $(LIB_DEP)
+ $(CC) -I$(INCDIR) -I../util $(CFLAGS) $< $(GL_LIBS) -o $@
+
+
+##### TARGETS #####
+
+default:
+ @echo "Specify a target configuration"
+
+clean:
+ -rm *.o *~
+
+realclean:
+ -rm $(PROGS:=.exe)
+ -rm *.o *~
+
+targets: $(PROGS)
+
+include ../Make-config
+
+
diff --git a/progs/demos/Makefile.win b/progs/demos/Makefile.win
new file mode 100644
index 00000000000..4ac32361b26
--- /dev/null
+++ b/progs/demos/Makefile.win
@@ -0,0 +1,118 @@
+
+# Mesa 3-D graphics library
+# Version: 6.5
+# Copyright (C) 1995-2006 Brian Paul
+
+# Makefile for GLUT-based demo programs for Windows
+
+# Build the Mesa and GLUT libraries by using the Visual Studio
+# Workspaces in this distribution before running this Makefile.
+
+# Invocation: nmake -f Makefile.win
+
+NODEBUG=1
+!include <win32.mak>
+
+##### MACROS #####
+
+TOP = ..\..
+INCDIR = ..\..\include
+LIBDIR = ..\..\lib
+LIBS = GLUT32.LIB OPENGL32.LIB
+
+all: OPENGL32.DLL GLU32.DLL GLUT32.DLL \
+ readtex.h readtex.c showbuffer.h showbuffer.c \
+ arbfplight.exe arbfslight.exe arbocclude.exe bounce.exe \
+ clearspd.exe cubemap.exe drawpix.exe fire.exe fogcoord.exe \
+ fplight.exe gamma.exe gearbox.exe \
+ gears.exe geartrain.exe gloss.exe \
+ glinfo.exe glslnoise.exe \
+ gltestperf.exe glutfx.exe ipers.exe isosurf.exe lodbias.exe \
+ morph3d.exe multiarb.exe occlude.exe paltex.exe pointblast.exe \
+ ray.exe readpix.exe reflect.exe renormal.exe \
+ shadowtex.exe singlebuffer.exe spectex.exe spriteblast.exe \
+ stex3d.exe teapot.exe terrain.exe tessdemo.exe texcyl.exe \
+ texdown.exe texenv.exe texobj.exe trispd.exe tunnel.exe tunnel2.exe \
+ winpos.exe
+
+arbfplight.exe: arbfplight.obj
+arbfslight.exe: arbfslight.obj
+arbocclude.exe: arbocclude.obj
+bounce.exe: bounce.obj
+clearspd.exe: clearspd.obj
+cubemap.exe: cubemap.obj readtex.obj
+drawpix.exe: drawpix.obj readtex.obj
+fire.exe: fire.obj readtex.obj
+fogcoord.exe: fogcoord.obj readtex.obj
+fplight.exe: fplight.obj
+gamma.exe: gamma.obj
+gearbox.exe: gearbox.obj
+gears.exe: gears.obj
+geartrain.exe: geartrain.obj
+gloss.exe: gloss.obj readtex.obj
+glinfo.exe: glinfo.obj
+glslnoise.exe: glslnoise.obj
+gltestperf.exe: gltestperf.obj
+glutfx.exe: glutfx.obj
+ipers.exe: ipers.obj readtex.obj
+isosurf.exe: isosurf.obj readtex.obj
+lodbias.exe: lodbias.obj readtex.obj
+morph3d.exe: morph3d.obj
+multiarb.exe: multiarb.obj readtex.obj
+occlude.exe: occlude.obj
+paltex.exe: paltex.obj
+pointblast.exe: pointblast.obj
+ray.exe: ray.obj
+readpix.exe: readpix.obj readtex.obj
+reflect.exe: reflect.obj readtex.obj showbuffer.obj
+renormal.exe: renormal.obj
+shadowtex.exe: shadowtex.obj showbuffer.obj
+singlebuffer.exe: singlebuffer.obj
+spectex.exe: spectex.obj
+spriteblast.exe: spriteblast.obj
+stex3d.exe: stex3d.obj
+teapot.exe: teapot.obj readtex.obj
+terrain.exe: terrain.obj
+tessdemo.exe: tessdemo.obj
+texcyl.exe: texcyl.obj readtex.obj
+texdown.exe: texdown.obj
+texenv.exe: texenv.obj
+texobj.exe: texobj.obj
+trispd.exe: trispd.obj
+tunnel.exe: tunnel.obj readtex.obj
+tunnel2.exe: tunnel2.obj readtex.obj
+winpos.exe: winpos.obj readtex.obj
+
+
+OPENGL32.DLL: $(LIBDIR)\OPENGL32.DLL
+ copy $? .
+
+GLU32.DLL: $(LIBDIR)\GLU32.DLL
+ copy $? .
+
+GLUT32.DLL: $(LIBDIR)\GLUT32.DLL
+ copy $? .
+
+readtex.c: $(TOP)\progs\util\readtex.c
+ copy $** .
+
+readtex.h: $(TOP)\progs\util\readtex.h
+ copy $** .
+
+showbuffer.c: $(TOP)\progs\util\showbuffer.c
+ copy $** .
+
+showbuffer.h: $(TOP)\progs\util\showbuffer.h
+ copy $** .
+
+.obj.exe:
+ $(link) $(ldebug) -out:$@ $** /LIBPATH:$(LIBDIR) $(LIBS)
+
+.c.obj:
+ $(cc) $(cdebug) $(cflags) $(cvars) /I$(INCDIR) $*.c
+
+clean::
+ del *.obj *.exe readtex.* showbuffer.*
+
+clobber::
+
diff --git a/progs/demos/README b/progs/demos/README
new file mode 100644
index 00000000000..a3d0c18bb97
--- /dev/null
+++ b/progs/demos/README
@@ -0,0 +1,230 @@
+INTRODUCTION
+------------
+
+This directory is usually included in the Mesa demos distribution or
+in the GLUT distribution.
+
+I have written the demos included in this directory mainly for showing
+the capabilities of the Mesa library when using the Voodoo driver.
+However all the demos are written using the GLUT and OpenGL so they
+work with any GLUT/OpenGL platform (tested: Linux+Mesa+Voodoo driver,
+Linux+Mesa+X11 driver, Win95+Mesa+Voodoo driver and SGI Onyx IR thanks
+to Mark Kilgard).
+
+All the demos make an heavy use of texture mapping, blending, etc. so
+you _need_ some kind of hardware support for the OpenGL otherwise they
+will run at ~1fps. You need also a OpenGL 1.1 compliant library.
+
+You can find some screenshot of these demos at
+http://www-hmw.caribel.pisa.it/fxmesa/fxdemos.hmtl
+
+Write me if you find some bug in the demos.
+
+David Bucciarelli ([email protected])
+
+Humanware s.r.l.
+Via XXIV Maggio 62
+Pisa, Italy
+Tel./Fax +39-50-554108
+www: www-hmw.caribel.pisa.it
+
+
+A BRIEF DESCRIPTION OF THE DEMOS
+--------------------------------
+
+
+IPERS
+-----
+
+Sources: ipers.c image.c
+
+A nice spinning fractal object.
+
+
+RAY
+---
+
+Sources: ray.c
+
+I'm using ray tracing to dynamically generate texture maps with
+specular, diffuse, shadows, and mirror colors. Each frame the texture
+maps of the plane and of the sphere are partially updated. With this
+technique you can obtain true mirrors, shadows, specular highlights,
+bump mapping, etc. in realtime. This demo is really CPU intensive
+(~25fps on a PentiumII@300MHz with a Pure3D). Support on-the-fly
+switching between fullscreen and in-window rendering under Linux/Mesa
+(start your X server in 16 bpp mode and press the spacebar).
+
+
+TUNNEL
+------
+
+Sources: tunnel.c image.c sources.c
+Data: bw.rgb tile.rgb
+
+The model was designed and prelighted with Alias|Wavefront
+PowerAnimator V8. Triangle strips were built with a tool written by me
+and then statically included in the sources. This demo doesn't
+require the ZBuffer and use antialiased polygons. Support on-the-fly
+switching between fullscreen and in-window rendering under Linux/Mesa
+(start your X server in 16 bpp mode and press the spacebar).
+
+
+TUNNEL2
+------
+
+Sources: tunnel2.c image.c sources.c
+Data: bw.rgb tile.rgb
+
+The some tunnel demo but with two output channels. A nice
+example of the Mesa/Voodoo support for multiple boards in
+the some PC.
+
+
+TEAPOT
+------
+
+Sources: teapot.c image.c dteapot.c shadow.c
+Data: bw.rgb tile.rgb
+
+The shadow is drawn projecting the teapot geometry over the plane. All
+other light effects are drawn using the standard OpenGL capabilities.
+Support on-the-fly switching between fullscreen and in-window
+rendering under Linux/Mesa (start your X server in 16 bpp mode and
+press the spacebar).
+
+
+FIRE
+----
+
+Sources: fire.c image.c
+Data: s128.rgb tree2.rgb
+
+The demo use a small particle system to draw some nice visual effect.
+You can interactively change many parameters of the particle system
+and you can choose the number of particles at the startup ('fire
+4000'). This demo should be called fountain. Support on-the-fly
+switching between fullscreen and in-window rendering under Linux/Mesa
+(start your X server in 16 bpp mode and press the spacebar).
+
+
+TERRAIN
+-------
+
+Sources: mesaland.c
+
+This demo is base on another demo written by Mikael SkiZoWalker. I
+have added the capabilities to freely fly around, view culling and
+some nice color. Support on-the-fly switching between fullscreen and
+in-window rendering under Linux/Mesa (start your X server in 16 bpp
+mode and press the spacebar).
+
+
+GLTEST
+------
+
+Sources: gltest.c
+
+This is a simple benchmark suite that I'm using in the development of
+the Mesa/Voodoo driver. Type 'gltest >my.res' and you will get some
+data about the performances of your OpenGL. Follow the results with my
+PC (Linux+Mesa-2.6+PentiumII@300MHz+Pure3D):
+
+Simple Points
+587900.080674 Pnts/sec
+
+Smooth Lines
+SIZE=480 => 39007.426183 Lins/sec
+SIZE=250 => 74575.016485 Lins/sec
+SIZE=100 => 179734.882409 Lins/sec
+SIZE=050 => 183987.795297 Lins/sec
+SIZE=025 => 183820.086309 Lins/sec
+
+
+ZSmooth Triangles
+SIZE=480 => 784.954997 Tris/sec
+SIZE=250 => 2862.325889 Tris/sec
+SIZE=100 => 17779.492938 Tris/sec
+SIZE=050 => 159339.829844 Tris/sec
+SIZE=025 => 428602.984008 Tris/sec
+
+
+ZSmooth Tex Blend Triangles
+SIZE=480 => 784.473931 Tris/sec
+SIZE=250 => 2853.781513 Tris/sec
+SIZE=100 => 17598.252146 Tris/sec
+SIZE=050 => 152632.578337 Tris/sec
+SIZE=025 => 377584.760048 Tris/sec
+
+
+ZSmooth Tex Blend TMesh Triangles
+SIZE=400 => 563.900695 Tris/sec, MPixel Fill/sec: 45.112056
+SIZE=250 => 1449.777225 Tris/sec, MPixel Fill/sec: 45.305538
+SIZE=100 => 8702.869121 Tris/sec, MPixel Fill/sec: 43.514346
+SIZE=050 => 31896.867466 Tris/sec, MPixel Fill/sec: 39.871084
+SIZE=025 => 114037.262894 Tris/sec, MPixel Fill/sec: 35.636645
+SIZE=010 => 220494.235839 Tris/sec, MPixel Fill/sec: 11.024712
+SIZE=005 => 225615.506651 Tris/sec, MPixel Fill/sec: 2.820194
+SIZE=002 => 225607.681439 Tris/sec, MPixel Fill/sec: 0.451215
+
+
+Color/Depth Buffer Clears
+295.042474 Clrs/sec, MPixel Fill/sec: 90.553256
+
+
+Follow the results with my
+PC (Linux+Mesa-3.0beta5+PentiumII@300MHz+Voodoo2):
+
+
+Simple Points
+1620113.525130 Pnts/sec
+
+Smooth Lines
+SIZE=480 => 73841.166065 Lins/sec
+SIZE=250 => 140794.035316 Lins/sec
+SIZE=100 => 344185.242157 Lins/sec
+SIZE=050 => 420399.008289 Lins/sec
+SIZE=025 => 420261.389773 Lins/sec
+
+
+ZSmooth Triangles
+SIZE=480 => 1434.668506 Tris/sec
+SIZE=250 => 5228.449614 Tris/sec
+SIZE=100 => 46603.815842 Tris/sec
+SIZE=050 => 325757.045961 Tris/sec
+SIZE=025 => 589022.403336 Tris/sec
+
+
+ZSmooth Tex Blend Triangles
+SIZE=480 => 1414.900041 Tris/sec
+SIZE=250 => 5006.055235 Tris/sec
+SIZE=100 => 43602.252031 Tris/sec
+SIZE=050 => 303497.092692 Tris/sec
+SIZE=025 => 517087.428669 Tris/sec
+
+
+ZSmooth Tex Blend TMesh Triangles
+SIZE=400 => 1023.273112 Tris/sec, MPixel Fill/sec: 81.861849
+SIZE=250 => 2595.692121 Tris/sec, MPixel Fill/sec: 81.115379
+SIZE=100 => 15788.198912 Tris/sec, MPixel Fill/sec: 78.940995
+SIZE=050 => 58784.121300 Tris/sec, MPixel Fill/sec: 73.480152
+SIZE=025 => 244233.873481 Tris/sec, MPixel Fill/sec: 76.323085
+SIZE=010 => 474995.004191 Tris/sec, MPixel Fill/sec: 23.749750
+SIZE=005 => 475124.354163 Tris/sec, MPixel Fill/sec: 5.939054
+SIZE=002 => 474959.089503 Tris/sec, MPixel Fill/sec: 0.949918
+
+
+Color/Depth Buffer Clears
+478.654830 Clrs/sec, MPixel Fill/sec: 146.906826
+
+
+PALTEX and GLBPALTX
+-------------------
+
+Sources: paltex.c and glbpaltx.c
+
+The PALTEX example was written by Brian Paul and it shows the
+capabilities of the GL_EXT_paletted_texture extension. I have written
+the other example in order to show the capabilities of the
+gl3DfxSetPaletteEXT() (it used only by GLQuake and Quake2).
diff --git a/progs/demos/Windows/all.dsp b/progs/demos/Windows/all.dsp
new file mode 100644
index 00000000000..b47283c5882
--- /dev/null
+++ b/progs/demos/Windows/all.dsp
@@ -0,0 +1,101 @@
+# Microsoft Developer Studio Project File - Name="all" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Application" 0x0101
+
+CFG=all - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "all.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "all.mak" CFG="all - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "all - Win32 Release" (based on "Win32 (x86) Application")
+!MESSAGE "all - Win32 Debug" (based on "Win32 (x86) Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "all - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386
+
+!ELSEIF "$(CFG)" == "all - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept
+
+!ENDIF
+
+# Begin Target
+
+# Name "all - Win32 Release"
+# Name "all - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/progs/demos/Windows/bounce.dsp b/progs/demos/Windows/bounce.dsp
new file mode 100644
index 00000000000..0510e77d994
--- /dev/null
+++ b/progs/demos/Windows/bounce.dsp
@@ -0,0 +1,112 @@
+# Microsoft Developer Studio Project File - Name="bounce" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=bounce - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "bounce.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "bounce.mak" CFG="bounce - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "bounce - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "bounce - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "bounce - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "../../../include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /machine:I386 /out:"../bounce.exe"
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "bounce - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../../include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /debug /machine:I386 /out:"../bounce.exe" /pdbtype:sept
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "bounce - Win32 Release"
+# Name "bounce - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\bounce.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/progs/demos/Windows/clearspd.dsp b/progs/demos/Windows/clearspd.dsp
new file mode 100644
index 00000000000..440c7ae64e9
--- /dev/null
+++ b/progs/demos/Windows/clearspd.dsp
@@ -0,0 +1,112 @@
+# Microsoft Developer Studio Project File - Name="clearspd" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=clearspd - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "clearspd.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "clearspd.mak" CFG="clearspd - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "clearspd - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "clearspd - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "clearspd - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "../../../include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /machine:I386 /out:"../clearspd.exe"
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "clearspd - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../../include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /debug /machine:I386 /out:"../clearspd.exe" /pdbtype:sept
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "clearspd - Win32 Release"
+# Name "clearspd - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\clearspd.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/progs/demos/Windows/cubemap.dsp b/progs/demos/Windows/cubemap.dsp
new file mode 100644
index 00000000000..220a3a0df61
--- /dev/null
+++ b/progs/demos/Windows/cubemap.dsp
@@ -0,0 +1,112 @@
+# Microsoft Developer Studio Project File - Name="cubemap" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=cubemap - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "cubemap.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "cubemap.mak" CFG="cubemap - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "cubemap - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "cubemap - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "cubemap - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "../../../include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /machine:I386 /out:"../cubemap.exe"
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "cubemap - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../../include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /debug /machine:I386 /out:"../cubemap.exe" /pdbtype:sept
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "cubemap - Win32 Release"
+# Name "cubemap - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\cubemap.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/progs/demos/Windows/demos.dsw b/progs/demos/Windows/demos.dsw
new file mode 100644
index 00000000000..2d6f629e07a
--- /dev/null
+++ b/progs/demos/Windows/demos.dsw
@@ -0,0 +1,782 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "all"=".\all.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name bounce
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name clearspd
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name cubemap
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name drawpix
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name fire
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name gears
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name geartrain
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name glinfo
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name gloss
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name gltestperf
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name glutfx
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name ipers
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name isosurf
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name lodbias
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name morph3d
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name multiarb
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name occlude
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name osdemo
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name paltex
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name pixeltex
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name pointblast
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name rain
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name ray
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name readpix
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name reflect
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name renormal
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name shadowtex
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name spectex
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name stex3d
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name teapot
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name terrain
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name tessdemo
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name texcyl
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name texdown
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name texenv
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name texobj
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name trispd
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name tunnel
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name tunnel2
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name winpos
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name spriteblast
+ End Project Dependency
+ Begin Project Dependency
+ Project_Dep_Name glut
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "bounce"=".\bounce.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name glut
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "clearspd"=".\clearspd.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name glut
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "cubemap"=".\cubemap.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name glut
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "drawpix"=".\drawpix.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name glut
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "fire"=".\fire.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name glut
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "gears"=".\gears.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name glut
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "geartrain"=".\geartrain.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name glut
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "glinfo"=".\glinfo.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name glut
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "gloss"=".\gloss.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name glut
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "gltestperf"=".\gltestperf.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name glut
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "glut"="..\..\..\src\glut\glx\glut.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "glutfx"=".\glutfx.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name glut
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "ipers"=".\ipers.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name glut
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "isosurf"=".\isosurf.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name glut
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "lodbias"=".\loadbias.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name glut
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "morph3d"=".\morph3d.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name glut
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "multiarb"=".\multiarb.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name glut
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "occlude"=".\occlude.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name glut
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "osdemo"=".\osdemo.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name glut
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "paltex"=".\paltex.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name glut
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "pixeltex"=".\pixeltex.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name glut
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "pointblast"=".\pointblast.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name glut
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "rain"=".\rain.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name glut
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "ray"=".\ray.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name glut
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "readpix"=".\readpix.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name glut
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "reflect"=".\reflect.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name glut
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "renormal"=".\renormal.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name glut
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "shadowtex"=".\shadowtex.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name glut
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "spectex"=".\spectex.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name glut
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "spriteblast"=".\spriteblast.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name glut
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "stex3d"=".\stex3d.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name glut
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "teapot"=".\teapot.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name glut
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "terrain"=".\terrain.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name glut
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tessdemo"=".\tessdemo.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name glut
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "texcyl"=".\texcyl.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name glut
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "texdown"=".\texdown.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name glut
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "texenv"=".\texenv.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name glut
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "texobj"=".\texobj.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name glut
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "trispd"=".\trispd.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name glut
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tunnel"=".\tunnel.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name glut
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tunnel2"=".\tunnel2.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name glut
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "winpos"=".\winpos.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+ Begin Project Dependency
+ Project_Dep_Name glut
+ End Project Dependency
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/progs/demos/Windows/drawpix.dsp b/progs/demos/Windows/drawpix.dsp
new file mode 100644
index 00000000000..57003e616b4
--- /dev/null
+++ b/progs/demos/Windows/drawpix.dsp
@@ -0,0 +1,112 @@
+# Microsoft Developer Studio Project File - Name="drawpix" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=drawpix - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "drawpix.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "drawpix.mak" CFG="drawpix - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "drawpix - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "drawpix - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "drawpix - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "../" /I "../../../include" /I "../../util" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /machine:I386 /out:"../drawpix.exe"
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "drawpix - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../util" /I "../../../include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /debug /machine:I386 /out:"../drawpix.exe" /pdbtype:sept
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "drawpix - Win32 Release"
+# Name "drawpix - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\drawpix.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/progs/demos/Windows/fire.dsp b/progs/demos/Windows/fire.dsp
new file mode 100644
index 00000000000..f8a536d3349
--- /dev/null
+++ b/progs/demos/Windows/fire.dsp
@@ -0,0 +1,112 @@
+# Microsoft Developer Studio Project File - Name="fire" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=fire - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "fire.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "fire.mak" CFG="fire - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "fire - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "fire - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "fire - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "../../util" /I "../../../include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /machine:I386 /out:"../fire.exe"
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "fire - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../util" /I "../../../include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /debug /machine:I386 /out:"../fire.exe" /pdbtype:sept
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "fire - Win32 Release"
+# Name "fire - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\fire.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/progs/demos/Windows/gears.dsp b/progs/demos/Windows/gears.dsp
new file mode 100644
index 00000000000..43a588dc68d
--- /dev/null
+++ b/progs/demos/Windows/gears.dsp
@@ -0,0 +1,112 @@
+# Microsoft Developer Studio Project File - Name="gears" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=gears - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "gears.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "gears.mak" CFG="gears - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "gears - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "gears - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "gears - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "../../../include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /machine:I386 /out:"../gears.exe"
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "gears - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../../include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /debug /machine:I386 /out:"../gears.exe" /pdbtype:sept
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "gears - Win32 Release"
+# Name "gears - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\gears.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/progs/demos/Windows/geartrain.dsp b/progs/demos/Windows/geartrain.dsp
new file mode 100644
index 00000000000..8dee77de4d5
--- /dev/null
+++ b/progs/demos/Windows/geartrain.dsp
@@ -0,0 +1,112 @@
+# Microsoft Developer Studio Project File - Name="geartrain" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=geartrain - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "geartrain.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "geartrain.mak" CFG="geartrain - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "geartrain - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "geartrain - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "geartrain - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "../../../include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /machine:I386 /out:"../geartrain.exe"
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "geartrain - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../../include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /debug /machine:I386 /out:"../geartrain.exe" /pdbtype:sept
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "geartrain - Win32 Release"
+# Name "geartrain - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\geartrain.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/progs/demos/Windows/glinfo.dsp b/progs/demos/Windows/glinfo.dsp
new file mode 100644
index 00000000000..d9d61eb424d
--- /dev/null
+++ b/progs/demos/Windows/glinfo.dsp
@@ -0,0 +1,112 @@
+# Microsoft Developer Studio Project File - Name="glinfo" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=glinfo - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "glinfo.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "glinfo.mak" CFG="glinfo - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "glinfo - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "glinfo - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "glinfo - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "../../../include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /machine:I386 /out:"../glinfo.exe"
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "glinfo - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../../include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /debug /machine:I386 /out:"../glinfo.exe" /pdbtype:sept
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "glinfo - Win32 Release"
+# Name "glinfo - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\glinfo.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/progs/demos/Windows/gloss.dsp b/progs/demos/Windows/gloss.dsp
new file mode 100644
index 00000000000..402d291f4dc
--- /dev/null
+++ b/progs/demos/Windows/gloss.dsp
@@ -0,0 +1,112 @@
+# Microsoft Developer Studio Project File - Name="gloss" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=gloss - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "gloss.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "gloss.mak" CFG="gloss - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "gloss - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "gloss - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "gloss - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "../../util" /I "../../../include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /machine:I386 /out:"../gloss.exe"
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "gloss - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../util" /I "../../../include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /debug /machine:I386 /out:"../gloss.exe" /pdbtype:sept
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "gloss - Win32 Release"
+# Name "gloss - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\gloss.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/progs/demos/Windows/gltestperf.dsp b/progs/demos/Windows/gltestperf.dsp
new file mode 100644
index 00000000000..e5066201522
--- /dev/null
+++ b/progs/demos/Windows/gltestperf.dsp
@@ -0,0 +1,112 @@
+# Microsoft Developer Studio Project File - Name="gltestperf" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=gltestperf - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "gltestperf.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "gltestperf.mak" CFG="gltestperf - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "gltestperf - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "gltestperf - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "gltestperf - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "../../../include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /machine:I386 /out:"../gltestperf.exe"
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "gltestperf - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../../include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /debug /machine:I386 /out:"../gltestperf.exe" /pdbtype:sept
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "gltestperf - Win32 Release"
+# Name "gltestperf - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\gltestperf.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/progs/demos/Windows/glutfx.dsp b/progs/demos/Windows/glutfx.dsp
new file mode 100644
index 00000000000..90eca930d22
--- /dev/null
+++ b/progs/demos/Windows/glutfx.dsp
@@ -0,0 +1,112 @@
+# Microsoft Developer Studio Project File - Name="glutfx" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=glutfx - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "glutfx.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "glutfx.mak" CFG="glutfx - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "glutfx - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "glutfx - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "glutfx - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "../../../include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /machine:I386 /out:"../glutfx.exe"
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "glutfx - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../../include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /debug /machine:I386 /out:"../glutfx.exe" /pdbtype:sept
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "glutfx - Win32 Release"
+# Name "glutfx - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\glutfx.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/progs/demos/Windows/ipers.dsp b/progs/demos/Windows/ipers.dsp
new file mode 100644
index 00000000000..430f1b6258d
--- /dev/null
+++ b/progs/demos/Windows/ipers.dsp
@@ -0,0 +1,112 @@
+# Microsoft Developer Studio Project File - Name="ipers" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=ipers - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "ipers.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "ipers.mak" CFG="ipers - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "ipers - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "ipers - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "ipers - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "../../util" /I "../../../include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /machine:I386 /out:"../ipers.exe"
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "ipers - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../util" /I "../../../include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /debug /machine:I386 /out:"../ipers.exe" /pdbtype:sept
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "ipers - Win32 Release"
+# Name "ipers - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\ipers.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/progs/demos/Windows/isosurf.dsp b/progs/demos/Windows/isosurf.dsp
new file mode 100644
index 00000000000..1c59d40081e
--- /dev/null
+++ b/progs/demos/Windows/isosurf.dsp
@@ -0,0 +1,112 @@
+# Microsoft Developer Studio Project File - Name="isosurf" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=isosurf - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "isosurf.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "isosurf.mak" CFG="isosurf - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "isosurf - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "isosurf - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "isosurf - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "../../util" /I "../../../include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /machine:I386 /out:"../isosurf.exe"
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "isosurf - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../util" /I "../../../include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /debug /machine:I386 /out:"../isosurf.exe" /pdbtype:sept
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "isosurf - Win32 Release"
+# Name "isosurf - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\isosurf.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/progs/demos/Windows/loadbias.dsp b/progs/demos/Windows/loadbias.dsp
new file mode 100644
index 00000000000..ed51960e493
--- /dev/null
+++ b/progs/demos/Windows/loadbias.dsp
@@ -0,0 +1,112 @@
+# Microsoft Developer Studio Project File - Name="lodbias" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=lodbias - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "lodbias.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "lodbias.mak" CFG="lodbias - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "lodbias - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "lodbias - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "lodbias - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "../../util" /I "../../../include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /machine:I386 /out:"../lodbias.exe"
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "lodbias - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../util" /I "../../../include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /debug /machine:I386 /out:"../lodbias.exe" /pdbtype:sept
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "lodbias - Win32 Release"
+# Name "lodbias - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\lodbias.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/progs/demos/Windows/morph3d.dsp b/progs/demos/Windows/morph3d.dsp
new file mode 100644
index 00000000000..247dbf03d7a
--- /dev/null
+++ b/progs/demos/Windows/morph3d.dsp
@@ -0,0 +1,112 @@
+# Microsoft Developer Studio Project File - Name="morph3d" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=morph3d - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "morph3d.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "morph3d.mak" CFG="morph3d - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "morph3d - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "morph3d - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "morph3d - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "../../../include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /machine:I386 /out:"../morph3d.exe"
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "morph3d - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../../include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /debug /machine:I386 /out:"../morph3d.exe" /pdbtype:sept
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "morph3d - Win32 Release"
+# Name "morph3d - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\morph3d.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/progs/demos/Windows/multiarb.dsp b/progs/demos/Windows/multiarb.dsp
new file mode 100644
index 00000000000..57c32deb294
--- /dev/null
+++ b/progs/demos/Windows/multiarb.dsp
@@ -0,0 +1,112 @@
+# Microsoft Developer Studio Project File - Name="multiarb" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=multiarb - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "multiarb.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "multiarb.mak" CFG="multiarb - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "multiarb - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "multiarb - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "multiarb - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "../../util" /I "../../../include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /machine:I386 /out:"../multiarb.exe"
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "multiarb - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../util" /I "../../../include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /debug /machine:I386 /out:"../multiarb.exe" /pdbtype:sept
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "multiarb - Win32 Release"
+# Name "multiarb - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\multiarb.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/progs/demos/Windows/occlude.dsp b/progs/demos/Windows/occlude.dsp
new file mode 100644
index 00000000000..ca4afa579e1
--- /dev/null
+++ b/progs/demos/Windows/occlude.dsp
@@ -0,0 +1,112 @@
+# Microsoft Developer Studio Project File - Name="occlude" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=occlude - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "occlude.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "occlude.mak" CFG="occlude - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "occlude - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "occlude - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "occlude - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "../../../include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /machine:I386 /out:"../occlude.exe"
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "occlude - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../../include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /debug /machine:I386 /out:"../occlude.exe" /pdbtype:sept
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "occlude - Win32 Release"
+# Name "occlude - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\occlude.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/progs/demos/Windows/osdemo.dsp b/progs/demos/Windows/osdemo.dsp
new file mode 100644
index 00000000000..ccaa6d2b42a
--- /dev/null
+++ b/progs/demos/Windows/osdemo.dsp
@@ -0,0 +1,112 @@
+# Microsoft Developer Studio Project File - Name="osdemo" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=osdemo - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "osdemo.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "osdemo.mak" CFG="osdemo - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "osdemo - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "osdemo - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "osdemo - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "../../../include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB ../../../lib/OSMESA32.LIB /nologo /subsystem:console /machine:I386 /out:"../osdemo.exe"
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "osdemo - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../../include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB ../../../lib/OSMESA32.LIB /nologo /subsystem:console /debug /machine:I386 /out:"../osdemo.exe" /pdbtype:sept
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "osdemo - Win32 Release"
+# Name "osdemo - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\osdemo.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/progs/demos/Windows/paltex.dsp b/progs/demos/Windows/paltex.dsp
new file mode 100644
index 00000000000..efc63842115
--- /dev/null
+++ b/progs/demos/Windows/paltex.dsp
@@ -0,0 +1,112 @@
+# Microsoft Developer Studio Project File - Name="paltex" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=paltex - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "paltex.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "paltex.mak" CFG="paltex - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "paltex - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "paltex - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "paltex - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "../../../include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /machine:I386 /out:"../paltex.exe"
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "paltex - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../../include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /debug /machine:I386 /out:"../paltex.exe" /pdbtype:sept
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "paltex - Win32 Release"
+# Name "paltex - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\paltex.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/progs/demos/Windows/pixeltex.dsp b/progs/demos/Windows/pixeltex.dsp
new file mode 100644
index 00000000000..d09f9f312cb
--- /dev/null
+++ b/progs/demos/Windows/pixeltex.dsp
@@ -0,0 +1,112 @@
+# Microsoft Developer Studio Project File - Name="pixeltex" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=pixeltex - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "pixeltex.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "pixeltex.mak" CFG="pixeltex - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "pixeltex - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "pixeltex - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "pixeltex - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "../../util" /I "../../../include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /machine:I386 /out:"../pixeltex.exe"
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "pixeltex - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../util" /I "../../../include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /debug /machine:I386 /out:"../pixeltex.exe" /pdbtype:sept
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "pixeltex - Win32 Release"
+# Name "pixeltex - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\pixeltex.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/progs/demos/Windows/pointblast.dsp b/progs/demos/Windows/pointblast.dsp
new file mode 100644
index 00000000000..7be695839fa
--- /dev/null
+++ b/progs/demos/Windows/pointblast.dsp
@@ -0,0 +1,112 @@
+# Microsoft Developer Studio Project File - Name="pointblast" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=pointblast - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "pointblast.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "pointblast.mak" CFG="pointblast - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "pointblast - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "pointblast - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "pointblast - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "../../../include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /machine:I386 /out:"../pointblast.exe"
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "pointblast - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../../include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /debug /machine:I386 /out:"../pointblast.exe" /pdbtype:sept
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "pointblast - Win32 Release"
+# Name "pointblast - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\pointblast.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/progs/demos/Windows/rain.dsp b/progs/demos/Windows/rain.dsp
new file mode 100644
index 00000000000..7e380e66aaf
--- /dev/null
+++ b/progs/demos/Windows/rain.dsp
@@ -0,0 +1,112 @@
+# Microsoft Developer Studio Project File - Name="rain" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=rain - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "rain.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "rain.mak" CFG="rain - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "rain - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "rain - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "rain - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "../../util" /I "../../../include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /machine:I386 /out:"../rain.exe"
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "rain - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../util" /I "../../../include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /debug /machine:I386 /out:"../rain.exe" /pdbtype:sept
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "rain - Win32 Release"
+# Name "rain - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\rain.cxx
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/progs/demos/Windows/ray.dsp b/progs/demos/Windows/ray.dsp
new file mode 100644
index 00000000000..dfa26e7755c
--- /dev/null
+++ b/progs/demos/Windows/ray.dsp
@@ -0,0 +1,112 @@
+# Microsoft Developer Studio Project File - Name="ray" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=ray - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "ray.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "ray.mak" CFG="ray - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "ray - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "ray - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "ray - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "../../../include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /machine:I386 /out:"../ray.exe"
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "ray - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../../include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /debug /machine:I386 /out:"../ray.exe" /pdbtype:sept
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "ray - Win32 Release"
+# Name "ray - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\ray.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/progs/demos/Windows/readpix.dsp b/progs/demos/Windows/readpix.dsp
new file mode 100644
index 00000000000..8097d10625b
--- /dev/null
+++ b/progs/demos/Windows/readpix.dsp
@@ -0,0 +1,112 @@
+# Microsoft Developer Studio Project File - Name="readpix" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=readpix - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "readpix.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "readpix.mak" CFG="readpix - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "readpix - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "readpix - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "readpix - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "../../util" /I "../../../include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /machine:I386 /out:"../readpix.exe"
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "readpix - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../util" /I "../../../include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /debug /machine:I386 /out:"../readpix.exe" /pdbtype:sept
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "readpix - Win32 Release"
+# Name "readpix - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\readpix.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/progs/demos/Windows/reflect.dsp b/progs/demos/Windows/reflect.dsp
new file mode 100644
index 00000000000..fa09700afe2
--- /dev/null
+++ b/progs/demos/Windows/reflect.dsp
@@ -0,0 +1,112 @@
+# Microsoft Developer Studio Project File - Name="reflect" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=reflect - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "reflect.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "reflect.mak" CFG="reflect - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "reflect - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "reflect - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "reflect - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "../../util" /I "../../../include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /machine:I386 /out:"../reflect.exe"
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "reflect - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../util" /I "../../../include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /debug /machine:I386 /out:"../reflect.exe" /pdbtype:sept
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "reflect - Win32 Release"
+# Name "reflect - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\reflect.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/progs/demos/Windows/renormal.dsp b/progs/demos/Windows/renormal.dsp
new file mode 100644
index 00000000000..4d72e88d8ed
--- /dev/null
+++ b/progs/demos/Windows/renormal.dsp
@@ -0,0 +1,112 @@
+# Microsoft Developer Studio Project File - Name="renormal" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=renormal - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "renormal.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "renormal.mak" CFG="bounce - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "renormal - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "renormal - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "renormal - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "../../../include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /machine:I386 /out:"../renormal.exe"
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "renormal - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../../include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /debug /machine:I386 /out:"../renormal.exe" /pdbtype:sept
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "renormal - Win32 Release"
+# Name "renormal - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\renormal.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/progs/demos/Windows/shadowtex.dsp b/progs/demos/Windows/shadowtex.dsp
new file mode 100644
index 00000000000..419ec241386
--- /dev/null
+++ b/progs/demos/Windows/shadowtex.dsp
@@ -0,0 +1,112 @@
+# Microsoft Developer Studio Project File - Name="shadowtex" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=shadowtex - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "shadowtex.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "shadowtex.mak" CFG="bounce - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "shadowtex - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "shadowtex - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "shadowtex - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "../../../include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /machine:I386 /out:"../shadowtex.exe"
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "shadowtex - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../../include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /debug /machine:I386 /out:"../shadowtex.exe" /pdbtype:sept
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "shadowtex - Win32 Release"
+# Name "shadowtex - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\shadowtex.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/progs/demos/Windows/spectex.dsp b/progs/demos/Windows/spectex.dsp
new file mode 100644
index 00000000000..d1960b3d139
--- /dev/null
+++ b/progs/demos/Windows/spectex.dsp
@@ -0,0 +1,112 @@
+# Microsoft Developer Studio Project File - Name="spectex" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=spectex - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "spectex.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "spectex.mak" CFG="bounce - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "spectex - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "spectex - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "spectex - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "../../../include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /machine:I386 /out:"../spectex.exe"
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "spectex - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../../include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /debug /machine:I386 /out:"../spectex.exe" /pdbtype:sept
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "spectex - Win32 Release"
+# Name "spectex - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\spectex.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/progs/demos/Windows/spriteblast.dsp b/progs/demos/Windows/spriteblast.dsp
new file mode 100644
index 00000000000..8a02ed50d30
--- /dev/null
+++ b/progs/demos/Windows/spriteblast.dsp
@@ -0,0 +1,112 @@
+# Microsoft Developer Studio Project File - Name="spriteblast" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=spriteblast - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "spriteblast.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "spriteblast.mak" CFG="bounce - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "spriteblast - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "spriteblast - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "spriteblast - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "../../../include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /machine:I386 /out:"../spriteblast.exe"
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "spriteblast - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../../include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /debug /machine:I386 /out:"../spriteblast.exe" /pdbtype:sept
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "spriteblast - Win32 Release"
+# Name "spriteblast - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\spriteblast.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/progs/demos/Windows/stex3d.dsp b/progs/demos/Windows/stex3d.dsp
new file mode 100644
index 00000000000..7c112d62ca8
--- /dev/null
+++ b/progs/demos/Windows/stex3d.dsp
@@ -0,0 +1,112 @@
+# Microsoft Developer Studio Project File - Name="stex3d" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=stex3d - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "stex3d.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "stex3d.mak" CFG="bounce - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "stex3d - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "stex3d - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "stex3d - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "../../../include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /machine:I386 /out:"../stex3d.exe"
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "stex3d - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../../include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /debug /machine:I386 /out:"../stex3d.exe" /pdbtype:sept
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "stex3d - Win32 Release"
+# Name "stex3d - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\stex3d.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/progs/demos/Windows/teapot.dsp b/progs/demos/Windows/teapot.dsp
new file mode 100644
index 00000000000..3260e635a4b
--- /dev/null
+++ b/progs/demos/Windows/teapot.dsp
@@ -0,0 +1,112 @@
+# Microsoft Developer Studio Project File - Name="teapot" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=teapot - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "teapot.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "teapot.mak" CFG="gloss - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "teapot - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "teapot - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "teapot - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "../../util" /I "../../../include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /machine:I386 /out:"../teapot.exe"
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "teapot - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../util" /I "../../../include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /debug /machine:I386 /out:"../teapot.exe" /pdbtype:sept
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "teapot - Win32 Release"
+# Name "teapot - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\teapot.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/progs/demos/Windows/terrain.dsp b/progs/demos/Windows/terrain.dsp
new file mode 100644
index 00000000000..9fe490db81e
--- /dev/null
+++ b/progs/demos/Windows/terrain.dsp
@@ -0,0 +1,112 @@
+# Microsoft Developer Studio Project File - Name="terrain" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=terrain - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "terrain.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "terrain.mak" CFG="bounce - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "terrain - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "terrain - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "terrain - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "../../../include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /machine:I386 /out:"../terrain.exe"
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "terrain - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../../include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /debug /machine:I386 /out:"../terrain.exe" /pdbtype:sept
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "terrain - Win32 Release"
+# Name "terrain - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\terrain.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/progs/demos/Windows/tessdemo.dsp b/progs/demos/Windows/tessdemo.dsp
new file mode 100644
index 00000000000..61345c79e6a
--- /dev/null
+++ b/progs/demos/Windows/tessdemo.dsp
@@ -0,0 +1,112 @@
+# Microsoft Developer Studio Project File - Name="tessdemo" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=tessdemo - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "tessdemo.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "tessdemo.mak" CFG="bounce - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "tessdemo - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "tessdemo - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "tessdemo - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "../../../include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /machine:I386 /out:"../tessdemo.exe"
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "tessdemo - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../../include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /debug /machine:I386 /out:"../tessdemo.exe" /pdbtype:sept
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "tessdemo - Win32 Release"
+# Name "tessdemo - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\tessdemo.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/progs/demos/Windows/texcyl.dsp b/progs/demos/Windows/texcyl.dsp
new file mode 100644
index 00000000000..b227e02c297
--- /dev/null
+++ b/progs/demos/Windows/texcyl.dsp
@@ -0,0 +1,112 @@
+# Microsoft Developer Studio Project File - Name="texcyl" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=texcyl - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "texcyl.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "texcyl.mak" CFG="gloss - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "texcyl - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "texcyl - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "texcyl - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "../../util" /I "../../../include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /machine:I386 /out:"../texcyl.exe"
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "texcyl - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../util" /I "../../../include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /debug /machine:I386 /out:"../texcyl.exe" /pdbtype:sept
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "texcyl - Win32 Release"
+# Name "texcyl - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\texcyl.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/progs/demos/Windows/texdown.dsp b/progs/demos/Windows/texdown.dsp
new file mode 100644
index 00000000000..acea7666afc
--- /dev/null
+++ b/progs/demos/Windows/texdown.dsp
@@ -0,0 +1,112 @@
+# Microsoft Developer Studio Project File - Name="texdown" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=texdown - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "texdown.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "texdown.mak" CFG="bounce - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "texdown - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "texdown - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "texdown - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "../../../include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /machine:I386 /out:"../texdown.exe"
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "texdown - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../../include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /debug /machine:I386 /out:"../texdown.exe" /pdbtype:sept
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "texdown - Win32 Release"
+# Name "texdown - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\texdown.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/progs/demos/Windows/texenv.dsp b/progs/demos/Windows/texenv.dsp
new file mode 100644
index 00000000000..3eb7eecdb71
--- /dev/null
+++ b/progs/demos/Windows/texenv.dsp
@@ -0,0 +1,112 @@
+# Microsoft Developer Studio Project File - Name="texenv" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=texenv - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "texenv.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "texenv.mak" CFG="bounce - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "texenv - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "texenv - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "texenv - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "../../../include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /machine:I386 /out:"../texenv.exe"
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "texenv - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../../include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /debug /machine:I386 /out:"../texenv.exe" /pdbtype:sept
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "texenv - Win32 Release"
+# Name "texenv - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\texenv.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/progs/demos/Windows/texobj.dsp b/progs/demos/Windows/texobj.dsp
new file mode 100644
index 00000000000..5db5f2ee798
--- /dev/null
+++ b/progs/demos/Windows/texobj.dsp
@@ -0,0 +1,112 @@
+# Microsoft Developer Studio Project File - Name="texobj" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=texobj - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "texobj.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "texobj.mak" CFG="bounce - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "texobj - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "texobj - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "texobj - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "../../../include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /machine:I386 /out:"../texobj.exe"
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "texobj - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../../include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /debug /machine:I386 /out:"../texobj.exe" /pdbtype:sept
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "texobj - Win32 Release"
+# Name "texobj - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\texobj.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/progs/demos/Windows/trispd.dsp b/progs/demos/Windows/trispd.dsp
new file mode 100644
index 00000000000..7e27cf3d04b
--- /dev/null
+++ b/progs/demos/Windows/trispd.dsp
@@ -0,0 +1,112 @@
+# Microsoft Developer Studio Project File - Name="trispd" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=trispd - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "trispd.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "trispd.mak" CFG="bounce - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "trispd - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "trispd - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "trispd - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "../../../include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /machine:I386 /out:"../trispd.exe"
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "trispd - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../../include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /debug /machine:I386 /out:"../trispd.exe" /pdbtype:sept
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "trispd - Win32 Release"
+# Name "trispd - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\trispd.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/progs/demos/Windows/tunnel.dsp b/progs/demos/Windows/tunnel.dsp
new file mode 100644
index 00000000000..965f109c33e
--- /dev/null
+++ b/progs/demos/Windows/tunnel.dsp
@@ -0,0 +1,112 @@
+# Microsoft Developer Studio Project File - Name="tunnel" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=tunnel - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "tunnel.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "tunnel.mak" CFG="gloss - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "tunnel - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "tunnel - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "tunnel - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "../../util" /I "../../../include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /machine:I386 /out:"../tunnel.exe"
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "tunnel - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../util" /I "../../../include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /debug /machine:I386 /out:"../tunnel.exe" /pdbtype:sept
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "tunnel - Win32 Release"
+# Name "tunnel - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\tunnel.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/progs/demos/Windows/tunnel2.dsp b/progs/demos/Windows/tunnel2.dsp
new file mode 100644
index 00000000000..3ae2800a04d
--- /dev/null
+++ b/progs/demos/Windows/tunnel2.dsp
@@ -0,0 +1,112 @@
+# Microsoft Developer Studio Project File - Name="tunnel2" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=tunnel2 - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "tunnel2.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "tunnel2.mak" CFG="gloss - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "tunnel2 - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "tunnel2 - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "tunnel2 - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "../../util" /I "../../../include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /machine:I386 /out:"../tunnel2.exe"
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "tunnel2 - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../util" /I "../../../include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /debug /machine:I386 /out:"../tunnel2.exe" /pdbtype:sept
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "tunnel2 - Win32 Release"
+# Name "tunnel2 - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\tunnel2.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/progs/demos/Windows/winpos.dsp b/progs/demos/Windows/winpos.dsp
new file mode 100644
index 00000000000..b7b569e6402
--- /dev/null
+++ b/progs/demos/Windows/winpos.dsp
@@ -0,0 +1,112 @@
+# Microsoft Developer Studio Project File - Name="winpos" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=winpos - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "winpos.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "winpos.mak" CFG="gloss - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "winpos - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "winpos - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "winpos - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /W3 /GX /O2 /I "../../util" /I "../../../include" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /machine:I386 /out:"../winpos.exe"
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ELSEIF "$(CFG)" == "winpos - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "../../util" /I "../../../include" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ../../../lib/GLUT32.LIB ../../../lib/GLU32.LIB ../../../lib/OPENGL32.LIB /nologo /subsystem:console /debug /machine:I386 /out:"../winpos.exe" /pdbtype:sept
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=Copy DLLs
+PostBuild_Cmds=copy ..\..\..\lib\*.dll ..
+# End Special Build Tool
+
+!ENDIF
+
+# Begin Target
+
+# Name "winpos - Win32 Release"
+# Name "winpos - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\winpos.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/progs/demos/arbfplight.c b/progs/demos/arbfplight.c
new file mode 100644
index 00000000000..d9c564fbe56
--- /dev/null
+++ b/progs/demos/arbfplight.c
@@ -0,0 +1,395 @@
+/*
+ * Use GL_ARB_fragment_program and GL_ARB_vertex_program to implement
+ * simple per-pixel lighting.
+ *
+ * Brian Paul
+ * 17 April 2003
+ */
+
+#include <assert.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <GL/glut.h>
+
+
+static GLfloat Diffuse[4] = { 0.5, 0.5, 1.0, 1.0 };
+static GLfloat Specular[4] = { 0.8, 0.8, 0.8, 1.0 };
+static GLfloat LightPos[4] = { 0.0, 10.0, 20.0, 1.0 };
+static GLfloat Delta = 1.0;
+
+static GLuint FragProg;
+static GLuint VertProg;
+static GLboolean Anim = GL_TRUE;
+static GLboolean Wire = GL_FALSE;
+static GLboolean PixelLight = GL_TRUE;
+
+static GLint T0 = 0;
+static GLint Frames = 0;
+
+static GLfloat Xrot = 0, Yrot = 0;
+
+static PFNGLPROGRAMLOCALPARAMETER4FVARBPROC glProgramLocalParameter4fvARB_func;
+static PFNGLPROGRAMLOCALPARAMETER4DARBPROC glProgramLocalParameter4dARB_func;
+static PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC glGetProgramLocalParameterdvARB_func;
+static PFNGLGENPROGRAMSARBPROC glGenProgramsARB_func;
+static PFNGLPROGRAMSTRINGARBPROC glProgramStringARB_func;
+static PFNGLBINDPROGRAMARBPROC glBindProgramARB_func;
+static PFNGLISPROGRAMARBPROC glIsProgramARB_func;
+static PFNGLDELETEPROGRAMSARBPROC glDeleteProgramsARB_func;
+
+/* These must match the indexes used in the fragment program */
+#define LIGHTPOS 3
+
+/* Set to one to test ARB_fog_linear program option */
+#define DO_FRAGMENT_FOG 0
+
+
+static void Redisplay( void )
+{
+ glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+
+ if (PixelLight) {
+ glProgramLocalParameter4fvARB_func(GL_FRAGMENT_PROGRAM_ARB,
+ LIGHTPOS, LightPos);
+ glEnable(GL_FRAGMENT_PROGRAM_ARB);
+ glEnable(GL_VERTEX_PROGRAM_ARB);
+ glDisable(GL_LIGHTING);
+ }
+ else {
+ glLightfv(GL_LIGHT0, GL_POSITION, LightPos);
+ glDisable(GL_FRAGMENT_PROGRAM_ARB);
+ glDisable(GL_VERTEX_PROGRAM_ARB);
+ glEnable(GL_LIGHTING);
+ }
+
+ glPushMatrix();
+ glRotatef(Xrot, 1, 0, 0);
+ glRotatef(Yrot, 0, 1, 0);
+ glutSolidSphere(2.0, 10, 5);
+ glPopMatrix();
+
+ glutSwapBuffers();
+
+ Frames++;
+
+ if (Anim) {
+ GLint t = glutGet(GLUT_ELAPSED_TIME);
+ if (t - T0 >= 5000) {
+ GLfloat seconds = (t - T0) / 1000.0;
+ GLfloat fps = Frames / seconds;
+ printf("%d frames in %6.3f seconds = %6.3f FPS\n", Frames, seconds, fps);
+ T0 = t;
+ Frames = 0;
+ }
+ }
+}
+
+
+static void Idle(void)
+{
+ LightPos[0] += Delta;
+ if (LightPos[0] > 25.0)
+ Delta = -1.0;
+ else if (LightPos[0] <- 25.0)
+ Delta = 1.0;
+ glutPostRedisplay();
+}
+
+
+static void Reshape( int width, int height )
+{
+ glViewport( 0, 0, width, height );
+ glMatrixMode( GL_PROJECTION );
+ glLoadIdentity();
+ glFrustum( -1.0, 1.0, -1.0, 1.0, 5.0, 25.0 );
+ glMatrixMode( GL_MODELVIEW );
+ glLoadIdentity();
+ glTranslatef( 0.0, 0.0, -15.0 );
+}
+
+
+static void Key( unsigned char key, int x, int y )
+{
+ (void) x;
+ (void) y;
+ switch (key) {
+ case ' ':
+ case 'a':
+ Anim = !Anim;
+ if (Anim)
+ glutIdleFunc(Idle);
+ else
+ glutIdleFunc(NULL);
+ break;
+ case 'x':
+ LightPos[0] -= 1.0;
+ break;
+ case 'X':
+ LightPos[0] += 1.0;
+ break;
+ case 'w':
+ Wire = !Wire;
+ if (Wire)
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ else
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ break;
+ case 'p':
+ PixelLight = !PixelLight;
+ if (PixelLight) {
+ printf("Per-pixel lighting\n");
+ }
+ else {
+ printf("Conventional lighting\n");
+ }
+ break;
+ case 27:
+ glDeleteProgramsARB_func(1, &VertProg);
+ glDeleteProgramsARB_func(1, &FragProg);
+ exit(0);
+ break;
+ }
+ glutPostRedisplay();
+}
+
+static void SpecialKey( int key, int x, int y )
+{
+ const GLfloat step = 3.0;
+ (void) x;
+ (void) y;
+ switch (key) {
+ case GLUT_KEY_UP:
+ Xrot -= step;
+ break;
+ case GLUT_KEY_DOWN:
+ Xrot += step;
+ break;
+ case GLUT_KEY_LEFT:
+ Yrot -= step;
+ break;
+ case GLUT_KEY_RIGHT:
+ Yrot += step;
+ break;
+ }
+ glutPostRedisplay();
+}
+
+
+/* A helper for finding errors in program strings */
+static int FindLine( const char *program, int position )
+{
+ int i, line = 1;
+ for (i = 0; i < position; i++) {
+ if (program[i] == '\n')
+ line++;
+ }
+ return line;
+}
+
+
+static void Init( void )
+{
+ GLint errorPos;
+
+ /* Yes, this could be expressed more efficiently */
+ static const char *fragProgramText =
+ "!!ARBfp1.0\n"
+#if DO_FRAGMENT_FOG
+ "OPTION ARB_fog_linear; \n"
+#endif
+ "PARAM Diffuse = state.material.diffuse; \n"
+ "PARAM Specular = state.material.specular; \n"
+ "PARAM LightPos = program.local[3]; \n"
+ "TEMP lightDir, normal, len; \n"
+ "TEMP dotProd, specAtten; \n"
+ "TEMP diffuseColor, specularColor; \n"
+
+ "# Compute normalized light direction \n"
+ "DP3 len.x, LightPos, LightPos; \n"
+ "RSQ len.y, len.x; \n"
+ "MUL lightDir, LightPos, len.y; \n"
+
+ "# Compute normalized normal \n"
+ "DP3 len.x, fragment.texcoord[0], fragment.texcoord[0]; \n"
+ "RSQ len.y, len.x; \n"
+ "MUL normal, fragment.texcoord[0], len.y; \n"
+
+ "# Compute dot product of light direction and normal vector\n"
+ "DP3_SAT dotProd, lightDir, normal; # limited to [0,1]\n"
+
+ "MUL diffuseColor, Diffuse, dotProd; # diffuse attenuation\n"
+
+ "POW specAtten.x, dotProd.x, {20.0}.x; # specular exponent\n"
+
+ "MUL specularColor, Specular, specAtten.x; # specular attenuation\n"
+
+#if DO_FRAGMENT_FOG
+ "# need to clamp color to [0,1] before fogging \n"
+ "ADD_SAT result.color, diffuseColor, specularColor; # add colors\n"
+#else
+ "# clamping will be done after program's finished \n"
+ "ADD result.color, diffuseColor, specularColor; # add colors\n"
+#endif
+ "END \n"
+ ;
+
+ static const char *vertProgramText =
+ "!!ARBvp1.0\n"
+ "ATTRIB pos = vertex.position; \n"
+ "ATTRIB norm = vertex.normal; \n"
+ "PARAM modelview[4] = { state.matrix.modelview }; \n"
+ "PARAM modelviewProj[4] = { state.matrix.mvp }; \n"
+ "PARAM invModelview[4] = { state.matrix.modelview.invtrans }; \n"
+
+ "# typical modelview/projection transform \n"
+ "DP4 result.position.x, pos, modelviewProj[0]; \n"
+ "DP4 result.position.y, pos, modelviewProj[1]; \n"
+ "DP4 result.position.z, pos, modelviewProj[2]; \n"
+ "DP4 result.position.w, pos, modelviewProj[3]; \n"
+
+ "# transform normal by inv transpose of modelview, put in tex0 \n"
+ "DP3 result.texcoord[0].x, norm, invModelview[0]; \n"
+ "DP3 result.texcoord[0].y, norm, invModelview[1]; \n"
+ "DP3 result.texcoord[0].z, norm, invModelview[2]; \n"
+ "DP3 result.texcoord[0].w, norm, invModelview[3]; \n"
+
+#if DO_FRAGMENT_FOG
+ "# compute fog coordinate = vertex eye-space Z coord (negated)\n"
+ "DP4 result.fogcoord, -pos, modelview[2]; \n"
+#endif
+ "END\n";
+ ;
+
+ if (!glutExtensionSupported("GL_ARB_vertex_program")) {
+ printf("Sorry, this demo requires GL_ARB_vertex_program\n");
+ exit(1);
+ }
+ if (!glutExtensionSupported("GL_ARB_fragment_program")) {
+ printf("Sorry, this demo requires GL_ARB_fragment_program\n");
+ exit(1);
+ }
+
+ /*
+ * Get extension function pointers.
+ */
+ glProgramLocalParameter4fvARB_func = (PFNGLPROGRAMLOCALPARAMETER4FVARBPROC) glutGetProcAddress("glProgramLocalParameter4fvARB");
+ assert(glProgramLocalParameter4fvARB_func);
+
+ glProgramLocalParameter4dARB_func = (PFNGLPROGRAMLOCALPARAMETER4DARBPROC) glutGetProcAddress("glProgramLocalParameter4dARB");
+ assert(glProgramLocalParameter4dARB_func);
+
+ glGetProgramLocalParameterdvARB_func = (PFNGLGETPROGRAMLOCALPARAMETERDVARBPROC) glutGetProcAddress("glGetProgramLocalParameterdvARB");
+ assert(glGetProgramLocalParameterdvARB_func);
+
+ glGenProgramsARB_func = (PFNGLGENPROGRAMSARBPROC) glutGetProcAddress("glGenProgramsARB");
+ assert(glGenProgramsARB_func);
+
+ glProgramStringARB_func = (PFNGLPROGRAMSTRINGARBPROC) glutGetProcAddress("glProgramStringARB");
+ assert(glProgramStringARB_func);
+
+ glBindProgramARB_func = (PFNGLBINDPROGRAMARBPROC) glutGetProcAddress("glBindProgramARB");
+ assert(glBindProgramARB_func);
+
+ glIsProgramARB_func = (PFNGLISPROGRAMARBPROC) glutGetProcAddress("glIsProgramARB");
+ assert(glIsProgramARB_func);
+
+ glDeleteProgramsARB_func = (PFNGLDELETEPROGRAMSARBPROC) glutGetProcAddress("glDeleteProgramsARB");
+ assert(glDeleteProgramsARB_func);
+
+ /*
+ * Fragment program
+ */
+ glGenProgramsARB_func(1, &FragProg);
+ assert(FragProg > 0);
+ glBindProgramARB_func(GL_FRAGMENT_PROGRAM_ARB, FragProg);
+ glProgramStringARB_func(GL_FRAGMENT_PROGRAM_ARB,
+ GL_PROGRAM_FORMAT_ASCII_ARB,
+ strlen(fragProgramText),
+ (const GLubyte *) fragProgramText);
+ glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errorPos);
+ if (glGetError() != GL_NO_ERROR || errorPos != -1) {
+ int l = FindLine(fragProgramText, errorPos);
+ printf("Fragment Program Error (pos=%d line=%d): %s\n", errorPos, l,
+ (char *) glGetString(GL_PROGRAM_ERROR_STRING_ARB));
+ exit(0);
+ }
+ assert(glIsProgramARB_func(FragProg));
+
+ /*
+ * Do some sanity tests
+ */
+ {
+ GLdouble v[4];
+ glProgramLocalParameter4dARB_func(GL_FRAGMENT_PROGRAM_ARB, 8,
+ 10.0, 20.0, 30.0, 40.0);
+ glGetProgramLocalParameterdvARB_func(GL_FRAGMENT_PROGRAM_ARB, 8, v);
+ assert(v[0] == 10.0);
+ assert(v[1] == 20.0);
+ assert(v[2] == 30.0);
+ assert(v[3] == 40.0);
+ }
+
+ /*
+ * Vertex program
+ */
+ glGenProgramsARB_func(1, &VertProg);
+ assert(VertProg > 0);
+ glBindProgramARB_func(GL_VERTEX_PROGRAM_ARB, VertProg);
+ glProgramStringARB_func(GL_VERTEX_PROGRAM_ARB,
+ GL_PROGRAM_FORMAT_ASCII_ARB,
+ strlen(vertProgramText),
+ (const GLubyte *) vertProgramText);
+ glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errorPos);
+ if (glGetError() != GL_NO_ERROR || errorPos != -1) {
+ int l = FindLine(vertProgramText, errorPos);
+ printf("Vertex Program Error (pos=%d line=%d): %s\n", errorPos, l,
+ (char *) glGetString(GL_PROGRAM_ERROR_STRING_ARB));
+ exit(0);
+ }
+ assert(glIsProgramARB_func(VertProg));
+
+ /*
+ * Misc init
+ */
+ glClearColor(0.3, 0.3, 0.3, 0.0);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_LIGHTING);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, Diffuse);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, Specular);
+ glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 20.0);
+
+#if DO_FRAGMENT_FOG
+ {
+ /* Green-ish fog color */
+ static const GLfloat fogColor[4] = {0.5, 1.0, 0.5, 0};
+ glFogfv(GL_FOG_COLOR, fogColor);
+ glFogf(GL_FOG_START, 5.0);
+ glFogf(GL_FOG_END, 25.0);
+ }
+#endif
+
+ printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER));
+ printf("Press p to toggle between per-pixel and per-vertex lighting\n");
+}
+
+
+int main( int argc, char *argv[] )
+{
+ glutInit( &argc, argv );
+ glutInitWindowPosition( 0, 0 );
+ glutInitWindowSize( 200, 200 );
+ glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH );
+ glutCreateWindow(argv[0]);
+ glutReshapeFunc( Reshape );
+ glutKeyboardFunc( Key );
+ glutSpecialFunc( SpecialKey );
+ glutDisplayFunc( Redisplay );
+ if (Anim)
+ glutIdleFunc(Idle);
+ Init();
+ glutMainLoop();
+ return 0;
+}
diff --git a/progs/demos/arbfslight.c b/progs/demos/arbfslight.c
new file mode 100644
index 00000000000..30332a3f641
--- /dev/null
+++ b/progs/demos/arbfslight.c
@@ -0,0 +1,289 @@
+/*
+ * Use GL_ARB_fragment_shader and GL_ARB_vertex_shader to implement
+ * simple per-pixel lighting.
+ *
+ * Michal Krol
+ * 20 February 2006
+ *
+ * Based on the original demo by:
+ * Brian Paul
+ * 17 April 2003
+ */
+
+#ifdef WIN32
+#include <windows.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <GL/gl.h>
+#include <GL/glut.h>
+#include <GL/glext.h>
+
+#ifdef WIN32
+#define GETPROCADDRESS wglGetProcAddress
+#else
+#define GETPROCADDRESS glutGetProcAddress
+#endif
+
+static GLfloat diffuse[4] = { 0.5f, 0.5f, 1.0f, 1.0f };
+static GLfloat specular[4] = { 0.8f, 0.8f, 0.8f, 1.0f };
+static GLfloat lightPos[4] = { 0.0f, 10.0f, 20.0f, 1.0f };
+static GLfloat delta = 1.0f;
+
+static GLhandleARB fragShader;
+static GLhandleARB vertShader;
+static GLhandleARB program;
+
+static GLint uLightPos;
+static GLint uDiffuse;
+static GLint uSpecular;
+
+static GLboolean anim = GL_TRUE;
+static GLboolean wire = GL_FALSE;
+static GLboolean pixelLight = GL_TRUE;
+
+static GLint t0 = 0;
+static GLint frames = 0;
+
+static GLfloat xRot = 0.0f, yRot = 0.0f;
+
+static PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB = NULL;
+static PFNGLSHADERSOURCEARBPROC glShaderSourceARB = NULL;
+static PFNGLCOMPILESHADERARBPROC glCompileShaderARB = NULL;
+static PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB = NULL;
+static PFNGLATTACHOBJECTARBPROC glAttachObjectARB = NULL;
+static PFNGLLINKPROGRAMARBPROC glLinkProgramARB = NULL;
+static PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB = NULL;
+static PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB = NULL;
+static PFNGLUNIFORM4FVARBPROC glUniform4fvARB = NULL;
+
+static void Redisplay (void)
+{
+ glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ if (pixelLight)
+ {
+ glUseProgramObjectARB (program);
+ glUniform4fvARB (uLightPos, 1, lightPos);
+ glDisable(GL_LIGHTING);
+ }
+ else
+ {
+ glUseProgramObjectARB (0);
+ glLightfv (GL_LIGHT0, GL_POSITION, lightPos);
+ glEnable(GL_LIGHTING);
+ }
+
+ glPushMatrix ();
+ glRotatef (xRot, 1.0f, 0.0f, 0.0f);
+ glRotatef (yRot, 0.0f, 1.0f, 0.0f);
+ glutSolidSphere (2.0, 10, 5);
+ glPopMatrix ();
+
+ glutSwapBuffers();
+ frames++;
+
+ if (anim)
+ {
+ GLint t = glutGet (GLUT_ELAPSED_TIME);
+ if (t - t0 >= 5000)
+ {
+ GLfloat seconds = (GLfloat) (t - t0) / 1000.0f;
+ GLfloat fps = frames / seconds;
+ printf ("%d frames in %6.3f seconds = %6.3f FPS\n", frames, seconds, fps);
+ t0 = t;
+ frames = 0;
+ }
+ }
+}
+
+static void Idle (void)
+{
+ lightPos[0] += delta;
+ if (lightPos[0] > 25.0f || lightPos[0] < -25.0f)
+ delta = -delta;
+ glutPostRedisplay ();
+}
+
+static void Reshape (int width, int height)
+{
+ glViewport (0, 0, width, height);
+ glMatrixMode (GL_PROJECTION);
+ glLoadIdentity ();
+ glFrustum (-1.0, 1.0, -1.0, 1.0, 5.0, 25.0);
+ glMatrixMode (GL_MODELVIEW);
+ glLoadIdentity ();
+ glTranslatef (0.0f, 0.0f, -15.0f);
+}
+
+static void Key (unsigned char key, int x, int y)
+{
+ (void) x;
+ (void) y;
+
+ switch (key)
+ {
+ case ' ':
+ case 'a':
+ anim = !anim;
+ if (anim)
+ glutIdleFunc (Idle);
+ else
+ glutIdleFunc (NULL);
+ break;
+ case 'x':
+ lightPos[0] -= 1.0f;
+ break;
+ case 'X':
+ lightPos[0] += 1.0f;
+ break;
+ case 'w':
+ wire = !wire;
+ if (wire)
+ glPolygonMode (GL_FRONT_AND_BACK, GL_LINE);
+ else
+ glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);
+ break;
+ case 'p':
+ pixelLight = !pixelLight;
+ if (pixelLight)
+ printf ("Per-pixel lighting\n");
+ else
+ printf ("Conventional lighting\n");
+ break;
+ case 27:
+ exit(0);
+ break;
+ }
+ glutPostRedisplay ();
+}
+
+static void SpecialKey (int key, int x, int y)
+{
+ const GLfloat step = 3.0f;
+
+ (void) x;
+ (void) y;
+
+ switch (key)
+ {
+ case GLUT_KEY_UP:
+ xRot -= step;
+ break;
+ case GLUT_KEY_DOWN:
+ xRot += step;
+ break;
+ case GLUT_KEY_LEFT:
+ yRot -= step;
+ break;
+ case GLUT_KEY_RIGHT:
+ yRot += step;
+ break;
+ }
+ glutPostRedisplay ();
+}
+
+static void Init (void)
+{
+ static const char *fragShaderText =
+ "uniform vec4 lightPos;\n"
+ "uniform vec4 diffuse;\n"
+ "uniform vec4 specular;\n"
+ "void main () {\n"
+ " // Compute dot product of light direction and normal vector\n"
+ " float dotProd;\n"
+ " dotProd = clamp (dot (normalize (lightPos).xyz, normalize (gl_TexCoord[0]).xyz), 0.0, 1.0);\n"
+ " // Compute diffuse and specular contributions\n"
+ " gl_FragColor = diffuse * dotProd + specular * pow (dotProd, 20.0);\n"
+ "}\n"
+ ;
+ static const char *vertShaderText =
+ "void main () {\n"
+ " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n"
+ " gl_TexCoord[0] = vec4 (gl_NormalMatrix * gl_Normal, 1.0);\n"
+ "}\n"
+ ;
+
+ if (!glutExtensionSupported ("GL_ARB_fragment_shader"))
+ {
+ printf ("Sorry, this demo requires GL_ARB_fragment_shader\n");
+ exit(1);
+ }
+ if (!glutExtensionSupported ("GL_ARB_shader_objects"))
+ {
+ printf ("Sorry, this demo requires GL_ARB_shader_objects\n");
+ exit(1);
+ }
+ if (!glutExtensionSupported ("GL_ARB_shading_language_100"))
+ {
+ printf ("Sorry, this demo requires GL_ARB_shading_language_100\n");
+ exit(1);
+ }
+ if (!glutExtensionSupported ("GL_ARB_vertex_shader"))
+ {
+ printf ("Sorry, this demo requires GL_ARB_vertex_shader\n");
+ exit(1);
+ }
+
+ glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC) GETPROCADDRESS ("glCreateShaderObjectARB");
+ glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC) GETPROCADDRESS ("glShaderSourceARB");
+ glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC) GETPROCADDRESS ("glCompileShaderARB");
+ glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC) GETPROCADDRESS ("glCreateProgramObjectARB");
+ glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC) GETPROCADDRESS ("glAttachObjectARB");
+ glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC) GETPROCADDRESS ("glLinkProgramARB");
+ glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC) GETPROCADDRESS ("glUseProgramObjectARB");
+ glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC) GETPROCADDRESS ("glGetUniformLocationARB");
+ glUniform4fvARB = (PFNGLUNIFORM4FVARBPROC) GETPROCADDRESS ("glUniform4fvARB");
+
+ fragShader = glCreateShaderObjectARB (GL_FRAGMENT_SHADER_ARB);
+ glShaderSourceARB (fragShader, 1, &fragShaderText, NULL);
+ glCompileShaderARB (fragShader);
+
+ vertShader = glCreateShaderObjectARB (GL_VERTEX_SHADER_ARB);
+ glShaderSourceARB (vertShader, 1, &vertShaderText, NULL);
+ glCompileShaderARB (vertShader);
+
+ program = glCreateProgramObjectARB ();
+ glAttachObjectARB (program, fragShader);
+ glAttachObjectARB (program, vertShader);
+ glLinkProgramARB (program);
+ glUseProgramObjectARB (program);
+
+ uLightPos = glGetUniformLocationARB (program, "lightPos");
+ uDiffuse = glGetUniformLocationARB (program, "diffuse");
+ uSpecular = glGetUniformLocationARB (program, "specular");
+
+ glUniform4fvARB (uDiffuse, 1, diffuse);
+ glUniform4fvARB (uSpecular, 1, specular);
+
+ glClearColor (0.3f, 0.3f, 0.3f, 0.0f);
+ glEnable (GL_DEPTH_TEST);
+ glEnable (GL_LIGHT0);
+ glEnable (GL_LIGHTING);
+ glMaterialfv (GL_FRONT_AND_BACK, GL_DIFFUSE, diffuse);
+ glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, specular);
+ glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, 20.0f);
+
+ printf ("GL_RENDERER = %s\n", (const char *) glGetString (GL_RENDERER));
+ printf ("Press p to toggle between per-pixel and per-vertex lighting\n");
+}
+
+int main (int argc, char *argv[])
+{
+ glutInit (&argc, argv);
+ glutInitWindowPosition ( 0, 0);
+ glutInitWindowSize (200, 200);
+ glutInitDisplayMode (GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
+ glutCreateWindow (argv[0]);
+ glutReshapeFunc (Reshape);
+ glutKeyboardFunc (Key);
+ glutSpecialFunc (SpecialKey);
+ glutDisplayFunc (Redisplay);
+ if (anim)
+ glutIdleFunc (Idle);
+ Init ();
+ glutMainLoop ();
+ return 0;
+}
+
diff --git a/progs/demos/arbocclude.c b/progs/demos/arbocclude.c
new file mode 100644
index 00000000000..ddbb1f1b759
--- /dev/null
+++ b/progs/demos/arbocclude.c
@@ -0,0 +1,283 @@
+/*
+ * GL_ARB_occlusion_query demo
+ *
+ * Brian Paul
+ * 12 June 2003
+ *
+ * Copyright (C) 2003 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.
+ */
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#define GL_GLEXT_PROTOTYPES
+#include <GL/glut.h>
+
+#define TEST_DISPLAY_LISTS 0
+
+static GLboolean Anim = GL_TRUE;
+static GLfloat Xpos = 0;
+static GLuint OccQuery;
+
+
+
+static void
+PrintString(const char *s)
+{
+ while (*s) {
+ glutBitmapCharacter(GLUT_BITMAP_8_BY_13, (int) *s);
+ s++;
+ }
+}
+
+
+
+static void Idle(void)
+{
+ static int lastTime = 0;
+ static int sign = +1;
+ int time = glutGet(GLUT_ELAPSED_TIME);
+ float step;
+
+ if (lastTime == 0)
+ lastTime = time;
+ else if (time - lastTime < 20) /* 50Hz update */
+ return;
+
+ step = (time - lastTime) / 1000.0 * sign;
+ lastTime = time;
+
+ Xpos += step;
+
+ if (Xpos > 2.5) {
+ Xpos = 2.5;
+ sign = -1;
+ }
+ else if (Xpos < -2.5) {
+ Xpos = -2.5;
+ sign = +1;
+ }
+ glutPostRedisplay();
+}
+
+
+static void Display( void )
+{
+ GLuint passed;
+ GLint ready;
+ char s[100];
+
+ glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+
+ glMatrixMode( GL_PROJECTION );
+ glLoadIdentity();
+ glFrustum( -1.0, 1.0, -1.0, 1.0, 5.0, 25.0 );
+ glMatrixMode( GL_MODELVIEW );
+ glLoadIdentity();
+ glTranslatef( 0.0, 0.0, -15.0 );
+
+ /* draw the occluding polygons */
+ glColor3f(0, 0.6, 0.8);
+ glBegin(GL_QUADS);
+ glVertex2f(-1.6, -1.5);
+ glVertex2f(-0.4, -1.5);
+ glVertex2f(-0.4, 1.5);
+ glVertex2f(-1.6, 1.5);
+
+ glVertex2f( 0.4, -1.5);
+ glVertex2f( 1.6, -1.5);
+ glVertex2f( 1.6, 1.5);
+ glVertex2f( 0.4, 1.5);
+ glEnd();
+
+ /* draw the test polygon with occlusion testing */
+ glPushMatrix();
+ glTranslatef(Xpos, 0, -0.5);
+ glScalef(0.3, 0.3, 1.0);
+ glRotatef(-90.0 * Xpos, 0, 0, 1);
+
+#if defined(GL_ARB_occlusion_query)
+#if TEST_DISPLAY_LISTS
+ glNewList(10, GL_COMPILE);
+ glBeginQueryARB(GL_SAMPLES_PASSED_ARB, OccQuery);
+ glEndList();
+ glCallList(10);
+#else
+ glBeginQueryARB(GL_SAMPLES_PASSED_ARB, OccQuery);
+#endif
+
+ glColorMask(0, 0, 0, 0);
+ glDepthMask(GL_FALSE);
+
+ glBegin(GL_POLYGON);
+ glVertex3f(-1, -1, 0);
+ glVertex3f( 1, -1, 0);
+ glVertex3f( 1, 1, 0);
+ glVertex3f(-1, 1, 0);
+ glEnd();
+
+#if TEST_DISPLAY_LISTS
+ glNewList(11, GL_COMPILE);
+ glEndQueryARB(GL_SAMPLES_PASSED_ARB);
+ glEndList();
+ glCallList(11);
+#else
+ glEndQueryARB(GL_SAMPLES_PASSED_ARB);
+#endif
+
+ do {
+ /* do useful work here, if any */
+ glGetQueryObjectivARB(OccQuery, GL_QUERY_RESULT_AVAILABLE_ARB, &ready);
+ } while (!ready);
+ glGetQueryObjectuivARB(OccQuery, GL_QUERY_RESULT_ARB, &passed);
+
+ /* turn off occlusion testing */
+ glColorMask(1, 1, 1, 1);
+ glDepthMask(GL_TRUE);
+#endif /* GL_ARB_occlusion_query */
+
+ /* draw the orange rect, so we can see what's going on */
+ glColor3f(0.8, 0.5, 0);
+ glBegin(GL_POLYGON);
+ glVertex3f(-1, -1, 0);
+ glVertex3f( 1, -1, 0);
+ glVertex3f( 1, 1, 0);
+ glVertex3f(-1, 1, 0);
+ glEnd();
+
+ glPopMatrix();
+
+
+ /* Print result message */
+ glMatrixMode( GL_PROJECTION );
+ glLoadIdentity();
+ glOrtho( -1.0, 1.0, -1.0, 1.0, -1.0, 1.0 );
+ glMatrixMode( GL_MODELVIEW );
+ glLoadIdentity();
+
+ glColor3f(1, 1, 1);
+#if defined(GL_ARB_occlusion_query)
+ sprintf(s, " %4d Fragments Visible", passed);
+ glRasterPos3f(-0.50, -0.7, 0);
+ PrintString(s);
+ if (!passed) {
+ glRasterPos3f(-0.25, -0.8, 0);
+ PrintString("Fully Occluded");
+ }
+#else
+ glRasterPos3f(-0.25, -0.8, 0);
+ PrintString("GL_ARB_occlusion_query not available at compile time");
+#endif /* GL_ARB_occlusion_query */
+
+ glutSwapBuffers();
+}
+
+
+static void Reshape( int width, int height )
+{
+ glViewport( 0, 0, width, height );
+}
+
+
+static void Key( unsigned char key, int x, int y )
+{
+ (void) x;
+ (void) y;
+ switch (key) {
+ case 27:
+ exit(0);
+ break;
+ case ' ':
+ Anim = !Anim;
+ if (Anim)
+ glutIdleFunc(Idle);
+ else
+ glutIdleFunc(NULL);
+ break;
+ }
+ glutPostRedisplay();
+}
+
+
+static void SpecialKey( int key, int x, int y )
+{
+ const GLfloat step = 0.1;
+ (void) x;
+ (void) y;
+ switch (key) {
+ case GLUT_KEY_LEFT:
+ Xpos -= step;
+ break;
+ case GLUT_KEY_RIGHT:
+ Xpos += step;
+ break;
+ }
+ glutPostRedisplay();
+}
+
+
+static void Init( void )
+{
+ const char *ext = (const char *) glGetString(GL_EXTENSIONS);
+ GLint bits;
+
+ if (!strstr(ext, "GL_ARB_occlusion_query")) {
+ printf("Sorry, this demo requires the GL_ARB_occlusion_query extension\n");
+ exit(-1);
+ }
+
+#if defined(GL_ARB_occlusion_query)
+ glGetQueryivARB(GL_SAMPLES_PASSED_ARB, GL_QUERY_COUNTER_BITS_ARB, &bits);
+ if (!bits) {
+ printf("Hmmm, GL_QUERY_COUNTER_BITS_ARB is zero!\n");
+ exit(-1);
+ }
+#endif /* GL_ARB_occlusion_query */
+
+ glGetIntegerv(GL_DEPTH_BITS, &bits);
+ printf("Depthbits: %d\n", bits);
+
+#if defined(GL_ARB_occlusion_query)
+ glGenQueriesARB(1, &OccQuery);
+ assert(OccQuery > 0);
+#endif /* GL_ARB_occlusion_query */
+
+ glEnable(GL_DEPTH_TEST);
+}
+
+
+int main( int argc, char *argv[] )
+{
+ glutInit( &argc, argv );
+ glutInitWindowPosition( 0, 0 );
+ glutInitWindowSize( 400, 400 );
+ glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH );
+ glutCreateWindow(argv[0]);
+ glutReshapeFunc( Reshape );
+ glutKeyboardFunc( Key );
+ glutSpecialFunc( SpecialKey );
+ glutIdleFunc( Idle );
+ glutDisplayFunc( Display );
+ Init();
+ glutMainLoop();
+ return 0;
+}
diff --git a/progs/demos/bounce.c b/progs/demos/bounce.c
new file mode 100644
index 00000000000..436bc7d1fb8
--- /dev/null
+++ b/progs/demos/bounce.c
@@ -0,0 +1,226 @@
+
+/*
+ * Bouncing ball demo.
+ *
+ * This program is in the public domain
+ *
+ * Brian Paul
+ *
+ * Conversion to GLUT by Mark J. Kilgard
+ */
+
+
+#include <math.h>
+#include <stdlib.h>
+#include <string.h>
+#include <GL/glut.h>
+
+#define COS(X) cos( (X) * 3.14159/180.0 )
+#define SIN(X) sin( (X) * 3.14159/180.0 )
+
+#define RED 1
+#define WHITE 2
+#define CYAN 3
+
+GLboolean IndexMode = GL_FALSE;
+GLuint Ball;
+GLenum Mode;
+GLfloat Zrot = 0.0, Zstep = 180.0;
+GLfloat Xpos = 0.0, Ypos = 1.0;
+GLfloat Xvel = 2.0, Yvel = 0.0;
+GLfloat Xmin = -4.0, Xmax = 4.0;
+GLfloat Ymin = -3.8, Ymax = 4.0;
+GLfloat G = -9.8;
+
+static GLuint
+make_ball(void)
+{
+ GLuint list;
+ GLfloat a, b;
+ GLfloat da = 18.0, db = 18.0;
+ GLfloat radius = 1.0;
+ GLuint color;
+ GLfloat x, y, z;
+
+ list = glGenLists(1);
+
+ glNewList(list, GL_COMPILE);
+
+ color = 0;
+ for (a = -90.0; a + da <= 90.0; a += da) {
+
+ glBegin(GL_QUAD_STRIP);
+ for (b = 0.0; b <= 360.0; b += db) {
+
+ if (color) {
+ glIndexi(RED);
+ glColor3f(1, 0, 0);
+ } else {
+ glIndexi(WHITE);
+ glColor3f(1, 1, 1);
+ }
+
+ x = radius * COS(b) * COS(a);
+ y = radius * SIN(b) * COS(a);
+ z = radius * SIN(a);
+ glVertex3f(x, y, z);
+
+ x = radius * COS(b) * COS(a + da);
+ y = radius * SIN(b) * COS(a + da);
+ z = radius * SIN(a + da);
+ glVertex3f(x, y, z);
+
+ color = 1 - color;
+ }
+ glEnd();
+
+ }
+
+ glEndList();
+
+ return list;
+}
+
+static void
+reshape(int width, int height)
+{
+ float aspect = (float) width / (float) height;
+ glViewport(0, 0, (GLint) width, (GLint) height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glOrtho(-6.0 * aspect, 6.0 * aspect, -6.0, 6.0, -6.0, 6.0);
+ glMatrixMode(GL_MODELVIEW);
+}
+
+/* ARGSUSED1 */
+static void
+key(unsigned char k, int x, int y)
+{
+ switch (k) {
+ case 27: /* Escape */
+ exit(0);
+ }
+}
+
+static void
+draw(void)
+{
+ GLint i;
+
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ glIndexi(CYAN);
+ glColor3f(0, 1, 1);
+ glBegin(GL_LINES);
+ for (i = -5; i <= 5; i++) {
+ glVertex2i(i, -5);
+ glVertex2i(i, 5);
+ }
+ for (i = -5; i <= 5; i++) {
+ glVertex2i(-5, i);
+ glVertex2i(5, i);
+ }
+ for (i = -5; i <= 5; i++) {
+ glVertex2i(i, -5);
+ glVertex2f(i * 1.15, -5.9);
+ }
+ glVertex2f(-5.3, -5.35);
+ glVertex2f(5.3, -5.35);
+ glVertex2f(-5.75, -5.9);
+ glVertex2f(5.75, -5.9);
+ glEnd();
+
+ glPushMatrix();
+ glTranslatef(Xpos, Ypos, 0.0);
+ glScalef(2.0, 2.0, 2.0);
+ glRotatef(8.0, 0.0, 0.0, 1.0);
+ glRotatef(90.0, 1.0, 0.0, 0.0);
+ glRotatef(Zrot, 0.0, 0.0, 1.0);
+
+ glCallList(Ball);
+
+ glPopMatrix();
+
+ glFlush();
+ glutSwapBuffers();
+}
+
+static void
+idle(void)
+{
+ static float vel0 = -100.0;
+ static double t0 = -1.;
+ double t, dt;
+ t = glutGet(GLUT_ELAPSED_TIME) / 1000.;
+ if (t0 < 0.)
+ t0 = t;
+ dt = t - t0;
+ t0 = t;
+
+ Zrot += Zstep*dt;
+
+ Xpos += Xvel*dt;
+ if (Xpos >= Xmax) {
+ Xpos = Xmax;
+ Xvel = -Xvel;
+ Zstep = -Zstep;
+ }
+ if (Xpos <= Xmin) {
+ Xpos = Xmin;
+ Xvel = -Xvel;
+ Zstep = -Zstep;
+ }
+ Ypos += Yvel*dt;
+ Yvel += G*dt;
+ if (Ypos < Ymin) {
+ Ypos = Ymin;
+ if (vel0 == -100.0)
+ vel0 = fabs(Yvel);
+ Yvel = vel0;
+ }
+ glutPostRedisplay();
+}
+
+static void
+visible(int vis)
+{
+ if (vis == GLUT_VISIBLE)
+ glutIdleFunc(idle);
+ else
+ glutIdleFunc(NULL);
+}
+
+int main(int argc, char *argv[])
+{
+ glutInit(&argc, argv);
+ glutInitWindowPosition(0, 0);
+ glutInitWindowSize(600, 450);
+
+
+ IndexMode = argc > 1 && strcmp(argv[1], "-ci") == 0;
+ if (IndexMode)
+ glutInitDisplayMode(GLUT_INDEX | GLUT_DOUBLE);
+ else
+ glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
+
+ glutCreateWindow("Bounce");
+ Ball = make_ball();
+ glCullFace(GL_BACK);
+ glEnable(GL_CULL_FACE);
+ glDisable(GL_DITHER);
+ glShadeModel(GL_FLAT);
+
+ glutDisplayFunc(draw);
+ glutReshapeFunc(reshape);
+ glutVisibilityFunc(visible);
+ glutKeyboardFunc(key);
+
+ if (IndexMode) {
+ glutSetColor(RED, 1.0, 0.0, 0.0);
+ glutSetColor(WHITE, 1.0, 1.0, 1.0);
+ glutSetColor(CYAN, 0.0, 1.0, 1.0);
+ }
+
+ glutMainLoop();
+ return 0; /* ANSI C requires main to return int. */
+}
diff --git a/progs/demos/clearspd.c b/progs/demos/clearspd.c
new file mode 100644
index 00000000000..42953f6675e
--- /dev/null
+++ b/progs/demos/clearspd.c
@@ -0,0 +1,218 @@
+
+/*
+ * Simple GLUT program to measure glClear() and glutSwapBuffers() speed.
+ * Brian Paul February 15, 1997 This file in public domain.
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <string.h>
+#include <GL/glut.h>
+
+
+static float MinPeriod = 2.0; /* 2 seconds */
+static int ColorMode = GLUT_RGB;
+static int Width = 400.0;
+static int Height = 400.0;
+static int Loops = 100;
+static float ClearColor = 0.0;
+static GLbitfield BufferMask = GL_COLOR_BUFFER_BIT;
+static GLboolean SwapFlag = GL_FALSE;
+
+
+
+static void Idle( void )
+{
+ glutPostRedisplay();
+}
+
+
+static void Display( void )
+{
+ double t0, t1;
+ double clearRate;
+ double pixelRate;
+ int i;
+
+ glClearColor( ClearColor, ClearColor, ClearColor, 0.0 );
+ ClearColor += 0.1;
+ if (ClearColor>1.0)
+ ClearColor = 0.0;
+
+ if (SwapFlag) {
+ t0 = glutGet(GLUT_ELAPSED_TIME) * 0.001;
+ for (i=0;i<Loops;i++) {
+ glClear( BufferMask );
+ glutSwapBuffers();
+ }
+ glFinish();
+ t1 = glutGet(GLUT_ELAPSED_TIME) * 0.001;
+ }
+ else {
+ t0 = glutGet(GLUT_ELAPSED_TIME) * 0.001;
+ for (i=0;i<Loops;i++) {
+ glClear( BufferMask );
+ }
+ glFinish();
+ t1 = glutGet(GLUT_ELAPSED_TIME) * 0.001;
+ glutSwapBuffers();
+ }
+
+ /* NOTE: If clearspd doesn't map it's window immediately on
+ * starting, swaps will be istantaneous, so this will send Loops
+ * towards infinity. When a window is finally mapped, it may be
+ * minutes before the first call to glutSwapBuffers, making it look
+ * like there's a driver bug.
+ */
+ if (t1-t0 < MinPeriod) {
+ /* Next time do more clears to get longer elapsed time */
+ Loops *= 2;
+ return;
+ }
+
+ clearRate = Loops / (t1-t0);
+ pixelRate = clearRate * Width * Height;
+ if (SwapFlag) {
+ printf("Rate: %d clears+swaps in %gs = %g clears+swaps/s %g pixels/s\n",
+ Loops, t1-t0, clearRate, pixelRate );
+ }
+ else {
+ printf("Rate: %d clears in %gs = %g clears/s %g pixels/s\n",
+ Loops, t1-t0, clearRate, pixelRate);
+ }
+}
+
+
+static void Reshape( int width, int height )
+{
+ Width = width;
+ Height = height;
+ glViewport( 0, 0, width, height );
+ glMatrixMode( GL_PROJECTION );
+ glLoadIdentity();
+ glOrtho(0.0, width, 0.0, height, -1.0, 1.0);
+ glMatrixMode( GL_MODELVIEW );
+ glLoadIdentity();
+}
+
+
+static void Key( unsigned char key, int x, int y )
+{
+ (void) x;
+ (void) y;
+ switch (key) {
+ case 27:
+ exit(0);
+ break;
+ }
+ glutPostRedisplay();
+}
+
+
+static void Init( int argc, char *argv[] )
+{
+ int i;
+ for (i=1; i<argc; i++) {
+ if (strcmp(argv[i],"+rgb")==0)
+ ColorMode = GLUT_RGB;
+ else if (strcmp(argv[i],"+ci")==0)
+ ColorMode = GLUT_INDEX;
+ else if (strcmp(argv[i],"-color")==0)
+ BufferMask = 0;
+ else if (strcmp(argv[i],"+depth")==0)
+ BufferMask |= GL_DEPTH_BUFFER_BIT;
+ else if (strcmp(argv[i],"+alpha")==0)
+ ColorMode = GLUT_RGB | GLUT_ALPHA;
+ else if (strcmp(argv[i],"+stencil")==0)
+ BufferMask |= GL_STENCIL_BUFFER_BIT;
+ else if (strcmp(argv[i],"+accum")==0)
+ BufferMask |= GL_ACCUM_BUFFER_BIT;
+ else if (strcmp(argv[i],"-width")==0) {
+ Width = atoi(argv[i+1]);
+ i++;
+ }
+ else if (strcmp(argv[i],"-height")==0) {
+ Height = atoi(argv[i+1]);
+ i++;
+ }
+ else if (strcmp(argv[i],"+swap")==0) {
+ SwapFlag = GL_TRUE;
+ }
+ else if (strcmp(argv[i],"-swap")==0) {
+ SwapFlag = GL_FALSE;
+ }
+ else
+ printf("Unknown option: %s\n", argv[i]);
+ }
+
+ if (ColorMode & GLUT_ALPHA)
+ printf("Mode: RGB + Alpha\n");
+ else if (ColorMode==GLUT_RGB)
+ printf("Mode: RGB\n");
+ else
+ printf("Mode: Color Index\n");
+ printf("SwapBuffers: %s\n", SwapFlag ? "yes" : "no" );
+ printf("Size: %d x %d\n", Width, Height);
+ printf("Buffers: ");
+ if (BufferMask & GL_COLOR_BUFFER_BIT) printf("color ");
+ if (BufferMask & GL_DEPTH_BUFFER_BIT) printf("depth ");
+ if (BufferMask & GL_STENCIL_BUFFER_BIT) printf("stencil ");
+ if (BufferMask & GL_ACCUM_BUFFER_BIT) printf("accum ");
+ printf("\n");
+}
+
+
+static void Help( const char *program )
+{
+ printf("%s options:\n", program);
+ printf(" +rgb RGB mode\n");
+ printf(" +ci color index mode\n");
+ printf(" -color don't clear color buffer\n");
+ printf(" +alpha clear alpha buffer\n");
+ printf(" +depth clear depth buffer\n");
+ printf(" +stencil clear stencil buffer\n");
+ printf(" +accum clear accum buffer\n");
+ printf(" +swap also do SwapBuffers\n");
+ printf(" -swap don't do SwapBuffers\n");
+}
+
+
+int main( int argc, char *argv[] )
+{
+ GLint mode;
+
+ printf("For options: %s -help\n", argv[0]);
+
+ Init( argc, argv );
+
+ glutInit( &argc, argv );
+ glutInitWindowSize( (int) Width, (int) Height );
+ glutInitWindowPosition( 0, 0 );
+
+ mode = ColorMode | GLUT_DOUBLE;
+ if (BufferMask & GL_STENCIL_BUFFER_BIT)
+ mode |= GLUT_STENCIL;
+ if (BufferMask & GL_ACCUM_BUFFER_BIT)
+ mode |= GLUT_ACCUM;
+ if (BufferMask & GL_DEPTH_BUFFER_BIT)
+ mode |= GLUT_DEPTH;
+
+ glutInitDisplayMode(mode);
+
+ glutCreateWindow( argv[0] );
+
+ if (argc==2 && strcmp(argv[1],"-help")==0) {
+ Help(argv[0]);
+ return 0;
+ }
+
+ glutReshapeFunc( Reshape );
+ glutKeyboardFunc( Key );
+ glutDisplayFunc( Display );
+ glutIdleFunc( Idle );
+
+ glutMainLoop();
+ return 0;
+}
diff --git a/progs/demos/cubemap.c b/progs/demos/cubemap.c
new file mode 100644
index 00000000000..0a59b989835
--- /dev/null
+++ b/progs/demos/cubemap.c
@@ -0,0 +1,475 @@
+/*
+ * GL_ARB_texture_cube_map demo
+ *
+ * Brian Paul
+ * May 2000
+ *
+ *
+ * Copyright (C) 2000 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.
+ */
+
+
+/*
+ * This is a pretty minimalistic demo for now. Eventually, use some
+ * interesting cube map textures and 3D objects.
+ * For now, we use 6 checkerboard "walls" and a sphere (good for
+ * verification purposes).
+ */
+
+
+#include <assert.h>
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "GL/glut.h"
+#include "readtex.h"
+
+
+static GLfloat Xrot = 0, Yrot = 0;
+static GLfloat EyeDist = 10;
+static GLboolean use_vertex_arrays = GL_FALSE;
+static GLboolean anim = GL_TRUE;
+
+#define eps1 0.99
+#define br 20.0 /* box radius */
+
+static const GLfloat tex_coords[] = {
+ /* +X side */
+ 1.0, -eps1, -eps1,
+ 1.0, -eps1, eps1,
+ 1.0, eps1, eps1,
+ 1.0, eps1, -eps1,
+
+ /* -X side */
+ -1.0, eps1, -eps1,
+ -1.0, eps1, eps1,
+ -1.0, -eps1, eps1,
+ -1.0, -eps1, -eps1,
+
+ /* +Y side */
+ -eps1, 1.0, -eps1,
+ -eps1, 1.0, eps1,
+ eps1, 1.0, eps1,
+ eps1, 1.0, -eps1,
+
+ /* -Y side */
+ -eps1, -1.0, -eps1,
+ -eps1, -1.0, eps1,
+ eps1, -1.0, eps1,
+ eps1, -1.0, -eps1,
+
+ /* +Z side */
+ eps1, -eps1, 1.0,
+ -eps1, -eps1, 1.0,
+ -eps1, eps1, 1.0,
+ eps1, eps1, 1.0,
+
+ /* -Z side */
+ eps1, eps1, -1.0,
+ -eps1, eps1, -1.0,
+ -eps1, -eps1, -1.0,
+ eps1, -eps1, -1.0,
+};
+
+static const GLfloat vtx_coords[] = {
+ /* +X side */
+ br, -br, -br,
+ br, -br, br,
+ br, br, br,
+ br, br, -br,
+
+ /* -X side */
+ -br, br, -br,
+ -br, br, br,
+ -br, -br, br,
+ -br, -br, -br,
+
+ /* +Y side */
+ -br, br, -br,
+ -br, br, br,
+ br, br, br,
+ br, br, -br,
+
+ /* -Y side */
+ -br, -br, -br,
+ -br, -br, br,
+ br, -br, br,
+ br, -br, -br,
+
+ /* +Z side */
+ br, -br, br,
+ -br, -br, br,
+ -br, br, br,
+ br, br, br,
+
+ /* -Z side */
+ br, br, -br,
+ -br, br, -br,
+ -br, -br, -br,
+ br, -br, -br,
+};
+
+static void draw_skybox( void )
+{
+ if ( use_vertex_arrays ) {
+ glTexCoordPointer( 3, GL_FLOAT, 0, tex_coords );
+ glVertexPointer( 3, GL_FLOAT, 0, vtx_coords );
+
+ glEnableClientState( GL_TEXTURE_COORD_ARRAY );
+ glEnableClientState( GL_VERTEX_ARRAY );
+
+ glDrawArrays( GL_QUADS, 0, 24 );
+
+ glDisableClientState( GL_TEXTURE_COORD_ARRAY );
+ glDisableClientState( GL_VERTEX_ARRAY );
+ }
+ else {
+ unsigned i;
+
+ glBegin(GL_QUADS);
+ for ( i = 0 ; i < 24 ; i++ ) {
+ glTexCoord3fv( & tex_coords[ i * 3 ] );
+ glVertex3fv ( & vtx_coords[ i * 3 ] );
+ }
+ glEnd();
+ }
+}
+
+
+static void draw( void )
+{
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix(); /*MODELVIEW*/
+ glTranslatef( 0.0, 0.0, -EyeDist );
+
+ /* skybox */
+ glDisable(GL_TEXTURE_GEN_S);
+ glDisable(GL_TEXTURE_GEN_T);
+ glDisable(GL_TEXTURE_GEN_R);
+
+ glMatrixMode(GL_MODELVIEW);
+ glPushMatrix();
+ glRotatef(Xrot, 1, 0, 0);
+ glRotatef(Yrot, 0, 1, 0);
+ draw_skybox();
+ glPopMatrix();
+
+ /* sphere */
+ glMatrixMode(GL_TEXTURE);
+ glLoadIdentity();
+ glRotatef(-Yrot, 0, 1, 0);
+ glRotatef(-Xrot, 1, 0, 0);
+
+ glEnable(GL_TEXTURE_GEN_S);
+ glEnable(GL_TEXTURE_GEN_T);
+ glEnable(GL_TEXTURE_GEN_R);
+ glutSolidSphere(2.0, 20, 20);
+
+ glLoadIdentity(); /* texture */
+
+ glMatrixMode(GL_MODELVIEW);
+ glPopMatrix();
+
+ glutSwapBuffers();
+}
+
+
+static void idle(void)
+{
+ GLfloat t = 0.05 * glutGet(GLUT_ELAPSED_TIME);
+ Yrot = t;
+ glutPostRedisplay();
+}
+
+
+static void set_mode(GLuint mode)
+{
+ if (mode == 0) {
+ glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_ARB);
+ glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_ARB);
+ glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_REFLECTION_MAP_ARB);
+ printf("GL_REFLECTION_MAP_ARB mode\n");
+ }
+ else if (mode == 1) {
+ glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_ARB);
+ glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_ARB);
+ glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_NORMAL_MAP_ARB);
+ printf("GL_NORMAL_MAP_ARB mode\n");
+ }
+}
+
+
+static void key(unsigned char k, int x, int y)
+{
+ static GLuint mode = 0;
+ (void) x;
+ (void) y;
+ switch (k) {
+ case ' ':
+ anim = !anim;
+ if (anim)
+ glutIdleFunc(idle);
+ else
+ glutIdleFunc(NULL);
+ break;
+ case 'm':
+ mode = !mode;
+ set_mode(mode);
+ break;
+ case 'v':
+ use_vertex_arrays = ! use_vertex_arrays;
+ printf( "Vertex arrays are %sabled\n",
+ (use_vertex_arrays) ? "en" : "dis" );
+ break;
+ case 'z':
+ EyeDist -= 0.5;
+ if (EyeDist < 6.0)
+ EyeDist = 6.0;
+ break;
+ case 'Z':
+ EyeDist += 0.5;
+ if (EyeDist > 90.0)
+ EyeDist = 90;
+ break;
+ case 27:
+ exit(0);
+ }
+ glutPostRedisplay();
+}
+
+
+static void specialkey(int key, int x, int y)
+{
+ GLfloat step = 5;
+ (void) x;
+ (void) y;
+ switch (key) {
+ case GLUT_KEY_UP:
+ Xrot += step;
+ break;
+ case GLUT_KEY_DOWN:
+ Xrot -= step;
+ break;
+ case GLUT_KEY_LEFT:
+ Yrot -= step;
+ break;
+ case GLUT_KEY_RIGHT:
+ Yrot += step;
+ break;
+ }
+ glutPostRedisplay();
+}
+
+
+/* new window size or exposure */
+static void reshape(int width, int height)
+{
+ GLfloat ar = (float) width / (float) height;
+ glViewport(0, 0, (GLint)width, (GLint)height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glFrustum( -2.0*ar, 2.0*ar, -2.0, 2.0, 4.0, 100.0 );
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+}
+
+
+static void init_checkers( void )
+{
+#define CUBE_TEX_SIZE 64
+ GLubyte image[CUBE_TEX_SIZE][CUBE_TEX_SIZE][3];
+ static const GLubyte colors[6][3] = {
+ { 255, 0, 0 }, /* face 0 - red */
+ { 0, 255, 255 }, /* face 1 - cyan */
+ { 0, 255, 0 }, /* face 2 - green */
+ { 255, 0, 255 }, /* face 3 - purple */
+ { 0, 0, 255 }, /* face 4 - blue */
+ { 255, 255, 0 } /* face 5 - yellow */
+ };
+ static const GLenum targets[6] = {
+ GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB,
+ GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB,
+ GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB,
+ GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB,
+ GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB,
+ GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB
+ };
+
+ GLint i, j, f;
+
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+
+ /* make colored checkerboard cube faces */
+ for (f = 0; f < 6; f++) {
+ for (i = 0; i < CUBE_TEX_SIZE; i++) {
+ for (j = 0; j < CUBE_TEX_SIZE; j++) {
+ if ((i/4 + j/4) & 1) {
+ image[i][j][0] = colors[f][0];
+ image[i][j][1] = colors[f][1];
+ image[i][j][2] = colors[f][2];
+ }
+ else {
+ image[i][j][0] = 255;
+ image[i][j][1] = 255;
+ image[i][j][2] = 255;
+ }
+ }
+ }
+
+ glTexImage2D(targets[f], 0, GL_RGB, CUBE_TEX_SIZE, CUBE_TEX_SIZE, 0,
+ GL_RGB, GL_UNSIGNED_BYTE, image);
+ }
+}
+
+
+static void load(GLenum target, const char *filename,
+ GLboolean flipTB, GLboolean flipLR)
+{
+ GLint w, h;
+ GLenum format;
+ GLubyte *img = LoadRGBImage( filename, &w, &h, &format );
+ if (!img) {
+ printf("Error: couldn't load texture image %s\n", filename);
+ exit(1);
+ }
+ assert(format == GL_RGB);
+
+ /* <sigh> the way the texture cube mapping works, we have to flip
+ * images to make things look right.
+ */
+ if (flipTB) {
+ const int stride = 3 * w;
+ GLubyte temp[3*1024];
+ int i;
+ for (i = 0; i < h / 2; i++) {
+ memcpy(temp, img + i * stride, stride);
+ memcpy(img + i * stride, img + (h - i - 1) * stride, stride);
+ memcpy(img + (h - i - 1) * stride, temp, stride);
+ }
+ }
+ if (flipLR) {
+ const int stride = 3 * w;
+ GLubyte temp[3];
+ GLubyte *row;
+ int i, j;
+ for (i = 0; i < h; i++) {
+ row = img + i * stride;
+ for (j = 0; j < w / 2; j++) {
+ int k = w - j - 1;
+ temp[0] = row[j*3+0];
+ temp[1] = row[j*3+1];
+ temp[2] = row[j*3+2];
+ row[j*3+0] = row[k*3+0];
+ row[j*3+1] = row[k*3+1];
+ row[j*3+2] = row[k*3+2];
+ row[k*3+0] = temp[0];
+ row[k*3+1] = temp[1];
+ row[k*3+2] = temp[2];
+ }
+ }
+ }
+
+ gluBuild2DMipmaps(target, GL_RGB, w, h, format, GL_UNSIGNED_BYTE, img);
+ free(img);
+}
+
+
+static void load_envmaps(void)
+{
+ load(GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB, "right.rgb", GL_TRUE, GL_FALSE);
+ load(GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB, "left.rgb", GL_TRUE, GL_FALSE);
+ load(GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB, "top.rgb", GL_FALSE, GL_TRUE);
+ load(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB, "bottom.rgb", GL_FALSE, GL_TRUE);
+ load(GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB, "front.rgb", GL_TRUE, GL_FALSE);
+ load(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB, "back.rgb", GL_TRUE, GL_FALSE);
+}
+
+
+static void init( GLboolean useImageFiles )
+{
+ GLenum filter;
+
+ /* check for extension */
+ {
+ char *exten = (char *) glGetString(GL_EXTENSIONS);
+ if (!strstr(exten, "GL_ARB_texture_cube_map")) {
+ printf("Sorry, this demo requires GL_ARB_texture_cube_map\n");
+ exit(0);
+ }
+ }
+ printf("GL_RENDERER: %s\n", (char *) glGetString(GL_RENDERER));
+
+ if (useImageFiles) {
+ load_envmaps();
+ filter = GL_LINEAR;
+ }
+ else {
+ init_checkers();
+ filter = GL_NEAREST;
+ }
+
+ glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_MIN_FILTER, filter);
+ glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_MAG_FILTER, filter);
+ glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+
+ glEnable(GL_TEXTURE_CUBE_MAP_ARB);
+ glEnable(GL_DEPTH_TEST);
+
+ glClearColor(.3, .3, .3, 0);
+ glColor3f( 1.0, 1.0, 1.0 );
+
+ set_mode(0);
+}
+
+
+static void usage(void)
+{
+ printf("keys:\n");
+ printf(" SPACE - toggle animation\n");
+ printf(" CURSOR KEYS - rotation\n");
+ printf(" m - toggle texgen reflection mode\n");
+ printf(" z/Z - change viewing distance\n");
+}
+
+
+int main( int argc, char *argv[] )
+{
+ glutInitWindowPosition(0, 0);
+ glutInitWindowSize(600, 500);
+ glutInitDisplayMode( GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE );
+ glutCreateWindow("Texture Cube Mapping");
+
+ if (argc > 1 && strcmp(argv[1] , "-i") == 0)
+ init( 1 );
+ else
+ init( 0 );
+ glutReshapeFunc( reshape );
+ glutKeyboardFunc( key );
+ glutSpecialFunc( specialkey );
+ glutDisplayFunc( draw );
+ if (anim)
+ glutIdleFunc(idle);
+ usage();
+ glutMainLoop();
+ return 0;
+}
diff --git a/progs/demos/descrip.mms b/progs/demos/descrip.mms
new file mode 100644
index 00000000000..a374fdf13d0
--- /dev/null
+++ b/progs/demos/descrip.mms
@@ -0,0 +1,90 @@
+# Makefile for GLUT-based demo programs for VMS
+# contributed by Jouk Jansen [email protected]
+# Last update : 20 May 2005
+
+.first
+ define gl [--.include.gl]
+
+.include [--]mms-config.
+
+##### MACROS #####
+
+INCDIR = ([--.include],[-.util])
+CFLAGS =/include=$(INCDIR)/prefix=all/name=(as_is,short)/float=ieee/ieee=denorm
+
+.ifdef SHARE
+GL_LIBS = $(XLIBS)
+LIB_DEP = [--.lib]$(GL_SHAR) [--.lib]$(GLU_SHAR) [--.lib]$(GLUT_SHAR)
+.else
+GL_LIBS = [--.lib]libGLUT/l,libMesaGLU/l,libMesaGL/l,$(XLIBS)
+LIB_DEP = [--.lib]$(GL_LIB) [--.lib]$(GLU_LIB) [--.lib]$(GLUT_LIB)
+.endif
+
+
+PROGS = bounce.exe;,clearspd.exe;,drawpix.exe;,gamma.exe;,gears.exe;,\
+ glinfo.exe;,glutfx.exe;,isosurf.exe;,morph3d.exe;,\
+ paltex.exe;,pointblast.exe;,reflect.exe;,spectex.exe;,stex3d.exe;,\
+ tessdemo.exe;,texcyl.exe;,texobj.exe;,trispd.exe;,winpos.exe;
+
+
+##### RULES #####
+.obj.exe :
+ cxxlink $(MMS$TARGET_NAME),$(GL_LIBS)
+
+##### TARGETS #####
+default :
+ $(MMS)$(MMSQUALIFIERS) $(PROGS)
+
+clean :
+ delete *.obj;*
+
+realclean :
+ delete $(PROGS)
+ delete *.obj;*
+
+bounce.exe; : bounce.obj $(LIB_DEP)
+clearspd.exe; : clearspd.obj $(LIB_DEP)
+drawpix.exe; : drawpix.obj $(LIB_DEP) [-.util]readtex.obj
+ cxxlink $(MMS$TARGET_NAME),[-.util]readtex.obj,$(GL_LIBS)
+gamma.exe; : gamma.obj $(LIB_DEP)
+gears.exe; : gears.obj $(LIB_DEP)
+glinfo.exe; : glinfo.obj $(LIB_DEP)
+glutfx.exe; : glutfx.obj $(LIB_DEP)
+isosurf.exe; : isosurf.obj $(LIB_DEP) [-.util]readtex.obj
+ cxxlink $(MMS$TARGET_NAME),[-.util]readtex.obj,$(GL_LIBS)
+morph3d.exe; : morph3d.obj $(LIB_DEP)
+paltex.exe; : paltex.obj $(LIB_DEP)
+pointblast.exe; : pointblast.obj $(LIB_DEP)
+reflect.exe; : reflect.obj [-.util]readtex.obj [-.util]showbuffer.obj\
+ $(LIB_DEP)
+ cxxlink $(MMS$TARGET_NAME),[-.util]readtex,showbuffer,$(GL_LIBS)
+spectex.exe; : spectex.obj $(LIB_DEP)
+stex3d.exe; : stex3d.obj $(LIB_DEP)
+tessdemo.exe; : tessdemo.obj $(LIB_DEP)
+texcyl.exe; : texcyl.obj [-.util]readtex.obj $(LIB_DEP)
+ cxxlink $(MMS$TARGET_NAME),[-.util]readtex.obj,$(GL_LIBS)
+texobj.exe; : texobj.obj $(LIB_DEP)
+trispd.exe; : trispd.obj $(LIB_DEP)
+winpos.exe; : winpos.obj [-.util]readtex.obj $(LIB_DEP)
+ cxxlink $(MMS$TARGET_NAME),[-.util]readtex.obj,$(GL_LIBS)
+
+
+bounce.obj : bounce.c
+clearspd.obj : clearspd.c
+drawpix.obj : drawpix.c
+gamma.obj : gamma.c
+gears.obj : gears.c
+glinfo.obj : glinfo.c
+glutfx.obj : glutfx.c
+isosurf.obj : isosurf.c
+morph3d.obj : morph3d.c
+paltex.obj : paltex.c
+pointblast.obj : pointblast.c
+reflect.obj : reflect.c
+spectex.obj : spectex.c
+stex3d.obj : stex3d.c
+tessdemo.obj : tessdemo.c
+texcyl.obj : texcyl.c
+texobj.obj : texobj.c
+trispd.obj : trispd.c
+winpos.obj : winpos.c
diff --git a/progs/demos/drawpix.c b/progs/demos/drawpix.c
new file mode 100644
index 00000000000..d2f57486744
--- /dev/null
+++ b/progs/demos/drawpix.c
@@ -0,0 +1,358 @@
+
+/*
+ * glDrawPixels demo/test/benchmark
+ *
+ * Brian Paul September 25, 1997 This file is in the public domain.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <string.h>
+#include <GL/glut.h>
+
+#include "readtex.h"
+
+#define IMAGE_FILE "../images/girl.rgb"
+
+static int ImgWidth, ImgHeight;
+static GLenum ImgFormat;
+static GLubyte *Image = NULL;
+
+static int Xpos, Ypos;
+static int SkipPixels, SkipRows;
+static int DrawWidth, DrawHeight;
+static int Scissor = 0;
+static int Fog = 0;
+static GLfloat Zpos = -1.0;
+static float Xzoom, Yzoom;
+static GLboolean DrawFront = GL_FALSE;
+static GLboolean Dither = GL_TRUE;
+
+
+static void Reset( void )
+{
+ Xpos = Ypos = 20;
+ DrawWidth = ImgWidth;
+ DrawHeight = ImgHeight;
+ SkipPixels = SkipRows = 0;
+ Scissor = 0;
+ Fog = 0;
+ Zpos = -1.0;
+ Xzoom = Yzoom = 1.0;
+}
+
+
+static void Display( void )
+{
+ glClear( GL_COLOR_BUFFER_BIT );
+
+#if 0
+ glRasterPos2i(Xpos, Ypos);
+#else
+ /* This allows negative raster positions: */
+ glRasterPos3f(0, 0, Zpos);
+ glBitmap(0, 0, 0, 0, Xpos, Ypos, NULL);
+#endif
+
+ glPixelStorei(GL_UNPACK_SKIP_PIXELS, SkipPixels);
+ glPixelStorei(GL_UNPACK_SKIP_ROWS, SkipRows);
+
+ glPixelZoom( Xzoom, Yzoom );
+
+ if (Scissor)
+ glEnable(GL_SCISSOR_TEST);
+
+ if (Fog)
+ glEnable(GL_FOG);
+
+ glDrawPixels(DrawWidth, DrawHeight, ImgFormat, GL_UNSIGNED_BYTE, Image);
+
+ glDisable(GL_SCISSOR_TEST);
+ glDisable(GL_FOG);
+
+ if (DrawFront)
+ glFinish();
+ else
+ glutSwapBuffers();
+}
+
+
+static void Benchmark( void )
+{
+ int startTime, endTime;
+ int draws = 500;
+ double seconds, pixelsPerSecond;
+
+ printf("Benchmarking...\n");
+ /* GL set-up */
+ glPixelStorei(GL_UNPACK_SKIP_PIXELS, SkipPixels);
+ glPixelStorei(GL_UNPACK_SKIP_ROWS, SkipRows);
+ glPixelZoom( Xzoom, Yzoom );
+ if (Scissor)
+ glEnable(GL_SCISSOR_TEST);
+ if (Fog)
+ glEnable(GL_FOG);
+
+ if (DrawFront)
+ glDrawBuffer(GL_FRONT);
+ else
+ glDrawBuffer(GL_BACK);
+
+ /* Run timing test */
+ draws = 0;
+ startTime = glutGet(GLUT_ELAPSED_TIME);
+ do {
+ glDrawPixels(DrawWidth, DrawHeight, ImgFormat, GL_UNSIGNED_BYTE, Image);
+ draws++;
+ endTime = glutGet(GLUT_ELAPSED_TIME);
+ } while (endTime - startTime < 4000); /* 4 seconds */
+
+ /* GL clean-up */
+ glDisable(GL_SCISSOR_TEST);
+ glDisable(GL_FOG);
+
+ /* Results */
+ seconds = (double) (endTime - startTime) / 1000.0;
+ pixelsPerSecond = draws * DrawWidth * DrawHeight / seconds;
+ printf("Result: %d draws in %f seconds = %f pixels/sec\n",
+ draws, seconds, pixelsPerSecond);
+}
+
+
+static void Reshape( int width, int height )
+{
+ glViewport( 0, 0, width, height );
+ glMatrixMode( GL_PROJECTION );
+ glLoadIdentity();
+ glOrtho( 0.0, width, 0.0, height, 0.0, 2.0 );
+ glMatrixMode( GL_MODELVIEW );
+ glLoadIdentity();
+
+ glScissor(width/4, height/4, width/2, height/2);
+}
+
+
+static void Key( unsigned char key, int x, int y )
+{
+ (void) x;
+ (void) y;
+ switch (key) {
+ case ' ':
+ Reset();
+ break;
+ case 'd':
+ Dither = !Dither;
+ if (Dither)
+ glEnable(GL_DITHER);
+ else
+ glDisable(GL_DITHER);
+ break;
+ case 'w':
+ if (DrawWidth > 0)
+ DrawWidth--;
+ break;
+ case 'W':
+ DrawWidth++;
+ break;
+ case 'h':
+ if (DrawHeight > 0)
+ DrawHeight--;
+ break;
+ case 'H':
+ DrawHeight++;
+ break;
+ case 'p':
+ if (SkipPixels > 0)
+ SkipPixels--;
+ break;
+ case 'P':
+ SkipPixels++;
+ break;
+ case 'r':
+ if (SkipRows > 0)
+ SkipRows--;
+ break;
+ case 'R':
+ SkipRows++;
+ break;
+ case 's':
+ Scissor = !Scissor;
+ break;
+ case 'x':
+ Xzoom -= 0.1;
+ break;
+ case 'X':
+ Xzoom += 0.1;
+ break;
+ case 'y':
+ Yzoom -= 0.1;
+ break;
+ case 'Y':
+ Yzoom += 0.1;
+ break;
+ case 'z':
+ Zpos -= 0.1;
+ printf("RasterPos Z = %g\n", Zpos);
+ break;
+ case 'Z':
+ Zpos += 0.1;
+ printf("RasterPos Z = %g\n", Zpos);
+ break;
+ case 'b':
+ Benchmark();
+ break;
+ case 'F':
+ Fog = !Fog;
+ printf("Fog %d\n", Fog);
+ break;
+ case 'f':
+ DrawFront = !DrawFront;
+ if (DrawFront)
+ glDrawBuffer(GL_FRONT);
+ else
+ glDrawBuffer(GL_BACK);
+ printf("glDrawBuffer(%s)\n", DrawFront ? "GL_FRONT" : "GL_BACK");
+ break;
+ case 27:
+ exit(0);
+ break;
+ }
+ glutPostRedisplay();
+}
+
+
+static void SpecialKey( int key, int x, int y )
+{
+ (void) x;
+ (void) y;
+ switch (key) {
+ case GLUT_KEY_UP:
+ Ypos += 1;
+ break;
+ case GLUT_KEY_DOWN:
+ Ypos -= 1;
+ break;
+ case GLUT_KEY_LEFT:
+ Xpos -= 1;
+ break;
+ case GLUT_KEY_RIGHT:
+ Xpos += 1;
+ break;
+ }
+ glutPostRedisplay();
+}
+
+
+static void Init( GLboolean ciMode, const char *filename )
+{
+ static const GLfloat fogColor[4] = {0, 1, 0, 0};
+
+ printf("GL_VERSION = %s\n", (char *) glGetString(GL_VERSION));
+ printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER));
+
+ Image = LoadRGBImage( filename, &ImgWidth, &ImgHeight, &ImgFormat );
+ if (!Image) {
+ printf("Couldn't read %s\n", filename);
+ exit(0);
+ }
+
+ if (ciMode) {
+ /* Convert RGB image to grayscale */
+ GLubyte *indexImage = (GLubyte *) malloc( ImgWidth * ImgHeight );
+ GLint i;
+ for (i=0; i<ImgWidth*ImgHeight; i++) {
+ int gray = Image[i*3] + Image[i*3+1] + Image[i*3+2];
+ indexImage[i] = gray / 3;
+ }
+ free(Image);
+ Image = indexImage;
+ ImgFormat = GL_COLOR_INDEX;
+
+ for (i=0;i<255;i++) {
+ float g = i / 255.0;
+ glutSetColor(i, g, g, g);
+ }
+ }
+
+ printf("Loaded %d by %d image\n", ImgWidth, ImgHeight );
+
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ glPixelStorei(GL_UNPACK_ROW_LENGTH, ImgWidth);
+
+ glFogi(GL_FOG_MODE, GL_LINEAR);
+ glFogf(GL_FOG_START, 0);
+ glFogf(GL_FOG_END, 2);
+ glFogfv(GL_FOG_COLOR, fogColor);
+
+ Reset();
+}
+
+
+static void Usage(void)
+{
+ printf("Keys:\n");
+ printf(" SPACE Reset Parameters\n");
+ printf(" Up/Down Move image up/down\n");
+ printf(" Left/Right Move image left/right\n");
+ printf(" x Decrease X-axis PixelZoom\n");
+ printf(" X Increase X-axis PixelZoom\n");
+ printf(" y Decrease Y-axis PixelZoom\n");
+ printf(" Y Increase Y-axis PixelZoom\n");
+ printf(" w Decrease glDrawPixels width*\n");
+ printf(" W Increase glDrawPixels width*\n");
+ printf(" h Decrease glDrawPixels height*\n");
+ printf(" H Increase glDrawPixels height*\n");
+ printf(" p Decrease GL_UNPACK_SKIP_PIXELS*\n");
+ printf(" P Increase GL_UNPACK_SKIP_PIXELS*\n");
+ printf(" r Decrease GL_UNPACK_SKIP_ROWS*\n");
+ printf(" R Increase GL_UNPACK_SKIP_ROWS*\n");
+ printf(" s Toggle GL_SCISSOR_TEST\n");
+ printf(" F Toggle GL_FOG\n");
+ printf(" z Decrease RasterPos Z\n");
+ printf(" Z Increase RasterPos Z\n");
+
+ printf(" f Toggle front/back buffer drawing\n");
+ printf(" b Benchmark test\n");
+ printf(" ESC Exit\n");
+ printf("* Warning: no limits are imposed on these parameters so it's\n");
+ printf(" possible to cause a segfault if you go too far.\n");
+}
+
+
+int main( int argc, char *argv[] )
+{
+ GLboolean ciMode = GL_FALSE;
+ const char *filename = IMAGE_FILE;
+ int i = 1;
+
+ if (argc > i && strcmp(argv[i], "-ci")==0) {
+ ciMode = GL_TRUE;
+ i++;
+ }
+ if (argc > i) {
+ filename = argv[i];
+ }
+
+ glutInit( &argc, argv );
+ glutInitWindowPosition( 0, 0 );
+ glutInitWindowSize( 500, 400 );
+
+ if (ciMode)
+ glutInitDisplayMode( GLUT_INDEX | GLUT_DOUBLE );
+ else
+ glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE);
+
+ glutCreateWindow(argv[0]);
+
+ Init(ciMode, filename);
+ Usage();
+
+ glutReshapeFunc( Reshape );
+ glutKeyboardFunc( Key );
+ glutSpecialFunc( SpecialKey );
+ glutDisplayFunc( Display );
+
+ glutMainLoop();
+ return 0;
+}
diff --git a/progs/demos/fire.c b/progs/demos/fire.c
new file mode 100644
index 00000000000..dd70f6141db
--- /dev/null
+++ b/progs/demos/fire.c
@@ -0,0 +1,777 @@
+/*
+ * This program is under the GNU GPL.
+ * Use at your own risk.
+ *
+ * written by David Bucciarelli ([email protected])
+ * Humanware s.r.l.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <time.h>
+#include <string.h>
+
+#ifdef WIN32
+#include <windows.h>
+#include <mmsystem.h>
+#endif
+
+#include <GL/glut.h>
+#include "readtex.h"
+
+#ifdef XMESA
+#include "GL/xmesa.h"
+static int fullscreen = 1;
+#endif
+
+#ifndef M_PI
+#define M_PI 3.1415926535
+#endif
+
+#define vinit(a,i,j,k) {\
+ (a)[0]=i;\
+ (a)[1]=j;\
+ (a)[2]=k;\
+}
+
+#define vinit4(a,i,j,k,w) {\
+ (a)[0]=i;\
+ (a)[1]=j;\
+ (a)[2]=k;\
+ (a)[3]=w;\
+}
+
+
+#define vadds(a,dt,b) {\
+ (a)[0]+=(dt)*(b)[0];\
+ (a)[1]+=(dt)*(b)[1];\
+ (a)[2]+=(dt)*(b)[2];\
+}
+
+#define vequ(a,b) {\
+ (a)[0]=(b)[0];\
+ (a)[1]=(b)[1];\
+ (a)[2]=(b)[2];\
+}
+
+#define vinter(a,dt,b,c) {\
+ (a)[0]=(dt)*(b)[0]+(1.0-dt)*(c)[0];\
+ (a)[1]=(dt)*(b)[1]+(1.0-dt)*(c)[1];\
+ (a)[2]=(dt)*(b)[2]+(1.0-dt)*(c)[2];\
+}
+
+#define clamp(a) ((a) < 0.0 ? 0.0 : ((a) < 1.0 ? (a) : 1.0))
+
+#define vclamp(v) {\
+ (v)[0]=clamp((v)[0]);\
+ (v)[1]=clamp((v)[1]);\
+ (v)[2]=clamp((v)[2]);\
+}
+
+static int WIDTH = 640;
+static int HEIGHT = 480;
+
+static GLint T0 = 0;
+static GLint Frames = 0;
+static GLint NiceFog = 1;
+
+#define DIMP 20.0
+#define DIMTP 16.0
+
+#define RIDCOL 0.4
+
+#define NUMTREE 50
+#define TREEINR 2.5
+#define TREEOUTR 8.0
+
+#define AGRAV -9.8
+
+typedef struct
+{
+ int age;
+ float p[3][3];
+ float v[3];
+ float c[3][4];
+}
+part;
+
+static float treepos[NUMTREE][3];
+
+static float black[3] = { 0.0, 0.0, 0.0 };
+static float blu[3] = { 1.0, 0.2, 0.0 };
+static float blu2[3] = { 1.0, 1.0, 0.0 };
+
+static float fogcolor[4] = { 1.0, 1.0, 1.0, 1.0 };
+
+static float q[4][3] = {
+ {-DIMP, 0.0, -DIMP},
+ {DIMP, 0.0, -DIMP},
+ {DIMP, 0.0, DIMP},
+ {-DIMP, 0.0, DIMP}
+};
+
+static float qt[4][2] = {
+ {-DIMTP, -DIMTP},
+ {DIMTP, -DIMTP},
+ {DIMTP, DIMTP},
+ {-DIMTP, DIMTP}
+};
+
+static int win = 0;
+
+static int np;
+static float eject_r, dt, maxage, eject_vy, eject_vl;
+static short shadows;
+static float ridtri;
+static int fog = 1;
+static int help = 1;
+static int joyavailable = 0;
+static int joyactive = 0;
+
+static part *p;
+
+static GLuint groundid;
+static GLuint treeid;
+
+static float obs[3] = { 2.0, 1.0, 0.0 };
+static float dir[3];
+static float v = 0.0;
+static float alpha = -84.0;
+static float beta = 90.0;
+
+static float
+vrnd(void)
+{
+ return (((float) rand()) / RAND_MAX);
+}
+
+static void
+setnewpart(part * p)
+{
+ float a, v[3], *c;
+
+ p->age = 0;
+
+ a = vrnd() * 3.14159265359 * 2.0;
+
+ vinit(v, sin(a) * eject_r * vrnd(), 0.15, cos(a) * eject_r * vrnd());
+ vinit(p->p[0], v[0] + vrnd() * ridtri, v[1] + vrnd() * ridtri,
+ v[2] + vrnd() * ridtri);
+ vinit(p->p[1], v[0] + vrnd() * ridtri, v[1] + vrnd() * ridtri,
+ v[2] + vrnd() * ridtri);
+ vinit(p->p[2], v[0] + vrnd() * ridtri, v[1] + vrnd() * ridtri,
+ v[2] + vrnd() * ridtri);
+
+ vinit(p->v, v[0] * eject_vl / (eject_r / 2),
+ vrnd() * eject_vy + eject_vy / 2, v[2] * eject_vl / (eject_r / 2));
+
+ c = blu;
+
+ vinit4(p->c[0], c[0] * ((1.0 - RIDCOL) + vrnd() * RIDCOL),
+ c[1] * ((1.0 - RIDCOL) + vrnd() * RIDCOL),
+ c[2] * ((1.0 - RIDCOL) + vrnd() * RIDCOL), 1.0);
+ vinit4(p->c[1], c[0] * ((1.0 - RIDCOL) + vrnd() * RIDCOL),
+ c[1] * ((1.0 - RIDCOL) + vrnd() * RIDCOL),
+ c[2] * ((1.0 - RIDCOL) + vrnd() * RIDCOL), 1.0);
+ vinit4(p->c[2], c[0] * ((1.0 - RIDCOL) + vrnd() * RIDCOL),
+ c[1] * ((1.0 - RIDCOL) + vrnd() * RIDCOL),
+ c[2] * ((1.0 - RIDCOL) + vrnd() * RIDCOL), 1.0);
+}
+
+static void
+setpart(part * p)
+{
+ float fact;
+
+ if (p->p[0][1] < 0.1) {
+ setnewpart(p);
+ return;
+ }
+
+ p->v[1] += AGRAV * dt;
+
+ vadds(p->p[0], dt, p->v);
+ vadds(p->p[1], dt, p->v);
+ vadds(p->p[2], dt, p->v);
+
+ p->age++;
+
+ if ((p->age) > maxage) {
+ vequ(p->c[0], blu2);
+ vequ(p->c[1], blu2);
+ vequ(p->c[2], blu2);
+ }
+ else {
+ fact = 1.0 / maxage;
+ vadds(p->c[0], fact, blu2);
+ vclamp(p->c[0]);
+ p->c[0][3] = fact * (maxage - p->age);
+
+ vadds(p->c[1], fact, blu2);
+ vclamp(p->c[1]);
+ p->c[1][3] = fact * (maxage - p->age);
+
+ vadds(p->c[2], fact, blu2);
+ vclamp(p->c[2]);
+ p->c[2][3] = fact * (maxage - p->age);
+ }
+}
+
+static void
+drawtree(float x, float y, float z)
+{
+ glBegin(GL_QUADS);
+ glTexCoord2f(0.0, 0.0);
+ glVertex3f(x - 1.5, y + 0.0, z);
+
+ glTexCoord2f(1.0, 0.0);
+ glVertex3f(x + 1.5, y + 0.0, z);
+
+ glTexCoord2f(1.0, 1.0);
+ glVertex3f(x + 1.5, y + 3.0, z);
+
+ glTexCoord2f(0.0, 1.0);
+ glVertex3f(x - 1.5, y + 3.0, z);
+
+
+ glTexCoord2f(0.0, 0.0);
+ glVertex3f(x, y + 0.0, z - 1.5);
+
+ glTexCoord2f(1.0, 0.0);
+ glVertex3f(x, y + 0.0, z + 1.5);
+
+ glTexCoord2f(1.0, 1.0);
+ glVertex3f(x, y + 3.0, z + 1.5);
+
+ glTexCoord2f(0.0, 1.0);
+ glVertex3f(x, y + 3.0, z - 1.5);
+
+ glEnd();
+
+}
+
+static void
+calcposobs(void)
+{
+ dir[0] = sin(alpha * M_PI / 180.0);
+ dir[2] = cos(alpha * M_PI / 180.0) * sin(beta * M_PI / 180.0);
+ dir[1] = cos(beta * M_PI / 180.0);
+
+ if (dir[0] < 1.0e-5 && dir[0] > -1.0e-5)
+ dir[0] = 0;
+ if (dir[1] < 1.0e-5 && dir[1] > -1.0e-5)
+ dir[1] = 0;
+ if (dir[2] < 1.0e-5 && dir[2] > -1.0e-5)
+ dir[2] = 0;
+
+ obs[0] += v * dir[0];
+ obs[1] += v * dir[1];
+ obs[2] += v * dir[2];
+}
+
+static void
+printstring(void *font, char *string)
+{
+ int len, i;
+
+ len = (int) strlen(string);
+ for (i = 0; i < len; i++)
+ glutBitmapCharacter(font, string[i]);
+}
+
+static void
+reshape(int width, int height)
+{
+ WIDTH = width;
+ HEIGHT = height;
+ glViewport(0, 0, (GLint) width, (GLint) height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(70.0, width / (float) height, 0.1, 30.0);
+
+ glMatrixMode(GL_MODELVIEW);
+}
+
+static void
+printhelp(void)
+{
+ glColor4f(0.0, 0.0, 0.0, 0.5);
+ glRecti(40, 40, 600, 440);
+
+ glColor3f(1.0, 0.0, 0.0);
+ glRasterPos2i(300, 420);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24, "Help");
+
+ glRasterPos2i(60, 390);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24, "h - Toggle Help");
+
+ glRasterPos2i(60, 360);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24, "t - Increase particle size");
+ glRasterPos2i(60, 330);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24, "T - Decrease particle size");
+
+ glRasterPos2i(60, 300);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24, "r - Increase emission radius");
+ glRasterPos2i(60, 270);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24, "R - Decrease emission radius");
+
+ glRasterPos2i(60, 240);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24, "f - Toggle Fog");
+ glRasterPos2i(60, 210);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24, "s - Toggle shadows");
+ glRasterPos2i(60, 180);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24, "Arrow Keys - Rotate");
+ glRasterPos2i(60, 150);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24, "a - Increase velocity");
+ glRasterPos2i(60, 120);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24, "z - Decrease velocity");
+
+ glRasterPos2i(60, 90);
+ if (joyavailable)
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24,
+ "j - Toggle jostick control (Joystick control available)");
+ else
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24,
+ "(No Joystick control available)");
+}
+
+static void
+dojoy(void)
+{
+#ifdef WIN32
+ static UINT max[2] = { 0, 0 };
+ static UINT min[2] = { 0xffffffff, 0xffffffff }, center[2];
+ MMRESULT res;
+ JOYINFO joy;
+
+ res = joyGetPos(JOYSTICKID1, &joy);
+
+ if (res == JOYERR_NOERROR) {
+ joyavailable = 1;
+
+ if (max[0] < joy.wXpos)
+ max[0] = joy.wXpos;
+ if (min[0] > joy.wXpos)
+ min[0] = joy.wXpos;
+ center[0] = (max[0] + min[0]) / 2;
+
+ if (max[1] < joy.wYpos)
+ max[1] = joy.wYpos;
+ if (min[1] > joy.wYpos)
+ min[1] = joy.wYpos;
+ center[1] = (max[1] + min[1]) / 2;
+
+ if (joyactive) {
+ if (fabs(center[0] - (float) joy.wXpos) > 0.1 * (max[0] - min[0]))
+ alpha +=
+ 2.5 * (center[0] - (float) joy.wXpos) / (max[0] - min[0]);
+ if (fabs(center[1] - (float) joy.wYpos) > 0.1 * (max[1] - min[1]))
+ beta += 2.5 * (center[1] - (float) joy.wYpos) / (max[1] - min[1]);
+
+ if (joy.wButtons & JOY_BUTTON1)
+ v += 0.01;
+ if (joy.wButtons & JOY_BUTTON2)
+ v -= 0.01;
+ }
+ }
+ else
+ joyavailable = 0;
+#endif
+}
+
+static void
+drawfire(void)
+{
+ static char frbuf[80] = "";
+ int j;
+ static double t0 = -1.;
+ double t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
+ if (t0 < 0.0)
+ t0 = t;
+ dt = (t - t0) * 1.0;
+ t0 = t;
+
+ dojoy();
+
+ if (NiceFog)
+ glHint(GL_FOG_HINT, GL_NICEST);
+ else
+ glHint(GL_FOG_HINT, GL_DONT_CARE);
+
+ glEnable(GL_DEPTH_TEST);
+
+ if (fog)
+ glEnable(GL_FOG);
+ else
+ glDisable(GL_FOG);
+
+ glDepthMask(GL_TRUE);
+ glClearColor(1.0, 1.0, 1.0, 1.0);
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix();
+ calcposobs();
+ gluLookAt(obs[0], obs[1], obs[2],
+ obs[0] + dir[0], obs[1] + dir[1], obs[2] + dir[2],
+ 0.0, 1.0, 0.0);
+
+ glColor4f(1.0, 1.0, 1.0, 1.0);
+
+ glEnable(GL_TEXTURE_2D);
+
+ glBindTexture(GL_TEXTURE_2D, groundid);
+#if 1
+ glBegin(GL_QUADS);
+ glTexCoord2fv(qt[0]);
+ glVertex3fv(q[0]);
+ glTexCoord2fv(qt[1]);
+ glVertex3fv(q[1]);
+ glTexCoord2fv(qt[2]);
+ glVertex3fv(q[2]);
+ glTexCoord2fv(qt[3]);
+ glVertex3fv(q[3]);
+ glEnd();
+#else
+ /* Subdivide the ground into a bunch of quads. This improves fog
+ * if GL_FOG_HINT != GL_NICEST
+ */
+ {
+ float x, y;
+ float dx = 1.0, dy = 1.0;
+ glBegin(GL_QUADS);
+ for (y = -DIMP; y < DIMP; y += 1.0) {
+ for (x = -DIMP; x < DIMP; x += 1.0) {
+ glTexCoord2f(0, 0); glVertex3f(x, 0, y);
+ glTexCoord2f(1, 0); glVertex3f(x+dx, 0, y);
+ glTexCoord2f(1, 1); glVertex3f(x+dx, 0, y+dy);
+ glTexCoord2f(0, 1); glVertex3f(x, 0, y+dy);
+ }
+ }
+ glEnd();
+ }
+#endif
+
+
+ glEnable(GL_ALPHA_TEST);
+ glAlphaFunc(GL_GEQUAL, 0.9);
+
+ glBindTexture(GL_TEXTURE_2D, treeid);
+ for (j = 0; j < NUMTREE; j++)
+ drawtree(treepos[j][0], treepos[j][1], treepos[j][2]);
+
+ glDisable(GL_TEXTURE_2D);
+ glDepthMask(GL_FALSE);
+ glDisable(GL_ALPHA_TEST);
+
+ if (shadows) {
+ glBegin(GL_TRIANGLES);
+ for (j = 0; j < np; j++) {
+ glColor4f(black[0], black[1], black[2], p[j].c[0][3]);
+ glVertex3f(p[j].p[0][0], 0.1, p[j].p[0][2]);
+
+ glColor4f(black[0], black[1], black[2], p[j].c[1][3]);
+ glVertex3f(p[j].p[1][0], 0.1, p[j].p[1][2]);
+
+ glColor4f(black[0], black[1], black[2], p[j].c[2][3]);
+ glVertex3f(p[j].p[2][0], 0.1, p[j].p[2][2]);
+ }
+ glEnd();
+ }
+
+ glBegin(GL_TRIANGLES);
+ for (j = 0; j < np; j++) {
+ glColor4fv(p[j].c[0]);
+ glVertex3fv(p[j].p[0]);
+
+ glColor4fv(p[j].c[1]);
+ glVertex3fv(p[j].p[1]);
+
+ glColor4fv(p[j].c[2]);
+ glVertex3fv(p[j].p[2]);
+
+ setpart(&p[j]);
+ }
+ glEnd();
+
+ glDisable(GL_TEXTURE_2D);
+ glDisable(GL_ALPHA_TEST);
+ glDisable(GL_DEPTH_TEST);
+ glDisable(GL_FOG);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glOrtho(-0.5, 639.5, -0.5, 479.5, -1.0, 1.0);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ glColor3f(1.0, 0.0, 0.0);
+ glRasterPos2i(10, 10);
+ printstring(GLUT_BITMAP_HELVETICA_18, frbuf);
+ glRasterPos2i(370, 470);
+ printstring(GLUT_BITMAP_HELVETICA_10,
+ "Fire V1.5 Written by David Bucciarelli ([email protected])");
+
+ if (help)
+ printhelp();
+
+ reshape(WIDTH, HEIGHT);
+ glPopMatrix();
+
+ glutSwapBuffers();
+
+ Frames++;
+ {
+ GLint t = glutGet(GLUT_ELAPSED_TIME);
+ if (t - T0 >= 2000) {
+ GLfloat seconds = (t - T0) / 1000.0;
+ GLfloat fps = Frames / seconds;
+ sprintf(frbuf, "Frame rate: %f", fps);
+ T0 = t;
+ Frames = 0;
+ }
+ }
+}
+
+
+static void
+idle(void)
+{
+ glutPostRedisplay();
+}
+
+
+static void
+special(int key, int x, int y)
+{
+ switch (key) {
+ case GLUT_KEY_LEFT:
+ alpha += 2.0;
+ break;
+ case GLUT_KEY_RIGHT:
+ alpha -= 2.0;
+ break;
+ case GLUT_KEY_DOWN:
+ beta -= 2.0;
+ break;
+ case GLUT_KEY_UP:
+ beta += 2.0;
+ break;
+ }
+ glutPostRedisplay();
+}
+
+static void
+key(unsigned char key, int x, int y)
+{
+ switch (key) {
+ case 27:
+ exit(0);
+ break;
+
+ case 'a':
+ v += 0.0005;
+ break;
+ case 'z':
+ v -= 0.0005;
+ break;
+
+ case 'j':
+ joyactive = (!joyactive);
+ break;
+ case 'h':
+ help = (!help);
+ break;
+ case 'f':
+ fog = (!fog);
+ break;
+ case 's':
+ shadows = !shadows;
+ break;
+ case 'R':
+ eject_r -= 0.03;
+ break;
+ case 'r':
+ eject_r += 0.03;
+ break;
+ case 't':
+ ridtri += 0.005;
+ break;
+ case 'T':
+ ridtri -= 0.005;
+ break;
+#ifdef XMESA
+ case ' ':
+ XMesaSetFXmode(fullscreen ? XMESA_FX_FULLSCREEN : XMESA_FX_WINDOW);
+ fullscreen = (!fullscreen);
+ break;
+#endif
+ case 'n':
+ NiceFog = !NiceFog;
+ printf("NiceFog %d\n", NiceFog);
+ break;
+ }
+ glutPostRedisplay();
+}
+
+static void
+inittextures(void)
+{
+ GLenum gluerr;
+ GLubyte tex[128][128][4];
+
+ glGenTextures(1, &groundid);
+ glBindTexture(GL_TEXTURE_2D, groundid);
+
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
+ if (!LoadRGBMipmaps("../images/s128.rgb", GL_RGB)) {
+ fprintf(stderr, "Error reading a texture.\n");
+ exit(-1);
+ }
+
+ 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_MIN_FILTER,
+ GL_LINEAR_MIPMAP_LINEAR);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
+
+ glGenTextures(1, &treeid);
+ glBindTexture(GL_TEXTURE_2D, treeid);
+
+ if (1)
+ {
+ int w, h;
+ GLenum format;
+ int x, y;
+ GLubyte *image = LoadRGBImage("../images/tree3.rgb", &w, &h, &format);
+
+ if (!image) {
+ fprintf(stderr, "Error reading a texture.\n");
+ exit(-1);
+ }
+
+ for (y = 0; y < 128; y++)
+ for (x = 0; x < 128; x++) {
+ tex[x][y][0] = image[(y + x * 128) * 3];
+ tex[x][y][1] = image[(y + x * 128) * 3 + 1];
+ tex[x][y][2] = image[(y + x * 128) * 3 + 2];
+ if ((tex[x][y][0] == tex[x][y][1]) &&
+ (tex[x][y][1] == tex[x][y][2]) && (tex[x][y][2] == 255))
+ tex[x][y][3] = 0;
+ else
+ tex[x][y][3] = 255;
+ }
+
+ if ((gluerr = gluBuild2DMipmaps(GL_TEXTURE_2D, 4, 128, 128, GL_RGBA,
+ GL_UNSIGNED_BYTE, (GLvoid *) (tex)))) {
+ fprintf(stderr, "GLULib%s\n", (char *) gluErrorString(gluerr));
+ exit(-1);
+ }
+ }
+ else {
+ if (!LoadRGBMipmaps("../images/tree2.rgba", GL_RGBA)) {
+ fprintf(stderr, "Error reading a texture.\n");
+ exit(-1);
+ }
+ }
+
+ 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_MIN_FILTER,
+ GL_LINEAR_MIPMAP_LINEAR);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+}
+
+static void
+inittree(void)
+{
+ int i;
+ float dist;
+
+ for (i = 0; i < NUMTREE; i++)
+ do {
+ treepos[i][0] = vrnd() * TREEOUTR * 2.0 - TREEOUTR;
+ treepos[i][1] = 0.0;
+ treepos[i][2] = vrnd() * TREEOUTR * 2.0 - TREEOUTR;
+ dist =
+ sqrt(treepos[i][0] * treepos[i][0] +
+ treepos[i][2] * treepos[i][2]);
+ } while ((dist < TREEINR) || (dist > TREEOUTR));
+}
+
+int
+main(int ac, char **av)
+{
+ int i;
+
+ fprintf(stderr,
+ "Fire V1.5\nWritten by David Bucciarelli ([email protected])\n");
+
+ /* Default settings */
+
+ np = 800;
+ eject_r = -0.65;
+ dt = 0.015;
+ eject_vy = 4;
+ eject_vl = 1;
+ shadows = 1;
+ ridtri = 0.25;
+
+ maxage = 1.0 / dt;
+
+ if (ac == 2)
+ np = atoi(av[1]);
+
+ if (ac == 4) {
+ WIDTH = atoi(av[2]);
+ HEIGHT = atoi(av[3]);
+ }
+
+ glutInitWindowPosition(0, 0);
+ glutInitWindowSize(WIDTH, HEIGHT);
+ glutInit(&ac, av);
+
+ glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
+
+ if (!(win = glutCreateWindow("Fire"))) {
+ fprintf(stderr, "Error opening a window.\n");
+ exit(-1);
+ }
+
+ reshape(WIDTH, HEIGHT);
+
+ inittextures();
+
+ glShadeModel(GL_FLAT);
+ glEnable(GL_DEPTH_TEST);
+
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ glEnable(GL_FOG);
+ glFogi(GL_FOG_MODE, GL_EXP);
+ glFogfv(GL_FOG_COLOR, fogcolor);
+ glFogf(GL_FOG_DENSITY, 0.1);
+
+ p = (part *) malloc(sizeof(part) * np);
+
+ for (i = 0; i < np; i++)
+ setnewpart(&p[i]);
+
+ inittree();
+
+ glutKeyboardFunc(key);
+ glutSpecialFunc(special);
+ glutDisplayFunc(drawfire);
+ glutIdleFunc(idle);
+ glutReshapeFunc(reshape);
+ glutMainLoop();
+
+ return (0);
+}
diff --git a/progs/demos/fogcoord.c b/progs/demos/fogcoord.c
new file mode 100644
index 00000000000..19a15f05b87
--- /dev/null
+++ b/progs/demos/fogcoord.c
@@ -0,0 +1,420 @@
+/*
+ * EXT_fog_coord.
+ *
+ * Based on glutskel.c by Brian Paul
+ * and NeHe's Volumetric fog tutorial!
+ *
+ * Daniel Borca
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <GL/glut.h>
+
+#include "readtex.h"
+
+#define TEXTURE_FILE "../images/bw.rgb"
+
+#define ARRAYS 0 /* use glDrawElements */
+
+#define VERBOSE 1 /* tell me what happens */
+
+#define DEPTH 15.0f
+
+#if !defined(GLAPIENTRYP)
+# define GLAPIENTRYP *
+#endif
+
+typedef void (GLAPIENTRYP GLFOGCOORDFEXTPROC) (GLfloat f);
+typedef void (GLAPIENTRYP GLFOGCOORDPOINTEREXTPROC) (GLenum, GLsizei, const GLvoid *);
+
+static GLFOGCOORDFEXTPROC glFogCoordf_ext;
+#if ARRAYS
+static GLFOGCOORDPOINTEREXTPROC glFogCoordPointer_ext;
+#endif
+static GLboolean have_fog_coord;
+
+static GLfloat camz;
+static GLuint texture[1];
+
+static GLint fogMode;
+static GLboolean fogCoord;
+static GLfloat fogDensity = 0.75;
+static GLfloat fogStart = 1.0, fogEnd = 40.0;
+static GLfloat fogColor[4] = {0.6f, 0.3f, 0.0f, 1.0f};
+
+
+static void APIENTRY glFogCoordf_nop (GLfloat f)
+{
+ (void)f;
+}
+
+
+static int BuildTexture (const char *filename, GLuint texid[])
+{
+ GLubyte *tex_data;
+ GLenum tex_format;
+ GLint tex_width, tex_height;
+
+ tex_data = LoadRGBImage(filename, &tex_width, &tex_height, &tex_format);
+ if (tex_data == NULL) {
+ return -1;
+ }
+
+ {
+ GLint tex_max;
+ glGetIntegerv(GL_MAX_TEXTURE_SIZE, &tex_max);
+ if ((tex_width > tex_max) || (tex_height > tex_max)) {
+ return -1;
+ }
+ }
+
+ glGenTextures(1, texid);
+
+ glBindTexture(GL_TEXTURE_2D, texid[0]);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+
+ glTexImage2D(GL_TEXTURE_2D, 0, tex_format, tex_width, tex_height, 0,
+ tex_format, GL_UNSIGNED_BYTE, tex_data);
+
+ return 0;
+}
+
+
+static int SetFogMode (GLint fogMode)
+{
+ fogMode &= 3;
+ switch (fogMode) {
+ case 0:
+ glDisable(GL_FOG);
+#if VERBOSE
+ printf("fog(disable)\n");
+#endif
+ break;
+ case 1:
+ glEnable(GL_FOG);
+ glFogi(GL_FOG_MODE, GL_LINEAR);
+ glFogf(GL_FOG_START, fogStart);
+ glFogf(GL_FOG_END, fogEnd);
+#if VERBOSE
+ printf("fog(GL_LINEAR, %.2f, %.2f)\n", fogStart, fogEnd);
+#endif
+ break;
+ case 2:
+ glEnable(GL_FOG);
+ glFogi(GL_FOG_MODE, GL_EXP);
+ glFogf(GL_FOG_DENSITY, fogDensity);
+#if VERBOSE
+ printf("fog(GL_EXP, %.2f)\n", fogDensity);
+#endif
+ break;
+ case 3:
+ glEnable(GL_FOG);
+ glFogi(GL_FOG_MODE, GL_EXP2);
+ glFogf(GL_FOG_DENSITY, fogDensity);
+#if VERBOSE
+ printf("fog(GL_EXP2, %.2f)\n", fogDensity);
+#endif
+ break;
+ }
+ return fogMode;
+}
+
+
+static GLboolean SetFogCoord (GLboolean fogCoord)
+{
+ glFogCoordf_ext = glFogCoordf_nop;
+
+ if (!have_fog_coord) {
+#if VERBOSE
+ printf("fog(GL_FRAGMENT_DEPTH_EXT)%s\n", fogCoord ? " EXT_fog_coord not available!" : "");
+#endif
+ return GL_FALSE;
+ }
+
+ if (fogCoord) {
+ glFogCoordf_ext = (GLFOGCOORDFEXTPROC)glutGetProcAddress("glFogCoordfEXT");
+ glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FOG_COORDINATE_EXT);
+#if VERBOSE
+ printf("fog(GL_FOG_COORDINATE_EXT)\n");
+#endif
+ } else {
+ glFogi(GL_FOG_COORDINATE_SOURCE_EXT, GL_FRAGMENT_DEPTH_EXT);
+#if VERBOSE
+ printf("fog(GL_FRAGMENT_DEPTH_EXT)\n");
+#endif
+ }
+ return fogCoord;
+}
+
+
+#if ARRAYS
+/* could reuse vertices */
+static GLuint vertex_index[] = {
+ /* Back */
+ 0, 1, 2, 3,
+
+ /* Floor */
+ 4, 5, 6, 7,
+
+ /* Roof */
+ 8, 9, 10, 11,
+
+ /* Right */
+ 12, 13, 14, 15,
+
+ /* Left */
+ 16, 17, 18, 19
+};
+
+static GLfloat vertex_pointer[][3] = {
+ /* Back */
+ {-2.5f,-2.5f,-DEPTH}, { 2.5f,-2.5f,-DEPTH}, { 2.5f, 2.5f,-DEPTH}, {-2.5f, 2.5f,-DEPTH},
+
+ /* Floor */
+ {-2.5f,-2.5f,-DEPTH}, { 2.5f,-2.5f,-DEPTH}, { 2.5f,-2.5f, DEPTH}, {-2.5f,-2.5f, DEPTH},
+
+ /* Roof */
+ {-2.5f, 2.5f,-DEPTH}, { 2.5f, 2.5f,-DEPTH}, { 2.5f, 2.5f, DEPTH}, {-2.5f, 2.5f, DEPTH},
+
+ /* Right */
+ { 2.5f,-2.5f, DEPTH}, { 2.5f, 2.5f, DEPTH}, { 2.5f, 2.5f,-DEPTH}, { 2.5f,-2.5f,-DEPTH},
+
+ /* Left */
+ {-2.5f,-2.5f, DEPTH}, {-2.5f, 2.5f, DEPTH}, {-2.5f, 2.5f,-DEPTH}, {-2.5f,-2.5f,-DEPTH}
+};
+
+static GLfloat texcoord_pointer[][2] = {
+ /* Back */
+ {0.0f, 0.0f}, {1.0f, 0.0f}, {1.0f, 1.0f}, {0.0f, 1.0f},
+
+ /* Floor */
+ {0.0f, 0.0f}, {1.0f, 0.0f}, {1.0f, 1.0f}, {0.0f, 1.0f},
+
+ /* Roof */
+ {0.0f, 0.0f}, {1.0f, 0.0f}, {1.0f, 1.0f}, {0.0f, 1.0f},
+
+ /* Right */
+ {0.0f, 0.0f}, {0.0f, 1.0f}, {1.0f, 1.0f}, {1.0f, 0.0f},
+
+ /* Left */
+ {0.0f, 0.0f}, {0.0f, 1.0f}, {1.0f, 1.0f}, {1.0f, 0.0f}
+};
+
+static GLfloat fogcoord_pointer[][1] = {
+ /* Back */
+ {1.0f}, {1.0f}, {1.0f}, {1.0f},
+
+ /* Floor */
+ {1.0f}, {1.0f}, {0.0f}, {0.0f},
+
+ /* Roof */
+ {1.0f}, {1.0f}, {0.0f}, {0.0f},
+
+ /* Right */
+ {0.0f}, {0.0f}, {1.0f}, {1.0f},
+
+ /* Left */
+ {0.0f}, {0.0f}, {1.0f}, {1.0f}
+};
+#endif
+
+
+static void Display( void )
+{
+ glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ glLoadIdentity ();
+
+ glTranslatef(0.0f, 0.0f, camz);
+
+#if ARRAYS
+ glDrawElements(GL_QUADS, sizeof(vertex_index) / sizeof(vertex_index[0]), GL_UNSIGNED_INT, vertex_index);
+#else
+ /* Back */
+ glBegin(GL_QUADS);
+ glFogCoordf_ext(1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.5f,-2.5f,-DEPTH);
+ glFogCoordf_ext(1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 2.5f,-2.5f,-DEPTH);
+ glFogCoordf_ext(1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f( 2.5f, 2.5f,-DEPTH);
+ glFogCoordf_ext(1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.5f, 2.5f,-DEPTH);
+ glEnd();
+
+ /* Floor */
+ glBegin(GL_QUADS);
+ glFogCoordf_ext(1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.5f,-2.5f,-DEPTH);
+ glFogCoordf_ext(1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 2.5f,-2.5f,-DEPTH);
+ glFogCoordf_ext(0.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f( 2.5f,-2.5f, DEPTH);
+ glFogCoordf_ext(0.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.5f,-2.5f, DEPTH);
+ glEnd();
+
+ /* Roof */
+ glBegin(GL_QUADS);
+ glFogCoordf_ext(1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.5f, 2.5f,-DEPTH);
+ glFogCoordf_ext(1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 2.5f, 2.5f,-DEPTH);
+ glFogCoordf_ext(0.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f( 2.5f, 2.5f, DEPTH);
+ glFogCoordf_ext(0.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.5f, 2.5f, DEPTH);
+ glEnd();
+
+ /* Right */
+ glBegin(GL_QUADS);
+ glFogCoordf_ext(0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f( 2.5f,-2.5f, DEPTH);
+ glFogCoordf_ext(0.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f( 2.5f, 2.5f, DEPTH);
+ glFogCoordf_ext(1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f( 2.5f, 2.5f,-DEPTH);
+ glFogCoordf_ext(1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 2.5f,-2.5f,-DEPTH);
+ glEnd();
+
+ /* Left */
+ glBegin(GL_QUADS);
+ glFogCoordf_ext(0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-2.5f,-2.5f, DEPTH);
+ glFogCoordf_ext(0.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-2.5f, 2.5f, DEPTH);
+ glFogCoordf_ext(1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(-2.5f, 2.5f,-DEPTH);
+ glFogCoordf_ext(1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(-2.5f,-2.5f,-DEPTH);
+ glEnd();
+#endif
+
+ glutSwapBuffers();
+}
+
+
+static void Reshape( int width, int height )
+{
+ glViewport(0, 0, width, height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(45.0f, (GLfloat)(width)/(GLfloat)(height), 0.1f, 100.0f);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+}
+
+
+static void Key( unsigned char key, int x, int y )
+{
+ (void) x;
+ (void) y;
+ switch (key) {
+ case 'f':
+ fogMode = SetFogMode(fogMode + 1);
+ break;
+ case '+':
+ if (fogDensity < 1.0) {
+ fogDensity += 0.05;
+ }
+ SetFogMode(fogMode);
+ break;
+ case '-':
+ if (fogDensity > 0.0) {
+ fogDensity -= 0.05;
+ }
+ SetFogMode(fogMode);
+ break;
+ case 's':
+ if (fogStart > 0.0) {
+ fogStart -= 1.0;
+ }
+ SetFogMode(fogMode);
+ break;
+ case 'S':
+ if (fogStart < fogEnd) {
+ fogStart += 1.0;
+ }
+ SetFogMode(fogMode);
+ break;
+ case 'e':
+ if (fogEnd > fogStart) {
+ fogEnd -= 1.0;
+ }
+ SetFogMode(fogMode);
+ break;
+ case 'E':
+ if (fogEnd < 100.0) {
+ fogEnd += 1.0;
+ }
+ SetFogMode(fogMode);
+ break;
+ case 'c':
+ fogCoord = SetFogCoord(fogCoord ^ GL_TRUE);
+ break;
+ case 27:
+ exit(0);
+ break;
+ }
+ glutPostRedisplay();
+}
+
+
+static void SpecialKey( int key, int x, int y )
+{
+ (void) x;
+ (void) y;
+ switch (key) {
+ case GLUT_KEY_UP:
+ if (camz < (DEPTH - 1.0)) {
+ camz += 1.0f;
+ }
+ break;
+ case GLUT_KEY_DOWN:
+ if (camz > -19.0) {
+ camz -= 1.0f;
+ }
+ break;
+ }
+ glutPostRedisplay();
+}
+
+
+static void Init( void )
+{
+ have_fog_coord = glutExtensionSupported("GL_EXT_fog_coord");
+
+ if (BuildTexture(TEXTURE_FILE, texture) == -1) {
+ exit(1);
+ }
+
+ glEnable(GL_TEXTURE_2D);
+ glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
+ glClearDepth(1.0f);
+ glDepthFunc(GL_LEQUAL);
+ glEnable(GL_DEPTH_TEST);
+ glShadeModel(GL_SMOOTH);
+ glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
+
+ glFogfv(GL_FOG_COLOR, fogColor);
+ glHint(GL_FOG_HINT, GL_NICEST);
+ fogCoord = SetFogCoord(GL_TRUE); /* try to enable fog_coord */
+ fogMode = SetFogMode(2); /* GL_EXP */
+
+ camz = -19.0f;
+
+#if ARRAYS
+ glEnableClientState(GL_VERTEX_ARRAY);
+ glVertexPointer(3, GL_FLOAT, 0, vertex_pointer);
+
+ glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+ glTexCoordPointer(2, GL_FLOAT, 0, texcoord_pointer);
+
+ if (have_fog_coord) {
+ glFogCoordPointer_ext = (GLFOGCOORDPOINTEREXTPROC)glutGetProcAddress("glFogCoordPointerEXT");
+ glEnableClientState(GL_FOG_COORDINATE_ARRAY_EXT);
+ glFogCoordPointer_ext(GL_FLOAT, 0, fogcoord_pointer);
+ }
+#endif
+}
+
+
+int main( int argc, char *argv[] )
+{
+ glutInit( &argc, argv );
+ glutInitWindowPosition( 0, 0 );
+ glutInitWindowSize( 640, 480 );
+ glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH );
+ glutCreateWindow(argv[0]);
+ glutReshapeFunc( Reshape );
+ glutKeyboardFunc( Key );
+ glutSpecialFunc( SpecialKey );
+ glutDisplayFunc( Display );
+ Init();
+ glutMainLoop();
+ return 0;
+}
diff --git a/progs/demos/fplight.c b/progs/demos/fplight.c
new file mode 100644
index 00000000000..c7a38248d38
--- /dev/null
+++ b/progs/demos/fplight.c
@@ -0,0 +1,285 @@
+/*
+ * Use GL_NV_fragment_program to implement per-pixel lighting.
+ *
+ * Brian Paul
+ * 7 April 2003
+ */
+
+#include <assert.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#define GL_GLEXT_PROTOTYPES
+#include <GL/glut.h>
+
+
+static GLfloat Diffuse[4] = { 0.5, 0.5, 1.0, 1.0 };
+static GLfloat Specular[4] = { 0.8, 0.8, 0.8, 1.0 };
+static GLfloat LightPos[4] = { 0.0, 10.0, 20.0, 1.0 };
+static GLfloat Delta = 1.0;
+
+static GLuint FragProg;
+static GLuint VertProg;
+static GLboolean Anim = GL_TRUE;
+static GLboolean Wire = GL_FALSE;
+static GLboolean PixelLight = GL_TRUE;
+
+static GLfloat Xrot = 0, Yrot = 0;
+
+
+#define NAMED_PARAMETER4FV(prog, name, v) \
+ glProgramNamedParameter4fvNV(prog, strlen(name), (const GLubyte *) name, v)
+
+
+static void Display( void )
+{
+ glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+
+ if (PixelLight) {
+#if defined(GL_NV_fragment_program)
+ NAMED_PARAMETER4FV(FragProg, "LightPos", LightPos);
+ glEnable(GL_FRAGMENT_PROGRAM_NV);
+ glEnable(GL_VERTEX_PROGRAM_NV);
+#endif
+ glDisable(GL_LIGHTING);
+ }
+ else {
+ glLightfv(GL_LIGHT0, GL_POSITION, LightPos);
+#if defined(GL_NV_fragment_program)
+ glDisable(GL_FRAGMENT_PROGRAM_NV);
+ glDisable(GL_VERTEX_PROGRAM_NV);
+#endif
+ glEnable(GL_LIGHTING);
+ }
+
+ glPushMatrix();
+ glRotatef(Xrot, 1, 0, 0);
+ glRotatef(Yrot, 0, 1, 0);
+
+#if 1
+ glutSolidSphere(2.0, 10, 5);
+#else
+ {
+ GLUquadricObj *q = gluNewQuadric();
+ gluQuadricNormals(q, GL_SMOOTH);
+ gluQuadricTexture(q, GL_TRUE);
+ glRotatef(90, 1, 0, 0);
+ glTranslatef(0, 0, -1);
+ gluCylinder(q, 1.0, 1.0, 2.0, 24, 1);
+ gluDeleteQuadric(q);
+ }
+#endif
+
+ glPopMatrix();
+
+ glutSwapBuffers();
+}
+
+
+static void Idle(void)
+{
+ LightPos[0] += Delta;
+ if (LightPos[0] > 25.0)
+ Delta = -1.0;
+ else if (LightPos[0] <- 25.0)
+ Delta = 1.0;
+ glutPostRedisplay();
+}
+
+
+static void Reshape( int width, int height )
+{
+ glViewport( 0, 0, width, height );
+ glMatrixMode( GL_PROJECTION );
+ glLoadIdentity();
+ glFrustum( -1.0, 1.0, -1.0, 1.0, 5.0, 25.0 );
+ /*glOrtho( -2.0, 2.0, -2.0, 2.0, 5.0, 25.0 );*/
+ glMatrixMode( GL_MODELVIEW );
+ glLoadIdentity();
+ glTranslatef( 0.0, 0.0, -15.0 );
+}
+
+
+static void Key( unsigned char key, int x, int y )
+{
+ (void) x;
+ (void) y;
+ switch (key) {
+ case ' ':
+ Anim = !Anim;
+ if (Anim)
+ glutIdleFunc(Idle);
+ else
+ glutIdleFunc(NULL);
+ break;
+ case 'x':
+ LightPos[0] -= 1.0;
+ break;
+ case 'X':
+ LightPos[0] += 1.0;
+ break;
+ case 'w':
+ Wire = !Wire;
+ if (Wire)
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ else
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ break;
+ case 'p':
+ PixelLight = !PixelLight;
+ if (PixelLight) {
+ printf("Per-pixel lighting\n");
+ }
+ else {
+ printf("Conventional lighting\n");
+ }
+ break;
+ case 27:
+ exit(0);
+ break;
+ }
+ glutPostRedisplay();
+}
+
+static void SpecialKey( int key, int x, int y )
+{
+ const GLfloat step = 3.0;
+ (void) x;
+ (void) y;
+ switch (key) {
+ case GLUT_KEY_UP:
+ Xrot -= step;
+ break;
+ case GLUT_KEY_DOWN:
+ Xrot += step;
+ break;
+ case GLUT_KEY_LEFT:
+ Yrot -= step;
+ break;
+ case GLUT_KEY_RIGHT:
+ Yrot += step;
+ break;
+ }
+ glutPostRedisplay();
+}
+
+
+static void Init( void )
+{
+ static const char *fragProgramText =
+ "!!FP1.0\n"
+ "DECLARE Diffuse; \n"
+ "DECLARE Specular; \n"
+ "DECLARE LightPos; \n"
+
+ "# Compute normalized LightPos, put it in R0\n"
+ "DP3 R0.x, LightPos, LightPos;\n"
+ "RSQ R0.y, R0.x;\n"
+ "MUL R0, LightPos, R0.y;\n"
+
+ "# Compute normalized normal, put it in R1\n"
+ "DP3 R1, f[TEX0], f[TEX0]; \n"
+ "RSQ R1.y, R1.x;\n"
+ "MUL R1, f[TEX0], R1.y;\n"
+
+ "# Compute dot product of light direction and normal vector\n"
+ "DP3_SAT R2, R0, R1;"
+
+ "MUL R3, Diffuse, R2; # diffuse attenuation\n"
+
+ "POW R4, R2.x, {20.0}.x; # specular exponent\n"
+
+ "MUL R5, Specular, R4; # specular attenuation\n"
+
+ "ADD o[COLR], R3, R5; # add diffuse and specular colors\n"
+ "END \n"
+ ;
+
+ static const char *vertProgramText =
+ "!!VP1.0\n"
+ "# typical modelview/projection transform\n"
+ "DP4 o[HPOS].x, c[0], v[OPOS] ;\n"
+ "DP4 o[HPOS].y, c[1], v[OPOS] ;\n"
+ "DP4 o[HPOS].z, c[2], v[OPOS] ;\n"
+ "DP4 o[HPOS].w, c[3], v[OPOS] ;\n"
+ "# transform normal by inv transpose of modelview, put in tex0\n"
+ "DP3 o[TEX0].x, c[4], v[NRML] ;\n"
+ "DP3 o[TEX0].y, c[5], v[NRML] ;\n"
+ "DP3 o[TEX0].z, c[6], v[NRML] ;\n"
+ "DP3 o[TEX0].w, c[7], v[NRML] ;\n"
+ "END\n";
+ ;
+
+ if (!glutExtensionSupported("GL_NV_vertex_program")) {
+ printf("Sorry, this demo requires GL_NV_vertex_program\n");
+ exit(1);
+ }
+ if (!glutExtensionSupported("GL_NV_fragment_program")) {
+ printf("Sorry, this demo requires GL_NV_fragment_program\n");
+ exit(1);
+ }
+
+#if defined(GL_NV_fragment_program)
+ glGenProgramsNV(1, &FragProg);
+ assert(FragProg > 0);
+ glGenProgramsNV(1, &VertProg);
+ assert(VertProg > 0);
+
+ /*
+ * Fragment program
+ */
+ glLoadProgramNV(GL_FRAGMENT_PROGRAM_NV, FragProg,
+ strlen(fragProgramText),
+ (const GLubyte *) fragProgramText);
+ assert(glIsProgramNV(FragProg));
+ glBindProgramNV(GL_FRAGMENT_PROGRAM_NV, FragProg);
+
+ NAMED_PARAMETER4FV(FragProg, "Diffuse", Diffuse);
+ NAMED_PARAMETER4FV(FragProg, "Specular", Specular);
+
+ /*
+ * Vertex program
+ */
+ glLoadProgramNV(GL_VERTEX_PROGRAM_NV, VertProg,
+ strlen(vertProgramText),
+ (const GLubyte *) vertProgramText);
+ assert(glIsProgramNV(VertProg));
+ glBindProgramNV(GL_VERTEX_PROGRAM_NV, VertProg);
+ glTrackMatrixNV(GL_VERTEX_PROGRAM_NV, 0, GL_MODELVIEW_PROJECTION_NV, GL_IDENTITY_NV);
+ glTrackMatrixNV(GL_VERTEX_PROGRAM_NV, 4, GL_MODELVIEW, GL_INVERSE_TRANSPOSE_NV);
+#endif
+
+ /*
+ * Misc init
+ */
+ glClearColor(0.3, 0.3, 0.3, 0.0);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_LIGHTING);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, Diffuse);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, Specular);
+ glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 20.0);
+
+ printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER));
+ printf("Press p to toggle between per-pixel and per-vertex lighting\n");
+}
+
+
+int main( int argc, char *argv[] )
+{
+ glutInit( &argc, argv );
+ glutInitWindowPosition( 0, 0 );
+ glutInitWindowSize( 200, 200 );
+ glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH );
+ glutCreateWindow(argv[0]);
+ glutReshapeFunc( Reshape );
+ glutKeyboardFunc( Key );
+ glutSpecialFunc( SpecialKey );
+ glutDisplayFunc( Display );
+ if (Anim)
+ glutIdleFunc(Idle);
+ Init();
+ glutMainLoop();
+ return 0;
+}
diff --git a/progs/demos/gamma.c b/progs/demos/gamma.c
new file mode 100644
index 00000000000..9b2c3e1052b
--- /dev/null
+++ b/progs/demos/gamma.c
@@ -0,0 +1,162 @@
+
+/* Draw test patterns to help determine correct gamma value for a display.
+ When the intensities of the inner squares nearly match the intensities
+ of their frames (from some distance the borders should disappear) then
+ you've found the right gamma value.
+
+ You can set Mesa's gamma values (for red, green and blue) with the
+ MESA_GAMMA environment variable. But only on X windows!
+ For example:
+ setenv MESA_GAMMA 1.5 1.6 1.4
+ Sets the red gamma value to 1.5, green to 1.6 and blue to 1.4.
+ See the main README file for more information.
+
+ For more info about gamma correction see:
+ http://www.inforamp.net/~poynton/notes/colour_and_gamma/GammaFAQ.html
+
+ This program is in the public domain
+
+ Brian Paul 19 Oct 1995
+ Kai Schuetz 05 Jun 1999 */
+
+/* Conversion to GLUT by Mark J. Kilgard */
+
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <GL/glut.h>
+
+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, -1.0, 1.0);
+ glMatrixMode(GL_MODELVIEW);
+ glShadeModel(GL_FLAT);
+}
+
+/* ARGSUSED1 */
+static void
+key_esc(unsigned char key, int x, int y)
+{
+ if(key == 27) exit(0); /* Exit on Escape */
+}
+
+static GLubyte p25[] = {
+ 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00,
+ 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00,
+ 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00,
+ 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00,
+ 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00,
+ 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00,
+ 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00,
+ 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00,
+ 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00,
+ 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00,
+ 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00,
+ 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00,
+ 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00,
+ 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00,
+ 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00,
+ 0xaa, 0xaa, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00,
+};
+
+static GLubyte p50[] = {
+ 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,
+};
+
+static GLubyte p75[] = {
+ 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xff,
+ 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xff,
+ 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xff,
+ 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xff,
+ 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xff,
+ 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xff,
+ 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xff,
+ 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xff,
+ 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xff,
+ 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xff,
+ 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xff,
+ 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xff,
+ 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xff,
+ 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xff,
+ 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xff,
+ 0xaa, 0xaa, 0xaa, 0xaa, 0xff, 0xff, 0xff, 0xff,
+};
+
+static GLubyte *stippletab[4] = {NULL, p25, p50, p75};
+
+static void
+gamma_ramp(GLfloat yoffs, GLfloat r, GLfloat g, GLfloat b)
+{
+ GLint d;
+
+ glColor3f(0.0, 0.0, 0.0); /* solid black, no stipple */
+ glRectf(-1.0, yoffs, -0.6, yoffs + 0.5);
+
+ for(d = 1; d < 4; d++) { /* increasing density from 25% to 75% */
+ GLfloat xcoord = (-1.0 + d*0.4);
+ GLfloat t = d * 0.25;
+
+ glColor3f(r*t, g*t, b*t); /* draw outer rect */
+ glRectf(xcoord, yoffs, xcoord+0.4, yoffs + 0.5);
+
+ glColor3f(0.0, 0.0, 0.0); /* "clear" inner rect */
+ glRectf(xcoord + 0.1, yoffs + 0.125, xcoord + 0.3, yoffs + 0.375);
+
+ glColor3f(r, g, b); /* draw stippled inner rect */
+ glEnable(GL_POLYGON_STIPPLE);
+ glPolygonStipple(stippletab[d]);
+ glRectf(xcoord + 0.1, yoffs + 0.125, xcoord + 0.3, yoffs + 0.375);
+ glDisable(GL_POLYGON_STIPPLE);
+ }
+ glColor3f(r, g, b); /* solid color, no stipple */
+ glRectf(0.6, yoffs, 1.0, yoffs + 0.5);
+}
+
+static void
+display(void)
+{
+ gamma_ramp( 0.5, 1.0, 1.0, 1.0); /* white ramp */
+ gamma_ramp( 0.0, 1.0, 0.0, 0.0); /* red ramp */
+ gamma_ramp(-0.5, 0.0, 1.0, 0.0); /* green ramp */
+ gamma_ramp(-1.0, 0.0, 0.0, 1.0); /* blue ramp */
+ glFlush();
+}
+
+int
+main(int argc, char **argv)
+{
+ glutInit(&argc, argv);
+ glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
+
+ glutInitWindowPosition(50, 50);
+ glutInitWindowSize(500, 400);
+
+ glutCreateWindow("gamma test patterns");
+ glutReshapeFunc(Reshape);
+ glutDisplayFunc(display);
+ glutKeyboardFunc(key_esc);
+
+ glutMainLoop();
+ return 0; /* ANSI C requires main to return int. */
+}
diff --git a/progs/demos/gearbox.c b/progs/demos/gearbox.c
new file mode 100644
index 00000000000..3a1662cd625
--- /dev/null
+++ b/progs/demos/gearbox.c
@@ -0,0 +1,485 @@
+/*
+ * Use glCopyTexSubImage2D to draw animated gears on the sides of a box.
+ *
+ * Brian Paul
+ * 27 January 2006
+ */
+
+#include <math.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <GL/glut.h>
+
+#ifndef M_PI
+#define M_PI 3.14159265
+#endif
+
+static GLint WinWidth = 800, WinHeight = 500;
+static GLint TexWidth, TexHeight;
+static GLuint TexObj = 1;
+static GLenum IntFormat = GL_RGB;
+
+static GLboolean WireFrame = GL_FALSE;
+
+static GLint T0 = 0;
+static GLint Frames = 0;
+static GLint Win = 0;
+
+static GLfloat ViewRotX = 20.0, ViewRotY = 30.0, ViewRotZ = 0.0;
+static GLint Gear1, Gear2, Gear3;
+static GLfloat GearRot = 0.0;
+static GLfloat CubeRot = 0.0;
+
+
+/**
+ Draw a gear wheel. You'll probably want to call this function when
+ building a display list since we do a lot of trig here.
+
+ Input: inner_radius - radius of hole at center
+ outer_radius - radius at center of teeth
+ width - width of gear
+ teeth - number of teeth
+ tooth_depth - depth of tooth
+ **/
+static void
+gear(GLfloat inner_radius, GLfloat outer_radius, GLfloat width,
+ GLint teeth, GLfloat tooth_depth)
+{
+ GLint i;
+ GLfloat r0, r1, r2;
+ GLfloat angle, da;
+ GLfloat u, v, len;
+
+ r0 = inner_radius;
+ r1 = outer_radius - tooth_depth / 2.0;
+ r2 = outer_radius + tooth_depth / 2.0;
+
+ da = 2.0 * M_PI / teeth / 4.0;
+
+ glShadeModel(GL_FLAT);
+
+ glNormal3f(0.0, 0.0, 1.0);
+
+ /* draw front face */
+ glBegin(GL_QUAD_STRIP);
+ for (i = 0; i <= teeth; i++) {
+ angle = i * 2.0 * M_PI / teeth;
+ glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);
+ glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);
+ if (i < teeth) {
+ glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);
+ glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5);
+ }
+ }
+ glEnd();
+
+ /* draw front sides of teeth */
+ glBegin(GL_QUADS);
+ da = 2.0 * M_PI / teeth / 4.0;
+ for (i = 0; i < teeth; i++) {
+ angle = i * 2.0 * M_PI / teeth;
+
+ glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);
+ glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5);
+ glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), width * 0.5);
+ glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5);
+ }
+ glEnd();
+
+ glNormal3f(0.0, 0.0, -1.0);
+
+ /* draw back face */
+ glBegin(GL_QUAD_STRIP);
+ for (i = 0; i <= teeth; i++) {
+ angle = i * 2.0 * M_PI / teeth;
+ glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);
+ glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);
+ if (i < teeth) {
+ glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5);
+ glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);
+ }
+ }
+ glEnd();
+
+ /* draw back sides of teeth */
+ glBegin(GL_QUADS);
+ da = 2.0 * M_PI / teeth / 4.0;
+ for (i = 0; i < teeth; i++) {
+ angle = i * 2.0 * M_PI / teeth;
+
+ glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5);
+ glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), -width * 0.5);
+ glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5);
+ glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);
+ }
+ glEnd();
+
+ /* draw outward faces of teeth */
+ glBegin(GL_QUAD_STRIP);
+ for (i = 0; i < teeth; i++) {
+ angle = i * 2.0 * M_PI / teeth;
+
+ glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);
+ glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);
+ u = r2 * cos(angle + da) - r1 * cos(angle);
+ v = r2 * sin(angle + da) - r1 * sin(angle);
+ len = sqrt(u * u + v * v);
+ u /= len;
+ v /= len;
+ glNormal3f(v, -u, 0.0);
+ glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5);
+ glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5);
+ glNormal3f(cos(angle), sin(angle), 0.0);
+ glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), width * 0.5);
+ glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), -width * 0.5);
+ u = r1 * cos(angle + 3 * da) - r2 * cos(angle + 2 * da);
+ v = r1 * sin(angle + 3 * da) - r2 * sin(angle + 2 * da);
+ glNormal3f(v, -u, 0.0);
+ glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5);
+ glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5);
+ glNormal3f(cos(angle), sin(angle), 0.0);
+ }
+
+ glVertex3f(r1 * cos(0), r1 * sin(0), width * 0.5);
+ glVertex3f(r1 * cos(0), r1 * sin(0), -width * 0.5);
+
+ glEnd();
+
+ glShadeModel(GL_SMOOTH);
+
+ /* draw inside radius cylinder */
+ glBegin(GL_QUAD_STRIP);
+ for (i = 0; i <= teeth; i++) {
+ angle = i * 2.0 * M_PI / teeth;
+ glNormal3f(-cos(angle), -sin(angle), 0.0);
+ glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);
+ glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);
+ }
+ glEnd();
+
+}
+
+static void
+cleanup(void)
+{
+ glDeleteTextures(1, &TexObj);
+ glDeleteLists(Gear1, 1);
+ glDeleteLists(Gear2, 1);
+ glDeleteLists(Gear3, 1);
+ glutDestroyWindow(Win);
+}
+
+
+static void
+DrawGears(void)
+{
+ if (WireFrame) {
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ }
+
+ glPushMatrix();
+ glRotatef(20/*ViewRotX*/, 1.0, 0.0, 0.0);
+ glRotatef(ViewRotY, 0.0, 1.0, 0.0);
+ glRotatef(ViewRotZ, 0.0, 0.0, 1.0);
+
+ glPushMatrix();
+ glTranslatef(-3.0, -2.0, 0.0);
+ glRotatef(GearRot, 0.0, 0.0, 1.0);
+ glCallList(Gear1);
+ glPopMatrix();
+
+ glPushMatrix();
+ glTranslatef(3.1, -2.0, 0.0);
+ glRotatef(-2.0 * GearRot - 9.0, 0.0, 0.0, 1.0);
+ glCallList(Gear2);
+ glPopMatrix();
+
+ glPushMatrix();
+ glTranslatef(-3.1, 4.2, 0.0);
+ glRotatef(-2.0 * GearRot - 25.0, 0.0, 0.0, 1.0);
+ glCallList(Gear3);
+ glPopMatrix();
+
+ glPopMatrix();
+
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+}
+
+
+static void
+DrawCube(void)
+{
+ static const GLfloat texcoords[4][2] = {
+ { 0, 0 }, { 1, 0 }, { 1, 1 }, { 0, 1 }
+ };
+ static const GLfloat vertices[4][2] = {
+ { -1, -1 }, { 1, -1 }, { 1, 1 }, { -1, 1 }
+ };
+ static const GLfloat xforms[6][4] = {
+ { 0, 0, 1, 0 },
+ { 90, 0, 1, 0 },
+ { 180, 0, 1, 0 },
+ { 270, 0, 1, 0 },
+ { 90, 1, 0, 0 },
+ { -90, 1, 0, 0 }
+ };
+ static const GLfloat mat[4] = { 1.0, 1.0, 0.5, 1.0 };
+ GLint i, j;
+
+ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat);
+ glEnable(GL_TEXTURE_2D);
+
+ glPushMatrix();
+ glRotatef(ViewRotX, 1.0, 0.0, 0.0);
+ glRotatef(15, 1, 0, 0);
+ glRotatef(CubeRot, 0, 1, 0);
+ glScalef(4, 4, 4);
+
+ for (i = 0; i < 6; i++) {
+ glPushMatrix();
+ glRotatef(xforms[i][0], xforms[i][1], xforms[i][2], xforms[i][3]);
+ glTranslatef(0, 0, 1.1);
+ glBegin(GL_POLYGON);
+ glNormal3f(0, 0, 1);
+ for (j = 0; j < 4; j++) {
+ glTexCoord2fv(texcoords[j]);
+ glVertex2fv(vertices[j]);
+ }
+ glEnd();
+ glPopMatrix();
+ }
+ glPopMatrix();
+
+ glDisable(GL_TEXTURE_2D);
+}
+
+
+static void
+draw(void)
+{
+ float ar;
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glTranslatef(0.0, 0.0, -40.0);
+
+ glDisable(GL_SCISSOR_TEST);
+ glClear(GL_DEPTH_BUFFER_BIT);
+ glEnable(GL_SCISSOR_TEST);
+
+ /* draw gears */
+ glViewport(0, 0, TexWidth, TexHeight);
+ glScissor(0, 0, TexWidth, TexHeight);
+ glClearColor(0.5, 0.5, 0.8, 0.0);
+ glClearColor(1, 1, 1, 0);
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 60.0);
+ glMatrixMode(GL_MODELVIEW);
+
+ DrawGears();
+
+ glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, TexWidth, TexHeight);
+
+ /* draw textured cube */
+ glViewport(TexWidth, 0, WinWidth - TexWidth, WinHeight);
+ glScissor(TexWidth, 0, WinWidth - TexWidth, WinHeight);
+ glClearColor(0.5, 0.5, 0.8, 0.0);
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ ar = (float) (WinWidth - TexWidth) / WinHeight;
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glFrustum(-ar, ar, -1.0, 1.0, 5.0, 60.0);
+ glMatrixMode(GL_MODELVIEW);
+
+ DrawCube();
+
+ /* finish up */
+ glutSwapBuffers();
+
+ Frames++;
+ {
+ GLint t = glutGet(GLUT_ELAPSED_TIME);
+ if (t - T0 >= 5000) {
+ GLfloat seconds = (t - T0) / 1000.0;
+ GLfloat fps = Frames / seconds;
+ printf("%d frames in %6.3f seconds = %6.3f FPS\n", Frames, seconds, fps);
+ T0 = t;
+ Frames = 0;
+ }
+ }
+}
+
+
+static void
+idle(void)
+{
+ static double t0 = -1.;
+ double dt, t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
+ if (t0 < 0.0)
+ t0 = t;
+ dt = t - t0;
+ t0 = t;
+
+ /* fmod to prevent overflow */
+ GearRot = fmod(GearRot + 70.0 * dt, 360.0); /* 70 deg/sec */
+ CubeRot = fmod(CubeRot + 15.0 * dt, 360.0); /* 15 deg/sec */
+
+ glutPostRedisplay();
+}
+
+
+/* change view angle, exit upon ESC */
+static void
+key(unsigned char k, int x, int y)
+{
+ (void) x;
+ (void) y;
+ switch (k) {
+ case 'w':
+ WireFrame = !WireFrame;
+ break;
+ case 'z':
+ ViewRotZ += 5.0;
+ break;
+ case 'Z':
+ ViewRotZ -= 5.0;
+ break;
+ case 27: /* Escape */
+ cleanup();
+ exit(0);
+ break;
+ default:
+ return;
+ }
+ glutPostRedisplay();
+}
+
+/* change view angle */
+static void
+special(int k, int x, int y)
+{
+ (void) x;
+ (void) y;
+ switch (k) {
+ case GLUT_KEY_UP:
+ ViewRotX += 5.0;
+ break;
+ case GLUT_KEY_DOWN:
+ ViewRotX -= 5.0;
+ break;
+ case GLUT_KEY_LEFT:
+ ViewRotY += 5.0;
+ break;
+ case GLUT_KEY_RIGHT:
+ ViewRotY -= 5.0;
+ break;
+ default:
+ return;
+ }
+ glutPostRedisplay();
+}
+
+
+/* new window size or exposure */
+static void
+reshape(int width, int height)
+{
+ WinWidth = width;
+ WinHeight = height;
+}
+
+
+static void
+init(int argc, char *argv[])
+{
+ static GLfloat pos[4] = {5.0, 5.0, 10.0, 0.0};
+ static GLfloat red[4] = {0.8, 0.1, 0.0, 1.0};
+ static GLfloat green[4] = {0.0, 0.8, 0.2, 1.0};
+ static GLfloat blue[4] = {0.2, 0.2, 1.0, 1.0};
+ GLint i;
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+#if 0
+ glEnable(GL_CULL_FACE);
+#endif
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_DEPTH_TEST);
+
+ /* make the gears */
+ Gear1 = glGenLists(1);
+ glNewList(Gear1, GL_COMPILE);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red);
+ gear(1.0, 4.0, 1.0, 20, 0.7);
+ glEndList();
+
+ Gear2 = glGenLists(1);
+ glNewList(Gear2, GL_COMPILE);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green);
+ gear(0.5, 2.0, 2.0, 10, 0.7);
+ glEndList();
+
+ Gear3 = glGenLists(1);
+ glNewList(Gear3, GL_COMPILE);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue);
+ gear(1.3, 2.0, 0.5, 10, 0.7);
+ glEndList();
+
+ glEnable(GL_NORMALIZE);
+
+ /* xxx make size dynamic */
+ TexWidth = 256;
+ TexHeight = 256;
+
+ glBindTexture(GL_TEXTURE_2D, TexObj);
+ glTexImage2D(GL_TEXTURE_2D, 0, IntFormat, TexWidth, TexHeight, 0,
+ GL_RGBA, GL_UNSIGNED_BYTE, NULL);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+
+ for ( i=1; i<argc; i++ ) {
+ if (strcmp(argv[i], "-info")==0) {
+ printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER));
+ printf("GL_VERSION = %s\n", (char *) glGetString(GL_VERSION));
+ printf("GL_VENDOR = %s\n", (char *) glGetString(GL_VENDOR));
+ printf("GL_EXTENSIONS = %s\n", (char *) glGetString(GL_EXTENSIONS));
+ }
+ }
+}
+
+
+static void
+visible(int vis)
+{
+ if (vis == GLUT_VISIBLE)
+ glutIdleFunc(idle);
+ else
+ glutIdleFunc(NULL);
+}
+
+
+int
+main(int argc, char *argv[])
+{
+ glutInit(&argc, argv);
+ glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
+
+ glutInitWindowSize(WinWidth, WinHeight);
+ Win = glutCreateWindow("gearbox");
+ init(argc, argv);
+
+ glutDisplayFunc(draw);
+ glutReshapeFunc(reshape);
+ glutKeyboardFunc(key);
+ glutSpecialFunc(special);
+ glutVisibilityFunc(visible);
+
+ glutMainLoop();
+ return 0; /* ANSI C requires main to return int. */
+}
diff --git a/progs/demos/gears.c b/progs/demos/gears.c
new file mode 100644
index 00000000000..ab9bc007421
--- /dev/null
+++ b/progs/demos/gears.c
@@ -0,0 +1,381 @@
+/*
+ * 3-D gear wheels. This program is in the public domain.
+ *
+ * Command line options:
+ * -info print GL implementation information
+ * -exit automatically exit after 30 seconds
+ *
+ *
+ * Brian Paul
+ */
+
+/* Conversion to GLUT by Mark J. Kilgard */
+
+
+
+#include <math.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <GL/glut.h>
+
+#ifndef M_PI
+#define M_PI 3.14159265
+#endif
+
+static GLint T0 = 0;
+static GLint Frames = 0;
+static GLint autoexit = 0;
+static GLint win = 0;
+
+
+/**
+
+ Draw a gear wheel. You'll probably want to call this function when
+ building a display list since we do a lot of trig here.
+
+ Input: inner_radius - radius of hole at center
+ outer_radius - radius at center of teeth
+ width - width of gear
+ teeth - number of teeth
+ tooth_depth - depth of tooth
+
+ **/
+
+static void
+gear(GLfloat inner_radius, GLfloat outer_radius, GLfloat width,
+ GLint teeth, GLfloat tooth_depth)
+{
+ GLint i;
+ GLfloat r0, r1, r2;
+ GLfloat angle, da;
+ GLfloat u, v, len;
+
+ r0 = inner_radius;
+ r1 = outer_radius - tooth_depth / 2.0;
+ r2 = outer_radius + tooth_depth / 2.0;
+
+ da = 2.0 * M_PI / teeth / 4.0;
+
+ glShadeModel(GL_FLAT);
+
+ glNormal3f(0.0, 0.0, 1.0);
+
+ /* draw front face */
+ glBegin(GL_QUAD_STRIP);
+ for (i = 0; i <= teeth; i++) {
+ angle = i * 2.0 * M_PI / teeth;
+ glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);
+ glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);
+ if (i < teeth) {
+ glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);
+ glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5);
+ }
+ }
+ glEnd();
+
+ /* draw front sides of teeth */
+ glBegin(GL_QUADS);
+ da = 2.0 * M_PI / teeth / 4.0;
+ for (i = 0; i < teeth; i++) {
+ angle = i * 2.0 * M_PI / teeth;
+
+ glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);
+ glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5);
+ glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), width * 0.5);
+ glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5);
+ }
+ glEnd();
+
+ glNormal3f(0.0, 0.0, -1.0);
+
+ /* draw back face */
+ glBegin(GL_QUAD_STRIP);
+ for (i = 0; i <= teeth; i++) {
+ angle = i * 2.0 * M_PI / teeth;
+ glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);
+ glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);
+ if (i < teeth) {
+ glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5);
+ glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);
+ }
+ }
+ glEnd();
+
+ /* draw back sides of teeth */
+ glBegin(GL_QUADS);
+ da = 2.0 * M_PI / teeth / 4.0;
+ for (i = 0; i < teeth; i++) {
+ angle = i * 2.0 * M_PI / teeth;
+
+ glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5);
+ glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), -width * 0.5);
+ glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5);
+ glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);
+ }
+ glEnd();
+
+ /* draw outward faces of teeth */
+ glBegin(GL_QUAD_STRIP);
+ for (i = 0; i < teeth; i++) {
+ angle = i * 2.0 * M_PI / teeth;
+
+ glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);
+ glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);
+ u = r2 * cos(angle + da) - r1 * cos(angle);
+ v = r2 * sin(angle + da) - r1 * sin(angle);
+ len = sqrt(u * u + v * v);
+ u /= len;
+ v /= len;
+ glNormal3f(v, -u, 0.0);
+ glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5);
+ glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5);
+ glNormal3f(cos(angle), sin(angle), 0.0);
+ glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), width * 0.5);
+ glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), -width * 0.5);
+ u = r1 * cos(angle + 3 * da) - r2 * cos(angle + 2 * da);
+ v = r1 * sin(angle + 3 * da) - r2 * sin(angle + 2 * da);
+ glNormal3f(v, -u, 0.0);
+ glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5);
+ glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5);
+ glNormal3f(cos(angle), sin(angle), 0.0);
+ }
+
+ glVertex3f(r1 * cos(0), r1 * sin(0), width * 0.5);
+ glVertex3f(r1 * cos(0), r1 * sin(0), -width * 0.5);
+
+ glEnd();
+
+ glShadeModel(GL_SMOOTH);
+
+ /* draw inside radius cylinder */
+ glBegin(GL_QUAD_STRIP);
+ for (i = 0; i <= teeth; i++) {
+ angle = i * 2.0 * M_PI / teeth;
+ glNormal3f(-cos(angle), -sin(angle), 0.0);
+ glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);
+ glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);
+ }
+ glEnd();
+
+}
+
+static GLfloat view_rotx = 20.0, view_roty = 30.0, view_rotz = 0.0;
+static GLint gear1, gear2, gear3;
+static GLfloat angle = 0.0;
+
+static void
+cleanup(void)
+{
+ glDeleteLists(gear1, 1);
+ glDeleteLists(gear2, 1);
+ glDeleteLists(gear3, 1);
+ glutDestroyWindow(win);
+}
+
+static void
+draw(void)
+{
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix();
+ glRotatef(view_rotx, 1.0, 0.0, 0.0);
+ glRotatef(view_roty, 0.0, 1.0, 0.0);
+ glRotatef(view_rotz, 0.0, 0.0, 1.0);
+
+ glPushMatrix();
+ glTranslatef(-3.0, -2.0, 0.0);
+ glRotatef(angle, 0.0, 0.0, 1.0);
+ glCallList(gear1);
+ glPopMatrix();
+
+ glPushMatrix();
+ glTranslatef(3.1, -2.0, 0.0);
+ glRotatef(-2.0 * angle - 9.0, 0.0, 0.0, 1.0);
+ glCallList(gear2);
+ glPopMatrix();
+
+ glPushMatrix();
+ glTranslatef(-3.1, 4.2, 0.0);
+ glRotatef(-2.0 * angle - 25.0, 0.0, 0.0, 1.0);
+ glCallList(gear3);
+ glPopMatrix();
+
+ glPopMatrix();
+
+ glutSwapBuffers();
+
+ Frames++;
+
+ {
+ GLint t = glutGet(GLUT_ELAPSED_TIME);
+ if (t - T0 >= 5000) {
+ GLfloat seconds = (t - T0) / 1000.0;
+ GLfloat fps = Frames / seconds;
+ printf("%d frames in %6.3f seconds = %6.3f FPS\n", Frames, seconds, fps);
+ T0 = t;
+ Frames = 0;
+ if ((t >= 999.0 * autoexit) && (autoexit)) {
+ cleanup();
+ exit(0);
+ }
+ }
+ }
+}
+
+
+static void
+idle(void)
+{
+ static double t0 = -1.;
+ double dt, t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
+ if (t0 < 0.0)
+ t0 = t;
+ dt = t - t0;
+ t0 = t;
+
+ angle += 70.0 * dt; /* 70 degrees per second */
+ angle = fmod(angle, 360.0); /* prevents eventual overflow */
+
+ glutPostRedisplay();
+}
+
+/* change view angle, exit upon ESC */
+/* ARGSUSED1 */
+static void
+key(unsigned char k, int x, int y)
+{
+ switch (k) {
+ case 'z':
+ view_rotz += 5.0;
+ break;
+ case 'Z':
+ view_rotz -= 5.0;
+ break;
+ case 27: /* Escape */
+ cleanup();
+ exit(0);
+ break;
+ default:
+ return;
+ }
+ glutPostRedisplay();
+}
+
+/* change view angle */
+/* ARGSUSED1 */
+static void
+special(int k, int x, int y)
+{
+ switch (k) {
+ case GLUT_KEY_UP:
+ view_rotx += 5.0;
+ break;
+ case GLUT_KEY_DOWN:
+ view_rotx -= 5.0;
+ break;
+ case GLUT_KEY_LEFT:
+ view_roty += 5.0;
+ break;
+ case GLUT_KEY_RIGHT:
+ view_roty -= 5.0;
+ break;
+ default:
+ return;
+ }
+ glutPostRedisplay();
+}
+
+/* new window size or exposure */
+static void
+reshape(int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+
+ glViewport(0, 0, (GLint) width, (GLint) height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glFrustum(-1.0, 1.0, -h, h, 5.0, 60.0);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glTranslatef(0.0, 0.0, -40.0);
+}
+
+static void
+init(int argc, char *argv[])
+{
+ static GLfloat pos[4] = {5.0, 5.0, 10.0, 0.0};
+ static GLfloat red[4] = {0.8, 0.1, 0.0, 1.0};
+ static GLfloat green[4] = {0.0, 0.8, 0.2, 1.0};
+ static GLfloat blue[4] = {0.2, 0.2, 1.0, 1.0};
+ GLint i;
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glEnable(GL_CULL_FACE);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_DEPTH_TEST);
+
+ /* make the gears */
+ gear1 = glGenLists(1);
+ glNewList(gear1, GL_COMPILE);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red);
+ gear(1.0, 4.0, 1.0, 20, 0.7);
+ glEndList();
+
+ gear2 = glGenLists(1);
+ glNewList(gear2, GL_COMPILE);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green);
+ gear(0.5, 2.0, 2.0, 10, 0.7);
+ glEndList();
+
+ gear3 = glGenLists(1);
+ glNewList(gear3, GL_COMPILE);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue);
+ gear(1.3, 2.0, 0.5, 10, 0.7);
+ glEndList();
+
+ glEnable(GL_NORMALIZE);
+
+ for ( i=1; i<argc; i++ ) {
+ if (strcmp(argv[i], "-info")==0) {
+ printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER));
+ printf("GL_VERSION = %s\n", (char *) glGetString(GL_VERSION));
+ printf("GL_VENDOR = %s\n", (char *) glGetString(GL_VENDOR));
+ printf("GL_EXTENSIONS = %s\n", (char *) glGetString(GL_EXTENSIONS));
+ }
+ else if ( strcmp(argv[i], "-exit")==0) {
+ autoexit = 30;
+ printf("Auto Exit after %i seconds.\n", autoexit );
+ }
+ }
+}
+
+static void
+visible(int vis)
+{
+ if (vis == GLUT_VISIBLE)
+ glutIdleFunc(idle);
+ else
+ glutIdleFunc(NULL);
+}
+
+int main(int argc, char *argv[])
+{
+ glutInit(&argc, argv);
+ glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
+
+ glutInitWindowPosition(0, 0);
+ glutInitWindowSize(300, 300);
+ win = glutCreateWindow("Gears");
+ init(argc, argv);
+
+ glutDisplayFunc(draw);
+ glutReshapeFunc(reshape);
+ glutKeyboardFunc(key);
+ glutSpecialFunc(special);
+ glutVisibilityFunc(visible);
+
+ glutMainLoop();
+ return 0; /* ANSI C requires main to return int. */
+}
diff --git a/progs/demos/geartrain.c b/progs/demos/geartrain.c
new file mode 100644
index 00000000000..3feb2a0524b
--- /dev/null
+++ b/progs/demos/geartrain.c
@@ -0,0 +1,1073 @@
+
+/*
+ * GearTrain Simulator * Version: 1.00
+ *
+ * Copyright (C) 1999 Shobhan Kumar Dutta 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
+ * SHOBHAN KUMAR DUTTA 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.
+ */
+
+
+#include <math.h>
+#include <stdlib.h>
+#include <GL/glut.h>
+#include <string.h>
+#include <stdio.h>
+
+#ifndef min
+#define min(x, y) ( x < y ? x : y )
+#endif
+
+#ifndef M_PI
+#define M_PI 3.14159265
+#endif /* */
+typedef GLfloat TDA[4];
+
+TDA background;
+
+
+struct AXLE
+ {
+ char name[20];
+ GLint id;
+ GLfloat radius;
+ GLint axis;
+ TDA color;
+ TDA position;
+ GLfloat length;
+ GLint motored;
+ GLfloat angular_velocity;
+ GLint direction;
+ };
+
+
+struct GEAR
+ {
+ char name[20];
+ char type[7];
+ GLint face;
+ GLint id;
+ GLfloat radius;
+ GLfloat width;
+ GLint teeth;
+ GLfloat tooth_depth;
+ GLfloat angle;
+ GLfloat angular_velocity;
+ TDA color;
+ GLint relative_position;
+ TDA position;
+ char axle_name[20];
+ GLint axis;
+ GLint direction;
+ GLint motored;
+ };
+
+
+struct BELT
+ {
+ char name[20];
+ GLint id;
+ char gear1_name[20];
+ char gear2_name[20];
+ };
+
+
+FILE * mainfile;
+struct GEAR g[10];
+struct AXLE a[10];
+struct BELT b[10];
+int number_of_gears;
+int number_of_axles;
+int number_of_belts;
+
+
+char Buf1[256], Buf2[256], Buf3[256], Buf4[256], Buf5[256];
+
+static GLint T0 = 0;
+static GLint Frames = 0;
+
+
+#ifndef _WIN32
+static void
+strset (char buf[], char ch)
+{
+ int i;
+ for (i = 0; i < strlen (buf); i++)
+ buf[i] = ch;
+}
+#endif
+
+
+static void
+Clear_Buffers ()
+{
+ strset (Buf1, 0);
+ strset (Buf2, 0);
+ strset (Buf3, 0);
+ strset (Buf4, 0);
+ strset (Buf5, 0);
+}
+
+
+static void
+LoadTriplet (TDA A)
+{
+ Clear_Buffers ();
+ fscanf (mainfile, "%s %s %s %s", Buf1, Buf2, Buf3, Buf4);
+ A[0] = atof (Buf2);
+ A[1] = atof (Buf3);
+ A[2] = atof (Buf4);
+}
+
+
+static void
+LoadReal (float *a)
+{
+ Clear_Buffers ();
+ fscanf (mainfile, "%s %s", Buf1, Buf2);
+ *a = atof (Buf2);
+}
+
+
+static void
+LoadInteger (int *a)
+{
+ Clear_Buffers ();
+ fscanf (mainfile, "%s %s", Buf1, Buf2);
+ *a = atoi (Buf2);
+}
+
+
+static void
+LoadText (char *a)
+{
+ Clear_Buffers ();
+ fscanf (mainfile, "%s %s", Buf1, Buf2);
+ strcpy (a, Buf2);
+}
+
+
+static void
+getdata (char filename[])
+{
+ int gear_count = 0, axle_count = 0, belt_count = 0, i;
+
+ mainfile = fopen (filename, "r");
+ if (!mainfile) {
+ printf("Error: couldn't open %s\n", filename);
+ exit(-1);
+ }
+
+ do
+ {
+ Clear_Buffers ();
+ fscanf (mainfile, "%s", Buf1);
+ if (ferror (mainfile))
+ {
+ printf ("\nError opening file !\n");
+ exit (1);
+ }
+
+ if (!(strcmp (Buf1, "BACKGROUND")))
+ LoadTriplet (background);
+
+ if (!(strcmp (Buf1, "ANAME")))
+ {
+ LoadText (a[axle_count].name);
+ axle_count++;
+ }
+
+ if (!(strcmp (Buf1, "ARADIUS")))
+ LoadReal (&a[axle_count - 1].radius);
+
+ if (!(strcmp (Buf1, "AAXIS")))
+ LoadInteger (&a[axle_count - 1].axis);
+
+ if (!(strcmp (Buf1, "ACOLOR")))
+ LoadTriplet (a[axle_count - 1].color);
+
+ if (!(strcmp (Buf1, "APOSITION")))
+ LoadTriplet (a[axle_count - 1].position);
+
+ if (!(strcmp (Buf1, "ALENGTH")))
+ LoadReal (&a[axle_count - 1].length);
+
+ if (!(strcmp (Buf1, "AMOTORED")))
+ LoadInteger (&a[axle_count - 1].motored);
+
+ if (!(strcmp (Buf1, "AANGULARVELOCITY")))
+ LoadReal (&a[axle_count - 1].angular_velocity);
+
+ if (!(strcmp (Buf1, "ADIRECTION")))
+ LoadInteger (&a[axle_count - 1].direction);
+
+ if (!(strcmp (Buf1, "GNAME")))
+ {
+ LoadText (g[gear_count].name);
+ gear_count++;
+ }
+
+ if (!(strcmp (Buf1, "GTYPE")))
+ LoadText (g[gear_count - 1].type);
+
+ if (!(strcmp (Buf1, "GFACE")))
+ LoadInteger (&g[gear_count - 1].face);
+
+ if (!(strcmp (Buf1, "GRADIUS")))
+ LoadReal (&g[gear_count - 1].radius);
+
+ if (!(strcmp (Buf1, "GWIDTH")))
+ LoadReal (&g[gear_count - 1].width);
+
+ if (!(strcmp (Buf1, "GTEETH")))
+ LoadInteger (&g[gear_count - 1].teeth);
+
+ if (!(strcmp (Buf1, "GTOOTHDEPTH")))
+ LoadReal (&g[gear_count - 1].tooth_depth);
+
+ if (!(strcmp (Buf1, "GCOLOR")))
+ LoadTriplet (g[gear_count - 1].color);
+
+ if (!(strcmp (Buf1, "GAXLE")))
+ LoadText (g[gear_count - 1].axle_name);
+
+ if (!(strcmp (Buf1, "GPOSITION")))
+ LoadInteger (&g[gear_count - 1].relative_position);
+
+ if (!(strcmp (Buf1, "BELTNAME")))
+ {
+ LoadText (b[belt_count].name);
+ belt_count++;
+ }
+
+ if (!(strcmp (Buf1, "GEAR1NAME")))
+ LoadText (b[belt_count - 1].gear1_name);
+
+ if (!(strcmp (Buf1, "GEAR2NAME")))
+ LoadText (b[belt_count - 1].gear2_name);
+ }
+
+ while (Buf1[0] != 0);
+
+ for (i = 0; i < number_of_gears; i++)
+ {
+ g[i].axis = -1;
+ g[i].direction = 0;
+ g[i].angular_velocity = 0.0;
+ }
+
+ number_of_gears = gear_count;
+ number_of_axles = axle_count;
+ number_of_belts = belt_count;
+ fclose (mainfile);
+}
+
+
+static void
+axle (GLint j, GLfloat radius, GLfloat length)
+{
+ GLfloat angle, rad, incr = 10.0 * M_PI / 180.0;
+
+ /* draw main cylinder */
+ glBegin (GL_QUADS);
+ for (angle = 0.0; angle < 360.0; angle += 5.0)
+ {
+ rad = angle * M_PI / 180.0;
+ glNormal3f (cos (rad), sin (rad), 0.0);
+ glVertex3f (radius * cos (rad), radius * sin (rad), length / 2);
+ glVertex3f (radius * cos (rad), radius * sin (rad), -length / 2);
+ glVertex3f (radius * cos (rad + incr), radius * sin (rad + incr), -length / 2);
+ glVertex3f (radius * cos (rad + incr), radius * sin (rad + incr), length / 2);
+ }
+ glEnd ();
+
+ /* draw front face */
+ glNormal3f (0.0, 0.0, 1.0);
+ glBegin (GL_TRIANGLES);
+ for (angle = 0.0; angle < 360.0; angle += 5.0)
+ {
+ rad = angle * M_PI / 180.0;
+ glVertex3f (0.0, 0.0, length / 2);
+ glVertex3f (radius * cos (rad), radius * sin (rad), length / 2);
+ glVertex3f (radius * cos (rad + incr), radius * sin (rad + incr), length / 2);
+ glVertex3f (0.0, 0.0, length / 2);
+ }
+ glEnd ();
+
+ /* draw back face */
+ glNormal3f (0.0, 0.0, -1.0);
+ glBegin (GL_TRIANGLES);
+ for (angle = 0.0; angle <= 360.0; angle += 5.0)
+ {
+ rad = angle * M_PI / 180.0;
+ glVertex3f (0.0, 0.0, -length / 2);
+ glVertex3f (radius * cos (rad), radius * sin (rad), -length / 2);
+ glVertex3f (radius * cos (rad + incr), radius * sin (rad + incr), -length / 2);
+ glVertex3f (0.0, 0.0, -length / 2);
+ }
+ glEnd ();
+}
+
+
+
+static void
+gear (GLint j, char type[], GLfloat radius, GLfloat width,
+ GLint teeth, GLfloat tooth_depth)
+{
+ GLint i;
+ GLfloat r1, r2;
+ GLfloat angle, da;
+ GLfloat u, v, len, fraction = 0.5;
+ GLfloat n = 1.0;
+
+ r1 = radius - tooth_depth;
+ r2 = radius;
+
+ da = 2.0 * M_PI / teeth / 4.0;
+ if (!g[j].face)
+ {
+ fraction = -0.5;
+ n = -1.0;
+ }
+ if (!(strcmp (type, "NORMAL")))
+ {
+ fraction = 0.5;
+ n = 1.0;
+ }
+
+ /* draw front face */
+ if (!(strcmp (type, "NORMAL")))
+ {
+ glNormal3f (0.0, 0.0, 1.0 * n);
+ glBegin (GL_QUAD_STRIP);
+ for (i = 0; i <= teeth; i++)
+ {
+ angle = i * 2.0 * M_PI / teeth;
+ glVertex3f (0.0, 0.0, width * fraction);
+ glVertex3f (r1 * cos (angle), r1 * sin (angle), width * fraction);
+ glVertex3f (0.0, 0.0, width * fraction);
+ glVertex3f (r1 * cos (angle + 3 * da), r1 * sin (angle + 3 * da), width * fraction);
+ }
+ glEnd ();
+ }
+ else
+ {
+ glNormal3f (0.0, 0.0, 1.0 * n);
+ glBegin (GL_QUAD_STRIP);
+ for (i = 0; i <= teeth; i++)
+ {
+ angle = i * 2.0 * M_PI / teeth;
+ glVertex3f (0.0, 0.0, width * fraction);
+ glVertex3f ((r2 - width) * cos (angle), (r2 - width) * sin (angle), width * fraction);
+ glVertex3f (0.0, 0.0, width * fraction);
+ glVertex3f ((r2 - width) * cos (angle + 3 * da), (r2 - width) * sin (angle + 3 * da), width * fraction);
+ }
+ glEnd ();
+ }
+
+ /* draw front sides of teeth */
+ if (!(strcmp (type, "NORMAL")))
+ {
+ glNormal3f (0.0, 0.0, 1.0 * n);
+ glBegin (GL_QUADS);
+ da = 2.0 * M_PI / teeth / 4.0;
+ for (i = 0; i < teeth; i++)
+ {
+ angle = i * 2.0 * M_PI / teeth;
+ glVertex3f (r1 * cos (angle), r1 * sin (angle), width * fraction);
+ glVertex3f (r2 * cos (angle + da), r2 * sin (angle + da), width * fraction);
+ glVertex3f (r2 * cos (angle + 2 * da), r2 * sin (angle + 2 * da), width * fraction);
+ glVertex3f (r1 * cos (angle + 3 * da), r1 * sin (angle + 3 * da), width * fraction);
+ }
+ glEnd ();
+ }
+
+ glNormal3f (0.0, 0.0, -1.0 * n);
+
+ /* draw back face */
+ glBegin (GL_QUAD_STRIP);
+ for (i = 0; i <= teeth; i++)
+ {
+ angle = i * 2.0 * M_PI / teeth;
+ glVertex3f (r1 * cos (angle), r1 * sin (angle), -width * fraction);
+ glVertex3f (0.0, 0.0, -width * fraction);
+ glVertex3f (r1 * cos (angle + 3 * da), r1 * sin (angle + 3 * da), -width * fraction);
+ glVertex3f (0.0, 0.0, -width * fraction);
+ }
+ glEnd ();
+
+ /* draw back sides of teeth */
+ glNormal3f (0.0, 0.0, -1.0 * n);
+ glBegin (GL_QUADS);
+ da = 2.0 * M_PI / teeth / 4.0;
+ for (i = 0; i < teeth; i++)
+ {
+ angle = i * 2.0 * M_PI / teeth;
+ glVertex3f (r1 * cos (angle + 3 * da), r1 * sin (angle + 3 * da), -width * fraction);
+ glVertex3f (r2 * cos (angle + 2 * da), r2 * sin (angle + 2 * da), -width * fraction);
+ glVertex3f (r2 * cos (angle + da), r2 * sin (angle + da), -width * fraction);
+ glVertex3f (r1 * cos (angle), r1 * sin (angle), -width * fraction);
+ }
+ glEnd ();
+
+
+ /* draw outward faces of teeth */
+ if (!(strcmp (type, "NORMAL")))
+ {
+ glBegin (GL_QUAD_STRIP);
+ for (i = 0; i < teeth; i++)
+ {
+ angle = i * 2.0 * M_PI / teeth;
+
+ glVertex3f (r1 * cos (angle), r1 * sin (angle), width * fraction);
+ glVertex3f (r1 * cos (angle), r1 * sin (angle), -width * fraction);
+ u = r2 * cos (angle + da) - r1 * cos (angle);
+ v = r2 * sin (angle + da) - r1 * sin (angle);
+ len = sqrt (u * u + v * v);
+ u /= len;
+ v /= len;
+ glNormal3f (v, -u, 0.0);
+ glVertex3f (r2 * cos (angle + da), r2 * sin (angle + da), width * fraction);
+ glVertex3f (r2 * cos (angle + da), r2 * sin (angle + da), -width * fraction);
+ glNormal3f (cos (angle), sin (angle), 0.0);
+ glVertex3f (r2 * cos (angle + 2 * da), r2 * sin (angle + 2 * da), width * fraction);
+ glVertex3f (r2 * cos (angle + 2 * da), r2 * sin (angle + 2 * da), -width * fraction);
+ u = r1 * cos (angle + 3 * da) - r2 * cos (angle + 2 * da);
+ v = r1 * sin (angle + 3 * da) - r2 * sin (angle + 2 * da);
+ glNormal3f (v, -u, 0.0);
+ glVertex3f (r1 * cos (angle + 3 * da), r1 * sin (angle + 3 * da), width * fraction);
+ glVertex3f (r1 * cos (angle + 3 * da), r1 * sin (angle + 3 * da), -width * fraction);
+ glNormal3f (cos (angle), sin (angle), 0.0);
+ }
+ }
+ else
+ {
+ glBegin (GL_QUAD_STRIP);
+ for (i = 0; i < teeth; i++)
+ {
+ angle = i * 2.0 * M_PI / teeth;
+ glVertex3f (r1 * cos (angle), r1 * sin (angle), width * fraction);
+ glVertex3f (r1 * cos (angle), r1 * sin (angle), -width * fraction);
+ u = r2 * cos (angle + da) - r1 * cos (angle);
+ v = r2 * sin (angle + da) - r1 * sin (angle);
+ len = sqrt (u * u + v * v);
+ u /= len;
+ v /= len;
+ glNormal3f (v, -u, 0.0);
+ glVertex3f ((r2 - width) * cos (angle + da), (r2 - width) * sin (angle + da), width * fraction);
+ glVertex3f (r2 * cos (angle + da), r2 * sin (angle + da), -width * fraction);
+ glNormal3f (cos (angle), sin (angle), n);
+ glVertex3f ((r2 - width) * cos (angle + 2 * da), (r2 - width) * sin (angle + 2 * da), width * fraction);
+ glVertex3f (r2 * cos (angle + 2 * da), r2 * sin (angle + 2 * da), -width * fraction);
+ u = r1 * cos (angle + 3 * da) - r2 * cos (angle + 2 * da);
+ v = r1 * sin (angle + 3 * da) - r2 * sin (angle + 2 * da);
+ glNormal3f (v, -u, 0.0);
+ glVertex3f (r1 * cos (angle + 3 * da), r1 * sin (angle + 3 * da), width * fraction);
+ glVertex3f (r1 * cos (angle + 3 * da), r1 * sin (angle + 3 * da), -width * fraction);
+ glNormal3f (cos (angle), sin (angle), n);
+ }
+ }
+
+ glVertex3f (r1 * cos (0), r1 * sin (0), width * fraction);
+ glVertex3f (r1 * cos (0), r1 * sin (0), -width * fraction);
+ glEnd ();
+}
+
+
+static void
+belt (struct GEAR g1, struct GEAR g2)
+{
+ GLfloat D, alpha, phi, angle, incr, width;
+ GLint indexes[3] =
+ {
+ 0, 0, 0
+ };
+
+ GLfloat col[3] =
+ {
+ 0.0, 0.0, 0.0
+ };
+
+ width = min (g1.width, g2.width);
+ D = sqrt (pow (g1.position[0] - g2.position[0], 2) + pow (g1.position[1] - g2.position[1], 2) + pow (g1.position[2] - g2.position[2], 2));
+ alpha = acos ((g2.position[0] - g1.position[0]) / D);
+ phi = acos ((g1.radius - g2.radius) / D);
+ glBegin (GL_QUADS);
+ glColor3fv (col);
+ glMaterialiv (GL_FRONT, GL_COLOR_INDEXES, indexes);
+ incr = 1.2 * 360.0 / g1.teeth * M_PI / 180.00;
+ for (angle = alpha + phi; angle <= 2 * M_PI - phi + alpha; angle += 360.0 / g1.teeth * M_PI / 180.00)
+ {
+ glNormal3f (cos (angle), sin (angle), 0.0);
+ glVertex3f (g1.radius * cos (angle), g1.radius * sin (angle), width * 0.5);
+ glVertex3f (g1.radius * cos (angle), g1.radius * sin (angle), -width * 0.5);
+ glVertex3f (g1.radius * cos (angle + incr), g1.radius * sin (angle + incr), -width * 0.5);
+ glVertex3f (g1.radius * cos (angle + incr), g1.radius * sin (angle + incr), width * 0.5);
+ }
+ glEnd ();
+ glBegin (GL_QUADS);
+ glColor3fv (col);
+ glMaterialiv (GL_FRONT, GL_COLOR_INDEXES, indexes);
+ incr = 1.2 * 360.0 / g2.teeth * M_PI / 180.00;
+ for (angle = -phi + alpha; angle <= phi + alpha; angle += 360.0 / g1.teeth * M_PI / 180.0)
+ {
+ glNormal3f (cos (angle), sin (angle), 0.0);
+ glVertex3f (g2.radius * cos (angle) + g2.position[0] - g1.position[0], g2.radius * sin (angle) + g2.position[1] - g1.position[1], width * 0.5);
+ glVertex3f (g2.radius * cos (angle) + g2.position[0] - g1.position[0], g2.radius * sin (angle) + g2.position[1] - g1.position[1], width * -0.5);
+ glVertex3f (g2.radius * cos (angle + incr) + g2.position[0] - g1.position[0], g2.radius * sin (angle + incr) + g2.position[1] - g1.position[1], width * -0.5);
+ glVertex3f (g2.radius * cos (angle + incr) + g2.position[0] - g1.position[0], g2.radius * sin (angle + incr) + g2.position[1] - g1.position[1], width * 0.5);
+ }
+ glEnd ();
+
+ glBegin (GL_QUADS);
+ glColor3fv (col);
+ glMaterialiv (GL_FRONT, GL_COLOR_INDEXES, indexes);
+ glVertex3f (g1.radius * cos (alpha + phi), g1.radius * sin (alpha + phi), width * 0.5);
+ glVertex3f (g1.radius * cos (alpha + phi), g1.radius * sin (alpha + phi), width * -0.5);
+ glVertex3f (g2.radius * cos (alpha + phi) + g2.position[0] - g1.position[0], g2.radius * sin (alpha + phi) + g2.position[1] - g1.position[1], width * -0.5);
+ glVertex3f (g2.radius * cos (alpha + phi) + g2.position[0] - g1.position[0], g2.radius * sin (alpha + phi) + g2.position[1] - g1.position[1], width * 0.5);
+ glVertex3f (g1.radius * cos (alpha - phi), g1.radius * sin (alpha - phi), width * 0.5);
+ glVertex3f (g1.radius * cos (alpha - phi), g1.radius * sin (alpha - phi), width * -0.5);
+ glVertex3f (g2.radius * cos (alpha - phi) + g2.position[0] - g1.position[0], g2.radius * sin (alpha - phi) + g2.position[1] - g1.position[1], width * -0.5);
+ glVertex3f (g2.radius * cos (alpha - phi) + g2.position[0] - g1.position[0], g2.radius * sin (alpha - phi) + g2.position[1] - g1.position[1], width * 0.5);
+ glEnd ();
+}
+
+
+static int
+axle_find (char axle_name[])
+{
+ int i;
+
+ for (i = 0; i < number_of_axles; i++)
+ {
+ if (!(strcmp (axle_name, a[i].name)))
+ break;
+ }
+ return i;
+}
+
+
+static int
+gear_find (char gear_name[])
+{
+ int i;
+
+ for (i = 0; i < number_of_gears; i++)
+ {
+ if (!(strcmp (gear_name, g[i].name)))
+ break;
+ }
+ return i;
+}
+
+
+static void
+process ()
+{
+ GLfloat x, y, z, D, dist;
+ GLint axle_index, i, j, g1, g2, k;
+ char error[80];
+
+ for (i = 0; i < number_of_gears; i++)
+ {
+ x = 0.0;
+ y = 0.0;
+ z = 0.0;
+ axle_index = axle_find (g[i].axle_name);
+ g[i].axis = a[axle_index].axis;
+ g[i].motored = a[axle_index].motored;
+ if (a[axle_index].motored)
+ {
+ g[i].direction = a[axle_index].direction;
+ g[i].angular_velocity = a[axle_index].angular_velocity;
+ }
+ if (g[i].axis == 0)
+ x = 1.0;
+ else if (g[i].axis == 1)
+ y = 1.0;
+ else
+ z = 1.0;
+
+ g[i].position[0] = a[axle_index].position[0] + x * g[i].relative_position;
+ g[i].position[1] = a[axle_index].position[1] + y * g[i].relative_position;
+ g[i].position[2] = a[axle_index].position[2] + z * g[i].relative_position;
+ }
+
+ for (k = 0; k < number_of_axles; k++)
+ {
+ for (i = 0; i < number_of_gears - 1; i++)
+ {
+ for (j = 0; j < number_of_gears; j++)
+ {
+ if (!(strcmp (g[i].type, g[j].type)) && (!(strcmp (g[i].type, "NORMAL"))) && ((strcmp (g[i].axle_name, g[j].axle_name) != 0)) && (g[i].axis == g[j].axis))
+ {
+ D = sqrt (pow (g[i].position[0] - g[j].position[0], 2) + pow (g[i].position[1] - g[j].position[1], 2) + pow (g[i].position[2] - g[j].position[2], 2));
+ if (D < 1.1 * (g[i].radius - g[i].tooth_depth + g[j].radius - g[j].tooth_depth))
+ {
+ printf (error, "Gear %s and %s are too close to each other.", g[i].name, g[j].name);
+
+ /*MessageBox(NULL,error,windowName,MB_ICONEXCLAMATION|MB_OK);*/
+ exit (1);
+ }
+
+ if (g[i].axis == 0)
+ {
+ dist = g[i].position[0] - g[j].position[0];
+ }
+ else if (g[i].axis == 1)
+ {
+ dist = g[i].position[1] - g[j].position[1];
+ }
+ else
+ dist = g[i].position[2] - g[j].position[2];
+
+ dist = fabs (dist);
+
+ if (dist < (g[i].width / 2 + g[j].width / 2))
+ {
+ if ((g[i].motored) && (!(g[j].motored)) && (D < 0.95 * (g[i].radius + g[j].radius)))
+ {
+ axle_index = axle_find (g[j].axle_name);
+ if ((a[axle_index].direction != 0) && (g[j].angular_velocity != g[i].angular_velocity * g[i].teeth / g[j].teeth * g[i].radius / g[j].radius))
+ {
+ printf (error, "Error in tooth linkage of gears %s and %s.", g[i].name, g[j].name);
+ /*MessageBox(NULL,error,windowName,MB_ICONEXCLAMATION|MB_OK);*/
+ exit (1);
+ }
+
+ g[j].motored = (a[axle_index].motored = 1);
+ g[j].direction = (a[axle_index].direction = -g[i].direction);
+ a[axle_index].angular_velocity = g[i].angular_velocity * g[i].teeth / g[j].teeth;
+ g[j].angular_velocity = (a[axle_index].angular_velocity *= g[i].radius / g[j].radius);
+ }
+
+ if ((!(g[i].motored)) && (g[j].motored) && (D < 0.95 * (g[i].radius + g[j].radius)))
+ {
+ axle_index = axle_find (g[i].axle_name);
+ if ((a[axle_index].direction != 0) && (g[i].angular_velocity != g[j].angular_velocity * g[j].teeth / g[i].teeth * g[j].radius / g[i].radius))
+ {
+ printf (error, "Error in tooth linkage of gears %s and %s.", g[i].name, g[j].name);
+ /*MessageBox(NULL,error,windowName,MB_ICONEXCLAMATION|MB_OK);*/
+ exit (1);
+ }
+
+ g[i].motored = (a[axle_index].motored = 1);
+ g[i].direction = (a[axle_index].direction = -g[j].direction);
+ a[axle_index].angular_velocity = g[j].angular_velocity * g[j].teeth / g[i].teeth;
+ g[i].angular_velocity = (a[axle_index].angular_velocity *= g[j].radius / g[i].radius);
+
+ }
+ }
+ }
+
+ if (!(strcmp (g[i].type, g[j].type)) && (!(strcmp (g[i].type, "BEVEL"))) && ((strcmp (g[i].axle_name, g[j].axle_name) != 0)) && (g[i].axis != g[j].axis))
+ {
+ D = sqrt (pow (g[i].position[0] - g[j].position[0], 2) + pow (g[i].position[1] - g[j].position[1], 2) + pow (g[i].position[2] - g[j].position[2], 2));
+ if ((g[i].motored) && (!(g[j].motored)) && (D < 0.95 * sqrt (g[i].radius * g[i].radius + g[j].radius * g[j].radius)))
+ {
+ axle_index = axle_find (g[j].axle_name);
+ if ((a[axle_index].direction != 0) && (g[j].angular_velocity != g[i].angular_velocity * g[i].teeth / g[j].teeth * g[i].radius / g[j].radius))
+ {
+ printf (error, "Error in tooth linkage of gears %s and %s.", g[i].name, g[j].name);
+ /*MessageBox(NULL,error,windowName,MB_ICONEXCLAMATION|MB_OK);*/
+ exit (1);
+ }
+ g[j].motored = (a[axle_index].motored = 1);
+ g[j].direction = (a[axle_index].direction = -g[i].direction);
+ a[axle_index].angular_velocity = g[i].angular_velocity * g[i].teeth / g[j].teeth;
+ g[j].angular_velocity = (a[axle_index].angular_velocity *= g[i].radius / g[j].radius);
+ }
+
+
+ if ((!(g[i].motored)) && (g[j].motored) && (D < 0.95 * sqrt (g[i].radius * g[i].radius + g[j].radius * g[j].radius)))
+ {
+ axle_index = axle_find (g[i].axle_name);
+ if ((a[axle_index].direction != 0) && (g[i].angular_velocity != g[j].angular_velocity * g[j].teeth / g[i].teeth * g[j].radius / g[i].radius))
+ {
+ printf (error, "Error in tooth linkage of gears %s and %s.", g[i].name, g[j].name);
+ /*MessageBox(NULL,error,windowName,MB_ICONEXCLAMATION|MB_OK);*/
+ exit (1);
+ }
+ g[i].motored = (a[axle_index].motored = 1);
+ g[i].direction = (a[axle_index].direction = -g[j].direction);
+ a[axle_index].angular_velocity = g[j].angular_velocity * g[j].teeth / g[i].teeth;
+ g[i].angular_velocity = (a[axle_index].angular_velocity *= g[j].radius / g[i].radius);
+ }
+ }
+ }
+ }
+
+ for (i = 0; i < number_of_gears; i++)
+ {
+ axle_index = axle_find (g[i].axle_name);
+ g[i].motored = a[axle_index].motored;
+ if (a[axle_index].motored)
+ {
+ g[i].direction = a[axle_index].direction;
+ g[i].angular_velocity = a[axle_index].angular_velocity;
+ }
+ }
+
+ for (i = 0; i < number_of_belts; i++)
+ {
+ g1 = gear_find (b[i].gear1_name);
+ g2 = gear_find (b[i].gear2_name);
+ D = sqrt (pow (g[g1].position[0] - g[g2].position[0], 2) + pow (g[g1].position[1] - g[g2].position[1], 2) + pow (g[g1].position[2] - g[g2].position[2], 2));
+ if (!((g[g1].axis == g[g2].axis) && (!strcmp (g[g1].type, g[g2].type)) && (!strcmp (g[g1].type, "NORMAL"))))
+ {
+ printf (error, "Belt %s invalid.", b[i].name);
+ /*MessageBox(NULL,error,windowName,MB_ICONEXCLAMATION|MB_OK);*/
+ exit (1);
+ }
+
+ if ((g[g1].axis == g[g2].axis) && (!strcmp (g[g1].type, g[g2].type)) && (!strcmp (g[g1].type, "NORMAL")))
+ {
+ /*
+ if((g[g1].motored)&&(g[g2].motored))
+ if(g[g2].angular_velocity!=(g[g1].angular_velocity*g[g1].radius/g[g2].radius))
+ {
+ printf(error,"Error in belt linkage of gears %s and %s".,g[g1].name,g[g2].name);
+ MessageBox(NULL,error,windowName,MB_ICONEXCLAMATION|MB_OK);
+ exit(1);
+ }
+ */
+ if (g[g1].axis == 0)
+ {
+ dist = g[g1].position[0] - g[g2].position[0];
+ }
+ else if (g[i].axis == 1)
+ {
+ dist = g[g1].position[1] - g[g2].position[1];
+ }
+ else
+ dist = g[g1].position[2] - g[g2].position[2];
+
+ dist = fabs (dist);
+
+ if (dist > (g[g1].width / 2 + g[g2].width / 2))
+ {
+ printf (error, "Belt %s invalid.", b[i].name);
+ /*MessageBox(NULL,error,windowName,MB_ICONEXCLAMATION|MB_OK);*/
+ exit (1);
+ }
+
+ if (dist < (g[g1].width / 2 + g[g2].width / 2))
+ {
+ if (D < g[g1].radius + g[g2].radius)
+ {
+ printf (error, "Gears %s and %s too close to be linked with belts", g[g1].name, g[g2].name);
+ /*MessageBox(NULL,error,windowName,MB_ICONEXCLAMATION|MB_OK);*/
+ exit (1);
+ }
+
+ if ((g[g1].motored) && (!(g[g2].motored)))
+ {
+ axle_index = axle_find (g[g2].axle_name);
+ g[g2].motored = (a[axle_index].motored = 1);
+ g[g2].direction = (a[axle_index].direction = g[g1].direction);
+ g[g2].angular_velocity = (a[axle_index].angular_velocity = g[g1].angular_velocity * g[g1].radius / g[g2].radius);
+ }
+
+ if ((!(g[g1].motored)) && (g[g2].motored))
+ {
+ axle_index = axle_find (g[g1].axle_name);
+ g[g1].motored = (a[axle_index].motored = 1);
+ g[g1].direction = (a[axle_index].direction = g[g2].direction);
+ g[g1].angular_velocity = (a[axle_index].angular_velocity = g[g2].angular_velocity * g[g2].radius / g[g1].radius);
+ }
+ }
+ }
+ }
+
+ for (i = 0; i < number_of_gears; i++)
+ {
+ axle_index = axle_find (g[i].axle_name);
+ g[i].motored = a[axle_index].motored;
+ if (a[axle_index].motored)
+ {
+ g[i].direction = a[axle_index].direction;
+ g[i].angular_velocity = a[axle_index].angular_velocity;
+ }
+ }
+ }
+}
+
+
+
+GLfloat view_rotx = 20.0, view_roty = 30.0, view_rotz = 10.0;
+
+
+static void
+draw (void)
+{
+ int i;
+ GLfloat x, y, z;
+ int index;
+
+ glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix ();
+ glRotatef (view_rotx, 1.0, 0.0, 0.0);
+ glRotatef (view_roty, 0.0, 1.0, 0.0);
+ glRotatef (view_rotz, 0.0, 0.0, 1.0);
+
+ for (i = 0; i < number_of_gears; i++)
+ {
+ x = 0.0;
+ y = 0.0;
+ z = 0.0;
+ glPushMatrix ();
+/*glTranslatef( -3.0, -2.0, 0.0 );*/
+ glTranslatef (g[i].position[0], g[i].position[1], g[i].position[2]);
+ if (g[i].axis == 0)
+ y = 1.0;
+ else if (g[i].axis == 1)
+ x = 1.0;
+ else
+ z = 1.0;
+
+ if (z != 1.0)
+ glRotatef (90.0, x, y, z);
+
+ glRotatef (g[i].direction * g[i].angle, 0.0, 0.0, 1.0);
+ glCallList (g[i].id);
+ glPopMatrix ();
+ }
+
+ for (i = 0; i < number_of_axles; i++)
+ {
+ x = 0.0;
+ y = 0.0;
+ z = 0.0;
+ glPushMatrix ();
+ glTranslatef (a[i].position[0], a[i].position[1], a[i].position[2]);
+ if (a[i].axis == 0)
+ y = 1.0;
+ else if (a[i].axis == 1)
+ x = 1.0;
+ else
+ z = 1.0;
+
+ if (z != 1.0)
+ glRotatef (90.0, x, y, z);
+
+ glCallList (a[i].id);
+ glPopMatrix ();
+ }
+
+ for (i = 0; i < number_of_belts; i++)
+ {
+ x = 0.0;
+ y = 0.0;
+ z = 0.0;
+ glPushMatrix ();
+ index = gear_find (b[i].gear1_name);
+ glTranslatef (g[index].position[0], g[index].position[1], g[index].position[2]);
+ if (g[index].axis == 0)
+ y = 1.0;
+ else if (g[index].axis == 1)
+ x = 1.0;
+ else
+ z = 1.0;
+
+ if (z != 1.0)
+ glRotatef (90.0, x, y, z);
+
+ glCallList (b[i].id);
+ glPopMatrix ();
+ }
+
+ glPopMatrix ();
+ glutSwapBuffers ();
+
+ {
+ GLint t = glutGet(GLUT_ELAPSED_TIME);
+ Frames++;
+ if (t - T0 >= 5000) {
+ GLfloat seconds = (t - T0) / 1000.0;
+ GLfloat fps = Frames / seconds;
+ printf("%d frames in %g seconds = %g FPS\n", Frames, seconds, fps);
+ T0 = t;
+ Frames = 0;
+ }
+ }
+}
+
+
+static void
+idle (void)
+{
+ int i;
+ static double t0 = -1.;
+ double dt, t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
+ if (t0 < 0.0)
+ t0 = t;
+ dt = t - t0;
+ t0 = t;
+ for (i = 0; i < number_of_gears; i++)
+ g[i].angle += g[i].angular_velocity * dt;
+ glutPostRedisplay();
+}
+
+
+
+
+/* change view angle, exit upon ESC */
+static void
+key (unsigned char k, int x, int y)
+{
+ switch (k)
+ {
+ case 'x':
+ view_rotx += 5.0;
+ break;
+ case 'X':
+ view_rotx -= 5.0;
+ break;
+ case 'y':
+ view_roty += 5.0;
+ break;
+ case 'Y':
+ view_roty -= 5.0;
+ break;
+ case 'z':
+ view_rotz += 5.0;
+ break;
+ case 'Z':
+ view_rotz -= 5.0;
+ break;
+ case 0x1B:
+ exit(0);
+ }
+}
+
+
+
+
+/* new window size or exposure */
+static void
+reshape (int width, int height)
+{
+ glViewport (0, 0, (GLint) width, (GLint) height);
+ glMatrixMode (GL_PROJECTION);
+ glLoadIdentity ();
+ if (width > height)
+ {
+ GLfloat w = (GLfloat) width / (GLfloat) height;
+ glFrustum (-w, w, -1.0, 1.0, 5.0, 60.0);
+ }
+ else
+ {
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+ glFrustum (-1.0, 1.0, -h, h, 5.0, 60.0);
+ }
+
+ glMatrixMode (GL_MODELVIEW);
+ glLoadIdentity ();
+ glTranslatef (0.0, 0.0, -40.0);
+ glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+}
+
+
+
+static void
+init (void)
+{
+ GLfloat matShine = 20.00F;
+ GLfloat light0Pos[4] =
+ {
+ 0.70F, 0.70F, 1.25F, 0.50F
+ };
+ int i;
+
+ glClearColor (background[0], background[1], background[2], 1.0F);
+ glClearIndex ((GLfloat) 0.0);
+
+ glMaterialf (GL_FRONT_AND_BACK, GL_SHININESS, matShine);
+ glLightfv (GL_LIGHT0, GL_POSITION, light0Pos);
+ glEnable (GL_LIGHT0);
+
+ glEnable (GL_LIGHTING);
+ glEnable (GL_DEPTH_TEST);
+ for (i = 0; i < number_of_gears; i++)
+ g[i].angle = 0.0;
+
+ for (i = 0; i < number_of_gears; i++)
+ {
+ g[i].id = glGenLists (1);
+ glNewList (g[i].id, GL_COMPILE);
+ glColor3fv (g[i].color);
+ glMaterialfv (GL_FRONT, GL_SPECULAR, g[i].color);
+ gear (i, g[i].type, g[i].radius, g[i].width, g[i].teeth, g[i].tooth_depth);
+ glEndList ();
+ }
+
+ for (i = 0; i < number_of_axles; i++)
+ {
+ a[i].id = glGenLists (1);
+ glNewList (a[i].id, GL_COMPILE);
+ glColor3fv (a[i].color);
+ glMaterialfv (GL_FRONT, GL_SPECULAR, a[i].color);
+ axle (i, a[i].radius, a[i].length);
+ glEndList ();
+ }
+
+ for (i = 0; i < number_of_belts; i++)
+ {
+ b[i].id = glGenLists (1);
+ glNewList (b[i].id, GL_COMPILE);
+ belt (g[gear_find (b[i].gear1_name)], g[gear_find (b[i].gear2_name)]);
+ glEndList ();
+ }
+
+ glEnable (GL_COLOR_MATERIAL);
+}
+
+
+
+int
+main (int argc, char *argv[])
+{
+ char *file;
+
+ if (argc < 2)
+ file = "geartrain.dat";
+ else
+ file = argv[1];
+
+ glutInitWindowPosition (0, 0);
+ glutInitWindowSize(640,480);
+ glutInitDisplayMode (GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE );
+
+ if (glutCreateWindow ("Gear Train Simulation") == GL_FALSE)
+ exit (1);
+
+ getdata (file);
+ process ();
+ init ();
+
+ glutDisplayFunc (draw);
+ glutReshapeFunc (reshape);
+ glutKeyboardFunc (key);
+ glutIdleFunc (idle);
+ glutMainLoop ();
+ return 0;
+}
diff --git a/progs/demos/geartrain.dat b/progs/demos/geartrain.dat
new file mode 100644
index 00000000000..374de48bd5e
--- /dev/null
+++ b/progs/demos/geartrain.dat
@@ -0,0 +1,119 @@
+BACKGROUND = 0.000 0.500 0.700
+
+ANAME = AXLE1
+ARADIUS = 1.000
+AAXIS = 2
+APOSITION = -7.000 0.000 0.000
+ACOLOR = 0.800 0.500 0.200
+ALENGTH = 6.000
+AMOTORED = 1
+AANGULARVELOCITY = 90.000
+ADIRECTION = 1
+
+ANAME = AXLE2
+ARADIUS = 1.000
+AAXIS = 2
+APOSITION = -3.000 0.000 0.000
+ACOLOR = 0.800 0.500 0.200
+ALENGTH = 12.000
+AMOTORED = 0
+
+ANAME = AXLE3
+ARADIUS = 1.000
+AAXIS = 2
+APOSITION = 1.000 0.000 0.000
+ACOLOR = 0.800 0.500 0.200
+ALENGTH = 6.000
+AMOTORED = 0
+
+ANAME = AXLE4
+ARADIUS = 1.000
+AAXIS = 2
+APOSITION = 8.000 0.000 0.000
+ACOLOR = 0.800 0.500 0.200
+ALENGTH = 18.000
+AMOTORED = 0
+
+ANAME = AXLE5
+ARADIUS = 1.000
+AAXIS = 1
+APOSITION = 8.000 -8.200 -7.400
+ACOLOR = 0.800 0.500 0.200
+ALENGTH = 12.000
+AMOTORED = 0
+
+GNAME = GEAR1
+GTYPE = NORMAL
+GRADIUS = 2.200
+GWIDTH = 3.000
+GTEETH = 40
+GTOOTHDEPTH = 0.500
+GCOLOR = 0.500 0.500 0.500
+GAXLE = AXLE1
+GPOSITION = 0.000
+
+GNAME = GEAR2
+GTYPE = NORMAL
+GRADIUS = 2.200
+GWIDTH = 3.000
+GTEETH = 30
+GTOOTHDEPTH = 0.500
+GCOLOR = 0.500 0.500 0.500
+GAXLE = AXLE2
+GPOSITION = 0.000
+
+GNAME = GEAR3
+GTYPE = NORMAL
+GRADIUS = 2.200
+GWIDTH = 3.000
+GTEETH = 20
+GTOOTHDEPTH = 0.500
+GCOLOR = 0.500 0.500 0.500
+GAXLE = AXLE3
+GPOSITION = 0.000
+
+GNAME = GEAR4
+GTYPE = NORMAL
+GRADIUS = 1.700
+GWIDTH = 1.000
+GTEETH = 20
+GTOOTHDEPTH = 0.500
+GCOLOR = 0.500 0.500 0.500
+GAXLE = AXLE2
+GPOSITION = 5.000
+
+GNAME = GEAR5
+GTYPE = NORMAL
+GRADIUS = 3.000
+GWIDTH = 1.000
+GTEETH = 20
+GTOOTHDEPTH = 0.500
+GCOLOR = 0.500 0.500 0.500
+GAXLE = AXLE4
+GPOSITION = 5.000
+
+GNAME = GEAR6
+GTYPE = BEVEL
+GFACE = 0
+GRADIUS = 4.000
+GWIDTH = 1.000
+GTEETH = 20
+GTOOTHDEPTH = 1.700
+GCOLOR = 0.500 0.500 0.500
+GAXLE = AXLE4
+GPOSITION = -4.000
+
+GNAME = GEAR7
+GTYPE = BEVEL
+GFACE = 0
+GRADIUS = 4.000
+GWIDTH = 1.000
+GTEETH = 20
+GTOOTHDEPTH = 1.700
+GCOLOR = 0.500 0.500 0.500
+GAXLE = AXLE5
+GPOSITION = 5.000
+
+BELTNAME = BELT1
+GEAR1NAME = GEAR5
+GEAR2NAME = GEAR4
diff --git a/progs/demos/glinfo.c b/progs/demos/glinfo.c
new file mode 100644
index 00000000000..a6a7478288e
--- /dev/null
+++ b/progs/demos/glinfo.c
@@ -0,0 +1,32 @@
+
+/*
+ * Print GL, GLU and GLUT version and extension info
+ *
+ * Brian Paul This file in public domain.
+ * October 3, 1997
+ */
+
+
+#include <stdio.h>
+#include <GL/glut.h>
+
+
+int main( int argc, char *argv[] )
+{
+ glutInit( &argc, argv );
+ glutInitDisplayMode( GLUT_RGB );
+ glutCreateWindow(argv[0]);
+
+ printf("GL_VERSION: %s\n", (char *) glGetString(GL_VERSION));
+ printf("GL_EXTENSIONS: %s\n", (char *) glGetString(GL_EXTENSIONS));
+ printf("GL_RENDERER: %s\n", (char *) glGetString(GL_RENDERER));
+ printf("GL_VENDOR: %s\n", (char *) glGetString(GL_VENDOR));
+ printf("GLU_VERSION: %s\n", (char *) gluGetString(GLU_VERSION));
+ printf("GLU_EXTENSIONS: %s\n", (char *) gluGetString(GLU_EXTENSIONS));
+ printf("GLUT_API_VERSION: %d\n", GLUT_API_VERSION);
+#ifdef GLUT_XLIB_IMPLEMENTATION
+ printf("GLUT_XLIB_IMPLEMENTATION: %d\n", GLUT_XLIB_IMPLEMENTATION);
+#endif
+
+ return 0;
+}
diff --git a/progs/demos/gloss.c b/progs/demos/gloss.c
new file mode 100644
index 00000000000..0b2e7426d53
--- /dev/null
+++ b/progs/demos/gloss.c
@@ -0,0 +1,483 @@
+
+/*
+ * Specular reflection demo. The specular highlight is modulated by
+ * a sphere-mapped texture. The result is a high-gloss surface.
+ * NOTE: you really need hardware acceleration for this.
+ * Also note, this technique can't be implemented with multi-texture
+ * and separate specular color interpolation because there's no way
+ * to indicate that the second texture unit (the reflection map)
+ * should modulate the specular color and not the base color.
+ * A future multi-texture extension could fix that.
+ *
+ * Command line options:
+ * -info print GL implementation information
+ *
+ *
+ * Brian Paul October 22, 1999 This program is in the public domain.
+ */
+
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <string.h>
+#include <GL/glut.h>
+
+#include "readtex.h"
+
+#define SPECULAR_TEXTURE_FILE "../images/reflect.rgb"
+#define BASE_TEXTURE_FILE "../images/tile.rgb"
+
+/* Menu items */
+#define DO_SPEC_TEXTURE 1
+#define OBJECT 2
+#define ANIMATE 3
+#define QUIT 100
+
+/* for convolution */
+#define FILTER_SIZE 7
+
+static GLint WinWidth = 500, WinHeight = 500;
+static GLuint CylinderObj = 0;
+static GLuint TeapotObj = 0;
+static GLuint Object = 0;
+static GLboolean Animate = GL_TRUE;
+
+static GLfloat Xrot = 0.0, Yrot = 0.0, Zrot = 0.0;
+static GLfloat DXrot = 20.0, DYrot = 50.;
+
+static GLfloat Black[4] = { 0, 0, 0, 0 };
+static GLfloat White[4] = { 1, 1, 1, 1 };
+static GLfloat Diffuse[4] = { .3, .3, 1.0, 1.0 }; /* blue */
+static GLfloat Shininess = 6;
+
+static GLuint BaseTexture, SpecularTexture;
+static GLboolean DoSpecTexture = GL_TRUE;
+
+static GLboolean ButtonDown = GL_FALSE;
+static GLint ButtonX, ButtonY;
+static GLfloat Xrot0, Yrot0;
+
+
+/* performance info */
+static GLint T0 = 0;
+static GLint Frames = 0;
+
+
+static void Idle( void )
+{
+ static double t0 = -1.;
+ double dt, t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
+ if (t0 < 0.0)
+ t0 = t;
+ dt = t - t0;
+ t0 = t;
+
+ if (Animate) {
+ Xrot += DXrot*dt;
+ Yrot += DYrot*dt;
+ glutPostRedisplay();
+ }
+}
+
+
+static void Display( void )
+{
+ glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+
+ glPushMatrix();
+ glRotatef(Xrot, 1.0, 0.0, 0.0);
+ glRotatef(Yrot, 0.0, 1.0, 0.0);
+ glRotatef(Zrot, 0.0, 0.0, 1.0);
+
+ /* First pass: diffuse lighting with base texture */
+ glMaterialfv(GL_FRONT, GL_DIFFUSE, Diffuse);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, Black);
+ glEnable(GL_TEXTURE_2D);
+ glBindTexture(GL_TEXTURE_2D, BaseTexture);
+ glCallList(Object);
+
+ /* Second pass: specular lighting with reflection texture */
+ glEnable(GL_POLYGON_OFFSET_FILL);
+ glBlendFunc(GL_ONE, GL_ONE); /* add */
+ glEnable(GL_BLEND);
+ glMaterialfv(GL_FRONT, GL_DIFFUSE, Black);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, White);
+ if (DoSpecTexture) {
+ glBindTexture(GL_TEXTURE_2D, SpecularTexture);
+ glEnable(GL_TEXTURE_GEN_S);
+ glEnable(GL_TEXTURE_GEN_T);
+ }
+ else {
+ glDisable(GL_TEXTURE_2D);
+ }
+ glCallList(Object);
+ glDisable(GL_TEXTURE_GEN_S);
+ glDisable(GL_TEXTURE_GEN_T);
+ glDisable(GL_BLEND);
+ glDisable(GL_POLYGON_OFFSET_FILL);
+
+ glPopMatrix();
+
+ glutSwapBuffers();
+
+ if (Animate) {
+ GLint t = glutGet(GLUT_ELAPSED_TIME);
+ Frames++;
+ if (t - T0 >= 5000) {
+ GLfloat seconds = (t - T0) / 1000.0;
+ GLfloat fps = Frames / seconds;
+ printf("%d frames in %g seconds = %g FPS\n", Frames, seconds, fps);
+ T0 = t;
+ Frames = 0;
+ }
+ }
+}
+
+
+static void Reshape( int width, int height )
+{
+ GLfloat h = 30.0;
+ GLfloat w = h * width / height;
+ WinWidth = width;
+ WinHeight = height;
+ glViewport( 0, 0, width, height );
+ glMatrixMode( GL_PROJECTION );
+ glLoadIdentity();
+ glFrustum( -w, w, -h, h, 150.0, 500.0 );
+ glMatrixMode( GL_MODELVIEW );
+ glLoadIdentity();
+ glTranslatef( 0.0, 0.0, -380.0 );
+}
+
+
+static void ToggleAnimate(void)
+{
+ Animate = !Animate;
+ if (Animate) {
+ glutIdleFunc( Idle );
+ T0 = glutGet(GLUT_ELAPSED_TIME);
+ Frames = 0;
+ }
+ else {
+ glutIdleFunc( NULL );
+ }
+}
+
+
+static void ModeMenu(int entry)
+{
+ if (entry==ANIMATE) {
+ ToggleAnimate();
+ }
+ else if (entry==DO_SPEC_TEXTURE) {
+ DoSpecTexture = !DoSpecTexture;
+ }
+ else if (entry==OBJECT) {
+ if (Object == TeapotObj)
+ Object = CylinderObj;
+ else
+ Object = TeapotObj;
+ }
+ else if (entry==QUIT) {
+ exit(0);
+ }
+ glutPostRedisplay();
+}
+
+
+static void Key( unsigned char key, int x, int y )
+{
+ (void) x;
+ (void) y;
+ switch (key) {
+ case 's':
+ Shininess--;
+ if (Shininess < 0.0)
+ Shininess = 0.0;
+ glMaterialf(GL_FRONT, GL_SHININESS, Shininess);
+ printf("Shininess = %g\n", Shininess);
+ break;
+ case 'S':
+ Shininess++;
+ if (Shininess > 128.0)
+ Shininess = 128.0;
+ glMaterialf(GL_FRONT, GL_SHININESS, Shininess);
+ printf("Shininess = %g\n", Shininess);
+ break;
+ case 'a':
+ case ' ':
+ ToggleAnimate();
+ break;
+ case 27:
+ exit(0);
+ break;
+ }
+ glutPostRedisplay();
+}
+
+
+static void SpecialKey( int key, int x, int y )
+{
+ float step = 3.0;
+ (void) x;
+ (void) y;
+
+ switch (key) {
+ case GLUT_KEY_UP:
+ Xrot += step;
+ break;
+ case GLUT_KEY_DOWN:
+ Xrot -= step;
+ break;
+ case GLUT_KEY_LEFT:
+ Yrot += step;
+ break;
+ case GLUT_KEY_RIGHT:
+ Yrot -= step;
+ break;
+ }
+ glutPostRedisplay();
+}
+
+
+static void
+MouseMotion(int x, int y)
+{
+ const float k = 300.0;
+ if (ButtonDown) {
+ float dx = x - ButtonX;
+ float dy = y - ButtonY;
+ Xrot = Xrot0 + k * dy / WinWidth;
+ Yrot = Yrot0 + k * dx / WinHeight;
+ glutPostRedisplay();
+ }
+}
+
+
+static void
+MouseButton(int button, int state, int x, int y)
+{
+ if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) {
+ ButtonDown = GL_TRUE;
+ ButtonX = x;
+ ButtonY = y;
+ Xrot0 = Xrot;
+ Yrot0 = Yrot;
+ }
+ else if (button == GLUT_LEFT_BUTTON && state == GLUT_UP) {
+ ButtonDown = GL_FALSE;
+ }
+}
+
+
+static void Init( int argc, char *argv[] )
+{
+ GLboolean convolve = GL_FALSE;
+ GLboolean fullscreen = GL_FALSE;
+ int i;
+
+ for (i = 1; i < argc; i++) {
+ if (strcmp(argv[i], "-info")==0) {
+ printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER));
+ printf("GL_VERSION = %s\n", (char *) glGetString(GL_VERSION));
+ printf("GL_VENDOR = %s\n", (char *) glGetString(GL_VENDOR));
+ printf("GL_EXTENSIONS = %s\n", (char *) glGetString(GL_EXTENSIONS));
+ }
+ else if (strcmp(argv[i], "-c")==0) {
+ convolve = GL_TRUE;
+ }
+ else if (strcmp(argv[i], "-f")==0) {
+ fullscreen = GL_TRUE;
+ }
+ }
+
+ if (fullscreen)
+ glutFullScreen();
+
+ /* Cylinder object */
+ {
+ static GLfloat height = 100.0;
+ static GLfloat radius = 40.0;
+ static GLint slices = 24; /* pie slices around Z axis */
+ static GLint stacks = 10; /* subdivisions along length of cylinder */
+ static GLint rings = 4; /* rings in the end disks */
+ GLUquadricObj *q = gluNewQuadric();
+ assert(q);
+ gluQuadricTexture(q, GL_TRUE);
+
+ CylinderObj = glGenLists(1);
+ glNewList(CylinderObj, GL_COMPILE);
+
+ glPushMatrix();
+ glTranslatef(0.0, 0.0, -0.5 * height);
+
+ glMatrixMode(GL_TEXTURE);
+ glLoadIdentity();
+ /*glScalef(8.0, 4.0, 2.0);*/
+ glMatrixMode(GL_MODELVIEW);
+
+ /* cylinder */
+ gluQuadricNormals(q, GL_SMOOTH);
+ gluQuadricTexture(q, GL_TRUE);
+ gluCylinder(q, radius, radius, height, slices, stacks);
+
+ /* end cap */
+ glMatrixMode(GL_TEXTURE);
+ glLoadIdentity();
+ glScalef(3.0, 3.0, 1.0);
+ glMatrixMode(GL_MODELVIEW);
+
+ glTranslatef(0.0, 0.0, height);
+ gluDisk(q, 0.0, radius, slices, rings);
+
+ /* other end cap */
+ glTranslatef(0.0, 0.0, -height);
+ gluQuadricOrientation(q, GLU_INSIDE);
+ gluDisk(q, 0.0, radius, slices, rings);
+
+ glPopMatrix();
+
+ glMatrixMode(GL_TEXTURE);
+ glLoadIdentity();
+ glMatrixMode(GL_MODELVIEW);
+
+ glEndList();
+ gluDeleteQuadric(q);
+ }
+
+ /* Teapot */
+ {
+ TeapotObj = glGenLists(1);
+ glNewList(TeapotObj, GL_COMPILE);
+
+ glFrontFace(GL_CW);
+ glutSolidTeapot(40.0);
+ glFrontFace(GL_CCW);
+
+ glEndList();
+ }
+
+ /* show cylinder by default */
+ Object = CylinderObj;
+
+
+ /* lighting */
+ glEnable(GL_LIGHTING);
+ {
+ GLfloat pos[4] = { 3, 3, 3, 1 };
+ glLightfv(GL_LIGHT0, GL_AMBIENT, Black);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, White);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, White);
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glEnable(GL_LIGHT0);
+ glMaterialfv(GL_FRONT, GL_AMBIENT, Black);
+ glMaterialf(GL_FRONT, GL_SHININESS, Shininess);
+ glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 1);
+ }
+
+ /* Base texture */
+ glGenTextures(1, &BaseTexture);
+ glBindTexture(GL_TEXTURE_2D, BaseTexture);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ if (!LoadRGBMipmaps(BASE_TEXTURE_FILE, GL_RGB)) {
+ printf("Error: couldn't load texture image file %s\n", BASE_TEXTURE_FILE);
+ exit(1);
+ }
+
+ /* Specular texture */
+ glGenTextures(1, &SpecularTexture);
+ glBindTexture(GL_TEXTURE_2D, SpecularTexture);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
+ glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
+ if (convolve) {
+ /* use convolution to blur the texture to simulate a dull finish
+ * on the object.
+ */
+ GLubyte *img;
+ GLenum format;
+ GLint w, h;
+ GLfloat filter[FILTER_SIZE][FILTER_SIZE][4];
+
+ for (h = 0; h < FILTER_SIZE; h++) {
+ for (w = 0; w < FILTER_SIZE; w++) {
+ const GLfloat k = 1.0 / (FILTER_SIZE * FILTER_SIZE);
+ filter[h][w][0] = k;
+ filter[h][w][1] = k;
+ filter[h][w][2] = k;
+ filter[h][w][3] = k;
+ }
+ }
+
+ glEnable(GL_CONVOLUTION_2D);
+ glConvolutionParameteri(GL_CONVOLUTION_2D,
+ GL_CONVOLUTION_BORDER_MODE, GL_CONSTANT_BORDER);
+ glConvolutionFilter2D(GL_CONVOLUTION_2D, GL_RGBA,
+ FILTER_SIZE, FILTER_SIZE,
+ GL_RGBA, GL_FLOAT, filter);
+
+ img = LoadRGBImage(SPECULAR_TEXTURE_FILE, &w, &h, &format);
+ if (!img) {
+ printf("Error: couldn't load texture image file %s\n",
+ SPECULAR_TEXTURE_FILE);
+ exit(1);
+ }
+
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, w, h, 0,
+ format, GL_UNSIGNED_BYTE, img);
+ free(img);
+ }
+ else {
+ /* regular path */
+ if (!LoadRGBMipmaps(SPECULAR_TEXTURE_FILE, GL_RGB)) {
+ printf("Error: couldn't load texture image file %s\n",
+ SPECULAR_TEXTURE_FILE);
+ exit(1);
+ }
+ }
+
+ /* misc */
+ glEnable(GL_CULL_FACE);
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+
+ glPolygonOffset( -1, -1 );
+}
+
+
+int main( int argc, char *argv[] )
+{
+ glutInit( &argc, argv );
+ glutInitWindowPosition(0, 0);
+ glutInitWindowSize(WinWidth, WinHeight);
+
+ glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH );
+
+ glutCreateWindow(argv[0] );
+
+ Init(argc, argv);
+
+ glutReshapeFunc( Reshape );
+ glutKeyboardFunc( Key );
+ glutSpecialFunc( SpecialKey );
+ glutDisplayFunc( Display );
+ glutMotionFunc(MouseMotion);
+ glutMouseFunc(MouseButton);
+ if (Animate)
+ glutIdleFunc( Idle );
+
+ glutCreateMenu(ModeMenu);
+ glutAddMenuEntry("Toggle Highlight", DO_SPEC_TEXTURE);
+ glutAddMenuEntry("Toggle Object", OBJECT);
+ glutAddMenuEntry("Toggle Animate", ANIMATE);
+ glutAddMenuEntry("Quit", QUIT);
+ glutAttachMenu(GLUT_RIGHT_BUTTON);
+
+ glutMainLoop();
+ return 0;
+}
diff --git a/progs/demos/glslnoise.c b/progs/demos/glslnoise.c
new file mode 100755
index 00000000000..2adb114e668
--- /dev/null
+++ b/progs/demos/glslnoise.c
@@ -0,0 +1,185 @@
+/*
+ * GLSL noise demo.
+ *
+ * Michal Krol
+ * 20 February 2006
+ *
+ * Based on the original demo by:
+ * Stefan Gustavson ([email protected]) 2004, 2005
+ */
+
+#ifdef WIN32
+#include <windows.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <GL/gl.h>
+#include <GL/glut.h>
+#include <GL/glext.h>
+
+#ifdef WIN32
+#define GETPROCADDRESS(F) wglGetProcAddress(F)
+#else
+#define GETPROCADDRESS(F) glutGetProcAddress(F)
+#endif
+
+static GLhandleARB fragShader;
+static GLhandleARB vertShader;
+static GLhandleARB program;
+
+static GLint uTime;
+
+static GLfloat u_time = 0.0f;
+
+static PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB = NULL;
+static PFNGLSHADERSOURCEARBPROC glShaderSourceARB = NULL;
+static PFNGLCOMPILESHADERARBPROC glCompileShaderARB = NULL;
+static PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB = NULL;
+static PFNGLATTACHOBJECTARBPROC glAttachObjectARB = NULL;
+static PFNGLLINKPROGRAMARBPROC glLinkProgramARB = NULL;
+static PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB = NULL;
+static PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB = NULL;
+static PFNGLUNIFORM1FARBPROC glUniform1fARB = NULL;
+
+static void Redisplay (void)
+{
+ glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glUniform1fARB (uTime, u_time);
+
+ glPushMatrix ();
+ glutSolidSphere (2.0, 20, 10);
+ glPopMatrix ();
+
+ glutSwapBuffers();
+}
+
+static void Idle (void)
+{
+ u_time += 0.1f;
+ glutPostRedisplay ();
+}
+
+static void Reshape (int width, int height)
+{
+ glViewport (0, 0, width, height);
+ glMatrixMode (GL_PROJECTION);
+ glLoadIdentity ();
+ glFrustum (-1.0, 1.0, -1.0, 1.0, 5.0, 25.0);
+ glMatrixMode (GL_MODELVIEW);
+ glLoadIdentity ();
+ glTranslatef (0.0f, 0.0f, -15.0f);
+}
+
+static void Key (unsigned char key, int x, int y)
+{
+ (void) x;
+ (void) y;
+
+ switch (key)
+ {
+ case 27:
+ exit(0);
+ break;
+ }
+ glutPostRedisplay ();
+}
+
+static void Init (void)
+{
+ static const char *fragShaderText =
+ "uniform float time;\n"
+ "void main () {\n"
+ " gl_FragColor = gl_Color * vec4 ((0.5 + 0.5 * vec3 (noise1 (\n"
+ " vec4 (4.0 * gl_TexCoord[0].xyz, 0.5 * time)))), 1.0);\n"
+ "}\n"
+ ;
+ static const char *vertShaderText =
+ "void main () {\n"
+ " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n"
+ " gl_TexCoord[0] = gl_Vertex;\n"
+ " gl_FrontColor = gl_Color;\n"
+ "}\n"
+ ;
+
+ if (!glutExtensionSupported ("GL_ARB_fragment_shader"))
+ {
+ printf ("Sorry, this demo requires GL_ARB_fragment_shader\n");
+ exit(1);
+ }
+ if (!glutExtensionSupported ("GL_ARB_shader_objects"))
+ {
+ printf ("Sorry, this demo requires GL_ARB_shader_objects\n");
+ exit(1);
+ }
+ if (!glutExtensionSupported ("GL_ARB_shading_language_100"))
+ {
+ printf ("Sorry, this demo requires GL_ARB_shading_language_100\n");
+ exit(1);
+ }
+ if (!glutExtensionSupported ("GL_ARB_vertex_shader"))
+ {
+ printf ("Sorry, this demo requires GL_ARB_vertex_shader\n");
+ exit(1);
+ }
+
+ glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC)
+ GETPROCADDRESS("glCreateShaderObjectARB");
+ glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC)
+ GETPROCADDRESS("glShaderSourceARB");
+ glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC)
+ GETPROCADDRESS("glCompileShaderARB");
+ glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC)
+ GETPROCADDRESS("glCreateProgramObjectARB");
+ glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC)
+ GETPROCADDRESS("glAttachObjectARB");
+ glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC)
+ GETPROCADDRESS ("glLinkProgramARB");
+ glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC)
+ GETPROCADDRESS("glUseProgramObjectARB");
+
+ glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC)
+ GETPROCADDRESS("glGetUniformLocationARB");
+ glUniform1fARB = (PFNGLUNIFORM1FARBPROC)
+ GETPROCADDRESS("glUniform1fARB");
+
+ fragShader = glCreateShaderObjectARB (GL_FRAGMENT_SHADER_ARB);
+ glShaderSourceARB (fragShader, 1, &fragShaderText, NULL);
+ glCompileShaderARB (fragShader);
+
+ vertShader = glCreateShaderObjectARB (GL_VERTEX_SHADER_ARB);
+ glShaderSourceARB (vertShader, 1, &vertShaderText, NULL);
+ glCompileShaderARB (vertShader);
+
+ program = glCreateProgramObjectARB ();
+ glAttachObjectARB (program, fragShader);
+ glAttachObjectARB (program, vertShader);
+ glLinkProgramARB (program);
+ glUseProgramObjectARB (program);
+
+ uTime = glGetUniformLocationARB (program, "time");
+
+ glClearColor (0.0f, 0.1f, 0.3f, 1.0f);
+ glEnable (GL_CULL_FACE);
+ glEnable (GL_DEPTH_TEST);
+
+ printf ("GL_RENDERER = %s\n", (const char *) glGetString (GL_RENDERER));
+}
+
+int main (int argc, char *argv[])
+{
+ glutInit (&argc, argv);
+ glutInitWindowPosition ( 0, 0);
+ glutInitWindowSize (200, 200);
+ glutInitDisplayMode (GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
+ glutCreateWindow (argv[0]);
+ glutReshapeFunc (Reshape);
+ glutKeyboardFunc (Key);
+ glutDisplayFunc (Redisplay);
+ glutIdleFunc (Idle);
+ Init ();
+ glutMainLoop ();
+ return 0;
+}
+
diff --git a/progs/demos/gltestperf.c b/progs/demos/gltestperf.c
new file mode 100644
index 00000000000..be953901014
--- /dev/null
+++ b/progs/demos/gltestperf.c
@@ -0,0 +1,580 @@
+/*
+ * This program is under the GNU GPL.
+ * Use at your own risk.
+ *
+ * written by David Bucciarelli ([email protected])
+ * Humanware s.r.l.
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <math.h>
+#include <GL/glut.h>
+
+typedef struct
+{
+ char *name;
+ char *unit;
+ void (*init) (void);
+ int (*run) (int, int);
+ int type;
+ int numsize;
+ int size[10];
+}
+benchmark;
+
+static int frontbuffer = 1;
+
+/***************************************************************************/
+
+static void
+init_test01(void)
+{
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluOrtho2D(-0.5, 639.5, -0.5, 479.5);
+ glMatrixMode(GL_MODELVIEW);
+
+ glShadeModel(GL_FLAT);
+ glDisable(GL_DEPTH_TEST);
+
+ glClearColor(0.0, 0.1, 1.0, 0.0);
+ glClear(GL_COLOR_BUFFER_BIT);
+ glColor3f(1.0, 0.0, 0.0);
+}
+
+static int
+test01(int size, int num)
+{
+ int x, y;
+
+ glBegin(GL_POINTS);
+ for (y = 0; y < num; y++)
+ for (x = 0; x < 480; x++)
+ glVertex2i(x, x);
+ glEnd();
+
+ return 480 * num;
+}
+
+/***************************************************************************/
+
+static void
+init_test02(void)
+{
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluOrtho2D(-0.5, 639.5, -0.5, 479.5);
+ glMatrixMode(GL_MODELVIEW);
+
+ glShadeModel(GL_SMOOTH);
+ glDisable(GL_DEPTH_TEST);
+
+ glClearColor(0.0, 0.1, 1.0, 0.0);
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+static int
+test02(int size, int num)
+{
+ int x, y;
+
+ glBegin(GL_LINES);
+ for (y = 0; y < num; y++)
+ for (x = 0; x < size; x++) {
+ glColor3f(0.0, 1.0, y / (float) num);
+ glVertex2i(0, size - 1);
+ glColor3f(1.0, 0.0, x / (float) size);
+ glVertex2i(x, x);
+ }
+ glEnd();
+
+ return num * size;
+}
+
+/***************************************************************************/
+
+static void
+init_test03(void)
+{
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glOrtho(-0.5, 639.5, -0.5, 479.5, 1.0, -1000.0 * 480.0);
+ glMatrixMode(GL_MODELVIEW);
+
+ glShadeModel(GL_SMOOTH);
+ glEnable(GL_DEPTH_TEST);
+
+ glClearColor(0.0, 0.1, 1.0, 0.0);
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+}
+
+static int
+test03(int size, int num)
+{
+ int x, y, z;
+
+ glBegin(GL_TRIANGLES);
+ for (y = 0; y < num; y++)
+ for (x = 0; x < size; x += 5) {
+ z = num * size - (y * size + x);
+ glColor3f(0.0, 1.0, 0.0);
+ glVertex3i(0, x, z);
+
+ glColor3f(1.0, 0.0, x / (float) size);
+ glVertex3i(size - 1 - x, 0, z);
+
+ glColor3f(1.0, x / (float) size, 0.0);
+ glVertex3i(x, size - 1 - x, z);
+ }
+ glEnd();
+
+ return size * num / 5;
+}
+
+/***************************************************************************/
+
+static void
+init_test04(void)
+{
+ int x, y;
+ GLubyte tex[128 * 128 * 3];
+ GLenum gluerr;
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glOrtho(-0.5, 639.5, -0.5, 479.5, 1.0, -1000.0 * 480.0);
+
+ glMatrixMode(GL_MODELVIEW);
+
+ glShadeModel(GL_SMOOTH);
+ glEnable(GL_DEPTH_TEST);
+
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ for (y = 0; y < 128; y++)
+ for (x = 0; x < 128; x++) {
+ tex[(x + y * 128) * 3 + 0] = ((x % (128 / 4)) < (128 / 8)) ? 255 : 0;
+ tex[(x + y * 128) * 3 + 1] = ((y % (128 / 4)) < (128 / 8)) ? 255 : 0;
+ tex[(x + y * 128) * 3 + 2] = x;
+ }
+
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ if ((gluerr = gluBuild2DMipmaps(GL_TEXTURE_2D, 3, 128, 128, GL_RGB,
+ GL_UNSIGNED_BYTE, (GLvoid *) (&tex[0])))) {
+ fprintf(stderr, "GLULib%s\n", (char *) gluErrorString(gluerr));
+ exit(-1);
+ }
+
+ 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_MIN_FILTER,
+ GL_LINEAR_MIPMAP_NEAREST);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ glEnable(GL_TEXTURE_2D);
+
+ glClearColor(0.0, 0.1, 1.0, 0.0);
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+}
+
+static int
+test04(int size, int num)
+{
+ int x, y, z;
+
+ glBegin(GL_TRIANGLES);
+ for (y = 0; y < num; y++)
+ for (x = 0; x < size; x += 5) {
+ z = num * size - (y * size + x);
+ glTexCoord2f(1.0, 1.0);
+ glColor3f(1.0, 0.0, 0.0);
+ glVertex3i(0, x, z);
+
+ glTexCoord2f(0.0, 1.0);
+ glColor3f(0.0, 1.0, 0.0);
+ glVertex3i(size - 1 - x, 0, z);
+
+ glTexCoord2f(1.0, 0.0);
+ glColor3f(0.0, 0.0, 1.0);
+ glVertex3i(x, size - 1 - x, z);
+ }
+ glEnd();
+
+ return num * size / 5;
+}
+
+/***************************************************************************/
+
+static void
+init_test05(void)
+{
+ int x, y;
+ GLubyte tex[128 * 128 * 3];
+ GLenum gluerr;
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glOrtho(-0.5, 639.5, -0.5, 479.5, -1.0, 1.0);
+
+ glMatrixMode(GL_MODELVIEW);
+
+ glShadeModel(GL_SMOOTH);
+ glEnable(GL_DEPTH_TEST);
+
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ for (y = 0; y < 128; y++)
+ for (x = 0; x < 128; x++) {
+ tex[(x + y * 128) * 3 + 0] = ((x % (128 / 4)) < (128 / 8)) ? 255 : 0;
+ tex[(x + y * 128) * 3 + 1] = ((y % (128 / 4)) < (128 / 8)) ? 255 : 0;
+ tex[(x + y * 128) * 3 + 2] = x;
+ }
+
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ if ((gluerr = gluBuild2DMipmaps(GL_TEXTURE_2D, 3, 128, 128, GL_RGB,
+ GL_UNSIGNED_BYTE, (GLvoid *) (&tex[0])))) {
+ fprintf(stderr, "GLULib%s\n", (char *) gluErrorString(gluerr));
+ exit(-1);
+ }
+
+ 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_MIN_FILTER,
+ GL_LINEAR_MIPMAP_NEAREST);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ glEnable(GL_TEXTURE_2D);
+
+ glDepthFunc(GL_ALWAYS);
+
+ glClearColor(0.0, 0.1, 1.0, 0.0);
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+}
+
+static int
+test05(int size, int num)
+{
+ int y;
+ float v0[3], v1[3], v2[3], v3[3];
+ float cv0[3], cv1[3], cv2[3], cv3[3];
+ float tv0[3], tv1[3], tv2[3], tv3[3];
+
+ v0[0] = 320 - size / 2;
+ v0[1] = 240 - size / 2;
+ v0[2] = 0.0;
+ v1[0] = 320 + size / 2;
+ v1[1] = 240 - size / 2;
+ v1[2] = 0.0;
+ v2[0] = 320 - size / 2;
+ v2[1] = 240 + size / 2;
+ v2[2] = 0.0;
+ v3[0] = 320 + size / 2;
+ v3[1] = 240 + size / 2;
+ v3[2] = 0.0;
+ cv0[0] = 1.0;
+ cv0[1] = 0.0;
+ cv0[2] = 0.0;
+ cv1[0] = 1.0;
+ cv1[1] = 1.0;
+ cv1[2] = 0.0;
+ cv2[0] = 1.0;
+ cv2[1] = 0.0;
+ cv2[2] = 1.0;
+ cv3[0] = 1.0;
+ cv3[1] = 1.0;
+ cv3[2] = 1.0;
+ tv0[0] = 0.0;
+ tv0[1] = 0.0;
+ tv0[2] = 0.0;
+ tv1[0] = 1.0;
+ tv1[1] = 0.0;
+ tv1[2] = 0.0;
+ tv2[0] = 0.0;
+ tv2[1] = 1.0;
+ tv2[2] = 0.0;
+ tv3[0] = 1.0;
+ tv3[1] = 1.0;
+ tv3[2] = 0.0;
+
+ glBegin(GL_TRIANGLE_STRIP);
+ for (y = 0; y < num; y++) {
+ glColor3fv(cv0);
+ glTexCoord2fv(tv0);
+ glVertex3fv(v0);
+
+ glColor3fv(cv1);
+ glTexCoord2fv(tv1);
+ glVertex3fv(v1);
+
+ glColor3fv(cv2);
+ glTexCoord2fv(tv2);
+ glVertex3fv(v2);
+
+ glColor3fv(cv3);
+ glTexCoord2fv(tv3);
+ glVertex3fv(v3);
+ }
+ glEnd();
+
+ return 4 * num - 2;
+}
+
+/***************************************************************************/
+
+static void
+init_test06(void)
+{
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluOrtho2D(-0.5, 639.5, -0.5, 479.5);
+ glMatrixMode(GL_MODELVIEW);
+
+ glShadeModel(GL_SMOOTH);
+ glEnable(GL_DEPTH_TEST);
+
+ glClearColor(0.0, 0.1, 1.0, 0.0);
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+}
+
+static int
+test06(int size, int num)
+{
+ int y;
+
+ for (y = 0; y < num; y++) {
+ glClearColor(y / (float) num, 0.1, 1.0, 0.0);
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ }
+
+ return num;
+}
+
+/***************************************************************************/
+
+#define BMARKS_TIME 5.0
+
+#define NUM_BMARKS 6
+
+/* 554 ~= sqrt(640*480) */
+
+static benchmark bmarks[NUM_BMARKS] = {
+ {"Simple Points", "Pnts", init_test01, test01, 0, 0,
+ {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
+ {"Smooth Lines", "Lins", init_test02, test02, 1, 5,
+ {480, 250, 100, 50, 25, 0, 0, 0, 0, 0}},
+ {"ZSmooth Triangles", "Tris", init_test03, test03, 1, 5,
+ {480, 250, 100, 50, 25, 0, 0, 0, 0, 0}},
+ {"ZSmooth Tex Blend Triangles", "Tris", init_test04, test04, 1, 5,
+ {480, 250, 100, 50, 25, 0, 0, 0, 0, 0}},
+ {"ZSmooth Tex Blend TMesh Triangles", "Tris", init_test05, test05, 2, 8,
+ {400, 250, 100, 50, 25, 10, 5, 2, 0, 0}},
+ {"Color/Depth Buffer Clears", "Clrs", init_test06, test06, 3, 0,
+ {554, 0, 0, 0, 0, 0, 0, 0, 0, 0}}
+};
+
+/***************************************************************************/
+
+static void
+dotest0param(benchmark * bmark)
+{
+ float stime, etime, dtime, tottime, maxtime, mintime;
+ int num, numelem, calibnum, j;
+
+ glPushAttrib(GL_ALL_ATTRIB_BITS);
+ bmark->init();
+
+ stime = glutGet(GLUT_ELAPSED_TIME);
+
+ dtime = 0.0;
+ calibnum = 0;
+ while (dtime < 2.0) {
+ bmark->run(0, 1);
+ glFinish();
+ etime = glutGet(GLUT_ELAPSED_TIME);
+ dtime = (etime - stime) / 1000.0;
+ calibnum++;
+ }
+ glPopAttrib();
+
+ fprintf(stderr, "Elapsed time for the calibration test (%d): %f\n",
+ calibnum, dtime);
+
+ num = (int) ((BMARKS_TIME / dtime) * calibnum);
+
+ if (num < 1)
+ num = 1;
+
+ fprintf(stderr, "Selected number of benchmark iterations: %d\n", num);
+
+ mintime = HUGE_VAL;
+ maxtime = -HUGE_VAL;
+
+ for (tottime = 0.0, j = 0; j < 5; j++) {
+ glPushAttrib(GL_ALL_ATTRIB_BITS);
+ bmark->init();
+
+ stime = glutGet(GLUT_ELAPSED_TIME);
+ numelem = bmark->run(0, num);
+ glFinish();
+ etime = glutGet(GLUT_ELAPSED_TIME);
+
+ glPopAttrib();
+
+ dtime = (etime - stime) / 1000.0;
+ tottime += dtime;
+
+ fprintf(stderr, "Elapsed time for run %d: %f\n", j, dtime);
+
+ if (dtime < mintime)
+ mintime = dtime;
+ if (dtime > maxtime)
+ maxtime = dtime;
+ }
+
+ tottime -= mintime + maxtime;
+
+ fprintf(stdout, "%s\n%f %s/sec", bmark->name, numelem / (tottime / 3.0),
+ bmark->unit);
+
+ if (bmark->type == 3)
+ fprintf(stdout, ", MPixel Fill/sec: %f\n\n",
+ (numelem * bmark->size[0] * (float) bmark->size[0]) /
+ (1000000.0 * tottime / 3.0));
+ else
+ fprintf(stdout, "\n\n");
+}
+
+/***************************************************************************/
+
+static void
+dotest1param(benchmark * bmark)
+{
+ float stime, etime, dtime, tottime, maxtime, mintime;
+ int num, numelem, calibnum, j, k;
+
+ fprintf(stdout, "%s\n", bmark->name);
+
+ for (j = 0; j < bmark->numsize; j++) {
+ fprintf(stderr, "Current size: %d\n", bmark->size[j]);
+
+ glPushAttrib(GL_ALL_ATTRIB_BITS);
+ bmark->init();
+
+ stime = glutGet(GLUT_ELAPSED_TIME);
+
+ dtime = 0.0;
+ calibnum = 0;
+ while (dtime < 2.0) {
+ bmark->run(bmark->size[j], 1);
+ glFinish();
+ etime = glutGet(GLUT_ELAPSED_TIME);
+ dtime = (etime - stime) / 1000.0;
+ calibnum++;
+ }
+ glPopAttrib();
+
+ fprintf(stderr, "Elapsed time for the calibration test (%d): %f\n",
+ calibnum, dtime);
+
+ num = (int) ((BMARKS_TIME / dtime) * calibnum);
+
+ if (num < 1)
+ num = 1;
+
+ fprintf(stderr, "Selected number of benchmark iterations: %d\n", num);
+
+ mintime = HUGE_VAL;
+ maxtime = -HUGE_VAL;
+
+ for (numelem = 1, tottime = 0.0, k = 0; k < 5; k++) {
+ glPushAttrib(GL_ALL_ATTRIB_BITS);
+ bmark->init();
+
+ stime = glutGet(GLUT_ELAPSED_TIME);
+ numelem = bmark->run(bmark->size[j], num);
+ glFinish();
+ etime = glutGet(GLUT_ELAPSED_TIME);
+
+ glPopAttrib();
+
+ dtime = (etime - stime) / 1000.0;
+ tottime += dtime;
+
+ fprintf(stderr, "Elapsed time for run %d: %f\n", k, dtime);
+
+ if (dtime < mintime)
+ mintime = dtime;
+ if (dtime > maxtime)
+ maxtime = dtime;
+ }
+
+ tottime -= mintime + maxtime;
+
+ fprintf(stdout, "SIZE=%03d => %f %s/sec", bmark->size[j],
+ numelem / (tottime / 3.0), bmark->unit);
+ if (bmark->type == 2)
+ fprintf(stdout, ", MPixel Fill/sec: %f\n",
+ (numelem * bmark->size[j] * bmark->size[j] / 2) /
+ (1000000.0 * tottime / 3.0));
+ else
+ fprintf(stdout, "\n");
+ }
+
+ fprintf(stdout, "\n\n");
+}
+
+/***************************************************************************/
+
+static void
+display(void)
+{
+ int i;
+
+ if (frontbuffer)
+ glDrawBuffer(GL_FRONT);
+ else
+ glDrawBuffer(GL_BACK);
+
+ for (i = 0; i < NUM_BMARKS; i++) {
+ fprintf(stderr, "Benchmark: %d\n", i);
+
+ switch (bmarks[i].type) {
+ case 0:
+ case 3:
+ dotest0param(&bmarks[i]);
+ break;
+ case 1:
+ case 2:
+ dotest1param(&bmarks[i]);
+ break;
+ }
+ }
+
+ exit(0);
+}
+
+int
+main(int ac, char **av)
+{
+ fprintf(stderr, "GLTest v1.0\nWritten by David Bucciarelli\n");
+
+ if (ac == 2)
+ frontbuffer = 0;
+
+ glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
+ glutInitWindowPosition(0, 0);
+ glutInitWindowSize(640, 480);
+ glutCreateWindow("OpenGL/Mesa Performances");
+ glutDisplayFunc(display);
+ glutMainLoop();
+
+ return 0;
+}
diff --git a/progs/demos/glutfx.c b/progs/demos/glutfx.c
new file mode 100644
index 00000000000..8bf55823897
--- /dev/null
+++ b/progs/demos/glutfx.c
@@ -0,0 +1,189 @@
+
+/*
+ * Example of how one might use GLUT with the 3Dfx driver in full-screen mode.
+ * Note: this only works with X since we're using Mesa's GLX "hack" for
+ * using Glide.
+ *
+ * Goals:
+ * easy setup and input event handling with GLUT
+ * use 3Dfx hardware
+ * automatically set MESA environment variables
+ * don't lose mouse input focus
+ *
+ * Brian Paul This file is in the public domain.
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <GL/glut.h>
+
+
+#define WIDTH 640
+#define HEIGHT 480
+
+
+static int Window = 0;
+static int ScreenWidth, ScreenHeight;
+static GLuint Torus = 0;
+static GLfloat Xrot = 0.0, Yrot = 0.0;
+
+
+
+static void Display( void )
+{
+ static GLfloat blue[4] = {0.2, 0.2, 1.0, 1.0};
+ static GLfloat red[4] = {1.0, 0.2, 0.2, 1.0};
+ static GLfloat green[4] = {0.2, 1.0, 0.2, 1.0};
+
+ glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+
+ glPushMatrix();
+ glRotatef(Xrot, 1, 0, 0);
+ glRotatef(Yrot, 0, 1, 0);
+
+ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, blue);
+ glCallList(Torus);
+
+ glRotatef(90.0, 1, 0, 0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, red);
+ glCallList(Torus);
+
+ glRotatef(90.0, 0, 1, 0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, green);
+ glCallList(Torus);
+
+ glPopMatrix();
+
+ glutSwapBuffers();
+}
+
+
+static void Reshape( int width, int height )
+{
+ float ratio = (float) width / (float) height;
+
+ ScreenWidth = width;
+ ScreenHeight = height;
+
+ /*
+ * The 3Dfx driver is limited to 640 x 480 but the X window may be larger.
+ * Enforce that here.
+ */
+ if (width > WIDTH)
+ width = WIDTH;
+ if (height > HEIGHT)
+ height = HEIGHT;
+
+ glViewport( 0, 0, width, height );
+ glMatrixMode( GL_PROJECTION );
+ glLoadIdentity();
+ glFrustum( -ratio, ratio, -1.0, 1.0, 5.0, 30.0 );
+ glMatrixMode( GL_MODELVIEW );
+ glLoadIdentity();
+ glTranslatef( 0.0, 0.0, -20.0 );
+}
+
+
+static void Key( unsigned char key, int x, int y )
+{
+ (void) x;
+ (void) y;
+ switch (key) {
+ case 27:
+ glutDestroyWindow(Window);
+ exit(0);
+ break;
+ }
+ glutPostRedisplay();
+}
+
+
+static void SpecialKey( int key, int x, int y )
+{
+ (void) x;
+ (void) y;
+ switch (key) {
+ case GLUT_KEY_UP:
+ break;
+ case GLUT_KEY_DOWN:
+ break;
+ case GLUT_KEY_LEFT:
+ break;
+ case GLUT_KEY_RIGHT:
+ break;
+ }
+ glutPostRedisplay();
+}
+
+
+static void MouseMove( int x, int y )
+{
+ Xrot = y - ScreenWidth / 2;
+ Yrot = x - ScreenHeight / 2;
+ glutPostRedisplay();
+}
+
+
+static void Init( void )
+{
+ Torus = glGenLists(1);
+ glNewList(Torus, GL_COMPILE);
+ glutSolidTorus(0.5, 2.0, 10, 20);
+ glEndList();
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+}
+
+
+int main( int argc, char *argv[] )
+{
+#ifndef _WIN32
+ printf("NOTE: if you've got 3Dfx VooDoo hardware you must run this");
+ printf(" program as root.\n\n");
+ printf("Move the mouse. Press ESC to exit.\n\n");
+#endif
+
+ /* Tell Mesa GLX to use 3Dfx driver in fullscreen mode. */
+ putenv("MESA_GLX_FX=fullscreen");
+
+ /* Disable 3Dfx Glide splash screen */
+ putenv("FX_GLIDE_NO_SPLASH=");
+
+ /* Give an initial size and position so user doesn't have to place window */
+ glutInitWindowPosition(0, 0);
+ glutInitWindowSize(WIDTH, HEIGHT);
+ glutInit( &argc, argv );
+
+ glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH );
+
+ Window = glutCreateWindow(argv[0]);
+ if (!Window) {
+ printf("Error, couldn't open window\n");
+ exit(1);
+ }
+
+ /*
+ * Want the X window to fill the screen so that we don't have to
+ * worry about losing the mouse input focus.
+ * Note that we won't actually see the X window since we never draw
+ * to it, hence, the original X screen's contents aren't disturbed.
+ */
+ glutFullScreen();
+
+ Init();
+
+ glutReshapeFunc( Reshape );
+ glutKeyboardFunc( Key );
+ glutSpecialFunc( SpecialKey );
+ glutDisplayFunc( Display );
+ glutPassiveMotionFunc( MouseMove );
+
+ glutMainLoop();
+ return 0;
+}
diff --git a/progs/demos/ipers.c b/progs/demos/ipers.c
new file mode 100644
index 00000000000..6e153c04e15
--- /dev/null
+++ b/progs/demos/ipers.c
@@ -0,0 +1,712 @@
+/*
+ * This program is under the GNU GPL.
+ * Use at your own risk.
+ *
+ * written by David Bucciarelli ([email protected])
+ * Humanware s.r.l.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <string.h>
+
+#if defined (WIN32)|| defined(_WIN32)
+#include <windows.h>
+#include <mmsystem.h>
+#endif
+
+#include <GL/glut.h>
+
+#include "readtex.h"
+
+#ifdef XMESA
+#include "GL/xmesa.h"
+static int fullscreen = 1;
+#endif
+
+static int WIDTH = 640;
+static int HEIGHT = 480;
+
+static GLint T0;
+static GLint Frames;
+
+#define MAX_LOD 9
+
+#define TEX_SKY_WIDTH 256
+#define TEX_SKY_HEIGHT TEX_SKY_WIDTH
+
+#ifndef M_PI
+#define M_PI 3.1415926535
+#endif
+
+#define FROM_NONE 0
+#define FROM_DOWN 1
+#define FROM_UP 2
+#define FROM_LEFT 3
+#define FROM_RIGHT 4
+#define FROM_FRONT 5
+#define FROM_BACK 6
+
+static int win = 0;
+
+static float obs[3] = { 3.8, 0.0, 0.0 };
+static float dir[3];
+static float v = 0.0;
+static float alpha = -90.0;
+static float beta = 90.0;
+
+static int fog = 1;
+static int bfcull = 1;
+static int usetex = 1;
+static int help = 1;
+static int poutline = 0;
+static int normext = 1;
+static int joyavailable = 0;
+static int joyactive = 0;
+static int LODbias = 3;
+static int maxdepth = MAX_LOD;
+
+static unsigned int totpoly = 0;
+
+static GLuint t1id, t2id;
+static GLuint skydlist, LODdlist[MAX_LOD], LODnumpoly[MAX_LOD];
+
+static void
+initlight(void)
+{
+ GLfloat lspec[4] = { 1.0, 1.0, 1.0, 1.0 };
+ static GLfloat lightpos[4] = { 30, 15.0, 30.0, 1.0 };
+
+ glLightfv(GL_LIGHT0, GL_POSITION, lightpos);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, lspec);
+
+ glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 32.0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, lspec);
+}
+
+static void
+initdlists(void)
+{
+ static int slicetable[MAX_LOD][2] = {
+ {21, 10},
+ {18, 9},
+ {15, 8},
+ {12, 7},
+ {9, 6},
+ {7, 5},
+ {5, 4},
+ {4, 3},
+ {3, 2}
+ };
+ GLUquadricObj *obj;
+ int i, xslices, yslices;
+
+ obj = gluNewQuadric();
+
+ skydlist = glGenLists(1);
+ glNewList(skydlist, GL_COMPILE);
+ glBindTexture(GL_TEXTURE_2D, t2id);
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+ glColor3f(1.0f, 1.0f, 1.0f);
+
+ gluQuadricDrawStyle(obj, GLU_FILL);
+ gluQuadricNormals(obj, GLU_NONE);
+ gluQuadricTexture(obj, GL_TRUE);
+ gluQuadricOrientation(obj, GLU_INSIDE);
+ gluSphere(obj, 40.0f, 18, 9);
+
+ glEndList();
+
+ for (i = 0; i < MAX_LOD; i++) {
+ LODdlist[i] = glGenLists(1);
+ glNewList(LODdlist[i], GL_COMPILE);
+
+ gluQuadricDrawStyle(obj, GLU_FILL);
+ gluQuadricNormals(obj, GLU_SMOOTH);
+ gluQuadricTexture(obj, GL_TRUE);
+ gluQuadricOrientation(obj, GLU_OUTSIDE);
+ xslices = slicetable[i][0];
+ yslices = slicetable[i][1];
+ gluSphere(obj, 1.0f, xslices, yslices);
+ LODnumpoly[i] = xslices * (yslices - 2) + 2 * (xslices - 1);
+
+ glEndList();
+ }
+}
+
+static void
+inittextures(void)
+{
+ GLubyte tsky[TEX_SKY_HEIGHT][TEX_SKY_WIDTH][3];
+ GLuint x, y;
+ GLfloat fact;
+ GLenum gluerr;
+
+ /* Brick */
+
+ glGenTextures(1, &t1id);
+ glBindTexture(GL_TEXTURE_2D, t1id);
+
+ if (!LoadRGBMipmaps("../images/bw.rgb", 3)) {
+ fprintf(stderr, "Error reading a texture.\n");
+ exit(-1);
+ }
+
+ 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_MIN_FILTER,
+ GL_LINEAR_MIPMAP_LINEAR);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+
+ /* Sky */
+
+ glGenTextures(1, &t2id);
+ glBindTexture(GL_TEXTURE_2D, t2id);
+
+ for (y = 0; y < TEX_SKY_HEIGHT; y++)
+ for (x = 0; x < TEX_SKY_WIDTH; x++)
+ if (y < TEX_SKY_HEIGHT / 2) {
+ fact = y / (GLfloat) (TEX_SKY_HEIGHT / 2);
+ tsky[y][x][0] =
+ (GLubyte) (255.0f * (0.1f * fact + 0.3f * (1.0f - fact)));
+ tsky[y][x][1] =
+ (GLubyte) (255.0f * (0.2f * fact + 1.0f * (1.0f - fact)));
+ tsky[y][x][2] = 255;
+ }
+ else {
+ tsky[y][x][0] = tsky[TEX_SKY_HEIGHT - y - 1][x][0];
+ tsky[y][x][1] = tsky[TEX_SKY_HEIGHT - y - 1][x][1];
+ tsky[y][x][2] = 255;
+ }
+
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ if (
+ (gluerr =
+ gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TEX_SKY_WIDTH, TEX_SKY_HEIGHT,
+ GL_RGB, GL_UNSIGNED_BYTE, (GLvoid *) (tsky)))) {
+ fprintf(stderr, "GLULib%s\n", (char *) gluErrorString(gluerr));
+ exit(-1);
+ }
+
+ 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_MIN_FILTER,
+ GL_LINEAR_MIPMAP_LINEAR);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+}
+
+static void
+calcposobs(void)
+{
+ dir[0] = sin(alpha * M_PI / 180.0);
+ dir[1] = cos(alpha * M_PI / 180.0) * sin(beta * M_PI / 180.0);
+ dir[2] = cos(beta * M_PI / 180.0);
+
+ if (dir[0] < 1.0e-5 && dir[0] > -1.0e-5)
+ dir[0] = 0;
+ if (dir[1] < 1.0e-5 && dir[1] > -1.0e-5)
+ dir[1] = 0;
+ if (dir[2] < 1.0e-5 && dir[2] > -1.0e-5)
+ dir[2] = 0;
+
+ obs[0] += v * dir[0];
+ obs[1] += v * dir[1];
+ obs[2] += v * dir[2];
+}
+
+static void
+special(int k, int x, int y)
+{
+ switch (k) {
+ case GLUT_KEY_LEFT:
+ alpha -= 2.0;
+ break;
+ case GLUT_KEY_RIGHT:
+ alpha += 2.0;
+ break;
+ case GLUT_KEY_DOWN:
+ beta -= 2.0;
+ break;
+ case GLUT_KEY_UP:
+ beta += 2.0;
+ break;
+ }
+}
+
+static void
+key(unsigned char k, int x, int y)
+{
+ switch (k) {
+ case 27:
+ exit(0);
+ break;
+
+ case 'a':
+ v += 0.01;
+ break;
+ case 'z':
+ v -= 0.01;
+ break;
+
+#ifdef XMESA
+ case ' ':
+ fullscreen = (!fullscreen);
+ XMesaSetFXmode(fullscreen ? XMESA_FX_FULLSCREEN : XMESA_FX_WINDOW);
+ break;
+#endif
+
+ case '+':
+ LODbias--;
+ break;
+ case '-':
+ LODbias++;
+ break;
+ case 'j':
+ joyactive = (!joyactive);
+ break;
+ case 'h':
+ help = (!help);
+ break;
+ case 'f':
+ fog = (!fog);
+ break;
+ case 't':
+ usetex = (!usetex);
+ break;
+ case 'n':
+ normext = (!normext);
+ break;
+ case 'b':
+ if (bfcull) {
+ glDisable(GL_CULL_FACE);
+ bfcull = 0;
+ }
+ else {
+ glEnable(GL_CULL_FACE);
+ bfcull = 1;
+ }
+ break;
+ case 'p':
+ if (poutline) {
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ poutline = 0;
+ usetex = 1;
+ }
+ else {
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ poutline = 1;
+ usetex = 0;
+ }
+ break;
+ }
+}
+
+static void
+reshape(int w, int h)
+{
+ WIDTH = w;
+ HEIGHT = h;
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(90.0, w / (float) h, 0.8, 100.0);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glViewport(0, 0, w, h);
+}
+
+static void
+printstring(void *font, char *string)
+{
+ int len, i;
+
+ len = (int) strlen(string);
+ for (i = 0; i < len; i++)
+ glutBitmapCharacter(font, string[i]);
+}
+
+static void
+printhelp(void)
+{
+ glEnable(GL_BLEND);
+ glColor4f(0.5, 0.5, 0.5, 0.5);
+ glRecti(40, 40, 600, 440);
+ glDisable(GL_BLEND);
+
+ glColor3f(1.0, 0.0, 0.0);
+ glRasterPos2i(300, 420);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24, "Help");
+
+ glRasterPos2i(60, 390);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24, "h - Toggle Help");
+ glRasterPos2i(60, 360);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24, "t - Toggle Textures");
+ glRasterPos2i(60, 330);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24, "f - Toggle Fog");
+ glRasterPos2i(60, 300);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24, "b - Toggle Back face culling");
+ glRasterPos2i(60, 270);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24, "Arrow Keys - Rotate");
+ glRasterPos2i(60, 240);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24, "a - Increase velocity");
+ glRasterPos2i(60, 210);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24, "z - Decrease velocity");
+ glRasterPos2i(60, 180);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24, "p - Toggle Wire frame");
+ glRasterPos2i(60, 150);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24,
+ "n - Toggle GL_EXT_rescale_normal extension");
+ glRasterPos2i(60, 120);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24,
+ "+/- - Increase/decrease the Object maximum LOD");
+
+ glRasterPos2i(60, 90);
+ if (joyavailable)
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24,
+ "j - Toggle jostick control (Joystick control available)");
+ else
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24,
+ "(No Joystick control available)");
+}
+
+static void
+dojoy(void)
+{
+#ifdef _WIN32
+ static UINT max[2] = { 0, 0 };
+ static UINT min[2] = { 0xffffffff, 0xffffffff }, center[2];
+ MMRESULT res;
+ JOYINFO joy;
+
+ res = joyGetPos(JOYSTICKID1, &joy);
+
+ if (res == JOYERR_NOERROR) {
+ joyavailable = 1;
+
+ if (max[0] < joy.wXpos)
+ max[0] = joy.wXpos;
+ if (min[0] > joy.wXpos)
+ min[0] = joy.wXpos;
+ center[0] = (max[0] + min[0]) / 2;
+
+ if (max[1] < joy.wYpos)
+ max[1] = joy.wYpos;
+ if (min[1] > joy.wYpos)
+ min[1] = joy.wYpos;
+ center[1] = (max[1] + min[1]) / 2;
+
+ if (joyactive) {
+ if (fabs(center[0] - (float) joy.wXpos) > 0.1 * (max[0] - min[0]))
+ alpha -=
+ 2.0 * (center[0] - (float) joy.wXpos) / (max[0] - min[0]);
+ if (fabs(center[1] - (float) joy.wYpos) > 0.1 * (max[1] - min[1]))
+ beta += 2.0 * (center[1] - (float) joy.wYpos) / (max[1] - min[1]);
+
+ if (joy.wButtons & JOY_BUTTON1)
+ v += 0.01;
+ if (joy.wButtons & JOY_BUTTON2)
+ v -= 0.01;
+ }
+ }
+ else
+ joyavailable = 0;
+#endif
+}
+
+static void
+drawipers(int depth, int from)
+{
+ int lod;
+
+ if (depth == maxdepth)
+ return;
+
+ lod = depth + LODbias;
+ if (lod < 0)
+ lod = 0;
+ if (lod >= MAX_LOD)
+ return;
+
+ switch (from) {
+ case FROM_NONE:
+ glCallList(LODdlist[lod]);
+
+ depth++;
+ drawipers(depth, FROM_DOWN);
+ drawipers(depth, FROM_UP);
+ drawipers(depth, FROM_FRONT);
+ drawipers(depth, FROM_BACK);
+ drawipers(depth, FROM_LEFT);
+ drawipers(depth, FROM_RIGHT);
+ break;
+ case FROM_FRONT:
+ glPushMatrix();
+ glTranslatef(0.0f, -1.5f, 0.0f);
+ glScalef(0.5f, 0.5f, 0.5f);
+
+ glCallList(LODdlist[lod]);
+
+ depth++;
+ drawipers(depth, FROM_DOWN);
+ drawipers(depth, FROM_UP);
+ drawipers(depth, FROM_FRONT);
+ drawipers(depth, FROM_LEFT);
+ drawipers(depth, FROM_RIGHT);
+ glPopMatrix();
+ break;
+ case FROM_BACK:
+ glPushMatrix();
+ glTranslatef(0.0f, 1.5f, 0.0f);
+ glScalef(0.5f, 0.5f, 0.5f);
+
+ glCallList(LODdlist[lod]);
+
+ depth++;
+ drawipers(depth, FROM_DOWN);
+ drawipers(depth, FROM_UP);
+ drawipers(depth, FROM_BACK);
+ drawipers(depth, FROM_LEFT);
+ drawipers(depth, FROM_RIGHT);
+ glPopMatrix();
+ break;
+ case FROM_LEFT:
+ glPushMatrix();
+ glTranslatef(-1.5f, 0.0f, 0.0f);
+ glScalef(0.5f, 0.5f, 0.5f);
+
+ glCallList(LODdlist[lod]);
+
+ depth++;
+ drawipers(depth, FROM_DOWN);
+ drawipers(depth, FROM_UP);
+ drawipers(depth, FROM_FRONT);
+ drawipers(depth, FROM_BACK);
+ drawipers(depth, FROM_LEFT);
+ glPopMatrix();
+ break;
+ case FROM_RIGHT:
+ glPushMatrix();
+ glTranslatef(1.5f, 0.0f, 0.0f);
+ glScalef(0.5f, 0.5f, 0.5f);
+
+ glCallList(LODdlist[lod]);
+
+ depth++;
+ drawipers(depth, FROM_DOWN);
+ drawipers(depth, FROM_UP);
+ drawipers(depth, FROM_FRONT);
+ drawipers(depth, FROM_BACK);
+ drawipers(depth, FROM_RIGHT);
+ glPopMatrix();
+ break;
+ case FROM_DOWN:
+ glPushMatrix();
+ glTranslatef(0.0f, 0.0f, 1.5f);
+ glScalef(0.5f, 0.5f, 0.5f);
+
+ glCallList(LODdlist[lod]);
+
+ depth++;
+ drawipers(depth, FROM_DOWN);
+ drawipers(depth, FROM_FRONT);
+ drawipers(depth, FROM_BACK);
+ drawipers(depth, FROM_LEFT);
+ drawipers(depth, FROM_RIGHT);
+ glPopMatrix();
+ break;
+ case FROM_UP:
+ glPushMatrix();
+ glTranslatef(0.0f, 0.0f, -1.5f);
+ glScalef(0.5f, 0.5f, 0.5f);
+
+ glCallList(LODdlist[lod]);
+
+ depth++;
+ drawipers(depth, FROM_UP);
+ drawipers(depth, FROM_FRONT);
+ drawipers(depth, FROM_BACK);
+ drawipers(depth, FROM_LEFT);
+ drawipers(depth, FROM_RIGHT);
+ glPopMatrix();
+ break;
+ }
+
+ totpoly += LODnumpoly[lod];
+}
+
+static void
+draw(void)
+{
+ static char frbuf[80] = "";
+ static GLfloat alpha = 0.0f;
+ static GLfloat beta = 0.0f;
+ static float fr = 0.0;
+ static double t0 = -1.;
+ double dt, t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
+ if (t0 < 0.0)
+ t0 = t;
+ dt = t - t0;
+ t0 = t;
+
+ dojoy();
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ if (usetex)
+ glEnable(GL_TEXTURE_2D);
+ else
+ glDisable(GL_TEXTURE_2D);
+
+ if (fog)
+ glEnable(GL_FOG);
+ else
+ glDisable(GL_FOG);
+
+ glPushMatrix();
+ calcposobs();
+ gluLookAt(obs[0], obs[1], obs[2],
+ obs[0] + dir[0], obs[1] + dir[1], obs[2] + dir[2],
+ 0.0, 0.0, 1.0);
+
+ /* Scene */
+ glEnable(GL_DEPTH_TEST);
+
+ glShadeModel(GL_SMOOTH);
+ glBindTexture(GL_TEXTURE_2D, t1id);
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ glColor3f(1.0f, 1.0f, 1.0f);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_LIGHTING);
+
+ if (normext)
+ glEnable(GL_RESCALE_NORMAL_EXT);
+ else
+ glEnable(GL_NORMALIZE);
+
+ glPushMatrix();
+ glRotatef(alpha, 0.0f, 0.0f, 1.0f);
+ glRotatef(beta, 1.0f, 0.0f, 0.0f);
+ totpoly = 0;
+ drawipers(0, FROM_NONE);
+ glPopMatrix();
+
+ alpha += 4.f * dt;
+ beta += 2.4f * dt;
+
+ glDisable(GL_LIGHTING);
+ glDisable(GL_LIGHT0);
+ glShadeModel(GL_FLAT);
+
+ if (normext)
+ glDisable(GL_RESCALE_NORMAL_EXT);
+ else
+ glDisable(GL_NORMALIZE);
+
+ glCallList(skydlist);
+
+ glPopMatrix();
+
+ /* Help Screen */
+
+ sprintf(frbuf,
+ "Frame rate: %0.2f LOD: %d Tot. poly.: %d Poly/sec: %.1f",
+ fr, LODbias, totpoly, totpoly * fr);
+
+ glDisable(GL_TEXTURE_2D);
+ glDisable(GL_FOG);
+ glShadeModel(GL_FLAT);
+ glDisable(GL_DEPTH_TEST);
+
+ glMatrixMode(GL_PROJECTION);
+ glPushMatrix();
+ glLoadIdentity();
+ glOrtho(-0.5, 639.5, -0.5, 479.5, -1.0, 1.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ glColor3f(1.0, 0.0, 0.0);
+ glRasterPos2i(10, 10);
+ printstring(GLUT_BITMAP_HELVETICA_18, frbuf);
+ glRasterPos2i(350, 470);
+ printstring(GLUT_BITMAP_HELVETICA_10,
+ "IperS V1.0 Written by David Bucciarelli ([email protected])");
+
+ if (help)
+ printhelp();
+
+ glMatrixMode(GL_PROJECTION);
+ glPopMatrix();
+ glMatrixMode(GL_MODELVIEW);
+
+ glutSwapBuffers();
+
+ Frames++;
+ {
+ GLint t = glutGet(GLUT_ELAPSED_TIME);
+ if (t - T0 >= 2000) {
+ GLfloat seconds = (t - T0) / 1000.0;
+ fr = Frames / seconds;
+ T0 = t;
+ Frames = 0;
+ }
+ }
+}
+
+int
+main(int ac, char **av)
+{
+ float fogcolor[4] = { 0.7, 0.7, 0.7, 1.0 };
+
+ fprintf(stderr,
+ "IperS V1.0\nWritten by David Bucciarelli ([email protected])\n");
+
+ glutInitWindowPosition(0, 0);
+ glutInitWindowSize(WIDTH, HEIGHT);
+ glutInit(&ac, av);
+
+ glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
+
+ if (!(win = glutCreateWindow("IperS"))) {
+ fprintf(stderr, "Error, couldn't open window\n");
+ exit(-1);
+ }
+
+ reshape(WIDTH, HEIGHT);
+
+ glShadeModel(GL_SMOOTH);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+ glEnable(GL_TEXTURE_2D);
+
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ glEnable(GL_FOG);
+ glFogi(GL_FOG_MODE, GL_EXP2);
+ glFogfv(GL_FOG_COLOR, fogcolor);
+
+ glFogf(GL_FOG_DENSITY, 0.006);
+
+ glHint(GL_FOG_HINT, GL_NICEST);
+
+ inittextures();
+ initdlists();
+ initlight();
+
+ glClearColor(fogcolor[0], fogcolor[1], fogcolor[2], fogcolor[3]);
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ calcposobs();
+
+ glutReshapeFunc(reshape);
+ glutDisplayFunc(draw);
+ glutKeyboardFunc(key);
+ glutSpecialFunc(special);
+ glutIdleFunc(draw);
+
+ glutMainLoop();
+
+ return 0;
+}
diff --git a/progs/demos/isosurf.c b/progs/demos/isosurf.c
new file mode 100644
index 00000000000..0710bc6047b
--- /dev/null
+++ b/progs/demos/isosurf.c
@@ -0,0 +1,1125 @@
+
+/*
+ * Display an isosurface of 3-D wind speed volume.
+ *
+ * Command line options:
+ * -info print GL implementation information
+ *
+ * Brian Paul This file in public domain.
+ */
+
+
+/* Keys:
+ * =====
+ *
+ * - Arrow keys to rotate
+ * - 's' toggles smooth shading
+ * - 'l' toggles lighting
+ * - 'f' toggles fog
+ * - 'I' and 'i' zoom in and out
+ * - 'c' toggles a user clip plane
+ * - 'm' toggles colorful materials in GL_TRIANGLES modes.
+ * - '+' and '-' move the user clip plane
+ *
+ * Other options are available via the popup menu.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#ifdef _WIN32
+#include <windows.h>
+#undef CLIP_MASK
+#endif
+#define GL_GLEXT_PROTOTYPES
+#include "GL/glut.h"
+
+#include "readtex.h"
+#define TEXTURE_FILE "../images/reflect.rgb"
+
+#define LIT 0x00000001
+#define UNLIT 0x00000002
+#define REFLECT 0x00000004
+#define POINT_FILTER 0x00000008
+#define LINEAR_FILTER 0x00000010
+#define GLVERTEX 0x00000020
+#define DRAW_ELTS 0x00000040
+#define DRAW_ARRAYS 0x00000080
+#define ARRAY_ELT 0x00000100
+#define LOCKED 0x00000200
+#define UNLOCKED 0x00000400
+#define IMMEDIATE 0x00000800
+#define DISPLAYLIST 0x00001000
+#define SHADE_SMOOTH 0x00002000
+#define SHADE_FLAT 0x00004000
+#define TRIANGLES 0x00008000
+#define STRIPS 0x00010000
+#define POINTS 0x00020000
+#define USER_CLIP 0x00040000
+#define NO_USER_CLIP 0x00080000
+#define MATERIALS 0x00100000
+#define NO_MATERIALS 0x00200000
+#define FOG 0x00400000
+#define NO_FOG 0x00800000
+#define QUIT 0x01000000
+#define GLINFO 0x02000000
+#define STIPPLE 0x04000000
+#define NO_STIPPLE 0x08000000
+#define POLYGON_FILL 0x10000000
+#define POLYGON_LINE 0x20000000
+
+#define LIGHT_MASK (LIT|UNLIT|REFLECT)
+#define FILTER_MASK (POINT_FILTER|LINEAR_FILTER)
+#define RENDER_STYLE_MASK (GLVERTEX|DRAW_ARRAYS|DRAW_ELTS|ARRAY_ELT)
+#define DLIST_MASK (IMMEDIATE|DISPLAYLIST)
+#define LOCK_MASK (LOCKED|UNLOCKED)
+#define MATERIAL_MASK (MATERIALS|NO_MATERIALS)
+#define PRIMITIVE_MASK (TRIANGLES|STRIPS|POINTS)
+#define CLIP_MASK (USER_CLIP|NO_USER_CLIP)
+#define SHADE_MASK (SHADE_SMOOTH|SHADE_FLAT)
+#define FOG_MASK (FOG|NO_FOG)
+#define STIPPLE_MASK (STIPPLE|NO_STIPPLE)
+#define POLYGON_MASK (POLYGON_FILL|POLYGON_LINE)
+
+#define MAXVERTS 10000
+static GLint maxverts = MAXVERTS;
+static float data[MAXVERTS][6];
+static float compressed_data[MAXVERTS][6];
+static float expanded_data[MAXVERTS*3][6];
+static GLuint indices[MAXVERTS];
+static GLuint tri_indices[MAXVERTS*3];
+static GLuint strip_indices[MAXVERTS];
+static GLfloat col[100][4];
+static GLint numverts, num_tri_verts, numuniq;
+
+static GLfloat xrot;
+static GLfloat yrot;
+static GLfloat dist;
+static GLint state, allowed = ~0;
+static GLboolean doubleBuffer = GL_TRUE;
+static GLdouble plane[4];
+static GLuint surf1, dlist_state;
+
+static GLboolean PrintInfo = GL_FALSE;
+
+
+static GLubyte halftone[] = {
+ 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};
+
+
+static void read_surface( char *filename )
+{
+ FILE *f;
+
+ f = fopen(filename,"r");
+ if (!f) {
+ printf("couldn't read %s\n", filename);
+ exit(1);
+ }
+
+ numverts = 0;
+ while (!feof(f) && numverts<maxverts) {
+ fscanf( f, "%f %f %f %f %f %f",
+ &data[numverts][0], &data[numverts][1], &data[numverts][2],
+ &data[numverts][3], &data[numverts][4], &data[numverts][5] );
+ numverts++;
+ }
+ numverts--;
+
+ printf("%d vertices, %d triangles\n", numverts, numverts-2);
+ fclose(f);
+}
+
+
+
+static void print_flags( const char *msg, GLuint flags )
+{
+ fprintf(stderr,
+ "%s (0x%x): %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n",
+ msg, flags,
+ (flags & GLVERTEX) ? "glVertex, " : "",
+ (flags & DRAW_ARRAYS) ? "glDrawArrays, " : "",
+ (flags & DRAW_ELTS) ? "glDrawElements, " : "",
+ (flags & ARRAY_ELT) ? "glArrayElement, " : "",
+ (flags & LOCKED) ? "locked arrays, " : "",
+ (flags & TRIANGLES) ? "GL_TRIANGLES, " : "",
+ (flags & STRIPS) ? "GL_TRIANGLE_STRIP, " : "",
+ (flags & POINTS) ? "GL_POINTS, " : "",
+ (flags & DISPLAYLIST) ? "as a displaylist, " : "",
+ (flags & LIT) ? "lit, " : "",
+ (flags & UNLIT) ? "unlit, " : "",
+ (flags & REFLECT) ? "reflect, " : "",
+ (flags & SHADE_FLAT) ? "flat-shaded, " : "",
+ (flags & USER_CLIP) ? "user_clip, " : "",
+ (flags & MATERIALS) ? "materials, " : "",
+ (flags & FOG) ? "fog, " : "",
+ (flags & STIPPLE) ? "stipple, " : "",
+ (flags & POLYGON_LINE) ? "polygon mode line, " : "");
+}
+
+
+
+struct data_idx {
+ float *data;
+ int idx;
+ int uniq_idx;
+};
+
+
+#define COMPARE_FUNC( AXIS ) \
+static int compare_axis_##AXIS( const void *a, const void *b ) \
+{ \
+ float t = ( (*(struct data_idx *)a).data[AXIS] - \
+ (*(struct data_idx *)b).data[AXIS] ); \
+ \
+ if (t < 0) return -1; \
+ if (t > 0) return 1; \
+ return 0; \
+}
+
+COMPARE_FUNC(0)
+COMPARE_FUNC(1)
+COMPARE_FUNC(2)
+COMPARE_FUNC(3)
+COMPARE_FUNC(4)
+COMPARE_FUNC(5)
+COMPARE_FUNC(6)
+
+int (*(compare[7]))( const void *a, const void *b ) =
+{
+ compare_axis_0,
+ compare_axis_1,
+ compare_axis_2,
+ compare_axis_3,
+ compare_axis_4,
+ compare_axis_5,
+ compare_axis_6,
+};
+
+
+#define VEC_ELT(f, s, i) (float *)(((char *)f) + s * i)
+
+static int sort_axis( int axis,
+ int vec_size,
+ int vec_stride,
+ struct data_idx *indices,
+ int start,
+ int finish,
+ float *out,
+ int uniq,
+ const float fudge )
+{
+ int i;
+
+ if (finish-start > 2)
+ {
+ qsort( indices+start, finish-start, sizeof(*indices), compare[axis] );
+ }
+ else if (indices[start].data[axis] > indices[start+1].data[axis])
+ {
+ struct data_idx tmp = indices[start];
+ indices[start] = indices[start+1];
+ indices[start+1] = tmp;
+ }
+
+ if (axis == vec_size-1) {
+ for (i = start ; i < finish ; ) {
+ float max = indices[i].data[axis] + fudge;
+ float *dest = VEC_ELT(out, vec_stride, uniq);
+ int j;
+
+ for (j = 0 ; j < vec_size ; j++)
+ dest[j] = indices[i].data[j];
+
+ for ( ; i < finish && max >= indices[i].data[axis]; i++)
+ indices[i].uniq_idx = uniq;
+
+ uniq++;
+ }
+ } else {
+ for (i = start ; i < finish ; ) {
+ int j = i + 1;
+ float max = indices[i].data[axis] + fudge;
+ while (j < finish && max >= indices[j].data[axis]) j++;
+ if (j == i+1) {
+ float *dest = VEC_ELT(out, vec_stride, uniq);
+ int k;
+
+ indices[i].uniq_idx = uniq;
+
+ for (k = 0 ; k < vec_size ; k++)
+ dest[k] = indices[i].data[k];
+
+ uniq++;
+ } else {
+ uniq = sort_axis( axis+1, vec_size, vec_stride,
+ indices, i, j, out, uniq, fudge );
+ }
+ i = j;
+ }
+ }
+
+ return uniq;
+}
+
+
+static void extract_indices1( const struct data_idx *in, unsigned int *out,
+ int n )
+{
+ int i;
+ for ( i = 0 ; i < n ; i++ ) {
+ out[in[i].idx] = in[i].uniq_idx;
+ }
+}
+
+
+static void compactify_arrays(void)
+{
+ int i;
+ struct data_idx *ind;
+
+ ind = (struct data_idx *) malloc( sizeof(struct data_idx) * numverts );
+
+ for (i = 0 ; i < numverts ; i++) {
+ ind[i].idx = i;
+ ind[i].data = data[i];
+ }
+
+ numuniq = sort_axis(0,
+ sizeof(compressed_data[0])/sizeof(float),
+ sizeof(compressed_data[0]),
+ ind,
+ 0,
+ numverts,
+ (float *)compressed_data,
+ 0,
+ 1e-6);
+
+ printf("Nr unique vertex/normal pairs: %d\n", numuniq);
+
+ extract_indices1( ind, indices, numverts );
+ free( ind );
+}
+
+static void expand_arrays(void)
+{
+ int i;
+ int parity = 0;
+ for (i = 2 ; i < numverts ; i++, parity ^= 1) {
+ int v0 = i-2+parity;
+ int v1 = i-1-parity;
+ int v2 = i;
+ memcpy( expanded_data[(i-2)*3+0], data[v0], sizeof(data[0]) );
+ memcpy( expanded_data[(i-2)*3+1], data[v1], sizeof(data[0]) );
+ memcpy( expanded_data[(i-2)*3+2], data[v2], sizeof(data[0]) );
+ }
+}
+
+static float myrand( float max )
+{
+ return max*rand()/(RAND_MAX+1.0);
+}
+
+
+static void make_tri_indices( void )
+{
+ unsigned int *v = tri_indices;
+ unsigned int parity = 0;
+ int i, j;
+
+ for (j=2;j<numverts;j++,parity^=1) {
+ if (parity) {
+ *v++ = indices[j-1];
+ *v++ = indices[j-2];
+ *v++ = indices[j];
+ } else {
+ *v++ = indices[j-2];
+ *v++ = indices[j-1];
+ *v++ = indices[j];
+ }
+ }
+
+ num_tri_verts = v - tri_indices;
+ printf("num_tri_verts: %d\n", num_tri_verts);
+
+ for (i = j = 0 ; i < num_tri_verts ; i += 600, j++) {
+ col[j][3] = 1;
+ col[j][2] = myrand(1);
+ col[j][1] = myrand(1);
+ col[j][0] = myrand(1);
+ }
+
+ for (i = 0; i < numverts ; i++)
+ strip_indices[i] = i;
+}
+
+#define MIN(x,y) (x < y) ? x : y
+
+static void draw_surface( unsigned int with_state )
+{
+ GLint i, j;
+
+ if (with_state & DISPLAYLIST) {
+ if ((with_state & (RENDER_STYLE_MASK|PRIMITIVE_MASK|MATERIAL_MASK)) !=
+ dlist_state) {
+ /*
+ */
+ fprintf(stderr, "rebuilding displaylist\n");
+
+ if (dlist_state)
+ glDeleteLists( surf1, 1 );
+
+ dlist_state = with_state & (RENDER_STYLE_MASK|PRIMITIVE_MASK|
+ MATERIAL_MASK);
+ surf1 = glGenLists(1);
+ glNewList(surf1, GL_COMPILE);
+ draw_surface( dlist_state );
+ glEndList();
+ }
+
+ glCallList( surf1 );
+ return;
+ }
+
+ switch (with_state & (RENDER_STYLE_MASK|PRIMITIVE_MASK)) {
+#ifdef GL_EXT_vertex_array
+
+ case (DRAW_ELTS|TRIANGLES):
+ if (with_state & MATERIALS) {
+ for (j = i = 0 ; i < num_tri_verts ; i += 600, j++) {
+ GLuint nr = MIN(num_tri_verts-i, 600);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, col[j]);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, col[j]);
+ glDrawElements( GL_TRIANGLES, nr, GL_UNSIGNED_INT, tri_indices+i );
+ }
+ } else {
+ glDrawElements( GL_TRIANGLES, num_tri_verts, GL_UNSIGNED_INT,
+ tri_indices );
+ }
+ break;
+
+ case (DRAW_ARRAYS|TRIANGLES):
+ glDrawArraysEXT( GL_TRIANGLES, 0, (numverts-2)*3 );
+ break;
+
+ case (ARRAY_ELT|TRIANGLES):
+ if (with_state & MATERIALS) {
+ for (j = i = 0 ; i < num_tri_verts ; i += 600, j++) {
+ GLuint nr = MIN(num_tri_verts-i, 600);
+ GLuint k;
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, col[j]);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, col[j]);
+ glBegin( GL_TRIANGLES );
+ for (k = 0 ; k < nr ; k++)
+ glArrayElement( tri_indices[i+k] );
+ glEnd();
+ }
+ } else {
+ glBegin( GL_TRIANGLES );
+ for (i = 0 ; i < num_tri_verts ; i++)
+ glArrayElement( tri_indices[i] );
+
+ glEnd();
+ }
+ break;
+
+
+ /* Uses the original arrays (including duplicate elements):
+ */
+ case (DRAW_ARRAYS|STRIPS):
+ glDrawArraysEXT( GL_TRIANGLE_STRIP, 0, numverts );
+ break;
+ case (DRAW_ELTS|STRIPS):
+ glDrawElements( GL_TRIANGLE_STRIP, numverts,
+ GL_UNSIGNED_INT, strip_indices );
+ break;
+
+ /* Uses the original arrays (including duplicate elements):
+ */
+ case (ARRAY_ELT|STRIPS):
+ glBegin( GL_TRIANGLE_STRIP );
+ for (i = 0 ; i < numverts ; i++)
+ glArrayElement( i );
+ glEnd();
+ break;
+
+ case (DRAW_ARRAYS|POINTS):
+ glDrawArraysEXT( GL_POINTS, 0, numuniq );
+ break;
+ case (DRAW_ELTS|POINTS):
+ /* can use numuniq with strip_indices as strip_indices[i] == i.
+ */
+ glDrawElements( GL_POINTS, numuniq,
+ GL_UNSIGNED_INT, strip_indices );
+ break;
+ case (ARRAY_ELT|POINTS):
+ /* just emit each unique element once:
+ */
+ glBegin( GL_POINTS );
+ for (i = 0 ; i < numuniq ; i++)
+ glArrayElement( i );
+ glEnd();
+ break;
+#endif
+
+ case (GLVERTEX|TRIANGLES):
+ if (with_state & MATERIALS) {
+ for (j = i = 0 ; i < num_tri_verts ; i += 600, j++) {
+ GLuint nr = MIN(num_tri_verts-i, 600);
+ GLuint k;
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, col[j]);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, col[j]);
+ glBegin( GL_TRIANGLES );
+ for (k = 0 ; k < nr ; k++) {
+ glNormal3fv( &compressed_data[tri_indices[i+k]][3] );
+ glVertex3fv( &compressed_data[tri_indices[i+k]][0] );
+ }
+ glEnd();
+ }
+ } else {
+ glBegin( GL_TRIANGLES );
+ for (i = 0 ; i < num_tri_verts ; i++) {
+ glNormal3fv( &compressed_data[tri_indices[i]][3] );
+ glVertex3fv( &compressed_data[tri_indices[i]][0] );
+ }
+ glEnd();
+ }
+ break;
+
+ case (GLVERTEX|POINTS):
+ /* Renders all points, but not in strip order... Shouldn't be a
+ * problem, but people may be confused as to why points are so
+ * much faster in this demo... And why cva doesn't help them...
+ */
+ glBegin( GL_POINTS );
+ for ( i = 0 ; i < numuniq ; i++ ) {
+ glNormal3fv( &compressed_data[i][3] );
+ glVertex3fv( &compressed_data[i][0] );
+ }
+ glEnd();
+ break;
+
+ case (GLVERTEX|STRIPS):
+ glBegin( GL_TRIANGLE_STRIP );
+ for (i=0;i<numverts;i++) {
+ glNormal3fv( &data[i][3] );
+ glVertex3fv( &data[i][0] );
+ }
+ glEnd();
+ break;
+
+ default:
+ fprintf(stderr, "unimplemented mode %x...\n",
+ (with_state & (RENDER_STYLE_MASK|PRIMITIVE_MASK)));
+ break;
+ }
+}
+
+
+
+static void Display(void)
+{
+ glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+ draw_surface( state );
+ glFlush();
+ if (doubleBuffer) glutSwapBuffers();
+}
+
+
+/* KW: only do this when necessary, so CVA can re-use results.
+ */
+static void set_matrix( void )
+{
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glTranslatef( 0.0, 0.0, dist );
+ glRotatef( yrot, 0.0, 1.0, 0.0 );
+ glRotatef( xrot, 1.0, 0.0, 0.0 );
+}
+
+static void Benchmark( float xdiff, float ydiff )
+{
+ int startTime, endTime;
+ int draws;
+ double seconds, fps, triPerSecond;
+
+ printf("Benchmarking...\n");
+
+ draws = 0;
+ startTime = glutGet(GLUT_ELAPSED_TIME);
+ xrot = 0.0;
+ do {
+ xrot += xdiff;
+ yrot += ydiff;
+ set_matrix();
+ Display();
+ draws++;
+ endTime = glutGet(GLUT_ELAPSED_TIME);
+ } while (endTime - startTime < 5000); /* 5 seconds */
+
+ /* Results */
+ seconds = (double) (endTime - startTime) / 1000.0;
+ triPerSecond = (numverts - 2) * draws / seconds;
+ fps = draws / seconds;
+ printf("Result: triangles/sec: %g fps: %g\n", triPerSecond, fps);
+}
+
+
+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 position0[] = {0.0, 0.0, 20.0, 0.0};
+ static float position1[] = {0.0, 0.0, -20.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_FALSE};
+
+ glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+ glLightfv(GL_LIGHT0, GL_POSITION, position0);
+ glEnable(GL_LIGHT0);
+
+ glLightfv(GL_LIGHT1, GL_AMBIENT, ambient);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);
+ glLightfv(GL_LIGHT1, GL_POSITION, position1);
+ glEnable(GL_LIGHT1);
+
+ glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+ glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
+
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, front_mat_shininess);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, front_mat_specular);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, front_mat_diffuse);
+
+ glPolygonStipple (halftone);
+}
+
+
+
+#define UPDATE(o,n,mask) (o&=~mask, o|=n&mask)
+#define CHANGED(o,n,mask) ((n&mask) && (n&mask) != (o&mask) )
+
+static void ModeMenu(int m)
+{
+ m &= allowed;
+
+ if (!m) return;
+
+ if (m==QUIT)
+ exit(0);
+
+ if (m==GLINFO) {
+ printf("GL_VERSION: %s\n", (char *) glGetString(GL_VERSION));
+ printf("GL_EXTENSIONS: %s\n", (char *) glGetString(GL_EXTENSIONS));
+ printf("GL_RENDERER: %s\n", (char *) glGetString(GL_RENDERER));
+ return;
+ }
+
+ if (CHANGED(state, m, FILTER_MASK)) {
+ UPDATE(state, m, FILTER_MASK);
+ if (m & LINEAR_FILTER) {
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ } else {
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ }
+ }
+
+ if (CHANGED(state, m, LIGHT_MASK)) {
+ UPDATE(state, m, LIGHT_MASK);
+ if (m & LIT) {
+ glEnable(GL_LIGHTING);
+ glDisable(GL_TEXTURE_GEN_S);
+ glDisable(GL_TEXTURE_GEN_T);
+ glDisable(GL_TEXTURE_2D);
+ }
+ else if (m & UNLIT) {
+ glDisable(GL_LIGHTING);
+ glDisable(GL_TEXTURE_GEN_S);
+ glDisable(GL_TEXTURE_GEN_T);
+ glDisable(GL_TEXTURE_2D);
+ }
+ else if (m & REFLECT) {
+ glDisable(GL_LIGHTING);
+ glEnable(GL_TEXTURE_GEN_S);
+ glEnable(GL_TEXTURE_GEN_T);
+ glEnable(GL_TEXTURE_2D);
+ }
+ }
+
+ if (CHANGED(state, m, SHADE_MASK)) {
+ UPDATE(state, m, SHADE_MASK);
+ if (m & SHADE_SMOOTH)
+ glShadeModel(GL_SMOOTH);
+ else
+ glShadeModel(GL_FLAT);
+ }
+
+
+ if (CHANGED(state, m, CLIP_MASK)) {
+ UPDATE(state, m, CLIP_MASK);
+ if (m & USER_CLIP) {
+ glEnable(GL_CLIP_PLANE0);
+ } else {
+ glDisable(GL_CLIP_PLANE0);
+ }
+ }
+
+ if (CHANGED(state, m, FOG_MASK)) {
+ UPDATE(state, m, FOG_MASK);
+ if (m & FOG) {
+ glEnable(GL_FOG);
+ }
+ else {
+ glDisable(GL_FOG);
+ }
+ }
+
+ if (CHANGED(state, m, STIPPLE_MASK)) {
+ UPDATE(state, m, STIPPLE_MASK);
+ if (m & STIPPLE) {
+ glEnable(GL_POLYGON_STIPPLE);
+ }
+ else {
+ glDisable(GL_POLYGON_STIPPLE);
+ }
+ }
+
+ if (CHANGED(state, m, POLYGON_MASK)) {
+ UPDATE(state, m, POLYGON_MASK);
+ if (m & POLYGON_FILL) {
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ }
+ else {
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ }
+ }
+
+#ifdef GL_EXT_vertex_array
+ if (CHANGED(state, m, (LOCK_MASK|RENDER_STYLE_MASK|PRIMITIVE_MASK)))
+ {
+ if (m & (PRIMITIVE_MASK)) {
+ UPDATE(state, m, (PRIMITIVE_MASK));
+ }
+
+ if (m & (RENDER_STYLE_MASK)) {
+ UPDATE(state, m, (RENDER_STYLE_MASK));
+ }
+
+ if (m & LOCK_MASK) {
+ UPDATE(state, m, (LOCK_MASK));
+ }
+
+
+ print_flags("primitive", state & PRIMITIVE_MASK);
+ print_flags("render style", state & RENDER_STYLE_MASK);
+
+ if ((state & PRIMITIVE_MASK) != STRIPS &&
+ ((state & RENDER_STYLE_MASK) == DRAW_ELTS ||
+ (state & RENDER_STYLE_MASK) == ARRAY_ELT ||
+ (state & PRIMITIVE_MASK) == POINTS))
+ {
+ fprintf(stderr, "enabling small arrays\n");
+ /* Rendering any primitive with draw-element/array-element
+ * --> Can't do strips here as ordering has been lost in
+ * compaction process...
+ */
+ glVertexPointerEXT( 3, GL_FLOAT, sizeof(data[0]), numuniq,
+ compressed_data );
+ glNormalPointerEXT( GL_FLOAT, sizeof(data[0]), numuniq,
+ &compressed_data[0][3]);
+#ifdef GL_EXT_compiled_vertex_array
+ if (allowed & LOCKED) {
+ if (state & LOCKED) {
+ glLockArraysEXT( 0, numuniq );
+ } else {
+ glUnlockArraysEXT();
+ }
+ }
+#endif
+ }
+ else if ((state & PRIMITIVE_MASK) == TRIANGLES &&
+ (state & RENDER_STYLE_MASK) == DRAW_ARRAYS) {
+ fprintf(stderr, "enabling big arrays\n");
+ /* Only get here for TRIANGLES and drawarrays
+ */
+ glVertexPointerEXT( 3, GL_FLOAT, sizeof(data[0]), (numverts-2) * 3,
+ expanded_data );
+ glNormalPointerEXT( GL_FLOAT, sizeof(data[0]), (numverts-2) * 3,
+ &expanded_data[0][3]);
+
+#ifdef GL_EXT_compiled_vertex_array
+ if (allowed & LOCKED) {
+ if (state & LOCKED) {
+ glLockArraysEXT( 0, (numverts-2)*3 );
+ } else {
+ glUnlockArraysEXT();
+ }
+ }
+#endif
+ }
+ else {
+ fprintf(stderr, "enabling normal arrays\n");
+ glVertexPointerEXT( 3, GL_FLOAT, sizeof(data[0]), numverts, data );
+ glNormalPointerEXT( GL_FLOAT, sizeof(data[0]), numverts, &data[0][3]);
+#ifdef GL_EXT_compiled_vertex_array
+ if (allowed & LOCKED) {
+ if (state & LOCKED) {
+ glLockArraysEXT( 0, numverts );
+ } else {
+ glUnlockArraysEXT();
+ }
+ }
+#endif
+ }
+
+ }
+#endif
+
+
+ if (m & DLIST_MASK) {
+ UPDATE(state, m, DLIST_MASK);
+ }
+
+ if (m & MATERIAL_MASK) {
+ UPDATE(state, m, MATERIAL_MASK);
+ }
+
+ print_flags("new flags", state);
+
+ glutPostRedisplay();
+}
+
+
+
+static void Init(int argc, char *argv[])
+{
+ GLfloat fogColor[4] = {0.5,1.0,0.5,1.0};
+
+ xrot = 0;
+ yrot = 0;
+ dist = -6;
+ plane[0] = 1.0;
+ plane[1] = 0.0;
+ plane[2] = -1.0;
+ plane[3] = 0.0;
+
+ glClearColor(0.0, 0.0, 1.0, 0.0);
+ glEnable( GL_DEPTH_TEST );
+ glEnable( GL_VERTEX_ARRAY_EXT );
+ glEnable( GL_NORMAL_ARRAY_EXT );
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glFrustum( -1.0, 1.0, -1.0, 1.0, 5, 25 );
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glClipPlane(GL_CLIP_PLANE0, plane);
+
+ InitMaterials();
+
+ set_matrix();
+
+ glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+ glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
+
+ glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
+ glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
+
+
+ /* Green fog is easy to see */
+ glFogi(GL_FOG_MODE,GL_EXP2);
+ glFogfv(GL_FOG_COLOR,fogColor);
+ glFogf(GL_FOG_DENSITY,0.15);
+ glHint(GL_FOG_HINT,GL_DONT_CARE);
+
+ {
+ static int firsttime = 1;
+ if (firsttime) {
+ firsttime = 0;
+ compactify_arrays();
+ expand_arrays();
+ make_tri_indices();
+
+ if (!LoadRGBMipmaps(TEXTURE_FILE, GL_RGB)) {
+ printf("Error: couldn't load texture image\n");
+ exit(1);
+ }
+ }
+ }
+
+ ModeMenu(SHADE_SMOOTH|
+ LIT|
+ POINT_FILTER|
+ NO_USER_CLIP|
+ NO_MATERIALS|
+ NO_FOG|
+ NO_STIPPLE|
+ IMMEDIATE|
+ STRIPS|
+ UNLOCKED|
+ GLVERTEX);
+
+ if (PrintInfo) {
+ printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER));
+ printf("GL_VERSION = %s\n", (char *) glGetString(GL_VERSION));
+ printf("GL_VENDOR = %s\n", (char *) glGetString(GL_VENDOR));
+ printf("GL_EXTENSIONS = %s\n", (char *) glGetString(GL_EXTENSIONS));
+ }
+}
+
+
+
+static void Reshape(int width, int height)
+{
+ glViewport(0, 0, (GLint)width, (GLint)height);
+}
+
+
+
+static void Key( unsigned char key, int x, int y )
+{
+ (void) x;
+ (void) y;
+ switch (key) {
+ case 27:
+ exit(0);
+ case 'f':
+ ModeMenu((state ^ FOG_MASK) & FOG_MASK);
+ break;
+ case 's':
+ ModeMenu((state ^ SHADE_MASK) & SHADE_MASK);
+ break;
+ case 't':
+ ModeMenu((state ^ STIPPLE_MASK) & STIPPLE_MASK);
+ break;
+ case 'l':
+ ModeMenu((state ^ LIGHT_MASK) & (LIT|UNLIT));
+ break;
+ case 'm':
+ ModeMenu((state ^ MATERIAL_MASK) & MATERIAL_MASK);
+ break;
+ case 'c':
+ ModeMenu((state ^ CLIP_MASK) & CLIP_MASK);
+ break;
+ case 'v':
+ ModeMenu((LOCKED|IMMEDIATE|DRAW_ELTS|TRIANGLES) & allowed);
+ break;
+ case 'V':
+ ModeMenu(UNLOCKED|IMMEDIATE|GLVERTEX|STRIPS);
+ break;
+ case 'b':
+ Benchmark(5.0, 0);
+ break;
+ case 'B':
+ Benchmark(0, 5.0);
+ break;
+ case 'i':
+ dist += .25;
+ set_matrix();
+ glutPostRedisplay();
+ break;
+ case 'I':
+ dist -= .25;
+ set_matrix();
+ glutPostRedisplay();
+ break;
+ case '-':
+ case '_':
+ plane[3] += 2.0;
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glClipPlane(GL_CLIP_PLANE0, plane);
+ set_matrix();
+ glutPostRedisplay();
+ break;
+ case '+':
+ case '=':
+ plane[3] -= 2.0;
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glClipPlane(GL_CLIP_PLANE0, plane);
+ set_matrix();
+ glutPostRedisplay();
+ break;
+ case ' ':
+ Init(0,0);
+ break;
+ }
+}
+
+
+static void SpecialKey( int key, int x, int y )
+{
+ (void) x;
+ (void) y;
+ switch (key) {
+ case GLUT_KEY_LEFT:
+ yrot -= 15.0;
+ break;
+ case GLUT_KEY_RIGHT:
+ yrot += 15.0;
+ break;
+ case GLUT_KEY_UP:
+ xrot += 15.0;
+ break;
+ case GLUT_KEY_DOWN:
+ xrot -= 15.0;
+ break;
+ default:
+ return;
+ }
+ set_matrix();
+ glutPostRedisplay();
+}
+
+
+
+static GLint Args(int argc, char **argv)
+{
+ GLint i;
+ GLint mode = 0;
+
+ 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], "-info") == 0) {
+ PrintInfo = GL_TRUE;
+ }
+ else if (strcmp(argv[i], "-10") == 0) {
+ maxverts = 10;
+ }
+ else if (strcmp(argv[i], "-100") == 0) {
+ maxverts = 100;
+ }
+ else if (strcmp(argv[i], "-1000") == 0) {
+ maxverts = 1000;
+ }
+ else {
+ printf("%s (Bad option).\n", argv[i]);
+ return QUIT;
+ }
+ }
+
+ return mode;
+}
+
+int main(int argc, char **argv)
+{
+ GLenum type;
+ char *extensions;
+
+ GLuint arg_mode = Args(argc, argv);
+
+ if (arg_mode & QUIT)
+ exit(0);
+
+ read_surface( "isosurf.dat" );
+
+ glutInitWindowPosition(0, 0);
+ glutInitWindowSize(400, 400);
+
+ type = GLUT_DEPTH;
+ type |= GLUT_RGB;
+ type |= (doubleBuffer) ? GLUT_DOUBLE : GLUT_SINGLE;
+ glutInitDisplayMode(type);
+
+ if (glutCreateWindow("Isosurface") <= 0) {
+ exit(0);
+ }
+
+ /* Make sure server supports the vertex array extension */
+ extensions = (char *) glGetString( GL_EXTENSIONS );
+
+ if (!strstr( extensions, "GL_EXT_vertex_array" ))
+ {
+ printf("Vertex arrays not supported by this renderer\n");
+ allowed &= ~(LOCKED|DRAW_ARRAYS|DRAW_ELTS|ARRAY_ELT);
+ }
+ else if (!strstr( extensions, "GL_EXT_compiled_vertex_array" ))
+ {
+ printf("Compiled vertex arrays not supported by this renderer\n");
+ allowed &= ~LOCKED;
+ }
+
+ Init(argc, argv);
+ ModeMenu(arg_mode);
+
+ glutCreateMenu(ModeMenu);
+ glutAddMenuEntry("GL info", GLINFO);
+ glutAddMenuEntry("", 0);
+ glutAddMenuEntry("Lit", LIT);
+ glutAddMenuEntry("Unlit", UNLIT);
+ glutAddMenuEntry("Reflect", REFLECT);
+ glutAddMenuEntry("", 0);
+ glutAddMenuEntry("Smooth", SHADE_SMOOTH);
+ glutAddMenuEntry("Flat", SHADE_FLAT);
+ glutAddMenuEntry("", 0);
+ glutAddMenuEntry("Fog", FOG);
+ glutAddMenuEntry("No Fog", NO_FOG);
+ glutAddMenuEntry("", 0);
+ glutAddMenuEntry("Stipple", STIPPLE);
+ glutAddMenuEntry("No Stipple", NO_STIPPLE);
+ glutAddMenuEntry("", 0);
+ glutAddMenuEntry("Polygon Mode Fill", POLYGON_FILL);
+ glutAddMenuEntry("Polygon Mode Line", POLYGON_LINE);
+ glutAddMenuEntry("", 0);
+ glutAddMenuEntry("Point Filtered", POINT_FILTER);
+ glutAddMenuEntry("Linear Filtered", LINEAR_FILTER);
+ glutAddMenuEntry("", 0);
+ glutAddMenuEntry("GL_TRIANGLES", TRIANGLES);
+ glutAddMenuEntry("GL_TRIANGLE_STRIPS", STRIPS);
+ glutAddMenuEntry("GL_POINTS", POINTS);
+ glutAddMenuEntry("", 0);
+ glutAddMenuEntry("Displaylist", DISPLAYLIST);
+ glutAddMenuEntry("Immediate", IMMEDIATE);
+ glutAddMenuEntry("", 0);
+ if (allowed & LOCKED) {
+ glutAddMenuEntry("Locked Arrays (CVA)", LOCKED);
+ glutAddMenuEntry("Unlocked Arrays", UNLOCKED);
+ glutAddMenuEntry("", 0);
+ }
+ glutAddMenuEntry("glVertex", GLVERTEX);
+ if (allowed & DRAW_ARRAYS) {
+ glutAddMenuEntry("glDrawElements", DRAW_ELTS);
+ glutAddMenuEntry("glDrawArrays", DRAW_ARRAYS);
+ glutAddMenuEntry("glArrayElement", ARRAY_ELT);
+ }
+ glutAddMenuEntry("", 0);
+ glutAddMenuEntry("Quit", QUIT);
+ glutAttachMenu(GLUT_RIGHT_BUTTON);
+
+ glutReshapeFunc(Reshape);
+ glutKeyboardFunc(Key);
+ glutSpecialFunc(SpecialKey);
+ glutDisplayFunc(Display);
+
+ glutMainLoop();
+ return 0;
+}
diff --git a/progs/demos/isosurf.dat b/progs/demos/isosurf.dat
new file mode 100644
index 00000000000..5cadecdb430
--- /dev/null
+++ b/progs/demos/isosurf.dat
@@ -0,0 +1,7179 @@
+-1.000000 0.050200 0.254800 0.280000 0.504000 0.808000
+-1.000000 0.061400 0.243900 0.248000 0.608000 0.744000
+-0.973900 0.050200 0.243900 0.312000 0.448000 0.832000
+-1.000000 0.100400 0.207000 0.040000 0.608000 0.784000
+-0.950000 0.050200 0.232900 0.312000 0.424000 0.840000
+-0.950000 0.100400 0.204500 0.176000 0.504000 0.840000
+-0.900000 0.050200 0.202100 0.368000 0.256000 0.888000
+-0.900000 0.100400 0.184100 0.296000 0.408000 0.856000
+-0.865600 0.050200 0.182900 0.480000 0.256000 0.832000
+-0.897500 0.100400 0.182900 0.392000 0.408000 0.816000
+-0.850000 0.050200 0.170400 0.488000 0.296000 0.816000
+-0.850000 0.100400 0.150400 0.488000 0.512000 0.696000
+-0.800000 0.050200 0.139800 0.504000 0.392000 0.760000
+-0.820700 0.100400 0.121900 0.496000 0.488000 0.704000
+-0.800000 0.077200 0.121900 0.512000 0.416000 0.744000
+-0.800000 0.100400 0.105500 0.480000 0.456000 0.736000
+-0.781300 0.050200 0.121900 0.536000 0.400000 0.736000
+-0.750000 0.100400 0.065100 0.488000 0.448000 0.736000
+-0.750000 0.050200 0.097600 0.464000 0.408000 0.776000
+-0.744800 0.100400 0.060900 0.496000 0.456000 0.728000
+-0.700000 0.050200 0.061900 0.536000 0.368000 0.752000
+-0.700000 0.051600 0.060900 0.528000 0.416000 0.728000
+-0.699000 0.050200 0.060900 0.608000 0.360000 0.696000
+-0.700000 0.100400 0.019100 0.504000 0.504000 0.688000
+-0.650000 0.050200 0.008200 0.568000 0.384000 0.720000
+-0.680200 0.100400 0.000000 0.600000 0.440000 0.656000
+-0.650000 0.063100 0.000000 0.592000 0.392000 0.696000
+-0.650000 0.100400 -0.043200 0.600000 0.608000 0.496000
+-0.641800 0.050200 0.000000 0.616000 0.400000 0.664000
+-0.638000 0.100400 -0.060900 0.672000 0.632000 0.368000
+-0.600000 0.050200 -0.054100 0.640000 0.448000 0.616000
+-0.600000 0.057600 -0.060900 0.728000 0.536000 0.408000
+-0.594700 0.050200 -0.060900 0.744000 0.504000 0.416000
+-0.600000 0.050200 -0.083400 0.800000 0.528000 -0.248000
+-0.573200 0.000000 -0.060900 0.920000 0.296000 -0.248000
+-0.600000 0.000000 -0.117700 0.848000 0.200000 -0.488000
+-0.554400 -0.050200 -0.060900 0.944000 0.280000 0.128000
+-0.600000 -0.008200 -0.121900 0.848000 0.208000 -0.472000
+-0.586600 -0.050200 -0.121900 0.872000 0.224000 -0.424000
+-0.600000 -0.050200 -0.162700 0.904000 0.232000 -0.344000
+-0.578300 -0.100400 -0.121900 0.848000 0.312000 -0.424000
+-0.600000 -0.077900 -0.182900 0.856000 0.208000 -0.464000
+-0.594100 -0.100400 -0.182900 0.816000 0.296000 -0.480000
+-0.600000 -0.100400 -0.193800 0.776000 0.296000 -0.544000
+-0.561800 -0.150600 -0.182900 0.544000 0.784000 -0.280000
+-0.600000 -0.150600 -0.229400 0.416000 0.744000 -0.512000
+-0.550000 -0.155500 -0.182900 0.296000 0.920000 -0.232000
+-0.600000 -0.160400 -0.243900 0.432000 0.688000 -0.576000
+-0.550000 -0.172700 -0.243900 0.008000 0.856000 -0.512000
+-0.600000 -0.200800 -0.299500 0.000000 0.872000 -0.480000
+-0.550000 -0.200800 -0.303600 -0.040000 0.880000 -0.464000
+-0.600000 -0.203400 -0.304800 0.008000 0.768000 -0.632000
+-0.550000 -0.201300 -0.304800 -0.032000 0.864000 -0.488000
+-0.600000 -0.251000 -0.360600 -0.120000 0.624000 -0.760000
+-0.550000 -0.245600 -0.365800 -0.104000 0.680000 -0.720000
+-0.576800 -0.251000 -0.365800 -0.136000 0.624000 -0.760000
+-0.550000 -0.251000 -0.371400 -0.120000 0.616000 -0.768000
+-0.600000 -0.256300 -0.365800 -0.112000 0.608000 -0.776000
+-0.550000 -0.301200 -0.401000 0.000000 0.424000 -0.904000
+-0.600000 -0.301200 -0.399100 0.008000 0.480000 -0.872000
+-0.550000 -0.349500 -0.426800 0.056000 0.416000 -0.904000
+-0.600000 -0.340300 -0.426800 0.032000 0.512000 -0.848000
+-0.600000 -0.301200 -0.399100 0.008000 0.480000 -0.872000
+-0.650000 -0.337200 -0.426800 0.016000 0.520000 -0.848000
+-0.650000 -0.301200 -0.398600 0.000000 0.528000 -0.840000
+-0.700000 -0.338200 -0.426800 -0.192000 0.592000 -0.776000
+-0.700000 -0.301200 -0.401600 0.016000 0.504000 -0.856000
+-0.736800 -0.351500 -0.426800 -0.240000 0.480000 -0.832000
+-0.750000 -0.301200 -0.392900 -0.104000 0.352000 -0.928000
+-0.750000 -0.351500 -0.422100 -0.312000 0.448000 -0.824000
+-0.800000 -0.301200 -0.380800 -0.264000 0.104000 -0.952000
+-0.800000 -0.351500 -0.388300 -0.664000 -0.152000 -0.728000
+-0.826000 -0.301200 -0.365800 -0.648000 -0.448000 -0.600000
+-0.812200 -0.351500 -0.365800 -0.856000 -0.296000 -0.408000
+-0.850000 -0.301200 -0.321900 -0.728000 -0.616000 -0.280000
+-0.821000 -0.351500 -0.304800 -0.824000 -0.504000 0.232000
+-0.850000 -0.306900 -0.304800 -0.768000 -0.624000 0.072000
+-0.807300 -0.351500 -0.243900 -0.864000 -0.472000 0.152000
+-0.850000 -0.301200 -0.293400 -0.744000 -0.560000 0.336000
+-0.834700 -0.301200 -0.243900 -0.840000 -0.504000 0.184000
+-0.850000 -0.276800 -0.243900 -0.792000 -0.552000 0.248000
+-0.831100 -0.301200 -0.182900 -0.848000 -0.520000 0.016000
+-0.850000 -0.271300 -0.182900 -0.816000 -0.568000 0.032000
+-0.832400 -0.301200 -0.121900 -0.840000 -0.528000 0.048000
+-0.850000 -0.274400 -0.121900 -0.816000 -0.568000 0.008000
+-0.826600 -0.301200 -0.060900 -0.824000 -0.544000 0.120000
+-0.850000 -0.265600 -0.060900 -0.808000 -0.568000 0.104000
+-0.817700 -0.301200 0.000000 -0.808000 -0.560000 0.168000
+-0.850000 -0.254700 0.000000 -0.800000 -0.568000 0.168000
+-0.805900 -0.301200 0.060900 -0.800000 -0.536000 0.232000
+-0.850000 -0.251000 0.014600 -0.800000 -0.560000 0.176000
+-0.838400 -0.251000 0.060900 -0.808000 -0.528000 0.248000
+-0.850000 -0.233200 0.060900 -0.816000 -0.512000 0.248000
+-0.819200 -0.251000 0.121900 -0.760000 -0.496000 0.400000
+-0.850000 -0.203500 0.121900 -0.792000 -0.528000 0.288000
+-0.800000 -0.251000 0.157900 -0.576000 -0.400000 0.696000
+-0.850000 -0.200800 0.125700 -0.776000 -0.360000 0.504000
+-0.800000 -0.206500 0.182900 -0.304000 -0.264000 0.912000
+-0.803100 -0.200800 0.182900 -0.456000 -0.168000 0.864000
+-0.800000 -0.200800 0.184500 -0.256000 -0.128000 0.952000
+-0.836800 -0.150600 0.182900 -0.304000 -0.304000 0.896000
+-0.800000 -0.150600 0.189500 -0.240000 -0.056000 0.960000
+-0.850000 -0.137400 0.182900 -0.304000 -0.312000 0.896000
+-0.800000 -0.100400 0.186900 0.104000 0.048000 0.992000
+-0.850000 -0.100400 0.192600 -0.136000 -0.312000 0.936000
+-0.800000 -0.063400 0.182900 0.240000 0.160000 0.952000
+-0.850000 -0.050200 0.193400 0.200000 0.072000 0.968000
+-0.809300 -0.050200 0.182900 0.232000 0.160000 0.952000
+-0.850000 0.000000 0.186200 0.256000 0.144000 0.952000
+-0.839600 0.000000 0.182900 0.264000 0.152000 0.944000
+-0.850000 0.016800 0.182900 0.328000 0.184000 0.920000
+-0.800000 0.000000 0.163200 0.400000 0.288000 0.864000
+-0.850000 0.050200 0.170400 0.488000 0.296000 0.816000
+-0.800000 0.050200 0.139800 0.504000 0.392000 0.760000
+-0.800000 0.000000 0.163200 0.400000 0.288000 0.864000
+-0.781300 0.050200 0.121900 0.536000 0.400000 0.736000
+-0.750000 0.000000 0.129400 0.496000 0.360000 0.776000
+-0.750000 0.012900 0.121900 0.496000 0.384000 0.768000
+-0.740500 0.000000 0.121900 0.504000 0.352000 0.784000
+-0.750000 0.050200 0.097600 0.464000 0.408000 0.776000
+-0.700000 0.000000 0.089700 0.584000 0.336000 0.736000
+-0.700000 0.050200 0.061900 0.536000 0.368000 0.752000
+-0.666100 0.000000 0.060900 0.560000 0.376000 0.728000
+-0.699000 0.050200 0.060900 0.608000 0.360000 0.696000
+-0.650000 0.000000 0.045200 0.576000 0.400000 0.704000
+-0.650000 0.050200 0.008200 0.568000 0.384000 0.720000
+-0.609800 0.000000 0.000000 0.696000 0.384000 0.592000
+-0.641800 0.050200 0.000000 0.616000 0.400000 0.664000
+-0.600000 0.000000 -0.017800 0.736000 0.384000 0.544000
+-0.600000 0.050200 -0.054100 0.640000 0.448000 0.616000
+-0.573200 0.000000 -0.060900 0.920000 0.296000 -0.248000
+-0.594700 0.050200 -0.060900 0.744000 0.504000 0.416000
+-0.594700 0.050200 -0.060900 0.744000 0.504000 0.416000
+-1.000000 0.050200 0.254800 0.280000 0.504000 0.808000
+-1.000000 0.050200 0.254800 0.280000 0.504000 0.808000
+-1.000000 0.000000 0.260200 0.424000 -0.312000 0.840000
+-0.973900 0.050200 0.243900 0.312000 0.448000 0.832000
+-0.976100 0.000000 0.243900 0.464000 -0.432000 0.768000
+-0.950000 0.050200 0.232900 0.312000 0.424000 0.840000
+-0.950000 0.000000 0.224500 0.344000 -0.144000 0.920000
+-0.900000 0.050200 0.202100 0.368000 0.256000 0.888000
+-0.900000 0.000000 0.204000 0.296000 0.088000 0.944000
+-0.865600 0.050200 0.182900 0.480000 0.256000 0.832000
+-0.850000 0.000000 0.186200 0.256000 0.144000 0.952000
+-0.850000 0.016800 0.182900 0.328000 0.184000 0.920000
+-0.865600 0.050200 0.182900 0.480000 0.256000 0.832000
+-0.850000 0.050200 0.170400 0.488000 0.296000 0.816000
+-0.850000 0.050200 0.170400 0.488000 0.296000 0.816000
+-1.000000 0.000000 0.260200 0.424000 -0.312000 0.840000
+-1.000000 0.000000 0.260200 0.424000 -0.312000 0.840000
+-0.976100 0.000000 0.243900 0.464000 -0.432000 0.768000
+-1.000000 -0.016700 0.243900 0.424000 -0.608000 0.656000
+-0.950000 0.000000 0.224500 0.344000 -0.144000 0.920000
+-1.000000 -0.050200 0.185900 -0.256000 -0.768000 0.576000
+-0.950000 -0.050200 0.212200 0.160000 -0.384000 0.904000
+-1.000000 -0.052000 0.182900 -0.336000 -0.760000 0.544000
+-0.950000 -0.074300 0.182900 -0.344000 -0.776000 0.520000
+-1.000000 -0.075600 0.121900 -0.328000 -0.896000 0.264000
+-0.950000 -0.095300 0.121900 -0.400000 -0.864000 0.280000
+-1.000000 -0.090800 0.060900 -0.320000 -0.912000 0.248000
+-0.950000 -0.100400 0.101700 -0.400000 -0.872000 0.264000
+-0.973400 -0.100400 0.060900 -0.344000 -0.904000 0.240000
+-0.950000 -0.110600 0.060900 -0.432000 -0.856000 0.248000
+-1.000000 -0.100400 0.014600 -0.304000 -0.920000 0.208000
+-0.950000 -0.123700 0.000000 -0.488000 -0.840000 0.216000
+-1.000000 -0.103100 0.000000 -0.304000 -0.920000 0.208000
+-0.950000 -0.136200 -0.060900 -0.528000 -0.832000 0.152000
+-1.000000 -0.112800 -0.060900 -0.376000 -0.912000 0.144000
+-0.950000 -0.144800 -0.121900 -0.536000 -0.832000 0.120000
+-1.000000 -0.120900 -0.121900 -0.400000 -0.904000 0.136000
+-0.950000 -0.150600 -0.169000 -0.584000 -0.792000 0.136000
+-1.000000 -0.129600 -0.182900 -0.400000 -0.904000 0.136000
+-0.952800 -0.150600 -0.182900 -0.568000 -0.808000 0.136000
+-1.000000 -0.135800 -0.243900 -0.400000 -0.904000 0.096000
+-0.966700 -0.150600 -0.243900 -0.472000 -0.864000 0.152000
+-1.000000 -0.142300 -0.304800 -0.328000 -0.456000 -0.824000
+-0.989000 -0.150600 -0.304800 -0.440000 -0.624000 -0.640000
+-1.000000 -0.100400 -0.332000 -0.256000 -0.392000 -0.880000
+-0.950000 -0.150600 -0.330800 -0.416000 -0.432000 -0.792000
+-0.950000 -0.100400 -0.349400 -0.088000 -0.160000 -0.976000
+-0.900000 -0.150600 -0.338300 -0.216000 -0.104000 -0.968000
+-0.900000 -0.100400 -0.346700 0.112000 -0.048000 -0.984000
+-0.850000 -0.150600 -0.349400 0.072000 0.056000 -0.992000
+-0.850000 -0.100400 -0.332400 0.280000 0.112000 -0.952000
+-0.800000 -0.150600 -0.340500 0.312000 0.288000 -0.896000
+-0.800000 -0.100400 -0.313000 0.368000 0.216000 -0.896000
+-0.750000 -0.150600 -0.317800 0.416000 0.384000 -0.816000
+-0.785000 -0.100400 -0.304800 0.328000 0.224000 -0.912000
+-0.750000 -0.129200 -0.304800 0.392000 0.376000 -0.832000
+-0.750000 -0.100400 -0.291100 0.336000 0.256000 -0.896000
+-0.731900 -0.150600 -0.304800 0.424000 0.400000 -0.808000
+-0.700000 -0.100400 -0.274700 0.392000 0.112000 -0.904000
+-0.700000 -0.150600 -0.284500 0.376000 0.392000 -0.832000
+-0.650000 -0.100400 -0.251900 0.448000 0.224000 -0.856000
+-0.650000 -0.150600 -0.267500 0.376000 0.464000 -0.792000
+-0.638400 -0.100400 -0.243900 0.560000 0.160000 -0.808000
+-0.612700 -0.150600 -0.243900 0.496000 0.576000 -0.640000
+-0.600000 -0.100400 -0.193800 0.776000 0.296000 -0.544000
+-0.600000 -0.150600 -0.229400 0.416000 0.744000 -0.512000
+-0.612700 -0.150600 -0.243900 0.496000 0.576000 -0.640000
+-0.600000 -0.160400 -0.243900 0.432000 0.688000 -0.576000
+-0.650000 -0.150600 -0.267500 0.376000 0.464000 -0.792000
+-0.600000 -0.200800 -0.299500 0.000000 0.872000 -0.480000
+-0.650000 -0.200800 -0.303800 0.136000 0.680000 -0.712000
+-0.600000 -0.203400 -0.304800 0.008000 0.768000 -0.632000
+-0.650000 -0.201600 -0.304800 0.104000 0.688000 -0.704000
+-0.600000 -0.251000 -0.360600 -0.120000 0.624000 -0.760000
+-0.650000 -0.251000 -0.354800 0.152000 0.632000 -0.752000
+-0.600000 -0.256300 -0.365800 -0.112000 0.608000 -0.776000
+-0.650000 -0.261300 -0.365800 0.088000 0.568000 -0.808000
+-0.600000 -0.301200 -0.399100 0.008000 0.480000 -0.872000
+-0.650000 -0.301200 -0.398600 0.000000 0.528000 -0.840000
+-0.650000 -0.261300 -0.365800 0.088000 0.568000 -0.808000
+-0.700000 -0.301200 -0.401600 0.016000 0.504000 -0.856000
+-0.700000 -0.252100 -0.365800 0.096000 0.552000 -0.824000
+-0.750000 -0.301200 -0.392900 -0.104000 0.352000 -0.928000
+-0.707800 -0.251000 -0.365800 0.064000 0.432000 -0.896000
+-0.750000 -0.251000 -0.369800 0.056000 0.280000 -0.952000
+-0.750000 -0.240500 -0.365800 0.056000 0.272000 -0.952000
+-0.800000 -0.251000 -0.370300 -0.064000 0.200000 -0.976000
+-0.800000 -0.234100 -0.365800 -0.112000 0.264000 -0.952000
+-0.828000 -0.251000 -0.365800 -0.248000 0.216000 -0.936000
+-0.800000 -0.200800 -0.355700 0.080000 0.256000 -0.960000
+-0.850000 -0.251000 -0.359600 -0.320000 0.248000 -0.912000
+-0.850000 -0.200800 -0.351200 -0.168000 0.112000 -0.976000
+-0.891700 -0.251000 -0.304800 -0.808000 -0.512000 -0.264000
+-0.900000 -0.200800 -0.331500 -0.576000 -0.328000 -0.736000
+-0.900000 -0.236500 -0.304800 -0.680000 -0.456000 -0.560000
+-0.931500 -0.200800 -0.304800 -0.648000 -0.520000 -0.544000
+-0.900000 -0.212400 -0.243900 -0.672000 -0.712000 0.176000
+-0.914100 -0.200800 -0.243900 -0.664000 -0.728000 0.128000
+-0.900000 -0.206900 -0.182900 -0.648000 -0.752000 0.056000
+-0.907400 -0.200800 -0.182900 -0.688000 -0.712000 0.072000
+-0.900000 -0.204500 -0.121900 -0.688000 -0.712000 0.104000
+-0.903800 -0.200800 -0.121900 -0.696000 -0.704000 0.120000
+-0.900000 -0.200800 -0.096200 -0.752000 -0.632000 0.128000
+-0.943100 -0.150600 -0.121900 -0.672000 -0.720000 0.120000
+-0.900000 -0.192500 -0.060900 -0.856000 -0.488000 0.144000
+-0.932400 -0.150600 -0.060900 -0.688000 -0.696000 0.176000
+-0.900000 -0.169600 0.000000 -0.800000 -0.552000 0.224000
+-0.915700 -0.150600 0.000000 -0.696000 -0.672000 0.232000
+-0.900000 -0.150600 0.057700 -0.744000 -0.616000 0.232000
+-0.950000 -0.123700 0.000000 -0.488000 -0.840000 0.216000
+-0.900000 -0.149700 0.060900 -0.696000 -0.664000 0.232000
+-0.950000 -0.110600 0.060900 -0.432000 -0.856000 0.248000
+-0.900000 -0.127600 0.121900 -0.608000 -0.704000 0.344000
+-0.950000 -0.100400 0.101700 -0.400000 -0.872000 0.264000
+-0.939400 -0.100400 0.121900 -0.456000 -0.816000 0.336000
+-0.950000 -0.095300 0.121900 -0.400000 -0.864000 0.280000
+-0.900000 -0.100400 0.174900 -0.400000 -0.624000 0.656000
+-0.950000 -0.074300 0.182900 -0.344000 -0.776000 0.520000
+-0.900000 -0.094400 0.182900 -0.312000 -0.608000 0.720000
+-0.950000 -0.050200 0.212200 0.160000 -0.384000 0.904000
+-0.900000 -0.050200 0.208600 0.200000 -0.168000 0.960000
+-0.950000 0.000000 0.224500 0.344000 -0.144000 0.920000
+-0.900000 0.000000 0.204000 0.296000 0.088000 0.944000
+-0.900000 -0.050200 0.208600 0.200000 -0.168000 0.960000
+-0.850000 0.000000 0.186200 0.256000 0.144000 0.952000
+-0.850000 -0.050200 0.193400 0.200000 0.072000 0.968000
+-0.900000 -0.050200 0.208600 0.200000 -0.168000 0.960000
+-0.850000 -0.100400 0.192600 -0.136000 -0.312000 0.936000
+-0.900000 -0.094400 0.182900 -0.312000 -0.608000 0.720000
+-0.886800 -0.100400 0.182900 -0.288000 -0.576000 0.752000
+-0.900000 -0.100400 0.174900 -0.400000 -0.624000 0.656000
+-0.850000 -0.137400 0.182900 -0.304000 -0.312000 0.896000
+-0.900000 -0.127600 0.121900 -0.608000 -0.704000 0.344000
+-0.850000 -0.150600 0.175600 -0.632000 -0.392000 0.664000
+-0.878400 -0.150600 0.121900 -0.736000 -0.560000 0.368000
+-0.850000 -0.200800 0.125700 -0.776000 -0.360000 0.504000
+-0.851500 -0.200800 0.121900 -0.832000 -0.360000 0.408000
+-0.850000 -0.203500 0.121900 -0.792000 -0.528000 0.288000
+-0.869300 -0.200800 0.060900 -0.824000 -0.496000 0.248000
+-0.850000 -0.233200 0.060900 -0.816000 -0.512000 0.248000
+-0.882700 -0.200800 0.000000 -0.840000 -0.496000 0.192000
+-0.850000 -0.251000 0.014600 -0.800000 -0.560000 0.176000
+-0.852600 -0.251000 0.000000 -0.800000 -0.568000 0.168000
+-0.850000 -0.254700 0.000000 -0.800000 -0.568000 0.168000
+-0.860100 -0.251000 -0.060900 -0.808000 -0.568000 0.112000
+-0.850000 -0.265600 -0.060900 -0.808000 -0.568000 0.104000
+-0.866600 -0.251000 -0.121900 -0.808000 -0.576000 0.072000
+-0.850000 -0.274400 -0.121900 -0.816000 -0.568000 0.008000
+-0.864200 -0.251000 -0.182900 -0.800000 -0.592000 0.000000
+-0.850000 -0.271300 -0.182900 -0.816000 -0.568000 0.032000
+-0.869200 -0.251000 -0.243900 -0.768000 -0.600000 0.200000
+-0.850000 -0.276800 -0.243900 -0.792000 -0.552000 0.248000
+-0.891700 -0.251000 -0.304800 -0.808000 -0.512000 -0.264000
+-0.850000 -0.301200 -0.293400 -0.744000 -0.560000 0.336000
+-0.854400 -0.301200 -0.304800 -0.776000 -0.608000 0.112000
+-0.850000 -0.306900 -0.304800 -0.768000 -0.624000 0.072000
+-0.850000 -0.301200 -0.321900 -0.728000 -0.616000 -0.280000
+-0.854400 -0.301200 -0.304800 -0.776000 -0.608000 0.112000
+-0.850000 -0.251000 -0.359600 -0.320000 0.248000 -0.912000
+-0.891700 -0.251000 -0.304800 -0.808000 -0.512000 -0.264000
+-0.891700 -0.251000 -0.304800 -0.808000 -0.512000 -0.264000
+-1.000000 0.100400 0.207000 0.040000 0.608000 0.784000
+-1.000000 0.100400 0.207000 0.040000 0.608000 0.784000
+-0.950000 0.100400 0.204500 0.176000 0.504000 0.840000
+-1.000000 0.136100 0.182900 0.152000 0.600000 0.776000
+-0.950000 0.127100 0.182900 0.248000 0.536000 0.800000
+-1.000000 0.150600 0.170300 0.208000 0.568000 0.792000
+-0.950000 0.150600 0.154300 0.208000 0.640000 0.736000
+-1.000000 0.192500 0.121900 0.192000 0.664000 0.720000
+-0.950000 0.178500 0.121900 0.272000 0.648000 0.704000
+-1.000000 0.200800 0.112700 0.192000 0.656000 0.720000
+-0.950000 0.200800 0.096100 0.208000 0.672000 0.704000
+-1.000000 0.241600 0.060900 0.248000 0.768000 0.584000
+-0.950000 0.226300 0.060900 0.264000 0.760000 0.584000
+-1.000000 0.251000 0.045400 0.264000 0.768000 0.568000
+-0.950000 0.251000 0.016800 0.288000 0.808000 0.504000
+-1.000000 0.274600 0.000000 0.264000 0.848000 0.448000
+-0.950000 0.258900 0.000000 0.296000 0.848000 0.432000
+-1.000000 0.294800 -0.060900 0.312000 0.944000 0.080000
+-0.950000 0.277400 -0.060900 0.336000 0.928000 0.080000
+-1.000000 0.286500 -0.121900 0.328000 0.872000 -0.344000
+-0.950000 0.267200 -0.121900 0.344000 0.864000 -0.336000
+-1.000000 0.256900 -0.182900 0.288000 0.752000 -0.584000
+-0.950000 0.251000 -0.157200 0.320000 0.808000 -0.480000
+-0.985000 0.251000 -0.182900 0.288000 0.752000 -0.576000
+-0.950000 0.237800 -0.182900 0.296000 0.760000 -0.568000
+-1.000000 0.251000 -0.191500 0.280000 0.728000 -0.616000
+-0.950000 0.200800 -0.231900 0.272000 0.640000 -0.704000
+-1.000000 0.207900 -0.243900 0.232000 0.640000 -0.728000
+-0.980800 0.200800 -0.243900 0.232000 0.632000 -0.736000
+-1.000000 0.200800 -0.251300 0.232000 0.624000 -0.736000
+-0.950000 0.189400 -0.243900 0.264000 0.616000 -0.728000
+-1.000000 0.150600 -0.296000 0.168000 0.544000 -0.816000
+-0.950000 0.150600 -0.281200 0.240000 0.600000 -0.752000
+-1.000000 0.137800 -0.304800 0.104000 0.472000 -0.872000
+-0.950000 0.126000 -0.304800 0.168000 0.528000 -0.824000
+-1.000000 0.100400 -0.326700 0.072000 0.384000 -0.912000
+-0.950000 0.100400 -0.325900 0.192000 0.384000 -0.896000
+-1.000000 0.050200 -0.349300 0.080000 0.216000 -0.968000
+-0.950000 0.050200 -0.340200 0.184000 0.072000 -0.976000
+-1.000000 0.000000 -0.357700 0.216000 -0.064000 -0.968000
+-0.950000 0.000000 -0.337100 0.184000 -0.088000 -0.976000
+-1.000000 -0.050200 -0.339100 0.152000 -0.176000 -0.968000
+-0.950000 -0.050200 -0.337400 0.088000 0.008000 -0.992000
+-1.000000 -0.100400 -0.332000 -0.256000 -0.392000 -0.880000
+-0.950000 -0.100400 -0.349400 -0.088000 -0.160000 -0.976000
+-0.950000 -0.050200 -0.337400 0.088000 0.008000 -0.992000
+-0.900000 -0.100400 -0.346700 0.112000 -0.048000 -0.984000
+-0.900000 -0.050200 -0.330000 0.160000 0.128000 -0.976000
+-0.850000 -0.100400 -0.332400 0.280000 0.112000 -0.952000
+-0.850000 -0.050200 -0.323400 0.248000 0.176000 -0.944000
+-0.800000 -0.100400 -0.313000 0.368000 0.216000 -0.896000
+-0.808200 -0.050200 -0.304800 0.280000 0.136000 -0.944000
+-0.800000 -0.066700 -0.304800 0.296000 0.144000 -0.936000
+-0.800000 -0.050200 -0.302200 0.264000 0.120000 -0.952000
+-0.785000 -0.100400 -0.304800 0.328000 0.224000 -0.912000
+-0.750000 -0.050200 -0.287100 0.288000 0.040000 -0.952000
+-0.750000 -0.100400 -0.291100 0.336000 0.256000 -0.896000
+-0.700000 -0.050200 -0.272000 0.360000 0.104000 -0.920000
+-0.700000 -0.100400 -0.274700 0.392000 0.112000 -0.904000
+-0.650000 -0.050200 -0.249300 0.496000 0.208000 -0.840000
+-0.650000 -0.100400 -0.251900 0.448000 0.224000 -0.856000
+-0.642900 -0.050200 -0.243900 0.560000 0.208000 -0.792000
+-0.638400 -0.100400 -0.243900 0.560000 0.160000 -0.808000
+-0.606100 -0.050200 -0.182900 0.864000 0.248000 -0.424000
+-0.600000 -0.100400 -0.193800 0.776000 0.296000 -0.544000
+-0.600000 -0.077900 -0.182900 0.856000 0.208000 -0.464000
+-0.606100 -0.050200 -0.182900 0.864000 0.248000 -0.424000
+-0.600000 -0.050200 -0.162700 0.904000 0.232000 -0.344000
+-0.621400 0.000000 -0.182900 0.848000 0.280000 -0.440000
+-0.600000 -0.008200 -0.121900 0.848000 0.208000 -0.472000
+-0.601900 0.000000 -0.121900 0.848000 0.208000 -0.472000
+-0.600000 0.000000 -0.117700 0.848000 0.200000 -0.488000
+-0.614300 0.050200 -0.121900 0.720000 0.480000 -0.480000
+-0.600000 0.050200 -0.083400 0.800000 0.528000 -0.248000
+-0.650000 0.089500 -0.121900 0.728000 0.552000 -0.384000
+-0.600000 0.057600 -0.060900 0.728000 0.536000 0.408000
+-0.650000 0.100400 -0.098000 0.720000 0.624000 -0.288000
+-0.638000 0.100400 -0.060900 0.672000 0.632000 0.368000
+-0.650000 0.112000 -0.060900 0.672000 0.704000 0.200000
+-0.650000 0.100400 -0.043200 0.600000 0.608000 0.496000
+-0.689800 0.150600 -0.060900 0.640000 0.736000 0.192000
+-0.680200 0.100400 0.000000 0.600000 0.440000 0.656000
+-0.700000 0.150600 -0.043600 0.552000 0.712000 0.424000
+-0.700000 0.121800 0.000000 0.536000 0.544000 0.632000
+-0.734000 0.150600 0.000000 0.496000 0.640000 0.576000
+-0.700000 0.100400 0.019100 0.504000 0.504000 0.688000
+-0.750000 0.150600 0.014500 0.472000 0.624000 0.608000
+-0.744800 0.100400 0.060900 0.496000 0.456000 0.728000
+-0.750000 0.106000 0.060900 0.496000 0.464000 0.728000
+-0.750000 0.100400 0.065100 0.488000 0.448000 0.736000
+-0.796300 0.150600 0.060900 0.512000 0.584000 0.616000
+-0.800000 0.100400 0.105500 0.480000 0.456000 0.736000
+-0.800000 0.150600 0.064100 0.424000 0.560000 0.704000
+-0.820700 0.100400 0.121900 0.496000 0.488000 0.704000
+-0.850000 0.150600 0.098600 0.360000 0.600000 0.704000
+-0.850000 0.127100 0.121900 0.424000 0.560000 0.704000
+-0.892900 0.150600 0.121900 0.360000 0.624000 0.680000
+-0.850000 0.100400 0.150400 0.488000 0.512000 0.696000
+-0.900000 0.150600 0.126400 0.344000 0.632000 0.688000
+-0.897500 0.100400 0.182900 0.392000 0.408000 0.816000
+-0.900000 0.101900 0.182900 0.304000 0.552000 0.768000
+-0.900000 0.100400 0.184100 0.296000 0.408000 0.856000
+-0.950000 0.127100 0.182900 0.248000 0.536000 0.800000
+-0.950000 0.100400 0.204500 0.176000 0.504000 0.840000
+-0.950000 0.100400 0.204500 0.176000 0.504000 0.840000
+-0.886800 -0.100400 0.182900 -0.288000 -0.576000 0.752000
+-0.886800 -0.100400 0.182900 -0.288000 -0.576000 0.752000
+-0.850000 -0.100400 0.192600 -0.136000 -0.312000 0.936000
+-0.850000 -0.137400 0.182900 -0.304000 -0.312000 0.896000
+-0.850000 -0.137400 0.182900 -0.304000 -0.312000 0.896000
+-0.800000 -0.100400 0.186900 0.104000 0.048000 0.992000
+-0.800000 -0.100400 0.186900 0.104000 0.048000 0.992000
+-0.800000 -0.063400 0.182900 0.240000 0.160000 0.952000
+-0.776900 -0.100400 0.182900 0.184000 0.120000 0.968000
+-0.800000 -0.050200 0.179900 0.264000 0.176000 0.944000
+-0.750000 -0.100400 0.174700 0.320000 0.192000 0.920000
+-0.750000 -0.050200 0.155100 0.464000 0.288000 0.832000
+-0.700000 -0.100400 0.138900 0.488000 0.288000 0.816000
+-0.708600 -0.050200 0.121900 0.496000 0.344000 0.784000
+-0.700000 -0.062200 0.121900 0.504000 0.344000 0.784000
+-0.700000 -0.050200 0.115300 0.496000 0.344000 0.792000
+-0.677900 -0.100400 0.121900 0.528000 0.328000 0.776000
+-0.650000 -0.050200 0.076400 0.576000 0.320000 0.744000
+-0.650000 -0.100400 0.096100 0.592000 0.288000 0.744000
+-0.635700 -0.050200 0.060900 0.640000 0.304000 0.696000
+-0.612900 -0.100400 0.060900 0.624000 0.376000 0.672000
+-0.600000 -0.050200 0.018400 0.648000 0.320000 0.688000
+-0.600000 -0.100400 0.044600 0.672000 0.336000 0.656000
+-0.584800 -0.050200 0.000000 0.744000 0.336000 0.568000
+-0.565600 -0.100400 0.000000 0.744000 0.440000 0.496000
+-0.554400 -0.050200 -0.060900 0.944000 0.280000 0.128000
+-0.550000 -0.100400 -0.036900 0.792000 0.376000 0.464000
+-0.550000 -0.066800 -0.060900 0.944000 0.320000 -0.008000
+-0.533200 -0.100400 -0.060900 0.712000 0.696000 -0.024000
+-0.550000 -0.100400 -0.079500 0.552000 0.552000 -0.616000
+-0.500000 -0.119500 -0.060900 -0.160000 0.976000 0.112000
+-0.550000 -0.145600 -0.121900 0.512000 0.792000 -0.312000
+-0.500000 -0.144400 -0.121900 -0.376000 0.880000 -0.280000
+-0.550000 -0.150600 -0.142400 0.376000 0.896000 -0.200000
+-0.500000 -0.150600 -0.154000 -0.424000 0.880000 -0.160000
+-0.550000 -0.155500 -0.182900 0.296000 0.920000 -0.232000
+-0.500000 -0.154300 -0.182900 -0.320000 0.920000 -0.176000
+-0.550000 -0.172700 -0.243900 0.008000 0.856000 -0.512000
+-0.500000 -0.169200 -0.243900 -0.328000 0.880000 -0.312000
+-0.550000 -0.200800 -0.303600 -0.040000 0.880000 -0.464000
+-0.500000 -0.196700 -0.304800 -0.120000 0.848000 -0.504000
+-0.544700 -0.200800 -0.304800 -0.080000 0.824000 -0.552000
+-0.500000 -0.200800 -0.313000 -0.112000 0.824000 -0.544000
+-0.550000 -0.201300 -0.304800 -0.032000 0.864000 -0.488000
+-0.500000 -0.238600 -0.365800 -0.072000 0.656000 -0.744000
+-0.550000 -0.245600 -0.365800 -0.104000 0.680000 -0.720000
+-0.500000 -0.251000 -0.377000 -0.032000 0.528000 -0.840000
+-0.550000 -0.251000 -0.371400 -0.120000 0.616000 -0.768000
+-0.500000 -0.301200 -0.402500 0.040000 0.344000 -0.936000
+-0.550000 -0.301200 -0.401000 0.000000 0.424000 -0.904000
+-0.500000 -0.351500 -0.423900 0.056000 0.504000 -0.856000
+-0.550000 -0.349500 -0.426800 0.056000 0.416000 -0.904000
+-0.538500 -0.351500 -0.426800 0.048000 0.480000 -0.872000
+-0.500000 -0.351500 -0.423900 0.056000 0.504000 -0.856000
+-0.500000 -0.355300 -0.426800 0.056000 0.520000 -0.848000
+-0.450000 -0.351500 -0.418600 0.080000 0.512000 -0.848000
+-0.450000 -0.362400 -0.426800 0.064000 0.520000 -0.848000
+-0.400000 -0.351500 -0.411400 0.000000 0.616000 -0.784000
+-0.400000 -0.368700 -0.426800 0.024000 0.560000 -0.824000
+-0.350000 -0.351500 -0.416300 -0.176000 0.600000 -0.768000
+-0.350000 -0.360100 -0.426800 -0.128000 0.680000 -0.712000
+-0.319100 -0.351500 -0.426800 -0.216000 0.568000 -0.784000
+-0.350000 -0.351500 -0.416300 -0.176000 0.600000 -0.768000
+-0.300000 -0.341100 -0.426800 -0.128000 0.536000 -0.832000
+-0.350000 -0.301200 -0.377400 0.232000 0.208000 -0.944000
+-0.300000 -0.301200 -0.369600 0.320000 0.544000 -0.768000
+-0.350000 -0.251000 -0.367200 0.240000 0.168000 -0.952000
+-0.300000 -0.296900 -0.365800 0.296000 0.528000 -0.784000
+-0.345700 -0.251000 -0.365800 0.320000 0.336000 -0.880000
+-0.300000 -0.251000 -0.348000 0.192000 0.248000 -0.944000
+-0.350000 -0.248400 -0.365800 0.184000 0.424000 -0.880000
+-0.300000 -0.200800 -0.340600 0.016000 0.280000 -0.952000
+-0.350000 -0.200800 -0.339000 0.200000 0.416000 -0.880000
+-0.300000 -0.150600 -0.319300 -0.256000 0.480000 -0.832000
+-0.350000 -0.159400 -0.304800 -0.248000 0.528000 -0.808000
+-0.331500 -0.150600 -0.304800 -0.256000 0.464000 -0.840000
+-0.350000 -0.150600 -0.298700 -0.264000 0.464000 -0.840000
+-0.300000 -0.118900 -0.304800 -0.376000 0.264000 -0.880000
+-0.350000 -0.100400 -0.248500 -0.576000 0.440000 -0.680000
+-0.300000 -0.100400 -0.298100 -0.480000 0.288000 -0.824000
+-0.350000 -0.093900 -0.243900 -0.600000 0.408000 -0.680000
+-0.300000 -0.050200 -0.270300 -0.824000 0.232000 -0.512000
+-0.321700 -0.050200 -0.243900 -0.656000 0.344000 -0.656000
+-0.300000 0.000000 -0.248500 -0.656000 0.560000 -0.488000
+-0.301700 0.000000 -0.243900 -0.744000 0.392000 -0.536000
+-0.300000 0.001800 -0.243900 -0.496000 0.680000 -0.520000
+-0.340600 0.000000 -0.182900 -0.696000 0.480000 -0.520000
+-0.300000 0.050200 -0.185100 -0.648000 0.560000 -0.504000
+-0.301000 0.050200 -0.182900 -0.704000 0.472000 -0.512000
+-0.300000 0.052000 -0.182900 -0.664000 0.464000 -0.568000
+-0.335400 0.050200 -0.121900 -0.752000 0.472000 -0.456000
+-0.300000 0.100400 -0.141500 -0.560000 0.512000 -0.640000
+-0.317300 0.100400 -0.121900 -0.712000 0.264000 -0.640000
+-0.300000 0.144000 -0.121900 -0.728000 0.496000 -0.456000
+-0.350000 0.100400 -0.076700 -0.736000 0.256000 -0.616000
+-0.300000 0.150600 -0.105900 -0.768000 0.536000 -0.320000
+-0.350000 0.148000 -0.060900 -0.504000 0.552000 0.656000
+-0.346000 0.150600 -0.060900 -0.768000 -0.144000 0.616000
+-0.350000 0.100400 -0.017600 -0.744000 0.352000 0.552000
+-0.300000 0.150600 -0.036000 -0.360000 0.064000 0.920000
+-0.321000 0.100400 0.000000 -0.264000 0.416000 0.864000
+-0.300000 0.112500 0.000000 -0.064000 0.472000 0.872000
+-0.300000 0.100400 0.006400 -0.200000 0.408000 0.880000
+-0.250000 0.104200 0.000000 0.144000 0.480000 0.856000
+-0.250000 0.100400 0.002600 0.144000 0.496000 0.848000
+-0.238500 0.100400 0.000000 0.152000 0.496000 0.848000
+-0.250000 0.050200 0.048300 0.000000 0.552000 0.832000
+-0.200000 0.089800 0.000000 0.216000 0.544000 0.800000
+-0.200000 0.050200 0.037800 0.512000 0.448000 0.720000
+-0.163800 0.050200 0.000000 0.704000 0.216000 0.664000
+-0.200000 0.020500 0.060900 0.664000 0.440000 0.600000
+-0.150800 0.000000 0.000000 0.744000 0.072000 0.656000
+-0.190300 0.000000 0.060900 0.816000 0.200000 0.536000
+-0.152800 -0.050200 0.000000 0.848000 0.032000 0.520000
+-0.193200 -0.050200 0.060900 0.808000 0.008000 0.584000
+-0.150600 -0.100400 0.000000 0.800000 0.040000 0.592000
+-0.190200 -0.100400 0.060900 0.752000 -0.248000 0.600000
+-0.150000 -0.104300 0.000000 0.496000 0.120000 0.848000
+-0.200000 -0.121800 0.060900 0.728000 -0.328000 0.592000
+-0.150000 -0.150600 0.010200 0.376000 0.208000 0.896000
+-0.200000 -0.150600 0.042600 0.640000 -0.096000 0.752000
+-0.150000 -0.200800 0.013600 0.104000 0.200000 0.968000
+-0.200000 -0.200800 0.045500 0.568000 -0.152000 0.808000
+-0.150000 -0.251000 0.002400 -0.056000 -0.176000 0.976000
+-0.200000 -0.251000 0.018200 0.408000 -0.392000 0.816000
+-0.150000 -0.301200 0.010200 -0.304000 -0.280000 0.904000
+-0.200000 -0.279600 0.000000 -0.016000 -0.496000 0.864000
+-0.169100 -0.301200 0.000000 -0.376000 -0.392000 0.832000
+-0.200000 -0.301200 -0.017500 -0.064000 -0.432000 0.896000
+-0.150000 -0.346200 0.000000 -0.392000 -0.160000 0.904000
+-0.200000 -0.351500 -0.031500 -0.320000 -0.128000 0.936000
+-0.150000 -0.351500 -0.001100 -0.192000 -0.352000 0.912000
+-0.200000 -0.401700 -0.023400 -0.056000 -0.008000 0.992000
+-0.150000 -0.401700 -0.019000 0.408000 -0.232000 0.880000
+-0.200000 -0.451900 -0.018000 0.376000 -0.112000 0.912000
+-0.150000 -0.451900 -0.041900 0.560000 -0.440000 0.696000
+-0.200000 -0.502100 -0.039000 0.512000 -0.608000 0.592000
+-0.150000 -0.470000 -0.060900 0.568000 -0.552000 0.600000
+-0.181900 -0.502100 -0.060900 0.504000 -0.680000 0.520000
+-0.150000 -0.502100 -0.111600 0.592000 -0.752000 0.280000
+-0.200000 -0.511900 -0.060900 0.416000 -0.800000 0.424000
+-0.150000 -0.505100 -0.121900 0.584000 -0.768000 0.240000
+-0.200000 -0.534300 -0.121900 0.456000 -0.832000 0.296000
+-0.150000 -0.510100 -0.182900 0.616000 -0.760000 0.168000
+-0.200000 -0.549300 -0.182900 0.504000 -0.784000 0.344000
+-0.150000 -0.530700 -0.243900 0.632000 -0.664000 0.392000
+-0.200000 -0.552300 -0.190900 0.520000 -0.768000 0.360000
+-0.172800 -0.552300 -0.243900 0.592000 -0.568000 0.560000
+-0.200000 -0.579600 -0.243900 0.568000 -0.648000 0.496000
+-0.150000 -0.552300 -0.270100 0.544000 -0.504000 0.656000
+-0.200000 -0.602500 -0.268600 0.488000 -0.432000 0.752000
+-0.150000 -0.602500 -0.302600 0.392000 -0.240000 0.880000
+-0.200000 -0.652700 -0.286600 0.488000 -0.272000 0.824000
+-0.150000 -0.609400 -0.304800 0.840000 -0.512000 0.152000
+-0.171500 -0.652700 -0.304800 0.576000 -0.304000 0.752000
+-0.150000 -0.602500 -0.307600 0.456000 -0.280000 -0.840000
+-0.200000 -0.652700 -0.326500 0.488000 -0.272000 -0.824000
+-0.200000 -0.602500 -0.345500 0.488000 -0.272000 -0.824000
+-0.250000 -0.652700 -0.361600 0.240000 -0.216000 -0.944000
+-0.229500 -0.602500 -0.365800 0.408000 -0.240000 -0.872000
+-0.250000 -0.639500 -0.365800 0.216000 -0.224000 -0.944000
+-0.250000 -0.602500 -0.376000 0.360000 -0.328000 -0.872000
+-0.282800 -0.652700 -0.365800 0.080000 -0.160000 -0.976000
+-0.300000 -0.602500 -0.397300 -0.248000 -0.488000 -0.832000
+-0.300000 -0.652700 -0.367500 0.064000 -0.112000 -0.984000
+-0.328400 -0.602500 -0.365800 -0.832000 -0.248000 -0.488000
+-0.350000 -0.652700 -0.376000 0.560000 0.160000 -0.808000
+-0.350000 -0.629600 -0.365800 0.056000 0.640000 -0.760000
+-0.400000 -0.652700 -0.368100 -0.128000 -0.872000 -0.456000
+-0.357100 -0.602500 -0.365800 0.904000 0.256000 -0.312000
+-0.400000 -0.621700 -0.426800 0.392000 -0.856000 -0.304000
+-0.370300 -0.602500 -0.426800 0.624000 -0.760000 -0.160000
+-0.357100 -0.602500 -0.365800 0.904000 0.256000 -0.312000
+-0.350000 -0.582100 -0.426800 0.344000 -0.808000 -0.456000
+-0.350000 -0.585900 -0.365800 0.168000 -0.792000 -0.576000
+-0.300000 -0.582000 -0.426800 0.336000 -0.608000 -0.712000
+-0.328400 -0.602500 -0.365800 -0.832000 -0.248000 -0.488000
+-0.300000 -0.602500 -0.397300 -0.248000 -0.488000 -0.832000
+-0.300000 -0.582000 -0.426800 0.336000 -0.608000 -0.712000
+-0.250000 -0.602500 -0.376000 0.360000 -0.328000 -0.872000
+-0.275900 -0.552300 -0.426800 0.528000 -0.480000 -0.696000
+-0.250000 -0.552300 -0.402600 0.504000 -0.312000 -0.792000
+-0.250000 -0.526200 -0.426800 0.576000 -0.448000 -0.672000
+-0.200000 -0.552300 -0.367100 0.360000 -0.232000 -0.896000
+-0.235700 -0.502100 -0.426800 0.696000 -0.464000 -0.536000
+-0.200000 -0.502100 -0.370700 0.184000 -0.352000 -0.912000
+-0.200000 -0.459900 -0.426800 0.560000 -0.592000 -0.576000
+-0.150000 -0.502100 -0.367300 0.088000 -0.320000 -0.936000
+-0.191200 -0.451900 -0.426800 0.664000 -0.480000 -0.560000
+-0.150000 -0.451900 -0.368100 0.456000 -0.056000 -0.880000
+-0.194300 -0.401700 -0.426800 0.792000 0.416000 -0.432000
+-0.150000 -0.417500 -0.365800 0.544000 0.056000 -0.832000
+-0.151700 -0.401700 -0.365800 0.568000 0.104000 -0.808000
+-0.150000 -0.401700 -0.364300 0.552000 0.080000 -0.824000
+-0.200000 -0.365300 -0.365800 0.504000 0.768000 -0.376000
+-0.150000 -0.351500 -0.350300 0.512000 0.192000 -0.832000
+-0.200000 -0.351500 -0.343300 0.312000 0.640000 -0.696000
+-0.150000 -0.301200 -0.318500 -0.024000 0.504000 -0.856000
+-0.200000 -0.301200 -0.313400 0.328000 0.152000 -0.928000
+-0.150000 -0.286300 -0.304800 -0.184000 0.480000 -0.848000
+-0.200000 -0.251000 -0.307600 0.408000 0.096000 -0.904000
+-0.195100 -0.251000 -0.304800 0.376000 0.112000 -0.912000
+-0.200000 -0.200800 -0.306700 0.368000 -0.184000 -0.904000
+-0.196100 -0.200800 -0.304800 0.360000 -0.200000 -0.904000
+-0.200000 -0.150600 -0.333300 0.216000 -0.272000 -0.936000
+-0.150000 -0.159100 -0.304800 0.152000 -0.400000 -0.896000
+-0.150000 -0.150600 -0.309500 -0.032000 -0.400000 -0.912000
+-0.108400 -0.200800 -0.304800 -0.496000 -0.048000 -0.856000
+-0.100000 -0.150600 -0.315000 -0.456000 -0.064000 -0.880000
+-0.100000 -0.200800 -0.311700 -0.496000 0.128000 -0.856000
+-0.050000 -0.150600 -0.332400 0.016000 -0.080000 -0.992000
+-0.050000 -0.200800 -0.320900 -0.056000 0.280000 -0.952000
+0.000000 -0.150600 -0.318000 0.160000 0.016000 -0.984000
+0.000000 -0.200800 -0.332000 -0.296000 0.528000 -0.784000
+0.050000 -0.150600 -0.318000 0.352000 0.312000 -0.872000
+0.050000 -0.200800 -0.360800 -0.016000 0.576000 -0.808000
+0.096000 -0.150600 -0.304800 0.176000 0.336000 -0.920000
+0.100000 -0.200800 -0.352600 0.240000 0.528000 -0.800000
+0.100000 -0.151600 -0.304800 -0.176000 0.536000 -0.816000
+0.150000 -0.200800 -0.325200 0.160000 0.176000 -0.968000
+0.101900 -0.150600 -0.304800 -0.296000 0.368000 -0.872000
+0.150000 -0.150600 -0.323600 -0.232000 0.464000 -0.848000
+0.114400 -0.100400 -0.304800 -0.344000 0.128000 -0.928000
+0.150000 -0.100400 -0.322200 0.000000 0.224000 -0.968000
+0.150000 -0.064700 -0.304800 -0.200000 0.328000 -0.912000
+0.185500 -0.100400 -0.304800 0.296000 0.104000 -0.944000
+0.150000 -0.050200 -0.298400 -0.176000 0.328000 -0.920000
+0.200000 -0.100400 -0.298900 0.088000 0.040000 -0.992000
+0.188500 -0.050200 -0.304800 -0.128000 0.184000 -0.968000
+0.200000 -0.061600 -0.304800 0.000000 -0.144000 -0.984000
+0.200000 -0.050200 -0.307000 0.000000 0.192000 -0.976000
+0.211400 -0.050200 -0.304800 0.152000 0.184000 -0.968000
+0.200000 -0.045300 -0.304800 -0.008000 0.344000 -0.936000
+0.250000 -0.050200 -0.297000 0.000000 0.040000 -0.992000
+0.200000 0.000000 -0.277300 0.080000 0.528000 -0.840000
+0.250000 0.000000 -0.271900 -0.336000 0.528000 -0.776000
+0.200000 0.025700 -0.243900 0.016000 0.752000 -0.648000
+0.250000 0.018500 -0.243900 -0.144000 0.856000 -0.480000
+0.200000 0.019700 -0.182900 0.160000 0.648000 0.736000
+0.250000 0.002800 -0.182900 0.128000 0.640000 0.752000
+0.200000 0.000000 -0.161400 0.032000 0.656000 0.752000
+0.250000 0.000000 -0.180400 0.176000 0.568000 0.792000
+0.200000 -0.041200 -0.121900 0.160000 0.488000 0.856000
+0.250000 -0.050200 -0.132500 0.192000 0.528000 0.816000
+0.222300 -0.050200 -0.121900 0.200000 0.432000 0.872000
+0.250000 -0.068700 -0.121900 0.096000 0.400000 0.904000
+0.200000 -0.050200 -0.116900 0.136000 0.368000 0.912000
+0.250000 -0.100400 -0.106800 0.080000 0.336000 0.936000
+0.200000 -0.100400 -0.095800 0.064000 0.272000 0.952000
+0.250000 -0.150600 -0.087200 0.040000 0.104000 0.992000
+0.200000 -0.150600 -0.099300 0.040000 0.104000 0.992000
+0.250000 -0.200800 -0.084100 0.120000 -0.168000 0.976000
+0.200000 -0.200800 -0.086600 0.112000 -0.336000 0.928000
+0.250000 -0.237200 -0.121900 0.048000 -0.656000 0.744000
+0.200000 -0.240500 -0.121900 0.152000 -0.656000 0.728000
+0.250000 -0.251000 -0.140300 -0.072000 -0.512000 0.848000
+0.200000 -0.251000 -0.134700 0.128000 -0.784000 0.600000
+0.250000 -0.301200 -0.149400 -0.376000 -0.584000 0.712000
+0.200000 -0.290700 -0.182900 -0.520000 -0.680000 0.512000
+0.211500 -0.301200 -0.182900 -0.568000 -0.672000 0.464000
+0.200000 -0.301200 -0.206400 -0.600000 -0.688000 0.384000
+0.250000 -0.319600 -0.182900 -0.280000 -0.832000 0.472000
+0.200000 -0.319700 -0.243900 -0.624000 -0.696000 0.328000
+0.250000 -0.343100 -0.243900 -0.320000 -0.920000 0.208000
+0.200000 -0.340400 -0.304800 -0.480000 -0.448000 -0.744000
+0.250000 -0.348300 -0.304800 -0.128000 -0.736000 -0.656000
+0.200000 -0.301200 -0.321600 -0.488000 -0.368000 -0.784000
+0.250000 -0.313600 -0.365800 -0.336000 -0.640000 -0.680000
+0.236200 -0.301200 -0.365800 -0.608000 -0.320000 -0.712000
+0.250000 -0.301200 -0.379400 -0.536000 -0.264000 -0.792000
+0.250000 -0.271800 -0.365800 -0.320000 0.360000 -0.872000
+0.300000 -0.301200 -0.372900 0.128000 -0.472000 -0.864000
+0.300000 -0.284400 -0.365800 0.136000 0.360000 -0.920000
+0.333500 -0.301200 -0.365800 0.208000 -0.080000 -0.968000
+0.300000 -0.251000 -0.347800 0.304000 0.384000 -0.864000
+0.350000 -0.301200 -0.360500 0.376000 0.184000 -0.904000
+0.350000 -0.251000 -0.329500 0.536000 0.472000 -0.688000
+0.400000 -0.301200 -0.307300 0.704000 0.496000 -0.496000
+0.366700 -0.251000 -0.304800 0.704000 0.488000 -0.496000
+0.400000 -0.299100 -0.304800 0.736000 0.472000 -0.472000
+0.399000 -0.251000 -0.243900 0.912000 -0.008000 -0.392000
+0.400000 -0.252300 -0.243900 0.744000 0.488000 -0.440000
+0.398900 -0.251000 -0.182900 0.896000 -0.160000 0.400000
+0.400000 -0.252800 -0.182900 0.760000 0.464000 0.440000
+0.354900 -0.251000 -0.121900 0.704000 -0.304000 0.632000
+0.400000 -0.301200 -0.149800 0.528000 0.376000 0.752000
+0.350000 -0.260400 -0.121900 0.448000 -0.472000 0.752000
+0.350000 -0.301200 -0.148100 0.392000 -0.048000 0.912000
+0.328900 -0.251000 -0.121900 -0.264000 -0.304000 0.912000
+0.300000 -0.301200 -0.149800 -0.024000 -0.480000 0.872000
+0.300000 -0.251000 -0.132800 -0.224000 -0.464000 0.856000
+0.250000 -0.301200 -0.149400 -0.376000 -0.584000 0.712000
+0.250000 -0.251000 -0.140300 -0.072000 -0.512000 0.848000
+0.300000 -0.251000 -0.132800 -0.224000 -0.464000 0.856000
+0.250000 -0.237200 -0.121900 0.048000 -0.656000 0.744000
+0.300000 -0.234400 -0.121900 0.104000 -0.472000 0.872000
+0.250000 -0.200800 -0.084100 0.120000 -0.168000 0.976000
+0.300000 -0.200800 -0.101500 0.424000 -0.216000 0.872000
+0.250000 -0.150600 -0.087200 0.040000 0.104000 0.992000
+0.300000 -0.150600 -0.090800 0.240000 -0.024000 0.968000
+0.250000 -0.100400 -0.106800 0.080000 0.336000 0.936000
+0.300000 -0.100400 -0.098900 -0.360000 0.344000 0.856000
+0.250000 -0.068700 -0.121900 0.096000 0.400000 0.904000
+0.300000 -0.060700 -0.121900 -0.512000 0.456000 0.720000
+0.250000 -0.050200 -0.132500 0.192000 0.528000 0.816000
+0.300000 -0.050200 -0.130700 -0.504000 0.472000 0.720000
+0.250000 0.000000 -0.180400 0.176000 0.568000 0.792000
+0.300000 0.000000 -0.166100 -0.488000 0.464000 0.728000
+0.250000 0.002800 -0.182900 0.128000 0.640000 0.752000
+0.300000 0.018000 -0.182900 -0.296000 0.768000 0.552000
+0.250000 0.018500 -0.243900 -0.144000 0.856000 -0.480000
+0.300000 0.032100 -0.243900 -0.576000 0.680000 -0.432000
+0.250000 0.000000 -0.271900 -0.336000 0.528000 -0.776000
+0.300000 0.000000 -0.302400 -0.544000 0.608000 -0.568000
+0.250000 -0.050200 -0.297000 0.000000 0.040000 -0.992000
+0.300000 -0.003100 -0.304800 -0.376000 0.424000 -0.816000
+0.266500 -0.050200 -0.304800 -0.280000 0.064000 -0.952000
+0.300000 -0.050200 -0.319900 -0.536000 0.224000 -0.808000
+0.278900 -0.100400 -0.304800 -0.176000 0.256000 -0.944000
+0.300000 -0.100400 -0.310000 -0.248000 0.072000 -0.960000
+0.250000 -0.114900 -0.304800 -0.104000 0.280000 -0.952000
+0.300000 -0.150600 -0.312600 0.312000 -0.200000 -0.920000
+0.250000 -0.150600 -0.317700 0.024000 0.336000 -0.936000
+0.300000 -0.200800 -0.324200 0.480000 0.248000 -0.832000
+0.250000 -0.200800 -0.343100 0.104000 0.232000 -0.960000
+0.300000 -0.251000 -0.347800 0.304000 0.384000 -0.864000
+0.250000 -0.251000 -0.353900 0.064000 0.384000 -0.920000
+0.300000 -0.284400 -0.365800 0.136000 0.360000 -0.920000
+0.250000 -0.271800 -0.365800 -0.320000 0.360000 -0.872000
+0.250000 -0.251000 -0.353900 0.064000 0.384000 -0.920000
+0.236200 -0.301200 -0.365800 -0.608000 -0.320000 -0.712000
+0.200000 -0.251000 -0.346500 -0.184000 0.088000 -0.976000
+0.200000 -0.301200 -0.321600 -0.488000 -0.368000 -0.784000
+0.150000 -0.251000 -0.336000 0.080000 -0.336000 -0.928000
+0.170700 -0.301200 -0.304800 -0.520000 -0.608000 -0.592000
+0.150000 -0.287400 -0.304800 0.000000 -0.712000 -0.688000
+0.176900 -0.301200 -0.243900 -0.504000 -0.800000 0.304000
+0.150000 -0.287700 -0.243900 -0.208000 -0.968000 0.064000
+0.200000 -0.301200 -0.206400 -0.600000 -0.688000 0.384000
+0.150000 -0.278000 -0.182900 -0.064000 -0.936000 0.328000
+0.200000 -0.290700 -0.182900 -0.520000 -0.680000 0.512000
+0.150000 -0.253200 -0.121900 0.192000 -0.808000 0.552000
+0.200000 -0.251000 -0.134700 0.128000 -0.784000 0.600000
+0.161400 -0.251000 -0.121900 0.152000 -0.792000 0.576000
+0.200000 -0.240500 -0.121900 0.152000 -0.656000 0.728000
+0.150000 -0.251000 -0.118100 0.224000 -0.792000 0.560000
+0.200000 -0.200800 -0.086600 0.112000 -0.336000 0.928000
+0.150000 -0.200800 -0.071800 0.312000 -0.208000 0.920000
+0.200000 -0.150600 -0.099300 0.040000 0.104000 0.992000
+0.150000 -0.150600 -0.071000 0.136000 0.176000 0.968000
+0.200000 -0.100400 -0.095800 0.064000 0.272000 0.952000
+0.150000 -0.100400 -0.080500 0.184000 0.336000 0.920000
+0.200000 -0.050200 -0.116900 0.136000 0.368000 0.912000
+0.150000 -0.050200 -0.113700 0.032000 0.448000 0.888000
+0.200000 -0.041200 -0.121900 0.160000 0.488000 0.856000
+0.150000 -0.036300 -0.121900 0.008000 0.488000 0.864000
+0.200000 0.000000 -0.161400 0.032000 0.656000 0.752000
+0.150000 0.000000 -0.166100 -0.096000 0.688000 0.712000
+0.200000 0.019700 -0.182900 0.160000 0.648000 0.736000
+0.150000 0.016800 -0.182900 -0.152000 0.840000 0.520000
+0.200000 0.025700 -0.243900 0.016000 0.752000 -0.648000
+0.150000 0.015400 -0.243900 -0.208000 0.728000 -0.640000
+0.200000 0.000000 -0.277300 0.080000 0.528000 -0.840000
+0.150000 0.000000 -0.257100 -0.208000 0.552000 -0.800000
+0.200000 -0.045300 -0.304800 -0.008000 0.344000 -0.936000
+0.150000 -0.050200 -0.298400 -0.176000 0.328000 -0.920000
+0.188500 -0.050200 -0.304800 -0.128000 0.184000 -0.968000
+0.200000 -0.045300 -0.304800 -0.008000 0.344000 -0.936000
+0.200000 -0.050200 -0.307000 0.000000 0.192000 -0.976000
+0.200000 -0.050200 -0.307000 0.000000 0.192000 -0.976000
+-0.800000 -0.100400 0.186900 0.104000 0.048000 0.992000
+-0.800000 -0.100400 0.186900 0.104000 0.048000 0.992000
+-0.776900 -0.100400 0.182900 0.184000 0.120000 0.968000
+-0.800000 -0.150600 0.189500 -0.240000 -0.056000 0.960000
+-0.750000 -0.136500 0.182900 0.216000 0.112000 0.968000
+-0.750000 -0.150600 0.184600 0.192000 0.080000 0.976000
+-0.743500 -0.150600 0.182900 0.192000 0.096000 0.968000
+-0.750000 -0.200800 0.187200 0.064000 -0.048000 0.992000
+-0.703900 -0.200800 0.182900 0.128000 0.064000 0.984000
+-0.750000 -0.251000 0.186100 -0.160000 -0.136000 0.976000
+-0.700000 -0.208700 0.182900 0.176000 0.120000 0.968000
+-0.700000 -0.251000 0.184700 0.008000 -0.024000 0.992000
+-0.650000 -0.249200 0.182900 0.176000 0.464000 0.864000
+-0.650000 -0.251000 0.183700 0.152000 0.272000 0.944000
+-0.638500 -0.251000 0.182900 0.072000 0.424000 0.896000
+-0.650000 -0.301200 0.185200 -0.152000 0.008000 0.984000
+-0.600000 -0.260000 0.182900 0.056000 0.320000 0.944000
+-0.600000 -0.301200 0.196400 -0.152000 0.176000 0.968000
+-0.550000 -0.264400 0.182900 -0.072000 0.456000 0.880000
+-0.550000 -0.301200 0.200100 -0.040000 0.312000 0.944000
+-0.512000 -0.251000 0.182900 -0.112000 0.632000 0.760000
+-0.500000 -0.301200 0.199600 -0.128000 0.216000 0.960000
+-0.500000 -0.251000 0.185100 -0.112000 0.632000 0.760000
+-0.450000 -0.301200 0.203900 0.032000 0.168000 0.984000
+-0.450000 -0.251000 0.195400 -0.152000 0.392000 0.904000
+-0.400000 -0.301200 0.211000 0.416000 0.000000 0.904000
+-0.400000 -0.251000 0.203200 0.024000 0.208000 0.976000
+-0.369700 -0.301200 0.182900 0.552000 -0.328000 0.752000
+-0.350000 -0.251000 0.206900 0.584000 -0.272000 0.760000
+-0.350000 -0.276800 0.182900 0.600000 -0.432000 0.664000
+-0.334800 -0.251000 0.182900 0.672000 -0.480000 0.552000
+-0.350000 -0.301200 0.167500 0.592000 -0.368000 0.712000
+-0.300000 -0.251000 0.131000 0.632000 -0.616000 0.464000
+-0.327200 -0.301200 0.121900 0.792000 -0.368000 0.472000
+-0.300000 -0.256400 0.121900 0.624000 -0.624000 0.456000
+-0.300000 -0.301200 0.065200 0.504000 -0.568000 0.640000
+-0.294600 -0.251000 0.121900 0.616000 -0.600000 0.488000
+-0.295000 -0.301200 0.060900 0.472000 -0.584000 0.648000
+-0.250000 -0.251000 0.071500 0.528000 -0.408000 0.736000
+-0.250000 -0.262800 0.060900 0.496000 -0.520000 0.688000
+-0.236900 -0.251000 0.060900 0.464000 -0.480000 0.728000
+-0.250000 -0.301200 0.006000 0.344000 -0.608000 0.704000
+-0.200000 -0.251000 0.018200 0.408000 -0.392000 0.816000
+-0.235900 -0.301200 0.000000 0.272000 -0.568000 0.768000
+-0.200000 -0.279600 0.000000 -0.016000 -0.496000 0.864000
+-0.200000 -0.301200 -0.017500 -0.064000 -0.432000 0.896000
+-0.235900 -0.301200 0.000000 0.272000 -0.568000 0.768000
+-0.200000 -0.351500 -0.031500 -0.320000 -0.128000 0.936000
+-0.250000 -0.307700 0.000000 0.288000 -0.576000 0.760000
+-0.250000 -0.351500 -0.038300 0.104000 -0.504000 0.848000
+-0.300000 -0.343500 0.000000 0.832000 -0.408000 0.360000
+-0.300000 -0.351500 -0.012600 0.872000 -0.352000 0.320000
+-0.303300 -0.351500 0.000000 0.888000 -0.344000 0.288000
+-0.300000 -0.401700 -0.045100 0.792000 -0.248000 0.544000
+-0.319500 -0.401700 0.000000 0.536000 -0.584000 0.592000
+-0.300000 -0.435300 -0.060900 -0.192000 -0.360000 0.912000
+-0.350000 -0.427600 0.000000 0.560000 -0.752000 0.336000
+-0.338500 -0.451900 -0.060900 0.112000 -0.632000 0.760000
+-0.350000 -0.451900 -0.058800 0.248000 -0.624000 0.728000
+-0.350000 -0.453900 -0.060900 0.248000 -0.624000 0.728000
+-0.400000 -0.451900 -0.009600 0.744000 -0.536000 0.376000
+-0.380200 -0.502100 -0.060900 0.648000 -0.616000 0.432000
+-0.400000 -0.502100 -0.024700 0.848000 -0.224000 0.464000
+-0.400000 -0.527700 -0.060900 0.080000 -0.768000 0.624000
+-0.450000 -0.502100 -0.045100 0.560000 -0.696000 0.432000
+-0.450000 -0.512800 -0.060900 0.208000 -0.760000 0.608000
+-0.466200 -0.502100 0.000000 0.712000 -0.616000 0.320000
+-0.478800 -0.552300 -0.060900 0.704000 -0.592000 0.376000
+-0.500000 -0.548400 0.000000 0.368000 -0.816000 0.432000
+-0.500000 -0.552300 -0.009400 0.352000 -0.840000 0.400000
+-0.509600 -0.552300 0.000000 0.320000 -0.840000 0.424000
+-0.500000 -0.570000 -0.060900 0.480000 -0.800000 0.328000
+-0.550000 -0.565800 0.000000 0.224000 -0.872000 0.424000
+-0.550000 -0.588500 -0.060900 0.224000 -0.888000 0.384000
+-0.600000 -0.566300 0.000000 -0.184000 -0.816000 0.544000
+-0.600000 -0.601900 -0.060900 -0.072000 -0.808000 0.568000
+-0.633400 -0.552300 0.000000 -0.384000 -0.672000 0.624000
+-0.650000 -0.594800 -0.060900 -0.368000 -0.640000 0.664000
+-0.650000 -0.552300 -0.012600 -0.496000 -0.592000 0.624000
+-0.685200 -0.552300 -0.060900 -0.696000 -0.384000 0.592000
+-0.650000 -0.541900 0.000000 -0.528000 -0.600000 0.592000
+-0.700000 -0.507800 -0.060900 -0.864000 -0.200000 0.448000
+-0.674300 -0.502100 0.000000 -0.656000 -0.632000 0.384000
+-0.700000 -0.502100 -0.057900 -0.752000 -0.512000 0.400000
+-0.700000 -0.478200 0.000000 -0.704000 -0.632000 0.312000
+-0.701200 -0.502100 -0.060900 -0.816000 -0.416000 0.392000
+-0.719800 -0.451900 0.000000 -0.816000 -0.520000 0.240000
+-0.735400 -0.451900 -0.060900 -0.768000 -0.512000 0.360000
+-0.750000 -0.403200 0.000000 -0.832000 -0.504000 0.216000
+-0.750000 -0.426100 -0.060900 -0.864000 -0.448000 0.200000
+-0.750800 -0.401700 0.000000 -0.816000 -0.520000 0.208000
+-0.762700 -0.401700 -0.060900 -0.840000 -0.496000 0.168000
+-0.782800 -0.351500 0.000000 -0.816000 -0.536000 0.208000
+-0.794800 -0.351500 -0.060900 -0.816000 -0.552000 0.144000
+-0.800000 -0.327900 0.000000 -0.800000 -0.560000 0.176000
+-0.800000 -0.343900 -0.060900 -0.816000 -0.552000 0.128000
+-0.817700 -0.301200 0.000000 -0.808000 -0.560000 0.168000
+-0.826600 -0.301200 -0.060900 -0.824000 -0.544000 0.120000
+-0.800000 -0.343900 -0.060900 -0.816000 -0.552000 0.128000
+-0.832400 -0.301200 -0.121900 -0.840000 -0.528000 0.048000
+-0.800000 -0.351500 -0.101400 -0.840000 -0.528000 0.104000
+-0.802000 -0.351500 -0.121900 -0.840000 -0.520000 0.096000
+-0.800000 -0.354700 -0.121900 -0.848000 -0.512000 0.080000
+-0.802200 -0.351500 -0.182900 -0.872000 -0.480000 0.016000
+-0.800000 -0.355500 -0.182900 -0.872000 -0.472000 0.032000
+-0.807300 -0.351500 -0.243900 -0.864000 -0.472000 0.152000
+-0.800000 -0.365300 -0.243900 -0.880000 -0.440000 0.160000
+-0.821000 -0.351500 -0.304800 -0.824000 -0.504000 0.232000
+-0.800000 -0.395700 -0.304800 -0.920000 -0.376000 0.000000
+-0.812200 -0.351500 -0.365800 -0.856000 -0.296000 -0.408000
+-0.800000 -0.388500 -0.365800 -0.864000 -0.288000 -0.400000
+-0.800000 -0.351500 -0.388300 -0.664000 -0.152000 -0.728000
+-0.796500 -0.401700 -0.365800 -0.952000 -0.168000 -0.232000
+-0.750000 -0.351500 -0.422100 -0.312000 0.448000 -0.824000
+-0.777800 -0.401700 -0.426800 -0.928000 0.040000 -0.360000
+-0.750000 -0.359700 -0.426800 -0.368000 0.408000 -0.832000
+-0.750000 -0.351500 -0.422100 -0.312000 0.448000 -0.824000
+-0.736800 -0.351500 -0.426800 -0.240000 0.480000 -0.832000
+-0.736800 -0.351500 -0.426800 -0.240000 0.480000 -0.832000
+-0.750000 -0.150600 0.184600 0.192000 0.080000 0.976000
+-0.750000 -0.150600 0.184600 0.192000 0.080000 0.976000
+-0.800000 -0.150600 0.189500 -0.240000 -0.056000 0.960000
+-0.750000 -0.200800 0.187200 0.064000 -0.048000 0.992000
+-0.800000 -0.200800 0.184500 -0.256000 -0.128000 0.952000
+-0.750000 -0.251000 0.186100 -0.160000 -0.136000 0.976000
+-0.800000 -0.206500 0.182900 -0.304000 -0.264000 0.912000
+-0.762000 -0.251000 0.182900 -0.256000 -0.192000 0.936000
+-0.800000 -0.251000 0.157900 -0.576000 -0.400000 0.696000
+-0.750000 -0.267900 0.182900 -0.232000 -0.192000 0.944000
+-0.800000 -0.280700 0.121900 -0.736000 -0.528000 0.408000
+-0.750000 -0.301200 0.168400 -0.360000 -0.432000 0.816000
+-0.783300 -0.301200 0.121900 -0.688000 -0.568000 0.440000
+-0.750000 -0.342500 0.121900 -0.536000 -0.592000 0.592000
+-0.800000 -0.301200 0.085900 -0.768000 -0.544000 0.304000
+-0.750000 -0.351500 0.110100 -0.600000 -0.584000 0.536000
+-0.800000 -0.310100 0.060900 -0.800000 -0.544000 0.224000
+-0.767900 -0.351500 0.060900 -0.760000 -0.568000 0.296000
+-0.800000 -0.327900 0.000000 -0.800000 -0.560000 0.176000
+-0.782800 -0.351500 0.000000 -0.816000 -0.536000 0.208000
+-0.767900 -0.351500 0.060900 -0.760000 -0.568000 0.296000
+-0.750800 -0.401700 0.000000 -0.816000 -0.520000 0.208000
+-0.750000 -0.377100 0.060900 -0.760000 -0.552000 0.320000
+-0.750000 -0.401700 0.004100 -0.816000 -0.520000 0.232000
+-0.731300 -0.401700 0.060900 -0.784000 -0.496000 0.344000
+-0.750000 -0.403200 0.000000 -0.832000 -0.504000 0.216000
+-0.701000 -0.451900 0.060900 -0.792000 -0.480000 0.344000
+-0.719800 -0.451900 0.000000 -0.816000 -0.520000 0.240000
+-0.700000 -0.453200 0.060900 -0.560000 -0.720000 0.392000
+-0.700000 -0.478200 0.000000 -0.704000 -0.632000 0.312000
+-0.650000 -0.495900 0.060900 -0.528000 -0.720000 0.432000
+-0.674300 -0.502100 0.000000 -0.656000 -0.632000 0.384000
+-0.650000 -0.502100 0.048300 -0.536000 -0.712000 0.440000
+-0.650000 -0.541900 0.000000 -0.528000 -0.600000 0.592000
+-0.640700 -0.502100 0.060900 -0.496000 -0.728000 0.456000
+-0.633400 -0.552300 0.000000 -0.384000 -0.672000 0.624000
+-0.600000 -0.531600 0.060900 -0.448000 -0.736000 0.496000
+-0.600000 -0.552300 0.023900 -0.224000 -0.776000 0.584000
+-0.550000 -0.532000 0.060900 0.080000 -0.776000 0.624000
+-0.550000 -0.552300 0.031000 0.256000 -0.800000 0.528000
+-0.500000 -0.517700 0.060900 0.632000 -0.632000 0.440000
+-0.509600 -0.552300 0.000000 0.320000 -0.840000 0.424000
+-0.500000 -0.548400 0.000000 0.368000 -0.816000 0.432000
+-0.500000 -0.517700 0.060900 0.632000 -0.632000 0.440000
+-0.466200 -0.502100 0.000000 0.712000 -0.616000 0.320000
+-0.489100 -0.502100 0.060900 0.704000 -0.616000 0.328000
+-0.450000 -0.489500 0.000000 0.584000 -0.760000 0.264000
+-0.450000 -0.471900 0.060900 0.592000 -0.752000 0.272000
+-0.403800 -0.451900 0.000000 0.744000 -0.560000 0.352000
+-0.425300 -0.451900 0.060900 0.696000 -0.640000 0.304000
+-0.400000 -0.447100 0.000000 0.720000 -0.584000 0.344000
+-0.400000 -0.423000 0.060900 0.616000 -0.696000 0.360000
+-0.350000 -0.427600 0.000000 0.560000 -0.752000 0.336000
+-0.350000 -0.406300 0.060900 0.592000 -0.728000 0.320000
+-0.319500 -0.401700 0.000000 0.536000 -0.584000 0.592000
+-0.344500 -0.401700 0.060900 0.632000 -0.688000 0.328000
+-0.303300 -0.351500 0.000000 0.888000 -0.344000 0.288000
+-0.319700 -0.351500 0.060900 0.864000 -0.376000 0.328000
+-0.300000 -0.343500 0.000000 0.832000 -0.408000 0.360000
+-0.300000 -0.305300 0.060900 0.512000 -0.568000 0.632000
+-0.250000 -0.307700 0.000000 0.288000 -0.576000 0.760000
+-0.295000 -0.301200 0.060900 0.472000 -0.584000 0.648000
+-0.250000 -0.301200 0.006000 0.344000 -0.608000 0.704000
+-0.250000 -0.262800 0.060900 0.496000 -0.520000 0.688000
+-0.250000 -0.262800 0.060900 0.496000 -0.520000 0.688000
+-0.762000 -0.251000 0.182900 -0.256000 -0.192000 0.936000
+-0.762000 -0.251000 0.182900 -0.256000 -0.192000 0.936000
+-0.750000 -0.251000 0.186100 -0.160000 -0.136000 0.976000
+-0.750000 -0.267900 0.182900 -0.232000 -0.192000 0.944000
+-0.700000 -0.251000 0.184700 0.008000 -0.024000 0.992000
+-0.700000 -0.272200 0.182900 -0.072000 -0.128000 0.984000
+-0.650000 -0.251000 0.183700 0.152000 0.272000 0.944000
+-0.671000 -0.301200 0.182900 -0.120000 -0.104000 0.984000
+-0.650000 -0.301200 0.185200 -0.152000 0.008000 0.984000
+-0.663400 -0.351500 0.182900 -0.304000 -0.080000 0.944000
+-0.650000 -0.351500 0.187800 -0.272000 -0.048000 0.952000
+-0.650000 -0.385200 0.182900 -0.496000 -0.152000 0.848000
+-0.600000 -0.351500 0.201700 -0.216000 0.016000 0.968000
+-0.644900 -0.401700 0.182900 -0.528000 -0.240000 0.808000
+-0.600000 -0.401700 0.205900 -0.320000 -0.144000 0.928000
+-0.600000 -0.446800 0.182900 -0.240000 -0.464000 0.848000
+-0.550000 -0.401700 0.218500 0.000000 -0.272000 0.960000
+-0.583500 -0.451900 0.182900 -0.128000 -0.544000 0.824000
+-0.550000 -0.451900 0.188900 -0.024000 -0.624000 0.776000
+-0.550000 -0.456500 0.182900 0.056000 -0.736000 0.672000
+-0.523100 -0.451900 0.182900 0.136000 -0.648000 0.744000
+-0.550000 -0.494000 0.121900 0.024000 -0.832000 0.536000
+-0.500000 -0.451900 0.177400 0.160000 -0.648000 0.736000
+-0.500000 -0.486900 0.121900 0.296000 -0.800000 0.504000
+-0.450000 -0.451900 0.126400 0.752000 -0.472000 0.448000
+-0.450000 -0.453600 0.121900 0.584000 -0.744000 0.288000
+-0.447800 -0.451900 0.121900 0.672000 -0.648000 0.344000
+-0.450000 -0.471900 0.060900 0.592000 -0.752000 0.272000
+-0.425300 -0.451900 0.060900 0.696000 -0.640000 0.304000
+-0.447800 -0.451900 0.121900 0.672000 -0.648000 0.344000
+-0.400000 -0.423000 0.060900 0.616000 -0.696000 0.360000
+-0.404400 -0.401700 0.121900 0.648000 -0.656000 0.368000
+-0.400000 -0.401700 0.111300 0.640000 -0.680000 0.336000
+-0.400000 -0.397400 0.121900 0.632000 -0.672000 0.368000
+-0.350000 -0.401700 0.073400 0.632000 -0.688000 0.344000
+-0.350000 -0.369000 0.121900 0.736000 -0.464000 0.480000
+-0.344500 -0.401700 0.060900 0.632000 -0.688000 0.328000
+-0.341600 -0.351500 0.121900 0.808000 -0.352000 0.456000
+-0.319700 -0.351500 0.060900 0.864000 -0.376000 0.328000
+-0.327200 -0.301200 0.121900 0.792000 -0.368000 0.472000
+-0.300000 -0.305300 0.060900 0.512000 -0.568000 0.632000
+-0.300000 -0.301200 0.065200 0.504000 -0.568000 0.640000
+-0.295000 -0.301200 0.060900 0.472000 -0.584000 0.648000
+-0.295000 -0.301200 0.060900 0.472000 -0.584000 0.648000
+-0.650000 -0.301200 0.185200 -0.152000 0.008000 0.984000
+-0.650000 -0.301200 0.185200 -0.152000 0.008000 0.984000
+-0.650000 -0.351500 0.187800 -0.272000 -0.048000 0.952000
+-0.600000 -0.301200 0.196400 -0.152000 0.176000 0.968000
+-0.600000 -0.351500 0.201700 -0.216000 0.016000 0.968000
+-0.550000 -0.301200 0.200100 -0.040000 0.312000 0.944000
+-0.550000 -0.351500 0.211500 0.000000 0.128000 0.984000
+-0.500000 -0.301200 0.199600 -0.128000 0.216000 0.960000
+-0.500000 -0.351500 0.209200 0.072000 0.104000 0.984000
+-0.450000 -0.301200 0.203900 0.032000 0.168000 0.984000
+-0.450000 -0.351500 0.215900 0.592000 -0.216000 0.768000
+-0.400000 -0.301200 0.211000 0.416000 0.000000 0.904000
+-0.400000 -0.351500 0.196700 0.560000 -0.576000 0.584000
+-0.369700 -0.301200 0.182900 0.552000 -0.328000 0.752000
+-0.389000 -0.351500 0.182900 0.544000 -0.632000 0.536000
+-0.350000 -0.301200 0.167500 0.592000 -0.368000 0.712000
+-0.350000 -0.351500 0.138600 0.680000 -0.440000 0.568000
+-0.327200 -0.301200 0.121900 0.792000 -0.368000 0.472000
+-0.341600 -0.351500 0.121900 0.808000 -0.352000 0.456000
+-0.350000 -0.351500 0.138600 0.680000 -0.440000 0.568000
+-0.350000 -0.369000 0.121900 0.736000 -0.464000 0.480000
+-0.389000 -0.351500 0.182900 0.544000 -0.632000 0.536000
+-0.400000 -0.397400 0.121900 0.632000 -0.672000 0.368000
+-0.400000 -0.359600 0.182900 0.520000 -0.680000 0.496000
+-0.404400 -0.401700 0.121900 0.648000 -0.656000 0.368000
+-0.445800 -0.401700 0.182900 0.648000 -0.488000 0.568000
+-0.447800 -0.451900 0.121900 0.672000 -0.648000 0.344000
+-0.450000 -0.407300 0.182900 0.664000 -0.488000 0.552000
+-0.450000 -0.451900 0.126400 0.752000 -0.472000 0.448000
+-0.500000 -0.444100 0.182900 0.168000 -0.480000 0.848000
+-0.500000 -0.451900 0.177400 0.160000 -0.648000 0.736000
+-0.523100 -0.451900 0.182900 0.136000 -0.648000 0.744000
+-0.500000 -0.444100 0.182900 0.168000 -0.480000 0.848000
+-0.550000 -0.451900 0.188900 -0.024000 -0.624000 0.776000
+-0.500000 -0.401700 0.210500 0.208000 -0.296000 0.928000
+-0.550000 -0.401700 0.218500 0.000000 -0.272000 0.960000
+-0.500000 -0.351500 0.209200 0.072000 0.104000 0.984000
+-0.550000 -0.351500 0.211500 0.000000 0.128000 0.984000
+-0.550000 -0.401700 0.218500 0.000000 -0.272000 0.960000
+-0.600000 -0.351500 0.201700 -0.216000 0.016000 0.968000
+-0.600000 -0.401700 0.205900 -0.320000 -0.144000 0.928000
+-0.600000 -0.401700 0.205900 -0.320000 -0.144000 0.928000
+-0.512000 -0.251000 0.182900 -0.112000 0.632000 0.760000
+-0.512000 -0.251000 0.182900 -0.112000 0.632000 0.760000
+-0.500000 -0.249000 0.182900 -0.112000 0.656000 0.744000
+-0.500000 -0.251000 0.185100 -0.112000 0.632000 0.760000
+-0.450000 -0.233700 0.182900 -0.216000 0.472000 0.848000
+-0.450000 -0.251000 0.195400 -0.152000 0.392000 0.904000
+-0.400000 -0.206800 0.182900 -0.168000 0.424000 0.880000
+-0.400000 -0.251000 0.203200 0.024000 0.208000 0.976000
+-0.383500 -0.200800 0.182900 -0.152000 0.448000 0.872000
+-0.350000 -0.251000 0.206900 0.584000 -0.272000 0.760000
+-0.350000 -0.200800 0.190300 -0.112000 0.384000 0.912000
+-0.334800 -0.251000 0.182900 0.672000 -0.480000 0.552000
+-0.300000 -0.200800 0.189700 0.744000 -0.432000 0.496000
+-0.300000 -0.205800 0.182900 0.768000 -0.472000 0.416000
+-0.296900 -0.200800 0.182900 0.792000 -0.440000 0.408000
+-0.300000 -0.251000 0.131000 0.632000 -0.616000 0.464000
+-0.278100 -0.200800 0.121900 0.816000 -0.432000 0.368000
+-0.294600 -0.251000 0.121900 0.616000 -0.600000 0.488000
+-0.250000 -0.200800 0.078600 0.664000 -0.312000 0.672000
+-0.250000 -0.251000 0.071500 0.528000 -0.408000 0.736000
+-0.222100 -0.200800 0.060900 0.488000 -0.184000 0.848000
+-0.236900 -0.251000 0.060900 0.464000 -0.480000 0.728000
+-0.200000 -0.200800 0.045500 0.568000 -0.152000 0.808000
+-0.200000 -0.251000 0.018200 0.408000 -0.392000 0.816000
+-0.200000 -0.251000 0.018200 0.408000 -0.392000 0.816000
+-0.450000 -0.351500 0.215900 0.592000 -0.216000 0.768000
+-0.450000 -0.351500 0.215900 0.592000 -0.216000 0.768000
+-0.500000 -0.351500 0.209200 0.072000 0.104000 0.984000
+-0.450000 -0.401700 0.188700 0.656000 -0.464000 0.584000
+-0.500000 -0.401700 0.210500 0.208000 -0.296000 0.928000
+-0.450000 -0.407300 0.182900 0.664000 -0.488000 0.552000
+-0.500000 -0.444100 0.182900 0.168000 -0.480000 0.848000
+-0.500000 -0.444100 0.182900 0.168000 -0.480000 0.848000
+-0.400000 -0.351500 0.196700 0.560000 -0.576000 0.584000
+-0.400000 -0.351500 0.196700 0.560000 -0.576000 0.584000
+-0.400000 -0.359600 0.182900 0.520000 -0.680000 0.496000
+-0.450000 -0.351500 0.215900 0.592000 -0.216000 0.768000
+-0.445800 -0.401700 0.182900 0.648000 -0.488000 0.568000
+-0.450000 -0.401700 0.188700 0.656000 -0.464000 0.584000
+-0.450000 -0.407300 0.182900 0.664000 -0.488000 0.552000
+-0.450000 -0.407300 0.182900 0.664000 -0.488000 0.552000
+-0.383500 -0.200800 0.182900 -0.152000 0.448000 0.872000
+-0.383500 -0.200800 0.182900 -0.152000 0.448000 0.872000
+-0.350000 -0.189600 0.182900 -0.288000 0.472000 0.824000
+-0.350000 -0.200800 0.190300 -0.112000 0.384000 0.912000
+-0.311100 -0.150600 0.182900 -0.424000 0.464000 0.768000
+-0.300000 -0.200800 0.189700 0.744000 -0.432000 0.496000
+-0.300000 -0.150600 0.190700 0.000000 0.520000 0.848000
+-0.296900 -0.200800 0.182900 0.792000 -0.440000 0.408000
+-0.288800 -0.150600 0.182900 0.600000 0.360000 0.712000
+-0.278100 -0.200800 0.121900 0.816000 -0.432000 0.368000
+-0.252800 -0.150600 0.121900 0.720000 -0.296000 0.616000
+-0.250000 -0.200800 0.078600 0.664000 -0.312000 0.672000
+-0.250000 -0.150600 0.117900 0.712000 -0.320000 0.616000
+-0.222100 -0.200800 0.060900 0.488000 -0.184000 0.848000
+-0.212600 -0.150600 0.060900 0.712000 -0.216000 0.664000
+-0.200000 -0.200800 0.045500 0.568000 -0.152000 0.808000
+-0.200000 -0.150600 0.042600 0.640000 -0.096000 0.752000
+-0.212600 -0.150600 0.060900 0.712000 -0.216000 0.664000
+-0.200000 -0.121800 0.060900 0.728000 -0.328000 0.592000
+-0.250000 -0.150600 0.117900 0.712000 -0.320000 0.616000
+-0.200000 -0.100400 0.076800 0.784000 -0.136000 0.600000
+-0.250000 -0.144000 0.121900 0.720000 -0.312000 0.608000
+-0.230200 -0.100400 0.121900 0.776000 -0.176000 0.600000
+-0.250000 -0.100400 0.155000 0.480000 0.160000 0.856000
+-0.247100 -0.050200 0.121900 0.488000 0.512000 0.696000
+-0.250000 -0.050200 0.123600 0.200000 0.440000 0.864000
+-0.250000 -0.048000 0.121900 0.272000 0.640000 0.704000
+-0.255700 -0.050200 0.121900 -0.192000 0.512000 0.832000
+-0.250000 0.000000 0.079500 -0.144000 0.552000 0.816000
+-0.300000 -0.050200 0.104800 -0.312000 0.512000 0.792000
+-0.300000 0.000000 0.088800 -0.240000 0.432000 0.864000
+-0.350000 -0.050200 0.083200 -0.416000 0.344000 0.832000
+-0.348200 0.000000 0.060900 -0.376000 0.448000 0.800000
+-0.350000 -0.001900 0.060900 -0.656000 0.280000 0.688000
+-0.350000 0.000000 0.059800 -0.688000 0.400000 0.592000
+-0.367400 -0.050200 0.060900 -0.696000 0.408000 0.584000
+-0.373100 0.000000 0.000000 -0.880000 0.240000 0.392000
+-0.399300 -0.050200 0.000000 -0.696000 0.680000 0.184000
+-0.377800 0.000000 -0.060900 -0.864000 0.424000 -0.248000
+-0.400000 -0.050200 -0.003200 -0.712000 0.672000 0.168000
+-0.400000 -0.037800 -0.060900 -0.728000 0.664000 0.152000
+-0.406900 -0.050200 -0.060900 -0.848000 0.520000 0.000000
+-0.400000 -0.050200 -0.118700 -0.832000 0.528000 -0.160000
+-0.450000 -0.099400 -0.060900 -0.760000 0.616000 0.160000
+-0.400000 -0.050900 -0.121900 -0.736000 0.536000 -0.408000
+-0.450000 -0.100400 -0.065100 -0.512000 0.824000 -0.200000
+-0.434900 -0.100400 -0.121900 -0.608000 0.744000 -0.256000
+-0.450000 -0.111500 -0.121900 -0.376000 0.896000 -0.224000
+-0.403600 -0.100400 -0.182900 -0.616000 0.592000 -0.512000
+-0.450000 -0.128500 -0.182900 -0.504000 0.800000 -0.296000
+-0.400000 -0.100400 -0.188300 -0.616000 0.576000 -0.520000
+-0.450000 -0.150600 -0.239400 -0.408000 0.792000 -0.448000
+-0.400000 -0.131400 -0.243900 -0.384000 0.744000 -0.536000
+-0.444500 -0.150600 -0.243900 -0.312000 0.784000 -0.528000
+-0.400000 -0.150600 -0.272200 -0.312000 0.624000 -0.704000
+-0.450000 -0.152500 -0.243900 -0.384000 0.800000 -0.448000
+-0.400000 -0.174400 -0.304800 -0.224000 0.736000 -0.632000
+-0.450000 -0.186700 -0.304800 -0.216000 0.808000 -0.528000
+-0.400000 -0.200800 -0.333600 -0.064000 0.568000 -0.816000
+-0.450000 -0.200800 -0.327900 -0.112000 0.704000 -0.696000
+-0.400000 -0.239300 -0.365800 0.048000 0.512000 -0.848000
+-0.450000 -0.235000 -0.365800 -0.016000 0.592000 -0.800000
+-0.400000 -0.251000 -0.373300 0.080000 0.400000 -0.904000
+-0.450000 -0.251000 -0.376500 0.032000 0.432000 -0.896000
+-0.400000 -0.301200 -0.390900 0.144000 0.296000 -0.936000
+-0.450000 -0.301200 -0.399100 0.080000 0.320000 -0.936000
+-0.400000 -0.351500 -0.411400 0.000000 0.616000 -0.784000
+-0.450000 -0.351500 -0.418600 0.080000 0.512000 -0.848000
+-0.450000 -0.301200 -0.399100 0.080000 0.320000 -0.936000
+-0.500000 -0.351500 -0.423900 0.056000 0.504000 -0.856000
+-0.500000 -0.301200 -0.402500 0.040000 0.344000 -0.936000
+-0.450000 -0.301200 -0.399100 0.080000 0.320000 -0.936000
+-0.500000 -0.251000 -0.377000 -0.032000 0.528000 -0.840000
+-0.450000 -0.251000 -0.376500 0.032000 0.432000 -0.896000
+-0.500000 -0.238600 -0.365800 -0.072000 0.656000 -0.744000
+-0.450000 -0.235000 -0.365800 -0.016000 0.592000 -0.800000
+-0.500000 -0.200800 -0.313000 -0.112000 0.824000 -0.544000
+-0.450000 -0.200800 -0.327900 -0.112000 0.704000 -0.696000
+-0.500000 -0.196700 -0.304800 -0.120000 0.848000 -0.504000
+-0.450000 -0.186700 -0.304800 -0.216000 0.808000 -0.528000
+-0.500000 -0.169200 -0.243900 -0.328000 0.880000 -0.312000
+-0.450000 -0.152500 -0.243900 -0.384000 0.800000 -0.448000
+-0.500000 -0.154300 -0.182900 -0.320000 0.920000 -0.176000
+-0.450000 -0.150600 -0.239400 -0.408000 0.792000 -0.448000
+-0.491700 -0.150600 -0.182900 -0.448000 0.848000 -0.264000
+-0.450000 -0.128500 -0.182900 -0.504000 0.800000 -0.296000
+-0.500000 -0.150600 -0.154000 -0.424000 0.880000 -0.160000
+-0.450000 -0.111500 -0.121900 -0.376000 0.896000 -0.224000
+-0.500000 -0.144400 -0.121900 -0.376000 0.880000 -0.280000
+-0.450000 -0.100400 -0.065100 -0.512000 0.824000 -0.200000
+-0.500000 -0.119500 -0.060900 -0.160000 0.976000 0.112000
+-0.452400 -0.100400 -0.060900 -0.344000 0.936000 -0.016000
+-0.500000 -0.141000 0.000000 -0.040000 0.880000 0.456000
+-0.450000 -0.100400 -0.057100 -0.400000 0.872000 0.264000
+-0.450000 -0.112700 0.000000 -0.520000 0.784000 0.320000
+-0.434300 -0.100400 0.000000 -0.648000 0.720000 0.208000
+-0.450000 -0.136300 0.060900 -0.512000 0.720000 0.448000
+-0.405500 -0.100400 0.060900 -0.712000 0.456000 0.520000
+-0.450000 -0.150600 0.089400 -0.440000 0.744000 0.496000
+-0.400000 -0.100400 0.069600 -0.688000 0.456000 0.552000
+-0.414900 -0.150600 0.121900 -0.424000 0.616000 0.648000
+-0.400000 -0.140400 0.121900 -0.448000 0.624000 0.632000
+-0.400000 -0.150600 0.133500 -0.392000 0.600000 0.688000
+-0.351400 -0.100400 0.121900 -0.608000 0.368000 0.696000
+-0.350000 -0.150600 0.151300 -0.584000 0.352000 0.720000
+-0.350000 -0.100400 0.123500 -0.608000 0.328000 0.712000
+-0.311100 -0.150600 0.182900 -0.424000 0.464000 0.768000
+-0.300000 -0.100400 0.149000 -0.304000 0.432000 0.840000
+-0.300000 -0.142200 0.182900 0.000000 0.616000 0.776000
+-0.250000 -0.100400 0.155000 0.480000 0.160000 0.856000
+-0.288800 -0.150600 0.182900 0.600000 0.360000 0.712000
+-0.250000 -0.144000 0.121900 0.720000 -0.312000 0.608000
+-0.252800 -0.150600 0.121900 0.720000 -0.296000 0.616000
+-0.250000 -0.150600 0.117900 0.712000 -0.320000 0.616000
+-0.250000 -0.150600 0.117900 0.712000 -0.320000 0.616000
+-0.400000 -0.351500 0.196700 0.560000 -0.576000 0.584000
+-0.400000 -0.351500 0.196700 0.560000 -0.576000 0.584000
+-0.389000 -0.351500 0.182900 0.544000 -0.632000 0.536000
+-0.400000 -0.359600 0.182900 0.520000 -0.680000 0.496000
+-0.400000 -0.359600 0.182900 0.520000 -0.680000 0.496000
+-0.311100 -0.150600 0.182900 -0.424000 0.464000 0.768000
+-0.311100 -0.150600 0.182900 -0.424000 0.464000 0.768000
+-0.300000 -0.142200 0.182900 0.000000 0.616000 0.776000
+-0.300000 -0.150600 0.190700 0.000000 0.520000 0.848000
+-0.288800 -0.150600 0.182900 0.600000 0.360000 0.712000
+-0.288800 -0.150600 0.182900 0.600000 0.360000 0.712000
+0.577700 0.301200 0.182900 -0.536000 0.272000 0.792000
+0.577700 0.301200 0.182900 -0.536000 0.272000 0.792000
+0.600000 0.327100 0.182900 -0.144000 0.552000 0.816000
+0.600000 0.301200 0.199900 -0.528000 0.136000 0.832000
+0.650000 0.311500 0.182900 0.424000 0.496000 0.752000
+0.650000 0.301200 0.190400 0.408000 0.464000 0.776000
+0.660200 0.301200 0.182900 0.480000 0.488000 0.720000
+0.650000 0.251000 0.217300 -0.016000 0.232000 0.968000
+0.700000 0.263400 0.182900 0.512000 0.536000 0.664000
+0.700000 0.251000 0.193900 0.488000 0.504000 0.704000
+0.711700 0.251000 0.182900 0.560000 0.528000 0.624000
+0.700000 0.200800 0.226400 0.328000 0.432000 0.832000
+0.750000 0.208300 0.182900 0.448000 0.624000 0.632000
+0.750000 0.200800 0.191100 0.424000 0.552000 0.712000
+0.761100 0.200800 0.182900 0.432000 0.472000 0.760000
+0.750000 0.150600 0.201100 0.320000 0.240000 0.912000
+0.797300 0.150600 0.182900 0.336000 0.288000 0.888000
+0.750000 0.100400 0.207000 0.032000 -0.192000 0.976000
+0.800000 0.148000 0.182900 0.424000 0.336000 0.832000
+0.800000 0.100400 0.199400 -0.032000 0.024000 0.992000
+0.850000 0.129700 0.182900 0.408000 0.752000 0.504000
+0.850000 0.100400 0.222500 0.440000 0.584000 0.672000
+0.891700 0.100400 0.182900 0.576000 0.688000 0.424000
+0.850000 0.050200 0.216300 -0.184000 -0.272000 0.936000
+0.900000 0.093100 0.182900 0.568000 0.672000 0.464000
+0.900000 0.050200 0.226800 0.488000 0.496000 0.712000
+0.940200 0.050200 0.182900 0.624000 0.528000 0.568000
+0.900000 0.000000 0.237100 -0.176000 -0.616000 0.760000
+0.950000 0.037400 0.182900 0.520000 0.504000 0.680000
+0.950000 0.000000 0.206500 0.400000 0.008000 0.912000
+1.000000 0.004900 0.182900 0.336000 0.520000 0.776000
+1.000000 0.000000 0.186800 0.376000 0.128000 0.912000
+0.950000 0.000000 0.206500 0.400000 0.008000 0.912000
+1.000000 -0.012000 0.182900 0.384000 -0.248000 0.880000
+0.950000 -0.050200 0.197900 0.336000 -0.192000 0.920000
+0.975800 -0.050200 0.182900 0.464000 -0.232000 0.848000
+0.950000 -0.100400 0.196500 0.208000 -0.704000 0.672000
+0.959000 -0.100400 0.182900 0.616000 -0.584000 0.520000
+0.950000 -0.108800 0.182900 0.232000 -0.768000 0.584000
+1.000000 -0.100400 0.134700 0.432000 -0.528000 0.720000
+0.950000 -0.142500 0.121900 -0.608000 -0.672000 0.392000
+1.000000 -0.126300 0.121900 0.016000 -0.480000 0.872000
+0.950000 -0.150600 0.094900 -0.648000 -0.696000 0.272000
+1.000000 -0.150600 0.101600 -0.080000 -0.576000 0.808000
+0.950000 -0.158100 0.060900 -0.608000 -0.760000 0.200000
+1.000000 -0.176100 0.060900 -0.688000 -0.632000 0.336000
+0.950000 -0.168100 0.000000 -0.640000 -0.744000 0.184000
+1.000000 -0.200800 0.012500 -0.656000 -0.696000 0.264000
+0.995800 -0.200800 0.000000 -0.648000 -0.704000 0.264000
+1.000000 -0.204500 0.000000 -0.624000 -0.728000 0.256000
+0.973000 -0.200800 -0.060900 -0.584000 -0.760000 0.264000
+1.000000 -0.224100 -0.060900 -0.616000 -0.728000 0.280000
+0.950500 -0.200800 -0.121900 -0.632000 -0.744000 0.192000
+1.000000 -0.243600 -0.121900 -0.640000 -0.736000 0.184000
+0.950000 -0.200800 -0.124000 -0.680000 -0.712000 0.160000
+1.000000 -0.251000 -0.154300 -0.728000 -0.648000 0.200000
+0.950000 -0.211700 -0.182900 -0.704000 -0.680000 0.176000
+0.993400 -0.251000 -0.182900 -0.736000 -0.640000 0.200000
+0.950000 -0.224400 -0.243900 -0.688000 -0.640000 0.328000
+0.978600 -0.251000 -0.243900 -0.696000 -0.616000 0.352000
+0.950000 -0.251000 -0.295200 -0.640000 -0.496000 0.576000
+1.000000 -0.277900 -0.243900 -0.712000 -0.592000 0.360000
+0.950000 -0.261400 -0.304800 -0.752000 -0.584000 0.288000
+1.000000 -0.301200 -0.291200 -0.640000 -0.488000 0.576000
+0.989600 -0.301200 -0.304800 -0.816000 -0.560000 0.128000
+1.000000 -0.316200 -0.304800 -0.800000 -0.552000 0.224000
+1.000000 -0.301200 -0.328200 -0.784000 -0.440000 -0.424000
+0.989600 -0.301200 -0.304800 -0.816000 -0.560000 0.128000
+1.000000 -0.251000 -0.355700 -0.816000 -0.248000 -0.504000
+0.950000 -0.261400 -0.304800 -0.752000 -0.584000 0.288000
+0.950000 -0.251000 -0.328200 -0.712000 -0.568000 -0.392000
+0.942100 -0.251000 -0.304800 -0.752000 -0.552000 0.344000
+0.950000 -0.200800 -0.357000 -0.272000 -0.104000 -0.952000
+0.911900 -0.200800 -0.304800 -0.864000 -0.480000 -0.128000
+0.950000 -0.150600 -0.345500 -0.032000 0.064000 -0.992000
+0.900000 -0.181100 -0.304800 -0.768000 -0.440000 -0.448000
+0.900000 -0.150600 -0.332000 -0.672000 -0.328000 -0.656000
+0.883200 -0.150600 -0.304800 -0.864000 -0.368000 -0.320000
+0.900000 -0.100400 -0.341700 -0.464000 -0.104000 -0.872000
+0.869700 -0.100400 -0.304800 -0.880000 -0.248000 -0.400000
+0.900000 -0.050200 -0.348300 -0.256000 0.192000 -0.944000
+0.867300 -0.050200 -0.304800 -0.784000 -0.136000 -0.600000
+0.900000 0.000000 -0.329500 -0.080000 0.648000 -0.744000
+0.877300 0.000000 -0.304800 -0.592000 0.480000 -0.632000
+0.900000 0.016700 -0.304800 -0.152000 0.720000 -0.664000
+0.850000 0.000000 -0.279000 -0.536000 0.488000 -0.680000
+0.900000 0.050200 -0.268900 0.208000 0.672000 -0.696000
+0.850000 0.042400 -0.243900 -0.408000 0.528000 -0.736000
+0.858900 0.050200 -0.243900 -0.424000 0.568000 -0.696000
+0.850000 0.050200 -0.237100 -0.376000 0.576000 -0.720000
+0.900000 0.070800 -0.243900 -0.096000 0.744000 -0.656000
+0.850000 0.100400 -0.218500 0.128000 0.592000 -0.784000
+0.900000 0.100400 -0.203200 0.536000 0.688000 -0.472000
+0.850000 0.127100 -0.182900 0.192000 0.744000 -0.632000
+0.900000 0.111100 -0.182900 0.552000 0.712000 -0.416000
+0.850000 0.150600 -0.140900 0.432000 0.840000 -0.304000
+0.900000 0.127900 -0.121900 0.560000 0.776000 -0.264000
+0.859300 0.150600 -0.121900 0.456000 0.840000 -0.272000
+0.900000 0.143500 -0.060900 0.528000 0.808000 -0.240000
+0.888500 0.150600 -0.060900 0.504000 0.856000 -0.040000
+0.900000 0.131100 0.000000 0.480000 0.848000 0.192000
+0.867700 0.150600 0.000000 0.552000 0.816000 0.152000
+0.900000 0.118900 0.060900 0.472000 0.856000 0.184000
+0.855400 0.150600 0.060900 0.680000 0.720000 0.072000
+0.900000 0.107300 0.121900 0.512000 0.832000 0.184000
+0.850900 0.150600 0.121900 0.704000 0.704000 0.080000
+0.900000 0.100400 0.165200 0.584000 0.744000 0.296000
+0.850000 0.150600 0.126500 0.640000 0.560000 0.512000
+0.891700 0.100400 0.182900 0.576000 0.688000 0.424000
+0.850000 0.129700 0.182900 0.408000 0.752000 0.504000
+0.850000 0.150600 0.126500 0.640000 0.560000 0.512000
+0.800000 0.148000 0.182900 0.424000 0.336000 0.832000
+0.800000 0.150600 0.181400 0.520000 0.336000 0.776000
+0.797300 0.150600 0.182900 0.336000 0.288000 0.888000
+0.800000 0.190400 0.121900 0.624000 0.752000 0.168000
+0.761100 0.200800 0.182900 0.432000 0.472000 0.760000
+0.788900 0.200800 0.121900 0.632000 0.744000 0.184000
+0.750000 0.208300 0.182900 0.448000 0.624000 0.632000
+0.750000 0.233400 0.121900 0.720000 0.680000 -0.080000
+0.711700 0.251000 0.182900 0.560000 0.528000 0.624000
+0.736800 0.251000 0.121900 0.752000 0.632000 0.144000
+0.700000 0.263400 0.182900 0.512000 0.536000 0.664000
+0.700000 0.297800 0.121900 0.728000 0.680000 -0.032000
+0.660200 0.301200 0.182900 0.480000 0.488000 0.720000
+0.696500 0.301200 0.121900 0.712000 0.672000 0.168000
+0.650000 0.311500 0.182900 0.424000 0.496000 0.752000
+0.653800 0.351500 0.121900 0.656000 0.616000 0.424000
+0.650000 0.351500 0.128300 0.616000 0.616000 0.480000
+0.650000 0.355500 0.121900 0.632000 0.632000 0.432000
+0.600000 0.351500 0.157200 -0.376000 0.584000 0.704000
+0.600000 0.382600 0.121900 0.272000 0.776000 0.560000
+0.566500 0.351500 0.121900 -0.632000 0.576000 0.496000
+0.600000 0.401700 0.085900 0.096000 0.928000 0.336000
+0.550000 0.351500 0.078000 -0.616000 0.672000 0.392000
+0.584600 0.401700 0.060900 -0.416000 0.872000 0.248000
+0.550000 0.359900 0.060900 -0.592000 0.640000 0.480000
+0.568400 0.401700 0.000000 -0.472000 0.832000 -0.264000
+0.550000 0.388900 0.000000 -0.392000 0.856000 0.320000
+0.600000 0.401700 -0.057700 0.168000 0.920000 -0.344000
+0.550000 0.398000 -0.060900 0.000000 0.968000 -0.216000
+0.600000 0.400600 -0.060900 -0.072000 0.912000 -0.384000
+0.550000 0.362300 -0.121900 0.400000 0.656000 -0.632000
+0.600000 0.351500 -0.101600 0.448000 0.496000 -0.736000
+0.566700 0.351500 -0.121900 0.448000 0.536000 -0.704000
+0.600000 0.310600 -0.121900 0.480000 0.424000 -0.760000
+0.550000 0.351500 -0.135900 0.456000 0.632000 -0.616000
+0.600000 0.301200 -0.128700 0.472000 0.520000 -0.704000
+0.550000 0.301200 -0.167400 0.408000 0.504000 -0.752000
+0.600000 0.256700 -0.182900 0.328000 0.496000 -0.792000
+0.550000 0.283200 -0.182900 0.320000 0.472000 -0.816000
+0.600000 0.251000 -0.187000 0.320000 0.456000 -0.816000
+0.550000 0.251000 -0.199600 0.176000 0.288000 -0.936000
+0.600000 0.200800 -0.209200 0.248000 0.288000 -0.920000
+0.550000 0.200800 -0.211100 0.016000 0.048000 -0.992000
+0.600000 0.150600 -0.225200 0.008000 0.128000 -0.984000
+0.550000 0.150600 -0.215400 -0.144000 0.080000 -0.984000
+0.600000 0.100400 -0.237100 -0.096000 0.168000 -0.976000
+0.550000 0.100400 -0.212600 -0.200000 0.352000 -0.904000
+0.600000 0.076600 -0.243900 -0.096000 0.360000 -0.920000
+0.550000 0.067800 -0.243900 0.024000 0.672000 -0.728000
+0.600000 0.050200 -0.251100 0.248000 0.344000 -0.896000
+0.550000 0.050200 -0.258400 0.160000 0.632000 -0.752000
+0.600000 0.000000 -0.284600 0.512000 0.112000 -0.840000
+0.550000 0.015600 -0.304800 0.472000 0.712000 -0.512000
+0.578400 0.000000 -0.304800 0.536000 0.480000 -0.688000
+0.550000 0.000000 -0.335900 0.576000 0.464000 -0.664000
+0.587300 -0.050200 -0.304800 0.688000 0.056000 -0.712000
+0.550000 -0.050200 -0.345500 0.192000 -0.560000 -0.792000
+0.550000 -0.083700 -0.304800 0.088000 -0.736000 -0.664000
+0.500000 -0.050200 -0.339600 -0.136000 -0.672000 -0.720000
+0.500000 -0.082600 -0.304800 0.216000 -0.680000 -0.688000
+0.450000 -0.050200 -0.325200 -0.120000 -0.568000 -0.808000
+0.475800 -0.100400 -0.304800 0.512000 -0.104000 -0.848000
+0.450000 -0.100400 -0.322200 0.392000 -0.360000 -0.840000
+0.500000 -0.127100 -0.304800 0.480000 0.456000 -0.744000
+0.450000 -0.150600 -0.321300 -0.008000 0.120000 -0.992000
+0.500000 -0.150600 -0.319100 0.336000 0.504000 -0.792000
+0.450000 -0.200800 -0.331300 -0.472000 -0.400000 -0.776000
+0.500000 -0.200800 -0.334200 -0.376000 -0.448000 -0.800000
+0.450000 -0.217600 -0.304800 -0.352000 -0.736000 -0.560000
+0.500000 -0.222600 -0.304800 -0.320000 -0.704000 -0.624000
+0.450000 -0.248400 -0.243900 -0.224000 -0.888000 -0.384000
+0.500000 -0.251000 -0.264200 -0.272000 -0.744000 -0.600000
+0.459300 -0.251000 -0.243900 -0.280000 -0.864000 -0.400000
+0.500000 -0.282700 -0.243900 -0.568000 -0.592000 -0.560000
+0.450000 -0.251000 -0.203800 -0.216000 -0.960000 -0.144000
+0.500000 -0.288400 -0.182900 -0.520000 -0.656000 0.528000
+0.450000 -0.255300 -0.182900 -0.208000 -0.656000 0.712000
+0.500000 -0.251000 -0.123800 -0.544000 -0.688000 0.456000
+0.450000 -0.251000 -0.179900 -0.288000 -0.680000 0.664000
+0.500000 -0.250100 -0.121900 -0.432000 -0.712000 0.536000
+0.450000 -0.227100 -0.121900 -0.296000 -0.712000 0.624000
+0.500000 -0.203100 -0.060900 -0.256000 -0.616000 0.736000
+0.450000 -0.200800 -0.072200 -0.256000 -0.536000 0.800000
+0.491400 -0.200800 -0.060900 -0.168000 -0.584000 0.784000
+0.450000 -0.150600 -0.064700 -0.192000 0.128000 0.968000
+0.463100 -0.150600 -0.060900 -0.168000 0.352000 0.912000
+0.450000 -0.100400 -0.078400 -0.088000 0.200000 0.968000
+0.500000 -0.139000 -0.060900 0.080000 0.536000 0.832000
+0.500000 -0.100400 -0.086800 -0.048000 0.256000 0.960000
+0.530700 -0.150600 -0.060900 0.208000 0.504000 0.832000
+0.550000 -0.100400 -0.076900 0.056000 0.056000 0.992000
+0.550000 -0.150600 -0.067100 0.240000 0.480000 0.840000
+0.600000 -0.100400 -0.077400 0.584000 0.048000 0.800000
+0.600000 -0.150600 -0.093600 0.304000 0.568000 0.752000
+0.626600 -0.100400 -0.121900 0.848000 0.208000 0.472000
+0.650000 -0.150600 -0.116200 0.720000 0.480000 0.488000
+0.650000 -0.146100 -0.121900 0.720000 0.504000 0.464000
+0.652900 -0.150600 -0.121900 0.752000 0.456000 0.464000
+0.650000 -0.117900 -0.182900 0.792000 0.600000 0.024000
+0.675300 -0.150600 -0.182900 0.768000 0.552000 0.296000
+0.650000 -0.120200 -0.243900 0.704000 0.520000 -0.472000
+0.674200 -0.150600 -0.243900 0.696000 0.600000 -0.384000
+0.650000 -0.150600 -0.274900 0.544000 0.464000 -0.688000
+0.700000 -0.175300 -0.243900 0.752000 0.600000 -0.240000
+0.650000 -0.200800 -0.297000 0.088000 0.616000 -0.776000
+0.700000 -0.200800 -0.294000 0.576000 0.608000 -0.536000
+0.650000 -0.208600 -0.304800 0.024000 0.680000 -0.728000
+0.700000 -0.211400 -0.304800 0.288000 0.624000 -0.720000
+0.650000 -0.245700 -0.365800 0.168000 0.856000 -0.480000
+0.700000 -0.251000 -0.357800 0.296000 0.496000 -0.808000
+0.678000 -0.251000 -0.365800 0.264000 0.520000 -0.808000
+0.700000 -0.301200 -0.354900 0.160000 -0.240000 -0.952000
+0.650000 -0.267900 -0.365800 0.280000 -0.440000 -0.848000
+0.650000 -0.301200 -0.350300 0.016000 -0.440000 -0.888000
+0.600000 -0.288400 -0.365800 -0.376000 -0.712000 -0.584000
+0.600000 -0.301200 -0.352300 -0.528000 -0.312000 -0.776000
+0.573000 -0.251000 -0.365800 -0.696000 0.544000 -0.464000
+0.567500 -0.301200 -0.304800 -0.696000 0.400000 -0.584000
+0.550000 -0.251000 -0.326800 -0.648000 -0.504000 -0.560000
+0.550000 -0.272400 -0.304800 -0.680000 -0.440000 -0.576000
+0.535300 -0.251000 -0.304800 -0.648000 -0.480000 -0.576000
+0.550000 -0.301200 -0.279200 -0.712000 0.120000 -0.680000
+0.500000 -0.251000 -0.264200 -0.272000 -0.744000 -0.600000
+0.513800 -0.301200 -0.243900 -0.728000 0.592000 -0.328000
+0.500000 -0.282700 -0.243900 -0.568000 -0.592000 -0.560000
+0.511800 -0.301200 -0.182900 -0.912000 0.352000 0.176000
+0.500000 -0.288400 -0.182900 -0.520000 -0.656000 0.528000
+0.550000 -0.301200 -0.123600 -0.624000 -0.440000 0.632000
+0.500000 -0.251000 -0.123800 -0.544000 -0.688000 0.456000
+0.550000 -0.300100 -0.121900 -0.624000 -0.616000 0.472000
+0.501100 -0.251000 -0.121900 -0.552000 -0.624000 0.544000
+0.550000 -0.251000 -0.069700 -0.416000 -0.584000 0.688000
+0.500000 -0.250100 -0.121900 -0.432000 -0.712000 0.536000
+0.550000 -0.242100 -0.060900 -0.400000 -0.536000 0.736000
+0.500000 -0.203100 -0.060900 -0.256000 -0.616000 0.736000
+0.550000 -0.200800 -0.034900 0.016000 -0.040000 0.992000
+0.500000 -0.200800 -0.058700 -0.200000 -0.576000 0.784000
+0.550000 -0.159500 -0.060900 0.248000 0.472000 0.840000
+0.500000 -0.150600 -0.051600 0.024000 0.352000 0.928000
+0.530700 -0.150600 -0.060900 0.208000 0.504000 0.832000
+0.500000 -0.139000 -0.060900 0.080000 0.536000 0.832000
+0.500000 -0.150600 -0.051600 0.024000 0.352000 0.928000
+0.463100 -0.150600 -0.060900 -0.168000 0.352000 0.912000
+0.500000 -0.200800 -0.058700 -0.200000 -0.576000 0.784000
+0.491400 -0.200800 -0.060900 -0.168000 -0.584000 0.784000
+0.500000 -0.203100 -0.060900 -0.256000 -0.616000 0.736000
+0.500000 -0.203100 -0.060900 -0.256000 -0.616000 0.736000
+0.600000 0.251000 0.198700 -0.584000 -0.144000 0.792000
+0.600000 0.251000 0.198700 -0.584000 -0.144000 0.792000
+0.600000 0.301200 0.199900 -0.528000 0.136000 0.832000
+0.586200 0.251000 0.182900 -0.672000 -0.144000 0.720000
+0.577700 0.301200 0.182900 -0.536000 0.272000 0.792000
+0.550000 0.251000 0.125100 -0.872000 -0.184000 0.440000
+0.550000 0.301200 0.149100 -0.896000 -0.096000 0.416000
+0.548800 0.251000 0.121900 -0.912000 -0.176000 0.360000
+0.538800 0.301200 0.121900 -0.912000 0.128000 0.376000
+0.533200 0.251000 0.060900 -0.856000 0.032000 0.512000
+0.526500 0.301200 0.060900 -0.896000 0.008000 0.432000
+0.500800 0.251000 0.000000 -0.792000 -0.016000 0.608000
+0.500000 0.301200 0.002700 -0.768000 -0.080000 0.624000
+0.500000 0.266900 0.000000 -0.760000 -0.040000 0.640000
+0.497900 0.301200 0.000000 -0.728000 -0.144000 0.664000
+0.500000 0.251000 -0.000900 -0.496000 0.112000 0.856000
+0.450000 0.301200 -0.039700 -0.448000 -0.256000 0.848000
+0.450000 0.251000 -0.039600 -0.400000 -0.080000 0.904000
+0.400000 0.301200 -0.051900 -0.168000 -0.472000 0.856000
+0.400000 0.251000 -0.058700 -0.328000 -0.176000 0.920000
+0.353900 0.301200 -0.060900 -0.128000 -0.544000 0.824000
+0.395100 0.251000 -0.060900 -0.344000 -0.184000 0.912000
+0.350000 0.301200 -0.062100 -0.176000 -0.704000 0.680000
+0.350000 0.251000 -0.088400 -0.448000 -0.320000 0.824000
+0.300000 0.301200 -0.077400 -0.160000 -0.712000 0.680000
+0.300000 0.251000 -0.114600 -0.168000 -0.536000 0.824000
+0.250000 0.301200 -0.083600 -0.096000 -0.744000 0.648000
+0.271900 0.251000 -0.121900 -0.240000 -0.760000 0.592000
+0.250000 0.256500 -0.121900 -0.200000 -0.800000 0.552000
+0.300000 0.251000 -0.156100 -0.368000 -0.808000 -0.448000
+0.250000 0.284000 -0.182900 -0.096000 -0.256000 -0.952000
+0.300000 0.284000 -0.182900 -0.168000 -0.184000 -0.960000
+0.250000 0.301200 -0.184400 -0.080000 -0.056000 -0.992000
+0.300000 0.301200 -0.184400 -0.064000 -0.072000 -0.992000
+0.250000 0.351500 -0.189100 -0.160000 0.168000 -0.968000
+0.300000 0.351500 -0.193900 -0.008000 0.064000 -0.992000
+0.250000 0.370000 -0.182900 -0.184000 0.304000 -0.928000
+0.300000 0.379400 -0.182900 -0.016000 0.272000 -0.960000
+0.250000 0.401700 -0.172700 -0.016000 0.288000 -0.952000
+0.300000 0.401700 -0.174800 0.040000 0.368000 -0.920000
+0.250000 0.451900 -0.137900 0.128000 0.536000 -0.824000
+0.300000 0.451900 -0.131100 0.200000 0.712000 -0.664000
+0.250000 0.466900 -0.121900 0.232000 0.968000 0.016000
+0.300000 0.458100 -0.121900 0.224000 0.952000 -0.176000
+0.250000 0.451900 -0.094000 0.248000 0.784000 0.552000
+0.300000 0.451900 -0.106900 0.184000 0.864000 0.456000
+0.250000 0.432000 -0.060900 0.224000 0.624000 0.736000
+0.300000 0.430700 -0.060900 0.128000 0.808000 0.568000
+0.250000 0.401700 -0.026800 -0.216000 0.176000 0.952000
+0.300000 0.401700 -0.022200 0.096000 0.472000 0.864000
+0.250000 0.351500 -0.020200 -0.488000 -0.416000 0.760000
+0.300000 0.351500 -0.009100 -0.016000 -0.144000 0.984000
+0.250000 0.317900 -0.060900 -0.432000 -0.680000 0.584000
+0.300000 0.310700 -0.060900 -0.072000 -0.760000 0.640000
+0.250000 0.301200 -0.083600 -0.096000 -0.744000 0.648000
+0.300000 0.301200 -0.077400 -0.160000 -0.712000 0.680000
+0.300000 0.310700 -0.060900 -0.072000 -0.760000 0.640000
+0.350000 0.301200 -0.062100 -0.176000 -0.704000 0.680000
+0.350000 0.302200 -0.060900 -0.144000 -0.624000 0.760000
+0.353900 0.301200 -0.060900 -0.128000 -0.544000 0.824000
+0.350000 0.351500 -0.021800 0.032000 -0.048000 0.992000
+0.400000 0.301200 -0.051900 -0.168000 -0.472000 0.856000
+0.400000 0.351500 -0.018700 -0.136000 -0.208000 0.960000
+0.450000 0.301200 -0.039700 -0.448000 -0.256000 0.848000
+0.450000 0.351500 -0.003200 -0.296000 0.344000 0.888000
+0.497900 0.301200 0.000000 -0.728000 -0.144000 0.664000
+0.458200 0.351500 0.000000 -0.280000 0.520000 0.800000
+0.500000 0.301200 0.002700 -0.768000 -0.080000 0.624000
+0.500000 0.351500 0.029100 -0.680000 0.048000 0.728000
+0.526500 0.301200 0.060900 -0.896000 0.008000 0.432000
+0.540600 0.351500 0.060900 -0.584000 0.632000 0.496000
+0.538800 0.301200 0.121900 -0.912000 0.128000 0.376000
+0.550000 0.351500 0.078000 -0.616000 0.672000 0.392000
+0.550000 0.331800 0.121900 -0.696000 0.536000 0.456000
+0.566500 0.351500 0.121900 -0.632000 0.576000 0.496000
+0.550000 0.301200 0.149100 -0.896000 -0.096000 0.416000
+0.600000 0.351500 0.157200 -0.376000 0.584000 0.704000
+0.577700 0.301200 0.182900 -0.536000 0.272000 0.792000
+0.600000 0.327100 0.182900 -0.144000 0.552000 0.816000
+0.600000 0.351500 0.157200 -0.376000 0.584000 0.704000
+0.650000 0.311500 0.182900 0.424000 0.496000 0.752000
+0.650000 0.351500 0.128300 0.616000 0.616000 0.480000
+0.650000 0.351500 0.128300 0.616000 0.616000 0.480000
+0.586200 0.251000 0.182900 -0.672000 -0.144000 0.720000
+0.586200 0.251000 0.182900 -0.672000 -0.144000 0.720000
+0.600000 0.251000 0.198700 -0.584000 -0.144000 0.792000
+0.600000 0.211800 0.182900 -0.672000 -0.280000 0.672000
+0.650000 0.251000 0.217300 -0.016000 0.232000 0.968000
+0.604600 0.200800 0.182900 -0.672000 -0.288000 0.664000
+0.650000 0.200800 0.219700 -0.496000 -0.256000 0.824000
+0.641000 0.150600 0.182900 -0.528000 -0.464000 0.696000
+0.650000 0.150600 0.191100 -0.504000 -0.472000 0.720000
+0.650000 0.141000 0.182900 -0.512000 -0.488000 0.704000
+0.700000 0.150600 0.220800 -0.264000 -0.416000 0.864000
+0.685300 0.100400 0.182900 -0.504000 -0.560000 0.648000
+0.700000 0.100400 0.197200 -0.456000 -0.560000 0.680000
+0.700000 0.088000 0.182900 -0.464000 -0.608000 0.640000
+0.750000 0.100400 0.207000 0.032000 -0.192000 0.976000
+0.750000 0.062100 0.182900 -0.416000 -0.632000 0.648000
+0.800000 0.100400 0.199400 -0.032000 0.024000 0.992000
+0.762700 0.050200 0.182900 -0.512000 -0.672000 0.520000
+0.800000 0.050200 0.211000 -0.336000 -0.552000 0.752000
+0.800000 0.035400 0.182900 -0.432000 -0.808000 0.384000
+0.850000 0.050200 0.216300 -0.184000 -0.272000 0.936000
+0.846600 0.000000 0.182900 -0.736000 -0.616000 0.264000
+0.850000 0.000000 0.194300 -0.704000 -0.640000 0.296000
+0.850000 -0.004200 0.182900 -0.720000 -0.616000 0.288000
+0.900000 0.000000 0.237100 -0.176000 -0.616000 0.760000
+0.880500 -0.050200 0.182900 -0.744000 -0.528000 0.384000
+0.900000 -0.050200 0.230400 -0.448000 -0.568000 0.680000
+0.900000 -0.076800 0.182900 -0.504000 -0.624000 0.592000
+0.950000 -0.050200 0.197900 0.336000 -0.192000 0.920000
+0.934300 -0.100400 0.182900 -0.392000 -0.752000 0.520000
+0.950000 -0.100400 0.196500 0.208000 -0.704000 0.672000
+0.950000 -0.108800 0.182900 0.232000 -0.768000 0.584000
+0.934300 -0.100400 0.182900 -0.392000 -0.752000 0.520000
+0.950000 -0.142500 0.121900 -0.608000 -0.672000 0.392000
+0.900000 -0.100400 0.145900 -0.608000 -0.728000 0.304000
+0.900000 -0.107100 0.121900 -0.584000 -0.768000 0.240000
+0.892500 -0.100400 0.121900 -0.688000 -0.680000 0.240000
+0.900000 -0.117100 0.060900 -0.656000 -0.736000 0.136000
+0.881900 -0.100400 0.060900 -0.752000 -0.632000 0.152000
+0.900000 -0.125700 0.000000 -0.664000 -0.728000 0.136000
+0.873300 -0.100400 0.000000 -0.752000 -0.632000 0.120000
+0.900000 -0.135500 -0.060900 -0.672000 -0.712000 0.168000
+0.865600 -0.100400 -0.060900 -0.776000 -0.616000 0.120000
+0.900000 -0.148200 -0.121900 -0.664000 -0.728000 0.088000
+0.858300 -0.100400 -0.121900 -0.792000 -0.600000 0.056000
+0.900000 -0.150600 -0.145400 -0.696000 -0.704000 0.104000
+0.858100 -0.100400 -0.182900 -0.824000 -0.552000 0.000000
+0.895100 -0.150600 -0.182900 -0.744000 -0.648000 0.104000
+0.860900 -0.100400 -0.243900 -0.856000 -0.496000 -0.072000
+0.890800 -0.150600 -0.243900 -0.848000 -0.512000 0.064000
+0.869700 -0.100400 -0.304800 -0.880000 -0.248000 -0.400000
+0.883200 -0.150600 -0.304800 -0.864000 -0.368000 -0.320000
+0.890800 -0.150600 -0.243900 -0.848000 -0.512000 0.064000
+0.900000 -0.181100 -0.304800 -0.768000 -0.440000 -0.448000
+0.900000 -0.163000 -0.243900 -0.816000 -0.552000 0.128000
+0.911900 -0.200800 -0.304800 -0.864000 -0.480000 -0.128000
+0.928800 -0.200800 -0.243900 -0.736000 -0.616000 0.240000
+0.942100 -0.251000 -0.304800 -0.752000 -0.552000 0.344000
+0.950000 -0.224400 -0.243900 -0.688000 -0.640000 0.328000
+0.950000 -0.251000 -0.295200 -0.640000 -0.496000 0.576000
+0.942100 -0.251000 -0.304800 -0.752000 -0.552000 0.344000
+0.950000 -0.261400 -0.304800 -0.752000 -0.584000 0.288000
+0.950000 -0.261400 -0.304800 -0.752000 -0.584000 0.288000
+0.650000 0.251000 0.217300 -0.016000 0.232000 0.968000
+0.650000 0.251000 0.217300 -0.016000 0.232000 0.968000
+0.600000 0.251000 0.198700 -0.584000 -0.144000 0.792000
+0.650000 0.301200 0.190400 0.408000 0.464000 0.776000
+0.600000 0.301200 0.199900 -0.528000 0.136000 0.832000
+0.600000 0.301200 0.199900 -0.528000 0.136000 0.832000
+0.700000 0.251000 0.193900 0.488000 0.504000 0.704000
+0.700000 0.251000 0.193900 0.488000 0.504000 0.704000
+0.650000 0.251000 0.217300 -0.016000 0.232000 0.968000
+0.700000 0.200800 0.226400 0.328000 0.432000 0.832000
+0.650000 0.200800 0.219700 -0.496000 -0.256000 0.824000
+0.700000 0.150600 0.220800 -0.264000 -0.416000 0.864000
+0.650000 0.150600 0.191100 -0.504000 -0.472000 0.720000
+0.650000 0.150600 0.191100 -0.504000 -0.472000 0.720000
+0.750000 0.200800 0.191100 0.424000 0.552000 0.712000
+0.750000 0.200800 0.191100 0.424000 0.552000 0.712000
+0.700000 0.200800 0.226400 0.328000 0.432000 0.832000
+0.750000 0.150600 0.201100 0.320000 0.240000 0.912000
+0.700000 0.150600 0.220800 -0.264000 -0.416000 0.864000
+0.750000 0.100400 0.207000 0.032000 -0.192000 0.976000
+0.700000 0.100400 0.197200 -0.456000 -0.560000 0.680000
+0.700000 0.100400 0.197200 -0.456000 -0.560000 0.680000
+0.850000 0.050200 0.216300 -0.184000 -0.272000 0.936000
+0.850000 0.050200 0.216300 -0.184000 -0.272000 0.936000
+0.800000 0.050200 0.211000 -0.336000 -0.552000 0.752000
+0.850000 0.100400 0.222500 0.440000 0.584000 0.672000
+0.800000 0.100400 0.199400 -0.032000 0.024000 0.992000
+0.800000 0.100400 0.199400 -0.032000 0.024000 0.992000
+0.900000 0.000000 0.237100 -0.176000 -0.616000 0.760000
+0.900000 0.000000 0.237100 -0.176000 -0.616000 0.760000
+0.850000 0.000000 0.194300 -0.704000 -0.640000 0.296000
+0.900000 0.050200 0.226800 0.488000 0.496000 0.712000
+0.850000 0.050200 0.216300 -0.184000 -0.272000 0.936000
+0.850000 0.050200 0.216300 -0.184000 -0.272000 0.936000
+0.950000 -0.050200 0.197900 0.336000 -0.192000 0.920000
+0.950000 -0.050200 0.197900 0.336000 -0.192000 0.920000
+0.900000 -0.050200 0.230400 -0.448000 -0.568000 0.680000
+0.950000 0.000000 0.206500 0.400000 0.008000 0.912000
+0.900000 0.000000 0.237100 -0.176000 -0.616000 0.760000
+0.900000 0.000000 0.237100 -0.176000 -0.616000 0.760000
+-0.950000 0.150600 0.154300 0.208000 0.640000 0.736000
+-0.950000 0.150600 0.154300 0.208000 0.640000 0.736000
+-0.900000 0.150600 0.126400 0.344000 0.632000 0.688000
+-0.950000 0.178500 0.121900 0.272000 0.648000 0.704000
+-0.900000 0.154600 0.121900 0.352000 0.624000 0.688000
+-0.950000 0.200800 0.096100 0.208000 0.672000 0.704000
+-0.900000 0.200800 0.074800 0.296000 0.712000 0.624000
+-0.950000 0.226300 0.060900 0.264000 0.760000 0.584000
+-0.900000 0.210300 0.060900 0.312000 0.744000 0.576000
+-0.950000 0.251000 0.016800 0.288000 0.808000 0.504000
+-0.900000 0.240500 0.000000 0.368000 0.840000 0.376000
+-0.928700 0.251000 0.000000 0.312000 0.848000 0.408000
+-0.900000 0.251000 -0.035000 0.384000 0.864000 0.312000
+-0.950000 0.258900 0.000000 0.296000 0.848000 0.432000
+-0.900000 0.258900 -0.060900 0.400000 0.896000 0.144000
+-0.950000 0.277400 -0.060900 0.336000 0.928000 0.080000
+-0.900000 0.251000 -0.101700 0.376000 0.896000 -0.216000
+-0.950000 0.267200 -0.121900 0.344000 0.864000 -0.336000
+-0.910500 0.251000 -0.121900 0.344000 0.880000 -0.304000
+-0.950000 0.251000 -0.157200 0.320000 0.808000 -0.480000
+-0.900000 0.246900 -0.121900 0.360000 0.872000 -0.304000
+-0.950000 0.237800 -0.182900 0.296000 0.760000 -0.568000
+-0.900000 0.214200 -0.182900 0.360000 0.720000 -0.576000
+-0.950000 0.200800 -0.231900 0.272000 0.640000 -0.704000
+-0.900000 0.200800 -0.201400 0.352000 0.680000 -0.640000
+-0.950000 0.189400 -0.243900 0.264000 0.616000 -0.728000
+-0.900000 0.162400 -0.243900 0.336000 0.616000 -0.704000
+-0.950000 0.150600 -0.281200 0.240000 0.600000 -0.752000
+-0.900000 0.150600 -0.256300 0.328000 0.616000 -0.704000
+-0.950000 0.126000 -0.304800 0.168000 0.528000 -0.824000
+-0.900000 0.104600 -0.304800 0.304000 0.568000 -0.760000
+-0.950000 0.100400 -0.325900 0.192000 0.384000 -0.896000
+-0.900000 0.100400 -0.308600 0.312000 0.536000 -0.776000
+-0.950000 0.050200 -0.340200 0.184000 0.072000 -0.976000
+-0.900000 0.050200 -0.331200 0.320000 0.232000 -0.912000
+-0.950000 0.000000 -0.337100 0.184000 -0.088000 -0.976000
+-0.900000 0.000000 -0.328400 0.216000 0.000000 -0.968000
+-0.950000 -0.050200 -0.337400 0.088000 0.008000 -0.992000
+-0.900000 -0.050200 -0.330000 0.160000 0.128000 -0.976000
+-0.900000 0.000000 -0.328400 0.216000 0.000000 -0.968000
+-0.850000 -0.050200 -0.323400 0.248000 0.176000 -0.944000
+-0.850000 0.000000 -0.313800 0.264000 0.064000 -0.960000
+-0.808200 -0.050200 -0.304800 0.280000 0.136000 -0.944000
+-0.823600 0.000000 -0.304800 0.296000 0.080000 -0.944000
+-0.800000 -0.050200 -0.302200 0.264000 0.120000 -0.952000
+-0.800000 0.000000 -0.298500 0.248000 0.080000 -0.960000
+-0.750000 -0.050200 -0.287100 0.288000 0.040000 -0.952000
+-0.750000 0.000000 -0.285200 0.328000 0.160000 -0.920000
+-0.700000 -0.050200 -0.272000 0.360000 0.104000 -0.920000
+-0.700000 0.000000 -0.262900 0.392000 0.288000 -0.864000
+-0.650000 -0.050200 -0.249300 0.496000 0.208000 -0.840000
+-0.669700 0.000000 -0.243900 0.480000 0.312000 -0.808000
+-0.650000 -0.035200 -0.243900 0.544000 0.264000 -0.792000
+-0.650000 0.000000 -0.224600 0.632000 0.368000 -0.672000
+-0.642900 -0.050200 -0.243900 0.560000 0.208000 -0.792000
+-0.621400 0.000000 -0.182900 0.848000 0.280000 -0.440000
+-0.606100 -0.050200 -0.182900 0.864000 0.248000 -0.424000
+-0.606100 -0.050200 -0.182900 0.864000 0.248000 -0.424000
+-0.950000 0.127100 0.182900 0.248000 0.536000 0.800000
+-0.950000 0.127100 0.182900 0.248000 0.536000 0.800000
+-0.950000 0.150600 0.154300 0.208000 0.640000 0.736000
+-0.900000 0.101900 0.182900 0.304000 0.552000 0.768000
+-0.900000 0.150600 0.126400 0.344000 0.632000 0.688000
+-0.900000 0.150600 0.126400 0.344000 0.632000 0.688000
+-0.939400 -0.100400 0.121900 -0.456000 -0.816000 0.336000
+-0.939400 -0.100400 0.121900 -0.456000 -0.816000 0.336000
+-0.900000 -0.100400 0.174900 -0.400000 -0.624000 0.656000
+-0.900000 -0.127600 0.121900 -0.608000 -0.704000 0.344000
+-0.900000 -0.127600 0.121900 -0.608000 -0.704000 0.344000
+-0.900000 0.150600 0.126400 0.344000 0.632000 0.688000
+-0.900000 0.150600 0.126400 0.344000 0.632000 0.688000
+-0.900000 0.154600 0.121900 0.352000 0.624000 0.688000
+-0.892900 0.150600 0.121900 0.360000 0.624000 0.680000
+-0.900000 0.200800 0.074800 0.296000 0.712000 0.624000
+-0.850000 0.150600 0.098600 0.360000 0.600000 0.704000
+-0.879600 0.200800 0.060900 0.352000 0.712000 0.600000
+-0.850000 0.184100 0.060900 0.376000 0.632000 0.664000
+-0.850000 0.200800 0.035600 0.384000 0.744000 0.536000
+-0.800000 0.153700 0.060900 0.432000 0.632000 0.632000
+-0.811000 0.200800 0.000000 0.408000 0.816000 0.392000
+-0.800000 0.195100 0.000000 0.456000 0.768000 0.432000
+-0.800000 0.200800 -0.016800 0.416000 0.840000 0.336000
+-0.750000 0.162200 0.000000 0.464000 0.672000 0.560000
+-0.768900 0.200800 -0.060900 0.424000 0.888000 0.160000
+-0.750000 0.191300 -0.060900 0.496000 0.856000 0.072000
+-0.800000 0.200800 -0.113900 0.392000 0.880000 -0.256000
+-0.750000 0.174400 -0.121900 0.448000 0.824000 -0.336000
+-0.800000 0.198900 -0.121900 0.384000 0.872000 -0.288000
+-0.750000 0.150600 -0.159200 0.432000 0.664000 -0.600000
+-0.800000 0.163000 -0.182900 0.392000 0.688000 -0.600000
+-0.779100 0.150600 -0.182900 0.400000 0.664000 -0.616000
+-0.800000 0.150600 -0.199200 0.384000 0.648000 -0.648000
+-0.750000 0.132600 -0.182900 0.408000 0.656000 -0.624000
+-0.800000 0.108800 -0.243900 0.352000 0.608000 -0.704000
+-0.750000 0.100400 -0.222000 0.432000 0.576000 -0.680000
+-0.785800 0.100400 -0.243900 0.360000 0.584000 -0.720000
+-0.750000 0.077000 -0.243900 0.368000 0.552000 -0.744000
+-0.800000 0.100400 -0.252800 0.360000 0.584000 -0.720000
+-0.750000 0.050200 -0.267100 0.368000 0.432000 -0.816000
+-0.800000 0.050200 -0.288900 0.352000 0.360000 -0.856000
+-0.750000 0.000000 -0.285200 0.328000 0.160000 -0.920000
+-0.800000 0.000000 -0.298500 0.248000 0.080000 -0.960000
+-0.800000 0.050200 -0.288900 0.352000 0.360000 -0.856000
+-0.823600 0.000000 -0.304800 0.296000 0.080000 -0.944000
+-0.836500 0.050200 -0.304800 0.336000 0.344000 -0.872000
+-0.850000 0.000000 -0.313800 0.264000 0.064000 -0.960000
+-0.850000 0.050200 -0.311100 0.336000 0.328000 -0.872000
+-0.900000 0.000000 -0.328400 0.216000 0.000000 -0.968000
+-0.900000 0.050200 -0.331200 0.320000 0.232000 -0.912000
+-0.850000 0.050200 -0.311100 0.336000 0.328000 -0.872000
+-0.900000 0.100400 -0.308600 0.312000 0.536000 -0.776000
+-0.850000 0.061400 -0.304800 0.336000 0.392000 -0.848000
+-0.892300 0.100400 -0.304800 0.320000 0.536000 -0.776000
+-0.850000 0.100400 -0.281200 0.344000 0.488000 -0.792000
+-0.900000 0.104600 -0.304800 0.304000 0.568000 -0.760000
+-0.850000 0.135500 -0.243900 0.320000 0.608000 -0.712000
+-0.900000 0.150600 -0.256300 0.328000 0.616000 -0.704000
+-0.878700 0.150600 -0.243900 0.328000 0.616000 -0.704000
+-0.900000 0.162400 -0.243900 0.336000 0.616000 -0.704000
+-0.850000 0.150600 -0.229000 0.320000 0.608000 -0.720000
+-0.900000 0.200800 -0.201400 0.352000 0.680000 -0.640000
+-0.850000 0.188600 -0.182900 0.360000 0.712000 -0.592000
+-0.874200 0.200800 -0.182900 0.360000 0.712000 -0.584000
+-0.850000 0.200800 -0.163600 0.360000 0.768000 -0.512000
+-0.900000 0.214200 -0.182900 0.360000 0.720000 -0.576000
+-0.850000 0.222300 -0.121900 0.408000 0.856000 -0.296000
+-0.900000 0.246900 -0.121900 0.360000 0.872000 -0.304000
+-0.850000 0.235300 -0.060900 0.408000 0.904000 0.008000
+-0.900000 0.251000 -0.101700 0.376000 0.896000 -0.216000
+-0.884300 0.251000 -0.060900 0.432000 0.880000 0.144000
+-0.900000 0.258900 -0.060900 0.400000 0.896000 0.144000
+-0.900000 0.251000 -0.035000 0.384000 0.864000 0.312000
+-0.884300 0.251000 -0.060900 0.432000 0.880000 0.144000
+-0.900000 0.240500 0.000000 0.368000 0.840000 0.376000
+-0.850000 0.235300 -0.060900 0.408000 0.904000 0.008000
+-0.850000 0.219100 0.000000 0.368000 0.824000 0.424000
+-0.800000 0.214400 -0.060900 0.400000 0.896000 0.176000
+-0.811000 0.200800 0.000000 0.408000 0.816000 0.392000
+-0.800000 0.200800 -0.016800 0.416000 0.840000 0.336000
+-0.800000 0.214400 -0.060900 0.400000 0.896000 0.176000
+-0.768900 0.200800 -0.060900 0.424000 0.888000 0.160000
+-0.800000 0.200800 -0.113900 0.392000 0.880000 -0.256000
+-0.800000 0.214400 -0.060900 0.400000 0.896000 0.176000
+-0.804300 0.200800 -0.121900 0.384000 0.872000 -0.288000
+-0.850000 0.235300 -0.060900 0.408000 0.904000 0.008000
+-0.850000 0.222300 -0.121900 0.408000 0.856000 -0.296000
+-0.804300 0.200800 -0.121900 0.384000 0.872000 -0.288000
+-0.850000 0.200800 -0.163600 0.360000 0.768000 -0.512000
+-0.800000 0.198900 -0.121900 0.384000 0.872000 -0.288000
+-0.850000 0.188600 -0.182900 0.360000 0.712000 -0.592000
+-0.800000 0.163000 -0.182900 0.392000 0.688000 -0.600000
+-0.850000 0.150600 -0.229000 0.320000 0.608000 -0.720000
+-0.800000 0.150600 -0.199200 0.384000 0.648000 -0.648000
+-0.850000 0.135500 -0.243900 0.320000 0.608000 -0.712000
+-0.800000 0.108800 -0.243900 0.352000 0.608000 -0.704000
+-0.850000 0.100400 -0.281200 0.344000 0.488000 -0.792000
+-0.800000 0.100400 -0.252800 0.360000 0.584000 -0.720000
+-0.850000 0.061400 -0.304800 0.336000 0.392000 -0.848000
+-0.800000 0.050200 -0.288900 0.352000 0.360000 -0.856000
+-0.836500 0.050200 -0.304800 0.336000 0.344000 -0.872000
+-0.850000 0.061400 -0.304800 0.336000 0.392000 -0.848000
+-0.850000 0.050200 -0.311100 0.336000 0.328000 -0.872000
+-0.850000 0.050200 -0.311100 0.336000 0.328000 -0.872000
+-0.850000 0.127100 0.121900 0.424000 0.560000 0.704000
+-0.850000 0.127100 0.121900 0.424000 0.560000 0.704000
+-0.820700 0.100400 0.121900 0.496000 0.488000 0.704000
+-0.850000 0.100400 0.150400 0.488000 0.512000 0.696000
+-0.850000 0.100400 0.150400 0.488000 0.512000 0.696000
+-0.839600 0.000000 0.182900 0.264000 0.152000 0.944000
+-0.839600 0.000000 0.182900 0.264000 0.152000 0.944000
+-0.809300 -0.050200 0.182900 0.232000 0.160000 0.952000
+-0.800000 0.000000 0.163200 0.400000 0.288000 0.864000
+-0.800000 -0.050200 0.179900 0.264000 0.176000 0.944000
+-0.750000 0.000000 0.129400 0.496000 0.360000 0.776000
+-0.750000 -0.050200 0.155100 0.464000 0.288000 0.832000
+-0.740500 0.000000 0.121900 0.504000 0.352000 0.784000
+-0.708600 -0.050200 0.121900 0.496000 0.344000 0.784000
+-0.700000 0.000000 0.089700 0.584000 0.336000 0.736000
+-0.700000 -0.050200 0.115300 0.496000 0.344000 0.792000
+-0.666100 0.000000 0.060900 0.560000 0.376000 0.728000
+-0.650000 -0.050200 0.076400 0.576000 0.320000 0.744000
+-0.650000 -0.023500 0.060900 0.576000 0.360000 0.720000
+-0.635700 -0.050200 0.060900 0.640000 0.304000 0.696000
+-0.650000 0.000000 0.045200 0.576000 0.400000 0.704000
+-0.600000 -0.050200 0.018400 0.648000 0.320000 0.688000
+-0.609800 0.000000 0.000000 0.696000 0.384000 0.592000
+-0.600000 -0.018300 0.000000 0.712000 0.368000 0.584000
+-0.600000 0.000000 -0.017800 0.736000 0.384000 0.544000
+-0.584800 -0.050200 0.000000 0.744000 0.336000 0.568000
+-0.573200 0.000000 -0.060900 0.920000 0.296000 -0.248000
+-0.554400 -0.050200 -0.060900 0.944000 0.280000 0.128000
+-0.554400 -0.050200 -0.060900 0.944000 0.280000 0.128000
+-0.800000 -0.063400 0.182900 0.240000 0.160000 0.952000
+-0.800000 -0.063400 0.182900 0.240000 0.160000 0.952000
+-0.809300 -0.050200 0.182900 0.232000 0.160000 0.952000
+-0.800000 -0.050200 0.179900 0.264000 0.176000 0.944000
+-0.800000 -0.050200 0.179900 0.264000 0.176000 0.944000
+-0.850000 -0.137400 0.182900 -0.304000 -0.312000 0.896000
+-0.850000 -0.137400 0.182900 -0.304000 -0.312000 0.896000
+-0.836800 -0.150600 0.182900 -0.304000 -0.304000 0.896000
+-0.850000 -0.150600 0.175600 -0.632000 -0.392000 0.664000
+-0.803100 -0.200800 0.182900 -0.456000 -0.168000 0.864000
+-0.850000 -0.200800 0.125700 -0.776000 -0.360000 0.504000
+-0.850000 -0.200800 0.125700 -0.776000 -0.360000 0.504000
+-0.800000 -0.251000 0.157900 -0.576000 -0.400000 0.696000
+-0.800000 -0.251000 0.157900 -0.576000 -0.400000 0.696000
+-0.800000 -0.280700 0.121900 -0.736000 -0.528000 0.408000
+-0.819200 -0.251000 0.121900 -0.760000 -0.496000 0.400000
+-0.800000 -0.301200 0.085900 -0.768000 -0.544000 0.304000
+-0.838400 -0.251000 0.060900 -0.808000 -0.528000 0.248000
+-0.805900 -0.301200 0.060900 -0.800000 -0.536000 0.232000
+-0.800000 -0.301200 0.085900 -0.768000 -0.544000 0.304000
+-0.800000 -0.310100 0.060900 -0.800000 -0.544000 0.224000
+-0.805900 -0.301200 0.060900 -0.800000 -0.536000 0.232000
+-0.800000 -0.327900 0.000000 -0.800000 -0.560000 0.176000
+-0.817700 -0.301200 0.000000 -0.808000 -0.560000 0.168000
+-0.817700 -0.301200 0.000000 -0.808000 -0.560000 0.168000
+-0.800000 0.077200 0.121900 0.512000 0.416000 0.744000
+-0.800000 0.077200 0.121900 0.512000 0.416000 0.744000
+-0.781300 0.050200 0.121900 0.536000 0.400000 0.736000
+-0.800000 0.050200 0.139800 0.504000 0.392000 0.760000
+-0.800000 0.050200 0.139800 0.504000 0.392000 0.760000
+-0.776900 -0.100400 0.182900 0.184000 0.120000 0.968000
+-0.776900 -0.100400 0.182900 0.184000 0.120000 0.968000
+-0.750000 -0.100400 0.174700 0.320000 0.192000 0.920000
+-0.750000 -0.136500 0.182900 0.216000 0.112000 0.968000
+-0.700000 -0.100400 0.138900 0.488000 0.288000 0.816000
+-0.743500 -0.150600 0.182900 0.192000 0.096000 0.968000
+-0.700000 -0.150600 0.164200 0.408000 0.248000 0.872000
+-0.703900 -0.200800 0.182900 0.128000 0.064000 0.984000
+-0.700000 -0.200800 0.182200 0.152000 0.072000 0.984000
+-0.700000 -0.208700 0.182900 0.176000 0.120000 0.968000
+-0.650000 -0.200800 0.153500 0.376000 0.280000 0.872000
+-0.650000 -0.249200 0.182900 0.176000 0.464000 0.864000
+-0.600000 -0.200800 0.130000 0.152000 0.560000 0.808000
+-0.638500 -0.251000 0.182900 0.072000 0.424000 0.896000
+-0.600000 -0.251000 0.177800 0.080000 0.520000 0.840000
+-0.600000 -0.260000 0.182900 0.056000 0.320000 0.944000
+-0.550000 -0.251000 0.173600 -0.016000 0.472000 0.872000
+-0.550000 -0.264400 0.182900 -0.072000 0.456000 0.880000
+-0.512000 -0.251000 0.182900 -0.112000 0.632000 0.760000
+-0.550000 -0.251000 0.173600 -0.016000 0.472000 0.872000
+-0.500000 -0.249000 0.182900 -0.112000 0.656000 0.744000
+-0.550000 -0.202900 0.121900 0.032000 0.728000 0.680000
+-0.500000 -0.200800 0.127000 -0.088000 0.600000 0.784000
+-0.536800 -0.200800 0.121900 -0.104000 0.736000 0.664000
+-0.500000 -0.196200 0.121900 -0.112000 0.784000 0.600000
+-0.550000 -0.200800 0.118700 0.032000 0.784000 0.608000
+-0.500000 -0.166600 0.060900 -0.304000 0.832000 0.448000
+-0.550000 -0.166800 0.060900 0.264000 0.816000 0.504000
+-0.500000 -0.150600 0.019400 -0.216000 0.856000 0.464000
+-0.550000 -0.150600 0.029600 0.504000 0.688000 0.512000
+-0.500000 -0.141000 0.000000 -0.040000 0.880000 0.456000
+-0.550000 -0.125000 0.000000 0.608000 0.616000 0.488000
+-0.500000 -0.119500 -0.060900 -0.160000 0.976000 0.112000
+-0.550000 -0.100400 -0.036900 0.792000 0.376000 0.464000
+-0.533200 -0.100400 -0.060900 0.712000 0.696000 -0.024000
+-0.533200 -0.100400 -0.060900 0.712000 0.696000 -0.024000
+-0.750000 -0.267900 0.182900 -0.232000 -0.192000 0.944000
+-0.750000 -0.267900 0.182900 -0.232000 -0.192000 0.944000
+-0.750000 -0.301200 0.168400 -0.360000 -0.432000 0.816000
+-0.700000 -0.272200 0.182900 -0.072000 -0.128000 0.984000
+-0.700000 -0.301200 0.175400 -0.248000 -0.280000 0.920000
+-0.671000 -0.301200 0.182900 -0.120000 -0.104000 0.984000
+-0.700000 -0.351500 0.155000 -0.664000 -0.344000 0.656000
+-0.663400 -0.351500 0.182900 -0.304000 -0.080000 0.944000
+-0.700000 -0.401700 0.124500 -0.664000 -0.408000 0.616000
+-0.650000 -0.385200 0.182900 -0.496000 -0.152000 0.848000
+-0.650000 -0.401700 0.178700 -0.552000 -0.344000 0.752000
+-0.644900 -0.401700 0.182900 -0.528000 -0.240000 0.808000
+-0.650000 -0.451900 0.140100 -0.528000 -0.568000 0.624000
+-0.600000 -0.446800 0.182900 -0.240000 -0.464000 0.848000
+-0.600000 -0.451900 0.179400 -0.216000 -0.496000 0.832000
+-0.583500 -0.451900 0.182900 -0.128000 -0.544000 0.824000
+-0.600000 -0.495400 0.121900 -0.392000 -0.720000 0.560000
+-0.550000 -0.456500 0.182900 0.056000 -0.736000 0.672000
+-0.550000 -0.494000 0.121900 0.024000 -0.832000 0.536000
+-0.600000 -0.495400 0.121900 -0.392000 -0.720000 0.560000
+-0.550000 -0.502100 0.104800 0.104000 -0.840000 0.520000
+-0.600000 -0.502100 0.110700 -0.280000 -0.792000 0.528000
+-0.550000 -0.532000 0.060900 0.080000 -0.776000 0.624000
+-0.600000 -0.531600 0.060900 -0.448000 -0.736000 0.496000
+-0.600000 -0.502100 0.110700 -0.280000 -0.792000 0.528000
+-0.640700 -0.502100 0.060900 -0.496000 -0.728000 0.456000
+-0.600000 -0.495400 0.121900 -0.392000 -0.720000 0.560000
+-0.650000 -0.495900 0.060900 -0.528000 -0.720000 0.432000
+-0.650000 -0.463300 0.121900 -0.512000 -0.696000 0.496000
+-0.700000 -0.453200 0.060900 -0.560000 -0.720000 0.392000
+-0.664200 -0.451900 0.121900 -0.552000 -0.696000 0.448000
+-0.700000 -0.451900 0.063700 -0.672000 -0.600000 0.424000
+-0.700000 -0.404000 0.121900 -0.624000 -0.536000 0.560000
+-0.701000 -0.451900 0.060900 -0.792000 -0.480000 0.344000
+-0.701700 -0.401700 0.121900 -0.704000 -0.408000 0.568000
+-0.731300 -0.401700 0.060900 -0.784000 -0.496000 0.344000
+-0.739400 -0.351500 0.121900 -0.528000 -0.576000 0.616000
+-0.750000 -0.377100 0.060900 -0.760000 -0.552000 0.320000
+-0.750000 -0.351500 0.110100 -0.600000 -0.584000 0.536000
+-0.767900 -0.351500 0.060900 -0.760000 -0.568000 0.296000
+-0.767900 -0.351500 0.060900 -0.760000 -0.568000 0.296000
+-0.750000 -0.301200 0.168400 -0.360000 -0.432000 0.816000
+-0.750000 -0.301200 0.168400 -0.360000 -0.432000 0.816000
+-0.700000 -0.301200 0.175400 -0.248000 -0.280000 0.920000
+-0.750000 -0.342500 0.121900 -0.536000 -0.592000 0.592000
+-0.700000 -0.351500 0.155000 -0.664000 -0.344000 0.656000
+-0.739400 -0.351500 0.121900 -0.528000 -0.576000 0.616000
+-0.700000 -0.401700 0.124500 -0.664000 -0.408000 0.616000
+-0.701700 -0.401700 0.121900 -0.704000 -0.408000 0.568000
+-0.700000 -0.404000 0.121900 -0.624000 -0.536000 0.560000
+-0.700000 -0.401700 0.124500 -0.664000 -0.408000 0.616000
+-0.664200 -0.451900 0.121900 -0.552000 -0.696000 0.448000
+-0.650000 -0.401700 0.178700 -0.552000 -0.344000 0.752000
+-0.650000 -0.451900 0.140100 -0.528000 -0.568000 0.624000
+-0.664200 -0.451900 0.121900 -0.552000 -0.696000 0.448000
+-0.650000 -0.463300 0.121900 -0.512000 -0.696000 0.496000
+-0.650000 -0.451900 0.140100 -0.528000 -0.568000 0.624000
+-0.600000 -0.495400 0.121900 -0.392000 -0.720000 0.560000
+-0.600000 -0.451900 0.179400 -0.216000 -0.496000 0.832000
+-0.600000 -0.451900 0.179400 -0.216000 -0.496000 0.832000
+-0.700000 -0.062200 0.121900 0.504000 0.344000 0.784000
+-0.700000 -0.062200 0.121900 0.504000 0.344000 0.784000
+-0.677900 -0.100400 0.121900 0.528000 0.328000 0.776000
+-0.700000 -0.100400 0.138900 0.488000 0.288000 0.816000
+-0.650000 -0.141800 0.121900 0.432000 0.328000 0.832000
+-0.700000 -0.150600 0.164200 0.408000 0.248000 0.872000
+-0.650000 -0.150600 0.126000 0.408000 0.336000 0.840000
+-0.700000 -0.200800 0.182200 0.152000 0.072000 0.984000
+-0.650000 -0.200800 0.153500 0.376000 0.280000 0.872000
+-0.650000 -0.150600 0.126000 0.408000 0.336000 0.840000
+-0.600000 -0.200800 0.130000 0.152000 0.560000 0.808000
+-0.642900 -0.150600 0.121900 0.408000 0.352000 0.832000
+-0.600000 -0.190600 0.121900 0.296000 0.496000 0.808000
+-0.600000 -0.150600 0.080700 0.576000 0.424000 0.688000
+-0.559300 -0.200800 0.121900 0.160000 0.720000 0.672000
+-0.575700 -0.150600 0.060900 0.384000 0.664000 0.632000
+-0.550000 -0.200800 0.118700 0.032000 0.784000 0.608000
+-0.550000 -0.166800 0.060900 0.264000 0.816000 0.504000
+-0.575700 -0.150600 0.060900 0.384000 0.664000 0.632000
+-0.550000 -0.150600 0.029600 0.504000 0.688000 0.512000
+-0.600000 -0.122400 0.060900 0.616000 0.400000 0.664000
+-0.550000 -0.125000 0.000000 0.608000 0.616000 0.488000
+-0.600000 -0.100400 0.044600 0.672000 0.336000 0.656000
+-0.565600 -0.100400 0.000000 0.744000 0.440000 0.496000
+-0.550000 -0.125000 0.000000 0.608000 0.616000 0.488000
+-0.550000 -0.100400 -0.036900 0.792000 0.376000 0.464000
+-0.550000 -0.100400 -0.036900 0.792000 0.376000 0.464000
+-0.650000 -0.150600 0.126000 0.408000 0.336000 0.840000
+-0.650000 -0.150600 0.126000 0.408000 0.336000 0.840000
+-0.650000 -0.141800 0.121900 0.432000 0.328000 0.832000
+-0.642900 -0.150600 0.121900 0.408000 0.352000 0.832000
+-0.650000 -0.100400 0.096100 0.592000 0.288000 0.744000
+-0.600000 -0.150600 0.080700 0.576000 0.424000 0.688000
+-0.612900 -0.100400 0.060900 0.624000 0.376000 0.672000
+-0.600000 -0.122400 0.060900 0.616000 0.400000 0.664000
+-0.600000 -0.100400 0.044600 0.672000 0.336000 0.656000
+-0.600000 -0.100400 0.044600 0.672000 0.336000 0.656000
+-0.600000 -0.190600 0.121900 0.296000 0.496000 0.808000
+-0.600000 -0.190600 0.121900 0.296000 0.496000 0.808000
+-0.559300 -0.200800 0.121900 0.160000 0.720000 0.672000
+-0.600000 -0.200800 0.130000 0.152000 0.560000 0.808000
+-0.550000 -0.202900 0.121900 0.032000 0.728000 0.680000
+-0.600000 -0.251000 0.177800 0.080000 0.520000 0.840000
+-0.550000 -0.251000 0.173600 -0.016000 0.472000 0.872000
+-0.550000 -0.251000 0.173600 -0.016000 0.472000 0.872000
+-0.500000 -0.200800 0.127000 -0.088000 0.600000 0.784000
+-0.500000 -0.200800 0.127000 -0.088000 0.600000 0.784000
+-0.450000 -0.200800 0.150000 -0.304000 0.608000 0.720000
+-0.500000 -0.196200 0.121900 -0.112000 0.784000 0.600000
+-0.450000 -0.173700 0.121900 -0.368000 0.648000 0.656000
+-0.500000 -0.166600 0.060900 -0.304000 0.832000 0.448000
+-0.450000 -0.150600 0.089400 -0.440000 0.744000 0.496000
+-0.472400 -0.150600 0.060900 -0.464000 0.768000 0.416000
+-0.450000 -0.136300 0.060900 -0.512000 0.720000 0.448000
+-0.500000 -0.150600 0.019400 -0.216000 0.856000 0.464000
+-0.450000 -0.112700 0.000000 -0.520000 0.784000 0.320000
+-0.500000 -0.141000 0.000000 -0.040000 0.880000 0.456000
+-0.500000 -0.141000 0.000000 -0.040000 0.880000 0.456000
+-0.500000 -0.200800 0.127000 -0.088000 0.600000 0.784000
+-0.500000 -0.200800 0.127000 -0.088000 0.600000 0.784000
+-0.500000 -0.249000 0.182900 -0.112000 0.656000 0.744000
+-0.450000 -0.200800 0.150000 -0.304000 0.608000 0.720000
+-0.450000 -0.233700 0.182900 -0.216000 0.472000 0.848000
+-0.400000 -0.200800 0.179200 -0.200000 0.464000 0.856000
+-0.400000 -0.206800 0.182900 -0.168000 0.424000 0.880000
+-0.383500 -0.200800 0.182900 -0.152000 0.448000 0.872000
+-0.400000 -0.200800 0.179200 -0.200000 0.464000 0.856000
+-0.350000 -0.189600 0.182900 -0.288000 0.472000 0.824000
+-0.400000 -0.150600 0.133500 -0.392000 0.600000 0.688000
+-0.350000 -0.150600 0.151300 -0.584000 0.352000 0.720000
+-0.350000 -0.189600 0.182900 -0.288000 0.472000 0.824000
+-0.311100 -0.150600 0.182900 -0.424000 0.464000 0.768000
+-0.311100 -0.150600 0.182900 -0.424000 0.464000 0.768000
+-0.400000 -0.200800 0.179200 -0.200000 0.464000 0.856000
+-0.400000 -0.200800 0.179200 -0.200000 0.464000 0.856000
+-0.450000 -0.200800 0.150000 -0.304000 0.608000 0.720000
+-0.400000 -0.150600 0.133500 -0.392000 0.600000 0.688000
+-0.450000 -0.173700 0.121900 -0.368000 0.648000 0.656000
+-0.414900 -0.150600 0.121900 -0.424000 0.616000 0.648000
+-0.450000 -0.150600 0.089400 -0.440000 0.744000 0.496000
+-0.450000 -0.150600 0.089400 -0.440000 0.744000 0.496000
+-0.351400 -0.100400 0.121900 -0.608000 0.368000 0.696000
+-0.351400 -0.100400 0.121900 -0.608000 0.368000 0.696000
+-0.350000 -0.097900 0.121900 -0.560000 0.424000 0.704000
+-0.350000 -0.100400 0.123500 -0.608000 0.328000 0.712000
+-0.300000 -0.066800 0.121900 -0.280000 0.584000 0.752000
+-0.300000 -0.100400 0.149000 -0.304000 0.432000 0.840000
+-0.255700 -0.050200 0.121900 -0.192000 0.512000 0.832000
+-0.250000 -0.100400 0.155000 0.480000 0.160000 0.856000
+-0.250000 -0.050200 0.123600 0.200000 0.440000 0.864000
+-0.250000 -0.050200 0.123600 0.200000 0.440000 0.864000
+-0.369700 -0.301200 0.182900 0.552000 -0.328000 0.752000
+-0.369700 -0.301200 0.182900 0.552000 -0.328000 0.752000
+-0.350000 -0.276800 0.182900 0.600000 -0.432000 0.664000
+-0.350000 -0.301200 0.167500 0.592000 -0.368000 0.712000
+-0.350000 -0.301200 0.167500 0.592000 -0.368000 0.712000
+-0.334800 -0.251000 0.182900 0.672000 -0.480000 0.552000
+-0.334800 -0.251000 0.182900 0.672000 -0.480000 0.552000
+-0.300000 -0.205800 0.182900 0.768000 -0.472000 0.416000
+-0.300000 -0.251000 0.131000 0.632000 -0.616000 0.464000
+-0.300000 -0.251000 0.131000 0.632000 -0.616000 0.464000
+-0.300000 -0.251000 0.131000 0.632000 -0.616000 0.464000
+-0.300000 -0.251000 0.131000 0.632000 -0.616000 0.464000
+-0.294600 -0.251000 0.121900 0.616000 -0.600000 0.488000
+-0.300000 -0.256400 0.121900 0.624000 -0.624000 0.456000
+-0.300000 -0.256400 0.121900 0.624000 -0.624000 0.456000
+0.550000 0.331800 0.121900 -0.696000 0.536000 0.456000
+0.550000 0.331800 0.121900 -0.696000 0.536000 0.456000
+0.550000 0.301200 0.149100 -0.896000 -0.096000 0.416000
+0.538800 0.301200 0.121900 -0.912000 0.128000 0.376000
+0.538800 0.301200 0.121900 -0.912000 0.128000 0.376000
+0.548800 0.251000 0.121900 -0.912000 -0.176000 0.360000
+0.548800 0.251000 0.121900 -0.912000 -0.176000 0.360000
+0.550000 0.251000 0.125100 -0.872000 -0.184000 0.440000
+0.550000 0.246100 0.121900 -0.904000 -0.224000 0.352000
+0.586200 0.251000 0.182900 -0.672000 -0.144000 0.720000
+0.567500 0.200800 0.121900 -0.784000 -0.344000 0.504000
+0.600000 0.211800 0.182900 -0.672000 -0.280000 0.672000
+0.600000 0.200800 0.176700 -0.712000 -0.296000 0.624000
+0.604600 0.200800 0.182900 -0.672000 -0.288000 0.664000
+0.600000 0.150600 0.141200 -0.712000 -0.440000 0.536000
+0.641000 0.150600 0.182900 -0.528000 -0.464000 0.696000
+0.600000 0.134700 0.121900 -0.776000 -0.456000 0.424000
+0.650000 0.141000 0.182900 -0.512000 -0.488000 0.704000
+0.627900 0.100400 0.121900 -0.608000 -0.608000 0.504000
+0.650000 0.100400 0.150000 -0.536000 -0.592000 0.592000
+0.650000 0.080100 0.121900 -0.576000 -0.640000 0.496000
+0.685300 0.100400 0.182900 -0.504000 -0.560000 0.648000
+0.692100 0.050200 0.121900 -0.432000 -0.784000 0.424000
+0.700000 0.088000 0.182900 -0.464000 -0.608000 0.640000
+0.700000 0.050200 0.131500 -0.112000 -0.824000 0.544000
+0.750000 0.062100 0.182900 -0.416000 -0.632000 0.648000
+0.744700 0.050200 0.121900 0.096000 -0.864000 0.480000
+0.750000 0.050900 0.121900 0.096000 -0.792000 0.600000
+0.750000 0.050200 0.120200 -0.160000 -0.904000 0.376000
+0.751700 0.050200 0.121900 -0.392000 -0.816000 0.416000
+0.750000 0.031700 0.060900 -0.136000 -0.928000 0.336000
+0.800000 0.028400 0.121900 -0.376000 -0.808000 0.432000
+0.798100 0.000000 0.060900 -0.504000 -0.792000 0.312000
+0.800000 0.000000 0.064400 -0.576000 -0.736000 0.344000
+0.800000 -0.001000 0.060900 -0.584000 -0.776000 0.216000
+0.829700 0.000000 0.121900 -0.704000 -0.616000 0.344000
+0.843600 -0.050200 0.060900 -0.704000 -0.672000 0.184000
+0.850000 -0.029600 0.121900 -0.840000 -0.432000 0.312000
+0.850000 -0.050200 0.089500 -0.768000 -0.592000 0.216000
+0.857500 -0.050200 0.121900 -0.848000 -0.448000 0.272000
+0.850000 -0.056700 0.060900 -0.720000 -0.664000 0.176000
+0.892500 -0.100400 0.121900 -0.688000 -0.680000 0.240000
+0.881900 -0.100400 0.060900 -0.752000 -0.632000 0.152000
+0.850000 -0.056700 0.060900 -0.720000 -0.664000 0.176000
+0.873300 -0.100400 0.000000 -0.752000 -0.632000 0.120000
+0.850000 -0.068700 0.000000 -0.752000 -0.640000 0.136000
+0.865600 -0.100400 -0.060900 -0.776000 -0.616000 0.120000
+0.850000 -0.079400 -0.060900 -0.768000 -0.616000 0.120000
+0.858300 -0.100400 -0.121900 -0.792000 -0.600000 0.056000
+0.850000 -0.088400 -0.121900 -0.808000 -0.584000 0.016000
+0.858100 -0.100400 -0.182900 -0.824000 -0.552000 0.000000
+0.850000 -0.086900 -0.182900 -0.848000 -0.512000 -0.048000
+0.860900 -0.100400 -0.243900 -0.856000 -0.496000 -0.072000
+0.850000 -0.077200 -0.243900 -0.824000 -0.432000 -0.344000
+0.869700 -0.100400 -0.304800 -0.880000 -0.248000 -0.400000
+0.850000 -0.050200 -0.276700 -0.784000 -0.280000 -0.544000
+0.867300 -0.050200 -0.304800 -0.784000 -0.136000 -0.600000
+0.850000 0.000000 -0.279000 -0.536000 0.488000 -0.680000
+0.877300 0.000000 -0.304800 -0.592000 0.480000 -0.632000
+0.877300 0.000000 -0.304800 -0.592000 0.480000 -0.632000
+0.600000 0.150600 0.141200 -0.712000 -0.440000 0.536000
+0.600000 0.150600 0.141200 -0.712000 -0.440000 0.536000
+0.600000 0.200800 0.176700 -0.712000 -0.296000 0.624000
+0.591100 0.150600 0.121900 -0.792000 -0.400000 0.440000
+0.567500 0.200800 0.121900 -0.784000 -0.344000 0.504000
+0.560700 0.150600 0.060900 -0.704000 -0.368000 0.592000
+0.550000 0.200800 0.086900 -0.880000 -0.256000 0.392000
+0.550000 0.174700 0.060900 -0.744000 -0.320000 0.576000
+0.538800 0.200800 0.060900 -0.824000 -0.216000 0.520000
+0.550000 0.150600 0.048400 -0.632000 -0.416000 0.640000
+0.500000 0.200800 0.008600 -0.576000 -0.176000 0.792000
+0.510200 0.150600 0.000000 -0.752000 -0.384000 0.520000
+0.500000 0.181600 0.000000 -0.600000 -0.304000 0.728000
+0.500000 0.150600 -0.020200 -0.704000 -0.472000 0.520000
+0.488800 0.200800 0.000000 -0.512000 0.024000 0.856000
+0.460500 0.150600 -0.060900 -0.624000 -0.512000 0.584000
+0.450000 0.200800 -0.035500 -0.536000 -0.264000 0.792000
+0.450000 0.163500 -0.060900 -0.600000 -0.504000 0.608000
+0.416500 0.200800 -0.060900 -0.560000 -0.352000 0.744000
+0.450000 0.150600 -0.075000 -0.616000 -0.488000 0.608000
+0.400000 0.200800 -0.077800 -0.600000 -0.432000 0.664000
+0.401900 0.150600 -0.121900 -0.864000 -0.496000 -0.024000
+0.400000 0.152400 -0.121900 -0.688000 -0.712000 -0.048000
+0.407800 0.150600 -0.182900 -0.544000 -0.240000 -0.800000
+0.400000 0.155900 -0.182900 -0.216000 -0.144000 -0.960000
+0.450000 0.150600 -0.187200 -0.088000 0.168000 -0.976000
+0.400000 0.200800 -0.189400 -0.152000 -0.072000 -0.984000
+0.450000 0.200800 -0.192400 -0.128000 -0.040000 -0.984000
+0.400000 0.251000 -0.186400 -0.152000 0.040000 -0.984000
+0.450000 0.251000 -0.188200 -0.104000 0.040000 -0.992000
+0.400000 0.301200 -0.184200 -0.016000 -0.016000 -0.992000
+0.450000 0.301200 -0.186200 0.000000 -0.016000 -0.992000
+0.400000 0.351500 -0.194500 0.000000 0.072000 -0.992000
+0.450000 0.351500 -0.196000 0.120000 0.128000 -0.976000
+0.400000 0.377300 -0.182900 0.016000 0.320000 -0.944000
+0.450000 0.373800 -0.182900 0.104000 0.432000 -0.888000
+0.400000 0.401700 -0.171200 0.088000 0.472000 -0.872000
+0.450000 0.401700 -0.160800 0.376000 0.656000 -0.640000
+0.400000 0.432800 -0.121900 0.160000 0.904000 -0.384000
+0.450000 0.422200 -0.121900 0.368000 0.832000 -0.392000
+0.400000 0.419800 -0.060900 0.080000 0.848000 0.520000
+0.450000 0.414500 -0.060900 0.192000 0.928000 0.304000
+0.400000 0.401700 -0.034800 -0.040000 0.584000 0.808000
+0.450000 0.401700 -0.038900 -0.120000 0.592000 0.784000
+0.400000 0.351500 -0.018700 -0.136000 -0.208000 0.960000
+0.450000 0.351500 -0.003200 -0.296000 0.344000 0.888000
+0.450000 0.401700 -0.038900 -0.120000 0.592000 0.784000
+0.458200 0.351500 0.000000 -0.280000 0.520000 0.800000
+0.500000 0.401700 -0.057700 0.096000 0.864000 0.480000
+0.500000 0.369100 0.000000 -0.184000 0.800000 0.552000
+0.517100 0.401700 -0.060900 0.080000 0.968000 0.224000
+0.550000 0.388900 0.000000 -0.392000 0.856000 0.320000
+0.550000 0.398000 -0.060900 0.000000 0.968000 -0.216000
+0.517100 0.401700 -0.060900 0.080000 0.968000 0.224000
+0.550000 0.362300 -0.121900 0.400000 0.656000 -0.632000
+0.500000 0.401700 -0.069300 0.168000 0.952000 -0.216000
+0.500000 0.393600 -0.121900 0.504000 0.744000 -0.432000
+0.488600 0.401700 -0.121900 0.504000 0.776000 -0.368000
+0.500000 0.355500 -0.182900 0.400000 0.616000 -0.664000
+0.450000 0.401700 -0.160800 0.376000 0.656000 -0.640000
+0.450000 0.373800 -0.182900 0.104000 0.432000 -0.888000
+0.500000 0.355500 -0.182900 0.400000 0.616000 -0.664000
+0.450000 0.351500 -0.196000 0.120000 0.128000 -0.976000
+0.500000 0.351500 -0.187300 0.416000 0.568000 -0.696000
+0.450000 0.301200 -0.186200 0.000000 -0.016000 -0.992000
+0.500000 0.301200 -0.193500 0.168000 0.072000 -0.976000
+0.450000 0.251000 -0.188200 -0.104000 0.040000 -0.992000
+0.500000 0.251000 -0.199400 0.072000 0.096000 -0.984000
+0.450000 0.200800 -0.192400 -0.128000 -0.040000 -0.984000
+0.500000 0.200800 -0.200200 -0.104000 -0.048000 -0.992000
+0.450000 0.150600 -0.187200 -0.088000 0.168000 -0.976000
+0.500000 0.150600 -0.194400 -0.208000 0.240000 -0.944000
+0.450000 0.100400 -0.233000 -0.008000 0.816000 -0.568000
+0.500000 0.100400 -0.210700 0.048000 0.704000 -0.704000
+0.450000 0.095300 -0.243900 -0.008000 0.856000 -0.512000
+0.500000 0.082500 -0.243900 0.216000 0.832000 -0.504000
+0.450000 0.055500 -0.304800 0.064000 0.864000 -0.496000
+0.500000 0.050200 -0.303800 0.264000 0.816000 -0.504000
+0.496000 0.050200 -0.304800 0.104000 0.800000 -0.576000
+0.500000 0.049600 -0.304800 0.264000 0.736000 -0.616000
+0.450000 0.050200 -0.314200 0.064000 0.744000 -0.656000
+0.500000 0.014000 -0.365800 0.216000 0.784000 -0.568000
+0.450000 0.007700 -0.365800 -0.264000 0.744000 -0.600000
+0.500000 0.000000 -0.393700 0.528000 0.072000 -0.840000
+0.450000 0.000000 -0.377000 -0.360000 0.400000 -0.840000
+0.500000 -0.027200 -0.365800 0.264000 -0.576000 -0.768000
+0.450000 -0.014200 -0.365800 -0.336000 -0.568000 -0.744000
+0.500000 -0.050200 -0.339600 -0.136000 -0.672000 -0.720000
+0.450000 -0.050200 -0.325200 -0.120000 -0.568000 -0.808000
+0.450000 -0.014200 -0.365800 -0.336000 -0.568000 -0.744000
+0.400000 -0.050200 -0.360800 0.184000 -0.432000 -0.872000
+0.431500 0.000000 -0.365800 -0.424000 0.312000 -0.840000
+0.400000 0.000000 -0.343200 -0.216000 0.592000 -0.768000
+0.450000 0.007700 -0.365800 -0.264000 0.744000 -0.600000
+0.400000 0.041200 -0.304800 -0.352000 0.672000 -0.648000
+0.450000 0.050200 -0.314200 0.064000 0.744000 -0.656000
+0.419200 0.050200 -0.304800 -0.224000 0.736000 -0.632000
+0.450000 0.055500 -0.304800 0.064000 0.864000 -0.496000
+0.400000 0.050200 -0.294000 -0.352000 0.672000 -0.640000
+0.450000 0.095300 -0.243900 -0.008000 0.856000 -0.512000
+0.400000 0.083700 -0.243900 -0.328000 0.768000 -0.536000
+0.450000 0.100400 -0.233000 -0.008000 0.816000 -0.568000
+0.400000 0.100400 -0.207800 -0.424000 0.688000 -0.576000
+0.450000 0.150600 -0.187200 -0.088000 0.168000 -0.976000
+0.400000 0.146600 -0.182900 -0.440000 0.464000 -0.760000
+0.407800 0.150600 -0.182900 -0.544000 -0.240000 -0.800000
+0.400000 0.100400 -0.150800 -0.768000 0.376000 0.512000
+0.401900 0.150600 -0.121900 -0.864000 -0.496000 -0.024000
+0.415000 0.100400 -0.121900 -0.640000 0.192000 0.736000
+0.450000 0.150600 -0.075000 -0.616000 -0.488000 0.608000
+0.450000 0.100400 -0.090700 -0.384000 -0.320000 0.856000
+0.460500 0.150600 -0.060900 -0.624000 -0.512000 0.584000
+0.500000 0.100400 -0.067100 -0.632000 -0.296000 0.704000
+0.500000 0.107000 -0.060900 -0.608000 -0.480000 0.616000
+0.504600 0.100400 -0.060900 -0.704000 -0.248000 0.656000
+0.500000 0.150600 -0.020200 -0.704000 -0.472000 0.520000
+0.550000 0.100400 -0.005700 -0.672000 -0.576000 0.448000
+0.510200 0.150600 0.000000 -0.752000 -0.384000 0.520000
+0.550000 0.104000 0.000000 -0.664000 -0.568000 0.464000
+0.550000 0.150600 0.048400 -0.632000 -0.416000 0.640000
+0.553100 0.100400 0.000000 -0.664000 -0.576000 0.464000
+0.560700 0.150600 0.060900 -0.704000 -0.368000 0.592000
+0.593200 0.100400 0.060900 -0.640000 -0.584000 0.496000
+0.591100 0.150600 0.121900 -0.792000 -0.400000 0.440000
+0.600000 0.100400 0.071800 -0.648000 -0.592000 0.472000
+0.600000 0.134700 0.121900 -0.776000 -0.456000 0.424000
+0.627900 0.100400 0.121900 -0.608000 -0.608000 0.504000
+0.600000 0.100400 0.071800 -0.648000 -0.592000 0.472000
+0.650000 0.080100 0.121900 -0.576000 -0.640000 0.496000
+0.600000 0.093600 0.060900 -0.624000 -0.616000 0.464000
+0.650000 0.050200 0.073400 -0.576000 -0.624000 0.512000
+0.641200 0.050200 0.060900 -0.600000 -0.608000 0.512000
+0.650000 0.041800 0.060900 -0.568000 -0.648000 0.504000
+0.602900 0.050200 0.000000 -0.576000 -0.704000 0.400000
+0.650000 0.013100 0.000000 -0.448000 -0.792000 0.392000
+0.600000 0.050200 -0.005300 -0.440000 -0.752000 0.480000
+0.650000 0.000000 -0.040500 0.104000 -0.944000 0.296000
+0.600000 0.000000 -0.044900 -0.016000 -0.720000 0.688000
+0.650000 -0.010200 -0.060900 0.168000 -0.784000 0.592000
+0.600000 -0.012300 -0.060900 0.104000 -0.576000 0.800000
+0.650000 -0.033500 -0.121900 0.512000 -0.672000 0.520000
+0.600000 -0.050200 -0.088500 0.448000 -0.400000 0.792000
+0.638000 -0.050200 -0.121900 0.800000 -0.536000 0.256000
+0.600000 -0.100400 -0.077400 0.584000 0.048000 0.800000
+0.626600 -0.100400 -0.121900 0.848000 0.208000 0.472000
+0.638000 -0.050200 -0.121900 0.800000 -0.536000 0.256000
+0.638900 -0.100400 -0.182900 0.920000 0.368000 0.072000
+0.649100 -0.050200 -0.182900 0.816000 -0.544000 0.144000
+0.637300 -0.100400 -0.243900 0.848000 0.016000 -0.520000
+0.637200 -0.050200 -0.243900 0.840000 -0.080000 -0.528000
+0.604900 -0.100400 -0.304800 0.744000 -0.360000 -0.552000
+0.600000 -0.050200 -0.286000 0.712000 0.144000 -0.680000
+0.600000 -0.086300 -0.304800 0.440000 0.312000 -0.832000
+0.587300 -0.050200 -0.304800 0.688000 0.056000 -0.712000
+0.589400 -0.100400 -0.304800 -0.440000 -0.424000 -0.784000
+0.550000 -0.083700 -0.304800 0.088000 -0.736000 -0.664000
+0.550000 -0.100400 -0.280800 -0.008000 -0.528000 -0.840000
+0.500000 -0.082600 -0.304800 0.216000 -0.680000 -0.688000
+0.500000 -0.100400 -0.277800 0.560000 -0.104000 -0.816000
+0.475800 -0.100400 -0.304800 0.512000 -0.104000 -0.848000
+0.500000 -0.127100 -0.304800 0.480000 0.456000 -0.744000
+0.500000 -0.100400 -0.277800 0.560000 -0.104000 -0.816000
+0.523400 -0.150600 -0.304800 0.376000 0.592000 -0.704000
+0.550000 -0.100400 -0.280800 -0.008000 -0.528000 -0.840000
+0.550000 -0.150600 -0.287800 0.352000 0.528000 -0.768000
+0.589400 -0.100400 -0.304800 -0.440000 -0.424000 -0.784000
+0.600000 -0.150600 -0.265200 0.248000 0.032000 -0.960000
+0.600000 -0.105700 -0.304800 0.312000 -0.728000 -0.600000
+0.650000 -0.150600 -0.274900 0.544000 0.464000 -0.688000
+0.604900 -0.100400 -0.304800 0.744000 -0.360000 -0.552000
+0.650000 -0.120200 -0.243900 0.704000 0.520000 -0.472000
+0.637300 -0.100400 -0.243900 0.848000 0.016000 -0.520000
+0.650000 -0.117900 -0.182900 0.792000 0.600000 0.024000
+0.638900 -0.100400 -0.182900 0.920000 0.368000 0.072000
+0.650000 -0.146100 -0.121900 0.720000 0.504000 0.464000
+0.626600 -0.100400 -0.121900 0.848000 0.208000 0.472000
+0.626600 -0.100400 -0.121900 0.848000 0.208000 0.472000
+0.591100 0.150600 0.121900 -0.792000 -0.400000 0.440000
+0.591100 0.150600 0.121900 -0.792000 -0.400000 0.440000
+0.600000 0.150600 0.141200 -0.712000 -0.440000 0.536000
+0.600000 0.134700 0.121900 -0.776000 -0.456000 0.424000
+0.600000 0.134700 0.121900 -0.776000 -0.456000 0.424000
+0.650000 0.141000 0.182900 -0.512000 -0.488000 0.704000
+0.650000 0.141000 0.182900 -0.512000 -0.488000 0.704000
+0.685300 0.100400 0.182900 -0.504000 -0.560000 0.648000
+0.650000 0.100400 0.150000 -0.536000 -0.592000 0.592000
+0.650000 0.100400 0.150000 -0.536000 -0.592000 0.592000
+0.692100 0.050200 0.121900 -0.432000 -0.784000 0.424000
+0.692100 0.050200 0.121900 -0.432000 -0.784000 0.424000
+0.700000 0.050200 0.131500 -0.112000 -0.824000 0.544000
+0.700000 0.046100 0.121900 -0.152000 -0.904000 0.376000
+0.744700 0.050200 0.121900 0.096000 -0.864000 0.480000
+0.700000 0.026800 0.060900 -0.288000 -0.896000 0.328000
+0.750000 0.050200 0.120200 -0.160000 -0.904000 0.376000
+0.750000 0.031700 0.060900 -0.136000 -0.928000 0.336000
+0.700000 0.026800 0.060900 -0.288000 -0.896000 0.328000
+0.750000 0.013300 0.000000 -0.240000 -0.936000 0.240000
+0.700000 0.012000 0.000000 -0.032000 -0.960000 0.272000
+0.750000 0.001600 -0.060900 -0.416000 -0.904000 -0.016000
+0.700000 0.001400 -0.060900 0.088000 -0.968000 0.192000
+0.750000 0.004300 -0.121900 -0.408000 -0.880000 -0.216000
+0.700000 0.000400 -0.121900 0.224000 -0.968000 0.032000
+0.750000 0.019900 -0.182900 -0.176000 -0.792000 -0.576000
+0.700000 0.009000 -0.182900 0.456000 -0.744000 -0.472000
+0.750000 0.050200 -0.223600 -0.168000 -0.552000 -0.808000
+0.700000 0.050200 -0.225700 0.368000 -0.368000 -0.848000
+0.750000 0.100400 -0.218500 0.200000 0.232000 -0.944000
+0.700000 0.100400 -0.234000 0.272000 0.000000 -0.960000
+0.750000 0.150600 -0.191500 0.256000 0.656000 -0.704000
+0.700000 0.150600 -0.210500 0.296000 0.424000 -0.848000
+0.750000 0.157000 -0.182900 0.280000 0.720000 -0.624000
+0.700000 0.190400 -0.182900 0.432000 0.560000 -0.696000
+0.750000 0.186400 -0.121900 0.504000 0.648000 -0.560000
+0.700000 0.200800 -0.171600 0.480000 0.608000 -0.616000
+0.734900 0.200800 -0.121900 0.552000 0.608000 -0.552000
+0.700000 0.229200 -0.121900 0.528000 0.656000 -0.528000
+0.750000 0.200800 -0.104400 0.480000 0.680000 -0.544000
+0.700000 0.251000 -0.093200 0.552000 0.600000 -0.568000
+0.750000 0.228900 -0.060900 0.576000 0.696000 -0.416000
+0.725300 0.251000 -0.060900 0.696000 0.648000 -0.288000
+0.750000 0.219200 0.000000 0.672000 0.728000 0.080000
+0.721000 0.251000 0.000000 0.784000 0.608000 -0.040000
+0.750000 0.222200 0.060900 0.704000 0.696000 -0.080000
+0.727500 0.251000 0.060900 0.792000 0.584000 -0.112000
+0.750000 0.233400 0.121900 0.720000 0.680000 -0.080000
+0.736800 0.251000 0.121900 0.752000 0.632000 0.144000
+0.727500 0.251000 0.060900 0.792000 0.584000 -0.112000
+0.700000 0.297800 0.121900 0.728000 0.680000 -0.032000
+0.700000 0.290800 0.060900 0.800000 0.576000 -0.104000
+0.696500 0.301200 0.121900 0.712000 0.672000 0.168000
+0.692400 0.301200 0.060900 0.752000 0.648000 -0.056000
+0.653800 0.351500 0.121900 0.656000 0.616000 0.424000
+0.663900 0.351500 0.060900 0.768000 0.624000 0.096000
+0.650000 0.355500 0.121900 0.632000 0.632000 0.432000
+0.650000 0.370100 0.060900 0.776000 0.624000 0.048000
+0.600000 0.382600 0.121900 0.272000 0.776000 0.560000
+0.612200 0.401700 0.060900 0.488000 0.832000 0.224000
+0.600000 0.401700 0.085900 0.096000 0.928000 0.336000
+0.600000 0.407100 0.060900 0.120000 0.968000 0.184000
+0.584600 0.401700 0.060900 -0.416000 0.872000 0.248000
+0.600000 0.410900 0.000000 0.104000 0.992000 -0.032000
+0.568400 0.401700 0.000000 -0.472000 0.832000 -0.264000
+0.600000 0.401700 -0.057700 0.168000 0.920000 -0.344000
+0.600000 0.410900 0.000000 0.104000 0.992000 -0.032000
+0.616700 0.401700 0.000000 0.496000 0.864000 -0.032000
+0.600000 0.407100 0.060900 0.120000 0.968000 0.184000
+0.612200 0.401700 0.060900 0.488000 0.832000 0.224000
+0.616700 0.401700 0.000000 0.496000 0.864000 -0.032000
+0.650000 0.370100 0.060900 0.776000 0.624000 0.048000
+0.650000 0.368200 0.000000 0.792000 0.584000 -0.144000
+0.663900 0.351500 0.060900 0.768000 0.624000 0.096000
+0.660900 0.351500 0.000000 0.832000 0.512000 -0.176000
+0.692400 0.301200 0.060900 0.752000 0.648000 -0.056000
+0.685300 0.301200 0.000000 0.832000 0.536000 -0.104000
+0.700000 0.290800 0.060900 0.800000 0.576000 -0.104000
+0.700000 0.279600 0.000000 0.792000 0.600000 -0.048000
+0.727500 0.251000 0.060900 0.792000 0.584000 -0.112000
+0.721000 0.251000 0.000000 0.784000 0.608000 -0.040000
+0.700000 0.279600 0.000000 0.792000 0.600000 -0.048000
+0.725300 0.251000 -0.060900 0.696000 0.648000 -0.288000
+0.700000 0.278700 -0.060900 0.648000 0.584000 -0.472000
+0.700000 0.251000 -0.093200 0.552000 0.600000 -0.568000
+0.680100 0.301200 -0.060900 0.752000 0.544000 -0.368000
+0.673000 0.251000 -0.121900 0.568000 0.576000 -0.584000
+0.650000 0.301200 -0.100800 0.528000 0.504000 -0.672000
+0.650000 0.278000 -0.121900 0.448000 0.624000 -0.624000
+0.608400 0.301200 -0.121900 0.448000 0.488000 -0.744000
+0.650000 0.251000 -0.154700 0.488000 0.640000 -0.584000
+0.600000 0.301200 -0.128700 0.472000 0.520000 -0.704000
+0.608400 0.251000 -0.182900 0.328000 0.488000 -0.800000
+0.600000 0.256700 -0.182900 0.328000 0.496000 -0.792000
+0.600000 0.251000 -0.187000 0.320000 0.456000 -0.816000
+0.608400 0.251000 -0.182900 0.328000 0.488000 -0.800000
+0.600000 0.200800 -0.209200 0.248000 0.288000 -0.920000
+0.650000 0.227800 -0.182900 0.368000 0.576000 -0.720000
+0.650000 0.200800 -0.204000 0.272000 0.408000 -0.864000
+0.687200 0.200800 -0.182900 0.432000 0.544000 -0.712000
+0.650000 0.150600 -0.219600 0.200000 0.280000 -0.928000
+0.700000 0.190400 -0.182900 0.432000 0.560000 -0.696000
+0.700000 0.150600 -0.210500 0.296000 0.424000 -0.848000
+0.650000 0.150600 -0.219600 0.200000 0.280000 -0.928000
+0.700000 0.100400 -0.234000 0.272000 0.000000 -0.960000
+0.650000 0.100400 -0.241400 0.232000 0.064000 -0.968000
+0.700000 0.050200 -0.225700 0.368000 -0.368000 -0.848000
+0.650000 0.067400 -0.243900 0.208000 0.056000 -0.968000
+0.653800 0.050200 -0.243900 0.232000 0.032000 -0.968000
+0.650000 0.050200 -0.244900 0.216000 0.040000 -0.968000
+0.653800 0.000000 -0.243900 0.576000 -0.112000 -0.808000
+0.650000 0.000000 -0.248500 0.680000 -0.160000 -0.712000
+0.650000 -0.016900 -0.243900 0.704000 -0.184000 -0.672000
+0.600000 0.000000 -0.284600 0.512000 0.112000 -0.840000
+0.637200 -0.050200 -0.243900 0.840000 -0.080000 -0.528000
+0.600000 -0.050200 -0.286000 0.712000 0.144000 -0.680000
+0.600000 0.000000 -0.284600 0.512000 0.112000 -0.840000
+0.587300 -0.050200 -0.304800 0.688000 0.056000 -0.712000
+0.578400 0.000000 -0.304800 0.536000 0.480000 -0.688000
+0.578400 0.000000 -0.304800 0.536000 0.480000 -0.688000
+0.750000 0.062100 0.182900 -0.416000 -0.632000 0.648000
+0.750000 0.062100 0.182900 -0.416000 -0.632000 0.648000
+0.750000 0.050900 0.121900 0.096000 -0.792000 0.600000
+0.762700 0.050200 0.182900 -0.512000 -0.672000 0.520000
+0.751700 0.050200 0.121900 -0.392000 -0.816000 0.416000
+0.800000 0.035400 0.182900 -0.432000 -0.808000 0.384000
+0.800000 0.028400 0.121900 -0.376000 -0.808000 0.432000
+0.846600 0.000000 0.182900 -0.736000 -0.616000 0.264000
+0.829700 0.000000 0.121900 -0.704000 -0.616000 0.344000
+0.850000 -0.004200 0.182900 -0.720000 -0.616000 0.288000
+0.850000 -0.029600 0.121900 -0.840000 -0.432000 0.312000
+0.880500 -0.050200 0.182900 -0.744000 -0.528000 0.384000
+0.857500 -0.050200 0.121900 -0.848000 -0.448000 0.272000
+0.900000 -0.076800 0.182900 -0.504000 -0.624000 0.592000
+0.892500 -0.100400 0.121900 -0.688000 -0.680000 0.240000
+0.900000 -0.100400 0.145900 -0.608000 -0.728000 0.304000
+0.900000 -0.076800 0.182900 -0.504000 -0.624000 0.592000
+0.934300 -0.100400 0.182900 -0.392000 -0.752000 0.520000
+0.934300 -0.100400 0.182900 -0.392000 -0.752000 0.520000
+0.800000 0.150600 0.181400 0.520000 0.336000 0.776000
+0.800000 0.150600 0.181400 0.520000 0.336000 0.776000
+0.850000 0.150600 0.126500 0.640000 0.560000 0.512000
+0.800000 0.190400 0.121900 0.624000 0.752000 0.168000
+0.850000 0.151600 0.121900 0.680000 0.720000 0.080000
+0.800000 0.182100 0.060900 0.560000 0.824000 -0.024000
+0.850000 0.154700 0.060900 0.576000 0.800000 0.096000
+0.800000 0.184600 0.000000 0.464000 0.872000 0.120000
+0.850000 0.161100 0.000000 0.480000 0.856000 0.160000
+0.800000 0.194300 -0.060900 0.416000 0.824000 -0.360000
+0.850000 0.171300 -0.060900 0.448000 0.864000 -0.216000
+0.800000 0.164900 -0.121900 0.312000 0.800000 -0.504000
+0.850000 0.155600 -0.121900 0.432000 0.856000 -0.272000
+0.800000 0.150600 -0.164100 0.256000 0.800000 -0.528000
+0.850000 0.150600 -0.140900 0.432000 0.840000 -0.304000
+0.800000 0.138600 -0.182900 0.232000 0.712000 -0.656000
+0.850000 0.127100 -0.182900 0.192000 0.744000 -0.632000
+0.800000 0.100400 -0.216300 0.104000 0.416000 -0.896000
+0.850000 0.100400 -0.218500 0.128000 0.592000 -0.784000
+0.800000 0.050200 -0.233400 -0.176000 0.416000 -0.880000
+0.850000 0.050200 -0.237100 -0.376000 0.576000 -0.720000
+0.800000 0.000000 -0.217200 -0.656000 -0.464000 -0.584000
+0.850000 0.042400 -0.243900 -0.408000 0.528000 -0.736000
+0.819700 0.000000 -0.243900 -0.752000 -0.192000 -0.616000
+0.850000 0.000000 -0.279000 -0.536000 0.488000 -0.680000
+0.835300 -0.050200 -0.243900 -0.840000 -0.416000 -0.336000
+0.850000 -0.050200 -0.276700 -0.784000 -0.280000 -0.544000
+0.850000 -0.077200 -0.243900 -0.824000 -0.432000 -0.344000
+0.835300 -0.050200 -0.243900 -0.840000 -0.416000 -0.336000
+0.850000 -0.086900 -0.182900 -0.848000 -0.512000 -0.048000
+0.822900 -0.050200 -0.182900 -0.792000 -0.592000 -0.088000
+0.850000 -0.088400 -0.121900 -0.808000 -0.584000 0.016000
+0.818400 -0.050200 -0.121900 -0.760000 -0.640000 0.016000
+0.850000 -0.079400 -0.060900 -0.768000 -0.616000 0.120000
+0.823600 -0.050200 -0.060900 -0.736000 -0.664000 0.112000
+0.850000 -0.068700 0.000000 -0.752000 -0.640000 0.136000
+0.832800 -0.050200 0.000000 -0.728000 -0.656000 0.144000
+0.850000 -0.056700 0.060900 -0.720000 -0.664000 0.176000
+0.843600 -0.050200 0.060900 -0.704000 -0.672000 0.184000
+0.850000 -0.050200 0.089500 -0.768000 -0.592000 0.216000
+0.850000 -0.050200 0.089500 -0.768000 -0.592000 0.216000
+0.850000 0.150600 0.126500 0.640000 0.560000 0.512000
+0.850000 0.150600 0.126500 0.640000 0.560000 0.512000
+0.850000 0.151600 0.121900 0.680000 0.720000 0.080000
+0.850900 0.150600 0.121900 0.704000 0.704000 0.080000
+0.850000 0.154700 0.060900 0.576000 0.800000 0.096000
+0.855400 0.150600 0.060900 0.680000 0.720000 0.072000
+0.850000 0.161100 0.000000 0.480000 0.856000 0.160000
+0.867700 0.150600 0.000000 0.552000 0.816000 0.152000
+0.850000 0.171300 -0.060900 0.448000 0.864000 -0.216000
+0.888500 0.150600 -0.060900 0.504000 0.856000 -0.040000
+0.850000 0.155600 -0.121900 0.432000 0.856000 -0.272000
+0.859300 0.150600 -0.121900 0.456000 0.840000 -0.272000
+0.850000 0.150600 -0.140900 0.432000 0.840000 -0.304000
+0.850000 0.150600 -0.140900 0.432000 0.840000 -0.304000
+0.891700 0.100400 0.182900 0.576000 0.688000 0.424000
+0.891700 0.100400 0.182900 0.576000 0.688000 0.424000
+0.900000 0.100400 0.165200 0.584000 0.744000 0.296000
+0.900000 0.093100 0.182900 0.568000 0.672000 0.464000
+0.911800 0.100400 0.121900 0.528000 0.800000 0.264000
+0.940200 0.050200 0.182900 0.624000 0.528000 0.568000
+0.950000 0.069700 0.121900 0.360000 0.840000 0.384000
+0.950000 0.050200 0.169400 0.600000 0.560000 0.560000
+1.000000 0.053600 0.121900 0.280000 0.872000 0.392000
+1.000000 0.050200 0.131000 0.336000 0.784000 0.512000
+0.950000 0.050200 0.169400 0.600000 0.560000 0.560000
+1.000000 0.004900 0.182900 0.336000 0.520000 0.776000
+0.950000 0.037400 0.182900 0.520000 0.504000 0.680000
+0.950000 0.050200 0.169400 0.600000 0.560000 0.560000
+0.940200 0.050200 0.182900 0.624000 0.528000 0.568000
+0.940200 0.050200 0.182900 0.624000 0.528000 0.568000
+0.900000 0.100400 0.165200 0.584000 0.744000 0.296000
+0.900000 0.100400 0.165200 0.584000 0.744000 0.296000
+0.900000 0.107300 0.121900 0.512000 0.832000 0.184000
+0.911800 0.100400 0.121900 0.528000 0.800000 0.264000
+0.900000 0.118900 0.060900 0.472000 0.856000 0.184000
+0.936800 0.100400 0.060900 0.456000 0.872000 0.168000
+0.900000 0.131100 0.000000 0.480000 0.848000 0.192000
+0.950000 0.100400 0.012800 0.496000 0.848000 0.136000
+0.950000 0.102000 0.000000 0.472000 0.864000 0.120000
+0.952900 0.100400 0.000000 0.504000 0.848000 0.120000
+0.950000 0.106300 -0.060900 0.576000 0.776000 -0.240000
+0.957800 0.100400 -0.060900 0.544000 0.824000 -0.120000
+0.950000 0.100400 -0.078300 0.560000 0.768000 -0.304000
+1.000000 0.074600 -0.060900 0.496000 0.816000 -0.280000
+0.950000 0.086300 -0.121900 0.544000 0.784000 -0.280000
+1.000000 0.056100 -0.121900 0.488000 0.808000 -0.304000
+0.950000 0.069900 -0.182900 0.544000 0.736000 -0.392000
+1.000000 0.050200 -0.141200 0.512000 0.792000 -0.320000
+0.978000 0.050200 -0.182900 0.512000 0.768000 -0.376000
+1.000000 0.035800 -0.182900 0.504000 0.768000 -0.376000
+0.950000 0.050200 -0.224500 0.472000 0.712000 -0.504000
+1.000000 0.004200 -0.243900 0.464000 0.680000 -0.552000
+0.950000 0.037500 -0.243900 0.432000 0.688000 -0.576000
+1.000000 0.000000 -0.249700 0.512000 0.464000 -0.720000
+0.950000 0.000000 -0.291100 0.424000 0.536000 -0.720000
+1.000000 -0.050200 -0.288900 0.520000 0.432000 -0.728000
+0.950000 -0.016600 -0.304800 0.448000 0.520000 -0.720000
+0.981700 -0.050200 -0.304800 0.528000 0.432000 -0.720000
+0.950000 -0.050200 -0.338500 0.440000 0.400000 -0.800000
+1.000000 -0.073100 -0.304800 0.536000 0.424000 -0.720000
+0.950000 -0.100400 -0.351000 0.336000 0.064000 -0.936000
+1.000000 -0.100400 -0.325200 0.488000 0.344000 -0.792000
+0.950000 -0.150600 -0.345500 -0.032000 0.064000 -0.992000
+1.000000 -0.150600 -0.335800 0.136000 0.136000 -0.976000
+0.950000 -0.200800 -0.357000 -0.272000 -0.104000 -0.952000
+1.000000 -0.200800 -0.338800 0.136000 -0.384000 -0.904000
+0.950000 -0.251000 -0.328200 -0.712000 -0.568000 -0.392000
+1.000000 -0.251000 -0.355700 -0.816000 -0.248000 -0.504000
+1.000000 -0.251000 -0.355700 -0.816000 -0.248000 -0.504000
+1.000000 -0.012000 0.182900 0.384000 -0.248000 0.880000
+1.000000 -0.012000 0.182900 0.384000 -0.248000 0.880000
+1.000000 -0.050200 0.168100 0.416000 -0.344000 0.832000
+0.975800 -0.050200 0.182900 0.464000 -0.232000 0.848000
+1.000000 -0.100400 0.134700 0.432000 -0.528000 0.720000
+0.959000 -0.100400 0.182900 0.616000 -0.584000 0.520000
+0.959000 -0.100400 0.182900 0.616000 -0.584000 0.520000
+-0.900000 0.200800 0.074800 0.296000 0.712000 0.624000
+-0.900000 0.200800 0.074800 0.296000 0.712000 0.624000
+-0.900000 0.210300 0.060900 0.312000 0.744000 0.576000
+-0.879600 0.200800 0.060900 0.352000 0.712000 0.600000
+-0.900000 0.240500 0.000000 0.368000 0.840000 0.376000
+-0.850000 0.200800 0.035600 0.384000 0.744000 0.536000
+-0.850000 0.219100 0.000000 0.368000 0.824000 0.424000
+-0.811000 0.200800 0.000000 0.408000 0.816000 0.392000
+-0.811000 0.200800 0.000000 0.408000 0.816000 0.392000
+-0.900000 -0.127600 0.121900 -0.608000 -0.704000 0.344000
+-0.900000 -0.127600 0.121900 -0.608000 -0.704000 0.344000
+-0.900000 -0.149700 0.060900 -0.696000 -0.664000 0.232000
+-0.878400 -0.150600 0.121900 -0.736000 -0.560000 0.368000
+-0.899200 -0.150600 0.060900 -0.816000 -0.504000 0.256000
+-0.851500 -0.200800 0.121900 -0.832000 -0.360000 0.408000
+-0.869300 -0.200800 0.060900 -0.824000 -0.496000 0.248000
+-0.899200 -0.150600 0.060900 -0.816000 -0.504000 0.256000
+-0.882700 -0.200800 0.000000 -0.840000 -0.496000 0.192000
+-0.900000 -0.150600 0.057700 -0.744000 -0.616000 0.232000
+-0.900000 -0.169600 0.000000 -0.800000 -0.552000 0.224000
+-0.882700 -0.200800 0.000000 -0.840000 -0.496000 0.192000
+-0.900000 -0.192500 -0.060900 -0.856000 -0.488000 0.144000
+-0.895700 -0.200800 -0.060900 -0.864000 -0.480000 0.136000
+-0.900000 -0.200800 -0.096200 -0.752000 -0.632000 0.128000
+-0.860100 -0.251000 -0.060900 -0.808000 -0.568000 0.112000
+-0.900000 -0.204500 -0.121900 -0.688000 -0.712000 0.104000
+-0.866600 -0.251000 -0.121900 -0.808000 -0.576000 0.072000
+-0.900000 -0.206900 -0.182900 -0.648000 -0.752000 0.056000
+-0.864200 -0.251000 -0.182900 -0.800000 -0.592000 0.000000
+-0.900000 -0.212400 -0.243900 -0.672000 -0.712000 0.176000
+-0.869200 -0.251000 -0.243900 -0.768000 -0.600000 0.200000
+-0.900000 -0.236500 -0.304800 -0.680000 -0.456000 -0.560000
+-0.891700 -0.251000 -0.304800 -0.808000 -0.512000 -0.264000
+-0.891700 -0.251000 -0.304800 -0.808000 -0.512000 -0.264000
+-0.850000 0.184100 0.060900 0.376000 0.632000 0.664000
+-0.850000 0.184100 0.060900 0.376000 0.632000 0.664000
+-0.850000 0.150600 0.098600 0.360000 0.600000 0.704000
+-0.800000 0.153700 0.060900 0.432000 0.632000 0.632000
+-0.800000 0.150600 0.064100 0.424000 0.560000 0.704000
+-0.796300 0.150600 0.060900 0.512000 0.584000 0.616000
+-0.800000 0.153700 0.060900 0.432000 0.632000 0.632000
+-0.750000 0.150600 0.014500 0.472000 0.624000 0.608000
+-0.800000 0.195100 0.000000 0.456000 0.768000 0.432000
+-0.750000 0.162200 0.000000 0.464000 0.672000 0.560000
+-0.750000 0.150600 0.014500 0.472000 0.624000 0.608000
+-0.734000 0.150600 0.000000 0.496000 0.640000 0.576000
+-0.750000 0.162200 0.000000 0.464000 0.672000 0.560000
+-0.700000 0.150600 -0.043600 0.552000 0.712000 0.424000
+-0.750000 0.191300 -0.060900 0.496000 0.856000 0.072000
+-0.700000 0.159000 -0.060900 0.600000 0.776000 0.184000
+-0.750000 0.174400 -0.121900 0.448000 0.824000 -0.336000
+-0.700000 0.150600 -0.089800 0.592000 0.744000 -0.280000
+-0.715000 0.150600 -0.121900 0.512000 0.744000 -0.408000
+-0.700000 0.140000 -0.121900 0.536000 0.728000 -0.408000
+-0.750000 0.150600 -0.159200 0.432000 0.664000 -0.600000
+-0.700000 0.100400 -0.182100 0.536000 0.592000 -0.592000
+-0.750000 0.132600 -0.182900 0.408000 0.656000 -0.624000
+-0.700900 0.100400 -0.182900 0.440000 0.608000 -0.648000
+-0.750000 0.100400 -0.222000 0.432000 0.576000 -0.680000
+-0.700000 0.099700 -0.182900 0.504000 0.560000 -0.640000
+-0.750000 0.077000 -0.243900 0.368000 0.552000 -0.744000
+-0.700000 0.050200 -0.235800 0.504000 0.432000 -0.744000
+-0.711800 0.050200 -0.243900 0.416000 0.432000 -0.792000
+-0.700000 0.037400 -0.243900 0.440000 0.392000 -0.800000
+-0.750000 0.050200 -0.267100 0.368000 0.432000 -0.816000
+-0.700000 0.000000 -0.262900 0.392000 0.288000 -0.864000
+-0.750000 0.000000 -0.285200 0.328000 0.160000 -0.920000
+-0.750000 0.000000 -0.285200 0.328000 0.160000 -0.920000
+-0.750000 0.012900 0.121900 0.496000 0.384000 0.768000
+-0.750000 0.012900 0.121900 0.496000 0.384000 0.768000
+-0.781300 0.050200 0.121900 0.536000 0.400000 0.736000
+-0.750000 0.050200 0.097600 0.464000 0.408000 0.776000
+-0.750000 0.050200 0.097600 0.464000 0.408000 0.776000
+-0.800000 -0.280700 0.121900 -0.736000 -0.528000 0.408000
+-0.800000 -0.280700 0.121900 -0.736000 -0.528000 0.408000
+-0.783300 -0.301200 0.121900 -0.688000 -0.568000 0.440000
+-0.800000 -0.301200 0.085900 -0.768000 -0.544000 0.304000
+-0.800000 -0.301200 0.085900 -0.768000 -0.544000 0.304000
+-0.750000 -0.342500 0.121900 -0.536000 -0.592000 0.592000
+-0.750000 -0.342500 0.121900 -0.536000 -0.592000 0.592000
+-0.739400 -0.351500 0.121900 -0.528000 -0.576000 0.616000
+-0.750000 -0.351500 0.110100 -0.600000 -0.584000 0.536000
+-0.750000 -0.351500 0.110100 -0.600000 -0.584000 0.536000
+-0.701000 -0.451900 0.060900 -0.792000 -0.480000 0.344000
+-0.701000 -0.451900 0.060900 -0.792000 -0.480000 0.344000
+-0.700000 -0.451900 0.063700 -0.672000 -0.600000 0.424000
+-0.700000 -0.453200 0.060900 -0.560000 -0.720000 0.392000
+-0.700000 -0.453200 0.060900 -0.560000 -0.720000 0.392000
+-0.650000 -0.141800 0.121900 0.432000 0.328000 0.832000
+-0.650000 -0.141800 0.121900 0.432000 0.328000 0.832000
+-0.677900 -0.100400 0.121900 0.528000 0.328000 0.776000
+-0.650000 -0.100400 0.096100 0.592000 0.288000 0.744000
+-0.650000 -0.100400 0.096100 0.592000 0.288000 0.744000
+-0.600000 -0.122400 0.060900 0.616000 0.400000 0.664000
+-0.600000 -0.122400 0.060900 0.616000 0.400000 0.664000
+-0.575700 -0.150600 0.060900 0.384000 0.664000 0.632000
+-0.600000 -0.150600 0.080700 0.576000 0.424000 0.688000
+-0.600000 -0.150600 0.080700 0.576000 0.424000 0.688000
+-0.559300 -0.200800 0.121900 0.160000 0.720000 0.672000
+-0.559300 -0.200800 0.121900 0.160000 0.720000 0.672000
+-0.550000 -0.200800 0.118700 0.032000 0.784000 0.608000
+-0.550000 -0.202900 0.121900 0.032000 0.728000 0.680000
+-0.536800 -0.200800 0.121900 -0.104000 0.736000 0.664000
+-0.536800 -0.200800 0.121900 -0.104000 0.736000 0.664000
+-0.550000 -0.494000 0.121900 0.024000 -0.832000 0.536000
+-0.550000 -0.494000 0.121900 0.024000 -0.832000 0.536000
+-0.550000 -0.502100 0.104800 0.104000 -0.840000 0.520000
+-0.500000 -0.486900 0.121900 0.296000 -0.800000 0.504000
+-0.500000 -0.502100 0.088800 0.616000 -0.688000 0.376000
+-0.450000 -0.453600 0.121900 0.584000 -0.744000 0.288000
+-0.489100 -0.502100 0.060900 0.704000 -0.616000 0.328000
+-0.450000 -0.471900 0.060900 0.592000 -0.752000 0.272000
+-0.450000 -0.471900 0.060900 0.592000 -0.752000 0.272000
+-0.550000 -0.502100 0.104800 0.104000 -0.840000 0.520000
+-0.550000 -0.502100 0.104800 0.104000 -0.840000 0.520000
+-0.550000 -0.532000 0.060900 0.080000 -0.776000 0.624000
+-0.500000 -0.502100 0.088800 0.616000 -0.688000 0.376000
+-0.500000 -0.517700 0.060900 0.632000 -0.632000 0.440000
+-0.489100 -0.502100 0.060900 0.704000 -0.616000 0.328000
+-0.489100 -0.502100 0.060900 0.704000 -0.616000 0.328000
+-0.405500 -0.100400 0.060900 -0.712000 0.456000 0.520000
+-0.405500 -0.100400 0.060900 -0.712000 0.456000 0.520000
+-0.400000 -0.090100 0.060900 -0.696000 0.400000 0.584000
+-0.400000 -0.100400 0.069600 -0.688000 0.456000 0.552000
+-0.367400 -0.050200 0.060900 -0.696000 0.408000 0.584000
+-0.351400 -0.100400 0.121900 -0.608000 0.368000 0.696000
+-0.350000 -0.050200 0.083200 -0.416000 0.344000 0.832000
+-0.350000 -0.097900 0.121900 -0.560000 0.424000 0.704000
+-0.300000 -0.050200 0.104800 -0.312000 0.512000 0.792000
+-0.300000 -0.066800 0.121900 -0.280000 0.584000 0.752000
+-0.255700 -0.050200 0.121900 -0.192000 0.512000 0.832000
+-0.255700 -0.050200 0.121900 -0.192000 0.512000 0.832000
+-0.350000 -0.001900 0.060900 -0.656000 0.280000 0.688000
+-0.350000 -0.001900 0.060900 -0.656000 0.280000 0.688000
+-0.350000 -0.050200 0.083200 -0.416000 0.344000 0.832000
+-0.367400 -0.050200 0.060900 -0.696000 0.408000 0.584000
+-0.367400 -0.050200 0.060900 -0.696000 0.408000 0.584000
+-0.351400 -0.100400 0.121900 -0.608000 0.368000 0.696000
+-0.351400 -0.100400 0.121900 -0.608000 0.368000 0.696000
+-0.400000 -0.140400 0.121900 -0.448000 0.624000 0.632000
+-0.400000 -0.100400 0.069600 -0.688000 0.456000 0.552000
+-0.400000 -0.100400 0.069600 -0.688000 0.456000 0.552000
+-0.400000 -0.401700 0.111300 0.640000 -0.680000 0.336000
+-0.400000 -0.401700 0.111300 0.640000 -0.680000 0.336000
+-0.400000 -0.423000 0.060900 0.616000 -0.696000 0.360000
+-0.350000 -0.401700 0.073400 0.632000 -0.688000 0.344000
+-0.350000 -0.406300 0.060900 0.592000 -0.728000 0.320000
+-0.344500 -0.401700 0.060900 0.632000 -0.688000 0.328000
+-0.344500 -0.401700 0.060900 0.632000 -0.688000 0.328000
+-0.348200 0.000000 0.060900 -0.376000 0.448000 0.800000
+-0.348200 0.000000 0.060900 -0.376000 0.448000 0.800000
+-0.300000 0.027200 0.060900 -0.160000 0.552000 0.808000
+-0.300000 0.000000 0.088800 -0.240000 0.432000 0.864000
+-0.250000 0.033500 0.060900 0.056000 0.528000 0.840000
+-0.250000 0.000000 0.079500 -0.144000 0.552000 0.816000
+-0.200000 0.020500 0.060900 0.664000 0.440000 0.600000
+-0.200000 0.000000 0.081400 0.696000 0.336000 0.624000
+-0.190300 0.000000 0.060900 0.816000 0.200000 0.536000
+-0.200000 -0.050200 0.072600 0.688000 0.360000 0.624000
+-0.193200 -0.050200 0.060900 0.808000 0.008000 0.584000
+-0.200000 -0.100400 0.076800 0.784000 -0.136000 0.600000
+-0.190200 -0.100400 0.060900 0.752000 -0.248000 0.600000
+-0.200000 -0.121800 0.060900 0.728000 -0.328000 0.592000
+-0.200000 -0.121800 0.060900 0.728000 -0.328000 0.592000
+-0.250000 0.000000 0.079500 -0.144000 0.552000 0.816000
+-0.250000 0.000000 0.079500 -0.144000 0.552000 0.816000
+-0.200000 0.000000 0.081400 0.696000 0.336000 0.624000
+-0.250000 -0.048000 0.121900 0.272000 0.640000 0.704000
+-0.200000 -0.050200 0.072600 0.688000 0.360000 0.624000
+-0.247100 -0.050200 0.121900 0.488000 0.512000 0.696000
+-0.200000 -0.100400 0.076800 0.784000 -0.136000 0.600000
+-0.230200 -0.100400 0.121900 0.776000 -0.176000 0.600000
+-0.230200 -0.100400 0.121900 0.776000 -0.176000 0.600000
+0.550000 0.351500 0.078000 -0.616000 0.672000 0.392000
+0.550000 0.351500 0.078000 -0.616000 0.672000 0.392000
+0.540600 0.351500 0.060900 -0.584000 0.632000 0.496000
+0.550000 0.359900 0.060900 -0.592000 0.640000 0.480000
+0.500000 0.351500 0.029100 -0.680000 0.048000 0.728000
+0.550000 0.388900 0.000000 -0.392000 0.856000 0.320000
+0.500000 0.369100 0.000000 -0.184000 0.800000 0.552000
+0.500000 0.351500 0.029100 -0.680000 0.048000 0.728000
+0.458200 0.351500 0.000000 -0.280000 0.520000 0.800000
+0.458200 0.351500 0.000000 -0.280000 0.520000 0.800000
+0.550000 0.246100 0.121900 -0.904000 -0.224000 0.352000
+0.550000 0.246100 0.121900 -0.904000 -0.224000 0.352000
+0.550000 0.200800 0.086900 -0.880000 -0.256000 0.392000
+0.548800 0.251000 0.121900 -0.912000 -0.176000 0.360000
+0.538800 0.200800 0.060900 -0.824000 -0.216000 0.520000
+0.533200 0.251000 0.060900 -0.856000 0.032000 0.512000
+0.500000 0.200800 0.008600 -0.576000 -0.176000 0.792000
+0.500800 0.251000 0.000000 -0.792000 -0.016000 0.608000
+0.500000 0.245700 0.000000 -0.568000 0.120000 0.808000
+0.500000 0.251000 -0.000900 -0.496000 0.112000 0.856000
+0.488800 0.200800 0.000000 -0.512000 0.024000 0.856000
+0.450000 0.251000 -0.039600 -0.400000 -0.080000 0.904000
+0.450000 0.200800 -0.035500 -0.536000 -0.264000 0.792000
+0.400000 0.251000 -0.058700 -0.328000 -0.176000 0.920000
+0.416500 0.200800 -0.060900 -0.560000 -0.352000 0.744000
+0.400000 0.242400 -0.060900 -0.352000 -0.192000 0.904000
+0.400000 0.200800 -0.077800 -0.600000 -0.432000 0.664000
+0.395100 0.251000 -0.060900 -0.344000 -0.184000 0.912000
+0.366500 0.200800 -0.121900 -0.760000 -0.624000 0.168000
+0.350000 0.251000 -0.088400 -0.448000 -0.320000 0.824000
+0.350000 0.218900 -0.121900 -0.504000 -0.816000 0.264000
+0.300000 0.251000 -0.114600 -0.168000 -0.536000 0.824000
+0.300000 0.236900 -0.121900 -0.304000 -0.688000 0.640000
+0.271900 0.251000 -0.121900 -0.240000 -0.760000 0.592000
+0.300000 0.251000 -0.156100 -0.368000 -0.808000 -0.448000
+0.300000 0.236900 -0.121900 -0.304000 -0.688000 0.640000
+0.321900 0.251000 -0.182900 -0.240000 -0.296000 -0.920000
+0.350000 0.218900 -0.121900 -0.504000 -0.816000 0.264000
+0.350000 0.236900 -0.182900 -0.272000 -0.424000 -0.856000
+0.366500 0.200800 -0.121900 -0.760000 -0.624000 0.168000
+0.380800 0.200800 -0.182900 -0.440000 -0.264000 -0.856000
+0.400000 0.152400 -0.121900 -0.688000 -0.712000 -0.048000
+0.400000 0.155900 -0.182900 -0.216000 -0.144000 -0.960000
+0.380800 0.200800 -0.182900 -0.440000 -0.264000 -0.856000
+0.400000 0.200800 -0.189400 -0.152000 -0.072000 -0.984000
+0.350000 0.236900 -0.182900 -0.272000 -0.424000 -0.856000
+0.400000 0.251000 -0.186400 -0.152000 0.040000 -0.984000
+0.350000 0.251000 -0.187300 -0.168000 -0.184000 -0.960000
+0.400000 0.301200 -0.184200 -0.016000 -0.016000 -0.992000
+0.350000 0.301200 -0.184400 -0.056000 0.000000 -0.992000
+0.400000 0.351500 -0.194500 0.000000 0.072000 -0.992000
+0.350000 0.351500 -0.192800 0.000000 0.056000 -0.992000
+0.400000 0.377300 -0.182900 0.016000 0.320000 -0.944000
+0.350000 0.377400 -0.182900 0.000000 0.280000 -0.952000
+0.400000 0.401700 -0.171200 0.088000 0.472000 -0.872000
+0.350000 0.401700 -0.174600 0.056000 0.440000 -0.888000
+0.400000 0.432800 -0.121900 0.160000 0.904000 -0.384000
+0.350000 0.445000 -0.121900 0.208000 0.960000 -0.152000
+0.400000 0.419800 -0.060900 0.080000 0.848000 0.520000
+0.350000 0.424300 -0.060900 0.120000 0.824000 0.544000
+0.400000 0.401700 -0.034800 -0.040000 0.584000 0.808000
+0.350000 0.401700 -0.031000 0.032000 0.488000 0.864000
+0.400000 0.351500 -0.018700 -0.136000 -0.208000 0.960000
+0.350000 0.351500 -0.021800 0.032000 -0.048000 0.992000
+0.350000 0.401700 -0.031000 0.032000 0.488000 0.864000
+0.300000 0.351500 -0.009100 -0.016000 -0.144000 0.984000
+0.300000 0.401700 -0.022200 0.096000 0.472000 0.864000
+0.350000 0.401700 -0.031000 0.032000 0.488000 0.864000
+0.300000 0.430700 -0.060900 0.128000 0.808000 0.568000
+0.350000 0.424300 -0.060900 0.120000 0.824000 0.544000
+0.300000 0.451900 -0.106900 0.184000 0.864000 0.456000
+0.350000 0.445000 -0.121900 0.208000 0.960000 -0.152000
+0.323400 0.451900 -0.121900 0.248000 0.944000 -0.200000
+0.350000 0.401700 -0.174600 0.056000 0.440000 -0.888000
+0.300000 0.451900 -0.131100 0.200000 0.712000 -0.664000
+0.300000 0.401700 -0.174800 0.040000 0.368000 -0.920000
+0.350000 0.401700 -0.174600 0.056000 0.440000 -0.888000
+0.300000 0.379400 -0.182900 -0.016000 0.272000 -0.960000
+0.350000 0.377400 -0.182900 0.000000 0.280000 -0.952000
+0.300000 0.351500 -0.193900 -0.008000 0.064000 -0.992000
+0.350000 0.351500 -0.192800 0.000000 0.056000 -0.992000
+0.300000 0.301200 -0.184400 -0.064000 -0.072000 -0.992000
+0.350000 0.301200 -0.184400 -0.056000 0.000000 -0.992000
+0.300000 0.284000 -0.182900 -0.168000 -0.184000 -0.960000
+0.350000 0.251000 -0.187300 -0.168000 -0.184000 -0.960000
+0.321900 0.251000 -0.182900 -0.240000 -0.296000 -0.920000
+0.350000 0.236900 -0.182900 -0.272000 -0.424000 -0.856000
+0.350000 0.236900 -0.182900 -0.272000 -0.424000 -0.856000
+0.550000 0.246100 0.121900 -0.904000 -0.224000 0.352000
+0.550000 0.246100 0.121900 -0.904000 -0.224000 0.352000
+0.567500 0.200800 0.121900 -0.784000 -0.344000 0.504000
+0.550000 0.200800 0.086900 -0.880000 -0.256000 0.392000
+0.550000 0.200800 0.086900 -0.880000 -0.256000 0.392000
+0.600000 0.100400 0.071800 -0.648000 -0.592000 0.472000
+0.600000 0.100400 0.071800 -0.648000 -0.592000 0.472000
+0.600000 0.093600 0.060900 -0.624000 -0.616000 0.464000
+0.593200 0.100400 0.060900 -0.640000 -0.584000 0.496000
+0.600000 0.053300 0.000000 -0.472000 -0.712000 0.512000
+0.553100 0.100400 0.000000 -0.664000 -0.576000 0.464000
+0.600000 0.050200 -0.005300 -0.440000 -0.752000 0.480000
+0.550000 0.100400 -0.005700 -0.672000 -0.576000 0.448000
+0.550000 0.050200 -0.037800 -0.320000 -0.688000 0.640000
+0.504600 0.100400 -0.060900 -0.704000 -0.248000 0.656000
+0.500000 0.050200 -0.057700 -0.560000 0.128000 0.816000
+0.500000 0.067400 -0.060900 -0.592000 0.120000 0.792000
+0.495100 0.050200 -0.060900 -0.456000 0.136000 0.872000
+0.500000 0.100400 -0.067100 -0.632000 -0.296000 0.704000
+0.450000 0.050200 -0.077000 -0.360000 0.120000 0.920000
+0.450000 0.100400 -0.090700 -0.384000 -0.320000 0.856000
+0.400000 0.050200 -0.114800 -0.552000 0.256000 0.784000
+0.415000 0.100400 -0.121900 -0.640000 0.192000 0.736000
+0.400000 0.072600 -0.121900 -0.632000 0.256000 0.720000
+0.400000 0.100400 -0.150800 -0.768000 0.376000 0.512000
+0.393200 0.050200 -0.121900 -0.648000 0.352000 0.664000
+0.381500 0.100400 -0.182900 -0.896000 0.440000 -0.008000
+0.357200 0.050200 -0.182900 -0.736000 0.640000 0.184000
+0.400000 0.100400 -0.207800 -0.424000 0.688000 -0.576000
+0.351400 0.050200 -0.243900 -0.480000 0.768000 -0.416000
+0.400000 0.083700 -0.243900 -0.328000 0.768000 -0.536000
+0.400000 0.050200 -0.294000 -0.352000 0.672000 -0.640000
+0.351400 0.050200 -0.243900 -0.480000 0.768000 -0.416000
+0.400000 0.041200 -0.304800 -0.352000 0.672000 -0.648000
+0.350000 0.049300 -0.243900 -0.512000 0.784000 -0.320000
+0.350000 0.024300 -0.304800 -0.456000 0.784000 -0.408000
+0.300000 0.032100 -0.243900 -0.576000 0.680000 -0.432000
+0.301400 0.000000 -0.304800 -0.584000 0.656000 -0.464000
+0.300000 0.000000 -0.302400 -0.544000 0.608000 -0.568000
+0.300000 -0.003100 -0.304800 -0.376000 0.424000 -0.816000
+0.301400 0.000000 -0.304800 -0.584000 0.656000 -0.464000
+0.300000 -0.050200 -0.319900 -0.536000 0.224000 -0.808000
+0.350000 0.000000 -0.339100 -0.264000 0.552000 -0.784000
+0.342100 -0.050200 -0.365800 -0.640000 -0.104000 -0.752000
+0.350000 -0.037900 -0.365800 -0.440000 0.432000 -0.776000
+0.350000 -0.050200 -0.374000 -0.496000 -0.096000 -0.856000
+0.383500 -0.050200 -0.365800 0.200000 -0.288000 -0.928000
+0.350000 -0.059800 -0.365800 -0.280000 -0.560000 -0.768000
+0.400000 -0.050200 -0.360800 0.184000 -0.432000 -0.872000
+0.350000 -0.100400 -0.331300 -0.432000 -0.520000 -0.728000
+0.400000 -0.100400 -0.340000 -0.040000 -0.360000 -0.928000
+0.350000 -0.127600 -0.304800 0.032000 -0.600000 -0.792000
+0.400000 -0.150600 -0.318400 -0.432000 -0.416000 -0.792000
+0.380400 -0.150600 -0.304800 -0.424000 -0.456000 -0.776000
+0.400000 -0.168700 -0.304800 -0.504000 -0.464000 -0.720000
+0.350000 -0.150600 -0.283600 -0.064000 -0.424000 -0.896000
+0.400000 -0.200800 -0.276700 0.448000 -0.472000 -0.752000
+0.350000 -0.200800 -0.271400 0.216000 0.224000 -0.944000
+0.400000 -0.249400 -0.243900 0.760000 -0.472000 -0.424000
+0.350000 -0.228300 -0.304800 0.616000 0.528000 -0.576000
+0.399000 -0.251000 -0.243900 0.912000 -0.008000 -0.392000
+0.366700 -0.251000 -0.304800 0.704000 0.488000 -0.496000
+0.350000 -0.228300 -0.304800 0.616000 0.528000 -0.576000
+0.350000 -0.251000 -0.329500 0.536000 0.472000 -0.688000
+0.320800 -0.200800 -0.304800 0.496000 0.328000 -0.800000
+0.300000 -0.251000 -0.347800 0.304000 0.384000 -0.864000
+0.300000 -0.200800 -0.324200 0.480000 0.248000 -0.832000
+0.320800 -0.200800 -0.304800 0.496000 0.328000 -0.800000
+0.300000 -0.150600 -0.312600 0.312000 -0.200000 -0.920000
+0.313400 -0.150600 -0.304800 0.400000 -0.360000 -0.840000
+0.300000 -0.100400 -0.310000 -0.248000 0.072000 -0.960000
+0.350000 -0.127600 -0.304800 0.032000 -0.600000 -0.792000
+0.350000 -0.100400 -0.331300 -0.432000 -0.520000 -0.728000
+0.300000 -0.100400 -0.310000 -0.248000 0.072000 -0.960000
+0.350000 -0.059800 -0.365800 -0.280000 -0.560000 -0.768000
+0.300000 -0.050200 -0.319900 -0.536000 0.224000 -0.808000
+0.342100 -0.050200 -0.365800 -0.640000 -0.104000 -0.752000
+0.350000 -0.059800 -0.365800 -0.280000 -0.560000 -0.768000
+0.350000 -0.050200 -0.374000 -0.496000 -0.096000 -0.856000
+0.350000 -0.050200 -0.374000 -0.496000 -0.096000 -0.856000
+0.650000 0.080100 0.121900 -0.576000 -0.640000 0.496000
+0.650000 0.080100 0.121900 -0.576000 -0.640000 0.496000
+0.692100 0.050200 0.121900 -0.432000 -0.784000 0.424000
+0.650000 0.050200 0.073400 -0.576000 -0.624000 0.512000
+0.700000 0.046100 0.121900 -0.152000 -0.904000 0.376000
+0.650000 0.041800 0.060900 -0.568000 -0.648000 0.504000
+0.700000 0.026800 0.060900 -0.288000 -0.896000 0.328000
+0.650000 0.013100 0.000000 -0.448000 -0.792000 0.392000
+0.700000 0.012000 0.000000 -0.032000 -0.960000 0.272000
+0.650000 0.000000 -0.040500 0.104000 -0.944000 0.296000
+0.700000 0.001400 -0.060900 0.088000 -0.968000 0.192000
+0.686800 0.000000 -0.060900 0.208000 -0.960000 0.144000
+0.700000 0.000400 -0.121900 0.224000 -0.968000 0.032000
+0.698200 0.000000 -0.121900 0.296000 -0.952000 0.032000
+0.700000 0.009000 -0.182900 0.456000 -0.744000 -0.472000
+0.687300 0.000000 -0.182900 0.648000 -0.600000 -0.456000
+0.700000 0.050200 -0.225700 0.368000 -0.368000 -0.848000
+0.653800 0.000000 -0.243900 0.576000 -0.112000 -0.808000
+0.653800 0.050200 -0.243900 0.232000 0.032000 -0.968000
+0.653800 0.050200 -0.243900 0.232000 0.032000 -0.968000
+0.750000 0.233400 0.121900 0.720000 0.680000 -0.080000
+0.750000 0.233400 0.121900 0.720000 0.680000 -0.080000
+0.788900 0.200800 0.121900 0.632000 0.744000 0.184000
+0.750000 0.222200 0.060900 0.704000 0.696000 -0.080000
+0.772600 0.200800 0.060900 0.648000 0.736000 -0.136000
+0.750000 0.219200 0.000000 0.672000 0.728000 0.080000
+0.770200 0.200800 0.000000 0.616000 0.776000 0.056000
+0.750000 0.228900 -0.060900 0.576000 0.696000 -0.416000
+0.787300 0.200800 -0.060900 0.520000 0.824000 -0.184000
+0.750000 0.200800 -0.104400 0.480000 0.680000 -0.544000
+0.800000 0.194300 -0.060900 0.416000 0.824000 -0.360000
+0.750000 0.186400 -0.121900 0.504000 0.648000 -0.560000
+0.800000 0.164900 -0.121900 0.312000 0.800000 -0.504000
+0.750000 0.157000 -0.182900 0.280000 0.720000 -0.624000
+0.800000 0.150600 -0.164100 0.256000 0.800000 -0.528000
+0.769100 0.150600 -0.182900 0.248000 0.704000 -0.648000
+0.800000 0.138600 -0.182900 0.232000 0.712000 -0.656000
+0.750000 0.150600 -0.191500 0.256000 0.656000 -0.704000
+0.800000 0.100400 -0.216300 0.104000 0.416000 -0.896000
+0.750000 0.100400 -0.218500 0.200000 0.232000 -0.944000
+0.800000 0.050200 -0.233400 -0.176000 0.416000 -0.880000
+0.750000 0.050200 -0.223600 -0.168000 -0.552000 -0.808000
+0.800000 0.000000 -0.217200 -0.656000 -0.464000 -0.584000
+0.750000 0.019900 -0.182900 -0.176000 -0.792000 -0.576000
+0.776700 0.000000 -0.182900 -0.576000 -0.728000 -0.360000
+0.750000 0.004300 -0.121900 -0.408000 -0.880000 -0.216000
+0.756600 0.000000 -0.121900 -0.496000 -0.856000 -0.080000
+0.750000 0.001600 -0.060900 -0.416000 -0.904000 -0.016000
+0.753100 0.000000 -0.060900 -0.472000 -0.872000 0.000000
+0.750000 0.013300 0.000000 -0.240000 -0.936000 0.240000
+0.772100 0.000000 0.000000 -0.504000 -0.832000 0.224000
+0.750000 0.031700 0.060900 -0.136000 -0.928000 0.336000
+0.798100 0.000000 0.060900 -0.504000 -0.792000 0.312000
+0.772100 0.000000 0.000000 -0.504000 -0.832000 0.224000
+0.800000 -0.001000 0.060900 -0.584000 -0.776000 0.216000
+0.800000 -0.015400 0.000000 -0.560000 -0.800000 0.184000
+0.843600 -0.050200 0.060900 -0.704000 -0.672000 0.184000
+0.832800 -0.050200 0.000000 -0.728000 -0.656000 0.144000
+0.800000 -0.015400 0.000000 -0.560000 -0.800000 0.184000
+0.823600 -0.050200 -0.060900 -0.736000 -0.664000 0.112000
+0.800000 -0.024700 -0.060900 -0.616000 -0.776000 0.088000
+0.818400 -0.050200 -0.121900 -0.760000 -0.640000 0.016000
+0.800000 -0.027900 -0.121900 -0.664000 -0.736000 -0.072000
+0.822900 -0.050200 -0.182900 -0.792000 -0.592000 -0.088000
+0.800000 -0.017800 -0.182900 -0.616000 -0.680000 -0.376000
+0.835300 -0.050200 -0.243900 -0.840000 -0.416000 -0.336000
+0.800000 0.000000 -0.217200 -0.656000 -0.464000 -0.584000
+0.819700 0.000000 -0.243900 -0.752000 -0.192000 -0.616000
+0.819700 0.000000 -0.243900 -0.752000 -0.192000 -0.616000
+0.788900 0.200800 0.121900 0.632000 0.744000 0.184000
+0.788900 0.200800 0.121900 0.632000 0.744000 0.184000
+0.800000 0.190400 0.121900 0.624000 0.752000 0.168000
+0.772600 0.200800 0.060900 0.648000 0.736000 -0.136000
+0.800000 0.182100 0.060900 0.560000 0.824000 -0.024000
+0.770200 0.200800 0.000000 0.616000 0.776000 0.056000
+0.800000 0.184600 0.000000 0.464000 0.872000 0.120000
+0.787300 0.200800 -0.060900 0.520000 0.824000 -0.184000
+0.800000 0.194300 -0.060900 0.416000 0.824000 -0.360000
+0.800000 0.194300 -0.060900 0.416000 0.824000 -0.360000
+0.800000 0.028400 0.121900 -0.376000 -0.808000 0.432000
+0.800000 0.028400 0.121900 -0.376000 -0.808000 0.432000
+0.829700 0.000000 0.121900 -0.704000 -0.616000 0.344000
+0.800000 0.000000 0.064400 -0.576000 -0.736000 0.344000
+0.800000 0.000000 0.064400 -0.576000 -0.736000 0.344000
+0.911800 0.100400 0.121900 0.528000 0.800000 0.264000
+0.911800 0.100400 0.121900 0.528000 0.800000 0.264000
+0.950000 0.069700 0.121900 0.360000 0.840000 0.384000
+0.936800 0.100400 0.060900 0.456000 0.872000 0.168000
+0.950000 0.091300 0.060900 0.600000 0.776000 0.176000
+0.950000 0.100400 0.012800 0.496000 0.848000 0.136000
+1.000000 0.068400 0.060900 0.464000 0.872000 0.104000
+0.952900 0.100400 0.000000 0.504000 0.848000 0.120000
+1.000000 0.075000 0.000000 0.472000 0.872000 0.072000
+0.957800 0.100400 -0.060900 0.544000 0.824000 -0.120000
+1.000000 0.074600 -0.060900 0.496000 0.816000 -0.280000
+1.000000 0.074600 -0.060900 0.496000 0.816000 -0.280000
+0.950000 -0.142500 0.121900 -0.608000 -0.672000 0.392000
+0.950000 -0.142500 0.121900 -0.608000 -0.672000 0.392000
+0.950000 -0.150600 0.094900 -0.648000 -0.696000 0.272000
+0.900000 -0.107100 0.121900 -0.584000 -0.768000 0.240000
+0.942000 -0.150600 0.060900 -0.704000 -0.672000 0.200000
+0.900000 -0.117100 0.060900 -0.656000 -0.736000 0.136000
+0.931300 -0.150600 0.000000 -0.640000 -0.744000 0.144000
+0.900000 -0.125700 0.000000 -0.664000 -0.728000 0.136000
+0.917800 -0.150600 -0.060900 -0.640000 -0.736000 0.184000
+0.900000 -0.135500 -0.060900 -0.672000 -0.712000 0.168000
+0.902600 -0.150600 -0.121900 -0.664000 -0.736000 0.096000
+0.900000 -0.148200 -0.121900 -0.664000 -0.728000 0.088000
+0.900000 -0.150600 -0.145400 -0.696000 -0.704000 0.104000
+0.902600 -0.150600 -0.121900 -0.664000 -0.736000 0.096000
+0.900000 -0.155900 -0.182900 -0.744000 -0.648000 0.112000
+0.950000 -0.200400 -0.121900 -0.720000 -0.672000 0.136000
+0.939100 -0.200800 -0.182900 -0.712000 -0.672000 0.160000
+0.950000 -0.200800 -0.124000 -0.680000 -0.712000 0.160000
+0.950000 -0.211700 -0.182900 -0.704000 -0.680000 0.176000
+0.939100 -0.200800 -0.182900 -0.712000 -0.672000 0.160000
+0.950000 -0.224400 -0.243900 -0.688000 -0.640000 0.328000
+0.928800 -0.200800 -0.243900 -0.736000 -0.616000 0.240000
+0.939100 -0.200800 -0.182900 -0.712000 -0.672000 0.160000
+0.900000 -0.163000 -0.243900 -0.816000 -0.552000 0.128000
+0.900000 -0.155900 -0.182900 -0.744000 -0.648000 0.112000
+0.890800 -0.150600 -0.243900 -0.848000 -0.512000 0.064000
+0.895100 -0.150600 -0.182900 -0.744000 -0.648000 0.104000
+0.900000 -0.155900 -0.182900 -0.744000 -0.648000 0.112000
+0.900000 -0.150600 -0.145400 -0.696000 -0.704000 0.104000
+0.900000 -0.150600 -0.145400 -0.696000 -0.704000 0.104000
+0.950000 -0.150600 0.094900 -0.648000 -0.696000 0.272000
+0.950000 -0.150600 0.094900 -0.648000 -0.696000 0.272000
+0.950000 -0.158100 0.060900 -0.608000 -0.760000 0.200000
+0.942000 -0.150600 0.060900 -0.704000 -0.672000 0.200000
+0.950000 -0.168100 0.000000 -0.640000 -0.744000 0.184000
+0.931300 -0.150600 0.000000 -0.640000 -0.744000 0.144000
+0.950000 -0.183700 -0.060900 -0.632000 -0.728000 0.232000
+0.917800 -0.150600 -0.060900 -0.640000 -0.736000 0.184000
+0.950000 -0.200400 -0.121900 -0.720000 -0.672000 0.136000
+0.902600 -0.150600 -0.121900 -0.664000 -0.736000 0.096000
+0.902600 -0.150600 -0.121900 -0.664000 -0.736000 0.096000
+1.000000 0.053600 0.121900 0.280000 0.872000 0.392000
+1.000000 0.053600 0.121900 0.280000 0.872000 0.392000
+0.950000 0.069700 0.121900 0.360000 0.840000 0.384000
+1.000000 0.068400 0.060900 0.464000 0.872000 0.104000
+0.950000 0.091300 0.060900 0.600000 0.776000 0.176000
+0.950000 0.091300 0.060900 0.600000 0.776000 0.176000
+-1.000000 -0.090800 0.060900 -0.320000 -0.912000 0.248000
+-1.000000 -0.090800 0.060900 -0.320000 -0.912000 0.248000
+-0.973400 -0.100400 0.060900 -0.344000 -0.904000 0.240000
+-1.000000 -0.100400 0.014600 -0.304000 -0.920000 0.208000
+-1.000000 -0.100400 0.014600 -0.304000 -0.920000 0.208000
+-0.950000 0.258900 0.000000 0.296000 0.848000 0.432000
+-0.950000 0.258900 0.000000 0.296000 0.848000 0.432000
+-0.928700 0.251000 0.000000 0.312000 0.848000 0.408000
+-0.950000 0.251000 0.016800 0.288000 0.808000 0.504000
+-0.950000 0.251000 0.016800 0.288000 0.808000 0.504000
+-0.900000 -0.149700 0.060900 -0.696000 -0.664000 0.232000
+-0.900000 -0.149700 0.060900 -0.696000 -0.664000 0.232000
+-0.899200 -0.150600 0.060900 -0.816000 -0.504000 0.256000
+-0.900000 -0.150600 0.057700 -0.744000 -0.616000 0.232000
+-0.900000 -0.150600 0.057700 -0.744000 -0.616000 0.232000
+-0.750000 0.106000 0.060900 0.496000 0.464000 0.728000
+-0.750000 0.106000 0.060900 0.496000 0.464000 0.728000
+-0.796300 0.150600 0.060900 0.512000 0.584000 0.616000
+-0.750000 0.150600 0.014500 0.472000 0.624000 0.608000
+-0.750000 0.150600 0.014500 0.472000 0.624000 0.608000
+-0.750800 -0.401700 0.000000 -0.816000 -0.520000 0.208000
+-0.750800 -0.401700 0.000000 -0.816000 -0.520000 0.208000
+-0.750000 -0.401700 0.004100 -0.816000 -0.520000 0.232000
+-0.750000 -0.403200 0.000000 -0.832000 -0.504000 0.216000
+-0.750000 -0.403200 0.000000 -0.832000 -0.504000 0.216000
+-0.700000 0.051600 0.060900 0.528000 0.416000 0.728000
+-0.700000 0.051600 0.060900 0.528000 0.416000 0.728000
+-0.744800 0.100400 0.060900 0.496000 0.456000 0.728000
+-0.700000 0.100400 0.019100 0.504000 0.504000 0.688000
+-0.700000 0.100400 0.019100 0.504000 0.504000 0.688000
+-0.700000 0.121800 0.000000 0.536000 0.544000 0.632000
+-0.700000 0.121800 0.000000 0.536000 0.544000 0.632000
+-0.680200 0.100400 0.000000 0.600000 0.440000 0.656000
+-0.700000 0.100400 0.019100 0.504000 0.504000 0.688000
+-0.700000 0.100400 0.019100 0.504000 0.504000 0.688000
+-0.650000 -0.023500 0.060900 0.576000 0.360000 0.720000
+-0.650000 -0.023500 0.060900 0.576000 0.360000 0.720000
+-0.666100 0.000000 0.060900 0.560000 0.376000 0.728000
+-0.650000 0.000000 0.045200 0.576000 0.400000 0.704000
+-0.650000 0.000000 0.045200 0.576000 0.400000 0.704000
+-0.650000 0.063100 0.000000 0.592000 0.392000 0.696000
+-0.650000 0.063100 0.000000 0.592000 0.392000 0.696000
+-0.641800 0.050200 0.000000 0.616000 0.400000 0.664000
+-0.650000 0.050200 0.008200 0.568000 0.384000 0.720000
+-0.650000 0.050200 0.008200 0.568000 0.384000 0.720000
+-0.650000 -0.495900 0.060900 -0.528000 -0.720000 0.432000
+-0.650000 -0.495900 0.060900 -0.528000 -0.720000 0.432000
+-0.640700 -0.502100 0.060900 -0.496000 -0.728000 0.456000
+-0.650000 -0.502100 0.048300 -0.536000 -0.712000 0.440000
+-0.650000 -0.502100 0.048300 -0.536000 -0.712000 0.440000
+-0.633400 -0.552300 0.000000 -0.384000 -0.672000 0.624000
+-0.633400 -0.552300 0.000000 -0.384000 -0.672000 0.624000
+-0.600000 -0.552300 0.023900 -0.224000 -0.776000 0.584000
+-0.600000 -0.566300 0.000000 -0.184000 -0.816000 0.544000
+-0.550000 -0.552300 0.031000 0.256000 -0.800000 0.528000
+-0.550000 -0.565800 0.000000 0.224000 -0.872000 0.424000
+-0.509600 -0.552300 0.000000 0.320000 -0.840000 0.424000
+-0.509600 -0.552300 0.000000 0.320000 -0.840000 0.424000
+-0.600000 -0.018300 0.000000 0.712000 0.368000 0.584000
+-0.600000 -0.018300 0.000000 0.712000 0.368000 0.584000
+-0.584800 -0.050200 0.000000 0.744000 0.336000 0.568000
+-0.600000 -0.050200 0.018400 0.648000 0.320000 0.688000
+-0.600000 -0.050200 0.018400 0.648000 0.320000 0.688000
+-0.472400 -0.150600 0.060900 -0.464000 0.768000 0.416000
+-0.472400 -0.150600 0.060900 -0.464000 0.768000 0.416000
+-0.500000 -0.166600 0.060900 -0.304000 0.832000 0.448000
+-0.500000 -0.150600 0.019400 -0.216000 0.856000 0.464000
+-0.500000 -0.150600 0.019400 -0.216000 0.856000 0.464000
+-0.434300 -0.100400 0.000000 -0.648000 0.720000 0.208000
+-0.434300 -0.100400 0.000000 -0.648000 0.720000 0.208000
+-0.405500 -0.100400 0.060900 -0.712000 0.456000 0.520000
+-0.400000 -0.050900 0.000000 -0.776000 0.576000 0.224000
+-0.400000 -0.090100 0.060900 -0.696000 0.400000 0.584000
+-0.399300 -0.050200 0.000000 -0.696000 0.680000 0.184000
+-0.367400 -0.050200 0.060900 -0.696000 0.408000 0.584000
+-0.367400 -0.050200 0.060900 -0.696000 0.408000 0.584000
+-0.355100 0.050200 0.000000 -0.872000 0.216000 0.416000
+-0.355100 0.050200 0.000000 -0.872000 0.216000 0.416000
+-0.350000 0.077100 0.000000 -0.776000 0.256000 0.568000
+-0.350000 0.050200 0.010900 -0.568000 0.448000 0.680000
+-0.321000 0.100400 0.000000 -0.264000 0.416000 0.864000
+-0.300000 0.050200 0.038600 -0.224000 0.544000 0.800000
+-0.300000 0.100400 0.006400 -0.200000 0.408000 0.880000
+-0.250000 0.050200 0.048300 0.000000 0.552000 0.832000
+-0.250000 0.100400 0.002600 0.144000 0.496000 0.848000
+-0.250000 0.100400 0.002600 0.144000 0.496000 0.848000
+-0.350000 0.000000 0.059800 -0.688000 0.400000 0.592000
+-0.350000 0.000000 0.059800 -0.688000 0.400000 0.592000
+-0.350000 0.050200 0.010900 -0.568000 0.448000 0.680000
+-0.373100 0.000000 0.000000 -0.880000 0.240000 0.392000
+-0.355100 0.050200 0.000000 -0.872000 0.216000 0.416000
+-0.377800 0.000000 -0.060900 -0.864000 0.424000 -0.248000
+-0.358600 0.050200 -0.060900 -0.920000 0.168000 -0.328000
+-0.372200 0.000000 -0.121900 -0.848000 0.480000 -0.200000
+-0.350000 0.050200 -0.078800 -0.832000 0.272000 -0.472000
+-0.350000 0.031200 -0.121900 -0.744000 0.552000 -0.352000
+-0.335400 0.050200 -0.121900 -0.752000 0.472000 -0.456000
+-0.350000 0.000000 -0.171400 -0.688000 0.416000 -0.584000
+-0.301000 0.050200 -0.182900 -0.704000 0.472000 -0.512000
+-0.340600 0.000000 -0.182900 -0.696000 0.480000 -0.520000
+-0.350000 0.000000 -0.171400 -0.688000 0.416000 -0.584000
+-0.350000 -0.016600 -0.182900 -0.688000 0.360000 -0.616000
+-0.372200 0.000000 -0.121900 -0.848000 0.480000 -0.200000
+-0.365500 -0.050200 -0.182900 -0.728000 0.384000 -0.560000
+-0.399400 -0.050200 -0.121900 -0.760000 0.504000 -0.392000
+-0.400000 -0.096400 -0.182900 -0.664000 0.552000 -0.496000
+-0.400000 -0.050900 -0.121900 -0.736000 0.536000 -0.408000
+-0.403600 -0.100400 -0.182900 -0.616000 0.592000 -0.512000
+-0.434900 -0.100400 -0.121900 -0.608000 0.744000 -0.256000
+-0.434900 -0.100400 -0.121900 -0.608000 0.744000 -0.256000
+-0.350000 0.000000 0.059800 -0.688000 0.400000 0.592000
+-0.350000 0.000000 0.059800 -0.688000 0.400000 0.592000
+-0.350000 0.050200 0.010900 -0.568000 0.448000 0.680000
+-0.348200 0.000000 0.060900 -0.376000 0.448000 0.800000
+-0.300000 0.050200 0.038600 -0.224000 0.544000 0.800000
+-0.300000 0.027200 0.060900 -0.160000 0.552000 0.808000
+-0.250000 0.050200 0.048300 0.000000 0.552000 0.832000
+-0.250000 0.033500 0.060900 0.056000 0.528000 0.840000
+-0.200000 0.050200 0.037800 0.512000 0.448000 0.720000
+-0.200000 0.020500 0.060900 0.664000 0.440000 0.600000
+-0.200000 0.020500 0.060900 0.664000 0.440000 0.600000
+-0.208400 0.401700 0.000000 -0.424000 0.248000 0.864000
+-0.208400 0.401700 0.000000 -0.424000 0.248000 0.864000
+-0.200000 0.408700 0.000000 -0.112000 0.496000 0.856000
+-0.200000 0.401700 0.005100 -0.168000 0.288000 0.936000
+-0.185900 0.401700 0.000000 0.264000 0.248000 0.928000
+-0.200000 0.384800 0.000000 -0.112000 -0.232000 0.960000
+-0.150000 0.401700 -0.011900 0.240000 0.256000 0.928000
+-0.200000 0.351500 -0.009600 0.208000 -0.208000 0.952000
+-0.150000 0.351500 -0.029900 0.096000 -0.168000 0.976000
+-0.200000 0.301200 -0.022600 0.056000 -0.176000 0.976000
+-0.150000 0.301200 -0.033800 0.040000 -0.024000 0.992000
+-0.200000 0.251000 -0.048300 -0.120000 -0.296000 0.944000
+-0.150000 0.251000 -0.027500 -0.136000 -0.104000 0.984000
+-0.200000 0.206100 -0.060900 -0.448000 -0.184000 0.872000
+-0.150000 0.200800 -0.027500 -0.320000 -0.168000 0.928000
+-0.198000 0.200800 -0.060900 -0.464000 0.288000 0.832000
+-0.150000 0.150600 -0.037800 0.256000 -0.016000 0.960000
+-0.200000 0.199100 -0.060900 -0.320000 0.504000 0.792000
+-0.200000 0.150600 -0.023100 -0.360000 0.472000 0.792000
+-0.250000 0.177000 -0.060900 -0.096000 0.568000 0.808000
+-0.250000 0.150600 -0.042200 0.008000 0.568000 0.816000
+-0.277600 0.200800 -0.060900 0.584000 -0.072000 0.800000
+-0.300000 0.150600 -0.036000 -0.360000 0.064000 0.920000
+-0.300000 0.200800 -0.040500 0.440000 0.208000 0.864000
+-0.346000 0.150600 -0.060900 -0.768000 -0.144000 0.616000
+-0.350000 0.200800 -0.003200 -0.528000 -0.104000 0.832000
+-0.350000 0.153200 -0.060900 -0.608000 -0.784000 0.016000
+-0.368900 0.200800 -0.060900 -0.952000 0.040000 -0.280000
+-0.350000 0.200800 -0.076700 -0.368000 -0.104000 -0.920000
+-0.356100 0.251000 -0.060900 -0.936000 0.104000 -0.312000
+-0.350000 0.251000 -0.067500 -0.624000 0.048000 -0.768000
+-0.353500 0.301200 -0.060900 -0.872000 0.080000 -0.464000
+-0.350000 0.301200 -0.064600 -0.624000 0.064000 -0.768000
+-0.350000 0.329400 -0.060900 -0.960000 0.152000 -0.224000
+-0.300000 0.301200 -0.089300 -0.344000 0.056000 -0.936000
+-0.344500 0.351500 -0.060900 -0.776000 0.288000 0.552000
+-0.300000 0.351500 -0.083400 -0.432000 0.176000 -0.880000
+-0.307400 0.401700 -0.060900 -0.696000 0.688000 -0.152000
+-0.300000 0.401700 -0.066400 -0.448000 0.440000 -0.768000
+-0.300000 0.408800 -0.060900 -0.664000 0.712000 -0.184000
+-0.250000 0.401700 -0.091800 -0.416000 0.456000 -0.776000
+-0.250000 0.447500 -0.060900 -0.512000 0.744000 0.408000
+-0.208300 0.401700 -0.121900 -0.432000 0.432000 -0.784000
+-0.242600 0.451900 -0.060900 -0.440000 0.728000 0.512000
+-0.200000 0.409200 -0.121900 -0.400000 0.464000 -0.776000
+-0.200000 0.451900 -0.081300 -0.400000 0.504000 -0.752000
+-0.152100 0.451900 -0.121900 -0.424000 0.536000 -0.720000
+-0.200000 0.477600 -0.060900 -0.544000 0.808000 -0.208000
+-0.150000 0.453400 -0.121900 -0.320000 0.624000 -0.704000
+-0.150000 0.501300 -0.060900 -0.376000 0.880000 -0.280000
+-0.100000 0.479800 -0.121900 -0.288000 0.584000 -0.752000
+-0.146800 0.502100 -0.060900 -0.272000 0.960000 0.016000
+-0.100000 0.502100 -0.081300 -0.184000 0.840000 -0.488000
+-0.100000 0.517800 -0.060900 -0.120000 0.976000 0.136000
+-0.050000 0.502100 -0.117100 -0.040000 0.912000 -0.392000
+-0.050000 0.515300 -0.060900 0.432000 0.792000 0.408000
+-0.033200 0.502100 -0.060900 0.616000 0.496000 0.600000
+-0.050000 0.502100 -0.046900 0.400000 0.496000 0.760000
+-0.023600 0.451900 -0.060900 0.376000 0.152000 0.904000
+-0.050000 0.451900 -0.049700 0.432000 0.024000 0.896000
+-0.005200 0.401700 -0.060900 0.264000 0.168000 0.944000
+-0.050000 0.401700 -0.052300 0.176000 0.040000 0.976000
+0.000000 0.393800 -0.060900 0.224000 0.176000 0.952000
+-0.050000 0.351500 -0.043600 0.248000 0.032000 0.960000
+0.000000 0.351500 -0.051600 0.280000 -0.248000 0.920000
+-0.050000 0.301200 -0.044600 0.440000 -0.008000 0.896000
+0.000000 0.334500 -0.060900 0.312000 -0.368000 0.864000
+-0.027600 0.301200 -0.060900 0.456000 -0.208000 0.856000
+0.000000 0.301200 -0.076500 0.296000 -0.272000 0.904000
+-0.035000 0.251000 -0.060900 0.512000 -0.448000 0.728000
+0.000000 0.251000 -0.086600 0.344000 -0.360000 0.864000
+-0.050000 0.236000 -0.060900 0.536000 -0.496000 0.672000
+0.000000 0.211400 -0.121900 0.496000 -0.712000 0.480000
+-0.050000 0.200800 -0.090500 0.520000 -0.520000 0.672000
+-0.012800 0.200800 -0.121900 0.688000 -0.616000 0.376000
+-0.050000 0.170300 -0.121900 0.584000 -0.576000 0.560000
+0.000000 0.200800 -0.169000 0.576000 -0.744000 0.320000
+-0.050000 0.150600 -0.159500 0.712000 -0.480000 0.504000
+0.000000 0.195100 -0.182900 0.504000 -0.656000 -0.544000
+-0.033200 0.150600 -0.182900 0.832000 -0.552000 -0.016000
+0.000000 0.200800 -0.186400 0.272000 -0.456000 -0.840000
+-0.050000 0.150600 -0.210200 0.840000 -0.208000 -0.496000
+-0.050000 0.200800 -0.204500 0.304000 -0.328000 -0.888000
+-0.077600 0.150600 -0.243900 0.320000 0.328000 -0.880000
+-0.100000 0.200800 -0.221500 0.056000 0.392000 -0.912000
+-0.100000 0.164100 -0.243900 -0.032000 0.432000 -0.896000
+-0.150000 0.200800 -0.199200 -0.328000 0.272000 -0.896000
+-0.126800 0.150600 -0.243900 -0.208000 0.496000 -0.832000
+-0.150000 0.150600 -0.235500 -0.296000 0.536000 -0.784000
+-0.150000 0.141700 -0.243900 -0.352000 0.528000 -0.768000
+-0.200000 0.150600 -0.197300 -0.488000 0.464000 -0.728000
+-0.198500 0.100400 -0.243900 -0.376000 0.480000 -0.784000
+-0.200000 0.100400 -0.242800 -0.520000 0.512000 -0.672000
+-0.200000 0.099300 -0.243900 -0.456000 0.488000 -0.736000
+-0.249100 0.100400 -0.182900 -0.576000 0.496000 -0.640000
+-0.250000 0.055800 -0.243900 -0.560000 0.648000 -0.504000
+-0.250000 0.099600 -0.182900 -0.488000 0.616000 -0.608000
+-0.256300 0.050200 -0.243900 -0.592000 0.624000 -0.488000
+-0.300000 0.052000 -0.182900 -0.664000 0.464000 -0.568000
+-0.300000 0.050200 -0.185100 -0.648000 0.560000 -0.504000
+-0.256300 0.050200 -0.243900 -0.592000 0.624000 -0.488000
+-0.300000 0.001800 -0.243900 -0.496000 0.680000 -0.520000
+-0.250000 0.050200 -0.254100 -0.584000 0.656000 -0.464000
+-0.300000 0.000000 -0.248500 -0.656000 0.560000 -0.488000
+-0.250000 0.000000 -0.286200 -0.320000 0.712000 -0.616000
+-0.300000 -0.050200 -0.270300 -0.824000 0.232000 -0.512000
+-0.250000 -0.028200 -0.304800 -0.400000 0.416000 -0.808000
+-0.266700 -0.050200 -0.304800 -0.504000 0.288000 -0.808000
+-0.250000 -0.050200 -0.318700 -0.440000 0.320000 -0.832000
+-0.288100 -0.100400 -0.304800 -0.408000 0.240000 -0.872000
+-0.250000 -0.100400 -0.327300 -0.384000 0.152000 -0.904000
+-0.300000 -0.118900 -0.304800 -0.376000 0.264000 -0.880000
+-0.250000 -0.150600 -0.327500 -0.120000 0.152000 -0.976000
+-0.300000 -0.150600 -0.319300 -0.256000 0.480000 -0.832000
+-0.250000 -0.200800 -0.333200 0.168000 0.080000 -0.976000
+-0.300000 -0.200800 -0.340600 0.016000 0.280000 -0.952000
+-0.250000 -0.251000 -0.337900 0.384000 0.112000 -0.912000
+-0.300000 -0.251000 -0.348000 0.192000 0.248000 -0.944000
+-0.250000 -0.301200 -0.349000 0.296000 0.272000 -0.912000
+-0.300000 -0.296900 -0.365800 0.296000 0.528000 -0.784000
+-0.291400 -0.301200 -0.365800 0.272000 0.504000 -0.808000
+-0.300000 -0.301200 -0.369600 0.320000 0.544000 -0.768000
+-0.250000 -0.342900 -0.365800 0.504000 0.512000 -0.680000
+-0.300000 -0.341100 -0.426800 -0.128000 0.536000 -0.832000
+-0.250000 -0.351500 -0.379700 0.552000 0.712000 -0.416000
+-0.273100 -0.351500 -0.426800 0.480000 0.752000 -0.440000
+-0.250000 -0.368100 -0.426800 0.504000 0.792000 -0.336000
+-0.250000 -0.351500 -0.379700 0.552000 0.712000 -0.416000
+-0.200000 -0.393200 -0.426800 0.696000 0.632000 -0.328000
+-0.241400 -0.351500 -0.365800 0.488000 0.640000 -0.576000
+-0.200000 -0.365300 -0.365800 0.504000 0.768000 -0.376000
+-0.200000 -0.351500 -0.343300 0.312000 0.640000 -0.696000
+-0.241400 -0.351500 -0.365800 0.488000 0.640000 -0.576000
+-0.200000 -0.301200 -0.313400 0.328000 0.152000 -0.928000
+-0.250000 -0.342900 -0.365800 0.504000 0.512000 -0.680000
+-0.250000 -0.301200 -0.349000 0.296000 0.272000 -0.912000
+-0.291400 -0.301200 -0.365800 0.272000 0.504000 -0.808000
+-0.291400 -0.301200 -0.365800 0.272000 0.504000 -0.808000
+-0.200000 0.401700 0.005100 -0.168000 0.288000 0.936000
+-0.200000 0.401700 0.005100 -0.168000 0.288000 0.936000
+-0.200000 0.384800 0.000000 -0.112000 -0.232000 0.960000
+-0.208400 0.401700 0.000000 -0.424000 0.248000 0.864000
+-0.200000 0.351500 -0.009600 0.208000 -0.208000 0.952000
+-0.250000 0.401700 -0.023000 -0.400000 -0.016000 0.912000
+-0.250000 0.351500 -0.004200 0.040000 0.000000 0.992000
+-0.300000 0.401700 -0.053800 -0.512000 0.520000 0.672000
+-0.300000 0.351500 -0.024700 -0.384000 0.216000 0.896000
+-0.307400 0.401700 -0.060900 -0.696000 0.688000 -0.152000
+-0.344500 0.351500 -0.060900 -0.776000 0.288000 0.552000
+-0.300000 0.351500 -0.024700 -0.384000 0.216000 0.896000
+-0.350000 0.329400 -0.060900 -0.960000 0.152000 -0.224000
+-0.300000 0.301200 -0.020200 -0.184000 0.032000 0.976000
+-0.350000 0.301200 -0.051600 -0.832000 0.120000 0.528000
+-0.300000 0.251000 -0.020200 0.208000 -0.160000 0.960000
+-0.350000 0.251000 -0.040500 -0.808000 0.200000 0.544000
+-0.300000 0.200800 -0.040500 0.440000 0.208000 0.864000
+-0.350000 0.200800 -0.003200 -0.528000 -0.104000 0.832000
+-0.350000 0.251000 -0.040500 -0.808000 0.200000 0.544000
+-0.368900 0.200800 -0.060900 -0.952000 0.040000 -0.280000
+-0.356100 0.251000 -0.060900 -0.936000 0.104000 -0.312000
+-0.350000 0.251000 -0.040500 -0.808000 0.200000 0.544000
+-0.353500 0.301200 -0.060900 -0.872000 0.080000 -0.464000
+-0.350000 0.301200 -0.051600 -0.832000 0.120000 0.528000
+-0.350000 0.329400 -0.060900 -0.960000 0.152000 -0.224000
+-0.350000 0.329400 -0.060900 -0.960000 0.152000 -0.224000
+-0.250000 -0.301200 0.006000 0.344000 -0.608000 0.704000
+-0.250000 -0.301200 0.006000 0.344000 -0.608000 0.704000
+-0.235900 -0.301200 0.000000 0.272000 -0.568000 0.768000
+-0.250000 -0.307700 0.000000 0.288000 -0.576000 0.760000
+-0.250000 -0.307700 0.000000 0.288000 -0.576000 0.760000
+-0.169100 -0.301200 0.000000 -0.376000 -0.392000 0.832000
+-0.169100 -0.301200 0.000000 -0.376000 -0.392000 0.832000
+-0.150000 -0.301200 0.010200 -0.304000 -0.280000 0.904000
+-0.150000 -0.346200 0.000000 -0.392000 -0.160000 0.904000
+-0.100000 -0.301200 0.037800 -0.016000 -0.152000 0.984000
+-0.100000 -0.344900 0.000000 0.072000 -0.528000 0.840000
+-0.050000 -0.301200 0.029100 0.312000 -0.280000 0.904000
+-0.050000 -0.329200 0.000000 0.264000 -0.624000 0.720000
+-0.002200 -0.301200 0.000000 0.384000 -0.648000 0.648000
+-0.050000 -0.351500 -0.027000 0.488000 -0.688000 0.528000
+0.000000 -0.301200 -0.001900 0.408000 -0.704000 0.568000
+-0.029100 -0.351500 -0.060900 0.584000 -0.680000 0.424000
+0.000000 -0.326800 -0.060900 0.344000 -0.824000 0.432000
+0.000000 -0.351500 -0.112600 0.544000 -0.704000 0.448000
+0.032200 -0.301200 -0.060900 0.552000 -0.696000 0.448000
+0.006400 -0.351500 -0.121900 0.552000 -0.776000 0.288000
+0.050000 -0.301200 -0.085900 0.528000 -0.704000 0.464000
+0.050000 -0.321600 -0.121900 0.584000 -0.712000 0.376000
+0.074000 -0.301200 -0.121900 0.536000 -0.792000 0.264000
+0.050000 -0.327900 -0.182900 0.552000 -0.824000 0.048000
+0.088900 -0.301200 -0.182900 0.488000 -0.864000 0.072000
+0.050000 -0.327900 -0.243900 0.480000 -0.872000 0.000000
+0.091700 -0.301200 -0.243900 0.488000 -0.864000 -0.008000
+0.050000 -0.326800 -0.304800 0.424000 -0.880000 -0.184000
+0.085600 -0.301200 -0.304800 0.544000 -0.768000 -0.320000
+0.050000 -0.303000 -0.365800 0.400000 -0.792000 -0.448000
+0.052200 -0.301200 -0.365800 0.552000 -0.720000 -0.416000
+0.050000 -0.301200 -0.369000 0.376000 -0.768000 -0.512000
+0.100000 -0.263400 -0.365800 0.480000 -0.672000 -0.544000
+0.050000 -0.251000 -0.406500 0.232000 -0.312000 -0.912000
+0.100000 -0.251000 -0.380100 0.472000 -0.384000 -0.784000
+0.050000 -0.206300 -0.365800 -0.112000 0.608000 -0.776000
+0.100000 -0.224900 -0.365800 0.352000 0.456000 -0.808000
+0.050000 -0.200800 -0.360800 -0.016000 0.576000 -0.808000
+0.100000 -0.200800 -0.352600 0.240000 0.528000 -0.800000
+0.100000 -0.224900 -0.365800 0.352000 0.456000 -0.808000
+0.150000 -0.200800 -0.325200 0.160000 0.176000 -0.968000
+0.118000 -0.251000 -0.365800 0.536000 -0.224000 -0.808000
+0.150000 -0.251000 -0.336000 0.080000 -0.336000 -0.928000
+0.100000 -0.263400 -0.365800 0.480000 -0.672000 -0.544000
+0.150000 -0.287400 -0.304800 0.000000 -0.712000 -0.688000
+0.100000 -0.292600 -0.304800 0.432000 -0.840000 -0.304000
+0.150000 -0.287700 -0.243900 -0.208000 -0.968000 0.064000
+0.100000 -0.296900 -0.243900 0.408000 -0.912000 0.000000
+0.150000 -0.278000 -0.182900 -0.064000 -0.936000 0.328000
+0.100000 -0.295100 -0.182900 0.440000 -0.880000 0.144000
+0.150000 -0.253200 -0.121900 0.192000 -0.808000 0.552000
+0.100000 -0.284500 -0.121900 0.464000 -0.744000 0.472000
+0.150000 -0.251000 -0.118100 0.224000 -0.792000 0.560000
+0.100000 -0.256900 -0.060900 0.456000 -0.800000 0.368000
+0.110300 -0.251000 -0.060900 0.504000 -0.760000 0.392000
+0.100000 -0.251000 -0.044600 0.544000 -0.608000 0.568000
+0.130700 -0.200800 -0.060900 0.504000 0.008000 0.856000
+0.100000 -0.200800 -0.044900 0.416000 0.232000 0.872000
+0.100000 -0.170000 -0.060900 0.256000 0.296000 0.912000
+0.050000 -0.200800 -0.016400 0.232000 0.648000 0.720000
+0.076800 -0.150600 -0.060900 0.208000 0.432000 0.872000
+0.050000 -0.150600 -0.053500 0.160000 0.448000 0.872000
+0.050000 -0.140200 -0.060900 0.152000 0.504000 0.848000
+0.000000 -0.150600 -0.047300 0.168000 0.600000 0.768000
+0.000000 -0.136800 -0.060900 0.088000 0.520000 0.840000
+-0.050000 -0.150600 -0.033100 0.152000 0.512000 0.840000
+-0.050000 -0.119400 -0.060900 0.168000 0.528000 0.824000
+-0.100000 -0.150600 -0.019000 0.512000 0.456000 0.720000
+-0.100000 -0.105500 -0.060900 0.480000 0.464000 0.736000
+-0.129500 -0.150600 0.000000 0.416000 0.264000 0.864000
+-0.104300 -0.100400 -0.060900 0.528000 0.416000 0.728000
+-0.150000 -0.104300 0.000000 0.496000 0.120000 0.848000
+-0.150000 -0.100400 -0.001300 0.848000 0.032000 0.520000
+-0.150600 -0.100400 0.000000 0.800000 0.040000 0.592000
+-0.150000 -0.050200 -0.005700 0.768000 -0.024000 0.632000
+-0.152800 -0.050200 0.000000 0.848000 0.032000 0.520000
+-0.150000 0.000000 -0.001200 0.744000 0.064000 0.656000
+-0.150800 0.000000 0.000000 0.744000 0.072000 0.656000
+-0.150000 0.050200 -0.012600 0.624000 0.240000 0.728000
+-0.163800 0.050200 0.000000 0.704000 0.216000 0.664000
+-0.150000 0.100400 -0.027500 0.432000 0.296000 0.848000
+-0.200000 0.089800 0.000000 0.216000 0.544000 0.800000
+-0.200000 0.100400 -0.008800 0.176000 0.488000 0.848000
+-0.238500 0.100400 0.000000 0.152000 0.496000 0.848000
+-0.200000 0.150600 -0.023100 -0.360000 0.472000 0.792000
+-0.250000 0.104200 0.000000 0.144000 0.480000 0.856000
+-0.250000 0.150600 -0.042200 0.008000 0.568000 0.816000
+-0.300000 0.112500 0.000000 -0.064000 0.472000 0.872000
+-0.300000 0.150600 -0.036000 -0.360000 0.064000 0.920000
+-0.300000 0.150600 -0.036000 -0.360000 0.064000 0.920000
+-0.150000 -0.104300 0.000000 0.496000 0.120000 0.848000
+-0.150000 -0.104300 0.000000 0.496000 0.120000 0.848000
+-0.129500 -0.150600 0.000000 0.416000 0.264000 0.864000
+-0.150000 -0.150600 0.010200 0.376000 0.208000 0.896000
+-0.100000 -0.188700 0.000000 0.176000 0.408000 0.888000
+-0.150000 -0.200800 0.013600 0.104000 0.200000 0.968000
+-0.100000 -0.200800 0.005100 0.056000 0.344000 0.936000
+-0.150000 -0.251000 0.002400 -0.056000 -0.176000 0.976000
+-0.100000 -0.251000 0.029400 -0.128000 0.120000 0.976000
+-0.150000 -0.301200 0.010200 -0.304000 -0.280000 0.904000
+-0.100000 -0.301200 0.037800 -0.016000 -0.152000 0.984000
+-0.100000 -0.251000 0.029400 -0.128000 0.120000 0.976000
+-0.050000 -0.301200 0.029100 0.312000 -0.280000 0.904000
+-0.050000 -0.251000 0.040700 0.136000 0.064000 0.984000
+-0.002200 -0.301200 0.000000 0.384000 -0.648000 0.648000
+0.000000 -0.251000 0.031300 0.424000 -0.232000 0.872000
+0.000000 -0.299000 0.000000 0.440000 -0.464000 0.760000
+0.050000 -0.251000 0.003400 0.512000 0.320000 0.792000
+0.050000 -0.253500 0.000000 0.448000 -0.608000 0.648000
+0.054200 -0.251000 0.000000 0.552000 0.192000 0.800000
+0.050000 -0.286400 -0.060900 0.528000 -0.720000 0.440000
+0.100000 -0.251000 -0.044600 0.544000 -0.608000 0.568000
+0.100000 -0.256900 -0.060900 0.456000 -0.800000 0.368000
+0.050000 -0.286400 -0.060900 0.528000 -0.720000 0.440000
+0.100000 -0.284500 -0.121900 0.464000 -0.744000 0.472000
+0.050000 -0.301200 -0.085900 0.528000 -0.704000 0.464000
+0.074000 -0.301200 -0.121900 0.536000 -0.792000 0.264000
+0.100000 -0.284500 -0.121900 0.464000 -0.744000 0.472000
+0.088900 -0.301200 -0.182900 0.488000 -0.864000 0.072000
+0.100000 -0.295100 -0.182900 0.440000 -0.880000 0.144000
+0.091700 -0.301200 -0.243900 0.488000 -0.864000 -0.008000
+0.100000 -0.296900 -0.243900 0.408000 -0.912000 0.000000
+0.085600 -0.301200 -0.304800 0.544000 -0.768000 -0.320000
+0.100000 -0.292600 -0.304800 0.432000 -0.840000 -0.304000
+0.052200 -0.301200 -0.365800 0.552000 -0.720000 -0.416000
+0.100000 -0.263400 -0.365800 0.480000 -0.672000 -0.544000
+0.100000 -0.263400 -0.365800 0.480000 -0.672000 -0.544000
+-0.100000 -0.200800 0.005100 0.056000 0.344000 0.936000
+-0.100000 -0.200800 0.005100 0.056000 0.344000 0.936000
+-0.050000 -0.200800 0.008600 0.032000 0.536000 0.840000
+-0.100000 -0.188700 0.000000 0.176000 0.408000 0.888000
+-0.050000 -0.190400 0.000000 0.096000 0.648000 0.744000
+-0.100000 -0.150600 -0.019000 0.512000 0.456000 0.720000
+-0.050000 -0.150600 -0.033100 0.152000 0.512000 0.840000
+-0.050000 -0.190400 0.000000 0.096000 0.648000 0.744000
+0.000000 -0.150600 -0.047300 0.168000 0.600000 0.768000
+0.000000 -0.198800 0.000000 0.160000 0.688000 0.704000
+0.050000 -0.150600 -0.053500 0.160000 0.448000 0.872000
+0.006800 -0.200800 0.000000 0.232000 0.576000 0.776000
+0.050000 -0.200800 -0.016400 0.232000 0.648000 0.720000
+0.050000 -0.244100 0.000000 0.488000 0.320000 0.800000
+0.100000 -0.200800 -0.044900 0.416000 0.232000 0.872000
+0.054200 -0.251000 0.000000 0.552000 0.192000 0.800000
+0.100000 -0.251000 -0.044600 0.544000 -0.608000 0.568000
+0.100000 -0.251000 -0.044600 0.544000 -0.608000 0.568000
+-0.100000 -0.200800 0.005100 0.056000 0.344000 0.936000
+-0.100000 -0.200800 0.005100 0.056000 0.344000 0.936000
+-0.100000 -0.251000 0.029400 -0.128000 0.120000 0.976000
+-0.050000 -0.200800 0.008600 0.032000 0.536000 0.840000
+-0.050000 -0.251000 0.040700 0.136000 0.064000 0.984000
+0.000000 -0.200800 0.002300 0.160000 0.560000 0.808000
+0.000000 -0.251000 0.031300 0.424000 -0.232000 0.872000
+0.006800 -0.200800 0.000000 0.232000 0.576000 0.776000
+0.050000 -0.251000 0.003400 0.512000 0.320000 0.792000
+0.050000 -0.244100 0.000000 0.488000 0.320000 0.800000
+0.054200 -0.251000 0.000000 0.552000 0.192000 0.800000
+0.054200 -0.251000 0.000000 0.552000 0.192000 0.800000
+-0.050000 -0.190400 0.000000 0.096000 0.648000 0.744000
+-0.050000 -0.190400 0.000000 0.096000 0.648000 0.744000
+-0.050000 -0.200800 0.008600 0.032000 0.536000 0.840000
+0.000000 -0.198800 0.000000 0.160000 0.688000 0.704000
+0.000000 -0.200800 0.002300 0.160000 0.560000 0.808000
+0.006800 -0.200800 0.000000 0.232000 0.576000 0.776000
+0.006800 -0.200800 0.000000 0.232000 0.576000 0.776000
+0.500000 0.245700 0.000000 -0.568000 0.120000 0.808000
+0.500000 0.245700 0.000000 -0.568000 0.120000 0.808000
+0.500000 0.200800 0.008600 -0.576000 -0.176000 0.792000
+0.488800 0.200800 0.000000 -0.512000 0.024000 0.856000
+0.500000 0.181600 0.000000 -0.600000 -0.304000 0.728000
+0.500000 0.181600 0.000000 -0.600000 -0.304000 0.728000
+0.550000 0.174700 0.060900 -0.744000 -0.320000 0.576000
+0.550000 0.174700 0.060900 -0.744000 -0.320000 0.576000
+0.560700 0.150600 0.060900 -0.704000 -0.368000 0.592000
+0.550000 0.150600 0.048400 -0.632000 -0.416000 0.640000
+0.550000 0.150600 0.048400 -0.632000 -0.416000 0.640000
+0.641200 0.050200 0.060900 -0.600000 -0.608000 0.512000
+0.641200 0.050200 0.060900 -0.600000 -0.608000 0.512000
+0.600000 0.093600 0.060900 -0.624000 -0.616000 0.464000
+0.602900 0.050200 0.000000 -0.576000 -0.704000 0.400000
+0.600000 0.053300 0.000000 -0.472000 -0.712000 0.512000
+0.600000 0.050200 -0.005300 -0.440000 -0.752000 0.480000
+0.600000 0.050200 -0.005300 -0.440000 -0.752000 0.480000
+-0.915700 -0.150600 0.000000 -0.696000 -0.672000 0.232000
+-0.915700 -0.150600 0.000000 -0.696000 -0.672000 0.232000
+-0.950000 -0.123700 0.000000 -0.488000 -0.840000 0.216000
+-0.932400 -0.150600 -0.060900 -0.688000 -0.696000 0.176000
+-0.950000 -0.136200 -0.060900 -0.528000 -0.832000 0.152000
+-0.943100 -0.150600 -0.121900 -0.672000 -0.720000 0.120000
+-0.950000 -0.144800 -0.121900 -0.536000 -0.832000 0.120000
+-0.950000 -0.150600 -0.169000 -0.584000 -0.792000 0.136000
+-0.943100 -0.150600 -0.121900 -0.672000 -0.720000 0.120000
+-0.950000 -0.152700 -0.182900 -0.600000 -0.784000 0.144000
+-0.903800 -0.200800 -0.121900 -0.696000 -0.704000 0.120000
+-0.907400 -0.200800 -0.182900 -0.688000 -0.712000 0.072000
+-0.950000 -0.152700 -0.182900 -0.600000 -0.784000 0.144000
+-0.914100 -0.200800 -0.243900 -0.664000 -0.728000 0.128000
+-0.950000 -0.161800 -0.243900 -0.584000 -0.784000 0.176000
+-0.931500 -0.200800 -0.304800 -0.648000 -0.520000 -0.544000
+-0.950000 -0.180000 -0.304800 -0.552000 -0.600000 -0.568000
+-0.900000 -0.200800 -0.331500 -0.576000 -0.328000 -0.736000
+-0.950000 -0.150600 -0.330800 -0.416000 -0.432000 -0.792000
+-0.900000 -0.150600 -0.338300 -0.216000 -0.104000 -0.968000
+-0.900000 -0.200800 -0.331500 -0.576000 -0.328000 -0.736000
+-0.850000 -0.150600 -0.349400 0.072000 0.056000 -0.992000
+-0.850000 -0.200800 -0.351200 -0.168000 0.112000 -0.976000
+-0.800000 -0.150600 -0.340500 0.312000 0.288000 -0.896000
+-0.800000 -0.200800 -0.355700 0.080000 0.256000 -0.960000
+-0.750000 -0.150600 -0.317800 0.416000 0.384000 -0.816000
+-0.750000 -0.200800 -0.348300 0.272000 0.384000 -0.872000
+-0.731900 -0.150600 -0.304800 0.424000 0.400000 -0.808000
+-0.700000 -0.200800 -0.326900 0.208000 0.528000 -0.816000
+-0.700000 -0.175200 -0.304800 0.352000 0.528000 -0.768000
+-0.651700 -0.200800 -0.304800 0.320000 0.544000 -0.768000
+-0.700000 -0.150600 -0.284500 0.376000 0.392000 -0.832000
+-0.650000 -0.200800 -0.303800 0.136000 0.680000 -0.712000
+-0.650000 -0.150600 -0.267500 0.376000 0.464000 -0.792000
+-0.650000 -0.150600 -0.267500 0.376000 0.464000 -0.792000
+-0.895700 -0.200800 -0.060900 -0.864000 -0.480000 0.136000
+-0.895700 -0.200800 -0.060900 -0.864000 -0.480000 0.136000
+-0.882700 -0.200800 0.000000 -0.840000 -0.496000 0.192000
+-0.860100 -0.251000 -0.060900 -0.808000 -0.568000 0.112000
+-0.852600 -0.251000 0.000000 -0.800000 -0.568000 0.168000
+-0.852600 -0.251000 0.000000 -0.800000 -0.568000 0.168000
+-0.700000 -0.502100 -0.057900 -0.752000 -0.512000 0.400000
+-0.700000 -0.502100 -0.057900 -0.752000 -0.512000 0.400000
+-0.700000 -0.507800 -0.060900 -0.864000 -0.200000 0.448000
+-0.701200 -0.502100 -0.060900 -0.816000 -0.416000 0.392000
+-0.700000 -0.552300 -0.082500 -0.736000 -0.280000 0.608000
+-0.723300 -0.502100 -0.121900 -0.896000 -0.224000 0.368000
+-0.750000 -0.552300 -0.119400 0.072000 0.512000 0.848000
+-0.750000 -0.549900 -0.121900 0.080000 0.648000 0.752000
+-0.800000 -0.552300 -0.095900 0.424000 0.264000 0.864000
+-0.800000 -0.539500 -0.121900 0.176000 0.680000 0.704000
+-0.850000 -0.552300 -0.082300 -0.704000 -0.480000 0.504000
+-0.850000 -0.519700 -0.121900 0.200000 0.624000 0.752000
+-0.868200 -0.552300 -0.121900 -0.520000 -0.224000 0.816000
+-0.850000 -0.502100 -0.144600 0.400000 0.776000 0.480000
+-0.900000 -0.511500 -0.121900 -0.520000 -0.664000 0.528000
+-0.878700 -0.502100 -0.121900 0.408000 0.368000 0.832000
+-0.900000 -0.502100 -0.104000 -0.752000 0.000000 0.656000
+-0.900000 -0.492700 -0.121900 -0.520000 0.712000 0.448000
+-0.906100 -0.502100 -0.121900 -0.920000 0.072000 0.376000
+-0.900000 -0.462200 -0.182900 0.320000 0.888000 0.304000
+-0.925200 -0.502100 -0.182900 -0.976000 -0.008000 0.208000
+-0.900000 -0.451900 -0.229200 0.512000 0.832000 0.168000
+-0.929300 -0.502100 -0.243900 -0.992000 0.064000 -0.008000
+-0.921000 -0.451900 -0.243900 -0.184000 0.968000 0.160000
+-0.920600 -0.502100 -0.304800 -0.888000 -0.288000 -0.344000
+-0.912200 -0.451900 -0.304800 -0.496000 0.720000 -0.464000
+-0.900000 -0.502100 -0.352600 -0.672000 0.128000 -0.720000
+-0.900000 -0.451900 -0.318500 0.104000 0.872000 -0.464000
+-0.864000 -0.502100 -0.365800 -0.304000 0.480000 -0.816000
+-0.891000 -0.451900 -0.304800 0.528000 0.824000 -0.192000
+-0.850000 -0.496800 -0.365800 -0.176000 0.616000 -0.760000
+-0.850000 -0.473200 -0.304800 0.272000 0.896000 -0.336000
+-0.800000 -0.496400 -0.365800 -0.664000 0.416000 -0.608000
+-0.800000 -0.473000 -0.304800 -0.736000 0.648000 -0.168000
+-0.786000 -0.451900 -0.365800 -0.872000 0.080000 -0.472000
+-0.787800 -0.451900 -0.304800 -0.984000 0.136000 -0.040000
+-0.796500 -0.401700 -0.365800 -0.952000 -0.168000 -0.232000
+-0.797400 -0.401700 -0.304800 -0.928000 -0.344000 0.056000
+-0.800000 -0.388500 -0.365800 -0.864000 -0.288000 -0.400000
+-0.800000 -0.395700 -0.304800 -0.920000 -0.376000 0.000000
+-0.797400 -0.401700 -0.304800 -0.928000 -0.344000 0.056000
+-0.800000 -0.365300 -0.243900 -0.880000 -0.440000 0.160000
+-0.781800 -0.401700 -0.243900 -0.912000 -0.336000 0.208000
+-0.800000 -0.355500 -0.182900 -0.872000 -0.472000 0.032000
+-0.775200 -0.401700 -0.182900 -0.904000 -0.400000 0.120000
+-0.800000 -0.354700 -0.121900 -0.848000 -0.512000 0.080000
+-0.771000 -0.401700 -0.121900 -0.872000 -0.456000 0.128000
+-0.800000 -0.351500 -0.101400 -0.840000 -0.528000 0.104000
+-0.762700 -0.401700 -0.060900 -0.840000 -0.496000 0.168000
+-0.794800 -0.351500 -0.060900 -0.816000 -0.552000 0.144000
+-0.800000 -0.351500 -0.101400 -0.840000 -0.528000 0.104000
+-0.800000 -0.343900 -0.060900 -0.816000 -0.552000 0.128000
+-0.800000 -0.343900 -0.060900 -0.816000 -0.552000 0.128000
+-0.700000 0.150600 -0.043600 0.552000 0.712000 0.424000
+-0.700000 0.150600 -0.043600 0.552000 0.712000 0.424000
+-0.700000 0.159000 -0.060900 0.600000 0.776000 0.184000
+-0.689800 0.150600 -0.060900 0.640000 0.736000 0.192000
+-0.700000 0.150600 -0.089800 0.592000 0.744000 -0.280000
+-0.650000 0.112000 -0.060900 0.672000 0.704000 0.200000
+-0.700000 0.140000 -0.121900 0.536000 0.728000 -0.408000
+-0.650000 0.100400 -0.098000 0.720000 0.624000 -0.288000
+-0.657700 0.100400 -0.121900 0.728000 0.576000 -0.360000
+-0.650000 0.089500 -0.121900 0.728000 0.552000 -0.384000
+-0.700000 0.100400 -0.182100 0.536000 0.592000 -0.592000
+-0.650000 0.050200 -0.178200 0.664000 0.544000 -0.504000
+-0.700000 0.099700 -0.182900 0.504000 0.560000 -0.640000
+-0.652800 0.050200 -0.182900 0.592000 0.536000 -0.592000
+-0.700000 0.050200 -0.235800 0.504000 0.432000 -0.744000
+-0.650000 0.045800 -0.182900 0.672000 0.432000 -0.592000
+-0.700000 0.037400 -0.243900 0.440000 0.392000 -0.800000
+-0.650000 0.000000 -0.224600 0.632000 0.368000 -0.672000
+-0.669700 0.000000 -0.243900 0.480000 0.312000 -0.808000
+-0.700000 0.037400 -0.243900 0.440000 0.392000 -0.800000
+-0.700000 0.000000 -0.262900 0.392000 0.288000 -0.864000
+-0.700000 0.000000 -0.262900 0.392000 0.288000 -0.864000
+-0.650000 -0.541900 0.000000 -0.528000 -0.600000 0.592000
+-0.650000 -0.541900 0.000000 -0.528000 -0.600000 0.592000
+-0.633400 -0.552300 0.000000 -0.384000 -0.672000 0.624000
+-0.650000 -0.552300 -0.012600 -0.496000 -0.592000 0.624000
+-0.650000 -0.552300 -0.012600 -0.496000 -0.592000 0.624000
+-0.452400 -0.100400 -0.060900 -0.344000 0.936000 -0.016000
+-0.452400 -0.100400 -0.060900 -0.344000 0.936000 -0.016000
+-0.450000 -0.099400 -0.060900 -0.760000 0.616000 0.160000
+-0.450000 -0.100400 -0.057100 -0.400000 0.872000 0.264000
+-0.406900 -0.050200 -0.060900 -0.848000 0.520000 0.000000
+-0.434300 -0.100400 0.000000 -0.648000 0.720000 0.208000
+-0.400000 -0.050200 -0.003200 -0.712000 0.672000 0.168000
+-0.400000 -0.050900 0.000000 -0.776000 0.576000 0.224000
+-0.399300 -0.050200 0.000000 -0.696000 0.680000 0.184000
+-0.399300 -0.050200 0.000000 -0.696000 0.680000 0.184000
+-0.466200 -0.502100 0.000000 0.712000 -0.616000 0.320000
+-0.466200 -0.502100 0.000000 0.712000 -0.616000 0.320000
+-0.450000 -0.489500 0.000000 0.584000 -0.760000 0.264000
+-0.450000 -0.502100 -0.045100 0.560000 -0.696000 0.432000
+-0.403800 -0.451900 0.000000 0.744000 -0.560000 0.352000
+-0.400000 -0.502100 -0.024700 0.848000 -0.224000 0.464000
+-0.400000 -0.451900 -0.009600 0.744000 -0.536000 0.376000
+-0.403800 -0.451900 0.000000 0.744000 -0.560000 0.352000
+-0.400000 -0.447100 0.000000 0.720000 -0.584000 0.344000
+-0.400000 -0.451900 -0.009600 0.744000 -0.536000 0.376000
+-0.350000 -0.427600 0.000000 0.560000 -0.752000 0.336000
+-0.350000 -0.451900 -0.058800 0.248000 -0.624000 0.728000
+-0.350000 -0.451900 -0.058800 0.248000 -0.624000 0.728000
+-0.500000 -0.552300 -0.009400 0.352000 -0.840000 0.400000
+-0.500000 -0.552300 -0.009400 0.352000 -0.840000 0.400000
+-0.478800 -0.552300 -0.060900 0.704000 -0.592000 0.376000
+-0.500000 -0.570000 -0.060900 0.480000 -0.800000 0.328000
+-0.452200 -0.552300 -0.121900 0.864000 0.184000 0.464000
+-0.500000 -0.589900 -0.121900 0.408000 -0.832000 0.352000
+-0.450000 -0.552300 -0.127200 0.616000 -0.144000 0.768000
+-0.500000 -0.602500 -0.155300 0.000000 -0.920000 0.376000
+-0.450000 -0.558900 -0.121900 0.808000 0.320000 0.488000
+-0.474100 -0.602500 -0.121900 -0.520000 -0.712000 0.456000
+-0.450000 -0.602500 -0.084100 -0.232000 -0.736000 0.624000
+-0.450000 -0.612400 -0.121900 0.032000 -0.944000 0.312000
+-0.410500 -0.602500 -0.121900 0.456000 -0.632000 0.616000
+-0.450000 -0.629600 -0.182900 -0.344000 -0.872000 0.320000
+-0.400000 -0.602500 -0.131300 0.560000 -0.576000 0.584000
+-0.400000 -0.651500 -0.182900 -0.552000 -0.472000 0.672000
+-0.386500 -0.602500 -0.182900 0.376000 -0.032000 0.920000
+-0.400000 -0.652700 -0.184800 -0.640000 -0.536000 0.536000
+-0.350000 -0.647900 -0.182900 0.008000 0.768000 0.624000
+-0.396000 -0.652700 -0.182900 -0.176000 0.000000 0.984000
+-0.350000 -0.652700 -0.168800 -0.864000 0.056000 0.488000
+-0.350700 -0.703000 -0.182900 -0.792000 -0.176000 0.576000
+-0.350000 -0.703000 -0.180700 -0.616000 -0.504000 0.592000
+-0.350000 -0.704300 -0.182900 -0.112000 -0.808000 0.576000
+-0.300000 -0.703000 -0.173800 0.616000 -0.544000 0.552000
+-0.300000 -0.708000 -0.182900 0.360000 -0.768000 0.520000
+-0.293800 -0.703000 -0.182900 0.608000 -0.624000 0.488000
+-0.300000 -0.736500 -0.243900 0.320000 -0.832000 0.440000
+-0.256000 -0.703000 -0.243900 0.696000 -0.392000 0.584000
+-0.300000 -0.753200 -0.286100 0.088000 -0.928000 0.352000
+-0.250000 -0.703000 -0.252700 0.704000 -0.368000 0.600000
+-0.281500 -0.753200 -0.304800 0.312000 -0.920000 -0.216000
+-0.250000 -0.737300 -0.304800 0.568000 -0.808000 -0.112000
+-0.300000 -0.753200 -0.317300 0.136000 -0.840000 -0.512000
+-0.250000 -0.703000 -0.346500 0.432000 -0.280000 -0.848000
+-0.300000 -0.703000 -0.365100 0.056000 -0.232000 -0.968000
+-0.250000 -0.652700 -0.361600 0.240000 -0.216000 -0.944000
+-0.300000 -0.687100 -0.365800 0.104000 -0.048000 -0.992000
+-0.282800 -0.652700 -0.365800 0.080000 -0.160000 -0.976000
+-0.300000 -0.652700 -0.367500 0.064000 -0.112000 -0.984000
+-0.300000 -0.687100 -0.365800 0.104000 -0.048000 -0.992000
+-0.350000 -0.652700 -0.376000 0.560000 0.160000 -0.808000
+-0.350000 -0.679200 -0.365800 -0.072000 -0.176000 -0.976000
+-0.400000 -0.652700 -0.368100 -0.128000 -0.872000 -0.456000
+-0.400000 -0.653700 -0.365800 -0.176000 -0.888000 -0.416000
+-0.405700 -0.652700 -0.365800 -0.144000 -0.920000 -0.344000
+-0.400000 -0.672200 -0.304800 -0.400000 -0.904000 -0.128000
+-0.450000 -0.652700 -0.319500 -0.256000 -0.952000 -0.136000
+-0.450000 -0.654300 -0.304800 -0.272000 -0.952000 0.040000
+-0.455200 -0.652700 -0.304800 -0.280000 -0.952000 0.040000
+-0.450000 -0.652700 -0.293400 -0.288000 -0.936000 0.160000
+-0.500000 -0.637800 -0.304800 -0.208000 -0.976000 -0.032000
+-0.450000 -0.644000 -0.243900 -0.352000 -0.912000 0.200000
+-0.500000 -0.625200 -0.243900 -0.096000 -0.960000 0.240000
+-0.450000 -0.629600 -0.182900 -0.344000 -0.872000 0.320000
+-0.500000 -0.610400 -0.182900 -0.136000 -0.936000 0.304000
+-0.450000 -0.612400 -0.121900 0.032000 -0.944000 0.312000
+-0.500000 -0.602500 -0.155300 0.000000 -0.920000 0.376000
+-0.474100 -0.602500 -0.121900 -0.520000 -0.712000 0.456000
+-0.474100 -0.602500 -0.121900 -0.520000 -0.712000 0.456000
+-0.350000 0.148000 -0.060900 -0.504000 0.552000 0.656000
+-0.350000 0.148000 -0.060900 -0.504000 0.552000 0.656000
+-0.350000 0.100400 -0.017600 -0.744000 0.352000 0.552000
+-0.361800 0.100400 -0.060900 -0.920000 0.112000 -0.352000
+-0.350000 0.077100 0.000000 -0.776000 0.256000 0.568000
+-0.358600 0.050200 -0.060900 -0.920000 0.168000 -0.328000
+-0.355100 0.050200 0.000000 -0.872000 0.216000 0.416000
+-0.355100 0.050200 0.000000 -0.872000 0.216000 0.416000
+-0.307400 0.401700 -0.060900 -0.696000 0.688000 -0.152000
+-0.307400 0.401700 -0.060900 -0.696000 0.688000 -0.152000
+-0.300000 0.408800 -0.060900 -0.664000 0.712000 -0.184000
+-0.300000 0.401700 -0.053800 -0.512000 0.520000 0.672000
+-0.250000 0.447500 -0.060900 -0.512000 0.744000 0.408000
+-0.250000 0.401700 -0.023000 -0.400000 -0.016000 0.912000
+-0.242600 0.451900 -0.060900 -0.440000 0.728000 0.512000
+-0.208400 0.401700 0.000000 -0.424000 0.248000 0.864000
+-0.200000 0.451900 -0.034900 -0.360000 0.584000 0.720000
+-0.200000 0.408700 0.000000 -0.112000 0.496000 0.856000
+-0.150000 0.451900 -0.004000 -0.136000 0.584000 0.792000
+-0.185900 0.401700 0.000000 0.264000 0.248000 0.928000
+-0.150000 0.401700 -0.011900 0.240000 0.256000 0.928000
+-0.150000 0.451900 -0.004000 -0.136000 0.584000 0.792000
+-0.100000 0.401700 -0.042400 0.232000 -0.088000 0.960000
+-0.100000 0.451900 -0.019200 0.136000 0.056000 0.984000
+-0.050000 0.401700 -0.052300 0.176000 0.040000 0.976000
+-0.050000 0.451900 -0.049700 0.432000 0.024000 0.896000
+-0.100000 0.451900 -0.019200 0.136000 0.056000 0.984000
+-0.050000 0.502100 -0.046900 0.400000 0.496000 0.760000
+-0.100000 0.502100 -0.041900 -0.080000 0.528000 0.840000
+-0.050000 0.515300 -0.060900 0.432000 0.792000 0.408000
+-0.100000 0.517800 -0.060900 -0.120000 0.976000 0.136000
+-0.100000 0.502100 -0.041900 -0.080000 0.528000 0.840000
+-0.146800 0.502100 -0.060900 -0.272000 0.960000 0.016000
+-0.100000 0.451900 -0.019200 0.136000 0.056000 0.984000
+-0.150000 0.501300 -0.060900 -0.376000 0.880000 -0.280000
+-0.150000 0.451900 -0.004000 -0.136000 0.584000 0.792000
+-0.200000 0.477600 -0.060900 -0.544000 0.808000 -0.208000
+-0.200000 0.451900 -0.034900 -0.360000 0.584000 0.720000
+-0.242600 0.451900 -0.060900 -0.440000 0.728000 0.512000
+-0.200000 0.477600 -0.060900 -0.544000 0.808000 -0.208000
+-0.200000 0.451900 -0.081300 -0.400000 0.504000 -0.752000
+-0.200000 0.451900 -0.081300 -0.400000 0.504000 -0.752000
+-0.321000 0.100400 0.000000 -0.264000 0.416000 0.864000
+-0.321000 0.100400 0.000000 -0.264000 0.416000 0.864000
+-0.350000 0.077100 0.000000 -0.776000 0.256000 0.568000
+-0.350000 0.100400 -0.017600 -0.744000 0.352000 0.552000
+-0.350000 0.100400 -0.017600 -0.744000 0.352000 0.552000
+-0.250000 0.351500 -0.004200 0.040000 0.000000 0.992000
+-0.250000 0.351500 -0.004200 0.040000 0.000000 0.992000
+-0.300000 0.351500 -0.024700 -0.384000 0.216000 0.896000
+-0.250000 0.301200 -0.005700 0.112000 -0.104000 0.984000
+-0.300000 0.301200 -0.020200 -0.184000 0.032000 0.976000
+-0.250000 0.251000 -0.029400 0.176000 -0.456000 0.864000
+-0.300000 0.251000 -0.020200 0.208000 -0.160000 0.960000
+-0.250000 0.219300 -0.060900 0.304000 -0.640000 0.696000
+-0.300000 0.200800 -0.040500 0.440000 0.208000 0.864000
+-0.277600 0.200800 -0.060900 0.584000 -0.072000 0.800000
+-0.250000 0.219300 -0.060900 0.304000 -0.640000 0.696000
+-0.250000 0.200800 -0.094600 -0.184000 -0.064000 0.976000
+-0.200000 0.206100 -0.060900 -0.448000 -0.184000 0.872000
+-0.200000 0.200800 -0.062300 -0.304000 0.376000 0.864000
+-0.198000 0.200800 -0.060900 -0.464000 0.288000 0.832000
+-0.200000 0.199100 -0.060900 -0.320000 0.504000 0.792000
+-0.200000 0.200800 -0.062300 -0.304000 0.376000 0.864000
+-0.250000 0.177000 -0.060900 -0.096000 0.568000 0.808000
+-0.250000 0.200800 -0.094600 -0.184000 -0.064000 0.976000
+-0.277600 0.200800 -0.060900 0.584000 -0.072000 0.800000
+-0.277600 0.200800 -0.060900 0.584000 -0.072000 0.800000
+-0.250000 -0.351500 -0.038300 0.104000 -0.504000 0.848000
+-0.250000 -0.351500 -0.038300 0.104000 -0.504000 0.848000
+-0.300000 -0.351500 -0.012600 0.872000 -0.352000 0.320000
+-0.250000 -0.401700 -0.058800 -0.096000 -0.136000 0.984000
+-0.300000 -0.401700 -0.045100 0.792000 -0.248000 0.544000
+-0.250000 -0.451900 -0.040500 -0.352000 -0.008000 0.928000
+-0.300000 -0.435300 -0.060900 -0.192000 -0.360000 0.912000
+-0.287100 -0.451900 -0.060900 -0.448000 -0.328000 0.824000
+-0.300000 -0.451900 -0.070300 -0.328000 -0.392000 0.856000
+-0.279200 -0.502100 -0.060900 -0.688000 -0.328000 0.640000
+-0.300000 -0.502100 -0.097100 -0.592000 -0.576000 0.560000
+-0.250000 -0.533000 -0.060900 -0.336000 -0.760000 0.544000
+-0.300000 -0.516400 -0.121900 -0.256000 -0.872000 0.400000
+-0.250000 -0.552300 -0.101500 -0.080000 -0.904000 0.400000
+-0.260200 -0.552300 -0.121900 -0.560000 -0.752000 0.336000
+-0.250000 -0.559400 -0.121900 -0.088000 -0.912000 0.384000
+-0.285200 -0.552300 -0.182900 -0.616000 -0.680000 0.384000
+-0.250000 -0.581300 -0.182900 -0.104000 -0.888000 0.440000
+-0.300000 -0.552300 -0.209900 -0.624000 -0.616000 0.456000
+-0.250000 -0.602500 -0.226600 0.288000 -0.512000 0.800000
+-0.300000 -0.594300 -0.243900 -0.424000 -0.464000 0.768000
+-0.286800 -0.602500 -0.243900 -0.320000 0.232000 0.912000
+-0.300000 -0.602500 -0.250000 -0.408000 0.368000 0.824000
+-0.300000 -0.607200 -0.243900 -0.248000 0.672000 0.688000
+-0.344900 -0.602500 -0.304800 -0.744000 0.664000 -0.032000
+-0.350000 -0.630200 -0.243900 -0.144000 0.776000 0.600000
+-0.350000 -0.605300 -0.304800 0.248000 0.960000 -0.032000
+-0.371400 -0.602500 -0.243900 0.928000 0.016000 0.352000
+-0.351600 -0.602500 -0.304800 0.944000 0.304000 0.024000
+-0.363900 -0.552300 -0.243900 0.816000 -0.480000 0.304000
+-0.350000 -0.594300 -0.304800 0.520000 -0.800000 0.280000
+-0.350000 -0.552300 -0.283400 -0.096000 -0.680000 0.720000
+-0.344900 -0.602500 -0.304800 -0.744000 0.664000 -0.032000
+-0.317500 -0.552300 -0.243900 -0.600000 -0.648000 0.448000
+-0.300000 -0.602500 -0.250000 -0.408000 0.368000 0.824000
+-0.300000 -0.594300 -0.243900 -0.424000 -0.464000 0.768000
+-0.317500 -0.552300 -0.243900 -0.600000 -0.648000 0.448000
+-0.300000 -0.552300 -0.209900 -0.624000 -0.616000 0.456000
+-0.350000 -0.535600 -0.243900 0.360000 -0.840000 0.384000
+-0.300000 -0.538300 -0.182900 -0.584000 -0.696000 0.408000
+-0.350000 -0.518400 -0.182900 -0.088000 -0.928000 0.360000
+-0.300000 -0.516400 -0.121900 -0.256000 -0.872000 0.400000
+-0.350000 -0.503000 -0.121900 0.232000 -0.880000 0.400000
+-0.300000 -0.502100 -0.097100 -0.592000 -0.576000 0.560000
+-0.350000 -0.502100 -0.119400 0.240000 -0.864000 0.424000
+-0.300000 -0.451900 -0.070300 -0.328000 -0.392000 0.856000
+-0.350000 -0.453900 -0.060900 0.248000 -0.624000 0.728000
+-0.338500 -0.451900 -0.060900 0.112000 -0.632000 0.760000
+-0.300000 -0.451900 -0.070300 -0.328000 -0.392000 0.856000
+-0.300000 -0.435300 -0.060900 -0.192000 -0.360000 0.912000
+-0.300000 -0.435300 -0.060900 -0.192000 -0.360000 0.912000
+-0.287100 -0.451900 -0.060900 -0.448000 -0.328000 0.824000
+-0.287100 -0.451900 -0.060900 -0.448000 -0.328000 0.824000
+-0.279200 -0.502100 -0.060900 -0.688000 -0.328000 0.640000
+-0.250000 -0.451900 -0.040500 -0.352000 -0.008000 0.928000
+-0.250000 -0.502100 -0.016400 -0.320000 -0.344000 0.872000
+-0.200000 -0.451900 -0.018000 0.376000 -0.112000 0.912000
+-0.200000 -0.502100 -0.039000 0.512000 -0.608000 0.592000
+-0.250000 -0.502100 -0.016400 -0.320000 -0.344000 0.872000
+-0.200000 -0.511900 -0.060900 0.416000 -0.800000 0.424000
+-0.250000 -0.533000 -0.060900 -0.336000 -0.760000 0.544000
+-0.200000 -0.534300 -0.121900 0.456000 -0.832000 0.296000
+-0.250000 -0.552300 -0.101500 -0.080000 -0.904000 0.400000
+-0.235800 -0.552300 -0.121900 0.448000 -0.816000 0.336000
+-0.250000 -0.559400 -0.121900 -0.088000 -0.912000 0.384000
+-0.204600 -0.552300 -0.182900 0.504000 -0.776000 0.360000
+-0.250000 -0.581300 -0.182900 -0.104000 -0.888000 0.440000
+-0.200000 -0.552300 -0.190900 0.520000 -0.768000 0.360000
+-0.250000 -0.602500 -0.226600 0.288000 -0.512000 0.800000
+-0.200000 -0.579600 -0.243900 0.568000 -0.648000 0.496000
+-0.233200 -0.602500 -0.243900 0.608000 -0.320000 0.720000
+-0.200000 -0.602500 -0.268600 0.488000 -0.432000 0.752000
+-0.241600 -0.652700 -0.243900 0.680000 -0.216000 0.688000
+-0.200000 -0.652700 -0.286600 0.488000 -0.272000 0.824000
+-0.250000 -0.679700 -0.243900 0.728000 -0.208000 0.640000
+-0.200000 -0.693500 -0.304800 0.872000 -0.464000 -0.120000
+-0.250000 -0.703000 -0.252700 0.704000 -0.368000 0.600000
+-0.204300 -0.703000 -0.304800 0.856000 -0.496000 -0.088000
+-0.250000 -0.737300 -0.304800 0.568000 -0.808000 -0.112000
+-0.250000 -0.703000 -0.346500 0.432000 -0.280000 -0.848000
+-0.204300 -0.703000 -0.304800 0.856000 -0.496000 -0.088000
+-0.250000 -0.652700 -0.361600 0.240000 -0.216000 -0.944000
+-0.200000 -0.693500 -0.304800 0.872000 -0.464000 -0.120000
+-0.200000 -0.652700 -0.326500 0.488000 -0.272000 -0.824000
+-0.171500 -0.652700 -0.304800 0.576000 -0.304000 0.752000
+-0.200000 -0.693500 -0.304800 0.872000 -0.464000 -0.120000
+-0.200000 -0.652700 -0.286600 0.488000 -0.272000 0.824000
+-0.200000 -0.652700 -0.286600 0.488000 -0.272000 0.824000
+-0.279200 -0.502100 -0.060900 -0.688000 -0.328000 0.640000
+-0.279200 -0.502100 -0.060900 -0.688000 -0.328000 0.640000
+-0.250000 -0.502100 -0.016400 -0.320000 -0.344000 0.872000
+-0.250000 -0.533000 -0.060900 -0.336000 -0.760000 0.544000
+-0.250000 -0.533000 -0.060900 -0.336000 -0.760000 0.544000
+-0.200000 0.351500 -0.009600 0.208000 -0.208000 0.952000
+-0.200000 0.351500 -0.009600 0.208000 -0.208000 0.952000
+-0.250000 0.351500 -0.004200 0.040000 0.000000 0.992000
+-0.200000 0.301200 -0.022600 0.056000 -0.176000 0.976000
+-0.250000 0.301200 -0.005700 0.112000 -0.104000 0.984000
+-0.200000 0.251000 -0.048300 -0.120000 -0.296000 0.944000
+-0.250000 0.251000 -0.029400 0.176000 -0.456000 0.864000
+-0.200000 0.206100 -0.060900 -0.448000 -0.184000 0.872000
+-0.250000 0.219300 -0.060900 0.304000 -0.640000 0.696000
+-0.250000 0.219300 -0.060900 0.304000 -0.640000 0.696000
+-0.200000 -0.351500 -0.031500 -0.320000 -0.128000 0.936000
+-0.200000 -0.351500 -0.031500 -0.320000 -0.128000 0.936000
+-0.250000 -0.351500 -0.038300 0.104000 -0.504000 0.848000
+-0.200000 -0.401700 -0.023400 -0.056000 -0.008000 0.992000
+-0.250000 -0.401700 -0.058800 -0.096000 -0.136000 0.984000
+-0.200000 -0.451900 -0.018000 0.376000 -0.112000 0.912000
+-0.250000 -0.451900 -0.040500 -0.352000 -0.008000 0.928000
+-0.250000 -0.451900 -0.040500 -0.352000 -0.008000 0.928000
+-0.200000 0.150600 -0.023100 -0.360000 0.472000 0.792000
+-0.200000 0.150600 -0.023100 -0.360000 0.472000 0.792000
+-0.200000 0.100400 -0.008800 0.176000 0.488000 0.848000
+-0.150000 0.150600 -0.037800 0.256000 -0.016000 0.960000
+-0.150000 0.100400 -0.027500 0.432000 0.296000 0.848000
+-0.114400 0.150600 -0.060900 0.520000 -0.344000 0.776000
+-0.122500 0.100400 -0.060900 0.768000 -0.048000 0.624000
+-0.100000 0.150600 -0.075000 0.592000 -0.416000 0.688000
+-0.100000 0.100400 -0.099400 0.760000 -0.264000 0.584000
+-0.067900 0.150600 -0.121900 0.736000 -0.432000 0.504000
+-0.089100 0.100400 -0.121900 0.816000 -0.232000 0.520000
+-0.050000 0.150600 -0.159500 0.712000 -0.480000 0.504000
+-0.053800 0.100400 -0.182900 0.984000 -0.072000 0.112000
+-0.050000 0.116900 -0.182900 0.944000 -0.304000 0.048000
+-0.051400 0.100400 -0.243900 0.776000 0.216000 -0.576000
+-0.050000 0.150600 -0.210200 0.840000 -0.208000 -0.496000
+-0.077600 0.150600 -0.243900 0.320000 0.328000 -0.880000
+-0.051400 0.100400 -0.243900 0.776000 0.216000 -0.576000
+-0.100000 0.150600 -0.251000 -0.024000 0.408000 -0.904000
+-0.100000 0.100400 -0.276400 0.032000 0.376000 -0.920000
+-0.126800 0.150600 -0.243900 -0.208000 0.496000 -0.832000
+-0.150000 0.100400 -0.267100 -0.312000 0.440000 -0.832000
+-0.150000 0.141700 -0.243900 -0.352000 0.528000 -0.768000
+-0.198500 0.100400 -0.243900 -0.376000 0.480000 -0.784000
+-0.150000 0.100400 -0.267100 -0.312000 0.440000 -0.832000
+-0.200000 0.099300 -0.243900 -0.456000 0.488000 -0.736000
+-0.150000 0.050200 -0.299600 -0.080000 0.408000 -0.904000
+-0.200000 0.050200 -0.277000 -0.312000 0.416000 -0.848000
+-0.150000 0.040500 -0.304800 -0.136000 0.416000 -0.896000
+-0.200000 0.008900 -0.304800 -0.304000 0.456000 -0.832000
+-0.150000 0.000000 -0.322200 0.064000 0.240000 -0.968000
+-0.200000 0.000000 -0.310700 -0.288000 0.424000 -0.848000
+-0.150000 -0.050200 -0.328000 0.128000 0.064000 -0.984000
+-0.200000 -0.050200 -0.330400 -0.144000 0.264000 -0.944000
+-0.150000 -0.100400 -0.338700 0.056000 -0.088000 -0.992000
+-0.200000 -0.100400 -0.330100 -0.024000 -0.008000 -0.992000
+-0.150000 -0.150600 -0.309500 -0.032000 -0.400000 -0.912000
+-0.200000 -0.150600 -0.333300 0.216000 -0.272000 -0.936000
+-0.200000 -0.100400 -0.330100 -0.024000 -0.008000 -0.992000
+-0.250000 -0.150600 -0.327500 -0.120000 0.152000 -0.976000
+-0.250000 -0.100400 -0.327300 -0.384000 0.152000 -0.904000
+-0.200000 -0.100400 -0.330100 -0.024000 -0.008000 -0.992000
+-0.250000 -0.050200 -0.318700 -0.440000 0.320000 -0.832000
+-0.200000 -0.050200 -0.330400 -0.144000 0.264000 -0.944000
+-0.250000 -0.028200 -0.304800 -0.400000 0.416000 -0.808000
+-0.200000 0.000000 -0.310700 -0.288000 0.424000 -0.848000
+-0.213400 0.000000 -0.304800 -0.304000 0.448000 -0.832000
+-0.200000 0.008900 -0.304800 -0.304000 0.456000 -0.832000
+-0.250000 0.000000 -0.286200 -0.320000 0.712000 -0.616000
+-0.200000 0.050200 -0.277000 -0.312000 0.416000 -0.848000
+-0.250000 0.050200 -0.254100 -0.584000 0.656000 -0.464000
+-0.200000 0.099300 -0.243900 -0.456000 0.488000 -0.736000
+-0.250000 0.055800 -0.243900 -0.560000 0.648000 -0.504000
+-0.250000 0.050200 -0.254100 -0.584000 0.656000 -0.464000
+-0.256300 0.050200 -0.243900 -0.592000 0.624000 -0.488000
+-0.256300 0.050200 -0.243900 -0.592000 0.624000 -0.488000
+-0.200000 -0.502100 -0.039000 0.512000 -0.608000 0.592000
+-0.200000 -0.502100 -0.039000 0.512000 -0.608000 0.592000
+-0.181900 -0.502100 -0.060900 0.504000 -0.680000 0.520000
+-0.200000 -0.511900 -0.060900 0.416000 -0.800000 0.424000
+-0.200000 -0.511900 -0.060900 0.416000 -0.800000 0.424000
+-0.100000 0.401700 -0.042400 0.232000 -0.088000 0.960000
+-0.100000 0.401700 -0.042400 0.232000 -0.088000 0.960000
+-0.150000 0.401700 -0.011900 0.240000 0.256000 0.928000
+-0.100000 0.351500 -0.035500 0.120000 0.000000 0.992000
+-0.150000 0.351500 -0.029900 0.096000 -0.168000 0.976000
+-0.100000 0.301200 -0.032000 0.168000 0.008000 0.984000
+-0.150000 0.301200 -0.033800 0.040000 -0.024000 0.992000
+-0.100000 0.251000 -0.029400 0.344000 -0.104000 0.928000
+-0.150000 0.251000 -0.027500 -0.136000 -0.104000 0.984000
+-0.100000 0.200800 -0.041900 0.456000 -0.304000 0.832000
+-0.150000 0.200800 -0.027500 -0.320000 -0.168000 0.928000
+-0.100000 0.167200 -0.060900 0.520000 -0.424000 0.736000
+-0.150000 0.150600 -0.037800 0.256000 -0.016000 0.960000
+-0.114400 0.150600 -0.060900 0.520000 -0.344000 0.776000
+-0.100000 0.167200 -0.060900 0.520000 -0.424000 0.736000
+-0.100000 0.150600 -0.075000 0.592000 -0.416000 0.688000
+-0.078700 0.200800 -0.060900 0.568000 -0.416000 0.704000
+-0.067900 0.150600 -0.121900 0.736000 -0.432000 0.504000
+-0.050000 0.200800 -0.090500 0.520000 -0.520000 0.672000
+-0.050000 0.170300 -0.121900 0.584000 -0.576000 0.560000
+-0.067900 0.150600 -0.121900 0.736000 -0.432000 0.504000
+-0.050000 0.150600 -0.159500 0.712000 -0.480000 0.504000
+-0.050000 0.150600 -0.159500 0.712000 -0.480000 0.504000
+-0.150000 0.100400 -0.027500 0.432000 0.296000 0.848000
+-0.150000 0.100400 -0.027500 0.432000 0.296000 0.848000
+-0.150000 0.050200 -0.012600 0.624000 0.240000 0.728000
+-0.122500 0.100400 -0.060900 0.768000 -0.048000 0.624000
+-0.123500 0.050200 -0.060900 0.888000 -0.104000 0.440000
+-0.100000 0.100400 -0.099400 0.760000 -0.264000 0.584000
+-0.100700 0.050200 -0.121900 0.856000 0.048000 0.504000
+-0.100000 0.054100 -0.121900 0.816000 -0.176000 0.544000
+-0.100000 0.050200 -0.123300 0.696000 -0.176000 0.688000
+-0.089100 0.100400 -0.121900 0.816000 -0.232000 0.520000
+-0.051100 0.050200 -0.182900 0.712000 0.184000 0.664000
+-0.053800 0.100400 -0.182900 0.984000 -0.072000 0.112000
+-0.050000 0.050200 -0.189300 0.800000 0.488000 0.336000
+-0.051400 0.100400 -0.243900 0.776000 0.216000 -0.576000
+-0.050000 0.095100 -0.243900 0.808000 0.256000 -0.520000
+-0.100000 0.100400 -0.276400 0.032000 0.376000 -0.920000
+-0.050000 0.050200 -0.257500 0.608000 0.208000 -0.760000
+-0.100000 0.050200 -0.292200 0.304000 0.312000 -0.896000
+-0.050000 0.000000 -0.288000 0.256000 0.560000 -0.776000
+-0.100000 0.022400 -0.304800 0.184000 0.304000 -0.928000
+-0.077600 0.000000 -0.304800 0.248000 0.344000 -0.896000
+-0.100000 0.000000 -0.309600 0.168000 0.152000 -0.968000
+-0.050000 -0.015100 -0.304800 0.280000 0.536000 -0.784000
+-0.100000 -0.050200 -0.318600 0.080000 0.144000 -0.984000
+-0.050000 -0.050200 -0.321000 0.120000 0.280000 -0.944000
+-0.100000 -0.100400 -0.323700 -0.040000 -0.152000 -0.984000
+-0.050000 -0.100400 -0.342800 0.056000 -0.032000 -0.992000
+-0.100000 -0.150600 -0.315000 -0.456000 -0.064000 -0.880000
+-0.050000 -0.150600 -0.332400 0.016000 -0.080000 -0.992000
+-0.050000 -0.100400 -0.342800 0.056000 -0.032000 -0.992000
+0.000000 -0.150600 -0.318000 0.160000 0.016000 -0.984000
+0.000000 -0.100400 -0.336000 0.328000 -0.184000 -0.920000
+0.050000 -0.150600 -0.318000 0.352000 0.312000 -0.872000
+0.039400 -0.100400 -0.304800 0.408000 0.224000 -0.880000
+0.050000 -0.119800 -0.304800 0.416000 0.264000 -0.864000
+0.050000 -0.100400 -0.298100 0.360000 0.248000 -0.896000
+0.096000 -0.150600 -0.304800 0.176000 0.336000 -0.920000
+0.100000 -0.100400 -0.298900 0.040000 0.136000 -0.984000
+0.100000 -0.150600 -0.303900 -0.176000 0.088000 -0.976000
+0.114400 -0.100400 -0.304800 -0.344000 0.128000 -0.928000
+0.101900 -0.150600 -0.304800 -0.296000 0.368000 -0.872000
+0.100000 -0.150600 -0.303900 -0.176000 0.088000 -0.976000
+0.100000 -0.151600 -0.304800 -0.176000 0.536000 -0.816000
+0.096000 -0.150600 -0.304800 0.176000 0.336000 -0.920000
+0.096000 -0.150600 -0.304800 0.176000 0.336000 -0.920000
+-0.150000 0.050200 -0.012600 0.624000 0.240000 0.728000
+-0.150000 0.050200 -0.012600 0.624000 0.240000 0.728000
+-0.150000 0.000000 -0.001200 0.744000 0.064000 0.656000
+-0.123500 0.050200 -0.060900 0.888000 -0.104000 0.440000
+-0.120900 0.000000 -0.060900 0.800000 0.080000 0.592000
+-0.100700 0.050200 -0.121900 0.856000 0.048000 0.504000
+-0.100000 0.000000 -0.110200 0.808000 0.176000 0.552000
+-0.100000 0.044900 -0.121900 0.816000 0.112000 0.552000
+-0.089600 0.000000 -0.121900 0.568000 0.512000 0.632000
+-0.100000 0.050200 -0.123300 0.696000 -0.176000 0.688000
+-0.050000 0.000000 -0.158900 0.584000 0.336000 0.728000
+-0.051100 0.050200 -0.182900 0.712000 0.184000 0.664000
+-0.050000 0.047900 -0.182900 0.488000 0.480000 0.720000
+-0.050000 0.050200 -0.189300 0.800000 0.488000 0.336000
+0.000000 0.039200 -0.182900 0.256000 0.544000 0.792000
+0.000000 0.050200 -0.198900 0.168000 0.840000 0.504000
+0.050000 0.005700 -0.182900 0.312000 0.584000 0.744000
+0.046000 0.050200 -0.243900 0.728000 0.480000 -0.472000
+0.050000 0.042300 -0.243900 0.688000 0.376000 -0.616000
+0.000000 0.050200 -0.275900 0.288000 0.416000 -0.856000
+0.050000 0.000000 -0.258500 0.448000 0.256000 -0.848000
+0.000000 0.000000 -0.289100 0.520000 0.272000 -0.800000
+0.050000 -0.050200 -0.279200 0.280000 0.320000 -0.896000
+0.000000 -0.038700 -0.304800 0.368000 0.192000 -0.904000
+0.004800 -0.050200 -0.304800 0.368000 0.176000 -0.904000
+0.000000 -0.050200 -0.306900 0.320000 0.152000 -0.928000
+0.039400 -0.100400 -0.304800 0.408000 0.224000 -0.880000
+0.000000 -0.100400 -0.336000 0.328000 -0.184000 -0.920000
+0.000000 -0.050200 -0.306900 0.320000 0.152000 -0.928000
+-0.050000 -0.100400 -0.342800 0.056000 -0.032000 -0.992000
+-0.050000 -0.050200 -0.321000 0.120000 0.280000 -0.944000
+0.000000 -0.050200 -0.306900 0.320000 0.152000 -0.928000
+-0.050000 -0.015100 -0.304800 0.280000 0.536000 -0.784000
+0.000000 -0.038700 -0.304800 0.368000 0.192000 -0.904000
+-0.050000 0.000000 -0.288000 0.256000 0.560000 -0.776000
+0.000000 0.000000 -0.289100 0.520000 0.272000 -0.800000
+-0.050000 0.050200 -0.257500 0.608000 0.208000 -0.760000
+0.000000 0.050200 -0.275900 0.288000 0.416000 -0.856000
+-0.050000 0.095100 -0.243900 0.808000 0.256000 -0.520000
+0.000000 0.087200 -0.243900 0.456000 0.816000 -0.344000
+-0.050000 0.050200 -0.189300 0.800000 0.488000 0.336000
+0.000000 0.050200 -0.198900 0.168000 0.840000 0.504000
+0.000000 0.087200 -0.243900 0.456000 0.816000 -0.344000
+0.046000 0.050200 -0.243900 0.728000 0.480000 -0.472000
+0.000000 0.050200 -0.275900 0.288000 0.416000 -0.856000
+0.000000 0.050200 -0.275900 0.288000 0.416000 -0.856000
+-0.150000 0.000000 -0.001200 0.744000 0.064000 0.656000
+-0.150000 0.000000 -0.001200 0.744000 0.064000 0.656000
+-0.150000 -0.050200 -0.005700 0.768000 -0.024000 0.632000
+-0.120900 0.000000 -0.060900 0.800000 0.080000 0.592000
+-0.114700 -0.050200 -0.060900 0.632000 0.112000 0.760000
+-0.100000 0.000000 -0.110200 0.808000 0.176000 0.552000
+-0.100000 -0.050200 -0.077100 0.584000 0.232000 0.768000
+-0.089600 0.000000 -0.121900 0.568000 0.512000 0.632000
+-0.050000 -0.050200 -0.098600 0.240000 0.488000 0.832000
+-0.050000 -0.024600 -0.121900 0.296000 0.656000 0.688000
+0.000000 -0.050200 -0.114000 0.064000 0.408000 0.904000
+0.000000 -0.035500 -0.121900 0.072000 0.496000 0.856000
+0.050000 -0.050200 -0.115700 0.016000 0.416000 0.904000
+0.050000 -0.038600 -0.121900 0.000000 0.528000 0.840000
+0.100000 -0.050200 -0.113200 -0.016000 0.464000 0.880000
+0.100000 -0.037100 -0.121900 -0.016000 0.544000 0.832000
+0.150000 -0.050200 -0.113700 0.032000 0.448000 0.888000
+0.150000 -0.036300 -0.121900 0.008000 0.488000 0.864000
+0.100000 -0.037100 -0.121900 -0.016000 0.544000 0.832000
+0.150000 0.000000 -0.166100 -0.096000 0.688000 0.712000
+0.100000 0.000000 -0.179900 0.000000 0.528000 0.840000
+0.150000 0.016800 -0.182900 -0.152000 0.840000 0.520000
+0.100000 0.004900 -0.182900 -0.288000 0.864000 0.400000
+0.150000 0.015400 -0.243900 -0.208000 0.728000 -0.640000
+0.100000 0.000000 -0.203800 -0.256000 0.936000 -0.224000
+0.113100 0.000000 -0.243900 -0.392000 0.768000 -0.496000
+0.100000 -0.005500 -0.243900 -0.184000 0.760000 -0.616000
+0.150000 0.000000 -0.257100 -0.208000 0.552000 -0.800000
+0.100000 -0.050200 -0.272200 -0.136000 0.384000 -0.904000
+0.150000 -0.050200 -0.298400 -0.176000 0.328000 -0.920000
+0.100000 -0.100400 -0.298900 0.040000 0.136000 -0.984000
+0.150000 -0.064700 -0.304800 -0.200000 0.328000 -0.912000
+0.114400 -0.100400 -0.304800 -0.344000 0.128000 -0.928000
+0.114400 -0.100400 -0.304800 -0.344000 0.128000 -0.928000
+-0.150000 -0.050200 -0.005700 0.768000 -0.024000 0.632000
+-0.150000 -0.050200 -0.005700 0.768000 -0.024000 0.632000
+-0.150000 -0.100400 -0.001300 0.848000 0.032000 0.520000
+-0.114700 -0.050200 -0.060900 0.632000 0.112000 0.760000
+-0.104300 -0.100400 -0.060900 0.528000 0.416000 0.728000
+-0.100000 -0.050200 -0.077100 0.584000 0.232000 0.768000
+-0.100000 -0.100400 -0.064700 0.496000 0.416000 0.752000
+-0.050000 -0.050200 -0.098600 0.240000 0.488000 0.832000
+-0.050000 -0.100400 -0.073900 0.136000 0.480000 0.864000
+0.000000 -0.050200 -0.114000 0.064000 0.408000 0.904000
+0.000000 -0.100400 -0.085100 0.096000 0.456000 0.880000
+0.050000 -0.050200 -0.115700 0.016000 0.416000 0.904000
+0.050000 -0.100400 -0.083400 0.000000 0.440000 0.888000
+0.100000 -0.050200 -0.113200 -0.016000 0.464000 0.880000
+0.100000 -0.100400 -0.084200 0.032000 0.360000 0.928000
+0.150000 -0.050200 -0.113700 0.032000 0.448000 0.888000
+0.150000 -0.100400 -0.080500 0.184000 0.336000 0.920000
+0.100000 -0.100400 -0.084200 0.032000 0.360000 0.928000
+0.150000 -0.150600 -0.071000 0.136000 0.176000 0.968000
+0.100000 -0.150600 -0.068400 0.184000 0.416000 0.888000
+0.150000 -0.200800 -0.071800 0.312000 -0.208000 0.920000
+0.100000 -0.170000 -0.060900 0.256000 0.296000 0.912000
+0.130700 -0.200800 -0.060900 0.504000 0.008000 0.856000
+0.150000 -0.200800 -0.071800 0.312000 -0.208000 0.920000
+0.110300 -0.251000 -0.060900 0.504000 -0.760000 0.392000
+0.150000 -0.251000 -0.118100 0.224000 -0.792000 0.560000
+0.150000 -0.251000 -0.118100 0.224000 -0.792000 0.560000
+-0.100000 -0.188700 0.000000 0.176000 0.408000 0.888000
+-0.100000 -0.188700 0.000000 0.176000 0.408000 0.888000
+-0.129500 -0.150600 0.000000 0.416000 0.264000 0.864000
+-0.100000 -0.150600 -0.019000 0.512000 0.456000 0.720000
+-0.100000 -0.150600 -0.019000 0.512000 0.456000 0.720000
+-0.150000 -0.346200 0.000000 -0.392000 -0.160000 0.904000
+-0.150000 -0.346200 0.000000 -0.392000 -0.160000 0.904000
+-0.150000 -0.351500 -0.001100 -0.192000 -0.352000 0.912000
+-0.100000 -0.344900 0.000000 0.072000 -0.528000 0.840000
+-0.100000 -0.351500 -0.005700 0.248000 -0.576000 0.776000
+-0.050000 -0.329200 0.000000 0.264000 -0.624000 0.720000
+-0.050000 -0.351500 -0.027000 0.488000 -0.688000 0.528000
+-0.100000 -0.351500 -0.005700 0.248000 -0.576000 0.776000
+-0.050000 -0.370100 -0.060900 0.592000 -0.672000 0.424000
+-0.100000 -0.401700 -0.044900 0.592000 -0.496000 0.624000
+-0.087700 -0.401700 -0.060900 0.608000 -0.600000 0.504000
+-0.100000 -0.415900 -0.060900 0.680000 -0.544000 0.480000
+-0.054100 -0.401700 -0.121900 0.656000 -0.688000 0.280000
+-0.100000 -0.451900 -0.117700 0.624000 -0.664000 0.392000
+-0.098000 -0.451900 -0.121900 0.712000 -0.680000 0.120000
+-0.100000 -0.453500 -0.121900 0.600000 -0.776000 0.168000
+-0.098100 -0.451900 -0.182900 0.736000 -0.672000 0.032000
+-0.100000 -0.453800 -0.182900 0.696000 -0.712000 0.024000
+-0.094700 -0.451900 -0.243900 0.784000 -0.568000 0.216000
+-0.100000 -0.458900 -0.243900 0.744000 -0.632000 0.192000
+-0.061500 -0.451900 -0.304800 0.928000 -0.352000 0.088000
+-0.100000 -0.502100 -0.283200 0.616000 -0.376000 0.680000
+-0.074100 -0.502100 -0.304800 0.864000 -0.480000 0.112000
+-0.100000 -0.549700 -0.304800 0.696000 -0.392000 0.592000
+-0.100000 -0.502100 -0.325200 0.520000 -0.368000 -0.760000
+-0.101500 -0.552300 -0.304800 0.552000 -0.392000 0.720000
+-0.147100 -0.502100 -0.365800 0.472000 -0.192000 -0.848000
+-0.150000 -0.552300 -0.337600 0.424000 -0.304000 -0.840000
+-0.150000 -0.505900 -0.365800 0.272000 -0.320000 -0.904000
+-0.196100 -0.552300 -0.365800 0.320000 -0.272000 -0.904000
+-0.150000 -0.502100 -0.367300 0.088000 -0.320000 -0.936000
+-0.200000 -0.552300 -0.367100 0.360000 -0.232000 -0.896000
+-0.200000 -0.502100 -0.370700 0.184000 -0.352000 -0.912000
+-0.200000 -0.502100 -0.370700 0.184000 -0.352000 -0.912000
+-0.100000 -0.351500 -0.005700 0.248000 -0.576000 0.776000
+-0.100000 -0.351500 -0.005700 0.248000 -0.576000 0.776000
+-0.150000 -0.351500 -0.001100 -0.192000 -0.352000 0.912000
+-0.100000 -0.401700 -0.044900 0.592000 -0.496000 0.624000
+-0.150000 -0.401700 -0.019000 0.408000 -0.232000 0.880000
+-0.100000 -0.415900 -0.060900 0.680000 -0.544000 0.480000
+-0.150000 -0.451900 -0.041900 0.560000 -0.440000 0.696000
+-0.133200 -0.451900 -0.060900 0.584000 -0.656000 0.464000
+-0.150000 -0.470000 -0.060900 0.568000 -0.552000 0.600000
+-0.100000 -0.451900 -0.117700 0.624000 -0.664000 0.392000
+-0.150000 -0.502100 -0.111600 0.592000 -0.752000 0.280000
+-0.100000 -0.453500 -0.121900 0.600000 -0.776000 0.168000
+-0.146100 -0.502100 -0.121900 0.616000 -0.744000 0.232000
+-0.100000 -0.453800 -0.182900 0.696000 -0.712000 0.024000
+-0.141200 -0.502100 -0.182900 0.696000 -0.688000 0.184000
+-0.100000 -0.458900 -0.243900 0.744000 -0.632000 0.192000
+-0.125700 -0.502100 -0.243900 0.664000 -0.408000 0.624000
+-0.100000 -0.502100 -0.283200 0.616000 -0.376000 0.680000
+-0.150000 -0.530700 -0.243900 0.632000 -0.664000 0.392000
+-0.100000 -0.549700 -0.304800 0.696000 -0.392000 0.592000
+-0.150000 -0.552300 -0.270100 0.544000 -0.504000 0.656000
+-0.101500 -0.552300 -0.304800 0.552000 -0.392000 0.720000
+-0.150000 -0.602500 -0.302600 0.392000 -0.240000 0.880000
+-0.145700 -0.602500 -0.304800 0.824000 -0.528000 0.192000
+-0.150000 -0.609400 -0.304800 0.840000 -0.512000 0.152000
+-0.150000 -0.602500 -0.307600 0.456000 -0.280000 -0.840000
+-0.145700 -0.602500 -0.304800 0.824000 -0.528000 0.192000
+-0.150000 -0.552300 -0.337600 0.424000 -0.304000 -0.840000
+-0.101500 -0.552300 -0.304800 0.552000 -0.392000 0.720000
+-0.101500 -0.552300 -0.304800 0.552000 -0.392000 0.720000
+-0.050000 0.401700 -0.052300 0.176000 0.040000 0.976000
+-0.050000 0.401700 -0.052300 0.176000 0.040000 0.976000
+-0.100000 0.401700 -0.042400 0.232000 -0.088000 0.960000
+-0.050000 0.351500 -0.043600 0.248000 0.032000 0.960000
+-0.100000 0.351500 -0.035500 0.120000 0.000000 0.992000
+-0.050000 0.301200 -0.044600 0.440000 -0.008000 0.896000
+-0.100000 0.301200 -0.032000 0.168000 0.008000 0.984000
+-0.050000 0.251000 -0.047300 0.528000 -0.360000 0.760000
+-0.100000 0.251000 -0.029400 0.344000 -0.104000 0.928000
+-0.050000 0.236000 -0.060900 0.536000 -0.496000 0.672000
+-0.100000 0.200800 -0.041900 0.456000 -0.304000 0.832000
+-0.078700 0.200800 -0.060900 0.568000 -0.416000 0.704000
+-0.100000 0.167200 -0.060900 0.520000 -0.424000 0.736000
+-0.100000 0.167200 -0.060900 0.520000 -0.424000 0.736000
+-0.027600 0.301200 -0.060900 0.456000 -0.208000 0.856000
+-0.027600 0.301200 -0.060900 0.456000 -0.208000 0.856000
+-0.050000 0.301200 -0.044600 0.440000 -0.008000 0.896000
+-0.035000 0.251000 -0.060900 0.512000 -0.448000 0.728000
+-0.050000 0.251000 -0.047300 0.528000 -0.360000 0.760000
+-0.050000 0.236000 -0.060900 0.536000 -0.496000 0.672000
+-0.050000 0.236000 -0.060900 0.536000 -0.496000 0.672000
+-0.002200 -0.301200 0.000000 0.384000 -0.648000 0.648000
+-0.002200 -0.301200 0.000000 0.384000 -0.648000 0.648000
+0.000000 -0.299000 0.000000 0.440000 -0.464000 0.760000
+0.000000 -0.301200 -0.001900 0.408000 -0.704000 0.568000
+0.050000 -0.253500 0.000000 0.448000 -0.608000 0.648000
+0.032200 -0.301200 -0.060900 0.552000 -0.696000 0.448000
+0.050000 -0.286400 -0.060900 0.528000 -0.720000 0.440000
+0.050000 -0.301200 -0.085900 0.528000 -0.704000 0.464000
+0.050000 -0.301200 -0.085900 0.528000 -0.704000 0.464000
+-0.050000 -0.351500 -0.027000 0.488000 -0.688000 0.528000
+-0.050000 -0.351500 -0.027000 0.488000 -0.688000 0.528000
+-0.029100 -0.351500 -0.060900 0.584000 -0.680000 0.424000
+-0.050000 -0.370100 -0.060900 0.592000 -0.672000 0.424000
+0.000000 -0.351500 -0.112600 0.544000 -0.704000 0.448000
+-0.050000 -0.398200 -0.121900 0.592000 -0.704000 0.368000
+0.000000 -0.356400 -0.121900 0.560000 -0.728000 0.384000
+-0.050000 -0.389600 -0.182900 0.656000 -0.736000 -0.128000
+0.000000 -0.353400 -0.182900 0.520000 -0.832000 -0.160000
+-0.050000 -0.380500 -0.243900 0.664000 -0.736000 -0.104000
+0.000000 -0.351500 -0.193300 0.504000 -0.832000 -0.176000
+-0.013800 -0.351500 -0.243900 0.552000 -0.808000 -0.168000
+0.000000 -0.343100 -0.243900 0.464000 -0.864000 -0.160000
+-0.026900 -0.351500 -0.304800 0.608000 -0.688000 -0.384000
+0.000000 -0.336000 -0.304800 0.392000 -0.872000 -0.264000
+-0.050000 -0.351500 -0.336900 0.024000 -0.576000 -0.808000
+0.000000 -0.316900 -0.365800 0.224000 -0.832000 -0.496000
+-0.050000 -0.309800 -0.365800 -0.336000 -0.416000 -0.840000
+0.000000 -0.301200 -0.413400 -0.392000 -0.192000 -0.896000
+-0.050000 -0.301200 -0.370400 -0.392000 -0.264000 -0.872000
+0.000000 -0.251000 -0.386300 -0.352000 0.496000 -0.792000
+-0.050000 -0.266900 -0.365800 -0.288000 0.088000 -0.944000
+-0.044700 -0.251000 -0.365800 -0.216000 0.376000 -0.896000
+-0.050000 -0.251000 -0.364300 -0.216000 0.352000 -0.904000
+0.000000 -0.238800 -0.365800 -0.192000 0.648000 -0.728000
+-0.050000 -0.200800 -0.320900 -0.056000 0.280000 -0.952000
+0.000000 -0.200800 -0.332000 -0.296000 0.528000 -0.784000
+0.000000 -0.238800 -0.365800 -0.192000 0.648000 -0.728000
+0.050000 -0.200800 -0.360800 -0.016000 0.576000 -0.808000
+0.050000 -0.206300 -0.365800 -0.112000 0.608000 -0.776000
+0.000000 -0.238800 -0.365800 -0.192000 0.648000 -0.728000
+0.050000 -0.251000 -0.406500 0.232000 -0.312000 -0.912000
+0.000000 -0.251000 -0.386300 -0.352000 0.496000 -0.792000
+0.050000 -0.301200 -0.369000 0.376000 -0.768000 -0.512000
+0.000000 -0.301200 -0.413400 -0.392000 -0.192000 -0.896000
+0.050000 -0.303000 -0.365800 0.400000 -0.792000 -0.448000
+0.000000 -0.316900 -0.365800 0.224000 -0.832000 -0.496000
+0.050000 -0.326800 -0.304800 0.424000 -0.880000 -0.184000
+0.000000 -0.336000 -0.304800 0.392000 -0.872000 -0.264000
+0.050000 -0.327900 -0.243900 0.480000 -0.872000 0.000000
+0.000000 -0.343100 -0.243900 0.464000 -0.864000 -0.160000
+0.050000 -0.327900 -0.182900 0.552000 -0.824000 0.048000
+0.000000 -0.351500 -0.193300 0.504000 -0.832000 -0.176000
+0.003100 -0.351500 -0.182900 0.504000 -0.840000 -0.160000
+0.000000 -0.353400 -0.182900 0.520000 -0.832000 -0.160000
+0.006400 -0.351500 -0.121900 0.552000 -0.776000 0.288000
+0.000000 -0.356400 -0.121900 0.560000 -0.728000 0.384000
+0.000000 -0.351500 -0.112600 0.544000 -0.704000 0.448000
+0.000000 -0.351500 -0.112600 0.544000 -0.704000 0.448000
+0.000000 0.351500 -0.051600 0.280000 -0.248000 0.920000
+0.000000 0.351500 -0.051600 0.280000 -0.248000 0.920000
+0.000000 0.393800 -0.060900 0.224000 0.176000 0.952000
+0.042100 0.351500 -0.060900 0.160000 -0.080000 0.976000
+0.000000 0.401700 -0.062800 0.256000 0.176000 0.944000
+0.050000 0.351500 -0.062500 0.000000 -0.264000 0.960000
+0.050000 0.401700 -0.062500 -0.008000 0.136000 0.984000
+0.065700 0.351500 -0.060900 -0.064000 -0.312000 0.944000
+0.100000 0.401700 -0.066700 -0.048000 0.000000 0.992000
+0.100000 0.368600 -0.060900 0.104000 0.120000 0.984000
+0.150000 0.401700 -0.062100 -0.392000 -0.400000 0.816000
+0.111400 0.351500 -0.060900 0.184000 -0.224000 0.952000
+0.150000 0.351500 -0.070300 -0.056000 -0.480000 0.872000
+0.100000 0.345700 -0.060900 0.056000 -0.392000 0.912000
+0.150000 0.301200 -0.094700 0.096000 -0.408000 0.904000
+0.100000 0.301200 -0.081200 0.144000 -0.392000 0.904000
+0.150000 0.253300 -0.121900 0.144000 -0.672000 0.712000
+0.100000 0.251000 -0.119300 0.048000 -0.664000 0.736000
+0.134200 0.251000 -0.121900 0.072000 -0.752000 0.648000
+0.100000 0.248700 -0.121900 0.064000 -0.824000 0.552000
+0.150000 0.251000 -0.128300 0.144000 -0.904000 0.392000
+0.100000 0.246100 -0.182900 0.136000 -0.488000 -0.856000
+0.150000 0.224100 -0.182900 0.056000 -0.672000 -0.728000
+0.100000 0.251000 -0.185300 0.160000 -0.296000 -0.936000
+0.150000 0.251000 -0.192500 0.112000 0.024000 -0.992000
+0.100000 0.301200 -0.188500 0.112000 0.128000 -0.984000
+0.150000 0.284700 -0.182900 0.352000 0.368000 -0.856000
+0.133500 0.301200 -0.182900 0.272000 0.264000 -0.920000
+0.150000 0.251000 -0.128300 0.144000 -0.904000 0.392000
+0.150000 0.301200 -0.172900 0.456000 0.432000 -0.768000
+0.134200 0.251000 -0.121900 0.072000 -0.752000 0.648000
+0.150000 0.253300 -0.121900 0.144000 -0.672000 0.712000
+0.150000 0.301200 -0.172900 0.456000 0.432000 -0.768000
+0.200000 0.269500 -0.121900 -0.008000 -0.896000 0.432000
+0.200000 0.301200 -0.179700 -0.152000 -0.352000 -0.920000
+0.250000 0.256500 -0.121900 -0.200000 -0.800000 0.552000
+0.215700 0.301200 -0.182900 -0.120000 -0.160000 -0.976000
+0.250000 0.284000 -0.182900 -0.096000 -0.256000 -0.952000
+0.250000 0.301200 -0.184400 -0.080000 -0.056000 -0.992000
+0.215700 0.301200 -0.182900 -0.120000 -0.160000 -0.976000
+0.250000 0.351500 -0.189100 -0.160000 0.168000 -0.968000
+0.226900 0.351500 -0.182900 -0.224000 0.192000 -0.952000
+0.250000 0.370000 -0.182900 -0.184000 0.304000 -0.928000
+0.200000 0.351500 -0.169700 -0.320000 0.304000 -0.888000
+0.250000 0.401700 -0.172700 -0.016000 0.288000 -0.952000
+0.200000 0.401700 -0.169400 -0.056000 0.168000 -0.976000
+0.250000 0.451900 -0.137900 0.128000 0.536000 -0.824000
+0.200000 0.451900 -0.151000 0.136000 0.400000 -0.896000
+0.250000 0.466900 -0.121900 0.232000 0.968000 0.016000
+0.200000 0.484800 -0.121900 0.312000 0.872000 0.360000
+0.250000 0.451900 -0.094000 0.248000 0.784000 0.552000
+0.200000 0.453000 -0.060900 0.112000 0.728000 0.672000
+0.203100 0.451900 -0.060900 0.264000 0.672000 0.680000
+0.200000 0.451900 -0.059700 0.136000 0.632000 0.760000
+0.250000 0.432000 -0.060900 0.224000 0.624000 0.736000
+0.200000 0.401700 -0.033800 -0.352000 0.000000 0.928000
+0.250000 0.401700 -0.026800 -0.216000 0.176000 0.952000
+0.200000 0.352900 -0.060900 -0.368000 -0.496000 0.776000
+0.250000 0.351500 -0.020200 -0.488000 -0.416000 0.760000
+0.201200 0.351500 -0.060900 -0.488000 -0.576000 0.648000
+0.250000 0.317900 -0.060900 -0.432000 -0.680000 0.584000
+0.200000 0.351500 -0.062100 -0.312000 -0.640000 0.696000
+0.250000 0.301200 -0.083600 -0.096000 -0.744000 0.648000
+0.200000 0.301200 -0.098800 -0.120000 -0.584000 0.800000
+0.250000 0.256500 -0.121900 -0.200000 -0.800000 0.552000
+0.200000 0.269500 -0.121900 -0.008000 -0.896000 0.432000
+0.200000 0.301200 -0.098800 -0.120000 -0.584000 0.800000
+0.150000 0.253300 -0.121900 0.144000 -0.672000 0.712000
+0.150000 0.301200 -0.094700 0.096000 -0.408000 0.904000
+0.200000 0.301200 -0.098800 -0.120000 -0.584000 0.800000
+0.150000 0.351500 -0.070300 -0.056000 -0.480000 0.872000
+0.200000 0.351500 -0.062100 -0.312000 -0.640000 0.696000
+0.150000 0.401700 -0.062100 -0.392000 -0.400000 0.816000
+0.200000 0.352900 -0.060900 -0.368000 -0.496000 0.776000
+0.151400 0.401700 -0.060900 -0.480000 -0.416000 0.760000
+0.200000 0.401700 -0.033800 -0.352000 0.000000 0.928000
+0.150000 0.409600 -0.060900 -0.208000 -0.072000 0.968000
+0.200000 0.451900 -0.059700 0.136000 0.632000 0.760000
+0.150000 0.451900 -0.057100 -0.080000 0.496000 0.856000
+0.200000 0.453000 -0.060900 0.112000 0.728000 0.672000
+0.150000 0.456100 -0.060900 0.048000 0.664000 0.736000
+0.200000 0.484800 -0.121900 0.312000 0.872000 0.360000
+0.150000 0.502100 -0.119700 0.016000 0.656000 0.752000
+0.153400 0.502100 -0.121900 0.448000 0.824000 -0.336000
+0.150000 0.503100 -0.121900 0.272000 0.456000 -0.840000
+0.150000 0.502100 -0.123200 0.032000 0.424000 -0.896000
+0.138500 0.502100 -0.121900 -0.184000 0.952000 -0.216000
+0.150000 0.451900 -0.151900 0.184000 0.376000 -0.904000
+0.100000 0.494400 -0.121900 -0.184000 0.952000 -0.216000
+0.100000 0.451900 -0.146900 -0.088000 0.224000 -0.968000
+0.050000 0.485400 -0.121900 -0.032000 0.904000 -0.408000
+0.050000 0.451900 -0.139600 -0.080000 0.232000 -0.960000
+0.000000 0.493800 -0.121900 0.128000 0.960000 -0.232000
+0.000000 0.451900 -0.135500 0.000000 0.160000 -0.984000
+-0.050000 0.500300 -0.121900 -0.104000 0.896000 -0.424000
+-0.050000 0.451900 -0.137500 0.040000 0.112000 -0.992000
+-0.100000 0.479800 -0.121900 -0.288000 0.584000 -0.752000
+-0.100000 0.451900 -0.142300 -0.128000 0.312000 -0.936000
+-0.150000 0.453400 -0.121900 -0.320000 0.624000 -0.704000
+-0.150000 0.451900 -0.123200 -0.344000 0.512000 -0.784000
+-0.152100 0.451900 -0.121900 -0.424000 0.536000 -0.720000
+-0.150000 0.401700 -0.148200 -0.240000 0.400000 -0.872000
+-0.200000 0.409200 -0.121900 -0.400000 0.464000 -0.776000
+-0.200000 0.401700 -0.127400 -0.400000 0.440000 -0.800000
+-0.208300 0.401700 -0.121900 -0.432000 0.432000 -0.784000
+-0.200000 0.351500 -0.146000 -0.416000 0.224000 -0.872000
+-0.233300 0.351500 -0.121900 -0.616000 0.184000 -0.752000
+-0.200000 0.301200 -0.154100 -0.392000 0.112000 -0.904000
+-0.245300 0.301200 -0.121900 -0.680000 0.120000 -0.720000
+-0.200000 0.251000 -0.156200 -0.432000 0.168000 -0.880000
+-0.250000 0.268200 -0.121900 -0.464000 0.088000 -0.872000
+-0.250000 0.251000 -0.124000 -0.376000 0.088000 -0.920000
+-0.254200 0.251000 -0.121900 -0.384000 0.088000 -0.912000
+-0.250000 0.200800 -0.129700 -0.392000 0.152000 -0.904000
+-0.263400 0.200800 -0.121900 -0.480000 0.216000 -0.840000
+-0.250000 0.150600 -0.154100 -0.464000 0.344000 -0.808000
+-0.295300 0.150600 -0.121900 -0.728000 0.520000 -0.432000
+-0.250000 0.100400 -0.182000 -0.504000 0.488000 -0.704000
+-0.300000 0.144000 -0.121900 -0.728000 0.496000 -0.456000
+-0.300000 0.100400 -0.141500 -0.560000 0.512000 -0.640000
+-0.250000 0.100400 -0.182000 -0.504000 0.488000 -0.704000
+-0.300000 0.052000 -0.182900 -0.664000 0.464000 -0.568000
+-0.250000 0.099600 -0.182900 -0.488000 0.616000 -0.608000
+-0.250000 0.100400 -0.182000 -0.504000 0.488000 -0.704000
+-0.249100 0.100400 -0.182900 -0.576000 0.496000 -0.640000
+-0.250000 0.150600 -0.154100 -0.464000 0.344000 -0.808000
+-0.216700 0.150600 -0.182900 -0.560000 0.376000 -0.728000
+-0.250000 0.200800 -0.129700 -0.392000 0.152000 -0.904000
+-0.200000 0.172600 -0.182900 -0.488000 0.416000 -0.760000
+-0.200000 0.200800 -0.161600 -0.480000 0.384000 -0.776000
+-0.173800 0.200800 -0.182900 -0.480000 0.344000 -0.800000
+-0.200000 0.251000 -0.156200 -0.432000 0.168000 -0.880000
+-0.153800 0.251000 -0.182900 -0.312000 0.176000 -0.928000
+-0.200000 0.301200 -0.154100 -0.392000 0.112000 -0.904000
+-0.150000 0.257900 -0.182900 -0.288000 0.168000 -0.936000
+-0.150000 0.301200 -0.169700 -0.080000 0.248000 -0.960000
+-0.100000 0.273500 -0.182900 -0.112000 0.208000 -0.968000
+-0.100000 0.301200 -0.172200 -0.168000 0.416000 -0.888000
+-0.058500 0.301200 -0.182900 -0.128000 0.320000 -0.936000
+-0.100000 0.351500 -0.158200 0.008000 0.264000 -0.960000
+-0.050000 0.304700 -0.182900 -0.120000 0.336000 -0.928000
+-0.050000 0.351500 -0.155800 -0.048000 0.328000 -0.936000
+0.000000 0.313300 -0.182900 -0.064000 0.304000 -0.944000
+0.000000 0.351500 -0.164900 -0.080000 0.368000 -0.920000
+0.050000 0.327400 -0.182900 -0.016000 0.344000 -0.936000
+0.050000 0.351500 -0.166400 0.000000 0.392000 -0.912000
+0.100000 0.320500 -0.182900 0.096000 0.312000 -0.936000
+0.100000 0.351500 -0.169000 0.056000 0.272000 -0.952000
+0.133500 0.301200 -0.182900 0.272000 0.264000 -0.920000
+0.150000 0.351500 -0.160600 0.144000 0.128000 -0.976000
+0.150000 0.301200 -0.172900 0.456000 0.432000 -0.768000
+0.200000 0.351500 -0.169700 -0.320000 0.304000 -0.888000
+0.200000 0.301200 -0.179700 -0.152000 -0.352000 -0.920000
+0.226900 0.351500 -0.182900 -0.224000 0.192000 -0.952000
+0.215700 0.301200 -0.182900 -0.120000 -0.160000 -0.976000
+0.215700 0.301200 -0.182900 -0.120000 -0.160000 -0.976000
+0.000000 0.351500 -0.051600 0.280000 -0.248000 0.920000
+0.000000 0.351500 -0.051600 0.280000 -0.248000 0.920000
+0.042100 0.351500 -0.060900 0.160000 -0.080000 0.976000
+0.000000 0.334500 -0.060900 0.312000 -0.368000 0.864000
+0.050000 0.351500 -0.062500 0.000000 -0.264000 0.960000
+0.000000 0.301200 -0.076500 0.296000 -0.272000 0.904000
+0.050000 0.301200 -0.074400 0.160000 -0.248000 0.952000
+0.000000 0.251000 -0.086600 0.344000 -0.360000 0.864000
+0.050000 0.251000 -0.100200 0.224000 -0.464000 0.848000
+0.000000 0.211400 -0.121900 0.496000 -0.712000 0.480000
+0.050000 0.230600 -0.121900 0.312000 -0.824000 0.464000
+0.000000 0.200800 -0.169000 0.576000 -0.744000 0.320000
+0.050000 0.219300 -0.182900 0.280000 -0.632000 -0.712000
+0.008500 0.200800 -0.182900 0.416000 -0.688000 -0.584000
+0.050000 0.251000 -0.200200 0.040000 -0.232000 -0.968000
+0.000000 0.200800 -0.186400 0.272000 -0.456000 -0.840000
+0.000000 0.251000 -0.201400 0.024000 -0.152000 -0.984000
+-0.050000 0.200800 -0.204500 0.304000 -0.328000 -0.888000
+-0.050000 0.251000 -0.205600 -0.136000 0.216000 -0.960000
+-0.100000 0.200800 -0.221500 0.056000 0.392000 -0.912000
+-0.100000 0.251000 -0.188700 -0.192000 0.256000 -0.944000
+-0.150000 0.200800 -0.199200 -0.328000 0.272000 -0.896000
+-0.150000 0.251000 -0.184400 -0.280000 0.168000 -0.936000
+-0.173800 0.200800 -0.182900 -0.480000 0.344000 -0.800000
+-0.153800 0.251000 -0.182900 -0.312000 0.176000 -0.928000
+-0.150000 0.251000 -0.184400 -0.280000 0.168000 -0.936000
+-0.150000 0.257900 -0.182900 -0.288000 0.168000 -0.936000
+-0.100000 0.251000 -0.188700 -0.192000 0.256000 -0.944000
+-0.100000 0.273500 -0.182900 -0.112000 0.208000 -0.968000
+-0.050000 0.251000 -0.205600 -0.136000 0.216000 -0.960000
+-0.058500 0.301200 -0.182900 -0.128000 0.320000 -0.936000
+-0.050000 0.301200 -0.184300 -0.112000 0.296000 -0.944000
+-0.050000 0.304700 -0.182900 -0.120000 0.336000 -0.928000
+0.000000 0.301200 -0.186500 -0.056000 0.232000 -0.968000
+0.000000 0.313300 -0.182900 -0.064000 0.304000 -0.944000
+0.050000 0.301200 -0.192400 0.024000 0.192000 -0.976000
+0.050000 0.327400 -0.182900 -0.016000 0.344000 -0.936000
+0.100000 0.301200 -0.188500 0.112000 0.128000 -0.984000
+0.100000 0.320500 -0.182900 0.096000 0.312000 -0.936000
+0.133500 0.301200 -0.182900 0.272000 0.264000 -0.920000
+0.133500 0.301200 -0.182900 0.272000 0.264000 -0.920000
+0.000000 -0.301200 -0.001900 0.408000 -0.704000 0.568000
+0.000000 -0.301200 -0.001900 0.408000 -0.704000 0.568000
+0.032200 -0.301200 -0.060900 0.552000 -0.696000 0.448000
+0.000000 -0.326800 -0.060900 0.344000 -0.824000 0.432000
+0.000000 -0.326800 -0.060900 0.344000 -0.824000 0.432000
+0.065700 0.351500 -0.060900 -0.064000 -0.312000 0.944000
+0.065700 0.351500 -0.060900 -0.064000 -0.312000 0.944000
+0.100000 0.368600 -0.060900 0.104000 0.120000 0.984000
+0.100000 0.351500 -0.058100 0.120000 -0.240000 0.960000
+0.111400 0.351500 -0.060900 0.184000 -0.224000 0.952000
+0.100000 0.345700 -0.060900 0.056000 -0.392000 0.912000
+0.100000 0.351500 -0.058100 0.120000 -0.240000 0.960000
+0.065700 0.351500 -0.060900 -0.064000 -0.312000 0.944000
+0.100000 0.345700 -0.060900 0.056000 -0.392000 0.912000
+0.050000 0.351500 -0.062500 0.000000 -0.264000 0.960000
+0.100000 0.301200 -0.081200 0.144000 -0.392000 0.904000
+0.050000 0.301200 -0.074400 0.160000 -0.248000 0.952000
+0.100000 0.251000 -0.119300 0.048000 -0.664000 0.736000
+0.050000 0.251000 -0.100200 0.224000 -0.464000 0.848000
+0.100000 0.248700 -0.121900 0.064000 -0.824000 0.552000
+0.050000 0.230600 -0.121900 0.312000 -0.824000 0.464000
+0.100000 0.246100 -0.182900 0.136000 -0.488000 -0.856000
+0.050000 0.219300 -0.182900 0.280000 -0.632000 -0.712000
+0.100000 0.251000 -0.185300 0.160000 -0.296000 -0.936000
+0.050000 0.251000 -0.200200 0.040000 -0.232000 -0.968000
+0.100000 0.301200 -0.188500 0.112000 0.128000 -0.984000
+0.050000 0.301200 -0.192400 0.024000 0.192000 -0.976000
+0.050000 0.251000 -0.200200 0.040000 -0.232000 -0.968000
+0.000000 0.301200 -0.186500 -0.056000 0.232000 -0.968000
+0.000000 0.251000 -0.201400 0.024000 -0.152000 -0.984000
+-0.050000 0.301200 -0.184300 -0.112000 0.296000 -0.944000
+-0.050000 0.251000 -0.205600 -0.136000 0.216000 -0.960000
+-0.050000 0.251000 -0.205600 -0.136000 0.216000 -0.960000
+0.150000 0.456100 -0.060900 0.048000 0.664000 0.736000
+0.150000 0.456100 -0.060900 0.048000 0.664000 0.736000
+0.150000 0.451900 -0.057100 -0.080000 0.496000 0.856000
+0.121900 0.451900 -0.060900 -0.112000 0.472000 0.872000
+0.150000 0.409600 -0.060900 -0.208000 -0.072000 0.968000
+0.100000 0.451900 -0.066700 -0.192000 0.072000 0.976000
+0.150000 0.401700 -0.062100 -0.392000 -0.400000 0.816000
+0.100000 0.401700 -0.066700 -0.048000 0.000000 0.992000
+0.100000 0.451900 -0.066700 -0.192000 0.072000 0.976000
+0.050000 0.401700 -0.062500 -0.008000 0.136000 0.984000
+0.050000 0.451900 -0.077800 0.016000 0.408000 0.912000
+0.000000 0.401700 -0.062800 0.256000 0.176000 0.944000
+0.000000 0.451900 -0.081100 0.280000 0.456000 0.832000
+-0.005200 0.401700 -0.060900 0.264000 0.168000 0.944000
+-0.023600 0.451900 -0.060900 0.376000 0.152000 0.904000
+0.000000 0.451900 -0.081100 0.280000 0.456000 0.832000
+-0.033200 0.502100 -0.060900 0.616000 0.496000 0.600000
+0.000000 0.493800 -0.121900 0.128000 0.960000 -0.232000
+-0.050000 0.502100 -0.117100 -0.040000 0.912000 -0.392000
+-0.050000 0.500300 -0.121900 -0.104000 0.896000 -0.424000
+-0.100000 0.502100 -0.081300 -0.184000 0.840000 -0.488000
+-0.100000 0.479800 -0.121900 -0.288000 0.584000 -0.752000
+-0.100000 0.479800 -0.121900 -0.288000 0.584000 -0.752000
+0.350000 0.302200 -0.060900 -0.144000 -0.624000 0.760000
+0.350000 0.302200 -0.060900 -0.144000 -0.624000 0.760000
+0.300000 0.310700 -0.060900 -0.072000 -0.760000 0.640000
+0.350000 0.351500 -0.021800 0.032000 -0.048000 0.992000
+0.300000 0.351500 -0.009100 -0.016000 -0.144000 0.984000
+0.300000 0.351500 -0.009100 -0.016000 -0.144000 0.984000
+0.395100 0.251000 -0.060900 -0.344000 -0.184000 0.912000
+0.395100 0.251000 -0.060900 -0.344000 -0.184000 0.912000
+0.400000 0.251000 -0.058700 -0.328000 -0.176000 0.920000
+0.400000 0.242400 -0.060900 -0.352000 -0.192000 0.904000
+0.400000 0.242400 -0.060900 -0.352000 -0.192000 0.904000
+0.450000 0.401700 -0.038900 -0.120000 0.592000 0.784000
+0.450000 0.401700 -0.038900 -0.120000 0.592000 0.784000
+0.500000 0.401700 -0.057700 0.096000 0.864000 0.480000
+0.450000 0.414500 -0.060900 0.192000 0.928000 0.304000
+0.500000 0.403100 -0.060900 0.112000 0.944000 0.280000
+0.450000 0.422200 -0.121900 0.368000 0.832000 -0.392000
+0.500000 0.401700 -0.069300 0.168000 0.952000 -0.216000
+0.488600 0.401700 -0.121900 0.504000 0.776000 -0.368000
+0.450000 0.422200 -0.121900 0.368000 0.832000 -0.392000
+0.450000 0.401700 -0.160800 0.376000 0.656000 -0.640000
+0.450000 0.401700 -0.160800 0.376000 0.656000 -0.640000
+0.460500 0.150600 -0.060900 -0.624000 -0.512000 0.584000
+0.460500 0.150600 -0.060900 -0.624000 -0.512000 0.584000
+0.500000 0.150600 -0.020200 -0.704000 -0.472000 0.520000
+0.500000 0.107000 -0.060900 -0.608000 -0.480000 0.616000
+0.500000 0.107000 -0.060900 -0.608000 -0.480000 0.616000
+0.500000 0.000000 -0.045100 -0.376000 -0.208000 0.896000
+0.500000 0.000000 -0.045100 -0.376000 -0.208000 0.896000
+0.500000 0.050200 -0.057700 -0.560000 0.128000 0.816000
+0.478700 0.000000 -0.060900 -0.440000 -0.008000 0.888000
+0.495100 0.050200 -0.060900 -0.456000 0.136000 0.872000
+0.450000 0.000000 -0.073300 -0.344000 -0.088000 0.928000
+0.450000 0.050200 -0.077000 -0.360000 0.120000 0.920000
+0.400000 0.000000 -0.102200 -0.272000 0.176000 0.936000
+0.400000 0.050200 -0.114800 -0.552000 0.256000 0.784000
+0.351500 0.000000 -0.121900 -0.376000 0.528000 0.752000
+0.393200 0.050200 -0.121900 -0.648000 0.352000 0.664000
+0.350000 0.000000 -0.123200 -0.512000 0.592000 0.608000
+0.357200 0.050200 -0.182900 -0.736000 0.640000 0.184000
+0.350000 0.043300 -0.182900 -0.488000 0.704000 0.504000
+0.351400 0.050200 -0.243900 -0.480000 0.768000 -0.416000
+0.350000 0.049300 -0.243900 -0.512000 0.784000 -0.320000
+0.350000 0.043300 -0.182900 -0.488000 0.704000 0.504000
+0.300000 0.032100 -0.243900 -0.576000 0.680000 -0.432000
+0.300000 0.018000 -0.182900 -0.296000 0.768000 0.552000
+0.350000 0.043300 -0.182900 -0.488000 0.704000 0.504000
+0.300000 0.000000 -0.166100 -0.488000 0.464000 0.728000
+0.350000 0.000000 -0.123200 -0.512000 0.592000 0.608000
+0.300000 -0.050200 -0.130700 -0.504000 0.472000 0.720000
+0.350000 -0.001200 -0.121900 -0.472000 0.472000 0.736000
+0.307700 -0.050200 -0.121900 -0.592000 0.464000 0.648000
+0.350000 -0.050200 -0.093300 -0.312000 0.392000 0.856000
+0.300000 -0.060700 -0.121900 -0.512000 0.456000 0.720000
+0.350000 -0.100400 -0.081200 -0.280000 0.032000 0.952000
+0.300000 -0.100400 -0.098900 -0.360000 0.344000 0.856000
+0.350000 -0.150600 -0.101500 0.088000 -0.352000 0.928000
+0.300000 -0.150600 -0.090800 0.240000 -0.024000 0.968000
+0.350000 -0.182300 -0.121900 -0.032000 -0.520000 0.848000
+0.300000 -0.200800 -0.101500 0.424000 -0.216000 0.872000
+0.329200 -0.200800 -0.121900 0.376000 -0.264000 0.880000
+0.300000 -0.234400 -0.121900 0.104000 -0.472000 0.872000
+0.350000 -0.200800 -0.137500 0.248000 -0.232000 0.936000
+0.300000 -0.251000 -0.132800 -0.224000 -0.464000 0.856000
+0.350000 -0.234100 -0.121900 0.384000 0.224000 0.888000
+0.328900 -0.251000 -0.121900 -0.264000 -0.304000 0.912000
+0.350000 -0.251000 -0.114600 0.576000 -0.200000 0.784000
+0.350000 -0.260400 -0.121900 0.448000 -0.472000 0.752000
+0.354900 -0.251000 -0.121900 0.704000 -0.304000 0.632000
+0.350000 -0.251000 -0.114600 0.576000 -0.200000 0.784000
+0.350000 -0.234100 -0.121900 0.384000 0.224000 0.888000
+0.354900 -0.251000 -0.121900 0.704000 -0.304000 0.632000
+0.350000 -0.200800 -0.137500 0.248000 -0.232000 0.936000
+0.400000 -0.203000 -0.121900 -0.184000 -0.672000 0.712000
+0.391400 -0.200800 -0.121900 -0.176000 -0.648000 0.736000
+0.400000 -0.200800 -0.119100 -0.200000 -0.688000 0.688000
+0.350000 -0.182300 -0.121900 -0.032000 -0.520000 0.848000
+0.400000 -0.150600 -0.068400 -0.344000 -0.312000 0.880000
+0.350000 -0.150600 -0.101500 0.088000 -0.352000 0.928000
+0.400000 -0.100400 -0.080400 -0.024000 0.176000 0.976000
+0.350000 -0.100400 -0.081200 -0.280000 0.032000 0.952000
+0.400000 -0.050200 -0.089900 -0.128000 0.176000 0.968000
+0.350000 -0.050200 -0.093300 -0.312000 0.392000 0.856000
+0.400000 0.000000 -0.102200 -0.272000 0.176000 0.936000
+0.350000 -0.001200 -0.121900 -0.472000 0.472000 0.736000
+0.351500 0.000000 -0.121900 -0.376000 0.528000 0.752000
+0.350000 0.000000 -0.123200 -0.512000 0.592000 0.608000
+0.350000 0.000000 -0.123200 -0.512000 0.592000 0.608000
+0.478700 0.000000 -0.060900 -0.440000 -0.008000 0.888000
+0.478700 0.000000 -0.060900 -0.440000 -0.008000 0.888000
+0.500000 0.000000 -0.045100 -0.376000 -0.208000 0.896000
+0.500000 -0.026100 -0.060900 -0.336000 -0.328000 0.872000
+0.550000 0.000000 -0.046900 0.008000 -0.120000 0.992000
+0.550000 -0.046200 -0.060900 -0.104000 -0.168000 0.976000
+0.600000 0.000000 -0.044900 -0.016000 -0.720000 0.688000
+0.600000 -0.012300 -0.060900 0.104000 -0.576000 0.800000
+0.550000 -0.046200 -0.060900 -0.104000 -0.168000 0.976000
+0.600000 -0.050200 -0.088500 0.448000 -0.400000 0.792000
+0.550000 -0.050200 -0.061500 -0.064000 -0.152000 0.984000
+0.600000 -0.100400 -0.077400 0.584000 0.048000 0.800000
+0.550000 -0.100400 -0.076900 0.056000 0.056000 0.992000
+0.550000 -0.050200 -0.061500 -0.064000 -0.152000 0.984000
+0.500000 -0.100400 -0.086800 -0.048000 0.256000 0.960000
+0.500000 -0.050200 -0.068900 -0.136000 -0.144000 0.976000
+0.450000 -0.100400 -0.078400 -0.088000 0.200000 0.968000
+0.450000 -0.050200 -0.086300 -0.128000 -0.040000 0.984000
+0.400000 -0.100400 -0.080400 -0.024000 0.176000 0.976000
+0.400000 -0.050200 -0.089900 -0.128000 0.176000 0.968000
+0.450000 -0.050200 -0.086300 -0.128000 -0.040000 0.984000
+0.400000 0.000000 -0.102200 -0.272000 0.176000 0.936000
+0.450000 0.000000 -0.073300 -0.344000 -0.088000 0.928000
+0.450000 -0.050200 -0.086300 -0.128000 -0.040000 0.984000
+0.478700 0.000000 -0.060900 -0.440000 -0.008000 0.888000
+0.500000 -0.050200 -0.068900 -0.136000 -0.144000 0.976000
+0.500000 -0.026100 -0.060900 -0.336000 -0.328000 0.872000
+0.550000 -0.050200 -0.061500 -0.064000 -0.152000 0.984000
+0.550000 -0.046200 -0.060900 -0.104000 -0.168000 0.976000
+0.550000 -0.046200 -0.060900 -0.104000 -0.168000 0.976000
+0.500000 0.401700 -0.057700 0.096000 0.864000 0.480000
+0.500000 0.401700 -0.057700 0.096000 0.864000 0.480000
+0.500000 0.403100 -0.060900 0.112000 0.944000 0.280000
+0.517100 0.401700 -0.060900 0.080000 0.968000 0.224000
+0.500000 0.401700 -0.069300 0.168000 0.952000 -0.216000
+0.500000 0.401700 -0.069300 0.168000 0.952000 -0.216000
+0.500000 0.266900 0.000000 -0.760000 -0.040000 0.640000
+0.500000 0.266900 0.000000 -0.760000 -0.040000 0.640000
+0.500800 0.251000 0.000000 -0.792000 -0.016000 0.608000
+0.500000 0.251000 -0.000900 -0.496000 0.112000 0.856000
+0.500000 0.251000 -0.000900 -0.496000 0.112000 0.856000
+0.500000 0.050200 -0.057700 -0.560000 0.128000 0.816000
+0.500000 0.050200 -0.057700 -0.560000 0.128000 0.816000
+0.500000 0.000000 -0.045100 -0.376000 -0.208000 0.896000
+0.550000 0.050200 -0.037800 -0.320000 -0.688000 0.640000
+0.550000 0.000000 -0.046900 0.008000 -0.120000 0.992000
+0.600000 0.050200 -0.005300 -0.440000 -0.752000 0.480000
+0.600000 0.000000 -0.044900 -0.016000 -0.720000 0.688000
+0.600000 0.000000 -0.044900 -0.016000 -0.720000 0.688000
+0.550000 0.104000 0.000000 -0.664000 -0.568000 0.464000
+0.550000 0.104000 0.000000 -0.664000 -0.568000 0.464000
+0.553100 0.100400 0.000000 -0.664000 -0.576000 0.464000
+0.550000 0.100400 -0.005700 -0.672000 -0.576000 0.448000
+0.550000 0.100400 -0.005700 -0.672000 -0.576000 0.448000
+0.550000 -0.200800 -0.034900 0.016000 -0.040000 0.992000
+0.550000 -0.200800 -0.034900 0.016000 -0.040000 0.992000
+0.600000 -0.200800 -0.056500 0.336000 0.448000 0.816000
+0.550000 -0.159500 -0.060900 0.248000 0.472000 0.840000
+0.600000 -0.194800 -0.060900 0.352000 0.496000 0.784000
+0.550000 -0.150600 -0.067100 0.240000 0.480000 0.840000
+0.600000 -0.150600 -0.093600 0.304000 0.568000 0.752000
+0.600000 -0.194800 -0.060900 0.352000 0.496000 0.784000
+0.650000 -0.150600 -0.116200 0.720000 0.480000 0.488000
+0.608400 -0.200800 -0.060900 0.360000 0.488000 0.792000
+0.650000 -0.200800 -0.092600 0.656000 0.384000 0.640000
+0.650000 -0.242600 -0.060900 0.392000 0.384000 0.824000
+0.677400 -0.200800 -0.121900 0.528000 0.512000 0.672000
+0.657600 -0.251000 -0.060900 0.456000 -0.072000 0.880000
+0.700000 -0.217500 -0.121900 0.616000 0.552000 0.544000
+0.700000 -0.251000 -0.086700 0.608000 0.464000 0.632000
+0.719200 -0.251000 -0.121900 0.760000 0.456000 0.440000
+0.700000 -0.301200 -0.068800 0.336000 0.392000 0.848000
+0.750000 -0.297400 -0.121900 0.656000 0.584000 0.464000
+0.750000 -0.301200 -0.116500 0.704000 0.400000 0.568000
+0.752700 -0.301200 -0.121900 0.792000 0.344000 0.488000
+0.750000 -0.351500 -0.097900 0.640000 0.048000 0.760000
+0.775700 -0.351500 -0.121900 0.600000 0.328000 0.720000
+0.750000 -0.401700 -0.115900 -0.264000 -0.344000 0.896000
+0.800000 -0.391100 -0.121900 0.384000 0.416000 0.816000
+0.800000 -0.401700 -0.115500 0.392000 0.184000 0.896000
+0.810500 -0.401700 -0.121900 0.456000 0.104000 0.872000
+0.800000 -0.418600 -0.121900 0.304000 -0.320000 0.888000
+0.850000 -0.401700 -0.151500 0.608000 0.552000 0.560000
+0.800000 -0.451900 -0.135400 0.168000 -0.384000 0.904000
+0.850000 -0.451900 -0.123600 0.328000 0.296000 0.888000
+0.800000 -0.502100 -0.171200 -0.360000 -0.648000 0.664000
+0.850000 -0.502100 -0.142100 -0.224000 -0.520000 0.816000
+0.800000 -0.511100 -0.182900 -0.376000 -0.744000 0.544000
+0.850000 -0.533300 -0.182900 -0.416000 -0.736000 0.528000
+0.800000 -0.519900 -0.243900 -0.400000 -0.904000 -0.112000
+0.850000 -0.540400 -0.243900 -0.360000 -0.768000 -0.512000
+0.800000 -0.502100 -0.293400 -0.120000 -0.840000 -0.520000
+0.850000 -0.504700 -0.304800 -0.096000 -0.664000 -0.736000
+0.832800 -0.502100 -0.304800 -0.104000 -0.544000 -0.824000
+0.850000 -0.502100 -0.307100 0.032000 -0.240000 -0.968000
+0.850000 -0.490600 -0.304800 0.216000 0.112000 -0.968000
+0.856800 -0.502100 -0.304800 0.288000 0.144000 -0.944000
+0.850000 -0.451900 -0.293100 0.448000 0.248000 -0.848000
+0.900000 -0.502100 -0.284600 -0.008000 -0.096000 -0.992000
+0.900000 -0.451900 -0.272400 0.368000 0.408000 -0.824000
+0.950000 -0.502100 -0.277800 0.272000 0.288000 -0.912000
+0.950000 -0.451900 -0.300000 0.488000 0.464000 -0.728000
+1.000000 -0.502100 -0.271100 0.392000 0.584000 -0.696000
+0.980700 -0.451900 -0.243900 0.752000 0.648000 0.032000
+1.000000 -0.475100 -0.243900 0.736000 0.608000 -0.280000
+0.950000 -0.451900 -0.206400 0.504000 0.736000 0.440000
+1.000000 -0.502100 -0.189300 0.760000 0.568000 0.296000
+0.950000 -0.463500 -0.182900 0.464000 0.672000 0.568000
+0.998000 -0.502100 -0.182900 0.528000 0.664000 0.520000
+0.950000 -0.502100 -0.136000 -0.296000 0.400000 0.864000
+1.000000 -0.503200 -0.182900 0.400000 0.704000 0.576000
+0.950000 -0.531200 -0.121900 -0.376000 0.368000 0.840000
+1.000000 -0.544400 -0.121900 0.360000 0.712000 0.592000
+0.950000 -0.552300 -0.115100 -0.432000 -0.368000 0.816000
+1.000000 -0.552300 -0.111000 0.040000 -0.024000 0.992000
+0.950000 -0.560000 -0.121900 -0.400000 -0.536000 0.728000
+1.000000 -0.602500 -0.115100 -0.504000 -0.464000 0.712000
+0.992300 -0.602500 -0.121900 -0.520000 -0.480000 0.696000
+1.000000 -0.611000 -0.121900 -0.528000 -0.480000 0.696000
+0.950000 -0.602500 -0.169200 -0.536000 -0.520000 0.656000
+1.000000 -0.652700 -0.168000 -0.488000 -0.568000 0.656000
+0.950000 -0.619400 -0.182900 -0.632000 -0.592000 0.480000
+0.983200 -0.652700 -0.182900 -0.528000 -0.608000 0.584000
+0.950000 -0.619400 -0.243900 -0.600000 -0.584000 -0.536000
+0.979500 -0.652700 -0.243900 -0.672000 -0.664000 -0.304000
+0.950000 -0.602500 -0.260200 -0.544000 -0.504000 -0.664000
+1.000000 -0.652700 -0.268800 -0.592000 -0.512000 -0.608000
+0.990600 -0.602500 -0.304800 -0.488000 -0.376000 -0.784000
+1.000000 -0.614600 -0.304800 -0.488000 -0.376000 -0.776000
+1.000000 -0.602500 -0.311200 -0.448000 -0.336000 -0.816000
+0.990600 -0.602500 -0.304800 -0.488000 -0.376000 -0.784000
+1.000000 -0.552300 -0.319800 -0.248000 0.216000 -0.936000
+0.953900 -0.552300 -0.304800 -0.328000 0.312000 -0.888000
+1.000000 -0.525900 -0.304800 -0.248000 0.496000 -0.824000
+0.950000 -0.552300 -0.303200 -0.304000 0.392000 -0.864000
+1.000000 -0.502100 -0.271100 0.392000 0.584000 -0.696000
+0.950000 -0.502100 -0.277800 0.272000 0.288000 -0.912000
+0.950000 -0.552300 -0.303200 -0.304000 0.392000 -0.864000
+0.900000 -0.502100 -0.284600 -0.008000 -0.096000 -0.992000
+0.900000 -0.552300 -0.278500 -0.424000 -0.592000 -0.672000
+0.856800 -0.502100 -0.304800 0.288000 0.144000 -0.944000
+0.868400 -0.552300 -0.243900 -0.552000 -0.760000 -0.328000
+0.850000 -0.504700 -0.304800 -0.096000 -0.664000 -0.736000
+0.850000 -0.540400 -0.243900 -0.360000 -0.768000 -0.512000
+0.868400 -0.552300 -0.243900 -0.552000 -0.760000 -0.328000
+0.850000 -0.533300 -0.182900 -0.416000 -0.736000 0.528000
+0.876500 -0.552300 -0.182900 -0.528000 -0.672000 0.504000
+0.850000 -0.502100 -0.142100 -0.224000 -0.520000 0.816000
+0.900000 -0.552300 -0.159100 -0.496000 -0.592000 0.632000
+0.900000 -0.502100 -0.123800 -0.168000 -0.208000 0.960000
+0.940600 -0.552300 -0.121900 -0.512000 -0.272000 0.808000
+0.950000 -0.502100 -0.136000 -0.296000 0.400000 0.864000
+0.950000 -0.531200 -0.121900 -0.376000 0.368000 0.840000
+0.940600 -0.552300 -0.121900 -0.512000 -0.272000 0.808000
+0.950000 -0.552300 -0.115100 -0.432000 -0.368000 0.816000
+0.950000 -0.560000 -0.121900 -0.400000 -0.536000 0.728000
+0.940600 -0.552300 -0.121900 -0.512000 -0.272000 0.808000
+0.950000 -0.602500 -0.169200 -0.536000 -0.520000 0.656000
+0.900000 -0.552300 -0.159100 -0.496000 -0.592000 0.632000
+0.935000 -0.602500 -0.182900 -0.552000 -0.552000 0.608000
+0.900000 -0.573700 -0.182900 -0.608000 -0.704000 0.344000
+0.933200 -0.602500 -0.243900 -0.584000 -0.624000 -0.512000
+0.900000 -0.578300 -0.243900 -0.552000 -0.704000 -0.440000
+0.950000 -0.602500 -0.260200 -0.544000 -0.504000 -0.664000
+0.900000 -0.552300 -0.278500 -0.424000 -0.592000 -0.672000
+0.950000 -0.552300 -0.303200 -0.304000 0.392000 -0.864000
+0.950000 -0.602500 -0.260200 -0.544000 -0.504000 -0.664000
+0.953900 -0.552300 -0.304800 -0.328000 0.312000 -0.888000
+0.990600 -0.602500 -0.304800 -0.488000 -0.376000 -0.784000
+0.990600 -0.602500 -0.304800 -0.488000 -0.376000 -0.784000
+0.550000 -0.242100 -0.060900 -0.400000 -0.536000 0.736000
+0.550000 -0.242100 -0.060900 -0.400000 -0.536000 0.736000
+0.550000 -0.200800 -0.034900 0.016000 -0.040000 0.992000
+0.562800 -0.251000 -0.060900 -0.368000 -0.568000 0.720000
+0.600000 -0.200800 -0.056500 0.336000 0.448000 0.816000
+0.600000 -0.251000 -0.042400 -0.104000 -0.208000 0.968000
+0.608400 -0.200800 -0.060900 0.360000 0.488000 0.792000
+0.650000 -0.251000 -0.056300 0.424000 -0.024000 0.896000
+0.650000 -0.242600 -0.060900 0.392000 0.384000 0.824000
+0.657600 -0.251000 -0.060900 0.456000 -0.072000 0.880000
+0.650000 -0.251000 -0.056300 0.424000 -0.024000 0.896000
+0.650000 -0.258100 -0.060900 0.392000 -0.456000 0.792000
+0.600000 -0.251000 -0.042400 -0.104000 -0.208000 0.968000
+0.600000 -0.272000 -0.060900 -0.264000 -0.632000 0.720000
+0.562800 -0.251000 -0.060900 -0.368000 -0.568000 0.720000
+0.600000 -0.301200 -0.098800 -0.176000 -0.576000 0.792000
+0.550000 -0.251000 -0.069700 -0.416000 -0.584000 0.688000
+0.552600 -0.301200 -0.121900 -0.368000 -0.384000 0.840000
+0.550000 -0.300100 -0.121900 -0.624000 -0.616000 0.472000
+0.550000 -0.301200 -0.123600 -0.624000 -0.440000 0.632000
+0.552600 -0.301200 -0.121900 -0.368000 -0.384000 0.840000
+0.550000 -0.317100 -0.121900 -0.368000 0.064000 0.920000
+0.600000 -0.333000 -0.121900 0.024000 -0.312000 0.944000
+0.558500 -0.351500 -0.121900 0.208000 -0.648000 0.728000
+0.600000 -0.351500 -0.136300 0.144000 -0.792000 0.584000
+0.550000 -0.353000 -0.121900 -0.032000 -0.832000 0.536000
+0.600000 -0.392700 -0.182900 -0.184000 -0.752000 0.624000
+0.550000 -0.389500 -0.182900 -0.304000 -0.784000 0.528000
+0.600000 -0.401700 -0.203000 -0.208000 -0.872000 0.432000
+0.550000 -0.401700 -0.218900 -0.128000 -0.904000 0.392000
+0.600000 -0.414700 -0.243900 -0.184000 -0.936000 0.272000
+0.550000 -0.409700 -0.243900 -0.144000 -0.944000 0.272000
+0.600000 -0.422100 -0.304800 -0.120000 -0.768000 -0.616000
+0.550000 -0.415900 -0.304800 -0.192000 -0.848000 -0.480000
+0.600000 -0.401700 -0.327900 -0.024000 -0.544000 -0.832000
+0.550000 -0.401700 -0.333700 -0.144000 -0.688000 -0.704000
+0.600000 -0.351500 -0.337900 0.040000 -0.080000 -0.992000
+0.550000 -0.351500 -0.364500 0.120000 -0.104000 -0.984000
+0.600000 -0.301200 -0.352300 -0.528000 -0.312000 -0.776000
+0.550000 -0.316300 -0.304800 -0.472000 0.688000 -0.536000
+0.567500 -0.301200 -0.304800 -0.696000 0.400000 -0.584000
+0.550000 -0.301200 -0.279200 -0.712000 0.120000 -0.680000
+0.550000 -0.272400 -0.304800 -0.680000 -0.440000 -0.576000
+0.550000 -0.272400 -0.304800 -0.680000 -0.440000 -0.576000
+0.616700 0.401700 0.000000 0.496000 0.864000 -0.032000
+0.616700 0.401700 0.000000 0.496000 0.864000 -0.032000
+0.650000 0.368200 0.000000 0.792000 0.584000 -0.144000
+0.600000 0.401700 -0.057700 0.168000 0.920000 -0.344000
+0.650000 0.351500 -0.057700 0.800000 0.552000 -0.208000
+0.600000 0.400600 -0.060900 -0.072000 0.912000 -0.384000
+0.648900 0.351500 -0.060900 0.576000 0.600000 -0.544000
+0.600000 0.351500 -0.101600 0.448000 0.496000 -0.736000
+0.650000 0.350500 -0.060900 0.712000 0.536000 -0.440000
+0.600000 0.310600 -0.121900 0.480000 0.424000 -0.760000
+0.650000 0.301200 -0.100800 0.528000 0.504000 -0.672000
+0.608400 0.301200 -0.121900 0.448000 0.488000 -0.744000
+0.600000 0.310600 -0.121900 0.480000 0.424000 -0.760000
+0.600000 0.301200 -0.128700 0.472000 0.520000 -0.704000
+0.600000 0.301200 -0.128700 0.472000 0.520000 -0.704000
+0.648900 0.351500 -0.060900 0.576000 0.600000 -0.544000
+0.648900 0.351500 -0.060900 0.576000 0.600000 -0.544000
+0.650000 0.350500 -0.060900 0.712000 0.536000 -0.440000
+0.650000 0.351500 -0.057700 0.800000 0.552000 -0.208000
+0.680100 0.301200 -0.060900 0.752000 0.544000 -0.368000
+0.660900 0.351500 0.000000 0.832000 0.512000 -0.176000
+0.685300 0.301200 0.000000 0.832000 0.536000 -0.104000
+0.680100 0.301200 -0.060900 0.752000 0.544000 -0.368000
+0.700000 0.279600 0.000000 0.792000 0.600000 -0.048000
+0.700000 0.278700 -0.060900 0.648000 0.584000 -0.472000
+0.700000 0.278700 -0.060900 0.648000 0.584000 -0.472000
+0.600000 -0.194800 -0.060900 0.352000 0.496000 0.784000
+0.600000 -0.194800 -0.060900 0.352000 0.496000 0.784000
+0.608400 -0.200800 -0.060900 0.360000 0.488000 0.792000
+0.600000 -0.200800 -0.056500 0.336000 0.448000 0.816000
+0.600000 -0.200800 -0.056500 0.336000 0.448000 0.816000
+0.650000 0.368200 0.000000 0.792000 0.584000 -0.144000
+0.650000 0.368200 0.000000 0.792000 0.584000 -0.144000
+0.650000 0.351500 -0.057700 0.800000 0.552000 -0.208000
+0.660900 0.351500 0.000000 0.832000 0.512000 -0.176000
+0.660900 0.351500 0.000000 0.832000 0.512000 -0.176000
+0.650000 0.000000 -0.040500 0.104000 -0.944000 0.296000
+0.650000 0.000000 -0.040500 0.104000 -0.944000 0.296000
+0.686800 0.000000 -0.060900 0.208000 -0.960000 0.144000
+0.650000 -0.010200 -0.060900 0.168000 -0.784000 0.592000
+0.698200 0.000000 -0.121900 0.296000 -0.952000 0.032000
+0.650000 -0.033500 -0.121900 0.512000 -0.672000 0.520000
+0.687300 0.000000 -0.182900 0.648000 -0.600000 -0.456000
+0.650000 -0.048900 -0.182900 0.792000 -0.584000 0.152000
+0.653800 0.000000 -0.243900 0.576000 -0.112000 -0.808000
+0.650000 -0.016900 -0.243900 0.704000 -0.184000 -0.672000
+0.650000 -0.048900 -0.182900 0.792000 -0.584000 0.152000
+0.637200 -0.050200 -0.243900 0.840000 -0.080000 -0.528000
+0.649100 -0.050200 -0.182900 0.816000 -0.544000 0.144000
+0.650000 -0.048900 -0.182900 0.792000 -0.584000 0.152000
+0.638000 -0.050200 -0.121900 0.800000 -0.536000 0.256000
+0.650000 -0.033500 -0.121900 0.512000 -0.672000 0.520000
+0.650000 -0.033500 -0.121900 0.512000 -0.672000 0.520000
+0.800000 -0.015400 0.000000 -0.560000 -0.800000 0.184000
+0.800000 -0.015400 0.000000 -0.560000 -0.800000 0.184000
+0.772100 0.000000 0.000000 -0.504000 -0.832000 0.224000
+0.800000 -0.024700 -0.060900 -0.616000 -0.776000 0.088000
+0.753100 0.000000 -0.060900 -0.472000 -0.872000 0.000000
+0.800000 -0.027900 -0.121900 -0.664000 -0.736000 -0.072000
+0.756600 0.000000 -0.121900 -0.496000 -0.856000 -0.080000
+0.800000 -0.017800 -0.182900 -0.616000 -0.680000 -0.376000
+0.776700 0.000000 -0.182900 -0.576000 -0.728000 -0.360000
+0.800000 0.000000 -0.217200 -0.656000 -0.464000 -0.584000
+0.800000 0.000000 -0.217200 -0.656000 -0.464000 -0.584000
+0.900000 0.131100 0.000000 0.480000 0.848000 0.192000
+0.900000 0.131100 0.000000 0.480000 0.848000 0.192000
+0.950000 0.102000 0.000000 0.472000 0.864000 0.120000
+0.900000 0.143500 -0.060900 0.528000 0.808000 -0.240000
+0.950000 0.106300 -0.060900 0.576000 0.776000 -0.240000
+0.900000 0.127900 -0.121900 0.560000 0.776000 -0.264000
+0.950000 0.100400 -0.078300 0.560000 0.768000 -0.304000
+0.931600 0.100400 -0.121900 0.600000 0.744000 -0.272000
+0.950000 0.086300 -0.121900 0.544000 0.784000 -0.280000
+0.912000 0.100400 -0.182900 0.600000 0.704000 -0.360000
+0.950000 0.069900 -0.182900 0.544000 0.736000 -0.392000
+0.900000 0.100400 -0.203200 0.536000 0.688000 -0.472000
+0.950000 0.050200 -0.224500 0.472000 0.712000 -0.504000
+0.900000 0.070800 -0.243900 -0.096000 0.744000 -0.656000
+0.929600 0.050200 -0.243900 0.432000 0.672000 -0.584000
+0.900000 0.050200 -0.268900 0.208000 0.672000 -0.696000
+0.950000 0.037500 -0.243900 0.432000 0.688000 -0.576000
+0.900000 0.016700 -0.304800 -0.152000 0.720000 -0.664000
+0.950000 0.000000 -0.291100 0.424000 0.536000 -0.720000
+0.927400 0.000000 -0.304800 0.400000 0.560000 -0.720000
+0.950000 -0.016600 -0.304800 0.448000 0.520000 -0.720000
+0.900000 0.000000 -0.329500 -0.080000 0.648000 -0.744000
+0.950000 -0.050200 -0.338500 0.440000 0.400000 -0.800000
+0.900000 -0.050200 -0.348300 -0.256000 0.192000 -0.944000
+0.950000 -0.100400 -0.351000 0.336000 0.064000 -0.936000
+0.900000 -0.100400 -0.341700 -0.464000 -0.104000 -0.872000
+0.950000 -0.150600 -0.345500 -0.032000 0.064000 -0.992000
+0.900000 -0.150600 -0.332000 -0.672000 -0.328000 -0.656000
+0.900000 -0.150600 -0.332000 -0.672000 -0.328000 -0.656000
+0.995800 -0.200800 0.000000 -0.648000 -0.704000 0.264000
+0.995800 -0.200800 0.000000 -0.648000 -0.704000 0.264000
+0.950000 -0.168100 0.000000 -0.640000 -0.744000 0.184000
+0.973000 -0.200800 -0.060900 -0.584000 -0.760000 0.264000
+0.950000 -0.183700 -0.060900 -0.632000 -0.728000 0.232000
+0.950500 -0.200800 -0.121900 -0.632000 -0.744000 0.192000
+0.950000 -0.200400 -0.121900 -0.720000 -0.672000 0.136000
+0.950000 -0.200800 -0.124000 -0.680000 -0.712000 0.160000
+0.950000 -0.200800 -0.124000 -0.680000 -0.712000 0.160000
+-0.910500 0.251000 -0.121900 0.344000 0.880000 -0.304000
+-0.910500 0.251000 -0.121900 0.344000 0.880000 -0.304000
+-0.900000 0.246900 -0.121900 0.360000 0.872000 -0.304000
+-0.900000 0.251000 -0.101700 0.376000 0.896000 -0.216000
+-0.900000 0.251000 -0.101700 0.376000 0.896000 -0.216000
+-0.900000 -0.502100 -0.104000 -0.752000 0.000000 0.656000
+-0.900000 -0.502100 -0.104000 -0.752000 0.000000 0.656000
+-0.900000 -0.511500 -0.121900 -0.520000 -0.664000 0.528000
+-0.906100 -0.502100 -0.121900 -0.920000 0.072000 0.376000
+-0.900000 -0.542100 -0.182900 -0.808000 -0.560000 0.136000
+-0.925200 -0.502100 -0.182900 -0.976000 -0.008000 0.208000
+-0.900000 -0.551700 -0.243900 -0.808000 -0.568000 -0.120000
+-0.929300 -0.502100 -0.243900 -0.992000 0.064000 -0.008000
+-0.900000 -0.539600 -0.304800 -0.720000 -0.488000 -0.480000
+-0.920600 -0.502100 -0.304800 -0.888000 -0.288000 -0.344000
+-0.900000 -0.502100 -0.352600 -0.672000 0.128000 -0.720000
+-0.900000 -0.539600 -0.304800 -0.720000 -0.488000 -0.480000
+-0.864000 -0.502100 -0.365800 -0.304000 0.480000 -0.816000
+-0.891900 -0.552300 -0.304800 -0.800000 -0.568000 -0.136000
+-0.860100 -0.552300 -0.365800 -0.680000 -0.432000 -0.584000
+-0.850000 -0.602000 -0.304800 -0.640000 -0.736000 -0.184000
+-0.850000 -0.564700 -0.365800 -0.608000 -0.528000 -0.584000
+-0.849200 -0.602500 -0.304800 -0.536000 -0.720000 -0.432000
+-0.806700 -0.602500 -0.365800 -0.520000 -0.656000 -0.536000
+-0.800000 -0.636000 -0.304800 -0.536000 -0.792000 -0.272000
+-0.800000 -0.607700 -0.365800 -0.488000 -0.640000 -0.584000
+-0.750000 -0.652200 -0.304800 -0.040000 -0.952000 -0.288000
+-0.750000 -0.628000 -0.365800 -0.232000 -0.808000 -0.528000
+-0.734200 -0.652700 -0.304800 -0.024000 -0.976000 -0.192000
+-0.700000 -0.639000 -0.365800 -0.040000 -0.920000 -0.376000
+-0.700000 -0.652700 -0.309000 0.024000 -0.952000 -0.296000
+-0.650000 -0.641900 -0.365800 -0.024000 -0.952000 -0.280000
+-0.688500 -0.652700 -0.304800 0.080000 -0.992000 -0.064000
+-0.650000 -0.650400 -0.304800 0.048000 -0.992000 0.096000
+-0.700000 -0.652700 -0.298900 0.056000 -0.976000 0.184000
+-0.650000 -0.641500 -0.243900 0.040000 -0.976000 0.168000
+-0.700000 -0.645500 -0.243900 -0.008000 -0.984000 0.160000
+-0.650000 -0.630900 -0.182900 0.008000 -0.968000 0.232000
+-0.700000 -0.633400 -0.182900 -0.064000 -0.960000 0.248000
+-0.650000 -0.615500 -0.121900 -0.008000 -0.952000 0.304000
+-0.700000 -0.614700 -0.121900 -0.136000 -0.888000 0.424000
+-0.650000 -0.602500 -0.069700 -0.072000 -0.800000 0.584000
+-0.700000 -0.602500 -0.083600 -0.192000 -0.680000 0.704000
+-0.650000 -0.594800 -0.060900 -0.368000 -0.640000 0.664000
+-0.700000 -0.552300 -0.082500 -0.736000 -0.280000 0.608000
+-0.685200 -0.552300 -0.060900 -0.696000 -0.384000 0.592000
+-0.700000 -0.507800 -0.060900 -0.864000 -0.200000 0.448000
+-0.700000 -0.507800 -0.060900 -0.864000 -0.200000 0.448000
+-0.868200 -0.552300 -0.121900 -0.520000 -0.224000 0.816000
+-0.868200 -0.552300 -0.121900 -0.520000 -0.224000 0.816000
+-0.850000 -0.552300 -0.082300 -0.704000 -0.480000 0.504000
+-0.850000 -0.569100 -0.121900 -0.488000 -0.776000 0.384000
+-0.800000 -0.552300 -0.095900 0.424000 0.264000 0.864000
+-0.800000 -0.584500 -0.121900 -0.288000 -0.544000 0.776000
+-0.750000 -0.552300 -0.119400 0.072000 0.512000 0.848000
+-0.764000 -0.602500 -0.121900 -0.176000 -0.816000 0.544000
+-0.750000 -0.602500 -0.116200 -0.176000 -0.808000 0.544000
+-0.750000 -0.605000 -0.121900 -0.152000 -0.872000 0.456000
+-0.700000 -0.602500 -0.083600 -0.192000 -0.680000 0.704000
+-0.700000 -0.614700 -0.121900 -0.136000 -0.888000 0.424000
+-0.750000 -0.605000 -0.121900 -0.152000 -0.872000 0.456000
+-0.700000 -0.633400 -0.182900 -0.064000 -0.960000 0.248000
+-0.750000 -0.630100 -0.182900 -0.144000 -0.912000 0.360000
+-0.700000 -0.645500 -0.243900 -0.008000 -0.984000 0.160000
+-0.750000 -0.646000 -0.243900 -0.088000 -0.984000 0.144000
+-0.700000 -0.652700 -0.298900 0.056000 -0.976000 0.184000
+-0.750000 -0.652200 -0.304800 -0.040000 -0.952000 -0.288000
+-0.734200 -0.652700 -0.304800 -0.024000 -0.976000 -0.192000
+-0.700000 -0.652700 -0.298900 0.056000 -0.976000 0.184000
+-0.700000 -0.653800 -0.304800 0.056000 -0.992000 -0.080000
+-0.688500 -0.652700 -0.304800 0.080000 -0.992000 -0.064000
+-0.700000 -0.652700 -0.309000 0.024000 -0.952000 -0.296000
+-0.700000 -0.653800 -0.304800 0.056000 -0.992000 -0.080000
+-0.734200 -0.652700 -0.304800 -0.024000 -0.976000 -0.192000
+-0.734200 -0.652700 -0.304800 -0.024000 -0.976000 -0.192000
+-0.804300 0.200800 -0.121900 0.384000 0.872000 -0.288000
+-0.804300 0.200800 -0.121900 0.384000 0.872000 -0.288000
+-0.800000 0.198900 -0.121900 0.384000 0.872000 -0.288000
+-0.800000 0.200800 -0.113900 0.392000 0.880000 -0.256000
+-0.800000 0.200800 -0.113900 0.392000 0.880000 -0.256000
+-0.762700 -0.401700 -0.060900 -0.840000 -0.496000 0.168000
+-0.762700 -0.401700 -0.060900 -0.840000 -0.496000 0.168000
+-0.771000 -0.401700 -0.121900 -0.872000 -0.456000 0.128000
+-0.750000 -0.426100 -0.060900 -0.864000 -0.448000 0.200000
+-0.750000 -0.448400 -0.121900 -0.880000 -0.432000 0.160000
+-0.735400 -0.451900 -0.060900 -0.768000 -0.512000 0.360000
+-0.748200 -0.451900 -0.121900 -0.880000 -0.440000 0.160000
+-0.701200 -0.502100 -0.060900 -0.816000 -0.416000 0.392000
+-0.723300 -0.502100 -0.121900 -0.896000 -0.224000 0.368000
+-0.748200 -0.451900 -0.121900 -0.880000 -0.440000 0.160000
+-0.749300 -0.502100 -0.182900 -0.920000 -0.232000 0.288000
+-0.750000 -0.451900 -0.133400 -0.896000 -0.392000 0.184000
+-0.750000 -0.499500 -0.182900 -0.936000 -0.200000 0.264000
+-0.757600 -0.451900 -0.182900 -0.952000 -0.232000 0.184000
+-0.750000 -0.502100 -0.184800 -0.496000 0.696000 0.496000
+-0.769800 -0.451900 -0.243900 -0.952000 -0.080000 0.272000
+-0.800000 -0.502100 -0.227500 0.432000 0.824000 0.352000
+-0.800000 -0.496000 -0.243900 0.424000 0.840000 0.320000
+-0.820300 -0.502100 -0.182900 0.496000 0.792000 0.344000
+-0.850000 -0.480800 -0.243900 0.376000 0.912000 0.152000
+-0.850000 -0.490700 -0.182900 0.328000 0.896000 0.288000
+-0.896800 -0.451900 -0.243900 0.600000 0.776000 0.136000
+-0.900000 -0.462200 -0.182900 0.320000 0.888000 0.304000
+-0.900000 -0.451900 -0.229200 0.512000 0.832000 0.168000
+-0.896800 -0.451900 -0.243900 0.600000 0.776000 0.136000
+-0.900000 -0.449600 -0.243900 0.496000 0.856000 0.136000
+-0.891000 -0.451900 -0.304800 0.528000 0.824000 -0.192000
+-0.900000 -0.446300 -0.304800 0.160000 0.912000 -0.360000
+-0.900000 -0.451900 -0.318500 0.104000 0.872000 -0.464000
+-0.912200 -0.451900 -0.304800 -0.496000 0.720000 -0.464000
+-0.900000 -0.446300 -0.304800 0.160000 0.912000 -0.360000
+-0.921000 -0.451900 -0.243900 -0.184000 0.968000 0.160000
+-0.900000 -0.449600 -0.243900 0.496000 0.856000 0.136000
+-0.900000 -0.451900 -0.229200 0.512000 0.832000 0.168000
+-0.900000 -0.451900 -0.229200 0.512000 0.832000 0.168000
+-0.700000 -0.602500 -0.083600 -0.192000 -0.680000 0.704000
+-0.700000 -0.602500 -0.083600 -0.192000 -0.680000 0.704000
+-0.750000 -0.602500 -0.116200 -0.176000 -0.808000 0.544000
+-0.700000 -0.552300 -0.082500 -0.736000 -0.280000 0.608000
+-0.750000 -0.552300 -0.119400 0.072000 0.512000 0.848000
+-0.750000 -0.552300 -0.119400 0.072000 0.512000 0.848000
+-0.650000 -0.594800 -0.060900 -0.368000 -0.640000 0.664000
+-0.650000 -0.594800 -0.060900 -0.368000 -0.640000 0.664000
+-0.650000 -0.602500 -0.069700 -0.072000 -0.800000 0.584000
+-0.600000 -0.601900 -0.060900 -0.072000 -0.808000 0.568000
+-0.600000 -0.602500 -0.062100 -0.056000 -0.816000 0.560000
+-0.550000 -0.588500 -0.060900 0.224000 -0.888000 0.384000
+-0.550000 -0.602500 -0.100200 0.256000 -0.912000 0.288000
+-0.500000 -0.570000 -0.060900 0.480000 -0.800000 0.328000
+-0.531000 -0.602500 -0.121900 0.248000 -0.920000 0.272000
+-0.500000 -0.589900 -0.121900 0.408000 -0.832000 0.352000
+-0.500000 -0.602500 -0.155300 0.000000 -0.920000 0.376000
+-0.531000 -0.602500 -0.121900 0.248000 -0.920000 0.272000
+-0.500000 -0.610400 -0.182900 -0.136000 -0.936000 0.304000
+-0.550000 -0.606400 -0.121900 0.192000 -0.952000 0.216000
+-0.550000 -0.618800 -0.182900 0.168000 -0.944000 0.272000
+-0.600000 -0.616000 -0.121900 0.080000 -0.960000 0.256000
+-0.600000 -0.629300 -0.182900 0.072000 -0.968000 0.224000
+-0.650000 -0.615500 -0.121900 -0.008000 -0.952000 0.304000
+-0.650000 -0.630900 -0.182900 0.008000 -0.968000 0.232000
+-0.600000 -0.629300 -0.182900 0.072000 -0.968000 0.224000
+-0.650000 -0.641500 -0.243900 0.040000 -0.976000 0.168000
+-0.600000 -0.640700 -0.243900 0.080000 -0.976000 0.192000
+-0.650000 -0.650400 -0.304800 0.048000 -0.992000 0.096000
+-0.600000 -0.650800 -0.304800 0.064000 -0.992000 0.000000
+-0.650000 -0.641900 -0.365800 -0.024000 -0.952000 -0.280000
+-0.600000 -0.645500 -0.365800 0.016000 -0.968000 -0.216000
+-0.650000 -0.621300 -0.426800 -0.080000 -0.904000 -0.400000
+-0.600000 -0.630300 -0.426800 -0.072000 -0.944000 -0.312000
+-0.600000 -0.645500 -0.365800 0.016000 -0.968000 -0.216000
+-0.550000 -0.626200 -0.426800 0.144000 -0.960000 -0.232000
+-0.550000 -0.637200 -0.365800 0.152000 -0.968000 -0.168000
+-0.500000 -0.621400 -0.426800 0.072000 -0.968000 -0.232000
+-0.500000 -0.633000 -0.365800 -0.088000 -0.968000 -0.200000
+-0.450000 -0.629300 -0.426800 -0.048000 -0.904000 -0.416000
+-0.450000 -0.645700 -0.365800 -0.144000 -0.904000 -0.392000
+-0.400000 -0.621700 -0.426800 0.392000 -0.856000 -0.304000
+-0.405700 -0.652700 -0.365800 -0.144000 -0.920000 -0.344000
+-0.400000 -0.652700 -0.368100 -0.128000 -0.872000 -0.456000
+-0.400000 -0.652700 -0.368100 -0.128000 -0.872000 -0.456000
+-0.650000 -0.602500 -0.069700 -0.072000 -0.800000 0.584000
+-0.650000 -0.602500 -0.069700 -0.072000 -0.800000 0.584000
+-0.650000 -0.615500 -0.121900 -0.008000 -0.952000 0.304000
+-0.600000 -0.602500 -0.062100 -0.056000 -0.816000 0.560000
+-0.600000 -0.616000 -0.121900 0.080000 -0.960000 0.256000
+-0.550000 -0.602500 -0.100200 0.256000 -0.912000 0.288000
+-0.550000 -0.606400 -0.121900 0.192000 -0.952000 0.216000
+-0.531000 -0.602500 -0.121900 0.248000 -0.920000 0.272000
+-0.531000 -0.602500 -0.121900 0.248000 -0.920000 0.272000
+-0.554400 -0.050200 -0.060900 0.944000 0.280000 0.128000
+-0.554400 -0.050200 -0.060900 0.944000 0.280000 0.128000
+-0.586600 -0.050200 -0.121900 0.872000 0.224000 -0.424000
+-0.550000 -0.066800 -0.060900 0.944000 0.320000 -0.008000
+-0.578300 -0.100400 -0.121900 0.848000 0.312000 -0.424000
+-0.550000 -0.100400 -0.079500 0.552000 0.552000 -0.616000
+-0.550000 -0.145600 -0.121900 0.512000 0.792000 -0.312000
+-0.578300 -0.100400 -0.121900 0.848000 0.312000 -0.424000
+-0.550000 -0.150600 -0.142400 0.376000 0.896000 -0.200000
+-0.594100 -0.100400 -0.182900 0.816000 0.296000 -0.480000
+-0.561800 -0.150600 -0.182900 0.544000 0.784000 -0.280000
+-0.550000 -0.150600 -0.142400 0.376000 0.896000 -0.200000
+-0.550000 -0.155500 -0.182900 0.296000 0.920000 -0.232000
+-0.550000 -0.155500 -0.182900 0.296000 0.920000 -0.232000
+-0.452400 -0.100400 -0.060900 -0.344000 0.936000 -0.016000
+-0.452400 -0.100400 -0.060900 -0.344000 0.936000 -0.016000
+-0.450000 -0.100400 -0.065100 -0.512000 0.824000 -0.200000
+-0.450000 -0.099400 -0.060900 -0.760000 0.616000 0.160000
+-0.450000 -0.099400 -0.060900 -0.760000 0.616000 0.160000
+-0.450000 -0.512800 -0.060900 0.208000 -0.760000 0.608000
+-0.450000 -0.512800 -0.060900 0.208000 -0.760000 0.608000
+-0.478800 -0.552300 -0.060900 0.704000 -0.592000 0.376000
+-0.450000 -0.549200 -0.121900 -0.080000 -0.800000 0.584000
+-0.452200 -0.552300 -0.121900 0.864000 0.184000 0.464000
+-0.450000 -0.552300 -0.127200 0.616000 -0.144000 0.768000
+-0.450000 -0.549200 -0.121900 -0.080000 -0.800000 0.584000
+-0.440600 -0.552300 -0.121900 -0.264000 -0.768000 0.568000
+-0.450000 -0.512800 -0.060900 0.208000 -0.760000 0.608000
+-0.400000 -0.552300 -0.100200 0.624000 -0.512000 0.584000
+-0.400000 -0.527700 -0.060900 0.080000 -0.768000 0.624000
+-0.393200 -0.552300 -0.121900 0.872000 -0.352000 0.320000
+-0.380200 -0.502100 -0.060900 0.648000 -0.616000 0.432000
+-0.350000 -0.503000 -0.121900 0.232000 -0.880000 0.400000
+-0.350000 -0.502100 -0.119400 0.240000 -0.864000 0.424000
+-0.380200 -0.502100 -0.060900 0.648000 -0.616000 0.432000
+-0.350000 -0.453900 -0.060900 0.248000 -0.624000 0.728000
+-0.350000 -0.453900 -0.060900 0.248000 -0.624000 0.728000
+-0.450000 -0.602500 -0.084100 -0.232000 -0.736000 0.624000
+-0.450000 -0.602500 -0.084100 -0.232000 -0.736000 0.624000
+-0.450000 -0.558900 -0.121900 0.808000 0.320000 0.488000
+-0.410500 -0.602500 -0.121900 0.456000 -0.632000 0.616000
+-0.450000 -0.552300 -0.127200 0.616000 -0.144000 0.768000
+-0.400000 -0.602500 -0.131300 0.560000 -0.576000 0.584000
+-0.440600 -0.552300 -0.121900 -0.264000 -0.768000 0.568000
+-0.400000 -0.588000 -0.121900 0.672000 -0.144000 0.720000
+-0.400000 -0.552300 -0.100200 0.624000 -0.512000 0.584000
+-0.393200 -0.552300 -0.121900 0.872000 -0.352000 0.320000
+-0.400000 -0.588000 -0.121900 0.672000 -0.144000 0.720000
+-0.379200 -0.552300 -0.182900 0.864000 -0.416000 0.264000
+-0.400000 -0.602500 -0.131300 0.560000 -0.576000 0.584000
+-0.386500 -0.602500 -0.182900 0.376000 -0.032000 0.920000
+-0.379200 -0.552300 -0.182900 0.864000 -0.416000 0.264000
+-0.371400 -0.602500 -0.243900 0.928000 0.016000 0.352000
+-0.363900 -0.552300 -0.243900 0.816000 -0.480000 0.304000
+-0.379200 -0.552300 -0.182900 0.864000 -0.416000 0.264000
+-0.350000 -0.535600 -0.243900 0.360000 -0.840000 0.384000
+-0.350000 -0.518400 -0.182900 -0.088000 -0.928000 0.360000
+-0.379200 -0.552300 -0.182900 0.864000 -0.416000 0.264000
+-0.350000 -0.503000 -0.121900 0.232000 -0.880000 0.400000
+-0.393200 -0.552300 -0.121900 0.872000 -0.352000 0.320000
+-0.393200 -0.552300 -0.121900 0.872000 -0.352000 0.320000
+-0.350000 0.148000 -0.060900 -0.504000 0.552000 0.656000
+-0.350000 0.148000 -0.060900 -0.504000 0.552000 0.656000
+-0.361800 0.100400 -0.060900 -0.920000 0.112000 -0.352000
+-0.350000 0.100400 -0.076700 -0.736000 0.256000 -0.616000
+-0.358600 0.050200 -0.060900 -0.920000 0.168000 -0.328000
+-0.350000 0.050200 -0.078800 -0.832000 0.272000 -0.472000
+-0.350000 0.100400 -0.076700 -0.736000 0.256000 -0.616000
+-0.335400 0.050200 -0.121900 -0.752000 0.472000 -0.456000
+-0.317300 0.100400 -0.121900 -0.712000 0.264000 -0.640000
+-0.317300 0.100400 -0.121900 -0.712000 0.264000 -0.640000
+-0.377800 0.000000 -0.060900 -0.864000 0.424000 -0.248000
+-0.377800 0.000000 -0.060900 -0.864000 0.424000 -0.248000
+-0.400000 -0.037800 -0.060900 -0.728000 0.664000 0.152000
+-0.372200 0.000000 -0.121900 -0.848000 0.480000 -0.200000
+-0.400000 -0.050200 -0.118700 -0.832000 0.528000 -0.160000
+-0.399400 -0.050200 -0.121900 -0.760000 0.504000 -0.392000
+-0.400000 -0.050900 -0.121900 -0.736000 0.536000 -0.408000
+-0.400000 -0.050900 -0.121900 -0.736000 0.536000 -0.408000
+-0.350000 0.301200 -0.064600 -0.624000 0.064000 -0.768000
+-0.350000 0.301200 -0.064600 -0.624000 0.064000 -0.768000
+-0.300000 0.301200 -0.089300 -0.344000 0.056000 -0.936000
+-0.350000 0.251000 -0.067500 -0.624000 0.048000 -0.768000
+-0.300000 0.251000 -0.090000 -0.368000 0.088000 -0.920000
+-0.350000 0.200800 -0.076700 -0.368000 -0.104000 -0.920000
+-0.300000 0.200800 -0.077300 -0.504000 0.240000 -0.824000
+-0.350000 0.153200 -0.060900 -0.608000 -0.784000 0.016000
+-0.300000 0.150600 -0.105900 -0.768000 0.536000 -0.320000
+-0.346000 0.150600 -0.060900 -0.768000 -0.144000 0.616000
+-0.346000 0.150600 -0.060900 -0.768000 -0.144000 0.616000
+-0.300000 0.401700 -0.066400 -0.448000 0.440000 -0.768000
+-0.300000 0.401700 -0.066400 -0.448000 0.440000 -0.768000
+-0.250000 0.401700 -0.091800 -0.416000 0.456000 -0.776000
+-0.300000 0.351500 -0.083400 -0.432000 0.176000 -0.880000
+-0.250000 0.351500 -0.107800 -0.464000 0.176000 -0.864000
+-0.300000 0.301200 -0.089300 -0.344000 0.056000 -0.936000
+-0.250000 0.301200 -0.116200 -0.672000 0.120000 -0.720000
+-0.300000 0.251000 -0.090000 -0.368000 0.088000 -0.920000
+-0.250000 0.268200 -0.121900 -0.464000 0.088000 -0.872000
+-0.254200 0.251000 -0.121900 -0.384000 0.088000 -0.912000
+-0.300000 0.251000 -0.090000 -0.368000 0.088000 -0.920000
+-0.263400 0.200800 -0.121900 -0.480000 0.216000 -0.840000
+-0.300000 0.200800 -0.077300 -0.504000 0.240000 -0.824000
+-0.295300 0.150600 -0.121900 -0.728000 0.520000 -0.432000
+-0.300000 0.150600 -0.105900 -0.768000 0.536000 -0.320000
+-0.300000 0.144000 -0.121900 -0.728000 0.496000 -0.456000
+-0.300000 0.144000 -0.121900 -0.728000 0.496000 -0.456000
+-0.250000 0.401700 -0.091800 -0.416000 0.456000 -0.776000
+-0.250000 0.401700 -0.091800 -0.416000 0.456000 -0.776000
+-0.208300 0.401700 -0.121900 -0.432000 0.432000 -0.784000
+-0.250000 0.351500 -0.107800 -0.464000 0.176000 -0.864000
+-0.233300 0.351500 -0.121900 -0.616000 0.184000 -0.752000
+-0.250000 0.301200 -0.116200 -0.672000 0.120000 -0.720000
+-0.245300 0.301200 -0.121900 -0.680000 0.120000 -0.720000
+-0.250000 0.268200 -0.121900 -0.464000 0.088000 -0.872000
+-0.250000 0.268200 -0.121900 -0.464000 0.088000 -0.872000
+-0.104300 -0.100400 -0.060900 0.528000 0.416000 0.728000
+-0.104300 -0.100400 -0.060900 0.528000 0.416000 0.728000
+-0.100000 -0.100400 -0.064700 0.496000 0.416000 0.752000
+-0.100000 -0.105500 -0.060900 0.480000 0.464000 0.736000
+-0.050000 -0.100400 -0.073900 0.136000 0.480000 0.864000
+-0.050000 -0.119400 -0.060900 0.168000 0.528000 0.824000
+0.000000 -0.100400 -0.085100 0.096000 0.456000 0.880000
+0.000000 -0.136800 -0.060900 0.088000 0.520000 0.840000
+0.050000 -0.100400 -0.083400 0.000000 0.440000 0.888000
+0.050000 -0.140200 -0.060900 0.152000 0.504000 0.848000
+0.100000 -0.100400 -0.084200 0.032000 0.360000 0.928000
+0.076800 -0.150600 -0.060900 0.208000 0.432000 0.872000
+0.100000 -0.150600 -0.068400 0.184000 0.416000 0.888000
+0.100000 -0.170000 -0.060900 0.256000 0.296000 0.912000
+0.100000 -0.170000 -0.060900 0.256000 0.296000 0.912000
+-0.133200 -0.451900 -0.060900 0.584000 -0.656000 0.464000
+-0.133200 -0.451900 -0.060900 0.584000 -0.656000 0.464000
+-0.100000 -0.415900 -0.060900 0.680000 -0.544000 0.480000
+-0.100000 -0.451900 -0.117700 0.624000 -0.664000 0.392000
+-0.100000 -0.451900 -0.117700 0.624000 -0.664000 0.392000
+-0.150000 -0.502100 -0.111600 0.592000 -0.752000 0.280000
+-0.150000 -0.502100 -0.111600 0.592000 -0.752000 0.280000
+-0.146100 -0.502100 -0.121900 0.616000 -0.744000 0.232000
+-0.150000 -0.505100 -0.121900 0.584000 -0.768000 0.240000
+-0.141200 -0.502100 -0.182900 0.696000 -0.688000 0.184000
+-0.150000 -0.510100 -0.182900 0.616000 -0.760000 0.168000
+-0.125700 -0.502100 -0.243900 0.664000 -0.408000 0.624000
+-0.150000 -0.530700 -0.243900 0.632000 -0.664000 0.392000
+-0.150000 -0.530700 -0.243900 0.632000 -0.664000 0.392000
+-0.078700 0.200800 -0.060900 0.568000 -0.416000 0.704000
+-0.078700 0.200800 -0.060900 0.568000 -0.416000 0.704000
+-0.050000 0.236000 -0.060900 0.536000 -0.496000 0.672000
+-0.050000 0.200800 -0.090500 0.520000 -0.520000 0.672000
+-0.050000 0.200800 -0.090500 0.520000 -0.520000 0.672000
+-0.100000 0.100400 -0.099400 0.760000 -0.264000 0.584000
+-0.100000 0.100400 -0.099400 0.760000 -0.264000 0.584000
+-0.089100 0.100400 -0.121900 0.816000 -0.232000 0.520000
+-0.100000 0.054100 -0.121900 0.816000 -0.176000 0.544000
+-0.100000 0.054100 -0.121900 0.816000 -0.176000 0.544000
+-0.050000 -0.370100 -0.060900 0.592000 -0.672000 0.424000
+-0.050000 -0.370100 -0.060900 0.592000 -0.672000 0.424000
+-0.087700 -0.401700 -0.060900 0.608000 -0.600000 0.504000
+-0.050000 -0.398200 -0.121900 0.592000 -0.704000 0.368000
+-0.054100 -0.401700 -0.121900 0.656000 -0.688000 0.280000
+-0.050000 -0.389600 -0.182900 0.656000 -0.736000 -0.128000
+-0.061900 -0.401700 -0.182900 0.744000 -0.648000 -0.120000
+-0.050000 -0.380500 -0.243900 0.664000 -0.736000 -0.104000
+-0.071000 -0.401700 -0.243900 0.856000 -0.496000 -0.072000
+-0.050000 -0.374600 -0.304800 0.584000 -0.672000 -0.448000
+-0.073900 -0.401700 -0.304800 0.784000 -0.304000 -0.528000
+-0.050000 -0.351500 -0.336900 0.024000 -0.576000 -0.808000
+-0.100000 -0.401700 -0.330800 0.576000 -0.152000 -0.792000
+-0.100000 -0.351500 -0.338800 0.024000 -0.312000 -0.944000
+-0.150000 -0.401700 -0.364300 0.552000 0.080000 -0.824000
+-0.150000 -0.351500 -0.350300 0.512000 0.192000 -0.832000
+-0.100000 -0.351500 -0.338800 0.024000 -0.312000 -0.944000
+-0.150000 -0.301200 -0.318500 -0.024000 0.504000 -0.856000
+-0.100000 -0.301200 -0.349000 -0.368000 0.264000 -0.888000
+-0.150000 -0.286300 -0.304800 -0.184000 0.480000 -0.848000
+-0.100000 -0.251000 -0.333700 -0.512000 0.248000 -0.816000
+-0.123600 -0.251000 -0.304800 -0.536000 0.288000 -0.784000
+-0.100000 -0.200800 -0.311700 -0.496000 0.128000 -0.856000
+-0.108400 -0.200800 -0.304800 -0.496000 -0.048000 -0.856000
+-0.123600 -0.251000 -0.304800 -0.536000 0.288000 -0.784000
+-0.150000 -0.200800 -0.284500 0.024000 -0.216000 -0.968000
+-0.150000 -0.251000 -0.289400 -0.264000 0.272000 -0.920000
+-0.196100 -0.200800 -0.304800 0.360000 -0.200000 -0.904000
+-0.195100 -0.251000 -0.304800 0.376000 0.112000 -0.912000
+-0.150000 -0.251000 -0.289400 -0.264000 0.272000 -0.920000
+-0.150000 -0.286300 -0.304800 -0.184000 0.480000 -0.848000
+-0.123600 -0.251000 -0.304800 -0.536000 0.288000 -0.784000
+-0.123600 -0.251000 -0.304800 -0.536000 0.288000 -0.784000
+0.000000 0.393800 -0.060900 0.224000 0.176000 0.952000
+0.000000 0.393800 -0.060900 0.224000 0.176000 0.952000
+-0.005200 0.401700 -0.060900 0.264000 0.168000 0.944000
+0.000000 0.401700 -0.062800 0.256000 0.176000 0.944000
+0.000000 0.401700 -0.062800 0.256000 0.176000 0.944000
+0.000000 0.493800 -0.121900 0.128000 0.960000 -0.232000
+0.000000 0.493800 -0.121900 0.128000 0.960000 -0.232000
+0.000000 0.451900 -0.081100 0.280000 0.456000 0.832000
+0.050000 0.485400 -0.121900 -0.032000 0.904000 -0.408000
+0.050000 0.451900 -0.077800 0.016000 0.408000 0.912000
+0.100000 0.494400 -0.121900 -0.184000 0.952000 -0.216000
+0.100000 0.451900 -0.066700 -0.192000 0.072000 0.976000
+0.138500 0.502100 -0.121900 -0.184000 0.952000 -0.216000
+0.121900 0.451900 -0.060900 -0.112000 0.472000 0.872000
+0.150000 0.502100 -0.119700 0.016000 0.656000 0.752000
+0.150000 0.456100 -0.060900 0.048000 0.664000 0.736000
+0.150000 0.456100 -0.060900 0.048000 0.664000 0.736000
+0.150000 0.503100 -0.121900 0.272000 0.456000 -0.840000
+0.150000 0.503100 -0.121900 0.272000 0.456000 -0.840000
+0.150000 0.502100 -0.119700 0.016000 0.656000 0.752000
+0.138500 0.502100 -0.121900 -0.184000 0.952000 -0.216000
+0.138500 0.502100 -0.121900 -0.184000 0.952000 -0.216000
+0.150000 0.409600 -0.060900 -0.208000 -0.072000 0.968000
+0.150000 0.409600 -0.060900 -0.208000 -0.072000 0.968000
+0.151400 0.401700 -0.060900 -0.480000 -0.416000 0.760000
+0.150000 0.401700 -0.062100 -0.392000 -0.400000 0.816000
+0.150000 0.401700 -0.062100 -0.392000 -0.400000 0.816000
+0.150000 -0.251000 -0.118100 0.224000 -0.792000 0.560000
+0.150000 -0.251000 -0.118100 0.224000 -0.792000 0.560000
+0.161400 -0.251000 -0.121900 0.152000 -0.792000 0.576000
+0.150000 -0.253200 -0.121900 0.192000 -0.808000 0.552000
+0.150000 -0.253200 -0.121900 0.192000 -0.808000 0.552000
+0.250000 0.432000 -0.060900 0.224000 0.624000 0.736000
+0.250000 0.432000 -0.060900 0.224000 0.624000 0.736000
+0.203100 0.451900 -0.060900 0.264000 0.672000 0.680000
+0.250000 0.451900 -0.094000 0.248000 0.784000 0.552000
+0.250000 0.451900 -0.094000 0.248000 0.784000 0.552000
+0.200000 0.352900 -0.060900 -0.368000 -0.496000 0.776000
+0.200000 0.352900 -0.060900 -0.368000 -0.496000 0.776000
+0.201200 0.351500 -0.060900 -0.488000 -0.576000 0.648000
+0.200000 0.351500 -0.062100 -0.312000 -0.640000 0.696000
+0.200000 0.351500 -0.062100 -0.312000 -0.640000 0.696000
+0.200000 -0.041200 -0.121900 0.160000 0.488000 0.856000
+0.200000 -0.041200 -0.121900 0.160000 0.488000 0.856000
+0.222300 -0.050200 -0.121900 0.200000 0.432000 0.872000
+0.200000 -0.050200 -0.116900 0.136000 0.368000 0.912000
+0.200000 -0.050200 -0.116900 0.136000 0.368000 0.912000
+0.300000 0.451900 -0.106900 0.184000 0.864000 0.456000
+0.300000 0.451900 -0.106900 0.184000 0.864000 0.456000
+0.300000 0.458100 -0.121900 0.224000 0.952000 -0.176000
+0.323400 0.451900 -0.121900 0.248000 0.944000 -0.200000
+0.300000 0.451900 -0.131100 0.200000 0.712000 -0.664000
+0.300000 0.451900 -0.131100 0.200000 0.712000 -0.664000
+0.366500 0.200800 -0.121900 -0.760000 -0.624000 0.168000
+0.366500 0.200800 -0.121900 -0.760000 -0.624000 0.168000
+0.400000 0.200800 -0.077800 -0.600000 -0.432000 0.664000
+0.400000 0.152400 -0.121900 -0.688000 -0.712000 -0.048000
+0.400000 0.152400 -0.121900 -0.688000 -0.712000 -0.048000
+0.400000 0.072600 -0.121900 -0.632000 0.256000 0.720000
+0.400000 0.072600 -0.121900 -0.632000 0.256000 0.720000
+0.400000 0.050200 -0.114800 -0.552000 0.256000 0.784000
+0.393200 0.050200 -0.121900 -0.648000 0.352000 0.664000
+0.393200 0.050200 -0.121900 -0.648000 0.352000 0.664000
+0.450000 -0.100400 -0.078400 -0.088000 0.200000 0.968000
+0.450000 -0.100400 -0.078400 -0.088000 0.200000 0.968000
+0.400000 -0.100400 -0.080400 -0.024000 0.176000 0.976000
+0.450000 -0.150600 -0.064700 -0.192000 0.128000 0.968000
+0.400000 -0.150600 -0.068400 -0.344000 -0.312000 0.880000
+0.450000 -0.200800 -0.072200 -0.256000 -0.536000 0.800000
+0.400000 -0.200800 -0.119100 -0.200000 -0.688000 0.688000
+0.450000 -0.227100 -0.121900 -0.296000 -0.712000 0.624000
+0.400000 -0.203000 -0.121900 -0.184000 -0.672000 0.712000
+0.450000 -0.251000 -0.179900 -0.288000 -0.680000 0.664000
+0.400000 -0.249800 -0.182900 0.472000 -0.752000 0.448000
+0.415700 -0.251000 -0.182900 -0.088000 -0.872000 0.480000
+0.400000 -0.249400 -0.243900 0.760000 -0.472000 -0.424000
+0.450000 -0.251000 -0.203800 -0.216000 -0.960000 -0.144000
+0.450000 -0.248400 -0.243900 -0.224000 -0.888000 -0.384000
+0.459300 -0.251000 -0.243900 -0.280000 -0.864000 -0.400000
+0.459300 -0.251000 -0.243900 -0.280000 -0.864000 -0.400000
+0.450000 0.163500 -0.060900 -0.600000 -0.504000 0.608000
+0.450000 0.163500 -0.060900 -0.600000 -0.504000 0.608000
+0.460500 0.150600 -0.060900 -0.624000 -0.512000 0.584000
+0.450000 0.150600 -0.075000 -0.616000 -0.488000 0.608000
+0.450000 0.150600 -0.075000 -0.616000 -0.488000 0.608000
+0.504600 0.100400 -0.060900 -0.704000 -0.248000 0.656000
+0.504600 0.100400 -0.060900 -0.704000 -0.248000 0.656000
+0.500000 0.067400 -0.060900 -0.592000 0.120000 0.792000
+0.500000 0.100400 -0.067100 -0.632000 -0.296000 0.704000
+0.500000 0.100400 -0.067100 -0.632000 -0.296000 0.704000
+0.550000 -0.159500 -0.060900 0.248000 0.472000 0.840000
+0.550000 -0.159500 -0.060900 0.248000 0.472000 0.840000
+0.530700 -0.150600 -0.060900 0.208000 0.504000 0.832000
+0.550000 -0.150600 -0.067100 0.240000 0.480000 0.840000
+0.550000 -0.150600 -0.067100 0.240000 0.480000 0.840000
+0.546800 -0.351500 -0.121900 -0.560000 -0.304000 0.760000
+0.546800 -0.351500 -0.121900 -0.560000 -0.304000 0.760000
+0.550000 -0.317100 -0.121900 -0.368000 0.064000 0.920000
+0.550000 -0.351500 -0.118900 -0.368000 0.056000 0.920000
+0.558500 -0.351500 -0.121900 0.208000 -0.648000 0.728000
+0.550000 -0.353000 -0.121900 -0.032000 -0.832000 0.536000
+0.550000 -0.351500 -0.118900 -0.368000 0.056000 0.920000
+0.546800 -0.351500 -0.121900 -0.560000 -0.304000 0.760000
+0.550000 -0.353000 -0.121900 -0.032000 -0.832000 0.536000
+0.500000 -0.351500 -0.156800 -0.392000 -0.248000 0.880000
+0.550000 -0.389500 -0.182900 -0.304000 -0.784000 0.528000
+0.500000 -0.372900 -0.182900 -0.184000 -0.776000 0.592000
+0.550000 -0.401700 -0.218900 -0.128000 -0.904000 0.392000
+0.500000 -0.400600 -0.243900 0.024000 -0.920000 0.384000
+0.503900 -0.401700 -0.243900 -0.232000 -0.936000 0.256000
+0.500000 -0.400200 -0.304800 -0.176000 -0.672000 -0.712000
+0.502600 -0.401700 -0.304800 -0.320000 -0.840000 -0.416000
+0.500000 -0.351500 -0.354900 -0.384000 -0.472000 -0.784000
+0.550000 -0.401700 -0.333700 -0.144000 -0.688000 -0.704000
+0.550000 -0.351500 -0.364500 0.120000 -0.104000 -0.984000
+0.500000 -0.351500 -0.354900 -0.384000 -0.472000 -0.784000
+0.550000 -0.316300 -0.304800 -0.472000 0.688000 -0.536000
+0.500000 -0.333600 -0.304800 -0.408000 0.824000 -0.376000
+0.550000 -0.301200 -0.279200 -0.712000 0.120000 -0.680000
+0.500000 -0.310500 -0.243900 -0.600000 0.776000 -0.152000
+0.513800 -0.301200 -0.243900 -0.728000 0.592000 -0.328000
+0.500000 -0.316400 -0.182900 -0.704000 0.472000 0.520000
+0.511800 -0.301200 -0.182900 -0.912000 0.352000 0.176000
+0.500000 -0.351500 -0.156800 -0.392000 -0.248000 0.880000
+0.550000 -0.301200 -0.123600 -0.624000 -0.440000 0.632000
+0.546800 -0.351500 -0.121900 -0.560000 -0.304000 0.760000
+0.550000 -0.317100 -0.121900 -0.368000 0.064000 0.920000
+0.550000 -0.317100 -0.121900 -0.368000 0.064000 0.920000
+0.550000 -0.242100 -0.060900 -0.400000 -0.536000 0.736000
+0.550000 -0.242100 -0.060900 -0.400000 -0.536000 0.736000
+0.562800 -0.251000 -0.060900 -0.368000 -0.568000 0.720000
+0.550000 -0.251000 -0.069700 -0.416000 -0.584000 0.688000
+0.550000 -0.251000 -0.069700 -0.416000 -0.584000 0.688000
+0.552600 -0.301200 -0.121900 -0.368000 -0.384000 0.840000
+0.552600 -0.301200 -0.121900 -0.368000 -0.384000 0.840000
+0.600000 -0.301200 -0.098800 -0.176000 -0.576000 0.792000
+0.600000 -0.333000 -0.121900 0.024000 -0.312000 0.944000
+0.650000 -0.301200 -0.100200 0.264000 -0.568000 0.768000
+0.650000 -0.327200 -0.121900 -0.280000 -0.536000 0.792000
+0.700000 -0.301200 -0.068800 0.336000 0.392000 0.848000
+0.679500 -0.351500 -0.121900 -0.424000 -0.464000 0.768000
+0.700000 -0.351500 -0.108700 -0.352000 -0.464000 0.808000
+0.700000 -0.372000 -0.121900 -0.360000 -0.440000 0.816000
+0.750000 -0.351500 -0.097900 0.640000 0.048000 0.760000
+0.737900 -0.401700 -0.121900 -0.352000 -0.448000 0.816000
+0.750000 -0.401700 -0.115900 -0.264000 -0.344000 0.896000
+0.750000 -0.411100 -0.121900 -0.304000 -0.456000 0.824000
+0.800000 -0.401700 -0.115500 0.392000 0.184000 0.896000
+0.800000 -0.418600 -0.121900 0.304000 -0.320000 0.888000
+0.750000 -0.411100 -0.121900 -0.304000 -0.456000 0.824000
+0.800000 -0.451900 -0.135400 0.168000 -0.384000 0.904000
+0.750000 -0.451900 -0.153800 -0.384000 -0.528000 0.752000
+0.800000 -0.502100 -0.171200 -0.360000 -0.648000 0.664000
+0.750000 -0.479900 -0.182900 -0.456000 -0.632000 0.616000
+0.783200 -0.502100 -0.182900 -0.448000 -0.720000 0.512000
+0.750000 -0.502100 -0.236900 -0.448000 -0.776000 0.432000
+0.800000 -0.511100 -0.182900 -0.376000 -0.744000 0.544000
+0.750000 -0.505200 -0.243900 -0.480000 -0.856000 0.152000
+0.800000 -0.519900 -0.243900 -0.400000 -0.904000 -0.112000
+0.750000 -0.502100 -0.254300 -0.448000 -0.832000 -0.312000
+0.800000 -0.502100 -0.293400 -0.120000 -0.840000 -0.520000
+0.750000 -0.487000 -0.304800 -0.104000 -0.744000 -0.656000
+0.800000 -0.493800 -0.304800 0.032000 -0.688000 -0.720000
+0.750000 -0.451900 -0.330900 0.152000 -0.080000 -0.984000
+0.800000 -0.451900 -0.330300 0.328000 0.200000 -0.920000
+0.750000 -0.401700 -0.321600 0.336000 0.000000 -0.936000
+0.800000 -0.418300 -0.304800 0.408000 0.496000 -0.760000
+0.779200 -0.401700 -0.304800 0.400000 0.336000 -0.848000
+0.800000 -0.401700 -0.291400 0.440000 0.456000 -0.760000
+0.754800 -0.351500 -0.304800 0.424000 0.136000 -0.888000
+0.800000 -0.351500 -0.277300 0.568000 0.408000 -0.704000
+0.750000 -0.334300 -0.304800 0.512000 0.112000 -0.840000
+0.800000 -0.328800 -0.243900 0.640000 0.656000 -0.384000
+0.750000 -0.301200 -0.299800 0.512000 0.144000 -0.840000
+0.780500 -0.301200 -0.243900 0.848000 0.504000 -0.128000
+0.750000 -0.251000 -0.256700 0.824000 0.520000 -0.208000
+0.752500 -0.251000 -0.243900 0.840000 0.528000 -0.096000
+0.750000 -0.247000 -0.243900 0.832000 0.536000 -0.096000
+0.750000 -0.251000 -0.218200 0.840000 0.520000 0.096000
+0.717800 -0.200800 -0.243900 0.824000 0.560000 -0.064000
+0.746300 -0.251000 -0.182900 0.848000 0.496000 0.152000
+0.713600 -0.200800 -0.182900 0.824000 0.512000 0.224000
+0.719200 -0.251000 -0.121900 0.760000 0.456000 0.440000
+0.700000 -0.200800 -0.144600 0.696000 0.528000 0.480000
+0.700000 -0.217500 -0.121900 0.616000 0.552000 0.544000
+0.677400 -0.200800 -0.121900 0.528000 0.512000 0.672000
+0.700000 -0.200800 -0.144600 0.696000 0.528000 0.480000
+0.652900 -0.150600 -0.121900 0.752000 0.456000 0.464000
+0.700000 -0.178500 -0.182900 0.792000 0.568000 0.200000
+0.675300 -0.150600 -0.182900 0.768000 0.552000 0.296000
+0.700000 -0.175300 -0.243900 0.752000 0.600000 -0.240000
+0.674200 -0.150600 -0.243900 0.696000 0.600000 -0.384000
+0.674200 -0.150600 -0.243900 0.696000 0.600000 -0.384000
+0.600000 -0.272000 -0.060900 -0.264000 -0.632000 0.720000
+0.600000 -0.272000 -0.060900 -0.264000 -0.632000 0.720000
+0.600000 -0.301200 -0.098800 -0.176000 -0.576000 0.792000
+0.650000 -0.258100 -0.060900 0.392000 -0.456000 0.792000
+0.650000 -0.301200 -0.100200 0.264000 -0.568000 0.768000
+0.657600 -0.251000 -0.060900 0.456000 -0.072000 0.880000
+0.700000 -0.301200 -0.068800 0.336000 0.392000 0.848000
+0.700000 -0.251000 -0.086700 0.608000 0.464000 0.632000
+0.700000 -0.251000 -0.086700 0.608000 0.464000 0.632000
+0.650000 0.350500 -0.060900 0.712000 0.536000 -0.440000
+0.650000 0.350500 -0.060900 0.712000 0.536000 -0.440000
+0.650000 0.301200 -0.100800 0.528000 0.504000 -0.672000
+0.680100 0.301200 -0.060900 0.752000 0.544000 -0.368000
+0.680100 0.301200 -0.060900 0.752000 0.544000 -0.368000
+0.700000 0.251000 -0.093200 0.552000 0.600000 -0.568000
+0.700000 0.251000 -0.093200 0.552000 0.600000 -0.568000
+0.673000 0.251000 -0.121900 0.568000 0.576000 -0.584000
+0.700000 0.229200 -0.121900 0.528000 0.656000 -0.528000
+0.650000 0.251000 -0.154700 0.488000 0.640000 -0.584000
+0.700000 0.200800 -0.171600 0.480000 0.608000 -0.616000
+0.650000 0.227800 -0.182900 0.368000 0.576000 -0.720000
+0.687200 0.200800 -0.182900 0.432000 0.544000 -0.712000
+0.700000 0.200800 -0.171600 0.480000 0.608000 -0.616000
+0.700000 0.190400 -0.182900 0.432000 0.560000 -0.696000
+0.700000 0.190400 -0.182900 0.432000 0.560000 -0.696000
+0.650000 -0.200800 -0.092600 0.656000 0.384000 0.640000
+0.650000 -0.200800 -0.092600 0.656000 0.384000 0.640000
+0.650000 -0.150600 -0.116200 0.720000 0.480000 0.488000
+0.677400 -0.200800 -0.121900 0.528000 0.512000 0.672000
+0.652900 -0.150600 -0.121900 0.752000 0.456000 0.464000
+0.652900 -0.150600 -0.121900 0.752000 0.456000 0.464000
+0.734900 0.200800 -0.121900 0.552000 0.608000 -0.552000
+0.734900 0.200800 -0.121900 0.552000 0.608000 -0.552000
+0.750000 0.186400 -0.121900 0.504000 0.648000 -0.560000
+0.750000 0.200800 -0.104400 0.480000 0.680000 -0.544000
+0.750000 0.200800 -0.104400 0.480000 0.680000 -0.544000
+0.750000 -0.351500 -0.097900 0.640000 0.048000 0.760000
+0.750000 -0.351500 -0.097900 0.640000 0.048000 0.760000
+0.700000 -0.351500 -0.108700 -0.352000 -0.464000 0.808000
+0.750000 -0.301200 -0.116500 0.704000 0.400000 0.568000
+0.700000 -0.301200 -0.068800 0.336000 0.392000 0.848000
+0.700000 -0.301200 -0.068800 0.336000 0.392000 0.848000
+-0.950000 -0.150600 -0.169000 -0.584000 -0.792000 0.136000
+-0.950000 -0.150600 -0.169000 -0.584000 -0.792000 0.136000
+-0.950000 -0.152700 -0.182900 -0.600000 -0.784000 0.144000
+-0.952800 -0.150600 -0.182900 -0.568000 -0.808000 0.136000
+-0.950000 -0.161800 -0.243900 -0.584000 -0.784000 0.176000
+-0.966700 -0.150600 -0.243900 -0.472000 -0.864000 0.152000
+-0.950000 -0.180000 -0.304800 -0.552000 -0.600000 -0.568000
+-0.989000 -0.150600 -0.304800 -0.440000 -0.624000 -0.640000
+-0.950000 -0.150600 -0.330800 -0.416000 -0.432000 -0.792000
+-0.950000 -0.150600 -0.330800 -0.416000 -0.432000 -0.792000
+-0.900000 -0.492700 -0.121900 -0.520000 0.712000 0.448000
+-0.900000 -0.492700 -0.121900 -0.520000 0.712000 0.448000
+-0.900000 -0.462200 -0.182900 0.320000 0.888000 0.304000
+-0.878700 -0.502100 -0.121900 0.408000 0.368000 0.832000
+-0.850000 -0.490700 -0.182900 0.328000 0.896000 0.288000
+-0.850000 -0.502100 -0.144600 0.400000 0.776000 0.480000
+-0.820300 -0.502100 -0.182900 0.496000 0.792000 0.344000
+-0.850000 -0.519700 -0.121900 0.200000 0.624000 0.752000
+-0.800000 -0.513200 -0.182900 -0.080000 0.880000 0.456000
+-0.800000 -0.539500 -0.121900 0.176000 0.680000 0.704000
+-0.750000 -0.503000 -0.182900 -0.200000 0.848000 0.472000
+-0.750000 -0.549900 -0.121900 0.080000 0.648000 0.752000
+-0.749300 -0.502100 -0.182900 -0.920000 -0.232000 0.288000
+-0.723300 -0.502100 -0.121900 -0.896000 -0.224000 0.368000
+-0.723300 -0.502100 -0.121900 -0.896000 -0.224000 0.368000
+-0.900000 -0.511500 -0.121900 -0.520000 -0.664000 0.528000
+-0.900000 -0.511500 -0.121900 -0.520000 -0.664000 0.528000
+-0.900000 -0.542100 -0.182900 -0.808000 -0.560000 0.136000
+-0.868200 -0.552300 -0.121900 -0.520000 -0.224000 0.816000
+-0.892400 -0.552300 -0.182900 -0.760000 -0.624000 0.176000
+-0.850000 -0.569100 -0.121900 -0.488000 -0.776000 0.384000
+-0.850000 -0.592600 -0.182900 -0.520000 -0.800000 0.264000
+-0.800000 -0.584500 -0.121900 -0.288000 -0.544000 0.776000
+-0.832500 -0.602500 -0.182900 -0.576000 -0.768000 0.272000
+-0.800000 -0.602500 -0.136500 -0.416000 -0.648000 0.632000
+-0.800000 -0.620600 -0.182900 -0.312000 -0.880000 0.336000
+-0.764000 -0.602500 -0.121900 -0.176000 -0.816000 0.544000
+-0.750000 -0.630100 -0.182900 -0.144000 -0.912000 0.360000
+-0.750000 -0.605000 -0.121900 -0.152000 -0.872000 0.456000
+-0.750000 -0.605000 -0.121900 -0.152000 -0.872000 0.456000
+-0.802000 -0.351500 -0.121900 -0.840000 -0.520000 0.096000
+-0.802000 -0.351500 -0.121900 -0.840000 -0.520000 0.096000
+-0.832400 -0.301200 -0.121900 -0.840000 -0.528000 0.048000
+-0.802200 -0.351500 -0.182900 -0.872000 -0.480000 0.016000
+-0.831100 -0.301200 -0.182900 -0.848000 -0.520000 0.016000
+-0.807300 -0.351500 -0.243900 -0.864000 -0.472000 0.152000
+-0.834700 -0.301200 -0.243900 -0.840000 -0.504000 0.184000
+-0.834700 -0.301200 -0.243900 -0.840000 -0.504000 0.184000
+-0.779100 0.150600 -0.182900 0.400000 0.664000 -0.616000
+-0.779100 0.150600 -0.182900 0.400000 0.664000 -0.616000
+-0.750000 0.132600 -0.182900 0.408000 0.656000 -0.624000
+-0.750000 0.150600 -0.159200 0.432000 0.664000 -0.600000
+-0.750000 0.150600 -0.159200 0.432000 0.664000 -0.600000
+-0.750000 -0.448400 -0.121900 -0.880000 -0.432000 0.160000
+-0.750000 -0.448400 -0.121900 -0.880000 -0.432000 0.160000
+-0.750000 -0.451900 -0.133400 -0.896000 -0.392000 0.184000
+-0.771000 -0.401700 -0.121900 -0.872000 -0.456000 0.128000
+-0.757600 -0.451900 -0.182900 -0.952000 -0.232000 0.184000
+-0.775200 -0.401700 -0.182900 -0.904000 -0.400000 0.120000
+-0.769800 -0.451900 -0.243900 -0.952000 -0.080000 0.272000
+-0.781800 -0.401700 -0.243900 -0.912000 -0.336000 0.208000
+-0.787800 -0.451900 -0.304800 -0.984000 0.136000 -0.040000
+-0.797400 -0.401700 -0.304800 -0.928000 -0.344000 0.056000
+-0.797400 -0.401700 -0.304800 -0.928000 -0.344000 0.056000
+-0.800000 -0.584500 -0.121900 -0.288000 -0.544000 0.776000
+-0.800000 -0.584500 -0.121900 -0.288000 -0.544000 0.776000
+-0.764000 -0.602500 -0.121900 -0.176000 -0.816000 0.544000
+-0.800000 -0.602500 -0.136500 -0.416000 -0.648000 0.632000
+-0.800000 -0.602500 -0.136500 -0.416000 -0.648000 0.632000
+-0.750000 0.174400 -0.121900 0.448000 0.824000 -0.336000
+-0.750000 0.174400 -0.121900 0.448000 0.824000 -0.336000
+-0.750000 0.150600 -0.159200 0.432000 0.664000 -0.600000
+-0.715000 0.150600 -0.121900 0.512000 0.744000 -0.408000
+-0.715000 0.150600 -0.121900 0.512000 0.744000 -0.408000
+-0.700900 0.100400 -0.182900 0.440000 0.608000 -0.648000
+-0.700900 0.100400 -0.182900 0.440000 0.608000 -0.648000
+-0.700000 0.099700 -0.182900 0.504000 0.560000 -0.640000
+-0.700000 0.100400 -0.182100 0.536000 0.592000 -0.592000
+-0.700000 0.100400 -0.182100 0.536000 0.592000 -0.592000
+-0.750000 -0.448400 -0.121900 -0.880000 -0.432000 0.160000
+-0.750000 -0.448400 -0.121900 -0.880000 -0.432000 0.160000
+-0.748200 -0.451900 -0.121900 -0.880000 -0.440000 0.160000
+-0.750000 -0.451900 -0.133400 -0.896000 -0.392000 0.184000
+-0.750000 -0.451900 -0.133400 -0.896000 -0.392000 0.184000
+-0.700000 0.140000 -0.121900 0.536000 0.728000 -0.408000
+-0.700000 0.140000 -0.121900 0.536000 0.728000 -0.408000
+-0.700000 0.100400 -0.182100 0.536000 0.592000 -0.592000
+-0.657700 0.100400 -0.121900 0.728000 0.576000 -0.360000
+-0.657700 0.100400 -0.121900 0.728000 0.576000 -0.360000
+-0.652800 0.050200 -0.182900 0.592000 0.536000 -0.592000
+-0.652800 0.050200 -0.182900 0.592000 0.536000 -0.592000
+-0.650000 0.045800 -0.182900 0.672000 0.432000 -0.592000
+-0.650000 0.050200 -0.178200 0.664000 0.544000 -0.504000
+-0.621400 0.000000 -0.182900 0.848000 0.280000 -0.440000
+-0.614300 0.050200 -0.121900 0.720000 0.480000 -0.480000
+-0.601900 0.000000 -0.121900 0.848000 0.208000 -0.472000
+-0.601900 0.000000 -0.121900 0.848000 0.208000 -0.472000
+-0.650000 0.089500 -0.121900 0.728000 0.552000 -0.384000
+-0.650000 0.089500 -0.121900 0.728000 0.552000 -0.384000
+-0.650000 0.050200 -0.178200 0.664000 0.544000 -0.504000
+-0.614300 0.050200 -0.121900 0.720000 0.480000 -0.480000
+-0.614300 0.050200 -0.121900 0.720000 0.480000 -0.480000
+-0.491700 -0.150600 -0.182900 -0.448000 0.848000 -0.264000
+-0.491700 -0.150600 -0.182900 -0.448000 0.848000 -0.264000
+-0.500000 -0.150600 -0.154000 -0.424000 0.880000 -0.160000
+-0.500000 -0.154300 -0.182900 -0.320000 0.920000 -0.176000
+-0.500000 -0.154300 -0.182900 -0.320000 0.920000 -0.176000
+-0.372200 0.000000 -0.121900 -0.848000 0.480000 -0.200000
+-0.372200 0.000000 -0.121900 -0.848000 0.480000 -0.200000
+-0.350000 0.000000 -0.171400 -0.688000 0.416000 -0.584000
+-0.350000 0.031200 -0.121900 -0.744000 0.552000 -0.352000
+-0.350000 0.031200 -0.121900 -0.744000 0.552000 -0.352000
+-0.350000 -0.652700 -0.168800 -0.864000 0.056000 0.488000
+-0.350000 -0.652700 -0.168800 -0.864000 0.056000 0.488000
+-0.300000 -0.652700 -0.176500 0.496000 0.568000 0.648000
+-0.350000 -0.647900 -0.182900 0.008000 0.768000 0.624000
+-0.300000 -0.647500 -0.182900 0.464000 0.632000 0.616000
+-0.350000 -0.630200 -0.243900 -0.144000 0.776000 0.600000
+-0.300000 -0.607200 -0.243900 -0.248000 0.672000 0.688000
+-0.300000 -0.647500 -0.182900 0.464000 0.632000 0.616000
+-0.286800 -0.602500 -0.243900 -0.320000 0.232000 0.912000
+-0.293900 -0.652700 -0.182900 0.576000 0.496000 0.640000
+-0.250000 -0.602500 -0.226600 0.288000 -0.512000 0.800000
+-0.250000 -0.652700 -0.232900 0.624000 0.072000 0.768000
+-0.233200 -0.602500 -0.243900 0.608000 -0.320000 0.720000
+-0.241600 -0.652700 -0.243900 0.680000 -0.216000 0.688000
+-0.250000 -0.652700 -0.232900 0.624000 0.072000 0.768000
+-0.250000 -0.679700 -0.243900 0.728000 -0.208000 0.640000
+-0.293900 -0.652700 -0.182900 0.576000 0.496000 0.640000
+-0.256000 -0.703000 -0.243900 0.696000 -0.392000 0.584000
+-0.293800 -0.703000 -0.182900 0.608000 -0.624000 0.488000
+-0.293900 -0.652700 -0.182900 0.576000 0.496000 0.640000
+-0.300000 -0.703000 -0.173800 0.616000 -0.544000 0.552000
+-0.300000 -0.652700 -0.176500 0.496000 0.568000 0.648000
+-0.350000 -0.703000 -0.180700 -0.616000 -0.504000 0.592000
+-0.350000 -0.652700 -0.168800 -0.864000 0.056000 0.488000
+-0.350000 -0.652700 -0.168800 -0.864000 0.056000 0.488000
+-0.260200 -0.552300 -0.121900 -0.560000 -0.752000 0.336000
+-0.260200 -0.552300 -0.121900 -0.560000 -0.752000 0.336000
+-0.300000 -0.516400 -0.121900 -0.256000 -0.872000 0.400000
+-0.285200 -0.552300 -0.182900 -0.616000 -0.680000 0.384000
+-0.300000 -0.538300 -0.182900 -0.584000 -0.696000 0.408000
+-0.300000 -0.552300 -0.209900 -0.624000 -0.616000 0.456000
+-0.300000 -0.552300 -0.209900 -0.624000 -0.616000 0.456000
+-0.300000 -0.647500 -0.182900 0.464000 0.632000 0.616000
+-0.300000 -0.647500 -0.182900 0.464000 0.632000 0.616000
+-0.293900 -0.652700 -0.182900 0.576000 0.496000 0.640000
+-0.300000 -0.652700 -0.176500 0.496000 0.568000 0.648000
+-0.300000 -0.652700 -0.176500 0.496000 0.568000 0.648000
+-0.200000 0.251000 -0.156200 -0.432000 0.168000 -0.880000
+-0.200000 0.251000 -0.156200 -0.432000 0.168000 -0.880000
+-0.250000 0.251000 -0.124000 -0.376000 0.088000 -0.920000
+-0.200000 0.200800 -0.161600 -0.480000 0.384000 -0.776000
+-0.250000 0.200800 -0.129700 -0.392000 0.152000 -0.904000
+-0.250000 0.200800 -0.129700 -0.392000 0.152000 -0.904000
+-0.200000 -0.534300 -0.121900 0.456000 -0.832000 0.296000
+-0.200000 -0.534300 -0.121900 0.456000 -0.832000 0.296000
+-0.235800 -0.552300 -0.121900 0.448000 -0.816000 0.336000
+-0.200000 -0.549300 -0.182900 0.504000 -0.784000 0.344000
+-0.204600 -0.552300 -0.182900 0.504000 -0.776000 0.360000
+-0.200000 -0.552300 -0.190900 0.520000 -0.768000 0.360000
+-0.200000 -0.552300 -0.190900 0.520000 -0.768000 0.360000
+-0.200000 0.401700 -0.127400 -0.400000 0.440000 -0.800000
+-0.200000 0.401700 -0.127400 -0.400000 0.440000 -0.800000
+-0.150000 0.401700 -0.148200 -0.240000 0.400000 -0.872000
+-0.200000 0.351500 -0.146000 -0.416000 0.224000 -0.872000
+-0.150000 0.351500 -0.156300 -0.024000 0.152000 -0.984000
+-0.200000 0.301200 -0.154100 -0.392000 0.112000 -0.904000
+-0.150000 0.301200 -0.169700 -0.080000 0.248000 -0.960000
+-0.150000 0.351500 -0.156300 -0.024000 0.152000 -0.984000
+-0.100000 0.301200 -0.172200 -0.168000 0.416000 -0.888000
+-0.100000 0.351500 -0.158200 0.008000 0.264000 -0.960000
+-0.150000 0.351500 -0.156300 -0.024000 0.152000 -0.984000
+-0.100000 0.401700 -0.143600 0.056000 0.120000 -0.984000
+-0.150000 0.401700 -0.148200 -0.240000 0.400000 -0.872000
+-0.100000 0.451900 -0.142300 -0.128000 0.312000 -0.936000
+-0.150000 0.451900 -0.123200 -0.344000 0.512000 -0.784000
+-0.150000 0.451900 -0.123200 -0.344000 0.512000 -0.784000
+-0.100000 0.044900 -0.121900 0.816000 0.112000 0.552000
+-0.100000 0.044900 -0.121900 0.816000 0.112000 0.552000
+-0.100700 0.050200 -0.121900 0.856000 0.048000 0.504000
+-0.100000 0.050200 -0.123300 0.696000 -0.176000 0.688000
+-0.100000 0.050200 -0.123300 0.696000 -0.176000 0.688000
+-0.100000 0.451900 -0.142300 -0.128000 0.312000 -0.936000
+-0.100000 0.451900 -0.142300 -0.128000 0.312000 -0.936000
+-0.050000 0.451900 -0.137500 0.040000 0.112000 -0.992000
+-0.100000 0.401700 -0.143600 0.056000 0.120000 -0.984000
+-0.050000 0.401700 -0.142300 0.000000 0.168000 -0.984000
+-0.100000 0.351500 -0.158200 0.008000 0.264000 -0.960000
+-0.050000 0.351500 -0.155800 -0.048000 0.328000 -0.936000
+-0.050000 0.401700 -0.142300 0.000000 0.168000 -0.984000
+0.000000 0.351500 -0.164900 -0.080000 0.368000 -0.920000
+0.000000 0.401700 -0.144600 -0.056000 0.192000 -0.976000
+0.050000 0.351500 -0.166400 0.000000 0.392000 -0.912000
+0.050000 0.401700 -0.150400 -0.088000 0.216000 -0.968000
+0.100000 0.351500 -0.169000 0.056000 0.272000 -0.952000
+0.100000 0.401700 -0.152800 -0.048000 0.168000 -0.984000
+0.150000 0.351500 -0.160600 0.144000 0.128000 -0.976000
+0.150000 0.401700 -0.154900 -0.096000 0.088000 -0.984000
+0.200000 0.351500 -0.169700 -0.320000 0.304000 -0.888000
+0.200000 0.401700 -0.169400 -0.056000 0.168000 -0.976000
+0.150000 0.401700 -0.154900 -0.096000 0.088000 -0.984000
+0.200000 0.451900 -0.151000 0.136000 0.400000 -0.896000
+0.150000 0.451900 -0.151900 0.184000 0.376000 -0.904000
+0.200000 0.484800 -0.121900 0.312000 0.872000 0.360000
+0.150000 0.502100 -0.123200 0.032000 0.424000 -0.896000
+0.153400 0.502100 -0.121900 0.448000 0.824000 -0.336000
+0.153400 0.502100 -0.121900 0.448000 0.824000 -0.336000
+-0.089600 0.000000 -0.121900 0.568000 0.512000 0.632000
+-0.089600 0.000000 -0.121900 0.568000 0.512000 0.632000
+-0.050000 0.000000 -0.158900 0.584000 0.336000 0.728000
+-0.050000 -0.024600 -0.121900 0.296000 0.656000 0.688000
+0.000000 0.000000 -0.165000 0.096000 0.640000 0.752000
+0.000000 -0.035500 -0.121900 0.072000 0.496000 0.856000
+0.050000 0.000000 -0.179700 0.216000 0.504000 0.832000
+0.050000 -0.038600 -0.121900 0.000000 0.528000 0.840000
+0.100000 0.000000 -0.179900 0.000000 0.528000 0.840000
+0.100000 -0.037100 -0.121900 -0.016000 0.544000 0.832000
+0.100000 -0.037100 -0.121900 -0.016000 0.544000 0.832000
+-0.054100 -0.401700 -0.121900 0.656000 -0.688000 0.280000
+-0.054100 -0.401700 -0.121900 0.656000 -0.688000 0.280000
+-0.098000 -0.451900 -0.121900 0.712000 -0.680000 0.120000
+-0.061900 -0.401700 -0.182900 0.744000 -0.648000 -0.120000
+-0.098100 -0.451900 -0.182900 0.736000 -0.672000 0.032000
+-0.071000 -0.401700 -0.243900 0.856000 -0.496000 -0.072000
+-0.094700 -0.451900 -0.243900 0.784000 -0.568000 0.216000
+-0.073900 -0.401700 -0.304800 0.784000 -0.304000 -0.528000
+-0.061500 -0.451900 -0.304800 0.928000 -0.352000 0.088000
+-0.100000 -0.401700 -0.330800 0.576000 -0.152000 -0.792000
+-0.100000 -0.451900 -0.336100 0.496000 -0.048000 -0.856000
+-0.150000 -0.401700 -0.364300 0.552000 0.080000 -0.824000
+-0.145700 -0.451900 -0.365800 0.464000 0.040000 -0.880000
+-0.150000 -0.417500 -0.365800 0.544000 0.056000 -0.832000
+-0.150000 -0.451900 -0.368100 0.456000 -0.056000 -0.880000
+-0.145700 -0.451900 -0.365800 0.464000 0.040000 -0.880000
+-0.150000 -0.502100 -0.367300 0.088000 -0.320000 -0.936000
+-0.147100 -0.502100 -0.365800 0.472000 -0.192000 -0.848000
+-0.150000 -0.505900 -0.365800 0.272000 -0.320000 -0.904000
+-0.150000 -0.505900 -0.365800 0.272000 -0.320000 -0.904000
+-0.050000 0.401700 -0.142300 0.000000 0.168000 -0.984000
+-0.050000 0.401700 -0.142300 0.000000 0.168000 -0.984000
+-0.050000 0.451900 -0.137500 0.040000 0.112000 -0.992000
+0.000000 0.401700 -0.144600 -0.056000 0.192000 -0.976000
+0.000000 0.451900 -0.135500 0.000000 0.160000 -0.984000
+0.050000 0.401700 -0.150400 -0.088000 0.216000 -0.968000
+0.050000 0.451900 -0.139600 -0.080000 0.232000 -0.960000
+0.100000 0.401700 -0.152800 -0.048000 0.168000 -0.984000
+0.100000 0.451900 -0.146900 -0.088000 0.224000 -0.968000
+0.150000 0.401700 -0.154900 -0.096000 0.088000 -0.984000
+0.150000 0.451900 -0.151900 0.184000 0.376000 -0.904000
+0.150000 0.451900 -0.151900 0.184000 0.376000 -0.904000
+-0.012800 0.200800 -0.121900 0.688000 -0.616000 0.376000
+-0.012800 0.200800 -0.121900 0.688000 -0.616000 0.376000
+0.000000 0.211400 -0.121900 0.496000 -0.712000 0.480000
+0.000000 0.200800 -0.169000 0.576000 -0.744000 0.320000
+0.000000 0.200800 -0.169000 0.576000 -0.744000 0.320000
+-0.050000 0.150600 -0.159500 0.712000 -0.480000 0.504000
+-0.050000 0.150600 -0.159500 0.712000 -0.480000 0.504000
+-0.033200 0.150600 -0.182900 0.832000 -0.552000 -0.016000
+-0.050000 0.116900 -0.182900 0.944000 -0.304000 0.048000
+-0.050000 0.150600 -0.210200 0.840000 -0.208000 -0.496000
+-0.050000 0.150600 -0.210200 0.840000 -0.208000 -0.496000
+-0.050000 0.047900 -0.182900 0.488000 0.480000 0.720000
+-0.050000 0.047900 -0.182900 0.488000 0.480000 0.720000
+-0.050000 0.000000 -0.158900 0.584000 0.336000 0.728000
+0.000000 0.039200 -0.182900 0.256000 0.544000 0.792000
+0.000000 0.000000 -0.165000 0.096000 0.640000 0.752000
+0.050000 0.005700 -0.182900 0.312000 0.584000 0.744000
+0.050000 0.000000 -0.179700 0.216000 0.504000 0.832000
+0.100000 0.004900 -0.182900 -0.288000 0.864000 0.400000
+0.100000 0.000000 -0.179900 0.000000 0.528000 0.840000
+0.100000 0.000000 -0.179900 0.000000 0.528000 0.840000
+0.000000 0.200800 -0.169000 0.576000 -0.744000 0.320000
+0.000000 0.200800 -0.169000 0.576000 -0.744000 0.320000
+0.008500 0.200800 -0.182900 0.416000 -0.688000 -0.584000
+0.000000 0.195100 -0.182900 0.504000 -0.656000 -0.544000
+0.000000 0.200800 -0.186400 0.272000 -0.456000 -0.840000
+0.000000 0.200800 -0.186400 0.272000 -0.456000 -0.840000
+0.050000 -0.327900 -0.182900 0.552000 -0.824000 0.048000
+0.050000 -0.327900 -0.182900 0.552000 -0.824000 0.048000
+0.003100 -0.351500 -0.182900 0.504000 -0.840000 -0.160000
+0.050000 -0.321600 -0.121900 0.584000 -0.712000 0.376000
+0.006400 -0.351500 -0.121900 0.552000 -0.776000 0.288000
+0.006400 -0.351500 -0.121900 0.552000 -0.776000 0.288000
+0.150000 0.251000 -0.128300 0.144000 -0.904000 0.392000
+0.150000 0.251000 -0.128300 0.144000 -0.904000 0.392000
+0.150000 0.284700 -0.182900 0.352000 0.368000 -0.856000
+0.194700 0.251000 -0.182900 0.496000 -0.104000 -0.856000
+0.150000 0.251000 -0.192500 0.112000 0.024000 -0.992000
+0.150000 0.224100 -0.182900 0.056000 -0.672000 -0.728000
+0.194700 0.251000 -0.182900 0.496000 -0.104000 -0.856000
+0.150000 0.251000 -0.128300 0.144000 -0.904000 0.392000
+0.150000 0.251000 -0.128300 0.144000 -0.904000 0.392000
+0.211500 -0.301200 -0.182900 -0.568000 -0.672000 0.464000
+0.211500 -0.301200 -0.182900 -0.568000 -0.672000 0.464000
+0.250000 -0.301200 -0.149400 -0.376000 -0.584000 0.712000
+0.250000 -0.319600 -0.182900 -0.280000 -0.832000 0.472000
+0.300000 -0.301200 -0.149800 -0.024000 -0.480000 0.872000
+0.300000 -0.330300 -0.182900 -0.312000 -0.696000 0.632000
+0.350000 -0.301200 -0.148100 0.392000 -0.048000 0.912000
+0.331500 -0.351500 -0.182900 -0.432000 -0.576000 0.688000
+0.350000 -0.351500 -0.171100 -0.312000 -0.512000 0.792000
+0.350000 -0.366900 -0.182900 -0.368000 -0.552000 0.736000
+0.400000 -0.351500 -0.165500 0.064000 -0.056000 0.992000
+0.400000 -0.370500 -0.182900 -0.008000 -0.616000 0.776000
+0.450000 -0.351500 -0.174300 0.040000 0.080000 0.992000
+0.450000 -0.370700 -0.182900 -0.080000 -0.520000 0.848000
+0.500000 -0.351500 -0.156800 -0.392000 -0.248000 0.880000
+0.500000 -0.372900 -0.182900 -0.184000 -0.776000 0.592000
+0.450000 -0.370700 -0.182900 -0.080000 -0.520000 0.848000
+0.500000 -0.400600 -0.243900 0.024000 -0.920000 0.384000
+0.450000 -0.401700 -0.212100 0.240000 -0.816000 0.520000
+0.496800 -0.401700 -0.243900 0.256000 -0.880000 0.376000
+0.450000 -0.418500 -0.243900 -0.152000 -0.896000 0.400000
+0.492100 -0.401700 -0.304800 0.152000 -0.576000 -0.792000
+0.450000 -0.411100 -0.304800 -0.144000 -0.808000 -0.560000
+0.450000 -0.401700 -0.316200 -0.184000 -0.360000 -0.904000
+0.428900 -0.401700 -0.304800 -0.392000 -0.464000 -0.784000
+0.450000 -0.380500 -0.304800 -0.144000 0.256000 -0.952000
+0.400000 -0.401700 -0.257800 0.112000 -0.952000 -0.280000
+0.450000 -0.351500 -0.290700 -0.176000 0.632000 -0.744000
+0.400000 -0.388800 -0.304800 0.392000 -0.800000 -0.448000
+0.437100 -0.351500 -0.304800 0.688000 0.472000 -0.536000
+0.400000 -0.351500 -0.338800 0.360000 -0.568000 -0.728000
+0.401200 -0.301200 -0.304800 0.744000 0.488000 -0.440000
+0.400000 -0.301200 -0.307300 0.704000 0.496000 -0.496000
+0.400000 -0.299100 -0.304800 0.736000 0.472000 -0.472000
+0.401200 -0.301200 -0.304800 0.744000 0.488000 -0.440000
+0.400000 -0.252300 -0.243900 0.744000 0.488000 -0.440000
+0.429200 -0.301200 -0.243900 0.816000 0.544000 -0.176000
+0.400000 -0.252800 -0.182900 0.760000 0.464000 0.440000
+0.427100 -0.301200 -0.182900 0.776000 0.464000 0.416000
+0.400000 -0.301200 -0.149800 0.528000 0.376000 0.752000
+0.450000 -0.338000 -0.182900 0.248000 0.592000 0.752000
+0.400000 -0.351500 -0.165500 0.064000 -0.056000 0.992000
+0.450000 -0.351500 -0.174300 0.040000 0.080000 0.992000
+0.450000 -0.338000 -0.182900 0.248000 0.592000 0.752000
+0.500000 -0.351500 -0.156800 -0.392000 -0.248000 0.880000
+0.500000 -0.316400 -0.182900 -0.704000 0.472000 0.520000
+0.450000 -0.338000 -0.182900 0.248000 0.592000 0.752000
+0.500000 -0.310500 -0.243900 -0.600000 0.776000 -0.152000
+0.450000 -0.327300 -0.243900 -0.064000 0.864000 -0.488000
+0.500000 -0.333600 -0.304800 -0.408000 0.824000 -0.376000
+0.450000 -0.351500 -0.290700 -0.176000 0.632000 -0.744000
+0.458900 -0.351500 -0.304800 -0.472000 0.360000 -0.792000
+0.450000 -0.380500 -0.304800 -0.144000 0.256000 -0.952000
+0.500000 -0.400200 -0.304800 -0.176000 -0.672000 -0.712000
+0.492100 -0.401700 -0.304800 0.152000 -0.576000 -0.792000
+0.500000 -0.400600 -0.243900 0.024000 -0.920000 0.384000
+0.496800 -0.401700 -0.243900 0.256000 -0.880000 0.376000
+0.496800 -0.401700 -0.243900 0.256000 -0.880000 0.376000
+0.265700 0.200800 -0.182900 -0.312000 -0.760000 -0.552000
+0.265700 0.200800 -0.182900 -0.312000 -0.760000 -0.552000
+0.300000 0.218000 -0.182900 0.768000 0.424000 -0.464000
+0.300000 0.200800 -0.174500 0.536000 -0.360000 0.752000
+0.306800 0.200800 -0.182900 0.752000 -0.400000 -0.512000
+0.300000 0.193900 -0.182900 0.520000 -0.696000 -0.480000
+0.300000 0.200800 -0.185900 0.256000 -0.192000 -0.944000
+0.265700 0.200800 -0.182900 -0.312000 -0.760000 -0.552000
+0.300000 0.218000 -0.182900 0.768000 0.424000 -0.464000
+0.300000 0.200800 -0.185900 0.256000 -0.192000 -0.944000
+0.306800 0.200800 -0.182900 0.752000 -0.400000 -0.512000
+0.306800 0.200800 -0.182900 0.752000 -0.400000 -0.512000
+0.265700 0.200800 -0.182900 -0.312000 -0.760000 -0.552000
+0.265700 0.200800 -0.182900 -0.312000 -0.760000 -0.552000
+0.300000 0.200800 -0.174500 0.536000 -0.360000 0.752000
+0.300000 0.193900 -0.182900 0.520000 -0.696000 -0.480000
+0.300000 0.193900 -0.182900 0.520000 -0.696000 -0.480000
+0.300000 0.284000 -0.182900 -0.168000 -0.184000 -0.960000
+0.300000 0.284000 -0.182900 -0.168000 -0.184000 -0.960000
+0.300000 0.251000 -0.156100 -0.368000 -0.808000 -0.448000
+0.321900 0.251000 -0.182900 -0.240000 -0.296000 -0.920000
+0.321900 0.251000 -0.182900 -0.240000 -0.296000 -0.920000
+0.307700 -0.050200 -0.121900 -0.592000 0.464000 0.648000
+0.307700 -0.050200 -0.121900 -0.592000 0.464000 0.648000
+0.300000 -0.060700 -0.121900 -0.512000 0.456000 0.720000
+0.300000 -0.050200 -0.130700 -0.504000 0.472000 0.720000
+0.300000 -0.050200 -0.130700 -0.504000 0.472000 0.720000
+0.329200 -0.200800 -0.121900 0.376000 -0.264000 0.880000
+0.329200 -0.200800 -0.121900 0.376000 -0.264000 0.880000
+0.350000 -0.182300 -0.121900 -0.032000 -0.520000 0.848000
+0.350000 -0.200800 -0.137500 0.248000 -0.232000 0.936000
+0.391400 -0.200800 -0.121900 -0.176000 -0.648000 0.736000
+0.391400 -0.200800 -0.121900 -0.176000 -0.648000 0.736000
+0.400000 0.100400 -0.150800 -0.768000 0.376000 0.512000
+0.400000 0.100400 -0.150800 -0.768000 0.376000 0.512000
+0.381500 0.100400 -0.182900 -0.896000 0.440000 -0.008000
+0.400000 0.146600 -0.182900 -0.440000 0.464000 -0.760000
+0.400000 0.100400 -0.207800 -0.424000 0.688000 -0.576000
+0.400000 0.100400 -0.207800 -0.424000 0.688000 -0.576000
+0.400000 -0.203000 -0.121900 -0.184000 -0.672000 0.712000
+0.400000 -0.203000 -0.121900 -0.184000 -0.672000 0.712000
+0.354900 -0.251000 -0.121900 0.704000 -0.304000 0.632000
+0.400000 -0.249800 -0.182900 0.472000 -0.752000 0.448000
+0.398900 -0.251000 -0.182900 0.896000 -0.160000 0.400000
+0.400000 -0.249400 -0.243900 0.760000 -0.472000 -0.424000
+0.399000 -0.251000 -0.243900 0.912000 -0.008000 -0.392000
+0.399000 -0.251000 -0.243900 0.912000 -0.008000 -0.392000
+0.400000 -0.351500 -0.165500 0.064000 -0.056000 0.992000
+0.400000 -0.351500 -0.165500 0.064000 -0.056000 0.992000
+0.350000 -0.351500 -0.171100 -0.312000 -0.512000 0.792000
+0.400000 -0.301200 -0.149800 0.528000 0.376000 0.752000
+0.350000 -0.301200 -0.148100 0.392000 -0.048000 0.912000
+0.350000 -0.301200 -0.148100 0.392000 -0.048000 0.912000
+0.450000 -0.251000 -0.179900 -0.288000 -0.680000 0.664000
+0.450000 -0.251000 -0.179900 -0.288000 -0.680000 0.664000
+0.450000 -0.255300 -0.182900 -0.208000 -0.656000 0.712000
+0.415700 -0.251000 -0.182900 -0.088000 -0.872000 0.480000
+0.450000 -0.251000 -0.203800 -0.216000 -0.960000 -0.144000
+0.450000 -0.251000 -0.203800 -0.216000 -0.960000 -0.144000
+0.500000 0.355500 -0.182900 0.400000 0.616000 -0.664000
+0.500000 0.355500 -0.182900 0.400000 0.616000 -0.664000
+0.506000 0.351500 -0.182900 0.424000 0.584000 -0.680000
+0.500000 0.393600 -0.121900 0.504000 0.744000 -0.432000
+0.550000 0.351500 -0.135900 0.456000 0.632000 -0.616000
+0.550000 0.362300 -0.121900 0.400000 0.656000 -0.632000
+0.566700 0.351500 -0.121900 0.448000 0.536000 -0.704000
+0.566700 0.351500 -0.121900 0.448000 0.536000 -0.704000
+0.550000 0.351500 -0.135900 0.456000 0.632000 -0.616000
+0.550000 0.351500 -0.135900 0.456000 0.632000 -0.616000
+0.550000 0.301200 -0.167400 0.408000 0.504000 -0.752000
+0.506000 0.351500 -0.182900 0.424000 0.584000 -0.680000
+0.526000 0.301200 -0.182900 0.408000 0.312000 -0.848000
+0.500000 0.351500 -0.187300 0.416000 0.568000 -0.696000
+0.500000 0.301200 -0.193500 0.168000 0.072000 -0.976000
+0.526000 0.301200 -0.182900 0.408000 0.312000 -0.848000
+0.500000 0.251000 -0.199400 0.072000 0.096000 -0.984000
+0.550000 0.283200 -0.182900 0.320000 0.472000 -0.816000
+0.550000 0.251000 -0.199600 0.176000 0.288000 -0.936000
+0.500000 0.251000 -0.199400 0.072000 0.096000 -0.984000
+0.550000 0.200800 -0.211100 0.016000 0.048000 -0.992000
+0.500000 0.200800 -0.200200 -0.104000 -0.048000 -0.992000
+0.550000 0.150600 -0.215400 -0.144000 0.080000 -0.984000
+0.500000 0.150600 -0.194400 -0.208000 0.240000 -0.944000
+0.550000 0.100400 -0.212600 -0.200000 0.352000 -0.904000
+0.500000 0.100400 -0.210700 0.048000 0.704000 -0.704000
+0.550000 0.067800 -0.243900 0.024000 0.672000 -0.728000
+0.500000 0.082500 -0.243900 0.216000 0.832000 -0.504000
+0.550000 0.050200 -0.258400 0.160000 0.632000 -0.752000
+0.500000 0.050200 -0.303800 0.264000 0.816000 -0.504000
+0.550000 0.015600 -0.304800 0.472000 0.712000 -0.512000
+0.500000 0.049600 -0.304800 0.264000 0.736000 -0.616000
+0.550000 0.000000 -0.335900 0.576000 0.464000 -0.664000
+0.500000 0.014000 -0.365800 0.216000 0.784000 -0.568000
+0.524100 0.000000 -0.365800 0.648000 0.312000 -0.688000
+0.500000 0.000000 -0.393700 0.528000 0.072000 -0.840000
+0.500000 -0.027200 -0.365800 0.264000 -0.576000 -0.768000
+0.524100 0.000000 -0.365800 0.648000 0.312000 -0.688000
+0.500000 -0.050200 -0.339600 -0.136000 -0.672000 -0.720000
+0.550000 0.000000 -0.335900 0.576000 0.464000 -0.664000
+0.550000 -0.050200 -0.345500 0.192000 -0.560000 -0.792000
+0.550000 -0.050200 -0.345500 0.192000 -0.560000 -0.792000
+0.526000 0.301200 -0.182900 0.408000 0.312000 -0.848000
+0.526000 0.301200 -0.182900 0.408000 0.312000 -0.848000
+0.550000 0.283200 -0.182900 0.320000 0.472000 -0.816000
+0.550000 0.301200 -0.167400 0.408000 0.504000 -0.752000
+0.550000 0.301200 -0.167400 0.408000 0.504000 -0.752000
+0.500000 -0.250100 -0.121900 -0.432000 -0.712000 0.536000
+0.500000 -0.250100 -0.121900 -0.432000 -0.712000 0.536000
+0.501100 -0.251000 -0.121900 -0.552000 -0.624000 0.544000
+0.500000 -0.251000 -0.123800 -0.544000 -0.688000 0.456000
+0.500000 -0.251000 -0.123800 -0.544000 -0.688000 0.456000
+0.608400 0.251000 -0.182900 0.328000 0.488000 -0.800000
+0.608400 0.251000 -0.182900 0.328000 0.488000 -0.800000
+0.650000 0.227800 -0.182900 0.368000 0.576000 -0.720000
+0.650000 0.251000 -0.154700 0.488000 0.640000 -0.584000
+0.650000 0.251000 -0.154700 0.488000 0.640000 -0.584000
+0.600000 -0.333000 -0.121900 0.024000 -0.312000 0.944000
+0.600000 -0.333000 -0.121900 0.024000 -0.312000 0.944000
+0.600000 -0.351500 -0.136300 0.144000 -0.792000 0.584000
+0.650000 -0.327200 -0.121900 -0.280000 -0.536000 0.792000
+0.650000 -0.351500 -0.143500 -0.280000 -0.536000 0.784000
+0.679500 -0.351500 -0.121900 -0.424000 -0.464000 0.768000
+0.650000 -0.401700 -0.175000 -0.240000 -0.688000 0.680000
+0.700000 -0.372000 -0.121900 -0.360000 -0.440000 0.816000
+0.700000 -0.401700 -0.145100 -0.400000 -0.504000 0.752000
+0.737900 -0.401700 -0.121900 -0.352000 -0.448000 0.816000
+0.700000 -0.435200 -0.182900 -0.448000 -0.712000 0.536000
+0.750000 -0.411100 -0.121900 -0.304000 -0.456000 0.824000
+0.719600 -0.451900 -0.182900 -0.568000 -0.640000 0.512000
+0.750000 -0.451900 -0.153800 -0.384000 -0.528000 0.752000
+0.750000 -0.479900 -0.182900 -0.456000 -0.632000 0.616000
+0.719600 -0.451900 -0.182900 -0.568000 -0.640000 0.512000
+0.750000 -0.502100 -0.236900 -0.448000 -0.776000 0.432000
+0.700000 -0.451900 -0.215800 -0.528000 -0.696000 0.472000
+0.744200 -0.502100 -0.243900 -0.480000 -0.864000 0.128000
+0.700000 -0.472400 -0.243900 -0.560000 -0.816000 -0.016000
+0.750000 -0.502100 -0.254300 -0.448000 -0.832000 -0.312000
+0.700000 -0.481300 -0.304800 -0.240000 -0.712000 -0.656000
+0.750000 -0.487000 -0.304800 -0.104000 -0.744000 -0.656000
+0.700000 -0.451900 -0.321600 -0.136000 -0.312000 -0.936000
+0.750000 -0.451900 -0.330900 0.152000 -0.080000 -0.984000
+0.700000 -0.401700 -0.334100 0.120000 -0.128000 -0.976000
+0.750000 -0.401700 -0.321600 0.336000 0.000000 -0.936000
+0.700000 -0.351500 -0.333900 0.344000 -0.040000 -0.936000
+0.750000 -0.351500 -0.307800 0.512000 0.128000 -0.840000
+0.700000 -0.301200 -0.354900 0.160000 -0.240000 -0.952000
+0.750000 -0.334300 -0.304800 0.512000 0.112000 -0.840000
+0.744500 -0.301200 -0.304800 0.640000 0.104000 -0.760000
+0.750000 -0.301200 -0.299800 0.512000 0.144000 -0.840000
+0.728900 -0.251000 -0.304800 0.720000 0.440000 -0.528000
+0.750000 -0.251000 -0.256700 0.824000 0.520000 -0.208000
+0.700000 -0.211400 -0.304800 0.288000 0.624000 -0.720000
+0.750000 -0.247000 -0.243900 0.832000 0.536000 -0.096000
+0.700000 -0.200800 -0.294000 0.576000 0.608000 -0.536000
+0.717800 -0.200800 -0.243900 0.824000 0.560000 -0.064000
+0.700000 -0.175300 -0.243900 0.752000 0.600000 -0.240000
+0.713600 -0.200800 -0.182900 0.824000 0.512000 0.224000
+0.700000 -0.178500 -0.182900 0.792000 0.568000 0.200000
+0.700000 -0.200800 -0.144600 0.696000 0.528000 0.480000
+0.700000 -0.200800 -0.144600 0.696000 0.528000 0.480000
+0.600000 -0.351500 -0.136300 0.144000 -0.792000 0.584000
+0.600000 -0.351500 -0.136300 0.144000 -0.792000 0.584000
+0.650000 -0.351500 -0.143500 -0.280000 -0.536000 0.784000
+0.600000 -0.392700 -0.182900 -0.184000 -0.752000 0.624000
+0.650000 -0.401700 -0.175000 -0.240000 -0.688000 0.680000
+0.628900 -0.401700 -0.182900 -0.216000 -0.760000 0.608000
+0.650000 -0.407700 -0.182900 -0.272000 -0.728000 0.624000
+0.600000 -0.401700 -0.203000 -0.208000 -0.872000 0.432000
+0.650000 -0.436800 -0.243900 -0.416000 -0.848000 0.320000
+0.600000 -0.414700 -0.243900 -0.184000 -0.936000 0.272000
+0.650000 -0.449600 -0.304800 -0.280000 -0.432000 -0.848000
+0.600000 -0.422100 -0.304800 -0.120000 -0.768000 -0.616000
+0.650000 -0.401700 -0.330300 -0.240000 -0.360000 -0.896000
+0.600000 -0.401700 -0.327900 -0.024000 -0.544000 -0.832000
+0.650000 -0.351500 -0.332000 0.016000 -0.144000 -0.984000
+0.600000 -0.351500 -0.337900 0.040000 -0.080000 -0.992000
+0.650000 -0.301200 -0.350300 0.016000 -0.440000 -0.888000
+0.600000 -0.301200 -0.352300 -0.528000 -0.312000 -0.776000
+0.600000 -0.301200 -0.352300 -0.528000 -0.312000 -0.776000
+0.650000 0.278000 -0.121900 0.448000 0.624000 -0.624000
+0.650000 0.278000 -0.121900 0.448000 0.624000 -0.624000
+0.650000 0.251000 -0.154700 0.488000 0.640000 -0.584000
+0.673000 0.251000 -0.121900 0.568000 0.576000 -0.584000
+0.673000 0.251000 -0.121900 0.568000 0.576000 -0.584000
+0.700000 -0.401700 -0.145100 -0.400000 -0.504000 0.752000
+0.700000 -0.401700 -0.145100 -0.400000 -0.504000 0.752000
+0.650000 -0.401700 -0.175000 -0.240000 -0.688000 0.680000
+0.700000 -0.435200 -0.182900 -0.448000 -0.712000 0.536000
+0.650000 -0.407700 -0.182900 -0.272000 -0.728000 0.624000
+0.700000 -0.451900 -0.215800 -0.528000 -0.696000 0.472000
+0.650000 -0.436800 -0.243900 -0.416000 -0.848000 0.320000
+0.673600 -0.451900 -0.243900 -0.480000 -0.752000 0.448000
+0.650000 -0.449600 -0.304800 -0.280000 -0.432000 -0.848000
+0.653100 -0.451900 -0.304800 -0.336000 -0.480000 -0.800000
+0.650000 -0.401700 -0.330300 -0.240000 -0.360000 -0.896000
+0.700000 -0.451900 -0.321600 -0.136000 -0.312000 -0.936000
+0.700000 -0.401700 -0.334100 0.120000 -0.128000 -0.976000
+0.650000 -0.401700 -0.330300 -0.240000 -0.360000 -0.896000
+0.700000 -0.351500 -0.333900 0.344000 -0.040000 -0.936000
+0.650000 -0.351500 -0.332000 0.016000 -0.144000 -0.984000
+0.700000 -0.301200 -0.354900 0.160000 -0.240000 -0.952000
+0.650000 -0.301200 -0.350300 0.016000 -0.440000 -0.888000
+0.650000 -0.301200 -0.350300 0.016000 -0.440000 -0.888000
+0.719200 -0.251000 -0.121900 0.760000 0.456000 0.440000
+0.719200 -0.251000 -0.121900 0.760000 0.456000 0.440000
+0.750000 -0.297400 -0.121900 0.656000 0.584000 0.464000
+0.746300 -0.251000 -0.182900 0.848000 0.496000 0.152000
+0.750000 -0.257500 -0.182900 0.856000 0.488000 0.120000
+0.750000 -0.251000 -0.218200 0.840000 0.520000 0.096000
+0.777000 -0.301200 -0.182900 0.784000 0.536000 0.304000
+0.752500 -0.251000 -0.243900 0.840000 0.528000 -0.096000
+0.780500 -0.301200 -0.243900 0.848000 0.504000 -0.128000
+0.777000 -0.301200 -0.182900 0.784000 0.536000 0.304000
+0.800000 -0.328800 -0.243900 0.640000 0.656000 -0.384000
+0.800000 -0.333100 -0.182900 0.680000 0.680000 0.256000
+0.829500 -0.351500 -0.243900 0.648000 0.640000 -0.400000
+0.821300 -0.351500 -0.182900 0.624000 0.648000 0.416000
+0.850000 -0.375700 -0.243900 0.544000 0.616000 -0.552000
+0.850000 -0.381900 -0.182900 0.632000 0.696000 0.328000
+0.890600 -0.401700 -0.243900 0.576000 0.616000 -0.528000
+0.872200 -0.401700 -0.182900 0.632000 0.640000 0.416000
+0.900000 -0.412700 -0.243900 0.520000 0.640000 -0.552000
+0.900000 -0.433800 -0.182900 0.512000 0.688000 0.504000
+0.950000 -0.433400 -0.243900 0.528000 0.832000 0.152000
+0.933400 -0.451900 -0.182900 0.464000 0.712000 0.512000
+0.950000 -0.451900 -0.206400 0.504000 0.736000 0.440000
+0.950000 -0.463500 -0.182900 0.464000 0.672000 0.568000
+0.933400 -0.451900 -0.182900 0.464000 0.712000 0.512000
+0.950000 -0.502100 -0.136000 -0.296000 0.400000 0.864000
+0.900000 -0.451900 -0.156900 0.400000 0.632000 0.656000
+0.900000 -0.502100 -0.123800 -0.168000 -0.208000 0.960000
+0.850000 -0.451900 -0.123600 0.328000 0.296000 0.888000
+0.850000 -0.502100 -0.142100 -0.224000 -0.520000 0.816000
+0.850000 -0.502100 -0.142100 -0.224000 -0.520000 0.816000
+0.750000 -0.257500 -0.182900 0.856000 0.488000 0.120000
+0.750000 -0.257500 -0.182900 0.856000 0.488000 0.120000
+0.750000 -0.297400 -0.121900 0.656000 0.584000 0.464000
+0.777000 -0.301200 -0.182900 0.784000 0.536000 0.304000
+0.752700 -0.301200 -0.121900 0.792000 0.344000 0.488000
+0.800000 -0.333100 -0.182900 0.680000 0.680000 0.256000
+0.775700 -0.351500 -0.121900 0.600000 0.328000 0.720000
+0.800000 -0.351500 -0.149400 0.664000 0.512000 0.528000
+0.800000 -0.391100 -0.121900 0.384000 0.416000 0.816000
+0.821300 -0.351500 -0.182900 0.624000 0.648000 0.416000
+0.810500 -0.401700 -0.121900 0.456000 0.104000 0.872000
+0.850000 -0.381900 -0.182900 0.632000 0.696000 0.328000
+0.850000 -0.401700 -0.151500 0.608000 0.552000 0.560000
+0.872200 -0.401700 -0.182900 0.632000 0.640000 0.416000
+0.850000 -0.451900 -0.123600 0.328000 0.296000 0.888000
+0.900000 -0.433800 -0.182900 0.512000 0.688000 0.504000
+0.900000 -0.451900 -0.156900 0.400000 0.632000 0.656000
+0.933400 -0.451900 -0.182900 0.464000 0.712000 0.512000
+0.933400 -0.451900 -0.182900 0.464000 0.712000 0.512000
+0.783200 -0.502100 -0.182900 -0.448000 -0.720000 0.512000
+0.783200 -0.502100 -0.182900 -0.448000 -0.720000 0.512000
+0.800000 -0.502100 -0.171200 -0.360000 -0.648000 0.664000
+0.800000 -0.511100 -0.182900 -0.376000 -0.744000 0.544000
+0.800000 -0.511100 -0.182900 -0.376000 -0.744000 0.544000
+0.800000 -0.333100 -0.182900 0.680000 0.680000 0.256000
+0.800000 -0.333100 -0.182900 0.680000 0.680000 0.256000
+0.821300 -0.351500 -0.182900 0.624000 0.648000 0.416000
+0.800000 -0.351500 -0.149400 0.664000 0.512000 0.528000
+0.800000 -0.351500 -0.149400 0.664000 0.512000 0.528000
+0.900000 -0.552300 -0.159100 -0.496000 -0.592000 0.632000
+0.900000 -0.552300 -0.159100 -0.496000 -0.592000 0.632000
+0.900000 -0.573700 -0.182900 -0.608000 -0.704000 0.344000
+0.876500 -0.552300 -0.182900 -0.528000 -0.672000 0.504000
+0.900000 -0.578300 -0.243900 -0.552000 -0.704000 -0.440000
+0.868400 -0.552300 -0.243900 -0.552000 -0.760000 -0.328000
+0.900000 -0.552300 -0.278500 -0.424000 -0.592000 -0.672000
+0.900000 -0.552300 -0.278500 -0.424000 -0.592000 -0.672000
+0.900000 0.127900 -0.121900 0.560000 0.776000 -0.264000
+0.900000 0.127900 -0.121900 0.560000 0.776000 -0.264000
+0.931600 0.100400 -0.121900 0.600000 0.744000 -0.272000
+0.900000 0.111100 -0.182900 0.552000 0.712000 -0.416000
+0.912000 0.100400 -0.182900 0.600000 0.704000 -0.360000
+0.900000 0.100400 -0.203200 0.536000 0.688000 -0.472000
+0.900000 0.100400 -0.203200 0.536000 0.688000 -0.472000
+0.950000 -0.602500 -0.169200 -0.536000 -0.520000 0.656000
+0.950000 -0.602500 -0.169200 -0.536000 -0.520000 0.656000
+0.950000 -0.619400 -0.182900 -0.632000 -0.592000 0.480000
+0.935000 -0.602500 -0.182900 -0.552000 -0.552000 0.608000
+0.950000 -0.619400 -0.243900 -0.600000 -0.584000 -0.536000
+0.933200 -0.602500 -0.243900 -0.584000 -0.624000 -0.512000
+0.950000 -0.602500 -0.260200 -0.544000 -0.504000 -0.664000
+0.950000 -0.602500 -0.260200 -0.544000 -0.504000 -0.664000
+1.000000 -0.251000 -0.154300 -0.728000 -0.648000 0.200000
+1.000000 -0.251000 -0.154300 -0.728000 -0.648000 0.200000
+1.000000 -0.258900 -0.182900 -0.752000 -0.616000 0.208000
+0.993400 -0.251000 -0.182900 -0.736000 -0.640000 0.200000
+1.000000 -0.277900 -0.243900 -0.712000 -0.592000 0.360000
+0.978600 -0.251000 -0.243900 -0.696000 -0.616000 0.352000
+0.978600 -0.251000 -0.243900 -0.696000 -0.616000 0.352000
+0.950000 -0.560000 -0.121900 -0.400000 -0.536000 0.728000
+0.950000 -0.560000 -0.121900 -0.400000 -0.536000 0.728000
+0.992300 -0.602500 -0.121900 -0.520000 -0.480000 0.696000
+0.950000 -0.602500 -0.169200 -0.536000 -0.520000 0.656000
+0.950000 -0.602500 -0.169200 -0.536000 -0.520000 0.656000
+1.000000 -0.652700 -0.168000 -0.488000 -0.568000 0.656000
+1.000000 -0.652700 -0.168000 -0.488000 -0.568000 0.656000
+1.000000 -0.666200 -0.182900 -0.536000 -0.632000 0.544000
+0.983200 -0.652700 -0.182900 -0.528000 -0.608000 0.584000
+1.000000 -0.673300 -0.243900 -0.656000 -0.656000 -0.368000
+0.979500 -0.652700 -0.243900 -0.672000 -0.664000 -0.304000
+1.000000 -0.652700 -0.268800 -0.592000 -0.512000 -0.608000
+1.000000 -0.652700 -0.268800 -0.592000 -0.512000 -0.608000
+-1.000000 0.256900 -0.182900 0.288000 0.752000 -0.584000
+-1.000000 0.256900 -0.182900 0.288000 0.752000 -0.584000
+-1.000000 0.251000 -0.191500 0.280000 0.728000 -0.616000
+-0.985000 0.251000 -0.182900 0.288000 0.752000 -0.576000
+-0.985000 0.251000 -0.182900 0.288000 0.752000 -0.576000
+-0.980800 0.200800 -0.243900 0.232000 0.632000 -0.736000
+-0.980800 0.200800 -0.243900 0.232000 0.632000 -0.736000
+-0.950000 0.189400 -0.243900 0.264000 0.616000 -0.728000
+-0.950000 0.200800 -0.231900 0.272000 0.640000 -0.704000
+-0.950000 0.200800 -0.231900 0.272000 0.640000 -0.704000
+-0.900000 0.214200 -0.182900 0.360000 0.720000 -0.576000
+-0.900000 0.214200 -0.182900 0.360000 0.720000 -0.576000
+-0.900000 0.200800 -0.201400 0.352000 0.680000 -0.640000
+-0.874200 0.200800 -0.182900 0.360000 0.712000 -0.584000
+-0.874200 0.200800 -0.182900 0.360000 0.712000 -0.584000
+-0.878700 0.150600 -0.243900 0.328000 0.616000 -0.704000
+-0.878700 0.150600 -0.243900 0.328000 0.616000 -0.704000
+-0.850000 0.135500 -0.243900 0.320000 0.608000 -0.712000
+-0.850000 0.150600 -0.229000 0.320000 0.608000 -0.720000
+-0.850000 0.150600 -0.229000 0.320000 0.608000 -0.720000
+-0.900000 -0.542100 -0.182900 -0.808000 -0.560000 0.136000
+-0.900000 -0.542100 -0.182900 -0.808000 -0.560000 0.136000
+-0.900000 -0.551700 -0.243900 -0.808000 -0.568000 -0.120000
+-0.892400 -0.552300 -0.182900 -0.760000 -0.624000 0.176000
+-0.899500 -0.552300 -0.243900 -0.800000 -0.592000 -0.072000
+-0.850000 -0.592600 -0.182900 -0.520000 -0.800000 0.264000
+-0.851300 -0.602500 -0.243900 -0.680000 -0.720000 -0.008000
+-0.850000 -0.602500 -0.238600 -0.616000 -0.752000 0.216000
+-0.850000 -0.603800 -0.243900 -0.656000 -0.744000 0.064000
+-0.832500 -0.602500 -0.182900 -0.576000 -0.768000 0.272000
+-0.800000 -0.632800 -0.243900 -0.432000 -0.896000 0.072000
+-0.800000 -0.620600 -0.182900 -0.312000 -0.880000 0.336000
+-0.750000 -0.646000 -0.243900 -0.088000 -0.984000 0.144000
+-0.750000 -0.630100 -0.182900 -0.144000 -0.912000 0.360000
+-0.750000 -0.630100 -0.182900 -0.144000 -0.912000 0.360000
+-0.820300 -0.502100 -0.182900 0.496000 0.792000 0.344000
+-0.820300 -0.502100 -0.182900 0.496000 0.792000 0.344000
+-0.800000 -0.502100 -0.227500 0.432000 0.824000 0.352000
+-0.800000 -0.513200 -0.182900 -0.080000 0.880000 0.456000
+-0.750000 -0.502100 -0.184800 -0.496000 0.696000 0.496000
+-0.750000 -0.503000 -0.182900 -0.200000 0.848000 0.472000
+-0.749300 -0.502100 -0.182900 -0.920000 -0.232000 0.288000
+-0.750000 -0.502100 -0.184800 -0.496000 0.696000 0.496000
+-0.750000 -0.499500 -0.182900 -0.936000 -0.200000 0.264000
+-0.750000 -0.499500 -0.182900 -0.936000 -0.200000 0.264000
+-0.850000 -0.592600 -0.182900 -0.520000 -0.800000 0.264000
+-0.850000 -0.592600 -0.182900 -0.520000 -0.800000 0.264000
+-0.832500 -0.602500 -0.182900 -0.576000 -0.768000 0.272000
+-0.850000 -0.602500 -0.238600 -0.616000 -0.752000 0.216000
+-0.850000 -0.602500 -0.238600 -0.616000 -0.752000 0.216000
+-0.650000 0.045800 -0.182900 0.672000 0.432000 -0.592000
+-0.650000 0.045800 -0.182900 0.672000 0.432000 -0.592000
+-0.650000 0.000000 -0.224600 0.632000 0.368000 -0.672000
+-0.621400 0.000000 -0.182900 0.848000 0.280000 -0.440000
+-0.621400 0.000000 -0.182900 0.848000 0.280000 -0.440000
+-0.600000 -0.629300 -0.182900 0.072000 -0.968000 0.224000
+-0.600000 -0.629300 -0.182900 0.072000 -0.968000 0.224000
+-0.600000 -0.640700 -0.243900 0.080000 -0.976000 0.192000
+-0.550000 -0.618800 -0.182900 0.168000 -0.944000 0.272000
+-0.550000 -0.629900 -0.243900 0.160000 -0.960000 0.200000
+-0.500000 -0.610400 -0.182900 -0.136000 -0.936000 0.304000
+-0.500000 -0.625200 -0.243900 -0.096000 -0.960000 0.240000
+-0.550000 -0.629900 -0.243900 0.160000 -0.960000 0.200000
+-0.500000 -0.637800 -0.304800 -0.208000 -0.976000 -0.032000
+-0.550000 -0.639800 -0.304800 0.152000 -0.984000 0.000000
+-0.500000 -0.633000 -0.365800 -0.088000 -0.968000 -0.200000
+-0.550000 -0.637200 -0.365800 0.152000 -0.968000 -0.168000
+-0.550000 -0.639800 -0.304800 0.152000 -0.984000 0.000000
+-0.600000 -0.645500 -0.365800 0.016000 -0.968000 -0.216000
+-0.600000 -0.650800 -0.304800 0.064000 -0.992000 0.000000
+-0.550000 -0.639800 -0.304800 0.152000 -0.984000 0.000000
+-0.600000 -0.640700 -0.243900 0.080000 -0.976000 0.192000
+-0.550000 -0.629900 -0.243900 0.160000 -0.960000 0.200000
+-0.550000 -0.629900 -0.243900 0.160000 -0.960000 0.200000
+-0.403600 -0.100400 -0.182900 -0.616000 0.592000 -0.512000
+-0.403600 -0.100400 -0.182900 -0.616000 0.592000 -0.512000
+-0.400000 -0.100400 -0.188300 -0.616000 0.576000 -0.520000
+-0.400000 -0.096400 -0.182900 -0.664000 0.552000 -0.496000
+-0.354400 -0.100400 -0.243900 -0.584000 0.448000 -0.664000
+-0.365500 -0.050200 -0.182900 -0.728000 0.384000 -0.560000
+-0.350000 -0.093900 -0.243900 -0.600000 0.408000 -0.680000
+-0.350000 -0.050200 -0.209400 -0.696000 0.392000 -0.584000
+-0.321700 -0.050200 -0.243900 -0.656000 0.344000 -0.656000
+-0.350000 -0.016600 -0.182900 -0.688000 0.360000 -0.616000
+-0.301700 0.000000 -0.243900 -0.744000 0.392000 -0.536000
+-0.340600 0.000000 -0.182900 -0.696000 0.480000 -0.520000
+-0.340600 0.000000 -0.182900 -0.696000 0.480000 -0.520000
+-0.444500 -0.150600 -0.243900 -0.312000 0.784000 -0.528000
+-0.444500 -0.150600 -0.243900 -0.312000 0.784000 -0.528000
+-0.450000 -0.150600 -0.239400 -0.408000 0.792000 -0.448000
+-0.450000 -0.152500 -0.243900 -0.384000 0.800000 -0.448000
+-0.450000 -0.152500 -0.243900 -0.384000 0.800000 -0.448000
+-0.400000 -0.651500 -0.182900 -0.552000 -0.472000 0.672000
+-0.400000 -0.651500 -0.182900 -0.552000 -0.472000 0.672000
+-0.400000 -0.652700 -0.184800 -0.640000 -0.536000 0.536000
+-0.450000 -0.629600 -0.182900 -0.344000 -0.872000 0.320000
+-0.428400 -0.652700 -0.243900 -0.584000 -0.736000 0.336000
+-0.450000 -0.644000 -0.243900 -0.352000 -0.912000 0.200000
+-0.450000 -0.652700 -0.293400 -0.288000 -0.936000 0.160000
+-0.428400 -0.652700 -0.243900 -0.584000 -0.736000 0.336000
+-0.450000 -0.654300 -0.304800 -0.272000 -0.952000 0.040000
+-0.400000 -0.663600 -0.243900 -0.504000 -0.840000 0.160000
+-0.400000 -0.672200 -0.304800 -0.400000 -0.904000 -0.128000
+-0.363900 -0.703000 -0.243900 -0.784000 -0.584000 0.176000
+-0.371300 -0.703000 -0.304800 -0.816000 -0.552000 -0.144000
+-0.350000 -0.730400 -0.243900 -0.544000 -0.776000 0.296000
+-0.350000 -0.747900 -0.304800 -0.512000 -0.832000 -0.184000
+-0.300000 -0.736500 -0.243900 0.320000 -0.832000 0.440000
+-0.330700 -0.753200 -0.304800 -0.192000 -0.968000 -0.112000
+-0.300000 -0.753200 -0.286100 0.088000 -0.928000 0.352000
+-0.300000 -0.758500 -0.304800 0.104000 -0.976000 -0.144000
+-0.281500 -0.753200 -0.304800 0.312000 -0.920000 -0.216000
+-0.300000 -0.753200 -0.317300 0.136000 -0.840000 -0.512000
+-0.300000 -0.758500 -0.304800 0.104000 -0.976000 -0.144000
+-0.330700 -0.753200 -0.304800 -0.192000 -0.968000 -0.112000
+-0.300000 -0.753200 -0.317300 0.136000 -0.840000 -0.512000
+-0.350000 -0.747900 -0.304800 -0.512000 -0.832000 -0.184000
+-0.300000 -0.703000 -0.365100 0.056000 -0.232000 -0.968000
+-0.350000 -0.703000 -0.357000 -0.336000 -0.496000 -0.792000
+-0.300000 -0.687100 -0.365800 0.104000 -0.048000 -0.992000
+-0.350000 -0.679200 -0.365800 -0.072000 -0.176000 -0.976000
+-0.350000 -0.703000 -0.357000 -0.336000 -0.496000 -0.792000
+-0.400000 -0.653700 -0.365800 -0.176000 -0.888000 -0.416000
+-0.371300 -0.703000 -0.304800 -0.816000 -0.552000 -0.144000
+-0.400000 -0.672200 -0.304800 -0.400000 -0.904000 -0.128000
+-0.400000 -0.672200 -0.304800 -0.400000 -0.904000 -0.128000
+-0.428400 -0.652700 -0.243900 -0.584000 -0.736000 0.336000
+-0.428400 -0.652700 -0.243900 -0.584000 -0.736000 0.336000
+-0.400000 -0.652700 -0.184800 -0.640000 -0.536000 0.536000
+-0.400000 -0.663600 -0.243900 -0.504000 -0.840000 0.160000
+-0.396000 -0.652700 -0.182900 -0.176000 0.000000 0.984000
+-0.363900 -0.703000 -0.243900 -0.784000 -0.584000 0.176000
+-0.350700 -0.703000 -0.182900 -0.792000 -0.176000 0.576000
+-0.350000 -0.730400 -0.243900 -0.544000 -0.776000 0.296000
+-0.350000 -0.704300 -0.182900 -0.112000 -0.808000 0.576000
+-0.300000 -0.736500 -0.243900 0.320000 -0.832000 0.440000
+-0.300000 -0.708000 -0.182900 0.360000 -0.768000 0.520000
+-0.300000 -0.708000 -0.182900 0.360000 -0.768000 0.520000
+-0.365500 -0.050200 -0.182900 -0.728000 0.384000 -0.560000
+-0.365500 -0.050200 -0.182900 -0.728000 0.384000 -0.560000
+-0.350000 -0.050200 -0.209400 -0.696000 0.392000 -0.584000
+-0.350000 -0.016600 -0.182900 -0.688000 0.360000 -0.616000
+-0.350000 -0.016600 -0.182900 -0.688000 0.360000 -0.616000
+-0.400000 -0.100400 -0.188300 -0.616000 0.576000 -0.520000
+-0.400000 -0.100400 -0.188300 -0.616000 0.576000 -0.520000
+-0.400000 -0.131400 -0.243900 -0.384000 0.744000 -0.536000
+-0.354400 -0.100400 -0.243900 -0.584000 0.448000 -0.664000
+-0.400000 -0.150600 -0.272200 -0.312000 0.624000 -0.704000
+-0.350000 -0.100400 -0.248500 -0.576000 0.440000 -0.680000
+-0.350000 -0.150600 -0.298700 -0.264000 0.464000 -0.840000
+-0.400000 -0.150600 -0.272200 -0.312000 0.624000 -0.704000
+-0.350000 -0.159400 -0.304800 -0.248000 0.528000 -0.808000
+-0.400000 -0.174400 -0.304800 -0.224000 0.736000 -0.632000
+-0.350000 -0.200800 -0.339000 0.200000 0.416000 -0.880000
+-0.400000 -0.200800 -0.333600 -0.064000 0.568000 -0.816000
+-0.350000 -0.248400 -0.365800 0.184000 0.424000 -0.880000
+-0.400000 -0.239300 -0.365800 0.048000 0.512000 -0.848000
+-0.350000 -0.251000 -0.367200 0.240000 0.168000 -0.952000
+-0.400000 -0.251000 -0.373300 0.080000 0.400000 -0.904000
+-0.350000 -0.301200 -0.377400 0.232000 0.208000 -0.944000
+-0.400000 -0.301200 -0.390900 0.144000 0.296000 -0.936000
+-0.350000 -0.351500 -0.416300 -0.176000 0.600000 -0.768000
+-0.400000 -0.351500 -0.411400 0.000000 0.616000 -0.784000
+-0.400000 -0.351500 -0.411400 0.000000 0.616000 -0.784000
+-0.350000 -0.647900 -0.182900 0.008000 0.768000 0.624000
+-0.350000 -0.647900 -0.182900 0.008000 0.768000 0.624000
+-0.386500 -0.602500 -0.182900 0.376000 -0.032000 0.920000
+-0.350000 -0.630200 -0.243900 -0.144000 0.776000 0.600000
+-0.371400 -0.602500 -0.243900 0.928000 0.016000 0.352000
+-0.371400 -0.602500 -0.243900 0.928000 0.016000 0.352000
+-0.200000 0.172600 -0.182900 -0.488000 0.416000 -0.760000
+-0.200000 0.172600 -0.182900 -0.488000 0.416000 -0.760000
+-0.216700 0.150600 -0.182900 -0.560000 0.376000 -0.728000
+-0.200000 0.150600 -0.197300 -0.488000 0.464000 -0.728000
+-0.249100 0.100400 -0.182900 -0.576000 0.496000 -0.640000
+-0.200000 0.100400 -0.242800 -0.520000 0.512000 -0.672000
+-0.200000 0.100400 -0.242800 -0.520000 0.512000 -0.672000
+-0.200000 0.172600 -0.182900 -0.488000 0.416000 -0.760000
+-0.200000 0.172600 -0.182900 -0.488000 0.416000 -0.760000
+-0.200000 0.150600 -0.197300 -0.488000 0.464000 -0.728000
+-0.173800 0.200800 -0.182900 -0.480000 0.344000 -0.800000
+-0.150000 0.150600 -0.235500 -0.296000 0.536000 -0.784000
+-0.150000 0.200800 -0.199200 -0.328000 0.272000 -0.896000
+-0.150000 0.200800 -0.199200 -0.328000 0.272000 -0.896000
+0.100000 0.004900 -0.182900 -0.288000 0.864000 0.400000
+0.100000 0.004900 -0.182900 -0.288000 0.864000 0.400000
+0.050000 0.005700 -0.182900 0.312000 0.584000 0.744000
+0.100000 0.000000 -0.203800 -0.256000 0.936000 -0.224000
+0.050000 0.042300 -0.243900 0.688000 0.376000 -0.616000
+0.078000 0.000000 -0.243900 0.336000 0.616000 -0.696000
+0.050000 0.000000 -0.258500 0.448000 0.256000 -0.848000
+0.100000 -0.005500 -0.243900 -0.184000 0.760000 -0.616000
+0.050000 -0.050200 -0.279200 0.280000 0.320000 -0.896000
+0.100000 -0.050200 -0.272200 -0.136000 0.384000 -0.904000
+0.050000 -0.100400 -0.298100 0.360000 0.248000 -0.896000
+0.100000 -0.100400 -0.298900 0.040000 0.136000 -0.984000
+0.100000 -0.100400 -0.298900 0.040000 0.136000 -0.984000
+0.078000 0.000000 -0.243900 0.336000 0.616000 -0.696000
+0.078000 0.000000 -0.243900 0.336000 0.616000 -0.696000
+0.100000 -0.005500 -0.243900 -0.184000 0.760000 -0.616000
+0.100000 0.000000 -0.203800 -0.256000 0.936000 -0.224000
+0.100000 0.000000 -0.203800 -0.256000 0.936000 -0.224000
+0.200000 -0.301200 -0.206400 -0.600000 -0.688000 0.384000
+0.200000 -0.301200 -0.206400 -0.600000 -0.688000 0.384000
+0.200000 -0.319700 -0.243900 -0.624000 -0.696000 0.328000
+0.176900 -0.301200 -0.243900 -0.504000 -0.800000 0.304000
+0.200000 -0.340400 -0.304800 -0.480000 -0.448000 -0.744000
+0.170700 -0.301200 -0.304800 -0.520000 -0.608000 -0.592000
+0.200000 -0.301200 -0.321600 -0.488000 -0.368000 -0.784000
+0.200000 -0.301200 -0.321600 -0.488000 -0.368000 -0.784000
+0.300000 -0.330300 -0.182900 -0.312000 -0.696000 0.632000
+0.300000 -0.330300 -0.182900 -0.312000 -0.696000 0.632000
+0.300000 -0.351500 -0.225700 -0.416000 -0.800000 0.416000
+0.250000 -0.319600 -0.182900 -0.280000 -0.832000 0.472000
+0.277600 -0.351500 -0.243900 -0.264000 -0.888000 0.352000
+0.250000 -0.343100 -0.243900 -0.320000 -0.920000 0.208000
+0.271900 -0.351500 -0.304800 -0.112000 -0.784000 -0.608000
+0.250000 -0.348300 -0.304800 -0.128000 -0.736000 -0.656000
+0.300000 -0.351500 -0.310200 -0.192000 -0.728000 -0.648000
+0.250000 -0.313600 -0.365800 -0.336000 -0.640000 -0.680000
+0.300000 -0.308000 -0.365800 0.080000 -0.656000 -0.744000
+0.250000 -0.301200 -0.379400 -0.536000 -0.264000 -0.792000
+0.300000 -0.301200 -0.372900 0.128000 -0.472000 -0.864000
+0.300000 -0.308000 -0.365800 0.080000 -0.656000 -0.744000
+0.333500 -0.301200 -0.365800 0.208000 -0.080000 -0.968000
+0.300000 -0.351500 -0.310200 -0.192000 -0.728000 -0.648000
+0.350000 -0.301200 -0.360500 0.376000 0.184000 -0.904000
+0.348000 -0.351500 -0.365800 -0.720000 -0.032000 -0.680000
+0.350000 -0.334300 -0.365800 -0.304000 0.096000 -0.944000
+0.350000 -0.351500 -0.368100 -0.440000 0.096000 -0.888000
+0.355700 -0.351500 -0.365800 0.360000 -0.072000 -0.928000
+0.350000 -0.354600 -0.365800 -0.264000 -0.632000 -0.720000
+0.400000 -0.351500 -0.338800 0.360000 -0.568000 -0.728000
+0.350000 -0.401700 -0.317400 -0.608000 -0.560000 -0.544000
+0.400000 -0.388800 -0.304800 0.392000 -0.800000 -0.448000
+0.376800 -0.401700 -0.304800 0.336000 -0.848000 -0.392000
+0.400000 -0.401700 -0.257800 0.112000 -0.952000 -0.280000
+0.350000 -0.410700 -0.304800 -0.592000 -0.664000 -0.440000
+0.400000 -0.404800 -0.243900 0.016000 -0.968000 0.240000
+0.350000 -0.409600 -0.243900 -0.632000 -0.696000 0.320000
+0.400000 -0.401700 -0.239700 -0.184000 -0.720000 0.656000
+0.350000 -0.401700 -0.229000 -0.616000 -0.656000 0.416000
+0.400000 -0.370500 -0.182900 -0.008000 -0.616000 0.776000
+0.350000 -0.366900 -0.182900 -0.368000 -0.552000 0.736000
+0.350000 -0.401700 -0.229000 -0.616000 -0.656000 0.416000
+0.331500 -0.351500 -0.182900 -0.432000 -0.576000 0.688000
+0.343800 -0.401700 -0.243900 -0.728000 -0.584000 0.344000
+0.300000 -0.351500 -0.225700 -0.416000 -0.800000 0.416000
+0.300000 -0.357600 -0.243900 -0.288000 -0.920000 0.248000
+0.277600 -0.351500 -0.243900 -0.264000 -0.888000 0.352000
+0.300000 -0.355300 -0.304800 -0.272000 -0.752000 -0.592000
+0.271900 -0.351500 -0.304800 -0.112000 -0.784000 -0.608000
+0.300000 -0.351500 -0.310200 -0.192000 -0.728000 -0.648000
+0.300000 -0.355300 -0.304800 -0.272000 -0.752000 -0.592000
+0.348000 -0.351500 -0.365800 -0.720000 -0.032000 -0.680000
+0.344100 -0.401700 -0.304800 -0.784000 -0.512000 -0.336000
+0.350000 -0.354600 -0.365800 -0.264000 -0.632000 -0.720000
+0.350000 -0.401700 -0.317400 -0.608000 -0.560000 -0.544000
+0.344100 -0.401700 -0.304800 -0.784000 -0.512000 -0.336000
+0.350000 -0.410700 -0.304800 -0.592000 -0.664000 -0.440000
+0.343800 -0.401700 -0.243900 -0.728000 -0.584000 0.344000
+0.350000 -0.409600 -0.243900 -0.632000 -0.696000 0.320000
+0.350000 -0.401700 -0.229000 -0.616000 -0.656000 0.416000
+0.350000 -0.401700 -0.229000 -0.616000 -0.656000 0.416000
+0.300000 -0.330300 -0.182900 -0.312000 -0.696000 0.632000
+0.300000 -0.330300 -0.182900 -0.312000 -0.696000 0.632000
+0.331500 -0.351500 -0.182900 -0.432000 -0.576000 0.688000
+0.300000 -0.351500 -0.225700 -0.416000 -0.800000 0.416000
+0.300000 -0.351500 -0.225700 -0.416000 -0.800000 0.416000
+0.427100 -0.301200 -0.182900 0.776000 0.464000 0.416000
+0.427100 -0.301200 -0.182900 0.776000 0.464000 0.416000
+0.450000 -0.338000 -0.182900 0.248000 0.592000 0.752000
+0.429200 -0.301200 -0.243900 0.816000 0.544000 -0.176000
+0.450000 -0.327300 -0.243900 -0.064000 0.864000 -0.488000
+0.401200 -0.301200 -0.304800 0.744000 0.488000 -0.440000
+0.450000 -0.351500 -0.290700 -0.176000 0.632000 -0.744000
+0.437100 -0.351500 -0.304800 0.688000 0.472000 -0.536000
+0.437100 -0.351500 -0.304800 0.688000 0.472000 -0.536000
+0.450000 -0.370700 -0.182900 -0.080000 -0.520000 0.848000
+0.450000 -0.370700 -0.182900 -0.080000 -0.520000 0.848000
+0.400000 -0.370500 -0.182900 -0.008000 -0.616000 0.776000
+0.450000 -0.401700 -0.212100 0.240000 -0.816000 0.520000
+0.400000 -0.401700 -0.239700 -0.184000 -0.720000 0.656000
+0.450000 -0.418500 -0.243900 -0.152000 -0.896000 0.400000
+0.400000 -0.404800 -0.243900 0.016000 -0.968000 0.240000
+0.450000 -0.411100 -0.304800 -0.144000 -0.808000 -0.560000
+0.400000 -0.401700 -0.257800 0.112000 -0.952000 -0.280000
+0.428900 -0.401700 -0.304800 -0.392000 -0.464000 -0.784000
+0.428900 -0.401700 -0.304800 -0.392000 -0.464000 -0.784000
+0.500000 0.355500 -0.182900 0.400000 0.616000 -0.664000
+0.500000 0.355500 -0.182900 0.400000 0.616000 -0.664000
+0.500000 0.351500 -0.187300 0.416000 0.568000 -0.696000
+0.506000 0.351500 -0.182900 0.424000 0.584000 -0.680000
+0.506000 0.351500 -0.182900 0.424000 0.584000 -0.680000
+0.550000 -0.401700 -0.218900 -0.128000 -0.904000 0.392000
+0.550000 -0.401700 -0.218900 -0.128000 -0.904000 0.392000
+0.550000 -0.409700 -0.243900 -0.144000 -0.944000 0.272000
+0.503900 -0.401700 -0.243900 -0.232000 -0.936000 0.256000
+0.550000 -0.415900 -0.304800 -0.192000 -0.848000 -0.480000
+0.502600 -0.401700 -0.304800 -0.320000 -0.840000 -0.416000
+0.550000 -0.401700 -0.333700 -0.144000 -0.688000 -0.704000
+0.550000 -0.401700 -0.333700 -0.144000 -0.688000 -0.704000
+0.600000 0.200800 -0.209200 0.248000 0.288000 -0.920000
+0.600000 0.200800 -0.209200 0.248000 0.288000 -0.920000
+0.650000 0.200800 -0.204000 0.272000 0.408000 -0.864000
+0.600000 0.150600 -0.225200 0.008000 0.128000 -0.984000
+0.650000 0.150600 -0.219600 0.200000 0.280000 -0.928000
+0.600000 0.100400 -0.237100 -0.096000 0.168000 -0.976000
+0.650000 0.100400 -0.241400 0.232000 0.064000 -0.968000
+0.600000 0.076600 -0.243900 -0.096000 0.360000 -0.920000
+0.650000 0.067400 -0.243900 0.208000 0.056000 -0.968000
+0.600000 0.050200 -0.251100 0.248000 0.344000 -0.896000
+0.650000 0.050200 -0.244900 0.216000 0.040000 -0.968000
+0.600000 0.000000 -0.284600 0.512000 0.112000 -0.840000
+0.650000 0.000000 -0.248500 0.680000 -0.160000 -0.712000
+0.650000 0.000000 -0.248500 0.680000 -0.160000 -0.712000
+0.600000 -0.392700 -0.182900 -0.184000 -0.752000 0.624000
+0.600000 -0.392700 -0.182900 -0.184000 -0.752000 0.624000
+0.628900 -0.401700 -0.182900 -0.216000 -0.760000 0.608000
+0.600000 -0.401700 -0.203000 -0.208000 -0.872000 0.432000
+0.600000 -0.401700 -0.203000 -0.208000 -0.872000 0.432000
+0.700000 -0.451900 -0.215800 -0.528000 -0.696000 0.472000
+0.700000 -0.451900 -0.215800 -0.528000 -0.696000 0.472000
+0.700000 -0.472400 -0.243900 -0.560000 -0.816000 -0.016000
+0.673600 -0.451900 -0.243900 -0.480000 -0.752000 0.448000
+0.700000 -0.481300 -0.304800 -0.240000 -0.712000 -0.656000
+0.653100 -0.451900 -0.304800 -0.336000 -0.480000 -0.800000
+0.700000 -0.451900 -0.321600 -0.136000 -0.312000 -0.936000
+0.700000 -0.451900 -0.321600 -0.136000 -0.312000 -0.936000
+0.700000 -0.435200 -0.182900 -0.448000 -0.712000 0.536000
+0.700000 -0.435200 -0.182900 -0.448000 -0.712000 0.536000
+0.719600 -0.451900 -0.182900 -0.568000 -0.640000 0.512000
+0.700000 -0.451900 -0.215800 -0.528000 -0.696000 0.472000
+0.700000 -0.451900 -0.215800 -0.528000 -0.696000 0.472000
+0.750000 -0.502100 -0.236900 -0.448000 -0.776000 0.432000
+0.750000 -0.502100 -0.236900 -0.448000 -0.776000 0.432000
+0.750000 -0.505200 -0.243900 -0.480000 -0.856000 0.152000
+0.744200 -0.502100 -0.243900 -0.480000 -0.864000 0.128000
+0.750000 -0.502100 -0.254300 -0.448000 -0.832000 -0.312000
+0.750000 -0.502100 -0.254300 -0.448000 -0.832000 -0.312000
+0.750000 0.157000 -0.182900 0.280000 0.720000 -0.624000
+0.750000 0.157000 -0.182900 0.280000 0.720000 -0.624000
+0.750000 0.150600 -0.191500 0.256000 0.656000 -0.704000
+0.769100 0.150600 -0.182900 0.248000 0.704000 -0.648000
+0.769100 0.150600 -0.182900 0.248000 0.704000 -0.648000
+0.929600 0.050200 -0.243900 0.432000 0.672000 -0.584000
+0.929600 0.050200 -0.243900 0.432000 0.672000 -0.584000
+0.950000 0.037500 -0.243900 0.432000 0.688000 -0.576000
+0.950000 0.050200 -0.224500 0.472000 0.712000 -0.504000
+0.950000 0.050200 -0.224500 0.472000 0.712000 -0.504000
+0.950000 0.069900 -0.182900 0.544000 0.736000 -0.392000
+0.950000 0.069900 -0.182900 0.544000 0.736000 -0.392000
+0.950000 0.050200 -0.224500 0.472000 0.712000 -0.504000
+0.978000 0.050200 -0.182900 0.512000 0.768000 -0.376000
+0.978000 0.050200 -0.182900 0.512000 0.768000 -0.376000
+0.950000 -0.451900 -0.206400 0.504000 0.736000 0.440000
+0.950000 -0.451900 -0.206400 0.504000 0.736000 0.440000
+0.950000 -0.433400 -0.243900 0.528000 0.832000 0.152000
+0.980700 -0.451900 -0.243900 0.752000 0.648000 0.032000
+0.950000 -0.451900 -0.300000 0.488000 0.464000 -0.728000
+0.950000 -0.433400 -0.243900 0.528000 0.832000 0.152000
+0.900000 -0.451900 -0.272400 0.368000 0.408000 -0.824000
+0.900000 -0.412700 -0.243900 0.520000 0.640000 -0.552000
+0.850000 -0.451900 -0.293100 0.448000 0.248000 -0.848000
+0.890600 -0.401700 -0.243900 0.576000 0.616000 -0.528000
+0.850000 -0.401700 -0.268600 0.504000 0.432000 -0.744000
+0.850000 -0.375700 -0.243900 0.544000 0.616000 -0.552000
+0.800000 -0.401700 -0.291400 0.440000 0.456000 -0.760000
+0.829500 -0.351500 -0.243900 0.648000 0.640000 -0.400000
+0.800000 -0.351500 -0.277300 0.568000 0.408000 -0.704000
+0.800000 -0.328800 -0.243900 0.640000 0.656000 -0.384000
+0.800000 -0.328800 -0.243900 0.640000 0.656000 -0.384000
+1.000000 -0.503200 -0.182900 0.400000 0.704000 0.576000
+1.000000 -0.503200 -0.182900 0.400000 0.704000 0.576000
+0.998000 -0.502100 -0.182900 0.528000 0.664000 0.520000
+1.000000 -0.502100 -0.189300 0.760000 0.568000 0.296000
+1.000000 -0.502100 -0.189300 0.760000 0.568000 0.296000
+-0.891000 -0.451900 -0.304800 0.528000 0.824000 -0.192000
+-0.891000 -0.451900 -0.304800 0.528000 0.824000 -0.192000
+-0.896800 -0.451900 -0.243900 0.600000 0.776000 0.136000
+-0.850000 -0.473200 -0.304800 0.272000 0.896000 -0.336000
+-0.850000 -0.480800 -0.243900 0.376000 0.912000 0.152000
+-0.800000 -0.473000 -0.304800 -0.736000 0.648000 -0.168000
+-0.800000 -0.496000 -0.243900 0.424000 0.840000 0.320000
+-0.787800 -0.451900 -0.304800 -0.984000 0.136000 -0.040000
+-0.769800 -0.451900 -0.243900 -0.952000 -0.080000 0.272000
+-0.769800 -0.451900 -0.243900 -0.952000 -0.080000 0.272000
+-0.900000 -0.551700 -0.243900 -0.808000 -0.568000 -0.120000
+-0.900000 -0.551700 -0.243900 -0.808000 -0.568000 -0.120000
+-0.900000 -0.539600 -0.304800 -0.720000 -0.488000 -0.480000
+-0.899500 -0.552300 -0.243900 -0.800000 -0.592000 -0.072000
+-0.891900 -0.552300 -0.304800 -0.800000 -0.568000 -0.136000
+-0.851300 -0.602500 -0.243900 -0.680000 -0.720000 -0.008000
+-0.850000 -0.602000 -0.304800 -0.640000 -0.736000 -0.184000
+-0.850000 -0.602500 -0.285600 -0.672000 -0.728000 -0.024000
+-0.849200 -0.602500 -0.304800 -0.536000 -0.720000 -0.432000
+-0.850000 -0.603800 -0.243900 -0.656000 -0.744000 0.064000
+-0.800000 -0.636000 -0.304800 -0.536000 -0.792000 -0.272000
+-0.800000 -0.632800 -0.243900 -0.432000 -0.896000 0.072000
+-0.750000 -0.652200 -0.304800 -0.040000 -0.952000 -0.288000
+-0.750000 -0.646000 -0.243900 -0.088000 -0.984000 0.144000
+-0.750000 -0.646000 -0.243900 -0.088000 -0.984000 0.144000
+-0.850000 -0.603800 -0.243900 -0.656000 -0.744000 0.064000
+-0.850000 -0.603800 -0.243900 -0.656000 -0.744000 0.064000
+-0.850000 -0.602500 -0.285600 -0.672000 -0.728000 -0.024000
+-0.851300 -0.602500 -0.243900 -0.680000 -0.720000 -0.008000
+-0.851300 -0.602500 -0.243900 -0.680000 -0.720000 -0.008000
+-0.800000 0.108800 -0.243900 0.352000 0.608000 -0.704000
+-0.800000 0.108800 -0.243900 0.352000 0.608000 -0.704000
+-0.800000 0.100400 -0.252800 0.360000 0.584000 -0.720000
+-0.785800 0.100400 -0.243900 0.360000 0.584000 -0.720000
+-0.785800 0.100400 -0.243900 0.360000 0.584000 -0.720000
+-0.750000 0.077000 -0.243900 0.368000 0.552000 -0.744000
+-0.750000 0.077000 -0.243900 0.368000 0.552000 -0.744000
+-0.750000 0.050200 -0.267100 0.368000 0.432000 -0.816000
+-0.711800 0.050200 -0.243900 0.416000 0.432000 -0.792000
+-0.711800 0.050200 -0.243900 0.416000 0.432000 -0.792000
+-0.731900 -0.150600 -0.304800 0.424000 0.400000 -0.808000
+-0.731900 -0.150600 -0.304800 0.424000 0.400000 -0.808000
+-0.700000 -0.175200 -0.304800 0.352000 0.528000 -0.768000
+-0.700000 -0.150600 -0.284500 0.376000 0.392000 -0.832000
+-0.700000 -0.150600 -0.284500 0.376000 0.392000 -0.832000
+-0.650000 -0.200800 -0.303800 0.136000 0.680000 -0.712000
+-0.650000 -0.200800 -0.303800 0.136000 0.680000 -0.712000
+-0.651700 -0.200800 -0.304800 0.320000 0.544000 -0.768000
+-0.650000 -0.201600 -0.304800 0.104000 0.688000 -0.704000
+-0.700000 -0.200800 -0.326900 0.208000 0.528000 -0.816000
+-0.650000 -0.251000 -0.354800 0.152000 0.632000 -0.752000
+-0.700000 -0.251000 -0.364900 0.104000 0.560000 -0.816000
+-0.650000 -0.261300 -0.365800 0.088000 0.568000 -0.808000
+-0.700000 -0.252100 -0.365800 0.096000 0.552000 -0.824000
+-0.700000 -0.251000 -0.364900 0.104000 0.560000 -0.816000
+-0.707800 -0.251000 -0.365800 0.064000 0.432000 -0.896000
+-0.700000 -0.200800 -0.326900 0.208000 0.528000 -0.816000
+-0.750000 -0.240500 -0.365800 0.056000 0.272000 -0.952000
+-0.750000 -0.200800 -0.348300 0.272000 0.384000 -0.872000
+-0.800000 -0.234100 -0.365800 -0.112000 0.264000 -0.952000
+-0.800000 -0.200800 -0.355700 0.080000 0.256000 -0.960000
+-0.800000 -0.200800 -0.355700 0.080000 0.256000 -0.960000
+-0.650000 -0.035200 -0.243900 0.544000 0.264000 -0.792000
+-0.650000 -0.035200 -0.243900 0.544000 0.264000 -0.792000
+-0.650000 -0.050200 -0.249300 0.496000 0.208000 -0.840000
+-0.642900 -0.050200 -0.243900 0.560000 0.208000 -0.792000
+-0.642900 -0.050200 -0.243900 0.560000 0.208000 -0.792000
+-0.544700 -0.200800 -0.304800 -0.080000 0.824000 -0.552000
+-0.544700 -0.200800 -0.304800 -0.080000 0.824000 -0.552000
+-0.550000 -0.200800 -0.303600 -0.040000 0.880000 -0.464000
+-0.550000 -0.201300 -0.304800 -0.032000 0.864000 -0.488000
+-0.550000 -0.201300 -0.304800 -0.032000 0.864000 -0.488000
+-0.354400 -0.100400 -0.243900 -0.584000 0.448000 -0.664000
+-0.354400 -0.100400 -0.243900 -0.584000 0.448000 -0.664000
+-0.350000 -0.100400 -0.248500 -0.576000 0.440000 -0.680000
+-0.350000 -0.093900 -0.243900 -0.600000 0.408000 -0.680000
+-0.350000 -0.093900 -0.243900 -0.600000 0.408000 -0.680000
+-0.363900 -0.552300 -0.243900 0.816000 -0.480000 0.304000
+-0.363900 -0.552300 -0.243900 0.816000 -0.480000 0.304000
+-0.350000 -0.535600 -0.243900 0.360000 -0.840000 0.384000
+-0.350000 -0.552300 -0.283400 -0.096000 -0.680000 0.720000
+-0.317500 -0.552300 -0.243900 -0.600000 -0.648000 0.448000
+-0.317500 -0.552300 -0.243900 -0.600000 -0.648000 0.448000
+-0.300000 -0.050200 -0.270300 -0.824000 0.232000 -0.512000
+-0.300000 -0.050200 -0.270300 -0.824000 0.232000 -0.512000
+-0.266700 -0.050200 -0.304800 -0.504000 0.288000 -0.808000
+-0.300000 -0.100400 -0.298100 -0.480000 0.288000 -0.824000
+-0.288100 -0.100400 -0.304800 -0.408000 0.240000 -0.872000
+-0.300000 -0.118900 -0.304800 -0.376000 0.264000 -0.880000
+-0.300000 -0.118900 -0.304800 -0.376000 0.264000 -0.880000
+-0.256000 -0.703000 -0.243900 0.696000 -0.392000 0.584000
+-0.256000 -0.703000 -0.243900 0.696000 -0.392000 0.584000
+-0.250000 -0.679700 -0.243900 0.728000 -0.208000 0.640000
+-0.250000 -0.703000 -0.252700 0.704000 -0.368000 0.600000
+-0.250000 -0.703000 -0.252700 0.704000 -0.368000 0.600000
+-0.213400 0.000000 -0.304800 -0.304000 0.448000 -0.832000
+-0.213400 0.000000 -0.304800 -0.304000 0.448000 -0.832000
+-0.250000 0.000000 -0.286200 -0.320000 0.712000 -0.616000
+-0.250000 -0.028200 -0.304800 -0.400000 0.416000 -0.808000
+-0.250000 -0.028200 -0.304800 -0.400000 0.416000 -0.808000
+-0.196100 -0.200800 -0.304800 0.360000 -0.200000 -0.904000
+-0.196100 -0.200800 -0.304800 0.360000 -0.200000 -0.904000
+-0.150000 -0.200800 -0.284500 0.024000 -0.216000 -0.968000
+-0.150000 -0.159100 -0.304800 0.152000 -0.400000 -0.896000
+-0.108400 -0.200800 -0.304800 -0.496000 -0.048000 -0.856000
+-0.108400 -0.200800 -0.304800 -0.496000 -0.048000 -0.856000
+-0.172800 -0.552300 -0.243900 0.592000 -0.568000 0.560000
+-0.172800 -0.552300 -0.243900 0.592000 -0.568000 0.560000
+-0.150000 -0.530700 -0.243900 0.632000 -0.664000 0.392000
+-0.150000 -0.552300 -0.270100 0.544000 -0.504000 0.656000
+-0.150000 -0.552300 -0.270100 0.544000 -0.504000 0.656000
+-0.126800 0.150600 -0.243900 -0.208000 0.496000 -0.832000
+-0.126800 0.150600 -0.243900 -0.208000 0.496000 -0.832000
+-0.100000 0.150600 -0.251000 -0.024000 0.408000 -0.904000
+-0.100000 0.164100 -0.243900 -0.032000 0.432000 -0.896000
+-0.077600 0.150600 -0.243900 0.320000 0.328000 -0.880000
+-0.077600 0.150600 -0.243900 0.320000 0.328000 -0.880000
+-0.150000 0.100400 -0.267100 -0.312000 0.440000 -0.832000
+-0.150000 0.100400 -0.267100 -0.312000 0.440000 -0.832000
+-0.100000 0.100400 -0.276400 0.032000 0.376000 -0.920000
+-0.150000 0.050200 -0.299600 -0.080000 0.408000 -0.904000
+-0.100000 0.050200 -0.292200 0.304000 0.312000 -0.896000
+-0.150000 0.040500 -0.304800 -0.136000 0.416000 -0.896000
+-0.100000 0.022400 -0.304800 0.184000 0.304000 -0.928000
+-0.150000 0.000000 -0.322200 0.064000 0.240000 -0.968000
+-0.100000 0.000000 -0.309600 0.168000 0.152000 -0.968000
+-0.150000 -0.050200 -0.328000 0.128000 0.064000 -0.984000
+-0.100000 -0.050200 -0.318600 0.080000 0.144000 -0.984000
+-0.150000 -0.100400 -0.338700 0.056000 -0.088000 -0.992000
+-0.100000 -0.100400 -0.323700 -0.040000 -0.152000 -0.984000
+-0.150000 -0.150600 -0.309500 -0.032000 -0.400000 -0.912000
+-0.100000 -0.150600 -0.315000 -0.456000 -0.064000 -0.880000
+-0.100000 -0.150600 -0.315000 -0.456000 -0.064000 -0.880000
+-0.077600 0.000000 -0.304800 0.248000 0.344000 -0.896000
+-0.077600 0.000000 -0.304800 0.248000 0.344000 -0.896000
+-0.050000 -0.015100 -0.304800 0.280000 0.536000 -0.784000
+-0.050000 0.000000 -0.288000 0.256000 0.560000 -0.776000
+-0.050000 0.000000 -0.288000 0.256000 0.560000 -0.776000
+-0.013800 -0.351500 -0.243900 0.552000 -0.808000 -0.168000
+-0.013800 -0.351500 -0.243900 0.552000 -0.808000 -0.168000
+-0.050000 -0.380500 -0.243900 0.664000 -0.736000 -0.104000
+-0.026900 -0.351500 -0.304800 0.608000 -0.688000 -0.384000
+-0.050000 -0.374600 -0.304800 0.584000 -0.672000 -0.448000
+-0.050000 -0.351500 -0.336900 0.024000 -0.576000 -0.808000
+-0.050000 -0.351500 -0.336900 0.024000 -0.576000 -0.808000
+0.050000 -0.050200 -0.279200 0.280000 0.320000 -0.896000
+0.050000 -0.050200 -0.279200 0.280000 0.320000 -0.896000
+0.004800 -0.050200 -0.304800 0.368000 0.176000 -0.904000
+0.050000 -0.100400 -0.298100 0.360000 0.248000 -0.896000
+0.039400 -0.100400 -0.304800 0.408000 0.224000 -0.880000
+0.039400 -0.100400 -0.304800 0.408000 0.224000 -0.880000
+0.113100 0.000000 -0.243900 -0.392000 0.768000 -0.496000
+0.113100 0.000000 -0.243900 -0.392000 0.768000 -0.496000
+0.150000 0.000000 -0.257100 -0.208000 0.552000 -0.800000
+0.150000 0.015400 -0.243900 -0.208000 0.728000 -0.640000
+0.150000 0.015400 -0.243900 -0.208000 0.728000 -0.640000
+0.200000 -0.100400 -0.298900 0.088000 0.040000 -0.992000
+0.200000 -0.100400 -0.298900 0.088000 0.040000 -0.992000
+0.185500 -0.100400 -0.304800 0.296000 0.104000 -0.944000
+0.200000 -0.139100 -0.304800 0.208000 0.104000 -0.968000
+0.150000 -0.100400 -0.322200 0.000000 0.224000 -0.968000
+0.200000 -0.150600 -0.306400 0.192000 0.112000 -0.968000
+0.150000 -0.150600 -0.323600 -0.232000 0.464000 -0.848000
+0.200000 -0.200800 -0.335700 -0.120000 0.200000 -0.968000
+0.150000 -0.200800 -0.325200 0.160000 0.176000 -0.968000
+0.200000 -0.251000 -0.346500 -0.184000 0.088000 -0.976000
+0.150000 -0.251000 -0.336000 0.080000 -0.336000 -0.928000
+0.150000 -0.251000 -0.336000 0.080000 -0.336000 -0.928000
+0.211400 -0.050200 -0.304800 0.152000 0.184000 -0.968000
+0.211400 -0.050200 -0.304800 0.152000 0.184000 -0.968000
+0.200000 -0.061600 -0.304800 0.000000 -0.144000 -0.984000
+0.250000 -0.050200 -0.297000 0.000000 0.040000 -0.992000
+0.200000 -0.100400 -0.298900 0.088000 0.040000 -0.992000
+0.250000 -0.100400 -0.298400 -0.088000 0.216000 -0.968000
+0.200000 -0.139100 -0.304800 0.208000 0.104000 -0.968000
+0.250000 -0.114900 -0.304800 -0.104000 0.280000 -0.952000
+0.200000 -0.150600 -0.306400 0.192000 0.112000 -0.968000
+0.250000 -0.150600 -0.317700 0.024000 0.336000 -0.936000
+0.200000 -0.200800 -0.335700 -0.120000 0.200000 -0.968000
+0.250000 -0.200800 -0.343100 0.104000 0.232000 -0.960000
+0.200000 -0.251000 -0.346500 -0.184000 0.088000 -0.976000
+0.250000 -0.251000 -0.353900 0.064000 0.384000 -0.920000
+0.250000 -0.251000 -0.353900 0.064000 0.384000 -0.920000
+0.250000 -0.050200 -0.297000 0.000000 0.040000 -0.992000
+0.250000 -0.050200 -0.297000 0.000000 0.040000 -0.992000
+0.266500 -0.050200 -0.304800 -0.280000 0.064000 -0.952000
+0.250000 -0.100400 -0.298400 -0.088000 0.216000 -0.968000
+0.278900 -0.100400 -0.304800 -0.176000 0.256000 -0.944000
+0.250000 -0.114900 -0.304800 -0.104000 0.280000 -0.952000
+0.250000 -0.114900 -0.304800 -0.104000 0.280000 -0.952000
+0.350000 -0.127600 -0.304800 0.032000 -0.600000 -0.792000
+0.350000 -0.127600 -0.304800 0.032000 -0.600000 -0.792000
+0.313400 -0.150600 -0.304800 0.400000 -0.360000 -0.840000
+0.350000 -0.150600 -0.283600 -0.064000 -0.424000 -0.896000
+0.320800 -0.200800 -0.304800 0.496000 0.328000 -0.800000
+0.350000 -0.200800 -0.271400 0.216000 0.224000 -0.944000
+0.350000 -0.228300 -0.304800 0.616000 0.528000 -0.576000
+0.350000 -0.228300 -0.304800 0.616000 0.528000 -0.576000
+0.300000 -0.357600 -0.243900 -0.288000 -0.920000 0.248000
+0.300000 -0.357600 -0.243900 -0.288000 -0.920000 0.248000
+0.343800 -0.401700 -0.243900 -0.728000 -0.584000 0.344000
+0.300000 -0.355300 -0.304800 -0.272000 -0.752000 -0.592000
+0.344100 -0.401700 -0.304800 -0.784000 -0.512000 -0.336000
+0.344100 -0.401700 -0.304800 -0.784000 -0.512000 -0.336000
+0.350000 -0.127600 -0.304800 0.032000 -0.600000 -0.792000
+0.350000 -0.127600 -0.304800 0.032000 -0.600000 -0.792000
+0.350000 -0.150600 -0.283600 -0.064000 -0.424000 -0.896000
+0.380400 -0.150600 -0.304800 -0.424000 -0.456000 -0.776000
+0.380400 -0.150600 -0.304800 -0.424000 -0.456000 -0.776000
+0.419200 0.050200 -0.304800 -0.224000 0.736000 -0.632000
+0.419200 0.050200 -0.304800 -0.224000 0.736000 -0.632000
+0.400000 0.050200 -0.294000 -0.352000 0.672000 -0.640000
+0.400000 0.041200 -0.304800 -0.352000 0.672000 -0.648000
+0.400000 0.041200 -0.304800 -0.352000 0.672000 -0.648000
+0.400000 -0.168700 -0.304800 -0.504000 -0.464000 -0.720000
+0.400000 -0.168700 -0.304800 -0.504000 -0.464000 -0.720000
+0.400000 -0.200800 -0.276700 0.448000 -0.472000 -0.752000
+0.424400 -0.200800 -0.304800 -0.552000 -0.520000 -0.648000
+0.400000 -0.249400 -0.243900 0.760000 -0.472000 -0.424000
+0.450000 -0.217600 -0.304800 -0.352000 -0.736000 -0.560000
+0.450000 -0.248400 -0.243900 -0.224000 -0.888000 -0.384000
+0.450000 -0.248400 -0.243900 -0.224000 -0.888000 -0.384000
+0.550000 -0.150600 -0.287800 0.352000 0.528000 -0.768000
+0.550000 -0.150600 -0.287800 0.352000 0.528000 -0.768000
+0.523400 -0.150600 -0.304800 0.376000 0.592000 -0.704000
+0.550000 -0.162200 -0.304800 0.376000 0.720000 -0.576000
+0.500000 -0.150600 -0.319100 0.336000 0.504000 -0.792000
+0.550000 -0.194000 -0.365800 0.224000 0.896000 -0.368000
+0.500000 -0.200800 -0.334200 -0.376000 -0.448000 -0.800000
+0.535800 -0.200800 -0.365800 -0.736000 0.208000 -0.632000
+0.500000 -0.222600 -0.304800 -0.320000 -0.704000 -0.624000
+0.550000 -0.216200 -0.365800 -0.080000 -0.576000 -0.808000
+0.535300 -0.251000 -0.304800 -0.648000 -0.480000 -0.576000
+0.550000 -0.251000 -0.326800 -0.648000 -0.504000 -0.560000
+0.550000 -0.216200 -0.365800 -0.080000 -0.576000 -0.808000
+0.573000 -0.251000 -0.365800 -0.696000 0.544000 -0.464000
+0.559600 -0.200800 -0.365800 0.680000 0.504000 -0.520000
+0.600000 -0.231600 -0.365800 0.072000 0.640000 -0.760000
+0.594200 -0.200800 -0.304800 0.544000 0.576000 -0.600000
+0.600000 -0.206100 -0.304800 0.488000 0.616000 -0.608000
+0.600000 -0.200800 -0.298700 0.448000 0.592000 -0.656000
+0.650000 -0.208600 -0.304800 0.024000 0.680000 -0.728000
+0.650000 -0.200800 -0.297000 0.088000 0.616000 -0.776000
+0.600000 -0.200800 -0.298700 0.448000 0.592000 -0.656000
+0.650000 -0.150600 -0.274900 0.544000 0.464000 -0.688000
+0.600000 -0.150600 -0.265200 0.248000 0.032000 -0.960000
+0.600000 -0.200800 -0.298700 0.448000 0.592000 -0.656000
+0.550000 -0.150600 -0.287800 0.352000 0.528000 -0.768000
+0.594200 -0.200800 -0.304800 0.544000 0.576000 -0.600000
+0.550000 -0.162200 -0.304800 0.376000 0.720000 -0.576000
+0.559600 -0.200800 -0.365800 0.680000 0.504000 -0.520000
+0.550000 -0.194000 -0.365800 0.224000 0.896000 -0.368000
+0.550000 -0.200800 -0.388300 0.280000 0.584000 -0.752000
+0.535800 -0.200800 -0.365800 -0.736000 0.208000 -0.632000
+0.550000 -0.216200 -0.365800 -0.080000 -0.576000 -0.808000
+0.550000 -0.200800 -0.388300 0.280000 0.584000 -0.752000
+0.559600 -0.200800 -0.365800 0.680000 0.504000 -0.520000
+0.559600 -0.200800 -0.365800 0.680000 0.504000 -0.520000
+0.500000 -0.222600 -0.304800 -0.320000 -0.704000 -0.624000
+0.500000 -0.222600 -0.304800 -0.320000 -0.704000 -0.624000
+0.500000 -0.251000 -0.264200 -0.272000 -0.744000 -0.600000
+0.535300 -0.251000 -0.304800 -0.648000 -0.480000 -0.576000
+0.535300 -0.251000 -0.304800 -0.648000 -0.480000 -0.576000
+0.800000 -0.401700 -0.291400 0.440000 0.456000 -0.760000
+0.800000 -0.401700 -0.291400 0.440000 0.456000 -0.760000
+0.800000 -0.418300 -0.304800 0.408000 0.496000 -0.760000
+0.850000 -0.401700 -0.268600 0.504000 0.432000 -0.744000
+0.837100 -0.451900 -0.304800 0.528000 0.264000 -0.800000
+0.850000 -0.451900 -0.293100 0.448000 0.248000 -0.848000
+0.800000 -0.493800 -0.304800 0.032000 -0.688000 -0.720000
+0.850000 -0.490600 -0.304800 0.216000 0.112000 -0.968000
+0.800000 -0.502100 -0.293400 -0.120000 -0.840000 -0.520000
+0.832800 -0.502100 -0.304800 -0.104000 -0.544000 -0.824000
+0.832800 -0.502100 -0.304800 -0.104000 -0.544000 -0.824000
+0.858900 0.050200 -0.243900 -0.424000 0.568000 -0.696000
+0.858900 0.050200 -0.243900 -0.424000 0.568000 -0.696000
+0.900000 0.050200 -0.268900 0.208000 0.672000 -0.696000
+0.900000 0.070800 -0.243900 -0.096000 0.744000 -0.656000
+0.900000 0.070800 -0.243900 -0.096000 0.744000 -0.656000
+0.981700 -0.050200 -0.304800 0.528000 0.432000 -0.720000
+0.981700 -0.050200 -0.304800 0.528000 0.432000 -0.720000
+1.000000 -0.073100 -0.304800 0.536000 0.424000 -0.720000
+1.000000 -0.050200 -0.288900 0.520000 0.432000 -0.728000
+1.000000 -0.050200 -0.288900 0.520000 0.432000 -0.728000
+-0.900000 0.104600 -0.304800 0.304000 0.568000 -0.760000
+-0.900000 0.104600 -0.304800 0.304000 0.568000 -0.760000
+-0.900000 0.100400 -0.308600 0.312000 0.536000 -0.776000
+-0.892300 0.100400 -0.304800 0.320000 0.536000 -0.776000
+-0.892300 0.100400 -0.304800 0.320000 0.536000 -0.776000
+-0.850000 -0.301200 -0.321900 -0.728000 -0.616000 -0.280000
+-0.850000 -0.301200 -0.321900 -0.728000 -0.616000 -0.280000
+-0.850000 -0.251000 -0.359600 -0.320000 0.248000 -0.912000
+-0.826000 -0.301200 -0.365800 -0.648000 -0.448000 -0.600000
+-0.828000 -0.251000 -0.365800 -0.248000 0.216000 -0.936000
+-0.800000 -0.301200 -0.380800 -0.264000 0.104000 -0.952000
+-0.800000 -0.251000 -0.370300 -0.064000 0.200000 -0.976000
+-0.750000 -0.301200 -0.392900 -0.104000 0.352000 -0.928000
+-0.750000 -0.251000 -0.369800 0.056000 0.280000 -0.952000
+-0.750000 -0.251000 -0.369800 0.056000 0.280000 -0.952000
+-0.800000 -0.066700 -0.304800 0.296000 0.144000 -0.936000
+-0.800000 -0.066700 -0.304800 0.296000 0.144000 -0.936000
+-0.800000 -0.100400 -0.313000 0.368000 0.216000 -0.896000
+-0.785000 -0.100400 -0.304800 0.328000 0.224000 -0.912000
+-0.785000 -0.100400 -0.304800 0.328000 0.224000 -0.912000
+-0.750000 -0.129200 -0.304800 0.392000 0.376000 -0.832000
+-0.750000 -0.129200 -0.304800 0.392000 0.376000 -0.832000
+-0.750000 -0.150600 -0.317800 0.416000 0.384000 -0.816000
+-0.731900 -0.150600 -0.304800 0.424000 0.400000 -0.808000
+-0.731900 -0.150600 -0.304800 0.424000 0.400000 -0.808000
+-0.576800 -0.251000 -0.365800 -0.136000 0.624000 -0.760000
+-0.576800 -0.251000 -0.365800 -0.136000 0.624000 -0.760000
+-0.600000 -0.251000 -0.360600 -0.120000 0.624000 -0.760000
+-0.600000 -0.256300 -0.365800 -0.112000 0.608000 -0.776000
+-0.600000 -0.256300 -0.365800 -0.112000 0.608000 -0.776000
+-0.500000 -0.637800 -0.304800 -0.208000 -0.976000 -0.032000
+-0.500000 -0.637800 -0.304800 -0.208000 -0.976000 -0.032000
+-0.455200 -0.652700 -0.304800 -0.280000 -0.952000 0.040000
+-0.500000 -0.633000 -0.365800 -0.088000 -0.968000 -0.200000
+-0.450000 -0.652700 -0.319500 -0.256000 -0.952000 -0.136000
+-0.450000 -0.645700 -0.365800 -0.144000 -0.904000 -0.392000
+-0.405700 -0.652700 -0.365800 -0.144000 -0.920000 -0.344000
+-0.405700 -0.652700 -0.365800 -0.144000 -0.920000 -0.344000
+-0.350000 -0.585900 -0.365800 0.168000 -0.792000 -0.576000
+-0.350000 -0.585900 -0.365800 0.168000 -0.792000 -0.576000
+-0.350000 -0.594300 -0.304800 0.520000 -0.800000 0.280000
+-0.357100 -0.602500 -0.365800 0.904000 0.256000 -0.312000
+-0.351600 -0.602500 -0.304800 0.944000 0.304000 0.024000
+-0.350000 -0.629600 -0.365800 0.056000 0.640000 -0.760000
+-0.350000 -0.605300 -0.304800 0.248000 0.960000 -0.032000
+-0.328400 -0.602500 -0.365800 -0.832000 -0.248000 -0.488000
+-0.344900 -0.602500 -0.304800 -0.744000 0.664000 -0.032000
+-0.350000 -0.585900 -0.365800 0.168000 -0.792000 -0.576000
+-0.350000 -0.594300 -0.304800 0.520000 -0.800000 0.280000
+-0.350000 -0.594300 -0.304800 0.520000 -0.800000 0.280000
+-0.350000 -0.747900 -0.304800 -0.512000 -0.832000 -0.184000
+-0.350000 -0.747900 -0.304800 -0.512000 -0.832000 -0.184000
+-0.350000 -0.703000 -0.357000 -0.336000 -0.496000 -0.792000
+-0.371300 -0.703000 -0.304800 -0.816000 -0.552000 -0.144000
+-0.371300 -0.703000 -0.304800 -0.816000 -0.552000 -0.144000
+-0.331500 -0.150600 -0.304800 -0.256000 0.464000 -0.840000
+-0.331500 -0.150600 -0.304800 -0.256000 0.464000 -0.840000
+-0.300000 -0.150600 -0.319300 -0.256000 0.480000 -0.832000
+-0.300000 -0.118900 -0.304800 -0.376000 0.264000 -0.880000
+-0.300000 -0.118900 -0.304800 -0.376000 0.264000 -0.880000
+-0.250000 -0.639500 -0.365800 0.216000 -0.224000 -0.944000
+-0.250000 -0.639500 -0.365800 0.216000 -0.224000 -0.944000
+-0.282800 -0.652700 -0.365800 0.080000 -0.160000 -0.976000
+-0.250000 -0.652700 -0.361600 0.240000 -0.216000 -0.944000
+-0.250000 -0.652700 -0.361600 0.240000 -0.216000 -0.944000
+-0.250000 -0.150600 -0.327500 -0.120000 0.152000 -0.976000
+-0.250000 -0.150600 -0.327500 -0.120000 0.152000 -0.976000
+-0.200000 -0.150600 -0.333300 0.216000 -0.272000 -0.936000
+-0.250000 -0.200800 -0.333200 0.168000 0.080000 -0.976000
+-0.200000 -0.200800 -0.306700 0.368000 -0.184000 -0.904000
+-0.250000 -0.251000 -0.337900 0.384000 0.112000 -0.912000
+-0.200000 -0.251000 -0.307600 0.408000 0.096000 -0.904000
+-0.250000 -0.301200 -0.349000 0.296000 0.272000 -0.912000
+-0.200000 -0.301200 -0.313400 0.328000 0.152000 -0.928000
+-0.200000 -0.301200 -0.313400 0.328000 0.152000 -0.928000
+-0.200000 -0.602500 -0.345500 0.488000 -0.272000 -0.824000
+-0.200000 -0.602500 -0.345500 0.488000 -0.272000 -0.824000
+-0.200000 -0.558000 -0.365800 0.448000 -0.240000 -0.856000
+-0.229500 -0.602500 -0.365800 0.408000 -0.240000 -0.872000
+-0.200000 -0.552300 -0.367100 0.360000 -0.232000 -0.896000
+-0.250000 -0.602500 -0.376000 0.360000 -0.328000 -0.872000
+-0.250000 -0.552300 -0.402600 0.504000 -0.312000 -0.792000
+-0.250000 -0.552300 -0.402600 0.504000 -0.312000 -0.792000
+-0.150000 -0.602500 -0.307600 0.456000 -0.280000 -0.840000
+-0.150000 -0.602500 -0.307600 0.456000 -0.280000 -0.840000
+-0.150000 -0.552300 -0.337600 0.424000 -0.304000 -0.840000
+-0.200000 -0.602500 -0.345500 0.488000 -0.272000 -0.824000
+-0.196100 -0.552300 -0.365800 0.320000 -0.272000 -0.904000
+-0.200000 -0.558000 -0.365800 0.448000 -0.240000 -0.856000
+-0.200000 -0.552300 -0.367100 0.360000 -0.232000 -0.896000
+-0.200000 -0.552300 -0.367100 0.360000 -0.232000 -0.896000
+-0.147100 -0.502100 -0.365800 0.472000 -0.192000 -0.848000
+-0.147100 -0.502100 -0.365800 0.472000 -0.192000 -0.848000
+-0.145700 -0.451900 -0.365800 0.464000 0.040000 -0.880000
+-0.100000 -0.502100 -0.325200 0.520000 -0.368000 -0.760000
+-0.100000 -0.451900 -0.336100 0.496000 -0.048000 -0.856000
+-0.074100 -0.502100 -0.304800 0.864000 -0.480000 0.112000
+-0.061500 -0.451900 -0.304800 0.928000 -0.352000 0.088000
+-0.061500 -0.451900 -0.304800 0.928000 -0.352000 0.088000
+-0.100000 -0.200800 -0.311700 -0.496000 0.128000 -0.856000
+-0.100000 -0.200800 -0.311700 -0.496000 0.128000 -0.856000
+-0.050000 -0.200800 -0.320900 -0.056000 0.280000 -0.952000
+-0.100000 -0.251000 -0.333700 -0.512000 0.248000 -0.816000
+-0.050000 -0.251000 -0.364300 -0.216000 0.352000 -0.904000
+-0.100000 -0.301200 -0.349000 -0.368000 0.264000 -0.888000
+-0.050000 -0.266900 -0.365800 -0.288000 0.088000 -0.944000
+-0.058500 -0.301200 -0.365800 -0.384000 -0.288000 -0.872000
+-0.050000 -0.301200 -0.370400 -0.392000 -0.264000 -0.872000
+-0.050000 -0.309800 -0.365800 -0.336000 -0.416000 -0.840000
+-0.058500 -0.301200 -0.365800 -0.384000 -0.288000 -0.872000
+-0.050000 -0.351500 -0.336900 0.024000 -0.576000 -0.808000
+-0.100000 -0.301200 -0.349000 -0.368000 0.264000 -0.888000
+-0.100000 -0.351500 -0.338800 0.024000 -0.312000 -0.944000
+-0.100000 -0.351500 -0.338800 0.024000 -0.312000 -0.944000
+0.050000 -0.119800 -0.304800 0.416000 0.264000 -0.864000
+0.050000 -0.119800 -0.304800 0.416000 0.264000 -0.864000
+0.050000 -0.150600 -0.318000 0.352000 0.312000 -0.872000
+0.096000 -0.150600 -0.304800 0.176000 0.336000 -0.920000
+0.096000 -0.150600 -0.304800 0.176000 0.336000 -0.920000
+0.301400 0.000000 -0.304800 -0.584000 0.656000 -0.464000
+0.301400 0.000000 -0.304800 -0.584000 0.656000 -0.464000
+0.350000 0.000000 -0.339100 -0.264000 0.552000 -0.784000
+0.350000 0.024300 -0.304800 -0.456000 0.784000 -0.408000
+0.400000 0.000000 -0.343200 -0.216000 0.592000 -0.768000
+0.400000 0.041200 -0.304800 -0.352000 0.672000 -0.648000
+0.400000 0.041200 -0.304800 -0.352000 0.672000 -0.648000
+0.383500 -0.050200 -0.365800 0.200000 -0.288000 -0.928000
+0.383500 -0.050200 -0.365800 0.200000 -0.288000 -0.928000
+0.400000 -0.050200 -0.360800 0.184000 -0.432000 -0.872000
+0.350000 -0.037900 -0.365800 -0.440000 0.432000 -0.776000
+0.400000 0.000000 -0.343200 -0.216000 0.592000 -0.768000
+0.350000 0.000000 -0.339100 -0.264000 0.552000 -0.784000
+0.350000 0.000000 -0.339100 -0.264000 0.552000 -0.784000
+0.355700 -0.351500 -0.365800 0.360000 -0.072000 -0.928000
+0.355700 -0.351500 -0.365800 0.360000 -0.072000 -0.928000
+0.400000 -0.351500 -0.338800 0.360000 -0.568000 -0.728000
+0.350000 -0.334300 -0.365800 -0.304000 0.096000 -0.944000
+0.400000 -0.301200 -0.307300 0.704000 0.496000 -0.496000
+0.350000 -0.301200 -0.360500 0.376000 0.184000 -0.904000
+0.350000 -0.301200 -0.360500 0.376000 0.184000 -0.904000
+0.376800 -0.401700 -0.304800 0.336000 -0.848000 -0.392000
+0.376800 -0.401700 -0.304800 0.336000 -0.848000 -0.392000
+0.350000 -0.401700 -0.317400 -0.608000 -0.560000 -0.544000
+0.350000 -0.410700 -0.304800 -0.592000 -0.664000 -0.440000
+0.350000 -0.410700 -0.304800 -0.592000 -0.664000 -0.440000
+0.400000 -0.050200 -0.360800 0.184000 -0.432000 -0.872000
+0.400000 -0.050200 -0.360800 0.184000 -0.432000 -0.872000
+0.450000 -0.050200 -0.325200 -0.120000 -0.568000 -0.808000
+0.400000 -0.100400 -0.340000 -0.040000 -0.360000 -0.928000
+0.450000 -0.100400 -0.322200 0.392000 -0.360000 -0.840000
+0.400000 -0.150600 -0.318400 -0.432000 -0.416000 -0.792000
+0.450000 -0.150600 -0.321300 -0.008000 0.120000 -0.992000
+0.400000 -0.168700 -0.304800 -0.504000 -0.464000 -0.720000
+0.450000 -0.200800 -0.331300 -0.472000 -0.400000 -0.776000
+0.424400 -0.200800 -0.304800 -0.552000 -0.520000 -0.648000
+0.450000 -0.217600 -0.304800 -0.352000 -0.736000 -0.560000
+0.450000 -0.217600 -0.304800 -0.352000 -0.736000 -0.560000
+0.450000 0.055500 -0.304800 0.064000 0.864000 -0.496000
+0.450000 0.055500 -0.304800 0.064000 0.864000 -0.496000
+0.450000 0.050200 -0.314200 0.064000 0.744000 -0.656000
+0.496000 0.050200 -0.304800 0.104000 0.800000 -0.576000
+0.496000 0.050200 -0.304800 0.104000 0.800000 -0.576000
+0.500000 -0.333600 -0.304800 -0.408000 0.824000 -0.376000
+0.500000 -0.333600 -0.304800 -0.408000 0.824000 -0.376000
+0.458900 -0.351500 -0.304800 -0.472000 0.360000 -0.792000
+0.500000 -0.351500 -0.354900 -0.384000 -0.472000 -0.784000
+0.500000 -0.400200 -0.304800 -0.176000 -0.672000 -0.712000
+0.500000 -0.400200 -0.304800 -0.176000 -0.672000 -0.712000
+0.450000 -0.380500 -0.304800 -0.144000 0.256000 -0.952000
+0.450000 -0.380500 -0.304800 -0.144000 0.256000 -0.952000
+0.450000 -0.401700 -0.316200 -0.184000 -0.360000 -0.904000
+0.492100 -0.401700 -0.304800 0.152000 -0.576000 -0.792000
+0.492100 -0.401700 -0.304800 0.152000 -0.576000 -0.792000
+0.500000 -0.127100 -0.304800 0.480000 0.456000 -0.744000
+0.500000 -0.127100 -0.304800 0.480000 0.456000 -0.744000
+0.500000 -0.150600 -0.319100 0.336000 0.504000 -0.792000
+0.523400 -0.150600 -0.304800 0.376000 0.592000 -0.704000
+0.523400 -0.150600 -0.304800 0.376000 0.592000 -0.704000
+0.600000 -0.086300 -0.304800 0.440000 0.312000 -0.832000
+0.600000 -0.086300 -0.304800 0.440000 0.312000 -0.832000
+0.589400 -0.100400 -0.304800 -0.440000 -0.424000 -0.784000
+0.600000 -0.100400 -0.312700 0.376000 -0.472000 -0.792000
+0.600000 -0.105700 -0.304800 0.312000 -0.728000 -0.600000
+0.604900 -0.100400 -0.304800 0.744000 -0.360000 -0.552000
+0.600000 -0.100400 -0.312700 0.376000 -0.472000 -0.792000
+0.600000 -0.086300 -0.304800 0.440000 0.312000 -0.832000
+0.600000 -0.086300 -0.304800 0.440000 0.312000 -0.832000
+0.600000 -0.206100 -0.304800 0.488000 0.616000 -0.608000
+0.600000 -0.206100 -0.304800 0.488000 0.616000 -0.608000
+0.650000 -0.208600 -0.304800 0.024000 0.680000 -0.728000
+0.600000 -0.231600 -0.365800 0.072000 0.640000 -0.760000
+0.650000 -0.245700 -0.365800 0.168000 0.856000 -0.480000
+0.600000 -0.249700 -0.426800 -0.344000 0.872000 -0.328000
+0.650000 -0.251000 -0.378600 0.328000 0.752000 -0.560000
+0.604800 -0.251000 -0.426800 0.544000 0.248000 -0.792000
+0.650000 -0.267900 -0.365800 0.280000 -0.440000 -0.848000
+0.600000 -0.252700 -0.426800 -0.416000 -0.736000 -0.520000
+0.600000 -0.288400 -0.365800 -0.376000 -0.712000 -0.584000
+0.598300 -0.251000 -0.426800 -0.848000 0.144000 -0.496000
+0.573000 -0.251000 -0.365800 -0.696000 0.544000 -0.464000
+0.600000 -0.249700 -0.426800 -0.344000 0.872000 -0.328000
+0.600000 -0.231600 -0.365800 0.072000 0.640000 -0.760000
+0.600000 -0.231600 -0.365800 0.072000 0.640000 -0.760000
+0.700000 -0.211400 -0.304800 0.288000 0.624000 -0.720000
+0.700000 -0.211400 -0.304800 0.288000 0.624000 -0.720000
+0.700000 -0.251000 -0.357800 0.296000 0.496000 -0.808000
+0.728900 -0.251000 -0.304800 0.720000 0.440000 -0.528000
+0.700000 -0.301200 -0.354900 0.160000 -0.240000 -0.952000
+0.744500 -0.301200 -0.304800 0.640000 0.104000 -0.760000
+0.744500 -0.301200 -0.304800 0.640000 0.104000 -0.760000
+0.750000 -0.334300 -0.304800 0.512000 0.112000 -0.840000
+0.750000 -0.334300 -0.304800 0.512000 0.112000 -0.840000
+0.750000 -0.351500 -0.307800 0.512000 0.128000 -0.840000
+0.754800 -0.351500 -0.304800 0.424000 0.136000 -0.888000
+0.750000 -0.401700 -0.321600 0.336000 0.000000 -0.936000
+0.779200 -0.401700 -0.304800 0.400000 0.336000 -0.848000
+0.779200 -0.401700 -0.304800 0.400000 0.336000 -0.848000
+0.800000 -0.418300 -0.304800 0.408000 0.496000 -0.760000
+0.800000 -0.418300 -0.304800 0.408000 0.496000 -0.760000
+0.800000 -0.451900 -0.330300 0.328000 0.200000 -0.920000
+0.837100 -0.451900 -0.304800 0.528000 0.264000 -0.800000
+0.800000 -0.493800 -0.304800 0.032000 -0.688000 -0.720000
+0.800000 -0.493800 -0.304800 0.032000 -0.688000 -0.720000
+0.856800 -0.502100 -0.304800 0.288000 0.144000 -0.944000
+0.856800 -0.502100 -0.304800 0.288000 0.144000 -0.944000
+0.850000 -0.502100 -0.307100 0.032000 -0.240000 -0.968000
+0.850000 -0.504700 -0.304800 -0.096000 -0.664000 -0.736000
+0.850000 -0.504700 -0.304800 -0.096000 -0.664000 -0.736000
+0.900000 0.016700 -0.304800 -0.152000 0.720000 -0.664000
+0.900000 0.016700 -0.304800 -0.152000 0.720000 -0.664000
+0.900000 0.000000 -0.329500 -0.080000 0.648000 -0.744000
+0.927400 0.000000 -0.304800 0.400000 0.560000 -0.720000
+0.927400 0.000000 -0.304800 0.400000 0.560000 -0.720000
+-0.850000 -0.496800 -0.365800 -0.176000 0.616000 -0.760000
+-0.850000 -0.496800 -0.365800 -0.176000 0.616000 -0.760000
+-0.864000 -0.502100 -0.365800 -0.304000 0.480000 -0.816000
+-0.850000 -0.502100 -0.370900 -0.184000 0.560000 -0.800000
+-0.860100 -0.552300 -0.365800 -0.680000 -0.432000 -0.584000
+-0.850000 -0.552300 -0.378600 -0.568000 -0.344000 -0.736000
+-0.850000 -0.564700 -0.365800 -0.608000 -0.528000 -0.584000
+-0.800000 -0.552300 -0.401000 -0.552000 -0.288000 -0.776000
+-0.806700 -0.602500 -0.365800 -0.520000 -0.656000 -0.536000
+-0.800000 -0.602500 -0.372400 -0.488000 -0.592000 -0.624000
+-0.800000 -0.607700 -0.365800 -0.488000 -0.640000 -0.584000
+-0.750000 -0.602500 -0.401000 -0.336000 -0.696000 -0.624000
+-0.750000 -0.628000 -0.365800 -0.232000 -0.808000 -0.528000
+-0.714100 -0.602500 -0.426800 -0.368000 -0.680000 -0.624000
+-0.700000 -0.639000 -0.365800 -0.040000 -0.920000 -0.376000
+-0.700000 -0.609100 -0.426800 -0.336000 -0.744000 -0.568000
+-0.650000 -0.641900 -0.365800 -0.024000 -0.952000 -0.280000
+-0.650000 -0.621300 -0.426800 -0.080000 -0.904000 -0.400000
+-0.650000 -0.621300 -0.426800 -0.080000 -0.904000 -0.400000
+-0.850000 -0.496800 -0.365800 -0.176000 0.616000 -0.760000
+-0.850000 -0.496800 -0.365800 -0.176000 0.616000 -0.760000
+-0.800000 -0.496400 -0.365800 -0.664000 0.416000 -0.608000
+-0.850000 -0.502100 -0.370900 -0.184000 0.560000 -0.800000
+-0.800000 -0.502100 -0.369300 -0.768000 0.256000 -0.576000
+-0.850000 -0.552300 -0.378600 -0.568000 -0.344000 -0.736000
+-0.800000 -0.552300 -0.401000 -0.552000 -0.288000 -0.776000
+-0.800000 -0.502100 -0.369300 -0.768000 0.256000 -0.576000
+-0.750000 -0.552300 -0.422100 -0.552000 -0.096000 -0.824000
+-0.750000 -0.502100 -0.424900 -0.848000 -0.112000 -0.512000
+-0.744500 -0.552300 -0.426800 -0.560000 -0.080000 -0.816000
+-0.748800 -0.502100 -0.426800 -0.584000 -0.048000 -0.800000
+-0.750000 -0.502100 -0.424900 -0.848000 -0.112000 -0.512000
+-0.750000 -0.498100 -0.426800 -0.864000 -0.184000 -0.448000
+-0.800000 -0.502100 -0.369300 -0.768000 0.256000 -0.576000
+-0.764100 -0.451900 -0.426800 -0.880000 -0.256000 -0.384000
+-0.800000 -0.496400 -0.365800 -0.664000 0.416000 -0.608000
+-0.786000 -0.451900 -0.365800 -0.872000 0.080000 -0.472000
+-0.764100 -0.451900 -0.426800 -0.880000 -0.256000 -0.384000
+-0.796500 -0.401700 -0.365800 -0.952000 -0.168000 -0.232000
+-0.777800 -0.401700 -0.426800 -0.928000 0.040000 -0.360000
+-0.777800 -0.401700 -0.426800 -0.928000 0.040000 -0.360000
+-0.800000 -0.602500 -0.372400 -0.488000 -0.592000 -0.624000
+-0.800000 -0.602500 -0.372400 -0.488000 -0.592000 -0.624000
+-0.800000 -0.552300 -0.401000 -0.552000 -0.288000 -0.776000
+-0.750000 -0.602500 -0.401000 -0.336000 -0.696000 -0.624000
+-0.750000 -0.552300 -0.422100 -0.552000 -0.096000 -0.824000
+-0.714100 -0.602500 -0.426800 -0.368000 -0.680000 -0.624000
+-0.744500 -0.552300 -0.426800 -0.560000 -0.080000 -0.816000
+-0.744500 -0.552300 -0.426800 -0.560000 -0.080000 -0.816000
+-0.350000 -0.248400 -0.365800 0.184000 0.424000 -0.880000
+-0.350000 -0.248400 -0.365800 0.184000 0.424000 -0.880000
+-0.350000 -0.251000 -0.367200 0.240000 0.168000 -0.952000
+-0.345700 -0.251000 -0.365800 0.320000 0.336000 -0.880000
+-0.345700 -0.251000 -0.365800 0.320000 0.336000 -0.880000
+-0.250000 -0.342900 -0.365800 0.504000 0.512000 -0.680000
+-0.250000 -0.342900 -0.365800 0.504000 0.512000 -0.680000
+-0.250000 -0.351500 -0.379700 0.552000 0.712000 -0.416000
+-0.241400 -0.351500 -0.365800 0.488000 0.640000 -0.576000
+-0.241400 -0.351500 -0.365800 0.488000 0.640000 -0.576000
+-0.200000 -0.365300 -0.365800 0.504000 0.768000 -0.376000
+-0.200000 -0.365300 -0.365800 0.504000 0.768000 -0.376000
+-0.200000 -0.393200 -0.426800 0.696000 0.632000 -0.328000
+-0.151700 -0.401700 -0.365800 0.568000 0.104000 -0.808000
+-0.194300 -0.401700 -0.426800 0.792000 0.416000 -0.432000
+-0.194300 -0.401700 -0.426800 0.792000 0.416000 -0.432000
+-0.044700 -0.251000 -0.365800 -0.216000 0.376000 -0.896000
+-0.044700 -0.251000 -0.365800 -0.216000 0.376000 -0.896000
+0.000000 -0.251000 -0.386300 -0.352000 0.496000 -0.792000
+0.000000 -0.238800 -0.365800 -0.192000 0.648000 -0.728000
+0.000000 -0.238800 -0.365800 -0.192000 0.648000 -0.728000
+0.100000 -0.224900 -0.365800 0.352000 0.456000 -0.808000
+0.100000 -0.224900 -0.365800 0.352000 0.456000 -0.808000
+0.100000 -0.251000 -0.380100 0.472000 -0.384000 -0.784000
+0.118000 -0.251000 -0.365800 0.536000 -0.224000 -0.808000
+0.100000 -0.263400 -0.365800 0.480000 -0.672000 -0.544000
+0.100000 -0.263400 -0.365800 0.480000 -0.672000 -0.544000
+0.350000 -0.354600 -0.365800 -0.264000 -0.632000 -0.720000
+0.350000 -0.354600 -0.365800 -0.264000 -0.632000 -0.720000
+0.350000 -0.351500 -0.368100 -0.440000 0.096000 -0.888000
+0.348000 -0.351500 -0.365800 -0.720000 -0.032000 -0.680000
+0.348000 -0.351500 -0.365800 -0.720000 -0.032000 -0.680000
+0.450000 0.007700 -0.365800 -0.264000 0.744000 -0.600000
+0.450000 0.007700 -0.365800 -0.264000 0.744000 -0.600000
+0.431500 0.000000 -0.365800 -0.424000 0.312000 -0.840000
+0.450000 0.000000 -0.377000 -0.360000 0.400000 -0.840000
+0.450000 -0.014200 -0.365800 -0.336000 -0.568000 -0.744000
+0.450000 -0.014200 -0.365800 -0.336000 -0.568000 -0.744000
+0.650000 -0.245700 -0.365800 0.168000 0.856000 -0.480000
+0.650000 -0.245700 -0.365800 0.168000 0.856000 -0.480000
+0.650000 -0.251000 -0.378600 0.328000 0.752000 -0.560000
+0.678000 -0.251000 -0.365800 0.264000 0.520000 -0.808000
+0.650000 -0.267900 -0.365800 0.280000 -0.440000 -0.848000
diff --git a/progs/demos/lodbias.c b/progs/demos/lodbias.c
new file mode 100644
index 00000000000..a4db22e26e4
--- /dev/null
+++ b/progs/demos/lodbias.c
@@ -0,0 +1,282 @@
+/*
+ * GL_EXT_texture_lod_bias demo
+ *
+ * Thanks to Michael Vance for implementing this extension in Mesa.
+ *
+ * Brian Paul
+ * 20 March 2000
+ *
+ * Copyright (C) 2000 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.
+ */
+
+
+#include <assert.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+#include <GL/glut.h>
+#include <GL/glext.h>
+
+#include "readtex.h"
+
+#define TEXTURE_FILE "../images/girl.rgb"
+
+static GLfloat Xrot = 0, Yrot = -30, Zrot = 0;
+static GLboolean Anim = GL_TRUE;
+static GLint Bias = 0, BiasStepSign = +1; /* ints avoid fp precision problem */
+static GLint BiasMin = -400, BiasMax = 400;
+
+
+
+static void
+PrintString(const char *s)
+{
+ while (*s) {
+ glutBitmapCharacter(GLUT_BITMAP_8_BY_13, (int) *s);
+ s++;
+ }
+}
+
+static void Idle( void )
+{
+ static int lastTime = 0;
+ int time = glutGet(GLUT_ELAPSED_TIME);
+ int step;
+
+ if (lastTime == 0)
+ lastTime = time;
+ else if (time - lastTime < 10)
+ return;
+
+ step = (time - lastTime) / 10 * BiasStepSign;
+ lastTime = time;
+
+ Bias += step;
+ if (Bias < BiasMin) {
+ Bias = BiasMin;
+ BiasStepSign = +1;
+ }
+ else if (Bias > BiasMax) {
+ Bias = BiasMax;
+ BiasStepSign = -1;
+ }
+
+ glutPostRedisplay();
+}
+
+
+static void Display( void )
+{
+ char str[100];
+
+ glClear( GL_COLOR_BUFFER_BIT );
+
+ glMatrixMode( GL_PROJECTION );
+ glLoadIdentity();
+ glOrtho(-1, 1, -1, 1, -1, 1);
+ glMatrixMode( GL_MODELVIEW );
+ glLoadIdentity();
+
+ glDisable(GL_TEXTURE_2D);
+ glColor3f(1,1,1);
+ glRasterPos3f(-0.9, -0.9, 0.0);
+ sprintf(str, "Texture LOD Bias = %4.1f", Bias * 0.01);
+ PrintString(str);
+
+ glMatrixMode( GL_PROJECTION );
+ glLoadIdentity();
+ glFrustum( -1.0, 1.0, -1.0, 1.0, 5.0, 25.0 );
+ glMatrixMode( GL_MODELVIEW );
+ glLoadIdentity();
+ glTranslatef( 0.0, 0.0, -8.0 );
+
+ glPushMatrix();
+ glRotatef(Xrot, 1, 0, 0);
+ glRotatef(Yrot, 0, 1, 0);
+ glRotatef(Zrot, 0, 0, 1);
+
+ glEnable(GL_TEXTURE_2D);
+ glTexEnvf(GL_TEXTURE_FILTER_CONTROL_EXT, GL_TEXTURE_LOD_BIAS_EXT, 0.01 * Bias);
+
+ glBegin(GL_POLYGON);
+ glTexCoord2f(0, 0); glVertex2f(-1, -1);
+ glTexCoord2f(2, 0); glVertex2f( 1, -1);
+ glTexCoord2f(2, 2); glVertex2f( 1, 1);
+ glTexCoord2f(0, 2); glVertex2f(-1, 1);
+ glEnd();
+
+ glPopMatrix();
+
+ glutSwapBuffers();
+}
+
+
+static void Reshape( int width, int height )
+{
+ glViewport( 0, 0, width, height );
+}
+
+
+static void Key( unsigned char key, int x, int y )
+{
+ const GLfloat step = 3.0;
+ (void) x;
+ (void) y;
+ switch (key) {
+ case 'a':
+ Anim = !Anim;
+ if (Anim)
+ glutIdleFunc(Idle);
+ else
+ glutIdleFunc(NULL);
+ break;
+ case 'z':
+ Zrot -= step;
+ break;
+ case 'Z':
+ Zrot += step;
+ break;
+ case 'b':
+ Bias -= 10;
+ break;
+ case 'B':
+ Bias += 10;
+ break;
+ case 27:
+ exit(0);
+ break;
+ }
+ glutPostRedisplay();
+}
+
+
+static void SpecialKey( int key, int x, int y )
+{
+ const GLfloat step = 3.0;
+ (void) x;
+ (void) y;
+ switch (key) {
+ case GLUT_KEY_UP:
+ Xrot -= step;
+ break;
+ case GLUT_KEY_DOWN:
+ Xrot += step;
+ break;
+ case GLUT_KEY_LEFT:
+ Yrot -= step;
+ break;
+ case GLUT_KEY_RIGHT:
+ Yrot += step;
+ break;
+ }
+ glutPostRedisplay();
+}
+
+
+static void Init( void )
+{
+ GLfloat maxBias;
+
+ if (!glutExtensionSupported("GL_EXT_texture_lod_bias")) {
+ printf("Sorry, GL_EXT_texture_lod_bias not supported by this renderer.\n");
+ exit(1);
+ }
+
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+
+ if (glutExtensionSupported("GL_SGIS_generate_mipmap")) {
+ /* test auto mipmap generation */
+ GLint width, height, i;
+ GLenum format;
+ GLubyte *image = LoadRGBImage(TEXTURE_FILE, &width, &height, &format);
+ if (!image) {
+ printf("Error: could not load texture image %s\n", TEXTURE_FILE);
+ exit(1);
+ }
+ /* resize to 256 x 256 */
+ if (width != 256 || height != 256) {
+ GLubyte *newImage = malloc(256 * 256 * 4);
+ gluScaleImage(format, width, height, GL_UNSIGNED_BYTE, image,
+ 256, 256, GL_UNSIGNED_BYTE, newImage);
+ free(image);
+ image = newImage;
+ }
+ printf("Using GL_SGIS_generate_mipmap\n");
+ glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP_SGIS, GL_TRUE);
+ glTexImage2D(GL_TEXTURE_2D, 0, format, 256, 256, 0,
+ format, GL_UNSIGNED_BYTE, image);
+ free(image);
+
+ /* make sure mipmap was really generated correctly */
+ width = height = 256;
+ for (i = 0; i < 9; i++) {
+ GLint w, h;
+ glGetTexLevelParameteriv(GL_TEXTURE_2D, i, GL_TEXTURE_WIDTH, &w);
+ glGetTexLevelParameteriv(GL_TEXTURE_2D, i, GL_TEXTURE_HEIGHT, &h);
+ printf("Level %d size: %d x %d\n", i, w, h);
+ assert(w == width);
+ assert(h == height);
+ width /= 2;
+ height /= 2;
+ }
+
+ }
+ else if (!LoadRGBMipmaps(TEXTURE_FILE, GL_RGB)) {
+ printf("Error: could not load texture image %s\n", TEXTURE_FILE);
+ exit(1);
+ }
+
+ /* mipmapping required for this extension */
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+
+ glGetFloatv(GL_MAX_TEXTURE_LOD_BIAS_EXT, &maxBias);
+ printf("LOD bias range: [%g, %g]\n", -maxBias, maxBias);
+ BiasMin = -100 * maxBias;
+ BiasMax = 100 * maxBias;
+
+ /* Since we have (about) 8 mipmap levels, no need to bias beyond
+ * the range [-1, +8].
+ */
+ if (BiasMin < -100)
+ BiasMin = -100;
+ if (BiasMax > 800)
+ BiasMax = 800;
+}
+
+
+int main( int argc, char *argv[] )
+{
+ glutInit( &argc, argv );
+ glutInitWindowPosition( 0, 0 );
+ glutInitWindowSize( 350, 350 );
+ glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE );
+ glutCreateWindow(argv[0]);
+ glutReshapeFunc( Reshape );
+ glutKeyboardFunc( Key );
+ glutSpecialFunc( SpecialKey );
+ glutDisplayFunc( Display );
+ if (Anim)
+ glutIdleFunc(Idle);
+ Init();
+ glutMainLoop();
+ return 0;
+}
diff --git a/progs/demos/morph3d.c b/progs/demos/morph3d.c
new file mode 100644
index 00000000000..162a6ff847e
--- /dev/null
+++ b/progs/demos/morph3d.c
@@ -0,0 +1,896 @@
+
+/*-
+ * morph3d.c - Shows 3D morphing objects
+ *
+ * Converted to GLUT by brianp on 1/1/98
+ *
+ * This program was inspired on a WindowsNT(R)'s screen saver. It was written
+ * from scratch and it was not based on any other source code.
+ *
+ * Porting it to xlock (the final objective of this code since the moment I
+ * decided to create it) was possible by comparing the original Mesa's gear
+ * demo with it's ported version, so thanks for Danny Sung for his indirect
+ * help (look at gear.c in xlock source tree). NOTE: At the moment this code
+ * was sent to Brian Paul for package inclusion, the XLock Version was not
+ * available. In fact, I'll wait it to appear on the next Mesa release (If you
+ * are reading this, it means THIS release) to send it for xlock package
+ * inclusion). It will probably there be a GLUT version too.
+ *
+ * Thanks goes also to Brian Paul for making it possible and inexpensive
+ * to use OpenGL at home.
+ *
+ * Since I'm not a native english speaker, my apologies for any gramatical
+ * mistake.
+ *
+ * My e-mail addresses are
+ *
+ * and
+ *
+ * Marcelo F. Vianna (Feb-13-1997)
+ */
+
+/*
+This document is VERY incomplete, but tries to describe the mathematics used
+in the program. At this moment it just describes how the polyhedra are
+generated. On futhurer versions, this document will be probabbly improved.
+
+Since I'm not a native english speaker, my apologies for any gramatical
+mistake.
+
+Marcelo Fernandes Vianna
+- Undergraduate in Computer Engeneering at Catholic Pontifical University
+- of Rio de Janeiro (PUC-Rio) Brasil.
+- Feb-13-1997
+
+POLYHEDRA GENERATION
+
+For the purpose of this program it's not sufficient to know the polyhedra
+vertexes coordinates. Since the morphing algorithm applies a nonlinear
+transformation over the surfaces (faces) of the polyhedron, each face has
+to be divided into smaller ones. The morphing algorithm needs to transform
+each vertex of these smaller faces individually. It's a very time consoming
+task.
+
+In order to reduce calculation overload, and since all the macro faces of
+the polyhedron are transformed by the same way, the generation is made by
+creating only one face of the polyhedron, morphing it and then rotating it
+around the polyhedron center.
+
+What we need to know is the face radius of the polyhedron (the radius of
+the inscribed sphere) and the angle between the center of two adjacent
+faces using the center of the sphere as the angle's vertex.
+
+The face radius of the regular polyhedra are known values which I decided
+to not waste my time calculating. Following is a table of face radius for
+the regular polyhedra with edge length = 1:
+
+ TETRAHEDRON : 1/(2*sqrt(2))/sqrt(3)
+ CUBE : 1/2
+ OCTAHEDRON : 1/sqrt(6)
+ DODECAHEDRON : T^2 * sqrt((T+2)/5) / 2 -> where T=(sqrt(5)+1)/2
+ ICOSAHEDRON : (3*sqrt(3)+sqrt(15))/12
+
+I've not found any reference about the mentioned angles, so I needed to
+calculate them, not a trivial task until I figured out how :)
+Curiously these angles are the same for the tetrahedron and octahedron.
+A way to obtain this value is inscribing the tetrahedron inside the cube
+by matching their vertexes. So you'll notice that the remaining unmatched
+vertexes are in the same straight line starting in the cube/tetrahedron
+center and crossing the center of each tetrahedron's face. At this point
+it's easy to obtain the bigger angle of the isosceles triangle formed by
+the center of the cube and two opposite vertexes on the same cube face.
+The edges of this triangle have the following lenghts: sqrt(2) for the base
+and sqrt(3)/2 for the other two other edges. So the angle we want is:
+ +-----------------------------------------------------------+
+ | 2*ARCSIN(sqrt(2)/sqrt(3)) = 109.47122063449069174 degrees |
+ +-----------------------------------------------------------+
+For the cube this angle is obvious, but just for formality it can be
+easily obtained because we also know it's isosceles edge lenghts:
+sqrt(2)/2 for the base and 1/2 for the other two edges. So the angle we
+want is:
+ +-----------------------------------------------------------+
+ | 2*ARCSIN((sqrt(2)/2)/1) = 90.000000000000000000 degrees |
+ +-----------------------------------------------------------+
+For the octahedron we use the same idea used for the tetrahedron, but now
+we inscribe the cube inside the octahedron so that all cubes's vertexes
+matches excatly the center of each octahedron's face. It's now clear that
+this angle is the same of the thetrahedron one:
+ +-----------------------------------------------------------+
+ | 2*ARCSIN(sqrt(2)/sqrt(3)) = 109.47122063449069174 degrees |
+ +-----------------------------------------------------------+
+For the dodecahedron it's a little bit harder because it's only relationship
+with the cube is useless to us. So we need to solve the problem by another
+way. The concept of Face radius also exists on 2D polygons with the name
+Edge radius:
+ Edge Radius For Pentagon (ERp)
+ ERp = (1/2)/TAN(36 degrees) * VRp = 0.6881909602355867905
+ (VRp is the pentagon's vertex radio).
+ Face Radius For Dodecahedron
+ FRd = T^2 * sqrt((T+2)/5) / 2 = 1.1135163644116068404
+Why we need ERp? Well, ERp and FRd segments forms a 90 degrees angle,
+completing this triangle, the lesser angle is a half of the angle we are
+looking for, so this angle is:
+ +-----------------------------------------------------------+
+ | 2*ARCTAN(ERp/FRd) = 63.434948822922009981 degrees |
+ +-----------------------------------------------------------+
+For the icosahedron we can use the same method used for dodecahedron (well
+the method used for dodecahedron may be used for all regular polyhedra)
+ Edge Radius For Triangle (this one is well known: 1/3 of the triangle height)
+ ERt = sin(60)/3 = sqrt(3)/6 = 0.2886751345948128655
+ Face Radius For Icosahedron
+ FRi= (3*sqrt(3)+sqrt(15))/12 = 0.7557613140761707538
+So the angle is:
+ +-----------------------------------------------------------+
+ | 2*ARCTAN(ERt/FRi) = 41.810314895778596167 degrees |
+ +-----------------------------------------------------------+
+
+*/
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#ifndef _WIN32
+#include <unistd.h>
+#endif
+#include <GL/glut.h>
+#include <math.h>
+#include <string.h>
+
+#define Scale 0.3
+
+#define VectMul(X1,Y1,Z1,X2,Y2,Z2) (Y1)*(Z2)-(Z1)*(Y2),(Z1)*(X2)-(X1)*(Z2),(X1)*(Y2)-(Y1)*(X2)
+#define sqr(A) ((A)*(A))
+
+/* Increasing this values produces better image quality, the price is speed. */
+/* Very low values produces erroneous/incorrect plotting */
+#define tetradivisions 23
+#define cubedivisions 20
+#define octadivisions 21
+#define dodecadivisions 10
+#define icodivisions 15
+
+#define tetraangle 109.47122063449069174
+#define cubeangle 90.000000000000000000
+#define octaangle 109.47122063449069174
+#define dodecaangle 63.434948822922009981
+#define icoangle 41.810314895778596167
+
+#ifndef Pi
+#define Pi 3.1415926535897932385
+#endif
+#define SQRT2 1.4142135623730951455
+#define SQRT3 1.7320508075688771932
+#define SQRT5 2.2360679774997898051
+#define SQRT6 2.4494897427831778813
+#define SQRT15 3.8729833462074170214
+#define cossec36_2 0.8506508083520399322
+#define cos72 0.3090169943749474241
+#define sin72 0.9510565162951535721
+#define cos36 0.8090169943749474241
+#define sin36 0.5877852522924731292
+
+/*************************************************************************/
+
+static int mono=0;
+static int smooth=1;
+static int anim=1;
+static GLint WindH, WindW;
+static GLfloat step=0;
+static GLfloat seno;
+static int object;
+static int edgedivisions;
+static void (*draw_object)( void );
+static float Magnitude;
+static float *MaterialColor[20];
+
+static float front_shininess[] = {60.0};
+static float front_specular[] = { 0.7, 0.7, 0.7, 1.0 };
+static float ambient[] = { 0.0, 0.0, 0.0, 1.0 };
+static float diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
+static float position0[] = { 1.0, 1.0, 1.0, 0.0 };
+static float position1[] = {-1.0,-1.0, 1.0, 0.0 };
+static float lmodel_ambient[] = { 0.5, 0.5, 0.5, 1.0 };
+static float lmodel_twoside[] = {GL_TRUE};
+
+static float MaterialRed[] = { 0.7, 0.0, 0.0, 1.0 };
+static float MaterialGreen[] = { 0.1, 0.5, 0.2, 1.0 };
+static float MaterialBlue[] = { 0.0, 0.0, 0.7, 1.0 };
+static float MaterialCyan[] = { 0.2, 0.5, 0.7, 1.0 };
+static float MaterialYellow[] = { 0.7, 0.7, 0.0, 1.0 };
+static float MaterialMagenta[] = { 0.6, 0.2, 0.5, 1.0 };
+static float MaterialWhite[] = { 0.7, 0.7, 0.7, 1.0 };
+static float MaterialGray[] = { 0.2, 0.2, 0.2, 1.0 };
+
+#define TRIANGLE(Edge, Amp, Divisions, Z) \
+{ \
+ GLfloat Xf,Yf,Xa,Yb,Xf2,Yf2; \
+ GLfloat Factor,Factor1,Factor2; \
+ GLfloat VertX,VertY,VertZ,NeiAX,NeiAY,NeiAZ,NeiBX,NeiBY,NeiBZ; \
+ GLfloat Ax,Ay,Bx; \
+ int Ri,Ti; \
+ GLfloat Vr=(Edge)*SQRT3/3; \
+ GLfloat AmpVr2=(Amp)/sqr(Vr); \
+ GLfloat Zf=(Edge)*(Z); \
+ \
+ Ax=(Edge)*(+0.5/(Divisions)), Ay=(Edge)*(-SQRT3/(2*Divisions)); \
+ Bx=(Edge)*(-0.5/(Divisions)); \
+ \
+ for (Ri=1; Ri<=(Divisions); Ri++) { \
+ glBegin(GL_TRIANGLE_STRIP); \
+ for (Ti=0; Ti<Ri; Ti++) { \
+ Xf=(float)(Ri-Ti)*Ax + (float)Ti*Bx; \
+ Yf=Vr+(float)(Ri-Ti)*Ay + (float)Ti*Ay; \
+ Xa=Xf+0.001; Yb=Yf+0.001; \
+ Factor=1-(((Xf2=sqr(Xf))+(Yf2=sqr(Yf)))*AmpVr2); \
+ Factor1=1-((sqr(Xa)+Yf2)*AmpVr2); \
+ Factor2=1-((Xf2+sqr(Yb))*AmpVr2); \
+ VertX=Factor*Xf; VertY=Factor*Yf; VertZ=Factor*Zf; \
+ NeiAX=Factor1*Xa-VertX; NeiAY=Factor1*Yf-VertY; NeiAZ=Factor1*Zf-VertZ; \
+ NeiBX=Factor2*Xf-VertX; NeiBY=Factor2*Yb-VertY; NeiBZ=Factor2*Zf-VertZ; \
+ glNormal3f(VectMul(NeiAX, NeiAY, NeiAZ, NeiBX, NeiBY, NeiBZ)); \
+ glVertex3f(VertX, VertY, VertZ); \
+ \
+ Xf=(float)(Ri-Ti-1)*Ax + (float)Ti*Bx; \
+ Yf=Vr+(float)(Ri-Ti-1)*Ay + (float)Ti*Ay; \
+ Xa=Xf+0.001; Yb=Yf+0.001; \
+ Factor=1-(((Xf2=sqr(Xf))+(Yf2=sqr(Yf)))*AmpVr2); \
+ Factor1=1-((sqr(Xa)+Yf2)*AmpVr2); \
+ Factor2=1-((Xf2+sqr(Yb))*AmpVr2); \
+ VertX=Factor*Xf; VertY=Factor*Yf; VertZ=Factor*Zf; \
+ NeiAX=Factor1*Xa-VertX; NeiAY=Factor1*Yf-VertY; NeiAZ=Factor1*Zf-VertZ; \
+ NeiBX=Factor2*Xf-VertX; NeiBY=Factor2*Yb-VertY; NeiBZ=Factor2*Zf-VertZ; \
+ glNormal3f(VectMul(NeiAX, NeiAY, NeiAZ, NeiBX, NeiBY, NeiBZ)); \
+ glVertex3f(VertX, VertY, VertZ); \
+ \
+ } \
+ Xf=(float)Ri*Bx; \
+ Yf=Vr+(float)Ri*Ay; \
+ Xa=Xf+0.001; Yb=Yf+0.001; \
+ Factor=1-(((Xf2=sqr(Xf))+(Yf2=sqr(Yf)))*AmpVr2); \
+ Factor1=1-((sqr(Xa)+Yf2)*AmpVr2); \
+ Factor2=1-((Xf2+sqr(Yb))*AmpVr2); \
+ VertX=Factor*Xf; VertY=Factor*Yf; VertZ=Factor*Zf; \
+ NeiAX=Factor1*Xa-VertX; NeiAY=Factor1*Yf-VertY; NeiAZ=Factor1*Zf-VertZ; \
+ NeiBX=Factor2*Xf-VertX; NeiBY=Factor2*Yb-VertY; NeiBZ=Factor2*Zf-VertZ; \
+ glNormal3f(VectMul(NeiAX, NeiAY, NeiAZ, NeiBX, NeiBY, NeiBZ)); \
+ glVertex3f(VertX, VertY, VertZ); \
+ glEnd(); \
+ } \
+}
+
+#define SQUARE(Edge, Amp, Divisions, Z) \
+{ \
+ int Xi,Yi; \
+ GLfloat Xf,Yf,Y,Xf2,Yf2,Y2,Xa,Yb; \
+ GLfloat Factor,Factor1,Factor2; \
+ GLfloat VertX,VertY,VertZ,NeiAX,NeiAY,NeiAZ,NeiBX,NeiBY,NeiBZ; \
+ GLfloat Zf=(Edge)*(Z); \
+ GLfloat AmpVr2=(Amp)/sqr((Edge)*SQRT2/2); \
+ \
+ for (Yi=0; Yi<(Divisions); Yi++) { \
+ Yf=-((Edge)/2.0) + ((float)Yi)/(Divisions)*(Edge); \
+ Yf2=sqr(Yf); \
+ Y=Yf+1.0/(Divisions)*(Edge); \
+ Y2=sqr(Y); \
+ glBegin(GL_QUAD_STRIP); \
+ for (Xi=0; Xi<=(Divisions); Xi++) { \
+ Xf=-((Edge)/2.0) + ((float)Xi)/(Divisions)*(Edge); \
+ Xf2=sqr(Xf); \
+ \
+ Xa=Xf+0.001; Yb=Y+0.001; \
+ Factor=1-((Xf2+Y2)*AmpVr2); \
+ Factor1=1-((sqr(Xa)+Y2)*AmpVr2); \
+ Factor2=1-((Xf2+sqr(Yb))*AmpVr2); \
+ VertX=Factor*Xf; VertY=Factor*Y; VertZ=Factor*Zf; \
+ NeiAX=Factor1*Xa-VertX; NeiAY=Factor1*Y-VertY; NeiAZ=Factor1*Zf-VertZ; \
+ NeiBX=Factor2*Xf-VertX; NeiBY=Factor2*Yb-VertY; NeiBZ=Factor2*Zf-VertZ; \
+ glNormal3f(VectMul(NeiAX, NeiAY, NeiAZ, NeiBX, NeiBY, NeiBZ)); \
+ glVertex3f(VertX, VertY, VertZ); \
+ \
+ Xa=Xf+0.001; Yb=Yf+0.001; \
+ Factor=1-((Xf2+Yf2)*AmpVr2); \
+ Factor1=1-((sqr(Xa)+Yf2)*AmpVr2); \
+ Factor2=1-((Xf2+sqr(Yb))*AmpVr2); \
+ VertX=Factor*Xf; VertY=Factor*Yf; VertZ=Factor*Zf; \
+ NeiAX=Factor1*Xa-VertX; NeiAY=Factor1*Yf-VertY; NeiAZ=Factor1*Zf-VertZ; \
+ NeiBX=Factor2*Xf-VertX; NeiBY=Factor2*Yb-VertY; NeiBZ=Factor2*Zf-VertZ; \
+ glNormal3f(VectMul(NeiAX, NeiAY, NeiAZ, NeiBX, NeiBY, NeiBZ)); \
+ glVertex3f(VertX, VertY, VertZ); \
+ } \
+ glEnd(); \
+ } \
+}
+
+#define PENTAGON(Edge, Amp, Divisions, Z) \
+{ \
+ int Ri,Ti,Fi; \
+ GLfloat Xf,Yf,Xa,Yb,Xf2,Yf2; \
+ GLfloat x[6],y[6]; \
+ GLfloat Factor,Factor1,Factor2; \
+ GLfloat VertX,VertY,VertZ,NeiAX,NeiAY,NeiAZ,NeiBX,NeiBY,NeiBZ; \
+ GLfloat Zf=(Edge)*(Z); \
+ GLfloat AmpVr2=(Amp)/sqr((Edge)*cossec36_2); \
+ \
+ for(Fi=0;Fi<6;Fi++) { \
+ x[Fi]=-cos( Fi*2*Pi/5 + Pi/10 )/(Divisions)*cossec36_2*(Edge); \
+ y[Fi]=sin( Fi*2*Pi/5 + Pi/10 )/(Divisions)*cossec36_2*(Edge); \
+ } \
+ \
+ for (Ri=1; Ri<=(Divisions); Ri++) { \
+ for (Fi=0; Fi<5; Fi++) { \
+ glBegin(GL_TRIANGLE_STRIP); \
+ for (Ti=0; Ti<Ri; Ti++) { \
+ Xf=(float)(Ri-Ti)*x[Fi] + (float)Ti*x[Fi+1]; \
+ Yf=(float)(Ri-Ti)*y[Fi] + (float)Ti*y[Fi+1]; \
+ Xa=Xf+0.001; Yb=Yf+0.001; \
+ Factor=1-(((Xf2=sqr(Xf))+(Yf2=sqr(Yf)))*AmpVr2); \
+ Factor1=1-((sqr(Xa)+Yf2)*AmpVr2); \
+ Factor2=1-((Xf2+sqr(Yb))*AmpVr2); \
+ VertX=Factor*Xf; VertY=Factor*Yf; VertZ=Factor*Zf; \
+ NeiAX=Factor1*Xa-VertX; NeiAY=Factor1*Yf-VertY; NeiAZ=Factor1*Zf-VertZ; \
+ NeiBX=Factor2*Xf-VertX; NeiBY=Factor2*Yb-VertY; NeiBZ=Factor2*Zf-VertZ; \
+ glNormal3f(VectMul(NeiAX, NeiAY, NeiAZ, NeiBX, NeiBY, NeiBZ)); \
+ glVertex3f(VertX, VertY, VertZ); \
+ \
+ Xf=(float)(Ri-Ti-1)*x[Fi] + (float)Ti*x[Fi+1]; \
+ Yf=(float)(Ri-Ti-1)*y[Fi] + (float)Ti*y[Fi+1]; \
+ Xa=Xf+0.001; Yb=Yf+0.001; \
+ Factor=1-(((Xf2=sqr(Xf))+(Yf2=sqr(Yf)))*AmpVr2); \
+ Factor1=1-((sqr(Xa)+Yf2)*AmpVr2); \
+ Factor2=1-((Xf2+sqr(Yb))*AmpVr2); \
+ VertX=Factor*Xf; VertY=Factor*Yf; VertZ=Factor*Zf; \
+ NeiAX=Factor1*Xa-VertX; NeiAY=Factor1*Yf-VertY; NeiAZ=Factor1*Zf-VertZ; \
+ NeiBX=Factor2*Xf-VertX; NeiBY=Factor2*Yb-VertY; NeiBZ=Factor2*Zf-VertZ; \
+ glNormal3f(VectMul(NeiAX, NeiAY, NeiAZ, NeiBX, NeiBY, NeiBZ)); \
+ glVertex3f(VertX, VertY, VertZ); \
+ \
+ } \
+ Xf=(float)Ri*x[Fi+1]; \
+ Yf=(float)Ri*y[Fi+1]; \
+ Xa=Xf+0.001; Yb=Yf+0.001; \
+ Factor=1-(((Xf2=sqr(Xf))+(Yf2=sqr(Yf)))*AmpVr2); \
+ Factor1=1-((sqr(Xa)+Yf2)*AmpVr2); \
+ Factor2=1-((Xf2+sqr(Yb))*AmpVr2); \
+ VertX=Factor*Xf; VertY=Factor*Yf; VertZ=Factor*Zf; \
+ NeiAX=Factor1*Xa-VertX; NeiAY=Factor1*Yf-VertY; NeiAZ=Factor1*Zf-VertZ; \
+ NeiBX=Factor2*Xf-VertX; NeiBY=Factor2*Yb-VertY; NeiBZ=Factor2*Zf-VertZ; \
+ glNormal3f(VectMul(NeiAX, NeiAY, NeiAZ, NeiBX, NeiBY, NeiBZ)); \
+ glVertex3f(VertX, VertY, VertZ); \
+ glEnd(); \
+ } \
+ } \
+}
+
+static void draw_tetra( void )
+{
+ GLuint list;
+
+ list = glGenLists( 1 );
+ glNewList( list, GL_COMPILE );
+ TRIANGLE(2,seno,edgedivisions,0.5/SQRT6);
+ glEndList();
+
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[0]);
+ glCallList(list);
+ glPushMatrix();
+ glRotatef(180,0,0,1);
+ glRotatef(-tetraangle,1,0,0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[1]);
+ glCallList(list);
+ glPopMatrix();
+ glPushMatrix();
+ glRotatef(180,0,1,0);
+ glRotatef(-180+tetraangle,0.5,SQRT3/2,0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[2]);
+ glCallList(list);
+ glPopMatrix();
+ glRotatef(180,0,1,0);
+ glRotatef(-180+tetraangle,0.5,-SQRT3/2,0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[3]);
+ glCallList(list);
+
+ glDeleteLists(list,1);
+}
+
+static void draw_cube( void )
+{
+ GLuint list;
+
+ list = glGenLists( 1 );
+ glNewList( list, GL_COMPILE );
+ SQUARE(2, seno, edgedivisions, 0.5)
+ glEndList();
+
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[0]);
+ glCallList(list);
+ glRotatef(cubeangle,1,0,0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[1]);
+ glCallList(list);
+ glRotatef(cubeangle,1,0,0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[2]);
+ glCallList(list);
+ glRotatef(cubeangle,1,0,0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[3]);
+ glCallList(list);
+ glRotatef(cubeangle,0,1,0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[4]);
+ glCallList(list);
+ glRotatef(2*cubeangle,0,1,0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[5]);
+ glCallList(list);
+
+ glDeleteLists(list,1);
+}
+
+static void draw_octa( void )
+{
+ GLuint list;
+
+ list = glGenLists( 1 );
+ glNewList( list, GL_COMPILE );
+ TRIANGLE(2,seno,edgedivisions,1/SQRT6);
+ glEndList();
+
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[0]);
+ glCallList(list);
+ glPushMatrix();
+ glRotatef(180,0,0,1);
+ glRotatef(-180+octaangle,1,0,0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[1]);
+ glCallList(list);
+ glPopMatrix();
+ glPushMatrix();
+ glRotatef(180,0,1,0);
+ glRotatef(-octaangle,0.5,SQRT3/2,0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[2]);
+ glCallList(list);
+ glPopMatrix();
+ glPushMatrix();
+ glRotatef(180,0,1,0);
+ glRotatef(-octaangle,0.5,-SQRT3/2,0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[3]);
+ glCallList(list);
+ glPopMatrix();
+ glRotatef(180,1,0,0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[4]);
+ glCallList(list);
+ glPushMatrix();
+ glRotatef(180,0,0,1);
+ glRotatef(-180+octaangle,1,0,0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[5]);
+ glCallList(list);
+ glPopMatrix();
+ glPushMatrix();
+ glRotatef(180,0,1,0);
+ glRotatef(-octaangle,0.5,SQRT3/2,0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[6]);
+ glCallList(list);
+ glPopMatrix();
+ glRotatef(180,0,1,0);
+ glRotatef(-octaangle,0.5,-SQRT3/2,0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[7]);
+ glCallList(list);
+
+ glDeleteLists(list,1);
+}
+
+static void draw_dodeca( void )
+{
+ GLuint list;
+
+#define TAU ((SQRT5+1)/2)
+
+ list = glGenLists( 1 );
+ glNewList( list, GL_COMPILE );
+ PENTAGON(1,seno,edgedivisions,sqr(TAU) * sqrt((TAU+2)/5) / 2);
+ glEndList();
+
+ glPushMatrix();
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[0]);
+ glCallList(list);
+ glRotatef(180,0,0,1);
+ glPushMatrix();
+ glRotatef(-dodecaangle,1,0,0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[1]);
+ glCallList(list);
+ glPopMatrix();
+ glPushMatrix();
+ glRotatef(-dodecaangle,cos72,sin72,0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[2]);
+ glCallList(list);
+ glPopMatrix();
+ glPushMatrix();
+ glRotatef(-dodecaangle,cos72,-sin72,0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[3]);
+ glCallList(list);
+ glPopMatrix();
+ glPushMatrix();
+ glRotatef(dodecaangle,cos36,-sin36,0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[4]);
+ glCallList(list);
+ glPopMatrix();
+ glRotatef(dodecaangle,cos36,sin36,0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[5]);
+ glCallList(list);
+ glPopMatrix();
+ glRotatef(180,1,0,0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[6]);
+ glCallList(list);
+ glRotatef(180,0,0,1);
+ glPushMatrix();
+ glRotatef(-dodecaangle,1,0,0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[7]);
+ glCallList(list);
+ glPopMatrix();
+ glPushMatrix();
+ glRotatef(-dodecaangle,cos72,sin72,0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[8]);
+ glCallList(list);
+ glPopMatrix();
+ glPushMatrix();
+ glRotatef(-dodecaangle,cos72,-sin72,0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[9]);
+ glCallList(list);
+ glPopMatrix();
+ glPushMatrix();
+ glRotatef(dodecaangle,cos36,-sin36,0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[10]);
+ glCallList(list);
+ glPopMatrix();
+ glRotatef(dodecaangle,cos36,sin36,0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[11]);
+ glCallList(list);
+
+ glDeleteLists(list,1);
+}
+
+static void draw_ico( void )
+{
+ GLuint list;
+
+ list = glGenLists( 1 );
+ glNewList( list, GL_COMPILE );
+ TRIANGLE(1.5,seno,edgedivisions,(3*SQRT3+SQRT15)/12);
+ glEndList();
+
+ glPushMatrix();
+
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[0]);
+ glCallList(list);
+ glPushMatrix();
+ glRotatef(180,0,0,1);
+ glRotatef(-icoangle,1,0,0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[1]);
+ glCallList(list);
+ glPushMatrix();
+ glRotatef(180,0,1,0);
+ glRotatef(-180+icoangle,0.5,SQRT3/2,0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[2]);
+ glCallList(list);
+ glPopMatrix();
+ glRotatef(180,0,1,0);
+ glRotatef(-180+icoangle,0.5,-SQRT3/2,0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[3]);
+ glCallList(list);
+ glPopMatrix();
+ glPushMatrix();
+ glRotatef(180,0,1,0);
+ glRotatef(-180+icoangle,0.5,SQRT3/2,0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[4]);
+ glCallList(list);
+ glPushMatrix();
+ glRotatef(180,0,1,0);
+ glRotatef(-180+icoangle,0.5,SQRT3/2,0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[5]);
+ glCallList(list);
+ glPopMatrix();
+ glRotatef(180,0,0,1);
+ glRotatef(-icoangle,1,0,0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[6]);
+ glCallList(list);
+ glPopMatrix();
+ glRotatef(180,0,1,0);
+ glRotatef(-180+icoangle,0.5,-SQRT3/2,0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[7]);
+ glCallList(list);
+ glPushMatrix();
+ glRotatef(180,0,1,0);
+ glRotatef(-180+icoangle,0.5,-SQRT3/2,0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[8]);
+ glCallList(list);
+ glPopMatrix();
+ glRotatef(180,0,0,1);
+ glRotatef(-icoangle,1,0,0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[9]);
+ glCallList(list);
+ glPopMatrix();
+ glRotatef(180,1,0,0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[10]);
+ glCallList(list);
+ glPushMatrix();
+ glRotatef(180,0,0,1);
+ glRotatef(-icoangle,1,0,0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[11]);
+ glCallList(list);
+ glPushMatrix();
+ glRotatef(180,0,1,0);
+ glRotatef(-180+icoangle,0.5,SQRT3/2,0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[12]);
+ glCallList(list);
+ glPopMatrix();
+ glRotatef(180,0,1,0);
+ glRotatef(-180+icoangle,0.5,-SQRT3/2,0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[13]);
+ glCallList(list);
+ glPopMatrix();
+ glPushMatrix();
+ glRotatef(180,0,1,0);
+ glRotatef(-180+icoangle,0.5,SQRT3/2,0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[14]);
+ glCallList(list);
+ glPushMatrix();
+ glRotatef(180,0,1,0);
+ glRotatef(-180+icoangle,0.5,SQRT3/2,0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[15]);
+ glCallList(list);
+ glPopMatrix();
+ glRotatef(180,0,0,1);
+ glRotatef(-icoangle,1,0,0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[16]);
+ glCallList(list);
+ glPopMatrix();
+ glRotatef(180,0,1,0);
+ glRotatef(-180+icoangle,0.5,-SQRT3/2,0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[17]);
+ glCallList(list);
+ glPushMatrix();
+ glRotatef(180,0,1,0);
+ glRotatef(-180+icoangle,0.5,-SQRT3/2,0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[18]);
+ glCallList(list);
+ glPopMatrix();
+ glRotatef(180,0,0,1);
+ glRotatef(-icoangle,1,0,0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialColor[19]);
+ glCallList(list);
+
+ glDeleteLists(list,1);
+}
+
+static void draw ( void ) {
+ glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+
+ glPushMatrix();
+
+ glTranslatef( 0.0, 0.0, -10.0 );
+ glScalef( Scale*WindH/WindW, Scale, Scale );
+ glTranslatef(2.5*WindW/WindH*sin(step*1.11),2.5*cos(step*1.25*1.11),0);
+ glRotatef(step*100,1,0,0);
+ glRotatef(step*95,0,1,0);
+ glRotatef(step*90,0,0,1);
+
+ seno=(sin(step)+1.0/3.0)*(4.0/5.0)*Magnitude;
+
+ draw_object();
+
+ glPopMatrix();
+
+ glFlush();
+
+ glutSwapBuffers();
+
+}
+
+static void idle_( void )
+{
+ static double t0 = -1.;
+ double dt, t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
+ if (t0 < 0.0)
+ t0 = t;
+ dt = t - t0;
+ t0 = t;
+
+ step += dt;
+
+ glutPostRedisplay();
+}
+
+static void reshape( int width, int height )
+{
+ glViewport(0, 0, WindW=(GLint)width, WindH=(GLint)height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glFrustum( -1.0, 1.0, -1.0, 1.0, 5.0, 15.0 );
+ glMatrixMode(GL_MODELVIEW);
+}
+
+static void pinit(void);
+
+static void key( unsigned char k, int x, int y )
+{
+ (void) x;
+ (void) y;
+ switch (k) {
+ case '1': object=1; break;
+ case '2': object=2; break;
+ case '3': object=3; break;
+ case '4': object=4; break;
+ case '5': object=5; break;
+ case ' ': mono^=1; break;
+ case 's': smooth^=1; break;
+ case 'a':
+ anim^=1;
+ if (anim)
+ glutIdleFunc( idle_ );
+ else
+ glutIdleFunc(NULL);
+ break;
+ case 27:
+ exit(0);
+ }
+ pinit();
+ glutPostRedisplay();
+}
+
+static void pinit(void)
+{
+ switch(object) {
+ case 1:
+ draw_object=draw_tetra;
+ MaterialColor[0]=MaterialRed;
+ MaterialColor[1]=MaterialGreen;
+ MaterialColor[2]=MaterialBlue;
+ MaterialColor[3]=MaterialWhite;
+ edgedivisions=tetradivisions;
+ Magnitude=2.5;
+ break;
+ case 2:
+ draw_object=draw_cube;
+ MaterialColor[0]=MaterialRed;
+ MaterialColor[1]=MaterialGreen;
+ MaterialColor[2]=MaterialCyan;
+ MaterialColor[3]=MaterialMagenta;
+ MaterialColor[4]=MaterialYellow;
+ MaterialColor[5]=MaterialBlue;
+ edgedivisions=cubedivisions;
+ Magnitude=2.0;
+ break;
+ case 3:
+ draw_object=draw_octa;
+ MaterialColor[0]=MaterialRed;
+ MaterialColor[1]=MaterialGreen;
+ MaterialColor[2]=MaterialBlue;
+ MaterialColor[3]=MaterialWhite;
+ MaterialColor[4]=MaterialCyan;
+ MaterialColor[5]=MaterialMagenta;
+ MaterialColor[6]=MaterialGray;
+ MaterialColor[7]=MaterialYellow;
+ edgedivisions=octadivisions;
+ Magnitude=2.5;
+ break;
+ case 4:
+ draw_object=draw_dodeca;
+ MaterialColor[ 0]=MaterialRed;
+ MaterialColor[ 1]=MaterialGreen;
+ MaterialColor[ 2]=MaterialCyan;
+ MaterialColor[ 3]=MaterialBlue;
+ MaterialColor[ 4]=MaterialMagenta;
+ MaterialColor[ 5]=MaterialYellow;
+ MaterialColor[ 6]=MaterialGreen;
+ MaterialColor[ 7]=MaterialCyan;
+ MaterialColor[ 8]=MaterialRed;
+ MaterialColor[ 9]=MaterialMagenta;
+ MaterialColor[10]=MaterialBlue;
+ MaterialColor[11]=MaterialYellow;
+ edgedivisions=dodecadivisions;
+ Magnitude=2.0;
+ break;
+ case 5:
+ draw_object=draw_ico;
+ MaterialColor[ 0]=MaterialRed;
+ MaterialColor[ 1]=MaterialGreen;
+ MaterialColor[ 2]=MaterialBlue;
+ MaterialColor[ 3]=MaterialCyan;
+ MaterialColor[ 4]=MaterialYellow;
+ MaterialColor[ 5]=MaterialMagenta;
+ MaterialColor[ 6]=MaterialRed;
+ MaterialColor[ 7]=MaterialGreen;
+ MaterialColor[ 8]=MaterialBlue;
+ MaterialColor[ 9]=MaterialWhite;
+ MaterialColor[10]=MaterialCyan;
+ MaterialColor[11]=MaterialYellow;
+ MaterialColor[12]=MaterialMagenta;
+ MaterialColor[13]=MaterialRed;
+ MaterialColor[14]=MaterialGreen;
+ MaterialColor[15]=MaterialBlue;
+ MaterialColor[16]=MaterialCyan;
+ MaterialColor[17]=MaterialYellow;
+ MaterialColor[18]=MaterialMagenta;
+ MaterialColor[19]=MaterialGray;
+ edgedivisions=icodivisions;
+ Magnitude=2.5;
+ break;
+ }
+ if (mono) {
+ int loop;
+ for (loop=0; loop<20; loop++) MaterialColor[loop]=MaterialGray;
+ }
+ if (smooth) {
+ glShadeModel( GL_SMOOTH );
+ } else {
+ glShadeModel( GL_FLAT );
+ }
+
+}
+
+static void INIT(void)
+{
+ printf("Morph 3D - Shows morphing platonic polyhedra\n");
+ printf("Author: Marcelo Fernandes Vianna ([email protected])\n\n");
+ printf(" [1] - Tetrahedron\n");
+ printf(" [2] - Hexahedron (Cube)\n");
+ printf(" [3] - Octahedron\n");
+ printf(" [4] - Dodecahedron\n");
+ printf(" [5] - Icosahedron\n");
+ printf("[SPACE] - Toggle colored faces\n");
+ printf("[RETURN] - Toggle smooth/flat shading\n");
+ printf(" [ESC] - Quit\n");
+
+ object=1;
+
+ glutInitWindowPosition(0,0);
+ glutInitWindowSize(640,480);
+
+ glutInitDisplayMode( GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGB );
+
+ if (glutCreateWindow("Morph 3D - Shows morphing platonic polyhedra") <= 0) {
+ exit(0);
+ }
+
+ glClearDepth(1.0);
+ glClearColor( 0.0, 0.0, 0.0, 1.0 );
+ glColor3f( 1.0, 1.0, 1.0 );
+
+ glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+ glFlush();
+ glutSwapBuffers();
+
+ glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+ glLightfv(GL_LIGHT0, GL_POSITION, position0);
+ glLightfv(GL_LIGHT1, GL_AMBIENT, ambient);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);
+ glLightfv(GL_LIGHT1, GL_POSITION, position1);
+ glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+ glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_LIGHT1);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_NORMALIZE);
+
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, front_shininess);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, front_specular);
+
+ glHint(GL_FOG_HINT, GL_FASTEST);
+ glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
+ glHint(GL_POLYGON_SMOOTH_HINT, GL_FASTEST);
+
+ pinit();
+
+ glutReshapeFunc( reshape );
+ glutKeyboardFunc( key );
+ glutIdleFunc( idle_ );
+ glutDisplayFunc( draw );
+ glutMainLoop();
+
+}
+
+int main(int argc, char **argv)
+{
+ INIT();
+ return(0);
+}
diff --git a/progs/demos/multiarb.c b/progs/demos/multiarb.c
new file mode 100644
index 00000000000..d963985c69d
--- /dev/null
+++ b/progs/demos/multiarb.c
@@ -0,0 +1,345 @@
+
+/*
+ * GL_ARB_multitexture demo
+ *
+ * Command line options:
+ * -info print GL implementation information
+ *
+ *
+ * Brian Paul November 1998 This program is in the public domain.
+ * Modified on 12 Feb 2002 for > 2 texture units.
+ */
+
+
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <GL/glut.h>
+
+#include "readtex.h"
+
+#define TEXTURE_1_FILE "../images/girl.rgb"
+#define TEXTURE_2_FILE "../images/reflect.rgb"
+
+#define TEX0 1
+#define TEX7 8
+#define ANIMATE 10
+#define QUIT 100
+
+static GLboolean Animate = GL_TRUE;
+static GLint NumUnits = 1;
+static GLboolean TexEnabled[8];
+
+static GLfloat Drift = 0.0;
+static GLfloat drift_increment = 0.005;
+static GLfloat Xrot = 20.0, Yrot = 30.0, Zrot = 0.0;
+
+
+static void Idle( void )
+{
+ if (Animate) {
+ GLint i;
+
+ Drift += drift_increment;
+ if (Drift >= 1.0)
+ Drift = 0.0;
+
+ for (i = 0; i < NumUnits; i++) {
+ glActiveTextureARB(GL_TEXTURE0_ARB + i);
+ glMatrixMode(GL_TEXTURE);
+ glLoadIdentity();
+ if (i == 0) {
+ glTranslatef(Drift, 0.0, 0.0);
+ glScalef(2, 2, 1);
+ }
+ else if (i == 1) {
+ glTranslatef(0.0, Drift, 0.0);
+ }
+ else {
+ glTranslatef(0.5, 0.5, 0.0);
+ glRotatef(180.0 * Drift, 0, 0, 1);
+ glScalef(1.0/i, 1.0/i, 1.0/i);
+ glTranslatef(-0.5, -0.5, 0.0);
+ }
+ }
+ glMatrixMode(GL_MODELVIEW);
+
+ glutPostRedisplay();
+ }
+}
+
+
+static void DrawObject(void)
+{
+ GLint i;
+ GLint j;
+ static const GLfloat tex_coords[] = { 0.0, 0.0, 1.0, 1.0, 0.0 };
+ static const GLfloat vtx_coords[] = { -1.0, -1.0, 1.0, 1.0, -1.0 };
+
+ if (!TexEnabled[0] && !TexEnabled[1])
+ glColor3f(0.1, 0.1, 0.1); /* add onto this */
+ else
+ glColor3f(1, 1, 1); /* modulate this */
+
+ glBegin(GL_QUADS);
+
+ /* Toggle between the vector and scalar entry points. This is done purely
+ * to hit multiple paths in the driver.
+ */
+ if ( Drift > 0.49 ) {
+ for (j = 0; j < 4; j++ ) {
+ for (i = 0; i < NumUnits; i++)
+ glMultiTexCoord2fARB(GL_TEXTURE0_ARB + i,
+ tex_coords[j], tex_coords[j+1]);
+ glVertex2f( vtx_coords[j], vtx_coords[j+1] );
+ }
+ }
+ else {
+ for (j = 0; j < 4; j++ ) {
+ for (i = 0; i < NumUnits; i++)
+ glMultiTexCoord2fvARB(GL_TEXTURE0_ARB + i, & tex_coords[j]);
+ glVertex2fv( & vtx_coords[j] );
+ }
+ }
+
+ glEnd();
+}
+
+
+
+static void Display( void )
+{
+ static GLint T0 = 0;
+ static GLint Frames = 0;
+ GLint t;
+
+ glClear( GL_COLOR_BUFFER_BIT );
+
+ glPushMatrix();
+ glRotatef(Xrot, 1.0, 0.0, 0.0);
+ glRotatef(Yrot, 0.0, 1.0, 0.0);
+ glRotatef(Zrot, 0.0, 0.0, 1.0);
+ glScalef(5.0, 5.0, 5.0);
+ DrawObject();
+ glPopMatrix();
+
+ glutSwapBuffers();
+
+ Frames++;
+
+ t = glutGet(GLUT_ELAPSED_TIME);
+ if (t - T0 >= 250) {
+ GLfloat seconds = (t - T0) / 1000.0;
+ drift_increment = 2.2 * seconds / Frames;
+ T0 = t;
+ Frames = 0;
+ }
+}
+
+
+static void Reshape( int width, int height )
+{
+ glViewport( 0, 0, width, height );
+ glMatrixMode( GL_PROJECTION );
+ glLoadIdentity();
+ glFrustum( -1.0, 1.0, -1.0, 1.0, 10.0, 100.0 );
+ /*glOrtho( -6.0, 6.0, -6.0, 6.0, 10.0, 100.0 );*/
+ glMatrixMode( GL_MODELVIEW );
+ glLoadIdentity();
+ glTranslatef( 0.0, 0.0, -70.0 );
+}
+
+
+static void ModeMenu(int entry)
+{
+ if (entry >= TEX0 && entry <= TEX7) {
+ /* toggle */
+ GLint i = entry - TEX0;
+ TexEnabled[i] = !TexEnabled[i];
+ glActiveTextureARB(GL_TEXTURE0_ARB + i);
+ if (TexEnabled[i])
+ glEnable(GL_TEXTURE_2D);
+ else
+ glDisable(GL_TEXTURE_2D);
+ printf("Enabled: ");
+ for (i = 0; i < NumUnits; i++)
+ printf("%d ", (int) TexEnabled[i]);
+ printf("\n");
+ }
+ else if (entry==ANIMATE) {
+ Animate = !Animate;
+ }
+ else if (entry==QUIT) {
+ exit(0);
+ }
+
+ glutPostRedisplay();
+}
+
+
+static void Key( unsigned char key, int x, int y )
+{
+ (void) x;
+ (void) y;
+ switch (key) {
+ case 27:
+ exit(0);
+ break;
+ }
+ glutPostRedisplay();
+}
+
+
+static void SpecialKey( int key, int x, int y )
+{
+ float step = 3.0;
+ (void) x;
+ (void) y;
+
+ switch (key) {
+ case GLUT_KEY_UP:
+ Xrot += step;
+ break;
+ case GLUT_KEY_DOWN:
+ Xrot -= step;
+ break;
+ case GLUT_KEY_LEFT:
+ Yrot += step;
+ break;
+ case GLUT_KEY_RIGHT:
+ Yrot -= step;
+ break;
+ }
+ glutPostRedisplay();
+}
+
+
+static void Init( int argc, char *argv[] )
+{
+ GLuint texObj[8];
+ GLint size, i;
+
+ const char *exten = (const char *) glGetString(GL_EXTENSIONS);
+ if (!strstr(exten, "GL_ARB_multitexture")) {
+ printf("Sorry, GL_ARB_multitexture not supported by this renderer.\n");
+ exit(1);
+ }
+
+ glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &NumUnits);
+ printf("%d texture units supported\n", NumUnits);
+ if (NumUnits > 8)
+ NumUnits = 8;
+
+ glGetIntegerv(GL_MAX_TEXTURE_SIZE, &size);
+ printf("%d x %d max texture size\n", size, size);
+
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+
+ for (i = 0; i < NumUnits; i++) {
+ if (i < 2)
+ TexEnabled[i] = GL_TRUE;
+ else
+ TexEnabled[i] = GL_FALSE;
+ }
+
+ /* allocate two texture objects */
+ glGenTextures(NumUnits, texObj);
+
+ /* setup the texture objects */
+ for (i = 0; i < NumUnits; i++) {
+
+ glActiveTextureARB(GL_TEXTURE0_ARB + i);
+ glBindTexture(GL_TEXTURE_2D, texObj[i]);
+
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+
+ if (i == 0) {
+ if (!LoadRGBMipmaps(TEXTURE_1_FILE, GL_RGB)) {
+ printf("Error: couldn't load texture image\n");
+ exit(1);
+ }
+ }
+ else if (i == 1) {
+ if (!LoadRGBMipmaps(TEXTURE_2_FILE, GL_RGB)) {
+ printf("Error: couldn't load texture image\n");
+ exit(1);
+ }
+ }
+ else {
+ /* checker */
+ GLubyte image[8][8][3];
+ GLint i, j;
+ for (i = 0; i < 8; i++) {
+ for (j = 0; j < 8; j++) {
+ if ((i + j) & 1) {
+ image[i][j][0] = 50;
+ image[i][j][1] = 50;
+ image[i][j][2] = 50;
+ }
+ else {
+ image[i][j][0] = 25;
+ image[i][j][1] = 25;
+ image[i][j][2] = 25;
+ }
+ }
+ }
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 8, 8, 0,
+ GL_RGB, GL_UNSIGNED_BYTE, (GLvoid *) image);
+ }
+
+ /* Bind texObj[i] to ith texture unit */
+ if (i < 2)
+ glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ else
+ glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_ADD);
+
+ if (TexEnabled[i])
+ glEnable(GL_TEXTURE_2D);
+ }
+
+ glShadeModel(GL_FLAT);
+ glClearColor(0.3, 0.3, 0.4, 1.0);
+
+ if (argc > 1 && strcmp(argv[1], "-info")==0) {
+ printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER));
+ printf("GL_VERSION = %s\n", (char *) glGetString(GL_VERSION));
+ printf("GL_VENDOR = %s\n", (char *) glGetString(GL_VENDOR));
+ printf("GL_EXTENSIONS = %s\n", (char *) glGetString(GL_EXTENSIONS));
+ }
+}
+
+
+int main( int argc, char *argv[] )
+{
+ GLint i;
+
+ glutInit( &argc, argv );
+ glutInitWindowSize( 300, 300 );
+ glutInitWindowPosition( 0, 0 );
+ glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE );
+ glutCreateWindow(argv[0] );
+
+ Init( argc, argv );
+
+ glutReshapeFunc( Reshape );
+ glutKeyboardFunc( Key );
+ glutSpecialFunc( SpecialKey );
+ glutDisplayFunc( Display );
+ glutIdleFunc( Idle );
+
+ glutCreateMenu(ModeMenu);
+
+ for (i = 0; i < NumUnits; i++) {
+ char s[100];
+ sprintf(s, "Toggle Texture %d", i);
+ glutAddMenuEntry(s, TEX0 + i);
+ }
+ glutAddMenuEntry("Toggle Animation", ANIMATE);
+ glutAddMenuEntry("Quit", QUIT);
+ glutAttachMenu(GLUT_RIGHT_BUTTON);
+
+ glutMainLoop();
+ return 0;
+}
diff --git a/progs/demos/occlude.c b/progs/demos/occlude.c
new file mode 100644
index 00000000000..8f7b90984e0
--- /dev/null
+++ b/progs/demos/occlude.c
@@ -0,0 +1,234 @@
+/*
+ * GL_HP_occlustion_test demo
+ *
+ * Brian Paul
+ * 31 March 2000
+ *
+ * Copyright (C) 2000 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.
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include <GL/glut.h>
+#include <GL/glext.h>
+
+
+static GLfloat Xpos = 0;
+static GLboolean Anim = GL_TRUE;
+
+
+static void
+PrintString(const char *s)
+{
+ while (*s) {
+ glutBitmapCharacter(GLUT_BITMAP_8_BY_13, (int) *s);
+ s++;
+ }
+}
+
+
+
+static void Idle(void)
+{
+ static int lastTime = 0;
+ static int sign = +1;
+ int time = glutGet(GLUT_ELAPSED_TIME);
+ float step;
+
+ if (lastTime == 0)
+ lastTime = time;
+ else if (time - lastTime < 20) /* 50Hz update */
+ return;
+
+ step = (time - lastTime) / 1000.0 * sign;
+ lastTime = time;
+
+ Xpos += step;
+
+ if (Xpos > 2.5) {
+ Xpos = 2.5;
+ sign = -1;
+ }
+ else if (Xpos < -2.5) {
+ Xpos = -2.5;
+ sign = +1;
+ }
+ glutPostRedisplay();
+}
+
+
+static void Display( void )
+{
+ GLboolean result;
+
+ glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+
+ glMatrixMode( GL_PROJECTION );
+ glLoadIdentity();
+ glFrustum( -1.0, 1.0, -1.0, 1.0, 5.0, 25.0 );
+ glMatrixMode( GL_MODELVIEW );
+ glLoadIdentity();
+ glTranslatef( 0.0, 0.0, -15.0 );
+
+ /* draw the occluding polygons */
+ glColor3f(0, 0.6, 0.8);
+ glBegin(GL_QUADS);
+ glVertex2f(-1.6, -1.5);
+ glVertex2f(-0.4, -1.5);
+ glVertex2f(-0.4, 1.5);
+ glVertex2f(-1.6, 1.5);
+
+ glVertex2f( 0.4, -1.5);
+ glVertex2f( 1.6, -1.5);
+ glVertex2f( 1.6, 1.5);
+ glVertex2f( 0.4, 1.5);
+ glEnd();
+
+ /* draw the test polygon with occlusion testing */
+ glPushMatrix();
+ glTranslatef(Xpos, 0, -0.5);
+ glScalef(0.3, 0.3, 1.0);
+ glRotatef(-90.0 * Xpos, 0, 0, 1);
+
+ glEnable(GL_OCCLUSION_TEST_HP); /* NOTE: enabling the occlusion test */
+ /* doesn't clear the result flag! */
+ glColorMask(0, 0, 0, 0);
+ glDepthMask(GL_FALSE);
+ /* this call clear's the result flag. Not really needed for this demo. */
+ glGetBooleanv(GL_OCCLUSION_TEST_RESULT_HP, &result);
+
+ glBegin(GL_POLYGON);
+ glVertex3f(-1, -1, 0);
+ glVertex3f( 1, -1, 0);
+ glVertex3f( 1, 1, 0);
+ glVertex3f(-1, 1, 0);
+ glEnd();
+
+ glGetBooleanv(GL_OCCLUSION_TEST_RESULT_HP, &result);
+ /* turn off occlusion testing */
+ glDisable(GL_OCCLUSION_TEST_HP);
+ glColorMask(1, 1, 1, 1);
+ glDepthMask(GL_TRUE);
+
+ /* draw the green rect, so we can see what's going on */
+ glColor3f(0.8, 0.5, 0);
+ glBegin(GL_POLYGON);
+ glVertex3f(-1, -1, 0);
+ glVertex3f( 1, -1, 0);
+ glVertex3f( 1, 1, 0);
+ glVertex3f(-1, 1, 0);
+ glEnd();
+
+ glPopMatrix();
+
+
+ /* Print result message */
+ glMatrixMode( GL_PROJECTION );
+ glLoadIdentity();
+ glOrtho( -1.0, 1.0, -1.0, 1.0, -1.0, 1.0 );
+ glMatrixMode( GL_MODELVIEW );
+ glLoadIdentity();
+
+ glColor3f(1, 1, 1);
+ glRasterPos3f(-0.25, -0.7, 0);
+
+ if (result)
+ PrintString(" Visible");
+ else
+ PrintString("Fully Occluded");
+
+ glutSwapBuffers();
+}
+
+
+static void Reshape( int width, int height )
+{
+ glViewport( 0, 0, width, height );
+}
+
+
+static void Key( unsigned char key, int x, int y )
+{
+ (void) x;
+ (void) y;
+ switch (key) {
+ case 'a':
+ Anim = !Anim;
+ if (Anim)
+ glutIdleFunc( Idle );
+ else
+ glutIdleFunc( NULL );
+ break;
+ case 27:
+ exit(0);
+ break;
+ }
+ glutPostRedisplay();
+}
+
+
+static void SpecialKey( int key, int x, int y )
+{
+ const GLfloat step = 0.1;
+ (void) x;
+ (void) y;
+ switch (key) {
+ case GLUT_KEY_LEFT:
+ Xpos -= step;
+ break;
+ case GLUT_KEY_RIGHT:
+ Xpos += step;
+ break;
+ }
+ glutPostRedisplay();
+}
+
+
+static void Init( void )
+{
+ const char *ext = (const char *) glGetString(GL_EXTENSIONS);
+ if (!strstr(ext, "GL_HP_occlusion_test")) {
+ printf("Sorry, this demo requires the GL_HP_occlusion_test extension\n");
+ exit(-1);
+ }
+
+ glEnable(GL_DEPTH_TEST);
+}
+
+
+int main( int argc, char *argv[] )
+{
+ glutInit( &argc, argv );
+ glutInitWindowPosition( 0, 0 );
+ glutInitWindowSize( 400, 400 );
+ glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH );
+ glutCreateWindow(argv[0]);
+ glutReshapeFunc( Reshape );
+ glutKeyboardFunc( Key );
+ glutSpecialFunc( SpecialKey );
+ glutIdleFunc( Idle );
+ glutDisplayFunc( Display );
+ Init();
+ glutMainLoop();
+ return 0;
+}
diff --git a/progs/demos/paltex.c b/progs/demos/paltex.c
new file mode 100644
index 00000000000..aa9c0da36b7
--- /dev/null
+++ b/progs/demos/paltex.c
@@ -0,0 +1,270 @@
+
+/*
+ * Paletted texture demo. Written by Brian Paul.
+ * This program is in the public domain.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <string.h>
+#ifdef _WIN32
+#include <windows.h>
+#endif
+#define GL_GLEXT_PROTOTYPES
+#include <GL/glut.h>
+
+
+static float Rot = 0.0;
+static GLboolean Anim = 1;
+
+
+static void Idle( void )
+{
+ float t = glutGet(GLUT_ELAPSED_TIME) * 0.001; /* in seconds */
+ Rot = t * 360 / 4; /* 1 rotation per 4 seconds */
+ glutPostRedisplay();
+}
+
+
+static void Display( void )
+{
+ /* draw background gradient */
+ glDisable(GL_TEXTURE_2D);
+ glBegin(GL_POLYGON);
+ glColor3f(1.0, 0.0, 0.2); glVertex2f(-1.5, -1.0);
+ glColor3f(1.0, 0.0, 0.2); glVertex2f( 1.5, -1.0);
+ glColor3f(0.0, 0.0, 1.0); glVertex2f( 1.5, 1.0);
+ glColor3f(0.0, 0.0, 1.0); glVertex2f(-1.5, 1.0);
+ glEnd();
+
+ glPushMatrix();
+ glRotatef(Rot, 0, 0, 1);
+
+ glEnable(GL_TEXTURE_2D);
+ glBegin(GL_POLYGON);
+ glTexCoord2f(0, 1); glVertex2f(-1, -0.5);
+ glTexCoord2f(1, 1); glVertex2f( 1, -0.5);
+ glTexCoord2f(1, 0); glVertex2f( 1, 0.5);
+ glTexCoord2f(0, 0); glVertex2f(-1, 0.5);
+ glEnd();
+
+ glPopMatrix();
+
+ glutSwapBuffers();
+}
+
+
+static void Reshape( int width, int height )
+{
+ glViewport( 0, 0, width, height );
+ glMatrixMode( GL_PROJECTION );
+ glLoadIdentity();
+ glOrtho( -1.5, 1.5, -1.0, 1.0, -1.0, 1.0 );
+ glMatrixMode( GL_MODELVIEW );
+ glLoadIdentity();
+}
+
+
+static void Key( unsigned char key, int x, int y )
+{
+ (void) x;
+ (void) y;
+ switch (key) {
+ case 27:
+ exit(0);
+ break;
+ case 's':
+ Rot += 0.5;
+ break;
+ case ' ':
+ Anim = !Anim;
+ if (Anim)
+ glutIdleFunc( Idle );
+ else
+ glutIdleFunc( NULL );
+ break;
+ }
+ glutPostRedisplay();
+}
+
+
+static void Init( void )
+{
+#define HEIGHT 8
+#define WIDTH 32
+ /* 257 = HEIGHT * WIDTH + 1 (for trailing '\0') */
+ static char texture[257] = {"\
+ \
+ MMM EEEE SSS AAA \
+ M M M E S S A A \
+ M M M EEEE SS A A \
+ M M M E SS AAAAA \
+ M M E S S A A \
+ M M EEEE SSS A A \
+ "
+ };
+ GLubyte table[256][4];
+
+ if (!glutExtensionSupported("GL_EXT_paletted_texture")) {
+ printf("Sorry, GL_EXT_paletted_texture not supported\n");
+ exit(0);
+ }
+
+ /* load the color table for each texel-index */
+ memset(table, 0, 256*4);
+ table[' '][0] = 255;
+ table[' '][1] = 255;
+ table[' '][2] = 255;
+ table[' '][3] = 64;
+ table['M'][0] = 255;
+ table['M'][1] = 0;
+ table['M'][2] = 0;
+ table['M'][3] = 255;
+ table['E'][0] = 0;
+ table['E'][1] = 255;
+ table['E'][2] = 0;
+ table['E'][3] = 255;
+ table['S'][0] = 0;
+ table['S'][1] = 0;
+ table['S'][2] = 255;
+ table['S'][3] = 255;
+ table['A'][0] = 255;
+ table['A'][1] = 255;
+ table['A'][2] = 0;
+ table['A'][3] = 255;
+
+#ifdef GL_EXT_paletted_texture
+
+#if defined(GL_EXT_shared_texture_palette) && defined(USE_SHARED_PALETTE)
+ printf("Using shared palette\n");
+ glColorTableEXT(GL_SHARED_TEXTURE_PALETTE_EXT, /* target */
+ GL_RGBA, /* internal format */
+ 256, /* table size */
+ GL_RGBA, /* table format */
+ GL_UNSIGNED_BYTE, /* table type */
+ table); /* the color table */
+ glEnable(GL_SHARED_TEXTURE_PALETTE_EXT);
+#else
+ glColorTableEXT(GL_TEXTURE_2D, /* target */
+ GL_RGBA, /* internal format */
+ 256, /* table size */
+ GL_RGBA, /* table format */
+ GL_UNSIGNED_BYTE, /* table type */
+ table); /* the color table */
+#endif
+
+ glTexImage2D(GL_TEXTURE_2D, /* target */
+ 0, /* level */
+ GL_COLOR_INDEX8_EXT, /* internal format */
+ WIDTH, HEIGHT, /* width, height */
+ 0, /* border */
+ GL_COLOR_INDEX, /* texture format */
+ GL_UNSIGNED_BYTE, /* texture type */
+ texture); /* the texture */
+#endif
+
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+ glEnable(GL_TEXTURE_2D);
+
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+#undef HEIGHT
+#undef WIDTH
+}
+
+
+
+/*
+ * Color ramp test
+ */
+static void Init2( void )
+{
+#define HEIGHT 32
+#define WIDTH 256
+ static char texture[HEIGHT][WIDTH];
+ GLubyte table[256][4];
+ int i, j;
+
+ if (!glutExtensionSupported("GL_EXT_paletted_texture")) {
+ printf("Sorry, GL_EXT_paletted_texture not supported\n");
+ exit(0);
+ }
+
+ for (j = 0; j < HEIGHT; j++) {
+ for (i = 0; i < WIDTH; i++) {
+ texture[j][i] = i;
+ }
+ }
+
+ for (i = 0; i < 255; i++) {
+ table[i][0] = i;
+ table[i][1] = 0;
+ table[i][2] = 0;
+ table[i][3] = 255;
+ }
+
+#ifdef GL_EXT_paletted_texture
+
+#if defined(GL_EXT_shared_texture_palette) && defined(USE_SHARED_PALETTE)
+ printf("Using shared palette\n");
+ glColorTableEXT(GL_SHARED_TEXTURE_PALETTE_EXT, /* target */
+ GL_RGBA, /* internal format */
+ 256, /* table size */
+ GL_RGBA, /* table format */
+ GL_UNSIGNED_BYTE, /* table type */
+ table); /* the color table */
+ glEnable(GL_SHARED_TEXTURE_PALETTE_EXT);
+#else
+ glColorTableEXT(GL_TEXTURE_2D, /* target */
+ GL_RGBA, /* internal format */
+ 256, /* table size */
+ GL_RGBA, /* table format */
+ GL_UNSIGNED_BYTE, /* table type */
+ table); /* the color table */
+#endif
+
+ glTexImage2D(GL_TEXTURE_2D, /* target */
+ 0, /* level */
+ GL_COLOR_INDEX8_EXT, /* internal format */
+ WIDTH, HEIGHT, /* width, height */
+ 0, /* border */
+ GL_COLOR_INDEX, /* texture format */
+ GL_UNSIGNED_BYTE, /* texture type */
+ texture); /* teh texture */
+#endif
+
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+ glEnable(GL_TEXTURE_2D);
+
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+}
+
+
+int main( int argc, char *argv[] )
+{
+ glutInit( &argc, argv );
+ glutInitWindowPosition( 0, 0 );
+ glutInitWindowSize( 400, 300 );
+
+ glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE );
+
+ glutCreateWindow(argv[0]);
+
+ Init();
+ (void) Init2; /* silence warning */
+
+ glutReshapeFunc( Reshape );
+ glutKeyboardFunc( Key );
+ glutDisplayFunc( Display );
+ if (Anim)
+ glutIdleFunc( Idle );
+
+ glutMainLoop();
+ return 0;
+}
diff --git a/progs/demos/particles.cxx b/progs/demos/particles.cxx
new file mode 100644
index 00000000000..b88c318e0bc
--- /dev/null
+++ b/progs/demos/particles.cxx
@@ -0,0 +1,219 @@
+/*
+ * This program is under the GNU GPL.
+ * Use at your own risk.
+ *
+ * written by David Bucciarelli ([email protected])
+ * Humanware s.r.l.
+ */
+
+#include <stdlib.h>
+
+#include "particles.h"
+
+#define vinit(a,i,j,k) {\
+ (a)[0]=i;\
+ (a)[1]=j;\
+ (a)[2]=k;\
+}
+
+#define vadds(a,dt,b) {\
+ (a)[0]+=(dt)*(b)[0];\
+ (a)[1]+=(dt)*(b)[1];\
+ (a)[2]+=(dt)*(b)[2];\
+}
+
+#define vequ(a,b) {\
+ (a)[0]=(b)[0];\
+ (a)[1]=(b)[1];\
+ (a)[2]=(b)[2];\
+}
+
+#define vinter(a,dt,b,c) {\
+ (a)[0]=(dt)*(b)[0]+(1.0-dt)*(c)[0];\
+ (a)[1]=(dt)*(b)[1]+(1.0-dt)*(c)[1];\
+ (a)[2]=(dt)*(b)[2]+(1.0-dt)*(c)[2];\
+}
+
+#define clamp(a) ((a) < 0.0 ? 0.0 : ((a) < 1.0 ? (a) : 1.0))
+
+#define vclamp(v) {\
+ (v)[0]=clamp((v)[0]);\
+ (v)[1]=clamp((v)[1]);\
+ (v)[2]=clamp((v)[2]);\
+}
+
+
+float rainParticle::min[3];
+float rainParticle::max[3];
+float rainParticle::partLength=0.2f;
+
+
+static float vrnd(void)
+{
+ return(((float)rand())/RAND_MAX);
+}
+
+
+particle::particle()
+{
+ age=0.0f;
+
+ vinit(acc,0.0f,0.0f,0.0f);
+ vinit(vel,0.0f,0.0f,0.0f);
+ vinit(pos,0.0f,0.0f,0.0f);
+}
+
+void particle::elapsedTime(float dt)
+{
+ age+=dt;
+
+ vadds(vel,dt,acc);
+
+ vadds(pos,dt,vel);
+}
+
+/////////////////////////////////////////
+// Particle System
+/////////////////////////////////////////
+
+particleSystem::particleSystem()
+{
+ t=0.0f;
+
+ part=NULL;
+
+ particleNum=0;
+}
+
+particleSystem::~particleSystem()
+{
+ if(part)
+ free(part);
+}
+
+void particleSystem::addParticle(particle *p)
+{
+ if(!part) {
+ part=(particle **)calloc(1,sizeof(particle *));
+ part[0]=p;
+ particleNum=1;
+ } else {
+ particleNum++;
+ part=(particle **)realloc(part,sizeof(particle *)*particleNum);
+ part[particleNum-1]=p;
+ }
+}
+
+void particleSystem::reset(void)
+{
+ if(part)
+ free(part);
+
+ t=0.0f;
+
+ part=NULL;
+
+ particleNum=0;
+}
+
+void particleSystem::draw(void)
+{
+ if(!part)
+ return;
+
+ part[0]->beginDraw();
+ for(unsigned int i=0;i<particleNum;i++)
+ part[i]->draw();
+ part[0]->endDraw();
+}
+
+void particleSystem::addTime(float dt)
+{
+ if(!part)
+ return;
+
+ for(unsigned int i=0;i<particleNum;i++) {
+ part[i]->elapsedTime(dt);
+ part[i]->checkAge();
+ }
+}
+
+/////////////////////////////////////////
+// Rain
+/////////////////////////////////////////
+
+void rainParticle::init(void)
+{
+ age=0.0f;
+
+ acc[0]=0.0f;
+ acc[1]=-0.98f;
+ acc[2]=0.0f;
+
+ vel[0]=0.0f;
+ vel[1]=0.0f;
+ vel[2]=0.0f;
+
+ oldpos[0]=pos[0]=min[0]+(max[0]-min[0])*vrnd();
+ oldpos[1]=pos[1]=max[1]+0.2f*max[1]*vrnd();
+ oldpos[2]=pos[2]=min[2]+(max[2]-min[2])*vrnd();
+
+ vadds(oldpos,-partLength,vel);
+}
+
+rainParticle::rainParticle()
+{
+ init();
+}
+
+void rainParticle::setRainingArea(float minx, float miny, float minz,
+ float maxx, float maxy, float maxz)
+{
+ vinit(min,minx,miny,minz);
+ vinit(max,maxx,maxy,maxz);
+}
+
+void rainParticle::setLength(float l)
+{
+ partLength=l;
+}
+
+void rainParticle::draw(void)
+{
+ glColor4f(0.7f,0.95f,1.0f,0.0f);
+ glVertex3fv(oldpos);
+
+ glColor4f(0.3f,0.7f,1.0f,1.0f);
+ glVertex3fv(pos);
+}
+
+void rainParticle::checkAge(void)
+{
+ if(pos[1]<min[1])
+ init();
+}
+
+void rainParticle::elapsedTime(float dt)
+{
+ particle::elapsedTime(dt);
+
+ if(pos[0]<min[0])
+ pos[0]=max[0]-(min[0]-pos[0]);
+ if(pos[2]<min[2])
+ pos[2]=max[2]-(min[2]-pos[2]);
+
+ if(pos[0]>max[0])
+ pos[0]=min[0]+(pos[0]-max[0]);
+ if(pos[2]>max[2])
+ pos[2]=min[2]+(pos[2]-max[2]);
+
+ vequ(oldpos,pos);
+ vadds(oldpos,-partLength,vel);
+}
+
+void rainParticle::randomHeight(void)
+{
+ pos[1]=(max[1]-min[1])*vrnd()+min[1];
+
+ oldpos[1]=pos[1]-partLength*vel[1];
+}
diff --git a/progs/demos/particles.h b/progs/demos/particles.h
new file mode 100644
index 00000000000..a49dd691e4a
--- /dev/null
+++ b/progs/demos/particles.h
@@ -0,0 +1,81 @@
+/*
+ * This program is under the GNU GPL.
+ * Use at your own risk.
+ *
+ * written by David Bucciarelli ([email protected])
+ * Humanware s.r.l.
+ */
+
+#ifndef PARTICLES_H
+#define PARTICLES_H
+
+#include <GL/gl.h>
+
+class particle {
+ protected:
+ float age; // in seconds
+ float acc[3];
+ float vel[3];
+ float pos[3];
+
+ public:
+ particle();
+ virtual ~particle() {};
+
+ virtual void beginDraw(void) {};
+ virtual void draw(void)=0;
+ virtual void endDraw(void) {};
+
+ virtual void elapsedTime(float);
+ virtual void checkAge(void) {};
+};
+
+class particleSystem {
+ protected:
+ particle **part;
+
+ float t;
+
+ unsigned long particleNum;
+ public:
+ particleSystem();
+ ~particleSystem();
+
+ void addParticle(particle *);
+
+ void reset(void);
+
+ void draw(void);
+
+ void addTime(float);
+};
+
+class rainParticle : public particle {
+ protected:
+ static float min[3];
+ static float max[3];
+ static float partLength;
+
+ float oldpos[3];
+
+ void init(void);
+ public:
+ rainParticle();
+
+ static void setRainingArea(float, float, float,
+ float, float, float);
+ static void setLength(float);
+ static float getLength(void) { return partLength; };
+
+ void beginDraw(void) { glBegin(GL_LINES); };
+ void draw(void);
+ void endDraw(void) { glEnd(); };
+
+ void elapsedTime(float);
+
+ void checkAge(void);
+
+ void randomHeight(void);
+};
+
+#endif
diff --git a/progs/demos/pointblast.c b/progs/demos/pointblast.c
new file mode 100644
index 00000000000..715813f1763
--- /dev/null
+++ b/progs/demos/pointblast.c
@@ -0,0 +1,498 @@
+
+/* Copyright (c) Mark J. Kilgard, 1997. */
+
+/* This program is freely distributable without licensing fees
+ and is provided without guarantee or warrantee expressed or
+ implied. This program is -not- in the public domain. */
+
+/* This example demonstrates how to render particle effects
+ with OpenGL. A cloud of pinkish/orange particles explodes with the
+ particles bouncing off the ground. When the EXT_point_parameters
+ is present , the particle size is attenuated based on eye distance. */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h> /* for cos(), sin(), and sqrt() */
+#ifdef _WIN32
+#include <windows.h>
+#endif
+#define GL_GLEXT_PROTOTYPES
+#include <GL/glut.h>
+
+/* Some <math.h> files do not define M_PI... */
+#ifndef M_PI
+#define M_PI 3.14159265
+#endif
+
+#if 0 /* For debugging. */
+#undef GL_EXT_point_parameters
+#endif
+
+static GLfloat angle = -150; /* in degrees */
+static int spin = 0;
+static int moving, begin;
+static int newModel = 1;
+static float theTime;
+static int repeat = 1;
+static int blend = 1;
+int useMipmaps = 1;
+int linearFiltering = 1;
+
+static GLfloat constant[3] = { 1/5.0, 0.0, 0.0 };
+static GLfloat linear[3] = { 0.0, 1/5.0, 0.0 };
+static GLfloat theQuad[3] = { 0.25, 0.0, 1/60.0 };
+
+#define MAX_POINTS 2000
+
+static int numPoints = 200;
+
+static GLfloat pointList[MAX_POINTS][3];
+static GLfloat pointTime[MAX_POINTS];
+static GLfloat pointVelocity[MAX_POINTS][2];
+static GLfloat pointDirection[MAX_POINTS][2];
+static int colorList[MAX_POINTS];
+static int animate = 1, motion = 0;
+
+static GLfloat colorSet[][4] = {
+ /* Shades of red. */
+ { 0.7, 0.2, 0.4, 0.5 },
+ { 0.8, 0.0, 0.7, 0.5 },
+ { 1.0, 0.0, 0.0, 0.5 },
+ { 0.9, 0.3, 0.6, 0.5 },
+ { 1.0, 0.4, 0.0, 0.5 },
+ { 1.0, 0.0, 0.5, 0.5 },
+};
+
+#define NUM_COLORS (sizeof(colorSet)/sizeof(colorSet[0]))
+
+#define DEAD (NUM_COLORS+1)
+
+
+#if 0 /* drand48 might be better on Unix machines */
+#define RANDOM_RANGE(lo, hi) ((lo) + (hi - lo) * drand48())
+#else
+static float float_rand(void) { return rand() / (float) RAND_MAX; }
+#define RANDOM_RANGE(lo, hi) ((lo) + (hi - lo) * float_rand())
+#endif
+
+#define MEAN_VELOCITY 3.0
+#define GRAVITY 2.0
+
+/* Modeling units of ground extent in each X and Z direction. */
+#define EDGE 12
+
+static void
+makePointList(void)
+{
+ float angle, velocity, direction;
+ int i;
+
+ motion = 1;
+ for (i=0; i<numPoints; i++) {
+ pointList[i][0] = 0.0;
+ pointList[i][1] = 0.0;
+ pointList[i][2] = 0.0;
+ pointTime[i] = 0.0;
+ angle = (RANDOM_RANGE(60.0, 70.0)) * M_PI/180.0;
+ direction = RANDOM_RANGE(0.0, 360.0) * M_PI/180.0;
+ pointDirection[i][0] = cos(direction);
+ pointDirection[i][1] = sin(direction);
+ velocity = MEAN_VELOCITY + RANDOM_RANGE(-0.8, 1.0);
+ pointVelocity[i][0] = velocity * cos(angle);
+ pointVelocity[i][1] = velocity * sin(angle);
+ colorList[i] = rand() % NUM_COLORS;
+ }
+ theTime = 0.0;
+}
+
+static void
+updatePointList(void)
+{
+ float distance;
+ int i;
+
+ static double t0 = -1.;
+ double dt, t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
+ if (t0 < 0.0)
+ t0 = t;
+ dt = t - t0;
+ t0 = t;
+
+ motion = 0;
+ for (i=0; i<numPoints; i++) {
+ distance = pointVelocity[i][0] * theTime;
+
+ /* X and Z */
+ pointList[i][0] = pointDirection[i][0] * distance;
+ pointList[i][2] = pointDirection[i][1] * distance;
+
+ /* Z */
+ pointList[i][1] =
+ (pointVelocity[i][1] - 0.5 * GRAVITY * pointTime[i])*pointTime[i];
+
+ /* If we hit the ground, bounce the point upward again. */
+ if (pointList[i][1] <= 0.0) {
+ if (distance > EDGE) {
+ /* Particle has hit ground past the distance duration of
+ the particles. Mark particle as dead. */
+ colorList[i] = NUM_COLORS; /* Not moving. */
+ continue;
+ }
+
+ pointVelocity[i][1] *= 0.8; /* 80% of previous up velocity. */
+ pointTime[i] = 0.0; /* Reset the particles sense of up time. */
+ }
+ motion = 1;
+ pointTime[i] += dt;
+ }
+ theTime += dt;
+ if (!motion && !spin) {
+ if (repeat) {
+ makePointList();
+ } else {
+ glutIdleFunc(NULL);
+ }
+ }
+}
+
+static void
+idle(void)
+{
+ updatePointList();
+ if (spin) {
+ angle += 0.3;
+ newModel = 1;
+ }
+ glutPostRedisplay();
+}
+
+static void
+visible(int vis)
+{
+ if (vis == GLUT_VISIBLE) {
+ if (animate && (motion || spin)) {
+ glutIdleFunc(idle);
+ }
+ } else {
+ glutIdleFunc(NULL);
+ }
+}
+
+static void
+recalcModelView(void)
+{
+ glPopMatrix();
+ glPushMatrix();
+ glRotatef(angle, 0.0, 1.0, 0.0);
+ newModel = 0;
+}
+
+static void
+redraw(void)
+{
+ int i;
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ if (newModel)
+ recalcModelView();
+
+ glDepthMask(GL_FALSE);
+
+ /* Draw the floor. */
+/* glEnable(GL_TEXTURE_2D);*/
+ glColor3f(0.5, 1.0, 0.5);
+ glBegin(GL_QUADS);
+ glTexCoord2f(0.0, 0.0);
+ glVertex3f(-EDGE, -0.05, -EDGE);
+ glTexCoord2f(20.0, 0.0);
+ glVertex3f(EDGE, -0.05, -EDGE);
+ glTexCoord2f(20.0, 20.0);
+ glVertex3f(EDGE, -0.05, EDGE);
+ glTexCoord2f(0.0, 20.0);
+ glVertex3f(-EDGE, -0.05, EDGE);
+ glEnd();
+
+ /* Allow particles to blend with each other. */
+ glDepthMask(GL_TRUE);
+
+ if (blend)
+ glEnable(GL_BLEND);
+
+ glDisable(GL_TEXTURE_2D);
+ glBegin(GL_POINTS);
+ for (i=0; i<numPoints; i++) {
+ /* Draw alive particles. */
+ if (colorList[i] != DEAD) {
+ glColor4fv(colorSet[colorList[i]]);
+ glVertex3fv(pointList[i]);
+ }
+ }
+ glEnd();
+
+ glDisable(GL_BLEND);
+
+ glutSwapBuffers();
+}
+
+/* ARGSUSED2 */
+static void
+mouse(int button, int state, int x, int y)
+{
+ /* Scene can be spun around Y axis using left
+ mouse button movement. */
+ if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) {
+ moving = 1;
+ begin = x;
+ }
+ if (button == GLUT_LEFT_BUTTON && state == GLUT_UP) {
+ moving = 0;
+ }
+}
+
+/* ARGSUSED1 */
+static void
+mouseMotion(int x, int y)
+{
+ if (moving) {
+ angle = angle + (x - begin);
+ begin = x;
+ newModel = 1;
+ glutPostRedisplay();
+ }
+}
+
+static void
+menu(int option)
+{
+ switch (option) {
+ case 0:
+ makePointList();
+ break;
+#ifdef GL_ARB_point_parameters
+ case 1:
+ glPointParameterfvARB(GL_POINT_DISTANCE_ATTENUATION_ARB, constant);
+ break;
+ case 2:
+ glPointParameterfvARB(GL_POINT_DISTANCE_ATTENUATION_ARB, linear);
+ break;
+ case 3:
+ glPointParameterfvARB(GL_POINT_DISTANCE_ATTENUATION_ARB, theQuad);
+ break;
+#endif
+ case 4:
+ blend = 1;
+ break;
+ case 5:
+ blend = 0;
+ break;
+#ifdef GL_ARB_point_parameters
+ case 6:
+ glPointParameterfARB(GL_POINT_FADE_THRESHOLD_SIZE_ARB, 1.0);
+ break;
+ case 7:
+ glPointParameterfARB(GL_POINT_FADE_THRESHOLD_SIZE_ARB, 10.0);
+ break;
+#endif
+ case 8:
+ glEnable(GL_POINT_SMOOTH);
+ break;
+ case 9:
+ glDisable(GL_POINT_SMOOTH);
+ break;
+ case 10:
+ glPointSize(2.0);
+ break;
+ case 11:
+ glPointSize(4.0);
+ break;
+ case 12:
+ glPointSize(8.0);
+ break;
+ case 13:
+ spin = 1 - spin;
+ if (animate && (spin || motion)) {
+ glutIdleFunc(idle);
+ } else {
+ glutIdleFunc(NULL);
+ }
+ break;
+ case 14:
+ numPoints = 200;
+ break;
+ case 15:
+ numPoints = 500;
+ break;
+ case 16:
+ numPoints = 1000;
+ break;
+ case 17:
+ numPoints = 2000;
+ break;
+ case 666:
+ exit(0);
+ }
+ glutPostRedisplay();
+}
+
+/* ARGSUSED1 */
+static void
+key(unsigned char c, int x, int y)
+{
+ switch (c) {
+ case 13:
+ animate = 1 - animate; /* toggle. */
+ if (animate && (motion || spin)) {
+ glutIdleFunc(idle);
+ } else {
+ glutIdleFunc(NULL);
+ }
+ break;
+ case ' ':
+ animate = 1;
+ makePointList();
+ glutIdleFunc(idle);
+ break;
+ case 27:
+ exit(0);
+ }
+}
+
+/* Nice floor texture tiling pattern. */
+static char *circles[] = {
+ "....xxxx........",
+ "..xxxxxxxx......",
+ ".xxxxxxxxxx.....",
+ ".xxx....xxx.....",
+ "xxx......xxx....",
+ "xxx......xxx....",
+ "xxx......xxx....",
+ "xxx......xxx....",
+ ".xxx....xxx.....",
+ ".xxxxxxxxxx.....",
+ "..xxxxxxxx......",
+ "....xxxx........",
+ "................",
+ "................",
+ "................",
+ "................",
+};
+
+static void
+makeFloorTexture(void)
+{
+ GLubyte floorTexture[16][16][3];
+ GLubyte *loc;
+ int s, t;
+
+ /* Setup RGB image for the texture. */
+ loc = (GLubyte*) floorTexture;
+ for (t = 0; t < 16; t++) {
+ for (s = 0; s < 16; s++) {
+ if (circles[t][s] == 'x') {
+ /* Nice blue. */
+ loc[0] = 0x1f;
+ loc[1] = 0x1f;
+ loc[2] = 0x8f;
+ } else {
+ /* Light gray. */
+ loc[0] = 0xca;
+ loc[1] = 0xca;
+ loc[2] = 0xca;
+ }
+ loc += 3;
+ }
+ }
+
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+
+ if (useMipmaps) {
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
+ GL_LINEAR_MIPMAP_LINEAR);
+ gluBuild2DMipmaps(GL_TEXTURE_2D, 3, 16, 16,
+ GL_RGB, GL_UNSIGNED_BYTE, floorTexture);
+ } else {
+ if (linearFiltering) {
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ } else {
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ }
+ glTexImage2D(GL_TEXTURE_2D, 0, 3, 16, 16, 0,
+ GL_RGB, GL_UNSIGNED_BYTE, floorTexture);
+ }
+}
+
+int
+main(int argc, char **argv)
+{
+ int i;
+ glutInit(&argc, argv);
+ glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH | GLUT_MULTISAMPLE);
+ glutInitWindowPosition(0, 0);
+ glutInitWindowSize(300, 300);
+
+ for (i=1; i<argc; i++) {
+ if(!strcmp("-noms", argv[i])) {
+ glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
+ printf("forcing no multisampling\n");
+ } else if(!strcmp("-nomipmaps", argv[i])) {
+ useMipmaps = 0;
+ } else if(!strcmp("-nearest", argv[i])) {
+ linearFiltering = 0;
+ }
+ }
+
+ glutCreateWindow("point burst");
+ glutDisplayFunc(redraw);
+ glutMouseFunc(mouse);
+ glutMotionFunc(mouseMotion);
+ glutVisibilityFunc(visible);
+ glutKeyboardFunc(key);
+ glutCreateMenu(menu);
+ glutAddMenuEntry("Reset time", 0);
+ glutAddMenuEntry("Constant", 1);
+ glutAddMenuEntry("Linear", 2);
+ glutAddMenuEntry("Quadratic", 3);
+ glutAddMenuEntry("Blend on", 4);
+ glutAddMenuEntry("Blend off", 5);
+ glutAddMenuEntry("Threshold 1", 6);
+ glutAddMenuEntry("Threshold 10", 7);
+ glutAddMenuEntry("Point smooth on", 8);
+ glutAddMenuEntry("Point smooth off", 9);
+ glutAddMenuEntry("Point size 2", 10);
+ glutAddMenuEntry("Point size 4", 11);
+ glutAddMenuEntry("Point size 8", 12);
+ glutAddMenuEntry("Toggle spin", 13);
+ glutAddMenuEntry("200 points ", 14);
+ glutAddMenuEntry("500 points ", 15);
+ glutAddMenuEntry("1000 points ", 16);
+ glutAddMenuEntry("2000 points ", 17);
+ glutAddMenuEntry("Quit", 666);
+ glutAttachMenu(GLUT_RIGHT_BUTTON);
+
+ glShadeModel(GL_FLAT);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_POINT_SMOOTH);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glPointSize(8.0);
+#if GL_ARB_point_parameters
+ glPointParameterfvARB(GL_POINT_DISTANCE_ATTENUATION_ARB, theQuad);
+#endif
+ glMatrixMode(GL_PROJECTION);
+ gluPerspective( /* field of view in degree */ 40.0,
+ /* aspect ratio */ 1.0,
+ /* Z near */ 0.5, /* Z far */ 40.0);
+ glMatrixMode(GL_MODELVIEW);
+ gluLookAt(0.0, 1.0, 8.0, /* eye location */
+ 0.0, 1.0, 0.0, /* center is at (0,0,0) */
+ 0.0, 1.0, 0.); /* up is in postivie Y direction */
+ glPushMatrix(); /* dummy push so we can pop on model
+ recalc */
+
+ makePointList();
+ makeFloorTexture();
+
+ glutMainLoop();
+ return 0; /* ANSI C requires main to return int. */
+}
diff --git a/progs/demos/rain.cxx b/progs/demos/rain.cxx
new file mode 100644
index 00000000000..d19f049c5f3
--- /dev/null
+++ b/progs/demos/rain.cxx
@@ -0,0 +1,394 @@
+/*
+ * This program is under the GNU GPL.
+ * Use at your own risk.
+ *
+ * written by David Bucciarelli ([email protected])
+ * Humanware s.r.l.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <time.h>
+#include <GL/glut.h>
+#ifndef M_PI
+#define M_PI 3.14159265
+#endif
+
+#include "particles.h"
+extern "C" {
+#include "readtex.h"
+}
+
+#ifdef _WIN32
+#include <windows.h>
+#include <mmsystem.h>
+#include "particles.cxx"
+#include "readtex.c"
+#endif
+
+#ifdef XMESA
+#include "GL/xmesa.h"
+static int fullscreen=1;
+#endif
+
+static int WIDTH=640;
+static int HEIGHT=480;
+static int NUMPART=7500;
+
+#define FRAME 50
+
+static float fogcolor[4]={1.0,1.0,1.0,1.0};
+
+#define DIMP 40.0
+#define DIMTP 32.0
+
+static float q[4][3]={
+ {-DIMP,0.0,-DIMP},
+ {DIMP,0.0,-DIMP},
+ {DIMP,0.0,DIMP},
+ {-DIMP,0.0,DIMP}
+};
+
+static float qt[4][2]={
+ {-DIMTP,-DIMTP},
+ {DIMTP,-DIMTP},
+ {DIMTP,DIMTP},
+ {-DIMTP,DIMTP}
+};
+
+static int win=0;
+
+static int fog=1;
+static int help=1;
+
+static GLuint groundid;
+
+static float obs[3]={2.0,1.0,0.0};
+static float dir[3];
+static float v=0.0;
+static float alpha=-90.0;
+static float beta=90.0;
+
+static particleSystem *ps;
+
+static float gettime()
+{
+ static clock_t told=0;
+ clock_t tnew,ris;
+
+ tnew=clock();
+
+ ris=tnew-told;
+
+ told=tnew;
+
+ return(ris/(float)CLOCKS_PER_SEC);
+}
+
+static float gettimerain()
+{
+ static clock_t told=0;
+ clock_t tnew,ris;
+
+ tnew=clock();
+
+ ris=tnew-told;
+
+ told=tnew;
+
+ return(ris/(float)CLOCKS_PER_SEC);
+}
+
+static void calcposobs(void)
+{
+ dir[0]=sin(alpha*M_PI/180.0);
+ dir[2]=cos(alpha*M_PI/180.0)*sin(beta*M_PI/180.0);
+ dir[1]=cos(beta*M_PI/180.0);
+
+ obs[0]+=v*dir[0];
+ obs[1]+=v*dir[1];
+ obs[2]+=v*dir[2];
+
+ rainParticle::setRainingArea(obs[0]-7.0f,-0.2f,obs[2]-7.0f,obs[0]+7.0f,8.0f,obs[2]+7.0f);
+}
+
+static void printstring(void *font, char *string)
+{
+ int len,i;
+
+ len=(int)strlen(string);
+ for(i=0;i<len;i++)
+ glutBitmapCharacter(font,string[i]);
+}
+
+static void reshape(int width, int height)
+{
+ WIDTH=width;
+ HEIGHT=height;
+ glViewport(0,0,(GLint)width,(GLint)height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(70.0,width/(float)height,0.1,30.0);
+
+ glMatrixMode(GL_MODELVIEW);
+}
+
+static void printhelp(void)
+{
+ glEnable(GL_BLEND);
+ glColor4f(0.0,0.0,0.0,0.5);
+ glRecti(40,40,600,440);
+ glDisable(GL_BLEND);
+
+ glColor3f(1.0,0.0,0.0);
+ glRasterPos2i(300,420);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24,"Help");
+
+ glRasterPos2i(60,390);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24,"h - Toggle Help");
+
+ glRasterPos2i(60,360);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24,"f - Toggle Fog");
+ glRasterPos2i(60,330);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24,"Arrow Keys - Rotate");
+ glRasterPos2i(60,300);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24,"a - Increase velocity");
+ glRasterPos2i(60,270);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24,"z - Decrease velocity");
+ glRasterPos2i(60,240);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24,"l - Increase rain length");
+ glRasterPos2i(60,210);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24,"k - Increase rain length");
+}
+
+static void drawrain(void)
+{
+ static int count=0;
+ static char frbuf[80];
+ float fr;
+
+ glEnable(GL_DEPTH_TEST);
+
+ if(fog)
+ glEnable(GL_FOG);
+ else
+ glDisable(GL_FOG);
+
+ glDepthMask(GL_TRUE);
+ glClearColor(1.0,1.0,1.0,1.0);
+ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix();
+ calcposobs();
+ gluLookAt(obs[0],obs[1],obs[2],
+ obs[0]+dir[0],obs[1]+dir[1],obs[2]+dir[2],
+ 0.0,1.0,0.0);
+
+ glColor4f(1.0,1.0,1.0,1.0);
+
+ glEnable(GL_TEXTURE_2D);
+
+ glBindTexture(GL_TEXTURE_2D,groundid);
+ glBegin(GL_QUADS);
+ glTexCoord2fv(qt[0]);
+ glVertex3fv(q[0]);
+ glTexCoord2fv(qt[1]);
+ glVertex3fv(q[1]);
+ glTexCoord2fv(qt[2]);
+ glVertex3fv(q[2]);
+ glTexCoord2fv(qt[3]);
+ glVertex3fv(q[3]);
+ glEnd();
+
+ // Particle System
+
+ glDisable(GL_TEXTURE_2D);
+ glShadeModel(GL_SMOOTH);
+ glEnable(GL_BLEND);
+
+ ps->draw();
+ ps->addTime(gettimerain());
+
+ glShadeModel(GL_FLAT);
+
+
+ if((count % FRAME)==0) {
+ fr=gettime();
+ sprintf(frbuf,"Frame rate: %f",FRAME/fr);
+ }
+
+ glDisable(GL_TEXTURE_2D);
+ glDisable(GL_DEPTH_TEST);
+ glDisable(GL_FOG);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glOrtho(-0.5,639.5,-0.5,479.5,-1.0,1.0);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ glColor3f(1.0,0.0,0.0);
+ glRasterPos2i(10,10);
+ printstring(GLUT_BITMAP_HELVETICA_18,frbuf);
+ glRasterPos2i(350,470);
+ printstring(GLUT_BITMAP_HELVETICA_10,"Rain V1.0 Written by David Bucciarelli ([email protected])");
+
+ if(help)
+ printhelp();
+
+ reshape(WIDTH,HEIGHT);
+ glPopMatrix();
+
+ glutSwapBuffers();
+
+ count++;
+}
+
+
+static void special(int key, int x, int y)
+{
+ switch (key) {
+ case GLUT_KEY_LEFT:
+ alpha+=2.0;
+ break;
+ case GLUT_KEY_RIGHT:
+ alpha-=2.0;
+ break;
+ case GLUT_KEY_DOWN:
+ beta-=2.0;
+ break;
+ case GLUT_KEY_UP:
+ beta+=2.0;
+ break;
+ }
+}
+
+static void key(unsigned char key, int x, int y)
+{
+ switch (key) {
+ case 27:
+ exit(0);
+ break;
+
+ case 'a':
+ v+=0.01;
+ break;
+ case 'z':
+ v-=0.01;
+ break;
+
+ case 'l':
+ rainParticle::setLength(rainParticle::getLength()+0.025f);
+ break;
+ case 'k':
+ rainParticle::setLength(rainParticle::getLength()-0.025f);
+ break;
+
+ case 'h':
+ help=(!help);
+ break;
+ case 'f':
+ fog=(!fog);
+ break;
+#ifdef XMESA
+ case ' ':
+ XMesaSetFXmode(fullscreen ? XMESA_FX_FULLSCREEN : XMESA_FX_WINDOW);
+ fullscreen=(!fullscreen);
+ break;
+#endif
+ }
+}
+
+static void inittextures(void)
+{
+ GLubyte *img;
+ GLint width,height;
+ GLenum format;
+ GLenum gluerr;
+
+ glGenTextures(1,&groundid);
+ glBindTexture(GL_TEXTURE_2D,groundid);
+
+ if(!(img=LoadRGBImage("../images/s128.rgb",&width,&height,&format))){
+ fprintf(stderr,"Error reading a texture.\n");
+ exit(-1);
+ }
+ glPixelStorei(GL_UNPACK_ALIGNMENT,4);
+ if((gluerr=(GLenum)gluBuild2DMipmaps(GL_TEXTURE_2D, 3, width, height,GL_RGB,
+ GL_UNSIGNED_BYTE, (GLvoid *)(img)))) {
+ fprintf(stderr,"GLULib%s\n",gluErrorString(gluerr));
+ exit(-1);
+ }
+
+ 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_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);
+ glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
+
+ glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);
+}
+
+static void initparticle(void)
+{
+ ps=new particleSystem;
+
+ rainParticle::setRainingArea(-7.0f,-0.2f,-7.0f,7.0f,8.0f,7.0f);
+
+ for(int i=0;i<NUMPART;i++) {
+ rainParticle *p=new rainParticle;
+ p->randomHeight();
+
+ ps->addParticle((particle *)p);
+ }
+}
+
+int main(int ac,char **av)
+{
+ fprintf(stderr,"Rain V1.0\nWritten by David Bucciarelli ([email protected])\n");
+
+ /* Default settings */
+
+ WIDTH=640;
+ HEIGHT=480;
+
+ glutInitWindowPosition(0,0);
+ glutInitWindowSize(WIDTH,HEIGHT);
+ glutInit(&ac,av);
+
+ glutInitDisplayMode(GLUT_RGB|GLUT_DEPTH|GLUT_DOUBLE);
+
+ if(!(win=glutCreateWindow("Rain"))) {
+ fprintf(stderr,"Error opening a window.\n");
+ exit(-1);
+ }
+
+ reshape(WIDTH,HEIGHT);
+
+ inittextures();
+
+ glShadeModel(GL_FLAT);
+ glEnable(GL_DEPTH_TEST);
+
+ glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
+
+ glEnable(GL_FOG);
+ glFogi(GL_FOG_MODE,GL_EXP);
+ glFogfv(GL_FOG_COLOR,fogcolor);
+ glFogf(GL_FOG_DENSITY,0.1);
+#ifdef FX
+ glHint(GL_FOG_HINT,GL_NICEST);
+#endif
+
+ initparticle();
+
+ glutKeyboardFunc(key);
+ glutSpecialFunc(special);
+ glutDisplayFunc(drawrain);
+ glutIdleFunc(drawrain);
+ glutReshapeFunc(reshape);
+ glutMainLoop();
+
+ return(0);
+}
diff --git a/progs/demos/ray.c b/progs/demos/ray.c
new file mode 100644
index 00000000000..c2d8e4f545e
--- /dev/null
+++ b/progs/demos/ray.c
@@ -0,0 +1,904 @@
+/*
+ * This program is under the GNU GPL.
+ * Use at your own risk.
+ *
+ * written by David Bucciarelli ([email protected])
+ * Humanware s.r.l.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+
+#ifdef WIN32
+#include <windows.h>
+#endif
+
+#include <GL/glut.h>
+
+#ifdef XMESA
+#include "GL/xmesa.h"
+static int fullscreen = 1;
+#endif
+
+static int WIDTH = 640;
+static int HEIGHT = 480;
+
+static GLint T0 = 0;
+static GLint Frames = 0;
+
+#define BASESIZE 7.5f
+#define SPHERE_RADIUS 0.75f
+
+#define TEX_CHECK_WIDTH 256
+#define TEX_CHECK_HEIGHT 256
+#define TEX_CHECK_SLOT_SIZE (TEX_CHECK_HEIGHT/16)
+#define TEX_CHECK_NUMSLOT (TEX_CHECK_HEIGHT/TEX_CHECK_SLOT_SIZE)
+
+#define TEX_REFLECT_WIDTH 256
+#define TEX_REFLECT_HEIGHT 256
+#define TEX_REFLECT_SLOT_SIZE (TEX_REFLECT_HEIGHT/16)
+#define TEX_REFLECT_NUMSLOT (TEX_REFLECT_HEIGHT/TEX_REFLECT_SLOT_SIZE)
+
+#ifndef M_PI
+#define M_PI 3.1415926535
+#endif
+
+#define EPSILON 0.0001
+
+#define clamp255(a) ( (a)<(0.0f) ? (0.0f) : ((a)>(255.0f) ? (255.0f) : (a)) )
+
+#ifndef fabs
+#define fabs(x) ((x)<0.0f?-(x):(x))
+#endif
+
+#define vequ(a,b) { (a)[0]=(b)[0]; (a)[1]=(b)[1]; (a)[2]=(b)[2]; }
+#define vsub(a,b,c) { (a)[0]=(b)[0]-(c)[0]; (a)[1]=(b)[1]-(c)[1]; (a)[2]=(b)[2]-(c)[2]; }
+#define dprod(a,b) ((a)[0]*(b)[0]+(a)[1]*(b)[1]+(a)[2]*(b)[2])
+#define vnormalize(a,b) { \
+ register float m_norm; \
+ m_norm=sqrt((double)dprod((a),(a))); \
+ (a)[0] /=m_norm; \
+ (a)[1] /=m_norm; \
+ (a)[2] /=m_norm; }
+
+static GLubyte checkmap[TEX_CHECK_HEIGHT][TEX_CHECK_WIDTH][3];
+static GLuint checkid;
+static int checkmap_currentslot = 0;
+
+static GLubyte reflectmap[TEX_REFLECT_HEIGHT][TEX_REFLECT_WIDTH][3];
+static GLuint reflectid;
+static int reflectmap_currentslot = 0;
+
+static GLuint lightdlist;
+static GLuint objdlist;
+
+static float lightpos[3] = { 2.1, 2.1, 2.8 };
+static float objpos[3] = { 0.0, 0.0, 1.0 };
+
+static float sphere_pos[TEX_CHECK_HEIGHT][TEX_REFLECT_WIDTH][3];
+
+static int win = 0;
+
+static float fogcolor[4] = { 0.05, 0.05, 0.05, 1.0 };
+
+static float obs[3] = { 7.0, 0.0, 2.0 };
+static float dir[3];
+static float v = 0.0;
+static float alpha = -90.0;
+static float beta = 90.0;
+
+static int fog = 1;
+static int bfcull = 1;
+static int poutline = 0;
+static int help = 1;
+static int showcheckmap = 1;
+static int showreflectmap = 1;
+static int joyavailable = 0;
+static int joyactive = 0;
+
+static void
+calcposobs(void)
+{
+ dir[0] = sin(alpha * M_PI / 180.0);
+ dir[1] = cos(alpha * M_PI / 180.0) * sin(beta * M_PI / 180.0);
+ dir[2] = cos(beta * M_PI / 180.0);
+
+ if (dir[0] < 1.0e-5 && dir[0] > -1.0e-5)
+ dir[0] = 0;
+ if (dir[1] < 1.0e-5 && dir[1] > -1.0e-5)
+ dir[1] = 0;
+ if (dir[2] < 1.0e-5 && dir[2] > -1.0e-5)
+ dir[2] = 0;
+
+ obs[0] += v * dir[0];
+ obs[1] += v * dir[1];
+ obs[2] += v * dir[2];
+}
+
+static void
+special(int k, int x, int y)
+{
+ switch (k) {
+ case GLUT_KEY_LEFT:
+ alpha -= 2.0;
+ break;
+ case GLUT_KEY_RIGHT:
+ alpha += 2.0;
+ break;
+ case GLUT_KEY_DOWN:
+ beta -= 2.0;
+ break;
+ case GLUT_KEY_UP:
+ beta += 2.0;
+ break;
+ }
+}
+
+static void
+key(unsigned char k, int x, int y)
+{
+ switch (k) {
+ case 27:
+ exit(0);
+ break;
+
+ case 's':
+ lightpos[1] -= 0.1;
+ break;
+ case 'd':
+ lightpos[1] += 0.1;
+ break;
+ case 'e':
+ lightpos[0] -= 0.1;
+ break;
+ case 'x':
+ lightpos[0] += 0.1;
+ break;
+ case 'w':
+ lightpos[2] -= 0.1;
+ break;
+ case 'r':
+ lightpos[2] += 0.1;
+ break;
+
+ case 'j':
+ objpos[1] -= 0.1;
+ break;
+ case 'k':
+ objpos[1] += 0.1;
+ break;
+ case 'i':
+ objpos[0] -= 0.1;
+ break;
+ case 'm':
+ objpos[0] += 0.1;
+ break;
+ case 'u':
+ objpos[2] -= 0.1;
+ break;
+ case 'o':
+ objpos[2] += 0.1;
+ break;
+
+ case 'a':
+ v += 0.005;
+ break;
+ case 'z':
+ v -= 0.005;
+ break;
+
+ case 'g':
+ joyactive = (!joyactive);
+ break;
+ case 'h':
+ help = (!help);
+ break;
+ case 'f':
+ fog = (!fog);
+ break;
+
+ case '1':
+ showcheckmap = (!showcheckmap);
+ break;
+ case '2':
+ showreflectmap = (!showreflectmap);
+ break;
+
+ case 'b':
+ if (bfcull) {
+ glDisable(GL_CULL_FACE);
+ bfcull = 0;
+ }
+ else {
+ glEnable(GL_CULL_FACE);
+ bfcull = 1;
+ }
+ break;
+ case 'p':
+ if (poutline) {
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ poutline = 0;
+ }
+ else {
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ poutline = 1;
+ }
+ break;
+#ifdef XMESA
+ case ' ':
+ XMesaSetFXmode(fullscreen ? XMESA_FX_FULLSCREEN : XMESA_FX_WINDOW);
+ fullscreen = (!fullscreen);
+ break;
+#endif
+ }
+}
+
+static void
+reshape(int w, int h)
+{
+ WIDTH = w;
+ HEIGHT = h;
+ glViewport(0, 0, w, h);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(45.0, w / (float) h, 0.8, 40.0);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+}
+
+static void
+printstring(void *font, char *string)
+{
+ int len, i;
+
+ len = (int) strlen(string);
+ for (i = 0; i < len; i++)
+ glutBitmapCharacter(font, string[i]);
+}
+
+static void
+printhelp(void)
+{
+ glEnable(GL_BLEND);
+ glColor4f(0.5, 0.5, 0.5, 0.5);
+ glRecti(40, 40, 600, 440);
+ glDisable(GL_BLEND);
+
+ glColor3f(0.0, 0.0, 1.0);
+ glRasterPos2i(300, 420);
+ printstring(GLUT_BITMAP_HELVETICA_18, "Help");
+
+ glRasterPos2i(60, 390);
+ printstring(GLUT_BITMAP_HELVETICA_12, "h - Toggle Help");
+ glRasterPos2i(60, 370);
+ printstring(GLUT_BITMAP_HELVETICA_12, "f - Toggle Fog");
+ glRasterPos2i(60, 350);
+ printstring(GLUT_BITMAP_HELVETICA_12, "b - Toggle Back face culling");
+ glRasterPos2i(60, 330);
+ printstring(GLUT_BITMAP_HELVETICA_12, "p - Toggle Wire frame");
+ glRasterPos2i(60, 310);
+ printstring(GLUT_BITMAP_HELVETICA_12, "Arrow Keys - Rotate");
+ glRasterPos2i(60, 290);
+ printstring(GLUT_BITMAP_HELVETICA_12, "a - Increase velocity");
+ glRasterPos2i(60, 270);
+ printstring(GLUT_BITMAP_HELVETICA_12, "z - Decrease velocity");
+
+ glRasterPos2i(60, 250);
+ if (joyavailable)
+ printstring(GLUT_BITMAP_HELVETICA_12,
+ "j - Toggle jostick control (Joystick control available)");
+ else
+ printstring(GLUT_BITMAP_HELVETICA_12,
+ "(No Joystick control available)");
+
+ glRasterPos2i(60, 230);
+ printstring(GLUT_BITMAP_HELVETICA_12,
+ "To move the light source: s - left, d - right, e - far, x - near, w - down r - up");
+ glRasterPos2i(60, 210);
+ printstring(GLUT_BITMAP_HELVETICA_12,
+ "To move the mirror sphere: j - left, k - right, i - far, m - near, u - down o - up");
+
+ glRasterPos2i(60, 190);
+ printstring(GLUT_BITMAP_HELVETICA_12,
+ "1 - Toggle the plane texture map window");
+
+ glRasterPos2i(60, 170);
+ printstring(GLUT_BITMAP_HELVETICA_12,
+ "2 - Toggle the sphere texture map window");
+}
+
+static GLboolean
+seelight(float p[3], float dir[3])
+{
+ float c[3], b, a, d, t, dist[3];
+
+ vsub(c, p, objpos);
+ b = -dprod(c, dir);
+ a = dprod(c, c) - SPHERE_RADIUS * SPHERE_RADIUS;
+
+ if ((d = b * b - a) < 0.0 || (b < 0.0 && a > 0.0))
+ return GL_FALSE;
+
+ d = sqrt(d);
+
+ t = b - d;
+
+ if (t < EPSILON) {
+ t = b + d;
+ if (t < EPSILON)
+ return GL_FALSE;
+ }
+
+ vsub(dist, lightpos, p);
+ if (dprod(dist, dist) < t * t)
+ return GL_FALSE;
+
+ return GL_TRUE;
+}
+
+static int
+colorcheckmap(float ppos[3], float c[3])
+{
+ static float norm[3] = { 0.0f, 0.0f, 1.0f };
+ float ldir[3], vdir[3], h[3], dfact, kfact, r, g, b;
+ int x, y;
+
+ x = (int) ((ppos[0] + BASESIZE / 2) * (10.0f / BASESIZE));
+ if ((x < 0) || (x > 10))
+ return GL_FALSE;
+
+ y = (int) ((ppos[1] + BASESIZE / 2) * (10.0f / BASESIZE));
+ if ((y < 0) || (y > 10))
+ return GL_FALSE;
+
+ r = 255.0f;
+ if (y & 1) {
+ if (x & 1)
+ g = 255.0f;
+ else
+ g = 0.0f;
+ }
+ else {
+ if (x & 1)
+ g = 0.0f;
+ else
+ g = 255.0f;
+ }
+ b = 0.0f;
+
+ vsub(ldir, lightpos, ppos);
+ vnormalize(ldir, ldir);
+
+ if (seelight(ppos, ldir)) {
+ c[0] = r * 0.05f;
+ c[1] = g * 0.05f;
+ c[2] = b * 0.05f;
+
+ return GL_TRUE;
+ }
+
+ dfact = dprod(ldir, norm);
+ if (dfact < 0.0f)
+ dfact = 0.0f;
+
+ vsub(vdir, obs, ppos);
+ vnormalize(vdir, vdir);
+ h[0] = 0.5f * (vdir[0] + ldir[0]);
+ h[1] = 0.5f * (vdir[1] + ldir[1]);
+ h[2] = 0.5f * (vdir[2] + ldir[2]);
+ kfact = dprod(h, norm);
+ kfact = pow(kfact, 6.0) * 7.0 * 255.0;
+
+ r = r * dfact + kfact;
+ g = g * dfact + kfact;
+ b = b * dfact + kfact;
+
+ c[0] = clamp255(r);
+ c[1] = clamp255(g);
+ c[2] = clamp255(b);
+
+ return GL_TRUE;
+}
+
+static void
+updatecheckmap(int slot)
+{
+ float c[3], ppos[3];
+ int x, y;
+
+ glBindTexture(GL_TEXTURE_2D, checkid);
+
+ ppos[2] = 0.0f;
+ for (y = slot * TEX_CHECK_SLOT_SIZE; y < (slot + 1) * TEX_CHECK_SLOT_SIZE;
+ y++) {
+ ppos[1] = (y / (float) TEX_CHECK_HEIGHT) * BASESIZE - BASESIZE / 2;
+
+ for (x = 0; x < TEX_CHECK_WIDTH; x++) {
+ ppos[0] = (x / (float) TEX_CHECK_WIDTH) * BASESIZE - BASESIZE / 2;
+
+ colorcheckmap(ppos, c);
+ checkmap[y][x][0] = (GLubyte) c[0];
+ checkmap[y][x][1] = (GLubyte) c[1];
+ checkmap[y][x][2] = (GLubyte) c[2];
+ }
+ }
+
+ glTexSubImage2D(GL_TEXTURE_2D, 0, 0, slot * TEX_CHECK_SLOT_SIZE,
+ TEX_CHECK_WIDTH, TEX_CHECK_SLOT_SIZE, GL_RGB,
+ GL_UNSIGNED_BYTE,
+ &checkmap[slot * TEX_CHECK_SLOT_SIZE][0][0]);
+
+}
+
+static void
+updatereflectmap(int slot)
+{
+ float rf, r, g, b, t, dfact, kfact, rdir[3];
+ float rcol[3], ppos[3], norm[3], ldir[3], h[3], vdir[3], planepos[3];
+ int x, y;
+
+ glBindTexture(GL_TEXTURE_2D, reflectid);
+
+ for (y = slot * TEX_REFLECT_SLOT_SIZE;
+ y < (slot + 1) * TEX_REFLECT_SLOT_SIZE; y++)
+ for (x = 0; x < TEX_REFLECT_WIDTH; x++) {
+ ppos[0] = sphere_pos[y][x][0] + objpos[0];
+ ppos[1] = sphere_pos[y][x][1] + objpos[1];
+ ppos[2] = sphere_pos[y][x][2] + objpos[2];
+
+ vsub(norm, ppos, objpos);
+ vnormalize(norm, norm);
+
+ vsub(ldir, lightpos, ppos);
+ vnormalize(ldir, ldir);
+ vsub(vdir, obs, ppos);
+ vnormalize(vdir, vdir);
+
+ rf = 2.0f * dprod(norm, vdir);
+ if (rf > EPSILON) {
+ rdir[0] = rf * norm[0] - vdir[0];
+ rdir[1] = rf * norm[1] - vdir[1];
+ rdir[2] = rf * norm[2] - vdir[2];
+
+ t = -objpos[2] / rdir[2];
+
+ if (t > EPSILON) {
+ planepos[0] = objpos[0] + t * rdir[0];
+ planepos[1] = objpos[1] + t * rdir[1];
+ planepos[2] = 0.0f;
+
+ if (!colorcheckmap(planepos, rcol))
+ rcol[0] = rcol[1] = rcol[2] = 0.0f;
+ }
+ else
+ rcol[0] = rcol[1] = rcol[2] = 0.0f;
+ }
+ else
+ rcol[0] = rcol[1] = rcol[2] = 0.0f;
+
+ dfact = 0.1f * dprod(ldir, norm);
+
+ if (dfact < 0.0f) {
+ dfact = 0.0f;
+ kfact = 0.0f;
+ }
+ else {
+ h[0] = 0.5f * (vdir[0] + ldir[0]);
+ h[1] = 0.5f * (vdir[1] + ldir[1]);
+ h[2] = 0.5f * (vdir[2] + ldir[2]);
+ kfact = dprod(h, norm);
+ kfact = pow(kfact, 4.0);
+ if (kfact < 1.0e-10)
+ kfact = 0.0;
+ }
+
+ r = dfact + kfact;
+ g = dfact + kfact;
+ b = dfact + kfact;
+
+ r *= 255.0f;
+ g *= 255.0f;
+ b *= 255.0f;
+
+ r += rcol[0];
+ g += rcol[1];
+ b += rcol[2];
+
+ r = clamp255(r);
+ g = clamp255(g);
+ b = clamp255(b);
+
+ reflectmap[y][x][0] = (GLubyte) r;
+ reflectmap[y][x][1] = (GLubyte) g;
+ reflectmap[y][x][2] = (GLubyte) b;
+ }
+
+ glTexSubImage2D(GL_TEXTURE_2D, 0, 0, slot * TEX_REFLECT_SLOT_SIZE,
+ TEX_REFLECT_WIDTH, TEX_REFLECT_SLOT_SIZE, GL_RGB,
+ GL_UNSIGNED_BYTE,
+ &reflectmap[slot * TEX_REFLECT_SLOT_SIZE][0][0]);
+}
+
+static void
+drawbase(void)
+{
+ glColor3f(0.0, 0.0, 0.0);
+ glBindTexture(GL_TEXTURE_2D, checkid);
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+
+ glBegin(GL_QUADS);
+ glTexCoord2f(0.0f, 0.0f);
+ glVertex3f(-BASESIZE / 2.0f, -BASESIZE / 2.0f, 0.0f);
+
+ glTexCoord2f(1.0f, 0.0f);
+ glVertex3f(BASESIZE / 2.0f, -BASESIZE / 2.0f, 0.0f);
+
+ glTexCoord2f(1.0f, 1.0f);
+ glVertex3f(BASESIZE / 2.0f, BASESIZE / 2.0f, 0.0f);
+
+ glTexCoord2f(0.0f, 1.0f);
+ glVertex3f(-BASESIZE / 2.0f, BASESIZE / 2.0f, 0.0f);
+
+ glEnd();
+}
+
+static void
+drawobj(void)
+{
+ glColor3f(0.0, 0.0, 0.0);
+ glBindTexture(GL_TEXTURE_2D, reflectid);
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+
+ glPushMatrix();
+ glTranslatef(objpos[0], objpos[1], objpos[2]);
+ glCallList(objdlist);
+ glPopMatrix();
+}
+
+static void
+dojoy(void)
+{
+#ifdef WIN32
+ static UINT max[2] = { 0, 0 };
+ static UINT min[2] = { 0xffffffff, 0xffffffff }, center[2];
+ MMRESULT res;
+ JOYINFO joy;
+
+ res = joyGetPos(JOYSTICKID1, &joy);
+
+ if (res == JOYERR_NOERROR) {
+ joyavailable = 1;
+
+ if (max[0] < joy.wXpos)
+ max[0] = joy.wXpos;
+ if (min[0] > joy.wXpos)
+ min[0] = joy.wXpos;
+ center[0] = (max[0] + min[0]) / 2;
+
+ if (max[1] < joy.wYpos)
+ max[1] = joy.wYpos;
+ if (min[1] > joy.wYpos)
+ min[1] = joy.wYpos;
+ center[1] = (max[1] + min[1]) / 2;
+
+ if (joyactive) {
+ if (fabs(center[0] - (float) joy.wXpos) > 0.1 * (max[0] - min[0]))
+ alpha -=
+ 2.5 * (center[0] - (float) joy.wXpos) / (max[0] - min[0]);
+ if (fabs(center[1] - (float) joy.wYpos) > 0.1 * (max[1] - min[1]))
+ beta += 2.5 * (center[1] - (float) joy.wYpos) / (max[1] - min[1]);
+
+ if (joy.wButtons & JOY_BUTTON1)
+ v += 0.005;
+ if (joy.wButtons & JOY_BUTTON2)
+ v -= 0.005;
+ }
+ }
+ else
+ joyavailable = 0;
+#endif
+}
+
+static void
+updatemaps(void)
+{
+ updatecheckmap(checkmap_currentslot);
+ checkmap_currentslot = (checkmap_currentslot + 1) % TEX_CHECK_NUMSLOT;
+
+ updatereflectmap(reflectmap_currentslot);
+ reflectmap_currentslot =
+ (reflectmap_currentslot + 1) % TEX_REFLECT_NUMSLOT;
+}
+
+static void
+draw(void)
+{
+ static char frbuf[80] = "";
+
+ dojoy();
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_DEPTH_TEST);
+ if (fog)
+ glEnable(GL_FOG);
+ else
+ glDisable(GL_FOG);
+
+ glPushMatrix();
+ calcposobs();
+
+ gluLookAt(obs[0], obs[1], obs[2],
+ obs[0] + dir[0], obs[1] + dir[1], obs[2] + dir[2],
+ 0.0, 0.0, 1.0);
+
+ drawbase();
+ drawobj();
+
+ glColor3f(1.0, 1.0, 1.0);
+ glDisable(GL_TEXTURE_2D);
+
+ glPushMatrix();
+ glTranslatef(lightpos[0], lightpos[1], lightpos[2]);
+ glCallList(lightdlist);
+ glPopMatrix();
+
+ glPopMatrix();
+
+ glDisable(GL_DEPTH_TEST);
+ glDisable(GL_FOG);
+
+ glMatrixMode(GL_PROJECTION);
+ glPushMatrix();
+ glLoadIdentity();
+ glOrtho(-0.5, 639.5, -0.5, 479.5, -1.0, 1.0);
+ glMatrixMode(GL_MODELVIEW);
+
+ glColor3f(0.0f, 0.3f, 1.0f);
+
+ if (showcheckmap) {
+ glEnable(GL_TEXTURE_2D);
+ glBindTexture(GL_TEXTURE_2D, checkid);
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+
+ glBegin(GL_QUADS);
+ glTexCoord2f(1.0f, 0.0f);
+ glVertex2i(10, 30);
+ glTexCoord2f(1.0f, 1.0f);
+ glVertex2i(10 + 90, 30);
+ glTexCoord2f(0.0f, 1.0f);
+ glVertex2i(10 + 90, 30 + 90);
+ glTexCoord2f(0.0f, 0.0f);
+ glVertex2i(10, 30 + 90);
+ glEnd();
+
+ glDisable(GL_TEXTURE_2D);
+ glBegin(GL_LINE_LOOP);
+ glVertex2i(10, 30);
+ glVertex2i(10 + 90, 30);
+ glVertex2i(10 + 90, 30 + 90);
+ glVertex2i(10, 30 + 90);
+ glEnd();
+ glRasterPos2i(105, 65);
+ printstring(GLUT_BITMAP_HELVETICA_18, "Plane Texture Map");
+ }
+
+ if (showreflectmap) {
+ glEnable(GL_TEXTURE_2D);
+ glBindTexture(GL_TEXTURE_2D, reflectid);
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+
+ glBegin(GL_QUADS);
+ glTexCoord2f(1.0f, 0.0f);
+ glVertex2i(540, 30);
+ glTexCoord2f(1.0f, 1.0f);
+ glVertex2i(540 + 90, 30);
+ glTexCoord2f(0.0f, 1.0f);
+ glVertex2i(540 + 90, 30 + 90);
+ glTexCoord2f(0.0f, 0.0f);
+ glVertex2i(540, 30 + 90);
+ glEnd();
+
+ glDisable(GL_TEXTURE_2D);
+ glBegin(GL_LINE_LOOP);
+ glVertex2i(540, 30);
+ glVertex2i(540 + 90, 30);
+ glVertex2i(540 + 90, 30 + 90);
+ glVertex2i(540, 30 + 90);
+ glEnd();
+ glRasterPos2i(360, 65);
+ printstring(GLUT_BITMAP_HELVETICA_18, "Sphere Texture Map");
+ }
+
+ glDisable(GL_TEXTURE_2D);
+
+ glRasterPos2i(10, 10);
+ printstring(GLUT_BITMAP_HELVETICA_18, frbuf);
+ glRasterPos2i(360, 470);
+ printstring(GLUT_BITMAP_HELVETICA_10,
+ "Ray V1.0 Written by David Bucciarelli ([email protected])");
+
+ if (help)
+ printhelp();
+
+ glMatrixMode(GL_PROJECTION);
+ glPopMatrix();
+ glMatrixMode(GL_MODELVIEW);
+
+ updatemaps();
+
+ glutSwapBuffers();
+
+ Frames++;
+ {
+ GLint t = glutGet(GLUT_ELAPSED_TIME);
+ if (t - T0 >= 2000) {
+ GLfloat seconds = (t - T0) / 1000.0;
+ GLfloat fps = Frames / seconds;
+ sprintf(frbuf, "Frame rate: %f", fps);
+ T0 = t;
+ Frames = 0;
+ }
+ }
+}
+
+static void
+inittextures(void)
+{
+ int y;
+
+ glGenTextures(1, &checkid);
+ glBindTexture(GL_TEXTURE_2D, checkid);
+
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ glTexImage2D(GL_TEXTURE_2D, 0, 3, TEX_CHECK_WIDTH, TEX_CHECK_HEIGHT,
+ 0, GL_RGB, GL_UNSIGNED_BYTE, checkmap);
+
+ 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_MIN_FILTER, GL_LINEAR);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+
+ for (y = 0; y < TEX_CHECK_NUMSLOT; y++)
+ updatecheckmap(y);
+
+
+
+ glGenTextures(1, &reflectid);
+ glBindTexture(GL_TEXTURE_2D, reflectid);
+
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ glTexImage2D(GL_TEXTURE_2D, 0, 3, TEX_REFLECT_WIDTH, TEX_REFLECT_HEIGHT,
+ 0, GL_RGB, GL_UNSIGNED_BYTE, reflectmap);
+
+ 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_MIN_FILTER, GL_LINEAR);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+
+ for (y = 0; y < TEX_REFLECT_NUMSLOT; y++)
+ updatereflectmap(y);
+
+
+}
+
+static void
+initspherepos(void)
+{
+ float alpha, beta, sa, ca, sb, cb;
+ int x, y;
+
+ for (y = 0; y < TEX_REFLECT_HEIGHT; y++) {
+ beta = M_PI - y * (M_PI / TEX_REFLECT_HEIGHT);
+
+ for (x = 0; x < TEX_REFLECT_WIDTH; x++) {
+ alpha = -x * (2.0f * M_PI / TEX_REFLECT_WIDTH);
+
+ sa = sin(alpha);
+ ca = cos(alpha);
+
+ sb = sin(beta);
+ cb = cos(beta);
+
+ sphere_pos[y][x][0] = SPHERE_RADIUS * sa * sb;
+ sphere_pos[y][x][1] = SPHERE_RADIUS * ca * sb;
+ sphere_pos[y][x][2] = SPHERE_RADIUS * cb;
+ }
+ }
+}
+
+static void
+initdlists(void)
+{
+ GLUquadricObj *obj;
+
+ obj = gluNewQuadric();
+
+ lightdlist = glGenLists(1);
+ glNewList(lightdlist, GL_COMPILE);
+ gluQuadricDrawStyle(obj, GLU_FILL);
+ gluQuadricNormals(obj, GLU_NONE);
+ gluQuadricTexture(obj, GL_TRUE);
+ gluSphere(obj, 0.25f, 6, 6);
+ glEndList();
+
+ objdlist = glGenLists(1);
+ glNewList(objdlist, GL_COMPILE);
+ gluQuadricDrawStyle(obj, GLU_FILL);
+ gluQuadricNormals(obj, GLU_NONE);
+ gluQuadricTexture(obj, GL_TRUE);
+ gluSphere(obj, SPHERE_RADIUS, 16, 16);
+ glEndList();
+}
+
+int
+main(int ac, char **av)
+{
+ fprintf(stderr,
+ "Ray V1.0\nWritten by David Bucciarelli ([email protected])\n");
+
+ /*
+ if(!SetPriorityClass(GetCurrentProcess(),REALTIME_PRIORITY_CLASS)) {
+ fprintf(stderr,"Error setting the process class.\n");
+ return 0;
+ }
+
+ if(!SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_TIME_CRITICAL)) {
+ fprintf(stderr,"Error setting the process priority.\n");
+ return 0;
+ }
+ */
+
+ glutInitWindowPosition(0, 0);
+ glutInitWindowSize(WIDTH, HEIGHT);
+ glutInit(&ac, av);
+
+ glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
+
+ if (!(win = glutCreateWindow("Ray"))) {
+ fprintf(stderr, "Error, couldn't open window\n");
+ return -1;
+ }
+
+ reshape(WIDTH, HEIGHT);
+
+ glShadeModel(GL_FLAT);
+ glEnable(GL_DEPTH_TEST);
+ glDepthFunc(GL_LEQUAL);
+ glEnable(GL_CULL_FACE);
+ glEnable(GL_TEXTURE_2D);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ glEnable(GL_FOG);
+ glFogi(GL_FOG_MODE, GL_EXP2);
+ glFogfv(GL_FOG_COLOR, fogcolor);
+
+ glFogf(GL_FOG_DENSITY, 0.01);
+#ifdef FX
+ glHint(GL_FOG_HINT, GL_NICEST);
+#endif
+
+ calcposobs();
+
+ initspherepos();
+
+ inittextures();
+ initdlists();
+
+ glClearColor(fogcolor[0], fogcolor[1], fogcolor[2], fogcolor[3]);
+
+ glutReshapeFunc(reshape);
+ glutDisplayFunc(draw);
+ glutKeyboardFunc(key);
+ glutSpecialFunc(special);
+ glutIdleFunc(draw);
+
+ glutMainLoop();
+
+ return 0;
+}
diff --git a/progs/demos/readpix.c b/progs/demos/readpix.c
new file mode 100644
index 00000000000..75ba45c1e5f
--- /dev/null
+++ b/progs/demos/readpix.c
@@ -0,0 +1,344 @@
+
+/*
+ * glReadPixels and glCopyPixels test
+ *
+ * Brian Paul March 1, 2000 This file is in the public domain.
+ */
+
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <string.h>
+#include <GL/glut.h>
+
+#include "readtex.h"
+
+#define IMAGE_FILE "../images/girl.rgb"
+
+static int ImgWidth, ImgHeight;
+static GLenum ImgFormat;
+static GLubyte *Image = NULL;
+
+static int APosX, APosY; /* simple drawpixels */
+static int BPosX, BPosY; /* read/draw pixels */
+static int CPosX, CPosY; /* copypixels */
+
+static GLboolean DrawFront = GL_FALSE;
+static GLboolean ScaleAndBias = GL_FALSE;
+static GLboolean Benchmark = GL_FALSE;
+static GLubyte *TempImage = NULL;
+
+#if 0
+#define ReadFormat ImgFormat
+#define ReadType GL_UNSIGNED_BYTE
+#endif
+#if 1
+static GLenum ReadFormat = GL_RGBA;
+static GLenum ReadType = GL_UNSIGNED_BYTE;
+#endif
+#if 0
+static GLenum ReadFormat = GL_RGB;
+static GLenum ReadType = GL_UNSIGNED_BYTE;
+#endif
+#if 0
+static GLenum ReadFormat = GL_RGB;
+static GLenum ReadType = GL_UNSIGNED_SHORT_5_6_5;
+#endif
+#if 0
+static GLenum ReadFormat = GL_RGBA;
+static GLenum ReadType = GL_UNSIGNED_SHORT_1_5_5_5_REV;
+#endif
+#if 0
+static GLenum ReadFormat = GL_BGRA;
+static GLenum ReadType = GL_UNSIGNED_SHORT_5_5_5_1;
+#endif
+#if 0
+static GLenum ReadFormat = GL_BGRA;
+static GLenum ReadType = GL_UNSIGNED_SHORT_4_4_4_4_REV;
+#endif
+
+
+static void
+Reset( void )
+{
+ APosX = 5; APosY = 20;
+ BPosX = APosX + ImgWidth + 5; BPosY = 20;
+ CPosX = BPosX + ImgWidth + 5; CPosY = 20;
+}
+
+
+static void
+PrintString(const char *s)
+{
+ while (*s) {
+ glutBitmapCharacter(GLUT_BITMAP_8_BY_13, (int) *s);
+ s++;
+ }
+}
+
+
+static void
+SetupPixelTransfer(GLboolean invert)
+{
+ if (invert) {
+ glPixelTransferf(GL_RED_SCALE, -1.0);
+ glPixelTransferf(GL_RED_BIAS, 1.0);
+ glPixelTransferf(GL_GREEN_SCALE, -1.0);
+ glPixelTransferf(GL_GREEN_BIAS, 1.0);
+ glPixelTransferf(GL_BLUE_SCALE, -1.0);
+ glPixelTransferf(GL_BLUE_BIAS, 1.0);
+ }
+ else {
+ glPixelTransferf(GL_RED_SCALE, 1.0);
+ glPixelTransferf(GL_RED_BIAS, 0.0);
+ glPixelTransferf(GL_GREEN_SCALE, 1.0);
+ glPixelTransferf(GL_GREEN_BIAS, 0.0);
+ glPixelTransferf(GL_BLUE_SCALE, 1.0);
+ glPixelTransferf(GL_BLUE_BIAS, 0.0);
+ }
+}
+
+
+/**
+ * Exercise Pixel Pack parameters by reading the image in four pieces.
+ */
+static void
+ComplexReadPixels(GLint x, GLint y, GLsizei width, GLsizei height,
+ GLenum format, GLenum type, GLvoid *pixels)
+{
+ const GLsizei width0 = width / 2;
+ const GLsizei width1 = width - width0;
+ const GLsizei height0 = height / 2;
+ const GLsizei height1 = height - height0;
+
+ glPixelStorei(GL_PACK_ROW_LENGTH, width);
+
+ /* lower-left quadrant */
+ glReadPixels(x, y, width0, height0, format, type, pixels);
+
+ /* lower-right quadrant */
+ glPixelStorei(GL_PACK_SKIP_PIXELS, width0);
+ glReadPixels(x + width0, y, width1, height0, format, type, pixels);
+
+ /* upper-left quadrant */
+ glPixelStorei(GL_PACK_SKIP_PIXELS, 0);
+ glPixelStorei(GL_PACK_SKIP_ROWS, height0);
+ glReadPixels(x, y + height0, width0, height1, format, type, pixels);
+
+ /* upper-right quadrant */
+ glPixelStorei(GL_PACK_SKIP_PIXELS, width0);
+ glPixelStorei(GL_PACK_SKIP_ROWS, height0);
+ glReadPixels(x + width0, y + height0, width1, height1, format, type, pixels);
+
+ /* restore defaults */
+ glPixelStorei(GL_PACK_SKIP_PIXELS, 0);
+ glPixelStorei(GL_PACK_SKIP_ROWS, 0);
+ glPixelStorei(GL_PACK_ROW_LENGTH, ImgWidth);
+}
+
+
+
+static void
+Display( void )
+{
+ glClearColor(.3, .3, .3, 1);
+ glClear( GL_COLOR_BUFFER_BIT );
+
+ glRasterPos2i(5, ImgHeight+25);
+ PrintString("f = toggle front/back s = toggle scale/bias b = benchmark");
+
+ /* draw original image */
+ glRasterPos2i(APosX, 5);
+ PrintString("Original");
+ glRasterPos2i(APosX, APosY);
+ glEnable(GL_DITHER);
+ SetupPixelTransfer(GL_FALSE);
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ glDrawPixels(ImgWidth, ImgHeight, ImgFormat, GL_UNSIGNED_BYTE, Image);
+
+ /* might try alignment=4 here for testing */
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ glPixelStorei(GL_PACK_ALIGNMENT, 1);
+
+ /* do readpixels, drawpixels */
+ glRasterPos2i(BPosX, 5);
+ PrintString("Read/DrawPixels");
+ SetupPixelTransfer(ScaleAndBias);
+ if (Benchmark) {
+ GLint reads = 0;
+ GLint endTime;
+ GLint startTime = glutGet(GLUT_ELAPSED_TIME);
+ GLdouble seconds, pixelsPerSecond;
+ printf("Benchmarking...\n");
+ do {
+ glReadPixels(APosX, APosY, ImgWidth, ImgHeight,
+ ReadFormat, ReadType, TempImage);
+ reads++;
+ endTime = glutGet(GLUT_ELAPSED_TIME);
+ } while (endTime - startTime < 4000); /* 4 seconds */
+ seconds = (double) (endTime - startTime) / 1000.0;
+ pixelsPerSecond = reads * ImgWidth * ImgHeight / seconds;
+ printf("Result: %d reads in %f seconds = %f pixels/sec\n",
+ reads, seconds, pixelsPerSecond);
+ Benchmark = GL_FALSE;
+ }
+ else {
+ /* clear the temporary image to white (helpful for debugging */
+ memset(TempImage, 255, ImgWidth * ImgHeight * 4);
+#if 1
+ glReadPixels(APosX, APosY, ImgWidth, ImgHeight,
+ ReadFormat, ReadType, TempImage);
+ (void) ComplexReadPixels;
+#else
+ /* you might use this when debugging */
+ ComplexReadPixels(APosX, APosY, ImgWidth, ImgHeight,
+ ReadFormat, ReadType, TempImage);
+#endif
+ }
+ glRasterPos2i(BPosX, BPosY);
+ glDisable(GL_DITHER);
+ SetupPixelTransfer(GL_FALSE);
+ glDrawPixels(ImgWidth, ImgHeight, ReadFormat, ReadType, TempImage);
+
+ /* do copypixels */
+ glRasterPos2i(CPosX, 5);
+ PrintString("CopyPixels");
+ glRasterPos2i(CPosX, CPosY);
+ glDisable(GL_DITHER);
+ SetupPixelTransfer(ScaleAndBias);
+ glCopyPixels(APosX, APosY, ImgWidth, ImgHeight, GL_COLOR);
+
+ if (!DrawFront)
+ glutSwapBuffers();
+ else
+ glFinish();
+}
+
+
+static void
+Reshape( int width, int height )
+{
+ glViewport( 0, 0, width, height );
+ glMatrixMode( GL_PROJECTION );
+ glLoadIdentity();
+ glOrtho( 0.0, width, 0.0, height, -1.0, 1.0 );
+ glMatrixMode( GL_MODELVIEW );
+ glLoadIdentity();
+}
+
+
+static void
+Key( unsigned char key, int x, int y )
+{
+ (void) x;
+ (void) y;
+ switch (key) {
+ case 'b':
+ Benchmark = GL_TRUE;
+ break;
+ case 's':
+ ScaleAndBias = !ScaleAndBias;
+ break;
+ case 'f':
+ DrawFront = !DrawFront;
+ if (DrawFront) {
+ glDrawBuffer(GL_FRONT);
+ glReadBuffer(GL_FRONT);
+ }
+ else {
+ glDrawBuffer(GL_BACK);
+ glReadBuffer(GL_BACK);
+ }
+ printf("glDrawBuffer(%s)\n", DrawFront ? "GL_FRONT" : "GL_BACK");
+ break;
+ case 27:
+ exit(0);
+ break;
+ }
+ glutPostRedisplay();
+}
+
+
+static void
+Init( GLboolean ciMode )
+{
+ GLboolean have_read_format = GL_FALSE;
+
+ printf("GL_VERSION = %s\n", (char *) glGetString(GL_VERSION));
+ printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER));
+
+ Image = LoadRGBImage( IMAGE_FILE, &ImgWidth, &ImgHeight, &ImgFormat );
+ if (!Image) {
+ printf("Couldn't read %s\n", IMAGE_FILE);
+ exit(0);
+ }
+
+ if (ciMode) {
+ /* Convert RGB image to grayscale */
+ GLubyte *indexImage = (GLubyte *) malloc( ImgWidth * ImgHeight );
+ GLint i;
+ for (i=0; i<ImgWidth*ImgHeight; i++) {
+ int gray = Image[i*3] + Image[i*3+1] + Image[i*3+2];
+ indexImage[i] = gray / 3;
+ }
+ free(Image);
+ Image = indexImage;
+ ImgFormat = GL_COLOR_INDEX;
+
+ for (i=0;i<255;i++) {
+ float g = i / 255.0;
+ glutSetColor(i, g, g, g);
+ }
+ }
+
+#ifdef GL_OES_read_format
+ if ( glutExtensionSupported( "GL_OES_read_format" ) ) {
+ glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_TYPE_OES, (GLint *) &ReadType);
+ glGetIntegerv(GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES, (GLint *) &ReadFormat);
+
+ have_read_format = GL_TRUE;
+ }
+#endif
+
+ printf( "GL_OES_read_format %ssupported. "
+ "Using type / format = 0x%04x / 0x%04x\n",
+ (have_read_format) ? "" : "not ",
+ ReadType, ReadFormat );
+
+ printf("Loaded %d by %d image\n", ImgWidth, ImgHeight );
+
+ glPixelStorei(GL_UNPACK_ROW_LENGTH, ImgWidth);
+ glPixelStorei(GL_PACK_ROW_LENGTH, ImgWidth);
+
+ Reset();
+
+ /* allocate an extra 1KB in case we're tinkering with pack alignment */
+ TempImage = (GLubyte *) malloc(ImgWidth * ImgHeight * 4 * sizeof(GLubyte)
+ + 1000);
+ assert(TempImage);
+}
+
+
+int
+main( int argc, char *argv[] )
+{
+ GLboolean ciMode = GL_FALSE;
+ if (argc > 1 && strcmp(argv[1], "-ci")==0) {
+ ciMode = GL_TRUE;
+ }
+ glutInit( &argc, argv );
+ glutInitWindowPosition( 0, 0 );
+ glutInitWindowSize( 750, 250 );
+ if (ciMode)
+ glutInitDisplayMode( GLUT_INDEX | GLUT_DOUBLE );
+ else
+ glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE );
+ glutCreateWindow(argv[0]);
+ Init(ciMode);
+ glutReshapeFunc( Reshape );
+ glutKeyboardFunc( Key );
+ glutDisplayFunc( Display );
+ glutMainLoop();
+ return 0;
+}
diff --git a/progs/demos/reflect.c b/progs/demos/reflect.c
new file mode 100644
index 00000000000..0bec0663bc2
--- /dev/null
+++ b/progs/demos/reflect.c
@@ -0,0 +1,590 @@
+/*
+ * Demo of a reflective, texture-mapped surface with OpenGL.
+ * Brian Paul August 14, 1995 This file is in the public domain.
+ *
+ * Hardware texture mapping is highly recommended!
+ *
+ * The basic steps are:
+ * 1. Render the reflective object (a polygon) from the normal viewpoint,
+ * setting the stencil planes = 1.
+ * 2. Render the scene from a special viewpoint: the viewpoint which
+ * is on the opposite side of the reflective plane. Only draw where
+ * stencil = 1. This draws the objects in the reflective surface.
+ * 3. Render the scene from the original viewpoint. This draws the
+ * objects in the normal fashion. Use blending when drawing
+ * the reflective, textured surface.
+ *
+ * This is a very crude demo. It could be much better.
+ */
+
+/*
+ * Authors:
+ * Brian Paul
+ * Dirk Reiners ([email protected]) made some modifications to this code.
+ * Mark Kilgard (April 1997)
+ * Brian Paul (April 2000 - added keyboard d/s options)
+ * Brian Paul (August 2005 - added multi window feature)
+ */
+
+
+#include <assert.h>
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include "GL/glut.h"
+#include "showbuffer.h"
+#include "readtex.h"
+
+
+#define DEG2RAD (3.14159/180.0)
+#define TABLE_TEXTURE "../images/tile.rgb"
+#define MAX_OBJECTS 2
+#define INIT_WIDTH 400
+#define INIT_HEIGHT 300
+
+#ifdef _WIN32
+#undef CreateWindowA
+#endif
+
+struct window {
+ int id; /* returned by glutCreateWindow() */
+ int width, height;
+ GLboolean anim;
+ GLfloat xrot, yrot;
+ GLfloat spin;
+ GLenum showBuffer;
+ GLenum drawBuffer;
+ GLuint table_list;
+ GLuint objects_list[MAX_OBJECTS];
+ double t0;
+ struct window *next;
+};
+
+
+static struct window *FirstWindow = NULL;
+
+
+static void
+CreateWindow(void);
+
+
+static struct window *
+CurrentWindow(void)
+{
+ int id = glutGetWindow();
+ struct window *w;
+ for (w = FirstWindow; w; w = w->next) {
+ if (w->id == id)
+ return w;
+ }
+ return NULL;
+}
+
+
+static GLboolean
+AnyAnimating(void)
+{
+ struct window *w;
+ for (w = FirstWindow; w; w = w->next) {
+ if (w->anim)
+ return 1;
+ }
+ return 0;
+}
+
+
+static void
+KillWindow(struct window *w)
+{
+ struct window *win, *prev = NULL;
+ for (win = FirstWindow; win; win = win->next) {
+ if (win == w) {
+ if (prev) {
+ prev->next = win->next;
+ }
+ else {
+ FirstWindow = win->next;
+ }
+ glutDestroyWindow(win->id);
+ win->next = NULL;
+ free(win);
+ return;
+ }
+ prev = win;
+ }
+}
+
+
+static void
+KillAllWindows(void)
+{
+ while (FirstWindow)
+ KillWindow(FirstWindow);
+}
+
+
+static GLuint
+MakeTable(void)
+{
+ static GLfloat table_mat[] = { 1.0, 1.0, 1.0, 0.6 };
+ static GLfloat gray[] = { 0.4, 0.4, 0.4, 1.0 };
+ GLuint table_list;
+
+ table_list = glGenLists(1);
+ glNewList( table_list, GL_COMPILE );
+
+ /* load table's texture */
+ glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, table_mat );
+ /*glMaterialfv( GL_FRONT, GL_EMISSION, gray );*/
+ glMaterialfv( GL_FRONT, GL_DIFFUSE, table_mat );
+ glMaterialfv( GL_FRONT, GL_AMBIENT, gray );
+
+ /* draw textured square for the table */
+ glPushMatrix();
+ glScalef( 4.0, 4.0, 4.0 );
+ glBegin( GL_POLYGON );
+ glNormal3f( 0.0, 1.0, 0.0 );
+ glTexCoord2f( 0.0, 0.0 ); glVertex3f( -1.0, 0.0, 1.0 );
+ glTexCoord2f( 1.0, 0.0 ); glVertex3f( 1.0, 0.0, 1.0 );
+ glTexCoord2f( 1.0, 1.0 ); glVertex3f( 1.0, 0.0, -1.0 );
+ glTexCoord2f( 0.0, 1.0 ); glVertex3f( -1.0, 0.0, -1.0 );
+ glEnd();
+ glPopMatrix();
+
+ glDisable( GL_TEXTURE_2D );
+
+ glEndList();
+ return table_list;
+}
+
+
+static void
+MakeObjects(GLuint *objects_list)
+{
+ GLUquadricObj *q;
+
+ static GLfloat cyan[] = { 0.0, 1.0, 1.0, 1.0 };
+ static GLfloat green[] = { 0.2, 1.0, 0.2, 1.0 };
+ static GLfloat black[] = { 0.0, 0.0, 0.0, 0.0 };
+
+ q = gluNewQuadric();
+ gluQuadricDrawStyle( q, GLU_FILL );
+ gluQuadricNormals( q, GLU_SMOOTH );
+
+ objects_list[0] = glGenLists(1);
+ glNewList( objects_list[0], GL_COMPILE );
+ glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, cyan );
+ glMaterialfv( GL_FRONT, GL_EMISSION, black );
+ gluCylinder( q, 0.5, 0.5, 1.0, 15, 1 );
+ glEndList();
+
+ objects_list[1] = glGenLists(1);
+ glNewList( objects_list[1], GL_COMPILE );
+ glMaterialfv( GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green );
+ glMaterialfv( GL_FRONT, GL_EMISSION, black );
+ gluCylinder( q, 1.5, 0.0, 2.5, 15, 1 );
+ glEndList();
+
+ gluDeleteQuadric(q);
+}
+
+
+static void
+InitWindow(struct window *w)
+{
+ GLint imgWidth, imgHeight;
+ GLenum imgFormat;
+ GLubyte *image = NULL;
+
+ w->table_list = MakeTable();
+ MakeObjects(w->objects_list);
+
+ image = LoadRGBImage( TABLE_TEXTURE, &imgWidth, &imgHeight, &imgFormat );
+ if (!image) {
+ printf("Couldn't read %s\n", TABLE_TEXTURE);
+ exit(0);
+ }
+
+ gluBuild2DMipmaps(GL_TEXTURE_2D, 3, imgWidth, imgHeight,
+ imgFormat, GL_UNSIGNED_BYTE, image);
+ free(image);
+
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
+
+ glShadeModel( GL_FLAT );
+
+ glEnable( GL_LIGHT0 );
+ glEnable( GL_LIGHTING );
+
+ glClearColor( 0.5, 0.5, 0.9, 0.0 );
+
+ glEnable( GL_NORMALIZE );
+}
+
+
+static void
+Reshape(int width, int height)
+{
+ struct window *w = CurrentWindow();
+ GLfloat yAspect = 2.5;
+ GLfloat xAspect = yAspect * (float) width / (float) height;
+ w->width = width;
+ w->height = height;
+ glViewport(0, 0, width, height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glFrustum( -xAspect, xAspect, -yAspect, yAspect, 10.0, 30.0 );
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+}
+
+
+static void
+DrawObjects(struct window *w, GLfloat eyex, GLfloat eyey, GLfloat eyez)
+{
+ (void) eyex;
+ (void) eyey;
+ (void) eyez;
+#ifndef USE_ZBUFFER
+ if (eyex<0.5) {
+#endif
+ glPushMatrix();
+ glTranslatef( 1.0, 1.5, 0.0 );
+ glRotatef( w->spin, 1.0, 0.5, 0.0 );
+ glRotatef( 0.5*w->spin, 0.0, 0.5, 1.0 );
+ glCallList( w->objects_list[0] );
+ glPopMatrix();
+
+ glPushMatrix();
+ glTranslatef( -1.0, 0.85+3.0*fabs( cos(0.01*w->spin) ), 0.0 );
+ glRotatef( 0.5*w->spin, 0.0, 0.5, 1.0 );
+ glRotatef( w->spin, 1.0, 0.5, 0.0 );
+ glScalef( 0.5, 0.5, 0.5 );
+ glCallList( w->objects_list[1] );
+ glPopMatrix();
+#ifndef USE_ZBUFFER
+ }
+ else {
+ glPushMatrix();
+ glTranslatef( -1.0, 0.85+3.0*fabs( cos(0.01*w->spin) ), 0.0 );
+ glRotatef( 0.5*w->spin, 0.0, 0.5, 1.0 );
+ glRotatef( w->spin, 1.0, 0.5, 0.0 );
+ glScalef( 0.5, 0.5, 0.5 );
+ glCallList( w->objects_list[1] );
+ glPopMatrix();
+
+ glPushMatrix();
+ glTranslatef( 1.0, 1.5, 0.0 );
+ glRotatef( w->spin, 1.0, 0.5, 0.0 );
+ glRotatef( 0.5*w->spin, 0.0, 0.5, 1.0 );
+ glCallList( w->objects_list[0] );
+ glPopMatrix();
+ }
+#endif
+}
+
+
+static void
+DrawTable(struct window *w)
+{
+ glCallList(w->table_list);
+}
+
+
+static void
+DrawWindow(void)
+{
+ struct window *w = CurrentWindow();
+ static GLfloat light_pos[] = { 0.0, 20.0, 0.0, 1.0 };
+ GLfloat dist = 20.0;
+ GLfloat eyex, eyey, eyez;
+
+ if (w->drawBuffer == GL_NONE) {
+ glDrawBuffer(GL_BACK);
+ glReadBuffer(GL_BACK);
+ }
+ else {
+ glDrawBuffer(w->drawBuffer);
+ glReadBuffer(w->drawBuffer);
+ }
+
+ glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
+
+ if (w->drawBuffer == GL_NONE) {
+ glDrawBuffer(GL_NONE);
+ }
+
+ eyex = dist * cos(w->yrot * DEG2RAD) * cos(w->xrot * DEG2RAD);
+ eyez = dist * sin(w->yrot * DEG2RAD) * cos(w->xrot * DEG2RAD);
+ eyey = dist * sin(w->xrot * DEG2RAD);
+
+ /* view from top */
+ glPushMatrix();
+ gluLookAt( eyex, eyey, eyez, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0 );
+
+ glLightfv( GL_LIGHT0, GL_POSITION, light_pos );
+
+ /* draw table into stencil planes */
+ glDisable( GL_DEPTH_TEST );
+ glEnable( GL_STENCIL_TEST );
+ glStencilFunc( GL_ALWAYS, 1, 0xffffffff );
+ glStencilOp( GL_REPLACE, GL_REPLACE, GL_REPLACE );
+ glColorMask( GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE );
+ DrawTable(w);
+ glColorMask( GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE );
+
+ glEnable( GL_DEPTH_TEST );
+
+ /* render view from below (reflected viewport) */
+ /* only draw where stencil==1 */
+ if (eyey>0.0) {
+ glPushMatrix();
+
+ glStencilFunc( GL_EQUAL, 1, 0xffffffff ); /* draw if ==1 */
+ glStencilOp( GL_KEEP, GL_KEEP, GL_KEEP );
+ glScalef( 1.0, -1.0, 1.0 );
+
+ /* Reposition light in reflected space. */
+ glLightfv(GL_LIGHT0, GL_POSITION, light_pos);
+
+ DrawObjects(w, eyex, eyey, eyez);
+ glPopMatrix();
+
+ /* Restore light's original unreflected position. */
+ glLightfv(GL_LIGHT0, GL_POSITION, light_pos);
+ }
+
+ glDisable( GL_STENCIL_TEST );
+
+ glEnable( GL_BLEND );
+ glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
+
+ glEnable( GL_TEXTURE_2D );
+ DrawTable(w);
+ glDisable( GL_TEXTURE_2D );
+ glDisable( GL_BLEND );
+
+ /* view from top */
+ glPushMatrix();
+
+ DrawObjects(w, eyex, eyey, eyez);
+
+ glPopMatrix();
+
+ glPopMatrix();
+
+ if (w->showBuffer == GL_DEPTH) {
+ ShowDepthBuffer(w->width, w->height, 1.0, 0.0);
+ }
+ else if (w->showBuffer == GL_STENCIL) {
+ ShowStencilBuffer(w->width, w->height, 255.0, 0.0);
+ }
+ else if (w->showBuffer == GL_ALPHA) {
+ ShowAlphaBuffer(w->width, w->height);
+ }
+
+ if (w->drawBuffer == GL_FRONT)
+ glFinish();
+ else
+ glutSwapBuffers();
+
+ /* calc/show frame rate */
+ {
+ static GLint t0 = 0;
+ static GLint frames = 0;
+ GLint t = glutGet(GLUT_ELAPSED_TIME);
+ frames++;
+ if (t - t0 >= 5000) {
+ GLfloat seconds = (t - t0) / 1000.0;
+ GLfloat fps = frames / seconds;
+ printf("%d frames in %g seconds = %g FPS\n", frames, seconds, fps);
+ t0 = t;
+ frames = 0;
+ }
+ }
+}
+
+
+static void
+Idle(void)
+{
+ double t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
+ struct window *w;
+ for (w = FirstWindow; w; w = w->next) {
+ if (w->anim) {
+ double dt;
+ if (w->t0 < 0.0)
+ w->t0 = t;
+ dt = t - w->t0;
+ w->t0 = t;
+ w->spin += 60.0 * dt;
+ w->yrot += 90.0 * dt;
+ assert(w->id);
+ glutSetWindow(w->id);
+ glutPostRedisplay();
+ }
+ }
+}
+
+
+static void
+UpdateIdleFunc(void)
+{
+ if (AnyAnimating())
+ glutIdleFunc(Idle);
+ else
+ glutIdleFunc(NULL);
+}
+
+static void
+Key(unsigned char key, int x, int y)
+{
+ struct window *w = CurrentWindow();
+ (void) x;
+ (void) y;
+
+ switch (key) {
+ case 'd':
+ w->showBuffer = GL_DEPTH;
+ glutPostRedisplay();
+ break;
+ case 's':
+ w->showBuffer = GL_STENCIL;
+ glutPostRedisplay();
+ break;
+ case 'a':
+ w->showBuffer = GL_ALPHA;
+ glutPostRedisplay();
+ break;
+ case 'c':
+ w->showBuffer = GL_NONE;
+ glutPostRedisplay();
+ break;
+ case 'f':
+ if (w->drawBuffer == GL_FRONT)
+ w->drawBuffer = GL_BACK;
+ else
+ w->drawBuffer = GL_FRONT;
+ glutPostRedisplay();
+ break;
+ case '0':
+ w->drawBuffer = GL_NONE;
+ glutPostRedisplay();
+ break;
+ case ' ':
+ w->anim = !w->anim;
+ w->t0 = -1;
+ UpdateIdleFunc();
+ glutPostRedisplay();
+ break;
+ case 'n':
+ CreateWindow();
+ UpdateIdleFunc();
+ break;
+ case 'k':
+ KillWindow(w);
+ if (FirstWindow == NULL)
+ exit(0);
+ break;
+ case 27:
+ KillAllWindows();
+ exit(0);
+ break;
+ default:
+ ;
+ }
+}
+
+
+static void
+SpecialKey(int key, int x, int y)
+{
+ struct window *w = CurrentWindow();
+ (void) x;
+ (void) y;
+ switch (key) {
+ case GLUT_KEY_UP:
+ w->xrot += 3.0;
+ if (w->xrot > 85)
+ w->xrot = 85;
+ break;
+ case GLUT_KEY_DOWN:
+ w->xrot -= 3.0;
+ if (w->xrot < 5)
+ w->xrot = 5;
+ break;
+ case GLUT_KEY_LEFT:
+ w->yrot += 3.0;
+ break;
+ case GLUT_KEY_RIGHT:
+ w->yrot -= 3.0;
+ break;
+ }
+ glutPostRedisplay();
+}
+
+
+static void
+CreateWindow(void)
+{
+ char title[1000];
+ struct window *w = (struct window *) calloc(1, sizeof(struct window));
+
+ glutInitWindowSize(INIT_WIDTH, INIT_HEIGHT);
+ w->id = glutCreateWindow("foo");
+ sprintf(title, "reflect window %d", w->id);
+ glutSetWindowTitle(title);
+ assert(w->id);
+ w->width = INIT_WIDTH;
+ w->height = INIT_HEIGHT;
+ w->anim = GL_TRUE;
+ w->xrot = 30.0;
+ w->yrot = 50.0;
+ w->spin = 0.0;
+ w->showBuffer = GL_NONE;
+ w->drawBuffer = GL_BACK;
+
+ InitWindow(w);
+
+ glutReshapeFunc(Reshape);
+ glutDisplayFunc(DrawWindow);
+ glutKeyboardFunc(Key);
+ glutSpecialFunc(SpecialKey);
+
+ /* insert at head of list */
+ w->next = FirstWindow;
+ FirstWindow = w;
+}
+
+
+static void
+Usage(void)
+{
+ printf("Keys:\n");
+ printf(" a - show alpha buffer\n");
+ printf(" d - show depth buffer\n");
+ printf(" s - show stencil buffer\n");
+ printf(" c - show color buffer\n");
+ printf(" f - toggle rendering to front/back color buffer\n");
+ printf(" n - create new window\n");
+ printf(" k - kill window\n");
+ printf(" SPACE - toggle animation\n");
+ printf(" ARROWS - rotate scene\n");
+}
+
+
+int
+main(int argc, char *argv[])
+{
+ glutInit(&argc, argv);
+ glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH |
+ GLUT_STENCIL | GLUT_ALPHA);
+ CreateWindow();
+ glutIdleFunc(Idle);
+ Usage();
+ glutMainLoop();
+ return 0;
+}
diff --git a/progs/demos/renormal.c b/progs/demos/renormal.c
new file mode 100644
index 00000000000..9e5da95484c
--- /dev/null
+++ b/progs/demos/renormal.c
@@ -0,0 +1,139 @@
+
+/*
+ * Test GL_EXT_rescale_normal extension
+ * Brian Paul January 1998 This program is in the public domain.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <GL/glut.h>
+
+
+static GLfloat Phi = 0.0;
+
+
+static void Idle( void )
+{
+ static double t0 = -1.;
+ double dt, t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
+ if (t0 < 0.0)
+ t0 = t;
+ dt = t - t0;
+ t0 = t;
+ Phi += 3.0 * dt;
+ glutPostRedisplay();
+}
+
+
+static void Display( void )
+{
+ GLfloat scale = 0.6 + 0.5 * sin(Phi);
+ glClear( GL_COLOR_BUFFER_BIT );
+ glPushMatrix();
+ glScalef(scale, scale, scale);
+ glutSolidSphere(2.0, 20, 20);
+ glPopMatrix();
+ glutSwapBuffers();
+}
+
+
+static void Reshape( int width, int height )
+{
+ glViewport( 0, 0, width, height );
+ glMatrixMode( GL_PROJECTION );
+ glLoadIdentity();
+ glFrustum( -1.0, 1.0, -1.0, 1.0, 5.0, 25.0 );
+ glMatrixMode( GL_MODELVIEW );
+ glLoadIdentity();
+ glTranslatef( 0.0, 0.0, -15.0 );
+}
+
+
+
+static void Init( void )
+{
+ static GLfloat mat[4] = { 0.8, 0.8, 0.0, 1.0 };
+ static GLfloat pos[4] = { -1.0, 1.0, 1.0, 0.0 };
+
+ /* setup lighting, etc */
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mat);
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+
+ glEnable(GL_CULL_FACE);
+
+ glDisable(GL_RESCALE_NORMAL_EXT);
+ glDisable(GL_NORMALIZE);
+}
+
+
+#define UNSCALED 1
+#define NORMALIZE 2
+#define RESCALE 3
+#define QUIT 4
+
+
+static void ModeMenu(int entry)
+{
+ if (entry==UNSCALED) {
+ glDisable(GL_RESCALE_NORMAL_EXT);
+ glDisable(GL_NORMALIZE);
+ }
+ else if (entry==NORMALIZE) {
+ glEnable(GL_NORMALIZE);
+ glDisable(GL_RESCALE_NORMAL_EXT);
+ }
+ else if (entry==RESCALE) {
+ glDisable(GL_NORMALIZE);
+ glEnable(GL_RESCALE_NORMAL_EXT);
+ }
+ else if (entry==QUIT) {
+ exit(0);
+ }
+ glutPostRedisplay();
+}
+
+static void
+key(unsigned char k, int x, int y)
+{
+ (void) x;
+ (void) y;
+ switch (k) {
+ case 27: /* Escape */
+ exit(0);
+ break;
+ default:
+ return;
+ }
+ glutPostRedisplay();
+}
+
+int main( int argc, char *argv[] )
+{
+ glutInit( &argc, argv );
+ glutInitWindowPosition(0, 0);
+ glutInitWindowSize( 400, 400 );
+
+ glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE );
+
+ glutCreateWindow(argv[0]);
+
+ Init();
+
+ glutIdleFunc( Idle );
+ glutReshapeFunc( Reshape );
+ glutDisplayFunc( Display );
+ glutKeyboardFunc(key);
+
+ glutCreateMenu(ModeMenu);
+ glutAddMenuEntry("Unscaled", UNSCALED);
+ glutAddMenuEntry("Normalize", NORMALIZE);
+ glutAddMenuEntry("Rescale EXT", RESCALE);
+ glutAddMenuEntry("Quit", QUIT);
+ glutAttachMenu(GLUT_RIGHT_BUTTON);
+
+ glutMainLoop();
+ return 0;
+}
diff --git a/progs/demos/shadowtex.c b/progs/demos/shadowtex.c
new file mode 100644
index 00000000000..b32fb45b4fa
--- /dev/null
+++ b/progs/demos/shadowtex.c
@@ -0,0 +1,766 @@
+/*
+ * Shadow demo using the GL_ARB_depth_texture, GL_ARB_shadow and
+ * GL_ARB_shadow_ambient extensions.
+ *
+ * Brian Paul
+ * 19 Feb 2001
+ *
+ * Added GL_EXT_shadow_funcs support on 23 March 2002
+ * Added GL_EXT_packed_depth_stencil support on 15 March 2006.
+ * Added GL_EXT_framebuffer_object support on 27 March 2006.
+ * Removed old SGIX extension support on 5 April 2006.
+ *
+ * Copyright (C) 1999-2006 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.
+ */
+
+#define GL_GLEXT_PROTOTYPES
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <GL/glut.h>
+#include "showbuffer.h"
+
+#define DEG_TO_RAD (3.14159 / 180.0)
+
+static GLint WindowWidth = 450, WindowHeight = 300;
+static GLfloat Xrot = 15, Yrot = 0, Zrot = 0;
+
+static GLfloat Red[4] = {1, 0, 0, 1};
+static GLfloat Green[4] = {0, 1, 0, 1};
+static GLfloat Blue[4] = {0, 0, 1, 1};
+static GLfloat Yellow[4] = {1, 1, 0, 1};
+
+static GLfloat LightDist = 10;
+static GLfloat LightLatitude = 45.0;
+static GLfloat LightLongitude = 45.0;
+static GLfloat LightPos[4];
+static GLfloat SpotDir[3];
+static GLfloat SpotAngle = 40.0 * DEG_TO_RAD;
+static GLfloat ShadowNear = 4.0, ShadowFar = 24.0;
+static GLint ShadowTexWidth = 256, ShadowTexHeight = 256;
+
+static GLboolean LinearFilter = GL_FALSE;
+
+static GLfloat Bias = -0.06;
+
+static GLboolean Anim = GL_TRUE;
+
+static GLboolean NeedNewShadowMap = GL_FALSE;
+static GLuint ShadowTexture, GrayTexture;
+static GLuint ShadowFBO;
+
+static GLboolean HaveFBO = GL_FALSE;
+static GLboolean UseFBO = GL_FALSE;
+static GLboolean HavePackedDepthStencil = GL_FALSE;
+static GLboolean UsePackedDepthStencil = GL_FALSE;
+static GLboolean HaveEXTshadowFuncs = GL_FALSE;
+static GLboolean HaveShadowAmbient = GL_FALSE;
+
+static GLint Operator = 0;
+static const GLenum OperatorFunc[8] = {
+ GL_LEQUAL, GL_LESS, GL_GEQUAL, GL_GREATER,
+ GL_EQUAL, GL_NOTEQUAL, GL_ALWAYS, GL_NEVER };
+static const char *OperatorName[8] = {
+ "GL_LEQUAL", "GL_LESS", "GL_GEQUAL", "GL_GREATER",
+ "GL_EQUAL", "GL_NOTEQUAL", "GL_ALWAYS", "GL_NEVER" };
+
+
+static GLuint DisplayMode;
+#define SHOW_SHADOWS 0
+#define SHOW_DEPTH_IMAGE 1
+#define SHOW_DEPTH_MAPPING 2
+#define SHOW_DISTANCE 3
+
+
+
+static void
+DrawScene(void)
+{
+ GLfloat k = 6;
+
+ /* sphere */
+ glPushMatrix();
+ glTranslatef(1.6, 2.2, 2.7);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, Green);
+ glColor4fv(Green);
+ glutSolidSphere(1.5, 15, 15);
+ glPopMatrix();
+ /* dodecahedron */
+ glPushMatrix();
+ glTranslatef(-2.0, 1.2, 2.1);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, Red);
+ glColor4fv(Red);
+ glutSolidDodecahedron();
+ glPopMatrix();
+ /* icosahedron */
+ glPushMatrix();
+ glTranslatef(-0.6, 1.3, -0.5);
+ glScalef(1.5, 1.5, 1.5);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, Yellow);
+ glColor4fv(Red);
+ glutSolidIcosahedron();
+ glPopMatrix();
+ /* a plane */
+ glPushMatrix();
+ glTranslatef(0, -1.1, 0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, Blue);
+ glColor4fv(Blue);
+ glNormal3f(0, 1, 0);
+ glBegin(GL_POLYGON);
+ glVertex3f(-k, 0, -k);
+ glVertex3f( k, 0, -k);
+ glVertex3f( k, 0, k);
+ glVertex3f(-k, 0, k);
+ glEnd();
+ glPopMatrix();
+}
+
+
+/*
+ * Load the GL_TEXTURE matrix with the projection from the light
+ * source's point of view.
+ */
+static void
+MakeShadowMatrix(const GLfloat lightPos[4], const GLfloat spotDir[3],
+ GLfloat spotAngle, GLfloat shadowNear, GLfloat shadowFar)
+{
+ GLfloat d;
+
+ glMatrixMode(GL_TEXTURE);
+ glLoadIdentity();
+ glTranslatef(0.5, 0.5, 0.5 + Bias);
+ glScalef(0.5, 0.5, 0.5);
+ d = shadowNear * tan(spotAngle);
+ glFrustum(-d, d, -d, d, shadowNear, shadowFar);
+ gluLookAt(lightPos[0], lightPos[1], lightPos[2],
+ lightPos[0] + spotDir[0],
+ lightPos[1] + spotDir[1],
+ lightPos[2] + spotDir[2],
+ 0, 1, 0);
+ glMatrixMode(GL_MODELVIEW);
+}
+
+
+static void
+EnableIdentityTexgen(void)
+{
+ /* texgen so that texcoord = vertex coord */
+ static GLfloat sPlane[4] = { 1, 0, 0, 0 };
+ static GLfloat tPlane[4] = { 0, 1, 0, 0 };
+ static GLfloat rPlane[4] = { 0, 0, 1, 0 };
+ static GLfloat qPlane[4] = { 0, 0, 0, 1 };
+
+ glTexGenfv(GL_S, GL_EYE_PLANE, sPlane);
+ glTexGenfv(GL_T, GL_EYE_PLANE, tPlane);
+ glTexGenfv(GL_R, GL_EYE_PLANE, rPlane);
+ glTexGenfv(GL_Q, GL_EYE_PLANE, qPlane);
+ glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
+ glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
+ glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
+ glTexGeni(GL_Q, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
+
+ glEnable(GL_TEXTURE_GEN_S);
+ glEnable(GL_TEXTURE_GEN_T);
+ glEnable(GL_TEXTURE_GEN_R);
+ glEnable(GL_TEXTURE_GEN_Q);
+}
+
+
+/*
+ * Setup 1-D texgen so that the distance from the light source, between
+ * the near and far planes maps to s=0 and s=1. When we draw the scene,
+ * the grayness will indicate the fragment's distance from the light
+ * source.
+ */
+static void
+EnableDistanceTexgen(const GLfloat lightPos[4], const GLfloat lightDir[3],
+ GLfloat lightNear, GLfloat lightFar)
+{
+ GLfloat m, d;
+ GLfloat sPlane[4];
+ GLfloat nearPoint[3];
+
+ m = sqrt(lightDir[0] * lightDir[0] +
+ lightDir[1] * lightDir[1] +
+ lightDir[2] * lightDir[2]);
+
+ d = lightFar - lightNear;
+
+ /* nearPoint = point on light direction vector which intersects the
+ * near plane of the light frustum.
+ */
+ nearPoint[0] = lightPos[0] + lightDir[0] / m * lightNear;
+ nearPoint[1] = lightPos[1] + lightDir[1] / m * lightNear;
+ nearPoint[2] = lightPos[2] + lightDir[2] / m * lightNear;
+
+ sPlane[0] = lightDir[0] / d / m;
+ sPlane[1] = lightDir[1] / d / m;
+ sPlane[2] = lightDir[2] / d / m;
+ sPlane[3] = -(sPlane[0] * nearPoint[0]
+ + sPlane[1] * nearPoint[1]
+ + sPlane[2] * nearPoint[2]);
+
+ glTexGenfv(GL_S, GL_EYE_PLANE, sPlane);
+ glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
+ glEnable(GL_TEXTURE_GEN_S);
+}
+
+
+static void
+DisableTexgen(void)
+{
+ glDisable(GL_TEXTURE_GEN_S);
+ glDisable(GL_TEXTURE_GEN_T);
+ glDisable(GL_TEXTURE_GEN_R);
+ glDisable(GL_TEXTURE_GEN_Q);
+}
+
+
+static void
+ComputeLightPos(GLfloat dist, GLfloat latitude, GLfloat longitude,
+ GLfloat pos[4], GLfloat dir[3])
+{
+
+ pos[0] = dist * sin(longitude * DEG_TO_RAD);
+ pos[1] = dist * sin(latitude * DEG_TO_RAD);
+ pos[2] = dist * cos(latitude * DEG_TO_RAD) * cos(longitude * DEG_TO_RAD);
+ pos[3] = 1;
+ dir[0] = -pos[0];
+ dir[1] = -pos[1];
+ dir[2] = -pos[2];
+}
+
+
+/**
+ * Render the shadow map / depth texture.
+ * The result will be in the texture object named ShadowTexture.
+ */
+static void
+RenderShadowMap(void)
+{
+ GLenum depthFormat; /* GL_DEPTH_COMPONENT or GL_DEPTH_STENCIL_EXT */
+ GLenum depthType; /* GL_UNSIGNED_INT_24_8_EXT or GL_UNSIGNED_INT */
+ float d;
+
+ if (WindowWidth >= 1024 && WindowHeight >= 1024) {
+ ShadowTexWidth = ShadowTexHeight = 1024;
+ }
+ else if (WindowWidth >= 512 && WindowHeight >= 512) {
+ ShadowTexWidth = ShadowTexHeight = 512;
+ }
+ else if (WindowWidth >= 256 && WindowHeight >= 256) {
+ ShadowTexWidth = ShadowTexHeight = 256;
+ }
+ else {
+ ShadowTexWidth = ShadowTexHeight = 128;
+ }
+ printf("Rendering %d x %d depth texture\n", ShadowTexWidth, ShadowTexHeight);
+
+ if (UsePackedDepthStencil) {
+ depthFormat = GL_DEPTH_STENCIL_EXT;
+ depthType = GL_UNSIGNED_INT_24_8_EXT;
+ }
+ else {
+ depthFormat = GL_DEPTH_COMPONENT;
+ depthType = GL_UNSIGNED_INT;
+ }
+
+ /* compute frustum to enclose spot light cone */
+ d = ShadowNear * tan(SpotAngle);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glFrustum(-d, d, -d, d, ShadowNear, ShadowFar);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ gluLookAt(LightPos[0], LightPos[1], LightPos[2], /* from */
+ 0, 0, 0, /* target */
+ 0, 1, 0); /* up */
+
+ if (UseFBO) {
+ glTexImage2D(GL_TEXTURE_2D, 0, depthFormat,
+ ShadowTexWidth, ShadowTexHeight, 0,
+ depthFormat, depthType, NULL);
+ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, ShadowFBO);
+ glDrawBuffer(GL_NONE);
+ glReadBuffer(GL_NONE);
+ assert(glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT)
+ == GL_FRAMEBUFFER_COMPLETE_EXT);
+ }
+
+ assert(!glIsEnabled(GL_TEXTURE_1D));
+ assert(!glIsEnabled(GL_TEXTURE_2D));
+
+ glViewport(0, 0, ShadowTexWidth, ShadowTexHeight);
+ glClear(GL_DEPTH_BUFFER_BIT);
+ glEnable(GL_DEPTH_TEST);
+ DrawScene();
+
+ if (UseFBO) {
+ /* all done! */
+ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
+ }
+ else {
+ /*
+ * copy depth buffer into the texture map
+ */
+ if (DisplayMode == SHOW_DEPTH_MAPPING) {
+ /* load depth image as gray-scale luminance texture */
+ GLuint *depth = (GLuint *)
+ malloc(ShadowTexWidth * ShadowTexHeight * sizeof(GLuint));
+ assert(depth);
+ glReadPixels(0, 0, ShadowTexWidth, ShadowTexHeight,
+ depthFormat, depthType, depth);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE,
+ ShadowTexWidth, ShadowTexHeight, 0,
+ GL_LUMINANCE, GL_UNSIGNED_INT, depth);
+ free(depth);
+ }
+ else {
+ /* The normal shadow case - a real depth texture */
+ glCopyTexImage2D(GL_TEXTURE_2D, 0, depthFormat,
+ 0, 0, ShadowTexWidth, ShadowTexHeight, 0);
+ if (UsePackedDepthStencil) {
+ /* debug check */
+ GLint intFormat;
+ glGetTexLevelParameteriv(GL_TEXTURE_2D, 0,
+ GL_TEXTURE_INTERNAL_FORMAT, &intFormat);
+ assert(intFormat == GL_DEPTH_STENCIL_EXT);
+ }
+ }
+ }
+}
+
+
+/**
+ * Show the shadow map as a grayscale image.
+ */
+static void
+ShowShadowMap(void)
+{
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ glMatrixMode(GL_TEXTURE);
+ glLoadIdentity();
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glOrtho(0, WindowWidth, 0, WindowHeight, -1, 1);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ glDisable(GL_DEPTH_TEST);
+ glDisable(GL_LIGHTING);
+
+ glEnable(GL_TEXTURE_2D);
+
+ DisableTexgen();
+
+ /* interpret texture's depth values as luminance values */
+#if defined(GL_ARB_shadow)
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE_ARB, GL_NONE);
+ glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE_ARB, GL_LUMINANCE);
+#endif
+ glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+
+ glBegin(GL_POLYGON);
+ glTexCoord2f(0, 0); glVertex2f(0, 0);
+ glTexCoord2f(1, 0); glVertex2f(ShadowTexWidth, 0);
+ glTexCoord2f(1, 1); glVertex2f(ShadowTexWidth, ShadowTexHeight);
+ glTexCoord2f(0, 1); glVertex2f(0, ShadowTexHeight);
+ glEnd();
+
+ glDisable(GL_TEXTURE_2D);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_LIGHTING);
+}
+
+
+/**
+ * Redraw window image
+ */
+static void
+Display(void)
+{
+ GLenum error;
+
+ ComputeLightPos(LightDist, LightLatitude, LightLongitude,
+ LightPos, SpotDir);
+
+ if (NeedNewShadowMap) {
+ RenderShadowMap();
+ NeedNewShadowMap = GL_FALSE;
+ }
+
+ glViewport(0, 0, WindowWidth, WindowHeight);
+ if (DisplayMode == SHOW_DEPTH_IMAGE) {
+ ShowShadowMap();
+ }
+ else {
+ /* prepare to draw scene from camera's view */
+ const GLfloat ar = (GLfloat) WindowWidth / (GLfloat) WindowHeight;
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glFrustum(-ar, ar, -1.0, 1.0, 4.0, 50.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glTranslatef(0.0, 0.0, -22.0);
+ glRotatef(Xrot, 1, 0, 0);
+ glRotatef(Yrot, 0, 1, 0);
+ glRotatef(Zrot, 0, 0, 1);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glLightfv(GL_LIGHT0, GL_POSITION, LightPos);
+
+ if (LinearFilter) {
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ }
+ else {
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ }
+
+ if (DisplayMode == SHOW_DEPTH_MAPPING) {
+#if defined(GL_ARB_shadow)
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE_ARB, GL_NONE);
+#endif
+ glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+ glEnable(GL_TEXTURE_2D);
+ MakeShadowMatrix(LightPos, SpotDir, SpotAngle, ShadowNear, ShadowFar);
+ EnableIdentityTexgen();
+ }
+ else if (DisplayMode == SHOW_DISTANCE) {
+ glMatrixMode(GL_TEXTURE);
+ glLoadIdentity();
+ glMatrixMode(GL_MODELVIEW);
+ EnableDistanceTexgen(LightPos, SpotDir, ShadowNear+Bias, ShadowFar);
+ glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+ glEnable(GL_TEXTURE_1D);
+ assert(!glIsEnabled(GL_TEXTURE_2D));
+ }
+ else {
+ assert(DisplayMode == SHOW_SHADOWS);
+#if defined(GL_ARB_shadow)
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE_ARB,
+ GL_COMPARE_R_TO_TEXTURE_ARB);
+#endif
+ glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ glEnable(GL_TEXTURE_2D);
+ MakeShadowMatrix(LightPos, SpotDir, SpotAngle, ShadowNear, ShadowFar);
+ EnableIdentityTexgen();
+ }
+
+ DrawScene();
+
+ DisableTexgen();
+ glDisable(GL_TEXTURE_1D);
+ glDisable(GL_TEXTURE_2D);
+ }
+
+ glutSwapBuffers();
+
+ error = glGetError();
+ if (error) {
+ printf("GL Error: %s\n", (char *) gluErrorString(error));
+ }
+}
+
+
+static void
+Reshape(int width, int height)
+{
+ WindowWidth = width;
+ WindowHeight = height;
+ NeedNewShadowMap = GL_TRUE;
+}
+
+
+static void
+Idle(void)
+{
+ static double t0 = -1.;
+ double dt, t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
+ if (t0 < 0.0)
+ t0 = t;
+ dt = t - t0;
+ t0 = t;
+ Yrot += 75.0 * dt;
+ /*LightLongitude -= 5.0;*/
+ glutPostRedisplay();
+}
+
+
+static void
+Key(unsigned char key, int x, int y)
+{
+ const GLfloat step = 3.0;
+ (void) x;
+ (void) y;
+ switch (key) {
+ case 'a':
+ Anim = !Anim;
+ if (Anim)
+ glutIdleFunc(Idle);
+ else
+ glutIdleFunc(NULL);
+ break;
+ case 'b':
+ Bias -= 0.01;
+ printf("Bias %g\n", Bias);
+ break;
+ case 'B':
+ Bias += 0.01;
+ printf("Bias %g\n", Bias);
+ break;
+ case 'd':
+ DisplayMode = SHOW_DISTANCE;
+ break;
+ case 'f':
+ LinearFilter = !LinearFilter;
+ printf("%s filtering\n", LinearFilter ? "Bilinear" : "Nearest");
+ break;
+ case 'i':
+ DisplayMode = SHOW_DEPTH_IMAGE;
+ break;
+ case 'm':
+ DisplayMode = SHOW_DEPTH_MAPPING;
+ break;
+ case 'n':
+ case 's':
+ case ' ':
+ DisplayMode = SHOW_SHADOWS;
+ break;
+ case 'o':
+ if (HaveEXTshadowFuncs) {
+ Operator++;
+ if (Operator >= 8)
+ Operator = 0;
+ printf("Operator: %s\n", OperatorName[Operator]);
+#if defined(GL_ARB_shadow)
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC_ARB,
+ OperatorFunc[Operator]);
+#endif
+ }
+ break;
+ case 'p':
+ UsePackedDepthStencil = !UsePackedDepthStencil;
+ if (UsePackedDepthStencil && !HavePackedDepthStencil) {
+ printf("Sorry, GL_EXT_packed_depth_stencil not supported\n");
+ UsePackedDepthStencil = GL_FALSE;
+ }
+ else {
+ printf("Use GL_DEPTH_STENCIL_EXT: %d\n", UsePackedDepthStencil);
+ /* Don't really need to regenerate shadow map texture, but do so
+ * to exercise more code more often.
+ */
+ NeedNewShadowMap = GL_TRUE;
+ }
+ break;
+ case 'z':
+ Zrot -= step;
+ break;
+ case 'Z':
+ Zrot += step;
+ break;
+ case 27:
+ exit(0);
+ break;
+ }
+ glutPostRedisplay();
+}
+
+
+static void
+SpecialKey(int key, int x, int y)
+{
+ const GLfloat step = 3.0;
+ const int mod = glutGetModifiers();
+ (void) x;
+ (void) y;
+ switch (key) {
+ case GLUT_KEY_UP:
+ if (mod)
+ LightLatitude += step;
+ else
+ Xrot += step;
+ break;
+ case GLUT_KEY_DOWN:
+ if (mod)
+ LightLatitude -= step;
+ else
+ Xrot -= step;
+ break;
+ case GLUT_KEY_LEFT:
+ if (mod)
+ LightLongitude += step;
+ else
+ Yrot += step;
+ break;
+ case GLUT_KEY_RIGHT:
+ if (mod)
+ LightLongitude -= step;
+ else
+ Yrot -= step;
+ break;
+ }
+ if (mod)
+ NeedNewShadowMap = GL_TRUE;
+
+ glutPostRedisplay();
+}
+
+
+static void
+Init(void)
+{
+ static const GLfloat borderColor[4] = {1.0, 0.0, 0.0, 0.0};
+
+#if defined(GL_ARB_depth_texture) && defined(GL_ARB_shadow)
+ if (!glutExtensionSupported("GL_ARB_depth_texture") ||
+ !glutExtensionSupported("GL_ARB_shadow")) {
+#else
+ if (1) {
+#endif
+ printf("Sorry, this demo requires the GL_ARB_depth_texture and GL_ARB_shadow extensions\n");
+ exit(1);
+ }
+ printf("Using GL_ARB_depth_texture and GL_ARB_shadow\n");
+
+#if defined(GL_ARB_shadow_ambient)
+ HaveShadowAmbient = glutExtensionSupported("GL_ARB_shadow_ambient");
+ if (HaveShadowAmbient) {
+ printf("and GL_ARB_shadow_ambient\n");
+ }
+#endif
+
+ HaveEXTshadowFuncs = glutExtensionSupported("GL_EXT_shadow_funcs");
+
+ HavePackedDepthStencil = glutExtensionSupported("GL_EXT_packed_depth_stencil");
+ UsePackedDepthStencil = HavePackedDepthStencil;
+
+#if defined(GL_EXT_framebuffer_object)
+ HaveFBO = glutExtensionSupported("GL_EXT_framebuffer_object");
+ UseFBO = HaveFBO;
+ if (UseFBO) {
+ printf("Using GL_EXT_framebuffer_object\n");
+ }
+#endif
+
+ /*
+ * Set up the 2D shadow map texture
+ */
+ glGenTextures(1, &ShadowTexture);
+ glBindTexture(GL_TEXTURE_2D, ShadowTexture);
+ glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+#if defined(GL_ARB_shadow)
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE_ARB,
+ GL_COMPARE_R_TO_TEXTURE_ARB);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC_ARB, GL_LEQUAL);
+#endif
+ if (HaveShadowAmbient) {
+#if defined(GL_ARB_shadow_ambient)
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FAIL_VALUE_ARB, 0.3);
+#endif
+ }
+
+#if defined(GL_EXT_framebuffer_object)
+ if (UseFBO) {
+ glGenFramebuffersEXT(1, &ShadowFBO);
+ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, ShadowFBO);
+ glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT,
+ GL_COLOR_ATTACHMENT0_EXT,
+ GL_RENDERBUFFER_EXT, 0);
+ glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
+ GL_TEXTURE_2D, ShadowTexture, 0);
+
+ glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
+ }
+#endif
+
+ /*
+ * Setup 1-D grayscale texture image for SHOW_DISTANCE mode
+ */
+ glGenTextures(1, &GrayTexture);
+ glBindTexture(GL_TEXTURE_1D, GrayTexture);
+ glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP);
+ glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+ glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ {
+ GLuint i;
+ GLubyte image[256];
+ for (i = 0; i < 256; i++)
+ image[i] = i;
+ glTexImage1D(GL_TEXTURE_1D, 0, GL_LUMINANCE,
+ 256, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, image);
+ }
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+}
+
+
+static void
+PrintHelp(void)
+{
+ printf("Keys:\n");
+ printf(" a = toggle animation\n");
+ printf(" i = show depth texture image\n");
+ printf(" m = show depth texture mapping\n");
+ printf(" d = show fragment distance from light source\n");
+ printf(" n = show normal, shadowed image\n");
+ printf(" f = toggle nearest/bilinear texture filtering\n");
+ printf(" b/B = decrease/increase shadow map Z bias\n");
+ printf(" p = toggle use of packed depth/stencil\n");
+ printf(" cursor keys = rotate scene\n");
+ printf(" <shift> + cursor keys = rotate light source\n");
+ if (HaveEXTshadowFuncs)
+ printf(" o = cycle through comparison modes\n");
+}
+
+
+int
+main(int argc, char *argv[])
+{
+ glutInit(&argc, argv);
+ glutInitWindowPosition(0, 0);
+ glutInitWindowSize(WindowWidth, WindowHeight);
+ glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH | GLUT_STENCIL);
+ glutCreateWindow(argv[0]);
+ glutReshapeFunc(Reshape);
+ glutKeyboardFunc(Key);
+ glutSpecialFunc(SpecialKey);
+ glutDisplayFunc(Display);
+ if (Anim)
+ glutIdleFunc(Idle);
+ Init();
+ PrintHelp();
+ glutMainLoop();
+ return 0;
+}
diff --git a/progs/demos/singlebuffer.c b/progs/demos/singlebuffer.c
new file mode 100644
index 00000000000..9899c245b2a
--- /dev/null
+++ b/progs/demos/singlebuffer.c
@@ -0,0 +1,269 @@
+/*
+ * Demo of (nearly) flicker-free drawing with a single color buffer.
+ *
+ * Basically, draw the scene into the Z buffer first, then draw the
+ * scene into the color buffer. Finally, "clear" the background by
+ * setting the fragments we didn't hit earlier.
+ *
+ * This won't work if you need blending. The technique works best
+ * when the scene is relatively simple and can be rendered quickly
+ * (i.e. with hardware), and when the objects don't move too much from
+ * one frame to the next.
+ *
+ * Brian Paul
+ * 25 August 2005
+ *
+ * See Mesa license for terms.
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <GL/glut.h>
+
+
+#define FLICKER 0
+#define NO_FLICKER 1
+
+static GLint Mode = NO_FLICKER;
+static GLfloat Xrot = 0, Yrot = 0, Zrot = 0;
+static GLboolean Anim = GL_TRUE;
+static GLfloat ClearColor[4] = {0.2, 0.2, 0.9, 0.0};
+static GLfloat NearClip = 5.0, FarClip = 25.0, ViewDist = 7.0;
+static double PrevTime = -1;
+
+struct box {
+ float tx, ty, tz;
+ float rx, ry, rz, ra;
+ float sx, sy, sz;
+ float color[4];
+};
+
+#define NUM_BOXES 25
+
+struct box Boxes[NUM_BOXES];
+
+
+/* Return random float in [0,1] */
+static float
+Random(void)
+{
+ int i = rand();
+ return (float) (i % 1000) / 1000.0;
+}
+
+
+static void
+MakeBoxes(void)
+{
+ int i;
+ for (i = 0; i < NUM_BOXES; i++) {
+ Boxes[i].tx = -1.0 + 2.0 * Random();
+ Boxes[i].ty = -1.0 + 2.0 * Random();
+ Boxes[i].tz = -1.0 + 2.0 * Random();
+ Boxes[i].sx = 0.1 + Random() * 0.4;
+ Boxes[i].sy = 0.1 + Random() * 0.4;
+ Boxes[i].sz = 0.1 + Random() * 0.4;
+ Boxes[i].rx = Random();
+ Boxes[i].ry = Random();
+ Boxes[i].rz = Random();
+ Boxes[i].ra = Random() * 360.0;
+ Boxes[i].color[0] = Random();
+ Boxes[i].color[1] = Random();
+ Boxes[i].color[2] = Random();
+ Boxes[i].color[3] = 1.0;
+ }
+}
+
+
+static void
+DrawBoxes(void)
+{
+ int i;
+ for (i = 0; i < NUM_BOXES; i++) {
+ glPushMatrix();
+ glTranslatef(Boxes[i].tx, Boxes[i].ty, Boxes[i].tz);
+ glRotatef(Boxes[i].ra, Boxes[i].rx, Boxes[i].ry, Boxes[i].rz);
+ glScalef(Boxes[i].sx, Boxes[i].sy, Boxes[i].sz);
+ glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, Boxes[i].color);
+ glutSolidCube(1.0);
+ glPopMatrix();
+ }
+}
+
+
+static void
+Idle(void)
+{
+ double dt, t = glutGet(GLUT_ELAPSED_TIME) * 0.001;
+ if (PrevTime < 0.0)
+ PrevTime = t;
+ dt = t - PrevTime;
+ PrevTime = t;
+ Xrot += 16.0 * dt;
+ Yrot += 12.0 * dt;
+ Zrot += 8.0 * dt;
+ glutPostRedisplay();
+}
+
+
+static void
+Draw(void)
+{
+ if (Mode == FLICKER) {
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ }
+ else {
+ /* don't clear color buffer */
+ glClear(GL_DEPTH_BUFFER_BIT);
+ /* update Z buffer only */
+ glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
+ }
+
+ glPushMatrix();
+ glRotatef(Xrot, 1, 0, 0);
+ glRotatef(Yrot, 0, 1, 0);
+ glRotatef(Zrot, 0, 0, 1);
+
+ DrawBoxes();
+
+ if (Mode == NO_FLICKER) {
+ /* update color buffer now */
+ glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
+ glDepthFunc(GL_EQUAL);
+ DrawBoxes();
+ glDepthFunc(GL_LESS);
+ }
+
+ glPopMatrix();
+
+ if (Mode == NO_FLICKER) {
+ /* "clear" the untouched pixels now.
+ * Note: if you comment-out this code you'll see something interesting.
+ */
+ GLfloat x = FarClip / NearClip;
+ GLfloat z = -(FarClip - ViewDist - 1.0);
+ glDisable(GL_LIGHTING);
+ glColor4fv(ClearColor);
+ glBegin(GL_POLYGON);
+ glVertex3f(-x, -x, z);
+ glVertex3f( x, -x, z);
+ glVertex3f( x, x, z);
+ glVertex3f(-x, x, z);
+ glEnd();
+ glEnable(GL_LIGHTING);
+ }
+
+ /* This is where you'd normally do SwapBuffers */
+ glFinish();
+}
+
+
+static void
+Reshape(int width, int height)
+{
+ glViewport(0, 0, width, height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glFrustum(-1.0, 1.0, -1.0, 1.0, NearClip, FarClip);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glTranslatef(0.0, 0.0, -ViewDist);
+}
+
+
+static void
+Key(unsigned char key, int x, int y)
+{
+ (void) x;
+ (void) y;
+ switch (key) {
+ case 'a':
+ Anim = !Anim;
+ if (Anim)
+ glutIdleFunc(Idle);
+ else
+ glutIdleFunc(NULL);
+ PrevTime = -1;
+ break;
+ case 'm':
+ Mode = !Mode;
+ break;
+ case 'b':
+ MakeBoxes();
+ break;
+ case 27:
+ exit(0);
+ break;
+ }
+ glutPostRedisplay();
+}
+
+
+static void
+SpecialKey(int key, int x, int y)
+{
+ const GLfloat step = 3.0;
+ (void) x;
+ (void) y;
+ switch (key) {
+ case GLUT_KEY_UP:
+ Xrot -= step;
+ break;
+ case GLUT_KEY_DOWN:
+ Xrot += step;
+ break;
+ case GLUT_KEY_LEFT:
+ Yrot -= step;
+ break;
+ case GLUT_KEY_RIGHT:
+ Yrot += step;
+ break;
+ }
+ glutPostRedisplay();
+}
+
+
+static void
+Init(void)
+{
+ glClearColor(ClearColor[0], ClearColor[1], ClearColor[2], ClearColor[3]);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_CULL_FACE);
+ glEnable(GL_NORMALIZE);
+ MakeBoxes();
+}
+
+
+static void
+Usage(void)
+{
+ printf("Keys:\n");
+ printf(" m - toggle drawing mode (flicker vs. no flicker)\n");
+ printf(" a - toggle animation\n");
+ printf(" b - generate new boxes\n");
+ printf(" ARROWS - rotate scene\n");
+ printf(" ESC - exit\n");
+}
+
+
+int
+main(int argc, char *argv[])
+{
+ glutInit(&argc, argv);
+ glutInitWindowSize(800, 800);
+ glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE | GLUT_DEPTH);
+ glutCreateWindow(argv[0]);
+ glutReshapeFunc(Reshape);
+ glutKeyboardFunc(Key);
+ glutSpecialFunc(SpecialKey);
+ glutDisplayFunc(Draw);
+ if (Anim)
+ glutIdleFunc(Idle);
+ Init();
+ Usage();
+ glutMainLoop();
+ return 0;
+}
diff --git a/progs/demos/spectex.c b/progs/demos/spectex.c
new file mode 100644
index 00000000000..6ab1191579c
--- /dev/null
+++ b/progs/demos/spectex.c
@@ -0,0 +1,272 @@
+
+/*
+ * GLUT demonstration of texturing with specular highlights.
+ *
+ * When drawing a lit, textured surface one usually wants the specular
+ * highlight to override the texture colors. However, OpenGL applies
+ * texturing after lighting so the specular highlight is modulated by
+ * the texture.
+ *
+ * The solution here shown here is a two-pass algorithm:
+ * 1. Draw the textured surface without specular lighting.
+ * 2. Enable blending to add the next pass:
+ * 3. Redraw the surface with a matte white material and only the
+ * specular components of light sources enabled.
+ *
+ * Brian Paul February 1997
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <GL/glut.h>
+
+
+static GLUquadricObj *Quadric;
+static GLuint Sphere;
+static GLfloat LightPos[4] = {10.0, 10.0, 10.0, 1.0};
+static GLfloat Delta = 20.0;
+static GLint Mode = 4;
+
+/*static GLfloat Blue[4] = {0.0, 0.0, 1.0, 1.0};*/
+/*static GLfloat Gray[4] = {0.5, 0.5, 0.5, 1.0};*/
+static GLfloat Black[4] = {0.0, 0.0, 0.0, 1.0};
+static GLfloat White[4] = {1.0, 1.0, 1.0, 1.0};
+
+static GLboolean smooth = 1;
+
+static void
+Idle(void)
+{
+ static double t0 = -1.;
+ double dt, t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;;
+ if (t0 < 0.0)
+ t0 = t;
+ dt = t - t0;
+ t0 = t;
+ LightPos[0] += Delta * dt;
+ if (LightPos[0]>15.0 || LightPos[0]<-15.0)
+ Delta = -Delta;
+
+ glutPostRedisplay();
+}
+
+
+static void Display( void )
+{
+ glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+
+ glLightfv(GL_LIGHT0, GL_POSITION, LightPos);
+
+ glPushMatrix();
+ glRotatef(90.0, 1.0, 0.0, 0.0);
+
+ if (Mode==0) {
+ /* Typical method: diffuse + specular + texture */
+ glEnable(GL_TEXTURE_2D);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, White); /* enable diffuse */
+ glLightfv(GL_LIGHT0, GL_SPECULAR, White); /* enable specular */
+#ifdef GL_VERSION_1_2
+ glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SINGLE_COLOR);
+#endif
+ glCallList(Sphere);
+ }
+ else if (Mode==1) {
+ /* just specular highlight */
+ glDisable(GL_TEXTURE_2D);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, Black); /* disable diffuse */
+ glLightfv(GL_LIGHT0, GL_SPECULAR, White); /* enable specular */
+#ifdef GL_VERSION_1_2
+ glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SINGLE_COLOR);
+#endif
+ glCallList(Sphere);
+ }
+ else if (Mode==2) {
+ /* diffuse textured */
+ glEnable(GL_TEXTURE_2D);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, White); /* enable diffuse */
+ glLightfv(GL_LIGHT0, GL_SPECULAR, Black); /* disable specular */
+#ifdef GL_VERSION_1_2
+ glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SINGLE_COLOR);
+#endif
+ glCallList(Sphere);
+ }
+ else if (Mode==3) {
+ /* 2-pass: diffuse textured then add specular highlight*/
+ glEnable(GL_TEXTURE_2D);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, White); /* enable diffuse */
+ glLightfv(GL_LIGHT0, GL_SPECULAR, Black); /* disable specular */
+#ifdef GL_VERSION_1_2
+ glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SINGLE_COLOR);
+#endif
+ glCallList(Sphere);
+ /* specular highlight */
+ glDepthFunc(GL_EQUAL); /* redraw same pixels */
+ glDisable(GL_TEXTURE_2D);
+ glEnable(GL_BLEND); /* add */
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, Black); /* disable diffuse */
+ glLightfv(GL_LIGHT0, GL_SPECULAR, White); /* enable specular */
+ glCallList(Sphere);
+ glDepthFunc(GL_LESS);
+ glDisable(GL_BLEND);
+ }
+ else if (Mode==4) {
+ /* OpenGL 1.2's separate diffuse and specular color */
+ glEnable(GL_TEXTURE_2D);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, White); /* enable diffuse */
+ glLightfv(GL_LIGHT0, GL_SPECULAR, White); /* enable specular */
+#ifdef GL_VERSION_1_2
+ glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR);
+#endif
+ glCallList(Sphere);
+ }
+
+ glPopMatrix();
+
+ glutSwapBuffers();
+}
+
+
+static void Reshape( int width, int height )
+{
+ glViewport( 0, 0, width, height );
+ glMatrixMode( GL_PROJECTION );
+ glLoadIdentity();
+ glFrustum( -1.0, 1.0, -1.0, 1.0, 5.0, 25.0 );
+ glMatrixMode( GL_MODELVIEW );
+ glLoadIdentity();
+ glTranslatef( 0.0, 0.0, -12.0 );
+}
+
+
+static void Key( unsigned char key, int x, int y )
+{
+ (void) x;
+ (void) y;
+ switch (key) {
+ case 27:
+ exit(0);
+ break;
+ case 's':
+ smooth = !smooth;
+ if (smooth)
+ glShadeModel(GL_SMOOTH);
+ else
+ glShadeModel(GL_FLAT);
+ break;
+ }
+ glutPostRedisplay();
+}
+
+
+static void SpecialKey( int key, int x, int y )
+{
+ (void) x;
+ (void) y;
+ switch (key) {
+ case GLUT_KEY_UP:
+ break;
+ case GLUT_KEY_DOWN:
+ break;
+ }
+ glutPostRedisplay();
+}
+
+
+static void Init( void )
+{
+ int i, j;
+ GLubyte texImage[64][64][3];
+
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 0);
+ glLightModelfv(GL_LIGHT_MODEL_AMBIENT, Black);
+
+ glShadeModel(GL_SMOOTH);
+
+ glMaterialfv(GL_FRONT, GL_DIFFUSE, White);
+ glMaterialfv(GL_FRONT, GL_SPECULAR, White);
+ glMaterialf(GL_FRONT, GL_SHININESS, 20.0);
+
+ /* Actually, these are set again later */
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, White);
+ glLightfv(GL_LIGHT0, GL_SPECULAR, White);
+
+ Quadric = gluNewQuadric();
+ gluQuadricTexture( Quadric, GL_TRUE );
+
+ Sphere= glGenLists(1);
+ glNewList( Sphere, GL_COMPILE );
+ gluSphere( Quadric, 1.0, 24, 24 );
+ glEndList();
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+
+ for (i=0;i<64;i++) {
+ for (j=0;j<64;j++) {
+ int k = ((i>>3)&1) ^ ((j>>3)&1);
+ texImage[i][j][0] = 255*k;
+ texImage[i][j][1] = 255*(1-k);
+ texImage[i][j][2] = 0;
+ }
+ }
+
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ glTexImage2D( GL_TEXTURE_2D,
+ 0,
+ 3,
+ 64, 64,
+ 0,
+ GL_RGB, GL_UNSIGNED_BYTE,
+ texImage );
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ glEnable(GL_TEXTURE_2D);
+
+ glBlendFunc(GL_ONE, GL_ONE);
+}
+
+
+static void ModeMenu(int entry)
+{
+ if (entry==99)
+ exit(0);
+ Mode = entry;
+}
+
+
+int main( int argc, char *argv[] )
+{
+
+ glutInit( &argc, argv );
+ glutInitWindowPosition( 0, 0 );
+ glutInitWindowSize( 300, 300 );
+
+ glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH );
+
+ glutCreateWindow( "spectex" );
+
+ Init();
+
+ glutReshapeFunc( Reshape );
+ glutKeyboardFunc( Key );
+ glutSpecialFunc( SpecialKey );
+ glutDisplayFunc( Display );
+ glutIdleFunc( Idle );
+
+ glutCreateMenu( ModeMenu );
+ glutAddMenuEntry("1-pass lighting + texturing", 0);
+ glutAddMenuEntry("specular lighting", 1);
+ glutAddMenuEntry("diffuse lighting + texturing", 2);
+ glutAddMenuEntry("2-pass lighting + texturing", 3);
+#ifdef GL_VERSION_1_2
+ glutAddMenuEntry("OpenGL 1.2 separate specular", 4);
+#endif
+ glutAddMenuEntry("Quit", 99);
+ glutAttachMenu(GLUT_RIGHT_BUTTON);
+
+ glutMainLoop();
+ return 0;
+}
diff --git a/progs/demos/spriteblast.c b/progs/demos/spriteblast.c
new file mode 100644
index 00000000000..d6e9a4de2fd
--- /dev/null
+++ b/progs/demos/spriteblast.c
@@ -0,0 +1,554 @@
+
+/* Copyright (c) Mark J. Kilgard, 1997. */
+
+/* This program is freely distributable without licensing fees
+ and is provided without guarantee or warrantee expressed or
+ implied. This program is -not- in the public domain. */
+
+/* This example demonstrates how to render particle effects
+ with OpenGL. A cloud of pinkish/orange particles explodes with the
+ particles bouncing off the ground. When the EXT_point_parameters
+ is present , the particle size is attenuated based on eye distance. */
+
+
+/* Modified by Brian Paul to test GL_ARB_point_sprite */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h> /* for cos(), sin(), and sqrt() */
+#ifdef _WIN32
+#include <windows.h>
+#endif
+#define GL_GLEXT_PROTOTYPES
+#include <GL/glut.h>
+
+/* Some <math.h> files do not define M_PI... */
+#ifndef M_PI
+#define M_PI 3.14159265
+#endif
+
+#if 0 /* For debugging. */
+#undef GL_EXT_point_parameters
+#endif
+
+static GLfloat angle = -150; /* in degrees */
+static int spin = 0;
+static int moving, begin;
+static float theTime;
+static int repeat = 1;
+static int blend = 1;
+int useMipmaps = 1;
+int linearFiltering = 1;
+
+static GLfloat constant[3] = { .2, 0.0, 0.0 };
+static GLfloat linear[3] = { .0, .1, 0.0 };
+static GLfloat theQuad[3] = { .005, 0.1, 1/600.0 };
+
+#define MAX_POINTS 2000
+
+static int numPoints = 200;
+
+static GLfloat pointList[MAX_POINTS][3];
+static GLfloat pointTime[MAX_POINTS];
+static GLfloat pointVelocity[MAX_POINTS][2];
+static GLfloat pointDirection[MAX_POINTS][2];
+static int colorList[MAX_POINTS];
+static int animate = 1, motion = 0, org = 0, sprite = 1, smooth = 1;
+
+static GLfloat colorSet[][4] = {
+ /* Shades of red. */
+ { 0.7, 0.2, 0.4, 0.5 },
+ { 0.8, 0.0, 0.7, 0.5 },
+ { 1.0, 0.0, 0.0, 0.5 },
+ { 0.9, 0.3, 0.6, 0.5 },
+ { 1.0, 0.4, 0.0, 0.5 },
+ { 1.0, 0.0, 0.5, 0.5 },
+};
+
+#define NUM_COLORS (sizeof(colorSet)/sizeof(colorSet[0]))
+
+#define DEAD (NUM_COLORS+1)
+
+
+/* GL */
+static GLint spritePattern[16][16] = {
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0 },
+ { 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0 },
+ { 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0 },
+ { 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0 },
+ { 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0 },
+ { 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0 },
+ { 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0 },
+ { 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0 },
+ { 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0 },
+ { 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
+};
+
+
+
+
+#if 0 /* drand48 might be better on Unix machines */
+#define RANDOM_RANGE(lo, hi) ((lo) + (hi - lo) * drand48())
+#else
+static float float_rand(void) { return rand() / (float) RAND_MAX; }
+#define RANDOM_RANGE(lo, hi) ((lo) + (hi - lo) * float_rand())
+#endif
+
+#define MEAN_VELOCITY 3.0
+#define GRAVITY 2.0
+
+/* Modeling units of ground extent in each X and Z direction. */
+#define EDGE 12
+
+static void
+makePointList(void)
+{
+ float angle, velocity, direction;
+ int i;
+
+ motion = 1;
+ for (i=0; i<numPoints; i++) {
+ pointList[i][0] = 0.0;
+ pointList[i][1] = 0.0;
+ pointList[i][2] = 0.0;
+ pointTime[i] = 0.0;
+ angle = (RANDOM_RANGE(60.0, 70.0)) * M_PI/180.0;
+ direction = RANDOM_RANGE(0.0, 360.0) * M_PI/180.0;
+ pointDirection[i][0] = cos(direction);
+ pointDirection[i][1] = sin(direction);
+ velocity = MEAN_VELOCITY + RANDOM_RANGE(-0.8, 1.0);
+ pointVelocity[i][0] = velocity * cos(angle);
+ pointVelocity[i][1] = velocity * sin(angle);
+ colorList[i] = rand() % NUM_COLORS;
+ }
+ theTime = 0.0;
+}
+
+static void
+updatePointList(void)
+{
+ float distance;
+ int i;
+
+ static double t0 = -1.;
+ double dt, t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
+ if (t0 < 0.0)
+ t0 = t;
+ dt = t - t0;
+ t0 = t;
+
+ motion = 0;
+ for (i=0; i<numPoints; i++) {
+ distance = pointVelocity[i][0] * theTime;
+
+ /* X and Z */
+ pointList[i][0] = pointDirection[i][0] * distance;
+ pointList[i][2] = pointDirection[i][1] * distance;
+
+ /* Z */
+ pointList[i][1] =
+ (pointVelocity[i][1] - 0.5 * GRAVITY * pointTime[i])*pointTime[i];
+
+ /* If we hit the ground, bounce the point upward again. */
+ if (pointList[i][1] <= 0.0) {
+ if (distance > EDGE) {
+ /* Particle has hit ground past the distance duration of
+ the particles. Mark particle as dead. */
+ colorList[i] = NUM_COLORS; /* Not moving. */
+ continue;
+ }
+
+ pointVelocity[i][1] *= 0.8; /* 80% of previous up velocity. */
+ pointTime[i] = 0.0; /* Reset the particles sense of up time. */
+ }
+ motion = 1;
+ pointTime[i] += dt;
+ }
+ theTime += dt;
+ if (!motion && !spin) {
+ if (repeat) {
+ makePointList();
+ } else {
+ glutIdleFunc(NULL);
+ }
+ }
+}
+
+static void
+idle(void)
+{
+ updatePointList();
+ if (spin) {
+ angle += 0.3;
+ }
+ glutPostRedisplay();
+}
+
+static void
+visible(int vis)
+{
+ if (vis == GLUT_VISIBLE) {
+ if (animate && (motion || spin)) {
+ glutIdleFunc(idle);
+ }
+ } else {
+ glutIdleFunc(NULL);
+ }
+}
+
+static void
+redraw(void)
+{
+ int i;
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix();
+ glRotatef(15.0, 1.0, 0.0, 0.0);
+ glRotatef(angle, 0.0, 1.0, 0.0);
+
+ glDepthMask(GL_FALSE);
+
+ /* Draw the floor. */
+/* glEnable(GL_TEXTURE_2D);*/
+ glColor3f(0.1, 0.5, 1.0);
+ glBegin(GL_QUADS);
+ glTexCoord2f(0.0, 0.0);
+ glVertex3f(-EDGE, -0.05, -EDGE);
+ glTexCoord2f(20.0, 0.0);
+ glVertex3f(EDGE, -0.05, -EDGE);
+ glTexCoord2f(20.0, 20.0);
+ glVertex3f(EDGE, -0.05, EDGE);
+ glTexCoord2f(0.0, 20.0);
+ glVertex3f(-EDGE, -0.05, EDGE);
+ glEnd();
+
+ /* Allow particles to blend with each other. */
+ glDepthMask(GL_TRUE);
+
+ if (blend)
+ glEnable(GL_BLEND);
+
+ if (sprite) {
+ glEnable(GL_TEXTURE_2D);
+#ifdef GL_ARB_point_sprite
+ glEnable(GL_POINT_SPRITE_ARB);
+#endif
+ }
+
+ glColor3f(1,1,1);
+ glBegin(GL_POINTS);
+ for (i=0; i<numPoints; i++) {
+ /* Draw alive particles. */
+ if (colorList[i] != DEAD) {
+ if (!sprite) glColor4fv(colorSet[colorList[i]]);
+ glVertex3fv(pointList[i]);
+ }
+ }
+ glEnd();
+
+ glDisable(GL_TEXTURE_2D);
+#ifdef GL_ARB_point_sprite
+ glDisable(GL_POINT_SPRITE_ARB);
+#endif
+ glDisable(GL_BLEND);
+
+ glPopMatrix();
+
+ glutSwapBuffers();
+}
+
+/* ARGSUSED2 */
+static void
+mouse(int button, int state, int x, int y)
+{
+ /* Scene can be spun around Y axis using left
+ mouse button movement. */
+ if (button == GLUT_LEFT_BUTTON && state == GLUT_DOWN) {
+ moving = 1;
+ begin = x;
+ }
+ if (button == GLUT_LEFT_BUTTON && state == GLUT_UP) {
+ moving = 0;
+ }
+}
+
+/* ARGSUSED1 */
+static void
+mouseMotion(int x, int y)
+{
+ if (moving) {
+ angle = angle + (x - begin);
+ begin = x;
+ glutPostRedisplay();
+ }
+}
+
+static void
+menu(int option)
+{
+ switch (option) {
+ case 0:
+ makePointList();
+ break;
+#ifdef GL_ARB_point_parameters
+ case 1:
+ glPointParameterfvARB(GL_POINT_DISTANCE_ATTENUATION_ARB, constant);
+ break;
+ case 2:
+ glPointParameterfvARB(GL_POINT_DISTANCE_ATTENUATION_ARB, linear);
+ break;
+ case 3:
+ glPointParameterfvARB(GL_POINT_DISTANCE_ATTENUATION_ARB, theQuad);
+ break;
+#endif
+ case 4:
+ blend = 1;
+ break;
+ case 5:
+ blend = 0;
+ break;
+#ifdef GL_ARB_point_parameters
+ case 6:
+ glPointParameterfARB(GL_POINT_FADE_THRESHOLD_SIZE_ARB, 1.0);
+ break;
+ case 7:
+ glPointParameterfARB(GL_POINT_FADE_THRESHOLD_SIZE_ARB, 10.0);
+ break;
+#endif
+ case 8:
+ glEnable(GL_POINT_SMOOTH);
+ smooth = 1;
+ break;
+ case 9:
+ glDisable(GL_POINT_SMOOTH);
+ smooth = 0;
+ break;
+ case 10:
+ glPointSize(4.0);
+ break;
+ case 11:
+ glPointSize(8.0);
+ break;
+ case 12:
+ glPointSize(16.0);
+ break;
+ case 13:
+ spin = 1 - spin;
+ if (animate && (spin || motion)) {
+ glutIdleFunc(idle);
+ } else {
+ glutIdleFunc(NULL);
+ }
+ break;
+ case 14:
+ numPoints = 200;
+ break;
+ case 15:
+ numPoints = 500;
+ break;
+ case 16:
+ numPoints = 1000;
+ break;
+ case 17:
+ numPoints = 2000;
+ break;
+ case 666:
+ exit(0);
+ }
+ glutPostRedisplay();
+}
+
+/* ARGSUSED1 */
+static void
+key(unsigned char c, int x, int y)
+{
+ switch (c) {
+ case 13:
+ animate = 1 - animate; /* toggle. */
+ if (animate && (motion || spin)) {
+ glutIdleFunc(idle);
+ } else {
+ glutIdleFunc(NULL);
+ }
+ break;
+ case ' ':
+ animate = 1;
+ makePointList();
+ glutIdleFunc(idle);
+ break;
+ case 'o':
+ case 'O':
+ org ^= 1;
+#ifdef GL_VERSION_2_0
+#ifdef GL_ARB_point_parameters
+ glPointParameteri(GL_POINT_SPRITE_COORD_ORIGIN,
+ org ? GL_LOWER_LEFT : GL_UPPER_LEFT);
+#endif
+#endif
+ glutPostRedisplay();
+ break;
+ case 't':
+ case 'T':
+ sprite ^= 1;
+ glutPostRedisplay();
+ break;
+ case 's':
+ case 'S':
+ (smooth ^= 1) ? glEnable(GL_POINT_SMOOTH) : glDisable(GL_POINT_SMOOTH);
+ glutPostRedisplay();
+ break;
+ case '0':
+ glPointSize(1.0);
+ glutPostRedisplay();
+ break;
+ case '1':
+ glPointSize(2.0);
+ glutPostRedisplay();
+ break;
+ case '2':
+ glPointSize(4.0);
+ glutPostRedisplay();
+ break;
+ case '3':
+ glPointSize(8.0);
+ glutPostRedisplay();
+ break;
+ case '4':
+ glPointSize(16.0);
+ glutPostRedisplay();
+ break;
+ case 27:
+ exit(0);
+ }
+}
+
+
+
+static void
+makeSprite(void)
+{
+ GLubyte texture[16][16][4];
+ int i, j;
+
+ if (!glutExtensionSupported("GL_ARB_point_sprite")) {
+ printf("Sorry, this demo requires GL_ARB_point_sprite.\n");
+ exit(0);
+ }
+ if (!glutExtensionSupported("GL_ARB_point_parameters")) {
+ printf("Sorry, this demo requires GL_ARB_point_parameters.\n");
+ exit(0);
+ }
+
+ for (i = 0; i < 16; i++) {
+ for (j = 0; j < 16; j++) {
+ if (spritePattern[i][j]) {
+ texture[i][j][0] = 255;
+ texture[i][j][1] = 255;
+ texture[i][j][2] = 255;
+ texture[i][j][3] = 255;
+ }
+ else {
+ texture[i][j][0] = 255;
+ texture[i][j][1] = 0;
+ texture[i][j][2] = 0;
+ texture[i][j][3] = 0;
+ }
+ }
+ }
+
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE,
+ texture);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+#ifdef GL_ARB_point_sprite
+ glTexEnvi(GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE);
+#endif
+}
+
+
+static void
+reshape(int width, int height)
+{
+ GLfloat h = (GLfloat) height / (GLfloat) width;
+
+ glViewport(0, 0, (GLint) width, (GLint) height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glFrustum(-1.0, 1.0, -h, h, 2.0, 30.0);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glTranslatef(0.0, 0.0, -10.0);
+}
+
+int
+main(int argc, char **argv)
+{
+ int i;
+ glutInit(&argc, argv);
+ glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH | GLUT_MULTISAMPLE);
+
+ for (i=1; i<argc; i++) {
+ if(!strcmp("-noms", argv[i])) {
+ glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
+ printf("forcing no multisampling\n");
+ } else if(!strcmp("-nomipmaps", argv[i])) {
+ useMipmaps = 0;
+ } else if(!strcmp("-nearest", argv[i])) {
+ linearFiltering = 0;
+ }
+ }
+ glutInitWindowPosition(0, 0);
+ glutInitWindowSize(600,300);
+ glutCreateWindow("sprite blast");
+ glutReshapeFunc(reshape);
+ glutDisplayFunc(redraw);
+ glutMouseFunc(mouse);
+ glutMotionFunc(mouseMotion);
+ glutVisibilityFunc(visible);
+ glutKeyboardFunc(key);
+ glutCreateMenu(menu);
+ glutAddMenuEntry("Reset time", 0);
+ glutAddMenuEntry("Constant", 1);
+ glutAddMenuEntry("Linear", 2);
+ glutAddMenuEntry("Quadratic", 3);
+ glutAddMenuEntry("Blend on", 4);
+ glutAddMenuEntry("Blend off", 5);
+ glutAddMenuEntry("Threshold 1", 6);
+ glutAddMenuEntry("Threshold 10", 7);
+ glutAddMenuEntry("Point smooth on", 8);
+ glutAddMenuEntry("Point smooth off", 9);
+ glutAddMenuEntry("Point size 4", 10);
+ glutAddMenuEntry("Point size 8", 11);
+ glutAddMenuEntry("Point size 16", 12);
+ glutAddMenuEntry("Toggle spin", 13);
+ glutAddMenuEntry("200 points ", 14);
+ glutAddMenuEntry("500 points ", 15);
+ glutAddMenuEntry("1000 points ", 16);
+ glutAddMenuEntry("2000 points ", 17);
+ glutAddMenuEntry("Quit", 666);
+ glutAttachMenu(GLUT_RIGHT_BUTTON);
+
+ glShadeModel(GL_FLAT);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_POINT_SMOOTH);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glPointSize(16.0);
+#ifdef GL_ARB_point_parameters
+ glPointParameterfvARB(GL_POINT_DISTANCE_ATTENUATION_ARB, theQuad);
+#endif
+
+ makePointList();
+ makeSprite();
+
+ glutMainLoop();
+ return 0; /* ANSI C requires main to return int. */
+}
diff --git a/progs/demos/stex3d.c b/progs/demos/stex3d.c
new file mode 100644
index 00000000000..e4554d071f3
--- /dev/null
+++ b/progs/demos/stex3d.c
@@ -0,0 +1,678 @@
+/*-----------------------------
+ * stex3d.c GL example of the mesa 3d-texture extention to simulate procedural
+ * texturing, it uses a perlin noise and turbulence functions.
+ *
+ * Author: Daniel Barrero
+ *
+ * Converted to GLUT by brianp on 1/1/98
+ * Massive clean-up on 2002/10/23 by brianp
+ *
+ *
+ * cc stex3d.c -o stex3d -lglut -lMesaGLU -lMesaGL -lX11 -lXext -lm
+ *
+ *---------------------------- */
+
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <GL/gl.h>
+#include <GL/glut.h>
+
+
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+
+#define NOISE_TEXTURE 1
+#define GRADIENT_TEXTURE 2
+
+#define TORUS 1
+#define SPHERE 2
+
+static int tex_width=64, tex_height=64, tex_depth=64;
+static float angx=0, angy=0, angz=0;
+static int texgen = 2, animate = 1, smooth = 1, wireframe = 0;
+static int CurTexture = NOISE_TEXTURE, CurObject = TORUS;
+
+
+static void
+BuildTorus(void)
+{
+ GLint i, j;
+ float theta1, phi1, theta2, phi2, rings, sides;
+ float v0[03], v1[3], v2[3], v3[3];
+ float t0[03], t1[3], t2[3], t3[3];
+ float n0[3], n1[3], n2[3], n3[3];
+ float innerRadius = 0.25;
+ float outerRadius = 0.5;
+ float scalFac;
+
+ rings = 16;
+ sides = 12;
+ scalFac = 1 / (outerRadius * 2);
+
+ glNewList(TORUS, GL_COMPILE);
+ for (i = 0; i < rings; i++) {
+ theta1 = (float) i *2.0 * M_PI / rings;
+ theta2 = (float) (i + 1) * 2.0 * M_PI / rings;
+ for (j = 0; j < sides; j++) {
+ phi1 = (float) j *2.0 * M_PI / sides;
+ phi2 = (float) (j + 1) * 2.0 * M_PI / sides;
+
+ v0[0] = cos(theta1) * (outerRadius + innerRadius * cos(phi1));
+ v0[1] = -sin(theta1) * (outerRadius + innerRadius * cos(phi1));
+ v0[2] = innerRadius * sin(phi1);
+
+ v1[0] = cos(theta2) * (outerRadius + innerRadius * cos(phi1));
+ v1[1] = -sin(theta2) * (outerRadius + innerRadius * cos(phi1));
+ v1[2] = innerRadius * sin(phi1);
+ v2[0] = cos(theta2) * (outerRadius + innerRadius * cos(phi2));
+ v2[1] = -sin(theta2) * (outerRadius + innerRadius * cos(phi2));
+ v2[2] = innerRadius * sin(phi2);
+
+ v3[0] = cos(theta1) * (outerRadius + innerRadius * cos(phi2));
+ v3[1] = -sin(theta1) * (outerRadius + innerRadius * cos(phi2));
+ v3[2] = innerRadius * sin(phi2);
+
+ n0[0] = cos(theta1) * (cos(phi1));
+ n0[1] = -sin(theta1) * (cos(phi1));
+ n0[2] = sin(phi1);
+
+ n1[0] = cos(theta2) * (cos(phi1));
+ n1[1] = -sin(theta2) * (cos(phi1));
+ n1[2] = sin(phi1);
+
+ n2[0] = cos(theta2) * (cos(phi2));
+ n2[1] = -sin(theta2) * (cos(phi2));
+ n2[2] = sin(phi2);
+
+ n3[0] = cos(theta1) * (cos(phi2));
+ n3[1] = -sin(theta1) * (cos(phi2));
+ n3[2] = sin(phi2);
+
+ t0[0] = v0[0] * scalFac + 0.5;
+ t0[1] = v0[1] * scalFac + 0.5;
+ t0[2] = v0[2] * scalFac + 0.5;
+
+ t1[0] = v1[0] * scalFac + 0.5;
+ t1[1] = v1[1] * scalFac + 0.5;
+ t1[2] = v1[2] * scalFac + 0.5;
+
+ t2[0] = v2[0] * scalFac + 0.5;
+ t2[1] = v2[1] * scalFac + 0.5;
+ t2[2] = v2[2] * scalFac + 0.5;
+
+ t3[0] = v3[0] * scalFac + 0.5;
+ t3[1] = v3[1] * scalFac + 0.5;
+ t3[2] = v3[2] * scalFac + 0.5;
+
+ glBegin(GL_POLYGON);
+ glNormal3fv(n3);
+ glTexCoord3fv(t3);
+ glVertex3fv(v3);
+ glNormal3fv(n2);
+ glTexCoord3fv(t2);
+ glVertex3fv(v2);
+ glNormal3fv(n1);
+ glTexCoord3fv(t1);
+ glVertex3fv(v1);
+ glNormal3fv(n0);
+ glTexCoord3fv(t0);
+ glVertex3fv(v0);
+ glEnd();
+ }
+ }
+ glEndList();
+}
+
+
+/*--------------------------------------------------------------------
+ noise function over R3 - implemented by a pseudorandom tricubic spline
+ EXCERPTED FROM SIGGRAPH 92, COURSE 23
+ PROCEDURAL MODELING
+ Ken Perlin
+ New York University
+----------------------------------------------------------------------*/
+
+
+#define DOT(a,b) (a[0] * b[0] + a[1] * b[1] + a[2] * b[2])
+#define B 128
+static int p[B + B + 2];
+static float g[B + B + 2][3];
+#define setup(i,b0,b1,r0,r1) \
+ t = vec[i] + 10000.; \
+ b0 = ((int)t) & (B-1); \
+ b1 = (b0+1) & (B-1); \
+ r0 = t - (int)t; \
+ r1 = r0 - 1.;
+
+static float
+noise3(float vec[3])
+{
+ int bx0, bx1, by0, by1, bz0, bz1, b00, b10, b01, b11;
+ float rx0, rx1, ry0, ry1, rz0, rz1, *q, sx, sy, sz, a, b, c, d, t, u, v;
+ register int i, j;
+
+ setup(0, bx0, bx1, rx0, rx1);
+ setup(1, by0, by1, ry0, ry1);
+ setup(2, bz0, bz1, rz0, rz1);
+
+ i = p[bx0];
+ j = p[bx1];
+
+ b00 = p[i + by0];
+ b10 = p[j + by0];
+ b01 = p[i + by1];
+ b11 = p[j + by1];
+
+#define at(rx,ry,rz) ( rx * q[0] + ry * q[1] + rz * q[2] )
+#define surve(t) ( t * t * (3. - 2. * t) )
+#define lerp(t, a, b) ( a + t * (b - a) )
+
+ sx = surve(rx0);
+ sy = surve(ry0);
+ sz = surve(rz0);
+
+ q = g[b00 + bz0];
+ u = at(rx0, ry0, rz0);
+ q = g[b10 + bz0];
+ v = at(rx1, ry0, rz0);
+ a = lerp(sx, u, v);
+
+ q = g[b01 + bz0];
+ u = at(rx0, ry1, rz0);
+ q = g[b11 + bz0];
+ v = at(rx1, ry1, rz0);
+ b = lerp(sx, u, v);
+
+ c = lerp(sy, a, b); /* interpolate in y at lo x */
+
+ q = g[b00 + bz1];
+ u = at(rx0, ry0, rz1);
+ q = g[b10 + bz1];
+ v = at(rx1, ry0, rz1);
+ a = lerp(sx, u, v);
+
+ q = g[b01 + bz1];
+ u = at(rx0, ry1, rz1);
+ q = g[b11 + bz1];
+ v = at(rx1, ry1, rz1);
+ b = lerp(sx, u, v);
+
+ d = lerp(sy, a, b); /* interpolate in y at hi x */
+
+ return 1.5 * lerp(sz, c, d); /* interpolate in z */
+}
+
+static void
+initNoise(void)
+{
+ /*long random(); */
+ int i, j, k;
+ float v[3], s;
+
+ /* Create an array of random gradient vectors uniformly on the unit sphere */
+ /*srandom(1); */
+ srand(1);
+ for (i = 0; i < B; i++) {
+ do { /* Choose uniformly in a cube */
+ for (j = 0; j < 3; j++)
+ v[j] = (float) ((rand() % (B + B)) - B) / B;
+ s = DOT(v, v);
+ } while (s > 1.0); /* If not in sphere try again */
+ s = sqrt(s);
+ for (j = 0; j < 3; j++) /* Else normalize */
+ g[i][j] = v[j] / s;
+ }
+
+ /* Create a pseudorandom permutation of [1..B] */
+ for (i = 0; i < B; i++)
+ p[i] = i;
+ for (i = B; i > 0; i -= 2) {
+ k = p[i];
+ p[i] = p[j = rand() % B];
+ p[j] = k;
+ }
+
+ /* Extend g and p arrays to allow for faster indexing */
+ for (i = 0; i < B + 2; i++) {
+ p[B + i] = p[i];
+ for (j = 0; j < 3; j++)
+ g[B + i][j] = g[i][j];
+ }
+}
+
+
+static float
+turbulence(float point[3], float lofreq, float hifreq)
+{
+ float freq, t, p[3];
+
+ p[0] = point[0] + 123.456;
+ p[1] = point[1];
+ p[2] = point[2];
+
+ t = 0;
+ for (freq = lofreq; freq < hifreq; freq *= 2.) {
+ t += fabs(noise3(p)) / freq;
+ p[0] *= 2.;
+ p[1] *= 2.;
+ p[2] *= 2.;
+ }
+ return t - 0.3; /* readjust to make mean value = 0.0 */
+}
+
+
+static void
+create3Dtexture(void)
+{
+ unsigned char *voxels = NULL;
+ int i, j, k;
+ unsigned char *vp;
+ float vec[3];
+ int tmp;
+
+ printf("creating 3d textures...\n");
+ voxels =
+ (unsigned char *)
+ malloc((size_t) (4 * tex_width * tex_height * tex_depth));
+ vp = voxels;
+ for (i = 0; i < tex_width; i++) {
+ vec[0] = i;
+ for (j = 0; j < tex_height; j++) {
+ vec[1] = j;
+ for (k = 0; k < tex_depth; k++) {
+ vec[2] = k;
+ tmp = (sin(k * i * j + turbulence(vec, 0.01, 1)) + 1) * 127.5;
+ *vp++ = 0;
+ *vp++ = 0;
+ *vp++ = tmp;
+ *vp++ = tmp + 128;
+ }
+ }
+ }
+
+ printf("setting up 3d texture...\n");
+
+ glBindTexture(GL_TEXTURE_3D, NOISE_TEXTURE);
+ glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_REPEAT);
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
+
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA,
+ tex_width, tex_height, tex_depth,
+ 0, GL_RGBA, GL_UNSIGNED_BYTE, voxels);
+
+ free(voxels);
+
+ printf("finished setting up 3d texture image.\n");
+}
+
+
+static void
+printHelp(void)
+{
+ printf("\nUsage: stex3d <cmd line options>\n");
+ printf(" cmd line options:\n");
+ printf(" -wxxx Width of the texture (Default=64)\n");
+ printf(" -hxxx Height of the texture (Default=64)\n");
+ printf(" -dxxx Depth of the texture (Default=64)\n");
+ printf(" Keyboard Options:\n");
+ printf(" up/down rotate around X\n");
+ printf(" left/right rotate around Y\n");
+ printf(" z/Z rotate around Z\n");
+ printf(" a toggle animation\n");
+ printf(" s toggle smooth shading\n");
+ printf(" t toggle texgen mode\n");
+ printf(" o toggle object: torus/sphere\n");
+ printf(" i toggle texture image: noise/gradient\n");
+}
+
+
+static GLenum
+parseCmdLine(int argc, char **argv)
+{
+ GLint i;
+
+ for (i = 1; i < argc; i++) {
+ if (strstr(argv[i], "-w") == 0) {
+ tex_width = atoi((argv[i]) + 2);
+ }
+ else if (strstr(argv[i], "-h") == 0) {
+ tex_height = atoi((argv[i]) + 2);
+ }
+ else if (strstr(argv[i], "-d") == 0) {
+ tex_depth = atoi((argv[i]) + 2);
+ }
+ else if (strcmp(argv[i], "-help") == 0) {
+ printHelp();
+ return GL_FALSE;
+ }
+ else {
+ printf("%s (Bad option).\n", argv[i]);
+ printHelp();
+ return GL_FALSE;
+ }
+ }
+ if (tex_width == 0 || tex_height == 0 || tex_depth == 0) {
+ printf("%s (Bad option).\n", "size parameters can't be 0");
+ printHelp();
+ return GL_FALSE;
+ }
+ return GL_TRUE;
+}
+
+
+static void
+drawScene(void)
+{
+ static const GLfloat sPlane[4] = { 0.5, 0, 0, -.5 };
+ static const GLfloat tPlane[4] = { 0, 0.5, 0, -.5 };
+ static const GLfloat rPlane[4] = { 0, 0, 0.5, -.5 };
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ glPushMatrix();
+ if (texgen == 2) {
+ glTexGenfv(GL_S, GL_EYE_PLANE, sPlane);
+ glTexGenfv(GL_T, GL_EYE_PLANE, tPlane);
+ glTexGenfv(GL_R, GL_EYE_PLANE, rPlane);
+ }
+
+ glRotatef(angx, 1.0, 0.0, 0.0);
+ glRotatef(angy, 0.0, 1.0, 0.0);
+ glRotatef(angz, 0.0, 0.0, 1.0);
+
+ if (texgen == 1) {
+ glTexGenfv(GL_S, GL_EYE_PLANE, sPlane);
+ glTexGenfv(GL_T, GL_EYE_PLANE, tPlane);
+ glTexGenfv(GL_R, GL_EYE_PLANE, rPlane);
+ }
+
+ if (texgen) {
+ glEnable(GL_TEXTURE_GEN_S);
+ glEnable(GL_TEXTURE_GEN_T);
+ glEnable(GL_TEXTURE_GEN_R);
+ }
+ else {
+ glDisable(GL_TEXTURE_GEN_S);
+ glDisable(GL_TEXTURE_GEN_T);
+ glDisable(GL_TEXTURE_GEN_R);
+ }
+
+ glCallList(CurObject);
+ glPopMatrix();
+
+ glutSwapBuffers();
+}
+
+
+static void
+resize(int w, int h)
+{
+ float ar = (float) w / (float) h;
+ float ax = 0.6 * ar;
+ float ay = 0.6;
+ glViewport(0, 0, (GLint) w, (GLint) h);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glFrustum(-ax, ax, -ay, ay, 2, 20);
+ /*glOrtho(-2, 2, -2, 2, -10, 10);*/
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glTranslatef(0, 0, -4);
+}
+
+
+static void
+Idle(void)
+{
+ float t = glutGet(GLUT_ELAPSED_TIME);
+ angx = 0.01 * t;
+ angy = 0.03 * t;
+ angz += 0;
+ glutPostRedisplay();
+}
+
+
+static void
+SpecialKey(int k, int x, int y)
+{
+ switch (k) {
+ case GLUT_KEY_UP:
+ angx += 5.0;
+ break;
+ case GLUT_KEY_DOWN:
+ angx -= 5.0;
+ break;
+ case GLUT_KEY_LEFT:
+ angy += 5.0;
+ break;
+ case GLUT_KEY_RIGHT:
+ angy -= 5.0;
+ break;
+ default:
+ return;
+ }
+ glutPostRedisplay();
+}
+
+
+static void
+KeyHandler(unsigned char key, int x, int y)
+{
+ static const char *mode[] = {
+ "glTexCoord3f (no texgen)",
+ "texgen fixed to object coords",
+ "texgen fixed to eye coords"
+ };
+ (void) x;
+ (void) y;
+ switch (key) {
+ case 27:
+ case 'q':
+ case 'Q': /* quit game. */
+ exit(0);
+ break;
+ case 'z':
+ angz += 10;
+ break;
+ case 'Z':
+ angz -= 10;
+ break;
+ case 's':
+ smooth = !smooth;
+ if (smooth)
+ glShadeModel(GL_SMOOTH);
+ else
+ glShadeModel(GL_FLAT);
+ break;
+ case 't':
+ texgen++;
+ if (texgen > 2)
+ texgen = 0;
+ printf("Texgen: %s\n", mode[texgen]);
+ break;
+ case 'o':
+ if (CurObject == TORUS)
+ CurObject = SPHERE;
+ else
+ CurObject = TORUS;
+ break;
+ case 'i':
+ if (CurTexture == NOISE_TEXTURE)
+ CurTexture = GRADIENT_TEXTURE;
+ else
+ CurTexture = NOISE_TEXTURE;
+ glBindTexture(GL_TEXTURE_3D, CurTexture);
+ break;
+ case 'a':
+ animate = !animate;
+ if (animate)
+ glutIdleFunc(Idle);
+ else
+ glutIdleFunc(NULL);
+ break;
+ case 'w':
+ wireframe = !wireframe;
+ if (wireframe)
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ else
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ break;
+ default:
+ break;
+ }
+ glutPostRedisplay();
+}
+
+
+static void
+create3Dgradient(void)
+{
+ unsigned char *v;
+ int i, j, k;
+ unsigned char *voxels = NULL;
+
+ voxels = (unsigned char *) malloc(4 * tex_width * tex_height * tex_depth);
+ v = voxels;
+
+ for (i = 0; i < tex_depth; i++) {
+ for (j = 0; j < tex_height; j++) {
+ for (k = 0; k < tex_width; k++) {
+ GLint r = (255 * i) / (tex_depth - 1);
+ GLint g = (255 * j) / (tex_height - 1);
+ GLint b = (255 * k) / (tex_width - 1);
+ *v++ = r;
+ *v++ = g;
+ *v++ = b;
+ *v++ = 255;
+ }
+ }
+ }
+
+
+ glBindTexture(GL_TEXTURE_3D, GRADIENT_TEXTURE);
+ glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_REPEAT);
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
+
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA,
+ tex_width, tex_height, tex_depth,
+ 0, GL_RGBA, GL_UNSIGNED_BYTE, voxels);
+
+ free(voxels);
+}
+
+
+
+static void
+init(void)
+{
+ static const GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
+ static const GLfloat mat_shininess[] = { 25.0 };
+ static const GLfloat gray[] = { 0.6, 0.6, 0.6, 0.0 };
+ static const GLfloat white[] = { 1.0, 1.0, 1.0, 0.0 };
+ static const GLfloat light_position[] = { 0.0, 1.0, 1.0, 0.0 };
+
+ int max;
+
+ /* see if we have OpenGL 1.2 or later, for 3D texturing */
+ {
+ const char *version = (const char *) glGetString(GL_VERSION);
+ if (strncmp(version, "1.0", 3) == 0 || strncmp(version, "1.1", 3) == 0) {
+ printf("Sorry, OpenGL 1.2 or later is required\n");
+ exit(1);
+ }
+ }
+ printf("GL_RENDERER: %s\n", (char *) glGetString(GL_RENDERER));
+ glGetIntegerv(GL_MAX_3D_TEXTURE_SIZE, &max);
+ printf("GL_MAX_3D_TEXTURE_SIZE: %d\n", max);
+ printf("Current 3D texture size: %d x %d x %d\n",
+ tex_width, tex_height, tex_depth);
+
+ /* init light */
+ glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
+ glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
+ glLightfv(GL_LIGHT1, GL_POSITION, light_position);
+ glLightfv(GL_LIGHT1, GL_AMBIENT, gray);
+ glLightfv(GL_LIGHT1, GL_DIFFUSE, white);
+ glLightfv(GL_LIGHT1, GL_SPECULAR, white);
+ glColorMaterial(GL_FRONT, GL_DIFFUSE);
+ glEnable(GL_COLOR_MATERIAL);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT1);
+
+ glClearColor(.5, .5, .5, 0);
+
+ {
+ GLUquadricObj *q;
+ q = gluNewQuadric();
+ gluQuadricTexture( q, GL_TRUE );
+ glNewList(SPHERE, GL_COMPILE);
+ gluSphere( q, 0.95, 30, 15 );
+ glEndList();
+ gluDeleteQuadric(q);
+ }
+
+ BuildTorus();
+
+
+ create3Dgradient();
+
+ initNoise();
+ create3Dtexture();
+
+ glEnable(GL_TEXTURE_3D);
+
+ /*
+ glBlendFunc(GL_SRC_COLOR, GL_SRC_ALPHA);
+ glEnable(GL_BLEND);
+ */
+ glEnable(GL_DEPTH_TEST);
+
+ glColor3f(0.6, 0.7, 0.8);
+}
+
+
+int
+main(int argc, char **argv)
+{
+ glutInit(&argc, argv);
+
+ if (parseCmdLine(argc, argv) == GL_FALSE) {
+ exit(0);
+ }
+
+ glutInitWindowPosition(0, 0);
+ glutInitWindowSize(400, 400);
+ glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
+
+ if (glutCreateWindow("stex3d") <= 0) {
+ exit(0);
+ }
+
+ init();
+
+ printHelp();
+
+ glutReshapeFunc(resize);
+ glutKeyboardFunc(KeyHandler);
+ glutSpecialFunc(SpecialKey);
+ glutDisplayFunc(drawScene);
+ if (animate)
+ glutIdleFunc(Idle);
+ glutMainLoop();
+ return 0;
+}
+
diff --git a/progs/demos/teapot.c b/progs/demos/teapot.c
new file mode 100644
index 00000000000..38ede7ac3e1
--- /dev/null
+++ b/progs/demos/teapot.c
@@ -0,0 +1,675 @@
+/*
+ * This program is under the GNU GPL.
+ * Use at your own risk.
+ *
+ * written by David Bucciarelli ([email protected])
+ * Humanware s.r.l.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <time.h>
+#include <string.h>
+
+#ifdef WIN32
+#include <windows.h>
+#endif
+
+#include <GL/glut.h>
+#include "readtex.h"
+
+#ifdef XMESA
+#include "GL/xmesa.h"
+static int fullscreen=1;
+#endif
+
+static int WIDTH=640;
+static int HEIGHT=480;
+
+static GLint T0 = 0;
+static GLint Frames = 0;
+
+#define BASESIZE 10.0
+
+#define BASERES 12
+#define TEAPOTRES 3
+
+#ifndef M_PI
+#define M_PI 3.1415926535
+#endif
+
+extern void shadowmatrix(GLfloat [4][4], GLfloat [4], GLfloat [4]);
+extern void findplane(GLfloat [4], GLfloat [3], GLfloat [3], GLfloat [3]);
+
+
+static int win=0;
+
+static float obs[3]={5.0,0.0,1.0};
+static float dir[3];
+static float v=0.0;
+static float alpha=-90.0;
+static float beta=90.0;
+
+static GLfloat baseshadow[4][4];
+static GLfloat lightpos[4]={2.3,0.0,3.0,1.0};
+static GLfloat lightdir[3]={-2.3,0.0,-3.0};
+static GLfloat lightalpha=0.0;
+
+static int fog=1;
+static int bfcull=1;
+static int usetex=1;
+static int help=1;
+static int joyavailable=0;
+static int joyactive=0;
+
+static GLuint t1id,t2id;
+static GLuint teapotdlist,basedlist,lightdlist;
+
+
+
+/******************** begin shadow code ********************/
+
+/* Taken from the projshadow.c - by Tom McReynolds, SGI */
+
+/* Modified by David Bucciarelli */
+
+enum {
+ X, Y, Z, W
+};
+enum {
+ A, B, C, D
+};
+
+/* create a matrix that will project the desired shadow */
+void
+shadowmatrix(GLfloat shadowMat[4][4],
+ GLfloat groundplane[4],
+ GLfloat lightpos[4])
+{
+ GLfloat dot;
+
+ /* find dot product between light position vector and ground plane normal */
+ dot = groundplane[X] * lightpos[X] +
+ groundplane[Y] * lightpos[Y] +
+ groundplane[Z] * lightpos[Z] +
+ groundplane[W] * lightpos[W];
+
+ shadowMat[0][0] = dot - lightpos[X] * groundplane[X];
+ shadowMat[1][0] = 0.f - lightpos[X] * groundplane[Y];
+ shadowMat[2][0] = 0.f - lightpos[X] * groundplane[Z];
+ shadowMat[3][0] = 0.f - lightpos[X] * groundplane[W];
+
+ shadowMat[X][1] = 0.f - lightpos[Y] * groundplane[X];
+ shadowMat[1][1] = dot - lightpos[Y] * groundplane[Y];
+ shadowMat[2][1] = 0.f - lightpos[Y] * groundplane[Z];
+ shadowMat[3][1] = 0.f - lightpos[Y] * groundplane[W];
+
+ shadowMat[X][2] = 0.f - lightpos[Z] * groundplane[X];
+ shadowMat[1][2] = 0.f - lightpos[Z] * groundplane[Y];
+ shadowMat[2][2] = dot - lightpos[Z] * groundplane[Z];
+ shadowMat[3][2] = 0.f - lightpos[Z] * groundplane[W];
+
+ shadowMat[X][3] = 0.f - lightpos[W] * groundplane[X];
+ shadowMat[1][3] = 0.f - lightpos[W] * groundplane[Y];
+ shadowMat[2][3] = 0.f - lightpos[W] * groundplane[Z];
+ shadowMat[3][3] = dot - lightpos[W] * groundplane[W];
+
+}
+
+/* find the plane equation given 3 points */
+void
+findplane(GLfloat plane[4],
+ GLfloat v0[3], GLfloat v1[3], GLfloat v2[3])
+{
+ GLfloat vec0[3], vec1[3];
+
+ /* need 2 vectors to find cross product */
+ vec0[X] = v1[X] - v0[X];
+ vec0[Y] = v1[Y] - v0[Y];
+ vec0[Z] = v1[Z] - v0[Z];
+
+ vec1[X] = v2[X] - v0[X];
+ vec1[Y] = v2[Y] - v0[Y];
+ vec1[Z] = v2[Z] - v0[Z];
+
+ /* find cross product to get A, B, and C of plane equation */
+ plane[A] = vec0[Y] * vec1[Z] - vec0[Z] * vec1[Y];
+ plane[B] = -(vec0[X] * vec1[Z] - vec0[Z] * vec1[X]);
+ plane[C] = vec0[X] * vec1[Y] - vec0[Y] * vec1[X];
+
+ plane[D] = -(plane[A] * v0[X] + plane[B] * v0[Y] + plane[C] * v0[Z]);
+}
+
+/******************** end shadow code ********************/
+
+
+static void calcposobs(void)
+{
+ dir[0]=sin(alpha*M_PI/180.0);
+ dir[1]=cos(alpha*M_PI/180.0)*sin(beta*M_PI/180.0);
+ dir[2]=cos(beta*M_PI/180.0);
+
+ obs[0]+=v*dir[0];
+ obs[1]+=v*dir[1];
+ obs[2]+=v*dir[2];
+}
+
+static void special(int k, int x, int y)
+{
+ switch(k) {
+ case GLUT_KEY_LEFT:
+ alpha-=2.0;
+ break;
+ case GLUT_KEY_RIGHT:
+ alpha+=2.0;
+ break;
+ case GLUT_KEY_DOWN:
+ beta-=2.0;
+ break;
+ case GLUT_KEY_UP:
+ beta+=2.0;
+ break;
+ }
+}
+
+static void key(unsigned char k, int x, int y)
+{
+ switch(k) {
+ case 27:
+ exit(0);
+ break;
+
+ case 'a':
+ v+=0.005;
+ break;
+ case 'z':
+ v-=0.005;
+ break;
+
+ case 'j':
+ joyactive=(!joyactive);
+ break;
+ case 'h':
+ help=(!help);
+ break;
+ case 'f':
+ fog=(!fog);
+ break;
+ case 't':
+ usetex=(!usetex);
+ break;
+ case 'b':
+ if(bfcull) {
+ glDisable(GL_CULL_FACE);
+ bfcull=0;
+ } else {
+ glEnable(GL_CULL_FACE);
+ bfcull=1;
+ }
+ break;
+#ifdef XMESA
+ case ' ':
+ XMesaSetFXmode(fullscreen ? XMESA_FX_FULLSCREEN : XMESA_FX_WINDOW);
+ fullscreen=(!fullscreen);
+ break;
+#endif
+ }
+}
+
+static void reshape(int w, int h)
+{
+ WIDTH=w;
+ HEIGHT=h;
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(45.0,w/(float)h,0.2,40.0);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glViewport(0,0,w,h);
+}
+
+static void printstring(void *font, char *string)
+{
+ int len,i;
+
+ len=(int)strlen(string);
+ for(i=0;i<len;i++)
+ glutBitmapCharacter(font,string[i]);
+}
+
+static void printhelp(void)
+{
+ glEnable(GL_BLEND);
+ glColor4f(0.5,0.5,0.5,0.5);
+ glRecti(40,40,600,440);
+ glDisable(GL_BLEND);
+
+ glColor3f(1.0,0.0,0.0);
+ glRasterPos2i(300,420);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24,"Help");
+
+ glRasterPos2i(60,390);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24,"h - Toggle Help");
+ glRasterPos2i(60,360);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24,"t - Toggle Textures");
+ glRasterPos2i(60,330);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24,"f - Toggle Fog");
+ glRasterPos2i(60,300);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24,"b - Toggle Back face culling");
+ glRasterPos2i(60,270);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24,"Arrow Keys - Rotate");
+ glRasterPos2i(60,240);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24,"a - Increase velocity");
+ glRasterPos2i(60,210);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24,"z - Decrease velocity");
+
+ glRasterPos2i(60,180);
+ if(joyavailable)
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24,"j - Toggle jostick control (Joystick control available)");
+ else
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24,"(No Joystick control available)");
+}
+
+static void drawbase(void)
+{
+ static const GLfloat amb[4] = { 1, .5, 0.2, 1 };
+ static const GLfloat diff[4] = { 1, .4, 0.2, 1 };
+ int i,j;
+ float x,y,dx,dy;
+
+ glBindTexture(GL_TEXTURE_2D,t1id);
+
+ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, amb);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diff);
+ dx=BASESIZE/BASERES;
+ dy=-BASESIZE/BASERES;
+ for(y=BASESIZE/2.0,j=0;j<BASERES;y+=dy,j++) {
+ glBegin(GL_QUAD_STRIP);
+ glColor3f(1.0,1.0,1.0);
+ glNormal3f(0.0,0.0,1.0);
+ for(x=-BASESIZE/2.0,i=0;i<BASERES;x+=dx,i++) {
+ glTexCoord2f(x,y);
+ glVertex3f(x,y,0.0);
+
+ glTexCoord2f(x,y+dy);
+ glVertex3f(x,y+dy,0.0);
+ }
+ glEnd();
+ }
+}
+
+static void drawteapot(void)
+{
+ static const GLfloat amb[4] = { 0.2, 0.2, 0.2, 1 };
+ static const GLfloat diff[4] = { 0.8, 0.3, 0.5, 1 };
+ static float xrot=0.0;
+ static float zrot=0.0;
+
+ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, amb);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diff);
+
+ glPushMatrix();
+ glRotatef(lightalpha,0.0,0.0,1.0);
+ glMultMatrixf((GLfloat *)baseshadow);
+ glRotatef(-lightalpha,0.0,0.0,1.0);
+
+ glTranslatef(0.0,0.0,1.0);
+ glRotatef(xrot,1.0,0.0,0.0);
+ glRotatef(zrot,0.0,0.0,1.0);
+
+ glDisable(GL_TEXTURE_2D);
+ glDisable(GL_DEPTH_TEST);
+ glDisable(GL_LIGHTING);
+
+ glColor3f(0.0,0.0,0.0);
+ glCallList(teapotdlist);
+
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_LIGHTING);
+ if(usetex)
+ glEnable(GL_TEXTURE_2D);
+
+ glPopMatrix();
+
+ glPushMatrix();
+ glTranslatef(0.0,0.0,1.0);
+ glRotatef(xrot,1.0,0.0,0.0);
+ glRotatef(zrot,0.0,0.0,1.0);
+
+ glCallList(teapotdlist);
+ glPopMatrix();
+
+ xrot+=2.0;
+ zrot+=1.0;
+}
+
+static void drawlight1(void)
+{
+ glPushMatrix();
+ glRotatef(lightalpha,0.0,0.0,1.0);
+ glLightfv(GL_LIGHT0,GL_POSITION,lightpos);
+ glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,lightdir);
+
+ glPopMatrix();
+}
+
+static void drawlight2(void)
+{
+ glPushMatrix();
+ glRotatef(lightalpha,0.0,0.0,1.0);
+ glTranslatef(lightpos[0],lightpos[1],lightpos[2]);
+
+ glDisable(GL_TEXTURE_2D);
+ glCallList(lightdlist);
+ if(usetex)
+ glEnable(GL_TEXTURE_2D);
+
+ glPopMatrix();
+
+ lightalpha+=1.0;
+}
+
+static void dojoy(void)
+{
+#ifdef WIN32
+ static UINT max[2]={0,0};
+ static UINT min[2]={0xffffffff,0xffffffff},center[2];
+ MMRESULT res;
+ JOYINFO joy;
+
+ res=joyGetPos(JOYSTICKID1,&joy);
+
+ if(res==JOYERR_NOERROR) {
+ joyavailable=1;
+
+ if(max[0]<joy.wXpos)
+ max[0]=joy.wXpos;
+ if(min[0]>joy.wXpos)
+ min[0]=joy.wXpos;
+ center[0]=(max[0]+min[0])/2;
+
+ if(max[1]<joy.wYpos)
+ max[1]=joy.wYpos;
+ if(min[1]>joy.wYpos)
+ min[1]=joy.wYpos;
+ center[1]=(max[1]+min[1])/2;
+
+ if(joyactive) {
+ if(fabs(center[0]-(float)joy.wXpos)>0.1*(max[0]-min[0]))
+ alpha-=2.5*(center[0]-(float)joy.wXpos)/(max[0]-min[0]);
+ if(fabs(center[1]-(float)joy.wYpos)>0.1*(max[1]-min[1]))
+ beta+=2.5*(center[1]-(float)joy.wYpos)/(max[1]-min[1]);
+
+ if(joy.wButtons & JOY_BUTTON1)
+ v+=0.005;
+ if(joy.wButtons & JOY_BUTTON2)
+ v-=0.005;
+ }
+ } else
+ joyavailable=0;
+#endif
+}
+
+static void draw(void)
+{
+ static char frbuf[80] = "";
+
+ dojoy();
+
+ glEnable(GL_DEPTH_TEST);
+ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
+
+ if(usetex)
+ glEnable(GL_TEXTURE_2D);
+ else
+ glDisable(GL_TEXTURE_2D);
+
+ if(fog)
+ glEnable(GL_FOG);
+ else
+ glDisable(GL_FOG);
+
+ glEnable(GL_LIGHTING);
+
+ glShadeModel(GL_SMOOTH);
+
+ glPushMatrix();
+ calcposobs();
+
+ gluLookAt(obs[0],obs[1],obs[2],
+ obs[0]+dir[0],obs[1]+dir[1],obs[2]+dir[2],
+ 0.0,0.0,1.0);
+
+ drawlight1();
+ glCallList(basedlist);
+ drawteapot();
+ drawlight2();
+ glPopMatrix();
+
+ glDisable(GL_LIGHTING);
+ glDisable(GL_TEXTURE_2D);
+ glDisable(GL_DEPTH_TEST);
+ glDisable(GL_FOG);
+ glShadeModel(GL_FLAT);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glOrtho(-0.5,639.5,-0.5,479.5,-1.0,1.0);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ glColor3f(1.0,0.0,0.0);
+ glRasterPos2i(10,10);
+ printstring(GLUT_BITMAP_HELVETICA_18,frbuf);
+ glRasterPos2i(350,470);
+ printstring(GLUT_BITMAP_HELVETICA_10,"Teapot V1.2 Written by David Bucciarelli ([email protected])");
+
+ if(help)
+ printhelp();
+
+ reshape(WIDTH,HEIGHT);
+
+ glutSwapBuffers();
+
+ Frames++;
+
+ {
+ GLint t = glutGet(GLUT_ELAPSED_TIME);
+ if (t - T0 >= 2000) {
+ GLfloat seconds = (t - T0) / 1000.0;
+ GLfloat fps = Frames / seconds;
+ sprintf(frbuf, "Frame rate: %f", fps);
+ T0 = t;
+ Frames = 0;
+ }
+ }
+}
+
+static void inittextures(void)
+{
+ glGenTextures(1,&t1id);
+ glBindTexture(GL_TEXTURE_2D,t1id);
+
+ glPixelStorei(GL_UNPACK_ALIGNMENT,4);
+ if (!LoadRGBMipmaps("../images/tile.rgb", GL_RGB)) {
+ fprintf(stderr,"Error reading a texture.\n");
+ exit(-1);
+ }
+
+ 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_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);
+ glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
+
+ glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);
+
+ glGenTextures(1,&t2id);
+ glBindTexture(GL_TEXTURE_2D,t2id);
+
+ glPixelTransferf(GL_RED_SCALE, 0.75);
+ glPixelTransferf(GL_RED_BIAS, 0.25);
+ glPixelTransferf(GL_GREEN_SCALE, 0.75);
+ glPixelTransferf(GL_GREEN_BIAS, 0.25);
+ glPixelTransferf(GL_BLUE_SCALE, 0.75);
+ glPixelTransferf(GL_BLUE_BIAS, 0.25);
+
+ if (!LoadRGBMipmaps("../images/bw.rgb", GL_RGB)) {
+ fprintf(stderr,"Error reading a texture.\n");
+ exit(-1);
+ }
+
+ glPixelTransferf(GL_RED_SCALE, 1.0);
+ glPixelTransferf(GL_RED_BIAS, 0.0);
+ glPixelTransferf(GL_GREEN_SCALE, 1.0);
+ glPixelTransferf(GL_GREEN_BIAS, 0.0);
+ glPixelTransferf(GL_BLUE_SCALE, 1.0);
+ glPixelTransferf(GL_BLUE_BIAS, 0.0);
+
+
+ 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_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);
+ glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
+
+ glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);
+}
+
+static void initlight(void)
+{
+ float matamb[4] ={0.5, 0.5, 0.5, 1.0};
+ float matdiff[4]={0.9, 0.2, 0.2, 1.0};
+ float matspec[4]={1.0,1.0,1.0,1.0};
+
+ float lamb[4] ={1.5, 1.5, 1.5, 1.0};
+ float ldiff[4]={1.0, 1.0, 1.0, 1.0};
+ float lspec[4]={1.0, 1.0, 1.0, 1.0};
+
+ glLightf(GL_LIGHT0,GL_SPOT_CUTOFF,70.0);
+ glLightf(GL_LIGHT0,GL_SPOT_EXPONENT,20.0);
+ glLightfv(GL_LIGHT0,GL_AMBIENT,lamb);
+ glLightfv(GL_LIGHT0,GL_DIFFUSE,ldiff);
+ glLightfv(GL_LIGHT0,GL_SPECULAR,lspec);
+
+ glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 15.0);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, matdiff);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, matspec);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, matamb);
+
+ glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lamb);
+ glEnable(GL_LIGHT0);
+}
+
+static void initdlists(void)
+{
+ GLUquadricObj *lcone,*lbase;
+ GLfloat plane[4];
+ GLfloat v0[3]={0.0,0.0,0.0};
+ GLfloat v1[3]={1.0,0.0,0.0};
+ GLfloat v2[3]={0.0,1.0,0.0};
+
+ findplane(plane,v0,v1,v2);
+ shadowmatrix(baseshadow,plane,lightpos);
+
+ teapotdlist=glGenLists(1);
+ glNewList(teapotdlist,GL_COMPILE);
+ glRotatef(90.0,1.0,0.0,0.0);
+ glCullFace(GL_FRONT);
+ glBindTexture(GL_TEXTURE_2D,t2id);
+ glutSolidTeapot(0.75);
+ glCullFace(GL_BACK);
+ glEndList();
+
+ basedlist=glGenLists(1);
+ glNewList(basedlist,GL_COMPILE);
+ drawbase();
+ glEndList();
+
+ lightdlist=glGenLists(1);
+ glNewList(lightdlist,GL_COMPILE);
+ glDisable(GL_LIGHTING);
+
+ lcone=gluNewQuadric();
+ lbase=gluNewQuadric();
+ glRotatef(45.0,0.0,1.0,0.0);
+
+ glColor3f(1.0,1.0,1.0);
+ glCullFace(GL_FRONT);
+ gluDisk(lbase,0.0,0.2,12.0,1.0);
+ glCullFace(GL_BACK);
+
+ glColor3f(0.5,0.0,0.0);
+ gluCylinder(lcone,0.2,0.0,0.5,12,1);
+
+ gluDeleteQuadric(lcone);
+ gluDeleteQuadric(lbase);
+
+ glEnable(GL_LIGHTING);
+ glEndList();
+}
+
+int main(int ac, char **av)
+{
+ float fogcolor[4]={0.025,0.025,0.025,1.0};
+
+ fprintf(stderr,"Teapot V1.2\nWritten by David Bucciarelli ([email protected])\n");
+
+ /*
+ if(!SetPriorityClass(GetCurrentProcess(),REALTIME_PRIORITY_CLASS)) {
+ fprintf(stderr,"Error setting the process class.\n");
+ return 0;
+ }
+
+ if(!SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_TIME_CRITICAL)) {
+ fprintf(stderr,"Error setting the process priority.\n");
+ return 0;
+ }
+ */
+
+ glutInitWindowPosition(0,0);
+ glutInitWindowSize(WIDTH,HEIGHT);
+ glutInit(&ac,av);
+
+ glutInitDisplayMode(GLUT_RGB|GLUT_DEPTH|GLUT_DOUBLE);
+
+ if(!(win=glutCreateWindow("Teapot"))) {
+ fprintf(stderr,"Error, couldn't open window\n");
+ return -1;
+ }
+
+ reshape(WIDTH,HEIGHT);
+
+ glShadeModel(GL_SMOOTH);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+ glEnable(GL_TEXTURE_2D);
+
+ glEnable(GL_FOG);
+ glFogi(GL_FOG_MODE,GL_EXP2);
+ glFogfv(GL_FOG_COLOR,fogcolor);
+
+ glFogf(GL_FOG_DENSITY,0.04);
+ glHint(GL_FOG_HINT,GL_NICEST);
+ glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
+
+ calcposobs();
+
+ inittextures();
+ initlight();
+
+ initdlists();
+
+ glClearColor(fogcolor[0],fogcolor[1],fogcolor[2],fogcolor[3]);
+
+ glutReshapeFunc(reshape);
+ glutDisplayFunc(draw);
+ glutKeyboardFunc(key);
+ glutSpecialFunc(special);
+ glutIdleFunc(draw);
+
+ glutMainLoop();
+
+ return 0;
+}
diff --git a/progs/demos/terrain.c b/progs/demos/terrain.c
new file mode 100644
index 00000000000..be78ea4950f
--- /dev/null
+++ b/progs/demos/terrain.c
@@ -0,0 +1,656 @@
+/*
+ * This program is under the GNU GPL.
+ * Use at your own risk.
+ *
+ * written by David Bucciarelli ([email protected])
+ * Humanware s.r.l.
+ *
+ * based on a Mikael SkiZoWalker's (MoDEL) / France ([email protected]) demo
+ */
+
+#include <stdio.h>
+#include <math.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+#ifdef WIN32
+#include <windows.h>
+#endif
+
+#include <GL/glut.h>
+
+#ifdef XMESA
+#include "GL/xmesa.h"
+static int fullscreen = 1;
+#endif
+
+#ifndef M_PI
+#define M_PI 3.14159265
+#endif
+
+#define heightMnt 450
+#define lenghtXmnt 62
+#define lenghtYmnt 62
+
+#define stepXmnt 96.0
+#define stepYmnt 96.0
+
+#define WIDTH 640
+#define HEIGHT 480
+
+static GLint T0 = 0;
+static GLint Frames = 0;
+
+#define TSCALE 4
+
+#define FOV 85
+
+static GLfloat terrain[256 * 256];
+static GLfloat terraincolor[256 * 256][3];
+
+static int win = 0;
+
+static int fog = 1;
+static int bfcull = 1;
+static int usetex = 1;
+static int poutline = 0;
+static int help = 1;
+static int joyavailable = 0;
+static int joyactive = 0;
+static float ModZMnt;
+static long GlobalMnt = 0;
+
+static int scrwidth = WIDTH;
+static int scrheight = HEIGHT;
+
+#define OBSSTARTX 992.0
+#define OBSSTARTY 103.0
+
+static float obs[3] = { OBSSTARTX, heightMnt * 1.3, OBSSTARTY };
+static float dir[3], v1[2], v2[2];
+static float v = 900.0;
+static float alpha = 75.0;
+static float beta = 90.0;
+
+static void
+calcposobs(void)
+{
+ float alpha1, alpha2;
+ static double t0 = -1.;
+ double dt, t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
+ if (t0 < 0.0)
+ t0 = t;
+ dt = t - t0;
+ t0 = t;
+
+ dir[0] = sin(alpha * M_PI / 180.0);
+ dir[2] = cos(alpha * M_PI / 180.0) * sin(beta * M_PI / 180.0);
+ dir[1] = cos(beta * M_PI / 180.0);
+
+ if (dir[0] < 1.0e-5 && dir[0] > -1.0e-5)
+ dir[0] = 0;
+ if (dir[1] < 1.0e-5 && dir[1] > -1.0e-5)
+ dir[1] = 0;
+ if (dir[2] < 1.0e-5 && dir[2] > -1.0e-5)
+ dir[2] = 0;
+
+ alpha1 = alpha + FOV / 2.0;
+ v1[0] = sin(alpha1 * M_PI / 180.0);
+ v1[1] = cos(alpha1 * M_PI / 180.0);
+
+ alpha2 = alpha - FOV / 2.0;
+ v2[0] = sin(alpha2 * M_PI / 180.0);
+ v2[1] = cos(alpha2 * M_PI / 180.0);
+
+ obs[0] += v * dir[0] * dt;
+ obs[1] += v * dir[1] * dt;
+ obs[2] += v * dir[2] * dt;
+
+ if (obs[1] < 0.0)
+ obs[1] = 0.0;
+}
+
+static void
+reshape(int width, int height)
+{
+ scrwidth = width;
+ scrheight = height;
+ glViewport(0, 0, (GLint) width, (GLint) height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(50.0, ((GLfloat) width / (GLfloat) height),
+ lenghtXmnt * stepYmnt * 0.01, lenghtXmnt * stepYmnt * 0.7);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+}
+
+static int
+clipstrip(float y, float *start, float *end)
+{
+ float x1, x2, t1, t2, tmp;
+
+ if (v1[1] == 0.0) {
+ t1 = 0.0;
+ x1 = -HUGE_VAL;
+ }
+ else {
+ t1 = y / v1[1];
+ x1 = t1 * v1[0];
+ }
+
+ if (v2[1] == 0.0) {
+ t2 = 0.0;
+ x2 = HUGE_VAL;
+ }
+ else {
+ t2 = y / v2[1];
+ x2 = t2 * v2[0];
+ }
+
+ if (((x1 < -(lenghtXmnt * stepXmnt) / 2) && (t2 <= 0.0)) ||
+ ((t1 <= 0.0) && (x2 > (lenghtXmnt * stepXmnt) / 2)) ||
+ ((t1 < 0.0) && (t2 < 0.0)))
+ return 0;
+
+ if ((t1 == 0.0) && (t2 == 0.0)) {
+ if ((v1[0] < 0.0) && (v1[1] > 0.0) && (v2[0] < 0.0) && (v2[1] < 0.0)) {
+ *start = -(lenghtXmnt * stepXmnt) / 2;
+ *end = stepXmnt;
+ return 1;
+ }
+ else {
+ if ((v1[0] > 0.0) && (v1[1] < 0.0) && (v2[0] > 0.0) && (v2[1] > 0.0)) {
+ *start = -stepXmnt;
+ *end = (lenghtXmnt * stepXmnt) / 2;
+ return 1;
+ }
+ else
+ return 0;
+ }
+ }
+ else {
+ if (t2 < 0.0) {
+ if (x1 < 0.0)
+ x2 = -(lenghtXmnt * stepXmnt) / 2;
+ else
+ x2 = (lenghtXmnt * stepXmnt) / 2;
+ }
+
+ if (t1 < 0.0) {
+ if (x2 < 0.0)
+ x1 = -(lenghtXmnt * stepXmnt) / 2;
+ else
+ x1 = (lenghtXmnt * stepXmnt) / 2;
+ }
+ }
+
+ if (x1 > x2) {
+ tmp = x1;
+ x1 = x2;
+ x2 = tmp;
+ }
+
+ x1 -= stepXmnt;
+ if (x1 < -(lenghtXmnt * stepXmnt) / 2)
+ x1 = -(lenghtXmnt * stepXmnt) / 2;
+
+ x2 += stepXmnt;
+ if (x2 > (lenghtXmnt * stepXmnt) / 2)
+ x2 = (lenghtXmnt * stepXmnt) / 2;
+
+ *start = ((int) (x1 / stepXmnt)) * stepXmnt;
+ *end = ((int) (x2 / stepXmnt)) * stepXmnt;
+
+ return 1;
+}
+
+static void
+printstring(void *font, char *string)
+{
+ int len, i;
+
+ len = (int) strlen(string);
+ for (i = 0; i < len; i++)
+ glutBitmapCharacter(font, string[i]);
+}
+
+static void
+printhelp(void)
+{
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glColor4f(0.0, 0.0, 0.0, 0.5);
+ glRecti(40, 40, 600, 440);
+ glDisable(GL_BLEND);
+
+ glColor3f(1.0, 0.0, 0.0);
+ glRasterPos2i(300, 420);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24, "Help");
+
+ glRasterPos2i(60, 390);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24, "h - Toggle Help");
+ glRasterPos2i(60, 360);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24, "t - Toggle Textures");
+ glRasterPos2i(60, 330);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24, "f - Toggle Fog");
+ glRasterPos2i(60, 300);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24, "p - Wire frame");
+ glRasterPos2i(60, 270);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24, "b - Toggle Back face culling");
+ glRasterPos2i(60, 240);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24, "Arrow Keys - Rotate");
+ glRasterPos2i(60, 210);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24, "a - Increase velocity");
+ glRasterPos2i(60, 180);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24, "z - Decrease velocity");
+
+ glRasterPos2i(60, 150);
+ if (joyavailable)
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24,
+ "j - Toggle jostick control (Joystick control available)");
+ else
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24,
+ "(No Joystick control available)");
+}
+
+static void
+drawterrain(void)
+{
+ int h, i, idx, ox, oy;
+ float j, k, start, end;
+
+ ox = (int) (obs[0] / stepXmnt);
+ oy = (int) (obs[2] / stepYmnt);
+ GlobalMnt = ((ox * TSCALE) & 255) + ((oy * TSCALE) & 255) * 256;
+
+ glPushMatrix();
+ glTranslatef((float) ox * stepXmnt, 0, (float) oy * stepYmnt);
+
+ for (h = 0, k = -(lenghtYmnt * stepYmnt) / 2; h < lenghtYmnt;
+ k += stepYmnt, h++) {
+ if (!clipstrip(k, &start, &end))
+ continue;
+
+ glBegin(GL_TRIANGLE_STRIP); /* I hope that the optimizer will be able to improve this code */
+ for (i = (int) (lenghtXmnt / 2 + start / stepXmnt), j = start; j <= end;
+ j += stepXmnt, i++) {
+ idx = (i * TSCALE + h * 256 * TSCALE + GlobalMnt) & 65535;
+ glColor3fv(terraincolor[idx]);
+ glTexCoord2f((ox + i) / 8.0, (oy + h) / 8.0);
+ glVertex3f(j, terrain[idx], k);
+
+ idx =
+ (i * TSCALE + h * 256 * TSCALE + 256 * TSCALE +
+ GlobalMnt) & 65535;
+ glColor3fv(terraincolor[idx]);
+ glTexCoord2f((ox + i) / 8.0, (oy + h + 1) / 8.0);
+ glVertex3f(j, terrain[idx], k + stepYmnt);
+ }
+ glEnd();
+ }
+
+ glDisable(GL_CULL_FACE);
+ glDisable(GL_TEXTURE_2D);
+ glEnable(GL_BLEND);
+ glBegin(GL_QUADS);
+ glColor4f(0.1, 0.7, 1.0, 0.4);
+ glVertex3f(-(lenghtXmnt * stepXmnt) / 2.0, heightMnt * 0.6,
+ -(lenghtYmnt * stepYmnt) / 2.0);
+ glVertex3f(-(lenghtXmnt * stepXmnt) / 2.0, heightMnt * 0.6,
+ (lenghtYmnt * stepYmnt) / 2.0);
+ glVertex3f((lenghtXmnt * stepXmnt) / 2.0, heightMnt * 0.6,
+ (lenghtYmnt * stepYmnt) / 2.0);
+ glVertex3f((lenghtXmnt * stepXmnt) / 2.0, heightMnt * 0.6,
+ -(lenghtYmnt * stepYmnt) / 2.0);
+ glEnd();
+ glDisable(GL_BLEND);
+ if (bfcull)
+ glEnable(GL_CULL_FACE);
+ glEnable(GL_TEXTURE_2D);
+
+ glPopMatrix();
+
+}
+
+static void
+dojoy(void)
+{
+#ifdef WIN32
+ static UINT max[2] = { 0, 0 };
+ static UINT min[2] = { 0xffffffff, 0xffffffff }, center[2];
+ MMRESULT res;
+ JOYINFO joy;
+
+ res = joyGetPos(JOYSTICKID1, &joy);
+
+ if (res == JOYERR_NOERROR) {
+ joyavailable = 1;
+
+ if (max[0] < joy.wXpos)
+ max[0] = joy.wXpos;
+ if (min[0] > joy.wXpos)
+ min[0] = joy.wXpos;
+ center[0] = (max[0] + min[0]) / 2;
+
+ if (max[1] < joy.wYpos)
+ max[1] = joy.wYpos;
+ if (min[1] > joy.wYpos)
+ min[1] = joy.wYpos;
+ center[1] = (max[1] + min[1]) / 2;
+
+ if (joyactive) {
+ if (fabs(center[0] - (float) joy.wXpos) > 0.1 * (max[0] - min[0]))
+ alpha +=
+ 2.5 * (center[0] - (float) joy.wXpos) / (max[0] - min[0]);
+ if (fabs(center[1] - (float) joy.wYpos) > 0.1 * (max[1] - min[1]))
+ beta += 2.5 * (center[1] - (float) joy.wYpos) / (max[1] - min[1]);
+
+ if (joy.wButtons & JOY_BUTTON1)
+ v += 0.5;
+ if (joy.wButtons & JOY_BUTTON2)
+ v -= 0.5;
+ }
+ }
+ else
+ joyavailable = 0;
+#endif
+}
+
+static void
+drawscene(void)
+{
+ static char frbuf[80] = "";
+
+ dojoy();
+
+ glShadeModel(GL_SMOOTH);
+ glEnable(GL_DEPTH_TEST);
+
+ if (usetex)
+ glEnable(GL_TEXTURE_2D);
+ else
+ glDisable(GL_TEXTURE_2D);
+
+ if (fog)
+ glEnable(GL_FOG);
+ else
+ glDisable(GL_FOG);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glPushMatrix();
+
+ calcposobs();
+ gluLookAt(obs[0], obs[1], obs[2],
+ obs[0] + dir[0], obs[1] + dir[1], obs[2] + dir[2],
+ 0.0, 1.0, 0.0);
+
+ drawterrain();
+ glPopMatrix();
+
+ glDisable(GL_TEXTURE_2D);
+ glDisable(GL_DEPTH_TEST);
+ glDisable(GL_FOG);
+ glShadeModel(GL_FLAT);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ glOrtho(-0.5, 639.5, -0.5, 479.5, -1.0, 1.0);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ glColor3f(1.0, 0.0, 0.0);
+ glRasterPos2i(10, 10);
+ printstring(GLUT_BITMAP_HELVETICA_18, frbuf);
+ glRasterPos2i(350, 470);
+ printstring(GLUT_BITMAP_HELVETICA_10,
+ "Terrain V1.2 Written by David Bucciarelli ([email protected])");
+ glRasterPos2i(434, 457);
+ printstring(GLUT_BITMAP_HELVETICA_10,
+ "Based on a Mickael's demo ([email protected])");
+
+ if (help)
+ printhelp();
+
+ reshape(scrwidth, scrheight);
+
+ glutSwapBuffers();
+
+ Frames++;
+ {
+ GLint t = glutGet(GLUT_ELAPSED_TIME);
+ if (t - T0 >= 2000) {
+ GLfloat seconds = (t - T0) / 1000.0;
+ GLfloat fps = Frames / seconds;
+ sprintf(frbuf, "Frame rate: %f", fps);
+ T0 = t;
+ Frames = 0;
+ }
+ }
+}
+
+static void
+key(unsigned char k, int x, int y)
+{
+ switch (k) {
+ case 27:
+ exit(0);
+ break;
+ case 'a':
+ v += 50.;
+ break;
+ case 'z':
+ v -= 50.;
+ break;
+ case 'p':
+ if (poutline) {
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+ poutline = 0;
+ }
+ else {
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ poutline = 1;
+ }
+ break;
+ case 'j':
+ joyactive = (!joyactive);
+ break;
+ case 'h':
+ help = (!help);
+ break;
+ case 'f':
+ fog = (!fog);
+ break;
+ case 't':
+ usetex = (!usetex);
+ break;
+ case 'b':
+ if (bfcull) {
+ glDisable(GL_CULL_FACE);
+ bfcull = 0;
+ }
+ else {
+ glEnable(GL_CULL_FACE);
+ bfcull = 1;
+ }
+ break;
+#ifdef XMESA
+ case ' ':
+ XMesaSetFXmode(fullscreen ? XMESA_FX_FULLSCREEN : XMESA_FX_WINDOW);
+ fullscreen = (!fullscreen);
+ break;
+#endif
+ }
+}
+
+static void
+special(int k, int x, int y)
+{
+ switch (k) {
+ case GLUT_KEY_LEFT:
+ alpha += 2.0;
+ break;
+ case GLUT_KEY_RIGHT:
+ alpha -= 2.0;
+ break;
+ case GLUT_KEY_DOWN:
+ beta -= 2.0;
+ break;
+ case GLUT_KEY_UP:
+ beta += 2.0;
+ break;
+ }
+}
+
+static void
+calccolor(GLfloat height, GLfloat c[3])
+{
+ GLfloat color[4][3] = {
+ {1.0, 1.0, 1.0},
+ {0.0, 0.8, 0.0},
+ {1.0, 1.0, 0.3},
+ {0.0, 0.0, 0.8}
+ };
+ GLfloat fact;
+
+ height = height * (1.0 / 255.0);
+
+ if (height >= 0.9) {
+ c[0] = color[0][0];
+ c[1] = color[0][1];
+ c[2] = color[0][2];
+ return;
+ }
+
+ if ((height < 0.9) && (height >= 0.7)) {
+ fact = (height - 0.7) * 5.0;
+ c[0] = fact * color[0][0] + (1.0 - fact) * color[1][0];
+ c[1] = fact * color[0][1] + (1.0 - fact) * color[1][1];
+ c[2] = fact * color[0][2] + (1.0 - fact) * color[1][2];
+ return;
+ }
+
+ if ((height < 0.7) && (height >= 0.6)) {
+ fact = (height - 0.6) * 10.0;
+ c[0] = fact * color[1][0] + (1.0 - fact) * color[2][0];
+ c[1] = fact * color[1][1] + (1.0 - fact) * color[2][1];
+ c[2] = fact * color[1][2] + (1.0 - fact) * color[2][2];
+ return;
+ }
+
+ if ((height < 0.6) && (height >= 0.5)) {
+ fact = (height - 0.5) * 10.0;
+ c[0] = fact * color[2][0] + (1.0 - fact) * color[3][0];
+ c[1] = fact * color[2][1] + (1.0 - fact) * color[3][1];
+ c[2] = fact * color[2][2] + (1.0 - fact) * color[3][2];
+ return;
+ }
+
+ c[0] = color[3][0];
+ c[1] = color[3][1];
+ c[2] = color[3][2];
+}
+
+static void
+loadpic(void)
+{
+ GLubyte bufferter[256 * 256], terrainpic[256 * 256];
+ FILE *FilePic;
+ int i, tmp;
+ GLenum gluerr;
+
+ if ((FilePic = fopen("terrain.dat", "r")) == NULL) {
+ fprintf(stderr, "Error loading terrain.dat\n");
+ exit(-1);
+ }
+ fread(bufferter, 256 * 256, 1, FilePic);
+ fclose(FilePic);
+
+ for (i = 0; i < (256 * 256); i++) {
+ terrain[i] = (bufferter[i] * (heightMnt / 255.0f));
+ calccolor((GLfloat) bufferter[i], terraincolor[i]);
+ tmp = (((int) bufferter[i]) + 96);
+ terrainpic[i] = (tmp > 255) ? 255 : tmp;
+ }
+
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ if ((gluerr = gluBuild2DMipmaps(GL_TEXTURE_2D, 1, 256, 256, GL_LUMINANCE,
+ GL_UNSIGNED_BYTE,
+ (GLvoid *) (&terrainpic[0])))) {
+ fprintf(stderr, "GLULib%s\n", (char *) gluErrorString(gluerr));
+ exit(-1);
+ }
+
+ 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_MIN_FILTER,
+ GL_LINEAR_MIPMAP_LINEAR);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ glEnable(GL_TEXTURE_2D);
+}
+
+static void
+init(void)
+{
+ float fogcolor[4] = { 0.6, 0.7, 0.7, 1.0 };
+
+ glClearColor(fogcolor[0], fogcolor[1], fogcolor[2], fogcolor[3]);
+ glClearDepth(1.0);
+ glDepthFunc(GL_LEQUAL);
+ glShadeModel(GL_SMOOTH);
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+
+ glDisable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ glEnable(GL_FOG);
+ glFogi(GL_FOG_MODE, GL_EXP2);
+ glFogfv(GL_FOG_COLOR, fogcolor);
+ glFogf(GL_FOG_DENSITY, 0.0007);
+#ifdef FX
+ glHint(GL_FOG_HINT, GL_NICEST);
+#endif
+
+ reshape(scrwidth, scrheight);
+}
+
+
+int
+main(int ac, char **av)
+{
+ glutInitWindowPosition(0, 0);
+ glutInitWindowSize(WIDTH, HEIGHT);
+ glutInit(&ac, av);
+
+ glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
+
+ if (!(win = glutCreateWindow("Terrain"))) {
+ fprintf(stderr, "Error, couldn't open window\n");
+ return -1;
+ }
+
+ ModZMnt = 0.0f;
+ loadpic();
+
+ init();
+
+#ifndef FX
+ glDisable(GL_TEXTURE_2D);
+ usetex = 0;
+#endif
+
+ glutReshapeFunc(reshape);
+ glutDisplayFunc(drawscene);
+ glutKeyboardFunc(key);
+ glutSpecialFunc(special);
+ glutIdleFunc(drawscene);
+
+ glutMainLoop();
+
+ return 0;
+}
diff --git a/progs/demos/terrain.dat b/progs/demos/terrain.dat
new file mode 100644
index 00000000000..2af385e9c25
--- /dev/null
+++ b/progs/demos/terrain.dat
@@ -0,0 +1 @@
+�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ÿ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������¾�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������¾�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������¿�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Ŀ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ÿ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������¾�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������¾����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������¾�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������¿������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Ŀ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������¾�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������½��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������¿��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������¾���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ÿ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������¾�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ž��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ü�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ǿ�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������¼��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Ľ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ž������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ſ�����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������þ�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Ŀ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������½�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������¾����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������¾���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ÿ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������Ŀ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������¿����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ž�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ÿ��������������������������½���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������½�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������½�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ü�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ž�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������þ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������0 \ No newline at end of file
diff --git a/progs/demos/tessdemo.c b/progs/demos/tessdemo.c
new file mode 100644
index 00000000000..26403eee0a2
--- /dev/null
+++ b/progs/demos/tessdemo.c
@@ -0,0 +1,524 @@
+
+/*
+ * A demo of the GLU polygon tesselation functions written by Bogdan Sikorski.
+ * Updated for GLU 1.3 tessellation by Gareth Hughes <[email protected]>
+ */
+
+#include <GL/glut.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define MAX_POINTS 256
+#define MAX_CONTOURS 32
+#define MAX_TRIANGLES 256
+
+#ifndef GLCALLBACK
+#ifdef CALLBACK
+#define GLCALLBACK CALLBACK
+#else
+#define GLCALLBACK
+#endif
+#endif
+
+#ifdef GLU_VERSION_1_2
+
+typedef enum{ QUIT, TESSELATE, CLEAR } menu_entries;
+typedef enum{ DEFINE, TESSELATED } mode_type;
+
+static GLsizei width, height;
+static GLuint contour_cnt;
+static GLuint triangle_cnt;
+
+static mode_type mode;
+static int menu;
+
+static GLuint list_start;
+
+static GLfloat edge_color[3];
+
+static struct {
+ GLfloat p[MAX_POINTS][2];
+ GLuint point_cnt;
+} contours[MAX_CONTOURS];
+
+static struct {
+ GLsizei no;
+ GLfloat p[3][2];
+ GLclampf color[3][3];
+} triangles[MAX_TRIANGLES];
+
+
+
+static void GLCALLBACK error_callback( GLenum err )
+{
+ int len, i;
+ char const *str;
+
+ glColor3f( 0.9, 0.9, 0.9 );
+ glRasterPos2i( 5, 5 );
+
+ str = (const char *) gluErrorString( err );
+ len = strlen( str );
+
+ for ( i = 0 ; i < len ; i++ ) {
+ glutBitmapCharacter( GLUT_BITMAP_9_BY_15, str[i] );
+ }
+}
+
+static void GLCALLBACK begin_callback( GLenum mode )
+{
+ /* Allow multiple triangles to be output inside the begin/end pair. */
+ triangle_cnt = 0;
+ triangles[triangle_cnt].no = 0;
+}
+
+static void GLCALLBACK edge_callback( GLenum flag )
+{
+ /* Persist the edge flag across triangles. */
+ if ( flag == GL_TRUE ) {
+ edge_color[0] = 1.0;
+ edge_color[1] = 1.0;
+ edge_color[2] = 0.5;
+ } else {
+ edge_color[0] = 1.0;
+ edge_color[1] = 0.0;
+ edge_color[2] = 0.0;
+ }
+}
+
+static void GLCALLBACK end_callback()
+{
+ GLuint i;
+
+ glBegin( GL_LINES );
+
+ /* Output the three edges of each triangle as lines colored
+ according to their edge flag. */
+ for ( i = 0 ; i < triangle_cnt ; i++ ) {
+ glColor3f( triangles[i].color[0][0],
+ triangles[i].color[0][1],
+ triangles[i].color[0][2] );
+
+ glVertex2f( triangles[i].p[0][0], triangles[i].p[0][1] );
+ glVertex2f( triangles[i].p[1][0], triangles[i].p[1][1] );
+
+ glColor3f( triangles[i].color[1][0],
+ triangles[i].color[1][1],
+ triangles[i].color[1][2] );
+
+ glVertex2f( triangles[i].p[1][0], triangles[i].p[1][1] );
+ glVertex2f( triangles[i].p[2][0], triangles[i].p[2][1] );
+
+ glColor3f( triangles[i].color[2][0],
+ triangles[i].color[2][1],
+ triangles[i].color[2][2] );
+
+ glVertex2f( triangles[i].p[2][0], triangles[i].p[2][1] );
+ glVertex2f( triangles[i].p[0][0], triangles[i].p[0][1] );
+ }
+
+ glEnd();
+}
+
+static void GLCALLBACK vertex_callback( void *data )
+{
+ GLsizei no;
+ GLfloat *p;
+
+ p = (GLfloat *) data;
+ no = triangles[triangle_cnt].no;
+
+ triangles[triangle_cnt].p[no][0] = p[0];
+ triangles[triangle_cnt].p[no][1] = p[1];
+
+ triangles[triangle_cnt].color[no][0] = edge_color[0];
+ triangles[triangle_cnt].color[no][1] = edge_color[1];
+ triangles[triangle_cnt].color[no][2] = edge_color[2];
+
+ /* After every three vertices, initialize the next triangle. */
+ if ( ++(triangles[triangle_cnt].no) == 3 ) {
+ triangle_cnt++;
+ triangles[triangle_cnt].no = 0;
+ }
+}
+
+static void GLCALLBACK combine_callback( GLdouble coords[3],
+ GLdouble *vertex_data[4],
+ GLfloat weight[4], void **data )
+{
+ GLfloat *vertex;
+
+ vertex = (GLfloat *) malloc( 2 * sizeof(GLfloat) );
+
+ vertex[0] = (GLfloat) coords[0];
+ vertex[1] = (GLfloat) coords[1];
+
+ *data = vertex;
+}
+
+
+static void set_screen_wh( GLsizei w, GLsizei h )
+{
+ width = w;
+ height = h;
+}
+
+typedef void (GLAPIENTRY *callback_t)();
+
+static void tesse( void )
+{
+ GLUtesselator *tobj;
+ GLdouble data[3];
+ GLuint i, j, point_cnt;
+
+ list_start = glGenLists( 2 );
+
+ tobj = gluNewTess();
+
+ if ( tobj != NULL ) {
+ gluTessNormal( tobj, 0.0, 0.0, 1.0 );
+ gluTessCallback( tobj, GLU_TESS_BEGIN, (callback_t) glBegin );
+ gluTessCallback( tobj, GLU_TESS_VERTEX, (callback_t) glVertex2fv );
+ gluTessCallback( tobj, GLU_TESS_END, (callback_t) glEnd );
+ gluTessCallback( tobj, GLU_TESS_ERROR, (callback_t) error_callback );
+ gluTessCallback( tobj, GLU_TESS_COMBINE, (callback_t) combine_callback );
+
+ glNewList( list_start, GL_COMPILE );
+ gluBeginPolygon( tobj );
+
+ for ( j = 0 ; j <= contour_cnt ; j++ ) {
+ point_cnt = contours[j].point_cnt;
+ gluNextContour( tobj, GLU_UNKNOWN );
+
+ for ( i = 0 ; i < point_cnt ; i++ ) {
+ data[0] = (GLdouble)( contours[j].p[i][0] );
+ data[1] = (GLdouble)( contours[j].p[i][1] );
+ data[2] = 0.0;
+ gluTessVertex( tobj, data, contours[j].p[i] );
+ }
+ }
+
+ gluEndPolygon( tobj );
+ glEndList();
+
+ gluTessCallback( tobj, GLU_TESS_BEGIN, (callback_t) begin_callback );
+ gluTessCallback( tobj, GLU_TESS_VERTEX, (callback_t) vertex_callback );
+ gluTessCallback( tobj, GLU_TESS_END, (callback_t) end_callback );
+ gluTessCallback( tobj, GLU_TESS_EDGE_FLAG, (callback_t) edge_callback );
+
+ glNewList( list_start + 1, GL_COMPILE );
+ gluBeginPolygon( tobj );
+
+ for ( j = 0 ; j <= contour_cnt ; j++ ) {
+ point_cnt = contours[j].point_cnt;
+ gluNextContour( tobj, GLU_UNKNOWN );
+
+ for ( i = 0 ; i < point_cnt ; i++ ) {
+ data[0] = (GLdouble)( contours[j].p[i][0] );
+ data[1] = (GLdouble)( contours[j].p[i][1] );
+ data[2] = 0.0;
+ gluTessVertex( tobj, data, contours[j].p[i] );
+ }
+ }
+
+ gluEndPolygon( tobj );
+ glEndList();
+
+ gluDeleteTess( tobj );
+
+ glutMouseFunc( NULL );
+ mode = TESSELATED;
+ }
+}
+
+static void left_down( int x1, int y1 )
+{
+ GLfloat P[2];
+ GLuint point_cnt;
+
+ /* translate GLUT into GL coordinates */
+
+ P[0] = x1;
+ P[1] = height - y1;
+
+ point_cnt = contours[contour_cnt].point_cnt;
+
+ contours[contour_cnt].p[point_cnt][0] = P[0];
+ contours[contour_cnt].p[point_cnt][1] = P[1];
+
+ glBegin( GL_LINES );
+
+ if ( point_cnt ) {
+ glVertex2fv( contours[contour_cnt].p[point_cnt-1] );
+ glVertex2fv( P );
+ } else {
+ glVertex2fv( P );
+ glVertex2fv( P );
+ }
+
+ glEnd();
+ glFinish();
+
+ contours[contour_cnt].point_cnt++;
+}
+
+static void middle_down( int x1, int y1 )
+{
+ GLuint point_cnt;
+ (void) x1;
+ (void) y1;
+
+ point_cnt = contours[contour_cnt].point_cnt;
+
+ if ( point_cnt > 2 ) {
+ glBegin( GL_LINES );
+
+ glVertex2fv( contours[contour_cnt].p[0] );
+ glVertex2fv( contours[contour_cnt].p[point_cnt-1] );
+
+ contours[contour_cnt].p[point_cnt][0] = -1;
+
+ glEnd();
+ glFinish();
+
+ contour_cnt++;
+ contours[contour_cnt].point_cnt = 0;
+ }
+}
+
+static void mouse_clicked( int button, int state, int x, int y )
+{
+ x -= x%10;
+ y -= y%10;
+
+ switch ( button ) {
+ case GLUT_LEFT_BUTTON:
+ if ( state == GLUT_DOWN ) {
+ left_down( x, y );
+ }
+ break;
+ case GLUT_MIDDLE_BUTTON:
+ if ( state == GLUT_DOWN ) {
+ middle_down( x, y );
+ }
+ break;
+ }
+}
+
+static void display( void )
+{
+ GLuint i,j;
+ GLsizei ii, jj;
+ GLuint point_cnt;
+
+ glClear( GL_COLOR_BUFFER_BIT );
+
+ switch ( mode ) {
+ case DEFINE:
+ /* draw grid */
+ glColor3f( 0.6, 0.5, 0.5 );
+
+ glBegin( GL_LINES );
+
+ for ( ii = 0 ; ii < width ; ii += 10 ) {
+ for ( jj = 0 ; jj < height ; jj += 10 ) {
+ glVertex2i( 0, jj );
+ glVertex2i( width, jj );
+ glVertex2i( ii, height );
+ glVertex2i( ii, 0 );
+ }
+ }
+
+ glEnd();
+
+ glColor3f( 1.0, 1.0, 0.0 );
+
+ for ( i = 0 ; i <= contour_cnt ; i++ ) {
+ point_cnt = contours[i].point_cnt;
+
+ glBegin( GL_LINES );
+
+ switch ( point_cnt ) {
+ case 0:
+ break;
+ case 1:
+ glVertex2fv( contours[i].p[0] );
+ glVertex2fv( contours[i].p[0] );
+ break;
+ case 2:
+ glVertex2fv( contours[i].p[0] );
+ glVertex2fv( contours[i].p[1] );
+ break;
+ default:
+ --point_cnt;
+ for ( j = 0 ; j < point_cnt ; j++ ) {
+ glVertex2fv( contours[i].p[j] );
+ glVertex2fv( contours[i].p[j+1] );
+ }
+ if ( contours[i].p[j+1][0] == -1 ) {
+ glVertex2fv( contours[i].p[0] );
+ glVertex2fv( contours[i].p[j] );
+ }
+ break;
+ }
+
+ glEnd();
+ }
+
+ glFinish();
+ break;
+
+ case TESSELATED:
+ /* draw triangles */
+ glColor3f( 0.7, 0.7, 0.0 );
+ glCallList( list_start );
+
+ glLineWidth( 2.0 );
+ glCallList( list_start + 1 );
+ glLineWidth( 1.0 );
+
+ glFlush();
+ break;
+ }
+
+ glColor3f( 1.0, 1.0, 0.0 );
+}
+
+static void clear( void )
+{
+ contour_cnt = 0;
+ contours[0].point_cnt = 0;
+ triangle_cnt = 0;
+
+ glutMouseFunc( mouse_clicked );
+
+ mode = DEFINE;
+
+ glDeleteLists( list_start, 2 );
+ list_start = 0;
+}
+
+static void quit( void )
+{
+ exit( 0 );
+}
+
+static void menu_selected( int entry )
+{
+ switch ( entry ) {
+ case CLEAR:
+ clear();
+ break;
+ case TESSELATE:
+ tesse();
+ break;
+ case QUIT:
+ quit();
+ break;
+ }
+
+ glutPostRedisplay();
+}
+
+static void key_pressed( unsigned char key, int x, int y )
+{
+ (void) x;
+ (void) y;
+
+ switch ( key ) {
+ case 'c':
+ case 'C':
+ clear();
+ break;
+ case 't':
+ case 'T':
+ tesse();
+ break;
+ case 27:
+ case 'q':
+ case 'Q':
+ quit();
+ break;
+ }
+
+ glutPostRedisplay();
+}
+
+static void myinit( void )
+{
+ /* clear background to gray */
+ glClearColor( 0.4, 0.4, 0.4, 0.0 );
+ glShadeModel( GL_FLAT );
+ glPolygonMode( GL_FRONT, GL_FILL );
+
+ menu = glutCreateMenu( menu_selected );
+
+ glutAddMenuEntry( "clear", CLEAR );
+ glutAddMenuEntry( "tesselate", TESSELATE );
+ glutAddMenuEntry( "quit", QUIT );
+
+ glutAttachMenu( GLUT_RIGHT_BUTTON );
+
+ glutMouseFunc( mouse_clicked );
+ glutKeyboardFunc( key_pressed );
+
+ contour_cnt = 0;
+ mode = DEFINE;
+}
+
+static void reshape( GLsizei w, GLsizei h )
+{
+ glViewport( 0, 0, w, h );
+
+ glMatrixMode( GL_PROJECTION );
+ glLoadIdentity();
+ glOrtho( 0.0, (GLdouble)w, 0.0, (GLdouble)h, -1.0, 1.0 );
+
+ glMatrixMode( GL_MODELVIEW );
+ glLoadIdentity();
+
+ set_screen_wh( w, h );
+}
+
+#endif
+
+
+static void usage( void )
+{
+ printf( "Use left mouse button to place vertices.\n" );
+ printf( "Press middle mouse button when done.\n" );
+ printf( "Select tesselate from the pop-up menu.\n" );
+}
+
+
+int main( int argc, char **argv )
+{
+ const char *version = (const char *) gluGetString( GLU_VERSION );
+ printf( "GLU version string: %s\n", version );
+ if ( strstr( version, "1.0" ) || strstr( version, "1.1" ) ) {
+ fprintf( stderr, "Sorry, this demo reqiures GLU 1.2 or later.\n" );
+ exit( 1 );
+ }
+
+ usage();
+
+ glutInit( &argc, argv );
+ glutInitDisplayMode( GLUT_SINGLE | GLUT_RGB );
+ glutInitWindowPosition(0, 0);
+ glutInitWindowSize( 400, 400 );
+ glutCreateWindow( argv[0] );
+
+ /* GH: Bit of a hack...
+ */
+#ifdef GLU_VERSION_1_2
+ myinit();
+
+ glutDisplayFunc( display );
+ glutReshapeFunc( reshape );
+
+ glutMainLoop();
+#endif
+
+ return 0;
+}
diff --git a/progs/demos/texcyl.c b/progs/demos/texcyl.c
new file mode 100644
index 00000000000..c04d5004e37
--- /dev/null
+++ b/progs/demos/texcyl.c
@@ -0,0 +1,288 @@
+
+/*
+ * Textured cylinder demo: lighting, texturing, reflection mapping.
+ *
+ * Command line options:
+ * -info print GL implementation information
+ *
+ *
+ * Brian Paul May 1997 This program is in the public domain.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <string.h>
+#include <GL/glut.h>
+
+#include "readtex.h"
+
+#define TEXTURE_FILE "../images/reflect.rgb"
+
+#define LIT 1
+#define TEXTURED 2
+#define REFLECT 3
+#define ANIMATE 10
+#define POINT_FILTER 20
+#define LINEAR_FILTER 21
+#define QUIT 100
+
+static GLuint CylinderObj = 0;
+static GLboolean Animate = GL_TRUE;
+
+static GLfloat Xrot = 0.0, Yrot = 0.0, Zrot = 0.0;
+static GLfloat DXrot = 50.0, DYrot = 125.0;
+
+/* performance info */
+static GLint T0 = 0;
+static GLint Frames = 0;
+
+
+static void Idle( void )
+{
+ static double t0 = -1.;
+ double dt, t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
+ if (t0 < 0.0)
+ t0 = t;
+ dt = t - t0;
+ t0 = t;
+
+ if (Animate) {
+ Xrot += DXrot * dt;
+ Yrot += DYrot * dt;
+ glutPostRedisplay();
+ }
+}
+
+
+static void Display( void )
+{
+ glClear( GL_COLOR_BUFFER_BIT );
+
+ glPushMatrix();
+ glRotatef(Xrot, 1.0, 0.0, 0.0);
+ glRotatef(Yrot, 0.0, 1.0, 0.0);
+ glRotatef(Zrot, 0.0, 0.0, 1.0);
+ glScalef(5.0, 5.0, 5.0);
+ glCallList(CylinderObj);
+
+ glPopMatrix();
+
+ glutSwapBuffers();
+
+ if (Animate) {
+ GLint t = glutGet(GLUT_ELAPSED_TIME);
+ Frames++;
+ if (t - T0 >= 5000) {
+ GLfloat seconds = (t - T0) / 1000.0;
+ GLfloat fps = Frames / seconds;
+ printf("%d frames in %g seconds = %g FPS\n", Frames, seconds, fps);
+ T0 = t;
+ Frames = 0;
+ }
+ }
+}
+
+
+static void Reshape( int width, int height )
+{
+ glViewport( 0, 0, width, height );
+ glMatrixMode( GL_PROJECTION );
+ glLoadIdentity();
+ glFrustum( -1.0, 1.0, -1.0, 1.0, 10.0, 100.0 );
+ glMatrixMode( GL_MODELVIEW );
+ glLoadIdentity();
+ glTranslatef( 0.0, 0.0, -70.0 );
+}
+
+
+static void SetMode(GLuint m)
+{
+ /* disable everything */
+ glDisable(GL_LIGHTING);
+ glDisable(GL_TEXTURE_2D);
+ glDisable(GL_TEXTURE_GEN_S);
+ glDisable(GL_TEXTURE_GEN_T);
+
+ /* enable what's needed */
+ if (m==LIT) {
+ glEnable(GL_LIGHTING);
+ }
+ else if (m==TEXTURED) {
+ glEnable(GL_TEXTURE_2D);
+ }
+ else if (m==REFLECT) {
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_TEXTURE_GEN_S);
+ glEnable(GL_TEXTURE_GEN_T);
+ }
+}
+
+
+static void ModeMenu(int entry)
+{
+ if (entry==ANIMATE) {
+ Animate = !Animate;
+ if (Animate)
+ glutIdleFunc(Idle);
+ else
+ glutIdleFunc(NULL);
+ }
+ else if (entry==POINT_FILTER) {
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ }
+ else if (entry==LINEAR_FILTER) {
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ }
+ else if (entry==QUIT) {
+ exit(0);
+ }
+ else {
+ SetMode(entry);
+ }
+ glutPostRedisplay();
+}
+
+
+static void Key( unsigned char key, int x, int y )
+{
+ (void) x;
+ (void) y;
+ switch (key) {
+ case ' ':
+ Animate = !Animate;
+ if (Animate)
+ glutIdleFunc(Idle);
+ else
+ glutIdleFunc(NULL);
+ break;
+ case 27:
+ exit(0);
+ break;
+ }
+ glutPostRedisplay();
+}
+
+
+static void SpecialKey( int key, int x, int y )
+{
+ float step = 3.0;
+ (void) x;
+ (void) y;
+
+ switch (key) {
+ case GLUT_KEY_UP:
+ Xrot += step;
+ break;
+ case GLUT_KEY_DOWN:
+ Xrot -= step;
+ break;
+ case GLUT_KEY_LEFT:
+ Yrot += step;
+ break;
+ case GLUT_KEY_RIGHT:
+ Yrot -= step;
+ break;
+ }
+ glutPostRedisplay();
+}
+
+
+static void Init( int argc, char *argv[] )
+{
+ GLUquadricObj *q = gluNewQuadric();
+ CylinderObj = glGenLists(1);
+ glNewList(CylinderObj, GL_COMPILE);
+
+ glTranslatef(0.0, 0.0, -1.0);
+
+ /* cylinder */
+ gluQuadricNormals(q, GL_SMOOTH);
+ gluQuadricTexture(q, GL_TRUE);
+ gluCylinder(q, 0.6, 0.6, 2.0, 24, 1);
+
+ /* end cap */
+ glTranslatef(0.0, 0.0, 2.0);
+ gluDisk(q, 0.0, 0.6, 24, 1);
+
+ /* other end cap */
+ glTranslatef(0.0, 0.0, -2.0);
+ gluQuadricOrientation(q, GLU_INSIDE);
+ gluDisk(q, 0.0, 0.6, 24, 1);
+
+ glEndList();
+ gluDeleteQuadric(q);
+
+ /* lighting */
+ glEnable(GL_LIGHTING);
+ {
+ GLfloat gray[4] = {0.2, 0.2, 0.2, 1.0};
+ GLfloat white[4] = {1.0, 1.0, 1.0, 1.0};
+ GLfloat teal[4] = { 0.0, 1.0, 0.8, 1.0 };
+ glMaterialfv(GL_FRONT, GL_DIFFUSE, teal);
+ glLightfv(GL_LIGHT0, GL_AMBIENT, gray);
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, white);
+ glEnable(GL_LIGHT0);
+ }
+
+ /* fitering = nearest, initially */
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+
+ glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
+ glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
+
+ glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
+ glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
+
+ if (!LoadRGBMipmaps(TEXTURE_FILE, GL_RGB)) {
+ printf("Error: couldn't load texture image\n");
+ exit(1);
+ }
+
+ glEnable(GL_CULL_FACE); /* don't need Z testing for convex objects */
+
+ SetMode(LIT);
+
+ if (argc > 1 && strcmp(argv[1], "-info")==0) {
+ printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER));
+ printf("GL_VERSION = %s\n", (char *) glGetString(GL_VERSION));
+ printf("GL_VENDOR = %s\n", (char *) glGetString(GL_VENDOR));
+ printf("GL_EXTENSIONS = %s\n", (char *) glGetString(GL_EXTENSIONS));
+ }
+}
+
+
+int main( int argc, char *argv[] )
+{
+ glutInit( &argc, argv );
+ glutInitWindowSize( 400, 400 );
+ glutInitWindowPosition( 0, 0 );
+
+ glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE );
+
+ glutCreateWindow(argv[0] );
+
+ Init(argc, argv);
+
+ glutReshapeFunc( Reshape );
+ glutKeyboardFunc( Key );
+ glutSpecialFunc( SpecialKey );
+ glutDisplayFunc( Display );
+ glutIdleFunc( Idle );
+
+ glutCreateMenu(ModeMenu);
+ glutAddMenuEntry("Lit", LIT);
+ glutAddMenuEntry("Textured", TEXTURED);
+ glutAddMenuEntry("Reflect", REFLECT);
+ glutAddMenuEntry("Point Filtered", POINT_FILTER);
+ glutAddMenuEntry("Linear Filtered", LINEAR_FILTER);
+ glutAddMenuEntry("Toggle Animation", ANIMATE);
+ glutAddMenuEntry("Quit", QUIT);
+ glutAttachMenu(GLUT_RIGHT_BUTTON);
+
+ glutMainLoop();
+ return 0;
+}
diff --git a/progs/demos/texdown.c b/progs/demos/texdown.c
new file mode 100644
index 00000000000..79525a0395e
--- /dev/null
+++ b/progs/demos/texdown.c
@@ -0,0 +1,403 @@
+
+/*
+ * 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.
+ */
+
+
+/*
+ * texdown
+ *
+ * Measure texture download speed.
+ * Use keyboard to change texture size, format, datatype, scale/bias,
+ * subimageload, etc.
+ *
+ * Brian Paul 28 January 2000
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <GL/glut.h>
+
+
+static GLsizei MaxSize = 1024;
+static GLsizei TexWidth = 256, TexHeight = 256, TexBorder = 0;
+static GLboolean ScaleAndBias = GL_FALSE;
+static GLboolean SubImage = GL_FALSE;
+static GLdouble DownloadRate = 0.0; /* texels/sec */
+
+static GLuint Mode = 0;
+
+
+struct FormatRec {
+ GLenum Format;
+ GLenum Type;
+ GLenum IntFormat;
+ GLint TexelSize;
+};
+
+
+static const struct FormatRec FormatTable[] = {
+ /* Format Type IntFormat TexelSize */
+ { GL_BGRA, GL_UNSIGNED_BYTE, GL_RGBA, 4 },
+ { GL_RGB, GL_UNSIGNED_BYTE, GL_RGB, 3 },
+ { GL_RGBA, GL_UNSIGNED_BYTE, GL_RGBA, 4 },
+ { GL_RGBA, GL_UNSIGNED_BYTE, GL_RGB, 4 },
+ { GL_RGB, GL_UNSIGNED_SHORT_5_6_5, GL_RGB, 2 },
+ { GL_LUMINANCE, GL_UNSIGNED_BYTE, GL_LUMINANCE, 1 },
+ { GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, GL_LUMINANCE_ALPHA, 2 },
+ { GL_ALPHA, GL_UNSIGNED_BYTE, GL_ALPHA, 1 },
+};
+static GLint Format;
+
+#define NUM_FORMATS (sizeof(FormatTable)/sizeof(FormatTable[0]))
+
+static int
+BytesPerTexel(GLint format)
+{
+ return FormatTable[format].TexelSize;
+}
+
+
+static const char *
+FormatStr(GLenum format)
+{
+ switch (format) {
+ case GL_RGB:
+ return "GL_RGB";
+ case GL_RGBA:
+ return "GL_RGBA";
+ case GL_BGRA:
+ return "GL_BGRA";
+ case GL_LUMINANCE:
+ return "GL_LUMINANCE";
+ case GL_LUMINANCE_ALPHA:
+ return "GL_LUMINANCE_ALPHA";
+ case GL_ALPHA:
+ return "GL_ALPHA";
+ default:
+ return "";
+ }
+}
+
+
+static const char *
+TypeStr(GLenum type)
+{
+ switch (type) {
+ case GL_UNSIGNED_BYTE:
+ return "GL_UNSIGNED_BYTE";
+ case GL_UNSIGNED_SHORT:
+ return "GL_UNSIGNED_SHORT";
+ case GL_UNSIGNED_SHORT_5_6_5:
+ return "GL_UNSIGNED_SHORT_5_6_5";
+ case GL_UNSIGNED_SHORT_5_6_5_REV:
+ return "GL_UNSIGNED_SHORT_5_6_5_REV";
+ default:
+ return "";
+ }
+}
+
+
+static void
+MeasureDownloadRate(void)
+{
+ const int w = TexWidth + 2 * TexBorder;
+ const int h = TexHeight + 2 * TexBorder;
+ const int bytes = w * h * BytesPerTexel(Format);
+ GLubyte *texImage, *getImage;
+ GLdouble t0, t1, time;
+ int count;
+ int i;
+
+ texImage = (GLubyte *) malloc(bytes);
+ getImage = (GLubyte *) malloc(bytes);
+ if (!texImage || !getImage) {
+ DownloadRate = 0.0;
+ return;
+ }
+
+ for (i = 0; i < bytes; i++) {
+ texImage[i] = i & 0xff;
+ }
+
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ glPixelStorei(GL_PACK_ALIGNMENT, 1);
+
+ if (ScaleAndBias) {
+ glPixelTransferf(GL_RED_SCALE, 0.5);
+ glPixelTransferf(GL_GREEN_SCALE, 0.5);
+ glPixelTransferf(GL_BLUE_SCALE, 0.5);
+ glPixelTransferf(GL_RED_BIAS, 0.5);
+ glPixelTransferf(GL_GREEN_BIAS, 0.5);
+ glPixelTransferf(GL_BLUE_BIAS, 0.5);
+ }
+ else {
+ glPixelTransferf(GL_RED_SCALE, 1.0);
+ glPixelTransferf(GL_GREEN_SCALE, 1.0);
+ glPixelTransferf(GL_BLUE_SCALE, 1.0);
+ glPixelTransferf(GL_RED_BIAS, 0.0);
+ glPixelTransferf(GL_GREEN_BIAS, 0.0);
+ glPixelTransferf(GL_BLUE_BIAS, 0.0);
+ }
+
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glEnable(GL_TEXTURE_2D);
+
+ count = 0;
+ t0 = glutGet(GLUT_ELAPSED_TIME) * 0.001;
+ do {
+ if (SubImage && count > 0) {
+ glTexSubImage2D(GL_TEXTURE_2D, 0, -TexBorder, -TexBorder, w, h,
+ FormatTable[Format].Format,
+ FormatTable[Format].Type, texImage);
+ }
+ else {
+ glTexImage2D(GL_TEXTURE_2D, 0,
+ FormatTable[Format].IntFormat, w, h, TexBorder,
+ FormatTable[Format].Format,
+ FormatTable[Format].Type, texImage);
+ }
+
+ /* draw a tiny polygon to force texture into texram */
+ glBegin(GL_TRIANGLES);
+ glTexCoord2f(0, 0); glVertex2f(1, 1);
+ glTexCoord2f(1, 0); glVertex2f(3, 1);
+ glTexCoord2f(0.5, 1); glVertex2f(2, 3);
+ glEnd();
+
+ t1 = glutGet(GLUT_ELAPSED_TIME) * 0.001;
+ time = t1 - t0;
+ count++;
+ } while (time < 3.0);
+
+ glDisable(GL_TEXTURE_2D);
+
+ printf("w*h=%d count=%d time=%f\n", w*h, count, time);
+ DownloadRate = w * h * count / time;
+
+#if 0
+ if (!ScaleAndBias) {
+ /* verify texture readback */
+ glGetTexImage(GL_TEXTURE_2D, 0,
+ FormatTable[Format].Format,
+ FormatTable[Format].Type, getImage);
+ for (i = 0; i < w * h; i++) {
+ if (texImage[i] != getImage[i]) {
+ printf("[%d] %d != %d\n", i, texImage[i], getImage[i]);
+ }
+ }
+ }
+#endif
+
+ free(texImage);
+ free(getImage);
+
+ {
+ GLint err = glGetError();
+ if (err)
+ printf("GL error %d\n", err);
+ }
+}
+
+
+static void
+PrintString(const char *s)
+{
+ while (*s) {
+ glutBitmapCharacter(GLUT_BITMAP_8_BY_13, (int) *s);
+ s++;
+ }
+}
+
+
+static void
+Display(void)
+{
+ const int w = TexWidth + 2 * TexBorder;
+ const int h = TexHeight + 2 * TexBorder;
+ char s[1000];
+
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ glRasterPos2i(10, 80);
+ sprintf(s, "Texture size[cursor]: %d x %d Border[b]: %d", w, h, TexBorder);
+ PrintString(s);
+
+ glRasterPos2i(10, 65);
+ sprintf(s, "Format[f]: %s Type: %s IntFormat: %s",
+ FormatStr(FormatTable[Format].Format),
+ TypeStr( FormatTable[Format].Type),
+ FormatStr(FormatTable[Format].IntFormat));
+ PrintString(s);
+
+ glRasterPos2i(10, 50);
+ sprintf(s, "Pixel Scale&Bias[p]: %s TexSubImage[s]: %s",
+ ScaleAndBias ? "Yes" : "No",
+ SubImage ? "Yes" : "No");
+ PrintString(s);
+
+ if (Mode == 0) {
+ glRasterPos2i(200, 10);
+ sprintf(s, "...Measuring...");
+ PrintString(s);
+ glutSwapBuffers();
+ glutPostRedisplay();
+ Mode++;
+ }
+ else if (Mode == 1) {
+ MeasureDownloadRate();
+ glutPostRedisplay();
+ Mode++;
+ }
+ else {
+ /* show results */
+ glRasterPos2i(10, 10);
+ sprintf(s, "Download rate: %g Mtexels/second %g MB/second",
+ DownloadRate / 1000000.0,
+ DownloadRate * BytesPerTexel(Format) / 1000000.0);
+ PrintString(s);
+ {
+ GLint r, g, b, a, l, i;
+ glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_RED_SIZE, &r);
+ glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_GREEN_SIZE, &g);
+ glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_BLUE_SIZE, &b);
+ glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_ALPHA_SIZE, &a);
+ glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_LUMINANCE_SIZE, &l);
+ glGetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_INTENSITY_SIZE, &i);
+ sprintf(s, "TexelBits: R=%d G=%d B=%d A=%d L=%d I=%d", r, g, b, a, l, i);
+ glRasterPos2i(10, 25);
+ PrintString(s);
+ }
+
+ glutSwapBuffers();
+ }
+}
+
+
+static void
+Reshape(int width, int height)
+{
+ glViewport( 0, 0, width, height );
+ glMatrixMode( GL_PROJECTION );
+ glLoadIdentity();
+ glOrtho(0, width, 0, height, -1, 1);
+ glMatrixMode( GL_MODELVIEW );
+ glLoadIdentity();
+}
+
+
+
+static void
+Key(unsigned char key, int x, int y)
+{
+ (void) x;
+ (void) y;
+ switch (key) {
+ case ' ':
+ Mode = 0;
+ break;
+ case 'b':
+ /* toggle border */
+ TexBorder = 1 - TexBorder;
+ Mode = 0;
+ break;
+ case 'f':
+ /* change format */
+ Format = (Format + 1) % NUM_FORMATS;
+ Mode = 0;
+ break;
+ case 'F':
+ /* change format */
+ Format = (Format - 1) % NUM_FORMATS;
+ Mode = 0;
+ break;
+ case 'p':
+ /* toggle border */
+ ScaleAndBias = !ScaleAndBias;
+ Mode = 0;
+ break;
+ case 's':
+ SubImage = !SubImage;
+ Mode = 0;
+ break;
+ case 27:
+ exit(0);
+ break;
+ }
+ glutPostRedisplay();
+}
+
+
+static void
+SpecialKey(int key, int x, int y)
+{
+ (void) x;
+ (void) y;
+ switch (key) {
+ case GLUT_KEY_UP:
+ if (TexHeight < MaxSize)
+ TexHeight *= 2;
+ break;
+ case GLUT_KEY_DOWN:
+ if (TexHeight > 1)
+ TexHeight /= 2;
+ break;
+ case GLUT_KEY_LEFT:
+ if (TexWidth > 1)
+ TexWidth /= 2;
+ break;
+ case GLUT_KEY_RIGHT:
+ if (TexWidth < MaxSize)
+ TexWidth *= 2;
+ break;
+ }
+ Mode = 0;
+ glutPostRedisplay();
+}
+
+
+static void
+Init(void)
+{
+ printf("GL_VENDOR = %s\n", (const char *) glGetString(GL_VENDOR));
+ printf("GL_VERSION = %s\n", (const char *) glGetString(GL_VERSION));
+ printf("GL_RENDERER = %s\n", (const char *) glGetString(GL_RENDERER));
+}
+
+
+int
+main(int argc, char *argv[])
+{
+ glutInit( &argc, argv );
+ glutInitWindowPosition( 0, 0 );
+ glutInitWindowSize( 600, 100 );
+ glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH );
+ glutCreateWindow(argv[0]);
+ glutReshapeFunc( Reshape );
+ glutKeyboardFunc( Key );
+ glutSpecialFunc( SpecialKey );
+ glutDisplayFunc( Display );
+ Init();
+ glutMainLoop();
+ return 0;
+}
diff --git a/progs/demos/texenv.c b/progs/demos/texenv.c
new file mode 100644
index 00000000000..590867b4945
--- /dev/null
+++ b/progs/demos/texenv.c
@@ -0,0 +1,815 @@
+
+/* Copyright (c) Mark J. Kilgard, 1994. */
+
+/**
+ * (c) Copyright 1993, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED
+ * Permission to use, copy, modify, and distribute this software for
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission.
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "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, INC. BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC. HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * US Government Users Restricted Rights
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States. Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N. Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
+ */
+
+/*
+ * Demonstrates texture environment modes and internal image formats.
+ */
+
+/*
+ * Hacked on, updated by Gareth Hughes <[email protected]>
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <GL/glut.h>
+
+#undef max
+#undef min
+#define max( a, b ) ((a) >= (b) ? (a) : (b))
+#define min( a, b ) ((a) <= (b) ? (a) : (b))
+
+GLfloat lightCheck[4] = { 0.7, 0.7, 0.7, 1.0 };
+GLfloat darkCheck[4] = { 0.3, 0.3, 0.3, 1.0 };
+
+GLfloat labelColor0[4] = { 1.0, 1.0, 1.0, 1.0 };
+GLfloat labelColor1[4] = { 1.0, 1.0, 0.4, 1.0 };
+GLfloat *labelInfoColor = labelColor0;
+GLfloat labelLevelColor0[4] = { 0.8, 0.8, 0.1, 1.0 };
+GLfloat labelLevelColor1[4] = { 0.0, 0.0, 0.0, 1.0 };
+
+GLboolean doubleBuffered = GL_TRUE;
+GLboolean drawBackground = GL_FALSE;
+GLboolean drawBlended = GL_TRUE;
+GLboolean drawSmooth = GL_FALSE;
+GLboolean drawTextured = GL_TRUE;
+GLboolean displayLevelInfo = GL_FALSE;
+
+int textureWidth = 64;
+int textureHeight = 64;
+
+int winWidth = 580, winHeight = 720;
+
+struct formatInfo {
+ GLenum baseFormat;
+ GLenum internalFormat;
+ char *name;
+};
+
+#define NUM_LUMINANCE_FORMATS (sizeof(luminanceFormats) / sizeof(luminanceFormats[0]))
+struct formatInfo luminanceFormats[] =
+{
+ { GL_LUMINANCE, GL_LUMINANCE, "LUMINANCE" },
+ { GL_LUMINANCE, GL_LUMINANCE4, "LUMINANCE4" },
+ { GL_LUMINANCE, GL_LUMINANCE8, "LUMINANCE8" },
+ { GL_LUMINANCE, GL_LUMINANCE12, "LUMINANCE12" },
+ { GL_LUMINANCE, GL_LUMINANCE16, "LUMINANCE16" },
+};
+
+#define NUM_ALPHA_FORMATS (sizeof(alphaFormats) / sizeof(alphaFormats[0]))
+struct formatInfo alphaFormats[] =
+{
+ { GL_ALPHA, GL_ALPHA, "ALPHA" },
+ { GL_ALPHA, GL_ALPHA4, "ALPHA4" },
+ { GL_ALPHA, GL_ALPHA8, "ALPHA8" },
+ { GL_ALPHA, GL_ALPHA12, "ALPHA12" },
+ { GL_ALPHA, GL_ALPHA16, "ALPHA16" },
+};
+
+#define NUM_INTENSITY_FORMATS (sizeof(intensityFormats) / sizeof(intensityFormats[0]))
+struct formatInfo intensityFormats[] =
+{
+ { GL_INTENSITY, GL_INTENSITY, "INTENSITY" },
+ { GL_INTENSITY, GL_INTENSITY4, "INTENSITY4" },
+ { GL_INTENSITY, GL_INTENSITY8, "INTENSITY8" },
+ { GL_INTENSITY, GL_INTENSITY12, "INTENSITY12" },
+ { GL_INTENSITY, GL_INTENSITY16, "INTENSITY16" },
+};
+
+#define NUM_LUMINANCE_ALPHA_FORMATS (sizeof(luminanceAlphaFormats) / sizeof(luminanceAlphaFormats[0]))
+struct formatInfo luminanceAlphaFormats[] =
+{
+ { GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, "LUMINANCE_ALPHA" },
+ { GL_LUMINANCE_ALPHA, GL_LUMINANCE4_ALPHA4, "LUMINANCE4_ALPHA4" },
+ { GL_LUMINANCE_ALPHA, GL_LUMINANCE6_ALPHA2, "LUMINANCE6_ALPHA2" },
+ { GL_LUMINANCE_ALPHA, GL_LUMINANCE8_ALPHA8, "LUMINANCE8_ALPHA8" },
+ { GL_LUMINANCE_ALPHA, GL_LUMINANCE12_ALPHA4, "LUMINANCE12_ALPHA4" },
+ { GL_LUMINANCE_ALPHA, GL_LUMINANCE12_ALPHA12, "LUMINANCE12_ALPHA12" },
+ { GL_LUMINANCE_ALPHA, GL_LUMINANCE16_ALPHA16, "LUMINANCE16_ALPHA16" },
+};
+
+#define NUM_RGB_FORMATS (sizeof(rgbFormats) / sizeof(rgbFormats[0]))
+struct formatInfo rgbFormats[] =
+{
+ { GL_RGB, GL_RGB, "RGB" },
+ { GL_RGB, GL_R3_G3_B2, "R3_G3_B2" },
+ { GL_RGB, GL_RGB4, "RGB4" },
+ { GL_RGB, GL_RGB5, "RGB5" },
+ { GL_RGB, GL_RGB8, "RGB8" },
+ { GL_RGB, GL_RGB10, "RGB10" },
+ { GL_RGB, GL_RGB12, "RGB12" },
+ { GL_RGB, GL_RGB16, "RGB16" },
+};
+
+#define NUM_RGBA_FORMATS (sizeof(rgbaFormats) / sizeof(rgbaFormats[0]))
+struct formatInfo rgbaFormats[] =
+{
+ { GL_RGBA, GL_RGBA, "RGBA" },
+ { GL_RGBA, GL_RGBA2, "RGBA2" },
+ { GL_RGBA, GL_RGBA4, "RGBA4" },
+ { GL_RGBA, GL_RGB5_A1, "RGB5_A1" },
+ { GL_RGBA, GL_RGBA8, "RGBA8" },
+ { GL_RGBA, GL_RGB10_A2, "RGB10_A2" },
+ { GL_RGBA, GL_RGBA12, "RGBA12" },
+ { GL_RGBA, GL_RGBA16, "RGBA16" },
+};
+
+struct baseFormatInfo {
+ struct formatInfo *format;
+ int current, number;
+};
+
+#define NUM_BASE_FORMATS (sizeof(baseFormats) / sizeof(baseFormats[0]))
+int baseFormat;
+struct baseFormatInfo baseFormats[] =
+{
+ { luminanceFormats, 0, NUM_LUMINANCE_FORMATS },
+ { alphaFormats, 0, NUM_ALPHA_FORMATS },
+ { intensityFormats, 0, NUM_INTENSITY_FORMATS },
+ { luminanceAlphaFormats, 0, NUM_LUMINANCE_ALPHA_FORMATS },
+ { rgbFormats, 0, NUM_RGB_FORMATS },
+ { rgbaFormats, 0, NUM_RGBA_FORMATS },
+};
+
+#define NUM_ENV_COLORS (sizeof(envColors) / sizeof(envColors[0]))
+int envColor = 0;
+GLfloat envColors[][4] =
+{
+ { 0.0, 0.0, 0.0, 1.0 },
+ { 1.0, 0.0, 0.0, 1.0 },
+ { 0.0, 1.0, 0.0, 1.0 },
+ { 0.0, 0.0, 1.0, 1.0 },
+ { 1.0, 1.0, 1.0, 1.0 },
+};
+
+struct envModeInfo {
+ GLenum mode;
+ char *name;
+};
+
+/* allow for run-time check for GL_EXT_texture_env_add */
+int NUM_ENV_MODES = 5;
+struct envModeInfo envModes[] =
+{
+ { GL_REPLACE, "REPLACE" },
+ { GL_MODULATE, "MODULATE" },
+ { GL_BLEND, "BLEND" },
+ { GL_DECAL, "DECAL" },
+#if GL_EXT_texture_env_add
+ { GL_ADD, "ADD" },
+#endif
+};
+
+static void checkErrors( void )
+{
+ GLenum error;
+
+ while ( (error = glGetError()) != GL_NO_ERROR ) {
+ fprintf( stderr, "Error: %s\n", (char *) gluErrorString( error ) );
+ }
+}
+
+static void drawString( const char *string, GLfloat x, GLfloat y,
+ const GLfloat color[4] )
+{
+ glColor4fv( color );
+ glRasterPos2f( x, y );
+
+ while ( *string ) {
+ glutBitmapCharacter( GLUT_BITMAP_TIMES_ROMAN_10, *string );
+ string++;
+ }
+}
+
+static void drawStringOutline( const char *string, GLfloat x, GLfloat y,
+ const GLfloat color[4],
+ const GLfloat outline[4] )
+{
+ drawString( string, x - 1, y, outline );
+ drawString( string, x + 1, y, outline );
+ drawString( string, x, y - 1, outline );
+ drawString( string, x, y + 1, outline );
+ drawString( string, x, y, color );
+}
+
+static void begin2D( int width, int height )
+{
+ glMatrixMode( GL_PROJECTION );
+
+ glPushMatrix();
+ glLoadIdentity();
+
+ glOrtho( 0, width, 0, height, -1, 1 );
+ glMatrixMode( GL_MODELVIEW );
+
+ glPushMatrix();
+ glLoadIdentity();
+}
+
+static void end2D( void )
+{
+ glMatrixMode( GL_PROJECTION );
+ glPopMatrix();
+ glMatrixMode( GL_MODELVIEW );
+ glPopMatrix();
+}
+
+static void initialize( void )
+{
+ glMatrixMode( GL_PROJECTION );
+ glLoadIdentity();
+
+ glOrtho( -1.5, 1.5, -1.5, 1.5, -1.5, 1.5 );
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ glShadeModel( GL_FLAT );
+}
+
+/* ARGSUSED1 */
+static void keyboard( unsigned char c, int x, int y )
+{
+ switch ( c ) {
+ case 'c':
+ envColor++;
+ envColor = envColor % (int) NUM_ENV_COLORS;
+ break;
+ case 'g':
+ drawBackground = !drawBackground;
+ break;
+ case 'b':
+ drawBlended = !drawBlended;
+ break;
+ case 's':
+ drawSmooth = !drawSmooth;
+ break;
+ case 't':
+ drawTextured = !drawTextured;
+ break;
+ case 'i':
+ displayLevelInfo = !displayLevelInfo;
+ break;
+ case 27: /* Escape key should force exit. */
+ exit(0);
+ break;
+ default:
+ break;
+ }
+ glutPostRedisplay();
+}
+
+/* ARGSUSED1 */
+static void special( int key, int x, int y )
+{
+ switch ( key ) {
+ case GLUT_KEY_DOWN:
+ if ( ++baseFormat > NUM_BASE_FORMATS - 1 ) {
+ baseFormat = 0;
+ }
+ break;
+ case GLUT_KEY_UP:
+ if ( --baseFormat < 0 ) {
+ baseFormat = NUM_BASE_FORMATS - 1;
+ }
+ break;
+ case GLUT_KEY_LEFT:
+ --baseFormats[baseFormat].current;
+ if ( baseFormats[baseFormat].current < 0 ) {
+ baseFormats[baseFormat].current = baseFormats[baseFormat].number - 1;
+ }
+ break;
+ case GLUT_KEY_RIGHT:
+ ++baseFormats[baseFormat].current;
+ if ( baseFormats[baseFormat].current > baseFormats[baseFormat].number - 1 ) {
+ baseFormats[baseFormat].current = 0;
+ }
+ break;
+ default:
+ break;
+ }
+ glutPostRedisplay();
+}
+
+static void
+reshape( int w, int h )
+{
+ winWidth = w;
+ winHeight = h;
+ /* No need to call glViewPort here since "draw" calls it! */
+}
+
+static void loadTexture( int width, int height,
+ const struct formatInfo *format )
+{
+ int luminanceSize = 0;
+ int alphaSize = 0;
+ int rgbSize = 0;
+ GLenum textureFormat;
+ GLubyte *texImage, *p;
+ int elementsPerGroup, elementSize, groupSize, rowSize;
+ int i, j;
+
+ switch ( format->baseFormat ) {
+ case GL_LUMINANCE:
+ luminanceSize = 1;
+ textureFormat = GL_LUMINANCE;
+ break;
+ case GL_INTENSITY:
+ luminanceSize = 1;
+ /* Note: format=GL_INTENSITY for glTexImage is not legal */
+ textureFormat = GL_LUMINANCE;
+ break;
+ case GL_ALPHA:
+ alphaSize = 1;
+ textureFormat = GL_ALPHA;
+ break;
+ case GL_LUMINANCE_ALPHA:
+ luminanceSize = 1;
+ alphaSize = 1;
+ textureFormat = GL_LUMINANCE_ALPHA;
+ break;
+ case GL_RGB:
+ rgbSize = 3;
+ textureFormat = GL_RGB;
+ break;
+ case GL_RGBA:
+ rgbSize = 3;
+ alphaSize = 1;
+ textureFormat = GL_RGBA;
+ break;
+ default:
+ fprintf(stderr, "bad internal format info\n");
+ return;
+ }
+
+ elementsPerGroup = luminanceSize + alphaSize + rgbSize;
+ elementSize = sizeof(GLubyte);
+ groupSize = elementsPerGroup * elementSize;
+ rowSize = width * groupSize;
+
+ if ( (texImage = (GLubyte *) malloc( height * rowSize ) ) == NULL ) {
+ fprintf( stderr, "texture malloc failed\n" );
+ return;
+ }
+
+ for ( i = 0 ; i < height ; i++ )
+ {
+ p = texImage + i * rowSize;
+
+ for ( j = 0 ; j < width ; j++ )
+ {
+ if ( luminanceSize > 0 )
+ {
+ /**
+ ** +-----+-----+
+ ** | | |
+ ** | W | LG |
+ ** | | |
+ ** +-----+-----+
+ ** | | |
+ ** | DG | B |
+ ** | | |
+ ** +-----+-----+
+ **/
+ if ( i > height / 2 ) {
+ if ( j < width / 2 ) {
+ p[0] = 0xff;
+ } else {
+ p[0] = 0xaa;
+ }
+ } else {
+ if ( j < width / 2 ) {
+ p[0] = 0x55;
+ } else {
+ p[0] = 0x00;
+ }
+ }
+ p += elementSize;
+ }
+
+ if ( rgbSize > 0 )
+ {
+ /**
+ ** +-----+-----+
+ ** | | |
+ ** | R | G |
+ ** | | |
+ ** +-----+-----+
+ ** | | |
+ ** | Y | B |
+ ** | | |
+ ** +-----+-----+
+ **/
+ if ( i > height / 2 ) {
+ if ( j < width / 2 ) {
+ p[0] = 0xff;
+ p[1] = 0x00;
+ p[2] = 0x00;
+ } else {
+ p[0] = 0x00;
+ p[1] = 0xff;
+ p[2] = 0x00;
+ }
+ } else {
+ if ( j < width / 2 ) {
+ p[0] = 0xff;
+ p[1] = 0xff;
+ p[2] = 0x00;
+ } else {
+ p[0] = 0x00;
+ p[1] = 0x00;
+ p[2] = 0xff;
+ }
+ }
+ p += 3 * elementSize;
+ }
+
+ if ( alphaSize > 0 )
+ {
+ /**
+ ** +-----------+
+ ** | W |
+ ** | +-----+ |
+ ** | | | |
+ ** | | B | |
+ ** | | | |
+ ** | +-----+ |
+ ** | |
+ ** +-----------+
+ **/
+ int i2 = i - height / 2;
+ int j2 = j - width / 2;
+ int h8 = height / 8;
+ int w8 = width / 8;
+ if ( -h8 <= i2 && i2 <= h8 && -w8 <= j2 && j2 <= w8 ) {
+ p[0] = 0x00;
+ } else if ( -2 * h8 <= i2 && i2 <= 2 * h8 && -2 * w8 <= j2 && j2 <= 2 * w8 ) {
+ p[0] = 0x55;
+ } else if ( -3 * h8 <= i2 && i2 <= 3 * h8 && -3 * w8 <= j2 && j2 <= 3 * w8 ) {
+ p[0] = 0xaa;
+ } else {
+ p[0] = 0xff;
+ }
+ p += elementSize;
+ }
+ }
+ }
+
+ glTexImage2D( GL_TEXTURE_2D, 0,
+ format->internalFormat, width, height, 0,
+ textureFormat, GL_UNSIGNED_BYTE, texImage );
+
+ free( texImage );
+}
+
+static void drawCheck( int w, int h, const GLfloat lightCheck[4],
+ const GLfloat darkCheck[4] )
+{
+ float dw = 2.0 / w;
+ float dh = 2.0 / h;
+ int i, j;
+
+ for ( i = 0 ; i < w ; i++ ) {
+ GLfloat x0 = -1.0 + i * dw;
+ GLfloat x1 = x0 + dw;
+
+ glBegin( GL_QUAD_STRIP );
+
+ for ( j = 0 ; j <= h ; j++ ) {
+ GLfloat y = -1.0 + j * dh;
+
+ if ( (i ^ j) & 1 ) {
+ glColor4fv( lightCheck );
+ } else {
+ glColor4fv( darkCheck );
+ }
+
+ glVertex2f( x0, y );
+ glVertex2f( x1, y );
+ }
+
+ glEnd();
+ }
+}
+
+static const char *lookupFormat( GLint format )
+{
+ switch ( format ) {
+ case GL_RGBA:
+ return "GL_RGBA";
+ case GL_RGB:
+ return "GL_RGB";
+ case GL_ALPHA:
+ return "GL_ALPHA";
+ case GL_LUMINANCE:
+ return "GL_LUMINANCE";
+ case GL_LUMINANCE_ALPHA:
+ return "GL_LUMINANCE_ALPHA";
+ case GL_INTENSITY:
+ return "GL_INTENSITY";
+ case GL_COLOR_INDEX:
+ return "GL_COLOR_INDEX";
+ case GL_BGRA:
+ return "GL_BGRA";
+ case GL_BGR:
+ return "GL_BGR";
+ default:
+ return "unknown format";
+ }
+}
+
+static void drawSample( int x, int y, int w, int h,
+ const struct formatInfo *format,
+ const struct envModeInfo *envMode )
+{
+ glViewport( x, y, w, h );
+ glScissor( x, y, w, h );
+
+ glClearColor( 0.1, 0.1, 0.1, 1.0 );
+ glClear( GL_COLOR_BUFFER_BIT );
+
+ begin2D( w, h );
+ drawString( format->name, 10, h - 15, labelInfoColor );
+ drawString( envMode->name, 10, 5, labelInfoColor );
+ end2D();
+
+ glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, envMode->mode );
+ glTexEnvfv( GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, envColors[envColor] );
+
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
+
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP );
+
+ loadTexture( textureWidth, textureHeight, format );
+
+ if ( drawBackground ) {
+ drawCheck( 15, 15, lightCheck, darkCheck );
+ }
+ if ( drawBlended ) {
+ glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
+ glEnable( GL_BLEND );
+ }
+ if ( drawSmooth ) {
+ glShadeModel( GL_SMOOTH );
+ }
+ else {
+ glShadeModel( GL_FLAT );
+ glColor4f(1, 1, 1, 1);
+ }
+ if ( drawTextured ) {
+ glEnable( GL_TEXTURE_2D );
+ }
+
+ /*
+ * if (drawSmooth) then draw quad which goes from purple at the
+ * bottom (100% alpha) to green at the top (50% alpha).
+ */
+ glBegin( GL_QUADS );
+ if ( drawSmooth ) glColor4f( 1.0, 0.0, 1.0, 1.0 );
+ glTexCoord2f( 0.0, 0.0 );
+ glVertex2f( -0.8, -0.8 );
+
+ if ( drawSmooth ) glColor4f( 1.0, 0.0, 1.0, 1.0 );
+ glTexCoord2f( 1.0, 0.0 );
+ glVertex2f( 0.8, -0.8 );
+
+ if ( drawSmooth ) glColor4f( 0.0, 1.0, 0.0, 0.5 );
+ glTexCoord2f( 1.0, 1.0 );
+ glVertex2f( 0.8, 0.8 );
+
+ if ( drawSmooth ) glColor4f( 0.0, 1.0, 0.0, 0.5 );
+ glTexCoord2f( 0.0, 1.0 );
+ glVertex2f( -0.8, 0.8 );
+ glEnd();
+
+ glDisable( GL_BLEND );
+ glShadeModel( GL_FLAT );
+ glDisable( GL_TEXTURE_2D );
+
+ if ( envMode->mode == GL_DECAL &&
+ (format->baseFormat == GL_ALPHA ||
+ format->baseFormat == GL_LUMINANCE ||
+ format->baseFormat == GL_LUMINANCE_ALPHA ||
+ format->baseFormat == GL_INTENSITY)) {
+ /* undefined format/mode combination */
+ begin2D( w, h );
+ drawStringOutline( "UNDEFINED MODE", 15, h / 2,
+ labelLevelColor0, labelLevelColor1 );
+ end2D();
+ }
+ else if ( displayLevelInfo ) {
+ GLint width, height, border, format;
+ GLint redSize, greenSize, blueSize, alphaSize;
+ GLint luminanceSize, intensitySize;
+ char buf[255];
+
+ glGetTexLevelParameteriv( GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width );
+ glGetTexLevelParameteriv( GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &height );
+ glGetTexLevelParameteriv( GL_TEXTURE_2D, 0, GL_TEXTURE_BORDER, &border );
+ glGetTexLevelParameteriv( GL_TEXTURE_2D, 0, GL_TEXTURE_INTERNAL_FORMAT, &format );
+ glGetTexLevelParameteriv( GL_TEXTURE_2D, 0, GL_TEXTURE_RED_SIZE, &redSize );
+ glGetTexLevelParameteriv( GL_TEXTURE_2D, 0, GL_TEXTURE_GREEN_SIZE, &greenSize );
+ glGetTexLevelParameteriv( GL_TEXTURE_2D, 0, GL_TEXTURE_BLUE_SIZE, &blueSize );
+ glGetTexLevelParameteriv( GL_TEXTURE_2D, 0, GL_TEXTURE_ALPHA_SIZE, &alphaSize );
+ glGetTexLevelParameteriv( GL_TEXTURE_2D, 0, GL_TEXTURE_LUMINANCE_SIZE, &luminanceSize );
+ glGetTexLevelParameteriv( GL_TEXTURE_2D, 0, GL_TEXTURE_INTENSITY_SIZE, &intensitySize );
+
+ begin2D( w, h );
+ sprintf( buf, "dimensions: %d x %d", width, height );
+ drawStringOutline( buf, 15, h / 2 + 20, labelLevelColor0, labelLevelColor1 );
+
+ sprintf( buf, "border: %d", border );
+ drawStringOutline( buf, 15, h / 2 + 10, labelLevelColor0, labelLevelColor1 );
+
+ sprintf( buf, "internal format:" );
+ drawStringOutline( buf, 15, h / 2, labelLevelColor0, labelLevelColor1 );
+
+ sprintf( buf, " %s", lookupFormat( format ) );
+ drawStringOutline( buf, 15, h / 2 - 10, labelLevelColor0, labelLevelColor1 );
+
+ sprintf( buf, "sizes:" );
+ drawStringOutline( buf, 15, h / 2 - 20, labelLevelColor0, labelLevelColor1 );
+
+ sprintf( buf, " %d / %d / %d / %d / %d / %d",
+ redSize, greenSize, blueSize, alphaSize,
+ luminanceSize, intensitySize );
+ drawStringOutline( buf, 15, h / 2 - 30, labelLevelColor0, labelLevelColor1 );
+
+ end2D();
+ }
+}
+
+static void display( void )
+{
+ int numX = NUM_ENV_MODES, numY = NUM_BASE_FORMATS;
+ float xBase = (float) winWidth * 0.01;
+ float xOffset = (winWidth - xBase) / numX;
+ float xSize = max( xOffset - xBase, 1 );
+ float yBase = (float) winHeight * 0.01;
+ float yOffset = (winHeight - yBase) / numY;
+ float ySize = max( yOffset - yBase, 1 );
+ float x, y;
+ int i, j;
+
+ glViewport( 0, 0, winWidth, winHeight );
+ glDisable( GL_SCISSOR_TEST );
+ glClearColor( 0.0, 0.0, 0.0, 0.0 );
+ glClear( GL_COLOR_BUFFER_BIT );
+ glEnable( GL_SCISSOR_TEST );
+
+ x = xBase;
+ y = (winHeight - 1) - yOffset;
+
+ for ( i = 0 ; i < NUM_BASE_FORMATS ; i++ )
+ {
+ struct formatInfo *format;
+
+ if ( i == baseFormat ) {
+ labelInfoColor = labelColor1;
+ } else {
+ labelInfoColor = labelColor0;
+ }
+
+ format = &baseFormats[i].format[baseFormats[i].current];
+
+ for ( j = 0 ; j < NUM_ENV_MODES ; j++ ) {
+ struct envModeInfo *envMode;
+
+ envMode = &envModes[j];
+ drawSample( x, y, xSize, ySize, format, envMode );
+ x += xOffset;
+ }
+
+ x = xBase;
+ y -= yOffset;
+ }
+
+ if ( doubleBuffered ) {
+ glutSwapBuffers();
+ } else {
+ glFlush();
+ }
+
+ checkErrors();
+}
+
+static void usage( char *name )
+{
+ fprintf( stderr, "usage: %s [ options ]\n", name );
+ fprintf( stderr, "\n" );
+ fprintf( stderr, "options:\n" );
+ fprintf( stderr, " -sb single buffered\n" );
+ fprintf( stderr, " -db double buffered\n" );
+ fprintf( stderr, " -info print OpenGL driver info\n" );
+}
+
+static void instructions( void )
+{
+ fprintf( stderr, "texenv - texture environment and internal format test\n" );
+ fprintf( stderr, "\n" );
+ fprintf( stderr, " [c] - cycle through background colors\n" );
+ fprintf( stderr, " [g] - toggle background\n" );
+ fprintf( stderr, " [b] - toggle blend\n" );
+ fprintf( stderr, " [s] - toggle smooth shading\n" );
+ fprintf( stderr, " [t] - toggle texturing\n" );
+ fprintf( stderr, " [i] - toggle information display\n" );
+ fprintf( stderr, " up/down - select row\n" );
+ fprintf( stderr, " left/right - change row's internal format\n" );
+}
+
+int main( int argc, char *argv[] )
+{
+ GLboolean info = GL_FALSE;
+ int i;
+
+ glutInit( &argc, argv );
+
+ for ( i = 1 ; i < argc ; i++ ) {
+ if ( !strcmp( "-sb", argv[i] ) ) {
+ doubleBuffered = GL_FALSE;
+ } else if ( !strcmp( "-db", argv[i] ) ) {
+ doubleBuffered = GL_TRUE;
+ } else if ( !strcmp( "-info", argv[i] ) ) {
+ info = GL_TRUE;
+ } else {
+ usage( argv[0] );
+ exit( 1 );
+ }
+ }
+
+ if ( doubleBuffered ) {
+ glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE );
+ } else {
+ glutInitDisplayMode( GLUT_RGB | GLUT_SINGLE );
+ }
+
+ glutInitWindowSize( winWidth, winHeight );
+ glutInitWindowPosition( 0, 0 );
+ glutCreateWindow( "Texture Environment Test" );
+
+ initialize();
+ instructions();
+
+ if ( info ) {
+ printf( "\n" );
+ printf( "GL_RENDERER = %s\n", (char *) glGetString( GL_RENDERER ) );
+ printf( "GL_VERSION = %s\n", (char *) glGetString( GL_VERSION ) );
+ printf( "GL_VENDOR = %s\n", (char *) glGetString( GL_VENDOR ) ) ;
+ printf( "GL_EXTENSIONS = %s\n", (char *) glGetString( GL_EXTENSIONS ) );
+ }
+
+#if GL_EXT_texture_env_add
+ if ( !glutExtensionSupported( "GL_EXT_texture_env_add" ) ) {
+ fprintf( stderr, "missing extension: GL_EXT_texture_env_add\n" );
+ NUM_ENV_MODES--;
+ }
+#endif
+
+ glutDisplayFunc( display );
+ glutReshapeFunc( reshape );
+ glutKeyboardFunc( keyboard );
+ glutSpecialFunc( special );
+ glutMainLoop();
+
+ return 0;
+}
diff --git a/progs/demos/texobj.c b/progs/demos/texobj.c
new file mode 100644
index 00000000000..40bce6e5695
--- /dev/null
+++ b/progs/demos/texobj.c
@@ -0,0 +1,284 @@
+
+/*
+ * Example of using the 1.1 texture object functions.
+ * Also, this demo utilizes Mesa's fast texture map path.
+ *
+ * Brian Paul June 1996 This file is in the public domain.
+ */
+
+#include <assert.h>
+#include <math.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "GL/glut.h"
+
+static GLuint Window = 0;
+
+static GLuint TexObj[2];
+static GLfloat Angle = 0.0f;
+static GLboolean UseObj = GL_FALSE;
+
+
+#if defined(GL_VERSION_1_1) || defined(GL_VERSION_1_2)
+# define TEXTURE_OBJECT 1
+#elif defined(GL_EXT_texture_object)
+# define TEXTURE_OBJECT 1
+# define glBindTexture(A,B) glBindTextureEXT(A,B)
+# define glGenTextures(A,B) glGenTexturesEXT(A,B)
+# define glDeleteTextures(A,B) glDeleteTexturesEXT(A,B)
+#endif
+
+
+
+
+static void draw( void )
+{
+ glClear( GL_COLOR_BUFFER_BIT );
+
+ glColor3f( 1.0, 1.0, 1.0 );
+
+ /* draw first polygon */
+ glPushMatrix();
+ glTranslatef( -1.0, 0.0, 0.0 );
+ glRotatef( Angle, 0.0, 0.0, 1.0 );
+ if (UseObj) {
+#ifdef TEXTURE_OBJECT
+ glBindTexture( GL_TEXTURE_2D, TexObj[0] );
+#endif
+ }
+ else {
+ glCallList( TexObj[0] );
+ }
+ glBegin( GL_POLYGON );
+ glTexCoord2f( 0.0, 0.0 ); glVertex2f( -1.0, -1.0 );
+ glTexCoord2f( 1.0, 0.0 ); glVertex2f( 1.0, -1.0 );
+ glTexCoord2f( 1.0, 1.0 ); glVertex2f( 1.0, 1.0 );
+ glTexCoord2f( 0.0, 1.0 ); glVertex2f( -1.0, 1.0 );
+ glEnd();
+ glPopMatrix();
+
+ /* draw second polygon */
+ glPushMatrix();
+ glTranslatef( 1.0, 0.0, 0.0 );
+ glRotatef( Angle-90.0, 0.0, 1.0, 0.0 );
+ if (UseObj) {
+#ifdef TEXTURE_OBJECT
+ glBindTexture( GL_TEXTURE_2D, TexObj[1] );
+#endif
+ }
+ else {
+ glCallList( TexObj[1] );
+ }
+ glBegin( GL_POLYGON );
+ glTexCoord2f( 0.0, 0.0 ); glVertex2f( -1.0, -1.0 );
+ glTexCoord2f( 1.0, 0.0 ); glVertex2f( 1.0, -1.0 );
+ glTexCoord2f( 1.0, 1.0 ); glVertex2f( 1.0, 1.0 );
+ glTexCoord2f( 0.0, 1.0 ); glVertex2f( -1.0, 1.0 );
+ glEnd();
+ glPopMatrix();
+
+ glutSwapBuffers();
+}
+
+
+
+static void idle( void )
+{
+ static double t0 = -1.;
+ double dt, t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
+ if (t0 < 0.0)
+ t0 = t;
+ dt = t - t0;
+ t0 = t;
+ Angle += 120.0*dt;
+ glutPostRedisplay();
+}
+
+
+
+/* change view Angle, exit upon ESC */
+static void key(unsigned char k, int x, int y)
+{
+ (void) x;
+ (void) y;
+ switch (k) {
+ case 27:
+#ifdef TEXTURE_OBJECT
+ glDeleteTextures( 2, TexObj );
+#endif
+ glutDestroyWindow(Window);
+ exit(0);
+ }
+}
+
+
+
+/* new window size or exposure */
+static void reshape( int width, int height )
+{
+ glViewport(0, 0, (GLint)width, (GLint)height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ /* glOrtho( -3.0, 3.0, -3.0, 3.0, -10.0, 10.0 );*/
+ glFrustum( -2.0, 2.0, -2.0, 2.0, 6.0, 20.0 );
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glTranslatef( 0.0, 0.0, -8.0 );
+}
+
+
+static void init( void )
+{
+ static int width=8, height=8;
+ static GLubyte tex1[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 1, 1, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 0, 1, 0, 0, 0,
+ 0, 0, 0, 1, 1, 1, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0 };
+
+ static GLubyte tex2[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 2, 2, 0, 0, 0,
+ 0, 0, 2, 0, 0, 2, 0, 0,
+ 0, 0, 0, 0, 0, 2, 0, 0,
+ 0, 0, 0, 0, 2, 0, 0, 0,
+ 0, 0, 0, 2, 0, 0, 0, 0,
+ 0, 0, 2, 2, 2, 2, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0 };
+
+ GLubyte tex[64][3];
+ GLint i, j;
+
+
+ glDisable( GL_DITHER );
+
+ /* Setup texturing */
+ glEnable( GL_TEXTURE_2D );
+ glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL );
+ glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST );
+
+
+ /* generate texture object IDs */
+ if (UseObj) {
+#ifdef TEXTURE_OBJECT
+ glGenTextures( 2, TexObj );
+#endif
+ }
+ else {
+ TexObj[0] = glGenLists(2);
+ TexObj[1] = TexObj[0]+1;
+ }
+
+ /* setup first texture object */
+ if (UseObj) {
+#ifdef TEXTURE_OBJECT
+ glBindTexture( GL_TEXTURE_2D, TexObj[0] );
+ assert(glIsTexture(TexObj[0]));
+#endif
+ }
+ else {
+ glNewList( TexObj[0], GL_COMPILE );
+ }
+ /* red on white */
+ for (i=0;i<height;i++) {
+ for (j=0;j<width;j++) {
+ int p = i*width+j;
+ if (tex1[(height-i-1)*width+j]) {
+ tex[p][0] = 255; tex[p][1] = 0; tex[p][2] = 0;
+ }
+ else {
+ tex[p][0] = 255; tex[p][1] = 255; tex[p][2] = 255;
+ }
+ }
+ }
+
+ glTexImage2D( GL_TEXTURE_2D, 0, 3, width, height, 0,
+ GL_RGB, GL_UNSIGNED_BYTE, tex );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
+ if (!UseObj) {
+ glEndList();
+ }
+ /* end of texture object */
+
+ /* setup second texture object */
+ if (UseObj) {
+#ifdef TEXTURE_OBJECT
+ glBindTexture( GL_TEXTURE_2D, TexObj[1] );
+ assert(glIsTexture(TexObj[1]));
+#endif
+ assert(!glIsTexture(TexObj[1] + 999));
+ }
+ else {
+ glNewList( TexObj[1], GL_COMPILE );
+ }
+ /* green on blue */
+ for (i=0;i<height;i++) {
+ for (j=0;j<width;j++) {
+ int p = i*width+j;
+ if (tex2[(height-i-1)*width+j]) {
+ tex[p][0] = 0; tex[p][1] = 255; tex[p][2] = 0;
+ }
+ else {
+ tex[p][0] = 0; tex[p][1] = 0; tex[p][2] = 255;
+ }
+ }
+ }
+ glTexImage2D( GL_TEXTURE_2D, 0, 3, width, height, 0,
+ GL_RGB, GL_UNSIGNED_BYTE, tex );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
+ if (!UseObj) {
+ glEndList();
+ }
+ /* end texture object */
+
+}
+
+
+
+int main( int argc, char *argv[] )
+{
+ glutInit(&argc, argv);
+ glutInitWindowPosition(0, 0);
+ glutInitWindowSize(300, 300);
+ glutInitDisplayMode( GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE );
+
+ Window = glutCreateWindow("Texture Objects");
+ if (!Window) {
+ exit(1);
+ }
+
+ /* check that renderer has the GL_EXT_texture_object extension
+ * or supports OpenGL 1.1
+ */
+#ifdef TEXTURE_OBJECT
+ {
+ char *exten = (char *) glGetString( GL_EXTENSIONS );
+ char *version = (char *) glGetString( GL_VERSION );
+ if ( strstr( exten, "GL_EXT_texture_object" )
+ || strncmp( version, "1.1", 3 )==0
+ || strncmp( version, "1.2", 3 )==0 ) {
+ UseObj = GL_TRUE;
+ }
+ }
+#endif
+
+ init();
+
+ glutReshapeFunc( reshape );
+ glutKeyboardFunc( key );
+ glutIdleFunc( idle );
+ glutDisplayFunc( draw );
+ glutMainLoop();
+ return 0;
+}
diff --git a/progs/demos/trispd.c b/progs/demos/trispd.c
new file mode 100644
index 00000000000..165d088e3d3
--- /dev/null
+++ b/progs/demos/trispd.c
@@ -0,0 +1,253 @@
+
+/*
+ * Simple GLUT program to measure triangle strip rendering speed.
+ * Brian Paul February 15, 1997 This file is in the public domain.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <string.h>
+#include <GL/glut.h>
+
+
+static float MinPeriod = 2.0; /* 2 seconds */
+static float Width = 400.0;
+static float Height = 400.0;
+static int Loops = 1;
+static int Size = 50;
+static int Texture = 0;
+
+
+
+static void Idle( void )
+{
+ glutPostRedisplay();
+}
+
+
+static void Display( void )
+{
+ float x, y;
+ float xStep;
+ float yStep;
+ double t0, t1;
+ double triRate;
+ double pixelRate;
+ int triCount;
+ int i;
+ float red[3] = { 1.0, 0.0, 0.0 };
+ float blue[3] = { 0.0, 0.0, 1.0 };
+
+ xStep = yStep = sqrt( 2.0 * Size );
+
+ glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+
+ triCount = 0;
+ t0 = glutGet(GLUT_ELAPSED_TIME) * 0.001;
+ if (Texture) {
+ float uStep = xStep / Width;
+ float vStep = yStep / Height;
+ float u, v;
+ for (i=0; i<Loops; i++) {
+ for (y=1.0, v=0.0f; y<Height-yStep; y+=yStep, v+=vStep) {
+ glBegin(GL_TRIANGLE_STRIP);
+ for (x=1.0, u=0.0f; x<Width; x+=xStep, u+=uStep) {
+ glColor3fv(red);
+ glTexCoord2f(u, v);
+ glVertex2f(x, y);
+ glColor3fv(blue);
+ glTexCoord2f(u, v+vStep);
+ glVertex2f(x, y+yStep);
+ triCount += 2;
+ }
+ glEnd();
+ triCount -= 2;
+ }
+ }
+ }
+ else {
+ for (i=0; i<Loops; i++) {
+ for (y=1.0; y<Height-yStep; y+=yStep) {
+ glBegin(GL_TRIANGLE_STRIP);
+ for (x=1.0; x<Width; x+=xStep) {
+ glColor3fv(red);
+ glVertex2f(x, y);
+ glColor3fv(blue);
+ glVertex2f(x, y+yStep);
+ triCount += 2;
+ }
+ glEnd();
+ triCount -= 2;
+ }
+ }
+ }
+ glFinish();
+ t1 = glutGet(GLUT_ELAPSED_TIME) * 0.001;
+
+ if (t1-t0 < MinPeriod) {
+ /* Next time draw more triangles to get longer elapsed time */
+ Loops *= 2;
+ return;
+ }
+
+ triRate = triCount / (t1-t0);
+ pixelRate = triRate * Size;
+ printf("Rate: %d tri in %gs = %g tri/s %d pixels/s\n",
+ triCount, t1-t0, triRate, (int)pixelRate);
+
+ glutSwapBuffers();
+}
+
+
+static void Reshape( int width, int height )
+{
+ Width = width;
+ Height = height;
+ glViewport( 0, 0, width, height );
+ glMatrixMode( GL_PROJECTION );
+ glLoadIdentity();
+ glOrtho(0.0, width, 0.0, height, -1.0, 1.0);
+ glMatrixMode( GL_MODELVIEW );
+ glLoadIdentity();
+}
+
+
+static void Key( unsigned char key, int x, int y )
+{
+ (void) x;
+ (void) y;
+ switch (key) {
+ case 27:
+ exit(0);
+ break;
+ }
+ glutPostRedisplay();
+}
+
+
+static void LoadTex(int comp, int filter)
+{
+ GLubyte *pixels;
+ int x, y;
+ pixels = (GLubyte *) malloc(4*256*256);
+ for (y = 0; y < 256; ++y)
+ for (x = 0; x < 256; ++x) {
+ pixels[(y*256+x)*4+0] = (int)(128.5 + 127.0 * cos(0.024544 * x));
+ pixels[(y*256+x)*4+1] = 255;
+ pixels[(y*256+x)*4+2] = (int)(128.5 + 127.0 * cos(0.024544 * y));
+ pixels[(y*256+x)*4+3] = 255;
+ }
+ glEnable(GL_TEXTURE_2D);
+ glTexImage2D(GL_TEXTURE_2D, 0, comp, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filter);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filter);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+ printf("Texture: GL_MODULATE, %d comps, %s\n", comp, filter == GL_NEAREST ? "GL_NEAREST" : "GL_LINEAR");
+}
+
+
+static void Init( int argc, char *argv[] )
+{
+ GLint shade;
+ GLint rBits, gBits, bBits;
+ int filter = GL_NEAREST, comp = 3;
+
+ int i;
+ for (i=1; i<argc; i++) {
+ if (strcmp(argv[i],"-dither")==0)
+ glDisable(GL_DITHER);
+ else if (strcmp(argv[i],"+dither")==0)
+ glEnable(GL_DITHER);
+ else if (strcmp(argv[i],"+smooth")==0)
+ glShadeModel(GL_SMOOTH);
+ else if (strcmp(argv[i],"+flat")==0)
+ glShadeModel(GL_FLAT);
+ else if (strcmp(argv[i],"+depth")==0)
+ glEnable(GL_DEPTH_TEST);
+ else if (strcmp(argv[i],"-depth")==0)
+ glDisable(GL_DEPTH_TEST);
+ else if (strcmp(argv[i],"-size")==0) {
+ Size = atoi(argv[i+1]);
+ i++;
+ }
+ else if (strcmp(argv[i],"-texture")==0)
+ Texture = 0;
+ else if (strcmp(argv[i],"+texture")==0)
+ Texture = 1;
+ else if (strcmp(argv[i],"-linear")==0)
+ filter = GL_NEAREST;
+ else if (strcmp(argv[i],"+linear")==0)
+ filter = GL_LINEAR;
+ else if (strcmp(argv[i],"-persp")==0)
+ glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
+ else if (strcmp(argv[i],"+persp")==0)
+ glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
+ else if (strcmp(argv[i],"-comp")==0) {
+ comp = atoi(argv[i+1]);
+ i++;
+ }
+ else
+ printf("Unknown option: %s\n", argv[i]);
+ }
+
+ glGetIntegerv(GL_SHADE_MODEL, &shade);
+
+ printf("Dither: %s\n", glIsEnabled(GL_DITHER) ? "on" : "off");
+ printf("ShadeModel: %s\n", (shade==GL_FLAT) ? "flat" : "smooth");
+ printf("DepthTest: %s\n", glIsEnabled(GL_DEPTH_TEST) ? "on" : "off");
+ printf("Size: %d pixels\n", Size);
+
+ if (Texture)
+ LoadTex(comp, filter);
+
+ glGetIntegerv(GL_RED_BITS, &rBits);
+ glGetIntegerv(GL_GREEN_BITS, &gBits);
+ glGetIntegerv(GL_BLUE_BITS, &bBits);
+ printf("RedBits: %d GreenBits: %d BlueBits: %d\n", rBits, gBits, bBits);
+}
+
+
+static void Help( const char *program )
+{
+ printf("%s options:\n", program);
+ printf(" +/-dither enable/disable dithering\n");
+ printf(" +/-depth enable/disable depth test\n");
+ printf(" +flat flat shading\n");
+ printf(" +smooth smooth shading\n");
+ printf(" -size pixels specify pixels/triangle\n");
+ printf(" +/-texture enable/disable texture\n");
+ printf(" -comp n texture format\n");
+ printf(" +/-linear bilinear texture filter\n");
+ printf(" +/-persp perspective correction hint\n");
+}
+
+
+int main( int argc, char *argv[] )
+{
+ printf("For options: %s -help\n", argv[0]);
+ glutInit( &argc, argv );
+ glutInitWindowSize( (int) Width, (int) Height );
+ glutInitWindowPosition( 0, 0 );
+
+ glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH );
+
+ glutCreateWindow( argv[0] );
+
+ if (argc==2 && strcmp(argv[1],"-help")==0) {
+ Help(argv[0]);
+ return 0;
+ }
+
+ Init( argc, argv );
+
+ glutReshapeFunc( Reshape );
+ glutKeyboardFunc( Key );
+ glutDisplayFunc( Display );
+ glutIdleFunc( Idle );
+
+ glutMainLoop();
+ return 0;
+}
diff --git a/progs/demos/tunnel.c b/progs/demos/tunnel.c
new file mode 100644
index 00000000000..6a240580e8a
--- /dev/null
+++ b/progs/demos/tunnel.c
@@ -0,0 +1,535 @@
+/*
+ * This program is under the GNU GPL.
+ * Use at your own risk.
+ *
+ * written by David Bucciarelli ([email protected])
+ * Humanware s.r.l.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <string.h>
+
+#ifdef WIN32
+#include <windows.h>
+#endif
+
+#include <GL/glut.h>
+#include "readtex.h"
+#include "tunneldat.h"
+
+#ifdef XMESA
+#include "GL/xmesa.h"
+static int fullscreen = 1;
+#endif
+
+static int WIDTH = 640;
+static int HEIGHT = 480;
+
+static GLint T0 = 0;
+static GLint Frames = 0;
+static GLint NiceFog = 1;
+
+#define NUMBLOC 5
+
+#ifndef M_PI
+#define M_PI 3.1415926535
+#endif
+
+/*
+extern int striplength_skin_13[];
+extern float stripdata_skin_13[];
+
+extern int striplength_skin_12[];
+extern float stripdata_skin_12[];
+
+extern int striplength_skin_11[];
+extern float stripdata_skin_11[];
+
+extern int striplength_skin_9[];
+extern float stripdata_skin_9[];
+*/
+
+static int win = 0;
+
+static float obs[3] = { 1000.0, 0.0, 2.0 };
+static float dir[3];
+static float v = 30.;
+static float alpha = 90.0;
+static float beta = 90.0;
+
+static int fog = 1;
+static int bfcull = 1;
+static int usetex = 1;
+static int cstrip = 0;
+static int help = 1;
+static int joyavailable = 0;
+static int joyactive = 0;
+
+static GLuint t1id, t2id;
+
+static void
+inittextures(void)
+{
+ glGenTextures(1, &t1id);
+ glBindTexture(GL_TEXTURE_2D, t1id);
+
+ if (!LoadRGBMipmaps("../images/tile.rgb", GL_RGB)) {
+ fprintf(stderr, "Error reading a texture.\n");
+ exit(-1);
+ }
+
+ 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_MIN_FILTER,
+ GL_LINEAR_MIPMAP_NEAREST);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+
+ glGenTextures(1, &t2id);
+ glBindTexture(GL_TEXTURE_2D, t2id);
+
+ if (!LoadRGBMipmaps("../images/bw.rgb", GL_RGB)) {
+ fprintf(stderr, "Error reading a texture.\n");
+ exit(-1);
+ }
+
+ 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_MIN_FILTER,
+ GL_LINEAR_MIPMAP_LINEAR);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+}
+
+static void
+drawobjs(const int *l, const float *f)
+{
+ int mend, j;
+
+ if (cstrip) {
+ float r = 0.33, g = 0.33, b = 0.33;
+
+ for (; (*l) != 0;) {
+ mend = *l++;
+
+ r += 0.33;
+ if (r > 1.0) {
+ r = 0.33;
+ g += 0.33;
+ if (g > 1.0) {
+ g = 0.33;
+ b += 0.33;
+ if (b > 1.0)
+ b = 0.33;
+ }
+ }
+
+ glColor3f(r, g, b);
+ glBegin(GL_TRIANGLE_STRIP);
+ for (j = 0; j < mend; j++) {
+ f += 4;
+ glTexCoord2fv(f);
+ f += 2;
+ glVertex3fv(f);
+ f += 3;
+ }
+ glEnd();
+ }
+ }
+ else
+ for (; (*l) != 0;) {
+ mend = *l++;
+
+ glBegin(GL_TRIANGLE_STRIP);
+ for (j = 0; j < mend; j++) {
+ glColor4fv(f);
+ f += 4;
+ glTexCoord2fv(f);
+ f += 2;
+ glVertex3fv(f);
+ f += 3;
+ }
+ glEnd();
+ }
+}
+
+static void
+calcposobs(void)
+{
+ static double t0 = -1.;
+ double dt, t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
+ if (t0 < 0.0)
+ t0 = t;
+ dt = t - t0;
+ t0 = t;
+
+ dir[0] = sin(alpha * M_PI / 180.0);
+ dir[1] = cos(alpha * M_PI / 180.0) * sin(beta * M_PI / 180.0);
+ dir[2] = cos(beta * M_PI / 180.0);
+
+ if (dir[0] < 1.0e-5 && dir[0] > -1.0e-5)
+ dir[0] = 0;
+ if (dir[1] < 1.0e-5 && dir[1] > -1.0e-5)
+ dir[1] = 0;
+ if (dir[2] < 1.0e-5 && dir[2] > -1.0e-5)
+ dir[2] = 0;
+
+ obs[0] += v * dir[0] * dt;
+ obs[1] += v * dir[1] * dt;
+ obs[2] += v * dir[2] * dt;
+}
+
+static void
+special(int k, int x, int y)
+{
+ switch (k) {
+ case GLUT_KEY_LEFT:
+ alpha -= 2.0;
+ break;
+ case GLUT_KEY_RIGHT:
+ alpha += 2.0;
+ break;
+ case GLUT_KEY_DOWN:
+ beta -= 2.0;
+ break;
+ case GLUT_KEY_UP:
+ beta += 2.0;
+ break;
+ }
+}
+
+static void
+key(unsigned char k, int x, int y)
+{
+ switch (k) {
+ case 27:
+ exit(0);
+ break;
+
+ case 'a':
+ v += 5.;
+ break;
+ case 'z':
+ v -= 5.;
+ break;
+
+#ifdef XMESA
+ case ' ':
+ fullscreen = (!fullscreen);
+ XMesaSetFXmode(fullscreen ? XMESA_FX_FULLSCREEN : XMESA_FX_WINDOW);
+ break;
+#endif
+ case 'j':
+ joyactive = (!joyactive);
+ break;
+ case 'h':
+ help = (!help);
+ break;
+ case 'f':
+ fog = (!fog);
+ break;
+ case 't':
+ usetex = (!usetex);
+ break;
+ case 'b':
+ if (bfcull) {
+ glDisable(GL_CULL_FACE);
+ bfcull = 0;
+ }
+ else {
+ glEnable(GL_CULL_FACE);
+ bfcull = 1;
+ }
+ break;
+ case 'm':
+ cstrip = (!cstrip);
+ break;
+
+ case 'd':
+ fprintf(stderr, "Deleting textures...\n");
+ glDeleteTextures(1, &t1id);
+ glDeleteTextures(1, &t2id);
+ fprintf(stderr, "Loading textures...\n");
+ inittextures();
+ fprintf(stderr, "Done.\n");
+ break;
+ case 'n':
+ NiceFog = !NiceFog;
+ printf("NiceFog %d\n", NiceFog);
+ break;
+ }
+ glutPostRedisplay();
+}
+
+static void
+reshape(int w, int h)
+{
+ WIDTH = w;
+ HEIGHT = h;
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(80.0, w / (float) h, 1.0, 50.0);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glViewport(0, 0, w, h);
+}
+
+static void
+printstring(void *font, char *string)
+{
+ int len, i;
+
+ len = (int) strlen(string);
+ for (i = 0; i < len; i++)
+ glutBitmapCharacter(font, string[i]);
+}
+
+static void
+printhelp(void)
+{
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glColor4f(0.0, 0.0, 0.0, 0.5);
+ glRecti(40, 40, 600, 440);
+
+ glColor3f(1.0, 0.0, 0.0);
+ glRasterPos2i(300, 420);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24, "Help");
+
+ glRasterPos2i(60, 390);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24, "h - Toggle Help");
+ glRasterPos2i(60, 360);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24, "t - Toggle Textures");
+ glRasterPos2i(60, 330);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24, "f - Toggle Fog");
+ glRasterPos2i(60, 300);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24, "m - Toggle strips");
+ glRasterPos2i(60, 270);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24, "b - Toggle Back face culling");
+ glRasterPos2i(60, 240);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24, "Arrow Keys - Rotate");
+ glRasterPos2i(60, 210);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24, "a - Increase velocity");
+ glRasterPos2i(60, 180);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24, "z - Decrease velocity");
+
+ glRasterPos2i(60, 150);
+ if (joyavailable)
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24,
+ "j - Toggle jostick control (Joystick control available)");
+ else
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24,
+ "(No Joystick control available)");
+}
+
+static void
+dojoy(void)
+{
+#ifdef WIN32
+ static UINT max[2] = { 0, 0 };
+ static UINT min[2] = { 0xffffffff, 0xffffffff }, center[2];
+ MMRESULT res;
+ JOYINFO joy;
+
+ res = joyGetPos(JOYSTICKID1, &joy);
+
+ if (res == JOYERR_NOERROR) {
+ joyavailable = 1;
+
+ if (max[0] < joy.wXpos)
+ max[0] = joy.wXpos;
+ if (min[0] > joy.wXpos)
+ min[0] = joy.wXpos;
+ center[0] = (max[0] + min[0]) / 2;
+
+ if (max[1] < joy.wYpos)
+ max[1] = joy.wYpos;
+ if (min[1] > joy.wYpos)
+ min[1] = joy.wYpos;
+ center[1] = (max[1] + min[1]) / 2;
+
+ if (joyactive) {
+ if (fabs(center[0] - (float) joy.wXpos) > 0.1 * (max[0] - min[0]))
+ alpha -=
+ 2.0 * (center[0] - (float) joy.wXpos) / (max[0] - min[0]);
+ if (fabs(center[1] - (float) joy.wYpos) > 0.1 * (max[1] - min[1]))
+ beta += 2.0 * (center[1] - (float) joy.wYpos) / (max[1] - min[1]);
+
+ if (joy.wButtons & JOY_BUTTON1)
+ v += 0.01;
+ if (joy.wButtons & JOY_BUTTON2)
+ v -= 0.01;
+ }
+ }
+ else
+ joyavailable = 0;
+#endif
+}
+
+static void
+draw(void)
+{
+ static char frbuf[80] = "";
+ int i;
+ float base, offset;
+
+ if (NiceFog)
+ glHint(GL_FOG_HINT, GL_NICEST);
+ else
+ glHint(GL_FOG_HINT, GL_DONT_CARE);
+
+ dojoy();
+
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ if (usetex)
+ glEnable(GL_TEXTURE_2D);
+ else
+ glDisable(GL_TEXTURE_2D);
+
+ if (fog)
+ glEnable(GL_FOG);
+ else
+ glDisable(GL_FOG);
+
+ glShadeModel(GL_SMOOTH);
+
+ glPushMatrix();
+ calcposobs();
+ gluLookAt(obs[0], obs[1], obs[2],
+ obs[0] + dir[0], obs[1] + dir[1], obs[2] + dir[2],
+ 0.0, 0.0, 1.0);
+
+ if (dir[0] > 0) {
+ offset = 8.0;
+ base = obs[0] - fmod(obs[0], 8.0);
+ }
+ else {
+ offset = -8.0;
+ base = obs[0] + (8.0 - fmod(obs[0], 8.0));
+ }
+
+ glPushMatrix();
+ glTranslatef(base - offset / 2.0, 0.0, 0.0);
+ for (i = 0; i < NUMBLOC; i++) {
+ glTranslatef(offset, 0.0, 0.0);
+ glBindTexture(GL_TEXTURE_2D, t1id);
+ drawobjs(striplength_skin_11, stripdata_skin_11);
+ glBindTexture(GL_TEXTURE_2D, t2id);
+ drawobjs(striplength_skin_12, stripdata_skin_12);
+ drawobjs(striplength_skin_9, stripdata_skin_9);
+ drawobjs(striplength_skin_13, stripdata_skin_13);
+ }
+ glPopMatrix();
+ glPopMatrix();
+
+ glDisable(GL_TEXTURE_2D);
+ glDisable(GL_FOG);
+ glShadeModel(GL_FLAT);
+
+ glMatrixMode(GL_PROJECTION);
+ glPushMatrix();
+ glLoadIdentity();
+ glOrtho(-0.5, 639.5, -0.5, 479.5, -1.0, 1.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ glColor3f(1.0, 0.0, 0.0);
+ glRasterPos2i(10, 10);
+ printstring(GLUT_BITMAP_HELVETICA_18, frbuf);
+ glRasterPos2i(350, 470);
+ printstring(GLUT_BITMAP_HELVETICA_10,
+ "Tunnel V1.5 Written by David Bucciarelli ([email protected])");
+
+ if (help)
+ printhelp();
+
+ glMatrixMode(GL_PROJECTION);
+ glPopMatrix();
+ glMatrixMode(GL_MODELVIEW);
+
+ glutSwapBuffers();
+
+ Frames++;
+ {
+ GLint t = glutGet(GLUT_ELAPSED_TIME);
+ if (t - T0 >= 2000) {
+ GLfloat seconds = (t - T0) / 1000.0;
+ GLfloat fps = Frames / seconds;
+ sprintf(frbuf, "Frame rate: %f", fps);
+ T0 = t;
+ Frames = 0;
+ }
+ }
+}
+
+static void
+idle(void)
+{
+ glutPostRedisplay();
+}
+
+
+
+int
+main(int ac, char **av)
+{
+ float fogcolor[4] = { 0.7, 0.7, 0.7, 1.0 };
+
+ fprintf(stderr,
+ "Tunnel V1.5\nWritten by David Bucciarelli ([email protected])\n");
+
+ glutInitWindowPosition(0, 0);
+ glutInitWindowSize(WIDTH, HEIGHT);
+ glutInit(&ac, av);
+
+ glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
+
+ if (!(win = glutCreateWindow("Tunnel"))) {
+ fprintf(stderr, "Error, couldn't open window\n");
+ return -1;
+ }
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(80.0, WIDTH / (float) HEIGHT, 1.0, 50.0);
+
+ glMatrixMode(GL_MODELVIEW);
+
+ glShadeModel(GL_SMOOTH);
+ glDisable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+ glEnable(GL_TEXTURE_2D);
+
+ glEnable(GL_FOG);
+ glFogi(GL_FOG_MODE, GL_EXP2);
+ glFogfv(GL_FOG_COLOR, fogcolor);
+
+ glFogf(GL_FOG_DENSITY, 0.06);
+ glHint(GL_FOG_HINT, GL_NICEST);
+
+ inittextures();
+
+ glClearColor(fogcolor[0], fogcolor[1], fogcolor[2], fogcolor[3]);
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ calcposobs();
+
+ glutReshapeFunc(reshape);
+ glutDisplayFunc(draw);
+ glutKeyboardFunc(key);
+ glutSpecialFunc(special);
+ glutIdleFunc(idle);
+
+ glEnable(GL_BLEND);
+ /*glBlendFunc(GL_SRC_ALPHA_SATURATE,GL_ONE); */
+ /*glEnable(GL_POLYGON_SMOOTH); */
+
+ glutMainLoop();
+
+ return 0;
+}
diff --git a/progs/demos/tunnel2.c b/progs/demos/tunnel2.c
new file mode 100644
index 00000000000..75a199af5d3
--- /dev/null
+++ b/progs/demos/tunnel2.c
@@ -0,0 +1,605 @@
+/*
+ * This program is under the GNU GPL.
+ * Use at your own risk.
+ *
+ * You need TWO Voodoo Graphics boards in order to run
+ * this demo !
+ *
+ * written by David Bucciarelli ([email protected])
+ * Humanware s.r.l.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <string.h>
+
+#ifdef WIN32
+#include <windows.h>
+#endif
+
+#include <GL/glut.h>
+#include "readtex.h"
+#include "tunneldat.h"
+
+#ifdef FX
+#endif
+
+#ifdef XMESA
+#include "GL/xmesa.h"
+static int fullscreen = 1;
+#endif
+
+#ifdef FX
+GLint fxMesaSelectCurrentBoard(int);
+#endif
+
+static int WIDTHC0 = 640;
+static int HEIGHTC0 = 480;
+
+static int WIDTHC1 = 640;
+static int HEIGHTC1 = 480;
+
+static GLint T0 = 0;
+static GLint Frames = 0;
+
+#define NUMBLOC 5
+
+#ifndef M_PI
+#define M_PI 3.1415926535
+#endif
+
+static float obs[3] = { 1000.0, 0.0, 2.0 };
+static float dir[3];
+static float v = 30.;
+static float alpha = 90.0;
+static float beta = 90.0;
+
+static int fog = 1;
+static int bfcull = 1;
+static int usetex = 1;
+static int cstrip = 0;
+static int help = 1;
+static int joyavailable = 0;
+static int joyactive = 0;
+
+static int channel[2];
+
+static GLuint t1id, t2id;
+
+static void
+inittextures(void)
+{
+ glGenTextures(1, &t1id);
+ glBindTexture(GL_TEXTURE_2D, t1id);
+
+ if (!LoadRGBMipmaps("../images/tile.rgb", GL_RGB)) {
+ fprintf(stderr, "Error reading a texture.\n");
+ exit(-1);
+ }
+
+ 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_MIN_FILTER,
+ GL_LINEAR_MIPMAP_NEAREST);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+
+ glGenTextures(1, &t2id);
+ glBindTexture(GL_TEXTURE_2D, t2id);
+
+ if (!LoadRGBMipmaps("../images/bw.rgb", GL_RGB)) {
+ fprintf(stderr, "Error reading a texture.\n");
+ exit(-1);
+ }
+
+ 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_MIN_FILTER,
+ GL_LINEAR_MIPMAP_LINEAR);
+ glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+
+ glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+}
+
+static void
+drawobjs(const int *l, const float *f)
+{
+ int mend, j;
+
+ if (cstrip) {
+ float r = 0.33, g = 0.33, b = 0.33;
+
+ for (; (*l) != 0;) {
+ mend = *l++;
+
+ r += 0.33;
+ if (r > 1.0) {
+ r = 0.33;
+ g += 0.33;
+ if (g > 1.0) {
+ g = 0.33;
+ b += 0.33;
+ if (b > 1.0)
+ b = 0.33;
+ }
+ }
+
+ glColor3f(r, g, b);
+ glBegin(GL_TRIANGLE_STRIP);
+ for (j = 0; j < mend; j++) {
+ f += 4;
+ glTexCoord2fv(f);
+ f += 2;
+ glVertex3fv(f);
+ f += 3;
+ }
+ glEnd();
+ }
+ }
+ else
+ for (; (*l) != 0;) {
+ mend = *l++;
+
+ glBegin(GL_TRIANGLE_STRIP);
+ for (j = 0; j < mend; j++) {
+ glColor4fv(f);
+ f += 4;
+ glTexCoord2fv(f);
+ f += 2;
+ glVertex3fv(f);
+ f += 3;
+ }
+ glEnd();
+ }
+}
+
+static void
+calcposobs(void)
+{
+ static double t0 = -1.;
+ double dt, t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
+ if (t0 < 0.0)
+ t0 = t;
+ dt = t - t0;
+ t0 = t;
+
+ dir[0] = sin(alpha * M_PI / 180.0);
+ dir[1] = cos(alpha * M_PI / 180.0) * sin(beta * M_PI / 180.0);
+ dir[2] = cos(beta * M_PI / 180.0);
+
+ if (dir[0] < 1.0e-5 && dir[0] > -1.0e-5)
+ dir[0] = 0;
+ if (dir[1] < 1.0e-5 && dir[1] > -1.0e-5)
+ dir[1] = 0;
+ if (dir[2] < 1.0e-5 && dir[2] > -1.0e-5)
+ dir[2] = 0;
+
+ obs[0] += v * dir[0] * dt;
+ obs[1] += v * dir[1] * dt;
+ obs[2] += v * dir[2] * dt;
+}
+
+static void
+special(int k, int x, int y)
+{
+ switch (k) {
+ case GLUT_KEY_LEFT:
+ alpha -= 2.0;
+ break;
+ case GLUT_KEY_RIGHT:
+ alpha += 2.0;
+ break;
+ case GLUT_KEY_DOWN:
+ beta -= 2.0;
+ break;
+ case GLUT_KEY_UP:
+ beta += 2.0;
+ break;
+ }
+}
+
+static void
+key(unsigned char k, int x, int y)
+{
+ switch (k) {
+ case 27:
+ exit(0);
+ break;
+
+ case 'a':
+ v += 5.;
+ break;
+ case 'z':
+ v -= 5.;
+ break;
+
+#ifdef XMESA
+ case ' ':
+ fullscreen = (!fullscreen);
+
+ glutSetWindow(channel[0]);
+ XMesaSetFXmode(fullscreen ? XMESA_FX_FULLSCREEN : XMESA_FX_WINDOW);
+
+ glutSetWindow(channel[1]);
+ XMesaSetFXmode(fullscreen ? XMESA_FX_FULLSCREEN : XMESA_FX_WINDOW);
+ break;
+#endif
+
+ case 'j':
+ joyactive = (!joyactive);
+ break;
+ case 'h':
+ help = (!help);
+ break;
+ case 'f':
+ fog = (!fog);
+ break;
+ case 't':
+ usetex = (!usetex);
+ break;
+ case 'b':
+ if (bfcull) {
+ glDisable(GL_CULL_FACE);
+ bfcull = 0;
+ }
+ else {
+ glEnable(GL_CULL_FACE);
+ bfcull = 1;
+ }
+ break;
+ case 'm':
+ cstrip = (!cstrip);
+ break;
+
+ case 'd':
+ fprintf(stderr, "Deleting textures...\n");
+ glDeleteTextures(1, &t1id);
+ glDeleteTextures(1, &t2id);
+ fprintf(stderr, "Loading textures...\n");
+ inittextures();
+ fprintf(stderr, "Done.\n");
+ break;
+ }
+}
+
+static void
+reshapechannel0(int w, int h)
+{
+ float ratio;
+
+ WIDTHC0 = w;
+ HEIGHTC0 = h;
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+
+ ratio = 0.5f * w / (float) h;
+
+ glFrustum(-2.0, 0.0, -1.0 * ratio, 1.0 * ratio, 1.0, 60.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glViewport(0, 0, w, h);
+}
+
+static void
+reshapechannel1(int w, int h)
+{
+ float ratio;
+
+ WIDTHC1 = w;
+ HEIGHTC1 = h;
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+
+ ratio = 0.5f * w / (float) h;
+
+ glFrustum(0.0, 2.0, -1.0 * ratio, 1.0 * ratio, 1.0, 60.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glViewport(0, 0, w, h);
+}
+
+static void
+printstring(void *font, char *string)
+{
+ int len, i;
+
+ len = (int) strlen(string);
+ for (i = 0; i < len; i++)
+ glutBitmapCharacter(font, string[i]);
+}
+
+static void
+printhelp(void)
+{
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glColor4f(0.0, 0.0, 0.0, 0.5);
+ glRecti(40, 40, 600, 440);
+
+ glColor3f(1.0, 0.0, 0.0);
+ glRasterPos2i(300, 420);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24, "Help");
+
+ glRasterPos2i(60, 390);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24, "h - Toggle Help");
+ glRasterPos2i(60, 360);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24, "t - Toggle Textures");
+ glRasterPos2i(60, 330);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24, "f - Toggle Fog");
+ glRasterPos2i(60, 300);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24, "m - Toggle strips");
+ glRasterPos2i(60, 270);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24, "b - Toggle Back face culling");
+ glRasterPos2i(60, 240);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24, "Arrow Keys - Rotate");
+ glRasterPos2i(60, 210);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24, "a - Increase velocity");
+ glRasterPos2i(60, 180);
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24, "z - Decrease velocity");
+
+ glRasterPos2i(60, 150);
+ if (joyavailable)
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24,
+ "j - Toggle jostick control (Joystick control available)");
+ else
+ printstring(GLUT_BITMAP_TIMES_ROMAN_24,
+ "(No Joystick control available)");
+}
+
+static void
+dojoy(void)
+{
+#ifdef WIN32
+ static UINT max[2] = { 0, 0 };
+ static UINT min[2] = { 0xffffffff, 0xffffffff }, center[2];
+ MMRESULT res;
+ JOYINFO joy;
+
+ res = joyGetPos(JOYSTICKID1, &joy);
+
+ if (res == JOYERR_NOERROR) {
+ joyavailable = 1;
+
+ if (max[0] < joy.wXpos)
+ max[0] = joy.wXpos;
+ if (min[0] > joy.wXpos)
+ min[0] = joy.wXpos;
+ center[0] = (max[0] + min[0]) / 2;
+
+ if (max[1] < joy.wYpos)
+ max[1] = joy.wYpos;
+ if (min[1] > joy.wYpos)
+ min[1] = joy.wYpos;
+ center[1] = (max[1] + min[1]) / 2;
+
+ if (joyactive) {
+ if (fabs(center[0] - (float) joy.wXpos) > 0.1 * (max[0] - min[0]))
+ alpha -=
+ 2.0 * (center[0] - (float) joy.wXpos) / (max[0] - min[0]);
+ if (fabs(center[1] - (float) joy.wYpos) > 0.1 * (max[1] - min[1]))
+ beta += 2.0 * (center[1] - (float) joy.wYpos) / (max[1] - min[1]);
+
+ if (joy.wButtons & JOY_BUTTON1)
+ v += 0.01;
+ if (joy.wButtons & JOY_BUTTON2)
+ v -= 0.01;
+ }
+ }
+ else
+ joyavailable = 0;
+#endif
+}
+
+static void
+draw(void)
+{
+ static char frbuf[80] = "";
+ int i;
+ float base, offset;
+
+ dojoy();
+
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ if (usetex)
+ glEnable(GL_TEXTURE_2D);
+ else
+ glDisable(GL_TEXTURE_2D);
+
+ if (fog)
+ glEnable(GL_FOG);
+ else
+ glDisable(GL_FOG);
+
+ glShadeModel(GL_SMOOTH);
+
+ glPushMatrix();
+ calcposobs();
+ gluLookAt(obs[0], obs[1], obs[2],
+ obs[0] + dir[0], obs[1] + dir[1], obs[2] + dir[2],
+ 0.0, 0.0, 1.0);
+
+ if (dir[0] > 0) {
+ offset = 8.0;
+ base = obs[0] - fmod(obs[0], 8.0);
+ }
+ else {
+ offset = -8.0;
+ base = obs[0] + (8.0 - fmod(obs[0], 8.0));
+ }
+
+ glPushMatrix();
+ glTranslatef(base - offset / 2.0, 0.0, 0.0);
+ for (i = 0; i < NUMBLOC; i++) {
+ glTranslatef(offset, 0.0, 0.0);
+ glBindTexture(GL_TEXTURE_2D, t1id);
+ drawobjs(striplength_skin_11, stripdata_skin_11);
+ glBindTexture(GL_TEXTURE_2D, t2id);
+ drawobjs(striplength_skin_12, stripdata_skin_12);
+ drawobjs(striplength_skin_9, stripdata_skin_9);
+ drawobjs(striplength_skin_13, stripdata_skin_13);
+ }
+ glPopMatrix();
+ glPopMatrix();
+
+ glDisable(GL_TEXTURE_2D);
+ glDisable(GL_FOG);
+ glShadeModel(GL_FLAT);
+
+ glMatrixMode(GL_PROJECTION);
+ glPushMatrix();
+ glLoadIdentity();
+ glOrtho(-0.5, 639.5, -0.5, 479.5, -1.0, 1.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ glColor3f(1.0, 0.0, 0.0);
+ glRasterPos2i(10, 10);
+ printstring(GLUT_BITMAP_HELVETICA_18, frbuf);
+ glRasterPos2i(350, 470);
+ printstring(GLUT_BITMAP_HELVETICA_10,
+ "Tunnel2 V1.0 Written by David Bucciarelli ([email protected])");
+
+ if (help)
+ printhelp();
+
+ glMatrixMode(GL_PROJECTION);
+ glPopMatrix();
+ glMatrixMode(GL_MODELVIEW);
+
+ Frames++;
+ {
+ GLint t = glutGet(GLUT_ELAPSED_TIME);
+ if (t - T0 >= 2000) {
+ GLfloat seconds = (t - T0) / 1000.0;
+ GLfloat fps = Frames / seconds;
+ sprintf(frbuf, "Frame rate: %f", fps);
+ T0 = t;
+ Frames = 0;
+ }
+ }
+}
+
+static void
+drawchannel0(void)
+{
+ glutSetWindow(channel[0]);
+ draw();
+ glutSwapBuffers();
+}
+
+static void
+drawchannel1(void)
+{
+ glutSetWindow(channel[1]);
+ draw();
+ glutSwapBuffers();
+}
+
+static void
+drawall(void)
+{
+ glutSetWindow(channel[0]);
+ draw();
+ glutSetWindow(channel[1]);
+ draw();
+
+ glutSetWindow(channel[0]);
+ glutSwapBuffers();
+ glutSetWindow(channel[1]);
+ glutSwapBuffers();
+}
+
+static void
+init(void)
+{
+ float fogcolor[4] = { 0.7, 0.7, 0.7, 1.0 };
+
+ glShadeModel(GL_SMOOTH);
+ glDisable(GL_DEPTH_TEST);
+ glEnable(GL_CULL_FACE);
+ glEnable(GL_TEXTURE_2D);
+
+ glEnable(GL_FOG);
+ glFogi(GL_FOG_MODE, GL_EXP2);
+ glFogfv(GL_FOG_COLOR, fogcolor);
+
+ glFogf(GL_FOG_DENSITY, 0.06);
+ glHint(GL_FOG_HINT, GL_NICEST);
+
+ glEnable(GL_BLEND);
+ /*
+ glBlendFunc(GL_SRC_ALPHA_SATURATE, GL_ONE);
+ glEnable(GL_POLYGON_SMOOTH);
+ */
+
+ glClearColor(fogcolor[0], fogcolor[1], fogcolor[2], fogcolor[3]);
+ glClear(GL_COLOR_BUFFER_BIT);
+}
+
+int
+main(int ac, char **av)
+{
+ fprintf(stderr,
+ "Tunnel2 V1.0\nWritten by David Bucciarelli ([email protected])\n");
+
+ glutInitWindowPosition(0, 0);
+ glutInitWindowSize(WIDTHC0, HEIGHTC0);
+ glutInit(&ac, av);
+
+ glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
+
+#ifdef FX
+ if (fxMesaSelectCurrentBoard(0) < 0) {
+ fprintf(stderr, "The first Voodoo Graphics board is missing !?!?\n");
+ return -1;
+ }
+#endif
+ if (!(channel[0] = glutCreateWindow("Channel 0"))) {
+ fprintf(stderr, "Error, couldn't open window\n");
+ return -1;
+ }
+
+ reshapechannel0(WIDTHC0, HEIGHTC0);
+ init();
+ inittextures();
+ glutDisplayFunc(drawchannel0);
+ glutReshapeFunc(reshapechannel0);
+ glutKeyboardFunc(key);
+ glutSpecialFunc(special);
+
+#ifdef FX
+ if (fxMesaSelectCurrentBoard(1) < 0) {
+ fprintf(stderr, "The second Voodoo Graphics board is missing !\n");
+ exit(-1);
+ }
+#endif
+ glutInitWindowPosition(WIDTHC0, 0);
+ glutInitWindowSize(WIDTHC1, HEIGHTC1);
+ if (!(channel[1] = glutCreateWindow("Channel 1"))) {
+ fprintf(stderr, "Error, couldn't open window\n");
+ exit(-1);
+ }
+
+ reshapechannel1(WIDTHC1, HEIGHTC1);
+ init();
+ inittextures();
+ glutDisplayFunc(drawchannel1);
+ glutReshapeFunc(reshapechannel1);
+ glutKeyboardFunc(key);
+ glutSpecialFunc(special);
+
+ glutIdleFunc(drawall);
+
+ calcposobs();
+
+ glutMainLoop();
+
+ return 0;
+}
diff --git a/progs/demos/tunneldat.h b/progs/demos/tunneldat.h
new file mode 100644
index 00000000000..af1e52e1f17
--- /dev/null
+++ b/progs/demos/tunneldat.h
@@ -0,0 +1,395 @@
+/* Object: skin_13 */
+
+#if defined(_MSC_VER) && defined(_WIN32)
+#pragma warning( disable : 4305 ) /* 'initializing' : truncation from 'const double' to 'float' */
+#endif
+
+static const int striplength_skin_13[] = {
+ 10, 7, 3, 5, 5, 4, 4, 4, 4, 5, 3, 4, 5, 4, 4, 4, 4, 4, 4, 6,
+ 6, 3, 6, 3, 3, 3, 3, 0
+};
+
+static const float stripdata_skin_13[] = {
+ 0.415686, 0.415686, 0.415686, 1.000000, 0.000000, 1.500000, 2.000000,
+ 4.000000, 0.000000, 0.341176, 0.341176, 0.341176, 1.000000, -0.500000,
+ 1.500000, 4.000000, 4.000000, 0.000000, 0.545098, 0.545098, 0.545098,
+ 1.000000, 0.000000, 1.000000, 2.000000, 4.000000, 2.000000, 0.435294,
+ 0.435294, 0.435294, 1.000000, -0.500000, 1.000000, 4.000000, 4.000000,
+ 2.000000, 0.517647, 0.517647, 0.517647, 1.000000, 0.000000, 0.500000,
+ 2.000000, 4.000000, 4.000000, 0.450980, 0.450980, 0.450980, 1.000000,
+ -0.500000, 0.500000, 4.000000, 4.000000, 4.000000, 0.427451, 0.427451,
+ 0.427451, 1.000000, 0.000000, 0.000000, 2.000000, 4.000000, 6.000000,
+ 0.388235, 0.388235, 0.388235, 1.000000, -0.500000, 0.000000, 4.000000,
+ 4.000000, 6.000000, 0.356863, 0.356863, 0.356863, 1.000000, 0.000000,
+ -0.500000, 2.000000, 4.000000, 8.000000, 0.333333, 0.333333, 0.333333,
+ 1.000000, -0.500000, -0.500000, 4.000000, 4.000000, 8.000000,
+ 0.435294, 0.435294, 0.435294, 1.000000, 1.500000, 1.000000, -4.000000,
+ 4.000000, 2.000000, 0.415686, 0.415686, 0.415686, 1.000000, 1.000000,
+ 1.500000, -2.000000, 4.000000, 0.000000, 0.545098, 0.545098, 0.545098,
+ 1.000000, 1.000000, 1.000000, -2.000000, 4.000000, 2.000000, 0.450980,
+ 0.450980, 0.450980, 1.000000, 0.500000, 1.500000, 0.000000, 4.000000,
+ 0.000000, 0.600000, 0.600000, 0.600000, 1.000000, 0.500000, 1.000000,
+ 0.000000, 4.000000, 2.000000, 0.415686, 0.415686, 0.415686, 1.000000,
+ 0.000000, 1.500000, 2.000000, 4.000000, 0.000000, 0.545098, 0.545098,
+ 0.545098, 1.000000, 0.000000, 1.000000, 2.000000, 4.000000, 2.000000,
+ 0.435294, 0.435294, 0.435294, 1.000000, 1.500000, 1.000000, -4.000000,
+ 4.000000, 2.000000, 0.341176, 0.341176, 0.341176, 1.000000, 1.500000,
+ 1.500000, -4.000000, 4.000000, 0.000000, 0.415686, 0.415686, 0.415686,
+ 1.000000, 1.000000, 1.500000, -2.000000, 4.000000, 0.000000,
+ 0.356863, 0.356863, 0.356863, 1.000000, 0.000000, -0.500000, 2.000000,
+ 4.000000, 8.000000, 0.364706, 0.364706, 0.364706, 1.000000, 0.500000,
+ -0.500000, 0.000000, 4.000000, 8.000000, 0.427451, 0.427451, 0.427451,
+ 1.000000, 0.000000, 0.000000, 2.000000, 4.000000, 6.000000, 0.415686,
+ 0.415686, 0.415686, 1.000000, 0.395020, -0.133318, 0.420032, 4.000000,
+ 6.533272, 0.423529, 0.423529, 0.423529, 1.000000, 0.388550, -0.103582,
+ 0.445932, 4.000000, 6.414327,
+ 0.423529, 0.423529, 0.423529, 1.000000, 0.388550, -0.103582, 0.445932,
+ 4.000000, 6.414327, 0.427451, 0.427451, 0.427451, 1.000000, 0.383423,
+ -0.069344, 0.466541, 4.000000, 6.277375, 0.427451, 0.427451, 0.427451,
+ 1.000000, 0.000000, 0.000000, 2.000000, 4.000000, 6.000000, 0.435294,
+ 0.435294, 0.435294, 1.000000, 0.380371, -0.034595, 0.478689, 4.000000,
+ 6.138380, 0.439216, 0.439216, 0.439216, 1.000000, 0.379272, 0.000000,
+ 0.482673, 4.000000, 6.000000,
+ 0.407843, 0.407843, 0.407843, 1.000000, 0.414673, -0.191394, 0.341301,
+ 4.000000, 6.765576, 0.411765, 0.411765, 0.411765, 1.000000, 0.403687,
+ -0.162957, 0.385368, 4.000000, 6.651829, 0.364706, 0.364706, 0.364706,
+ 1.000000, 0.500000, -0.500000, 0.000000, 4.000000, 8.000000, 0.415686,
+ 0.415686, 0.415686, 1.000000, 0.395020, -0.133318, 0.420032, 4.000000,
+ 6.533272,
+ 0.400000, 0.400000, 0.400000, 1.000000, 0.438232, -0.232438, 0.247284,
+ 4.000000, 6.929754, 0.403922, 0.403922, 0.403922, 1.000000, 0.425171,
+ -0.212276, 0.299425, 4.000000, 6.849104, 0.364706, 0.364706, 0.364706,
+ 1.000000, 0.500000, -0.500000, 0.000000, 4.000000, 8.000000, 0.407843,
+ 0.407843, 0.407843, 1.000000, 0.414673, -0.191394, 0.341301, 4.000000,
+ 6.765576,
+ 0.396078, 0.396078, 0.396078, 1.000000, 0.467285, -0.260554, 0.130636,
+ 4.000000, 7.042214, 0.400000, 0.400000, 0.400000, 1.000000, 0.453857,
+ -0.250068, 0.184711, 4.000000, 7.000273, 0.364706, 0.364706, 0.364706,
+ 1.000000, 0.500000, -0.500000, 0.000000, 4.000000, 8.000000, 0.400000,
+ 0.400000, 0.400000, 1.000000, 0.438232, -0.232438, 0.247284, 4.000000,
+ 6.929754,
+ 0.396078, 0.396078, 0.396078, 1.000000, 0.500000, -0.270672, 0.000000,
+ 4.000000, 7.082688, 0.396078, 0.396078, 0.396078, 1.000000, 0.482788,
+ -0.267902, 0.068730, 4.000000, 7.071609, 0.364706, 0.364706, 0.364706,
+ 1.000000, 0.500000, -0.500000, 0.000000, 4.000000, 8.000000, 0.396078,
+ 0.396078, 0.396078, 1.000000, 0.467285, -0.260554, 0.130636, 4.000000,
+ 7.042214,
+ 0.439216, 0.439216, 0.439216, 1.000000, 0.379272, 0.000000, 0.482673,
+ 4.000000, 6.000000, 0.474510, 0.474510, 0.474510, 1.000000, 0.379272,
+ 0.180448, 0.482673, 4.000000, 5.278208, 0.517647, 0.517647, 0.517647,
+ 1.000000, 0.000000, 0.500000, 2.000000, 4.000000, 4.000000, 0.513726,
+ 0.513726, 0.513726, 1.000000, 0.379272, 0.360896, 0.482673, 4.000000,
+ 4.556417, 0.545098, 0.545098, 0.545098, 1.000000, 0.379272, 0.500000,
+ 0.482673, 4.000000, 4.000000,
+ 0.545098, 0.545098, 0.545098, 1.000000, 0.379272, 0.500000, 0.482673,
+ 4.000000, 4.000000, 0.545098, 0.545098, 0.545098, 1.000000, 0.000000,
+ 1.000000, 2.000000, 4.000000, 2.000000, 0.517647, 0.517647, 0.517647,
+ 1.000000, 0.000000, 0.500000, 2.000000, 4.000000, 4.000000,
+ 0.600000, 0.600000, 0.600000, 1.000000, 0.500000, 1.000000, 0.000000,
+ 4.000000, 2.000000, 0.545098, 0.545098, 0.545098, 1.000000, 0.000000,
+ 1.000000, 2.000000, 4.000000, 2.000000, 0.552941, 0.552941, 0.552941,
+ 1.000000, 0.379272, 0.541344, 0.482673, 4.000000, 3.834625, 0.545098,
+ 0.545098, 0.545098, 1.000000, 0.379272, 0.500000, 0.482673, 4.000000,
+ 4.000000,
+ 0.552941, 0.552941, 0.552941, 1.000000, 0.379272, 0.541344, 0.482673,
+ 4.000000, 3.834625, 0.556863, 0.556863, 0.556863, 1.000000, 0.459717,
+ 0.541344, 0.160891, 4.000000, 3.834625, 0.600000, 0.600000, 0.600000,
+ 1.000000, 0.500000, 1.000000, 0.000000, 4.000000, 2.000000, 0.556863,
+ 0.556863, 0.556863, 1.000000, 0.500000, 0.541344, 0.000000, 4.000000,
+ 3.834625, 0.556863, 0.556863, 0.556863, 1.000000, 0.540283, 0.541344,
+ -0.160891, 4.000000, 3.834625,
+ 0.396078, 0.396078, 0.396078, 1.000000, 0.517212, -0.267902, -0.068730,
+ 4.000000, 7.071609, 0.396078, 0.396078, 0.396078, 1.000000, 0.500000,
+ -0.270672, 0.000000, 4.000000, 7.082688, 0.356863, 0.356863, 0.356863,
+ 1.000000, 1.000000, -0.500000, -2.000000, 4.000000, 8.000000, 0.364706,
+ 0.364706, 0.364706, 1.000000, 0.500000, -0.500000, 0.000000, 4.000000,
+ 8.000000,
+ 0.400000, 0.400000, 0.400000, 1.000000, 0.546143, -0.250068, -0.184711,
+ 4.000000, 7.000273, 0.396078, 0.396078, 0.396078, 1.000000, 0.532715,
+ -0.260554, -0.130636, 4.000000, 7.042214, 0.356863, 0.356863, 0.356863,
+ 1.000000, 1.000000, -0.500000, -2.000000, 4.000000, 8.000000, 0.396078,
+ 0.396078, 0.396078, 1.000000, 0.517212, -0.267902, -0.068730, 4.000000,
+ 7.071609,
+ 0.403922, 0.403922, 0.403922, 1.000000, 0.574829, -0.212276, -0.299425,
+ 4.000000, 6.849104, 0.400000, 0.400000, 0.400000, 1.000000, 0.561768,
+ -0.232438, -0.247284, 4.000000, 6.929754, 0.356863, 0.356863, 0.356863,
+ 1.000000, 1.000000, -0.500000, -2.000000, 4.000000, 8.000000, 0.400000,
+ 0.400000, 0.400000, 1.000000, 0.546143, -0.250068, -0.184711, 4.000000,
+ 7.000273,
+ 0.411765, 0.411765, 0.411765, 1.000000, 0.596313, -0.162957, -0.385368,
+ 4.000000, 6.651829, 0.407843, 0.407843, 0.407843, 1.000000, 0.585327,
+ -0.191394, -0.341301, 4.000000, 6.765576, 0.356863, 0.356863, 0.356863,
+ 1.000000, 1.000000, -0.500000, -2.000000, 4.000000, 8.000000, 0.403922,
+ 0.403922, 0.403922, 1.000000, 0.574829, -0.212276, -0.299425, 4.000000,
+ 6.849104,
+ 0.423529, 0.423529, 0.423529, 1.000000, 0.611450, -0.103582, -0.445931,
+ 4.000000, 6.414327, 0.415686, 0.415686, 0.415686, 1.000000, 0.604980,
+ -0.133318, -0.420033, 4.000000, 6.533272, 0.356863, 0.356863, 0.356863,
+ 1.000000, 1.000000, -0.500000, -2.000000, 4.000000, 8.000000, 0.411765,
+ 0.411765, 0.411765, 1.000000, 0.596313, -0.162957, -0.385368, 4.000000,
+ 6.651829,
+ 0.435294, 0.435294, 0.435294, 1.000000, 0.619629, -0.034595, -0.478689,
+ 4.000000, 6.138380, 0.427451, 0.427451, 0.427451, 1.000000, 0.616577,
+ -0.069344, -0.466541, 4.000000, 6.277375, 0.356863, 0.356863, 0.356863,
+ 1.000000, 1.000000, -0.500000, -2.000000, 4.000000, 8.000000, 0.423529,
+ 0.423529, 0.423529, 1.000000, 0.611450, -0.103582, -0.445931, 4.000000,
+ 6.414327,
+ 0.513726, 0.513726, 0.513726, 1.000000, 0.620728, 0.360896, -0.482673,
+ 4.000000, 4.556417, 0.474510, 0.474510, 0.474510, 1.000000, 0.620728,
+ 0.180448, -0.482673, 4.000000, 5.278208, 0.427451, 0.427451, 0.427451,
+ 1.000000, 1.000000, 0.000000, -2.000000, 4.000000, 6.000000, 0.439216,
+ 0.439216, 0.439216, 1.000000, 0.620728, 0.000000, -0.482673, 4.000000,
+ 6.000000, 0.356863, 0.356863, 0.356863, 1.000000, 1.000000, -0.500000,
+ -2.000000, 4.000000, 8.000000, 0.435294, 0.435294, 0.435294, 1.000000,
+ 0.619629, -0.034595, -0.478689, 4.000000, 6.138380,
+ 0.333333, 0.333333, 0.333333, 1.000000, 1.500000, -0.500000, -4.000000,
+ 4.000000, 8.000000, 0.388235, 0.388235, 0.388235, 1.000000, 1.500000,
+ 0.000000, -4.000000, 4.000000, 6.000000, 0.427451, 0.427451, 0.427451,
+ 1.000000, 1.000000, 0.000000, -2.000000, 4.000000, 6.000000, 0.517647,
+ 0.517647, 0.517647, 1.000000, 1.000000, 0.500000, -2.000000, 4.000000,
+ 4.000000, 0.513726, 0.513726, 0.513726, 1.000000, 0.620728, 0.360896,
+ -0.482673, 4.000000, 4.556417, 0.545098, 0.545098, 0.545098, 1.000000,
+ 0.620728, 0.500000, -0.482673, 4.000000, 4.000000,
+ 0.333333, 0.333333, 0.333333, 1.000000, 1.500000, -0.500000, -4.000000,
+ 4.000000, 8.000000, 0.427451, 0.427451, 0.427451, 1.000000, 1.000000,
+ 0.000000, -2.000000, 4.000000, 6.000000, 0.356863, 0.356863, 0.356863,
+ 1.000000, 1.000000, -0.500000, -2.000000, 4.000000, 8.000000,
+ 0.556863, 0.556863, 0.556863, 1.000000, 0.540283, 0.541344, -0.160891,
+ 4.000000, 3.834625, 0.552941, 0.552941, 0.552941, 1.000000, 0.620728,
+ 0.541344, -0.482673, 4.000000, 3.834625, 0.545098, 0.545098, 0.545098,
+ 1.000000, 1.000000, 1.000000, -2.000000, 4.000000, 2.000000, 0.517647,
+ 0.517647, 0.517647, 1.000000, 1.000000, 0.500000, -2.000000, 4.000000,
+ 4.000000, 0.450980, 0.450980, 0.450980, 1.000000, 1.500000, 0.500000,
+ -4.000000, 4.000000, 4.000000, 0.388235, 0.388235, 0.388235, 1.000000,
+ 1.500000, 0.000000, -4.000000, 4.000000, 6.000000,
+ 0.517647, 0.517647, 0.517647, 1.000000, 1.000000, 0.500000, -2.000000,
+ 4.000000, 4.000000, 0.552941, 0.552941, 0.552941, 1.000000, 0.620728,
+ 0.541344, -0.482673, 4.000000, 3.834625, 0.545098, 0.545098, 0.545098,
+ 1.000000, 0.620728, 0.500000, -0.482673, 4.000000, 4.000000,
+ 0.450980, 0.450980, 0.450980, 1.000000, 1.500000, 0.500000, -4.000000,
+ 4.000000, 4.000000, 0.435294, 0.435294, 0.435294, 1.000000, 1.500000,
+ 1.000000, -4.000000, 4.000000, 2.000000, 0.545098, 0.545098, 0.545098,
+ 1.000000, 1.000000, 1.000000, -2.000000, 4.000000, 2.000000,
+ 0.439216, 0.439216, 0.439216, 1.000000, 0.379272, 0.000000, 0.482673,
+ 4.000000, 6.000000, 0.517647, 0.517647, 0.517647, 1.000000, 0.000000,
+ 0.500000, 2.000000, 4.000000, 4.000000, 0.427451, 0.427451, 0.427451,
+ 1.000000, 0.000000, 0.000000, 2.000000, 4.000000, 6.000000,
+ 0.556863, 0.556863, 0.556863, 1.000000, 0.540283, 0.541344, -0.160891,
+ 4.000000, 3.834625, 0.545098, 0.545098, 0.545098, 1.000000, 1.000000,
+ 1.000000, -2.000000, 4.000000, 2.000000, 0.600000, 0.600000, 0.600000,
+ 1.000000, 0.500000, 1.000000, 0.000000, 4.000000, 2.000000
+};
+
+
+/* Object: skin_12 */
+
+static const int striplength_skin_12[] = {
+ 12, 12, 12, 12, 12, 0
+};
+
+static const float stripdata_skin_12[] = {
+ 0.498039, 0.498039, 0.498039, 1.000000, -0.099976, 1.500000, -2.400000,
+ -4.000000, -0.000002, 0.337255, 0.337255, 0.337255, 1.000000, -0.500000,
+ 1.500000, -4.000000, -4.000000, -0.000002, 0.568627, 0.568627, 0.568627,
+ 1.000000, -0.099976, 1.100000, -2.400000, -4.000000, 1.599999, 0.341176,
+ 0.341176, 0.341176, 1.000000, -0.500000, 1.100000, -4.000000, -4.000000,
+ 1.599999, 0.498039, 0.498039, 0.498039, 1.000000, -0.099976, 0.700000,
+ -2.400000, -4.000000, 3.200000, 0.325490, 0.325490, 0.325490, 1.000000,
+ -0.500000, 0.700000, -4.000000, -4.000000, 3.199999, 0.352941, 0.352941,
+ 0.352941, 1.000000, -0.099976, 0.300000, -2.400000, -4.000000, 4.800000,
+ 0.282353, 0.282353, 0.282353, 1.000000, -0.500000, 0.300000, -4.000000,
+ -4.000000, 4.800000, 0.282353, 0.282353, 0.282353, 1.000000, -0.099976,
+ -0.100000, -2.400000, -4.000000, 6.400001, 0.254902, 0.254902, 0.254902,
+ 1.000000, -0.500000, -0.100000, -4.000000, -4.000000, 6.400000,
+ 0.239216, 0.239216, 0.239216, 1.000000, -0.099976, -0.500000, -2.400000,
+ -4.000000, 8.000000, 0.227451, 0.227451, 0.227451, 1.000000, -0.500000,
+ -0.500000, -4.000000, -4.000000, 8.000000,
+ 0.239216, 0.239216, 0.239216, 1.000000, 1.099976, -0.500000, 2.400001,
+ -4.000000, 8.000000, 0.227451, 0.227451, 0.227451, 1.000000, 1.500000,
+ -0.500000, 4.000002, -4.000000, 8.000000, 0.282353, 0.282353, 0.282353,
+ 1.000000, 1.099976, -0.100000, 2.400001, -4.000000, 6.400001, 0.254902,
+ 0.254902, 0.254902, 1.000000, 1.500000, -0.100000, 4.000002, -4.000000,
+ 6.400001, 0.352941, 0.352941, 0.352941, 1.000000, 1.099976, 0.300000,
+ 2.400002, -4.000000, 4.800001, 0.282353, 0.282353, 0.282353, 1.000000,
+ 1.500000, 0.300000, 4.000002, -4.000000, 4.800001, 0.498039, 0.498039,
+ 0.498039, 1.000000, 1.099976, 0.700000, 2.400002, -4.000000, 3.200000,
+ 0.321569, 0.321569, 0.321569, 1.000000, 1.500000, 0.700000, 4.000003,
+ -4.000000, 3.200000, 0.568627, 0.568627, 0.568627, 1.000000, 1.099976,
+ 1.100000, 2.400002, -4.000000, 1.599999, 0.341176, 0.341176, 0.341176,
+ 1.000000, 1.500000, 1.100000, 4.000003, -4.000000, 1.599999, 0.494118,
+ 0.494118, 0.494118, 1.000000, 1.099976, 1.500000, 2.400003, -4.000000,
+ -0.000002, 0.337255, 0.337255, 0.337255, 1.000000, 1.500000, 1.500000,
+ 4.000004, -4.000000, -0.000002,
+ 0.639216, 0.639216, 0.639216, 1.000000, 0.300049, 1.500000, -0.799999,
+ -4.000000, -0.000002, 0.498039, 0.498039, 0.498039, 1.000000, -0.099976,
+ 1.500000, -2.400000, -4.000000, -0.000002, 0.858824, 0.858824, 0.858824,
+ 1.000000, 0.300049, 1.100000, -0.799999, -4.000000, 1.599999, 0.568627,
+ 0.568627, 0.568627, 1.000000, -0.099976, 1.100000, -2.400000, -4.000000,
+ 1.599999, 0.686275, 0.686275, 0.686275, 1.000000, 0.300049, 0.700000,
+ -0.799999, -4.000000, 3.200000, 0.498039, 0.498039, 0.498039, 1.000000,
+ -0.099976, 0.700000, -2.400000, -4.000000, 3.200000, 0.419608, 0.419608,
+ 0.419608, 1.000000, 0.300049, 0.300000, -0.800000, -4.000000, 4.800000,
+ 0.352941, 0.352941, 0.352941, 1.000000, -0.099976, 0.300000, -2.400000,
+ -4.000000, 4.800000, 0.298039, 0.298039, 0.298039, 1.000000, 0.300049,
+ -0.100000, -0.800000, -4.000000, 6.400001, 0.282353, 0.282353, 0.282353,
+ 1.000000, -0.099976, -0.100000, -2.400000, -4.000000, 6.400001,
+ 0.247059, 0.247059, 0.247059, 1.000000, 0.300049, -0.500000, -0.800000,
+ -4.000000, 8.000000, 0.239216, 0.239216, 0.239216, 1.000000, -0.099976,
+ -0.500000, -2.400000, -4.000000, 8.000000,
+ 0.639216, 0.639216, 0.639216, 1.000000, 0.699951, 1.500000, 0.800002,
+ -4.000000, -0.000002, 0.639216, 0.639216, 0.639216, 1.000000, 0.300049,
+ 1.500000, -0.799999, -4.000000, -0.000002, 0.858824, 0.858824, 0.858824,
+ 1.000000, 0.699951, 1.100000, 0.800001, -4.000000, 1.599999, 0.858824,
+ 0.858824, 0.858824, 1.000000, 0.300049, 1.100000, -0.799999, -4.000000,
+ 1.599999, 0.686275, 0.686275, 0.686275, 1.000000, 0.699951, 0.700000,
+ 0.800001, -4.000000, 3.200000, 0.686275, 0.686275, 0.686275, 1.000000,
+ 0.300049, 0.700000, -0.799999, -4.000000, 3.200000, 0.419608, 0.419608,
+ 0.419608, 1.000000, 0.699951, 0.300000, 0.800001, -4.000000, 4.800001,
+ 0.419608, 0.419608, 0.419608, 1.000000, 0.300049, 0.300000, -0.800000,
+ -4.000000, 4.800000, 0.298039, 0.298039, 0.298039, 1.000000, 0.699951,
+ -0.100000, 0.800001, -4.000000, 6.400001, 0.298039, 0.298039, 0.298039,
+ 1.000000, 0.300049, -0.100000, -0.800000, -4.000000, 6.400001, 0.247059,
+ 0.247059, 0.247059, 1.000000, 0.699951, -0.500000, 0.800000, -4.000000,
+ 8.000000, 0.247059, 0.247059, 0.247059, 1.000000, 0.300049, -0.500000,
+ -0.800000, -4.000000, 8.000000,
+ 0.494118, 0.494118, 0.494118, 1.000000, 1.099976, 1.500000, 2.400003,
+ -4.000000, -0.000002, 0.639216, 0.639216, 0.639216, 1.000000, 0.699951,
+ 1.500000, 0.800002, -4.000000, -0.000002, 0.568627, 0.568627, 0.568627,
+ 1.000000, 1.099976, 1.100000, 2.400002, -4.000000, 1.599999, 0.858824,
+ 0.858824, 0.858824, 1.000000, 0.699951, 1.100000, 0.800001, -4.000000,
+ 1.599999, 0.498039, 0.498039, 0.498039, 1.000000, 1.099976, 0.700000,
+ 2.400002, -4.000000, 3.200000, 0.686275, 0.686275, 0.686275, 1.000000,
+ 0.699951, 0.700000, 0.800001, -4.000000, 3.200000, 0.352941, 0.352941,
+ 0.352941, 1.000000, 1.099976, 0.300000, 2.400002, -4.000000, 4.800001,
+ 0.419608, 0.419608, 0.419608, 1.000000, 0.699951, 0.300000, 0.800001,
+ -4.000000, 4.800001, 0.282353, 0.282353, 0.282353, 1.000000, 1.099976,
+ -0.100000, 2.400001, -4.000000, 6.400001, 0.298039, 0.298039, 0.298039,
+ 1.000000, 0.699951, -0.100000, 0.800001, -4.000000, 6.400001, 0.239216,
+ 0.239216, 0.239216, 1.000000, 1.099976, -0.500000, 2.400001, -4.000000,
+ 8.000000, 0.247059, 0.247059, 0.247059, 1.000000, 0.699951, -0.500000,
+ 0.800000, -4.000000, 8.000000
+};
+
+
+/* Object: skin_11 */
+
+static const int striplength_skin_11[] = {
+ 12, 12, 12, 12, 12, 0
+};
+
+static const float stripdata_skin_11[] = {
+ 0.145098, 0.145098, 0.145098, 1.000000, -0.099976, 1.500000, -2.400000,
+ 4.000002, 0.000000, 0.141176, 0.141176, 0.141176, 1.000000, -0.500000,
+ 1.500000, -4.000000, 4.000002, 0.000000, 0.176471, 0.176471, 0.176471,
+ 1.000000, -0.099976, 1.100000, -2.400000, 2.400001, 0.000000, 0.145098,
+ 0.145098, 0.145098, 1.000000, -0.500000, 1.100000, -4.000000, 2.400001,
+ 0.000000, 0.341176, 0.341176, 0.341176, 1.000000, -0.099976, 0.700000,
+ -2.400000, 0.800000, 0.000000, 0.188235, 0.188235, 0.188235, 1.000000,
+ -0.500000, 0.700000, -4.000000, 0.800000, 0.000000, 0.450980, 0.450980,
+ 0.450980, 1.000000, -0.099976, 0.300000, -2.400000, -0.800000, 0.000000,
+ 0.247059, 0.247059, 0.247059, 1.000000, -0.500000, 0.300000, -4.000000,
+ -0.800000, 0.000000, 0.439216, 0.439216, 0.439216, 1.000000, -0.099976,
+ -0.100000, -2.400000, -2.400000, 0.000000, 0.270588, 0.270588, 0.270588,
+ 1.000000, -0.500000, -0.100000, -4.000000, -2.400000, 0.000000,
+ 0.364706, 0.364706, 0.364706, 1.000000, -0.099976, -0.500000, -2.400000,
+ -4.000000, 0.000000, 0.258824, 0.258824, 0.258824, 1.000000, -0.500000,
+ -0.500000, -4.000000, -4.000000, 0.000000,
+ 0.364706, 0.364706, 0.364706, 1.000000, 1.099976, -0.500000, 2.400001,
+ -4.000000, 0.000000, 0.258824, 0.258824, 0.258824, 1.000000, 1.500000,
+ -0.500000, 4.000002, -4.000000, 0.000000, 0.439216, 0.439216, 0.439216,
+ 1.000000, 1.099976, -0.100000, 2.400001, -2.400001, 0.000000, 0.270588,
+ 0.270588, 0.270588, 1.000000, 1.500000, -0.100000, 4.000002, -2.400001,
+ 0.000000, 0.454902, 0.454902, 0.454902, 1.000000, 1.099976, 0.300000,
+ 2.400002, -0.800000, 0.000000, 0.247059, 0.247059, 0.247059, 1.000000,
+ 1.500000, 0.300000, 4.000002, -0.800000, 0.000000, 0.341176, 0.341176,
+ 0.341176, 1.000000, 1.099976, 0.700000, 2.400002, 0.800000, 0.000000,
+ 0.184314, 0.184314, 0.184314, 1.000000, 1.500000, 0.700000, 4.000003,
+ 0.800000, 0.000000, 0.176471, 0.176471, 0.176471, 1.000000, 1.099976,
+ 1.100000, 2.400002, 2.400001, 0.000000, 0.145098, 0.145098, 0.145098,
+ 1.000000, 1.500000, 1.100000, 4.000003, 2.400001, 0.000000, 0.145098,
+ 0.145098, 0.145098, 1.000000, 1.099976, 1.500000, 2.400003, 4.000003,
+ 0.000000, 0.141176, 0.141176, 0.141176, 1.000000, 1.500000, 1.500000,
+ 4.000004, 4.000002, 0.000000,
+ 0.145098, 0.145098, 0.145098, 1.000000, 0.300049, 1.500000, -0.799999,
+ 4.000002, 0.000000, 0.145098, 0.145098, 0.145098, 1.000000, -0.099976,
+ 1.500000, -2.400000, 4.000002, 0.000000, 0.262745, 0.262745, 0.262745,
+ 1.000000, 0.300049, 1.100000, -0.799999, 2.400001, 0.000000, 0.176471,
+ 0.176471, 0.176471, 1.000000, -0.099976, 1.100000, -2.400000, 2.400001,
+ 0.000000, 0.580392, 0.580392, 0.580392, 1.000000, 0.300049, 0.700000,
+ -0.799999, 0.800000, 0.000000, 0.341176, 0.341176, 0.341176, 1.000000,
+ -0.099976, 0.700000, -2.400000, 0.800000, 0.000000, 0.709804, 0.709804,
+ 0.709804, 1.000000, 0.300049, 0.300000, -0.800000, -0.800000, 0.000000,
+ 0.450980, 0.450980, 0.450980, 1.000000, -0.099976, 0.300000, -2.400000,
+ -0.800000, 0.000000, 0.627451, 0.627451, 0.627451, 1.000000, 0.300049,
+ -0.100000, -0.800000, -2.400001, 0.000000, 0.439216, 0.439216, 0.439216,
+ 1.000000, -0.099976, -0.100000, -2.400000, -2.400000, 0.000000,
+ 0.458824, 0.458824, 0.458824, 1.000000, 0.300049, -0.500000, -0.800000,
+ -4.000000, 0.000000, 0.364706, 0.364706, 0.364706, 1.000000, -0.099976,
+ -0.500000, -2.400000, -4.000000, 0.000000,
+ 0.145098, 0.145098, 0.145098, 1.000000, 0.699951, 1.500000, 0.800002,
+ 4.000002, 0.000000, 0.145098, 0.145098, 0.145098, 1.000000, 0.300049,
+ 1.500000, -0.799999, 4.000002, 0.000000, 0.262745, 0.262745, 0.262745,
+ 1.000000, 0.699951, 1.100000, 0.800001, 2.400001, 0.000000, 0.262745,
+ 0.262745, 0.262745, 1.000000, 0.300049, 1.100000, -0.799999, 2.400001,
+ 0.000000, 0.580392, 0.580392, 0.580392, 1.000000, 0.699951, 0.700000,
+ 0.800001, 0.800000, 0.000000, 0.580392, 0.580392, 0.580392, 1.000000,
+ 0.300049, 0.700000, -0.799999, 0.800000, 0.000000, 0.713726, 0.713726,
+ 0.713726, 1.000000, 0.699951, 0.300000, 0.800001, -0.800000, 0.000000,
+ 0.709804, 0.709804, 0.709804, 1.000000, 0.300049, 0.300000, -0.800000,
+ -0.800000, 0.000000, 0.631373, 0.631373, 0.631373, 1.000000, 0.699951,
+ -0.100000, 0.800001, -2.400001, 0.000000, 0.627451, 0.627451, 0.627451,
+ 1.000000, 0.300049, -0.100000, -0.800000, -2.400001, 0.000000, 0.458824,
+ 0.458824, 0.458824, 1.000000, 0.699951, -0.500000, 0.800000, -4.000000,
+ 0.000000, 0.458824, 0.458824, 0.458824, 1.000000, 0.300049, -0.500000,
+ -0.800000, -4.000000, 0.000000,
+ 0.145098, 0.145098, 0.145098, 1.000000, 1.099976, 1.500000, 2.400003,
+ 4.000003, 0.000000, 0.145098, 0.145098, 0.145098, 1.000000, 0.699951,
+ 1.500000, 0.800002, 4.000002, 0.000000, 0.176471, 0.176471, 0.176471,
+ 1.000000, 1.099976, 1.100000, 2.400002, 2.400001, 0.000000, 0.262745,
+ 0.262745, 0.262745, 1.000000, 0.699951, 1.100000, 0.800001, 2.400001,
+ 0.000000, 0.341176, 0.341176, 0.341176, 1.000000, 1.099976, 0.700000,
+ 2.400002, 0.800000, 0.000000, 0.580392, 0.580392, 0.580392, 1.000000,
+ 0.699951, 0.700000, 0.800001, 0.800000, 0.000000, 0.454902, 0.454902,
+ 0.454902, 1.000000, 1.099976, 0.300000, 2.400002, -0.800000, 0.000000,
+ 0.713726, 0.713726, 0.713726, 1.000000, 0.699951, 0.300000, 0.800001,
+ -0.800000, 0.000000, 0.439216, 0.439216, 0.439216, 1.000000, 1.099976,
+ -0.100000, 2.400001, -2.400001, 0.000000, 0.631373, 0.631373, 0.631373,
+ 1.000000, 0.699951, -0.100000, 0.800001, -2.400001, 0.000000, 0.364706,
+ 0.364706, 0.364706, 1.000000, 1.099976, -0.500000, 2.400001, -4.000000,
+ 0.000000, 0.458824, 0.458824, 0.458824, 1.000000, 0.699951, -0.500000,
+ 0.800000, -4.000000, 0.000000
+};
+
+
+/* Object: skin_9 */
+
+static const int striplength_skin_9[] = {
+ 18, 0
+};
+
+static const float stripdata_skin_9[] = {
+ 0.384314, 0.384314, 0.384314, 1.000000, -0.500000, 1.500000, -4.000000,
+ 4.000000, 8.000000, 0.384314, 0.384314, 0.384314, 1.000000, 1.500000,
+ 1.500000, 4.000000, 4.000000, 8.000000, 0.376471, 0.376471, 0.376471,
+ 1.000000, -0.500000, 1.250000, -4.000000, 3.695518, 9.530733, 0.403922,
+ 0.403922, 0.403922, 1.000000, 1.500000, 1.250000, 4.000000, 3.695518,
+ 9.530733, 0.415686, 0.415686, 0.415686, 1.000000, -0.500000, 1.000000,
+ -4.000000, 2.828427, 10.828427, 0.431373, 0.431373, 0.431373, 1.000000,
+ 1.500000, 1.000000, 4.000000, 2.828427, 10.828427, 0.435294, 0.435294,
+ 0.435294, 1.000000, -0.500000, 0.750000, -4.000000, 1.530734, 11.695518,
+ 0.443137, 0.443137, 0.443137, 1.000000, 1.500000, 0.750000, 4.000000,
+ 1.530734, 11.695518, 0.439216, 0.439216, 0.439216, 1.000000, -0.500000,
+ 0.500000, -4.000000, 0.000000, 12.000000, 0.435294, 0.435294, 0.435294,
+ 1.000000, 1.500000, 0.500000, 4.000000, 0.000000, 12.000000, 0.427451,
+ 0.427451, 0.427451, 1.000000, -0.500000, 0.250000, -4.000000, -1.530734,
+ 11.695518, 0.411765, 0.411765, 0.411765, 1.000000, 1.500000, 0.250000,
+ 4.000000, -1.530734, 11.695518, 0.396078, 0.396078, 0.396078, 1.000000,
+ -0.500000, 0.000000, -4.000000, -2.828427, 10.828427, 0.368627,
+ 0.368627, 0.368627, 1.000000, 1.500000, 0.000000, 4.000000, -2.828427,
+ 10.828427, 0.341176, 0.341176, 0.341176, 1.000000, -0.500000, -0.250000,
+ -4.000000, -3.695518, 9.530733, 0.301961, 0.301961, 0.301961, 1.000000,
+ 1.500000, -0.250000, 4.000000, -3.695518, 9.530733, 0.294118, 0.294118,
+ 0.294118, 1.000000, -0.500000, -0.500000, -4.000000, -4.000000,
+ 8.000000, 0.294118, 0.294118, 0.294118, 1.000000, 1.500000, -0.500000,
+ 4.000000, -4.000000, 8.000000
+};
diff --git a/progs/demos/winpos.c b/progs/demos/winpos.c
new file mode 100644
index 00000000000..2ee1df69fbc
--- /dev/null
+++ b/progs/demos/winpos.c
@@ -0,0 +1,118 @@
+
+/*
+ * Example of how to use the GL_MESA_window_pos extension.
+ * Brian Paul This file is in the public domain.
+ */
+
+#include <math.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#ifdef _WIN32
+#include <windows.h>
+#endif
+#define GL_GLEXT_PROTOTYPES
+#include "GL/glut.h"
+
+#include "readtex.h"
+
+#define IMAGE_FILE "../images/girl.rgb"
+
+
+#ifndef M_PI
+# define M_PI 3.14159265
+#endif
+
+
+
+static GLubyte *Image;
+static int ImgWidth, ImgHeight;
+static GLenum ImgFormat;
+
+typedef void (APIENTRY * PFNWINDOWPOSFUNC)(GLfloat x, GLfloat y);
+static PFNWINDOWPOSFUNC WindowPosFunc;
+
+static void draw( void )
+{
+ GLfloat angle;
+
+ glClear( GL_COLOR_BUFFER_BIT );
+
+ for (angle = -45.0; angle <= 135.0; angle += 10.0) {
+ GLfloat x = 50.0 + 200.0 * cos( angle * M_PI / 180.0 );
+ GLfloat y = 50.0 + 200.0 * sin( angle * M_PI / 180.0 );
+
+ /* Don't need to worry about the modelview or projection matrices!!! */
+ (*WindowPosFunc)( x, y );
+
+ glDrawPixels( ImgWidth, ImgHeight, ImgFormat, GL_UNSIGNED_BYTE, Image );
+ }
+ glFinish();
+}
+
+
+static void key( unsigned char key, int x, int y )
+{
+ (void) x;
+ (void) y;
+ switch (key) {
+ case 27:
+ exit(0);
+ }
+}
+
+
+/* new window size or exposure */
+static void reshape( int width, int height )
+{
+ glViewport(0, 0, (GLint)width, (GLint)height);
+}
+
+
+static void init( void )
+{
+#ifdef GL_ARB_window_pos
+ if (glutExtensionSupported("GL_ARB_window_pos")) {
+ printf("Using GL_ARB_window_pos\n");
+ WindowPosFunc = &glWindowPos2fARB;
+ }
+ else
+#elif defined(GL_ARB_window_pos)
+ if (glutExtensionSupported("GL_MESA_window_pos")) {
+ printf("Using GL_MESA_window_pos\n");
+ WindowPosFunc = &glWindowPos2fMESA;
+ }
+ else
+#endif
+ {
+ printf("Sorry, GL_ARB/MESA_window_pos extension not available.\n");
+ exit(1);
+ }
+
+ Image = LoadRGBImage( IMAGE_FILE, &ImgWidth, &ImgHeight, &ImgFormat );
+ if (!Image) {
+ printf("Couldn't read %s\n", IMAGE_FILE);
+ exit(0);
+ }
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+}
+
+
+int main( int argc, char *argv[] )
+{
+ glutInitWindowPosition(0, 0);
+ glutInitWindowSize(500, 500);
+ glutInitDisplayMode( GLUT_RGB );
+
+ if (glutCreateWindow("winpos") <= 0) {
+ exit(0);
+ }
+
+ init();
+
+ glutReshapeFunc( reshape );
+ glutKeyboardFunc( key );
+ glutDisplayFunc( draw );
+ glutMainLoop();
+ return 0;
+}