Re: Stereo code examples for Onyx/RE?

New Message Reply Date view Thread view Subject view Author view

Ivan Bach (ib++at++ivan)
Tue, 22 Mar 94 09:08:47 -0800


Article: 274 of comp.sys.sgi.hardware
Subject: General info about SGI stereo (was: How does one use stereo goggles?)
Message-ID: <C1vv1n.Gt6++at++news.cso.uiuc.edu>
Date: 3 Feb 93 17:24:59 GMT
Organization: University of Illinois at Urbana

In article <1kn5jqINNqs0++at++darkstar.UCSC.EDU> gross++at++maxwell.ucsc.edu
(Mike Gross) writes:
> One of the researchers in our department recently bought a pair of stereo
> goggles for our SGI Crimson, but I haven't been able to find anyone in this
> university who knows how to use them. I'm interested primarily in using
> the goggles with Explorer (assuming this is possible), but I'm also
interested
> in finding out how to adapt existing GL programs to use the goggles. Does
> anyone out there have any idea how to get this working? The goggles came
> without an ounce of documentation, and SGI hasn't been very helpful, either.
> Any help is appreciated.
>
> If you followup to this post, please e-mail me a copy, too.
>
> Mike Gross
> Physics Board and Lick Observatory
> Univ of California GO SLUGS!!!!!
> Santa Cruz, CA 95064
> gross++at++lick.ucsc.edu

Here is a quick general description of how the SGI stereo goggles work, for
those who do not know much about them, and what must be done to have your
programs use them:
  
First of all, in order to see stereo images on your SGI monitor, you need to
have both the glasses AND special stereo hardware installed in your machine.
Just buying some glasses will not allow you to see in stereo. So if your
computer did not come already equipped for stereo display, the glasses won't
help any.

Second, here is the general method used by the stereo system: connected to the
SGI is an infrared emitter, which you place generally on top of or right next
to your monitor. The glasses have a detector on them that senses the signal
being put out by this emitter. In your program (or from the Unix command
prompt) you issue a command to switch the monitor into stereo mode; this
changes the frequency of screen updates from 60 times/sec to 120 times/sec.
Thus, the monitor updates the screen twice as fast as it does in non-stereo
mode. The purpose for this is that to see stereo, you must have two images, a
left-eye image and a right-eye image, and so the monitor with display the two
images each 60 times/sec, for a total of 120 images updates/sec. In fact, each

second it draws the left eye image, then the right eye image, and alternates
drawing left-right. The infrared emitter puts out a signal which tells the
glasses which eye's image is currently being drawn, and the glasses, which
contain LCD lenses, darken the lens of the eye for which the image is not being

drawn. So, when the monitor displays the left eye image, the glasses make the
right lens black, and vice versa. Each eye sees 60 images/second still, and
sees only the image for that eye. The special stereo hardware is required to
keep everything in sync, and to allow the monitor to display 120 images/sec.

Third, here is what must be done to display stereo images from your program:
step one is to switch the monitor into stereo mode; there are some demo
programs in ~demos/Stereo, including a utility to check and see if your system
has the stereo option installed. In these demo programs is some code they
provide to switch between stereo/non-stereo. On our system, however, there
were already installed the programs 'onstereo' and 'offstereo' which could be
used from the command prompt (or a system() call in a program) to switch stereo

modes. ~demos/Stereo also provides examples on how to draw images in your
program to display in stereo.

Basically, there is no way to take just any program executable lying around and

make it display in stereo; you need to rewrite the drawing routines so that
they properly display the image such that it will look 3-D to a person wearing
the stereo glasses. Also, the stereo option works best only when your graphics

window is the size of the entire screen. Normally, of course, the SGI display
is 1280 x 1024 pixels; when in stereo mode, the display 'wraps around' 1/2 of
this and displays it on top of the other 1/2. Actually, here is how the
original display is mapped to the stereo display:

   +----------------------+ (1279, 1023)
| |
| |
| |
| left eye image |
| |
| |
| |
   +----------------------+ (1279, 532 = YOFFSET)
| space not used |
| by either eye |
   +----------------------+ (1279, 491 = YMAXSTEREO)
| |
| |
| |
| right eye image |
| |
| |
| |
0,0+----------------------+ (1279,0)

