home *** CD-ROM | disk | FTP | other *** search
/ Resource Library: Graphics / graphics-16000.iso / msdos / raytrace / dbwrend / source / ray.h < prev    next >
Text File  |  1989-10-31  |  18KB  |  654 lines

  1. /************************************************************************
  2.  *                                                                      *
  3.  *                  Copyright (c) 1987, David B. Wecker                 *
  4.  *                          All Rights Reserved                         *
  5.  *                                                                      *
  6.  * This file is part of DBW_Render                                      *
  7.  *                                                                      *
  8.  * DBW_Render 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_Render General Public        *
  13.  * License for full details.                                            *
  14.  *                                                                      *
  15.  * Everyone is granted permission to copy, modify and redistribute      *
  16.  * DBW_Render, but only under the conditions described in the           *
  17.  * DBW_Render General Public License. A copy of this license is         *
  18.  * supposed to have been given to you along with DBW_Render so you      *
  19.  * can know your rights and responsibilities. It should be in a file    *
  20.  * named COPYING. 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.  *      jhl - John H. Lowery (IBM conversion)                           *
  27.  *                                                                      *
  28.  * Versions:                                                            *
  29.  *      V1.0  870125 DBW - First released version                       *
  30.  *      V1.01 880918 jhl - ported to IBM PC (MCGA/VGA display hardware) *
  31.  *            890121 jhl - MAXROW & MAXCOL become variables, add        *
  32.  *                         'D' command for Display max <hor> <vert>     *
  33.  *                                                                      *
  34.  ************************************************************************/
  35.  
  36. #define IBM_PC 1      /* V1.01       */
  37.  
  38. #include <math.h>
  39. #include <stdio.h>
  40. #include <setjmp.h>
  41.  
  42. #ifdef IBM_PC
  43. #include <malloc.h>
  44. #endif
  45.  
  46. #define VERSION "RAY v1.02 891031 (IBM PC/XT/AT)\n Copyright (C) 1989 J. Lowery and D. Wecker - all rights reserved\n"
  47.  
  48. #define pi 3.141592654
  49.  
  50. #define X 0
  51. #define Y 1
  52. #define Z 2
  53. #define W 3
  54. #define B 0
  55. #define G 1
  56. #define R 2
  57.  
  58. #define minimum( a, b ) ( ((a) < (b)) ? (a) : (b) )
  59. #define maximum( a, b ) ( ((a) > (b)) ? (a) : (b) )
  60.  
  61. typedef float vector[3];
  62. typedef float matrix[4][4];
  63.  
  64. typedef struct 
  65. {
  66.      float xmin, xmax;
  67.      float ymin, ymax;
  68. }
  69. window;
  70.  
  71. #define setwindow( xmin, ymin, xmax, ymax, w ) {\
  72.     w.xmin = xmin;\
  73.     w.ymin = ymin;\
  74.     w.xmax = xmax;\
  75.     w.ymax = ymax; }
  76.  
  77. #define copywindow( f, w ) {\
  78.     w.xmin = f.xmin;\
  79.     w.ymin = f.ymin;\
  80.     w.xmax = f.xmax;\
  81.     w.ymax = f.ymax; }
  82.  
  83. typedef struct 
  84. {
  85.      float xmin, xmax;
  86.      float ymin, ymax;
  87.      float zmin, zmax;
  88. }
  89. volume;
  90.  
  91. #define setvolume( xmin, ymin, zmin, xmax, ymax, zmax, v ) {\
  92.     v.xmin = xmin;\
  93.     v.ymin = ymin;\
  94.     v.zmin = zmin;\
  95.     v.xmax = xmax;\
  96.     v.ymax = ymax;\
  97.     v.zmax = zmax; }
  98.  
  99. #define copyvolume( f, v ) {\
  100.     v.xmin = f.xmin;\
  101.     v.ymin = f.ymin;\
  102.     v.zmin = f.zmin;\
  103.     v.xmax = f.xmax;\
  104.     v.ymax = f.ymax;\
  105.     v.zmax = f.zmax; }
  106.  
  107. typedef struct 
  108. {
  109.      vector vrp, vpn, vup, cop;
  110.      volume vol;
  111. }
  112. perspective_projection;
  113.  
  114. typedef struct 
  115. {
  116.      int tex;
  117.      float fuz, ref, idx;
  118.      vector tra, amb, dif;
  119. }
  120. attributes;
  121.  
  122. typedef struct 
  123. {
  124.      vector p;
  125.      float g;
  126.      int s;
  127. }
  128. fracvert;
  129.  
  130. #define CV(x,y,z,v)     v[0]=(x); v[1]=(y); v[2]=(z)
  131. #define VECZERO(v)      v[0] = 0.0; v[1] = 0.0; v[2] = 0.0
  132. #define VECCOPY(frm,to) to[0] = frm[0]; to[1] = frm[1]; to[2] = frm[2]
  133. #define VECDUMP(v,str)  printf("%s\t%5.3f %5.3f %5.3f\n",str,v[0],v[1],v[2])
  134. #define VECSUB(v1,v2,r) r[0] = v1[0] - v2[0]; r[1] = v1[1] - v2[1];\
  135.                         r[2] = v1[2] - v2[2]
  136. #define VECSUM(v1,v2,r) r[0] = v1[0] + v2[0]; r[1] = v1[1] + v2[1];\
  137.                         r[2] = v1[2] + v2[2]
  138. #define VECMUL(v1,v2,r) r[0] = v1[0] * v2[0]; r[1] = v1[1] * v2[1];\
  139.                         r[2] = v1[2] * v2[2]
  140. #define VECDIV(v1,v2,r) r[0] = v1[0] / v2[0]; r[1] = v1[1] / v2[1];\
  141.                         r[2] = v1[2] / v2[2]
  142. #define VECSCALE(s,v,r) r[0] = (s)*v[0]; r[1] = (s)*v[1]; r[2] = (s)*v[2]
  143. #define NORM(v)         ((float)sqrt((v[0]*v[0])+(v[1]*v[1])+(v[2]*v[2])))
  144. #define DOT(v1,v2)      ((v1[0]*v2[0])+(v1[1]*v2[1])+(v1[2]*v2[2]))
  145. #define CROSS(v1,v2,r)  r[0] = (v1[1] * v2[2]) - (v2[1] * v1[2]);\
  146.                         r[1] = (v1[2] * v2[0]) - (v2[2] * v1[0]);\
  147.                         r[2] = (v1[0] * v2[1]) - (v2[0] * v1[1])
  148. #define DIRECTION(f,t,d)        VECSUB(t,f,d); normalize(d)
  149. #define SPHERENORMAL(cent,p,n)  DIRECTION(cent,p,n);
  150. #define PLANENORMAL(ve,vp,n)    CROSS(vp,ve,n); normalize(n);
  151.  
  152. #define ERROR( str ) { fprintf( stderr, "%s\n", str ); exit(0); }
  153.  
  154. #ifndef IBM_PC
  155. extern char *malloc();
  156. #endif
  157.  
  158. extern long time();
  159.  
  160. #define CHECK_ALLOC( ptr, typ ) {\
  161.     if (!(ptr = (typ *) malloc( sizeof( typ )))) {\
  162.         ERROR( "MALLOC - out of memory" ); \
  163.         exit( 0 ); \
  164.         } \
  165.     }
  166.  
  167. #define CHECK_ALLOCA( ptr, typ, num ) {\
  168.     if (!(ptr = (typ *) malloc( sizeof( typ ) * num ))) {\
  169.         ERROR( "MALLOC - out of memory" ); \
  170.         exit( 0 ); \
  171.         } \
  172.     }
  173.  
  174. #define sptr( p ) ((sphere *) p)
  175. #define tptr( p ) ((triangle *) p)
  176. #define qptr( p ) ((quad *) p)
  177. #define rptr( p ) ((ring *) p)
  178. #define eptr( p ) ((extent *) p)
  179. #define cptr( p ) ((cylinder *) p)
  180.  
  181. #define EXTENT 0
  182. #define SPHERE 1
  183. #define TRIANGLE 2
  184. #define QUAD 3
  185. #define RING 4
  186. #define CYLINDER 5
  187.  
  188. typedef float hvector[4];
  189.  
  190. typedef struct NODE 
  191. {
  192.      struct NODE *next;
  193.      int kind;
  194.      attributes attr;
  195. }
  196. node;
  197.  
  198. typedef struct 
  199. {
  200.      node *next;
  201.      int kind;
  202.      attributes attr;
  203.      vector position, ve, vp;
  204. }
  205. quad;
  206.  
  207. typedef struct 
  208. {
  209.      node *next;
  210.      int kind;
  211.      attributes attr;
  212.      vector position, ve, vp;
  213. }
  214. triangle;
  215.  
  216. typedef struct 
  217. {
  218.      node *next;
  219.      int kind;
  220.      attributes attr;
  221.      vector position, ve, vp;
  222.      float minrad, maxrad;
  223. }
  224. ring;
  225.  
  226. typedef struct 
  227. {
  228.      node *next;
  229.      int kind;
  230.      attributes attr;
  231.      vector center;
  232.      float radius;
  233. }
  234. sphere;
  235.  
  236. typedef struct 
  237. {
  238.      node *next;
  239.      int kind;
  240.      attributes attr;
  241.      vector bottom, top;
  242.      float a, b, c;
  243. }
  244. cylinder;
  245.  
  246. typedef struct 
  247. {
  248.      node *next;
  249.      int kind;
  250.      attributes attr;
  251.      vector base, apex;
  252.      float baserad;
  253. }
  254. cone;
  255.  
  256. typedef struct 
  257. {
  258.      node *next;
  259.      int kind;
  260.      attributes attr;
  261.      vector center;
  262.      float radius;
  263.      node *sub;
  264. }
  265. extent;
  266.  
  267. typedef struct 
  268. {
  269.      vector intensity;
  270.      vector direction;
  271.      float distscale, radius;
  272.      int kind;
  273. }
  274. lighttype;
  275.  
  276. typedef struct 
  277. {
  278.      vector center;
  279.      float wavelength, amplitude, drag, propagate;
  280. }
  281. wavetype;
  282.  
  283. typedef struct 
  284. {
  285.      vector color;
  286.      float distscale;
  287. }
  288. hazetype;
  289.  
  290. typedef struct 
  291. {
  292.      vector color;
  293.      float start, scale;
  294. }
  295. blendtype;
  296.  
  297. typedef struct 
  298. {
  299.      float start, altscale, altfactor, threshhold;
  300. }
  301. snowtype;
  302.  
  303. typedef struct 
  304. {
  305.      float scale, zoom;
  306. }
  307. pebbletype;
  308.  
  309. typedef struct 
  310. {
  311.      int level;
  312.      float xscale, yscale, zscale;
  313.      int texture;
  314. }
  315. fractaltype;
  316.  
  317. typedef struct 
  318. {
  319.      vector color;
  320.      float x, y, z, bevel, angle;
  321.      int beveltype;
  322. }
  323. checkertype;
  324.  
  325. typedef struct 
  326. {
  327.      vector othercolor;
  328.      float thickscale, ringspacing, turbscale;
  329.      int squeeze;
  330. }
  331. woodtype;
  332.  
  333. typedef struct 
  334. {
  335.      vector veincolor;
  336.      float xscale, turbscale;
  337.      int squeeze;
  338. }
  339. marbletype;
  340.  
  341. typedef struct 
  342. {
  343.      vector min, max;
  344. }
  345. rextent;
  346.  
  347. #define unionvector( re, v, nre ) {\
  348.     int i; \
  349.     for (i = 0; i < 3; i++) {\
  350.         (nre)->min[i] = minimum( (re)->min[i], (v)[i] ); \
  351.         (nre)->max[i] = maximum( (re)->max[i], (v)[i] ); \
  352.         } \
  353.     }
  354.  
  355. #define unionrextent( re1, re2, nre ) {\
  356.     int i; \
  357.     for (i = 0; i < 3; i++) {\
  358.         (nre)->min[i] = minimum( (re1)->min[i], (re2)->min[i] ); \
  359.         (nre)->max[i] = maximum( (re1)->max[i], (re2)->max[i] ); \
  360.         } \
  361.     }
  362.  
  363. #define MAXX      640           /* absolute maximum pixel columns    */
  364. #define MAXY      480           /* absolute maximum pixel rows       */
  365.  
  366. #define BPP         4           /* Bits resolution per primary color */
  367.  
  368. #define DISPWID     11          /* Width of display surface          */
  369. #define DISPHI      8           /* Height of display surface         */
  370.  
  371. #define MAXGRAY     (1 << BPP)
  372. #define PPW         (sizeof( int ) * 8 / BPP)
  373. #define WPSL        (MAXX / PPW)
  374. #define MAXLIT      5
  375. #define MAXPEBBLE   2
  376. #define MAXSNOW     2
  377. #define MAXBLEND    2
  378. #define MAXWAVE     10
  379. #define MAXHAZE     2
  380. #define MAXCHECKER  2
  381. #define MAXFRACTAL  2
  382. #define MAXWOOD     2
  383. #define MAXMARBLE   2
  384. #define SMALL       0.001
  385. #define MAXOBJ      50  /* maximum object intersections for one ray */
  386.  
  387. #ifndef FALSE
  388. #define FALSE       0
  389. #endif
  390.  
  391. #ifndef TRUE
  392. #define TRUE        1
  393. #endif
  394.  
  395. typedef int         scanlinetype[ WPSL ];
  396. typedef float       matrix3[3][3];
  397.  
  398. #ifdef MODULE_RAY
  399. node                *root,
  400. *g_objpairs[ MAXOBJ ];
  401. FILE                *df,*fp,*fpout;
  402. char                fname[256], outname[256], str[256];
  403. scanlinetype        blueline,
  404. greenline,
  405. redline;
  406. lighttype           light[ MAXLIT ];
  407. marbletype          marble[ MAXMARBLE ];
  408. woodtype            wood[ MAXWOOD ];
  409. fractaltype         fractal[ MAXFRACTAL ];
  410. checkertype         checker[ MAXCHECKER ];
  411. pebbletype          pebble[ MAXPEBBLE ];
  412. snowtype            snow[ MAXSNOW ];
  413. blendtype           blend[ MAXBLEND ];
  414. hazetype            haze[ MAXHAZE ];
  415. wavetype            wave[ MAXWAVE ];
  416. int                 sline,
  417.   curr_runs,
  418.   max_runs,
  419.   allopaque = 1,
  420.   numlits = 0,
  421.   numwaves = 0,
  422.   numcheckers = 0,
  423.   numfractals = 0,
  424.   numwoods = 0,
  425.   nummarble = 0,
  426.   numblends = 0,
  427.   numsnows = 0,
  428.   numhazes = 0,
  429.   numpebbles = 0,
  430.   ambientlight = 0,
  431.   amblitnum = 1,
  432.   amblitdenom = 2,
  433.   antialias = 1,
  434.   dopseudo = 0,
  435.   histogram = 0,
  436.   startrow = 0,
  437.   endrow = MAXY,
  438.   g_objcounter;
  439. long                sort_size = 0L,
  440.   sorts = 0L,
  441.   total_runs = 0L,
  442.   max_intersects = 0L,
  443.   stacktop,
  444.   stackbot;
  445. float               maxhours = 12.0,
  446.   brickheight = 3.0,
  447.   brickwidth = 8.0,
  448.   brickdepth = 4.0, 
  449.   brickmortar = 0.5,
  450.   idxref = 1.0,
  451.   aperture = 0.0,
  452.   focus = 100,
  453.   ambscale = -1.0,
  454.   variance = 0.00097,
  455.   brickmortarwidth,
  456.   brickmortarheight,
  457.   brickmortardepth,
  458.   sqrt3,
  459.   sqrt3times2,
  460.   d_maxgray,
  461.   g_distances[ MAXOBJ ];
  462. vector              mortardiffuse = 
  463. {
  464.      0.8, 0.85, 0.99 
  465. }
  466. ,
  467. eye,
  468. vrp,
  469. vu,
  470. vr,
  471. backgroundval,
  472. g_points[ MAXOBJ ],
  473. xaxis = 
  474. {
  475.      1.0, 0.0, 0.0 
  476. }
  477. ,
  478. yaxis = 
  479. {
  480.      0.0, 1.0, 0.0 
  481. }
  482. ,
  483. zaxis = 
  484. {
  485.      0.0, 0.0, 1.0 
  486. }
  487. ;
  488. matrix              woodorient;
  489. jmp_buf             env;
  490. int                 MAXROW = 200;  /* default: VGA rows run 0-199    */
  491. int                 MAXCOL = 320;  /* default:     Cols run 0-319    */
  492.  
  493. #else
  494.  
  495. extern node         *root,
  496.   *g_objpairs[];
  497. extern FILE         *df,*fp,*fpout;
  498. extern char         fname[],  outname[], str[];
  499. extern scanlinetype blueline, greenline, redline;
  500. extern lighttype    light[];
  501. extern marbletype   marble[];
  502. extern woodtype     wood[];
  503. extern fractaltype  fractal[];
  504. extern checkertype  checker[];
  505. extern pebbletype   pebble[];
  506. extern snowtype     snow[];
  507. extern blendtype    blend[];
  508. extern hazetype     haze[];
  509. extern wavetype     wave[];
  510. extern int          sline,
  511.   curr_runs,
  512.   max_runs,
  513.   allopaque,
  514.   numlits,
  515.   numwaves,
  516.   numcheckers,
  517.   numfractals,
  518.   numwoods,
  519.   nummarble,
  520.   numblends,
  521.   numsnows,
  522.   numhazes,
  523.   numpebbles,
  524.   ambientlight,
  525.   amblitnum,
  526.   amblitdenom,
  527.   antialias,
  528.   dopseudo,
  529.   histogram,
  530.   startrow,
  531.   endrow,
  532.   g_objcounter;
  533. extern long         sort_size,
  534.   sorts,
  535.   total_runs,
  536.   max_intersects,
  537.   stacktop,
  538.   stackbot;
  539. extern float        maxhours,
  540.   brickheight,
  541.   brickwidth,
  542.   brickdepth,
  543.   brickmortar,
  544.   idxref,
  545.   aperture,
  546.   focus,
  547.   ambscale,
  548.   variance,
  549.   brickmortarwidth,
  550.   brickmortarheight,
  551.   brickmortardepth,
  552.   sqrt3,
  553.   sqrt3times2,
  554.   d_maxgray,
  555.   g_distances[];
  556. extern vector       mortardiffuse,
  557.   eye,
  558.   vrp,
  559.   vu,
  560.   vr,
  561.   backgroundval,
  562.   g_points[],
  563.   xaxis,
  564.   yaxis,
  565.   zaxis;
  566. extern matrix       woodorient;
  567. extern jmp_buf      env;
  568.  
  569. extern int          MAXROW;
  570. extern int          MAXCOL;
  571.  
  572. #endif
  573.  
  574. #ifndef MODULE_CALC
  575. extern void         spherenormal();     /* center to dir                */
  576. extern void         planenormal();      /* ve vp n                      */
  577. extern void         calcripple();       /* point w ripple               */
  578. extern void         noise3();           /* point total                  */
  579. extern float        noise();            /* point                        */
  580. extern float        turbulence();       /* point                        */
  581. extern void         dodirection();      /* val eye2 d2 atten amblits    */
  582. #endif
  583.  
  584. #ifndef MODULE_EXTENT
  585. extern void         setextent();        /* ep re                        */
  586. extern void         getextent();        /* np re                        */
  587. #endif
  588.  
  589. #ifndef MODULE_HIT
  590. extern void         findnormal();       /* np p n                       */
  591. extern int          hitcylinder();      /* top bottom a b c eye d p t   */
  592. extern int          hitsphere();        /* center radius eye d p t      */
  593. extern int          hitplane();         /* p ve vp eye d sfs inter      */
  594. extern int          hittriangle();      /* tp eye d p t                 */
  595. extern int          hitquad();          /* qp eye d p t                 */
  596. extern int          hitring();          /* rp eye d p t                 */
  597. extern void         shell();            /* v v1 v2 n                    */
  598. #endif
  599.  
  600. #ifndef MODULE_FILEIO
  601. extern void         dumpnode();         /* n                            */
  602. extern void         copyattr();         /* oa na                        */
  603. extern void         read_vec();         /* v                            */
  604. extern void         read_attr();        /* attr                         */
  605. extern void         dofractal();        /* level a b c attr             */
  606. extern void         readimagefile();    /* opp                          */
  607. extern void         getinput();         /* argc argv                    */
  608. extern void         write_scanline();   /*                              */
  609. extern void         getoutput();        /* argc argv                    */
  610. #endif
  611.  
  612. #ifndef MODULE_INTER
  613. extern node *get_next_intersection();   /* which best_p best_t          */
  614. extern void         add_intersection(); /* np p t attenuating           */
  615. extern void       calc_intersections(); /* np eye d attenuating         */
  616. extern void         all_intersects();   /* eye d attenuating            */
  617. extern int          bounce_lighting();  /* pintens plitdir bouncep lit  */
  618. extern void         blendcolor();       /* orig target scale result     */
  619. extern void         getatten();         /* atten p d lit pointdist      */
  620. #endif
  621.  
  622. #ifndef MODULE_MATH
  623. extern void         veczero();          /* v                            */
  624. extern void         veccopy();          /* from to                      */
  625. extern void         vecdump();          /* v str                        */
  626. extern float        hlsvalue();         /* n1 n2 hue                    */
  627. extern void         cv();               /* x y z v                      */
  628. extern void         hls();              /* h l s v                      */
  629. extern void         vecsub();           /* v1 v2 r                      */
  630. extern void         vecsum();           /* v1 v2 r                      */
  631. extern void         vecmul();           /* v1 v2 r                      */
  632. extern void         vecdiv();           /* v1 v2 r                      */
  633. extern void         vecscale();         /* s v r                        */
  634. extern float        norm();             /* v                            */
  635. extern void         normalize();        /* v                            */
  636. extern float        dot();              /* v1 v2                        */
  637. extern void         cross();            /* v1 v2 r                      */
  638. extern void         direction();        /* f t d                        */
  639. extern long         curstack();         /*                              */
  640. #endif
  641.  
  642. #ifndef MODULE_RND
  643. extern float    rnd();
  644. #endif
  645.  
  646. #ifndef MODULE_TEXTURE
  647. extern void         gettex();           /* diffuse np p n               */
  648. #endif
  649.  
  650. #ifndef MODULE_VAL
  651. extern void         getval();           /* val np p d atten ambientlit  */
  652. #endif
  653.  
  654.