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

  1. /* Routines to initialize math tables for greater speed later on.
  2.    Part of the REND386 package by Dave Stampe and Bernie Roehl.
  3.  */
  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 <stdlib.h>
  13. #include <math.h>
  14. #include <stdio.h>
  15. #include "rend386.hpp"
  16. #include "intmath.h"
  17.  
  18. /* this stuff moved out of integer core so that there are
  19.    no uncompilable TC references in integer core library */
  20.  
  21. #define XFSC 536870912   /* 2**29 for shifting xform coeffs to long */
  22. static float xfsc = XFSC;
  23.  
  24. long sintable[258];
  25. long atantable[258];
  26.  
  27. fill_sine()
  28. {
  29.     int i;
  30.  
  31.     for (i = 0; i < 256; i++)
  32.         sintable[i] = (XFSC * sin(3.14159/2/256 * i));
  33.     sintable[256] = XFSC;
  34.     sintable[257] = XFSC;
  35.  
  36.     for (i = 0; i < 256; i++)
  37.         atantable[i] = 180.0/3.14159*65536.0 * atan(i/256.0);
  38.     atantable[256] = atantable[257] = 45*65536L;
  39.  
  40.     return 0;
  41. }
  42.  
  43.  
  44. /* tables for sphere object clipping:   */
  45.  
  46. long sclip_C[800]; /* 1/sqrt(zoom^2 + 1) table           */
  47. long sclip_M[800]; /* zoom * C table  (table: i = 32*zoom) */
  48.  
  49. /* range: FOV = 2*atan(1/zoom)          */
  50. /* or about 150 to 7 degrees         */
  51.  
  52. fill_sclip()
  53. {
  54.     int i;
  55.     float n;
  56.  
  57.     for (i = 0; i < 800; i++)
  58.     {
  59.         n = 1.0/sqrt((i/16.0)*(i/16.0) + 1);
  60.         sclip_C[i] = XFSC * n;
  61.         sclip_M[i] = XFSC * ((i/16.0) * n) ;
  62.     }
  63.     return 0;
  64. }
  65.  
  66. int sqrtable[1024];
  67.  
  68. fill_sqrt()
  69. {
  70.     int i;
  71.  
  72.     for (i = 0; i < 1024; i++)
  73.         sqrtable[i] = 1024*sqrt(i);
  74.     return 0;
  75. }
  76.  
  77.  
  78. long slow_magnitude(long a, long b) /* done the float way */
  79. {
  80.     float x = a;
  81.     float y = b;
  82.  
  83.     return sqrt(x*x + y*y);
  84. }
  85.  
  86.  
  87. /*  m[0][0] = cos(rz)*cos(ry) + sin(rz)*sin(rx)*sin(ry) */
  88. /*  m[0][1] = -sin(rz)*cos(rx);  */
  89. /*  m[0][2] = cos(rz)*sin(ry) + sin(rz)*sin(rx)*cos(ry); */
  90. /*  m[1][0] = sin(rz)*cos(ry) - cos(rz)*sin(rx)*sin(ry); */
  91. /*  m[1][1] = cos(rz)*cos(rx);   */
  92. /*  m[1][2] = -sin(rz)*sin(ry) - cos(rz)*sin(rx)*cos(ry); */
  93. /*  m[2][0] = cos(rx)*sin(ry); */
  94. /*    m[2][1] = sinx;              */
  95. /*  m[2][2] = cos(rx)*cos(ry) ;  */
  96.  
  97. /* this uses float, so use only where speed is not important */
  98. #define XFLC 536870912.0
  99. #define XRLC 3754939.378
  100.  
  101.  
  102. /* makes matrix that will xform Z axis to given vector */
  103. void vector_to_matrix(MATRIX m, long x, long y, long z)
  104. {
  105.     float ya = atan2(x, z);
  106.     float xa = -asin(y/sqrt((float)x*x+(float)y*y+(float)z*z));
  107.  
  108.     std_matrix(m, xa*XRLC, ya*XRLC, 0, 0, 0, 0);
  109. }
  110.  
  111.  
  112. static void setlength(long length, long *x, long *y, long *z)
  113. {
  114.     float fx = *x;
  115.     float fy = *y;
  116.     float fz = *z;
  117.     float d = length/sqrt(fx*fx + fy*fy + fz*fz);
  118.     *x = d*fx;
  119.     *y = d*fy;
  120.     *z = d*fz;
  121. }
  122.  
  123. void fix_matrix_scale(MATRIX m) /* slow but sure: do once every 1000 matrix mults */
  124. {
  125.     setlength(XFLC, &m[0][0], &m[0][1], &m[0][2]);
  126.     setlength(XFLC, &m[1][0], &m[1][1], &m[1][2]);
  127.     setlength(XFLC, &m[2][0], &m[2][1], &m[2][2]);
  128.     setlength(XFLC, &m[0][0], &m[1][0], &m[2][0]);
  129.     setlength(XFLC, &m[0][1], &m[1][1], &m[2][1]);
  130.     setlength(XFLC, &m[0][2], &m[1][2], &m[2][2]);
  131. }
  132.