home *** CD-ROM | disk | FTP | other *** search
/ Amiga ACS 1998 #6 / amigaacscoverdisc1998-061998.iso / games / descent / source / 2d / clip.h < prev    next >
Text File  |  1998-06-08  |  8KB  |  156 lines

  1. /*
  2. THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
  3. SOFTWARE CORPORATION ("PARALLAX").  PARALLAX, IN DISTRIBUTING THE CODE TO
  4. END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
  5. ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
  6. IN USING, DISPLAYING,  AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
  7. SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
  8. FREE PURPOSES.  IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
  9. CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES.  THE END-USER UNDERSTANDS
  10. AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.  
  11. COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION.  ALL RIGHTS RESERVED.
  12. */
  13. /*
  14.  * $Source: f:/miner/source/2d/rcs/clip.h $
  15.  * $Revision: 1.3 $
  16.  * $Author: john $
  17.  * $Date: 1993/10/15 16:22:28 $
  18.  *
  19.  * Macros used for clipping
  20.  *
  21.  * $Log: clip.h $
  22.  * Revision 1.3  1993/10/15  16:22:28  john
  23.  * *** empty log message ***
  24.  * 
  25.  * Revision 1.2  1993/09/29  16:14:31  john
  26.  * made work with fix point
  27.  * 
  28.  * Revision 1.1  1993/09/08  11:40:53  john
  29.  * Initial revision
  30.  * 
  31.  *
  32.  */
  33.  
  34.  
  35. #define MIN(a,b)        (((a) < (b)) ? (a) : (b))
  36. #define MAX(a,b)        (((a) > (b)) ? (a) : (b))
  37. #define IABS(x)         (((x) < 0) ?  -(x) : (x))
  38.  
  39. #define EXCHG(a,b) do {                                                 \
  40.     int __temp__ = (a);                                                 \
  41.     (a) = (b);                                                          \
  42.     (b) = __temp__;                                                     \
  43. } while(0)
  44.  
  45. // sort two values
  46. #define SORT2(a,b) do {                                                 \
  47.     if((a) > (b)) EXCHG(a,b);                                           \
  48. } while(0)
  49.  
  50. # define SCALE(var,arg,num,den)                                         \
  51.     ((var) = ((arg) * (num)) / (den))
  52.  
  53. # define USCALE(var,arg,num,den)                                        \
  54.     ((var) = ((unsigned)(arg) * (unsigned)(num)) / (unsigned)(den))
  55.  
  56. # define FSCALE(var,arg,num,den) ((var) = fixmuldiv((arg),(num),(den)))
  57.  
  58. #define CLIPDOT(xx,yy,WHEN_OUTSIDE,WHEN_CLIPPED) {                                              \
  59.     if((xx > XMAX) || (xx < XMIN)) { WHEN_OUTSIDE; }  \
  60.     if((yy > YMAX) || (yy < YMIN)) { WHEN_OUTSIDE; }  \
  61. }
  62.  
  63. #define CLIPHLINE(x1,x2,yy,WHEN_OUTSIDE,WHEN_CLIPPED) {                                         \
  64.     if(x1 > x2) EXCHG(x1,x2);                                           \
  65.     if((x1 > XMAX) || (x2 < XMIN)) { WHEN_OUTSIDE; }  \
  66.     if((yy > YMAX) || (yy < YMIN)) { WHEN_OUTSIDE; }  \
  67.     if(x1 < XMIN) { x1 = XMIN; WHEN_CLIPPED; }        \
  68.     if(x2 > XMAX) { x2 = XMAX; WHEN_CLIPPED; }        \
  69. }
  70.  
  71. #define CLIPVLINE(xx,y1,y2,WHEN_OUTSIDE,WHEN_CLIPPED) {                                         \
  72.     if(y1 > y2) EXCHG(y1,y2);                                           \
  73.     if((xx > XMAX) || (xx < XMIN)) { WHEN_OUTSIDE; }  \
  74.     if((y1 > YMAX) || (y2 < YMIN)) { WHEN_OUTSIDE; }  \
  75.     if(y1 < YMIN) { y1 = YMIN; WHEN_CLIPPED; }        \
  76.     if(y2 > YMAX) { y2 = YMAX; WHEN_CLIPPED; }        \
  77. }
  78.  
  79. #define CLIPBOX(x1,y1,x2,y2,WHEN_OUTSIDE,WHEN_CLIPPED) {                               \
  80.     if(x1 > x2) EXCHG(x1,x2);                                           \
  81.     if(y1 > y2) EXCHG(y1,y2);                                           \
  82.     if((x1 > XMAX) || (x2 < 0)) { WHEN_OUTSIDE; }                 \
  83.     if((y1 > YMAX) || (y2 < 0)) { WHEN_OUTSIDE; }                 \
  84.     if(x1 < 0) { x1 = 0; WHEN_CLIPPED; }                                \
  85.     if(y1 < 0) { y1 = 0; WHEN_CLIPPED; }                                \
  86.     if(x2 > XMAX) { x2 = XMAX; WHEN_CLIPPED; }              \
  87.     if(y2 > YMAX) { y2 = YMAX; WHEN_CLIPPED; }              \
  88. }
  89.     
  90. #define CLIPLINE(x1,y1,x2,y2,XMIN,YMIN,XMAX,YMAX,WHEN_OUTSIDE,WHEN_CLIPPED,MY_SCALE) do {                                    \
  91.     register int temp;                                                  \
  92.                                                                         \
  93.     if(y1 > y2)                                                         \
  94.         { EXCHG(y1,y2); EXCHG(x1,x2); }                                 \
  95.     if((y2 < YMIN) || (y1 > YMAX))                    \
  96.         { WHEN_OUTSIDE; }                                               \
  97.     if(x1 < x2) {                                                       \
  98.         if((x2 < XMIN) || (x1 > XMAX)) {              \
  99.             WHEN_OUTSIDE;                                               \
  100.         }                                                               \
  101.         if(x1 < XMIN) {                                        \
  102.             MY_SCALE(temp,(y2 - y1),(XMIN - x1),(x2 - x1));      \
  103.             if((y1 += temp) > YMAX) { WHEN_OUTSIDE; }          \
  104.             x1 = XMIN;                                         \
  105.             WHEN_CLIPPED;                                               \
  106.         }                                                               \
  107.         if(x2 > XMAX) {                                        \
  108.             MY_SCALE(temp,(y2 - y1),(x2 - XMAX),(x2 - x1));      \
  109.             if((y2 -= temp) < YMIN) { WHEN_OUTSIDE; }          \
  110.             x2 = XMAX;                                         \
  111.             WHEN_CLIPPED;                                               \
  112.         }                                                               \
  113.         if(y1 < YMIN) {                                        \
  114.             MY_SCALE(temp,(x2 - x1),(YMIN - y1),(y2 - y1));      \
  115.             x1 += temp;                                                 \
  116.             y1 = YMIN;                                         \
  117.             WHEN_CLIPPED;                                               \
  118.         }                                                               \
  119.         if(y2 > YMAX) {                                        \
  120.             MY_SCALE(temp,(x2 - x1),(y2 - YMAX),(y2 - y1));      \
  121.             x2 -= temp;                                                 \
  122.             y2 = YMAX;                                         \
  123.             WHEN_CLIPPED;                                               \
  124.         }                                                               \
  125.     }                                                                   \
  126.     else {                                                              \
  127.         if((x1 < XMIN) || (x2 > XMAX)) {              \
  128.             WHEN_OUTSIDE;                                               \
  129.         }                                                               \
  130.         if(x1 > XMAX) {                                        \
  131.             MY_SCALE(temp,(y2 - y1),(x1 - XMAX),(x1 - x2));      \
  132.             if((y1 += temp) > YMAX) { WHEN_OUTSIDE; }          \
  133.             x1 = XMAX;                                         \
  134.             WHEN_CLIPPED;                                               \
  135.         }                                                               \
  136.         if(x2 < XMIN) {                                        \
  137.             MY_SCALE(temp,(y2 - y1),(XMIN - x2),(x1 - x2));      \
  138.             if((y2 -= temp) < YMIN) { WHEN_OUTSIDE; }          \
  139.             x2 = XMIN;                                         \
  140.             WHEN_CLIPPED;                                               \
  141.         }                                                               \
  142.         if(y1 < YMIN) {                                        \
  143.             MY_SCALE(temp,(x1 - x2),(YMIN - y1),(y2 - y1));      \
  144.             x1 -= temp;                                                 \
  145.             y1 = YMIN;                                         \
  146.             WHEN_CLIPPED;                                               \
  147.         }                                                               \
  148.         if(y2 > YMAX) {                                        \
  149.             MY_SCALE(temp,(x1 - x2),(y2 - YMAX),(y2 - y1));      \
  150.             x2 += temp;                                                 \
  151.             y2 = YMAX;                                         \
  152.             WHEN_CLIPPED;                                               \
  153.         }                                                               \
  154.     }                                                                   \
  155. } while(0)
  156.