home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / GRAPHICS / rayshade.lzh / box.c < prev    next >
Text File  |  1990-05-08  |  3KB  |  123 lines

  1. /*
  2.  * box.c
  3.  *
  4.  * Copyright (C) 1989, Craig E. Kolb
  5.  *
  6.  * This software may be freely copied, modified, and redistributed,
  7.  * provided that this copyright notice is preserved on all copies.
  8.  *
  9.  * There is no warranty or other guarantee of fitness for this software,
  10.  * it is provided solely .  Bug reports or fixes may be sent
  11.  * to the author, who may or may not act on them as he desires.
  12.  *
  13.  * You may not include this software in a program or other software product
  14.  * without supplying the source, or without informing the end-user that the
  15.  * source is available for no extra charge.
  16.  *
  17.  * If you modify this software, you should include a notice giving the
  18.  * name of the person performing the modification, the date of modification,
  19.  * and the reason for such modification.
  20.  *
  21.  * $Id: box.c,v 3.0.1.1 89/12/06 16:33:48 craig Exp $
  22.  *
  23.  * $Log:    box.c,v $
  24.  * Revision 3.0.1.1  89/12/06  16:33:48  craig
  25.  * patch2: Added calls to new error/warning routines.
  26.  * 
  27.  * Revision 3.0  89/10/27  02:05:47  craig
  28.  * Baseline for first official release.
  29.  * 
  30.  */
  31. #include <math.h>
  32. #include <stdio.h>
  33. #include "constants.h"
  34. #include "typedefs.h"
  35. #include "funcdefs.h"
  36.  
  37. Object *
  38. makbox(surf, x, y, z, xs, ys, zs)
  39. char *surf;
  40. double x, y, z, xs, ys, zs;
  41. {
  42.     Box          *box;
  43.     Primitive *prim;
  44.     Object *newobj;
  45.  
  46.     if (xs < EPSILON || ys < EPSILON || zs < EPSILON) {
  47.         yywarning("Degenerate box.\n");
  48.         return (Object *)0;
  49.     }
  50.     prim = mallocprim();
  51.     prim->surf = find_surface(surf);
  52.     newobj = new_object(NULL, BOX, (char *)prim, (Trans *)NULL);
  53.     prim->type = BOX;
  54.     box = (Box *)Malloc(sizeof(Box));
  55.     prim->objpnt.p_box = box;
  56.     box->bounds[LOW][X] = x - xs;
  57.     box->bounds[HIGH][X] = x + xs;
  58.     box->bounds[LOW][Y] = y - ys;
  59.     box->bounds[HIGH][Y] = y + ys;
  60.     box->bounds[LOW][Z] = z - zs;
  61.     box->bounds[HIGH][Z] = z + zs;
  62.     return newobj;
  63. }
  64.  
  65. double
  66. intbox(pos, ray, obj)
  67. Vector *ray;    /* ray vector */
  68. Vector *pos;    /* origin of ray */
  69. Primitive *obj;    /* box description */
  70. {
  71.     Ray tmpray;
  72.     extern unsigned long BVTests, primtests[];
  73.  
  74.     /*
  75.      * IntBounds will increment BVTests, even though we're
  76.      * not really doing a BV intersection test.
  77.      */
  78.     primtests[BOX]++;
  79.     BVTests--;
  80.     tmpray.pos = *pos;
  81.     tmpray.dir = *ray;
  82.     return IntBounds(&tmpray, obj->objpnt.p_box->bounds);
  83. }
  84.  
  85. nrmbox(pos, obj, nrm)
  86. Vector           *pos, *nrm;    /* point of intersection */
  87. Primitive       *obj;    /* box description */
  88. {
  89.     Box          *box;
  90.  
  91.     box = obj->objpnt.p_box;
  92.     nrm->x = nrm->y = nrm->z = 0.;
  93.  
  94.     if (equal(pos->x, box->bounds[HIGH][X]))
  95.         nrm->x = 1.;
  96.     else if (equal(pos->x, box->bounds[LOW][X]))
  97.         nrm->x = -1.;
  98.     else if (equal(pos->y, box->bounds[HIGH][Y]))
  99.         nrm->y = 1.;
  100.     else if (equal(pos->y, box->bounds[LOW][Y]))
  101.         nrm->y = -1.;
  102.     else if (equal(pos->z, box->bounds[HIGH][Z]))
  103.         nrm->z = 1.;
  104.     else if (equal(pos->z, box->bounds[LOW][Z]))
  105.         nrm->z = -1.;
  106.     else
  107.         fprintf(stderr,"Nrmbox: confusion!\n");
  108. }
  109.  
  110. boxextent(o, bounds)
  111. Primitive *o;
  112. double bounds[2][3];
  113. {
  114.     Box *b = o->objpnt.p_box;
  115.  
  116.     bounds[LOW][X] = b->bounds[LOW][X];
  117.     bounds[HIGH][X] = b->bounds[HIGH][X];
  118.     bounds[LOW][Y] = b->bounds[LOW][Y];
  119.     bounds[HIGH][Y] = b->bounds[HIGH][Y];
  120.     bounds[LOW][Z] = b->bounds[LOW][Z];
  121.     bounds[HIGH][Z] = b->bounds[HIGH][Z];
  122. }
  123.