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.
14 * $Source: /cvs/cvsroot/d2x/3d/rod.c,v $
17 * $Date: 2001-10-31 03:54:51 $
21 * $Log: not supported by cvs2svn $
22 * Revision 1.2 2001/01/31 15:17:48 bradleyb
23 * Makefile and conf.h fixes
25 * Revision 1.1.1.1 2001/01/19 03:29:58 bradleyb
28 * Revision 1.2 1999/09/21 04:05:55 donut
29 * mostly complete OGL implementation (still needs bitmap handling (reticle), and door/fan textures are corrupt)
31 * Revision 1.1.1.1 1999/06/14 21:57:50 donut
32 * Import of d1x 1.37 source.
34 * Revision 1.2 1995/09/13 11:31:46 allender
35 * removed checkmuldiv in PPC implemenation
37 * Revision 1.1 1995/05/05 08:52:45 allender
40 * Revision 1.1 1995/04/17 06:42:08 matt
51 static char rcsid[] = "$Id: rod.c,v 1.3 2001-10-31 03:54:51 bradleyb Exp $";
58 grs_point blob_vertices[4];
59 g3s_point rod_points[4];
60 g3s_point *rod_point_list[] = {&rod_points[0],&rod_points[1],&rod_points[2],&rod_points[3]};
62 g3s_uvl uvl_list[4] = { { 0x0200,0x0200,0 },
67 //compute the corners of a rod. fills in vertbuf.
68 int calc_rod_corners(g3s_point *bot_point,fix bot_width,g3s_point *top_point,fix top_width)
70 vms_vector delta_vec,top,tempv,rod_norm;
74 //compute vector from one point to other, do cross product with vector
75 //from eye to get perpendiclar
77 vm_vec_sub(&delta_vec,&bot_point->p3_vec,&top_point->p3_vec);
81 delta_vec.x = fixdiv(delta_vec.x,Matrix_scale.x);
82 delta_vec.y = fixdiv(delta_vec.y,Matrix_scale.y);
86 //do lots of normalizing to prevent overflowing. When this code works,
87 //it should be optimized
89 vm_vec_normalize(&delta_vec);
91 vm_vec_copy_normalize(&top,&top_point->p3_vec);
93 vm_vec_cross(&rod_norm,&delta_vec,&top);
95 vm_vec_normalize(&rod_norm);
99 rod_norm.x = fixmul(rod_norm.x,Matrix_scale.x);
100 rod_norm.y = fixmul(rod_norm.y,Matrix_scale.y);
102 //now we have the usable edge. generate four points
106 vm_vec_copy_scale(&tempv,&rod_norm,top_width);
109 vm_vec_add(&rod_points[0].p3_vec,&top_point->p3_vec,&tempv);
110 vm_vec_sub(&rod_points[1].p3_vec,&top_point->p3_vec,&tempv);
112 vm_vec_copy_scale(&tempv,&rod_norm,bot_width);
115 vm_vec_sub(&rod_points[2].p3_vec,&bot_point->p3_vec,&tempv);
116 vm_vec_add(&rod_points[3].p3_vec,&bot_point->p3_vec,&tempv);
119 //now code the four points
121 for (i=0,codes_and=0xff;i<4;i++)
122 codes_and &= g3_code_point(&rod_points[i]);
125 return 1; //1 means off screen
127 //clear flags for new points (not projected)
130 rod_points[i].p3_flags = 0;
135 //draw a polygon that is always facing you
136 //returns 1 if off screen, 0 if drew
137 bool g3_draw_rod_flat(g3s_point *bot_point,fix bot_width,g3s_point *top_point,fix top_width)
139 if (calc_rod_corners(bot_point,bot_width,top_point,top_width))
142 return g3_draw_poly(4,rod_point_list);
146 //draw a bitmap object that is always facing you
147 //returns 1 if off screen, 0 if drew
148 bool g3_draw_rod_tmap(grs_bitmap *bitmap,g3s_point *bot_point,fix bot_width,g3s_point *top_point,fix top_width,fix light)
150 if (calc_rod_corners(bot_point,bot_width,top_point,top_width))
153 uvl_list[0].l = uvl_list[1].l = uvl_list[2].l = uvl_list[3].l = light;
155 return g3_draw_tmap(4,rod_point_list,uvl_list,bitmap);
159 int checkmuldiv(fix *r,fix a,fix b,fix c);
162 #if (!(defined(D1XD3D) || defined(OGL)))
163 //draws a bitmap with the specified 3d width & height
164 //returns 1 if off screen, 0 if drew
165 bool g3_draw_bitmap(vms_vector *pos,fix width,fix height,grs_bitmap *bm, int orientation)
171 if (g3_rotate_point(&pnt,pos) & CC_BEHIND)
174 g3_project_point(&pnt);
176 if (pnt.p3_flags & PF_OVERFLOW)
179 if (checkmuldiv(&t,width,Canv_w2,pnt.p3_z))
180 w = fixmul(t,Matrix_scale.x);
184 if (checkmuldiv(&t,height,Canv_h2,pnt.p3_z))
185 h = fixmul(t,Matrix_scale.y);
189 blob_vertices[0].x = pnt.p3_sx - w;
190 blob_vertices[0].y = blob_vertices[1].y = pnt.p3_sy - h;
191 blob_vertices[1].x = blob_vertices[2].x = pnt.p3_sx + w;
192 blob_vertices[2].y = pnt.p3_sy + h;
194 scale_bitmap(bm,blob_vertices,0);
202 if (g3_rotate_point(&pnt,pos) & CC_BEHIND)
205 g3_project_point(&pnt);
207 if (pnt.p3_flags & PF_OVERFLOW)
214 w = fixmul(fl2f(((f2fl(width)*fCanv_w2) / fz)), Matrix_scale.x);
215 h = fixmul(fl2f(((f2fl(height)*fCanv_h2) / fz)), Matrix_scale.y);
217 blob_vertices[0].x = pnt.p3_sx - w;
218 blob_vertices[0].y = blob_vertices[1].y = pnt.p3_sy - h;
219 blob_vertices[1].x = blob_vertices[2].x = pnt.p3_sx + w;
220 blob_vertices[2].y = pnt.p3_sy + h;
222 scale_bitmap(bm,blob_vertices);