home *** CD-ROM | disk | FTP | other *** search
/ Virtual Reality Zone / VRZONE.ISO / mac / PC / REND386 / JIREND / REND386.H < prev    next >
C/C++ Source or Header  |  1993-04-11  |  11KB  |  288 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. #ifndef POLYDEF
  83. #define POLYDEF 1
  84. typedef void POLY;
  85. #endif
  86.   
  87. #ifndef REPDEF
  88. #define REPDEF 1
  89. typedef void REP;
  90. #endif
  91.   
  92.   
  93. #ifndef OBJDEF
  94. #define OBJDEF 1
  95. typedef void *OBJECT;
  96. #endif
  97.   
  98. #ifndef OBJLDEF
  99. #define OBJLDEF 1
  100. typedef void *OBJLIST;
  101. #endif
  102.   
  103. typedef void SEGMENT;
  104.   
  105. /* Function prototypes: */
  106.   
  107. extern OBJECT *new_obj(int type, int nv, int np);
  108. extern void add_vertex(OBJECT *obj, long x, long y, long z);
  109. extern POLY *add_poly(OBJECT *obj, unsigned color, int npoints);
  110. extern void add_point(OBJECT *obj, POLY *p, int vertnum);
  111. extern void delete_obj(OBJECT *obj);
  112. extern long get_object_bounds(OBJECT *obj, long *x, long *y, long *z);
  113. extern void compute_obj(OBJECT *obj);
  114. extern void set_obj_flags(OBJECT *obj, unsigned value);
  115. extern unsigned get_obj_flags(OBJECT *obj);
  116. extern void highlight_obj(OBJECT *obj);
  117. extern void unhighlight_obj(OBJECT *obj);
  118. extern void first_rep(OBJECT *obj);
  119. extern void next_rep(OBJECT *obj);
  120. extern void set_rep_size(OBJECT *obj, long size);
  121. extern long get_rep_size(OBJECT *obj);
  122. extern REP  *add_representation(OBJECT *obj, long size, int nv, int np);
  123. extern void select_representation(OBJECT *obj, long size);
  124. extern void delete_rep(OBJECT *obj);
  125.   
  126. /* Depth-sorting control: */
  127. #define DEEPEST 0x0000          /* sort polys by deepest point */
  128. #define ATBACK  0x0001          /* push this object's poly's waaaay back */
  129. #define AVERAGE 0x0002          /* sort polys by average depth */
  130.   
  131. #define BYOBJECT   0x0100       /* sort by object */
  132. #define BYPOLY     0x0000       /* put polys in world before sort */
  133.   
  134. extern unsigned get_object_sorting(OBJECT *obj);
  135. extern void set_object_sorting(OBJECT *obj, unsigned depth_type);
  136.   
  137. extern unsigned get_default_depth_sort(void);
  138. extern void set_default_depth_sort(unsigned value);
  139.   
  140. /* Values for object flags */
  141. #define OBJ_NONSEL       0x0800 /* can't be selected (i.e. pointer) */
  142. #define OBJ_INVIS        0x1000
  143. #define OBJ_HIGHLIGHTED  0x2000
  144. #define OBJLIST_HEADER   0x4000
  145. #define IS_OBJECT        0x8000 /* required by renderer: it will set */
  146.   
  147. extern OBJLIST *new_objlist(void);
  148. extern void add_to_objlist(OBJLIST *list, OBJECT *obj);
  149. extern void remove_from_objlist(OBJECT *obj);
  150. extern void del_objlist(OBJLIST *list);
  151. extern OBJLIST *on_objlist(OBJECT *obj);
  152. extern OBJECT *first_in_objlist(OBJLIST *objlist);
  153. extern OBJECT *next_in_objlist(OBJECT *obj);
  154. extern OBJECT *prev_in_objlist(OBJECT *obj);
  155. extern int is_first_in_objlist(OBJECT *obj);
  156. extern int is_last_in_objlist(OBJECT *obj);
  157. extern void walk_objlist(OBJLIST *objlist, void (*fn)());
  158. extern void get_obj_info(OBJECT *obj, int *nv, int *np);
  159. extern void get_vertex_info(OBJECT *obj, int vertnum, long *x, long *y, long *z);
  160. extern void get_vertex_world_info(OBJECT *obj, int vertnum, long *x, long *y, long *z);
  161. extern void get_poly_info(OBJECT *obj, int polynum, unsigned *color, int *nverts, int *verts, int maxverts);
  162. extern void set_poly_color(OBJECT *obj, int polynum, unsigned color);
  163. extern void *get_object_owner(OBJECT *obj);
  164. extern void set_object_owner(OBJECT *obj, void *owner);
  165. extern void copy_world_to_object(OBJECT *obj);
  166.   
  167. extern void compute_view_factors(VIEW *v);
  168.   
  169. extern void fast_view_factors(VIEW *v);
  170.       /* computes eye point/ angle movement factors only */
  171.   
  172. extern void initialize_screen_factors(VIEW *v);
  173.       /* computes screen and viewport    */
  174.       /* factors.  These stay constant   */
  175.       /* over eye point changes          */
  176.       /* setup viewwport data, do once   */
  177.       /* unless offset, zoom etc changed */
  178.   
  179. extern void setup_render(unsigned K_of_mem, int maxpolys);
  180. extern void reset_render(void);
  181. extern void render(OBJLIST *objlist, VIEW *view);
  182. extern void render_set_view(VIEW *view);
  183. extern void subrender(OBJLIST *objlist);
  184. extern int poly_cosine(POLY *poly);
  185. extern void set_screen_monitor(int x, int y);
  186. extern void clear_screen_monitor(void);
  187. extern POLY *read_screen_monitor(void);
  188.   
  189. extern long where_pt(OBJLIST *objlist, long x, long y, long z, OBJECT **wobj, int *wvert);
  190. extern OBJECT *best_collision(OBJLIST *objlist, long x, long y, long z);
  191. extern int test_collision(OBJECT *obj, long x, long y, long z);
  192. extern OBJECT *locate_screen_pt(int *pol, int *vert);
  193. extern OBJECT *where_screen_pt(int *pol, int *vert, int x, int y);
  194.   
  195. extern SEGMENT *new_seg(SEGMENT *parent);
  196. extern void seg_set_object(SEGMENT *s, void *app);
  197. extern void *seg_get_object(SEGMENT *s);
  198. extern char *seg_getname(SEGMENT *s);
  199. extern void seg_setname(SEGMENT *s, char *name);
  200. extern void seg_getposang(SEGMENT *s, long *rx, long *ry, long *rz);
  201. extern void seg_getjointang(SEGMENT *s, long *rx, long *ry, long *rz);
  202. extern void seg_getposxyz(SEGMENT *s, long *x, long *y, long *z);
  203. extern void seg_getjointxyz(SEGMENT *s, long *x, long *y, long *z);
  204. extern void abs_move_segment(SEGMENT *s, long tx, long ty, long tz);
  205. extern void rel_move_segment(SEGMENT *s, long tx, long ty, long tz);
  206. extern void abs_mat_segment(SEGMENT *s, MATRIX m);
  207. extern void rel_mat_segment(SEGMENT *s, MATRIX m);
  208. extern void abs_rotmat_segment(SEGMENT *s, MATRIX m);
  209. extern void rel_rotmat_segment(SEGMENT *s, MATRIX m);
  210. extern void abs_rot_segment(SEGMENT *s, long rx, long ry, long rz, int order);
  211. extern void rel_rot_segment(SEGMENT *s, long rx, long ry, long rz, int order);
  212. extern void move_rep(OBJECT *obj); /* move current rep of object  */
  213. extern void set_move_handler(void (*move_handler_ptr)());
  214. extern void full_update_segment(SEGMENT *seg);
  215. extern void update_segment(SEGMENT *seg); /* scan till update needed */
  216. extern SEGMENT *find_root_segment(SEGMENT *s);
  217. extern SEGMENT *parent_segment(SEGMENT *s);
  218. extern SEGMENT *child_segment(SEGMENT *s);
  219. extern SEGMENT *sibling_segment(SEGMENT *s);
  220. extern MATRIX *get_seg_jmatrix(SEGMENT *s);
  221. extern MATRIX *get_seg_pmatrix(SEGMENT *s);
  222. extern void detach_segment(SEGMENT *s);    /* assumes segment is updated! */
  223. extern void attach_segment(SEGMENT *s, SEGMENT *to); /* assumes parent is updated! */
  224. extern void delete_segment(SEGMENT *s, void (*delapp_fn)());
  225. extern SEGMENT *find_segment_by_name(SEGMENT *s, char *name);
  226. extern SEGMENT *copy_segment(SEGMENT *s, long dx, long dy, long dz, void *(*copy_fn)());
  227.   
  228. extern int enter_graphics(void);
  229. extern void exit_graphics(void);
  230. extern void clear_display(int page);
  231. extern void vgabox(int left, int top, int right, int bottom, int color);
  232.   
  233. extern load_pcx(FILE *in, int page);
  234. extern int save_pcx(FILE *out, int page);
  235. extern int save_pcx_file(void);
  236.   
  237. typedef struct {   /* stereoscopic view factors */
  238.    long phys_screen_dist;  /* eye-to-screen distance (mm); keep < 32000  */
  239.    long phys_screen_width; /* viewport width on screen (mm)              */
  240.    long pixel_width;       /* width of viewport in pixels                */
  241.    long phys_eye_spacing;  /* spacing of eyes (mm) [usually 63]          */
  242.    long phys_convergence;  /* convergence dist. (usually screen) (mm)    */
  243.    long world_scaling;     /* world units per physical mm                */
  244. } STEREO ;
  245.   
  246. #define MONOSCOPIC 0 /* stereo types */
  247. #define SWITCHED   1
  248. #define SPLITLR    3
  249. #define SEPARATE   5
  250.   
  251. #define LEFT_EYE   0
  252. #define RIGHT_EYE  1
  253.   
  254. /* call fast_view_factors or view_from_matrix BEFORE these! */
  255.   
  256.    /* make a left or right eye view, cache */
  257.   
  258. extern void compute_stereo_data(STEREO *stereo, int eye, int xflip, int xdist, long yr,
  259. long left, long top, long right, long bottom );
  260.   
  261.    /* create a new view from cyclopean view and cached data */
  262.   
  263. extern void make_stereo_view(VIEW *root, VIEW *nview, int eye);
  264.   
  265.    /* sufficient if only view point has changed and no twist or offset */
  266. extern void update_stereo_view(VIEW *v, STEREO *s, int eye);
  267.   
  268.    /* makes a standard SWITCHED stereo screen */
  269. extern void default_stereo_setup(VIEW *v, STEREO *s);
  270.   
  271.     /* high-resolution timer routines */
  272. extern long current_time(void);
  273. extern void init_timer(void);
  274. extern void set_current_time(long newtime);
  275. extern int get_ticks_per_second(void);
  276. extern volatile interrupts_occurred;
  277.   
  278. extern void *load_driver(char *dfile);
  279.   
  280. extern void matrix_view_factors(VIEW *v,MATRIX m); /* set up from matrix xform */
  281. extern void view_to_matrix(VIEW *v,MATRIX m);      /* view matrix to xform matrix */
  282.   
  283. extern void refresh_display(void);
  284.  
  285. /* For other matrix routines, you should now include intmath.h */
  286.   
  287. /* End of rend386.h */
  288.