So, in your program, you must draw the same image twice, using a slightly
different perspective for each eye. Here is a quick list of steps you coud
use:
        a) for the right eye:
                1) set the viewport to the right eye region:
        viewport(0,XMAXSCREEN,0,YMAXSTEREO);
                2) set the perspective so that you are looking at the object
                   from the right eye's position, i.e. if you use a
                   'lookat' perspective call (there are no doubt much more
                   sophisticated methods to do this; this is just a quick
                   example):
        perspective(450, 0.5*(float)XMAXSCREEN/(float)YMAXSTEREO, nearClip,
farClip);
        lookat(SGIeyeSep, 0.0, eyePosition[2], 0.0, 0.0, 0.0, 0);
                3) draw the image

        b) for the left eye:
                1) set the viewport to the left eye region:
        viewport(0,XMAXSCREEN,YOFFSET,YOFFSET + YMAXSTEREO);
                2) set the perspective for the left eye:
        perspective(450, 0.5*(float)XMAXSCREEN/(float)YMAXSTEREO, nearClip,
farClip);
        lookat(-SGIeyeSep, 0.0, eyePosition[2], 0.0, 0.0, 0.0, 0);
                3) draw the image

If this is done, then the monitor will display the two images right on top of
each other, and the glasses will only see the left eye image in the left eye,
etc. Note that each image will only have about 1/2 the vertical resolution
possible in non-stereo mode; this is the price that must be paid for the 3-D
effect (besides the fact that drawing each frame will take twice as long, since

each frame requires two redraws).

--
Bill Humphrey

(billh++at++lisboa.ks.uiuc.edu) (Beckman Institute - University of Illinois) (405 North Matthews) (Urbana, IL 61801) ---------------------------- Article: 283 of comp.sys.sgi.hardware From: spencer++at++hailwood.asd.sgi.com (Paul Spencer) Subject: Re: General info about SGI stereo (was: How does one use stereo goggles?) Date: 5 Feb 1993 02:39:29 GMT Organization: Silicon Graphics, Inc., Mountain View, CA

billh++at++lisboa.ks.uiuc.edu (William F. Humphrey) says: > [ excellent description of stereo mode and goggles deleted ]

What Bill described is what we call `old-style' stereo on RealityEngine. (It's the only kind of stereo available on VGX'es and older).

On RE, we have available `new-style' stereo, which differs in the following ways (otherwise, it's remarkably similar):

- Instead of using two different pieces of the screen for left and right eyes, your software uses the SAME window in the SAME place. Just as each window has a front and a back buffer, a window in new-style stereo mode has a left buffer and a right buffer. Well, in fact, it has FOUR: left-front, left-back, right-front, right-back.

- a new-style stereo program looks something like this:

winopen(""); doublebuffer(); stereobuffer(); gconfig();

while (1) { leftbuffer(TRUE); rightbuffer(FALSE); /* draw scene as seen from the left eye here */

leftbuffer(FALSE); rightbuffer(TRUE); /* draw scene as seen from the right eye here */

swapbuffers(); }

- new-style stereo has one huge advantage over old-style stereo:

non-stereo programs on your screen look normal!

That's right, all of your xwsh/xterm/xclock/etc. all look just like they do today; no mad flickering, no seeing them in just one eye. Everything works just like normal (even if you aren't wearing the glasses!)

- The screen in new-style stereo is less strangely shaped (1280 x 492 is kind of an odd aspect ratio!)

Formats available are:

1025 x 768 at 96 Hz 640 x 512 at 120 Hz 815 x 611 at 120 Hz 960 x 680 at 108 Hz

....paul

--
Paul Spencer                 Silicon Graphics Advanced Graphics Division
spencer++at++sgi.com                                Mountain View, California
----------------
Article: 28247 of comp.sys.sgi
From: martinm++at++sgi.com (Martin McDonald)
Subject: Re: Stereo in a window on a RealityEngine
Message-ID: <1992Nov12.155346.13219++at++news.csd.sgi.com>
Sender: news++at++news.csd.sgi.com (Net News CSD)
Organization: Silicon Graphics, Inc., Mountain View, CA
References: <17403++at++borg.cs.unc.edu>
Date: Thu, 12 Nov 1992 15:53:46 GMT

