GRASS Programmer's Manual  6.5.svn(2012)-r51648
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Defines
gvld.c
Go to the documentation of this file.
00001 
00019 #include <math.h>
00020 
00021 #include <grass/gis.h>
00022 #include <grass/gstypes.h>
00023 
00024 #include "mc33_table.h"
00025 
00026 /* usefull macros */
00027 #define READ() gvl_read_char(pos[i]++, gvl->isosurf[i]->data)
00028 
00037 int gvld_vol(geovol *gvl)
00038 {
00039     G_debug(5, "gvld_vol(): id=%d", gvl->gvol_id);
00040 
00041     /* SLICES */
00042     /* calculate slices data, if slices changed */
00043     if (0 > gvl_slices_calc(gvl))
00044         return (-1);
00045     /* draw slices */
00046     if (0 > gvld_slices(gvl))
00047         return (-1);
00048 
00049     /* ISOSURFACES */
00050     /* calculate isosurfaces data, if isosurfaces changed */
00051     if (0 > gvl_isosurf_calc(gvl))
00052         return (-1);
00053     /* draw isosurfaces */
00054     if (0 > gvld_isosurf(gvl))
00055         return (-1);
00056 
00057     return (1);
00058 }
00059 
00068 int gvld_wire_vol(geovol * gvl)
00069 {
00070     G_debug(5, "gvld_vol(): id=%d", gvl->gvol_id);
00071 
00072     gvld_wind3_box(gvl);
00073 
00074     if (0 > gvld_wire_slices(gvl))
00075         return (-1);
00076 
00077     if (0 > gvld_wire_isosurf(gvl))
00078         return (-1);
00079 
00080     return (1);
00081 }
00082 
00091 int gvld_isosurf(geovol * gvl)
00092 {
00093     float tx, ty, tz;
00094     int cols, rows, depths;
00095     int x, y, z, i, iv;
00096     float xc, yc, zc;
00097     float xres, yres, zres;
00098 
00099     int j, p, num, c_ndx, crnt_ev;
00100     float n[3], pt[4];
00101 
00102     int n_i = gvl->n_isosurfs;
00103 
00104     int *check_color, *check_transp, *check_material, *check_emis,
00105         *check_shin;
00106     float *kem, *ksh, pkem, pksh;
00107     unsigned int *ktrans, *curcolor;
00108     int pktransp = 0;
00109 
00110     int *pos, *nz, *e_dl, tmp_pos, edge_pos[12];
00111 
00112     GLdouble modelMatrix[16], projMatrix[16];
00113     GLint viewport[4];
00114     GLint window[4];
00115 
00116     geovol_isosurf *isosurf;
00117 
00118     /* Allocate memory for arrays */
00119 
00120     check_color = G_malloc(n_i * sizeof(int));
00121     check_transp = G_malloc(n_i * sizeof(int));
00122     check_material = G_malloc(n_i * sizeof(int));
00123     check_emis = G_malloc(n_i * sizeof(int));
00124     check_shin = G_malloc(n_i * sizeof(int));
00125 
00126     kem = G_malloc(n_i * sizeof(float));
00127     ksh = G_malloc(n_i * sizeof(float));
00128 
00129     ktrans = G_malloc(n_i * sizeof(unsigned int));
00130     curcolor = G_malloc(n_i * sizeof(unsigned int));
00131 
00132     pos = G_malloc(n_i * sizeof(int));
00133     nz = G_malloc(n_i * sizeof(int));
00134     e_dl = G_malloc(n_i * sizeof(int));
00135 
00136     G_debug(5, "gvld_isosurf():");
00137     for (i = 0; i < gvl->n_isosurfs; i++) {
00138         G_debug(5, "  start : gvl: %s isosurf : %d\n",
00139                 gvl_file_get_name(gvl->hfile), i);
00140     }
00141 
00142     /* shade */
00143     gsd_shademodel(gvl->isosurf_draw_mode & DM_GOURAUD);
00144 
00145     /* scaling */
00146     GS_get_scale(&tx, &ty, &tz, 1);
00147 
00148     /* set number of cols, rows, dephs */
00149     cols = gvl->cols / gvl->isosurf_x_mod;
00150     rows = gvl->rows / gvl->isosurf_y_mod;
00151     depths = gvl->depths / gvl->isosurf_z_mod;
00152 
00153     /* set x,y,z resolution */
00154     xres =
00155         /*((float) gvl->cols) / ((float) cols) */ gvl->isosurf_x_mod *
00156         gvl->xres;
00157     yres =
00158         /*((float) gvl->rows) / ((float) rows) */ gvl->isosurf_y_mod *
00159         gvl->yres;
00160     zres =
00161         /*((float) gvl->depths) / ((float) depths) */ gvl->isosurf_z_mod *
00162         gvl->zres;
00163 
00164     /* get viewport */
00165     gsd_getwindow(window, viewport, modelMatrix, projMatrix);
00166 
00167     /* adjust window */
00168     window[0] += (int)(yres * 2);
00169     window[1] -= (int)(yres * 2);
00170     window[2] -= (int)(xres * 2);
00171     window[3] += (int)(xres * 2);
00172 
00173     gsd_colormode(CM_DIFFUSE);
00174     gsd_pushmatrix();
00175     gsd_do_scale(1);
00176     gsd_translate(gvl->x_trans, gvl->y_trans, gvl->z_trans);
00177 
00178     pkem = 1.0;
00179     pksh = 1.0;
00180 
00181     /* set default attribute values for isosurfaces */
00182     for (i = 0; i < gvl->n_isosurfs; i++) {
00183         isosurf = gvl->isosurf[i];
00184 
00185         /* init isosurf one cube edge datalength */
00186         e_dl[i] = 4;
00187 
00188         /* transparency */
00189         check_transp[i] = 0;
00190         ktrans[i] = (255 << 24);
00191         if (CONST_ATT == isosurf->att[ATT_TRANSP].att_src &&
00192             isosurf->att[ATT_TRANSP].constant != 0.0) {
00193             ktrans[i] = (255 - (int)isosurf->att[ATT_TRANSP].constant) << 24;
00194         }
00195         else if (MAP_ATT == isosurf->att[ATT_TRANSP].att_src) {
00196             check_transp[i] = 1;
00197             e_dl[i]++;
00198         }
00199 
00200         /* emis */
00201         check_emis[i] = 0;
00202         kem[i] = 0.0;
00203         if (CONST_ATT == isosurf->att[ATT_EMIT].att_src) {
00204             kem[i] = isosurf->att[ATT_EMIT].constant / 255.;
00205         }
00206         else if (MAP_ATT == isosurf->att[ATT_EMIT].att_src) {
00207             check_emis[i] = 1;
00208             e_dl[i]++;
00209         }
00210 
00211         /* shin */
00212         check_shin[i] = 0;
00213         ksh[i] = 0.0;
00214         if (CONST_ATT == isosurf->att[ATT_SHINE].att_src) {
00215             ksh[i] = isosurf->att[ATT_SHINE].constant / 255.;
00216         }
00217         else if (MAP_ATT == isosurf->att[ATT_SHINE].att_src) {
00218             check_shin[i] = 1;
00219             e_dl[i]++;
00220         }
00221 
00222         /* color */
00223         check_color[i] = 0;
00224         curcolor[i] = 0.0;
00225         if (CONST_ATT == isosurf->att[ATT_COLOR].att_src) {
00226             curcolor[i] = (int)isosurf->att[ATT_COLOR].constant;
00227         }
00228         else if (MAP_ATT == isosurf->att[ATT_COLOR].att_src) {
00229             check_color[i] = 1;
00230             e_dl[i] += 3;
00231         }
00232 
00233         /* check material */
00234         check_material[i] = (check_shin[i] || check_emis[i] ||
00235                              (kem[i] && check_color[i]));
00236 
00237         /* set position in data */
00238         pos[i] = 0;
00239         nz[i] = 0;
00240     }
00241 
00242     G_debug(5, "  intialize OK");
00243 
00244     for (z = 0; z < depths - 1; z++) {
00245         zc = z * zres;
00246 
00247         if (GS_check_cancel()) {
00248             for (i = 0; i < gvl->n_isosurfs; i++) {
00249                 G_debug(5, "  break : isosurf : %d datalength : %d B\n",
00250                         i, pos[i]);
00251             }
00252 
00253             gsd_set_material(1, 1, 0., 0., 0x0);
00254             gsd_popmatrix();
00255             gsd_blend(0);
00256             gsd_zwritemask(0xffffffff);
00257 
00258             return (-1);
00259         }
00260 
00261         for (y = 0; y < rows - 1; y++) {
00262             yc = ((rows - 1) * yres) - (y * yres);
00263 
00264             for (x = 0; x < cols - 1; x++) {
00265                 xc = x * xres;
00266 
00267                 for (i = 0; i < gvl->n_isosurfs; i++) {
00268 
00269                     /* read cube index */
00270                     if (nz[i] != 0) {
00271                         nz[i]--;
00272                         continue;
00273                     }
00274                     else {
00275                         c_ndx = READ();
00276                         if (c_ndx == 0) {
00277                             nz[i] = READ() - 1;
00278                             continue;
00279                         }
00280                         else {
00281                             c_ndx = (c_ndx - 1) * 256 + READ();
00282                         }
00283                     }
00284 
00285                     /* save position */
00286                     tmp_pos = pos[i];
00287 
00288                     /* set position for each cube edge data */
00289                     iv = 0;
00290                     for (j = 0; j < cell_table[c_ndx].nedges; j++) {
00291                         if (cell_table[c_ndx].edges[j] == 12)
00292                             iv = 1;
00293 
00294                         edge_pos[cell_table[c_ndx].edges[j]] =
00295                             pos[i] + j * e_dl[i];
00296                     }
00297 
00298                     /* enable/disable blending and depth buffer writing */
00299                     if (check_transp[i] || (ktrans[i] >> 24) < 255) {
00300                         if (!pktransp) {
00301                             gsd_blend(1);
00302                             gsd_zwritemask(0);
00303                         }
00304                     }
00305                     else if (pktransp) {
00306                         gsd_blend(0);
00307                         gsd_zwritemask(0xffffffff);
00308                         pktransp = 0;
00309                     }
00310 
00311                     /* draw cube polygons */
00312                     for (p = 0, num = 0; num < cell_table[c_ndx].npolys;
00313                          num++) {
00314                         gsd_bgnpolygon();
00315 
00316                         for (j = 0; j < 3; j++) {
00317                             crnt_ev = cell_table[c_ndx].polys[p];
00318                             /* set position in data to current edge data */
00319                             pos[i] = edge_pos[crnt_ev];
00320 
00321                             /* triagle vertex */
00322                             if (crnt_ev == 12) {
00323                                 pt[X] = xc + (READ() / 255. * xres);
00324                                 pt[Y] = yc + (-(READ() / 255. * yres));
00325                                 pt[Z] = zc + (READ() / 255. * zres);
00326                             }
00327                             else {
00328                                 pt[edge_vert_pos[crnt_ev][0]] = READ() / 255.;
00329                                 pt[edge_vert_pos[crnt_ev][1]] =
00330                                     edge_vert_pos[crnt_ev][2];
00331                                 pt[edge_vert_pos[crnt_ev][3]] =
00332                                     edge_vert_pos[crnt_ev][4];
00333 
00334                                 pt[X] = xc + (pt[X] * xres);
00335                                 pt[Y] = yc + (-(pt[Y] * yres));
00336                                 pt[Z] = zc + (pt[Z] * zres);
00337                             }
00338 
00339                             n[X] = (READ() / 127. - 1.) / xres;
00340                             n[Y] = (-(READ() / 127. - 1.)) / yres;
00341                             n[Z] = (READ() / 127. - 1.) / zres;
00342 
00343                             if (gvl->isosurf[i]->inout_mode) {
00344                                 n[X] *= -1;
00345                                 n[Y] *= -1;
00346                                 n[Z] *= -1;
00347                             }
00348 
00349                             if (check_color[i])
00350                                 curcolor[i] =
00351                                     (READ() & 0xff) | ((READ() & 0xff) << 8) |
00352                                     ((READ() & 0xff) << 16);
00353 
00354                             if (check_transp[i])
00355                                 ktrans[i] = READ() << 24;;
00356 
00357                             if (check_shin[i])
00358                                 ksh[i] = ((float)READ()) / 255.;
00359 
00360                             if (check_emis[i])
00361                                 kem[i] = ((float)READ()) / 255.;
00362 
00363                             if (pksh != ksh[i] || pkem != kem[i] ||
00364                                 (kem[i] && check_color[i])) {
00365                                 pksh = ksh[i];
00366                                 pkem = kem[i];
00367                                 gsd_set_material(1, 1, ksh[i], kem[i],
00368                                                  (int)curcolor);
00369                             }
00370 
00371                             gsd_litvert_func(n, ktrans[i] | curcolor[i], pt);
00372                             p++;
00373                         }
00374 
00375                         gsd_endpolygon();
00376                     }
00377 
00378                     /* set position to next cube */
00379                     pos[i] =
00380                         tmp_pos + cell_table[c_ndx].nedges * e_dl[i] +
00381                         (iv ? 2 : 0);
00382                 }
00383 
00384             }
00385 
00386         }
00387 
00388     }
00389 
00390     for (i = 0; i < gvl->n_isosurfs; i++) {
00391         G_debug(5, "  end : isosurf : %d datalength : %d B\n", i, pos[i]);
00392     }
00393 
00394     gsd_set_material(1, 1, 0., 0., 0x0);
00395     gsd_popmatrix();
00396     gsd_blend(0);
00397     gsd_zwritemask(0xffffffff);
00398 
00399     return (0);
00400 }
00401 
00409 int gvld_wire_isosurf(geovol * gvl)
00410 {
00411     return (0);
00412 }
00413 
00414 /************************************************************************/
00415 /* SLICES */
00416 
00417 /************************************************************************/
00418 
00419 #define DISTANCE_2(x1, y1, x2, y2)      sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))
00420 
00428 int gvld_slices(geovol * gvl)
00429 {
00430     float tx, ty, tz;
00431     int i;
00432 
00433     GLdouble modelMatrix[16], projMatrix[16];
00434     GLint viewport[4];
00435     GLint window[4];
00436 
00437     G_debug(5, "gvld_slices");
00438 
00439     /* shade */
00440     gsd_shademodel(gvl->slice_draw_mode & DM_GOURAUD);
00441 
00442     /* scaling */
00443     GS_get_scale(&tx, &ty, &tz, 1);
00444 
00445     /* get viewport */
00446     gsd_getwindow(window, viewport, modelMatrix, projMatrix);
00447 
00448     gsd_colormode(CM_COLOR);
00449     gsd_pushmatrix();
00450     gsd_do_scale(1);
00451     gsd_translate(gvl->x_trans, gvl->y_trans, gvl->z_trans);
00452 
00453     for (i = 0; i < gvl->n_slices; i++) {
00454         gsd_blend(0);
00455         gsd_zwritemask(0xffffffff);
00456 
00457         if (gvl->slice[i]->transp == 0)
00458             gvld_slice(gvl, i);
00459     }
00460 
00461     for (i = 0; i < gvl->n_slices; i++) {
00462         gsd_blend(1);
00463         gsd_zwritemask(0x0);
00464 
00465         if (gvl->slice[i]->transp > 0)
00466             gvld_slice(gvl, i);
00467     }
00468 
00469     gsd_set_material(1, 1, 0., 0., 0x0);
00470     gsd_popmatrix();
00471     gsd_blend(0);
00472     gsd_zwritemask(0xffffffff);
00473 
00474     return (0);
00475 }
00476 
00485 int gvld_slice(geovol * gvl, int ndx)
00486 {
00487     geovol_slice *slice;
00488 
00489     int color, offset, transp;
00490     float n[3], pt[4];
00491     float x, nextx, y, nexty, z, stepx, stepy, stepz;
00492     int cols, rows, c, r;
00493     float f_cols, f_rows, distxy, distz, modx, mody, modz, modxy;
00494     int ptX, ptY, ptZ;
00495     double resx, resy, resz;
00496 
00497     /* current slice */
00498     slice = gvl->slice[ndx];
00499 
00500     /* distance between slice def. pts */
00501     distxy = DISTANCE_2(slice->x2, slice->y2, slice->x1, slice->y1);
00502     distz = fabsf(slice->z2 - slice->z1);
00503 
00504     /* distance between slice def pts is zero - zero slice */
00505     if (distxy == 0. || distz == 0.) {
00506         return (1);
00507     }
00508 
00509     /* set slice mod, resolution and set correct coords */
00510     if (slice->dir == X) {
00511         modx = gvl->slice_y_mod;
00512         mody = gvl->slice_z_mod;
00513         modz = gvl->slice_x_mod;
00514         resx = gvl->yres;
00515         resy = gvl->zres;
00516         resz = gvl->xres;
00517         ptX = Y;
00518         ptY = Z;
00519         ptZ = X;
00520     }
00521     else if (slice->dir == Y) {
00522         modx = gvl->slice_x_mod;
00523         mody = gvl->slice_z_mod;
00524         modz = gvl->slice_y_mod;
00525         resx = gvl->xres;
00526         resy = gvl->zres;
00527         resz = gvl->yres;
00528         ptX = X;
00529         ptY = Z;
00530         ptZ = Y;
00531     }
00532     else {
00533         modx = gvl->slice_x_mod;
00534         mody = gvl->slice_y_mod;
00535         modz = gvl->slice_z_mod;
00536         resx = gvl->xres;
00537         resy = gvl->yres;
00538         resz = gvl->zres;
00539         ptX = X;
00540         ptY = Y;
00541         ptZ = Z;
00542     }
00543 
00544     /* x,y mod */
00545     modxy =
00546         DISTANCE_2((slice->x2 - slice->x1) / distxy * modx,
00547                    (slice->y2 - slice->y1) / distxy * mody, 0., 0.);
00548 
00549     /* cols/rows of slice */
00550     f_cols = distxy / modxy;
00551     cols = f_cols > (int)f_cols ? (int)f_cols + 1 : (int)f_cols;
00552 
00553     f_rows = distz / modz;
00554     rows = f_rows > (int)f_rows ? (int)f_rows + 1 : (int)f_rows;
00555 
00556     /* step in x,y for each row of slice */
00557     stepx = (slice->x2 - slice->x1) / f_cols;
00558     stepy = (slice->y2 - slice->y1) / f_cols;
00559     stepz = (slice->z2 - slice->z1) / f_rows;
00560 
00561     /* set x,y intially to first slice pt */
00562     x = (slice->x1);
00563     y = (slice->y1);
00564 
00565     /* set next draw pt */
00566     if (f_cols < 1.) {
00567         nextx = x + stepx * f_cols;
00568         nexty = y + stepy * f_cols;
00569     }
00570     else {
00571         nextx = x + stepx;
00572         nexty = y + stepy;
00573     }
00574 
00575     /* set transparency */
00576     if (slice->transp > 0) {
00577         transp = (255 - slice->transp) << 24;
00578     }
00579     else {
00580         transp = 0x0;
00581     }
00582 
00583     /* loop in slice cols */
00584     for (c = 0; c < cols; c++) {
00585 
00586         /* set z to slice z1 pt */
00587         z = slice->z1;
00588 
00589         /* begin draw one row - triangle strip */
00590         gsd_bgntmesh();
00591 
00592         /* loop in slice rows */
00593         for (r = 0; r < rows + 1; r++) {
00594             /* offset to data - 1. column */
00595             offset = (c + 1) * (rows + 1) * 3 + r * 3;
00596 
00597             /* get color from slice data */
00598             color = (slice->data[offset] & 0xff) |
00599                 ((slice->data[offset + 1] & 0xff) << 8) |
00600                 ((slice->data[offset + 2] & 0xff) << 16);
00601 
00602             /* triagle vertices */
00603             pt[ptX] = nextx * resx;
00604             pt[ptY] = nexty * resy;
00605             pt[ptZ] = z * resz;
00606 
00607             pt[Y] = (gvl->rows - 1) * gvl->yres - pt[Y];
00608             gsd_litvert_func(n, (unsigned int)transp | color, pt);
00609 
00610             /* offset to data - 2. column */
00611             offset = c * (rows + 1) * 3 + r * 3;
00612 
00613             /* get color from slice data */
00614             color = (slice->data[offset] & 0xff) |
00615                 ((slice->data[offset + 1] & 0xff) << 8) |
00616                 ((slice->data[offset + 2] & 0xff) << 16);
00617 
00618             /* set triangle vertices */
00619             pt[ptX] = x * resx;
00620             pt[ptY] = y * resy;
00621             pt[ptZ] = z * resz;
00622 
00623             pt[Y] = (gvl->rows - 1) * gvl->yres - pt[Y];
00624             gsd_litvert_func(n, (unsigned int)transp | color, pt);
00625 
00626             if (r + 1 > f_rows) {
00627                 z += stepz * (f_rows - (float)r);
00628             }
00629             else {
00630                 z += stepz;
00631             }
00632         }
00633 
00634         gsd_endtmesh();
00635 
00636         /* step */
00637         if (c + 2 > f_cols) {
00638             x += stepx;
00639             nextx += stepx * (f_cols - (float)(c + 1));
00640             y += stepy;
00641             nexty += stepy * (f_cols - (float)(c + 1));
00642         }
00643         else {
00644             x += stepx;
00645             nextx += stepx;
00646             y += stepy;
00647             nexty += stepy;
00648         }
00649     }
00650 
00651     gsd_blend(0);
00652     gsd_zwritemask(0xffffffff);
00653 
00654     return (1);
00655 }
00656 
00664 int gvld_wire_slices(geovol * gvl)
00665 {
00666     float pt[3];
00667     int i;
00668     int ptX, ptY, ptZ;
00669     double resx, resy, resz;
00670 
00671     geovol_slice *slice;
00672 
00673     G_debug(5, "gvld_wire_slices");
00674 
00675     gsd_pushmatrix();
00676 
00677     /* shading */
00678     gsd_shademodel(DM_FLAT);
00679     /* set color mode */
00680     gsd_colormode(CM_COLOR);
00681     /* do scale and set volume position */
00682     gsd_do_scale(1);
00683     gsd_translate(gvl->x_trans, gvl->y_trans, gvl->z_trans);
00684 
00685     /* set color and line width */
00686     gsd_color_func(0x0);
00687     gsd_linewidth(1);
00688 
00689     /* loop in slices */
00690     for (i = 0; i < gvl->n_slices; i++) {
00691         slice = gvl->slice[i];
00692 
00693         /* intialize correct coords */
00694         if (slice->dir == X) {
00695             resx = gvl->yres;
00696             resy = gvl->zres;
00697             resz = gvl->xres;
00698             ptX = Y;
00699             ptY = Z;
00700             ptZ = X;
00701         }
00702         else if (slice->dir == Y) {
00703             resx = gvl->xres;
00704             resy = gvl->zres;
00705             resz = gvl->yres;
00706             ptX = X;
00707             ptY = Z;
00708             ptZ = Y;
00709         }
00710         else {
00711             resx = gvl->xres;
00712             resy = gvl->yres;
00713             resz = gvl->zres;
00714             ptX = X;
00715             ptY = Y;
00716             ptZ = Z;
00717         }
00718 
00719         gsd_bgnline();
00720 
00721         /* first slice edge */
00722         pt[ptX] = slice->x1 * resx;
00723         pt[ptY] = slice->y1 * resy;
00724         pt[ptZ] = slice->z1 * resz;;
00725         pt[Y] = (gvl->rows - 1) * gvl->yres - pt[Y];
00726         gsd_vert_func(pt);
00727 
00728         pt[ptX] = slice->x1 * resx;
00729         pt[ptY] = slice->y1 * resy;
00730         pt[ptZ] = slice->z2 * resz;;
00731         pt[Y] = (gvl->rows - 1) * gvl->yres - pt[Y];
00732         gsd_vert_func(pt);
00733 
00734         pt[ptX] = slice->x2 * resx;
00735         pt[ptY] = slice->y2 * resy;
00736         pt[ptZ] = slice->z2 * resz;;
00737         pt[Y] = (gvl->rows - 1) * gvl->yres - pt[Y];
00738         gsd_vert_func(pt);
00739 
00740         pt[ptX] = slice->x2 * resx;
00741         pt[ptY] = slice->y2 * resy;
00742         pt[ptZ] = slice->z1 * resz;;
00743         pt[Y] = (gvl->rows - 1) * gvl->yres - pt[Y];
00744         gsd_vert_func(pt);
00745 
00746         pt[ptX] = slice->x1 * resx;
00747         pt[ptY] = slice->y1 * resy;
00748         pt[ptZ] = slice->z1 * resz;;
00749         pt[Y] = (gvl->rows - 1) * gvl->yres - pt[Y];
00750         gsd_vert_func(pt);
00751 
00752         gsd_endline();
00753     }
00754 
00755     gsd_set_material(1, 1, 0., 0., 0x0);
00756     gsd_popmatrix();
00757 
00758     return (0);
00759 }
00760 
00768 int gvld_wind3_box(geovol * gvl)
00769 {
00770     float pt[3];
00771 
00772     G_debug(5, "gvld_wind3_box(): id=%d", gvl->gvol_id);
00773 
00774     gsd_pushmatrix();
00775 
00776     /* shading */
00777     gsd_shademodel(DM_FLAT);
00778     /* set color mode */
00779     gsd_colormode(CM_COLOR);
00780     /* do scale and set volume position */
00781     gsd_do_scale(1);
00782     gsd_translate(gvl->x_trans, gvl->y_trans, gvl->z_trans);
00783 
00784     /* set color and line width */
00785     gsd_color_func(0x0);
00786     gsd_linewidth(1);
00787 
00788     /* draw box */
00789 
00790     /* front edges */
00791     gsd_bgnline();
00792     pt[X] = 0;
00793     pt[Y] = 0;
00794     pt[Z] = 0;
00795     gsd_vert_func(pt);
00796     pt[X] = (gvl->cols - 1) * gvl->xres;
00797     pt[Y] = 0;
00798     pt[Z] = 0;
00799     gsd_vert_func(pt);
00800     pt[X] = (gvl->cols - 1) * gvl->xres;
00801     pt[Y] = (gvl->rows - 1) * gvl->yres;
00802     pt[Z] = 0;
00803     gsd_vert_func(pt);
00804     pt[X] = 0;
00805     pt[Y] = (gvl->rows - 1) * gvl->yres;
00806     pt[Z] = 0;
00807     gsd_vert_func(pt);
00808     pt[X] = 0;
00809     pt[Y] = 0;
00810     pt[Z] = 0;
00811     gsd_vert_func(pt);
00812     gsd_endline();
00813 
00814     /* back edges */
00815     gsd_bgnline();
00816     pt[X] = 0;
00817     pt[Y] = 0;
00818     pt[Z] = (gvl->depths - 1) * gvl->zres;
00819     gsd_vert_func(pt);
00820     pt[X] = (gvl->cols - 1) * gvl->xres;
00821     pt[Y] = 0;
00822     pt[Z] = (gvl->depths - 1) * gvl->zres;
00823     gsd_vert_func(pt);
00824     pt[X] = (gvl->cols - 1) * gvl->xres;
00825     pt[Y] = (gvl->rows - 1) * gvl->yres;
00826     pt[Z] = (gvl->depths - 1) * gvl->zres;
00827     gsd_vert_func(pt);
00828     pt[X] = 0;
00829     pt[Y] = (gvl->rows - 1) * gvl->yres;
00830     pt[Z] = (gvl->depths - 1) * gvl->zres;
00831     gsd_vert_func(pt);
00832     pt[X] = 0;
00833     pt[Y] = 0;
00834     pt[Z] = (gvl->depths - 1) * gvl->zres;
00835     gsd_vert_func(pt);
00836     gsd_endline();
00837 
00838     /* others edges */
00839     gsd_bgnline();
00840     pt[X] = 0;
00841     pt[Y] = 0;
00842     pt[Z] = 0;
00843     gsd_vert_func(pt);
00844     pt[X] = 0;
00845     pt[Y] = 0;
00846     pt[Z] = (gvl->depths - 1) * gvl->zres;
00847     gsd_vert_func(pt);
00848     gsd_endline();
00849 
00850     gsd_bgnline();
00851     pt[X] = (gvl->cols - 1) * gvl->xres;
00852     pt[Y] = 0;
00853     pt[Z] = 0;
00854     gsd_vert_func(pt);
00855     pt[X] = (gvl->cols - 1) * gvl->xres;
00856     pt[Y] = 0;
00857     pt[Z] = (gvl->depths - 1) * gvl->zres;
00858     gsd_vert_func(pt);
00859     gsd_endline();
00860 
00861     gsd_bgnline();
00862     pt[X] = 0;
00863     pt[Y] = (gvl->rows - 1) * gvl->yres;
00864     pt[Z] = 0;
00865     gsd_vert_func(pt);
00866     pt[X] = 0;
00867     pt[Y] = (gvl->rows - 1) * gvl->yres;
00868     pt[Z] = (gvl->depths - 1) * gvl->zres;
00869     gsd_vert_func(pt);
00870     gsd_endline();
00871 
00872     gsd_bgnline();
00873     pt[X] = (gvl->cols - 1) * gvl->xres;
00874     pt[Y] = (gvl->rows - 1) * gvl->yres;
00875     pt[Z] = 0;
00876     gsd_vert_func(pt);
00877     pt[X] = (gvl->cols - 1) * gvl->xres;
00878     pt[Y] = (gvl->rows - 1) * gvl->yres;
00879     pt[Z] = (gvl->depths - 1) * gvl->zres;
00880     gsd_vert_func(pt);
00881     gsd_endline();
00882 
00883     gsd_popmatrix();
00884 
00885     return (0);
00886 }