gvld.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885
  1. /*!
  2. \file gvld.c
  3. \brief OGSF library - loading and manipulating volumes (lower level functions)
  4. GRASS OpenGL gsurf OGSF Library
  5. (C) 1999-2008 by the GRASS Development Team
  6. This program is free software under the
  7. GNU General Public License (>=v2).
  8. Read the file COPYING that comes with GRASS
  9. for details.
  10. \author Tomas Paudits (February 2004)
  11. \author Doxygenized by Martin Landa <landa.martin gmail.com> (May 2008)
  12. */
  13. #include <math.h>
  14. #include <grass/gis.h>
  15. #include <grass/gstypes.h>
  16. #include "mc33_table.h"
  17. /* usefull macros */
  18. #define READ() gvl_read_char(pos[i]++, gvl->isosurf[i]->data)
  19. /*!
  20. \brief Draw volume set (slices and isosurfaces)
  21. \param gvl pointer to geovol struct
  22. \return -1 on failure
  23. \return 1 on success
  24. */
  25. int gvld_vol(geovol *gvl)
  26. {
  27. G_debug(5, "gvld_vol(): id=%d", gvl->gvol_id);
  28. /* SLICES */
  29. /* calculate slices data, if slices changed */
  30. if (0 > gvl_slices_calc(gvl))
  31. return (-1);
  32. /* draw slices */
  33. if (0 > gvld_slices(gvl))
  34. return (-1);
  35. /* ISOSURFACES */
  36. /* calculate isosurfaces data, if isosurfaces changed */
  37. if (0 > gvl_isosurf_calc(gvl))
  38. return (-1);
  39. /* draw isosurfaces */
  40. if (0 > gvld_isosurf(gvl))
  41. return (-1);
  42. return (1);
  43. }
  44. /*!
  45. \brief Draw volume in wire mode (bounding box)
  46. \param gvl pointer to geovol struct
  47. \return -1 on failure
  48. \return 1 on success
  49. */
  50. int gvld_wire_vol(geovol * gvl)
  51. {
  52. G_debug(5, "gvld_vol(): id=%d", gvl->gvol_id);
  53. gvld_wind3_box(gvl);
  54. if (0 > gvld_wire_slices(gvl))
  55. return (-1);
  56. if (0 > gvld_wire_isosurf(gvl))
  57. return (-1);
  58. return (1);
  59. }
  60. /*!
  61. \brief Draw volume isosurfaces
  62. \param gvl pointer to geovol struct
  63. \return -1 on failure
  64. \return 1 on success
  65. */
  66. int gvld_isosurf(geovol * gvl)
  67. {
  68. float tx, ty, tz;
  69. int cols, rows, depths;
  70. int x, y, z, i, iv;
  71. float xc, yc, zc;
  72. float xres, yres, zres;
  73. int j, p, num, c_ndx, crnt_ev;
  74. float n[3], pt[4];
  75. int n_i = gvl->n_isosurfs;
  76. int *check_color, *check_transp, *check_material, *check_emis,
  77. *check_shin;
  78. float *kem, *ksh, pkem, pksh;
  79. unsigned int *ktrans, *curcolor;
  80. int pktransp = 0;
  81. int *pos, *nz, *e_dl, tmp_pos, edge_pos[12];
  82. GLdouble modelMatrix[16], projMatrix[16];
  83. GLint viewport[4];
  84. GLint window[4];
  85. geovol_isosurf *isosurf;
  86. /* Allocate memory for arrays */
  87. check_color = G_malloc(n_i * sizeof(int));
  88. check_transp = G_malloc(n_i * sizeof(int));
  89. check_material = G_malloc(n_i * sizeof(int));
  90. check_emis = G_malloc(n_i * sizeof(int));
  91. check_shin = G_malloc(n_i * sizeof(int));
  92. kem = G_malloc(n_i * sizeof(float));
  93. ksh = G_malloc(n_i * sizeof(float));
  94. ktrans = G_malloc(n_i * sizeof(unsigned int));
  95. curcolor = G_malloc(n_i * sizeof(unsigned int));
  96. pos = G_malloc(n_i * sizeof(int));
  97. nz = G_malloc(n_i * sizeof(int));
  98. e_dl = G_malloc(n_i * sizeof(int));
  99. G_debug(5, "gvld_isosurf():");
  100. for (i = 0; i < gvl->n_isosurfs; i++) {
  101. G_debug(5, " start : gvl: %s isosurf : %d\n",
  102. gvl_file_get_name(gvl->hfile), i);
  103. }
  104. /* shade */
  105. gsd_shademodel(gvl->isosurf_draw_mode & DM_GOURAUD);
  106. /* scaling */
  107. GS_get_scale(&tx, &ty, &tz, 1);
  108. /* set number of cols, rows, dephs */
  109. cols = gvl->cols / gvl->isosurf_x_mod;
  110. rows = gvl->rows / gvl->isosurf_y_mod;
  111. depths = gvl->depths / gvl->isosurf_z_mod;
  112. /* set x,y,z resolution */
  113. xres =
  114. /*((float) gvl->cols) / ((float) cols) */ gvl->isosurf_x_mod *
  115. gvl->xres;
  116. yres =
  117. /*((float) gvl->rows) / ((float) rows) */ gvl->isosurf_y_mod *
  118. gvl->yres;
  119. zres =
  120. /*((float) gvl->depths) / ((float) depths) */ gvl->isosurf_z_mod *
  121. gvl->zres;
  122. /* get viewport */
  123. gsd_getwindow(window, viewport, modelMatrix, projMatrix);
  124. /* adjust window */
  125. window[0] += (int)(yres * 2);
  126. window[1] -= (int)(yres * 2);
  127. window[2] -= (int)(xres * 2);
  128. window[3] += (int)(xres * 2);
  129. gsd_colormode(CM_DIFFUSE);
  130. gsd_pushmatrix();
  131. gsd_do_scale(1);
  132. gsd_translate(gvl->x_trans, gvl->y_trans, gvl->z_trans);
  133. pkem = 1.0;
  134. pksh = 1.0;
  135. /* set default attribute values for isosurfaces */
  136. for (i = 0; i < gvl->n_isosurfs; i++) {
  137. isosurf = gvl->isosurf[i];
  138. /* init isosurf one cube edge datalength */
  139. e_dl[i] = 4;
  140. /* transparency */
  141. check_transp[i] = 0;
  142. ktrans[i] = (255 << 24);
  143. if (CONST_ATT == isosurf->att[ATT_TRANSP].att_src &&
  144. isosurf->att[ATT_TRANSP].constant != 0.0) {
  145. ktrans[i] = (255 - (int)isosurf->att[ATT_TRANSP].constant) << 24;
  146. }
  147. else if (MAP_ATT == isosurf->att[ATT_TRANSP].att_src) {
  148. check_transp[i] = 1;
  149. e_dl[i]++;
  150. }
  151. /* emis */
  152. check_emis[i] = 0;
  153. kem[i] = 0.0;
  154. if (CONST_ATT == isosurf->att[ATT_EMIT].att_src) {
  155. kem[i] = isosurf->att[ATT_EMIT].constant / 255.;
  156. }
  157. else if (MAP_ATT == isosurf->att[ATT_EMIT].att_src) {
  158. check_emis[i] = 1;
  159. e_dl[i]++;
  160. }
  161. /* shin */
  162. check_shin[i] = 0;
  163. ksh[i] = 0.0;
  164. if (CONST_ATT == isosurf->att[ATT_SHINE].att_src) {
  165. ksh[i] = isosurf->att[ATT_SHINE].constant / 255.;
  166. }
  167. else if (MAP_ATT == isosurf->att[ATT_SHINE].att_src) {
  168. check_shin[i] = 1;
  169. e_dl[i]++;
  170. }
  171. /* color */
  172. check_color[i] = 0;
  173. curcolor[i] = 0.0;
  174. if (CONST_ATT == isosurf->att[ATT_COLOR].att_src) {
  175. curcolor[i] = (int)isosurf->att[ATT_COLOR].constant;
  176. }
  177. else if (MAP_ATT == isosurf->att[ATT_COLOR].att_src) {
  178. check_color[i] = 1;
  179. e_dl[i] += 3;
  180. }
  181. /* check material */
  182. check_material[i] = (check_shin[i] || check_emis[i] ||
  183. (kem[i] && check_color[i]));
  184. /* set position in data */
  185. pos[i] = 0;
  186. nz[i] = 0;
  187. }
  188. G_debug(5, " intialize OK");
  189. for (z = 0; z < depths - 1; z++) {
  190. zc = z * zres;
  191. if (GS_check_cancel()) {
  192. for (i = 0; i < gvl->n_isosurfs; i++) {
  193. G_debug(5, " break : isosurf : %d datalength : %d B\n",
  194. i, pos[i]);
  195. }
  196. gsd_set_material(1, 1, 0., 0., 0x0);
  197. gsd_popmatrix();
  198. gsd_blend(0);
  199. gsd_zwritemask(0xffffffff);
  200. return (-1);
  201. }
  202. for (y = 0; y < rows - 1; y++) {
  203. yc = ((rows - 1) * yres) - (y * yres);
  204. for (x = 0; x < cols - 1; x++) {
  205. xc = x * xres;
  206. for (i = 0; i < gvl->n_isosurfs; i++) {
  207. /* read cube index */
  208. if (nz[i] != 0) {
  209. nz[i]--;
  210. continue;
  211. }
  212. else {
  213. c_ndx = READ();
  214. if (c_ndx == 0) {
  215. nz[i] = READ() - 1;
  216. continue;
  217. }
  218. else {
  219. c_ndx = (c_ndx - 1) * 256 + READ();
  220. }
  221. }
  222. /* save position */
  223. tmp_pos = pos[i];
  224. /* set position for each cube edge data */
  225. iv = 0;
  226. for (j = 0; j < cell_table[c_ndx].nedges; j++) {
  227. if (cell_table[c_ndx].edges[j] == 12)
  228. iv = 1;
  229. edge_pos[cell_table[c_ndx].edges[j]] =
  230. pos[i] + j * e_dl[i];
  231. }
  232. /* enable/disable blending and depth buffer writing */
  233. if (check_transp[i] || (ktrans[i] >> 24) < 255) {
  234. if (!pktransp) {
  235. gsd_blend(1);
  236. gsd_zwritemask(0);
  237. }
  238. }
  239. else if (pktransp) {
  240. gsd_blend(0);
  241. gsd_zwritemask(0xffffffff);
  242. pktransp = 0;
  243. }
  244. /* draw cube polygons */
  245. for (p = 0, num = 0; num < cell_table[c_ndx].npolys;
  246. num++) {
  247. gsd_bgnpolygon();
  248. for (j = 0; j < 3; j++) {
  249. crnt_ev = cell_table[c_ndx].polys[p];
  250. /* set position in data to current edge data */
  251. pos[i] = edge_pos[crnt_ev];
  252. /* triagle vertex */
  253. if (crnt_ev == 12) {
  254. pt[X] = xc + (READ() / 255. * xres);
  255. pt[Y] = yc + (-(READ() / 255. * yres));
  256. pt[Z] = zc + (READ() / 255. * zres);
  257. }
  258. else {
  259. pt[edge_vert_pos[crnt_ev][0]] = READ() / 255.;
  260. pt[edge_vert_pos[crnt_ev][1]] =
  261. edge_vert_pos[crnt_ev][2];
  262. pt[edge_vert_pos[crnt_ev][3]] =
  263. edge_vert_pos[crnt_ev][4];
  264. pt[X] = xc + (pt[X] * xres);
  265. pt[Y] = yc + (-(pt[Y] * yres));
  266. pt[Z] = zc + (pt[Z] * zres);
  267. }
  268. n[X] = (READ() / 127. - 1.) / xres;
  269. n[Y] = (-(READ() / 127. - 1.)) / yres;
  270. n[Z] = (READ() / 127. - 1.) / zres;
  271. if (gvl->isosurf[i]->inout_mode) {
  272. n[X] *= -1;
  273. n[Y] *= -1;
  274. n[Z] *= -1;
  275. }
  276. if (check_color[i])
  277. curcolor[i] =
  278. (READ() & 0xff) | ((READ() & 0xff) << 8) |
  279. ((READ() & 0xff) << 16);
  280. if (check_transp[i])
  281. ktrans[i] = READ() << 24;;
  282. if (check_shin[i])
  283. ksh[i] = ((float)READ()) / 255.;
  284. if (check_emis[i])
  285. kem[i] = ((float)READ()) / 255.;
  286. if (pksh != ksh[i] || pkem != kem[i] ||
  287. (kem[i] && check_color[i])) {
  288. pksh = ksh[i];
  289. pkem = kem[i];
  290. gsd_set_material(1, 1, ksh[i], kem[i],
  291. (int)curcolor);
  292. }
  293. gsd_litvert_func(n, ktrans[i] | curcolor[i], pt);
  294. p++;
  295. }
  296. gsd_endpolygon();
  297. }
  298. /* set position to next cube */
  299. pos[i] =
  300. tmp_pos + cell_table[c_ndx].nedges * e_dl[i] +
  301. (iv ? 2 : 0);
  302. }
  303. }
  304. }
  305. }
  306. for (i = 0; i < gvl->n_isosurfs; i++) {
  307. G_debug(5, " end : isosurf : %d datalength : %d B\n", i, pos[i]);
  308. }
  309. gsd_set_material(1, 1, 0., 0., 0x0);
  310. gsd_popmatrix();
  311. gsd_blend(0);
  312. gsd_zwritemask(0xffffffff);
  313. return (0);
  314. }
  315. /*!
  316. \brief Draw volume isosurface in draw mode
  317. \param gvl pointer to geovol struct
  318. \return 0
  319. */
  320. int gvld_wire_isosurf(geovol * gvl)
  321. {
  322. return (0);
  323. }
  324. /************************************************************************/
  325. /* SLICES */
  326. /************************************************************************/
  327. #define DISTANCE_2(x1, y1, x2, y2) sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))
  328. /*!
  329. \brief Draw slices
  330. \param gvl pointer to geovol struct
  331. \return 0
  332. */
  333. int gvld_slices(geovol * gvl)
  334. {
  335. float tx, ty, tz;
  336. int i;
  337. GLdouble modelMatrix[16], projMatrix[16];
  338. GLint viewport[4];
  339. GLint window[4];
  340. G_debug(5, "gvld_slices");
  341. /* shade */
  342. gsd_shademodel(gvl->slice_draw_mode & DM_GOURAUD);
  343. /* scaling */
  344. GS_get_scale(&tx, &ty, &tz, 1);
  345. /* get viewport */
  346. gsd_getwindow(window, viewport, modelMatrix, projMatrix);
  347. gsd_colormode(CM_COLOR);
  348. gsd_pushmatrix();
  349. gsd_do_scale(1);
  350. gsd_translate(gvl->x_trans, gvl->y_trans, gvl->z_trans);
  351. for (i = 0; i < gvl->n_slices; i++) {
  352. gsd_blend(0);
  353. gsd_zwritemask(0xffffffff);
  354. if (gvl->slice[i]->transp == 0)
  355. gvld_slice(gvl, i);
  356. }
  357. for (i = 0; i < gvl->n_slices; i++) {
  358. gsd_blend(1);
  359. gsd_zwritemask(0x0);
  360. if (gvl->slice[i]->transp > 0)
  361. gvld_slice(gvl, i);
  362. }
  363. gsd_set_material(1, 1, 0., 0., 0x0);
  364. gsd_popmatrix();
  365. gsd_blend(0);
  366. gsd_zwritemask(0xffffffff);
  367. return (0);
  368. }
  369. /*!
  370. \brief Draw slice
  371. \param gvl pointer to geovol struct
  372. \param ndx
  373. \return 1
  374. */
  375. int gvld_slice(geovol * gvl, int ndx)
  376. {
  377. geovol_slice *slice;
  378. int color, offset, transp;
  379. float n[3], pt[4];
  380. float x, nextx, y, nexty, z, stepx, stepy, stepz;
  381. int cols, rows, c, r;
  382. float f_cols, f_rows, distxy, distz, modx, mody, modz, modxy;
  383. int ptX, ptY, ptZ, resx, resy, resz;
  384. /* current slice */
  385. slice = gvl->slice[ndx];
  386. /* distance between slice def. pts */
  387. distxy = DISTANCE_2(slice->x2, slice->y2, slice->x1, slice->y1);
  388. distz = fabsf(slice->z2 - slice->z1);
  389. /* distance between slice def pts is zero - zero slice */
  390. if (distxy == 0. || distz == 0.) {
  391. return (1);
  392. }
  393. /* set slice mod, resolution and set correct coords */
  394. if (slice->dir == X) {
  395. modx = gvl->slice_y_mod;
  396. mody = gvl->slice_z_mod;
  397. modz = gvl->slice_x_mod;
  398. resx = gvl->yres;
  399. resy = gvl->zres;
  400. resz = gvl->xres;
  401. ptX = Y;
  402. ptY = Z;
  403. ptZ = X;
  404. }
  405. else if (slice->dir == Y) {
  406. modx = gvl->slice_x_mod;
  407. mody = gvl->slice_z_mod;
  408. modz = gvl->slice_y_mod;
  409. resx = gvl->xres;
  410. resy = gvl->zres;
  411. resz = gvl->yres;
  412. ptX = X;
  413. ptY = Z;
  414. ptZ = Y;
  415. }
  416. else {
  417. modx = gvl->slice_x_mod;
  418. mody = gvl->slice_y_mod;
  419. modz = gvl->slice_z_mod;
  420. resx = gvl->xres;
  421. resy = gvl->yres;
  422. resz = gvl->zres;
  423. ptX = X;
  424. ptY = Y;
  425. ptZ = Z;
  426. }
  427. /* x,y mod */
  428. modxy =
  429. DISTANCE_2((slice->x2 - slice->x1) / distxy * modx,
  430. (slice->y2 - slice->y1) / distxy * mody, 0., 0.);
  431. /* cols/rows of slice */
  432. f_cols = distxy / modxy;
  433. cols = f_cols > (int)f_cols ? (int)f_cols + 1 : (int)f_cols;
  434. f_rows = distz / modz;
  435. rows = f_rows > (int)f_rows ? (int)f_rows + 1 : (int)f_rows;
  436. /* step in x,y for each row of slice */
  437. stepx = (slice->x2 - slice->x1) / f_cols;
  438. stepy = (slice->y2 - slice->y1) / f_cols;
  439. stepz = (slice->z2 - slice->z1) / f_rows;
  440. /* set x,y intially to first slice pt */
  441. x = (slice->x1);
  442. y = (slice->y1);
  443. /* set next draw pt */
  444. if (f_cols < 1.) {
  445. nextx = x + stepx * f_cols;
  446. nexty = y + stepy * f_cols;
  447. }
  448. else {
  449. nextx = x + stepx;
  450. nexty = y + stepy;
  451. }
  452. /* set transparency */
  453. if (slice->transp > 0) {
  454. transp = (255 - slice->transp) << 24;
  455. }
  456. else {
  457. transp = 0x0;
  458. }
  459. /* loop in slice cols */
  460. for (c = 0; c < cols; c++) {
  461. /* set z to slice z1 pt */
  462. z = slice->z1;
  463. /* begin draw one row - triangle strip */
  464. gsd_bgntmesh();
  465. /* loop in slice rows */
  466. for (r = 0; r < rows + 1; r++) {
  467. /* offset to data - 1. column */
  468. offset = (c + 1) * (rows + 1) * 3 + r * 3;
  469. /* get color from slice data */
  470. color = (slice->data[offset] & 0xff) |
  471. ((slice->data[offset + 1] & 0xff) << 8) |
  472. ((slice->data[offset + 2] & 0xff) << 16);
  473. /* triagle vertices */
  474. pt[ptX] = nextx * resx;
  475. pt[ptY] = nexty * resy;
  476. pt[ptZ] = z * resz;
  477. pt[Y] = (gvl->rows - 1) * gvl->yres - pt[Y];
  478. gsd_litvert_func(n, (unsigned int)transp | color, pt);
  479. /* offset to data - 2. column */
  480. offset = c * (rows + 1) * 3 + r * 3;
  481. /* get color from slice data */
  482. color = (slice->data[offset] & 0xff) |
  483. ((slice->data[offset + 1] & 0xff) << 8) |
  484. ((slice->data[offset + 2] & 0xff) << 16);
  485. /* set triangle vertices */
  486. pt[ptX] = x * resx;
  487. pt[ptY] = y * resy;
  488. pt[ptZ] = z * resz;
  489. pt[Y] = (gvl->rows - 1) * gvl->yres - pt[Y];
  490. gsd_litvert_func(n, (unsigned int)transp | color, pt);
  491. if (r + 1 > f_rows) {
  492. z += stepz * (f_rows - (float)r);
  493. }
  494. else {
  495. z += stepz;
  496. }
  497. }
  498. gsd_endtmesh();
  499. /* step */
  500. if (c + 2 > f_cols) {
  501. x += stepx;
  502. nextx += stepx * (f_cols - (float)(c + 1));
  503. y += stepy;
  504. nexty += stepy * (f_cols - (float)(c + 1));
  505. }
  506. else {
  507. x += stepx;
  508. nextx += stepx;
  509. y += stepy;
  510. nexty += stepy;
  511. }
  512. }
  513. gsd_blend(0);
  514. gsd_zwritemask(0xffffffff);
  515. return (1);
  516. }
  517. /*!
  518. \brief Draw wire slices
  519. \param gvl pointer to geovol struct
  520. \return 0
  521. */
  522. int gvld_wire_slices(geovol * gvl)
  523. {
  524. float pt[3];
  525. int i;
  526. int ptX, ptY, ptZ, resx, resy, resz;
  527. geovol_slice *slice;
  528. G_debug(5, "gvld_wire_slices");
  529. gsd_pushmatrix();
  530. /* shading */
  531. gsd_shademodel(DM_FLAT);
  532. /* set color mode */
  533. gsd_colormode(CM_COLOR);
  534. /* do scale and set volume position */
  535. gsd_do_scale(1);
  536. gsd_translate(gvl->x_trans, gvl->y_trans, gvl->z_trans);
  537. /* set color and line width */
  538. gsd_color_func(0x0);
  539. gsd_linewidth(1);
  540. /* loop in slices */
  541. for (i = 0; i < gvl->n_slices; i++) {
  542. slice = gvl->slice[i];
  543. /* intialize correct coords */
  544. if (slice->dir == X) {
  545. resx = gvl->yres;
  546. resy = gvl->zres;
  547. resz = gvl->xres;
  548. ptX = Y;
  549. ptY = Z;
  550. ptZ = X;
  551. }
  552. else if (slice->dir == Y) {
  553. resx = gvl->xres;
  554. resy = gvl->zres;
  555. resz = gvl->yres;
  556. ptX = X;
  557. ptY = Z;
  558. ptZ = Y;
  559. }
  560. else {
  561. resx = gvl->xres;
  562. resy = gvl->yres;
  563. resz = gvl->zres;
  564. ptX = X;
  565. ptY = Y;
  566. ptZ = Z;
  567. }
  568. gsd_bgnline();
  569. /* first slice edge */
  570. pt[ptX] = slice->x1 * resx;
  571. pt[ptY] = slice->y1 * resy;
  572. pt[ptZ] = slice->z1 * resz;;
  573. pt[Y] = (gvl->rows - 1) * gvl->yres - pt[Y];
  574. gsd_vert_func(pt);
  575. pt[ptX] = slice->x1 * resx;
  576. pt[ptY] = slice->y1 * resy;
  577. pt[ptZ] = slice->z2 * resz;;
  578. pt[Y] = (gvl->rows - 1) * gvl->yres - pt[Y];
  579. gsd_vert_func(pt);
  580. pt[ptX] = slice->x2 * resx;
  581. pt[ptY] = slice->y2 * resy;
  582. pt[ptZ] = slice->z2 * resz;;
  583. pt[Y] = (gvl->rows - 1) * gvl->yres - pt[Y];
  584. gsd_vert_func(pt);
  585. pt[ptX] = slice->x2 * resx;
  586. pt[ptY] = slice->y2 * resy;
  587. pt[ptZ] = slice->z1 * resz;;
  588. pt[Y] = (gvl->rows - 1) * gvl->yres - pt[Y];
  589. gsd_vert_func(pt);
  590. pt[ptX] = slice->x1 * resx;
  591. pt[ptY] = slice->y1 * resy;
  592. pt[ptZ] = slice->z1 * resz;;
  593. pt[Y] = (gvl->rows - 1) * gvl->yres - pt[Y];
  594. gsd_vert_func(pt);
  595. gsd_endline();
  596. }
  597. gsd_set_material(1, 1, 0., 0., 0x0);
  598. gsd_popmatrix();
  599. return (0);
  600. }
  601. /*!
  602. \brief Draw volume bounding box
  603. \param gvl pointer to geovol struct
  604. \return 0
  605. */
  606. int gvld_wind3_box(geovol * gvl)
  607. {
  608. float pt[3];
  609. G_debug(5, "gvld_wind3_box(): id=%d", gvl->gvol_id);
  610. gsd_pushmatrix();
  611. /* shading */
  612. gsd_shademodel(DM_FLAT);
  613. /* set color mode */
  614. gsd_colormode(CM_COLOR);
  615. /* do scale and set volume position */
  616. gsd_do_scale(1);
  617. gsd_translate(gvl->x_trans, gvl->y_trans, gvl->z_trans);
  618. /* set color and line width */
  619. gsd_color_func(0x0);
  620. gsd_linewidth(1);
  621. /* draw box */
  622. /* front edges */
  623. gsd_bgnline();
  624. pt[X] = 0;
  625. pt[Y] = 0;
  626. pt[Z] = 0;
  627. gsd_vert_func(pt);
  628. pt[X] = (gvl->cols - 1) * gvl->xres;
  629. pt[Y] = 0;
  630. pt[Z] = 0;
  631. gsd_vert_func(pt);
  632. pt[X] = (gvl->cols - 1) * gvl->xres;
  633. pt[Y] = (gvl->rows - 1) * gvl->yres;
  634. pt[Z] = 0;
  635. gsd_vert_func(pt);
  636. pt[X] = 0;
  637. pt[Y] = (gvl->rows - 1) * gvl->yres;
  638. pt[Z] = 0;
  639. gsd_vert_func(pt);
  640. pt[X] = 0;
  641. pt[Y] = 0;
  642. pt[Z] = 0;
  643. gsd_vert_func(pt);
  644. gsd_endline();
  645. /* back edges */
  646. gsd_bgnline();
  647. pt[X] = 0;
  648. pt[Y] = 0;
  649. pt[Z] = (gvl->depths - 1) * gvl->zres;
  650. gsd_vert_func(pt);
  651. pt[X] = (gvl->cols - 1) * gvl->xres;
  652. pt[Y] = 0;
  653. pt[Z] = (gvl->depths - 1) * gvl->zres;
  654. gsd_vert_func(pt);
  655. pt[X] = (gvl->cols - 1) * gvl->xres;
  656. pt[Y] = (gvl->rows - 1) * gvl->yres;
  657. pt[Z] = (gvl->depths - 1) * gvl->zres;
  658. gsd_vert_func(pt);
  659. pt[X] = 0;
  660. pt[Y] = (gvl->rows - 1) * gvl->yres;
  661. pt[Z] = (gvl->depths - 1) * gvl->zres;
  662. gsd_vert_func(pt);
  663. pt[X] = 0;
  664. pt[Y] = 0;
  665. pt[Z] = (gvl->depths - 1) * gvl->zres;
  666. gsd_vert_func(pt);
  667. gsd_endline();
  668. /* others edges */
  669. gsd_bgnline();
  670. pt[X] = 0;
  671. pt[Y] = 0;
  672. pt[Z] = 0;
  673. gsd_vert_func(pt);
  674. pt[X] = 0;
  675. pt[Y] = 0;
  676. pt[Z] = (gvl->depths - 1) * gvl->zres;
  677. gsd_vert_func(pt);
  678. gsd_endline();
  679. gsd_bgnline();
  680. pt[X] = (gvl->cols - 1) * gvl->xres;
  681. pt[Y] = 0;
  682. pt[Z] = 0;
  683. gsd_vert_func(pt);
  684. pt[X] = (gvl->cols - 1) * gvl->xres;
  685. pt[Y] = 0;
  686. pt[Z] = (gvl->depths - 1) * gvl->zres;
  687. gsd_vert_func(pt);
  688. gsd_endline();
  689. gsd_bgnline();
  690. pt[X] = 0;
  691. pt[Y] = (gvl->rows - 1) * gvl->yres;
  692. pt[Z] = 0;
  693. gsd_vert_func(pt);
  694. pt[X] = 0;
  695. pt[Y] = (gvl->rows - 1) * gvl->yres;
  696. pt[Z] = (gvl->depths - 1) * gvl->zres;
  697. gsd_vert_func(pt);
  698. gsd_endline();
  699. gsd_bgnline();
  700. pt[X] = (gvl->cols - 1) * gvl->xres;
  701. pt[Y] = (gvl->rows - 1) * gvl->yres;
  702. pt[Z] = 0;
  703. gsd_vert_func(pt);
  704. pt[X] = (gvl->cols - 1) * gvl->xres;
  705. pt[Y] = (gvl->rows - 1) * gvl->yres;
  706. pt[Z] = (gvl->depths - 1) * gvl->zres;
  707. gsd_vert_func(pt);
  708. gsd_endline();
  709. gsd_popmatrix();
  710. return (0);
  711. }