home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Professional / OS2PRO194.ISO / os2 / graphic / qrt / precomp.c < prev    next >
C/C++ Source or Header  |  1989-03-26  |  4KB  |  160 lines

  1. /**********************************************************
  2.  
  3.    Contains pre-computing routines for objects.  This
  4.    is to get as much as possible out of the way so that
  5.    the line/object intersection routines don't have to
  6.    do it.  Pre-computed stuff is stored in the objects
  7.    precomp sub-structure.
  8.  
  9.  **********************************************************/
  10.  
  11. #include "qrt.h"
  12.  
  13. /* #define PRECOMPDEBUG */
  14.  
  15.  
  16. /**********************************************************
  17.  
  18.                    Precompute sphere
  19.  
  20.   Computes : n1 = sqr(radius);
  21.  
  22.  **********************************************************/
  23.  
  24. PreCompSphere(obj)
  25.   OBJ_PTR obj;
  26. {
  27.  
  28. # ifdef ROBUST
  29.     if (obj->type != SPHERE) Error(INTERNAL_ERROR,901);
  30. # endif
  31.  
  32.   obj->precomp.n1 = sqr(obj->vect1.x);
  33.  
  34. }
  35.  
  36.  
  37. /**********************************************************
  38.  
  39.                    Precompute Planar object
  40.  
  41.   Computes : norm   = vect1 X vect2
  42.              n1     = Dotprod (norm,loc)
  43.              len1   = sqr( | VECT1 | )
  44.              len2   = sqr( | VECT2 | )
  45.  
  46.   Changed 12 Mar 89 to add:
  47.  
  48.              sin1   = v1->x * v2->y - v1->y * v2->x;
  49.              cos1   = v1->x * v2->z - v1->z * v2->x;
  50.              sin2   = v1->y * v2->z - v1->z * v2->y;
  51.  
  52.  **********************************************************/
  53.  
  54. PreCompPlane(obj)
  55.   OBJ_PTR obj;
  56. {
  57.  
  58. # ifdef ROBUST
  59.     if (!((obj->type == PARALLELOGRAM) ||
  60.           (obj->type == TRIANGLE)      ||
  61.           (obj->type == RING)))
  62.       Error(INTERNAL_ERROR,902);
  63. # endif
  64.  
  65.   CrossProd(&(obj->precomp.norm),&(obj->vect1),&(obj->vect2));
  66.   Normalize(&(obj->precomp.norm));
  67.  
  68.   obj->precomp.n1 = DotProd((obj->precomp.norm),(obj->loc));
  69.  
  70.   obj->precomp.len1 = DotProd(obj->vect1,obj->vect1);
  71.   obj->precomp.len2 = DotProd(obj->vect2,obj->vect2);
  72.  
  73.   /* these precompute fields are not really sine and cos;
  74.      they are just used to hold stuff for planes          */
  75.  
  76.   obj->precomp.sin1 = obj->vect1.x * obj->vect2.y -
  77.                       obj->vect1.y * obj->vect2.x;
  78.  
  79.   obj->precomp.cos1 = obj->vect1.x * obj->vect2.z -
  80.                       obj->vect1.z * obj->vect2.x;
  81.  
  82.   obj->precomp.sin2 = obj->vect1.y * obj->vect2.z -
  83.                       obj->vect1.z * obj->vect2.y;
  84.  
  85. }
  86.  
  87.  
  88. /**********************************************************
  89.  
  90.                    Precompute Quadratic
  91.  
  92.  **********************************************************/
  93.  
  94. PreCompQuadratic(obj)
  95.   OBJ_PTR obj;
  96. {
  97.  
  98.   VECTOR newdir;
  99.  
  100. # ifdef ROBUST
  101.     if (obj->type != QUADRATIC) Error(INTERNAL_ERROR,903);
  102. # endif
  103.  
  104.   Normalize(&(obj->vect1));
  105.  
  106.   if ((obj->vect1.x!=0) || (obj->vect1.z !=0)) {
  107.     obj->precomp.cos1 = obj->vect1.z /
  108.                         sqrt(sqr(obj->vect1.x) + sqr(obj->vect1.z));
  109.  
  110.     obj->precomp.sin1 = sqrt(1 - sqr(obj->precomp.cos1));
  111.   } else {
  112.     obj->precomp.cos1 =
  113.     obj->precomp.sin1 = 0;
  114.   }
  115.  
  116.   /* find new direction after first rotation */
  117.  
  118.   newdir.x = obj->vect1.x *  obj->precomp.cos1 +
  119.              obj->vect1.z * -obj->precomp.sin1;
  120.  
  121.   newdir.y = obj->vect1.y;
  122.  
  123.   newdir.z = obj->vect1.x * obj->precomp.sin1 +
  124.              obj->vect1.z * obj->precomp.cos1;
  125.  
  126.   /* now do second rotation */
  127.  
  128.   if ((newdir.y!=0) || (newdir.z !=0)) {
  129.     obj->precomp.cos2 = newdir.y /
  130.                         sqrt(sqr(newdir.y) + sqr(newdir.z));
  131.  
  132.     obj->precomp.sin2 = sqrt(1 - sqr(obj->precomp.cos2));
  133.   } else {
  134.     obj->precomp.cos2 =
  135.     obj->precomp.sin2 = 0;
  136.   }
  137.  
  138. # ifdef PRECOMPDEBUG
  139.   printf("PRECOMPQUADRATIC: cos1,sin1 = %f %f\n",
  140.           obj->precomp.cos1,obj->precomp.sin1);
  141.  
  142.   printf("                  cos2,sin2 = %f %f\n",
  143.           obj->precomp.cos2,obj->precomp.sin2);
  144. # endif
  145.  
  146. }
  147.  
  148.  
  149. /**********************************************************
  150.  
  151.       Null precomputing routine for all other objects
  152.  
  153.  **********************************************************/
  154.  
  155. PreCompNull(obj)
  156.   OBJ_PTR obj;
  157. {
  158. }
  159.  
  160.