GRASS Programmer's Manual  6.4.2(2012)
gsd_fringe.c
Go to the documentation of this file.
00001 
00021 #include <grass/gstypes.h>
00022 
00023 #include "gsget.h"
00024 #include "rowcol.h"
00025 
00026 #define FRINGE_FORE 0x000000
00027 #define FRINGE_WIDTH 2
00028 
00032 float Nnorth[] = { 0.0, 0.8, 0.6 };
00033 float Nsouth[] = { 0.0, -0.8, 0.6 };
00034 float Neast[] = { 0.8, 0.0, 0.6 };
00035 float Nwest[] = { -0.8, 0.0, 0.6 };
00036 float Ntop[] = { 0.0, 0.0, 1.0 };
00037 float Nbottom[] = { 0.0, 0.0, -1.0 };
00038 
00051 void gsd_display_fringe(geosurf * surf, unsigned long clr, float elev,
00052                         int where[4])
00053 {
00054     float bot, xres, yres;      /* world size of view cell */
00055     int ycnt, xcnt;             /* number of view cells across */
00056     float xmax, ymax;
00057 
00058     xres = surf->x_mod * surf->xres;
00059     yres = surf->y_mod * surf->yres;
00060 
00061     xcnt = VCOLS(surf);
00062     ycnt = VROWS(surf);
00063 
00064     xmax = surf->xmax;
00065     ymax = surf->ymax;
00066 
00067     /* 
00068        bot = surf->zmin - ((surf->zrange/4.) * surf->z_exag);
00069      */
00070     bot = elev - ((surf->zrange / 4.) * surf->z_exag);
00071 
00072 
00073     gsd_linewidth(FRINGE_WIDTH);
00074     gsd_colormode(CM_COLOR);
00075 
00076     /* North fringe */
00077     if (where[0] || where[1]) {
00078         glNormal3fv(Nnorth);
00079         gsd_color_func(clr);
00080         gsd_zwritemask(0x0);
00081         gsd_fringe_horiz_poly(bot, surf, 0, 0);
00082         gsd_color_func(FRINGE_FORE);    /* WHITE */
00083         gsd_fringe_horiz_line(bot, surf, 0, 0);
00084         gsd_zwritemask(0xffffffff);
00085         /*   wmpack (0); ??? glColorMask */
00086         gsd_color_func(clr);
00087         gsd_fringe_horiz_poly(bot, surf, 0, 0);
00088     }
00089 
00090     /* South fringe */
00091     if (where[2] || where[3]) {
00092         glNormal3fv(Nsouth);
00093         gsd_color_func(clr);
00094         gsd_zwritemask(0x0);
00095         gsd_fringe_horiz_poly(bot, surf, ycnt - 2, 1);
00096         gsd_color_func(FRINGE_FORE);    /* WHITE */
00097         gsd_fringe_horiz_line(bot, surf, ycnt - 2, 1);
00098         gsd_zwritemask(0xffffffff);
00099         /*   wmpack (0); ??? glColorMask */
00100         gsd_color_func(clr);
00101         gsd_fringe_horiz_poly(bot, surf, ycnt - 2, 1);
00102     }
00103 
00104     /* West fringe */
00105     if (where[0] || where[2]) {
00106         glNormal3fv(Nwest);
00107         gsd_color_func(clr);
00108         gsd_zwritemask(0x0);
00109         gsd_fringe_vert_poly(bot, surf, 0, 0);
00110         gsd_color_func(FRINGE_FORE);
00111         gsd_fringe_vert_line(bot, surf, 0, 0);
00112         gsd_zwritemask(0xffffffff);
00113         gsd_color_func(clr);
00114         gsd_fringe_vert_poly(bot, surf, 0, 0);
00115     }
00116 
00117     /* East fringe */
00118     if (where[1] || where[3]) {
00119         glNormal3fv(Neast);
00120         gsd_color_func(clr);
00121         gsd_zwritemask(0x0);
00122         gsd_fringe_vert_poly(bot, surf, xcnt - 2, 1);
00123         gsd_color_func(FRINGE_FORE);
00124         gsd_fringe_vert_line(bot, surf, xcnt - 2, 1);
00125         gsd_zwritemask(0xffffffff);
00126         gsd_color_func(clr);
00127         gsd_fringe_vert_poly(bot, surf, xcnt - 2, 1);
00128     }
00129 
00130     return;
00131 }
00132 
00141 void gsd_fringe_horiz_poly(float bot, geosurf * surf, int row, int side)
00142 {
00143     int col;
00144     int cnt;
00145     float pt[4];
00146     typbuff *buff;
00147     long offset;
00148     int xcnt;
00149 
00150     GS_set_draw(GSD_FRONT);
00151     gsd_pushmatrix();
00152     gsd_do_scale(1);
00153     gsd_translate(surf->x_trans, surf->y_trans, surf->z_trans);
00154 
00155     buff = gs_get_att_typbuff(surf, ATT_TOPO, 0);
00156     xcnt = VCOLS(surf);
00157 
00158     gsd_bgnpolygon();
00159 
00160     col = 0;
00161     /* floor left */
00162     pt[X] = col * (surf->x_mod * surf->xres);
00163     pt[Y] =
00164         ((surf->rows - 1) * surf->yres) -
00165         ((row + side) * (surf->y_mod * surf->yres));
00166     pt[Z] = bot;
00167     gsd_vert_func(pt);
00168 
00169     offset = (row * surf->y_mod * surf->cols) + (col * surf->x_mod);
00170     GET_MAPATT(buff, offset, pt[Z]);
00171     pt[Z] = pt[Z] * surf->z_exag;
00172     gsd_vert_func(pt);
00173 
00174     cnt = 1;
00175     for (col = 0; col < xcnt - 1; col++) {
00176         /* bottom right */
00177         pt[X] = col * (surf->x_mod * surf->xres);
00178         pt[Y] =
00179             ((surf->rows - 1) * surf->yres) -
00180             ((row + side) * (surf->y_mod * surf->yres));
00181         offset = (row * surf->y_mod * surf->cols) + (col * surf->x_mod);
00182         GET_MAPATT(buff, offset, pt[Z]);
00183         pt[Z] = pt[Z] * surf->z_exag;
00184         gsd_vert_func(pt);
00185         cnt++;
00186     }
00187 
00188     col--;
00189     pt[X] = col * (surf->x_mod * surf->xres);
00190     pt[Y] =
00191         ((surf->rows - 1) * surf->yres) -
00192         ((row + side) * (surf->y_mod * surf->yres));
00193     pt[Z] = bot;
00194     gsd_vert_func(pt);
00195 
00196     gsd_endpolygon();
00197 
00198     GS_done_draw();
00199     gsd_popmatrix();
00200     gsd_flush();
00201 
00202     return;
00203 }
00204 
00213 void gsd_fringe_horiz_line(float bot, geosurf * surf, int row, int side)
00214 {
00215     int col;
00216     int cnt;
00217     float pt[4];
00218     typbuff *buff;
00219     long offset;
00220     int xcnt;
00221 
00222     GS_set_draw(GSD_FRONT);
00223     gsd_pushmatrix();
00224     gsd_do_scale(1);
00225     gsd_translate(surf->x_trans, surf->y_trans, surf->z_trans);
00226 
00227 
00228     buff = gs_get_att_typbuff(surf, ATT_TOPO, 0);
00229     xcnt = VCOLS(surf);
00230 
00231     gsd_bgnline();
00232 
00233     col = 0;
00234     /* floor left */
00235     pt[X] = col * (surf->x_mod * surf->xres);
00236     pt[Y] =
00237         ((surf->rows - 1) * surf->yres) -
00238         ((row + side) * (surf->y_mod * surf->yres));
00239     pt[Z] = bot;
00240     gsd_vert_func(pt);
00241 
00242     offset = (row * surf->y_mod * surf->cols) + (col * surf->x_mod);
00243     GET_MAPATT(buff, offset, pt[Z]);
00244     pt[Z] = pt[Z] * surf->z_exag;
00245     gsd_vert_func(pt);
00246 
00247     cnt = 1;
00248     for (col = 0; col < xcnt - 1; col++) {
00249         /* bottom right */
00250         pt[X] = col * (surf->x_mod * surf->xres);
00251         pt[Y] =
00252             ((surf->rows - 1) * surf->yres) -
00253             ((row + side) * (surf->y_mod * surf->yres));
00254         offset = (row * surf->y_mod * surf->cols) + (col * surf->x_mod);
00255         GET_MAPATT(buff, offset, pt[Z]);
00256         pt[Z] = pt[Z] * surf->z_exag;
00257         gsd_vert_func(pt);
00258         cnt++;
00259     }
00260 
00261     col--;
00262     pt[X] = col * (surf->x_mod * surf->xres);
00263     pt[Y] =
00264         ((surf->rows - 1) * surf->yres) -
00265         ((row + side) * (surf->y_mod * surf->yres));
00266     pt[Z] = bot;
00267     gsd_vert_func(pt);
00268 
00269     col = 0;
00270     pt[X] = col * (surf->x_mod * surf->xres);
00271     pt[Y] =
00272         ((surf->rows - 1) * surf->yres) -
00273         ((row + side) * (surf->y_mod * surf->yres));
00274     pt[Z] = bot;
00275     gsd_vert_func(pt);
00276 
00277     gsd_endline();
00278 
00279     GS_done_draw();
00280     gsd_popmatrix();
00281     gsd_flush();
00282 
00283     return;
00284 }
00285 
00294 void gsd_fringe_vert_poly(float bot, geosurf * surf, int col, int side)
00295 {
00296 
00297     int row;
00298     int cnt;
00299     float pt[4];
00300     typbuff *buff;
00301     long offset;
00302     int ycnt;
00303 
00304     GS_set_draw(GSD_FRONT);
00305     gsd_pushmatrix();
00306     gsd_do_scale(1);
00307     gsd_translate(surf->x_trans, surf->y_trans, surf->z_trans);
00308 
00309     gsd_bgnpolygon();
00310 
00311     buff = gs_get_att_typbuff(surf, ATT_TOPO, 0);
00312     ycnt = VROWS(surf);
00313 
00314     row = 0;
00315     /* floor left */
00316     pt[X] = col * (surf->x_mod * surf->xres);
00317     pt[Y] =
00318         ((surf->rows - 1) * surf->yres) - (row * (surf->y_mod * surf->yres));
00319     pt[Z] = bot;
00320     gsd_vert_func(pt);
00321 
00322     offset = (row * surf->y_mod * surf->cols) + (col * surf->x_mod);
00323     GET_MAPATT(buff, offset, pt[Z]);
00324     pt[Z] = pt[Z] * surf->z_exag;
00325     gsd_vert_func(pt);
00326 
00327     cnt = 1;
00328     for (row = 0; row < ycnt - 1; row++) {
00329         /* bottom right */
00330         pt[X] = col * (surf->x_mod * surf->xres);
00331         pt[Y] =
00332             ((surf->rows - 1) * surf->yres) -
00333             (row * (surf->y_mod * surf->yres));
00334         offset = (row * surf->y_mod * surf->cols) + (col * surf->x_mod);
00335         GET_MAPATT(buff, offset, pt[Z]);
00336         pt[Z] = pt[Z] * surf->z_exag;
00337         gsd_vert_func(pt);
00338         cnt++;
00339     }
00340 
00341     row--;
00342     pt[X] = col * (surf->x_mod * surf->xres);
00343     pt[Y] =
00344         ((surf->rows - 1) * surf->yres) - (row * (surf->y_mod * surf->yres));
00345     pt[Z] = bot;
00346     gsd_vert_func(pt);
00347 
00348     gsd_endpolygon();
00349 
00350     GS_done_draw();
00351     gsd_popmatrix();
00352     gsd_flush();
00353 
00354     return;
00355 }
00356 
00365 void gsd_fringe_vert_line(float bot, geosurf * surf, int col, int side)
00366 {
00367     int row;
00368     int cnt;
00369     float pt[4];
00370     typbuff *buff;
00371     long offset;
00372     int ycnt;
00373 
00374     GS_set_draw(GSD_FRONT);
00375     gsd_pushmatrix();
00376     gsd_do_scale(1);
00377     gsd_translate(surf->x_trans, surf->y_trans, surf->z_trans);
00378 
00379 
00380     buff = gs_get_att_typbuff(surf, ATT_TOPO, 0);
00381     ycnt = VROWS(surf);
00382     gsd_bgnline();
00383 
00384     row = 0;
00385     /* floor left */
00386     pt[X] = col * (surf->x_mod * surf->xres);
00387     pt[Y] =
00388         ((surf->rows - 1) * surf->yres) - (row * (surf->y_mod * surf->yres));
00389     pt[Z] = bot;
00390     gsd_vert_func(pt);
00391 
00392     offset = (row * surf->y_mod * surf->cols) + (col * surf->x_mod);
00393     GET_MAPATT(buff, offset, pt[Z]);
00394     pt[Z] = pt[Z] * surf->z_exag;
00395     gsd_vert_func(pt);
00396 
00397     cnt = 1;
00398     for (row = 0; row < ycnt - 1; row++) {
00399         /* bottom right */
00400         pt[X] = col * (surf->x_mod * surf->xres);
00401         pt[Y] =
00402             ((surf->rows - 1) * surf->yres) -
00403             (row * (surf->y_mod * surf->yres));
00404         offset = (row * surf->y_mod * surf->cols) + (col * surf->x_mod);
00405         GET_MAPATT(buff, offset, pt[Z]);
00406         pt[Z] = pt[Z] * surf->z_exag;
00407         gsd_vert_func(pt);
00408         cnt++;
00409     }
00410 
00411     row--;
00412     pt[X] = col * (surf->x_mod * surf->xres);
00413     pt[Y] =
00414         ((surf->rows - 1) * surf->yres) - (row * (surf->y_mod * surf->yres));
00415     pt[Z] = bot;
00416     gsd_vert_func(pt);
00417 
00418     row = 0;
00419     pt[X] = col * (surf->x_mod * surf->xres);
00420     pt[Y] =
00421         ((surf->rows - 1) * surf->yres) - (row * (surf->y_mod * surf->yres));
00422     pt[Z] = bot;
00423     gsd_vert_func(pt);
00424 
00425     gsd_endline();
00426 
00427     GS_done_draw();
00428     gsd_popmatrix();
00429     gsd_flush();
00430 
00431     return;
00432 }
00433 
00442 void gsd_fringe_horiz_line2(float bot, geosurf * surf, int row, int side)
00443 {
00444     int col;
00445     int cnt;
00446     float pt[4];
00447     typbuff *buff;
00448     long offset;
00449     int xcnt;
00450 
00451     GS_set_draw(GSD_FRONT);
00452     gsd_pushmatrix();
00453     gsd_do_scale(1);
00454     gsd_translate(surf->x_trans, surf->y_trans, surf->z_trans);
00455 
00456     buff = gs_get_att_typbuff(surf, ATT_TOPO, 0);
00457     xcnt = VCOLS(surf);
00458     gsd_bgnline();
00459 
00460     col = 0;
00461     /* floor left */
00462     pt[X] = surf->xmin + (col * (surf->x_mod * surf->xres));
00463     pt[Y] = surf->ymax - ((row + side) * (surf->y_mod * surf->yres));
00464     pt[Z] = bot;
00465     gsd_vert_func(pt);
00466 
00467     offset = 0;
00468     GET_MAPATT(buff, offset, pt[Z]);
00469     pt[Z] = pt[Z] * surf->z_exag;
00470     gsd_vert_func(pt);
00471 
00472     cnt = 1;
00473     for (col = 0; col < xcnt - 1; col++) {
00474         /* bottom right */
00475         pt[X] = surf->xmin + (col * (surf->x_mod * surf->xres));
00476         pt[Y] = surf->ymax - ((row + side) * (surf->y_mod * surf->yres));
00477         offset = col * surf->x_mod;
00478         GET_MAPATT(buff, offset, pt[Z]);
00479         pt[Z] = pt[Z] * surf->z_exag;
00480         gsd_vert_func(pt);
00481         cnt++;
00482     }
00483 
00484     col--;
00485     pt[X] = surf->xmin + (col * (surf->x_mod * surf->xres));
00486     pt[Y] = surf->ymax - ((row + side) * (surf->y_mod * surf->yres));
00487     pt[Z] = bot;
00488     gsd_vert_func(pt);
00489 
00490     gsd_endline();
00491 
00492     GS_done_draw();
00493     gsd_popmatrix();
00494     gsd_flush();
00495 
00496     return;
00497 }
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines