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