home *** CD-ROM | disk | FTP | other *** search
/ Virtual Reality Zone / VRZONE.ISO / mac / PC / PCGLOVE / GLOVE / OBJGLV.ZIP / INCLUDE / DEMO4B / 3DSTRUCT.HPP next >
C/C++ Source or Header  |  1992-10-31  |  9KB  |  294 lines

  1. /* Data structures for 3D modelling */
  2.  
  3. /* Written by Bernie Roehl and Dave Stampe, December 1991 */
  4. /* updated 10/1/91 for renderer clip (first stage */
  5. /* Integerizaation finished 19/1/91 and comments added */
  6.  
  7. /* Copyright 1991, 1992 by Dave Stampe and Bernie Roehl.
  8.    May be freely used to write software for release into the public domain;
  9.    all commercial endeavours MUST contact Bernie Roehl and Dave Stampe
  10.      for permission to incorporate any part of this software into their
  11.    products!
  12.  */
  13.  
  14. /* NOTE ON FORMATS:
  15.  <nn.ff> means that nn bits are available as the integer part, and
  16.  ff bits are used as a fractional part.  Multiply a float by 2^ff
  17.  to get a long value to feed in.
  18.  
  19.  World coordinates should be kept below signed 24 bits (16.7M) to
  20.  assure no errors.  This allows a range of 1mm->16.7 km, which
  21.  should be plenty!
  22.  
  23.  Angles are in <16.16> format, where the integer part is in degrees.
  24. */
  25.  
  26.  
  27. #ifndef MATRIXDEF
  28. typedef long MATRIX[4][3];        /* 3x3 rotate plus 3 translate para's */
  29.             /* rotate matrix is <3.29>, translate is <32.0> */
  30. #define MATRIXDEF 1
  31. #endif
  32.  
  33. /* new vertex copies, internal to renderer */
  34.  
  35. typedef struct nV NVERTEX;
  36. struct nV{
  37.         long  x, y, z;             /* viewport coordinates (used for saving time) */
  38.       long  xs, ys ;          /* screen coordinates */
  39.         unsigned char outcode;  /* XY clip outcodes */
  40.         unsigned char perspect; /* flags perspective done */
  41.         };
  42.  
  43. #define LEFT   1    /* XY outcode bits */
  44. #define RIGHT  2
  45. #define TOP    4
  46. #define BOTTOM 8
  47.  
  48.  
  49.  
  50. /* world database vertices */
  51. /* object coords are referenced to object */
  52. /* world coords are updated when moving or rotating object */
  53. /* all others are renderer workspace */
  54.  
  55. typedef struct {
  56.     long ox, oy, oz;   /* object coordinates */
  57.     long x, y, z;      /* world coordinates  */
  58.     long cz;       /* converted Z coord  */
  59.     NVERTEX *new_copy;  /* non-zero if x and y transformed */
  60.     unsigned char z_transformed;   /* non-zero if z has been transformed */
  61.     unsigned char z_outcode;       /* 1 set if hither, 2 set if yon */
  62.     } VERTEX;
  63.  
  64. #define HITHER 1    /* Z outcode bits */
  65. #define YON    2
  66.  
  67.  
  68. /* world database polys */
  69. /* object-based normal must be rotated to world copy with object */
  70. /* color will have 8-bit color, 8-bit reflectance field */
  71.  
  72. #ifndef POLYDEF
  73. #define POLYDEF 1
  74.  
  75. typedef struct {
  76.     unsigned color;   /* color (not used yet-- will set chroma, reflectance */
  77.     VERTEX **points;  /* array of pointers to the vertices of this polygon */
  78.     int npoints;      /* number of entries in points[] */
  79.     long onormalx,
  80.          onormaly,
  81.          onormalz;    /* unit length surface normal (OBJECT) */
  82.     long normalx,
  83.          normaly,
  84.          normalz;     /* unit length surface normal (WORLD)*/
  85.     struct _object *object;
  86.     } POLY;
  87.  
  88. #endif
  89.  
  90.  
  91. /* renderer poly copy */
  92. /* paernt points back to original poly for lighting */
  93. /* color computed by cosine lighting (currently 0-15) */
  94. /* maxz is deepest poly point for sorting */
  95.  
  96. typedef struct {
  97.     int npoints;       /* number of entries in points[] MUST BE FIRST */
  98.     POLY *parent;
  99.     unsigned color;       /* color after illumination */
  100.     long maxz;        /* maximum Z value (for sorting) */
  101.     } NPOLY;
  102.  
  103.  
  104. typedef struct { NPOLY *ptr; long depth; } DSORT; /* used for depth sorting */
  105.  
  106. #ifndef REPDEF
  107. #define REPDEF 1
  108.  
  109. typedef struct _rep {     /* a representation for an object */
  110.     long size;            /* if the object is bigger than this, use this rep */
  111.     int nverts, npolys;   /* number of vertices, number of polys */
  112.     VERTEX *verts;        /* array of vertices */
  113.     POLY *polys;          /* array of polygons */
  114.     struct _rep *next;    /* pointer to next rep in list */
  115.     long update_count;    /* inc. every time rep moves */
  116.     unsigned flags;
  117.     } REP;
  118.  
  119. #endif
  120.  
  121.  
  122. /* world database object */
  123. /* sphx, sphy, sphz, sphr used for sphere object clipping */
  124.  
  125. #define OBJ_FLAG_MASK 0x7C00
  126. #define OBJ_DEPTH_MASK 0x03FF
  127.  
  128. #ifndef OBJDEF
  129. #define OBJDEF 1
  130.  
  131. typedef struct _object
  132.  {
  133.     unsigned int oflags;
  134. #define OBJ_NONSEL       0x0800 /* can't be selected (i.e. pointer) */
  135. #define OBJ_INVIS        0x1000
  136. #define OBJ_HIGHLIGHTED  0x2000
  137. #define OBJLIST_HEADER   0x4000
  138. #define IS_OBJECT        0x8000    /* required by renderer: it will set */
  139.  
  140. #define DEEPEST 0x0000        /* sort polys by deepest point */
  141. #define ATBACK  0x0001        /* push this object's poly's waaaay back */
  142. #define AVERAGE 0x0002        /* sort polys by average depth */
  143.  
  144. #define BYOBJECT   0x0100    /* sort by object */
  145. #define BYPOLY     0x0000    /* put polys in world before sort */
  146.  
  147.     struct _object *prev;
  148.     struct _object *nnext;
  149.  
  150.     void *owner;       /* for example, a body segment description struct */
  151.     REP *replist;              /* pointer to list of representations */
  152.     REP *current_rep;          /* the currently-active rep */
  153.     int (*coll_eval)(_object *, long, long, long);             /* evaluate collision */
  154.  
  155.     long osphx, osphy, osphz;     /* object-coord sphere center */
  156.     long sphx, sphy, sphz, sphr;  /* bounding sphere center and radius */
  157.     long update_count;         /* inc. every time object moved */
  158.  } OBJECT;
  159.  
  160. #endif
  161.  
  162.  
  163. /* world database object list head */
  164. /* dual linked for fast remove/insert needed for splits */
  165.  
  166. #ifndef OBJLDEF
  167. #define OBJLDEF 1
  168.  
  169. typedef struct _objlist
  170.  {
  171.     unsigned int oflags;
  172. #define OBJ_INVIS        0x1000
  173. #define OBJ_HIGHLIGHTED  0x2000
  174. #define OBJLIST_HEADER   0x4000
  175. #define IS_OBJECT        0x8000    /* required by renderer: it will set */
  176.  
  177.     struct _object *prev;
  178.     struct _object *nnext;
  179.  } OBJLIST;
  180.  
  181. #endif
  182.  
  183.  
  184. #ifndef VIEWDEF
  185. /* renderer viewpoint/screen control structure */
  186. /* viewoint in X, Y, Z coords */
  187. /* pan, tilt, roll in (float*65536) formats */
  188. /* zoom is equiv. to magnification from 90 deg. FOV (also float*65536) */
  189. /* aspect sets how much to magnify Y more than X to fix up displays */
  190. /* light source point in world coordinates */
  191. /* left, right, top, bottom set edges of screen */
  192. /* hither sets closest point: keep >16 for best range of world coords */
  193. /* yon sets max. distance: keep it 1<<26 if not used */
  194. /* all others are renderer workspace */
  195.  
  196. #define NOFLIP 0      /* for orientation flags */
  197. #define XFLIP  1
  198. #define YFLIP  2
  199.  
  200. typedef struct {
  201.              /* VIEWPOINT */
  202.     long ex, ey, ez;        /* <25.0>  location of eyepoint         */
  203.     long pan, tilt, roll;   /* <16.16> viewing angles (deg) +/- 128 */
  204.     long zoom;              /* <16.16> 1/tan(H FOV/2) 0.5 to 16     */
  205.         /* Light source stuff... will eventually be separate from view struct */
  206.     long lx,ly,lz;        /* <25.0>  location of light source     */
  207.     int  directional;    /* 0 for point, 1 for normal (not unit) */
  208.     int  ambient;        /* ambient light: 0-256 (72 recc.)      */
  209.  
  210.                  /* SCREEN DATA */
  211.     long left,right;        /* <25.0> clipping planes */
  212.     long top, bottom;
  213.     long hither, yon;   /* <25.0> near and far clipping planes   */
  214.     long aspect;        /* <16.16> x:y fixup factor (magnify Y by..*/
  215.  
  216.     /* RENDERING CONTROL */
  217.     unsigned flags;     /* 16 bits of flags */
  218.  
  219.                  /* ADVANCED SCREEN DATA */
  220.     long x_offset, y_offset; /* amount to move screen center in pixels */
  221.     unsigned orientation;    /* used to mirror screen image */
  222.     MATRIX eye_xform;
  223.  
  224.              /* INTERNAL RECORDS */
  225.     long hsw, hsh;        /* half screen width, height */
  226.     long hsc, vsc;        /* screen center (with offset) */
  227.     long scx, scy;        /* full-resolution scaling for horizon */
  228.     long sx,sy;        /* mantissa of screen scaling  */
  229.     int  xshift, yshift;    /* scaling bit shifts */
  230.  
  231.     long left_C, left_M;    /* spherical clip coefficients */
  232.     long right_C, right_M;
  233.     long top_C, top_M;
  234.     long bot_C, bot_M;
  235.  
  236.     long fac1,fac2,fac3,
  237.          fac4,fac5,fac6,
  238.          fac7,fac8,fac9;    /* conversion coefficients */
  239.  
  240.     long sfac1,sfac2,sfac3, /* scaled conversion factors */
  241.              sfac4,sfac5,sfac6;
  242.  
  243.     long hor_C, vert_C;     /* spherical clip coefficients */
  244.     long hor_M, vert_M;
  245.  
  246.            } VIEW;
  247.  
  248. /* View flags: */
  249.  
  250. #define WIREFRAME           0x0001
  251. #define HIDE_HIGHLIGHTED    0x0002
  252. #define HIDE_UNHIGHLIGHTED  0x0004
  253. #define VIEWDEF 1
  254. #endif
  255.  
  256. /* Prescaling (used in hrendo5.c and 3dsupp.c (in where_screen_pt()) */
  257.  
  258. #define PRESCALE  2    /* frac bits in XY coords */
  259. #define PRESCALEZ 2
  260.  
  261. #ifndef SCRIDEF
  262. #define SCRIDEF 1
  263. struct Screeninfo {
  264.     int xmin, ymin, xmax, ymax, xcent, ycent, colors, pages, bw;
  265.     long aspect;
  266.     char id[80];
  267.     };
  268. #endif
  269.  
  270.  
  271. extern struct Screeninfo *screeninfo;
  272.  
  273. extern long isine(long angle);
  274. extern long icosine(long angle);
  275.                     /* create rotation/translation */
  276.                     /* "matrix" from angle data    */
  277.                     /* CALL setup_render FIRST!    */
  278.  
  279. /* End of structs */
  280.  
  281. extern void set_screen_monitor(int x, int y);
  282. extern void clear_screen_monitor();
  283. extern POLY * read_screen_monitor();
  284.  
  285. /* Provided by user, in render.c: */
  286.  
  287. extern void user_render_poly(int vertex_count, int *pcoords,
  288.                              unsigned poly_color, long max_depth);
  289. extern void user_setup_blitter();
  290. extern void user_reset_blitter();
  291.  
  292. /* End of 3dstruct.h */
  293.  
  294.