|
GRASS Programmer's Manual
6.5.svn(2012)-r51648
|
00001 00015 #include <grass/nviz.h> 00016 00017 static void cp_draw(nv_data *, int, int, int); 00018 static geoview Gv; 00019 00027 int Nviz_new_cplane(nv_data * data, int id) 00028 { 00029 data->num_cplanes++; 00030 /* Initialize internal attributes for this cutplane */ 00031 data->cp_rot[id][X] = data->cp_rot[id][Y] = data->cp_rot[id][Z] = 0.0; 00032 data->cp_trans[id][X] = data->cp_trans[id][Y] = data->cp_trans[id][Z] = 00033 0.0; 00034 data->cp_on[id] = 0; 00035 00036 return 1; 00037 } 00038 00045 int Nviz_on_cplane(nv_data * data, int id) 00046 { 00047 data->cur_cplane = id; 00048 data->cp_on[id] = 1; 00049 GS_set_cplane(id); 00050 00051 return 1; 00052 } 00053 00060 int Nviz_off_cplane(nv_data * data, int id) 00061 { 00062 data->cp_on[id] = 0; 00063 GS_unset_cplane(id); 00064 00065 return 1; 00066 } 00067 00074 int Nviz_draw_cplane(nv_data * data, int bound1, int bound2) 00075 { 00076 cp_draw(data, data->cur_cplane, bound1, bound2); 00077 00078 return 1; 00079 } 00080 00089 void cp_draw(nv_data * data, int current, int surf1, int surf2) 00090 { 00091 int i, nsurfs; 00092 int surf_min = 0, surf_max = 0, temp; 00093 int *surf_list; 00094 00095 GS_set_draw(GSD_BACK); 00096 GS_clear(data->bgcolor); 00097 GS_ready_draw(); 00098 00099 /* If surf boundaries present then find them */ 00100 surf_list = GS_get_surf_list(&nsurfs); 00101 if ((surf1 != -1) && (surf2 != -1)) { 00102 for (i = 0; i < nsurfs; i++) { 00103 if (surf_list[i] == surf1) 00104 surf_min = i; 00105 if (surf_list[i] == surf2) 00106 surf_max = i; 00107 } 00108 00109 if (surf_max < surf_min) { 00110 temp = surf_min; 00111 surf_min = surf_max; 00112 surf_max = temp; 00113 } 00114 00115 surf_max++; 00116 } 00117 else { 00118 surf_min = 0; 00119 surf_max = nsurfs; 00120 } 00121 00122 if (nsurfs > 1) { 00123 for (i = 0; i < MAX_CPLANES; i++) { 00124 if (data->cp_on[i]) 00125 GS_draw_cplane_fence(surf_list[0], surf_list[1], i); 00126 } 00127 } 00128 00129 for (i = surf_min; i < surf_max; i++) { 00130 GS_draw_wire(surf_list[i]); 00131 } 00132 00133 GS_done_draw(); 00134 00135 return; 00136 } 00142 int Nviz_num_cplanes(nv_data * data) 00143 { 00144 return data->num_cplanes; 00145 } 00146 00152 int Nviz_get_current_cplane(nv_data * data) 00153 { 00154 return data->cur_cplane; 00155 } 00156 00167 int Nviz_set_cplane_rotation(nv_data * data, int id, float dx, float dy, float dz) 00168 { 00169 data->cp_rot[id][X] = dx; 00170 data->cp_rot[id][Y] = dy; 00171 data->cp_rot[id][Z] = dz; 00172 GS_set_cplane_rot(id, data->cp_rot[id][X], data->cp_rot[id][Y], 00173 data->cp_rot[id][Z]); 00174 00175 cp_draw(data, data->cur_cplane, -1, -1); 00176 00177 return 1; 00178 } 00189 int Nviz_get_cplane_rotation(nv_data * data, int id, float *dx, float *dy, float *dz) 00190 { 00191 *dx = data->cp_rot[id][X]; 00192 *dy = data->cp_rot[id][Y]; 00193 *dz = data->cp_rot[id][Z]; 00194 00195 return 1; 00196 } 00197 00207 int Nviz_set_cplane_translation(nv_data * data, int id, float dx, float dy, float dz) 00208 { 00209 data->cp_trans[id][X] = dx; 00210 data->cp_trans[id][Y] = dy; 00211 data->cp_trans[id][Z] = dz; 00212 GS_set_cplane_trans(id, data->cp_trans[id][X], data->cp_trans[id][Y], 00213 data->cp_trans[id][Z]); 00214 00215 cp_draw(data, data->cur_cplane, -1, -1); 00216 00217 return 1; 00218 } 00226 int Nviz_get_cplane_translation(nv_data * data, int id, float *dx, float *dy, float *dz) 00227 { 00228 *dx = data->cp_trans[id][X]; 00229 *dy = data->cp_trans[id][Y]; 00230 *dz = data->cp_trans[id][Z]; 00231 00232 return 1; 00233 } 00239 int Nviz_set_fence_color(nv_data * data, int type) 00240 { 00241 GS_set_fencecolor(type); 00242 00243 return 1; 00244 00245 } 00246 int Nviz_set_cplane_here(nv_data *data, int cplane, float sx, float sy) 00247 { 00248 float x, y, z, len, los[2][3]; 00249 float dx, dy, dz; 00250 float n, s, w, e; 00251 Point3 realto, dir; 00252 int id; 00253 geosurf *gs; 00254 00255 if (GS_get_selected_point_on_surface(sx, sy, &id, &x, &y, &z)) { 00256 gs = gs_get_surf(id); 00257 if (gs) { 00258 realto[X] = x - gs->ox + gs->x_trans; 00259 realto[Y] = y - gs->oy + gs->y_trans; 00260 realto[Z] = z + gs->z_trans; 00261 } 00262 else 00263 return 0; 00264 } 00265 else { 00266 if (gsd_get_los(los, (short)sx, (short)sy)) { 00267 len = GS_distance(Gv.from_to[FROM], Gv.real_to); 00268 GS_v3dir(los[FROM], los[TO], dir); 00269 GS_v3mult(dir, len); 00270 realto[X] = Gv.from_to[FROM][X] + dir[X]; 00271 realto[Y] = Gv.from_to[FROM][Y] + dir[Y]; 00272 realto[Z] = Gv.from_to[FROM][Z] + dir[Z]; 00273 } 00274 else 00275 return 0; 00276 } 00277 Nviz_get_cplane_translation(data, cplane, &dx, &dy, &dz); 00278 00279 GS_get_region(&n, &s, &w, &e); 00280 dx = realto[X] - (e - w) / 2.; 00281 dy = realto[Y] - (n - s) / 2.; 00282 00283 Nviz_set_cplane_translation(data, cplane, dx, dy, dz); 00284 00285 return 1; 00286 }