home *** CD-ROM | disk | FTP | other *** search
/ Virtual Reality Zone / VRZONE.ISO / mac / PC / PCGLOVE / GLOVE / OBJGLV.ZIP / SRC / DEMO4B / SUPP / STEREOV.CPP < prev    next >
C/C++ Source or Header  |  1993-04-07  |  4KB  |  140 lines

  1. /* Support for steroscopic viewing */
  2.  
  3. /* Written by Dave Stampe, July 1992 */
  4.  
  5. /* Copyright 1992 by Dave Stampe and Bernie Roehl.
  6.    May be freely used to write software for release into the public domain;
  7.    all commercial endeavours MUST contact Bernie Roehl and Dave Stampe
  8.    for permission to incorporate any part of this software into their
  9.    products!
  10.  */
  11.  
  12. #include <conio.h>
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include <ctype.h>   /* toupper() */
  16. #include <dos.h>
  17.  
  18. #include "rend386.hpp"
  19. #include "intmath.h"
  20.  
  21. /* default screen data setup: example only */
  22.  
  23. /* STEREO default_stereo = { 1000, 250, 320, 63, 1000, 10*65536L }; */
  24.  
  25. /* static VIEW default_view = {       (EXAMPLE ONLY) */
  26. /*            0,0,-1000,       */ /* ex,ey,ez */
  27. /*            0,0,0,           */ /* pan,tilt,roll */
  28. /*            9*65536L,        */ /* zoom */
  29. /*            1000,15000,-5000, */ /* lx,ly,lz */
  30. /*            0,319,0,200,     */ /* left,right,top,bottom */
  31. /*            1,100000,        */ /* hither, yon */
  32. /*            1/1.25*65536L,   */ /* aspect ratio */
  33. /*            0,               */ /* flags */
  34. /*            0,0                 */ /* no offset */
  35. /*          };               */ /* don't init. matrix */
  36.  
  37.  
  38. struct stview { 
  39.     MATRIX xform;
  40.     long zoom;
  41.     int x_offset;
  42.     long left, top, right, bottom;
  43.     int orientation;
  44. };
  45.  
  46. static struct stview sview[2];
  47.  
  48. /* call once for each eye to create cached stereo data */
  49. /* as general as possible to support all devices       */
  50.  
  51. void compute_stereo_data(STEREO *stereo, int eye, int xflip, int xdist, long yr,
  52.     long left, long top, long right, long bottom )
  53. {
  54.     long x_fixup;
  55.     long world_iod;
  56.     MATRIX c;
  57.  
  58.     sview[eye].zoom = (2*65536L * stereo->phys_screen_dist) /
  59.         stereo->phys_screen_width;
  60.  
  61.     /* screen offset */
  62.     x_fixup = (stereo->phys_eye_spacing *
  63.         stereo->phys_screen_dist * stereo->pixel_width ) /
  64.         (stereo->phys_convergence * 2 *stereo->phys_screen_width);
  65.  
  66.     /* eye point */
  67.     world_iod = (stereo->phys_eye_spacing * stereo->world_scaling) >> 17;
  68.  
  69.     /* make left/right */
  70.     if (eye == 0)
  71.     {
  72.         sview[eye].x_offset = xdist + ((xflip) ? -x_fixup : x_fixup) ;
  73.         std_matrix(sview[eye].xform, 0, -yr, 0, -world_iod, 0, 0);
  74.     }
  75.     else if (eye == 1)
  76.     {
  77.         sview[eye].x_offset = xdist + ((xflip) ? x_fixup : -x_fixup) ;
  78.         std_matrix(sview[eye].xform, 0, yr, 0, world_iod, 0, 0);
  79.     }
  80.     sview[eye].left = left;
  81.     sview[eye].right = right;
  82.     sview[eye].top = top;
  83.     sview[eye].bottom = bottom;
  84.     sview[eye].orientation = xflip ? XFLIP : 0;
  85. }
  86.  
  87.  
  88. void make_stereo_view(VIEW *root, VIEW *nview, int eye)
  89. {
  90.     MATRIX c;
  91.  
  92.     *nview = *root; /* copy root view */
  93.     nview->zoom = sview[eye].zoom;
  94.  
  95.     nview->x_offset +=
  96.         sview[eye].orientation ? -sview[eye].x_offset : -sview[eye].x_offset ;
  97.  
  98.     view_to_matrix(nview,c);
  99.     matrix_product(c, sview[eye].xform, c);
  100.     matrix_view_factors(nview,c);
  101.  
  102.     nview->left = sview[eye].left;
  103.     nview->right = sview[eye].right;
  104.     nview->top = sview[eye].top;
  105.     nview->bottom = sview[eye].bottom;
  106.  
  107.     nview->orientation = sview[eye].orientation ^ nview->orientation;
  108.  
  109.     initialize_screen_factors(nview);
  110. }
  111.  
  112.  
  113. /* sufficient if only view point has changed and no twist or offset */
  114. void update_stereo_view(VIEW *v, STEREO *s, int eye)
  115. {
  116.     long world_iod = (s->phys_eye_spacing * s->world_scaling) >> 17;
  117.  
  118.     if (eye == LEFT_EYE)
  119.     {
  120.         v->eye_xform[3][0] -= m_mult(world_iod,v->eye_xform[0][0]);
  121.         v->eye_xform[3][1] -= m_mult(world_iod,v->eye_xform[1][0]);
  122.         v->eye_xform[3][2] -= m_mult(world_iod,v->eye_xform[2][0]);
  123.     }
  124.     else if (eye == RIGHT_EYE)
  125.     {
  126.         v->eye_xform[3][0] += m_mult(world_iod,v->eye_xform[0][0]);
  127.         v->eye_xform[3][1] += m_mult(world_iod,v->eye_xform[1][0]);
  128.         v->eye_xform[3][2] += m_mult(world_iod,v->eye_xform[2][0]);
  129.     }
  130. }
  131.  
  132. /* makes a standard SWITCHED stereo screen */
  133.  
  134. void default_stereo_setup(VIEW *v, STEREO *s)
  135. {
  136.     compute_stereo_data(s, 0, 0, 0, 0*65536L, v->left, v->top, v->right, v->bottom);
  137.     compute_stereo_data(s, 1, 0, 0, 0*65536L, v->left, v->top, v->right, v->bottom);
  138. }
  139.  
  140.