ROLLER.C 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600
  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: f:/miner/source/2d/rcs/roller.c $
  15. * $Revision: 1.15 $
  16. * $Author: john $
  17. * $Date: 1994/10/26 23:55:54 $
  18. *
  19. * bitmap scaler, roller
  20. *
  21. * $Log: roller.c $
  22. * Revision 1.15 1994/10/26 23:55:54 john
  23. * Took out roller; Took out inverse table.
  24. *
  25. * Revision 1.14 1994/05/06 12:49:48 john
  26. * Added supertransparency; neatend things up; took out warnings.
  27. *
  28. * Revision 1.13 1994/02/04 13:21:38 matt
  29. * Took out test code
  30. *
  31. * Revision 1.12 1994/02/01 17:25:31 john
  32. * Made transparency color be 255 all the time.
  33. *
  34. * Revision 1.11 1993/12/08 16:40:47 mike
  35. * Prevent blowup bug when xright < xleft.
  36. *
  37. * Revision 1.10 1993/12/07 12:32:19 john
  38. * moved bmd_palette to gr_palette
  39. *
  40. * Revision 1.9 1993/12/03 18:41:10 unknown
  41. * Put in check for trying to render_scanline wider than compiled code.
  42. *
  43. * Revision 1.8 1993/12/03 15:13:49 mike
  44. * Fix transparency problem by moving setting of Transparency_color.
  45. *
  46. * Revision 1.7 1993/12/03 12:05:13 mike
  47. * Make compiled code bitmaps clip.
  48. *
  49. * Revision 1.6 1993/12/02 18:40:38 mike
  50. * Suppress "Too many compiled code pointers" Error.
  51. *
  52. * Revision 1.5 1993/11/28 12:07:35 mike
  53. * Fix bugs in compiled code roller
  54. *
  55. * Revision 1.4 1993/11/23 13:03:17 mike
  56. * Add compiled code roller.
  57. *
  58. * Revision 1.3 1993/11/18 14:22:44 mike
  59. * fix bugs
  60. *
  61. * Revision 1.2 1993/11/17 19:01:10 mike
  62. * Add roller.
  63. *
  64. * Revision 1.1 1993/11/16 09:36:51 mike
  65. * Initial revision
  66. *
  67. *
  68. */
  69. #pragma off (unreferenced)
  70. static char rcsid[] = "$Id: roller.c 1.15 1994/10/26 23:55:54 john Exp $";
  71. #pragma on (unreferenced)
  72. #define COMPILED_CODE 1
  73. #define TRANSPARENCY_COLOR 255
  74. #include <math.h>
  75. #include <limits.h>
  76. #include <stdio.h>
  77. #include <conio.h>
  78. #include <stdlib.h>
  79. #include "mono.h"
  80. #include "fix.h"
  81. #include "3d.h"
  82. #include "gr.h"
  83. #include "error.h"
  84. //#define USE_ROLLER 1
  85. #ifdef USE_ROLLER
  86. typedef struct xyuv {
  87. fix x,y,u,v;
  88. } xyuv;
  89. extern grs_bitmap ** Texture; // Array of textmaps
  90. int Compiled_code_width;
  91. //int Transparency_color = TRANSPARENCY_COLOR;
  92. // --------------------------------------------------------------------------------------
  93. // Create 4 xyuv points at array vb4, extracting data from 3 g3s_point points in vb.
  94. // Create 4th point using formula (p3 = p0 + p2 - p1)
  95. void create_4_points(grs_point *vb, xyuv *vb4, int width, int height)
  96. {
  97. int i;
  98. for (i=0; i<3; i++) {
  99. vb4[i].x = vb[i].x;
  100. vb4[i].y = vb[i].y;
  101. }
  102. vb4[3].x = vb[0].x + vb[2].x - vb[1].x;
  103. vb4[3].y = vb[0].y + vb[2].y - vb[1].y;
  104. // Set u,v coordinates.
  105. vb4[0].u = 0;
  106. vb4[0].v = 0;
  107. vb4[1].u = width*F1_0 - 1;
  108. vb4[1].v = 0;
  109. vb4[2].u = width*F1_0 - 1;
  110. vb4[2].v = height*F1_0 - 1;
  111. vb4[3].u = 0;
  112. vb4[3].v = height*F1_0 - 1;
  113. }
  114. // --------------------------------------------------------------------------------------
  115. // Compute deltas given 4 points. Actually, only the first three are needed.
  116. // For du_dx, dv_dx, determine whether p1 - p0 or p2 - p1 has larger absolute value, and
  117. // compute deltas from those two points.
  118. // Do similarly for du_dy, dv_dy.
  119. // If, in either x or y, the maximum has absolute value of 0, then the bitmap is
  120. // degenerate. Delta values of 0 are returned in those cases.
  121. void compute_deltas(xyuv *vb, int *min_y, int *max_y, int *lbind, int *rbind,
  122. fix *du_dx, fix *dv_dx, fix *xleft, fix *uleft, fix *vleft, fix *xright,
  123. fix *dx_dy_left, fix *du_dy_left, fix *dv_dy_left, fix *dx_dy_right, fix *du_dy_right, fix *dv_dy_right, int *min_x, int *max_x)
  124. {
  125. int i;
  126. //-- fix denom;
  127. int min_y_ind,min_x_ind;
  128. int left_break_ind,right_break_ind;
  129. float fldenom;
  130. fldenom = f2fl(vb[1].x - vb[0].x) * f2fl(vb[1].y - vb[2].y) - f2fl(vb[1].y - vb[0].y) * f2fl(vb[1].x - vb[2].x);
  131. *du_dx = fl2f(( f2fl(vb[1].u - vb[0].u) * f2fl(vb[1].y - vb[2].y) - f2fl(vb[1].y - vb[0].y) * f2fl(vb[1].u - vb[2].u)) / fldenom);
  132. *dv_dx = fl2f(( f2fl(vb[1].v - vb[0].v) * f2fl(vb[1].y - vb[2].y) - f2fl(vb[1].y - vb[0].y) * f2fl(vb[1].v - vb[2].v)) / fldenom);
  133. //-- denom = fixmul(vb[1].x - vb[0].x , vb[1].y - vb[2].y) - fixmul(vb[1].y - vb[0].y , vb[1].x - vb[2].x);
  134. //--
  135. //-- // If denom is very small, we risk overflow
  136. //-- if (abs(denom) < F1_0/2) {
  137. //-- mprintf(0,"Warning -- denom is nearly 0, bashing to 1.0.\n");
  138. //-- Int3();
  139. //-- denom = F1_0;
  140. //-- }
  141. //--
  142. //-- *du_dx = fixdiv( fixmul(vb[1].u - vb[0].u , vb[1].y - vb[2].y) - fixmul(vb[1].y - vb[0].y , vb[1].u - vb[2].u), denom );
  143. //-- *dv_dx = fixdiv( fixmul(vb[1].v - vb[0].v , vb[1].y - vb[2].y) - fixmul(vb[1].y - vb[0].y , vb[1].v - vb[2].v), denom );
  144. // Compute vertex containing minimum x, y, set min_x, max_x, min_y, max_y
  145. *min_y = 10000;
  146. *min_x = 10000;
  147. for (i=0; i<4; i++) {
  148. if (f2i(vb[i].y) < *min_y) {
  149. *min_y = f2i(vb[i].y);
  150. min_y_ind = i;
  151. }
  152. if (f2i(vb[i].x) < *min_x) {
  153. *min_x = f2i(vb[i].x);
  154. min_x_ind = i;
  155. }
  156. }
  157. *max_y = f2i(vb[(min_y_ind + 2) % 4].y);
  158. *max_x = f2i(vb[(min_x_ind + 2) % 4].x);
  159. *xleft = vb[min_y_ind].x;
  160. *uleft = vb[min_y_ind].u;
  161. *vleft = vb[min_y_ind].v;
  162. // Check for horizontal bitmap (min_y and following vertex have same y coord integer)
  163. left_break_ind = (min_y_ind + 3) % 4;
  164. if (f2i(vb[(min_y_ind+1) % 4].y) == *min_y) {
  165. right_break_ind = (min_y_ind + 2) % 4;
  166. *xright = vb[(min_y_ind+1)%4].x;
  167. } else {
  168. right_break_ind = (min_y_ind + 1) % 4;
  169. *xright = *xleft; // bitmap not horizontal, left and right start out the same
  170. }
  171. *lbind = left_break_ind;
  172. *rbind = right_break_ind;
  173. // Compute delta x for left and right.
  174. if (*max_y - *min_y) {
  175. int dy;
  176. dy = f2i(vb[left_break_ind].y) - *min_y;
  177. if (dy) {
  178. *dx_dy_left = (vb[*lbind].x - *xleft)/(f2i(vb[left_break_ind].y) - *min_y);
  179. *du_dy_left = (vb[left_break_ind].u - vb[min_y_ind].u)/(f2i(vb[left_break_ind].y) - *min_y);
  180. *dv_dy_left = (vb[left_break_ind].v - vb[min_y_ind].v)/(f2i(vb[left_break_ind].y) - *min_y);
  181. } else {
  182. *dx_dy_left = 0;
  183. *du_dy_left = 0;
  184. *dv_dy_left = 0;
  185. }
  186. dy = f2i(vb[right_break_ind].y) - *min_y;
  187. if (dy) {
  188. *dx_dy_right = (vb[*rbind].x - *xright)/(f2i(vb[right_break_ind].y) - *min_y);
  189. *du_dy_right = (vb[right_break_ind].u - vb[min_y_ind].u)/(f2i(vb[right_break_ind].y) - *min_y);
  190. *dv_dy_right = (vb[right_break_ind].v - vb[min_y_ind].v)/(f2i(vb[right_break_ind].y) - *min_y);
  191. } else {
  192. *dx_dy_right = 0;
  193. *du_dy_right = 0;
  194. *dv_dy_right = 0;
  195. }
  196. } else { // bitmap is one row tall, don't care about delta x
  197. *dx_dy_left = 0;
  198. *du_dy_left = 0;
  199. *dv_dy_left = 0;
  200. *dx_dy_right = 0;
  201. *du_dy_right = 0;
  202. *dv_dy_right = 0;
  203. }
  204. }
  205. // 8A 06 mov al,[esi]
  206. // 3C 81 cmp al,129
  207. // 74 02 je skip
  208. // 88 07 mov [edi],al
  209. // 47 skip: inc edi
  210. // 81 C6 00001234 add esi,1234h
  211. // 6 00000000 8A 1E mov bl,[esi]
  212. // 7 00000002 8A 03 mov al,[ebx]
  213. // 8 00000004 8A 04 03 mov al,[ebx+eax]
  214. // 6 00000000 8A 0E mov cl,[esi]
  215. // 7 00000002 8A 03 mov al,[ebx]
  216. // 8 00000004 8A 04 0A mov al,[edx+ecx]
  217. // 9 00000007 80 F9 81 cmp cl,129
  218. #define mov_cl_si_1 0x8a
  219. #define mov_cl_si_2 0x0e
  220. #define mov_bl_si_1 0x8a
  221. #define mov_bl_si_2 0x1e
  222. #define mov_al_si_1 0x8a
  223. #define mov_al_si_2 0x06
  224. #define cmp_al_k 0x3c
  225. #define cmp_cl_k_1 0x80
  226. #define cmp_cl_k_2 0xf9
  227. #define je_addr 0x74
  228. #define mov_al_edx_ecx_1 0x8a
  229. #define mov_al_edx_ecx_2 0x04
  230. #define mov_al_edx_ecx_3 0x0a
  231. #define mov_di_al_1 0x88
  232. #define mov_di_al_2 0x07
  233. #define add_si_k_1 0x81
  234. #define add_si_k_2 0xc6
  235. #define inc_di 0x47
  236. #define ret 0xc3
  237. #define MAX_COMPILED_CODE_POINTERS 1000
  238. #define MAX_COMPILED_CODE (MAX_COMPILED_CODE_POINTERS * 15)
  239. char Compiled_code[MAX_COMPILED_CODE];
  240. int Compiled_code_pointers[MAX_COMPILED_CODE_POINTERS];
  241. // --------------------------------------------------------------------------------------
  242. // 8a 04 mov al,[si]
  243. // 88 05 mov [di],al
  244. // 81 c6 34 12 add si,1234
  245. // 47 inc di
  246. // c3 ret
  247. // Return true if too much compiled code, else return false.
  248. int create_compiled_code(fix du_dx, fix dv_dx, int width, int min_x, int max_x)
  249. {
  250. #if COMPILED_CODE
  251. int x;
  252. char *ccp;
  253. int *ccpp;
  254. int *ccp_int;
  255. int delta_si;
  256. fix cur_u, cur_v, new_u, new_v;
  257. int delta_x;
  258. cur_u = 0;
  259. cur_v = 0;
  260. new_u = du_dx;
  261. new_v = dv_dx;
  262. ccp = Compiled_code;
  263. ccpp = Compiled_code_pointers;
  264. // Initialize all code pointers to something which will cause an exception.
  265. for (x=0; x<MAX_COMPILED_CODE_POINTERS; x++)
  266. Compiled_code_pointers[x] = 0xffffffff;
  267. if (max_x - min_x +2 >= MAX_COMPILED_CODE_POINTERS)
  268. delta_x = MAX_COMPILED_CODE_POINTERS-1;
  269. else
  270. delta_x = max_x - min_x + 2;
  271. Compiled_code_width = delta_x;
  272. for (x=0; x<=delta_x; x++) {
  273. *ccpp++ = (int) ccp;
  274. *ccp++ = mov_cl_si_1;
  275. *ccp++ = mov_cl_si_2;
  276. *ccp++ = cmp_cl_k_1;
  277. *ccp++ = cmp_cl_k_2;
  278. *ccp++ = TRANSPARENCY_COLOR; //Transparency_color; // transparency color
  279. *ccp++ = je_addr;
  280. *ccp++ = 5; // je $+5
  281. *ccp++ = mov_al_edx_ecx_1;
  282. *ccp++ = mov_al_edx_ecx_2;
  283. *ccp++ = mov_al_edx_ecx_3;
  284. *ccp++ = mov_di_al_1;
  285. *ccp++ = mov_di_al_2;
  286. *ccp++ = add_si_k_1;
  287. *ccp++ = add_si_k_2;
  288. delta_si = f2i(new_u) - f2i(cur_u) + ( f2i(new_v) - f2i(cur_v)) * width;
  289. ccp_int = (int *)ccp;
  290. *ccp_int = delta_si;
  291. ccp += sizeof(int)/sizeof(char);
  292. *ccp++ = inc_di;
  293. if (ccp - Compiled_code >= MAX_COMPILED_CODE - 15)
  294. return 1; //Error("Too much compiled code.\n");
  295. if (ccpp - Compiled_code_pointers >= MAX_COMPILED_CODE_POINTERS)
  296. return 1; //Error("Too many compiled code pointers.\n");
  297. cur_u = new_u;
  298. cur_v = new_v;
  299. new_u += du_dx;
  300. new_v += dv_dx;
  301. }
  302. *ccpp++ = (int) ccp;
  303. *ccp = ret;
  304. return 0;
  305. #else
  306. if (min_x + max_x + width + du_dx == dv_dx - 9000)
  307. mprintf(0,"Holy smokes!");
  308. return 0;
  309. #endif
  310. }
  311. int call_compiled_code(char *start_si, char *start_di, int xleft, int xright, int light_value);
  312. #pragma aux call_compiled_code parm [esi] [edi] [eax] [ebx] [edx] value [eax] modify [ecx edx] = \
  313. "pusha" \
  314. "sub ebx,eax" \
  315. "mov eax,Compiled_code_pointers" \
  316. "inc ebx" \
  317. "mov ebx,Compiled_code_pointers[ebx*4]" \
  318. "mov cl,[ebx]" \
  319. "push ebx" \
  320. "push ecx" \
  321. "mov byte ptr [ebx],0c3h" \
  322. "sub ecx,ecx" \
  323. "shl edx,8" \
  324. "add edx,offset gr_fade_table" \
  325. "call eax" \
  326. "pop ecx" \
  327. "pop ebx" \
  328. "mov [ebx],cl" \
  329. "popa"
  330. // --------------------------------------------------------------------------------------
  331. void render_scanline(unsigned char *pixptr, int width, int y, fix xleft, fix xright, fix u, fix v, fix du_dx, fix dv_dx, int light_value)
  332. {
  333. #if COMPILED_CODE
  334. unsigned char *start_si, *start_di;
  335. if (xright - xleft < 0)
  336. return;
  337. start_si = pixptr + f2i(u) + f2i(v) * width;
  338. start_di = grd_curcanv->cv_bitmap.bm_data + grd_curcanv->cv_bitmap.bm_rowsize*y + f2i(xleft);
  339. if (f2i(xright) - f2i(xleft) < Compiled_code_width)
  340. call_compiled_code(start_si, start_di, f2i(xleft), f2i(xright), light_value);
  341. else
  342. mprintf(0,"Not calling compiled code for xleft = %i, xright = %i, width = %i\n",f2i(xleft), f2i(xright), f2i(width));
  343. if (du_dx + dv_dx == 3)
  344. mprintf(0,"That's peculiar...\n");
  345. #else
  346. int x;
  347. for (x=f2i(xleft); x<f2i(xright); x++) {
  348. int color;
  349. color = *(pixptr + f2i(v)*width + f2i(u));
  350. if (color != TRANSPARENCY_COLOR ) { //Transparency_color) {
  351. gr_setcolor(color);
  352. gr_pixel(x,y);
  353. }
  354. u += du_dx;
  355. v += dv_dx;
  356. }
  357. #endif
  358. }
  359. // --------------------------------------------------------------------------------------
  360. void render_bitmap(grs_bitmap *bp, xyuv *vb, int min_y, int max_y, int lbind, int rbind,
  361. fix du_dx, fix dv_dx, fix xleft, fix uleft, fix vleft, fix xright,
  362. fix dx_dy_left, fix du_dy_left, fix dv_dy_left, fix dx_dy_right, fix du_dy_right, fix dv_dy_right, int light_value)
  363. {
  364. int y;
  365. int lby, rby;
  366. fix dx_dyl,du_dyl,dv_dyl;
  367. fix dx_dyr,du_dyr,dv_dyr;
  368. fix fix_width;
  369. unsigned char *pixptr = bp->bm_data;
  370. int width = bp->bm_w;
  371. lby = f2i(vb[lbind].y);
  372. rby = f2i(vb[rbind].y);
  373. dx_dyl = dx_dy_left;
  374. du_dyl = du_dy_left;
  375. dv_dyl = dv_dy_left;
  376. dx_dyr = dx_dy_right;
  377. du_dyr = du_dy_right;
  378. dv_dyr = dv_dy_right;
  379. // Now, render the bitmap.
  380. if (max_y >= grd_curcanv->cv_bitmap.bm_h)
  381. max_y = grd_curcanv->cv_bitmap.bm_h-1;
  382. for (y=min_y; y<=max_y; y++) {
  383. fix u,v;
  384. u = uleft;
  385. v = vleft;
  386. if (y == lby) {
  387. dx_dy_left = dx_dyr;
  388. du_dy_left = du_dyr;
  389. dv_dy_left = dv_dyr;
  390. xleft = vb[lbind].x;
  391. uleft = vb[lbind].u;
  392. vleft = vb[lbind].v;
  393. }
  394. if (y == rby) {
  395. dx_dy_right = dx_dyl;
  396. xright = vb[rbind].x;
  397. }
  398. fix_width = i2f(grd_curcanv->cv_bitmap.bm_w);
  399. if (y >= 0) {
  400. fix txright = xright;
  401. fix txleft = xleft;
  402. if (txleft < 0) {
  403. u -= fixmul(txleft,du_dx);
  404. v -= fixmul(txleft,dv_dx);
  405. txleft = 0;
  406. }
  407. if (txright > fix_width)
  408. txright = fix_width-F1_0;
  409. if ((xright > 0) && (xleft < fix_width))
  410. render_scanline(pixptr, width, y, txleft, txright, u, v, du_dx, dv_dx, light_value);
  411. }
  412. xleft += dx_dy_left;
  413. xright += dx_dy_right;
  414. uleft += du_dy_left;
  415. vleft += dv_dy_left;
  416. }
  417. }
  418. // --------------------------------------------------------------------------------------
  419. // A scaled/rotated bitmap is defined by 3 vertices, upper left, upper right, lower right
  420. void rotate_bitmap(grs_bitmap *bp, grs_point *vertbuf, int light_value)
  421. {
  422. fix du_dx,dv_dx;
  423. int min_y,max_y;
  424. int lbind,rbind;
  425. fix xleft,xright;
  426. fix uleft,vleft;
  427. fix dx_dy_left, du_dy_left, dv_dy_left, dx_dy_right, du_dy_right, dv_dy_right;
  428. int min_x, max_x;
  429. //char *pixptr = bp->bm_data;
  430. //int width = bp->bm_w;
  431. xyuv vb[4];
  432. create_4_points(vertbuf, vb, bp->bm_w, bp->bm_h);
  433. compute_deltas(vb, &min_y, &max_y, &lbind, &rbind, &du_dx, &dv_dx, &xleft, &uleft, &vleft, &xright,
  434. &dx_dy_left, &du_dy_left, &dv_dy_left, &dx_dy_right, &du_dy_right, &dv_dy_right, &min_x, &max_x);
  435. // // Nasty, ugly, illegal hack -- set transparency color based on top 3 left pixels.
  436. // if ((*pixptr == *(pixptr+width)) && (*pixptr == *(pixptr+1))) // try upper left corner
  437. // Transparency_color = *pixptr;
  438. // else if ((*(pixptr+width-1) == *(pixptr+width-2)) && (*(pixptr+width-1) == *(pixptr+2*width-1))) // try upper right corner
  439. // Transparency_color = *(pixptr + width - 1);
  440. // else
  441. // Transparency_color = TRANSPARENCY_COLOR;
  442. if (max_x - min_x < MAX_COMPILED_CODE_POINTERS) {
  443. if (!create_compiled_code(du_dx, dv_dx, bp->bm_w, min_x, max_x))
  444. render_bitmap(bp, vb, min_y, max_y, lbind, rbind, du_dx, dv_dx, xleft, uleft, vleft, xright,
  445. dx_dy_left, du_dy_left, dv_dy_left, dx_dy_right, du_dy_right, dv_dy_right, light_value);
  446. }
  447. }
  448. // --------------------------------------------------------------------------------------
  449. #define DEFAULT_X_SIZE 32
  450. #define DEFAULT_Y_SIZE 32
  451. #define CENTER_X 160
  452. #define CENTER_Y 100
  453. void set_coords(grs_point *verts, float bank, float scale)
  454. {
  455. int i;
  456. float x[3],y[3];
  457. float sinbank,cosbank;
  458. cosbank = cos(bank*3.14159/180.0);
  459. sinbank = sin(bank*3.14159/180.0);
  460. x[0] = -DEFAULT_X_SIZE * scale;
  461. y[0] = -DEFAULT_Y_SIZE * scale;
  462. x[1] = +DEFAULT_X_SIZE * scale;
  463. y[1] = -DEFAULT_Y_SIZE * scale;
  464. x[2] = +DEFAULT_X_SIZE * scale;
  465. y[2] = +DEFAULT_Y_SIZE * scale;
  466. for (i=0; i<3; i++) {
  467. verts[i].x = fl2f(x[i] * cosbank - y[i] * sinbank + CENTER_X);
  468. verts[i].y = fl2f(x[i] * sinbank + y[i] * cosbank + CENTER_Y);
  469. }
  470. }
  471. //##// --------------------------------------------------------------------------------------
  472. //##void test_rotate_bitmap(void)
  473. //##{
  474. //## static float bank = 0.0;
  475. //##
  476. //## grs_point verts[3];
  477. //##
  478. //## bank += 4.0;
  479. //##
  480. //## set_coords(verts, bank, 2*pow(sin(bank/40),2)+.8);
  481. //##
  482. //##// verts[0].x = 50 * F1_0;
  483. //##// verts[0].y = 50 * F1_0;
  484. //##//
  485. //##// verts[1].x = 150 * F1_0;
  486. //##// verts[1].y = 80 * F1_0;
  487. //##//
  488. //##// verts[2].x = 180 * F1_0;
  489. //##// verts[2].y = 120 * F1_0;
  490. //##
  491. //## rotate_bitmap(Texture[36],verts, 15);
  492. //##}
  493. #else
  494. void rotate_bitmap(grs_bitmap *bp, grs_point *vertbuf, int light_value)
  495. {
  496. bp = bp;
  497. vertbuf = vertbuf;
  498. light_value = light_value;
  499. Int3(); // ROLLER IS IFDEF'D OUT !!!!!!!
  500. }
  501. #endif // USE_ROLLER
  502.