home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume18 / mtvraytrace / part01 / defs.h < prev    next >
Encoding:
C/C++ Source or Header  |  1989-03-26  |  4.0 KB  |  162 lines

  1. /***********************************************************************
  2.  * $Log:    defs.h,v $
  3.  * Revision 1.4  88/10/06  12:54:57  markv
  4.  * I forgot (of course) that gcc runs on non-sun machines.  I have
  5.  * defined the FASTPRIMS so that if you are running a sun, you get them
  6.  * otherwise, you don't.
  7.  * 
  8.  * Revision 1.3  88/10/04  14:34:49  markv
  9.  * Added changes to allow for optimized CSG (courtesy of Glassner and
  10.  * Bronsvoort.
  11.  * 
  12.  * Revision 1.2  88/09/12  13:03:28  markv
  13.  * Added space in the Light structure for caching shadow objects.
  14.  * 
  15.  * Revision 1.1  88/09/11  11:00:49  markv
  16.  * Initial revision
  17.  * 
  18.  * Revision 1.1  88/09/09  11:59:55  markv
  19.  * Initial revision
  20.  * 
  21.  ***********************************************************************/
  22.  
  23. #include "config.h"
  24.  
  25. typedef double Flt ;
  26. typedef Flt Vec[3] ;
  27. typedef Vec Point ;
  28. typedef Vec Color ;
  29.  
  30. /*----------------------------------------------------------------------*/
  31.  
  32. #ifndef DUMB_CPP 
  33.  
  34. #define MakeVector(x, y, z, v)        (v)[0]=(x),(v)[1]=(y),(v)[2]=(z)
  35. #define VecScale(S,a)    (a)[0] *= S ; (a)[1] *= S ; (a)[2] *= S
  36. #define VecNegate(a)    (a)[0]=0-(a)[0];\
  37.             (a)[1]=0-(a)[1];\
  38.             (a)[2]=0-(a)[2];
  39. #define VecDot(a,b)    ((a)[0]*(b)[0]+(a)[1]*(b)[1]+(a)[2]*(b)[2])
  40. #define VecLen(a)    (sqrt(VecDot(a,a)))
  41. #define VecCopy(a,b)     (b)[0]=(a)[0];(b)[1]=(a)[1];(b)[2]=(a)[2];
  42. #define VecAdd(a,b,c)     (c)[0]=(a)[0]+(b)[0];\
  43.              (c)[1]=(a)[1]+(b)[1];\
  44.              (c)[2]=(a)[2]+(b)[2]
  45. #define VecSub(a,b,c)     (c)[0]=(a)[0]-(b)[0];\
  46.              (c)[1]=(a)[1]-(b)[1];\
  47.              (c)[2]=(a)[2]-(b)[2]
  48. #define VecComb(A,a,B,b,c)    (c)[0]=(A)*(a)[0]+(B)*(b)[0];\
  49.                 (c)[1]=(A)*(a)[1]+(B)*(b)[1];\
  50.                  (c)[2]=(A)*(a)[2]+(B)*(b)[2]
  51. #define VecAddS(A,a,b,c)     (c)[0]=(A)*(a)[0]+(b)[0];\
  52.                  (c)[1]=(A)*(a)[1]+(b)[1];\
  53.                  (c)[2]=(A)*(a)[2]+(b)[2]
  54. #define VecCross(a,b,c)     (c)[0]=(a)[1]*(b)[2]-(a)[2]*(b)[1];\
  55.              (c)[1]=(a)[2]*(b)[0]-(a)[0]*(b)[2];\
  56.              (c)[2]=(a)[0]*(b)[1]-(a)[1]*(b)[0]
  57. #define VecPrint(msg,v)        printf("%s %g %g %g\n", msg,\
  58.                     (v)[0],(v)[1],(v)[2])
  59. #define VecZero(v)    (v)[0]=0.0;(v)[1]=0.0;v[2]=0.0
  60.  
  61. #endif /* not DUMB_CPP */
  62.  
  63. /*----------------------------------------------------------------------*/
  64.  
  65. typedef struct Ray {
  66.     Point P ;
  67.     Point D ;
  68. } Ray ;
  69.  
  70. #define RayPoint(ray,t,point)    VecAddS(t,(ray)->D,(ray)->P,point)
  71.  
  72. #define max(a,b)     ((a)>(b)?(a):(b))
  73. #define min(a,b)     ((a)<(b)?(a):(b))
  74.  
  75. /*----------------------------------------------------------------------*/
  76.  
  77. typedef struct t_surface {
  78.     Color    surf_color ;
  79.     Flt    surf_kd ;
  80.     Flt    surf_ks ;
  81.     Flt    surf_shine ;
  82.     Flt     surf_kt ;
  83.     Flt    surf_ior ;
  84. } Surface ;
  85.  
  86. typedef struct t_light {
  87.     Vec    light_pos ;
  88.     Flt    light_brightness ;
  89.     struct t_object * light_obj_cache[MAXLEVEL] ;
  90. } Light ;
  91.  
  92. typedef struct t_viewpoint {
  93.     Vec    view_from ;
  94.     Vec    view_at ;
  95.     Vec    view_up ;
  96.     Flt    view_angle ;
  97.     Flt    view_dist ;
  98. } Viewpoint ;
  99.  
  100. typedef struct t_object {
  101.     unsigned short     o_type ;
  102.     Flt    o_dmin[NSLABS] ;
  103.     Flt    o_dmax[NSLABS] ;
  104.     struct t_objectprocs {
  105.         int     (*print) () ;
  106.         int     (*intersect) () ;
  107.         int     (*normal) () ;
  108.     } * o_procs ;
  109.     struct t_surface     * o_surf ;
  110.     struct t_object        * o_parent ;
  111.     unsigned short        * o_inside ;
  112.     void    * o_data ;
  113. } Object ;
  114.  
  115. typedef struct t_compositedata {
  116.     unsigned short     c_size ;
  117.     Object *    c_object[BUNCHINGFACTOR] ;
  118. } CompositeData ;
  119.  
  120. typedef struct t_objectprocs ObjectProcs ;
  121.  
  122. typedef struct t_isect {
  123.     Flt         isect_t ;
  124.     int         isect_enter ;
  125.     Vec        isect_normal ;
  126.     Object         * isect_prim ;
  127.     Surface     * isect_surf ;
  128. } Isect ;
  129.  
  130. typedef struct t_pixel {
  131.     unsigned char r, g, b, q ;
  132. } Pixel ;
  133.  
  134. #ifndef PI
  135. #define PI         (3.14159265358979323844)
  136. #endif /* PI */
  137.  
  138. #define degtorad(x)    (((Flt)(x))*PI/180.0)
  139.  
  140. #define        T_COMPOSITE    (0)
  141. #define        T_SPHERE    (1)
  142. #define        T_POLY        (2)
  143. #define        T_CONE        (3)
  144. #define        T_CONE        (3)
  145. #define        T_TRI        (4)
  146.  
  147. #ifdef __GNUC__
  148. #define INLINE    inline
  149.  
  150. #if defined(FAST_MATH_PRIMS) && defined(sun)
  151. #define sqrt(x)\
  152.     ({ double __value, __arg = (x) ;\
  153.      asm("fsqrtx %1,%0": "=f" (__value): "f" (__arg)) ;\
  154.      __value ;})
  155. #endif /* FAST_MATH_PRIMS */
  156.  
  157. #else /* __GNUC__ */
  158.  
  159. #define INLINE    /* inline not supported  */
  160.  
  161. #endif /* __GNUC__ */
  162.