In article <17403++at++borg.cs.unc.edu> cullip++at++pooh.cs.unc.edu (Timothy Cullip) writes: >We have a loaner Crimson/RealityEngine that we are evaluating for >our needs. One of our needs is stereo in a window (which I've heard >it is capable of doing. Does anyone out there have a simple example >program that demonstrates this capability? If so, could I get my >nands on the source code?

try this one out. note from the header you need to change the video output format to do stereo per window. to do this you need to be root. run /usr/gfx/setmon 960x680_108s . then run /usr/gfx/stopgfx followed up with /usr/gfx/startgfx . you will lose some screen real estate, but you will be able to do single window stereo. this program will be found in 4Dgifts soon.

/*********************************************************************** * * * Stereo In Window Sample Program * * * * WARNING: YOU MUST RUN 960x680_108s VOF TO USE STEREO IN WINDOW * * WILL ONLY WORK ON REALITY ENGINE * ***********************************************************************/ #include <stdio.h> #include <gl/gl.h>

#define XSIZE 640.0 #define YSIZE 512.0

static Matrix idmat = { 1.0,0.0,0.0,0.0, 0.0,1.0,0.0,0.0, 0.0,0.0,1.0,0.0, 0.0,0.0,0.0,1.0, };

static float mat[] = { AMBIENT, 0.35, 0.25, 0.1, DIFFUSE, 0.65, 0.5, 0.35, SPECULAR, 0.0, 0.0, 0.0, SHININESS, 0.0, LMNULL };

static float lig[] = { AMBIENT, 0.0, 0.0, 0.0, LCOLOR, 1.0, 1.0, 1.0, POSITION, 0.0, 0.0, -1.0, 0.0, LMNULL };

static float mod[] = { AMBIENT, 0.3, 0.3, 0.3, LOCALVIEWER, 0.0, LMNULL };

static float ang = 0.0;

static float v[8][3] = { -1.0,-1.0,-1.0, 1.0,-1.0,-1.0, 1.0, 1.0,-1.0, -1.0, 1.0,-1.0, -1.0,-1.0, 1.0, 1.0,-1.0, 1.0, 1.0, 1.0, 1.0, -1.0, 1.0, 1.0, };

static float n[6][3] = { 0.0, 0.0, 1.0, 0.0, 0.0,-1.0, 0.0, 1.0, 0.0, -1.0, 0.0, 0.0, 0.0,-1.0, 0.0, 1.0, 0.0, 0.0, };

static void draw_scene(long); static void draw_polyg(float *,float *,float *,float *,float *);

main() { foreground(); prefposition(0,XSIZE-1,0,YSIZE-1); winopen("Stereo In Window");

RGBmode(); doublebuffer(); stereobuffer(); gconfig();

if (!getgconfig(GC_DOUBLE) || !getgconfig(GC_STEREO)) { fprintf(stderr,"ERROR: Could not configure doublebuffer stereo!\n"); exit(0); }

subpixel(TRUE); zbuffer(TRUE); lsetdepth(getgdesc(GD_ZMIN),getgdesc(GD_ZMAX));

lmdef(DEFMATERIAL, 1, 0, mat); lmdef(DEFLIGHT, 1, 0, lig); lmdef(DEFLMODEL, 1, 0, mod);

lmbind(MATERIAL, 1); lmbind(LMODEL, 1);

mmode(MPROJECTION); perspective(450,XSIZE/YSIZE,0.1,100.0); mmode(MVIEWING); loadmatrix(idmat); lmbind(LIGHT1,1);

while (1) { leftbuffer(TRUE); rightbuffer(FALSE); draw_scene(0);

leftbuffer(FALSE); rightbuffer(TRUE); draw_scene(1);

swapbuffers(); } }

static void draw_scene(long flag) { czclear(0,getgdesc(GD_ZMAX));

pushmatrix();

/* left/right eye */ if (flag == 0) lookat(5.0,-1.0,0.0,0.0,0.0,0.0,0); else lookat(5.0, 1.0,0.0,0.0,0.0,0.0,0);

ang+=2.0; rotate(ang,'y'); rotate(ang/2.7,'z');

cpack(0xffffffff); draw_polyg(v[0],v[1],v[2],v[3],n[0]); draw_polyg(v[4],v[5],v[6],v[7],n[1]); draw_polyg(v[0],v[1],v[5],v[4],n[2]); draw_polyg(v[1],v[2],v[6],v[5],n[3]); draw_polyg(v[2],v[3],v[7],v[6],n[4]); draw_polyg(v[3],v[0],v[4],v[7],n[5]);

popmatrix(); }

static void draw_polyg(float *v0,float *v1,float *v2,float *v3,float *n) { bgnpolygon(); n3f(n); v3f(v0); v3f(v1); v3f(v2); v3f(v3); endpolygon(); }

--
Martin McDonald       Up there they got a lot of sand, but down here we got a
hot crustacean band. each little snail he know how to wail.  that's why it's 
hotter under the water under the sea.
                                                         -sebastian
---------------------------------
Article: 227 of comp.sys.sgi.graphics
From: airey++at++woof.asd.sgi.com (John Airey)
Subject: Source for stereo demo...
Date: 27 Jan 1993 22:25:09 GMT
Organization: Silicon Graphics, Inc.  Mountain View, CA
Lines: 435
Message-ID: <1k7245INNhc7++at++fido.asd.sgi.com>
NNTP-Posting-Host: woof.asd.sgi.com

Here is some source for a demo that uses stereo in a window. For RealityEngine.

No promises or guarantees okay? It works for me.

#include <stdio.h> #include <math.h> #include <gl/image.h> #include <gl/gl.h> #include <gl/device.h>

#define X 0 #define Y 1 #define Z 2

static int Colors[] = { 0xff7f1f9f, 0xff5f0f9f, 0xff9f0f3f, 0xff0f9fff, 0xffff1fff, 0xff3f5f4f, 0xff9f3f0f, 0xff1f2f1f, };

#define CFACES 6 #define VERTS_PER_CFACE 4 static float cdata[8][3] = {{-1., -1., -1.,}, { 1., -1., -1.,}, { 1., 1., -1.,}, {-1., 1., -1.,},

{-1., -1., 1.,}, { 1., -1., 1.,}, { 1., 1., 1.,}, {-1., 1., 1.,},};

static int cndex[CFACES][VERTS_PER_CFACE] = {{3, 2, 1, 0}, {4, 5, 6, 7}, {0, 1, 5, 4}, {1, 2, 6, 5}, {2, 3, 7, 6}, {3, 0, 4, 7},};

static float tex[4][2] = {{ 0., 0., }, { 1., 0., }, { 1., 1., }, { 0., 1., },};

static int NumFaces = 6; static int NumVertsPerFace = 3;

static int LeftBuffer = 1; static float IOD = 2.3;

maketexture(unsigned long t[], char *name, int x, int y) { int j,i,n=0; int r,g,b,a; IMAGE *iimage; unsigned short *st = (unsigned short *) t;

short rbuf[1024],gbuf[1024],bbuf[1024],abuf[1024];

if ( (iimage = iopen(name,"r")) == NULL){ fprintf(stderr,"\nCANT OPEN %s\n\n",name); exit(1); }

for (j= 0; j< x; j++){ getrow(iimage,rbuf,j,0);

for (i= 0; i < y; i++){ st[n++]= (rbuf[i]) | (rbuf[i]<<8); } } iclose(iimage); }

#define TEXSIZE 64 unsigned long tt1[TEXSIZE*TEXSIZE]; unsigned long tt2[TEXSIZE*TEXSIZE]; unsigned long tt3[TEXSIZE*TEXSIZE]; unsigned long tt4[TEXSIZE*TEXSIZE]; unsigned long tt5[TEXSIZE*TEXSIZE]; unsigned long tt6[TEXSIZE*TEXSIZE];

float Ztranslation = 0.;

#define CONVERGENCETRACK 0 #define PARALLELVIEWS 1 #define SCREENCONVERGE 2 int StereoModel = CONVERGENCETRACK;

float texps[] = { TX_MAGFILTER, TX_SHARPEN, TX_MINFILTER, TX_MIPMAP_TRILINEAR, TX_INTERNAL_FORMAT, TX_IA_8, TX_NULL };

float tevps[] = { TV_MODULATE, TV_NULL };

float ConvergenceFudge = 0.0;

