Article View: comp.sys.sgi.graphics
Article #164Source for stereo demo...
From: John Airey
Date: Wed, 27 Jan 1993 22:25
Date: Wed, 27 Jan 1993 22:25
435 lines
9878 bytes
9878 bytes
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@asd.sgi.com (415) 390-5248
M/S 7U-553 Silicon Graphics, Advanced Graphics Division
2011 N. Shoreline Blvd., Mtn. View, CA 94039
Technical Details
Message-ID:
<1k7245INNhc7@fido.asd.sgi.com>Path:
arc1-ca.pugleaf.net!sparky!uunet!news.uiowa.edu!hobbes.physics.uiowa.edu!news.iastate.edu!destroyer!gatech!darwin.sura.net!sgiblab!sgigate!odin!fido!woof!aireyShow Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!sparky!uunet!news.uiowa.edu!hobbes.physics.uiowa.edu!news.iastate.edu!destroyer!gatech!darwin.sura.net!sgiblab!sgigate!odin!fido!woof!airey From: airey@woof.asd.sgi.com (John Airey) Newsgroups: comp.sys.sgi.graphics 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@fido.asd.sgi.com> NNTP-Posting-Host: woof.asd.sgi.com