/*! \brief Init variables for optimization \param gs surface (geosurf) */ void init_vars(geosurf * gs) { /* optimized - these are static - global to this file */ norm = gs->norms; elbuf = gs_get_att_typbuff(gs, ATT_TOPO, 0); #ifdef USE_GL_NORMALIZE c_z2 = 2.0 * gs->xres * gs->yres * gs->x_mod * gs->y_mod / GS_global_exag(); c_z2_sq = c_z2 * c_z2; x_res_z2 = 2.0 * gs->xres * gs->z_exag * gs->x_mod; y_res_z2 = 2.0 * gs->yres * gs->z_exag * gs->y_mod; #else { float sx, sy, sz; GS_get_scale(&sx, &sy, &sz, 1); c_z2 = 2.0 * gs->xres * gs->yres * gs->x_mod * gs->y_mod; c_z2_sq = c_z2 * c_z2; x_res_z2 = 2.0 * gs->xres * gs->z_exag * gs->x_mod; y_res_z2 = 2.0 * gs->yres * gs->z_exag * gs->y_mod; } #endif slice = gs->y_mod * gs->cols; return; }
/*! \brief ADD \param gs surface (geosurf) \param pt */ int _viewcell_tri_interp(geosurf * gs, Point3 pt) { typbuff *buf; buf = gs_get_att_typbuff(gs, ATT_TOPO, 0); return (viewcell_tri_interp(gs, buf, pt, 0)); }
/*! \brief ADD \param bot \param surf surface (geosurf) \param row \param side */ void gsd_fringe_horiz_line2(float bot, geosurf * surf, int row, int side) { int col; int cnt; float pt[4]; typbuff *buff; long offset; int xcnt; GS_set_draw(GSD_FRONT); gsd_pushmatrix(); gsd_do_scale(1); gsd_translate(surf->x_trans, surf->y_trans, surf->z_trans); buff = gs_get_att_typbuff(surf, ATT_TOPO, 0); xcnt = VCOLS(surf); gsd_bgnline(); col = 0; /* floor left */ pt[X] = surf->xmin + (col * (surf->x_mod * surf->xres)); pt[Y] = surf->ymax - ((row + side) * (surf->y_mod * surf->yres)); pt[Z] = bot; gsd_vert_func(pt); offset = 0; GET_MAPATT(buff, offset, pt[Z]); pt[Z] = pt[Z] * surf->z_exag; gsd_vert_func(pt); cnt = 1; for (col = 0; col < xcnt - 1; col++) { /* bottom right */ pt[X] = surf->xmin + (col * (surf->x_mod * surf->xres)); pt[Y] = surf->ymax - ((row + side) * (surf->y_mod * surf->yres)); offset = col * surf->x_mod; GET_MAPATT(buff, offset, pt[Z]); pt[Z] = pt[Z] * surf->z_exag; gsd_vert_func(pt); cnt++; } col--; pt[X] = surf->xmin + (col * (surf->x_mod * surf->xres)); pt[Y] = surf->ymax - ((row + side) * (surf->y_mod * surf->yres)); pt[Z] = bot; gsd_vert_func(pt); gsd_endline(); GS_done_draw(); gsd_popmatrix(); gsd_flush(); return; }
/*! \brief ADD \param gs surface (geosurf) \return -1 on failure \return 1 on success */ int gsdrape_set_surface(geosurf * gs) { static int first = 1; if (first) { first = 0; if (0 > drape_line_init(gs->rows, gs->cols)) { G_warning(_("Unable to process vector map - out of memory")); Ebuf = NULL; return (-1); } } Ebuf = gs_get_att_typbuff(gs, ATT_TOPO, 0); return (1); }
/*! \brief ADD \param bot \param surf surface (geosurf) \param col \param side [unused] */ void gsd_fringe_vert_line(float bot, geosurf * surf, int col, int side) { int row; int cnt; float pt[4]; typbuff *buff; long offset; int ycnt; GS_set_draw(GSD_FRONT); gsd_pushmatrix(); gsd_do_scale(1); gsd_translate(surf->x_trans, surf->y_trans, surf->z_trans); buff = gs_get_att_typbuff(surf, ATT_TOPO, 0); ycnt = VROWS(surf); gsd_bgnline(); row = 0; /* floor left */ pt[X] = col * (surf->x_mod * surf->xres); pt[Y] = ((surf->rows - 1) * surf->yres) - (row * (surf->y_mod * surf->yres)); pt[Z] = bot; gsd_vert_func(pt); offset = (row * surf->y_mod * surf->cols) + (col * surf->x_mod); GET_MAPATT(buff, offset, pt[Z]); pt[Z] = pt[Z] * surf->z_exag; gsd_vert_func(pt); cnt = 1; for (row = 0; row < ycnt - 1; row++) { /* bottom right */ pt[X] = col * (surf->x_mod * surf->xres); pt[Y] = ((surf->rows - 1) * surf->yres) - (row * (surf->y_mod * surf->yres)); offset = (row * surf->y_mod * surf->cols) + (col * surf->x_mod); GET_MAPATT(buff, offset, pt[Z]); pt[Z] = pt[Z] * surf->z_exag; gsd_vert_func(pt); cnt++; } row--; pt[X] = col * (surf->x_mod * surf->xres); pt[Y] = ((surf->rows - 1) * surf->yres) - (row * (surf->y_mod * surf->yres)); pt[Z] = bot; gsd_vert_func(pt); row = 0; pt[X] = col * (surf->x_mod * surf->xres); pt[Y] = ((surf->rows - 1) * surf->yres) - (row * (surf->y_mod * surf->yres)); pt[Z] = bot; gsd_vert_func(pt); gsd_endline(); GS_done_draw(); gsd_popmatrix(); gsd_flush(); return; }
/*! \brief ADD Need to think about translations - If user translates surface, sites should automatically go with it, but translating sites should translate it relative to surface on which it's displayed Handling mask checking here \todo prevent scaling by 0 \param gp site (geosite) \param gs surface (geosurf) \param do_fast (unused) \return 0 \return 1 */ int gpd_2dsite(geosite * gp, geosurf * gs, int do_fast) { float site[3], konst; float size; int src, check, marker, color; geopoint *gpt; typbuff *buf; GLdouble modelMatrix[16], projMatrix[16]; GLint viewport[4]; GLint window[4]; if (GS_check_cancel()) { return (0); } if (gs) { gs_update_curmask(gs); src = gs_get_att_src(gs, ATT_TOPO); if (src == CONST_ATT) { konst = gs->att[ATT_TOPO].constant; } else { buf = gs_get_att_typbuff(gs, ATT_TOPO, 0); } /* Get viewport parameters for view check */ gsd_getwindow(window, viewport, modelMatrix, projMatrix); gsd_pushmatrix(); gsd_do_scale(1); gsd_translate(gs->x_trans, gs->y_trans, gs->z_trans); gsd_linewidth(gp->width); check = 0; color = gp->color; marker = gp->marker; size = gp->size; for (gpt = gp->points; gpt; gpt = gpt->next) { if (!(++check % CHK_FREQ)) { if (GS_check_cancel()) { gsd_linewidth(1); gsd_popmatrix(); return (0); } } site[X] = gpt->p3[X] + gp->x_trans - gs->ox; site[Y] = gpt->p3[Y] + gp->y_trans - gs->oy; if (gs_point_is_masked(gs, site)) { continue; } /* TODO: set other dynamic attributes */ if (gp->attr_mode & ST_ATT_COLOR) { color = gpt->iattr; } if (src == MAP_ATT) { if (viewcell_tri_interp(gs, buf, site, 1)) { /* returns 0 if outside or masked */ site[Z] += gp->z_trans; if (gsd_checkpoint (site, window, viewport, modelMatrix, projMatrix)) continue; else /* ACS_MODIFY_OneLine site_attr management - was: gpd_obj(gs, color, size, marker, site); */ gpd_obj_site_attr(gs, gp, gpt, site); } } else if (src == CONST_ATT) { if (gs_point_in_region(gs, site, NULL)) { site[Z] = konst + gp->z_trans; if (gsd_checkpoint (site, window, viewport, modelMatrix, projMatrix)) continue; else /* ACS_MODIFY_OneLine site_attr management - was: gpd_obj(NULL, color, size, marker, site); */ gpd_obj_site_attr(NULL, gp, gpt, site); } } } gsd_linewidth(1); gsd_popmatrix(); } return (1); }