GRASS Programmer's Manual  6.5.svn(2012)-r51648
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Defines
cplanes_obj.c
Go to the documentation of this file.
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 }