gen_bigmap2.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485
  1. /* $Id: gen_bigmap2.c,v 1.3 2001/04/24 08:31:29 glop Exp $ */
  2. #include "client.h"
  3. #define OFFSET2(SX, X, Y) (((X) + (Y) * (SX)) * 4)
  4. #define IRD(SX, X,Y) (OFFSET2(SX, X, Y) + 0)
  5. #define IGR(SX, X,Y) (OFFSET2(SX, X, Y) + 1)
  6. #define IBL(SX, X,Y) (OFFSET2(SX, X, Y) + 2)
  7. #define MASK(SX, X,Y) (OFFSET2(SX, X, Y) + 3)
  8. #define OFFSET(X, Y) (OFFSET2(MAP_SIZE, X, Y))
  9. #define RED(X,Y) (OFFSET(X, Y) + 0)
  10. #define GREEN(X,Y) (OFFSET(X, Y) + 1)
  11. #define BLUE(X,Y) (OFFSET(X, Y) + 2)
  12. #define ID(X,Y) (OFFSET(X, Y) + 3)
  13. #define RED_COLOR(map, id) ((map)->players[(id)]->colors[2])
  14. #define GREEN_COLOR(map, id) ((map)->players[(id)]->colors[1])
  15. #define BLUE_COLOR(map, id) ((map)->players[(id)]->colors[0])
  16. #define CONV_X(map, X) (((X) * MAP_SIZE) / ((map)->sizex + 0.1))
  17. #define CONV_Y(map, Y) (((Y) * MAP_SIZE) / ((map)->sizey + 0.1))
  18. static void bm2_plot_point_ex(guchar *bigmap, guchar id, int x,
  19. int y, guchar r, guchar g, guchar b)
  20. {
  21. int temp;
  22. if (bigmap[ID(x, y)] == id)
  23. return;
  24. temp = bigmap[RED(x,y)] + r;
  25. if (temp > PULSE_SAT)
  26. temp = PULSE_SAT;
  27. bigmap[RED(x,y)] = temp;
  28. temp = bigmap[GREEN(x,y)] + g;
  29. if (temp > PULSE_SAT)
  30. temp = PULSE_SAT;
  31. bigmap[GREEN(x,y)] = temp;
  32. temp = bigmap[BLUE(x,y)] + b;
  33. if (temp > PULSE_SAT)
  34. temp = PULSE_SAT;
  35. bigmap[BLUE(x,y)] = temp;
  36. bigmap[ID(x, y)] = id;
  37. }
  38. static void bm2_plot_point(guchar *bigmap, int x, int y,
  39. guchar r, guchar g, guchar b)
  40. {
  41. int temp;
  42. if ((x < 0) || (x >= MAP_SIZE))
  43. return;
  44. if ((y < 0) || (y >= MAP_SIZE))
  45. return;
  46. temp = bigmap[RED(x,y)] + r;
  47. if (temp > 0xFF)
  48. temp = 0xFF;
  49. bigmap[RED(x,y)] = temp;
  50. temp = bigmap[GREEN(x,y)] + g;
  51. if (temp > 0xFF)
  52. temp = 0xFF;
  53. bigmap[GREEN(x,y)] = temp;
  54. temp = bigmap[BLUE(x,y)] + b;
  55. if (temp > 0xFF)
  56. temp = 0xFF;
  57. bigmap[BLUE(x,y)] = temp;
  58. }
  59. static void bm2_plot_line(guchar *bigmap, int x1, int y1, int x2, int y2,
  60. guchar r, guchar g, guchar b)
  61. {
  62. float a;
  63. int diffx, diffy;
  64. int x, y;
  65. diffx = x1 - x2;
  66. diffy = y1 - y2;
  67. if (!diffx && !diffy)
  68. bm2_plot_point(bigmap, x1, y2, r, g, b);
  69. else
  70. {
  71. if (ABS(diffx) > ABS(diffy))
  72. {
  73. a = (float)diffy / diffx;
  74. if (x1 > x2)
  75. {
  76. x = x2;
  77. x2 = x1;
  78. x1 = x;
  79. y = y1;
  80. y1 = y2;
  81. y2 = y;
  82. }
  83. else
  84. x = x1;
  85. while (x != x2)
  86. {
  87. bm2_plot_point(bigmap, x, y1 + (x - x1) * a, r, g, b);
  88. x++;
  89. }
  90. }
  91. else
  92. {
  93. a = (float)diffx / diffy;
  94. if (y1 > y2)
  95. {
  96. y = y2;
  97. y2 = y1;
  98. y1 = y;
  99. x = x1;
  100. x1 = x2;
  101. x2 = x;
  102. }
  103. else
  104. y = y1;
  105. while (y != y2)
  106. {
  107. bm2_plot_point(bigmap, x1 + (y - y1) * a, y, r, g, b);
  108. y++;
  109. }
  110. }
  111. }
  112. }
  113. static float bm2_rotate_x(float x, float y, float cs, float sn)
  114. {
  115. return cs * x + sn * y;
  116. }
  117. static float bm2_rotate_y(float x, float y, float cs, float sn)
  118. {
  119. return cs * y - sn * x;
  120. }
  121. static int bm2_distance(int x1, int y1, int x2, int y2)
  122. {
  123. return (SQR(x2 - x1) + SQR(y2 - y1));
  124. }
  125. static void bm2_plot_triangle(guchar *bigmap, guchar id,
  126. int x1, int y1, int x2, int y2, int x3, int y3,
  127. int dist, guchar cr, guchar cg, guchar cb)
  128. {
  129. int swap;
  130. float delta1, delta2, delta3;
  131. float xa, xb, txa, txb;
  132. int x, y, begy, endy;
  133. int memx = x1, memy = y1;
  134. int rac;
  135. if (y1 > y2)
  136. {
  137. swap = x1;
  138. x1 = x2;
  139. x2 = swap;
  140. swap = y1;
  141. y1 = y2;
  142. y2 = swap;
  143. }
  144. if (y1 > y3)
  145. {
  146. swap = x3;
  147. x3 = x1;
  148. x1 = swap;
  149. swap = y1;
  150. y1 = y3;
  151. y3 = swap;
  152. }
  153. if (y2 > y3)
  154. {
  155. swap = x3;
  156. x3 = x2;
  157. x2 = swap;
  158. swap = y3;
  159. y3 = y2;
  160. y2 = swap;
  161. }
  162. /* determination des coefficients directeurs */
  163. if (y1 != y3)
  164. delta1 = ((float)x1-x3)/(y1-y3);
  165. else
  166. delta1 = 0;
  167. if (y1 != y2)
  168. delta2 = ((float)x2-x1)/(y2-y1);
  169. else
  170. delta2 = 0;
  171. if (y2 != y3)
  172. delta3 = ((float)x3-x2)/(y3-y2);
  173. else
  174. delta3 = 0;
  175. /* PremiŠre partie du triangle ( tracage des section horizontale) */
  176. xa = x1;
  177. xb = x1;
  178. if (y1 != y2)
  179. {
  180. if (y1 < 0)
  181. {
  182. xa -= delta1 * y1;
  183. xb -= delta2 * y1;
  184. begy = 0;
  185. }
  186. else
  187. begy = y1;
  188. if (y2 > (MAP_SIZE-1))
  189. endy = MAP_SIZE-1;
  190. else
  191. endy = y2;
  192. if (delta1 < delta2)
  193. for (y = begy; y < endy; y++)
  194. {
  195. xa = xa + delta1;
  196. xb = xb + delta2;
  197. txa = MAX(0, xa);
  198. txb = MIN(MAP_SIZE-1, xb);
  199. rac = sqrt(dist - SQR(y - memy));
  200. txa = MAX(txa, memx - rac);
  201. txb = MIN(txb, memx + rac);
  202. for (x = txa; x < txb; x++)
  203. bm2_plot_point_ex(bigmap, id, x, y, cr, cg, cb);
  204. }
  205. else
  206. for (y = begy; y < endy; y++)
  207. {
  208. xa = xa + delta1;
  209. xb = xb + delta2;
  210. txb = MAX(0, xb);
  211. txa = MIN(MAP_SIZE-1, xa);
  212. rac = sqrt(dist - SQR(y - memy));
  213. txb = MAX(txb, memx - rac);
  214. txa = MIN(txa, memx + rac);
  215. for (x = txb; x < txa; x++)
  216. bm2_plot_point_ex(bigmap, id, x, y, cr, cg, cb);
  217. }
  218. xa = x1 + delta1 * (y2 - y1);
  219. xb = x1 + delta2 * (y2 - y1);
  220. }
  221. else
  222. xb = x2;
  223. /* Deuxieme partie du triangle ( tracage des section horizontale) */
  224. if (y2 != y3)
  225. {
  226. if (y2 < 0)
  227. {
  228. xa -= delta1 * y2;
  229. xb -= delta3 * y2;
  230. begy = 0;
  231. }
  232. else
  233. begy = y2;
  234. if (y3 > (MAP_SIZE-1))
  235. endy = MAP_SIZE-1;
  236. else
  237. endy = y3;
  238. if (delta3 < delta1)
  239. for (y = begy; y < endy; y++)
  240. {
  241. xa = xa + delta1;
  242. xb = xb + delta3;
  243. txa = MAX(0, xa);
  244. txb = MIN(MAP_SIZE-1, xb);
  245. rac = sqrt(dist - SQR(y - memy));
  246. txa = MAX(txa, memx - rac);
  247. txb = MIN(txb, memx + rac);
  248. for (x = txa; x < txb; x++)
  249. bm2_plot_point_ex(bigmap, id, x, y, cr, cg, cb);
  250. }
  251. else
  252. for (y = begy; y < endy; y++)
  253. {
  254. xa = xa + delta1;
  255. xb = xb + delta3;
  256. txb = MAX(0, xb);
  257. txa = MIN(MAP_SIZE-1, xa);
  258. rac = sqrt(dist - SQR(y - memy));
  259. txb = MAX(txb, memx - rac);
  260. txa = MIN(txa, memx + rac);
  261. for (x = txb; x < txa; x++)
  262. bm2_plot_point_ex(bigmap, id, x, y, cr, cg, cb);
  263. }
  264. }
  265. }
  266. static void bm2_plot_cone(guchar *bigmap, guchar id,
  267. float x1, float y1, float x2, float y2,
  268. float angle, guchar r, guchar g, guchar b)
  269. {
  270. float cs, sn, csi;
  271. float x, y, xc, xd, yc, yd;
  272. gboolean call_sub = FALSE;
  273. x = x2 - x1;
  274. y = y2 - y1;
  275. if (angle > M_PI_2)
  276. {
  277. call_sub = TRUE;
  278. angle /= 2;
  279. }
  280. cs = cos(angle / 2);
  281. sn = sin(angle / 2);
  282. xc = bm2_rotate_x(x, y, cs, sn);
  283. xd = bm2_rotate_x(x, y, cs, -sn);
  284. yc = bm2_rotate_y(x, y, cs, sn);
  285. yd = bm2_rotate_y(x, y, cs, -sn);
  286. if (call_sub)
  287. {
  288. bm2_plot_cone(bigmap, id, x1, y1, xc + x1, yc + y1, angle, r, g, b);
  289. bm2_plot_cone(bigmap, id, x1, y1, xd + x1, yd + y1, angle, r, g, b);
  290. return;
  291. }
  292. csi = 1 / cs;
  293. xc = xc * csi + x1;
  294. xd = xd * csi + x1;
  295. yc = yc * csi + y1;
  296. yd = yd * csi + y1;
  297. bm2_plot_triangle(bigmap, id, x1, y1, xc, yc, xd, yd,
  298. bm2_distance(x1, y1, x2, y2), r, g, b);
  299. }
  300. static void bm2_plot_object(const conf_t *conf, const obj_t *obj,
  301. guchar *bigmap, const guchar *colors)
  302. {
  303. int x, y;
  304. x = obj->posx * conf->big_zoom - conf->big_ofs_x;
  305. y = obj->posy * conf->big_zoom - conf->big_ofs_y;
  306. switch (obj->type)
  307. {
  308. case obj_akx :
  309. bm2_plot_point(bigmap, x+2, y, colors[2], colors[1],
  310. colors[0]);
  311. bm2_plot_point(bigmap, x-2, y, colors[2], colors[1],
  312. colors[0]);
  313. bm2_plot_point(bigmap, x, y+2, colors[2], colors[1],
  314. colors[0]);
  315. bm2_plot_point(bigmap, x, y-2, colors[2], colors[1],
  316. colors[0]);
  317. bm2_plot_point(bigmap, x+1, y+1, colors[2], colors[1],
  318. colors[0]);
  319. bm2_plot_point(bigmap, x-1, y+1, colors[2], colors[1],
  320. colors[0]);
  321. bm2_plot_point(bigmap, x+1, y-1, colors[2], colors[1],
  322. colors[0]);
  323. bm2_plot_point(bigmap, x-1, y-1, colors[2], colors[1],
  324. colors[0]);
  325. case obj_r4d2 :
  326. bm2_plot_point(bigmap, x+1, y, colors[2], colors[1],
  327. colors[0]);
  328. bm2_plot_point(bigmap, x, y+1, colors[2], colors[1],
  329. colors[0]);
  330. bm2_plot_point(bigmap, x, y, colors[2], colors[1],
  331. colors[0]);
  332. bm2_plot_point(bigmap, x-1, y, colors[2], colors[1],
  333. colors[0]);
  334. bm2_plot_point(bigmap, x, y-1, colors[2], colors[1],
  335. colors[0]);
  336. break;
  337. };
  338. }
  339. static void bm2_plot_akx_r4d2(const conf_t *conf, const obj_t *obj,
  340. guchar *bigmap)
  341. {
  342. int tid;
  343. tid = obj->team_id;
  344. if (tid > conf->map->nb_players)
  345. tid = 0;
  346. if ((tid == 0) && obj->type == obj_r4d2)
  347. return;
  348. bm2_plot_object(conf, obj, bigmap, conf->map->players[tid]->colors);
  349. }
  350. static void bm2_plot_pulse(guchar *bigmap, const conf_t *conf,
  351. const obj_t *obj, guchar *colors)
  352. {
  353. int x, y, x2, y2, id;
  354. id = obj->team_id;
  355. x = obj->posx * conf->big_zoom - conf->big_ofs_x;
  356. y = obj->posy * conf->big_zoom - conf->big_ofs_y;
  357. x2 = obj->tx * conf->big_zoom - conf->big_ofs_x;
  358. y2 = obj->ty * conf->big_zoom - conf->big_ofs_y;
  359. bm2_plot_cone(bigmap, (guchar)obj->id+1, x, y, x2, y2,
  360. obj->angle,
  361. conf->map->players[id]->colors[2] / DIVID_PULSE_MINI,
  362. conf->map->players[id]->colors[1] / DIVID_PULSE_MINI,
  363. conf->map->players[id]->colors[0] / DIVID_PULSE_MINI);
  364. }
  365. static void bm2_plot_link(guchar *bigmap, const conf_t *conf,
  366. const obj_t *obj, guchar *colors)
  367. {
  368. int x, y, x2, y2;
  369. x = obj->posx * conf->big_zoom - conf->big_ofs_x;
  370. y = obj->posy * conf->big_zoom - conf->big_ofs_y;
  371. x2 = conf->map->objects[obj->target]->posx *
  372. conf->big_zoom - conf->big_ofs_x;
  373. y2 = conf->map->objects[obj->target]->posy *
  374. conf->big_zoom - conf->big_ofs_y;
  375. bm2_plot_line(bigmap, x, y, x2, y2, colors[2], colors[1], colors[0]);
  376. }
  377. static void bm2_plot_pulse_link(const conf_t *conf, const obj_t *obj,
  378. guchar *bigmap)
  379. {
  380. int tid;
  381. tid = obj->team_id;
  382. if (tid > conf->map->nb_players)
  383. tid = 0;
  384. /* affichage pulse */
  385. if (obj->action == act_akx_pulse)
  386. bm2_plot_pulse(bigmap, conf, obj, conf->map->players[tid]->colors);
  387. /* affichage link */
  388. if (obj->action == act_akx_link)
  389. bm2_plot_link(bigmap, conf, obj, conf->map->players[tid]->colors);
  390. }
  391. guchar *gen_bigmap2(conf_t *conf, gboolean force)
  392. {
  393. int cpt;
  394. obj_t *obj;
  395. if (conf->screen == NULL)
  396. {
  397. conf->screen = g_malloc(4 * SQR(MAP_SIZE));
  398. bzero(conf->screen, 4 * SQR(MAP_SIZE));
  399. }
  400. if (!force)
  401. return conf->screen;
  402. if (conf->map == NULL)
  403. return conf->screen;
  404. bzero(conf->screen, 4 * SQR(MAP_SIZE));
  405. if (conf->big_pulse)
  406. for (cpt = 0; cpt < conf->map->nb_objects; cpt++)
  407. {
  408. obj = conf->map->objects[cpt];
  409. if (obj->type == obj_akx)
  410. bm2_plot_pulse_link(conf, obj, conf->screen);
  411. }
  412. for (cpt = 0; cpt < conf->map->nb_objects; cpt++)
  413. {
  414. obj = conf->map->objects[cpt];
  415. bm2_plot_akx_r4d2(conf, obj, conf->screen);
  416. }
  417. return conf->screen;
  418. }