added prototype for g3_uninit_polygon_model
[btb/d2x.git] / include / 3d.h
1 /*
2 THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
3 SOFTWARE CORPORATION ("PARALLAX").  PARALLAX, IN DISTRIBUTING THE CODE TO
4 END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
5 ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
6 IN USING, DISPLAYING,  AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
7 SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
8 FREE PURPOSES.  IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
9 CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES.  THE END-USER UNDERSTANDS
10 AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.  
11 COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION.  ALL RIGHTS RESERVED.
12 */
13 /*
14  * $Source: /cvs/cvsroot/d2x/include/3d.h,v $
15  * $Revision: 1.3 $
16  * $Author: bradleyb $
17  * $Date: 2001-10-25 02:06:58 $
18  *
19  * Header file for 3d library
20  *
21  * $Log: not supported by cvs2svn $
22  * Revision 1.2  2001/01/20 13:49:14  bradleyb
23  * Got rid of all compiler warnings, for non-OpenGL on linux, anyway...
24  *
25  * Revision 1.1.1.1  2001/01/19 03:30:16  bradleyb
26  * Import of d2x-0.0.8
27  *
28  * Revision 1.1.1.1  1999/06/14 22:02:03  donut
29  * Import of d1x 1.37 source.
30  *
31  * Revision 1.2  1995/09/14  14:08:58  allender
32  * return value for g3_draw_sphere
33  *
34  * Revision 1.1  1995/05/05  08:48:41  allender
35  * Initial revision
36  *
37  * 
38  *
39  */
40
41 #ifndef _3D_H
42 #define _3D_H
43
44 #include "vecmat.h"
45
46 extern int g3d_interp_outline;          //if on, polygon models outlined in white
47 extern vms_vector Matrix_scale;
48 extern short highest_texture_num;
49
50 //Structure for storing u,v,light values.  This structure doesn't have a
51 //prefix because it was defined somewhere else before it was moved here
52 typedef struct g3s_uvl {
53         fix u,v,l;
54 } g3s_uvl;
55
56 //Stucture to store clipping codes in a word
57 typedef struct g3s_codes {
58         ubyte or,and;   //or is low byte, and is high byte
59 } g3s_codes;
60
61 //flags for point structure
62 #define PF_PROJECTED    1       //has been projected, so sx,sy valid
63 #define PF_OVERFLOW             2       //can't project
64 #define PF_TEMP_POINT   4       //created during clip
65 #define PF_UVS                          8       //has uv values set
66 #define PF_LS                           16      //has lighting values set
67
68 //clipping codes flags
69
70 #define CC_OFF_LEFT     1
71 #define CC_OFF_RIGHT    2
72 #define CC_OFF_BOT      4
73 #define CC_OFF_TOP      8
74 #define CC_BEHIND               0x80
75
76 //Used to store rotated points for mines.  Has frame count to indictate
77 //if rotated, and flag to indicate if projected.
78 typedef struct g3s_point {
79         vms_vector p3_vec;         //reference as vector...
80 #ifdef D1XD3D
81         vms_vector p3_orig;
82 #endif
83         fix p3_u,p3_v,p3_l;
84         fix p3_sx,p3_sy;                //screen x&y
85         ubyte p3_codes;         //clipping codes
86         ubyte p3_flags;         //projected?
87         short p3_pad;                   //keep structure longwork aligned
88 } g3s_point;
89
90 //macros to reference x,y,z elements of a 3d point
91 #define p3_x p3_vec.x
92 #define p3_y p3_vec.y
93 #define p3_z p3_vec.z
94
95 //An object, such as a robot
96 typedef struct g3s_object {
97         vms_vector o3_pos;       //location of this object
98         vms_angvec o3_orient;    //orientation of this object
99         int o3_nverts;           //number of points in the object
100         int o3_nfaces;           //number of faces in the object
101
102         //this will be filled in later
103
104 } g3s_object;
105
106 //Functions in library
107
108 //3d system startup and shutdown:
109
110 //initialize the 3d system
111 void g3_init(void);
112
113 //close down the 3d system
114 void g3_close(void);
115
116
117 //Frame setup functions:
118
119 //start the frame
120 void g3_start_frame(void);
121
122 //set view from x,y,z & p,b,h, zoom.  Must call one of g3_set_view_*() 
123 void g3_set_view_angles(vms_vector *view_pos,vms_angvec *view_orient,fix zoom);
124
125 //set view from x,y,z, viewer matrix, and zoom.  Must call one of g3_set_view_*() 
126 void g3_set_view_matrix(vms_vector *view_pos,vms_matrix *view_matrix,fix zoom);
127
128 //end the frame
129 void g3_end_frame(void);
130
131 //draw a horizon
132 void g3_draw_horizon(int sky_color,int ground_color);
133
134 //get vectors that are edge of horizon
135 int g3_compute_sky_polygon(fix *points_2d,vms_vector *vecs);
136
137 //Instancing
138
139 //instance at specified point with specified orientation
140 void g3_start_instance_matrix(vms_vector *pos,vms_matrix *orient);
141
142 //instance at specified point with specified orientation
143 void g3_start_instance_angles(vms_vector *pos,vms_angvec *angles);
144
145 //pops the old context
146 void g3_done_instance();
147
148 //Misc utility functions:
149
150 //get current field of view.  Fills in angle for x & y
151 void g3_get_FOV(fixang *fov_x,fixang *fov_y);
152
153 //get zoom.  For a given window size, return the zoom which will achieve
154 //the given FOV along the given axis.
155 fix g3_get_zoom(char axis,fixang fov,short window_width,short window_height);
156
157 //returns the normalized, unscaled view vectors
158 void g3_get_view_vectors(vms_vector *forward,vms_vector *up,vms_vector *right);
159
160 //returns true if a plane is facing the viewer. takes the unrotated surface 
161 //normal of the plane, and a point on it.  The normal need not be normalized
162 bool g3_check_normal_facing(vms_vector *v,vms_vector *norm);
163
164 //Point definition and rotation functions:
165
166 //specify the arrays refered to by the 'pointlist' parms in the following
167 //functions.  I'm not sure if we will keep this function, but I need
168 //it now.
169 //void g3_set_points(g3s_point *points,vms_vector *vecs);
170
171 //returns codes_and & codes_or of a list of points numbers
172 g3s_codes g3_check_codes(int nv,g3s_point **pointlist);
173
174 //rotates a point. returns codes.  does not check if already rotated
175 ubyte g3_rotate_point(g3s_point *dest,vms_vector *src);
176
177 //projects a point
178 void g3_project_point(g3s_point *point);
179
180 //calculate the depth of a point - returns the z coord of the rotated point
181 fix g3_calc_point_depth(vms_vector *pnt);
182
183 //from a 2d point, compute the vector through that point
184 void g3_point_2_vec(vms_vector *v,short sx,short sy);
185
186 //code a point.  fills in the p3_codes field of the point, and returns the codes
187 ubyte g3_code_point(g3s_point *point);
188
189 //delta rotation functions
190 vms_vector *g3_rotate_delta_x(vms_vector *dest,fix dx);
191 vms_vector *g3_rotate_delta_y(vms_vector *dest,fix dy);
192 vms_vector *g3_rotate_delta_z(vms_vector *dest,fix dz);
193 vms_vector *g3_rotate_delta_vec(vms_vector *dest,vms_vector *src);
194 ubyte g3_add_delta_vec(g3s_point *dest,g3s_point *src,vms_vector *deltav);
195
196 //Drawing functions:
197
198 //draw a flat-shaded face.
199 //returns 1 if off screen, 0 if drew
200 bool g3_draw_poly(int nv,g3s_point **pointlist);
201
202 //draw a texture-mapped face.
203 //returns 1 if off screen, 0 if drew
204 bool g3_draw_tmap(int nv,g3s_point **pointlist,g3s_uvl *uvl_list,grs_bitmap *bm);
205
206 //draw a sortof sphere - i.e., the 2d radius is proportional to the 3d
207 //radius, but not to the distance from the eye
208 int g3_draw_sphere(g3s_point *pnt,fix rad);
209
210 //@@//return ligting value for a point
211 //@@fix g3_compute_lighting_value(g3s_point *rotated_point,fix normval);
212
213
214 //like g3_draw_poly(), but checks to see if facing.  If surface normal is
215 //NULL, this routine must compute it, which will be slow.  It is better to 
216 //pre-compute the normal, and pass it to this function.  When the normal
217 //is passed, this function works like g3_check_normal_facing() plus
218 //g3_draw_poly().
219 //returns -1 if not facing, 1 if off screen, 0 if drew
220 bool g3_check_and_draw_poly(int nv,g3s_point **pointlist,vms_vector *norm,vms_vector *pnt);
221 bool g3_check_and_draw_tmap(int nv,g3s_point **pointlist,g3s_uvl *uvl_list,grs_bitmap *bm,vms_vector *norm,vms_vector *pnt);
222
223 //draws a line. takes two points.
224 bool g3_draw_line(g3s_point *p0,g3s_point *p1);
225
226 //draw a polygon that is always facing you
227 //returns 1 if off screen, 0 if drew
228 bool g3_draw_rod_flat(g3s_point *bot_point,fix bot_width,g3s_point *top_point,fix top_width);
229
230 //draw a bitmap object that is always facing you
231 //returns 1 if off screen, 0 if drew
232 bool g3_draw_rod_tmap(grs_bitmap *bitmap,g3s_point *bot_point,fix bot_width,g3s_point *top_point,fix top_width,fix light);
233
234 //draws a bitmap with the specified 3d width & height 
235 //returns 1 if off screen, 0 if drew
236 bool g3_draw_bitmap(vms_vector *pos,fix width,fix height,grs_bitmap *bm,int orientation);
237
238 //specifies 2d drawing routines to use instead of defaults.  Passing
239 //NULL for either or both restores defaults
240 void g3_set_special_render(void (*tmap_drawer)(),void (*flat_drawer)(),int (*line_drawer)(fix, fix, fix, fix));
241
242 //Object functions:
243
244 //gives the interpreter an array of points to use
245 void g3_set_interp_points(g3s_point *pointlist);
246
247 //calls the object interpreter to render an object.  The object renderer
248 //is really a seperate pipeline. returns true if drew
249 bool g3_draw_polygon_model(void *model_ptr,grs_bitmap **model_bitmaps,vms_angvec *anim_angles,fix light,fix *glow_values);
250
251 //init code for bitmap models
252 void g3_init_polygon_model(void *model_ptr);
253 //maps the colors back to RGB15
254 void g3_uninit_polygon_model(void *model_ptr);
255
256 //alternate interpreter for morphing object
257 bool g3_draw_morphing_model(void *model_ptr,grs_bitmap **model_bitmaps,vms_angvec *anim_angles,fix light,vms_vector *new_points);
258
259 // routine to convert little to big endian in polygon model data
260 void swap_polygon_model_data(ubyte *data);
261
262 #endif
263