extern void draw_frame(float , float , float ); main() { short val, mval[2], lastval[2]; long org[2], size[2]; Device dev, mdev[2]; Boolean run; int leftmouse_down = 0; int middlemouse_down = 0; float rx,ry; float from[3]; float at[3]; char buf[80];

lastval[X] = -1;

maketexture(tt1,"t1.rgba",TEXSIZE,TEXSIZE); maketexture(tt2,"t2.rgba",TEXSIZE,TEXSIZE); maketexture(tt3,"t3.rgba",TEXSIZE,TEXSIZE); maketexture(tt4,"t4.rgba",TEXSIZE,TEXSIZE); maketexture(tt5,"t5.rgba",TEXSIZE,TEXSIZE); maketexture(tt6,"t6.rgba",TEXSIZE,TEXSIZE);

foreground(); noborder(); prefposition(0,959,0,679); winopen("StereoSpin"); RGBmode(); doublebuffer(); subpixel(1); zbuffer(1); stereobuffer(); gconfig();

if (!getgconfig(GC_STEREO)){ fprintf(stderr,"stereo not available\n"); exit(1); }

tevdef(1,0,tevps); tevbind(0,1);

texdef2d(1,2,TEXSIZE,TEXSIZE,tt1,0,texps); texdef2d(2,2,TEXSIZE,TEXSIZE,tt2,0,texps); texdef2d(3,2,TEXSIZE,TEXSIZE,tt3,0,texps); texdef2d(4,2,TEXSIZE,TEXSIZE,tt4,0,texps); texdef2d(5,2,TEXSIZE,TEXSIZE,tt5,0,texps); texdef2d(6,2,TEXSIZE,TEXSIZE,tt6,0,texps);

mmode(MVIEWING);

getorigin(&org[X], &org[Y]); getsize(&size[X], &size[Y]); mdev[X] = MOUSEX; mdev[Y] = MOUSEY; getdev(2, mdev, lastval); /* initialize lastval[] */ lastval[X] -= org[X]; lastval[Y] -= org[Y]; qdevice(LEFTMOUSE); qdevice(MIDDLEMOUSE); qdevice(ESCKEY); qdevice(MOUSEX); qdevice(MOUSEY);

qdevice(SPACEKEY); qdevice(RETKEY);

qdevice(UPARROWKEY); qdevice(DOWNARROWKEY);

qdevice(LEFTARROWKEY); qdevice(RIGHTARROWKEY);

while (1){

while (qtest()) {

switch (dev = qread(&val)) { case LEFTMOUSE: leftmouse_down = val; break;

case MIDDLEMOUSE: middlemouse_down = val; break;

case MOUSEX: mval[X] = val - org[X]; break; case MOUSEY: mval[Y] = val - org[Y]; if (leftmouse_down) { rx += (mval[Y] - lastval[Y]); ry += (mval[X] - lastval[X]); } if (middlemouse_down){ Ztranslation += (mval[X] - lastval[X])*(1./8.); } lastval[X] = mval[X]; lastval[Y] = mval[Y]; break;

case SPACEKEY: if (val){ StereoModel = (StereoModel+1)%3; } break; case RETKEY: if (val){ IOD = 2.3; StereoModel = CONVERGENCETRACK; ConvergenceFudge = 0.0; } break;

case UPARROWKEY: if (val) ConvergenceFudge += 0.5; break;

case DOWNARROWKEY: if (val) ConvergenceFudge -= 0.5; break;

case LEFTARROWKEY: if (val) IOD -= .1; break;

case RIGHTARROWKEY: if (val) IOD += .1; break;

case ESCKEY: exit(0); } }

/* * try to define everything in inches * */

#define SCREEN_WIDTH 15. /* width of screen in inches*/ #define SCREEN_HEIGHT 10.625 /* height of screen in inches*/ #define DISTANCE_TO_SCREEN 19. /* distance from eye to screen (nearclip)*/

#define CLIP_FACTOR (1./8.00) /* to move near clip in */

#define NEAR_CLIP_DISTANCE (DISTANCE_TO_SCREEN*CLIP_FACTOR) #define FAR_CLIP_DISTANCE (DISTANCE_TO_SCREEN*30.)

#define DESIRED_SIZE_ON_SCREEN 2. #define WORLD_SPACE_SIZE 2.

if (LeftBuffer = !LeftBuffer){

leftbuffer(1); rightbuffer(0);

from[X] = -IOD/2.; from[Y] = 0.0; from[Z] = DISTANCE_TO_SCREEN;

at[X] = 0.0; at[Y] = 0.0; at[Z] = 0.0; } else{

leftbuffer(0); rightbuffer(1);

from[X] = IOD/2.; from[Y] = 0.0; from[Z] = DISTANCE_TO_SCREEN;

at[X] = 0.0; at[Y] = 0.0; at[Z] = 0.0; }

if (StereoModel == CONVERGENCETRACK) {

float dir[3],new_dir[3],mag, new_mag;

/* compute old magnitude of lookat vector */ dir[X] = at[X]-from[X]; dir[Y] = at[Y]-from[Y]; dir[Z] = at[Z]-from[Z]; mag = dir[X]*dir[X] + dir[Y]*dir[Y] + dir[Z]*dir[Z]; mag = fsqrt(mag);

/* compute new lookat direction */ new_dir[X] = dir[X]; new_dir[Y] = dir[Y]; new_dir[Z] = dir[Z]+Ztranslation+ConvergenceFudge; new_mag = new_dir[X]*new_dir[X] + new_dir[Y]*new_dir[Y] + new_dir[Z]*new_dir[Z]; new_mag = fsqrt(new_mag); new_dir[X] /= new_mag; new_dir[Y] /= new_mag; new_dir[Z] /= new_mag;

/* make sure new lookat direction has same mag as old lookat vector */ at[X] = new_dir[X]*mag + from[X]; at[Y] = new_dir[Y]*mag + from[Y]; at[Z] = new_dir[Z]*mag + from[Z];

} else if (StereoModel == PARALLELVIEWS){

if (LeftBuffer) at[X] = -IOD/2.; else at[X] = IOD/2.;

} else if (StereoModel == SCREENCONVERGE){ }

cpack(0x2f2f2f2f); zclear(); clear();

ortho2(0.,1.,0.,1.); cpack(0xffffffff);

switch (StereoModel){ case CONVERGENCETRACK: sprintf(buf,"StereModel: CONVERGENCETRACK"); break; case PARALLELVIEWS: sprintf(buf,"StereModel: PARALLELVIEWS"); break; case SCREENCONVERGE: sprintf(buf,"StereModel: SCREENCONVERGE"); break; } cmov2(0.1,0.96); charstr(buf);

sprintf(buf,"IOD: %2.1f",IOD); cmov2(0.4,0.96); charstr(buf);

sprintf(buf,"centroid at: %3.1f inches", DISTANCE_TO_SCREEN-Ztranslation); cmov2(0.5,0.96); charstr(buf);

/* sprintf(buf,"centroid at: %3.1f inches", DISTANCE_TO_SCREEN-Ztranslation); cmov2(0.5,0.96); charstr(buf); */

pushmatrix();

window(-CLIP_FACTOR*SCREEN_WIDTH/2., CLIP_FACTOR*SCREEN_WIDTH/2., -CLIP_FACTOR*SCREEN_HEIGHT/2., CLIP_FACTOR*SCREEN_HEIGHT/2., NEAR_CLIP_DISTANCE, FAR_CLIP_DISTANCE);

lookat(from[X], from[Y], from[Z], at[X], at[Y], at[Z], 0);

draw_frame(ry,-rx, DESIRED_SIZE_ON_SCREEN/WORLD_SPACE_SIZE);

popmatrix();

if (LeftBuffer) swapbuffers(); } }

