GRASS Programmer's Manual  6.4.2(2012)
gpd.c
Go to the documentation of this file.
00001 
00019 #include <stdlib.h>
00020 #include <math.h>
00021 
00022 #include <grass/gstypes.h>
00023 
00024 #include "rowcol.h"
00025 
00026 #define CHK_FREQ 50
00027 
00028 /* BOB -- border allowed outside of viewport */
00029 #define v_border 50
00030 
00031 /* ACS_MODIFY_BEGIN site_attr management ************************************** */
00032 static float _cur_size_;
00033 
00044 int gpd_obj_site_attr(geosurf * gs, geosite * gp, geopoint * gpt, Point3 site)
00045 {
00046     float size, z, y, x, z_scale, z_offset;
00047     int marker, color, i, ii, iii;
00048     int use_attr, has_drawn;
00049     int _put_aside_;
00050 
00051     _put_aside_ = 0;
00052     _cur_size_ = gp->size;
00053 
00054     z_scale = GS_global_exag();
00055     z_offset = 0.0;
00056 
00057     has_drawn = 0;
00058 
00059     for (i = 0; i < GPT_MAX_ATTR; i++) {
00060         color = gp->color;
00061         marker = gp->marker;
00062         size = gp->size;
00063         use_attr = 0;
00064 
00065         if (gp->use_attr[i] & ST_ATT_COLOR) {
00066             use_attr = 1;
00067             color = gpt->color[i];
00068         }
00069 
00070         if (gp->use_attr[i] & ST_ATT_MARKER) {
00071             use_attr = 1;
00072             marker = gpt->marker[i];
00073         }
00074 
00075         if (gp->use_attr[i] & ST_ATT_SIZE) {
00076             use_attr = 1;
00077             size = gpt->size[i] * gp->size;
00078             if (gp->marker == ST_HISTOGRAM)
00079                 _put_aside_ = 1;
00080         }
00081 
00082         /* ACS_MODIFY_BEGIN site_highlight management ********************************* */
00083         if (gpt->highlight_color)
00084             color = gpt->highlight_color_value;
00085         if (gpt->highlight_marker)
00086             marker = gpt->highlight_marker_value;
00087         if (gpt->highlight_size)
00088             size *= gpt->highlight_size_value;
00089         /* ACS_MODIFY_END site_highlight management *********************************** */
00090 
00091         if (_put_aside_) {
00092             if (use_attr == 1) {
00093                 has_drawn = 1;
00094 
00095 /*******************************************************************************
00096                 fixed size = gp->size
00097                 this is mailny intended for "histograms" that grow in z, but not in xy
00098 
00099         square filling to right and then up
00100 
00101          15 14 13 12
00102           8  7  6 11
00103           3  2  5 10
00104           0  1  4  9
00105 
00106 *******************************************************************************/
00107                 x = site[X];
00108                 y = site[Y];
00109 
00110                 ii = (int)(sqrt(i));
00111                 iii = ii * ii + ii;
00112 
00113                 if (i <= iii) {
00114                     site[X] += ii * 2.2 * gp->size;
00115                     site[Y] += (i - ii) * 2.2 * gp->size;
00116                 }
00117                 else {
00118                     site[X] += (ii - (i - iii)) * 2.2 * gp->size;
00119                     site[Y] += ii * 2.2 * gp->size;
00120 
00121                 }
00122 
00123                 gpd_obj(gs, color, size, marker, site);
00124 
00125                 site[X] = x;
00126                 site[Y] = y;
00127             }
00128         }
00129         else {
00130             if (i > 0)
00131                 z_offset += size;
00132             if (use_attr == 1) {
00133                 has_drawn = 1;
00134 
00135                 z = site[Z];
00136                 site[Z] += z_offset / z_scale;
00137 
00138                 gpd_obj(gs, color, size, marker, site);
00139 
00140                 site[Z] = z;
00141             }
00142 
00143             z_offset += size;
00144         }
00145     }
00146 
00147     if (has_drawn == 0)
00148         gpd_obj(gs, color, size, marker, site);
00149 
00150     return (0);
00151 }
00152 
00153 /* ACS_MODIFY_END site_attr management **************************************** */
00154 
00167 int gs_point_in_region(geosurf * gs, float *pt, float *region)
00168 {
00169     float top, bottom, left, right;
00170 
00171     if (!region) {
00172         top = gs->yrange;
00173         bottom = VROW2Y(gs, VROWS(gs));
00174         left = 0.0;
00175         right = VCOL2X(gs, VCOLS(gs));
00176     }
00177     else {
00178         top = region[0];
00179         bottom = region[1];
00180         left = region[2];
00181         right = region[3];
00182     }
00183 
00184     return (pt[X] >= left && pt[X] <= right &&
00185             pt[Y] >= bottom && pt[Y] <= top);
00186 }
00187 
00202 void gpd_obj(geosurf * gs, int color, float size, int marker, Point3 pt)
00203 {
00204     float sz, lpt[3];
00205     float siz[3];
00206 
00207     gsd_color_func(color);
00208     sz = GS_global_exag();
00209     GS_v3eq(lpt, pt);           /* CHANGING Z OF POINT PASSED, so use copy */
00210 
00211     switch (marker) {
00212         /* ACS_MODIFY_BEGIN site_attr management ************************************** */
00213     case ST_HISTOGRAM:
00214         gsd_colormode(CM_DIFFUSE);
00215         gsd_pushmatrix();
00216 
00217         if (sz) {
00218             lpt[Z] *= sz;
00219             gsd_scale(1.0, 1.0, 1. / sz);
00220         }
00221 
00222         siz[0] = _cur_size_;
00223         siz[1] = _cur_size_;
00224         siz[2] = size;
00225 
00226         gsd_box(lpt, color, siz);
00227 
00228         gsd_popmatrix();
00229         gsd_colormode(CM_COLOR);
00230 
00231         break;
00232         /* ACS_MODIFY_END   site_attr management ************************************** */
00233     case ST_DIAMOND:
00234         /*
00235            gsd_colormode(CM_AD);
00236          */
00237         gsd_colormode(CM_DIFFUSE);
00238         gsd_pushmatrix();
00239 
00240         if (sz) {
00241             lpt[Z] *= sz;
00242             gsd_scale(1.0, 1.0, 1. / sz);
00243         }
00244 
00245         gsd_diamond(lpt, color, size);
00246         gsd_popmatrix();
00247         gsd_colormode(CM_COLOR);
00248 
00249         break;
00250     case ST_BOX:
00251         gsd_colormode(CM_COLOR);
00252         gsd_pushmatrix();
00253 
00254         if (sz) {
00255             lpt[Z] *= sz;
00256             gsd_scale(1.0, 1.0, 1. / sz);
00257         }
00258 
00259         gsd_draw_box(lpt, color, size);
00260         gsd_popmatrix();
00261 
00262         break;
00263     case ST_SPHERE:
00264         /*
00265            gsd_colormode(CM_AD);
00266          */
00267         gsd_colormode(CM_DIFFUSE);
00268         gsd_pushmatrix();
00269 
00270         if (sz) {
00271             lpt[Z] *= sz;
00272             gsd_scale(1.0, 1.0, 1. / sz);
00273         }
00274 
00275         gsd_sphere(lpt, size);
00276         gsd_popmatrix();
00277         gsd_colormode(CM_COLOR);
00278 
00279         break;
00280     case ST_GYRO:
00281         gsd_colormode(CM_COLOR);
00282         gsd_pushmatrix();
00283 
00284         if (sz) {
00285             lpt[Z] *= sz;
00286             gsd_scale(1.0, 1.0, 1. / sz);
00287         }
00288 
00289         gsd_draw_gyro(lpt, color, size);
00290         gsd_popmatrix();
00291 
00292         break;
00293     case ST_ASTER:
00294         gsd_colormode(CM_COLOR);
00295         gsd_pushmatrix();
00296 
00297         if (sz) {
00298             lpt[Z] *= sz;
00299             gsd_scale(1.0, 1.0, 1. / sz);
00300         }
00301 
00302         gsd_draw_asterisk(lpt, color, size);
00303         gsd_popmatrix();
00304 
00305         break;
00306     case ST_CUBE:
00307         gsd_colormode(CM_DIFFUSE);
00308         gsd_pushmatrix();
00309 
00310         if (sz) {
00311             lpt[Z] *= sz;
00312             gsd_scale(1.0, 1.0, 1. / sz);
00313         }
00314 
00315         gsd_cube(lpt, color, size);
00316         gsd_popmatrix();
00317         gsd_colormode(CM_COLOR);
00318 
00319         break;
00320     default:
00321     case ST_X:
00322         gsd_colormode(CM_COLOR);
00323         gsd_x(gs, lpt, color, size);
00324 
00325         break;
00326     }
00327 
00328     return;
00329 }
00330 
00349 int gpd_2dsite(geosite * gp, geosurf * gs, int do_fast)
00350 {
00351     float site[3], konst;
00352     float size;
00353     int src, check, marker, color;
00354     geopoint *gpt;
00355     typbuff *buf;
00356     GLdouble modelMatrix[16], projMatrix[16];
00357     GLint viewport[4];
00358     GLint window[4];
00359 
00360 
00361     if (GS_check_cancel()) {
00362         return (0);
00363     }
00364 
00365     if (gs) {
00366         gs_update_curmask(gs);
00367 
00368         src = gs_get_att_src(gs, ATT_TOPO);
00369 
00370         if (src == CONST_ATT) {
00371             konst = gs->att[ATT_TOPO].constant;
00372             site[Z] = konst;
00373         }
00374         else {
00375             buf = gs_get_att_typbuff(gs, ATT_TOPO, 0);
00376         }
00377 
00378         /* Get viewport parameters for view check */
00379         gsd_getwindow(window, viewport, modelMatrix, projMatrix);
00380 
00381         gsd_pushmatrix();
00382 
00383         gsd_do_scale(1);
00384 
00385         gsd_translate(gs->x_trans, gs->y_trans, gs->z_trans);
00386 
00387         gsd_linewidth(gp->width);
00388 
00389         check = 0;
00390         color = gp->color;
00391         marker = gp->marker;
00392         size = gp->size;
00393 
00394         for (gpt = gp->points; gpt; gpt = gpt->next) {
00395             if (!(++check % CHK_FREQ)) {
00396                 if (GS_check_cancel()) {
00397                     gsd_linewidth(1);
00398                     gsd_popmatrix();
00399 
00400                     return (0);
00401                 }
00402             }
00403 
00404             site[X] = gpt->p3[X] + gp->x_trans - gs->ox;
00405             site[Y] = gpt->p3[Y] + gp->y_trans - gs->oy;
00406 
00407             if (gs_point_is_masked(gs, site)) {
00408                 continue;
00409             }
00410 
00411             /* TODO: set other dynamic attributes */
00412             if (gp->attr_mode & ST_ATT_COLOR) {
00413                 color = gpt->iattr;
00414             }
00415 
00416             if (src == MAP_ATT) {
00417                 if (viewcell_tri_interp(gs, buf, site, 1)) {
00418                     /* returns 0 if outside or masked */
00419                     site[Z] += gp->z_trans;
00420 
00421                     if (gsd_checkpoint
00422                         (site, window, viewport, modelMatrix, projMatrix))
00423                         continue;
00424                     else
00425                         /* ACS_MODIFY_OneLine site_attr management - was: gpd_obj(gs, color, size, marker, site); */
00426                         gpd_obj_site_attr(gs, gp, gpt, site);
00427                 }
00428             }
00429             else if (src == CONST_ATT) {
00430                 if (gs_point_in_region(gs, site, NULL)) {
00431                     site[Z] += gp->z_trans;
00432                     if (gsd_checkpoint
00433                         (site, window, viewport, modelMatrix, projMatrix))
00434                         continue;
00435                     else
00436                         /* ACS_MODIFY_OneLine site_attr management - was: gpd_obj(NULL, color, size, marker, site); */
00437                         gpd_obj_site_attr(NULL, gp, gpt, site);
00438                 }
00439             }
00440         }
00441 
00442         gsd_linewidth(1);
00443         gsd_popmatrix();
00444     }
00445 
00446     return (1);
00447 }
00448 
00459 int gpd_3dsite(geosite * gp, float xo, float yo, int do_fast)
00460 {
00461     float site[3], tz;
00462     float size;
00463     int check, color, marker;
00464     geopoint *gpt;
00465     GLdouble modelMatrix[16], projMatrix[16];
00466     GLint viewport[4];
00467     GLint window[4];
00468 
00469     if (GS_check_cancel()) {
00470         return (0);
00471     }
00472 
00473     gsd_getwindow(window, viewport, modelMatrix, projMatrix);
00474 
00475     gsd_pushmatrix();
00476 
00477     gsd_do_scale(1);
00478 
00479     tz = GS_global_exag();
00480     site[Z] = 0.0;
00481 
00482     check = 0;
00483     color = gp->color;
00484     marker = gp->marker;
00485     size = gp->size;
00486 
00487     gsd_linewidth(gp->width);
00488 
00489     for (gpt = gp->points; gpt; gpt = gpt->next) {
00490         if (!(++check % CHK_FREQ)) {
00491             if (GS_check_cancel()) {
00492                 gsd_linewidth(1);
00493                 gsd_popmatrix();
00494 
00495                 return (0);
00496             }
00497         }
00498 
00499         site[X] = gpt->p3[X] + gp->x_trans - xo;
00500         site[Y] = gpt->p3[Y] + gp->y_trans - yo;
00501 
00502         if (tz) {
00503             site[Z] = gpt->p3[Z] + gp->z_trans;
00504         }
00505 
00506         /* TODO: set other dynamic attributes */
00507         if (gp->attr_mode & ST_ATT_COLOR) {
00508             color = gpt->iattr;
00509         }
00510 
00511         if (gsd_checkpoint(site, window, viewport, modelMatrix, projMatrix))
00512             continue;
00513         else
00514             /* clip points outside default region? */
00515             /* ACS_MODIFY_OneLine site_attr management - was: gpd_obj(NULL, color, size, marker, site); */
00516             gpd_obj_site_attr(NULL, gp, gpt, site);
00517     }
00518 
00519     gsd_linewidth(1);
00520     gsd_popmatrix();
00521 
00522     return (1);
00523 }
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines