home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1993 #3 / NN_1993_3.iso / spool / comp / sys / sgi / graphics / 234 < prev    next >
Encoding:
Text File  |  1993-01-28  |  9.2 KB  |  446 lines

  1. Path: sparky!uunet!news.uiowa.edu!hobbes.physics.uiowa.edu!news.iastate.edu!destroyer!gatech!darwin.sura.net!sgiblab!sgigate!odin!fido!woof!airey
  2. From: airey@woof.asd.sgi.com (John Airey)
  3. Newsgroups: comp.sys.sgi.graphics
  4. Subject: Source for stereo demo...
  5. Date: 27 Jan 1993 22:25:09 GMT
  6. Organization: Silicon Graphics, Inc.  Mountain View, CA
  7. Lines: 435
  8. Message-ID: <1k7245INNhc7@fido.asd.sgi.com>
  9. NNTP-Posting-Host: woof.asd.sgi.com
  10.  
  11. Here is some source for a demo that uses stereo in a window.
  12. For RealityEngine.
  13.  
  14. No promises or guarantees okay? It works for me.
  15.  
  16.  
  17. #include <stdio.h>
  18. #include <math.h>
  19. #include <gl/image.h>
  20. #include <gl/gl.h>
  21. #include <gl/device.h>
  22.  
  23. #define X 0
  24. #define Y 1
  25. #define Z 2
  26.  
  27. static int Colors[] = 
  28. { 0xff7f1f9f,
  29.   0xff5f0f9f,
  30.   0xff9f0f3f,
  31.   0xff0f9fff,
  32.   0xffff1fff,
  33.   0xff3f5f4f,
  34.   0xff9f3f0f,
  35.   0xff1f2f1f,
  36. };
  37.  
  38. #define CFACES 6
  39. #define VERTS_PER_CFACE 4
  40. static float    cdata[8][3] =
  41. {{-1., -1., -1.,},
  42.  { 1., -1., -1.,},
  43.  { 1.,  1., -1.,},
  44.  {-1.,  1., -1.,},
  45.  
  46.  {-1., -1., 1.,},
  47.  { 1., -1., 1.,},
  48.  { 1.,  1., 1.,},
  49.  {-1.,  1., 1.,},};
  50.  
  51. static int cndex[CFACES][VERTS_PER_CFACE] = 
  52. {{3, 2, 1, 0},
  53.  {4, 5, 6, 7},
  54.  {0, 1, 5, 4},
  55.  {1, 2, 6, 5},
  56.  {2, 3, 7, 6},
  57.  {3, 0, 4, 7},};
  58.  
  59. static float tex[4][2] = 
  60. {{ 0., 0., },
  61.  { 1., 0., },
  62.  { 1., 1., },
  63.  { 0., 1., },};
  64.  
  65. static int NumFaces = 6;
  66. static int NumVertsPerFace = 3;
  67.  
  68. static int LeftBuffer = 1;
  69. static float IOD  = 2.3;
  70.  
  71. maketexture(unsigned long t[], char *name, int x, int y)
  72. {
  73.    int j,i,n=0;
  74.    int r,g,b,a;
  75.    IMAGE *iimage;
  76.    unsigned short *st = (unsigned short *) t;
  77.  
  78.    short rbuf[1024],gbuf[1024],bbuf[1024],abuf[1024];
  79.  
  80.    if ( (iimage = iopen(name,"r")) == NULL){
  81.       fprintf(stderr,"\nCANT OPEN %s\n\n",name);
  82.       exit(1);
  83.    }
  84.  
  85.    for (j= 0; j< x; j++){
  86.       getrow(iimage,rbuf,j,0);
  87.  
  88.       for (i= 0; i < y; i++){
  89.      st[n++]= (rbuf[i]) | (rbuf[i]<<8);
  90.       }
  91.    }
  92.    iclose(iimage);
  93. }
  94.  
  95. #define TEXSIZE 64
  96. unsigned long tt1[TEXSIZE*TEXSIZE];
  97. unsigned long tt2[TEXSIZE*TEXSIZE];
  98. unsigned long tt3[TEXSIZE*TEXSIZE];
  99. unsigned long tt4[TEXSIZE*TEXSIZE];
  100. unsigned long tt5[TEXSIZE*TEXSIZE];
  101. unsigned long tt6[TEXSIZE*TEXSIZE];
  102.  
  103. float Ztranslation = 0.;
  104.  
  105. #define CONVERGENCETRACK 0 
  106. #define PARALLELVIEWS    1
  107. #define SCREENCONVERGE   2
  108. int StereoModel = CONVERGENCETRACK;
  109.  
  110. float texps[] = { TX_MAGFILTER, TX_SHARPEN,
  111.           TX_MINFILTER, TX_MIPMAP_TRILINEAR,
  112.           TX_INTERNAL_FORMAT, TX_IA_8, TX_NULL };
  113.  
  114. float tevps[] = { TV_MODULATE, TV_NULL };
  115.  
  116. float ConvergenceFudge = 0.0;
  117.  
  118. extern void draw_frame(float , float , float );
  119. main()
  120. {
  121.    short           val, mval[2], lastval[2];
  122.    long            org[2], size[2];
  123.    Device          dev, mdev[2];
  124.    Boolean         run;
  125.    int             leftmouse_down = 0;
  126.    int             middlemouse_down = 0;
  127.    float rx,ry;
  128.    float from[3];
  129.    float at[3];
  130.    char buf[80];
  131.  
  132.    lastval[X] = -1;
  133.  
  134.    maketexture(tt1,"t1.rgba",TEXSIZE,TEXSIZE);
  135.    maketexture(tt2,"t2.rgba",TEXSIZE,TEXSIZE);
  136.    maketexture(tt3,"t3.rgba",TEXSIZE,TEXSIZE);
  137.    maketexture(tt4,"t4.rgba",TEXSIZE,TEXSIZE);
  138.    maketexture(tt5,"t5.rgba",TEXSIZE,TEXSIZE);
  139.    maketexture(tt6,"t6.rgba",TEXSIZE,TEXSIZE);
  140.  
  141.    foreground();
  142.    noborder();
  143.    prefposition(0,959,0,679);
  144.    winopen("StereoSpin");
  145.    RGBmode();
  146.    doublebuffer();
  147.    subpixel(1);
  148.    zbuffer(1);
  149.    stereobuffer();
  150.    gconfig();
  151.  
  152.    if (!getgconfig(GC_STEREO)){
  153.       fprintf(stderr,"stereo not available\n");
  154.       exit(1);
  155.    }
  156.  
  157.    tevdef(1,0,tevps);
  158.    tevbind(0,1);
  159.  
  160.    texdef2d(1,2,TEXSIZE,TEXSIZE,tt1,0,texps);
  161.    texdef2d(2,2,TEXSIZE,TEXSIZE,tt2,0,texps);
  162.    texdef2d(3,2,TEXSIZE,TEXSIZE,tt3,0,texps);
  163.    texdef2d(4,2,TEXSIZE,TEXSIZE,tt4,0,texps);
  164.    texdef2d(5,2,TEXSIZE,TEXSIZE,tt5,0,texps);
  165.    texdef2d(6,2,TEXSIZE,TEXSIZE,tt6,0,texps);
  166.  
  167.    mmode(MVIEWING);
  168.  
  169.    getorigin(&org[X], &org[Y]);
  170.    getsize(&size[X], &size[Y]);
  171.    mdev[X] = MOUSEX;
  172.    mdev[Y] = MOUSEY;
  173.    getdev(2, mdev, lastval);    /* initialize lastval[] */
  174.    lastval[X] -= org[X];
  175.    lastval[Y] -= org[Y];
  176.    qdevice(LEFTMOUSE);
  177.    qdevice(MIDDLEMOUSE);
  178.    qdevice(ESCKEY);
  179.    qdevice(MOUSEX);
  180.    qdevice(MOUSEY);
  181.  
  182.    qdevice(SPACEKEY);
  183.    qdevice(RETKEY);
  184.  
  185.    qdevice(UPARROWKEY);
  186.    qdevice(DOWNARROWKEY);
  187.  
  188.    qdevice(LEFTARROWKEY);
  189.    qdevice(RIGHTARROWKEY);
  190.  
  191.    while (1){
  192.  
  193.       while (qtest()) {
  194.  
  195.      switch (dev = qread(&val)) {
  196.      case LEFTMOUSE:
  197.         leftmouse_down = val;
  198.         break;
  199.  
  200.      case MIDDLEMOUSE:
  201.         middlemouse_down = val;
  202.         break;
  203.  
  204.      case MOUSEX:
  205.         mval[X] = val - org[X];
  206.         break;
  207.      case MOUSEY:
  208.         mval[Y] = val - org[Y];
  209.         if (leftmouse_down) {
  210.            rx += (mval[Y] - lastval[Y]);
  211.            ry += (mval[X] - lastval[X]); 
  212.         }
  213.         if (middlemouse_down){
  214.            Ztranslation += (mval[X] - lastval[X])*(1./8.);
  215.         }
  216.         lastval[X] = mval[X];
  217.         lastval[Y] = mval[Y];
  218.         break;
  219.  
  220.      case SPACEKEY:
  221.         if (val){
  222.            StereoModel = (StereoModel+1)%3;
  223.         }
  224.         break;
  225.      
  226.      case RETKEY:
  227.         if (val){
  228.            IOD = 2.3;
  229.            StereoModel = CONVERGENCETRACK;
  230.            ConvergenceFudge = 0.0;
  231.         }
  232.         break;
  233.  
  234.      case UPARROWKEY:
  235.         if (val)
  236.            ConvergenceFudge += 0.5;
  237.         break;
  238.  
  239.      case DOWNARROWKEY:
  240.         if (val)
  241.            ConvergenceFudge -= 0.5;
  242.         break;
  243.  
  244.      case LEFTARROWKEY:
  245.         if (val)
  246.            IOD -= .1;
  247.         break;
  248.  
  249.      case RIGHTARROWKEY:
  250.         if (val)
  251.            IOD += .1;
  252.         break;
  253.  
  254.      case ESCKEY:
  255.         exit(0);
  256.      }
  257.       }
  258.  
  259.  
  260. /* 
  261.  * try to define everything in inches 
  262.  *
  263.  */
  264.  
  265. #define SCREEN_WIDTH  15.       /* width of screen in inches*/
  266. #define SCREEN_HEIGHT 10.625    /* height of screen in inches*/
  267. #define DISTANCE_TO_SCREEN 19.  /* distance from eye to screen (nearclip)*/
  268.  
  269. #define CLIP_FACTOR (1./8.00) /* to move near clip in */
  270.  
  271. #define NEAR_CLIP_DISTANCE    (DISTANCE_TO_SCREEN*CLIP_FACTOR)
  272. #define FAR_CLIP_DISTANCE    (DISTANCE_TO_SCREEN*30.)  
  273.  
  274. #define DESIRED_SIZE_ON_SCREEN    2.
  275. #define WORLD_SPACE_SIZE    2.
  276.  
  277.  
  278.       if (LeftBuffer = !LeftBuffer){
  279.  
  280.      leftbuffer(1);
  281.      rightbuffer(0); 
  282.  
  283.      from[X] = -IOD/2.;
  284.      from[Y] =    0.0;
  285.      from[Z] =    DISTANCE_TO_SCREEN;
  286.  
  287.      at[X] = 0.0;
  288.      at[Y] = 0.0;
  289.      at[Z] = 0.0;
  290.       }
  291.       else{
  292.  
  293.      leftbuffer(0);
  294.      rightbuffer(1);
  295.  
  296.      from[X] =  IOD/2.;
  297.      from[Y] =    0.0;
  298.      from[Z] =    DISTANCE_TO_SCREEN;
  299.  
  300.      at[X] = 0.0;
  301.      at[Y] = 0.0;
  302.      at[Z] = 0.0;
  303.       }
  304.  
  305.       if (StereoModel == CONVERGENCETRACK) {
  306.  
  307.      float dir[3],new_dir[3],mag, new_mag;
  308.  
  309.      /* compute old magnitude of lookat vector */
  310.      dir[X] = at[X]-from[X];
  311.      dir[Y] = at[Y]-from[Y];
  312.      dir[Z] = at[Z]-from[Z];
  313.      mag = dir[X]*dir[X] + dir[Y]*dir[Y] + dir[Z]*dir[Z];
  314.      mag = fsqrt(mag);
  315.  
  316.      /* compute new lookat direction */
  317.      new_dir[X] = dir[X];
  318.      new_dir[Y] = dir[Y];
  319.      new_dir[Z] = dir[Z]+Ztranslation+ConvergenceFudge;
  320.      new_mag = new_dir[X]*new_dir[X]  + 
  321.            new_dir[Y]*new_dir[Y]  + 
  322.            new_dir[Z]*new_dir[Z];
  323.      new_mag = fsqrt(new_mag);
  324.      new_dir[X] /= new_mag;
  325.      new_dir[Y] /= new_mag;
  326.      new_dir[Z] /= new_mag;
  327.  
  328.      /* make sure new lookat direction has same mag as old lookat vector */
  329.      at[X] = new_dir[X]*mag + from[X];
  330.      at[Y] = new_dir[Y]*mag + from[Y];
  331.      at[Z] = new_dir[Z]*mag + from[Z];
  332.  
  333.       }
  334.       else if (StereoModel == PARALLELVIEWS){
  335.  
  336.      if (LeftBuffer) at[X] = -IOD/2.;
  337.      else            at[X] =  IOD/2.;
  338.  
  339.       }
  340.       else if (StereoModel == SCREENCONVERGE){
  341.       }
  342.  
  343.       cpack(0x2f2f2f2f);
  344.       zclear();
  345.       clear();
  346.  
  347.  
  348.       ortho2(0.,1.,0.,1.);
  349.       cpack(0xffffffff);
  350.  
  351.       switch (StereoModel){
  352.      case CONVERGENCETRACK:
  353.         sprintf(buf,"StereModel: CONVERGENCETRACK");
  354.         break;
  355.      case PARALLELVIEWS:
  356.         sprintf(buf,"StereModel: PARALLELVIEWS");
  357.         break;
  358.      case SCREENCONVERGE:
  359.         sprintf(buf,"StereModel: SCREENCONVERGE");
  360.         break;
  361.       }
  362.       cmov2(0.1,0.96);
  363.       charstr(buf);
  364.  
  365.       sprintf(buf,"IOD: %2.1f",IOD);
  366.       cmov2(0.4,0.96);
  367.       charstr(buf);
  368.  
  369.       sprintf(buf,"centroid at: %3.1f inches",
  370.       DISTANCE_TO_SCREEN-Ztranslation);
  371.       cmov2(0.5,0.96);
  372.       charstr(buf);
  373.  
  374.       /*
  375.       sprintf(buf,"centroid at: %3.1f inches",
  376.       DISTANCE_TO_SCREEN-Ztranslation);
  377.       cmov2(0.5,0.96);
  378.       charstr(buf);
  379.       */
  380.  
  381.       pushmatrix();
  382.  
  383.       window(-CLIP_FACTOR*SCREEN_WIDTH/2.,  CLIP_FACTOR*SCREEN_WIDTH/2.,   
  384.          -CLIP_FACTOR*SCREEN_HEIGHT/2., CLIP_FACTOR*SCREEN_HEIGHT/2.,
  385.           NEAR_CLIP_DISTANCE,  FAR_CLIP_DISTANCE);
  386.  
  387.       lookat(from[X], from[Y], from[Z], at[X],  at[Y],  at[Z], 0);
  388.  
  389.       draw_frame(ry,-rx, DESIRED_SIZE_ON_SCREEN/WORLD_SPACE_SIZE);
  390.  
  391.       popmatrix();
  392.  
  393.       if (LeftBuffer)
  394.      swapbuffers();
  395.    }
  396. }
  397.  
  398. void draw_frame(float ry, float rx, float s)
  399. {
  400.  
  401.    register int i,j;
  402.  
  403.  
  404. #if 0
  405.    cpack(0xafafafaf);
  406.    for (i = 0; i < 20; i++){
  407.       float v1[3];
  408.       float v2[3];
  409.  
  410.       v1[2] = 0.;
  411.       v1[1] = SCREEN_HEIGHT/2.;
  412.       v1[0] = SCREEN_WIDTH*((float)i/20.) - SCREEN_WIDTH/2;
  413.  
  414.       v2[2] = 0.;
  415.       v2[1] = -SCREEN_HEIGHT/2.;
  416.       v2[0] = SCREEN_WIDTH*((float)i/20.) - SCREEN_WIDTH/2;
  417.       bgnline();
  418.      v3f(v1);
  419.      v3f(v2);
  420.       endline();
  421.    }
  422. #endif
  423.  
  424.  
  425.    translate(0.,0.,Ztranslation);
  426.    rot(ry,'y');
  427.    rot(-rx,'x');
  428.    scale(s,s,s);
  429.  
  430.    for (i = 0; i < NumFaces; i++){
  431.       cpack(Colors[i]);
  432.       texbind(0,(i%6)+1);
  433.       bgnpolygon();
  434.       for (j = 0; j < NumVertsPerFace; j++){
  435.      t2f(tex[j]); v3f(cdata[cndex[i][j]]);
  436.       }
  437.       endpolygon();
  438.    }
  439.    texbind(0,0);
  440. }
  441.  
  442.                 
  443. john m. airey      airey@asd.sgi.com  (415) 390-5248
  444.                    M/S 7U-553 Silicon Graphics, Advanced Graphics Division
  445.                    2011 N. Shoreline Blvd., Mtn. View, CA 94039  
  446.