*** empty log message ***
authorJon Taylor <taylorj@ggi-project.org>
Sat, 21 Aug 1999 06:27:37 +0000 (06:27 +0000)
committerJon Taylor <taylorj@ggi-project.org>
Sat, 21 Aug 1999 06:27:37 +0000 (06:27 +0000)
12 files changed:
progs/ggi/asc-view.c [new file with mode: 0644]
progs/ggi/blah [new file with mode: 0644]
progs/ggi/blat [new file with mode: 0644]
progs/ggi/box.asc [new file with mode: 0644]
progs/ggi/cone.asc [new file with mode: 0644]
progs/ggi/gears.c [new file with mode: 0644]
progs/ggi/gears2.c [new file with mode: 0644]
progs/ggi/sphere.asc [new file with mode: 0644]
progs/ggi/torus.asc [new file with mode: 0644]
progs/ggi/tube.asc [new file with mode: 0644]
src/glut/ggi/EXPSYMS [new file with mode: 0644]
src/glut/ggi/ggiglut.c [new file with mode: 0644]

diff --git a/progs/ggi/asc-view.c b/progs/ggi/asc-view.c
new file mode 100644 (file)
index 0000000..16f53e5
--- /dev/null
@@ -0,0 +1,353 @@
+/*
+    test program for the ggi-mesa driver
+
+    Copyright (C) 1997,1998  Uwe Maurer - uwe_maurer@t-online.de
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#include <sys/time.h>
+#include <stdio.h>
+#include <string.h>
+#include <math.h>
+#include <GL/gl.h>
+#include <GL/ggimesa.h>
+#include <ggi/ggi.h>
+#include <stdlib.h>
+
+ggi_visual_t vis,vis_mem;
+
+GGIMesaContext ctx;
+
+int screen_x=320,screen_y=200;
+ggi_graphtype bpp=GT_16BIT;
+
+//#define ZBUFFER
+
+//#define SMOOTH_NORMALS
+
+void Init()
+{
+       GLfloat h=(GLfloat)3/4;
+       GLfloat pos[4]={5,5,-20,0};
+       GLfloat specular[4]={.4,.4,.4,1};
+       GLfloat diffuse[4]={.3,.3,.3,1};
+       GLfloat ambient[4]={.2,.2,.2,1};
+
+       int err;
+
+       if (ggiInit()<0)
+       {
+               printf("ggiInit() failed\n");
+               exit(1);
+       }
+       ctx=GGIMesaCreateContext();
+       if (ctx==NULL)
+       {
+               printf("Can't create Context!\n");
+               exit(1);
+       }
+
+       vis=ggiOpen(NULL);
+       vis_mem=ggiOpen("display-memory",NULL);
+       if (vis==NULL || vis_mem==NULL)
+       {
+               printf("Can't open ggi_visuals!\n");
+               exit(1);
+       }       
+       err=ggiSetGraphMode(vis,screen_x,screen_y,screen_x,screen_y,bpp);
+       err+=ggiSetGraphMode(vis_mem,screen_x,screen_y,screen_x,screen_y,bpp);
+       if (err)
+       {
+               printf("Can't set %ix%i\n",screen_x,screen_y);
+               exit(1);
+       }
+
+       if (GGIMesaSetVisual(ctx,vis_mem,GL_TRUE,GL_FALSE)<0)
+       {
+               printf("GGIMesaSetVisual() failed!\n");
+               exit(1);
+       }
+
+       GGIMesaMakeCurrent(ctx);
+
+       glViewport(0,0,screen_x,screen_y);
+       glMatrixMode(GL_PROJECTION);
+       glLoadIdentity();
+       glFrustum(-1,1,-h,h,1,50);
+       glMatrixMode(GL_MODELVIEW);
+       glLoadIdentity();
+       glTranslatef(0,0,-9);
+       glShadeModel(GL_FLAT);
+
+       glFrontFace(GL_CW);
+       glEnable(GL_CULL_FACE);
+       glEnable(GL_LIGHTING);
+       glEnable(GL_LIGHT0);
+       
+       glLightfv(GL_LIGHT0,GL_POSITION,pos);
+       
+       glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuse);
+       glLightfv(GL_LIGHT0,GL_AMBIENT,ambient);
+       glLightfv(GL_LIGHT0,GL_SPECULAR,specular);
+
+       #ifdef ZBUFFER
+               glEnable(GL_DEPTH_TEST);
+       #endif
+}
+
+
+#define MAX_VERTS 1000
+#define MAX_TRIS  2000
+#define MAX_LEN 1024
+#define MAX_F 100000000
+
+void LoadAsc(GLuint *list,char *file)
+{
+       FILE *fp;
+
+       GLfloat p[MAX_VERTS][3];
+       GLfloat normal[MAX_VERTS][3];
+       float ncount[MAX_VERTS];
+       int v[MAX_TRIS][3];
+       char line[MAX_LEN];
+       char *s;
+       int  i,j;
+       int verts,faces;
+       GLuint v0,v1,v2;
+       GLfloat n[3];
+       GLfloat len,k;
+       GLfloat min[3]={MAX_F,MAX_F,MAX_F};
+       GLfloat max[3]={-MAX_F,-MAX_F,-MAX_F};
+       char *coord_str[]={"X","Z","Y"};
+
+       fp=fopen(file,"r");
+       if (!fp) 
+       {
+               printf("Can't open %s!\n",file);        
+               exit(1);
+       }
+
+       while (strncmp(fgets(line,MAX_LEN,fp),"Tri-mesh",8)) ;
+       
+       s=strstr(line,":")+1;
+       verts=atoi(s);
+       s=strstr(s,":")+1;
+       faces=atoi(s);
+
+       if (verts>MAX_VERTS)    
+       {       
+               printf("Too many vertices..\n");
+               exit(1);
+       }
+       
+       while (strncmp(fgets(line,MAX_LEN,fp),"Vertex list",11)) ;      
+
+       for (i=0;i<verts;i++)
+       {
+               while (strncmp(fgets(line,MAX_LEN,fp),"Vertex",6)) ;    
+               for (j=0;j<3;j++)
+               {       
+                       s=strstr(line,coord_str[j])+2;
+                       k=atoi(s);
+                       if (k>max[j]) max[j]=k;
+                       if (k<min[j]) min[j]=k;
+                       p[i][j]=k;
+               }
+               
+       }
+       len=0;
+       for (i=0;i<3;i++)
+       {
+               k=max[i]-min[i];
+               if (k>len) {len=k;j=i;}
+               n[i]=(max[i]+min[i])/2;
+       }
+
+       len/=2;
+
+       for (i=0;i<verts;i++)
+       {
+               for (j=0;j<3;j++)
+               {
+                       p[i][j]-=n[j];
+                       p[i][j]/=len;
+               }
+       }
+
+       *list=glGenLists(1);
+       glNewList(*list,GL_COMPILE);
+       glBegin(GL_TRIANGLES);
+
+       memset(ncount,0,sizeof(ncount));
+       memset(normal,0,sizeof(normal));
+
+       while (strncmp(fgets(line,MAX_LEN,fp),"Face list",9)) ; 
+       for (i=0;i<faces;i++)
+       {
+               while (strncmp(fgets(line,MAX_LEN,fp),"Face",4)) ;      
+               s=strstr(line,"A")+2;
+               v0=v[i][0]=atoi(s);
+               s=strstr(line,"B")+2;
+               v1=v[i][1]=atoi(s);
+               s=strstr(line,"C")+2;
+               v2=v[i][2]=atoi(s);
+               n[0]=((p[v1][1]-p[v0][1])*(p[v2][2]-p[v0][2]) 
+                       - (p[v1][2]-p[v0][2])*(p[v2][1]-p[v0][1])); 
+               n[1]=((p[v1][2]-p[v0][2])*(p[v2][0]-p[v0][0]) 
+                       - (p[v1][0]-p[v0][0])*(p[v2][2]-p[v0][2])); 
+               n[2]=((p[v1][0]-p[v0][0])*(p[v2][1]-p[v0][1]) 
+                       - (p[v1][1]-p[v0][1])*(p[v2][0]-p[v0][0])); 
+               len=n[0]*n[0]+n[1]*n[1]+n[2]*n[2];
+               len=sqrt(len);
+               n[0]/=len;
+               n[1]/=len;
+               n[2]/=len;
+       #ifdef SMOOTH_NORMALS   
+               for (j=0;j<3;j++){
+                       normal[v[i][j]][0]+=n[0];
+                       normal[v[i][j]][1]+=n[1];
+                       normal[v[i][j]][2]+=n[2];
+                       ncount[v[i][j]]++;
+               }
+       #else
+               glNormal3fv(n);
+               for (j=0;j<3;j++)
+                       glVertex3fv(p[v[i][j]]);
+       #endif
+       }
+
+       #ifdef SMOOTH_NORMALS
+               for (i=0;i<verts;i++) {
+                       for (j=0;j<3;j++) {
+                               normal[i][j]/=ncount[i];
+                       }
+               }
+               for (i=0;i<faces;i++) {
+                       for (j=0;j<3;j++) {
+                               glNormal3f(normal[v[i][j]][0],
+                                          normal[v[i][j]][1],
+                                          normal[v[i][j]][2]);
+                               glVertex3fv(p[v[i][j]]);
+                       }
+               }
+       #endif
+
+       glEnd();
+       glEndList();
+       fclose(fp);
+}
+
+double Display(GLuint l,int *maxframes)
+{
+       int x,y;
+       GLfloat col[]={.25,0,.25,1};
+       int frames=0;
+       struct timeval start,stop;
+       double len;
+       GLfloat rotate=0;
+
+       gettimeofday(&start,NULL);
+
+
+       while(1)
+       {
+               glClearColor(0,0,0,0);
+               glClearIndex(0);
+
+               #ifdef ZBUFFER
+                       glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
+               #else
+                       glClear(GL_COLOR_BUFFER_BIT);
+               #endif  
+
+               glPushMatrix();
+       
+               glRotatef(30,1,0,0);
+               glRotatef(rotate/10,0,0,1);
+               glTranslatef(-6,-4,0);
+               for (y=0;y<3;y++)
+               {
+                       glPushMatrix();
+                       for (x=0;x<5;x++)
+                       {
+                               glPushMatrix();
+                               glRotatef(rotate,y+1,-x-1,0);
+
+                               col[0]=(GLfloat)(x+1)/4;
+                               col[1]=0;
+                               col[2]=(GLfloat)(y+1)/2;
+                               glMaterialfv(GL_FRONT,GL_AMBIENT,col);
+                               glCallList(l);
+                               glPopMatrix();
+                               glTranslatef(3,0,0);
+                       }
+                       glPopMatrix();
+                       glTranslatef(0,4,0);
+               }
+               glPopMatrix();
+               glFinish();
+
+               ggiPutBox(vis,0,0,screen_x,screen_y,ggiDBGetBuffer(vis,0)->read);
+               rotate+=10;
+               frames++;
+               if (frames==(*maxframes)) break;
+
+               if (ggiKbhit(vis))
+               {
+                       *maxframes=frames;
+                       break;
+               }
+       }
+
+       gettimeofday(&stop,NULL);
+       len=(double)(stop.tv_sec-start.tv_sec)+
+               (double)(stop.tv_usec-start.tv_usec)/1e6;       
+       return len;
+}
+
+
+int main(int argc,char **argv)
+{
+       GLuint l;
+       char *file;
+       int maxframes=0;
+       double len;
+
+       Init();
+
+       file=(argc>1) ? argv[1] : "asc/box.asc";
+       if (argc>2) maxframes=atoi(argv[2]);
+
+       if (argc==1)
+       {
+               printf("usage: %s filename.asc\n",argv[0]);
+       }
+
+       LoadAsc(&l,file);
+
+       len=Display(l,&maxframes);
+
+       printf("\ttime: %.3f sec\n",len);
+       printf("\tframes: %i\n",maxframes);
+       printf("\tfps: %.3f \n",(double)maxframes/len);
+
+       GGIMesaDestroyContext(ctx);
+       ggiClose(vis);
+       ggiClose(vis_mem);
+       ggiExit();
+       return 0;
+}
+
diff --git a/progs/ggi/blah b/progs/ggi/blah
new file mode 100644 (file)
index 0000000..2c1664d
--- /dev/null
@@ -0,0 +1,2 @@
+Terminating on signal 11
+
diff --git a/progs/ggi/blat b/progs/ggi/blat
new file mode 100644 (file)
index 0000000..7ff64a9
--- /dev/null
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+function foobar() {
+       echo "foo!"
+}
+
+foobar
diff --git a/progs/ggi/box.asc b/progs/ggi/box.asc
new file mode 100644 (file)
index 0000000..f8b23fd
--- /dev/null
@@ -0,0 +1,66 @@
+Ambient light color: Red=0.039216 Green=0.039216 Blue=0.039216
+
+Named object: "Object01"
+Tri-mesh, Vertices: 8     Faces: 12
+Vertex list:
+Vertex 0:  X: -20     Y: -19.999998     Z: 20.000002
+Vertex 1:  X: 20     Y: -19.999998     Z: 20.000002
+Vertex 2:  X: 20     Y: 20.000002     Z: 19.999998
+Vertex 3:  X: -20     Y: 20.000002     Z: 19.999998
+Vertex 4:  X: -20     Y: -20.000002     Z: -19.999998
+Vertex 5:  X: 20     Y: -20.000002     Z: -19.999998
+Vertex 6:  X: 20     Y: 19.999998     Z: -20.000002
+Vertex 7:  X: -20     Y: 19.999998     Z: -20.000002
+Face list:
+Face 0:    A:0 B:1 C:2 AB:1 BC:1 CA:0
+Smoothing:  1
+Face 1:    A:0 B:2 C:3 AB:0 BC:1 CA:1
+Smoothing:  1
+Face 2:    A:0 B:4 C:5 AB:1 BC:1 CA:0
+Smoothing:  2
+Face 3:    A:0 B:5 C:1 AB:0 BC:1 CA:1
+Smoothing:  2
+Face 4:    A:1 B:5 C:6 AB:1 BC:1 CA:0
+Smoothing:  3
+Face 5:    A:1 B:6 C:2 AB:0 BC:1 CA:1
+Smoothing:  3
+Face 6:    A:2 B:6 C:7 AB:1 BC:1 CA:0
+Smoothing:  4
+Face 7:    A:2 B:7 C:3 AB:0 BC:1 CA:1
+Smoothing:  4
+Face 8:    A:3 B:7 C:4 AB:1 BC:1 CA:0
+Smoothing:  5
+Face 9:    A:3 B:4 C:0 AB:0 BC:1 CA:1
+Smoothing:  5
+Face 10:    A:4 B:7 C:6 AB:1 BC:1 CA:0
+Smoothing:  6
+Face 11:    A:4 B:6 C:5 AB:0 BC:1 CA:1
+Smoothing:  6
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+                                     Page 1
+
+
+
diff --git a/progs/ggi/cone.asc b/progs/ggi/cone.asc
new file mode 100644 (file)
index 0000000..5c52285
--- /dev/null
@@ -0,0 +1,198 @@
+Ambient light color: Red=0.039216 Green=0.039216 Blue=0.039216
+
+Named object: "Object01"
+Tri-mesh, Vertices: 34     Faces: 64
+Vertex list:
+Vertex 0:  X: 60.167416     Y: -87.419525     Z: -53.3088
+Vertex 1:  X: 76.70787     Y: -87.419518     Z: -29.84565
+Vertex 2:  X: 83.0103     Y: -87.419518     Z: -1.838764
+Vertex 3:  X: 78.115204     Y: -87.419518     Z: 26.448057
+Vertex 4:  X: 62.767834     Y: -87.41951     Z: 50.708401
+Vertex 5:  X: 39.304672     Y: -87.41951     Z: 67.248848
+Vertex 6:  X: 11.297782     Y: -87.41951     Z: 73.551254
+Vertex 7:  X: -16.989004     Y: -87.41951     Z: 68.656158
+Vertex 8:  X: -41.249344     Y: -87.41951     Z: 53.308777
+Vertex 9:  X: -57.789783     Y: -87.419518     Z: 29.845612
+Vertex 10:  X: -64.092194     Y: -87.419518     Z: 1.838721
+Vertex 11:  X: -59.197079     Y: -87.419518     Z: -26.448097
+Vertex 12:  X: -43.849678     Y: -87.419525     Z: -50.708427
+Vertex 13:  X: -20.386503     Y: -87.419525     Z: -67.248856
+Vertex 14:  X: 7.62039     Y: -87.419525     Z: -73.551239
+Vertex 15:  X: 35.907204     Y: -87.419525     Z: -68.656105
+Vertex 16:  X: 101.684875     Y: 94.590591     Z: -96.955391
+Vertex 17:  X: 131.767838     Y: 94.590591     Z: -54.281792
+Vertex 18:  X: 143.230377     Y: 94.590599     Z: -3.344275
+Vertex 19:  X: 134.327423     Y: 94.590607     Z: 48.102379
+Vertex 20:  X: 106.414383     Y: 94.590607     Z: 92.225876
+Vertex 21:  X: 63.740765     Y: 94.590607     Z: 122.3088
+Vertex 22:  X: 12.803238     Y: 94.590614     Z: 133.771301
+Vertex 23:  X: -38.643349     Y: 94.590607     Z: 124.868355
+Vertex 24:  X: -82.766846     Y: 94.590607     Z: 96.955307
+Vertex 25:  X: -112.849762     Y: 94.590607     Z: 54.281677
+Vertex 26:  X: -124.312256     Y: 94.590599     Z: 3.344152
+Vertex 27:  X: -115.409271     Y: 94.590591     Z: -48.102493
+Vertex 28:  X: -87.496201     Y: 94.590591     Z: -92.225967
+Vertex 29:  X: -44.822552     Y: 94.590591     Z: -122.308861
+Vertex 30:  X: 6.114983     Y: 94.590584     Z: -133.771332
+Vertex 31:  X: 57.561623     Y: 94.590591     Z: -124.868301
+Vertex 32:  X: 9.459057     Y: -87.419518     Z: 0.000008
+Vertex 33:  X: 9.459057     Y: 94.590599     Z: -0.000008
+Face list:
+Face 0:    A:0 B:1 C:32 AB:1 BC:0 CA:0
+Smoothing:  1
+Face 1:    A:1 B:2 C:32 AB:1 BC:0 CA:0
+Smoothing:  1
+Face 2:    A:2 B:3 C:32 AB:1 BC:0 CA:0
+Smoothing:  1
+Face 3:    A:3 B:4 C:32 AB:1 BC:0 CA:0
+Smoothing:  1
+Face 4:    A:4 B:5 C:32 AB:1 BC:0 CA:0
+Smoothing:  1
+Face 5:    A:5 B:6 C:32 AB:1 BC:0 CA:0
+Smoothing:  1
+Face 6:    A:6 B:7 C:32 AB:1 BC:0 CA:0
+Smoothing:  1
+Face 7:    A:7 B:8 C:32 AB:1 BC:0 CA:0
+Smoothing:  1
+Face 8:    A:8 B:9 C:32 AB:1 BC:0 CA:0
+Smoothing:  1
+Face 9:    A:9 B:10 C:32 AB:1 BC:0 CA:0
+Smoothing:  1
+Face 10:    A:10 B:11 C:32 AB:1 BC:0 CA:0
+
+                                     Page 1
+
+
+
+Smoothing:  1
+Face 11:    A:11 B:12 C:32 AB:1 BC:0 CA:0
+Smoothing:  1
+Face 12:    A:12 B:13 C:32 AB:1 BC:0 CA:0
+Smoothing:  1
+Face 13:    A:13 B:14 C:32 AB:1 BC:0 CA:0
+Smoothing:  1
+Face 14:    A:14 B:15 C:32 AB:1 BC:0 CA:0
+Smoothing:  1
+Face 15:    A:15 B:0 C:32 AB:1 BC:0 CA:0
+Smoothing:  1
+Face 16:    A:0 B:16 C:17 AB:1 BC:1 CA:0
+Smoothing:  2
+Face 17:    A:0 B:17 C:1 AB:0 BC:1 CA:1
+Smoothing:  2
+Face 18:    A:1 B:17 C:18 AB:1 BC:1 CA:0
+Smoothing:  3
+Face 19:    A:1 B:18 C:2 AB:0 BC:1 CA:1
+Smoothing:  3
+Face 20:    A:2 B:18 C:19 AB:1 BC:1 CA:0
+Smoothing:  4
+Face 21:    A:2 B:19 C:3 AB:0 BC:1 CA:1
+Smoothing:  4
+Face 22:    A:3 B:19 C:20 AB:1 BC:1 CA:0
+Smoothing:  5
+Face 23:    A:3 B:20 C:4 AB:0 BC:1 CA:1
+Smoothing:  5
+Face 24:    A:4 B:20 C:21 AB:1 BC:1 CA:0
+Smoothing:  6
+Face 25:    A:4 B:21 C:5 AB:0 BC:1 CA:1
+Smoothing:  6
+Face 26:    A:5 B:21 C:22 AB:1 BC:1 CA:0
+Smoothing:  7
+Face 27:    A:5 B:22 C:6 AB:0 BC:1 CA:1
+Smoothing:  7
+Face 28:    A:6 B:22 C:23 AB:1 BC:1 CA:0
+Smoothing:  8
+Face 29:    A:6 B:23 C:7 AB:0 BC:1 CA:1
+Smoothing:  8
+Face 30:    A:7 B:23 C:24 AB:1 BC:1 CA:0
+Smoothing:  9
+Face 31:    A:7 B:24 C:8 AB:0 BC:1 CA:1
+Smoothing:  9
+Face 32:    A:8 B:24 C:25 AB:1 BC:1 CA:0
+Smoothing:  10
+Face 33:    A:8 B:25 C:9 AB:0 BC:1 CA:1
+Smoothing:  10
+Face 34:    A:9 B:25 C:26 AB:1 BC:1 CA:0
+Smoothing:  11
+Face 35:    A:9 B:26 C:10 AB:0 BC:1 CA:1
+Smoothing:  11
+Face 36:    A:10 B:26 C:27 AB:1 BC:1 CA:0
+Smoothing:  12
+Face 37:    A:10 B:27 C:11 AB:0 BC:1 CA:1
+Smoothing:  12
+Face 38:    A:11 B:27 C:28 AB:1 BC:1 CA:0
+Smoothing:  13
+Face 39:    A:11 B:28 C:12 AB:0 BC:1 CA:1
+Smoothing:  13
+Face 40:    A:12 B:28 C:29 AB:1 BC:1 CA:0
+Smoothing:  14
+
+                                     Page 2
+
+
+
+Face 41:    A:12 B:29 C:13 AB:0 BC:1 CA:1
+Smoothing:  14
+Face 42:    A:13 B:29 C:30 AB:1 BC:1 CA:0
+Smoothing:  15
+Face 43:    A:13 B:30 C:14 AB:0 BC:1 CA:1
+Smoothing:  15
+Face 44:    A:14 B:30 C:31 AB:1 BC:1 CA:0
+Smoothing:  16
+Face 45:    A:14 B:31 C:15 AB:0 BC:1 CA:1
+Smoothing:  16
+Face 46:    A:15 B:31 C:16 AB:1 BC:1 CA:0
+Smoothing:  17
+Face 47:    A:15 B:16 C:0 AB:0 BC:1 CA:1
+Smoothing:  17
+Face 48:    A:16 B:33 C:17 AB:0 BC:0 CA:1
+Smoothing:  18
+Face 49:    A:17 B:33 C:18 AB:0 BC:0 CA:1
+Smoothing:  18
+Face 50:    A:18 B:33 C:19 AB:0 BC:0 CA:1
+Smoothing:  18
+Face 51:    A:19 B:33 C:20 AB:0 BC:0 CA:1
+Smoothing:  18
+Face 52:    A:20 B:33 C:21 AB:0 BC:0 CA:1
+Smoothing:  18
+Face 53:    A:21 B:33 C:22 AB:0 BC:0 CA:1
+Smoothing:  18
+Face 54:    A:22 B:33 C:23 AB:0 BC:0 CA:1
+Smoothing:  18
+Face 55:    A:23 B:33 C:24 AB:0 BC:0 CA:1
+Smoothing:  18
+Face 56:    A:24 B:33 C:25 AB:0 BC:0 CA:1
+Smoothing:  18
+Face 57:    A:25 B:33 C:26 AB:0 BC:0 CA:1
+Smoothing:  18
+Face 58:    A:26 B:33 C:27 AB:0 BC:0 CA:1
+Smoothing:  18
+Face 59:    A:27 B:33 C:28 AB:0 BC:0 CA:1
+Smoothing:  18
+Face 60:    A:28 B:33 C:29 AB:0 BC:0 CA:1
+Smoothing:  18
+Face 61:    A:29 B:33 C:30 AB:0 BC:0 CA:1
+Smoothing:  18
+Face 62:    A:30 B:33 C:31 AB:0 BC:0 CA:1
+Smoothing:  18
+Face 63:    A:31 B:33 C:16 AB:0 BC:0 CA:1
+Smoothing:  18
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+                                     Page 3
+
+
+
diff --git a/progs/ggi/gears.c b/progs/ggi/gears.c
new file mode 100644 (file)
index 0000000..a6b5f7d
--- /dev/null
@@ -0,0 +1,359 @@
+/* $Id: gears.c,v 1.1 1999/08/21 06:27:37 jtaylor Exp $ */
+
+/*
+ * 3-D gear wheels.  This program is in the public domain.
+ *
+ * Brian Paul
+ */
+
+/* Conversion to GLUT by Mark J. Kilgard */
+
+/*
+ * $Log: gears.c,v $
+ * Revision 1.1  1999/08/21 06:27:37  jtaylor
+ * *** empty log message ***
+ *
+ * Revision 1.5  1999/07/31 21:51:09  jtaylor
+ * *** empty log message ***
+ *
+ * Revision 3.2  1999/06/03 17:07:36  brianp
+ * an extra quad was being drawn in front and back faces
+ *
+ * Revision 3.1  1998/11/03 02:49:10  brianp
+ * added fps output
+ *
+ * Revision 3.0  1998/02/14 18:42:29  brianp
+ * initial rev
+ *
+ */
+
+
+#include <math.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <GL/glut.h>
+
+#ifndef M_PI
+#define M_PI 3.14159265
+#endif
+
+static GLint T0 = 0;
+static GLint Frames = 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
+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 %g seconds = %g FPS\n", Frames, seconds, fps);
+        T0 = t;
+        Frames = 0;
+     }
+  }
+}
+
+
+static void
+idle(void)
+{
+  angle += 2.0;
+  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 */
+    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(void)
+{
+  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};
+
+  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);
+}
+
+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);
+  glutCreateWindow("Gears");
+  init();
+
+  glutDisplayFunc(draw);
+  glutReshapeFunc(reshape);
+  glutKeyboardFunc(key);
+  glutSpecialFunc(special);
+  glutVisibilityFunc(visible);
+
+  glutMainLoop();
+  return 0;             /* ANSI C requires main to return int. */
+}
diff --git a/progs/ggi/gears2.c b/progs/ggi/gears2.c
new file mode 100644 (file)
index 0000000..1d1e10d
--- /dev/null
@@ -0,0 +1,359 @@
+/* gears.c */
+
+/*
+ * 3-D gear wheels.  This program is in the public domain.
+ *
+ * Brian Paul
+ * modified by Uwe Maurer (uwe_maurer@t-online.de)
+ */
+
+#include <string.h>
+#include <math.h>
+#include <stdlib.h>
+#include <ggi/ggi.h>
+#include <GL/ggimesa.h>
+#ifndef M_PI
+#  define M_PI 3.14159265
+#endif
+
+
+ggi_visual_t vis;
+char text[100];
+
+/*
+ * 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 );
+      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 );
+      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 GLuint limit;
+static GLuint count = 1;
+
+
+static void draw( void )
+{
+   glClearColor(0,0,0,0);
+   glClearIndex(0);
+   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();
+   glFlush();
+   glFinish();
+
+#if 0
+   ggiSetGCForeground(vis,255);
+   ggiPuts(vis,0,0,"Mesa  ->  GGI");
+   ggiPuts(vis,0,ggiGetInfo(vis)->mode->visible.y," Mesa -> GGI");
+
+   ggiPuts(vis,0,16,text);
+   ggiPuts(vis,0,ggiGetInfo(vis)->mode->visible.y+16,text);
+#endif
+
+   GGIMesaSwapBuffers();
+                       
+   count++;
+   if (count==limit) {
+      exit(1);
+   }
+}
+
+static void idle( void )
+{
+   angle += 2.0;
+   draw();
+}
+
+/* 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 );
+   glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+
+}
+
+
+static void init( void )
+{
+   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 };
+
+   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 );
+   glIndexi(1);
+   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 );
+  glIndexi(2);
+   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 );
+  glIndexi(3);
+   gear( 1.3, 2.0, 0.5, 10, 0.7 );
+   glEndList();
+
+   glEnable( GL_NORMALIZE );
+}
+
+static void usage(char *s)
+{
+ printf("%s visible_x visible_y virtual_x virtual_y bpp db_flag\n",s);
+ printf("example:\n");
+ printf("%s 320 200 320 400 8 1\n",s);
+ exit(1);
+}
+
+int main( int argc, char *argv[] )
+{
+       GGIMesaContext ctx;
+       int vis_x,vis_y,vir_x,vir_y,bpp,db_flag,gt;
+       ggi_mode mode;
+
+       limit=0;
+
+       if (argc<7) usage(argv[0]);
+
+       vis_x=atoi(argv[1]);
+       vis_y=atoi(argv[2]);
+       vir_x=atoi(argv[3]);
+       vir_y=atoi(argv[4]);
+       bpp=atoi(argv[5]);
+       db_flag=atoi(argv[6]);
+
+       switch(bpp)
+       {
+               case 4: gt=GT_4BIT;break;
+               case 8: gt=GT_8BIT;break;
+               case 15:gt=GT_15BIT;break;
+               case 16:gt=GT_16BIT;break;
+               case 24:gt=GT_24BIT;break;
+               case 32:gt=GT_32BIT;break;
+               default:
+                       printf("%i Bits per Pixel ???\n",bpp);
+                       exit(1);
+       } 
+       sprintf(text,"%sx%s %i colors, RGB mode, %s",
+               argv[1],argv[2],1<<bpp,
+               (db_flag) ? "doublebuffer" : "no doublebuffer");
+       if (ggiInit()<0) 
+       {
+               printf("ggiInit() failed\n");
+               exit(1);
+       }
+       ctx=GGIMesaCreateContext(); 
+       if (ctx==NULL)
+       {
+               printf("GGIMesaCreateContext() failed\n");
+               exit(1);
+       }
+
+       vis=ggiOpen(NULL);
+       if (vis==NULL)
+       {
+               printf("ggiOpen() failed\n");
+               exit(1);
+       }
+
+       if (ggiSetGraphMode(vis,vis_x,vis_y,vir_x,vir_y,gt)<0) 
+       {
+               printf("%s: can't set graphmode (%i %i %i %i)  %i BPP\n",
+                       argv[0],vis_x,vis_y,vir_x,vir_y,bpp);
+               exit(1);
+       }
+
+       if (GGIMesaSetVisual(ctx,vis,GL_TRUE,db_flag)<0)
+       {
+               printf ("GGIMesaSetVisual() failed\n");
+               exit(1);
+       }
+
+       GGIMesaMakeCurrent(ctx);
+       ggiGetMode(vis,&mode);
+
+       reshape(mode.visible.x,mode.visible.y);
+
+       init();
+       while (!ggiKbhit(vis)) idle();
+
+       GGIMesaDestroyContext(ctx);
+       ggiClose(vis);
+
+       printf("%s\n",text);
+
+       ggiExit(); 
+       return 0;
+}
diff --git a/progs/ggi/sphere.asc b/progs/ggi/sphere.asc
new file mode 100644 (file)
index 0000000..1424a74
--- /dev/null
@@ -0,0 +1,132 @@
+Ambient light color: Red=0.039216 Green=0.039216 Blue=0.039216\r
+\r
+Named object: "Object01"\r
+Tri-mesh, Vertices: 20     Faces: 36\r
+Vertex list:\r
+Vertex 0:  X: -210     Y: -432.781738     Z: 180.000031\r
+Vertex 1:  X: -610.810303     Y: 144.260559     Z: 103.580154\r
+Vertex 2:  X: 56.586655     Y: 144.260544     Z: -128.902023\r
+Vertex 3:  X: -75.776352     Y: 144.260605     Z: 565.321838\r
+Vertex 4:  X: -462.815979     Y: -347.937683     Z: 131.797302\r
+Vertex 5:  X: -616.506042     Y: -126.67173     Z: 102.494209\r
+Vertex 6:  X: -41.847229     Y: -347.937683     Z: -14.843644\r
+Vertex 7:  X: 60.375015     Y: -126.671753     Z: -133.291641\r
+Vertex 8:  X: -125.336807     Y: -347.937653     Z: 423.046448\r
+Vertex 9:  X: -73.868958     Y: -126.671692     Z: 570.797424\r
+Vertex 10:  X: -448.353271     Y: 237.304672     Z: -92.34951\r
+Vertex 11:  X: -192.440964     Y: 237.304672     Z: -181.494431\r
+Vertex 12:  X: 145.038193     Y: 237.304672     Z: 109.754745\r
+Vertex 13:  X: 94.283768     Y: 237.304688     Z: 375.953766\r
+Vertex 14:  X: -326.684937     Y: 237.304733     Z: 522.594727\r
+Vertex 15:  X: -531.842834     Y: 237.304718     Z: 345.540588\r
+Vertex 16:  X: -331.419525     Y: -225.964966     Z: -168.564438\r
+Vertex 17:  X: 152.575485     Y: -225.964935     Z: 249.129868\r
+Vertex 18:  X: -451.155914     Y: -225.964905     Z: 459.434662\r
+Vertex 19:  X: -298.413483     Y: 423.31897     Z: 163.142761\r
+Face list:\r
+Face 0:    A:0 B:4 C:6 AB:1 BC:1 CA:1\r
+Face 1:    A:4 B:5 C:16 AB:1 BC:1 CA:1\r
+Face 2:    A:4 B:16 C:6 AB:1 BC:1 CA:1\r
+Face 3:    A:6 B:16 C:7 AB:1 BC:1 CA:1\r
+Face 4:    A:5 B:1 C:10 AB:1 BC:1 CA:1\r
+Face 5:    A:5 B:10 C:16 AB:1 BC:1 CA:1\r
+Face 6:    A:16 B:10 C:11 AB:1 BC:1 CA:1\r
+Face 7:    A:16 B:11 C:7 AB:1 BC:1 CA:1\r
+Face 8:    A:7 B:11 C:2 AB:1 BC:1 CA:1\r
+Face 9:    A:0 B:6 C:8 AB:1 BC:1 CA:1\r
+Face 10:    A:6 B:7 C:17 AB:1 BC:1 CA:1\r
+Face 11:    A:6 B:17 C:8 AB:1 BC:1 CA:1\r
+Face 12:    A:8 B:17 C:9 AB:1 BC:1 CA:1\r
+Face 13:    A:7 B:2 C:12 AB:1 BC:1 CA:1\r
+Face 14:    A:7 B:12 C:17 AB:1 BC:1 CA:1\r
+Face 15:    A:17 B:12 C:13 AB:1 BC:1 CA:1\r
+Face 16:    A:17 B:13 C:9 AB:1 BC:1 CA:1\r
+Face 17:    A:9 B:13 C:3 AB:1 BC:1 CA:1\r
+Face 18:    A:0 B:8 C:4 AB:1 BC:1 CA:1\r
+Face 19:    A:8 B:9 C:18 AB:1 BC:1 CA:1\r
+Face 20:    A:8 B:18 C:4 AB:1 BC:1 CA:1\r
+Face 21:    A:4 B:18 C:5 AB:1 BC:1 CA:1\r
+Face 22:    A:9 B:3 C:14 AB:1 BC:1 CA:1\r
+Face 23:    A:9 B:14 C:18 AB:1 BC:1 CA:1\r
+Face 24:    A:18 B:14 C:15 AB:1 BC:1 CA:1\r
+Face 25:    A:18 B:15 C:5 AB:1 BC:1 CA:1\r
+Face 26:    A:5 B:15 C:1 AB:1 BC:1 CA:1\r
+Face 27:    A:1 B:15 C:10 AB:1 BC:1 CA:1\r
+Face 28:    A:15 B:14 C:19 AB:1 BC:1 CA:1\r
+Face 29:    A:15 B:19 C:10 AB:1 BC:1 CA:1\r
+Face 30:    A:10 B:19 C:11 AB:1 BC:1 CA:1\r
+Face 31:    A:14 B:3 C:13 AB:1 BC:1 CA:1\r
+Face 32:    A:14 B:13 C:19 AB:1 BC:1 CA:1\r
+Face 33:    A:19 B:13 C:12 AB:1 BC:1 CA:1\r
+Face 34:    A:19 B:12 C:11 AB:1 BC:1 CA:1\r
+\r
+                                     Page 1\r
+\r
+\r
+\r
+Face 35:    A:11 B:12 C:2 AB:1 BC:1 CA:1\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+                                     Page 2\r
+\r
+\r
+\r
diff --git a/progs/ggi/torus.asc b/progs/ggi/torus.asc
new file mode 100644 (file)
index 0000000..6bd41f4
--- /dev/null
@@ -0,0 +1,264 @@
+Ambient light color: Red=0.039216 Green=0.039216 Blue=0.039216\r
+\r
+Named object: "Object01"\r
+Tri-mesh, Vertices: 40     Faces: 80\r
+Vertex list:\r
+Vertex 0:  X: -50.170624     Y: -0.000026     Z: -240.147842\r
+Vertex 1:  X: -80.584503     Y: -63.958851     Z: -205.014572\r
+Vertex 2:  X: -129.795166     Y: -39.528744     Z: -148.16774\r
+Vertex 3:  X: -129.795166     Y: 39.528721     Z: -148.16774\r
+Vertex 4:  X: -80.584503     Y: 63.958797     Z: -205.014572\r
+Vertex 5:  X: 85.963654     Y: -0.000002     Z: 31.490465\r
+Vertex 6:  X: 39.614838     Y: -63.958828     Z: 34.827602\r
+Vertex 7:  X: -35.37915     Y: -39.528728     Z: 40.227196\r
+Vertex 8:  X: -35.37912     Y: 39.528736     Z: 40.227188\r
+Vertex 9:  X: 39.614838     Y: 63.95882     Z: 34.827595\r
+Vertex 10:  X: -9.852051     Y: 0.000023     Z: 319.829254\r
+Vertex 11:  X: -44.985352     Y: -63.958805     Z: 289.415405\r
+Vertex 12:  X: -101.832199     Y: -39.528709     Z: 240.204758\r
+Vertex 13:  X: -101.832184     Y: 39.528755     Z: 240.204773\r
+Vertex 14:  X: -44.985352     Y: 63.958843     Z: 289.415405\r
+Vertex 15:  X: -281.490326     Y: 0.000035     Z: 455.963654\r
+Vertex 16:  X: -284.827484     Y: -63.958794     Z: 409.614868\r
+Vertex 17:  X: -290.227112     Y: -39.528702     Z: 334.62085\r
+Vertex 18:  X: -290.227112     Y: 39.528763     Z: 334.62088\r
+Vertex 19:  X: -284.827484     Y: 63.958855     Z: 409.614838\r
+Vertex 20:  X: -569.829163     Y: 0.000026     Z: 360.14798\r
+Vertex 21:  X: -539.415344     Y: -63.958801     Z: 325.014709\r
+Vertex 22:  X: -490.204712     Y: -39.528709     Z: 268.167847\r
+Vertex 23:  X: -490.204712     Y: 39.528755     Z: 268.167847\r
+Vertex 24:  X: -539.415344     Y: 63.958847     Z: 325.014679\r
+Vertex 25:  X: -705.963684     Y: 0.000002     Z: 88.509598\r
+Vertex 26:  X: -659.614807     Y: -63.958824     Z: 85.172462\r
+Vertex 27:  X: -584.62085     Y: -39.528725     Z: 79.77285\r
+Vertex 28:  X: -584.62085     Y: 39.52874     Z: 79.77285\r
+Vertex 29:  X: -659.614868     Y: 63.958824     Z: 85.172447\r
+Vertex 30:  X: -610.147827     Y: -0.000023     Z: -199.829361\r
+Vertex 31:  X: -575.014587     Y: -63.958847     Z: -169.415497\r
+Vertex 32:  X: -518.167725     Y: -39.528744     Z: -120.204819\r
+Vertex 33:  X: -518.167725     Y: 39.528721     Z: -120.204834\r
+Vertex 34:  X: -575.014587     Y: 63.958801     Z: -169.415497\r
+Vertex 35:  X: -338.509338     Y: -0.000035     Z: -335.963745\r
+Vertex 36:  X: -335.172241     Y: -63.958858     Z: -289.614868\r
+Vertex 37:  X: -329.772675     Y: -39.528751     Z: -214.620865\r
+Vertex 38:  X: -329.772675     Y: 39.528713     Z: -214.620865\r
+Vertex 39:  X: -335.172241     Y: 63.95879     Z: -289.614899\r
+Face list:\r
+Face 0:    A:0 B:6 C:1 AB:0 BC:1 CA:1\r
+Smoothing:  1\r
+Face 1:    A:0 B:5 C:6 AB:1 BC:1 CA:0\r
+Smoothing:  1\r
+Face 2:    A:1 B:7 C:2 AB:0 BC:1 CA:1\r
+Smoothing:  2\r
+Face 3:    A:1 B:6 C:7 AB:1 BC:1 CA:0\r
+Smoothing:  2\r
+Face 4:    A:2 B:8 C:3 AB:0 BC:1 CA:1\r
+Smoothing:  3\r
+Face 5:    A:2 B:7 C:8 AB:1 BC:1 CA:0\r
+Smoothing:  3\r
+Face 6:    A:3 B:9 C:4 AB:0 BC:1 CA:1\r
+Smoothing:  4\r
+Face 7:    A:3 B:8 C:9 AB:1 BC:1 CA:0\r
+\r
+                                     Page 1\r
+\r
+\r
+\r
+Smoothing:  4\r
+Face 8:    A:4 B:5 C:0 AB:0 BC:1 CA:1\r
+Smoothing:  5\r
+Face 9:    A:4 B:9 C:5 AB:1 BC:1 CA:0\r
+Smoothing:  5\r
+Face 10:    A:5 B:11 C:6 AB:0 BC:1 CA:1\r
+Smoothing:  6\r
+Face 11:    A:5 B:10 C:11 AB:1 BC:1 CA:0\r
+Smoothing:  6\r
+Face 12:    A:6 B:12 C:7 AB:0 BC:1 CA:1\r
+Smoothing:  7\r
+Face 13:    A:6 B:11 C:12 AB:1 BC:1 CA:0\r
+Smoothing:  7\r
+Face 14:    A:7 B:13 C:8 AB:0 BC:1 CA:1\r
+Smoothing:  8\r
+Face 15:    A:7 B:12 C:13 AB:1 BC:1 CA:0\r
+Smoothing:  8\r
+Face 16:    A:8 B:14 C:9 AB:0 BC:1 CA:1\r
+Smoothing:  9\r
+Face 17:    A:8 B:13 C:14 AB:1 BC:1 CA:0\r
+Smoothing:  9\r
+Face 18:    A:9 B:10 C:5 AB:0 BC:1 CA:1\r
+Smoothing:  10\r
+Face 19:    A:9 B:14 C:10 AB:1 BC:1 CA:0\r
+Smoothing:  10\r
+Face 20:    A:10 B:16 C:11 AB:0 BC:1 CA:1\r
+Smoothing:  11\r
+Face 21:    A:10 B:15 C:16 AB:1 BC:1 CA:0\r
+Smoothing:  11\r
+Face 22:    A:11 B:17 C:12 AB:0 BC:1 CA:1\r
+Smoothing:  12\r
+Face 23:    A:11 B:16 C:17 AB:1 BC:1 CA:0\r
+Smoothing:  12\r
+Face 24:    A:12 B:18 C:13 AB:0 BC:1 CA:1\r
+Smoothing:  13\r
+Face 25:    A:12 B:17 C:18 AB:1 BC:1 CA:0\r
+Smoothing:  13\r
+Face 26:    A:13 B:19 C:14 AB:0 BC:1 CA:1\r
+Smoothing:  14\r
+Face 27:    A:13 B:18 C:19 AB:1 BC:1 CA:0\r
+Smoothing:  14\r
+Face 28:    A:14 B:15 C:10 AB:0 BC:1 CA:1\r
+Smoothing:  15\r
+Face 29:    A:14 B:19 C:15 AB:1 BC:1 CA:0\r
+Smoothing:  15\r
+Face 30:    A:15 B:21 C:16 AB:0 BC:1 CA:1\r
+Smoothing:  16\r
+Face 31:    A:15 B:20 C:21 AB:1 BC:1 CA:0\r
+Smoothing:  16\r
+Face 32:    A:16 B:22 C:17 AB:0 BC:1 CA:1\r
+Smoothing:  17\r
+Face 33:    A:16 B:21 C:22 AB:1 BC:1 CA:0\r
+Smoothing:  17\r
+Face 34:    A:17 B:23 C:18 AB:0 BC:1 CA:1\r
+Smoothing:  18\r
+Face 35:    A:17 B:22 C:23 AB:1 BC:1 CA:0\r
+Smoothing:  18\r
+Face 36:    A:18 B:24 C:19 AB:0 BC:1 CA:1\r
+Smoothing:  19\r
+Face 37:    A:18 B:23 C:24 AB:1 BC:1 CA:0\r
+Smoothing:  19\r
+\r
+                                     Page 2\r
+\r
+\r
+\r
+Face 38:    A:19 B:20 C:15 AB:0 BC:1 CA:1\r
+Smoothing:  20\r
+Face 39:    A:19 B:24 C:20 AB:1 BC:1 CA:0\r
+Smoothing:  20\r
+Face 40:    A:20 B:26 C:21 AB:0 BC:1 CA:1\r
+Smoothing:  21\r
+Face 41:    A:20 B:25 C:26 AB:1 BC:1 CA:0\r
+Smoothing:  21\r
+Face 42:    A:21 B:27 C:22 AB:0 BC:1 CA:1\r
+Smoothing:  22\r
+Face 43:    A:21 B:26 C:27 AB:1 BC:1 CA:0\r
+Smoothing:  22\r
+Face 44:    A:22 B:28 C:23 AB:0 BC:1 CA:1\r
+Smoothing:  23\r
+Face 45:    A:22 B:27 C:28 AB:1 BC:1 CA:0\r
+Smoothing:  23\r
+Face 46:    A:23 B:29 C:24 AB:0 BC:1 CA:1\r
+Smoothing:  24\r
+Face 47:    A:23 B:28 C:29 AB:1 BC:1 CA:0\r
+Smoothing:  24\r
+Face 48:    A:24 B:25 C:20 AB:0 BC:1 CA:1\r
+Smoothing:  25\r
+Face 49:    A:24 B:29 C:25 AB:1 BC:1 CA:0\r
+Smoothing:  25\r
+Face 50:    A:25 B:31 C:26 AB:0 BC:1 CA:1\r
+Smoothing:  26\r
+Face 51:    A:25 B:30 C:31 AB:1 BC:1 CA:0\r
+Smoothing:  26\r
+Face 52:    A:26 B:32 C:27 AB:0 BC:1 CA:1\r
+Smoothing:  27\r
+Face 53:    A:26 B:31 C:32 AB:1 BC:1 CA:0\r
+Smoothing:  27\r
+Face 54:    A:27 B:33 C:28 AB:0 BC:1 CA:1\r
+Smoothing:  28\r
+Face 55:    A:27 B:32 C:33 AB:1 BC:1 CA:0\r
+Smoothing:  28\r
+Face 56:    A:28 B:34 C:29 AB:0 BC:1 CA:1\r
+Smoothing:  29\r
+Face 57:    A:28 B:33 C:34 AB:1 BC:1 CA:0\r
+Smoothing:  29\r
+Face 58:    A:29 B:30 C:25 AB:0 BC:1 CA:1\r
+Smoothing:  30\r
+Face 59:    A:29 B:34 C:30 AB:1 BC:1 CA:0\r
+Smoothing:  30\r
+Face 60:    A:30 B:36 C:31 AB:0 BC:1 CA:1\r
+Smoothing:  31\r
+Face 61:    A:30 B:35 C:36 AB:1 BC:1 CA:0\r
+Smoothing:  31\r
+Face 62:    A:31 B:37 C:32 AB:0 BC:1 CA:1\r
+Smoothing:  32\r
+Face 63:    A:31 B:36 C:37 AB:1 BC:1 CA:0\r
+Smoothing:  32\r
+Face 64:    A:32 B:38 C:33 AB:0 BC:1 CA:1\r
+Smoothing:  1\r
+Face 65:    A:32 B:37 C:38 AB:1 BC:1 CA:0\r
+Smoothing:  1\r
+Face 66:    A:33 B:39 C:34 AB:0 BC:1 CA:1\r
+Smoothing:  2\r
+Face 67:    A:33 B:38 C:39 AB:1 BC:1 CA:0\r
+Smoothing:  2\r
+Face 68:    A:34 B:35 C:30 AB:0 BC:1 CA:1\r
+\r
+                                     Page 3\r
+\r
+\r
+\r
+Smoothing:  3\r
+Face 69:    A:34 B:39 C:35 AB:1 BC:1 CA:0\r
+Smoothing:  3\r
+Face 70:    A:35 B:1 C:36 AB:0 BC:1 CA:1\r
+Smoothing:  4\r
+Face 71:    A:35 B:0 C:1 AB:1 BC:1 CA:0\r
+Smoothing:  4\r
+Face 72:    A:36 B:2 C:37 AB:0 BC:1 CA:1\r
+Smoothing:  5\r
+Face 73:    A:36 B:1 C:2 AB:1 BC:1 CA:0\r
+Smoothing:  5\r
+Face 74:    A:37 B:3 C:38 AB:0 BC:1 CA:1\r
+Smoothing:  6\r
+Face 75:    A:37 B:2 C:3 AB:1 BC:1 CA:0\r
+Smoothing:  6\r
+Face 76:    A:38 B:4 C:39 AB:0 BC:1 CA:1\r
+Smoothing:  7\r
+Face 77:    A:38 B:3 C:4 AB:1 BC:1 CA:0\r
+Smoothing:  7\r
+Face 78:    A:39 B:0 C:35 AB:0 BC:1 CA:1\r
+Smoothing:  8\r
+Face 79:    A:39 B:4 C:0 AB:1 BC:1 CA:0\r
+Smoothing:  8\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+                                     Page 4\r
+\r
+\r
+\r
diff --git a/progs/ggi/tube.asc b/progs/ggi/tube.asc
new file mode 100644 (file)
index 0000000..0b5dd0d
--- /dev/null
@@ -0,0 +1,396 @@
+Ambient light color: Red=0.039216 Green=0.039216 Blue=0.039216
+
+Named object: "Object01"
+Tri-mesh, Vertices: 64     Faces: 128
+Vertex list:
+Vertex 0:  X: 61.483898     Y: 37.836231     Z: -70.94294
+Vertex 1:  X: 82.867447     Y: 37.836235     Z: -41.288902
+Vertex 2:  X: 91.275154     Y: 37.836239     Z: -5.70901
+Vertex 3:  X: 85.427025     Y: 37.836243     Z: 30.380013
+Vertex 4:  X: 66.213379     Y: 37.836243     Z: 61.483936
+Vertex 5:  X: 36.559322     Y: 37.836246     Z: 82.86747
+Vertex 6:  X: 0.979424     Y: 37.836246     Z: 91.275154
+Vertex 7:  X: -35.109554     Y: 37.836246     Z: 85.42701
+Vertex 8:  X: -66.213478     Y: 37.836246     Z: 66.213356
+Vertex 9:  X: -87.597     Y: 37.836243     Z: 36.559303
+Vertex 10:  X: -96.004677     Y: 37.836239     Z: 0.979406
+Vertex 11:  X: -90.156517     Y: 37.836235     Z: -35.109615
+Vertex 12:  X: -70.942848     Y: 37.836235     Z: -66.213516
+Vertex 13:  X: -41.288776     Y: 37.836231     Z: -87.597023
+Vertex 14:  X: -5.708872     Y: 37.836231     Z: -96.004692
+Vertex 15:  X: 30.380142     Y: 37.836231     Z: -90.156502
+Vertex 16:  X: 61.483898     Y: -38.14529     Z: -70.942932
+Vertex 17:  X: 82.867447     Y: -38.145287     Z: -41.288895
+Vertex 18:  X: 91.275154     Y: -38.145283     Z: -5.709003
+Vertex 19:  X: 85.427025     Y: -38.145279     Z: 30.38002
+Vertex 20:  X: 66.213379     Y: -38.145279     Z: 61.483944
+Vertex 21:  X: 36.559322     Y: -38.145275     Z: 82.867477
+Vertex 22:  X: 0.979424     Y: -38.145275     Z: 91.275162
+Vertex 23:  X: -35.109554     Y: -38.145275     Z: 85.427017
+Vertex 24:  X: -66.213478     Y: -38.145275     Z: 66.213364
+Vertex 25:  X: -87.597     Y: -38.145279     Z: 36.559311
+Vertex 26:  X: -96.004677     Y: -38.145283     Z: 0.979412
+Vertex 27:  X: -90.156517     Y: -38.145287     Z: -35.109608
+Vertex 28:  X: -70.942848     Y: -38.145287     Z: -66.213516
+Vertex 29:  X: -41.288776     Y: -38.14529     Z: -87.597015
+Vertex 30:  X: -5.708872     Y: -38.14529     Z: -96.004684
+Vertex 31:  X: 30.380142     Y: -38.14529     Z: -90.156494
+Vertex 32:  X: 29.53923     Y: 37.836235     Z: -36.632011
+Vertex 33:  X: 40.224194     Y: 37.836239     Z: -21.814436
+Vertex 34:  X: 44.425369     Y: 37.836239     Z: -4.035822
+Vertex 35:  X: 41.503166     Y: 37.836239     Z: 13.997195
+Vertex 36:  X: 31.902466     Y: 37.836243     Z: 29.539249
+Vertex 37:  X: 17.084883     Y: 37.836243     Z: 40.224201
+Vertex 38:  X: -0.693734     Y: 37.836243     Z: 44.425365
+Vertex 39:  X: -18.726728     Y: 37.836243     Z: 41.503159
+Vertex 40:  X: -34.26878     Y: 37.836243     Z: 31.902454
+Vertex 41:  X: -44.953732     Y: 37.836239     Z: 17.084871
+Vertex 42:  X: -49.154892     Y: 37.836239     Z: -0.693745
+Vertex 43:  X: -46.232677     Y: 37.836239     Z: -18.726759
+Vertex 44:  X: -36.631962     Y: 37.836235     Z: -34.268806
+Vertex 45:  X: -21.814371     Y: 37.836235     Z: -44.953747
+Vertex 46:  X: -4.035751     Y: 37.836235     Z: -49.1549
+Vertex 47:  X: 13.997261     Y: 37.836235     Z: -46.23267
+Vertex 48:  X: 29.53923     Y: -38.145287     Z: -36.632004
+Vertex 49:  X: 40.224194     Y: -38.145283     Z: -21.814428
+Vertex 50:  X: 44.425369     Y: -38.145283     Z: -4.035816
+Vertex 51:  X: 41.503166     Y: -38.145283     Z: 13.997201
+Vertex 52:  X: 31.902466     Y: -38.145279     Z: 29.539257
+Vertex 53:  X: 17.084883     Y: -38.145279     Z: 40.224209
+Vertex 54:  X: -0.693734     Y: -38.145279     Z: 44.425373
+Vertex 55:  X: -18.726728     Y: -38.145279     Z: 41.503166
+
+                                     Page 1
+
+
+
+Vertex 56:  X: -34.26878     Y: -38.145279     Z: 31.902462
+Vertex 57:  X: -44.953732     Y: -38.145283     Z: 17.084879
+Vertex 58:  X: -49.154892     Y: -38.145283     Z: -0.693738
+Vertex 59:  X: -46.232677     Y: -38.145283     Z: -18.726751
+Vertex 60:  X: -36.631962     Y: -38.145287     Z: -34.268799
+Vertex 61:  X: -21.814371     Y: -38.145287     Z: -44.953739
+Vertex 62:  X: -4.035751     Y: -38.145287     Z: -49.154892
+Vertex 63:  X: 13.997261     Y: -38.145287     Z: -46.232662
+Face list:
+Face 0:    A:0 B:1 C:17 AB:1 BC:1 CA:0
+Smoothing:  1
+Face 1:    A:0 B:17 C:16 AB:0 BC:1 CA:1
+Smoothing:  1
+Face 2:    A:1 B:2 C:18 AB:1 BC:1 CA:0
+Smoothing:  2
+Face 3:    A:1 B:18 C:17 AB:0 BC:1 CA:1
+Smoothing:  2
+Face 4:    A:2 B:3 C:19 AB:1 BC:1 CA:0
+Smoothing:  3
+Face 5:    A:2 B:19 C:18 AB:0 BC:1 CA:1
+Smoothing:  3
+Face 6:    A:3 B:4 C:20 AB:1 BC:1 CA:0
+Smoothing:  4
+Face 7:    A:3 B:20 C:19 AB:0 BC:1 CA:1
+Smoothing:  4
+Face 8:    A:4 B:5 C:21 AB:1 BC:1 CA:0
+Smoothing:  5
+Face 9:    A:4 B:21 C:20 AB:0 BC:1 CA:1
+Smoothing:  5
+Face 10:    A:5 B:6 C:22 AB:1 BC:1 CA:0
+Smoothing:  6
+Face 11:    A:5 B:22 C:21 AB:0 BC:1 CA:1
+Smoothing:  6
+Face 12:    A:6 B:7 C:23 AB:1 BC:1 CA:0
+Smoothing:  7
+Face 13:    A:6 B:23 C:22 AB:0 BC:1 CA:1
+Smoothing:  7
+Face 14:    A:7 B:8 C:24 AB:1 BC:1 CA:0
+Smoothing:  8
+Face 15:    A:7 B:24 C:23 AB:0 BC:1 CA:1
+Smoothing:  8
+Face 16:    A:8 B:9 C:25 AB:1 BC:1 CA:0
+Smoothing:  9
+Face 17:    A:8 B:25 C:24 AB:0 BC:1 CA:1
+Smoothing:  9
+Face 18:    A:9 B:10 C:26 AB:1 BC:1 CA:0
+Smoothing:  10
+Face 19:    A:9 B:26 C:25 AB:0 BC:1 CA:1
+Smoothing:  10
+Face 20:    A:10 B:11 C:27 AB:1 BC:1 CA:0
+Smoothing:  11
+Face 21:    A:10 B:27 C:26 AB:0 BC:1 CA:1
+Smoothing:  11
+Face 22:    A:11 B:12 C:28 AB:1 BC:1 CA:0
+Smoothing:  12
+Face 23:    A:11 B:28 C:27 AB:0 BC:1 CA:1
+Smoothing:  12
+Face 24:    A:12 B:13 C:29 AB:1 BC:1 CA:0
+Smoothing:  13
+Face 25:    A:12 B:29 C:28 AB:0 BC:1 CA:1
+Smoothing:  13
+
+                                     Page 2
+
+
+
+Face 26:    A:13 B:14 C:30 AB:1 BC:1 CA:0
+Smoothing:  14
+Face 27:    A:13 B:30 C:29 AB:0 BC:1 CA:1
+Smoothing:  14
+Face 28:    A:14 B:15 C:31 AB:1 BC:1 CA:0
+Smoothing:  15
+Face 29:    A:14 B:31 C:30 AB:0 BC:1 CA:1
+Smoothing:  15
+Face 30:    A:15 B:0 C:16 AB:1 BC:1 CA:0
+Smoothing:  16
+Face 31:    A:15 B:16 C:31 AB:0 BC:1 CA:1
+Smoothing:  16
+Face 32:    A:32 B:49 C:33 AB:0 BC:1 CA:1
+Smoothing:  17
+Face 33:    A:32 B:48 C:49 AB:1 BC:1 CA:0
+Smoothing:  17
+Face 34:    A:33 B:50 C:34 AB:0 BC:1 CA:1
+Smoothing:  18
+Face 35:    A:33 B:49 C:50 AB:1 BC:1 CA:0
+Smoothing:  18
+Face 36:    A:34 B:51 C:35 AB:0 BC:1 CA:1
+Smoothing:  19
+Face 37:    A:34 B:50 C:51 AB:1 BC:1 CA:0
+Smoothing:  19
+Face 38:    A:35 B:52 C:36 AB:0 BC:1 CA:1
+Smoothing:  20
+Face 39:    A:35 B:51 C:52 AB:1 BC:1 CA:0
+Smoothing:  20
+Face 40:    A:36 B:53 C:37 AB:0 BC:1 CA:1
+Smoothing:  21
+Face 41:    A:36 B:52 C:53 AB:1 BC:1 CA:0
+Smoothing:  21
+Face 42:    A:37 B:54 C:38 AB:0 BC:1 CA:1
+Smoothing:  22
+Face 43:    A:37 B:53 C:54 AB:1 BC:1 CA:0
+Smoothing:  22
+Face 44:    A:38 B:55 C:39 AB:0 BC:1 CA:1
+Smoothing:  23
+Face 45:    A:38 B:54 C:55 AB:1 BC:1 CA:0
+Smoothing:  23
+Face 46:    A:39 B:56 C:40 AB:0 BC:1 CA:1
+Smoothing:  24
+Face 47:    A:39 B:55 C:56 AB:1 BC:1 CA:0
+Smoothing:  24
+Face 48:    A:40 B:57 C:41 AB:0 BC:1 CA:1
+Smoothing:  25
+Face 49:    A:40 B:56 C:57 AB:1 BC:1 CA:0
+Smoothing:  25
+Face 50:    A:41 B:58 C:42 AB:0 BC:1 CA:1
+Smoothing:  26
+Face 51:    A:41 B:57 C:58 AB:1 BC:1 CA:0
+Smoothing:  26
+Face 52:    A:42 B:59 C:43 AB:0 BC:1 CA:1
+Smoothing:  27
+Face 53:    A:42 B:58 C:59 AB:1 BC:1 CA:0
+Smoothing:  27
+Face 54:    A:43 B:60 C:44 AB:0 BC:1 CA:1
+Smoothing:  28
+Face 55:    A:43 B:59 C:60 AB:1 BC:1 CA:0
+Smoothing:  28
+Face 56:    A:44 B:61 C:45 AB:0 BC:1 CA:1
+
+                                     Page 3
+
+
+
+Smoothing:  29
+Face 57:    A:44 B:60 C:61 AB:1 BC:1 CA:0
+Smoothing:  29
+Face 58:    A:45 B:62 C:46 AB:0 BC:1 CA:1
+Smoothing:  30
+Face 59:    A:45 B:61 C:62 AB:1 BC:1 CA:0
+Smoothing:  30
+Face 60:    A:46 B:63 C:47 AB:0 BC:1 CA:1
+Smoothing:  31
+Face 61:    A:46 B:62 C:63 AB:1 BC:1 CA:0
+Smoothing:  31
+Face 62:    A:47 B:48 C:32 AB:0 BC:1 CA:1
+Smoothing:  32
+Face 63:    A:47 B:63 C:48 AB:1 BC:1 CA:0
+Smoothing:  32
+Face 64:    A:0 B:32 C:33 AB:0 BC:1 CA:0
+Smoothing:  1
+Face 65:    A:0 B:33 C:1 AB:0 BC:0 CA:1
+Smoothing:  1
+Face 66:    A:1 B:33 C:34 AB:0 BC:1 CA:0
+Smoothing:  1
+Face 67:    A:1 B:34 C:2 AB:0 BC:0 CA:1
+Smoothing:  1
+Face 68:    A:2 B:34 C:35 AB:0 BC:1 CA:0
+Smoothing:  1
+Face 69:    A:2 B:35 C:3 AB:0 BC:0 CA:1
+Smoothing:  1
+Face 70:    A:3 B:35 C:36 AB:0 BC:1 CA:0
+Smoothing:  1
+Face 71:    A:3 B:36 C:4 AB:0 BC:0 CA:1
+Smoothing:  1
+Face 72:    A:4 B:36 C:37 AB:0 BC:1 CA:0
+Smoothing:  1
+Face 73:    A:4 B:37 C:5 AB:0 BC:0 CA:1
+Smoothing:  1
+Face 74:    A:5 B:37 C:38 AB:0 BC:1 CA:0
+Smoothing:  1
+Face 75:    A:5 B:38 C:6 AB:0 BC:0 CA:1
+Smoothing:  1
+Face 76:    A:6 B:38 C:39 AB:0 BC:1 CA:0
+Smoothing:  1
+Face 77:    A:6 B:39 C:7 AB:0 BC:0 CA:1
+Smoothing:  1
+Face 78:    A:7 B:39 C:40 AB:0 BC:1 CA:0
+Smoothing:  1
+Face 79:    A:7 B:40 C:8 AB:0 BC:0 CA:1
+Smoothing:  1
+Face 80:    A:8 B:40 C:41 AB:0 BC:1 CA:0
+Smoothing:  1
+Face 81:    A:8 B:41 C:9 AB:0 BC:0 CA:1
+Smoothing:  1
+Face 82:    A:9 B:41 C:42 AB:0 BC:1 CA:0
+Smoothing:  1
+Face 83:    A:9 B:42 C:10 AB:0 BC:0 CA:1
+Smoothing:  1
+Face 84:    A:10 B:42 C:43 AB:0 BC:1 CA:0
+Smoothing:  1
+Face 85:    A:10 B:43 C:11 AB:0 BC:0 CA:1
+Smoothing:  1
+Face 86:    A:11 B:43 C:44 AB:0 BC:1 CA:0
+Smoothing:  1
+
+                                     Page 4
+
+
+
+Face 87:    A:11 B:44 C:12 AB:0 BC:0 CA:1
+Smoothing:  1
+Face 88:    A:12 B:44 C:45 AB:0 BC:1 CA:0
+Smoothing:  1
+Face 89:    A:12 B:45 C:13 AB:0 BC:0 CA:1
+Smoothing:  1
+Face 90:    A:13 B:45 C:46 AB:0 BC:1 CA:0
+Smoothing:  1
+Face 91:    A:13 B:46 C:14 AB:0 BC:0 CA:1
+Smoothing:  1
+Face 92:    A:14 B:46 C:47 AB:0 BC:1 CA:0
+Smoothing:  1
+Face 93:    A:14 B:47 C:15 AB:0 BC:0 CA:1
+Smoothing:  1
+Face 94:    A:15 B:47 C:32 AB:0 BC:1 CA:0
+Smoothing:  1
+Face 95:    A:15 B:32 C:0 AB:0 BC:0 CA:1
+Smoothing:  1
+Face 96:    A:16 B:17 C:49 AB:1 BC:0 CA:0
+Smoothing:  2
+Face 97:    A:16 B:49 C:48 AB:0 BC:1 CA:0
+Smoothing:  2
+Face 98:    A:17 B:18 C:50 AB:1 BC:0 CA:0
+Smoothing:  2
+Face 99:    A:17 B:50 C:49 AB:0 BC:1 CA:0
+Smoothing:  2
+Face 100:    A:18 B:19 C:51 AB:1 BC:0 CA:0
+Smoothing:  2
+Face 101:    A:18 B:51 C:50 AB:0 BC:1 CA:0
+Smoothing:  2
+Face 102:    A:19 B:20 C:52 AB:1 BC:0 CA:0
+Smoothing:  2
+Face 103:    A:19 B:52 C:51 AB:0 BC:1 CA:0
+Smoothing:  2
+Face 104:    A:20 B:21 C:53 AB:1 BC:0 CA:0
+Smoothing:  2
+Face 105:    A:20 B:53 C:52 AB:0 BC:1 CA:0
+Smoothing:  2
+Face 106:    A:21 B:22 C:54 AB:1 BC:0 CA:0
+Smoothing:  2
+Face 107:    A:21 B:54 C:53 AB:0 BC:1 CA:0
+Smoothing:  2
+Face 108:    A:22 B:23 C:55 AB:1 BC:0 CA:0
+Smoothing:  2
+Face 109:    A:22 B:55 C:54 AB:0 BC:1 CA:0
+Smoothing:  2
+Face 110:    A:23 B:24 C:56 AB:1 BC:0 CA:0
+Smoothing:  2
+Face 111:    A:23 B:56 C:55 AB:0 BC:1 CA:0
+Smoothing:  2
+Face 112:    A:24 B:25 C:57 AB:1 BC:0 CA:0
+Smoothing:  2
+Face 113:    A:24 B:57 C:56 AB:0 BC:1 CA:0
+Smoothing:  2
+Face 114:    A:25 B:26 C:58 AB:1 BC:0 CA:0
+Smoothing:  2
+Face 115:    A:25 B:58 C:57 AB:0 BC:1 CA:0
+Smoothing:  2
+Face 116:    A:26 B:27 C:59 AB:1 BC:0 CA:0
+Smoothing:  2
+Face 117:    A:26 B:59 C:58 AB:0 BC:1 CA:0
+
+                                     Page 5
+
+
+
+Smoothing:  2
+Face 118:    A:27 B:28 C:60 AB:1 BC:0 CA:0
+Smoothing:  2
+Face 119:    A:27 B:60 C:59 AB:0 BC:1 CA:0
+Smoothing:  2
+Face 120:    A:28 B:29 C:61 AB:1 BC:0 CA:0
+Smoothing:  2
+Face 121:    A:28 B:61 C:60 AB:0 BC:1 CA:0
+Smoothing:  2
+Face 122:    A:29 B:30 C:62 AB:1 BC:0 CA:0
+Smoothing:  2
+Face 123:    A:29 B:62 C:61 AB:0 BC:1 CA:0
+Smoothing:  2
+Face 124:    A:30 B:31 C:63 AB:1 BC:0 CA:0
+Smoothing:  2
+Face 125:    A:30 B:63 C:62 AB:0 BC:1 CA:0
+Smoothing:  2
+Face 126:    A:31 B:16 C:48 AB:1 BC:0 CA:0
+Smoothing:  2
+Face 127:    A:31 B:48 C:63 AB:0 BC:1 CA:0
+Smoothing:  2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+                                     Page 6
+
+
+
diff --git a/src/glut/ggi/EXPSYMS b/src/glut/ggi/EXPSYMS
new file mode 100644 (file)
index 0000000..dc55623
--- /dev/null
@@ -0,0 +1,2 @@
+glutInit
+glutSwapBuffers
diff --git a/src/glut/ggi/ggiglut.c b/src/glut/ggi/ggiglut.c
new file mode 100644 (file)
index 0000000..f9ca0a7
--- /dev/null
@@ -0,0 +1,840 @@
+/* **************************************************************************
+ * ggiglut.c
+ * **************************************************************************
+ * 
+ * Copyright (C) 1998 Uwe Maurer - uwe_maurer@t-online.de 
+ * Copyright (C) 1999 James Simmons
+ * Copyright (C) 1999 Jon Taylor
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ * 
+ * **************************************************************************
+ * To-do:
+ * - Make everything use the portable ggi_* types
+ * 
+ */
+
+#define WIDTH  640
+#define HEIGHT 480
+#define GRAPHTYPE_RGB  GT_16BIT
+#define GRAPHTYPE_INDEX        GT_8BIT
+
+/*************************************************************************/
+
+#include <GL/gl.h>
+#include <GL/glu.h>
+#include <GL/glut.h>
+#include <malloc.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <string.h>
+#include "GL/ggimesa.h"
+
+#include <ggi/ggi.h>
+#include <ggi/gii.h>
+
+char *__glutProgramName = "GGI";
+
+static ggi_visual_t __glut_vis;
+
+static GGIMesaContext __glut_ctx;
+
+static int __glut_width = WIDTH;
+static int __glut_height = HEIGHT;
+static ggi_graphtype __glut_gt_rgb = GRAPHTYPE_RGB;
+static ggi_graphtype __glut_gt_index = GRAPHTYPE_INDEX;
+static int __glut_init = GL_FALSE;
+
+static int mousex = WIDTH / 2;
+static int mousey = HEIGHT / 2;
+static int mouse_moved = GL_FALSE;
+static int mouse_down = GL_FALSE;
+static int mouse_showcursor = GL_FALSE;
+
+static void (*__glut_reshape)(int, int);
+static void (*__glut_display)(void);
+static void (*__glut_idle)(void);
+static void (*__glut_keyboard)(unsigned char, int, int);
+static void (*__glut_special)(int, int, int);
+static void (*__glut_mouse)(int, int, int, int);
+static void (*__glut_motion)(int, int);
+static void (*__glut_passive_motion)(int, int);
+static void (*__glut_visibility)(int);
+
+static unsigned int __glut_mode = GLUT_RGB | GLUT_SINGLE | GLUT_DEPTH;
+
+static int __glut_mod_keys = 0;
+
+static int __glut_redisplay = GL_FALSE;
+
+/* Menu */
+static int __glut_menubutton = -1;
+static int __glut_menuactive = GL_FALSE;
+
+#define MAX_ENTRIES    64
+
+typedef struct menu_s
+{
+       char *label[MAX_ENTRIES];
+       int value[MAX_ENTRIES];
+       struct menu_s * submenu[MAX_ENTRIES];
+       void (*func)(int);              
+       int max_strlen;
+       int num_entries;
+} menu_t;
+
+static menu_t *mainmenu;
+static menu_t *curmenu;
+static menu_t *activemenu;
+
+int glut_ggi_debug = GL_FALSE;
+
+void glut_ggiPRINT(char *format, ...)
+{
+       va_list args;
+       va_start(args, format);
+       fprintf(stderr, "GGIGLUT: ");
+       vfprintf(stderr, format, args);
+       va_end(args);
+}
+
+void glut_ggiDEBUG(char *format, ...)
+{
+       va_list args;
+       if (glut_ggi_debug)
+       {
+               va_start(args, format);
+               fprintf(stderr, "GGIGLUT: ");
+               vfprintf(stderr, format, args);
+               va_end(args);
+       }
+       
+}
+
+void glutInit(int *argc, char **argv)
+{
+       ggi_graphtype gt;
+       int i, k;
+       char *s;
+
+       #define REMOVE  {for (k=i;k<*argc-1;k++) argv[k]=argv[k+1];  \
+                               (*argc)--; i--; }
+
+       if (__glut_init) return;
+       
+       s = getenv("GGIGLUT_DEBUG");
+       glut_ggi_debug = (s && atoi(s));
+
+       if (argc && argv)
+       {
+
+               for (i = 1; i < *argc; i++)
+               {
+                       if (strcmp(argv[i], "-mouse") == 0)
+                       {
+                               mouse_showcursor = GL_TRUE;     
+                               REMOVE;
+                       }
+                       else
+                       if (strcmp(argv[i], "-bpp") == 0 && (i + 1) < (*argc))
+                       {
+                               switch(atoi(argv[i + 1]))
+                               {
+                                       case 4: gt = GT_4BIT; break;
+                                       case 8: gt = GT_8BIT; break;
+                                       case 15: gt = GT_15BIT; break;
+                                       case 16: gt = GT_16BIT; break;
+                                       case 24: gt = GT_24BIT; break;
+                                       case 32: gt = GT_32BIT; break;
+                                       default:
+                                       glut_ggiDEBUG("\"%s\" bits per pixel?\n",
+                                                     argv[i+1]);
+
+                                       exit(1);
+                               }
+                               __glut_gt_rgb = __glut_gt_index = gt;
+                               REMOVE;
+                               REMOVE;
+                       } 
+                       else
+                       if (strcmp(argv[i], "-size") == 0 && (i + 2) < (*argc))
+                       {
+                               __glut_width=atoi(argv[i+1]);
+                               __glut_height=atoi(argv[i+2]);
+                               REMOVE;
+                               REMOVE;
+                               REMOVE;
+                       }
+               }
+       }
+       
+       if (ggiInit()<0)
+       {
+               ggiPanic("ggiInit() failed!\n");
+       }
+       __glut_init=GL_TRUE;
+
+       #undef REMOVE
+}
+
+void glutInitWindowPosition(int x, int y)
+{
+}
+
+void glutInitWindowSize(int x, int y)
+{
+}
+
+void glutFullScreen(void)
+{
+}
+
+void glutInitDisplayMode(unsigned int mode)
+{
+       __glut_mode = mode;
+}
+
+void glutInitDisplayString(const char *string)
+{
+       glut_ggiPRINT("glutInitDisplayString: %s\n", string);
+}
+
+int glutCreateWindow(const char *title)
+{
+       ggi_graphtype gt;
+       ggi_mode mode = 
+       {
+               1,
+               { GGI_AUTO, GGI_AUTO },
+               { GGI_AUTO, GGI_AUTO },
+               { 0, 0 },
+               GT_AUTO,
+               { GGI_AUTO, GGI_AUTO }
+       };
+       int frames;
+       int rgb;
+       int err;
+
+       if (!__glut_init) 
+         glutInit(NULL, NULL);
+
+       glut_ggiPRINT("GGIGLUT: %s\n", title);
+
+       rgb = !(__glut_mode & GLUT_INDEX);
+       frames = (__glut_mode & GLUT_DOUBLE) ? 2 : 1;
+       gt = (rgb) ? __glut_gt_rgb : __glut_gt_index;
+       
+       __glut_ctx = GGIMesaCreateContext();
+       
+       if (__glut_ctx == NULL) 
+         ggiPanic("Can't create mesa-context\n");
+
+       __glut_vis = ggiOpen(NULL);
+       if (__glut_vis == NULL) 
+       {
+         ggiPanic("ggiOpen() failed!\n");
+         /* return GL_FALSE; */
+       }
+       
+       ggiSetFlags(__glut_vis, GGIFLAG_ASYNC);
+       
+       ggiCheckMode(__glut_vis, &mode);
+       
+       err = ggiSetMode(__glut_vis, &mode);
+       if (err < 0) 
+       {
+         ggiPanic("Can't set graphic mode!\n");
+         /* return GL_FALSE; */
+       }
+       
+       ggiGetMode(__glut_vis, &mode);
+
+       if (GGIMesaSetVisual(__glut_ctx, __glut_vis, rgb, frames > 1) < 0) 
+       {
+               ggiPanic("GGIMesaSetVisual failed!\n");
+       }
+       
+       GGIMesaMakeCurrent(__glut_ctx);
+       
+       if (__glut_reshape) 
+         __glut_reshape(__glut_width, __glut_height);
+
+       return GL_TRUE;
+}
+
+void glutReshapeFunc(void (*func)(int, int))
+{
+  __glut_reshape = func;
+  if (__glut_vis && __glut_reshape) 
+    __glut_reshape(__glut_width, __glut_height);
+}
+
+void glutKeyboardFunc(void (*keyboard)(unsigned char key, int x, int y))
+{
+  __glut_keyboard = keyboard;
+}
+
+int glutGetModifiers(void)
+{
+  return __glut_mod_keys;
+}
+
+void glutEntryFunc(void (*func)(int state))
+{
+}
+
+void glutVisibilitFunc(void (*func)(int state))
+{
+}
+
+void glutTimerFunc(unsigned int millis, void (*func)(int value), int value)
+{
+}
+
+void glutMenuStateFunc(void (*func)(int state))
+{
+}
+
+int glutGet(GLenum type)
+{
+       switch(type)
+       {
+               case GLUT_WINDOW_X:     
+               return 0;
+               case GLUT_WINDOW_Y:
+               return 0;
+               case GLUT_WINDOW_WIDTH:
+               return __glut_width;
+               case GLUT_WINDOW_HEIGHT:
+               return __glut_height;
+               case GLUT_MENU_NUM_ITEMS:
+               if (curmenu) 
+                 return curmenu->num_entries;
+               else 
+                 return 0;
+               default:
+               glut_ggiDEBUG("glutGet: unknown type %i\n", type);
+       }
+       return 0;
+}
+
+void glutSpecialFunc(void (*special)(int key, int x, int y))
+{
+  __glut_special=special;
+}
+
+void glutDisplayFunc(void (*disp)(void))
+{
+  __glut_display=disp;
+}
+
+void glutSetColor(int index, GLfloat red, GLfloat green, GLfloat blue)
+{
+  ggi_color c;
+  GLfloat max;
+  
+  if (red > 1.0) red = 1.0;
+  if (red < 0.0) red = 0.0;
+  if (green > 1.0) green = 1.0;
+  if (green < 0.0) green = 0.0;
+  if (blue > 1.0) blue = 1.0;
+  if (blue < 0.0) blue = 0.0;
+  
+  max = (float)((1 << GGI_COLOR_PRECISION) - 1);
+  
+  c.r = (int)(max * red);
+  c.g = (int)(max * green);
+  c.b = (int)(max * blue);
+  ggiSetPalette(__glut_vis, index, 1, &c);
+}
+
+void glutPostRedisplay(void)
+{
+  __glut_redisplay = GL_TRUE;
+}
+
+void glutPostWindowRedisplay(int win)
+{
+  __glut_redisplay = GL_TRUE;
+}
+
+void glutSwapBuffers(void)
+{
+  GGIMesaSwapBuffers();
+}
+
+void glutIdleFunc(void (*idle)(void))
+{
+  __glut_idle = idle;
+}
+
+static void keyboard(ggi_event *ev)
+{
+       int sym;
+       int modifer = 0, key = 0;
+  
+       sym = ev->key.sym;
+  
+       modifer = ev->key.modifiers;
+       if (modifer == GII_KM_SHIFT)
+         __glut_mod_keys |= GLUT_ACTIVE_SHIFT;
+       if (modifer == GII_KM_CTRL)
+         __glut_mod_keys |= GLUT_ACTIVE_CTRL;
+       if (modifer == GII_KM_ALT)
+         __glut_mod_keys |= GLUT_ACTIVE_ALT;
+
+       /* if (__glut_special && key) __glut_special(GII_KTYP(key),0,0); */
+  
+       if (__glut_keyboard) 
+//       __glut_keyboard(GII_UNICODE(sym), 0, 0);
+         __glut_keyboard(sym, 0, 0);
+}
+
+static void mouseabs(ggi_event *ev)
+{
+  int oldx=mousex;
+  int oldy=mousey;
+  
+  mousex=ev->pmove.x;
+  mousey=ev->pmove.y;
+  
+  if (mousex<0) mousex=0;
+  if (mousey<0) mousey=0;
+  if (mousex>=__glut_width) mousex=__glut_width-1;
+  if (mousey>=__glut_height) mousey=__glut_height-1;
+  
+  if (mousex!=oldx || mousey!=oldy) mouse_moved=GL_TRUE;
+}
+
+static void mouse(ggi_event *ev)
+{
+  int oldx=mousex;
+  int oldy=mousey;
+  
+  mousex+=ev->pmove.x>>1;
+  mousey+=ev->pmove.y>>1;
+  
+  if (mousex<0) mousex=0;
+  if (mousey<0) mousey=0;
+  if (mousex>=__glut_width) mousex=__glut_width-1;
+  if (mousey>=__glut_height) mousey=__glut_height-1;
+  
+  if (mousex!=oldx || mousey!=oldy) mouse_moved=GL_TRUE;
+  
+}
+
+/* FIXME: Prototypes belong in headers, not here! [JMT] */
+static void showmenu(void);
+static int clickmenu(void);
+static void updatemouse(void);
+static void drawmouse(void);
+
+static void mousemove(void)
+{
+  if (mouse_moved) {
+    if (__glut_motion && mouse_down) {
+      __glut_motion(mousex,mousey);
+    }
+    
+    if (__glut_passive_motion && (!mouse_down)) {
+      __glut_passive_motion(mousex,mousey);
+    }
+
+    if (__glut_menuactive) updatemouse();
+    mouse_moved=GL_FALSE;
+  }
+}
+
+static void button(ggi_event *ev)
+{
+  int i;
+  int btn[4]={0,GLUT_LEFT_BUTTON,GLUT_RIGHT_BUTTON,GLUT_MIDDLE_BUTTON};
+  mousemove();
+  
+  if (ev->pbutton.button <= 3) { /* GGI can have >3 buttons ! */ 
+    char state = ev->any.type == evPtrButtonPress ?GLUT_DOWN:GLUT_UP;
+    if (__glut_menuactive) {
+      if (state==GLUT_UP && clickmenu()) {
+       glutPostRedisplay();
+       __glut_menuactive=GL_FALSE;
+      }
+    } else
+      if (btn[ev->pbutton.button]==__glut_menubutton) {
+       __glut_menuactive=GL_TRUE;
+       activemenu=mainmenu;
+       showmenu();
+      } else 
+       if (__glut_mouse) {
+         __glut_mouse(btn[ev->pbutton.button],state,mousex,mousey);
+       }
+    if (state==GLUT_DOWN) {
+      mouse_down|=(1<<(ev->pbutton.button-1));
+    }
+    else mouse_down&=~(1<<(ev->pbutton.button-1));
+  }
+}
+
+void glutMainLoop(void)
+{
+       ggi_event ev;
+       ggi_event_mask evmask = (emKeyPress | emKeyRepeat | emPtrMove | emPtrButton);
+  
+       ggiSetEventMask(__glut_vis, evmask);
+       
+       glutPostRedisplay();
+       
+       if (__glut_visibility) 
+         __glut_visibility(GLUT_VISIBLE);
+       
+       while (1) 
+       {
+               if (!__glut_menuactive) 
+               {
+                       if (__glut_idle) 
+                         __glut_idle();
+                       if (__glut_redisplay && __glut_display) 
+                       {
+                               __glut_redisplay = GL_FALSE;
+                               __glut_display();
+                       }
+               }
+               
+               while (1) 
+               {
+                       struct timeval t = {0, 0};
+                       
+                       if (ggiEventPoll(__glut_vis, evmask, &t) == 0) 
+                         break;
+                       
+                       ggiEventRead(__glut_vis, &ev, evmask);
+      
+                       switch (ev.any.type) 
+                       {
+                               case evKeyPress:
+                               case evKeyRepeat:
+                               keyboard(&ev);
+                               break;
+                               case evPtrAbsolute:
+                               mouseabs(&ev);
+                               break;
+                               case evPtrRelative:
+                               mouse(&ev);
+                               break;
+                               case evPtrButtonPress:
+                               case evPtrButtonRelease:
+                               button(&ev);
+                               break;
+                       }
+               }
+               mousemove();
+       }
+}
+
+static void showmenu()
+{
+  int y,i;
+  ggi_color col={0xffff,0xffff,0xffff};
+  
+  ggiSetGCForeground(__glut_vis,ggiMapColor(__glut_vis,&col));
+  ggiSetOrigin(__glut_vis,0,0);
+  
+  for (y=i=0;i<activemenu->num_entries;i++,y+=8) {
+    ggiPuts(__glut_vis,0,y,activemenu->label[i]);
+  }
+  drawmouse();
+}
+
+static int clickmenu(void)
+{
+  int i;
+  int w,h;
+  
+  i=mousey/8;
+  
+  if (i>=activemenu->num_entries) return GL_TRUE;
+  if (mousex>=8*strlen(activemenu->label[i])) return GL_TRUE;
+  
+  if (activemenu->submenu[i]) {
+    ggi_color col={0,0,0};
+    ggiSetGCForeground(__glut_vis,ggiMapColor(__glut_vis,&col));
+    h=activemenu->num_entries*8;
+    w=activemenu->max_strlen*8;
+    ggiDrawBox(__glut_vis,0,0,w,h);
+    activemenu=activemenu->submenu[i];
+    showmenu();
+    return GL_FALSE;
+  }
+  curmenu=activemenu;
+  activemenu->func(activemenu->value[i]);
+  return GL_TRUE;
+}
+
+static int oldx=-1;
+static int oldy=-1;
+static char buffer[16*16*4];
+
+static void updatemouse()
+{
+  ggiPutBox(__glut_vis,oldx,oldy,16,16,buffer);
+  drawmouse();
+}
+
+static void drawmouse()
+{
+  int x,y;
+  x=mousex-8;
+  if (x<0) x=0;
+  y=mousey-8;
+  if (y<0) y=0;
+  ggiGetBox(__glut_vis,x,y,16,16,buffer);
+  ggiDrawLine(__glut_vis,mousex-2,mousey,mousex+2,mousey);
+  ggiDrawLine(__glut_vis,mousex,mousey-2,mousex,mousey+2);
+  oldx=x;
+  oldy=y;
+}
+
+int glutCreateMenu(void(*func)(int))
+{
+  menu_t *m;
+  m=malloc(sizeof(menu_t));
+  memset(m,0,sizeof(menu_t));
+  curmenu=m;
+  curmenu->func=func;
+  return (int)curmenu; 
+}
+
+static void addEntry(const char *label,int value,menu_t *submenu)
+{
+  int i=curmenu->num_entries;  
+  /* printf("%i %i %s %p\n",i,value,label,submenu); */
+  if (i<MAX_ENTRIES) {
+    curmenu->label[i]=strdup(label);
+    curmenu->value[i]=value;
+    curmenu->submenu[i]=submenu;
+    
+    if (strlen(label)>curmenu->max_strlen)
+      curmenu->max_strlen=strlen(label);
+    curmenu->num_entries++;
+  }
+}
+
+void glutAddMenuEntry(const char *label,int value)
+{
+  addEntry(label,value,NULL);
+}
+
+void glutAddSubMenu(const char *label,int submenu)
+{
+  char text[100];
+  
+  if (!curmenu) return;
+  strncpy(text,label,98);
+  text[98]=0;
+  text[strlen(text)+1]=0;
+  text[strlen(text)]='>';
+  
+  addEntry(text,0,(menu_t *) submenu);
+}
+
+void glutAttachMenu(int button)
+{
+  mainmenu=curmenu;
+  __glut_menubutton=button;
+}
+
+void glutDetachMenu(int button)
+{
+}
+
+void glutVisibilityFunc(void (*func)(int state))
+{
+  __glut_visibility=func;
+}
+
+void glutMouseFunc(void (*mouse)(int, int, int, int))
+{
+  __glut_mouse=mouse;  
+}
+
+void glutMotionFunc(void (*motion)(int,int))
+{
+  __glut_motion=motion;
+}
+
+void glutPassiveMotionFunc(void (*motion)(int,int))
+{
+  __glut_passive_motion=motion;
+}
+
+void glutSetWindowTitle(const char *title)
+{
+}
+
+void glutSetIconTitle(const char *title)
+{
+}
+
+void glutChangeToMenuEntry(int item,const char *label,int value)
+{
+  if (item>0 && item<=curmenu->num_entries) {
+    item--;
+    free(curmenu->label[item]);
+    curmenu->label[item]=strdup(label);
+    curmenu->value[item]=value;
+    curmenu->submenu[item]=NULL;
+  }
+}
+void glutChangeToSubMenu(int item,const char *label,int submenu)
+{
+  if (item>0 && item<=curmenu->num_entries) {
+    item--;
+    free(curmenu->label[item]);
+    curmenu->label[item]=strdup(label);
+    curmenu->value[item]=0;
+    curmenu->submenu[item]=(menu_t *)submenu;
+  }
+}
+
+void glutDestroyMenu(int menu)
+{
+  menu_t *m=(menu_t *)menu;
+  int i;
+  
+  for (i=0;i<m->num_entries;i++) {
+    free(m->label[i]);
+  }
+  free(m);
+}
+
+int glutCreateSubWindow(int win,int x,int y,int w,int h)
+{
+  return 0;
+}
+
+void glutDestroyWindow(int win)
+{
+}
+
+int glutGetWindow(void)
+{
+  return 0;
+}
+
+void glutSetWindow(int win)
+{
+}
+
+void glutPositionWindow(int x,int y)
+{
+}
+
+void glutReshapeWindow(int x,int y)
+{
+}
+
+void glutPushWindow(void)
+{
+}
+
+void glutPopWindow(void)
+{
+}
+
+void glutIconifyWindow(void)
+{
+}
+
+void glutShowWindow()
+{
+}
+
+void glutHideWindow()
+{
+}
+
+void glutSetCursor(int cursor)
+{
+}
+
+void glutWarpPointer(int x,int y)
+{
+}
+
+void glutEstablishOverlay(void)
+{
+}
+
+void glutRemoveOverlay(void)
+{
+}
+
+void glutUseLayer(GLenum layer)
+{
+}
+
+int glutLayerGet(GLenum type)
+{
+       return 0;
+}
+
+void glutPostOverlayRedisplay(void)
+{
+}
+
+void glutPostWindowOverlayRedisplay(int w)
+{
+}
+
+void glutShowOverlay(void)
+{
+}
+
+void glutHideOverlay(void)
+{
+}
+
+int glutGetMenu(void)
+{
+       return 0;
+}
+
+void glutSetMenu(int menu)
+{
+}
+
+void glutRemoveMenuItem(int item)
+{
+}
+
+void glutSpaceBallMotionFunc(void (*func)(int key,int x,int y))
+{
+}
+
+void glutSpaceBallRotateFunc(void (*func)(int x,int y,int z))
+{
+}
+
+void glutSpaceBallButtonFunc(void (*func)(int button,int state))
+{
+}
+
+void glutCopyColormap(int win)
+{
+}
+
+int glutDeviceGet(GLenum param)
+{
+       return 0;
+}