/*! \brief Check focus \param gv view (geoview) */ void gsd_check_focus(geoview * gv) { float zmax, zmin; GS_get_zrange(&zmin, &zmax, 0); if (gv->infocus) { GS_v3eq(gv->from_to[TO], gv->real_to); gv->from_to[TO][Z] -= zmin; GS_v3mult(gv->from_to[TO], gv->scale); gv->from_to[TO][Z] *= gv->vert_exag; GS_v3normalize(gv->from_to[FROM], gv->from_to[TO]); } return; }
int Nviz_set_cplane_here(nv_data *data, int cplane, float sx, float sy) { float x, y, z, len, los[2][3]; float dx, dy, dz; float n, s, w, e; Point3 realto, dir; int id; geosurf *gs; if (GS_get_selected_point_on_surface(sx, sy, &id, &x, &y, &z)) { gs = gs_get_surf(id); if (gs) { realto[X] = x - gs->ox + gs->x_trans; realto[Y] = y - gs->oy + gs->y_trans; realto[Z] = z + gs->z_trans; } else return 0; } else { if (gsd_get_los(los, (short)sx, (short)sy)) { len = GS_distance(Gv.from_to[FROM], Gv.real_to); GS_v3dir(los[FROM], los[TO], dir); GS_v3mult(dir, len); realto[X] = Gv.from_to[FROM][X] + dir[X]; realto[Y] = Gv.from_to[FROM][Y] + dir[Y]; realto[Z] = Gv.from_to[FROM][Z] + dir[Z]; } else return 0; } Nviz_get_cplane_translation(data, cplane, &dx, &dy, &dz); GS_get_region(&n, &s, &w, &e); dx = realto[X] - (e - w) / 2.; dy = realto[Y] - (n - s) / 2.; Nviz_set_cplane_translation(data, cplane, dx, dy, dz); return 1; }
/*! \brief Save 3dview \param vname view name \param gv pointer to geoview struct \param gd pointer to geodisplay struct \param w current window \param defsurf default geosurf struct \return -1 on error \return ? */ int Gs_save_3dview(const char *vname, geoview * gv, geodisplay * gd, struct Cell_head *w, geosurf * defsurf) { const char *mapset; struct G_3dview v; float zmax, zmin; GS_get_zrange(&zmin, &zmax, 0); G_get_3dview_defaults(&v, w); mapset = G_mapset(); if (mapset != NULL) { if (defsurf) { if (defsurf->draw_mode & DM_WIRE_POLY) { v.display_type = 3; } else if (defsurf->draw_mode & DM_WIRE || defsurf->draw_mode & DM_COL_WIRE) { v.display_type = 1; } else if (defsurf->draw_mode & DM_POLY) { v.display_type = 2; } v.mesh_freq = defsurf->x_modw; /* mesh resolution */ v.poly_freq = defsurf->x_mod; /* poly resolution */ v.dozero = !(defsurf->nz_topo); v.colorgrid = (defsurf->draw_mode & DM_COL_WIRE) ? 1 : 0; v.shading = (defsurf->draw_mode & DM_GOURAUD) ? 1 : 0; } if (gv->infocus) { GS_v3eq(v.from_to[TO], gv->real_to); v.from_to[TO][Z] -= zmin; GS_v3mult(v.from_to[TO], gv->scale); v.from_to[TO][Z] *= gv->vert_exag; } else { GS_v3eq(v.from_to[TO], gv->from_to[TO]); } gsd_model2real(v.from_to[TO]); GS_v3eq(v.from_to[FROM], gv->from_to[FROM]); gsd_model2real(v.from_to[FROM]); v.exag = gv->vert_exag; v.fov = gv->fov / 10.; v.twist = gv->twist; v.fringe = 0; /* not implemented here */ v.lightson = 1; /* always true, curently */ if (gv->lights[0].position[W] == 1) { /* local */ v.lightpos[X] = gv->lights[0].position[X]; v.lightpos[Y] = gv->lights[0].position[Y]; v.lightpos[Z] = gv->lights[0].position[Z]; gsd_model2real(v.lightpos); v.lightpos[W] = 1.0; /* local */ } else { v.lightpos[X] = gv->lights[0].position[X]; v.lightpos[Y] = gv->lights[0].position[Y]; v.lightpos[Z] = gv->lights[0].position[Z]; v.lightpos[W] = 0.0; /* inf */ } v.lightcol[0] = gv->lights[0].color[0]; v.lightcol[1] = gv->lights[0].color[1]; v.lightcol[2] = gv->lights[0].color[2]; v.ambient = (gv->lights[0].ambient[0] + gv->lights[0].ambient[1] + gv->lights[0].ambient[2]) / 3.; v.shine = gv->lights[0].shine; v.surfonly = 0; /* N/A - now uses constant color */ strcpy((v.pgm_id), "Nvision-ALPHA!"); return (G_put_3dview(vname, mapset, &v, w)); } else { return (-1); } }