home *** CD-ROM | disk | FTP | other *** search
/ Encyclopedia of Graphics File Formats Companion / GFF_CD.ISO / formats / uray / code / uray.h < prev   
C/C++ Source or Header  |  1994-06-20  |  11KB  |  369 lines

  1. /************************************************************************
  2.  *                                    *
  3.  *            Copyright (c) 1988, David B. Wecker            *
  4.  *                All Rights Reserved                *
  5.  *                                    *
  6.  * This file is part of DBW_uRAY                    *
  7.  *                                    *
  8.  * DBW_uRAY is distributed in the hope that it will be useful, but    *
  9.  * WITHOUT ANY WARRANTY. No author or distributor accepts        *
  10.  * responsibility to anyone for the consequences of using it or for    *
  11.  * whether it serves any particular purpose or works at all, unless    *
  12.  * he says so in writing. Refer to the DBW_uRAY General Public        *
  13.  * License for full details.                        *
  14.  *                                    *
  15.  * Everyone is granted permission to copy, modify and redistribute    *
  16.  * DBW_uRAY, but only under the conditions described in the        *
  17.  * DBW_uRAY General Public License. A copy of this license is        *
  18.  * supposed to have been given to you along with DBW_uRAY so you    *
  19.  * can know your rights and responsibilities. It should be in a file    *
  20.  * named LICENSE. Among other things, the copyright notice and this    *
  21.  * notice must be preserved on all copies.                *
  22.  ************************************************************************
  23.  *                                    *
  24.  * Authors:                                *
  25.  *    DBW - David B. Wecker                        *
  26.  *                                    *
  27.  * Versions:                                *
  28.  *    V1.0 881023 DBW    - First released version            *
  29.  *    V1.1 881110 DBW - Fixed scan coherence code            *
  30.  *    V1.2 881125 DBW - Removed ALL scan coherence code (useless)    *
  31.  *              added "fat" extent boxes            *
  32.  *    V1.3 881203 DBW - Fixed single precision TOLerances        *
  33.  *                                    *
  34.  ************************************************************************/
  35.  
  36. #define VERSION "uRAY v1.2 881125 (C) 1988 D. Wecker - all rights reserved\n"
  37.  
  38. /************************************************************************/
  39. /************* global definitions for uray software *********************/
  40. /************************************************************************/
  41.  
  42. #ifdef URAY_MAIN
  43. #   define  MAINDEF
  44. #   define  MAINVAL(a)    = a
  45. #else
  46. #   define  MAINDEF    extern
  47. #   define  MAINVAL(a)
  48. #   endif
  49.  
  50.  
  51. /******************** include files **************************************/
  52.  
  53. #include <stdio.h>
  54. #include <math.h>
  55. #include <signal.h>
  56.  
  57. #ifdef U__X
  58. #include <sys/types.h>
  59. #include <sys/times.h>
  60. #endif
  61.  
  62. #ifdef VMS
  63. #include <types.h>
  64. #include <time.h>
  65. #endif
  66.  
  67. #ifdef AMIGA
  68. #ifndef SIGINT
  69. #   define  SIGINT  1
  70. #   endif
  71. #include <exec/types.h>
  72. #include <intuition/intuition.h>
  73. #endif
  74.  
  75.  
  76. /********************** floating point defs ******************************/
  77.  
  78. #if DODOUBLE
  79. #   define FLTDBL   double
  80. #   define MYHUGE   ((double)1.0e+30)
  81. #   define TOL        ((FLTDBL)1.0e-7)        /* minimum tolerance */
  82. #   ifdef AMIGA
  83. #    define BIGF
  84. #    endif
  85. #else
  86. #   define FLTDBL   float
  87. #   define MYHUGE   ((float)1.0e+17)
  88. #   define TOL        ((FLTDBL)1.0e-4)        /* minimum tolerance */
  89. #   endif
  90.  
  91. #ifdef BIGF
  92. #   define SCAN1    "%s %F"
  93. #   define SCAN2    "%s %F %F %F"
  94. #   define SCAN3    "%F %F %F %F %F %F %F %F %F %F %d %d %F %F %F %F %F %F"
  95. #   define SCAN4    "%F %F %F %F %F %F %F"
  96. #   define SCAN5    "%s %d %F %F %F %F"
  97. #   define SCAN6    "%s %d %F %F %F %F %F %F %F %F %F"
  98. #   define SCAN7    "%s %d %F %F %F %F %F %F %F %F %F %F %F"
  99. #else
  100. #   define SCAN1    "%s %f"
  101. #   define SCAN2    "%s %f %f %f"
  102. #   define SCAN3    "%f %f %f %f %f %f %f %f %f %f %d %d %f %f %f %f %f %f"
  103. #   define SCAN4    "%f %f %f %f %f %f %f"
  104. #   define SCAN5    "%s %d %f %f %f %f"
  105. #   define SCAN6    "%s %d %f %f %f %f %f %f %f %f %f"
  106. #   define SCAN7    "%s %d %f %f %f %f %f %f %f %f %f %f %f"
  107. #   endif
  108.  
  109. /********************** debug defs ****************************************/
  110.  
  111.  
  112. #define DEBUG_dumpnodes    0   /* dump a tree of all nodes and extents */
  113. #define DEBUG_ilbm    0   /* show ILBM output info */
  114. #define DEBUG_pixels    0   /* show pixel RGB values */
  115.  
  116.  
  117. /*********************** global defs **************************************/
  118.  
  119. #define MAXCOLS    1024                /* maximum compute width */
  120.  
  121. #define ABS(a)        (((a) < 0)   ? -(a) : (a))
  122. #define FABS(a)        (((a) < 0.0) ? -(a) : (a))
  123. #define MIN(a,b)    (((a) < (b)) ?  (a) : (b))
  124. #define MAX(a,b)    (((a) > (b)) ?  (a) : (b))
  125.  
  126. #define vdot(A,B)    (A[0]*B[0] + A[1]*B[1] + A[2]*B[2])
  127. #define vnorm(A)    sqrt(vdot(A,A))
  128. #define vcopy(A,B)    B[0]=A[0]; B[1]=A[1]; B[2]=A[2]
  129. #define vscale(v,A,B)    B[0]=(v)*A[0]; B[1]=(v)*A[1]; B[2]=(v)*A[2]
  130. #define vcomb(v,A,B,C)    C[0]=(v)*A[0]+B[0]; C[1]=(v)*A[1]+B[1]; C[2]=(v)*A[2]+B[2]
  131. #define vadd(A,B,C)    C[0]=A[0]+B[0]; C[1]=A[1]+B[1]; C[2]=A[2]+B[2]
  132. #define vsub(A,B,C)    C[0]=A[0]-B[0]; C[1]=A[1]-B[1]; C[2]=A[2]-B[2]
  133. #define vmul(A,B,C)    C[0]=A[0]*B[0]; C[1]=A[1]*B[1]; C[2]=A[2]*B[2]
  134. #define vdir(A,B,C)    vsub(B,A,C); vunit(C,C)
  135. #define vcross(A,B,C)    C[0]=(A[1] * B[2]) - (B[1] * A[2]); \
  136.             C[1]=(A[2] * B[0]) - (B[2] * A[0]); \
  137.             C[2]=(A[0] * B[1]) - (B[0] * A[1]);
  138.  
  139. /******************* ILBM file header defines *****************************/
  140.  
  141. #ifndef HIRES
  142. #   define HIRES    0x8000L
  143. #   endif
  144. #ifndef HAM
  145. #   define HAM        0x800L
  146. #   endif
  147. #ifndef LACE
  148. #   define LACE        0x4L
  149. #   endif
  150. #define DEPTH        6
  151. #define MAXBYTE        (cols >> 3)
  152. #define BMHDsize    20L            /* chunk sizes */
  153. #define CMAPsize    96L
  154. #define CAMGsize    4L
  155. #define BODYsize    (((long)rows)*((long)(MAXBYTE))*(long)(DEPTH))
  156. #define FORMsize    (BODYsize+CAMGsize+CMAPsize+BMHDsize+36L)
  157.  
  158.  
  159. /************************** object types *********************************/
  160.  
  161. #define TYP_E    0    /* extent */
  162. #define TYP_S    1    /* sphere */
  163. #define TYP_Q    2    /* quad */
  164. #define TYP_T    3    /* triangle */
  165. #define TYP_R    4    /* ring */
  166. #define TYP_L    5    /* light */
  167.  
  168.  
  169. /************************** typedefs **************************************/
  170.  
  171. typedef FLTDBL VEC[3];
  172.  
  173. typedef struct _ATT {
  174.     VEC            color;
  175.     FLTDBL        kd, ks, kt, ir, kl, dist, kf;
  176.     short        wave, tex;
  177.     VEC            p1,p2;
  178.     } ATT;
  179. typedef struct _WAVE {
  180.     VEC            cen;
  181.     FLTDBL        phase, length, damp, amp;
  182.     } WAVE;
  183. typedef struct _NODE {
  184.     struct _NODE    *next;
  185.     unsigned char   typ;
  186.     ATT            *att;
  187.     VEC            cen;
  188.     } NODE;
  189. typedef struct _EXTENT {
  190.     NODE        *next;
  191.     unsigned char   typ;
  192.     VEC            min,max;
  193.     NODE        *child;
  194.     } EXTENT;
  195. typedef struct _SPHERE {
  196.     NODE        *next;
  197.     unsigned char   typ;
  198.     ATT            *att;
  199.     VEC            cen;
  200.     FLTDBL        rad;
  201.     } SPHERE;
  202. typedef struct _QUAD {
  203.     NODE        *next;
  204.     unsigned char   typ;
  205.     ATT            *att;
  206.     VEC            p0, v1, v2;
  207.     } QUAD;
  208. typedef struct _TRIANGLE {
  209.     NODE        *next;
  210.     unsigned char   typ;
  211.     ATT            *att;
  212.     VEC            p0, v1, v2;
  213.     } TRIANGLE;
  214. typedef struct _RING {
  215.     NODE        *next;
  216.     unsigned char   typ;
  217.     ATT            *att;
  218.     VEC            p0, v1, v2;
  219.     FLTDBL        rad1,rad2;
  220.     } RING;
  221. typedef struct _LIGHT {
  222.     struct _LIGHT   *next;
  223.     NODE        *child;
  224.     } LIGHT;
  225.  
  226.  
  227. /*************************** routines ***********************************/
  228.  
  229. char        *malloc(),
  230.         *calloc(),
  231.         *my_malloc(),
  232.         *my_calloc();
  233. void        leave(),
  234.         vunit(),
  235.         planenormal(),
  236.         spherenormal(),
  237.         gettex(),
  238.         getamb(),
  239.         getlights(),
  240.         getspecular(),
  241.         gettrans(),
  242.         readinput(),
  243.         wfil(),
  244.         unionvector(),
  245.         unionextent(),
  246.         getextent(),
  247.         doextents(),
  248.         dumpnodes(),
  249.         coutputs(),
  250.         woutputs(),
  251.         trace(),
  252.         calcripple();
  253. short        rfil(),
  254.         PackRow();
  255. NODE        *intersection(),
  256.         *intersection2(),
  257.         *hitextent(),
  258.         *hitsphere(),
  259.         *sortext(),
  260.         *doalloc(),
  261.         *srtext();
  262. FLTDBL        rnd(),
  263.         findnormal();
  264. long        random();
  265.  
  266.  
  267.  
  268. /*************************** variables ***********************************/
  269.  
  270. MAINDEF long        seed        MAINVAL(257);
  271. MAINDEF char        str[256],
  272.             cmd[256],
  273.             *basnam        MAINVAL("uray");
  274. MAINDEF char        *TYPstr        MAINVAL("ESQTRLF");
  275. MAINDEF VEC        NEAR
  276. #ifdef URAY_MAIN
  277.                 = {0.0, 0.0, 1.0}
  278. #endif
  279.                 ;
  280. MAINDEF VEC        FAR        
  281. #ifdef URAY_MAIN
  282.                 = {0.0, 0.0, 1.0}
  283. #endif
  284.                 ;
  285. MAINDEF VEC        GROUND        
  286. #ifdef URAY_MAIN
  287.                 = {0.6, 0.3, 0.3}
  288. #endif
  289.                 ;
  290. MAINDEF VEC        BLACK        
  291. #ifdef URAY_MAIN
  292.                 = { 0.0, 0.0, 0.0 }
  293. #endif
  294.                 ;
  295. MAINDEF VEC        from,
  296.             direction,
  297.             dirinv;
  298. MAINDEF NODE        *nodes        MAINVAL(NULL);
  299. MAINDEF FILE        *fp        MAINVAL(NULL);
  300. MAINDEF FILE        *fp2        MAINVAL(NULL);
  301. MAINDEF unsigned char    outary[3][MAXCOLS];
  302. MAINDEF short        rows        MAINVAL(400);
  303. MAINDEF short        startrow    MAINVAL(0);
  304. MAINDEF short        endrow        MAINVAL(400);
  305. MAINDEF short        cols        MAINVAL(320);
  306. MAINDEF short        bpp        MAINVAL(12);
  307. MAINDEF short        sline;
  308. MAINDEF short        obpsl;
  309. MAINDEF short        aov        MAINVAL(90);
  310. MAINDEF short        depth        MAINVAL(20);
  311. MAINDEF int        natts        MAINVAL(0);
  312. MAINDEF ATT        *atts        MAINVAL(NULL);
  313. MAINDEF int        nwaves        MAINVAL(0);
  314. MAINDEF WAVE        *waves        MAINVAL(NULL);
  315. MAINDEF int        row,
  316.             col;
  317. MAINDEF int        fnhits        MAINVAL(0),
  318.             gnhits        MAINVAL(0),
  319.             fehits        MAINVAL(0),
  320.             gehits        MAINVAL(0);
  321. MAINDEF EXTENT        *ext;
  322. MAINDEF SPHERE        *sph;
  323. MAINDEF QUAD        *qua;
  324. MAINDEF TRIANGLE    *tri;
  325. MAINDEF RING        *rin;
  326. MAINDEF LIGHT        *lights        MAINVAL(NULL);
  327. MAINDEF int        extcnt        MAINVAL(0);
  328. MAINDEF int        objcnt        MAINVAL(0);
  329. MAINDEF FLTDBL        aspect        MAINVAL(0.544);
  330. MAINDEF FLTDBL        base        MAINVAL(0.25);
  331. MAINDEF long        lng,
  332.             pos1,
  333.             pos2,
  334.             pos3,
  335.             lsize;
  336. MAINDEF short        wrd;
  337. MAINDEF unsigned char    byt;
  338. MAINDEF int        lstcolor    MAINVAL(0);
  339. MAINDEF unsigned char    colors[16][3];
  340. MAINDEF long        randtbl[ 63 ]
  341. #ifdef URAY_MAIN
  342.             = {
  343.             0x00000001, 0x41c67ea6, 0x967eb0e7,
  344.             0x2781e494, 0xc46b9b3d, 0xf94bdf32, 0x95fb7483,
  345.             0xd9e2b600, 0x9cfbae39, 0xbf54bc7e, 0x0ff6d5df,
  346.             0x0abd322c, 0x31dff4f5, 0x237c228a, 0xaf1cf0fb,
  347.             0x7de14518, 0xc487eb71, 0xe201dd56, 0xd2bfa1d7,
  348.             0xe2319ac4, 0xe3decdad, 0xe95678e2, 0x93728473,
  349.             0x500f9f30, 0x284797a9, 0x2c67412e, 0x7566f4cf,
  350.             0x42877e5c, 0xb3590565, 0x4daa423a, 0xe4880eeb,
  351.             0xf73c2448, 0xef5992e1, 0xeeea4806, 0x5656aec7,
  352.             0xe1133cf4, 0xca7b7c1d, 0x31d2de92, 0xad857063,
  353.             0x99a13460, 0x69d8bd19, 0xb53c51de, 0x3b54afbf,
  354.             0x7d55368c, 0x102f11d5, 0x1b37adea, 0x7aae88db,
  355.             0xde652f78, 0xb45bf651, 0xe3dabeb6, 0x6102d7b7,
  356.             0x7a79cb24, 0x8398a68d, 0x28cc1042, 0xe0e33853,
  357.             0x9f1a7590, 0x4b761e89, 0x858eee8e, 0xfa5f06af,
  358.             0x28d95abc, 0x87991a45, 0x388f659a, 0x751f5ecb }
  359. #endif
  360.             ;
  361.  
  362. MAINDEF long    *fptr            MAINVAL(&randtbl[ 2 ]);
  363. MAINDEF long    *rptr            MAINVAL(&randtbl[ 0 ]);
  364. MAINDEF long    *end_ptr        MAINVAL(&randtbl[ 63 ]);
  365.  
  366. #ifdef AMIGA
  367.     MAINDEF struct IntuitionBase *IntuitionBase;
  368. #   endif
  369.