home *** CD-ROM | disk | FTP | other *** search
/ Virtual Reality Zone / VRZONE.ISO / mac / PC / PCGLOVE / GLOVE / OBJGLV.ZIP / INCLUDE / DEMO4B / REND386.HPP < prev    next >
C/C++ Source or Header  |  1992-12-07  |  10KB  |  291 lines

  1. /* Application header file for user with 3D renderer */
  2.  
  3. /* Part of the REND386 package by Dave Stampe and Bernie Roehl */
  4.  
  5. /* Copyright 1992 by Dave Stampe and Bernie Roehl.
  6.    May be freely used to write software for release into the public domain;
  7.    all commercial endeavours MUST contact Bernie Roehl and Dave Stampe
  8.    for permission to incorporate any part of this software into their
  9.    products!
  10.  */
  11.  
  12.  
  13. #ifndef SCRIDEF
  14. #define SCRIDEF 1
  15. struct Screeninfo {
  16.     int xmin, ymin, xmax, ymax, xcent, ycent, colors, pages, bw;
  17.     long aspect;
  18.     char id[80];
  19.     };
  20. #endif
  21.  
  22. extern struct Screeninfo *screeninfo;
  23.  
  24. #ifndef MATRIXDEF
  25. typedef long MATRIX[4][3];        /* 3x3 rotate plus 3 translate para's */
  26.             /* rotate matrix is <3.29>, translate is <32.0> */
  27. #define MATRIXDEF 1
  28. #endif
  29.  
  30. /* renderer viewpoint/screen control structure */
  31. /* viewoint in X, Y, Z coords */
  32. /* pan, tilt, roll in (float*65536) formats */
  33. /* zoom is equiv. to magnification from 90 deg. FOV (also float*65536) */
  34. /* aspect sets how much to magnify Y more than X to fix up displays */
  35. /* light source point in world coordinates */
  36. /* left, right, top, bottom set edges of screen */
  37. /* hither sets closest point: keep >16 for best range of world coords */
  38. /* yon sets max. distance: keep it 1<<26 if not used */
  39. /* rest is renderer workspace */
  40.  
  41.  
  42. #ifndef VIEWDEF
  43. #define VIEWDEF 1
  44. typedef struct {
  45.     /* VIEWPOINT */
  46.     long ex, ey, ez;        /* <25.0>  location of eyepoint         */
  47.     long pan, tilt, roll;   /* <16.16> viewing angles (deg) +/- 128 */
  48.     long zoom;              /* <16.16> 1/tan(H FOV/2) 0.5 to 16     */
  49.     long lx,ly,lz;          /* <25.0>  location of light source     */
  50.     int  directional;       /* 0 for point, 1 for normal (not unit) */
  51.     int  ambient;           /* ambient light: 0-256 (72 recc.)      */
  52.  
  53.     /* SCREEN DATA */
  54.     long left,right;        /* <25.0> clipping planes */
  55.     long top, bottom;
  56.     long hither, yon;       /* <25.0> near and far clipping planes   */
  57.     long aspect;            /* <16.16> x:y fixup factor (magnify Y by...) */
  58.  
  59.     /* RENDERING CONTROL */
  60.     unsigned flags;         /* 16 bits of flags */
  61.  
  62.     /* ADVANCED SCREEN DATA */
  63.     long x_offset, y_offset;   /* amount to move screen center in pixels */
  64.     unsigned orientation;      /* used to mirror screen image */
  65. #define NOFLIP 0x0000      /* bits used in orientation field */
  66. #define XFLIP  0x0001
  67. #define YFLIP  0x0002
  68.  
  69.     MATRIX eye_xform;
  70.  
  71.     char spare[200];        /* 100 bytes needed, plus 100 bytes spare */
  72.     } VIEW;
  73. #endif
  74.  
  75.  
  76. /* View flags: */
  77.  
  78. #define WIREFRAME           0x0001
  79. #define HIDE_HIGHLIGHTED    0x0002
  80. #define HIDE_UNHIGHLIGHTED  0x0004
  81.  
  82. /****** Only a stupid C programmer would do this...
  83. #ifndef POLYDEF
  84. #define POLYDEF 1
  85. typedef void POLY;
  86. #endif
  87.  
  88. #ifndef REPDEF
  89. #define REPDEF 1
  90. typedef void REP;
  91. #endif
  92.  
  93.  
  94. #ifndef OBJDEF
  95. #define OBJDEF 1
  96. typedef void *OBJECT;
  97. #endif
  98.  
  99. #ifndef OBJLDEF
  100. #define OBJLDEF 1
  101. typedef void *OBJLIST;
  102. #endif
  103.  
  104. typedef void SEGMENT;
  105. **************/
  106.  
  107. #include "3dstruct.hpp"
  108. #include "segment.hpp"
  109.  
  110. /* Function prototypes: */
  111.  
  112. OBJECT *new_obj(int type, int nv, int np);
  113. void add_vertex(OBJECT *obj, long x, long y, long z);
  114. POLY *add_poly(OBJECT *obj, unsigned color, int npoints);
  115. void add_point(OBJECT *obj, POLY *p, int vertnum);
  116. void delete_obj(OBJECT *obj);
  117. long get_object_bounds(OBJECT *obj, long *x, long *y, long *z);
  118. void compute_obj(OBJECT *obj);
  119. void set_obj_flags(OBJECT *obj, unsigned value);
  120. unsigned get_obj_flags(OBJECT *obj);
  121. void highlight_obj(OBJECT *obj);
  122. void unhighlight_obj(OBJECT *obj);
  123. void first_rep(OBJECT *obj);
  124. void next_rep(OBJECT *obj);
  125. void set_rep_size(OBJECT *obj, long size);
  126. long get_rep_size(OBJECT *obj);
  127. REP  *add_representation(OBJECT *obj, long size, int nv, int np);
  128. void select_representation(OBJECT *obj, long size);
  129. void delete_rep(OBJECT *obj);
  130.  
  131. /* Depth-sorting control: */
  132. #define DEEPEST 0x0000          /* sort polys by deepest point */
  133. #define ATBACK  0x0001          /* push this object's poly's waaaay back */
  134. #define AVERAGE 0x0002          /* sort polys by average depth */
  135.  
  136. #define BYOBJECT   0x0100       /* sort by object */
  137. #define BYPOLY     0x0000       /* put polys in world before sort */
  138.  
  139. unsigned get_object_sorting(OBJECT *obj);
  140. void set_object_sorting(OBJECT *obj, unsigned depth_type);
  141.  
  142. unsigned get_default_depth_sort();
  143. void set_default_depth_sort(unsigned value);
  144.  
  145. /* Values for object flags */
  146. #define OBJ_NONSEL       0x0800 /* can't be selected (i.e. pointer) */
  147. #define OBJ_INVIS        0x1000
  148. #define OBJ_HIGHLIGHTED  0x2000
  149. #define OBJLIST_HEADER   0x4000
  150. #define IS_OBJECT        0x8000 /* required by renderer: it will set */
  151.  
  152. OBJLIST *new_objlist();
  153. void add_to_objlist(OBJLIST *list, OBJECT *obj);
  154. void remove_from_objlist(OBJECT *obj);
  155. void del_objlist(OBJLIST *list);
  156. OBJLIST *on_objlist(OBJECT *obj);
  157. OBJECT *first_in_objlist(OBJLIST *objlist);
  158. OBJECT *next_in_objlist(OBJECT *obj);
  159. OBJECT *prev_in_objlist(OBJECT *obj);
  160. int is_first_in_objlist(OBJECT *obj);
  161. int is_last_in_objlist(OBJECT *obj);
  162. void walk_objlist(OBJLIST *objlist, void (*fn)(OBJECT *));
  163. void get_obj_info(OBJECT *obj, int *nv, int *np);
  164. void get_vertex_info(OBJECT *obj, int vertnum, long *x, long *y, long *z);
  165. void get_vertex_world_info(OBJECT *obj, int vertnum, long *x, long *y, long *z);
  166. void get_poly_info(OBJECT *obj, int polynum, unsigned *color, int *nverts, int *verts, int maxverts);
  167. void set_poly_color(OBJECT *obj, int polynum, unsigned color);
  168. void *get_object_owner(OBJECT *obj);
  169. void set_object_owner(OBJECT *obj, void *owner);
  170. void copy_world_to_object(OBJECT *obj);
  171.  
  172. void compute_view_factors(VIEW *v);
  173.  
  174. void fast_view_factors(VIEW *v);
  175.         /* computes eye point/ angle movement factors only */
  176.  
  177. void initialize_screen_factors(VIEW *v);
  178.         /* computes screen and viewport    */
  179.         /* factors.  These stay constant   */
  180.         /* over eye point changes          */
  181.         /* setup viewwport data, do once   */
  182.         /* unless offset, zoom etc changed */
  183.  
  184.  
  185. void setup_render(unsigned K_of_mem, int maxpolys);
  186. void reset_render();
  187. void render(OBJLIST *objlist, VIEW *view);
  188. void render_set_view(VIEW *view);
  189. void subrender(OBJLIST *objlist);
  190. int poly_cosine(POLY *poly);
  191. void set_screen_monitor(int x, int y);
  192. void clear_screen_monitor();
  193. POLY *read_screen_monitor();
  194.  
  195. long where_pt(OBJLIST *objlist, long x, long y, long z, OBJECT **wobj, int *wvert);
  196. OBJECT *best_collision(OBJLIST *objlist, long x, long y, long z);
  197. int test_collision(OBJECT *obj, long x, long y, long z);
  198. OBJECT *locate_screen_pt(int *pol, int *vert);
  199. OBJECT *where_screen_pt(int *pol, int *vert, int x, int y);
  200.  
  201. SEGMENT *new_seg(SEGMENT *parent);
  202. void seg_set_object(SEGMENT *s, OBJECT *app);
  203. void *seg_get_object(SEGMENT *s);
  204. char *seg_getname(SEGMENT *s);
  205. void seg_setname(SEGMENT *s, char *name);
  206. void seg_getposang(SEGMENT *s, long *rx, long *ry, long *rz);
  207. void seg_getjointang(SEGMENT *s, long *rx, long *ry, long *rz);
  208. void seg_getposxyz(SEGMENT *s, long *x, long *y, long *z);
  209. void seg_getjointxyz(SEGMENT *s, long *x, long *y, long *z);
  210. void abs_move_segment(SEGMENT *s, long tx, long ty, long tz);
  211. void rel_move_segment(SEGMENT *s, long tx, long ty, long tz);
  212. void abs_mat_segment(SEGMENT *s, MATRIX m);
  213. void rel_mat_segment(SEGMENT *s, MATRIX m);
  214. void abs_rotmat_segment(SEGMENT *s, MATRIX m);
  215. void rel_rotmat_segment(SEGMENT *s, MATRIX m);
  216. void abs_rot_segment(SEGMENT *s, long rx, long ry, long rz, int order);
  217. void rel_rot_segment(SEGMENT *s, long rx, long ry, long rz, int order);
  218. void move_rep(OBJECT *obj); /* move current rep of object  */
  219. void set_move_handler(void (*move_handler_ptr)(OBJECT *));
  220. void full_update_segment(SEGMENT *seg);
  221. void update_segment(SEGMENT *seg); /* scan till update needed */
  222. SEGMENT *find_root_segment(SEGMENT *s);
  223. SEGMENT *parent_segment(SEGMENT *s);
  224. SEGMENT *child_segment(SEGMENT *s);
  225. SEGMENT *sibling_segment(SEGMENT *s);
  226. MATRIX *get_seg_jmatrix(SEGMENT *s);
  227. MATRIX *get_seg_pmatrix(SEGMENT *s);
  228. void detach_segment(SEGMENT *s);    /* assumes segment is updated! */
  229. void attach_segment(SEGMENT *s, SEGMENT *to); /* assumes parent is updated! */
  230. void delete_segment(SEGMENT *s, void (*delapp_fn)(OBJECT *));
  231. SEGMENT *find_segment_by_name(SEGMENT *s, char *name);
  232. SEGMENT *copy_segment(SEGMENT *s, long dx, long dy, long dz, void *(*copy_fn)());
  233.  
  234. enter_graphics();
  235. exit_graphics();
  236. void clear_display(int page);
  237. void vgabox(int left, int top, int right, int bottom, int color);
  238.  
  239. load_pcx(FILE *in, int page);
  240. int save_pcx(FILE *out, int page);
  241.  
  242. typedef struct {   /* stereoscopic view factors */
  243.     long phys_screen_dist;  /* eye-to-screen distance (mm); keep < 32000  */
  244.     long phys_screen_width; /* viewport width on screen (mm)              */
  245.     long pixel_width;       /* width of viewport in pixels                */
  246.     long phys_eye_spacing;  /* spacing of eyes (mm) [usually 63]          */
  247.     long phys_convergence;  /* convergence dist. (usually screen) (mm)    */
  248.     long world_scaling;     /* world units per physical mm                */
  249.     } STEREO ;
  250.  
  251. #define MONOSCOPIC 0 /* stereo types */
  252. #define SWITCHED   1
  253. #define SPLITLR    3
  254. #define SEPARATE   5
  255.  
  256. #define LEFT_EYE   0
  257. #define RIGHT_EYE  1
  258.  
  259. /* call fast_view_factors or view_from_matrix BEFORE these! */
  260.  
  261.     /* make a left or right eye view, cache */
  262.  
  263. void compute_stereo_data(STEREO *stereo, int eye, int xflip, int xdist, long yr,
  264.              long left, long top, long right, long bottom );
  265.  
  266.     /* create a new view from cyclopean view and cached data */
  267.  
  268. void make_stereo_view(VIEW *root, VIEW *nview, int eye);
  269.  
  270.     /* sufficient if only view point has changed and no twist or offset */
  271. void update_stereo_view(VIEW *v, STEREO *s, int eye);
  272.  
  273.     /* makes a standard SWITCHED stereo screen */
  274. void default_stereo_setup(VIEW *v, STEREO *s);
  275.  
  276.     /* high-resolution timer routines */
  277. long current_time();
  278. //void init_timer();
  279. void set_current_time(long newtime);
  280. int get_ticks_per_second();
  281. extern volatile interrupts_occurred;
  282.  
  283. void *load_driver(char *dfile);
  284.  
  285. void matrix_view_factors(VIEW *v,MATRIX m); /* set up from matrix xform */
  286. void view_to_matrix(VIEW *v,MATRIX m);      /* view matrix to xform matrix */
  287.  
  288. /* For other matrix routines, you should now include intmath.h */
  289.  
  290. /* End of rend386.h */
  291.