home *** CD-ROM | disk | FTP | other *** search
/ Stars of Shareware: Raytrace & Morphing / SOS-RAYTRACE.ISO / programm / source / devel5 / rend386.h < prev    next >
Encoding:
C/C++ Source or Header  |  1993-03-28  |  11.7 KB  |  303 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 lock_rep(OBJECT *o, int number);
  119. extern void unlock_rep(OBJECT *o);
  120. extern void first_rep(OBJECT *obj);
  121. extern int next_rep(OBJECT *obj);   /* return 1 if wrapping back to first */
  122. extern void set_rep_size(OBJECT *obj, long size);
  123. extern long get_rep_size(OBJECT *obj);
  124. extern REP  *add_representation(OBJECT *obj, long size, int nv, int np);
  125. extern void select_representation(OBJECT *obj, long size);
  126. extern void delete_rep(OBJECT *obj);
  127.  
  128. /* Depth-sorting control: */
  129. #define DEEPEST 0x0000          /* sort polys by deepest point */
  130. #define ATBACK  0x0001          /* push this object's poly's waaaay back */
  131. #define AVERAGE 0x0002          /* sort polys by average depth */
  132.  
  133. #define BYOBJECT   0x0100       /* sort by object */
  134. #define BYPOLY     0x0000       /* put polys in world before sort */
  135.  
  136. extern unsigned get_object_sorting(OBJECT *obj);
  137. extern void set_object_sorting(OBJECT *obj, unsigned depth_type);
  138.  
  139. extern unsigned get_default_depth_sort(void);
  140. extern void set_default_depth_sort(unsigned value);
  141.  
  142. /* Values for object flags */
  143. #define OBJ_NONSEL       0x0800 /* can't be selected (i.e. pointer) */
  144. #define OBJ_INVIS        0x1000
  145. #define OBJ_HIGHLIGHTED  0x2000
  146. #define OBJLIST_HEADER   0x4000
  147. #define IS_OBJECT        0x8000 /* required by renderer: it will set */
  148.  
  149. extern OBJLIST *new_objlist(void);
  150. extern void add_to_objlist(OBJLIST *list, OBJECT *obj);
  151. extern void remove_from_objlist(OBJECT *obj);
  152. extern void del_objlist(OBJLIST *list);
  153. extern OBJLIST *on_objlist(OBJECT *obj);
  154. extern OBJECT *first_in_objlist(OBJLIST *objlist);
  155. extern OBJECT *next_in_objlist(OBJECT *obj);
  156. extern OBJECT *prev_in_objlist(OBJECT *obj);
  157. extern int is_first_in_objlist(OBJECT *obj);
  158. extern int is_last_in_objlist(OBJECT *obj);
  159. extern void walk_objlist(OBJLIST *objlist, void (*fn)());
  160. extern void get_obj_info(OBJECT *obj, int *nv, int *np);
  161. extern void get_vertex_info(OBJECT *obj, int vertnum, long *x, long *y, long *z);
  162. extern void get_vertex_world_info(OBJECT *obj, int vertnum, long *x, long *y, long *z);
  163. extern void get_poly_info(OBJECT *obj, int polynum, unsigned *color, int *nverts, int *verts, int maxverts);
  164. extern void set_poly_color(OBJECT *obj, int polynum, unsigned color);
  165. extern void *get_object_owner(OBJECT *obj);
  166. extern void set_object_owner(OBJECT *obj, void *owner);
  167. extern void copy_world_to_object(OBJECT *obj);
  168.  
  169. extern void compute_view_factors(VIEW *v);
  170.  
  171. extern void fast_view_factors(VIEW *v);
  172. void real_viewpoint(VIEW *v, long *x, long *y, long *z);
  173.  
  174. extern void initialize_screen_factors(VIEW *v);
  175.         /* computes screen and viewport    */
  176.         /* factors.  These stay constant   */
  177.         /* over eye point changes          */
  178.         /* setup viewport data, do once    */
  179.         /* unless offset, zoom etc changed */
  180.  
  181.  
  182. extern void *setup_render(unsigned K_of_mem, int maxpolys);  /* ptr to mem for temp use */
  183. extern void reset_render(void);
  184. extern void render(OBJLIST *objlist, VIEW *view);
  185. extern void render_set_view(VIEW *view);
  186. extern void subrender(OBJLIST *objlist);
  187. extern int poly_cosine(POLY *pp, long lx, long ly, long lz, int spot);
  188. extern void set_screen_monitor(int x, int y);
  189. extern void clear_screen_monitor(void);
  190. extern POLY *read_screen_monitor(void);
  191.  
  192. extern long where_pt(OBJLIST *objlist, long x, long y, long z, OBJECT **wobj, int *wvert);
  193. extern OBJECT *best_collision(OBJLIST *objlist, long x, long y, long z);
  194. extern int test_collision(OBJECT *obj, long x, long y, long z);
  195. extern OBJECT *locate_screen_pt(int *pol, int *vert);
  196. extern OBJECT *where_screen_pt(int *pol, int *vert, int x, int y);
  197.  
  198. extern SEGMENT *new_seg(SEGMENT *parent);
  199. extern void seg_set_object(SEGMENT *s, void *app);
  200. extern void *seg_get_object(SEGMENT *s);
  201. extern char *seg_getname(SEGMENT *s);
  202. extern void seg_setname(SEGMENT *s, char *name);
  203. extern void seg_getposang(SEGMENT *s, long *rx, long *ry, long *rz);
  204. extern void seg_getjointang(SEGMENT *s, long *rx, long *ry, long *rz);
  205. extern void seg_getposxyz(SEGMENT *s, long *x, long *y, long *z);
  206. extern void seg_getjointxyz(SEGMENT *s, long *x, long *y, long *z);
  207. extern void abs_move_segment(SEGMENT *s, long tx, long ty, long tz);
  208. extern void rel_move_segment(SEGMENT *s, long tx, long ty, long tz);
  209. extern void abs_mat_segment(SEGMENT *s, MATRIX m);
  210. extern void rel_mat_segment(SEGMENT *s, MATRIX m);
  211. extern void abs_rotmat_segment(SEGMENT *s, MATRIX m);
  212. extern void rel_rotmat_segment(SEGMENT *s, MATRIX m);
  213. extern void abs_rot_segment(SEGMENT *s, long rx, long ry, long rz, int order);
  214. extern void rel_rot_segment(SEGMENT *s, long rx, long ry, long rz, int order);
  215. extern void move_rep(OBJECT *obj); /* move current rep of object  */
  216. extern void set_move_handler(void (*move_handler_ptr)());
  217. extern void full_update_segment(SEGMENT *seg);
  218. extern void update_segment(SEGMENT *seg); /* scan till update needed */
  219. extern SEGMENT *find_root_segment(SEGMENT *s);
  220. extern SEGMENT *parent_segment(SEGMENT *s);
  221. extern SEGMENT *child_segment(SEGMENT *s);
  222. extern SEGMENT *sibling_segment(SEGMENT *s);
  223. extern MATRIX *get_seg_jmatrix(SEGMENT *s);
  224. extern MATRIX *get_seg_pmatrix(SEGMENT *s);
  225. extern void detach_segment(SEGMENT *s);    /* assumes segment is updated! */
  226. extern void attach_segment(SEGMENT *s, SEGMENT *to); /* assumes parent is updated! */
  227. extern void delete_segment(SEGMENT *s, void (*delapp_fn)());
  228. extern SEGMENT *find_segment_by_name(SEGMENT *s, char *name);
  229. extern SEGMENT *copy_segment(SEGMENT *s, long dx, long dy, long dz, void *(*copy_fn)());
  230.  
  231. extern SEGMENT *get_root_segment(SEGMENT *s);
  232. extern void seg_getrxyz(SEGMENT *s, long *rx, long *ry, long *rz);
  233. extern int seg_get_flags(SEGMENT *s);
  234. extern void seg_set_flags(SEGMENT *s, int f);
  235.  
  236. extern enter_graphics(void);
  237. extern exit_graphics(void);
  238. extern void clear_display(int page);
  239. extern void vgabox(int left, int top, int right, int bottom, int color);
  240.  
  241. /* These next few routines are provided by the application programmer */
  242. extern void user_setup_blitter();
  243. extern void user_reset_blitter();
  244. extern void user_render_poly(int number, int *pcoords, unsigned color, long maxz);
  245. extern void user_text(int x, int y, int color, char *string);
  246. extern void user_box(int x1, int y1, int x2, int y2, int color);
  247. extern int user_poly_color(POLY *p, int pcolor, long maxz);
  248.  
  249. extern load_pcx(FILE *in, int page);
  250. extern int save_pcx(FILE *out, int page);
  251.  
  252. typedef struct {   /* stereoscopic view factors */
  253.     long phys_screen_dist;  /* eye-to-screen distance (mm); keep < 32000  */
  254.     long phys_screen_width; /* viewport width on screen (mm)              */
  255.     long pixel_width;       /* width of viewport in pixels                */
  256.     long phys_eye_spacing;  /* spacing of eyes (mm) [usually 63]          */
  257.     long phys_convergence;  /* convergence dist. (usually screen) (mm)    */
  258.     long world_scaling;     /* world units per physical mm                */
  259.     } STEREO ;
  260.  
  261. #define MONOSCOPIC 0 /* stereo types */
  262. #define SWITCHED   1
  263. #define SPLITLR    3
  264. #define SEPARATE   5
  265.  
  266. #define LEFT_EYE   0
  267. #define RIGHT_EYE  1
  268.  
  269. /* call fast_view_factors or view_from_matrix BEFORE these! */
  270.  
  271.     /* make a left or right eye view, cache */
  272.  
  273. extern void compute_stereo_data(STEREO *stereo, int eye, int xflip, int xdist, long yr,
  274.              long left, long top, long right, long bottom );
  275.  
  276.     /* create a new view from cyclopean view and cached data */
  277.  
  278. extern void make_stereo_view(VIEW *root, VIEW *nview, int eye);
  279.  
  280.     /* sufficient if only view point has changed and no twist or offset */
  281. extern void update_stereo_view(VIEW *v, STEREO *s, int eye);
  282.  
  283.     /* makes a standard SWITCHED stereo screen */
  284. extern void default_stereo_setup(VIEW *v, STEREO *s);
  285.  
  286.     /* high-resolution timer routines */
  287. extern void tdelay(int msec);         /* replaces borland delay() */
  288. extern long current_time(void);
  289. extern void init_timer(void);
  290. extern void set_current_time(long newtime);
  291. extern int get_ticks_per_second(void);
  292. extern volatile interrupts_occurred;
  293.  
  294. extern void *load_driver(char *dfile);
  295. extern unsigned char get_video_driver_version(void);
  296.  
  297. extern void matrix_view_factors(VIEW *v,MATRIX m); /* set up from matrix xform */
  298. extern void view_to_matrix(VIEW *v,MATRIX m);      /* view matrix to xform matrix */
  299.  
  300. /* For other matrix routines, you should now include intmath.h */
  301.  
  302. /* End of rend386.h */
  303.