void draw_frame(float ry, float rx, float s) {

register int i,j;

#if 0 cpack(0xafafafaf); for (i = 0; i < 20; i++){ float v1[3]; float v2[3];

v1[2] = 0.; v1[1] = SCREEN_HEIGHT/2.; v1[0] = SCREEN_WIDTH*((float)i/20.) - SCREEN_WIDTH/2;

v2[2] = 0.; v2[1] = -SCREEN_HEIGHT/2.; v2[0] = SCREEN_WIDTH*((float)i/20.) - SCREEN_WIDTH/2; bgnline(); v3f(v1); v3f(v2); endline(); } #endif

translate(0.,0.,Ztranslation); rot(ry,'y'); rot(-rx,'x'); scale(s,s,s);

for (i = 0; i < NumFaces; i++){ cpack(Colors[i]); texbind(0,(i%6)+1); bgnpolygon(); for (j = 0; j < NumVertsPerFace; j++){ t2f(tex[j]); v3f(cdata[cndex[i][j]]); } endpolygon(); } texbind(0,0); }

john m. airey airey++at++asd.sgi.com (415) 390-5248 M/S 7U-553 Silicon Graphics, Advanced Graphics Division 2011 N. Shoreline Blvd., Mtn. View, CA 94039 ------ Ivan Bach, ib++at++sgi.com


New Message Reply Date view Thread view Subject view Author view

This archive was generated by hypermail 2.0b2 on Mon Aug 10 1998 - 17:50:13 PDT

This message has been cleansed for anti-spam protection. Replace '++at++' in any mail addresses with the '@' symbol.