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