GRASS Programmer's Manual
6.4.2(2012)
|
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 }