GRASS Programmer's Manual  6.4.2(2012)
nviz/draw.c
Go to the documentation of this file.
00001 
00016 #include <grass/nviz.h>
00017 
00018 static int sort_surfs_max(int *, int *, int *, int);
00019 
00027 int Nviz_draw_all_surf(nv_data * dc)
00028 {
00029     int i, nsurfs;
00030     int sortSurfs[MAX_SURFS], sorti[MAX_SURFS];
00031     int *surf_list;
00032     float x, y, z;
00033     int num, w;
00034 
00035     /* Get position for Light 1 */
00036     num = 1;
00037     x = dc->light[num].x;
00038     y = dc->light[num].y;
00039     z = dc->light[num].z;
00040     w = dc->light[num].z;
00041 
00042     surf_list = GS_get_surf_list(&nsurfs);
00043 
00044     sort_surfs_max(surf_list, sortSurfs, sorti, nsurfs);
00045 
00046     G_free(surf_list);
00047 
00048     /* re-initialize lights */
00049     GS_setlight_position(num, x, y, z, w);
00050     num = 2;
00051     GS_setlight_position(num, 0., 0., 1., 0);
00052 
00053     for (i = 0; i < nsurfs; i++) {
00054         GS_draw_surf(sortSurfs[i]);
00055     }
00056 
00057     /* GS_draw_cplane_fence params will change - surfs aren't used anymore */
00058     for (i = 0; i < MAX_CPLANES; i++) {
00059         if (dc->cp_on[i])
00060             GS_draw_cplane_fence(sortSurfs[0], sortSurfs[1], i);
00061     }
00062 
00063     return 1;
00064 }
00065 
00079 int sort_surfs_max(int *surf, int *id_sort, int *indices, int num)
00080 {
00081     int i, j;
00082     float maxvals[MAX_SURFS];
00083     float tmp, max = 0., tmin, tmax, tmid;
00084 
00085     for (i = 0; i < num; i++) {
00086         GS_get_zextents(surf[i], &tmin, &tmax, &tmid);
00087         if (i == 0)
00088             max = tmax;
00089         else
00090             max = max < tmax ? tmax : max;
00091         maxvals[i] = tmax;
00092     }
00093 
00094     for (i = 0; i < num; i++) {
00095         tmp = maxvals[0];
00096         indices[i] = 0;
00097         for (j = 0; j < num; j++) {
00098             if (maxvals[j] < tmp) {
00099                 tmp = maxvals[j];
00100                 indices[i] = j;
00101             }
00102         }
00103 
00104         maxvals[indices[i]] = max + 1;
00105         id_sort[i] = surf[indices[i]];
00106     }
00107 
00108     return 1;
00109 }
00110 
00116 int Nviz_draw_all_vect()
00117 {
00118     // GS_set_cancel(0);
00119 
00120     /* in case transparency is set */
00121     GS_set_draw(GSD_BOTH);
00122 
00123     GS_ready_draw();
00124 
00125     GV_alldraw_vect();
00126 
00127     GS_done_draw();
00128 
00129     GS_set_draw(GSD_BACK);
00130 
00131     // GS_set_cancel(0);
00132 
00133     return 1;
00134 }
00135 
00141 int Nviz_draw_all_site()
00142 {
00143     int i;
00144     int *site_list, nsites;
00145 
00146     site_list = GP_get_site_list(&nsites);
00147 
00148     /* in case transparency is set */
00149     GS_set_draw(GSD_BOTH);
00150 
00151     GS_ready_draw();
00152 
00153     for (i = 0; i < nsites; i++) {
00154         GP_draw_site(site_list[i]);
00155     }
00156     G_free(site_list);
00157 
00158     GS_done_draw();
00159 
00160     GS_set_draw(GSD_BACK);
00161 
00162     return 1;
00163 }
00164 
00170 int Nviz_draw_all_vol()
00171 {
00172     int *vol_list, nvols, i;
00173 
00174     vol_list = GVL_get_vol_list(&nvols);
00175 
00176     /* in case transparency is set */
00177     GS_set_draw(GSD_BOTH);
00178 
00179     GS_ready_draw();
00180 
00181     for (i = 0; i < nvols; i++) {
00182         GVL_draw_vol(vol_list[i]);
00183     }
00184 
00185     G_free(vol_list);
00186 
00187     GS_done_draw();
00188 
00189     GS_set_draw(GSD_BACK);
00190 
00191     return 1;
00192 }
00193 
00199 int Nviz_draw_all(nv_data * data)
00200 {
00201     int i;
00202     int draw_surf, draw_vect, draw_site, draw_vol;
00203     
00204     draw_surf = 1;
00205     draw_vect = 1;
00206     draw_site = 1;
00207     draw_vol = 1;
00208     /*
00209     draw_north_arrow = 0;
00210     arrow_x = 0;
00211     draw_label = 0;
00212     draw_legend = 0;
00213     draw_fringe = 0;
00214     draw_scalebar = 0;
00215     draw_bar_x = 0;
00216     */
00217     
00218     GS_set_draw(GSD_BACK);      /* needs to be BACK to avoid flickering */
00219 
00220     GS_ready_draw();
00221 
00222     GS_clear(data->bgcolor);
00223 
00224     if (draw_surf)
00225         Nviz_draw_all_surf(data);
00226 
00227     if (draw_vect)
00228         Nviz_draw_all_vect(data);
00229 
00230     if (draw_site)
00231         Nviz_draw_all_site(data);
00232 
00233     if (draw_vol)
00234         Nviz_draw_all_vol(data);
00235 
00236     for(i = 0; i < data->num_fringes; i++) {
00237         struct fringe_data * f = data->fringe[i];
00238         GS_draw_fringe(f->id, f->color, f->elev, f->where);
00239     }
00240     
00241     GS_done_draw();
00242     GS_set_draw(GSD_BACK);
00243 
00244     return 1;
00245 }
00246 
00261 int Nviz_draw_quick(nv_data * data, int draw_mode)
00262 {
00263     GS_set_draw(GSD_BACK);
00264     
00265     GS_ready_draw();
00266     
00267     GS_clear(data->bgcolor);
00268     
00269     /* draw surfaces */
00270     if (draw_mode & DRAW_QUICK_SURFACE)
00271         GS_alldraw_wire();
00272     
00273     /* draw vector lines */
00274     if (draw_mode & DRAW_QUICK_VLINES)
00275         GV_alldraw_vect();
00276     
00277     /* draw vector points */
00278     if (draw_mode & DRAW_QUICK_VPOINTS)
00279         GP_alldraw_site();
00280     
00281     /* draw volumes */
00282     if (draw_mode & DRAW_QUICK_VOLUME) {
00283         GVL_alldraw_wire();
00284     }
00285     
00286     GS_done_draw();
00287     
00288     return 1;
00289 }
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines